OmniAICreator/Qiita-1.07M huggingface dataset:
ruby-aws-sdkからEC2RunCommandでEMRspark-submit

正直なところ、「業務でしか使いそうに無い上にニッチすぎ」と自分で書いてて思うのですが、自分で調べている間に「こういう記事があったらラクだったなあ」と思うので淡々と書いていきたい。

あ、「この内容ならこのタグもあったほうが良い」的なやつはとてもありがたいのでご指摘くだされば。

###なんでそんなことするの
add job flow steps(画面からも設定できるアレ)は、実行が直列です。
step1,step2とあるとき、2は1が終わらない限り実行されません。
これはこれで大きなメリットですが、spark jobを並列にばしんばしん撃つ必要があるときも生きていればあるかと思います。
きっと････････････････

###Role
IAMロール設定で、AmazonEC2RoleforSSMを

EMR ロール もしくは EC2 インスタンスプロファイル

で利用するロールにアタッチします。自分はEC2 インスタンスプロファイルのほうに設定しています。
ただ、EMRデフォルトロールを使っている場合、もしかしてこれやる必要ないのではないか疑惑があります。

###EMR起動
EMRブートストラップにカスタムスクリプトを設定します。

```shell-session
#!/bin/bash -ex

cd ~

curl https://amazon-ssm-us-east-1.s3.amazonaws.com/latest/linux_amd64/amazon-ssm-agent.rpm -o amazon-ssm-agent.rpm
sudo yum install -y amazon-ssm-agent.rpm
```

ssmエージェントのインストールシェルです。
こいつを設定した上でEMRクラスタを起動します。

その際、タグに

testCommand = yes

とでもつけといてください。

###発行できるか確認
EC2マネジメントコンソールのナビゲーションペイン(左側にあるメニューというかサイドバーみたいなやつです)の中に、
SYSTEMS MANAGER SERVICESってのがあるので、その中からcommandを選びます。
なお、日本語だと「コマンド履歴」という強烈に分かりづらい表記になっているので気をつけましょう。

画面に従って進めていくと、コマンドを発行するインスタンスを選択するフォームが出てくるはずです。
その中にさっき起動したEMRクラスタに所属するEC2インスタンスIDが表示されていることを確認しましょう。
表示されていさえすれば勝利は目前です。
ただし、この確認作業を実施するAWSユーザにはSSMの権限が必要です。
設定が自由に行える状態であるならAmazonSSMFullAccess権限をアタッチしましょう。
業務などで権限が自由にならない場合は多分ReadOnlyのほうでも確認だけは出来るはず。

###credentials
割とこれは前提になってる部分もありますが。勿論、id/secretともにベタで指定しても動作します。
ruby実行ユーザのhomeディレクトリ上で

```
mkdir .aws
cd .aws
touch credentials
vi credentials
```

中身は

```
[default]
aws_access_key_id = あなたのアクセスキー
aws_secret_access_key = あなたのシークレットアクセスキー
```

これをやっておくと、SDK使うときに

```ruby
credentials: Aws::SharedCredentials.new
```

これで認証通るようになるのでラクチンです。

###rubyコードサンプル
あとは動かすだけです。なお、testCommand = yesを持つクラスタは1個だけ、という前提です。
EMR上でspark jobを実行するユーザはhadoopで。
hadoopだと困る方は適宜書き換えてください。その際はEMR側にもuseraddとかしなきゃいけないとは思いますが。
-iオプションも同様で、適宜必要かどうか判断してください。
実際に動いているコードから必要部分を抜粋・編集して載せてるのでもしかしたらそのままコピペだと動かないかも。
Pythonだとclassとかjarパスのあたり変わりそうですが、そのあたりは適宜なんとかしていただくということで･･･

```ruby

def exec
  main_class = 'mainクラスがあるパッケージ名'
  jar_path = 'jarファイルのフルパス'

  Aws::SSM::Client.new(
    region: 'れぎおｎ',
    credentials: Aws::SharedCredentials.new
  ).send_command({
    document_name: 'AWS-RunShellScript',
    instance_ids: [master_instance_id],
    parameters: {
      commands: ['sudo -u hadoop -i spark-submit --class #{main_class} --master yarn #{jar_path}'],
      executionTimeout:['3600']
    },
    timeout_seconds: 600
  })
end

def master_instance_id
  Aws::EC2::Client.new(
    region: 'れぎおｎ',
    credentials: Aws::SharedCredentials.new
  ).describe_instances(
    filters:[
      {name: "tag:testCommand", values: ['yes']},
      {name: "tag:aws:elasticmapreduce:instance-group-role", values: ['MASTER']},
      {name: 'instance-state-name', values: ['running'] }
    ]
  ).first.reservations.first.instances.first.instance_id
end

```

なお、これで実行すると必ずpendingでステータスが戻ってくるので、正常終了したのかどうかを発行側で確認するためにはリクエストIDをパラメータとしてなんか専用のコマンド叩く必要があるそうです。

ワッショイ。
The Basic - Integers, Floating-Point Numbers


## 参考
The Swift Programming Language 3.0.1
- The Basic - Integers
- The Basic - Floating-Point Numbers

## 整数(Integers)
整数とは、小数点を持たない数値。例えば 42 や -23 など。

### 符号あり(Signed) - *Int*
符号ありの数値は、42のような正の数値、ゼロ、-23のような負の数値を表す。

型名は *Int*

### 符号なし(Unsigned) - *UInt*
符号なしの数値は、42のような正の数値かゼロを表す。

型名は *UInt*

### ビットフォーム
Swift では符号あり・なしどちらにも 8, 16, 32, 64ビットのフォームが用意されている。
ビットフォームを明示する場合は Int8, Int16, Int32 もしくは UInt8, UInt16 といったように記述する。

もし明示なく、Int とだけ記述した場合、

* そのプログラム実行環境が32bit環境だった場合、Int32として扱われる
* 64bit環境だった場合、Int64として扱われる。

Swift では、明確な数値範囲を指定する必要がない限り、Int のみの使用を勧めている。
UIntについても、余程符号なしを使う必要がない限り利用しない。


## 浮動小数点(Floating-Point Numbers)
浮動小数点とは整数未満を持つ数値、例えば 3.14159, 0.1, -273.15 のような数値を意味する。

浮動小数点型には2種類の型があり、

* *Double* - 64ビットの浮動小数点型
* *Float* - 32ビットの浮動小数点型

Swift では、小数点を扱う場合標準は Double として扱われる。

```
// sampleA は Double型 として扱われる
let sampleA = 3.14

let sampleB: Float = 1.0

// 型が違うのでエラーになる
let addition = sampleA + sampleB
```
WanderlustでContent-Transfer-Encoding: base64なメールを見る方法

#背景
私はメールを読むのは主にEmacs + Wanderlustなんですが、たまに本文がうまく読めないメールが来ます。
中身を見てみると、
```
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
```
というメールでした。Outlookなんかがこの形で送信するのかな？

#設定

以下を ~/.wl に追加しましょう。

```
(require 'mime-def)
(mel-define-method mime-decode-string (string (nil "base64"))
  (condition-case error
      (base64-decode-string string)
    (error
     (catch 'done
       (when (string-match
              "\\([A-Za-z0-9+/ \t\r\n]+\\)=*" string)
         (let ((tail (substring string (match-end 0)))
               (string (match-string 1 string)))
           (dotimes (i 3)
             (condition-case nil
                 (progn
                   (setq string (base64-decode-string string))
                   (throw 'done (concat string tail)))
               (error))
             (setq string (concat string "=")))))
       (signal (car error) (cdr error))))))
```

以上。

#参考

http://thread.gmane.org/gmane.mail.wanderlust.general.japanese/7628/focus=7640
後からリーダーボードを追加すると「すべての時間」に表示されない

いまこんな現象が起こっていて、解決できていません。
なにかご存知の方がいれば、コメントいただけると助かります。

* v0.6でGameCenterをONに。リーダーボードを８つ設定
* v0.8でリーダーボードを2つ追加
 * 追加したリーダーボードは一覧に表示されるが、「スコアなし」と表示される
 * フィルタリングを「すべての時間」から「今週」に変更すると表示できる

iTunes上では

* 審査には追加した２つは含めており、現在配信中ステータスになっている
* マルチプレイヤー互換性はv0.6のまま
* v0.8公開から２日経過している

という状況です。マルチプレイヤー互換性のせいかな？と思い、v0.8にあげて３０分ほど経過してけどなにも変わってないナウという状況です。

iTunes上からもユーザーデータが送られていることは確認できているので、実装側ではなくiTunes側の設定の問題かなと思っています。


※問題になっているアプリ。Level9,10のスコアが表示できていません。
https://goo.gl/bbYGWh
Reactを理解するためのメモ

Reactを理解するための5つのキーワード

## コンポーネント
- Reactの根幹

## ステート
- ステートはコンポーネントの内部の変数のようなもの
- コンポーネントが生成される際に初期化され、その後コンポーネントの状態の変化を保持するために使われる
- ステートはコンポーネントの外部からはアクセスできない

## プロパティ
- プロパティはコンポーネントに外部から与えられるオプションのようなもの
- HTMLでいうとタグの属性に相当する
- コンポーネントの内部では、プロパティはステートと同じように変数としてアクセスできるが、
コンポーネント自身はプロパティの値を変更してはいけない。

## JSX
- 「JS」はJavaScript、「X」はXMLの略
- XMLの文法によって、Reactのコンポーネントを配置できるようにするための一種の言語
- JSXによりjavascriptとHTMLを混在させるような感覚でWebページのUIを記述できるようになる
- ReactがJSXに依存しているわけではない

## 仮想DOM (Virtual DOM)
- 仮想DOMは、コンポーネントと並んでReactの中核をなす特徴的な技術
- コンポーネントが外面的なものとすれば、仮想DOMは内面的なもの
- Reactが内部でコンポーネントを処理し、実際のWebページの表示に反映する際の仕組み
実機ビルドのみでアプリ容量がすごいスピードで増える場合に疑う設定

## 状況
iPhoneに実機ビルドしながら開発をしていたら、突然iPhoneから「容量不足」のアラートが。

「ストレージとiCloudの使用状況」の設定を見ると、自分が開発しているアプリが一番上に表示され、「書類とデータ」の項目には数百MB～数GBの容量が…

また、Archiveしたアプリ（TestFlight経由/AdHoc問わず）ではその現象が発生しませんでした。ビルド設定を疑い、Runのビルド設定をDebugからReleaseにしてみても、Runの場合は発生します。

## 原因
メモリに関する動作をすべてロギングする設定がXcodeにはあります。
メモリリークなどを追いかける際に使用する設定なのですが、このログがアプリの保存領域（tmp）に格納されるようです。

> [Edit Scheme...] > Run > [Diagnostics] > Logging > [Malloc Stack]

ここにチェックが入っていると、実機ビルドしたアプリを動かすだけで、端末にどんどんログが吐き出され、容量を圧迫していきます。

[tmpの中身をすべて削除するようなコード](http://stackoverflow.com/questions/9196443/how-to-remove-tmp-directory-files-of-an-ios-app)を試しにアプリに実装してみると、容量が改善することもわかります。

今回、デバッグ時にこのチェックを入れていたため、容量がふくらんでしまっていたため、チェックを外すことで状況が改善しました。

## さいごに
通常、デバッグ時のみ発生する現象はビルド設定を疑うところですが、

* ビルド設定（Debug/Release）や最適化レベルを問わず発生する
* Archiveした場合は発生しない

時は、Schemeの不要な項目にチェックが入っていないか確認しましょう。
機械学習 Rによる線形回帰

線形回帰：目的変数体説明変数のグラフを書くと先になる。

Rではlmコマンドを利用することで線形回帰分析を行うことができる。

```
lm(モデル関数、学習用データ)
```

目的: Tyrosineから絨毯の年齢を予測する。

###1. データセットの読み込み

```
#データセットの読み込み
> carpet.data<-read.csv("http://www.stat.ufl.edu/~winner/data/carpet_age.csv", header=TRUE)

# 最後の2行は年齢が入ってないため削除
> carpet.data<-carpet.data[1:(nrow(carpet.data)-2),]
```

```
sample_id：絨毯ID
age:絨毯年齢
cys_acid: Cysteic Acidのレベル　※システイン酸
met:Methoionineのレベル　※メチニオン
tyr: Tyrosineのレベル　　　　　※チロシン
```

###2.分類器（機械学習モデル）を作成

```math
y  = a + bx
```

```math
age  = a + b*tyr
```

```
# carpet.model.lm1にモデルオブジェクトが保存される
> carpet.model.lm1 <- lm(age ~ tyr, carpet.data)
```

###3.予測値を取得
モデルオブジェクト(carpet.model.lm1)とデータ（carpet.data)をもとにして予測値を計算し、結果をapge.predicted.lm1列に格納。
predict関数で予測値を得る。

```
> carpet.data$age.predicted.lm1 <- predict(carpet.model.lm1,carpet.data)

#予測値を確認
> head(carpet.data$age.predicted.lm1)
[1] 1772.335 1772.335 1682.160 1652.101 1652.101 1591.985
```
###4.結果の可視化
- plot関数を使ってageとtyrの関係を可視化する。

```
> plot(x=carpet.data$tyr, y=carpet.data$age)
```

<img width="462" alt="スクリーンショット 2016-10-19 21.18.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/95399/306dba78-3bf7-ef0d-3097-1041d400d233.png">

- 上のグラフに今回の線形器回帰分析で得られた予測値を赤点で可視化

```
> points(x=carpet.data$tyr, y=carpet.data$age.predicted.lm1,col="red")
```
<img width="459" alt="スクリーンショット 2016-10-19 21.20.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/95399/c4f38c26-7c83-0f45-5bba-7fd491ecafda.png">

- モデル直線を追加

```
> abline(a=carpet.model.lm1$coefficients[1],b=carpet.model.lm1$coefficients[2],col="blue")

#以下でも同じ結果が得られる
> abline(carpet.model.lm1,col="blue")
```
<img width="459" alt="スクリーンショット 2016-10-19 21.24.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/95399/ed616520-d992-e39a-d113-bc140c071912.png">

予測値はage = a + b x tyr上に載っている。

- 測定値 vs 予測値グラフ
モデルによる予測がうまくいっていれば赤い直線（傾き1,切片0の直線）に近いところにプロットされる。

```
> plot(x=carpet.data$age,y=carpet.data$age.predicted.lm1)
> abline(a=0,b=1,col="red")
```
<img width="463" alt="スクリーンショット 2016-10-19 21.47.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/95399/6c4cb04b-2e05-2b8b-18a0-a01654714df4.png">

### 5.推定精度の検証
モデルでの予測精度を定量的に表す指標として決定係数がよく用いられる。
決定係数は目的変数の測定値と予測値を引数とする下記の関数で計算できる。
※決定係数はモデルの精度

決定係数は目的変数の測定値と予測値を引数とする下記の関数で計算できる。

```
> coef.det <- function(measured, predicted){
 1-sum((measured-predicted)^2) / sum((measured-mean(measured))^2)
 }

#モデルの決定係数を上記関数を使って求める
> coef.det(carpet.data$age,carpet.data$age.predicted.lm1)
[1] 0.9805863
```
決定係数が1に近いほどモデルの精度がいいことを意味する。

線形回帰モデルの場合は以下でも決定係数を取得可能

```
> summary(carpet.model.lm1)$r.squared
[1] 0.9805863
```

そんなに変わらない。

###6.他のモデル関数を使ってみる
以下のモデル関数で試してみる。

```math
y = a +bx + cx^2
```

```
# モデルオブジェクトを作成
> carpet.model.lm2 <- lm(age ~ poly(tyr,2), carpet.data)

# 予測値を求める
> carpet.data$age.predicted.lm2 <- predict(carpet.model.lm2,carpet.data)

# 決定係数を求める
> summary(carpet.model.lm2)$r.squared
[1] 0.98508
```
技術英語 > it's reflected in both:

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 1422 / 12833)

> therefore, whether we change the list contents by using the name a or b, **<font color=red>it's reflected in both</font>**:

どういうことかというと

http://ideone.com/IyHMnj

```py
a = [1,2,3]
b = a
a[0] = 'resistance is futile'
print(b)
```

```txt:結果
['resistance is futile', 2, 3]
```

関連 [Python > [[0.0], [0.0], [0.0], [0.0], [0.0]]を簡略表記する > [[0.]]*5 > ***やってはいけない*** / Pythonインタープリタがプログラムを解釈しながら値や変数をメモリに展開していく様子を作図していただきました / 内包表記](http://qiita.com/7of9/items/d03d099b400d9a067086)

関連 [Python > list > コピー方法3つ > .copy() / list() / [:] > Python3では動く / Python2では.copy()でエラー > 全てshallow copyでした](http://qiita.com/7of9/items/b3ff11b6076df13ebdb4)
NVIDIAのグラフィックボードがあるときのOpenGLを使ったGUIをDocker内で起動する

ハマったのでメモ。

[DockerでGUIのアプリ動かすためのメモ](http://qiita.com/tnarihi/items/275c009e9dec1306893f)

上の方法でGUIアプリを起動出来るようになったのは良かったが、ホスト側でNVIDIAのグラフィックボードを使っている環境において、OpenGLを使ったアプリ（具体的に今回はRViz）を使うと、```libgl error : failed to load driver swrast```
的なエラーがでてセグメンテーションフォルトで落ちることがあった。

[docker/Tutorials/Hardware Acceleration - ROS Wiki](http://wiki.ros.org/docker/Tutorials/Hardware%20Acceleration) にある通り、nvidia-docker（NVIDIAのカードをDocker内で利用するためのDockerラッパー）を使ってコンテナを起動すると良い。ただし、NVIDIA-Dockerに
NVIDIAのドライバー使うよと教えるために、Dockerイメージを自分でビルドする必要がある。
以下のDockerfileを適切な場所に作成して、

```docker
FROM osrf/ros:indigo-desktop-full  # 今回使ったベースイメージ

# NVIDIAドライバ使うことをnvidia-dockerに教える
LABEL com.nvidia.volumes.needed="nvidia_driver"
# NVIDIAのexecutableやlibの場所にパスを通す（今回必要かしらない）
ENV PATH /usr/local/nvidia/bin:${PATH}
ENV LD_LIBRARY_PATH /usr/local/nvidia/lib:/usr/local/nvidia/lib64:${LD_LIBRARY_PATH}
```

Dockerfileがあるフォルダで、

```bash
docker build -t ros:nvidia .  # -t Dockerイメージの名前とタグを適当なものに指定 
```

これで、nvidia-dockerを使ってコンテナを起動すれば良い。

```
nvidia-docker run -it \
    --user=$(id -u):$(id -g) \  # ホスト側のUIDとGIDでコンテナを起動
    $(for i in $(id -G); do echo -n " --group-add "$i; done) \  # 所属しているグループを全て設定
    --env=DISPLAY=$DISPLAY \  # ホスト側のDISPLAYを設定
    --env=QT_X11_NO_MITSHM=1 \  # X errorを抑える
    --workdir="/home/$USER" \  # 初期ディレクトリをホストユーザーのホームに設定
    --volume="/home/$USER:/home/$USER" \  # ホストユーザーホームをマウント
    --volume="/etc/group:/etc/group:ro" \  # 以下4つはホスト側のユーザー情報をそのまま使うための設定
    --volume="/etc/passwd:/etc/passwd:ro" \
    --volume="/etc/shadow:/etc/shadow:ro" \
    --volume="/etc/sudoers.d:/etc/sudoers.d:ro" \
    --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \  # ホスト側のXを使う
    osrf/ros:indigo-desktop-full \  # Dockerコンテナを指定
    rqt  # 実行コマンドを指定
```
Ubuntuで演算子が判別しやすくなる FiraCodeフォント を使う

before

![before.png](https://qiita-image-store.s3.amazonaws.com/0/25728/94f7ffb9-6663-326e-af20-9c6a47ab6f9d.png)

after

![after.png](https://qiita-image-store.s3.amazonaws.com/0/25728/171e6041-81de-dbec-af79-87adb29d07c7.png)


## フォントの導入

* [tonsky/FiraCode: Monospaced font with programming ligatures](https://github.com/tonsky/FiraCode/releases)
    * *.ttf を ~/.fonts/ にコピー

## VS Code で使う

```json:settings.json
{
    "editor.fontFamily": "'Fira Code', 'Droid Sans Mono', 'monospace', monospace, 'Droid Sans Fallback'",
    "editor.fontLigatures": true
}
```

## QTerminalの設定

```
apt install -y qterminal
qterminal
```

![qterminal.png](https://qiita-image-store.s3.amazonaws.com/0/25728/2c0f35db-22ee-7a64-964d-1b9f4593037a.png)


## 対応ターミナル一覧

![スクリーンショット_2017-02-10_05-51-33.png](https://qiita-image-store.s3.amazonaws.com/0/25728/ef2c98a2-7776-b432-414a-0022306924b4.png)
GLPKを手頃に扱えるラッパークラスを作成しました

# 概要
　前回、GLPK for C#/CLIの使い方について学びました。
　　[GLPK for C#/CLIで遊ぼう！ - Qiita](http://qiita.com/YSRKEN/items/408c0aac09bbb8034eb2)
　ただ、「C#なのにプロパティを使わない」など、APIの出来がどうにも**アレ**でしたので、適当にラッパークラスを作成してしまいました。ライセンスは[GPL](https://www.gnu.org/licenses/gpl-3.0.ja.html)ですが、よろしければどうぞ……。

# で、どうラップしたのさ？
　比較画像を用意しました。左のコードが右のように書けます。

![image](https://qiita-image-store.s3.amazonaws.com/0/29802/c0f35d17-4895-0a76-2589-7b6921033e28.png)

　単に71行が41行になっただけでなく、[コンストラクタ/デストラクタという人権](http://ufcpp.net/study/csharp/oo_construct.html)や、[プロパティという常識](http://ufcpp.net/study/csharp/oo_property.html)、そして[演算子オーバーロードという文明の利器](http://ufcpp.net/study/csharp/oo_operator.html)が盛り込まれたことで大幅に書きやすくなった……はずです。
　また、内部で少し小細工することで、「problem.ObjCoef[0]」などとメソッド風に[]演算子を書くことができるようにしました。オーバーヘッドの面から、制約式/変数の範囲設定や、制約式の係数設定について細かいメソッドを設けることはあえてしませんでしたが(GLPK自体のAPIの都合による)、気が向いたらメソッドを追加するかもしれません。
　ちなみに上の画像([GLPKのマニュアル](http://kam.mff.cuni.cz/~elias/glpk.pdf)にもある由緒正しき例題)では線形計画問題を解かせていますが、整数計画問題も勿論解かせることができます。

　なお、GLPK for C#/CLIには**本来定数なはずの数値が定数扱いではない**という明確なクソ仕様があったので、いちいち数値を見て再設定しましたorz

![image](https://qiita-image-store.s3.amazonaws.com/0/29802/fa406539-cb6a-043c-3be5-50db628c39e5.png)

# 注意事項
　[GitHubのReference.md](https://github.com/YSRKEN/GlpkWrapperCS/blob/master/Reference.md)にも書いてありますが、全APIを再現はしていないのでご注意ください。
　細かい処理がしたい場合は、org.gnu.glpk名前空間にあるGLPK for C#/CLIのメソッドを叩くか、ラップしてテキトーに追加するかしてください。issuesへの要望は歓迎します。

# 配布先
　[GlpkWrapperCS - Wrapper Class for GLPK by C-Sharp](https://github.com/YSRKEN/GlpkWrapperCS)
Anima2DのSpriteMeshEditorを使おうとするとNullReferenceErrorが出る

## 読む前に

この記事はUnity5.5.0f3にて起きている内容になります
バージョンアップ等で解決している場合コメントいただけると幸いです。

## エラーが出る

```csharp:Anima2D/Scripts/Editor/TextureEditorWindow.cs
Texture2D mShowBonesImage;
Texture2D showBonesImage {
	get {
		if(!mShowBonesImage)
		{
			mShowBonesImage = EditorGUIUtility.Load("Anima2D/showBonesIcon.png") as Texture2D;
			mShowBonesImage.hideFlags = HideFlags.DontSave; // ここでエラー
		}
		
		return mShowBonesImage;
	}
}
```

## 一時的な対策

`"Anima2D/showBonesIcon.png"`を`"icons/_Popup.png"`とかに変える

"icons/_Popup.png"はUnityが標準で用意しているアイコンの一つ


## 根本的な解決

Unityに対応してもらう。
Mac OSX El Capitanにbrewで MariaDB+Mroonga環境を入れてNetCommons3(CakePHP2)で使う


# Mroonga+MariaDBインストール

参考 http://mroonga.org/ja/docs/install/os_x.html#install-os-x-homebrew

```
$ brew install https://raw.github.com/mroonga/homebrew/master/mroonga.rb --use-homebrew-mariadb
```

ここmariadbみつからんってエラーでたので brew update

```
$ brew update
```

ここでもまたエラー。No such file or directoryとか怒られる。

http://hkdnet.hatenablog.com/entry/2016/07/30/215925 を参考にbrew prune

```
$ brew prune
```

再度brew updateしてからインストールしたらちゃんとインストールできました。

# MariaDBの起動・停止

## MariaDB起動

```
$ brew services start mariadb
```

## MariaDB停止

```
$ brew services stop mariadb
```

# MAMP Pro環境のCakePHP2で利用する

DB接続できなくてNo such file or directory（だったかなうろ覚え^^;）でたのでmysql.sockの場所を app/Config/database.php で指定

```php
		public $default = array(
			'datasource' => 'Database/Mysql',
			// （中略）
            'unix_socket' => '/tmp/mysql.sock', // これを追加
		);

```

ってことでMAMP ProのCakePHP2（NetCommons3環境）からMariaDB＋Mroongaへ接続できるようになりました(^^)
AWS EC2にElixir/Phoenixをインストール

## Erlang
```
$ id
uid=0(root) gid=0(root) groups=0(root)
$ yum -y install git openssl openssl-devel gcc-c++ ncurses ncurses-devel
$ cd /usr/local/src
$ wget http://www.erlang.org/download/otp_src_19.2.tar.gz
$ tar -zxvf otp_src_19.2.tar.gz
$ rm otp_src_19.2.tar.gz
$ cd otp_src_19.2
$ ./configure
$ make
$ make install
```
## Elixir
```
$ cd /usr/local/src
$ git clone https://github.com/elixir-lang/elixir.git
$ cd elixir
$ git checkout -b v1.4.1 refs/tags/v1.4.1
$ make clean test
$ mv ../elixir /usr/local/
$ chown -R ec2-user /usr/local/elixir

$ id
uid=500(ec2-user) gid=500(ec2-user) groups=500(ec2-user),10(wheel)

# add ~/.bashrc
PATH="/usr/local/elixir/bin:${PATH}"

```

## Phoenix
```
$ id;pwd
uid=500(ec2-user) gid=500(ec2-user) groups=500(ec2-user),10(wheel)
/home/ec2-user
$ git clone https://github.com/creationix/nvm.git ~/.nvm
#  add ~/.bashrc
  source ~/.nvm/nvm.sh
$ nvm install v7.5.0
$ npm install

$ mix local.hex
$ mix archive.install https://github.com/phoenixframework/archives/raw/master/phoenix_new.ez
$ mix phoenix.new sample
$ cd sample
$ mix phoenix.server


# browser
http://[Your public IP]:4000/
 # Welcome to Phoenix!
```
Intel Edison本体セットアップ手順

# 前提条件・必要なもの
母艦がWindows(64bit)の場合について書きます。
Intel Edison 本体
Intel Edison Mini breakout board または Arduino Board
MicroUSBケーブル×2本
※手順中で指示されるまでEdisonをPCにつながないこと！

# セットアップツールのインストール
下記からセットアップツール(InstallersのWindows64bit)をダウンロードし実行する
https://software.intel.com/iot/hardware/edison/downloads

#ドライバーインストール
ライセンス条項への同意や内容確認を進めていくと、下の画面にたどり着く
![setup.jpg](https://qiita-image-store.s3.amazonaws.com/0/107184/649b2ef7-04ca-0982-b6c0-260ce37509b0.jpeg)
「Install Drivers>」をクリック。すると画面が遷移する。
![setup6.jpg](https://qiita-image-store.s3.amazonaws.com/0/107184/34735c17-809e-e79a-ffd5-cf3d59bebf13.jpeg)
この画面で「Next」をクリックすれば、ドライバーのインストールが始まる。
途中、別ウィンドウでライセンス同意やインストールの確認が求められるが、
全て「はい」でよい。

#Intel Edisonへのファームウェア書き込み
次の画面で、「Flash Firmware>」をクリック
![setup7.jpg](https://qiita-image-store.s3.amazonaws.com/0/107184/462807d9-d280-b474-e4a4-7ac023372595.jpeg)

Firmwareのダウンロード先を聞かれるので、そのまま「Next>」をクリック
![setup8.jpg](https://qiita-image-store.s3.amazonaws.com/0/107184/8255eac2-32ab-e92b-34b3-406f8604f504.jpeg)

ダウンロードサイズの確認画面の次で、ダウンロードが行われる。
Firmwareのダウンロードが終わると、Intel Edisonを接続するように指示されるので
それに従う。順番を間違えると認識しないので注意。
![setup9.jpg](https://qiita-image-store.s3.amazonaws.com/0/107184/545a44f5-a6b0-20da-64d0-050071ea9f9c.jpeg)

いくらやっても「Next」ボタンが押せない、途中でエラーが発生する場合は
[別の方法](http://qiita.com/widret/private/5939af7aed155760abbb)を試してみてください。
書き込みが終了すると、下記二つが選択できるようになる。

#SSH有効化
Intel Edisonの識別名、ログインする際のrootユーザーのパスワードを設定する。

#WiFi接続設定
WiFiの接続設定を行う。
なお、この画面では固定IPにはできない。
IPアドレスを固定する場合は、別途設定する。

# 参考資料
https://software.intel.com/en-us/get-started-edison-win
rails でmailにimageを入れてるときのLinkのrspecのテスト

## imageがない場合

```rb:spec/mailers/email_spec.rb
let(:mail) { described_class.send_email(user)}
it 'assigns activation url' do
  url = something_url(user)
  expect(mail.body.encoded).to have_link(t('activate'), href: url)
end

```

## 画像を入れる

```rb:app/helpers/email_helper.rb
module EmailHelper
  def email_image_tag(image, options = {})
    image_tag email_image_url(image), options
  end

  def email_image_url(image)
    attachments[image] = File.read Rails.root.join("app/assets/images/#{image}")
    attachments[image].url
  end
end
```


```rb:app/views/user_mailer/send_mail.haml
...
= email_image_tag('test.png') # app/assets/image/test.png
...
```

画像を入れるとContent-typeが変わってしまい、上記のURLのテストがうまくいかない

## 解決方法

```rb:spec/supports/email_helper.rb
module EmailHelper
  def get_message_part(mail, content_type)
    mail.body.parts.find { |p| p.content_type.match content_type }
        .body.raw_source
  end
end

```

```rb:spec/mailers/email_spec.rb
include EmailHelper
let(:mail) { described_class.send_email(user)}
let(:msg) { get_message_part mail, /html/ }
it 'assigns activation url' do
  url = something_url(user)
  expect(msg).to have_link(t('activate'), href: url)
end

```
ちゃんとNS_ENUMを使おう、という話

# 初めに

Swift3からObjective-C側で定義されたenumを使うときは
`NS_ENUM` が使われていないとださいことになるのでちゃんと `NS_ENUM` を使おう。
今更だが。

# 実際どうなるか

こんな感じで、2通りのパターンでenumを定義してみる。

```objc
#import <Foundation/Foundation.h>

typedef enum : NSInteger {
    EnumHogeType1,
    EnumHogeType2,
} EnumHoge;

typedef NS_ENUM(NSInteger, EnumFuga) {
    EnumFugaType1,
    EnumFugaType2
};
```

すると、使うときにはこうなる。

```swift
let hoge: EnumHoge = EnumHogeType1 // .type1とは書けない
let fuga: EnumFuga = .type1        // 逆に、EnumFugaType1 とは書けない
```

`NS_ENUM` で定義した方だけがSwift3ぽく使えているのがお分かりいただけるだろうか。

# 終わりに

ちゃんと `NS_ENUM` を使おう。
CodeIQ「スーパー素数」問題に参加しました。


[CodeIQ「スーパー素数」問題](https://codeiq.jp/q/3132)の公開期間が終了したということで、自分の答案を公開したいと思います。

利用した言語はBash――なのですが、実際はawkですね(´・ω・｀) プログラミング・パズルをBashで解こうとすると、どうしてもawkを多用しがちです。

```awk
#!/bin/bash

awk '{
    n = 200000
    
    eratosthenes[0] = eratosthenes[1] = 1
    for (i = 2; i <= sqrt(n); i++) {
        if (eratosthenes[i] == 1) continue;
        for (j = i * 2; j <= n; j += i) eratosthenes[j] = 1;
    }

    for (i = 1; i <= n; i++) {
        if (eratosthenes[i] != 1) primes[++x] = i;
    }
    
    for(i = 1; i <= 2017; i++) super_primes[i] = primes[primes[i]];
    
    print(super_primes[$0])
}'
```

問題の内容としては「素数列の素数番目だけを集めた[『スーパー素数』](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%BC%E3%83%91%E3%83%BC%E7%B4%A0%E6%95%B0)列のn番目を求めなさい」というもの。解答にあたっては素数列を求める必要があるのですが、問題の制約上200000程度まで計算せねばなりません。よって比較的効率のよいアルゴリズム、すなわち「エラトステネスのふるい」により素数列挙を行いました。実際にやってみたわけではないのですが、試し割りのような計算量の多いアルゴリズムだと、CodeIQの制限時間(1秒)には間に合わないと思います。

要するに本問はエラトステネスのふるいがきちんと実装できるかということが問われていたのでした。

__おまけ:__ 現役システムエンジニアらしく、VBAでも実装しておきました(´・ω・｀)

```vbnet
Sub SuperPrimes()
    Const UpperBound As Long = 200000
    Const SuperPrimesUpperBound As Long = 2017
    
    Dim X As Long
    
    ' エラトステネスのふるい: 素数判定を行う。
    Dim IsPrime(UpperBound + 1) As Boolean
    For X = 0 To UpperBound
        IsPrime(X) = True
    Next X
    IsPrime(0) = IsPrime(1) = False
    
    For X = 2 To Sqr(UpperBound)
        If IsPrime(X) Then
            Dim NonPrime As Long
            For NonPrime = X * 2 To UpperBound Step X
                IsPrime(NonPrime) = False
            Next NonPrime
        End If
    Next X
    
    ' 素数列を求める。
    Dim Primes(UpperBound) As Long
    Dim PrimesIdx As Long
    PrimesIdx = 1
    For X = 2 To UpperBound
        If IsPrime(X) Then
            Primes(PrimesIdx) = X
            PrimesIdx = PrimesIdx + 1
        End If
    Next X
    
    ' スーパー素数列を求める。
    Dim SuperPrimes(SuperPrimesUpperBound) As Long
    For X = 1 To SuperPrimesUpperBound
        SuperPrimes(X) = Primes(Primes(X))
    Next X
    
    ' スーパー素数列をシートに書き出す。
    For X = 1 To SuperPrimesUpperBound
        Cells(X, 1).Value = SuperPrimes(X)
    Next X
End Sub
```

以上のマクロをエクセルに張り付けて実行すると、シートのA列にスーパー素数が書き出されます。業務で「素数」「エラトステネスのふるい」「スーパー素数」が必要になりそうな方は参考にしてください(｀・ω・´)ｼｬｷｰﾝ
Install CUDA8.0 and cuDNN5.1 to Ubuntu16.04LTS


## Install CUDA8.0
Download CUDA8.0 from https://developer.nvidia.com/cuda-downloads
Execute the following commands to install CUDA.
```@terminal
sudo dpkg -i cuda-repo-ubuntu1604_8.0.44-1_amd64.deb
sudo apt update
sudo apt install cuda
```

## Setting the path
write into .bashrc file as below 
```@terminal
echo -e "\n## CUDA and cuDNN paths"  >> ~/.bashrc
echo 'export PATH=/usr/local/cuda-8.0/bin:${PATH}' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:${LD_LIBRARY_PATH}' >> ~/.bashrc
source ~/.bashrc
```

```.bashrc will be like this
export PATH=/usr/local/cuda-8.0/bin:${PATH}
export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:${LD_LIBRARY_PATH}
```

####check whether the path of CUDA is passed through
```@terminal
echo $PATH             # is the path "/usr/local/cuda-8.0/bin" included?
echo $LD_LIBRARY_PATH  # is the path "/usr/local/cuda-8.0/lib64" included?
which nvcc             # is the path "/usr/local/cuda-8.0/bin/nvcc" outputed?
nvidia-smi             # is the information of nvidia's GPU displayed?
```

## Install cuDNN
Download cuDNN 5.1 for CUDA 8.0 from 
https://developer.nvidia.com/rdp/cudnn-download 

1.Execute the following commands on the terminal at the directory where you just saved the downloaded cuDNN.
2.Copy lib of cuDNN into the directory where CUDA as installed.
3.Setting the symbolic link.
```@terminal
tar xzvf cudnn-8.0-linux-x64-v5.1.tgz 
sudo cp -a cuda/lib64/* /usr/local/cuda-8.0/lib64/
sudo cp -a cuda/include/* /usr/local/cuda-8.0/include/
sudo ldconfig
```

#### Check the operation
Execute the sample of CUDA to check the operation.
Because the shell script which is used to copy the sample code to the home directory(```cuda-install-samples-8.0.sh ```) is in ```/usr/local/cuda-8.0/bin/```, so if CUDA path is passed through,you can execute the sample by only assigning the filename.
```@terminal
cuda-install-samples-8.0.sh ~ # copy the sample code to home directory
cd ~/NVIDIA_CUDA-8.0_Samples/
make
cd bin/x86_64/linux/release   # move to the directory where the executable file of the sample is in.
./smokeParticles
```
 
![cudnn_cuda_test_screen.png](https://qiita-image-store.s3.amazonaws.com/0/57050/9b8b81af-ce8f-4219-1f5f-b6bf393897ed.png)
Unityでウディタのキャラクタ画像をAnimation付きで表示する

# ウディタ？
[「WOLF RPGエディター」](http://www.silversecond.com/WolfRPGEditor/)
RPGツクール的なゲーム制作ツール。
本来はWOLF RPGエディタ用にキャラクタ画像を作るのだけれど、この画像をUnityのゲームに持って来れば便利だなと思ったのでトライ。

# 画像を準備する
ここではエルフさん画像を用意する。
![elfsan.png](https://qiita-image-store.s3.amazonaws.com/0/162289/0d6fc715-122d-aaaa-2ef7-d3fd12cb0828.png)

# アセットに登録する
Resourcesディレクトリにユニット用のUnitsディレクトリを作成する。
Spriteは後で分割するので画像タイプをMultipleにしておく。
ドット絵なのでFilterはPointのほうがそれっぽく表示される。
![image](https://qiita-image-store.s3.amazonaws.com/0/162289/9bc5bdc8-2cc7-8e26-dcf6-45f665d09ca9.png)

# スプライトを分割する
SpriteEditor→Sliceで6*4に分割する。
![image](https://qiita-image-store.s3.amazonaws.com/0/162289/a7f6f52a-95f3-f7d9-7cc4-21d96bf739de.png)
これでSpriteは以下のように分割される。なお分割されたスプライトは左上をelfsan_0としてから右方向に番号が振られる。
![image](https://qiita-image-store.s3.amazonaws.com/0/162289/d46bfad0-a425-ea83-91a1-51c1a89c154d.png)

# アニメーションを作成する
SpriteRendererとAnimatorから成るオブジェクトを用意する。
![image](https://qiita-image-store.s3.amazonaws.com/0/162289/099b5db6-cd07-a063-29dd-0d8d4dd865fa.png)
アニメーションを作る。
これが各向きでの動作のひな形なので、elfsan_0～2の前向き三種類のみで作成する。
![image](https://qiita-image-store.s3.amazonaws.com/0/162289/56e28363-8b11-6104-d321-d8eac311bdcf.png)

# スクリプトを用意する
DirectionalSpriteという名のスクリプトを作成する。
![image](https://qiita-image-store.s3.amazonaws.com/0/162289/f3caf711-f378-8d15-5c3e-2478735fcde2.png)

あとはさっきのひな形Animationのスプライト名に対して、方向に応じたインデックスを与えるスクリプトを書いて完了。

```C#:DirectionalSprite.cs
using UnityEngine;
public class DirectionalSprite : MonoBehaviour {
    public enum Directions { N = 18, S = 0, E = 12, W = 6, NW = 15, NE = 21, SW = 3, SE = 9}
    //
    public string Name;
    public SpriteRenderer SpriteRenderer;
    public Directions Direction;
    //
    private string _lastSpriteName = "";
    private Sprite[] _subsprites;
    // 
    void Start () {
        SetName(Name);
	}
    void LateUpdate() {
        // 現在のスプライトを得る
        string name = SpriteRenderer.sprite.name;
        // スプライトが変化したか
        if (_lastSpriteName != name) {
            int idx = name.IndexOf('_');
            if (idx >= 0) {
                int id = int.Parse(name.Substring(idx + 1)) + (int)(Direction);
                //
                SpriteRenderer.sprite = _subsprites[id];
            }
            _lastSpriteName = SpriteRenderer.sprite.name;
        }
    }
    //
    public void SetName(string name) {
        Name = name;
        _subsprites = Resources.LoadAll<Sprite>("Units/" + name);
    }
}
```

歩くよ！
![elfsan.gif](https://qiita-image-store.s3.amazonaws.com/0/162289/f621f36a-e7e8-764d-549c-cc76031c00c5.gif)
Webロールで出力したトレースログをWADLogsTableに転送する

#はじめに

Azureクラウドサービスにはトレースログをテーブルに転送機能があります。
この機能で昔から微妙なのが、Webロール内で出力したログについては転送されないことです。

トレースログを転送するリスナーの設定はWeb.Condigに、下記のように書いてあります。

```xml
<system.diagnostics>
  <trace>
    <listeners>
      <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=2.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="AzureDiagnostics" initializeData="603db610-7a5f-4f96-a49a-297659a92795">
        <filter type="" />
      </add>
    </listeners>
  </trace>
</system.diagnostics>
```

ところが、WebロールはIIS上で動いているわけではない（という表現であっているのだろうか）ので、Web.configを読むことができません。
結果的に、リスナーがセットされないために、Webロール内でいくらトレースログを出力してもAzureテーブルには転送されません。

#対応策（Azure SDK 2.4まで）

今さら、Azure SDK 2.4以前のことを書くのも微妙なのですが・・・

2.4までは次のようにOnStart()のDiagnosticMonitorTraceListenr()を追加すれば、Webロールからもトレースログを転送できました。

```csharp
public class WebRole : RoleEntryPoint
{
    public override bool OnStart()
    {
        Trace.Listeners.Add(new Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener());

        // 以下略
    }
}
```

#対応策（Azure SDK 2.5～2.9）

Azure SDK 2.5から、DiagnosticMonitorTraceListenerの基底クラスが以下のように変更になりました。

|Azure SDK | 基底クラス |
|:--------|:-----------------------------------|
|?～2.4 |  System.Diagnostics.TraceListener |
|2.5～2.9 |Microsoft.Cis.Eventing.Listeners.RDEventMonitoringAgentListener|

DiagnosticMonitorTraceListenerはTraceListenerを継承しなくなったので、Azure SDK 2.4までのように単純に追加するわけにはいかなくなりました。

~~TraceListenerを継承する自作クラスでDiagnosticMonitorTraceListenerをラップ作成して・・・~~

というのをAzure SDK 2.9の環境で試しましたが全く転送されず、色々調べて辿りついたのがこの投稿です。

[Adding the trace listener in webroles.cs as the WebRole process is not configured by the web.config - Stack Overflow](http://stackoverflow.com/questions/29071510/adding-the-trace-listener-in-webroles-cs-as-the-webrole-process-is-not-configure/29619124)

単純に、MonAgentListenerをアセンブリ参照に追加すれば、Azure SDK 2.5～2.9でも、同様にトレースリスナーにDiagnosticMonitorTraceListenerを追加することで、Webロール内のトレースログが転送されるようになりました。
Rails 5.0.1 で rails new するとできる Gemfile の git_source ブロックの意味

[ブログ](http://blog.kymmt.com/entry/rails-5.0.1-gemfile)に書いた話をこちらでも共有。

----

Rails 5.0.1 で `rails new` したときに作成される `Gemfile` の先頭に次のブロックが挿入されるようになっていました。

```ruby
git_source(:github) do |repo_name|
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
  "https://github.com/#{repo_name}.git"
end
```

# これの意味

`Gemfile` の中で `:github` オプションをつけた gem について、HTTPS 経由で GitHub から取得します。

`git_source` は [Bundler で定義されているメソッド](https://github.com/bundler/bundler/blob/9f414c55be8b749f46a0470277f14572c5246c03/lib/bundler/dsl.rb#L153) で、引数のオプション（ここでは `:github`）が付いた gem の取得先 URL をブロック内で指定できます。

# やる理由

Bundler が持つ `:github` オプションは Git プロトコルで通信するのでセキュアでなく、さらに Bundler 1.13 以降は `:github` オプションを使っていると警告が出ます。[公式ドキュメント](http://bundler.io/man/gemfile.5.html#GITHUB)でも `:github` オプションを使うのを避けるよう明記してあります。

このコードを入れておくと、HTTPS 経由で GitHub から gem を取得できるので警告が出ずにすみます。ちなみにデフォルトの `Gemfile` では `web-console` が `:github` オプションを使っていますね。Bundler 2.0 ではこの点が対策されるようで、それまでの対処ということです。

入ったプルリクはこちらです。

- [Use secure source for gems referencing "github" in the generated apps by prathamesh-sonpatki · Pull Request #27092 · rails/rails](https://github.com/rails/rails/pull/27092)

# 参考資料

- [bundler 1.13.0でGemfileに`:github`... | 日々雑記](http://y-yagi.tumblr.com/post/150244664010/bundler-1130%E3%81%A7gemfile%E3%81%AB-github)
- [ruby on rails - Meaning of new block "git_source(:github)" in Gemfile - Stack Overflow](http://stackoverflow.com/questions/41454333/meaning-of-new-block-git-sourcegithub-in-gemfile)
脳波でスカートをめくるP-WAVEを開発した話

# 概要
2017年2月4,5日の2日間で[HackDay](http://hackday.jp/)というイベントに参加しました。

このイベントは24時間使って自分たちの好きなものを作るというもので、
そこで我々のチーム(劇団スーパーコンプレックス)は脳波でスカートをめくるツール(P-WAVE)を作りました。

こうゆう笑いのネタになりそうなものを作るのが結構好きで、
今回も思わずこんなわけのわかんないような物を作ってしまいました。

ここでは簡単なプロダクトのご紹介とどうゆう技術を使って作ったのかをご紹介したいと思います。

# プロダクト紹介
* YouTube
 * https://youtu.be/J1mKesuwpcQ
* ニコ動
 * http://www.nicovideo.jp/watch/sm30595904

簡単に説明すると、専用の帽子型デバイスを装着すると脳波から集中力を測定して可視化します。
そして**集中力が高まるとPCの画面上でスカートがめくれる**というものです。

# 技術説明

### 使った技術、デバイス
* MindWave(NeuroSky)
* Bluetooth
* WebSocket
* Swift(アプリ)
* Python(サーバ)
* JavaScript

### システム構成図
<img width="400" alt="構成図.png" src="https://qiita-image-store.s3.amazonaws.com/0/110485/f82aa82e-5b22-8901-7b7e-0d4af8a3682c.png">


### システム説明
MindWaveという脳波を測定するヘッドセットがあるのでそちらを使っています。
これを使うと以下取得する事ができます。

* 集中力
* 瞑想
* デルタ波
* シータ派
* アルファ波
* ベータ派
* ガンマ波

こちらのデバイスはSDKが提供されていてiOS,Android,Mac,WindowsのそれぞれでSDKが提供されています。
→[neurosky store](http://store.neurosky.com/collections/developer-tools-3)

今回はiOS用のSDKを使ってiOSアプリで脳波を取得しました。
(ちなみにiOSのSDKはObjective-Cでドキュメントは全て英語です)
→[iOS SDK](https://github.com/hikarut/MindWave)

参考：[脳波計MindWaveでiOS＆Macアプリ開発。](http://yoichirowatanabe.hatenablog.com/entry/2016/10/02/181837)

iOSで取得した脳波で今回は集中力を使っています。集中力と瞑想は0から100の値で取得できるため、非常に使い勝手が良いです。

その後iOSで取得した集中力をWebSocketでサーバに送信します。アプリはSwiftで開発していたためWebSocketのライブラリは[Starscream](https://github.com/daltoniam/starscream)を使っています。
こんな感じにString型で簡単にSocket通信ができます。これで集中力をサーバに送っています。

```Swift
let socket = WebSocket(url: URL(string: "ws://localhost:8080/")!)

func connect() {
    socket.delegate = self
    socket.connect()
}

func send(string: String) {
    socket.write(string: string)
}

func disconnect() {
    socket.disconnect()
}
```
MindWaveのSDKを使って脳波をWebSocketで送るアプリはGitHubにも公開しているのでご参考ください
→[PWave](https://github.com/hikarut/PWave)

サーバでは単純にWebSocketでiOSアプリから集中力のデータを受け取っています。ちなみに今回サーバはPythonを使っています。
(**Pythonを使っている理由は特にありません。笑 何となくいつもと違う環境でという事で使っています**)

そしてブラウザにもWebSocketで集中力を送っています。0.1秒ごとにデータを送っており、ある一定の閾値まで集中力が高まると内部データがインクリメントされ、下がるとデクリメントされるような仕組みになっています。
その内部データの値によって表示する画像をリアルタイムに変化させ、動画のように画像を表示させてスカートがめくれるような見せ方を表現しています。

全体的なシステム構成はざっとこんな感じです。
正直そんなに難しいことはやってないですが、それでも脳波でスカートをめくるという割とインパクトのあるものができたと思います。

# 感想
システム構成でも説明しましたが、そんなに難しいことはやってないのでこれくらいであれば割と簡単に実装できます。今回のHackDayは自分を含めエンジニア3人で、アプリ担当(自分)、サーバ担当、クライアント担当で分けましたが、自分担当のアプリ部分は5,6時間で全て完了して正直時間を持て余してしまいました。。(開発時間は24時間あるので。。)なので本来であればもっと凝った事をやるべきだったなと若干の反省はあります。ただこういったHackDayのような限られた時間でプロダクトを作る場では、確実に動く物を作るのが重要だったりするのでとりあえずはちゃんと動くものが作れてよかったです。他にも学生を含め系85チーム参加していましたがどのチームも凄い技術力とプロダクトで非常に良い刺激もありました。
また次回もあればテクノロジーでスカートをめくりたいと思います。

# 参考
[クリエイターフェス Hack Day 2017 - ステージ全編 ](https://www.youtube.com/watch?v=oJKTYEJkasU)
TidalCyclesの録音を行う

# はじめに
TidalCyclesを演奏しながら、録音するということを行いました。OSXでイヤホンつけながらやってます。
[こちらの記事](http://qiita.com/dropcontrol/items/854c1ddbc53403045c2a)を参考にさせていただきました。
なお、サウンド周りよくわからず、なぜこれでできるようになったのかがよくわかっていないです。。
用いたのはSuperCollider,Atomの他に、Soundflower、LadioCast、QuickTimeです。

# フロー
1. SuperCollider,Atomを一度閉じる。
2. 開いたらSuperCollider上で`ServerOptions.new.outDevice = “Soundflower (2ch)”;`により出力先を設定する
3. Macのサウンドの出力と入力を共にSoundflower (2ch)にする。
4. LadioCastのミキサーから入力1にSoundflower (2ch)、出力メインに内蔵出力を設定。
5. SuperCollider上で`SuperDirt.start;`し、Atomで音を鳴らす。
6. QuickTimeで新規オーディオ収録を開く。録音ボタン横のvからマイクをSoundflower (2ch)に設定。
7. QuickTimeで録音を行う。

# 音量調整
録音した音源の音が小さいように感じるので、サウンドなどで調整が必要なのかも、と思い調整したところ、
1. サウンドの入力を最大音量にして、
2. LadioCastの出力メインで聴きやすい音量に調整する
と、大きな音で録音できるようでした。


ありがとうございました。なお[自ブログの転載](https://medium.com/music-and-technology/tidalcycles%E3%81%AE%E9%8C%B2%E9%9F%B3%E3%82%92%E3%81%99%E3%82%8B-fe9ef403e96e#.d0dxnb3wm)です。
ファイル名を指定してssh認証鍵を作成する

幾つかのVPSサービスを借りて、sshの鍵を使い分けたいことってありませんか。僕はあります。
（ぶっちゃけどの鍵を使っているか忘れました…）
いつもやり方（とコマンドの意味）を忘れるので備忘として記録を残しておきます。

### コマンド

名前をつけて鍵を作成する

```
ssh-keygen -t rsa -f <id_rsa_file_name>

-t 鍵の種類を指定
-f ファイル名を指定
```

作成された鍵の確認

```
ls -al

<id_rsa_file_name> #秘密鍵
<id_rsa_file_name.pub> #公開鍵
```

### 解説

- ファイル名を指定しない場合は、id_rsaとなる（上書きされるので注意）
- ファイル名を指定した場合は、カレントディレクトリ上に生成される（なので ~/.ssh/で作業したら良い）
- 秘密鍵をAWSやさくらVPSにアップしよう
Gestures for Google Chrome で 現在のタブに指定URLを開く

Google Chromeのアドオン「Gestures for Google Chrome」で
開いているタブの上に好きなサイトを開くJavaScriptと
設定方法を記載します。

①Gestureアドオンのオプション＞Actionsタブ
上記のページを開いて「Action:」のプルダウンから
「...のスクリプトを実行」を選択。

②「NAME:」に好きなタイトルを入力。

③以下のスクリプトをコピーして「JavaScript:」に入力し
■ ～ ■までの部分に開きたいURLを入力する。

```js
window.location.href = "■ここに開きたいURLを入力■" ;
```

【例】googleを開きたかったら...
window.location.href = "https://www.google.co.jp/" ;
Playbook実行時に変数の入力をさせるvars_prompt

<!---


--->

AnsibleのPlaybookを作成して実行していると実行前になんらかの変数を入力させたいことがあります。`vars_prompt`を使うと実現できます。


```YAML:playbook.yml
- name: Test
  hosts: localhost
  vars_prompt:
    - name: "input_var"
      prompt: "INPUT: "
      confirm: no
      private: no
      default: "fish"
  tasks:
    - debug: msg="{{ input_var }}"

```

beefを指定してみます。

```
$ .venv/bin/ansible-playbook playbook.yml
 [WARNING]: Host file not found: /etc/ansible/hosts

 [WARNING]: provided hosts list is empty, only localhost is available

INPUT:  [fish]: beef
 _____________
< PLAY [Test] >
 -------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/                ||----w |
                ||     ||

 ______________
< TASK [setup] >
 --------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/                ||----w |
                ||     ||

ok: [localhost]
 ______________
< TASK [debug] >
 --------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/                ||----w |
                ||     ||

ok: [localhost] => {
    "msg": "beef"
}
 ____________
< PLAY RECAP >
 ------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/                ||----w |
                ||     ||

localhost                  : ok=2    changed=0    unreachable=0    failed=0

```

指定せずにENTERを押すとデフォルト値が使われます。

```
$ .venv/bin/ansible-playbook playbook.yml
 [WARNING]: Host file not found: /etc/ansible/hosts

 [WARNING]: provided hosts list is empty, only localhost is available

INPUT:  [fish]:
 _____________
< PLAY [Test] >
 -------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/                ||----w |
                ||     ||

 ______________
< TASK [setup] >
 --------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/                ||----w |
                ||     ||

ok: [localhost]
 ______________
< TASK [debug] >
 --------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/                ||----w |
                ||     ||

ok: [localhost] => {
    "msg": "fish"
}
 ____________
< PLAY RECAP >
 ------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/                ||----w |
                ||     ||

localhost                  : ok=2    changed=0    unreachable=0    failed=0
```
Swift: 動画再生


#Frameworks追加
<img width="740" alt="スクリーンショット 2017-03-01 23.30.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/108475/0f8ec186-556a-3ed0-6b06-874daa9c1b91.png">

#ソース追加
```ruby:qiita.rb
import UIKit
import AVFoundation
import AVKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let path = Bundle.main.path(forResource: "movie.mp4", ofType: nil)
        
        let player = AVPlayer(url: URL(fileURLWithPath:path!))
        let playerController = AVPlayerViewController()
        
        playerController.player = player
        self.addChildViewController(playerController)
        self.view.addSubview(playerController.view)
        playerController.view.frame = self.view.frame
        player.play()
    }

}


```
CSSでボタンのアクセシビリティを向上させる方法(追記有り)

レイアウトを整える事が本来の目的であるCSSですが、このCSSでボタンにおけるイケてない点を解決して、ユーザーのアクセシビリティの向上を図ります。

## イケてないポイント1 (テキスト選択編)
iOSやAndroid等のスマートフォンでボタンを押下しようとした時に、ボタン内のテキストが選択できてしまう問題。
次ページへのリンクであるならまだしも、登録や予約に関するボタンであった場合、コンバージョンやユーザー体験において悪影響を及ぼす影響がある。イケてない。
![名称未設定2.png](https://qiita-image-store.s3.amazonaws.com/0/48027/492fcb4b-e110-e982-2c9d-9046ac9d5df9.png)

## 解決策
対象のボタンに対して`user-select: none`を指定する事でユーザーがテキストの選択をできないようにする事ができる。

``` css:css
.btn {
  -moz-user-select: none;
  -webkit-user-select: none;
  -ms-user-select: none;
  user-select: none;
}
```

`user-select: none`はテキストのみならず画像に対しても有効である為、不用意に画像の保存をさせたくない場合に設定して対処する事ができる。

## イケてないポイント2 (ポップアップメニュー編)
スマートフォンでボタンを押下しようとした際に誤って長押しをしてしまい、ポップアップメニューが表示されてしまう問題。
課題1と同様に、コンバージョンやユーザー体験において悪影響を及ぼす影響がある。できることなら誤って長押ししても何も起こらないように変更したい。イケてない。
![名称未設定3.png](https://qiita-image-store.s3.amazonaws.com/0/48027/f148c946-e9f6-81ef-2d17-3f20c3544ac0.png)

## 解決策
対象のボタンに対して`-webkit-touch-callout: none`を指定する事でポップアップメニューを出さないように設定する事ができる。`-webkit-touch-callout`はChrome及びSafariの独自仕様である為、使用の際にはベンダープレフィックスが必要となる。

``` css:css
.btn {
  -webkit-touch-callout: none;
}
```

## 上記2つの問題に汎用的に立ち向かう
私はユニバーサルセレクタやa, button等の要素セレクタで選択やメニューの表示を一括拒否指定するのは、必要な部分までコピーをできなくさせてしまう為にあまり良くない解決方法だと考えています。
そこで自身は解決策1, 2をまとめてmixin化して対処しています。mixin化をして、必要な部分のみでmixinをincludeする事で汎用性やメンテナブルに富んだ解決ができると考えて実践しています。

``` scss:scss
@mixin selectNone {
  //選択制御
  -moz-user-select: none;
  -webkit-user-select: none;
  -ms-user-select: none;
  user-select: none;

  //ポップアップメニュー表示制御
   -webkit-touch-callout: none;
}
```

上記のボタンの挙動やmixinは下記のリンクから確認する事ができます。
[CodePen - サンプル](http://codepen.io/oreo/pen/XMXmOK)

## 終わりに
記事を書いている中での気づきとして、Qiita内の「いいねボタン」等のボタンではちゃんと`user-select: none`が指定されていました。流石ですね。
これまで自分自身がSPレイアウトのアクセシビリティをいかに疎かにしているかを執筆を通して思い知りました。webサービスやwebアプリケーションではユーザーの体験をより良い物にする為に特に重点的に気を配って上記の問題に対処したいと思います。

## 追記(2017年3月16日)
当記事を投稿してから2週間が経過しました。この期間で多くの方に当記事を拝読して頂くと共に100件以上の「いいね」をいただきました。本当にありがとうございます。

当記事を執筆した経緯と致しましては、私が作成したプロダクトをユーザーに使用していただいた際にユーザーがボタンをタップしようとしたとき、ボタン内の文字列をコピーできてしまう等の問題が何度も起こり、それを自身が悪い体験と認知し、当記事の方法で無理やり解決をしたという出来事がありました。
少数のユーザー間でのみ起こりうるかもしれない問題を解決する為に、全ユーザーに対して実装サイドがブラウザの「機能を制約」する事は間違っていると心の片隅で思っていたものの、その点を考慮せずに記事を執筆し公開してしまった事、そしてアクセシビリティに対して知識が浅いのにも関わらず記事のタイトルに「アクセシビリティ」という単語を使用をして皆様に混乱を生じさせてしまった事は大変申し訳無いと思っております。

SNS上でも「これはアクセシビリティではなくユーザビリティじゃないの？」「問題を解消する為に機能を制約するのは間違ってるよね？」「制約を設ける事で逆にユーザーの体験を阻害してるよね？」等々の意見を初め、多数の厳しい意見を頂戴致しました。どのご意見も至極真っ当な物ばかりでとても勉強になりました。貴重なご意見をpostして下さった方々にも御礼を申し上げます。

多くの意見の中でも特に、@kazuhito_kidachiさんがブログにて当記事のアンサーのような記事を執筆してくださったのでリンクと共に紹介をさせて頂きます。(本人許可済)
当記事の問題点やアクセシビリティの在り方について丁寧に記述されていてとても参考になりました。この記事と合わせて多くの方に読んでいただければと思いますのでどうぞよろしくお願い致します。
[Re: CSSでボタンのアクセシビリティを向上させる方法 | 覚え書き | @kazuhito ](http://kidachi.kazuhi.to/blog/archives/039369.html)

他にもアクセシビリティ、ユーザビリティについてご意見をお持ちの方は大歓迎ですので下記のコメント欄にてご教授を頂けるととても嬉しいです。また、件のユーザーが引き起こした問題に対しての解決策や良いアプローチがありましたら同じくコメント欄にて記述をよろしくお願い致します。自身の力で解決策を見つけることができた際には改めて記事を投稿したいと考えております。

最後になりますが、この記事を投稿した事によって頂いたフィードバックや得た知見を元にアクセシビリティやユーザビリティ、CSS、ブラウザ等について更なる理解を深めるべく、学習に精進して参りますので今後共どうぞよろしくお願い致します。
PHP5.2→5.6へのアップデート手順


タイトルの件を実行した手順メモ。
今の時代だと無さそうな環境です。
さすがに新たに環境作るならCentOSもPHPも7以上ですね。

##環境
CentOS 5系
PHP　5.2.x

##手順
現在入っているphp関連をメモして、リポジトリも追加します。


```bash:version確認
#rpm -qa | grep php
```

```bash:リポジトリ確認
#rpm -qa | grep epel
#rpm -qa | grep remi
```


```bash:存在する場合はそれを使用するか。削除して入れ直す。以下削除。
#rpm -e --test epel-release-xxx-xxx.noarch

#rpm -e epel-release-xxx-xxx.noarch
#rpm -e remi-release-xxx-xxx.elxxx.remi.noarch
```


```bash:リポジトリ取得(5系のもの)
#rpm -ivh http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
#rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
```

リポジトリ追加が完了すると、/etc/yum.repos.d/以下にremi.repoとeple.repoという設定ファイルが生成されます。
この設定ファイル内で、デフォルトのインストールではRemiとEPELが無効になるように、「enabled=0」となっていることを確認します。

```bash:提供されているパッケージ確認
#yum list --enablerepo=remi-php56 |grep php
```

PHPのアンインストール＋インストールを実施していきます。

```bash:php関連アンインストール
#yum remove php*
```

```bash:phpインストール
#yum install php php-common --enablerepo=remi-php56
```

怒られます。

```bash:error
php-common-5.6.30-1.el5.remi.i386 from remi-php56 has depsolving problems
  --> Missing Dependency: libcurl.so.4 is needed by package php-common-5.6.30-1.el5.remi.i386 (remi-php56)
```

libcurl.so.4 が存在しないようですのでインストールします。

```bash:
#yum list --enablerepo=epel,remi,remi-php56 | grep libcurl
#yum --enablerepo=remi install libcurl
```

再度実行しますが怒られます。

```bash:error
php-cli-5.6.30-1.el5.remi.i386 from remi-php56 has depsolving problems
  --> Missing Dependency: libedit.so.0 is needed by package php-cli-5.6.30-1.el5.remi.i386 (remi-php56)
```

libedit.so.0 が存在しないようですのでインストールします。

```bash:
#yum list --enablerepo=epel,remi,remi-php56 | grep libedit
#yum --enablerepo=epel install libedit
```

再度実行して問題がなかったので、
最初にメモした関連パッケージのインストール

```bash:
#yum install php-mysqlnd php-mysql php-gd php-mbstring php-pdo php-odbc php-xml #php-pear php-devel php-mcrypt --enablerepo=remi,remi-php56
```

またまた怒られる

```bash:error
php-gd-5.6.30-1.el5.remi.i386 from remi-php56 has depsolving problems
  --> Missing Dependency: libt1.so.5 is needed by package php-gd-5.6.30-1.el5.remi.i386 (remi-php56)
```

libt1.so.5 が存在しないようですのでインストールします。

```bash:
#yum list --enablerepo=epel,remi,remi-php56 | grep t1lib
#yum --enablerepo=epel,remi,remi-php56 install t1lib
```

再度実行して問題がなかったのでphpのバージョン確認して5.6にアップデートされていることを確認します。

```bash:
#php -v
```

最後にapache起動

```bash:
#/etc/init.d/httpd configtest
#/etc/init.d/httpd start
```

以上。

###参考URL
yumリポジトリ一追加リスト 完全版
http://qiita.com/bezeklik/items/9766003c19f9664602fe
Fish Shell で、C-M-hを単語削除にキーバインド

BashやZshだと、デフォルトでEmacsっぽいキーバインドになっており、中でも`C-M-h`による単語削除は重宝した。

Fishだとデフォルトで`M-Backspace`に割り当てられているが、Backspaceは遠いのとBashで慣れていることもあり、キーバインドを追加した。

```lua:~/.config/fish/config.fish
function fish_user_key_bindings
  bind \e\ch backward-kill-word
end
```

参考 

- https://github.com/fish-shell/fish-shell/issues/1047
- https://github.com/fish-shell/fish-shell/blob/master/doc_src/bind.txt#L73
MacでRuby×Seleniumを使って自動ブラウジング

## Seleniumって何？
[Selenium公式サイト](http://docs.seleniumhq.org/)
Seleniumは、ブラウザ操作を自動でやってくれるものです。本来は、WebUIのテストツールとして使うもの（らしい...）


## Seleniumを使うために必要な準備
Seleniumを使うために必要な準備は主に２つ！

 1. Selenium本体 
 2. 使用するブラウザのドライバ

環境は「Mac」、言語は「Ruby」,ブラウザは「Chrome」の場合は以下の手順。

### Selenium本体のインストール
Rubyが入っていればgemで一発です。

`sudo gem install selenium-webdriver`

※ Rubyのバージョンが古いと、うまくインストールできないことがあるようです。。（[参考先](http://gabekore.org/mac-default-ruby-problem)）

### 各種ブラウザのドライバインストール
こちらもHomebrewでイッパツです。 
`brew install chromedriver`

## 実行してみる
以下の`selenium_test.rb`で実行できたらOK！

```selenium_test.rb
# -*- coding: utf-8 -*-
require 'selenium-webdriver'

driver = Selenium::WebDriver.for :chrome #ドライバ選択
driver.navigate.to "http://www.yahoo.co.jp/" #移動サイト指定
puts driver.title #タイトルを出力

# meta descriptionを取ってくる場合
element = driver.find_element(:name, 'description') #セレクタ指定
puts element.attribute('content') #出力

driver.quit #ブラウザを閉じる

```

実行するとこんな感じ↓

```
$ ruby selenium_test.rb                                                                               
Yahoo! JAPAN
日本最大級のポータルサイト。検索、オークション、ニュース、天気、スポーツ、メール、ショッピングなど多数のサービスを展開。あなたの生活をより豊かにする「課題解決エンジン」を目指していきます。
```

これだけで簡単なクローリングならできそう。nokogiriも組み合わせて使うとかなり便利！


## お世話になったサイト
[WebのUIテスト自動化 - Seleniumを使ってみる](http://qiita.com/edo_m18/items/ba7d8a95818e9c0552d9)
[Macの初期Rubyは罠かよ・・・](http://gabekore.org/mac-default-ruby-problem)
[RubyでSeleniumを使ってスクレイピング](http://qiita.com/tomerun/items/9cb81d7a98150ff22f53)
[Webブラウザの自動操作 (Selenium with Rubyの実例集)](https://www.qoosky.io/techs/71dd2d67ea)