メモ帳

よく忘れるからね,仕方ないね

HomebrewのTapを作るときの名前

Tapを作成したものの、はまったのでメモ

Tapのインストールは

brew tap #{username}/#{tapname}

というフォーマットですが、ここでusernameはgithub上のアカウント名、tapnameはリポジトリ名だと思ったらそうではないようです。
実際にgit cloneされるリポジトリ

https://github.com/#{username}/homebrew-#{tapname}.git

というリポジトリがcloneされます。"homebrew-"が自動的に追加されるみたいです。
というわけで

kanosaki/homebrew-mytap

というリポジトリをgithub上で作って

brew tap kanosaki/mytap

というコマンドでインストールします。

Macのスリープからの復帰を早くする

Mac OSX Lionからスリープからの復帰が遅い・・?

スリープについて、OSX Snow LeopardまではWindows Vista等と同じ挙動だったと思うのですが、これは私の感覚ですが、Lion以降、1時間程度スリープ状態で放置するとバッテリ残量があってもハイバーネートしてしまい、復帰にとても時間が掛かります。具体的には復帰時のパスワード入力フォームは出るのに30秒くらい入力できずに歯がゆい思いをします。MacBook Airは起動が10秒以下で終わるので何やってるのかわかりません。私の環境だけなんでしょうか・・?

OS Xの電源管理ツールを覗いてみると・・

pmset というプログラムが電源管理へのアクセスを提供しています。とりあえずman pmsetでハイバーネーションに関するオプションを探していると、

hibernatemode = 3 (binary 0011) by default on supported portables. The system
will store a copy of memory to persistent storage (the disk), and will power
memory during sleep. The system will wake from memory, unless a power loss
forces it to restore from disk image.

となっていて、man pmsetの記述的には、私の期待する挙動にデフォルトでなってることになってるんですけど、実際は違う。man pmsetの内容が古いのかも知れません(え

対処

pmsetにはstandbydelayというオプションがあります。ハイバーネーションを行うタイミングを'時間で'指定できます。本当はバッテリー残量で指定したいんですが、まだ見つけられてないので、もうちょっと探してみますが、スタンバイ状態でもかなりバッテリーは持つので、残量数%とかでスタンバイしない限り危険なことにはならないでしょう。
というわけで

sudo pmset -b standbydelay 18000

と実行し、バッテリーで駆動しているとき(-b)、18000秒(5時間)後にハイバーネーションを行うようにしました。
これでほぼ完璧に期待する動作が得られました。*1

そういえば

Lionの搭載されるMacBook Airが出るときの宣伝文句に、

バッテリーで30日間待機できる

的な宣伝してました、あれのカラクリはこれでしょうかね・・? 余計なことを

*1:もちろん、自己責任で行って下さいね!!

Drobo FSの「Droboが内部問題を検出しました」に対応する。

あらすじ

Droboに問題が発生、サポートに対応が書いてあったんだけど日本語環境だと上手くいかなかったのでメモ

対処

Droboのドライブがマウントできないので、どうもおかしいと思ってDrobo Dashboardを覗いたら、

Droboが内部問題を検出しました。サポートに連絡してください。

てなアラートを表示していたので、これはどうしたことかといつものようにグーグル先生に(英語で)聞いてみたら、答えが返ってきた。
というわけで、解決法が書いてあるページ
http://support.drobo.com/app/answers/detail/a_id/500/

簡単に言うと、Drobo Dashboardでドライブを選択した状態で、Ctrl-Shift-M(Win/Mac共通)を押すと、隠しコマンド的な機能が実行できるよ、というもの。
File System Maintenanceを実行するコマンドのようです。Ctrl-Shift-Mを押すとダイアログが表示されるので、"PROCEED"と打ってOKを押してねと書いてあるものの、ここで問題が。
なんと、Drobo Dahsboardが日本語になっていると、ボタンがアクティブにならず押せないという謎バグ。
というわけで、英語にしたかったのですがDrobo Dashboardの言語設定ドコー?
(ここからWindows版の話)
仕方ないので、もう一度インストーラーで英語を選択してインストールしたら・・・やっぱりというか、起動したら自動で日本語になってしまっていました。インストーラーの言語のみしか選択できないようで。
仕方が無いので、設定ファイルを無理矢理弄ることに。

C:\Users\(username)\AppData\Local\Drobo Dashboard\settings.xml

を開いて。

/Settings/Language

を"en"にすれば大丈夫です。
結果、こんな具合ですかね。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Settings>
    <FirstTimeRunVersion>2.1.2 [46070]</FirstTimeRunVersion>
    <EnableAnonymousReports></EnableAnonymousReports>
    <EmailSettings></EmailSettings>
    <Language>en</Language>
    <SkipVersionCheck></SkipVersionCheck>
    <SortDevicesBy>0</SortDevicesBy>
    <ReverseDeviceSorting></ReverseDeviceSorting>
    <AllDevicesSelView></AllDevicesSelView>
    <FirstTimeRun>0</FirstTimeRun>
</Settings>

Languageのところがenになっています。
Macの場合は

/Users/(username)/Library/Application Support/Drobo Dashboard/settings.xml

に対して同様の操作を行えば英語になります。

実は、この後Windowsでこの処理を行って、Ctrl-Shift-Mを押してみたのですが、今度はダイアログ自体がなぜか出てこなくて、面倒になって手元のMacでFile System Maintenanceを実行したので、この方法でWindowsで最後までいけるかは未検証です。

ちなみにFile System Maintenanceは今実行中なので、上手く直るかはわかりませんが・・・・祈ってます。

追記: 2012/07/24

翌日の昼前に正常に終わりました。よかったよかった

Google Driveの同期ディレクトリを自由に設定する

Google Driveのローカル同期ルートが変更できない

Google Driveは同期に使うディレクトリ(デフォルトはホームディレクトリ)を指定すると、その中に'Google Drive'というディレクトリを作り、そこにファイルをコピーするようです。

何が問題のか

何も問題じゃありませんが、同期するディレクトリ名を指定できない上、強制で作られるディレクトリ名に空白文字が入るのが納得いかない。
よく使うディレクトリなのでシェルで扱うときに

cd ~/Google\ Drive

と打つのは何となく嫌なので

cd ~/sync

とかで済ませたい。

解決法

芸もなく、設定ファイル、sync_config.dbを書き換えます。Macなら~/Library/Application Support/Google/Drive以下に、 Windowsは確認していないのですが、たぶん%AppData%/Google/Drive(LocalかRoamingかは確認してないです)以下にあると思います。
SQLite3のデータベースファイルなので、

update data set data_value='{お好きなディレクトリの絶対パス}' where entry_key='local_sync_root_path'

を実行して終わりです。

Macの例

設定は、SQLite3を使って格納してあるので、Macなら

~/Library/Application\ Support/Google/Drive/sync_config.db

を編集します。sqlite3を使って

sqlite3 '~/Library/Application Support/Google/Drive/sync_config.db' "update data set data_value='{お好きなディレクトリの絶対パス}' where entry_key='local_sync_root_path'"

を実行します。今回は/Users/saki/syncに設定するので

sqlite3 '~/Library/Application Support/Google/Drive/sync_config.db' "update data set data_value='/Users/saki/sync' where entry_key='local_sync_root_path'"

ですね。

もちろん

  • やる前にsync_config.dbのバックアップを取ってくださいね。
  • ちゃんとチェックしてないので、これでデータが壊れたりしても私は責任を負わないのでよろしくお願いします。

最後に

見ての通りはてなブログ初利用。コードに色づけされないところがちょっとアレですが、画面がシンプルでいいかなぁと思ったので試しに使ってみることにしました。

プログラミング言語過去問回答

2010年度プログラム言語の回答です。多分間違いがあるので見つけたら教えてください。

Java言語が前提、C++とかだと挙動が違う。(JavaC++でいうvirtualがすべてのメソッドにデフォルトでついてる)
サンプルコードは、授業で出て来なかったような記法はなるべく避けてます

オーバーライドとオーバーロード

名前が似てるだけで、機能は全然別の物。
オーバーライドとはポリモーフィズムにおける機能で、継承を行っているクラスが基底クラスの同じシグネチャ(メッソド名、引数リストの型、戻り値の型)を持つメソッドを上書きするもの。

import java.util.*;

public class SomeApplication{
    public static void main(String[] args){
        new SomeApplication().sample();
    }

    public void sample(){
        // Human型で宣言するので、それを継承するクラスなら入れられるのが味噌
        ArrayList<Human> people = new ArrayList<Human>();
        people.add(new Japanese("太郎"));
        people.add(new English("Watson"));

        for(Human h : people){
            // hがJapaneseの時と、Englishの時で挙動が変わる
            // これはgreetメソッドをオーバーライドしているので起こる
            // たしかにHuman型のhだが、数行上を見ればわかるように、実際は
            // EnglishとJapaneseが入ってて、同じコードでも別の挙動をする。
            h.greet();
        }
    }

    public class Human {
        String name;
        // 実際は抽象クラスと抽象メソッドを使うべきだが、
        // まぁこまけぇことはいいんだよ!!
        public void greet(){}
    }

    public class English extends Human {
        // コンストラクタ。これも本当は・・・こまけぇことはいいんだよ!!
        public English(String name){
            this.name = name;
        }
        
        // ここで実際にオーバーライド
        // 英語圏の人の場合の挙動
        public void greet(){
            System.out.println("Hello! I'm " + name + ".");
        }
    }

    public class Japanese extends Human {
        public Japanese(String name){
            this.name = name;
        }
        
        // 日本語圏の人の場合の挙動
        public void greet(){
            System.out.println("こんにちは!! 私は" + name + "です");
        }
    }
}

結果:

こんにちは!! 私は太郎です
Hello! I'm Watson.

オーバーロードとは、同名でもメソッドシグネチャの違いによって適当なメソッドが自動で選択される物。

//インスタンス作るのがめんどくさいので全部static
public class SomeApp2 {
    public static void main(String[] args){
        // 同名のメソッドを呼び出しても、引数、戻り値の型を考慮して
        // 自動的に呼び出すメソッドを選定してくれる
        SomeApp2.hoge(1); // 2が呼ばれる
        SomeApp2.hoge("foo"); // 1が呼ばれる
    }
    // 1
    public static void hoge(String s){
        System.out.println("String");
    }
    // 2
    public static void hoge(int i){
        System.out.println("int");
    }
}

結果:

int
String

Appletにおけるアニメーション概要

Threadクラスを使って、メインスレッド以外のスレッドから定期的にコンテクストを書き換えることでアニメーションを実行する。
例えば、四角形を横に動かすプログラムの場合

  • AppletにRunnableを実装する
  • Runnable.runをオーバーライドして、そのなかでwhile(true){四角形位置更新→repaint→スリープ}処理をする。
  • initメソッドの中でnew Thread(this).start()をする。

もうちょっと長い説明にすべきですかねぇ。 学校のページを参照してください。

primeFactor

void primeFactor(int n){
    for(int i = 2; i <= n; i++){
        if(n % i == 0){
            System.out.printf("%d ", i);
            n /= i; i = 1;
        }
    }
}

本当は良くないんですが、仮引数のnをどんどん割っていって出力してます。
一つ因数を見つけたら、また2から辿ります。

fib

int fib(int n){
    if(n < 2){
        return n;
    }else{
        return fib(n - 1) + fib(n - 2);
    }
}

 F_0 = 0, F_1 = 1, F_n = F_{n-1} + F_{n-2}
という定義を考えれば、割と自然なのでは。

Range

a: "upper - lower + 1"
b: "i + lower"
まんまですね。

Macのインタラクティブシェルで補完を効かせる

環境変数PYTHONSTARTUPにファイルパスをを指定しておくと、Pythonのインタラクティブシェルの起動時に自動的に実行されますよね。.zshrcなどのように。
そしてそのファイルの中でPythonのrlcompleterというモジュールの機能で、補完が効かせられるように出来るのですが

import rlcompleter
rlcompleter.parse_and_bind('tab: complete')

と書いても反応しないので、ググってたら見つけました(どこのサイトか忘れちゃいました・・)

import rlcompleter
rlcompleter.parse_and_bind('bind ^I rl_complete')

おお、これで補完が効く!!
・・・と思ったらTabが効かなくなった。いい感じに調整してくれないようで
というわけでTab補完は捨てて、Ctrl-Spaceで保管することに。つまり

import rlcompleter
rlcompleter.parse_and_bind('bind ^@ rl_complete')

で落ち着いた。


#最近MacとLinuxが違いすぎてもうね。誰だよMacはUNIXです!!(キリッとか言ったの、かなり設定書き換えたぞ。

MacでLyXの日本語環境を

TeXWYSIWYG(厳密にはWYSIWYMと言うらしいですが)エディタLyXを日本語で使う際、引っかかったのでメモ。
本当はデフォルトでも大丈夫とのことでしたが・・。

MacPortsから入れたpTeXとLyXWebサイトからのLyX1.6.9バイナリ(.dmg)を使用します。

手順

  1. まず、MacPortsでpTeXと、ウェブサイトからLyXインストーラを拾ってきて入れる。
  2. platexが正常に動くことを確認
  3. LyXも英語環境(documentclass=article)で動くことを確認
  4. LyXアプリケーションディレクトリに(Macだと/Applications/LyX.app/Contents/Resources)にconfigure.pyがあるので開く
  5. checkLatexConfig関数の
fout = os.popen(LATEX + " wrap_chkconfig.ltx") 

fout = os.popen("platex wrap_chkconfig.ltx") 

に変更

  1. LyXからLyX->Reconfigure => LyX再起動
  2. ついでにLaTeX(plain) -> DVIもplatexに書き換えて完了

原因

MacPortsでpTeX依存パッケージでlatexが入って来ますが、latexから日本語ドキュメントクラスは参照されてない。($TEXMF/ptex以下にあるからでしょうか)
LyX側は初期化スクリプトをlatex叩いて行ってるので、日本語*.clsファイルが無いと認識されてる。
というわけで、ちょっとハードな修正ですが、platexしか使う予定が無いのでよしとします。
latex側のドキュメントクラスファイルを弄るとか(文字コードでなんか怖いので却下)、latex自体をplatexに置き換える(依存で入ってきた物を消すの?)とか考えましたが、LyXとの問題のようですしLyXを書き換えることにしました。
というわけで、要するに初期化スクリプト内でplatex使ってね、とするだけです。

より良い方法がいくらでもありそうですが、何せTeXがよくわかってないので、動くことだし良しとしますか・・