OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScript で Modified UTF-7 にエンコード&デコード

non-ASCII 文字を JSON にエンコードすると1文字6バイトになってデータ量多いよねっていうトークをした時、「じゃあエンコ前に全部 ASCII にすればいいんじゃね?」と考えて調べたら Modified UTF-7 という手頃な文字コードがあったのでエンコーダー作ってみました。

探せば既に誰かやってそうだと思ってましたがざっとググったところ UTF-7 専門エンコーダーが見当たらなかったので自作。
(一番肝心なところが最後の数行にしかないのはあまり突っ込まないでください)

### ソース
```js
/** ビットの FIFO */
var BitQueue = function() {};
BitQueue.prototype.value_ = 0;
BitQueue.prototype.length_ = 0;
BitQueue.prototype.getLength = function() { return this.length_; }
BitQueue.prototype.enqueue = function(length, value) {
	this.value_ =
		(this.value_ << length) |
		(((1 << length) - 1) & value);
	this.length_ += length;
};
BitQueue.prototype.dequeue = function(length) {
	var result;
	if(length > 0) {
		this.length_ -= length;
		result =
			(this.value_ >> this.length_) &
			((1 << length) - 1);
		this.value_ &= (1 << this.length_) - 1;
	}
	else {
		result = this.value_;
		this.value_ = this.length_ = 0;
	}

	return result;
};

/** Base64<=>文字列 のエンコーダー */
var Base64 = {
	'CODE_CHAR':
	     'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
	'PADDING': '=',
	'encode': function(str) {
		var bitQueue = new BitQueue();
		var result = '';

		for(var i = 0; i < str.length; ++i) {
			// UTF-16 1文字をエンキュー
			bitQueue.enqueue(16, str.charCodeAt(i));

			// 6bit単位でデキュー
			while(bitQueue.getLength() >= 6) {
				var ch = bitQueue.dequeue(6);

				result += Base64.CODE_CHAR.charAt(ch);
			}
		}

		// 余りには0を詰めて結果に入れる
		if(bitQueue.getLength()) {
			var remain = bitQueue.getLength();
			var ch = bitQueue.dequeue(remain) << (6 - remain);

			result += Base64.CODE_CHAR.charAt(ch);
		}
		// 結果が4n文字になるよう詰め物を入れる
		while(result.length % 4)
			result += Base64.PADDING;

		return result;
	},
	'decode': function(str) {
		var bitQueue = new BitQueue();
		var result = '';

		for(i = 0; i < str.length; ++i) {
			var ch = str.charAt(i);

			// パディングに当たったらやめちゃう
			if(ch === Base64.PADDING)
				break;

			// 文字をコードに変えてエンキュー
			bitQueue.enqueue(6, Base64.CODE_CHAR.indexOf(ch));

			// 16bitたまったらデキュー
			while(bitQueue.getLength() >= 16) {
				var ch = bitQueue.dequeue(16);

				result += String.fromCharCode(ch);
			}
		}

		// エンコの時とは異なり余りは無視しちゃう

		return result;
	}
};

/** ModifiedUTF-7<=>文字列 のエンコーダー */
var MUTF7 = {
	'encode': function(plain_str) {
		return plain_str
			.replace(/&/g, '&-')
			.replace(/[\0- \u007f-\uffff]+/g, function(str) {
				return '&' + Base64.encode(str) + '-';
			});
	},
	'decode': function(utf7_str) {
		return utf7_str
			.replace(/&([A-Za-z0-9\+\/]+=*)-/g, function(str, $1) {
				return Base64.decode($1);
			}).replace(/&-/g, '&');
	}
};
```

### 使い方
`MUTF7.encode(str)` でエンコ、
`MUTF7.decode(str)` でデコ。
結果は関数の戻り値になります。

Base64 とか BitQueue とかで既にいい感じのライブラリを導入済みであれば適当に書き換えてください。
### 参考
- Wikipedia (2015-11-05 閲覧) https://ja.wikipedia.org/wiki/UTF-7
- RFC2060 https://tools.ietf.org/html/rfc2060
oracleのimpが時間かかるとき

oracleでimpを使った際に時間がかかりすぎたので、インポートの速度を上げる方法はないか調べたら簡単な方法があったので。


imp分のパラメータにbuffer=○○○（○○○はバイト数）をつけるだけ。

これだけで数時間以上かかるインポートがものの１０分ほどで終わりました。
ちなみにbuffer=2000000（約2MB）で実施しました。

#impのデフォルトのバッファサイズがかなり小さい
調べたらデフォルトだと4096Byteらしく、そりゃ遅いわと納得。

Bufferのサイズはもう少し引き上げれるみたいですが、上限が20MBぐらいとの情報も。（古い情報かもしれませんが）

4KBから2MBになっただけでも500倍なので、それだけで十分ですが。
mysql dumpした

ただの記事メモ

http://phpspot.net/php/pgmysqldump%E3%81%A7%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%EF%BC%86%E5%BE%A9%E5%85%83.html
Raspberry Piにshairport-syncをインストールする

Raspberry PiをAirPlay対応の音楽再生機にするため、[mikebrady/shairport-sync](https://github.com/mikebrady/shairport-sync)をインストールしました。
`shairport`には複数の派生バージョンがあるため、ご注意ください。

## 1. 環境

Raspberry Piの本体は、余っていた[Model B Rev.2](http://www.amazon.co.jp/exec/obidos/ASIN/B00CBWMXVE/x7edimv35x-22/)を使用し、Linuxディストリビューションには、公式の[Raspbian(Jessie)](https://www.raspberrypi.org/downloads/raspbian/)を使用しました。

```
pi$ uname -a
Linux raspberrypi 4.1.7+ #817 PREEMPT Sat Sep 19 15:25:36 BST 2015 armv6l GNU/Linux

pi$ cat /etc/debian_version
8.0
```

また、試験用にUSBスピーカー「[Olasonic TW-S7](http://www.amazon.co.jp/exec/obidos/ASIN/B0039YOHJE/x7edimv35x-22/)」を使用しました。

## 2. インストール

公式サイトの[README.md](https://github.com/mikebrady/shairport-sync/blob/master/README.md)に従うだけで、問題なくインストールできました。
以下の内容は、Raspberry Pi向けに余分なものを排除した感じです。
基本的な流れは、以下の通り。

1. 必要なライブラリのインストール
2. ソースコードのクローン、ビルド
3. デーモン用のユーザ、グループの準備
4. インストール

今回は最新版（HEAD）をインストールしましたが、安定版が良ければタグ名などで`git checkout`してください。

```
# 必要なライブラリをインストールする
pi$ sudo apt-get update
pi$ sudo apt-get install libshairport2 autoconf libtool libdaemon-dev libasound2-dev libpopt-dev libconfig-dev avahi-daemon libavahi-client-dev libssl-dev libsoxr-dev

# ソースコードをクローンし、ビルドする
pi$ cd ~
pi$ git clone https://github.com/mikebrady/shairport-sync.git
pi$ cd shairport-sync
pi$ autoreconf -i -f
pi$ ./configure --with-alsa --with-avahi --with-ssl=openssl --with-metadata --with-soxr --with-systemd
pi$ make
pi$ ./shairport-sync --version
2.6-openssl-Avahi-ALSA-soxr-metadata

# デーモンを動かすためのユーザ、グループを作成する
pi$ sudo groupadd -r shairport-sync
pi$ sudo useradd -r -M -g shairport-sync -s /usr/bin/nologin -G audio shairport-sync

# インストールする
pi$ sudo make install

# systemdへの登録状況を確認し、有効化する
pi$ systemctl status shairport-sync
● shairport-sync.service - ShairportSync AirTunes receiver
  Loaded: loaded (/usr/lib/systemd/system/shairport-sync.service; disabled)
  Active: inactive (dead)
pi$ sudo systemctl enable shairport-sync
Created symlink from /etc/systemd/system/multi-user.target.wants/shairport-sync.service to /usr/lib/systemd/system/shairport-sync.service.
pi$ systemctl status shairport-sync
● shairport-sync.service - ShairportSync AirTunes receiver
  Loaded: loaded (/usr/lib/systemd/system/shairport-sync.service; enabled)
  Active: inactive (dead)
```

## 3. 設定

設定はお好みで。標準の`shairport-sync.conf`内に詳しい説明があります。
今回の設定内容は以下の通り。

* 表示名は「raspberrypi」（iTunesなどに表示される名前）
* 再生に使用するALSAオーディオデバイスは`plughw:1`

```
pi$ cd /etc
pi$ sudo mv shairport-sync.conf shairport-sync.conf.original
pi$ sudo sh -c 'cat << EOF > shairport-sync.conf
general =
{
  name = "raspberrypi"
}

alsa =
{
  output_device = "plughw:1"
  mixer_device  = "plughw:1"
}
EOF'
```

## 4. 起動

以下のコマンドで起動します。iTunesなどにAirPlayの再生先として表示されれば成功です。

```
pi$ sudo systemctl start shairport-sync
```

## 5. 参考

* [Multi-room audio with Raspberry Pi | Red Silico: Andy's blog](http://www.redsilico.com/multiroom-audio-raspberry-pi)
Spreeに商品レビュー機能を追加する

このSpreeエクステンションを使います。

[spree-contrib/spree_reviews](https://github.com/spree-contrib/spree_reviews/tree/3-0-stable)

## エクステンションのインストール方法

Gemfileに下記を記述して`bundle install`します。branchの部分をSpreeのバージョンに合わせるのを忘れないで下さい。

    gem 'spree_reviews', github: 'spree-contrib/spree_reviews', branch: '3-0-stable'

次に必要なファイルを生成します。下記のコマンドを実行。

    bundle exec rails g spree_reviews:install

コピーされたマイグレーションを元にDBを設定しましょう。

    bundle exec rake db:migrate

これでとりあえずは使えます。`rails s`して見てみましょう。

![spreeeee.png](https://qiita-image-store.s3.amazonaws.com/0/7323/1339213d-12fb-6ce2-e2a9-07f9c804974b.png)

商品画像の下にレビュー用の項目が表示されました！

同時に管理画面にもレビュー一覧、レビュー設定のページが新しく表示されていることと思います。

## エクステンションの日本語化

ここまででレビュー機能は使えるようになりますが、日本語のlocaleファイルがないので`translation missing`が出てしまいます。

`config/locales`にI18nファイルを設置すると日本語化のうえ表示されます。`3-0-stable`用でしたらちょっと適当な部分もありますが、私が作ってものがありますので参考にどうぞ。そのまま`locale`ディレクトリにぶちこんでも動くはずです。

[spree_reviews_ja.yml](https://gist.github.com/kamiya54/ec9af33c04aa934fecb5)

## 感想

簡単にSpreeにレビュー機能を導入でき、しかもAmazonで見る「何人がこのレビューが参考になったと言ってます」機能などもつくので便利です。

ただその分機能が豊富なので、どうしてもビューはしっかりカスタマイズしてあげる必要がありそうです。また導入したままの状態だとところどころリンク切れ等もあったので、完全な形で導入するならそこそこ手間がかかるかもしれません。
.NET Framework 4.6 に不具合

.NET Framework 4.0　がそろそろ EOL を迎えます。
そのため 4.6 に更新し、既存プログラムの検証を行っていたのですが、大量データを使用した試験で　CLR ダウンしました。

MSに調査依頼した結果、ガベージコレクターの不具合と判明しました。
GC ヒープのサイズ拡張アルゴリズムの不具合で、領域確保に失敗し CLR がダウンするそうです。

既に .NET Framework 4.6.1　RC 版が 10/29 にリリースされ、正式版は現在開発中だそうです。

更新を検討している方は、注意してください。
PillowでJPEGがMPOと判定されてしまう問題の回避策

PillowでJPEGを扱っていると何故かMPOと判定されてしまう画像に遭遇することがある。

```py
>>> from PIL import Image
>>> img = Image.open("bob 15.jpg")
>>> img.format
'MPO'
```

Pillowのgithub Issuesを検索してみると、どうやら[このIssue](https://github.com/python-pillow/Pillow/issues/1138)で報告されている問題らしい。

- https://github.com/python-pillow/Pillow/issues/1138

再現しないというコメントもあるが、僕の環境(Ubuntu 14.04.3, Python 2.7.6, Pillow 3.0.0)では再現した。

MPOを扱わないなら対処方法は簡単で、`_getmp`を無効にしてやればよい。

```py
>>> from PIL import JpegImagePlugin
>>> JpegImagePlugin._getmp = lambda x: None
>>> from PIL import Image
>>> img = Image.open("bob 15.jpg")
>>> img.format
'JPEG'
```

ちょうどDjango 1.8で`django.utils.image`が撤廃されてしまったのに困っていたので、

```py
# -*- coding: utf-8 -*-
# myapp/utils/image.py
from PIL import Image, ImageFile  # noqa

from PIL import JpegImagePlugin
JpegImagePlugin._getmp = lambda x: None

__all__ = ('Image', 'ImageFile')
```

のようなモジュールを作り、`from django.utils.image import Image`としていたところを、`from myapp.utils.image import Image`に一括で変換して、MPO問題とDjango 1.8移行への障害の一つを同時に片付けることが出来た。

そもそもMPOとはなんぞや？という点については、[Wikipedia英語版](https://en.wikipedia.org/wiki/JPEG#JPEG_Multi-Picture_Format)によると、"Multi-Picture Format"の略でJPEGを拡張して3D画像を扱えるようにした画像フォーマットということらしい。

- https://en.wikipedia.org/wiki/JPEG#JPEG_Multi-Picture_Format

Nintendo 3DSで3D写真を撮ると.mpo形式になるようなので、サービスの性質によってはMPOを正しく扱う必要があるのかも。
python/OpenCV3.0でAKAZE特徴量を用いたマッチング

# AKAZE特徴量とは
OpenCV3.0.0から追加された新しい特徴量で、OpenCV2.4時代の他の特徴点アルゴリズムよりもよいとの噂を聞きます。
参考 [AKAZE特徴量の紹介と他特徴量との比較](http://poly.hatenablog.com/entry/2014/01/06/063012)

SIFTもSURFも商用NGで使えないよ！と思っていたので、AKAZEを試してみました。

# python2.7での実装
OpenCV3.0.0のpythonの公式チュートリアル、リファレンスを参考にしても、そんなメソッドねーよとか怒られてしまうので、StackOverFlowの過去の人の質問やC++のコードを参考にしながら書きました。
pythonでOpenCV3.0.0動くサンプルがほとんどなくて苦戦した・・・


以下、標準入力に画像ファイルパスを２つ入れると、特徴点をトラッキングして、結果を画像出力してくれるサンプルです。

```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import numpy as np
import cv2
import sys

img_path = sys.argv[1]
img_path2 = sys.argv[2]

img = cv2.imread(img_path)
img2 = cv2.imread(img_path2)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

# 特徴量記述
detector = cv2.AKAZE_create()
kp1, des1 = detector.detectAndCompute(gray, None)
kp2, des2 = detector.detectAndCompute(gray2, None)

# 比較器作成
bf = cv2.BFMatcher(cv2.NORM_HAMMING)

# 画像への特徴点の書き込み
matches = bf.match(des1, des2)
matches = sorted(matches, key = lambda x:x.distance)

# 出力画像作成 表示
h1, w1, c1 = img.shape[:3]
h2, w2, c2 = img2.shape[:3]
height = max([h1,h2])
width = w1 + w2
out = np.zeros((height, width, 3), np.uint8)

cv2.drawMatches(img, kp1, img2, kp2, matches[:50],out, flags=0)
cv2.imshow("name", out)
cv2.waitKey(0)
```

# つまづいたポイント
## detectorが変わってる！
公式には、
> ```orb = cv2.ORB()```  

みたいに、使用するアルゴリズムの名前の大文字で宣言するように書かれてますが、これだと通りません。

```
detector = cv2.ORB_create()
```

のように、```{アルゴリズム名}_create```としてください。

## drawMatchesにoutImgを引数として与えなければいけない
以前および公式には、

python-tutorialには
> ```img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches[:10], flags=2)``` 
 
といった使い方だったり、
  
API Referenceでは
> Python: cv2.drawMatches(img1, keypoints1, img2, keypoints2, matches1to2[, outImg[, matchColor[, singlePointColor[, matchesMask[, flags]]]]]) → outImg  

と書かれているが、実際にこれをやると、
> TypeError: Required argument 'outImg' (pos 6) not found  

と言われてしまう。
outImgはoptionalのはずなのに、Requiredと言われる。
こちらの問題は、stackoverflowでも議論されていた。
[TypeError: Required argument 'outImg' (pos 6) not found](http://stackoverflow.com/questions/31631352/typeerror-required-argument-outimg-pos-6-not-found)

outImgをNoneにするだけでよいそうだが、気づかなかったので、わざわざ２枚の画像の大きさから、outImgを作成した。

```
# 出力画像作成 表示
h1, w1, c1 = img.shape[:3]
h2, w2, c2 = img2.shape[:3]
height = max([h1,h2])
width = w1 + w2
out = np.zeros((height, width, 3), np.uint8)
```

# 最後に
pythonでOpenCV3.0のソースを書こうとすると、リファレンス通りにいかないことがあるみたいなので、気をつけて下さい。この情報もいつまで有効かわかりません。


# 参考
* [Feature Matching(公式python tutorial)](http://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_feature2d/py_matcher/py_matcher.html?highlight=drawmatches)
* [Drawing Function of Keypoints and Matches(公式APIリファレンス)](http://docs.opencv.org/3.0-beta/modules/features2d/doc/drawing_function_of_keypoints_and_matches.html)
* [TypeError: Required argument 'outImg' (pos 6) not found - stackoverflow](http://stackoverflow.com/questions/31631352/typeerror-required-argument-outimg-pos-6-not-found)
* [AKAZE特徴量の紹介と他特徴量との比較](http://poly.hatenablog.com/entry/2014/01/06/063012)
* [iOS / OpenCV 3.0 で画像の特徴点を検出する（AKAZE, SIFT, SURF, ORB）](http://qiita.com/shu223/items/fa3cf693296e5641f771)
ウェアラブル系スタートアップ俯瞰マップで42社を分類

リンク：http://thebridge.jp/2015/11/beyond-mobile-42-wearables-startups-disrupting-fitness-apparel-and-healthcare-pickupnews

CB insights(ベンチャーキャピタルのデータベース)からウェアラブル関連のマップが掲載されてました。

以上
横並び定義メモ

dl. {
    overflow: hidden;
    zoom: 1;
}
dl.dt {
    width: 100px;/*可変 */
    float: left;
    clear: both;
    font-weight: bold;
}
dl.dd {
    padding: 0 0 5px 120px;/*dtのwidthを変えたらここも変更 */
	text-align:left;
}
Flavor毎に異なったgoogle-services.jsonをつかう

`app/src/${Flavor}/google-services.json` にFlavor毎のファイルを置く、でいけるようになりました

```
app
└── src
    ├── main
    │   ├── AndroidManifest.xml
    │   ├── java
    │   └── res
    ├── dev
    │   └── google-servicesjson.json
    ├── stg
    │   └── google-services.json
    └── prd
       └── google-services.json

```

ref: https://firebase.google.com/docs/projects/multiprojects#support_multiple_environments_in_your_android_application

下記はそれ以前の話になります

- - - - -

## GCMの導入がやさしい
[GoogleCloudMessaging(GCM)](https://developers.google.com/cloud-messaging)を使うとAndroidアプリでプッシュ通知を使うことができます

[Set up a GCM Client App on Android](https://developers.google.com/cloud-messaging/android/client)の"GET A CONFIGURATION FILE"を選ぶと、（何度もデザインの変わるGoogleDeveloperコンソールを触らずに）プロジェクトの作成、GCMの設定、認証情報を取得できます

GCMの設定としてgoogle-services.jsonをダウンロード、プロジェクトのappディレクトリ直下に配置します
あとは書かれている通りGradleやManifestを設定するとGCMを使うことができます


## .jsonをapp/に置かなければいけない
テスト環境ではこのプッシュ通知設定をつかって本番環境では〜という風に設定を切り替えたいとき、app/に設定ファイルを置く必要があるのでBuildVariantsやProductFlavorsを使ってjsonを切り替えることができません（できたら教えてください）

そこで、以下のようにgradleでjsonファイルをapp/にコピーすることで、環境ごとに異なるgoogle-servicecs.jsonを使うことができます

```build.gradle
// Flavor毎に異なるGCM設定をコピーする
gradle.taskGraph.beforeTask { Task task ->
    if (task.name ==~ /process.*GoogleServices/) {
        applicationVariants.all { variant ->
            if (task.name ==~ /(?i)process${variant.name}GoogleServices/) {
                copy {
                    from "src/${variant.flavorName}"
                    into "."
                    include "google-services.json"
                }
            }
        }
    }
}
```

gradleでapp/src/{develop, staging, product}/google-services.jsonをapp/にコピーしています

gitを使っているとコピーしたjsonが気になるので.gitignoreに入れました

```.gitignore
# Flavor毎に異なるGCM設定をコピーする
app/google-services.json
```


参考：http://stackoverflow.com/questions/30901610/how-do-i-keep-different-configurations-for-my-android-app-with-gcm-3-0
Android studioからGitHub Enterpriseでコードを開けるようにする

## 経緯

普段開発してて、コードのこの部分を他の人に見せたいなぁと思うことがよくあると思います。

vimだと、

http://motemen.hatenablog.com/entry/2014/06/05/released-git-browse-remote-0-1-0

こちらを参考に、

```
:GB
```

って打ったら開けるようにしてた。

Android studioでGitHub Enterprise使ってる時もこれしたいなぁと思ってたのだが、
ちょっとした設定だけでいけた。

## やった事

Preference→Version Control→Github

で、Hostの部分は普段使っているGitHub EnterpriseのURLを入れるだけ。

そうすると、適当なソースを右クリックした時の下の方に、
`Open on GitHub`というメニューが出てくるので、
これをクリックするとGitHub EnterpriseのURLで開いてくれる。

人にコードのこの場所！と共有する時や、issueにメモする時に地味に便利。

## Thanks

http://gihyo.jp/dev/serial/01/android_studio/0027

## その他
右クリックした時に出てくるメニューをどのショートカットを押せば出てくるか探してるんだけどイマイチわからないのでどなたかご存知な方いらっしゃいましたら教えてください。。。
ドラッグ＆ドロップでli要素の並べ替え→DB書き換え

リストの項目をドラッグ&ドロップで並び替えて、表示順をDBにUPDATEするまでの流れをめも。
タッチデバイスにも対応させました。

# jqueryとjquery-uiの読み込み[^ver]

```html
<script src="http://code.jquery.com/jquery-1.8.3.min.js"></script>
<script src="http://code.jquery.com/ui/1.11.3/jquery-ui.js"></script>
```

上下を間違えてエラーを吐くという凡ミスをやらかしました…
jqueryを先に書きましょうｗ

# D&Dが可能なリストの表示
とても簡単。

### JavaScript


```js

  $(function() {
      $(".sortable").sortable();
      $(".sortable").disableSelection();
      $("#submit").click(function() {
          var result = $(".sortable").sortable("toArray");
          $("#result").val(result);
          $("form").submit();
      });
  });

```

### html

```html
<form action="" method="post">
    <ul class="sortable">
<? for($i=1; $i<=$max_cnt; $i++) { ?>
        <li id="<?=$i?>"><?=$name[$i]?></li>
<? } ?>
     </ul>
    <input type="hidden" id="result" name="result" />
    <button id="submit">submit</button>
</form>
```

変数部分はDBから拾ってきている部分になります。
idの部分が結果として返るので処理しやすい値を格納しましょう(｀・ω・´)
ここでは順番に1,2,3...となっていることにします。

この時点で表示されてるリストはD&Dが可能です。
見た目的にはリストの入れ替えが完了する状態。

で、それをDBに反映させないことには意味がないので以下の処理を行います。

# 並び替えたリストをDBに書き込む

```php
if($_POST['result']){
	//$_POST['result']内にはliのIDが上から順番コンマ区切りの文字列で格納されています。
	//1,2,3,4 だったものを 4,2,1,3　と並び替えれば　$_POST['result']="4,2,1,3"です。
	
	$result = $_POST['result'];
	
	//順に処理するために配列に格納
	$result_array = explode(',', $result);
	
	$nom = 1; //idに対して番号を１からふる
	foreach($result_array as $no){
		//この中で適宜DBに格納する処理
		//"UPDATE テーブル名 SET no='$nom' WHERE id='$no'";
		$nom++;//$nomを１つずつ増やしていく
	}
}
```

# タッチデバイスでもD&Dを使いたい
そんなときの救世主がこいつです。
[jQuery UI Touch Punch](http://touchpunch.furf.com/)

これをDLしてリンクを貼るだけです。
直リンクはしないで！！！って書いてあるので自分の環境にDLしてリンクしましょう。

```html
<script src="js/jquery.ui.touch-punch.min.js"></script>
```
とりあえずiPhoneでは問題なく動きます。

# まとめ

* `class="sortable"`の内のid要素がコンマ区切りのresultとして飛んでくる、ということさえ押さえていれば自由自在。
* リストだけでなくテーブルの並び替え[^tbl]もいけた
* `result`の名前ももちろん変えられる
* jQuery UI Touch Punchが便利すぎる

[^tbl]: テーブルに適用するときは`<tbody>`タグが必要です！
[^ver]: 最新版`(2016/8/22現在)`の`jQuery(3.1.0)/jQueryUI(1.12.0)`でも動きました。
## 参考サイト
* [MySQLのデータをドラッグで並替（jqueryUI）のメモ　－　Qiita](http://qiita.com/tabo_purify/items/22e202ad4fc64eaec8f6)：tabo_purify様
* [jQuery UI Sortable は並び順を保存しなければ意味がない](http://hijiriworld.com/web/jquery-ui-sortable)：hijiriworld Web様
* [jQuery UIをタッチデバイスに対応させるためのライブラリ・jQuery UI Touch Punch](http://kachibito.net/web-design/jquery-ui-touch-punch.htm)：kachibito.net様
* [jQueryで簡単にドラッグ＆ドロップのソートを実装する方法](http://blog.asial.co.jp/1021)：アシアルブログ様
MegaCliのインストール

# MegaCliを使えるようにするまでの簡単な手順

## Raidコントローラの確認
```
$ lspci | grep LSI
02:00.0 RAID bus controller: LSI Logic / Symbios Logic MegaRAID SAS-3 3108 [Invader] (rev 02)
```

## MegaCliをインストールする
``` 
# wgetでrpmファイルを取ってくる
$ wget https://ginernet.com/downloads/MegaCli-8.07.14-1.noarch.rpm ```

# rpmパッケージをインストールする
$ rpm -Uhv MegaCli-8.07.14-1.noarch.rpm 
```

## MegaCliコマンドでディスク情報を確認する
```
# raid・仮想ディスクの状態確認
$ /opt/MegaRAID/MegaCli/MegaCli64 -LDInfo -Lall -Aall

# 物理ディスクの状態確認
$ /opt/MegaRAID/MegaCli/MegaCli64 -PDList -aAll
```
グラフィカルモデリングをまとめてみた。

#導入
Qiitaでもグラフィカルモデリングを題材とした記事が特にないと思いまして、
グラフィカルモデリングについて軽く概要をまとめてみました。

"いまさら聞けないグラフィカルモデリング入門"
http://www.slideshare.net/Kawamoto_Kazuhiko/ss-35483453

#１．グラフィカルモデリングの概要

##1) グラフィカルモデリングとは？
ざっくり、ベイズ推論のためのモデルです。

(さらに言うと…)
確率変数間の条件付き独立をグラフで表したものです。
条件付き独立であることがモデリングと効率的なアルゴリズムのポイントです。
(繋がりがあるが、組み合わせ爆発をしない)

##2) 潜在変数(隠れ変数)
観測可能である観測変数xに対して、
観測不能である潜在変数zを定義することで、
本来は観測されない値を表現していくことができます。

#２．グラフィカルモデリングの種類

##1)モデルの種類
マルコフ確率場：無向グラフによるグラフィカルグラフ
ベイジアンネットワーク：有効グラフによるグラフィカルモデリング

－補足－
直観的にはベイジアンネットワークの方が理解しやすいが、
・マルコフ確率場：隣接しているノードを与えればよい
・ベージアンネットワーク：子同士でも依存関係が発生している
ため、条件付き独立であるかどうかの判別が複雑であり、
マルコフ確率場の方がベイジアンネットワークより単純なモデルといえる。

##2)潜在変数の種類
マルコフ確率場の潜在変数が、
・離散確率である場合：隠れマルコフモデル
・連続確率である場合：カルマンフィルタ(正規分布)、
　　　　　　　　　　　粒子フィルタ(正規分布以外)
です。

グラフがループ構造を持つ場合に、
確率伝搬法(積和アルゴリズム)を用いることで近似解を導出できます。

#３．実装
↓解説記事が分かりやすいです。
"Python networkx でマルコフ確率場 / 確率伝搬法を実装する"
http://sinhrks.hatenablog.com/entry/2014/12/27/232506

タイトルの通り、Pythonでnetworkxモジュールを用いた実装を
画像処理を題材に組まれています。


#４．まとめ
グラフを用いることで、視覚的なモデリングができることが
グラフィカルモデリングの強みと言われていますが、
実際に強みを発揮させるには、技量が必要と感じます。



#Web広告での活用

グラフィカルモデリングと潜在変数の解説を書いたので、
今広告業界で、どのようにグラフィカルモデリングが使われているのか
今流行のネイティブアドでの活用例を、
記事と論文(Yahoo!)を元に書きたいと思います。

１．記事
【連載】インサイトをめぐる冒険(トピックモデルのネイティブ広告への活用)
第五回　コンテンツマーケティングの未来予想図
-潜在興味を追求する冒険は続く-
http://marketing.itmedia.co.jp/mm/articles/1410/02/news001.html

２．論文
論文名：トピックモデルを用いたコンテンツ連動型広告の検索
著者：山本 浩司 野口 正樹 小野 真吾 塚本 浩司　(ヤフー株式会社)
http://www.anlp.jp/proceedings/annual_meeting/2014/pdf_dir/P2-14.pdf


#１．記事紹介
##1).「Topic Marketing System」における現状の問題
###a)Topic解釈精度の向上およびスピードアップ
Topic Modelは、スピーディーかつ容易に文章要約を行うことを可能にしたが、
Topicに含まれる特徴語リストから潜在興味を読み取るには、
予備知識や想像力などの人的アナログ作業が発生するので、改善が必要。
###b)Topicからの迅速なコンテンツ生成（文脈構築）
word vec2(Google社が開発し、公開している最先端の自然言語処理技術)を用いる。
※word vec2：文章を単語に分解し、ニューラルネットワークによる
コーパス（辞書）を構築することで、単語のベクトル表現を獲得する手法
###c)ネイティブ広告との融合
ネイティブ広告プラットフォームとの融合

##2).潜在興味層へのアプローチ方法はどう変化していくか？
###a)静的から動的アプローチへ(潜在興味の変化の兆しを先取り)
動的な学習モデルを用いる必要が出てくる。
###b)ターゲティングがより高精度に
購買情報のオムニチャネル化や機械学習による行動予測の進化により、
精度の高いターゲティング広告が可能となる。


#２．論文紹介

##1)前提：
広告選択の基準には、
・コンテンツ内の単語
・広告文中の単語の類似度
がある。
　
##2)問題点：
コンテンツに適した広告があっても
コンテンツと広告とで用いられる言葉が異なっていると
広告が表示候補にならない。

##3)提案手法：
言葉のミスマッチで適切な広告を表示候補に出来ない問題を解決するため、
ページのコンテンツと広告文の双方の単語をトピックに変換する。
⇒　変換したトピック空間上で広告を検索する手法を提案した。
　
##4)論文の新規性：
単語による検索とトピックによる検索を組み合わせることで、
両者を単独で使う場合よりも広告検索の精度が向上することを示した。

##5)補足(自然言語処理とトピックモデル)

・自然言語処理：
スマニューにも使われる「自然言語処理」ってなに？(http://logmi.jp/45207)

・トピックモデル：トピックモデルことはじめ
(https://speakerdeck.com/yamano357/tokyowebmining46th)
を読めば何となく理解できるかと思います。
omreportコマンドが上手く動かない時のおまじない

**個人的にomreportコマンドが動かなくて困る時があるのでその時の対処メモ**
## omreportコマンドが上手く動かない時のおまじない
```
# omreportのパッケージを追加インストールした時にも有効
$ /opt/dell/srvadmin/sbin/srvadmin-services.sh restart
```
スマホ用のサービスの開発環境を整える【Rails】

#対象読者

Railsでスマホ向けのサービスを開発しようとしている人

#はじめに

現在のWebサイト/サービスは、スマートフォンでの閲覧が8割を超える水準になっています。

[ブラウザシェアランキング2015/6](http://mamewaza.com/support/blog/browser-share-2015.html)

つまり、これからのWebサービス開発は、
スマホ向けのレイアウトから開発していくことが先決になります。
この記事では、スマホ向けのサービスの開発スタイルを紹介します。

#スマホ向けの開発環境

##pow

### 追記: Rails5

Rails5では `puma-dev` を使っていきましょう

http://yatmsu.hatenablog.com/entry/Puma-dev

### pow 

まず、開発サーバーをpowに変更します。
powとは設定が不要のRails&Rackサーバーであり、同一LANにあるスマホであれば、ローカルの開発環境 http://localhost:3000 にアクセスできるようになります。

[開発サーバをThinからPowに切り替えて開発効率アップ！ (Mac限定)](http://morizyun.github.io/blog/pow-guard-rails/)

上記を参考に、スマホからアクセスできることを確認してください。

#guard-livereload
自分のプロジェクトにguard-livereloadを導入します。

[Railsの開発効率を上げるguard-livereloadを使ってRailsでブラウザをオートリロードさせる](http://ruby-rails.hatenadiary.com/entry/20141016/1413389293)

既存のプロジェクトに対し、上記の2から参考にしてください。
Guardのコンソールに「Browser connected.」と表示されたら、自分が見てるページのerbファイルを適当に変更します。保存すると、オートリロードを体感できるはずです。どうですか？

#一段落

さて、スマホ側はpowでアクセスでき、PC側はlivereloadでオートリロードができました。
スマホでのオートリロードに移りたいところですが、ここではしません。
なぜなら、スマホではGoogleDeveloperToolを使用できないからです。

[Web開発でよく使う、特に使えるChromeデベロッパー・ツールの機能](http://www.buildinsider.net/web/chromedevtools/01)

cssの確認・編集にデベロッパー・ツールを使いたいので、PC上でスマホ画面の開発をします。

#application.html.erbにViewportを追加
PC上でスマホ画面の開発をする際、ブラウザの横幅を最小まで狭めます。
そうすることで、スマホ用のスタイルをオートリロードで確認しつつ、開発できます。

以上で、基本的な設定は終わりです。
大まかな流れとして、

rails s
↓
ブラウザ狭める
↓
css修正
↓
livereloadでスマホ用のレイアウトを快適に開発

最後に、スタイリングをスマホで確認するため、
application.html.erbのhead要素の中にviewportを追加します。
`<meta name="viewport" content="width=device-width, initial-scale=1.0">`

これを記述しないと、スマホで確認した時に、形崩れたレイアウトが表示されると思います。
スマホユーザー8割..しかし、残りの2割も見捨てられない！
という時は、PC向けのレイアウトを別に用意します。

[Rails4.1.0以降でPC，スマホ向けに自動的にページを切り替えて表示する](http://qiita.com/windhorn/items/c149c733b57a72510982)

レスポンスブであればコードの管理は楽ですが、PCならではの魅せ方もあるとおもうので
後々PCにも対応していくことが好ましいです。



#まとめ

今回は、Railsにおけるスマホ向けのサービスの開発スタイルを紹介しました。
スマホ用のcssのスタイリングに詰まった時に、デベロッパーツールで確認することができることが強みです。
Slack をメモ代わりに使う素敵な方法

自分だけのプライベートチャンネルを作れば良い。

![スクリーンショット 2015-11-05 18.26.43.png](https://qiita-image-store.s3.amazonaws.com/0/90607/3b517441-13e8-1916-3569-d1cfbdc879df.png)


なんでも書き放題だ。

![スクリーンショット 2015-11-05 18.25.49.png](https://qiita-image-store.s3.amazonaws.com/0/90607/cdc6de46-f192-ad0b-1c18-06ee247c3a30.png)


# なぜ Slack でメモをとる？

なぜ他のメモツールを使わずに、わざわざ Slack を使うのか。

たとえば自分の場合。かなりヘヴィーに、１日中 lack を使っている。
常に Slack アプリが起動しており、すぐ手元にあるような感じだ。

なので Slack でメモを取ったほうが、**オーバーヘッドが極限に少なく、最速で「メモ書き」という行為までたどり着ける**のだ。
他のチャンネルを使う時と、共通のインターフェイス。共通のウィンドウ。共通のショートカットでメモが書ける。この気軽さは大きい。

覚えておきたいURL。コードの断片。編集中のコメント。
そういったものを、ごった煮でメモしていく。

整理されたメモというよりは「走り書き」に近い。

Slack をよく使っている。メモはとにかく速く取りたい。そんな人には特におすすめだ。




<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
リモートで削除されているブランチの情報をローカルに更新するには

# SourceTreeの時

リモートで削除されているブランチの情報を更新するには、
SourceTree側でフェッチをクリックした時に、
２番目のチェックボックスの「リモートで消えた追跡ブランチを消去」にチェックを入れて
OKを押す。

# Gitの時
git fetch -p
コンテナに外部からアクセス（ポートフォワード）

外部からコンテナにアクセスするにはポートフォワードを使うと聞いたので試してみました。
apacheにしようとしたけど設定が面倒そう、node.jsにしようとしたけどインストールまでが長かったので、公式サイトのnginxを利用することにしました。
https://hub.docker.com/_/nginx/

上から読むとずらずら何かが出てくるので、まずはnginxのWelcomeページを表示させてみます。
その後、マウントしてHello Worldのhtmlを表示させてみます。
最後にDockerfileのCOPYを使ってコンテナにコピーしてからHello Worldのhtmlを表示させます。

## runコマンドでWelcomeページを表示
* ひとまず下記のコマンドを打ってみる
　`-p`オプションで、外部からアクセスされるポート番号:コンテナ側のポート番号を指定 
　`-d`オプションはバックグラウンドで実行
<pre>
$ docker run --name some-nginx -d -p 8080:80 nginx
</pre>

* psで確認するとPORTSのところでフォワードされている
* 
```
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES
013518db8609        nginx               "nginx -g 'daemon off"   28 seconds ago      Up 28 seconds       443/tcp, 0.0.0.0:8080->80/tcp   some-nginx
``` 
* アクセスしてみる
http://localhost:8080/
ポート8080でアクセスすると、nginxのポート80にフォワードされたので、Welcomeページが表示された！
![nginx_welcome.png](https://qiita-image-store.s3.amazonaws.com/0/92328/813b50f5-1ec0-7015-b47e-7ea7ec2b7439.png)


## nginxのコンテナ停止
* 一旦nginxを落とす

```
$ docker stop 013518db8609
```

## Hello Worldをマウントして表示

* 簡単にHello WorldのHTMLファイルを用意し、/home/tiffany/nginx/index.htmlに保存
 
```html:index.html
<html>
  <head>
    <title>Hello</title>
  </head>
  <body>
    <p>Hello World!</p>
  </body>
</html>
```

* nginxを起動(今度はポートを8081にしてみる)。 
`-v`オプションで、マウント元(ローカルディレクトリ):マウント先(コンテナ側のディレクトリ)

* 
```
$ docker run --name hello-nginx -v /home/tiffany/nginx:/usr/share/nginx/html:ro -d -p 8081:80 nginx
```

* アクセスしてみる
http://localhost:8081/
Hello Worldの表示！
![nginx_hello.png](https://qiita-image-store.s3.amazonaws.com/0/92328/6ed56a9b-b2c7-1443-5d6f-22afdd353ee8.png)

## DockerfileでコンテナにHello Worldをコピーして表示

* Dockerfileの作成

```text:Dockerfile
FROM nginx
COPY html /usr/share/nginx/html
```

* はじめてのCOPYでハマった…
  ローカル側は絶対パスではなく、読み込むディレクトリはDockerfileから見た相対パス（コンテナ側は絶対パス）

```
nginx/
├── Dockerfile
└── html
　　　└── index.html
```

* ビルド

```
$ docker build -t hello-nginx .
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
hello-nginx         latest              c0f13486865d        10 minutes ago      132.8 MB
```

* nginxの実行し、一応ポートを8082番にしてみたけど上記同様にHello Worldが表示された

```
$ docker run --name hello -d -p 8082:80 hello-nginx
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES
1b734082ec74        hello-nginx         "nginx -g 'daemon off"   20 minutes ago      Up 20 minutes       443/tcp, 0.0.0.0:8082->80/tcp   hello
```
Swift版 WKWebViewのUser-Agentを変更する方法

User-Agentを変更したい！というニーズは結構あると思うのですが、UIWebViewならたくさんノウハウがあるのにWKWebViewはない...
あってもうまく機能しない...

散々探してようやく見つけました。
http://stackoverflow.com/questions/26434269/how-do-i-change-the-wkwebviews-user-agent-in-os-x-yosemite


AppDelegate#didFinishLaunchingWithOptions内に記述

```:swift
NSUserDefaults.standardUserDefaults().registerDefaults(["UserAgent" : "Custom Agent"])
```

didFinishLaunchingWithOptionsに書くのがポイント。
それにしてもUser-Agentを変えるだけでこんなに苦労するとは。
WKWebViewが主流になるまでもう少し時間がかかりそうですね。
Vagrant 1.7.3 + CentOS 7.1 で Synced Folder をNFSにすると失敗

表題の通りエラーが出て共有フォルダができない。

[OSX + Vagrant 1.7.3 + CentOS 7.1 で Synced Folder をNFSにすると失敗した話](http://qiita.com/ma2saka/items/b918dc67a3bc1c04266e)

リンク先と同じ現象だったのでvagrantのgithubみたら修正されているっぽい感じだったから1.7.4にupgradeしたらうまく動いた。

ちなみにwindowsです。
Amazon Web Services実践入門を読んだ


会社でたまたま読む機会があったので一気読みしてみた。

この本は次の章から構成されている。

1. AWSの基本知識
2. 仮想サーバの作成(EC2基本編)
3. 仮想サーバの応用(EC2応用編)
4. DNSの設定と公開(Route53)
5. ネットワークの設定と設計(VPC)
6. 画像の配信(S3/CloudFront)
7. DBの運用(RDS)
8. Webサーバの負荷分散(ELB)
9. モニタリングとWebサーバのスケーリング(CloudWatch/Auto Scaling)
10. アクセス権限の管理(IAM)
11. ビリング(Billing)

というわけで、ざっくりとこの本を読んでみた感想について書いてみる。

ちなみに自分はこの春、アプリケーションエンジニアからインフラエンジニアに転向したという経緯があり、インフラエンジニアとしてはまだまだ素人だし、AWSを触ってからまだ半年程度という立場であるということを留意してほしい。


はじめに、この本は実践入門と名打つだけあって、マネジメントコンソールの使い方やAWS CLIなど、実際のAWSリソース・サービスの操作ツールの使い方をキャプチャ画像とまとまった手順によって丁寧に解説している。
非常にわかりやすいし、この本を片手にコンソールをぽちぽちいじったり、CLIからコマンドをとりあえず実行してみて勘所を見つけていく、といった使われ方がすごく望ましいように思えた。

次に、気になった部分や印象的な部分について簡単にまとめてみる。

# AWS独自の用語について

この本は全体を通して、ツールの使い方に留まらずにサービスの基本的な概念や、対象をどう理解すべきかといったことについても触れている。

自分はVPCという概念に初めて触れて、自分の中で消化するのに少し時間がかかったが、この本ではそれがわかりやすく説明されている。

ありがちな言葉ではあるが、インフラエンジニアになってAWSを触り始めた当初に、この本を手にしていれば、と思わなくもない。

# 10章 IAM

10章はアカウントやロールのアクセス権限の管理について触れている。

IAMは、自分が実際にAWSでインフラを構築してチームを回した経験から、最も力を入れて管理すべき部分だと思っている。

この章については、インフラ担当者だけでなく、開発に関わるエンジニア全体に共有すべき内容ではないか。

一つ要望として、チームメンバーにIAMアカウントを一つずつ払い出してポリシーを設定し、どのように運用していくか、などの実践的な内容もあると良かった。

# 11章 Billing

AWSの請求・サポート周りについての情報がまとまっている。

EC2・RDSにおけるリザーブドインスタンスという考え方など、あらかじめこれらの知識を持っておいて、自分にはどういう選択肢があり、何を選択すべきなのかということを考える必要がある。

他にもAWSのサポートや、料金計算の方法についても述べられているし、エンジニアに限らずプロダクトに関わるメンバーが知っておくべき内容だと思う。

# おわりに

この本にて解説されているサービスがAWSの全てではないものの、この本を読み終える頃にはAWSのサービスを上述のコンソールやCLIを使って操作することに抵抗はなくなっていることと思う。

[Amazon Web Services実践入門 (WEB+DB PRESS plus)](http://www.amazon.co.jp/Amazon-Web-Services%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-PRESS-plus/dp/4774176737)
Serverspecにて~/.ssh/configを設定したけどIdentityFileで%hが使えない

# Serverspecを使って大量サーバでテスト！

ServerspecやAnsibleを使用して、大量のサーバへ一括テストするために`~/.ssh/config`の設定をしています


```:~/.ssh/config
Host server*
        user userA
        Hostname %h
        IdentityFile /root/.ssh/id_rsa_%h
        ServerAliveInterval 60
```

クライアント単位にキーペアを作成し、上記の設定を使って対象サーバへのログインを管理しています。（server～ に関しては`/root/.ssh/id_rsa_サーバー名`の鍵を使う）
※server1,server2…というホスト名と、id_rsa_server1,id_rsa_server1.pub…という鍵を大量作成

しかしAnsibleではうまくいくのですが、なぜだかServerspecではうまく行きません。どうやらRubyのNet::SSH::Configあたりでうまく%hが解釈できていないようです。（IdentityFileに%hがあると解釈してくれない）

[Net::SSH::Config](https://net-ssh.github.io/ssh/v2/api/classes/Net/SSH/Config.html)のリファレンスはこちら


#対策（spec_helper.rbをいじる）

`spec_helper.rb`に`options[:keys] = "/root/.ssh/id_rsa_" + host`の記載を追加しました。
これにより、SSH認証の際に指定のホスト名の鍵を参照するようになります。


```ruby:spec_helper.rb
#  begin
#    require 'highline/import'
#  rescue LoadError
#    fail "highline is not available. Try installing it."
#  end
#  set :sudo_password, ask("Enter sudo password: ") { |q| q.echo = false }
#else
#  set :sudo_password, ENV['SUDO_PASSWORD']
#end

host = ENV['TARGET_HOST']

options = Net::SSH::Config.for(host)
options[:keys] = "/root/.ssh/id_rsa_" + host

options[:user] ||= Etc.getlogin

set :host,        options[:host_name] || host
set :ssh_options, options

# Disable sudo
# set :disable_sudo, true


# Set environment variables
# set :env, :LANG => 'C', :LC_MESSAGES => 'C'

# Set PATH
# set :path, '/sbin:/usr/local/sbin:$PATH'


```
【AWS】CloudWatch/Lambda/SlackでEC2監視＆通知

AWSのEC2をCloudWatch/Lambda/Slackで監視＆通知します。

# 事前準備

- 監視する対象のEC2を作成して下さい。
- SlackにIncoming WebHooksを追加して下さい。

# SNS作成
この後作成する監視ルールに検知された時に発生するアラームの送信方法を作成します。
SNSの「Create Topic」を選択して、好きな名前を入力します。

# Lambda作成
今回初のLambda！緊張します・・・

まずはLambdaを選択して、「Create a Lambda Function」です。
すると四角い箱がたくさん出てきます。
![Screenshot from 2015-11-05 17:05:24.png](https://qiita-image-store.s3.amazonaws.com/0/86389/6132ab38-b5bc-7cd7-07ff-e6156e54ad7a.png)

これはblueprint、要はテンプレートのようなモノです。
試しに今回は「sns-message」を選択しました。

すると２つの項目が出現します。

- Event source type
- SNS Topic

Event source typeはSNSのまま、SNS Topicに先程作成したToipcを選択してNext。
するとソースコード編集画面に遷移します。

デフォルトではNode.jsが選択されているので、Node.jsのソースコードが記述されていますね。
このソースだとログ出力のみなので、今回はカスタマイズしてSlackに送信するようにします。
ソースコードは以下を参考にしました。

>https://gist.github.com/JeffRausch/15eeec45d36684cdf828/ffc0f8d74394d2bbfd8fa84dc02f467a9c0c05eb

```node.js
console.log('Loading function');

const https = require('https');
const url = require('url');
const slack_req_opts = url.parse('SlackのIncoming WebHooksのURL');
slack_req_opts.method = 'POST';
slack_req_opts.headers = {'Content-Type': 'application/json'};

exports.handler = function(event, context) {
    (event.Records || []).forEach(function (rec) {
        var req = https.request(slack_req_opts, function (res) {
            if (res.statusCode === 200) {
                context.succeed('posted to slack');
            } else {
                context.fail('status code: ' + res.statusCode);
            }
        });

        req.on('error', function(e) {
            console.log('problem with request: ' + e.message);
            context.fail(e.message);
        });

        var message = JSON.parse(rec.Sns.Message);
        var status = message.NewStateValue;
        if (status === "ALARM") {
            status = ":exclamation: " + status;
        }
        if (status === "OK") {
            status = ":+1: " + status;
        }
        var str = "*" + status + ": " + message.AlarmName + "*" + "\n" +
                    message.AlarmDescription + "*" + "\n" +
                    message.NewStateReason;
                    
        req.write(JSON.stringify({text: str}));

        req.end();
        
    });
};
```

後は自身の設定をしていくと登録されます。
また、先程SNSのTopicを選択して作成したので、そのTopicのSubscriptionが自動で作成されます。


# 監視ルール作成 CloudWatch
作成したEC2のMonitaringでAlarmを作成します。
手っ取り早いのは
EC2 -> EC2 DachBoad -> Running Instances -> インスタンス一覧からインスタンス選択 -> 画面下部のMonitoringタブ -> Create Alarm

作成する際の「Send a notification to」に作成したSNS Topicを選択して下さい。
今回私はCPUのUtilizationが80%以上のアラームを作成しました。

# TEST
以下コマンドを実行して、Slackに通知が来れば完了です！

>aws cloudwatch set-alarm-state  --alarm-name アラーム名 --state-reason "initializing" --state-value ALARM
Unite.vimのgrepでjvgrepを使う


## はじめに
[unite.vimのgrep検索にhighwayを使う](http://qiita.com/8398a7/items/021e5369ce2d7c269fe0)という記事があったのですが、[jvgrepは安定して早い #宣伝乙](https://twitter.com/mattn_jp/status/656354648987570176)とのことだったので[jvgrep](https://github.com/mattn/jvgrep)を使うことにしてみました。

## jvgrepのインストール
jvgrepはgo製なのでgoの環境構築さえしてあれば、`go get`でインストールできます。

```shell
go get github.com/mattn/jvgrep
```

macの人はbrewでもインストール可能です。

```shell
brew install jvgrep
```

## .vimrcの設定

.vimrcに下記設定を記載してください。

```vim:.vimrc
" grep検索のショートカット
nnoremap <silent> ,g  :<C-u>Unite grep:. -buffer-name=search-buffer<CR>

" unite grepにjvgrepを使う
if executable('jvgrep')
    let g:unite_source_grep_command = 'jvgrep'
    let g:unite_source_grep_default_opts = '-r'
    let g:unite_source_grep_recursive_opt = '-R'
endif
```

.git系のファイルはデフォルトで検索しないようになっているので、そこだけ注意してください（検索対象にすることはほぼないと思いますが）。

## 使い方

あとはノーマルモードで`,g`を入力すると、コマンドラインに

```vim
Pattern: 
```

と表示されるので、grepしたい文言を入力してEnterすればjvgrepを使って検索してくれます。
べんり。
undefined method `sweep`エラーが出るようになった

### Railsを起動するとundefined method `sweep`エラーが出る
- chrome F12で開発ツール起動
![sweep.png](https://qiita-image-store.s3.amazonaws.com/0/90015/c457ea5d-24eb-63a2-bac8-d81446be6abe.png)

- Resources⇒Cookies⇒Railsで使用しているIP選択

- xxx～_sessionを選択して右クリック⇒Delete選択 

動くようになる
パイプライン構築支援フレームワーク Pyblish 入門 その１ 概説編

# pyblish とは

公式サイト： http://pyblish.com/
動作ムービ： https://www.youtube.com/watch?v=j5uUTW702-U
動作ムービ： https://www.youtube.com/watch?v=-MKujcU88W8
説明： https://github.com/pyblish/pyblish/wiki/What-is-publishing
開発ガイド： https://pyblish.gitbooks.io/developer-guide/content/

[Abstract Factory社](http://abstractfactory.io/Home) の開発する、映像・ゲーム制作向けの **パイプライン構築支援フレームワーク** 。単体でも、DCCにも組み込みでも動く。Shotgun / FTrack / 5th Kind / Tactic などとは *違い* 大規模な管理を狙うものではない。名前の通り出力データに対する、ミニマムな品質管理を主眼におき、些細な問題の早期発見と解決を目指す。つまり pyblish はデータ作成上の各工程に対しpublish前に不都合がないかを検証し、自動的にパイプラインに流していくためのフレームワーク。共通の一つの成果物を目指し異なる部品を組み上げていく開発者達が、日々のコンテンツ開発で遭遇する問題に対峙し、退治するためことを目的としている。

コアはただのフレームワークなので、パイプラインに必要な実際の挙動の実装は利用者で行う必要がる。現時点で使用可能な組み込み版は Houdini, Maya, Nuke, hiero と基本的に映像向け。が、その概念や機能は他業種であっても有用だろう。

ゲーム・映像制作におけるパイプライン構築自体については、長舩龍太郎さんの[CEDEC2014のスライド](http://www.slideshare.net/ryutaroosafune/cedec2014-pfg-slideshare-38869451) [^1]や、ボーンデジタル刊の[書籍](http://www.borndigital.co.jp/book/5160.html) [^2]や、北田栄二さんによるその[書評]
(http://eijikitada.blogspot.jp/2014/09/blog-post_26.html) [^3]、0303さんの[記事](http://qiita.com/0303/items/8bb3b72bfabd8b00cfb7) [^4] などを参照されたい。

[^1]: [【CEDEC2014】アセットパイプラインを構築する上で重要な事～映像業界⇔ゲーム業界双方の視点から見た本質的なパイプライン](http://www.slideshare.net/ryutaroosafune/cedec2014-pfg-slideshare-38869451)
[^2]: [ゲーム・映像制作パイプライン構築マニュアル](http://www.borndigital.co.jp/book/5160.html)
[^3]: [【書評】 ゲーム・映像制作 パイプライン構築マニュアル](http://eijikitada.blogspot.jp/2014/09/blog-post_26.html)
[^4]: [パイプライン策定ガイドライン [WIP]](http://qiita.com/0303/items/8bb3b72bfabd8b00cfb7)

まずは以下に利点欠点について触れておく。

### 利点
もちろん、pyblishに限らずこのような品質管理を狙い、各種 validation をかける仕組みは各々保有することと思う。pyblish が他と異なる点は、

* チェッカ単体として提供されているのではなく、フレームワークである
* 設定如何によりどのように振る舞わせるかを自在にかえられる
* 筆者の寡聞ではあるが（OSSな）類似フレームワークの存在を知らない

チームで使用する際、担当パート、データにより、必要なチェッカのみ走るようにすることができる。不要なチェッカを手動でオフにする必要が無い。

pyblish を使う上での制約でもあるが、以上により制作環境、フローを揃え管理することができる。

### 欠点
* ドキュメント不足
* 導入の敷居の高さ
* 開発途上
* 実動作を担うプラグインは自分で用意する必要がある。（サンプルは存在するが）
* セットアップの煩雑さ

# 構成

https://github.com/pyblish/pyblish/wiki/How-it-works

pyblish 本体は各種のモジュールより構成され、大別してa:コア b:OS  c:DCCアプリ統合 にレイヤ分けできる。 https://github.com/pyblish のレポジトリ一覧を見ればつかめるだろう。

pyblish 本体では動作の枠組みを提供し、実動作はエクステンション（以後 pyblishエクステンションと表記する）として実装。pyblish本体は設定に従い pyblishエクステンションに実装された機能を作動させる。エクステンションのレファレンス実装例として、

 * https://github.com/pyblish/pyblish-magenta
 * https://github.com/pyblish/pyblish-napoleon

が存在する

pyblishプラグインには4つのタイプ、つまり出来ることがある。処理順に、

* collection
* validation
* extraction
* integration

#### collection
収集 ― publish するものについての情報を収集し、以後の段階に備える。マシンへのログインユーザ名、日付、開いているシーンはいかなる種類のファイルか、どのようなブツがシーン上に存在するか、など。

#### validation
検証 ― 収集したデータに対し検証を行う。一番重要なフェイズ。例えば、ノードが命名規則に従っているか、単位系は正しいか、空のレイヤがないか、などなど。

#### extraction
抽出 ― 検証されたデータから、必要となるものを保存する。validation 通過しないとこのフェイズは実行されない。

#### integration
統合 ― 抽出され保存されたデータを、他の環境・パイプラインに向け統合する。例えば、何らかのデータベースに登録、vcsへの保存、タスクトラッキングシステム記録、データのコンバート、などなど


以後、実際の導入についてや動作について記事作成予定。いつになるかは未定

---
忘備録 git


```
git init
git add .
got commit -m 'asdfasdf'

git remote add origin git@github.com:tommottom/test.git

git push origin master

ブランチ全部をpushするときは

git push -u origin master
```

リモートレポジトリの名前の変更

```
git remote rm origin
git remote add origin git@github.com:tommottom/test.git
git push -u origin master
```
Atomのツリーに表示されないフォルダやファイルがある？

tree-viewの設定によっては、.gitignoreの対象になっているフォルダやファイルがツリーに表示されない場合があります。

# gitignoreされたファイルを表示する方法

<img width="1086" alt="Settings_-__suin_Dropbox_open_blog_-_Atom.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/d0f8b334-f011-edc1-1c93-c698409cb8b5.png">
「Ruby on Rails Tutorial 3.6 高度なセットアップ」について


# はじめに
「Ruby on Rails Tutorial 3.6 高度なセットアップ」を試したときの個人的なメモ．

3.6.1は，自分の環境はWindowsなので，スキップした．また3.6.4は，自分はAtomを使ってるので，パス．

# 3.6.2 Guardによるテストの自動化

Gemfileへのguardとguard-rspecの追加はバージョン指定を外した（自分の環境では依存性の警告みたいなものがでるので）．

リスト3-35の追加は

```ruby
guard :rspec, cmd: "bundle exec rspec" do
    ....
    ....
end
```

の外側でいいみたい．

# 3.6.3 Sporkを使ったテストの高速化

Gemfileへの追加部分で，childprocessに関してはバージョン指定外す．外さないとbundle installで文句言われた．

guard-sporkに関してもバージョン指定を外したほうが良いよう．そうしないとbundle exec sporkを実行するとエラーが出る．

drbオプション付けて以下のコマンドを実行．

```
$ bundle exec rspec spec/requests/static_pages_spec.rb --drb
```

ここで

「NameError: uninitialized constant RSpec::Core::CommandLine」

とエラーが出る．[sporkでNameError: uninitialized constant RSpec::Core::CommandLineになる時の対処法](http://qiita.com/etmnk/items/e1aa63b2f7f5615ac834)によると対処法があるが，sporkのGem自体をいじる必要があるらしいので，私はここであきらめることにした．
webコンテンツ編集ユーザーとディレクトリのパーミッション


```
本稿はCentOS+Apacheを前提に記載しています。
webサーバを構築する際にとりあえず押さえておく事項のメモです。
バーチャルホスト関係も今後記載予定。
```
#webコンテンツ編集ユーザーの作成
※ webコンテンツ作成/編集可能ユーザーを`www-user`とする。

```Bash:
#ユーザー追加
useradd www-user
#パスワード作成
passwd www-user

```
# apache実行ユーザーの確認
httpd.confファイルにて**User**と**Group**を確認する。

```
vi /etc/httpd/conf/httpd.conf
 
User apache
Group apache
```


# ドキュメントルートの設定
## パーミッションの設定

```Bash:/var/www/html
chown -R www-user:apache /var/www/html
chmod -R 2770 /var/www/html

#ファイルアップロードスクリプト等を使用するディレクトリ
chown -R apache:apache /var/www/html/uploads
chmod -R 755 /var/www/html/uploads
```
テキストファイルから特定の文字列を含む行を削除

下記のファイルから，「AAA」を含む行を削除したいが
「BBB='none'」が含まれていたら残したい

grepコマンドでvオプションを指定すればできそうだが，
「〜含まれていたら残す」条件が書けなかった．


```
AAA BBB='none'
AAA CCC='none'
BBB
CCC
AAA
BBB
```
（2行目と5行目が削除対象）


回避策として
```
$ cat greptest.txt| awk '{if(!/BBB=\047none\047/&&/AAA/){}else{print $0}}'
```で削除することができた．

「\047」はシングルコォートです．

awkにシングルクォートが指定できず，下記サイトを参考にさせていただきました．
「awk でシングルクォートを扱う」　
http://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_080
Linuxでx86アセンブラ（道具編）

# \:large_blue_diamond:この記事について
linux環境でx86アセンブラを開発するのに必要な道具たちを紹介します．アセンブラはプログラミングをやる人なら誰でも聞いたことあるかと思います．でも、C++やJavaなどの高級言語が主流になっている昨今では必要ないのでは？と思うかもしれません．確かにアセンブラはCPUやOSに著しく依存するため移植性はありません．しかし、アセンブラを使うことでマシンに対する理解が深まります．これにより、組み込みなどx86以外のアーキテクチャ以外での開発にも柔軟に対応できるようになります．また、コンパイラが吐き出すコードの殆どは、実行速度を犠牲にして移植性を向上しています．腕次第でコンパイラよりも速いコードを作れるようになります．

# \:large_blue_diamond:紹介するツール
* [nasm](http://www.nasm.us/docs.php)
    アセンブリコードからオブジェクトを生成するアセンブラです．
移植性に優れ、Linux、BSD、Windowsのオブジェクトを生成できます．

* [gdb](https://www.gnu.org/software/gdb/)
    C、C++でも使われるデバッガです．アセンブラでも使えます．

# \:large_blue_diamond:ツールをインストール
Linux上なら簡単インストールできます．
``` sudo apt-get install nasm build-essential ```

# \:large_blue_diamond:nasmの使い方
   はじめにアセンブリソースを作りませう．お好きなエディタで下のアセンブリ版ハローワールドを書いてtest.asmとして保存しましょう．

```:test.asm 
section .bss

section .data
    MSG: db "Hello World!!", 10
    MSG_LEN equ $-MSG

section .text

global main

main:
   nop

.spike:
   mov eax, 0
   add eax, 5
   sub eax, 2

.print:
    mov eax, 4
    mov ebx, 1
    mov ecx, MSG
    mov edx, MSG_LEN
    int 80h;

.final:
    mov eax, 0
    ret
```

これをコンパイル・リンクして実行ファイルを生成します．
``` nasm -g -f elf64 -o test.o test.asm
gcc -o test test.o ```
nasmのオプション```-f elf64```は64bitの指定です．32bitの場合は、```-f elf```を指定してください．
testを実行すると
``` Hello World!! ```
と、ターミナルに表示されます．

# \:large_blue_diamond:gdbの使い方
gdbを使って実行中に何が起きているか見てましょう．
``` gdb -tui test ```
で、gdbを起動しましょう．
``` break main ```
で、mainのところにブレイクポイントを設置します．
``` r ```
で、ブレイクポイントまで実行します．
``` disassemble```
で、アセンブリのデバッグができるよう処理をアセンブリに変換します．
``` layout asm ```
アセンブリコードを表示します．
これでデバッグする準備が出来ました．
下のコマンドを使ってデバッグしましょう．

| コマンド | 意味 |
|:--------|------|
| stepi        |   次の命令を実行   |
| i r | すべてのレジスタを表示 |
| p $eax | レジスタeaxの内容を10進数で表示 |
| p/x $eax | レジスタeaxの内容を16進数で表示 |
| p/t $eax | レジスタeaxの内容を2進数で表示 |
| display $eax | レジスタeaxの内容を命令を実行するたびに自動表示 |
| info display | 自動表示する変数を表示 |
| undisplay $eax | レジスタeaxの自動表示を解除 |
| x &msg | メモリmsgの中身を表示 |
| quit | gdbを終了 |

# \:large_blue_diamond:おわりに
簡単なアセンブリでのプログラム作成ツールの紹介でした．私の勉強次第では後々追記するかもしれません．*Have A Happy Hacking*

# 参考文献
* NASM development team site:   
http://www.nasm.us/
* GDB: The GNU Project Debugger site:   
https://www.gnu.org/software/gdb/
* Assembly Language Step-by-Step: Programming with Linux:   
http://www.amazon.co.jp/Assembly-Language-Step---Step-Programming/dp/0470497025/ref=sr_1_1?ie=UTF8&qid=1446704607&sr=8-1&keywords=assembly+language+step+by+step


↓↓\:bowtie:コメントをいただけたら励みになります\:bowtie:↓↓
swift 条件コンパイルとプリプロセッサ指令に関して

##プリプロセッサ指令 「文字の集合であるソースコード上で機能する命令」



```
コンピュータの前処理プログラム、予備処理、つまりコンピュータ処理で中心的なプログラムの条件に合わせる為の事前処理を行う)
コンパイラでは、人間の記述したソースコードを機械語に翻訳するが、その前に段階としてソースコードに一定の規則に従って処理を加えるのが、プリプロセッサの役割となる。

要約
 #ifndef, #define, #endifと書いてある行は、C言語で二重にヘッダーファイルが読み込まれるのを防ぐのによく使われる方法
このやり方をしないと何度もヘッダーファイルが読み込まれることになって、変数や定数が何度も定義されてしまい、コンパイルエラーになるのです。
```

```
#ifdef
機能: 識別子が定義されているかどうかの判定を行う。
(識別子名)が定義済みなら処理を行う。処理とは、プリプロセッサに対する指令。
識別子は#defineで値を定義するが、未定義の場合は「0」、つまり何も返さない。
書式: #ifdef (識別子名)
     処理
```

```
#define
機能: 文字列の置き換え。
識別子(文字列１)を値(文字列2)と定義します。この時、#defineでは文字列同士の置き換えを行っています。なぜならプリプロセッサ指令はあくまでソースファイルに記述された文字列 =>ソースコードを扱っているの過ぎないからです。

#define __MAX 100
とすれば、コンパイルの段階では、"__MAX"という記号が整数型(Int)の100に置き換えられています。ソースコード上では文字列の"__MAX"が"100"という文字列の置き換えられています。

プリプロセッサ指令はあくまで「文字の集合であるソースコード上で機能する命令」と定義できます。
```

```
#endif
機能: #ifdefや#ifndefなどにより処理ブロックの最後に明示する。
#ifdefや#ifndef共に結果が「真」なら(処理)を一行実行します。
```

##参考例

```
下記のような、条件によってコンパイルしたり、しなかったりを制御することを「条件コンパイル」と言います。

要約 識別子内部の処理を毎回行わせることで、毎回定義されることを防ぐ。

あるプログラムで、Sample.hが初めてインクルードされた時を考えます。
1 はじめはINCLUDED_Sample_h_は定義されていません。したがって#ifdefは無視され、 const float PI = 3.14159;がコンパイルされます。
そして、#defineによってINCLUDED_Sample_h_が定義されます。

2 二回目以降にSample.hがインクルードされると、すでにINCLUDED_Sample_h_が定義されています。このため、#ifdefにより、#defineとconst float PI = 3.14159が無視され、コンパイルされません。
つまり、一つのプログラムでSample.hが何回インクルードされても定義は一回です。
そして、#ifdef識別子内部の処理を、読み込まれるたびに行います。
```

```
Sample.hファイル

  #ifndef INCLUDED_Sample_h_
  
  #define INCLUDED_Sample_h_
  

  const float PI = 3.14159;
 
  #endif
```

参考URL
https://www.grapecity.com/tools/support/powernews/column/clang/014/page02.html

http://ejje.weblio.jp/content/preprocessor

http://e-words.jp/w/%E3%83%97%E3%83%AA%E3%83%97%E3%83%AD%E3%82%BB%E3%83%83%E3%82%B5.html

http://www.kuma-de.com/blog/2013-04-24/5224
MySQLチートシート

## ユーザー管理

### 全権限ユーザー作成

```
GRANT ALL ON *.* TO ユーザー名@'%' IDENTIFIED BY 'パスワード' WITH GRANT OPTION;
```
## カラム操作

### 追加

```sql
-- 最後に追加
ALTER TABLE テーブル名 ADD カラム名 カラムの型;

-- 先頭に追加
ALTER TABLE テーブル名 ADD カラム名　カラムの型 FIRST;

-- 特定のカラム名の次に追加
ALTER TABLE テーブル名 ADD カラム名　カラムの型 AFTER カラム名（このカラムの次に追加される）;

-- 例
ALTER TABLE mytable ADD mycolomn int FIRST;
```

### 削除

```sql
ALTER TABLE テーブル名 DROP カラム名 ;
```

## INDEX操作

### 削除

```sql
ALTER TABLE テーブル名 DROP INDEX インデックス名;
```

## トランザクション

```sql
-- トランザクション開始
BEGIN;

-- ロールバック
ROLLBACK;

-- コミット
COMMIT;

-- オートコミットの設定確認
SELECT @@autocommit;

-- オートコミットOFF
SET AUTOCOMMIT=0;

-- オートコミットON
SET AUTOCOMMIT=1;
```
C > string operation > 指定の桁でchar[]に入れる実装

数値を指定の桁数のchar[]に入れたい。
数値の桁数が小さい時には空白(0x20)を前に入れる。
sprintf()が使えない環境を考慮。

##try1 (正の数のみ)

```c
#include <stdio.h>

void SetValToCharArray(int val, int length, char *dstPtr)
{
	int loop;
	int digit;
	int work;

	work = val;
	digit = 0;
	while(work > 0) {
		work /= 10;
		digit++;
	}
	
	for(loop=0; loop < (length-digit); loop++) {
		*dstPtr = ' ';
		dstPtr++;
	}

	dstPtr += (digit - 1);
	work = val;
	for(loop=0; loop< digit; loop++) {
		*dstPtr = (work % 10) + '0';
		work /= 10;
		dstPtr--;
	}
}

int main(void) {
	int val = 32768;
	char szBuf[10];
	
	memset(szBuf, 0, sizeof(szBuf) );

	SetValToCharArray(val, /*length=*/7, &szBuf[0]);
	printf("[%s]\n", szBuf); // [  32768]
	
	// for check
	sprintf(szBuf, "%7d", val);
	printf("[%s]\n", szBuf);
	return 0;
}
```

http://ideone.com/5b6usH


## try2 (負の数対応)

あまりきれいなコーディングではないが、とりあえず動いた。

```c
#include <stdio.h>
#include <stdbool.h>

void SetValToCharArray(int val, int length, char *dstPtr)
{
	int loop;
	int digit;
	int work;
	
	bool minus = false;

	if (val < 0) {
		minus = true;
		val = (-val);
		length--;
	}

	work = val;
	digit = 0;
	while(work > 0) {
		work /= 10;
		digit++;
	}
	
	for(loop=0; loop < (length-digit); loop++) {
		*dstPtr = ' ';
		dstPtr++;
	}
	
	if (minus) {
	   	*dstPtr = '-';
	   	dstPtr++;
	}

	dstPtr += (digit - 1);
	work = val;
	for(loop=0; loop < digit; loop++) {
		*dstPtr = (work % 10) + '0';
		work /= 10;
		dstPtr--;
	}
}

int main(void) {
	int val = -271;
	char szBuf[10];
	
	memset(szBuf, 0, sizeof(szBuf) );

	SetValToCharArray(val, /*length=*/7, &szBuf[0]);
	printf("[%s]\n", szBuf); // [  32768]
	
	// for check
	sprintf(szBuf, "%7d", val);
	printf("[%s]\n", szBuf);
	return 0;
}
```

http://ideone.com/W7BqSz

##備考

値が0の時に以下のようになってしまう。自分がどうしたいか検討中。

```
[    ]
```

とりあえずの実装
http://ideone.com/sIGRt4
mavenの導入（動作まで）のメモ((φ(･д･｡)

Mavanでライブラリを取得する必要が出てきてしまったのでメモ

mavan をダウンロード
http://maven.apache.org/download.cgi

■.bash_profile にJAVA_HOMEとmavenを設定

``` txt:.bash_profile
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk//Contents/Home
export PATH=$PATH:~/bin:~/bin/apache-maven-3.3.3/bin:
```
※~/binは僕が勝手に作ったディレクトリ

■環境変数に反映

```
bash-3.2$ source .bash_profile
```


■maven 実行

```
bash-3.2$ mvn --version
Apache Maven 3.3.3 (【なんかのハッシュ】; 2015-04-22T20:57:37+09:00)
Maven home: /Users/wakameyy/bin/apache-maven-3.3.3
Java version: 1.8.0_65, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_65.jdk/Contents/Home/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.10.4", arch: "x86_64", family: "mac"
```

なんかエラーなく表示されたのでとりあえずOKかな？
GitでSSL認証失敗のエラーが出る

GitLabなど自前でGitサーバを立て、さらにSSL認証を入れている場合、以下のようなエラーが出る。これは、SSL認証失敗によるものである。

```bash
fatal: unable to access 'https://xxxxxx.xxx/xxxxx.git/': Peer certificate cannot be authenticated with known CA certificates
```

証明書を認証・更新するのがベストですが、オレオレだし面倒だしSSL認証しない設定にする。（あんまり良くない）

```bash
git config http.sslVerify false
```
目的のハッシュタグを含むツイートをした人のユーザーネーム(@の後ろの部分)を取得する

[Player!](https://itunes.apple.com/jp/app/player!-your-sports-news-curator/id897872395)は、twitterに同時投稿した際に`#playerapp`がつきます。
そのハッシュタグのついた投稿をしている人のscreen_name(@の後ろの部分)を取得するためのスクリプトです。

`gem install twitter'にてgemをインストール

```twitter.rb

require "twitter"

# Twitter APIによるリクエスト
client = Twitter::REST::Client.new do |config|
  config.consumer_key        = "CONSUMER_KEY"
  config.consumer_secret     = "CONSUMER_SECRET"
  config.access_token        = "ACCESS_TOKEN"
  config.access_token_secret = "ACCESS_TOKEN_SECRET"
end

# 取得するツイートの上限数
limit   = 10

# 欲しいハッシュタグのキーワード
tag = "playerapp"

# ここでスクリーンネームを取得
client.search("##{tag}", lang: 'ja', result_type: 'recent', count: 1).take(limit).map do |tweet|
  puts "#{tweet.user.screen_name}"
end
```

取得するツイートの上限数は、Twitter APIのリクエスト制限があるので、それに引っかからない程度に設定してください。
参考記事：[FacebookとTwitterのAPIのコール回数の制限について](http://qiita.com/reikubonaga/items/797c0fbd0fbc18f147ce)