Archive for the ‘programming’ Category

This week activity(4/1 ~ 4/10)

土曜日, 4月 10th, 2010

今週はJavaScript強化週間でした.jQueryを使うために,
まずJavaScriptを勉強しました.

JS関係

JavaScript 第5版

まず全体像を掴むためにざっと読みました.
prototypeで継承を行う点が一番大きな刺激でした.
あとはクロージャの概念などを勉強.ぶっとい本で大変でした..

Pro JavaScript techniques

jQueryの作者John Resigの本.
anonymous function -> (function() {})();が特に勉強になりました.
あとは有名ツールの紹介やprivateやpublicな属性の作り方など.

いまJavaScript:The Good Partsを頼んでいますが,まだ届いてません.

ビデオ

google TechTalkすごい人が来ていておすすめです!
YUI(Yahoo UI)TheaterのほうもJS系の動画が上がってるみたいなので,
今週はこれらをチェックするつもりです.

Best Practice in JavaScript Library Design

上記John Resigのお話.どう良いライブラリを作り,メンテするかについて.
この中でOOPは良いコードを書く選択肢の一つに過ぎないと述べてます.
JSの場合,OOPよりカスタムイベントを使う方が良いコードが書けるのでは?とも.

JavaScript: The Good Parts

JS界の大御所Douglas Crockfordの例の本をベースにした講演.
JSには良い部分と悪い部分があるので,良い部分を活かす様に使うべきとのこと.
良い部分とは,Closure, dynamic Object, lambdaなどのようです.
あとはprototype継承についての説明や,new演算子は使うな!など.

面白OSS

せっかくなのでJSのOSSはどうなってるかを調べてみました.
特に面白そうだったのは以下.

sproutcore

http://www.sproutcore.com/

HTML5+JSのためのアプリケーションフレームワーク.
フレームワーク側にボタン等のGUIコンポーネントが用意されていて,
JSだけでロジックを書けるよ!というものでしょうか.

raphael

http://raphaeljs.com/

JSで描画するベクターグラフィックライブラリ.
ベクターグラフィックをJSで描いてる!?

commonJS

http://commonjs.org/specs/modules/1.0/
最近はこういう流れなんですね.V8がちょっぱやなせいでしょうか.
JSでネイティブアプリを作れるようにする動きだと認識してます.

勉強していくなかで,JSは書き方が自由な分,技巧で対処する文化を感じました.
なんかそのあたりLISPの気風を感じるような..

他にチェックしておくべき人やプロジェクト,本やサイトなどがありましたら教えてください!

その他の学び

JS以外には以下のような学びがありました.

リファクタリング

これはすごく勉強になりました!
「2つの帽子」という,機能追加とリファクタリングを分けてやりましょう
という考え方は,とても効きました.今までごちゃごちゃにやっていて,
コミットする際に「あれ,なにやったっけ?」ということがあったので..X(
各プラクティスも,自然にやっているものもありますが,明文化されると
人に伝えやすくなる分,勉強になりました.

まつもとゆきひろ コードの世界

Rubyの作者Matzの本.Rubyの動的な部分の使い方を知りたかったのと,
サイ本の休憩にコラム的な本が欲しかったので読みました.

20歳のときに知っておきたかったこと

スタンフォードのイノベーション論の先生が書いた本.
要点は「もっと自由に考えていいんだよ」という許しを,
常識という枠にはまる前に教える本です.
学校では,評価軸が明確な中でどう成果を上げるかを問われますが,
現実社会は違います.自由な発想こそが自分を活かし,世界を豊かにすると
述べているように感じました.
これ高校生の時に読みたかったなぁ,としみじみ思う本でした.
例として出てくるプロジェクトも逐一発想が飛んでいて面白く,
やったろう!という精神を掻き立てられます.

今週はこんな感じでした!

[as3]特定の型の子要素を見つける

火曜日, 3月 30th, 2010

asオペレータ素敵.

flash.utils.getQualifiedClassNameでフルパスのクラス名が取れるので,それをフィルタしてやってもいいけど,取りたい子要素のクラスが確実な場合はasオペレータを使うのが良い.

ちなみに,フルパスでないクラス名を取る場合は,以下のサイトが参考になる.

Twitter Toolsが重さの原因?

木曜日, 3月 18th, 2010

ここ数日ブログがやたら重いと思ったらどうもTwitter Toolsのせいみたい.
しかもある一日のtweetをやたら連投したりしておりました.
他のWordpress + Twitter連携もあんまり良くないみたいなので,ここらで軽いのが欲しいです.
作るかー.PHPやだなー.

wordpressで日本語ファイル名の写真はNG?

火曜日, 1月 26th, 2010

先のmooの名刺の記事で「写真.jpg」というファイル名の画像をwordpressにアップロードしたら,サムネイルが作成されないという問題に出くわした.

まずファイルはアップロードできている様子を確認してもらいたい.
ファイルはアップロードできているが..

その状態で,uploadされた先のフォルダの様子は以下のようになっていた.

console

写真.jpgは確かに存在するが,そのサムネイルにあるべきファイル名の日本語が抜け落ちているために,サムネイルのリンク指定(通常,「写真-320×240.jpg」などのファイル名になる)ができなくなっている.

どうも日本語ファイル名を考慮していないような感じがするな.mb系の関数を使ってない感じ.今つかっているのは最新じゃないから,最新の2.9.1だったら解消されているのかな?これからwordpressのソースを確認する.

ssh接続時のコンソールの解像度(行数)ずれにはresizeを使おう

土曜日, 12月 5th, 2009

自分のサーバにOSXからssh経由でログインすると、次の画像のようにOSX側とサーバ側でコンソールの解像度(行数)が違い、ちぐはぐなコンソールになる時がある。

ピクチャ 1

この問題は「resize」というツールで解消できる。resizeは、僕使っているサーバのOS:Debian lennyではxtermパッケージに含まれている。ディストリビューションによってはxutilsパッケージに含まれていることもあるようだ。

ssh等でサーバに接続後、resizeコマンドを打てば、自分の開いているローカルのコンソールの解像度(行数)に、リモートのコンソールの解像度(行数)をあわせてくれる。

これまでサーバ側で大した用事をしなかったので、解像度(行数)がちぐはぐでも我慢できたが、用事が増えてきたので調査した。調査時はスタンドアローンなマシンでのコンソール解像度についての話題が多く、多少手こずった。liloの引数でvga=xxxを渡すっていう話です。

なお、調査では下記の記事を参考にした。
DSAS開発者の部屋:UML のコンソールを screen に表示させる 〜疑似端末を screen に結びつける

http://dsas.blog.klab.org/archives/50992202.html

launchdで毎日同じ時刻にブログ投稿画面を表示させるようにした。

日曜日, 7月 19th, 2009

先の投稿で,日々一定時刻に投稿画面が表示されれば,日々のチェックポイントとしてブログを書くようになるのではないか,と考えた.そこで,OSXとFirefoxを使って,ある時刻にブログの投稿画面が表示されるようにした.

OSXで,ある時刻にアプリケーションを起動させる方法は2種類ある.

  • iCalのアラーム機能を利用する
  • OSXのプロセスを管理しているlaunchdを利用する

今回はlaunchdを利用する.その理由は,iCalのアラーム機能では特定のアプリケーション(FirefoxやSafari)をある時刻に起動することはできるが,そのアプリケーションで開くページやコンテンツを指定できない.正確には,ある時刻にapplescriptを起動させることが可能なので,applescriptの中でfirefoxを起動し,firefoxに対してあるURLを開かせる処理をさせられる.しかし,私の環境(Firefox 3.5 + OSX Leopard)では動作しなかった.

launchdは,UNIXでいうinitプロセスと同等である.UNIXではシステム起動時にinitプロセスを起動し,そのプロセスが各種デーモンの起動終了の面倒を見る.OSXではinitプロセスの代替として,launchdが用意されている.

今回の目的は,ある時刻にFirefoxを起動し,ブログ投稿ページを表示させることだ.そのため,まずFirefoxを起動し,ブログ投稿ページを表示させるスクリプトを用意する.次に,そのスクリプトをある時刻に起動するようlaunchdに設定する.

Firefoxをコマンドから起動させる場合は,Firefox以下Contents/MacOS/firefox-binを叩く.用意したスクリプトは以下.このスクリプトを,/Users/ryan5500/bin/invoke_firefox.shに配置した.一応chmod 755して起動可能な状態にしておく.

[shell]
#!/bin/sh
/Application/Firefox/Contents/MacOS/firefox-bin "http://www.ryan5500.com/post-new/"
[/shell]

次に,launchdに上記スクリプトを起動させるための設定を書く.用意した設定ファイルは以下.これを,~/Library/LaunchAgents/com.ryan5500.blog.checkpoint.startup.plistに配置した.LaunchAgentsというのは,Launchdが起動するがデーモンではなく,各ユーザーのために起動するものだ.すなわち,ryan5500ユーザーがログインしたときしか,下記のスクリプトは有効にならない,ということだ.

[xml]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.ryan5500.blog.checkpoint.startup</string>
<key>Program</key>
<string>/Users/ryan5500/bin/invoke_firefox.sh</string>
<key>ProgramArguments</key>
<array>
<string></string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>18</integer>
<key>Minute</key>
<integer>10</integer>
</dict>
</dict>
</plist>
[/xml]

この設定ファイルでは,用意したスクリプトを毎日18時10分に起動する.

この設定ファイルを~/Library/LaunchAgents以下に配置したからといって,設定は有効にならない.設定ファイルをlaunchdに読み込ませる処理が必要である.読み込ませるには,以下のコマンドを叩く.

[shell]
$launchctl load ~/Library/LaunchAgents/com.ryan5500.blog.checkpoint.startup.plist
[/shell]

きちんと読み込まれたか確認したい人は,以下のコマンドでcom.ryan5500.blog.checkpoint.startupが表示されるか見れば良い.

[shell]
$launchctl list
[/shell]

以上.これで毎日ブログ投稿画面が表示される環境が整った.ちゃんとブログを書くようになるだろうか.

参考にしたURLを以下に残す.
OSX 10.5 Leopardでcronを使う – 偏った言語信者の垂れ流し

http://d.hatena.ne.jp/nullpobug/20080611/1213196369

Undocumented Mac OS X:第1回 initを置き換えるlaunchd【前編】 (1/3) – ITmedia エンタープライズ

http://www.itmedia.co.jp/enterprise/articles/0704/26/news009.html

LaunchDaemons (launchctl, launchd.plist) の使い方 – maruko2 Note.

http://www.maruko2.com/mw/LaunchDaemons_%28launchctl,_launchd.plist%29_%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9

Perlプログラムの最後の1;について

木曜日, 7月 9th, 2009

Perlのプログラムを読んでいると,最後に1;として終わっているプログラムがあることに気づく.これは何だろう,と思いながらCatalystのマニュアルを読んでいたら,その答えが書かれていた.
Note: Be careful to put this code above the 1; at the end of the file. As with any Perl package, we need to end the last line with a statement that evaluates to true. This is customarily done with 1; on a line by itself.

そうだったんだ.

OSX(Leopard)にwebフレームワークArkをインストールした

日曜日, 6月 21st, 2009
photo by cogdogblog

photo by cogdogblog

MacBook white /w OSX Leopardに,Perlのwebフレームワーク「Ark」をインストールした.
その経過を残す.ただし,僕はPerl初心者なので,「いや,違うやろ」って場所はコメントにて指摘をお願いします.

とにもかくにも,まずはArkをダウンロード.
[shell]
$ wget http://cloud.github.com/downloads/typester/ark-perl/Ark-0.001000_001.tar.gz
$ tar zxvf Ark-0.01.tar.gz
[/shell]

で,次にテストなのだが,その際に必要なCPANモジュールがインストールされていないため,足止めを喰った.僕がつまづいたのは,Mac::Carbon,File::Find::Rule,DBD::mysql,DBIx::Class::Schema::Loaderだ.

まずMac::Carbonから.これはCPANからインストールするのではなく,portから入れた.
[shell]
$sudo port install p5-mac-carbon
$sudo port install p5-mac-appleevents-simple
[/shell]
p5-mac-appleevents-simpleは必要かわからない.下記のブログを参考にした.

http://d.hatena.ne.jp/jazzanova/20090520/1242755894

次にFile::Find::Rule.以下の様なエラーが出た.

CPAN.pm: Going to build R/RC/RCLAMP/File-Find-Rule-0.30.tar.gz

Too early to specify a build action ‘y’. Do ‘Build y’ instead.
Warning: No success on command[/opt/local/bin/perl Build.PL y]
RCLAMP/File-Find-Rule-0.30.tar.gz
/opt/local/bin/perl Build.PL y — NOT OK
Running Build test
Make had some problems, won’t test
Running Build install
Make had some problems, won’t install

なので,手動でインストールする.インストール方法はREADMEに書いてあった.
[shell]
cpan> look File::Find::Rule
bash-3.2# perl Build.PL
bash-3.2# perl Build test
bash-3.2# perl Build install
[/shell]

DBD::mysqlでは,テスト時にtestというデータベースを利用するらしいので,用意してあげた.
[shell]
$mysql -u root -p
mysql> create database test;
[/shell]

僕の設定では,mysqlのソケットは,/opt/local/var/run/mysql5/mysqld.sockに用意されるが,DBD::mysqlのテストでは/tmp/mysql.sockにソケットがあると考えてテストをする.なので,/opt/local/var/run/mysql5/mysqld.sockのシンボリックリンクを/tmp/mysql.sockに用意した.

[shell]
$ln -s /opt/local/var/run/mysql5/mysqld.sock /tmp/mysql.sock
[/shell]

DBIx::Class::Schema::Loaderもちゃんと入らなかったので,lookして手動でmake.
[shell]
cpan> look DBIx::Class::Schema::Loader
bash-3.2# perl Makefile.PL
bash-3.2# make test
bash-3.2# make
bash-3.2# make install
[/shell]

これで依存モジュールは解決.あとはマニュアル通りです.
[shell]
$cd Ark-xxxxxx
$sudo cpan -t .
$sudo cpan -i .
[/shell]

とりあえずOpenID系は無視して,インストール完了しました.

「初めてのPerl第3版」(リャマ本)読書ログ – 第17章「上級テクニック」

土曜日, 6月 20th, 2009

初めてのPerl

0による除算エラーや不正な正規表現は,プログラムをクラッシュさせる可能性がある.それら致命的なーエラーをキャッチするには,コードをevalでくくればよい.

[perl]
my $dino = 0;
eval {
$barney = $fred / $dino;
};
[/perl]

evalはwhileなどの制御構造ではなく式なので,evalの後ろにはセミコロンが必要になる.
eval内で実行されたコードが不正終了したのかどうかを調べるには,特殊変数$@が用いられる.evalが致命的なエラーをキャッチした場合,$@にメッセージがセットされる.$@が空なら,eval内のコードは正しく実行されたと考えてよい.

evalブロックの中に,他のevalブロックをネストすることもできる.内側のevalブロックでエラーをトラップすると,外側のevalブロックではエラーをトラップしない.エラーを伝播させるには,dieを使えばよい.

evalが致命的なエラーをトラップした場合,その戻り値はundefか空リストになる.そのため,上記の例では,$barneyの値がundefかどうかを調べれば致命的なエラーが起こったかどうかを知ることができるため,$@を見ることで致命的なエラーが起こったかどうかを調べる必要はない.

evalでトラップできないエラーは4種類ある.1)Perlそのものをクラッシュさせるエラー(メモリ不足,シグナル等),2)evalブロック内で発生した構文エラー(コンパイル時にキャッチされる),3)exit演算子(プログラムを終了させる),4)警告(ユーザーがwarnによって発生させた警告)からなる4つである.

リストから一部の要素だけ取り出したい,ということがよくある.リストの中から,奇数だけを取り出したい,Fredという名前が入ったものだけ取り出したい,等である.grep演算子でそれらは可能だ.

[perl]
my @odd_numbers = grep { $_ % 2} 1..1000;
#1から1000までの間で,奇数のもののみodd_numbersにpush
[/perl]

ブロックを引数に取り,そのブロック内の操作で値を返したものがリストに入る.

[perl]
my @matchin_lines = grep { /\bfred\b/i } <FILE>;
my @matchin_lines = grep /\bfred\b/i , <FILE>; #さらにシンプルに書ける!
[/perl]

数値リストを金額として一時的に表示する場合,mapを使ってリストを変換できる.
[perl]
my @data = {4.75, 1.5, 2, 1234, 6.9456, 12345678.9, 29.95};
my @formatted_data;

foreach (@data) {#この処理がmapを使うことで短縮できる
push @formatted_data, &big_money($_);
}

my @formatted_data = map{ &big_money($_) } @data;
[/perl]

map演算子は,引数の内容を$_にマップし,ブロックに渡す.

次に,ハッシュのショートカットを紹介する.ハッシュのキーを書く際は,クォートを省略できる.キーが英文字と数字と下線だけから成り,先頭が数字以外のものであれば,クォートを省略できる.このようなキーのことを裸のワード(bareword)という.

[perl]
my %score = (
barney => 195,
fred => 205,
dino => 30,
);
[/perl]

次は正規表現のコツについてだ.通常の量指定子(+や*等)は,欲張りなマッチを行う.すなわち,パターン/fred.+barney/と文字列”fred and barney went bowling last night”が合ったときに,パターンはfredとマッチしたあと,.をマッチさせる為にnightのtからじょじょにバックトラックする形でマッチの試行を行う.barneyまでマッチ試行がバックトラックしたときに初めて結果を返す.
しかしこのような欲張り型のマッチだと,あるHTML文書からタグだけ抜き出すような場合や,文章が長い場合には適さない.そこで,欲張りでないマッチを行いたい場合には,量指定子に?を付けよう.

[perl]
$str = "<html>hogehoge<bold>fuga</bold>. hogefuga<bold>hoge</bold>.</html>";
if($str =~ /<bold>(.*)<\/bold>/) {#欲張りな量指定子の時
print $1; #fuga</bold>.hogefuga<bold>hogeが出力される.
}

if($str =~ /<bold>(.*?)<\/bold>/) {#欲張りでない量指定子の時
print $1; #fugaが出力される.
}
[/perl]

また,複数行のテキストに対するマッチを行うこともできる.そのためには/mオプションを指定すれば良い.

[perl]
$_ = "I’m much better\nthan Barney is\n at bowling, \nWilma.\n";#4行のテキスト
print "found ‘wilma’ at start of line\n" if /^wilma\b/im;
[/perl]

リストはリストスライスという機能によって,その要素のいくつかだけを簡単に取り出すことができる.
例えば,以下のように.

[perl]
$_ = "1:tomoaki sano:24";
my $sano_old = (split /:/)[2];

my @names = qw/ zero one two three four five six seven eight nine /;
my @numbers = @names[9, 0, 2, 1, 0];#配列もスライスできる

my %scores = {fred => 68, dino => 110};
my @two_scores = @scores {qw/ fred dino /};#ハッシュもスライスできる
[/perl]

「初めてのPerl第3版」(リャマ本)読書ログ – 第16章「単純なデータベース」

金曜日, 6月 19th, 2009

初めてのPerl

perlはシンプルなデータベースであるDBMがデフォルトで利用できる.DBMのデータベースは,my_database.dirとmy_database.pagという2つのファイルからなる.DBMの利点は,perlプログラム上でハッシュと同じようにDBのコンテンツを扱えることにある.

[perl]
dbmopen(%DATA, "my_database", 0644) #my_databaseというDBMをオープンする
or die "Cannot create my_database: $!";

$DATA{"fred"} = "bedrock"; #DBMへのデータ追加
$DATA{"barney"} = "hoge";
remove $DATA{"barney"}; #DBMからのデータ削除

foreach my $key (keys %DATA) {
print "$key\n";
}
[/perl]

なお,データ数が増えるほど,keysを使ってハッシュのキーリストを得る処理は重くなる可能性がある.keysはハッシュ全体をスキャンするので,大きなリストを生成するかもしれないから.DBMハッシュをスキャンするときは,一般には,each関数を使った方がメモリの使用量が少なくて済む.

[perl]
while( my($key, $value) = each(%DATA)) {
print "$key has value of $value\n";
}
[/perl]

データをDBMに格納する際,1つのキーに対して複数の値を格納したいときは,pack/unpack関数を利用する.packは,フォーマット文字列と引数のリストを受け取って,それらをもとに1個の文字列を生成する.

[perl]
my $buffer = pack("c s l", 31, 4159, 263539);
my($char, $short, $long) = unpack("c s l", $buffer);#charには31, shortには4159, longには263539が入る
[/perl]

DBMはいうなれば巨大なハッシュだったが,他にも固定長や可変長のテーブルを利用することができる.固定長テーブルと可変長テーブルについての解説は必要になれば追記する.

perlはちょっとした処理を行う為に,一行のプログラムをさくっと実行するモードを用意している.

[perl]
$perl -p -i.bak – w -e ’s/Rnadall/Randal/g’ fred*.dat
[/perl]

-pオプションは以下のようなプログラムを追加する処理をする.

[perl]
while(<>) {print;}
[/perl]
-eオプションで指定されるのが,実行して欲しいプログラムとなる.これが,上のwhile(<>)内に入ると考えれば良い.-i.bakオプションは,実行前に$^Iに.bakをセットする.これはすなわち,ダイアモンド演算子で指定されたファイルのバックアップファイルの拡張子として,.bakを利用する,というものである.-wオプションは,先に述べた通り,警告を出させる.-eオプションの次に来るfred*.datがプログラムに対する引数となる.