2014-01-01から1年間の記事一覧

PeerCastIM4Linuxをいじってみた

PeerCast には設定の為に HTML サーバーが実装されているが、そのパフォーマンスはさして感心するようなものでもない。Apache HTTP サーバーのベンチマークツールである ab で計測してみる((ab -c 1 -n 1000 http://localhost:7144/html/ja/images/small-log…

Linux Assembly HOWTO を読んだ

http://www.tldp.org/HOWTO/Assembly-HOWTO/index.html32ビット x86 アセンブラについての HOWTO だ。DOS プログラマに向けて書かれてるのかな?しょっぱなから種々のアセンブラやプロジェクトの紹介が続き、おなかいっぱい。Linux のブートローダを書くのに…

カスタムウィジェットで立方体を回しやすくしてみた

陰線消去(というか陰線を点線に)して立方体を表示するプログラムがあります。ところが立方体を回すためには、矢印ボタンをカチカチ何度も押さなければいけなくて、ぎこちなかった。そこで操作の労力が減るように、カスタムウィジェットを作った。みためは…

IronRuby と irpack を使ってみた

WinForms でハローワールド 「.NETでRuby開発を体験してみよう − @IT」を参考に Ruby から WinForms を使ってみた。リンク先のコードをもとに書いたファイル main.rb がこれ。 # coding: utf-8 require 'mscorlib' require 'System.Windows.Forms' require …

カエルの作りかた

カエルの動画を見ます カエルを描きます 背景を透明にします gimp を使うと良いでしょう。魔法の杖で背景を選択して切り取ります。線にスキマがあるとうまく背景だけを選択できないので、あらかじめえんぴつツールで線を書き足しておきます。きっともっと良…

そういう仕様だった

The array is changed instantly every time the block is called, not after the iteration is over. http://www.ruby-doc.org/core-2.1.2/Array.html#method-i-delete_if ようするに条件ブロックが true を返したら次に条件ブロックが実行されるときには、…

Array#delete_if が思ったよりも遅かった

Ruby の Array は可変長配列だと聞いていたので、先頭への要素の追加削除は既存の要素の再配置が必要になるから遅かろうと思っていた。ところが、実測してみると unshift/shift は push/pop と同等の速度だった。ふむ。Array は可変長配列(C++ でいう vector…

添え字を使わずに2次元配列を回転・反転させる方法

ここでは、2次元配列とは Array の Array を意味することにします。外側の親配列が同じ長さの小配列を持っている、 matrix = [[1,2,3],[4,5,6],[7,8,9]] のようなやつですね。視覚的にはこんな数字の表を表していると考えましょう。1 5 9 の軸が主対角線で …

回転行列を使って配列を回転させる

2次元配列を回転させる方法を調べていたら、回転行列っていうのが何なのか気になった。定義には三角関数が入ってて難しげだけど、Wikipediaによると右に90°回すだけなら簡単な数字で回せるらしい。これに座標を入れたベクトルをかけると回した後の座標が…

Ruby/Gtk2 でカスタムウィジェットを作る

長いあいだ Ruby/Gtk2 でカスタムウィジェットの作りかたがよくわからなかったけど、今日 rbbr を読んでいてやりかたがわかった。クラス定義の中で GLib::Object.type_register を呼び出して GObject システムに型を登録してから、GLib::MetaInterface.signa…

Rubocop を使ってみた

Rubocop というコードのスタイルをチェックするツールがあることを知りました。rubocop とすればディレクトリの Ruby ファイルについていろいろ教えてくれます。完璧ではないものの、rubocop --auto-correct とすれば自動で変更までしてくれます。これを自分…

オブジェクト指向と関数的手続き

オブジェクト指向プログラミングでは処理はメソッドで表わされる。メソッドはなんらかのクラスに属していて、そのインスタンスのデータにアクセスすることができる。つまり、メソッドは常になんらかのインスタンスを環境*1として実行される手続きだ。しかし…

設定ダイアログを楽して作れないかな

例えばこういうオブジェクトを用意して…… Person = Struct.new :name, :age, :kawaii yukarin = Person.new 'Yukari', 17, true p yukarin #=> #<struct Person name="Yukari", age=17, kawaii=true> どういう風に表示したいか表にして…… table = [[yukarin, :name, :string], [yukarin, :age, :spin], [yukarin</struct>…

Ruby/GTK のレイアウトを作るための DSL を作った

こんなのは DSL って言わないかもしれないけれど、ウィジェットの親子関係がインデントで表せてわかりやすいです。あと、名前付きオプション引数でウィジェットのプロパティが設定できたり、シグナル名を書くだけで convention で名前が付いてコールバックが…

続・Ruby で labels できるか

先日、Ruby で labels に類似したパターンを書いたが、見た目も labels にできた。まずは実例から。例によって階乗。 def fact(n) labels iter: -> m, acc { m==0 ? acc : iter(m-1, m*acc) } do iter(n, 1) end end fact(10) => 3628800 実装は次のようにな…

Ruby で labels できるか

次のコードに等価なものを作りたい。 (defun f (a b) (labels ((g (c) (list a b c))) (g 'z))) (f 'x 'y) ; => (X Y Z) 新しい Object にシングルトンメソッドを定義しよう。 def f a, b Object.new.instance_eval { self.define_singleton_method(:g) do |…

do end で引数リストにカッコを付けてはいけない謎の文法環境

Ruby ではメソッドに渡すブロックの表記に do end と {} の2つがあるが、その違いの一つは、do end は引数リストの括弧を省略できるということだ。次のようなテスト用のメソッドを用意して、確かめてみる。 # 渡された引数とブロック引数を配列にして返す。…

S式を1つ読み飛ばすリードマクロを作ってみた

HTML のように閉じ括弧にコメントをつけられるよ。 ;; 3の倍数か? (def mult_three? (n) (if (.== 0 (.% n 3)) true false #/if) #/def)

やっぱりメソッド呼び出しを . で始めるようにした

関数位置に置けるのは、関数を表すシンボルと lambda フォーム、proc フォーム、そして meth フォーム。. は meth フォームを生成するリードマクロだ。 ラムダ > ((lambda (x) (.* x 2)) 3) read: [[:lambda, [:x], [[:meth, :*], :x, 2]], 3] ruby: lambda …

続・tapの「使え方」

逆に露骨に副作用を起こすこともできる。 i = 0 i.tap { i += 1 } 2行目の式は 0 に評価され、副作用として i が 1 になる。ちょうどC言語の後置インクリメント演算子のようだ*1。tap のレシーバが評価されるのが(tap 内部で行われる)ブロックの呼び出し…

tap の「使え方」

tap に渡すブロックで break をするとその break が tap の返り値を決定する。例えば、true.tap { break false } は false になる。さて、以下の関数は、数当てゲームのヌメロンでプレーヤーの推測と答えを比較して、イート数(位置も数もあっている)とバイ…

普通の tap の使い方

tap is a method for eavesdropping on any portion of an expression.Suppose there is a bug in the following code: data.foo.bar.baz It could be that data is not what you expect it to be, or one (or more) of the methods foo, bar and baz doesn'…

Lisp on Ruby に ’ と let と gensym を実装した

quote はあったがリードマクロの ' がなかったので実装した。とは言っても、本当のリードマクロのように関数に処理がディスパッチされるわけではなくて、組み込みだ。前回、rotatef を次のように定義した。 (defmacro rotatef (a b) (.list (quote progn) (.…

Ruby の上に Lisp っぽいものを作ってみた。

足し算ができる。 > (+ 10 20) 30 式の実態は Array クラスのオブジェクトとシンボルなどだ。 > (quote (+ 10 20)) [:+, 10, 20] Ruby のコードにコンパイルされてから実行される。 > (compile_sexp RubyLisp (quote (+ 10 20))) "10.+(20)" グローバル関数…

Ubuntu の DNS キャッシュ

ネットワークのパフォーマンス測定みたいなことをやっていたら、たびたびドメイン名の解決が遅いことに気がついた。システムは localhost に問い合わせているのは知っていたので、何が動いているのだろうと調べてみると、dnsmasq というのが走っていた。ネッ…

Common Lisp の制御構造

どれも特に指定されなければループ終了時に nil を返す。本体の直前に返り値を指定するところがある。 DOLIST 他の言語で range-based for とか foreach と呼ばれるもの。 (dolist (x '(a b c d)) (print x)) ;; => A B C D を出力し、nil に評価される。 DO…

ポインターとはなにか

C

C言語のポインターは難しい。理由は、宣言の文法が直感的でないからだったり、ポインターに多種多様な用途があるからだったり、意味の異なる「配列」と故意に似せてあるからだったりするのだろう。でも、とりあえずポインターとは何かについて考える前に、ポ…

ポインターの用途

C

アウト・パラメータ C言語では関数の引数は値で渡される。だから、呼び出された関数が呼び出し元の関数のローカル変数の値を書き換えるには、呼び出し元の側で、その変数の記憶の場所を値として引っ張りだして渡してもらうしかない。 int i; scanf("%d", &i)…

再び、ポインターとはなにか

C

このシンボル名と記憶の場所の対応のきびしさを解決するものがポインターだ。ポインターは型の種別であり、したがって式や値の種別であり、変数の種別だ。変数には本質的なプロパティとして記憶の場所があって、それが評価や代入の時に使用されてプログラム…

C言語の変数とはなにか

C

int i; と書いてみる。これはどういう意味だろう? 関数の中で書いたならこれはローカル変数だ。実行位置がその関数に入ると int 型のサイズのメモリ領域が確保されてそれが i という名前で使えるようになる。変数 i が作られたわけだ。たんに i と書いたな…