OmniAICreator/Qiita-1.07M huggingface dataset:
RaspberryPi2でプライベートクラウド（１） --Ubuntuのインストール--

複数のRaspberryPi2（以降はRpi2と表記）でプライベートクラウド環境を構築します。
まずはOSの選択ですが、RaspbianではなくUbuntuを使用します。理由は次回以降に説明します。

・公式サイトに掲載されているUbuntuはそのままでは使いにくいのでこちらの[サイト](https://wiki.ubuntu.com/ARM/RaspberryPi)からイメージをダウンロードしてください。最新版は「2015-04-06-ubuntu-trusty.zip」です。

・ダウンロードしたファイルを適当な場所で展開してください。展開したフォルダの中には「2015-04-06-ubuntu-trusty.img」がありますので、このファイルをRaspbianなどと同じようにMicroSDに書き込んでください。

・書き込みが終了したら、Rpi2にMicroSDを挿し変えて電源を入れます。しばらくすると、問題がなければログインプロンプトが表示されます。

・ID:ubuntu/PW:ubuntuでログインできます。

・Raspbianのようにディスク容量を拡張してくれないので手動で拡張します。

```shell:console
ubuntu@ubuntu:~$sudo fdisk /dev/mmcblk0
[sudo] password for ubuntu:

Command (m for help): d
Partition number (1-4): 2

Command (m for help): n
Partition type:
   p   primary (1 primary, 0 extended, 3 free)
   e   extended
Select (default p): p
Partition number (1-4, default 2): 2
First sector (133120-30965759, default 133120):
Using default value 133120
Last sector, +sectors or +size{K,M,G} (133120-30965759, default 30965759):
Using default value 30965759

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
ubuntu@ubuntu:~$
```

一旦リブートします。

ログイン後ファイルシステムを拡張します。dfコマンドで拡張されたか確認します。

```shell:console
ubuntu@ubuntu:~$ sudo resize2fs /dev/mmcblk0p2
[sudo] password for ubuntu:
resize2fs 1.42.9 (4-Feb-2014)
Filesystem at /dev/mmcblk0p2 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/mmcblk0p2 is now 3854080 blocks long.

ubuntu@ubuntu:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/mmcblk0p2   15G  521M   14G   4% /
devtmpfs        458M  4.0K  458M   1% /dev
none            4.0K     0  4.0K   0% /sys/fs/cgroup
none             93M  268K   93M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            462M     0  462M   0% /run/shm
none            100M     0  100M   0% /run/user
/dev/mmcblk0p1   64M   20M   45M  31% /boot/firmware
ubuntu@ubuntu:~$
```

・あとは```apt-get update```,```apt-get upgrade```を実行してシステムを最新の状態にしておきましょう。

・インストールしたイメージは最小構成なので必要なコマンドなどは適宜インストールしましょう。

・SSHサーバはあった方がいいのでインストールしておきましょう。

```shell:console
ubuntu@ubuntu:~$ sudo apt-get install openssh-server
```

今回はここまでとします。
次回はクラウド環境の構築をしてみたいと思います。
UIViewControllerのライフサイクル


###UIViewControllerのライフサイクル
***

* -(void)loadView<br>
nib=xibなどを使用しない場合にカスタムViewの初期化を行う場所。

***

* -(void)viewDidLoad<br>
アプリを起動後、最初に画面を表示する時。(一回のみ)。
viewがロードされた後に呼び出される。InterfaceBuilderを使用している場合は、
一般的にサブビューのセットアップを行う。

***

* -(void)viewWillAppear<br>
画面が表示される直前

***

* -(void)viewWillLayoutSubviews<br>
レイアウト処理開始時

***

* -(void)DidLayoutSubviews<br>
レイアウト処理終了時

***

* -(void)viewDidAppear<br>
画面が表示された直後

***

* -(void)viewWillDisappear<br>
画面が消える直前

***

* -(void)viewDidDisapper<br>
画面が消えた直後

***
参考[https://rdkw.wordpress.com/2013/02/24/ios-uiviewcontroller-lifecycle/](https://rdkw.wordpress.com/2013/02/24/ios-uiviewcontroller-lifecycle/)
Vagrantのプラグイン(vagrant-hostsupdater)のインストールにコケたことがあった。

![Kobito.Gvh5xc.png](https://qiita-image-store.s3.amazonaws.com/0/58800/a2384bbb-cda8-d35c-7055-403062a944e1.png "Kobito.Gvh5xc.png")


恥ずかしいけど、失敗を晒すことで忘れないとかそういうの大切だよねとか思って書く。
Vagrantのプラグインにあたるvagrant-hostsupdaterをインストールしようとしたらMacBook Proでうまくいかずに、MacBook Airで何事も問題なかったという事案が発生した。  
ちなみに、これ使おうって思ったのは前の記事で紹介したVCCWをはじめてさわったときです。VCCWって何って人は前の記事読んでみてください。
[WordPressをVagrant環境にらくらくインストールする。 - VCCW](http://qiita.com/naru0504/items/58011181f2c271808c7f/?fr=vhu_h)

## 結論
結論から先に述べておくと。  
Vagrantのバージョンがダメだった。
現在はGUIでいちいちサイトに行ってダウンロードするのが面倒だと感じたので、brew-caskで落としてます。  

## 何に困ったのか。
恥ずかしながら明かすと、原因がVagrantのバージョンだと気付くのに半日くらいかかった。  
なぜこんなに困ったのかの経験をシェアするんだけど、失敗体験に興味ない人は読まなくてよい文章です(笑)  

### エラー表示から「原因はnokogiriがインストールされてないからだ」って言われた。
なんと画像を撮り忘れているので、正確な文章は書けない。しかし、原因はnokogiriあるいはbundlerにあると言われた。bundlerやnokogiriといえばgemでインストールするソフトウェアである。悲しいことに本当にMBPの方にはインストールされていなかった……。  
おかげさまで、原因はbundlerかnokogiriにあると思った。あるいはそうではないにしろ、gemやRuby、あるいはRubyのパッケージ管理ソフトrbenvにあるのではないだろうかという間違った仮説を立ててしまった。非常にツラい。  

### nokogiriインストールに困ったちゃん  
``` gem install nokogiri ``` でうまくいかない。  
困る。非常に困る。ぐぐってもなかなか解決策が見つからない。  
最終的に見つけた解決策が『怒涛のパス指定しまくりインストール』  

```
gem install nokogiri -- --use-system-libraries --with-iconv-dir="$(brew --prefix libiconv)" --with-xml2-config="$(brew --prefix libxml2)/bin/xml2-config" --with-xslt-config="$(brew --prefix libxslt)/bin/xslt-config"
```

なりふり構わずにやった。Googleには本当に私が求める最適解を提供してほしいと思うじょうほうじゃくしゃのゆとりっぷりである。  

### bundlerのインストールに何も困らなかったマン
特につまずいた記憶がない。  

```
gem install bundler
```

``` gem list ``` をたたくとbundlerもnokogiriも両方とも掲載されている。  
「きっとこれで問題ないはず。」  

**結果:だめ**

```
gem update --system
gem update
gem cleanup
```

とかここらへん叩いてアップデートさせようとしてもダメ。

## MBPとMBAの環境差を比べてみた。
Rubyのバージョン (MBP : 2.2.0とMBA : Ruby 2.0.0系のなんかの違い)  
Rubyのインストール方法( MBP : rbenvとMBA : OS標準の違い )  
もちろん前述したまちがった仮説のせいでVagrantのバージョンなのでは？という発想はもう出てきていないのである。  

### Rubyのバージョンがダメとかいう仮説
MBPのRubyのバージョンを下げてやってみた。この際だからいっそ2.1.6でできたらよいとも思い、2.0.0に加えて2パターン試した。  
こういうときにrbenvで管理するのは便利である。rbenvサイコー。  

**がダメ。**  

rbenvクソかよ。(って気分になった。立てた仮説の残りの選択肢ひとつだもん仕方ないよね。)  

### rbenvがダメとかいうどうしようもない仮説
rbenvにさよならバイバイした。  

**ダメ**  

正直、rbenvしかりnodebrewしかりパッケージ管理ツールが原因だなんてことはそうそうないのである。  
つまり、rbenvサイコー。  

### 原点回帰
「つーかVagrantのプラグインなんだからVagrantのバージョン確認してみろや」ってなった。  
MBP1.6.2とMBA1.6.5の差。  
マイナーアップデートでこの差が生まれるかに多少の疑問を抱きながらやってみた。  

**できた！**

バージョン管理とかそういうの気をつけようねとかいうアレな記事でした。

[vagrant-hosts-updater](https://github.com/cogitatio/vagrant-hostsupdater)

[WordPressをVagrant環境にらくらくインストールする。 - VCCW](http://qiita.com/naru0504/items/58011181f2c271808c7f/?fr=vhu_f)
Redmine + Markdown でアンスコを含む添付ファイルにリンク

Redmine はチケットの説明や注記で `attachment:filename` のように記述するとチケットの添付ファイルにリンクできます。

がしかし、ファイル名にアンダースコアが２個以上含まれているとうまくリンクされません。例えば次のようなのはダメです。

```
attachment:あいうえお_かきくけこ_さしすせそ.pdf
```

![01.png](https://qiita-image-store.s3.amazonaws.com/0/8734/14634b70-7c9e-0427-f699-40751348316e.png)

バックスラッシュでエスケープしてもダメなものはダメです。

```
attachment:あいうえお\_かきくけこ\_さしすせそ.pdf
```

![02.png](https://qiita-image-store.s3.amazonaws.com/0/8734/cd69d7ab-2942-017b-d76b-c953e84993f8.png)

ダブルクオートでクオートしつつ、バックスラッシュでエスケープすれば大丈夫です。

```
attachment:"あいうえお\_かきくけこ\_さしすせそ.pdf"
```

![03.png](https://qiita-image-store.s3.amazonaws.com/0/8734/fc72aa11-59bc-a534-4513-c855e8d4f898.png)
SmartEyeGlass開発環境整備抜粋

# はじめに 
SmartEyeGlass開発を始めましたが情報が少なく、　
インストールの備忘録として。
対象としては、すでにAndroid開発を行ってる人で、
SmartEyeGlassをやってみたいという人を対象にしています。
なお、SmartEyeGlassの実機がなくても
Android実機があればエミュレータで動作が確認できます。

# 関連リンク  
日本語サイト: http://developer.sonymobile.com/ja/smarteyeglass/
インストールガイド:https://developer.sony.com/develop/wearables/smarteyeglass-sdk/
API: https://developer.sony.com/reference/seg-sdk/packages

私は 
- 開発環境はOSX10.10.3 、AndroidStudio
- 実行環境Nexus9、AquosZeta  
で開発しています。
# Android開発環境整備  
インストールが楽なのと、一部ライブラリのインポートが楽なので
eclipse→AndroidStudioに移行しました。



# SmartEyeGlassプラグインインストール 
SDKマネージャーを起動し、Tools→Manage Add-On Sites...をクリック
![スクリーンショット 2015-05-21 14.35.54.png](https://qiita-image-store.s3.amazonaws.com/0/37148/174fd12a-db7b-f40c-7e8e-87bafb56c614.png)


  
User Defined Sites のタブを押し、NEW→(http://dl.developer.sony.com/wearables/sdks/Sony-SmartEyeglass-SDK.xml)          を入力しOKを押す

![スクリーンショット 2015-05-21 14.39.01.png](https://qiita-image-store.s3.amazonaws.com/0/37148/a05fa183-15c0-30da-1f5c-853b6bcd3bda.png)



Andoid4.4.2にSony SmartEyeGlass SDKが追加されるので、これにチェックをいれてインストールをする。
![スクリーンショット 2015-05-21 14.45.12.png](https://qiita-image-store.s3.amazonaws.com/0/37148/002a3f5a-433d-d8ae-14ee-c882d175c1f4.png)
  

# エミュレーターの作成とサンプルアプリのインストール  
Android上で動作するSmartEyeGlassのエミュレーターと付属のサンプルをインストールします。 
adbコマンドが使えない場合は、必ず使えるようにしておいてください。

Google Playより、
以下をスマートフォン・タブレットにインストールします。  
①https://play.google.com/store/apps/details?id=com.sonyericsson.extras.liveware  
②https://play.google.com/store/apps/details?id=com.sony.smarteyeglass  

  
次に、  
> cd SDKマネージャーの保存先/add-ons/addon-sony_smarteyglass_sdk_sony_19/apks 

へ、ターミナル等で移動してください。  
ここにSmartEyeGlassEmulator.apkとsamplesというディレクトリがあります。  
SmartEyeGlassEmulator.apkをインストールし、スマートフォン（タブレット）上にSmartEyeGlassのエミュレーターを構築します。

> adb install  SmartEyeGlassEmulator.apk  

次に、Samplesの中にあるサンプルをインストールしてみます。試しに、HelloWorld.apkをやってみます。
 
> adb install HelloWorld.apk  

次にアプリを実行してみます。
端末にインストールされた、SmartEyeGlassEmulatorを実行してみます。  
緑色の文字が表示されている部分をスワイプすると、HelloWorldとあり、これをタップすると起動ができます。
UnicornにUSR2シグナル送って、再起動する時、エラーが出る

#サーバーの環境
rbenv 0.4.0-129-g7e0e85b
ruby 2.1.0p0 
Rails 4.1.6
capistrano 3.1.0

#どんなバグでしょうか
デプロイの時に以下のコマンドで、unicornにUSR2シグナルを送って、再起動しています。

```rb
kill -USR2 `cat #{fetch :unicorn_pid_file}`
```
unicornのログを見ると、時々unicornを見つからなくて再起動できませんでした。

```shell-session
I, [2015-05-20T09:45:31.070833 #11781]  INFO -- : executing ["/var/www/pinpg_prot/releases/20150515054058/vendor/bundle/ruby/2.1.0/bin/unicorn_rails", "-c", "/var/www/pinpg_prot/current/config/unicorn.rb", "-E", "staging", "-D", {12=>#<Kgio::UNIXServer:fd 12>, 13=>#<Kgio::TCPServer:fd 13>}] (in /var/www/pinpg_prot/releases/20150520004521)
/var/www/pinpg_prot/current/vendor/bundle/ruby/2.1.0/gems/unicorn-4.8.3/lib/unicorn/http_server.rb:475:in `exec': No such file or directory - /var/www/pinpg_prot/releases/20150515054058/vendor/bundle/ruby/2.1.0/bin/unicorn_rails (Errno::ENOENT)
```

おかしいかな、なんでbin/unicornは1vendor/bundleに置いたのでしょうか。
デプロイのログを確認してみたら、問題を発見しました。

```shell-session
bundle install --without development test --deployment --quiet
```

上記はgemをインストールしたコマンドですね。問題なのは--deploymentです。
--deploymentとは管理権限を持たないサーバーにデプロイする場合、プロジェクトディレクトリにvendorディレクトリを作成し、gemをインストールするというアプローチです。
管理権限を持つ場合、--deploymentが不要でしょうか。解決方法は--deploymentを外すだけで、すごく簡単です。config/deploy.rbに以下の設定を追加したら、解決完了です。

```rb
set :bundle_flags, "--quiet"
```
EC2でnode.js + nginx + pm2 + express4のnodeアプリを稼働させる

node.js server on EC2
---

まずは、node.jsの環境を整えます。
今回、利用するバーションは、```v0.10.36```です。
利用するnode.jsのコードはgitリモートレポジトリ上にあるものとします。

```
$ sudo yum update -y
$ sudo yum install git gcc-c++ make openssl-devel -y
$ git clone git://github.com/creationix/nvm.git .nvm
$ source ~/.nvm/nvm.sh
$ nvm install v0.10.36
$ nvm alias default v0.10.36
$ vim ~/.bash_profile
if [[ -f ~/.nvm/nvm.sh ]]; then
  source ~/.nvm/nvm.sh
    _nodejs_use_version="v0.10.36"
    if nvm ls | grep -F -e "${_nodejs_use_version}" >/dev/null 2>&1 ;then
      nvm use "${_nodejs_use_version}" >/dev/null
      export NODE_PATH=${NVM_PATH}_modules${NODE_PATH:+:}${NODE_PATH}
    fi
    unset _nodejs_use_version
fi
```

#### Setup nginx

```
$ sudo yum install nginx -y
$ nginx -v
$ sudo chkconfig nginx on
$ sudo service nginx start
$ sudo vim /etc/nginx/conf.d/node-app.conf
upstream node-app {
    server localhost:3000;
}

server {
    listen       80;
    server_name  10.211.55.2;
    proxy_redirect                          off;
    proxy_set_header Host                   $host;
    proxy_set_header X-Real-IP              $remote_addr;
    proxy_set_header X-Forwarded-Host       $host;
    proxy_set_header X-Forwarded-Server     $host;
    proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
    location / {
        proxy_pass http://node-app/;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {  
    root   /usr/share/nginx/html;
    }
}

$ sudo service nginx restart
```

#### アプリケーションのセットアップ

```
$ git pull origin master nodeapp
$ cd nodeapp
$ npm install
```

#### node daemon use pm2

最後にnodeアプリをデーモンとして動かすための設定です。
今回は、express4を利用しているので、サーバーとして起動させるには、./bin/www.jsのようにする必要があります。（元々は、./bin/wwwというファイルになっているので、コピーしてください。）

```
$ npm install -g pm2
$ pm2 start ./bin/www.js -i max
```
PhpStormで貼り付けできないとき 

## 事象

synergyでwindows7をサーバー、macをクライアントに設定していた。

windowsでコピーし、mac側のPhpStorm内でペーストできないことに悩んでいたが、以下で解決した。

## 解決方法

/Applications/PhpStorm.app/bin/idea.vmoptions にidea.use.alt.clipboard.sync=trueを記述する。

原因は、PhpStorm独自のクリップボード履歴機能と競合していたためらしい。同期させてしまえば解決。

## 後日
うまくいったり、いかなかったりなので、
PHPStormのクリップボード機能をOFFにしました。

解決方法はこちら
http://matomerge.com/phpstorm-is-incompatible-with-textexpander/
MagicalRecordでFetch Limit を設定する

MagicalRecord で MR_find... 系のメソッドではlimitを設定できなかったので調べた結果のメモです。

```objc
NSFetchRequest *request = [MyEntity MR_requestAll];
[request setFetchLimit:FETCH_LIMIT];
NSArray *entities = [MyEntity MR_executeFetchRequest:request];
// do something ..
```

`MR_request...` メソッドは他にもたくさんあってカスタマイズできます。
Kobito(Window版)でアップロードではまった

KobitoからQiitaに「アップロード」しようとするけれど、なんの反応もなし。
もちろん投稿できていない。

Google先生に聞いてもいい回答が見つからず、Qiitaの最近の投稿で、「kobito」をキーワード検索してみると、以下の記事を見つけた。

[Kobito for Windowsを使ってみた](http://qiita.com/kkimura/items/6eda13c2867bdf5e0208)
>チーム「Inbox」で書いた物をアップする場合は、
クリップボードにコピー
チーム「Qiita」で新規に記事を作って貼り付け
アップロード

そうか、「Qiita」にして新規作成すればいいのか。

ということで、ようやくアップロードできた。
Kobito事始め、そして、Qiita


どういう流れだったかは思い出せないが、[Kobito](http://kobito.qiita.com/win)というソフトのサイトにたどり着いた。
「**ソフトウェア開発者のためのMarkdownによる情報記録・共有ソフト**」
との説明書きがあり、**Markdown**が気になったので、使ってみることにした。
「Markdownチートシート」があったので、わかりやすい。



# 見出し
## 見出し
### 見出し
#### 見出し

* * *

* 項目
* 項目

1. 順番
1. 順番



```c:hello_world.c
printf("Hello World!\n");
```

```rb:HelloRuby.rb
puts "Hello Ruby!"
```

```hs:sample.hs
main = interact fun
 
fun = unlines . takeWhile (/="42") . words
```

コードがそのまま書けるのは良さそうだ。

[Qiita](http://qiita.com/)にそのままアップロードできるようなので、初投稿してみることにする。

Windows版の「Kobito」は先週リリースされたばかりだったようだ。
[Qiitaを運営するIncrements、Markdown対応のメモアプリ「Kobito」Windows版を無償公開](http://www.forest.impress.co.jp/docs/news/20150512_701428.html)
spockメモ

#spockメモ

## コード
```
@Data
@AllArgsConstructor
public class Person {
	private String name;
	private String nickName;
	private Sex Sex;
}

```

```
public class PersonFactory {
	public static Person get(String name) {
		switch (name) {
			case "nagasawa":
				return new Person("nagasawa", "sparrow", Sex.MALE);
			case "misawa":
				return new Person("misawa", "sparrow", Sex.MALE);
			case "naruse":
				return new Person("naruse", "head", Sex.FAMALE);
			default:
				return new Person("NONE", "NONE", Sex.MALE);
		}
	}
}
```

```
public enum Sex {
	MALE, FAMALE
}
```

## テストコード
```
class PersonFactoryTest extends spock.lang.Specification {
    
    @Unroll
    def "#nameの時はあだ名が#expectedになる"() {
        expect:
        PersonFactory.get(name).nickName == expected

        where:
        name       | expected
        "misawa"   | "sparrow"
        "nagasawa" | "jonny"
        "naruse"   | "head"
    }
}
```

## 実行結果
![s](https://qiita-image-store.s3.amazonaws.com/0/1412/a75e0580-77d9-cdc2-40f2-5a18903bbf17.png)
vmware > USB3.0のlinuxでの対応 > Ubuntu10.10は対応

http://www.vmware.com/jp/support/support-resources/pubs/ws_pubs/releasenotes_ws80

> USB 3.0 サポートが、カーネル バージョン 2.6.35 以降 （Ubuntu 10.10） を実行している Linux ゲストに新しい仮想 xHCI USB コントローラを通じて提供されます。この機能を有効にするには、 .vmxファイルに 「 usb_xhci.present = “true”」 という行を追加します。Windows ゲストに対してこの機能を有効に しないでください。現時点では Windows には汎用 xHCI ドライバがないため、この機能は Windows では動作しません。 


CentOS6.5では 2.6.32-431なので、USB3.0対応はできないのだろう。
Rubocopのcompliant syntaxの解決方法



# 背景
rubocopは、最新版のRubyで動作していないと警告がでる

```
warning: parser/current is loading parser/ruby21, which recognizes
warning: 2.1.6-compliant syntax, but you are running 2.1.5.
```

# 解決

## アップデート
手元のruby-buildが古かったので、`ruby-build`をアップグレードする

```
$ brew upgrade ruby-build
```

## インストール

```
$ rbenv install 2.1.6
```

# 2.1.6用のbundlerをインストールする

```
$ gem install bundler
```

出力結果

```
Fetching: bundler-1.9.9.gem (100%)
Successfully installed bundler-1.9.9
Parsing documentation for bundler-1.9.9
Installing ri documentation for bundler-1.9.9
Done installing documentation for bundler after 4 seconds
1 gem installed
```

## ローカルのRubyを2.1.6にする

```
$ rbenv local 2.1.6 
$ ruby -v  
```

出力結果

```
ruby 2.1.6p336 (2015-04-13 revision 50298) [x86_64-darwin13.0]
```

## Rubyのバージョンを固定しておく

```
$ vi ./.ruby-version 
```

```
2.1.6
```

# 参考
[rbenvでMacにRuby 2.2.1 インストール（オプション指定最新版](http://qiita.com/riocampos/items/0df10dd7956ce9de0ffb)
riakのringからinstanceを抜く手順。

3台構成のriakのringで1台抜きたいなーっと思ったので。

```bash
riak-admin member-status
================================= Membership ==================================
Status     Ring    Pending    Node
-------------------------------------------------------------------------------
valid      34.4%      --      'riak@127.0.0.1'
valid      32.8%      --      'riak@127.0.1.1'
valid      32.8%      --      'riak@127.0.2.1'
-------------------------------------------------------------------------------
Valid:3 / Leaving:0 / Exiting:0 / Joining:0 / Down:0
```
みたいな状態。

```bash
riak-admin cluster leave riak@127.0.0.1
```

そのあとに

```bash
riak-admin cluster plan
```
これをやったら、どう移行するかが表示されます。
そのあとで、

```bash
riak-admin cluster commit
```
で

```bash
riak-admin member-status
================================= Membership ==================================
Status     Ring    Pending    Node
-------------------------------------------------------------------------------
valid      50.0%      --      'riak@127.0.2.1'
valid      50.0%      --      'riak@127.0.3.1'
-------------------------------------------------------------------------------
Valid:2 / Leaving:0 / Exiting:0 / Joining:0 / Down:0
```

な状態になりました。
UniRxと戯れる #4 WWWでmp3ファイルの読み込み完了を監視する

WWWでmp3ファイルを読み込み完了時にAidopClipをAudioSourceにセットする例。

```
var www = new WWW(fullpath);
var clip = www.audioClip;
clip.ObserveEveryValueChanged(x => x.loadState)
    .Where(x => x == AudioDataLoadState.Loaded)
    .Subscribe(_ => this.GetComponent<AudioSource>().clip = clip);
```
非同期じゃないXMLHttpRequestをメインスレッドで使うのはもうオワコンらしい

弊社のとあるページにて、DeveloperToolsコンソールを開くと以下のようWarningなメッセージが出力されることを発見（確認したのは Google Chrome 43）。

> Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check http://xhr.spec.whatwg.org/.

メッセージからXMLHttpRequestを同期読み込みで行っているのが原因ってことなんだけど、いちおう詳細内容確認してみた。

該当セクションは以下。
https://xhr.spec.whatwg.org/#the-open()-method

引用。

> Synchronous XMLHttpRequest outside of workers is in the process of being removed from the web platform as it has detrimental effects to the end user's experience. (This is a long process that takes many years.) Developers must not pass false for the async argument when the JavaScript global environment is a document environment. User agents are strongly encouraged to warn about such usage in developer tools and may experiment with throwing an InvalidAccessError exception when it occurs.

超絶意訳すると、

- 同期読み込みをワーカー以外（タイトルにはメインスレッドと書いてみたが適切な表現なんだろう？）で行うのはユーザー体験を損なうからWeb標準から外されることになったよ
- そのような使い方をした場合にDeveloperToolsの中で警告を出すし、実験的に例外を投げるようになるかもしれないよ

ってことなので、特段の理由があってあえてメインスレッドで同期読み込みしている場合は修正必須ってことですね。
Rails 3.x で API がうまく動いていないのを調査したきの話



## 特定の API がうまく動いていない？

調査したのはシンプルな API を提供するアプリで

1. 認証 API を実行：セッションに認証済みの情報をセット
2. 各種 API を実行：セッションを検証し、認証済みの場合のみ実行可

という仕組みのものでした。で、なぜか特定の API だけ認証済みでもエラーとなるので調査してちょうだいということでした。

## エラー内容は「認証されてないよ」

その API からは「認証されてないよ」という旨のエラーが返却されていました。
なぜ？と思って調べを進めてみると、どうやらその API にアクセスする度に新しいセッションが生成されていて、認証済みの情報が消えているためだということが分かりました。

## ログに「Can't verify CSRF token authenticity」

他の API との違いはなんだろう？と思いつつログとにらめっこ。
よく見るとうまく動いていない API を叩いた場合のみ「Can't verify CSRF token authenticity」が発生していました。ということは・・・

## 原因は reset_session

先のログは `protect_from_forgery` で NG の場合に出力されます。で、その後 reset_session されているためセッションが再生成されていたようでした。

```rb:application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery

```

```rb:request_forgery_protection.rb
def protect_from_forgery(options = {})
  self.request_forgery_protection_token ||= :authenticity_token
  prepend_before_filter :verify_authenticity_token, options  # <-- (1)
end

def verify_authenticity_token
  unless verified_request?
    logger.warn "WARNING: Can't verify CSRF token authenticity" if logger
    handle_unverified_request # <-- (2)
  end
end

def handle_unverified_request
  reset_session # <-- (3) ここでセッションがリセットされる
end
```

## verify_authenticity_token をスキップして解決

protect_from_forgery はシステムを堅牢にしてくれる仕組みなので重宝しますが、今回のように外部に公開する API には不要なので、その処理が走らないようにスキップしておきましょう。

```rb:hoge_controller.rb
class HogeController < ApplicationController
  skip_before_filter :verify_authenticity_token
end
```



## 参考

- [Rails3のprotect_from_forgeryはトークンの検証NGの場合にreset_sessionする](http://www.techscore.com/blog/2013/01/11/rails3のprotect_from_forgeryはトークンの検証ngの場合にreset_sessionする/)
Serverspecでjavaのバージョンをテストする（注意あり）

`java -version`で出力される情報はstderrでした。。。というメモです。

## やりたいこと
`java -version`の出力みて、Javaのバージョンチェックを行う。

```Bash
$ java -version
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
java version "1.8.0_25"
```

## ダメだったケース
`stdout`使う。

```Ruby
require 'spec_helper'

describe command('java -version') do
  its(:exit_status) { should eq 0 }
  its(:stdout) { should match /java version "1.8/ }
end
```

```Bash:output
Command "java -version"
  exit_status
    should eq 0
  stdout
    should match /java version "1.8/ (FAILED - 1)
```

> expected "" to match /java version "1.8/


## OKだったケース
`stderr`使う。。。

```Ruby
require 'spec_helper'

describe command('java -version') do
  its(:exit_status) { should eq 0 }
  its(:stderr) { should match /java version "1.8/ }
end
```

```Bash:output
Command "java -version"
  exit_status
    should eq 0
  stderr
    should match /java version "1.8/
```

## まとめ
もし、コマンドとかでバージョンを保存するとかあったら、
`java -version 2> java_version.txt`
とするか、
`java -version &> java_version.txt`
になるのかな。
Cocos2d-xでLive2Dを動かしてみる(2) iOS編

##概要
Cocos2d-xを使ってみるための環境構築に時間がかかったので備忘録的に作成
(1)準備編ではCocos2d-xのインストールまでとプロジェクトの作成まで
(2)iOS編ではXcodeを使ってLive2Dのキャラの描画まで
(3)Android編ではAndroid Studioを使ってLive2Dのキャラの描画まで(作成中)

(1)の準備編が終わっているか，Cocos2d-xがインストールされていること

##開発環境  
* Cocos2d-x 3.3
* Live2D Cubism SDK 2.0 OpenGL(Cocos2d-x) 2.0.06_2 本体（最新版をダウンロード
* Live2D Cubism SDK 2.0 OpenGL(Cocos2d-x) 2.0.06_2 Cocos2d-xのバージョン3.3
* Mac OS X Yosemite(10.10.3)
* Xcode(6.3.1)

Cocos2d-x 3.3を選んだのは書籍など参考になりそうな情報があると考えたため．
(Live2D Cubism SDKは2015/05/11現在，Cocos2d-xのバージョンで3.5まで対応している)
念のためCocos2d-xのバージョンとSDKのバージョンの確認をしておく．

##Live2D Cubism SDKに入っているサンプルを動かす場合
本体とCocosのバージョン別のファイルを解凍
本体の中へCocosのバージョン別のファイルで解凍した中身を入れる

以下のような状態になる
![スクリーンショット 2015-05-14 11.43.01.png](https://qiita-image-store.s3.amazonaws.com/0/76553/c9458e35-efdc-d2b6-c42c-9f141158bb62.png)

sample_cocos2dx3.3/Simple/のproj.ios/Simple.xcodeprojを開く
実行ボタンを押すと以下のように表示される
![iOS Simulator Screen Shot 2015.05.12 0.49.37.png](https://qiita-image-store.s3.amazonaws.com/0/76553/552287ef-345f-3665-59f3-fb723946381d.png)


##自分のプロジェクトにLive2Dを追加する場合
###ファイルの追加・読み込み
MyProject/Resourcesへ
Live2D_SDK_OpenGL_2.0.06_2_sample_3.3_jp/sample_cocos2dx3.3/Simple/Resourcesにある
haru.moc, texture_00.png, texture_01.png, texture_02.pngをコピーする

MyProject直下へ
Live2D_SDK_OpenGL_2.0.06_2_jp（本体）直下にあるincludeフォルダ, libフォルダをコピーする

MyProject/Classesへ
Live2D_SDK_OpenGL_2.0.06_2_sample_3.3_jp/sample_cocos2dx3.3/Simple/Classesにある
ファイルを全てコピーする

以下のような状態になる．
![スクリーンショット 2015-05-14 11.42.50.png](https://qiita-image-store.s3.amazonaws.com/0/76553/5def0866-ff6d-d436-9ff5-0fcac94fff14.png)




コピーが終わったらMyProject/proj.ios_mac/MyProject.xcodeprojを開く
Xcode上からプロジェクトのResourcesフォルダにharu.moc, texture_00~02.pngを追加する
Xcode上からプロジェクトのClassesのファイルを全て削除してから，コピーしたファイルを追加

###プロジェクトの設定
それぞれに以下を追加する
Build Settings > Search Paths > User Header Search Paths へ **$(SRCROOT)/../include**
Build Settings > Apple LLVM 6.1 Preprocessing へ **L2D_TARGET_IPHONE_ES2**
Build Settings > Search Paths > Library Search Paths へ 
**"\$(SRCROOT)/../lib/ios/\$(CONFIGURATION)-$(PLATFORM_NAME)"**
Build Settings > Linking > Other Linker Flags へ **-lLive2D**

###実行
ビルドして実行する
サンプルを動かしたときと同じように動作したら成功

##参考
[http://sites.cybernoids.jp/cubism2/sdk_tutorial/platform-setting/cocos2d-x/ios/createproject](http://sites.cybernoids.jp/cubism2/sdk_tutorial/platform-setting/cocos2d-x/ios/createproject)
aliasメモ(ターミナル操作をちょっと便利にする)


ターミナルで操作するときに、面倒くさい操作はaliasに登録しておくと良い。
でも普通にaliasに登録しただけじゃターミナルを再起動した時に登録したコマンドが削除されてしまう。
*再起動しても削除されないように.bashrcファイルに書き込こみます。

僕が設定している.bashrcは以下になります。(貧弱ですが)

##.bashrc 
```lang:.bashrc
alias ll='ls -la'
alias p='pwd'
function mkcd() {
        mkdir $1;
        cd $1;
}
```

##解説
```lang:解説ll
$ ll コマンド　ー＞ls -la 
```

```lang:解説p
$ p コマンド　ー＞pwd
地味に便利
```

```lang:解説mkcd
$ mkcd コマンド　ー＞ mkdir $1 ; cd $1
ディレクトリを作成した後に、cd で作成したディレクトリに移動してくれる
```


##.bashrcはホームディレクトリに入れてください。

```lang:.bashrcの追加の仕方
//ホームディレクトリに移動
$ cd ~
//vimで.bashrcファイルを作る（開く）
$ vim .bashrc
//上に書いてあるソース？をコピペし、保存する
//.bashrcファイルの更新を反映させる
$ source .bashrc
終わり!

```
プロジェクトの見積もり？

フローマップの実現はどのぐらいの工数が掛かるのか？見積もりできない。

・サーバー
・アップルアプリ
・アンドロイドアプリ

作る時間は別々ですが、前の準備時間はどのぐらい掛かる？
・DB設計
・開発環境構築
・仕様説明？

検証はどのぐらい掛かる？
ストアーにリリースするにはどの位掛かる？

今日は５／２１ですが、９中旬に出来上がることは可能ですかね？
どういうスケジュールを引けばできるのですかね？
【MySQL】【PHP】複数のテーブル(3つ以上)を一回のUPDATE文で更新するやり方

MySQLのUPDATE文の3つのテーブル更新にて1時間以上手間取った。
問題はWHERE句の内容にあった。

		$sql =
			'UPDATE dat_sales_product

				INNER JOIN
					mst_product 

					ON dat_sales_product.code_product=mst_product.code
					
				INNER JOIN
					dat_sales

					ON dat_sales_product.code_sales=dat_sales.code
						
			SET
				dat_sales.name = ?,
				dat_sales.date = ?,
				dat_sales_product.quantity = ?,
				mst_product.name = ?,
				mst_product.gazou = ?

			WHERE
				dat_sales_product.code_product = ?

			$stmt = $dbh->prepare($sql);
			$data[] = $form['name'];

			$data[] = date('Y-m-d H:i:s');
			$data[] = $form['quantity'];
			$data[] = $form['mst_name'];

			$data[] = $_SESSION[filename];
			$data[] = $form['code_product'];
		
			$stmt->execute($data);
			$dbh = null';


このコードを試してテーブルが更新されない。
3つ以上のテーブルを更新するUPDATE文を書くときには
UPDATEのどこのテーブルのどのカラムかを4つ指定しなければいけなかった。

A,B,Cのテーブルで共通のIDを持っているBのテーブルを軸とするなら、
WHERE句で
A.id = "10"
B.id = "10"
B.id2 = "11"
C.id = "11"
といったように

AのテーブルとBのテーブルの共通項
BのテーブルとCのテーブルの共通項

4つの共通する項目の値を明示しないといけない。
ぐぐっても意外とのっていなかった。
以下のようにすると更新された。

		$sql =
			'UPDATE dat_sales_product

				INNER JOIN
					mst_product 

					ON dat_sales_product.code_product=mst_product.code
					
				INNER JOIN
					dat_sales

					ON dat_sales_product.code_sales=dat_sales.code
						
			SET
				dat_sales.name = ?,
				dat_sales.date = ?,
				dat_sales_product.quantity = ?,
				mst_product.name = ?,
				mst_product.gazou = ?

			WHERE
				dat_sales_product.code_product = ?
				AND mst_product.code = ?
				AND dat_sales_product.code_sales = ?
				AND dat_sales.code = ?';

			$stmt = $dbh->prepare($sql);
			$data[] = $form['name'];

			$data[] = date('Y-m-d H:i:s');
			$data[] = $form['quantity'];
			$data[] = $form['mst_name'];

			$data[] = $_SESSION[filename];
			$data[] = $form['code_product'];
			$data[] = $form['code_product'];
			$data[] = $form['code_sales'];
			$data[] = $form['code_sales'];
			
			$stmt->execute($data);
			$dbh = null';

同じように2つのテーブルの時は

inner joinの部分を1回だけ
WHERE句の共通カラムの項目を2つ
$data[]の内容を調節

4つのテーブルの時は

inner joinの部分を3回
WHERE句の共通項目を6つのテーブルのカラム
(A,B,C,DのテーブルではA.id=B.id,A.id=C.id,A.id=D.id,B.id=C.id,B.id=D.id,C.id=D.idといったように)
$data[]の内容を調節

で大丈夫でした。

ホント毎回忘れてしまうため、UPDATE文を書くときにはこれから注意して書くようにします。
ごめんなさい。
Preemptible VM を instance group で立てる

漢なら GCE で Preemptible VMs を instance group で 100 万インスタンス規模でオンデマンドで立てて分散レイトレーシング処理を短時間で行いたいですよね!

でもまだベータ機能なので 100 万インスタンス起動は無理そうですので, とりあえず準備として instance groups で Preemptible VM をささやかに立ててみましょう.

できました.

![Screen Shot 2015-05-21 at 12.03.54 PM.png](https://qiita-image-store.s3.amazonaws.com/0/36275/5f787b40-c221-6ad0-7f1f-16ccc77d51f1.png)


## Terminate モードに設定を忘れずに

`gcloud` CLI 経由で作業するものとします.

https://cloud.google.com/sdk/gcloud/reference/compute/instance-templates/create

instance template の create 時に `--preemptible` (`--preemptive` で**無い**ことに注意!) に加えて, maintenance-policy を TERMINATE に設定する必要があります. 

`--maintenance-policy TERMINATE`

TERMINATE に指定しないと, MIGRATE がデフォルト値なので, instance group 生成時に

```
Invalid value for field 'properties.scheduling.preemptible': 'true'.  Scheduling must have preemptible be false when OnHostMaintenance isn't TERMINATE.
```

というエラーが表示されます.

## まとめ

GCE で オンデマンド C++ PaaS っぽいことをして, レイトレーシングの計算ができるようになってきた感があります. 勝てます.
Android端末からサードパーティ製アプリを一掃する

国内のAndroid端末には不要なアプリがいっぱい入っているので、買ってきたらまずこれらのアプリを消すところから始めます。
アプリ管理画面から一つ一つ手作業で消していっても良いのですが台数が多かったりするとめんどくさいので、コマンド一発でできるようにしてみました。

## 手順

まず始めにインストールされているサードパーティ製アプリのパッケージ名を調べます。
コマンドラインから下記コマンドを実行すると、端末内のサードパーティ製アプリのパッケージ名を一覧表示できる。

```bash
adb shell "pm list packages -3"
```

```:実行結果
package:com.android.chrome
package:com.dropbox.android
package:com.epic.launcher
package:com.google.android.apps.chrometophone
package:com.google.android.apps.docs
package:com.google.android.inputmethod.japanese
package:com.sand.file
package:la.droid.qr
```

この実行結果をコピーして、テキストエディターに貼り付ける。
`package:` を削除して、各行が `adb shell "pm uninstall パッケージ名"` となるように書き換える。ダブルクオーテーションはなくても動くかも…？

```:書き換え後
adb shell "pm uninstall com.android.chrome"
adb shell "pm uninstall com.dropbox.android"
adb shell "pm uninstall com.epic.launcher"
adb shell "pm uninstall com.google.android.apps.chrometophone"
adb shell "pm uninstall com.google.android.apps.docs"
adb shell "pm uninstall com.google.android.inputmethod.japanese"
adb shell "pm uninstall com.sand.file"
adb shell "pm uninstall la.droid.qr"
```

この各行を実行していけば、アプリがアンインストールされます。


## 手順を自動化する

以前コマンドラインでやる方法を考えていたけど、最近なぜか上手くいかないことが多かったのでNode.jsのスクリプトにしました。

```js:adb.js
const spawn = require('child_process').spawn;

// Adb.exec('devices') のようにしてadbを実行するクラス
// 注意: エラー処理がいい加減というか何もしていないので、本格的なプロジェクトに使用する際はきちんと書き換えること!!
module.exports = class Adb {
  static exec(args) {

    return new Promise((resolve, reject) => {

      // 引数が配列ならそのまま、文字列ならスペースで区切って配列にする
      let adbArgs = Array.isArray(args) ? args
        : args.split(/\s/);

      let adb = spawn('adb', adbArgs);

      // 結果を入れる
      let result;

      // 標準出力からデータが来たらresultに入れる
      adb.stdout.on('data', (data) => {
        if (!result) {
          result = data;
        } else {
          result += data;
        }
      });

      adb.on('close', (code) => {
        resolve({ data: result, code })
      });
    })
  }
}
```

```js:main.js
const Adb = require('./adb')

Adb.exec('shell pm list packages -3')
  .then(result => {

    // 結果がなければ何もしない
    if (!result.data) return

    // 結果からパッケージ名の配列を取得する
    let packageList = result.data.toString().trim().split(/\s/)
      // 空文字を削除
      .filter(str => str)
      // package:XXX -> XXX に変換する
      .map(str => str.replace('package:', ''));

    // 各パッケージ名を使って adb shell pm uninstall {packageName} を実行する
    let promises = packageList.map(packageName => Adb.exec(`shell pm uninstall ${packageName}`))
    return Promise.all(promises);
  })
  .then(_ => {
    console.log('DONE')
  })
  .catch(err => {
    console.error(`Error: ${err}`)
  });
```

**2024/03/30追記:**

```sh
adb shell pm list packages -3 | sed -e 's/package://' | xargs -I{} adb shell pm uninstall {}
```
で一発でした。
Silex談義

昨日の関西PHP勉強会の座談会で出たおはなし。

[EC-CUBEのソース](https://github.com/EC-CUBE/ec-cube/blob/eccube-3.0.0-beta/src/Eccube/Controller/CartController.php)見ながら花が咲いたしためになったことがありました。

今、SilexでDICをコネコネする感じのやつだと

```php

class CartController
{
    public function index(Application $app, Request $request)
    {
        $items = $app['eccube.service.cart']->getItems();
        return $app->view('cart.twig', compact($items));
    }
}
```

みたいな感じでやってます。（超ざっくりかいてます）
でもこれDIC的によろしくなくね？DICプロパティアクセスしたくね？みたいな。

```php
# AbstractController.php
class AbstractController
{
    public $app;

    public function __construct(Application $app)
    {
        // 基底クラスでプロパティにしちゃいたくね？
        $this->app = $app;
    }
}
```

```php
# CartController.php
class CartController
{
    public function index(Request $request)
    {
        // DICに入れたインスタンスはgetterでとりたくね？
        $items = $this->app
            ->getCart()
            ->getItems();
        return $app->view('cart.twig', compact($items));
    }
}
```

みたいなご指摘をいただきました。

が！！！！
Silex的に、Controllerのconstructorには `$app` はわたらず、DICも配列っぽくぶっこんで引っ張るみたいのが公式Docには書いてある・・・。
これをほげほげしたい場合は、EC-CUBEでラッパーつくるか `vendor` 以下のファイルに直接オペを施さないといけないって感じ。
ラッパーくらいつくれや！って感じなんですが、そうするとSilexのDocと異なっちゃってﾋﾟｨｰってなりそうなのでそのまま乗っかってるって経緯がありまする。

余談ですが、

```php
# CartController.php
class CartController
{
    public function index(Request $request, Response $response)
    {
        // DICに入れたインスタンスはgetterでとりたくね？
        $items = $this->app
            ->getCart()
            ->getItems();
        $response->hoge();
    }
}
```

引数にResponseまでいれちゃって `return` しない、みたいな話もありました。
これはフレームワーク思想によるんでしょうが、面白い話でした。

備忘録ていどに〜
Ruby の test-unit は test 名が同じだと最初のしか有効にならない(が、最新版だと修正されています)

sub_test_case を RSpec の context みたいなものだと考えて使っていたらはまりました。
テスト名が同じだと最初に出てきた方しか有効にならないようです。せめて警告でも出てくれれば。
これだけ見ると RSpec の方が使いやすそうです。

```ruby
require "test/unit"
class TestFoo < Test::Unit::TestCase
  test "a" do
    p "実行される"
  end
  sub_test_case "sub" do
    test "a" do
      p "実行されない"
    end
  end
end
# >> Loaded suite -
# >> Started
# >> "実行される"
# >> .
# >> 
# >> Finished in 0.000489 seconds.
# >> ------
# >> 1 tests, 0 assertions, 0 failures, 0 errors, 0 pendings, 0 omissions, 0 notifications
# >> 100% passed
# >> ------
# >> 2044.99 tests/s, 0.00 assertions/s
```

RSpec では次のようにして test-unit の assertion も使うことができるので、いいとこどりで、この方法がいいような気もしてます。

```ruby
require "rspec/autorun"
RSpec.configure do |config|
  config.expect_with :test_unit
end
RSpec.describe do
  it "a" do
    p "実行される"
    assert true
  end
  context do
    it "a" do
      p "こっちも実行される"
      assert true
    end
  end
end
# >> "実行される"
# >> ."こっちも実行される"
# >> .
# >> 
# >> Finished in 0.0011 seconds (files took 0.20122 seconds to load)
# >> 2 examples, 0 failures
```

2015-05-29
http://tmtms.hatenablog.com/entry/2014/10/12/ruby-test-unit でも言及されていたので、気を付けなければならない仕様、だと思っていたら不具合だったようです。先日のリリースで修正されていました。
.NET 4.5 での SmtpClient に於ける Subject が文字化けする件について

SmtpClient にて、メールを送信するときに、SubjectEncoding を "iso-2022-jp" と指定した場合、Qエンコードが使用されメールが送信されるようです。

Qエンコードに対応してるクライアントソフトでは特に文字化けの問題は起きないのですが、たとえば OSX の標準メールクライントでは文字化けを起こしてしまいます。

.NET 4 までは、対象文字列を以下の様なメソッドでエンコードしてあげれば問題がなかったのですが

```csharp
public string EncodeSubject(string subject)
{
	Encoding enc = Encoding.GetEncoding("iso-2022-jp");
	string strBase64 = Convert.ToBase64String(enc.GetBytes(subject));
	return string.Format("=?{0}?B?{1}?=", "iso-2022-jp", strBase64);
}
```

それでも文字化けを起こしていたので困っていました。

いろいろと調べてみると、

[.NET Framework 4.5 の System.Net.Mail で日本語の件名を ISO-2022-JP の Base64 でエンコードして送信する方法](http://blogs.technet.com/b/exchangeteamjp/archive/2012/10/05/3524293.aspx)

を発見。
 
どうやら、.NET 4.5 内部の実装の変更があったようで、それで上記の（ような）コードでも文字化けを起こしてしまうそうです。

これを解決するには、以下のように２重にエンコードしてあげれば、Bエンコードでの送信ができるようになるそうです。

```csharp
msg.Subject = EncodeSubject(EncodeSubject(subject));
```

見た目的にちょっとあれですが、これで文字化けを回避することができました。

ちなみに

Bエンコードは
> 主にメールヘッダのエンコードに使われます。encoded-wordのことをいう場合もありますが、encoded-textを指す場合はBase64と同じです。

Qエンコードは
> 主にメールヘッダのエンコードに使われます。
8bitデータを「=nn」(nnは16進数の文字コード。大文字で表記）にするという変換はQuoted-printableと同じですが、ヘッダという特殊な場所で使われるので、エンコードすべき文字が多くなります。
半角スペースは「_」(あるいは=20) にします。「=?_」以外の文字はそのまま書かれることになりますが、タブ改行はエンコードします。
()で囲われたコメント部分で使う時は「()」もエンコードします。
phrase内の単語、例えばFrom, To, Ccヘッダのaddressに先行する部分で使う時は、アルファベットと数字、「!*+-/」以外の文字はエンコードします。
Quoted-printableの省略呼称として使われることもありますが、厳密に言えば違います。

参考：[エンコード・コレクション (メール、テキスト関連)](http://homepage1.nifty.com/glass/tom_neko/web/web_03.html)

だそうです。

Exchange ブログ JAPAN さん、Web&Mail&Mac講座さん助かりました!
CircleCIからDeployGateへアップロードするときにSHA-1を記録すると捗る


背景
---

* 開発版の配布にDeployGateを使っている
* DeployGateのアップロードはGitHubのmasterが更新の都度行っている

問題
---

この時、試してくれているユーザーがDeployGate上のどのversionを使っているかはすぐわかるのですが、そのversionがどのコミットまで含むものかを調べるのはちょっと面倒です
(立て続けにPRをマージしたときなど特に)

これを解決するためにDeployGateにアップロードする際のメッセージにSHA-1をつけておくと便利です

やり方
---

まず build.gradle でmessageを環境変数経由で渡せるようにします

```build.gradle
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
        classpath 'com.deploygate:gradle:0.6.2'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

apply plugin: 'deploygate'

deploygate {
  userName = System.getenv('DEPLOYGATE_USER_NAME')
  token    = System.getenv('DEPLOYGATE_API_TOKEN')

  apks {
    debug {
      sourceFile = file("[apk file]")
      message    = System.getenv('CURRENT_HEAD')
    }
  }
}

```

後は circle.yml内で先程の環境変数にSHA-1をセットすれば完了

```circle.yml
deployment:
  staging:
    branch: master
    commands:
      - ./gradlew assembleStagingDebug
      - CURRENT_HEAD=`git rev-parse HEAD` ./gradlew uploadDeployGateDebug
```

これでアップロードされたバージョン毎のSHA-1が確認できます
APKファイルから一発でソースコードとリソースファイルを抽出するシェルスクリプト

APKファイルの中身をのぞいてみたいこともあります。
でも手順が面倒だとやる気がうせるので一発で逆コンパイルできるようにしてみました。


# 事前準備

## 必要なツールのインストール（Macならどれもbrewでインストールできます。）

* dex2jarのインストール
* jadのインストール
* apktoolのインストール

## 必要なAPKの抽出

* adb pullすればぶっこ抜きできます


```
# APKの一覧を表示
$ adb shell pm list packages -f
# APKを指定して取得
$ adb pull /data/app/xxxxx.apk
```

# シェルスクリプトの流れ

1. 環境チェック(必要なツールがインスト−ルされているか)
2. カレントディレクトリのAPKファイルを取得
    * 各APKファイルに対して以下を実施
        * apktoolでリソースファイルを逆コンパイル
        * APKファイルを解凍
        * dex2jarでclasses.dexをjarに変換
        * jarファイルを解凍
        * jadでソースファイルを逆コンパイル
3. APKファイルと同階層に逆コンパイル済みのディレクトリを配置
4. 作業ディレクトリを削除

# スクリプト

```
#!/bin/sh

function checkEnvironment() {
  if [[ ! `which d2j-dex2jar` ]]; then
    echo 'ERROR: COMMAND d2j-dex2jar does not exist'
    exit 1
  fi

  if [[ ! `which jad` ]]; then
    echo 'ERROR: COMMAND jad does not exist'
    exit 1
  fi

  if [[ ! `which apktool` ]]; then
    echo 'ERROR: COMMAND apktool does not exist'
    exit 1
  fi
  
  if [[ -e $WORK_DIR ]]; then
    echo "ERROR: WORK_DIR ${WORK_DIR} already exists"
    exit 1
  fi
}

WORK_DIR=tmp/
APK_FILES=$(find *.apk 2> /dev/null)
JAR_FILE=classes-dex2jar.jar

# 環境チェック
checkEnvironment

# カレントディレクトリのapkファイル毎に逆コンパイル
for APK_FILE in $APK_FILES
do
  echo $APK_FILE
  #OUTPUT_FOLDER=${APK_FILE:r}_output
  OUTPUT_FOLDER=$(basename ${APK_FILE} .apk)

  # リソースファイルを逆コンパイル
  apktool -s d $APK_FILE -o $OUTPUT_FOLDER

  mkdir $WORK_DIR
  # apkファイルを解凍 
  unzip -d $WORK_DIR $APK_FILE

  cd $WORK_DIR
  # dexをjarに変換 
  d2j-dex2jar classes.dex

  mkdir $WORK_DIR
  # jarを解凍
  unzip -d $WORK_DIR $JAR_FILE
  # ソースファイルを逆コンパイル
  jad -8 -d ../$OUTPUT_FOLDER/java -s .java -r $WORK_DIR/**/*.class

  cd ../
  # 作業ディレクトリ削除
  rm -rf $WORK_DIR

done

```
Xcode6.3、Swift1.2での変更点

swiftの勉強にネットにアップされているサンプルコードを写経してる時にエラーになる。
調べてみたら変更点があった。
自分用にまとめる
```myDevice = device as! AVCaptureDevice```
「as」→「as\!」
びっくりマークが必要になりました。
    
```
override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
    
        // タッチイベントを取得.
        let aTouch = touches.first as! UITouch
}
```
「touches.object」→「touches.**first**」に変更
 
そのほかにもありますが引数が違うとエラーを吐かれた場合は一度Xcodeで入力補助を使いながら確認した方がいいみたい。
アセットのアイコンのTextureを取得する

以下のコードでアセットのアイコン表示に使われているTextureが取得できる。

```csharp:
Texture iconTexture = AssetDatabase.GetCachedIcon (assetPath);
```

これでProjectビューみたいなアセット一覧が作れそう。

```csharp:
int selected = 0;
Vector2 scrollPosition = new Vector2 ();
List<string> assetPathList = new List<string> ();
List<GUIContent> contentList = new List<GUIContent>();

...

foreach (string assetPath in assetPathList) {

	Texture iconTexture = AssetDatabase.GetCachedIcon (assetPath);
	GUIContent content = new GUIContent (assetPath, iconTexture);
	contentList.Add (content);
}

scrollPosition = GUILayout.BeginScrollView (scrollPosition, "Box");
selected = GUILayout.SelectionGrid (selected, _searchResultGUIContentList.ToArray(), 1);
GUILayout.EndScrollView ();
```

![asset_list_resize.jpg](https://qiita-image-store.s3.amazonaws.com/0/7345/7bb28eb7-51bf-8542-89ec-9e8ef43e4772.jpeg)
youtube > Raspberry PiからMacへのログインと操作

偶然見つけたのだが、少女が父親のMacへRasberry Piからsshログインして、whoして、topして、sublime textのプロセスを切るしている。

https://www.youtube.com/watch?v=W76o_iG7Y7g&list=WL&index=20

この年齢の時に自分が何をしていたかというと、漫画しか見てなかったよ。
CakePHP3.x でDBに画像を保存＆表示


2系と結構変わってて表示させるのに苦労しました

* JPEGファイルの保存と表示を例にしています(カラム名はthumbnail)
* 追加時は画像必須、編集時は指定しなければ画像を更新しない想定です
* JPEGのValidation例は[こちら(Qiita)](http://qiita.com/kazamai/items/804c83c3d7785c50a578)

## データの保存

### Table

* 保存前にtmp_nameからデータを読み込み実データを渡しています
* なんとなくメソッドの形をCookbookに合わせてます

```php:src/Model/Table/HogeTable.php
use RuntimeException;

    public function beforeSave($event, $entity, $options)
    {
        if ($entity->thumbnail['error'] === UPLOAD_ERR_OK) {
            $entity->thumbnail = $this->_buildThumbnail($entity->thumbnail);
        } else {
            unset($entity->thumbnail);
        }
    }

    protected function _buildThumbnail($thumbnail)
    {
        $ret = file_get_contents($thumbnail['tmp_name']);
        if ($ret === false) {
            throw new RuntimeException('Can not get thumbnail image.');
        }

        return $ret;
    }
```

## 表示

### Controller側

* アクセスはcontents/{id}としています
* $this->autoRender = false でrender処理を止めておきます
* DBからデータを取得した状態では、当該カラムは *ストリームリソース型* になっている為、stream_get_contents関数で読み込みます


```php:src/Controller/HogeController.php
    public function contents($id)
    {
        $data = $this->HogeDatas->get($id);
        $this->autoRender = false;
        $this->response->type('image/jpeg');
        $this->response->body(stream_get_contents($data->thumbnail));
    }
```

### View側

* HtmlHelper#imageを使うとURLの階層が上手くいかないのでとりあえずUrlHelper#buildのみ使用しています

```html+php:src/Template/HogeDatas/edit.ctp
        <img src="<?= $this->Url->build(["controller" => "HogeDatas", "action" => "contents", $hogeData->id]); ?> " />
```
VBA。繰り返し文中のエラー処理サンプル

### はじめに
ITに詳しくない人でも便利に触れるExcelはいろんなところで使われています。
そのために肥大化して邪悪でアンタッチャブルなExcelになる場合もありますが、健全な良識をもってすればそこそこ手軽に便利で使えることはご理解いただけるかと思います。
こうして使われているExcelを処理するのにVBAは手軽でExcel操作を自動化できてよいのですが、近代的な言語と比べると機能性に難があります。

そのひとつとして、繰り返し文中でのスキップをするために、よくある言語で利用されるcontinueがないことや、エラーハンドリングがしにくいことがあったりします。

なんか公式のドキュメントもわかりにくいし、調べて出てきたサンプルもいけていなかったのでちょっと試行錯誤してサンプルを書いてみたので、1時間前の自分が知りたかった情報を書きとどめておく次第です。


### サンプルコード

- 前提：シートSheet1、Sheet2、Sheet4、Sheet5があるExcel
- 期待の動作：実行しているExcelのSheet名を取得し連結して、メッセージを出力する。
  Sheet名は「Sheet連番」としているが、Sheetが存在しない場合、スキップして次のSheetに移る。

```vbnet
'' エラー処理サンプル
Sub sampleError()
    Dim i As Long, buf As String
    
    '' エラー発生時にラベル「SHEETOPENERROR」まで飛ばす。
    '' On Errorステーツメントについて：https://msdn.microsoft.com/ja-jp/library/5hsw66as(v=vs.90).aspx
    On Error GoTo SHEETOPENERROR
    For i = 1 To 5
        
        '' シートの名前を取得していく
        buf = buf & Worksheets("Sheet" & i).Name & vbCrLf
        
        '' 2行上の処理でエラー発生した場合、本行は処理されない
        MsgBox "進捗" & i

   '' エラーラベル。VBEで自動でインデントなしになる・・・
SHEETOPENERROR:
       '' 注意：エラーラベル以降はエラーがない場合も通るので、エラー有無を確認する
       '' Err オブジェクトは、グローバル スコープを持つ組み込みオブジェクトです https://msdn.microsoft.com/ja-jp/library/ka13cy19%28v=vs.90%29.aspx
        If Err.Number <> 0 Then
            '' Err.Numberでエラー番号、Err.Descriptionでエラーの内容を取得できる。
            '' とはいえ、一般利用者がユーザが見ても理解できないことが多いので発生しうる例外については説明しておく。この例ではスキップ（continue的処理）しているが、停止の必要があればEndする
            MsgBox "Sheet= " & i & "を開く際にエラーが発生したためスキップします。シートが存在しない可能性があります。" & vbCrLf & "エラー番号：" & Err.Number & vbCrLf & "エラー内容：" & Err.Description, vbExclamation
            '' .Clearしないとエラーを保持し続けるため
            Err.Clear
        End If
    Next i
    '' エラー発生時にラベル移動する処理を停止する
    On Error GoTo 0
    
    MsgBox buf
End Sub
```


### （追記）
コメントにてご指摘いただきましたが「On Error GoTo 」は1回した動作しないことがわかっています。
コメントソースの通り、プロシージャとして切り出す必要がありますのでご注意ください。

http://answers.microsoft.com/ja-jp/office/forum/office_2007-excel/on-error-go-to/e329200f-8962-4f9c-b0cc-4876f70c2e58
Rubyコーディングアンチパターン

## アンチパターンとは？
人間が読みやすいコードを書く為に、避けるべき書き方

## なぜアンチパターンを定義しておく必要があるのか？

###Rubyは書き方の自由度が高い言語 = 同じ処理でも人によって書き方がバラバラ = 読みずらい！


を防ぐ為。

## 引数を囲む括弧を省略しない。
```
#悪い
dog  = Dog.find 101

#良い
dog  = Dog.find(101)
```

##  and、or、not を使わない
論理積: ==, and
論理和: ||, or
否定: !, not

やっていることは同じだが、書き方によってはインタプリタの解釈が異なってしまう場合がある。

```
#&&の場合
result = 1 && 2

puts result # => 2
#result = (1 && 2) と解釈された

#andの場合
result = 1 and 2
puts result # => 1

# (result = 1) and 2 と解釈された
```

```
object = 'BAR'
foo = 'FOO'
bar = 'BAR'

#&&の場合
if object.eql? foo && bar
# この節は実行される
end

#andの場合
if object.eql? foo and bar
# この節は実行されない
end
```

## クラス変数を使わない
@@valiable: クラス変数
@valiable: インスタンス変数
valiable: ローカル変数

``` クラス変数を使った例
class Foo
# クラス変数は宣言(代入)を行っておく必要がある
  @@variable = nil

  def self.value
    @@variable
  end

  def self.value=(value)
    @@variable = value
  end
end

Foo.value # => nil
Foo.value = 1
Foo.value # =>1

class Bar < Foo #サブクラス
end

Bar.value # => (1 スーパークラスFooの影響を受けてしまう)
Bar.value = 2

Bar.value # => 2
Foo.value # => (2 サブクラスBarの影響を受けてしまう)

```

``` インスタンス変数を使った例
class Foo
  def self.value
    @variable
  end

  def self.value=(value)
    @variable = value
  end
end

Foo.value # => nil
Foo.value = 1
Foo.value # =>1

class Bar < Foo #サブクラス
end

Bar.value # => nil (スーパークラスFooの影響を受けてしまう)
Bar.value = 2
Bar.value # => 2
Foo.value # => 1 (サブクラスBarの影響を受けてしまう)
```

## Enumerableモジュールのメソッドの別名

###Enumerableモジュールとは？
Rubyにおいて繰り返し処理のメソッド群

そのなかでも、別名が付けられているものがある。 あくまでも別名が付いているだけなので、どちらを使っても処理に違いはありません。具体的には次の4種。

・map と collect
・reduce と inject
・find と detect 
・find_all と select

動作は同じだが、チームもしくはPJ内でどちらを使うべきかを決めておくと、ベター！

## 複数行の文字列の連結
長い文字列リテラルを記述する際、1行が長くなりすぎるとソースコード上で読みづらくなるため、複数行に分けて記述することがあります。

文字列リテラルを連結する方法はいくつかある。

```例
string = 'loooooooooooooooooong ' +
'text'

string = 'loooooooooooooooooong ' <<
'text'

string = 'loooooooooooooooooong ' \
'text'
# '\'はメソッドではない。
```


## 複数行のメソッドチェインのドット位置
```
#改行後の行頭にドットを置く場合
string.downcase
      .gsub(' ', '_')

#改行前の行末にドットを置く場合
string.downcase.
       gsub(' ', '_')
```

### 改行後の行頭に置くメリットとデメリット
**メリット**
・ソースコードを上から下にざっと眺めた際の可読性に優れる
**デメリット**
・コードをirbやpryなどにコピー&ペーストした際に、1行目のみ実行されてしまい、後続の行がエラーになってしまう。

### 改行前の行末に置くメリットとデメリット
**メリット*
該当の行を単独で読んでいるときに、行末まで読んだ段階で次の行を見なくともメソッドチェインしていることがわかる。

## おまけ
**スタイルガイド**
・[Ruby Style Guide](https://github.com/bbatsov/ruby-style-guide)
・[Cookpad](https://github.com/cookpad/styleguide/blob/master/ruby.ja.md)
・[Github](http://qiita.com/edwardkenfox/items/33bfadd5fe7c10b9acc5)

**Ruby Style Guideに則しているかをチェックしてくれるツール**
[RuboCop](http://batsov.com/rubocop/)
簡単に英辞郎で検索するブックマークレット

私が英語の文章を読むときに使用しているブックマークレットです。
意味がわからない単語をマウスだけで簡単に調べられます。

#使用方法
1. 調べたい単語をマウスでダブルクリック
 (英単語は空白で区切られているので単語全体が選択されます。)
1. ブックマークレットをクリック
(別ウインドウで検索結果が表示されます。
ブックマークレットはブックマークバーに登録しておくと便利です。)

#ブックマークレットの登録方法
1. ブックマークを新規追加
2. 追加したブックマークのURLに以下のコードをコピーする。(タイトルはお好みでつけてください。)

```js:
javascript:var s = ''; if (window.navigator.appName == 'Microsoft Internet Explorer') {s = document.selection.createRange().text;} else {s = window.getSelection();} if (!s || s == '') {s = prompt('単語を入力してください。', '');} if (s) { window.open("http://eow.alc.co.jp/" + s); } void(0);
```

#ソース
整形したソースは以下のリンクにあります。
[Search on ALC](https://gist.github.com/moroishi/2802669#file-search-on-alc)

#その他の機能
* テキストを選択していない状態でブックマークレットを実行するとダイアログが表示されるので、好きな単語を入力して検索できます。
* 英辞郎に検索キーワードを飛ばしているだけなので、日本語テキストを選択すると英訳の検索結果が表示されます。
NSDateまわりのメモ

**//今日の日付取得**
NSDate *today = [NSDate date];

**//日付を画面に表示する時のフォーマット作成**
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy/MM/dd HH:mm:ss"];

**//NSDateをNSStringに変換するまでの処理**
NSDate *date = [NSDate date];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy/MM/dd HH:mm:ss"];
NSString *dateStr = [formatter stringFromDate:date];
重厚長大なgitレポジトリをさらっとcloneして作業し始める

# 背景

あまり望ましくない、と思いつつ振り返ってみると巨大なレポジトリができてしまうこと、ありますよね。(あることにしましょう)

こういうレポジトリで

 * 別のディレクトリで実験を始めたい
 * 新しいサーバにcloneしたい

みたいな時に`git clone`にものすごい時間がかかって萎えます。

こんな時のご提案です。

# やり方

## branch 名指定、depth 1でcloneする

```
git clone --depth 1 --branch experimental-branch git@github.com:k12u/huge_repo.git experimental_huge_repo
```

積み重なった黒歴史も見なかったことにしてくれます。

## (オプション) config の`remote.origin.fetch`を完全体に戻す。

このままだと`git fetch`してもclone時に指定したbranch以外は降りてこないので、

```
git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
```

する。

## (オプション) バックグラウンドで fetch --unshallow しておく

(Homebrew のFormuraの履歴をフルでローカルで確認したい場合にも使える模様)

このままでは過去の履歴に遡れないので、

```
$ git fetch --unshallow
```

を打つと完全体のレポジトリになれるみたいです。時間がかかるのでバックグラウンドでやっておくといいかも。
一部Androidの標準ブラウザでclearRectすると描画がおかしくなる

## 環境
**端末**: ARROWS Tab F-02F
**OS**: Android4.2.2
**ブラウザ**: ブラウザ

## 現象
Canvasでのアニメーション作成時に、フレームごとにCanvasサイズでclearRect()を掛けていたところ、ある瞬間からページ全体の描画がおかしくなる。

## 原因

```js:before.js
canvas.width = 980;
canvas.height = 300;
setInterval(function(){
    ctx.clearRect( 0, 0, canvas.width, canvas.height )
}, 1000/30);
```

上のようにCanvasサイズぴったりにclearRect()を使うとこういった現象がおこるようです。

## 対策
clearRect()のサイズをcanvasサイズぴったりにしなければいい

```js:after.js
canvas.width = 980;
canvas.height = 300;
setInterval(function(){
    ctx.clearRect( 0, 0, canvas.width+1, canvas.height+1 )
}, 1000/30);
```

これで無事にAndroidでの描画がおかしくなることがなくなりました。

## 参考サイト
>[ハマったこと：AndroidにおけるCreateJS/Canvasのバグ](http://d.hatena.ne.jp/bradtos/20131203/1386055839)