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

2025年11月 5日 (水)

アンディ・グリーンバーグ「サンドワーム ロシア最恐のハッカー部隊」角川新書 倉科顕司・山田文訳

本書では、サイバー戦争によってディストピア化を進行させているならず者の最も明確な例として、サンドワームの話を紹介する。
  ――はじめに

【どんな本?】

 2015年のクリスマスイブ。ウクライナは大規模な停電に陥る。事故ではない。事件だ。物理的な攻撃ではない。サイバー攻撃である。目標はサーバでもパソコンでもない。制御システムだ。そして目的は愉快犯でも金銭でもない。政治的・戦略的・経済的にウクライナに打撃を与えることだ。単独犯による犯行ではない。組織によるものだ。それも、大規模で高度な技術を擁する。

 以前から、連中にはコードネームがついていた。サンドワーム。

 雑誌 WIRED のシニアライターを務める著者が、ウクライナ政府のみならず世界中の港湾施設や病院などのコンピュータを停止させた謎のサイバー・テロ組織サンドワームを追い、世界を巡ってその被害者やセキュリティ関連企業に取材した、迫真のドキュメンタリー。

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

 原書は Sandworm: A New Era of Cyberwar and the Hunt for the Kremlin's Most Dangerous Hackers, Andy Greenberg, 2019。日本語版は2023年1月10日初版発行。新書版で縦一段組み本文約423頁に加え、著者あとがき7頁。9ポイント41字×16行×423頁=約277,488字、400字詰め原稿用紙で約694枚。文庫なら厚い一冊分。

 文章は比較的こなれている。内容も、少なくとも技術的には難しくない。というか、著者はあましITに詳しくない。取材相手からDNS(→Wikipedia)の講義を受けてたり。そのためか、多少IT系の言葉遣いがあやしい。と思えば、幾つかの用語を説明なしに使ってたり。その例は以下。

  • マルウェア:不正プログラム(→Wikipedia)
  • フォレンジック:証拠の保護およびシステムの保全?(→Wikipedia)
  • ハクティビスト:政治目的を掲げる(広い意味での)ハッカー(→Wikipedia)
  • ゼロデイ攻撃:修正プログラム配布前の脆弱性を突く攻撃(→Wikipedia)

 あと、「ハッカー」は悪党の意味で使ってる。かと思えば、.vbs(→Wikipedia)やDNSは簡潔な説明がある。また、ド「メインコントローラ」(→Wikipedia)って言葉も出てくるんだが、これマイクロソフトのシロモノだよね。同様に「ワード」も、マイクロソフト・ワードを示すんだろうけど、KWord(→Wikipedia)やEGWORD(→Wikipedia)とかもあったんだぜ。最近は~WORDではなく~Writerが流行りみたいだけど。いったい、どういう読者を想定してるんだろう…って、雑誌 WIRED の読者か。

 という事で、索引か用語集が欲しかった。

【構成は?】

 前の章を踏まえて後の章が展開する構成なので、なるべく頭から読もう。

クリックで詳細表示
  • はじめに
  • プロローグ
  • 第1部 出現
  • 1 ゼロデイ
  • 2 ブラックエナジー
  • 3 アラキス
  • 4 戦力倍増
  • 5 スターライト・メディア
  • 6 ホロドモールからチョルノービリまで
  • 7 マイダンからドンパスまで
  • 8 停電
  • 9 視察団
  • 第2部 起源
  • 10 回想 オーロラ
  • 11 回想 エストニア
  • 12 回想 ジョージア
  • 13 回想 スタックスネット
  • 第3部 進化
  • 14 警告
  • 15 ファンシー・ベア
  • 16 Fソサエティ
  • 17 ポリゴン
  • 18 インダストロイヤー、あるいはクラッシュオーバーライド
  • 第4部 神格化
  • 19 マースク
  • 20 エターナルブルー
  • 21 ノットペチャ
  • 22 全国規模の大災害
  • 23 崩壊
  • 24 損害
  • 25 事後分析
  • 26 距離
  • 第5部 アイデンティティ
  • 27 GRU
  • 28 離反者
  • 29 情報敵対
  • 30 ペナルティ
  • 31 バッド・ラビット、オリンピック・デストロイヤー
  • 32 偽旗
  • 33 74455
  • 34 タワー
  • 35 ロシア
  • 36 ゾウと反乱者
  • 第6部 教訓
  • 37 ブラックスタート
  • 38 回復力
  • エピローグ
  • 付録 サンドワームとフランス選挙ハッキングのつながり
  • 謝辞/著者あとがき/出典について/参考文献

【感想は?】

 つくづく、ロシアはロクな事をしない。

 ロシアのサイバー・テロ組織「サンドワーム」を雑誌 WIRED の記者が追ったドキュメンタリーだ。その過程で最大の標的となったウクライナはもちろん、ジョージア・オランダ・イギリス・米国などを飛び回り、被害者やセキュリティ企業そして国家の治安機関などに話を聞いている。

 残念ながら技術的な詳しい話は出てこない。そもそも著者はプログラマじゃないし。また、情報セキュリティ関係者に役立つネタも、ほぼ出てこない。だから、その辺は期待しないように。あくまでも「記者がテロ組織を追ったドキュメンタリー」であって、技術書じゃないのだ。

 冒頭から、標的にされたウクライナの悲惨な状況が切々と描かれる。マルウェア(不正プログラム)が蔓延しているのだ。

「ウクライナでは、攻撃されていない場所がありません。どの岩をひっくり返しても、コンピュータネットワークへの工作の痕跡が見つかるんです」
  ――第1部 出現

 素人が面白半分で仕掛けてるんじゃない。組織的に、ウクライナを標的として攻撃を仕掛けているのだ。その結果、ウクライナでは大規模な停電が起きた。

長年身を潜め、能力を高め、偵察活動をしてきたサンドワームは、これまでそのハッカーも踏み出したことのない一歩を踏み出した。実際に停電を引き起こし、数十万人の民間人が利用する現実世界のインフラを無差別に破壊したのだ。
  ――第1部 出現

 実質的な被害を考えれば、戦略爆撃みたいなモンだろう。犯罪どころか戦争行為である。これには、予兆があった。2007年4月のエストニアだ。DDoS(→Wikipedia)攻撃で、エストニア国内の多くのサイトが使えなくなった。

エストニアで起こったこの2カ月間の出来事は、一部の専門家のあいだでは、史上初のサイバー戦争、あるいは、刺激的に“第一次ウェブ大戦”と言われるようになる。
  ――第2部 起源

 政府が大胆にITを活用する国として有名なエストニアだが、悪党にとっては魅力的な標的だったのだ。もっとも、エストニアを狙った理由は、もっと下世話なものだけど。だってNATO加盟国だし。

 また、ロシアは実際の軍事侵略にサイバー攻撃を組み合わせた先例も作った。2008年のジョージア南オセチア戦争(→Wikipedia)だ。北京オリンピック期間中でもあり、軍事衝突ばかりが話題になったが、その陰でロシアはサイバー攻撃もしていたのだ。

(2008年8月のジョージアに対する)サイバー攻撃の実際の効果よりも重要なのは、ロシアが歴史的前例をつくったことだ。ハッカーによる破壊工作と伝統的な戦争をこれほど公然と連携させた国はこれまでになかった。
  ――第2部 起源

 この時はサイバー攻撃による大きな被害はなかったが、ニュース・メディアはサイバー攻撃について大きな報道をしなかったし、各国の政府も表向きは問題視しなかった。

ジョンズ・ホプキンス大学で戦略と軍事を研究しているトマス・リッド教授の指摘によると、そのように(攻撃への非難や反撃を)放置された状況のもとでロシアは技術力の限界を押し広げるだけではなく、国際社会が許容する限界を探っているという。
  ――第3部 進化

 つまり、ツケあがらせてしまうのだ。平和を維持するには、小競り合いでもキチンと反撃してメンツを保つのも大切なんです(「戦争と交渉の経済学」)。

 さて、ロシアのサーバー・テロ組織としては、「情報セキュリティの敗北史」でファンシー・ベア(→Wikipedia)が挙がっているが…

サンドワームのハッカーは、姿を見せないプロの破壊活動家だ。一方、ファンシー・ベアは恥知らずで下品なプロパガンダ活動家のようだ。
  ――第3部 進化

 「140字の戦争」にはロシアが運営するトロール(荒らし)工場が出てくる。著者もセキィリティ関係者も、その三者は見分けにくいというか、どうも連携してる雰囲気があったり。

 さて、本書の主な舞台はウクライナだが、他国の情報セキュリティ企業の関係者も、テロリストが武器として使った不正プログラムを手に入れ、解析している。その結果、かなりヤバい事がわかってきた。

「このマルウェア(CRASHOVERRIDE,→IPA 独立行政法人情報処理推進機構/pdf)のすばらしさは、どの国でも、どの変電所でも実行できることです」
  ――第3部 進化

 変電設備は国により様々なメーカーや機種があり、操作・命令系統も異なる。この違いを吸収するために、ロシア製の不正ソフトウェア CRASHOVERRIDE は、設備への命令部分をモジュール化していた。他国を攻撃する際は、そこだけ差し替えればいい。つまり、わが国がいつ攻撃されても不思議じゃないのだ。

 更にロシアはよりより凶悪な不正プログラム NotPetya を発動、2017年6月27日にウクライナ中のパソコンが狂ってしまう。

ウクライナのインフラ相ヴォロディミール・オメリヤン「政府が機能停止しました」
  ――第4部 神格化

 ばかりではない。NotPetya は世界中で猛威を振るい、例えば世界トップの海運企業マースク(→Wikipedia)の社内でもパンデミックを起こし、各国の港湾が麻痺状態に陥った。病院も被害を受けたというから恐ろしい。

 この被害を…

ホワイトハウスの評価では、結果として合計100憶ドルを超える損害があったという。
  ――第4部 神格化

 これはあくまでも表沙汰になったモノだけで、水面下でどれぐらいの被害が出たのかは不明だ。最近も日本じゃアスクルやアサヒグループホールディングスが被害を受けてたり(→YaHoo!ニュース)。いや犯人はサンドワームじゃないようだけど。

 さて、これらの不正プログラムの感染源となったのは、会計支援アプリケーションのアップデート・サーバだ。脆弱性を塞ぐために最新版にアップデートしたら、おまけに不正プログラムまでついてきたのだ。病院でワクチンを受けたら病気に感染した、みたいな話で実に怖い。その会社の担当者曰く…

単に狙われるとは思っていなかった
  ――第4部 神格化

 発電所などのインフラでもなく、軍のような安全保障のキモでもない、ただの民間企業だから、と油断してたワケです。ありがちですね。

 これらの事故というより事件の裏にはロシアのスパイ組織GRU(→Wikipedia)がある、そう情報セキュリティ企業が明言しているにも関わらず、西側の政府はダンマリを決め込んでいたが、2018年にやっと…

ジェレミー・ハント英外相「同盟諸国とともに、われわれは国際社会の安定を脅かそうとするGRUの企てを明らかにし、それに対応する」
  ――第5部 アイデンティティ

 と、声明が出た。それまで、オバマ政権もトランプ政権も黙っていたのだ。その理由の一つは、イランの核燃料濃縮施設を狙い明国とイスラエルが共同開発した不正プログラムStuxnet(→Wikipedis)だろう、と著者は推測している。「俺たちが使えなくなったら困るじゃないか」、そういう理屈だ。

 先に述べたように、ロシアが狙うのはウクライナだけとは限らない。というか、既にマースク社などが巻き添えで大きな被害を受けている。幸か不幸か、当時のウクライナはあまりコンピュータが浸透しておらず、従来のアナログな技術が多く残っていた。そのため、コンピュータを切り離すことで復旧できたのだ。

 だが、現代の米国や日本は、もっとIT化が進んでいる。加えて、若い担当者はアナログな時代を知らない。これが示す現実は怖ろしい。

「アメリカの送電網を停止させるのは、ウクライナでやるよりむずかしいでしょう」
「でも停止させたままにしておくのは簡単かもしれません」
  ――第6部 教訓

 などの本筋の迫力に加え、情報セキュリティ企業が不正プログラムを集めるため敢えて囮とするサーバを運営しているとかの、情報セキュリティ系のゴシップも山盛りで楽しかった。技術的にはあまり役立つ内容ではないが、ロシアの悪辣な手口や、それに対する西側各国の甘い対応、そして被害を受けた現場の状況などは、実に身につまされる本だった。マウスが勝手に動く場面とかね。いやマウス操作の自動化は、まっとうなソフトもあるのよ、おーとくりっか~ (→窓の杜)とか。

 そんなワケで、ロシアを警戒する人にお薦め。

【関連記事】

【蛇足】

 技術的にも情報セキュリティにもあまり役に立たない本だが、二つほど気が付いた事がある。先の「ワード」や「ドメインコントローラ」が示すように、本書で被害を受けたのは、みな Windows なのだ。というか、著者はコンピュータ=Windows、と思い込んでるフシがある。

 マースク社は Windows のドメインコントローラを潰され、会計支援ソフトの企業はアップデートサーバが感染源になった。なら、サーバとクライアントやバックアップと日常用は、異なるOSにすりゃいんじゃね、と思うのだ。クライアントや日常用がWindowsならサーバやバックアップはLinuxやMacintoshやAWSとか。まあ、それはそれで管理が面倒ではあるんだろうけど。

 もう一つ気づいたのは、感染のパターンだ。電子メールの添付ファイルについてたワープロ文書のマクロに不正プログラムが入ってた、そういうケースが多いのだ。

 そもそも、なぜワープロ文書なのか。地図や構成図などの絵があるならともかく、文章だけなら電子メールの本文に書けばいいじゃないか。本当にワープロ文書である必要があるのか。「屈辱の数学史」には、「某社の表計算ファイルの42.2%には一つも数式がなかった」なんて記述もある。「なんかカッコいいからワープロを使う」みたいな風潮が、社内に蔓延してたんじゃないか。

 と思ったら、ソコを指摘してるサイトもあった(セキュアSAMBAワードをメール添付で送るリスク)。やっぱりそうか。

 ヤバいマクロが勝手に動く危険もあるし、メールサーバの容量も無駄に食うしね。下手すっと一桁多くなるのだ、メールの容量が。だもんで、ネットワーク管理者には嫌われるのだ。

 そのうち、マクロ機能がないワープロソフトとかが出回るんじゃないかなあ。セキュア・ワードみたいな名前で。

 そんなワケで、マナー講習とかでも、「電子メールはなるたけ添付ファイルを使わないように」とか広めてほしいな、と思うのであった。

 以上、駄文でした。

| | コメント (0)

2021年7月11日 (日)

サミュエル・ウーリー「操作される現実 VR・合成音声・ディープフェイクが生む虚構のプロパガンダ」白揚社 小林啓倫訳

本書で私は(略)デジタルツールを使った最近の政治的な世論操作の例を紹介し、(略)これから何が起きるかを推測してみたい。また、どうすれば私たちが現状に対処し、デジタル空間を再生できるかについても概観する。
  ――1 曖昧な真実

「ディープフェイク動画に登場する人物のまばたきの頻度は、実際の人間に比べてかなり低いことがわかりました」
  ――5 フェイクビデオ まだディープではない

私たちはマシンを操作できるようになるかもしれないし、マシンが人間を操作するようになるかもしれない。
  ――7 テクノロジーの人間らしさを保つ

【どんな本?】

 2016年の米大統領選では、それまでと違う新しい戦術が大きく使われた。フェイスブックなどのSNSによる選挙活動だ。各陣営が自分たちの候補者を売り込むだけならともかく、これにロシアが組織的に乱入している事が明らかになった。俗にロシアゲートとも呼ばれる事件である(→Wikipedia)。

 フェイスブックだけではない。ツイッターでは、2018年7月に当時現職のドナルド・トランプ大統領のフォロワーが20万人、バラク・オバマ元大統領のフォロワー240万人が一気に消えた(→朝日新聞)。いずれも俗に偽アカウントと呼ばれるもので、フォロワー数を水増ししていた事になる。

 かつてとは異なり、今やインターネットは私たちの暮らしに染み込んでいる。そして、それを悪用し、デマを振りまく者もいる。

 誰が悪用しているのか。その目的は何か。どんな手口を使うのか。どうすれば見破れるのか。フェイスブックやツイッターなどのプラットフォーム側は、どんな対策をしているのか。なぜ防げなかったのか。今後、手口はより狡猾になるのか。そして、防ぐためにはどうすればいいのか。

 ソーシャルメディアを研究する著者が、ソーシャルメディアの悪用の事例を紹介・分析し、その手口・影響・原因を探り、防ぐ手立てを提案する、一般向けの解説書。

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

 原書は The Reality Game : How the Next Wave of Technology Will Break the Truth, by Samuel Woolley, 2020。日本語版は2020年11月12日第一版第一刷発行。単行本ハードカバー縦一段組み本文約354頁に加え、訳者あとがき5頁。9.5ポイント36字×17行×354頁=約216,648字、400字詰め原稿用紙で約542枚。文庫なら普通の厚さの一冊分。

 文章はこなれている。内容も特に難しくない。ツイッターやフェイスブックとは何か、ぐらいは知っていた方がいい。

【構成は?】

 いちおう頭から読む構成になっているが、気になった所だけを拾い読みしても充分に楽しめる。

クリックで詳細表示
  • 謝辞
  • はじめに
  • 1 曖昧な真実
    あなたの現実、私にはフェイク/テクノロジーと虚偽の新しい波/現実と真実への「攻撃」/テクノロジーの変化、社会の変化/プロパガンダからコンピューター・プロパガンダへ/未来のテクノロジーの役割
  • 2 真実の破壊 過去・現在・未来
    事の起こり/デジタル偽情報はどこから来るのか?/コンピューター・プロパガンダの登場/人間の要素/アクセスの問題/過去 何が起きたのか/現在 何が変化しているのか/未来 何が起きるのか/メディアの崩壊
  • 3 批判的思考から陰謀論へ
    バイラルな記事のつくり方/シリコンバレーから愛をこめて/オンライン・ユートピアからデジタル・ディストピアへ/あなたが読んだものがあなたをつくる/批判的思考から陰謀論へ/ソーシャルメディアはメッセージ/政策はどうなっているのか/メディア指向の解決策
  • 4 人工知能 救いか破滅か?
    ザッカーバーグのマクガフィン/ボットからスマートマシンへ/ユーザーの問題?/単純なボット/AIボットの時代/AIを実現する技術/無視されるエシカルデザイン/AIプロパガンダの始まり/毒を以て毒を制す/ファクトチェックを越えて/頭の悪いAI/AIからフェイクビデオへ
  • 5 フェイクビデオ まだディープではない
    加工動画対ディープフェイク/ディープフェイク/まだ注目するには早い?/普通の動画も強力なプロパガンダ・ツールに/ユーチューブ問題/フェイクビデオの拡散を止める/ライブストリーミングの問題/動画からバーチャルリアリティーへ
  • 6 XRメディア
    バーチャル・ウォー/XRメディアの世界/バーチャルの定義/ ARかVRか?/XRメディアと世論操作/社会的利益につながるVRの活用/スローXR/人間と人間に似たもの
  • 7 テクノロジーの人間らしさを保つ
    @FuturePolitical/マシンか人間か/マシンとの関係構築/人間らしい音声を越えて/人間の声が持つ説得力/人間の顔をデジタルで生成する/マシンが親切に振る舞うようにする
  • 8 結論 人権に基づいたテクノロジーの設計
    既存ソーシャルメディアの窮地/テクノロジーについての社会調査の価値/拡大する世界規模の問題/コインテルプロ/若者と未来のテクノロジー/倫理的なオペレーティングシステム/崩壊した現実を立て直す/民主主義を再構築する
  • 訳者あとがき/参考文献/索引

【感想は?】

 この本を読んだ目的は、野次馬根性だ。

 誰が、何のために、どんな手口で、どんな事をやっているのか。それが知りたかった。あと、藤井太洋の元ネタが知りたかった、というのもある。

 残念ながら、「アンダーグラウンド・マーケット」に出てくるような、近未来を感じさせるハイテク手口は、あまし出てこない。手口はけっこう単純なのだ。

実際には、人工知能のような複雑なメカニズムは、これまでのところコンピューター・プロパガンダには大した役割を果たしていない。
  ――4 人工知能 救いか破滅か?

 ではどんな手口か、というと、力押しというか飽和攻撃というか。先のニュースにあるように、幽霊アカウントを山ほど作ってフォロワー数やリツイート数を水増したり、自動的に似たようなつぶやきを何度も投稿したり。そんなんでも、リツイート回数が多ければ、ツイッターは「トレンド」として目立つ所に表示するので、広告としての効果はある。

オンライン上では、人気のあるものは急速に拡散するのだ――それがたとえ、ボットを使ってつくられた幻想だったとしても。
  ――2 真実の破壊

 ここでは、暴き方の方が面白い。幽霊アカウントの特徴を見破ったのだ。プロフィールに写真がないか買ってきた写真だ。自己紹介もなく、フォロワーがほとんどいないか、幽霊アカウント同士でフォローし合ってる。そして投稿はタイマーで計ったように定期的。

 どうも会話が絡むテキスト・ベースだと、人間っぽく振る舞うのは難しいみたいだ、少なくとも今のところは。この辺は「機械より人間らしくなれるか?」が詳しい。今は人海戦術が中心だ。五毛党とかトロール工場(「140字の戦争」)とか。

プラガーフォースのメンバーには報酬は支払われないが、300万人に近い購読者を持つプラガー・ユニバーシティのフェイスブック・アカウント上でシェアされるという見返りが与えられる。
  ――3 批判的思考から陰謀論へ

 300万人の読者かあ。零細ブロガーとしちゃ、そりゃ心が動くなあ←をい 「ネット炎上の研究」にもあったけど、そういう手口を使い多人数に見せるのも、連中の常套手段。

 その「連中」とは誰か、ってのも、この本を読んだ目的。期待したとおり、やっぱり出てきましたロシア。出番は2016年の大統領選だ。

フェイスブック(略)におけるロシアの世論操作(略)の目的は人々を騙すこと、そして分裂を促し、人々を支配することだった。
  ――8 結論 人権に基づいたテクノロジーの設計

 これについては、具体例として1番打者にフィリピンのロドリゴ・ドゥルテ大統領のソーシャルメディア軍、2番に在トルコのサウジアラビア大使館で起きたジャマル・カショギ記者暗殺事件(→Wikipedia)を置くなど、インパクトはなかなか。

 「ヒトラー演説」や「ベルリン・オリンピック1936」にもあったけど、目端が利く政治家は広報に力を入れ、新しいメディアの使い方も巧みなんだな、困ったことに。

 そう、SNSは新しいメディアなのだ。ところが、肝心のメディア提供者であるフェイスブックやツイッターには、そういう認識がない。自分たちはサービスを提供しているだけだと思っていて、マスメディアだという自覚が欠けているのが、次第に伝わってくる。

 これはSNSだけではなく、政治家も同じ。だもんで、テレビ局や新聞社に対しては法で様々な規制をかけているのに対し、SNSは野放しだったりする。この問題への著者の提案の一つは、日本でも是非やってほしい。

広告枠の購入者は、特定の広告に誰が料金を支払ったかを明確に通知するなど、一定の基準を守らなければならない
  ――>8 結論 人権に基づいたテクノロジーの設計

 要は「誰が出した広告かハッキリさせろ」ですね。これでステルス・マーケティングが減れば嬉しいんだが。

 そんな「なんとかせいや」とする声に対し、フェイスブックのマーク・ザッカーバーグがAI技術に希望を託すあたりを、著者は激しく批判してる。

将来起こる問題のほとんどは、現在は解決策のように見える技術によって引き起こされる
  ――4 人工知能 救いか破滅か?

 …ああ、はい、そうですね。いやそうなんだけど、ザッカーバーグの気持ちも分かるんだよなあ。怪しげなアカウント凍結も、一応の成果を挙げてるし(→J-WAVE)。エンジニアってのは、つい技術での解決を考えちゃう生き物なんです。このあたりは、著者と技術者の溝の深さが実感できて、お互いの話し合いがもっと必要だなあ、と感じたところ。

 全般的に、具体例はそこそこ豊富にでているし、刺激的なエピソードも多い。とまれ、著者の姿勢は研究者やジャーナリストというより思想家・政治運動家に近く、リベラルな著者の考え方や提言が強く出ている。その辺は、好みが別れるかも。

 かつてインターネットが「便所の落書き」とか言われた頃を憶えているネット老人会の一人としては、インターネットの信頼性が上がったような気がして嬉しいような、そういう風潮に鍛えられて良かったかも、とか思ったりした本だった。

【関連記事】

【今日の一曲】

行け!行け!川口浩 - 嘉門達夫

 フェイクで思い出すのは、やっぱりコレ。思えば大らかな時代だったなあ。

| | コメント (0)

2019年10月10日 (木)

ココログ:記事編集で余分な改行が入る→初期設定を通常エディタにする

 2019年3月のリニューアル以来、ココログは幾つものトラブルが続いている。中でも、プログラムのサンプルや番号付きリストに余計な改行が入るのには参った。新しく書く記事ばかりでなく、昔の記事を編集する際にも、勝手に空白行が入ってしまう。おかげで誤字脱字すら直せない。

 サポートにも報告したが、当面は直す気がないらしい。とまれ、一応の自衛策は教えてくれた。あまり万民向けとは言い難い方法だが、なんとか誤字脱字ぐらいは直せるようになったので、ここで書いておく。

【現象:概要】

 番号付きリストなどに、勝手に空白行が入って書き換わる。例えば以下のリストが…

ほんぶん

  1. foo
  2. bar

おわり

 このようになる。

ほんぶん

    1. foo

  1. bar

おわり

 番号なしリストや、整形済みテキストなどでも、エディタが勝手にHTMLタグを追加する。形が崩れるだけならともかく、番号付きリストだと意味まで変わってしまうので、使い物にならない。

【対策:概要】

 記事編集の初期設定を「通常エディタ」にする。その上で、リッチテキストは使わない。

【問題点】

 つまりですね。

 記事の編集は、リッチテキストだけを使うか、通常エディタだけを使うか、どっちかにしろ、という事です。両方を行き来するのは不許可である、と。自分で HTML タグを入れるなら常に 生HTML で書け、そうでなければココログが提供する HTML タグだけを使え、と。

 バリバリと HTML が書ける人ならいいけど、私のようにそうでない人には、かなり厳しい仕様だよなあ。もしくはホームページビルダーの類を使うとか。

【対策:詳細】

 と、そういう無茶な制限があります、と断ったうえで、記事編集の初期設定を「通常エディタ」にする方法を。

A01

1.ブログの「設定」をクリックする。
  →「ブログ詳細設定」画面に移る。
   *画像をクリックで拡大表示

A02

2.「表示方法」をクリックする。
  →「ブログの表示設定」画面に移る。
   *画像をクリックで拡大表示

A03

3.「記事とウェブページの初期設定」の「エディタ設定」を「通常エディタ」にする。
  「エディタ設定」は下の方にあるので、ずっとスクロールしてください。
  →「通常エディタ」ボタンの色が変わる。
   *画像をクリックで拡大表示

A04

4.「記事とウェブページの初期設定」の「保存」をクリックする。
  「保存」ボタンも下の方にあるので、ずっとスクロールしてください。
   *画像をクリックで拡大表示

 これで、次から記事の編集画面を開いたら、通常エディタで開きます。余計な空白行も入りません。

【参考資料】

【現象:詳細】

 今の所、四つの不具合に突き当たった。番号付きリスト・番号なしリスト・整形済みテキスト・ブロック区切り=<div>。以下にサンプルを示す。

1.番号付きリスト

 元の表示結果

ほんぶん

  1. foo
  2. bar

おわり

 元の HTML

<p>ほんぶん</p>
<ol>
<li>foo</li>

<li>bar</li>
</ol>
<p>おわり</p>

 これをリッチテキストで開くと…

ほんぶん

    1. foo

  1. bar

おわり

 そのHTMLは、こんな感じ。

<p>ほんぶん</p>
<ol>
<ol>
<li>foo</li>
</ol>
</ol>
<p> </p>
<ol>
<li>bar</li>
</ol>
<p>おわり</p>
<p> </p>

2.番号なしリスト:style= を指定すると崩れる。

 元の表示結果

てすと

てきすと

 元の HTML

<p>てすと</p>
<ul style="margin-left: 2em; padding: 0pt;">
<li>1</li>
<li>2</li>
</ul>
<p>てきすと</p>

 これをリッチテキストで開くと、勝手に改行が入る。ちとこのサンプルは判りづらいけど、HTML で見て欲しい。

てすと

てきすと

 そのHTMLは、こんな感じ。余計な段落や改行が勝手に入ってしまう。

<p>てすと</p>
<p> </p>
<ul style="margin-left: 2em; padding: 0pt;">
<li>1</li>
<li>2</li>
</ul>
<p>てきすと</p>
<p> </p>

3.整形済みテキスト

 元の表示結果

foo
bar

 元の HTML

<pre>foo
bar</pre>

 これをリッチテキストで開くと…

foo
bar

 そのHTMLは、こんな感じ。

<pre>foo<br />
bar</pre>

4.ブロック区切り=<div>

 元の表示結果

divてすと2はじめ

いち

divてすと2終わり

 元の HTML

<p>divてすと2はじめ</p>
<div style="font-size: 0.9em; display: flex; flex-wrap: wrap;">
<div style="padding-left: 1em; max-width: 20em;">
いち
</div>
<div style="padding-left: 1em; max-width: 20em;">

</div>
</div>
<p>divてすと2終わり</p>

 これをリッチテキストで開くと、「いち」の前に空白行が入る。

divてすと2はじめ



いち

divてすと2終わり

 そのHTMLは、こんな感じ。

<p>divてすと2はじめ</p>
<div style="font-size: 0.9em; display: flex; flex-wrap: wrap;"><br />
<div style="padding-left: 1em; max-width: 20em;"><br />いち</div>
<div style="padding-left: 1em; max-width: 20em;"><br />に</div>
</div>
<p>divてすと2終わり</p>

【おわりに:考察】

 現在わかっている範囲では、どうやら私が挿入したHTMLタグ(=リッチテキスト・エディタが挿入したのではないHTMLタグ)がお気に召さないみたい。「あんたなんか、アタシの言うとおりにしてりゃいいのよ!」ってわけ。わがままな奴だ。

| | コメント (0)

2019年6月 7日 (金)

Q.Ethan McCallum「バッドデータ ハンドブック データにまつわる問題への19の処方箋」オライリージャパン 磯蘭水監訳 笹井崇司訳

要するに、バッドデータとは邪魔になるデータのことです。
  ――はじめに:バッドデータとは何か?

「バッドデータ」であったからこそ、私たちは新しいことを学べたのです。
  ――7章 バッドデータは起立して

私たちのお粗末な仮説が、データを「バッドデータ」にしているのです。
  ――7章 バッドデータは起立して

早く失敗しよう、たくさん失敗しよう(Fail early, Fail often)
  ――8章 血と汗と尿

経験によれば、分析プロジェクトに費やす時間の80%は、クリーニング、改変、変換などのタスクに費やされるそうです。
  ――15章 データサイエンスのダークサイド

私たちの戦略の中心にあるのが不変性です。私たちの処理のパイプラインがデータを何度も変換しても、私たちはもとのデータを決して変えませんでした(上書きしませんでした)。
  ――17章 データ追跡可能性

【どんな本?】

 必須のはずの項目がない。数字だけのはずなのにテキストが入っている。一部のデータがない。逆に重複している。値が大きすぎる。文字化けする。対応するデータがない。フォーマットが違う。特定範囲の値がない。データが分散している。

 仕事でプログラミングをした事があれば、誰もがこんなデータで困った経験があるだろう。サーバ管理やネットワーク管理などでログを集め分析する際に、ちょっとした道具が欲しくなることもある。ソフトウェアを開発する際には、テストデータも必要だ。最近流行の機械学習も、しつけ方・使い方次第で性能は大きく異なる。

 データの集め方・困ったデータの処理方法・手に入れたデータの検証方法・テストデータの扱い方など、データにまつわる失敗談や成功例を集めた、ソフトウェア・エンジニア向けの濃いエッセイ集。 

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

 原書は Bad Data Handbook : Mapping the World of Data Problems, by Q. Ethan McCallum, 2013。日本語版は2013年9月25日初版第1刷発行。単行本ソフトカバー横一段組みで本文約280頁。8.5ポイント38字×32行×280頁=340480字、400字詰め原稿用紙で約852枚。文庫本なら厚い一冊分。

 文章はオライリーの標準的な水準。察してください。サンプル・ブログラムも幾つか載っていて、使っているプログラム言語は awk, perl, R, Python, SQL など。でも私は大半のソースをトバして読んだ。それぞれの言語を知らなくても、プログラミング経験者なら、地の文を読めばだいたい分かります。そもそもプログラムに関する本じゃなくて、データに関する本だし。

【構成は?】

 各章はほぼ独立しているので、気になった所だけを拾い読みしていい。

  • 監訳者まえがき/著者について/まえがき
  • 1章 はじめに バッドデータとは何か?
  • 2章 気のせいかな。このデータ、何かおかしくないか?
  • 2.1 データ構造を理解する
  • 2.2 フィールドの検証
  • 2.3 値の検証
  • 2.4 単純な統計による物理的解釈
  • 2.5 可視化
  • 2.6 キーワードPPCの例
  • 2.7 検索参照の例
  • 2.8 推薦分析
  • 2.9 時系列データ
  • 2.10 まとめ
  • 3章 機械ではなく人間が使う事を意図したデータ
  • 3.1 データ
  • 3.2 問題:人間が使うためにフォーマットされたデータ
    • 3.2.1 データの配置
    • 3.2.2 複数ファイルにわたるデータ
  • 3.3 解決策:コードを書く
    • 3.3.1 扱いにくいフォーマットからデータを読み込む
    • 3.3.2 複数のファイルにわたるデータを読み込む
  • 3.4 あとがき
  • 3.5 ほかのフォーマット
  • 3.6 まとめ
  • 4章 プレーンテキストに潜むバッドデータ
  • 4.1 プレーンテキストのエンコーディング
  • 4.2 テキストエンコーディングの推測
  • 4.3 テキストの正規化
  • 4.4 問題:アプリケーション固有文字のプレーンテキストへの漏れ出し
  • 4.5 Python を使ったテキスト処理
  • 4.6 練習問題
  • 5章 Webにあるデータの(再)構成
  • 5.1 データを直接入手できないか?
  • 5.2 一般的なワークフロー
    • 5.2.1 robots.txt
    • 5.2.2 パターンの特定
    • 5.2.3 パースのためにオフライン版を保存する
    • 5.2.4 ページから情報をスクレイプする
  • 5.3 現実の難しさ
    • 5.3.1 できるだけ生のコンテンツをダウンロードする
    • 5.3.2 フォーム、ダイアログボックス、新規ウィンドウ
    • 5.3.3 Flash
  • 5.4 ダークサイド
  • 5.5 まとめ
  • 6章 オンラインレビューから嘘つきと混乱した人を発見する
  • 6.1 Weotta
  • 6.2 レビューの入手
  • 6.3 センチメント分類
  • 6.4 極性のある言葉
  • 6.5 コーパス生成
  • 6.6 分類器のトレーニング
  • 6.7 分類器の検証
  • 6.8 データによる設計
  • 6.9 学んだこと
  • 6.10 まとめ
  • 6.11 リソース
  • 7章 バッドデータは起立して
  • 7.1 例題1:製造時の欠損削減
  • 7.2 例題2:だれが電話をかけたのか?
  • 7.3 例題3:「平均値」が「標準的な値」とみなせないとき
  • 7.4 学んだこと
  • 7.5 これはテストに出ますか?
  • 8章 血と汗と尿
  • 8.1 とってもオタクな入れ替わりコメディ
  • 8.2 化学者による数値の作り方
  • 8.3 All Your Database are Belong to Us
  • 8.4 チェックしよう
  • 8.5 人生は太く短く、見栄えの良いコードを残すべし
  • 8.6 化学者とスプレッドシート乱用者のためのリハビリ
  • 8.7 まとめ
  • 9章 データと現実が一致しないとき
  • 9.1 それは何のティッカー?
  • 9.2 分割、配当、単位変更
  • 9.3 バッドリアリティ
  • 9.4 まとめ
  • 10章 バイアスとエラーの源
  • 10.1 補完バイアス
  • 10.2 報告エラー
  • 10.3 その他のバイアス源
    • 10.3.1 トップコーディング、ボトムコーディング
    • 10.3.2 継ぎ目バイアス
    • 10.3.3 代理報告
    • 10.3.4 サンプル選択
  • 10.4 まとめ
  • 10.5 参考文献
  • 11章 最善は善の敵、バッドデータは本当にバッドなのか?
  • 11.1 大学院時代
  • 11.2 プロフェッショナルな世界へ
  • 11.3 政府の仕事へ
  • 11.4 行政データという現実
  • 11.5 911緊急通報データ
  • 11.6 さらに先へ
  • 11.7 学んだこと、そして今後の展望
  • 12章 ファイルにこだわる
  • 12.1 昔のはなし
    • 12.1.1 ツールセットの構築
    • 12.1.2 データストアという障害
  • 12.2 ファールをデータベースと見なす
    • 12.2.1 ファイルはシンプル
    • 12.2.2 ファイルは何にでも使える
    • 12.2.3 ファイルには何でも入れられる
    • 12.2.4 データ破損が局所的である
    • 12.2.5 すばらしいツールがある
    • 12.2.6 導入コストがかからない
  • 12.3 ファイルの概念
    • 12.3.1 エンコーディング
    • 12.3.2 テキストファイル
    • 12.3.3 バイナリデータ
    • 12.3.4 メモリマップドファイル
    • 12.3.5 ファイルフォーマット
    • 12.3.6 区切り文字
  • 12.4 ファイルに基づいたWebフレームワーク
    • 12.4.1 モチベーション
    • 12.4.2 実装
  • 12.5 考察
  • 13章 Crouching Table, Hidden Network
  • 13.1 リレーショナルなコスト配分モデル
  • 13.2 組み合わせ爆発という繊細な響き
  • 13.3 隠れたネットワークが現れる
  • 13.4 グラフを格納する
  • 13.5 Gremlinを使ったグラフのナビゲート
  • 13.6 ネットワークプロパティに価値を見いだす
  • 13.7 複数のデータモデルから、仕事にふさわしいツールを使う
  • 13.8 謝辞
  • 14章 クラウドコンピューティングの神話
  • 14.1 クラウド入門
  • 14.2 「クラウド」とは何か?
  • 14.3 クラウドとビッグデータ
  • 14.4 フレッドについて
  • 14.5 最初はすべてがうまくいっている
  • 14.6 すべてをクラウドのインフラに任せる
  • 14.7 成長に合わせて、最初は簡単にスケールする
  • 14.8 やがて問題が起こり始める
  • 14.9 パフォーマンスを改善する必要がある
  • 14.10 高速なI/Oが必要になる
  • 14.11 局所的な機能停止が大規模なサービス停止を引き起こす
  • 14.12 高速なI/Oは高くつく
  • 14.13 データサイズが増加する
  • 14.14 地理的冗長性が最優先になる
  • 14.15 水平方向のスケールは思っていたほど簡単ではない
  • 14.16 コストは劇的に増加する
  • 14.17 フレッドの愚かさ
  • 14.18 神話1:クラウドはあらゆるインフラ構成要素にとって、素晴らしい解決策である
    • 14.18.1 この神話はフレッドの話にどう関係するのか
  • 14.19 神話2:クラウドはお金を節約する
    • 14.19.1 この神話はフレッドの話にどう関係するのか
  • 14.20 神話3:クラウドのI/Oパフォーマンスは、ソフトウェアRAIDによって許容できるレベルにまで改善される
    • 14.20.1 この神話はフレッドの話にどう関係するのか
  • 14.21 神話4:クラウドコンピューティングは水平方向のスケールを簡単にする
    • 14.21.1 この神話はフレッドの話にどう関係するのか
  • 14.22 まとめ
  • 15章 データサイエンスのダークサイド
  • 15.1 落とし穴を避ける
  • 15.2 汝、データについて知るべからず
    • 15.2.1 データをきれいにしてまとめる際には一貫性を持つべからず
    • 15.2.2 データは正しく完全だと思え
    • 15.2.3 時間区切りデータのあふれ
  • 15.3 汝、データサイエンティストにあらゆるタスクのための単一ツールを与えよ
    • 15.3.1 アドホックな分析のためにプロダクション環境を使う
    • 15.3.2 理想的なデータサイエンス環境
  • 15.4 汝、分析のために分析せよ
  • 15.5 汝、学びを共有するべからず
  • 15.6 汝、データサイエンティストに全能を期待せよ
    • 15.6.1 データサイエンティストは組織のどこにいるのか?
  • 15.7 最後に
  • 16章 機械学習の専門家の手なづけ方
  • 16.1 問題を定義する
  • 16.2 作る前に、うまくいっているふりをする
  • 16.3 トレーニングセットを作成する
  • 16.4 特徴を選び出す
  • 16.5 データをエンコードする
  • 16.6 トレーニングセット、テキストセット、ソリューションセットに分ける
  • 16.7 問題を説明する
  • 16.8 質問に答える
  • 16.9 解決策を統合する
  • 16.10 まとめ
  • 17章 データ追跡可能性
  • 17.1 なぜ?
  • 17.2 個人的経験
    • 17.2.1 スナップショット
    • 17.2.2 情報源の保存
    • 17.2.3 情報源の重み付け
    • 17.2.4 データを元に戻す
    • 17.2.5 フェーズを分ける(そしてフェーズを純粋に保つ)
    • 17.2.6 根本原因を特定する
    • 17.2.7 改善領域を見つける
  • 17.3 不変性:関数型プログラミングからアイデアを拝借する
  • 17.4 例題
    • 17.4.1 クローラー
    • 17.4.2 変更
    • 17.4.3 クラスタリング
    • 17.4.4 人気
  • 17.5 まとめ
  • 18章 ソーシャルメディア:消去可能インク?
  • 18.1 ソーシャルメディア:これはだれのデータか?
  • 18.2 コントロール
  • 18.3 商用再配信
  • 18.4 コミュニケーションと表現に関する期待
  • 18.5 新しいユーザが抱く期待の技術的影響
  • 18.6 業界は何をするのか?
    • 18.6.1 検証API
    • 18.6.2 更新通知API
  • 18.7 エンドユーザは何をすべきか?
  • 18.8 どのように協業するのか?
  • 19章 データ品質分析の解明:データが十分良いときを知る
  • 19.1 フレームワークの紹介:データ品質分析の四つのC
  • 19.2 完全である
  • 19.3 一貫している
  • 19.4 正しさ
  • 19.5 説明責任
  • 19.6 まとめ
  • 索引

【感想は?】

 ベテラン・プログラマの「あるある」集。

 多少なりとも仕事でプログラムを作った経験があるなら、一度は変なデータに手ひどく痛めつけられた経験があるだろう。特に、人間が入力したデータは危ない。数字のカラムのはずなのに、atoi() で変換できないとか。

 原因は位取りのカンマだったり、全角の数字だったり。酷いのになると、漢数字なんてのもある。そういうので苦労した経験がある人には、特に前半じゃ苦笑いが止まらない。そういえば日本のプログラマなら、みんな苦しむ「住所を都道府県・市町村・所番地に分割する」なんて問題もあるね。

 やはり日本のプログラマが昔から悩んでいた問題を扱ったのが、「4章 プレーンテキストに潜むバッドデータ」。要は文字コードの問題だ。最近は「とりあえず Unicode でいいじゃん」的な風潮になりつつあるが、古いデータだと姓名とかに外字が入ってたりするからタチが悪い。まあ、ここではそこまで突っ込んだ話はなく、HTTP や URL などの独自エンコーディングぐらいに留めてある。

 最近になると Web が流行って、様々なデータを集めやすくはなったけど、それをプログラムに食わせるとなると、これまた一筋縄じゃ行かない。各自治体が発表している統計データも、自治体ごとにサイトの構成もデータ形式も違う。Excel なら可愛い方で、中には PDF や Flash なんて凶悪な奴も。ほんと、皆さん一度はこう叫んだことがある筈だ。

最初から人間ではなくコンピュータが使えるようなフォーマットにしておけばよかったのに。
  ――3章 機械ではなく人間が使う事を意図したデータ

いやホント、政府が主導して XML の標準形式を定めてくれればいいのに。いまだに発想が紙ベースなんだよなあブツブツ。

そんな風に Web 経由でデータを集めようとすると、他にも色々と困ることがある。なにせ相手は「人に見せる」ために作っているので…

以前、何日か実行していたWebスクレイピングのスクリプトが突然エラーを吐き始めたことがありました。問題は、Webサイトがまったく違うデザインになったことでした。
  ――5章 Webにあるデータの(再)構成

 ああ、あるねえ。まあ、人様のデータを勝手に頂いてるんだから、文句も言えないシクシク。酷いのになると、訴訟沙汰になったり(→Wikipedia)。もっとも、中には Facebook や Twitter みたく親切な所もあって…

スクレイピングを最小限にするためによく利用されているのは、スクレイパーが実際に欲しがっているデータのための公式チャンネルを提供することです。
  ――18章 ソーシャルメディア:消去可能インク?

 ほんと、先の事件も全国の図書館が協力して蔵書 XML の標準形式を…って、もうあるみたいだ。おかげでカーリルなんて嬉しいサービスも始まった。ラッキー。

 データが集まったからといって安心しちゃいけない、と教えてくれる「7章 バッドデータは起立して」「9章 データと現実が一致しないとき」「10章 バイアスとエラーの源」「11章 最善は善の敵、バッドデータは本当にバッドなのか?」は、コードが少ない分、コラムとして面白かった。

 また「6章 オンラインレビューから嘘つきと混乱した人を発見する」は、自然言語処理ネタとして楽しめる。うん、確かにお気に入りを自分だけのモノにしたいって気持ちはわかるw 終盤では「14章 クラウドコンピューティングの神話」や「16章 機械学習の専門家の手なづけ方」など、大規模データにまつわる話も出てくる。案外と機械学習って、根気のいる地道な繰り返し作業も多いのね。

 そんな大容量データとくればデータ・マイニング。私も名前は知ってるけど中身はよくわからない。これは私だけじゃなく経営者も同じで、中にはこんな無茶ぶりする人も。

「データのところへ行って、価値を見つけてこい!」
  ――15章 データサイエンスのダークサイド

 わはは。コンピュータ絡みの世界って、昔から変わんないなあ。そこのシステム屋さん、似たような事を言われた経験、ありませんか?

 などと無駄口を叩いてなんとか記事をデッチあげたけど、実は記事を書いてるよりアクセス・ログを眺めている時間の方が多かったりする。そんなヒマがあったら、もっと面白い記事をかけよ、などと思ったりもするけど、この本は心強い言葉で締めくくられている。

データを調べている時間は必ず有意義である。
  ――19章 データ品質分析の解明:データが十分良いときを知る

 うん、そうだよね、きっと私がログを眺めている時間だって無駄じゃないはずだ←をい

【関連記事】

【おまけ:バッドデータの例】

 なんて言うほどでもないけど。このブログ、ときおり「著者別の書評一覧」が欲しくなったりする。「書評一覧」なんて記事があるぐらいだから、簡単そうに思えるけど、実は意外と手ごわい。というのも、他でもない、バッドデータがうじゃうじゃあるからだ。

 基本的に、記事タイトルはこんな形になっている。

著者名「書名」出版社 [ 訳者 ]

 ところが、こうなってない記事が幾つもあるのだ。例えば…

  1. SFマガジン編集部編「SFが読みたい!2019年版」早川書房
  2. 宮内悠介短編集「超動く家にて」東京創元社
  3. 日下三蔵編「日本SF傑作選4 平井和正 虎は目覚める/サイボーグ・ブルース」ハヤカワ文庫JA
  4. 大森望・日下三蔵編「年刊日本SF傑作選2013 さよならの儀式」創元SF文庫
  5. C.L.アンダースン(サラ・ゼッテル)「エラスムスの迷宮」ハヤカワ文庫SF 小野田和子訳
  6. ギレルモ・デル・トロ&チャック・ホーガン「ストレイン 永遠の夜 上・下」ハヤカワ文庫NV 嶋田洋一訳

 また、表記の「ゆれ」もある。カート・ヴォネガットとカート・ヴォネガット・ジュニア、ベルナール・ウェルベルとベルナール・ウエルベルとベルナール・ヴェルベールとか。

 加えて、「スタートボタンを押してください」みたくアンソロジーになると、多数の著者が寄稿してて、かつ著者名は記事本文の中に埋もれてたり。

 この程度のブログでさえ、書籍データをキチンと定型化できてない。となると、すべての書籍のメタデータを規格化しようとしたら、どれほどの「想定外のパターン」が出てくることか。これをすべて洗い出すってのは、かなりシンドい仕事になるはずだ。モノゴトをコンピュータが扱えるようにデータ化するってのは、そういう事なんです。

| | コメント (0)

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

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

【URL:記事名】

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

https://chikuwablog.cocolog-nifty.com/blog/2018/11/post.html	「KGBの世界都市ガイド」晶文社 小川政邦訳
https://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 = "https://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個書いてある、それだけ。

https://chikuwablog.cocolog-nifty.com/blog/2018/11/index.html
https://chikuwablog.cocolog-nifty.com/blog/2018/10/index.html
https://chikuwablog.cocolog-nifty.com/blog/2018/09/index.html
 ¦
https://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)

より以前の記事一覧