shigechi-64's diary

自由・自主・自立・自尊

IceweaselにFlashプラグインをインストール

Debian GNU/Linux5.0(Lenny)上のIceweaselFlashプラグインのインストールを試みる。

Adobeから落としてきたアーカイブを展開するとインストーラシェルスクリプト(flashplayer-installer)とライブラリ本体(libflashplayer.so)の2つのファイルが含まれている。普通にインストーラを使えば良さそうだけど、途中のディレクトリを指定するところから先へどうしても進まない。

“Please enter the installation path of the Mozilla, Netscape, or Opera browser (i.e., /usr/lib/mozilla): ”

確かに/usr/lib/mozillaというディレクトリは存在するんだけど、どういう指定の仕方をしても弾かれる。いろいろ調べた結果、要はコピーすればいいのかなと思い、/usr/lib/mozilla/plugins/の下にlibflashplayer.soをコピーしてIceweaselを再起動したら普通にニコニコ動画とかは視聴できた。

インストーラスクリプトをざっと眺めると、ファイルをコピーして、あと何かよくわからんファイルを削除して、パーミッションを755に変更してというようなことをやってるみたい。パーミッションは元から755になってたので特にいじらなかった。

微妙に釈然としないけど、とりあえずニコニコ動画は見れるようになったのでまあいいかな。

PluginDoc: Linux (x86)

少年探偵シリーズ復刻

なんと知らない間に文庫化されていました。しかも装丁が昔のままでいい感じです。これは全46巻復刻してほしいですね。

([え]2-1) 怪人二十面相 江戸川乱歩・少年探偵1 (ポプラ文庫クラシック)

([え]2-1) 怪人二十面相 江戸川乱歩・少年探偵1 (ポプラ文庫クラシック)

元々の1巻〜26巻と27巻〜46巻は、別ものだったのをポプラ社がまとめてシリーズ化して出版したようです。26巻までは小学生向けで人を殺したりとかの描写もないけど、27巻以降はその限りではないということのようです。確かに1巻〜26巻と27巻〜46巻では雰囲気が全然違います。
僕が小学生のころ初めて読んだのは確か32巻「地獄の仮面」。これは「吸血鬼」の少年向けリライトらしいです。話は全然覚えてませんが、カバー紙と挿絵の強烈さにガツンとやられました。怖かったなぁ。Wikipediaであらすじを調べてみたらもう一度読んでみたくなりました。

吸血鬼 (江戸川乱歩) - Wikipedia

いつも図書館で借りて読んでいましたが「赤い妖虫」とか「妖怪博士」など何冊かは家にあって繰り返し読んでました。

妖虫 - Wikipedia

この「赤い妖虫」クライマックスの挿絵はトラウマで、ページを開いた瞬間ぎょっとしてフリーズしたのを今でも覚えてます。挿絵とかもちゃんと再現されているのでしょうか?ビジュアルの印象はやはり強烈です。このシリーズ、魅力の半分くらいはカバー絵じゃないでしょうか。子供の頃、表紙が怖すぎて表を向けて放置できなかった記憶があります。

↓表紙絵ギャラリーがありました。

おお、そうそう、こんなんでしたw懐かしいなぁ。

この表紙だけでそこそこな破壊力なんですが、中の挿絵も負けていません。子供心に見てはいけないものを見てしまったという感じでした。27巻以降はもともと大人向けのものをリライトしてるのでトラウマ候補満載です。「地獄の仮面」もついでに。

リアルすぎる「唇のない怪人」。この柳瀬茂って画伯、天才でしょうか。
子供のころに一度通読しただけで、印象的なシーン以外はほとんど覚えてないのでまた最初からちゃんと読んでみたいです。

EOFの怪

Windowsコマンドプロンプトから使えるコマンドでcopyというのがあります。その名の通りファイルをコピーするためのコマンドです。基本的な書式は、例えば

copy a.txt b.txt

とするとa.txtをb.txtという名前でコピーします。
2個のファイルをくっつけて新しいファイルに書き出すこともできます。その場合次のように実行します。

copy a.txt+b.txt c.txt

こうすると例えばa.txtの中身が

aaa
aaa

で、b.txtの中身が

bbb
bbb

だった場合、c.txtの中身は

aaa
aaa
bbb
bbb

となります。
ただ、このcopyコマンドには変な(?)仕様があります。それは「2個のファイルを結合して生成したファイルの末尾にはEOF(EndOfFile)が付加される」というものです。実験してみましょう。
まず上記のやり方でa.txtとb.txtを結合してc.txtを作ります。そしてそのc.txtをテキストエディタで開いてみます。

赤い矢印の部分が付加されたEOFです。ただの半角スペースに見えますが実際はそうではありません。黒地に青で[EOF]と表示されているのはエディタの機能による表示で、copyコマンドによって付加されたEOFとは違います。念のためバイナリデータを見てみることにします。

赤い矢印の部分にEOFのコード1Aが付加されています。ちなみに61はアルファベットのa、62はb、0Dと0Aが改行です(Windows系OSの場合)。
なぜこんなものが付加されるのかというのは、どうもMS-DOS以前からの名残りのようです。ファイルの終端を明示的に示す必要があって付けていたものが事情によって残されているみたいです。ソフトウェア資産の互換性の為とかそういうことでしょうか。
さて、このEOFですがつけていてもあまりいいことはなさそうなのでこれを付加させずにファイル同士を結合する方法です。方法は簡単で、copyの際に/b(バイナリモード)オプションをつけて実行します。

copy /b a.txt+b.txt c.txt

EOFが付加されません。バイナリものぞいてみます。

大丈夫みたいです。
特に理由もないけど昔からの慣習とか今さら変えられないとかそういうことって他にもいろいろあるんだろうなぁと思いました。

ブラウザの更新ボタンとPOSTによる処理を区別したい

tableをPHPスクリプトで生成するとします。 

各行のデータはCSVで別ファイルに格納されており、ページを表示する際にそれを読み込んできて、1レコードにつき1行を生成していきます。各行の最後にはチェックボックスが付加され、削除ボタンを押すことでチェックした行を削除することができるものとします。tableは以下のようなイメージです。

 column1column2column3 
record1hogepiyofoo
record2hogepiyofoo
record3hogepiyofoo

各行のcheckboxには生成の際に連番が付与されています。削除ボタンが押されたときはその連番をスクリプト自身にPOSTし、スクリプト内の削除処理に渡します。それに基づき削除処理は該当レコードを元のCSVから削除します。その後再描画されたtableでは削除されたレコードが消えているということになります。

連番は上から順番に0、1、2・・・という具合に付与されています。例えば上記のrecord2に付与された連番は1です。record2にチェックを入れて削除ボタンを押した場合、削除処理には「連番1のレコードを削除してくれ」と処理を依頼することになります。処理後のtableは以下のようになりますね。

 column1column2column3 
record1hogepiyofoo
record3hogepiyofoo

この状態になるとrecord1が連番0、record3が連番1ということになります。

ところで、ブラウザには更新ボタンがあります。ブラウザの更新ボタンを押した場合、直前に行ったHTTPメソッドが再度実行されます。あるページをGETで取得していた場合、更新ボタンを押すともう一度そのページがGETメソッドで取得されます。これはPOSTでも同じで、あるページでPOSTメソッドを実行した場合、更新ボタンを押すと再度同じ内容のPOSTメソッドが実行されます。当然リクエストボディのデータも送信されることになります。

ここで2番目に表示したtableに目を向けます。前述のとおり真ん中のrecord2が削除されているのでrecord1が連番0、record3が連番1になっています。この状態でブラウザの更新ボタンを押すとどうなるでしょうか。

そう、先ほどのPOSTで行った「連番1のレコードを削除してくれ」という処理が再度行われることになります。レコードにチェックもしていないし、削除ボタンも押していないのに連番1をもつrecord3が削除されてしまいます。これは挙動として非常に問題があります。

この問題を回避するために、header関数を使用してみました。header関数は生のHTTPヘッダを送信するための関数です。
PHP: header - Manual
この関数による自分自身へのリダイレクトを処理の最後に挿入します。

if( $_POST["delete"] ){
  //処理
  ・
  ・
  ・
  header("Location: {$_SERVER['PHP_SELF']}");
  exit;
}

簡単にいうと「POSTされてきた時に元データへの処理はするが、最終的にはGETを行う」という感じでしょうか。これによって更新ボタンが押されたときもそのページをGETしてくるだけなので、前述のような問題は起こりません。削除ボタンが押された場合はもちろん処理が行われたあと、自分自身を表示するので、この例でいうとちゃんと削除したい行が消えている、ということになります。

注意点としてはマニュアルにも記載がありますが、header関数より前に何らかの出力をしているとエラーになります。デバッグのためのechoなんかも当然引っかかってしまいますので注意が必要です。

と、ここまで書いてきて何なんですが、いまいちこのheader関数の使い方がよくわかりません。一応目的は達成できてるんですが、ほんとにこういう使い方なのか?と思わないでもないし、そもそも問題となっている件に関してももっといいやり方があるような気がしてなりません。が、とりあえずうまく動いているようなのでまあいいや、ということにしておきます。

複数ファイルの中の特定の語句を一発で置換する

Rubyの便利なワンライナー

$ruby -i.bak -pe 'gsub "foo", "bar"' *.html *.php *.css

実行すると引数で指定されたファイル内の"foo"という文字列を全て"bar"に置換する。元ファイルは.bakをつけて保存される。
-iオプションは、引数で指定されたファイルの内容を置き換える(in-place edit)。元ファイルは拡張子をつけた形で保存される。拡張子がなければバックアップは行われず、破壊的な変更を行う。
-pオプションをつけると、プログラム全体が下記のようなブロックで囲まれたように動作する。また、各ループの最後に$_(組み込み変数。最後にgetsまたはreadlineで読み込んだ文字列を格納する)の値を出力する。

while gets
  #do something
end

-eオプションは、コマンドラインからファイル名によらずスクリプトを指定する。

騎兵第一旅団凱旋歌(秋山好古)

司馬遼太郎の小説「坂の上の雲」の主人公の一人、秋山好古(あきやまよしふる)が、作った歌がなんとなく好きなので掲載してみます。

この歌は、日露戦争が終わってさあ日本へ帰るぞというときに、共に戦った配下の将兵に対する訓示として作られたといいます。卒業式での校長先生の式辞、みたいな感じでしょうか。単なる挨拶にとどまらず、五七調の軽妙なリズムのなかにメッセージが込められていて、洒脱な印象を受けます。昔の偉い人は必ずといっていいほど漢文の素養があったので、こういう歌がさほど苦労せずに作れたんでしょうか。それにしてもセンスがあるなと思います。

実際に何巻に出てきたかちょっと忘れてしまいましたが・・・

我が親愛の戦友よ 振古未曾有の日露戦
生死を共に曲家店 得利寺 蓋平 大石橋
遼陽 沙河に沈旦堡 奉天 鉄嶺乗り越えて
開原 昌図 鴜鷺樹戦
大小数十の戦いに 一度の敗を取らずして
平和克復ここに成り 数日の後は汝らと
親しき故郷へ帰るらん

(中略)

別れに臨んで教え草 先づ筆取りて概略を
自労自活は天の道 卑しむべきは無為徒食 一夫一婦は人道ぞ
酒色の欲を戒めて 品性修養怠るな
日が暮れたなら天を見よ 常に動かぬ北斗星

坂の上の雲 <新装版> 1

坂の上の雲 <新装版> 1

WordPressとかtDiaryを使ってみたけど、結局はてダに戻ってきた

プラグインのバージョン管理とかSPAMコメント対応とか諸々めんどくさかったので戻ってきました。

いろいろカスタマイズできるのは楽しいところなんですが、まあ普通に日々のログが残せればそれでいいかなと。

時間を投下するポイントは意識して選定しないといけないので、結局はてなダイアリーに戻ってくることにしました。