退職します

このまえ現在の職場で退職の希望を伝え、受理されました。今後もプログラマとして生きていく予定です。次の職場もほぼ決まり、7/23までが引き継ぎで、その後有休消化→8/15までの在籍となる感じです。

仕事では主にPHPを使っていたんですが、今後はRubyを沢山書けるといいなーと思っています。Rubyに心を奪われるきっかけになったのはPHPCon2008の「激論!PHPの次に学ぶ言語はこれだ」でした。
日本 PHP ユーザ会 (Japan PHP Users Group) :: メイン :: PHPカンファレンス2008 - プログラム概要
その後くらいからTwitter経由でいろんな突発オフみたいなのに参加して面白い人に沢山出会えたり、何かの流れでLL Futureに行けたり、最近では、Asakusa.rb に行ってみたはいいが自分の力に絶望したりと、色々ありました。
今の職場はそれなりに居心地がよくて結構なパラダイスです。が、だからこそ色々な面で力不足なぼくが許されてしまう環境になっていて、「このままではいろいろとだめだなー」という不安が積もり積もった結果こうなりました。もしかするとあえて茨の道を行くような感じになるのかもしれないのですが、それはそれで楽しみな感じです。

謝辞
  1. 付け焼き刃でしかないぼくのプログラマとしてのスキルを頼りにしてくれた同僚の人たち
  2. 顧客折衝とか見積りの仕方とか、スケジュールの引き方とか大人のマナーとか色々教えてくれた相原さん
  3. 当時はがたがたのHTMLを書くので精一杯でしかも面接に遅刻したぼくを即日採用してくれた社長の入江さん
求人

自分が退職する会社へのエントリーを募集するのも何だかヘンな感じがしますが、(株)アイ・エンターは現在プログラマを激しく募集しているので、職を探している方がいらしたら連絡ください。PHPとかObjective-Cな方歓迎とのこと。

rvmでruby-1.9.2-headを試そうとした

うまくインストールできなかった

1.9.3dev が入ってしまう。ので後で詳しく調べます。何かご存知の方教えてください。→解決しました。

hibariya@HIBARIYA% rvm install 1.9.2-head 
Installing Ruby from source to: /home/hibariya/.rvm/rubies/ruby-1.9.2-head
Running autoconf
...

hibariya@HIBARIYA% rvm list

   ruby-1.9.2-head [ i386 ]
   ruby-head [ i386 ]
   system [ ]

hibariya@HIBARIYA% rvm use ruby-1.9.2-head

Now using ruby 1.9.2 head

hibariya@HIBARIYA% which ruby
/home/hibariya/.rvm/rubies/ruby-1.9.2-head/bin/ruby
hibariya@HIBARIYA% ruby --version
ruby 1.9.3dev (2010-07-08 trunk 28574) [i686-linux]

原因と解決方法

結論から書くと、

hibariya@HIBARIYA% rvm update

と、rvmのバージョンを上げたら解決しました(0.1.11 -> 0.1.40)*1

どうやら1.9.2-headを入れたつもりがruby-headを入れたことになっていた、みたい。
バージョンが低いせいなのか単に僕がぶっこわしてしまっていたのか分かりませんが(複数の環境で起きたので前者じゃないかなーと思ってます)、とにかくバージョンを上げる前は rvm install 1.9.2-head などとしていても問答無用で先っちょ(今現在だと1.9.3)がインストールされていたようです。

rvmのバージョンを上げる前
hibariya@HIBARIYA% cat ~/.rvm/log/ruby-1.9.2-head/svn.checkout.log
[2010-02-09 14:19:21] svn checkout -q  http://svn.ruby-lang.org/repos/ruby/trunk /home/hibariya/.rvm/src/ruby-1.9.2-head
rvmのバージョンを上げた後
hibariya@HIBARIYA% cat ~/.rvm/log/ruby-1.9.2-head/svn.checkout.log
[2010-07-08 16:40:50] svn checkout -q  http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_9_2 /home/hibariya/.rvm/repos/ruby-1.9.2-head

多少もやもやしてますが一旦これで解決。

*1:20100709追記: --headオプションをつけるとリポジトリから最新のを落としてきてくれるようです

CakePHPでセッションをDBで扱うようにする

タイトル通りのことを仕事で質問されたけど、CakePHPをちゃんと使ったことも無いし知らなかったので調べた。ネットで検索すれば普通に出てきますが一応メモ。
使ったバージョンは1.3.2 stableです。

セッションを入れたり出したりするテーブルを作成

CREATE TABLE sessions (
    id VARCHAR(255) NOT NULL PRIMARY KEY,
    data TEXT NOT NULL DEFAULT '',
    expires INT DEFAULT NULL
);

app/config/core.php に設定

あんまり関係ないですがSession.modelの指定をしないといけないというのが分からなくて少しはまりました。
下記のように変更/追記。

# Configure::write('Session.save', 'php'); があったら下記に変更
Configure::write('Session.save', 'database'); 

# 以下を追記
Configure::write('Session.model', 'Session');
Configure::write('Session.table', 'sessions');
Configure::write('Session.database', 'default');

controller内で使う

特にmodelクラスとか作らなくても動きます。

    // 入れる
    $this->Session->write('name', 'おはようおはようおはよう');
    // 出してviewで使う
    $this->set('name', $this->Session->read('name'));

ターミナル上で使える青空文庫ビューアを作ってます

iPadを買うお金もないし電子書籍が身近になるまで何かして待っていようと思ったので、前からつくろうと思っていたターミナル上の青空文庫ビューアを作ってます。
GitHub - hibariya/azul: Azul: 青空文庫のターミナルビューア

名前: Azul(アズル、アズール)

  • できること
  • 目的
    • まだ読んでない作品を手軽に読む
    • gemの作り方の勉強
    • githubを使う何らかの理由
  • 特徴など
    • 初回起動時は少し重い
    • 出力をパイプで繋いで表示したりできる
    • 画面の色とか変えられる
    • 割と色々な場面でエラーが出る
    • 多分、UTF-8でないとうまく検索できない
    • ~/.azul とか、勝手にディレクトリを作る
    • Ubuntu(10.04), MaxOSX(10.6.4), ruby 1.8.7で動作確認してます

使い方など図解

基本的な使い方をなるべくスクリーンショットを使って説明します。

インストール

ここにある最新のgemをインストール。sudoをつけない*1方がいいかも。インストールすることでazulというコマンドが使えるようになります*2


Tabキーを何回か押せばコマンドの候補は出てきますが、 help と叩くことで日本語の説明が表示されます。


set color 0 などとすればターミナルの色が元に戻ります。azulのコマンドの出力は、パイプでつないで制御できます。

基本的な使い方

search 太宰 などと打てば、タイトルや人物名などから検索してヒットした人物一覧が表示されます。ヒットした人物が1人だけだった場合は、その人物の作品一覧が表示されます。複数ヒットした場合は take a みたいにtake [行頭の英字]と打って人物を選択すると作品一覧が表示されます。


open a みたいに open [先頭の英字]と叩くことで、(運が良ければ)本文が表示されます。そのとき、本文は大抵とても長いので、lessなどでつないであげるなどします。


その他、詳しくはこちら

これから

「ターミナルで青空文庫を読む」ということへの需要はともかく、一旦手をつけてしまった後で放棄するのも嫌なので、勉強もかねて、これから気が向いたときに徐々に改善していければなーと思っています。
あとは、中では結構泥臭いことばかりやっているので、その辺もどうにかできればなと思ってます。

その他

随所で悩みながら書いている感じなので、バグとか、設計やコードへのアドバイスなど頂ければ喜びます。

*1:~/.gemrcにgem: --user-installと追記

*2:~/.gem/ruby/1.8/bin とかにPATHが通っている必要があるかもしれません

喘息になった

今年に入ってから咳を伴う発作っぽいのがよく起こるなーと思ってたけど、たまにしか起こらないのでほったらかしていたらついに喘息になりました。しばらく地道に治していかないと。原因は色々心当たりがあるんですが、今は血液検査してもらっている最中。

  • 心当たりのある原因リスト
    • ペット(オカメインコ)
    • ペット(うさぎ)
    • 一時期ベランダを占領していた鳩の夫婦の大量の糞(掃除した)
    • エアコン

薬とか割と高いみたいなんですが、ある程度条件を満たしたら助成金を頂けるそうです。申請せんと。
http://www.zensoku110.com/jyoseikin/tokyo.html

煙草やめたり酒を減らしたりいろいろ頑張ってる矢先にこれでした、ああああ。
はやく健康になりたい。死ぬの怖いよー。

PHP5.3未満で無名関数のようなものを書けないか足掻いてみた

あそびです。
無名関数というか、Rubyでいうブロックのようなものを引数にとれるようにしたくて、pure PHPだけでどこまでできるか色々と試行錯誤してみました。何に使うのかはあまり考えてません。
実際にできたのは↓のような書き方の何かです。見た目は気持ち悪いですが、そこそこ時間をかけてしまったので公開しつつ色々と補足します。

require 'bloc.php';

$hoge = 10;
$b = bloc();if(called){
  $hoge++;
  return $hoge;
};

$b->call(); # => 11
$b->call(); # => 12
$b->call(); # => 13

$bに代入している行がどうみても不自然な感じがしますが、if(called){から};までの間は、すぐに評価されずに後でcall()を通して呼ぶことで何度でも呼び出すことができます。
仮にこれを「ブロック」とか呼んでおきます。ブロック内のローカル変数の状態は保持されます。ブロック外のグローバル変数はブロック内でも普通に参照できます。

ただ、メソッド(と関数)の中などのローカル変数はブロック内からは直接参照できないので、bloc()の引数にハッシュで渡す必要があります。だけどそうするともはやわけがわからなくなる。

function foo(){
  $hoge = 20;
  $b = bloc(array('hoge'=>$hoge));if(called){
    $hoge++;
    return $hoge;
  };

  echo $b->call(); # => 11
  echo $b->call(); # => 12
  echo $b->call(); # => 13
}
foo();


ブロック内からは外にある変数を破壊することができません。それから、ブロック内で定義した変数は外では直接は参照できません。->でブロック内のローカル変数をプロパティみたいに参照することはできます。

$hoge = 'piyo';
$b = bloc();if(called){
  $hoge = 'fuga';
  $foo = 'bar';
  return $foo;
};

echo $b->call(); # 'bar' と表示
echo $hoge; # 'piyo' と表示
echo $foo; # 何も表示されない
echo $b->foo; # これなら 'bar' と表示


何をやっているかというと、普通に走らせたら絶対に通らないようにした部分をbacktrace情報を頼りにどうにか抽出して、呼ばれるたびにevalしてます。ただ直接eval書いているだけだと面白くないし、書いているときに文字列扱いになってエディタのシンタックスハイライトの恩恵を受けられないし、evalする前と後で変数をすり替えるなどの処理を入れたかったのでこうなりました。
実は、PHP5.3の無名関数の動きをよく調べずに書いたので色々違うと思います。いつかちゃんと調べます。
今の時点での目立った問題点は4つ。

  1. ネストできない
  2. ブロック外のローカル変数を拾うのに手間がかかる
  3. エラー処理してない
  4. すごく遅い

どこかバグってそうですし実用には全く向きませんが、おもしろ半分に作ったら割と面白かったのでgistに上げています。(gist初めて使った。べんり!)