Personal tools
You are here: Home ブログ 井上
« November 2007 »
Su Mo Tu We Th Fr Sa
        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  
Recent entries
Apache2.4のリリース予定は来年(2011年)初め(あくまで予定) inoue 2010-12-23
Herokuの発音 inoue 2010-12-20
雑誌記事「ソフトウェア・テストPRESS Vol.9」の原稿公開 inoue 2010-12-18
IPA未踏のニュース inoue 2010-12-15
労基法とチキンゲーム inoue 2010-12-06
フロントエンドエンジニア inoue 2010-12-03
ASCII.technologies誌にMapReduceの記事を書きました inoue 2010-11-25
技術評論社パーフェクトシリーズ絶賛発売中 inoue 2010-11-24
雑誌連載「Emacsのトラノマキ」の原稿(part8)公開 inoue 2010-11-22
RESTの当惑 inoue 2010-11-22
「プログラマのためのUXチートシート」を作りました inoue 2010-11-19
「ビューティフルコード」を読みました inoue 2010-11-16
Categories
カテゴリなし
 
Document Actions

英語クラス開始

と言うわけで、英語クラスを開始しました。本当は毎日やるべきですが、週一回の開催です。

トリリンガルのtienさん、帰国子女のprince、そしてご存知masterと役者がそろいました。

youtubeの動画の一部を繰り返し再生する必要があります(一発で聞き取れないので)。この操作がとても面倒です。 http://www.adobe.com/jp/support/flash/ts/documents/fl0017.html を見てJavaScriptから再生を制御できる気がしたのですが、オブジェクトは取得できても(<object>タグにid属性、<embed>タグにname属性をつける)、TotalFrames()が1しか返してくれません。

良い方法を知っている人が教えてください。

書き取った英語は公開予定です。クローズドキャプション化は面倒そうなので、無理かもしれません。

以下が今後の候補です。Guidoの英語は聞きやすいので良さそうです。

The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/inoue/english-class/tbping

Re:英語クラス開始

Posted by inoue at 2007-11-03 02:37
と思ったら既にあった...

http://git.or.cz/gitwiki/LinusTalk200705Transcript

まあ、目的は英語の勉強なのでどうでもいいですが。

Re:英語クラス開始

Posted by inoue at 2007-11-03 02:56
> I designed git, it's "what would Jesus do" except that it's "what would CVS never ever do"-kind of approach to source control management

ここは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)の背景知識が無いと結構厳しいです。

Re:英語クラス開始

Posted by inoue at 2007-11-10 00:31
今日の講師からの質問。

「Linusに給料を払っているのは誰ですか? その金はどこからでていますか?」
「kernelとは何ですか? OSとは何ですか?」
「CVSのconcurrentの意味は何ですか? その利点は何ですか?」
「gitとbitkeeperはどういう関係ですか?」
「gitはsubversionより何が優れていますか?」

これに英語で答える生徒たち。なんというレベルの高さ。落第しそうです。これが無料で受講できてよいのでしょうか。

Re:英語クラス開始

Posted by Anonymous User at 2007-11-14 16:01
どうしてトリリンガルと言いますか?

ところで、git, subversion, csvの比較があります。

http://people.planetpostgresql.org/greg/index.php?/archives/115-Postgres-cvs,-subversion,-and-git.html

Re:英語クラス開始

Posted by matsuyama at 2007-12-02 20:25
http://po3a.blogspot.com/2007/12/subversion.html

タイムリーなネタです。

ブログ一覧リンクを更新

http://dev.ariel-networks.com/Members の右下のブログ一覧リンクを更新しました。これで、過去文書が探しやすくなったはずです。

アリエルエリアのblogシステム(Plone)のユーザビリティはかなり劣悪で好きではないのですが、レイアウトの項目の追加がHTMLを書けば良い点は評価します。同じPythonつながりでは、tracの一番気に入っている点として、ビューを作るためにSQLを直接書ける点があります。

世の中、自称DSL、なんちゃってDSLがあって、その実体は単に標準的な記述言語より表現力が落ちているだけ、という代物だったりします。記述に制約を設けることで容易にしているという主張かもしれませんが、(よほど言語設計のセンスが無い限り)たいして記述がシンプルになっていないまま表現力が落ちただけ、というオチになりがちです。

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の観点では正しい表示ですが、ビジネスアワー的にはひとつの円弧として表示して欲しい気もします。

/Members/inoue/images/misc/canvas-clock.png
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というエディタを押しつける態度を感じます。エディタは自由です。特定のエディタを押しつける態度はいかがなものかと思います。気に入りません。

The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/inoue/ruby-article/tbping

Re:プログラミング言語Rubyの勉強会資料

Posted by inoue at 2007-11-15 23:36
宿題への回答

[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'
The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/inoue/ruby-article2/tbping

アリエル社員紹介ページ拡充

笑顔の写真が増えています。楽しい会社だと思わせる策略みたいで嫌です。

The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/inoue/ariel2007/tbping

Re:アリエル社員紹介ページ拡充

Posted by Anonymous User at 2007-11-26 00:55
> 袖山 剛
> OS: sodex

それはない(笑)

Re:アリエル社員紹介ページ拡充

Posted by inoue at 2007-11-26 10:19
ごめんなさい、sodexは(まだ)kernelだけだから、GNU/sodex ですね。

${}とか#{}とか。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デザイナはこれを理解できるのでしょうか。

The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/inoue/from-ruby-to-el/tbping

Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.