*1  プログラミング言語の機能を批判するのは言語のユーザを批判するのとは違うが、そうは受け取れない人がいても不自然ではない理由に付いての思いつき

昨日のことだが、某所で「Ruby信者ウザい」と言うサイトが話題になり、「わはは、こんな信者が実在するなら会ってみたいわ」と思って続きを読んだら例として引用されているのがこのBlogで吹いた。俺かよ。そもそもPerlやPBPを批判したつもりすらない上に私もPerlのユーザだし、Rubyは個人的に使いやすい場合が多いと言うだけで他人に無理に勧めたことも無いのだが…。

それはまぁ読み手の受け取り方だから私がどう言ってもしょうがない事だ、と言いつつ修行が足りないのでつい突っ込んでしまったが、どうしても分からないのは、いや状況や気持ちとしては想像がつくんだけど納得が出来ないのは、言語という「道具」を比較・批判すると、なぜすぐに言語「ユーザ」の批判として受け止められてしまうのか。言語はあなたじゃないんだし、「道具」に欠陥があろうが用を足せば問題ないんだし、そもそも同一人物が同時にPerlユーザかつRubyユーザであっても何の不思議は無いはず。

で、以下はいつも比喩は避けるべきと言いつつ比喩を書くので与太として読んで欲しいのだが、思いついたのは自家用車との比較。言語が車だとしてユーザがオーナーだとすると、「お前のオフ車じゃ高速をすっ飛ばせない。スポーツカーのほうが優れてるじゃん」と批判されたら確かにムッとするだろうし、「馬鹿か、お前の車じゃ山道走れないだろうが」と言いたくなるだろう。そう言う時に「オフ車もスポーツカーも両方乗って道で使い分ければいいじゃん」と言うのは正論だけど、そもそも車を複数所有すると言うのは誰にでもできることでは無いというのは事実だ。

話を言語に戻すと、「複数言語を学ぶ」のは個人的にはそうすべきだと思うし、別の言語を学ぶことで今まで使っていた言語をより理解することだって多いが、例えばPerlとRubyを両方学ぶのは、個人の限られたリソース、例えば勉強時間からしても、実は誰にでも出来るわけではない。だから苦労して手に入れた自分が乗っている車、いや「言語」を非難されたら、どうしてもそれを守る方向に思考が働いてしまうと言うのは自然な反応なのかもしれない。

逆に考えればプログラミング言語は、そうして己のアイデンティティの一部を委ねるほどに重要なものだと言うことでもある。それはプログラミングが「表現方法の一つ」である以上、実は自明なことなのかなとも思う。

*1  Webアプリ公開のリスクを知れ

PHPどうこうという部分はさておき、この主張の根本はここだよね。
WebアプリケーションをなめるなMatzにっき 2008-01-26
アンカテでも指摘されてる通り、Webアプリは「任意の第三者に向けて公開される」「脆弱性の被害を公開者が直接受ける」「公衆環境にも(踏み台として)被害が拡大する」と言う点で他の配布形態と比べてもリスクが非常に大きい。実際、phpBB あたりに脆弱性が出た時は乗っ取られ祭りになってたのは記憶に新しい。現在のWebアプリ作成はそれなりにきちんと勉強してないと容易に危ないものを作ってしまうし、入力値に総当たりして脆弱性を探すツールなんてものも存在している。なので、PHPに限らず、初心者がWebアプリをインターネット上に第三者がアクセス可能な状態で公開するのは今時はすごくリスキーだ。

とは言え、初学者のスクリプト言語学習なんて「ちょっと変えて動かして」と言うのを繰り返してなんぼだと思う。かつ、PHPを動かすには概ねウェブサーバが必要になる。Windows にローカルなWebサーバを立てるやり方もあるけど、それは多分あまり初心者向けとは言えないんじゃないのかなと思う。

第三者に公開せずに or 公開範囲を限定してWeb上で動かせる仕組み... それ、SNS で出来ないのかなぁ。PHP開発初心者用SNSを作って、外からは見えないようにしつつ、PHPを実行させられる環境を提供する、と言うのはどんなもんだろう。
もちろんPHPの動作権限は必要に応じて絞らないといけないし、可能であれば仮想化技術等でユーザごとの権限分離をするのもいい。更に凝るならウェブブラウザ上にphpコードエディタをいれて、勉強しながらコードを編集・実行できる仕組みがあれば便利そうだ。コードの共有や改善指摘なんかも出来るようにしとけば完璧かも。

Ruby だとそこまで立派なものではないけどtry ruby みたいなインタラクティブチュートリアルサイトや Rubular みたいな正規表現テストサイト程度はある。Codezinecodeなにがし あたりでやりませんか。それとも既にそういうコンセプトのサービスはあったりするのかな。

*1  folding.el

IRC で「emacs にソースコードの一部を折り畳む機能はあったかな」と言う話題になったのでちょっと探してみた。Debian だと emacs-goodies-el に入っている folding.el だが、これは折り畳みのためにマークをコメントとして入れないといけない。vim fold で言うところの foldmethod=marker 相当になるだろうか。

*2  outline-minor-mode, hs-minor-mode

ソースコードを syntax を基準にした block 単位で折り畳むのには、emacs21 標準の hs-minor-mode (hideshow.el) や outline-minor-mode が使えそうだ。

hs-minor-mode は名前の通り、特定部分を隠したり(hide)表示したり(show)する機能。標準では ruby の folding はサポートされていないが、hs-special-modes-alist に syntax のヒントを与えてやればいいようだ。このあたりはhs-minor-mode で ruby のコメントを折り畳む方法が参考になる。とりあえず
(add-hook 'ruby-mode-hook
          '(lambda()
            (hs-minor-mode 1)))

(let ((ruby-mode-hs-info
       '(ruby-mode
          "class\\|module\\|def\\|if\\|unless\\|case\\|while\\|until\\|for\\|begin\\|do"
          "end"
          "#"
          ruby-move-to-block
          nil)))
  (if (not (member ruby-mode-hs-info hs-special-modes-alist))
      (setq hs-special-modes-alist
            (cons ruby-mode-hs-info hs-special-modes-alist))))
と言う感じで行けるらしい。outline-minor-mode の方で設定するならcomp.lang.python の Code Folding with Emacs や bookshelf.jp の outline-mode 解説が参考になる。どちらにせよキーバインドが C-c @ C-[osaw] 等と指がつりそうなので、何か使い易いものにバインドしなおすのが良さそうだ。

ちなみに C/C++ で #ifdef ... #endif を隠すには hide-ifdef-mode と言うのが使える。html の特定要素を自動的に fold してくれる html-fold.el と言うのも便利そうだ。

と色々並べてみたものの、 vim の folding にそのまま匹敵しそうな機能は見付けられてない。とは言え hs-minor-mode は便利なので常用することになりそう。

*1  プログラマとその他の人々との断絶

プログラムを殆んど書かない人と話していて感じるのは、彼らはソフトウェアをブラックボックスとしてしか扱わないと言うこと。なのでトラブルがあっても「Aの場合はB」「Cの場合はD」と言うケースが統合できない。

せめて情報処理に関わる技術者はある程度のプログラム素養を持つべきだと思うんだが、上流工程ほど本当に知らない人が多い事に悄然とする。本来は彼らこそがプログラマとビジネスの橋渡をすべきで、そのためには両側に立脚点を持っていないといけないはずなのだが。

tryruby の中身

Posted by yoosee on Web at 2005-12-19 23:42 JST

*1  Try Ruby の裏側

Ruby のチュートリアルを Webページ上でキーボード・インタラクティブに行うことができる Try Ruby と言うページがあるのだが、IRC で「チュートリアルでの問題間の遷移などをどう制御しているのかな」と言う話が出たので調べてみた。問題も解答も全ページが index.html の中に書かれていて、それを JavaScript で寸断するパターンのようだ。

ざっと見てみると、<dev class="stretcher">...</dev>と言う要素内がページのワンセットで、ページの読み込み時に document.getElementsByClassName("stretcher"); のようにして配列として保持している。その中に包含された要素として <dev class="answer">...</dev> または <dev class="stdout">...</dev> があり、これがページ遷移を判断するキーワード (Tutorial 各ページの解答) として機能している。/js/mouseIrb.js が irb を実行するサーバと asynchronous に通信 (所謂 Ajax) をしており、その戻り値に対して if ( str.match( new RegExp('^\s*=> ' + match + '\s*$','m') ) )と言う感じで answer ないし stdout と正規表現マッチを見て、マッチすれば次のページに進むと言った仕組みになっている。

この方式のメリットは html を書き換えるだけで好きなだけチュートリアルページを作れること。日本語にするのも文章だけならなにも考えずに html を書き換えるだけだな。非常に良くできてる。

*2  JavaScript のライブラリ

ところでやはりこの JavaScript にも prototype.js が使われているようだ。他にも moo.fx が使われていたり、 mouseApp.js としてインタラクティブな部分をライブラリ化していたりする。こうした抽象化レイヤがあると JavaScript も結構読みやすい。

Flickr の作り方

Posted by yoosee on Web at 2005-10-25 23:42 JST

*1  Flickrシステム概要

色々と興味深い資料。と言いつつも、最近の WebApp 作成トレンドそのままだなと言う感もある。正直言えばもっと大規模なシステムかと思っていたんだが、意外とコードも設備もコンパクト。自分のメモを兼ねてざっと抜き出す。
  • Flickr は プログラマ1人、デザイナ1人で開発されていた
  • php(Smarty, PEAR)、perl, ImageMagick, MySQL4.0/InnoDB に一部 Java で、環境は RHL + Apache2 と言う由緒正しい(?) LAMP 構成
  • 25,000 DB transcations/sec, 1,000 pages/sec
  • SOAP や XML-RPC, REST の実装が重要視されているのも Web2.0 的
  • php 60,000行に template 60,000行
  • PEAR は XPath も無くて stupid 、php4 sucks! (でも Stateless だから素晴らしい) とか言ってる
  • 全ての箇所で UTF-8 を使っているから CJKV も OK だぜ、みたいな
  • MySQL は Replication があるから Great だと言う話は はてなでも聞いたような。Master 1台が Insert/Update/Delete を担当して Select はあらゆる Slave に。しかし皆 MyISAM が好きだよね
  • daemon 化が必要な部分(FTPd)は (mem leak しやすい) php ではなく Java を使っている
  • Flash を使ったインターフェイスが cool だろ?
こう言う発表文書で cool を連発する辺りも、プログラマとデザイナが 1人ずつと言うのと相まって開発者の文化が伺えると言うか。

mixi2gmail

Posted by yoosee on Web at 2005-10-12 23:42 JST

*1  mixi2gmail

とりあえず trac なサイトに、mixi 最新日記を取得して htmlメールとして送信する mixi2gmail.rb の最新版を置いときました。利用には ruby 及び WWW::Mechanize (手元のものは 0.3.1) が必要。以前書いた通り、mechanize.rb を使って mixi 日記を取得 しています。html の変化に非常に sensitive なのでちょこっと仕様変更されても動かなくなると言うのがダサいですが、最近の仕様変更にも一応対応したつもりなのでそこそこ便利かなと。

*1  Amazon wishlist の公開 は IE6 だとエラーになってました

先日、Amazon の Wishlist を公開することを始めた。これは
<script language="JavaScript" src="http://..." > </script>
のようにして、src 側で document.write('....'); を出力する cgi を読み込んで表示するようにしたのだが、Firefox では動いていたものの、今日 IE6 で試してみたら表示時にエラーになってしまった。誰か教えてくれればいいのに(他力本願)。

他の部分で同様に document.write(); しているものは問題なく動いているようで、この Amazon wishlist の部分だけを削ってみるとエラーも消える。はて何が違うのだろうと見てみると、呼び出し元(この日記)ページが euc-jp なのに対して、この javascript は utf-8 出力なのが問題のようなのであった。試しに javascript を吐く cgi を euc-jp にしてみたらエラーが収まって正しく表示される。IE6 だと異なる文字コードの JavaScript を読み込むとエラーになることがあると言うことのようだ。ちなみに JavaScript 出力側は HTTP ヘッダできちんと
Content-Type: text/javascript; charset=utf-8
と出力しているのは言うまでもない。

*2  script 要素に charset 属性を指定する

しかしこれでは困るケースもあるだろうと Google で色々見てみたところ、どうやら script 要素に charset 属性を明示的に指定すれば解決するらしい。と言うことで
<script language="JavaScript" charset="utf-8" src="http://..." > </script>
のように書いたら IE6 でもとりあえず問題無く表示されるようだ。当面はこれで良しとしておく。そもそもこの日記自体を euc-jp で運用する必然性もそろそろ無くなってきてはいるんだけど。

mecanize.rb で mixi diary を自動取得する

Posted by yoosee on Web at 2005-09-02 23:42 JST

*1  WWW::Mechanize alike in ruby

WWW::Mechanize は Webページに対して、ブラウザからのアクセス的な処理を自動化して行える ruby library。例えば
http://example.com にアクセス → 1番目の form の各フィールドに foo, bar, baz を入力して submit → ページ内の "foo" を含む link を列挙してクリック → ページを取得
と言ったアクセスの動作を記述できる Ruby library 。元は Perl に同名の WWW::Mechanize があり、それの ruby 版と言った立ち位置のようだ。Web Test フレームワークで同様の機能を持つものは結構あるが、それをプログラム内から使えるようにライブラリ化したものと考えればいいかも。

*2  WWW::Mechanize alike in ruby を使って mixi にアクセス

mixi へ login した後に新着日記の URL 一覧をとるには、以下のようにすればいい。
require 'mechanize'
username = 'foobar@example.com'
password = 'foobarbaz'

agent = WWW::Mechanize.new {|a| a.log = Logger.new('access.log') }
page = agent.get('http://mixi.jp/')
form = page.forms[0]
form.fields.find {|f| f.name == 'email'}.value = username
form.fields.find {|f| f.name == 'password'}.value = password
form.fields.find {|f| f.name == 'next_url'}.value = '/home.pl'
page = agent.submit(form, form.buttons.first)

if /url=([^"])"/ =~ page.body
  link = 'http://mixi.jp' + $1.to_s
  agent.get(link)
end

diarylist = agent.get('http://mixi.jp/new_friend_diary.pl')
diarylist.links.each do |link|
  diaryurl = link.href # => 'view_diary.pl?id=12345&owner_id=2345'
end
といった感じ。page.body が html text を持つので文字列操作などをしたいときはこれを使うと良い。

*3  mechanize.rb と net/smtp を同時に require → トラブル

しかし便利なだけかと思ったら微妙な落とし穴と言うか不具合が。mechanize を使いつつ net/smtp を使うと、Net::SMTP.start(host) ... が
/usr/lib/ruby/1.8/net/smtp.rb:393:in `do_start':
private method `open' called for Net::InternetMessageIO:Class (NoMethodError)
などというエラーを吐くんである。net/smtp のみを使った場合はなんの問題もなく、mechanize を require すると発生する問題のようだ (さらっと書いているが突き止めるのに数時間かかった…)。

調べてみると、mechanize には mechanize/net-overrides/protocols.rb と言うファイルがあり、mechanize.rb の先頭で load-path に上記を追加している。これにより純正の net/protocols.rb が上書きされており、Net::InternetMessageIO を全く完全に再実装しているのがトラブルの元らしい。どうやら経過措置のつもりのようだが、少なくとも ruby1.8.2 の標準 net/protocols との組合わせでは mechanize は動作しない。結局 system から mailx を呼ぶという逃げを打ってしまったが、こんなのどう解決するのが正しいんだろう? 恐らくこのままだと net/smtp だけでなく、net/protocols を使う他の net/* ライブラリも影響を受けるだろうし、load-path をいじられてると分離も難しそう。mechanize 内部の require や Net::* を色々いじれば逃げられるだろうか。

*1  Tf Idf Ranking

特徴的単語の抜き出し方法。
nterm := あるドキュメント内のある単語の出現回数
maxn := ドキュメント内で最も出現頻度が高かった単語の出現回数
tf = 0.5 + 0.5 * nterm / maxn
idf = log2(ドキュメントの数/対象単語が含まれるドキュメントの数) + 1
log の底は任意に変えることで idf の重み付けを変更出来る
と言う数字で評価する。つまり「あるドキュメント内での出現頻度が高い(tf)」単語のうち「他のドキュメントにはあまり出現し無いもの(idf)」を「そのドキュメントに特徴的な単語」として扱うという考え方らしい。

とりあえず kakasi -w で単純な単語分割したものを Hash に放り込んで数え上げ、計算してみた。わりとそれなりに特徴的っぽい語句が抽出できて面白い。ただこれは idf の方で統計的な数値を見るから、ある程度ドキュメントの数を貯めないとちゃんとした数字が出ないな。そう言った意味でも bulkfeeds あたりに頼るのが良いのかも知れない。

ちなみにこの日記の本日分(ドキュメントの単位が日単位なので)の特徴的な語句は、「単語」「ドキュメント」「シシャモ」「特徴的」らしい。比較用ドキュメントはこの日記の今月分全てを使った。いい線突いてる気がする。

ニュース・トーキング

Posted by yoosee on Web at 2005-02-05 23:42 JST

*1  ニュース・トーキング

IRC bot 経由で hiki に URL の Clip を張り付けるサイトを作ってみた。Clip した各 hiki のページを Blog っぽく新規順にトップに表示する plugin と、Hiki に新規記事を del.icio.us like に投げる bookmarklet を併せて作ったんで、とりあえず自分が使うには事足りるかな。ad-hoc な部分がたくさん残っているのを直さないといけないけど、まぁ後でどこかにおいておこう。

*2  delicious の tag と hiki の keyword

これをつくる前は MyClip → delicious と言う変遷を経ている。MyClip はカテゴリが規定のものしか使えないのが激しく不便だった。delicious の tag は便利だと思うしやめる理由も特になかったけど、PC の前にいる時にはほぼ常に IRC の窓が開いていると言う私の状況からすると IRC 経由が一番楽。delicious API に投げる IRC bot を作っても良かったか。

今回は rice と hiki を使ったので、自前で新しく書いたのは 500行程度。これにも delicious のような tag が欲しいなと思い、hiki に機能追加しようかなと思って良く見てみたら keywords と言うページ情報があったのでそれをそのまま使う方向で。普通の hiki でも有効活用されてるんですかね? keyword で分類する plugin でも後で書くかな。

ruby-yaml の文字化け

Posted by yoosee on Web at 2005-01-02 23:42 JST

*1  コメント書き込み時の文字化け

この日記にコメントを書いて貰う際に文字化けとエラーが発生していて、なんだろうと思って見てみたらコメントデータの yml ファイルが文字化けしてました。HERE Document 的な >- 記述で記録されているようなんですが、utf8 の文字途中で改行されていて文字がぶった切られているという相当頭悪いことになってます。以前のサーバでは顕在化しなかった問題なんだけど、default charset とかそう言う問題なのかしらん。$KCODE="UTF8" を該当部分にいれておいたが、これで解決できるだろうか。

*1  ErrorDocument 404 と Google

この日記をさくらのレンタルサーバに移して以来、mod_rewrite が使えない関係で動的コンテンツを静的な .html ファイルに見せかけるために ErrorDocument 404 を使った飛ばしを使っていたのだが、どうもこれだと Google がちゃんとページ収集 / AdSense の表示をしてくれないっぽい。考えてみれば robot がアクセスに来て 404 を受取れば、そりゃこのページは無いものだとして無視するのが普通の挙動というものだ。

*2  mod_actions, Action directive

tDiary で html_anchor.rb を使う場合、mod_rewrite の次善策は mod_actions の Action directive らしい。さくらレンタルサーバFAQ を見ても、Action は問題なく使えるようだ。と言うことで早速
<Files ~ ".*\.html">
  Action text/html /d/index.cgi
</Files>
などとしてみたが、どうやらこれは実在しないディレクトリのファイルについては効かないようで、/d/archives/2004/12/25/001.html などのように階層表示にしているうちの場合は結局 404 が返ってしまうようだ。apache 2.1系 の mod_actions だと [virtual] と言う Option が取れるので、もしかしたらこれで行けるのかも知れないが、2.0, 1.3系には無い。空のディレクトリを予め大量に掘っておけば回避できそうだが、あまりにスマートさに欠ける気がする。

*3  Redirect permanent

仕方がないので一時的に archives/, category/ 以下のファイルは全て Redirect で CGI の動的パラメータ URI に飛ばすことにしたが、これだと Permalink と実際の Location URI が変わってしまうのが気持ち悪い。なにかうまい方法はないものか。ディレクトリを掘らずにフラットに html を置く構造にすれば良いのだが、今までの URI を変更するのもしゃくにさわる(CGI に Redirect している時点で既に破綻しているのだけど)。いっそ /d 自体を cgi にしてしまう手はあるのかな。どのみち mod_rewrite を使えれば何も悩まずに万事解決なのだが。

*1  ErrorDocument 404 を利用した Redirect

Bloglines で数日前から私の日記の RSS が取得失敗になっていて、普通のブラウザでは取得できるのに何故だろうと思っていたが、良く考えたら現在は
<Files ~ "^.*\.(html|rdf|xml)$">
  ErrorDocument 404 /d/
</Files>
などとして ErrorDocument 404 で動的生成 CGI に静的な URI Request を Redirect させている。この方法だと通常のブラウザならば 404 ErrorDocument として「Not Found」ページの代わりにこちらが用意した静的URIに対応するコンテンツを返せるのだが、アクセスした時点で 404 Not Found が返るのでクライアントによってはそこで取得をやめてしまうようだ。

*2  mod_rewrite, Redirect

本来は
RewriteEngine on
RewriteRule (.+\.(html|rdf|xml))$ /some/where/d/?id=$1
などとして RewriteRule を書きたいところだが、先日書いたようにさくらレンタルサーバでは mod_rewrite が使えず、サポートの返事でもこの先使えるようにする予定もないようだ。仕方がないのでとりあえず index.rdf や atom.xml に関しては
Redirect permanent /d/index.rdf http://yoosee.net/d/?id=index.rdf
Redirect permanent /d/atom.xml  http://yoosee.net/d/?id=atom.xml
と、Redirect parmanent して逃げておくことにする。Bloglines が Feed を取得失敗するのは回避できたようだ。もっと良い方法があるだろうか。

Net::SMTP->auth

Posted by yoosee on Debian at 2004-08-25 23:42 JST

*1  Net::SMTP

Perl で SMTP Auth の認証が出来たかどうかをチェックするツールを書いていて、Net::SMTP->auth(user,passwd) を使えば良さそうなので早速試した。しかし簡単なプログラムを書いてみても全く動かない。
#!/usr/bin/perl

use Net::SMTP;
my ($remotehost, $user, $passwd) = @ARGV;
my $smtp = Net::SMTP->new($remotehost, Timeout=>60, Debug=>0);
if($smtp->auth($user, $passwd) {
  print "SMTP Auth: success.\n";
} else {
  print "SMTP Auth: failed.\n";
}
$smtp->quit;
exit;
Debug=>1 にして SMTP のログを見ていたら、明らかに EHLO の直後に何も無しで QUIT して終わっている。なんだこりゃ、と perldoc -m Net::SMTP を見てみると
sub auth {
....
  eval {
    require MIME::Base64;
    require Authen::SASL;
  } or $self->set_status(500,["Need MIME::Base64 and Authen::SASL todo auth"]), return 0;
....
どうやら Authen::SASL が必要で、これが無いと set_status はするものの、表面的にはなにも言わずに AUTH 処理せず終了している。お陰で気付かなかったわけか…。わざわざ eval で例外処理しいるのが親切だか迷惑だかわからんなぁ。apt-get install libauthen-sasl-perl したら動いた。しかし都合上、出来れば perl 標準 module だけでこなしたかったんだが...

五月雨最新版

Posted by yoosee on Web at 2004-08-11 23:42 JST

*1  yoosee.wiki / 五月雨

Wiki の記述を小人さんが最新版にあわせて修正してくれたようだ。ありがたい。最新版(と言うかしばらく前の版から)では、Tempura ではなく HTree の Template 展開機能を使っている。Debian Package も出来ているようだ。私もそれに合わせて 自分のアンテナ を最新版 (Debian 0.0.20040611-2) に更新。template も htree 用に書き換えたので、wiki の記載もそれに合わせて修正した。

*2  エラー幾つか

初回の情報取得など、status.rm が空の状態でチェック先 URI が取得できないと、template の展開時に Nil::Nil を参照してしまいエラーになるようだ。これはとりあえずそうしたサイトを外しておけば良い。一度取得できてしまえば 2 度目からの取得エラーには問題無く対応できる。どこかを begin ... rescue で囲めば良さそうなんだけど追いきれてない。

もうひとつは -o オプションが正しく働かないことで、これはまぁ
      q.def_option('--output=filename', '-o', 'specify output file') {|filename| @opt_output = filename }
      q.def_option('--output-lirs=filename', '-o', 'specify output file') {|filename| @opt_output_lirs = filename }
と '-o' がかぶっているのが問題なのは明白なんだけど、longopt の方を使えば回避できるんでまぁいいや。後でレポートしてみよう。

携帯用 RSS Reader

Posted by yoosee on Web at 2004-08-10 23:42 JST

*1  PocketRSS Reader

京ぽんから使える RSS Aggregater が欲しかったので自分ででっち上げてみた。librss-ruby や open-uri を使って書いたら思ったよりは楽に書けたが、それでも通算半日くらいかかったか。CGI::Session の使い方を学んだのが成果かな。

一応、ユーザー登録も出来るようにしてみた。サイトの登録機能はなくて、登録後に余所から OPML を持ってきて upload するようになっている。Bloglines.com や普通の RSS Aggregater を使っている人ならば簡単に OPML を export 出来るだろうからまぁ良かろう。各所で設定して整合性がなくなるのも嬉しくないし。

ところで librss-ruby を使ったら当然のことかも知れないが Atom に対応していなかった。RAA で探してみても Atom 用のライブラリが見つからない。自前で書くのも鬱陶しいなぁ。と言うことで当面は Atom なサイトは読めません。

*2  bloglines.com/mobile/

コメント を貰って見てみたら... ちゃんと bloglines にモバイル用のページあるじゃん! _| ̄|○ もちろん Atom も読めるし未読管理も出来るし JavaScript では無いので w3m からも読めるし購読管理も簡単だし、こっちを使った方が 12.8 倍くらい便利です。あーまぁ色々勉強になったから良しとするよ... せつないので設置だけはしばらくはしておこう...

*3  BlogWatcher

HTree みたいに html 構造を解析して、日付情報やキーワードを拾ってくれるものらしい。しかしこういうテーマで論文書けて IPA 未踏もとれるのか...

keitairc と private channel

Posted by yoosee on Web at 2004-08-01 23:42 JST

*1  keitairc

以前から ! で始まるチャンネルの会話を取りこぼしているなと思っていたのだが、on_irc_public の内容を print させてみても、そもそも会話自体が POE::Component::IRC の irc_public に流れてきていないことが判明。どうやら IRC 的には ! なチャネルの会話は public ではなく private として扱われるらしい。とりあえず
POE::Session->new(
   irc_public => \&on_irc_public,
+   irc_msg => \&on_irc_public,
   ....
として irc_msg のイベントをそのまま流してやれば会話は追えるようだ。弊害が無いといいんだけど。個個人間のプライベートメッセージも扱えるようにしたいんだけど、UI をどうするかとか微妙よね。

*1  ラーメンズ第14回公演「Study」ビデオ

うわー、なんで今更ビデオなんじゃーぼけー。DVD 出るのを待ってたのにー。つーか ラーメンズ第13回公演「CLASSIC」 の方も VHS なんだよなー。なんでなんだよ。過去のは DVD でも出てるのに。
はっ、まさか VHS で出して摺りきれるまで見た頃に DVD を出す作戦じゃ...

Ruby で Network Daemon を書く

Posted by yoosee on Debian at 2004-07-15 23:42 JST

*1  ruby で network daemon まがい書き

仕事の検証で、あるソフトがどうプロトコルを喋っているかを生で見る必要が出たので Daemon をでっち上げた。Ethereal ないし tcpdump -w で packet 落して TCP Stream を見ても良かったんだけど、他に色々やりたい事もあったので。
require 'socket'
require 'thread'
listen=TCPServer.new('',PORT)
while(socket=listen.accept)
 Thread.new{
  while(line = socket.gets)
   ... socket.puts ... 
  end 
 }
end
しただけ。これぞ Lightweight Language の醍醐味か。実際にはそのプロトコルのサーバ側も実装したので 1 時間くらいはかかったかな。しかし C++ とかで全部自前で書いてた頃と比べたらものすごい楽だよなぁ。

おちゃにっき

Posted by yoosee on Web at 2004-02-25 23:42 JST

*1  人口無能に日記を書かせてみることにした

昨日立てた IRC 人口無能 bot 「おちゃ」に、おちゃにっき を書かせてみた。IRC 内で出た URI からネタを引っ張ったり、任意の単語をネタにして適当に関連付けて tdiary フォーマットの日記を生成する。しかし IRC は複数人数の「会話」文なので、1 人の発言者のみによる「日記」にしてしまうと不自然さが目立つな。まぁそう言うレベルじゃなく変と言うか躁状態な人みたいにみえるけど。

まぁおちゃがいつまで日記を続けるはか分かりません。しかし学習・発言ロジックとかは純粋に面白いな。

About W.W.Walker

World Wide Walker は yoosee による blog です。PDA, Web・サーバ技術, 美味しい食べ物などの話題を取り上げています... read more

Monthly Archives

Select Month to read
  

Ads

Recent Entries

Related Sites