RSS

日々のメモ書き

Debian Developerが綴るメモ

JavaScriptにはブロックスコープがない

そうですかそうですか。

本格的にAjaxの関係でJavaScriptを最近よく書くようになった。ごりごり書いていると変数の参照に関してトリッキーな、というか手抜きというか、やばい臭いがプンプンするコードが書けてしまうなあということに気付く。今までJavaScriptは入門書もロクに読まずに書いていたのでわかっていなかったが、それは単純な話だった。

JavaScriptにはブロックスコープがない。

おそろしい話だ。

Haskell SKK ServerがEmacsで動かない

自作のHaskell SKK ServerがEmacsで動かない。

uim-skkだと動いたのだが、Emacs-SKKだと駄目。変換されずにそのまま固まる。なんだろう…。他のskkservの挙動を見ても変なことしてないのになあと。パケットキャプチャをしてみたら…あれ?Emacs-SKKがLFを最後に送ってない。どーなってんだろう。これが原因か?

IO.getLineを使うと改行されるまで待つのがまずいらしい。IO.getCharで一文字ずつ読んでスペースが来たら一区切りで返すという処理を書いたら、Emacsでも動くようになった。dbskkd-cdbの附属の文書にはLFで終わるって書いてあったけど…。SKK serverの正しいプロトコルって何だろう…。

tcpdumpが動かん

tcpdumpが動かん。wiresharkも動かん。

パケットキャプチャしようとしたらtcpdumpもなにもかもが動かない。

# tcpdump 
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
01:22:26.123874 7d:c0:00:00:00:00 (oui Unknown) > yy:zz:00:xx:xx:xx
(oui Unknown) Null Information, send seq 0, rcv seq 0, Flags [Command],
length 4294967282
01:22:26.123874 01:80:c2:00:00:00 (oui Unknown) Unknown SSAP 0x92 >
00:00:00:00:00:00 (oui Ethernet) STP Supervisory, Receiver Ready, rcv
seq 69, Flags [Final], length 4294967282
tcpdump: pcap_loop: corrupted frame on kernel ring mac offset 94 + caplen 168 > frame len 160
2 packets captured
3 packets received by filter
0 packets dropped by kernel
#
libpcap(Bug#517098)が原因らしい。linux-image-2.6.26-1-amd64だと駄目だとさ。686-bigmemでやったら動いた。む。

ISS観測

ISS(国際宇宙ステーション)が名古屋から見えるとのことで待っていた。

この前つけた太陽電池パネルのおかげで金星よりも明るくなったISS。JAXAのサイトを参考にすると4/1の19:25頃に見えるということで待っていた。さてさて、どっちかなーと思って空を見回してみたら間違いなくあれだね、異様に明るい高速で移動する輝点が。ああ、これは間違いない。この明るさと移動の早さはおかしな感覚。あれが数百kmもの上を飛んでいるとは思えない。

しばらく見ていたら沈む前に見えなくなった。地球の陰に入ったということかな?4/3にも見えるということなので楽しみにしていよう。

Haskell SKK Server

Haskellでなんか実用的なものを作るぞ。

Haskellで実用的なものをつくりたい、ということでSKKサーバを作ってみた。プロトコルは簡単なのでちょこちょこっと応答部分を作って辞書はSKK-JISYO.LをHashTableで格納して。50行ぐらいで書けた。大体動くようになったので入れ替えてテストしてみるか。

ただ、起動するたびにHashTableを再生成では大変なのでそこはなんかDBを使うようにしなればならない。それは別のお話。

metacity + firefox3 がひどい件(まだ続き)

相変わらず駄目だね。2.24.0-2でも。

fireforx-remoteで呼ぶと今のworkspaceにウィンドウが飛んでくる件。

バグレポートは上がっていたはずなんだけど。うーん、なんで放置されているんだろう。

しゃーないのでUbuntuからパッチを持ってきて自分でbuildしたら直った。そのまま持ってくるにはHardyとsidでパッケージ名が変更されているので無理でした。どのパッチが正解なのかまだわからないけど。


CentOS 5.2 netinst

CentOS 5.2 をnetinst をやった。

ミラーの選択ができずに手動でホストとパスを打ち込むのが面倒。

stoneって便利だな

ファイアウォールの内側からproxyでごにょごにょするのが楽。

何が楽ってコンパイルが楽。ファイルが2つしかない。適当にやってもなんとかなる。サーバにsshで入れない状況のときにサーバー側から

ssh -R sport:127.0.0.1:dport host

とかやれば転送が効くので stone proxy sport とやる。

tailor

migrate changesets between version control systems

いろんなSCMを互いに変換するソフト。汎用的に色々対応しているのが利点か。

 tailor --verbose -s git -R  /home/takaki/src/haskell  --subdir oth  > o.tailor
gitからdarcsに変換した。
tailor  --verbose -s svn -R http://svn.plone.org/collective --module Products.Quills --subdir Product
svnからdarcsに変換。

オセロのプログラムを書いたときのメモ

オセロのプログラムをHaskellで作成。こんな修正したよというメモ。

なかなか作法がわからないからね。

if を使わずガードで表記

-      rowCheck x y cb = 
-          if x < 0 then
-              True
-          else
+      rowCheck x y cb
+          | x == -1 = True
+          | otherwise =

こっちのほうがきれいにかけますね。

List関係いろいろ

リファレンスをながめていて色々できることに気がついた。
-        if and [getPiece x y ob == Empty, length revPos > 0] then
+        if and [getPiece x y ob == Empty, not $ null revPos ] then
単純な話だけどライブラリは使おう。
-    foldl (++) ""  [ob2Line (7-y) ob | y <- [0..7]]
-              ++ "/01234567\n"
+    concat  ([ob2Line (7-y) ob | y <- [0..7]] ++ ["/01234567\n"])
foldlでやっているのが変だった。
+      doReverse piece ob pos = 
+ foldl (\ob p -> (putOnPiece (fst p) (snd p) piece ob)) ob pos
- doReverse piece ob [] = ob
- doReverse piece ob (p:pos) =
- doReverse piece (putOnPiece (fst p) (snd p) piece ob) pos
自分で再帰で書いていたのを工夫したらfoldlでできるようになった。
-    concatMap (\y -> ob2Line (7-y) ob) [0..7] ++ "/01234567\n"
+ concatMap (ob2Line ob) (reverse [0..7]) ++ "/01234567\n"
これもライブラリを使ったほうが自然ですよと。
-    initBoard = 
- Map.fromList [( (p2int 3 4), White), ((p2int 4 4), Black),
- ((p2int 3 3), Black), ((p2int 4 3), White)
- ]
-
+ initBoard =
+ let ob = Map.empty in
+ foldl (\ob p -> putOnPiece (fst (fst p)) (snd (fst p)) (snd p) ob)
+ ob [((3,4), White), ((4,4), Black),
+ ((3,3), Black), ((4,3), White)]
これはちょっと迷うところではあるけれど。

do記法の意味がちょっとわかった

         catch (readIO line :: IO (Int,Int)) 
-                    (\e -> return (e::SomeException) >>
-                           putStr "Input again!: " >>
-                           hFlush stdout >>
-                           readPos)
+                    (\e -> do
+                       return (e::SomeException)
+                       putStr "Input again!: "
+                       hFlush stdout
+                       readPos)
syntax sugar という話。>> がずらずら並ぶときには do を使えば消える

< 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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 >