トップ 最新 追記

屑俺日記

僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。


2011-11-07(Mon) ちょっと涼しく

0から数えないで、1から数えることも

SqueezのGNU Smalltalk-3.1.6。
チュートリアルと睨めっこして、あーでもこーでもなし。

st> x := Array new: 5
(nil nil nil nil nil )
st> x at: 3 put: 4
4
st> x
(nil nil 4 nil nil )
st> x at: 6
Object: Array new: 5 "<0x558893b8>" error: Invalid index 6: index out of range
SystemExceptions.IndexOutOfRange(Exception)>>signal (AnsiExcept.st:216)
SystemExceptions.IndexOutOfRange class>>signalOn:withIndex: (AnsiExcept.st:839)
Array(Object)>>checkIndexableBounds: (Object.st:772)
Array(Object)>>at: (Object.st:832)
UndefinedObject>>executeStatements (a String:1)
nil

RLOの脆弱性

IT Pro IPAの記事。
RLOは、 Unicode Consortium のページの PDFに載っていた。
久々のpython3 (with debian squeeze)で追試してみた。

$ cat rlomark_test.py 
#!/usr/bin/env python3
 
h_a = chr(0x3042)
rlo = chr(0x202e)
h_i = chr(0x3044)
h_u = chr(0x3046)
h_e = chr(0x3048)
h_o = chr(0x304A)
 
print ("No RLO: ", h_a, h_i, h_u, h_e, h_o)
print ("First is RLO: ", rlo, h_a, h_i, h_u, h_e, h_o)
print ("Second is RLO: ", h_a, rlo, h_i,h_u, h_e, h_o)
print ("Third is RLO: ", h_a, h_i, rlo, h_u, h_e, h_o )

の、実行結果。

$ python3 rlomark_test.py 
No RLO:  あ い う え お
First is RLO:  お え う い あ
Second is RLO:  あ お え う い
Third is RLO:  あ い お え う

Snow Leopard のコマンドライン上では見えなかったが、Vim にコピペすると、次のように見えた。

$ python3 rlomark_test.py 
No RLO:  あ い う え お
First is RLO:  <202e> あ い う え お
Second is RLO:  あ <202e> い う え お
Third is RLO:  あ い <202e> う え お

で、それにもとづいて、次のような処理をやってみた。

cpname = 'foo' + rlo + 'fdp.exe' 
os.rename(orig, cpname)

notepad.exe で試す。
このファイルは、端末によっては.pdf に見えたり、見えなかったりする。
騙そうと思えば、騙せるかもしれない 程度にはなった。
アイコンを入れ替えれば、もう少しまともに見えるかもしれない。

KVMに日本語キーボード

そのままでは"_"が入力できないと気づく。
何回Twitterに書いても頭に入らないので改めてメモ。
ドメインを定義したXMLを修正。
Squeeze なら /etc/libvirt/qemu の下とか。

<graphics type='vnc' port='-1' autoport='yes' keymap='ja' />

それから sudo /etc/init.d/libvirt-bin restart を忘れないように。


2011-11-08(Tue) きょうもんき

我慢できなくなったので

こけおどしだけ。
画像など

色々加工した画像だけしかないから、信用しない向きはご自由に。


2011-11-09(Wed) きょうも涼しすぎる晴れ

GNU Smalltalk 再度

チュートリアルを(よ)みながらのgst 続く。
配列はこないだやってみたっけ。

st> x
nil
st> x := Array new: 3
(nil nil nil )
st> x
(nil nil nil )
st> y := x
(nil nil nil )
st> x at: 1 put: 2; at: 3 put: 'foo'
'foo'
st> x
(2 nil 'foo' )
st> y
(2 nil 'foo' )
st> (x at: 1) * (x at: 1)
4
st> x !
(2 nil 'foo' )
st> x
nil
st> y
nil

配列の要素数変更はどうするのか、まだわからない。

<後記>
";" は、一つのオブジェクトに連続してメッセージを送ることを意味する記法で、「カスケード」と称するらしい。
</後記>

それから集合型。

st> x :=  Set new
Set ()
st> x add: 'foo'; add: 3
3
st> x
Set (3 'foo' )
st> x remove: 3
3
st> x
Set ('foo' )
st> x includes: 'foo'
true
st> x includes: 5
false

混ぜられる記法もあるらしい。

st> set := Set new
Set ()
st> array := Array new: 5
(nil nil nil nil nil )
st> set add: 'foo' . array at:2 put: 5
'foo'
5
st> set . array
Set ('foo' )
(nil 5 nil nil nil )

載っていた "yourself" いまいち意味がピンとこないような。

連想配列は、Dictionary

幾分なげやりになってきた。

st> dict := Dictionary new
Dictionary (
)
st> dict at: 'One' put: 3
3
st> dict at: 'One'
3
st> dict at: 'ひとつめ' put: '一つ目'
'一つ目'
st> dict
Dictionary (
	'One'->3
	'ひとつめ'->'一つ目'
)

2011-11-19(Sat) 肌寒く雨

Smalltalk ちょこちょこ

Squeak の チュートリアルを眺めながらあれこれ。
Gnu Smalltalk にも色々喰わせてみている。
メッセージの区切りは、"." らしい。一行だけなら付けなくても 動くが、一応付けるようにしよう。

st> #(1 2 5 3) last.
3
 
st> y := #(4 3 'foo').
(4 3 'foo' )
st> y last.
'foo'

#( object1 object2 ...)が配列ということか。

st> x := Array new: 3.
(nil nil nil )
st> y
nil
st> y := Array new: 3.
(nil nil nil )
st> x = y
true
st> z := #(nil nil nil).
(nil nil nil )
st> x = z.
true
 
st> x at: 2 put: 4.
4
stst> z at: 2 put: 4.
Object: Array new: 3 "<0x403658e0>" error: Invalid 
value nil: object is read-only (ry
nil

うーん、いま一つわからん。

st> #('あ' 'い' 'う' 3 'foo' "bar") size.
5
st> #('あ' 'い' 'う' 3 'foo' "bar") last.
'foo'

"foo" はコメントになるようだ。

st> $a asciiValue.
97
st> $b asciiValue.
98
st> $が asciiValue.
stdin:190: Invalid character literal, only character codes \
  from 0 to 127 are valid
stdin:190: Invalid character 0xac

Squeak では ASCII以外も通るようだった。
Transcript と Workspace を開き、Workspaceに打鍵した

Transcript show: $あ asciiValue.

を評価させると、20983074 がTranscript に表示された。
Transcript clear. で消える。

st> | foo bar baz lastobj |
st> foo := #'abc'.
#abc
st> bar := foo last.
$c
st> baz := bar asciiValue.
99
st> lastobj := baz + 10.
109
st> ^lastobj.
109

GStの対話環境でもコピペ一発で動いた。
スクリプトにもできた。最終行は lastobj printNl. とする。

メッセージの優先順位

st> 3 + 7 * 5
50
st> 3 + (7 * 5)
38

文字数でなくバイト数らしい

端末によって違っていた。
例えば ja_JP.eucJP。

st> 'いろはにほへと' copyFrom: 3 to: 8
'ろはに'
st> 'いろはにほへと' copyReplaceFrom: 3 to: 6 with: 'ロハニ'.
'いロハニにほへと'

次に ja_JP.UTF-8。

st> 'いろはにほへと' copyFrom: 4 to: 12
'ろはに'
st> 'いろはにほへと' copyReplaceFrom: 4 to: 12 with: 'ロハニ'.
'いロハニほへと'

これ以外では化けたり化けなかったりする。
ちなみに Squeak の Workspace では、 copyFrom: 2 to: 4. とかでOKだった。


2011-11-20(Sun) 今日は晴れてるらしい

メッセージの優先順位

もう少しSmalltalk。
単項メッセージ 二項メッセージ キーワードメッセージ
Squeakにて。

'なかぬならころしてしまへほととぎす' copyFrom: 6 to: 10 negated + 22.
  ↓
'なかぬならころしてしまへほととぎす' copyFrom: 6 to: 10 negated + 22.
  ↓
'なかぬならころしてしまへほととぎす' copyFrom: 6 to: -10 + 22.
  ↓
'なかぬならころしてしまへほととぎす' copyFrom: 6 to: 12.
  ↓
ころしてしまへ

ただの四則演算

st> 10 + 3
13
st> 10 - 3
7
st> 10 * 3
30

ここは普通のようだ。

st> 10 / 3
10/3
st> 10.0 / 3
3.3333333333333335
st> 10 / 3.0
3.3333333333333335

% は剰余ではないみたい。


2011-11-22(Tue) 昨日から上天気にして寒冷

真偽判定

Gnu Smalltalkの チュートリアルを見つけた。感謝。

st> 10 == 10 ifTrue: [ 'OK' ] ifFalse: [ 'NG'].
'OK'
st> 1 == 10 ifTrue: [ 'OK' ] ifFalse: [ 'NG'].
'NG'

2011-11-23(Wed) 雲行きが

条件分岐続く

st> foo := 5
5
st> bar := 0
0
st> [foo >= bar] whileTrue: [ bar printNl . bar := bar + 1 ] 
0
1
2
3
4
5
nil

繰り返し

徐々に某スクリプト言語に踏襲されたっぽいものが。

st> 1 to: 5  do: [:x |  Transcript show: 'これは ', 
st>            x printString , '番目です。' ; cr.]
st> .
これは 1番目です。
これは 2番目です。
これは 3番目です。
これは 4番目です。
これは 5番目です。
1

"cr" を省略すると、出力に改行が入らなくなった。
スクリプトをファイルにすると、最後の"1"は出なかった。
"printNl"すると、

1
これは 番目です。
2
これは 番目です。
3
これは 番目です。
4
これは 番目です。
5
これは 番目です。
1

となった。
リファレンスないかなぁ。

それから、to: by: do: も。

st> 5 to: 1 by: -2  do: [:x |  Transcript show: 'これは ',
st>            x printString , '番目です。' ; cr.].
これは 5番目です。
これは 3番目です。
これは 1番目です。
5

2011-11-26(Sat) よく晴れてる。日向だけは暖かい

論理演算

ググったり打鍵したり。で、なんとか。
Gnu Smalltalk の 3.2.4 では、変数やクラスなどには マルチバイト文字が使えないっぽい。

st> s1 := Set new.
Set ()
st> s2 := Set new.
Set ()
st> s1 add: 'いぬ' ; add: 'さる'; add: 'きじ'.
'きじ'
st> s2 add: 'さる' ; add: 'ぶた'; add: 'かっぱ'.
'かっぱ'
st> s1.
Set ('きじ' 'いぬ' 'さる' )
st> s2.
Set ('かっぱ' 'ぶた' 'さる' )
 
st> s1 inspect.
An instance of Set
  tally: 3
  contents: [
    'きじ'
    'いぬ'
    'さる'
  ]
Set ('きじ' 'いぬ' 'さる' )

and はすぐわかった。
or, xor は "|" などを入れてもダメだったが、別段演算子が 必要なわけでもない。はずだ。

st> s1 & s2.
Set ('さる' )
st> s1 - ((s1 - s2) + (s2 - s1)).
Set ('さる' )
st> s1 + s2.
Set ('かっぱ' 'きじ' 'いぬ' 'ぶた' 'さる' )
st> (s1 - s2) + (s2 - s1).
Set ('かっぱ' 'きじ' 'いぬ' 'ぶた' )

2011-11-29(Tue) ぼんやり晴れて、さほど寒くない

ちょっぴり

25年前に出たSmalltalkの本(ISBN4-7828-5025-5 C3355) にあった例題を少し変えて試してみた。

st> a := 2.
2
st> power := [a := a * a].
a BlockClosure
st> power value.
4
st> power value.
16
st> a.
16
 
st> a := 3
3
st> 6 timesRepeat: [ power value printNl ].
9
81
6561
43046721
1853020188851841
3433683820292512484657849089281
6

調子に乗って大きな数を指定していると、

"Global garbage collection... done, heap grown"
"Global garbage collection... done"
"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"

たぶん些少な差異

基数 + r + 数値。デフォルトで10進を返す。

st> 16rFF.
255
st> 16rff.
stdin:2: Unexpected EOF while scanning number

squeakではエラーにならなかった。

なんとなく、どこかで見たような

冪乗計算例。

st> -4 to: 4 do: [:x | (2 raisedTo: x) printNl ].
1/16
1/8
1/4
1/2
1
2
4
8
16
-4

ここまでは、別段ということもなかった。

st> 2 raisedTo: 10
1024
st> 2 raisedTo: 20
1048576
st> 2 raisedTo: 30
1073741824
st> 2 raisedTo: 40
1099511627776

補完

Gnu Smalltalk は、シェルの伝統通りに(?)Tab、Squeak はctrl/Command + q だった。

性懲りもなく

前に二回も書いた( 過去1 過去2) 倍増し算。
初期値の処理がうまくできなかったが(汗、まぁいいか。

st> aNum := 1
1
st> tNum := 1
1
st> allNum := [ aNum := aNum * 2]
a BlockClosure
st> totalNum := [ tNum := tNum + (allNum value)]. "丸括弧は省略できない"
a BlockClosure
st> 63 timesRepeat: [ totalNum value printNl].
3
7
15
31
(ry
2305843009213693951
4611686018427387903
9223372036854775807
18446744073709551615

ここに書き付ける間に追試すると、どこかがおかしくなって まともな結果が出なかった。
スクリプトをファイルに落として、確認。

システムブラウザ

上左より、「カテゴリ」「クラス」「メッセージ・カテゴリ」「メソッド」 の順番で表示している、らしい。
残念ながら、これは覚えるしかなさげ。

例えば、"Kernel-Numbers" カテゴリの "Integer" クラスの "arithmetic" メッセージカテゴリに "+" メソッドが存在している。
下段は説明らしいが、なんのことやらさっぱり。


2011-11-30(Wed) 今日もぼんやりとぬくめに晴

数値だけでも

結構実装依存だったりする。

st> 1234.5678s9
1234.567800000s9

固定小数点の例。
これはSqueakも同様。

st> 98765432.1 + 0.1
98765432.19999999

Squeak では、

98765432.1 + 0.1 
=> 9.87654322e7

今見ている Smalltalkの本(VisualWorks 2.5Jを前提)には、 単精度や倍精度を表す"d", "q" などの添字があるが、 少なくともSqueakではエラーになった。
gst は飲み込んでいるようだけど、スルーしていないのかどうか はまだよくわからない。


リンクはご自由にどうぞ。でもURLや内容が変った場合はあしからず。

index.htmlは ここから。