OmniAICreator/Qiita-1.07M huggingface dataset:
こんなコマンドあったんだ！初めて知った時に感動したLinuxコマンド集


## column
 
ただの整形コマンドなのだが、ログの整形だったり
何かの結果を一時的に確認したいときに見やすくなって便利

-s A :デリミタ指定
-t   : テーブル形式に出力

`$ column -s":" -t /etc/passwd`

```
bin        x  1      1      bin       /bin             /sbin/nologin
daemon     x  2      2      daemon    /sbin            /sbin/nologin
adm        x  3      4      adm       /var/adm         /sbin/nologin
lp         x  4      7      lp        /var/spool/lpd   /sbin/nologin
sync       x  5      0      sync      /sbin            /bin/sync
shutdown   x  6      0      shutdown  /sbin            /sbin/shutdown
halt       x  7      0      halt      /sbin            /sbin/halt
mail       x  8      12     mail      /var/spool/mail  /sbin/nologin
uucp       x  10     14     uucp      /var/spool/uucp  /sbin/nologin
```

## sshpass

連続してSSHログインして情報を取得したい！
そんなときは鍵認証でログインを設定しておくものだとは思う。
だけども機能の多くないスイッチだったり、何らかのポリシーでパスワードログインの環境しかない時に使えるコマンド。

標準で入ってないときはEPELからインストール
`# yum install sshpass --enablerepo=epel`

こんな感じで使える↓
```
$ sshpass -p `cat pass.txt` ssh username@192.168.0.1
```

順次ログインしたいとき↓
```
$ for i in `seq 1 3` ; do sshpass -p `cat pass.txt` ssh username@192.168.0.$i "COMMAND" ; done
```

## rev
文字を反転するコマンド

```
$ echo qiita | rev
atiiq
```

たくさんのドメイン情報をサブドメインでsortしたかった時
(右揃えでsort)に使用

```
$ cat 1.txt
www.test.com
test.com
a.test.com
www.testtest.com
mail.testtest.com
c.test.jp
b.test.jp
www.test.co.jp
test.co.jp
```

単純なsortはこうなってしまう。。

```
$ sort 1.txt
a.test.com
b.test.jp
c.test.jp
mail.testtest.com
test.co.jp
test.com
www.test.co.jp
www.test.com
www.testtest.com
```

revを使うとドメイン別にちゃんとsortできる

```
$ rev 1.txt | sort | rev
test.com
a.test.com
mail.testtest.com
www.testtest.com
www.test.com
test.co.jp
www.test.co.jp
b.test.jp
c.test.jp
```

## ssh -t -t

コマンドではなくoptionですが
複数のサーバにroot権限が必要な作業をしたいとき。

*インフラ管理ツール使えよ！って話ですが..*

```
for i in server1 serever2 server3
do
    ssh -t -t $i "sudo ls /root"
done 
```

## ps -o lstart

これもコマンドではなくオプションですが
プロセスの開始時間が知りたいときに使う。

```
$ ps -o pid,ppid,lstart,cmd -p 1800
  PID  PPID                  STARTED CMD
 1800     1 Sun Feb 22 05:24:07 2015 /usr/sbin/httpd
```
Ansible Roleのスケルトンを作成するワンライナー


setuptoolsのコマンドを定義したり、Ansibleのタスク化してみたり、他にもやり方はあると思う。自分には一回入力+シェルでのコマンド履歴検索というのが一番手軽に感じたのでしばらくはこれでいこうかと。

```bash:ansible_role_oneliner
$ (role=common; mkdir -p $role; cd $role && for d in templates files; do mkdir -p $d && touch $d/.gitkeep; done; for d in tasks handlers vars defaults meta; do mkdir -p $d && touch $d/main.yml; done)
```

## 追記

横の人が「処理の共通化ぐらいしろボケ」って言いつつ、書き直してくれました。

```bash:ansible_role_oneliner2
$ (role=common; mkdir -p $role; cd $role && mk() { mkdir -p $1; touch $1/$2; }; for d in templates files; do mk $d .gitkeep; done; for d in tasks handlers vars defaults meta; do mk $d main.yml; done)
```

こちらはeval使ってもうちょい短くしたバージョン。本人曰く「処理が分かりにくくなるからevalはやめた方がいいかもな」とのこと。

```bash:ansible_role_oneliner_eval
$ (role=common; mkdir -p $role; cd $role && mk() { mkdir -p `eval echo $1`; touch `eval echo $1/$2`; }; mk "{templates,files}" .gitkeep; mk "{tasks,handlers,vars,defaults,meta}" main.yml)
```

## さらに追記

`ansible-galaxy init`という手があるらしい...
http://qiita.com/tumf/items/546a578cb05237ec8356#comment-0c3b2388fc5531c8dcd7

`.gitkeep`までは作ってくれないから(震え

ということで、これとこれを組み合わせてこうじゃ!

```bash:ansilbe_role_oneliner3
$ (role=roles/common; ansible-galaxy init $role && for d in templates files; do touch $role/$d/.gitkeep; done)
```
Swiftをコマンドラインから実行する


"Swift command line" でググるとQiitaのこの記事がトップにでてくる。

>  Swiftをコマンドラインから実行
	http://qiita.com/smurakami/items/a11643cf2cb93df27720

なるほど、なるほど。コマンドラインで叩けるExecutableがXcodeに入っているのでそれを探しだしてパスを通すと。

ちなみに、

```console
$ find /Applications/Xcode.app -name swift | grep /bin/swift
```

は

```console
$ find /Applications/Xcode.app -path \*/bin/swift -print
```

でも良い気が。

ともかく、これを設定しようと思ったが何気にコマンドラインで"swift"と打ってみると

```console
$ swift
Welcome to Swift!  Type :help for assistance.
  1>
```

と出る。あれ、と思ったが確かにある。

```console
$ which swift
/usr/bin/swift
```


で、調べてみるとこれっぽい。
https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/WhatsNewXcode/Articles/Introduction.html

> Xcode 6.1 Update

> Xcode 6.1 adds development support for OS X version 10.10 Yosemite and other feature additions.

> * Includes SDKs for OS X version 10.9, OS X version 10.10, and iOS 8
> * **Adds Swift for OS X, including support for playgrounds, REPL, and command line scripts**
> * Interface Builder adds Storyboards for OS X
For additional details on the Xcode 6.1 release, see Xcode Release Notes.

ということで、「Swiftをコマンドラインから実行する」のalternative solutionとして

* **Xcode 6.1にアップグレードする**

というのを挙げておきます

(10/26 追記)
どうやらこれはYosemite(OS X 10.10)限定の様で、Maveriks(OS X 10.9)ではこれまで通り/usr/binにはインストールされない様です。 [thanks to @riocampos]
Yii 1.1.15 メモ

## アクティブレコード
### ディフォルトスコープを無効にする方法
```php
MyModel::model()->resetScope()->findAll();
```

## パンくずリスト
### カスタマイズ
```php
<?php if(isset($this->breadcrumbs)):?>
       <?php $this->widget('zii.widgets.CBreadcrumbs', array(
            'links'=>$this->breadcrumbs,
            'homeLink'=>CHtml::link('Main page', Yii::app()->homeUrl), 
            'tagName'=>'ol', // ul -> ol
            'htmlOptions'=>array('class'=>'breadcrumbs'),
            'activeLinkTemplate'=>'<a href="{url}">{label}</a>',
            'inactiveLinkTemplate'=>'<a class="current">{label}</a>',
            'separator'=>'<div class="breadcrumb_separator"></div> ',
                      
       )); ?><!-- breadcrumbs -->
<?php endif?>
```
iOSアプリ開発:OpenALで音連続再生時にエラー発生

※個人で管理しているHPに引っ越ししました。
リンク切れ等考慮して本ページは残しておきますが、今後は[HP](https://kittenkitten.net/2014/10/26/ios_dev_openal_play_error/)のほうで更新します。

## 現象
画面をタッチしたら音を再生させるようにし、
画面を連続タッチしたら下記処理でエラーが出ました。

```objc++:Test.m
alSourcei(source, AL_BUFFER, buffer);
if ((error = alGetError()) != AL_NO_ERROR) {
  NSLog(@"Err alSourcei AL_BUFFER %x", error);
}
```

エラーログの内容は下記の通りです。

```
Err alSourcei AL_BUFFER a004
```

## 調査

al.hで調べた所、下記が一致します。

```objc++:al.h
#define AL_INVALID_OPERATION                      0xA004
```

[OpenAL公式リファレンス](http://www.openal.org/documentation/openal-1.1-specification.pdf)
によると、35Pに解説がありました。

ソースの状態がAL_PLAYINGかAL_PAUSEDの時、
AL_BUFFERをするとAL_INVALID_OPERATIONが発生するそうです。

音が鳴り終わる前に、次の音を鳴らそうと準備する所でエラーが出ているようです。

## 対応

ソースの状態を取得し、AL_BUFFER出来ない状態なら停止させておくようにしたら、エラー出なくなりました。

```objc++:Test.m
// 追加 start -----
// ソースの状態取得
alGetSourcei(mSource, AL_SOURCE_STATE, &state);
NSLog( @"alGetSourcei state:%x",state );
if ((error = alGetError()) != AL_NO_ERROR) {
  NSLog(@"Err alGetSourcei AL_SOURCE_STATE %x", error);
}

// 再生中、一時停止中にソースを設定するとエラーとなるため、まず停止させる
if (state == AL_PLAYING || state == AL_PAUSED) {
  alSourceStop(mSource);
}
// 追加 end -----

alSourcei(source, AL_BUFFER, buffer);
if ((error = alGetError()) != AL_NO_ERROR) {
  NSLog(@"Err alSourcei AL_BUFFER %x", error);
}
```
init.elのデバッグ方法

1. デバッグしたい範囲を'C-Space'で始めてマーク選択する

2. `M-x eval-region`で選択した範囲を評価する．

単一のS式をデバッグする場合
方法A. `C-Space`でマークして，S式末尾で`C-x C-e`で評価できる．
方法B. S式末尾で'C-j'

バッファ全体なら`M-x eval-buffer`．

参考

[emacsのinit.elでエラーが発生した際の対処方法](http://piko.hateblo.jp/entry/2012/04/17/090253)
Hackage管理されているパッケージの開発版をcabal installする方法

Haskell（というかGHC）の話題です。特定のパッケージについて、Hackageにアップロードされているバージョンが古いような場合に、GitHub上の最新ソースコードからcabal installする方法を紹介します。

ちなみに、僕は[bed-and-breakfast](https://hackage.haskell.org/package/bed-and-breakfast)というパッケージを使おうと思ったのですが、2014/10現在、Hackageからcabal installしようとするとGHC 7.8.3では失敗してしまいます。この問題はGitHub上の最新版なら修正されているとのことで、これをインストールしてみました。

```
$ git clone https://github.com/scravy/bed-and-breakfast.git
$ cd bed-and-breakfast
$ cabal check
The following warnings are likely affect your build negatively:
* Instead of 'ghc-options: -cpp' use 'extensions: CPP'

Hackage would reject this package.
$ cabal configure
Resolving dependencies...
Configuring bed-and-breakfast-0.5...
Warning: Instead of 'ghc-options: -cpp' use 'extensions: CPP'
$ cabal sdist
Source tarball created: dist/bed-and-breakfast-0.5.tar.gz
$ cabal install dist/bed-and-breakfast-0.5.tar.gz
Resolving dependencies...
Configuring bed-and-breakfast-0.5...
Building bed-and-breakfast-0.5...
Installed bed-and-breakfast-0.5
Updating documentation index /Users/hnw/Library/Haskell/share/doc/index.html
$
```

要は、cabalファイルを元にパッケージングして、それをインストールしているだけです。

## 参考にした文章

* [本物のプログラマはHaskellを使う - 第56回　Cabalを使ってパッケージを作成する：ITpro](http://itpro.nikkeibp.co.jp/article/COLUMN/20121106/435201/)
* [matrix - How can I compute an exact (integer) determinant in Haskell? - Stack Overflow](http://stackoverflow.com/questions/23801999/how-can-i-compute-an-exact-integer-determinant-in-haskell)
Swift でのオーバーロード


`swift`でオーバーロードを試してみた。
名前が同じメソッドで、引数もしくは戻り値が異なることが条件。
メソッド名前が同じで、引数の数が異なるものはダメなようだ。 *※今後調査予定*

どのメソッドが呼ばれるかは、引数の型と戻り値の型で推論してくれる。

![スクリーンショット 2014-10-26 13.19.13.png](https://qiita-image-store.s3.amazonaws.com/0/3184/79da7326-8076-3205-8621-8ae058550067.png "スクリーンショット 2014-10-26 13.19.13.png")

ちなみに、`swift`で便利な型推論は、呼ばれる有効なメソッドが複数ある場合、受け取る変数の型を指定しないと、下記の図のようにエラーとなる。呼びたいメソッドが明確でないからね。

![スクリーンショット 2014-10-26 13.28.23.png](https://qiita-image-store.s3.amazonaws.com/0/3184/7710890b-593d-1a5c-d7d2-28d361d24cc3.png "スクリーンショット 2014-10-26 13.28.23.png")

クラス設計する場合には、この辺の挙動に気をつけないとね。

*Lovely Swift!!!*
Yosemite で Google Chrome Canary をデフォルトブラウザに設定する


Google Chrome Canary はセカンダリ インストールのため、`設定 → 既定のブラウザ`からデフォルトブラウザにすることはできません。

Yosemite 以前は Safari の設定からデフォルトのブラウザを選択することができたのでここで Canary を選択することでデフォルトのブラウザを Canary 設定出来ました。

Yosemite からはこの項目が無くなり、設定する方法が少し変わりました。

## システム環境設定 → 一般

![](http://gyazo.com/0bd7354fefd1fccfc7f5d9f0a784db6c/raw)


## 一般 → デフォルト Web ブラウザ

![](http://gyazo.com/e9a08d0d5c53897daf58d26e0caab407/raw)

で Google Chrome Canary を選択。

これでデフォルトブラウザが Canary になりました。
awscliの設定切り替え


まず最初にデフォルト設定を作成する

```
aws configure
```

デフォルト以外の設定を作る

```
aws configure --profile test-user
```

こんな感じの設定ファイルが~/.aws/configに作成される

```
[default]
aws_access_key_id=AKISUSHIUMAIUMAI
aws_secret_access_key=uniOotoroMaGUrOIKATAKOunaG18machi
region = ap-northeast-1

[profile test-user]
aws_access_key_id = AKINIKUYORISUSHI
aws_secret_access_key = B1nch0SAbAYariIkaH0taTEAj13MA
region=us-west-2
```

awscli実行の際は、

```
aws s3 list --profile test-user
```

のようにするか

```
export AWS_DEFAULT_PROFILE=test-user
aws s3 list
```
のように環境変数で指定する
Elastic Beanstalkでアプリ内から好き勝手なことを出来るようにする


## .ebextensionsによる初期化処理

Elastic Beanstalkでは、アプリケーションディレクトリの直下の`.ebextensions`ディレクトリに`.config`で終わるファイルを用意しておくと、アプリケーションをpushした際に良きに計らっていろんなことをしてくれる。

configファイルはYAMLで記述する。詳細は[こちら](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/customize-containers-ec2.html)を参照すると良い。

なお、処理の順番は、以下の通りで、packages〜servicesまでは、Webサーバの準備が終わっていて、まだアプリが抽出されていない時点で実施され、container_commandsは、Webサーバの準備が終わり、かつアプリの抽出が終わっていてデプロイされる前に実行される

* packages
* files
* commands
* services
* container_commands

## sudoできるようにする

ということでアプリからコマンドをキックしたりしたい場合にsudoの設定を変えたい場合はよくある。Elastic BeanstalkではカスタムAMIが利用できるので、予め自分でAMIを作っておいてもよいが、初期化処理の中でやってしまうのが保守性を含めて簡単である。

以下がその例。まずsudoするときにttyを必要としてしまうとアプリ内からキックできないのでこいつを無効にする。その上で、Elastic Beanstalkのアプリ用ユーザーのwebappに対してパスワードなしでsudoできるように設定している

```
commands:
  01_sudo:
    command: "sed -i 's/^.*requiretty/#Defaults requiretty/' /etc/sudoers"
  02_sudo_webapp:
    command: "grep -q 'webapp ALL=(ALL) NOPASSWD: ALL' /etc/sudoers || echo -e 'webapp ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers"
```

これで色々自由になるはず。

## もっと自由にしたかったら？

ドキュメントに書いていないが、hookを使うと、適用のタイミングを含めてもっと自由に使える。
Nginx on UbuntuでPHPを動かす

Nginx (on Ubuntu) でちょっとPHPを動かしたいなーと思ったときのメモ
下記で動くようになるはず。動かなかったらその周りをちょっと調整する。

## php5-fpmをインストール

```
apt-get install php5-fpm
```


インストールが終わったら php5-fpm の起動を確認する。

```
ps aux | grep php-fpm
```


### UNIXドメインソケットの確認

何も変更していなければ、`/var/run/php5-fpm.sock=` があるはずなので、`/etc/php5/fpm/pool.d/www.conf` 内を一応確認しておく。

```
user = www-data
group = www-data
```

```
listen = /var/run/php5-fpm.sock
```

## Nginxの設定

### 仮想ホストの設定

仮想ホストの設定ファイルに下記を加える。

```
location ~ \.php$ {
    fastcgi_pass    unix:/var/run/php5-fpm.sock;
    fastcgi_index   index.php;
    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include         fastcgi_params;
}
```

`fastcgi_param` は必要あれば変えたり、locationの中にroot入れるのは適宜行ってください。


### サーバー再起動

```
/etc/init.d/nginx restart
```


### 確認

適当なPHPスクリプトを書いて確認してください。

```php
<?php
phpinfo();
```
SwiftでのNSInvocation

SwiftにはNSInvocationがない。

ないわけじゃあないみたいだが、実際に使おうとすると`'NSInvocation' is unavailable`というエラーメッセージが出てしまう。

とはいえ、Swiftでは関数をごく自然にデータ型の一つとして使えるので困ることはない。と思っていたのだが……

---

CocoaフレームワークにはObjCのセレクタの仕組みを使った、デリゲートパターンによる実装が多い。
自分がはまったのはこれ。

```lang:objc
- (void)attemptRecoveryFromError:(NSError *)error
                     optionIndex:(NSUInteger)recoveryOptionIndex
                        delegate:(id)delegate
              didRecoverSelector:(SEL)didRecoverSelector
                     contextInfo:(void *)contextInfo
```
このメソッドは非形式プロトコルで、エラーチェインにこれを実装したオブジェクトを登録すると受け取ったエラーからの回復を試みることができる。エラーからの回復を試した後は、`delegate`の`didRecoverSelector`で指定されたメソッドを呼び出し、回復の成否やコンテキストを渡すことができる。

ARC環境下では`-[NSObject performSelector:]`が使えないので、`NSInvocation`を使って呼び出していた。
このコードをSwiftに移植すると、`NSInvocation`は使えないというエラーになってしまうのである。困った。

初めは`NSObject#methodForSelector`を使って`IMP`型を取得し、キャストして使おうと思っていたのだが、`IMP`型は`COpaquePointer`として定義され、どうもSwiftからはその中身に一切触ることができないらしい。なんのためにあるんだろうか？

---
結局、`NSError`の`userInfo`プロパティにコールバックを格納して使うことにした。しかし、関数を直接Dictionaryには入れられないのでラッパークラスを作るハメに。

```lang:Swift
class Function<A, R> {
    let function: A -> R
    init(f: A -> R) {
        function = f
    }
    func call(args: A) -> R {
        return function(args)
    }
}
```
で、使うときはこういう感じ。

```lang:Swift
let f = error.userInfo![key] as Functor<(...), Void>
f.call(...)
```

---
今回は`NSError`が任意のオブジェクトを格納できるおかげでなんとか解決できたが、一般的なアプローチではない。誰かいい方法を教えてください。

Swiftのライブラリはまだ未成熟なので、この記事の情報が一刻も早く古くなることを期待しています。

参考：
[Mac Developer Library: Error Handling Programming Guide](https://developer.apple.com/library/Mac/documentation/Cocoa/Conceptual/ErrorHandlingCocoa/ErrorHandling/ErrorHandling.html#//apple_ref/doc/uid/TP40001806-CH201-SW1)
[Swiftの関数の引数は、常に一つ](http://qiita.com/dankogai/items/46fedc447dd93d1e0fbc)
２つの標本の相加平均値を求める

要素数・平均値が分かっている標本２つを統合し、その平均値を求めたい。

#例


||要素数|平均値|
|-----------:|-----------:|-----------:|
|元の標本|100|50|
|追加したい標本|200|110|

#普通は

普通に考えれば、全要素の値の合計値を出して、全要素数で割る。

```math
(100*50 + 200*110) / 300 = 90
```

#でも

プログラムでこの方法をやると、全要素の合計値を求めるところで、超巨大な数になって、オーバーフローする可能性がある。
なので、なるべくコンパクトな計算方法をとりたい。

#やり方

```math
(元標本の平均値)+
(追加標本の平均値 - 元標本の平均値)*(追加標本の要素数)/(元標本の要素数+追加標本の要素数)
```

#例に適用してみる

```math
(50)+
(110-50)*(200)/(100+200)=90
```
JSON::PP::decode_jsonはリストコンテキスト、JSON::XS::decode_jsonはスカラコンテキスト

# 確認

```perl
use strict;
use warnings;
use JSON::PP ();
use JSON::XS ();

sub context {
    my $con = wantarray;
    if(!defined($con)) {
        print "VOID\n";
    }elsif($con) {
        print "LIST\n";
    }else {
        print "SCALAR\n";
    }
    return "{}";
}

print "PP (ver $JSON::PP::VERSION): ";
JSON::PP::decode_json(context());

print "XS (ver $JSON::XS::VERSION): ";
JSON::XS::decode_json(context());
```

出力結果:

```
PP (ver 2.27202): LIST
XS (ver 3.01): SCALAR
```

# だからなんなのか？

下のような複数行のJSONファイル(hoge.json)があったとして、

```
{"foo":
 "bar"}
```

こいつを読み込んでdecodeするプログラムが環境によっていきなり動かなくなって焦った。

```perl
use strict;
use warnings;
use File::Slurp qw(read_file);
use JSON qw(decode_json);
use Data::Dumper;

my $data = decode_json(read_file("hoge.json"));
print Dumper $data;
```

問題は[File::Slurp](https://metacpan.org/pod/File::Slurp)の`read_file`関数の挙動がコンテキストによって異なるということ。

- スカラコンテキストでは、ファイル全体のデータを返す。
- リストコンテキストでは、ファイルの各行のリストを返す。

そのため、`JSON::XS`のない環境(`JSON::PP`が使われる環境)ではエラーになった。

[File::Slurp::Tiny](https://metacpan.org/pod/File::Slurp::Tiny)はこういうコンテキスト依存性がないので、こっちを使ったほうがいいのかもしれない。
RxAndroidを使ってInapp Billing v3 を試す

最近完全にAndroidアプリをメンテするおじさんと化している駄猫です、こんにちは

今回は[RxAndroid](https://github.com/ReactiveX/RxAndroid)便利ですね、というお話

[なお件のものに関してはとりあえず動いているものがこっちに](https://github.com/daneko/android-inapp-library)

あ、subscriptionはほんとにお金かかるはずなので、試さないように

## なぜ突然RxAndroid使おうと思ったか

* Java(Android)のFutureが不便だったところで出会った
  * scalaのFutureを期待してはいけません
* [このスライドのこの辺に大体同意できてしまう](http://slides.com/yaroslavheriatovych/frponandroid#/2)
* Callbackダルい

## なぜ課金周りか

* 非同期で動かす前提
* 購入結果は `onActivityResult` にCallbackされる

てな感じで練習用に良かった

## 良かった点

### 非同期処理が楽

* とりあえず処理書く
* Observableで包む
* subscribeOnで実行スレッド決める

すっごい適当に書くとこんな感じ

```java
Observable.create(...)
    .subscribeOn(Schedulers.newThread())
    .subscribe(s -> log.debug(s));
```

### 非同期処理が複数でも楽

[merge](https://github.com/ReactiveX/RxJava/wiki/Combining-Observables)したり[flatMap](https://github.com/ReactiveX/RxJava/wiki/Transforming-Observables)したりできて楽

```java
final Observable<A> o1 = Observable.create(...);
final Observable<B> o2 = Observable.create(...);

o1.flatMap(o1Result -> o2)
    .subscribeOn(Schedulers.newThread())
    .subscribe(s -> log.debug(s));
```

こんなんで、o1の処理成功したらo2の処理やってくれて楽

### UIThreadで動かさなければならない時も楽

`observeOn` で以降の動作Threadを切り替えられるので[本家のサンプルのように書くだけ](https://github.com/ReactiveX/RxJava/wiki/The-RxJava-Android-Module#observing-on-the-ui-thread)

## よくわからない点

### callbackの消し方

消し方っていうと語弊がありそうですけど…

Inapp Billingの場合、購入時にonActivityResultで結果が返ってくるのがネックなイメージ

(まあ言い出したらそれ以外にもなんでこんな仕様なの…的なものは…)

わかりやすいのは

```java
Result result = Iab.buy(item);
// result 見れば答えがわかる！
```

だと思うんですよね

こういう感じにするために、今回は[onActivityResult呼び出し時にPublishSubject#onNext](https://github.com/daneko/android-inapp-library/blob/991f2ccf661fdb237abbd845656b60d345537139/sample/src/main/java/jp/daneko/example/MyActivity.java#L37)を使いました

実際の購入処理のところでは

* [とりあえず購入Intent飛ばすだけの処理をするObservable作る](https://github.com/daneko/android-inapp-library/blob/991f2ccf661fdb237abbd845656b60d345537139/library%2Fsrc%2Fmain%2Fjava%2Fjp%2Fdaneko%2Fandroid%2Finappv3%2FIabService.java#L169)
* [とりあえずonActivityResultの結果を処理するObservable作る](https://github.com/daneko/android-inapp-library/blob/991f2ccf661fdb237abbd845656b60d345537139/library%2Fsrc%2Fmain%2Fjava%2Fjp%2Fdaneko%2Fandroid%2Finappv3%2FIabService.java#L200)
* [合わせて待つ](https://github.com/daneko/android-inapp-library/blob/991f2ccf661fdb237abbd845656b60d345537139/library%2Fsrc%2Fmain%2Fjava%2Fjp%2Fdaneko%2Fandroid%2Finappv3%2FIabService.java#L216)

という書き方が可能になります

なのでメソッド呼び出し側から見れば、「購入メソッドを叩いたら購入結果が得られた」みたいな感じになって主に自分が嬉しいですね

という結果になりました

ただまあ…他にも(もっと楽で簡潔な)方法があるんじゃないかなぁ…とも思っています

詳しい人教えてください


## 個人的な感想

* [RxAndroid](https://github.com/ReactiveX/RxJava)([RxJava](https://github.com/ReactiveX/RxAndroid))便利なのでみんな使いましょう
* [この辺とかよくわかってない](https://github.com/ReactiveX/RxAndroid/blob/v0.22.0/src/main/java/rx/android/observables/AndroidObservable.java#L90)
pecoを使ってアプリを端末から選択する


インターフェイスは、[peco](https://github.com/peco/peco)を使用します。


複数のアプリを立ち上げている場合はもしかしたら便利かもしれません。


```
$ git clone https://github.com/syui/osx-select-window

$ cd !$:t

$ ./osx-select-window
```




あと、ウィンドウ位置、サイズを指定するスクリプトも入ってます。

```
# まず、どのアプリでも良いので、よく使うウィンドウ位置とサイズでセーブします。
./osx-save-window

# 続いて、セーブした内容で選択できます。
./osx-move-window
```

もしかしたら、マルチディスプレイなどで便利なことがあるかもしれません...。
box-sizingとブロックの高さを揃えるjqueryプラグイン

box-sizingとブロックの高さを揃えるjqueryプラグイン

同じ幅のブロックを最も内容の多いブロックの高さに揃えて横並べさせたいのですが、その際、box-sizing:border-boxにすると、ブロックごとにボーダーやパッディングを変えても、widthを変更しなくて便利なのですが、これがうまく実現できるjqueryプラグインがないようです。

プログラミングはド素人ですが、いちおうjquery.heightLine.jsを少し書き換えたところ一応うまく表示されていますが、不具合が出る可能性は多分大です？!

jquery.heightLine.js配布元
http://blog.webcreativepark.net/2013/10/21-112000.html

jquery.heightLine.js だと微妙に揃わない

http://qitailang.small.jp/misc/equal_box/equal_box_sample3.html

書き換えたjquery.heightLine.jsだと

http://qitailang.small.jp/misc/equal_box/equal_box_sample4.html

jQueryAutoHeight.js、jquery.tile.jsなどは、すべての行でなく特定の行の高さを揃えるためにoptionでボックス数を指定することができるようです。これらを使って上のようなことができる方法はないものでしょうか？
static 変数を使ってシーン間で変数共有

シーン間で変数を共有する方法
=========================

シーン間で変数を共有する方法にはいくつかのやり方があるらしいが、最も手軽にできるのが、static 変数を利用する方法である。

# サンプルコード
GameManagerGod クラスのメンバー変数である```numberOfWin```と```numberOfLose```は、```public static```で宣言しておくことで、シーンが変わってもゲームが起動している間は永続的に存在する変数となる。

（ちなみに、ゲームを終了した場合は、これらの変数は破棄される。ゲームが終了した後も永続的に変数を保存しておきたい場合は、ゲーム終了時にこれらの変数の値をファイルに書き出しておき、次のゲーム起動時にファイルから変数の値を読み込むことでできる。）

```
using UnityEngine;
using System.Collections;

/**
 * Define static variables to save variables between some scenes.
 */

public class GameManagerGod : MonoBehaviour {

        // 戦闘に勝った回数と負けた回数をシーン間で共有できるようにしておく。
	public static int numberOfWin = 0;
	public static int numberOfLose = 0;

	public static int getNumberOfWin () {
		return numberOfWin;
	}
	public static void addNumberOfWin (int n) {
		numberOfWin += n;
	}
	public static int getNumberOfLose () {
		return numberOfLose;
	}

	// Use this for initialization
	void Start () {
	}
	
	// Update is called once per frame
	void Update () {
	}
}
```

あとは、このクラスを、別のクラスで呼ぶだけ。

例えば、以下のシーンは、ゲームのオープニングシーン中のゲームオブジェクトで実行されるコードである。

```
using UnityEngine;
using System.Collections;

public class GUIOpening : MonoBehaviour {

	void OnGUI () {
		if ( GUI.Button (new Rect (10, 20, 100, 30), "Start battle") ) {
			Application.LoadLevel("Battle");
		}
		if ( GUI.Button (new Rect (10, 50, 100, 30), "Settings") ) {
		}

                // 戦闘に勝った回数と負けた回数を表示する。
		GUI.TextArea (new Rect (100, 100, 100, 30), (GameManagerGod.getNumberOfWin ()).ToString());
		GUI.TextArea (new Rect (100, 130, 100, 30), (GameManagerGod.getNumberOfLose ()).ToString());
	}

	// Use this for initialization
	void Start () {
	}
	
	// Update is called once per frame
	void Update () {
	}
}
```

戦闘シーンでも、戦闘の結果を見て```GameManagerGod```のstaticメソッドを更新する。
（以下の戦闘シーンは、Atack ボタンを５回押すと勝つ、という単純な戦闘）

```
using UnityEngine;
using System.Collections;

public class GUIBattle : MonoBehaviour {

	public int enemyHitPoint = 5;
	public enum Result {Unknown, Win, Lose};
	public Result result = Result.Unknown;

	void OnGUI () {
		if ( GUI.Button (new Rect (10, 20, 100, 30), "Atack") ) {
			if ( enemyHitPoint > 0 ) {
				enemyHitPoint--;
			}
		}
		if ( GUI.Button (new Rect (10, 50, 100, 30), "Defence") ) {
		}
		GUI.TextArea (new Rect (50, 100, 100, 30), enemyHitPoint.ToString());

		if (enemyHitPoint <= 0) {
			GUI.TextArea (new Rect(50, 150, 100, 30), "You win !!");
			result = Result.Win;
			//GameManagerGod gameManagerGod = GameManagerGod.loadGameManagerGod();
			Application.LoadLevel("Opening");
		}
	}

	void OnDestroy () {
		if (result == Result.Win) {
			GameManagerGod.addNumberOfWin (1);
		} else if (result == Result.Lose) {
                        // 実装面倒になったので省略
			//GameManagerGod.addNumberOfLose (1);
		}
	}

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}
```

# 注意点
上記の方法は非常にお手軽であるが、変数を保持しておくクラスを限定して利用したほうが良さそう。
というのもこの static 変数は、グローバル変数みたいなもんだから、どのクラスにどの static 変数が存在するか？が分からなくならないようにしたほうがいい。
EC2のmicro instanceでcomposer updateがコケる場合のメモ

EC2のmicro instanceでcomposer updateを行った場合、メモリ不足で壮大にコケる場合がある。

```
PHP Fatal error:  Uncaught exception 'ErrorException' with message 'proc_open(): fork failed - Cannot allocate memory' in phar://path/to/composer.phar/vendor/symfony/console/Symfony/Component/Console/Application.php:983
```

httpdとかmysqldとか動いてる場合、一時的に止めてやれば行ける場合もある。
でも、それでもダメな場合はスワップファイルを作ってやる。

```
# /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
# /sbin/mkswap /var/swap.1
# /sbin/swapon /var/swap.1
```

Ref: https://github.com/composer/composer/issues/945#issuecomment-8552757
Mac の Redmine のバージョンを上げる

- Redmine のインストールパスは /usr/local/redmine
- Redmine のソースは git で取ってきてる環境
- Ruby のバージョン管理は rbenv をつかう

以下を参照

- http://qiita.com/janus_wel/items/06dae0dec1ff1a886d54
- http://qiita.com/janus_wel/items/d1a4adb7f28ce4e7a319

Ruby のバージョンをあげる
-------------------------

直接は関係ないんだけど Ruby のバージョン変えると Passenger のインストールもしなおさないといけないので一緒にやってしまう。 2.1.0 からのアップデート。

```sh
> cd /usr/local/redmine
> rbenv install 2.1.3
> rbenv local 2.1.3
> rbenv gem update
> gem install bundler passenger
```

新しいバージョンがインストールされて global に設定されたときに動かなくなるのを防ぐために local の指定をしてる。


Passenger の再インストール
--------------------------

```sh
> passenger-install-apache2-module
```

ビルド中に httpd.h がないと怒られたら Xcode をインストールして以下のコマンドを実行する。

```sh
> xcode-select --install
```

出てきた LoadModule なんたらを /etc/apache2/other/passenger.conf あたりに貼り付ける。

```apache
# for Passenger
LoadModule passenger_module /Users/janus/.rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/passenger-4.0.53/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
    PassengerRoot /Users/janus/.rbenv/versions/2.1.3/lib/ruby/gems/2.1.0/gems/passenger-4.0.53
    PassengerDefaultRuby /Users/janus/.rbenv/versions/2.1.3/bin/ruby
</IfModule>
```


Redmine のアップデート
----------------------

念のため、まずバックアップを取る。

```sh
mkdir ~/Desktop/redmine
cp -r files ~/Desktop/redmine/
mysqldump -u root -p mysql > ~/Desktop/redmine/mysql-$(date +%Y%m%d)
```

本体の更新。

```sh
git fetch
git rebase origin master
```

必要な gem のインストール。

```sh
rm Gemfile.lock
bundle install --without development test
```

DB マイグレーション。

```sh
rake db:migrate RAILS_ENV="production"
```

キャッシュとセッションの破棄。

```sh
rake tmp:cache:clear
rake tmp:sessions:clear
```

Apache の再起動。

```sh
apachectl configtest
sudo apachectl restart
```

これでおわり。
Docker UI動かしてみた

coreos: 472.0.0 にて実施。

サイズが小さそうなので`microbox/dockerui:latest`を選びました。

```bash:起動
docker run -d \
  -p 9000:9000 \
  -v /var/run/docker.sock:/docker.sock \
  microbox/dockerui:latest
```

http://docker-ip:9000/ にアクセスすると表示されます。
以下の操作をWebブラウザから投入できるようになった。

```bash:
docker ps -a
docker rm $CONTAINERID
docker start $CONTAINERID
docker stop $CONTAINERID
docker rmi $IMAGE
```

機能は少ないが、むしろこれだけでいい人向けか。
ポート(-p)とディレクトリ割当て(-v)も表示して欲しいところではある。

![スクリーンショット 2014-10-26 7.42.30.png](https://qiita-image-store.s3.amazonaws.com/0/25728/55c31780-c284-a3c5-a5a3-9672d1ccbd40.png)
IntelliJ IDEAでのDartの作業環境を整える


結構やることあったのでまとめておきます。
入れた後で言うのもなんですがDartEditorで十分な気がします。

### Dartのインストール(Homebrewから)

```
$ brew tap dart-lang/dart
$ brew install dart
$ brew install dartium
```

Intellijで起動すればいいだけなのでbrew linkappsはしません。
普段使うのには推奨されていないですし/Applicationsにいれるのは邪魔になることのほうが多そうです。

### Stagehandを入れる

[Stagehand](https://github.com/google/stagehand)を入れます。
これがないとプロジェクトの雛形を作れないので必須です。

`$ pub global activate stagehand`
 
ホームディレクトリに.pub-chacheができているのでパスを通します。
`export PATH="export PATH=$PATH:$HOME/.pub-cache/bin"`

`stagehand -o <app_name> webapp`といった感じで作れるようになります。

### Dart Pluginのインストール

ここからIntelliJでの作業になります。

とりあえずstagehandで何かしらプロジェクト作ってそれを開いた状態で作業すると楽だと思います。
PreferenceのPluginからDartをインストールして再起動します。
再起動後、PreferenceのDartの項目にSDKとDartiumのパスを入れます。
homebrewから入れた場合だと

+ Dart SDK Path: /usr/local/opt/dart/libexec
+ Dartium Path: /usr/local/opt/dartium/Chromium.app

で通ると思います。
下のほうに今開いているプロジェクトが表示されているはずなのでついでにチェックを入れておきます。

### デバッガの設定

Run > Edit Configurationsから+を押してJavaScript Debugを選択します。
Nameはなんでもいいです。空だとUnnamedに。
URLは`http://localhost:9000/`とか入れておきます。
~~pub serveのデフォルトポートは8080ですがsudoしないと使えないので適当に9000とかにしてます。~~ 気のせいでした、sudoが必要なのは80番です。
BrowserはもちろんDartiumです。

設定したら一度実行します。
CLI上で`$ pub serve --port 9000`した後にデバッグ実行してください。
Dartiumが起動してページが表示されたら成功です。

このときエクステンションのインストールが求められると思います(確かそうだったはず・・・)ので誘導に従います。
されなかった場合はストアからjetbrainsと検索してJetBrains IDE Supportを入れます。
これでエラーが起きた場合もIDEでのデバッグが可能になります。

### その他

Angularとかやる場合、チュートリアルにある説明通りにやろうとするとpub serveでエラーがでて試すことすらできないと思います。
その場合、pubspec.yamlを少し変更する必要があります。

```
transformers:
- angular:
    dart_sdk: "/usr/local/opt/dart/libexec"
```

\- angular:と末尾にコロンをつけること
dart_sdkの行の追加です、スペース4個いれてください。

10/29 追記: 毎回書くのめんどくさかったんでシンボリックリンクはりました。

```bash
$ cd /usr/local/opt/dart/libexec/bin
$ ln -s ../lib lib
$ ll
total 20408
-rwxr-xr-x  1 tsuguya  wheel  10421264 10 14 22:58 dart*
-rwxr-xr-x  1 tsuguya  wheel      1942 10 14 22:58 dart2js*
-rwxr-xr-x  1 tsuguya  wheel       945 10 14 22:58 dartanalyzer*
-rwxr-xr-x  1 tsuguya  wheel      1538 10 14 22:58 dartfmt*
-rwxr-xr-x  1 tsuguya  wheel      1086 10 14 22:58 docgen*
lrwxr-xr-x  1 tsuguya  wheel         6 10 29 02:34 lib@ -> ../lib
-rwxr-xr-x  1 tsuguya  wheel      1190 10 14 22:58 pub*
drwxr-xr-x  8 tsuguya  wheel       272 10 14 22:58 snapshots/
```

怒られなくなったのでとりあえずよしとします。


<br>

* * *

DartEditorだとpubspec.yamlが簡単に編集できて楽なので完全に離れられるかどうか・・・。
iBooksのEPUBファイルをAndroidで読む

#注意
このドキュメントは、AppleがiBooksで公開している「The Swift Programming Language」を私がAndroidで読むために行った手順書であり、違う環境や違うコンテンツに同じように適用できるとは限らない（適用できる可能性は高いとは思うが）。

#手順
まず大前提として、EPUBファイルはファイルである。しかし、iBooksが保持しているコンテンツは（おそらく解凍されて）ディレクトリの形で保存されている。Wikipediaによると、EPUBは必要なファイルをzipに固めたものであるらしい。しかし、一口にzipと言ってもエントリの順に制約があり、ただアーカイバで何も考えずに固めただけでは上手くいかない。詳しくは以下のドキュメントを参照のこと。

https://epubcafe.googlecode.com/svn/trunk/tutorial/OEBPS/Text/Chapter020201.xhtml

##実際の作業
まずはiBooksのディレクトリからコンテンツを引っ張ってくる必要がある。コンテンツが保存されているディレクトリは一般的に以下の場所にある。

       ~/Library/Containers/com.apple.BKAgentService/Data/Documents/iBooks/Books

このディレクトリをFinderで見ると、*.epubのようなファイル（に見えるが実体はディレクトリ）が配置されているので、必要なものを適当な場所にコピーする。

上記のドキュメントを読んでいない人間のために軽く説明すると、epubとして扱われるzipファイルには以下のような制約を満たしている必要がある。

- 圧縮や暗号化されていないmimetypeがファイルの先頭にある

これを満たすために、以下のとおりzipコマンドでアーカイブを作成する。

    cd path/to/copy
    rm iTunesArtwork iTunesMetadata.plist
    zip -0 -X ../output.epub mimetype
    zip -r ../output.epub *

これで元々のepubディレクトリと同じディレクトリにoutput.epubが出力されるので、適当に名前をつければ一般的なEPUBリーダで表示することができるだろう。

Androidであれば、Gitden Readerあたりを使うと、綺麗に表示された。
https://play.google.com/store/apps/details?id=com.gitden.epub.reader.app&hl=ja
OpenMediaVaultを日本語環境で使う為のTips

#OpenMediaVault（以下omv）で日本語入力が――
　OMVって便利な所はとことん便利だけどちょっとイジろうと思うと躓く。本家のdebianではこんなことにならないのに。

* 本家：http://www.openmediavault.org/
* 非公式プラグイン集：http://omv-extras.org/

#コンソール画面で日本語のkeymapが使用できないので

1. rootでログイン
2. apt-get update
3. apt-get install console-setup -y
4. apt-get upgrade -y
5. dpkg-reconfigure console-data

これでWizard画面の通りに希望のキーマップを選べば良い。OMV単体には日本語のキーマップが入っていないのでちょっと苦労した。

#仮想環境内でiSCSI Target

　これは出来るのかというと、安定しないようだ。

| VM host    | Result | Remarks |
|:-----------|------------:|:------------:|
| VMWare ESXi |  crash |     on AMD machine |
| VirtualBox |      not tried |    |
| KVM|        not tried |     |
| OpenVZ |   not tried |           |
| VirtualPC |   not tried |   |
| aligned    |    not tried | |
ImageMagickで自炊画像の黄ばみを一発除去

黄ばみ除去自体の方法はあったけどImageMagickで上書きせずにディレクトリを一括変換する方法まで合わせて載ってなかったので紹介しときます。

```
mogrify -path c:/tmp -channel Red -separate *.jpg
```

で`c:\tmp`に出力されます。パスの区切りにスラッシュを使ってるのは`nyaos`を使ってるからです。`cmd.exe`とか辛くて使えません。

あと`ImageMagick`自体のインストールはChocolateyで`cinst imagemagick`で出来ます。


```:~/_nya
set ImageMagick="C:\Program Files\ImageMagick-6.8.9-Q16"
set PATH+="C:\Program Files\ImageMagick-6.8.9-Q16"
```

とか追加しとくと色々と幸せかもしれません。

### 参考

「黄ばみも真っ白」って洗剤のCMみたいなこと言ってるんじゃないわよの巻 | booKNOW(ブックなう)
http://booknow.jp/laboratory/20110825rgb/
gitで空コミットするにはgit commit --allow-empty


しばらく使ってないと忘れるので自分用メモ

##snippet

git commit --allow-empty
git commit --allow-empty -m ""

## 備考

利用法としては以下のようなプルリク作成など
http://qiita.com/a-suenami/items/129e09f8550f31e4c2da
Ansibleでシェル設定の再読み込みが必要になった場合の対応


Ansibleでシェルの設定ファイル(以下、bashを使用する前提で記述する)に設定の追加が必要なソフトウェア(rbenvやnodebrew, VirtualenvWrapperなど)をインストールする場合、以下のように書いても上手く動作しない。

```
    # ~/.bashrc(~/.bash_profile) にrbenvの設定を追記する
    - name: Set rbenv config
      copy: src=files/bashrc dest=~/.bashrc
    # ~/.bashrcに書き込んだ設定を読み込む
    - name: Load rbenv setting
      shell: source ~/.bashrc executable=/bin/bash
    - name: Install ruby 2.1.2
      shell: rbenv install 2.1.2 && rbenv rehash && rbenv global 2.1.2 executable=/bin/bash
```

上記の例では`rbenv install`を実行する時点で`source ~/.bashrc`の結果が反映されていない(別シェルで起動)ため、`rbenv`コマンドが見えずにエラーとなる。

*同様の内容の記事では、`.bash_profile`ではなく`.bashrc`(bash起動時に毎回読み込み)に必要な設定を書き込むことで上手くいったとの事だが、自身の環境では`.bashrc`に書き込んだ際も上手くいかなかった。
http://qiita.com/volanja/items/3a263ab8df34af6870d5

bashの設定をコマンド実行時に反映させたい場合、lオプションによりログインシェルとして起動する必要がある。

```
    # ~/.bashrc(~/.bash_profile) にrbenvの設定を追記する
    - name: Set rbenv config
      copy: src=files/bashrc dest=~/.bashrc
    # lオプションによりログインシェルとしてbashを起動する
    - name: Install ruby 2.1.2
      shell: /bin/bash -lc "rbenv install 2.1.2 && rbenv rehash && rbenv global 2.1.2"
```


(ref.) https://github.com/zzet/ansible-rbenv-role/blob/master/tasks/main.yml#L116
とりあえずMacのストレージを空けたい時の対処

ストレージの空き容量を空ける方法として、
iTunesからiOSデバイスのバックアップを削除する方法がある。

```
iTunesの「環境設定」＞「デバイス」＞「デバイスのバックアップ」でバックアップされているデバイスの名前と日付を確認し、不要なバックアップについては選択して「バックアップを削除」
```

右側の列の日時は、最後に同期した日付を示すので、バックアップデータがどの程度新しいかがわかる。

ちなみにバックアップの保存先は以下になっているので、メニューの「移動」＞「フォルダへ移動」でも移動できる。

```
~username/Library/Application Support/MobileSync/Backup/
```
※usernameは適宜変更してください。
AngularDart入門 第4回 既存のHTML要素を拡張する

[第3回](http://qiita.com/laco0416/items/1e969a20c92b9e3c0a3c)ではコンポーネントについて解説しました。今回はデコレーターについて詳しく説明します

今回の元記事は[4. Creating a Custom Decorator](https://angulardart.org/tutorial/06-ch04-directive.html)です。

今回は次のようなツールチップ用の独自属性を定義します。

```html
<span tooltip="tooltipForRecipe(recipe)">
  ...
</span>
```

# まずはサンプルアプリを動かしてみよう
[こちら](https://github.com/angular/angular.dart.tutorial/tree/master/Chapter_04)にサンプルアプリのソースコードがあります。リポジトリをクローンして、**Chapter_04**ディレクトリで`> pub serve`すればサンプルアプリが起動します。

![Imgur](http://i.imgur.com/UtZWy8i.png)

第3回と同様にレシピ一覧とその詳細が表示されます。また、一覧のアイテムにマウスを乗せるとツールチップが表示されます。

# デコレーターの作成
ツールチップ用のデコレーターの作成は次の手順で行います。

- 2つのクラスの追加 : Tooltip(デコレーターの実装クラス)とTooltipModel(データを持つモデル)
- RecipeBookComponentの変更 : レシピからツールチップのモデルを作成
- web/main.dartでTooltipの登録
- ツールチップのデコレーターを使う

# デコレーターの定義
デコレーターは次のように定義します。

```dart
...
import 'package:angular/angular.dart';

@Decorator(selector: '[tooltip]')
class Tooltip {
  final dom.Element element;

  @NgOneWay('tooltip')
  TooltipModel displayModel;
  ...
  Tooltip(this.element) {
    ...
  }
  ...
}
```

前回も説明したとおり、`selector`にはコンポーネントを表すCSSセレクタを指定します。上の例では`[tooltip]`はDOM属性として定義されています。また、`tooltip`属性(この場合自分自身)の値は`displayModel`に対してHTMLからDartへの一方通行のバインディングを定義しています。このデコレーターは次のように呼び出すことになります。

```html
<span tooltip="tooltipForRecipe(recipe)">
```

デコレーターのコンストラクタは、そのデコレーターが適用されたDOM要素が表示された際に呼ばれ、コンストラクタの引数として`Element`型のインスタンスが与えられます。

# デコレーターによるDOMの操作
ツールチップの実装の中で最も重要なのは`<div>`要素を作成し、DOMに追加している部分です。マウスオーバーのイベントが発生するとコールバックでこの処理が実行されます。

```dart
import 'dart:html' as dom;
...
// In an onMouseEnter handler:
tooltipElem = new dom.DivElement();

// ...Create children using info from displayModel...
// ...Add the children to the <div>...
// ...Style the <div>...

dom.document.body.append(tooltipElem);
```

**重要** デコレーターでDOMを操作する際は次のことに気をつけましょう

- DOMの操作はコンストラクタ **以外**で行う
- Angularが管理している要素は破棄しない

AngularはDOMの全体を管理しているので、コードで直接DOMを操作する際は十分注意しましょう

ツールチップのデータモデルは次のようになっています

```dart
class TooltipModel {
  String imgUrl;
  String text;
  int imgWidth;

  TooltipModel(this.imgUrl, this.text, this.imgWidth);
}
```

# ツールチップのモデルを生成する
recipe-bookコンポーネントでレシピのデータからツールチップのモデルを生成します。

```dart
class RecipeBookComponent {
  ...
  static final tooltip = new Expando<TooltipModel>();
  TooltipModel tooltipForRecipe(Recipe recipe) {
    if (tooltip[recipe] == null) {
      tooltip[recipe] = new TooltipModel(recipe.imgUrl,
          "I don't have a picture of these recipes, "
          "so here's one of my cat instead!",
          80);
    }
    return tooltip[recipe]; // recipe.tooltip
}
```

ここで[Expando](https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:core.Expando)を使っているのは実装上の工夫です。`Expando`はすでに存在するオブジェクトに新たなプロパティを関連付ける方法の一つです(この場合は`Recipe`に`TooltipModel`を関連付ける)。

# コンポーネントとデコレーター
デコレーターは属性としてのコンポーネントと似ていますが、デコレーターにはスコープが無いという点が大きく違います。デコレーターは単にHTML要素に新しい機能を追加するだけの修飾でしかありません。

# まとめ

- デコレーターは既存のHTML要素を拡張する
- デコレーターはスコープを持たない
- DOMを直接操作する際は注意する

[第5回](http://qiita.com/laco0416/items/08ddc2f674b2407f0669)は[5. Introducing Formatters and Services
](https://angulardart.org/tutorial/07-ch05-filter-service.html)を元にバージョン1.0に置き換えて解説します。
Sencha Touch 2.4.0 のテーマをコンパイルするときにエラー

Sencha Touch 2.4.0 を試してみてます。
Sencha Cmd 5.0.3 を使って新規アプリのセットアップをし、最初の何にもない画面ができたところで、今風のフラットデザインにするべく、

**Sencha Touch Flat UI Theme**
(http://dev.ariel-networks.com/wp/archives/3816)

を使わせてもらおうと思いました。

Compass によるSCSSのコンパイルが必要なので、Compassをインストールして、説明の通りファイルをセットアップして、コンパイル。

```
$ compass compile resources/sass/
```

残念ながらエラーで止まります。

> error resources/sass/app.scss (Line 3 of touch/resources/themes/stylesheets/sencha-touch/_base.scss: File to import not found or unreadable: blueprint/typography.

いろいろ調べて見つけたのがこれ。http://compass-style.org/CHANGELOG/

> 0.13.alpha.8 (10/21/2013)
>
> The blueprint framework has been removed from compass. The docs are now at compass-blueprint.org and the code is maintained as its own project by Stephen Way. Full details can be found on the blog.

Compass のバージョンは、1.0.1だったのですが、そのままではコンパイルできなかったので、アンインストールして、古いバージョンを入れました。

```
$ sudo gem uninstall compass
$ sudo gem uninstall sass
$ sudo gem install compass --version 0.12.7
```

無事コンパイルできるようになりました。

実際はここまで来るまでに、Compass 1.0.1 のままで、gemを追加したり、パスやソースを修正したりしてみたのですが、結局コンパイルが通るところまでたどり着きませんでした。
Selenium win8 ie11 setting

・インターネットオプション→セキュリティタブ→ゾーン毎に保護モードのチェックを外す
・Rgedit 登録
とあるが、テストシナリオにHTTPからHTTPSへ動作するような場合、うまくいかない場合がある。
このとき、対象URLを信頼出来るURL一覧に追加する事によって回避できる場合がある。
・インターネットオプション→セキュリティタブ→サイト→詳細設定→このWEBサイトをゾーンに追加する
投稿タイプのタグ名をクリックすると、そのタグが付けられた投稿の一覧ページを表示できる Google Chrome 拡張を作りました

## 概要
プロフィールページの投稿タイプには、そのユーザーが投稿した記事に付けられたタグの統計が表示されていますが、それぞれにリンクは貼られていません。この拡張機能は、そのタグ名をクリックできるようにして、クリックするとそのタグが付けられた投稿の一覧ページに遷移できるようになります。インストールするだけで動作します。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/16758/13c026ee-7187-bbb4-6108-f1e6aa4afc63.png)

これは @tbpgr さんが要望として投稿されていた機能の一部を Google Chrome 拡張にしたものです。
http://qiita.com/tbpgr/items/10df8c74cb699059b969

## Chrome ウェブストア
https://chrome.google.com/webstore/detail/improvetaglist-for-qiita/oeicblbkfdbhicfmfaplefglpkjmbblj?hl=ja

## GitHub
https://github.com/suzuki86/ImproveTagListForQiita
Yosemiteの通知センターに追加できない。


Yosemiteをインストールしたら、通知センターの編集でSNS以外表示されない。
天気とか株価とか電卓とか、いろいろ追加できるはずが何もない。。。

##天気・株価・電卓・世界時計のウィジェットを追加

```
/System/Library/Frameworks/NotificationCenter.framework/PlugIns
```

上記のフォルダーに.appexファイルがあるので、ダブルクリックすると追加される。
※小窓が開くが閉じてOK

##SNSのウィジェットでSNSアカウントの追加ができない

SNSのウィジェットで、「SNSアカウントがありません。」と表示されて、SNSアカウント追加のボタンが表示さない。

```
/System/Library/PrivateFrameworks/ShareKit.framework/Versions/A/PlugIns/
```

上記フォルダの中に、FacebookやTwitterのアプリ拡張機能があるので、ダブルクリックする。


```
環境設定 > 機能拡張 > 共有メニュー
```

で有効にしたいものにチェックを入れると、SNSにサービスのボタンが追加される。

##参考サイト

* [Apple サポートコミュニティ Yosemite　通知センター](https://discussionsjapan.apple.com/thread/10153370?start=0&tstart=0)
Excel(VBA)マクロでセルの値を取得する基本セオリー

最近ときどき仕事で依頼されて、Excelのマクロを組む機会があります。
せっかくなので改めて便利だなぁと思ったExcelVBAの内容なんかをまとめておきます。

Win8 Excel2013で動作しましたが2003〜とかなら問題ないはずです。

##１．セルの値取り出しの定石
特定のファイルからデータを抽出するようなツールでは想定外の文字が入っていることがあります。
念の為取得後は値判定などの前に下記のような処理を挟んで柔軟性を上げておくと良いです。

```vbnet:ExcelVBA
Dim strBuf As String

With ThisWorkbook.Sheets("sheet1")     ' 操作シートを指定（複数使う場合は有用）
  strBuf = .Cells(1,1).value            ' 値を取り出し
  strBuf = Trim(strBuf)                 ' トリミング：前後の空白抜き出し
  strBur = Replace(strBuf, vbLf, "")    ' 置換：改行削除
  strBuf = strConv(strBuf, vbNarrow)    ' コンバート：全角文字を半角文字へ変換
  strBuf = strConv(strBuf, vbUpperCase) ' コンバート：小文字を大文字へ変換

  MsgBox strBuf
End With
```

なお、アサーションチェックなども必須で使いましょう。
ExcelVBAでは`Debug.Assert [評価式]`と書いておけば式が偽になった時点で処理が止まります。

##２．文字列の抜き出しの定石
基本的にMid()とInStr()が使えれば大体対応可能です。
Mid()は文字列の前から何文字目から、何も自分文字列を取り出すという使い方をします。
（第三引数を省略すると指定文字位置から最後まで取得してくれる。）
InStr()で特定の文字が幾つ目にあるかを探してそのまま渡すことが多いです。

【例】括弧で囲まれたメールアドレスの取得、ホスト・ドメインの分割

```vbnet:ExcelVBA
Private Sub CommandButton1_Click()
  Dim stBruf As String, email As String, host As String, domain As String
  strBuf = "メールアドレス (email@gmail.com)"

  email = blockTrim(strbuf)
  host  = Mid(email, 1, InStr(email, "@") - 1)
  domain = Mid(email, InStr(email, "@")+1)

  MsgBox "email :" & email & vbCrLf & _
         "host  :" & host & vbCrLf & _
         "domain:" & domain
'        #=> email : email@gmail.com
'            host  : email
'            domain: gmail.com
End Sub

Function blockTrim(ByVal strBuf As String) As String
  Dim trimStart, trimEnd As Integer
  strbuf = StrConv(strBuf, vbNarrow)

  trimStart = InStr(strBuf, "(") + 1
  trimEnd = InStr(strBuf, ")") - trimStart    ' メールアドレスの長さ取得
  If trimEnd <= trimStart Then               ' ")"が無い場合などのエラー避け
    blockTrim = ""
    Exit Function
  End If
  blockTrim = Mid(strBuf, trimStart, trimEnd) ' トリミングした文字列返却
End Function
```


取り敢えず基本は大事ですね。
Gemfile.lockをLinuxとMacで分ける

# 前置き
## メリット
### 異なるOSでもgemが保証される。
* 「OSごとに違うgemを入れなきゃ、でもそうするとGemfile.lockが衝突するからリビジョン管理から外そう」　⇒　知らぬ間にデプロイ先で不適切gemが使われる　⇒　予期せぬ事態  
  の、__リスク解消__。大事。

## デメリット
### bundleコマンドやWebrick起動がめんどくさくなる。
* `bundle install --gemfile=path/to/Gemfile`したり
* `cd path/to/Gemfile`してから実行しないといけなかったり
   * なぜかbundle install以外のbundleコマンドには`--gemfile`オプションがない。

### RAILS_ROOTにGemfileが在る前提じゃないと動かないライブラリがあったりする。
* ソースまで見て「だから動かないのかｸｿ・・・！」とか。

### __ハマる。__
* 自動デプロイとかで間違いなくハマる。しかも前例が見つからない。つらかった。

## ので、導入・保守・効果コストを理解した上で行う。

## ポイント
* Gemfile.lockは、Gemfileが在る場所に作成される。
* LinuxとMacで、Gemfile.lockのディレクトリを分ける。
    * GemfileもGemfile.lockもふたつ。
* 環境変数`RUBY_PLATFORM`が、LinuxとMacで異なることを利用する。
    * Linuxだと`linux`、Macだと`darwin`という単語が入り込んでいる。


## やり方
* Gemfileの置き場所を、`RAILS_ROOT`直下**ではない**場所にする。
    * `linux`, `darwin`だけが違うディレクトリを2つ作る。たとえば、
        * gemfiles/darwin/
        * gemfiles/linux/
    * それぞれに`Gemfile`, `Gemfile.lock`を配置する。

```bash
# 配置イメージ
├── README.md
├── Rakefile
├── app
├── bin
├── config
│   ├── application.rb
│   └── boot.rb
├── db
├── gemfiles
│   ├── darwin
│   │   ├── Gemfile
│   │   └── Gemfile.lock
│   └── linux
│       ├── Gemfile
│       └── Gemfile.lock
├── lib
├── log
├── public
├── spec
└── vendor
```

* アプリケーションがbundleを正しく読み込めるよう、application.rbに追記する。

```rb:config/application.rb
require File.expand_path('../boot', __FILE__)
 
require 'rails/all'
require 'bundler' # 追記
 
# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)
 
platform = RUBY_PLATFORM.match(/(linux|darwin)/)[0].to_sym # 追記
Bundler.require(platform) # 追記

...
```

* boot.rbにも追記する。

```rb:config/boot.rb
#ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) # もともとあるのでコメントアウト
platform = RUBY_PLATFORM =~ /darwin/ ? 'darwin' : 'linux' # 追記
ENV['BUNDLE_GEMFILE'] ||= File.expand_path("../../gemfiles/#{platform}/Gemfile", __FILE__) # 追記
```

* 【一方のGemfile】分けたいgemに、ifやgroupを追加する。

```rb:gemfiles/darwin/Gemfile
...
# for Mac
group :darwin do
  gem 'libv8', '3.16.14.3' if RUBY_PLATFORM=~ /darwin/
end

# for Linux
group :linux do
  gem 'libv8', '3.3.10.4' if RUBY_PLATFORM=~ /linux/
end
...

if RUBY_PLATFORM=~ /linux/
  gem 'therubyracer', '0.10.2', platforms: :ruby
else
  gem 'therubyracer', platforms: :ruby
end
...
```

* 【もう一方のGemfile】下記のみにする。

```rb:gemfiles/linux/Gemfile
eval(Pathname(File.expand_path('../../darwin/Gemfile', __FILE__)).read) # linuxとdarwinは適宜。
```

## 動作確認

bundle install 例

```bash
bundle install --gemfile=gemfiles/darwin/Gemfile # Mac
bundle install --gemfile=gemfiles/linux/Gemfile # Linux
```

それぞれ正常に読み込まれ、別々にGemfile.lockが更新されたらOK！
※最初は、Gemfile.lockを退避なり削除なりしてから実行したほうがよいかも。

bundle list 例

```bash
# Mac
cd gemfiles/darwin
bundle list

# Linux
cd gemfiles/linux
bundle list
```

bundle update等々も同様。ちなみにbundle installもこれで出来る。


# 最後に
* 開発はMac、デプロイ先はCentOS、だからこの努力はきっと必要なはず・・・！
* Gemfileってただのrubyスクリプトなんだなぁと。
* Gemfile読み込みは、シンボリックリンクにしていたこともあるが、何かの拍子に何故か実ファイルになってしまったり、Winが入ってきたら対応できないよなぁと思ったりで、やめた。
* 思い出しながら書いているので抜け漏れあったらごめんなさい。
RecyclerViewで行間に区切り線を表示する

こんにちは  
[@wasabeef_jp](https://twitter.com/wasabeef_jp) です

引用：http://wasabeef.jp/recyclerview-itemdecoration/

近年、ListView2といわれる**RecyclerView**を使うことが増えてくると思います  
ListViewでは、下記のようにListViewを定義するxmlで区切り線(divider)の
設定が安易にできると思います

```xml
android:divider="#000000"
android:dividerHeight="2sp"
```

RecyclerViewでは、xmlで定義するのではなく
**Java側で設定する必要がある**ので、その簡単なtipsをご紹介します。


RecyclerViewをそのまま使うと、下記のような区切り線(divider)が無いリストになります
![xrecyclerview_divier1.png.pagespeed.ic.gh7fvrCQXv.png](https://qiita-image-store.s3.amazonaws.com/0/12099/9208b407-036f-0fe0-6cbb-7d7f5ee186db.png)


そこで、登場するのが**RecyclerView.ItemDecoration**です。  
RecyclerView.ItemDecorationを継承した自作のクラスを定義し  
**onDraw**で、dividerを描画してあげると綺麗に表示されます。

```java
public class DividerItemDecoration extends RecyclerView.ItemDecoration {

    private static final int[] ATTRS = new int[]{
            android.R.attr.listDivider
    };

    private Drawable mDivider;

    public DividerItemDecoration(Context context) {
        final TypedArray a = context.obtainStyledAttributes(ATTRS);
        mDivider = a.getDrawable(0);
        a.recycle();
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        drawVertical(c, parent);
    }

    public void drawVertical(Canvas c, RecyclerView parent) {
        final int left = parent.getPaddingLeft();
        final int right = parent.getWidth() - parent.getPaddingRight();

        final int childCount = parent.getChildCount();
        for (int i = 0; i < childCount; i++) {
            final View child = parent.getChildAt(i);
            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
                    .getLayoutParams();
            final int top = child.getBottom() + params.bottomMargin;
            final int bottom = top + mDivider.getIntrinsicHeight();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }

    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
    }
}
```

定義した自作クラスを**addItemDecoration**で追加してあげると
```language-java
mRecyclerView.addItemDecoration(new DividerItemDecoration(context));
```

こんな感じで表示されます。

![xrecyclerview_divier2.png.pagespeed.ic.jV90of19X-.png](https://qiita-image-store.s3.amazonaws.com/0/12099/ce4dcf07-d524-f134-9e10-f9ee2f85547b.png)


### 雑感

簡単なDividerを表示する場合は、ListViewより手間になるのですが  
奇数偶数でDividerの表示を変えたり、点線のDividerを追加するなど自由度が高くなりました。
ニフティクラウド Automation + ESS で Jenkins による CI 環境を構築してみた

## はじめに

本記事では、ニフティクラウド上に Jenkins サーバーを構築し、1 日 1 回自動でシナリオテストを実行させ、テストが失敗したらメールで通知する仕組みを作ってみます。

これにより、「リリース前にテスト環境へデグレードを検知する」「リリース後に本番環境へ継続的にランニングテストを行い、本番環境でしか再現しないような不具合を検知する」といったサイクルを回すことができます。

今回、構築にはニフティクラウドエンジニアリングパーツの Automation と ESS を利用するため、すべての作業はサーバーへログインせず、コントロールパネルから行うことができます。

## 前提

Jenkins サーバーは west-1 リージョンの west-11 ゾーンに構築するものとします。

## Automation で Jenkins サーバーの構築

まずは Automation で Jenkins サーバーを構築します。
事前作業として Computing 側で SSH キーを作成しておく必要があります。
また Jenkins が利用する 8080 ポートの許可を Automation が作成した w11autcstfw に追加しておいてください。

* スタック作成
  * スタック名: jks
  * メモ: Jenkins サーバー
  * OS イメージ: CentOS 6.3 64bit Plain
  * リージョン: west-1
  * ゾーン: west-14
  * SSH キー: (あらかじめ作成しておいた SSH キー)
  * カスタム Cookbook 利用: ON
  * リポジトリ種別: Git
  * リポジトリ URL: git://github.com/tily/automation-jenkins-cookbooks.git
  * リポジトリ SSH キー: (設定しない)
  * ブランチまたはリビジョン名: (設定しない)
  * カスタム JSON: (設定しない)
* レイヤー作成
  * タイプ: カスタム
  * カスタムファイアウォールグループ: w11autcstfw
  * 名前: jenkins
  * 短縮名: jenkins
  * メモ: カスタム Jenkins レイヤー
  * Chef 設定
    * setup カスタムレシピ: jenkins::java, jenkins::master
  * (その他はデフォルトのまま)
* サーバー作成
  * (すべてデフォルトのまま)

サーバーが作成できたら、起動ボタンをクリックし、サーバーの起動を行います。
コントロールパネルからサーバーのグローバル IP を取得し、http://{サーバーのグローバルIP}:8080 にアクセスしてみてください。下記のような画面が表示されれば成功です。

![](http://i.gyazo.com/e88e84d4d2321df4ab58d9b610cc773c.png)

## Jenkins 設定

このままだと誰でもログインせずに利用できてしまうアンセキュアな状態なので、セキュリティの設定を行います。

* パスワード認証ぐらいはいれる
** LDAP にしてみるといいかもしれません
** あとファイアウォールのルールで社内からのみアクセスとかにしたほうがいいです

## Jenkins に Git プラグインをインストール

左メニューの Manage Jenkins を選択

Manage Plugins
Filter に git plugin と入力
Git Plugin (一番名前の短いもの) をインストール

## ニフティクラウド ESS でメール通知の設定

## 手元でテストを書き、実行してみる

API のテスト

<pre>
[root@localhost api-test-sample]# export PATH=$PATH:/opt/chef/embedded/bin/
[root@localhost api-test-sample]# bundle
</pre>

http://i.gyazo.com/600cdc1f30459dbffcd0d6e311fc86bf.png

## まとめ