OmniAICreator/Qiita-1.07M huggingface dataset:
NodeJSが動いてるPJでPDFを作成するツールを作った話し

クライアントに対してレポートを出力してお見せしているプロジェクトにて
画面をPDF化してクライアントに送付したいという依頼があった

###環境

フロントエンド：NodeJS（表示からAPIアクセス）
バックエンド：Rails

###遭遇した問題点

- Screenshotを取得するツールやGemでは正しく画面のデータが取得出来ない
- PhantomJSなどを利用してブラウザを立ち上げる方法を探ったが取得出来たデータがまっしろ

###対応策

- 画面を新しく作ってその中でレポートを再描画しよう
- wkhtmltopdfでPDFを作成する

###学び

- wkhtmltopdfはGemだと0.8.0なのでCSSやJSがうまい具合に動いてくれない
    - サーバに直接ソースインストールしよう！最新版は0.12以降
- Rubyvis大変だけど結構たのしい
- CSSは縦版・横版分けると捗る
- SVGも読まれるので楽しい

※最後
ソースとか細い所は時間あるときにまた書こうかな
Azureのクラウドサービスのデプロイメモ


## はじめに
Azureで仮想マシンを作る際に自動作成できるから、クラウドサービスってパブリックIPの割当と負荷分散用のインターフェイスかと思っていたけど違うらしい。
ということでクラウドサービスに関する簡単なメモ。


## Azureのクラウドサービスについて
Azureで仮想マシンを扱う場合、仮想マシンを直接作るのではなく「クラウドサービス」から仮想マシンを自動作成することができる。

サービス全体のサーバ構成設定と、個々のサーバのプロビジョニングをまとめたものという印象。
メンテでのサービスの停止が許されない場合やアクセス数が多く自動スケールを柔軟に行いたい場合に有効と思う。


### 利点
* 自動スケールが容易
* サーバ構成のコード化による保守性向上
* 運用、ステージング環境が前提になっていてスワップも可能なので堅実な運用が可能

### 欠点
* サーバ構成をコードで作成する必要があるので初期セットアップに手間がかかる
* アプリケーションのデプロイでも全体のデプロイが必要
* コマンド(PowerShell)での操作が多い

### 懸念点
* サーバに対して付与できる役割がWebRoleとWorkerRoleしかない
	* DB等の永続的な保管が必要なサーバを立てることは考慮されていないらしい
		* 「SQLデータベース」や「ストレージ」を使えば良い


## 運用の流れ
運用する場合には以下のような作業が必要だと思う。

### 初期セットアップ
* クラウドサービスプロジェクトを作成
	* サーバの構成を記述
	* ロールごとにセットアップスクリプトを記述
	* 動かしたいアプリケーションを配置
* クラウドサービスのデプロイ用の設定取り込み(作業端末ごと)
* パッケージの作成
* クラウドサービスに作成したサービスをステージングにデプロイ
* 動作確認
* 運用とステージングを入れ替え

### サーバ構成・アプリケーションの更新
* クラウドサービスプロジェクトの編集
	* アプリケーションの変更
	* サーバの構成を変更
* クラウドサービスのデプロイ用の設定取り込み(未実行の場合)
* パッケージの作成
* クラウドサービスに作成したサービスをステージングにデプロイ
* 動作確認
* 運用とステージングを入れ替え

### Windowsの更新
おそらく更新を行うのではなく、構成でOSのバージョンを選択する？
* 管理画面でステージングのOSバージョンを変更
* 動作確認
* 運用とステージングを入れ替え



## デプロイの簡単な流れメモ
クラウドサービスのデプロイ時に行ったことのメモ。
今回はPHPアプリケーションを前提。

### プロジェクトの作成

	New-AzureServiceProject myProject
	
### ロールの追加

	Add-AzurePHPWebRole roleName
	Add-AzurePHPWorkerRole roleName
	
### PHPのバージョン指定

	# バージョンの確認
	Get-AzureServiceProjectRoleRuntime
	
	# バージョンの指定
	Set-AzureServiceProjectRole roleName php 5.4.0

### リモートデスクトップでの接続設定
サーバ構成の変更を直接行う必要無いので必須ではない。デバッグ等に使用。
管理画面から設定可能っぽいから必要ないかも。

Macから接続する場合は英字キーボードとして認識されてしまうので注意。

	Enable-AzureServiceProjectRemoteDesktop [username]

#### 証明書のエクスポート

	certmgr.msc
	
「個人」→「証明書」

発行者が「Windows(R) Azure(TM) Encription Tool」

* 秘密キーのエクスポート→「はい」
* エクスポートファイルの形式→「Personal Information Exchange - PKCS #12 (.PFX)」
* 任意のパスワード

#### 証明書のアップロード
管理ポータルで対象のクラウドサービスの証明書メニューでアップロード


### 発行に必要な設定の取り込み

	# 設定ファイルのダウンロード用URLを開く
	Get-AzurePublishSettingsFile

	# ダウンロードした設定ファイルを取り込む
	Import-AzurePublishSettingsFile [PATH_TO_PUBLISHSETTINGFILE]

	# 設定の確認
	Get-AzureSubscription


### パッケージの作成

	Save-AzureServiceProjectPackage


### 構成のデプロイ
管理画面からパッケージをアップロードすれば同じことができるはずだけど何故かエラーになるし詳細が出ないから原因が分からない。
同じパッケージをコマンドでデプロイすることは可能。

	Publish-AzureServiceProject -ServiceName [ServiceName] -StorageAccountName [StorageAccountName] -Slot [Slot] -Location [Location]




## 参考

PHP の Web ロールと worker ロール | Microsoft Azure
https://azure.microsoft.com/ja-jp/documentation/articles/cloud-services-php-create-web-role/#php-web-1

1.6. アプリケーションをデプロイする — Python on Windows Azure Hands-on @ PyCon JP 2012 Sprints
http://pyconjp2012-windows-azure-handson.azurewebsites.net/contents/cloudservices/deploy_application.html
bitbucket > つながらない > 理由は不明のまま直った

どうも先ほど (2015/10/15 11:00)くらいからbitbucketがつながらない。

```
fatal: unable to access .....*.git/ : The requested URL returned error: 503
```

こちらの問題かどうかは切り分けできてない。

webブラウザからはbitbucketは見えている。

<hr>
(追記 2015/10/15)

理由はわからないがつながるようになった。
GemfileでインストールしたGemを削除する

何回か調べたので備忘録的な。

1.bundleで削除
`$ bundle exec gem uninstall gemname`
Springとか使ってる場合は `./bin/bundle` を指定すれば良いと思う

2.Gemfileから削除
Gemfileから該当Gem部分を削除

3.Gemfile.lockから削除
`bundle update` または `bundle install`でGemfile.lockの中身を更新する
Seq[Future[A]]を Success のみの結果からなる Future[Seq[A]] に変換する

以下の `f1`~`f5` をひとつの `Future[Seq[Int]]` にしたいとする。

```scala
    val f1 = Future.successful(1)
    val f2 = Future.successful(2)
    val f3 = Future.failed(new UnsupportedOperationException("f3"))
    val f4 = Future.failed(new UnsupportedOperationException("f4"))
    val f5 = Future.successful(5)
    val fs = Seq(f1, f2, f3, f4, f5)
```

`scala.concurrent.Future.sequence` を使用すると、`Failure` が含まれていた場合最終的な結果が `Failure` となる。

```scala
    val r = Future.sequence(Seq(f1, f2, f3, f4, f5))
    r onComplete {
      case Success(ns) => println(ns)
      case Failure(t) => t.printStackTrace()
    }
    // java.lang.UnsupportedOperationException: f3
```

結果が `Failure` になる要素は除き、`Success` になる要素のみの `Seq` を得たい場合、どうするのがいいか。
このような関数を書いてみた。

```scala
  def sequence[A](f: Future[A]*)(implicit ex: ExecutionContext): Future[Seq[A]] = {
    Future.sequence(f.map(_.map(Some(_)).recover { case t => None })).map(_.flatten)
  }
```

これを使うと、欲しい結果は得られた。

```scala
    val r = sequence(f1, f2, f3, f4, f5)
    r onComplete {
      case Success(ns) => println(ns)
      case Failure(t) => t.printStackTrace()
    }
    // ArrayBuffer(1, 2, 5)
```

…が、もっと簡潔な書き方があったり、標準ライブラリにこれを実現する関数が用意されていたりするだろうか？
frameworkのimportを簡略化する（@importについて）

話題としてはかなり古いものになってしまうんですが、
Modulesとかsemantic importって呼ばれるものについてです。

参考 : @import vs #import - iOS 7 (http://stackoverflow.com/questions/18947516/import-vs-import-ios-7)

Appleのサンプルコードなどで、最近はimportの大半が`@import UIKit;`なんて
表現されているのに実際使っているアプリで書いてみると
エラーが出て使えないのでよく分からない記述だなと思ってたんですが
Xcode5あたりで新規作成したprojectからデフォルトでYESになっている機能だったようです。

基本的に古いprojectをベースにして開発したり、アップデートすることが多いので
これに気づくのが遅れました。普通に`#import`でも動いてたので。


この機能を利用するためには、`BuildSettings`から`Enable Modules (C and Objective-C)`をYESにする必要があります。
（※古いプロジェクトでは、デフォルトがNOになっている）

![1015ss.png](https://qiita-image-store.s3.amazonaws.com/0/34166/6d3870f2-a2af-9b0a-a10e-d2ff598de769.png)

これによって、わざわざframeworkのヘッダファイルを解析しなくて良くなるということです。
参考記事にあるように、これまで
`#import <Cocoa/Cocoa.h>` などのように書いていた箇所は 
`@import Cocoa;`で置き換えられます。

また、一部のヘッダファイルのみを呼び出したい場合も以下のように記述できるようです。
`@import iAd.ADBannerView;`
Dockerfile ビルド時間短縮 tips

ubuntu や centos などの dockerhub イメージを使って Dockerfile を書くとき、大抵の場合 apt-get update や yum update を先頭に書きます。

```
FROM ubuntu:latest
RUN apt-get update && apt-get -y upgrade && apt-get clean
```

毎回たくさんのダウンロードが実行される時間を省略するために以下をやっておきます。

ホストOS 上で docker run

```
docker run -it --name t1 ubuntu:latest 
```

コンテナ上で apt-get update など実行して exit

```
apt-get update && apt-get -y upgrade && apt-get clean
exit
```

同じ名前でイメージ作成

```
docker commit t1 ubuntu:latest ← 同じ名前でイメージ更新
docker rm t1 ← 仮コンテナを削除
```

これで Dockerfile の FROM はいじらずにビルド時間を短縮できます。
AWSにApacheとPHPを構築

## ROOTになる
インストール時にrootになってインストールします。

```
$ sudo -i
```

## Apacheインストール

```
$ yum install httpd -y
```

### Apache設定
・自動起動設定

```
$ chkconfig httpd on
```

・タイムゾーン設定

```
$ cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

・設定ファイル編集

```
$ sudo vim /etc/httpd/conf/httpd.conf
``` 
```
登録ホスト名
ServerName www.example.com:80 → ServerName localhost:80
```

・起動と接続確認

```
$ sudo service httpd start
$ sudo service httpd status
```

・ページアクセス
自分の借りているサーバのパブリックDNSで確認してね。
http://ec2-54-65-76-79.ap-northeast-1.compute.amazonaws.com/
Apacheのページが表示されればOKです。

## PHPインストール
・epelリポジトリを追加する

```
$ wget http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
$ sudo rpm -ivh epel-release-7-5.noarch.rpm
```
・remiリポジトリを追加する

```
$ wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
$ sudo rpm -ivh remi-release-7.rpm
```
・PHPをインストール

```
$ sudo yum -y --enablerepo=remi install php
```
・Apache再起動

```
$ sudo service httpd restart
```

### PHPの設定
以下の設定ファイルをいじって適当に調整しましょう。

```
$ sudo vim /etc/php.ini
```
Meteor でアカウントの新規登録のリンク(Create account)を隠す方法(accounts-ui/accounts-password)


Meteor で標準で用意されているアカウントパッケージ(accounts-ui/accounts-password)を使用した際に、ログイン機能は提供したいけども、アカウントの新規作成はさせたくない場合がありますよね。

そんなときは以下の１行を追加することで、アカウントの新規作成機能を無効化することができます。

```js
Accounts.config({ forbidClientAccountCreation : true });
``` 


### 記述前

<img src="https://qiita-image-store.s3.amazonaws.com/0/24450/16e0d7ae-5dff-d139-00cf-96089fde45f8.png" width=200 />


### 記述後

<img src="https://qiita-image-store.s3.amazonaws.com/0/24450/fadb47b1-6487-1e0d-afd4-e1e77546f35a.png" width="200" />


簡単ですね :-)


# 参考

- [Question: How to remove the 'Create User' from accounts-ui {{>loginButtons}}?](https://crater.io/posts/TWevsCYhDgWY44hC8/question-how-to-remove-the-create-user-from-accounts-ui)
- [accounts_config - Documentation - Meteor](http://docs.meteor.com/#/full/accounts_config)
word2vecの導入とデモ実行


### 概要
最近はやりのword2vecをlinux上で動かせる用に導入する手順を記録します。

### 導入

#### svnとgccのインストール

```
$ sudo yum install –y svn gcc
```

#### word2vecダウンロード

```
$ svn checkout http://word2vec.googlecode.com/svn/trunk/ word2vec
```

#### word2vecコンパイル
word2vecの場合makeのみでOKです。

```
$ cd word2vec
$ sudo make
```

#### デモ実行

```
$ sh demo-word.sh
```

このシェルスクリプトを実行すると

1. text8.zipというファイルのダウンロード
2. word2vecによりtext8を解析し、vectors.binを生成
3. vectors.binのデータを元に、指定した単語と意味が近い単語を返す、distanceを実行

```
Enter word or sentence (EXIT to break):  girl
```

てな具合で、入力した単語とベクトル距離が近い単語を抜き出してくれます。
恐ろしく簡単ですね。

### 参考文献
* http://datasection.co.jp/column/20141010/
Node.jsを簡単にデーモン化する方法


### 概要
node.jsは基本nodeコマンドで動かしますが、実稼働させるには不向きです。
なのでデーモン化して常に稼働出来るようにします。

### 利用するソフトウェア
https://github.com/foreverjs/forever
上記を使えば簡単に永続化可能になります。

### 導入手順

予めnpmをインストールする必要があります。

#### インストール

```
$ sudo npm -g install forever
```

#### 起動

```
$ sudo forever start 起動プログラム
```

#### 停止

```
$ sudo forever stop 起動プログラム
```

これで簡単にデーモン化できます。
UnityのiOSでデータダウンロード時にキャッシュされてしまう問題

これも実体験ですが、データ更新が端末によって上手くいったりいかなかったりした話。リリース済みのアプリのイベント更新が行えない！？と焦った(笑)

外部データを通信してダウンロードしてくる場合、WWWクラスを使用するかと思う。このWWWクラスがiOSではNSURLを呼んでおり、NSURLはアクセス情報をデフォルトでキャッシュする。なので、何も考えずにデータ更新を行うと、前のデータがキャッシュされててデータが更新されないって状態になる可能性がある。

上記問題のやっかいなところは、キャッシュされたりされなかったりする。端末によっても挙動が違う。完全にOSが独自に処理してるところなので、アプリ側からの干渉が出来ない。あとよくあるのが、開発中はデータは常にクリアした状態で試してたりするので、実際リリースされた後に更新されなくて気づいたり(自分はまさにこれ)。

iOSでの対応方法としてはこれ→ [NSURLRequestのキャッシュを無効にする方法](http://qiita.com/ryounagaoka/items/b637562568ce747e7249)

Unity側で自分が取った対応方法は通信時にタイムスタンプを付加する方法。

```lang:
// 以前
string url = "http://tempura.com/data.unity3d";

// タイムスタンプ追加後
string url = "http://tempura.com/data.unity3d";
url += ((url.Contains("?")) ? "&" : "?") + "t=" + DateTime.Now.ToString("yyyyMMddHHmmss");
```

これで毎回URLが変わるので、キャッシュされない。

いつどのタイミングでキャッシュ問題が起きるか分からないので、気を付けといた方がいいですよ～
乳母(ナニー)の「安心の３原則」

# 「子供に安心してもらうには３つのことを体感して貰う」
* 関心を注ぎ続ける（わたしはあなたを見ている、心にかけている）
* 安定した環境を提供する（わたしはずっとあなたの味方、不意に消えたり急激に変化したりしない）
* 秩序を守って接する（わたしはあなたをコントロールしない、尊重する）

# 注意
* 「体感」してもらわないと意味がない。
* 接し方には秩序(≒ルール)を持った方がいい
* 関心、安心、秩序の「継続」。たまに気まぐれに来るのは親戚のおばさんであって乳母ではない。
Rubyで標準入力にexitとタイプしたら終了させる


標準入力にexitかquitが入力されたときにプログラムを終了させたいときがあると思います。
でもいちいち入力時にチェックするコードを記述するのはしんどいですよね。

というわけで、こんな感じでIOクラスのgetsメソッドを上書きしちゃいます。

```ruby
class IO
  def gets
    i = super
    exit 0 if i.chomp =~ /^(quit|exit)$/ && self.tty?
    return i
  end
end

# 標準入力のテスト
puts STDIN.gets  # exitとタイプすると終了する
puts $stdin.gets # この書き方でもいける
puts gets        # この書き方だとexitとタイプしても終了しない
```

こうすると既存の記述は崩さずに、exitをタイプすればプログラムを終了させることができます。

ただ、上記の例にある通り、STDINを省略してgetsと書いた場合、exitとタイプしても終了しません（標準入力のデータは取得できます）。
どういうことかというと、STDINを省略するとIOクラスのgetsが呼ばれずに、Kernelモジュールのgetsが呼ばれてしまうからです。


なので、下記のようにObjectクラスのgetsを上書きすればいいのですが、そうすると今度はSTDIN.getsが動きません。

```ruby
class Object
  def gets
    i = super
    exit 0 if i.chomp =~ /^(quit|exit)$/
    return i
  end
end

# 標準入力のテスト
puts gets       # exitとタイプすると終了する
puts STDIN.gets # この書き方だとexitとタイプしても終了しない
```

どっちの記述も対応したい場合は両方書くしかないっぽいですね。
なんでこんな風になってるんだろう…。

## 参考
[instance method IO#gets (Ruby 2.2.0)](http://docs.ruby-lang.org/ja/2.2.0/method/IO/i/gets.html)
[gets - module Kernel (Ruby 2.2.0)](http://docs.ruby-lang.org/ja/2.2.0/class/Kernel.html#M_GETS)
Unityでデータ保存時に気をつける事 ～iOS Data Storage Guidelines～

実体験ですが、いつもAppleの審査は経験から大体気をつけなければいけないことは把握してるので、特に気にせず審査に出したのですが、見事に規約に引っかかってしまった話。

詳しくは [今こそ復習したい、iOSアプリのディレクトリ構成](http://qiita.com/tototti/items/8646405f47cc56a59722) を参考。

Unityで外部データ保存時には Application.persistentDataPath を使用するかと思うが、このパスがiOSだとiCloudでバックアップされる領域に保存される。なので、何も気にせず外部データを保存していくと審査に落ちる(2.23 – Apps must follow the iOS Data Storage Guidelines or they will be rejected)。ちなみにどのくらいの容量で審査に落ちるかは明記されていない。審査員の気分次第。なので、基本的には対策しておいた方が吉。

対応方法としては大きく分けて2種類。

(1)iCloudでバックアップされない領域にデータを保存する(tmpフォルダ等)
(2)バックアップが不要なファイルは "do not back up" attribute を付ける

(1)に関してはUnityからtmpフォルダのパスを取得するのは出来ないので自作する必要あり。
(2)はUnityがバックアップ不要設定を行うメソッドが提供されている。
自分は(2)で対応した。(1)はネイティブのパスをいじる必要があり、ちょっと危険を伴うので、Unity依存で処理が完了できる方法をとった(というかリリースに迫られた状況だったから少しでも危険を回避したかったｗ)。

```csharp:
#if UNITY_IOS
UnityEngine.iOS.Device.SetNoBackupFlag(path);
#endif
```

これだけ。pathにバックアップ不要ファイルへのパスを設定する。ディレクトリも設定出来たはず。

自分が初めてUnityアプリをリリースした2年前くらいに比べて、最近かなり審査が厳しくなってきてるので、不安因子は出来る限り消すべし！

※※※ 追記 ※※※※※※※※※
Application.temporaryCachePath を使用すれば Library/Caches 以下のフォルダパスを取得出来るか(iCloudバックアップ対象外)。ただ Caches 配下はOSによって勝手に消される可能性があるからちょっと不安ではある(;^_^A
半角カナ←→全角カナ

> [59naga/hanzen](https://github.com/59naga/hanzen) - UTF-8 halfwidth katakana interconversion functions


```js
var han= '｡｢｣､･ｦｧｨｩｪｫｬｭｮｯｰｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜﾝｶﾞｷﾞｸﾞｹﾞｺﾞｻﾞｼﾞｽﾞｾﾞｿﾞﾀﾞﾁﾞﾂﾞﾃﾞﾄﾞﾊﾞﾊﾟﾋﾞﾋﾟﾌﾞﾌﾟﾍﾞﾍﾟﾎﾞﾎﾟﾜﾞｳﾞｦﾞ';
var zen= '。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワンガギグゲゴザジズゼゾダヂヅデドバパビピブプベペボポヷヴヺ'
console.log(toZenkaku(han)===zen);// true
console.log(toHankaku(zen)===han);// true

function toZenkaku(str){
  var dakuten=  {'ｶﾞ':'ガ','ｷﾞ':'ギ','ｸﾞ':'グ','ｹﾞ':'ゲ','ｺﾞ':'ゴ','ｻﾞ':'ザ','ｼﾞ':'ジ','ｽﾞ':'ズ','ｾﾞ':'ゼ','ｿﾞ':'ゾ','ﾀﾞ':'ダ','ﾁﾞ':'ヂ','ﾂﾞ':'ヅ','ﾃﾞ':'デ','ﾄﾞ':'ド','ﾊﾞ':'バ','ﾊﾟ':'パ','ﾋﾞ':'ビ','ﾋﾟ':'ピ','ﾌﾞ':'ブ','ﾌﾟ':'プ','ﾍﾞ':'ベ','ﾍﾟ':'ペ','ﾎﾞ':'ボ','ﾎﾟ':'ポ','ﾜﾞ':'ヷ','ｳﾞ':'ヴ','ｦﾞ':'ヺ'};
  var dakutenRegExp= new RegExp('('+(Object.keys(dakuten)).join('|')+')','g');
  var zenkaku= '。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン';

  return str
  .replace(dakutenRegExp,function(str){
    return dakuten[str];
  })
  .replace(/[\uff61-\uff9d]/g,function(str){
    return zenkaku[(str.charCodeAt(0) - 0xff61)];
  })
  ;
}
function toHankaku(str){
  var hankaku= {'ァ':'ｧ','ア':'ｱ','ィ':'ｨ','イ':'ｲ','ゥ':'ｩ','ウ':'ｳ','ェ':'ｪ','エ':'ｴ','ォ':'ｫ','オ':'ｵ','カ':'ｶ','ガ':'ｶﾞ','キ':'ｷ','ギ':'ｷﾞ','ク':'ｸ','グ':'ｸﾞ','ケ':'ｹ','ゲ':'ｹﾞ','コ':'ｺ','ゴ':'ｺﾞ','サ':'ｻ','ザ':'ｻﾞ','シ':'ｼ','ジ':'ｼﾞ','ス':'ｽ','ズ':'ｽﾞ','セ':'ｾ','ゼ':'ｾﾞ','ソ':'ｿ','ゾ':'ｿﾞ','タ':'ﾀ','ダ':'ﾀﾞ','チ':'ﾁ','ヂ':'ﾁﾞ','ッ':'ｯ','ツ':'ﾂ','ヅ':'ﾂﾞ','テ':'ﾃ','デ':'ﾃﾞ','ト':'ﾄ','ド':'ﾄﾞ','ナ':'ﾅ','ニ':'ﾆ','ヌ':'ﾇ','ネ':'ﾈ','ノ':'ﾉ','ハ':'ﾊ','バ':'ﾊﾞ','パ':'ﾊﾟ','ヒ':'ﾋ','ビ':'ﾋﾞ','ピ':'ﾋﾟ','フ':'ﾌ','ブ':'ﾌﾞ','プ':'ﾌﾟ','ヘ':'ﾍ','ベ':'ﾍﾞ','ペ':'ﾍﾟ','ホ':'ﾎ','ボ':'ﾎﾞ','ポ':'ﾎﾟ','マ':'ﾏ','ミ':'ﾐ','ム':'ﾑ','メ':'ﾒ','モ':'ﾓ','ャ':'ｬ','ヤ':'ﾔ','ュ':'ｭ','ユ':'ﾕ','ョ':'ｮ','ヨ':'ﾖ','ラ':'ﾗ','リ':'ﾘ','ル':'ﾙ','レ':'ﾚ','ロ':'ﾛ','ヮ':'ﾜ','ワ':'ﾜ','ヰ':'ｲ','ヱ':'ｴ','ヲ':'ｦ','ン':'ﾝ','ヴ':'ｳﾞ','ヷ':'ﾜﾞ','ヸ':'ｲﾞ','ヹ':'ｴﾞ','ヺ':'ｦﾞ','・':'･','ー':'ｰ','。':'｡','「':'｢','」':'｣','、':'､',}

  return str
  .replace(/[\u3002\u300c\u300d\u3001\u30a1-\u30fc]/g,function(str){
    return hankaku[str];
  })
}
```

# 参考
* [Unicode 半角・全角形 - CyberLibrarian](http://www.asahi-net.or.jp/~ax2s-kmtn/ref/unicode/uff00.html)
* [UTF8 3byte(ef)](http://orange-factory.com/sample/utf8/code3-ef.html)
* [全角半角変換ツール - Web便利ツール](http://kujirahand.com/web-tools/ZenHan.php)
ためしにMarkdownでHello World

何となく見つけたプログラミングトピックスがQiitaに投稿されていて、何となく技術ブログっぽいものを再開してみたくなりました。ただ、Qiitaだけだとそのサービスが終了した場合やそれに近い状態になった時に面倒なことになりそうなので、はてなブログと相互運用することにしました。幸い両サイトともMarkdown形式で投稿することができるので、今回はお試しで投稿してみます。

#はじめに
Hello Worldと呼ばれるプログラムは、世界一有名なプログラムだそうです。確かに、初心者向けの多くのプログラミング言語の参考書には必ずその記述例が記載されていると思います。そんなHello WorldをためしにC++で書いてみます。特に方言の指定はないです。たぶん、どんなコンパイラでもC++03でもC++14でもコンパイルが通って実行できるはずです。

#Hello World
```cpp:hello_world.cpp
#include <iostream>
int main() {
    std::cout << "Hello World!" << std::endl;
}
```

#おわりに
特にないですが、槍が飛んでこないか心配です。C++はこれっきりにします。

#参考文献
[Hello world - Wikipedia](https://ja.wikipedia.org/wiki/Hello_world)
RassberyPI ibeacon化メモ

・USBはさしておく。。。

・ライブラリインストール
sudo apt-get install libglib2.0-dev libdbus-1-dev libudev-dev libical-dev libreadline6-dev

・bluezのインストール
最新版を調べる
https://www.kernel.org/pub/linux/bluetooth
5.35だったのでとりあえず。。。
wget https://www.kernel.org/pub/linux/bluetooth/bluez-5.35.tar.gz
tar xvf bluez-5.35.tar.gz
cd bluez-5.35/
./configure --disable-systemd --enable-library
make
sudo make install

・状態確認
hciconfig

hci0:	Type: BR/EDR  Bus: USB
	BD Address: 00:09:DD:40:BF:84  ACL MTU: 310:10  SCO MTU: 64:8
	DOWN 
	RX bytes:574 acl:0 sco:0 events:30 errors:0
	TX bytes:368 acl:0 sco:0 commands:30 errors:0

DOWNになってる。

sudo hciconfig hci0 up

hci0:	Type: BR/EDR  Bus: USB
	BD Address: 00:09:DD:40:BF:84  ACL MTU: 310:10  SCO MTU: 64:8
	UP RUNNING 
	RX bytes:1148 acl:0 sco:0 events:60 errors:0
	TX bytes:736 acl:0 sco:0 commands:60 errors:0

・親切な人のbeaconをDLしてビルド
cd ~
git clone https://github.com/carsonmcdonald/bluez-ibeacon.git
cd bluez-ibeacon/bluez-beacon/
make

・とりあえず動かしてみる
./ibeacon

Usage: ./ibeacon <advertisement time in ms> <UUID> <major number> <minor number> <RSSI calibration amount>

使い方が出る。

さて。。。

TODO
・bluez-ibeaconのソースを見る
・sinatraLIKEな何かでID変えて起動・停止出来るようにする
UnityでTextureを明示的に破棄

UnityのTextureクラスには破棄するためのメソッドが用意されていない。基本的には参照が消えたら勝手に破棄されるようなのだが、UnityのProfilerでよーく確認してたら参照が消えてもメモリが解放されない状態になっていた。調べていくとどうやらUnityのTextureは内部でUnity側がキャッシュしてるよう。キャッシュがどのタイミングでクリアされるか分からないが、大容量のデータを読み込む際には明示的に破棄して解放してやりたい。

Textureの破棄は、最初以下のようにしてた。

```csharp:
Resources.UnloadAsset(texture);
```

しかしこれもProfilerで確認してるとちゃんとクリアされてないよう。
いろいろ調べた結果、以下のようにすると上手くいった。

```csharp:
MonoBehaviour.Destroy(texture);
```

Unity内部でどのように処理されてるかは不明だが、Destroyの方がちゃんと破棄処理を行ってくれるよう。Destroyは参照先の情報も破棄するうんぬんの情報をどこかで見た気がするので、精度が高いのかな？

ただ上記はエディタ上でしか確認してないので、実機上ではどうなるか不明。自分が確認した限りAndroidは上記を行わなくても上手くメモリ解放されてた気がする。のちのちちゃんと調べた方がいいかもな。
Apache, nginxのaccess_logからHit数の多いドメインを抽出

まず、access_logにawkを通すときに、スペースの処理をします。
非常に便利なスクリプトがありました。
http://qiita.com/richmikan@github/items/fcf457041bb3c0e60179
https://gist.github.com/richmikan/7254345
ここからスクリプト apalognorm をwgetして、~/bin/に配置します。
それからaccess_logのフォーマットにドメイン名を追加します。
apacheの場合 %v
nginxの場合 $host

```conf:httpd.conf
   #...
   LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %D %v" combined
   #...
```

```conf:nginx.conf
   #...
   log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $host;
   #...
```

```sh:cmd
wget https://gist.githubusercontent.com/richmikan/7254345/raw/50ae183eb83f3843c273705400f18d3875dcf097/apalognorm -O ~/bin/apalognorm
chmod 755 ~/bin/apalognorm
# print $11の部分はスペース区切りで数えた12番目の項目。上記access_logのフォーマットの%vが出てくるように指定
cat /var/log/apache2/access_log | ~/bin/apalognorm | awk '{print $11}'
#上のコマンドでドメイン名だけがずらずら並ぶようになれば、あとは集計＆ソート
cat /var/log/apache2/access_log | ~/bin/apalognorm | awk '{print $11}' | sort | uniq | sort -r
```
サブドメインをワイルドカードに対応させる

よく見かける`[任意の文字列].example.com`のような設定をしてみたいと考えたのですが、やったことが無かったので検証してみました。

動かすサンプルのWebアプリとしては、簡単に動かせる`sinatra`にしようと思います。
Webサーバは使い慣れた`Apache`を使います。
アプリケーションサーバとしては`Passenger`を使います。

## 検証環境
- Apache 2.2.29
- Passenger 5.0.13
- ruby 2.2.2
- sinatra 1.4.6
- sinatra-contrib 1.4.6

※ `sinatra-contrib`は`sinatra`でcookie扱う時に必要みたいだったので入れました
※ AmazonEC2のAmazon Linuxを使っています

## この検証のゴール

- サブドメインの部分を任意に変えてアクセスできる
- アクセスしたサブドメイン部分の文字列を取得して画面に表示してみる
- サブドメイン間でcookieを共有できる事を確認する

## 実現方法

### ドメインの設定

対象のドメインに対してワイルドカードを有効にします。
今回はAレコードとして* を設定して対応しました。

設定値：*.proletariat.jp

![e4ee797a-451e-494c-a0ca-606b60611f63 copy.png (59.5 kB)](https://img.esa.io/uploads/production/attachments/1501/2015/07/15/3855/dbdf17b6-b385-45e6-a526-9d6cc434ff3f.png)

CNAMEでも設定できるので、ELBなどを使っている場合はCNAMEで同様の設定をすれば良いと思います。

### Apacheのインストール

yumでApacheをインストールしました。

### Ruby環境のインストール

rubyはrbenvでインストール。
sinatra,sinatra-contrib,passengerははgemでインストールしました。

### Apacheの設定

主にバーチャルホストの設定とPassengerの設定ですが、`/etc/httpd/conf.d`の下にそれぞれ分けて設定しました。

Apache実行ユーザとPassengerの実行ユーザは`ec2-user`に変えてあります。
（本来はApacheの実行ユーザに`ec2-user`を設定するのは不適切だと思います。）

#### passengerの設定

- /etc/httpd/conf.d/passnger.conf

```
LoadModule passenger_module /home/ec2-user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/passenger-5.0.13/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot /home/ec2-user/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/passenger-5.0.13
  PassengerDefaultRuby /home/ec2-user/.rbenv/versions/2.2.2/bin/ruby
  PassengerUserSwitching off
  PassengerDefaultUser ec2-user
</IfModule>
```

#### バーチャルホストの設定

- /etc/httpd/conf.d/vhost.conf

```
NameVirtualHost *:80
<VirtualHost *:80>
  ServerName *.proletariat.jp
  DocumentRoot /var/www/html/app/public
  RackEnv production
</VirtualHost>
```

### sinatraの配置

以下の4つのファイルを配置します。

/var/www/html/app
- config.ru
- hello.rb
- public/
- tmp/

`public`と`tmp`ディレクトリは空です。

- config.ru
 
```
require File.expand_path(File.dirname(__FILE__)) + '/hello'
run Sinatra::Application
```

- hello.rb

```
require 'sinatra'
require 'sinatra/cookies'

set :cookie_options, { domain: '.proletariat.jp', path: '/' }

get '/' do
  cookies[:access_count] = cookies[:access_count].to_i + 1
  "Hello #{request.host.split('.').first}! 只今のアクセス回数#{cookies[:access_count].to_i}"
end
```

アクセス時にサブドメインの部分とアクセス回数を表示しています。

アクセス回数はサブドメイン間で共有されたcookieから表示しています。

cookieをサブドメイン間で共有させるために、cookieのドメイン設定を`.proletariat.jp`にしています。

![スクリーンショット 2015-07-15 14.07.06.png (22.9 kB)](https://img.esa.io/uploads/production/attachments/1501/2015/07/15/3855/4af52185-f18e-485e-a710-0620a8b27738.png)

![スクリーンショット 2015-07-15 14.07.24.png (23.8 kB)](https://img.esa.io/uploads/production/attachments/1501/2015/07/15/3855/09c531d6-f5fd-493c-ade2-f4e4420208d8.png)

サブドメイン部分の文字列が表示され、アクセスカウントもサブドメイン間で共有されているのを確認しました。

## ワイルドカードのサブドメインを運用する上での注意事項
- localhostでcookieが共有されないようです(主に開発時に困る)
  - プロキシなどを使えば対応できるようです
- SSL証明書
  - SSL証明書はワイルドカードのドメインに対応したものが必要になります
- Ajaxクロスドメインリクエスト制約の問題
  - ドメインが違うため、サブドメイン間でのAjaxリクエストができません。
  - Access-Control-Allow-OriginをWebサーバ側で設定するなどの対応が必要です。
iOSのライブラリ管理(CocoaPods)

# iOSのライブラリ管理

## 検証環境
- Mac OS X El Capitan 10.11
- XCode 7.0
- Cocoa Pods 0.38.2

iOSのライブラリ管理で有名なものとして以下の２つのツールがあります。

- CocoaPods
- Carthage（カルタゴ/カッセージ）

## Cocoapods
デファクトスタンダードなCocoaのライブラリ管理ツールとしてかなり使われているようです。

## 動作に必要な環境
- Ruby
- Command Line Tools（XCode） 

## インストール方法

gemコマンドでインストールします

```
gem install cocoapods
```

## ライブラリの追加方法

Swiftのライブラリを利用する場合と、Objective-Cのライブラリを利用する場合で変わりますが、以下の手順はいずれも以下のとおりです。

### 1.初期化処理

最初に初期化処理を行います。
初期化処理を行うためにはiOSのプロジェクトディレクトリに移動して以下のコマンドを入力します。

```
pod init
```

ターゲット毎の設定が記述されたPodfileが生成されます。

### Swiftのライブラリを利用する場合の注意点

以下の条件が揃えばSwiftに対応できるようです。
- Deployment Target が 8.0 以上
- Podfile に use_frameworks! の記述を加える

### 2.Podfileへの追記

ライブラリをインストールするためには初期化処理で作成した`Podfile`にインストールしたいライブラリの名前を記述します。

以下の例はネットワークライブラリの`Alamofire`を追加した例です。

```Podfile
# Uncomment this line to define a global platform for your project
# platform :ios, '6.0'

use_frameworks!

target 'CocoaPodsApp' do
  pod 'Alamofire'
end
```

以下のようにライブラリのバージョン指定も可能です。

```Podfile
target 'CocoaPodsApp' do
  pod 'Alamofire', '3.0.0'
end
```

| 記号       | 説明                   |
|------------|------------------------|
| '0.1'      | バージョン0.1のみ      |
| '> 0.1'    | バージョン0.1より高い  |
| '>= 0.1'   | バージョン0.1以上      |
| '< 0.1'    | バージョン0.1より低い  |
| '<= 0.1'   | バージョン0.1以下      |
| '~> 0.1.2' |  0.1.xの最新バージョン |

### 3.インストールコマンドの実行

Podfileに追加した後は以下のコマンドを入力してライブラリをインストールします。

```
pod install
```

### pod installで生成されるファイルについて

`pod install`を実行すると、以下のファイルが作成されます。

- {$projectname}.xcworkspace
  - CocoaPodsでインストールされたライブラリが組み込まれた状態のワークスペースファイルで、プロジェクトを開くときはこのファイルから開く必要があります。
- Podfile.lock
  - インストールされた時点のバージョンが記述されたファイルで、環境が違っても同じバージョンのライブラリがインストール出来るようになります。
- Pods
  - ライブラリ本体が格納されるディレクトリです。

`Podfile`に`use_frameworks!`の記述を追加しないで実行すると以下の様なエラーメッセージが表示されます。

```
[!] Pods written in Swift can only be integrated as frameworks; this feature is still in beta. Add `use_frameworks!` to your Podfile or target to opt into using it. The Swift Pod being used is: Alamofire
```

このメッセージをみる限り、Swiftで書かれたライブラリをCocoaPodsのフレームワークとして統合する機能はまだベータ版のようです。

CocoaPodsでインストール可能なライブラリ名は以下のサイトで検索することができます。

```
https://cocoapods.org/
```

### 4.{$projectname}.xcworkspaceから開く

`pod install`を実行するとワークスペースが作られるので、そちらからプロジェクトを開くようにします。
元からあった`xcodeproj`から開くとビルド時に以下のようなエラーが出ます。

```
linker command failed with exit code 1 (use -v to see invocation)
```

### 5.Importして使う

これで使いたいところで以下のようにインポートして使う事ができるようになります。

```
import Alamofire
```
RecyclerViewで一番下にフォーカスを当てる

チャットみたいな感じで画面を開いた時に、一番下が表示されるようにしたかったんですが、軽くググッた範囲だとListviewでの方法しか見つけられなかったのでメモ。
http://shinodogg.com/?p=3800

しかしちゃんと書こうとするといろいろとめんどくさい気持ちが高まってきたのでメモだけ。。

```java
// いろいろ準備
private Recyclerview mMyRecyclerView;
private MyRecyclerViewAdapter mMyRecyclerViewAdapter;

mMyRecyclerView.setHasFixedSize(false);
mMyRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

mMyRecyclerViewAdapter = new MyRecyclerViewAdapter();

mMyRecyclerView.setAdapter(mMyRecyclerViewAdapter);

// 値のセット
mMyRecyclerViewAdapter.setList(mList);

// 一番下に移動する
mMyRecyclerView.scrollToPosition(mMyRecyclerViewAdapter.getItemCount()-1);
```

参考

https://developer.android.com/intl/ja/reference/android/support/v7/widget/RecyclerView.html#scrollToPosition(int)

とりあえず、画面を開いた時にあれどうすればいいんだっけ？となったら、
`RecyclerView.Adapter`の`getItemCount`と、`Recyclerview`の`scrollToPosition`を使うとよさそう。
[PyQt] 指針表明

# 少なすぎるフォロワー、投稿記事

Qiita、2015年10月15日現在
PyQtタグのフォロワー：3名
PyQtタグの投稿：6件

_**すっくねぇぇぇぇ**_


みんなGUIプログラミングって何使ってんの？
PyQt結構気に入ってるから、なんか作ったら投稿していこうと思います。

という指針表明
Alert設定のベストプラクティス


アラート設定の変更があった場合は、ダッシュボード(Event Stream)に記録しておき、万が一の時に後からレビューができるように管理しておきたいものです。

そのような場合は、アラートを設定する際に、第4セクション **"Notify your team"** の **"alert recipients when this alert is medified"** の手前のドロップダウンメニューで、`Notify`を設定しておいてください。
 
![screenshot-partlow.datadoghq.com 2015-10-14 18-04-54.png](https://qiita-image-store.s3.amazonaws.com/0/53101/7ec9ce1f-52a6-25c9-2505-364c484de45b.png "screenshot-partlow.datadoghq.com 2015-10-14 18-04-54.png")


`Notify`を設定しておくことで、Alertに変更があった場合、チームメンバーに通知が送信されると、同時にEvent streamに記録が残るようになります。

是非、設定しておいてください。
技術英語 > in every detail / at every level > exact: correct in every detail // be sensitive to employees at every level


@ CASIO EXWORD XD-N8600 の電子辞書
> exact >
correct <font color=red>in every detail</font>


http://eow.alc.co.jp/search?q=%E3%81%93%E3%81%BE%E3%82%81%E3%81%AB&ref=sa
> こまめに > 
あらゆる従業員にこまめに目を配る / be sensitive to employees <font color=red>at every level</font>


両者とも every を「詳細」という意味で使っている感じがする。

<hr>
完全に全ての詳細を扱えない場合は virtually が使えそう。

http://loe.org/shows/shows.html?programID=14-P13-00005
> virtually every @ loe > 
virtually every president has used this power

virtuallyが99.73%(3シグマ)程度なのか90%程度なのか、などのニュアンスは未調査。
[python]　__command__の使い方、機能説明


ものすごく個人的メモ。追記中。
長くなったら分割します。

## main

スクリプトとして実行されるときの\_\_name\_\_に代入されている名前

```python:sample.py
    def main():
        print 'This function only run when that is main.'

    if __name__ == '__main__':
        main()
```

## eq ne lt le gt ge

[拡張比較](http://docs.python.jp/2/reference/datamodel.html#object.__lt__ "cmp")と呼ばれる関数を意味する。
すべてのオブジェクトが持っていて、比較演算子によっても呼び出される。
`x > y`と`x.__gt__(y)`は同じ操作を意味する。

オブジェクトの比較方法を定義するにはこれら6種をすべて定義する必要があるが、
大抵の場合は定義済みの比較演算を使って定義するので、
[total_ordering](http://docs.python.jp/2/library/functools.html#functools.total_ordering "total_ordering")によって[lt,le,gt,ge]のいずれか1つと、eqの合計2つを定義すれば
あとは自動でやってくれる。

> 引用：pythonドキュメント

```python:total_ordering
@total_ordering
class Student:
    def __eq__(self, other):
        return ((self.lastname.lower(), self.firstname.lower()) ==
                (other.lastname.lower(), other.firstname.lower()))
    def __lt__(self, other):
        return ((self.lastname.lower(), self.firstname.lower()) <
                (other.lastname.lower(), other.firstname.lower()))
```

`def __eq__(self,other)`の定義文中に`==`を、すなわち`__eq__`を使っているのと
`def __lt__(self,other)`の定義文中に`<`を、すなわち`__lt__`を使っているので
あとは同様にしてうまいことやってくれる。
関数内の変数にアクセスする方法(参照渡し)

参照渡しってなんだっけ？？って言葉でわからなくても、
こういうときに使うやつか！って納得する概念。

簡単な例

```

#include <iostream>

using namespace std;

int func(int ix, int iy, int& a, int& b){

    a = ix*10;
    b = iy*10;
    
    return a;
}

int main(){
    
    //関数内の変数をここで宣言
    int a, b;
    
    int x = 3, y = 5;

    //
    func(x,y,a,b);
    
    //30 50 3 5 が出力される
    cout << a << " " << b << " " << x << " " << y << "\n";
    
}

```

関数内の変数にアクセスする方法として、
関数内で構造体を作る方法などもあるらしいですネ

swiftならタプルでチョチョイなんだけど…
Datadogで収集しているメトリクスを、Query処理する際に目から鱗が落ちた!


Datadogのユーザーサポートをしていて、面白いクエリーに出会ったので紹介しておこうとおもいます。

サポートをしていると、ユーザーの想像力の豊かさに驚かされます。そして多くの場合、こういった高度な設定要求は、jsonクエリーを直接記述することで対応できてしまします。

**「cluster内の各インスタンスの同一メトリクスを比較し、上位数個が特定条件を満たしていた」場合に、アラートを発生させたいということはありませんか？** 

```
top(avg:aws.elb.latency{*} by {host}, 2, 'max', 'desc') * 1000 > 5000
```

Datadogでは、こんな条件も`top()`ファンクションを使うことで、簡単に設定できてしまいす。上記のクエリーは、「cluser内の各elbインスタンスのレイテンシ値を順位付けし、上位2つの値を1,000倍した後、5,000と比較」しています。

cluster内に、目立って長いレイテンシのelbインスタンスが複数出現した場合に、アラートを発生させるという趣旨なのでしょう。

一見、どのように設定すれば良いだろうと思うクエリーも、Datadogが持っているファンクションを使うと意外と簡単に実現できたりします。

DatadogドキュメントのGraphing Primerページ["Arithmetic and Functions"](http://docs.datadoghq.com/graphing/#functions)のセクションは、一度は目を通して欲しいセクションです。ファンクションを散りばめたクエリーを使いこなせるようになったら、今までとは比較にならないほど高度な監視アラート設定かできることに感動すると思います。

参照:
[日本語リンク](http://docs.datadoghq.com/ja/graphing/#functions)
IplImageとMatの型変換

メディアンフィルタをかける場合を例として書いてみます

```

//main部分だけ
int _tmain(int argc, _TCHAR* argv[])
{
	IplImage *img;
	Mat dst; 

	img = cvLoadImage("ファイル名", CV_LOAD_IMAGE_GRAYSCALE); //グレースケールの部分は任意

   //IplImage型のimg -> Mat型のsrc
	Mat(src) = img;
   //srcにメディアンフィルタをかけてdstとして出力
	cv::medianBlur(src, dst, 3);
   //Mat型のdst -> IplImageのresult
	IplImage result = dst;

   //出力するときはこんな感じです
	cvShowImage("元画像", img);
	cvShowImage("処理後", &result);
   //保存する場合
	cvSaveImage("median.bmp", &result);
}

```

こんなに簡単なのに検索ですぐに見つからないので自分用にまとめてみました
Swift2対応のために調査したこととか暫定で対処したこととかその他諸々をまとめるところ


swift2対応を行ったのでその時調査したことをまとめます。
暫定対処も諸々あります！
※近々ちゃんと修正します。ひとまずメモ程度に…

## BITCODEで怒られる。
中間ファイルを生成する設定をBuildセッティングでNOにする。

```
linker command failed with exit code 1 (use -v to see invocation)
```

## enumerateが死亡
グローバル関数のenumerate関数がSeaquenseTypeの中に実装されました。
そのため

```swift
let ikasumi = ["ika", "sumi"]

for sumi in ikasumi.enumerate() {
  //なんかやる
}
```

## find()も死亡
グローバル関数のfind()はArrayクラスの内部にindexOf()として実装されました。

## RealmSwift周りのお話
RealmがSwift2のAPI変更に合わせて修正
Realmのインスタンス生成時に例外を吐くようになりました。
(権限がないとか、ローカルパスが間違ってるとか)

```swift

do {
	let realm = try Realm()
} catch let error {
	print("\(error)")
}
```

例外握り潰す場合は、、、

```swift
let realm = try! Realm()
```

対処はこんな感じになりました

```swift

class RealmService {
	func newInstance() -> Realm() {
		do {
			let realm = try Realm()
		} catch let error {
		    //なんかやる
		}
	}
}
```

## OptionSetTypeによる変更
いままでダラダラ||||||||||||||||||||||||||||||||||||で書いていたものが書きやすく見やすくなりました。
例えば

```swift
let samepleCalendar = calendar.components([.Year, .Month, .Day], fromDate: startDate)
```

## UIButtonの指定イニシャライザの変更

```swift
convenience init(type buttonType: UIButtonType)

let button = UIButton(type: .System)
```

## メソッドのいくつかがプロパティへと…
例：いままでだと

```swift
self.setTranslatesAutoresizingMaskIntoConstraints(false)
```

これからはッッッッッ！

```swift
self.translatesAutoresizingMaskIntoConstraints = false
```
UnityでAssetLabelにAssetのファイルパスを設定するエディタ拡張

Unity5でAssetBundleいじってるときにつくったもの

指定パス配下にある全AssetのAssetLabel(AssetName)にそのAssetのパスを設定するエディタ拡張 
とりあえず、AssetLabelを設定できたので良しとする
 別件だけど、Single Manifest便利



```lang:AssetMenu.cs
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.IO;

public class AssetMenu {

    [MenuItem("AssetBundles/SetBunndleName")]
    public static void SetBundleName(){

		//Pathを指定してその配下にある全ファイルのGUIDを取得
		var guids = AssetDatabase.FindAssets("", new[]{ "Assets/AssetBundles" });

		foreach (var guid in guids)
		{
			//GUIDからAssetPathを取得
			string path = AssetDatabase.GUIDToAssetPath(guid);
			//PathからAsset取得
			AssetImporter asip = AssetImporter.GetAtPath(path);
			//AssetPathを名前に設定
			asip.assetBundleName = path;
			//AssetVariantsを設定
			asip.assetBundleVariant = "バリアントがあれば設定";
		}
	}
}
```
gitlab 7.xから8.0へ更新したらログインできなくなった場合の対処

以下の内容はgitlabをmysqlを使えるように手動インストールした物をアップデートした際の出来事の個人メモです。


gitlabを7.10から8.0.4へアップデートしたらgitlabへログインする際に500エラーが発生してログインできなくなった。
log/production.logを確認したところ、audit_eventsテーブルのdetailsカラムへプロフィールの表示名(日本語)を書き込む際に`Mysql2::Error: Incorrect string value`が発生しているようだった。

そこでaudit_eventsのCHARSETをutf8に変更した所、正常にログイン出来るようになった。
あとは今後のアップデートでdb:migrateでCHARSETの書き換えが引っかからなければ問題ないはず？


以下に編集後のテーブル構造のダンプをメモしておく。


```audit_events.sql
--
-- テーブルの構造 `audit_events`
--

CREATE TABLE IF NOT EXISTS `audit_events` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `author_id` int(11) NOT NULL,
  `type` varchar(255) CHARACTER SET latin1 NOT NULL,
  `entity_id` int(11) NOT NULL,
  `entity_type` varchar(255) CHARACTER SET latin1 NOT NULL,
  `details` text COLLATE utf8_unicode_ci,
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `index_audit_events_on_author_id` (`author_id`),
  KEY `index_audit_events_on_type` (`type`),
  KEY `index_audit_events_on_entity_id_and_entity_type` (`entity_id`,`entity_type`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ;
```


これgitlabの方へIssueとか立てればいいんだろうけど、英語全く書けないから誰かが報告してくれるの期待したいな…(´・ω・)
swift2 Cocoapodsで入れてるライブラリでBitCode=NOにしろと怒られた時の対処法

実行しようとしたときにBitCODE＝NOにしろと怒られた。

Podfileに以下を記述
ターゲットごとにBitCode = NOにしていく感じ

```rb
post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['ENABLE_BITCODE'] = 'NO'
    end
  end
end
```
jQueryのajaxで通信するまでもない場合に使えるテクニック


# 解決したい課題
例えば以下のようなケースを考える。

```javascript:sample.js
//~ ~ ~ app logic ~ ~ ~

getInfo('hoge').done(function(response) {
	alert('OK!');
}).fail(function(response) {
	alert('NG!');	
});
```
```javascript:sdk.js
function getInfo(request) {
    return $.ajax({
        type : 'GET',
        url : 'http://foo.bar/' + request,
    });
}
```

WebAPIをWrapするSDKを開発するとして、ajaxの実行部分の実装を切り出して、ajaxの戻り値をそのまま返すような関数を実装したとする。

上記の`sample.js`の挙動としては、`sdk.js`の関数を呼び出してajax通信が成功したら`done`、失敗したら`fail`が呼ばれる。

ここで、`getInfo`に渡すパラメータが通信するまでもなく不正な場合、通信コストを減らすために通信する前にエラーを返す、つまりfailを呼んであげたいところ。


# SDKの実装を少し工夫する

ではajaxの実行前にパラメータチェックを入れ、アプリ側で`done`と`fail`をちゃんとハンドルできるように変更してみる。

```javascript:sdk.js
function getInfo(request) {
	if (!isValid(request)) {
		return {
			done : function() {
				return this;
			},
			fail : function(callback) {
				callback({message : 'invalid parameter'});
				return this;
			}
		};
	}
	
	return $.ajax({
		type : 'GET',
		url : 'http://foo.bar/' + request,
	});
}

function isValid(param) {
	// ~ 略 ~
}
```

こんな感じに、パラメータ不正の場合は`getInfo`の戻り値でdoneとfailのプロパティを持ったオブジェクトを返してやれば良い。

注意点としては、ちゃんとdoneも返してあげないと、アプリ側がfailよりも先にdoneを実装した場合にfailが呼ばれなくなってしまう点。doneは何もせずにthisを返せばOK。
[Node.js] ニコニコ動画APIをまとめたライブラリ作った

[node-nicovideo-api](https://github.com/Ragg-/node-nicovideo-api)というNode.js用のニコニコ動画APIラッパーライブラリを作ったので紹介します。

メソッド名とかモジュール構成がまだベストかどうかわからないところがあるのでツッコミいただけると幸いです。

## 実装されてる機能
- ログイン / ログアウト
- ユーザー情報（名前、アイコンなど）の取得
- ニコニコ動画
  - 動画情報の取得（`getthumbinfo API`, `getflv API`のラッパー）
  - マイリストの操作（一覧、動画の追加・移動削除）
- ニコニコ生放送
  - `getplayerstatus API`のラッパー
  - コメントサーバーへの接続（コメント投稿とかも）
  - Nsen用のハンドラー

## サンプルコード
２０行くらいの生放送に接続して受信したコメントを表示するCLIプログラムの例です。

``` coffeescript
Nico = require "node-nicovideo-api"

Nico.login(yourId, yourPassword)
.then (session) ->
  # loginメソッドでNicoSessionオブジェクトを取得
  # NicoSessionからAPIを叩けます。
  return session.live.getLiveInfo("lvxxxxxxx")

.then (live) ->
  # コメントサーバーへ接続
  return live.commentProvider()

.then (provider) ->
  provider.onDidReceiveComment (comment) ->
    # 制御系コメントの判定は`comment.isControlComment()`でできる
    console.log comment.comment

  return
```

![スクリーンショット 2015-10-15 0.58.33.png](https://qiita-image-store.s3.amazonaws.com/0/57508/0925d3a2-75c0-46ce-3e99-3074ee4590b6.png)

## 利用例
このライブラリを使って[Nco](https://github.com/Ragg-/nco)というニコニコ生放送内のサービス"Nsen"専用のコメントビューアを作成しています。
（元々NcoとニコニコのAPI部分がごっちゃになってたので分離してNodeのモジュールにした副産物がnode-nicovideo-apiです。）

## 参考
- [ニコニコ動画APIとは (ニコニコドウガエーピーアイとは) [単語記事] - ニコニコ大百科](http://dic.nicovideo.jp/a/%E3%83%8B%E3%82%B3%E3%83%8B%E3%82%B3%E5%8B%95%E7%94%BBapi)
- [ニコニコ API リスト wiki](http://www59.atwiki.jp/nicoapi/)
- [ニコニコ動画のAPIまとめ | Web Scratch](http://efcl.info/niconicoapi/)
- [NicoLiveAPI - ニコ★リブ Wiki - ニコ★リブ - OSDN](https://osdn.jp/projects/nicolib/wiki/NicoLiveAPI)
Electron で Open Links In Background

![qiita.gif](http://f.cl.ly/items/3K0V3p3w3n3r240P463t/qiita.gif)



TweetBot for Mac にある Open Links In Background を Electron で実装したかった。
これはアプリを最前面に維持しつつURLリンクを開く機能で、とりあえずURL開きまくって後でまとめて見たい時に便利。
実装方法としては、```shell.openExternal``` で URL を開いた直後に ```window.setAlwaysOnTop(true)``` でウィンドウをトップに持って行き、直後```window.setAlwaysOnTop(false)```で状態を戻します。
以下コード。（他にいい方法あったら教えてください）



```js:MainProcess


var ipc = require('ipc');

let window = new BrowserWindow({
  width: 600,
  height: 800,
  'always-on-top': false,
});
window.loadUrl(`file://${__dirname}/../index.html`);

ipc.on('pullToTop', () => {
  window.setAlwaysOnTop(true);
  setTimeout(() => { this.window.setAlwaysOnTop(false) }, 1000); // 1000ms より短すぎるとウィンドウが全面に来なくて微妙...
});
```


```js:RendererProcess
var ipc = require('ipc');

$(document).on('click', 'a', function() {
  shell.openExternal(this.href);
  ipc.send('pullToTop');
  return false;
});
```
スピアマン順位相関係数の計算

#スピアママン順位相関係数とは
２つ順位データに対して、相関を表す指標。
詳しくは下記のURLに書いてあるので参考に。
Wiki:[スピアマン順位相関係数](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%94%E3%82%A2%E3%83%9E%E3%83%B3%E3%81%AE%E9%A0%86%E4%BD%8D%E7%9B%B8%E9%96%A2%E4%BF%82%E6%95%B0)
朱鷺の杜Wiki:[Spearman順位相関係数](http://ibisforest.org/index.php?Spearman%E9%A0%86%E4%BD%8D%E7%9B%B8%E9%96%A2%E4%BF%82%E6%95%B0)

いくつか計算式がありますが今回は、こちらの計算式を使用します。

![式](https://upload.wikimedia.org/math/e/f/e/efe3e942b322e196b8daa8f321d1d7e2.png)

また、作ったプログラムの答え合わせには、下記のURLにあるものを使用するといいと思います。順位相関係数は有名なので調べれば他のサンプルも拾えると思います。
[スピアマンの順位相関係数 統計学入門](http://www.tamagaki.com/math/Statistics609.html)

##計算プログラム
```spearman.py
def spearman(list_a, list_b):
    N = len(list_a)                                                          
    return 1 - ((6 * sum(map(lambda a, b: (a - b) ** 2, \
    list_a, list_b) / float(N ** 3 - N) )
```
こんな感じで、簡単に計算ができます。
引数の`list`は[1,2,3...]みたいな感じで数列を作ります。
普通に、二つの数列のListを作って`zip`で渡すとできます。
numpyを使うと内包表記の部分がなくなって簡潔になります。
###
```spearman_numpy.py
import numpy
def spearman(array_a, array_b):
    N = len(array_a)
    return 1 - (6 * sum((array_a - array_b) ** 2))  / float(N**3 - N)
```

> 間違いがありましたので、owdowtのコメントを反映しました。ありがとうございます。[修正日：19/02/26]

こっちのほうが、簡潔でいいですね。
引数は、`numpy.array([1,2,3...])`みたいに数列を作ります。
pythonで数列を使う際はnumpyを使うほうが綺麗に書けます。
##例外処理
例外処理に関しては今回何も行ってません。
また、数列に同順がある際には計算式が異なるので、最初に紹介したURLを参考に。
Fluctをちょっとだけ触ってみたメモ

本当にちょっとだけね。

##Fluctをアカウント別にデプロイする

まぁ複数アカウント/ IAMユーザーで運用していたらデプロイするアカウントを変えたいこともありますよね。

	$ direnv edit .
	export AWS_PROFILE=hide-dev
	

##ローカル上でテストする
「fluct server」でローカル上の動作テストが可能になる。

	$ fluct server
	Server starting on http://127.0.0.1:3000
	
##参考
fluct FAQ:https://github.com/r7kamura/fluct/blob/master/docs/faq.md#how-to-configure-aws-credentials
RPGのターン制バトルについて設計したメモ

#目的
RPGの「生物クラス」を設計しているが、戦闘に関して「どの部分がどのクラスの役割になるのか」を切り分けたい。
[課題]
・１対多の戦闘で、生物が「行動の対象」をどう管理すべきか
・１ターンの行動後、行動結果をどう処理するか
※ これだけだと分かりづらいので、具体例は後述。
#結論
 結果を先に書くと「戦闘マネージャクラス」を作り、戦闘に関する一切を管理させるのがスムーズな設計になりそうだ。
→ じつはこれまでに書いたコードでは、「生物クラスが、攻撃対象の情報を受けてあれこれする」という設計になっており、見直しをした。
⇒ 旧設計では「生物」が「他の戦闘参加者たち」を把握しているべきだ、と考えたが、新設計では「戦闘管理者が、戦闘参加者たちを把握」することにした。（そのほうが自然）

---
#擬似コード
従来タイプでは

```javascript(cocos2d-JS版)
var Creature = cc.Class.extend({
  HP:1,		// ヒットポイント
  AI:null,  // AI（性格、行動に影響）
  …（中略）
  hurt:function(dmg){
  	this.HP -= dmg;
  },
  magic:function(magic, target){
	this.MP -= getMP(magic);	// MP減らす
	target.hurt(メラ);		  // ダメージ受ける
  }
});

var Slime = new Creature(引数）;
var Magician = new Creature(引数）;
Magicial.magic(メラ, Slime);
```
といった具合に、行動者と、被害者のことをCreatureクラスの処理内（たとえばmagicメソッド内）で、一緒くたに定義していた。
これだと、行動者が「戦闘に参加している敵全員を把握」している必要があったのだ。そこで、もう少し切り分けをして、 **戦闘管理者**クラスを作ることとした。

```javascript(cocos2d-JS版)
var BattleManager = cc.Class.extend({
  entrants:[],		// 参加者（Creatureの配列）
  …（中略）
  ctor:function(参加者){
  	this.entrants[]=参加者たち;
  	
  }
  decideTurn:function(){		// 行動順の決定
  	参加者数ループ、素早さや運の計算
  },
  decideAction:function(who){	// 行動の決定
  	AI = who.getAI();	// 行為者のAI（性格）取得
  	ret = AI.getAction(状況);  // AIに、状況に応じた行為を決めさせる
  	return ret;
  },
  doAction:function(who, action){	// 行動の実行
  	select case(action){
  		case 呪文:
  		  呪文のMPチェック→ 呪文唱える
  		  呪文の種類、攻撃対象（単体か複数かなど）
  		  for(i=0; i<対象の数; i++){
  			whoとターゲットに対し、それぞれ呪文の結果を実施
  			（ここ以下を関数化するか？）
  			・ダメージ計算（自分と対象の属性による）
  			※ 属性による増減、炎反射・半減などの耐性判定も。
  			場合によっては行為者自身も損害受けるなど
  			・結果をメッセージ表示・アニメーションなど
  			・行為者や被害者が死亡した場合（参加者配列から抜き取る等）
  		  }
  		case 物理攻撃:
  		  ※ 呪文の場合とおおむね同様
  	}
  }
});
```
CentOSへのMVAPICH2のインストール方法

## 準備
* libibverbs関連のパッケージ

```shell-session
yum install libibverbs libibverbs-devel

（※インストールできるパッケージは右記で可能→ yum list | grep libibverbs）
```

* fortranのコンパイラ

```shell-session
yum install gcc-gfortran libgfortran
```

* yacc

```shell-session
yum install byacc
```

## mvapich2のインストール
```shell-session
cd /tmp
wget http://mvapich.cse.ohio-state.edu/download/mvapich/mv2/mvapich2-2.2a.tar.gz  
gzip -dc mvapich2-2.2a.tar.gz | tar -x  
cd mvapich2-2.2a
sudo ./configure --disable-mcast
sudo make -j4
sudo make install
```
[python] コピーログを生成するコピースクリプト

GUI版できました。
[inon3135/CopyWithLog](https://github.com/inon3135/CopyWithLog)

# コピー先、コピー元をリスト化したい！

ポスターや論文なんかでデータを可視化したとき、貼り付ける画像ファイルは
ドキュメントファイルと一纏めにしておきたいです。
でもそのファイルをみながら**「このデータどれだっけ？」**なんてのはザラ。
だからファイルをコピーしたとき、コピー元とコピー先をそれぞれのフォルダにログファイルとして生成する
コピースクリプトを書いてみました。

こちらから
[https://codebreak.com/git/nozomu/CopyWithLog-python/tree/master/](https://codebreak.com/git/nozomu/CopyWithLog-python/tree/master/ "copy with log")

## 使い方

```bash:copy.py
Usage:
    copy.py [--symbol] -s <source> -o <mirror>
    copy.py [--symbol] -o <mirror> -s <source>
    copy.py -h | --help
    copy.py --version

Options:
    -h -help    Show this screen.
    -version    Show version.
    --symbol    Make mirror file as symboli link file.
    -s          Set source file
    -o          Set mirrored file (or directory)
```

```bash
    $ copy.py --symbol -s a.png -o $POSTER/fig1.png
```

copy.pyのあるディレクトリを$PATHに追加するか、pathを記述する必要があります。

a.png を $POSTER/fig1.png にコピーし、それぞれにログファイルを生成 (あるいは追記) します。
--symbolオプションだと、コピーファイルはsymbolic linkとして生成されます。

~, 環境変数 (\$name, \${name}) が利用できます。
\<mirror\> (コピー先) でファイル名を指定せず、ディレクトリパスの場合、
\<source\> と同名のファイルが生成されます[^2]。

[^2]: ディレクトリパスを指定する場合、最後は'/'で閉じている必要があります。

## log file形式=Markdown[^1]

logfile: mirror-log.md
logfile: source-log.md


>[source-log.md]: maked on mirror directory

     File name | source-path | copied date
        ---    |     ---     |     ---
    filename |   path    |   date

>[mirror-log.md]: maked on source directory

     File name | mirror-file-path | copied date
        ---    |       ---        |     ---
    filename |      path      |   date

コピー元、コピー先にそれぞれmirror-log.mdとsource-log.mdというファイルを生成します。
複数回コピーがあると、ログは追加されていきます。
ログは基本的にFile名のabc順 (大文字小文字区別なし) に並びます。

基本的にコピーは警告なく上書きされます。
また、同じコピー元、コピー先で複数回処理を行っても、すべての履歴がログに残ります。
（ファイルのアップデートは検出しません。)

[^1]: ディレクトリパスにMarkdown記号があると体裁が崩れるので変更するかも。

---

### 拡張するかも機能

ログファイルの管理をする機能が必要かもしれない。
現状、ファイルが無くなったりして意味がなくなったログファイルなんかがあっても
手動でしか消すことができない。
それだとちょっと面倒かも。


### いいわけ

適当に書いたからソースはひどいもんです。
【mbed】mbedの使い方（開封からユーザー登録まで）


# 1. 箱を開ける

外見はこんな感じ！

![01.png](https://qiita-image-store.s3.amazonaws.com/0/75221/d7990c97-16e7-e882-76ff-47a596641bd5.png "01.png")

まずは、箱を開けましょう！

![02.png](https://qiita-image-store.s3.amazonaws.com/0/75221/ba7b889f-f89c-201c-2609-9ab77318f1b9.png "02.png")

「おいっしょ！」
開けると、こんな感じになっていると思います。

![03.png](https://qiita-image-store.s3.amazonaws.com/0/75221/198362b8-ccc8-8c00-9352-5c02ca3c22a2.png "03.png")


# 2. 中身を確認

中身は、`mbed基盤`、`USBケーブル`、`クイックリファレンスカード2枚`、`説明書`、`ステッカー`

**※クリックリファレンスカードはものすごく便利です。**

![04.png](https://qiita-image-store.s3.amazonaws.com/0/75221/7031f8a0-ab54-19f3-7cf3-d51dbca283ac.png "04.png")


# 3. パソコンと接続

パソコンはWindowsでもMacでもLinuxでも構いません。今回は`Mac`で説明いたします。 
mbed基盤にUSBケーブルを繋げて、もう片方をMacに繋げます。

![05.png](https://qiita-image-store.s3.amazonaws.com/0/75221/fcbec7f9-a224-1c36-433a-a12f6be44f38.png "05.png")

Macに繋げると、mbed基盤の真ん中にある青いLEDが光だすと思います。

![06.png](https://qiita-image-store.s3.amazonaws.com/0/75221/00bd3ddb-e0c5-25ce-aee4-d0c56b29c689.png "06.png")

そして、デスクトップ上に`MBED`ドライブが表示されます。

![07.png](https://qiita-image-store.s3.amazonaws.com/0/75221/a2efa1a5-1a9d-8bf9-bc64-2e29895b8fa3.png "07.png")


**※Windowsの場合は、MBEDを認識するまでに時間がかかる場合があります。**

`MBED`ドライブをダブルクリックで開くと、`MBED.HTM`というファイルが入っていると思います。

![08.png](https://qiita-image-store.s3.amazonaws.com/0/75221/b0fe7a33-76d5-8f04-1d93-b3e97a09934d.png "08.png")

このファイルは、mbedのシリアル番号とmbedのwebページのリンク情報が入っています。


# 4. 新規登録をする

`MBED.HTM`をダブルクリックして、ログインページに飛んでもいいのですが、うまくいかな場合があるので下記リンク先よりログインページに飛んでください。

[ログインページ](https://developer.mbed.org/account/login/?next=/)

ログインページに飛んだら**「Signup」ボタン**をクリックしてください。

![09.png](https://qiita-image-store.s3.amazonaws.com/0/75221/f72d0da7-a703-f6cb-c1cf-55efae9e08c5.png "09.png")

新規登録ページに飛んだら、登録に必要な情報を入力して**「Signup」ボタン**をクリックして新規登録しましょう。

![11.png](https://qiita-image-store.s3.amazonaws.com/0/75221/adeccba1-f2b4-08ee-dedf-b9047500017c.png "11.png")

以下のような画面に飛んだら新規登録に成功です。

![12.png](https://qiita-image-store.s3.amazonaws.com/0/75221/5d985d00-cffb-955b-7d2d-e8be8f4b1a81.png "12.png")

# おわりに

ここまででユーザー登録ができましたね。
次回の記事からは、実際にプログラムを書いてmbedの使い方に慣れていきましょう。
Python でデータ可視化 - "Facet"で属性別グラフを一気に描く方法が便利すぎる


#Pythonでのグラフ描画

Pythonチャートを描く場合の定番は「matplotlib」ですが、その見た目のやや野暮ったい感じと、
表記法のややこしさが指摘されています。

そこで、この記事ではMatplotlibの機能をより美しく、またより簡単に実現するためのラッパー的存在である、「Seaborn」の使い方を取り上げます。
Seabornについてと、初歩的な使い方については下記リンクをご覧ください。

◆pythonで美しいグラフ描画 -seabornを使えばデータ分析と可視化が捗る その1
http://qiita.com/hik0107/items/3dc541158fceb3156ee0


#たくさんのグラフを一気に書く

本記事ではデータから属性の異なる複数のグラフを一気に描く方法について解説します。
例えば下記にようなイメージです。
『Walk』という属性ごとに x-step, y-positionの関係性を一気にグラフ化しています。


![image](https://qiita-image-store.s3.amazonaws.com/0/68432/25508d54-4f59-d391-60b2-eff3d54f01dc.png)

>参考)
http://stanford.edu/~mwaskom/software/seaborn/examples/many_facets.html


   

わりとデータ分析の実務でも使いたいことが多く、かなり便利なテクニックです。
・『顧客セグメント』ごとの違いを見たい
・『事業部』ごとの売上推移を見たい
・『地域』ごとの顧客動向の変化を見たい

などなど、活用の場面はいくらでも考えられます。


#『Facet』
このように属性ごとに一気にグラフ化を行う手法は『Facet』と呼ばれます。
seabornでも、"Facetgrid"という名前の関数として実装されていますし、
RやPythonの著名なグラフ描画パッケージ『ggplot』にも『Facet』という機能があります。


#やり方

ではやり方を説明していきます。
必要な下記のライブラリをインポートしておきます

```python:prepare.py
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
```

データを用意します。
seabornにはいくつかのデータセットがデフォルトでバンドルされているのでそれを使っていきましょう。
今回は『flights』というデータを使ってみます

```python:data.py
df_flights = sns.load_dataset('flights')
df_flights.head(5)
```

headでみてみると、yearとmonthでひたすら縦に伸びたデータであることがわかります。
また、数値としては乗客数の推移が見れるデータであることが見て取れます。

```python:data.py
	year	month	    passengers
0	1949	January	    112
1	1949	February    118
2	1949	March	    132
3	1949	April	    129
4	1949	May         121
```


なお、同じデータを使ったヒートマップ分析もあります。
http://qiita.com/hik0107/items/67ad4cfbc9e84032fc6b




次に、下記のようにして描画を実行します。

```python:draw.py
grid = sns.FacetGrid(df_flights, col="year", hue="year", col_wrap=4, size=5)
grid.map(sns.pointplot, 'month', 'passengers')
```

sns.FacetGridで、どのような分割でいくつのグラフを描くかをまず定義します。
今回は df_flightsというデータの 'year'という属性ごとにグラフを描くと宣言しています。(col='year' の部分）

yearは12年分（12種類）で、col_wrap=4　によって、4x3 マスで描画されます。
hue='year' は色をオシャレにするためのオプションです。無くても問題ありません。

実行結果は以下のようになります。


年々乗客数が増えているのと、徐々に7~8月くらいのピークシーズンが顕在化してきているのが
見てわかります。

![image](https://qiita-image-store.s3.amazonaws.com/0/68432/4ffba542-89e8-43e4-1a63-07d81d321836.png)




#こちらの記事も
pythonで美しいグラフ描画 -seabornを使えばデータ分析と可視化が捗る その1
http://qiita.com/hik0107/items/3dc541158fceb3156ee0

pythonで美しいグラフ描画 -seabornを使えばデータ分析と可視化が捗る その2
http://qiita.com/hik0107/items/7233ca334b2a5e1ca924

データサイエンティストに興味があるならまずこの辺りを見ておきな、って文献・動画のまとめ
http://qiita.com/hik0107/items/ef5e044d2f47940ba712