2005年05月01日
_ laptop-net on Debian Serge
昨日私のノートPCをいろいろいじって今まで使えていなかったlaptop-netの Link-Beat detectionを有効化する方法を見つけたので書いておきます。
/etc/default/laptop-netに「MII_SUPPORTED="yes"」と書く、もしくは 「dpkg-reconfigure laptop-net」してMIIのサポートを有効にする。
一応インストール時に設定画面が出たはずなんですが何も考えずに無効に してしまっていたらしい。Debianではこれに限らず /etc/init.d以下にあるスクリプトから起動するようなデーモン類に関して うまくいかないときは/etc/default以下を見落していることがよくあるので 注意しておこう。
2005年05月02日
_ Dependency Injectionとか
Dependency Injectionというアイデアは理解できるんだけど DIコンテナなるものが何故必要なのかいまいちよくわかんない。
2005年05月16日
_ Webアプリケーションについて
Webという仕組み(つまりhtmlとhttpとブラウザの組み合わせ)は「比較的 静的な文章を閲覧するためのシステム」としては非常に優れていると思い ます。特にリンクという概念はその文章の価値を大いに高めます。
しかしそうでない目的には不向きでしょう。例えば以下のようなことです。
内容の更新の激しい文章の閲覧など。
要するに2chみたいな投稿の多い掲示板などです。既読管理や更新チェックなど をしたくなりますし、インターフェースも定型的な投稿を大量にさばくために 特化したほうが良いでしょう。
実際2chには大量の専用ブラウザが存在することや、RSSが最近流行って きたことがこのことの証拠だと思います。
私はWeb掲示板というものはNetNewsより退化した存在だと思っています。 べつに投稿量の少ない掲示板はそのままでもかまわないと思います。
統計情報などの表示
アクセス解析などの類いです。向いていない理由は自明で再利用が面倒だから です。この手の情報は見るだけではあまり意味がなく、さらに解析をすこと に意味があると思うのです。まあ見て喜ぶだけならWebインターフェースでも かまわないのでしょう。
複雑なインターフェースを必要とするもの
最近私のまわりでは麻雀が流行していてその戦歴を記録しているんですが、 それをwikiに書いているんですね。これの入力がかなり面倒です。 まあこの程度ならどうってことないですしwebでも十分良いなインターフェース が作れるでしょうが、さらに大量のデータ入力が必要な場合や、状態が必要 なUIなどが必要な場合はさらに悲惨なことになるでしょう。
こう言える理由は簡単でwebという仕組みは文章を見ることを主眼に置いていて UIを組み立てることが可能なのはおまけみたいなものだからです。
で、結論はというと、あんまりなんでもwebアプリケーションにしようという発想 はやめたほうが良いんじゃないか、といった所です。 webインターフェース「も」用意するというならそれでもよいでしょう。 そこまでするのは面倒じゃない?とは思います。
2005年05月17日
_ Ruby Refactoring Browser on Windows
一応動作します。Meadow2での動作を確認しています。Windowsに適当なCコンパイラなど 開発ツールをインストールしてコンパイルしてrb2exeやexerbあたりでbin以下のファイルを 実行ファイル化すれば動きます。
…と言いたいのですがWindowsでの開発環境構築はやたらめんどくさいので作った バイナリ等一式置いておきます。 <URL:http://www.kmc.gr.jp/proj/rrb/archive/rrb-dev-mswin32.zip>です。 mswin32用にコンパイルしてあります。試してみてください。あとMeadow以外への インターフェース作ってください。
_ 「型」に関して
プログラミングにおいて、そしてプログラミング言語を語る際に重要な要素と して「型」というものがあります。しかし型に関する用語はかなり混乱した 使われかたをしています。
で、私が一番もっともらしいと思う解釈を書いておきます。 ちなみに元ねたは、 <URL:http://www.sato.kuis.kyoto-u.ac.jp/~igarashi/class/isle4/mltext/ocaml.html#htoc17>です。
型とはなにか
ここでは型とは「データの種類」である、としておきます。 その存在意義は「true(真値)」に「3」を足すなど といった意味のない操作を行うことを防ぐためにあります。なぜ防ぐ必要があるかと いうと、意味のない操作を行なった結果を利用して次の操作を行えば、そこから 先の操作、計算はほとんど意味のない結果を出してしまうからです。これがつまり バグです。よってこれは何らかの方法で検出できたほうが良いわけです。というわ けで型という概念を導入し、その正当性をチェックする必要があるわけです。
ただ型の概念は言語ごとに色々異なるので十把一絡げには言えない面もあるのですが。
型安全(type safe)と型安全でない(type unsafe)
まずはこの2つからです。
上で書いた、型の食い違いによる「意味のない」「正しくない」操作を全て検出 できる言語が型安全な言語、できない言語が型安全でない言語です。
例えばLisp、Ruby、Pythonといった言語はそのような事態が起こった場合、実行時に エラーを発生させ、実行を止めるので型安全です。Javaでもキャストが失敗した際に は停止するので型安全です。
Cではキャストがあるので型安全ではありません。例えば以下のようなコードはエラー も出さず無事「意味のない」出力をして終了します。
#include <stdio.h> int main(int argc,char** argv){ float f=32.444; int i; i = *((int*)&f); printf("%d\n",i); return 0; }
C++もキャストがあるため型安全な言語ではありませんが、使用するキャストを dynamic_castに限定することで、Javaのように型安全になります。
また、MLやHaskellといった言語は「失敗する可能性のある型変換」をすべて禁止すること で、型安全性を確保しています。
またForthというスタックタイプの言語がありますが、例えば浮動小数点と 整数のを同じスタックに乗せるような仕様にすればこれも型安全でありません。 ただForthをここに分類するのはなんか無理矢理な気もする…。そもそも型がないんじゃないかという話もあるので。
静的型付け(statically typing)と動的型付け(dynamically typing)
型に関しては安全性という概念の他にも静的型付けと動的型付けという概念が あります。
プログラムを実行する前に全ての式、変数の型が決まっているものを静的 型付けな言語、プログラムを実行してからでないと決まらない式があるものを動的 型付けな言語といいます。プログラムを実行する前というのはコンパイル時という のとほぼ同じ意味です。
C、C++、Java、ML、Haskellといった言語が静的型付け、 Lisp、Ruby、Pythonといった言語が動的型付けな言語です。
以上をまとめると以下のようになります。
$ | 型安全 | 型安全でない | ----------------------------------------------------------| 静的型付け | Java,ML,Haskellなど | C, C++など | ----------------------------------------------------------| 動的型付け | Lisp,Ruby,ECMAScriptなど| Forthなど | ----------------------------------------------------------|
強く型付けされた(strictly typed)言語と弱く型付けされた(weakly typed)言語
三つめの軸として、「強い型付け、弱い型付け」という用語があります。この言葉は 人によって使いかたがひどく異なります。で、私が一番妥当だと思う定義は以下の 通りです。
静的型付けのシステムにより、型エラーがおこる可能性をすべてコンパイル時に 検出できる言語を強く型付けされた言語、そうでない言語を弱く型付けされた言語 という。
つまり、Javaなどではキャストの失敗は実行時にしか検出できない場合があるので 弱く型付けされた言語、ML、Haskellはそもそも失敗する可能性のあるキャストな んてものができないので強く型付けされた言語なわけです。
というわけで当然この分類が意味のあるのは静的型付けな言語のみです。 また強く型付けされた言語は型安全です。
まとめ
プログラミング言語談義は楽しいものですが、このあたりの用語の隔たりのせいで 話が不毛になることがあるなあ、と思いこんな文章を書いてみました。私もやった ことがありますので。
あと私はコンピュータサイエンスは専門でもなんでもないので上の文章は間違って いる可能性があります。上で挙げた五十嵐先生の文章を間違って解釈している 可能性もあります。なにかおかしければ是非指摘してください。
2005年05月23日
_ Rubyでブロックを使う
Lispや関数型言語では基本的な手法ですが、以下のようなRubyプログラムを、
def f(n) (1..n).map{|x| x**3}.inject{|y,z| y+z} end
次のように書くのもありだな、と思いました。
def f(n) cube = proc{|x| x**3} plus = proc{|x,y| x+y} (1..n).map(&cube).inject(&plus) end
ブロックの中身がごちゃごちゃしてい場合や、メソッドチェインが長い場合に 有効かもしれません。私はmap、find_all、injectといったメソッドを 良く使うので一度試してみようかと思います。
_ よた話
検索エンジンで適当にしらべた所、一戸建ての家を2000万円くらいで 建てる場合、設計にかかるコストはそのうち10%〜15%くらいらしいです。
2005年05月26日
_ ライセンス
このサイトに置いてある文章のライセンスを決めたい。GNU FDLかCCあたりに しようか。この中身を利用したい人がいるかどうかは知らないが。
まあそういうのをきちんと決めておいたほうが良い場合もまれにあるかもしれない。
2005年05月27日
_ Ruby/SDLとOpenGL
Ruby/SDLとOpenGL Interface for Rubyを利用して2D描画を実現しようと いろいろやっています。だいたい目標は以下の通りです。
- 一般的な2D描画APIに似た使い心地を目指す。一応SDLのvideo subsystem を想定しています。
- 拡大縮小回転や加算アルファブレンディング、デプスバッファ(Zバッファ) などOpenGLならではの機能を活用できるようにする。
で、調べた結果、技術的な問題はだいたい解決できそうです。
以下私のためのメモとして調べたキーワードなどについて書いておきます。
- 平行投射/glOrtho
- デプステスト/デプスバッファ/glEnable(GL_DEPTH_TEST)
- <URL:http://alb.hp.infoseek.co.jp/opengl/texture.shtml>
- アルファテスト/glAlphaFunc
2005年05月30日
_ ogg vorbisのツール群の国際化について
oggenc, vorbiscommentといったvorbis関連のコマンドラインツールは それなりにちゃんと国際化されているようです。
ここで言う「ちゃんと国際化されている」というのはLANGなどの環境変数に 応じて入出力のエンコーディングを決定している、ということです。
ogg vorbisではタグ類はUTF8な文字列にすることが規格になって いるようです。で、それを書き込んだり読んだりするのに上に挙げたツール を使うわけですが、それがLANGで指定したエンコードで入出力されます。
つまり、LANG=ja_JP.eucJPな場合、vorbiscommentでタグを書きこむときは、 EUC-JPなファイルを使えばよいわけです。-tオプションなどでコマンドライン から指定する場合も、そのコンソール上で日本語を打てばOKなはずです。
以上のことはDebian Sargeで確認しました。
_ Shion [場違いなことをお書きしますが、お許し下さい。 http://www.kmc.gr.jp/~ohai/rubysdl..]
_ ohai [修正しました]