冬言響 / 日記

アメコミとか映画とか音楽とか猫とか単車とか自転車とか革とか銀とかジーンズとかブーツとか今日喰ったものとか。

RSS2.0

PHP5

レンタルサーバーの PHP5 へのバージョンアップ準備が出来た様子なのでバージョンアップしてみんとす。

PHP4 だと 2008-12-01T11:46:07+09:00 みたいな文字列を strtotime に投げてもタイムスタンプに書き換えてくれなくて、最後の「+09:00」を除去する処理を入れてたのだけど、PHP5 だとちゃんと対応してるので早速その部分の処理を除去。

あとファイルの所有権がらみの扱いにも変化が生じてる様子。これまでスクリプトがサーバー上で生成したファイルは所有者もグループも「apache」になってたのだけど、PHP5 にしてからはユーザー名がそのまま所有者名になるようになった様子にて、「apache」のままのファイルはそのままでは書き込みとかが出来なくなってパーミッションエラー続出の巻。一通り直したと思うけどまだ漏れがあるかも知らん。PHP4 と 5 の違いとゆーより CGI 版? で動いてるからなのだろうか。その場合将来的にモジュール版? に移行? とかしたらまた修正が必要になるんだろうか。その辺は全く判らん。

まあおいおいと。

ちょっと調べた。やっぱバージョンによる違いではなくて CGI 版とモジュール版による違いの様子。CGI 版だとユーザー名になる、というよりもモジュール版だと「apache」になる、という言い方のが良いのか。CGI 版の仕様のが自然だよな。

モジュール版へ移行したらやはり修正作業が必要になるのだろうけど、サーバーのサポートページも見てみたら当面のところは移行の予定は無い様子。

頭痛が痛い

パブロン飲んで寝る。

(無題)

DVD『ドラゴン・キングダム』買い。なんだかんだで劇場では観られなかったのだけど、まあ悪いレビューは見かけんし、外れはなかろ、と購入。

とりあえず DTS 英語音声で鑑賞。良いんじゃないですかなかなか。『ネバーエンディングストーリー』で『西遊記』で『ベストキッド』で『グリーンデスティニー』でその他諸々のカンフー映画・武侠映画・中華ファンタジー映画で、みたいな。

最悪「アクションだけでストーリーは gdgd」映画だったりせんかという懸念もあったのだけど、蓋開けてみたら細かい小ネタあり、伏線とその回収もきっちりあり、みたいな。まさかあの人の正体があれだったなんて。名前も本人が名乗った訳じゃなくて場の勢いで付けられた渾名だもんなそういえば。途中まで「師匠が 2 人である必然性無いよなー。プロット的には 1 人で充分だよなー。でもそこであえてジャッキー/ジェットの競演っつーお祭り的な映画なんだよなー」とか思ってたけど浅はかでしたごめんなさい。

満を持しての J・J 競演としては充分な出来なのでわ、とかとか。

[Amazon]ドラゴン・キングダム

ライデイン

雨ー。天気予報では「弱雨」ってなってたから単車で出勤したのに、これはもう「強雨」っつーか「激雨」ですよ奥さん!

で、途中エラい近くに雷が落ちたぽい音がしたのでどこに落ちたのかと思ってたら、ウチの店に落ちてたぽいらしい。事務所(店舗の最上階にある)に居た書籍主任と経理さんが FAX 送りながらベランダ眺めてたら、そこにある避雷針? に落ちる決定的瞬間を見たとかなんとか。良いなあ。

停電とかはならなかったけど雨漏りはちょっとした。大丈夫か。

激寒

単車ジャケットのインナーはどこいったかなあ。

カップラーメン

の粉末スープとかやくは何故別々の袋なのか。一緒でええがん、と思うのだが。バイト先で色々皆と協議したところとりあえず

と、2 つの説が出た。

引き続き調査を続行する。

洗車

単車洗ってチェーンにオイル。寒い。でもこないだ雨ン中走っちゃったし、今日やらんとなあ。

Oh! 変

『魔術士オーフェン』の続編というか後日談が作者サイトで不定期連載されてるのは知ってたのだけど、なんとなく後でまとめ読みするかー、とか言って読んでなくて、それをおもむろに本日ぶんまでまとめ読み。登場人物名がすべて「あいつ」とか「こいつ」とか「そいつ」になってて、だいたい判るのだけどたまに判らんのがある。誰なのか、は判っても名前が出てこんのとか。

「好戦派の君らしくないな、とは思ってたんだ。言っておくと、トトカンタだって無傷じゃない」

 そいつの言葉に、そいつは了解の印に軽くうなずいた。

「港湾を破壊されたとか聞いたけど」

「もうおおむね復旧している。何故だか、この街は復旧作業に慣れてるんだ」

とか

「でも、一応誰かひとりくらい魔術士を連れて帰れないと、長老部の視線がね――あなた、モグリの魔術士に心当たりない?」

「そういえばありますけど……あれは魔術士だったのかな」

「魔術士かどうかなんて、曖昧になりようがないでしょ」

「それが、曖昧なんです。どのみちもう一年以上前にアーバンラマに帰ってしまったんで、行方は分かりませんが」

の辺りとかちょっと笑った。あとはついに無謀編と長編キャラの競演があったりとか。まあでも「あれ」は普通には出てこんだろうなあ。2008.11.07 の「船長」はやっぱ「あれ」なのかなあ。

んで、2008.11.19 辺りから中々興味深いことが書いてあって。本になる、かも知れないとのこと。まだまだポシャる可能性は充分にあるそうなのだけど是非とも実現して欲しい所存。メールで意見募集してたみたいだけど今更送ってもアレかな。

というか消滅してしまったけど富士見ファンタジア 20 周年記念で 10 くらいの完結済みシリーズの後日談を連続刊行とかいう企画があったそうで。それはそれでちょっとやってほしかったかも。懐古厨歓喜、みたいな。

さてさて。どーなるのかなー、と。

相対性理論


ラジオで聴いてちょっと気に入った。iTMS チェックしたらこの曲は無かったけどアルバムが 1 枚(ぶん)あったのでロクに試聴もせずに買い。

アルバムが来年出るのね。1 月 7 日。それに入ってる模様。iTMS で扱うかどうか知らんけど、これは CD 買っても良いかな。どうだろう。検討。

[Amazon]シフォン主義[Amazon]ハイファイ新書

買い物

高千穂遙+一本木蛮『じてんしゃ日記 2008』買い。よくある自転車エッセイ漫画というかなんというか。よくあるのかどうかも知らんが。前巻『じてんしゃ日記』はよく立ち読み(立ち読みかよ)してて、買おうかどうかまよってるうちに店から無くなってて、んでこの 2 巻目もしばらく迷ってたけど今日おもむろに「買うかー」と思って買い。前巻も一応探す。ブックオフとかでは…見つからんだろうなあ。

[Amazon]じてんしゃ日記 2008

個人情報を取り扱う業種としてのモラルが云々

幸満ちゃんが遺棄された現場近くのレンタルビデオ店では、店を利用する勝木容疑者が頻繁に見かけられていた。同店によると、好んで借りたのは、自室にもあった「聖闘士星矢」や「ポケットモンスター」シリーズのほか、「名探偵コナン」などのアニメ、「ゴジラ」や「仮面ライダー」など特撮もの。そのほか、「ハリー・ポッター」「ラスト・サムライ」など、ヒットした洋画も頻繁にレンタル。時代劇や仁侠(にんきよう)物を見るときもあった。CDを借りることも多く、コナンのテーマ曲集に加え、「モーニング娘。」や嵐などをレンタルしていたという。

なんでこの店平気で客の情報とかバラしてんの? 馬鹿なの?

何年か前に自分バイト先の割と近くで立てこもり事件があって(立てこもりブーム後期だったのでそれほど大きな扱いじゃなかったと思う。死人とかも出てないし)、それが解決した後「犯人が会員だったりしてないか、もしそうだったらどんなものを借りてたか」という問い合わせが TV 局とかからあっても答えちゃ駄目だヨ、という社内通達があったことがあった。それとも実際にそういう問い合わせがあったんだっけか? あんま覚えてねえや。

何にしろ例の無駄に面倒くさい法律を抜きにしても常識的に考えてあり得ない。

(無題)

壁にかけて鑑賞したり遊んだりできるチェス『Straight Up Chess』 | 100SHIKI.COM
ちょっと良いな。欲しいな。てか、作ってみたいな。久しぶりに木工もやってみたいなあ。

plus one(LCD-4300U)|センチュリー(CENTURY)
USB 接続の 4.3 インチモニタ。intel Mac 対応。ちょっと欲しい。使い道は得に思いつかないけど。

買い物

DVD『ダークナイト』買い。映画館で観たんだけどなんだかんだで日記に書き忘れてたな。単品の映画として観ればまあ大変よろしい出来かと。ヒース・レジャーの演技が云々とかいった文書は書けないので省略。

ただアメコミっぽさが相当薄れてて、もちろん作り手側はそのつもりで作ってんだろうけど、バットマンでやる必要はあったんかなあ、と。具体的に言うと「バットマン VS スーパーマン」をいつかやってくれるに違いないと信じてたのだけど(『スーパーマン』はブランドン・ラウス主演の続編はもう作らんらしいけど。でも改めて新 3 部作作るらしいけど)、或いはマーベルとか DC とか気にせずここ最近のアメコミ映画全部ひっくるめたお祭り的なクロスオーバーでも良いのだけど、とにかくそのテのことをやったとして、前作ならともかく今作のゴッサムシティにクラーク・ケントが来たりしても相当浮いちゃうなあ、とか。

どうでも良いけど DVD パッケージ裏面のあらすじ見てみると、登場人物の名前が太字になってるのにアルフレッドだけなってないのは何かのいじめですか。

[JPEG画像/47.5KB]

画像はレンタル用のものだけど、セル用もレイアウトは少々違うものの文面は同じ。

ちなみに BD(レンタル用)は途中まで DVD と同じ文面で後半が省略されてる具合だった。

[JPEG画像/53.1KB]

[Amazon]ダークナイト

(無題)

[JPEG画像/46.5KB]

未開封。『オーシャンズ 13』とか『ディパーテッド』とか 1 年以上経っちゃってるヨ…。

作品自体は劇場で観てるんで、所謂「積読」とは違うが。

(無題)

[JPEG画像/38.7KB]

積読。まあ全然大したこと無いね。つか統一性が無いな。

『煌夜祭』結局読んでねえのかよ、とか。『マッチメイク』初版 2003 年とか書いてあるんですけど、とか。何で買ったのかすら思い出せん。『ワルの知恵本』は人生色々損をしないためにはこのテの本も読んでおいた方が良いのかなあ、とか思って買ったのだけど、いざとなるといろいろ疲れるエピソードばっか載ってそうで読む気が失せてしまって。

『啓示空間』は、Amazon で「『ディアスポラ』とかを読んだ人にはこれもお勧め!」みたいな紹介されてたので買ってみたんだが、登場人物紹介を見て読む気が失せてしまった。

[JPEG画像/35.5KB]

何このラノベ。いや最初からそのつもりで買ってれば別に良いんだけど。うん、いや、まあ読むよ。読む。

買い物

大森しんや『恋ヶ窪★ワークス LTD +大森しんや短編集』。前に買った『恋ヶ窪★ワークス』の未発表読み切りとかその他短編とか。つか出てたの知らんかった。9 月だって。

単車を共通項として青春モノから SF からホラー? から作者の自伝的なものまで色々と。空気感が良いカンジ。

[Amazon]恋ヶ窪★ワークス LTD +大森しんや短編集

メモ

ファイルを配列に取り込んで 1 行ごとにゴニョゴニョやる場合に、

foreach(file("foo.txt") as $ent) {
	// ゴニョゴニョ。
	}

ということをしてサーバーにアップして動かしたら処理時間がエラいかかってしまった。ちなみに処理するファイルの数は 800 個ぐらい。ローカル環境では気になるほどでは無かった。

これやっぱループで $ent を取得する度にファイルを読みに行ってしまってんだろうか。ちゃんと

$foo = file("foo.txt");
foreach($foo as $ent) {
	// ゴニョゴニョ
	}

てな具合に配列に取り込んでから foreach にブチ込みましょう、という自分メモ。

配列名を考えるのがちょっと面倒だったときに「これこのまま file を丸ごと foreach にブチ込んでも動くんじゃね?」とか言ってやってみたら動いてしまったので以後多用してたのだけど(んでこれまでの使用箇所ではそんなに大量のファイルを処理したりはしなかったので処理時間とか気になるほどじゃなかった)、全部直した方が良いなこれは。

あっれいろいろ試してみたけど再現性が無いな。最初のとき 10 数秒単位で処理時間に差が出たんだが。丁度サーバーが別件で忙しかったとかなんだろうか。あとはファイルがキャッシュされてたり云々とか。

良く判んね。

続く

実験

昨日ぶんの続き。

まず以下のようなテキストファイルを用意。

1
2
3
4
5
6
7
8
9
0

内容は別になんだって良いのだけど 10 行の内容を持つテキストファイル。ちなみにたぶん関係は無いと思うけど文字コードは Shift-JIS で改行コードは LF。

んでこんな具合の PHP スクリプトを走らせてみんとす。

<?php
// 現在時刻。
echo(date("H:i:s", time()) . "<br />
");
echo("----<br />
");
// file をそのまま foreach にブチ込む。
foreach(file("test.txt") as $ent) {
	// キャッシュをクリア。
	clearstatcache();
	// $ent の内容と、その時点でのファイルの最終アクセス時刻を表示。
	echo($ent . " " . date("H:i:s", fileatime("test.txt")) . "<br />
");
	// 1 秒待つ。
	sleep(1);
	}
echo("----<br />
");
// 現在時刻。
echo(date("H:i:s", time()) . "<br />
");
?>

その結果。

20:49:11
----
1 20:49:11
2 20:49:11
3 20:49:11
4 20:49:11
5 20:49:11
6 20:49:11
7 20:49:11
8 20:49:11
9 20:49:11
0 20:49:11
----
20:49:21

cleastatcache の使い方とかがこれで正しいのか自信は無いけど、とりあえず foreach でループする度にいちいち元のファイルへアクセスしてるという事は無いように思える。じゃあやっぱ最初 file を foreach の引数に入れたら死ヌほど時間が掛かってそのあと一度配列に読み込んでからそれを foreach に入れるようにしたら解決したように思えたのはただの偶然か何かだったのだろうか。なんかその公算が強くなってきた気がする。

良く判んね。

ローカル環境でだけど「sleep を 10 秒ぐらいにして実行してその間に test.txt を削除する」という荒技を試してみたところ、削除した時点から fileatime がエラーになったけど $ent の内容たる「1」「2」「3」...はちゃんと出力された。依って「foreach の引数に直接 file を入れるとループが回る度にいちいち元のファイルを読みに行ってしまう」というのは否定された模様のこと。とりあえず何の解決にもなってないね。

愛でてよし、食べてよし

ファイアボール | ディズニー・チャンネル

外界から隔離された屋敷の中で、先代が残した書物で外界の事を学んでいるドロッセルと、その執事ゲデヒトニスの生活をおもしろおかしく描いたコメディ作品。

ディズニーで初の日本国内で製作されたテレビアニメ作品。フル3Dアニメであり、1話が約2分の短編アニメーション作品となる。この作品の制作は、2006年春の段階で声優のアフレコが既に行われ同年秋には放送できる状態で完成していた。

この作品は、テレビ放送の他にも公式サイトやyoutube等を利用しインターネットにて無料配信された、ディズニーとしては前例のない実験的な作品である。

聖書や荘子、銀河ヒッチハイク・ガイド、鉄人28号、オズの魔法使い、クラリネットこわしちゃった、山口さんちのツトム君、ハエ男の恐怖、スターウォーズ、マイケル・ジャクソンなど、幅広いジャンルからのパロディが多く散見される。

という訳でまあよくあると言えばよくある 3D CG ショートアニメ。公式サイトで何話か観られる他、ぶっちゃけ某ニコニコ動画で全話うpされてるとかされてないとか。『銀河ヒッチハイク・ガイド』ネタ経由で遭遇して、いっきにまとめて観てしまった。とかしてないとか。

DVD 出ねえかなあ。あと 2 期やんねえかなあ。

微熱が

あるので早退。今日一日ぐらい保つけど無理して明日とか明後日とか休む方がマズいので、という程度の。

帰りがツラかった。メチャメチャ天気良いのでこのままフラっと知多半島一周ツーとか行きたくなる気持ちを我慢するのが。

フリーザ

某所で「フリーザの最終形態の見た目からするとフリーザの一族は界王神の眷属。堕天使みたいなカンジで」という説をみかけた。ちょっとアリだと思った。

クレジット支払額確定

先月は Illustrator CS3 とか買っちゃったり他にもなんだかんだで支出があったのでちと多い。まあまだインストールしてねえけど。このまま CS7(って名前でそこまで続くのか知らんが)が出るまで未開封のままだったら軽くネタにはなるんだが。

普段通りに日常雑費捻出したりとかしてると貯金に回すぶんが残らなくなる。どーしたもんかなー。これからの 1 ヶ月を 5,000 円で凌ぐか、貯金を諦めて裕福に過ごすかの 2 択。さすがに 5,000 円はいろいろ無理だろうって気もするが、今のご時世少しでも貯蓄はしておいた方が良いだろうからあえて困難な道を行くも一興だろうか。何か他に買うものでもあれば開き直れるんだが。…手頃なフォールディングバイクとかを衝動買いでもしてみるか。

SimCity 2000

がやりたい。3000 でも 4 でもなくて。OS X でネイティブ動作するものって無いのかな。classic 用なら持ってるんだが、intel な Mac mini じゃ動かない。この際 Windows 版でも良いか。Parallels で動かせるだろ。

家中探せば 13 年ぐらい前に買ったのが出てくるかも知れない。FD 4 枚組のやつが。あれの無駄に分厚いマニュアルが、ゲームに直接関連すること以外にいろいろ謎の文章が書いてあって、また読みたいのだが見つからない。捨てちゃったかなー。

記憶屋キアヌ

『JM』のレンタル DVD が入荷。「レンタル用が出てるなら販売用も 1,500 円ぐらいでトールケース入りで出てるカモ! しかも今このタイミングで出るって事は『ニューロマンサー』の映画化が今回こそは実現するのカモ!!」と思って wktk しながら調べてみたところ、販売用は定価 1,980 円で出てたのだけど、

[Amazon]JM

『ニューロマンサー』云々じゃなくて『地球の静止する日』関連作キャンペーンとのことらしい。キアヌつながり。そっちかよー。

賞金稼ぎキアヌ

実写ハリウッド版『カウボーイビバップ』:アルファルファモザイク

だそうです。昨今の『ドラゴンボール』とかと比べると割と受け入れられてる気味。

ていうかアンタ『ニューロマンサー』やんなさいよ。

漢数字 to アラビア数字

二〇〇五年十一月って表記はおかしくないか?:アルファルファモザイク

一つの文章、一つのサイト、或いは一冊の本の中でルールが統一されてれば良いと思うよ、とかなんとか。基本的に〇?九の数字だけでアラビア数字と同じノリで表記しつつ、10?19 だけは「十」?「十九」のようにする、ってのは割とよくある流派だとは思うけど。

自分は漢数字で書く用事があったら基本的に〇?九の文字だけを使って 「二〇〇五年一一月」って書くかな。ルールはシンプルな方が良いから。でもあんま桁が多くなると識別がし難くなるから「万」とか「億」とかは使う。「一〇〇万円」とか「一億二〇〇〇万人」とかみたいに。

全部を〇?九の文字だけで表現してしまえば機械的な数値変換がラク。だが読み取りやすさを優先しようとすればある程度は他の漢字も使いたい。どうにか漢字交じりの表記でも機械的に数値変換出来んものか。「二〇五〇」でも「二千五十」でも同じように「2050」という値を得られんだろうか。

という訳で作ってみた。

  1. 〇以上の整数にのみ対応。小数とか負の数とかは知らん。
  2. 二〇千(=二万)のようなイレギュラーな表現には非対応。
  3. 「一億万」のような間違った表現にも非対応。どんな結果が出るかは知らん。
  4. おそらく探せばもっとシンプルでスマートで効率的なライブラリがいくらでも見つかるのだろうけど、ここは自分で考えてやってみる、てのが重要てことで一つ。

という訳ではじまりはじまりー、と。

function ksj2asj($strIn) {
// シングルバイト文字に置換。
foreach(array(
		"〇" => "0", "一" => "1", "二" => "2", "三" => "3",
		"四" => "4", "五" => "5", "六" => "6", "七" => "7",
		"八" => "8", "九" => "9", "十" => "A", "百" => "B",
		"千" => "C", "万" => "D", "億" => "E", "兆" => "F"
	) as $key => $value) {
	$strIn = mb_ereg_replace($key, $value, $strIn);
	}

シングルバイト文字の方が何かと都合が良いかと思うので変換してみんとす。〇?九はそのまま、「十」「百」「千」などの文字は A から順にアルファベットを割り当ててみる。とりあえず「兆」までだけどこのまま「無量大数」までいっても余裕がある。そんなデカい数値が扱えるのかどうかは知らんが。

仮に例えば「二億三百六万一〇四一」とかいう表記ルールに統一性の無い文字列が入力された場合、「2E3B6D1041」という文字列になる。

// 桁テーブル
$aryDigit = array(
	"A" => 10,
	"B" => 100,
	"C" => 1000,
	"D" => 10000,
	"E" => 100000000,
	"F" => 1000000000000
	);

それぞれのアルファベットが何桁かを表す配列。後で使う。

// 4桁ごとに区切って配列に格納する。
for($i = 0; $i < strlen($strIn); $i++) {
	$strTmp .= $strIn{$i};
	if(preg_match("/^[D-Z]$/", $strIn{$i})) {
		$aryTmp[] = $strTmp;
		$strTmp = "";
		}
	}
// 最後。万より下の位。
if($strTmp) {
	$aryTmp[] = $strTmp;
	}
// $strTmp を初期化。
$strTmp = "";

漢字文化圏の数字は 4 桁ごとに区切って数詞を付ける方式なので、「万」「億」「兆」…で区切って配列にする。具体的には文字列を 1 文字ずつ見ていって D 以降のアルファベットが出てきたらそこまでを 1 つの配列項目とする。

$strTmp は後で使うので初期化しておく。てか何かと変数名に「Tmp」使いすぎ >俺。

「2E3B6D1041」は「2E」「3B6D」「1041」の 3 つの要素を持つ配列になる。

foreach($aryTmp as $ent) {
	// 最後の 1 字が「D」以降のアルファベットである場合
	// 桁テーブルを参照して値を $intDigit に格納してから
	// その文字を除去する。
	if(preg_match("/[D-Z]$/", $ent)) {
		$intDigit = $aryDigit[substr($ent, strlen($ent) - 1, 1)];
		$ent = substr($ent, 0, strlen($ent) - 1);
		}
	// 最後の 1 字が「D」以降のアルファベットでない場合
	// (1?1000 の位である場合)
	// $intDigit に 1 を入れておく。
	else {
		$intDigit = 1;
		}

それぞれの配列要素は最大 4 桁の数値。それぞれ整数型に変換する。

最後の 1 字が万以上の桁を表すアルファベットであれば、それで先の桁テーブルを参照してその値を保持し、その字を削る。「2E」は「100000000(一億)」を保持して「2」に、「3B6D」は「10000(一万)」と「3B6」になる。「1041」はそのままで「1」を桁数として保持する。

	// 残った文字列を数値に変換する。
	// $ent を 1 文字ずつ見ていく。
	for($i = 0; $i < strlen($ent); $i++) {
		// 0?9 の数値であったら $strTmp に加える。
		if(preg_match("/^[0-9]$/", $ent{$i})) {
			$strTmp .= $ent{$i};
			}
		// A?C のいずれかの文字であったら
		// その文字で桁テーブルを参照して得られた値で
		// その時点での $strTmp を倍算して $intTmp に加算する。
		if(preg_match("/^[A-C]$/", $ent{$i})) {
			// この時点で $strTmp が空だったら「1」を入れておく。
			if(!$strTmp) {
				$strTmp = "1";
				}
			$intTmp += (int)$strTmp * $aryDigit[$ent{$i}];
			// $strTmp を初期化する。
			$strTmp = "";
			}
		// $ent の最後の文字まで来ていたら
		// 残った $strTmp を $intTmp に加算して
		// それをさらに $intDigit で倍算して $intReturn に加算する。
		if($i == strlen($ent) - 1) {
			$intTmp += (int)$strTmp;
			$intReturn += $intTmp * $intDigit;
			// $strTmp と $intTmp を初期化する。
			$strTmp = $intTmp = "";
			}
		}
	}
return $intReturn;
}

桁を表すアルファベットを除去した残りを最大 4 桁の数値に変換する。「2」は「2」のまま。「3B6」は 3 × 100 + 6 で「306」になる。「1041」は「1041」のまま。

それら数値を、先に保持した桁数で倍算して、$itnReturn に加算。2 × 1 億 + 306 × 1 万 + 1041 = 203061041。その数値を返す。

ksj2asj_test.php

もっとこう、正規表現とか使ってバシっと短くいけそうな気もするんだがとりあえず動いてるぽいから良いか。

pre 要素内のソースコードを色分けして出力する仕組みとか作ったので無駄に使ってみたかっただけだったりとかなんとか。

いずれ気が向いたら改良版を考えてみよう。

宇宙人キアヌ

「霞が関も壊して」橋下知事が“宇宙人”キアヌにお願い | IBTimes : エンターテインメント

ここ数日毎日のようにキアヌネタが。

アラビア数字 to 漢数字

逆パターンも作ってみた。

同じ値であっても漢数字で表現しようとすると複数のパターンがあり得る。まあそれで漢数字 to アラビア数字で手間が掛かってた訳なのだけど、とりあえず

Level A
〇?九の文字のみを使う。例:一二三四五六。
Level B
万、億、兆…の文字も使う。例:一二万三四五六。
Level C
十、百、千の字も使う。例:十二万三千四百五十六。

という分け方をして、第二引数でレベルを指定する関数、ということでやってみた。

function asj2ksj($strIn, $lv = "B") { // 第二引数省略時は Level B
if($lv != "A") {
	// -- ここから 2008-12-22 追記。
	// 小数点があった場合。
	if(preg_match("/./", $strIn)) {
		// 小数点以上と以下を切り分ける。
		list($strIn, $strDecimal) = split(".", $strIn);
		// 小数点以下の桁を表す文字テーブル。
		$aryDigitDecimal = array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x");
		// 間にアルファベットを挟んでいく。
		for($i = 0; $i < strlen($strDecimal); $i++) {
			$strTmp .= $strDecimal{$i} . $aryDigitDecimal[$i];
			}
		// 0 の後にアルファベットがある場合は削除して $strDecimal に入れる。
		$strDecimal = preg_replace("/0[a-z]/", "", $strTmp);
		// $strTmp を初期化。
		$strTmp = "";
		}
	// -- ここまで 2008-12-22 追記。
	// $strIn を 4 桁ごとに区切って配列に格納する。
	while(true) {
		// $strIn が 4 文字以下だったら $aryTmp に追加してループ終了。
		if(strlen($strIn) <= 4) {
			$aryTmp[] = $strIn;
			break;
			}
		// $strIn の末尾 4 字を $aryTmp に追加して、
		// さらにその 4 字ぶん $strIn を削る。
		$aryTmp[] = substr($strIn, strlen($strIn) - 4, 4);
		$strIn = substr($strIn, 0, strlen($strIn) - 4);
		}

漢数字 to アラビア数字のときに「十」「百」「千」…の文字に「A」「B」「C」…とアルファベットを振ったのと逆に、まずそれぞれの文字を表すアルファベットを適当な位置に置いてからまとめて漢数字に置換する。レベル A の場合はアラビア数字をそのまま漢数字に置換するだけなので以下の処理は行われない。

文字列を 4 桁ごとに区切って配列に格納する。for 文で $i を 4 ずつ加算なり減算なりして substr で 4 文字ずつ切り取ってきた方がスマートな気がするのだけどなんかややこしくなってきたのでこうなった。ループ内で元の文字列をガツガツ削る。4 字以下になったらループ終了。

入力値が 1230456789 という文字列であれば「12」「3045」「6789」という 3 つの要素を持つ配列になる。

	if($lv == "C") {
		// 桁を表す文字の配列。千なら「C」、百は「B」、十が「A」で一は空欄。
		$aryDidit = array("C", "B", "A", "");
		for($i = 0; $i < count($aryTmp); $i++) {
			// 配列要素が 4 文字より少ない場合は左側に「0」を加えて字数を揃える。
			$aryTmp[$i] = str_pad($aryTmp[$i], 4, "0", STR_PAD_REFT);
			for($j = 0; $j < 4; $j++) {
				// 配列要素の 1 字目、桁配列の 1 つ目("C")、2 字目、桁の 2 つ目("B")…
				// といった具合に文字を交互に並べて $strTmp に追加。
				$strTmp .= $aryTmp[$i]{$j} . $aryDidit[$j];
				}
			// 「1B(一百)」「1A(一十)」のようになった部分を「B」「A」のみに置換。
			$strTmp = str_replace(array("1A", "1B", "1C"), array("A", "B", "C"), $strTmp);
			// 「0A(〇百)」「1A(○十)」のようになった部分は削除。
			$strTmp = preg_replace("/0[A-C]/", "", $strTmp);
			// 末尾が「0」だったら削除。(2008-12-21 追記)
			$strTmp = preg_replace("/^(.+)0$/", "\1", $strTmp);
			// $strTmp を配列要素に置き換える。
			$aryTmp[$i] = $strTmp;
			// $strTmp を初期化。
			$strTmp = "";
			}
		}

レベル C の場合は「十」「百」「千」を加えるための処理を、配列要素のそれぞれに対して行う。

「12」のように 4 字より少ない場合は 0 を頭に足して字数を揃える。レベル C ではそもそも「〇」の字は使わないので後で除去される。とりあえず字数が揃ってた方が都合が良い。

「A」「B」「C」の字を配列要素の数字の間に挟む。「0012」は「0C0B1A2」に、「3045」は「3C0B4A5」、「6789」は「6C7B8A9」になる。

「十」「百」「千」は「一十」「一百」「一千」のようには表記しないので「1」の次に「A」「B」「C」のいずれかがある場合は「1」を削除する。「0C0B1A2」が「0C0BA2」になる。

「〇十」「〇百」「〇千」も無いので、こちらは「A」「B」「C」の文字ごと削除する。「0C0BA2」が「A2」に、「3C0B4A5」が「3C4A5」になる。

$strTmp を元の配列要素に代入してから初期化して終了。

	// $strIn を一度初期化。
	$strIn = "";
	// 桁を表す文字の配列。
	$aryDidit = array("", "D", "E", "F");
	// $aryTmp の配列要素に↑の文字を追加しながら繋いでいく。
	for($i = 0; $i < count($aryTmp); $i++) {
		// 配列要素左側の「0」を削除(2008-12-21 追記)。
		$aryTmp[$i] = preg_replace("/^0+(.*)$/", "\1", $aryTmp[$i]);
		// ↑結果として配列要素が空文字列になった場合は処理しない(2008-12-21 追記)
		if($aryTmp[$i]) {
			$strIn = $aryTmp[$i] . $aryDidit[$i] . $strIn;
			}
		}
	// 小数点以下の文字列がある場合はそれを接続(2008-12-22 追記)
	if($strDecimal) {
		$strIn .= "." . $strDecimal;
		}
	}

「万」「億」「兆」…用の文字を間に挟みながら配列要素を結合して、$strIn に入れる。レベル B の場合は「12E3045D6789」、レベル C は「A2E3C4A5D6C7B8A9」という文字列になる。

// $strIn の文字を漢字に置換する。
foreach(array(
	"0" => "〇", "1" => "一", "2" => "二", "3" => "三",
	"4" => "四", "5" => "五", "6" => "六", "7" => "七",
	"8" => "八", "9" => "九", "A" => "十", "B" => "百",
	"C" => "千", "D" => "万", "E" => "億", "F" => "兆",
	"G" => "京",
	// 配列のここ以下は 2008-12-22 追記。
	"." => "・", "a" => "分", "b" => "厘", "c" => "毛",
	"d" => "糸", "e" => "忽", "f" => "微", "g" => "繊",
	"h" => "沙", "i" => "塵", "j" => "埃", "k" => "渺",
	"l" => "漠", "m" => "模糊", "n" => "逡巡", "o" => "須臾",
	"p" => "瞬息", "q" => "弾指", "r" => "刹那", "s" => "六徳",
	"t" => "虚空", "u" => "清浄", "v" => "阿頼耶", "w" => "阿摩羅",
	"x" => "涅槃寂静") as $key => $value) {
	$strIn = str_replace($key, $value, $strIn);
	}
return $strIn;
}

レベル A と合流。漢数字 to アラビア数字のときと逆の配列を使って漢数字に置換する。シングルバイト文字からの置換なので str_replace でおk。

レベル A ならば「一二三四〇五六七八九」、レベル B では「一二億三四〇五万六七八九」、C なら「十二億三千四百五万六千七百八十九」という文字列が出力される。終了。

とりあえず昨日の ksj2asj2_test.php のページを asj2ksj 対応版にアップグレード。入力値が不正な場合は「error」が返されます、と。

あー、基本レベル B だけど「10」?「19」だけは「十」?「十九」のように表記する、というパターンを忘れてたな。作ってから気付いた。…まあそのうち。

次はローマ数字…かなあ。機種依存文字を使わずにアルファベットの「I」「V」「X」を使って表現している場合はまずどこからどこまでが 1 字なのかの判別からやらなきゃならさそうだから面倒そうだ。てかそもそもローマ数字の表記の仕方を完全には知らんのだよな。まずそこからか。

不足部分が見つかったのでいくつか追記。「5000000001」を入力したらレベル B で「五〇億〇〇〇〇万〇〇〇一」、レベル C で「五十〇億〇万一」とか出てしまった。

レベル C で配列要素の末尾が「0」だった場合は削除。「〇百」「〇十」を削除するのと目的は同じなのだけど「一」はもともと省略なので漏れてしまってた。

最後に配列要素を結合するとき、まず「0001」のような左側に 0 がある場合はそれを削除。「0000」だったりすれば全削除になる。レベル B のための処理。その結果として配列要素が空文字列になってたら「万」「億」「兆」…を挟む処理も省略。

小数対応した。詳細

琵琶湖=川

大きな河|コンセントの穴

なんと。琵琶湖マニア(いつからそんな肩書き名乗った)としては押さえておかねばならんな。

アラビア数字 to 漢数字 アップデート

アラビア数字から漢数字への変換を小数対応にしてみた。書き加えたのは、まず記事中 1 つ目のコード内の「if($lv != "A") {」の次から。レベル A では単純に並べるだけなので特に処理は増えない。

	// 小数点があった場合。
	if(preg_match("/./", $strIn)) {
		// 小数点以上と以下を切り分ける。
		list($strIn, $strDecimal) = split(".", $strIn);
		// 小数点以下の桁を表す文字テーブル。
		$aryDigitDecimal = array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x");
		// 間にアルファベットを挟んでいく。
		for($i = 0; $i < strlen($strDecimal); $i++) {
			$strTmp .= $strDecimal{$i} . $aryDigitDecimal[$i];
			}
		// 0 の後にアルファベットがある場合は削除して $strDecimal に入れる。
		$strDecimal = preg_replace("/0[a-z]/", "", $strTmp);
		// $strTmp を初期化。
		$strTmp = "";
		}

入力文字列内に「.」があったらそこから下を $strDecimal に入れて $strIn は小数点より前の部分だけにする。んで小文字で a、b、c…って具合の配列を作って 1 字ずつ間に挟んでいく。んで 0 の次にアルファベットが来てる部分を削除する。$strTmp を初期化。

次に 3 つ目のコードの最後の方。if($lv != "A") { のスコープを閉じる前に、

	// 小数点以下の文字列がある場合はそれを接続(2008-12-22 追記)
	if($strDecimal) {
		$strIn .= "." . $strDecimal;
		}

$strDecimal が存在してる場合は「.」を挟んで $strIn に戻す。

最後にアラビア数字・アルファベットを漢数字に変換するための配列に、小数点及びそれ以下の桁の文字を追加する。

foreach(array(
	// (略)
	"." => "・", "a" => "分", "b" => "厘", "c" => "毛",
	"d" => "糸", "e" => "忽", "f" => "微", "g" => "繊",
	"h" => "沙", "i" => "塵", "j" => "埃", "k" => "渺",
	"l" => "漠", "m" => "模糊", "n" => "逡巡", "o" => "須臾",
	"p" => "瞬息", "q" => "弾指", "r" => "刹那", "s" => "六徳",
	"t" => "虚空", "u" => "清浄", "v" => "阿頼耶", "w" => "阿摩羅",
	"x" => "涅槃寂静") as $key => $value) {

レベル A でも B でも C でも小数点としての「・」を間に挟んでるのだけどたぶん正しくはないんだよなこれ。Wikipedia によると間に単位を挟んで「二寸三分四厘」のように表記するらしいのだが単位が定められてない場合はどうするんだろう。

漢数字 to アラビア数字の小数対応はもうちょっと後。数値として扱ってると極端に大きな値の場合にオーバーフロー起こしたりしてしまうぽいので単純に文字列として接続していくやり方に書き直したいので、その後で。

あんま追記とかしてるとごちゃごちゃになってしまうな。いずれ別ページにまとめよう。

(無題)

痛いニュース(ノ∀`):「これがドラゴンボール?謝罪モノだ」 実写版「ドラゴンボール」に世界から酷評

どうしたもんかなあ。

この動画の制作に当たって制作者は各国の反応を調べたところ、発言の7割が批判だったという。

この辺ちょっと安心した。

まあ観ることは観るけどね。

(無題)

[JPEG画像/40KB]

揃った。

(無題)

Shift-JIS なんて嫌いだ。

(無題)

MD とか CD-R とかってだいたい 74 分と 80 分とで価格に多少の差があるけど、製造コストにもそんなに差があるもんなんだろうか。実のところ差は無いかあっても僅差で、即ち 74 分のものと同じコストで 80 分のものが造れて、でも長さが違うのだから販売価格設定に差があっても自然で、その差のぶんが丸々儲けになる、とかそんなカラクリなんじゃないかと勘ぐってみたりする今日この頃。

(無題)

みずしな孝之『けものとチャット[4]』買い。人間の新キャラ登場。なんかこう、人間キャラは固定のまま猫中心で動かしてくれた方が安心して読めるのだけど、マンネリ化を避けるためにはやはり少しずつでも人間レギュラーを増やす必要もあるのか、とかなんとか。

livedoor デイリー 4 コマ掲載ぶんも収録。

[Amazon]けものとチャット[4]

(無題)

あー、いつの間にか OS X の Spotlight が UTF-8 のテキストファイルに対応してんじゃんか。元々特に深い理由もなく Web 関連とか諸々のテキストとか UTF-8 で作ってたのが、Spotlight が Shift-JIS のテキストファイルにしか対応してないから Shift-JIS に移行してたんだよなー。これでこれからは心おきなく UTF-8 一本でやっていけるぜ。

まあ別に Spotlight 使ってないけどね。

追記。10.5 かららしい。遅ェよ俺。EUC-JP はまだらしい。どうでも良いね。

12 月の検索ワード

リファラの中から適当にいくつか抜粋してみんとす。リンク先はそのキーワードからリクエストされたページ。検索した人が求めてる情報があったかは知らない。

岡崎 無印良品 店員
何か嫌な目にでもあったん?
スカイクロラ レンタル
来年の 2 月 25 日からだよ。
レイナ 修羅
やっぱトキの村に居た方が安全だよね。
眼鏡 ナイロン糸 接着剤
自分で修理しようとか考えずに眼鏡屋さん持ってった方が早いと思うよ。
2万の買えるダウンジャケット
俺のは 6,800 円だったよ。
DVDハードコーティング 外し方
なんで外すねん。
安物ダウンジャケット
俺のは 6,800 円だったよ。

(無題)

本編ではごく少数を除いて全滅したみたいに明言されているのに番外編とかスピンオフとかだと生き残りがごろごろ出てくる点でジェダイとサイヤ人は似ている。