トップ «前の日(02-01) 最新 次の日(02-03)» 追記

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

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|

2005-02-02 危ねっ!危ねって!!

% [雑談] 5年目のスタッドレスには、ブラックアイスバーンは危険

今日は朝からスリリング体験。大きなカーブにさしかかったところで、路面がブラックアイスなことに気づいてヒヤリ。ちなみにブラックアイスバーンとは、ぱっと見、単なる濡れた路面に見えるのに凍ってるってやつです。相当滑ります。滑る滑るってアンタ、受験シーズンだってのにまったく(爆

んで、カーブに突入してから気づいたもんだから、わりとオーバースピード気味でして、このときばかりは FF 車であることを怨むってもんです。ここまで滑る状況の場合、FF 車はかなり繊細な対応が求められます。ちなみにどんだけ滑るかってーと、後輪が自然と流れるくらい。FR 車ならアンダーステアが出るくらいですよ。冬道じゃなければ頭文字 D の世界です。

こういう路面状況でオーバースピードでカーブに突っ込んでしまった場合、FR なら「危ねえっ!!」つって一気にアクセル抜けば良いんだけど、FF でこれをやるとかなり危険です。たぶん今日ぐらいの滑り方だと、それをやった時点でスピンします。

FF 車でこういう状況に陥った場合、一番大事なことは『焦らない』ことです。FF 車のくせにケツが流れるくらいですから、駆動輪に至っては常にズルズル状態です。つまりアンダーステアの状態です。でも、だからと言って焦ってステアリングを切ってはいけません。特に『曲げたい』と思って内側に切ってしまうと、グリップが戻った瞬間タックインしてスピンです。

というわけで、こういう場合は、ゆっくりとアクセルと戻しつつ、ステアリングもちょっとずつ、こじるようにして内側に入れていきます。決してステアリングを切りすぎないこと。

ちなみに、こういうことって、FF じゃなく 4WD でも起こりますね。つーか、後輪も駆動してる分、場合によっては返って危ないです。4WD が冬道で持つ利点って、実は発進が楽だとか、エンジンブレーキが均等に効くとか、そのくらいですよ。まあ、除雪が行き届いていない雪の深い地域なんかだと、スタックしづらいという利点もありますが、街中ならあんまり意味ないです。

ともあれ、冬道の運転には気を付けましょうってことで。

% [雑談] 突然どこからかたくさん referer が付いたので何事かと思ったら…

VPC7 と FreeBSD5.x のネタでリンクされてたらしい。ああ、やっぱ結構気にしてる人いたんだなあ。

でも、そのわりに拍子抜けする程単純な回避法なんで脱力してたりするかも。実際わしも、このことに気づいたときは脱力もんだったし(笑

% [FreeBSD] あれ? 4.11R って出てたのか?

アナウンスなんて来てたかな。全然覚えがないが。まあ、どうでも良いや。5.3 インストールできたし。

% [PC] 松下アイコン訴訟

新聞の一面にも載ったし、いたるところで話題になってるこの件なんだが、どうも納得いかないことがある。

「アイコンの機能説明をさせる第1のアイコン」をクリックしてから第2のアイコンをクリックすると、
第2のアイコンの機能説明をしてくれる処理

% というのが特許の内容だそうだが、

問題となったのは、一太郎と花子に搭載された「ヘルプモード」機能。
マウスの絵と?マークによるボタンをクリックしてヘルプモードをオンにしておくと、
マウスカーソルに合わせて各機能の説明文がバルーン(吹き出し)内に表示される。

% 最近、一太郎なんて触ったことないんで、実物は見ていないんだが、これと同じような機能って Windows にも付いてませんか?さらに言えば、Windows のその機能って、元々は MacOS のバルーンヘルプのパクりだと思うんだけど、果して松下は Micro$oft や Apple に文句を言ったり、あるいはすでにライセンス契約していたりするんだろうか?

なんか、こういうのって考えるのがイヤだね。そもそもこういうユーザインターフェースに関する特許なんておかしいよ。別に特許を取ったって良いけど、こんな形で行使するのは間違ってる。はっきり言って、誰のためにもならんだろ。まともな神経してる人なら、今回の件で間違いなく松下に対してネガティブイメージを持つだろうし、そうじゃない人は、ジャストシステムの製品をやめて、M$ の製品に乗り換えるかもしれない。どっちにしろ日本の経済にとってはマイナスだ。

わしは別にジャストシステムは好きじゃない(つーか、どっちかと言えば嫌いな部類かも)し、逆に松下は、Let's note が好きだったこととか、TRON 陣営なこととかで、わりと好きな部類だったが、なんかイメージ逆になりそう。事実がどうあれ、そういう結果を残すできごとであったのは確か。

% [Mac][FreeBSD] すでに出ていた VPC7 と FreeBSD5 問題の答

日本語の情報ばっかり求めてしまうから、こういうのを見逃すんだ(苦笑

英語が苦手でも、ちゃんと調べようと思った、今日この頃。でも 2ch はやっぱりこういうとき、役に立ちそうで役に立たんなあ。

% [game] 富豪的 GT4

無茶してんなあ(笑)。

% [game] 明日は OG2 の発売日

そうですのよ。スーパーロボット大戦 ORIGINAL GENERATION 2 の発売日なんですのよ、奥さん。もう、なんたってね、正体バレバレのアノおっさんが出てきたときに、エクセレンあたりがどんなツッコミするかとか、楽しみでしょうがないですよね。・・・期待するところがおかしくないか?


2006-02-02

% [game] セガラリー日記、復帰編

ようやく体調が良くなってきたんでセガラリーとかやってる。 いや、他にやる事あるだろーって話ではあるんだが、まあなんつーのかリハビリ(謎)ってことで。

二つあるメモリーカードのどちらがメインで使ってたものか忘れたんで、適当に入れてみたら 206RC に乗ってた古い方のだった。 んで、どうせインプだって行き詰まってるんだからこっちで良いや…と思って 206 をマニュアルで乗るようにしてまったりプレイ。

んー、多少成績は良くなったか? 誤差の範囲な気もするが。

四年目の真ん中くらいでやめてたんだけど、そこから半年くらいプレイしたらプジョーから SRC 参戦のオファーが。 大した成績も残してないのに、チャレンジャーだなあ(笑

そんな感じで、せっかくだから契約。 まあ、あんまりまじめにやる気無いので、すぐにアマに落とされると思うけど。


2007-02-02

% [Smalltalk] とりあえず Smalltalk で最初にびっくりすべきところ

% rlwrap gst
GNU Smalltalk ready

st> 2 * 4 + 1!
9
st> 1 + 4 * 2!
10

な、なんだってー!?

要は演算子だろうが何だろうが全部メッセージで、優先順位とかは特別扱いしないよ…ってことなんだろうけど、知らないとビビるよ、これ。 ある意味 LISP に近いかも。 優先順位関係無しに、先に計算されるべきところはカッコで囲まざるを得ないところが。 まあ、算数へのこだわりが無ければ、こっちの方があいまいさが無くて嬉しいという見方もできるけど。

……実はわし、結構こういう状況でかけ算のところをカッコで囲みたくなるタイプなのよね。 「えーと、まずかけ算が先で…」とか考えるのがめんどくさいっつーか(苦笑)。 さすがに恥ずかしさがあって、結局カッコは付けないんだけど。

ちなみに上記の例における "!" は Smalltalk の文法的には必要の無いもののはずで、GNU Smalltalk の対話環境で「ここまで入力したものを評価しろ」という合図でしかない。 OCaml で言うところの ";;" みたいなもんか。

% [Smalltalk][Scheme][Dylan] 所詮、関数型言語とかオブジェクト指向言語なんて何を基準に抽象化するか (しやすくチューニングされてるか) の違いしか無いのさ (極論)

やー、なんかメッセージ式がカッコの無い LISP に見えるというか何というか。

% cat add.scm
(define (f . args)
  (let-keywords* args ((x 0)
                       (y 0))
                 (+ x y)))

(print (f :x 1 :y 2))
% gosh add.scm
3

こんなのがあるとして、

% cat add.st
Object subclass: #F
   instanceVariableNames: ''
   classVariableNames: ''
   poolDictionaries: ''
   category: nil.

! F class methodsFor: 'adder' !
x: arg1 y: arg2
   ^(arg1 + arg2)
!!

(F x:1 y:2) printNl.
% gst add.st
3

同じじゃね? まあネタだけど。

それはそれとして、メソッド定義のときの "!" の使い方がイマイチしっくり来ない。 なんつーか、どこで必要でどこで必要無いのかがよくわからんというか。 とりあえず、適当に試してみた感じだと、F class に methodsFor を送ってる前後にはどうしても必要っぽい。 あとメソッド定義の後の二個も (これが特によくわからん)。 ともあれ、よくわからんので、そういうもんだと憶えてしまうしかないのかも。

ちなみにおまけで Dylan バージョン。

% cat add.dylan
module: add

define function f(#key x, y)
   x + y
end;

define function main(name, arguments)
   format-out("%d\n", f(x:1, y:2));
   exit-application(0);
end function main;

// Invoke our main() function.
main(application-name(), application-arguments());
% ./add
3

Dylan のキーワード引数の扱いはステキすぎると思う。 特にキーワードが :x じゃなく x: なところがポイント。 オプショナル引数だけじゃなく、必須引数にもキーワード付けられるし。 OCaml のラベル引数みたいに変なゴミ (~) 付けなくて良いし。

% [Smalltalk] 新しい言語を触るとき、ついつい調べてしまうこと

それは末尾再帰が最適化されるかどうか。(ちょっと病気です)

% cat tail_recursion.st
!Object methodsFor: 'tail recursion test'!
f: aNum
   (aNum <= 0)
      ifTrue:  [ ^ 'end.' printNl ].
   self f: (aNum - 1)
!!

|o|
o := Object new.
o f: 100000
% gst tail_recursion.st
"Global garbage collection... done, heap grown"
"Global garbage collection... done, heap grown"
"Global garbage collection... done, heap grown"
"Global garbage collection... done, heap grown"
"Global garbage collection... done, heap grown"
'end.'

うーん、なんじゃこりゃ。 メソッド呼び出しにスタック使ってないってこと? それとも単にスタックがデカイだけか? ちなみに再帰の回数を 1,000,000 にすると、

% gst tail_recursion.st
"Global garbage collection... done, heap grown"
"Global garbage collection... done, heap grown"
"Global garbage collection... done, heap grown"
"Global garbage collection... done, heap grown"
"Global garbage collection... done, heap grown"
"Global garbage collection... %

GC に失敗したらしくて、変なとこで止まった。 でも、そもそもあのコードでヒープフルってことは末尾再帰は最適化されてない気がするんだけど、スタックのサイズに上限が無いってことなのかね。

% [Smalltalk] コードブロック

要するに Ruby の Proc オブジェクトかな?

st> !Object methodsFor: 'test'!
Object
st> adder: x
st>   ^ [ :y | x + y ]
st> !!
st> Smalltalk at:#obj put:(Object new)!
Object new "<0x2036c78>"
st> Smalltalk at:#f put:(obj adder: 1)!
BlockClosure new "<0x20371a0>"
st> f value:2 !
3
st> [:x :y | x + y] value: 3 value: 4 !
7

なんか value: メッセージの使い方を見ると、一つ目を使った時点で部分適用されたブロックが返ってきてるような気もするんだけど…

st> [:x :y | x + y] value: 3 !
Object: BlockClosure new "<0x2037d40>" error: wrong number of arguments
SystemExceptions.WrongArgumentCount(Exception)>>#signal
SystemExceptions.WrongArgumentCount class(Exception class)>>#signal
BlockClosure>>#value:
UndefinedObject>>#executeStatements
nil

そういうわけではないようだ。ちょっと残念。 ここで使っている Smalltalk というのはシステムワイドな辞書で、こいつにシンボル (頭に # が付いてるのがそう) をキーに値を登録してやることでグローバル変数みたいな使い方ができるみたい。

メソッドに特定の値を返させたい場合は "^" を使って指定する。 逆に言うと、^ を使わないと自動的に self が返るようになってる。 なんか Python っぽい (Python で返ってくるのは None だけど)。

それはそれとして、やっぱ Ruby に似てるなあと思うね。 字面は結構違うけど、やってることは Ruby そっくり。

% irb
irb(main):001:0> class Object
irb(main):002:1>   def adder(x)
irb(main):003:2>     Proc.new {|y| x + y}
irb(main):004:2>   end
irb(main):005:1> end
=> nil
irb(main):006:0> obj = Object.new
=> #<Object:0x5cbc0>
irb(main):007:0> f = obj.adder(1)
=> #<Proc:0x000600cc@(irb):3>
irb(main):008:0> f.call(2)
=> 3

ね。 sumim さんとこでも結構 Smalltalk で書いて Ruby に直訳ってことをやってるけど、なんかすごく納得って感じ。 逆に Objective-C なんかは字面は結構似てる (メッセージ式なんかは、わりとまんまだ) けど、同じようなことやろうとするとかなり違った感じになるはず。 コードブロックにあたるものが無いし (メッセージ式に角括弧使ってる時点でコードブロックを採用する気が無かったのがバレバレ)。 そういや Objective-C 2.0 でクロージャがサポートされるとかって話はどうなったんだっけな?

% [Smalltalk] 配列は 1-origin

これは気を付けないと。 まあ、イテレータがあるからインデックスに気をつける場面って少なそうではあるが。

st> #(1 2 3 4 5) at:1!
1
st> #(1 2 3 4 5) at:5!
5
st> #(1 2 3 4 5) at:0!
Object: Array new: 5 "<0x2043f18>" error: Invalid index 0: index out of range
SystemExceptions.IndexOutOfRange(Exception)>>#signal
SystemExceptions.IndexOutOfRange class>>#signalOn:withIndex:
Array(Object)>>#checkIndexableBounds:
Array(Object)>>#at:
UndefinedObject>>#executeStatements
nil

% [Smalltalk][雑談] 先生、どうしても printNl を println って書いてしまいます

たくさんの言語に手当たり次第手を出すことの弊害がここに(笑

つーか println って何の言語だっけ。Java か? System.out.println か。

OCaml は print_endline だな。これは忘れないぞ。 Haskell は putStrLn だっけ。 Ruby は puts か? まあ p を使っちゃうこと多いけど。 Python は print、Scheme も print か? Scala は Java の影響か Console.println だな。 Nemerle はまんま .Net だから System.Console.WriteLine とか。 Erlang にはたしか改行付きの出力は無かった気がする。

なんかすごくどうでもいー豆知識を披露してしまった……

% [Smalltalk][Python] セミコロンの扱い

なんかごちゃごちゃ色んなページ見ながらやってたら、どこに書いてあったのかわかんなくなっちゃったんだけど、Smalltalk におけるセミコロンって単なる式の区切りじゃないんだね。

st> !Object methodsFor: ''!
Object
st> add: x and: y
st>   ^ x + y
st> !!
st> Smalltalk at:#obj put:(Object new)!
Object new "<0x2038cf0>"
st> obj add: 1 and: 2!
3
st> (obj add: 1 and: 2) printNl!
3
3
st> obj add: 1 and: 2; printNl!
an Object
Object new "<0x2038cf0>"

要するに、セミコロンの前で使われてるのと同じレシーバーにメッセージを投げるという動作をするらしい。

これだ。Python に今必要なのはこれですよ。 どんな記号使うかは別として、同じオブジェクトに連続してメッセージを送る文法があれば、いちいち None を返されて悲しい思いをすることもなくなるよ。 例えば $ を使うとして、

ary = [1,2,3,4]
ary.append(5); $.append(6)

こんなとかさ。 あー、でも生粋の Pythonista からはブーイングが出そうかもなー。 わしは結構欲しいけど。 記号は $ じゃない方が良いかな。$ だと Perl を思い出すから(爆

% [Smalltalk] 文法は最初にここを見るべきだった...orz

ここ→ A Simple Overview of Smalltalk Syntax.

% [Smalltalk] Class reference とか見ながら模索、Namespace 編

Namespace とか RootNamespace とか見つつ。

st> Namespace current name !
#Smalltalk
st> Smalltalk addSubspace: #Hoge !
Namespace new: 32 "<0x20369e0>"
st> Namespace current: Hoge !
Namespace
st> Object subclass: #Fuga
st>   instanceVariableNames: ''
st>   classVariableNames: ''
st>   poolDictionaries: ''
st>   category: nil
st> !
Fuga
st> Fuga new printNl !
a Fuga
Fuga new "<0x2038338>"
st> Namespace current: Smalltalk !
Namespace
st> Fuga new printNl !
stdin:12: undefined variable Fuga referenced
st> #{Hoge.Fuga} value new printNl !
a Fuga
Fuga new "<0x2039ae0>"
  1. Smalltalk というのがグローバルなネームスペースで、
  2. そこに Hoge という名前のサブネームスペースを作って、
  3. カレントネームスペースを Hoge に切り替えて、
  4. Fuga というクラスを作って、
  5. カレントが Hoge のときは単に Fuga でアクセスできて、
  6. カレントを Smalltalk に切り替えると単に Fuga ではアクセスできなくて、
  7. #{Hoge.Fuga} value で Hoge ネームスペース上の Fuga にアクセスできた

というような流れ。#{Hoge.Fuga} value というのは、さっきの文法のページに載ってた binding 式とかいうもの。 こうじゃなくて↓のようにも書けるが、ネームスペースのネストが深くなると、たぶん binding 式の方が簡潔に書ける。

st> (Hoge at: #Fuga) new printNl !
a Fuga
Fuga new "<0x203b090>"

漠然と、この Namespace って仕組みは Gauche のモジュールに似てるかなという気がする。 基本的に親ネームスペースの環境を引き継ぐので、上書きしないかぎり親と同じものが見えるとか (上の例で言えば Object を何も考えずに使えてるあたりがそう)、カレントネームスペースを切り替えられるとか。

% [Smalltalk] category って何のためにあるんだろ?

正直さっぱりわからない。 クラスオブジェクトに category ってメッセージを送るとそのクラスのカテゴリが返ってくるんだけど、だから何? って感じだし。 一瞬 Objective-C のカテゴリを思い浮かべたけど、全然違うものっぽい。

まあ、comment メッセージなんてのもあるし、単にクラスブラウザとかで見るときに分類に使われるとかその程度なのかもしれないが……

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

Before...

% jijixi [こんな使い方全然知らなかったです(苦笑 うまく使えばキレイなコードが書けそうな気がしますね。]

% sumim [カテゴリーには、クラスを整理するためのクラスカテゴリーと、メソッドを整理するためのメッセージカテゴリがあります(後者..]

% jijixi [なるほど。 いずれ Squeak をいじったりすることもあるかも知れないので、そのときのために憶えておくことにします..]


2009-02-02

% [雑談] スーパーボウル前半終了 (一応ネタバレ無し)

スーパーボウルレコードキターwww

これはもう今後ちょっとやそっとじゃ破られない。 っていうか、記録的に破れるのかどうかすら、わしにはわからないw

なんだかもうすごい試合になってしまった。 少なくとも歴史に残るものになったのは確実。

% [雑談] スーパーボウル後半終了 (ネタバレしません)

良い試合だった。 そして、アメリカンフットボールって時間の使い方が難しいスポーツだなあ、と改めて思った。

心情的には最後のあそこはレビューしてくれと思ったが、まあ判定が覆っても結果は変わらなかっただろうなあ。

ともあれ、ほんとに良い試合であった。 色々めずらしいものも見れたしね。

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

% きむら(K) [お心遣いに感謝します :) もうアレから一年ですかあ。 #某ITMediaの某blogが盛大に結果を速報かまして..]


トップ «前の日(02-01) 最新 次の日(02-03)» 追記

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

RSS はこちら

jijixi at azito.com