トップ 最新 追記

Route 477



2008-10-01

[linux] Gnome端末が起動しなくなったと思ったらscim-launcherが暴走していた

よくあることなのね…。

解決法。端末で入って~/.anthy/last-record2_defaultの最終行をvi等で削除する。


2008-10-02

[idea] IRCで、各チャンネルの会話が混ざって困る問題

例。LimeChatだと現在見ているチャンネル(今日は#Lisp_Schemeでした) 以外の発言が下のウィンドウに表示されるんですが、

18:58 <#scheme> schumaml has joined (i=c19b5f04@gateway/web/ajax/mibbit.com/x-97876dd3fb664040)
18:58 <#scheme> aspect: r6rs broke the back of any illusions that scheme is still a platonic ideal whose specification can exist independently of a range of useful, conforming implementations
18:58 <#Haskell> luqui: but proving that is a little over the top for day-to-day programming
18:59 <#Haskell> Spockz has joined (n=info@84-245-23-159.dsl.cambrium.nl)
18:59 <#Haskell> BONUS: well you can write 5 / 3 / 3
18:59 <#scheme> eli: aspect: what's part of the point?  Making Scheme known for a particularly bad implementation to make the "Scheme is a useless toy that you must suffer through in some schools" myth stronger?
18:59 <#Haskell> BONUS: and / is only left associative

会話がまざっててわけわかんねー。

縦分割なり横分割して、複数チャンネルを同時に眺められるインターフェイスがあればいいんじゃないかなと思うんですがどうだろう。

本日のツッコミ(全2件) [ツッコミを入れる]

hashy [下画面は、行をダブルクリックしたら上画面がダブルクリックした行のチャンネルに切り替わりますよ]

yhara [おお、その機能は知りませんでした。ありがとうございます。]


2008-10-03

[Ruby/SDL] Ruby/SDLでボタンを作るライブラリを書きました

「Ruby/SDLで、マウスで押せるボタンとか簡単に作れたりしない?」という要望があって、さくっと作ってみました。

使用例はこんな感じです。 ec979f5ff7c80540640918cf02540700.png

button1 = SDL::Button.new(0, 0, image)

で作って、

  when SDL::Event::MouseButtonDown, SDL::Event::MouseButtonUp
    SDL::Buttons.check(event)

で状態を更新して、

button1.pushed?

で押されたかどうか判定します。

実は

 button1 = SDL::Button.new(0, 0, image) do
   puts "button 1 clicked"
 end

みたいにイベントハンドラを指定できたりしますが、イベントループとのかみ合わせを考えると、pushed?で命令的にやる方が初心者には分かりやすいかなぁと思ったりなんだり。


2008-10-04

[zsh] 指定したディレクトリからscreenを起動するzsh functionを書いてみた

僕はかなりタブを開きまくる子で、1つのscreenで複数のプロジェクトの作業を平行すると何がなにやら分かんなくなるので、 最近はプロジェクトごとにscreenを起動するようにしている。

が、作業を始めるときにいちいち

 % cd ~/proj/hoge
 % screen

と打つのが面倒になってきた。偉大なハッカーは面倒なことを繰り返さない、皆さんもよくご存じですね。

んでまあいつもならシェルスクリプト書く流れなんだけど、ふとzshにfunctionという機能があったのを思い出した。

# start screen from given directory
function sc(){
  cd $1
  screen
}

.zshrcにこんな風に書いておくと、「sc ~/proj/hoge」で指定したディレクトリからscreenを起動できるようだ。

引数は$1や$*で取るっていうのは、シェルスクリプトと同じでわかりやすいね。まぁfunciton sc()の括弧はなんのためにあるんだと思わなくもないけど…。

[prog] 「1GBの文字列をstrlenするのに必要な時間は?」をやってみた

普段ならめんどいからスルーするんだけど、これ即答できるとカッコいいよねということでチャレンジ。 以下ネタバレ注意。

-
-
-

えーと、strlenってなんだっけ(そっからかよ)。いや文字列の長さを求めるのは分かってて。 Cだから、null終端だよな。

ということは文字列の先頭から見ていって、1GBめの \0 を見つけるまでに何秒かかるかっていう ことでいいのかな。(*1に「fast strlen〜」みたいなリンクがあるってことは、多分違うんだろうけど…とメタ推理*1)

1GBは1024 * 1024で 1048576バイト。問題は1秒間に何バイトスキャンできるかだけど… って、それ文字列がメモリ上にあるかディスク上にあるかで違うじゃん。 strlenってことは、とりあえず全てメモリ上にあると考えて良いのかな。

メモリの読み出し速度ってどれくらいなんだっけ?分からないので検索する。

うん、3GB/s とか 4GB/s とからしい。とりあえず4GB/sとしよう。

超単純に考えたら、1秒(1000ms)に4GBだから、1GBは250ms?こんなんでいいのかなぁ。

答え合わせ

おっと、メモリじゃなくてCPUがボトルネックになるのか…!なんとなくCPUだから余裕で速いよねとか思ってしまった。 「fast strlen」の方だと0.26秒だから、理論値にけっこう近いってことか。

何やってるのかはよくわからんけど、SIMDってことは、一度に複数のデータを取ってきて \0が入ってるかまとめて調べる…という方向で高速化してるんだと想像。

*1 違ってなかったっぽい


2008-10-05

[book] プラネット・グーグルの表紙がジョジョっぽい件

Stack Stock Booksを見て気づいたんですが

「ゴゴゴゴ」「ドドドドドド」て!

この惑星の全ての「情報」を掌握する……
それが俺の「プラネット・グーグル」

[misc] 睡眠がうまくコントロールできない

また夕方に昼寝してしまった…(←既に昼寝でもない)

睡眠が正しくないケースは4パターン考えられて、

  1. 開始点が早すぎる(昼とか夕方に気づいたら眠ってるケース)
  2. 開始点が遅すぎる(夜更かし)
  3. 終了点が早すぎる(3時とか5時に目覚めるとか)
  4. 終了点が遅すぎる(寝坊)

となる。

まあ分類したところで特に意味はなく、せいぜい「ここ一週間で全パターン網羅したぜ!」と喜ぶくらいか。いや喜べないぞ。


2008-10-06

[esolang] P''に関する最初の論文を探しています

http://q.hatena.ne.jp/1221708568#c131059shiroさんのコメントから知ったんですが、 brainf*ckの元となったP''(P prime prime)という言語が存在するんですね。

P''はチューリング・マシンをモデルにした言語で、「R」と「λ」と「()」のみから出来ています。

可能な操作は

  • R: ヘッドを右に1移動 (※P''ではテープは左側にのみ無限長。右端では移動できないので単に何もしない)
  • λ: ヘッド位置の値をインクリメントして左に1移動 (※上限に達したら0に戻る)
  • ( ): while。ヘッド位置の値が0でない間、括弧内のコードを繰り返す

となっています。(厳密にはテープに書かれるのは数値とは決まって無くて、{a0, a1, .. an}という記号の集合とされています)

んでぱっと見ではbrainf*ckより貧弱そうなんですが、

  • r: λ R
  • r': r r r r ... r (rをn回行う)
  • L: R' λ

と定義することによって、brainf*ckの [ ] + - < > が ( ) r r' L R に対応するので、実はbrainf*ckと同じ能力を持つと。(IOは除く)

記号がn+1個なので、rをn回行うと一周してデクリメントすることになる、というのがポイントですね。(+1しか用意しないというのはGrassも一緒ですけど、うえのさんはP''を知っていたのだろうか)

何の話だっけ、そうだ、Wikipediaで触れられている論文1「On a family of Turing machines and the related programming language」が検索しても 見つからないのですよ。1964年と古い論文だから残ってないのだろうか…。どなたか入手手段をご存じの方がおられましたらご一報ください。メールアドレスはyhara.at.kmc.gr.jpです。

(追記: 「元となった」は嘘かも知れません。「brainf*ckの作者がP''を意識していたかは定かではない」って書いてますね。)

本日のツッコミ(全2件) [ツッコミを入れる]

shiro [International Computation Centre自体が無くなって久しいので、ICC Bulletin..]

yhara [やっぱり、そもそも電子化がされてないのですね。 NIIで検索するというのは思いつきませんでした。ありがとうございます..]


2008-10-07

[event] 百万遍チャーの会

今年もあるそうです。2008年10月17日(金) 14:40〜17:10(+懇親会) だそうで。

京都近辺の学生さん(特に就活中の)は行ってみるといいとおもうよ。

[prog] 言語コミュニティの成功例としてのWiliki

この前freenodeの#Lisp_Schemeでid:g0000001さんと話してて気づいたんだけど、Gauche公式サイトのWiliki はプログラミング言語のコミュニティとしてはかなりの成功例なんじゃないだろうか?

知らない人のために紹介しておくと、GaucheというのはScheme言語のいち処理系で、 Wilikiというのは Gaucheで書かれたWikiエンジンです。んでGauche公式サイトに設置されているWiliki(以下、単にWiliki)が、なんというか Gauche使い、Scheme使いの溜まり場になっているというわけ。

Schemeという言語の「現在」に興味がある人は、とりあえず「最新の更新」を見ておけばどんな話題があるのか分かるし、 Schemeで実用的なプログラムを書きたい人は、自分の名前のページを作ってやっていることを書けば詳しい人からアドバイスがもらえたりする。

Schemeという比較的マイナーな言語が日本でこれだけ広まってる(Schemeも含まれるShibuya.lispとかね)のは、Wilikiの存在がかなり貢献したんじゃないかな。

僕が考える「Wilikiが成功した理由」は以下の3つです。

完成させなくても書き込める

「作品一覧」とか「サンプルコード集」だと完成させないと投稿できない感じですが、Wilikiには途中経過とかうまくいかなかった例も書いて良い。

頻繁に更新がある

だいたい2〜3日に一度は誰かが何か書いているので、 サイトを訪れる楽しみがある。

詳しい人が見ている

Gaucheの作者のshiroさんを始め、歴戦のSchemerが更新をチェックしているので、 どんな込み入った質問も答えてもらえそう…という安心感がある。

これらを踏まえて

適用先について考える。

例えば「Ruby」に関するWikiを立てる…だとちょっと範囲が広すぎる感じがする。「Rails」もまだ大きいかも知れないけど、なかなか良さそうだ。

んで、僕が一番合いそうだと思ったのがruby-game-devなのです。ここをWiliki的な使い方(ユーザごとにページ作ったりとか)すれば、 なかなかいい雰囲気になるんじゃないかなと思うんだけど。どうでしょう。

本日のツッコミ(全4件) [ツッコミを入れる]

Before...

yhara [いいですね! とりあえずfreenodeに#ruby-game-devというチャンネルを立ててみました。]

星一 [ありがとうございます。どの時間帯ならいます?]

yhara [昨日はお疲れ様でした。>hajimehoshi]


2008-10-10

[lisp] なぜ京都ではCLOSをシーロスと読むのか?に関する邪推

「シーロス」のソースは以下。

世間一般では「クロス」が多いようですが( http://shinh.skr.jp/yomikata/#CLOS )、ではなぜ京都ではシーロスと読まれるのか。

そもそもCLOS = Common Lisp Object Systemなわけで、「C」と「LOS」に区切るのは不自然なわけです。…普通のLisperにとっては。

じゃあ普通のLisperじゃない人って何だ?「C」と「LOS」に区切る理由があるとすれば、それは「Common」Lisp以外に独自のオブジェクトシステムを備えたLisp方言がある場合。

となれば、最後に残るのはそんなLisp方言があるのか?という疑問ですが、

ISLISP's object system, ILOS, is for the most part a subset of CLOS.

[ISLISP - Wikipedia, the free encyclopediaより引用]

謎が解けましたね :-) *1

*1 といいつつウラは取ってません。タイトルにあるように、邪推です

本日のツッコミ(全2件) [ツッコミを入れる]

arton [see-losをklosと読む人が増えたね、というような発言があるような(元々はsee-losと発音してたんじゃない..]

yhara [あー、「CL」でひとまとまりにするのは最近の人の感覚で、当時(*Lispが乱立してた時代)のLisperの間では「C..]


2008-10-11

[web] 自分に付けられたはてなスターをまとめて確認する方法

もしかしてあんまり知られてない?と思うのでメモ。

http://s.hatena.ne.jp/ から「ようこそ○○さん」というリンクをクリックすると、自分のはてなスターまとめページが見れます。

右上に、「Favorites」「Blogs」「Stars」「Report」という4つのリンクがあるはず。それぞれ以下のようなページです。

Favorites(トップ)
自分がスターを付けた人の最近のエントリ
Blogs
自分のブログ一覧(はてブとかハイクとかも含む) それぞれのブログが、いままで総計いくつのスターをもらったかがわかる。
Stars
自分が最近つけたスターの一覧。
Report
自分が最近もらったスターの一覧。

僕はそんなに記事をたくさん書く方ではないので、2週間に一回くらいReportを眺めると、ブックマークしたときのコメントやはてなハイクの投稿に いつの間にかスターがついてたりして、ちょっと嬉しい気分になれます。

Favoritesは、トップページになっていることからも分かるようにjkondoが一番やりたかったことなのかな?と思いますが、 そんなに興味のない記事が多かったりして、現状ではあまり役に立ってるとは言い難いです。 「自分がスターを付けた人は、自分と気が合う人が多いはず」という仮説は正しそうなので、何かもうちょっと上手い方法はないかな。



2008-10-13

[ruby][mac] Ruby treemap gem を使って、ディスク使用量を二次元グラフ化するスクリプトを書いた

使用例。

9fe3ef45fff241857954aaedaf17fdd4.png

要するにSpaceMongerみたいなもんが欲しかったんですけども、 Mac向けのが見つからなかったので自作した(Linuxならxdiskusageとかxduとかがある)という話。

Rackを使ってるので、rackup du.ruでWebサーバを起動して、ブラウザで眺めます。リンクをクリックするとそのディレクトリ以下を表示。

起動方法:

  1. gem install rack treemap
  2. du ~/ > a.du
  3. ソース中のa.duのパスを自分の環境に合わせて書き換える(ダサすぎる…)
  4. rackup du.ru
  5. http://localhost:9292/にアクセス

ソースはこちらです。

ちなみに、超適当に作ってるので明らかなバグがあって

  • duデータに書いてあるパスしか表示しないので「残りの部分」が表示されない
  • ので、ファイルしかないディレクトリを表示すると「node 0」とか表示されちゃう

まぁgistなんで誰か頑張って直すといいよ!

本日のツッコミ(全2件) [ツッコミを入れる]

ちく [GrandPerspective http://grandperspectiv.sourceforge.net/ ..]

yhara [おお、やっぱりあるんですね。ありがとうございます。]


2008-10-17

[vim] vimで俺filetypeを作成する方法

vim-users.jpチャットで教えてもらった方法まとめ。

例えば foobarというファイル形式(拡張子 *.fb)を作るとしたら

  1. ~/.vim/syntax/foobar.vim を作成
  2. ~/.vim/filetype.vim に、拡張子*.fbをfoobarと見なす設定を追加

とすればいい。

syntax/foobar.vimを作成する

vimのシンタックスハイライトは、正規表現でマッチした箇所に色を付けていくかんじ。

既存のを参考にして書き換えるなどする。

filetype.vimを作成する

:help new-filetype

を参照。

上の例なら、

if exists("did_load_filetypes")
  finish
endif
augroup filetypedetect
  au! BufRead,BufNewFile *.fb           setfiletype foobar
augroup END

みたいに書く。

あとはvimを再起動してasdf.fbとかを開けば色が付いているはず…!


2008-10-19

[ruby] 世界のナベアツに Ruby で挑戦する : 記号を減らしてみたバージョン

世界のナベアツに Ruby で挑戦する - Tociyuki::Diary の別バージョン。

require 'nabeatsu'
include Nabeatsu
 
(1.から 40).まで{
  3.の倍数 と 3.がつく数字 の時だけ アホに なって
  5.の倍数 の時だけ 犬っぽく なって
  8.の倍数 の時だけ 気持ちよく なります
}

記号を減らして、より文章っぽくしてみました。

実行結果はこんなんです(手抜き!) warning出まくりですが無視してください(後述)。

[d:\proj\misc]ruby -Ks nabeatsu-run.rb
nabeatsu-run.rb:5: warning: parenthesize argument(s) for future version
nabeatsu-run.rb:5: warning: parenthesize argument(s) for future version
nabeatsu-run.rb:5: warning: parenthesize argument(s) for future version
nabeatsu-run.rb:5: warning: parenthesize argument(s) for future version
nabeatsu-run.rb:6: warning: parenthesize argument(s) for future version
nabeatsu-run.rb:6: warning: parenthesize argument(s) for future version
nabeatsu-run.rb:7: warning: parenthesize argument(s) for future version
nabeatsu-run.rb:7: warning: parenthesize argument(s) for future version
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
(気持ちいい 32)
(アホな 33)
34
(犬っぽい 35)
(アホな 36)
37
38
(アホな 39)
(犬っぽい 40)
[d:\proj\misc]

nabeatsu.rbのソースは http://gist.github.com/17824 からどうぞ。instance_evalの代わりにcatch/throwでやってみました。 「現在の数」が事実上グローバルなのが格好悪いですがまあいいや。

1.9ではどうなるか

んでここからが(実は)本題なのですが、上のスクリプトをruby 1.9で実行するとどうなるでしょうか?

[d:\proj\misc]\prog\ruby-1.9.0-2-i386-mswin32\bin\ruby nabeatsu-run.rb
1
2
(アホな 3)
4
(犬っぽい 5)
(アホな 6)
7
...

なんと、警告が出なくなるんですね。

 parenthesize argument(s) for future version

というメッセージからも分かる通り、 もともとRuby 1.9ではメソッド呼び出しの引数内ではメソッド呼び出しの括弧が省略できなくなる 予定でした。 なぜ、逆に例外を出さないようになったのでしょう?

気になったのでまつもとさんに聞いてみたところ、 「文法を簡単にしようと思ってたんだけど、RubyConfで『括弧の省略を駆使していかに英語っぽい コードを書くか』という内容でまるまる1セッション使った発表があって、諦めた」とのことでした。 なるほど……。


2008-10-20

[ruby] Rubyで広がる日本語DSLの世界!!

昨日のネタウケたので、悪ノリしてみました。

Rubyを使って自然言語(というか英語)っぽい記述を行うライブラリといえばRSpecがまず例に上がるんですけど、 最近はもう英語に近くなりすぎて、日本人にとっては逆に使いにくくなっているんじゃないかという気がするんですよ。

このままでは英語圏と日本人のプログラマの生産性の格差は高まるばかり、 ていうか正直に言って英語ばっかりずるい、ここは一つ日本語を生かしたコード、日本語DSLの登場が待ち望まれているのではないか。 以下「それなでしこでできるよ」禁止。

というわけで妄想してみました、日本語でBDDを行うライブラリ、その名も「Japanespec」。

require 'japanespec'
include Japanespec

"Ruby".の 仕様{
  # ==
  Math.sqrt(4).は 2.に なる      #案1
  Math.sqrt(4).は 3.に ならない
  Math.sqrt(4).は 2, である      #案2
  Math.sqrt(4).は 3, ではない

  # be
  [1,2,3].include?(3).は 正しい     # be_true
  [1,2,3].include?(4).は 正しくない # be_false
  [].first.は nil.に なる           # be_nil
  [1].first.は nil.に ならない      # not be_nil

  # equal?
  5.は 5.と 同一である
  "5".は "5".と 同一ではない

  # should change
  obj = 1
  lambda{ }.は obj.の :prop.を 変える
  lambda{ }.は obj.の :prop.を 1.から 2.に 変える

  # has, include
  ary = [1,2,3]
  ary.は 2.を 含む
  ary.は 3.個の :item, を持つ
  ary.は 3.個以上の :item, を持つ
  ary.は 3.個未満の :item, を持つ

  # respond_to
  ary.は :size, :length, に応答する

  # raise
  lambda{ }.は 例外 を投げる
  lambda{ }.は 例外 ArgumentError, を投げる
  lambda{ }.は 例外 ArgumentError, "foobar", を投げる

  # match
  str = "abcde"
  str.は /abc/.に マッチする

  # satisfy
  obj = 1
  obj.は {|o| o<3 and o%3 == 1 }.を 満たす
}

どうでしょうか?

まだ中身の実装はしてないんですけど、恐ろしいことにこれ、ちゃんとパーズが通ります。ソースはgithub。

暇な人は冬休みの課題として実装してみるといいよ!

テクニカルなこと

以下、Rubyで日本語DSLを設計する際の注意点など。

まず、Ruby 1.8だとwarning出まくるんで1.9でやりましょう。1行目の「# coding: utf-8」も忘れずに。

上のソースがどのように解釈されるかですが、一つだけ例を挙げると

 str.は /abc/.に マッチする

というコード(コードですよ)は、

 str.は(/abc/.に(マッチする))

と解釈されます。より分かりやすく書き換えると、

 str.foo(/abc/.bar baz())

ということ。foo, bar, bazというメソッドの呼び出しがネストしてるわけです。日本語版ではそれぞれ「String#は」、「Regexp#に」、「Japanespec#マッチする」ね。 こんな感じで、

 obj.foo bar baz

のようにメソッドや関数を並べるのがRubyによる日本語DSLの定石です。

ちょっと凝ったことをしたいときには、つい

 foo(bar, 3) baz

みたいにカッコを使いたくなりますが、これはパースエラーになってしまいます。 「あれ、fooがProcオブジェクトを返したらいけるんじゃね?」と思ったあなたはScheme脳(もしくはHaskell脳)(もしくはPython脳)で、 Procオブジェクトを実行するには

 foo(bar, 3).call baz
 foo(bar, 3)[baz]

のようにcallか[]が必要です。まあcallは論外ですが[]も記号だらけになってあんまりよろしくないですね。

なのであり得る形としては、

 a.foo b.bar baz, 3

のように一番右のメソッド呼び出しだけ引数をカンマで区切るくらいかと思われます。 もっとクール(笑)な書き方を見つけた方はご一報ください。

本日のツッコミ(全4件) [ツッコミを入れる]

Before...

yhara [例えば(ary.は 3.個以上の(:item).を 持つ).みたいな? "これはすごい"]

星一 [ケータイ小説プログラミングの予感!]

yhara [あたし 彼女.スイーツ(笑)]


2008-10-22

[junk] プログラミング言語書籍を執筆するたった一つの方法

喫茶店に籠もる。これしかない。

いろいろ試行錯誤したのだが、自宅で執筆を行うことは不可能であるという結論に達した。もうゲームしてたらいつの間にか12時パターンは嫌なんじゃよー。原稿が進まないストレスで死んでしまう。

面白いのは会社で終業後に作業してもあまり進まないということ。もちろんネット接続が使えるというのもあるけれど、 どちらかというと周りが知らない人ばかりの方が捗る傾向があるように思う。M2のときも電車内とかバス停のベンチでコード書いてたし。

しかしなー、○月○日とか間に合わんだろうjk…あ、誰か来たみたいd

[junk] 雑誌休刊ラッシュ

http://jinakanishi.tumblr.com/post/54751664

むー。休刊した雑誌の作成に費やされていたエネルギーはどこに行くのだろう。それに値するだけの定期的でまとまった情報をネットは提供できているか。 上位互換ならいいけど、情報量が減るのは人類にとって損失ではないか。とかなんとか…。

「LOGiN」「H」「猫の手帖」あたりは表紙が思い浮かぶなぁ。

[games] BLOCKSUM omake versionについて考察する

ランキング1000件突破を記念してBLOCKSUMの別バージョンが公開されたようです。おめでとうございます。

以下ネタバレあり。

変更点

  • 「0」が追加された。
  • 10以上の数字が無くなった。9の次はまた0に戻る。
  • ボール(特定の数字を消すやつです)が無くなった。

第一印象

同じルールのままでよくここまで別ゲーにしたな、と思った。w

例えば「2」を作るのに、「1 1」だけじゃなく「8 4」とか、足して12になる組み合わせも検討しないといけないなど、通常版よりも暗算力が試される気がする。 適当につなげていっても良いのだけど、途中経過で間違って3ができたりとか暴発が多いのであまりおすすめできない。

とはいえ基本ルールは同じなので、通常版をやりこんだ人は有利だろう。 特に「7」の作り方とか、スペシャルステージ(LvA, LvB)での立ち回りとか。

システム的にはリプレイがなくなったのが痛い。上級者のプレイを参考にできないので。 ニコ動に期待。

おさらい

数の作り方をまとめておく。特に重要なのは太字で。

2
11
3
12
4
13, 22, 112
5
14, 23, 122
6
114, 123, 222
7
124, 133, 223 //苦手(´・ω・`)
8
125, 134, 224, 233, 1124 //LvBで重要
9
127, 135, 144, 225, 234, 1125, 1224, 1233
0
145, 136, 244, 334, 1234

10は通常版では超重要だったんだが、omake版では0になってしまうので使い道がない。…と思うが、使いこなせば役に立つのかもしれない。要検討である。

戦術の違い

通常版と比べ、10などの2桁数字の重要度が下がり、小さい数字の重要度が相対的に上がった。

特にLv7〜9では10や9や7を作るのが定石だったのが、あえて3(および13)や5(および15)などを狙うという選択肢が増えている。10以上の数字についても作り方をまとめるべきかも知れない。

戦略の違い

まだスコアがどんな風なのか分かってないのだが、多分通常版と同様にロールゲーな 予感がするので(笑)、戦略については変化がないと思われる。即ち、

  • 道中は多少スコアを稼いだところで意味がないので、タイムアタックに徹する。
    • このために、まず自分の得意なステージを把握する。
    • 得意なステージでは、一気に100個消去するのではなく、90個と90個の2回に分けて消す。つまり得意なステージで消去数を稼ぐ。
    • 苦手なステージでは、消去数101個を目指す。つまりなるべく早く終わらせる。
    • Lv9も同様。消去数が100を越えても全く意味がない。とっととロールに突入するべき。
  • スタッフロールではなるべく速くLv20を目指す。

という感じ。

追記

もう少し遊んでみてのメモ。

  • 通常版と比べると、パターンじゃなくアドリブが重要なゲームになったのかも。パネポンとかマジドロとか。
  • 0ってなんかおじゃまぷよっぽい。数学でいうと零元
  • ロールの各面は通常版と全く別の戦略を考える必要がある。(もともと10以上のオンパレードだったからな)

ロール攻略(著しくネタバレ)

  • Lv10 : 1 3 7
    • 通常版では7安定だが、omake版なら3でも構わない。
    • 3で時間を稼いで7がいいかなぁ。7は313。
  • Lv11 : 1 4 9
    • 同様に4→9。9は414
  • Lv12 : 1 3 5 7
    • 8かなぁ。17および35で。
    • 適当に2とかで時間を稼がないと、8を8個作る前に死ぬ。怖い。
    • なるべくキリよく終わらせないと次が辛い
  • Lv13 : 2 4 6
    • まあ6だろjk
    • Lv12の残り物をうまく処理する必要がある。
  • Lv14 : 1 9
    • 通常版では10か11だが、omake版では2安定。2は9111。
  • Lv15 : 0 1 9
    • この0はひどいwww
    • Lv14と同じく2安定。0を適宜巻き込む。
  • Lv16 : 0 1 2 6
    • 6を無視して2か3…かなぁ。
  • Lv17 : 1 2 8
    • これ初見じゃ絶対死ぬだろ!
    • 2を作るのがいいのかなと思う。282で。しかし分かってても難しい。
  • Lv18 : 1 3 9
    • 実は3+9で2なんだよね。4をどうするかだけど、499 でなんとか2にできるな。
    • 別解として3を狙うのもありか? 49と913で。
  • Lv19 : 6 7 8 9
    • これはひどいwww
    • よく考えると 69、78で5を作ればいいのか?

てか道中が8分台じゃここまで行けないな。

本日のツッコミ(全2件) [ツッコミを入れる]

mts [俺も勉強するときはモスとかガスト行くなあ。集中度合いが全然違います。一応耳栓があればいいと思います。]

yhara [耳栓、たまに欲しくなりますw その後、会社ではかどらないのは会話の内容が中途半端に自分に関係あるからだと気づきまし..]


2008-10-23

[prog] 正規文法、文脈自由文法、解析表現文法

について調べたのでまとめ。それぞれ Regular Grammer(RG), Context Free Grammer(CFG), Parsing Expression Grammer(PEG)とも。

解析表現文法はPEGって呼ばれる方がずっと多いよね。てかPEGが「文法」の一種であることを今まで分かってなかった(^^; 「パーズ関係の新しいやつでしょ」みたいな。

正規文法 < 文脈自由文法 =?< 解析表現文法 の順で、表現できる言語が増える。 (追記:CFG<PEGであるとはまだ証明されていないそうです(コメント欄を参照))

  • 正規文法はいわゆる正規表現のもとになったやつ。(現在のLLのRegexpは拡張されまくりなので正規文法以上のものも解析できる)
  • 文脈自由文法はBNF記法で書けるやつ。
    • 文脈自由文法(のサブセット)の解析方法として、LL法とかLR法がある。さらに、いくつ先読みを許すかによってLR(1)とかLL(k)がある。
    • 先読み個数が多いほど文脈自由文法の限界に近づけるが、多くのプログラミング言語の文法はLR(1)の範囲で解析できるらしい。
      • LR法の中にさらに「○○LR法」という分類があり、例えばyaccやbisonが対応しているのはLALR法
  • 解析表現文法(PEG)はわりと新しい文法で、プログラミング言語の解析に向いているらしい(曖昧さが残らないとか、レキサーがいらないとか)。
    • PEGの範囲の言語は再帰下降方式*1で解析できるらしい。
    • もっと効率のいい解析方法として、Packrat Parserが知られている。

図にすると以下のような理解でいいのかな。

(複雑)
  ↑
  | 解析表現文法(PEG)?
  | 文脈自由文法(CFG) - BNF
  |       LL(k) LR(k)
  |         :     :
  |       LL(1) LR(1) - yacc, bison (LALR(1))
  |
  | 正規文法(RG)
  ↓
(単純)

*1 一言でいうと、パーザを手書きしたらこうなるよねっていう感じのやつ

本日のツッコミ(全3件) [ツッコミを入れる]

k.inaba ["文脈自由文法 < 解析表現文法" とは限らない、と思います(CFGで書けるけどPEGでは書けない文法がある、と予想..]

shiro [まだ証明はされていないんでしたっけ>CFGで書けるけどPEGで書けない文法 何か回文のようなやつがPEGでは無理なん..]

yhara [ありがとうございます。 Wikipediaに > 全ての形式言語が文脈自由ではない。文脈自由でない例として {a^n..]


2008-10-29

[ruby] ruby 1.9.1 preview1きた

とりあえずtest結果など貼ってみる。

uname -a

/Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1 % uname -a
Darwin orange 9.5.0 Darwin Kernel Version 9.5.0: Wed Sep  3 11:29:43 PDT 2008; root:xnu-1228.7.58~1/RELEASE_I386 i386

make test

#218 test_io.rb:11:in `<top (required)>':     begin       require "io/nonblock"       r, w = IO.pipe       w.nonblock = true       w.write_nonblock("a" * 100000)       w.nonblock = false
       t1 = Thread.new { w.write("b" * 4096) }
       t2 = Thread.new { w.write("c" * 4096) }
       sleep 0.5
       r.sysread(4096).length
       sleep 0.5
       r.sysread(4096).length
       t1.join
       t2.join
     rescue LoadError
     end
  #=> not finished in 10 seconds  [ruby-dev:32566]
FAIL 1/918 tests failed
make: *** [btest-ruby] Error 1

おや?もう一度やってみる。

PASS 918 tests
./miniruby -I./lib -I.ext/common -I./- -r./ext/purelib.rb  "./bootstraptest/runner.rb" --ruby="ruby"  ./KNOWNBUGS.rb
2008-10-29 11:24:14 +0900
Driver is ruby 1.9.1 (2008-10-28 patchlevel 0) [i386-darwin9.5.0]
Target is ruby 1.9.1 (2008-10-28 revision 19983) [i386-darwin9.5.0]


KNOWNBUGS.rb 
PASS 0 tests

通った。(さらにもう一度試したけど、三回目もちゃんと通った)

make test-all

Finished in 315.233066 seconds.

  1) Failure:
test_systemcallerror_eq(TestDelegateClass) [/Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1/test/test_delegate.rb:18]:
[ruby-dev:34808]

  2) Failure:
test_execute_remote(TestGemCommandsInstallCommand) [/Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1/lib/minitest/unit.rb:144]:
[Gem::SystemExitException] exception expected, not
Class: <Errno::EACCES>
Message: <"Permission denied - /Users/yhara/.ri/cache/.doc_dirs">
---Backtrace---
/Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1/test/rubygems/test_gem_commands_install_command.rb:117:in `block (2 levels) in test_execute_remote'
/Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1/test/rubygems/test_gem_commands_install_command.rb:116:in `block in test_execute_remote'
/Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1/test/rubygems/test_gem_commands_install_command.rb:115:in `test_execute_remote'
---------------

  3) Failure:
test_handle_special_CROSSREF_no_underscore(TestRDocMarkupToHtmlCrossref) [/Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1/test/rdoc/test_rdoc_markup_to_html_crossref.rb:87]:
Expected "<p> <a href=\"../files/Users/yhara/research/Ruby/rubys/ruby-1_9_1-preview1/test/rdoc/rdoc_markup_to_html_crossref_reference_rb.html\">/Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1/test/rdoc/rdoc_markup_to_html_crossref_reference.rb</a> </p> ", not "<p> /Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1/test/rdoc/rdoc_markup_to_html_crossref_reference.rb </p> ".

  4) Failure:
test_exit_action(TestSignal) [/Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1/test/ruby/test_signal.rb:52]:
[ruby-dev:26128].
Exception raised:
<#<Timeout::Error: execution expired>>.

  5) Failure:
test_cgi(TestWEBrickCGI) [/Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1/test/webrick/test_cgi.rb:76]:
<"Customer=WILE_E_COYOTE, Shipping=FedEx"> expected but was
<nil>.

5670 tests, 2467667 assertions, 5 failures, 0 errors, 0 skips
make: *** [test-all] Error 1
/Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1 %

2回目。

  1) Failure:
test_core_03_notify(Rinda::TupleSpaceTest) [/Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1/test/rinda/test_rinda.rb:396]:
<[0, 3]> expected but was
<[1, 2]>.

  2) Failure:test_systemcallerror_eq(TestDelegateClass) [/Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1/test/test_delegate.rb:18]:[ruby-dev:34808]

  3) Failure:
test_execute_remote(TestGemCommandsInstallCommand) [/Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1/lib/minitest/unit.rb:144]:
[Gem::SystemExitException] exception expected, not
Class: <Errno::EACCES>
Message: <"Permission denied - /Users/yhara/.ri/cache/.doc_dirs">
---Backtrace---
/Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1/test/rubygems/test_gem_commands_install_command.rb:117:in `block (2 levels) in test_execute_remote'
/Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1/test/rubygems/test_gem_commands_install_command.rb:116:in `block in test_execute_remote'
/Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1/test/rubygems/test_gem_commands_install_command.rb:115:in `test_execute_remote'
---------------

  4) Failure:
test_argv0_noarg(TestProcess) [/Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1/test/ruby/test_process.rb:866]:
Failed assertion, no message given.

  5) Failure:
test_execopts_exec(TestProcess) [/Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1/test/ruby/test_process.rb:418]:
<"aaa\n"> expected but was
<"">.

  6) Failure:
test_handle_special_CROSSREF_no_underscore(TestRDocMarkupToHtmlCrossref) [/Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1/test/rdoc/test_rdoc_markup_to_html_crossref.rb:87]:
Expected "<p> <a href=\"../files/Users/yhara/research/Ruby/rubys/ruby-1_9_1-preview1/test/rdoc/rdoc_markup_to_html_crossref_reference_rb.html\">/Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1/test/rdoc/rdoc_markup_to_html_crossref_reference.rb</a> </p> ", not "<p> /Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1/test/rdoc/rdoc_markup_to_html_crossref_reference.rb </p> ".

  7) Failure:
test_exit_action(TestSignal) [/Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1/test/ruby/test_signal.rb:52]:
[ruby-dev:26128].
Exception raised:
<#<Timeout::Error: execution expired>>.

  8) Failure:test_cgi(TestWEBrickCGI) [/Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1/test/webrick/test_cgi.rb:35]:<"/path/info"> expected but was
<"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\">\n<HTML>\n  <HEAD><TITLE>Internal Server Error</TITLE></HEAD>\n  <BODY>\n    <H1>Internal Server Error</H1>\n    Premature end
 of script headers: /Users/yhara/research/Ruby/rubys/ruby-1.9.1-preview1/test/webrick/webrick.cgi\n    <HR>\n    <ADDRESS>\n     WEBrick/1.3.1 (Ruby/1.9.1/2008-10-28) OpenSSL/0.9.
7l at\n     127.0.0.1:58798\n    </ADDRESS>\n  </BODY>\n</HTML>\n">.

5670 tests, 2467644 assertions, 8 failures, 0 errors, 0 skips
make: *** [test-all] Error 1