> 結城浩の日記 > 2007年4月 | 検索 |
プロフィール | 日記一覧 | 日記ダイジェスト | Twitter | RSS |
|
affiliate.amazon.co.jpの証明書が期限切れのようです。
追記(2007-05-02): なおってました。
午前中は礼拝。 お昼は家族みんなで外食。 午後からいろいろと買い物。 風が気持ちいい。 帰ってきてからお昼寝。 夜はありもので夕食。 お風呂に入ってからクロッキーを1つ(11分)。 忙しいような忙しくないような一日。
この間からちょこちょこ作っていたYuki::CGIを使って、 「Yahoo!ブログ」のRSSを表示するWebアプリを作ってみましたのでご紹介。
実際に動いているWebアプリは、以下にあります。
以下に、このWebアプリの全ソースを示します。
config.yaml
まずは、設定ファイル(config.yaml)です。YAHOO_BLOG_URLに、表示させたいYahoo!ブログのURLを書きます。
CHARSET: utf-8 TEMPLATE_DIR: ./template YAHOO_BLOG_URL: http://blogs.yahoo.co.jp/hyuki0000 CGI_URL: http://www.example.com/your/rssviewer.cgi CSS_URL: http://www.example.com/your/style/sheet.css DEBUG: 0
rssviewer.cgi
それから、rssviewer.cgiはCGI本体です。Perlで書かれています。
#!/usr/bin/perl # # rssviewer.cgi - Simple RSS Viewer. # # Copyright (C) 2007 by Hiroshi Yuki. # <hyuki@hyuki.com> # https://www.hyuki.com/ # # This program is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. # # use strict; use warnings; use lib './lib'; use CGI; use CGI::Carp qw(fatalsToBrowser); use LWP::Simple; use XML::Simple; use Data::Dumper; use Yuki::CGI; use Digest::MD5 qw(md5_hex); new Yuki::CGI('config.yaml')->run; exit; sub new { my ($class) = @_; my $self = { }; bless $self, $class; } sub do_default { my ($self, $c) = @_; my $rss_url = $c->stash->{YAHOO_BLOG_URL} . '/rss.xml'; my $response_string = get($rss_url); my $response_hashref = XMLin(\$response_string); # $c->error(Dumper($response_hashref)); $c->stash->{CHANNEL_TITLE} = $response_hashref->{channel}->{title}; $c->stash->{CHANNEL_DESCRIPTION} = $response_hashref->{channel}->{description}; $c->stash->{CHANNEL_LINK} = $response_hashref->{channel}->{link}; my $item_arrayref = $response_hashref->{channel}->{item}; for my $item (@$item_arrayref) { my $link = $item->{link}; if ($link =~ m{/([^/]+)\.html$}) { $item->{ITEM_ID} = $1; $item->{ITEM_PERMALINK} = $c->stash->{YAHOO_BLOG_URL} . "/$1.html"; } } $c->stash->{ITEM_LIST} = $item_arrayref; $c->debug(Dumper($item_arrayref)); $c->output('do_default.txt'); } __END__
template/do_default.txt : テンプレートファイル(1)
template/do_default.txtには、表示されるWebページのテンプレートを書きます。
<TMPL_INCLUDE NAME="html_begin.txt"> <h2 class="section">Contents</h2> <ul> <TMPL_LOOP NAME=ITEM_LIST> <li> <a href="#i<TMPL_VAR NAME=ITEM_ID>"><TMPL_VAR NAME=title></a> </li> </TMPL_LOOP> </ul> <TMPL_LOOP NAME=ITEM_LIST> <h2 class="section"> <a name="i<TMPL_VAR NAME=ITEM_ID>" id="i<TMPL_VAR NAME=ITEM_ID>"><TMPL_VAR NAME=title></a> </h2> <div class="item_body"> <TMPL_VAR NAME=description> <div class="item_info"> <b><TMPL_VAR NAME=title></b><br /> <TMPL_VAR NAME=pubDate><br /> <a href="<TMPL_VAR NAME=ITEM_PERMALINK>">permalink</a> </div> </div> </TMPL_LOOP> <TMPL_INCLUDE NAME="html_end.txt">
template/html_begin.txt : テンプレートファイル(2)
template/html_begin.txtはdo_default.txtから読み込まれるもの。
Content-type: text/html; charset=<TMPL_VAR NAME=CHARSET> <?xml version="1.0" encoding="<TMPL_VAR NAME=CHARSET>"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Language" content="ja" /> <meta http-equiv="Content-Type" content="text/html; charset=<TMPL_VAR NAME=CHARSET>" /> <meta http-equiv="content-style-type" content="text/css" /> <link href="<TMPL_VAR NAME=CSS_URL>" type="text/css" rel="stylesheet" /> <title><TMPL_VAR NAME=CHANNEL_TITLE> - RSS Viewer</title> <style type="text/css"> div.wiki { line-height: 140%; } div.item_body { padding: 1em; } div.item_info { margin: 1em; text-align: right; font-size: small; } </style> </head> <body> <div class="titles"> <h1 class="title"><TMPL_VAR NAME=CHANNEL_TITLE></h1> </div> <p class="summary"> This page is automatically converted from RSS feed. <br /> Original blog: <a href="<TMPL_VAR NAME=YAHOO_BLOG_URL>"><TMPL_VAR NAME=YAHOO_BLOG_URL></a> </p>
template/html_end.txt : テンプレートファイル(3)
template/html_end.txtもdo_default.txtから読み込まれるもの。
</body> </html>
lib/Yuki/CGI.pm : Yuki::CGIモジュール
で、肝心のYuki::CGIです。
package Yuki::CGI; # Copyright (C) 2007 by Hiroshi Yuki. # <hyuki@hyuki.com> # https://www.hyuki.com/ # # This program is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. use strict; use warnings; use HTML::Template; use Data::Dumper; use CGI; use CGI::Carp qw(fatalsToBrowser); use YAML::Syck; use vars qw($VERSION @ISA); $VERSION = "0.0.1"; @ISA = qw(CGI); my %config_default = ( APPLICATION_PACKAGE_NAME => 'main', DISPATCH_COMMAND_NAME => 'mycmd', TEMPLATE_DIR => '.', CHARSET => 'utf-8', LOG => '', ); sub new($$) { my ($class, $config_file) = @_; confess("Config YAML file is not specified. Try \'new Yuki::CGI(\$config_yaml_file)\'") if not $config_file; confess("Config YAML file ($config_file) is not found") if not -e($config_file); # Setup config. my $config = YAML::Syck::LoadFile($config_file) if $config_file; for my $key (keys %config_default) { $config->{$key} ||= $config_default{$key}; } # Setup self. my $self = $class->SUPER::new; $self->charset($config->{CHARSET}); $self->{stash} = $config; $self->{cgi} = new CGI; bless $self, $class; } sub run { my ($self) = @_; my $mycmd = $self->param($self->stash->{DISPATCH_COMMAND_NAME}) || 'default'; $mycmd =~ s/\W//g; my $method = 'do_' . $mycmd; my $pkg = $self->stash->{APPLICATION_PACKAGE_NAME}; { no strict 'refs'; my $instance = $pkg->new($self); $instance->setup($self) if exists ${${pkg}.'::'}{setup}; $instance->$method($self); $instance->teardown($self) if exists ${${pkg}.'::'}{teardown}; } $self->show_log_if_debug; } sub output($) { my ($self, $template_filename) = @_; my $template_dir = $self->stash->{TEMPLATE_DIR} || '.'; my $template = HTML::Template->new( filename => "$template_dir/$template_filename", die_on_bad_params => 0, global_vars => 1, %{$self->stash->{TEMPLATE_SETTINGS}}, ); $template->param(%{$self->stash}); print $template->output; } sub exit { exit; } sub error { my ($self, @args) = @_; my $msg = join('', @args); print $self->header( -expires => 'now', -charset => $self->stash->{CHARSET}, ); print $self->start_html('Error'); print $self->h1('Error'); print $self->start_pre; print $self->escapeHTML($msg); print $self->end_pre; $self->show_log_if_debug; print $self->end_html; CORE::exit; } sub show_log_if_debug { my ($self) = @_; if ($self->stash->{DEBUG}) { print $self->h2('DEBUG'); print $self->start_pre; print $self->escapeHTML($self->{LOG}); print $self->end_pre; } } sub debug { my ($self, @args) = @_; $self->{LOG} .= localtime() . " [debug] " . join("", @args) . "\n"; } sub stash { my ($self, @args) = @_; if (@args) { my $stash = @args > 1 ? { @args } : $args[0]; while (my ($key, $value) = each %$stash) { $self->{stash}->{$key} = $value; } } return $self->{stash}; } 1;
以上です。
改善案などは、
feedbackのフォームなどから送っていただけるとうれしいです。
それPlaggerで…はいはい、そうですね。(^_^)
追記:気づいたこと・教えてもらったこと
[COM] 今朝もクロッキーから(018.txt, 16分, 2484バイト)。
[WS] プログラムはできたので原稿書き。
今日は、夕方になってからクロッキーのような文章書き(結城浩のYahoo!日記のしたごしらえ用)を行った。 この文章はおそらく一週間後くらいに清書した後に公開することになる。
ちょっと改めてこの文章書きについて書いてみる。 いま、三段階を経て公開している。
この方法が結構楽しいのは、あまり悩まないから。
メモは、思いついたときに思いついたことを書くだけ。
クロッキーは、題材が決まっていて、とにかくそれについて書けばよい。 構成や校正は気にせず、とにかく思いついたことをどんどん書く。
清書は、基本的に無駄を削り、テーマを絞っていく。 そして読み返し、言葉が不足しているところをテーマに沿って補う。 書いたときの思い入れはだいぶ失われているから、思い切ってばっさり削れる。そこが良い。
この次の段階としておそらく、組織化が出てくるような気がする。 「組織化」では、たくさんの清書を通し読みして、分類し、 共通の「何か」を抽象化する。そしてその「何か」に沿って全体を再構成する。
こういう文章の書き方は初めてなので楽しい。Web連載だから試みることができる方法かも。 「清書」の段階で、いちおう他の人にも読んでもらえるレベルまではまとめなければならない、というのが重要ですね。
…しまった。こういう執筆話もあっちのブログに(以下略
何となく、以下と似ている匂いを感じた。
2007年4月19日に「プレオープン」していた「結城浩のYahoo!日記」が Yahoo!のオフィシャルブログになりました。 ということで、改めてオープン!です。
いまのところは「コミュニケーションのヒント」がメインで文章を書いています。しばらくはほぼ毎日更新していくつもりですが、そのうちにペースを変えていくことになると思います。最低でも毎週一回程度は更新していくと思いますので、ぜひRSSリーダへの登録をお願いいたします。
この企画はYahoo!デベロッパーネットワークさんからのご依頼です。 感謝します。
午前の仕事の一番始めはWeb連載
(結城浩のYahoo!日記)の原稿書き。
クロッキーのような文章書き。
14分。
すでにWebで公開したのは9本。
ストックは6本。
別にたくさん書いたから原稿料がたくさん入ってくるわけではない。(^_^;
ではなぜ書いているかというと、楽しいから。
その後続けて連載用のプログラムを書く。楽しい。 少し前からYuki::CGIを使ってプログラムを作り始めた。 …書きやすいじゃん! まあ、自分が書きやすいようなモジュールを作ったのだから当然なのですが。 ちょっとお化粧直しをして、あと一つくらい機能を追加したら、プログラムの修正は終わりにしよう。 残り作業は、
くらいかな。まあまあ予定通り。 突発的な事故がなければ大丈夫でしょう。
家に遅く帰ったら、食卓で家内が真面目な顔で書き物をしていた。 私が「あなたはなかなか素敵だね」と言うと、 家内は顔を上げて「あなたも素敵よ」と言った。
連載用のプログラムを書いている。楽しい。
Web連載用の文章を書いている。楽しい。
結城浩のYahoo!日記に対して読者さんからのフィードバックをぽつぽついただく。 ありがとうございます。 プログラミングの記事とはまたひとあじ違った感想をもらえて、 なかなか楽しいですね。
現在はWeb連載をはじめたばかりで、 いわばプロモーション中なので、毎日更新しています。 でも、そのうち頻度を減らすと思います…たぶん。
実際は「週に一回書く」よりも「毎日書く」ほうが楽なんですよね。 楽しいし。
この間考えていたYuki::CGIの「保存をどうするか」の続き。 たまにはファイルベースではなく、RDBMも試さなくちゃ。 ということでTie::DBI + DBD::SQLite2という路線を考えてみる。 これでプログラム側はハッシュを意識するだけで済む(RDBM試してないじゃん)。
ある会社の開発リーダをなさってる方から、 『Java言語で学ぶリファクタリング入門』の感想文をいただきました。 以下、許可を得て公開いたします。
読者さんから リファクタリング入門本編を読み終わりました。今は、付録を読み中です。 久しぶりに結城さんの本を読んだのですが、やっぱり分かりやすい&読みやすいです。 本編が終わったところで、「えっ、もう終わり、もっと読みたいなぁ」と思いました。 今、会社のプロジェクトでJavaで書くのですが、開発の反復の際に、 リファクタリングを予定していて、 メンバには結城さんの本を読んでもらおうと考えています。(一応開発リーダしてます(^^;) これから結城さんの「デザインパターン入門」を読み返そうかと思っています。 すばらしい本をいつも書いてくださり、ありがとうございます。
結城から
とてもうれしいメッセージをありがとうございます。 プロジェクトがスムーズに進みますように応援していますねっ!
プログラマの方、もしくはプログラミングに興味のある方に質問です。web上の文章でこれは読んでおいた方がよい、あるいはこの文章は面白いという文章を教えてください。文学、エッセイ、哲学、宗教、経済、科学、コンピュータ等、分野は問いません。 例:http://cruel.org/freeware/hacker.html
という質問が「はてな」のほうに出ていて、 いきなり最初の回答として、結城のサイトが「読み物がたくさんあります。どれもお勧めです」と紹介されていました。 紹介してくださったsleepy_yoshiさん、感謝します。
で、その回答経由でたくさんの方がwww.hyuki.comにいらしているようです。
い、いらっしゃいませ(緊張している)。
え、ええとですね。 「読み物」をお探しの場合には、以下を探っていただけるとよいかと思います。 よろしくどうぞ。
午前の仕事の一番始めはWeb連載 (結城浩のYahoo!日記)の原稿書き。 クロッキーのような文章書き。 10分。 うん、だいぶ慣れてきた。慣れてくるとルーティンワーク風になってくるから、 少しずつ文章を変化させてみる。 Web連載は雑誌連載よりも冒険ができるから、いつもと違うトーンの文章も試してみよう。
「結城浩のYahoo!日記」のデザインがいまいちだ、 というご指摘を読者さんからいただきました。 ごめんなさい。 Yahoo!ブログを使うというのがお仕事の条件の一つなのです。 文字の色が淡すぎて読みにくい部分は、近日中に改善します。 今週木曜日(26日)にYahoo!のオフィシャルブログとしてデザインが変わりますので、 そのときに文字の色は黒になります。 色以外にもあちこち気になるところはある(マークアップなど)のですが、 直せる範囲で直していきます。
その他にも、 アルファブロガーのotsuneさんから 「早速ですがtitleタグに「結城浩のYahoo!日記、プレオープン!」というのが入らないのをYに指摘してください」 とご指摘を受けています。ご指摘感謝。 「titleタグに記事タイトルが入らない」という問題は、 すでにYahoo!ブログの「中の人」に伝えています。 でも、対応は未定らしいです。
内容に関しても、いろんなフィードバックをいただいています。 みなさん、ありがとうございます(^_^)。
RSSリーダをお使いの方は、ぜひ 「結城浩のYahoo!日記」の登録をお願いいたします。RSSフィードのURLは以下です。
http://blogs.yahoo.co.jp/hyuki0000/rss.xml
何だか今日は強風でしたね。 午前中は礼拝。 お昼は野菜たっぷりのサラダランチ。 午後からお昼寝。起きてから掃除機を掛けたり片付けものをしたり。
ソファに寝転がって『数学ガール』の原稿を読んでいると、奥さんが通りかかったので、 「ねえねえ、このエピグラフ(章はじめの引用文)面白いよ」と、ある一章分の束を渡した。 奥さんは「かっこいい!」と言った後、続けて読み始めた。 ソファに座り、章の終わりまで読んで「おもしろいね」と言った。
私「へえ…おもしろかった?」
家内「うん、おもしろかった。数式は飛ばしたけど。これ、ネットで公開してるの?」
私「一部ね。本にするときにずいぶん書き直したり、新しい章を加えたりしているけれど」
家内「ネットで読んだ人『おもしろい』って言ってるんじゃない?」
私「うん、みんなおもしろいって言ってる」(まあ「おもしろくない」ってわざわざ言う人はいないと思うけど…)
家内「そうでしょう。あなた、小説書く才能あるわよ」
(奥さんからすごい励ましの言葉をもらってしまった!)
私「ありがとう。どういうところが良かった?」
家内「何ていうか、楽しくすらすら読めちゃうところかなあ。これまでの本とちょっと違うね」
私「まあ、これまでの本は説明のための本だからね。テトラちゃん、可愛くない?」
家内「うん。可愛い可愛い」
午前中、私以外の家族がそれぞれの用事で外出したので、何となくリコーダーを吹く。 Audacityで多重録音を試みたけれど、なぜかどうしてもタイミングがずれてしまうなあ。 同じ一本のリコーダーで二重奏をするのだから、音程と音色は非常に合う。 それだけにタイミングのずれがとても気になってしまう。
連載記事のためのプログラムを書き始めた。 Webサービスって楽しいなあ。
結城は近々、 Rubyのまつもとさんとお会いすることができそうです。
つきましては、もし結城の日記の読者さんで、 私経由でまつもとさんにお聞きしたいことがある方がいらっしゃいましたら、 feedbackのフォームから結城あてに質問を送ってみてください。 送っていただいた質問を必ずまつもとさんにする、というお約束はできませんけれど、 お会いしたときの話題にさせていただくかもしれません。 〆切は…そうですね、次の火曜日(24日)くらいまでに。
よろしくどうぞ。
今日も、朝一番にWeb連載 (結城浩のYahoo!日記)の原稿を書く。 クロッキーのような文章書き。 13分。 クロッキーのような文章書きをするときには、ほとんど編集しない。 最初の一文、もしくはタイトルだけ考えていて、いきなり書き始める。 で、どんどん書き進める。思いついたことはとにかく書く。 そうすると、深くはないけれど広い文章になる。 それから面白い表現がぴょんと飛び出してきたりする。 荒削りだけれど面白い文章になったりする。 頭の中にあるうちは編集できないけれど、 テキストの形に落ちてくれれば、あとでいくらでも編集できる。 だからどんどん書いてみる。 今回はWeb連載のためにそんな方法を取っている。
現在のところは、以下のような感じになっている。
005.txt ←「クロッキー」 006.txt 007.txt 008.txt 009.txt 010.txt c001.txt ←「清書」 c002.txt c003.txt c004.txt
…しまった。こういう執筆話もあっちのブログに書けばよかったんだ。
ちなみに、 結城浩のYahoo!日記は、 livedoor.comの「RSS注目ランキング」とhatena.ne.jpの「最近の注目フィード」で(瞬間風速)一位になった模様。 みなさん登録ありがとうございます。感謝♪
RSSは http://blogs.yahoo.co.jp/hyuki0000/rss.xml になります。
ところで、 あのブログは、行間調整がまだうまくいっていなくて、改行多めになっています。 HTMLで見たときとbloglines.comで見たときにはそれなりに読めるのですが、 livedoorのRSSリーダで読むと行間が空きすぎてしまいます。 現在、よい落としどころを検討中ですので、 livedoorのRSSリーダ経由で読んでいる方、どうぞご辛抱ください。 スタイルシートの調整で何とかなるのかなあ…。
…しまった。こういう話も以下略。
今日も、朝一番にWeb連載 (結城浩のYahoo!日記)の原稿を書く。 クロッキーのような文章書き。 今日は、レオンハルトのチェンバロを聞くのを忘れた。 何となく体調が悪いからかもしれない。 体調が悪いときにはバッハに負けてしまう。
結城浩のYahoo!日記は、 Yahoo!デベロッパーネットワークさんから依頼されたお仕事になっている。 お仕事でブログを書くわけだけれど、 内容的にはかなり裁量にまかされている(と思っている)。 ありがたいことです。
しばらくはぎこちないエントリが続きますが、 そのうちに安定するだろうと思いますので、 長い目で見てやってください。 本来のご依頼内容からすると、毎週一エントリくらいでよいのですが、 たぶんしばらくは毎日更新することになると思います。 RSSリーダーへの登録をぜひよろしくお願いしますね。
現在はローカルなファイルでエントリを書いて、 Yahoo!ブログのWebインタフェースを使って書き込んでいます。 そのうちにめんどうになったら、 「はてなダイアリーライター」ならぬ「Yahoo!ブログライター」のスクリプトを書き始めるかもしれませんが…。 Yahoo!ブログの更新用Webサービスはありませんか?と問い合わせたところ、 そういうのはどうも存在しないようです。
…しまった、こういう話もあっちのブログに書けば良かったんだ。
結城浩です。いつも結城の活動を応援くださり、ありがとうございます。
さて、このたびYahoo!ブログで連載を始めることになりました。
題して、 結城浩のYahoo!日記です (ここで、そのまんまじゃん!というツッコミが入る)。
この企画はYahoo!デベロッパーネットワークさんからのご依頼です。 最初は、開発者さんにYahoo!Webサービスを使っていただくための日記的なものを…というところからスタートしたのですが、 次第に話は広がって、おおよそ以下のような内容を書いていくことになりました。
「コミュニケーションのヒント」がメインの題材になっていくと思います。
このようなブログ連載は、はじめてなので、どう転がっていくかはまだよくわかりません。 基本的に、最低でも毎週一回程度は更新していくと思いますので、ぜひRSSリーダへの登録をお願いいたします。
ええと、URLは…
ですね。
どうぞよろしくお願いします。
しばらくは「プレオープン」ということで進みますが、 近日中に 結城浩のYahoo!日記はYahoo!のオフィシャルブログになります。
今日も、朝一番にWeb連載の原稿を書く。4分。 レオンハルトのチェンバロを聞きながら、クロッキーのような文章書き。
急いで書くと、浅く・広い文章になることに気づいた。 ゆっくり書くと、狭く・深い文章になる。
今日も、朝一番にWeb連載の原稿を書く。16分。 レオンハルトのチェンバロを聞きながら、クロッキーのような文章書き。
以下は、Web連載とは関係ない話。
ちょっとしたCGIを作るために(私が)便利そうな、小さなフレームワークをPerlで書いている。 仮に名前をYuki::CGIとしている。 こんな感じ。
設定ファイル例(config.yaml)
DEBUG: 0 TITLE: Captcha CHARSET: utf-8 CGI_URL: http://www.example.com/captcha/captcha.cgi CSS_URL: http://www.example.com/captcha/captcha.css TEMPLATE_DIR: C:/work/captcha/template TEMPLATE_SETTINGS: die_on_bad_params: 0 global_vars: 1 DATA_FOLDER: /tmp OUTPUT_FOLDER: ./pngs
テンプレートファイル例(do_check.txt)
Content-type: text/html; charset=<TMPL_VAR NAME=CHARSET> <?xml version="1.0" encoding="<TMPL_VAR NAME=CHARSET>"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Language" content="ja" /> <meta http-equiv="Content-Type" content="text/html; charset=<TMPL_VAR NAME=CHARSET>" /> <title><TMPL_VAR NAME=TITLE></title> </head> <body> <h1>Result: <TMPL_VAR NAME=MESSAGE></h1> <p> Your input: <strong><tt><TMPL_VAR NAME=CODE></tt></strong> </p> <p> <a href="<TMPL_VAR NAME=CGI_URL>">Try Again</a> </p> </body> </html>
CGI例(captcha.cgi)
... use Authen::Captcha; use Yuki::CGI; new Yuki::CGI('config.yaml')->run; exit; sub new { my ($class) = @_; bless {}, $class; } sub setup { my ($self, $c) = @_; $self->{CAPTCHA} = Authen::Captcha->new( data_folder => $c->stash->{DATA_FOLDER}, output_folder => $c->stash->{OUTPUT_FOLDER}, ); } sub teardown { my ($self, $c) = @_; } sub do_default { my ($self, $c) = @_; my $md5 = $self->{CAPTCHA}->generate_code(5); $c->stash->{MD5} = $md5; $c->stash->{CREATED_CAPTCHA_NAME} = $self->{CAPTCHA}->output_folder() . "/${md5}.png"; $c->output('do_create.txt'); } sub do_check { my ($self, $c) = @_; my $code = $c->param('mycode'); my $md5 = $c->param('mymd5'); ... $c->stash->{MESSAGE} = $message; $c->stash->{CODE} = $code; $c->output('do_check.txt'); }
設計ポイント
現在やっていること
いま困っていること
朝、Web連載の原稿を試しに書いてみる。 16分使って書くと、α版のようなものができる。 ふむ。
テトラちゃん「Happy Birthday!」
僕「え、誰の誕生日?」
ミルカさん「ふうん。わからないの?」
僕「だから、誰?」
テトラちゃん「300歳の誕生日ですよっ」
僕「あ…」
ミルカさん「そう、今日は我らの師、オイラー先生の誕生日」
三人「ハッピーバースディ、オイラー先生!」
* * *
ということで、 歴史上最も多産な数学者の一人であるLeonhard Euler先生は、 300年前の今日1707年4月15日に生まれました。
オイラー先生の生誕300年の今年、 オイラー萌え(?)の才媛ミルカさんが登場する物語を出版できることは大きな喜びです。
『ずばりわかる! Webプログラミング2.0』というムックが日経BP社から刊行されました。 日経ソフトウエアの特集や連載記事を元にまとめたもので、 結城も執筆者の一人になっています。 ご興味のある方はぜひどうぞ。
第1部 Web APIプログラミング プロローグ Web APIプログラミングを始めよう Part1 HTTPの仕組みを基礎から学ぶ Part2 Web APIプログラミングの基本 Part3 Web APIで作る「地名しりとり」 第2部 Webプログラミング実力アップ Part1 正しいPerl/CGIの書き方 Part2 Webアプリケーション・フレームワーク入門 Part3 セキュアWebプログラミング入門 Part4 テストを自動化する注目のツールSelenium 第3部 簡単実装で学ぶ最新Web技術 Part1 Ajax Part2 はてな認証API Part3 Catalyst(前編) Part4 Catalyst(後編) Part5 Plagger(前編) Part6 Plagger(後編) Part7 Comet Part8 Cookie Part9 YAMLとJSON
のんびり土曜日。
リコーダーでも吹きましょう。
同じ曲をソプラノとアルトでどうぞ。
他の曲はこちらから。
今回の録音にはAudacityを使いました。
編集部から『暗号技術入門』が増刷になるというお知らせを受けました。
今回で、ええと、9刷になります。
読者のみなさんに深く感謝します。
また、いつも応援メッセージを送ってくださるみなさんにも感謝です。
ありがとうございます。 (^_^)
以下は「お約束」のリンク。
来週2007年4月19日(木)からWebで連載をすることになっています。 詳しくは来週またアナウンスしますが、 今日はいま考えていることを少し書きます。
Webで連載といっても、あまりかっちりしているものではなく、 あるテーマにそってブログを書くという比較的カジュアルなものです。 でも、だらだらと書いても面白くないので、 いつもの仕事とは違う進め方を試してみたいなと思っています。
いつもの仕事、たとえば月刊誌の連載ですと、 毎月〆切があって、それに向けてサンプルプログラムを作り、図を描き、原稿を書き、zipして編集者へ送信する、という流れです。 ブログに連載する場合、〆切は特になく、 いま依頼されているのは月に数回書いてくれればよいというもの。 結城は「毎週一回更新」と自分で目算を立てています。 しかしながら、連載開始時は意識がそれに向いているため、 比較的頻度は高くなるだろうとも思っています (もっとはっきり言えば、しばらくは毎日更新しそうだなと思っています)。
で。今考えているのは、毎日朝32分をそのブログの記事準備に使ってみようかということ。 ちょうど、絵を描く人が時間制限を設けてクロッキーをするみたいにね。 特に準備をせず、32分間という制約で文章を書き進めるというのは楽しいかもしれないと考えています。 著者が楽しいのであって、読者が楽しいとは限らないわけですが…。 なぜ32分かというと、25という切りのいい数字だから。 たぶん、16分で書いて、16分で校正ということになるかな。
そうやって自分自身で制約を決める(〆切を自分で決め、仕事の進め方も自分で決める)と、 妙に楽しい気分になってくるのはなぜでしょう。 ゲーム感覚になるからかな。 いや、きっと「仕事を自分でコントロールしている」感覚が心地よいのでしょう。
四月。新しい季節。新しい試みを始めるにはとっても良い季節ですね。
さて、Web連載はどうなるでしょうか。どきどき、楽しみです。
願わくは、神さまがこのWeb連載とその読者さんに豊かな祝福を注いでくださいますように。
来週からWeb連載が始まるので、その準備を進めている。 まずはじめに必要な準備は、何を準備したらよいかを考えることだ。
Web連載とは別のお仕事で、雑誌の新連載もある。 編集者さんと、そのためのブレインストーミングをする。 メールベース。
アンビグラム作家のigatoxinさんが、 数学ガールのアンビグラムを作ってくださいました…って、これは…絶句!
Math Girls ←→ ミルカさん テトラちゃん
これは、すごい。
Designed by igatoxin.
これまでigatoxinさんは、以下のようにたくさんのアンビグラムを作ってくださいました。 感謝します。
『数学ガール・ミルカさんとテトラちゃん』の出版(2007年6月)を記念して、
恒例になりました「著者へのインタビュー」記事を公開します。
今回も、プログラミング情報誌『R.U.Certainマガジン』編集部にお世話になりました (^_^)
。
ぜひお読みください。
月曜日。忙しいなあ。
ふみぃ。
朝は、関係者へ送るために 『数学ガール』の執筆メモをバージョンアップ。 以前(今年1月)のメモを書き換えたのだが、内容がずいぶん変わっていてびっくり。 以前の構想よりも、ずっと良くなっている。
午後からは、来週アナウンス予定のお仕事の仕込みをいろいろ進める。 いままでにないタイプのお仕事なので、 どういう方向でいくべきかを考えている。 何となく、進めながら方向を考えていくことになりそうな予感。
うにゃ。
そうだ。こういう気分の時は、シルバーキャットを呼ぶべきではないだろうか。
猫、猫、こっちおいで。美味しいミルクをあげるから。
なご。
ね、美味しいミルクでしょ?
なごなご。
ねえ、シルバーキャット、きみは、今日、何してた?
なごぅん。
そうかそうか、そかそか。じゃ、ミルクもういっぱい飲むかい?
なぐー。
かわいいなあ。シルバーキャット、きみは疲れることはないのかな。
なご。
あ、ミルクね。…はい、どうぞ。
なぐー。
きっと、疲れることはないんだろうな。 きみは、いつでも、今を生きているからね。
なご。
今朝、子供が朝食を食べていた。 私が出し抜けに、
心を尽くして主に拠り頼め。 自分の悟りにたよるな。 あなたの行く所どこにおいても、主を認めよ。 そうすれば、主はあなたの道をまっすぐにされる。 (箴言3:5−3:6)
という聖書の言葉を唱えて「あなたを祝福します!」と宣言した。 子供はこういう私の物言いに慣れているので、 いくぶん苦笑しつつも「はい」と返事する。
神さまの御言葉で、自分の子供を祝福できるって幸せだ。
余談。
奥さんに「よく覚えているわね」とほめられてうれしくなったのだけれど、
続けて「それってどこの聖書箇所?」と聞かれて「あれ?どこだっけ?コリントいやコロサイかなあ…」としどろもどろ。弱っ!(^_^;
奥さんへ:今朝の聖句は、箴言でした…。 つか私の年間聖句でしたよ…。
『数学ガール・ミルカさんとテトラちゃん』の原稿を再修正して送付しなおした。 先月末のものは私の最終チェックが甘かったため。
今週は仕事の仕込みが複数個並行で発生して、たいへん忙しかった。 こういうの、ちょっと珍しいなあ。 でも、どの仕事で会った人にも結城は『数学ガール・ミルカさんとテトラちゃん』を宣伝している。
* * *
校正していると、長男が寄ってきて原稿を読み始める。
長男「ねえ、お父さん。ここでテトラちゃんが『子供のころのアサガオ観察』って言ってるけれど、『小学生のころのアサガオ観察』のほうがいいんじゃないかな」
私「どうして?」
長男「だって、《高校生》と《子供》って、何だかバランスが悪い」
私「もう少し詳しく言うと?」
長男「ミルカさんやテトラちゃんは高校生だよね。高校生だって、ある意味子供じゃない? だから、子供が子供っていうのは変だ。高校生が『小学生のころ』って言うならわかるけれど」
私「なるほど。うん、そうしても悪くはない。でも、ここではどうかなあ。高校生だってある意味子供なんだけれど、ここでしゃべっている彼女たちは自分のことを子供だとは思ってのないかもしれない」
長男「へえ…。でも、アサガオ観察っていったら小学校時代だよね」
私「うん。でもそれがわかるんだったら、ことさら「小学生のころの」って書かなくても良いことになる」
長男「ほほう」
私「しかし、きみの指摘はなかなか素晴らしいと思う。実はお父さんも書いているときにそのことを考えた。『小学生のころの…』にするかどうかちょっと迷った。でも、私の中で、テトラちゃんはこのように話していたから、その通り書くことにした。まあ、話の本筋にはあまり関係しないんだけれどね」
* * *
普段は黙読ばかりしているから、長男が声に出して「ミルカさん」や「テトラちゃん」という名前を呼ぶのを聞くと、不思議な気分になる。
春。 人に会う機会が多い。 もしかしたら4月にも、人に会うかもしれない。 でも、きっと2007年に会うのはそれで終わりだろう。
新しい仕事の仕込みをいろいろ。 新しいディレクトリを作って、svn importして、そのディレクトリに行くバッチファイルを作り、 作業ログを記録するテキストファイルを準備して一息入れる。
そういえば、と思って 「数学ガール」のディレクトリにある作業ログファイルを見てみた。 最初のエントリはこうなっていた。
2005-10-17 13:33:28 数学ガール。
2005年か。意外と新しいな。 …そうか、と思って 「心の物語」の作業ログファイルを見てみた。 昔はそちらで作業していたんだ。 最初のエントリはこうなっていた。
2000-05-07 19:47:10 絵の道具を持って自転車にのり、風をきっていく。 すすきの間を抜けていく。 急に視界が開けて海に出る。 自由だ。
何だか素敵だ。…でもこれは数学ガールじゃない(そもそも「作業ログ」でもない…まあいいけど)。 数学ガールの原型はいずこ。 作業ログをずっと読んでいくと、 2002年頃にばらばらのアイディアメモを書いている。 へえ。
2002年頃のメモが、 5年経って本になるのか…。 ワインの仕込みみたい。 感慨深いものがあるなあ。
私のハードディスクにはたくさんの原酒が眠っています。
以下、作業ログに関する昔の記事。
昨日の
『数学ガール』にアニメ化のオファー!という記事はエイプリルフールです。
お騒がせいたしました。 m(_ _)m
読者に「おかしいな」と気づいていただくために埋め込んだ情報は以下です。
思いがけずたくさんの方からお祝い+問い合わせのメールをいただいてしまい、 たいへん恐縮してしまいました。 ごめんなさい、ごめんなさい。
先日『数学ガール・ミルカさんとテトラちゃん』のイラストの話題がありましたが、 実は『数学ガール』のアニメ化について正式なオファーがありました(関係者の許可を得てアナウンス)。 制作は、あの超人気アニメ「八ルヒ」を作成した杏都アニメーション(!)とのこと。 基本的に受ける方向で考えています。 今月末、4月31日に関係者にお会いする予定。 どんなミルカさん、どんなテトラちゃんになるのか、 いまからどきどきです。
それにしても、ネットは動きが速い!
あなたのご意見・感想をお送りください。 あなたの一言が大きなはげみとなりますので、どんなことでもどうぞ。