--/--/--

スポンサーサイト

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

2008/01/31

久しぶりに弐寺のことでも書くか

通勤路(?) にあるタイトーに弐寺が入荷された。

ただこいつが曲者で、毎週水曜だけ100円/play で、他の曜日は今時200円/play なのだ。もううんことしかいいようがない。

それで昨日、水曜っつーことでやってきた。せめてもの救いが、人が少ないことと、筐体が新品なので鍵盤があまり硬くないことである。

昨日はなかなか収穫があった。

最近は専ら地力UP を目的として、 Level9 を埋めることに専念している。効果があるかどうかはわからんけれども、一通りプレイした後にはそこそこ譜面が見えるようになるんじゃねーのと思っている。

収穫というのは、隠しアゴグレッシブハードと、Xepher のノマゲ。

Xepher はこれが初、というわけではないが、久しぶりにクリアできてうれしかった。

隠しアゴグレッシブは間違ってハードで選択したらクリアしちゃったとかいうアレ。とはいっても今までの中では一番いいできだったし、ひとまず満足といったところか。

それから BRIGHTNESS DARKNESS (A) のハード。縦連でちょこちょこミスったくらいで、思ったよりも簡単だった。あと、GREEN EYES (A) が結構安定していることに気づいた。ハードはまだ無理だけど。

Level9 埋めは基本的にノマゲだが、昨日はぽつぽつハードも埋まった。

弐寺は飽きが来なくていいね。

2008/01/31

gdm のログイン画面が表示されたときの音

ログインしてからは ThinkPad についてる音量調節ボタンで音量をいじることができるようになるんだけど、ログイン前はできない。別にほっといてもよかったんだけど、外に出るとき、必ず携帯をマナーモードにする俺には、外でこの音が鳴るのがいやだった。ていうか外で音を鳴らすことがいやだ。音ゲは別ね。ああいう場所だし。

話が脱線した。

本題。ログイン画面が表示されたときに鳴る音を消すには、/etc/gdm/gdm.conf を一行編集するだけでいい。

SoundOnLoginFile=/usr/share/sounds/question.wav

この行を

#SoundOnLoginFile=/usr/share/sounds/question.wav

とすればいい。

これで音は鳴らなくなるからいいんだけど、気になったことが。

この編集した行の1つ上の行が、次のようになっている。

#SoundOnLogin=true

当然、俺がコメントアウトしたわけじゃない。なんで鳴るんだろう。

2008/01/31

X61 on Ubuntu でデュアルディスプレイ

タイトルからするといかにも「できました!」みたいな感じだけど、逆。諦めました。

X61 もとい 965GM Express チップセットで Xinerama によるデュアルディスプレイができました!という情報が、調べても調べても見付からない。

とりあえずこれにだいぶ時間を食われて SICP を進められない日々が続いちゃったから、いったん諦め。気が向いたときにでも調べて、新しい情報見つけたらまた挑戦してみよう。

それと、今回今までデスクトップで使ってたディスプレイとデュアルディスプレイしようとしたので、ディスプレイを触りまくった。で、気づいたことが。

おそろしく AC 電源部分の接触が悪いのだ。ちょっと付け方を間違うとすぐに電源が入らなくなる。一度安定すれば問題ないし、消えたところで、エッチビデオのクライマックスで音だけが虚しく響きわたるとかそのレベルの被害だからいいんだけど。

電化製品の命ともいえる、電源の接触が悪い電化製品にはあまりであったことがなかったので、ちょっとショックだった。

2008/01/29

DIV 端子ケーブル

せっかくノートPC買ったことだし、xmonad 入れたことだし、マルチディスプレイやってみるしかないよな!と意気込んでやろうと思ったら DIV 端子がなかった。

引っ越すときに「どうせ使わんだろ」と捨てたんだったっけなぁ。

買ってでもやるけどさ。

2008/01/28

vim で scheme コーディング

1つ前のエントリで、「vim じゃ emacs のインタラクティブシェルを用いた開発の真似できないようーいいなー」って嘆いた。それから5分くらい考えてみた。

  • vim も当然、ウィンドウ分割が可能である
  • 問題はインタラクティブシェルを vim 内に取り込めないこと
  • 別の手法で気軽にテストはできる方法があれば、それでいいのでは
  • Gauche には標準でユニットテストのモジュールが備わっている
  • これが結構簡単で、しかもカッコイイログを吐いてくれる
  • 片方コーディング、片方ユニットテストでいいんじゃね
  • ユニットテストを実行するときは :!gosh % か、前に作った :Run とかを使う

騙し騙しでそういうことになりました。めでたしめでたし。

2008/01/28

Gauche でライフゲーム

を作ってみました!ではないんだけど。ニコ動に Gauche でライフゲームのコーディングをしている様子を撮った動画があがっていた。

コードよりその開発環境に目を惹かれた。

上下に分割された emacs ウィンドウの、上のウィンドウでコーディング。下のウィンドウでインタラクティブシェルでさくさくと動作確認。すげー憧れる。

vim では screen でも使わない限り、できないんじゃないんだろうか。vim スクリプトでそういうことできるのかなぁ。

2008/01/26

xmonad 使用法メモ

  • ~/.xsession に $HOME/bin/xmonad って書いとけば、次のログインから xmonad が立ち上がった状態でのログインとなる。
    • 灰色の何もない画面でぶっ壊れたかと思ったけど、そこに xmonad はいた。
  • dmenu もインストールしといたほうがいい。というかほぼ必須。dmenu っていうのは、キーボード指向のアプリケーションランチャ。apt-get install dmenu
  • コマンドは man page 見れば大体分かる。
  • alt shift は結局改善されなかったため、mod キーを Muhenkan にした(詳細後述)。
  • dzen ってのを入れると、xmonad 上にステータスバーチックなものを表示させることができ、これが結構柔軟でいいっぽい。
  • vimperator との相性は抜群。

mod キーを変える

まずは xmodmap の設定を行う。

$ echo "add mod3 = Muhenkan" >> ~/.xmodmap
$ xmodmap ~/.xmodmap

~/.xmonad/xmonad.hs を以下のようにする。

import XMonad
import System.IO

main = do 
    xmonad $ defaultConfig { modMask = mod3Mask }

2008/01/25

ubuntu に xmonad をインストール

明日届く予定であるノートPCに導入する予定の xmonad を、今使ってるデスクトップに実験的にインストールしてみた。

結論から言うと、そこそこ苦労した。予行練習しといてよかった。今は使い方の模索中。なんにせよ、要のキーである alt+shift が効かなくて困る。

以下、手順。

  1. ghc6.8 をインストールする
    • apt-get install ghc6 でインストールされる ghc6.6 は色々面倒くさい。なので、haskell.org/ghc から ghc6.8 を DL し、インストールする。
      • haskell.org/ghc にアクセスし、ghc-6.8.2-i386-unknown-linux.tar.bz2 を DL する。
      • sudo apt-get install libreadline5 をやっておく。必要になるので。
      • 落とした ghc6.8 の tar を解凍し、cd する。
      • sudo ./configure
      • sudo make install
  2. libX11-dev をインストール
    • sudo apt-get install libx11-dev
  3. X11-1.4.1 モジュールをインストール
    • X11-1.4.1 にアクセスし、X11-1.4.1.tar.gz を DL / 解凍 / cd する。
    • sudo runhaskell Setup.hs configure
    • sudo runhaskell Setup.hs build
    • sudo runhaskell Setup.hs install
  4. xmonad をインストール
    • xmonad-0.5.tar.gz を DL/解凍/cd
    • runhaskell Setup.lhs configure --user --prefix=$HOME
    • runhaskell Setup.lhs build
    • runhaskell Setup.lhs install --user

以上でインストールは完了。後は WM を xmonad に切り替えればいいんだけど、ここでつまづいてる。WM の切替ってどうしたらいいんだろう。

とりあえず今は sudo killall metacity && $HOME/bin/xmonad & で、なんとなく動いてるのでよしとしてるけど。ちょっと妙な事になってるから、ちゃんとしたやりかたを調べる。

なお、alt+shift がきかない件に関しては、forum.ubuntulinux.jp が参考になる。

2008/01/24

vim に自作のコマンドを追加する

scheme を vim で書いてて、ふと Haskell mode の :GHCi みたいなことがやりたくなったので、コマンドを自作しよう。と、思ったが、今にして思えばそんなことしたことがなかった。なので今まで見たことがなかったプラグインの .vim ファイルを眺めて、それっぽいところを調べた。

vim でコマンドを定義するには、command コマンドを使う。command! とかあるけど、結構単純。以下サンプル。

"hoge と出力するコマンド: Hoge
"ただし、他に Hoge コマンドがある場合はエラーを吐く
command Hoge echo "hoge"
"fuga と出力するコマンド: Fuga
"ただし、他に Fuga がある場合はエラーを吐かず、上書きする
command! Fuga echo "fuga"

command[!] コマンド名 実行内容 という構成。! がつけば上書きになるのは、function のそれと同じ。

で、肝心の scheme 実行コマンドは

autocmd BufEnter *scm command! Run echo system("/usr/bin/env/ gosh ".expand("%"))

*.scm ファイルを読み込む時に、開いてるバッファの scheme プログラムを、/usr/bin/env gosh で実行するコマンド Run を定義する。

2008/01/19

SICP

SICP を読み始めた。

まだまだ読み始めで、Lisp が身についた!とかそういうレベルじゃないんだけど、Lisp のすごさは思い知った。

シンプルな構文、柔軟な表現、高い抽象度。もっと早くに触っとけばよかった。

初めてプログラム学ぼうとしてる人は、最初の言語には Lisp を選んだほうがいいよ。

2008/01/14

new PrintWriter(hoge, true);

サーバ・クライアントプログラムを書いてた時の事。

以下のようなコードで、間違いに気づくのに2時間かかった。

Socket socket = new Socket(host, Server.PORT);
PrintWriter out = new PrintWriter(socket.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out.println(msg);
System.out.println(in.readLine());

だいぶ端折ったけど、要は

  1. PrintWriter でリクエストを送信する
  2. BufferedReader でレスポンスを読み込む
  3. 標準出力に出力する

というクライアントプログラムである。

PrintWriter を使ったのは、明示的に flush する必要がないと勘違いしていたから。今思えば、なぜこのような勘違いをしていたのか。

PrintWriter のコンストラクタには autoFlush というオプションを渡すことができる。そのことを知らなくて、flush してないせいで処理が進まないということに気づかず、2時間悩んだ。正しくは以下。

Socket socket = new Socket(Server.PORT);
// 第二引数が autoflush フラグ
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out.println(msg);
// autoFlush = true してない場合もここで
// out.flush();
// すればいい
System.out.println(in.readLine());
  • 思ったように進まないときには、とりあえず javadoc

2008/01/13

Executor フレームワーク

Java 5 で追加された Executor フレームワーク(java.util.concurrent パッケージ)。タスクと実行ポリシーを分割する Executor インタフェースを中心とする、並列処理プログラミングのフレームワークである。今日はその練習として、並列クイックソートを書いた。

ただし、激遅。まぁこんだけ new ArrayList して add して remove してを繰り返せば遅くなる罠。

public class PararellSorter {

    class SortTask<E extends Comparable<E>> implements Callable<List<E>> {

        final List<E> list;

        SortTask(List<E> list) {
            this.list = list;
        }

        public List<E> call() throws Exception {
            if (list.isEmpty()) {
                return list;
            }
            E mid = list.get(0);
            list.remove(mid);
            Future<List<E>> lt = submitLT(mid);
            Future<List<E>> gteq = submitGTEQ(mid);
            List<E> ret = lt.get();
            ret.add(mid);
            ret.addAll(gteq.get());
            return ret;
        }

        private Future<List<E>> submitLT(E mid) {
            List<E> ret = new ArrayList<E>();
            for (E value : list) {
                if (value.compareTo(mid) == -1) {
                    ret.add(value);
                }
            }
            return exec.submit(new SortTask<E>(ret));
        }

        private Future<List<E>> submitGTEQ(E mid) {
            List<E> ret = new ArrayList<E>();
            for (E value : list) {
                if (value.compareTo(mid) >= 0) {
                    ret.add(value);
                }
            }
            return exec.submit(new SortTask<E>(ret));
        }
    }

    private final ExecutorService exec;

    public PararellSorter(ExecutorService exec) {
        this.exec = exec;
    }

    public PararellSorter() {
        this(Executors.newCachedThreadPool());
    }

    public <E extends Comparable<E>> List<E> sort(List<E> target) throws InterruptedException {
        Future<List<E>> task = exec.submit(new SortTask<E>(target));
        try {
            return task.get();
        } catch (ExecutionException e) {
            task.cancel(true);
            throw handleExecutionException(e.getCause());
        } catch (InterruptedException e) {
            task.cancel(true);
            throw e;
        }
    }

    private void doSample() throws Exception {
        List<Integer> l = makeRandomArray();
        try {
            long pstart = System.currentTimeMillis();
            sort(l);
            long pend = System.currentTimeMillis();
            System.out.println("TIME: " + (pend - pstart));
        } finally {
            exec.shutdownNow();
            exec.awaitTermination(10, TimeUnit.SECONDS);
        }
    }

    public static void main(String[] args) throws Exception {
        new PararellSorter().doSample();
    }

}

import 文と一部のヘルパーメソッドとは省略してます。

ExecutorService と Future はかなり便利。

  • キャンセル・シャットダウンが楽ちん
  • 例外処理がしやすい(投げられる例外が原因によってちゃんと分けられてる)

Executor が中心なのに、Executor 出てきてないじゃん!と思いの方へ。

Executor インタフェースは、自身のライフサイクル管理には全く気を配っていません。その機能拡張を施した、ExecutorService という Executor を継承したインタフェースがあります。

標準 API で用意されている Executor のファクトリメソッドの戻り値は、ExecutorService を実装したクラスのインスタンスのみとなっています。実際に使うのも ExecutorService が多いです。なので、Executor は直接ソースコードに出てきていないのです。

2008/01/11

書評 - 「分かりやすい文章」の技術

最近また、会社の blog に投稿しようと考えている。この blog ではそこまで文の質にこだわらず、書きなぐるようなスタイルをとっているが、会社の blog でそれをやるのは流石にまずい。そもそも、会社の blog に投稿しようと考えている背景には、分かりやすく、かつ洗練された文章を書く技術を身に着ける目的もある。

それで 「分かりやすい文章」の技術 という本を買った。

この本では、まず、芸術的文書よりも実務文書を圧倒的に書く機会のほうが多いのに、現代の教育にはそれがメインとなっていないことを指摘している。そういう背景もあり、現代には分かりにくい文章が溢れていることも指摘している。

次に、そもそも分かりやすい文章とはどういうものなのか、という疑問に答える。脳がどのように情報を解釈、格納していくかを示し、それを踏まえてどのような文章が分かりやすいか、ということを例文を交えながら説明している。

これ以降は、実際に文章を書くときのテクニック集となっている。これらはハンドブック的な使い方を想定し、作ってある。ただし、真新しいことは書いていないと感じた。

と、ここまで本の内容をただタラタラと垂れ流してみた。

本書はページ数は少ないが、内容は非常に凝縮されている。いや、凝縮されているというよりは、これでもかというほど無駄を削ってある。本を読むのが遅い俺でもたった3時間ほどで読むことができた。脳にすいすいと情報が格納されていくのを感じが心地よかった。

無駄を削りつつも分かりやすさは保たれていて、どんどん脳に入ってくるところは、流石としか言いようがない。

テクニックに関して、真新しいことは書いていないと感じた、と書いた。しかし、それを非常に分かりやすく書かれているところが、本書のいいところである。思わず納得し、しかも記憶に残る。特に「なるほど」と感じたのは「点の理解」と「線の理解」の説明である。詳しくは本書を。

現代は文章で成り立っているようなもんである。インターネットに散乱する全ての web は文章を含む。誰もが仕事やプライベートでメールという文章のやりとりをする。企画書も文章。man ページだって文章だ。その質は互いに違えど、文章であることには変わりない。

どんなに相手を想っていても、どんなに素晴らしいアイデアを持っていても、ただ文章がへたくそでそれをうまく伝えられなかったら、全てが台無しになってしまうのだ。これは非常にもったいないことである。

文章はちょっとしたコツで、洗練されたものになる。知らなければならない背景と、コツそのものを学習するのに、本書は素晴らしい出来栄えだと言えよう。

2008/01/06

何かに悩むとき

この正月は本気で色々悩んだ。色々ありすぎて元々の悩みの種が見えなくなった挙句、頭が混乱してきて、最終的には何がなんだか分からなくなって放心状態になってしまった。

悩むときは必ず問題を整理して(しながら)悩むようにしよう。もうこんな気分はこりごり。

2008/01/05

あけましておめでとうございます

遅ればせながら。昨夜実家から戻った。

今年の目標は私生活を充実させたいなぁと思っております。具体的な目標は特に考えてなかったから、今考えてみる。

  • ロイヤルコペンハーゲンのコーヒーカップを手に入れる
  • 私用にもう1台 HHK Pro 2 を手に入れる
  • もうちょっと市街地寄りに引っ越す
  • テレビを手に入れる
  • 今のデスクトップPCをサーバ化して遊ぶ

金かかりすぎワロタ。

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