t-hoso.net

お知らせ

2021/12/20頃、サイトが乗っ取りにあってる可能性がある、とレンタルサーバーの管理者より連絡をもらいました。

被害を広げないためにすでにサイトは凍結済みで、とりあえずはサーバー上のデータをすべて消せ、とのことでしたので、取り急ぎバックアップを取り、データを一度すべて消しました。

順次、復旧をしてく予定ですが、もう数年放置状態だったこと、作りかけのコンテンツが未着手のままであること、HTMLやCSSの構造がかなり古いこと、などからすべてを再構築することにしました。

中でもちょっとやっかいなのがブログのデータ。長年、MovableTypeを使っていましたが、バージョンアップやサーバー引っ越しのたびにトラブルが起きていたのと、脆弱性が生まれてしまうこと、などからもうCMSには頼りたくなく、自分でブログの仕組みを作ることにしました。WPやMTほどの高機能さはいらないので、自分の中で使いやすく、そしてなるべく攻撃者に付け狙われないようにしたいと思います。

ひとまず、このページでは、復旧作業の進捗状況を記していきたいと思います。

ずっと見てくれている方、検索から飛んできていただいた方、すみません。気長に待っていただければ幸いです。

進捗状況

2022/1/22 ブログチェック&修正作業

リンク切れ、画像落ちが結構あるので、それを順に修正中です。

MTで書くだけ書いて公開しなかった中途半端な記事も今回は公開されてしまっていますが、もうそれはそれでいいかな、と思ってます(苦笑

現状、リンク切れと画像落ちの修正とチェックが終わっているのが

2000年
2001年

2016年

2019年
2020年
2021年

です。結構時間がかかるので、少しずつ進めています。

ブログがアップできるようになったので、最新のブログはなるべく毎日更新するようにしています。

2022/1/13 ブログ復旧作業

画像をアップロードする際にドラッグ&ドロップで登録してプレビューが出たら便利だなぁと思ってJS
追加。

で、ここでひとつ問題が…

テストサーバーでは動いていたフォームが、このサーバーに移したら動かない…

どうやらフォームからPOSTで送られたデータをPHPが受け取れていない様子。GETにメソッドを変えると受け取れる……(汗

いろいろ原因切り分けて、URLをhtaccessで拡張子非表示にしているのが原因と判明。

というわけで、formのaction属性値のファイル名を拡張子なしで指定することで解決しました。めでたしめでたし

2022/1/12 ブログ復旧作業

投稿画面の制作続きです。

画像のアップロード→自動リサイズが行われるようにしました。

これでスマホからでも、画像サイズ気にせずにポンポンアップロードできます。

あとは、投稿フォームからページを生成して、インデックス用のDBファイルに情報を追記する部分ができれば完成です。

併せて古い記事を少しずつ修正中です。これは膨大なので数か月~下手したら数年がかりになるかもしれません(汗

投稿画面が完成したら、日々のブログをつけつつ、古い記事を数記事修正するというルーチンにしてみようかと思います。

ついでにぽっかりとブログをさぼった2018~2021年を補間してきたい気もしますが、重荷になってまた放り出してもいけないので、とりあえずは復旧に力を注ぎます。

2022/1/11 ブログ復旧作業

投稿画面作成中です。

投稿後、ただちに静的ページが生成されるように作っています。

画像のアップロード→大きな写真の場合はリサイズ→日付をもとにしたフォルダにファイル名を自動的につけて保存される、という流れで作成中です。

これがうまくいけば、スマホからの投稿もかなり楽ちんになる予定。

あと、過去のエントリーで画像が抜けているものがある気がして(リンク切れではなく、imgタグ自体がない)DBを直接覗いてみましたが、タグはなく、imagesフォルダを覗いてみましたが該当しそうな写真もなし。

あれぇ?画像もともとアップしてなかったのかなー?

それにしては画像ファイル数に対して、掲載されている画像が少ない気がするんですよね…

ひとまず大量の画像ファイルから、MTが勝手に生成した大量のサムネイルを削除し、年ごとにフォルダを分けました。ここからサルベージできるものはしてきます。

2022/1/10 ブログ復旧作業

今日はカテゴリページ、年月のアーカイブページを作成しました。

これで過去記事も閲覧しやすくなりました。ブログ内検索も作ろうと思えば作れるのですが、セキュリティ的な部分でユーザーサイドに何かを入力してもらう、というシチュエーションを作りたくないため、Google検索窓をつけることにしました。広告出るのであまり使いたくないんですけど、仕方なしです。

次は、新規エントリーの追加の仕組みを考えます。ページの生成プログラムを悪用されない施策を考えつつ実装しなければなりません。

2022/1/9 ブログ復旧作業

とうとう、すべてのエントリーの自動生成を済ませました。全4688エントリー

いくつかのNoticeは出ましたが、Warningが起きることもなく、無事に書き出し完了。

ただ、画像の抜けやリンク切れが生じている(Noticeの原因は多分これ)ので、これを1つずつ修正していくことになります。

さすがに膨大な作業量ですので、これは毎日少しずつ。

直近の記事から修正してきます。

ひとまず今日は2021年分のエントリーを修正しました。

あとは、カテゴリやアーカイブのリンクを作ってないので、それらのリンクと、その先の一覧ページを作ります。

2022/1/8 ブログ復旧作業

恐る恐る、ページの書き出しをはじめました。最初は100件を書き出してみて、特に問題がなかったので念のため200件ずつ書き出してひとまず1300エントリーまで

なんとなく一気にやっちゃってもよさそうですが、エラーが出たときに場所特定が面倒そうなので刻んでいきます。
明日から2連休なので、そこで書き出しは終わらせちゃいたいです。

書き出した中から2000年の分のエントリーのデータチェックをしました。当時は無職で苦しんでいた頃なので、読み返していて苦しくなりました。

お金もなくて、本当にきつかたんですけど、かみさん(当時は結婚前)やたくさんの友人がしょっちゅう私を引っ張り出してどこかに連れてってくれたり、ごはんをごちそうしてくれたり、励まされ続けてたのもよくわかりました。友人に恵まれてたなぁ…

最近はみんなと疎遠になってしまってるけど、元気かなぁ…

2022/1/7 ブログ復旧作業

ブログのトップページに最新記事から数記事を表示できるようにしました。

書き出した静的ページからarticle部分だけを抽出して表示するようにしています。

元記事へのリンクが張れないといけないので、見出し部分を正規表現で抜いて、リンクを張って戻す、ということをしています。

新しめのエントリーでは、画像のファイル名に日本語が含まれていて、それがもとで画像のリンクがいくつか切れていました。これはページを書き出した後に、個別に対応するしかなさそうです。

明日は仕事なので、明後日からの2連休でいよいよ前ページの書き出しを実行します。

4500エントリー一気にやるとエラーになりそうなので、100エントリーくらいずつ、刻んでやってみようと思います。

2022/1/5 ブログ復旧作業

個別エントリーの下部に表示する「前の記事」「次の記事」が生成されるようにしました。

この部分も今後の記事追加のことを考えて自動生成されるようにしました。

PHPが入れ子になって動く部分なので、ちょっと頭をひねりましたが、なんとかエラーなく書き出しができるようになりました。

もうそろそろ書き出しを始めてもいいような気がしますが、また何か忘れてるかもしれないので、数日じっくり考えてみます。今日から仕事が始まったので、次にがっつり作業ができるのは週末になりそうです。

2022/1/4 ブログ復旧作業

昨日、CSSでブログのひな型を作りました。3カラムの形にしました。

それに伴い、書き出し用のファイルにブロックの構造を追加。後からCSSだけでデザイン変更がしやすい骨組みを考えました。もうちょっとだけ微調整が必要な気がしますが、ほぼ出来上がり

サイドバーにカテゴリ一覧と月別のアーカイブが自動生成されるようにしました。この部分はどうしても動的になってしまいますが、特に外部のパラメータは取り込まないので、セキュリティ的には大丈夫…かな?
ちょっとページの表示が遅くなりそうなのが懸念です。

カテゴリもアーカイブにもまだリンクは張っていません。個別ページを生成した後に作ります。

2022/1/3 ブログ復旧作業

ブログ復旧作業再開

画像ファイルをかき集めて、すべてひとつのimagesフォルダに集約してサーバーへアップロードしました。45000ファイルほどありました。大量だぁ……

記事中の画像を呼び出すimgタグのパス、およびポップアップで画像を拡大表示させるときのaタグのパスを修正されるようにプログラムを追記しました。

正規表現はいろいろネットを調べて

"/<img [^>]*src\s*=\s*[\"']?([^\"'> ]+)/i"
 でimgのsrc属性値を取り出せることがわかり、それを応用して
"/<a [^>]*href\s*=\s*[\"']?([^\"'> ]+)/i"
 でリンクのパスを取り出しました。

画像のパスは、上記で取り出したパスからファイル名だけを抜きだし、images/をくっつけて再生成したものを、差し替えました。

リンクはちょっとやっかいで、MTの画像ポップアップは、画像ファイル直ではなく、わざわざ画像表示用のhtmlファイルが生成されて、それにリンクが張られていました。

<a href="http://www.t-hoso.net/cgi/mt/assets_c/2014/12/14120901-10277.html">

すべてのリンクが画像へのリンクというわけではないので、ポップアップ用のリンクかどうかは、パスにassets_cという文字が含まれるか?で判断しました。

ファイル名はハイフンの前部分なので、ハイフンで区切って前部分を抽出。

あとはこれに拡張子をつければうまく画像直リンクのタグがはれそうです。ただ、問題なのがファイルの拡張子がわからない。

プログラム的には、assets_cを含むリンクが張られたimgタグを特定して、そこのファイル名から拡張子を調べて、それをリンクのファイル名にくっつけてあげればよさそうですが、すごく複雑な記述になりそうでしたので、画像リンクはほぼjpgだろう、とあたりをつけて、拡張子はjpgをくっつけて生成することにしました。

最終チェック段階で、gifやpngの拡張子は手直ししていきたいと思います。数はそんなに大量にないはずなので。

試しに100件ほどの記事を画面表示してみました。

いい感じです。

続けて、記事に出てくる画像を↑のimagesフォルダから、年/月のフォルダ下にimagesフォルダを生成して、そこにコピーをする仕組みも実装。
これで画像が月ごとに振り分けられるので、データの扱いもしやすくなります。やっぱり1ディレクトリに45000の画像を入れて運用するのは現実的じゃないので…(汗

月/日のフォルダにスババーーっとHTMLを書き出すプログラムも完成しました。同じ日にエントリーが複数回あった時の対処も実装(ファイル名の末尾に「-n」をつける)

あとは前ページのひな型を考えて作ったら、ページをずばばーーーっと自動生成させればブログは完成です。

そこを乗り切ってしまえば、あとは既存コンテンツのデザインリニューアルのみなので、ぐっと気持ちが楽になりそうです。

2021/12/31 ブログ復旧作業

昨日、無事に整形が終わったデータベースのファイル。

今日はそれを使ってHTMLソースを吐き出すようにプログラムを組みました。

問題は画像へのパス修正。

これまでのパスは、絶対パスでhttp://t-hoso.net/cgi/mt/assets_c/20xx/12/xxxx.jpgのような感じで保管されてました。

さすがにこれと同じディレクトリ構成で今後もやっていくのはちょっと嫌なので、blogディレクトリにimagesフォルダをつくり、一度そこに集約することに

ただ、画像ファイルだけで4万ファイル以上あるため、今後の運用のしやすさを考えると、少し整理は必要で、imagesフォルダ下に年/月でフォルダを作って運用することにしました。

例えば、今日のこの記事を後にブログに載せることになった場合…
http://t-hoso.net/blog/2021/12/20211231.html というページURLと、そこに使われる画像ファイルは
http://t-hoso.net/blog/2021/12/images/フォルダに入る感じです。

年フォルダと月フォルダ、そして中に入るhtmlファイルは、PHPでわりと簡単に生成できそうなので、いいとして(4500エントリーを一気に書き出した時のタイムアウトとかがちょっとだけ懸念ですが…)、問題は画像ファイル

とりあえず考えたのが、一度、あちこちに散らばってしまっている画像ファイルをすべてhttp://t-hoso.net/blog/images/にまとめてアップロードし、それをPHPでページ生成する過程で、関連した画像をすべて該当のimagesフォルダに移動させようという作戦

画像ファイルの移動はrename関数でできそうなので、それを使ってみようと思います。書き込み権限とかを間違えなければいけると思います。こちらも数が膨大なので、タイムアウトとかを気にして、件数を刻んで実行するかもしれません。

元旦~2日は実家に行くので、続きは3日に。

2021/12/30 ブログ復旧作業

昨日の続きでデータ整形です。

カンマを検索置換などで置き換えていましたが、やはり埒があかないのと、それによって二次三次でトラブルが起きそうでしたので、書き出し方を変更することに

phpmyadminからのエクスポートは、詳細書き出しをすれば区切り文字を指定できるので、タブを区切り文字に設定して、再度エクスポート

Excelでタブ区切りとして読み込むと、今度はうまくできました。

幸い、本文にもタブは含まれていないようで、崩れているレコードもなく4500件のレコードができあがりました。

不要なフィールドを削除。

  • entry_id
  • entry_text(本文)
  • entry_text_more(「続きを読む」の内容)
  • entry_title(タイトル)
  • entry_authored_on(日時)

だけを残しました。

ここであれ?と思ったのがカテゴリー。フィールドとして「entry_category_id」があるのですが、すべて「NULL」になっていてデータが入ってません。

なんでー?と思ってググったら、どうやら「mt_placement」というところで紐づいているらしい。ということで、こちらもエクスポート。

mt_placementには、カテゴリのIDとエントリーのIDで紐づけが行われているので、カテゴリーの名称が入っている「mt_category」もエクスポート

ここで書き出した「mt_entry(フィールド整形済み)」「mt_category」「mt_placement」をExcelの1つのBookにまとめ、vlookup関数を使って、カテゴリも追加をしました。

長年続けていたブログなので、カテゴリも勢いに任せて作ったものの、ほぼ機能していないものや、類似しているものがあったので、それらをまとめて、かなり数を減らしました。

ここまでで、できたファイルがこんな感じです

データを整形

これでかなりきれいに整形ができました。試しに簡単なPHPを書いて一緒にアップロードして読み込みテスト

書き出しテスト

やったー!ここまでくれば目前です。

あとはひとつだけ懸念があって、画像ファイルへのパス。

これがMTを使っていた時の絶対パスで記載されていて、今回は画像の保存場所もきちんとわかりやすく変更しますが、こればかりは一括で変換する方法はなさそうで…

正規表現を使えば、どうにかなりそう…??んーー、ここはちょっと考えなくちゃいけないところです

これを書いている時点ですでに大みそかに明け方になってしまったので、とりあえず寝ます

2021/12/29 ブログ復旧作業

MTは静的ページを生成するので、バックアップを取ったファイルの中には生成されたページもあります。

が、ディレクトリ構造がぐちゃぐちゃですし、不要なソースも多分に含まれるため、これを再利用するのは最終手段にすることにします。

漠然と考えているのが、DBから自分で静的ページを自動的に書き出していくプログラムを書くこと。

今回サーバー上のデータはすべて削除しましたが、DBはそのまま残してあるので、そのデータを流用すること。

PHPでのページ生成はやったことがあるので、なんとかなりそうです

まずはMTのテーブルを理解する必要があるため、サーバーにphpmyadminを入れて中を覗いてみます

もうほぼ覚えてないものの、私はどうやら2つDBを作っていたようで、片方は中身が文字化けしているおそらく失敗作(はじめはこっちでいろいろ作業して途方に暮れてました)。

もうひとつは文字化けしていないDB。こちらがちゃんと稼働してたものだと思います。

改めて自分に必要なデータを考えてみます。そんなに複雑なものにする必要はないので

  • 日時
  • タイトル
  • 本文(「続きを読む」の内容も含む)
  • カテゴリ

があれば十分です。

テーブル名からざっとあたりをつけて、「mt_entry」というテーブルにいきつきました。

この中の「entry_text」「entry_text_more」「entry_title」「entry_authored_on」が私の求めているものだと判明

なるべくシンプルな作業にしたいので、これらのファイルを一度csvでエクスポートしてローカルで整形することに。

CSVで書き出して、Excelで読み込み(ファイルをそのまま開くと文字化けするので、データの読み込みを使いました)

が!ここで問題発生。CSVだと本文中にちらほらとカンマを使っている場所があるようで(金額中のカンマとか、MTの画像のポップアップのjsコード内とか)、めちゃくちゃになっているレコードが……明日、もうちょっと考えてみます