WindowsでFabric

Windows 環境で Fabric を使おうとしてハマったのでその解決方法を書いておきます。

環境

  • Windows 7
  • VisualStudio 2013 Express
  • Python 2.7.6
    • easy_installでpipインストール済み

手順

http://stackoverflow.com/questions/21829188/error-unable-to-find-vcvarsall-bat-when-installing-fabric-python-library-on
より

pip install fabric

を実行すると以下のようなエラーが出ました。

building 'Crypto.Random.OSRNG.winrandom' extension
warning: GMP or MPIR library not found; Not building Crypto.PublicKey._fastmath.
error: Unable to find vcvarsall.bat

以下よりビルド済みのPyCryptoを取得してインストールします。

http://www.voidspace.org.uk/python/modules.shtml#pycrypto

もう一度fabricのインストールをたたくこと今度は成功しました。

以上

コマンドラインオプションのusageの書式

一般に、UNIX系コマンドラインツールは-hや–helpオプションをつけると使い方が表示されます。 Cで言うgetoptが標準的で、さまざまな言語でサポートされています。

今時、オプション引数の一覧はライブラリが生成してくれることが多いですが、usageの内容までは生成してくれないようなのでちょっと調べてみました。

基本は、

  • Usage: で書き始める
  • 必須のものは名前のみ
  • 必須でないものは[arg]のように名前を括弧で囲む
  • 複数指定可能な場合は … を付ける
  • 引数付きオプションには分かりやすい引数名を付ける

というのが大まかなルールになっています。

以下、有名なコマンドのusageだけ抜粋してみました。

$ bash --help
Usage:  bash [GNU long option] [option] ...
        bash [GNU long option] [option] script-file ...

$ man --help
usage: man [-adfhktwW] [section] [-M path] [-P pager] [-S list]
        [-m system] [-p string] name ...

$ ls --help
Usage: ls [OPTION]... [FILE]...

$ sort --help
Usage: sort [OPTION]... [FILE]...
  or:  sort [OPTION]... --files0-from=F

$ uniq --help
Usage: uniq [OPTION]... [INPUT [OUTPUT]]

$ sed --help
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...

$ awk --help
Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...

$ find --help
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

$ grep --help
Usage: grep [OPTION]... PATTERN [FILE]...

興味深いのは、

  • オプションのネスト(uniq) [INPUT [OUTPUT]]
  • オプション引数の列挙(find) [-D help|tree|search|stat|rates|opt|exec]
  • 複数オプションを括弧の中に記述(find) [path…]
  • 引数の単語はハイフンでつなぐ(bash) script-file

など。 大文字小文字やスペースの数など多少のバラつきはあるようです。

オプションの有無で指定が大きく変わるものは、複数usageを表示することで分かりやすくしているようです。

参照

ログなどの巨大なテキストファイルから一部を切り出す方法

ログファイルなど、ファイルサイズが1GBやそれ以上ある場合に、テキストエディタを使わずにコマンドラインで一部を切り出す方法です。 gzip圧縮されたファイルは適当にzlessやzcatで読み替えてください。

  • 行の範囲を特定する

lessコマンドに-Nオプションをつけて目的のファイルを開き、”/”を押して対象の文字を検索します。

less -N filename
  • 範囲の切り出し

sedで目的の行番号の範囲を切り出します。1506224行目から1506377行目まで切り出したい場合は以下のようにします。

cat hugelogfile.log | sed -n 1506224,1506377p > clipped.txt

以上。

参考

* http://stackoverflow.com/questions/831681/how-to-display-line-numbers-in-less-gnu
* http://stackoverflow.com/questions/83329/how-can-i-extract-a-range-of-lines-from-a-text-file-on-unix

[Go言語] Goでのキャスト (型アサーション)

Go言語では、インターフェース型xから型Tについて、

x.(T)

のような記法を型アサーションと呼びます。 Tがインターフェース型の場合、動的な型xがインターフェースTを実装しているかどうかを確認します。

xがTを実装しているかどうかは実行時に決まるため、失敗する場合があります。 いわゆるダウンキャストに相当する操作をすることができるため、C++のdynamic_castや、WindowsのCOMで言うところのQueryInterfaceに近いイメージだと思います。

型アサーションが以下のように代入や初期化で使われると、(T, bool)のペアを返します。

v, ok := x.(T)

次の例では、FooableとBarableを実装した”Hogus”と、Fooableのみ実装した”Bogus”を作成して、型アサーションによってHogusがBarableにキャストできてBogusができないことを確認しています。

http://play.golang.org/p/GggE7R1yw2

package main

import "fmt"

type Fooable interface {
    Foo()
}

type Barable interface {
    Bar()
}

type Hocus struct {
    format string
}

func NewHocus() (*Hocus) {
    b := new(Hocus)
    b.format = "-- %s\n"
    return b
}

func (self *Hocus) Foo() {
    fmt.Printf(self.format, "Hocus Foo")
}

func (self *Hocus) Bar() {
    fmt.Printf(self.format, "Hocus Bar")
}

type Bogus struct {
    format string
}

func NewBogus() (*Bogus) {
    b := new(Bogus)
    b.format = "== %s\n"
    return b
}

func (self *Bogus) Foo() {
    fmt.Printf(self.format, "Bogus Foo")
}

func main() {
    testHocus()
    testBogus()
}

func testHocus() {
    var o Fooable
    o = NewHocus()
    o.Foo()
    p, ok := o.(Barable)
    p.Bar()
    fmt.Printf("Type assertion result is %t\n", ok)
}

func testBogus() {
    var o Fooable
    o = NewBogus()
    o.Foo()
    p, ok := o.(Barable)
    fmt.Printf("Bogus Barable is %T\n", p)
    fmt.Printf("Type assertion result is %t\n", ok)
}

参考

  • http://golang.org/ref/spec#Type_assertions
  • http://ja.wikipedia.org/wiki/%E5%9E%8B%E5%A4%89%E6%8F%9B

[Go言語] コンストラクタの書き方

Go言語のコンストラクタは以下のように書くことが推奨されています。

http://play.golang.org/p/oM5C26l8iw

package main

import "fmt"

type Person struct {
    Name string
    Age int
}

func NewPerson (name string, age int) *Person {
    if age < 0 {
        return nil
    }
    p := new(Person)
    p.Name = name
    p.Age = age
    return p
}

func main() {
    taro := NewPerson("Taro", 26)
    fmt.Printf("name: %s age: %d", taro.Name, taro.Age)
}

NewPersonは構造体の初期化を使って以下のように記述することもできます。

func NewPerson (name string, age int) *Person {
    if age < 0 {
        return nil
    }
    p := Person{name, age}
    return &p
}

Cに慣れた人にしてみるとローカル変数のポインタを返すことに違和感があるかもしれませんが、メモリ領域は呼ぶ度に新たに確保されます。

  • Effective Go – Constructors and composite literals
    http://golang.org/doc/effective_go.html#composite_literals

[Go言語] アノニマスフィールド(anonymous field)による継承とオーバーライド

Go言語には継承はありませんが、アノニマスフィールド(anonymous field)を使うことで共通のフィールドとメソッドを持つ構造体(struct)を作ることができます。詳しくはドキュメント等を参照して下さい。

今回は、アノニマスフィールドで継承した場合のオーバーライドの扱いを調べました。インターフェース渡しのメソッドでは元の構造体のメソッドが呼ばれます。ちょっと例が長いですが。

インターフェース渡しの例

http://play.golang.org/p/ebyaLR1ruQ

package main

import "fmt"

type Animal interface {
    Eat()
}

type Mammal struct {
    Weight int
}

type Human struct {
    Mammal
}

func (a *Mammal) Eat() {
    a.Weight += 11
}

func (h *Human) Eat() {
    h.Weight += 23
}

func main() {
    // Human
    h := &Human{Mammal{1}}

    serveFood(h)

    fmt.Printf("Human weight is %d\n", h.Weight)

    // Mammal
    m := &Mammal{1}

    serveFood(m)

    fmt.Printf("Mammal weight is %d\n", m.Weight)
}

func serveFood(a Animal) {
    a.Eat()
}

実行結果

Human weight is 24
Mammal weight is 12
Program exited.

一方、メソッドの引数にポインタを渡すとMammalのメソッドが呼ばれてしまいます。

ポインタ渡しの例

http://play.golang.org/p/ZEiHehkhID

package main

import "fmt"

type Mammal struct {
    Weight int
}

type Human struct {
    Mammal
}

func (a *Mammal) Eat() {
    a.Weight += 11
}

func (h *Human) Eat() {
    h.Weight += 23
}

func main() {
    // Human
    h := &Human{Mammal{1}}

    serveFood(&h.Mammal)

    fmt.Printf("Human weight is %d\n", h.Weight)
}

func serveFood(a *Mammal) {
    a.Eat()
}

実行結果

Human weight is 12
Program exited.

アノニマスフィールドのポインタを使うのは避けた方が良さそうです。

余談ですが、Goにはオーバーロードはありません。
http://golang.org/doc/faq#overloading

参考

[Go言語] インターフェース引数は値渡しなのか参照渡しなのか

Go言語(golang)にはポインタとインターフェースがありますが、「インターフェースへのポインタ」で渡す必要があるのかどうか。

結論から言うと、インターフェースはインスタンスへの参照を持っているのでインターフェースへのポインタを渡す必要はありません。
以下の例では、serveFoodメソッドにインターフェースで渡していますが、元のインスタンスが変更されていることが分かります。

http://play.golang.org/p/M6is2Gpe0B

package main

import "fmt"

type Animal interface {
    Eat()
}

type Human struct {
    Vital string
}

func (h *Human) Eat() {
    h.Vital = "full"
}

func main() {
    a := &Human{"empty"}

    serveFood(a)

    fmt.Printf("vital is %s", a.Vital)
}

func serveFood(a Animal) {
    a.Eat()
}

実行結果

vital is full
Program exited.

まあ、インターフェースの値って何なのか考えてみれば明らかだと思いますが、ポインタに不慣れな人には理解が難しいところかもしれません。

参考

Android 4.2 (Jelly Beans)でビルド番号を7回タップしたのに開発者向けオプションが出てこない

Androidでは、USBデバッグなどの機能を使うには開発者向けオプションを有効にする必要があります。
Android 4.2 (Jelly Beans)ではこのオプションは隠されており、設定のビルド番号を7回タップすることで現れることになっています。

自分で試したら出てこなかったので調べたところ、どうやら端末を最初に登録した、所有者のユーザーでないと出てこないようです。

紛らわしいですね。

参考

Android 4.2 developer settings still unavailable

データベースで1:1のリレーションシップはいつ使うのか

ちょっと気になって調べたところ、Stackoverflowに質問が。

Is there ever a time where using a database 1:1 relationship makes sense?

ベストアンサーのコメントを見ると、

A 1:1 relationship typically indicates that you have partitioned a
larger entity for some reason. Often it is because of performance
reasons in the physical schema, but it can happen in the logic side as
well if a large chunk of the data is expected to be “unknown” at the
same time (in which case you have a 1:0 or 1:1, but no more).

訳)
1:1のリレーションシップは一般に大きな実体をなんらの理由で分割したことを示している。しばしばそれは物理スキーマのパフォーマンスが原因であるが、大きなデータの固まりが同時には”未定”になるべき場合はロジックの側でも起こりうる。(その場合1:0か1:1以外にはならない)

例も書いてありますが、まあ拾い読みしていくと以下のような感じかなと。

  • パフォーマンス
    • 行ロック
  • DB容量
    • BLOB
    • ごく一部のレコードしかフィールドを持たない
  • セキュリティ

一つのオブジェクトを分割して保存していることには変わりないですが、特定のカラムが頻繁に更新されて、多くがNULLになる場合には考えてみてもいいかもしれません。

Linuxなどで、コマンドラインからファイルサイズの大きいファイルを見つける方法

Linuxなどで、コマンドラインからファイルサイズの大きいファイルを見つける方法

# du -a /var | sort -n -r | head -n 10

/varのところを、~に変えればホームディレクトリ以下ですね。
ファイルサイズを数値の降順でソートして10件だけ表示されます。

quotaでエラーが出た時に便利。

ネタ元:
How Do I Find The Largest Top 10 Files and Directories On a Linux / UNIX / BSD?

ScalaFX を動かしてみる

h2. Introduction
巷では、とりわけ日本では終わってる感の強い RIA (Rich Internet Application) の中で、WPF (Silverlight) や AIR よりもさらにマイナーかつ注目度の低い JavaFX を皆さんご存知でしょうか?
じつは私も先週知りました。
JavaFX 1.0 から 2.0 への方針変更でますます人気ないみたいですね。
そんなの何がいいんだよ HTML5 だろ今更興味ないよと言われそうですが、ちょっとはいいトコもあるんだョ。
・Declarative Syntax
・WebKit使える
・JVMで動く
って感じで、触らないのも勿体無い気がしてきませんか?
そしてJVMだからScalaからもいけちゃうんです。そこで率先して(?)試してみました。
こちらの手順+αなので、詳しくはこちらを参照して下さい。
“DeveloperGettingStarted”:http://code.google.com/p/scalafx/wiki/DeveloperGettingStarted
h2. 動作環境
私が試したのは以下の環境です。
なんと、あろうことか JavaFX 2.0 は Windows しか正式リリースされておらず、 Mac はインストーラもない Beta で Linux はまだないというアーリーアダプターに冷たい状況となっています。
bq. Windows XP
JDK 1.7 (1.6の方が面倒がないかも、、、)
Scala 2.9.1
JavaFX 2.0
IntelliJ IDEA
Mercurial
h3. インストール
まず、上記一式をインストールします。
次に、scalafx を落としてきます。
“scalafx”:http://code.google.com/p/scalafx/
Downloads を開いても何もないよ、なんて言わないでください。ソースをチェックアウトしましょう。
bc. hg clone https://code.google.com/p/scalafx/
そして、環境変数を通します。
bq. JAVA_HOME
SCALA_HOME
JAVAFX_HOME
反映するため、一旦ログインし直します。 (IntelliJ関係のどこかにそう書いてあった。)
h3. IntelliJのセットアップ
さて、ここからは IntelliJ です。
こちらを参考にしつつ IntelliJ Scala plugin をインストールします。
“Getting Started with IntelliJ IDEA Scala Plugin”:http://confluence.jetbrains.net/display/SCA/Getting+Started+with+IntelliJ+IDEA+Scala+Plugin
IntelliJ の Preference Plugins から scala で検索してダウンロードできます。
この時点で、scalafx のプロジェクトを開けばいいはずなんですが、もしかしたらコンパイラが見つからなくて怒られるかもしれません。その場合は、適宜設定を変えてみたり、空の scala のプロジェクトを作ってみるなどしてください。
h3. ビルドとデモの実行
設定できたら、 All Tests の右の三角を押してテストがパスすることを確認します。
私の環境では、JFXApp.scala でコンパイルエラーが出たので、以下のように修正しました。
bc. // before
javafx.application.Application.launch(classOf[AppHelper], args:_*)

bc. // after
javafx.application.Application.launch(classOf[AppHelper], args)
配列を展開しなくてよくなったんでしょうか?コンパイラの言うがままに変更しただけですが、動いたので深く考えないことにします。
そこまで行ったら、任意のデモを開いて、クラスの辺りを右クリックして Run main を選ぶとデモが実行されます。
h3. まとめ
結局、なぜ ScalaFX かという話ですが、デモを見れば分かる通り yield でアニメーションすれば楽だよね〜、というのが一つ。アルゴリズムの可視化なんていうのも簡単にできそうです。あとは、宣言的にUIを作れるよね〜、など。
JavaFX とか別に興味なくても、Scala でサラッと書いたら絵が出てアニメーションするのっていい感じじゃないですか。
Scalaに興味があったら是非お試しあれ。

Git の References と Remotes

昨日、遅ればせながら Heroku を使ってみました。
それはおいおい書くとして、deploy するには @git push@ する必要があって、そのコマンドがふと気になったのでメモ。
ちなみに、私は git はたまに使う程度です。
h3. Heroku に push するコマンド
Heroku に push するコマンドは、
“公式サイトの説明”:http://blog.heroku.com/archives/2011/8/29/play/
にもあるように、以下のコマンドを使う。
bc. git push heroku master
確かにうまくいきます。
でも、 heroku と master って誰が決めたんでしょうか。プロジェクトが複数あってもそれぞれ heroku で push できるのはどういうこと ?
これは Git の References と Remotes というものでした。
“Pro Git – Pro Git 9.3 Git Internals Git References”:http://progit.org/book/ch9-3.html
本来、 Git のリポジトリは URL とハッシュ値で管理しているところを、『ローカルコピーごとに』エイリアスが付けられているんだなぁ、というお話でした。

Javascript (ECMAScript) の変なところ

Javascript (ECMAScript) には変なところがたくさんある。
ここでは、クロージャーやプロトタイプチェーンといった大きいところではなくてもっと細かい変なところをまとめたい。
以前、自分がパーザーや制御文を実装していたためその辺りが多いかも。
h2. ECMA 262 5th
h3. Completion value
Completion value というのは、
bc. //
100; // line. 1
200; // line. 2
とあった時に、line. 1を実行するとCompletion valueが100になり、line. 2を実行すると200になる、というものである。
まあ、 Perl の @return@ を省略した場合の戻り値ようなものだ。
基本的に参照する方法もないし、言語実装の内部的なものなのでどうでもいいようなものだが、実は eval が返す値のことだったりする。
@eval(“return 10;”);@ がエラーになるのは、evalは文字列をjsファイルのトップレベルとして評価するためだが、 @eval(“10;”);@ で @10@ が帰るのはプログラムを実行した最後のCompletion valueを返しているのだ。
厄介なのが、DOMのイベントのIE時代にトラディショナルなコードで、
@

Bullet Physics を iPhone で使う

iつみきで使っているライブラリのプロジェクトファイルはCMakeにこんな感じオプションを指定して作っています。
BULLET_PHYSICS.xcodeprojを開いて、LinearMath, BulletCollision, BulletDynamics あたりをビルドします。
できたライブラリは src/BulletDynamics/Debug などから適当にコピーして使います。
bc. #
$ cmake -DBUILD_SHARED_LIBS=OFF -DFRAMEWORK=OFF \
-DCMAKE_INSTALL_PREFIX=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk/System/Library/Frameworks \
-DCMAKE_INSTALL_NAME_DIR=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/System/Library/Frameworks \
-DCMAKE_C_COMPILER=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-gcc-4.2 \
-DCMAKE_CXX_COMPILER=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-g++-4.2 \
-DCMAKE_OSX_SYSROOT=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/ \
-DCMAKE_OSX_ARCHITECTURES=’armv6;armv7′ \
-DCMAKE_BUILD_TYPE=RelWithDebugInfo \
-DCMAKE_CROSSCOMPILING=ON \
-DBUILD_DEMOS=OFF \
-DBUILD_EXTRAS=OFF \
-DBUILD_UNIT_TESTS=OFF \
-DUSE_GLUT=OFF \
-G Xcode
iOS5 でもビルドできることは確認しました。
なんかいらなさげなオプションも一応つけたままにしています。ちなみにiPadだとarmv6のライブラリだと警告が出ます。
なるべくなら手動で操作するところを減らしたいので Framework にしたいところですが、 iOS では shared library が使えないため、今のところ static library を使っています。
iOSのバージョンが変わった場合が気になる人は Base SDK を Latest iOS に設定する良いかもしれません。
関連情報
– http://stackoverflow.com/questions/794137/how-to-set-up-cmake-to-build-a-library-for-the-iphone
– http://stackoverflow.com/questions/822404/how-to-set-up-cmake-to-build-an-app-for-the-iphone
– http://discussions.apple.com/thread.jspa?threadID=1549084
– http://www.cmake.org/pipermail/cmake/2009-October/032661.html

Mac OSX用

$ rm CMakeCache.txt
$ cmake -DBUILD_SHARED_LIBS=ON -DFRAMEWORK=ON \
-DCMAKE_INSTALL_PREFIX=/Library/Frameworks \
-DCMAKE_INSTALL_NAME_DIR=/Library/Frameworks \
-DCMAKE_OSX_ARCHITECTURES=’i386;x86_64′ \
-DCMAKE_BUILD_TYPE=RelWithDebugInfo \
-G “Unix Makefiles”
$ make
$ make install

chmod install_manifest.txt

  • BulletDynamics
  • BulletCollision
  • LinearMath
    をビルドする

jQueryとXRegExpが、、、

正規表現で文字クラスを扱えて便利な XRegExp ですが、IE8 で jQuery と組み合わせて使うと問題が起きました。
jQuery の @$.animate@ で、パラメータの value が数値の場合に @XRegExp.exec@ の中で例外が発生しました。
だいたいこんな感じ。
bc. // example
$(“#block”).animate({
scrollTop: 100 // <- Bad! must be “100px”
}, 1500 );
value を文字列にして解決。
型がないのも良し悪しですね。というか標準の RegExp を置き換えないオプションが XRegExp に欲しいです。

Twitter APIあれこれ

メモ
http://blog.programmableweb.com/2010/08/30/twitter-api-adds-retweet-count-and-more/
自分でやってみたところ、retweet_count は確認できたけど、retweetedはよく分からなかった。
Twitter公式のドキュメントに書かれていないオプションが必要になることもある。
include_my_retweet
http://code.google.com/p/twitter-api/issues/detail?id=1891
これがないと、自分のタイムラインに表示されるフォロワーのツイートをリツイートしたかどうか分からない。
apiチェッカー
https://apigee.com/console/twitter
エディットボックス左側のカギアイコンを押すとOAuthのメニューが出てくる。

それになかなか気付かず5分くらい首を傾げてしまった。

左のリストにない API でも、URL で入力すれば呼ぶことができる。

Acer Aspire Revo R3610 に XBMC をインストール

死蔵していた Acer Aspire Revo R3610 に XBMC をインストールしました。

もともと、Windows Media Center のクライアントとして使いたかったのですが、いくら ION でも ATOM で Windows 7 を動かすのは厳しいものがありました。 それとは別に、XBOX 360 を Media Center Extender として使ってみた結果、XBoxがデコードできる動画しか見られないなどの理由で使えないという結論に至ったので、Windows Media Center を諦めることにしました。

さて、XBMCを使うにはいくつか方法があります。

  • Windows 版 XBMC を使う
  • Linux 版 XBMC を使う
  • XBMC live を使う

私は Natty で Unity を使ってみたかったので、Linux 版を使うことにしました。

Aspire Revo に 64bit の Ubuntu 11.04 をインストールする上で気づいたこと

  • シャットダウンや再起動の直前でハングアップする。
    • どうも、無線LAN のモジュールが原因で起こるような話が海外のMLに書いてあり、 rt2800pci を modprobe -r してみると再現しなくなったので、 /etc/modprobe.d/blacklist-rt2800pci.conf に blacklist rt2800pci と書いて使わないことにした。
  • 64bit は unstable のpptにしかない?
    • ppa で追加してもないよと言われて首をかしげた。 結局stableのppaはいらなかったのでsynapticで削除した。
  • 画面が真っ黒のままになる
    • サスペンドからの復帰に失敗している様子。私はとりあえずサスペンドしないようにした。 インストールにあたっては、最初にクイックスタートガイドを読むことをお勧めします。ライブラリの設定方法もここに書いてあります。 http://wiki.xbmc.org/index.php?title=XBMC_Quick_Start_Guide
  • [未解決] キーボード操作ができなくなる 日本語IMEが有効になっていると操作できない。
    • XBMLをシェルにしない方がよさげ。
  • [未解決] マウスが消える
    • どうも、desktop zoom のバグという話がある様子。 http://www.giannistsakiris.com/index.php/2007/12/20/ubuntu-mouse-pointer-is-randomly-disappearing/ だけどどうもそれだけじゃなさそう。
  • 24fpsのDVD再生でティアリングする
    • どうも、compiz切れば直るといってる人がいる、、、 http://forum.xbmc.org/showthread.php?t=64009 Natty入れた意味がないからそれは避けたい。 新しいリビジョンで直ってた。 http://forum.xbmc.org/showthread.php?t=45482
  • DVDの音が小さい
    • システム設定 -> Audio -> Increase downmix volume とやらをオンにする。 advancedsettings.xml の ac3downmixgain かと思ったら違った。注意! http://forum.xbmc.org/showthread.php?t=48045&page=2
  • 音が出なくなる
    • Ubuntu のデスクトップにログインすると音が出るのに、xbmcをシェルとしているユーザーでログインすると音が出ない。 sshで入って alsa を初期化したら直った。やはりシェルにしない方がいい。 コマンドは alsactl init か alsa reload だったと思う。
  • YouTube pluginで日本語を含むディレクトリ名を保存先に指定するとエラー
    • とりあえず LANG=C xdg-user-dirs-gtk-update でディレクトリ名を英語にした。しかしアドオンを修正して欲しい。

Order & Chaos Online

iPhone/iPad 向け MMORPGの、 「Order & Chaos Online」 をやってます。
Gameloft という大手パブリッシャーのゲームで、Unity という最近話題のフレームワークを使っているようです。
一応 iPhone でも動きますが、 iPad で遊ばないと楽しめない感じです。
“iTures Store: オーダー&カオス オンライン©”:http://itunes.apple.com/jp/app/id414664715?mt=8
アプリが\600で、アカウントはとりあえず3ヶ月有効です。
始めたら、巻物アイコンが出ている人に話しかけまくって、お使いをクリアしていけばどんどん先に進みます。
レベルはクエストをこなすうちに勝手に上がります。
装備もクエストでもらえるので特に買う必要はありません。
レベルの他に、生産スキルがあります。最初のスキルはクエストでもらえます。
生産には材料が必要なので、戦闘で手に入るファーや沙織、アーマースクラップは売らないでためておくと良いです。
本を買うと作れるものが増えますが、まずは初級、中級では最初から覚えているものを作りまくった方がレベルを上げやすいようです。
PvPは拒否できますが、一部PvPエリアがあります。そこを通らないとクリアできないクエストも結構あります。
まあ、グラフィックもそれなりだし、すごく面白いってほどでもないんですが、安いし、 iPad なのでゴロ寝しながらでもトイレの中でも遊べるのが良いです。
h3. 参照
“Order and Chaos Online Wiki”:http://orderandchaosonline.wikia.com/wiki/Order_%26_Chaos_Online_Wiki
“Order & Chaos Online Wiki”:http://wikiwiki.jp/oco/
h3. 追記(2011/8/20): 面白い現象があったのでメモしておきます。
ウィルムの巣の、ヴェレシー港周辺のクエストで「ゴーストリベンジ」というのがあります。
これは、海賊の幽霊のハイエンからソウルストーンをもらってスネークマンのジアドゥアを倒すように言われる、という内容ですが、ジアドゥアのところに行くと、ハイエンが何人もいてジアドゥアが湧いた瞬間にやっつけてしまってジアドゥアを倒せません。
仕方ないので本家フォーラムで検索したら、次のように書いてありました。
MMORPGのサーバーでも適切な lock/unlock が必要ですね!
http://forums.toucharcade.com/showthread.php?p=1728875
bq.. That soulstone is used to summon Haien to help yu fight the quest mob. The reason you see So many versions of him is because people come up and use the soulstone a bunch of times. The game client (cleverly enough) will not render too many things on your screen as not to bog down your device too much, so what you are not seeing is all the corpses of the snake people all over the ground.
In order to complete the quest, stand right where the quest mob spawns (next to the stack of Haiens) and spam an attack button. This gives you a chance to tag the mob before the Haien mob instq kills it, so you can complete the quest.
Whatever you do, don’t use the soulstone!

Javascript で Unicode の文字クラスを使う

Javascript で扱う文字列の文字コードは全て Unicode (UTF-16) ですが、 @\w@ が日本語にヒットしなかったりして不便なことこの上ありません。
また、記号を除いた文字だけ取り出したい、といった場合、ほかの環境では Unicode で定められている文字クラス (Character Class) で指定することで簡単に記述できますが、ECMA-262 5th にも含まれていないため Javascript では@[\uxxxx-\uxxxx]@という泥臭い指定をする羽目になってしまいます。
そこで使えそうなのがこのJSライブラリ。
“XRegExp”:http://xregexp.com/
これ単独でも、名前付きキャプチャーが使えたりして便利です。
そして、プラグインを入れると文字クラスも使えます。
“XRegExp – plugins”:http://xregexp.com/plugins/
テーブルを含んでいるだけに若干サイズがでかいのが気になりますが、細かいことは気にしない!自分で書いてバグるよりマシ!
ちなみに、ここを見て知りました。最近StackOverflowばっかり見てる。
“regex – Javascript + Unicode – Stack Overflow”:http://stackoverflow.com/questions/280712/javascript-unicode
以上、XRegExpの紹介でした。
余談:
Twitter の本家で日本語ハッシュタグのリンクの処理部分を見たら、fromCharCode で文字コード範囲の文字を全て含む Array を作っていた。
これって超積極的に定数伝播するインタープリタだとコンパイルタイムにテーブル作れるのかな?と思った。