カテゴリ:IT( 162 )
三項演算子の書き方と FizzBuzz
三項演算子?:の正しい書き方
プログラマの思索: 三項演算子?:の正しい書き方 経由)
条件演算子は、正しくは以下のように書く。

condition ? true-expression
: false-expression

(中略)

条件演算子には、以下の表記方法もある。この表記は、 switch文や else-if構文と同様に使える。

case1 ? expression1:
case2 ? expression2:
case3 ? expression3:
...
default-expression

 すごく分かりやすい三項演算子の書き方の説明。「プログラマの思索」さんのエントリでも触れられてるとおり、三項演算子は Lisp の if式 や cond式 に発想が近い気がするので、インデントもそれ(if式やcond式)に近くすると、読みやすくなると思う。

RubyでFizzBuzzかけたよ!+いろいろ考えてみた - バイオ研究者見習い生活 with IT
このような記述を見つけたので適用してみると

for i in 1..100  do
puts((i % 15 == 0) ? "FizzBuzz" :
(i % 3 == 0 ) ? "Fizz" :
(i % 5 == 0 ) ? "Buzz" :
i)
end

こうなろうか。

僕だったら、もうちょっとレイアウトを整えて、こうするかなぁ(あと、for は rubyっぽくないので、あんまり使いたくない)。
(1..100).each do |i|
puts i % 15 == 0 ? 'FizzBuzz' :
i % 3 == 0 ? 'Fizz' :
i % 5 == 0 ? 'Buzz' :
i
end


これ、もっと短くできる人居たら教えてくれませんか?
for i in 1..100 do puts(i%15==0?"FizzBuzz":i%3==0?"Fizz":i%5==0?"Buzz":i)end

僕はゴルファーじゃないんでよく分かんないですが、短く書こうとするとこんな感じ?(63バイト)
1.upto(100){|i|p i%15==0?:FizzBuzz:i%3==0?:Fizz:i%5==0?:Buzz:i}
シンボルのコロン(:)と三項演算子のコロンを、Rubyがちゃんと区別してくれるのが嬉しい。
[PR]
by fkmn | 2008-03-20 22:52 | IT
gauche.night 行ってきた
a0057891_0502710.jpg


 SICP もまだ読み終わってない中途半端Schemerの僕ですが、gauche.night に行ってきました。先行発売された「プログラミングGauche」もしっかりゲット。

 以下、それぞれ感想をば。

・第1部: 座談会
(前編)
 川合史朗さん、オライリーの伊藤さん、山下伸夫さん、えんどうやすゆきさんによる「プログラミングGauche」出版に当たっての裏話等についての座談会。
 ラクダ本(「プログラミングPerl」)をかなり意識していた、とか。

(後編)
 笹田耕一さん、ひげぽんさん、zickさん、黒田寿男さん、えんどうやすゆきさんによる「R6RS」についてのお話。
 始めの方で黒田さんが話していた内容がチンプンカンプンでした(笑)(フルの continuation(継続)があるとナントカカントカ、といった感じの話)。


・第2部: gauche.gong
「そうだ Scheme もどきを作ってみよう!」amachang(天野 仁史) (サイボウズ・ラボ)
 カッとなって、JavaScript で Scheme を実装しました、という話。
 結構、シームレスに JavaScript から Scheme を使えるようになっているみたいで面白かった。

「Cyber Earth」横田裕思
 Google Earth と国土地理院のデータを組み合わせるソフト。普段からデータをキャッシュして、非常時にも使えるとか。時間切れで、途中で発表が終わってしまったのが残念。

「Gaucheで作るPIC電子工作」naoya_t
 SICP を読むのにとても参考にさせてもらっているサイト(素人くさいSICP「独」書会)の naoya_t さん。「自分でアセンブラ書いてるんで」とか、随所にすごい発言が。

「Gauche on Rails」吉田裕美(EY-Office)
 時代は「RubyからLispへ」ということで、Rails を Gauche に移植したという話。デモで見る限りでは、Rails そのものが gauche 上で動いてました。すげー。

「Gauche *で* 本を作る」k16.shikano(鹿野桂一郎)(オーム社)
 見えない文字から Gauche への愛が伝わってきた発表。「原稿をハックする」というセリフが印象的でした。

「OldType」西山清香
 オールドタイプ向けのWikiエンジン。編集中のページが無くなってしまうのがいやなので、subversion を直接いじれば良いじゃない、という話でした。

「PHPはGaucheの夢を見るか?」hogelog(小室直)
 libgauche (Gauche のC言語バインディング機能) でPHPを改良しちゃおう、という話。いろいろネタが満載の発表でした。

「BiwaSchemeでAjax&Comet」yhara(京大マイコンクラブ)
 こちらも、JavaScript で実装した Scheme の話。Ajax とか Comet も OK となかなか完成度が高かった。

「glint - Gauche用コードチェックツール」小黒直樹
 個人的には、一番興味引かれる発表でした。今すぐ使ってみたいんだけど、どこにあるんだろう・・・?ググったけど、見つからなかった・・・。

「Gaucheで誤植共有」tabe(安部武志)
 誤植共有のためのWebアプリケーションの話でした。

「ステップ実行eval-sv」山田淳雄
 動画での発表。無限ループするような式は途中でそれを検知して停止するという、特殊なeval の話。

 という事で、gauche.night の感想は以上。会場が、TOKYO CULTURE CULTUREという、今までにあまり経験した事ない場所だったのが新鮮でした。

 さて、いい加減 SICP も終わらせないとなー(もうすぐ4章)。
[PR]
by fkmn | 2008-03-08 23:50 | IT
Joel はそんなこと言ってないよ
404 Blog Not Found:その影は装飾か?
私はその場に居合わせたわけではないのだけど、Joel、わかってねえなあ。

デブサミ - ひげぽん OSとか作っちゃうかMona-
建築に無駄な装飾をとりのぞくモダンアーキテクチャという流派があるが、ソフトウェアはまだその段階に達していない。ユーザーは装飾を好む。ウィンドウのありえないところに影があったり、金属でもないのに金属の見た目だったり。

 スルーしようかとも思ったけど、あまりにも誤解が甚だしいので、一応訂正しておく。

 Joel が意図していたのは、「建築業界には無駄を省くという流れがあるけど、ソフトウェアはそれとは違う(その段階に達していない)」ということであって、ウィンドウの影に意味が無いなんて言ってない。むしろ、その全く逆で、無駄に見えるけど必要だというのが実際に話していた内容。

「Joel on Software」の筆者が語る“人を幸せにする”ソフト開発のポイント:ITpro


 別に事実誤認するな、とは言わないけど、せめてもう少し裏をとってからポストして欲しいなぁ。弾さんぐらいのレベルになると、影響力も半端ないんだし。
[PR]
by fkmn | 2008-02-14 23:13 | IT
デブサミ2008に行ってきた
デブサミ2008は13日と14日の2日間の開催だけど、僕自身は今日だけの参加。
というわけで、参加したセッションの感想。

【13-E-1】Microsoft Presents 「Joel on Developers Summit」:素晴らしいソフトウェアを作るということ
 今日一番の目当てのセッション。Joel が来るというのでデブサミに来たと言っても過言ではない。

 やっぱり、プレゼンが上手だというのが第一印象。導入の雑談なのかな?と思っていると、いつの間にか本題に入っているのはさすが。他にもMS製品を使ったジョーク(?)とか、音楽とか、聴衆をリラックスさせる術を心得ているようだった。プレゼン技術そのものだけでも十分に楽しめた。

 実際の話の内容も、かなり納得感のある内容。個人的には、「ユーザーにコントロールを渡す」という部分が印象に残った。確かに、僕自身、好んで使ってるソフトっていうのは、カスタマイザビリティが高いものが多い印象がある。Emacs とか Firefox とか Perl とか Ruby とか。ユーザ側でカスタマイズできる領域が大きいと嬉しい。でも、開発者側の視点から見ると、ついつい、ユーザー側にコントロールを渡して、不確定要素を入れ込みたくない、とか考えてしまいがち。今後は、もうちょっと「ユーザにコントロールを渡す」っていう事を考えていきたい。

 あと、個人的には、同時通訳はいらないなぁ、と思った。同じ内容を2回聴かされるのもイライラするし、話のテンポが途切れてしまって、ちょっと残念な感じ。英語が苦手な人の事も考えると、全体としては、無いよりはあった方が良いのかもしれないけど。


【13-B-2】CodeGear Presents 「David Intersimoneと日本のRubyのコミュニティが、オープンソースの現在と未来について語る会」
 「Ruby に対して出来る事は何か?」というテーマでのパネルディスカッション。参加者の皆さんが、Ruby という共通軸を持ちながらも、それぞれ異なる立場を代表していて、良いパネルディスカッションだった。

 個人的には、前田さんが「Ruby は Rails だけのためにあるわけじゃない」と言いつつも、「でも、Rails がないと、みんな使ってくれないし・・・」と発言したりして、微妙なジレンマを醸し出していたのが微笑ましかった。ガンガってください。


【13-B-3】ふつうのRubyプログラマに贈るRubyプログラミング講座
 ホントに、ふつうのRubyプログラミング(若干初級寄り)の内容だった。ちょっと、僕自身は対象から外れていたかな?という印象。あ、でも pp は初耳だった。
pp - Rubyリファレンスマニュアル


【13-E-4】継続的インテグレーションとテストによるソフトウェアリリースの迅速化
 題目のとおり、継続的インテグレーション(Continuous Integration, CI)いいよ!という内容。CI の世界では、CruiseControl というオープンソースのプロダクトが有名らしい(Martin Fowler作なんだとか)。
CruiseControl Home
Agitar Software: Automated Unit Testing for Java Applications


【13-A-5】反復開発とテスト - 7年
 遅い昼食を食べに外に出ていたので半分しか聴けなかったんだけど、もったいない事した!XP的な手法を、きちんと自分たちの手法として確立させて開発を進めている、という話。こういう形態のプロジェクトが増えてくれば、もっとエンジニアも楽しく仕事できるんだろうになぁ。

 あ、でも、現実的な話、7年も同じプロジェクトが続くというのも、それはそれで、結構なレアケースな気がした。


【13-B-6】インターネット・アプリケーションを素早く作る - Project Zero
 最近、ちらほらと周りで Project Zero の名前を聞く機会が増えてきたので、どんなもんじゃろ?と思って、聴いてきた。まぁ、単純な話、Webアプリケーションフレームワークですよね、という事だった。

 他のフレームワークと比べて、圧倒的に優位な部分があるか、と言われると、正直微妙。ただ、Groovy を使って、Java のコンポーネントをシームレスに呼び出すことが出来る、という話だったので、講演の中でもあったように Java の資産が多くあるようなところでは、他と比べて優位性が出てくるのかもしれない。


【13-E-7】CodeZineスペシャルセッション みんなまとめて面倒見よう~真のDBエンジニアになるために必要なこと~
 この時間帯(18時〜)は、セッション内容的に、かなり悩ましかった。できることなら、全部のセッションに参加したかったんだけど、そうもいかないので、いろいろ考えたあげく、今まで一度も話を聞いた事が無かったミックさんのセッションへ。

 本を出されたという事で、その本の紹介をしつつ、DBエンジニアの現在の状況や SQL の考え方についての話などがセッションの内容。特に、DBエンジニアのスキルレベルの分布について危機感を持たれていたのが印象的だった。確かに、周りを見ても、DB中心で仕事をしている人間っていないわけで、そういう意味では、中級以上のDBエンジニアが育ちにくい土壌ではあるのかもしれない。



 全体的には「お祭り感」が全体的に出ていて楽しかった。ただ、会場の広さと来場者の数が見合ってなかったのが、ちょっと問題だったかな。でも、それだけ盛上がってるってことで、まぁ、良い事なんでしょう。
[PR]
by fkmn | 2008-02-13 23:55 | IT
まずは遅延評価から、らしい
Y-combinator云々の前に、まず遅延評価らしい。
404 Blog Not Found:λ Calculus - まずは遅延評価から

ということで、弾さんのエントリを見ながらお勉強。


my $ELSE = 0;
sub {
my ( $a, $b, $c ) = @_;
return $a ? $b : $c;
}->( 1, 1, $ELSE = 1 + 1 );
print $ELSE; #=> 2

確かに、上のコードだと $ELSE が 2 になる。
(ただ書き写すだけじゃ面白くないので、元のコードを Perl で書き直した)。


var myif = function(_cond, _then, _else){
return _cond ? _then : _else;
};
こういう定義だと、一応

myif(true, 1, 1+1);
のようなものは動くけど、

function fact(n){
return myif(n <= 1, 1, n * fact(n-1));
};
のようなものは動かない。なぜなら、n * fact(n-1)は問答無用で実行されてしまうので、無限ループになってしまうからだ。

同じ話が SICPの問題1.6 にもあったなぁ。こういう動きのイメージは分かる。

先行評価する言語でも、クロージャーが使えるなら、それを利用して評価は後回しにできる。

なるほど、クロージャにしちゃえばいいのか。ということで、最後のコードも Perl で書き換え。

my $myif = sub {
my ( $_cond, $_then, $_else ) = @_;
return $_cond->() ? $_then->() : $_else->();
};

sub fact {
my $n = shift;
$myif->( sub { $n <= 1 },
sub { 1 },
sub { $n * fact( $n - 1 ) } );
}
print fact(10); #=> 3628800

ちゃんと動いた。

こうやって、順を追って説明されると理解できるなぁ。特に難しい話じゃない気がする。

となると、SICP の 問題1.6 も、new-if と sqrt-iter を書き直せばちゃんと動くはず。


(define (good-enough? guess x)
(< (abs (- (square guess) x)) 0.001))

(define (square x)
(* x x))

(define (improve guess x)
(average guess (/ x guess)))

(define (average x y)
(/ (+ x y) 2))

(define (new-if predicate then-clause else-clause)
(cond (predicate (then-clause))
(else (else-clause))))

(define (sqrt-iter guess x)
(new-if (good-enough? guess x)
(lambda () guess)
(lambda () (sqrt-iter (improve guess x) x))))

(define (sqrt x)
(sqrt-iter 1.0 x))

(sqrt 9) ;=> 3.00009155413138
(sqrt 100) ;=> 10.000000000139897
(sqrt (* 12 3)) ;=> 6.000000005333189

おぉ、動いた。わーい ヽ(´▽`)ノ
[PR]
by fkmn | 2008-02-05 23:55 | IT
Perl で Church数をいじってみた
Church数をちゃんと理解できているかいまいち不安だったので、Perl でちょっといじってみた。

まず、SICP の問題2.6の、zero と add-1(ついでに one)を Perl に移植。

my $zero = sub {
my $f = shift;
sub { my $x = shift; $x }
};

my $one = sub {
my $f = shift;
sub { my $x = shift; $f->($x) };
};

sub add_1 {
my $n = shift;
return sub {
my $f = shift;
return sub {
my $x = shift;
$f->( $n->($f) ($x) )
};
};
}

my $two = add_1($one);

# 数値に戻してみる
print $zero->( sub { $_[0] + 1 } ) (0); #=> 0
print $one->( sub { $_[0] + 1 } ) (0); #=> 1
print $two->( sub { $_[0] + 1 } ) (0); #=> 2


add_1 をもとに、任意の2つの数の加算ができるように変形。
$m->($f) で m の数をつくって、その回数分 $n->($f) ($x) を繰り返してやる。

sub add {
my ( $n, $m ) = @_;
return sub {
my $f = shift;
return sub {
my $x = shift;
$m->($f) ( $n->($f) ($x) );
};
};
}

my $three = add( $one, $two );
my $five = add( $two, $three);

# 数値へ
print $three->( sub { $_[0] + 1 } ) (0); #=> 3
print $five->( sub { $_[0] + 1 } ) (0); #=> 5


加算が出来ると、乗算も割と楽。
$m の回数分 $n->($f) を繰り返してやって、それを $x に適用させる。
# 上の add と比べて、変わってるのは * の部分だけ。

sub multi {
my ( $n, $m ) = @_;
return sub {
my $f = shift;
return sub {
my $x = shift;
$m->( $n->($f) ) ($x); # *
};
};
}

my $six = multi( $two, $three );

# 数値へ
print $six->( sub { $_[0] + 1 } ) (0); #=> 6


この調子で Y-combinator にまで進もうと思ったけど、Perl だと遅延評価が必要とか、Z-combinator とか言われて、正直よく分からんかった。。。

とりあえず、lambda だけで無限ループ(再帰)するのは簡単だよね、というところまで。

# 無限ループ(再帰)
my $omega = sub {
my $f = shift;
$f->($f);
};
$omega->($omega);



一応、Y-combinator がちゃんと理解できるまで続く予定。


参考サイト:
404 Blog Not Found:TuringとChurchの狭間で
The Mellow Musings of Dr. T : Recursive lambda expressions
[PR]
by fkmn | 2008-01-30 23:55 | IT
Perl の reduce (List::Util) で配列を作る方法
SICP の2.2.3節あたりを読んでいたら、思いついたのでメモ。

いままで reduce で配列を作る方法がいまいち分かってなかったんだけど、以下のようにすればいい。

例えば、1から3までの数字について、元の数字とその数字を2乗した数の対の配列を作る場合はこう。

my @array = 1 .. 3;
my $array_ref = reduce { [ @{$a}, [ $b, $b**2 ] ] }[], @array;
print YAML::Dump($array_ref);

実行結果

---
-
- 1
- 1
-
- 2
- 4
-
- 3
- 9

初期値に空の配列リファレンスを入れておいてやるのが(個人的な)ポイント。

Perl の(というより List::Util の)reduce は初期値を設定できなくて使いづらいと思ってたんだけど、ただ単に、配列の先頭に初期値を突っ込んでやればいいだけだった。コロンブスの卵。


参考サイト:
畳み込み関数の比較 (fold / accumulate / inject / reduce) - blanket sky
[PR]
by fkmn | 2008-01-24 23:55 | IT
Scheme-mode で C-cC-l した時に自動でファイルを保存させるようにした
 Emacs の Scheme-mode で C-cC-l でファイルをロードする時に、ファイル(buffer)が編集中だと、いちいち保存の確認をされるのがウザかったので、そういう時は、自動でファイルを保存するようにしてみた。

 ということで、cmuscheme.el を以下のように変更。
# 僕の環境(Mac OSX の Carbon Emacs)では、
# /Applications/Emacs.app/Contents/Resources/share/emacs/22.0.97/lisp/
# に格納されていた。)

*** cmuscheme.el.orig 2008-01-24 00:03:32.000000000 +0900
--- cmuscheme.el 2008-01-24 00:25:24.000000000 +0900
***************
*** 436,446 ****
--- 436,453 ----
`scheme-compile-file' command. Used for determining the default
in the next one.")

+ (defcustom cmuscheme-always-save-buffer t
+ "*Non-nil means save the current buffer without asking before loading a file."
+ :type 'boolean
+ :group 'cmuscheme)
+
(defun scheme-load-file (file-name)
"Load a Scheme file FILE-NAME into the inferior Scheme process."
(interactive (comint-get-source "Load Scheme file: " scheme-prev-l/c-dir/file
scheme-source-modes t)) ; t because `load'
; needs an exact name
+ (if cmuscheme-always-save-buffer (save-buffer))
(comint-check-source file-name) ; Check to see if buffer needs saved.
(setq scheme-prev-l/c-dir/file (cons (file-name-directory file-name)
(file-name-nondirectory file-name)))


で、使う場合は、.emacs に以下の設定を追加する。

(setq cmuscheme-always-save-buffer t)


 "cmuscheme-always-save-buffer" という変数に true が設定されていると、C-cC-l 実行時に自動でファイルが保存される。nil が設定されている場合は、元のとおり、ファイルが保存されていない場合は確認してくる。

 と、まぁ、こんな感じにしてみました。
[PR]
by fkmn | 2008-01-23 23:55 | IT
livedoorクリップのタグをリネームする "Perl" スクリプト
livedoorクリップのタグをリネームするRubyスクリプト - むぅもぉ.jp
たぶんPerlで書いたらCPANのモジュール使えるかっらもっとシンプルに書けたのかな。

API, delicious compatible - livedoor クリップ まとめサイト - livedoor Wiki(ウィキ)
Net::Delicious を endpoint 変更のみでそのままご利用いただけます。


面白そうだったのと、Net::Delicious を使うと簡単に出来そうだったので、やってみました。

ldc_tag_rename.pl

use strict;
use warnings;
use Net::Delicious;

my $livedoor_id = "your_livedoor_id";
my $apikey = "your_api_key";

my $old_tag = shift or die "usage: $0 old_tag [new_tag]\n";
my $new_tag = shift;

my $ldc = Net::Delicious->new(
{ user => $livedoor_id,
pswd => $apikey,
endpoint => 'http://api.clip.livedoor.com/v1/',
debug => 0,
}
);

for my $post ( $ldc->posts( { tag => $old_tag } ) ) {
my $tags = $post->tags;
$tags =~ s/$old_tag/$new_tag/;

$ldc->add_post(
{ url => $post->url,
description => $post->description,
extended => $post->extended,
tags => $tags,
}
);
print $post->url, "\n";
sleep 1;
}


スクリプトの "your_livedoor_id" の部分に livedoor の ID、"your_api_key" の部分に API Key を入力してから使います。

実行する時は、コマンドライン引数に「変換前のタグ」と「変換後のタグ」を指定します。「変換後のタグ」を指定しないと、タグが削除されます。

# perl ldc_tag_rename.pl google Google


元エントリと同様に、実際に使う場合は自己責任でお願いします。自分で使ってみた限りでは、特に問題なく動作しましたが。


余談だけど、Net::Delicious に "$obj->rename_tag(\%args)" というメソッドがあって、一瞬期待したけど、livedoor クリップではまだ実装されていないらしかった。残念。


# 元エントリに trackback 打とうと思ったけど、URL が分からないなぁ。
[PR]
by fkmn | 2008-01-14 23:55 | IT
Perl の my と local と our
すっきりした>< - YoshioriのBlog
our 名前をスコープに限定. local 値をスコープに限定. my 名前と値の両方をスコープに限定

local と my - IT戦記
404 Blog Not Found:perl - myとourとscopeと
[Perl] my と local と our の違いについて - TAKESAKOのはてな出張所

 Yoshioriさんのエントリの言葉が、それぞれの特徴を端的に言い表していて面白い。ただ、分かりやすいのは、やっぱり竹迫さんの説明かな。

 僕自身が、この辺の local と my (と our)の違いが分かったと言えるようになったのは、「Effective Perl」の23章を読んでからかなぁ。「Effective Perl」は、local とか my とかで悩むぐらいに Perl に慣れた頃に読むと、役に立つ本だと思う。

Effective Perl (ASCII Addison Wesley Programming Series)
Amazon.co.jp: Effective Perl (ASCII Addison Wesley Programming Series): 本: ジョセフ・N. ホール,ランドル・L. シュワォーツ,Joseph N. Hall,Randal L. Schwartz,吉川 邦夫
[PR]
by fkmn | 2008-01-10 23:55 | IT


とあるWebアプリケーションエンジニアの日記
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
カテゴリ
以前の記事
ブログパーツ
リンク
検索
タグ
最新のトラックバック
プログラミングが「出来る..
from とりあえず9JP?
Genographic ..
from ナンジャモンジャ
ジュセリーノ
from ありの出来事
くちこみブログ集(ライフ..
from くちこみブログ集(ライフ)(..
以降、丁寧語で行こう!
from エッセイ的な何か
その他のジャンル
ファン
記事ランキング
ブログジャンル
画像一覧

fkmnの最近読んだ本 フィードメーター - フッ君の日常 あわせて読みたい AX