トップ 最新 追記

2009-03-04 [長年日記]

_ CakePHP 1.1 の Database を使う session の機能はおかしい

Configuration :: The Manual :: 1.1 Collection :: The Cookbook

世の CakePHP アプリのどの程度が 1.1 で動いていてどの程度が 1.2 で動いているのか知らないけど、1.1 は実際には default 以外の DB Config が使いものにならない。

/trunk/cake/1.1.x.x/cake/libs/session.php - CakePHP : The Rapid Development Framework for PHP - Trac

を読むと session は必ず default DB に書き込むように

ハードコードされている。

は?

config/database.php の意味全然ないじゃん。

仕方ないのでこんなものをでっち上げた。CakePHP 自身の config の切り換えの機能は無視した。

1.2 では問題なさげに見えるけど、1.1 はもうこのままなんじゃないかなぁ。Cake を推してる PHPer の人、こういうの気にしたことないのかしら。ぱっと調べた範囲ではこういう情報見ないから、そんなに有名な話でもないっぽい。てことはだ。

CakePHP 使いは default 以外の DB 使ってないんじゃないの?

1.1 は DB migration もテストも統合されてないし、けっこう微妙なんだなぁ。

Tags: PHP

2009-03-05 [長年日記]

_ Ruby の map がなぜ好きになったか

inject 厨ではないのでそこは無視。

以前は

vars = []
arr.each { |e|
  vars.push( なんらかの処理 )
}

みたいな形で新しい配列を作るのが自分的には当たり前だった。でも今は多くの場合で

vars = arr.map { |e|
  なんらかの処理
}

で書くようになってきている。これがなぜ好きかということを説明していて、ブロックの中の変数が減って*1好き、と言っていたんだけど、

なんか違う気がしてきた。

each はブロックの中と外で同じ変数をいじる、つまり副作用を基本にした処理なのがイヤなんだ。なるほど、そういう感覚になるんだな、これ。

……。副作用って言葉の使い方が合ってるかどうかは分かってません。ツッコミ待ってます。

ちなみに PHP の場合、メリットが分かっても array_map() はどうしても好きになれません。

Tags: Ruby

*1 この場合は vars がなくなる

_ Google の sitemaps 生成ツール

sitemap-generators - Google Code

Python 製。基本的にはサーバ上でダイレクトに実行することを想定しているが、URL リストを作成して手元の環境でも動作させることができる。更新 ping を送ろうとしていたので慌てて止めた。

できる sitemaps XML が Google 以外でも解釈してくれるのかどうかはよく分からない。

使い方はヘルプとか README とか読めば分かると思う。分かるまで読め。


2009-03-09 [長年日記]

_ Mix-in が分かった気になる

分かっていたこと

  • module のインスタンスは生成できない
  • module は class にいくつも include できる

分かっていなかったこと

  • module の include は結局多重継承みたいなもんである
  • module を include した class を継承することで単一継承の形を維持できる
  • is-a 関係ではないがメンバ変数やメソッドを共有したい場合はやはりあって、このときに include を便利に使える
    • ただ class 的には is-a ではないから module で include するんだけど、include してるかどうかは is_a?() でチェックできる。ここは理屈から言うとスッキリしない気もするけど実際には便利だと思う。

自分は Java 的な Interface ってコンパイル時にチェックが効くだけでコードの再利用ができないのがイケてないと思っているんだけど*1、module がまさに自分の欲しいものなのだとやっと理解できた気がする。

今までただの namespace 的なものとしてしか使ってなかったよ。

cf.

Tags: Ruby

*1 そもそもこの理解もあやしいです


2009-03-11 [長年日記]

_ AirMac Express が壊れた

ある朝、なんかちょっと緩んだかなと思って AirMac Express を刺し直してから出かけたのだけど、なんかどうもそれが原因だったのか、いきなり壊れてしまった。何度刺し直しても通電さえしないので、恐らく完全にいっちゃったんだろう。

これまで不調らしい不調は特になかったんだけどなぁ。

Tags: 日々

_ いろいろ使えるシンタックスハイライトツール

ふと思いついて、terminal で emacs を使わずに HTML や CSS を色づけして見たいなぁとツールを探したらこんなものを見つけた。

Highlight : code & syntax highlighting : by André Simon

  • 基本的にはファイルの拡張子から判別してくれる
  • パイプで渡しても大丈夫なように外からファイルの種類を指定可能
  • デフォルトでは HTML を生成する
  • もちろん terminal での色づけにも対応

HTML などを生成するツールから渡してやるとか、細かく使えそうな感じ。

Windows のパッケージまであってなかなか便利。


2009-03-13 [長年日記]

_ 人生初指圧

整体行ってきた。人生初整体。と思ったけど正確には接骨/指圧だった。

というわけでゴキゴキやられるでもなく、ぐいぐいマッサージされるでもなく、なんかあっためてちょっと触って様子を見て、あとなんか体操を教えてもらってきた。正味30分ほど。まぁ安いからいいんだけど、なんかちょっと拍子抜け。

ただ自分があえて言わなかった悪いところも指摘されたので、分かってるんだなぁと思う。続けて行けないとあんま意味ないんだろうけど、どうなるかな。

Tags: 日々

2009-03-16 [長年日記]

_ 携帯のアラームがまた無効に

もう何がなんだか。

とりあえず一ヶ月に一度くらいは電池パック抜きリセットしろってことか。

Tags: 日々

_ twitter が NHK BS『今日の世界』に

twitter 上でポツポツ話題になっていたのでネタとして献上できるように録画しながら見た。

  1. 半分近くは ABC 制作の番組の翻訳
    • なのでその部分は日本の事情とちょっと違う
  2. ピックアップされている日本人の使用例が iPhone と転職

2 についてはちょっとキャッチーに過ぎるかなという印象。

モバイルと相性がいいという話には同意するけど、現状日本の携帯と m.twitter.com は相性が良くない。これを解消するためには別途 twitter 系の別のサービスを使う必要があるのだが、その点には当然触れられていないわけで、「ケータイ」を十把一絡げで考えてしまう層には結構間違った印象を与えているような気がする。

もう一つの転職ネタはそういう特殊な会社があるということと、本当に twitter のおかげなのは間違いなく事実だけど、実際問題 twitter があるというだけでボーっとしてて転職できるわけではない。当たり前なんだけど、その当たり前の部分をきちんと押さえていたかというとちょっと疑問。

あとコメンテーターの話がむやみに難しい。正しいこと言ってるけど、あれで twitter を理解できる人は結局 twitter やってる人くらいじゃないかと思う。

まぁ時間も短いし仕方ないんだろうけど。

Tags: Twitter TV

2009-03-17 [長年日記]

_ svn 1.5 以降の --force は結構便利

Subversion を使っています。1.5 っていつの話だよ、とか言 わ な い の。

なんだかんだ仕事関係のコードは中央に集約できているとあれこれ自動化ができて助かっています。

なんだけど、すべてのファイルが svn 管理下に入っているかというといろいろ事情があってそうはなっていない。そこで working copy 上には svn 管理しているファイルと管理していないファイルが共存するという、ちょっとややこしい状態になっている。

これだけなら svn status -v で ? が出てきてうざいで済む話なんだけど、

ある時点からあるファイルをリポジトリに突っ込むことにする

ということがまま起きる。これはもう本当に起きるからしょうがない。

この場合、svn 1.4 までだと add をした working copy とは別の working copy で svn update したときにすでに同じ名前のファイルがあるよと怒られて update が止まってしまう問題があった。どうやって対処するか。

怒られたら手で消し、また update して怒られたら手で消す。

なにこのアナログな感じ。これが svn 1.5 以降では

svn update --force

一発で済む。ステキ。

あと今日こんなことした。

10:37:52 >#Twitter@t:wtnabe< find . -type l のつもりで type f で
xargs rm してた。集中してないな。
10:39:53 >#Twitter@t:wtnabe< .svn ぶっこわれた
10:43:06 >#Twitter@t:wtnabe< find . -name .svn | xargs rm -fr ; svn
co --force で復旧。

まぁ、普通はあんまりないと思うけど。

Tags: Subversion

2009-03-18 [長年日記]

_ 黄砂が怖いって話

何で見たか忘れた。

  • 黄砂はかなりの距離を飛んでいる
    • つまり中国の内陸部の砂が日本に届いている
  • 中国内陸部は場所によっては毒性の強い土壌になっている(農薬野菜とか産業廃棄物とか?)
  • 黄砂は花粉よりも粒子が細かいから結構体内に入っちゃう
  • 黄砂と花粉を同時に吸引すると単に花粉を吸引した場合よりも反応が強い

ということは黄砂バンバン飛んでる日本海側超ヤベーということか。車が汚い程度ならいいんだけど、身体に如実に影響があるとは認識してなかったなー。

今後は意識しよう。(ダメ管理職みたいなことを言う)

Tags: TV 日々

_ git config の上書き

分かってる人には当たり前なんだけどメモを残しておく。

git の設定ファイルは

~/.gitconfig

なんだけど、リポジトリにも

.git/config

ファイルがあって、ここに remote や branch といった情報が収まっている。普通はそれだけで十分なんだけど、リポジトリによってユーザーの情報を切り替えたい場合もあって、そのときはここに

[user]
  name  = ...
  email = ...

って書いてやると、~/.gitconfig の設定を上書きすることができる。ただしアクセスする人が複数いるリポジトリでやっちゃダメよ。

Tags: Git

2009-03-19 [長年日記]

_ PHP使いは正規表現についてだけ間違っているわけじゃない

簡易チェックですと本文に言い訳が書いてあってもダメなんだってことが分かってない。(文字が目立つ目立たないは関係ない。)簡易チェックで意味がありませんと title に書いてないと検索した人を間違った情報に呼び寄せちゃうからダメってことが分かってない。正しい情報のように呼び寄せちゃう段階でダメなの。

はっきり言うけど、文字の装飾でどうにかなると思っているなら Web が分かってないよ。

で、実は解決策は簡単で title を

正規表現を使ってメールアドレスかどうか調べるフリをする

にしとけば ok. これで正しい情報を求めている人は寄ってこない。正しい情報なんか求めてないからとにかく簡単に動くコードを見せろやという人はやはり寄ってくるだろう。でもそういう人は目的がそもそも違うんだからいいの。


というかメールアドレスチェックになぜみんなそんな必死だ。

メールアドレスをチェックするシーンというのはいくつかパターンがあるけど、大別して

  • ユーザーの入力したアドレスにちゃんとメールが届かないと困る場合
  • ユーザーの入力したアドレスが間違っていてメールが届かなくてもそれは自己責任て言っちゃえる場合

の二つに分かれる。

前者なら実際にメールを送信して confirm させればいいだけで、別に正規表現で正確に判別できる必要はない。文字列上のチェックでは正しいメールアドレスかどうかは判別できても、実在するかどうかは分からない。*1後者も同じで、メールが届いても届かなくてもいいんなら正確に判別できる必要がそもそもない。これが分かっていればバカな正規表現チェックなんかしない。

もう一つ、良心的で力の足りない開発者は正規表現を使った中途半端なチェックを「じゃあもうちょっと厳密にすればいいのかな」と浅はかに考えてしまう。こういう良心的で力の足りない開発者がいると

実在するメールアドレスを登録できない

というおかしな問題が起きる。実はこれがいちばんタチが悪い。

だから本当はこう指摘すべきなのだ。

メールアドレスを正規表現でチェックする手法そのものが間違いです。チェックできた気になるだけです。

と。

実際にはこんな簡単に割り切れないケースが出てくるのは百も承知よ。でもさ、バータリーがバータリーだって自覚できるようにリードしてあげるのが先輩の役目だろ? ダンコーガイやあっきーなが言いたいことはそういうことだよ。

なんでそういうことを思うかというと、

携帯電話会社仕様のメールアドレスチェック正規表現を JavaScript で作っているところが意外に多い

から。

これ、やめてね。迷惑だから。なんで迷惑なのかはもう上に書いてある。読んで分からなかったら Web 開発やめよう。それがみんなの幸せだ。

Tags: Web PHP Mail

*1 もちろん confirm の仕組みを用意するのは単なる正規表現チェックよりも面倒くさい。


2009-03-20 [長年日記]

_ svn switch による部分 branch はやめよう

意味の分からない人もいるかもしれないのでまずは svn switch が何ものなのかという話から。

help を見てみよう。

$ svn help switch
switch (sw): Update the working copy to a different URL.
usage: 1. switch URL[@PEGREV] [PATH]
       2. switch --relocate FROM TO [PATH...]
...

これは基本的に working copy の branch, trunk などを切り替えるために使う。CVS 時代には update 時に revision ではなく tag を指定することで branch を切り替えるという方法しかなかった*1のだが、svn では明示的にリポジトリの中の URL を指定して switch するという、update とは別の branch 切り替え用の操作が導入された。それが svn switch である。

svn switch は指定した repository 上の特定のパスと working copy 上の特定のパス(あるいはカレントディレクトリ)を結びつけて動作する。

実はこれ、ディレクトリツリーの一部だけ別な branch にするという操作が可能なのだ。

何を大げさなと思うかもしれないけど、改めて考えるとディレクトリツリーの一部だけが別なストリームに属している状態というのはとても奇妙である。

.
|-- bin
|-- lib
|-- templates
|   |-- bin
|   `-- lib     <--
`-- test
    `-- script   <--
        `-- foo

<-- の部分だけ別 branch なんてことが可能

いや、実は自分も昔、ディレクトリツリーの一部だけ branch に入れたいなーとよく思っていた。これを思ったのはそもそもまともにモジュール化されていない巨大な repository を Subversion + Trac に移行した直後からしばらくの間。何しろでかいのであまり cp したくないし、CVS の時代には branch や tag などの情報はツリーに対してではなく個々のファイルに属していたので、一部のファイルだけ branch を切るということが実際によく行われていた。*2

当時はこれで妥当だと思ってた。branch 上の作業に必要のないファイルを除外して最小セットで編集できた方がディスクスペース的にも効率がいいし、repository <-> working copy 間の転送量も減るから速いし、後から ViewCVS などで見直したときにも余計な情報が目に入ってこなくて嬉しいと。

でもいま考えるとテストの自動化などをしようとしたときにうまくないよね、これ。ツリーの特定の一部だけ違う branch なんてことが許されたら、どこがどの branch か分からなくなっちゃう。言い直すとどういう状態がその branch を動作させるのに適切な状態か分からない。

branch なんだから自動化できなくていいんじゃない?と思うかもしれない。そうか、でも考えてみてほしい。

自動化できないということは実は人間の作業的にも優しくないのだ。

ツリーのどことどこを switch したら開発が始められるのかをどこかに書いておかないと、その branch で作業を始められない。これは厳しい。本当に厳しいよ。branch がツリー全体を含んでいてくれれば何も考える必要がない。svn switch あるいは svn co 一発で済む。なんて快適!

実は。

svn では一部だけ別 branch にするのは案外面倒くさい。普通に svn cp すると指定パス以下全部 cp されるようになっている。一部だけ別 branch の状態を作るには強い意志を持ってとても面倒くさくて慎重な copy 作業が必要なのだ。でもすべてのプログラマが怠惰という美徳を身につけているわけではない。CVS 時代のバッドなノウハウを頑なに維持しようとする勤勉な人だっているのだ*3

なぜ分散SCMが大流行している2009年になって CVS 時代を振り返りながら Subversion の話なんかしているんだとお前は、と思うかもしれない。しかし今回の問題は自分の中でもあまり明確になっていなくて、

なんとなく自分のノウハウが変わっていった

状態だった。これはいけない。明確にしておかないといけない。丸ごと別 branch にしなさいと。これを痛感した理由は

せっかくの setup 用のツールが branch から外れてて開発開始までの行程が全部手作業になってめちゃくちゃ面倒だった

からだ。

恐ろしいだろう? でも実際にあった話なんだぜ。手作業が面倒だから自動化するツールを repository に突っ込んであるのにそれがなくなっちゃってるんだ。しかも善意のおかげで。でもその勤勉さが自分以外のみんな*4にも勤勉な作業を強制しているんだってことが分からなきゃダメだよ。でないと君を手助けすることだってできやしない。

しかもだ。

元に(例えばツリー全体を trunk に)戻すのも大変だ。

どことどこが別 branch になっているか覚えているかい?

もう一度書く。丸ごと別 branch に入れろ。それが遅くてたまらない場合はもうその repository が根本的に間違ってるか repository への接続方法など周辺の要因か Subversion の限界だ。

[追記] とりあえず working copy の状態をチェックする方法を思いついた。

Twitter / wtnabe: 魔の svn switch に対抗できるかもしれない ...

find . -type d -a ! -regex '.*\.svn.*' -exec svn info {} \; | grep URL

ってやったら各ディレクトリがどの URL と結びついているかはチェックできる。これで trunk に commit したつもりが閉じたはずの branch に commit してた、なんて事故を防げる。

[追記] ツッコミいただいた。こっちの方が簡単。

svn stat | awk '$1 == "S"'

svn stat は -v があってもなくても一緒。これはいいな。ぐっと楽になった。

Tags: Subversion

*1 そもそもこの段階で用語がねじれてるところが CVS の弱点ではある。

*2 ViewCVS で branch を切り替えるとリストアップされるファイルの数が変わるオープンソースプロジェクトもたくさんあった。

*3 当然よかれと思ってやっている。先に上げたようにディスクスペースや転送速度の節約などだ。実際、Subversion の branch 切り替えは、ファイルの量や様々な要因が絡むけどあまり速いものではない。

*4 もちろんこれを書いているオレを含む!

本日のツッコミ(全5件) [ツッコミを入れる]

_ TA-29 [言えてますね、私も実験するときは半端に切り出して /branch下がしっちゃかめっちゃかになってました、反省]

_ デフォルトの名無しさん [> [追記] とりあえず working copy の状態をチェックする方法を思いついた。 これは svn s..]

_ wtnabe [svn info じゃないと working copy と repository の対応は分からなくないですか? r..]

_ デフォルトの名無しさん [URL まで知るには info が要りますが、切り替えられてるか どうかを知るだけなら svn status や ..]

_ wtnabe [いやチェックするだけなら URL は要らないです。なるほど確かに svn stat でとりあえず自分の欲しい情報は取..]


2009-03-21 [長年日記]

_ PHPのメソッド呼び出しと配列アクセスの小ネタ

(これも3月19日のネタ)

いや、たいしたネタじゃないんだけどいつも忘れてガッカリするので。

以下のコードを用意したとする。

class Sample {
  function obj() {
    return $this;
  }

  function arr() {
    return array( 'a', 'b', 'c' );
  }
}

$obj = new Sample();

これに対する操作で PHP 4 と 5 でできることが異なる。

PHP 4PHP 5
$obj->obj()->arr()×

PHP 5 ではいわゆる fluent interface っぽく書ける。これ、知らなかった。うまく使えば PHP でもそれなりに気持ちのいいコードが書けそうだ。

ただし JavaScript や Ruby の好きな自分としては

new Sample()->obj()

とは書けないとか、

$obj->arr()[1]

とは書けないとか、まだまだ不満は大きいんだけど*1

Tags: PHP

*1 後者は http://gist.github.com/69448 こういうツールを用意しておくとだいぶマシ。


2009-03-25 [長年日記]

_ 健康診断の再診をした

健康診断の大腸検査で引っかかった。というわけで再診。何をするかというと大腸の中身を空っぽにしてカメラで確認する。

……。マジです。

結論から言うとなんともなかったんだけど、まずは中身を空っぽにするための下剤がまずい。微妙に塩味と苦みのある液体を2時間掛けて2リットル飲む。1時間ほどが経過した辺りから下剤が効き始めて2時間半後くらいにはもうその飲んだ水くらいしか出ないようになる。ヒー。書いてるだけでもつらい。

個人的にはしかしこの下剤が合わなくて、飲むと気持ち悪くなるのがつらかった。吐くほどではないので愚痴以外は言わずに飲みきったけど、基本的に薬が飲み慣れていないせいか、結構しんどい。そしてその間、じっとしていればいいわけではなく、内臓の動きを刺激するためなのか、多少身体を動かしてくださいと言われる。廊下歩いたり階段を上ったり下りたり。こっちは気持ち悪いんだってば。

もう一つ。カメラが本当に痛いのは入り口ではない。コーナーの内壁にぶつかったとき。検査中は実は軽く全身麻酔が入っててよく覚えてないんだけど、この内壁にぶつかったときに痛い痛いと暴れたらしく、3人掛かりで抑え込んだらしい。すいません。だって身体の中が痛いんだぜ。どうしろっていうのさ*1

Tags: 日々

*1 痛みが強く出るかどうかは個人差があるらしい。オレは強く出る方だったのかな。


2009-03-26 [長年日記]

_ Windows NAS の acl 情報の一部が急に吹っ飛んだ

なんかアクセスできるはずのフォルダに入れないという報告がちらほら。

なんだべなと思うとアクセス権限を付与したはずのグループ名が消えている。なんだこれ。いつ消えたのかもよく分からないし、イベントを見る限りは何かトラブルが起きた形跡も見つからないなぁ。

結局、手でちまちま直したけど、なーんだろね、これ。

Windows の管理って難しいよね。

Tags: Win Sysadmin

2009-03-31 [長年日記]

_ googlemap って window.onload に貼る必要があったのか

googlemap を初めて貼ってみた。

javascript 部分を他のコードからパクってきたんだけど、どうしてわざわざ window.onload*1 でコードを動かしてるのかよく分からなかったのでその場で実行されるように書き換えてみた。

IEでだけ表示が乱れたorz

IE の場合は途中で DOM オブジェクトに操作を加えてしまったものがその場で確定してしまうみたい。最終的なレイアウトで位置が変わることもない。

結果としては IE でだけ見当外れな場所に地図が表示されていることになって、一部だけ見えるような状態になる。これでは使えない。

なるほどなー。難しい。

Tags: Google Web

*1