--/--/--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2008/04/30

xmonad の xinerama が有効にならない件

自前で ghc-6.8.2 と X11-1.4.2 と xmonad-0.7 をコンパイルするも、まだダメ。昨日の compliedWithXinerama は True を返すようになった。

何が悪いのかなぁ。xrandr か?なんか lib が足りてない?うーむ、分からん。

2008/04/29

xmonad が Xinerama にならない問題

The following ghci commands can help investigate your Xinerama setup.

:m + Graphics.X11.Xinerama Graphics.X11.Xlib.Display
compiledWithXinerama
openDisplay "" >>= getScreenInfo

compiledWithXinerama should give a Bool result, and getScreenInfo a list of screen Rectangles.

Though this is the kind of fix that shouldn't work, it nearly always does: If compiledWithXinerama returns True, try:

runhaskell Setup.lhs clean
runhaskell Setup.lhs configure --user --prefix=$HOME
runhaskell Setup.lhs build
runhaskell Setup.lhs install --user

for xmonad, and xmonad-contrib if you use it.

3.3 xmonad does not detect my multi-head setup - xmonad FAQ

実際に試してみたところ、compiledWithXinerama が False を返した。ghc の x11 ライブラリが Xinerama 無効でコンパイルされてるってことだろう。そら xmonad も Xinerama になるわけがないと。ubuntu の ghc 関連パッケージはことごとく xmonad と相性が悪いというかなんというか。

さてどうするかな。パッケージいじるとめんどそうだし、そもそもやり方も分からないから、また自前でコンパイルするか。でも今日は疲れたから寝る。

2008/04/29

firefox 3.0b5

起動早すぎ。

2008/04/29

ubuntu を新しくした

8.04 LTS にアップグレードした。前々からミニマムな構成にしたいなと考えてたので、クリーンインストールした。7.10 までのバージョンには minimal CD ってのが用意されてるんだが、8.04 にはまだないため、サーバエディションをインストールした。

あとやるべきことは、

  • フォントが汚いのでどうにかする
  • uim 関連をいじる
  • xinerama にならないのをどうにかする
  • 音が出るようにする

最後の2つが曲者。ていうかなんで xinerama 有効にならないんだろうなぁ。出力自体は成功してるんだけど、2つで1つのworkspaceになってる。xmonad のデフォルトの動きってこうじゃないはずなんだけどなぁ。xmonad を apt-get で入れたせいか?

2008/04/28

トラックバックスパム

ほんとひどいな。1日にすごい量がきてる。日によってバラツキはあるけど。

まじめにもらってたトラックバックに気づかなかった。対策を探ってみるか。

2008/04/26

Lisp の括弧

俺が初心者にLispやSchemeをすすめない理由…やっぱり括弧問題だ。Lispは大好きだし一騎当千の言語だと思うが、あの括弧は初心者にはきつい。Lispを教えるためには、まずエディタの使い方を教えないといけない。エディタに精通していないと括弧の対応が取れなくてパニックになるのは必定だからだ。

趣味でRubyしててもいいじゃないか - ’(rubikitch wanna be (a . lisper))

Lisp の括弧って言語を薦めるかどうかの話題にするほど重要なのかな。エディタどうのこうののくだりも、対応する括弧をハイライトするぐらいの機能を持つエディタ使えば十分なような。Vim や emacs はもちろん、最近のエディタなら大概その機能がある(と思う。確信はない)。俺は10分くらいで慣れたけど。

むしろ、他の言語にありがちな、

  • ブロックを区切る時は {}
  • ブロックの開始を表すのは : (python)
  • case の後は :
  • 例外オブジェクトの束縛は , (python)

とかまぁ挙げるときりがないんだけど、構文を覚えることにやたらと時間がかかる言語のほうが、俺はいやだなぁ。だから俺は、Scheme なり Lisp なりでプログラミング入門したかったなぁ、なんて思うこともある。

本題のタイトルについては同意かな。趣味ならなんだっていいじゃん、っていう浅はかな理由だけど。

2008/04/26

至高のオブジェクト指向言語

オブジェクト指向についていくらか真剣に考えて、Javaこそがオブジェクト指向的には至高の美しさを持つ言語と考えるようになったので(実際そうだとは思いませんか?)、C++の参照やポインタの混在による汚さに惑わされているのだと思います。

参照が使えるときはいつでも参照を使いましょう - 神様なんて信じない僕らのために

オブジェクト指向言語という視点において、そりゃまぁ C++ よりは Java のほうが幾分かましなんだろうとは思う。俺は C++ を触った経験はほとんどないけど、話を聞く限りではオブジェクト指向がどうとかより、もっと他の部分に時間を食われ過ぎている印象を受ける。まぁそれは置いといて。

Java は Java で、"至高の" オブジェクト指向言語とは思えないなぁ。手続き型プログラミングな書き方を大いに許しているし。もちろんこれが1つの要因となって、現代の Java 人気があるんだろうけど。オブジェクト指向言語としてはどうなのかと。

もうちょっと挙げてみると、総称が腐っているところ、機能追加によって言語仕様が破綻しかけているところ、equals がオーバーライド可能であること、package は階層的構造を持つのにその辺を用いたスコープ指定がない、などなど。

equals について補足。Java ではインスタンスの比較に == か equals を用いるわけだけど、どちらもデフォルトでは参照の同値性、つまり同一性を比較する。すなわち、"a" == "a" は常に false を返す。また、new Object().equals(new Object()) も、常に false を返す。

とまぁここまではいいとして、これらには値としての同値性(以下同値性)を調べるという部分がすっぽりと抜けている。Java ではそういうことがしたいなら equals をオーバーライドせよということになっている。

いやいや待てと。equals ってのはそもそも同一性を調べるメソッドなのであって、同値性を調べるメソッドではないでしょう。メソッドの意味を大きく変更することになるオーバーライドはするべきではない。

"内部動作" を置き換えるオーバーライドは、本来の使われ方として正しいんだろう。繰り返しになるが、メソッドの "意味" を置き換えるオーバーライドは行うべきではない。それを奨励している Java は、オブジェクト指向言語としてはとても至高とは呼べない。

package について補足。Java のパッケージはファイルシステムべったりで、ディレクトリ階層がそのままパッケージ階層になる。別にそれはいいんだけど、そうやって階層構造を持たせることができるのなら、例えば「methodA を、この hoge.fuga パッケージ以下に位置する、hoge.fuga.piyo と hoge.fuga.pico パッケージにのみ公開」なんて指定できると思っちゃうのは必然ではないだろうか?

もちろん、今の Java ではこういうことはできない。package が階層構造である意味は、全くを持って意味が無い。ネームスペース以外の何者でもないくせに、ディレクトリ階層を要求する。

あと Object にメソッドが多いのも気になる。equals, hashCode, wait, notify, notifyAll, clone, toString 辺りが、なんで Object にあるのかと。同値性の比較が可能なインタフェース(Comparable)、条件変数として使用可能なインタフェース(Condition)、文字列かできるインタフェース、複製可能なインタフェース(Cloneable)、ってのをそれぞれ用意するべきだよ。いや、文字列化以外のは現にあるんだけど。Object にこれらのメソッドを持たせる利点が、どれほどあるのかと。

clone については、Cloneable インタフェースがありながらこの状態なわけで。そういう気持ち悪いところがたくさんある。

そんなわけで俺が思う至高のオブジェクト指向言語は Eiffel。オブジェクト指向入門で使われている、あの言語。実際に使ったことはないんだけど。本を読んだ限り、非常に言語仕様が洗練されている。総称もしっかりしているし、スコープ指定もしっかりしていてカプセル化も柔軟。オブジェクト指向言語としては、かなりの完成度かと。ただまぁ、API は少ないだろうから実用的では無いのかも。

2008/04/26

xmonad with dual display

xmonad with dual display

前はドライバが云々で、なんて言ってたが、それは嘘でした。単なる設定の間違い。というか知識不足。

デュアルディスプレイに関しては、ほとんど何もしなくてよかった。Screen セクションの Display サブセクションに一行追加するだけ。

Virtual 2048 768

もちろん数値は環境に合わせる。この設定項目は、全てのディスプレイを1つのディスプレイと見なす時の、最大解像度を設定する。これがないと、xrandr から cannot be larger than ほげほげ と怒られる。俺の環境の場合、1024x768 を横に2つ並べるので、上記のようにした。

いやしかし、これは素晴らしい。dwm に乗り換えようかななんて思ってたけど、dwm は確かデュアルディスプレイに対応していない。例えしていたとしても、xmonad のそれにはほど遠いだろう。

ubuntu 8.04 LTS には xmonad のパッケージが加えられていた。バージョンは 0.6 だった気がする。まぁ 0.5 以上なら、ほとんど問題はあるまい。これからもよろしくお願いします xmonad さん。

画像はデュアルディスプレイの記念撮影。

2008/04/24

ubuntu hardy

ついに本日。

2008/04/24

firefox のリソース使用量

気づいたら load average が 0.7 とかになってることがある。ブラウザを激しく使ってるわけでもなければ、動画を再生しているわけでもない。コンソールでテキストをいじってるだけなのに。

何が食いつぶしてんだと思って top してみると、firefox が CPU を 39% も食ってやがった。異常である。

firefox を落とすことで対処はできる。何が原因なんだろうか。まぁおそらくは javascript 関係なんだろう。google reader, gmail とか、アフィリエイト広告たっぷりの 2ch まとめブログ開いてたし。

別にその程度のリソースを食われたところで実害はないんだけど。なんとなく、こう、無駄が気持ち悪い。この際、ネット閲覧だけが目的の時は w3m 常用ってのもありだな。がっつりいきたい時、google reader やら gmail 見たい時だけ firefox を起動する、みたいな。面倒だな。

2008/04/23

メモリの使用量(%)を出力するスクリプト改

awk のアドレス指定を使えば、かなり簡潔になった。

free | awk '/Mem:/{print $3"*100/*"$2}' | bc

結果は前回のと同じ。

会社の VMware 環境で使ってると、この数値が減ることがほとんどないことに気づいた。free の仕様?まさかねぇ。たまに減ることもあるし。なんかリーク起こしてるのかなぁ。

2008/04/22

メモリの使用量(%)を出力スクリプト

bash で。

free | grep Mem: | sed -e 's/ */ /g' -e 's/[^ 0-9]//g' | awk '{print $2"*100/"$1}' | bc

% と出すなら

echo `free | grep Mem: | sed -e 's/ */ /g' -e 's/[^ 0-9]//g' | awk '{print $2"*100/"$1}' | bc`%

絶対もっと簡単にできるよなぁ。

2008/04/21

端末のフォントを小さくした

狭い画面により多くの情報を表示する、もっとも手っ取り早い手段の1つ。

会社の VMware 上に構築した環境のフォントが結構小さかった(デフォルトが)んだけど、意外と問題なく見えた。自宅環境は画面が狭い。タイル型WMなので、限界まで使っていることは使っているが、それでも情報量が少ない。

で、フォントを小さくしたおかげで、1画面により多くの情報を表示できるようになりました、というお話し。以下、before/after

2008/04/18

最小構成インストールからの環境構築

会社の VMware 上でやった。こないだの dwm の記事の、それ。

結果としては、なかなかいい感じに仕上った。uim による日本語入力環境の構築も簡単だった。dwm のカスタマイズも、思っていたよりずっと簡単だった。

ubuntu 8.04 出たら、minimumCD からインストールしようと計画中。debian に乗り換えるのもありかも。

2008/04/18

讃岐うどん

明日と明後日の1泊2日で、社員旅行 in 讃岐うどん巡りに行く。うどんが楽しみなのは言うまでもないが、こういったイベントの取りまとめ役ってやったことなくって、そっちが心配でしょうがない。

旅行サイト経由でとったホテルの予約は大丈夫なんだろうか、とか。

2008/04/16

スクリプト言語の好きなところ

インタプリタで実行されるところ。例外はあるかもだけど。

例えば、あるライブラリのこの部分で、この変数が一体なんなのか、っていうのを知りたい時。もちろんデバッガを使ってステップインとかできる環境ならスクリプト言語じゃなくても可能、と思う。しかしインタプリタで処理される言語なら、もっと簡潔にそれが可能になる。

ライブラリに直接 print 文書けばいいだけの話。即反映ってのがなんとも気持ちいい。

あと、あまり素人が触るべきではないライブラリのコードに直接触れるという、スリルがいい。もちろんバックアップは取るし、print 文を1行追加するとかだから、全然問題は無いんだけど。

2008/04/16

dwm

会社の VMware 環境の ubuntu server edition に、dwm をインストールしてみた。

xmonad の元ネタとなっているだけあって、操作がかなり似ている。機能の豊富さや、カスタマイズの柔軟さにおいては xmonad に大きく軍配があがる。しかし、dwm でも機能は十分だったりする。また、ghc が必要ないので、無駄にディスク容量を食わないのがいい。

ディスク容量なんて今更気にする必要ないだろ常識的に考えて、と思うかもしれない。今回 dwm をインストールする前に、実は xmonad のインストールを試みた。しかし、ディスク容量不足によって ghc がインストール出来ず、dwm に至ったというわけ。まぁ仮想ディスクの容量増やすとか、ルートパーティション広げるとか、色々回避策はあるんだけど。

dwm を使ってみた感想は、さっきも述べた通り、機能はこれで十分と言えるレベルだと思う。俺自身、xmonad をたいして凝った使いかたをしていないため、そう感じるのかも。よく C++ 初心者が書いた C++ プログラムは、better C でしかないなんて言うけど、俺の xmonad の使い方はそれに近い。better dwm としてしか使ってない感じ。

話を戻すと、タイル型 WM としての機能は十分と言える。操作も機敏。かなりいい手応え。

dzen とうまく協調できることの確認と、入力メソッド周りの環境整備が出来たら xmonad から移行するのもありかもしれない。

2008/04/11

開けたものは閉める

ref:間違え探し

思わぬところで議論されてたんだけど、これ結構普通だと思ってたんだけどな。コメントにも書いたけどやりたいことは単純。開けたもの使い終わったら、必ず閉めましょう、ということだけ。Java で「必ず何かする」ということをするには finally を使うのが一番簡単で確実な方法。

try-catch-finally が入り乱れて、慣れない時はよく忘れるコード片ではある。だけども、finally でこういうことをしなければならない言語では、このロジックは必ず覚えておかなければならないものの1つだと思う。

で、具体的にどうするのかというお話し。先の記事では Connection が話題の対象になっていたけど、今回はコードを簡単にするため FileWriter を使う。開けて使って閉めるオブジェクトならなんでもいいので。

次のコードは各操作で発生する例外をそれぞれで catch する。すげー読みにくいけど、一番柔軟ではある。

try {
    FileWriter fw = new FileWriter("hoge");
    try {
        fw.write("fuga");
    } catch (IOException e) {
        System.err.println("write で失敗こいたよ");
    } finally {
        try {
            fw.close();
        } catch (IOException e) {
            System.err.println("close で失敗こいたよ");
        }
    }
} catch (IOException e) {
    System.err.println("new で失敗こいたよ");
}

個人的にこれはやりすぎだと思ってるので、俺は大体次のようにやる。先の記事と同じやりかた。

try {
    FileWriter fw = new FileWriter("hoge");
    try {
        fw.write("fuga");
    } finally {
        fw.close();
    }
} catch (IOException e) {
    System.err.println("どっかで失敗こいたよ");
}

問題としてはどの時点で投げられた例外なのか分からないということ。そういう判断がしたいなら、1つ目のコードみたいに律義に try-catch で囲ってやらなければならない。必要でない時はこれで済ませる。

finally での null チェックは必要ないのかというお話しは、結論から言うと必要ない。この例でいう fw が null である可能性は、new FileWriter で失敗したとき以外ありえない。では、new FileWriter で失敗するということはどういうことかというと、new FileWriter で IOException が投げられる場合である。new FileWriter 実行時に IOException が投げられれば、そのまま catch 節へと制御が移るので、入れ子になった try-finally 節には入らない。そもそも開いてすらいないので、閉じる必要がない。

あとコメントの返事したときには気づかなかったんだけど、ASIP さんのコードはやっぱりコンパイルエラーになるかと。その Connection の宣言位置だと finally からは見えない。それから close で投げられる例外がチェックされていない(throws してるとかいうのは無し)。もういっちょ付け加えれば、2回目の close に空の finally があるけど、これは全く意味が無い。試してみるといいです。

2008/04/09

python で改行を出力するとき

\n じゃなくて、os.linesep を使いましょう。java でいう System.getProperty("line.separator") と等価。というメモ。

2008/04/08

会社のホームページ

最近会社の www サーバを移行するとかで、その作業をやってる。それで最近は、会社のホームページのリソースとか、www サーバに大きく関わる部分をよく触っている。

作業してる時に何度も思ったんだけど、ただひたすらに無駄が多い。無駄というか大げさ。大したことやってないはずなのに、なぜか tomcat 環境が必要。

Servlet/JSP を何に使ってるのかと思えば、単なるテキストファイルの解析と動的ページの生成だけ。たったこんだけのために、あの複雑極まりない tomcat の設定をメンテナンスしなければならないのかと思うとぞっとする。というか、した。

tomcat には毎度泣かされる。とにかく設定が複雑。大規模稼働を想定している故、様々な状況に対応できる設定ファイルを設計したいという気持ちは分かるし、たぶんそれでいいんでしょ。tomcat は悪くないよ。たぶん。問題は使う側で、何でもかんでも tomcat /Servlet/JSP でやろうとするのはバカらしいよ。ただのテキストファイル解析/動的ページ生成のためだけに tomcat の設定なんてやってられない。あの苦労は、会社のみんな分かってるはず。たぶん忙しさ故、かまってる暇もないのでしょう。

ということで俺が Django で作りなおしてやる。将来的にも DB 稼働に移行することはないと思う。しかし、Django のURLのディスパッチ、テンプレートを考えると、動的ページの生成には彼を使わないわけにはいかない。何より python だから後のメンテナンスも楽にしやすいし。とりあえず今 Servlet/JSP で動いてるところを python スクリプトで置き換えてしまうことを目標にしている。

というわけで現在、酒飲みつつ、syntax error に笑いつつ、Django で実装中。大きく分けて2つある Servlet/JSP の内、1つは既に終了。明後日くらいには完成できるんじゃないかなぁ。完成まで持って いくにはちょっと面倒だけど、Django のテンプレートならそれも1日あれば十分だろうし。

2008/04/08

間違え探し

via Java と Ruby の比較記事がひどい - odz buffer

やってみた。

  • RubyはJavaより単純でJavaより高速です。
    • 聞いたことない。
  • たとえば、Javaパッケージ「java.sql」をロードするには次のようにします。
    import java.sql.*;
    • 言いたいことは分かるけど、全然違う。パッケージをロードすることはできない。また、これじゃサブパッケージの import もできない。厳密には、指定パッケージ直下のclass(クラス、インタフェース、enum)をロードする、かな?。
  • try-catch-finally 節のところ。
    try {
        String url="com:mysql:jdbc://localhost:3306/test";
        Connection connection=DriverManager.getConnection(url, "root","");
    } catch (SQLException e) {
        System.err.println("Caught: SQLException: " + e.getMessage());
    } finally(){
        connection.close();
    }
    • わろた。finally に括弧は要らない。それから try 句で宣言した変数は、同じ節の finally 句からは見えない。こういうことをしたいときは、try-finally 節を二重にする。
      try {
          String url="com:mysql:jdbc://localhost:3306/test";
          Connection connection=DriverManager.getConnection(url, "root","");
          try {
              //ごにょごにょ
          } finally {
              connection.close();
          }
      } catch (SQLException e) {
          System.err.println("Caught: SQLException: " + e.getMessage());
      }
  • Java EEが、JavaによるModel-View-Controllerアプリケーション開発向けエンタープライズフレームワークであるように、Ruby on Railsは、RubyのModel-View-Controllerフレームワークです。
    • 間違いじゃないとは思うけど、言いたいことが分からない。

面白いなぁ。

2008/04/02

NixOS

なんとなく Nix の思想が分かった(つもり)になり、使ってみようという気になったので、インストールしてみることに。Nix だけインストールしてもよかったんだけど、せっかくなので NixOS 毎インストール。

OS のインストールが難しいってどっかに書いてあったのを見たけど、gentoo のインストールを経験してれば全く問題ない。むしろ OS のインストールに関しては gentoo よりはるかに簡単。

おそらく慣れない内はパッケージ管理に苦しむと思うけど、慣れれば非常に使い易い物になると思う。という期待をしている。

2008/04/01

スパムコメント

ほっといたらえらいことになってるな。1つの記事に群がるんだね。

2008/04/01

Nix

Nix - Purely Functional Package Management System

純粋関数型パッケージシステムなのだと。論文もあった。

Purely Functional System Configuration Management *PDF 注意

片方は Package Management System で、片方は Configuration Management になってるけど、どっちが正しいんだろうか?後者は論文だから、それをパッケージ管理システムに昇華してかつ実装したのが Nix かな?

Nix をデフォルトのパッケージ管理システムとして使っている Linux のディストリもあるらしい。

NixOS

論文、公式サイトから全体像掴んで、面白そうだったらインストールしてみようかな。ちょっと Gentoo は期待外れだった。期待外れは言い過ぎだけど、中途半端というかなんというか。USE フラグみたいなのを用意するんだったら、もっと徹底的にすりゃいいのにという感想。

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。