OmniAICreator/Qiita-1.07M huggingface dataset:
一手間かけて、UnityでiOSの64bitアプリ作成の設定をスクリプトから行う。

# iOSの64bitアプリ作成の設定を自動化したい。
iOSのアプリの64bit対応が必須となり、久しいですね。
現在UnityからiOSの64bitアプリを作成するのは非常に簡単で、
プロジェクトの設定を数カ所変えるだけで64bit対応のxcodeが吐き出されます。

ただ業務上、ブランチを切って別のプロジェクトを複数管理することになると思われます。できれば手動で変更する箇所は抑えたいところ。64bitアプリが含まれずにアプリ申請時にエラーが出るまで気づかないなんてことになると悲惨なのでビルド時にスクリプトから設定してしまえばそういうミスは起こらなくなりそうです。

ということで64bit対応周りの設定をスクリプトから行う方法を調べました。

# 設定箇所
[UnityのiOS 64bitビルド][UnityのiOS 64bitビルド_]
[UnityのiOS 64bitビルド_]:http://qiita.com/dsgarage/items/3f1483b19ac0feab4473

上記のリンクのように、設定するのですが
うちのプロジェクトではグラフィックAPIの設定も行っていますので以下のようになりました。
ただこの記事は家で書いているのでUnity5.1のパーソナル版の環境になります。
![iostest.png](https://qiita-image-store.s3.amazonaws.com/0/57778/4b607796-13a9-675c-c366-6a800c244c3c.png)

1. 設定箇所（必須）
Scripting Backend -> IL2CPP
Archtecture -> Universal

2. グラフィック関係（任意）
Automatic Graphic API -> false
Grapihic API -> OpenGL ES2
以下の参考リンクからmetalとOpenGL es3.0がまだ安定してなそうなので（だいぶ前だが）
[コロプラUnity 5プロジェクト][コロプラUnity 5プロジェクト_]
[コロプラUnity 5プロジェクト_]:http://qiita.com/baba_s/items/3c394db28be90d83234c
3. ipadも対応するなら（任意）
Target Device -> iPhone and iPad

とこんな感じで設定するのですが1の箇所をスクリプトから設定する方法が最初見つかりませんでした。
いろいろ調べたらPlayerSettings.SetPropertyIntをつかってできることがわかりました。
どうも個別で設定するプロパティや関数はないようで2.3.はプロパティと関数が個別であります。

以下スクリプトです。
仮にメニューから実行できるようにしてあります。

```csharp:PlayerSettingiOS.cs
using UnityEngine;
using UnityEditor;
using System.Collections;

public class PlayerSettingiOS : EditorWindow {
	[MenuItem("PlayerSettingiOS/64bitSetting")]
	public static void setIOS64bit()
	{
		// ios 64bitのユニバーサルアプリの設定
		PlayerSettings.iOS.targetDevice = iOSTargetDevice.iPhoneAndiPad;
		// 以前不具合があるとの情報があり、metalは一旦無効にしてあります。
		PlayerSettings.SetUseDefaultGraphicsAPIs(BuildTarget.iOS, false);
		var apis = new UnityEngine.Rendering.GraphicsDeviceType[] {            
        UnityEngine.Rendering.GraphicsDeviceType.OpenGLES2
        };
		PlayerSettings.SetGraphicsAPIs (BuildTarget.iOS, apis );
        // GetPropertyIntで調べてみるUniversal設定は2
		PlayerSettings.SetPropertyInt ("Architecture", 2, BuildTargetGroup.iOS);
		PlayerSettings.SetPropertyInt ("ScriptingBackend", (int)ScriptingImplementation.IL2CPP, BuildTargetGroup.iOS); 
	}
}
```

今回の肝である、ArchitectureとScriptingBackendの設定にはPlayerSettings.SetPropertyIntを使って設定します。
IDEの補完機能で探しても出てきませんので気をつけて下さい。

# まとめ
今回の調査でPlayerSettings.SetPropertyIntという関数を見つけられたのが最大の成果でした。
スクリプトからアクセスできるPlayerSettingsにありそうでない場合はこれを使えば大抵の設定にアクセスできそうです。
いろいろ自動化して手動で設定する箇所は極限まで排除したいですね。

ほんと夜ご飯とかも、かわいい彼女に作ってもらって自動化したいところです。
洗い物は僕やるんでなんつって感謝と気遣いも忘れずに、、、、っていねえけどな！！！！

ということで
なにか間違いがあればよろしくお願い致します。
Android StudioでError:Execution failed for task ':app:dexDebug'〜エラー

##環境
OS X 10.10.3
AndroidStudio ver1.2

##症状
Android Studioで開発していたら、１分前まで正常に動いていたものが以下のエラーを吐いて急に動かなくなった。

```
Error:Execution failed for task ':app:dexDebug'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1
```

diffで差分確認しても何も出てこない。何故。

##解決法
このエラーでググると、build.gradleを修正すれば直るよみたいなページがたくさん出てくるが、どれをやっても解決しない。
そこでもうちょっとエラーログを遡ってみると……

```
Caused by: com.android.dx.cf.iface.ParseException: class name (プロジェクト名/MainActivity) does not match path (プロジェクト名/MainActivity (MBA の競合コピー 2015-11-10).class)
```
というログが。Oh……
:app:dexDebugの方のエラーが強調表示されているから、こんな単純なことに全然気づかなかった。
自分はプロジェクトフォルダをDropboxで管理しているのだが、どうやらいつの間にかファイルが競合していたらしい。

.classファイルじゃdiffで確認しても出ないわけだ……。
vagrant upでsshのタイムアウトが終わらない


### 状況
vagrant upしたら
```
default: Warning: Connection timeout. Retrying...
```
が延々と表示される。

GUIで見てみると
```
This kernel requires an x86-64 CPU, but only detected an i686 CPU.
Unable to boot - please use a kernel appropriate for your CPU.
```
という感じで、
そもそも起動できてないみたい。


### 原因
http://qiita.com/kmats@github/items/a2396aa5b6f397d447b8
こちらの記事によると、
BIOSの設定が仮想環境動かせるようになってなかったらしい。


### 解決
↑の記事の通りにBIOSをいじって解決。

- Advance > CPU Configuration > Intel(R) VirtualizationTechnology > Enabled

参考までに環境を

- ホスト
    - OS : Windows 8.1 Enterprise
    - プロセッサ : Intell(R) Core(TM) i5-4460
    - BIOS : American Megatrends Inc. 2202
    - VirtualBox 5.0.4
    - Vagrant 1.7.4
- ゲスト
    - CentOS 6.5 x86_64
製品におけるデザインの両翼

# Inspiredからの引用と私の私見
Inspired(^1)を見ていて一番「ないわー」と思ったのが「デザインは外注出来ない。できるのはせいぜいQAまでだ。」という部分。
2008年という古い時期の、それもアメリカの、プロダクトマネージャーが書いた本なのでしょうがないとは思う。
(QAはブラックボックステストですら外注すると効果が下がる、意図が正確に伝わらないから、というのが最近はっきりしてきた)

^1 Inspired: 顧客の心を捉える製品の創り方 マーティ ケイガン http://www.amazon.co.jp/dp/B00TCM8TB4/
よい本だからぜひ読んだ方がいい。

UXやユーザービリティは日本だと利用者品質(^2)という言葉でJISで規格化されている。
利用者品質は、仕様を決める企画段階で深く関わった品質の専門家による、ユーザー目線でのチェックを入れないと担保はほぼ不可能とされている。
であるので私は「QAは外注可能」には反対で、UXやユーザービリティが製品から得られるかのQAは必ず内製化しないといけないと思っている。

^2 ただし利用者品質は「価値」までは踏み込んでいないのであまり十分だとは思っていない

# ４つのデザイン
Inspired自体は良い本だし、その中でよいことも書いてある。
`デザインは４つに分かれる。「UXデザイン」「インタラクションデザイン」「UIデザイン」「ビジュアルデザイン」`

`この中でデザインは２つに分けられる`
`「UXデザイン(^4)」「インタラクションデザイン」`と`「UIデザイン」「ビジュアルデザイン」`

# 新概念：プロダクトデザイン
プロダクトデザイン(^3)という概念が2008年の刊行のあと５年くらいで発達し、プロダクトデザインはユーザーのやりたいことをユーザービリティをもとに「UXベース」で保証するようデザインすること、みたいな感じで定義されている。

プロダクトデザインはUIデザインのような「見た目のデザイン」とは別のものである。
行動と体験を通して目的を達成できること、また体験を通してユーザーのやりたいことの変化が、設計者の意図通り変化することを目的にデザインする。
心理学、認知心理学、社会心理学、あるいは人間の集団行動的な知見から、ユーザーの行動と目的にそってプロダクトのデザインを行う。

^3 日本語資料が2013年あたりから多少見つかるけどあまり見つからないのであまり日本語化されてないのか？

^4 UX/UIデザインという意味でのUXではない。くわしくは以下で解説
http://qiita.com/shin_semiya/items/a4bd0135e2d9c5206846

# 私の主張
旧来のUIデザイン、ビジュアルデザインはデザインの右翼側に配置される。
これらは外見を管轄する。
ダサいと目も当てられないし、分かりづらい外見は罪だし、これの出来が悪いと、中身が良くても結果が出ない。

右翼側のデザイナーは「見た目がダサくないか？」「意図して見せたいものをちゃんと見せているか？」「見せたくないものは見えていないか？」「配置は人間工学的に合っているか？」
そういったことを保証する
(専門じゃないけどあってるはず)

一方でプロダクトデザイン、UXデザインはデザインの左翼に配置される。
これらはユーザーの目的の達成とそのための手段の実行、時間の推移によるユーザーのマインドセットの変化を管轄する。

左翼側のデザイナーは「ユーザーは"したいこと"のために行動すれば最終的に目的を達成できるか？」「UXとして機能するか？」「"したいこと"を得るためのコストは見合ったものか？(ユーザビリティの効率部分は大丈夫か？)」「ユーザーの興味は意図通りに変化するか？」ということを保証する。

# 右翼と左翼の違い
右翼はデザイン系、美術系の専門知識を必要とする。
一方で左翼は心理学、特に認知心理学や社会心理学の専門知識を必要とする。
左翼デザイナーは心理学的なデザイナーであり、右翼とは全く異なる

今まで出会ったUXデザイナーの8割は実際にはUIデザイナー、すなわち右翼側の人間だった。

# 私の結論
2010年代のデザインにおいては、左翼と右翼の両方が必要とされる。
右翼だけが強い場合「見た目のオサレな使いづらいサービス、製品」が完成する
左翼だけが強い場合「まず見た目で敬遠されるサービス、製品」が完成する

重要なのは両方を揃えることである
【react-obs】ReactでObserverが使えるようにしてみた

Reactで小さなものをサクッと作りたいのに、コンポーネント間のやり取りがめんどくさそうだったので[Rios.js](http://riotjs.com/ja/)のように簡単なイベント操作でデータをやり取りできるようにしてみました。

[Github - react-obs](https://github.com/iwamatsu0430/react-obs)

せっかくなのでbowerにも登録してみました。

```
bower install react-obs
```

使い方はREADMEの通りなのですが、ES6でReactを使う際に継承先をちょっと変えてあげるだけでObserveのためのメソッドが使用できます。

```js
class Foo extends ReactObs {

  constructor (props) {
    super(props);
    this.on('hello', this.A, this); // イベント登録
  }

  A (_this, message) {
    console.log(message);
  }

  B (e) {
    e.preventDefault();
    this.trigger('hello', e.target.text.value); // イベント呼び出し
  }

  render () {
    return (<form onSubmit={this.B.bind(this)}>
      <textarea name="text"></textarea>
      <button>submit</button>
    </form>);
  }
}
```

実際にこれでTODOアプリの[デモ](http://iwamatsu0430.github.io/react-obs/sample/)も作ってみました。
TensorFlow ってなんだろ

11/9 に Google が [TensorFlow](http://tensorflow.org/) という機械学習ライブラリを公開しました.
機械学習ライブラリとか言われても何だかよくわからないですね.
どういうものなのか調べて報告しろとある人に脅されたので, 機械学習初心者の人向けの説明を置いておきます.
ガチ勢の方はお引き取りください.

# 何ができるの?
[scikit-learn](http://scikit-learn.org/stable/) のような既存の機械学習手法の実装ではありません.
主にニューラルネットを中心とした手法を実装するためのフレームワークです. もちろんニューラルネット以外の手法を実装するためにも使えます.

平たく言えば、機械学習の手法を実装するためのパーツを集めたライブラリという認識で良いと思います.
裏を返せば「2, 3行で手軽に画像の分類ができるぜ」という類のものではないということです.

# なぜ実装そのものではなく実装のためのフレームワーク?
ニューラルネットは非常に設計の自由度が高い手法です.
現時点で大量の亜種が存在しますし, これからも登場するでしょう.
それらを一つずつ実装していてはキリがないので「パーツを用意しておいたから欲しい奴が勝手に実装しておいてね」という方向性になったわけです.

また, 研究者が新しい手法を提案して実装したいときは, 既存の手法の実装よりもそれを構成するパーツを貰った方が使い回せてありがたいはずです.

# 今まで似たようなものはあったの?
[Theano](http://deeplearning.net/software/theano/) や [Cainer](http://chainer.org/) がまさにそれです.
TensorFlow も含め, いずれもニューラルネットを強く意識したフレームワークで, GPU 計算をサポートしています.
適度に争って進化して欲しいですね.

# 誰が使うべきものなの?
ここまで読めば明らかですが, 研究開発のためのツールです.
機械学習はよく知らないけれど試しに使ってみたいという人が今すぐに手を出す必要はないでしょう.
とはいえ, そういう人にはまるで関係ないものというわけではなく, 最新の手法を誰かが TensorFlow などで実装して公開してくれれば, 誰でも世界最先端の手法を手軽に試せるようになるはずです.
そもそも TensorFlow 自体, Google が自社の最新の研究成果をオープンソースにしたいというモチベーションで作ったものらしいので, そのうち何かやってくれるでしょう.
お煎餅を食べながら期待して待ちましょう!!

# 個人的な感想
TensorFlow のワクワク感すごい.
TensorFlow 使いながらニューラルネット勉強しよう.
珍しくやる気出た.
HaxeのMapオブジェクトにはショートシンタックスが存在する

HaxeのMapオブジェクトにはショートシンタックスが存在していました。

```hx
// ふつーに書くとこう
var map: Map<String, String> = new Map();
map.set('foo', 'Foo');
map.set('bar', 'Bar');
map.set('baz', 'Baz');

// ショートシンタックスをつかうと、こう
var map = [ 'foo' => 'Foo',
            'bar' => 'Bar',
            'baz' => 'Baz' ];
```

とてもスッキリ書けます。
RubyのHashのgroup_byがHashではなく配列を返してくる

## 参考
http://stackoverflow.com/a/18841831/1979953
http://stackoverflow.com/a/4028362/1979953

## 例

```rb
sample = {
  A: 'a',
  B: 'b',
  X: 'a'
}

### 配列で返ってくる
g = sample.group_by{|k, v| v}
p g #=> {"a"=>[[:A, "a"], [:X, "a"]], "b"=>[[:B, "b"]]}

### 自力でHashに戻す
h = {}
g.each do |k, v|
  h[k] = v.map{|a| Hash[*a]}
end
p h #=> {"a"=>[{:A=>"a"}, {:X=>"a"}], "b"=>[{:B=>"b"}]}
```

でもなんでHashで返してくれないんだろう？
UnityのおすすめAsset紹介（エディタ拡張）

## 概要
所持しているアセットや今後購入したいアセットをまとめます。
http://qiita.com/takesuke/items/7c11690a0958dba6d74f

## AutoTileSet($10)
https://www.assetstore.unity3d.com/jp/#!/content/19038
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/81f88719-255f-9c85-b5b1-3f854d1a3b31.png)

## BulletMaker-lightning,tracing,scattering,cluster bullet($15)
https://www.assetstore.unity3d.com/jp/#!/content/35144
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/a98e5c98-c14c-ab6f-5b31-c32d0823fca5.png)
UnityのおすすめAsset紹介（テクスチャ＆マテリアル）

## 概要
所持しているアセットや今後購入したいアセットをまとめます。
http://qiita.com/takesuke/items/7c11690a0958dba6d74f

## Forest 2D Painted Environment($16)
https://www.assetstore.unity3d.com/jp/#!/content/31927
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/624823af-f254-555e-84a7-524d529443d2.png)

## HandyCraft - Forest Pack($30)
https://www.assetstore.unity3d.com/jp/#!/content/38517
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/a3f1e684-dee4-f2fb-2e7b-4c96cfb2ffb4.png)

## Yughues Free Ground Materials($0)
https://www.assetstore.unity3d.com/jp/#!/content/13001
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/134a6b40-293e-b5cf-735b-8573e27730a8.png)

## Platformer Tileset 9: Village($15)
https://www.assetstore.unity3d.com/jp/#!/content/34811
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/a59aa764-57f3-b243-3b83-58bebe5f3aa4.png)

## Fantasy Gui Pack($15)
https://www.assetstore.unity3d.com/jp/#!/content/17387
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/dd638128-56b5-83cd-9989-5fbdb681dbdb.png)
UnityのおすすめAsset紹介（スクリプト）

## 概要
所持しているアセットや今後購入したいアセットをまとめます。
http://qiita.com/takesuke/items/7c11690a0958dba6d74f

## A* Pathfinding Project Pro($100)
https://www.assetstore.unity3d.com/jp/#!/content/1876
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/03c12611-f732-c86d-dc51-8c6a97cd7177.png)

## Sprite Color FX($10)
https://www.assetstore.unity3d.com/jp/#!/content/28849
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/37712d46-c886-a7fe-4910-e95ba45d5011.png)

## Strategy Kit($20)
https://www.assetstore.unity3d.com/jp/#!/content/28111
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/6e72222e-2377-d0d4-d61f-9aa973eed4f5.png)

## Touch Controls Kit - Pro($15.95)
https://www.assetstore.unity3d.com/jp/#!/content/12373
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/0631bdc3-13cf-8426-7bbc-68222f8b16bb.png)

## Input.Touches($25)
https://www.assetstore.unity3d.com/jp/#!/content/3283
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/5f24c4d7-4472-cb8d-c4db-c4520855424b.png)

## Menu Starter Kit for Mobile and Desktop($19)
https://www.assetstore.unity3d.com/jp/#!/content/8572
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/ad3aa029-62f6-c064-a9a0-99a740294d20.png)
UnityのおすすめAsset紹介（particleシステム）

## 概要
所持しているアセットや今後購入したいアセットをまとめます。
http://qiita.com/takesuke/items/7c11690a0958dba6d74f

## Particle Ingredient Pack($10)
https://www.assetstore.unity3d.com/jp/#!/content/38436
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/4ebcb1db-d2d3-8c04-9bd2-3cde66566c78.png)

## Quest and RPG FX($10)
https://www.assetstore.unity3d.com/jp/#!/content/26936
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/db2f80c6-c55a-d689-7388-f0df50f6e21c.png)
UnityのおすすめAsset紹介（完成プロジェクト）

## 概要
所持しているアセットや今後購入したいアセットをまとめます。
http://qiita.com/takesuke/items/7c11690a0958dba6d74f

## Infinite Runner Ultimate($25)
https://www.assetstore.unity3d.com/jp/#!/content/23710
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/8ce8ff76-b2cf-a6fc-6b2c-96d594b58704.png)

## Draw Lines($17)
https://www.assetstore.unity3d.com/jp/#!/content/22988
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/79a4fe7e-5c80-48d8-456a-b5482162ab69.png)

## Bubble Shooter Match 3 Complete Project($99)
https://www.assetstore.unity3d.com/jp/#!/content/34517
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/1d8d6f5a-dd2e-5194-f146-04251bbc95f9.png)

## 2D Boxes Puzzle ToolKit($45)
https://www.assetstore.unity3d.com/jp/#!/content/32292
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/3fab036b-3023-b365-8de5-d35972015ee5.png)

## Endless Runner - Square Move($20)
https://www.assetstore.unity3d.com/jp/#!/content/37362
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/1ce6a17b-7588-1f8e-5c4d-00f4f9354bf5.png)

## Roll The Ball($5)
https://www.assetstore.unity3d.com/jp/#!/content/1565
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/09277279-4ab4-7147-8932-0310554631a1.png)

## 2D Infinite Runner Toolkit($55)
https://www.assetstore.unity3d.com/jp/#!/content/9236
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/86493662-28c5-f181-7635-bdb42460d8ff.png)
UnityのおすすめAsset紹介（3Dモデル）

## 概要
所持しているアセットや今後購入したいアセットをまとめます。
http://qiita.com/takesuke/items/7c11690a0958dba6d74f

## Scarecrow Pack / Animated / Low Poly($19.99)
https://www.assetstore.unity3d.com/jp/#!/content/21810
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/bdfab75b-54e8-8fb8-451f-e509eb2dbc29.png)

## Toon Character Pack($19.95)
https://www.assetstore.unity3d.com/jp/#!/content/6698
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/fa2fb1cf-336b-45d0-25d1-6c4387a8ee96.png)

## Spooky Cemetery Bundle($30)
https://www.assetstore.unity3d.com/jp/#!/content/22270
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/1b82f411-2df0-cb44-2bca-79a63cd2b1af.png)

## Asia Adventure Kit($39)
https://www.assetstore.unity3d.com/jp/#!/content/37517
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/e05bbd64-ec61-4ae2-9a14-183bf7bb38e6.png)

## Pioneer Town: Fantasy Rural Buildings($25)
https://www.assetstore.unity3d.com/jp/#!/content/34107
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/28c5419e-4fbb-0875-89e8-bd8ddbdfaa10.png)

## WitchWood($25)
https://www.assetstore.unity3d.com/jp/#!/content/23570
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/766baf8a-898b-0cfa-b9c3-ea1df589d557.png)

## Lich Pack($26)
https://www.assetstore.unity3d.com/jp/#!/content/30711
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/51273506-cf6d-de46-7eb2-ede43958bf80.png)

## HQ Apocalyptic Environment($20)
https://www.assetstore.unity3d.com/jp/#!/content/37462
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/e2cd7e29-8e5c-1abb-6deb-133e57ac7386.png)

## "Query-Chan" model($0)
https://www.assetstore.unity3d.com/jp/#!/content/20031
![image](https://qiita-image-store.s3.amazonaws.com/0/93944/ad62991a-2efd-d29a-7b9a-c06cb0ce2045.png)
2つのファイルの差分を出力するコマンド


# 比較するファイル
```test1.txt
あいうえお
かきくけこ
さしすせそ
たちつてと
```

```test2.txt
あいうえお
かきくけこ
さしスせそ
たちつてと
```

# diffコマンド

```bash:
$ diff test1.txt test2.txt 
```

```bash:結果
3c3
< さしすせそ
---
> さしスせそ
```

## diff -u

```bash:
$ diff -u test1.txt test2.txt 
```
gitっぽい結果になります
unified出力形式っていうらしいです

```bash:結果
--- test1.txt	2015-11-10 23:16:06.000000000 +0900
+++ test2.txt	2015-11-10 23:16:05.000000000 +0900
@@ -1,4 +1,4 @@
 あいうえお
 かきくけこ
-さしすせそ
+さしスせそ
 たちつてと
\ No newline at end of file
```

## その他のオプション

#### -b
スペースの違いは無視

#### -q
差分があるかどうかのみ返します

#### -i
大文字小文字の違いは無視
Elixirの Enum.map の使い方の覚え書き


`Elixir`のコードサンプル等に良く出てくるのだが、いまひとつ理解できないので覚え書き。

Enum.map(***数値***, fn(引数)-> IO.puts 引数 end) 
数値を引数に実行するとどうやら、引数は配列でなければならないようだ。

```
iex(1)> Enum.map(2, fn(x)-> IO.puts x end)
** (Protocol.UndefinedError) protocol Enumerable not implemented for 2
    (elixir) lib/enum.ex:1: Enumerable.impl_for!/1
    (elixir) lib/enum.ex:112: Enumerable.reduce/3
    (elixir) lib/enum.ex:1400: Enum.reduce/3
    (elixir) lib/enum.ex:1047: Enum.map/2
```

Enum.map(***文字列***, fn(引数)-> IO.puts 引数 end) 

実行するまでもないが・・・
エラー。

```
iex(1)> Enum.map("Hello",fn(x)-> IO.puts x end)                  
** (Protocol.UndefinedError) protocol Enumerable not implemented for "Hello" 
    (elixir) lib/enum.ex:1: Enumerable.impl_for!/1
    (elixir) lib/enum.ex:112: Enumerable.reduce/3
    (elixir) lib/enum.ex:1400: Enum.reduce/3
    (elixir) lib/enum.ex:1047: Enum.map/2
```

Enum.map(***配列***, fn(引数)-> IO.puts 引数 end) で実行するとOK。

```
iex(1)> Enum.map([2], fn(x)-> IO.puts x end)
2
[:ok]
```

当然以下は想定通り。

```
iex(2)> Enum.map([1,2,3,4,5], fn(x)-> IO.puts x end)
1
2
3
4
5
[:ok, :ok, :ok, :ok, :ok]
```


Enum.map(***文字列の配列***, fn(引数)-> IO.puts 引数 end) 
次に文字列配列。当然実行可能。

```
iex(3)> Enum.map(["Apple","Banana","Orange"],fn(x)-> IO.puts x end)
Apple
Banana
Orange
[:ok, :ok, :ok]
```


Enum.map(***マップ***, fn(引数)-> IO.puts 引数 end) 
無名関数の引数の形式を変えて実行すると想定通りの結果。

```
iex(4)> Enum.map(%{a: "Apple", b: "Banana", c: "Orange"}, fn{key, val} -> IO.puts val end)
Apple
Banana
Orange
[:ok, :ok, :ok]
```

まだまだ、直感でプログラムするには、手を動かして覚えることが多いです。関数型プログラミング。
fasdチュートリアル(メモ)

fasdを使おうと思って検索したら日本語ソースが見当たらなかったので公式を読んだのですが、
三ヶ月後には忘れていそうなので将来の為の備忘録です。おそらくいろいろと間違いもあります。
# fasdとは
公式でも書かれていますがautojumpやzといったツールにインスパイアされたツールであり、Fasd (pronounced similar to "fast") is a command-line productivity booster.という言葉の通り、コマンドラインでの生産性を爆速化してくれる物です。
# 導入
zshでoh-my-zshやpreztoといったフレームワークをご利用の方はpluginとしてfasdがあるのでそちらからでも入れられます。
普通にソースから入れる方は以下の方法でインストールして下さい。

```shell-session
git clone git@github.com:clvv/fasd.git
cd fasd
make install
#PREFIX=$HOME make install ホームディレクトリにインストールしたい方はこちらで
```

これでインストールは完了です。
後はお使いのシェル(bash or zshのみ)に

```shell-session
eval "$(fasd --init auto)"
```

と書き足して下さい。
# 使い方
まずは適当にcdで何か開発中のディレクトリに移動したり、DonwloadやPictures,Documentといった日頃から使っているフォルダにアクセスして見てください。
そしたら次のコマンドを打つと、そのディレクトリが表示されます

```shell-session
d
```

これはdirectoryのリストであり、fの場合はファイルです。aはanyで全てになります。
一応以下にそれぞれのコマンドの意味表を作りました。

| コマンド | 意味 |
|:-----------:|:------------:|
| f       |        ファイルのリスト化 | 
| d     |      ディレクトリのリスト化 | 
| a       |        全てのリスト化 | 
| s         |          検索 | 
| sd       |       対話的にディレクトリ選択 |
| sf    |     対話的にファイル選択 |  
| z       |       cd拡張 | 
| zz    |     対話的にcd | 

具体的な使い方は公式のexampleを殆ど丸パクリですが、以下のような感じです。

```shell-session
z foo              #fooを含むfrecency値が最も高いディレクトリに移動
f -e vim foo       #fooを含むfrecency値が最も高いファイルをvimで開きます
f js$              #jsで終わるファイルを一覧化
xdg-open `sf pdf`  #対話的に選択したpdfファイルをデフォルトビューワーで開きます
```

他にも以下のように打ってタブによる補完も出来たりします。

```shell-session
vim ,zs,rc<Tab>
vim ~/.zshrc

cp foo_bar.cpp d,myWo<Tab>
cp foo_bar.cpp ~/Project/myWorkspace
```
これも公式からの引用ですが、こんなエイリアスを貼ればより快適になります。

```shell-session
alias v = 'f -e vim'
alias open  = 'a -e xdg-open'
alias m = 'f -e cvlc'
```

さぁ、みなさんも今日から爆速ターミナル生活を送りましょう
PhantomJSでサイトのパフォーマンス測定

PhantomJSことはじめ
http://qiita.com/kwst/items/446eeb21d3297ca9de1a


# netsniff.jsでharファイルを作成する
PhantomJSのexampleのnetsniff.jsを使用してharファイルを作成します
https://github.com/ariya/phantomjs/blob/master/examples/netsniff.js

netsniff.jsを置いたディレクトリ上で下記を実行

```bash:
phantomjs --disk-cache=false netsniff.js http://www.google.co.jp > test.har
```

結果
同階層にtest.harができます
中身は測定結果がだらっと記されています

ざっくりとこんな感じのファイルです

```test.har
{
    "log": {
        "version": "1.2",
        "creator": {
            "name": "PhantomJS",
            "version": "2.0.0"
        },
        "pages": [
            {
                "startedDateTime": "2015-11-10T14:00:21.567Z",
                "id": "http://www.google.co.jp",
                "title": "Google",
                "pageTimings": {
                    "onLoad": 846
                }
            }
        ],
        ...
}
```
UIViewControllerから別クラスの要素を呼び出す場合にDelegateを使うと便利

カレントなクラスから別クラスに定義している要素を呼び出す場合にDelegateを使うと便利

+ 参照したい処理が別クラスに定義されており、同インスタンス上にオブジェクトが存在せず参照できない場合にハマッた時のメモ

やりたいこと
---
Delegateを使ってクラスBにクラスAの処理を委譲する

サンプル処理フロー
---

+ HogeViewController.swiftには画面を構成する要素を定義
+ FugaRequestViewController.swiftにはモデルの処理を行うアクションを定義
+ モデルの処理に失敗する
+ アラートを出す


実現する為に使用する手段
---
+ HogeViewController.swift上にDelegateを用意し、FugaRequestViewControllerクラスからHogeViewControllerクラスに処理を委譲する


```HogeViewController.swift

class HogeViewController:UIViewController, HogeViewControllerDelegate {

	let fugaRequest:FugaRequestViewController = FugaRequestViewController()

     // MARK: Life Cycle
	override func viewDidLoad()
    {
		super.viewDidLoad()

		// ここでデリゲートにHogeViewControllerのインスタンスを渡す
		self.fugaRequest.HogeViewControllerDelegate = self
	}

    // MARK: Gesture
	@IBAction func onTappedAction(sender: AnyObject)
    {
      // タップするとhttpリクエストを実行する
	   fugaRequest.fetchRequest()  
	}

	// アラート処理関数を定義。今回はデリゲートを使って動かす
	func showAlertWithTitleAndMessage(titleStr:String, 
                                      messageStr:String)
    {

        let alert:UIAlertController = UIAlertController(title:titleStr,
                                                        message:  
                                                        messageStr,
                                                        preferredStyle: UIAlertControllerStyle.Alert)
        
        let defaultAction = UIAlertAction(title: "OK",
                                          style: .Default, 
                                          handler: nil)

            alert.addAction(defaultAction)

            presentViewController(alert, 
                                  animated: true, 
                                  completion: nil)
    }

}
```

```FugaRequestViewController.swift

protocol HogeViewControllerDelegate
{
	// デリゲート関数を定義
	func showAlertWithTitleAndMessage(titleStr:String, messageStr:String)
}

class FugaRequestViewController:UIViewController 
{
    // MARK: Life Cycle
	override func viewDidLoad() 
    {
		super.viewDidLoad()
	}

	// httpリクエストを実行する関数
	func fetchRequest() 
    {
		let urlString : NSURL = NSURL({/* {APIリクエスト先のURLを記述} */})!
		let request : NSURLRequest = NSURLRequest(URL:urlString)

		// 非同期処理呼び出し
		NSURLConnection.sendAsynchronousRequest(request, 
                                                queue: NSOperationQueue.mainQueue(), 
                                                completionHandler: self.requestCallback()
	}
		
	// 処理取得結果処理
	func requestCallback(res:NSURLResponse?,
                         data:NSData?,
                         error:NSError?) 
    {
        if (error?.domain == NetWorkErrorCause) {
        
        	// エラーの場合に、HogeViewController上でアラートを出す
            HogeViewControllerDelegate?.showAlertWithTitleAndMessage("エラータイトル", 
                                                                     messageStr: "エラーが発生しました")
            return
        }

		// レスポンスの処理
	}
}

```
autoRuby的なやつを実装してみた。今更。

東京でへっぽこフロントエンドエンジニアやってるshun1982です。

近頃、所属プロジェクトで「氏名」->「フリガナ」の入力補助機能を実装することになった。。OTL
ふつふつと湧き上がる今更感は否めませんが、とりあえず個人用にメモ。。

[jquery.autoKana.js]https://github.com/harisenbon/autokana
も視野に入れたけど、なんか個人的には最終兵器的な感じがしてたので、jQuery挟んでますが、独自実装。

## 想定するDOM

```
<input type="text" name="name_first" class="js-nameFirst"> #姓
<input type="text" name="name_ruby_first" class="js-nameRubyFirst"> #セイ
```

こんな感じの「姓」と「セイ」のフィールド。 
PCとかSPとかで、「姓」に入力してたら自動的にフリガナ入力してくれたらいいな(・∀・)


## 方針

考えたのは、姓の入力って、
予測変換とかでさくっと入れられちゃう場合を除いて、PC・SP・英語入力・日本語入力問わず、
田中さんだったら、「た」→「たな」→「たなか」→「田中」となる気がする。

ということで、
この「たなか」を取得すれば、あとはカタカナ変換すればいいだけだし、なんとかなるんじゃないかという予感。

## コード
```
var autoInputNameRuby = function(inputName, inputNameRuby) {
    var ruby = $(inputName).val();
    if (ruby.match(/^[\u3040-\u309F]+$/) || ruby === '') {
        ruby = ruby.replace(/[ぁ-ん]/g, function(str) {
            return String.fromCharCode(str.charCodeAt(0) + 0x60);
        });
        $(inputNameRuby).val(ruby);
    }
};  
$('.js-nameFirst').on('keyup', function(e){
    autoInputNameRuby(e.target, '.js-nameRubyFirst');
});
```

こんな感じで、

keyupの度に値を取得して、ルビにするかどうかを都度見るように。
取得した値が、漢字になったらもういらない(-_-)/~~~ピシー!ピシー!
という感じにした。

なんかいい他の方法ないでしょかね。

おわり
Rails+MySQLでgem twitterするときの気を付けポイントメモ


抜けがちなのでメモ

## limit: 8
statusのidを保存するときはbigintにする必要

```ruby
t.integer :status_id, limit: 8
```

## utf8mb4
絵文字対応するならActiveRecordの設定必要
以下参考
[ActiveRecordをutf8mb4で動かす](http://qiita.com/kamipo/items/101aaf8159cf1470d823)

## take(100)
client.search("ほげ")で返るSearchResultsからツイート列を取得するにはtake(100)とかする

```ruby
client = Twitter::REST::Client.new do |config|
	#...
end
client.search("ほげ").take(100)
```


## また引っかかったらそのうち追記
[Java] スタック・キューのメモ


# 目的

- Javaのコレクションフレームワークの１つである スタック・キュー について、整理してみます。
- 各クラスやメソッドの詳細な説明はしません。

# 関連するインタフェース・クラス

## java.util.Queue

キュー専用のインタフェース。
一般的にキューといえば FIFO だと思います。
しかし Javadoc では `Queue` の実装として FIFO 以外のものがあっても良いとしています。

Javadoc であげられている実装例は３種類あります。

- FIFO (First In First Out) ： 一般的なキュー
- LIFO (Last In First Out) ： スタックをキューとして扱う場合
- プライオリティキュー ： 優先順位を持つキュー

## java.util.Deque

両端キュー。スタックとキューの両方として扱えます。
`Queue` インタフェースを拡張したもの。

Javadoc によると「デック」と読むらしい。

## java.util.LinkedList

双方向線形リスト。
線形リストなので、末端要素の追加・削除はお手の物。
もちろん `Deque` を実装しているので、スタックとしてもキューとしても扱える。

## java.util.ArrayDeque

配列型の `Deque` の実装クラス。
先頭の要素を削除しても、配列のコピーが発生しないようにいろいろ工夫されているみたい。
ただし、途中の要素を削除するのは苦手っぽい（そんなときは LinkedList かな）。

## java.util.PriorityQueue

`Comparator` や自然な順序付けで優先順位を求める優先キュー。

## java.util.Stack

名前は一般的ですが、古いコレクションフレームワークのものなので、基本は使用しないと思います。
このクラスは `Queue` も `Deque` も実装していないことに注意してください。

## java.util.Collections#asLifoQueue()

これはインタフェースでもクラスでもありませんが。
`Deque` のインスタンスを LIFO のキューに変換するアダプタメソッドです。
前述の LIFO のキューがほしい場合に使えます。

## java.util.concurrent.BlockingDeque

空の場合に、要素が別のスレッドから追加されるまでブロックすることができる `Deque` のインタフェースです。
類似のものに `java.util.concurrent.BlockingQueue` があります。

また、その実装クラスも java.util.concurrent パッケージにあります。

# 主な操作メソッド

## キュー用のメソッド

FIFO の場合、基本的に末尾に追加して、先頭から取り出します。
強調表示のメソッドが `Queue` インタフェースで定義されているものです。

| 操作 | 失敗時例外 | 戻り値判定 |
|:--|:--|:--|
| 末尾に追加 | addLast(), **add()** | offerLast(), **offer()** |
| 先頭から削除 | removeFirst(), **remove()** | pollFirst(), **poll()** |
| 先頭を取得（削除しない） | getFirst(), **element()** | peekFirst(), **peek()** |

## スタック用のメソッド

スタックは基本的に LIFO です。
先頭に追加して、先頭から取り出します。
強調表示のメソッドは古いフレームワークの `Stack` でも使われていたものです。

| 操作 | 失敗時例外 | 戻り値判定 |
|:--|:--|:--|
| 先頭に追加 | addFirst(), **push()** | offerFirst() |
| 先頭から削除 | removeFirst(), **pop()** | pollFirst() |
| 先頭を取得（削除しない） | getFirst() | peekFirst(), **peek()** |

## Deque のメソッド整理

`Deque` のメソッドは `Queue` と `Stack` のメソッドを集約しており、さらに直交性の高いメソッド名を用意しているため、異なる名前で同じ意味のメソッドがあります。

| 操作 | 失敗時例外 | 戻り値判定 |
|:--|:--|:--|
| 先頭に追加 | addFirst(), push() | offerFirst() |
| 末尾に追加 | addLast(), add() | offerLast(), offer() |
| 先頭から削除 | removeFirst(), remove(), pop() | pollFirst(), poll() |
| 末尾から削除 | removeLast() | pollLast() |
| 先頭を取得（削除しない） | getFirst(), element() | peekFirst(), peek() |
| 末尾を取得（削除しない） | getLast() | peekLast() |
CentOS 6 に最新 Git をrpmにしてインストール

[CentOS 6 に最新 Git をソースからインストール。コピペ用 - Qiita](http://qiita.com/hidekuro/items/58f1bf4b4f3cc8ac7c61) に触発されてパッケージ化してインストールする方法を書きました。

# tl;dr

```shell-session
curl -fsSL https://gist.githubusercontent.com/eru/2a8a342e499809cd12b4/raw/install-git-rpm-centos6.sh | sh
```

# 解説

### yumコマンド実行時にsudoを付けるか

```shell-session
MY_YUM="sudo yum"
if [ ${EUID:-${UID}} = 0 ]; then
    MY_YUM="yum"
fi
```

`${MY_YUM}`に、コマンド名を指定しておいて、`eval ${MY_YUM}`で実行することで、非rootユーザでも動くハズ

### gitパッケージが既にインストールされている場合には削除

```shell-session
eval ${MY_YUM} erase -y git
```

最終的なインストール時にコンフリクトがでるので予め削除しておく

### ビルドに必要なパッケージ類のインストール

```shell-session
eval ${MY_YUM} install -y tar gcc-c++ curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker rpmdevtools rpm-build xmlto asciidoc perl-Error
```

### rpmbuildを行うためのディレクトリツリーを作成と移動

```shell-session
rpmdev-setuptree
cd ~/rpmbuild/SOURCES
```

### 最新リリースの取得

```shell-session
GIT_VERSION=$(curl -sL https://www.kernel.org/pub/software/scm/git/ | sed -nre 's/<a href="git-([0-9\.]+)\.tar\.gz">.*/\1/p' | sort -t . -n -k 1,1 -k 2,2 -k 3,3 -r | head -n 1)
```

ほぼ@hidekuroの方法をパクらせてもらった。詳細はTOPのリンク先からどうぞ。

### ソースコードのアーカイブをダウンロード

```shell-session
curl -OL https://www.kernel.org/pub/software/scm/git/git-${GIT_VERSION}.tar.gz
```

早速取得したバージョン情報を使う。

### SPECファイルの抽出

```shell-session
cd ../SPECS
tar xvf ../SOURCES/git-${GIT_VERSION}.tar.gz git-${GIT_VERSION}/git.spec
mv git-${GIT_VERSION}/git.spec .
```

ビルドに必要なSPECファイルだけ展開する。実際はファイルを移動される必要はないが、所有者がビルドユーザと同一でないとrpmbuildでエラーがでるので、移動することで所有者を直してる。

### パッケージのビルド

```shell-session
rpmbuild -bb git.spec
```

srpmは特に必要ないので、`-bb`でバイナリパッケージだけ生成

### ビルドして出来上がったものをインストール

```
eval ${MY_YUM} localinstall -y ~/rpmbuild/RPMS/x86_64/git-${GIT_VERSION}-1.el6.x86_64.rpm ~/rpmbuild/RPMS/x86_64/perl-Git-${GIT_VERSION}-1.el6.x86_64.rpm
```

必要用最低限のものだけインストールしている。必要であれば、`git-svn`などもインストールできる。

# 後片付け

```
unset MY_YUM
unset GIT_VERSION

echo "Complete\!\nYou can delete build files 'rm -rf ~/rpmbuild'"
```

環境変数をアンセットして、完了した旨のメッセージを表示。
`~/rpmbuild`も削除してしまって問題ないが、前述の通り他のパッケージもインストールしたい人用にあえて残してある。

# 追記

## 2016-04-04
各バージョン番号が2桁以上になった場合に、最新の番号が取得できなかったので修正
Form Object実装メモ

やり方はいろいろ考えられる
ここに示すのはうまく動作した一例
Railsとかのバージョンによっても書き方が変わる

[7 Patterns to Refactor Fat ActiveRecord Models](http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/)

## ユースケース

例えば`User`モデルの`save`のパターンがたくさんあり、それぞれに関連するcolumns, validationsなどの違いが多く複雑になった時に、関心を分けるために使える

- パターン例
    - Signup
    - Sign In
    - Password Change
    - Update profile
    - Create users from importing
    - etc.
- パターンが2つ程度でシンプルな時は`validate :on/:if`などで間に合う

`@form = MyForm.new()`があたかも`@user`であるかのように`form_for`と一緒に使えるようにできる

## 実装

```rb:forms/my_form.rb
class MyForm
  include Virtus.model

  include ActiveModel::Model
  # 以下Rails3
  # include ActiveModel::Validations
  # include ActiveModel::Conversion
  # extend ActiveModel::Naming

  attr_reader :user

  attribute :email, String
  # Userに保存しないが、validationをかけたいattributeの例
  attribute :terms_of_use, Boolean

  # validations
  validates_acceptance_of :terms_of_use

  def initialize(user)
    @user = user
    self.attributes = @user.attributes
  end

  def persisted?
    false
  end

  # submit時のparamsのkeyに使われる -> params[:user] (無い場合params[:my_form])
  # form_forがURLを生成する時に使われる -> users_path (無い場合my_forms_pathなど)
  def self.model_name
    ActiveModel::Name.new(self, nil, "User")
  end

  # List attributes defined with virtus
  # controllerで @form.update(user_params) を呼ぶ時のpermitに使える
  #   user_params -> params.require(:user).permit(*MyForm.column_names)
  def self.column_names
    attribute_set.map(&:name)
  end

  def update(params)
    self.attributes = params.to_h # 実装によって変わる
    if valid?
      persist!
      true
    else
      false
    end
  end

  private

    def persist!
      @user.update!(self.attributes) # 実装によって変わる
      # userに含まれない一時的な値なら self.attributes.except(:terms_of_use) などとできる
      # 複数のmodelを扱うことも可能
    end
end
```

### form + routes

```rb:routes.rb
resource :user, only: [:edit, :update]
```

```haml:edit.html.haml
= form_for @form, url: user_path, method: :put do |f|
```

### I18n

[ActiveRecord/ActiveModelの翻訳](http://ruby-rails.hatenadiary.com/entry/20150226/1424937175)

`activerecord`のキーではうまく動作しなかった
`activemodel`にエイリアスする

```yaml
en:
  activerecord: &activerecord
    errors:
      ...
    models:
      ...
    attributes:
      ...
  activemodel:
    <<: *activerecord
```

### 参考

[RailsCasts Form Objects](http://railscasts.com/episodes/416-form-objects)

関連gem
[reform - Form objects decoupled from models](https://github.com/apotonick/reform)
gemに依存するコストがかかる可能性がある

`model_name`の部分
[How should I handle edit and update action when I use Form Object?](http://stackoverflow.com/questions/17064148/how-should-i-handle-edit-and-update-action-when-i-use-form-object)
【Koala】Sassで日本語を使う

KoalaのSassで日本語を使うと「Invalid US-ASCII character」というエラーが出た
※before、afterのcontentで日本語を使いたかった

#解決
プロジェクトフォルダ/config.rbに以下を追加

```rb

Encoding.default_external = "utf-8"
```

参考：[Input⇔Output — Sass で「Invalid US-ASCII character」とか言われる](http://blog.nagomu.me/post/62195838769/sass-%E3%81%A7invalid-us-ascii-character%E3%81%A8%E3%81%8B%E8%A8%80%E3%82%8F%E3%82%8C%E3%82%8B)
Windows環境にVCCWをインストールした時のメモ

環境：Windows 8.1（64bit）

基本的には[VCCWのサイト](http://vccw.cc/)のGetting Startedの手順でいけるハズ。

1. Install Virtual Box.  
既にインストール済みだったがバージョンが古かったので5.0.8にアップデート  
2. Install Vagrant.  
https://www.vagrantup.com/ からWindows版をダウンロードしてインストール
C:\>vagrant -v
Vagrant 1.7.4  
3. Install the vagrant-hostsupdater plugin. (Optional)  
コマンドプロンプトから`vagrant plugin install vagrant-hostsupdater`を実行  
C:\\>vagrant plugin install vagrant-hostsupdater  
Installing the 'vagrant-hostsupdater' plugin. This can take a few minutes...  
Installed the plugin 'vagrant-hostsupdater (1.0.1)'!  
**※インストールしたけどWindowsの場合は不要で、hostsファイルに192.168.33.10 vccw.devを追記する必要がある**  
4. Download vagrant box  
コマンドプロンプトから`vagrant box add miya0001/vccw`を実行  
**※なぜかダウンロードが遅く、１時間ぐらいかかった**  
5. Please download .zip or .tar.gz.  
[Zipファイル](https://github.com/vccw-team/vccw/archive/2.17.0.zip)をダウンロードして、任意のフォルダに解凍する  
（ダウンロードする場合は公式サイトから最新版を！）  
6. Change into a new directory.  
C:\\>cd vccw-2.17.0  
7. Start a Vagrant environment.  
8. Visit WordPress on the Vagrant in your browser  
http://vccw.dev/ または http://192.168.33.10/ にアクセスする。  
WordPressのログイン画面は、http://192.168.33.10/wp-login.php から。  
Username、Password共にadminで。  

***  
4のダウンロードに失敗すると、リトライしても`HTTP server doesn't seem to support byte ranges. Cannot resume.`エラーが発生してダウンロードに失敗する。その場合は、C:\Users\USER_NAME\.vagrant.d\tmpにある一時ファイルを削除してリトライすればOK！
gitの変更があるファイルを一括でエディタで開く

## できること

- 現在変更のあるファイルを一気にエディタで開く
  - `$ git open`
- あるリビジョンで変更のあったファイルを一気にエディタで開く
  - `$ git open show abcdef`
- 他、gist参照

使っているエディタはSublime Text

エディタでタブが開き過ぎていて一度リセットしたい時などに、すべて閉じてから`git open`を使うと楽

## 元となった記事

[Open all files from a git diff or git show with this handy command utility](http://arnorhs.com/2011/12/25/open-all-files-from-a-git-diff-or-git-show-with-this-handy-command-utility/)

元のGist [gitopen.sh](https://gist.github.com/arnorhs/1517095)

## 設定方法

- `EDITOR`の部分を変える
- `~/bin`などにパスを通して、その下に配置しておく
- gitのaliasを設定 (`~/.gitconfig`)
  - [alias]のところに`open = !sh ~/bin/gitopen.sh`を追加
  - もしかして`~/bin/git-open`にすればalias無しで動く？（未確認）

```bash:gitopen.sh
#!/bin/bash

# This script will open all files from a git diff or a git show in vim.

# My bash skills are a bit primitive so this can probably be done more intelligently

# Usage:
#   gitopen -- opens all added files that have changed since HEAD
#   gitopen diff HEAD -- these are the default parameters
#   gitopen diff master -- opens files that have changed from master
#   gitopen show -- opens files that were changed in the last revision (HEAD)
#   gitopen show HEAD -- default param, does the same
#   gitopen show 4b3ca34 -- opens a particular REV

# It's set to use macvim as the default editor, you can change that easily by
# changing this line:
EDITOR=subl

COMMAND=diff
REV=HEAD

if [ $1 ]; then
    COMMAND=$1
fi

if [ $2 ]; then
    REV=$2
fi

if [ $COMMAND = "show" ]; then
    PARAM='--pretty=format: --name-only'
else
    PARAM='--name-only'
fi

git $COMMAND $PARAM $REV | xargs $EDITOR
```

### その他

GitHubのページをブラウザで開く別の[git open](https://github.com/paulirish/git-open)もあった
ReactNativeのNavigationBarの高さを調べる

今のところ、ReactNativeを使ってナビゲーションを実装する場合、NavigatorIOSを利用する方法のドキュメントやサンプルコードはたくさん見つかりますが、Navigatorに関するものは少ないようです。

NavigatorIOSではなくNavigatorを使う場合、以下のようにトランジションしないView要素として`navigationBar`を指定する事ができます。

```xml
<Navigator
  style={styles.navigator}
  navigationBar={
    <Navigator.NavigationBar
      style={styles.navigationBar}
      ... />
  }
  ... />
```

しかしながら、この`navigationBar`は`position:"absolute"`でコンポーネントの上に配置されるため、Navigatorで表示したいコンポーネントと重なってしまいます。
NavigatorにNavigatorの高さの分だけ`paddingTop`を設定してやればよいのですが、この値をどこから取得すればよいのかはっきりしたドキュメントが見つからずに苦労しました。
結局ソースコードを探しまわったところ、以下で参照される値がステータスバーの高さ＋ナビゲーションバーの高さを表すもので、

```js
Navigator.NavigationBar.getDefaultProps().
  navigationStyles.General.TotalNavHeight
```

これをNavigatorのstyleの`paddingTop`に設定すればちょうどいい塩梅にコンポーネントが配置されるようです。

デフォルトでそうなってて欲しい感じですが、今後の発展に期待です。
FaradayでリクエストパラメータのArrayに括弧をつけない

解決に少し手間取ったのでメモ
検索用キーワード: faraday array params without square brackets

## 問題点

Faradayでリクエストした時のパラメータが`foo_ids[]=1&foo_ids[]=2`のようになってしまう
（ちなみにこの`[]`を付加するのはRailsでは標準になっているが、Web全体の標準というわけでは無いらしい）

`foo_ids=1&foo_ids=2`のようにしてリクエストしたい

## 解決方法

`Faraday::FlatParamsEncoder`を使う


```rb
Faraday.new(:url => base_url) do |faraday|
  faraday.request :url_encoded # form-encode POST params
  faraday.options.params_encoder = Faraday::FlatParamsEncoder
  ...
end
```

## VCRを使う場合

テストの時にVCRを使う場合、問題がある
WebMock(`config.hook_into :webmock`)を使った場合に確認済み（他のlibraryは未確認）

ここで起こる問題は、`foo_ids=1&foo_ids=2`などをリクエストすると、実際のリクエストは問題ないが、cassetteに記録される時のURI(Query String)が`foo_ids=2`の様に同名paramの最後の1つだけが記録される。

以下の設定を追加して解決

```rb:spec/support/vcr.rb
WebMock::Config.instance.query_values_notation = :flat_array
```

関連箇所は
_webmock-1.22.3/lib/webmock/util/uri.rb_ の次のあたり

```rb
      NORMALIZED_URIS = Hash.new do |hash, uri|
        normalized_uri = WebMock::Util::URI.heuristic_parse(uri)
        if normalized_uri.query_values
          sorted_query_values = sort_query_values(WebMock::Util::QueryMapper.query_to_values(normalized_uri.query, :notation => Config.instance.query_values_notation) || {})
```

## その他

参考Issue

[Faraday handles repeated query parameters incorrectly](https://github.com/lostisland/faraday/issues/182)

関連する部分

`/faraday-0.9.2/lib/faraday/parameters.rb`内の
`elsif value.is_a?(Array)`の辺り
`[]`は`%5B%5D`になっている

`options.params_encoder`などのオプションはリクエストレベルでも変えられる

今回の事象はRailsのウェブアプリ相手には起きないが、Rails以外の環境で作られたアプリケーションと連携する場合必要となることがある。
画像・PDF・それ以外のファイルを同じPaperclipでアップロードする

もともと画像をアップロードするために[Paperclip](https://github.com/thoughtbot/paperclip)を使っていましたが、同じフォームで画像以外もアップロードできるようにして欲しい、ということになったので拡張を行いました。ただ、何点か引っかかってしまいました。

# まず、Paperclipとは？
Paperclipは、Railsアプリへ簡単にファイルアップロード機能を実装できるGemです。画像のサムネイル生成やS3へのアップロードなど、多くの機能をこれ1本でまかなえてしまいます。[こんな感じ](http://qiita.com/zaru/items/61837f55f7d8f1ce5580)で、組み込みも手間ではありません。

## 利用する外部ツール
なお、画像処理などのために、各種の外部ツールを使います。

* `file`…ファイルタイプの識別
* ImageMagick…画像のサムネイル生成などの処理
* GhostScript…PDFの処理

Unix系ではそこまで問題でもないレベルの話なのですが、Windowsで使う場合はこの辺りで意外とてこずったりもします。


# 画像とそれ以外を混合する場合に
画像とそれ以外のファイルを混ぜる場合、画像にサムネイルを生成していたとしても、画像以外では生成を止める必要があります。`before_post_process`にシンボルを指定すると、その名前のメソッドを呼び出して、返り値が`false`ならサムネイル生成に進まなくなります。

で、以下のように書いたのですが、うまく動いてくれませんでした（もともと画像用だった名残りで、`image`という名前でファイルを登録しています）。

```rb:before_post_processの失敗例

before_post_process :is_picture?

def is_picture?
  image_content_type =~ /\Aimage\//
end
```

こう書いたところ、サムネイル生成をバイパスできず、エラーになってしまいました。調べてみると、実は正規表現の`=~`は、ヒットしなかった場合に**`nil`**を返して、しかも`before_post_process`は`nil`が帰ってきた時にはそのまま処理を続けてしまう、とのことでした。確実に`false`を返すような式・メソッドを使う、あるいは`!!`で二重否定して`true`・`false`を強制する必要があります。

# PDFのサムネイル生成
ImageMagickがGhostScriptを呼び出すことで、PDFに対してもサムネイルの生成ができます。ただ、もちろんサムネイルをPDF形式で作ってもあまり役に立たない場面も多いですが、Paperclipでは形式指定をしてサムネイルを作れるので、その点の心配はありません。

ただし、JPEGを指定すると1つ問題が起きることがあります（問題発生の経緯を考えると、PNGやGIFを指定すれば大丈夫だとは思いますが確認していません）。というのも、PDFは「白い紙」へ印刷するのが前提だからか背景色がなく、透過になっているので、JPEGのような透過のない形式に変換しようとすると、その背景が黒くなってしまうのです。

同様の報告が[StackOverflow](http://stackoverflow.com/questions/10934456/imagemagick-pdf-to-jpgs-sometimes-results-in-black-background)にありましたが、ImageMagickへの引数を調整することでも解決する、とのことでした。

```rb:指定例
has_attached_file :image,
  styles: { thumb: ['200x200', :jpg] },
  convert_options: { thumb: '-flatten' }
```

なお、画像形式に応じて細かく調整したい場合には、`styles`や`convert_options`にラムダを渡すこともできるようです。
python > tuple > data,address = s.recvfrom(10000)

[SO](http://stackoverflow.com/questions/3960680/missing-messages-when-reading-with-non-blocking-udp)
にあるコード

```read_nb.py
    try:
        data,address = s.recvfrom(10000)
```

`data,address =`という書き方がよくわからなかった。

<hr>

http://docs.python.jp/2.6/library/socket.html
> socket.recvfrom(bufsize[, flags])
> ソケットからデータを受信し、結果をタプル (string, address) として返します。

これがtupleというものなのか。
代入の場合は上記のように書く、というのは分かった。
Docker ARG がimage量産に便利

https://github.com/docker/docker/pull/15182

Docker 1.9 がでて、 `ARG` という項目が追加されました([document](http://docs.docker.com/engine/reference/builder/#arg))。
概要としては、 `docker build` 時に `--build-arg <KEY>=<VAL>` として渡した変数が Dockerfile 内で利用できるというものです。

個人的には環境変数を拾ってくれるのが欲しかったのですが、今回は据え置きで、あくまで Dockerfile 内の `ENV` 命令でセットされたものだけが、解釈対象だそうです。

どういう用途で便利かというと、

* 設定だけを変えた同じイメージを量産したい場合

これです！これができるようになりました。

例えば、 `ulimit` の値を変えたイメージを作りたい場合にはイメージを2つ作るための Dockerfile を作るか、`docker run` の時の `ENV` を拾って `sed` などのコマンドでほげほげしたりするスクリプトを書いたり、だったと思います。
その他、例えば、同時接続数が違うだけの nginx の設定ファイルとかを、設定ファイルだけ数多く用意しておいて、作り分けるなどが可能になります。

## 使い方

```
% ls *.cnf
10.cnf 100.cnf 50.cnf
% cat Dockerfile
FROM busybox
MAINTAINER muddydixon@gmail.com

ARG MAX_CONNECTION=${MAX_CONNECTION:-100}
COPY MAX_CONNECTION}.cnf /tmp/${MAX_CONNECTION}.cnf

% docker build --rm -t dockerarg-default .
% docker run -it --rm dockerarg-default ls /tmp
100.cnf

% docker build --rm --build-arg MAX_CONNECTION=50 -t dockerarg-50 .
% docker run -it --rm dockerarg-50 ls /tmp
50.cnf

% docker build --rm --build-arg MAX_CONNECTION=10 -t dockerarg-10 .
% docker run -it --rm dockerarg-10 ls /tmp
10.cnf
```

便利！
Delegation

#Delegation

・あるクラスの処理の一部をあるクラスに任せる
・他のクラスへメッセージを送る
・特定のアクションに反応するために使われる
・デリゲートを実装する時に考えることは何を委譲するか(なんの処理を呼ばせるのか)を決めるだけです。
誰に委譲するか(どこから呼ぶのか)は考えなくて良いです。 

##なんで嬉しいの
・保守しやすくなる
・循環参照がなくなり、メモリ管理面のメリットが生じる

##以下　訳文
```
Delegation is a design pattern that enables a class or structure to hand off (or delegate) some of its responsibilities to an instance of another type. This design pattern is implemented by defining a protocol that encapsulates the delegated responsibilities, such that a conforming type (known as a delegate) is guaranteed to provide the functionality that has been delegated. Delegation can be used to respond to a particular action, or to retrieve data from an external source without needing to know the underlying type of that source.

Delegationはデザインパターンです。
それは、クラスや構造体に他のタイプに、インスタンスに対して幾つかの責務を手渡すことを可能にします。
デザインパターンは、プロトコルに定義づけられる事によって処理、実行されます。
それは、委任された責務をカプセル化し、適合した型が委任された機能を提供する事ができる事を保証します。

・Delegationは、特定のアクションに反応するために使われる
・あるデータの基本的な型を知る事無しに、外部のソースコードからデータを回収する事ができる。
```

参考
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html#//apple_ref/doc/uid/TP40014097-CH25-ID276
UIDeviceOrientationの謎tips


UIDeviceOrientationの謎tipsになります。

# TL;DR

- **iOS9のiPadではUIDeviceOrientation.FaceUp .FaceDownが取得できなくなっている模様です**
- Landscapeのときに`UIApplication.sharedApplication().statusBarOrientation` と`UIDevice.currentDevice().orientation` が返す値はRightとLeftが逆になる
- ビューのレイアウトをUIDeviceOrientationに追従させてはいけません

# OS9のiPadではUIDeviceOrientation.FaceUp .FaceDownが取得できなくなっている模様です

iOS9のiPad系ではFaceUpとFaceDownが取れないようです。
[UIDevice Class Reference](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIDevice_Class/)にも特に記述がなく。

下記の2通りの方法で確認しました。

- UIDeviceOrientationDidChangeNotificationの通知
- UIDevice.currentDevice().orientation

| 端末 | OS | FaceUp FaceDownとれた |
|:-- |:--|:--|
iPad mini | iOS8|YES
iPad mini 2 |iOS8|YES
iPad Air    |iOS7|YES
iPad mini 2 |iOS9|NO
iPad mini 4 |iOS9|NO
iPad Air  2 |iOS9|NO


手元のデバイスでも確認したい方はこちらのサンプルをどうぞ。
https://github.com/toshi0383/OrientationSample

これ、意外と困る人いるのでは？謎です。
iPhoneはiOS9でも大丈夫でした。

# Landscapeのときに`UIApplication.sharedApplication().statusBarOrientation` と`UIDevice.currentDevice().orientation` が返す値はRightとLeftが逆になる

このように。知っている人は知っているみたいですね。
![ss.PNG](https://qiita-image-store.s3.amazonaws.com/0/35008/453fd9fb-e288-2f71-8652-26d2cae44928.png "ss.PNG")

statusBarOrientationはホームボタンの位置、DeviceのOrientationはカメラの位置を指しているようです。
つまりこれは、iPhoneを右に傾けた状態です。

なにかの意図があるのでしょうか。まったくもって謎です。

追記：UIApplication.hのヘッダファイルに記載がありました。

```
// Note that UIInterfaceOrientationLandscapeLeft is equal to UIDeviceOrientationLandscapeRight (and vice versa).
// This is because rotating the device to the left requires rotating the content to the right.
```

だそうです。

# ビューの回転をUIDeviceOrientationに追従させてはいけません

[UIDeviceOrientationDidChangeNotificationを契機に回転時のレイアウト処理をしているライブラリ](https://github.com/nicolaschengdev/WYPopoverController)を使っていることによるバグに遭遇しました。
ポップオーバーが出ている状態でデバイスを回転しまくるとレイアウトが崩れるというやつです。
このライブラリはもう1年以上放置されていてiOS9とかもちろん対応していないしそらまともに動かんのだろうなーとか思っていたんですが、そういうレベルではなかったので共有したくなったというのがこのまとめのそもそもの動機でした。まとめる過程で上記の謎が出てきてしまいモヤモヤしましたが。

そもそもの動機はそうなんですが、UIInterfaceOrientation使いましょうねというのが言いたかっただけなのでこれで以上になります。

# おわり

最近は、Objective-Cで書かれた有名なライブラリでもだんだんメンテされなくなっているようで、既存のレガシーなアプリは結構辛い時期かもしれませんね。

それではみなさま楽しいプログラミングライフを。
共有ライブラリの仕組み

# はじめに
共有ライブラリについて簡単にまとめてみました

# 共有ライブラリとは
https://e-words.jp/w/%E5%85%B1%E6%9C%89%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA.html

* 共有ライブラリとは、部品化されたプログラムの集合であるライブラリの一種で、複数のプログラムから共有・共用されるもの。
* C言語でmain関数の中を空にしてもスタートアッププログラムがリンクされる。
* UNIX系のOSでは「.so.(バージョン番号)」という拡張子のファイルとして、また、Windowsの場合は「. DLL」という拡張子のファイルとして提供される。

# 実行形式の共有ライブラリの確認

```bash
ldd a.out 
	linux-gate.so.1 =>  (0xb776e000)
	libc.so.6 => /lib/libc.so.6 (0x49cbd000)
	/lib/ld-linux.so.2 (0x49c95000)
```
* .soフアイルが共有ファイル


# 共有ファイルの仕組み
## 仮想メモリ
* 共有ライブラリは物理メモリに1つ存在していて、複数のプログラムから共有される
* 各プロセスは各々で仮想メモリ空間に共有ライブラリがロードされる。その時の共有ライブラリは各プロセスでメモリ番地が異なる

## 動的リンク
* 共有ライブラリはプログラム実行時に動的にリンクされる。それまでは共有ライブラリの関数などの番地は空欄？

## 共有ライブラリのシンボル解決
共有ライブラリは各プロセスで共有されて、各プロセスの仮想メモリにはそれぞれ別のメモリ番地に割り当てられる。さらに共有ライブラリは実行時にリンクされるので実行時までメモリ番地が決定されない。よってプログラムの実行時には共有ライブラリの参照箇所はシンボル解決が行われていな。なので、実行時には決定されていない共有ライブラリのメモリ番地を調べてシンボル解決する仕組みが必要になる。それがGOTとPLT。

## 位置独立コード
https://ja.wikipedia.org/wiki/%E4%BD%8D%E7%BD%AE%E7%8B%AC%E7%AB%8B%E3%82%B3%E3%83%BC%E3%83%89

* GOT、PLTの仕組みから成る主記憶装置内のどこに置かれても絶対アドレスに関わらず正しく実行できる仕組みのこと。共有ライブラリがその仕組を利用している。
* 各プログラムが（例えば他の共有ライブラリに）使われていない任意の別々のアドレスに同じ共有ライブラリをロードして使うことができるようになる。

## GOT、PLTその前に
* 共有ライブラリは実体は物理メモリに一つあるのみで、各プロセスから共有されている。各プロセスでは各々で仮想空間上の異なるメモリ番地に共有ライブラリをマッピングしている。よって、各プロセスでロードしているメモリ番地が異なるので、共有ライブラリの関数などを使用する際のメモリ番地を決定することはできない。そこでGOTとPLTを用いてメモリ番地を決定している。
* GOTとPLTは各プロセスが各々で保持している

## GOTとPLTの流れ
* 実行ファイルから共有ライブラリの関数を実行。例えばpfintfを使用する場合、アセンブラで見るとprintf@pltとなっている
* まず、pltセグメントに処理が飛ぶ。初回はシンボル解決して解決した関数の番地をGOTに埋め込む
* 2回目のアクセスもpltセグメントに飛ぶ。2回目はGOTに飛ぶ処理になり、目的の関数がGOTにすでに埋め込まれているので目的の関数が実行される

## GOT
* 直接共有ライブラリへ参照はせず、GOT領域を使用する。GOTはデータ領域に配置されるので各プロセスが独自に持てる領域。なので各プロセスはここで各々プロセスによって異なる共有ライブラリへの参照を保持する。
* 初期値はその共有ライブラリへのシンボル解決するメモリ番地への値が入っていてシンボル解決するとこの各共有ライブラリの関数などに対応するGOT領域にアクセスすれば共有ライブラリに参照ができる。

## PLT
* PLTは対象の共有ライブラリへ参照するためにGOTに飛ぶ。PLT→GOT→共有ライブラリ