OmniAICreator/Qiita-1.07M huggingface dataset:
node.jsのWebアプリケーションをUpstartでサービス化する

# Upstartの記事に需要はあまりないと思いますが・・・

[systemd](http://dev.classmethod.jp/cloud/aws/systemd-getting-started/)が盛り上がってきている今どき[Upstart](http://upstart.ubuntu.com/cookbook/)の記事に需要はほとんどない気がしますが結構困ったので書いておきます。対象OSがCentOS6.6なんですよ・・・
だからupstartのバージョンもやたらと低いのでした。

```shell-session
# initctl --version
initctl (upstart 0.6.5)
```

## やりたいこと

upstartから```npm start```でexpressなどで作ったWebアプリケーションを起動したいのです。
しかもrootユーザーとしてではなく、実行ユーザー指定で。

```shell-session:expressで作ったアプリ
/home/vagrant/myapp (owner=vagrant ,group=vagrant)
├── app.js
├── bin
│   └── www
├── node_modules
├── package.json
├── public
├── routes
└── views
```

```json:package.json
{
  "name": "myapp",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "body-parser": "~1.13.2",
    "cookie-parser": "~1.3.5",
    "debug": "~2.2.0",
    "express": "~4.13.1",
    "jade": "~1.11.0",
    "morgan": "~1.6.1",
    "serve-favicon": "~2.3.0"
  }
}
```

## 結論

```conf:/etc/init/myapp.conf
start on [2345]
stop on [!2345]

chdir /home/vagrant/myapp

script
  source /etc/profile
  exec su --session-command "NODE_ENV=staging $NVM_BIN/npm start" vagrant
end script
```

```
$ sudo initctl start myapp
myapp start/running, process 22083

$ ps -ef | grep node
root     22083     1  0 23:25 ?        00:00:00 su --session-command NODE_ENV=staging /opt/nvm/versions/node/v0.12.7/bin/npm start vagrant
vagrant  22225 22218  4 23:25 ?        00:00:00 node ./bin/www
```

## 何に詰まったのか

### 1. nvmを使っている、PATHが通っていない

まず困ったのがnpmコマンドの場所です。
普通にターミナルから使うときは```nvm use v0.12.7```とするので下記のようにパスが通っているのですが

```shell-session
$ which npm
/opt/nvm/versions/node/v0.12.7/bin/npm
```

upstartから実行する際はパスが通っていないのでnpmコマンドのフルパスを指定する必要があります。
nvmを使っているので```v0.12.7```の箇所をベタに書きたくありません。
nvmでuseされているnodeの場所は環境変数```$NVM_BIN```に入っていますが、upstartから実行する場合は環境変数もすっからかんです。

で、何をやったのかというと、

```bash:/etc/profile.d/nvm.sh
source /opt/nvm/nvm.sh
nvm use v0.12.7
```

こうして、myapp.confのscriptで```source /etc/profile```としました。
これで環境変数```$NVM_BIN```が使えます。

### 2. upstartのバージョンが1.4未満なのでsetuidが使えずsuコマンドで起動ユーザー指定

```su -c "$NVM_BIN/npm start vagrant"``` これでいいだろと思っていたのでうが動かず…これにかなり悩みました。

なんでダメだったかというと、

```shell-session
$ man su

       -c, --command=COMMAND
              pass a single COMMAND to the shell with -c

       --session-command=COMMAND
              pass a single COMMAND to the shell with -c and do not create a new session
　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
```

ここのせいでした。 ```-c``` でコマンド実行するとシェルセッションが新たに作られると。このせいでUpstartがsuを実行するが、Upstartから見るとsuコマンドの実行プロセスがすぐ終わってしまったように見えるようだ。

しかし、この```--session-command```オプションってあまり見たことが無い・・・。手元のUbuntu14.04のsuには無いようだ。CentOS6独特なのか？

http://qiita.com/bundai223/items/3ffdde28f5acbe4ea903 の記事だと```-c```オプションでやってるんだけどなぁ。

ちなみに、sudo でやった場合は、

```
$ sudo -u vagrant $NVM_BIN/npm start

> myapp@0.0.0 start /home/vagrant/myapp
> node ./bin/www

sh: node: コマンドが見つかりません
```

こんな感じで、pakcage.json のstartに書かれているnode のパスが解決できないという…
UbuntuでUnifyingを使う

# UbuntuでUnifyingを使う

ロジクールのワイヤレスマウスやワイヤレスキーボードで使用されているUnifyingレシーバーの管理アプリケーションはLinux用は用意されていません。
購入した機器に付属しているレシーバーはペアリング済みなので管理アプリケーションは不要で利用できるのですがせっかくなのでUbuntuでも代替アプリが無いか調べてみました。
Linux向けに [Solaar](https://github.com/pwr-Solaar/Solaar) というものがあり、UbuntuではPPAで利用できるのでこちらをインストールします。
→16.04(xenial)以降はuniverse repositoryからインストールが可能です。

## 0. 環境

- Ubuntu 14.04 LTS 64bit
- Ubuntu 18.04 LTS 64bit

# Ubuntu 14.04の場合
## 1. PPAを追加

PPAリポジトリとこのリポジトリの公開鍵を追加します。

```bash
sudo add-apt-repository ppa:daniel.pavel/solaar
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 06524FBA
sudo apt-get update
```

## 2. Solaarのインストール

```bash
sudo apt-get install solaar
```

Gnomeを利用している場合はsolaar-gnome3もインストールします。

```bash
sudo apt-get install solaar-gnome3
```

# Ubuntu 18.04の場合

※Ubuntu 18.04の部分は @y-vectorfield さんから編集リクエストをいただきました。ありがとうございます。
※私はUbuntu 18.04では未検証です。ご了承ください。

Ubuntu 16.04以降は[universe repository](https://packages.ubuntu.com/search?keywords=solaar&searchon=names&suite=all&section=all)からインストールが可能です。

### Solaarのインストール

```bash
sudo apt-get update
sudo apt-get install -y solaar
```

Gnomeを利用している場合はsolaar-gnome3もインストールします。

```bash
sudo apt-get install solaar-gnome3
```

何れのバージョンのUbuntuでもインストールが終わったら再ログインしてください。

## 3. Solaarを使う

再ログインすると通知領域にアイコンが表示されます。
![アイコン](https://qiita-image-store.s3.amazonaws.com/0/43589/5b21dd08-15c0-2317-95a7-971f38c9a61c.png "アイコン") 

接続機器がある場合はバッテリー残量が表示されます。クリックすると各デバイスごとの残量も確認できます。
![通知領域](https://qiita-image-store.s3.amazonaws.com/0/43589/d8a8d7ca-5607-d758-08fe-bdb5f371fa97.png "通知領域")  

設定画面から新しい機器のペアリングや接続済み機器のアンペアリングができます。
![設定画面](https://qiita-image-store.s3.amazonaws.com/0/43589/7b825728-8a8c-7167-c630-72a8aa837b9f.png "設定画面")  


## 参考

[ロジクール Unifyingレシーバー](http://www.logicool.co.jp/ja-jp/promotions/6072)
[ほげめも: Solaar: Logitech Unifying を Linux で使う](http://blog.keshi.org/hogememo/2013/11/04/solaar-using-logitech-unifying-in-linux)
[Solaar](https://github.com/pwr-Solaar/Solaar)
[apt - How do I fix the GPG error "NO_PUBKEY"? - Ask Ubuntu](http://askubuntu.com/questions/13065/how-do-i-fix-the-gpg-error-no-pubkey)
pageres-cliで複数デバイスのスクリーンショットを一括作成

[pageres-cli](https://github.com/sindresorhus/pageres-cli)をインストールすると、コマンドラインから手軽に複数サイズのスクリーンショットを作成することができる。
レスポンシブサイト作成時の表示確認や、資料作成などに活用すると便利。

# 必要な環境

- Node.js

# インストール方法

ターミナルから以下のコマンドを実行。

```
$ npm i -g pageres-cli
```

# 使い方

## 基本的なコマンド

### 単一デバイスでの書き出し

`pageres` コマンドの後に、URLと解像度（デバイスの画面サイズ）を引数で指定する。

```
$ pageres littlebird.mobi 1024x768
```

- 解像度を指定しない場合は、最もよく使われているサイズである`1366x768`pxで保存される。
- URLは、ローカルのパスやファイル名を指定することも可能。

### 複数デバイスでの書き出し

解像度を複数指定すれば、複数サイズのスクリーンショットが一括保存される。

```
$ pageres littlebird.mobi 1024x768 1366x768 1600x900
```

### 人気のデバイスTOP10

サイズを指定するのが面倒な場合は、 `w3counter` と引数を指定することで、[W3Counter](http://www.w3counter.com/globalstats.php)から集計された、よく使われているデバイスサイズTOP10で、自動的に作成してくれる。

```
$ pageres littlebird.mobi w3counter
```


## オプション

### 切り抜き

`-c` または `--crop` を指定することで、画面の縦サイズを切り抜いてキャプチャすることができる。
（指定しない場合は、画面全体をスクロールした状態でキャプチャされる）

```
$ pageres littlebird.mobi 1024x768 --crop
```

### ファイル名を指定して保存

`--filename` オプションを使うと、指定したファイル名でキャプチャ画像を保存できる。
以下の例のように、「日付-URL」といったファイル名にすることもも可能。

```
$ pageres littlebird.mobi 1024x768 --filename='<%= date %> - <%= url %>'
```

### 特定の要素だけをキャプチャ

HTML上のセレクターを指定することで、特定のDOM要素だけを選んで画面キャプチャすることができる。

```
$ pageres littlebird.mobi 1024x768 --selector='.main'
```

### ユーザー名とパスワードを指定

BASIC認証がかかっているサイトでも、ユーザー名とパスワードを指定することで、コマンドラインからキャプチャすることができる。

```
$ pageres littlebird.mobi 1024x768 --username='youthkee' --password='hogehoge'
```

### ファイル形式を指定

`--format` オプションを使うことで、指定したファイル形式でキャプチャ画像を保存できる。デフォルトは `png` 形式。

```
$ pageres littlebird.mobi 1024x768 --format='jpg'
```

### 解像度のリストを外部ファイルから渡す

デバイスの画面サイズを、あらかじめリストアップしたテキストファイルから読み込んで指定することができる。

```
$ pageres littlebird.mobi < screen-resolutions.txt
```

この方法を応用することで、Google Analyticsから抽出した、そのサイトでよくアクセスされているデバイスサイズで、キャプチャを作成することも可能。

# 注意事項

以前は `npm i -g pageres` でインストールされるパッケージが、上記コマンドラインから使用できるツールだったが、現在[pageres](https://github.com/sindresorhus/pageres)は、APIから利用するバージョンへと移行された模様。

コマンドラインツールとして使用したい場合は、

```
$ npm i -g pageres
```

ではなく、

```
$ npm i -g pageres-cli
```

コマンドでインストールする必要があるので、注意が必要。

※APIバージョンの[pageres](https://github.com/sindresorhus/pageres)の方は、gruntやgulpなどのタスクランナーからも実行できるとのこと。
POH6 漫画版: 女子高生プログラマーの大バトル！〜コボール文明の逆襲〜 霧島京子

[六村リオ](http://qiita.com/rana_kualu/items/cbd237a865125b4cd9bf) / [霧島京子](http://qiita.com/rana_kualu/items/e6467151c88d69670fbb) / [緑川つばめ](http://qiita.com/rana_kualu/items/535144055c73f5694153) / [島根ルミ](http://qiita.com/rana_kualu/items/cc79813f9555e01330a2) / [島根ルミ149](http://qiita.com/items/0e9b48b4361ee567c7e6/) / [島根ルミ121](http://qiita.com/items/9de54445c2ed7c444d99/) / [共通解](http://qiita.com/items/04721cdd925166156aab/)


[すごろくを解きます](https://paiza.jp/poh/joshibato/kirishima)。
先に攻略可不可リストを作っておいて、答えはそのリストを参照するだけ、という回答方針。

```php
<?php
	// インプット
	$f = file('php://stdin', FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
	
	// ゴール可能かリスト -2は未判定、-1は判定中、1は可能、0は不可能
	$isok = array_fill(0, array_shift($f)-1, -2);
	$isok[0] = 0; // スタート
	$isok[] = 1; // ゴール
	// すごろく
	$list = explode(' ', array_shift($f));
	// 3行目は要らない
	unset($f[0]);
	
	// 攻略可能か全項目調査
	foreach($list as $k=>$v){
		$isok[$k] = checkRecursive($k, $list, $isok);
	}
	
	// 4行目以降でループ
	foreach($f as $k=>$v){
		echo $isok[$v] ? "Yes\n" : "No\n";
	}
	
	/**
	 * ゴールできるかどうかを調べて返す。
	 * @param int 現在のキー
	 * @param [] すごろく
	 * @param [] OKリスト
	 * @return int 1は可能、0は不可能
	 */
	function checkRecursive($k, $list, $isok){
		// 範囲外
		if(!isset($isok[$k])){return 0;}
		// 既に決定している
		if($isok[$k] >= 0){return $isok[$k];}
		// 調査中だったらループしたので失敗
		if($isok[$k] === -1){return 0;}
		// それ以外は、自分を調査中にして次のキーへ
		$isok[$k] = -1;
		return checkRecursive($k+$list[$k], $list, $isok);
	}
```

https://paiza.jp/poh/joshibato/kirishima/result/b60a23dc
問題なく100点。

ただ、時間的には全く問題ないとはいえ、これだと同じ場所を何度もチェックすることになります。
そこでcheckRecursiveの引数`$isok`を参照渡しにしてメモ化すればもっと早くなると思ったんだけど、そうするとテストは通るのに本番が0点になってしまいクリアできませんでした。
理由がよくわからん。
[Swift] バッテリー残量の表示

## やること
1. バッテリーの監視を許可
2. バッテリー残量を文字列に変換

```swift:BatteryLevel

    var battery: String?

    // 1. バッテリーの監視を許可
    UIDevice.currentDevice().batteryMonitoringEnabled = true
        
    // 2. バッテリー残量を文字列に変換
    battery = NSString(format: "%.2f", UIDevice.currentDevice().batteryLevel) as String
```

すみません、実機で動かさないと確認できないですm(_ _)m
区分したコールバックの作成

ちょっとした思いつきで、汎用に使えそうなコードを書いてみたのですが、公開できる形に持っていくのが案外手間でした。

# 作った背景
Webサイトで使うスクリプトが（Railsだということもあって）[大Script主義](http://qiita.com/jkr_2255/items/1ff5caba3ea3d38f6659)だったのですが、ページごとに実行するものを振り分けるのが複雑化して来ました。そこで、Rails側ではコントローラーやメソッドに関する情報をビューへ埋め込んで、JavaScript側ではそれを拾って切り分け動作を行おうと考えました。そのJavaScript側のうち、「コールバックを区分して実行する」部分だけを1つのライブラリにしてみました。

[Jkr2255/GroupCallbacks @ GitHub](https://github.com/jkr2255/grouped_callbacks)

# 使い方
ブラウザで使う場合、`grouped_callbacks.js`をそのまま読みこめばグローバルに`GroupedCallbacks`が出現します。で、これはコンストラクタなので、まずは実際のオブジェクトを生成します。

```js
var callbacks = new GroupedCallbacks();
```

それから、`.add(グループ名,関数)`で関数を追加して、`.run(グループ名)`で実行する流れです。

## グループについて
`グループ名`としては、単一文字列（1階層）もしくは文字列の配列（2階層以上の場合）を指定できます。そして、実行対象ですが、`.run(['main', 'sub'])`とすると、グループを`['main','sub']`として登録したもの、`['main','sub', さらに続く]`で登録したもの以外に、`main`で登録したものも実行されます（親グループで登録したものは、子グループの実行時にも一緒に実行されます）。また、順番については何も保証されません。

# その他
何かありましたら、[Jkr2255/GroupCallbacks @ GitHub](https://github.com/jkr2255/grouped_callbacks)にご相談いただければと思います。
uGUIのマスクでウィンドウとかテキストとかアニメーションさせてみた

uGUIを勉強するはずが気づいたらマスクでアニメーションをしている。
NGUIよりマスクが簡単だから楽しいな〜

##マスクを重ねていろんな色で演出
マスクをたくさん重ねてfillAmountでアニメーションさせています。
1になったときに0にしてSetAsLastSibling();とかで優先順位を変更してあげるのを忘れずに
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/481865cb-ccd3-daec-d769-f3d84ea2e884.gif" width="150px" />

一番下のアニメーションのヒエラルキー
マスク画像は四角でテキストは同じ文字を全て設定しています
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/42011a60-4044-9923-3171-3d33fcc3f2c8.png" width="120px" />

一番下のがソースだとこんな感じ

```csharp

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class TextMaskAnim2 : MonoBehaviour {

	public RectTransform[] maskTranList;
	private float maskWidth = 500;
	private float[] nowWidthList;

	void Awake()
	{
		nowWidthList = new float[maskTranList.Length];
		for(int i = 0; i < maskTranList.Length; i++)
		{
			nowWidthList[i] = maskWidth / (maskTranList.Length + 1) * i;
		}
	}

	void Start () {
	
	}

	void Update () {
		for(int i = 0; i < maskTranList.Length; i++)
		{
			nowWidthList[i] += maskWidth * Time.deltaTime;
			if(nowWidthList[i] >= maskWidth)
				nowWidthList[i] = maskWidth;

			if(nowWidthList[i] == maskWidth)
			{
				nowWidthList[i] = 0;
				maskTranList[i].SetAsLastSibling();
			}

			maskTranList[i].GetComponent<Image>().fillAmount = nowWidthList[i] / maskWidth;
		}
	}
}
```

##マスクとアンカーを使用したアニメーション
マスクは一つ。左右の括弧はアンカー。
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/d19359f3-49b3-872d-c2e3-75250c7f6141.gif" width="400px">

ヒエラルキーはこんな感じ。
マスクのwidthをアニメーションで増やしているだけ。
Left と Rightの括弧は位置を左よせ、右よせしてあとはいい感じにalphaとかアニメーションをかけているだけです。
<img src="https://qiita-image-store.s3.amazonaws.com/0/46444/9e4cdb99-d19d-60ff-6d09-e7d1b7894dac.png" width="120px">


##マスクとアンカーとかを使用したウィンドウ
<img src="http://ayumegu.daa.jp/img/Qiita/TextAnim3.gif" width="400px">
左は中心から開くウィンドウ。
仕組み的には中心からのマスクができなかったので2つのマスクを使用し、(ウィンドウのスライス画像がきれてしまうので)
上と下で0.5~1のfillAmountでアニメーションしつつウィンドウの9パッチのスライス画像のサイズも変更しています。

右は一度横幅に広がってからたてに広がるウインドウ
こちらはマスクは1つ。横にimageのサイズをのばしてからマスクのfillAmountと画像のサイズ自体を大きくしています。

アイテム画像のきらっていうやつもマスク。
これはシンプルにy画像のy座標を移動しているだけ。

一点困ったのはRect Transformのwidthとheightの変更はsizeDeltaで変更するところ・・・
rectがgetのみでsetできなくてちょっと探すのに時間がかかってしまった・・・。

あ、あと後ろのわちゃわちゃしたパーティクルとかはBlend ModesのAssetです。
ちょっといろいろためしていて・・。
Processingを使う(＆画像を保存する)

前回に引き続きProcessingの話し。今度はProcessing.jsではなく本家のProcessingについてです。
こちらのほうは単体で使えるProcessingインタプリタ。JAVAでできているそうで、JAVAがインストールされていれば使用できます。

Processingの書き方は、基本的にProcessing.jsと同じです。同じようなコードを使えば図形を描画できます。

```processing:main.pde(いちおう、Processing側の拡張子は、pjsではなくpdeのようです)
void setup(){
  // 設定初期化を行うコードブロック。最初に１回だけ呼び出される(size()関数はここでしか呼べない？)
  size(120, 120);
}

void draw(){
  // 描画を行うコードブロック。毎フレームごとに呼び出されるので、アニメーションも可能
  background(255);
  smooth();
  strokeWeight(10);
  stroke(#7799dd);
  ellipse(width / 2, height / 2, width / 2 - 10, height / 2 - 10);
}
```

これを実行した結果は、次のようになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/14499/daee3d0c-2bee-23d4-3a05-eaca12e37617.png)


デフォルトの設定だとコメントが文字化けしますので、渓谷が表示されることがありますが、動作に問題はありません(気になる場合、ファイル＞設定よりフォントを日本語フォントに変更することで、日本語が表示できるようになります)。

# 作成した画像を保存する
作成した画像を保存する場合は、`save()`メソッドを使います。第一引数にはファイル名を指定します。png, jpg, tif, tga形式で保存できるそうです。

引数にはC:\からはじまるフルパスか、相対パスが指定できます。相対パスを指定する場合、ファイルの保存場所に注意(ファイル＞名前をつけて保存でファイルを保存した場合、Processingは指定した名前のフォルダを作成し、その中にファイルを保存します)。

## いろいろなサイズの画像を保存する
複数サイズのアイコン作成など、同じスクリプトから複数サイズの画像を保存したいケースもあると思います。そのような場合、画面に直接描画するのではなく、PGraphicsオブジェクトを使うのが便利です。

```processing:main.pde
void setup(){
  PGraphics pg = createGraphics(120, 120);　// (1)
  pg.beginDraw(); // (2)
  pg.background(255);
  pg.smooth();
  pg.strokeWeight(10);
  pg.stroke(#7799dd);
  pg.ellipse(width / 2, height / 2, width / 2 - 10, height / 2 - 10);
  pg.endDraw(); // (2)
  pg.save(保存したいパス);
}
```
PGraphicsオブジェクトは、createGraphicsメソッドを使って作成できます(1)。引数は、size()メソッドと同じ。
また、作成したPGraphicsオブジェクトに描画を行う場合は、最初にbeginDraw()メソッド、最後にendDraw()メソッドを呼び出します(2)。そして、save()メソッドで画像を保存できます(画面のimage()メソッドを使えば、画面に画像を表示することもできます)。

Windowsストアアプリなどだと似たようなアイコンを大量に生成する必要があるため、ストアアプリのアイコンをProcessingで書くようにすると、後々楽そう。
[php] \(半角バックスラッシュ)を文字列置換したい場合の注意点

一時的に「！？」ってなったのでメモ。
文字列$nameに半角バックスラッシュが入っていた場合は、全角にしてやろうとした時のこと。

##間違い

近辺で、似たような文字列置換をpreg_replace()で書いていたので
ここもpreg_replace()で書いたところ

```php:エラーになります
//nameに半角バックスラッシュが入っていた場合は全角に変換
$name = preg_replace('/\\/u', '＼', $name);
```

これだとエラーになってしまい、$nameにはNULLが入ってしまうのです。

##正解

そして、

```php:正解
//nameに半角バックスラッシュが入っていた場合は全角に変換
$name = preg_replace('/\\\/u', '＼', $name);
```

これならおｋなんですね。

##何故？

```\``` にマッチングさせる場合は ```\\``` で良いんじゃないのか！？
なんでエスケープが1つ余計に必要なんだ？と思い
先輩方に疑問を投げたところ

> 推測だけど、 ```'/\\/u'``` の場合
> 2個目のバックスラッシュが正規表現最後のスラッシュ（デリミタ）をエスケープしてしまうからでは？

や、

> php側でのエスケープと、PCREでのエスケープが2重でかかってるからなんだろうね。

等の回答を頂きました。なるほど。

```
preg_replace('/\\\/u', '＼', $name);

 ↓ php的に「\\」が1つの「\」だと認識される

$nameに「\\」があった場合「＼」に置換

 ↓ 正規表現的に「\\」が1つの「\」だと認識される

$nameに「\」があった場合「＼」に置換
```

こういうことかー！

##結論

そもそも、正規表現使ってない文字列置換でpreg_replace()使う必要無いよね？

[PHP: str_replace - Manual](http://php.net/manual/ja/function.str-replace.php) にも
> (正規表現のような) 技巧的な置換ルールを必要としない場合、 preg_replace() の代わりにこの関数を常用するべきです。

って書いてある。

…という訳で、

```php:結局…
//nameに半角バックスラッシュが入っていた場合は全角に変換
$name = str_replace('\\', '＼', $name);
```

str_replace()に落ち着きました…
Scalaでたぶん一番簡単なDI

## Outline

ScalaでDIをちゃんと考えてみようと思い、ここを参考にcakePatternとか色々調べてみました。
http://eed3si9n.com/ja/real-world-scala-dependency-injection-di

でも全体的に何が嬉しいのか見えなかったので、手段から入るのをやめて、
何ができれば嬉しいのかを明確にしてから一番シンプルにそれが達成できそうなものを考えてみました。

## Premise

SpringMVCの設計みたく、

```
Controller→Service→Repository
```

の依存関係があるとします。
また、今回はRDBを扱い、トランザクションの管理はServiceでやるとします。

## Goal

・各Objectで、mockを差し込んだ単体テストが容易に行える。
・UI確認用に、configを書き換えると実行時にMockのServiceが動くようにする。
・（上記を実現しつつ、ボイラ−プレートが少なく、シンプルな構成になるように。）

## How

lazy valで定義したフィールドにMockをoverrideする。


## Code

```scala
class MyController {
	lazy val myService:MyService = MyFactory.getMyService()
	def action() = println(myService.process())
}

object MyFactory{
	def getMyService() = {
		new MyServiceImpl

		//		if(Config.mode = "Prod"){
		//			new MyServiceImpl
		//		}else{
		//			new MyServiceMock
		//		}

	}
}

trait MyService {
	def process(): String
}

class MyServiceImpl extends MyService{
	lazy val pool = new ConnectionPool
	lazy val myDao = new MyRepository

	override def process() = {
		implicit val con = pool.getConnection()
		myDao.fetchData
	}
}

class MyServiceMock extends MyService{

	override def process() = {
		"mock"
	}
}

class MyRepository {
	def fetchData(implicit dbCon: String): String = {
		"aa from " + dbCon
	}
}

class ConnectionPool{
	def getConnection() = "real Connection"
}


```



本番時はこのように。


```scala
object Main {

	def main(args: Array[String]) {
		val controller = new MyController()
		controller.action()
	}

}
```

テスト時はこのように。

```scala
class Test extends FunSuite{

	test("testMyController") {
		val controller = new MyController(){override lazy val myService = new MyService {
			override def process(): String = "mock"
		}}
		controller.action()
	}

	test("testMyServiceImpl") {
		val mockDao = new MyRepository {
			override def fetchData(implicit dbConnection: String): String = "mock Fetch"
		}

		val poolMock = new ConnectionPool {
			override def getConnection() = "mock Fetch"
		}
		val service = new MyServiceImpl{
			override lazy val pool = poolMock
			override lazy val myDao = mockDao
		}
		assert(service.process() == "mock Fetch")
	}

	test("testMyDaoImpl") {
		val repo = new MyRepository
		val mockDBCon = "mock"
		assert(repo.fetchData(mockDBCon) == "aa from mock")
	}

}

```

## Conclusion

具象クラスのコンストラクタに依存するのがキモい。。
でもそれ以外は問題ないのでは？

cakePatternとかはどういう時に真価を発揮するのかとか、誰かマサカリください。
Pythonの実行中にインタラクティブシェルを起動する

Rubyの`binding.pry`をPythonでもやりたいと思ったらありました。


```py3
# coding: utf-8

from IPython import embed
from IPython.terminal.embed import InteractiveShellEmbed


n = 1

print('start embed')
embed()

# === ipython interactive shell ===
#
# print(n)
# => 1
#
# n += 1
#
# Ctrl + D : exit ipython
print('end embed')


ipshell = InteractiveShellEmbed()

print('start interactive shell')
ipshell()

# === ipython interactive shell ===
#
# print(n)
# => 2
#
# Ctrl + D : exit ipython
print('end interactive shell')
```

便利情報でした。
短いですが、こちらからは以上です。

http://ipython.org/ipython-doc/2/interactive/reference.html#embedding
Apache httpd.conf もうデフォルトでよくね？集


##`TraceEnable off`
Traceなんてつかわんやろ、ふつう

##`ServerTokens Prod`
##`ServerSignature Off`
ココらへんはどこでも書いてる

##`Options -Indexes`

## `AddDefaultCharset Off`
こことか
http://centos.bungu-do.jp/archives/000227.html

## `Header always append X-Frame-Options SAMEORIGIN`
クリックジャッキング対策 mod_headers要る

## `mod_requesttimeout要らね`
http://qiita.com/ionis_h/items/6eeccc4cab88b31d0ae8
iOSの各バージョンの利用状況をコマンドラインで集計する

#iOSの各バージョンの利用状況を集計する

## 目的
そんなんアナリティクス使えやって感じですが、、
Apacheのアクセスログから、iOSの各バージョンの利用状況（割合）をコマンドラインからさくっと調査したい時用につくってみました。
iOS9もまもなく正式もリリースされることですし。

## 手段

```
$ for UA in "iPhone OS 9_" "iPhone OS 8_" "iPhone OS 7_" "iPhone OS 6_"; do COUNT=`grep "$UA" access_log | wc -l`; echo "$UA : $COUNT"; done
```
これだけ。

```
iPhone OS 9_ : 1
iPhone OS 8_ : 200
iPhone OS 7_ : 100
iPhone OS 6_ : 50
```
こんな感じで出力されます。

## 補足
* おおよその利用状況を把握するために使ってください。
* iOS以外でもブラウザ別とかいろいろ使えます。
* これ系のコマンドってすぐ忘れるよね←（もしかして僕だけ！？）

なんかゆるい投稿になってしまいました。

## 参考サイト
[Apache] コマンドラインでアクセスログを解析するワンライナー
http://bashalog.c-brains.jp/11/03/09-150446.php
[Rails] StrongParameter でparameterに配列があるとき、その配列の中身をチェックする方法

# paramsがこんな感じのとき

```rb
{
  "foo": [
    { "bar": "tar", "baz": "sar" },
    { "bar": "tor", "baz": "sor" },
    { "bar": "ter", "baz": "ser" },
    { "bar": "tir", "baz": "sir" },
  ]
}
```

# StrongParametersで配列の中身を見る

```rb:foo_controllers.rb
private
def foo_params
  params.require(:foo).map { |u| u.permit(:bar, :baz) }
end
```

# 配列かどうかをチェックするなら

```rb:foo_controllers.rb
private
def foo_params
  params.permit(:foo => [])
end
```
AndroidStudioでFabricを導入したら実行時エラーへの対処

androidでFabric(Crashlytics)をインストールしたら実行時に以下のエラーが出て少しはまってしまった。

```err
Error:Execution failed for task ':app:dexDebug'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.8.0_31\bin\java.exe'' finished with non-zero exit value 2
```

さすがのstackoverflowですね
http://stackoverflow.com/questions/28640314/android-studio-fails-to-debug-with-error-org-gradle-process-internal-execexcepti

こちらに記載してあった

```build.gradle
defaultConfig {
    multiDexEnabled true
}
```
を入れたら実行時エラーがなくなりました！

ただ、Fabricの導入時に自動でコードが追加されるのですが、
このコードも追加してほしいものですね。

>追記
Android 4.xの場合に動作しなくなることがありました。以下の修正が必要です。

```build.gradle
dexOptions {
    preDexLibraries false
    javaMaxHeapSize "2g"
}
・・・・
dependencies {
    compile 'com.android.support:multidex:1.0.0'
}
```

applicationに指定しているクラスを
**android.support.multidex.MultiDexApplication**に変更
上記クラスで以下をオーバーライド

```
@Override
protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
}
```

これでとりあえず動くようになりました。
Rails4 で render partial 部分テンプレートに変数を渡す(locals option)を使う時の注意点

[Rails4 - render partialで部分テンプレートに変数を渡す方法 - Qiita](http://qiita.com/hmuronaka/items/daf2904e3f703448f506)

をやろうとしてて、こんな風に書いていた。

```
= render 'shared/item_header', locals: { item: @item }
```

発生するエラー

```
undefined local variable or method `item' for 
```

BetterErrors gem を入れてるとこんな感じで見える

## 間違っている locals の値の渡し方

![image](https://qiita-image-store.s3.amazonaws.com/0/5691/d173c1f2-21db-f800-bfdf-65b9cb12c017.png)

local_assigns に値が渡ってるので一見良さそうに見えるんだけど・・

## 正しく指定出来た場合

![image](https://qiita-image-store.s3.amazonaws.com/0/5691/b4f05426-1ded-4ad1-3472-0712425cac16.png)

よーく見ると、 local_assigns が間違ってる方は無駄に1段深い。。

## 原因・解決方法

view で render を記述する時に、わざわざ ```partial:``` と書かなくても大丈夫なので、そこを省略した時のオプションの渡し方に問題があった。

参考：
[レイアウトとレンダリング | Rails ガイド](http://railsguides.jp/layouts_and_rendering.html#%E3%83%91%E3%83%BC%E3%82%B7%E3%83%A3%E3%83%AB%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B)

## 正しい書き方

```
= render partial: 'shared/item_header', locals: { item: @item }
```

または

```
= render 'shared/item_header', item: @item
```

1つ目の ``` partial: ``` オプション名を省略した場合は、 ``` locals: ``` オプション名も使ってはダメ。

※ ```locals``` に渡す変数が1つだけの場合、 中括弧を省略する場合が多い（編集リクエストでのご指摘を反映）


## RailsGuideでの注意点記載箇所

[レイアウトとレンダリング | Rails ガイド](http://railsguides.jp/layouts_and_rendering.html#%E3%83%91%E3%83%BC%E3%82%B7%E3%83%A3%E3%83%AB%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88)

> :layoutなどの追加オプションを渡す場合は、:partialオプションを明示的に指定する必要がある点にもご注意ください。

partial, locals以外のオプションを指定したい場合は、省略できないので注意。


## 陥っていた状況とビンゴの回答

[ruby on rails - Rendering partial with locals in Haml? - Stack Overflow](http://stackoverflow.com/questions/5255874/rendering-partial-with-locals-in-haml)

さすがの StackOverflow
世界中まで広げると、同じ状態に陥ってワタワタしてる初心者と、それに答えてくれる親切な上級者の輪がデカイ。
ReactのJSXの代わりにJadeを使う


CoffeeScript+JadeでReactを使えるか試してみました。

CoffeeScriptでの記述方法は以下のリソースを参考にしました。

[React v0.13.0 Beta 1](http://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html#other-languages)


なかなか情報がありませんでしたが、本家以外では以下のリソースを参考にさせていただきました。

[React.jsをCoffeeScriptとjadeで書く](https://uzimith.github.io/2015/02/13/react-jade-coffee/)
[react-jadeでjadeテンプレートから仮想DOMを出力する](http://qiita.com/mizchi/items/4e17b54cd9cc70d747cc)

## react-jade-loader

バンドルはwebpackを利用し、Jadeは[react-jade-loader](https://www.npmjs.com/package/react-jade-loader)
で変換しています。

## サンプル

サンプルはReact v0.13.0 Beta 1と同じ内容のものからJadeを使うによう変更したものをGitHubへ置いています。

[https://github.com/notice/react-jade - GitHub](https://github.com/notice/react-jade)

gulp+webpackでビルドできるところまで書いてあります。
Webサーバはお好きなもので。


自作Componentを含めたJadeの変換をどうすればいいのかよくわかりませんでしたが、react-jadeのドキュメントとトランスパイルされたソースコードを見ながらやってみました。

[react-jade](https://github.com/jadejs/react-jade)

### Jadeソース

app.jadeからcounterコンポーネントを呼び出しています。プロパティが正しく反映されるかどうか調べます。

```:app.jade
div
  Counter(initialCount=1)
```

```:counter.jade
div
  span Count :
  button(onClick=tick)= count
```

### CoffeeScriptソース

app.jadeをreact-jade-loaderでコンパイルしておいて、`React.createFactory`で生成したファクトリを渡すことでレンダリングすることができました。

```ruby:app.coffee
React = require 'react'
_ = require 'lodash'
Counter = require 'counter'
tmpl = require './app.jade'

class App extends React.Component
  constructor: (props) ->
    super props
  render: => tmpl(_.assign {Counter: React.createFactory Counter}, @, @props, @state)

module.exports = App
```

```ruby:counter.coffee
React = require 'react'
_ = require 'lodash'
tmpl = require './counter.jade'

class Counter extends React.Component

  @propTypes = initialCount: React.PropTypes.number
  @defaultProps = initialCount: 0

  constructor: (props) ->
    super props
    @state = count: props.initialCount
  tick: =>
    @setState count: @state.count + 1
  render: => tmpl(_.assign {}, @, @props, @state)

module.exports = Counter
```

ReactにはマークアップとViewのロジックは密であるべきという思想があるようなんで、この方法だと、これに反してしまうのかもしれません。
macのターミナルの文字色を変更する

# .bash_profileと.bashrcを作って文字色を変更する
ターミナルの背景を黒にしたいので、環境設定からプロファイルを”Pro”にしてみましたが、文字色がすべて白で味気ないです。ユーザー名やディレクトリと自分が打ったコマンドの区別もわかりづらい。

そこで、ターミナルの文字色を変更する方法を調べたので、まとめます。

## .bash_profileを作る
ターミナルに表示される文字は.bashrcに記述しますが、.bashrcは.bash_profileから呼び出されるため、先に.bash_profileを作成します。作る場所はホームディレクトリです。

```text:terminal
// ホームディレクトリに移動
cd ~

// ファイルの作成
vi .bash_profile
```

```text:vi
//iでインサートモードに
if [ "$TERM_PROGRAM" = "Apple_Terminal" ]; then
    if [ -f ~/.bashrc ]; then
        source ~/.bashrc
    fi
fi

//escでコマンドモードに移ってからファイル保存
:wq
```

.bash_profileを有効にするために、いったんターミナルを終了して再度起動してください。これで新しいターミナルウィンドウを立ち上げた時に.bashrcが実行されるようになりました。

## .bashrcを作る
それではターミナルにどのように文字を表示するか、.bashrcで指定していきます。設定は$PS1に書かれているので、これを変更します。

```text:terminal
// ホームディレクトリに移動
cd ~

// 今の設定を確認
$ echo $PS1
\h:\W \u\$

// ファイルの作成
vi .bashrc
```

```text:vi
//iでインサートモードに
PS1="\[\033[36m\]\h:\W \u\$\[\033[0m\]"

//escでコマンドモードに移ってからファイル保存
:wq
```

先頭に`\[\033[36m\]`を付け加えました。以降の文字色がシアン(36m)になります。そして、自分が入力するコマンドは白色のままにしたいので、最後に`\[\033[0m\]`を付け加えました。以降の文字色が白(0m)になります。

ここで新しいターミナルウィンドウを立ち上げると.bashrcの設定が読み込まれて、ターミナルの文字色が変更されていると思います。

![スクリーンショット 2015-09-04 20.35.16.png](https://qiita-image-store.s3.amazonaws.com/0/91542/a0a64d91-3b1b-32c1-20cf-d0dfd63332e2.png)

以上です。
IEのテキストボックスは、フォーカスが当たった状態でreadOnlyをオンにしても引き続き編集ができる

[jsFiddle サンプル](http://jsfiddle.net/opengl_8080/fs4f9793/)

上記サンプルでは、テキストボックス内で `Enter` を入力すると、テキストボックスが `readOnly` になるように実装している。

Chrome や Firefox なら、 `readOnly` になった後は当然編集ができなくなる。

しかし、 IE だと `readOnly` が設定された後もフォーカスが外れるまで編集ができてしまう。
一応、一度フォーカスが外れれば、以後は普通に読み取り専用となる（バグだろ・・・）。

しかたないので、強制的に `blur()` を実行するようにすれば、 IE でも他のブラウザと同じように動くようになる。

[修正版サンプル](http://jsfiddle.net/opengl_8080/kqpjsv4z/)

#参考
- [Node.textContent - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/Node/textContent)
- [element.blur - Web API インターフェイス | MDN](https://developer.mozilla.org/ja/docs/Web/API/HTMLElement/blur)
- [JavaScriptでreadonly - ITエンジニアのひとりごと](http://d.hatena.ne.jp/fkawakam/20080920)
HTTP サーバと Worker プロセスを 1 つの Dyno で立ち上げて節約

Heroku では通常 Web サーバと Worker プロセスでそれぞれ異なる Dyno を起動する必要があり、それぞれで課金されます。
個人用途レベルのツールであれば Dyno を 2 つも立ち上げるのはもったいないと感じることでしょう。

Ruby では EventMachine を使うことによって 1 Dyno で済ませるやり方が知られています。

[HerokuのSinatraにバックグラウンドワーカーを詰め込んで節約](http://shokai.org/blog/archives/6309)

Golang においては goroutine をつかうことによって、より自然に実現することができます。
(まぁ Golang においては当たり前の話なので、Golang を使ったことない人に、Golang だとこういうことができる！という感じに読んでもらえればと思います。)

# コード例

以下は Worker では 10 秒おきに数値をカウントアップし、HTTP サーバではその数値を出力するだけの例です。

```go
package main

import (
	"fmt"
	"log"
	"net/http"
	"os"
	"sync/atomic"
	"time"
)

var count uint64

// 10 秒おきに数値をカウントアップし続けるだけの関数
func countUpdater() {
	for {
		atomic.AddUint64(&count, 1)
		time.Sleep(10 * time.Second)
	}
}

func main() {
	port := os.Getenv("PORT")

	if port == "" {
		log.Fatal("$PORT must be set")
	}

	// カウントアップ用の goroutine (Worker) を起動
	go countUpdater()

	http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
		fmt.Fprintf(w, "Count: %d\n", count)
	})
	// HTTP サーバを起動
	log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil))
}
```

# 実行例

数値が 10 秒置きに増えていくことが確認できると思います。

https://heroku-golang-http-with-worker.herokuapp.com/

# 活用例

## 睡眠時間を避けて Keep-Alive する

[Dyno の種類](https://www.heroku.com/pricing)にもよりますが、Heroku では一定時間リクエストがないと [Dyno がスリープ状態](https://devcenter.heroku.com/articles/dyno-sleeping#sleeping)に入ります。
ですが、Worker (goroutine) 内で自信を一定時間おきに GET するようにすればスリープしないようになります。
(ここではそれを Keep-Alive と表現しています)

ですが、Heroku は 2015 年から料金プランが改定され、無料プランの場合は 1 日に Dyno が 6 時間はスリープ状態となるようになりました。
なので、例えば睡眠時間を避けた時間帯のみ Keep-Alive するようにすれば、自分がおきている時間は快適にアプリを利用できるし、Worker も動き続けることになります。
もちろん、アプリの用途によっては寝ている時間に動いていて欲しいものもあるとは思いますが、その辺はうまく調整しましょう。

## 重い処理を Worker で行う

まぁ Worker の使い方としては普通ですね。
クローラを Worker として動かし、そのフロントエンドとして HTTP サーバを動かす、といった感じがよくあるんじゃないでしょうか。

# 注意点

## Dyno は再起動されることを念頭におく

デプロイ時もそうですし、スリープ後の起動時もそうです。
(それとらとは関係なしに一定時間の再起動も行われていたかも)

なので、インメモリの変数は再起動時にクリアされてしまいます。
上記のコード例がまさにそうですね。
永続化は Heroku Postgres や Heroku Redis などの永続化層を用意しましょう。

## 柔軟なスケールアップは難しい

例えば Dyno を 2 つにした時点で HTTP サーバも Worker も 2 つになります。
HTTP だけ 2 つにして Worker は 1 つでいい、といったことを実現するのであれば、普通にプロセスごとに Dyno を割り当てていくのが良いでしょう。

あくまでも個人的なレベルのツールを節約して使いたい時用ということで。
linux / MacOSX > udp通信(ポート6000)へ/からの通信をキャプチャする > tcpdump -n udp portrange 6000

```txt:動作確認
CentOS 6.5 (32bit)
```

ポート6000のUDP通信をキャプチャしたい。

- 自分のIP: 192.168.10.8
  - キャプチャをする側 
- 相手のIP: 192.168.10.6
  - echo server起動中

### 手順
1. 192.168.10.8の一つのTerminalでsuにてrootユーザになる
2. 次のコマンドを実行しておく `tcpdump -n udp portrange 6000`
3. 別のTerminalで以下のコマンドを実行する

```
$ echo "TEST2B" | nc -u 192.168.10.6 6000
TEST2B
```

tcpdumpを実行していた端末には以下のような情報が表示される。

```
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
19:54:02.616539 IP 192.168.10.8.33668 > 192.168.10.6.6000: UDP, length 7
19:54:02.624092 IP 192.168.10.6.6000 > 192.168.10.8.33668: UDP, length 7
```

UnityでのUDP通信が失敗していたのはポート番号がらみのようだ。

## MacOS X > Terminal

MacOS X 10.8.5のターミナルにて su してから tcpdumpでキャプチャしたところ、192.168.10.6 への通信はキャプチャできているが、192.168.10.6からの通信がキャプチャできていない。でも実際には192.168.10.6からの応答は受けている。

```
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on en0, link-type EN10MB (Ethernet), capture size 65535 bytes
20:15:20.014699 IP 192.168.10.3.57414 > 192.168.10.6.6000: UDP, length 5
```

このlinuxとMacOS Xの振る舞いの違いは今のところよくわからない。
Android Studio移行でアプリアイコンが複数出るようになった話


exlipse → Android Studioへ移行したらアプリアイコンが複数出るようになって戦ったメモ。

直接的な原因は[この辺](http://fbc-web.jp/otsudesu/android-icon-daburu/)でも紹介されているようにManifest.xmlに

```xml:Manifest.xml
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
```

が複数存在するからなのですが、何度確認しても1つしか見当たらない...

困りはててManifest周りのドキュメント探していたらこんな記事が

>Android StudioはGradleを採用しているのでAndroidManifest.xml が複数あった場合マージされるとの事。。。

>[Android Studio への引っ越しトラブル ~ Manifest Merger編 ~](http://bitwave.showcase-tv.com/android-studio-%E3%81%B8%E3%81%AE%E5%BC%95%E3%81%A3%E8%B6%8A%E3%81%97%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB-manifest-merger%E7%B7%A8/)

###Σ(ﾟ□ﾟ(ﾟ□ﾟ*)ﾅﾆｰｯ!!

というわけで利用しているライブラリのAndroidManifest.xmlを確認したところ上記の表記ががが
削除して治りましたとさ...orz
linux > udpで "TEST2" を送信する > echo "TEST2" | nc -u 192.168.10.6 6000

```txt:動作確認
1. MacOS X 10.8.5 > ターミナル
2. CentOS 6.5 (32bit)
```

UDPのポート6000でテキストを送信する場合、以下を実行する。

```
$ echo "TEST2" | nc -u 192.168.10.6 6000
TEST2
```

192.168.10.6ではUDP echo serverを立てているので、送信した文字がそのまま返ってきている。

`-u`をつけることでUDP通信にしている。`-u`がない時はTCP通信になるようだ。
Swift での Int 型 switch case の落とし穴（？）

Swift の switch-case は範囲も使えるので大変便利ではありますが、Int 型でその「範囲」の使い方に意外な落とし穴がありました。例えば Playground で下記のコードを書いてみましょう：

```swift
let a = 0
switch a {
case Int.min ..< 0:
	print("負数")
	
case 0:
	print("零")
	
case 1 ... Int.max:
	print("正数")
	
default:
	fatalError("俺はプログラマをやめるぞ！")
}
```

まあこれなら結果はお察しの通り「零」が出力されますね。試しに `let a = -1` に直してみればそれはまた「負数」が出力されますね。では、試しに `let a = 1` に直してみれば結果はどうなるのでしょうか？

はい、正解は：ランタイムエラーでした！
![スクリーンショット 2015-09-04 19.32.23.png](https://qiita-image-store.s3.amazonaws.com/0/63998/584fa849-2c62-7859-c4ef-95b0f93b93ca.png)

理由はいかにも単純で、実は `case` 文のあとに書く範囲はデフォルトでは `Range` にみなされてしまうのです。Swift における `Range` と言うのは `Range.startIndex ..< Range.endIndex` のように表現されますので、つまり最後は `case 1 ... Int.max` と書いているにも関わらず、実際は `case 1 ..< Int.max.successor()` 、つまり `endIndex` は `Int.max + 1` で処理されてしまうのです。当然、すでに `Int.max` だからそこから更にプラスすると表現できずランタイムエラーになってしまいます。

実はこれ、[Stackoverflow](http://stackoverflow.com/questions/28546203/swift-range-bug-with-switch-statement) にも気づいた人がいたのですがどうやらいかんせんアップルはこれを直す気がなさそうです。ですのでこれはどうにかソースコードで直すしかないのです。まあ一番簡単なやり方として

```swift
case 1 ..< Int.max, Int.max:
```

と、`1 ..< Int.max` の `Range` を作ってそこにもう一つ `Int.max` を追加する方法ですかね。もしくは「こんな書き方じゃあスマートじゃない！」と思うのなら、下記の書き方もできます：

```swift
case ClosedInterval(1 ... Int.max):
```

こう書けば強制的に `Range` ではなく `ClosedInterval` で `case` の範囲を作りますので、これも一つの手です。

まあどのみち、どうせ `Int` 型なんだから最初から `Interval` で範囲作ってくれればいいのにアップル様。

p.s. あともうすでに `case` の中に全ての `Int` の場合を挙げたにも関わらずそれでも `default` 書かなきゃいけないアップル様のバカ！
ユーザビリティの検証に役立つトリセツ作成

狭い経験値からくる偏見かもしれませんが、デザイナーが作る画面設計は、システム的な整合性に欠け、エンジニアが作る画面設計は、使うに耐えられないシロモノになることがあります。ユーザーインターフェースを作り上げていくために必要な要素というか作業工程は、４つあると考えています。

1. コンセプトを明確にする。クリエイティブブリーフって呼ばれたりしますね。
1. 機能を忠実に表現する。「形式は機能に従う（form follows function.)」というやつです。
1. ユーザー目線に立ち、わかる言葉遣いにする。理解する必要のないアフォーダンスににする。また、明確なルールに基づいた統一感を作りシンプルにする。
1. コンセプトの表現として、質感や飾り、遊びを入れる。

これも偏見かもしれませんが、1.のコンセプトワークと4.の飾り部分は、システムエンジニアにとって少々ハードルが高いのですが、2. 3. は、とても得意な領域だと思っています。でも、忙しい人が多い職種ですから、デザイナーのタスクにしている方が多いのではないでしょうか？

ユーザー目線に立った言葉遣いになっているかどうかを自己チェックするには、利用者に読んでもらうことを目的としたマニュアル、いわゆるトリセツを作ってみることをお勧めします。トリセツに書くべき文章は、例えば、

> 投稿ボタンをクリックしたら、追加画面に遷移します。

とか

> 変更をキャンセルしますか？とメッセージが表示されるので、キャンセルボタンをクリックして下さい。

とかいった文章を書くはめになります。そこで、「いやいや、投稿ボタンをクリックしたら、投稿画面に遷移しないと変だよね。。。」「キャンセルしますか？と聞かれたら、［はい］でいいじゃん。」といった気付きを得ることができるのです。整合性のとれていない文章を書いていると、なんだか嫌な気分になるものですよね。嫌な感じを解消していくと、ユーザビリティが見違えるほど向上することがあるのです。
ユーザビリティを向上するために、コピーライティングのセンスは必要ありません。重要なのは、ユーザー目線に立って、整合性のある言葉を選んでいくための、まとまった時間をとることなのだと思います。
東京五輪エンブレム for Javascript

# 東京五輪の佐野ロゴをRaphaelで書いてみてた
![エンブレム.png](https://qiita-image-store.s3.amazonaws.com/0/25104/88cc3272-f494-586d-0ee8-df73c951f002.png)


# 思いついて書き込もうと思ったら、もうすでにいっぱいあったし
[これでみんないつでも描けるね！ 東京五輪エンブレムのコードがオープンソースに - ねとらぼ](http://nlab.itmedia.co.jp/nl/articles/1508/03/news114.html)
[東京五輪エンブレム for iOS](http://qiita.com/shu223/items/af5a8dd47770669ebb3a)
[東京五輪エンブレム for Android](http://qiita.com/suzukihr/items/32a243cfde6f4d281c2a)
[東京五輪エンブレム for Ruby](http://qiita.com/Peranikov/items/5997cd4437e7aaa8ddab)

# せっかく作ったので
大きさや比率・座標位置は適当です。

```
bower install raphael
```

``` index.html
<!DOCTYPE html>
<html>
<head lang="ja">
    <meta charset="UTF-8">
    <title></title>
    <style>
        #svg {
            width: 500px;
            height: 500px;
        }
    </style>
</head>
<body>
<div id="svg"></div>
<script src="http://cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min.js"></script>
<script type="text/javascript">
    window.onload = function () {
        var stageW = 500, stageH = 500;
        var paper = Raphael("svg", stageW, stageH);
        paper.path("M0,0 L0,165, 165,0 Z").attr({fill: "#b49146", stroke: "#F33", "stroke-width": 0}); // left triangle
        paper.path("M330,500 L500,500, 500,335 Z").attr({fill: "#b4b4b4", "stroke-width": 0}); // right triangle
        paper.add([
            {type: "circle", cx: 250, cy: 250, r: 265, fill: "#FFF", "stroke-width": 0}, // big circle
            {type: "rect", x: 165, y: 0, width: 168, height: 500, fill: "#373737", "stroke-width": 0}, // bo
            {type: "circle", cx: 416, cy: 84, r: 83, fill: "#e60014", "stroke-width": 0} // red circle
        ]);
    };
</script>
</body>
</html>
```
http://jsfiddle.net/kotaroino/164kudgo/1/

# ソース
ライセンスはMITです。
https://github.com/kotaroino/TokyoOlympicEmblem-for-javascript
chrome.storage を利用したchromeへのデータ保存

#はじめに
ローカル環境で動作するchrome extensionを作った際に利用した、
chrome内のデータストレージである **chrome storage** についてのご紹介。
入力された文字データを残していく記録用途で使いました。

#chrome.storageとは？
箇条書きになりますが...
- chromeにkey-value形式でデータを保存することができる
- オプションから"単体運用(local)" or "chromeアカウントと同期(sync)"が選択可能
- 保存データ量は、基本的に5Mib。ただし"単体運用(local)"を選択時のみ、無限にするオプション有り。
- developer.chromeのAPIとサンプルを見る限り、chrome-extension上で動作させることをベースとしている?
- -> 特に"chromeアカウントと同期(sync)"を利用する場合は、chrome-extension前提となっている

API一覧は、developer.chromeに網羅されています。
[developer.chrome site](https://developer.chrome.com/extensions/storage)

#webstorageとの違いは？
- 基本的にchrome上でしか動作しないので、専用環境(chromeアプリ等)で動作させる
- クッキーやキャッシュを削除しても、保存したデータが保持される
- string型以外でもvalueに挿入可能

他にも違いがあるのでしょうが、使ってみた感覚ではこんな感想ですね...


#使い方 (local)
単体運用(local)でのサンプルコードです。
指定したkeyに対して、任意のvalueを保存します。
###保存方法
```js:chromestorage_local_set.js
chrome.storage.local.set({'key': value}, function () {
});
```
###取り出し方法
任意のkeyの対になる値をvalueとして返します。

```js:chrome_storage_local_get_1.js
chrome.storage.local.get("key", function (value) {
  var value_data = value.key;
});
```
複数のkeyを渡して、複数のvalueを得る場合は、keyをブラケットで囲いましょう

```js:chrome_storage_local_get_2.js
chrome.storage.local.get(["key1", "key2", "key3"], function (value) {
  var value_data_1 = value.key1;
  var value_data_2 = value.key2;
  var value_data_3 = value.key3;
});
```

#使い方 (sync)
基本的に、前項で**local**と指定していた箇所を**sync**に変更するだけです。

```js:chromestorage_sync_set.js
chrome.storage.sync.set({'key': value}, function () {
});
```

#まとめ
1台で完結するchrome-extensionを作成したので、**sync** 機能を活かしていませんが、
ブラウザ上でのクッキーの削除からデータが消えないのは嬉しいですね。
大きな枠組としては、localstorageと機能は類似しているので、動作させる環境によって選択すればいいのではないかと。

(localstorageを2012年にいじった時に、クッキー削除のタイミングで保持したデータも消されたのですが、今はもしかしたら仕様が変わっているかもしれません...未調査です。)
R言語のインストールから練習まで



A/B テストで施策の効果を検証！エンジニアのための R 入門 - クックパッド開発者ブログ
http://techlife.cookpad.com/entry/2015/05/08/114239
これを見ながらRに挑戦したメモ

グラフ描画まで写経するつもりだったんですが、脇道に逸れて力尽きました

## Install

```bash:
$ brew install gcc
$ brew install r
```

あとはクックパッドの記事を見ながら手を動かす
アドバイス通り、筑波大学は停電していました（助かりました

## 1時間触った感想
- 端末でペチペチやる
   - 記述量もRubyと同じぐらい少なめで良い
- コマンドの入力履歴を表示するには`history()`
- データ構造がまだよくわかっていない

```r:
### Rubyのメソッドチェーン(パイプ)っぽく書ける ※dplyrのおかげ
# `hoge %>% function` のfunctionの第1引数がhogeになる
library(dplyr)

1 %>% class    # "numeric"
iris %>% class # "data.frame" （irisはRに最初から入っているアヤメの計測データだそうです


### テーブルである data.frame の操作
# 行列は(1,1)要素から始まる
iris[1,1] # 5.1
iris[1,]  # 1行目のベクトル
iris[,1]  # 1列目のベクトル

iris[,1] %>% is.vector # TRUE
iris[1,] %>% is.vector # TRUE

# Rではタダの数字すらベクトル（要素数1のベクトルと捉えられる）
1 %>% is.vector # TRUE

# $ はカラム変数を指定する。以下の2つは同じことになる
iris$Sepal.Width %>% sum # 458.6
iris[,2] %>% sum         # 458.6


### データ構造を調べたいときに困る
# 次元が落とされてしまう
array(1:3) %>% is.array # TRUE
array(1:3) %>% class    # "integer"


```


## 優秀なテーブル操作

####「ユニークな2列と値」を「スプレッドシート」にする
`tidyr::spread(data_table, ユニークな2列のうち1列の要素名, 値として用いたい要素名)`

####「新しい列を追加する」
`dplyr::mutate(data_table, 新しい属性名 = (その定義式))`

なんか色々できすぎるので必要に応じてその都度覚えると良さそう

## 参考リンク
Rメモ
http://www.kabipan.com/computer/r/quick.html

細かすぎて使わない R 小技集 - Qiita
http://qiita.com/mwmsnn/items/1c6c03f06bd8be93230c

R dplyr, tidyr でのグルーピング/集約/変換処理まとめ - StatsFragments
http://sinhrks.hatenablog.com/entry/2014/10/13/003717

またあとでちゃんと触りたいです
Xcode ファンクションメニュー ショートカットキー まとめ

## Xcodeのcode editのファンクションメニューにコメントを表示させるためのキーワード
```large:viewController.m
#pragma mark - the function menu
-(void)functionMenu
{
    //MARK:xxxx
    //TODO:xxxx
    //FIXME:xxxx
    //???:xxxx
}
```
markの"-"は仕切り線の為。無くてもよい。
![s2015-09-04_19_20_23.png](https://qiita-image-store.s3.amazonaws.com/0/88911/a2aa3146-f68c-28ea-caf4-51a1bb8734c3.png)

## Xcode で複数行のタブ(インデント,シフト)やコメントアウトするには

shiftを押しながら行選択してから
　left shift ←　の場合は
　　⌘[
　right shift →　の場合は
　　⌘]
　コメントアウト comment selection // の場合は
　　⌘/
menu->Edit->Structure->にある

## Xcode で *.h と *.m を切り替える
^⌘↑
menu->navigate->にある
rails g実行時にhelperもtestもjsもscssも作らないようにする方法

# application.rbを次のように編集する

```rb:application.rb
# 上段中略
module Protospace
  class Application < Rails::Application
   # ----------------追記部分----------------------
    config.generators do |g|
        g.test_framework false
        g.helper false
        g.assets false
    end
   # ----------------追記終了-----------------------
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.

    # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
    # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
    # config.time_zone = 'Central Time (US & Canada)'

    # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
    # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
    # config.i18n.default_locale = :de
  end
end


```

# 参考url 
[Railsのgenerateコマンドを俺好みに設定する](http://tmiyamon.github.io/blog/2014/11/13/configure-the-behavior-of-scaffolding-in-rails/)
LeoFSのDockerイメージを使ってみた

imageをpullするだけで使える。

```
$ docker pull firejun/leofs

$ docker images
REPOSITORY                TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker.io/firejun/leofs   latest              913a9bafa916        4 months ago        793.9 MB

$ docker run 913a9bafa916
 * Starting OpenBSD Secure Shell server sshd
   ...done.

tput: No value for $TERM and no -T specified
tput: No value for $TERM and no -T specified
Generating RING...
Generated RING
OK 100% - storage_0@127.0.0.1
OK
LeoFS is ready!!
```

IPが知りたいので、

```
$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                                                NAMES
9da99a740d99        913a9bafa916        "/usr/local/leofs/bi   6 minutes ago       Up 6 minutes        22/tcp, 8080/tcp, 10010-10011/tcp, 10020-10021/tcp   adoring_colden

$ docker inspect 9da | jq '.[].NetworkSettings.IPAddress'
"172.17.0.1"
```

`leofs-adm`が使える

```
$ ./leofs-adm -h 172.17.0.1 status
 [System Confiuration]
-----------------------------------+----------
 Item                              | Value    
-----------------------------------+----------
 Basic/Consistency level
-----------------------------------+----------
                    system version | 1.2.8
                        cluster Id | leofs_1
                             DC Id | dc_1
                    Total replicas | 1
          number of successes of R | 1
          number of successes of W | 1
          number of successes of D | 1
 number of rack-awareness replicas | 0
                         ring size | 2^128
-----------------------------------+----------
 Multi DC replication settings
-----------------------------------+----------
        max number of joinable DCs | 2
           number of replicas a DC | 1
-----------------------------------+----------
 Manager RING hash
-----------------------------------+----------
                 current ring-hash | 433fe365
                previous ring-hash | 433fe365
-----------------------------------+----------

 [State of Node(s)]
-------+--------------------------+--------------+----------------+----------------+----------------------------
 type  |           node           |    state     |  current ring  |   prev ring    |          updated at         
-------+--------------------------+--------------+----------------+----------------+----------------------------
  S    | storage_0@127.0.0.1      | running      | 433fe365       | 433fe365       | 2015-09-04 08:57:39 +0000
  G    | gateway_0@127.0.0.1      | running      | 433fe365       | 433fe365       | 2015-09-04 08:58:05 +0000
-------+--------------------------+--------------+----------------+----------------+----------------------------
```

バージョンはちょっとだけ古いみたいだ。SSHDも起動しているので、コンテナの中に入って設定ファイルなどを確認したりもできる。(User:leofs, Password:leofs)

ちなみにfirejunさんはLeoFSの中の人。
現在ページのjQueryイベントを全て確認するSnippets

#はじめに
途中からプロジェクトに参加したり、複数人でjsをガリガリ書いていたりすると、どこでどんなイベントが設定されているか、全容が把握しにくいことがあると思います。
そこで、今いるページのイベントがざっと確認できるようなコードを書いてみました。何かの役に立つことがあれば幸いです。


#注意事項
- jQueryで登録されているイベントのみが対象です
- addEventListener等で登録されたものは表示されません
- ページにはjQueryが使われている必要があります

> このコードでは上手くいかないページも多いかと思います。必要に応じて適宜調整していただければと思います。


#コード
##jQuery1.8以上

```jqueryのイベントを全て表示する.js
jQuery.noConflict();
jQuery(function($) {
  (function showEventList() {
    var allTags = document.body.getElementsByTagName('*');
    var tag;
    var i = 0;
    var l = allTags.length;
    for (; i < l; i++) {
        tag = $._data(allTags[i], 'events');
        if (tag !== undefined && tag !== null) {
          console.log(allTags[i], tag);
        }
    }
  })();
});
```

##jquery1.8未満
```jqueryのイベントを全て表示する.js
jQuery.noConflict();
jQuery(function($) {
  (function showEventList() {
    var allTags = document.body.getElementsByTagName('*');
    var tag;
    var i = 0;
    var l = allTags.length;
    for (; i < l; i++) {
      tag = $(allTags[i]).data('events');
      if (tag !== undefined && tag !== null) {
        console.log(allTags[i], tag);
      }
    }
  })();
});
```


#使い方
- Chrome DevtoolsのSnippetsに登録して実行する
- DevtoolsのConsoleに貼り付けて実行する
- 直接スクリプトに埋め込む

ここではDevtoolsのSnippetsに登録して実行するようにしてみました。

**[参考イメージ]**

![getEvent.gif](https://qiita-image-store.s3.amazonaws.com/0/58436/e3d57b29-a05c-bb89-a065-449e9439ade4.gif)



#補足
上記コードは、body以下の要素を対象としています。また現在は全てのイベントを表示するようにしていますが、`click`イベントのみを表示する、といったことも簡単にできるかと思います。

```jQueryクリックイベントのみ表示.js
if (tag !== undefined && tag !== null && tag.click) {
  console.log(allTags[i], tag);
}
```


#参考

- [jQueryで設定されたクリックイベントなどを定義している場所を調べる方法](http://qiita.com/zaru/items/b7732ebad9b732518359)
ggplot2でspline()関数を使って曲線を描きたい

**2016/04/12追記: ggplot2 v2.1.0にて動作を確認しました**

## Q
私の持っているデータで、`spline(y~x)`というようにspline関数を使って曲線を描きたいのですが、`lm(y~ns(x), df=_)`といったスムージングを使う方法しか見つけられません。

どうしても`spline()`を使いたいのですが、ggplotで`spline()`を使うシンプルな方法はありますか。以下のような方法を考えたのですが、できればこういうテクニックに頼りたくありません:


```r:NG_example.R
geom_smooth(aes(x=(spline(y~x)$x, y=spline(y~x)$y))
```


## A
以下の方法を試してみてください:


```r:OK_example.R
n <- 10
d <- data.frame(x = 1:n, y = rnorm(n))
ggplot(d,aes(x,y)) + geom_point() + 
  geom_line(data=data.frame(spline(d, n=n*10)))
```

![OK_example.R-1.png](https://qiita-image-store.s3.amazonaws.com/0/35118/3d8a2053-8458-42a3-c300-fa128635aef6.png)


まず実際のデータを`geom_point()`でプロットしておき、スプライン曲線は`geom_line()`で引きます。このとき、この曲線で使用するデータとして、`spline()`で処理したデータフレームを指定すればOKです。

## 参照
この記事は、以下のStack Overflowに投稿された内容を翻訳して大幅に改編したものです:

- [r - How can I use spline() with ggplot? - Stack Overflow](http://stackoverflow.com/questions/4504498/how-can-i-use-spline-with-ggplot/4505341#4505341)
fluent-plugin-forestが見つからない！

    この記事の内容はAmazonLinux2015.03で実行しました。

コメント頂きましたように、どうやらtd-agent-gem使えば良かったようでした。
http://docs.fluentd.org/articles/faq#i-installed-td-agent-and-want-to-add-custom-plugins-how-do-i-do-it
td-agent2から変更されていたんですね。
/usr/sbin/td-agent-gemを開いてみると

```bash
#!/bin/sh
export GEM_HOME="/opt/td-agent/embedded/lib/ruby/gems/2.1.0/"
export GEM_PATH="/opt/td-agent/embedded/lib/ruby/gems/2.1.0/"
/opt/td-agent/embedded/bin/fluent-gem "$@"
```

環境変数設定してfluent-gemをよんでいました。

-------------------------
こんな感じでfulentdをインストール

```bash
yum -y groupinstall "Development Tools"
curl -L https://td-toolbelt.herokuapp.com/sh/install-redhat-td-agent2.sh | sh
```

fluentに付いてきたgemでfluent-plugin-forestをインストール

```bash
/opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.12/bin/fluent-gem install fluent-plugin-forest --no-rdoc --no-ri
```

td-agentを起動してみると以下の様なログが

```
[error]: dry run failed: Unknown output plugin 'forest'. Run 'gem search -rd fluent-plugin' to find plugins
```

forestが入っていないと・・・

```bash
/opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.12/bin/fluent-gem environment
RubyGems Environment:
  - RUBYGEMS VERSION: 2.0.14
  - RUBY VERSION: 2.0.0 (2015-04-13 patchlevel 645) [x86_64-linux]
  - INSTALLATION DIRECTORY: /usr/local/share/ruby/gems/2.0
  - RUBY EXECUTABLE: /usr/bin/ruby2.0
  - EXECUTABLE DIRECTORY: /usr/local/bin
  - RUBYGEMS PLATFORMS:
    - ruby
    - x86_64-linux
  - GEM PATHS:
     - /usr/local/share/ruby/gems/2.0
     - /root/.gem/ruby/2.0
     - /usr/share/ruby/gems/2.0
  - GEM CONFIGURATION:
     - :update_sources => true
     - :verbose => true
     - :backtrace => false
     - :bulk_threshold => 1000
  - REMOTE SOURCES:
     - https://rubygems.org/
ls /usr/local/share/ruby/gems/2.0/gems
fluent-plugin-forest-0.3.0
```

入っているけど、多分fluentはこっち使っていない。

```bash
ls /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/
```

はいっていない。。。ってことで

```bash
GEM_HOME="/opt/td-agent/embedded/lib/ruby/gems/2.1.0/" \
GEM_PATH="/opt/td-agent/embedded/lib/ruby/gems/2.1.0/" \
/opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/fluentd-0.12.12/bin/fluent-gem install fluent-plugin-forest --no-rdoc --no-ri

ls /opt/td-agent/embedded/lib/ruby/gems/2.1.0/gems/
fluent-plugin-forest-0.3.0
```

OK.


### おまけ

久しぶりにfluentを設置したらs3_endpointがs3_regionにかわっていた。起動はするけどログが来るとエラーを吐く。
```
[error]: failed to configure sub output s3: s3_endpoint parameter is not supported for S3, use s3_region instead. This parameter is for S3 compatible services
```

```
s3_endpoint s3-ap-northeast-1.amazonaws.com
↓
s3_region ap-northeast-1
```
でOK.