コンピュータやソフトウェアのあれこれ@道民(&元道民)
Archive for 10月, 2011
[#tqrk04][Ruby][tokyurubykaigi04]TokyuRuby会議04に行って来ました
10月 30th
以前から、「酒」「肉」「飯」とかプレミアムモルツ祭りという単語でしか聞いたことがなくて、
若干恐れていたTokyuRuby会議04に行って見ました。
昼からビールを飲むのに夢中で、写真を撮るのをすっかり忘れていたんですが、
今思うと凄惨な光景も一部あったので撮らなくてよかったかな、なんて思っています!
しかし、スタッフの方もゆるりとしていたところがあって
こんなRuby会議もあるんだなぁ、とか、会場の後ろに矢沢永吉が飲んでる垂れ幕があって
異様な光景だなぁと思ったことがとても印象に残っています。
じゅーんお兄さんや、いがいがさんや、さくたつさんとお話できたことがとても今回はよかったと感じていて、
「自分が今いるSIerの会社と、Ruby界隈で楽しく働いている方々という両極を見ているんじゃないかな」
というよう内容をじゅーんお兄さんからコメントいただいて、
どちらも体験してみるということがよいのではないかという意見をいただきました。
最近の思うところのコアな部分はまさにここらへんであって、
キャリアパスについての視点を広げられたことや、
どんなエンジニアが求められているのかという点を少しでも垣間見れたのがよかったと感じています。
毎回Ruby会議にはいろんな出会いや、パワーをもらっています。
ありがとうございます。
iPhone4をiOS5に復元してみた
10月 29th
え?アップデートじゃないの??
って思いますよね、普通。
最初、自分もそのつもりで同期をとって、アップデートしてみたんですよ。
そしたら、まずバックアップ取られるんですよね。
まぁ、そんなもんかなーって思ってたんですよ。
ところがですよ、それからずっと復元中って表示されてるんですよ。
新しいファームウェアを復元中とか、iPhone Appを復元中とか、
iPhoneにデータを転送することを復元中って言ってるのか、
なんかよく分かんないけど、さっそく工場出荷時に復元されました。
それから再起動して、もろもろ復元しまして。
なんとか、iOS5に復元されましたとさ、
めでたし、めでたし。
そんなことより、iPhone起動時に求められたAppleIDで、
いつの間にかiCloudが設定されてたので、
そのつもりで入力することをオススメします。
おしまい。
Apache再入門のセミナーに行ってきました
10月 28th
10/26(水)に開催された、Apache再入門 ~LOCALインフラ部 ナイトセミナー~を受講してきました。
受講理由は講師がすもけさんつまずいたまま止まっている自宅サーバーをなんとかしたかったから。
実際に参加したら「自宅サーバー」ではなく「本番稼働しているサーバー」と日々格闘している人達がたくさんでした。
基本的なことを確認できたので、行ってよかったです。
Apache再入門
「Apacheは基本スキルの1つです」という言葉から始まったセミナー。
特に以下の2つの話が自分の役にたちそうです。
- 最低限やるべき基本設定の確認
- 最低限やるべきセキュリティ設定の確認
基本設定は「確か設定したな・・・」という感じでした。
セキュリティ設定は「危ないと思って確か・・・設定した・・・と思う・・・」という感じです。
項目は全部ノートにメモしたので、早急に自分の設定を確認したいと思います。
確認したら、またブログに書く。
この他にパフォーマンスのお話もしてくれたけれど、自分は何も公開していない状態なので、パフォーマンスについて考えるのは、まだまだ先である。
インフラよろず相談
現場で働く人達からの質問に、現場で働く人達が答えるコーナー。
「どうやってスキルアップしていくか」はフィールドに関わらず、皆思うことなんだなと共感しました。
是非、第2回も開催してほしいです。
私のサーバーが安定稼働する日が近づくように、勉強したい。
第7回アジャイルサムライ読書会 @札幌道場 開催
10月 28th
第7回アジャイルサムライ読書会 札幌道場を開催しました。
参加者は6名。
だんだんと実践的な内容になっていくにつれ、本に書かれている「お客さん」と私たちが今一緒に仕事をしている「お客様」とのギャップが大きくなってきました。ディスカッションもそこが中心になっていきました。
今回の範囲で「グっときた」ところ
最近、そんなまやかし、錯覚を見た(起こした)ばかりだったので、グっというかグサッときました。
たとえどんなに短期的に開発速度を向上させたとしても、品質を犠牲にすることで成立している取り組みなのであれば、それはまやかしでしかない。一時的な錯覚に終わるだろう。
目に見えるようにすることは私たちがやらなければいけないことだな。と感じたところ。
目に見えるようにして、具体的に指させるようにすることでしか、どれが本当に顧客にとって重要なのかを本当の意味で理解することはできん。
読書会として
進んだのは2センテンス。ページにして11ページとちょっと。
- 5.3 期間を見極める
- 5.4 何を諦めるのかをはっきりさせる
どちらも、濃かった。現実との差異が大きい部分だったからだと思う。
「提案する計画がコミットメントではないことをお客さんに理解してもらう」
「お客さんにどれかを諦めてもらう」
どちらも、本当に難しく、現実、なかなかできない。
でも「難しいよね」で終わったら、何もはじまらない。
ディスカッションも「お客さんに理解してもらうため、我々ができることは何か」が中心になっていました。
その場でうまく伝えられたかわからないけれど、
「お客さんのやりたいことを理解して、実際に形にできるのは自分達技術者だ」
という気持ちを、どんなプロジェクトでも(は難しいけれど)忘れないようにしたい。
その気持ちが持てないプロジェクトであることが多いから、往々にして心折れることがあるのだけれど、
それでも、この気持ちを持てるようなプロジェクトに出会えるまで、そんなプロジェクトを作れるまで、頑張っていかないとな、と思いました。
現実すぐに出会うことができなくても、私には今準備すべきこと、もっと学ばなければいけないことがたくさんある。
ディスカッションの内容はGitHubのwikiにまとめてあります。
運営の立場で
安定したメンバーに支えられているのもあり、本当に気負いなく運営できています。
wikiを書きつつも、きちんとディスカッションにも参加できるようになってきました。
しかし、今回はwikiをまとめるのが大変だった。
まとめる作業というより、考えを整理してwikiに載せるのが。
お客さんについての話で頭がいっぱいになっていて、現実との違いが大きすぎて、wikiをまとめ始めるとき「アジャイルってなんなんだろう、夢なんだろうか」という疑問が生まれてきていました。
でも、まとめながら、頭がほぐれてきて、「今自分たちが”こうであってほしい”と思う方向と、アジャイルサムライに載っている圧倒的なアジャイル開発の極意、”めざすもの”」は同じものだな、という共通点が見えてきた。
そして、「アジャイルサムライに書かれていることすべてを実践できなくても、こういう形なら取り入れられるかもね、ということをディスカッションで話しているんだなー。」「今、答えが出ていなくて当たり前。」「これからやることがたくさんある状態なんだ」というような頭の整理ができてきました。
や、整理されてないけど。
カオス状態からは抜け出せた気がする。wikiをまとめてよかった。
最後に。毎回会場を提供していただいた弊社に感謝。
ありがとうございます。
次回もよろしくお願いします。
Ruby勉強会@札幌-20に参加しました
10月 28th
10月22日(土)に開催されたRuby勉強会@札幌-20に参加しました。
今回は一般発表が2本。すごく刺激を受けました。
ナイーブベイズによる医学診断プログラムの試作
医学部の学生である千葉さんによる発表。
医学診断プログラムについての話なのですが、プログラムを試作するに至った動機やモチベーションの話にすごく刺激を受けました。
- 作りたいという物があった
- 作ろうと思った
- 作った
単純に見えるけど、その動機と行動力、そして3ヶ月で形にしてしまうパワー、すごいと思いました。
これを作りたい、という気持ちがあるというのは本当に強い。
興奮覚めやらない自分の投稿です。
RubyConf
mrknによるRubyConfを動画と写真で振り返りながらのレポート。
実際にmrknさんが会場で発表したセッションも聞けました。
言語を愛している人達が集う熱気あふれる場所の空気に触れました。
写真のみなさんの表情が生き生きしていました。
小柴さんのLTを皆で見たのですが、とてもよかった!
懇親会
初めて「はちきょう」で「つっこめし」を食べた記念。美味しかった。贅沢!

懇親会でも千葉さんをはじめ、いろんな人とお話ができました。
(jsで困っていることを相談できてよかった。)
刺激的でとても楽しい時間でした!
[perl][perl+web][hokkaidopm]Hokkaido.pm #6 は 12月10日 です
10月 26th
Hokkaido.pm #6 への参加申し込みはお早めにどうぞ。
今回は、懇親会の1次会までの参加です。今回は@sugyan さんの参加が確定してますし、@nekokak さんもスケジュールがあえばいらっしゃるようです。純粋にスキルアップを狙う人はもちろん、Perlを使っていたりWEB開発をしていたりする仲間と酒飲んで語りたいって動機だけでも十分だと思いますので、北海道にお住まいの方は参加してみてはいかがでしょうか。
Hokkaido.cap #7 に参加してきました
10月 26th
10/21(金)に行われた、パケットの中身を解析して学ぶ Hokkaido.cap #7に参加しました。
CTFの問題を自力で解くことができたことが一番嬉しかった!
ケーススタディ(セキュリティ解析:前編)
OSのフィンガープリント、ポートスキャン、プリンターの氾濫、FTPサーバーへの侵入という外部から攻撃を受けた場合のパケットがどのようになっているかについて勉強しました。
OSのフィンガープリント
フィンガープリントとは、TCP/IPの実装に関する特徴がOS毎に異なることを利用して、標的ホストのOSの種類を推測する手法のこと。
「Filter(ディスプレイフィルタ)」を使うことでパケットを絞込み、通常であればありえないICMPのtypeを表示させることで状況が把握しやすくなりました。
(ICMP type の0-12は普通に使用することがあるが、13以上は通常ありえないそうです)
ポートスキャン
外部に開放されているPortを調べるための手法。ポートスキャンされているときにどのようなパケットになるかを実際に見てみました。
ツールを使うとTCPもUDPもどのポートが空いているかすぐわかってしまうものなんだなあ。
プリンターの氾濫
ネットワークプリンタからおかしな物が印刷されているときに、パケットを解析することで原因を探ることができる、というケース。
明らかに特定のPCから異常な印刷命令が出ていることから、クライアントのPCがウィルスに感染しるのでは?という次の調査の行う手がかりを得ることができる。
FTPサーバーへの侵入
ディスプレイフィルタで「ftp.request.command」を使うと、FTPのコマンド名による絞り込みを行うことができました。
特定のコマンドに着目すると、PASSWARDを辞書攻撃していることがすぐにわかります。
CTFの問題にチャレンジ
はじめて自力で問題をクリアすることが出来ました記念。
次のような順番で考えました。
- まずは、パケットからExportできるオブジェクトが無いか確認する。
今回はzipファイルが2つ存在していたので、保存。 - zipファイルを解凍してみる。
1つは解凍でき、文字列のかかれたテキストファイルが出てきた。
もう一つは、PWが必要なzipファイル、上記テキストを入力しても解凍できない。 - ここで、パケットの解析に戻るとTelnetの通信があることに気がつく。
「Follow TCP Stream」でやり取りを確認する。 - base64のエンコード、デコードしている箇所がある
(あ、これ当たりじゃないかな) - さっきのテキストと同じ文字列をデコードしているよ!!!
(やったのか?) - デコードされた文字列で2つ目のzipファイル解凍成功。お宝写真をゲット
(ガッツポーズ)
LT
SINさんによる「癒し系ネットワーク機器をpingで起こす」。
登場したのは、自作したpingコマンド受信で起きる機械。
工作すごい!!!!!
細部のこだわり(寝るとか、寝起きの反応は少し遅いとか)が可愛らしかったです。
- MACアドレスの変更
プログラムした段階でMACアドレスを決めることができる - オフセット0でのMISCOMPAREエラー
ping で送られた物と違うものを返すようにしている(32byteの中身を書き換える)- プロトコルエラーになるよ
という、自分では絶対に得ることのできない発見を教えてもらいました。
次回は参加できない(旅行)のが残念だけど、ちょっとずつパケットが読めるようになってきたのは嬉しいです。
続けていきたい。
Web Audio APIはじめました
10月 25th
(function () {
var ctx = new webkitAudioContext();
//console.log( ctx );
var dst = ctx.destination;
//console.log( dst );
var buf = ctx.createBuffer( 1, 4096 * 4, ctx.sampleRate );
var data = buf.getChannelData( 0 );
for (var i=0; i<data.length; i++) {
data[i] = ( i % Math.floor(44100 / 440) );
}
console.log( data );
var src = ctx.createBufferSource();
//console.log( src );
src.buffer = buf;
src.connect( dst );
src.noteOn( 0 );
})();
なんか分かんないけど、こんな感じのコードで音が鳴った。
Canvasのように、まずcontextを取得するのは分かる。
W3CのAPIリファレンスを見ると、contextでいろいろ生成するみたい。
よく分かんないのでconsole.log()を使って、
何が入ってるのかChromeで確認しながら作業した。
(こういうとき英語読めたらいいなーって思う。)
とりあえず、エラーが出ないように、見よう見まねでコードを書いて、
きっと波形を入れればと思って、それっぽく初期化したら音が出た。
あと、Chromeでテストしてるけど、Chromeごと落ちることがあるらしく、
自分も1回落ちたけど、再現性はない。
下手なコードを書いたからとかじゃないらしい。
早くループさせたりフィルターをいじってみたいけど、
perlも待ってるのでバランス良くやる方向で。
おしまい。
10/26 追記
MacBookAirでスリープ解除してから
このスクリプト実行したらChromeごと落ちて、
そのあとは普通に音が鳴ったので、
このスクリプトは良くないのかも知れないです。
[perl][perl+web][math]Directing AE with Arrows
10月 23rd
@maki_daisukeさんに教えてもらったのを読んで実装してみた。
use strict; use warnings; { package AsyncArrow; use Scalar::Util qw/weaken/; use AnyEvent; use Exporter qw/import/; use Class::Accessor::Lite new => 1, rw => ['code']; our @EXPORT = qw/repeat done/; sub repeat_request(;$) { {repeat => 1, value => shift} } sub done_request(;$) { {done => 1, value => shift} } sub arr { my ($class, $f) = @_; $class->new(code => sub { my ($v, $progress, $cont) = @_; $cont->($f->($v), $progress); }); } sub compose { my ($self, $other) = @_; return (ref $self)->new(code => sub { my ($v, $progress, $cont) = @_; $self->code->($v, $progress, sub { my ($v, $progress) = @_; $other->code->($v, $progress, $cont); }); }); } sub run { my ($self, $v, $progress) = @_; $progress ||= ProgressArrow->new_without_args; $self->code->($v, $progress, sub { my ($v, $progress) = @_; return; }); return $progress; } sub repeat { my $self = shift; my $weaken_loop; my $loop = sub { my ($v, $progress, $cont) = @_; $self->code->($v, $progress, sub { my ($v, $progress) = @_; if ($v->{repeat}) { my $canceller; my $t = AE::timer 0, 0, sub { $progress->advance($canceller); $weaken_loop->($v->{value}, $progress, $cont); }; $progress->add_canceller($canceller = sub { undef $t }); } elsif ($v->{done}) { $cont->($v->{value}, $progress); } else { die } }); }; weaken($weaken_loop = $loop); (ref $self)->new(code => $loop); } } { package ProgressArrow; use parent qw/-norequire AsyncArrow/; use Scalar::Util qw/weaken/; use Class::Accessor::Lite rw => ['cancellers', 'observers']; sub new_without_args { my $class = shift; my $self = $class->new( cancellers => [], observers => [], ); weaken(my $weaken_self = $self); $self->code(sub { my ($v, $progress, $cont) = @_; push @{$weaken_self->observers}, sub { my ($v) = @_; $cont->($v, $progress); }; }); return $self; } sub add_canceller { my $self = shift; push @{$self->cancellers}, @_; } sub advance { my ($self, $canceller) = @_; @{$self->cancellers} = grep {$canceller != $_} @{$self->cancellers}; while (my $observer = shift @{$self->observers}) { $observer->(); } } sub cancel { my ($self, $canceller) = @_; while (my $cancel = shift @{$self->cancellers}) { $cancel->(); } } } use AnyEvent; use AnyEvent::Handle; sub inputted_line() { AsyncArrow->new(code => sub { my ($v, $progress, $cont) = @_; my $canceller; my $hdl = AnyEvent::Handle->new( fh => \*STDIN, on_error => sub { my ($hdl, $fatal, $message) = @_; $hdl->destroy; $! and warn "$message(fatal=$fatal)"; $cont->(); }, on_read => sub { my ($hdl) = @_; $hdl->push_read(line => sub { my ($hdl, $line, $eol) = @_; $progress->advance($canceller); $canceller->(); $cont->($line, $progress); }); }, ); $progress->add_canceller($canceller = sub { undef $hdl }); }); } my $cv = AE::cv; my $total_length = 0; my $p = inputted_line->compose(AsyncArrow->arr(sub { if (defined $_[0]) { $total_length += length $_[0]; print "INPUT: $_[0]\n"; AsyncArrow::repeat_request; } else { print "DONE\n"; AsyncArrow::done_request; } }))->repeat ->compose(AsyncArrow->arr(sub { $cv->send })) ->run; $p->compose(AsyncArrow->arr(sub { print "total length: $total_length\n" }))->compose(AsyncArrow->arr(\&AsyncArrow::repeat_request)) ->repeat ->run; $cv->recv;
ArrowsはGeneralising Monads to Arrowsにモナドの一般化として載ってます。ざっくり言えば、高階関数の圏の直積を保存するように作った、新たな圏への関手。
で、このJSの実装なんだけど、CpsA の実装までは美しいのに、 AsyncA の実装がイマイチな気がするんですよね。特に ProgressA って、状態をバリバリに持ってるSubject的なクラスなのに、AsyncA を継承して作る利点がイマイチわからず。
ただいま、Ethna
10月 23rd
みなさんお元気ですか。
僕はなんとか生きています。
今日は、久々の Ethna のお話です。
僕が Ethna を触り始めたのは 2004 年末、まだ高校2年生の頃でした。
そして 2007 年ころから rhaco を触り始めたので、それ以来の Ethna です。
つまり、4 年振り 2 回目。
話は変わりまして、この間、 Crocos で開発合宿に行って来ました。
軽井沢に 2 泊 3 日で。軽井沢で所持金 31 円とかたぶん僕だけだったんじゃないかなって思います。
せっかく開発合宿なんで、ちょっと楽しいサービスを妄想しつつ。
Crocos のサービスは基本的にすべて Symfony2 で作られていて、Symfony2 はよくできたフレームワークだなー。とは思ってるんですが、やっぱり開発スピードあがんないよねー。とか、ウェブサービスには向いてないよねー。とかの不満はあるわけです。まあ、お前の頭が悪いからといわれればきっとその通りなんでしょうけどね。
軽井沢まできて Symfony2 も触りたくないし、そうなるともう PHP 界には Ethna しか無いわけですよね。
というわけで、Ethna を使って開発を始めたんですけど、やっぱりテンプレートは Twig 使いたいよねとか、Ethna_UrlHandler とかまじ難しくない?とか、思ってきちゃうんですよね。いやほんと、UrlHandler は謎すぎて未だにわかりません。
ついカッとなった僕は、Ethna_Renderer_Twig と Ethna_UrlHandler_Simple を作りました。
そしてつい先程、Ethna の develop ブランチに Ethna_UrlHandler_Simple が取り込まれましたことをご報告致します。
Twig のほうはちょっとまだフォームヘルパとか半分くらいしか作れてないんで、もう少しかかるかなって感じですが、使ってみたい人は github においてあるので、お試しください。もちろん、残りのフォームヘルパ作ってくれたりしてもいいですよ!ね!!
使い方とか書こうと思ったけどめんどうだからやめます。
簡単に言うと、APPID_UrlHandler で Ethna_UrlHandler_Simple を継承するようにして、action_map の定義をこのへんを参考にして書けば OK です。
おやすみなさい。
