英語クラス開始
と言うわけで、英語クラスを開始しました。本当は毎日やるべきですが、週一回の開催です。
トリリンガルのtienさん、帰国子女のprince、そしてご存知masterと役者がそろいました。
youtubeの動画の一部を繰り返し再生する必要があります(一発で聞き取れないので)。この操作がとても面倒です。 http://www.adobe.com/jp/support/flash/ts/documents/fl0017.html を見てJavaScriptから再生を制御できる気がしたのですが、オブジェクトは取得できても(<object>タグにid属性、<embed>タグにname属性をつける)、TotalFrames()が1しか返してくれません。
良い方法を知っている人が教えてください。
書き取った英語は公開予定です。クローズドキャプション化は面倒そうなので、無理かもしれません。
以下が今後の候補です。Guidoの英語は聞きやすいので良さそうです。
- Python 3000 (by Guido)
- http://video.google.com/videoplay?docid=-6459339159268485356
- AOP
- http://video.google.com/videoplay?docid=8566923311315412414
- Building Large Systems at Google (興味深いですが、だいぶ予備知識が必要)
- http://video.google.com/videoplay?docid=-5699448884004201579
- Practical Common Lisp (興味深いですが、プレゼンの画面がよく見えません)
- http://video.google.com/videoplay?docid=448441135356213813
- Category(s)
- カテゴリなし
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/inoue/english-class/tbping
ブログ一覧リンクを更新
http://dev.ariel-networks.com/Members の右下のブログ一覧リンクを更新しました。これで、過去文書が探しやすくなったはずです。
アリエルエリアのblogシステム(Plone)のユーザビリティはかなり劣悪で好きではないのですが、レイアウトの項目の追加がHTMLを書けば良い点は評価します。同じPythonつながりでは、tracの一番気に入っている点として、ビューを作るためにSQLを直接書ける点があります。
世の中、自称DSL、なんちゃってDSLがあって、その実体は単に標準的な記述言語より表現力が落ちているだけ、という代物だったりします。記述に制約を設けることで容易にしているという主張かもしれませんが、(よほど言語設計のセンスが無い限り)たいして記述がシンプルになっていないまま表現力が落ちただけ、というオチになりがちです。
- Category(s)
- カテゴリなし
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/inoue/list-update/tbping
時計型カレンダーをcanvasで実装
- 2007/11/9 約半月前の記事ですが、linkのtypoを訂正。書いた直後にリンクチェックしたような気がするのですが...
先日のGoogle Developer DayのGDataのセッションで、Google Calendarの予定を取り込むデバイスの話がありました。 ちらとしか画面に写りませんでしたが、予定を時計状のオブジェクトで表示するようです。1:00から3:00の予定がある場合、円周の右上の円弧が光ります。予定の表示と言えばカレンダー状しか思いつかなかったので、面白い、と思いました。
同じような機能をcanvasで実装してみました。
テキストボックスに 14:00-16:00 のように入力してください。予定のある時刻の円弧が赤くなります。薄い赤色で透過度付きにしているので、予定が重なると、濃い赤になります。 特別なデータ構造やバックエンドに依存していないので、誰でもどこでも使えます。
使い方の例
var cc = new ClockCalendar($("bg_layer").getContext("2d"),
$("sched_layer").getContext("2d"),
$("clock_layer").getContext("2d"));
cc.add_schedule(new Date(2007,1,1,12,0,0,0), new Date(2007,1,1,13,0,0,0));
canvasを実装したブラウザ(firefox2など)で試すことができます。IEでは見ることができません。
先日、Firefox extensionの勉強会を開催しましたが、他の候補としてcanvasと(JavaScriptの)E4Xがありました。E4Xは個人的にクールだと思います。しかし、いかんせん説明することが無さすぎます。E4Xは何かで10分、DOMとの相互変換で10分、おしまいです。説明することが少ないのは、シンプルで良い技術の証ですが、勉強会のネタとしては物足りません。一方、canvasは存在理由が微妙すぎて見送りました。HTMLの理念からの逸脱も甚だしいですし、IEがサポートしない限り、誰も使えません。
コードの時計部分は http://developer.mozilla.org/en/docs/Canvas_tutorial のぱくりです。AMとPMを分けたり、時計の基盤と針を別のcanvasに分けたり、と少し改変しています。
ちなみに 11:00-15:00 の予定を作ると、次のような表示になります。AM、PMの観点では正しい表示ですが、ビジネスアワー的にはひとつの円弧として表示して欲しい気もします。

- Category(s)
- カテゴリなし
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/inoue/clock-calendar/tbping
プログラミング言語Rubyの勉強会資料
プログラミング言語Rubyの勉強会資料を書きました。
前日の夜、と言うか日付的には当日に書き上げるとは、すっかり学生症候群です。オフィスで、キングオブ学生症候群の近くに座っているせいでしょうか。
1時間でブロックまで説明しきれるのか不安です。
次回はRuby on Rails(RoR)の勉強会をするつもりです。以下のダウンロードのページの最後を見ると、TextMateというエディタを押しつける態度を感じます。エディタは自由です。特定のエディタを押しつける態度はいかがなものかと思います。気に入りません。
- Category(s)
- カテゴリなし
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/inoue/ruby-article/tbping
Re:プログラミング言語Rubyの勉強会資料
[Q] freezeしたオブジェクトを戻せますか?
[A] 戻せません。ドキュメントに書いてありました(http://www.ruby-doc.org/core/classes/Object.html#M000354)。
Ruby勉強会資料の訂正
にウソがあったので訂正します。
- RoRのコード例から引用
class MyController < ApplicationController
def index
if params[:name] == 'unknown'
render :action => 'x'
else
render :action => 'y'
end
end
end
- params[]というメソッドに引数 :name を渡している
と書いていましたが、MyControllerにparams[] というメソッドはありません。あるのはparamsというメソッドです(と、params=)。このふたつはインスタンス変数(@_params)のアクセサメソッドです。このインスタンス変数がハッシュテーブルのオブジェクトなので、上の [:name] はハッシュテーブルの [] メソッドの呼び出しです。
この params[:name] は params['name'] とも書けるのですが、この実装がどうなっているのか気になって調べたのが、気づいた発端でした。
以下、Ruby on Railsのソースのトップディレクトリを$RAILSと表記します。
$RAILS/actionpack/lib/action_controller/base.rb で次のようにあります(抜粋)。ActionController::Base は ApplicationController の親クラスです。
module ActionController #:nodoc:
...
class Base
...
attr_internal :params
attr_internal は次のようなメソッドです(一部略)。
class Module
def attr_internal_reader(*attrs)
attrs.each do |attr|
module_eval "def #{attr}() #{attr_internal_ivar_name(attr)} end"
end
end
def attr_internal_writer(*attrs)
attrs.each do |attr|
module_eval "def #{attr}=(v) #{attr_internal_ivar_name(attr)} = v end"
end
end
# Declare attributes backed by 'internal' instance variables names.
def attr_internal_accessor(*attrs)
attr_internal_reader(*attrs)
attr_internal_writer(*attrs)
end
alias_method :attr_internal, :attr_internal_accessor
private
mattr_accessor :attr_internal_naming_format
self.attr_internal_naming_format = '@_%s'
def attr_internal_ivar_name(attr)
attr_internal_naming_format % attr
end
end
気分は完全にマクロですが、要は attr_internal :params の呼び出しで、params と params= のふたつのメソッドを生成しています。ちなみに '@_%s' % :foo で '@_foo' の文字列を返します。
静的型の言語であれば、@_params (インスタンス変数)の定義を見れば、最初の疑問は一発で分かりそうですが、そうならないところが動的型言語の悲しいところです。結論から言えば、次のコードで Hash から HashWithIndifferentAccess に変換して返しています($RAILS/actionpack/lib/action_controller/request.rbから抜粋)。
module ActionController
# CgiRequest and TestRequest provide concrete implementations.
class AbstractRequest
...
def parameters
@parameters ||= request_parameters.merge(query_parameters).update(path_parameters).with_indifferent_access
end
with_indifferent_access は次のように定義されています。
def with_indifferent_access hash = HashWithIndifferentAccess.new(self) hash.default = self.default hash end
シンボルと文字列のどちらでも牽けるハッシュテーブルとしては、理屈上、次の4つの可能性があります。最後の候補は効率的に論外ですが。
- キーをシンボルに統一
- キーを文字列に統一
- シンボルと文字列の両方のキーを登録
- シンボルを使うキーと文字列を使うキーが混在
HashWithIndifferentAccess.new の実装は「キーを文字列に統一」です。勉強会で、シンボルの方が文字列より効率的なのでハッシュテーブルのキーにはシンボルを使うべし、と主張しておいてなんですが、paramsへのアクセスで使うキーは文字列の方が少しだけ(シンボルから文字列生成する分だけ)速いです。
と言うわけで、サンプルコードも次のように書き直しました。
if params['name'] == 'unknown'
- Category(s)
- カテゴリなし
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/inoue/ruby-article2/tbping
アリエル社員紹介ページ拡充
- Category(s)
- カテゴリなし
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/inoue/ariel2007/tbping
Re:アリエル社員紹介ページ拡充
> OS: sodex
それはない(笑)
Re:アリエル社員紹介ページ拡充
${}とか#{}とか。from Ruby to EL
Rubyで次のようなコードがありました。
uri = URI.parse(uri_str)
response = Net::HTTP::Proxy(proxy_addr, proxy_port).start(uri.host) { |http|
if (uri.query)
http.get2 [uri.path, uri.query].join('?'), 'Authorization'=>auth
else
http.get2 uri.path, 'Authorization'=>auth
end
}
if節だけでは、uri.pathがnilの時、? で終わるURLにアクセスします。たいていのサイトは問題ありませんが、問題が生じるケースもあります。しかし、このコードのために5行消費するのは気に入りません。次のようにすると、1行にできます。
http.get2 uri.path + ((uri.query && "?#{uri.query}") || ''), 'Authorization'=>auth
Rubyでの空文字は真なので、uri.queryが空文字の時、?で終わるURIになります。これは仕様です(URI.parseと対称性あり)。
こうやってifを追放できる余地が大きい言語ほど世間の受けは良いですが、可読性の観点からどちらが良いかは微妙です。
話は変わりますが、某UIデザイナからJSPのELに関する質問を受けました。ELで次のように文字列だけを真偽値として評価すると、どうなるかという質問です。
<c:if test="'foobar'">...</c:if>
Cの感覚から真かと思ったのですが、実際の動作は偽となっています。
http://jcp.org/aboutJava/communityprocess/final/jsr245/index.html からたどるとELのスペックを見ることができます。「Type Conversion」に次のように書いてあります。以前同じことを調べたような記憶もありますが、定かではありません。
1.18.5 Coerce A to Boolean
If A is null or "", return false
Otherwise, if A is a Boolean, return A
Otherwise, if A is a String, and Boolean.valueOf(A) does not throw an exception, return it
世の中ではEL式という訳語が目につきます。今まで、EL(expression language) expressionはおかしいと思っていたのですが、Sunの文書を見るとEL expressionと普通に書いてあります。EL式は素直な訳語だったようです。普通名詞として"expression language"、固有名詞として"EL expression"や"JSP expression"が使われているようです。ややこしいです。
Java系の周辺技術の中で、個人的にELは気に入っています。モデルオブジェクトに対して参照専用に割り切ったシンプルさが魅力です。覚えることが実に少ないです。.と[]の記法、各演算子の意味、演算子の優先順位、型変換、これだけ覚えれば使えます。しかも、上のスペック文書を見ればすべて簡潔にまとまっています。
http://java.sun.com/javaee/5/docs/tutorial/doc/bnahq.html を見ると、"unified EL"とあります。JSP由来のexpression languageと、JavaServer Faces(JSF)由来のexpression languageのふたつがあるので、統合して"unified EL"にしたと書いてあります。外野から見れば、ふたつ似たようなものを作っておいてunifiedも無いだろう、と突っ込みたくなりますが、まあJavaはそんなものです。
上のunified ELのページを読むと、遅延評価(deferred evaluationなので遅延評価の訳語は良くないかも)、左辺値(lvalue)、メソッド式(method expression)、とUIデザイナへの嫌がらせみたいな用語が並んでいます。SunはELを書くのが誰だと思っているのでしょう。
unified ELでは、モデルオブジェクトの参照専用の式は ${} と表記して、モデルオブジェクトの参照更新両用の式は #{} と表記します。ELからモデルオブジェクトを更新可能と聞くと、一見、MVCの明らかな逸脱に聞こえます。しかし、モデルオブジェクトの更新は、JSPページをレスポンスするタイミングではなく(もしそうならMVCの逸脱)、HTMLフォームからデータをポストしたタイミングで起きる話です。
JSFは http://java.sun.com/javaee/5/docs/tutorial/doc/bnapl.html を読んだ程度の理解ですが、なんとなく作りたい気持ち(unified ELが必要になる背景)は分かります。
HTMLフォームとそれに結びついたモデルオブジェクト(Javaでは一般にJava Beans)の関連を、現状、どこかに持つ必要があります。JSFはそれをJSPページに書こうとしています(unified ELが必要な理由)。ついでに、入力値の妥当性検査(用のコードとの関連)もJSPページに書きたいようで、これがunified ELにメソッド式がある理由です。気持ちは分かりますが、世間のUIデザイナはこれを理解できるのでしょうか。
- Category(s)
- カテゴリなし
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/inoue/from-ruby-to-el/tbping
http://git.or.cz/gitwiki/LinusTalk200705Transcript
まあ、目的は英語の勉強なのでどうでもいいですが。
ここはmasterでも聞き取れなかったところです。
> I realize that a lot of people thought there were a lot of strife over with BitKeeper, and that the parting was very painful in many ways. As far as I am concerned, the parting was amicable, even though it looked very non-amicable to outsiders
この辺(http://opentechpress.jp/kernel/05/04/13/0232209.shtml)の背景知識が無いと結構厳しいです。
「Linusに給料を払っているのは誰ですか? その金はどこからでていますか?」
「kernelとは何ですか? OSとは何ですか?」
「CVSのconcurrentの意味は何ですか? その利点は何ですか?」
「gitとbitkeeperはどういう関係ですか?」
「gitはsubversionより何が優れていますか?」
これに英語で答える生徒たち。なんというレベルの高さ。落第しそうです。これが無料で受講できてよいのでしょうか。
ところで、git, subversion, csvの比較があります。
http://people.planetpostgresql.org/greg/index.php?/archives/115-Postgres-cvs,-subversion,-and-git.html
タイムリーなネタです。