OmniAICreator/Qiita-1.07M huggingface dataset:
Mavenメモ2 mvnコマンド

引き続き、Mavenの学習のメモ(その2)です。

・
1.サイトの作成 

	mvn site
target/site以下に、プロジェクトのサイトを作成する。(index.htmlから確認可能)


2.jarファイルの作成 

	mvn package
target以下に、プロジェクトのjarファイルを作成する。
ファイル名は、「artifactId + バージョン + .jar」。
例) sample-1.0-SNAPSHOT.jar

3.ローカルリポジトリへの配備 

	mvn install
プロジェクトのjarファイルを、ローカルリポジトリ(.m2以下)に配備する。
他プロジェクトから参照可能

4.リモートリポジトリへの配備

	mvn deploy
プロジェクトのjarファイルを、リモートリポジトリ(pomのdistributionManagement要素に記載されたもの)に配備する。

5.プロジェクトのクリーン

	mvn clean
target以下を削除する。

やっと、少しずつMavenと友達になれてきた気がする。

◆進捗
Maven | TECHSCORE(テックスコア)の
「Maven 2章　Maven 入門」まで完了

◆参考サイト
・Maven | TECHSCORE(テックスコア)
http://www.techscore.com/tech/Java/ApacheJakarta/Maven/index/
ruby predefined variable $0

http://ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/variable.html#zero


```rb
#2.rb
puts $0
puts $0.class
```

```bash
vagrant@precise64:~/data$ ruby 2.rb 
2.rb
String
```

```rb
#2.rb
sleep 1000
```

```bash
vagrant@precise64:~/data$ ruby 2.rb &
[2] 3274
vagrant@precise64:~/data$ 
vagrant@precise64:~/data$ ps aux | grep rb
vagrant   3274  1.6  0.3  32996  7200 pts/0    Sl   13:09   0:00 ruby 2.rb
vagrant   3277  0.0  0.0   9620   944 pts/0    R+   13:09   0:00 grep --color=auto rb
```

```rb
#2.rb
$0 = "fuckyou.rb"
sleep 1000
```

```bash
vagrant@precise64:~/data$ ruby 2.rb &
[3] 3280
[2]   Killed                  ruby 2.rb
vagrant@precise64:~/data$ ps aux | grep rb
vagrant   3280  2.0  0.3  32980  7200 pts/0    Sl   13:10   0:00 fuckyou.rb
vagrant   3283  0.0  0.0   9620   944 pts/0    S+   13:10   0:00 grep --color=auto rb
```

http://stackoverflow.com/questions/4687680/what-does-if-file-0-mean-in-ruby

```rb
#1.rb
require './2'
puts $0
```

```rb
#2.rb
if __FILE__ == $0
	puts "ok"
end
```

```bash
vagrant@precise64:~/data$ ruby 1.rb
1.rb
vagrant@precise64:~/data$ ruby 2.rb
ok
```
UIUX改善リニューアルに向けてのディレクションとUI設計準備メモ

前提：
・UI改善/スピード改善が目的のリニューアル
・今回は、エンジニアサイドで、ディレクション部分もカバー

## まずUIUXについて基本をおさらい

### UIとは
> UIはユーザーインターフェイス（User Interface）の略です。
> Interfaceとは「接点、接触面」という意味で、UIはユーザーと製品・サービスの接触面を指すので、「ユーザーの目に触れる部分使用する部分」はすべてUIとみなすことができます。
> ホームページの場合、パソコンやスマートフォンに表示されるデザイン、フォントなど、製品であれば製品そのものや外観など、ユーザーの視覚に触れる全ての情報が「UI」と呼ばれます。

### UXとは
> UXはユーザーエクスペリエンス（User Experience）の略です。Experienceとは「体験、経験」を意味し、UXとは「ユーザーが製品・サービスを通じて得られる体験」を指します。

参考：[UIとは？UXとは？違いを理解しよう！｜ferret [フェレット] ](https://ferret-plus.com/655)


### 私なりに考える理想の「UIUX設計」とは、
上記踏まえて、

```
ユーザーが、ストレスフリーにそのサービスの価値(体験)を得られるUIを設計すること。
そして、それによってサービスを人にも薦めたくなるような満足感(体験)をユーザーが得れるようにすること
```

## UIUX改善リニューアル設計を具体的に描く前の準備

- [x] リニューアル(サイト)の目的の確認
- [x] ビジョン・サービスのコンセプトなど方向性の確認
- [x] ターゲットユーザー・ペルソナの確認
- [x] ユーザーヒアリング
- [x] 現サイトのダメ出し
- [x] 参考にしたいサイト候補の収集
- [x] 現サイトの機能洗い出し
- [x] 現サイトの機能の優先度確認
- [x] カスタマージャニーフレームワークにそった現状と理想を整理
- [x] 今回の目的を叶えるために重要となる機能/要素の確認
- [x] ★ユーザーアクション洗い出し/分類/優先順位付け
- [x] ★ユーザーシナリオまとめ


## デザイナーさんにUI設計をお願いするための準備

下記のスライドで紹介されているものをもとに、少しカスタマイズしてやってみました。
上記であげている、★の部分になります。

UIUX設計参考スライド： [UXのためのUIデザイン](http://www.slideshare.net/hironobuaoki/uiux-13149154)

### ＜紹介されていたUIUX設計ステップメモ＞

- [x] 1. ユーザーアクションを挙げる
- [x] 2. ２つに分ける
　

> 分類1. 一次的アクション（mandatory） ユーザーがUXを達成する上で、必ず行うこと。
> 分類2. 二次的（副次的）アクション（optional）

※補足：
> 分類１の達成に不可避だが、二次的なもの（e.g. アカウントを作る。）
> サポートしなくてもユーザーはUXを達成できるが、
> サポートすることでよりよい UXが提供できるもの。
> 上記に分けられないものは捨てる

- [x] 3. 優先順位をつける

> ユーザーが期待するアクション(何をしたいか？)
> ユーザーがよく行うアクション (何を行うか？)

- [x] 4. 描く


### ＜上記を参考にUIUX設計ステップを進めてみる＞

- [x] 1. ユーザーアクションを挙げる

- [x] 2. 分ける
　→カスタマージャーニー※1を先に整理していたので、分類を２つではなく、
　　カスタマージャーニーの横軸で振り分けてまとめました

　　※1：
　　カスタマージャーニーとは、簡単にいうと顧客がサービスゴールに至るまでのプロセス
　　カスタマージャーニーについて参考： [顧客をより具体的にイメージできる「カスタマージャーニー」とは？｜ferret [フェレット]](https://ferret-plus.com/856)

- [x] 3. 優先順位をつける

- [x] 4-1. ユーザーシナリオ※2を数パターン整理する

　　→UIを描く前に、
　　　デザイナーさんと３まで共有をして、
　　　もっと具体的に描くには、ユーザーシナリオを数パターン整理しておくことが必要と
　　　アドバイスを頂いてユーザーシナリオを整理することにしました。

　　※2：
　　ユーザーシナリオ整理の仕方参考：
　　 [ユーザーシナリオから考える、ユーザー視点に立ったWebデザインの作り方- Catcher in the tech](http://catcher-in-the-tech.net/841)

- [x] 4-2. UIを描く

まずは、手書きレベルのラフ案を書いて protなどをつかって検証
そこからよければ、モックアップで検証して、作りこんでいく


## WebサイトUI改善参考本

具体的なUIに落とし込んでいいくのは、まだこれからですが、
デザイナーさんに出して頂いたものに対して、意見交換ができるように
今のうちに出来ることとして、UIUX系の本を数冊読みかじってみてよかったなと思った本がありました。

本：[だから、そのデザインはダメなんだ。](https://www.amazon.co.jp/dp/B01EGY0DW0/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

タイトルは、きつめですが^^;
学術的なUXについてまとめられている本とは別に、プラスαの事例本としてよかったです。
内容は、具体的に、左ページが良くない例/右側が良い例という構成でとても見やすいく、有り難かったです。


## 一言

今までは、ワイヤーフレームをディレクターサイドで作ったものを渡して
それをデザイナーさんにだいたいそれどおりに
作って頂くことが多かったのですが、

今回はできたら、サイトを多く見られているデザイナーさん主体で
UI設計〜デザインをサポートできないかなと思って試行錯誤中です。

リニューアルの機会を最大限に活かして、良くなったと言えるよう努めていきたいと思います。
【Python】DataFrameを作成する

```py3
import numpy as np
import pandas as pd
```

連番のDataFrameを作成する方法。

```py3
pd.DataFrame(np.arange(12).reshape(3, 4))
```

```py3:出力結果
   0  1   2   3
0  0  1   2   3
1  4  5   6   7
2  8  9  10  11
```

標準正規分布からサンプリングしたDataFrameを作成する方法。

```py3
pd.DataFrame(np.random.randn(3, 4))
```

```py3:出力結果
          0         1         2         3
0  0.468555  1.229396 -1.523016 -1.097869
1  1.249112  0.459677  0.687192  1.331659
2  0.552321  1.049256  0.395567  0.074094
```
UISearchControllerとpushSegueを同時に使用する際の問題解決

#### 問題について

UISearchControllerで表示した結果から別画面に遷移する機能を実装していた。

下記動画のようになってしまい遷移をするたびにTableViewがずれるようになってしまった。

![問題定GIF.gif](https://qiita-image-store.s3.amazonaws.com/0/37053/27fa73b3-3b37-973e-6fb3-7942519fd861.gif)

この問題の解決法は簡単で、UISearchControllerを使っている遷移元ViewcontrollerのviewDidLoad内で
`definesPresentationContext = true`と一行追加すれば良い。


![問題解決.gif](https://qiita-image-store.s3.amazonaws.com/0/37053/3b0d1b83-1d57-fe17-48d0-f056837ce509.gif)

上記のように解決する。

#### 蛇足

何故`definesPresentationContext = true`の追加で解決するかを解説。

##### definesPresentationContext について

definesPresentationContextというプロパティについて軽く説明する。
このパラメータは、UIViewcontrollerにおけるPresentationContextを制御するプロパティである。
PresentationContextは、ViewControllerをモーダル表示するときに、Viewcontroller階層の中で、どのViewControllerを基準に表示するかを決定する際に使用される。
デフォルトはfalseなので、自分で特別に設定していなければ、UIWindowやUINavigationControllerなどがモーダル表示の起点となる。

##### 原因について
UISearchControllerが結果を表示する時に、`definesPresentationContext`に影響を受けている。
そのため、デフォルトの状態だと、表示の起点となるViewControllerはUINavigationcontrollerとなってしまい、検索結果が遷移先のViewControllerを覆い隠すように表示されてしまっている。
それによって、正常な処理がブロックされ、問題が生じているものと推測される。

本来であれば、遷移元ViewController内で行われるべき検索結果の表示が、さらにその親ViewControllerで行われてしまっていたのが、今回の問題の原因。

遷移元ViewControllerに対して、検索結果の表示が行われるようにするために、`definesPresentationContext`の設定を行った。



https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/occ/instp/UIViewController/definesPresentationContext
Swiftで半角英字のValidation（英字ニックネームなど）


半角アルファベットのみで入力させたい場合のバリデーション

```swift

extension String {
    
    var isAllHalfWidthCharacter: Bool {
        // 半角も全角も1文字でカウント
        let nsStringlen = self.characters.count
        let utf8 = (self as NSString).UTF8String
        // Cのstrlenは全角を2で判定する
        let cStringlen = Int(bitPattern: strlen(utf8))
        if nsStringlen == cStringlen {
            return true
        }
        
        return false
    }
    
    var isValidNickName: Bool {
        if rangeOfCharacterFromSet(.letterCharacterSet(), options: .LiteralSearch, range: nil) == nil { return false }
        if rangeOfCharacterFromSet(.decimalDigitCharacterSet(), options: .LiteralSearch, range: nil) != nil { return false }
        guard self.isAllHalfWidthCharacter else { return false }
        return true
    }
}
```

#実用例
isValidNickNameでチェック

```swift
   if nickname.isValidNickName {
      // Set Data
   } else {
      // Alert
      let alertController = UIAlertController(
                title: "半角英字のみで入力してください",
                message: "",
                preferredStyle: .Alert)
            let otherAction = UIAlertAction(title: "OK", style: .Default) {
                action in
                self.navigationController?.popToViewController(self.navigationController!.viewControllers[0], animated: true)
            }
            
            alertController.addAction(otherAction)
            presentViewController(alertController, animated: true, completion: nil)
   }


```

NSStringではlengthでカウントできるのに、
String型ではcharacters.countって長い
Android Studio 2.1.2

Android Studio インストールのログ：

1. Mac OS X 10.11.5 (英語) + [JDK 1.8.0_91 で動かした](http://qiita.com/ken1ma/items/bf38a86730bdf6f10a1d)

    ```
$ STUDIO_JDK=/Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk open /Applications/Android\ Studio.app
```
2. Custom Install Type を選んでみた
![Screen Shot 2016-07-03 at 20.29.32.png](https://qiita-image-store.s3.amazonaws.com/0/131106/9ddd3738-b415-b3d4-19ac-cfd7c70f5703.png)
3. デフォルトの IntelliJ UI Theme のまま
![Screen Shot 2016-07-03 at 20.30.45.png](https://qiita-image-store.s3.amazonaws.com/0/131106/e35b04a4-eda2-f6d3-2958-4f78aff5ec2e.png)
    1. ネット状のスクリーンショットだと Darcula も結構見かける
4. Android Virtual Device を追加選択
![Screen Shot 2016-07-03 at 20.31.42.png](https://qiita-image-store.s3.amazonaws.com/0/131106/8e839312-be11-1512-71d0-77dfa4540959.png)
5. [Intel の Tips](https://software.intel.com/en-us/android/articles/installation-instructions-for-intel-hardware-accelerated-execution-manager-mac-os-x) によると物理メモリの半分を割り当てるのが良いとあるが ```Use recommended size``` を押しても 2G のまま
![Screen Shot 2016-07-03 at 20.43.18.png](https://qiita-image-store.s3.amazonaws.com/0/131106/14010d62-1ab9-bf05-8277-3b7e26ddf444.png)
6. インストールの内容
![Screen Shot 2016-07-03 at 20.50.15.png](https://qiita-image-store.s3.amazonaws.com/0/131106/214fe68d-96e7-f64e-3dca-166abcdb2fda.png)
7. ```Unable to create a virtual device: Missing system image required for an AVD setup``` と出るが、後で作れば良いので無視して OK
![Screen Shot 2016-07-03 at 20.55.11.png](https://qiita-image-store.s3.amazonaws.com/0/131106/b3fad933-f3d3-d1b3-f192-f75e9d20bc40.png)
8. 起動直後
![Screen Shot 2016-07-03 at 20.55.40.png](https://qiita-image-store.s3.amazonaws.com/0/131106/300f897a-5f73-dc46-5104-53edc76b9241.png)
9. ```Configure``` から ```SDK Manager``` を起動すると Android 6.X (N) のみがインストールされてる
![Screen Shot 2016-07-03 at 20.57.05.png](https://qiita-image-store.s3.amazonaws.com/0/131106/25764388-1a8a-fe16-8f03-06ffdbd4f2b7.png)
10. Tool は色々
![Screen Shot 2016-07-03 at 20.59.22.png](https://qiita-image-store.s3.amazonaws.com/0/131106/59f5b471-e354-e1ec-19c3-f700817d4758.png)
11. ```New Project``` のデフォルト状態
![Screen Shot 2016-07-03 at 21.02.28.png](https://qiita-image-store.s3.amazonaws.com/0/131106/5a7a4b3d-917a-f4ee-2b8d-4515c4ed3a4e.png)
![Screen Shot 2016-07-03 at 21.03.03.png](https://qiita-image-store.s3.amazonaws.com/0/131106/8eb95cc2-82ef-f527-f28b-38841b78d077.png)
12. Project を作成した後 ```File``` メニューから ```Project Structure...```
![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/131106/97071719-912b-2bb0-85d3-d7dbdc024b07.png)
13. ```Download Android NDK``` を押すと Android NDK r12b がインストールされる
![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/131106/0e85845a-d18e-a31f-80ca-b14146ca0635.png)
windowsでrubyのバージョンを切り替えてrailsを開発する方が使えるrumix2の導入方法

## rumix2概要
> Rumix 2とは、Windows上でRubyプログラミング環境を一気に整えたい方のための、詰め合わせパッケージです。

※個人的にrails開発環境はvagrantにcentosいれて構築するのがオススメなんですが、vagrant導入前はrumix2を入れてwindowsだけでrails開発環境を構築していたので紹介と共有しておこうと思いました。


## どのような人にrumix2はオススメか
- windows上で簡単に複数のバージョンのrubyを切り替えて利用できる（xamppみたいに手軽）
- vagrandなどでcentosなどを入れてrbenvを導入したりなど敷居が高いと感じる方

## 導入手順
- [Rumix 2 ダウンロード](http://ruby.morphball.net/rumix/)からRumix 2 Multipleをダウンロード
- rumix_install.exe実行してインストール  
インストールオプションは下記に設定した

```text
・標準のRubyは2.2.4[推奨]を選択
・新リファレンスマニュアル Chm版リミックス[推奨]を選択
・NYAOS＋ckw-modの[推奨]を選択
・インストールパッケージは全部選択
```

## rumix2の主な使い方（コマンドプロンプト）
- `pik -v`でバージョン表示する
- `pik list`使えるバージョン一覧と現在の使用バージョン
- 「ruby 2.0.0p648」を使いたい場合は`pik use 200`で切り替えられる  
※`pik list`で表示されるバージョン一覧の先頭に数字が書いているのでそれを指定して切り替える  
※注意点としてグローバルに変わるわけでなく`pik use ～`したコマンドプロンプトのウィンドウの中でのみ有効
30歳目前ノンエンジニアのJS習得への道＜二日目＞AdwordsScript編

関連項目
<a href="http://qiita.com/jomai/items/9b3805e2489f8509806a">30歳目前ノンエンジニアのJS習得への道＜導入編＞</a>
<a href="http://qiita.com/jomai/items/8e5a025c0e6dcdb0c13c">30歳目前ノンエンジニアのJS習得への道＜一日目＞</a>

#<進捗>
ただ文字を読んでるとつまらないのでモチベーション操作のため実務に近いAdwordsScriptに切り替え。実務に活かせるように準備開始。
今後、サンプルコードの読み解き→再現を繰り返し習得したい。

#<情報>
■AdwordsScriptのヘルプサイト
https://developers.google.com/adwords/scripts/?hl=ja
■AdwordsScriptのリファレンス
https://developers.google.com/adwords/scripts/docs/whats-new?hl=ja
※リファレンスは、AdwordsScriptで使える、宣言無く使えるオブジェクトって事かな。
#<目的>
■レポートを作成、GoogleSpreadSheetに出力
└アカウント全体のDailyの各指標
└アカウント内の特定の名称のDailyの各指標
└アカウント内の特定のラベルのDailyの各指標

#<内容>
こちら見ながら基本的な操作をイメージ
http://unyoo.jp/2015/05/unyoojp-meetup-vol3-report/

①Logに【Hello World!】と出力
②Logに【1,2,3】と1-泥臭く,2-毎回変数を定義しなおし,3-ループ,4-条件分岐
③全ての広告グループにキーワード【Hello World!】を追加

#<感想>
実務に直結するのでおもしろい。細かい知識は後回し。ゴリゴリコードに触れるのがモチベーション維持を習得最短化の道。やはり。

#<疑問と解>
◯◯◯.◯◯◯.◯◯◯.◯◯◯;　とかやってるけれども
どこまでがオブジェクトでどこまでがメソッド？オブジェクト？
クラスとは何？
Ansibleのインベントリファイル



Ansibleでホスト(ホストグループ)と、各種変数を設定する。

# インベントリファイルを指定する方法

1. ansible-playbookの-iオプションで指定する
2. ansible.cfgで指定する

## ansible-playbookの-iオプションで指定する

```shell-session: -iオプションによるインベントリファイルを指定
ansible-playbook -i インベントリファイルパス プレイブックファイル名
```

## ansible.cfgで指定する

```ini:ansible.cfgによるインベントリファイルの指定
hostfile=ホストファイルパス
```

# インベントリファイルの記法

## 基本

ホストグループ(webservers)とそれに紐づく変数(webservers:vars)を記述した場合

```ini:インベントリファイルの記法サンプル
[webservers]
web1.example.com
web2.example.com
web3.example.com

[webservers:vars]
key1=value1
key2=value2
```

[]でホストグループを指定する。
個別のホストは[]の配下に記述。

特定のホストグループに対して適用したい変数は
[ホストグループ名:vars]の形で特定のホストグループに
所属する変数群が存在することを記述した後に
"キー=値"の形で変数とその値を指定する。

### 連番の取扱い

インベントリファイル内では連番やアルファベット順の場合は
正規表現的な書き方で短縮することができる

#### 数字の場合

```ini:改修前(数字)
[webservers]
web1.example.com
web2.example.com
web3.example.com
```

```ini:改修後(数字)
[webservers]
web[1:3].example.com
```

#### アルファベットの場合

```ini:改修前(アルファベット)
[webservers]
webA.example.com
webB.example.com
webC.example.com
```

```ini:改修後(アルファベット)
[webservers]
web[A:C].example.com
```


## ホスト変数を指定

特定のホストに対して変数を指定した場合

```ini:インベントリファイルの記法サンプル
[webservers]
web1.example.com key11=value11 key12=value12
web2.example.com key21=value21 key22=value22
web3.example.com key31=value31 key32=value32
```

ホストに対して変数を指定する場合は
スペース区切りで"キー=値"形式で記述する。

## ホストグループの親子関係を記述した場合

下図のようなホストグループの親子関係が存在する場合

![image](https://qiita-image-store.s3.amazonaws.com/0/40692/336a154a-eb8b-6bf6-2077-01c4cae50876.png)

```ini:ホストグループの親子関係
[parent]
parent1.example.com

[childA]
childA1.example.com

[childB]
childB1.example.com

[childC]
childC1.example.com

[parent:children]
childA
childB
childC

```
SpriteStudio

1. OPTPiX [SpriteStudio](http://www.webtech.co.jp/spritestudio/) 5.6.1 Mac 版を試してみた
    1. ライセンスキーごとにマシン 1 台がオンライン認証される
2. 起動直後
![Screen Shot 2016-07-03 at 18.25.20.png](https://qiita-image-store.s3.amazonaws.com/0/131106/231b9ddb-6355-b614-e005-33d73f691016.png)
3. ```New Project``` すると編集できるようになる
![Screen Shot 2016-07-03 at 18.27.40.png](https://qiita-image-store.s3.amazonaws.com/0/131106/fd08f55a-ab8c-8786-750a-f24e15ad62ff.png)
4. 基本的なワークフローは
    1. Cell Map を定義（イメージファイルをドラッグ＆ドロップ）
    2. Cell Map から Cell を切り出し（範囲選択して右クリック）
    3. Animation を作成（```Animations```を右クリック）
    4. Part を作成（Cell を Layout へドラッグ＆ドロップ）
    5. Frame の Attribute を変更（Frame Control で Frame を選択して適当に Attribute を変更）
        1. Frame Control 内に水色丸が増える
        2. Layout 内 Cell をいじって Attribute を変更することもできる
5. 参考リンク
    1. [再生ライブラリ](https://github.com/SpriteStudio)
    1. [補助ツール](http://www.webtech.co.jp/help/ja/spritestudio/download/forprogrammer/)
    1. [サンプルデータ](http://www.webtech.co.jp/help/ja/spritestudio/download/fordesigner/#effectsample)
ClojureでSwingの画面を出す


# やりたいこと
ClojureでSwingの画面が出したい。
シンプルにそれだけ。

# やり方
```clj:swing.clj
(import 'javax.swing.JFrame)

(doto (new JFrame "test")
  (.setBounds 100 100 300 300)
  (.setVisible true)
  (.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE))
```

```(.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)``` は設定すると
画面を閉じたときに一緒にREPLも落としてくれるので、開発中は設定しないことを
おすすめします。
mac に Composer をインストールする（PHP利用）

# Composer とは
> Composerは、PHPプログラミング言語向けのソフトウェアおよび必要なライブラリの依存関係を管理する標準形式を提供するアプリケーションレベルのパッケージ管理システムである（Wikipediaより）

簡単に説明すると、あるライブラリをインストールする場合に、別のライブラリが必要な場合に、いい感じに落としてくれるツール

# 前提

- PHP はインストール済みであること

# 手順

- Composer のインストーラを　curl で取得
- インストーラを PHP で実行する

```bash
$ curl -sS https://getcomposer.org/installer | php
```

composer.phar を移動する

```bash
$ mv composer.phar /usr/local/bin/composer
```

バージョン確認

```bash
$ composer -V
Composer version 1.1.2 2016-05-31 19:48:11
```

# 参考
[Composer - Wikipedia](https://ja.wikipedia.org/wiki/Composer)
[MacにComposerをインストールする](http://mawatari.jp/archives/install-composer-in-mac)
ssh nopassword loginがどうしてもできない場合

- .sshのpermissionも設定
- .ssh/authorized_keysのpermissionも設定
- client側で -vvv option追加してもよくわからん
- /etc/ssh/sshd_configなどもいろいろ試した

の時は、

```
restorecon -FRvv ~/.ssh
```

http://yasuaki.hatenablog.com/entry/2014/10/01/000000

いろいろ設定しなくても、authorized_keysを作って、↑で
いっぱつで行く場合がある。

この年まで、これをしないといけないケースにはであったことがなかったが
いまの環境だとこの処置が必須のようだ。

SELinuxの場合がそのようだ。
いままで、一度もSELinuxを扱ったことがなかった。。。 or そういう環境で仕事をしたことがなかった。。。
macでfishをインストールする

# 環境
- mac 10.11.2
- Homebrew 0.9.9
- fish 2.3.0

# fishとは
- friendly interactive shell
    - インタラクティブシェルの１つ
    - ユーザフレンドリー
- 変数はトークンを必要としない
    - 引用符を用いて文字列を囲むということを滅多にしない
- 補完機能が便利
- エラーメッセージが親切
    - 何が間違っていたのか、どうすればいいのかを実際にユーザへ伝えるように設計
- コマンド入力時にコマンドに色を付けてくれる
    - コマンドとして無効な場合は赤、コマンドとして有効になれば青

# fish のインストール手順

## インストール
```bash
$ brew install fish
```

## シェルの変更
```bash
$ which fish
/usr/local/bin/fish
```
```bash
$ chsh -s /usr/local/bin/fish
chsh: /usr/local/bin/fish: non-standard shell
```
/etc/shells に fish を追加していなかったため
ファイル末尾に「/usr/local/bin/fish」を追記

```bash
$ chsh -s /usr/local/bin/fish
```
ターミナルを開き直すと、fishのインストール完了

##oh-my-fishのインストール

```bash
$ curl -L https://github.com/oh-my-fish/oh-my-fish/raw/master/bin/install | fish
```
完了したので、まずはヘルプ

```bash
$ omf help
```

バージョン確認も

```bash
$ omf -v
Oh My Fish! 2
```

テーマを変えてみる
ちなみにデフォルト
<img width="403" alt="default.png" src="https://qiita-image-store.s3.amazonaws.com/0/91275/148b55fd-bb06-bb64-5e18-be8710d134cb.png">

```bash
$ omf install sushi
```

変更後は寿司
<img width="432" alt="sushi.png" src="https://qiita-image-store.s3.amazonaws.com/0/91275/974ff4d2-e3b9-d552-2cd4-63895c479c64.png">

# 参考
[OSXでfish shellを使う](http://qiita.com/osakanafish/items/0852327c1450123f1287)
[Oh My Fish!](https://github.com/oh-my-fish/)
[Software Design 2016年6月号](http://gihyo.jp/magazine/SD/archive/2016/201606)
[ウィキペディア](https://ja.wikipedia.org/wiki/Friendly_interactive_shell)
モンティ・ホール問題を Ruby で解いてみた

Ruby の勉強も兼ねてモンティ・ホール問題をシミュレートしてみた。

## モンティ・ホール問題
アメリカのテレビ番組で実際に行われていたゲームで、概要は次のようなもの

- ３つのドアがあり、１つのドアの後ろには景品の車、その他２つのドアの後ろにははずれを意味するヤギがいる。
- プレーヤーは１つドアを選び、車のドアを選ぶ事ができればそのまま車をもらうことができる。
- ただし、ドアを選んだ後に司会者（景品の位置を知っている）がはずれのドア１つを開け、プレーヤーにはドアを選びなおすチャンスが与えられる。  
- このとき、プレーヤーはドアを選びなおすべきか？？？

直感的にはどちらも変わらず $\\frac{1}{2}$ の確率になりそうなんですが、
実はドアを選びなおすと $\\frac{2}{3}$ の確率で当たりを引くことになり２倍も有利になるというある種の心理的なパラドックス。

## コード

```rb:monty_hall.rb
module MontyHall
  class Simulator
    CAR = "car"   # あたり
    GOAT = "goat" # はずれ

    # Initialize counter to zero.
    # @param [Integer] sample_size number of trials
    def initialize(sample_size)
      @sample_size = sample_size
      @cnt_winning_the_car = 0
    end

    # Execute <sample_size> times
    def execute
      @sample_size.times do
        doors = [CAR, GOAT, GOAT].shuffle
        your_choice = choose_door

        # The host opens the door which has a goat.
        host_choice = choose_door exclude: [your_choice, doors.find_index(CAR)]

        # Switch your choice to the remaining door.
        your_choice = choose_door exclude: [your_choice, host_choice]

        @cnt_winning_the_car += 1 if doors[your_choice].eql? CAR
      end
    end

    # Show simulation results.
    def show_result
      percentage = (100.0 * @cnt_winning_the_car.to_f / @sample_size.to_f).round(1)
      puts "------------------------"
      puts "N = #{@sample_size}"
      puts "------------------------"
      puts "WIN : #{@cnt_winning_the_car} times."
      puts "LOSE: #{@sample_size - @cnt_winning_the_car} times."
      puts "------------------------"
      puts "By switching your choice to the remaining door, "
      puts "you got a #{percentage} percent winning rate!"
    end


    private

    # Randomly choose a door No. within 0 to 2. 
    # @param [Array] exclude A list to be excluded.
    # @return 0, 1, or 2.
    def choose_door(exclude: [])
      ([0, 1, 2] - exclude).sample
    end
  end
end
```

```rb:main.rb
require './monty_hall'

simulator = MontyHall::Simulator.new(100_000)
simulator.execute
simulator.show_result
```

## 実行結果
```
------------------------
N = 100000
------------------------
WIN : 66675 times.
LOSE: 33325 times.
------------------------
By switching your choice to the remaining door,
you got a 66.7 percent winning rate!
```
ほぼ $\\frac{2}{3}$ の確率で理論値通りの結果となりました。


## 参考
[Wikipedia - モンティ・ホール問題](https://ja.wikipedia.org/wiki/モンティ・ホール問題)
[Wikipedia - Monty Hall problem](https://en.wikipedia.org/wiki/Monty_Hall_problem) 英語版の方が情報量が多くてより正確な解説があります。
Raspberry Pi Zero 到着（2016/07/01）

以下で記載したRaspberry Pi Zero が到着しました。
http://qiita.com/dc_pi/items/ef97336f5e6b487c2d94

##到着
７月１日に仕事を終え自宅に帰るとポストに投函されていました。
6月23日に注文をし、24日に「pimoroni」から発送メールが来ていました。約１週間（５営業日）ほぼ注文時の記載通りに無事到着しました。

梱包は写真のように黄色い封筒でサイズは約22cm x 14cmぐらいです。
一応プチプチ（エアクッション）付きではありますが、中身は大丈夫かと不安になりました。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/130543/5f056bca-23ea-9f2e-d208-27d4ac05dcfc.png "1.png")

##開封
中には以下のような状態で注文したものが入っていました。
破損した様子もなく無事でした。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/130543/61fef15b-265f-c573-9d22-231da894e267.png "2.png")

ケースが赤い水玉模様の紙袋に入って包まれておりそれを品番のラベルで巻いてある感じでした。
なんか、お菓子が出てきそうな感じでした。

##ケースに組込み
早速、ケースにRaspberry Pi Zeroを組込もうとしたところ、問題発生。
カッティングされたプラスチック板を積み重ねていくのですが、ケースを袋から出した際にバラバラにしてしまい。
なんとなく重ねるもなんか違うような？？？
そこで、購入した「pimoroni」のサイトを探していると以下のページに組立図がありました。
https://shop.pimoroni.com/products/pibow-zero-ver-1-3

組立図だけちょっと拝借
![Unknown.jpeg](https://qiita-image-store.s3.amazonaws.com/0/130543/b288a6d2-56e3-dfbd-c62d-74976d46b4a0.jpeg "Unknown.jpeg")

赤を一番下にし次にオレンジ色を２番目に重ねオレンジ色の凹みに透明な薄い板を入れその上にRaspberryPiZeroを置きます。
そして、黄色の板を置き最後に透明なカバーをしてねじ止めして完成です。

やった、できたと思ったのもつかの間、組立ててしまうとSDの出し入れができないことが判明。（インストールできないやん。。。）
その日はそのまま組み立てた状態で満足して終了。

翌日、気を取り直し再度バラしてコネクタを半田付けし、インストール用SDを作成し挿入した状態で組み上げました。
同一生成元（同一オリジン）ポリシー

#同一生成元ポリシーとは？
同一生成元ポリシー(Same Origin Policy(SOP))は1つの生成元からロードしたスクリプトによって別の生成元の文書内のプロパティーやメソッドが取得または操作されるのを防止するためのものである。
ユーザーがプロバイダとやり取りする場合、そのユーザーはそのサイトに送信された情報が他のサイトに漏れてしまうことを望まないという考え方に基づき、ユーザの情報を保護するためにある。

#同一生成元であることの条件
__同一生成元である__ということは以下の条件を満たすことである。

* スキーム（プロトコル）が一致している。
* ホスト(FQDN; Fully Qualified Domain Name)が一致している。
* ポート番号が一致している。

例）
```http://hogehogehoge.com/index.html```
このURLと以下のURLが同一生成元なのかどうか見てみる。
```http://hogehogehoge.com:80```ーーーー＞同じ
```http://hogehogehoge.com/dir/page1.html```ーーーー＞同じ
```https://hogehogehoge.com/index.html```ーーーー＞スキームが違うので違う
```http://hogehogehoge.com:81```ーーーー＞ポートが違うので違う
```http://ufufu.com/index.html```ーーーー＞ホストが違うので違う
#同一生成元ではない場合、制限されること
同一生成元ポリシーによって、たとえば生成元Aと生成元Bがある場合、生成元AのWEBページでは以下の事ができない。

* 生成元BへのXMLHttpRequestを使用した通信
* frame/iframeの、生成元Bから生成されたコンテンツの読み取り、操作
docker-machine で開発バージョンのDockerを入れる方法

流行りの1.12.0-rc3を使いたいけど、``docker-machine``コマンドでDockerホストを作ると安定版の1.11が入ってしまうので困っていました。

## ``--engine-install-url``で取得元を指定

``docker-machine create``のオプションに``--engine-install-url``を指定して、Dockerの取得元をテスト版のURLに変更します。

```
$ docker-machine create \
  --driver digitalocean \
  --digitalocean-access-token $DO_TOKEN \
  --engine-install-url https://test.docker.com \
  swarm
```

例ではDigitalOceanに作成していますが、ドライバーは何でもOKなはず。 

```
$ docker-machine ssh swarm docker -v
Docker version 1.12.0-rc3, build 91e29e8
```

1.12が入りました！
ORA-19809エラーが発生した場合


Oracleのバックアップ領域の容量が不足しているので、確認して増やす。

```Bash
SQL> show parameter DB_RECOVERY_FILE;

NAME							TYPE			VALUE
------------------------------- --------------- ------------------------------
db_recovery_file_dest			string			/home/oracle_base_dir/app/oracle/fast_recovery_area
db_recovery_file_dest_size		big integer		4560M

SQL> alter system set DB_RECOVERY_FILE_DEST_SIZE=10G; 

システムが変更されました。

SQL> show parameter DB_RECOVERY_FILE;

NAME				     		TYPE	 		VALUE
------------------------------- --------------- ------------------------------
db_recovery_file_dest			string			/home/oracle_base_dir/app/oracle/fast_recovery_area
db_recovery_file_dest_size		big integer		10G
```
Ansibleのハンドラ


# ハンドラ

タスク終了後に通知(notification)を受けて実行されるタスクの一種。

```yaml:ハンドラの記述名
handlers:
- name: ハンドラ名
  モジュール名: 属性名 ...
```

## ハンドラの呼び出し方

![image](https://qiita-image-store.s3.amazonaws.com/0/40692/6c9ad990-2cb4-5729-1120-f65712d8a925.png)

ハンドラを呼び出す際には、タスクの中でnotifyキーを使って呼び出したいハンドラの名前を指定する。

```yaml:ハンドラの呼び出し例
tasks:
  - name: Source of notification
    モジュール: 属性...
    notify: Handler sample
     ...
handlers:
  - name: Handler sample
    モジュール: 属性...
```

## ハンドラの呼び出され方のルール
ハンドラは1度しか呼び出されない。
つまり、複数のタスクで同一ハンドラが複数回呼び出されていたとしてもタスク終了後に一度だけ呼び出される。
Ansibleのplaybookの構成


間違っていたらごめんなさい。

# Playbookの構成要素

大きく分けて3つから構成される

1. playbook
    - 複数のplayの集合
2. play
    - taskの集合
3. task
    - リモートサーバに対して行う単体の作業

ER図で表すとこんな感じになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/40692/a8de2785-a317-d0af-5fcc-65891b619f3c.png)

## play
playは以下の2つの要素が含まれていなければならない

1. 設定するホストの集合
2. 1で設定したホスト上で実行するタスク

### playの構成

|要素|内容|
|---|---|
|name|playの内容を示すコメント|
|become|sudoしたうえで個別のタスクを実行するか否かの指定|
|vars|変数と値のリスト|

## task
taskは実際にはリモートサーバに対して実行する
一つ一つの作業内容を表す。

e.g. ファイル、ディレクトリの作成、パッケージのインストールなど

### taskの構成要素

タスクは以下の2つの要素から構成される

|要素|内容|
|---|---|
|name|タスクの名前|
|モジュール|タスクの中で実際に行う作業、モジュールと各種属性を指定することでリモートサーバを特定の状態に遷移させる|
|notify|タスク終了後に実行するハンドラの指定|

```yaml:taskの記述例
- name: タスク名
  モジュール名: 属性名 ... 
  notify: ハンドラ名
```

ハンドラは別に説明
React で Redux と Flumpt の非同期でのカウンター表示をgifアニメで比較してみた


ボタンを押すと1秒後に反映するカウンターの非同期処理で `+1` ボタンを5回連打した時の表示

## Redux

![redux-counter.gif](https://qiita-image-store.s3.amazonaws.com/0/41656/e42fbffc-17ea-6360-d533-59a6e07b1c7c.gif "redux-counter.gif")

パパパパパっと表示が1〜5まで表示された

- [サンプルコード](http://qiita.com/cortyuming/items/74410807a1c871b380a1)


## Flumpt

![flumpt-counter.gif](https://qiita-image-store.s3.amazonaws.com/0/41656/3aba4325-3fde-8661-9354-1b2e3e8fc15c.gif "flumpt-counter.gif")

1の次に間をおいて5が表示された

- [サンプルコード](http://qiita.com/cortyuming/items/eae29da1c9fd9971c4f3)


## リンク

- https://facebook.github.io/react/
- https://github.com/reactjs/redux
- https://github.com/mizchi/flumpt
僕が英語でオライリーを読む理由

「英語はエンジニアに必須」とは言っても、周りを見渡して、英語の文献を読んでいる人はあまりいない。

僕はエンジニアとしてのレベルはまだまだ低いが、英語で技術書を読むことにチャレンジしている。
その理由をご紹介する。

# 理由1. 一粒で二度美味しい

我々日本人はすでに「日本語」には熟達している。
今後どんなに日本語を読んでも「日本語力」そのものを大きく引き上げることは難しい。

ゲームで言うと「スキル名: 日本語」にはポイントを最大まで割り振ってしまっている状態だ。

だが英語で技術書を読むと「英語力」と「技術的知識」の両方に、ポイントを一挙に割り振ることができる。
つまり長期的に考えた時の費用対効果がきわめて高いだろう、ということが考えられるのだ。

英語で技術書を読み始めると、しばらくは日本語で読むよりも理解度がかなり落ちるだろうが、そこはトレードオフとして受け入れる。
これは短期的成果をとるか、長期的成果を狙うかという戦略の違いだ。

# 理由2. ドキュメントがさらっと読めるようになる

書籍にはわりと、言語的にレベルが高く、概念的にもレベルの高いものが多い。
なので、もし書籍のレベルが読みこなせるようになれば、ドキュメント類を読むのはごく簡単になる。

僕も英語での読書を始めてから、実際にドキュメントを読むのが以前より「かなり軽くなった」感じがある。( RubyGem の README とか )

あとはググって出てきた英語の記事も理解しやすくなった。
Stack Overflow など朝飯前だ。
(大袈裟に言うのならばきっとそういうことなんだろう)

# 理由3. 理解を妨げる「ニュアンスの間違え」が減る

どんなに良い翻訳だろうと、翻訳された時点で、ある程度は不正確なものになる。
もしこの「まずい翻訳」が本の重要な部分に関わるものだと、そもそも本質的な理解が妨げられる。

これは技術書にかかわらず、翻訳書全般に言えることだが。
翻訳がまずい場合は、むしろ原書で英語が読んだ方が「あー、なるほど」とスッと分かったりする。

# 理由4. ラインナップが豊富

## 最新版をいち早く読める

当たり前だが、日本で翻訳版が出るのは、原書よりもかなり遅い。
英語が読めれば「翻訳版が出るまで我慢」なんてことをしなくても済む。

## 日本版が出ていない書籍がある

「日本語版が出るまで、待てばいいや」って思った、そこのあなた。
その本、本当に翻訳されますか？

そもそも翻訳版が出ない書籍も多い。
日頃から日本のラインナップだけから本を探していたら「出版されていることにさえ気づかない書籍」だってあるだろう。

英語であれば多くのラインナップの中から、自分に合った好きなものを選んで読める。
「日本語版のない本が、出版されている事実」にも気付くようになる。

## デジタルで読める

「日本語版は出ているが、紙の本だけしか出ていない」「Kindle バージョンがない」というケースが、現時点では、何故か多い。
この場合も原書なら Kindle で読める。

特に、僕の場合は今 Kindle が読書の中心なので。
Kindle で出ていない本はほとんど読む機会がない。

# 理由5. 人材としての需要が高まる

現状の日本では、やはり英語が出来る人は重宝される。(と、もちきりの噂だ)
いま「つぶしの効く」スキルといえば「プログラミング」と「英語」ではないだろうか。

現実的な話になるが。

プログラミングと英語の両方を身に付ければ、人生で食いっぱぐれる可能性を減らすことが出来るだろう。
そしてもし仮にエンジニアをクビになったとしても、英語力があれば他に何らかの仕事を見つけやすいはずだ。

これは人生に対するリスクヘッジだ。


# 推薦のお言葉

というか参考リンク。

## [日本のWebエンジニアの大半が、変化に対応しきれなくなっている件について。](http://d.hatena.ne.jp/tomoya/20160410/1460274822)

この図。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/a1172284-8d72-e6b1-93f6-5ecde61ae2d6.png)


## [英語力は最強のレア・カード！Ruby開発者 まつもとゆきひろ氏から学ぶ「これからのエンジニアが生き抜く方法」](http://eikaiwa.dmm.com/blog/interview/matz/)

Ruby言語開発者の「まっつ」も推奨してるよ。(英会話の宣伝ページだけど)

### エンジニアとして英語が役立ったのはどんな時ですか？

>2001年頃から Ruby が有名になってきて、海外のカンファレンス（学術会議）に呼ばれるようになったんです。そうすると、会場でいろんな人が話しかけてくるんですよね。その時はもう何年も英語を使う機会が無い状態だったので無理かと思っていたんですが、何とかコミュニケーションはとれました。

### エンジニアにとって、英語力は強みになりますか？

>現在の日本では、かなり強いと思いますね。
英語力は、いわゆるレア・カード。ゲームをひっくり返してしまうほどの強いパワーを秘めています。
ただ、それ一枚だけで勝負できるタイプではなくて、各人のエンジニアとしての得意なカードを充実させつつ、組み合わせて使うことで強さを発揮する。ぜひ、皆さんも手に入れて欲しいと思いますね。








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Markdown-modeのみ、ファイル保存時の行末の空白自動削除を無効にする


__※Emacs Lispに全く詳しくないため、もっといい方法があれば教えていただけると嬉しいです。__

# ファイル保存時に行末の空白を自動削除する

個人的に行末の空白が残っているのは、コミット時に無駄な差分が出る原因にもなるのであまり好みではありません。そのため、ファイルの保存時に空白が削除されるように下記の用に設定していました。

```elisp
(add-hook 'before-save-hook 'delete-trailing-whitespace)
```

こうすることによって、ファイル保存前に行末の空白が削除されます。

ところが、Markdownを書くときに改行のためのスペース2つもこの設定により削除されてしまいます。Markdownを書く時は大体KobitoやGitHubだったのであまり気になりませんでしたが、たまに `README.md` の編集で改行ができなくて流石にストレスだったので、特定のモードの時に無効にできるようにしてみました。

# 特定のモードで無効にする設定
## コード

（追記）Emacs24.4以降を使っているのであれば、@tadsan さんにコメント頂いたやり方のほうがすっきりして良いと思います。

```elisp
(defvar delete-trailing-whitespece-before-save t)
(defun my-delete-trailing-whitespace ()
  (if delete-trailing-whitespece-before-save
      (delete-trailing-whitespace)))
(add-hook 'before-save-hook 'my-delete-trailing-whitespace)

; 無効にしたいモードのhook
(add-hook 'markdown-mode-hook
          '(lambda ()
             (set (make-local-variable 'delete-trailing-whitespece-before-save) nil)))
```

## 解説

というほどのものでもありませんが、

グローバル変数に `delete-trailing-whitespece-before-save` を定義しておきます。そして、 `delete-trailing-whitespece-before-save` が真の時のみ `delete-trailing-whitespace` を実行する関数を定義し、 `before-save-hook` で発火するようにします。

そして、無効にしたいモードのhookで `delete-trailing-whitespece-before-save` を `nil` に設定してやればOKです。

この時の注意点としては `delete-trailing-whitespece-before-save` グローバル変数なので、 `make-local-variable` でバッファローカル変数にすることで、hookを設定したモード内だけで無効になります。

# 感想

こんなまどろっこしいことしなくても、もっと簡単に実現できそうですがぐぐっても出てこなかったので自分で書いてみました。
久しぶりにLisp触りましたが、たまになら普段書いてる言事違ってパズルみたいで楽しいですねー

# 参考

- [無駄な行末の空白を削除する(Emacs Advent Calendar jp:2010)](http://tototoshi.hatenablog.com/entry/20101202/1291289625)
- [whitespace-modeを使って、ファイルの保存時に行末のスペースや末尾の改行を削除する](http://qiita.com/itiut@github/items/4d74da2412a29ef59c3a)
Swift の inout パラメーターと Functional プログラミング

[The Swift Programming Language (Swift 3)](https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/) を読んだ時に感じた事

1. [Swift の inout パラメーター](https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html#//apple_ref/doc/uid/TP40014097-CH10-ID173) は C++ の参照渡しのように、メソッドの引数に指定した変数の値を、メソッドの内部から変更することができるらしい
2. Functional プログラミングにはそぐわない機能に感じたが、
    1. 呼び出し前と呼び出し後にそれぞれ値がコピーされる動きだそうで、
    2. 例えばメソッドがクロージャーを返す場合、そのクロージャー内部で値を変更しても反映されないとのこと
        1. そのクロージャーはメソッド呼び出し後に実行されるため
    3. よく考えてみると

			func foo(x: inout Int) -> Int {
				x += 1
				return x + 10
			}
			var y = 1
			let z = foo(x: &z)

        は、以下と等価になると考えれば Functional のセマンティクスから外れてないことに気づいた

			func foo(x: Int) -> (Int, Int) { // 複数値を return
				var x2 = x
				x2 += 1
				return (x + 10, x2)
			}
			let y = 1
			let (z, y2) = foo(x: z)

        1. ```y``` が ```y2``` になってしまっているけれど、コンパイル時の最適化に使われる [SSA](https://en.wikipedia.org/wiki/Static_single_assignment_form) だと思えば OK
3. ただ The Swift Programming Language (Swift 3) 内を「functional」でテキスト検索してみても見つからなかった
    1. [Wikipedia](https://en.wikipedia.org/wiki/Swift_(programming_language)) だと Paradigm に functional が含まれてるけれど、あまり売りにしている訳ではないのかも？
macでpythonをアップデート

macでpython3にアップデートする。
1、2はインストール済みの場合飛ばして構いません。

まずは
### 1．Homebrewをインストール

```ruby:terminal
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

### 2．pyenvをインストール

```ruby:terminal
$ brew install pyenv
```

以下に追記。無ければ新規作成。

```rudy:[起動shell]_profile
export PATH="$HOME/.pyenv/shims:$PATH"
```

### 3．pythonをインストール
pyenvでインストールできるPythonの確認。

```ruby:terminal
$ pyenv install [最新バージョンを指定]
# 今回の自分の場合は以下を実行。
$ pyenv install 3.5.2
```
個別にモジュールをインストールするのが面倒くさいので、NumPy、SciPy、matplotlibなどの有名どこのモジュールを一括インストール。

```ruby:terminal
$ pyenv install [anaconda最新バージョン]
# 自分の場合の例
$ pyenv install anaconda3-4.0.0

# インストールしたAnacondaを、Pythonのバージョンとして設定。
$ pyenv local [インストールしたanacondaのバージョン]
$ pyenv global [インストールしたanacondaのバージョン]
```

バージョン確認。

```ruby:terminal
$ python -V
```
Python [バージョン] :: Anaconda [バージョン] (x86_64)
と表示されればOK.
【初級】docker-compose を使った mysql コンテナの作成方法

#  docker-compose を使った mysql コンテナの作成方法

`docker-compose` をこの前初めて使ってみた。


そのときの備忘録として、`docker-compose` を使って `mysql` のイメージを
コンテナ化する方法とその解説を簡単に記載しています。

## docker-composeってなによ？

`docker-compose` とはすごいざっくり言うと
`docker` コンテナを作成・起動するときの設定書みたいなもの。

**docker-compose.yml**

にコンテナ化したいイメージ名とか設定を記載しておくだけで、
複数のイメージをコンテナ化したりできる。便利。

****

## docker-compose を使う準備

* 下記を読んで docker と docker-compose を　install しましょう。
    * [公式リファレンス](https://docs.docker.com/engine/understanding-docker/)

`docker-compose` は `docker` の `version` が **1.9.0以上を使え** と言ってくるので
`docker` の `version up` 作業も必要です。

#### 以下、 debian での環境構築方法をメモ程度に記載。

**[公式リファレンス](https://docs.docker.com/engine/installation/linux/debian/#debian-jessie-80-64-bit)を参考に作業しました**

* `/etc/apt/sources.list.d/backports.list` を作成

```
sudo vi /etc/apt/sources.list.d/backports.list
```

* 上記のファイルに下記を追記

```
deb http://http.debian.net/debian wheezy-backports main
```

* apt-get を更新

```
apt-get update
```

* 古いdockerの削除

```
sudo apt-get purge lxc-docker
sudo apt-get purge docker.io
```

* もう一回 apt-get 更新。（必要？）

```
sudo apt-get update
```

* 認証用のあれこれをinstall

```
sudo apt-get install apt-transport-https ca-certificates
sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
```

※公式から抜粋したコマンドを使用

* `/etc/apt/sources.list.d/docker.list` を作成

```
sudo vi /etc/apt/sources.list.d/docker.list
```

* 上記のファイルに以下を追記

```
deb https://apt.dockerproject.org/repo debian-wheezy main
```

* やっと docker install

```
sudo apt-get install docker-engine
```

* docker を デーモンで起動

```
sudo service docker start
```

以上！

****

## mysql コンテナ を docker-compose で作成する(本題)

ちなみに書き方は公式リファレンスにすごい詳細に書かれている。

* [公式リファレンス](https://docs.docker.com/compose/compose-file/)

### 作業手順

* 適当なディレクトリを作成してそこをカレントディレクトリにする

```
mkdir ~/work/tekitou
cd ~/work/tekitou
```

* docker-compose.ymlの準備

```tekitou/docker-compose.yml
mysql:
  image: mysql          #image名。ローカルになければリモートから取ってくる
  log_driver: json_file
  container_name: "mysql_${BOOT_ENV}"  # ${}で環境変数を使用できる
  env_file: "${BOOT_ENV}.env"  #環境変数を設定したenvファイルを指定する
  ports:
    - "33060:3360"
```

* stage.env を用意

```telotou/stage.env
MYSQL_ROOT_PASSWORD=stage_secret_password
```

* prod.env を用意

```tekitou/prod.env
MYSQL_ROOT_PASSWORD=prod_secret_password
```

* ステージング用mysqlコンテナを作成

```
BOOT_ENV=stage docker-compose up -d mysql
```

* 本番用mysqlコンテナを作成

```
BOOT_ENV=prod docker-compose up -d mysql
```

* 接続してみる

```
mysql -h 127.0.0.1 -p 33060 -u root -p
```

=>パスワードを打ち込んで接続
※127.0.0.1は自分自身を指すIPアドレスを指定。localhostでもいい。

はい！
これだけ用意しておけば、ホストから 33060 で接続可能な
mysql コンテナが作成される。（しかも簡単にステージングと本番を変更できる）

いらなくなったら

```
BOOT_ENV=stage docker-compose down
```

で破棄もできます。

## 補足

`docker-compose.yml` は　これまで `docker run` のときにいろいろ引数で渡していた設定を
全て記載できる。これだけでもデプロイ作業がずいぶん楽になったりする。
さらに最近 `env_file:` の設定が追加され（もともとあったかも）、
環境変数を自由に変更できるようになった。

これまでシェルスクリプトを書いていたけど、
もうシェルスクリプトを書かなくてもいいかも。

ちなみに

```
docker-compose -f ファイル名
```

で読み込む設定ファイルも変更できる。

これらを複合すればデプロイ作業をもっと柔軟に出来るようになると思う。
日記　苦Cを読破した程度の知識から始めるゲーム作り　1日目

こんにちは、私はゲームを作りたくてプログラミングを学び始めました。
何から始めればいいのかわからずとりあえず２chで勧められていた「苦しんで覚えるC言語」の書籍を買って読みました。読むだけではなくプログラムを書いたりして早2週間、ようやくすべてを読み解くことができました。しかし私は言語の一部を覚えたにすぎず、それを活かせる知識が不十分です。
私は毎日ここにやったことを記述していきたいと思います。誰かがこれを見てくれたとき、私の分からないところを教えてくれることを願っているからです。
私の作りたいゲームはタクティクスオウガのようなクォータービューのシミュレーションゲームです
それを目指して頑張っていきたいと思いますのでこれを見てくださる方はどうかお付き合いください。
プログラミング知識を共有する場所にこのような書き込みがあることをどうかお許しください。
フロントエンド環境(Node.js等)を入れたときに躓いたことまとめ

# フロントエンド開発環境の導入
今さらながらフロントエンド用の環境をいろいろ導入してみました。
具体的には以下のようなもの。
<dl>
  <dt>Nodist</dt>
  <dd>(Windows用)Node.jsのバージョン管理</dd>
  <dt>Node.js</dt>
  <dd>サーバサイドJavaScript環境</dd>
  <dt>npm</dt>
  <dd>バックエンドパッケージ管理</dd>
  <dt>bower</dt>
  <dd>フロントエンドパッケージ管理</dd>
  <dt>gulp</dt>
  <dd>タスクランナー</dd>
</dl>

## 各種導入方法
### Nodist導入
[NodistのGithub](https://github.com/marcelklehr/nodist)からインストーラを落として、実行。

### Node.js、npm導入
Nodistをインストールすると、Node.jsの最新版がインストールされた状態になっている。
特定のバージョンを入れたい場合は、`nodist + バージョン番号`でインストールし、`nodist バージョン番号`で使用するバージョンを切り替える。
npmについてはNode.jsと一緒にインストールされる。

### bower、gulp導入
npmでグローバルにそれぞれをインストール。

```
npm install -g bower
npm install -g gulp
```

#### gulpのプロジェクトへの導入
gulpは使うプロジェクトのローカルに導入する必要があるみたいなので、プロジェクトのルートディレクトリに移動し、`npm install gulp`でインストール。

## 詰まったところ
### 公式インストーラは罠
公式が悪い、ということではないです。
むしろ、ちゃんと動くんですが、Nodistでバージョン管理をしたい場合は既にインストールしているものをアンインストールする必要があります。
アンインストールする場合、Windowsの[コントロールパネル]-[プログラム]-[プログラムと機能]からのアンインストールが必要です(インストールディレクトリにアンインストーラはないです)。
アンインストールするだけだと消えないファイルもあるので、インストールディレクトリやユーザーディレクトリ以下のAppData\Roamingの下のnode_modules等のフォルダも削除したほうがいいです。

### 環境変数の設定
Nodistのインストーラで環境変数をある程度は設定してくれます。
しかし、npmでグローバル環境にインストールしたパッケージはNode.jsの各バージョンフォルダ以下にインストールされるので、そちらへのパスも通す必要があります。
環境変数のPathに`%NODIST_PREFIX%\v-x64\バージョン番号`を追加します。

### ローカルにいっぱいパッケージが入る
~~これは解決できてないですが、gulpをローカルにインストールしようとしたときに、gulp以外のパッケージも自動的に入ってしまい、ファイルが大量に増えます。~~
~~入ってるパッケージ情報を見る限り、Nodistでデフォルトで入っているパッケージが入ってるっぽいです。~~ 
~~(恐らく)不要なパッケージはできればローカルに入れたくないんですが、なんか方法はないものか…。~~ 
なんか調べてたら、npm3以降では依存関係のパッケージがnode_moddules以下に配置されるようになり、そのせいでいっぱいパッケージが入っているように見えるらしいです。
依存関係があるということはどれも必須なパッケージなので、そのままにしておきましょう。
TypeScript1.8 入門④ (ジェネリクス)

# 概要

[前回](http://qiita.com/gcfuji/items/6173ac46ae1a05599c5d#_reference-d288c0980bc6cd9fd692)の続き。

# TypeScriptの機能

## ジェネリクス

ジェネリクスとは「抽象化されたデータ型」を表現する機能です。
同じ様な関数だが、型違いの場合に、引数である型を抽象的に使う時に便利な機能です。

ジェネリクスを使わない例では、

```js:sample.ts
let getStringArray = (value: string): string[] => {
  return [value, value, value];
};

let getNumberArray = (value: number): number[] => {
  return [value, value, value];
};

```

冗長ですよね。
関数の受け取る引数が違うだけなのに、複数の関数を定義している例です。

だめな解決策としては、型の部分をany型にするという解決策がありますが、それではTypeScriptで静的型付けをしている意味が全くありません。

そこで登場するのが、 **ジェネリクス** という機能です。

```js:sample.ts
let getArray = <T>(value: T): T[] => {
  return [value, value, value];
};

console.log(getArray<number>(3));
```

やっている事は単純で、`<T>`という抽象的な型を宣言し、実行時に`<T>`の部分に型を指定してあげるだけです。
今回の例で言えば、`<T>`の部分にnumberが入り、関数内の`T`の部分が全てnumberに置き換わります。

もちろん、numberの部分をstringに変更すれば、getArrayの`T`の部分はstringになります。

また、`T`の部分はどんな文字列でも可能ですが、慣習的にTypeのTを使う事が多いです。

> 今回は関数でのジェネリクスですが、ジェネリクスは型を指定するところならばどこでも利用可能です。
> クラス・インタフェースでも利用可能です。

### ジェネリクスの制約

インタフェースを利用する事で、ジェネリクスに制約を与える事も可能です。

まずは、クラスで制約の無い場合のジェネリクスです。

```js:sample.ts
class MyData<T> {
  constructor(public value: T) {}
  getArray(): T[] {
    return [this.value, this.value, this.value];
  }
}

let v1 = new MyData<string>(`hello`);
console.log(v1.getArray());
let v2 = new MyData<number>(123);
console.log(v2.getArray());
```

クラス宣言のすぐ後ろに`<T>`を持ってきて、クラス内での`T`をジェネリクス化しています。
これで、インスタンス化する際に`<T>`の部分に型を持って来れば、インスタンス化時に指定した型が代入されるという仕組みです。

次に、制約を与えてみましょう。
どういう事かというと、「`T`の型は何でも良いが、特定のプロパティを持っている型にしてね。」という事です。
という事は独自の型でないとだめですよね。
そこで登場するのが、[前回](http://qiita.com/gcfuji/items/6173ac46ae1a05599c5d#_reference-d288c0980bc6cd9fd692)登場したインタフェースです。
インタフェースで、特定のプロパティを持った型を作成し、その型が持っているプロパティがないとコンパイル時にエラーを出力するという事です。

```js:sample.ts
interface Result {
  a: number;
  b: number;
}


class MyData<T extends Result> {
  constructor(public value: T) {}
  getArray(): T[] {
    return [this.value, this.value, this.value];
  }
}

let result = {
  a: 3,
  b: 5
};

let v1 = new MyData<Result>(result);
console.log(v1.getArray());
```

この様に、インタフェースを継承する形で`T`に制約を与えます。
extendsされた`T`はResult型のプロパティを持っていなければならないという制約を持ちます。

[前回](http://qiita.com/gcfuji/items/6173ac46ae1a05599c5d#_reference-d288c0980bc6cd9fd692)紹介した通り、TypeScirptのインタフェースは「構造的部分型」になっているので、上記の例で言えば、aとbというプロパティさえ持っていればOKです。
Result型でなくてもOKという事です。

# 終わり

4回に渡って、TypeScriptの主要な機能について解説してきました。
TypeScriptは型定義を持った、JavaScriptのスーパーセットであるという事が分かってもらえたかと思います。

しかも、TypeScriptは既存のJSの資産も利用する事ができます。
(Angular2, React, jQueryなど)

その際には、ただimportするだけでなく、型定義ファイルも取得しないといけません。
typingsという管理機能を使うのですが、また別途解説します。
(TypeScript2.0ではnpmのみで型定義ファイルを取得できるそうです。)

今まで、ES6 + Babelで開発していたプログラムも、TypeScriptを使って安全に、保守性高く開発していければと思います。
swift:Objective-CはNSLog、Swiftはprint

OSX Yosemite(10.10.5)
Xcode 7.2.1
Swift version 2.1.1
を使用しております。

Swiftの勉強を始めた頃
最初はHello Worldからだ。などと思い
Objective-CのNSLogと同等なものを探したら
それはprintでした。

```
//Objective-C
NSLog(@"Hello World");

//Swift
print("Hello World")

```

Swiftはバージョンが上がると使えなくなるものも少なくはなく
他のサイトなどでもまだよく見かける改行が入るSwift2.xでprintlnは使用不可能になりました。
printの最後に改行入る仕様になったんですね。
使い分けるよりこっちのほうが個人的はいいです。

シミュレータ、実機でテストして変数の中を調べたい場合、いちいちXcode上で止めて見るより
printなどで流れで見たい場合は必要ですね。

変数など表示したい場合

```
let sTest:String = "uhehe"
print("test " + sTest)

//結果
test uhehe
```
Stringは"+"でつなげることで表示できるようですが、他の型の場合


```
var dTest:Double = 10.5
print("test \(dTest)")

//結果
test 10.5
```
\\(変数or定数)で括れば表示されます。String型も対応しているのでこちらの書き方を覚えておいた方がいいかもしれません。

リリースビルドで実行させたくない場合
Objective-Cだとマクロで

```
#ifdef DEBUG
#define DEBUG_LOG(...) NSLog(__VA_ARGS__)
#else
#define DEBUG_LOG(...)
#endif
```

のような書き方ができますがSwiftは使えるマクロがそれほどないので

```
func deb_print(object: Any) {
    #if DEBUG
        Swift.print(object)
    #endif
}
```
を書いて代用するか

```
#if DEBUG
    print("hogehoge")
#endif
```
毎回 #if DEBUG 〜〜 #endifで括るかくらいしかない。
代用関数作った方が色々融通が利くのでSwiftはその方向で考えた方が良さそう。
クラスとオブジェクトとインスタンスの相関関係

クラスとオブジェクトとインスタンスの相関関係を説明したサイトは数多あるが、自分は以下のサイトの説明がわかり易かったので備忘録として残す。

http://www.shigeweb.jp/php/project_p/?section=first&page=class
web-console を使えば Rails App のデバックが楽になる

[web-console](https://github.com/rails/web-console)

View 内でコンソールを立ち上げて、変数や parameter などの状態を見る事の出来るデバック用のライブラリ。
Rails 4.2 から  デフォルトで入っていたんですね。こんな便利なデバッグツールを知らなかったなんて、損してた。。。

# 使い方

console を立ち上げたい View または、Controller で `console` メソッドを呼び出す

```erb:view
<% console %>
<p id="notice"><%= notice %></p>

<h1>Listing Users</h1>
...
```

```rb:controller
class UsersController < ApplicationController
  before_action :set_user, only: [:show, :edit, :update, :destroy]

  # GET /users
  # GET /users.json
  def index
    console
    @users = User.all
  end

...
```

これだけで、以下のようなコンソールが立ち上がります！

![image](https://qiita-image-store.s3.amazonaws.com/0/41416/2e7cc3f4-7a75-8b57-e5ec-21d1c75a252f.png)

あとは、Rails Console と同じように、見たい情報を入力するだけ！

![image](https://qiita-image-store.s3.amazonaws.com/0/41416/f7eb89de-ba46-b94d-6490-0f77fde72b95.png)

便利だ！

ちなみに、エラーページでは何も設定しなくても自動で立ち上がるようになります。変数の値とか見たいだけなら `pry` なんて埋め込む必要なかったんですねー。
anacondaを用いたpythonのインストール方法

anacondaを利用することでpythonが簡単にインストールできるので、その手順を記載する。
anacondaで仮想環境を作成することで、python2やpython3など、複数の環境を利用することが可能となる。

#環境
CentOS 6.8

#pyenvのインストール
pyenvをgitから持ってくる。

```
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ source ~/.bashrc
```

#anacondaのインストール

##インストール可能なanacondaのバージョンを確認

```
$ pyenv install -l | grep anaconda
```

anaconda2-x.x.xがpython2系、
anaconda3-x.x.xがpython3系と対応している。

##anacondaのインストール

今回はpyhon2系で2016年7月3日での最新版であるanaconda2-4.0.0をインストールする

```
$ pyenv install anaconda2-4.0.0
$ pyenv rehash
$ pyenv global anaconda2-4.0.0
```

##condaをアップデート

```
$ conda update conda
```

#仮想環境の利用

##仮想環境の構築
新しく仮想環境を構築するには、以下のコマンドを実行する。
conda create -n <環境名> python=<バージョン> <スペース区切りでライブラリ名>

具体的には、

```
$ conda create -n test1 python=2.7 numpy matplotlib scipy pandas jupyter
```

とする。
pyhon3系の環境も使いたい場合は同様の手順でanaconda3をインストールし、
condaで環境を作成すればよい

##仮想環境の確認

```
$ conda env list
```

または、

```
$ conda info -e
```

##仮想環境の適用
環境名test1を適用する場合、以下のコマンドを実行

```
$　source　PYENV_ROOT/versions/anaconda2-4.0.0/bin/activate　test1
```

抜ける場合は、

```
$ source deactivate
```

以上
javascriptテストフレームワーク「jasmine（ジャスミン）」のsrcを見てみた

前回に続き、今回はjasmineのsrc配下に入っているPlayer.jsとSong.jsを見てみた。
# Player.js
```js:Player.js
function Player() {
}
Player.prototype.play = function(song) {
  this.currentlyPlayingSong = song;
  this.isPlaying = true;
};

Player.prototype.pause = function() {
  this.isPlaying = false;
};

Player.prototype.resume = function() {
  if (this.isPlaying) {
    throw new Error("song is already playing");
  }

  this.isPlaying = true;
};

Player.prototype.makeFavorite = function() {
  this.currentlyPlayingSong.persistFavoriteStatus(true);
};


```
- function Player()
    - 関数Player()を定義
    - からっぽ！

- Player.prototype.play = function(song)
    - prototype.playを代入先にして引数songを持つ無名関数を定義
    - this.currentlyPlayingSong（現在再生中Song）に引数songを代入
    - this.isPlaying（再生中？）にtrue（再生中）を代入

- Player.prototype.pause = function()
    - prototype.pauseを代入先にして引数を持たない無名関数を定義
    - this.isPlaying（再生中？）にfalse（非再生中）を代入

- Player.prototype.resume = function()
    - prototype.resumeを代入先にして引数を持たない無名関数を定義
    - if (this.isPlaying)（もし再生中なら）
    - throw new Error("song is already playing");新しい例外をメッセージつきでスロー。
    - this.isPlaying（再生中？）にtrue（再生中）を代入
      - 最初よくわからなかったけど、再起動したときに音楽を再生する（再起動前に音楽を再生していた）というtrueなのかな。

- Player.prototype.makeFavorite = function()
    - prototype.makeFavoriteを代入先にして引数を持たない無名関数を定義
    - currentlyPlayingSong（現在再生中の音楽）
    - persistFavoriteStatus（好きなステータスを永続化）
    - なので、currentlyPlayingSong.persistFavoriteStatusは（現在再生中の音楽をお気に入りに登録）的な意味なのかな。それにtrue（イエス！）を代入。

こんな感じの解釈でいいんでしたっけ。
java script自体が久々なのでだいぶ忘れてるなぁ。
たしかprototypeっていうのが言語としてデフォルトで用意されていて、親子関係でさかのぼれるんでしたよね。prototypeが関数オブジェクトなんでしたっけ。

# Song.js
```js:Song.js
function Song() {
}

Song.prototype.persistFavoriteStatus = function(value) {
  // something complicated
  throw new Error("not yet implemented");
};
```
- function Song()
    - 関数Song()を定義
    - からっぽ！

- Song.prototype.persistFavoriteStatus = function()
    - persistFavoriteStatusは（続きますお気に入り状態） 
    - prototype.persistFavoriteStatusを代入先にして引数valueを持つ無名関数を定義
    - something complicatedは（複雑な何か）だと思うのでここにややこしい業務処理があるとして。みたいなニュアンスなのかな。
    - "not yet implemented"は（まだ実装されていません）なのでたぶんそういう意味ですね。
    - throw new Error("not yet implemented");新しい例外をメッセージつきでスロー。

Songのほうは関数が1つ。シンプルです。（なにせ実装してないのでシンプルです）

# テストコード観てみないとこれだけだとわからないですね
次回はテストコードを見てみます。
それにしてもjava script本当に久しぶりだなぁ。

# Released under the MIT license
http://opensource.org/licenses/mit-license.php