OmniAICreator/Qiita-1.07M huggingface dataset:
underscoreコードリーディング（findLastIndex）

underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##findLastIndexとは


###[underscorejs.orgのfindLastIndex](http://underscorejs.org/#findLastIndex)

こんな説明。
>####_.findLastIndex(array, predicate, [context]) 
Like _.findIndex but iterates the array in reverse, returning the index closest to the end where the predicate truth test passes.


```javascript
var users = [{'id': 1, 'name': 'Bob', 'last': 'Brown'},
             {'id': 2, 'name': 'Ted', 'last': 'White'},
             {'id': 3, 'name': 'Frank', 'last': 'James'},
             {'id': 4, 'name': 'Ted', 'last': 'Jones'}];
_.findLastIndex(users, {
  name: 'Ted'
});
=> 3
```
------------- 
_.findLastIndexに似ているが、arrayを逆から走査し、predicateのテストでtrueが返ってきたものに一番近いindexの値をかえす。


###[underscore.findIndex](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L628)
コード的にはこのあたり。

```javascript

  _.findLastIndex = createPredicateIndexFinder(-1);
  
```

createPredicateIndexFinderに-1を渡しているのみ


[createPredicateIndexFinder](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L613)は以下

```javascript
  // Generator function to create the findIndex and findLastIndex functions
  function createPredicateIndexFinder(dir) {
    return function(array, predicate, context) {
      predicate = cb(predicate, context);
      var length = getLength(array);
      var index = dir > 0 ? 0 : length - 1;
      for (; index >= 0 && index < length; index += dir) {
        if (predicate(array[index], index, array)) return index;
      }
      return -1;
    };
  }
```


dir=-1なのでこうなる

```javascript

function(array, predicate, context) {
      predicate = cb(predicate, context);
      var length = getLength(array);
      var index = length - 1;
      for (; index >= 0 && index < length; index-- {
        if (predicate(array[index], index, array)) return index;
      }
      return -1;
    };

```

arrayのlength分だけfor文をindexがマイナスになるまで回す。
predicateに合致した場合はindexを返す。
for分を回しても返り値がなかった場合、-1を返す。
RDS Mysql運用まとめ

# 以下にメモリで処理させることを工夫する
データ取得する時にはメモリはディスクの10の5乗〜10の6乗倍（10万倍〜100万倍）以上高速である

### メモリを増やす
ディスクへのアクセスを少なくして、メモリアクセスを有効利用するために、メモリをDBファイルと同じぐらいのサイズが望ましい、メモリが足りない場合は、ディスクへの読み込みが頻繁に発生して、当然遅くなる

#### DBのファイルサイズを確認(mysqlの場合)
```mysql
# 全DBのファイルサイズ
SELECT  table_schema
       , SUM(data_length+index_length) /1024 /1024 as MB 
FROM information_schema.tables
GROUP BY table_schema
ORDER BY SUM(data_length+index_length) DESC

# カレントDBのテーブル毎のファイルサイズ
SELECT  
table_name, engine, table_rows, avg_row_length AS '平均行容量',  
floor((data_length+index_length)/1024/1024) AS '総容量MB',
floor((data_length)/1024/1024) AS 'データ容量MB',
floor((index_length)/1024/1024) AS 'インデックス容量MB'
FROM information_schema.tables
WHERE table_schema=database()
ORDER BY (data_length+index_length) DESC;
```

# 画面が遅い、タイムアウトになる場合は調査
以下は本番ではなく、stagginDBでやること

1. アクセスログを有効にして、発行するSQLを全部見れるようにする

```
SHOW GLOBAL VARIABLES where Variable_name like '%general_log%';
SET GLOBAL general_log = 'ON';
SET profiling=1;

general_log_fileの値を見て、ファイル監視
$ tail -f /var/lib/mysql/#{hostname}.log
```
WordPressでumaskとかsetgidを有効にする方法

wp-config.phpに以下を追加する

# グループに書き込み権限を付与

```
define('FS_CHMOD_DIR', (0775 & ~ umask()));
define('FS_CHMOD_FILE', (0664 & ~ umask()));
```

# グループに書き込み権限を付与＆ディレクトリの setgid 有効化

```
define('FS_CHMOD_DIR', (02775 & ~ umask()));
define('FS_CHMOD_FILE', (0664 & ~ umask()));
```

# 参考リンク
http://www.teradas.net/archives/10547/
mbed LPC1768をMDK-ARMでデバッグ

mbedオンラインコンパイラ上のmbed LPC1768向けプログラムを、オフラインコンパイラMDK-ARM v5.17でデバッグしてみました。

#前提
[mbed LPC1768のプログラムをMDK-ARMでコンパイル](http://qiita.com/matsujirushi/items/aabed95c35b2177b7075)
使うデバイスは、mbed LPC1768。
MDK-ARMは、v5.17。
[μVision4でデバッグ！](https://developer.mbed.org/users/MACRUM/notebook/uvision4_debug/)を参考にしました。

#デバッガを選択
Project -> Options for Target... を選択します。
DebugタブのUse:を選択して、CMSIS-DAP Debuggerを選択します。
![20160116M.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/05968345-44f9-f50b-7bc0-c4267dd51b57.png)

#デバッグ実行 ... NG
Debug -> Start/Stop Debug Sessionを選択します。
すると、、、エラーorz

```text:BuildOutput
Load "C:\\...\\mbed_blinky\\build\\mbed_blinky.axf" 
Internal DLL Error
Error: Flash Download failed  -  Target DLL has been cancelled
Flash Load finished at 20:48:09
```

デバイスとプリンターで確認すると、デバイスにMBED CMSIS-DAPが存在していません。
入っているファームウェアが、CMSIS-DAPに対応していないようです。
![20160116N.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/36dc81e8-7a2a-21aa-36f0-a971cfa305ea.png)


#CMSIS-DAP対応のファームウェアに書き換え
[Firmware LPC1768 LPC11U24](https://developer.mbed.org/handbook/Firmware-LPC1768-LPC11U24)のDownload latest firmwareをクリックして、最新のファームウェアをダウンロードします。
ダウンロードしたファイルをmbedドライブへコピペして、USBを抜き差しします。

デバイスとプリンターで確認すると、未指定にMBED CMSIS-DAPが表示されました。(表示位置が予想と違っていた。)
![20160116O.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/fea48f4f-fa02-ee6c-cf87-e3f2e0eb9eae.png)

#デバッガを選択(2回目)
Project -> Options for Target... を選択します。
DebugタブのUse:を選択して、CMSIS-DAP Debuggerを選択します。
CMSIS-DAP Debuggerの右側にあるSettingsをクリックすると、接続しているデバッガが確認できました。
ここのSW Deviceにそれっぽいものが表示されていれば、uVision5からデバッガが認識できています。
![20160116P.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/644292c7-05a8-ff6b-b122-a922df64ac1c.png)

#デバッグ実行(2回目) ... NG
Debug -> Start/Stop Debug Sessionを選択します。
すると、、、エラーorz
![20160116Q.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/044d8e25-284d-632a-8846-706ed29500cb.png)

LPC_IAP_512.flmというファイルが存在していません。
![20160116R.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/439a7cfd-82dc-1c1d-a7a9-f0d6bc86ece2.png)

MDK-ARM v4.xに同封されているファイルのようですが、ネット漁っても見つからず。
[Wataraiさん](https://developer.mbed.org/users/MACRUM/)に質問したところ、なんと即答（！）　いつもありがとうございます。

#MDK v4 Legacy Support for Cortex-M Devicesをインストール
[MDK v4 Legacy Support](http://www2.keil.com/mdk5/legacy/)のMDK v4 Legacy Support for Cortex-M Devicesをクリックしてダウンロード、インストールします。
![20160116S.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/8506c337-977b-5846-ba93-25777ac0c237.png)

LPC_IAP_512.flmが入りました。
![20160116T.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/efb4cb1e-a84e-875f-f60c-11a78ebd3502.png)

#デバッグ実行(3回目)
Debug -> Start/Stop Debug Sessionを選択します。
動いた！！！
![20160116U.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/6f7eb633-38a4-9191-652e-d3a2dff28db7.png)

#まとめ
- デバイスとプリンターで、MBED CMSIS-DAPが存在しているか確認する。（なければファームウェアをアップデート）
- C:\Keil_v5\ARM\FlashにLPC_IAP_512.FLMがあるか確認する。（なければMDK v4 Legacy Support for Cortex-M Devicesをインストール）
shapeless - TypeClass

代数的データ型が持ってる型から型クラスのインスタンスを自動導出して、`scala.math.Ordering`を適用できるようにしてみる。Orderingは型クラスなのでscala本体に定義してある型クラスのインスタンスをそのまま使う。

まずGenericやHList知らない方は[コレ](/ryoppy/items/476467a4b709f011fb8f)を読もう。

shapelessのGenericを使ってHListかCoproductに変換して、先頭から一つずつ`scala.math.Ordering`の型インスタンスを取得してcompareしていく。同じじゃなくなるまでcompareする。

Genericを直接使わず[TypeClass](https://github.com/milessabin/shapeless/blob/master/core/src/main/scala/shapeless/typeclass.scala)を使うと少しシンプルに書ける。TypeClassを継承して、GenericでHListかCoproductに変換した後に処理する関数を定義する。


## コード

```scala
import shapeless._

object OrderingDerive extends TypeClassCompanion[Ordering] {

  object typeClass extends TypeClass[Ordering] {

    override def coproduct[L, R <: Coproduct](cl: => Ordering[L], cr: => Ordering[R]): Ordering[L :+: R] =
      new Ordering[L :+: R] {
        def compare(a1: L :+: R, a2: L :+: R) =
          (a1, a2) match {
            case (Inl(l1), Inl(l2)) => cl.compare(l1, l2)
            case (Inr(r1), Inr(r2)) => cr.compare(r1, r2)
            case (Inl(_), Inr(_)) => -1
            case (Inr(_), Inl(_)) => 1
          }
      }

    override def emptyCoproduct: Ordering[CNil] =
      new Ordering[CNil] {
        def compare(a1: CNil, a2: CNil) = 0
      }

    override def product[H, T <: HList](ch: Ordering[H], ct: Ordering[T]): Ordering[H :: T] =
      new Ordering[H :: T] {
        def compare(a1: H :: T, a2: H :: T) = ch.compare(a1.head, a2.head) match {
          case 0 => ct.compare(a1.tail, a2.tail)
          case a => a
        }
      }

    override def emptyProduct: Ordering[HNil] =
      new Ordering[HNil] {
        def compare(a1: HNil, a2: HNil) = 0
      }

    override def project[F, G](instance: => Ordering[G], to: F => G, from: G => F): Ordering[F] =
      new Ordering[F] {
        def compare(a1: F, a2: F) = instance.compare(to(a1), to(a2))
      }
  }
}
```

全部の型でcompare使えるように。

```scala
implicit class ToComparable[A](val a1: A) {
  def compare(a2: A)(implicit ord: Ordering[A]): Int = ord.compare(a1, a2)
}
```

## 試す

Versionを表した型

```scala
case class Version(major: Int, middle: Int, minor: Int)
```

```scala
import OrderingDerive._

scala> Version(1,0,0) compare Version(1,0,1)
res74: Int = -1

scala> Version(1,0,0) compare Version(1,0,0)
res75: Int = 0

scala> Version(1,1,0) compare Version(1,0,0)
res76: Int = 1
```

Treeを表した型

```scala
sealed trait Tree[T]
case class Leaf[T](t: T) extends Tree[T]
case class Node[T](l: Tree[T], r: Tree[T]) extends Tree[T]
```

```scala
scala> def node[A](a: A, b: A): Tree[A] = Node(Leaf(a), Leaf(b))
//node: [A](a: A, b: A)Tree[A]

scala> node(1, 2) compare node(1, 3)
//res91: Int = -1

scala> node(1, 2) compare node(1, 2)
//res92: Int = 0

scala> node(1, 3) compare node(1, 2)
//res93: Int = 1

scala> Leaf(1) compare Leaf(2)
//res94: Int = -1
```

あってる。はず。
いやしかしGenericすごい。
[シェルスクリプト]dockerのimageを更新し、不要なimageを削除する


docker pullしてimageを更新し、結果として山ほどできるnoneなimageを削除するのが面倒くさいのでシェルスクリプトにした。

```bash:upimage.sh
#!/bin/sh

echo "Updating docker images..."
docker images | grep -v REPO | cut -f1 -d" " | uniq | xargs -n1 docker pull
echo "removing obsoleted images..."
docker images -f dangling=true -q | docker rmi
```
grepの利用技まとめ

## オプション

### 検索関連

| オプション | 説明| 
|:-----------|:-----------|
| -r  | 再帰的にgrepコマンドを実行する |
| --include=*.rb | 指定ファイルのみ検索 |
| --exclude-dir=test | 指定フォルダを除外 |
| -w  | 単語としてマッチする場合(IDEのwhole words only) |
| -e 検索パターン  | 検索パターンを指定 |
| -G  | 基本正規表現を使う |
| -E  | 拡張正規表現を使う |
| -P  | Perl正規表現を使う |
| -i  | 大文字小文字区別しない |
| -w  | Matches only word/words instead of substring. |
| -v  | マッチしない形を検索結果になる |
| -n  | 行番号を表示する |

### 表示関連

| オプション | 説明| 
|:-----------|:-----------|
| -A number  | マッチ結果の後ろの何行を表示(after) |
| -B number  | マッチ結果の前の何行を表示(before) |
| -number  | マッチ結果の前後何行を表示(before and after) |
| -n  | 行番号を出力する |
| -l  | ファイル一覧を出力する |
| --color  | 結果に色つける |
| --line-buffered  | bufferしないで出力、ログリアルタイム監視など使う |
| -s  | ファイルがない時でエラーが出力されないようにする |
| -o  | Display only matched pattern instead of whole line. |

### 検索
#### 複数パターン検索
注意するのは、"|" ではなく "\\|"を利用すること

```bash
$ grep "aaa\|bbb" test.txt
```

#### カレントフォルダ(サブフォルダ含む)で特定の文字含むファイル一覧

```bash
grep -rnw ./ -e "pattern"
```

#### アクセスログをリアルタイムに表示する

```bash
$ tail -f access_log | grep --line-buffered 'test'
```

#### grep -vの活用
-vはマッチしない形を結果になる、SQLのNOTのようなもの

##### grep で#で始まるコメント行および空白行を削除する

```bash
$ grep -v -e '^\s*#' -e '^\s*$' filename
```

##### プロセス名で検索し、grepを邪魔しないようにする

```bash
$ ps aux | grep java | grep -v grep
```

#### 特定のファイルの文字列のみ検索
_smart_phoneのviewファイルのみ文字列を検索する

```
find app/views/users2016/ -name "*_smart_phone*" | xargs grep 'content_for :title'
```


### 結果を見やすく
#### aliasで登録する

```rb
alias grep="grep --with-filename --line-number --color=always"
```

#### -C5で前後5行表示、ログ調査時によく使う

```bash
$ grep -C5 'error' log/xxxxx.log
```

### その他
#### 圧縮ファイル解凍せず検索するzgrep

```bash
$ zgrep 'test' file_name
```

#### マッチした部分のみ表示する
 
```bash
$ zgrep -ro --color 'rand=' sitemaps/
```

#### xmlタグの中身を取得
```
grep -Eo '<tag>(.*?)<\/tag>' test.xml
```

### 参考資料
[grepコマンドで覚えておきたい使い方14個(+3個)](http://orebibou.com/2014/12/grep%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E8%A6%9A%E3%81%88%E3%81%A6%E3%81%8A%E3%81%8D%E3%81%9F%E3%81%84%E4%BD%BF%E3%81%84%E6%96%B914%E5%80%8B/)
UnityのシーンIDを定数値で管理する

#目的
Unityにおいてシーンを切り替える際に
`Application.LoadLevel("Test_1");`
と文字列で行うと無駄なアロケートが発生するしTypoした際にコンパイルエラーで気づけない。
そこで静的にシーンIDを宣言するスクリプトを用意する。

#Editorスクリプト
```lang:SceneListEditor.cs
using System.IO;
using System.Text;
using UnityEditor;
using UnityEngine;


/// <summary>
/// シーン名を定数で管理するクラスを作成する
/// </summary>
public static class SceneListEditor {
	private const string PATH = "Assets/Scripts/SceneList.cs";	// ※ファイルパスは任意
	private static readonly string CLASS_NAME = Path.GetFileNameWithoutExtension(PATH);

	/// <summary>
	/// ファイル出力
	/// </summary>
	[MenuItem("CreateFile/SceneList")]	// ※メニュー項目名は任意
	public static void Create() {
		StringBuilder builder = new StringBuilder();
		builder.AppendLine("/// <summary>");
		builder.AppendLine("/// シーン名を定数で管理するクラス");
		builder.AppendLine("/// </summary>");
		builder.AppendLine("public static class " + CLASS_NAME + " {");
		builder.AppendLine("\tpublic enum ID {");
		foreach (EditorBuildSettingsScene scene in EditorBuildSettings.scenes) {
			// 無効なシーンはのぞく
			if (!scene.enabled)
				continue;
			string sceneId = Path.GetFileNameWithoutExtension(scene.path);
			builder.Append("\t\t").AppendFormat(@"{0},", sceneId.ToUpper()).AppendLine();
		}
		builder.AppendLine("\n\t\tMAX,");
		builder.AppendLine("\t}");
		builder.AppendLine("}");
		
		// ディレクトリ作成
		string directoryPath = Path.GetDirectoryName(PATH);
		if (!Directory.Exists(directoryPath))
			Directory.CreateDirectory(directoryPath);
		
		// ファイル作成
		File.WriteAllText(PATH, builder.ToString(), Encoding.UTF8);
		AssetDatabase.Refresh(ImportAssetOptions.ImportRecursive);

		// 完了通知
		// ※出力先を明示してあげると親切
		EditorUtility.DisplayDialog(Path.GetFileName(PATH), "Created [" + Path.GetFullPath(PATH) + "]", "OK");
	}
}
```

#出力されるスクリプト
```lang:SceneList.cs
/// <summary>
/// シーン名を定数で管理するクラス
/// </summary>
public static class SceneList {
	public enum ID {
		TEST_0,
		TEST_1,
		TEST_2,

		MAX,
	}
}
```

#使用例
`Application.LoadLevel((int)SceneList.ID.TEST_1);`

#注意
１．スペース等の記号を含むシーン名を使用している場合は置換する等の処理が別途必要になる
２．シーン数を変更、シーンを無効にした場合にIDがズレるのでファイルを作り直す必要がある
３．シーンIDは0からの連番になるためenumで定義したがconst intにするかは好み
Grafana 2.6 + influxDB 0.8 on Docker (on boot2docker)

## はじめに
* boot2dockerはすでに存在する環境とします。(ver. 1.6.1)
* InfluxDBはわけあって0.8系を想定します。 (ver. 0.8.8)
* GrafanaやInfluxDBのrootやadminパスワードは特に変更していないので、外部から接続される環境ではその点ご注意ください。

## Boot2docker起動

* 以下のコマンドで出てくるexport文をコピペして実行。

 ```
 $ boot2docker up
 ```

* これをコピペ。

 ```
     export DOCKER_CERT_PATH=/Users/shua/.boot2docker/certs/boot2docker-vm
     export DOCKER_TLS_VERIFY=1
     export DOCKER_HOST=tcp://192.168.59.103:2376
 ```
 
## influxDB起動

 ```
 $ docker run -d -p 8083:8083 -p 8086:8086 --expose 8090 --expose 8099 tutum/influxdb:0.8.8
 ```

 以下でdbを作っておく。

 ```
 $ curl -X POST "http://`boot2docker ip`:8086/db?u=root&p=root" -d '{"name": "test1"}'
 ```

## grafana起動

 ```
 $ docker run -d -p 3000:3000 grafana/grafana
 ```

### grafanaのData sources設定

1. boot2dokerの接続ipを調べる
2. 
 ```
 $ boot2docker ip
 ```

3. ブラウザで「http://<上で調べたip>:3000」に接続する
4. 左上のGrafanaのマークをクリックし「Data Sources」を選択する。 
5. 次に以下の設定値を入れて「Test connection」をクリックする。

  ```
  Name : influxdb <任意>
  Default : On <任意>
  Type : InfluxDB 0.8.x
  
  [Http setting]
  Url : http://192.168.59.103:8086/
  
  ```

6. 問題なければ緑の背景の「Success Data source is working」と表示される
Task→Observable 変換でハマったこと


.NET の ``Task<T>`` は、Reactive Extensions が提供する拡張メソッド ``ToObservable()`` で ``IObservable<T>`` に変換できます。

なにも考えずに ``ToObservable()`` を連発していたら、盛大にハマったのでメモ。

## Task.Run().ToObservable() とか、意味ないっしょ

ダメなコード。

```C#
var i = 0;
IObservable<int> incrementObservable = Task.Run (() => {
	i++;
	Debug.WriteLine($"increment! - {i}");
	return i;
})
.ToObservable ();

Debug.WriteLine("Ready...");

incrementObservable // インクリメント
	.Repeat(3) // ３回繰り返す
	.Subscribe(
		x  => Debug.WriteLine($"OnNext({x})"),
		ex => Debug.WriteLine($"OnError({ex.ToString()})"),
		() => Debug.WriteLine("OnCompleted"));

```

``incrementObservable`` は、副作用ありありですが、外部変数 i を +1 して後続に流す ``IObservable<int>`` です。
　これを ``.Repeat(3)`` して ``.Subscribe`` してますから、
　
> Ready...
> increment! - 1
> OnNext(1)
> increment! - 2
> OnNext(2)
> increment! - 3
> OnNext(3)
> OnCompleted

という出力を期待してました。
が、実際の出力はこう。

> increment! - 1
> Ready...
> OnNext(1)
> OnNext(1)
> OnNext(1)
> OnCompleted

Subscribe する前に Task が実行されてるし、 repeat してるのに increment されない。。。

「・・・ん？ Task.Run().ToObservable() って、タスクを実行した結果を IObservable 化してるだけじゃね？」

コード見たまんまなんですが、これに気づくのに１時間かかりました。。。

期待通り動くのはこう↓。

```C#
var i = 0;
IObservable<int> incrementObservable = Observable.FromAsync(()=>Task.Run(() => {
	i++;
	Debug.WriteLine($"increment! - {i}");
	return i;
}));

Debug.WriteLine("Ready...");

incrementObservable // インクリメント
	.Repeat(3) // ３回繰り返す
	.Subscribe(
		x  => Debug.WriteLine($"OnNext({x})"),
		ex => Debug.WriteLine($"OnError({ex.ToString()})"),
		() => Debug.WriteLine("OnCompleted"));

```

``Observable.FromAsync`` で Task の実行そのものを IObservable 化します。
これの結果は正しくこう↓なりました。

> Ready...
> increment! - 1
> OnNext(1)
> increment! - 2
> OnNext(2)
> increment! - 3
> OnNext(3)
> OnCompleted


## Task は１回しか実行できない

ところで、 ``Task<T>`` は一度実行すると、２度目は実行できません。（Furure や Promise もそうだっけ）

```C#
var i = 0;
Task<int> incrementTask = new Task<int>(() => {
	i++;
	Debug.WriteLine($"increment! - {i}");
	return i;
});

incrementTask.RunSynchronously();
incrementTask.RunSynchronously(); 
```

このコードは２回目の ``RunSynchronously()`` で例外がでます。

となると、 ``incrementTask.ToObservable()`` したとしても、期待通り動いてくれなさそうです。
（そもそも Task は ``Start`` などしないと実行されないので、Observable のチェインの中でいつ呼ぶの？）


というわけで、 ``Task.ToObservable()`` は、どういう時に使えばいいのかよくわかりませんでした。だれか教えて下さい。（汗）
scala mapとcolt mapの比較

# java map

```
@Test
    public void testMap() {
        Random rand = new Random();
        Map map = new HashMap<Long, Double>();
        int len = 1000 * 10000;

        long t = System.currentTimeMillis();
        for (int i = 0; i < len; ++i) {
            long k = rand.nextLong();
            double v = rand.nextDouble();
            map.put(k,v);
        }
        t = System.currentTimeMillis() - t;
        System.out.println("insert time:" + t + "[ms]");

        t = System.currentTimeMillis();
        Iterator<Map.Entry<Long, Double>> iter = map.entrySet().iterator();
        while (iter.hasNext()) {
            Map.Entry<Long, Double> e = iter.next();
            long k = e.getKey();
            double v = e.getValue();
        }
        t = System.currentTimeMillis() - t;
        System.out.println("get time:" + t + "[ms]");
    }
```

結果

```
insert time:12436[ms]
get time:540[ms]
```

# scala map

```
@Test
  def testMap: Unit = {
    val len = 1000 * 10000
    val map = mutable.HashMap.empty[Long, Double]

    val rand = new Random

    var t = System.currentTimeMillis()
    (1 to len).foreach {
      case i => {
        val k = rand.nextLong()
        val v = rand.nextDouble()
        map += ((k,v))
      }
    }
    t = System.currentTimeMillis() - t
    println(s"insert time: $t [ms]")

    t = System.currentTimeMillis()
    val keys = map.keySet.toArray
    keys.foreach { case k => {
      val v = map.get(k)
    }
    }
    t = System.currentTimeMillis() - t
    println(s"get time: $t [ms]")
  }
```

結果

```
insert time: 13129 [ms]
get time: 8203 [ms]
```

# colt map

```
@Test
  def testColtMap: Unit = {
    val len = 1000 * 10000
    val map = new OpenLongObjectHashMap()

    val rand = new Random
    var t = System.currentTimeMillis()
    (1 to len).foreach {
      case i => {
        val k = rand.nextLong()
        val v = rand.nextDouble()
        map.put(k, v)
      }
    }
    t = System.currentTimeMillis() - t
    println(s"insert time: $t [ms]")

    t = System.currentTimeMillis()
    val keys = map.keys().elements()
    keys.foreach { case k => {
      val v = map.get(k)
    }
    }
    t = System.currentTimeMillis() - t
    println(s"get time: $t [ms]")
  }
```


結果

```
insert time: 6669 [ms]
get time: 3610 [ms]
```


# colt map2

```
@Test
  def testColtMap2: Unit = {
    val len = 1000 * 10000
    val map = new OpenLongObjectHashMap()

    val rand = new Random
    var t = System.currentTimeMillis()
    (1 to len).foreach {
      case i => {
        val k = rand.nextLong()
        val v = rand.nextDouble()
        map.put(k, v)
      }
    }
    t = System.currentTimeMillis() - t
    println(s"insert time: $t [ms]")

    t = System.currentTimeMillis()
    val keys = map.keys().elements()
    for (k <- keys) {
      val v = map.get(k)
    }
    t = System.currentTimeMillis() - t
    println(s"get time: $t [ms]")
  }
```

結果

```
insert time: 7771 [ms]
get time: 539 [ms]
```
自分でビルドしたphpctagsが動いてくれない件

## phpctagsとは
僕はつい先日、vimにtagbar-phpctagsを導入しました。
tagbarでexcuberant ctagsの代わりにphpctagsを使ってくれるものです。

phpctagsっていうのがこいつです。
https://github.com/vim-php/phpctags

exuberant ctagsが生成するタグ情報は正直ちょっと微妙です。
メソッドを関数として認識してしまったり、メンバ変数とローカル変数もいっしょくたにされたりします。少なくともデフォルトの状態では。

それをいい感じに生成してくれるのがphpctagsです。
phpctagsが吐き出してくれたタグ情報を利用すると...

![Screenshot from 2016-01-16 21:16:40.png](https://qiita-image-store.s3.amazonaws.com/0/28859/2de469c7-8e57-4b29-148d-03e9da9e33f2.png)

こんな感じになります。

便利なんですが、phpctagsをビルドして、いざ動かすときにハマってしまったので残しておきます。

## ビルド方法
簡単です。
まず、
1. [phpctagsのレポジトリ](https://github.com/vim-php/phpctags)をクローンしてきて
2. composer updateして
3. makeコマンドを叩く
これだけです。
buildディレクトリにphpctags.pharができているかと思います。やったね！！


## タグが生成されない問題
しかし...
`php phpctags.phar hoge.php`

動かないです。デバッグオプションをつけてみると、`PHPParser_Parser`クラスが見つかっていない模様。

composerで依存ライブラリは落としたはずだし、なんでだ？とドハマりいたしました。

## 原因・解決方法
PHP-Parserのバージョンが上がったことにより、クラスの命名が名前空間ベースになり、古いアンダーバー区切りのクラス名が使えなくなったことが原因でした。

解決方法としては、クローンしてきたphpctagsのなかのcomposer.jsonを書き換える感じになります。
書き換える内容については、[こいつ](https://github.com/vim-php/phpctags/pull/63/files)を見てください。

これで、古いバージョンのPHP-Parserが常に依存としてダウンロードされます。
書き換えたら
1. `composer update`して、
2. `make clean`して
3. `make`
です。

~~この修正を受け入れてもらうべく、レポジトリにissueとプルリクエストを投げたのですが、今のところ返信がありません。
コミットも去年で止まっているようですね...悲しいなぁ。~~
2016/1/17: プリクエストがmasterにマージされました！！

僕の他にハマってる方の参考になればと思います。
RubyでWeb画面キャプチャして切り取る

# 環境

```
# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
```

# セットアップ

## install

### package

```
# yum -y install firefox
# yum -y install xorg-x11-server-Xvfb
# yum -y install ImageMagick.x86_64 ImageMagick-devel.x86_64
# yum -y groupinstall "Japanese Support"
# yum -y install ipa-pgothic-fonts.noarch
```

### gem

```
# gem install selenium-webdriver
# gem install rmagick
```

## 設定

```
# vi ~/.vi ~/.bash_profile
export DISPLAY=:1
```

## 起動

```
# Xvfb :1 -screen 0 1024x768x24 &
# firefox &
```

# コード

```rb
#! /usr/bin/env ruby

require "selenium-webdriver"
require 'rmagick'

driver = Selenium::WebDriver.for :firefox
driver.get("http://counting.hatelabo.jp/count/hei5ifub5x")
driver.save_screenshot("hatena_counting.png")
driver.quit

image = Magick::ImageList.new("hatena_counting.png").crop(0, 68, 502, 250)
image.write("hatena_counting500x250.png")
```

![hatena_counting500x250.png](https://qiita-image-store.s3.amazonaws.com/0/7086/0b8f67bf-9188-3794-8870-9dcdb16bd669.png)
gitbucketを一発で設定する方法


```
#!/bin/bash

echo "＋------------------------------------------------------------------------------------------------------------＋";
echo "■setup start " ${0};
echo "＋------------------------------------------------------------------------------------------------------------＋";
echo ;
echo "■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■";
echo "jdk";
echo "■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■";
echo "【初期化 定数設定】"
jdk_url="http://download.oracle.com/otn-pub/java/jdk/8u25-b17/jdk-8u25-linux-x64.tar.gz"
jdk_version="jdk1.8.0_25"

echo "【インストール wget】"
sudo yum install -y wget

echo "【アンインストール openjdk】"
sudo yum remove -y java-1.6.0-openjdk
sudo yum remove -y java-1.7.0-openjdk

echo "【確認】"
java -version
javac -version

echo "【移動 /opt】"
cd /opt

echo "【ファイル取得 jdk-8u25-linux-x64.tar.gz】"
sudo wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" $jdk_url
# sudo wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u25-b17/jdk-8u25-linux-x64.tar.gz"
# sudo wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u65-b17/jdk-8u65-linux-i586.tar.gz"

echo "【展開 jdk-8u25-linux-x64.tar.gz】"
sudo tar xvf jdk*

echo "【権限変更】"
sudo chown -R root: jdk*

echo "【インストール jdk】"
sudo alternatives --install /usr/bin/java java /opt/$jdk_version/bin/java 1
sudo alternatives --install /usr/bin/javac javac /opt/$jdk_version/bin/javac 1
sudo alternatives --install /usr/bin/jar jar /opt/$jdk_version/bin/jar 1

#sudo alternatives --install /usr/bin/java java /opt/jdk1.8.0_25/bin/java 1
#sudo alternatives --install /usr/bin/javac javac /opt/jdk1.8.0_25/bin/javac 1
#sudo alternatives --install /usr/bin/jar jar /opt/jdk1.8.0_25/bin/jar 1

echo "【不要ファイル削除】"
sudo rm /opt/jdk-8u25-linux-x64.tar.gz

echo "【確認】"
java -version
javac -version

cd ~/

echo ;
echo "■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■";
echo "gitbucket";
echo "■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■";

echo "【初期化 定数設定】"
gitbucket_url="https://github.com/takezoe/gitbucket/releases/download/1.10/gitbucket.war -O gitbucket.war"
apache_tomcat_url="http://www.us.apache.org/dist/tomcat/tomcat-7/v7.0.65/bin/apache-tomcat-7.0.65.tar.gz"

sudo wget $gitbucket_url
sudo wget $apache_tomcat_url
sudo tar xfvz apache-tomcat*
sudo cp gitbucket.war apache-tomcat-*/webapps/
cd apache-tomcat-*
sudo ./bin/startup.sh

echo "＋------------------------------------------------------------------------------------------------------------＋";
echo "■setup end";
echo "＋------------------------------------------------------------------------------------------------------------＋";

```
docker run させるスクリプトのディレクトリをそのままコンテナと共有させる

## シェルスクリプト
Dockerを開発環境の構築にも利用している人の殆どの人は手動でシェルに`docker run`とかやらずにシェルスクリプトを書いていると思います。そこで、そのシェルスクリプトの場所とDockerコンテナ上のディレクトリがそのまま共有されると便利なので僕はシェルスクリプトを以下のように書いています。

```:build.sh
.
.
.
path=$(cd $(dirname $0) && pwd)

docker run -p 80:80 -p 8080:443 --name hoge -v ${path}:/hogehoge -t -d huga/hoge:dev
.
.
.
```
`$0`はスクリプト自身の場所を持っている特殊変数です。あとはそのパスに移動して`pwd`の結果を変数に入れるだけです。簡単ですね。

最後に、`docker run`のオプションとして`-v ${path}:/hogehoge`と入れることでpathと/hogehogeディレクトリを共有しています。
XSS対策をしつつも改行のみを許可する

# ゴール
PHPでおそらくセキュアに文字列を出力させつつ、改行のみ許可する。
Laravel以外のフレームワーク詳しくないが、フレームワーク問わず使えるはず。

## 説明
前提条件 : 下記の場合、DBに文字列を保存するときに改行コードを全て\<br>にしとく。

``` lang:view内
echo str_replace('&lt;br&gt;', '<br>', htmlspecialchars( $string ,ENT_QUOTES) ); 
```

仕組みは単純で、htmlspecialcharsで$stringに入っている特殊文字をHTMLエンティティに変換する。そうすると\<script>タグなどが全てエスケープされる。
しかし、それだとセキュアになる反面、改行をするための\<br>タグが効かなくなる。そのため、str_replace関数を使って\&lt;br\&gt;を\<br>タグに置換して、改行のみを許可する。

# まとめ
Laravel使って実装していたが、良いヘルパー見つけられずに結局普通のPHPのコードになってしまった。とはいえ、生のPHPだからViewで使えばCakePHPだろうとCodeigniterだろうと使えるはずですよね。( 使えなかったらすみません...。 )
Dockerコンテナ上のUbuntu15.10にMySQLを自動でセットアップする

## 経緯
現在のプロジェクトでは開発環境もプロダクションもDockerfileをビルドしてセットアップしています。プロダクション環境ではデータベースはAmazon RDSでMySQLを利用しているのでDockerfileにMySQLをインストールするコードを書く必要はないのですが、開発環境ではローカルのデータベースが必要になります。当初は普通にapt-getとかをDockerfileに書いていたのですが、MySQLの起動時にログ用のディレクトリがないとか、mysqld.sockにアクセスできないとか怒られていたので、Dockerビルドしたあとに手動でMySQLを入れていました。しかし、やっぱり1コマンドですべての環境が構築できればなと思い、苦労した結果MySQLもセットアップできるようになりました。

## Dockerfile
```:Dockerfile
FROM ubuntu:15.10
MAINTAINER takuma
.
.
.
RUN echo "mysql-server mysql-server/root_password password ***" | debconf-set-selections && \
    echo "mysql-server mysql-server/root_password_again password ***" | debconf-set-selections && \
    apt-get -y install mysql-server
RUN mkdir /home/mysql
RUN chown mysql /home/mysql
RUN chgrp mysql /home/mysql
RUN usermod -d /home/mysql mysql
RUN mysql_install_db
.
.
.
```
DockerfileのMySQLに関する部分はこんな感じになっています。Dockerfile中に`/etc/init.d/mysql start`とかやっても`docker build`が終わったあとはまた止まってしまいます。なので、ここではMySQLを入れるだけで、MySQLの起動は別スクリプトで行います。

## build.sh
```:build.sh
docker build -t hoge/huga:dev .

docker run -p 80:80 --name huga -t -d hoge/huga:dev
.
.
.
docker exec huga /etc/init.d/mysql start
docker exec huga mysql -u root -e "create database hoge;"
.
.
.
```
このスクリプトで`docker build`と`docker run`を行いつつ、`docker exec`でデータベースの起動とプロジェクトに必要なデータベースの作成を行っています。この手順で起動したMySQLにはパスワードがかかっていませんが、開発環境用ならいいでしょう。Dockerfileの書き方は記事がたくさん書かれているのでそちらを参考にしてください。
jQueryでajaxSendが動かなくなった時の対応


ある既存プロジェクトで、Ajaxしてる間にスピナーを出して完了したら消すみたいな処理をやっていました。
コード（CoffeeScript）はこんな感じ。

```Coffeescript
$('#spinner').
    bind('ajaxSend', ->
      // スピナー表示
    bind('ajaxComplete', ->
     // スピナー非表示
```

jQueryのバージョンを1.7.2 -> 1.11.1にしたらイベントを検知しなくなりました。
原因を調べてみると、[ajaxSendのドキュメントに](http://js.studio-kingdom.com/jquery/ajax/ajax_send)、

> jQuery1.8で、.ajaxSend()メソッドはdocumentのみにしか使用できなくなりました。

て書いてありました。
なので、

```Coffeescript
$(document).
    bind('ajaxSend', ->
      // スピナー表示
    bind('ajaxComplete', ->
     // スピナー非表示
```

こうしてあげると、しっかり検知してくれるようになりました。
指定の桁の数値を取得するJavaコード

ある数値の特定の桁を求めるJavaコード
文字列<-->数値の変換を繰り返さない方法を調べました。
例外処理付きです。

```java:Main.java
public class Main {
	public static void main(String[] args) throws getSpecificDigitException{
		System.out.println(getSpecificDigit.getDigit(192837465,5));
	}
}
```

```java:getSpecificDigit.java
public class getSpecificDigit{
    static int getDigit(int argNum,int argDig) throws getSpecificDigitException{
    	int len = String.valueOf(argNum).length();	//対象数値の桁数を求める
    	if(len<argDig){
    		//取得する桁の指定が対象数値の桁より大きいとき、例外を投げる
    		throw new getSpecificDigitException("桁数は数値の長さ以下です");
    	}
    	
    	int d = (int)Math.pow(10, len - 1);	//べき乗で、対象の数値と同じ桁の10の倍数を求める
		int intCrntDig=0;

    	for (int i = 1; i <= len; i++) {
    		intCrntDig=argNum / d;

    		//指定桁になったらforを抜ける
    		if(len-i+1==argDig){
        		break;
        	}
        	argNum %= d;		//<例>3255/1000=3あまり255で、一番上の桁を落とせる
        	d /= 10;			//次の桁チェックのため一桁落とす
    	}
    	return intCrntDig;
    }
}
```

```java:getSpecificDigitException
public class getSpecificDigitException  extends Exception {
	public getSpecificDigitException(String str){
		super(str);
	}
}
```
PHP でエコーサーバー（ストリームモジュールを使ったソケットプログラミング）

Web サーバー上で HTML のレンダリングをしたり JSON を返したりなどの用途に使われることが多い PHP ですが、もちろんソケットやプロセスの操作などもできる汎用プログラミング言語なのでその辺りをいろいろ試してみたい。

ということで、まずは PHP で **エコーサーバー** を書いてみました。TCP で接続してきたクライアントが送信した文字列をそのまま返信する、というものです。

# ストリームモジュール
今回は生のソケットをすこし抽象化した形で扱う「 **ストリームモジュール** 」を使ってみます。
ストリームモジュールは PHP の組込みモジュールでファイル、ネットワーク、データ圧縮などに関する共通の取り扱いを提供します。ソケットがファイルと同じように扱えます。

公式のマニュアルはこちら：http://php.net/manual/ja/book.stream.php

ストリームモジュールは PHP にあらかじめ組み込まれているので特別な設定をせずに使えるのも利点かと思います。生ソケットを扱うソケットサービスは pecl などを使って追加インストールが必要になります：http://php.net/manual/ja/book.sockets.php

# エコーサーバー
サーバーのソースは以下のとおりです。

```php:streamserver.php
<?php
// サーバーソケットの作成
$socket = stream_socket_server('tcp://0.0.0.0:8000', $errno, $errstr);
if (!$socket) {
	die("$errstr ($errno)\n");
}

// 接続待ちループ
while ($conn = @stream_socket_accept($socket, -1)) {

	echo "client connected.\n";

	// welcome メッセージを送信
	$welcome = "welcome to simple php echo server!\n";
	fwrite($conn, $welcome, strlen($welcome));

	// 送受信ループ
	while ($read = fread($conn, 4096)) {
		echo "message receive: $read";
		// エコーバックする
		fwrite($conn, $read, strlen($read));
	}
	if(!fclose($conn)) {
		echo "fclose failed.\n";
	} else {
		echo "connection closed.\n";
	}
}
```

短いソースで、コメントのとおりなのであまり説明することもありませんが、ソケットサービスであれば `socket_create()` や `socket_accept()` を使うところで `stream_socket_server()` や `stream_socket_accept()` などの関数を使っています。また、送受信やソケットのクローズに `fread()`, `fwrite()`, `fclose()` などファイルを操作するのと同じ関数を使っています。生のソケットが抽象化されて、読み書きできるファイル（ストリーム！）のように見えているわけですね。

# 動作確認
## サーバーの起動

```shell-session
$ php streamserver.php
```
で起動します。

## クライアントの接続
クライアントとして telnet を使ってみます：

```shell-session

$ telnet 192.168.33.10 8000
Trying 192.168.33.10...
Connected to 192.168.33.10.
Escape character is '^]'.
welcome to simple php echo server! <-- welcome メッセージ
test1 <-- 入力
test1 <-- 返答
test2 <-- 入力
test2 <-- 返答
```
このように、サーバーからのエコーバックが確認できました。
Nginx + fluentd + elasticsearch + kibana

[前回の続き](http://qiita.com/takaheraw@github/items/612d5ecf84d4e1ab4dc1)。次は、nginx→fluentd→elasticsearch→kibanaで可視化してみる。

# Nginx

## install

```
# rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
# yum -y install nginx
# nginx -V
nginx version: nginx/1.8.0
```

## nginx.conf

+ log_formatをltsv

```
# vi /etc/nginx/nginx.con
```
```
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format ltsv   "time:$time_local"
                      "\thost:$remote_addr"
                      "\tforwardedfor:$http_x_forwarded_for"
                      "\treq:$request"
                      "\tstatus:$status"
                      "\tsize:$body_bytes_sent"
                      "\treferer:$http_referer"
                      "\tua:$http_user_agent"
                      "\treqtime:$request_time"
                      "\tcache:$upstream_http_x_cache"
                      "\truntime:$upstream_http_x_runtime"
                      "\tvhost:$host";

    access_log  /var/log/nginx/access.log  ltsv;
```

## 起動

```
# chkconfig --add nginx
# chkconfig nginx on
# /etc/init.d/nginx start
```

# td-agent

## install

```
# curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
```

## plugin

### [fluent-plugin-elasticsearch](https://github.com/uken/fluent-plugin-elasticsearch)

```
td-agent-gem install fluent-plugin-elasticsearch
```

### [fluent-plugin-woothee](https://github.com/woothee/fluent-plugin-woothee)

```
td-agent-gem install fluent-plugin-woothee
```

## td-agent.conf

```
# vi /etc/td-agent/td-agent.conf
```
```
## File input
<source>
  type tail
  format ltsv
  path /var/log/nginx/access.log
  pos_file /var/log/nginx/access.log.pos
  tag access.nginx
  time_key time
  time_format %d/%b/%Y:%H:%M:%S %z
</source>

## Merged ua
<match access.nginx>
  type woothee
  key_name ua
  add_prefix merged
  merge_agent_info yes
</match>

## Multiple output
<match merged.access.nginx>
  type copy
  <store>
    type elasticsearch
    index_name service_name
    type_name access
    include_tag_key true
    tag_key @log_name
    host 127.0.0.1
    port 9200
    logstash_format true
    logstash_prefix service_name.access
    flush_interval 3s
  </store>
  <store>
    type file
    path /var/log/nginx/merged.access.nginx.log
    time_slice_format %Y%m%d
    time_slice_wait 10m
    time_format %Y%m%dT%H%M%S%z
    compress gzip
  </store>
</match>
```

## 起動

```
# chkconfig --add td-agent
# chkconfig td-agent on
# /etc/init.d/td-agent start
```

# kibana

+ logstash_prefixに指定した「service_name.access-*」

![kibana.png](https://qiita-image-store.s3.amazonaws.com/0/7086/ee2d48a3-a32c-83a1-7fe5-537c09f34f02.png)

+ 設定まわりは[ここらへん](http://qiita.com/takaheraw@github/items/612d5ecf84d4e1ab4dc1#kibana)と同じ
SourcemapをRequest Headerから指定させて捗らせる話


SCSSなどのprecompileを使うときにはもはや当たり前のになってきたたSourcemap。
あんまり気にせず使うことも出来るが、レガシー環境などで快適に使いたくなったりするとちょいと工夫が欲しくなる。

## Sourcemapを使う方法

Sourcemapを読み込む方法として、だいたい3つぐらい手法が用意されている

1. 該当の出力コードにインラインで記載する
2. 該当の出力コードに、別途出力したSourcemapファイルの位置を指定する
3. `X-Sourcemap`のリクエストヘッダで、別途出力したSourcemapファイルの位置を指定する

## 出力コードに手を加えるやり方

1, 2のソースコードが手法はわりとメジャー。
結構良く説明されている。qiitaでも下記のあたりの記事が見つかった

- http://qiita.com/kyaido/items/04658c04a7dbe9f05c16
- http://qiita.com/yokoh9/items/bc948a6ea7dd21f9c31d

が、これらの手段、こんな欠点がある

- 出力cssそのまま本番環境にアップロードしてしまうと、元コードが見られたりファイルパス書かれたりするのでちょっと気まずい
- Sourcemapファイルをuploadしなければ、元コードは参照されないが、一部ブラウザでは読み込みエラーなどが吐かれてしまいちょっと気まずい
- このあたりを回避するとなると、本番uploadする前に何らかの形で再ビルドすることになるってちょっと面倒

モダン環境だとビルドをちゃんとやってくれたりするので気にならないが、そうじゃない環境だと結構捗らない。

## ということでHeaderでSourcemap指定をする

あんまりこの手法を使っている人が少ないのかもしれないが、この方法についてはいまいち文献が少なかったりする。
せいぜい見つけられたのがこのあたりだった。
[Introduction to JavaScript Source Maps](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/)

とはいえ別に複雑なこともなく、リクエストヘッダの`X-SourceMap`で指定してやれば良いというだけだった。

```
X-SourceMap: /path/to/script.js.map
```

### タスクランナーの設定をいじる
gulpなどの設定で普通のSourcemap指定と違うのは、`{addComment: false}`の指定をして出力cssには影響が出ないようにすること。
これで`some.css`のSourcemapファイルは`some.css.map`てな具合に出力され、元のcssは普通にSourcemapナシ状態が作れる。

```gulp.js
var gulp       = require('gulp');
var sass       = require('gulp-sass');
var sourcemaps = require('gulp-sourcemaps');

gulp.task('sass',  function () {
  gulp.src(pathToSrcSass)
    .pipe(sourcemaps.init())
      .pipe(sass())
    .pipe(sourcemaps.write("./", {addComment: false, debug:true}))
    .pipe(gulp.dest(pathToOutputSass))
})
```

### X-Sourcemapが出力されるようにする。

ヘッダーで`X-Sourcemap`を指定するにはapacheの設定で指定したり`.htaccess`を使ったりあたりが思いつくが、今回のサンプルでは`.htaccess`を使う。

```.htaccess
<IfModule mod_rewrite.c>
  RewriteEngine On
  # source map
  RewriteCond %{REQUEST_URI}          ^(.+\.(css|js))$
  RewriteCond %{DOCUMENT_ROOT}%1.map  -f
  RewriteRule .                       - [L,E=SOURCE_MAP:%{REQUEST_URI}.map?%{QUERY_STRING}]
  Header set X-SourceMap "%{SOURCE_MAP}e" env=SOURCE_MAP

</IfModule>
```

やっていることとしては`css`か`js`の場合に`%{DOCUMENT_ROOT}%1.map`が存在していれば`X-SourceMap`を指定するという具合な感じ。

また、出力先を`./map`とかにしたい場合は併せて`%{DOCUMENT_ROOT}%1.map`の部分を変える感じにすればよい。


これによりリクエストヘッダでのSourcemap指定が歓声するので、本番用ビルドをしたり、Sourcemapファイルが無かった場合に妙な感じになったりしなくてとても良い環境が出来る。
Laravel5とMailGunを使ってメールを送信してみる

# はじめに

Homesteadがインストール済みです。
この作業にあたって行ったことを順番に書いています。不要なところは読み飛ばしてください。

## Laravel5のプロジェクトを作成します

https://laravel.com/docs/5.2/installation

```
composer create-project --prefer-dist laravel/laravel hoge
```

## Homestead.yamlを編集してプロジェクトへブラウザからアクセスできるようにします

https://laravel.com/docs/5.2/homestead#configuring-homestead

```Homestead.yaml
folders:
    - map: ~/hoge
      to: /home/vagrant/hoge
sites:
    - map: hoge.dev
      to: /home/vagrant/hoge/public
```



## サイトを追加したのでHomesteadを再起動します。ハマった。

https://laravel.com/docs/5.2/homestead#adding-additional-sites

```マニュアルは.よく読め
vagrant provision
```




## **(本題)** LaravelにMailGunをセットアップ
* MailGunのアカウントを取得する
* Guzzle HTTP Clientをインストールする
* .envにMailGunを設定する
* 送信するコードを書く

### MailGunのアカウントを取得する

https://www.mailgun.com/pricing
一ヶ月１万通までは無料だそうです。

https://mailgun.com/signup
画面に従って情報を入力します。
アクティベーションするためのメールが送られてくるので、受信可能なメールアドレスを入力します。
メールが届くのに１分ほど掛かりました。慌てず待ちます。

### Guzzle HTTP Clientをインストールする

https://laravel.com/docs/5.2/mail#introduction

```composer.json
    "require": {
        "guzzlehttp/guzzle": "~5.3|~6.0"
    },
```
```composer update```を実行します。



### .envにMailGunを設定する

MAIL_DRIVERは定義済みなので上書きしてください。

```..env
MAIL_DRIVER=mailgun
MAILGUN_DOMAIN=sandboxhogehoge.mailgun.org
MAILGUN_SECRET=key-hogehoge
```

### 送信するコードを書く

```routes.php
Route::get('/send', function () {
    Mail::raw('本文', function($message)
    {
        $message->from('送信元として表示されるアドレス', '差出人名称');

        $message->to('送信先アドレス');
    });
});
```

http\://hoge.dev/sendにブラウザでアクセスします。
メールが届きました。
mbed LPC1768のプログラムをMDK-ARMでコンパイル

mbedオンラインコンパイラ上のmbed LPC1768向けプログラムを、オフラインコンパイラMDK-ARM v5.17でコンパイルしてみました。

#前提
使うデバイスは、mbed LPC1768。
MDK-ARMは、v5.17。
[オフラインコンパイラ Keil uVision4 を使ってみる（その１）](https://developer.mbed.org/users/MACRUM/notebook/offline_compiler_1/)を参考にしました。

#MDK-ARM v5.17をインストール
[MDK-ARM評価版ソフトウェア32KBコードサイズ限定版(期間無制限)](http://www2.yokogawa-digital.com/download/top/index.php?m=Top4)をダウンロードして、インストールします。
![20160116A.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/949cb18d-61c3-5981-e763-67a7a128a662.png)

#プログラム作成
mbedオンラインコンパイラにプログラムを作ります。なんでも良いので、mbed_blinkyで。
![20160116B.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/1453eebf-0a5f-a441-1f54-54eff6037065.png)![20160116C.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/ce4ea11b-8e79-0a6a-9b3a-593df1285257.png)

#プログラムをエクスポート
mbed_blinlyプログラムを右クリックして、プログラムのエクスポートを選択します。
![20160116D.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/2bbb7712-b2ed-2cbd-6e5a-1005309635ff.png)

Export Toolchainは、Keil uVision4を選んで、Exportします。(MDK-ARM v5.17はuVision5ですが、選択肢に無いのでuVision4を選択。)
![20160116E.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/6b2a76b9-1316-e726-d47a-dd36f36c27bc.png)

zipファイルがダウンロードされるので、適当なフォルダに解凍します。
![20160116F.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/b141438b-eaad-aa25-81b0-2eef1c813dca.png)

#uVision5でプログラムを開く
Keil uVision5を起動してFile -> Openを実行し、さきほど解凍したフォルダ内の、mbed_blinky.uvprojを開きます。
uVision4だよ！というダイアログが表示されるので、Migrate to Device Packをクリックします。
> **2016/1/17追記**
> MDK v4 Legacy Support for Cortex-M Devicesがインストールされていればダイアログ出ないようです。
> Install Legacy Supportの方が正解だったかも。

![20160116H.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/30f53e60-03e4-2509-514a-cbdd2f0b5ebd.png)![20160116I.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/049a4350-bd31-819b-efad-b408c0b1976f.png)

#コンパイルオプションを設定変更
mbed NXP LPC1768を右クリックして、Options for Target...を選択します。
![20160116K.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/e1fa2bc5-2958-e552-7290-c2fad37e7f18.png)

C/C++タブの、OptimizationとOptimize for Time, Plain Char is Signedを変更します。
![20160116L.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/6f9f918c-f567-c895-f094-be067359e056.png)

#uVision5でコンパイル
mbed NXP LPC1768を右クリックして、Build Targetを選択します。
![20160116J.PNG](https://qiita-image-store.s3.amazonaws.com/0/109634/ad9e2446-c8cc-ac07-31b5-ffaf7df0cbc0.png)

```text:BuildOutput
*** Using Compiler 'V5.06 update 1 (build 61)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
Build target 'mbed NXP LPC1768'
compiling main.cpp...
linking...
Program Size: Code=16160 RO-data=1536 RW-data=52 ZI-data=592  
After Build - User command #1: fromelf --bin -o build\mbed_blinky_LPC1768.bin build\mbed_blinky.axf
".\build\mbed_blinky.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed:  00:00:01
```

#コンパイル結果をデバイスに書き込む
buildフォルダ配下にあるmbed_blinky_LPC1768.binをmbedドライブへコピペします。
In-App Purchase での購入履歴を確認する方法

記事の内容はこちらを参照してください。
https://mishimay.github.io/4a829f87692d65c179e3/
<!--

# 購入履歴をNSUserDefaultsに記録 (非推奨)

Appleのドキュメントにはこの方法が書かれているが、セキュリティの観点から非推奨。

**pros**

- 手軽に実装できる

**cons**

- NSUserDefaultsファイルは簡単に閲覧/編集できる

*参考*

- [(pdf) In-App Purchase
プログラミングガイド](https://developer.apple.com/jp/documentation/StoreKitGuide.pdf)
  - NSUserDefaultsにデータを保持するコード例あり
- [NSUserDefaults are not the place for sensitive data!]
(https://www.andyibanez.com/nsuserdefaults-not-for-sensitive-data/)



# 購入履歴を暗号化 or 難読化してNSUserDefaultsに記録 (非推奨)

**pros**

- ライブラリを使うと手軽に実装できる

**cons**

- NSUserDefaultsファイルは簡単に閲覧/編集できるので、暗号化 or 難読化方法が知られると購入履歴を操作されてしまう

*参考*

- [matthiasplappert/Secure-NSUserDefaults - Objective-C]
(https://github.com/matthiasplappert/Secure-NSUserDefaults)



# 購入履歴をKeychainに記録

**pros**

- ライブラリを使うと手軽に実装できる

**cons**

- 他のiPhone/iPadへバックアップデータを復元する際に、バックアップの設定/方法によってはKeychainのデータが移行されない

*参考*

- [復元が不完全！？iPhoneバックアップで認証情報が復元できない理由とバックアップのオススメ設定] (http://did2memo.net/2012/10/02/iphone-how-to-backup-and-restore-key-chain/)



# レシートの確認

アプリ内課金をすると、課金情報が記載されたレシートが暗号化された状態で端末へ保存されるので、それを復号して購入履歴を確認する。

**Non-Consumables と Auto-Renewable Subscriptions はレシートだけの情報から課金履歴を確認することができる。**
他のタイプはレシートに記載されないデータを開発者側で保持しておく必要がある。


## App Store を使用してレシートを検証/確認

JSONにレシートのバイナリデータを含めてAppleのサーバへPOSTすると、そのレシートが正しいものか検証され、正しいであればレシートの情報がJSONで返される。

Sandbox環境: https://sandbox.itunes.apple.com/verifyReceipt
本番環境: https://buy.itunes.apple.com/verifyReceipt

**pros**

- 自前のサーバから App Store へ接続すればセキュリティの担保が可能

**cons**

- デバイスから直接 App Store へ接続することは推奨されていないため、自前のサーバを用意する必要がある
- 通信が必要

*参考*

- [(pdf) レシート検証プログラミングガイド - Apple Developer]
(https://developer.apple.com/jp/documentation/ValidateAppStoreReceipt.pdf)


## ローカルでレシートを検証/確認

App Store を使用したレシートの検証/確認と同じことをローカルで行う。

**pros**

- 通信が必要ない

**cons**

- セキュリティ的に完全ではない
  - アプリのバイナリが解析されてパッチを当てられたりする可能性がある

*参考*

- [iOS - In App Purchaseのレシートをローカルで検証できるようになった話 - Qiita]
(http://qiita.com/fmtonakai/items/6d13c8e535c5d8904c60)
- [Receipt verification · robotmedia/RMStore Wiki]
(https://github.com/robotmedia/RMStore/wiki/Receipt-verification)



# 自前のサーバで購入履歴を管理

ユーザのアカウントに購入履歴を紐付ける。
ただし、Auto-Renewable Subscription は購読を中止したことを検知する必要があるため、定期的にレシートの検証が必要。

**pros**

- セキュリティの担保が可能

**cons**

- サーバ側の用意が必要

*参考*

- [新しい定期購読型のアプリ内課金を実装してみた (Auto-renewable Subscriptions) | KRAY Inc](http://kray.jp/blog/auto-renewable-subscriptions/)









-->
C#の拡張メソッドの使い方


## 拡張メソッドとは

MicrosoftのC#のプログラミングガイドには次のように書いている

```
新規の派生型の作成、再コンパイル、または元の型の変更を行うことなく既存の型にメソッドを "追加" できます。
拡張メソッドは特別な種類の静的メソッドですが、拡張された型のインスタンス メソッドのように呼び出します。
```

[拡張メソッド (C# プログラミング ガイド)](https://msdn.microsoft.com/ja-jp/library/bb383977.aspx)

拡張メソッドを使用すると既存の型に変更を加えることはなく型にメソッドを追加できるとのこと。
拡張された型のインスタンスメソッドのように呼び出せるのでわざわざ引数に渡さなくて良くて楽。

## 使う

例えばstringに"Hoge"と加えた文字列を返す拡張関数を作るとすると以下のようになる

```C#
public static class MyStringExtensions
{
	public static string AddHoge(this string str) 
	{
		return str + "Hoge";
	}
}

```

クラスとメソッドはstaticにしておき、メソッドの引数にはthisをつける。
すると以下のように使用することができる。

```C#
string word = "word";
word = word.AddHoge();
System.Console.Write(word);
```

・結果

```
wordHoge
```

## enumにも使える

Javaならenumにメソッドを追加できて非常に便利。
C#ではそれはできないけど拡張メソッドを使用すれば似たようなことはできる
Enumの値をToStringしたものにドットを付けたstringを返す例

```C#
public enum SampleEnum {
    Hoge,
    Fuga,
    Piyo,
}


public static class SampleEnumExtensions
{
    public static string AddDot(this SampleEnum e) {
        return e.ToString() + ".";
    }
}
```


```C#
SampleEnum e = SampleEnum.Fuga;
System.Console.Write(e.AddDot());
```

・結果

```
Fuga.
```
ES6の小技集


## 基本 function 横にはインデント if もインデント

function () { }

if () { }

## 基本シングルクオテーション

'abc'

## 文字列連携はバッククオテーション

`test_#{chatRoomId}`

##  関数の定義

var b = function () {}

var bar = () => {
  console.log("ok");
};


## 引数１個の時は以下でも可能

var bar = x => x+1;

## class

```

class Person{
	//コンストラクタ
	constructor(name) {
		this.name = name;
	}
	//メソッド
	say() {
		return 'My Name is ' + this.name+'.';
	}
}
var person = new Person("Bob");
console.log(person.say());

```

## map

```

[1,2,3].map(x => x * x);

```

## 構造化代入

```
// ES5)
function getFullName(user) {
  var firstName = user.firstName;
  var lastName = user.lastName;
  return firstName + ' ' + lastName;
}

// ES6)
function getFullName({firstName, lastName}) {
  return `${firstName} ${lastName}`;
}

// 呼び出し側
console.log(getFullName({
  firstName: 'taro',
  lastName: 'yamada',
})); // => taro yamada
```

## 末尾にカンマつけるか否か

```
// ES5)
var name = {
  firstName: 'taro',
  lastName: 'yamada'
}

// ES6)
const name = {
  firstName: 'taro',
  lastName: 'yamada',
}
```

##
Ypsilonがビルドできないときのための覚え書き

YpsilonというSchemeの実装がある。ビルドがうまくいかないときに試せそうなことを記しておくのが本投稿の目的。
（本来は開発にコメントできればよいのだが、どうも開発が止まってしまっているようなので。）

#Ypsilonとは

Google Codeのアーカイブ等で説明が読める。
https://code.google.com/archive/p/ypsilon/
ここに書いてある通り、R6RSに準拠したSchemeの実装で、特にリアルタイムアプリケーションをのプログラムを書くのに適しているのが特徴。Ypsilonはソフトウェアエンジニアの藤田善勝氏が開発したもので、詳しくは[氏のブログ](https://lwpinball.wordpress.com/)などにあるが、もともとビデオピンボールのゲームルール記述に使うものとして開発されたもの。


#ビルド方法
"Ypsilon Scheme"などで検索すればすぐに出てくるのでここにコピペなどはしないでおく。（ちなみに"Ypsilon"だけだと車やレストランがヒットする。）

だが、環境によってはビルドがうまくいかない。Google Codeがサービス終了しており、開発が続いているのかはっきりしないのでここにビルドが上手くいかないときに試せそうなことを書いておく。今回の環境はLinux、特にメインで使ったのはUbuntu12.04。すべて試したわけではありませんがほかのUbuntuのバージョンでもビルドはとりあえずできるみたい。

Ypsilon(v0.9.6-update3)のMakefileの129行目、

```text:Makefile1
$(LD ~~ 
```
という部分を

```text:Makefile2
-o $@ $^ $(LD ~~
```

と修正。これでビルドできる。