横幅増加?

Yahoo!の新トップページを試してみたらずいぶんと横幅をとるようになりました。そういえばapple.comのページもしばらく前からそうなっていたようです。

かつては800×600や640×480のディスプレイも残っていたために表示幅を制限したガイドラインでウェブサイトが作られていましたが、今では横長のディスプレイも多くなって制限が緩くなったのでしょうか。

現状の幅の表示で特に不都合を感じていない身としては、横幅を多くとれるからという理由で制限を緩くするのはどうかと思います。今までウィンドウを並べて作業できていたのが、できなくなってしまうからです。

サイト制作側としては魅力的なコンテンツを配置したり広告を載せたりするスペースが欲しいのでしょうけど。

せめて個人ごとに幅やレイアウトをカスタマイズできるようになっているといいのですが。

SurfaceとTRON

MSのSurfaceを見ると、かつての映画「TRON」のラストシーンで、敵役の社長が社長室でSurface風のテーブル端末を操作し、もはやシステムが自分の制御下にないことを知るシーンを思い出します。

あれ?画面を直接操作したんじゃなくて、テーブルに映ったキーボードを操作していたんでしたっけ?

ぎんなん

先週、職場の同僚にぎんなんを1kgくらいもらいました。その同僚はブログをやってるんですが、ブログにぎんなんのことを書いたら近所の人が(!)「そんなに好きならやる」と言って8kgくれたそうです。で、そのお裾わけというわけです。

ブログの記事に近所の人が反応するというのがすごいと思いました。まあ、ローカルFMのラジオスターなのだからでしょう。

ぎんなんは食べすぎちゃいけないというのも初めて知りました。今まで、せいぜい茶碗蒸しに入った1個を食べるだけでしたから。もらった時には10個食べたら中毒になると言われましたが、ネットでは100個とか1000個とか諸説あるようです。どのみちそんなに食べたいとも思いません。

ちなみに手軽な食べ方は茶封筒にぎんなんを入れてレンジで1分30秒加熱するというものです。はじける音がするので、入れた数だけ数えて取りにいってます。

秋の味覚を満喫しました。でも台所が臭いです。

もう一つのJoy(2)

OMetaに対応しました。まだ発展途上ですがとりあえず晒しておきます。

(Squeak3.9-final7067.image, Squeak VM070309J.app, OMetaで動作確認)

サンプル用意しようと思ったら動かなくなってたのでいったん消します。再度晒します。

http://itolab.com/software/joy/Joy-Base2.st

http://itolab.com/software/joy/Joy-UI2.st

こんな感じで使います。

|j|
j := Joy new.
j run: 'DEFINE fact == [dup null] [pop 1] [dup pred fact *] ifte.'.
j run: '10 fact'.

ユーザーフレンドリーではありません。また実装しているコンビネータもかなり限られています。とりあえずの動作確認用です。

OMetaとMMetaの違い

OMetaでは先ほどの記事の通りではうまくいきません。MTestのスーパークラスをOMetaにした上で、

(MTest onString: 'a') apply: #test

とやると同じことができるようになります。

MMetaでは、

boolean ::= ‘true’ | ‘false’

のように文字列を直接書くことができていたのですが、OMetaではtokenを定めないとうまくいきません。

token :xs ::=
<spaces> <seq xs>

というのをOMetaParserあたりからもらってきて、

boolean ::=
<token 'true'> | <token 'false'>

とします。

Squeak版Meta(MMeta)について

https://squeaker.hatenablog.com/さんからいただいたSqueak版Metaの使い方に関するメールです。公開してもかまわないとのことですので私が参考にさせていただいた部分を公開させていただきます。

(前略)
match:with:というクラス側にあるメソッドがエントリポイントです。それ
から、まずテキストからトークンの列を作り、それからそのトークン列をパー
ズする、という形でパーザーを書きたい場合のために、parse:with:というメ
ソッドも用意されています。
例えば、MMetaTokenizerのtokenというメソッド定義(の文字列)は
(MMetaTokenizer sourceCodeAt: #token) string
という式で取得できますが、
MMetaTokenizer match: (MMetaTokenizer sourceCodeAt: #token) string with: #tokenize
という式を評価すると、この文字列を正しく分解して配列に収めた結果が得ら
れます。一つのトークンだけ取り出す実験であれば、例えば
MMetaTokenizer match: 'abc' with: #metaName
としてもよいでしょう。#tokenを見ると、#metaNameは#tokenの一種であり、
#tokenizeを見ると、#tokenizeは、#tokenの0個以上の列である、と書かれて
います。(どの生成規則も、規則内の最後のものを結果として返します。)
match:with:の第一引数は、ReadStreamが作れるコレクションなら何でも良
いので、Stringでなくても良いです。
MSqueakParser2の場合、
MSqueakParser2 match: '3 + (4 * 5)' with: #expr
を評価すると、独自の構文木が得られます。
独自のパーザーを書く場合は、例えばまずはMTokenizerのサブクラスを作り
(インスタンス変数はいらないので以下のように):
MTokenizer subclass: #MTest
instanceVariableNames: ''
classVariableNames: ''
poolDictionaries: ''
category: 'Meta-Examples'
そこで生成規則を定義してみます。普通のメソッドを定義するようにブラウザ
に書けばよいです。例えば、
test ::= $a | $b
と書いてacceptすると、testという生成規則が定義できます。ここですでに実
験ができるので、Workspaceに、
MTest match: 'a' with: #test
と書いて評価すれば$aが結果として返り(orを表す'|'はどちらかマッチしたものの
結果を自分の結果として返すので)
MTest match: 'b' with: #test
であれば、$bが結果として返ります。
MTest match: 'c' with: #test
であれば、失敗を表すnilが返ります。すべての生成規則は、失敗を意味する
ためにnilを返すという約束になっています。
このようにして徐々にテストして行くやり方で、比較的大きな文法も少しず
つ作っていくことができると思います。
-- Yoshiki

いつもお忙しいのに丁寧に教えていただきありがとうございました。

メールの通りにJoyParserというクラスを作り、小さな生成規則を作る→試すということをボトムアップ的にやったら数時間で完成できました。自分的にはかなりラクチン&楽しい作業でした。