航海日誌

トップ 追記
過去の日記
注意:

2010-03-09 [長年日記]

O [Scala] 祝!Scala座.com取得

やっと設定できました!

O [インターネット] 8.8.8.8の秘密

@c_nyanより

Googleも老舗とはいえ若い会社なのでクラスAどうしたんだー、と思ったんですが、分割分をお買い上げのようですか?

また他にも地域を意識したCDNのような分散DNS網を構築しているようで、興味深い記事になっています。

O [Android][Java] AndroidのJVM、DalvikはJITを搭載していない

@eyasuyukiより

  • DaivikにはJITは搭載されていない
  • Daivikはレジスタマシンである(これは有名)
  • (最近のいくつかの)ARMはハードウェアによるJavaサポート(Jazelleテクノロジー)があるが、レジスタマシンなためアクセラレーションできない
  • Sunの縛りを避けてあえて違う実装にしたのではないか?

ということらしいです。

ちなみに私は、リソースを喰うJITを避けインタプリタで勝負するために、現実的なレジスタマシンにしたのではないか、と思っています。

また大半の処理はAPI化され、Native処理されるため、実質上のDalvikの遅さは問題にならないのだという判断だと思います。

O [Java][ハード] ARMマシンでJava(OpenJDK)を使う

OpenJDKを使えば導入可能らしいです。

導入も以前に比べれば簡単になってますねぇ。

O [ハード] 小型無線キーボード+タッチパッド+レーザーポインタ

なんというかガジェット好きにはたまらんものを出しますな。

ただし実用性は?です。

Bluetooth接続じゃないところが残念です。


2010-03-08 [長年日記]

O [Android][Java][C] AndroidのJavaの速度

Javaは遅いということはよく聞いていたけれど、ここまで差が開くとは思いませんでした。演算結果もあっているので、きちんと動いていそうですし。

マイクロベンチマークは必ずしも実際の性能ではないと思いますが、1つの評価として参考になると思います。まぁあえて言うと、s/Javaは遅い/AndroidのJavaが遅い/の間違いですね(そういう意味だと思いますが...)。Java全般が遅いみたいに聞こえちゃう。

この結果を見ると、Dalvikはあまり実行時最適化は行われていないのかもしれません。

O [Ruby][プログラミング] 自分のFollowersのTLをアーカイブ化してふぁぼったーの変わりのサービスを作る


2010-03-06 [長年日記]

O [Scala] ScalaKaigi(仮)サイトを開いたよ

ただしこのサイトは明日になったらURL変わるけどね(ぉぃ。

O [Scala] Scala座(仮)第一回ミーティング

開催しました。大まかにまとめてありますので、ご意見・ご要望などください。

keisuken atmark cappuccino.ne.jp か Twitter: @keisuke_n あたりによろしくお願いします。

もちろんこの日記のコメント欄でも構いません。

O [プログラミング][言語] 祝!ガベージコレクション本

ガベージコレクションのアルゴリズムと実装 ガベージコレクションのアルゴリズムと実装
中村 成洋/相川 光
秀和システム
¥ 3,360

われらが@nari3さんをはじめとするガベージコレクション(GC)本が出版されます。

かかわっている人物がすごいですし、こんな狭い領域の濃い書籍は珍しいので、ぜひ手にとってそのまま買っちゃいましょう:-)。


2010-03-05 [長年日記]

O [OSS] TwitterがCassandraを採用する

CassandraはKey-Valueストアデータベースで、ある意味な古くて新しい技術。

スケーラビリティを考えると、テーブルをJOINするような方向に向かうのはそろそろ限界という見解が多く、このようなKey-Valueストアなデータベースがもてはやされているように思う。

そして問題はこう言った基盤技術(をどうやって構築するか)よりも、どうやって使うかに移りつつある。

このあたりはむしろ古い人間の方が経験豊富だろう(以前ひがさんがそのようなことを日記で言っていた)。

ことTwitterに関しては特に複雑な情報を検索する必要はなく、こう言ったKey-Valueなデータベースでも十分という判断なんだろう。スケーラビリティを優先した結果だと思われる。


2010-03-04 [長年日記]

O [Scala][Java] Web FlavorのViewにロジックをどう導入するか

Twitterでちょっとだけ議論したのだけど、個人的にはViewのテンプレートにロジックは入れたくない。

テンプレートにロジックを入れるということはたいていの場合、Webデザイナと何がしかトラブルを持つことになる。実際経験している人は多いと思う。

そこで考えたのは、2つの方法を提供すること。

まず1つ目。Scalaで直接書け。

WEB-INF/views/foo/boo/Bar_hello.scala

val title = "Hello, world!"
val nameList = List("Foo", "Boo", "Bar")
 
<html>
  <head>
    <title>{title}</title>
  </head>
  <body>
    <h1>{title}</h1>
{
  if (nameList.length > 0)
    <ul>{
      for (name <- nameList) yield <li>{name}</li>
    }</ul>
  else
    <p>No name list</p>
}
  </body>
</html>

もう1つは、同じViewをロジックとテンプレートに明確に分ける。

ここでのミソは、テンプレートにロジックは入れないで、文書構造で表現すること。

WEB-INF/views/foo/boo/Bar_hello.scala

nameList = List("Foo", "Boo", "Bar")
 
render(
  'title -> "Hello, world!",
  'enableNameList -> nameList.length > 0,
  'nameList -> nameList
)

WEB-INF/views/foo/boo/Bar_hello.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html
  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:wf="http://cappuccino.jp/webflavor/xhtml"
  xml:lang="ja" lang="ja">
  <head>
    <title><wf:span id="title">title</wf:span></title>
  </head>
  <body>
 
    <h1><wf:span id="title">title</wf:span></h1>
 
    <wf:if id="enableNameList">
      <ul>
        <wf:for id="nameList">
          <li><wf:span id="name">name</wf:span></li>
        </wf:for>
      </ul>
    </wf:if>
 
    <wf:unless id="enableNameList">
      <p>No name list</p>
    </wf:unless>
 
  </body>
</html>

これだったら、テンプレートをそのままブラウザでみてもちゃんとサンプルが表示され、POHPテンプレートとして働く。

今までの経験から言うと、Viewでのロジックはそう複雑なことをさせないように、かつさせる必要はないので、

  • 繰り返し要素
  • 条件分岐(if/unless)

くらいあればいいと思う。

switch文相当は欲しいが、これってよく考えてみると(X)HTML文脈では分離されてしまうので、if/unlessを拡張する方向にする。

...
<wf:if id="name" value="Foo">
ふー
</wf:if>
<wf:if id="name" value="Boo">
ぶー
</wf:if>
...

これで十分だと思う。

追記: やはりswitch欲しいかなと思ったけど、よくよく考えてみると、

Scala側(ロジック):

render(
  ...
  'nameCondition -> if (...) "Foo" else if (...) "Bar" else "default"
  ...
)

と分岐条件で何か条件名を渡しておき、

<wf:if id="nameCondition" value="Foo">ふー</wf:if>
<wf:if id="nameCondition" value="Boo">ぶー</wf:if>
<wf:if id="nameCondition" value="default">それいがい</wf:if>

という風に分岐させればいいかなと。Scala側のロジックではif式を使っていたが、ここはパターンマッチでもよい。

それからViewを階層構造にしたい場合は、

  • ロジックは分散させない1つのみ
  • テンプレートを出力するrederメソッドを階層構造にする

という感じにする。renderメソッドは明示的にテンプレート名も渡せるようにするので、

render(
  'title -> "Hello, world!",
  'header -> render('header, ...),
  'affiliate -> render('affiliate, ....),
  'footer -> render('footer, ...),
)
とすると。まぁあんまり複雑になったら対処できないような気もするので、そういう場合はコンポーネント化する。

O [Scala] Web Flavor(2.7版)にみるScala 2.8への移行シナリオ

Thanx @kmizu

いくつか気をつける点をまとめてくださいました。参考になります。

O [Scala] Web Flavorの2.8対応について

とりあえず2.8サポートはしないことにしています。これは仕事でWeb Flavorを使いたいことと、新機能を実装したバージョンを近いうちにリリースするからです。

Implicit Conversionやコレクションの継承などは今回排除することにしていますのでこのあたりの問題は解消できると思いますが、コレクション周りの互換性などの問題は相変わらず付きまとうので、両方のコードを共存させるのはあきらめたほうがいいのかもしれませんね。

サポートしないといっても2.8用のポートはしたいので、ブランチしてみますが、品質面での保証は一切しないので少しでも使えるようにするため、バグレポートやテストコードなど皆さんの協力をお願いしたいと思っています。

夏には2.8もリリースされているでしょうから、次次期バージョンでは2.8に正式対応したいですね:-)。

まぁその前にとりあえずレポジトリを立ち上げます。現在sourceforge.netにサイトを立ち上げていいるのですが、重たい、使い方がわからないなど様々な問題を考えると、自前で持っておいたほうがよさそうだという判断になりました。ホームページはsourceforge.netにしますが。

O [Scala][Java] ScalaのXMLリテラルはエロい

scala> val link = "http://examples.com/index?foo=abc&boo=cde"
link: java.lang.String = http://examples.com/index?foo=abc&boo=cde
 
scala> <a href={link}>W3C</a>
res2: scala.xml.Elem = <a href="http://examples.com/index?foo=abc&amp;boo=cde">
W3C</a>

当たり前だが、ちゃんとエスケープされてるぜw。


やること、い〜っぱい(´д`)。

トップ 追記