OmniAICreator/Qiita-1.07M huggingface dataset:
OpenVZでnmbdの注意点

## 問題

* 同一ホスト上のKVM(win)とOpenVz(samba)において、OpenVzのnmbdの名前解決ができなかった。

## 解決策

* 5分くらい待てば良い。無事他の端末から`net view \\myserver`が応答した。
* どうしてもダメならwindows側の`hosts`に書く。

## 以下メモ

[こちらの現象](http://www.openqnx.com/phpbbforum/viewtopic.php?f=4&t=10570&view=print)にだいたい似ている。

```text:/var/log/samba/log.nmbd
open_socket_in(): setsockopt: SO_REUSEPORT = True on port 137 failed with error = Operation not supported 
```

と表示される。そのため、IP直打ちでのファイル共有はできるが、WORKGROUPには表示されない。(未解決)

今回学んだこと
------------------
* `nmbd -d 10 -i`でデバッグ出力ON
* /var/log/samba/log.nmbd にログが出力される。
* `testparam /etc/samba/smb.conf`でsambaの設定表示
* nmbdは/etc/samba/smb.confを読み取って`netbios name = hogehoge`の値を返す。
* [Sambaが動作しないときの診断方法](http://www.samba.gr.jp/doc/diag.html)が頼れる。
選択範囲の文字列を Kobito へ送信する


Automator を使ってサービスを作成すると、アプリケーションを問わずに選択範囲の文字列を簡単に取得することができる。

[ターミナルから Kobito へ文字列を送信する](http://qiita.com/watson1978/items/c6ad9417298367aa9b9b) をサービスにしてみた。

### 1. Automator を起動してサービスを選択する。
![131102-0001.png](https://qiita-image-store.s3.amazonaws.com/0/2075/e9e523c8-aa9c-68d3-784e-932257f4b8ea.png "131102-0001.png")

### 2. 「シェルスクリプトを実行」を追加する。
![131102-0002.png](https://qiita-image-store.s3.amazonaws.com/0/2075/3e97a3fc-132e-0f80-87a7-6443a83451a4.png "131102-0002.png")

### 3. 実行するコマンドとして `/usr/bin/ruby` を選択して、以下のコードを記述する。

```ruby
data = ARGF.read
path = "/tmp/kobito#{Time.now.to_i}.md"
File.open(path, "w") { |io| io.print data }
system "open -a Kobito '#{path}'"
File.delete(path)
```

### 4. ワークフローを保存した後、Kobito へ文字を送りたいアプリケーションで文字列を選択してサービスを選択する。
![131102-0003.png](https://qiita-image-store.s3.amazonaws.com/0/2075/066d50a8-d442-4eed-ea2f-07216ad05127.png "131102-0003.png")

[システム環境設定] の [キーボード] からサービスにショートカットキーを割り当てることもできる。
![131102-0004.png](https://qiita-image-store.s3.amazonaws.com/0/2075/9a5d95e9-bd0e-8eaa-7cb1-2581288f1362.png "131102-0004.png")
OpenVZコンテナのネットマスク設定

コンテナのサブネットマスクが`255.255.255.255`固定なのが気に入らなかったので調べてみた。
[参考](http://forum.openvz.org/index.php?t=msg&goto=8772&)

(ubuntuとdebianの場合。)

```diff:/etc/vz/dists/scripts/debian-add_ip.sh
add_ip()
{
..
-#create_config "${_IP}" "${_NETMASK}" "${_MASK}" "${IFNUM}"
+create_config "${_IP}" "255.255.255.0" "${_MASK}" "${IFNUM}"
..
}
```

これでコンテナ再起動すると`255.255.255.0`になる。

redhat,centosはredhat-add_ip.shを書き換えれば良いと思う。
macことえりで半芝を全芝にしたい

# macことえりで半芝を全芝にしたい

Windowsの感覚で、かな入力の状態で芝を書こうとすると、

```
っっっっっっっっっっっっっっっっっっっっw
```

こうなる。
英数入力の状態だと当然半芝になってしまう。
これはねらーとしてはつらい。

## 方法1：ショートカットキーを使って入力後に変換する

いつも通り下記を入力して

```¥n:変換前
っっっっっっっっっっっっっっっっっっっっw
```

"Ctrl + L" を入力する。

```¥n:変換後
ｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗ
```

こうなるっっっっっっっっっw

## 方法2：ファンクションキーを使って入力後に変換する

いつも通り下記を入力して

```¥n:変換前
っっっっっっっっっっっっっっっっっっっっw
```

"Fn + F9" を入力する。

```¥n:変換後
ｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗ
```

こうなるっっっっっっっっっw

## 方法3：全角英数モードで入力する

システム環境設定 > 言語とテキスト > 入力ソース
にて
"全角英字"にチェックを入れる。※Mac OS X Lionの場合の例

"Cmd + Space"で入力ソースを変更、"全角英字"を選択する。

いつも通り入力すると

```¥n:期待通り
ｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗ
```

こうなるっっっっっっっっっw

## 方法4：ことえりの設定を変更する

macメニューバーのことえりの入力ソースのアイコンをクリックして
開いたメニューから"環境設定を表示"を選択する。

なんか癪に障るけれど"Windows風のキー操作"にチェックを入れる。

いつも通り入力すると

```¥n:期待通り
ｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗｗ
```

こうなるｗｗｗｗｗｗｗｗｗｗ

## まとめ

他にも辞書登録するとかありますがどれもこれも面倒ですね、方法4が一番簡単です。

これでみんなも半芝乙とは言われなくなりますね。

ちなみにオレはGoogle 日本語入力を使っていますｗｗｗｗｗｗｗｗｗｗ
GitとJITの読み方


[Git](http://ja.wikipedia.org/wiki/Git)は「ギット」で、[JIT](http://ja.wikipedia.org/wiki/%E5%AE%9F%E8%A1%8C%E6%99%82%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9)は「ジット」のはず。

前者は言わずと知れたLinus Torvaldsが作った分散型バージョン管理システム。後者はJust-In-Timeの略で「実行時」とか訳される。

なので、GitHubは「ギットハブ」で、JIT Compilerは「ジットコンパイラー」になるのかな。
MongoDBでネストしたハッシュ(sub document)を検索する。

MongoDBでネストしたHash

```js
{"hoge":
   {"foo":"bar"}
}
```

のような構造で、'bar'の値を持つオブジェクトを検索したい場合、

```js
db.col.finid({"hoge.foo":"bar"})
```
と検索すれば良い。

ネストした構造を、
hoge.foo
のように、「.」でつなげば良いようだ。
Hubというツールを試してみた


ふとした拍子にHubというツールが有ることに気がついた。GitHubの作業を簡略化してくれるらしい。早速

```
$ brew install hub
```

でインストール。[ここ](http://hub.github.com/)に使用例があるのでそれを見ながらお試し。なお、そこで示されているように

```
$ alias git=hub
```
して使うのがお作法らしい。ちょっと気持ち悪いが、gitのコマンドはそのままパススルーし、hub特有のコマンドが追加されているという仕組みらしい。なので以下のgitコマンドは実際にはhubコマンドになる。
 
### 他のプロジェクトに貢献する開発者の典型的なパターン

既存リポをクローン。URLをフルパス表記する必要なし。楽チン。

```
$ git clone USER/REPO
```

Working copyに移ってブランチ作成。変更後にコミット

```
$ cd REPO
$ git checkout -b feature_branch
# (何かしら変更)
$ git commit -m "機能追加完了"
```
まぁ、ここまでは普通。私は何か変更を加えたいときは先にGitHub上でクローン（フォーク）し、そいつをローカルにクローンしてから変更するが、変更を加えて、あとからGitHub上でフォークしリモート追加でも良いと思う。いずれにしても面倒だ。

それがこのコマンド

```
$ git fork
```
一発で出来ちゃう。実際にはこのコマンドは

- GitHub上でフォーク
- フォークしたリポジトリを新たなリモートとして登録 (つまり `git remote add MY_NAME git://github.com/MY_NAME/REPO.git` )

しているっぽい。で、変更を自分のリモートリポにプッシュし

```
$ git push -u MY_NAME feature_branch
```

必要であれば、プルリクエストも送れる

```
$ git pull-request
```
なんか、お手軽だ。

### GitHubのページへコマンドラインからジャンプ
課題リスト表示やWikiの表示もコマンドラインからできる。

```
$ git browser USER/REPO issues
$ git browser UEER/REPO wiki
```
"USER/REPO"の代わりに"--"で今いるリポジトリの課題リストやWikiになる。

### おまけ

GitHub Enterpriseを使っている人は

```
$ git config --global --add hub.host my.example.org
```
と設定すればGHE向けにも使える。
AnacondaでPython3.3

AnacondaのサポートしているPythonのバージョンに3.3が含まれていたのでアップデートをしてみた。
やり方は公式に書いてある通りにやればいけた。

http://docs.continuum.io/conda/intro.html

## condaのアップデート

```shell-session
conda update conda
```
といきなりここ公式には書いてないけれど[こっち](http://www.walkingrandomly.com/?p=5089)で見つけた。これをやらないとアクティベートスクリプトがエラーを返してきてハマる。

## envをpython33に変更

```shell-session
 conda create -n py33 python=3.3 anaconda
```

しばらく時間かかる。

## PATHを通す

```shell-session
source ~/anaconda/bin/activate py33
```

## 使ってみる

```py3
(py33) ~
% python
Python 3.3.2 |Anaconda 1.7.0 (x86_64)| (default, Aug  5 2013, 15:07:24) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 
```

NLTKを使ってみる

```py3
>>> import nltk
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'nltk'
>>>
```

あれ。どうやらanacondaのpy33環境にはnltkが含まれていないっぽい。
一応[本家](http://nltk.org/nltk3-alpha/)はpython3.xをサポートし始めたみたいだけどまだalpha版。
anacondaリポジトリにはまだ組み込まれていないのか。残念。
ゴルーチンによるジョブワーカー


過去にQ4Mのようなメッセージキューサーバと通信するジョブワーカーを作った際、Pythonでプリフォーク式のデーモンとして実装したんだけど、シグナルの制御とかプロセスの管理とか面倒だなぁと思ってたところ、Goのゴルーチン使うともっと簡単に書ける気がしたので試しに書いてみた。

```go
package main
 
import (
        "runtime"
)
 
func worker(done chan bool) {
 
        // do something
 
        done <- true
}
 
func main() {
 
        n := runtime.NumCPU()
        runtime.GOMAXPROCS(n)
        done := make(chan bool)
 
        for i := 0; i < n; i++ {
                go worker(done)
        }
 
        for {   
                <-done
                go worker(done)
        }
 
}
```

ゴルーチンの本来の用途ではない気もするけど、これは使えそう。
MacでiPhone挿したときにWi-FiやLANを優先する

テザリングを有効にしたiPhoneをMacにつなぐと、LANやWi-Fiでつながっていたネットワーク接続がiPhone経由になってしまって「なんかiPhone挿したら遅くなった！」という目にあうことがありますが、じつはシステム環境設定でサービスの優先順を設定するとiPhoneをつないでもLANやWi-Fiを優先することができます。

設定方法は下記スクショを参照してください。

![set_service_order.png](https://qiita-image-store.s3.amazonaws.com/0/9676/90167d71-581f-2d16-1504-bd16908ed321.png)
SQL緊急救命室

[SQL緊急救命室](http://gihyo.jp/dev/serial/01/sql_lifesaving)

- [第1回　サブクエリ・パラノイア～副問い合わせ乱用による性能劣化を治療せよ！](http://gihyo.jp/dev/serial/01/sql_lifesaving/0001)
相関サブクエリは解にならない
なぜ自己結合はダメなのか～ディスクに触る者は不幸になる～
結合をなくせ！
長期的な視野を持て
行間比較でも結合は必要ない
おわりに～困難は分割するな～

- [第2回　冗長性症候群～条件分岐をUNIONで表現するなかれ](http://gihyo.jp/dev/serial/01/sql_lifesaving/0002)
UNIONで条件分岐するのは正しいか
集計における条件分岐
UNIONで分岐させるのは簡単だが…
集約結果に対する分岐もSELECT句で
手続き型と宣言型
終わりに

- [第3回　ループ依存症～手続き型の呪縛を打ち破れ！](http://gihyo.jp/dev/serial/01/sql_lifesaving/0003)
ループによる表現
SQLでループを置き換えるには
奇妙なサンドイッチ
相関サブクエリによる更新
ウィンドウ関数による更新
手続き型言語的な書き方～（ループ）を積極的に使う場合
SQLのみで記述する場合
トレードオフを考える

- [第4回　スーパーソルジャー病～すべての問題をやみくもにコーディングで解くべからず](http://gihyo.jp/dev/serial/01/sql_lifesaving/0004)
SQLで解く方法
モデル変更で解く方法
再び，SQLで解くなら
モデル変更で解く方法
初級者よりも中級者がご用心
データモデルを制す者はシステムを制す
戦術より戦略

- [第5回　時代錯誤症候群～進化し続けるSQLに取り残されるな！](http://gihyo.jp/dev/serial/01/sql_lifesaving/0005)
繰り返されるサブクエリ
共通表式
CASE式
言語の進化とエンジニアの進化
冗長さはコードをわかりにくくする
比較できるのは列だけではない

- [最終回　更新時合併症～冗長なサブクエリ，性能劣化，実装依存](http://gihyo.jp/dev/serial/01/sql_lifesaving/0006)
更新における冗長なサブクエリ
SET句は更新対象を制限しない
WHERE句で更新対象を制限する
SET句でウィンドウ関数を使えるか？
[javascript]気になる関数や言葉のまとめ


気になる関数 or 言葉をまとめる。自分メモ。
詳しくは後から調べることにして、とりあえず、列挙。

##console
https://developer.mozilla.org/en-US/docs/Web/API/console


####console.trace


##高階関数

##stackTrace.js
CentOS + nginx を入れて動かすまで @ Parallels Desktop 9 for mac


僕はコンシューマーとかスマホクライアント畑出身の人間です。
Webや言語など新しい領域を触る際の、備忘録的な使い方をしていこうと思います。

MBA + Windows7 で今更ながら優越感に浸っていましたが、 Parallels Desktop って別に Windows のためだけじゃないしVM1台で終わらせるの非常にもったいないなと思い立ち、まずはタイトルのような環境を作るに至る。
nginx は同僚が使っていたのを見て初めて知り、こないだ出たオライリー本も買ったので、試したくなり apache ではなくこちらを採用。

##環境
ホスト: MacBookAir MacOS 10.8
VM: Parallels Desktop 9 for mac

##CentOS 6.2 のインストール
[Parallels 上に CentOS 6.2 のセットアップ その1 - 仮想マシンの作成](http://haraki.jp/blog/blog.cgi?id=28)を参考に、isoを落としてきてインストール。
ユーザー名は`ogwmtnr`とした。
####sudoするには
`ogwmtnr`で
`sudo vi xxxx`
しようとしたらsudoerじゃないよ！って怒られたので、[一般ユーザーを_sudo_できるようにする](http://www.maruko2.com/mw/一般ユーザーを_sudo_できるようにする)を参考に
`ogwmtnr`をsudo許可ユーザーにする。
とりあえす、`su -`と入力後に`ogwmtnr`のパスワードを入力すればrootになれるので、その後`visudo`とタイプ。
ちなみに`vi`については、
`i`: 入力モード
`Esc`: 入力モードから脱出
`:w`: ファイル上書き
`:q`: viから脱出
だけとりあえず覚えておけば、最初のうちは何とかなる。
####`vi`で`:`が入力出来ないんだけど…
キーボードがUSになっていて`:`を押しても入力されない。
[E20: Mark not set](http://ameblo.jp/c33sr14/entry-11007550778.html)や[CentOS6 / sudoの設定の巻](http://www.sea-bird.org/pukiwiki/index.php?CentOS6%20%2F%20sudo%A4%CE%C0%DF%C4%EA%A4%CE%B4%AC)を参考にしました。
とりあえず`Shift+;`で`:`が入力できるので、それでしのぐ。
####`visudo`で`ogwmtnr`をsudoerにする
`root	ALL=(ALL) 	ALL`
と書かれている行の下に、
`ogwmtnr	ALL=(ALL) 	ALL`
と書いて保存すれば、まずは`sudo`が許可されるようになります。
[【Linux】"sudo -s"を禁止する方法](http://d.hatena.ne.jp/horus531/20110129/1296273325)によると、rootユーザーになってあれこれやるのはログが残らなかったりなど運用上の不都合が色々あるからできるだけsudoでやるべし。

##<s color="red">`yum update`は、まだやるな！
何も考えずやっておいたら、CentOSが起動しなくなりました。
動かないとか試せないとかいう状態でもないし、対策はまだ調べていないので、とりあえずupdateはかけないままにしておきましょう。

####追記
[ここ](http://qiita.com/ogwmtnr/items/02df4007d9fcfaa8c31e)を参考に`yum update`できますので、やっておきましょう。

##nginx のインストール
[CentOS6.x に yum で nginx をインストール](http://qiita.com/snaka/items/e5268b334f5d6685d80d)を参考にさせて頂きました。

```bash:
$ sudo rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
$ sudo yum install nginx
$ sudo service nginx start
$ sudo chkconfig nginx on
```

インストール、起動、更にOS起動時に自動的に起動するように設定。


##ホストのブラウザでアクセス
`ifconfig`コマンドを叩き、eth0のアドレス（以下例として127.0.0.2とする）を見たら、ホストのブラウザで
`http://127.0.0.2/`
へアクセスして、ページを表示しましょう。
#### ベージが表示されない場合
nginxのアクセスログやエラーログを見てみましょう。場所は設定ファイルである`/etc/nginx/nginx.conf`に書いてあります。
僕の場合、そもそもアクセスログに何も記載されていなかったので、ファイアウォールを疑いました。

##iptables を編集
[立ち上げ直後のiptablesを設定する。](http://qiita.com/shimohiko/items/ec672655edb84578a82e)を参考に。
既に`/etc/sysconfig/iptables`は存在しておりSSHポート(22)のみ許可されていたので、その行を直下にコピペしてHTTPポート(80)を追加した。
`sudo service iptables reload`で適応されるので、もう一度ホストからアクセスしてみよう。

##Welcome to nginx!
コングラッチュレーション…！

##感謝
参考にさせていただいたサイト管理人の皆様、誠にありがとうございました。
三角関数のその2


はい。
[http://qiita.com/clarinet758/items/b86dac3f63a6e6feb3e1](http://qiita.com/clarinet758/items/b86dac3f63a6e6feb3e1)
の続きとなります。

はい。三角関数は辺の比を見ていくんだそうです。
・3辺の比が決まれば角度も決まる。(相似の関係になる形の同じ三角形が無限に存在する)
・2つの角度が決まれば辺の比も決まる。(まぁ、内角の和は180°なので実際には全ての角度の大きさが決まったと言えたりしそうですが。。)

とりあえずは一番都合のいい形の直角三角形に絞って進めます。
![http://www.nowshika.com/joso/img10202116.png](http://www.nowshika.com/joso/img10202116.png)


図表とはやや別件で例題を
１　△ABCにおいて、AB＝５　BC＝３　∠A＝α　∠B＝９０℃のとき、　sinα　cosα　tanα　を求めよ ヒント）わからない辺の長さは、ピタゴラスの定理をつかって求める！！！
 補足）「sinα　cosα　tanα　を求めよ」ということを、「αの三角比を求めよ」　という場合もあります 

![http://www.nowshika.com/joso/img11020042.png](http://www.nowshika.com/joso/img11020042.png)

![http://www.nowshika.com/joso/img11020058.png](http://www.nowshika.com/joso/img11020058.png)

※ピタゴラスの定理(三平方の定理)
ああああ、適当な図が間違っているような。。。
(直角を挟む一辺)^2+(直角を挟むもう片方の辺)^2=斜辺^2

ということで、
3^2+5^2=まだ不明な斜辺^2
9+25=まだ不明な斜辺^2
√34=斜辺

ですね！
そして　sinα＝3/√34　cosα＝5/√34 　tanα＝3/5 　となりますね！

　じゃあ次にさっきの三角形で、残った角度をβとして、βの三角比を求めて

(多分、底辺と高さが入れ替わるというか、90°回して考えるような感じかと)
sinβ＝　5/√34 cosβ＝3/√34 　tanβ＝5/3 　となりますね！

そしてココで　sinα＝cosβ　cosα＝sinβ 　tanα＝1/tanβ（tanβ＝1/tanα） 　となっていますね！
はい。大雑把には一つ直角が決まっているのでα基準でみた三角形とβ基準で見た三角形は、直角を作っている辺同士がいれかわっただけということですね。

```memo
sin=高さ/斜辺　cos=底辺/斜辺　tan=高さ/底辺 
```

ただコレは基準とするトコロ変わればアレです。はい。

```memo
sinβ＝cosα　→　　　sin(90-α)＝cosα cosβ＝sinα　→　　cos(90-α)＝sinα tanβ＝1/tanα　→　　tan(90-α)=1/tanα 
```
はい、一つ直角が決まっているので残る内角合計は90°ですね。
なのでsin30° = cos(90°-30°) は同じ値の1/2になっていますね！

はい、また新たな問題をです。
　問題　以下の計算を解け 
前提：ただし、A＋B＝９０度　tanA＝2　とし、sinA＝０．５　とする 1 sinA+cosB 
2 tanB+cosB+sinA 3 tanB+cosB 注）「A＋B＝９０度　tanA＝2　とし、sinA＝０．５」 　これを満たす直角三角形があるかどうかは保証されていないが、解くことは出来るそうです。 

はい、何か適当な画像でもはさもうと思ったらありませんでした。
三角形があるどうかほしょうされないまま式を解くだけですね！
1 sinAとcosBは等しいので0.5+0.5で1
2 tanBはtanAの逆数で1/2+1で1.5
3tanB+cosBは1/2+0.5で1
※逆数から求めた1/2と、sinA=cosB=0.5の表記が混ざっているのは半ばわざとです

また終わらないので後日に続きます。。
第15回オフラインリアルタイムどう書く rubyで


オフラインリアルタイムどう書く
第15回(11月1日) http://atnd.org/events/43825
の、問題「異星の電光掲示板」
http://nabetani.sakura.ne.jp/hena/ord15elebubo/
の実装例。

rubyで。

他の言語などの解答例は
http://qiita.com/Nabetani/items/cba03c96d1ea55f6e861
から辿れます。

ちなみに16回
http://atnd.org/events/45016
も参加者募集中。

```ruby
def solve( src )
  t,b = src.split("/").map{ |i| ( "%032b" % i.to_i(16) ).chars }
  m=t.zip(b).map{ |i| i.join.to_i(2) }.join
    .gsub( "21", "201" )
    .gsub( "12", "102" )
  m.split( /0+/ ).map{ |i|
    { ""=>"", "31"=>"L", "32"=>"R", "13"=>"J", "232"=>"T",
      "313"=>"U", "323"=>"N", "132"=>"S", "231"=>"Z" }[ i ]  || ( raise i ) }.join
end

$stdout.sync=true

DATA.all? do |line|
  num, src, expected = line.split( /\s+/ )
  next true unless expected
  actual = solve( src )
  ok = actual==expected;
  puts "%s %s->%s ( %s )" % [ ok ? "ok" : "***NG***", src, actual, expected ]
  ok
end.tap{ |ok| p ok }

__END__
0 2ed8aeed/34b0ea5b LTRSUNTSJ 
1 00000200/00000300 L 
2 00018000/00010000 R
```

例によってテストデータの大半は省略。

で。
最初に書いた実装。

1. zip と to_i(2) なんかをつかって上段と下段を一緒くたにした文字列を作る。
1. L のすぐ後に T のようになった場合に文字の境目がわかりにくくなるので、そういう場合にゼロを挟む。
1. 1個以上のゼロで split して、パターンと文字の対応表を引く

で完成。

今見ると、split して map するより gsub が良かったかも。
Vagrantでホストマシーンとクライアントマシーンの時間を同期させない方法

下記をVagrantファイルに追記

```ruby:Vagrant
config.vm.provider :virtualbox do |vb|
  vb.customize ["setextradata", :id, "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled", 1]
end 
```
第15回オフラインリアルタイムどう書くの参考問題をPythonで

詳しくはこちら。
http://qiita.com/Nabetani/items/0b56395d4c9e7c64b230
saihon2013 さんのC言語実装を参考にさせてもらいました。

```py
def search(text, left, right, match):
    longer = match
    for l in xrange(left, len(text)):
        for r in xrange(right, l-1, -1):
            if text[l] == text[r]:
                m = search(text, l+1, r-1, match + (1 if l==r else 2))
                if m > longer: longer = m
                break
    return longer

def solve(text):
    return search(text, 0, len(text)-1, 0)

def test(text, answer):
    result = solve(text)
    print 'OK' if result==int(answer) else "NG", result, answer, text

if __name__ == '__main__':
    0, test( "I_believe_you_can_solve", "9" );
    1, test( "a", "1" );
    2, test( "aa", "2" );
    3, test( "aaa", "3" );
    4, test( "ab", "1" );
    5, test( "aabb", "2" );
    6, test( "ABBA", "4" );
    7, test( "Abba", "2" );
    8, test( "1234567890", "1" );
    9, test( "1234567890987654321", "19" );
    10, test( "abcdcba", "7" );
    11, test( "0a1b2c3d4c5b6a7", "7" );
    12, test( "abcdcba0123210", "7" );
    13, test( "abcdcba_123210", "7" );
    14, test( "_bcdcba0123210", "7" );
    15, test( "abcddcba0123210", "8" );
    16, test( "abcdcba01233210", "8" );
    17, test( "a0bc1dc2ba3210a", "9" );
    18, test( "a0bc1ddc2ba3210", "8" );
    19, test( "3a0bc1ddc2ba3210", "10" );
    20, test( "11oooo1111o1oo1o111ooooooooooo", "20" );
    21, test( "11o1111o1111oo11ooo11111ooo1oo", "20" );
    22, test( "111111oo11o111ooo1o1ooo11ooo1o", "21" );
    23, test( "11o1o1o11oo11o11oo111o1o1o11oo", "27" );
    24, test( "oo111o1o11o1oo1ooo11o1o11o1o1o", "27" );
    25, test( "1o1oo11111o1o1oo1o1o1111oo1o1o", "28" );
    26, test( "QQooooQooooQQyQoyQQQyyyyQQoyoy", "15" );
    27, test( "oQoooQooooQyoyQoyoyyyQQyQQQQoQ", "16" );
    28, test( "yyyyyooyQyyyoyyQyyooyQoQoQQoQy", "17" );
    29, test( "yyQoyQoyyQyQQoyooooyyQQyQyooQy", "24" );
    30, test( "oQQooQoQyQQoyoQQoQyQyQyQoQoooo", "24" );
    31, test( "oQQyQQyyQyQQoooyQQyyyQQQyyQQoy", "25" );
    32, test( "WAk9iHI4jVDlStyudwTNqE138kwan2", "3" );
    33, test( "c43fIu1Mlz0K9hEVOgGcUdbeB5ksa7", "3" );
    34, test( "CAbYcW5VqHjzFdIkH_61PM0TsyRuie", "3" );
    35, test( "jInQnUvSayrJTsQWujovbbqW0STvoj", "10" );
    36, test( "iZDrvpUKgtj3FrZsZ4CLjrEgUdZzQG", "11" );
    37, test( "ROgYUOu6er_DA7nB6UGquO1GUHC62R", "11" );
    38, test( "Oh_be_a_fine_girl_kiss_me", "9" );
    39, test( "8086_6502_6809_Z80", "11" );
    40, test( "xcode_visualstudio_eclipse", "11" );
    41, test( "word_excel_powerpoint_outlook", "9" );
    42, test( "abcdefghijklmnopqrstuvwxyz0123", "1" );
```
Applicationクラスを使ってObserverパターンを実装する

Observerパターンは、オブジェクトの状態を観測(observe)して、何か変更があったら任意の動作をするデザインパターンの一つです。

Androidではデータの変更を観測するのにContentObserverが用意されています。

この記事では独自のObserverパターンをApplicationクラスを使って実装します。

使い道はContentProviderを使ってない時のデータ変更の観測とか、アプリ内の設定変更の観測とかに使えると思います。

まずは独自のObserverインタフェースを実装します。

```java:Observer.java
public interface Observer {
    void notify();
}
```

次にApplicationクラスを継承して独自のMyAppクラスを作ります。

MyAppのstatic変数を使うことで、アクティビティのライフサイクルに影響を受けずに値を保持し続けることができます。
またstaticメソッドを用意することで、アプリ内のどこからでもアクセスすることができます。


```java:MyApp.java
public class MyApp extends Application {
    private static List<Observer> sObservers = new CopyOnWriteArrayList<Observer>();
    
    public static void notifyObservers() {
        for (Observer observer : Observers) {
            observer.notify();
        }
    }
    
    public static void addObserver(Observer observer) {
        sObservers.add(observer);
    }
    
    public static void removeObserver(Observer observer) {
        sObservers.remove(observer);
    }
}
```

CopyOnWriteArrayListは同期化不要なリストです。
[同期化不要なCopyOnWriteArrayListを使え](http://d.hatena.ne.jp/j5ik2o/20090813/1250118023)の記事が詳しいです。

次に、変更したときを観測して任意の処理をしたいActivityやFragmemtでObserverを実装します。
ライフサイクルメソッドのonResumeやonPauseでObserverの登録、削除をしています。

```java:MyActivity.java
public class MyActivity extends Activity {

    private Observer mObserver = new Observer() {
        @Override
        public void notify() {
            // Viewの更新などの任意の動作
        }
    };

    @Override
    protected void onResume() {
        super.onResume();
        
        // Observerの登録
        MyApp.addObserver(mObserver);
    }
    
    @Override
    protected void onPause() {
        super.onPause();

        // Observerの削除
        MyApp.removeObserver(mObserver);
    }
}
```

後はデータの変更や、設定の変更をしたときに

```java
MyApp.notifyObservers()
```

を呼べば、任意の処理が走ります。
counter_cacheがインクリメントされない

counter_cacheがコントローラー内で

`hoge << @fuga`

とやるとインクリメントのところだけ反映されなかった。

`Model.reset_counters(ins.id, :counters) `

で対応。

[こちら](http://stackoverflow.com/questions/17583163/why-is-counter-cache-column-not-increasing-when-an-association)に色々と書いてあった。
ローカルスコープの変数がスコープを抜ける前にガベージコレクションされる

次のコードは所謂多重起動の防止のためにミューテックスを使う例ですが、リリースビルドだと意図通りに動かないことがあります。

```csharp
using System;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            bool ok;
            Mutex mutex = new Mutex(true, "OreOre", out ok);

            if (ok)
            {
                Console.WriteLine("process ok");
            }
            else
            {
                Console.WriteLine("process duplicate");
            }

            GC.Collect();

            Console.ReadKey();
        }
    }
}
```

`GC.Collect` がミューテックスを解放してしまうからですが、mutex 変数が Main のスコープにあるので Main を抜けるまでは GC されないように思いますが・・・

---

もっと判りやすいのが↓これ。hoge のファイナライザがスコープを抜ける前に呼ばれます。

```csharp
using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var hoge = new Hoge();
            GC.Collect();
            Console.ReadKey();
        }
    }

    class Hoge
    {
        ~Hoge()
        {
            Console.WriteLine("Hoge Finalize");
        }
    }
}
```

最適化によって次のように書き換えられるためだと思われます。

```diff
-var hoge = new Hoge();
+new Hoge();
```
第一回 オフラインリアルタイムどう書くの参考問題の解答例をPythonで書いてみた

問題内容等についてはこちら。
http://qiita.com/Nabetani/items/cbc3af152ee3f50a822f

rubyの実装を参考にpythonで書きました。
ランクを表す文字列が10以外は1文字なので、まずは10を1文字の'T'に置き換え、1文字置きに並んだランク文字のみを取り出してrankとします。
次に、set関数でランク文字の種類を抽出し、それぞれのランクが何個あるかをcountで調べたpairを作ります。
最後に、pairをソートして数値化し、あらかじめ作っておいた辞書を引いて答を探します。

```py
def solve(text):
    rank = text.replace('10','T')[1::2]
    pair = [rank.count(x) for x in set(rank)]
    key = reduce(lambda a,b: a*10+b, sorted(pair))
    return {14:'4K', 23:'FH', 113:'3K', 122:'2P', 1112:'1P', 11111:'--'}[key]

def test(text, answer):
    result = solve(text)
    print 'OK' if result == answer else 'NG', result, answer, text

if __name__ == '__main__':
    test('D3C3C10D10S3', 'FH')
    test('S8D10HJS10CJ', '2P')
    test('DASAD10CAHA', '4K')
    test('S10HJDJCJSJ', '4K')
    test('S10HAD10DAC10', 'FH')
    test('HJDJC3SJS3', 'FH')
    test('S3S4H3D3DA', '3K')
    test('S2HADKCKSK', '3K')
    test('SASJDACJS10', '2P')
    test('S2S10H10HKD2', '2P')
    test('CKH10D10H3HJ', '1P')
    test('C3D3S10SKS2', '1P')
    test('S3SJDAC10SQ', '--')
    test('C3C9SAS10D2', '--')
```
Emacs の `web-mode` の黄色が見にくいので色を濃くした。

web-modeはすごく便利なんだけど、背景色が白だと黄色が見づらいので濃くしました。

## やりかた。

1. 文字の上で `describe-char` したら詳細が出てくるのでそこで `face`の名前を調べる。

2. `web-mode-symbol-face` という名前だとわかったので

```el:~/emacs.d/inits/30-web.el
(set-face-attribute 'web-mode-symbol-face nil :foreground "#FF7400")
```

というふうに書く。

後はEmacsを再起動するから `M-x web-mode`と打ってモードを再読込すると色が変わる。
目が痛くないってステキ！！

## 参考

How to change a specify color in a major mode with Emacs - Stack Overflow
http://stackoverflow.com/questions/19721718/how-to-change-a-specify-color-in-a-major-mode-with-emacs/19723102?noredirect=1#19723102
list表示オプションのトグルアラカルト

はじめに
==============
仕事やプライベートでコードを書くことが多いのだが
最近では特に「タブ文字」が嫌いな傾向にある。
人によってタブの文字幅がバラバラであることもあって
修正したり追加したりする際に不規則なインデントを見ることになり
何となく気分がもにょるのである。
自分一人のプロジェクトであれば半角スペースのみのインデントで書くのだが
他のメンバーと共有するとなると郷に入っては郷に従うしかない。
そんな折、手元のvimの設定は「タブ文字可視」となっている。
これでは仕事中もにょりすぎるので表示のトグルを考えてみることにした。

対処
==============
**1.トグルキーを用意する。**
気になった時だけList表示オプションを切り替えるように
ファンクションをvimrcに定義した。
とりあえず F3 キーを押すことでいつでも表示の ON/OFF が出来る。
表示中なら非表示に。非表示中なら表示に。

```toggle
map <silent> <F3> :call ToggleListChar()<CR>
function ToggleListChar()
  if &list
    set nolist
  else
    set list
  endif
endfunction
```

> <追記>thinca さんにコメントで簡単なトグル方法を教えてもらったので。
> ファンクションが不要になる分すっきり。

```toggle
map <silent> <F3> :set list!<CR>
```

**2.自動コマンドを設定する。**
また、いちいち確認しながら作業するのが面倒だという場合に備えて
自動コマンドもvimrcに設定しておく。
挿入モードに入った際にはタブ文字などリスト文字が見えるように。
ノーマルモードに戻った際はまた元の不可視状態へ戻る。

```autocmd
"挿入モードの ON/OFF でListのトグル
autocmd InsertEnter * set list
autocmd InsertLeave * set nolist
```

とりあえずこれで幸せになれそうな気がする。
第15回オフラインリアルタイムどう書くの問題をpythonで解いてみた

問題内容等についてはこちら。
http://qiita.com/Nabetani/items/cba03c96d1ea55f6e861

事前にいくつかの過去問題に挑戦していたおかげで、辞書を作るのがいいだろうとすぐに思いつき、電光文字のドットパターンの黒(点灯)を1、白(消灯)を0として上段と下段を並べたのをキーとし、文字を値として辞書を作りました。
入力された16進数文字列を32文字の2進数文字列に変換し、上段と下段の先頭から数文字ずつ取り出して辞書を引きます。
ただし、取り出す文字数に注意する必要がありました。上下3ドットずつの’U'のドットパターンがあったとき、上下2ドットずつを取り出して辞書を引いてしまうと'L'のドットパタンと一致してしまいます。ですので、最初に3ドットパターンか調べ、次に2ドットパターンか調べ、最後にどれにもヒットしない場合には区切りの1ドットパターン(00)かを調べるようにしました。

```py
parts = {'1011':'L', '1110':'R', '0111':'J', '111010':'T', '101111':'U',
         '111101':'N', '011110':'S', '110011':'Z', '00':'' }

def solve(text):
    upper, lower = (format(int(t,16),'032b') for t in text.split('/'))
    answer = ''
    while len(upper) > 0:
        for n in xrange(3, 0, -1):
            part = upper[:n] + lower[:n]
            if part in parts:
                answer += parts[part]
                upper, lower = upper[n:], lower[n:]
                break
    return answer

def test(text, answer):
    result = solve(text)
    print '%s\t%s\t%s' % ('OK' if result == answer else 'NG', text, result)

if __name__ == '__main__':
    0, test( "2ed8aeed/34b0ea5b", "LTRSUNTSJ" );
    1, test( "00000200/00000300", "L" );
    2, test( "00018000/00010000", "R" );
    3, test( "00002000/00006000", "J" );
    4, test( "00000700/00000200", "T" );
    5, test( "01400000/01c00000", "U" );
    6, test( "00003800/00002800", "N" );
    7, test( "000c0000/00180000", "S" );
    8, test( "00003000/00001800", "Z" );
    9, test( "132eae6c/1a64eac6", "LRJTUNSZ" );
    10, test( "637572d0/36572698", "ZSNUTJRL" );
    11, test( "baddb607/d66b6c05", "LTJZTSSSN" );
    12, test( "db74cd75/6dac6b57", "ZZZTJZRJNU" );
    13, test( "3606c2e8/1b0d8358", "ZZSSLTJ" );
    14, test( "ad98c306/e6cc6183", "UZZZZZZ" );
    15, test( "4a4aaee3/db6eeaa6", "JJLLUUNNS" );
    16, test( "ecd9bbb6/598cd124", "TSSZZTTRR" );
    17, test( "e0000002/40000003", "TL" );
    18, test( "a0000007/e0000005", "UN" );
    19, test( "c0000003/80000006", "RS" );
    20, test( "40000006/c0000003", "JZ" );
    21, test( "01da94db/00b3b6b2", "TSUJLRSR" );
    22, test( "76eeaaea/24aaeeae", "TRNNUUNU" );
    23, test( "1dacaeee/1566e444", "NRJZUTTT" );
    24, test( "26c9ac60/6c6d66c0", "JSZLRJZS" );
    25, test( "6c977620/36da5360", "ZZLLTNZJ" );
    26, test( "069aeae6/0db34eac", "SJSLTUNS" );
    27, test( "06d53724/049da56c", "RRULRNJJ" );
    28, test( "069b58b0/04d66da0", "RLRSLZJR" );
    29, test( "1b6eced4/11b46a9c", "RZZTZNRU" );
    30, test( "522e8b80/db6ad900", "JLLJNLJT" );
    31, test( "6546cdd0/376c6898", "ZULSZRTL" );
    32, test( "4e6d5b70/6ad9d620", "LNSSURST" );
    33, test( "37367772/65635256", "SNSZNTNJ" );
    34, test( "25535d58/377669cc", "LUUSLTUZ" );
    35, test( "0ae6a55d/0eacedcb", "UNSUJUTJ" );
    36, test( "76762edc/23536a88", "TZNZJNRT" );
```
勉強用にrails4インストール済みのbox作った (ubuntu13.10)

[前回](http://qiita.com/tukiyo/items/d4d666959808b1794a3e)作ったboxを元に[インストール手順](http://gorails.com/setup/ubuntu/13.10)の通りインストールし、画面が表示されました。
インストールにちょっと時間がかかったのでbox化しときます。

ダウンロード
==========
[Saucy64_rails4_VirtualBox4.3.box 787MB](https://www.dropbox.com/s/6rd862p91f95jro/Saucy64_rails4_VirtualBox4.3.box)

box名をsaucyとする。

```bash:box作り方メモ
$ vagrant init saucy
$ vim Vagrantfile で、以下記入
config.vm.network :forwarded_port, guest: 3000, host: 3000
$ vagrant up
# ここでrails4のインストールを行った。
$ vagrant halt
$ vagrant package (今の状態でpackage.boxを作成)
```

rails4インストール手順
====================

ruby2.0
---------

```bash:必須パッケージインストール
$ sudo apt-get update
$ sudo apt-get install -y git-core curl zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev
```

```bash:rvmでのインストール
$ sudo apt-get install -y libgdbm-dev libncurses5-dev automake libtool bison libffi-dev
$ curl -L https://get.rvm.io | bash -s stable
$ source ~/.rvm/scripts/rvm
$ rvm install 2.0.0-p247
$ rvm use 2.0.0-p247 --default
$ ruby -v
$ echo "gem: --no-ri --no-rdoc" > ~/.gemrc
```

```bash:gitの設定
$ git config --global color.ui true
$ git config --global user.name "tukiyo"
$ git config --global user.email "tukiyo3@gmail.com"
$ ssh-keygen -t rsa -C "tukiyo3@gmail.com"
# https://github.com/settings/ssh にアクセスしてid_rsa.pubの中身を貼り付ける。
$ ssh -T git@github.com
```

rails4
-------

```bash:
$ sudo add-apt-repository ppa:chris-lea/node.js
$ sudo apt-get update
$ sudo apt-get install -y nodejs
$ gem install rails
$ rails -v
```

mysql
---------

```bash:
$ sudo apt-get install -y mysql-server mysql-client libmysqlclient-dev
```

動作確認
-----------

```bash:
$ mkdir local && cd local
$ rails new myapp -d mysql
$ cd myapp
$ rake db:create
$ rails server
```

http://localhost:3000 にアクセス。

次すること
========
[dotinstall](http://dotinstall.com/lessons/basic_rails_v2)でrails4の勉強
Lanica Platino を使ってみる（タッチイベント）

[セットアップ]("http://qiita.com/tkyaji/items/07b354c34812fae6f65b")が終わり、Platinoが動くようになったので、少しいじってみる。
画面に赤い四角が表示されている状態なので、このSpriteにタッチイベントを付けることにする。

#Spriteにタッチイベント

「Platino.ruble」で作成されたプロジェクトの中を見ると、以下の３つのJSファイルができている。
* app.js
* ApplicationWindow.js
* HomeScene.js

###app.js
アプリを実行すると最初に呼ばれる、Titaniumのいつものやつ。特に変更しない。

###ApplicationWindow.js
Platinoの基本設定周りを記述するJSっぽい。FPSとか画面サイズとか諸々を設定できそう。
必要に応じて変更する必要がありそうだが、とりあえずそのまま。

###HomeScene.js
最初のシーンとなるファイル。ApplicationWindow.jsから呼ばれている。今回はこれを変更。


---


さて、HomeScene.jsの中を見てみると、赤い四角はcreateSpriteで作成しているっぽい。

```js:HomeScene.js
red = platino.createSprite({
    width: 64,
    height: 64
});
```

[API DocumentでSpriteの項目](http://docs.lanica.co/docs/#!/api/Sprite"Sprite")を見てみると、なんかtouch系のイベント（touchend, touchmove, touchstart）がありそうなのでやってみる。

```js:HomeScene.js
red.addEventListener("touchstart", function(e) {
    Ti.API.info("red " + e.type + " : x=" + e.x + "y=" + e.y);
});
```

…なんかダメっぽい。改めて[サンプル](http://lanica.co/samples/ "Platino Sample")を参考にしてみる。
[Events Sample Code](https://github.com/Lanica/Platform/tree/master/platino/Engine/Events)っていうのを見てみると、どうも直接Spriteにtouchイベントを付けられないみたい。

gameViewにtouchイベントを付ける必要がありそうなので、以下のように修正

```js:HomeScene.js
red.addEventListener("touchstart", function(e) {
    Ti.API.info("red " + e.type + " : x=" + e.x + "y=" + e.y);
});

game._touches = {
    red : red
};
game.addEventListener("touchstart", function(e) {
    if (this._touches.red.contains(e.x, e.y)) {
        this._touches.red.fireEvent(e.type, e);
    }
});
```

[参考にしたソース] (https://github.com/Lanica/Platform/blob/master/platino/Engine/Events/Resources/MainScene.js)


以上
第15回オフラインリアルタイムどう書くの問題をrubyで解く



問題はこちら。
http://nabetani.sakura.ne.jp/hena/ord15elebubo/

```rb
DAT=<<EOD
0	2ed8aeed/34b0ea5b	LTRSUNTSJ	
1	00000200/00000300	L	
2	00018000/00010000	R	
EOD

PAT=[
  ["00", ""],
  ["101110", "T"],
  ["110111", "U"],
  ["111011", "N"],
  ["011110", "S"],
  ["101101", "Z"],
  ["1101", "L"],
  ["1110", "R"],
  ["0111", "J"],
]

def solve(q)
  ans = ""
  up, lw = q.split('/').map{|e| "%032b"%e.to_i(16)}
  s = up.chars.zip(lw.chars).flatten.join
  while s.size > 0
    PAT.each {|pat, ch|
      if s.index(pat) == 0
        ans += ch
        s = s[pat.size..-1]
        break
      end
    }
  end
  ans
end

DAT.split("\n").each do |line|
  no,q,a = line.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans
  puts ans == a ? ' o' : ' x'
end
```
led.c

問題はこちら
http://nabetani.sakura.ne.jp/hena/ord15elebubo/

他の解答例はこちら
http://qiita.com/Nabetani/items/cba03c96d1ea55f6e861

```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void solve(const char* in, char* buf)
{
	int cnt = 0;
	const char t[9] = "ZSNUTJRL";
	const unsigned int t1[8] = {0x6,0x3,0x7,0x5,0x7,0x1,0x3,0x2};
	const unsigned int t2[8] = {0x3,0x6,0x5,0x7,0x2,0x3,0x2,0x3};
	unsigned long n1 = strtoul(in, NULL, 16);
	unsigned long n2 = strtoul(&in[9], NULL, 16);

	while(n1 || n2) {
		if((n1 & 0x1) || (n2 & 0x1)) {
			for(int j = 0; j < 8; j++) {
				const int c = ((j>=5) ? 2: 3);
				int i;
				for(i = 0; i < c; i++) {
					if(((t1[j]>>i)&0x1) != ((n1>>i)&0x1)
					|| ((t2[j]>>i)&0x1) != ((n2>>i)&0x1) ) {
						break;
					}
				}
				if(i == c) {
					buf[cnt] = t[j];
					cnt++;
					n1>>=c;
					n2>>=c;
					break;
				}
			}
		} else {
			n1>>=1;
			n2>>=1;
		}
	}
}

void exchange(const char* s, char* buf)
{
	for(int i = 0; i<strlen(s); i++) {
		buf[strlen(s)-i-1] = s[i];
	}
}

void test(const char* in, const char* a)
{
	char buf[20] = {0}, buf2[20] = {0};
	solve(in, buf);
	exchange(buf, buf2);
	printf("%s\t%s\n",buf2, (strcmp(buf2,a)==0) ? "ok": "****NG****");
}

int main()
{
/*0*/ test( "2ed8aeed/34b0ea5b", "LTRSUNTSJ" );    
/*1*/ test( "00000200/00000300", "L" );    
/*2*/ test( "00018000/00010000", "R" );    
/*3*/ test( "00002000/00006000", "J" );    
/*4*/ test( "00000700/00000200", "T" );    
/*5*/ test( "01400000/01c00000", "U" );    
/*6*/ test( "00003800/00002800", "N" );    
/*7*/ test( "000c0000/00180000", "S" );    
/*8*/ test( "00003000/00001800", "Z" );    
/*9*/ test( "132eae6c/1a64eac6", "LRJTUNSZ" );    
/*10*/ test( "637572d0/36572698", "ZSNUTJRL" );    
/*11*/ test( "baddb607/d66b6c05", "LTJZTSSSN" );    
/*12*/ test( "db74cd75/6dac6b57", "ZZZTJZRJNU" );    
/*13*/ test( "3606c2e8/1b0d8358", "ZZSSLTJ" );    
/*14*/ test( "ad98c306/e6cc6183", "UZZZZZZ" );    
/*15*/ test( "4a4aaee3/db6eeaa6", "JJLLUUNNS" );    
/*16*/ test( "ecd9bbb6/598cd124", "TSSZZTTRR" );    
/*17*/ test( "e0000002/40000003", "TL" );    
/*18*/ test( "a0000007/e0000005", "UN" );    
/*19*/ test( "c0000003/80000006", "RS" );    
/*20*/ test( "40000006/c0000003", "JZ" );    
/*21*/ test( "01da94db/00b3b6b2", "TSUJLRSR" );    
/*22*/ test( "76eeaaea/24aaeeae", "TRNNUUNU" );    
/*23*/ test( "1dacaeee/1566e444", "NRJZUTTT" );    
/*24*/ test( "26c9ac60/6c6d66c0", "JSZLRJZS" );    
/*25*/ test( "6c977620/36da5360", "ZZLLTNZJ" );    
/*26*/ test( "069aeae6/0db34eac", "SJSLTUNS" );    
/*27*/ test( "06d53724/049da56c", "RRULRNJJ" );    
/*28*/ test( "069b58b0/04d66da0", "RLRSLZJR" );    
/*29*/ test( "1b6eced4/11b46a9c", "RZZTZNRU" );    
/*30*/ test( "522e8b80/db6ad900", "JLLJNLJT" );    
/*31*/ test( "6546cdd0/376c6898", "ZULSZRTL" );    
/*32*/ test( "4e6d5b70/6ad9d620", "LNSSURST" );    
/*33*/ test( "37367772/65635256", "SNSZNTNJ" );    
/*34*/ test( "25535d58/377669cc", "LUUSLTUZ" );    
/*35*/ test( "0ae6a55d/0eacedcb", "UNSUJUTJ" );    
/*36*/ test( "76762edc/23536a88", "TZNZJNRT" );  
	return 0;
}

```
Lanica Platino を使ってみる（セットアップ）

ゲーム開発に特化したTitaniumモジュール「Lanica Platino」を使ってみた。


##セットアップ
セットアップ手順。なお、以下はMacの場合なので、Windowsの場合はパスが異なる。

1. Titaniumをインストール
[Titanium Mobile本体](http://www.appcelerator.com/titanium/ "Titanium")をダウンロードしてインストールする
バージョンが古い場合はアップデートしておくこと

1. Platinoモジュールをインストール
[Lanicaのサイト](http://lanica.co/ "Platino")から、フリーのトライアル版のPlatinoをダウンロードする。（アカウント登録が必要）
ダウンロードしたら、展開してできたzipファイルを「~/Library/Application Support/Titanium」直下に配置

1. Platino開発用のテンプレートをダウンロード
[Platino.ruble](https://github.com/Lanica/Platino.ruble/releases/ "Platino.ruble")の最新版をダウンロードする。
展開した「Platino.ruble」ディレクトリを「~/Documents/Aptana Rubles」に入れる

1. Titanium起動

1. プロジェクトを作成
File -> New -> Mobile Project を選択すると、「Lanica Platino」が出ているはずなので、この中の「Platino Application」を選択してプロジェクト作成

![platino1.jpg](https://qiita-image-store.s3.amazonaws.com/0/19872/36c4c6b3-7a06-ed58-c90e-9caa7adc4452.jpeg)

1. Platinoモジュールの読み込み設定
tiapp.xmlの、&lt;modules/&gt;の部分を以下に書き換える

```xml:tiapp.xml
    <modules>
        <module platform="android">co.lanica.platino</module>
        <module platform="iphone">co.lanica.platino</module>
    </modules>
```

これでセットアップ完了。起動してみると以下のような画面が表示されるはず

![platino_start.jpg](https://qiita-image-store.s3.amazonaws.com/0/19872/ea47e73b-e3b6-dbb8-d1a8-2298f8e35216.jpeg)
xinput enable と xinput disable が Ubuntu 12.04 では存在しなかった

```bash
xinput disable "Hogehoge Device Name"
```

みたいに書いてた ShellScript が Ubuntu 12.04 で動かなかった．xinput のバージョンはどうやら使えない方が 1.5.99.1 で使える方が 1.6.0 らしい．なんと微妙な．

1.5.99.1 (Ubuntu 12.04 の方) では

```bash
xinput set-int-prop "Hogehoge Device Name" "Device Enabled" 8 0
```

で無効に出来る．有効にするには最後の `0` を `1` にする．

## References

* http://qiita.com/ka_/items/47f12dd17780e33155a7
* http://blog.yjl.im/2010/12/using-xinput-to-disable-keyboard-mouse.html
tex2imgを使って、LaTeXで書いた数式を画像に変換する例


<a href="http://island.geocities.jp/loveinequality/">TeX2img</a>を使ってLaTeXで書いた数式を画像に変換してみました。

まず、LaTeXのファイルを用意します(ker.tex)。

```tex:ker.tex
\documentclass{jsarticle}
\usepackage{amsmath}
\pagestyle{empty}
\begin{document}

\section*{問題}
線形写像~$f$に対し、
\[
\text{$f$~が単射である} \Leftrightarrow \ker(f)=\{0\}
\]
を証明せよ。

\section*{解答}

1.~$\Rightarrow$の対偶を示す。

$f$~が線型写像なら$\ker(f) \ni 0$なので、$\ker(f)$に属する$0$~以外の元の存在を仮定し、それを$a$とする。
このとき、$a \neq 0$かつ$f(a)=f(0)=0$なので$f$~は単射ではない。

\medskip

2.~$\Leftarrow$を背理法で示す。

$\ker(f)=\{0\}$かつ$f$は単射ではないと仮定する。
$f$~は単射でないので$a \neq b$かつ$f(a)=f(b)$という$a,b$が存在する。
$f$~は線型写像だから$f(a)-f(b)=f(a-b)$となり、$f(a)=f(b)$から$f(a-b)=0$~がいえる。
$f(a-b)=0$と$\ker(f)=\{0\}$から$a-b=0$がいえるが、これは$a \neq b$と矛盾する。

\medskip

以上1.と2.により、$\text{線型写像~$f$が単射である}\Leftrightarrow \ker(f)=\{0\}$が示された。\rule{5pt}{10pt}
\end{document}
```

次に、コマンドラインから以下のように入力します（$はプロンプト。実際には全体を一行で）。

```
$ tex2img
    --kanji utf8 
    --left-margin 50
    --right-margin 50
    --top-margin 50
    --bottom-margin 50
    ker.tex ker.png
```
このようにしてできたker.pngはこんな感じになります。
<img width="100%" src="http://cdn-ak.f.st-hatena.com/images/fotolife/h/hyuki/20131101/20131101113326_original.png" />

普通にPDFファイルを作るには、以下のように入力します。

```
$ platex ker.tex
$ dvipdfmx ker.dvi
```
これでker.pdfができます。
[MySQL] 外部キー制約作成時、ERROR 1005 (HY000): Can't create table 


##概要
外部キー制約を付けたテーブル作成時、以下のエラーが発生した

```
ERROR 1005 (HY000): Can't create table 'table_name' (errno: 150)
```
このメッセージがあまり親切でなく、原因には色々な可能性が考えられる。

##あり得る原因たち

1. 対象カラムにINDEXが張られていない（対象がPRIMARY KEYでない場合）

1. 参照先、参照元のどちらかがInnoDBでない

1. 参照元のカラムと参照先のカラムの型が異なる

1. 参照先カラムにデフォルト値をセットしている

1. ON DELETE SET NULLを指定しているが参照先がNOT NULL

1. その他何らかの構文エラーがある
（なぜかSyntax Errorではなく、Can’t create tableが出る）

今回は3、片方のみにunsignedを指定していたためのエラーでした。

##参考
MySQLでCan’t create table(errno: 150)
http://fizsoft.net/archives/300
第15回オフラインリアルタイムどう書くの問題


オフラインでリアルタイムに「どう書く」をやるイベント( http://atnd.org/events/43825 )を行っています。

問題は「異星の電光掲示板」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/ord15elebubo/
です。

※ Safari, Firefox on Mac ではちゃんと出るんですが、Chrome と Opera では若干レイアウトが崩れるようです。すいません。
※ IEでは確認していません。

[追記開始]
ciel さんのおかげで、Chrome と Opera でのレイアウト崩れは治りました。
依然として IE では確認していません。
[追記終了]


実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。
iOS7で動的にステータスバーを消すとviewが移動してしまう


## 結論

UIViewControllerのautomaticallyAdjustsScrollViewInsetsプロパティをNOにして解決した。

追記：iOS7のナビゲーションバーやステータスバーについては下記内容が包括的
http://qiita.com/yimajo/items/254c7cebab7864678246

## 説明

iOS7になってステータスバーの取り扱いが変わったため、画像のフルスクリーン時にステータスバーを表示/非表示の切り替えをするのにしばらくやり方が分からなかった。

次の3つの条件が揃っていたので嵌ってしまった。

- ステータスバーを動的に非表示非表示を繰り返す
- ナビゲーションバーを表示する

何も考えず、動的ににステータスバーを非表示にした場合、次のように中央においているつもりの画像用Viewがステータスバーぶん上にずれる。

左がステータスバー有り。右がステータスバーを非表示にした。

![yes_st_on_of.jpeg](https://qiita-image-store.s3.amazonaws.com/0/16400/7422d662-310e-12e1-2a4f-8fdecb4fffc1.jpeg "yes_st_on_of.jpeg")

左右共に、青いViewの開始位置はナビゲーションバーに潜り込んでおらず、ナビゲーションバーがステータスバーのY位置下に配置されているため、ステータスバーを消すとナビゲーションバーと共にViewが移動してしまう。

原因は、iOS7からナビゲーションバーに配慮してViewのinsetsを自動で設定されるためらしい。

これをステータスバーやナビゲーションバーを無視するようにして表示非表示を切り替えても違和感なくするためにViewControllerのプロパティautomaticallyAdjustsScrollViewInsetsをNOにすることで解決。

![no_st_on_of.jpg](https://qiita-image-store.s3.amazonaws.com/0/16400/90ef21af-fb7a-dc4b-264b-c1ac90451128.jpeg "no_st_on_of.jpg")


インターフェースビルダー上にAdjust Scroll View Insetsのチェックボックスがあるのでこれをチェック外してもいい。自動でスクロールバーのInsetsを調整するフラグだと憶えておこう。

![スクリーンショット 2013-11-01 18.42.55.png](https://qiita-image-store.s3.amazonaws.com/0/16400/a1a9eba1-07d9-3665-e772-88660fc211ce.png "スクリーンショット 2013-11-01 18.42.55.png")
Mavericks にしてbrew upgradeしたらSourceTreeのリポジトリが立ち上がらない場合

リポジトリの中を見ようとすると強制終了してしまう。
なんかこれがgitのpreferenceで表示されたか、エラーで出たか…（すんません忘れました）
'git log  failed with code -1:'Couldn't posix_spawn: error 9

https://answers.atlassian.com/questions/224796/on-osx-mavericks-sourcetree-errors
これに辿り着いた。別のところ見てやれと。
https://confluence.atlassian.com/display/SOURCETREEKB/Wiping+SourceTree+Preferences
ようするに綺麗にせいという事らしい。

だったらバックアップした方が良さそうだったので下記に辿り着く。
https://answers.atlassian.com/questions/170443/how-to-backup-sourcetree

ファイルを別途保存して、消すものを一度消して、再度SourceTree起動。
ログイン＆インストールからになるけれど、少し進めると新しいファイル群が
作成されるので、それをバックアップで上書きした。日本語が下手だなぁ。時間が無くて吟味してられない。ごめんなさい。

リポジトリは検索機能があったので、その機能で検索して復元した。
バックアップがどの程度役に立ったかは不明。
FLOAT型とDECIMAL型の使い分け

いくつか定義した確率（0, 0.1, 0.05, 0.01, 0.001）に対するカラムを検索したいなとおもったときに

``` sample.sql
select * from sometable where probability = 0.1
```

とやったら、マッチしない！
なんでだ？と思って調べていたら下記に行き着いた。

http://dev.mysql.com/doc/refman/5.1/ja/no-matching-rows.html

> If you are comparing FLOAT or DOUBLE columns with numbers that have decimals, you can't use equality (=) comparisons. This problem is common in most computer languages because not all floating-point values can be stored with exact precision. In some cases, changing the FLOAT to a DOUBLE fixes this. See 「Problems with Floating-Point Comparisons」.

要は、浮動小数点は完全に(=)にならないよってことなので、

``` sample.sql
select * from sometable where probability >= 0.1 and probability <= 0.11
```

みたいなトリッキーなことしないとダメっぽい。

なので、四則演算に使わないような少数値は、FLOAT型ではなく、DECIMAL型を使いましょう。
Parallels内Windows上のGoogle日本語入力のIMEの有効無効を英数とかなキーで切り替える

Parallels使ってるとMacbookAirのキーボードには半角全角キーが無いのでIME切替で困る。なのでMacと同じようにParallelsの中でも英数・かなキーで切り替えられるようにするメモ。

1. Parallels内のGoogle日本語入力のプロパティを開く
2. 一般タブ→キー設定の選択→編集…をクリック
3. まず入力キーでソートする
4. `Eisu`と`Muhenkan`キーに対して全てのモードのコマンドを`IMEを無効化`にする
5. `Hiragana`キーに対して全てのモードのコマンドを`IMEを有効化`にする

`Eisu`だけじゃなく`Muhenkan`にも設定していけないといけなかった。
まぁ、多分不要なモード設定もしてるかもしれないけどとりあえずこれで期待通りの動作になるし細かくモード考えるより分かりやすい。
Railsのsunspotで日本語関連設定いろいろ


##環境
- solr v4.2.0
- sunspot 2.1.0
- sunspot_rails 2.1.0
- sunspot_solr 2.1.0

##設定
```xml:solr/conf/schema.xml
    <fieldType name="text" class="solr.TextField" omitNorms="false">
      <analyzer type="query">
        <tokenizer class="solr.JapaneseTokenizerFactory" mode="search" userDictionary="lang/userdict_ja.txt"/>
        <filter class="solr.JapaneseBaseFormFilterFactory"/>
        <filter class="solr.JapanesePartOfSpeechStopFilterFactory" tags="lang/stoptags_ja.txt" enablePositionIncrements="true" />
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ja.txt" enablePositionIncrements="true" />
        <filter class="solr.CJKWidthFilterFactory"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms_q.txt" ignoreCase="true" expand="true" />
        <filter class="solr.JapaneseKatakanaStemFilterFactory" minimumLength="4"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
      <analyzer type="index">
        <tokenizer class="solr.JapaneseTokenizerFactory" mode="search" userDictionary="lang/userdict_ja.txt"/>
        <filter class="solr.JapaneseBaseFormFilterFactory"/>
        <filter class="solr.JapanesePartOfSpeechStopFilterFactory" tags="lang/stoptags_ja.txt" enablePositionIncrements="true" />
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_ja.txt" enablePositionIncrements="true" />
        <filter class="solr.CJKWidthFilterFactory"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" />
        <filter class="solr.JapaneseKatakanaStemFilterFactory" minimumLength="4"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>
```

##queryとindex
検索時とインデックス作成時で設定を分ける

```
<analyzer type="query">
</analyzer>
<analyzer type="index">
</analyzer>
```

##solr.JapaneseTokenizerFactory
- Kuromojiを使った形態素解析
- userDictionaryはユーザー辞書を使いたい場合に設定

##solr.JapaneseBaseFormFilterFactory
- 動詞などを基本形に変換する

##solr.JapanesePartOfSpeechStopFilterFactory
- 接続詞とか副詞とか必要なさそうなのを除外
- 除外する内容はtagsで指定したtxtファイルに

##solr.StopFilterFactory
- 「する」「から」「なら」「のみ」とか必要ないものインデックスから除外
- 除外する内容はtagsで指定したtxtファイルに

##solr.CJKWidthFilterFactory
- 全角のローマ字を半角にしたり半角カナを全角にしたり

##solr.SynonymFilterFactory
- 同義語の設定。タマゴと検索したら卵もたまごもタマゴも玉子も検索できるように
- 内容はsynonymsで指定したtxtファイルに

##solr.JapaneseKatakanaStemFilterFactory
- カタカナのみの文字列の最後の長音（ー）を除去
- minimumLengthは文字数。4なら４文字以上のカタカナ

##solr.LowerCaseFilterFactory
-アルファベットを小文字
[bookmarklet] from github.com to gh-pages

## to gh-pages

github.com 上で Repository を見ているときにサクッと
gh-pages を開く bookmarklet 作ってみました.


### Original

```js
(function() {
    if (location.host != 'github.com') {
        alert("can not!");
    }
    
    var paths = location.pathname.substr(1).split('/');
    var ghPagesLink = "http://" + paths[0] + ".github.io/" + paths[1];
    
    window.open(ghPagesLink);
})();
```

### For bookmarklet

```js
javascript:(function(){(function() {if (location.host != 'github.com') {alert("can not!");}var paths = location.pathname.substr(1).split('/');var ghPagesLink = "http://" + paths[0] + ".github.io/" + paths[1];window.open(ghPagesLink);})();})();
```

### Usage

1. For bookmarklet にあるコードをブックマーク登録
2. github.com のページに移動( 例えば https://github.com/phi-jp/tmlib.js とか )
3. 1 で保存した bookmarklet を実行
4. http://phi-jp.github.io/tmlib.js が開く
SubnetUtilsについて


commons.netにSubnetUtilsというものがあります。

```
public boolean isInRange(String address) {
	return isInRange(toInteger(address));
}
```
こんな感じのメソッドがあり便利です。

```
public void test1(){
	SubnetUtils subnet = new SubnetUtils("127.0.0.0/8");
	assertTrue(subnet.getInfo().isInRange("127.0.0.1"));
}
```

これは通ります。
しかし、

```
public void test2(){
	SubnetUtils subnet = new SubnetUtils("123.123.123.123/32");
	assertTrue(subnet.getInfo().isInRange("123.123.123.123"));
}
```
これはこけます。

```
public void test3(){
	SubnetUtils subnet = new SubnetUtils("123.123.123.123/32");
	subnet.setInclusiveHostCount(true);
	assertTrue(subnet.getInfo().isInRange("123.123.123.123"));
}
```

１つだけ指定したいときはこうしましょう。
ちなみにipv6も対応していないようです。
Railsのsunspotでsolr4.xを使う


通常だと3.6だった

```ruby:Gemfile
gem 'sunspot_solr'
gem 'sunspot_rails'
```

これでbundle installしたら4.2.0が入った

```ruby:Gemfile
gem 'sunspot_solr', github: 'sunspot/sunspot', branch: 'master'
gem 'sunspot_rails', github: 'sunspot/sunspot', branch: 'master'
```
githubのプルリクエストをローカルリポジトリへ

originがgithubのリポジトリだとすると、
`git config --add remote.origin.fetch +refs/pull/*/head:refs/remotes/origin/pr/*`
でOK.
ただ、これでgit fetch --pruneとかするとすぐ削除してしまう.
これを解決するためには`.git/config`を弄る。
多分、以下のような部分を

```
[remote "origin"]
        url = hogehoge
        fetch = +refs/heads/*:refs/remotes/origin/*
        fetch = +refs/pull/*/head:refs/remotes/origin/pr/*
```

以下のように

```
[remote "origin"]
        url = hogehoge
        fetch = +refs/pull/*/head:refs/remotes/origin/pr/*
        fetch = +refs/heads/*:refs/remotes/origin/*
```

変更すれば、OK.
具体的にはfetchのheadsより前にpullを置けばいい。

以上を勝手にやってくれるshell scriptを書いてる人がいた!!
[shell script](https://github.com/jasoncodes/dotfiles/blob/a29509902cb839b6aaf26d2d5409d66199b86d1d/shell/aliases/git.sh#L93-L110)

当然ながら、これもoriginがgithub repositoryであることを前提としてる。
Jenkins使って良くやるバックアップ (rsync) 作業

### 基本
わたしは、Jenkinsでrsyncを使ったバックアップをたくさん実施してます。
定型作業まで落ちている場合は、cronで問題ありませんが、特に、移行を控えているときとかに良く利用します。

#### 理由

- 移行の期間で、どれくらい同期に時間がかるか見積もりたい
- こまめにrsyncさせておいて、実際の移行時のデータ同期をできるだけ手短かに済ませたい
- dry runモードでどれくらいファイルが同期するか確認したい
- rsyncをまっさらな感じで実施したい
- パターンは同じだけど、ターゲットのホスト／ディレクトリをパラメータで切り替えして実施したい（本番とかステージングとかを切り替える）

### 設定
ちょっとばかり載せます。

- よくパラメータ指定するもの：
 - バックアップ用ディレクトリ
 - 対象サーバ　（たいていssh) 
 - rsyncのオプション

特に、rsync -n オプションは良く利用します。（うっかり上書きの悲劇を過去に経験しているので）

![jenkins-config.png](https://qiita-image-store.s3.amazonaws.com/0/27976/7b71c995-952f-46b4-d5cd-4a5111942a78.png "jenkins-config.png")

### shellでの記載
こんな感じで、shellを設定しています。（下記は、ローカルのディレクトリにデータを pull する形のrsync) 

```
if [ ${DRY_RUN} = "true" ]; then
  sudo rsync -avnz --delete -e ssh ${SOURCE_SERVER}:/{$SOURCE_DIR}/  {$BACKUP_DIR}
else
  sudo rsync -avz --delete -e ssh ${SOURCE_SERVER}:/{$SOURCE_DIR}/  {$BACKUP_DIR}
fi
```
### 設定についてのメモ
jenkinsの設定ではありませんが、パッケージでjenkinsをインストールすると、通常はjenkins ユーザでの実行なので、root権限が必要な操作ができなかったりします。

Jenkinsのサーバに自身に、rootで接続しちゃうスレーブを立てる方法も取ったりしますが、sudoで対応する場合は、このへんを設定してます。

```
# tty で怒られるのでコメントアウト
#Defaults    requiretty

# バックアップに必要なタスクを定義
Cmnd_Alias BACKUP_TASK = /usr/bin/rsync, /usr/bin/ssh, /usr/bin/du

# jenkinsさんには上記タスクはroot権限で実施できるようにする
jenkins ALL = (root)    NOPASSWD: BACKUP_TASK

```
PostgreSQLにpsqlでログインする方法を忘れた時の対処法

何度も何度も何度も何度も `psql` で対話的ログインする方法と必要なパスワードを忘れてしまうので大体の場合なら無理やり解決できる方法をメモ。

## 解決策

```
$ sudo su - postgres
postgres: $ createuser ironsand
postgres: $ Shall the new role be a superuser? (y/n) y
postgres: $ exit
$ psql -U ironsand -d postgres
```

## やってること

インストールするときに自動的に作成されるユーザーに `sudo su -` でなってしまって自分のユーザー名で管理者権限を持つユーザーを作ってしまう。

`psql` で対話的に処理するにはとりあえず何かDBに接続しないとダメなのでデフォルトで存在してる`postgres`に接続する。

あとはSQL文を好きに発行できるので `ALTER ROLE ironsand WITH PASSWORD 'pass';`とかでパスワードをつけるなりなんなりテキトーに。