OmniAICreator/Qiita-1.07M huggingface dataset:
netlib-java breezeで行列計算する


リコメンドエンジンの仕事で行列の内積を取る必要があったのでざっと触ったのでメモ。

やりたいことは以下のイメージです。

```math
\begin{pmatrix}
1.0 & 2.0 & 3.0 \\
4.0 & 5.0 & 6.0
\end{pmatrix}

\times

\begin{pmatrix}
1.0 \\
2.0 \\
3.0 
\end{pmatrix}

=

\begin{pmatrix}
14.0 \\
32.0 \\
\end{pmatrix}

```


※以下では楽なのでscalaで書いていますが、僕は仕事では、がっつりチューニングしたい＆他ロジックとの兼ね合いでjavaで書いています。

## breeze

下記のような感じで書くと、

```scala
val matrix_A = DenseMatrix(Array(1.0, 2.0, 3.0), Array(4.0, 5.0, 6.0))
println("matrix_A")
println(matrix_A)
val vector_B = DenseMatrix(Array(1.0), Array(2.0), Array(3.0))
println("\nvector_B")
println(vector_B)
val result = matrix_A * vector_B
println("\nresult")
println(result)
```

このような出力をしてくれます。

```
matrix_A
1.0  2.0  3.0  
4.0  5.0  6.0  

vector_B
1.0  
2.0  
3.0  

result
14.0  
32.0 
```


### netlib.ddot

下記のような感じで書くと、

```scala
val blas: BLAS = BLAS.getInstance

val (a, b) = makeRandomMatrixAndVector(10, 3)

val vector_A = Array(1.0, 2.0, 3.0)
println("vector_A")
println(vector_A.toSeq.mkString(","))

val vector_B = Array(4.0, 5.0, 6.0)
println("\nvector_B")
println(vector_B.toSeq.mkString(","))

val dotProduct = blas.ddot(vector_A.length, vector_A, 1, vector_B, 1)
println("\ndotProduct")
println(dotProduct)
```

このように出力してくれます。

```
vector_A
1.0,2.0,3.0

vector_B
4.0,5.0,6.0

dotProduct
32.0
```

## netlib.dgemv

以下のように書くと、

```scala
val blas: BLAS = BLAS.getInstance

val m = 3
val n = 2

val matrix_A = new Array[Double](m* n)

matrix_A(0)=1; matrix_A(3)=2
matrix_A(1)=0; matrix_A(4)=2
matrix_A(2)=3; matrix_A(5)=3

val vector_B = new Array[Double](n)
vector_B(0)=1
vector_B(1)=2

//結果は返り値でなくここに格納される
val result = new Array[Double](m)

blas.dgemv("N", m, n, 1.0, matrix_A, m, vector_B, 1, 0.0, result, 1)

println("\nresult")
result.foreach(println)
```

このように出力します。

```
result
5.0
4.0
9.0
```

## パフォーマンス

（Cモジュール導入は、デプロイ面倒なのでまだやってません）

ソースコードを雑に置いています。
https://github.com/uryyyyyyy/matrixVectorSample

あまりチューニングできていませんが、僕の仕事の箇所でいうとnetlibとbreezeの差よりも、

- 前後の処理の計算量のオーダー
- 無駄なオブジェクト生成によるメモリ消費（GCタイミング）
- double値などプリミティブ型のboxing/unboxingコスト

が支配的でした。プロダクトによって自然な形で取り入れられる形のものを使うのが良さそうです。（Javaの方がチューニングしやすいかなって個人的には思います。）

現場からは以上です。
GitHubのReview機能が強化された

[株式会社オズビジョン](http://www.oz-vision.co.jp/)の@terra_yuccoです。

本日、いつものように貯まっているPull Requestを見ようとGitHubの画面を見たところ、
Discussionの見え方が違い「？」と思っていました。
そこでチームメンバーから「GitHubのレビュー機能がめっちゃパワーアップしました。」と
共有されたGitHubのリリースノート？を読んだので、Tipsを共有します。

# Tips
- Pull Requestに対して、総評という形でReviewを書けるようになった
    - Reviewには以下の種別を付けられる
        - Comment: 軽微な指摘、コメント
        - Approve: 承認
        - Request Change: 修正依頼
    - Request Changeが付いたPull Requestは、AdminもしくはRepository Owner以外は、<br>修正しないとMergeできない
- Pull Requestに対して、Reviewを必須にできる
    - 必須にした場合、ReviewがないPull RequestはMergeできなくなる

# まず感じたこと
- レビュー必須！ってできない空気を打破するのにすごくありがたい
- 今まで、単純にアカウント管理のためなどにAdminを置いていた場合、その運用がまた変わりそう
- レビューステータスは順に「見たよ」「イイネ」「ダメ」ってことっぽい

# 気づきの追記
- 自分一人で試していると気づかなかったのですが、この機能をONにすると、従来のラインコメントは「Pending」となり、Review側に「Comment」「Approve」「Request Change」のどれかをつけてFixしないと見えないようです。【2016-09-17】
    - 「Start a review」ではなく、「Add single comment」で、従来のラインコメントを書けます。【2016-09-23】![image](https://qiita-image-store.s3.amazonaws.com/0/95030/78e2d8b5-cf91-855f-05de-cd94159d5e04.png)
- 総評のレビューコメントは今のところ編集ができなさそうです。誤字怖い。【2016-09-23】![image](https://qiita-image-store.s3.amazonaws.com/0/95030/8c5aa5b9-eeba-bf6d-44db-2357c1446f7a.png)

# 今弊社でどのように運用しているか【2016-10-14追記】
たくさんのストックをいただいているので、お礼も兼ねて、現在の弊社での運用を紹介します。
オズビジョンでは、メイン事業として **[ハピタス(PC)](http://hapitas.jp/)**, **[ハピタス(SP)](http://sp.hapitas.jp/)** を運営しています。それぞれWebとAPIでリポジトリを分けているため、GitHub上には上記プロダクトに直接関わるリポジトリが5個存在しています。(構成の是非は置いておき、PC用Web、SP用Web、PC用旧API、SP用旧API、統合API。その他管理画面や裏のworker処理などもありますが割愛)
現状は、ユーザに一番影響する箇所、及び自分たちの品質改善を強く進めたい箇所、という意図を込めて以下のリポジトリをReview必須にしています。

- PC用Web
- SP用Web
- 統合API


# [About pull request reviews](https://help.github.com/articles/about-pull-request-reviews/) の自分用和訳
## Pull Request Reviewについて
Pull RequestがOpenされたら、閲覧権限を持っているユーザは提案されている変更に対してレビューを行い、コメントを付けることができます。レビューはその変更へのディスカッションを可能にします。また、その変更がリポジトリの「貢献の仕方」やその他の品質ガイドラインに沿ったものであることを担保する助けになります。
レビューには3つのステータスを設定できます。

- Comment: その変更を否定するものでも改善を要求するものでもない、一般的なフィードバック
- Approve: Pull Requestに対してマージを承認するフィードバック
- Request changes: Pull Requestをマージする前に修正しなければならないフィードバック

```
Tips:
もし「required reviews」が有効になっており、
変更・管理者・オーナー権限を持った協働作業者がレビューで「Request changes」を付けた場合、
そのPull Requestは、同じ協働作業者が別のレビューで「Approve」としてくれるまでマージできなくなります。
リポジトリのオーナー及び管理者は、「Approve」のレビューを受けていなくてもPull Requestをマージできます。
また、「Request changes」を付けたレビューアがOrganizationを去っていたり、無効な場合もマージできます。
```

Pull Requestに付いているレビューが全て、Conversation timelineで閲覧可能です。また、リポジトリのオーナー及び協働作業者からのレビューは、Pull RequestのMerge Boxで確認できます。

## レビューを必須にする
リポジトリの管理者は、保護されたブランチに対して、少なくとも一つの「Approve」なレビューを受けていないと全てのPull Requestがマージできないように設定することができます。既に存在しているPull Requestに変更が要求されている場合、保護されたブランチ上に「required reviews」の設定をすることはできません。
より詳細な情報は、[About required reviews for pull requests](https://help.github.com/articles/about-required-reviews-for-pull-requests)を参照してください。


おしまい。

----
# 記事シェア
より総合的かつ網羅的な解説がThinkIT内にありましたので、参考までにリンクを追加しておきます。
- [Protected Branches機能で柔軟なワークフローを構築する](https://thinkit.co.jp/article/8425)
CloudFunctions  GCSをトリガーとして処理を行う

下記ページに記載されているとおり、CloudFunctionsを使用して、GCSバケットにファイルがアップロードされたタイミングで何かしらの処理（このサンプルではHelloを出力）を実行できることを確認する。
https://cloud.google.com/functions/docs/tutorials/storage

実行環境：GCP CloudShell

### CloudFunctionsファイルをステージングするためのバケット(stg-bucket)を作成する。

```
gsutil mb gs://[YOUR_STAGING_BUCKET_NAME]
```

### テストファイルをアップロードするようのバケットを作成する。

```
gsutil mb gs://[YOUR_UPLOAD_BUCKET_NAME]
```

### CloudFunctionで動かすアプリを作成する。以下のようなindex.jsを作成し、gcf_gcsディク取り配下へ格納。
※今のところNode.jsのみ対応しているようである。

```index.js
exports.helloGCS = function helloGCS (context, data) {
  console.log('Hello ' + (data.name || 'World') + '!');
  context.success();
};
```
helloGCS機能がモジュールによってエクスポートされ、オブジェクトがバケットに置かれたときや削除されたとき変更されたときに実行される。 

### Functionのデプロイ
helloGCSをデプロイするために、以下のコマンドを実行する。

```
$ gcloud alpha functions deploy helloGCS --stage-bucket [YOUR_STAGING_BUCKET_NAME] --trigger-bucket [YOUR_UPLOAD_BUCKET_NAME]
Copying file:///tmp/tmp5yFWM3/fun.zip [Content-Type=application/zip]...
/ [1 files][  228.0 B/  228.0 B]                                                
Operation completed over 1 objects/228.0 B.                                      
Waiting for operation to finish...done.                                                                           
entryPoint: helloGCS
gcsUrl: gs://XXX/us-central1-helloGCS-cexwsseavivw.zip
latestOperation: operation-f6344ff5-a52f-4cde-9fac-9dee65260d7a
name: projects/XXXX/regions/us-central1/functions/helloGCS
status: READY
timeout: 60.000s
triggers:
- gsUri: gs://[YOUR_UPLOAD_BUCKET_NAME]/
```

最初試したときはデプロイ時にエラーが発生。原因はアップロード対象のバケットのACLにAPI Service AccountがOwner権限で登録されてないことが原因。※Writer権限でもエラーになった。

### Functionをトリガーして動作を確認する
ファイルを監視対象のバケットにアップロードする。
```
$ gsutil cp gcf-test.txt gs://[YOUR_UPLOAD_BUCKET_NAME]
```

以下のコマンドでログを確認し、正常に動作していることを確認。

```
$ gcloud alpha functions logs read --limit 50
LEVEL  NAME      EXECUTION_ID    TIME_UTC                 LOG
D      helloGCS  44802410907906  2016-09-14 08:22:32.245  User function triggered, starting execution
I      helloGCS  44802410907906  2016-09-14 08:22:32.564  Hello gcf-test.txt!
D      helloGCS  44802410907906  2016-09-14 08:22:32.657  Execution took 412 ms, user function completed successfully
```
AlamofireでRequest Headerに AccessTokenなどを設定してGETで通信して、Rails4.x でそれらを受け取る

忘れていたので、復習の意味でメモ。

# AlamofireでCustom HeadersでGET
```swift
let URL = NSURL(string: "https://onedari.please")!
let mutableURLRequest = NSMutableURLRequest(URL: URL)
let message = "tabetai"
mutableURLRequest.HTTPMethod = "GET"
mutableURLRequest.setValue(message, forHTTPHeaderField: "Oniku")
let manager = Alamofire.Manager.sharedInstance

manager.request(mutableURLRequest)
  .response { request, response, data, error in
            }
.
.
.
```

# Rails4でHeaderの要素を受け取る

```rb
request.headers["Oniku"]
```
ウェブアクセシビリティ：チェックリスト

ここに貼っておけば、毎回探さなくて済むので置いておきます。
ご自由にご活用ください。
# チェックリスト
https://docs.google.com/spreadsheets/d/1-tYZGDFj0B84K3KcLIZpc6dnfzuSiB2y9flaXi2ZU-0/edit?usp=sharing

### こちらの方も読んでみると良いです
[ゼロから始めるWeb Accessibility入門：概要](http://qiita.com/toshinori/items/d5c81131aadc9610c36a "ゼロから始めるWeb Accessibility入門：概要")
XCode8に移行した際にしたこと（その場しのぎ編）

XCode 8に移行した際、Swiftプロジェクトでトラブったのでその場しのぎ的な対応ですが残しておきます。

問題点
-
まず、大きな問題(?)として、以下のことが挙げられます。

1. Swift 2.3 プロジェクトとSwift 3 プロジェクトは混在できない。
2. iOS 10 SDKで 破壊的変更がある（定数名の変更やオプショナル型の変更だったり）

次に、CocoaPodsでライブラリを管理しているのですが、現在、Swift 2.3で書かれたものが多いです。
Swift 3にマイグレーションせずに使用する場合、1から、自身のプロジェクトはSwift 2.3である必要があります。
Swift 3で書かれたライブラリはSwift2.3時代のバージョンを指定して使用する必要があります。
ただ、2のことから、Swift2.3ライブラリであっても、一部修正が発生する可能性があります。

ビルドを通すまでにしたこと
-
1. 自身のプロジェクトのSwiftのバージョンを2.3にする。
　Targets -> (プロジェクト名) -> Use Legacy Swift Launguage Version を Yesにする。

2. latestバージョンがSwift 3で書かれていると分かるライブラリはSwift2.3で書かれたバージョンを指定する。
3. Podfileの最後に以下の記述をして、自動的に各ライブラリがSwift 2.3でビルドされるようにする。

    ```
    post_install do |installer|
      installer.pods_project.targets.each do |target|
          target.build_configurations.each do |config|
              config.build_settings['SWIFT_VERSION'] = '2.3'
          end
       end
    end
    ```
4. pod installする。
5. ビルドする。
6. iOS 10 SDKに対応するため、ライブラリのコードを修正する。

最後に
-
ライブラリのコードを直接修正するのは避けたいですが、その場しのぎということで。
当面はSwift 2.3なんですかね。
hubot: slackbot を supervisord で動かす


- [Running Hubot in Production](http://www.forest-technologies.co.uk/blog/running-hubot-in-production)

- /etc/supervisord/conf.d/slackbot.conf

~~~ini
[program:slackbot]
directory=/home/system/projects/slackbot
user=system
command=/home/system/projects/slackbot/bin/hubot --adapter slack
autostart=true
autorestart=true
stdout_logfile=syslog
stderr_logfile=syslog
numprocs=1
startsecs=10
stopwaitsecs = 600
killasgroup=true    
environment=
   PATH="/home/system/.anyenv/envs/ndenv/shims:%(ENV_PATH)s",
   HUBOT_SLACK_TOKEN="xoxb-999999999-aaaaaaaaaaaaaa",
   HUBOT_CHATWORK_ROOMS="C1WS6EUA4",
~~~

~~~bash
$ sudo supervisorctl update
$ sudo supervisorctl status
slackbot                         RUNNING    pid 16715, uptime 0:04:25
~~~
２次元配列のソート

```php
$array = [
    ['id' => 10, 'name' => 'hoge'],
    ['id' =>  3, 'name' => 'fuga'],
    ['id' => 20, 'name' => 'foo' ],
    ['id' =>  1, 'name' => 'bar' ],
];
array_multisort(array_column($array, 'id'), $array);
```

コレ最強

mpyw様 コピペでごめんなさい、自分用に保存しておきたかったので…
http://qiita.com/tadasuke/items/e7be0d214e02105ab6d8 のコメント欄から
CakePHP 1.3 最新ダウンロード

いつなくなるかわからないけども1.3系の最新版のダウンロード先
https://github.com/cakephp/cakephp/archive/1.3.21.zip

2015年11月1日に発表されていますが、1.3.21がほぼ最終版だと思われます。
http://bakery.cakephp.org/2015/11/01/cakephp_1_3_21_released.html
http://bakery.cakephp-users.jp/2015/11/01/cakephp_1_3_21_released/

いまだに1.3系の呪縛にとらわれている現場の助けになれば。
環境変数設定_cmd

```ruby
C:\>set
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files
ProgramFiles(x86)=C:\Program Files (x86)
etc...
```
setとだけ打つ・・・現在設定されている環境変数の一覧が表示される。
<br>
<br>

```ruby
C:\>set YASEINOA=C:\Temp\yaseinoa
```
set 変数名=変数に格納したい値
**※setコマンドだと一時的に保存される為、コマンドプロンプトを閉じると設定が消える**
<br>
<br>

```ruby
C:\>setx /M YASEINOA C:\Temp\yaseinoa
```

システムsetxコマンドで設定する。
/Mオプション・・・変数をシステム全体 (HKEY_LOCAL_MACHINE)の環境で設定することを指定します。既定では、HKEY_CURRENT_USER 環境で変数を設定するように設定されています。(cmdHelpより)
kintone イベント別Promiseサポート状況

#kintone イベント別のPromiseサポート状況をまとめました。

2017/7/11時点

|No.|	pc	|	Promise	|	mobile	|	Promise	|
|-------:|:------------------------------|	:-:	|:------------------|	:-:	|
|	1	|	app.record.index.show	|	-	|	mobile.app.record.index.show	|	-	|
|	2	|	app.record.index.edit.submit	|	○	|	-	|	-	|
|	3	|	app.record.index.edit.submit.success	|	○	|	-	|	-	|
|	4	|	app.record.index.edit.show	|	-	|	-	|	-	|
|	5	|	app.record.index.edit.change.<フィールドコード>	|	-	|	-	|	-	|
|	6	|	app.record.index.delete.submit	|	○	|	-	|	-	|
|	7	|	app.record.detail.show	|	-	|	mobile.app.record.detail.show	|	-	|
|	8	|	app.record.detail.delete.submit	|	○	|	-	|	-	|
|	9	|	app.record.detail.process.proceed	|	○	|	-	|	-	|
|	10	|	app.record.create.show	|	-	|	mobile.app.record.create.show	|	-	|
|	11	|	app.record.create.submit	|	○	|	mobile.app.record.create.submit	|	○	|
|	12	|	app.record.create.submit.success	|	○	|	-	|	-	|
|	13	|	app.record.create.change.<フィールドコード>	|	-	|	mobile.app.record.create.change.<フィールドコード>	|	-	|
|	14	|	app.record.edit.show	|	-	|	mobile.app.record.edit.show	|	-	|
|	15	|	app.record.edit.submit	|	○	|	mobile.app.record.edit.submit	|	○	|
|	16	|	app.record.edit.submit.success	|	○	|	-	|	-	|
|	17	|	app.record.edit.change.<フィールドコード>	|	-	|	mobile.app.record.edit.change.<フィールドコード>	|	-	|
|	18	|	app.record.print.show	|	-	|	-	|	-	|
|	19	|	app.report.show	|	-	|	-	|	-	|
FuelPHPのバリデーションで「どれか一つは必須」

FuelPHPのバリデーションで、複数の項目のうちいずれか一つは必須。
みたいなのがデフォルトでなかったので忘れないようにメモ。

# 動作環境

FuelPHP 1.6

# コード

```php
/**
 * 入力チェック：どれか一つ以上の入力が必須。エラーの場合labelをメッセージとして設定します。
 * ex) add_rule(['required_either'=>$_valid_required_either], array('input1','input2','input3'));
 * 
 * @param mixed $dummy        ダミー引数、使用しない。※FuelPHPのValidationコールバックの第一引数は入力値が入ると決まっているためダミー引数を設置しています。
 * @param array $fieldnames   いずれか一つ以上の入力が必須な入力項目名。array(string, ...)
 *
 * @return bool
 */
$_valid_required_either = ['closure_required_either' => function($dummy, $fieldnames) {
	\Validation::active()->set_message('closure_required_either', ':label がエラーです');
	foreach ($fieldnames as $_key) {
		if (\Validation::active()->input($_key, '')) {
			return true;
		}
	}

	return false;
}];

$vali = \Validation::forge();

// input1, input2, input3のどれか一つがなければ入力エラーにする。
$vali->add('dummy_require_either', 'いずれか入力')->add_rule($_valid_required_either, ['input1','input2','input3']);
```
③ESP8266で人感センサ情報を取得する

#はじめに
この記事は、電子工作の基礎からESP8266というWifi機能を持ったArduino互換の端末を使って取得した情報をM2Xという、センサ情報を受け取りグラフ表示してくれるクラウドサービスにセンサ情報をアップするところまでをカバーした記事です。
全部で４つの記事から構成されています。
①から順番にご覧ください。

①かんたんな回路を作って電子工作の基本を習得する 
http://qiita.com/windows222/private/6f11904f30ff540dcc37
②ESP8266(Arduino)に簡単なプログラムをアップする
http://qiita.com/windows222/private/c60d086a5909d2bff39e
③ESP8266で人感センサ情報を取得する  （←本記事）
http://qiita.com/windows222/private/e6bcea0bef795c8cb30c
④ESP8266で取得したセンサ情報をM2xにアップロード 
http://qiita.com/windows222/private/9d77cc3fe0094b78a4db

---

#記事概要
ここでは、ESP8266を使って人感センサの情報を取得し、センサが人を検知した時にLEDを点灯させてみます。

#プログラム＆回路の作成
##回路の作成
ブレッドボード上に、下記の回路を作成します。
![image](https://qiita-image-store.s3.amazonaws.com/0/77722/24c0685e-cdf3-9cb1-b16f-dcee06132741.png)

##プログラムの作成
下記のプログラムを作成し、ボードに書き込みます。

```c:PIR_to_M2X.ino
/**
 * 人感センサの情報を取得し、人を検知したらLEDを一秒点灯させる。
 */
#include <Arduino.h>
#include <stdio.h>
#include <string.h>
#include <ESP8266WiFi.h>

//人感センサを示す番号
#define PIR_MOTION_SENSOR 4
//緑のLEDを示す番号（１５番ピンに接続）
#define GREEN_LED  15 

int loopCount = 0; //現在のループ数
int detectedCount = 0; //人感センサの検知回数

/**
 * 人感センサの情報をチェックし、現在の検知状態を調べる。
 */
boolean isPeopleDetected(){
  int sensorValue = digitalRead(PIR_MOTION_SENSOR);
  if (sensorValue == HIGH){ //検知状態
    return true;  //yes,return ture
  }
  else if(sensorValue == LOW){  //未検知状態
    return false;  //no,return false
  }
}

/*
 * 人感センサをチェックし、結果をコンソールに出力
 */
void sensePIR() {
  loopCount++;
  int returnValue = 0;
  
  //センサの状態を調べて、周りに人がいるかをチェック
  if (isPeopleDetected()==true) { //人がいたら 
    digitalWrite(GREEN_LED, HIGH); //人感センサ検知したらLED点灯
    detectedCount++;
    Serial.printf("PIR1:find someone! loopCount=%d detectedCount=%d\n",loopCount,detectedCount);
  }
  else {        //人がいなかったら
    digitalWrite(GREEN_LED, LOW); //人感センサ検知なければLED消灯
    Serial.printf("PIR1:no one can find..loopCount=%d \n", loopCount);
  }
}

/**
 * 準備開始（最初に呼ばれる関数）
 */
void setup(){
  Serial.begin(115200);//シリアルポートを通信速度115200で開始
  Serial.println("start setup");
  
  pinMode(PIR_MOTION_SENSOR, INPUT); //ピンを入力状態にセット
  pinMode(GREEN_LED, OUTPUT); //ピンを出力状態にセット
  
  Serial.println("end of setup");
}
/**
 * セットアップの後に連続して呼ばれる
 */
void loop(){
  sensePIR();//人感センサの状態チェック
  delay(1000);//一秒待機
}
```
##動作確認
人感センサに手をかざした時に、LEDが点灯すれば成功です。


次の記事：④ESP8266で取得したセンサ情報をM2xにアップロード 
http://qiita.com/windows222/private/9d77cc3fe0094b78a4db
Xcode8でCocoaPodsにSwift2.3の自作ライブラリを登録する

#はじめに#
Xcode8をインストールした状態で、CocoaPodsにSwift2.3の自作ライブラリを登録しようとしたところ、バリデーションチェックにエラーが出て進めませんでした。次のようにして解決しましたので、メモします。

#CocoaPodsのバージョンを上げる#
ターミナルから`pod --version` を実行して、バージョンを確認します。
執筆時点では、1.1.0.rc.2に上げることがベストです。
`sudo gem install -v 1.1.0.rc.2 cocoapods`を実行します。

#.swift-versionファイルを作成#
プロジェクトやターゲットのビルドセッティングでUser Legacy Swift Language VersionをYESにしていても、Swift 2.3でビルドしてくれません。
そこで、CocoaPodsがビルドするときにSwiftのバージョンを参照する.swift-versionファイルを作成してから、バリデーションチェックを行います。

まず、ターミナルで.podspecファイルのディレクトリに移動します。
つぎに、`echo "2.3" > .swift-version`を実行して.swift-versionファイルを作成します。なお、Finderでは.swift-versionファイルは見えません。
最後に、`pod spec lint`を実行します。

*ライブラリ名.podspec passed validation.*という結果が表示されれば、正常終了です。

#関連記事#
[CocoaPodsにSwift3対応の自作ライブラリを登録する方法](http://qiita.com/kentya6/items/f6dabcde8f2f911d8ce7)については、ここに説明されている通りで進めます。

[Can't install pod with Xcode 8/Swift 3/Cocoapods 1.1.0 RC2](https://github.com/CocoaPods/CocoaPods/issues/5864)
Bootstrap3で5等分のレイアウトを作成する

Bootstrapは偶数での分割をする場合には使い勝手はいいのですが、奇数での分割をする場合はなかなかやりづらい部分があります。
特にwebサイトのコンテンツには5等分のレイアウトで作成されているもの（メニューとか）がよく出てくるので、使用頻度もそれなりかと思います。

私が5等分するにあたって、主に2通りの作成方法を採っています。

##1. col-xx-offset-(n)を使用する

以下の方法です

```ex.html
<div class="row">
    <div class="col-md-2 col-md-offset-1"></div>
    <div class="col-md-2"></div>
    <div class="col-md-2"></div>
    <div class="col-md-2"></div>
　　　　　　　　<div class="col-md-2"></div>
</div>
```

offsetを使用して左側にマージンを取る方法です。上記の例は左右に1カラム分のマージンをとりたい場合のものです。左右に2カラム分のマージンをとりたい場合はoffsetを2にします。

但し、左右にマージンを取る方法なので、例えば画面（要素）の左右の両端にピッタリくっつけて配置したいという要件に対しては別のやり方が必要です。

##2. 5等分のオリジナルcolumnを作成する

そこで、5等分にするためのオリジナルcssを作成します。

```ex.css
.col-xs-1-5, .col-sm-1-5, .col-md-1-5, .col-lg-1-5,
.col-xs-2-5, .col-sm-2-5, .col-md-2-5, .col-lg-2-5,
.col-xs-3-5, .col-sm-3-5, .col-md-3-5, .col-lg-3-5,
.col-xs-4-5, .col-sm-4-5, .col-md-4-5, .col-lg-4-5 {
	position: relative;
	min-height: 1px;
	padding-right: 15px;
	padding-left: 15px;
}	
.col-xs-1-5 {
	width: 20%;
	float: left;
}
.col-xs-2-5 {
	width: 40%;
	float: left;
}
	
.col-xs-3-5 {
	width: 60%;
	float: left;
}
	
.col-xs-4-5 {
	width: 80%;
	float: left;
}
@media (min-width: 768px) {
	.col-sm-1-5 {
		width: 20%;
		float: left;
	}
	.col-sm-2-5 {
		width: 40%;
		float: left;
	}
	.col-sm-3-5 {
		width: 60%;
		float: left;
	}
	.col-sm-4-5 {
		width: 80%;
		float: left;
	}
}
@media (min-width: 992px) {
	.col-md-1-5 {
		width: 20%;
		float: left;
	}
	.col-md-2-5 {
		width: 40%;
		float: left;
	}
	.col-md-3-5 {
		width: 60%;
		float: left;
	}
	.col-md-4-5 {
		width: 80%;
		float: left;
	}
}
@media (min-width: 1200px) {
	.col-lg-1-5 {
		width: 20%;
		float: left;
	}
	.col-lg-2-5 {
		width: 40%;
		float: left;
	}
	.col-lg-3-5 {
		width: 60%;
		float: left;
	}
	.col-lg-4-5 {
		width: 80%;
		float: left;
	}
}	
```

上記cssを使うと、例えば以下のようになります。

```ex.html
<div class="row">
<div class="col-md-2-5">...</div><!-- 全体の5分の2の要素をとる -->
<div class="col-md-3-5">...</div><!-- 全体の5分の3の要素をとる -->
</div>
```
上記のようにcol-xx-(n)-5と指定することで、５分割の内の何割をとるか、という指定が可能になります。

### Sass版

Sass(scss)を使った定義は以下のようになります。
変数を考慮した5分割が可能になりますので、より汎用性が増します。

```scss
.col-xs-1-5, .col-sm-1-5, .col-md-1-5, .col-lg-1-5,
.col-xs-2-5, .col-sm-2-5, .col-md-2-5, .col-lg-2-5,
.col-xs-3-5, .col-sm-3-5, .col-md-3-5, .col-lg-3-5,
.col-xs-4-5, .col-sm-4-5, .col-md-4-5, .col-lg-4-5 {
  position: relative;
  min-height: 1px;
  padding-left:  ($grid-gutter-width / 2);
  padding-right: ($grid-gutter-width / 2);
}
@for $i from 1 through 4 {
  .col-xs-#{$i}-5 {
    float: left;
    width: percentage($i / 5);
  }
  @media (min-width: $screen-sm-min) {
    .col-sm-#{$i}-5 {
      float: left;
      width: percentage($i / 5);
    }
  }
  @media (min-width: $screen-md-min) {
    .col-md-#{$i}-5 {
      float: left;
      width: percentage($i / 5);
    }
  }
  @media (min-width: $screen-lg-min) {
    .col-lg-#{$i}-5 {
      float: left;
      width: percentage($i / 5);
    }
  }
}
```

###参考
http://fellowtuts.com/twitter-bootstrap/5-equal-columns-bootstrap-grid-layout-with-1-2-3-4-of-five/
http://stackoverflow.com/questions/10387740/five-equal-columns-in-twitter-bootstrap
Golangで表をタブ区切りで表示する

CLIツールで表を出力するとき、下記のパッケージを使うとかっこ良く表示できる。

* https://github.com/olekukonko/tablewriter
* https://github.com/crackcomm/go-clitable

出力例(olekukonko/tablewriterから引用)：

```text
+------+-----------------------+--------+
| NAME |         SIGN          | RATING |
+------+-----------------------+--------+
|  A   |       The Good        |    500 |
|  B   | The Very very Bad Man |    288 |
|  C   |       The Ugly        |    120 |
|  D   |      The Gopher       |    800 |
+------+-----------------------+--------+
```

これはこれで綺麗だが、出力された表を流用・加工する場合はスペースだったりタブのみで区切られていた方が使い勝手が良かったりする。
単純なタブ区切りなら、`text/tabwriter`パッケージで出力可能。

https://golang.org/pkg/text/tabwriter/

```go
package main

import (
	"fmt"
	"os"
	"text/tabwriter"
)

func main() {
	w := new(tabwriter.Writer)

	w.Init(os.Stdout, 0, 8, 0, '\t', 0)
	fmt.Fprintln(w, "a\tb\tc\td\t.")
	fmt.Fprintln(w, "123\t12345\t1234567\t123456789\t.")
	fmt.Fprintln(w)
	w.Flush()
}
```

https://play.golang.org/p/ywxPNdcBu0
Angular2、本日(日本時間：2016/09/15)正式リリース！！！

#リリースされたようです
公式ページ
https://angular.io/

GitHub
https://github.com/angular/angular/releases

# その他
<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Tonight&#39;s LiveStream link is <a href="https://t.co/qtvxxtC6JA">https://t.co/qtvxxtC6JA</a><br>Ask us anything using <a href="https://twitter.com/hashtag/askNg?src=hash">#askNg</a></p>&mdash; Angular (@angularjs) <a href="https://twitter.com/angularjs/status/776219136099618816">2016年9月15日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
Xcode8 CircleCi&fastlaneが動かなくなった時のお話

iOS9のアプリをiOS10でも対応することになりXcode8に変えた。
iOS10でも問題なく動作することが確認できたので、リリースするためにmasterへPushした。
そこで問題が起こった・・・・。

![スクリーンショット 2016-09-15 13.16.11.png](https://qiita-image-store.s3.amazonaws.com/0/84002/6a0b732c-9bba-9c85-7627-f820a8b06c6f.png)

ARCHIVEに失敗したのだ・・・・・。
Xcodeの設定やらfastlane関連のファイルもなんもいじってないので起きた原因がよくわからなかった。

Xcode8に変えて起こったので「fastlane Xcode8」な感じでググったら下記issueに当たった。
https://github.com/fastlane/fastlane/issues/5163

どうやらXcode8から導入されたAutomatic Signingいよるものらしい。

Automatic Signingを使うと複数のCertificatesなど証明関連のものが紐づけられていた。
 (　˘ω˘)oO(複数あったからfastlaneが認識できなかったのか・・・・？)

応急的な対応なのかもしれないがとりあえずAutomatic SigningをオフにしBuild SettingsのSigningでアプリに該当する ProvisioningProfileを設定した。

これでARCHIVEの問題は解決した。

次にぶち当たったのはtoolchain

```
bundler: failed to load command: fastlane (/Users/distiller/hogehoge/vendor/bundle/ruby/2.3.0/bin/fastlane)
Errno::ENOENT: [!] No such file or directory @ rb_sysopen - /Applications/Xcode-8.0.app/Contents/Developer//Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos/libswiftWebKit.dylib
```

Xcode7ではなかったのでまたググってみた。
そしたら下記のisuueに当たった。
https://github.com/fastlane/fastlane/issues/5998

私の場合、fastfileに` toolchain: "com.apple.dt.toolchain.Swift_2_3"と`,`use_legacy_build_api: false`を追加してやったら無事itunesconnectに上げることができた。
use_legacy_build_api: falseにする理由はtoolchainのオプションを使えるようにするためだとか。
(　˘ω˘)oO（デフォルトではSwift3のtoolchainが使われているのかな？）

Signingについては他に真っ当なやり方があるのかもしれないがとりあえず緊急で対応、ひとまずアプリが上げられて良かった。
UnityのSpring Jointを使う 2

# はじめに

[UnityのSpring Jointを使う ](http://qiita.com/yanosen_jp/items/1642fb928a140146cf1b) の続きです。

# 上からばねにモノを落とす。

## 準備

玉(sphere)を上から落とします。Transform, Rigidbodyを以下のように設定してください。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/58503/76353e4f-704f-c340-e816-d5961a7fc03e.png)

上のCubeはMassを1にします。

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/58503/9b49013f-8a2d-6df6-658b-0fda44d1f8a9.png)

下のCube(1)はSpring JointコンポーネントのMin, Max Distanceおのおの4にしてみましょう。Springは大判振る舞いで100000。

![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/58503/02b2c3c2-628a-2947-6aa7-11a898aa53a2.png)

## 落とす

実行すると、最初はCubeは動かないはずです(Min Distanceが4だから）。そのあと、玉が落ちてきて下がり、また上がります。グラフにすると以下の通りです。グラフ作成にはMonitor Componentsアセットを使いました。

![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/58503/2ffc8968-9b26-9910-5f66-33adb2100278.png)

Cubeはいったん約0.75下がりますが、すぐに元の長さに戻っています。これは、元の長さがMax Distanceに等しいからです。玉はバウンドし、Y = 4.15まで上がります。

次に、Min Distanceが3にし、下のCube(1)の位置を1上げて-4にします（こうしないと、実行開始時にCubeがmin distanceの長さに移動してしまう）。それで実験すると、Cubeは先ほど同じく約0.75下がりますが、そのあと大きく伸びて、初期位置から約1上（Max Distanceに相当）に上がります。つまり、振れ幅は約1.75になるわけです。玉のバウンドの仕方は変わりません。

![キャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/58503/6a883734-d420-8f3d-004a-ac00ea761b5a.png)


さらに、Min Distanceが2にし、下のCube(1)の位置を1上げて-3にしたらどうなるでしょうか。もう予想がつきますね。Cubeは先ほど同じく約0.75下がりますが、そのあと大きく伸びて、初期位置から約2上（Max Distanceに相当）に上がります。つまり、振れ幅は約2.75です。玉のバウンドの仕方はやはり変わりません。

![キャプチャ7.PNG](https://qiita-image-store.s3.amazonaws.com/0/58503/7ea8654a-a6d6-6aa3-dbc0-1e9e86fc48ab.png)

# まとめ

最後に、上の3条件を同時に。左からmin distance 4, 3, 2です。max distanceは4で固定です。

![QiitSpringJoint2.gif](https://qiita-image-store.s3.amazonaws.com/0/58503/9b2b6476-331c-0d75-7792-5d24c428ffef.gif)


このように、Max distanceが固定の場合、min distanceが小さいほど、力が加わった時、最初の縮みは同じでも、**縮んでから戻る際の**振れ幅の大きいバネになります（力が加わった時の最初の縮みはSpringの値で決まる）。しかし、それによって球を持ちあげる距離に差はありません。
code is required by aaron patterson

https://www.youtube.com/watch?v=_bDRR_zfmSk

https://www.youtube.com/watch?v=4DqzaqeeMgY

```bash
vagrant@precise64:~/data$ pry
[1] pry(main)> gem_original_require "eventmachine"
LoadError: cannot load such file -- eventmachine
from (pry):1:in `require'
[2] pry(main)> gem "eventmachine"
=> true
[3] pry(main)> gem_original_require "eventmachine"
=> true
[4] pry(main)> EventMachine
=> EventMachine
[5] pry(main)> 
```


 *  call-seq:
 *     require(name)    -> true or false
 *
 *  Loads the given +name+, returning +true+ if successful and +false+ if the
 *  feature is already loaded.
 *
 *  If the filename does not resolve to an absolute path, it will be searched
 *  for in the directories listed in <code>$LOAD_PATH</code> (<code>$:</code>).
 *
 *  If the filename has the extension ".rb", it is loaded as a source file; if
 *  the extension is ".so", ".o", or ".dll", or the default shared library
 *  extension on the current platform, Ruby loads the shared library as a
 *  Ruby extension.  Otherwise, Ruby tries adding ".rb", ".so", and so on
 *  to the name until found.  If the file named cannot be found, a LoadError
 *  will be raised.
 *
 *  For Ruby extensions the filename given may use any shared library
 *  extension.  For example, on Linux the socket extension is "socket.so" and
 *  <code>require 'socket.dll'</code> will load the socket extension.
 *
 *  The absolute path of the loaded file is added to
 *  <code>$LOADED_FEATURES</code> (<code>$"</code>).  A file will not be
 *  loaded again if its path already appears in <code>$"</code>.  For example,
 *  <code>require 'a'; require './a'</code> will not load <code>a.rb</code>
 *  again.
 *
 *    require "my-library.rb"
 *    require "db-driver"
 *
 *  Any constants or globals within the loaded source file will be available
 *  in the calling program's global namespace. However, local variables will
 *  not be propagated to the loading environment.
 *
 
https://github.com/ruby/ruby/blob/trunk/load.c#L782


```bash
vagrant@precise64:~/data$ cat foo.rb 
require 'bar'
puts a
vagrant@precise64:~/data$ cat bar.rb 
a = 12
vagrant@precise64:~/data$ ruby -I . foo.rb
foo.rb:2:in `<main>': undefined local variable or method `a' for main:Object (NameError)
```

https://bugs.ruby-lang.org/issues/11155
[Unity] シーン切り替え時にパラメータを渡す

最近こういう感じで実装している。


```csharp:SceneA.cs
using UnityEngine;
using UnityEngine.SceneManagement;
using UniRx;

public class SceneA : MonoBehaviour {

	public void LoadSceneB() {

		SceneManager.LoadSceneAsync("SceneB").AsObservable()
					.Subscribe(_ => {
						var sceneB = FindObjectOfType<SceneB>() as SceneB;
						sceneB.Param = new SceneB.Parameter { IntParam = 999 };
					});
	}
}
```

```csharp:SceneB.cs
using UnityEngine;

public class SceneB : MonoBehaviour {

	public class Parameter {
		public int IntParam;
	}
	public Parameter Param;

	void Start () {
		Debug.Log(this.Param.IntParam);
	}
}
```

要は、SceneBのロードが完了したタイミングで、SceneB上のオブジェクトのPublic変数に、直接値をセットする。
`LoadSceneAsync`で非同期ロードすると、ロード完了のタイミング（`Awake`と`Start`の間）で処理が実行できる。

上記は`UniRx`を使ってるけど、`UniRx`を使わない場合はこんな感じ。

```csharp:SceneA.cs
using UnityEngine;
using UnityEngine.SceneManagement;
using System.Collections;

public class SceneA : MonoBehaviour {

	public void LoadSceneB() {
		StartCoroutine(this.invokeActionOnloadScene("SceneB", () => {
			var sceneB = FindObjectOfType<SceneB>() as SceneB;
			sceneB.Param = new SceneB.Parameter { IntParam = 999 };
		}));
	}

	private IEnumerator invokeActionOnloadScene(string sceneName, System.Action onLoad) {
		var asyncOp = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
		yield return asyncOp;
		onLoad.Invoke();
		SceneManager.UnloadScene(SceneManager.GetActiveScene().buildIndex);
	}
}
```

> ロード完了した時点で前のシーンがUnloadされてしまうので、`LoadSceneMode.Additive`で追加ロードにして、最後に自分をUnloadしている。
（もっと良い方法がありそう）


ついでに、SceneB単体で確認できるように、パラメータがnullの場合のデフォルト値を入れるようにすると良いと思う。

```csharp:SceneB.cs
	void Start () {
#if UNITY_EDITOR
		if (this.Param == null) {
			this.Param = new Parameter { IntParam = 111 };
		}
#endif
		Debug.Log(this.Param.IntParam);
	}
```
e-StatのGISデータ

日本政府統計の「地図で見る統計（統計GIS）で使われているGISデータで、同じデータを異なるフォーマットでダウンロードできるようになっている。どこがどう違うのか調べてみた。

shpは昔からあるバイナリフォーマットで、GMLは最近整備されてきたXMLフォーマット。python `geopandas` で読み込む（内部的には `fiona`）場合は、shp を使う。`fiona` が内部で使っている `GDAL` で、必要な XML 仕様を完全にサポートしていないかららしい。

後は projection の差で、`proj4` な定義を見るとこうなっていた（`geopandas`の[解説](http://geopandas.org/projections.html)）。神戸市で取り出していて、平面直角座標系は地域によって少し違うはず。

|呼称|proj4文字列|
|:--|:--|
|日本測地系緯度経度 | +ellps=bessel +no_defs +proj=longlat |
|世界測地系緯度経度 | +ellps=GRS80 +no_defs +proj=longlat |
|日本測地系平面直角座標系 | +lon_0=134.3333333333333 +y_0=0 +lat_0=36 +ellps=bessel +no_defs +units=m +proj=tmerc +x_0=0 +k=0.9999 |
|世界測地系平面直角座標系 | +lon_0=134.3333333333333 +y_0=0 +lat_0=36 +ellps=GRS80 +no_defs +units=m +proj=tmerc +x_0=0 +k=0.9999 |

平面直角座標系は、地面と同じように平面に見える数字になる。`units`が`m`になってますね。平面直角座標系で、日本測地系と世界測地系は楕円球体が違うということですかね。日本測定系と呼ばれているものはベッセル楕円体ということで、つまり旧日本測地系。いまどき WGS84 なデータがたくさんあるので、日本測地系 2000 な「世界測地系」の GRS80 を使うのが良さそう。

いろいろ計算したい場合は、「世界測地系緯度経度」をダウンロードして計算しておいて、最後に図にするときに平面直角座標系に変換するといいかな。`to_crs()` で一発でできるし。

```py
data.to_crs("+lon_0=134.3333333333333 +y_0=0 +lat_0=36 +ellps=GRS80 +no_defs +units=m +proj=tmerc +x_0=0 +k=0.9999").plot()
```

面積を使って値を割り振るとかする時は、平面直角座標系で計算しないとダメか。
Windows CPUアーキティクチャ確認_cmd

**PROCESSOR_ARCHITECTURE**環境変数に値が格納されている。

```ruby:コマンドプロンプト
c:\>echo %PROCESSOR_ARCHITECTURE%
AMD64
```
**AMD64の場合・・・64bitアーキティクチャ**

```ruby:コマンドプロンプト
c:\>echo %PROCESSOR_ARCHITECTURE%
x86
```
**x86の場合・・・32bitアーキティクチャ**
zshでaws-cliの補完を効かせる


環境

+ MacOS 10.11.6
+ Homebrew
+ python 2.7

まずはawscli自体をインストールします。公式
https://aws.amazon.com/jp/cli/
にあるとおりに

```Bash:
$ pip install awscli
```

終わりましたら、

.zshrcに補完の設定を読み込ませます。

```:.zshrc
source aws_zsh_completer.sh
```
としてやればいいだけ。しかし、今回の私を含め、sourceするとシェル自体が終了してしまうことがあるようなので、そんな方向けのメモ。

# うまくいかない時の解決方法

公式にある通りにpython(pip)経由のインストールではなくHomebrew経由でインストールする。

```Bash:
pip uninstall awscli
brew install awscli
source /usr/local/share/zsh/site-functions/_aws
```

pipでインストールしたものと同時に存在してしまうと予想外のエラーが起こるかもしれないので先にアンインストールします。
読み込むべき補完ファイルについては、Homebrewでインストールした時に最後に表示されます。私の環境では`source /usr/local/share/zsh/site-functions/_aws`と表示されていましたので、`.zshrc`にこの行を追加してシェルの再起動を行い確認しました。

AWSのコマンドは非常に長い上にたくさん種類があってとてもすべて覚えきれませんが、適当に打ってTabキーで探せるようになるととても便利かと思いますので是非補完を効かせてみてはいかがでしょうか。
「オフラインリアルタイムどう書く第12回(サイコロを転がす)」の問題を解いてみた


[横浜へなちょこプログラミング勉強会](https://yhpg.doorkeeper.jp/)にて過去に出題された[サイコロを転がす](http://nabetani.sakura.ne.jp/hena/ord12rotdice/)を解いてみた。
回答にかかった時間は15分程度。

```ruby
class Dice
  def initialize
    @north, @west, @top = 2, 3, 1
  end

  def rolling input
    input.each_char.each_with_object([@top]){|c, r|
      @north, @west, @top = case c
                            when "N" then [@top, @west, 7 - @north]
                            when "W" then [@north, @top, 7 - @west]
                            when "S" then [7 - @top, @west, @north]
                            when "E" then [@north, 7 - @top, @west]
                            end
      r << @top
    }.join
  end
end

test = <<_TEST
/*0*/ test( "NNESWWS", "15635624" );
/*1*/ test( "EEEE", "13641" );
/*2*/ test( "WWWW", "14631" );
/*3*/ test( "SSSS", "12651" );
/*4*/ test( "NNNN", "15621" );
/*5*/ test( "EENN", "13651" );
/*6*/ test( "WWNN", "14651" );
/*7*/ test( "SSNN", "12621" );
/*8*/ test( "NENNN", "153641" );
/*9*/ test( "NWNNN", "154631" );
/*10*/ test( "SWWWSNEEEN", "12453635421" );
/*11*/ test( "SENWSWSNSWE", "123123656545" );
/*12*/ test( "SSSWNNNE", "126546315" );
/*13*/ test( "SWNWSSSWWE", "12415423646" );
/*14*/ test( "ENNWWS", "1354135" );
/*15*/ test( "ESWNNW", "1321365" );
/*16*/ test( "NWSSE", "154135" );
/*17*/ test( "SWNWEWSEEN", "12415154135" );
/*18*/ test( "EWNWEEEEWN", "13154532426" );
/*19*/ test( "WNEWEWWWSNW", "145151562421" );
/*20*/ test( "NNEE", "15631" );
/*21*/ test( "EEEEWNWSW", "1364145642" );
/*22*/ test( "SENNWWES", "123142321" );
/*23*/ test( "SWWWSNSNESWW", "1245363635631" );
/*24*/ test( "WESSENSE", "141263231" );
/*25*/ test( "SWNSSESESSS", "124146231562" );
/*26*/ test( "ENS", "1353" );
/*27*/ test( "WNN", "1453" );
/*28*/ test( "SSEENEEEN", "1263124536" );
/*29*/ test( "NWSNNNW", "15414632" );
/*30*/ test( "ESSSSSWW", "132453215" );
/*31*/ test( "ESE", "1326" );
/*32*/ test( "SNWNWWNSSSS", "121456232453" );
/*33*/ test( "SWEESEN", "12423653" );
/*34*/ test( "NEEWNSSWWW", "15323631562" );
/*35*/ test( "WSEW", "14212" );
/*36*/ test( "SWSNNNSNWE", "12464131353" );
/*37*/ test( "ENWEWSEEW", "1351513545" );
/*38*/ test( "WSEWN", "142124" );
/*39*/ test( "EWNEESEWE", "1315321414" );
/*40*/ test( "NESEEN", "1531263" );
/*41*/ test( "WSW", "1426" );
/*42*/ test( "ENEWE", "135656" );
_TEST

require 'minitest/autorun'

describe 'Dice' do
  test.split("\n").each do |line|
    t, n, input, expect = line.match(/^\/\*(\d+)\*\/\s*test\(\s*"([^"]+)",\s*"([^"]+)"\s*\);$/).to_a
    dice = Dice.new
    it input do
      assert_equal expect, dice.rolling(input)
    end
  end
end
```
CakePHP2のctpファイルでif elseがphpcsにひっかかる


下記の様な書き方してると、phpcs で```} else {``` の行が Closing brace must be on aline by itself って引っかかります。

```ctp
<?php if ($a): ?>
	<?php
	if ($b) {
		echo $c;
	} else {
		echo $d;
	}
	?>
<?php endif ?>
```

下記だとOK

```ctp
<?php
if ($a) {
	if ($b) {
		echo $c;
	} else {
		echo $d;
	}
}
```

単純化してかいちゃったけど、ctpファイルだとhtmlタグ書く関係で前者の書き方したいことあるんだよねぇ。

今の所うまい書換方法は見つけてないんですが、ひとまずメモとして。

----
結局、しょうがないので、こんな形に書き直してます…

```ctp
<?php if ($a): ?>
	<?php if ($b): ?>
		<?php
		echo $c;
		?>
	<?php else : ?>
		<?php
		echo $d;
		?>
	<?php endif ?>
<?php endif ?>
```
C#の構文木を可視化するVSCode拡張の作成してみた

# C#の構文木を可視化するVSCode拡張の作成

C#の構文をroslynで解析して、graphvizで図に出す拡張を作ってみた。

https://marketplace.visualstudio.com/items?itemName=itn3000.cs-syntax-visualizer
![cs-syntax-visualizer-partial.png](https://qiita-image-store.s3.amazonaws.com/0/103253/12420b8f-5152-69d7-807c-5da9f4c3a798.png)

## 背景

以下のような経緯

1. roslynの構文木ってgraphvizで表せそうかな
2. 実際作ってみよう
3. コマンドラインではできた
4. エディタ連携したらもっと使いやすいかな
5. vscode普段使ってるから、これで使えたら便利かな
6. [plantuml拡張](https://marketplace.visualstudio.com/items?itemName=okazuki.okazukiplantuml)と似たようなことやってるし、作れそうだな
7. じゃあ拡張で作ろう、Typescriptの勉強にもなるし

## 動作条件

READMEにも書いてあるけど、以下のものが必要

* [dotnet cli 1.0.0](https://dot.net/core)
* [graphviz](http://www.graphviz.org)
    * GRAPHVIZ_DOT環境変数を設定するか、vscodeの設定で`cssyntaxvisualizer.dotsPath`設定が必要

## 使い方

拡張をインストールすると、以下のようなコマンドが追加される

* `Visualize C# syntax tree of whole file`
    * アクティブなドキュメントの構文木を解析して図に出す
* `Visualize C# syntax tree of selected text`
    * 選択範囲のみ解析して図に出す
* `Export visualized C# syntax tree as [フォーマット]`
    * アクティブなドキュメントの構文木をファイルに出力する
administrate でenum 専用のfield を作ったよ

Rails の管理画面用gem の一つ、[administrate](administrate) を使い始めました
しかし、絶賛開発中という事があってかゆい所に手が届かない

今回はその一つ、**enum をいい感じのSELECT で表現する** にチャレンジします

`enum` の`issues` はあがっていたのですが多言語化されてなかったのでその対応がメインになります！
 https://github.com/thoughtbot/administrate/issues/420

まずは`field` を`generate`
```
$ rails generate administrate:field enum_select
```

こんなファイル達を作ります

```
app/fields/enum_select_field.rb
app/views/fields/enum_select_field/_form.html.erb 
app/views/fields/enum_select_field/_index.html.erb
app/views/fields/enum_select_field/_show.html.erb
```

それぞれのファイルを以下のように修正

```ruby:app/fields/enum_select_field.rb
require "administrate/field/base"

class EnumSelectField < Administrate::Field::Select
  def enum_options
    collection.map do |k, v|
       [I18n.t("enum_cd.#{@attribute}.#{k}"), k]
     end
  end
end
```

```erb:app/views/fields/enum_select_field/_form.html.erb 
<div class="field-unit__label">
  <%= f.label field.attribute %>
</div>
<div class="field-unit__field">
  <%= f.select(
    field.attribute,
    field.enum_options
  ) %>
</div>
```

```erb:app/views/fields/enum_select_field/_index.html.erb
<%= t("enum_cd.#{field.attribute}.#{field.data}") %>
```

```erb:app/views/fields/enum_select_field/_show.html.erb
<%= t("enum_cd.#{field.attribute}.#{field.data}") %>
```

で仕上げに `locale` を修正

```yaml:config/locales/ja.yml
ja:
  enum_cd:
    role:
      admin:   管理者
      member: 　　会員
      guest:   ゲスト

```

結果、こんな画面になります

<img width="642" alt="スクリーンショット 2016-09-15 13.48.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/11006/80329a44-5d17-b750-8a2b-c0f719253134.png">

無事日本語になりました
ユーザーレビューを効率的に進めるための「ちょっとした工夫」

#1.はじめに
 システム開発の上位設計（要件定義、基本設計など）において、エンドユーザーとのレビューを効率的に進めるための「ちょっとした工夫」について、いくつかお話します。
ここでいうレビューとは、ユーザーと定期的に行う仕様決めの打合せ(会議）のことです。

#2.ちょっとした工夫
　今回は、３つほどお話します。

　(1)ドキュメントに登場するプログラムに通し番号を付ける　・・・・・　主に要件定義レビュー
　　新業務フローなど、ドキュメント上に複数の画面、帳票、プロセスなどのプログラムが登場する場合は、それら固有のプログラムID（画面ID、帳票ID、プロセスIDなど）とは別に、そのドキュメント内だけで使用する通し番号を記載します。
　　この通し番号は、A-001、A-002などの単純なルールの番号で構わないのですが、この番号を表記することで、ユーザーとの会話や書面でのやりとりをスムースに行うことが可能になります。

　(2)吹き出しコメントの枠線に色を付ける　・・・・・　主に要件定義レビュー
    これも業務フローに対してですが、吹き出し形式等で補足説明を記載する場合に、ユーザー側の要望に対するものとシステム側からの提案によるものを吹き出し枠の色を変えて表現しておくと、仕様決定にいたる経緯をたどる際の助けになります。（ときどき、後からかえりみたときに「なんで、こんな仕様にしたんだっけ・・・？」ということがあります）
　
　(3)レビューシートを共有する　・・・・・　主に基本設計レビュー
　　 要件定義レビューで個々の画面や帳票のレイアウトや機能のイメージをある程度共有している場合は、それらの画面・帳票に対する基本設計レビューを行う数日前(２～３日前）に、画面設計書・帳票設計書をレビューシート付きでユーザーに送付し、当日までに指摘事項・要望・質問等を書き込んでおいてもらうと、レビュー当日の確認作業を効率よく進めることができます。
ここでいうレビューシートとは、「画面レイアウト」、「画面項目名」、「表示桁数」、「エラーメッセージ」など、各画面・帳票で共通的な項目を中心に表形式で作成する程度のものでよく、一度ひな形を作ってしまえばそれほど手間の掛かるものではありません。

#3.終わりに
　いかがでしょうか。2(3)はちょっと重たい作業になりますが、これらの工夫をすることで上位設計のレビュー効率や精度を高めることができますので、もしよかったら一度試してみてください。


以上
Promiseを順次(直列)実行するサンプル

よく忘れるので(まぁググればけっこう出てくるのでメモの必要もそれほど感じなくなってきたけど)メモしておく。※よくよく見るとQiitaにも同じような記事結構ある。。。
Array要素を非同期な処理でPromiseを使って順次実行する場合、reduceを使うと便利という話。

下記のようなサンプルでいかがでしょうか。

```js
var datas= [
    {timeout:10, message:'Hello'},
    {timeout:100, message:'Promise'},
    {timeout:5000, message:'World'},
    {timeout:100, message:'!!!'}
];

function sequentialExec(arr){
    return arr.reduce(function(prev,current,index,array){
        return prev.then(function(prevResult){
            return new Promise(function(resolve,reject){
                if(current && typeof current.timeout === 'number' && typeof current.message === 'string'){
                    setTimeout(function(){
                        console.log('Prev:%s, Current:%s',prevResult,current.message);
                        resolve(current.message);
                    },current.timeout);
                }else{
                    reject(new Error('invalid data.'));
                }
            });
        });
    },Promise.resolve());
}

sequentialExec(datas).then(function(lastResult){
    console.log('Process completed: %s', lastResult);
}).catch(function(e){
    console.log('Process error: %s', e.message);
});
```

ということはこんな感じの作っておけば便利だったりするのかな？

```js
Promise.reduce = function(arr,func){
    return arr.reduce(function(prev,current){
        return prev.then(function(result){
            return new Promise(function(resolve, reject){
                func(resolve,reject,result,current);
            });
        });
    },Promise.resolve());
};
```

これを使うと、最初に書いたコードは

```js
var datas= [
    {timeout:10,message:'Hello'},
    {timeout:100,message:'Promise'},
    {timeout:5000,message:'World'},
    {timeout:100, message:'!!!'}
];

function proc(resolve,reject,prevResult,current){
    if(current && typeof current.timeout === 'number' && typeof current.message === 'string'){
        setTimeout(function(){
            console.log('Prev:%s,Current:%s',prevResult,current.message);
            resolve(current.message);
        },current.timeout);
    }else{
        reject(new Error('invalid data.'));
    }
};

Promise.reduce(datas,proc).then(function(lastResult){
    console.log('Process completed: %s', lastResult);
}).catch(function(e){
    console.log('Process error: %s', e.message);
});

```

とかなるのかな。まぁ一応やりたいことに集中できるかなぁ。
Intellij IDEA で gometalinter

# はじめに
* Go 言語用の統合 lint ツール gometalinter が便利
* Intellij IDEA の Go 言語用プラグイン go-lang-idea-plugin では[対応していないので External Tool をつかえということ](https://github.com/go-lang-plugin-org/go-lang-idea-plugin/issues/2493)

# gometalinter のインストール

```sh
go get -v github.com/alecthomas/gometalinter
gometalinter -i -u
```

# gometalinter を使う

```sh
# 素で実行
gometalinter 
# 一部のコマンドでタイムアウトが発生し WARNING: deadline exceeded by linter という警告がでる場合
gometalinter --deadline=10s
# vendor 以下のソースを解析対象から外したい場合
gometalinter --vendor
# 一部のコマンドを実行したくない場合
gometalinter --disable=dupl
```

# Intellij IDEA の External Tool に設定する
* メニューの `Intellij IDEA` > `Preferences...` で設定ウィンドウを開く
* `Tools` > `External Tool` を選択
* `+` のアイコンを押下して作成ウィンドウを開く
* 以下の項目を入力して OK
  * `Name` に `gometalinter
  * `Program` に `gometalinter`
  * `Parameters` に `--deadline=10s --vendor`（任意）

# Intellij IDEA から gometalinter を使う
* 任意の場所を右クリックして `External Tool` > `gometalinter` で実行

# 参考リンク
* http://qiita.com/spiegel-im-spiegel/items/238f6f0ee27bdf1de2a0
* https://github.com/alecthomas/gometalinter
【MDM】AppleID / iCloud / AppStore問題

# 前回
http://qiita.com/nakamuras/items/e23e8f98d29002a09c75
上記で書いたMDM導入について、AppleIDの問題が生じたので備忘録としてメモ

※Apple IDは個人で使うことを目的として作られたものですので
Apple IDの仕様の問題を指摘する記事ではありません。
※Apple Configurator使えばいいじゃん　という意見があると思いますが
今回はApple Configurator ⇢ MDMへの移行段階での記事です。

あくまでApple IDを会社で管理・使用しようとする際の注意点としてお読みください。

# AppleIDを会社で管理・使用する際の問題点

## Apple IDとは何か
Apple IDは、Apple製品を使う際に"だいたい"必要になるIDです。
例えば、iPhone / iPad / Mac / iPodなどを利用する際には必ず必要となります。

これ、結構面倒臭くてネットでも結構トラブってる方を見かけます。

登録には以下の情報が必ず必要になってきます。
・名前
・生年月日
・郵便番号
・住所
・電話番号
・メールアドレス（AppleのiCloudメールアドレスを発行する事もできる）

上記は、登録の際に限らずAppStoreからアプリを最初にダウンロードする時にも求められます。

## Apple IDを会社で管理する
会社支給のiPhoneやiPadなどを利用する場合、アプリケーションのインストールやセットアップなどで
必要となるApple IDですが、これを会社で管理するというのは意外と難しい事が判明しました。

リスクレベルも異なりますし、ユースケースも異なる問題が多いので箇条書きでまとめてみました。

### ❏ Apple ID作成にはメールの受信環境が必要
Apple IDを既存のメールアドレスで登録する場合には、必ず必要となるのが
"メールの受信環境"です。
会社支給のiPhoneに限らずPCでも構わないのですが、確認コードが発行されますのでこの手順は避けられません。

更に、作成するApple IDが社員に対しパーソナルな物であった場合は各自メールを受信出来る環境
またはApple IDを作成・登録できる状況にある社員及び　ヒト　がやらなければなりません。

情シスとしては上記は大きな課題になる可能性があります。
***これは、Apple ID作成の対象となる社員がそれぞれメールを受信しApple IDの作成手順を踏まなければいけないからです。***


### ❏ Apple IDに対して制限ができない
iPhone / iPadは単体でも様々な機能を使うことが出来ますが、iCloudと一緒に使うことで
更に色々な機能が使えます。

例えば、電話帳の同期・iCloudバックアップ・フォトストリーム・iPhoneを探す　などです。

iPhone / iPadなどには、機能制限や管理用プロファイルがあり操作を制限できますが、
iCloudの機能を制限できることと言えば、iCloudバックアップの無効化やフォトストリームの無効化などに限られます。


これは、逆に捉えると***ユーザー次第で電話帳の同期が出来てしまう***という事です。
言い換えると***電話帳をiCloudのアカウントにアップロード出来る***という事ですね。

この機能は、一般的には便利な機能として知られていますが
会社で管理する側としては、電話帳は個人情報ですので流出しては困ります。
なので、機能をオフにするというだけではエビデンス的によろしくありません。

### ❏ Apple IDや利用端末の監査ができない
複数のApple IDを管理する事はそもそも想定されていないようです。
その為、ユーザーがどのような動きをしているのかを監査する事はできません。

もし、自分のiPhoneや他の端末にApple IDを同期させたかどうかを確認したい場合は
100ユーザー居ると仮定した場合、100個のIDでログインし1つ1つ確認する必要があります。

但し、個々のIDにログインする事ができれば、サインイン中のデバイスを表示したり
サインイン中のデバイスを切断したりする事が可能です。

これにより、もし個別に監査をする場合は多大な工数に加え
そのApple IDのパスワードを知り得ておく必要があります。

### ❏ Apple IDをパーソナルなものにしておくメリットとデメリット
これまでは不可能な事、注意点にフォーカスして書きましたがメリットも有ります。
#### ◆メリット
##### ユーザーで管理してもらえるので、管理側の手間が減る
これは、ID/パスワードを管理側で保有しておく必要がなく
更に電話帳や写真データの同期を有効にする場合は、端末の変更があった場合や
紛失の際にもデータが残るというメリットがあります。

#### ◆デメリット
##### リスキーすぎる
ユーザーが管理しなければならない情報レベルが高く、リスクが大きいという事です。
ユーザーが管理可能な情報は
・電話帳
・写真データ
・ボイスメモ
・メモ
・その他Appsのデータ
などなど、仕事で個人情報や機密情報を扱う際には最も流出してはならない分類のものです。

前回書いたMDMと併用したとしても、この情報の管理をユーザーにまかせる事は不可能に近い不可能です。


# 結果
## Apple IDは会社で管理・使用するのにトコトン向いていない
ということです。

そもそも、Appleデバイスを会社で利用する際には上記注意点が湧いて出てきますね :sweat:
いまさらdateの達人になる

気象のシミュレーションやデータ解析をしていると，日付の処理をすることが多い。シェルスクリプト，Tcl，Fortranなどで閏年や曜日を計算したり，日時を加算するプログラムを書いて使ってきた。練習問題としては良かったのかもしれないが，どうも車輪の再発明だったようだ。

`date`コマンドを使えば，日付処理が楽になることを今更ながら知った。以下はBSD (FreeBSDやmacOS)の場合。

日付のフォーマットの文字解釈（パース）や変換ができる。

```bash
$ date -jf %Y%m%d%H%M%S 20160915120000
2016年 9月15日 木曜日 12時00分00秒 JST
```

オプションの`j`は時刻の設定をしないことを，`f`は次の文字列が入力フォーマットであることを示す。入力フォーマットについて詳しくは`strftime`のマニュアル参照。`%H`までしか必要ないからといって`%M%S`を指定せず`0000`を入力しないと，現在の分秒が使われる。

```bash
$ date -jf %Y%m%d%H 2016091512
2016年 9月15日 木曜日 12時41分33秒 JST
```


[UNIX時間](https://ja.wikipedia.org/wiki/UNIX時間)は1970年1月1日00:00:00からの秒数である。出力フォーマットは`+`で指定される。

```bash
$ date -jf %Y%m%d%H%M%S 20160915120000 +%s
1473908400
```

日時を一度UNIX時間に変換すれば，加減算ができる。

```bash
$ t0=$(date -jf %Y%m%d%H%M%S 20160915120000 +%s)
$ dh=$(expr 6 \* 3600)
$ t=$(expr $t0 + $dh)
$ date -jf %s $t +%Y%m%d%H
2016091518
```

## Linux


Linuxの`date`は`-jf`でなく`-d`を使い，書式の指定はできない。

```bash
$ date -d "2016-09-15 12:00:00+00" # Linux
```

```bash
$ date -d "2016-09-15 12:00:00+00" +%s # Linux
1473908400
```

```bash
$ t0=$(date -d "2016-09-15 12:00:00+00" +%s)
$ dh=$(expr 6 \* 3600)
$ t=$(expr $t0 + $dh)
$ TZ=0 date -d @$t +%Y%m%d%H
2016091518
```

### スクリプトにまとめたもの: 
* [incrh](https://gist.github.com/tenomoto/f09922cbd304a7b4f0c7ffdc797eb45e)
* [Date conversions](https://gist.github.com/tenomoto/e994e981519d2f9d875fb0237d3fb090)

### 2020-11-30編集

* \`\`を$()に変更。
* BSDの`date`コマンドであることを記述。
* BSD/Linux date，NCL，Pythonについてのgistを追加。
cssも画像もimportしてるjsファイルのテストを書く

注意点２つほど

## babel通さないとimportでコケる

```bash
mocha ./spec/**/*.js --compilers js:babel-core/register
```

- `import`使ってる場合全般の話ですね
- mochaなどはnode.js環境で実行される
- 最新のv6でもes6 modulesはサポートしてないので、commonjsにトランスパイルする必要がある
- `--compilers js:babel-core/register`をセットすればok

## 画像やcssの読み込み箇所でエラーになる

なんでも`import...from` ( `require` ) できて便利だが、mochaとかでテスト書くとこける

```js
import style from './style.css'
import btn from '../../images/btn-back.svg'
```

- mocha（node.js環境）では読み込まれてるファイルを`.js`としてパースしようとする
- そして、パースエラー


### 対策1：`require.extensions` を使う

`require()` されたファイルの種類をチェックして、パースをスキップ

```js:./test/setup.js
require.extensions['.css'] = () => null
require.extensions['.png'] = () => null
```

- `require.extensions` はdeprecated（だが、削除しない予定らしい）

>In the past, this list has been used to load non-JavaScript modules into Node.js by compiling them on-demand. However, in practice, there are much better ways to do this, such as loading modules via some other Node.js program, or compiling them to JavaScript ahead of time.

https://nodejs.org/api/globals.html


### 対策2： require hook を使う

- `babel-core/register` や `coffee/register` で使われてるテクニック
- 自力で実装しなくても、npm pkgを使って済ませれる
  - cssは`css-modules-require-hook`
  - 画像は`images-require-hook`
  
```js:./test/setup.js
import 'css-modules-require-hook/preset'
import imgHook from 'images-require-hook'
imgHook(['.png', '.svg'], '../src/images')

```

このファイルを`---require` オプションで指定

```bash
mocha ./spec/**/*.js --compilers js:babel-core/register --require ./test/setup.js
```
boombox.jsでスプライト音声、書き出しでのエラーを解消

# boombox.jsとは
音声の再生を管理するjavascript プラグインです。
日本語ドキュメント
https://github.com/CyberAgent/boombox.js/blob/master/README_ja.md

今回音声を2つ…を再生させるのに、
使うために採用。

#sprite について
音声を結合して、軽量化。音声の場所によって再生させます。

#sprite音声の作成
https://github.com/fkei/boombox-audiosprite

boombox.jsに別でくっついているscriptをダウンロード＆設定
ドキュメントの通りに行うも
最後
```
boombox-audiosprite -e ac3,caf,mp3,m4a *.mp3
```
でエラー発生

```
env: node\r: No such file or directory

[ Failure ]

```

audiospriteでエラーが出ている様子。
下記参照によって解決
https://teratail.com/questions/29075

```
$ which audiosprite # パスを調べる
$ cd audiospriteがあるフォルダ
$ cp audiosprite audiosprite.bak # 念のためバックアップを取る
$ tr -d \\r < audiosprite.bak >audiosprite
```

あとは作成 json を boombox.js の optionに設定して完了。
エラーさえなんとかなれば簡単！