2010-07-17 [長年日記]

[℃-ute]岡井ちゃん、寝る!(#2)

あの伝説の番組が帰ってきた!

「岡井ちゃん寝る」第二回放送は本日12時から。ちぇきらっ!


2010-06-28 [長年日記]

[Smalltalk] 第21回 Smalltalk勉強会「Traits」

何?

  • Traits て何?
    • いくつかのメソッドを定義しておいて、他のクラスに取り込む方法 (メソッド群の継承機構)
  • Rubyのmoduleみたいなもの?
    • そう。ほぼそれ。ScalaだとTrait
  • 大概の言語にあるよね?
    • うん。Perl6だとRoleらしい
  • そして、JavaだとInterface!
    • 違う。それだけは違う
  • ちょw。なんでよ!差別イクナイ!
    • JavaはAPI定義のみで実装がないから
  • ああ、API+実装がTraitsなのか
    • そう。言語ごとに違いがある(追加方法、衝突管理、状態、継承)ので、そう言い切るのも火種になる
  • なるほど。ぢゃ、*大筋で*「API+実装がトレイト」と思っていればOK?
    • うん、完璧。Smalltalk実装のTraitsと区別するためにカタカナにしたものナイス
  • えへへ。あ、でさ、さっきの衝突管理って何?
    • 同じメソッド名がある場合にどうなるか問題
  • ああ、Ruby の強制上書きはバグの苗床になりえるね。gem のアップデートで挙動が??みたいな
    • うん。Ruby の場合、native な module でなく、そこをケアしたtraitライブラリもあるみたい
  • ほぉ。なんか少し理解できた気がする。ちょっと表にしてトドメを刺してよ
    • よしきた!

各言語のトレイトぽいものまとめ

言語名前API実装衝突部分状態継承個別動的利用方法
SmalltalkTraits××××use
ScalaTrait××extend(〜with)
RubyModule××include/extend
pure-traits×use
ruby-traitsuse
Perl6Role
JavaInterface×××××××-

[衝突]メソッド名が衝突したときのケア、[部分]一部のメソッドのみ取り込み、[状態]変数を保持できるか、[継承]親への委譲、[個別]インスタンス別の設定、[動的]インスタンスに実行中に付与

Rubyのruby-traitsが最強じゃね?これをRubyのデフォルトにすればよくね?

経緯

  • てかさ、何か今更感があるんだけど。てか、Smalltalkは今までモジュール化できなかった?
    • うん。メソッドをカテゴリ化する方法は最初からあるけど、再利用はできない状態だった
  • で、最近(?)、Traitsでその機能を入れましたよ、と
    • うん。正確にはTraitsを最初に作ったのは「Self」で、最近Squeakにも取り込まれた(ver3.9)
  • Selfって福岡のオブジェクト指向の会社?
    • それは誰も知らねーだろw。Smalltalk系譜のプログラミング言語「Self」
  • で、Selfは一般的なSmalltalkと何が違うの?
    • 一番大きな違いは、クラスを持たずに全てインスタンスな点
  • へぇ、prototypeちっくか。JavaScriptに似てるね
    • うん。JavaScriptはSelfの影響を強く受けてるので、JSの元祖とも言える
  • クラスがない代わりに、インスタンスメソッドの束をTraitsで管理してますよ?的な?
    • そう。共通なメソッド定義ができさえすれば、クラスでなくてもいいよね、な精神
  • あれ?じゃあ逆に、Smalltalkにはクラスがあるから、Traitsは必要じゃなくね?
    • うん。Selfには必須だけど、Smalltalkには必須ではないのかもしれない
  • 絶対に要らないって、Traitsイラネ!
    • 一応、Smalltalk、例えばSqueakに追加された理由、としては2つの説がある
  • お。1つ目は?
    • 単一継承のみでメソッドを共通化させる方法には限界がある

単一継承の限界

  • ん?もっと具体的に言うと?
    • 共通化のために親クラスにメソッドが集まり過ぎる
  • 凄い数になるの?今日日画面大きいからメソッド100個ぐらい余裕で表示してやんよ!
    • Morph(SqueakのGUIライブラリ)のベースクラスのメソッド数は1500
  • ちょw。なんかメソッドをまとめて管理する方法作れよ!
    • Traitsじゃねーかw
  • でも、表示だけならカテゴリ情報を駆使して何とかならね?
    • そだね。表示よりも、既存の機能を再利用するために継承せざるを得ない、というのが問題かも
  • ああ、それは痛いね。クラスブラウザで見ると無駄なサブクラスが大量にできてたり
    • そう。クラスの性質を意味するべき継承のツリーが、いつのまにか機能的な必要性から副作用で汚染されてる
  • 多重継承でやりたいことをうまく単一継承に取り込む解の1つなのか>Traits
    • うん。Rubyもそうだけど、両者のいいとこ取りをうまくできてる
  • で、理由は2個あったよね?もう1つは?
    • うーん、まあ、なんというか、欲しいという人もいるので、機能的にあってもいいはず、、、
  • ああ。要するに言語比較のスペックシートで、Traitsの欄に印を付けたかった(ふがfg
    • おっと、悪口はそれまでだ

使い方

Traitの定義

Trait named: #TProperties
  uses: #()
  category: 'TraitsLesson'
# インスタンスメソッド
at: key
  ^self properties at: key
at: key
  put: value ^self properties at: key put: value
properties
  ^self baseDictionary
...
# glue部分
baseDictionary
  self explicitRequirement
baseDictionary: aDictionary
  self explicitRequirement

Traitを利用するクラス

Object subclass: #MyClassA
  uses: TProperties
  instanceVariableNames: 'myDictionary'
  ...
# glue部分
baseDictionary
  ^myDictionary ifNil: [myDictionary := Dictionary new]
baseDictionary: aDictionary
  myDictionary := aDictionary

(完全なコードは、参考1にある参考資料)

  • Traitの実行は独自のコンテキストで行われる
  • Traitは呼び出し側のオブジェクトを知らない
  • Trait内で呼び出し側のインスタンス毎の値を保持できない (stateless)
  • 各オブジェクト毎に固有の情報を扱うには require と呼ばれる架け橋(method)を利用する
  • インスタンスとTraitを接合するこの部分はglueとも呼ばれる

感想

トレイトを実装する(or 取り込む)言語が年々増えているので、やはり方向性は正しそう。ただ、SqueakのTraitsに関しては、以下の問題点がある。

  • ステートレスはやっぱり使いづらくね? (glue部分が激しく冗長で苦痛)
    • → stateful trait が検討されている
  • 継承できないの不便じゃね? (Trait内でsuperできない)
    • → trait の適用順序で挙動が変化するのが嫌、という主張らしい
    • → それは理解はできるけど。でもねぇ...
  • てことで、そもそも使われてない?
    • → Pharo1.0でも標準装備、GNU Smalltalk でも採用。ということで増えてはいる
    • → でも、Squeak4.1では軽量化と言われるが、「無効にしやすい構成になった」というのが本音

この現在の仕様(stateless、unchainable)のせいで、Smalltalkerには積極的な利用者はいなそう。個人的には、statefulかつ利用時にstate初期値を明示できるタイプのミックスインが最終形だと思ってる。Ruby+Scalaゴチャ混ぜで書くと、こんなイメージ。

trait KVS {
  def get(key:String)
  def put(key:String, value:String)
  private
    val storage:Storage
}

trait SQLite3 extend KVS {
  ... // SQLite3 operations
}
object Registry extend SQLite3(:mem)
class User extend SQLite3("file:db/users.db")

user = User.find_by_name("maiha")
user["foo"] = ...
user.extend SQLite3("file:db/debug.db")
user.save!

勉強会の感想

てことで、初めて参加したけど、アットホームで新参にも優しい雰囲気でした。(Smalltalkインスコしてないのもバレなかったし)。Smalltalkを全く触ってなくても、今回のTraitsのようにピンポイントで興味のあるテーマに参加するのもよさそうです>Smalltalk勉強会。他言語の視点に立つと、色んなものが見えてきますね。異文化交流重要!

参考

  1. Smalltalk勉強会#21 http://www.smalltalk-users.jp/Home/gao-zhi/dai21kaismalltalkbenkyoukai
  2. RubyTraits-0.2 であそぶ http://d.hatena.ne.jp/sumim/20071105/p1
  3. Self http://labs.oracle.com/self/

2010-06-27 [長年日記]

[℃-ute] 岡井ちゃん、寝る

「今、日本一の美人は誰?」そんなアンケートを仮に全国民に行ったとすれば、色んな意見が出る中、結果は恐らく「黒木メイサ」になるだろう(仮説1)。では、問いを「日本一可愛いのは誰?」に変えてみる。すると、結果は確実に「岡井千聖」になるから不思議だ(俺調べ)。そんな今をときめく岡井ちゃんが、Ustでグダグダ生放送しちゃう、という夢のような企画。その名も「岡井ちゃん、寝る」。いつも無邪気で驚くほど自然体。アイドルでありながら自らを過度に飾らないのが彼女の一番の魅力である。そんな自由気ままな彼女にさらに自由を与えると、一体何が起きるのか!?想像しただけでも興奮で震えが止まらない小一時間。それが「岡井ちゃん、寝る」。結果から言えば、アイドル史に残る神番組でした。そもそも番組なのか?ネットの普及に伴い日々多様化するエンターテイメントの中においても、この瞬間、何かが変わった気がした。

名場面

番組が始まり気合が入る岡井ちゃん
開始から見事にノープランな岡井ちゃん
WC日本代表について熱く語る岡井ちゃん
twitterのコメントをdisる岡井ちゃん
ウイイレが不調でシメオネ風の岡井ちゃん
「僕らの輝き」を披露する岡井ちゃん
サビで暴れだす岡井ちゃん
ひと仕事を終えて就寝する岡井ちゃん

名言

  • 「℃-uteの裏事情とか話しませんよ。今日は千聖しか居ないんだモン!」
  • 「ズバリ、WCの優勝はアルゼンチン!」
  • 「(えーい、えーーい)ちさとー!」(僕らの輝き)
  • 「もうわかんない歌詞」
  • 「これね、第2回目が必ずあるよ!」

企画者、運営者、お疲れ様でした。是非2回目の開催もお願いします。

参考


2010-06-04 [長年日記]

[ruby] 変数宣言が欲しい

Thor タスクを書いていて

  desc "load KVS_FILE", "load data from given KVS file"
  def load(kvs_file)
    case kvs_file
    when "shift"
      ksv_file = Dir.glob("kvs/requests/*").sort.first
    when "pop"
      ksv_file = Dir.glob("kvs/requests/*").sort.last
    end

   p kvs_file

load("shift") しても "shift" が表示されちゃう謎の現象に遭遇。

  • 実は Thor は引数を symbol とか特別なオブジェクトにしてる?
  • あれ、case 文って文字列直接はダメだっけか?(classみたいに)

とか色々調べること10分。原因に気付いて愕然としました。てことで、やはり Ruby にも変数宣言が欲しい、というか、無いとダメだ!しかもオプションで使えるレベルでなくデフォ強制が必須。ワンライナー(golf)用途に、disableにするオプションがあるぐらいの勢いで。

  • 人間の単純なミスだからそれは使う側のユーザの問題

という正論が成立しそうだが、それは違う。そういうつまらないミスを言語(環境)が指摘してくれることで、ユーザはもっと本質的なロジック部分だけに集中できるのだ。というのも、コンパイラ言語を使った後でRubyに戻ってくると、そういう非本質的な部分(変数名を必死にケアするとか)にも神経を使う必要があって、同じ時間のコーディングでも遥かに疲れるのだ。この知見をRubyにうまく還元して、Rubyをもっといいものにしたい。


2010-05-24 [長年日記]

[Ruby][Scala] MVCフレームワーク速度ベンチ2010梅雨

仕事でレスポンスを大量に捌きたいという要求があったので、現時点で自分が使いそうな各MVCフレームワークを調査しました。調査対象は render text で、コントローラのアクションレベルまで到達してすぐに文字列を返す能力のMAX値です。サービス稼動中のサーバでの実測値ですので、厳密な値ではありませんが、おおよその目安としてどうぞ。

スコア

名前バージョンサーバ戦闘力 (req/sec)
rackrack-1.1.0thin-1.2.7 3239.98
sinatrasinatra-1.0thin-1.2.7 1444.84
play-scalascala-0.6play-1.1-r912 1151.97
merbmerb-1.1.0thin-1.2.7 1117.48
railsrails-2.3.6thin-1.2.7 547.34
  • concurrency: 1
  • requests: 10000

感想

生rackは反則かもしれないが、その速さは異常。値に度肝を抜かれたので、早速rackで実装してみた。その結果、

  • 生rackはさすがにマゾイ (エラー処理とか低レベルの面倒を見るのが面倒)
  • リクエスト解析とか色々やるとすぐに戦闘力が2000程度まで落ち込む

ことがわかった。もし3000フルにでれば生rackで頑張るけど、実用のためには他のフレームワークがやってることを追加する必要があって、Rackミドルウェアがあるにしても、そのへんを組み合わせる労力とスコアの落ち込みを考慮すると、ちょっと割に合わない感じがした。

ということでsinatraを採用。実際は、sinatraベースのMVCである monk-glue を利用。上記のベンチ用ではない実際のアクションでの戦闘力が900程度出たので満足。Merbでもいいんだけど、今回は少しでも速いものが欲しかったので回避。Railsは3.xに期待。あとは、play-scalaが意外と健闘してるのが嬉しい。ただ、現時点ではplay,scala-module共に不安定なのでproductionでは使いづらい。play-1.1 が正式リリースになったら速攻で移住する予定。今後3〜5年を見据えると、Scala+Actor+WebSocketは重要になるだろうし、そのインフラとしてのplay-scala with akkaは凄く楽しいはず。

詳細


サイト内検索 (by Google)

| JRuby | Rails | Berryz | ℃-ute | エッグ | jQuery |

過去

2010年
7月
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 31

未来

コンタクト