カテゴリー「パソコン・インターネット」の66件の記事

2018年11月18日 (日)

ココログ:リンク切れ一覧と旧URL一覧と公開記事URL一覧を突き合わせるOpenOfficeCalc

ココログ:外れている内部リンクを探す のお仕事。ココログ:古い「カテゴリ別書評一覧」から各記事の旧URL 一覧を作るVBScript から続く。

【はじめに】

 今までの作業で、次の3つの一覧=表ができた。

  1. 記事ごとのリンク外れの表。カラムは4つ。
    記事URL:記事名:外れている=古いURL(:そのアンカーテキスト)
  2. 正しいURLと記事名の表。カラムは2つ。
    正しいURL:記事名
  3. 古いURLと記事名の表。カラムは2つ。
    古いURL:記事名

 ここでは、上の3つを組み合わせ、次の6カラムの表を作る。

  • 記事URL:記事名:古い記事URL:古い記事名:正しい記事名:正しいURL

【理屈】

 と書くと何やら大変そうだが、なんの事はない。皆さんご存知、表計算のVLOOKUP関数を使うだけだ。世間では Excel が有名だが、私の手元にあるのは OpenOffice である。たぶん使い勝手は Excel とたいして違わないだろう。いや実は Excel も OPenOffice もよく知らないんだけど。

 理屈はこうだ。

  1. 「記事ごとのリンク外れの表」の古いURLと、「古いURLと記事名の表」の古いURLを突き合わせ、「古いURLに該当する記事名」を得る。
  2. 「古いURLに該当する記事名」と「正しいURLと記事名の表」を突き合わせ、「正しいURL」を得る。

 日頃から関係(リレーショナル)データベースを扱っている人なら、既に頭の中で SELECT 文が出来上がっているだろう。つまりは、そういう処理です。

【手順】

1.OpenOffice Calc を立ち上げる。

2.「古いURLと記事名の表」を読み込む。こんな感じの表になる。

3.同じシートの別の列に、「正しいURLと記事名の表」をコピー&ペーストする。
  貼り付けたら、記事名の列とURLの列を入れ替える。

4.別のシートに、「記事ごとのリンク外れの表」を読み込む。

5.古いURLから記事名を探す。このシートのE列に、VLOOKUP 関数を入れる。

=VLOOKUP(C1;Sheet2.A$1:B$1372;2)

 Sheet2(手順の2.で読んだ表) のA列から セル C1 と同じ行を探し、見つかったらその行のB列を返せ、そんな命令だ。

 日本語に訳すと、こんな感じかな?

「古いURLと記事名の表」から、この表のC列=古いURLと同じものを探し、見つかったら(古いURLに該当する)記事名を返せ。

 結果、こんな風になる。幾つかは記事名が見つかったようだ。

6.記事名から正しいURLを探す。このシートのF列に、VLOOKUP 関数を入れる。

=VLOOKUP(E1;Sheet2.E$1:F$1633;2)

 Sheet2(手順の3.で読んだ表) のE列から (この表の)セル E1 と同じ行を探し、見つかったらその行のF列を返せ。

 日本語に訳すと、こんな感じかな?

「正しいURLと記事名の表」から、この表のE列=記事名と同じものを探し、見つかったら(記事名に該当する)正しいURLを返せ。

 結果、こんな風になった。

 これで、ほぼ望みのモノが手に入った。欲しいのは、次の表だった。

  • 記事URL:記事名:古い記事URL:古い記事名:正しい記事名:正しいURL

 上の表だと、こんな風になる。

  • A列=記事URL:B列=記事名:C列=外れたURL:D列=外れた記事名:E列=正しい記事名:F列=正しいURL

【おわりに】

 なんか御大層な記事になっちゃったけど、要は VLOOKUP 関数を使いました、それだけの記事です。ちなみに、一番肝心の「外れたリンクを直す」のは、ココログの編集機能を使って手作業でやりました、はい。

 いやココログの記事一覧の画面って、検索機能もあるんだねえ。この作業にとりかかってから、やっと気がついたよ。

【関連記事】

| | コメント (0) | トラックバック (0)

2018年11月15日 (木)

ココログ:古い「カテゴリ別書評一覧」から各記事の旧URL 一覧を作るVBScript

ココログ:外れている内部リンクを探す のお仕事。ココログ:切れている内部リンクの一覧を作るVBScript から続く。

【はじめに】

 最終目的は、ココログの私の全記事から、外れている内部リンクを探し、リンク外れの一覧を作る(→ココログ:外れている内部リンクを探す)。

 今までの作業で「どの記事の、どのリンクが外れているか」の一覧ができた。ただ、外れたリンクは URL しか分からない。一応はアンカーテキストも取り出しているのだが、実はこれ、ほとんど信用できないし。

 なんにせよ。

 今のところ、「この URL が間違っている」のは、分かる。でも、それを「どう直せばいいか」が、分からない。

 そこで、間違ったURL:正しいURL の一覧 が欲しい。

 幸いにして、このブログの記事の大半は書評だ。そして、これもラッキーな事に、「カテゴリ別書評一覧」なんて頁も作ってあった。これを使えば、間違ったURL:記事名 の一覧が作れる。

 既に 正しいURL:記事名 の一覧がある。(ココログ:全公開記事のHTMLから記事一覧を作るVBScript)。今までは URL => 記事名 の形で使っていたが、逆に 記事名 => URL としても使える。

 この二つを使えば、間違ったURL => 記事名 => 正しいURL と手繰れる、つまり 間違ったURL:正しいURL の一覧が作れるだろう。

 という事で、ここでは、古い「カテゴリ別書評一覧」から、間違ったURL:記事名 の一覧を作る。

【古い「カテゴリ別書評一覧」】

 中身はこんな感じ。

 ¦
<li><a href="古いURL">
記事名</a></li>
<li><a href="古いURL">
記事名</a></li>
 ¦

 中身はこんな感じ。

【間違ったURL:記事名 の一覧】

 それを、こんな形に変換する。

古いURL 記事名
古いURL 記事名
 ¦

 区切りはタブ文字とした。

【ソース】

 名前は makeOldList.vbs とした。古い「カテゴリ別書評一覧」をドラッグ&ドロップすると、間違ったURL:記事名 の一覧ができる。

' 2018.11.07 旧ctindexからURL=>記事名一覧作る vb5.8
Option Explicit

Const blogURL = "http://chikuwablog.cocolog-nifty.com/blog/"
Dim WSH : Set WSH  = WScript.CreateObject( "Wscript.shell" )
Dim FSYS: Set FSYS = WScript.CreateObject( "Scripting.FileSystemObject" )

' ダブルクリックで起動したら使い方を示して終わる
if WScript.Arguments.length <> 1 then
    Call MsgBox( "ctindex.htmlをD&Dしる" )
    WScript.Quit
end if

' D&Dしたファイル名からフルパスと親フォルダを得る
Dim cName   : cName     = WScript.Arguments.Item(0) ' D&Dしたファイルのフルパス
Dim cFolder : cFolder   = FSYS.getParentFolderName( cName ) & "\" '親フォルダ名

' D&D したファイルを開く
Dim iHandle : Set iHandle = CreateObject("ADODB.Stream")
iHandle.Type          = 2                ' text mode
iHandle.charset       = "utf-8"
iHandle.LineSeparator = 10    ' lf
iHandle.open
iHandle.LoadFromFile cName '入力ファイルを読み込む
If Err.Number <> 0 Then
    Call MsgBox( "Code:" & Err.Number & " :Can not open " & cName )
    WScript.Quit
end if

' 記事へのリンクの正規表現
Dim rURL, rTTL, oBuf, hURL, hTTL
Set rURL = new RegExp : rURL.IgnoreCase = True    '<li><a href=URL>
Set rTTL = new RegExp : rTTL.IgnoreCase = True    '記事名</a></li>
rURL.pattern = "^<li><a href=.(" & blogURL & "[^>]+).>"
rTTL.pattern = "^(.+)</a></li>"

' 全記事の全文のスキャン
oBuf = "" : hURL = ""
Do While iHandle.EOS = False
    Dim line : line = iHandle.ReadText( -2 )
'                                           <li><a href=URL>
    If rURL.Test( line ) then
        hURL   = rURL.Replace( line, "$1" )
'                                           記事名</a></li>
    ElseIf rTTL.Test( line ) and hURL <> "" then
        hTTL   = rTTL.Replace( line, "$1" )
        oBuf = oBuf & hURL & vbtab & hTTL & vblf
    end if
Loop
iHandle.Close
                    ' 結果の書き出し
Dim oHandle
Set oHandle = CreateObject("ADODB.Stream")
oHandle.Charset = "UTF-8"
oHandle.Open
oHandle.WriteText oBuf, 0
oHandle.SaveToFile cFolder & "oldCtindex.txt", 2        '上書き

oHandle.Close
Call MsgBox( "Finish" )

【関連記事】

【つぶやき】

 この手の作業は awk か perl ならもっと楽なのにブツブツ…と思ったら、ActivePerl や Strawberry Perl とか、いろいろあるじゃないか。ちったあ調べろよ俺。でも文字コード関係はやっぱり面倒くさそう。

| | コメント (0) | トラックバック (0)

2018年11月14日 (水)

ココログ:切れている内部リンクの一覧を作るVBScript

ココログ:外れている内部リンクを探す のお仕事。ココログ:全公開記事のHTMLから記事一覧を作るVBScript から続く。

【はじめに】

  最終目的は、ココログの私の全記事から、外れている内部リンクを探し、リンク外れの一覧を作る(→ココログ:外れている内部リンクを探す)。

 そのため、まず公開している全記事をダウンロードし、次に 記事のURL:記事名 の一覧を作った。

 ここでは、全記事のHTML と記事一覧を突き合わせ、外れている内部リンクの一覧を作る。

【だいたいの手順】

 手順はこんな感じ。

  1. 記事一覧を全部読み、記事URL => 記事名 の辞書を作る。
  2. 公開している全記事を1行ごとに読んで、内部リンクがあったら 1.で作った辞書を調べる。
    辞書になければ、そのリンクは切れているので、リンク外れの一覧に書き出す。

【入力と出力】

 入力は2つ。記事のURL:記事名一覧 と、全記事のHTML。

 出力はリンク外れの一覧。以下の形のテキストファイル。

記事URL 記事名 リンク外れのURL リンク外れのアンカー・テキスト
記事URL 記事名 リンク外れのURL リンク外れのアンカー・テキスト
 ¦

【欠点】

 分かっている限り、少なくとも2個の欠点がある。

 まず、記事のHTMLは記事一覧より長くなきゃいけない。全記事に対しこのスクリプトを使うなら問題ない。だが一部の記事だけリンク外れを調べたい、なんて時には使えない。

 このスクリプトは2つのファイル、記事HTMLと記事一覧をドラッグド&ロップして起動する。スクリプトは、受け取った2つのファイルを見て、どっちが記事HTMLでどっちが記事一覧かを判断しなきゃいけない。そこで単純に、よりファイルサイズが大きい方を記事HTML、と判断することにした。

 もう一つは、書き出す「リンク外れの一覧」のうち、「リンク外れのアンカー・テキスト」が信用できないこと。往々にして間違っている。とりあえず私は困らないんで、放置した。

【ソース】

  名前は Merge.vbs とした。これに記事のURL:記事名一覧 と全記事のHTMLをドラッグ&ドロップすると、リンク外れの一覧ができる。

' 2018.11.05 記事中の内部リンクを調べる vb5.8
Option Explicit

Const blogURL = "http://chikuwablog.cocolog-nifty.com/blog/"
Dim WSH : Set WSH  = WScript.CreateObject( "Wscript.shell" )
Dim FSYS: Set FSYS = WScript.CreateObject( "Scripting.FileSystemObject" )

' ダブルクリックで起動したら使い方を示して終わる
if WScript.Arguments.length <> 2 then
    Call MsgBox( "記事全文とURL一覧をD&Dしる " & WScript.Arguments.length )
    WScript.Quit
end if

' D&Dしたファイル名からフルパスと親フォルダを得る
Dim cName   : cName     = WScript.Arguments.Item(0) ' D&Dしたファイルのフルパス
Dim lName   : lName     = WScript.Arguments.Item(1) ' D&Dしたファイルのフルパス
Dim cFolder : cFolder   = FSYS.getParentFolderName( cName ) & "\" '親フォルダ名
' 大きいファイルは記事、小さいファイルは一覧
if fileSize( cName ) > fileSize( lName ) then
    Dim w
    w = cName
    cName = lName
    lName = w
end if

' 一覧ファイルを読み、辞書lURLに登録
Dim lURL
Set lURL = makeLinkDic( lName )

' 記事へのリンクの正規表現
Dim rURL, oBuf, hURL, hTitle, rRef, tURL, tTitle
Set rURL = new RegExp : rURL.IgnoreCase = True   '<h3><a href=URL>記事名</a></h3>
Set rRef = new RegExp : rRef.IgnoreCase = True   '<a href=URL>記事名
rURL.pattern = "^.*<h3><a href=.(" & blogURL & "[^>]+).>([^<]+)</a></h3>.*$"
rRef.pattern = "^.*<a href=.(" & blogURL & "\d\d\d\d/\d\d/[^>]+html).>([^<]*)$"

' 全記事の全文のスキャン
oBuf = ""
Dim cHandle : Set cHandle = openFile( cName )
Do While cHandle.EOS = False : do
    Dim l : l = cHandle.ReadText( -2 )
'                                        記事名行,<h3><a href=URL>記事名</a></h3>
    if rURL.Test( l ) then
        hURL   = rURL.Replace( l, "$1" )
        hTitle = rURL.Replace( l, "$2" )
        Exit Do
    End If
'                                       </a>で分割して
    Dim k
    For Each k in Split( l, "</a>", -1 ) : do
        if not rRef.Test( k ) then : Exit do : End If
        tURL   = rRef.Replace( k, "$1" )
        tTitle = rRef.Replace( k, "$2" )
        if InStr( tURL, "index.html" ) > 0 then : Exit do : End If
        if lURL.Exists( tURL ) Then : Exit do : End If
        oBuf = oBuf & hURL & vbtab & htitle & vbtab & tURL & vbtab & tTitle & vbcrlf
    Loop Until 1 : Next
Loop Until 1 : Loop
cHandle.Close
                    ' 結果の書き出し
Dim oHandle
Set oHandle = CreateObject("ADODB.Stream")
oHandle.Charset = "UTF-8"
oHandle.Open
oHandle.WriteText oBuf, 0
oHandle.SaveToFile cFolder & "lostLinkList.txt", 2        '上書き
oHandle.Close
Call MsgBox( "Finish" ) : WScript.Quit

' fileSize( fName ) : ファイル fName のサイズを返す
Function fileSize( fName )
    Dim fi
    Set fi = FSYS.GetFile( fName )
    fileSize = FormatNumber( fi.Size, 0 )
End Function

' openFile( fName ) : ファイル fName を開いて返す
Function openFile( fName )
    Dim fHandle

    Set fHandle = CreateObject("ADODB.Stream")
    fHandle.Type          = 2                ' text mode
    fHandle.charset       = "utf-8"
    fHandle.LineSeparator = 10    ' lf
    fHandle.open
    fHandle.LoadFromFile fName '入力ファイルを読み込む
    If Err.Number <> 0 Then
        Call MsgBox( "Code:" & Err.Number & " :Can not open " & fName )
        WScript.Quit
    end if
    Set openFile = fHandle
end Function

' makeLinkDic( lName ) : ファイルlNameから(URL:記事名)の辞書を作る
Function makeLinkDic( lName )
    Dim lHandle : Set lHandle = openFile( lName )
    Dim lURL    : Set lURL =WScript.CreateObject( "Scripting.Dictionary" )

    Do While lHandle.EOS = False
        Dim line, col
       
        line = lHandle.ReadText( -2 )
        col = Split( line, vbtab, -1 )  ' URL tab Title
        lURL.Add col(0), col(1)
    Loop
    lHandle.Close
    Set makeLinkDic = lURL
End Function

【おわりに】

 ココログ:外れている内部リンクを探す ために、これを含め3つのスクリプトを書いた。1)記事全文をダウンロード,2)記事一覧を作る,3)外れている内部リンクを探す だ。

 この3つのスクリプト、1つのスクリプトにまとめてもいい。というか、サービスとして一般に公開するなら、たぶん1つのスクリプトにしちゃう。1本にすると、途中のファイル、例えば記事名一覧とかが要らなくなる。

 そうしなかったのは、分けた方が楽に作れるからだ。

 私の場合、スクリプトを作る時間の8割以上をデバッグ、つまり間違い探しに費やす。1本作るのに、数十回も試行錯誤する。

 こういう時は、作業をなるたけ細かく複数の段階に分けて、各段階ごとに一歩一歩進めていく方がいい。記事名一覧も、いったんテキスト・ファイルに書き出せば、その中身をテキスト・エディタで確認できる。

 それはともかく。

 この作業を通じて、色々と VBScript について分かったのが嬉しい。関数かたオブジェクトを返す方法,連装配列の使い方,タブ区切りテキストをカラムに分ける方法,HTTPリクエストを送る方法,ループ内の If から continue する手口。

 JavaScript などと違い、Do などのブロックは変数のスコープを作らないのは新しい発見。また変数に型がないってのも知らなかった。道理で As がエラーになるわけだ。どころか、VBScript と VBA は違うって事に、やっと気がついた。間抜けな話だ。

 もっとも、全般的に VBA の方が VBScript よりパワフルだし、Microsoft は今後 PowerShell に力を入れていくだろうから、今さら VBScript を覚えても、あまし利益はないだろうなあ。

【関連記事】

| | コメント (0) | トラックバック (0)

2018年11月13日 (火)

ココログ:全公開記事のHTMLから記事一覧を作るVBScript

ココログ:外れている内部リンクを探す のお仕事。ココログ:各月のURL一覧から全公開記事をダウンロードするVBScript から続く。

【はじめに】

 最終目的は、ココログの私の全記事から、外れている内部リンクを探すこと(→ココログ:外れている内部リンクを探す)。その第一段階として、公開中の全記事をダウンロードした(→ココログ:各月のURL一覧から全公開記事をダウンロードするVBScript)。

 この記事では、全記事のファイルから URL:記事名 の一覧を作る。

【全記事のファイル】

 中には全記事のHTMLが入っている。大事なのは記事の見出しの部分で、こんな風になっている。

 ¦
<h3><a href="http://chikuwablog.cocolog-nifty.com/blog/2018/11/post.html">「KGBの世界都市ガイド」晶文社 小川政邦訳</a></h3>
 ¦
<h3><a href="http://chikuwablog.cocolog-nifty.com/blog/2018/11/sf-f09f.html">アン・レッキー「動乱星系」創元SF文庫 赤尾秀子訳</a></h3>
 ¦

 要は<h3><a href="記事のURL">記事名</a></h3> って形で、記事のURLと記事名がわかるのだ。これを取り出せばいい。

【URL:記事名】

 取り出したら、次の形のテキスト・ファイルにする。URLと記事名の区切りはタブ文字。

http://chikuwablog.cocolog-nifty.com/blog/2018/11/post.html	「KGBの世界都市ガイド」晶文社 小川政邦訳
http://chikuwablog.cocolog-nifty.com/blog/2018/11/sf-f09f.html アン・レッキー「動乱星系」創元SF文庫 赤尾秀子訳
 ¦

【ソース】

 名前は makeURLList.vbs とした。これに全記事のファイルをドラッグ&ドロップすると、URL:記事名 のファイル URLlist.txt ができる。

' 2018.11.05 記事全文からURL一覧作る vb5.8
Option Explicit

Const blogURL = "http://chikuwablog.cocolog-nifty.com/blog/"
Dim WSH : Set WSH  = WScript.CreateObject( "Wscript.shell" )
Dim FSYS: Set FSYS = WScript.CreateObject( "Scripting.FileSystemObject" )

' ダブルクリックで起動したら使い方を示して終わる
if WScript.Arguments.length <> 1 then
    Call MsgBox( "記事全文をD&Dしる" )
    WScript.Quit
end if

' D&Dしたファイル名からフルパスと親フォルダを得る
Dim cName   : cName     = WScript.Arguments.Item(0) ' D&Dしたファイルのフルパス
Dim cFolder : cFolder   = FSYS.getParentFolderName( cName ) & "\" '親フォルダ名

' D&D したファイルを開く
Dim iHandle : Set iHandle = CreateObject("ADODB.Stream")
iHandle.Type          = 2                ' text mode
iHandle.charset       = "utf-8"
iHandle.LineSeparator = 10    ' lf
iHandle.open
iHandle.LoadFromFile cName '入力ファイルを読み込む
If Err.Number <> 0 Then
    Call MsgBox( "Code:" & Err.Number & " :Can not open " & cName )
    WScript.Quit
end if

' 記事へのリンクの正規表現
Dim rURL, oBuf
Set rURL = new RegExp : rURL.IgnoreCase = True    '<h3><a href=URL>記事名</a></h3>
rURL.pattern = "^.*<h3><a href=.(" & blogURL & "[^>]+).>([^<]+)</a></h3>.*$"

' 全記事の全文のスキャン
oBuf = ""
Do While iHandle.EOS = False
    Dim line : line = iHandle.ReadText( -2 )
'                                        <h3><a href=URL>記事名</a></h3>
    if rURL.Test( line ) then
        Dim hURL, hTitle
        hURL   = rURL.Replace( line, "$1" )
        hTitle = rURL.Replace( line, "$2" )
        oBuf = oBuf & hURL & vbTab & hTitle & vblf
    end if
Loop
                    ' 結果の書き出し
Dim oHandle
Set oHandle = CreateObject("ADODB.Stream")
oHandle.Charset = "UTF-8"
oHandle.Open
oHandle.WriteText oBuf, 0
oHandle.SaveToFile cFolder & "URLlist.txt", 2        '上書き

iHandle.Close
oHandle.Close
Call MsgBox( "Finish" )

【関連記事】

 

| | コメント (0) | トラックバック (0)

2018年11月11日 (日)

ココログ:各月のURL一覧から全公開記事をダウンロードするVBScript

ココログ:外れている内部リンクを探すから続く。

【はじめに】

 最終目的は「ココログの私の全公開記事から、外れている内部リンクを探し、タブ区切りテキストで書き出す」ことだ。そのためにやる事は幾つかある。

 ここでは、私が公開している全ブログ記事のHTMLをダウンロードする。

【具体的には】

 URLの一覧を読んで、その全頁をダウンロードし、一つのファイルに書き出す。

【欠点】

 このスクリプトには欠点がある。

 正確には、恐らく幾つかある欠点のうち、一つだけはハッキリわかっている。一カ月に25~26件以上の記事を書いている場合、たぶんこのスクリプトでは上手くいかない。

 このスクリプトは、月別アーカイブを全部ダウンロードする。それだけだ。この方法だと、幾つかの記事は取りこぼすかもしれない。

 ココログのカテゴリー別のアーカイブは、ちと複雑な構造になっている。例えば「日記・コラム・つぶやき」のアーカイブを見て欲しい。最近の10件の記事は、全文が載っている。それより前の記事は、下のほうに記事名の一覧が出ているだけだ。古い記事の記事の中身を見たいなら、記事名からリンクを手繰らなきゃいけない。

 月別のアーカイブも、似たような形になっている…と、思う。とまり、「最近の25件」ぐらいまでは、各月のアーカイブに全文を載せ、それより前の記事は記事名だけを載せる、そんな感じだろう。

 私が一カ月に書く記事は、多くても20件ぐらいだ。だから、全月のアーカイブをダウンロードすれば、公開記事を全部ダウンロードできる。

 でも、毎日記事を書いているなら、このスクリプトじゃ、月の頭に書いた記事を無視してしまう。

 このまま使う人はまずいないと思うが、そういう欠点がある(というか、現時点で少なくともこの欠点だけはわかっている)由をご了解願いたい。

【使い方】

 次のプスクリプト(crowl.vbs)に、URL一覧のファイルをドラッグ&ドロップする。巧く動いたら、、公開記事の全文が入ったファイル res.html ができる。 

【ソース】

' crowl.vbs アーカイブからクロール vbs5.8
Option Explicit
Dim WSH : Set WSH  = WScript.CreateObject( "Wscript.shell" )
Dim FSYS: Set FSYS = WScript.CreateObject( "Scripting.FileSystemObject" )

' ダブルクリックで起動したら使い方を示して終わる
if WScript.Arguments.length <> 1 then
    Call MsgBox( "クロール先一覧をD&Dしる" )
    WScript.Quit
end if

' D&Dしたファイル名からフルパスと親フォルダを得る
Dim cName   : cName     = WScript.Arguments.Item(0) ' D&Dしたファイルのフルパス
Dim cFolder : cFolder   = FSYS.getParentFolderName( cName ) & "\" '親フォルダ名
                                    ' クロール先一覧をリストcURLsに読み込む
Dim cURLs
Set cURLs = CreateObject( "System.Collections.ArrayList" )
Dim cFile
Set cFile = FSYS.OpenTextFile( cName, 1, False, 0)
If Err.Number <> 0 Then
    Call MsgBox( "Code:" & Err.Number & " :Can not open " & cName )
    WScript.Quit
end if
Do Until cFile.AtEndOfStream
    Dim cLine : cLine = cFile.ReadLine
    cURLs.add( cLine )
Loop
cFile.Close()
'               クロール
Dim aURL, aBuf
aBuf = ""
For Each aURL In cURLs
    Dim aHttp
    Set aHttp = WScript.CreateObject( "MSXML2.XMLHTTP" )
    aHttp.Open "GET", aURL, False
    aHttp.Send
    aBuf = aBuf & aHttp.ResponseText
Next
'                                           結果をres.htmlに書き出す
Dim oFile
Set oFile = CreateObject( "ADODB.Stream" )
oFile.Charset = "UTF-8"
oFile.Open
oFile.WriteText( aBuf )
oFile.SaveToFile cFolder & "res.html", 1    '追加書き
oFile.Close

Call MsgBox( aURL & ":" & aHttp.Status & ":" & aHttp.statusText ) : WScript.Quit

【URL一覧】

 上のスクリプトにドラッグ&ドロップする「URL一覧」は、テキストファイルだ。中身はこんな感じ。1行にURLが1個書いてある、それだけ。

http://chikuwablog.cocolog-nifty.com/blog/2018/11/index.html
http://chikuwablog.cocolog-nifty.com/blog/2018/10/index.html
http://chikuwablog.cocolog-nifty.com/blog/2018/09/index.html
 ¦
http://chikuwablog.cocolog-nifty.com/blog/2007/01/index.html

 どうやって作ったか、というと。

  1. バックナンバー」のHTMLをテキスト・エディタにコピーする。
  2. 要らない行を削除する。
  3. <a href=" と ">.*</a><br /> を一括変換で削除(空文字列に変換)する

 と、ほぼ手作業で作りました、はい。

【関連記事】

| | コメント (0) | トラックバック (0)

2018年11月 9日 (金)

ココログ:外れている内部リンクを探す

 今年の初めにカテゴリ別書評一覧を作り替えた。ハッキリ言って、やらない方がよかった。

 理由は幾つかあるが、その一つは、既存の記事の URL が変わってしまった事だ。おかげで、このブログの別の記事に張ったリンクの幾つかが切れて、404 not Found になってしまう。これは困る。

 という事で、外れている内部リンクを探すプログラムを VBScript で書く。いろいろと欠陥はあるが、とりあえずの役には立った。ちなみにリンクを張りなおすのは手作業で行った。

【やる事】

 ココログの私の全公開記事から、外れている内部リンクを探し、タブ区切りテキストで書き出す。可能なら、切れたリンクの新しい URL も調べる。

【だいたいの流れ】

  1. 手作業:「バックナンバー」の頁から、各月のアーカイブの URL 一覧を作る
     →ファイル arc.txt
  2. VBScript crowl.vbs:各月のアーカイブの URL 一覧 arc.txt を読み、全公開記事の HTML をダウンロードする
     →ファイル res.html
  3. VBScript makeURLList.vbs:全記事の HTML res.html から、公開記事の URL 一覧を作る。
     →ファイル URLlist.txt
  4. VBScript merge.vbs:公開記事の URL 一覧 URLList.html と全公開記事の HTML res.html を突き合わせ、リンク切れの一覧を作る。
     →ファイル LostLinkList.txt
  5. VBScript makeOldList.vbs:幸いにして古い「カテゴリ別書評一覧」も残っていた。これから各記事の旧URL 一覧を作る。
     →ファイル oldCtindex.txt
  6. OpenOffice Calc:リンク切れ一覧 LostLinkList.txt と 旧URL 一覧 oldCtindex.txt と公開記事URL一覧 URLlist.txt を突き合わせ、記事URL:リンク切れURL:新URL の一覧を作る
  7. 手作業:上の一覧を使い、ココログの記事編集機能で外れたリンクを繕う。

【おわりに】

 「もしかして VBScript って HTTP も使えるんじゃね?」と思って調べたら可能だったので、やってみたかっただけなんです、はい。でも今は PowerShell ってのがj流行ってるらしいんで、次はこっちにしようかなあ。

 そんなわけで、これから時おり、書いたプログラムなどを公開していきます。

【関連記事】

| | コメント (0) | トラックバック (0)

2018年10月10日 (水)

脅迫スパムが来た:1F5csJmyf3yJs5s25tZmYKoFXznR452er9

脅迫スパムが来た。不愉快なので晒す。
ちなみにメールアドレスとパスワードは出鱈目なものに変えてある。

件名:Delete Message After Reading

Hello!
I'm a member of an international hacker group.

As you could probably have guessed,
your account mymail@address.com was hacked,
because I sent message you from your account. Now I have access to all your accounts! For example, your password for mymail@address.com: password Within a period from July 31, 2018 to October 3, 2018,
you were infected by the virus we've created,
through an adult website you've visited. So far, we have access to your messages, social media accounts,
and messengers. Moreover, we've gotten full damps of these data. We are aware of your little and big secrets...yeah,you do have them.
We saw and recorded your doings on porn websites.
Your tastes are so weird, you know.. But the key thing is that sometimes we recorded you with your webcam,
syncing the recordings with what you watched! I think you are not interested show this video to your friends,
relatives, and your intimate one... Transfer $800 to our Bitcoin wallet: 1F5csJmyf3yJs5s25tZmYKoFXznR452er9 If you don't know about Bitcoin please input in Google "buy BTC".
It's really easy. I guarantee that after that, we'll erase all your "data" A timer will start once you read this message.
You have 48 hours to pay the above-mentioned amount. Your data will be erased once the money are transferred. If they are not, all your messages and videos recorded
will be automatically sent to all your contacts found
on your devices at the moment of infection. You should always think about your security. We hope this case will teach you to keep secrets. Take care of yourself.

英語は苦手なので意味はよく分からない。たぶん、こんな事を言いたいんだろう。

件名:読んだら消してね

俺は世界的なハッカー集団の一員だ。
君のアカウント mymail@address.com を乗っ取った。
その証拠に君のアカウントからこのメール送ってる。
パスワードは password だろ。

2018年7月31日~2018年10月3日の間にエロサイト経由で俺らの作ったウイルスに感染した。
俺らは君のメールやSNSやメッセを使えるし、そのデータ全部を抑えてる。

おまけにWebcamから君のアレなナニも撮ってある。
こういうの、あまし友だちに見られたくないよね。

ビットコインの 1F5csJmyf3yJs5s25tZmYKoFXznR452er9 に800ドル送れば、
君のデータは消すよ。
ただし48時間以内にね。
それ過ぎたら、みんなにに録画を送るよ。
送り先は君のマシンから吸い取った。

もちっとセキュリティに気を付けた方がいいぜ。
いい教訓になっただろ?

普通の人は、自分のメール・アドレスからメールが来ると、ギョッとする。
でも、実は差出人のメール・アドレスは、いくらでも偽造できるのだ。
電子メールのプロトコルの不備と言えば言えない事もない。

スパム屋の間では、メール・アドレスの一覧が出回っている。
または、スクリプトで自動に沢山のメール・アドレスを作り出し、片っ端から送りつける手もある。

この商売、10万個を送って1匹カモが釣れれば、モトは取れるとか。
ソースは岡嶋裕史「迷惑メールは誰が出す?」新潮新書

つまり、あなたの所に似たようなメールが来たとしても、それはマグレ当たりだ。

とりあえず、スパム中の一部の文章をコピペして Google で検索してみよう。
この記事と同じ趣旨の頁が幾つか見つかるだろう。

なお、同じ文面を使いまわしてる模倣犯も複数いるようだ。
中には日本語に訳した文章を使ってる奴もいるとか。
ただし自動翻訳らしく、かなり不自然な文章になってる。

…とか書いてて思ったんだが、私が訳した文章を模倣犯に使われたら困るなあ。

2018.11.01 似たような脅迫スパムがまた来た

件名:mymail@address.com has password password. Password must be changed

Hello! I'm a programmer who cracked your email account and device about half year ago. You entered a password on one of the insecure site you visited, and I catched it. Your password from mymail@address.com on moment of crack: password Of course you can will change your password, or already made it. But it doesn't matter, my rat software update it every time. Please don't try to contact me or find me, it is impossible, since I sent you an email from your email account. Through your e-mail, I uploaded malicious code to your Operation System. I saved all of your contacts with friends, colleagues, relatives and a complete history of visits to the Internet resources. Also I installed a rat software on your device and long tome spying for you. You are not my only victim, I usually lock devices and ask for a ransom. But I was struck by the sites of intimate content that you very often visit. I am in shock of your reach fantasies! Wow! I've never seen anything like this! I did not even know that SUCH content could be so exciting! So, when you had fun on intime sites (you know what I mean!) I made screenshot with using my program from your camera of yours device. After that, I jointed them to the content of the currently viewed site. Will be funny when I send these photos to your contacts! And if your relatives see it? BUT I'm sure you don't want it. I definitely would not want to ... I will not do this if you pay me a little amount. I think $809 is a nice price for it! I accept only Bitcoins. My BTC wallet: 1BzkoGfrLtL59ZGjhKfvBwy47DEb6oba5f If you have difficulty with this - Ask Google "how to make a payment on a bitcoin wallet". It's easy. After receiving the above amount, all your data will be immediately removed automatically. My virus will also will be destroy itself from your operating system. My Trojan have auto alert, after this email is looked, I will be know it! You have 2 days (48 hours) for make a payment. If this does not happen - all your contacts will get crazy shots with your dirty life! And so that you do not obstruct me, your device will be locked (also after 48 hours) Do not take this frivolously! This is the last warning! Various security services or antiviruses won't help you for sure (I have already collected all your data). Here are the recommendations of a professional: Antiviruses do not help against modern malicious code. Just do not enter your passwords on unsafe sites! I hope you will be prudent. Bye.

 面倒くさいので訳は省く。大意は「お前のメアドとマシンを乗っ取った、恥ずかしい秘密をバラされたくなきゃBitcoin払え」だ。ハッタリである。この記事が少しでもペテン師の邪魔になったら嬉しい。

2018.11.07 文面は違うが大意は同じ

件名:Change your password password immediately. Your account has been hacked.
I greet you! I have bad news for you. 27/08/2018 - on this day I hacked your operating system and got full access to your account mymail@address.com On that day your account (mymail@address.com) password was: password It is useless to change the password, my malware intercepts it every time. How it was: In the software of the router to which you were connected that day, there was a vulnerability. I first hacked this router and placed my malicious code on it. When you entered in the Internet, my trojan was installed on the operating system of your device. After that, I made a full dump of your disk (I have all your address book, history of viewing sites, all files, phone numbers and addresses of all your contacts). A month ago, I wanted to lock your device and ask for a small amount of money to unlock. But I looked at the sites that you regularly visit, and came to the big delight of your favorite resources. I'm talking about sites for adults. I want to say - you are a big pervert. You have unbridled fantasy! After that, an idea came to my mind. I made a screenshot of the intimate website where you have fun (you know what it is about, right?). After that, I took off your joys (using the camera of your device). It turned out beautifully, do not hesitate. I am strongly belive that you would not like to show these pictures to your relatives, friends or colleagues. I think $939 is a very small amount for my silence. Besides, I spent a lot of time on you! I accept money only in Bitcoins. My BTC wallet: 12ziVv4aQkZTA1gj86Y9uYQByG4CcdVcTA You do not know how to replenish a Bitcoin wallet? In any search engine write "how to send money to btc wallet". It's easier than send money to a credit card! For payment you have a little more than two days (exactly 50 hours). Do not worry, the timer will start at the moment when you open this letter. Yes, yes .. it has already started! After payment, my virus and dirty photos with you self-destruct automatically. Narrative, if I do not receive the specified amount from you, then your device will be blocked, and all your contacts will receive a photos with your "joys". I want you to be prudent. - Do not try to find and destroy my virus! (All your data is already uploaded to a remote server) - Do not try to contact me (this is not feasible, I sent you an email from your account) - Various security services will not help you; formatting a disk or destroying a device will not help either, since your data is already on a remote server. P.S. I guarantee you that I will not disturb you again after payment, as you are not my single victim. This is a hacker code of honor. >From now on, I advise you to use good antiviruses and update them regularly (several times a day)! Don't be mad at me, everyone has their own work. Farewell.

 模倣犯だろうなあ。

| | コメント (0) | トラックバック (0)

2018年7月 8日 (日)

ダン・アッカーマン「テトリス・エフェクト 世界を惑わせたゲーム」白揚社 小林啓倫訳

「これ以上テトリスを手元に置いておけない!」
  ――6 拡がるクチコミ

「これはソ連からやって来た、最初の知的財産なんですよ」
  ――8 ミラーソフトへ

オリジナルのエレクトロニカ60版テトリスが開発されてからというもの、新しいバージョンが生み出される際には、みなゼロから開発しなければならなかった。オリジナル版のテトリスも、そしいてゲラシモフ版、ハンガリー版も、そのたびに新しいコードが書かれたのである。
  ――9 ロシア人がやってくる

テトリスは単純だ。あまりに単純すぎる。
  ――12 テトリス、ラスベガスをのみこむ

このロシア人たちは、ゲームカートリッジとは何か、そして日本の家庭用ゲーム機がどのようなものかも理解していないのか。
  ――16 大きな賭け

「モニター、ディスクドライブ、キーボード、オペレーティングシステムで構成される」
  ――18 チキンで会いましょう

(エド・)ログの秘密は、彼が対数によるチューニングに精通しているところにあった。難しさを倍にしたい場合、たんに速度を倍にするのではだめなことを、彼は見抜いていた。
  ――19 ふたつのテトリスの物語

【どんな本?】

 みんな知ってる大ヒット・ゲーム、テトリス。

 落ちてくるブロックを横にズラし、または回して、隙間なく詰めこむ。ブロックは7種類、いずれも4つの正方形を組み合わせたもの。ルールは簡単、操作も単純。ストーリーもキャラクターもなく、敵も味方もいない。感情を揺さぶる要素は何もないはずの、幾何学的なパズルゲーム。

 にも関わらず、テトリスは史上空前の大ヒットとなり、私たちの貴重な時間を食いつぶし、みんなを寝不足に追いやった。ばかりでなく、ぷよぷよなど幾つもの後継者を生み出し、「落ちゲー」というジャンルまで開拓してしまう。

 そのテトリスは、どんな環境で、どのように生まれたのか。いかにして増殖し、マシンの違いを乗り越えて変異・適応し、国家の壁をすり抜け、世界中にパンデミックを引き起こしたのか。

 1970年代から1990年代までのコンピューター情勢、冷戦末期の緊張漂う国際関係、魑魅魍魎が徘徊する戦国時代のゲーム市場、当時のソ連の意外な素顔、コネと度胸と計算とハッタリが渦巻くビジネス・シーン、プログラマー同士の絆、そしてテトリスとゲームボーイにまつわる秘話など、刺激的なネタをたっぷり詰めこみ、驚きと興奮と郷愁に満ちた傑作ドキュメンタリー。

【いつ出たの?分量は?読みやすい?】

 原書は The TETRIS EFFECT : The Game That Hypnotized the World, by Dan Ackerman, 2016。日本語版は2017年10月17日第一版第一刷発行。単行本ソフトカバー縦一段組みで本文約343頁に加え、訳者あとがき5頁。9ポイント45字×18行×343頁=約277,830字、400字詰め原稿用紙で約695枚。文庫本ならやや厚めの一冊分。

 文章はこなれていて読みやすい。内容も特に難しくないが、テトリス登場当時の興奮を知っている年齢だと、更に楽しめる。中でも最も楽しめるのは、アセンブラで直接にハードウェアを叩くようなプログラムを書いている人だろう。

【構成は?】

 ほぼ時系列に沿って話が進むので、できれば頭から読んだ方がいい。あと、できれば登場人物一覧が欲しかった。重要そうな人物が登場する場面には、栞を挟むか付箋をつけるなどしておくといい。

  • Part 1
    • 1 グレイト・レース
    • 2 アレクセイ・レオニードビッチ・パジトノフ
    • 3 アメリカへ
    • 4 最初のブロック
    • 5 ザ・ブラックオニキス
    • 6 拡がるクチコミ
  • BONUS LEVEL 1 これがテトリスをやっているときのあなたの脳だ
  • Part 2
    • 7 鉄のカーテンの向こうから
    • 8 ミラーソフトへ
    • 9 ロシア人がやってくる
    • 10 「悪魔の罠」
    • 11 ELORGへようこそ
    • 12 テトリス、ラスベガスをのみこむ
  • BONUS LEVEL 2 テトリスは永遠に
  • Part 3
    • 13 防弾の契約
    • 14 秘密のプラン
    • 15 迫りくる嵐
    • 16 大きな賭け
    • 17 詰め寄るライバルたち
    • 18 チキンで会いましょう
    • 19 ふたつのテトリスの物語
  • BONUS LEVEL 3 認知ワクチン
  • エピローグ 最後のブロック
  • 謝辞/訳者あとがき

【感想は?】

 驚き呆れ焦り同感し懐かしみ感嘆し…と、気持ちを揺さぶられっぱなし。

 テトリスがソ連出身なのは有名だ。ただ、何の目的で、どんな経緯で造られたのか、となると、様々な憶測がある。曰く数学の教育用、AI研究、果ては…

「あまりに時間を費やしてしまうので、テトリスはアメリカの生産性を下げるために、悪の帝国で開発された悪魔の罠ではないかと怪しんでしまうほどだ」
  ――10 「悪魔の罠」

 と、陰謀説まであった。当然ながら、本書ではその真相も明らかになる。その過程で描かれる、当時のコンピューター情勢は、ロートル・プログラマーにとって、涙が止まらない懐かしさ。今でこそプログラミングは手軽に始められるが、1970年代はコンピューターに触れるってだけで特権階級だった。

1970年代初頭にコンピューターを自由に使うことができたというのは、紙の卒業証書より価値のあるものだったのである。
  ――3 アメリカへ

 ここで言うコンピューターは、懐かしきパンチガードでジョブを流すメインフレームである。現代の若いプログラマには意外に思えるだろうが、当時のプログラマはコンピューターに直接触れる事はできなかった。それはオペレーターという別の職種の方々の権限であって…

 などと年寄りが昔話を始めるとキリがない。

 それでも西側はマシな方で、ソ連をはじめとする東側は更にアレだ。それでもハッカー気質な人は洋の東西を問わず生まれてくる。最初の開発者アレクセイ・レオニードビッチ・パジトノフもそうだし、IBM-PCに移植したワジム・ゲラシモフもお仲間で、まさしく類は友を呼ぶ見本。

 ここで描かれるソ連のプログラマ同士の付き合いは、ネクタイ族が幅を利かせる前の古き良きエンジニアの楽園を思わせる。確かに政治的な締め付けこそ厳しいものの、契約だ権利だなどのウザい邪魔物から隔離され、面白いものはみんなで分け合うのだ。改めて考えると、これって共産主義の理想だよなあw

 かような環境はエンジニアにとって心地よいばかりでなく、テトリスの繁殖にも有利に働く。そう、繁殖である。バジトノフの職場を席巻したテトリスは、モスクワ市街へと漏れ出し、赤い首都も易々と陥落させ、国境をも超えて進撃を始め…

 と、テトリスが次々と人類を虜にしてゆくあたりは、その旺盛な感染力に舌を巻くばかり。だが、やがて鉄のカーテンが立ちふさがり…

 このカーテンを突き破ろうとする、西側のゲーム業界人の苦闘も、この本の大事な柱。なにせ相手は共産圏、こっちの常識は全く通じない上に、そもそも誰を相手にすればいいのかさえ分からない。ここで掟破りの大暴れを見せる任天堂の回し者、ヘンク・ロジャースの活躍はまるきしニンジャだ。

 何せ鉄のカーテンの向こう。

何かを尋ねるといいうのは(とくに1980年代のモズクワで政府機関について探るのは)、疑わしい行為なのだ。なんであれ、それを知らないのなら、おまえは知るべき人間なのではない――地元の人々はそう考えていたのである。
  ――1 グレイト・レース

 なんて所に、ロクなコネもなければ相手も知らず、体一つで突撃をかましたハンクの冒険は、ビジネスの成功物語としてもワクワクする。彼がELORG相手に繰り広げる大立ち回りは、秀吉の毛利攻めのような知恵と努力と誠意の物語だったり。また、ここでロジャースのバックとなる任天堂の体質も、日本人としてはちょっと誇らしかったり。

 また、テトリスそのものの数学的な性質や、ゲーム史の中でテトリスが打ち立てた数々の記録、そしてテトリスがヒトの精神に及ぼす影響も…

2014年に行われた研究によれば、テトリスをプレイすることで、喫煙者や飲酒者の欲求が約24%減少した。
  ――テトリス・メモ22

 なんて嬉しい話や、もしかしたらPTSDの治療に役立つかも、なんてネタまであって、ゲーム・マニアにはたまらない一冊だ。プログラマに、ゲーム・マニアに、冷戦時代のソ連に興味がある人に、ビジネスで一旗あげたい人に。読み始めたら止まらない、刺激と興奮に満ちたドキュメンタリーの傑作だ。

【関連記事】

| | コメント (0) | トラックバック (0)

2018年5月 7日 (月)

ココログ:カスタムCSSでタイトルバナーがリンクと判るようにする

T0  このブログの左上、タイトルバナー(右図の赤い丸の所)は、トップページへのリンクになっている。

 ここをクリックすると、トップページに飛ぶ。トップページには、最近の記事5件の全文が載っている。

 今までのデザインだと、リンクになっている事が伝わりにくい。文字の色が地の文と同じ黒なので、見分けがつかない。マウスカーソルを重ねれば、アイコンが指の形になるけど、文字の色が変わらないので、見逃しかねない。

 なんとか「タイトルウバナーはリンクだ」と判るようにしたい。そこで、タイトルバナーの色を本文中のリンクと同じ色にする。また、マウスカーソルが来た時の挙動も、本文中のリンクと同じにする。つまり、カーソルを指の形にして、文字の色も緑色にする。

 タイトルバナーの色を変えるだけなら、標準の「デザイン」→「現在のテンプレートを編集」で出来る。が、マウスカーソルが重なった時に色を変える方法は見つからない。そこで、カスタムCSSを使った。

 と言っても、以下の4行を付け足すだけ。

#banner a:link    { color: #0044ff; } /* 未訪は青 */
#banner a:visited { color: #660099; } /* 既訪は紫 */
#banner a:hover   { color: #336600; } /* マウスカーソルが来たら緑 */
#banner a:active  { color: #cc0000; } /* クリックしたら赤 */

 以下が結果だ。既にトップページに来ているなら、タイトルバナーが紫色になる。

T1

 マウスカーソルを重ねると、文字が緑色になってマウスカーソルが指の形になる。

T2

 これで多少は「リンクである」由が伝わればいいんだが。

| | コメント (0) | トラックバック (0)

2018年2月12日 (月)

ココログのカテゴリーのアーカイブから記事一覧を作るVBScript

 カテゴリ別書評一覧の新装開店の詳細その4。

【はじめに】

カテゴリ別書評一覧を作り替える際、ついでに少し体裁を変えた。記事は千件以上あるので、手作業でじゃやってられない。そこで、各カテゴリーのアーカイブから一覧を作る VBScript を書いた。

【もう少し詳しく】

 各カテゴリーの頁の HTML は、次の構成だ。最新の10記事は全文を載せ、11記事目より前の記事はリンクだけが載っている。

 ¦
 ¦ なんかいろいろ
 ¦
記事1の全文
記事2の全文
記事3の全文
 …
記事10の全文
 ¦
 ¦ なんかいろいろ
 ¦
記事11へのリンク
記事12へのリンク
記事13へのリンク
 …
記事xへのリンク
 ¦
 ¦ なんかいろいろ
 ¦

 これから、各記事のタイトル・URL・日付を抜き出し、次の形の HTML を作る。

<li>記事1の日付 <a href="記事1のURL">
記事1のタイトル</a></li>
<li>記事2の日付 <a href="記事2のURL">
記事2のタイトル</a></li>
<li>記事3の日付 <a href="記事3のURL">
記事3のタイトル</a></li>
 …
<li>記事10の日付 <a href="記事10のURL">
記事10のタイトル</a></li>
<li>記事11の日付 <a href="記事11のURL">
記事11のタイトル</a></li>
<li>記事12の日付 <a href="記事12のURL">
記事12のタイトル</a></li>
<li>記事13の日付 <a href="記事13のURL">
記事13のタイトル</a></li>
 …
<li>記事xの日付 <a href="記事xのURL">
記事xのタイトル</a></li>

 ちなみに、記事1~記事10は、次の形になっている。

 ¦
 ¦ なんかいろいろ
 ¦

<h2>記事?の日付</h2>

 ¦
 ¦ なんかいろいろ
 ¦

<h3><a href="記事?のURL">記事?のタイトル</a></h3>
 ¦
 ¦ なんかいろいろ
 ¦

 記事11~記事xの形は以下。

<li class="archive-list-item"><a href="記事?のURL">記事?のタイトル</a> <span  class="archive-list-date">記事?の日付</span></li>

 要はテキスト・フィルタですね。必要な所を正規表現で見つけ出し、都合のいい形に直して書き出してるだけ。

【インストール】

 この記事の末尾にあるスクリプトを、ctindex.vbs などの名前で保存する。

【使い方】

  1. 各カテゴリーをブラウザで開き、その HTML を cat1.html などの名前で保存する。
  2. cat1.html を、ctindex.html にドラッグ&ドロップする。
     → cat1.html.txt ができる。
  3. テキスト・エディタで cat1.html.txt に見出しや <ol>~</ol> などを付け加えてください。

【スクリプト】

' 2018.01.266 カテゴリHTMLから索引頁を作る
Option Explicit
Dim WSH   : Set WSH  = WScript.CreateObject("Wscript.shell")
Dim FSYS  : Set FSYS = WScript.CreateObject("Scripting.FileSystemObject")

' ダブルクリックで起動したら使い方を示して終わる
if WScript.Arguments.length <> 1 then
    Call MsgBox( "Drag&DropしたファイルLから索引頁を作る" )
    WScript.Quit
end if

' D&Dしたファイル名からフルパスと親フォルダを得る
Dim iName   : iName   = WScript.Arguments.Item(0) ' D&Dしたファイルのフルパス
Dim iFolder : iFolder = FSYS.getParentFolderName( iName ) & "\" '親フォルダ名

' D&D したファイルを開く
Dim iHandle : Set iHandle = CreateObject("ADODB.Stream")
iHandle.Type          = 2                ' text mode
iHandle.charset       = "utf-8"
iHandle.LineSeparator = 10    ' lf
iHandle.open
iHandle.LoadFromFile iName '入力ファイルを読み込む
If Err.Number <> 0 Then
    Call MsgBox( "Code:" & Err.Number & " :Can not open " & iName )
    WScript.Quit
end if

Dim hDate, hURL, hTitle, rDate, rTitle, rList, oBuf
Set rDate  = new RegExp :  rDate.IgnoreCase = True    '<h2>日付</h2>
Set rTitle = new RegExp : rTitle.IgnoreCase = True    '<h3><a href=URL>記事名</a></h3>
Set rList  = new RegExp :  rList.IgnoreCase = True    '<li class=..>
rDate.pattern = "^.*<h2>(\d+)[^\d]+(\d+)[^\d]+(\d+).*</h2>.*$"
rTitle.pattern = "^.*<h3><a href=.([^>]+).>([^<]+)</a></h3>.*$"
rList.pattern = "^<li class=.archive-list-item.><a href=.(.*).>(.*)</a>.*<span .*>(.*)</span></li>$"
Do While iHandle.EOS = False
    Dim line : line = iHandle.ReadText( -2 )
'                                        <h2>日付</h2>
    if rDate.Test( line ) then
        hDate = rDate.Replace( line, "$1" & "." & "$2" & "." & "$3" )
    end if
'                                        <h3><a href=URL>記事名</a></h3>
    if rTitle.Test( line ) then
        hURL   = rTitle.Replace( line, "$1" )
        hTitle = rTitle.Replace( line, "$2" )
        oBuf = oBuf & "<li>" & hDate & " <a href=""" & hURL & """>" & vblf & hTitle & "</a></li>" & vblf
    end if
'                    <li class=..><a  href=URL>記事名</a> <span..>日付</span></li>
    if rList.Test( line ) then
        hURL   = rList.Replace( line, "$1" )
        hTitle = rList.Replace( line, "$2" )
        hDate  = rList.Replace( line, "$3" )
        oBuf = oBuf & "<li>" & hDate & " <a href=""" & hURL & """>" & vblf & hTitle & "</a></li>" & vblf
    end if
Loop
                    ' 結果の書き出し
Dim oHandle
Set oHandle = CreateObject("ADODB.Stream")
oHandle.Charset    = "UTF-8"
oHandle.Open
oHandle.WriteText oBuf, 0
oHandle.SaveToFile WScript.Arguments.Item(0) & ".txt", 2        '上書き

iHandle.Close
oHandle.Close
Call MsgBox( hDate )

【おわりに】

 改めて考えると、「複数のカテゴリーを一度で処理できりゃ楽なんじゃね?」とか「いっそカテゴリーのHTMLもスクリプトで取ってこいや」とか、改善の余地はいろいろあるけど、とりあえず役に立ったから良しとしよう。

【関連記事】

| | コメント (0) | トラックバック (0)

より以前の記事一覧