Ubuntuのrubygemsでrcodetools 0.8.1を入れてみた

rubygemsを入れてないのでそこからスタート。

$ sudo aptitude install rubygems
$ sudo gem update
$ sudo gem install rcodetools

でインストール完了。
(12/17訂正:s/gems/gem/g)
で、Emacsで(require 'anything-rcodetools)して「これでanythingで補完できるwwwこれ最強じゃねwww」


……と思っていたのだが、いざ補完しようとするとエラーを吐く。
エラーの内容を見るとどうやら「rct-completeが見つからないよ」ということらしい。
いや、ついさっき gems install rcodetools で入れたはずなんだけど、と思いながらターミナル上で

$ rct-complete
$ xmpfilter

とやってみると、たしかにどちらも command not found。
あれ〜?どこにインストールされたの?ということで調べてみると、どうやら /var/lib/gems/1.8/bin という妙なところにある様子。
仕方が無いのでPATHに先ほどのディレクトリを追加してもう一度チャレンジすると無事に動作した。
こんなことで時間を1時間くらい使ってしまった。とほほ……。
あとはauto-complete.elとか使うと幸せになれそう。


ところでEmacsには、これくらい強力なPythonの補完ができるのってないのかな?

3つ以上の集合の直積を求めるプログラム

を最初はRubyで書き始めたのだが、想像してたよりも面倒なことになりそうだった(mapとかinjectでできる?再帰が必要?)。
そんなとき、研究室の先輩にPythonを勧められたときに教えてもらった、リストの内包表記のことをふと思い出したわけである。
自分はPython使いではないので手間取るかと思ったが、かなりあっさりできてしまった。
せっかくだから(?)、最近リリースしたばかりらしいPython 3.0で動くように書き直してみた。

from functools import reduce

# 直積を求める関数
def product(lists):
    return reduce(
        lambda prod, list: [x + [y] for x in prod for y in list],
        lists, [[]])

alphabets = ['A', 'B', 'C']
numbers = [1, 2, 3, 4]
fruits = ["apple", "orange"]

for element in product([alphabets, numbers, fruits]):
    print(element)

printに括弧がいるようになったのはニュースで見て覚えていたが、reduceを使うのにimportが必要なのは知らんかった。
とにかくPythonだとやたらとあっさり書けた。
りすとの ないほうひょうき おいしいです > | ^o^  |

追記

http://d.hatena.ne.jp/Sixeight/20081212/1229100055
Python 3.0なんかで書き直してしまったために、人のマシンを固めてしまうという罪なことをしてしまったw
ということで実際に作ったPython 2.5で動くやつを。

# 直積を求める関数
def product(lists):
    return reduce(
        lambda prod, list: [x + [y] for x in prod for y in list],
        lists, [[]])

alphabets = ['A', 'B', 'C']
numbers = [1, 2, 3, 4]
fruits = ["apple", "orange"]

for element in product([alphabets, numbers, fruits]):
    print element

ほとんど変わらないけどねw

「クォーク 第2版」を読んでみる

ノーベル物理学賞を受賞した南部先生の著書です。
amazon:クォーク 第2版

実はこの本、小学生のときに買ってもらった本なのですが、さすがに当時の自分には内容が難しくて「???」状態でした。
それから今の今まで読み直していなかったのですが、ノーベル賞受賞のニュースのおかげで日の目を見る時がきましたw
紙の黄ばみや表紙の日焼け具合に歳月の流れを感じます。(しかもカバーを無くしてしまった)


あれから10年近く経った今なら理解できるかも?
ということで暇を見て読み直していきたいと思います。

Windowsでタイル型ウィンドウマネージャを使いたい

ということで探してみたら、WinSplit Revolutionていうのを見つけた。
http://www.winsplit-revolution.com/

よくできてそうな印象だが、デモ動画を見た感じだと自動でウィンドウの配置を決めてくれるわけではなさそう。どちらかというとキーボードじゃなくてマウスでぐりぐり操作する感じなのかな?

(ネタ元は日本タイル型ウィンドウマネージャ推進委員会

Visual C# & C++ 2008 Express Edition インストールした

ちょっと入用だったので、Visual C#C++を自宅PCにインストールした。なんだかんだいってもIDEは便利。IDE無しでプログラミングとかとてもじゃないがムリ。特にC++JavaC#とか。ちなみに研究室ではEclipse使い。

これから、.NET Framework + Win32API少々を使ってプログラムを書く予定。 Win32APIには久しく触れてないのでちゃんと使えるか若干不安。ホントは.NET Frameworkオンリーでいければいいんだけど、まだまだWin32APIを直接たたかないとできないことがあるので仕方がない。うちの研究室でもWin32APIを使ってアプリケーション作ってる後輩がいたのだが、どう考えても茨の道を突き進んでいる様子だったので、「それJavaか.NETでもできるよ」とアドバイスしておいた。

マルチスレッドプログラミングってよくわかんないよねー

研究のためにJavaでマルチスレッドなプログラムを書かなきゃならなくなった。そのときに疑問に思ったことがあるので書き置いておく。

下のようなコードを考える。

import java.util.concurrent.*;

class Test {
    public static void main(String[] args) {
        ScheduledExecutorService schedular =
            Executors.newSingleThreadScheduledExecutor();
        ScheduledTask scheduledTask = new ScheduledTask();
        ScheduledFuture<?> handle =
            schedular.scheduleAtFixedRate(scheduledTask, 0, 1, TimeUnit.SECONDS);
        try {
            Thread.sleep(10000);
        } catch(InterruptedException e) {
        }

        synchronized(scheduledTask) {
            handle.cancel(true);
            System.out.println("後片付け");
        }

        schedular.shutdown();
    }

    private static class ScheduledTask implements Runnable {
        public synchronized void run() {
            System.out.println("繰り返し");
        }
    }
}

このコードは、"後片付け"の処理の後に"繰り返し"の処理が発生しないように意図して書かれている。でも、本当にそれが実現できているのかが気になっている。要するに下記のような動作が起きるか否かという話。

  1. 前回のタスクの実行から1秒経過したのでコンテキストスイッチが発生。[schedularのスレッド]が実行状態になる。
  2. [schedularのスレッド] scheduledTask.run()メソッドを呼び出す準備をして、scheduledTaskが起動済みになる。scheduledTask.run()メソッドはまだ呼び出されていない。
  3. コンテキストスイッチが発生。[mainのスレッド]が実行状態になる。(←ここが問題!)
  4. [mainのスレッド] synchronized(scheduledTask)ブロックに入る。ブロックを抜けるまではscheduledTask.run()メソッドの実行はブロックされる。
  5. [mainのスレッド] handle.cancel(true)で起動前のscheduledTaskの実行を取り消す。しかしscheduledTaskは起動済みなので何も起きない。
  6. [mainのスレッド] "後片付け"の処理を実行する。
  7. [mainのスレッド] synchronized(scheduledTask)ブロックを抜ける。
  8. コンテキストスイッチが発生。[schedularのスレッド]が実行状態になる。
  9. [schedularのスレッド] scheduledTask.run()メソッドを呼び出す。
  10. [schedularのスレッド] "繰り返し"の処理を実行する。
  11. [schedularのスレッド] scheduledTask.run()メソッドを抜ける。

もしこんな感じで処理が進むと、"後片付け"の処理の後に"繰り返し"の処理が発生してしまうことになる。問題は上の2.のようなコンテキストスイッチが発生するのかどうかである。現実的に考えると、[schedularのスレッド]が起きたばかりなので、そんなにすぐ2.のコンテキストスイッチが発生することはないんじゃないかと思う。でも、絶対にありえないとは言い切れないのでJavaのほうで対策が施されてないと困ってしまう。

そもそも、上のコードの実現の仕方がダメすぎるという可能性もある。他のしかるべき方法ならば悩むことなく実現可能なのかもしれない。誰か教えてください。

そして話がいきなり変わるが、親知らずを抜いたときの顔の腫れが全然引く気配がない。この腫れのせいで口が動かしづらいので、食べ物を食べてもさっぱりおいしく感じない。これでもう片方の親知らずも抜くとかありえなくね?