«前の日記(2007年09月04日) 最新 次の日記(2007年09月06日)» 編集

Matzにっき


2007年09月05日 [長年日記]

_ 取材

昨日に引き続き取材。なんでも中国地方ローカルのNHKニュースのコーナーで 取り扱ってもらえるのだそうだ。 どういう扱いになるんだか。

恥ずかしい。撮影はもうちょっと先。

_ [Ruby] Ruby needs a facelift - Blogs - Byte Club - Builder AU

Rubyロゴコンテストについて。

笑っちゃうのはこのロゴ。

まあ、実際。世間的にはRailsあってのRubyとみなされていることが多いと思うので、 そうでないことを明示的に示すメッセージを発信することにはなると思う。

我々としてもRailsの知名度を利用していないとは言えないので、 あんまり突き放すのも誠実な態度ではないか。悩ましいところである。

ま、とはいえ、だからといってこのロゴを採用したりはしないけど(エントリされてないし)。

_ [言語] Why is X not written in Lisp? or C, man, C!

Cを誉め称える記事、のように見えるが、 実際には言ってることと実際が全然違う、という記事。

ほめごろし?

まあ、こういう抽象化が必要なケースでは Lispにかなう言語はなかなかないよなあ。

_ [言語] Matasano Chargen >> Four C Programming Anti-Idioms

Cのアンチ・イディオム4つ。

  1. mallocの戻り値をチェックする

    failmallocの件とは正反対だが、たしかに多くのプログラムでは どうしようもないというのも事実だ。でも、例外が使えるなら raiseした方が良いと思う。

  2. void*をキャストする

    キャストを強制されるC++と違ってCのvoid*はそのまま代入できる。 こっちの方が良い(と著者は思っている)。

  3. 小さな構造体を参照渡しする

    もうオーバーヘッドは問題ない。どんどん使おう。

  4. mallocのsize指定

    sizeofの引数に型を指定すると変更箇所が増える。 式そのものを書くと型が変わっても対応できる。

賛成できるようなできないような。

_ [言語] Recording Artist: Microbenchmarking

マイクロベンチマークの使い方。

マイクロベンチマークっていうのは 実際のアプリでないベンチマーク向けのプログラムによって 性能を測定すること。

言語処理系(インタプリタとかバーチャルマシンとか)の性能を測定すること になるが、実際のアプリケーションではむしろライブラリの性能の影響の方が大きい。 ので、大抵の場合、マイクロベンチマークは不適切に用いられている。

まあ、世間の誤解ってのはなかなか解けないよね。

なら、それを逆に利用してしまおう。

今回、YARVでマイクロベンチマーク性能を改善することで 実は世間の「マイクロベンチマーク信仰」を逆手にとって マーケティング効果があがることを 期待している。

_ [言語] SQLAlchemy, Declarative layers, and the ORM 'Problem'

PythonのORMである、SQLAlchemyとElixirではSQLAlchemyを使うべきだ、という話

SQLAlchemyの例:

from sqlalchemy import Column, ForeignKey, MetaData, Table, types
from sqlalchemy.orm import mapper, relation

metadata = MetaData()

person_table = Table('person', metadata,
    Column('id', types.Integer, primary_key=True),
    Column('name', types.String, nullable=False),
    Column('age', types.String)
)

group_table = Table('group', metadata,
    Column('id', types.Integer, primary_key=True),
    Column('name', types.String, nullable=False)
)

persongroups_table = Table('person_groups', metadata,
    Column('person_id', types.Integer, ForeignKey('person.id', ondelete='CASCADE'), primary_key=True),
    Column('group_id', types.Integer, ForeignKey('group.id', ondelete='RESTRICT'), primary_key=True),
)

class Person(object):
    pass

class Group(object):
    pass

mapper(Person, person_table, properties=dict(
       groups=relation(Group, backref='people', lazy=False)
))
mapper(Group, group_table)

Elixirの例:

from elixir import *
class Person(Entity):
    has_field('name', String)
    has_and_belongs_to_many('groups', of_kind='Group')

class Group(Entity):
    has_field('name', String)
    has_and_belongs_to_many('people', of_kind='Person')

Elixirの方がだいぶActiveRecordっぽい。ひとめ見ると誰の目にも Elixirの方が魅力的に見えるが

  • How do you add a column to the many to many table to store an additional bit of info for the join?
  • Do they both enforce referential integrity?
  • How do you control whether SA is eager loading the relation? Can you restrict it to just one column of the relation?
  • What are the table names used?
  • How many tables are in your database?
  • Where do you change the id column name?
  • Which one is closer to the Zen of Python?

というようなことを考えると(うへー、またExplicit Better Than Implicitだよ)、 やはりSQLAlchemyの方が良い(と著者は考える)。

Leaky Abstractionの弊害については理解できないでもないけど、 ここまで表現の優劣が出るのに採用しないってのは、 それがPython的ってもんなのかねぇ。

_ [Ruby] RubyConf 2007 Preliminary Agenda

RubyConf 2007の暫定プログラムが決まった。

今年からはマルチトラックということだ。 RubyConfの成長曲線を考えるとある意味必然なんだが、 今までのRubyConfらしさを失ってしまいそうで、 少し残念な気がする。いや、変化も当然なので、文句を言っているわけではないけど、さ。

2日目の午前中のセッションがIronRuby, JRuby, Rubiniusと来てるんで、 YARVもなにか言うべきではないのだろうか。

同じ日に予定されている私のキーノートの時間をあげようか? > ささだくん


«前の日記(2007年09月04日) 最新 次の日記(2007年09月06日)» 編集