トップ «前の日(11-11) 最新 次の日(11-13)» 追記

じじぃの日記、ツッコミ可

Twitter: @jijixi_org
Xbox Live: jijixi

初心者が書いた OCaml 入門
Spotlight tips サイト内リンク集
1970|01|02|
2003|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|11|
2011|05|
2012|01|

2004-11-12 一言で…ってのは案外難しいものだ

% [雑談] 性戦説

さすが umz 氏。モノが違う。わしがこの前長々と書いたことを、すでにたった一言で言い表わしていた。感服。

% [PC] kterm と uim-xim での検索から referer が付くが…

わしは kterm で uim-xim を使えるようにする方法は知りません。って言うか、もう kterm にこだわる必要なんて無いんじゃないかと思うんだけど、どうなんですか。mlterm 使っておきゃあオーケーでしょ。FreeBSD なら ja-aterm も結構おすすめだけど (Debian では XIM パッチがあたってないからイマイチ)。

% [PC][FreeBSD] 5.3R の不具合、その後

結局どうにもならんので、メインマシンの環境は 5.2.1R-p11 に戻してあるんだけど、もしかしてもしかするとこのマシンが吐き出すバイナリが腐ってるのかも…ってことで、iso イメージをゲットして VPC にインストールして試してみた。…結果はやっぱり同じ。

ちなみに現在確認している不具合は、

・vim で特定の文字の表示が化ける
  どうもカラム数を取得する部分がおかしいんじゃないかと思うんだが、
  vim のソースでかすぎてちょっとやそっとじゃ追い切れない。
・ssh でログインしたリモートマシン上で Eclipse を動かすと落ちる
  BadWindow とかなんとかの X のエラーが出て死ぬ。
  でも、X のバージョンが変わったわけじゃないし、メインマシンでは XFree86 4.4.0 で
  VPC では (新規インストールしたんで) X.org 6.7.0 なのに症状は同じだしってことで
  X の問題というより ssh の問題である可能性が高いような気も…
  ほんとは ssh を通さない方法でもテストできれば良いんだが、
  設定すんのがめんどい……

% …の二つ。どちらもわしの用途的にはわりと致命的でして。やっぱしばらく 5.2.1 のまま様子見かぁ。

不具合報告くらいしておいた方が良いのかもねしれないが、どっちも問題の箇所が特定できてないし……誰かが見付けてくれるのを待とう(軟弱)。

ssh はともかく、vim のソースは一度ちゃんと読みたいと思ってはいたから、良い機会だと思うんだが、今はどうにも気力が……


2005-11-12

% [OCaml] 続 Haskell の $

向井さんによるとどうやら OCaml で "$" は使わない方が良いらしい。 まあ、わしの場合とりあえず試してみただけで、本気で今すぐにでも使おうと思ってたわけじゃないけど、中置演算子を定義する時には結合規則を気にしなきゃならないって気付いたのは収穫だった。

実はこういうのを考えてたもんで…

# class base_obj =
  object (self)
    val v = Hashtbl.create 0
    method send msg args = (Hashtbl.find v msg) args; self
    initializer
      let def msg func = Hashtbl.add v msg func in
      def "p" (fun s -> print_endline s);
      def "hello" (fun s -> print_endline ("hello" ^ s))
  end;;
class base_obj :
  object ('a)
    val v : (string, string -> unit) Hashtbl.t
    method send : string -> string -> 'a
  end

# let (@@) obj msg =
  match msg with
  sel, args -> obj#send sel args;;
val ( @@ ) : < send : 'a -> 'b -> 'c; .. > -> 'a * 'b -> 'c = <fun>

# let (<<) = (@@);;
val ( << ) : < send : 'a -> 'b -> 'c; .. > -> 'a * 'b -> 'c = <fun>

# o @@ ("p", "hoge") @@ ("hello", "world");;
This expression has type string * string but is here used with type
  < send : 'a -> 'b -> 'c; .. >

# o << ("p", "hoge") << ("hello", "world");;
hoge
helloworld
- : base_obj = <obj>

実際のものはもっと複雑だけど、とりあえずモデルとしてね。 んで、中置演算子の記号に何を使うか悩んでるんだけど、間違って @ とか使ってたらさらに激しく悩むところだったよ。

ちなみに昨日のメソッド定義ネタの p2 メソッドなんかは、

# (((o#p2())#p2())#p2())#p2();;

を、

# let (<<) obj arg = obj#p2 arg in
  o << () << () << ();;

とか書けるね。実用性はともかく(苦笑

% [雑談] 道具の使い方を憶えるのは……

シールを手ではがす作業に似ていると思うことがある。 つまり、最初の取っ掛かりさえ乗り越えれば、その後はわりとするすると進む気がするのだ。 もちろん、慎重に引っぱらないと途中で破けちゃうシールもあれば、一気にはがしちゃえるものもあるだろうけど。 さらに言えば、シールをはがしてもそれはとりあえず扱えるようになったってだけで、今度はそのはがした後をキレイに磨き上げる作業が待っていたりする。

いや、こんなこと思ったのも昨日の深夜に通算何度目かの『モナドを理解しよう』モードに入って、一生懸命解説ページとか読みつつも、結局やっぱり挫折したからだったり。 漠然とした概念はわからんでもないんだけど、どうしてもこう自分のものにできないと言うか。 きっかけさえ掴めれば一気に理解できそうな気がするんだけど、そのきっかけがどうしてもうまく掴めない歯がゆさが、なんだかシールをはがすときのもどかしさを連想させたのであった。

道具を使う時には中の仕組みを(少なくとも大体の流れくらいは)把握しないと気が済まないという性質がわしにはあって、それは長所でもあり短所でもあると思うが、そういうわけで『仕組みがわからなくても動けば良いや』ってのが許せない。 だから自動車を運転するためにエンジンの仕組みを勉強したりする。 別に整備士になったり、エンジンの開発者になるつもりは無いんだから、かなり無駄ではあるんだけどね。

そんなわけで、Haskell を使おうと思えばモナドの仕組みを理解したくなるし、何かの機械を使おうと思ったら分解してみたくなるし、何かのアプリケーションを使おうと思ったらそのソースコードを見たくてたまらなくなる。 うん、オープンソース文化万歳。

結局何を言いたいのかは、自分でもよくわからなかった。

% [雑談] 反省

最近、日記を書く時の誤字脱字に対する注意が足りない気がする。 んで、後から読み直して気付いても、直すと無駄に RSS が流れて嫌だなあとか思っちゃったりして二の足を踏んでみたり。

いやあ、文章は目でデバッグするしかないから大変だよね。 ……投稿前にちゃんと校正しよう...orz

% [PC] 昨日に引き続き Haskell のお勉強

っつーか、『Haskeller への道』を流し読みしてるだけだけど。 これくらいがちょうど良いと感じるレベルなのです、今のわしは。

ところで Haskell って『はすきゅる』って読むと思ってたんだけど、このページには『はすける』って書いてるね。 なんで『はすきゅる』だと思ったのかは憶えてないんだが、『はすける』だと微妙にダサくない? あと、「ちょっとプログラム書いてみたけど、IO モナドってウザいね。」には笑った。 ほんとそう思う。 副作用のある操作を特別なブロックに閉じ込めてしまうっていう思想(?)は、大変美しいとは思うんだけどやっぱウザいものはウザいよな(笑

Haskell もちょこちょこ遊ぶ分にはおもしろいと思うんだけど、実用的なものを書こうとなるとわしの手には余るなあ。 モナドをちゃんと理解できれば違うのかも知れないけど。

ところで唐突に 3 タブ同盟的な関数定義の書き方を思いついた。

cat fname =
   do h <- openFile fname ReadMode
      str <- hGetContents h
      putStrLn str

do 記法使ってもタブ幅 3 でピッタリ。 でもこうすると、イマイチ Haskell のコードに見えないのが不思議だ。 それはそれとして、cat の仕様が間違ってるっていうツッコミはナシの方向で。


2007-11-12

% [clip][Ruby] Pattern Matching in Ruby (The Scariest Fun : notes from a web startup)

via programming reddit.

こういう遊びは好きだなあ。 とりあえず、これが require してる ruby-debug とやらが何物か知らなくて動かせてないんだけど、サンプルコードを見るかぎり、結構よくできてる感じ。

で、これの構築には dsl.rb というのが使われていて、以前ちょっと話題になった気がするんだけど、きちんとチェックしてなかったので良い機会だしさらっと読んでみた。

そんで let の定義が気に入ったので、やってることの確認のために単純化したものを自分で書いてみたのが以下。

% cat let.rb
module Let
   def let(assigns = {}, &block)
      scope = Object.new
      assigns.each do |name,value|
         scope.instance_eval("def #{name}; @#{name} end")
         scope.instance_variable_set("@#{name}",value)
      end

      scope.instance_eval(&block)
   end
end
% irb
irb(main):001:0> require 'let'
=> true
irb(main):002:0> include Let
=> Object
irb(main):003:0> let :x => 1, :y => 2 do
irb(main):004:1*   p x + y
irb(main):005:1> end
3
=> nil

本物はもっと色々細かいこともやってるけど、まあ基本的な部分はこんな感じかと。 なんかおもしろいので、もう少しいじってみよう。

% [Ruby][雑談] Array#[1..-1]

何日か前から ruby-list で議論されてる件。

わしもこれを添字を使わずに表わすメソッドは前から欲しいとは思っているが、head/tail をあてはめるのはちょっと好きじゃないかな。 head/tail はそもそも cons セルのようなものをイメージした名前じゃないかと思うんだよね。 関数型言語のリストは先頭要素 (head/car) とそれ以外 (tail/cdr) からできている構造だというのが基本だけど、Ruby の配列はそうではないので、ちょっとイメージ合わないなと。 Ruby には first や last というメソッドがあるんだから、その辺から連想した方が良いように思う。

…… てことで、わしもいくつか考えて ruby-list に送っちゃろうと思ったんだけど、いまいちこれだっていうのが無くて結局ここでつぶやくだけにしとくことにした(弱

  • first(-1)
    • 意味がどうのより、使われてない領域を有効活用するという方向性。
  • last(-1)
    • 同上。どっちにしても -1 というのは直感的ではない気はするが。
  • unfirst/nofirst/nonfirst
    • first 以外というニュアンスの造語。キモいかな。
  • after_first
    • first より後ろ。
  • rest/remainder
    • 残りという意味合い。これは誰かが提案してた。
    • rest だと休養という意味の方が有名な気がするので、remainder の方が良いかなと思ったが、今度は剰余とごっちゃになって良くないかも。

単語としてはキモいかもしれないけど、unfirst のような系統が意味も憶えやすく適度に短いので良いような気はしてる。 かと言って、これにしようぜ〜とメーリングリストに投げるほど自信があるわけでもないんだが……

% [Ruby] パターンマッチの続き

ソースを読むかぎり ruby-debug が必要になっている部分がよくわからんので、試しに require をコメントアウトしてみたら、なんだ普通に動くではないか。 消し忘れか何かか?

まあとにかく動くようなので試す。 dsl.rb はすでに存在している前提で。

irb(main):001:0> require 'pattern_match'
=> true
irb(main):002:0> include Matchable
=> Object
irb(main):003:0> def fib(n)
irb(main):004:1>   match n do
irb(main):005:2*     with(0) { 0 }
irb(main):006:2>     with(1) { 1 }
irb(main):007:2>     otherwise { fib(n-1) + fib(n-2) }
irb(main):008:2>   end
irb(main):009:1> end
=> nil
irb(main):010:0> fib(10)
=> 55

ふむ。

irb(main):015:0> match [1,2,3] do
irb(main):016:1* with([:x,:y,:z]) do p x,y,z end
irb(main):017:1> end
1
2
3
=> nil

ふむふむ。

irb(main):024:0> match [1,2,3] do
irb(main):025:1* with(:x % :xs) { p x, xs }
irb(main):026:1> end
1
[2, 3]
=> nil
irb(main):027:0> match 'hoge' do
irb(main):028:1* with(:x & String) { p x }
irb(main):029:1> end
"hoge"
=> nil

結構自然な表記になっててすごいなあ。 なんか常用したくなりつつあるわしがいる(苦笑

ところで dsl.rb にはセットで comprehension.rb というものもあって、これはその名のとおり内包表記を実現するものだ。

irb(main):030:0> require 'comprehension'
=> true
irb(main):031:0> with Comprehension::DSL do
irb(main):032:1*   list { x * 2 }.given(:x => 0..5) { x > 3 }
irb(main):033:1> end
=> [8, 10]

このように使う。 見た目はちょっとキモいけど、ちゃんと内包表記っぽく動くので大変すばらしい。

% [Mac] Leopard の Dictionary.app にさりげなく英和・和英辞典が含まれててのけぞった

なにげなく Preference 覗いてみてびっくりしたよ。 こいつらを有効にして、パネルが開くように設定すれば、いろんなところでコンテクストメニューから辞書が引けて便利。

英辞郎のファイルを Dictionary.app 用に変換するとかいうネタもどこかで見たけど、とりあえずそんなめんどうなことしなくても、素の状態でそれなりに役に立ってくれるね。


2008-11-12

% [Ruby][Merb] Merb 1.0 がリリースされた記念にいじってみようと思った

… ので、インストールしてみたら

% sudo gem install merb
(snip)
Successfully installed merb-1.0
40 gems installed

依存する gem が大量すぎるw

ちなみに FreeBSD 6.3R に入れるときには do_sqlite3 という gem が sqlite3.h が見付からないと言ってこけるので、

% sudo gem install merb -- --with-opt-dir=/usr/local

とかしてやらないといけなかった。 なんでやねん。

続く…… かも。

% [Merb][Ruby] merb-gen app してみただけ

とりあえず Merb Wiki の HOW TO Topics を参考にさらっといじってみようと思っているところ。 で、Generate your first app にならって

% merb-gen app my-first-app

と実行してできたものを眺めた感じ。

とりあえずテストに関しては RSpec と ZenTest (の autotest) が前提とされてる風味。 あとバージョン管理は git を想定しているらしく .gitignore なんつーファイルも出力されてた。

app ディレクトリの構成は Rails を踏襲してるみたいだけど、controllers/exceptions.rb てのがあったり、それに関する views が用意されてたりする。 Rails で failsafe 的なエラーページにいろいろ細工したい場合って結構面倒なんだけど、そこら辺を簡単にしてくれる仕組みなのかな。

あと Rails だと application_helper.rb なところが global_helpers.rb になってたりとか。 models/user.rb というのが用意されてて、ちょこっと書き換えれば merb-auth パッケージのユーザ認証がすぐに使えるようになるみたいな感じなのかな? まだ外面しか見てないから違うかもだけど。

他にも config/rack.rb とか、Rack に関するデフォルト設定なんかも入ってるみたい。 そもそも Rack って具体的に何するものなのかイマイチわかってないんだけど。 (なんか WEB サーバとアプリの間に入るミドルウェア的なものみたいなんだけどなんかよくわからん。つーかまともに調べてない。)

% [Merb] Merb Slices

How to Quickstart Merb Slice Development を斜め読みしただけだが。

要するにアプリケーションのサブセットを gem として登録しておいて、他のアプリから呼び出すことで共通して使えるということかな。 これの何が嬉しいのか考えると、おそらくはアプリケーションの粒度を小さくできることなんじゃないだろうか。

例えば何かユーザ認証が必要なサイトを作ろうとすると (ちょっと極端に書くけど)

  1. 認証が絡む部分は全部一緒のアプリケーションに含めてしまう
    • アプリケーションがでかくなって、ちょっと直すたびにサイト全体がストップ
  2. 認証部分は別のアプリに
    • やり取りは WebAPI とかそういうのでやらなきゃないので、そのための仕組みができてないなら面倒
  3. 認証に必要な DB は共通で認証部分だけコピペ
    • DRY! DRY!

こんな感じかしら。 んで、スライスを使うことでコピペをすることなく 3 番目の方法を採れるようになる。 そうすると WebAPI みたいな余計な手間をかける必要無くアプリケーションを細かく分離できるようになるので、メンテナンスが楽になったり、負荷分散がしやすくなったりする…… ような気がする。

結構好みな機能のような気がするので、いずれもう少し突っ込んで調べてみよう。

% [Merb] Parts

Parts を斜め読み。

Rails の render :partial をより一般化したようなものかな。 コントローラ部分もあるから、その分 render :partial より柔軟性がありそう。 ついでにスライスで切り出しておけば再利用も簡単、という寸法だろうか。

Merb はこういう小さく切り分けるための仕組みが充実してる感じがするね。

% [Merb][Rails] Merb FAQ (What's the difference between Rails and Merb) 意訳

Rails と Merb って何が違うの?

(訳注: 以下カッコで囲っている部分は基本的に訳注)

Merb と Rails は違うものだけど似たところもあるよ。 例えば、両方とも MVC ベースなフレームワークだし、ルータ機構を持っているし、Ruby を使っている。 (Rails と一緒にすんなボケ、って言ってるようにも見える気が)

  • Merb は
    • Javascript ライブラリに寛容である (何を使っても良いようにできている)
    • ORM に寛容であ (ry
    • テンプレートエンジンに寛容 (ry
    • モジュール化されている (特定の部分だけを取り出して使いやすいようにできている)
    • 公開/非公開がはっきりとした API を持っている (公開 API を使っていればバージョンアップ時もハマらない)
  • Rails は
    • Javascript ライブラリや ORM、テンプレートエンジンについて不寛容である (事実上、組み込まれているものに制限される。あるいは他のを使おうとすると非常に手間がかかる)
    • 長く使ってる人がいるし、使ってる人が多い
Merb と Rails の書き方の違い
Rails Merb
script/server merb
script/console merb -i (webrat という gem が必要と言われるので入れる必要あり)
script/generate merb-gen (script/destroy の場合は -d オプションを付ける)
redirect_to article_path(@article) redirect url(:article, @article)
respond_to provides :xml, :js, :yaml (使う場所が違うから 1:1 で関連付けていいのか微妙
format content_type
render :xml => @article render @article
render :file => 'public/404.html, :status => 404 raise NotFound
logger Merb.logger (e.g. Merb.logger.info("Setting coordinates")) (むやみ名前空間汚さないのがステキ)
before_filter before
render :partial partial
RAILS_ENV Merb.environment (むやみに名前空間(ry )
flash[:notice] message[:notice]

ここまで。

ちなみに respond_to に関してだけど、Rails の場合

def an_action
  @record = Record.find(params[:id])
  respond_to do |format|
    format.html
    format.xml  { render :xml  => @record }
    format.yaml { render :text => @record.to_yaml }
  end
end

みたいな感じになるんだけど、Merb だと

provides :xml, :yaml

def an_action(id)
  @record = Record.get(id)
  display @record
end

てな風にして、Record クラスの方に

def to_xml
  # xml な文字列
end

def to_yaml
  # yaml な文字列
end

としておくような感じみたい。 display メソッドは要求された Accept-Type に応じてテンプレートを探して、あればそれをレンダリング、無ければ与えられたオブジェクトの to_#{type} メソッドを呼んで結果をレスポンスとして戻すというような動作らしい。 だからテンプレートを用意しておくならモデルクラスにメソッドを用意する必要は無いはず。

% [game] R-TYPE FINAL 日記、なんとか難易度 BABY でクリア

結局ヒドくハマったのはワープの面だけだという(疲

でもラスボスの倒し方がステキすぎたんで今までのストレスも吹っ飛んだ。 もうこのラスボス戦だけで元取れた気がするわ。 FINAL 波動砲は超燃える。 リアルで「おお〜!!」って声出ちゃったよ(笑

あとは、とりあえず DELTA の R13 エンディングの続きらしいステージ 3.5 をやっときたいんだけど、必要な機体はいつ手に入るのかねー。

% [clip] 「マジかよ……」ってなったゲームの展開:VIPPERな俺

177 名前:以下、名無しにかわりましてVIPがお送りします[] 投稿日:2008/11/10(月) 20:47:46.54 ID:44eec3rb0

2枚目のディスクに入ったらイキナリ振り子が揺れててエピソードが回想で進んでいった

何を言ってるかわからないと思うが俺もなにをいってるのか(ry

なんというゼノギアスw

いつになったらこの展開が終わるんだろうと思いながら、結局最後までそのままだったときの絶望感は完全にトラウマ。 「Disc 2をないことにすれば名作である」という言葉に「まあ確かにそうかもなあ」と、ついついつられてゲームアーカイブでゲットしてしまったがトラウマが邪魔をしてプレイできないという。


2009-11-12

% [objc][Cocoa] NSArray+arrayWithObjects: の罠

NSArray などの NSFastEnumeration プロトコルを実装しているクラスは拡張 for 文を使って簡単にイテレーションができる。

for (id anItem in anArray) {
  // do something
}

こういう感じ。

で、同じことを何度も書く場面があったので先に引数リストを作ってイテレーションするという、まあ他の言語ではいつもやっていることをやろうとしたんだが、なぜかそのコードがクラッシュする。 なぜなのかわかんなくて悩んで悩んでようやくわかった。

そもそも NSArray の作り方が間違っていた orz

NSArray のクラスメソッドである arrayWithObjects を使ってリストを作っていたんだが、リファレンスにはコード例としてこういうのがある。

myArray = [NSArray arrayWithObjects:aDate, aValue, aString, nil];

ぶっちゃけ、これだけ見て "わかったつもり" になって使っていたのが良くなかった。 ちゃんと他のところもよく読むべきだった。 引数の説明にちゃんとこう書いてある。

A comma-separated list of objects ending with nil.

コード例は「nil を含む配列を作っている」のではなかった。 可変長引数の終端として nil が必要ってことだった。 はずかしい、for 文周りがおかしいのかと小一時間悩んで結局解決できずにベタ書きに直した自分がはずかしい。

ということで、これから Objective-C を始める人は気をつけましょうね。 あと、NSDictionary+dictionaryWithObjectsAndKeys: も同じ仕様なので注意。

% [雑談] 読み方は「ゴー」で良いのだろうか

なんかちょっと立て込んでて、存在を知ったときにはすでにこのネタの RSS が大量にあるという状況だったんで、天邪鬼なわしとしては自分で直接いじるのはほとぼりが冷めてからにしようと思ったり。

んで RSS を斜め読みしてた感じだと仮引数とかに型を指定するときの書き方がちょっとキモい気がした。 もう少し変数名が型名かパッと見でわかるような形にできなかったのかね。

あと力を入れてるらしい並列処理関係は π 計算ぽいなと思った。 というか CPS CSP とかいう文字がちらっと見えた気もするから Occum Occam みたいな感じなのかな。 型付きのチャンネルでやりとりする辺りはそっくりだが。 select 文がちょっと高機能らしいから、それ使ってラッピングすると Actor みたいなライブラリとかわりと簡単に作れるかも。 いや、詳しく調べてないから知らんけどね。

(追記) なんかうろおぼえスキルが発動してスペル違いすぎでワロタ。 CPS だと継続渡しスタイル。

% [clip] "子供が行方不明"で捜査犬出動→わずか3分で子供発見→捜査犬、感謝状にかしこまる:アルファルファモザイク

単純にほのぼのネタだろうと思って開いたんだが写真で死んだw ポーズが素晴しすぎるwww


トップ «前の日(11-11) 最新 次の日(11-13)» 追記

日記ってのは本来、自分で読み返すためにあるもんだよなあ……
もしくは有名人になったら死後に本になったりとかか?

RSS はこちら

jijixi at azito.com