OmniAICreator/Qiita-1.07M huggingface dataset:
ImmutableListとImmutableArray

#本日のお品書き

`ImmutableArray<T>`と､`ImmutableList<T>`の違いを検証しつつ､その差異と､使いどころを探ってみようかなと｡

#出来ることから見た差異
機能性の差異は全く無い｡なにせどっちも同じ､IImutableListインターフェース持ってるくらいだし｡また､ImmutableArrayと言う語感から､Addやら､RemoveやらModifyやらが出来ないように感じられるけど､実際操作用のメソッドは用意されている｡

#ListとArrayが存在するわけ
じゃあ､何故こんなに多様なモノが二つも必要だったのかと言えば､パフォーマンス上､結構な差異が出てくる｡
[`Please welcome ImmutableArray<T>`](https://blogs.msdn.microsoft.com/dotnet/2013/06/24/please-welcome-immutablearrayt/)によれば､Arrayは素のArrayを包む非常に薄いラッパであり､Listは線形構造では無く､木構造を持った実装になっている｡

このことは､操作に対する計算量の差異となる｡以下は参考文献より抜粋｡

|Operation|`ImmutableArray<T>`|`ImmutableList<T>`|
|:---|:--|:--|
|Create()|O(n)|O(n)|
|this[] |O(1)|O(log n)|
|Add()|O(n)|O(log n)|

Createの操作量はどちらにせよO(n)になるので､変わらないとして､インデックスアクセスと､操作系メソッドの操作量に差異が出ている｡Arrayの場合は､変更系のメソッドの実行にコストがかかる反面､インデックスアクセスが定数で終了できる｡他方､Listは変更系のメソッド呼び出しも､インデックスアクセスもその計算量はO(log n)となり､バランスしてる感じ｡

なので､どっちを使うかは､その特性に合わせて利用することが必要なのかなと｡ちなみに､[`Please welcome ImmutableArray<T>`](https://blogs.msdn.microsoft.com/dotnet/2013/06/24/please-welcome-immutablearrayt/)のガイドラインとして､以下のようになっていた｡

###Arrayを使うべき理由

* データの変更がまれであるか又は､要素の総量がとても小さい(概ね16以下)｡
* 要素のイテレーションを効率よく行う必要がある場合｡
* Immutableのコレクションのインスタンスを多数持つ必要があり､なおかつそのデータツリーを保持する余裕を持つことが出来ないとき [^1] ｡

###Listを使うべき理由

* データの変更が一般的に発生するかまたは､データの要素数が小さくは無い｡
* コレクションの変更のパフォーマンスの方がコレクションの内容のイテレーションするパフォーマンスより重要な場合｡

#IImmutableListに関して
実行時に効率が良い方を選択して利用するようなシナリオの場合､ImmutableListも､ImmutableArrayもIImmutableListを実装しているので､この辺を旨く使えば､より柔軟な実装が可能なんじゃないかなと｡また先に述べたとおり､どちらも機能性の差異はないので､コンシューマが気にすることはあんまり無いし､有りだと思う｡けどその反面､切り替わりの条件付けやら､切り替え時のオーバーヘッドの見積もりをよくよく考えておかないと､オーバーヘッドコストばかりかかってしまって本末転倒な結果にもなりかねないので､その辺は注意しなきゃまずいんじゃないかとは思う｡



#まとめ
概ねの使い方としては､`List<T>`と`T[]`の関係に近いモノがあるとは思う｡けど､それ以上の差異があったり､そもそもの実装が結構違ったりなので､目的と用法を見越した上で使い分ける必要があるのでは無いかなと思ったり思わなかったり｡


また､恐らく､変更された結果をどのように表現するかも大きく違っていて､Arrayの方は要素をすべてコピー､Listの方は変更の差分を保持している形なので､この辺も検討項目に入れておく必要があるんじゃ無いかなと｡


#参考文献
[Please welcome ImmutableArray](https://blogs.msdn.microsoft.com/dotnet/2013/06/24/please-welcome-immutablearrayt/)
[.NETのコレクション概要とImmutable Collectionsについて](http://neue.cc/2013/10/31_430.html)

[^1]: この文脈からおいらは､ImmutableListの特定のVersionのスナップショットを取得して､他のVersionの状態を保持する必要が無くても､Tree全体を保持する必要があるので､その辺の考慮はしてねってニュアンスなのかなと思った｡
IntelliJにVisualTeamServicesのプラグインをインストールする

#前提条件
- Visual Team Servicesのプロジェクトを作成している。
- IntelliJをインストールしている。
- IntelliJのプロジェクトを作成している

# 背景
以前から、無料のGitプライベートリポジトリを探していたのですがVisual Team Serviceを使えばプライベートのリポジトリを作れるそうなので、これを利用してみました。
他にも同様のサービスがあるようなので紹介までにいかに記述します。

- [BitBuket](https://bitbucket.org/):無料のプライベートリポジトリでは有名みたいです。
- [GitLab](https://gitlab.com/):同じく有名のようです

# VTSのプラグインをインストール
IntelliJを起動後の画面から[Configure]-[Plugins]をクリック
![スクリーンショット 2016-07-27 22.41.08.png](https://qiita-image-store.s3.amazonaws.com/0/70979/d4c554d9-cedd-75b3-79b4-123d4a348b5b.png)

その後プラグインの画面が表示されるので、そこから[Browse repositories]をクリックします。

<img width="797" alt="プラグイン画面" src="https://qiita-image-store.s3.amazonaws.com/0/70979/ec92600e-e39c-02fc-65c5-2cd65582b11f.png">

検索用のフィルタに"Visual Studio"と入力すると"Visual Team Services"が一覧に表示されるので、選択し［Install］ボタンをクリックします。
<img width="822" alt="スクリーンショット 2016-07-27 22.49.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/70979/46e8a4fc-38bb-f09a-eea8-fdcbdc4b9ca5.png">

プラグインのインストールが始まるので、終了後IntelliJを再起動するとインストールが完了します。

#プロジェクトのプッシュ
プロジェクトを開いた後メニュー[VCS]から[Import into TeamService Git]をクリックします。
<img width="1250" alt="VCS メニュー" src="https://qiita-image-store.s3.amazonaws.com/0/70979/d30f8e7d-260f-1148-08ed-4c1736ad05ff.png">

ダイアログが表示されるので[Sign In...]をクリックして、Microsoft アカウントでログインします。
<img width="523" alt="サインイン画面" src="https://qiita-image-store.s3.amazonaws.com/0/70979/302b8580-feb0-5599-cc03-cdb0dbaffbfe.png">

サインインするとIntelliJ用のマスタパスワードを設定するためのパスワードを聞かれるので好きな値を入力して"OK"をクリックします。

<img width="422" alt="マスターパスワードの設定ダイアログ" src="https://qiita-image-store.s3.amazonaws.com/0/70979/09baac73-be46-795d-e773-fed98d97c8de.png">

その後、VisualTeamServiceのプロジェクト一覧が表示されるので、追加するプロジェクトを選択して"Import"ボタンをクリックします。
VisualTeamService作成時にGitのリポジトリが同時に作成されているので、それとは別の名前でプロジェクトを作成しておいた方が良いかも。
<img width="521" alt="プロジェクトの選択" src="https://qiita-image-store.s3.amazonaws.com/0/70979/2db0d8bd-573d-f7bf-ec00-23d394c71c20.png">

リポジトリに追加するファイルを選択します。IntelliJのプロジェクト用のファイルがいくつか作成されているので、それは除いておいた方が良いです。
<img width="439" alt="ファイルの追加" src="https://qiita-image-store.s3.amazonaws.com/0/70979/e3434a89-d979-3a1d-f942-48318f077022.png">

画面右下に"ImportSucceeded"が出てきたらリポジトリの追加が完了です。
<img width="404" alt="プロジェクト追加成功のダイアログ" src="https://qiita-image-store.s3.amazonaws.com/0/70979/54da91ee-3e32-d785-c8ee-4a58b0ac6ef9.png">

# 最後に
VisualTeamServicesにログインして、リポジトリにファイルが登録されていたら成功です。
<img width="769" alt="スクリーンショット 2016-07-28 22.59.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/70979/803ab97a-538b-a0d9-928e-4ac0c420581e.png">

以外と簡単にできました。

#参考URL
[Visual Team Servicesのプラグインサイト](https://plugins.jetbrains.com/plugin/7981)
[VisualStudio.comのサイト](https://java.visualstudio.com/Docs/tools/intelliJ)
Python3で素数の無限ジェネレータ

先日次のような記事を書きました: [「Pythonで素数列挙と素数判定」](http://qiita.com/neko_the_shadow/items/4ebad619564a48f5a97f)。これを公開したのち、ふと「素数の無限ジェネレータ」をPython3を作ったので、Qiitaに公開しておきます(実用性には乏しいと思いますが……)

ポイントは`itertools.count`と`functools.partial`あたりでしょうか。前者は整数の無限ストリームを作り、後者はメソッド(関数)に対する部分適用を実現しています。

```py3

import itertools, functools, math

def prime_stream():
    stream = itertools.count(2)
    sieve = lambda x, y: x % y != 0

    while True:
        prime = next(stream)
        stream = filter(functools.partial(sieve, y=prime), stream)
        yield prime

if __name__ == '__main__':
    primes = prime_stream()
    for _ in range(20): print(next(primes))
    
# 2
# 3
# 5
# 7
# 11
# 13
# 17
# 19
# 23
# 29
# 31
# 37
# 41
# 43
# 47
# 53
# 59
# 61
# 67
# 71
```
Windows PowerShellクックブックをpythonスクリプトに置き換えてみた。

これからの仕事でpythonが必要になるので、pythonスクリプトをたくさん作ってみることにしました。

環境:python3

#レシピ1 pythonで外部コマンドを実行するスクリプト

```py:exec_shell.py
# coding: utf-8

"""使用法
exec_shell.py コマンドが記載されたxmlファイル
コマンドが記載されたxmlファイルのcommandタグをパースし、
パースしたコマンドを実行するスクリプト
"""

#モジュールインポート
from subprocess import Popen,PIPE
import xml.etree.ElementTree as et
import sys

#変数定義
cmdfile=sys.argv[1]
tree=et.parse(cmdfile)
cmd=tree.find(".//code").text

#関数定義
def main(cmd):
    p=Popen(cmd,shell=True,stdout=PIPE,stderr=PIPE)
    result=p.communicate()
    return result

#メイン処理
if __name__ == '__main__':
    result=main(cmd)
    print('標準出力結果: ' + str(result[0]))
    print('標準エラー出力結果: ' + str(result[1]))
    
    
```

##ポイント1 subprocessモジュールを利用した外部コマンドの実行
今は、「os.commands」を使用するのではなく、subprocessモジュールを利用するのが普通らしいですね。
subprocess.call()は、コマンドの戻り値しか扱えないみたいなので、Popenを使用することにします。

##ポイント2 外部コマンドの実行結果はタプル内に格納されています。
本スクリプトだと、result[0]に標準出力結果が、result[1]が標準エラー出力結果が格納されています。

##ポイント3 実行するコマンド
実行するコマンドは、リダイレクト等も含めて、cmd変数に入れています。これにより、コマンドが変わった場合はcmd変数のみ変えればよいことになります。

エラーハンドリングをもう少し追加する予定です。
content_tagを美しく多段階ネストしたい場合はどうする？


## content_tagへの不満

私が今関わっているRails製サービスでは、viewに直接ロジックが書かれている部分が多いため、helperやdecoratorに処理の移行を進めています。しかし、うちのチームにはRails有識者がいないため、view生成周りのベストプラクティスが分かりません。今日はcontent_tagの使い方で悩みました。


例えば、以下のようなhtmlがあるとします。

```html
<div>
  <h3>タイトル</h3>
  <p>テキスト</p>
  <ul>
    <li>リスト1</li>
    <li>リスト2</li>
    <li>リスト3</li>
  </ul>
</div>
```


これを、単純にcontent_tagで生成するとしたら、以下のように書けます。

```rb
content_tag(:div) do
  concat content_tag(:h3, 'タイトル')
  concat content_tag(:p, 'テキスト')
  concat(
    content_tag(:ul) do
      concat content_tag(:li, 'リスト1')
      concat content_tag(:li, 'リスト2')
      concat content_tag(:li, 'リスト3')
    end
  )
end
```

特定のタグ配下にに複数の要素を挿入する場合は、ブロック内でconcatに渡します。
しかし、ここで些細な問題が発生します。それは・・・

**concatにブロック付きのcontent_tagを渡すには、カッコで囲まなければいけない**

ということです。以下の部分ですね。

```rb
concat(
  content_tag(:ul) do
    ~中略
  end
)
```

この記法は非常に見づらいので、できるなら使いたくありません。

## どうすれば？

ケースバイケースなので最適解はないかもしれませんが、自分が思いついたのは次のような方法です。

まず、ブロック付きで呼び出すcontent_tagに代わるメソッドを定義します。

```rb
def content_tag_push(type, *option)
  tags = []
  yield tags
  content_tag(type, tags.reduce(:+), *option)
end
```

先ほどの例を、上記のメソッドを使って置き換えると以下のようになります。

```rb
content_tag_push(:div) do |div|
  div << content_tag(:h3, 'タイトル')
  div << content_tag(:p, 'テキスト')
  div << content_tag_push(:ul) do |ul|
           ul << content_tag(:li, 'リスト1')
           ul << content_tag(:li, 'リスト2')
           ul << content_tag(:li, 'リスト3')
         end
end
```

個人的にはこちらのほうが統一感があって好きなのですが、どうなのでしょう・・・

## 最後に

もっとマシな方法がある気がします。そもそも、ネストが深い場合は適度に処理を分けるべきなので、こんなこと真面目に考える必要ないかも。
プログラミングド素人のデザイナーがJava入門してみた_その1

##あらすじ
- 会社でエンジニアの方と仕事をしているうちに、プログラミングに興味が出てきた。
- 実際に動くものを作れるようになると、より深いデザイン検討ができるし、なによりテンションが上がる。
- html/cssと簡単なJavaScriptが書けて、個人ブログ用wordpressをなんとか構築できる程度の知識がある。
- とりあえず簡単なAndroidアプリを作ってみたい。
- デザインから簡易なコーディングまで出来るようになって、あわよくば給料UPを...

##Javaとは
- 一度作ってしまえば、MacやWindowsなどの環境に依らず動作するプログラミング言語らしい
- JavaScriptと名前は似ているが全くの別物らしい

##環境
- MacBookPro　(OSX Yosemite 10.10.5)
- ローカル開発環境で作業(vagrant)
    - 詳しくはドットインストールをチェック
    - [ローカル開発環境の構築 MacOS X編 ](http://dotinstall.com/lessons/basic_localdev_mac)
- terminalで実行
- エディタは[Atom](https://atom.io/)
- FTPクライアントソフトは[Cyberduck](https://cyberduck.io/index.ja.html?l=ja)

##教科書
[ドットインストール](http://dotinstall.com/)さまさま

- [#01 Javaを使ってみよう](http://dotinstall.com/lessons/basic_java_v2/37701)
- [#02 Javaが動作する原理を理解しよう](http://dotinstall.com/lessons/basic_java_v2/37702)
- [#03 はじめてのJavaプログラム](http://dotinstall.com/lessons/basic_java_v2/37703)
- [#04 変数を使ってみよう](http://dotinstall.com/lessons/basic_java_v2/37704)
- [#05 さまざまなデータ型を使おう](http://dotinstall.com/lessons/basic_java_v2/37705)

##準備
- ローカル開発環境にJavaをインストール
- JDK(Java Development Kit)
    - JRM(Java Runtime Environment)
    - JVM(Java Virtual Machine)

##ファイルの作成~実行
- 拡張子はhoge`.java`
- javaファイルには**クラス名と同じ名前**をつける
- コンパイル(コンピュータに分かる形に変換)してから実行する

```javac hoge.java```

- 結果hoge.classというファイルが作成される
- javaファイルを変更してもコンパイルしないと反映されない
- hoge.classを実行

```java hoge```

- 実行するときは**拡張子の.classいらない**

###コメント
- 一行コメントは先頭に`//`をつける
- 複数行は`/* */`で囲む

##変数
- 型と一緒に変数名を定義


```java
型 変数名 = 値;
```

```java
String hoge = "hugahuga";
```

##基本的なデータ型
###文字列
- String
    - 値は`""`で囲む

```java
String msg = "hogehoge";
```

- char(1文字)
    - 値は`''`で囲む

```java
char hoge = 'a';
```

###数値
【整数】
- byte,short,int,long
- 通常はintでおｋ
- longは数値の最後に L をつける

```java
long hoge = 45676567L;
```

【浮動小数点数】
- double,float
- 通常はdoubleでおｋ
- floatは数値の最後にFをつける

```java
float hoge = 678765.678F
```

###論理値
```java
boolean hoge = true;
```

##特殊文字
- 改行

``` /n ```

- タブ

``` /t ```

##terminalで表示してみた
![helloworld.gif](https://qiita-image-store.s3.amazonaws.com/0/135032/10dffc18-71d1-968e-7d0b-65c521868d77.gif)

## [@iwashi0830](https://twitter.com/iwashi0830)はこう思った
- 個人的なメモの意味合いが強いです
LocalDateクラスで月末を取得する方法の速さ比較

LocalDateクラスを使って月末を取得する方法について速さを比較してみました。

実行環境は以下の通りです。

+ DELL VOSTRO 1540
+ Windows 10 Pro 32bit
+ Intel Celelron 2.00 GHZ
+ メモリ 2.0GB
+ HDは約300GB

月末を取得するは以下です。

+ rangeメソッドを使用して、月の日について最大を求める。
+ 翌日初日-1を設定して月の日を求める。
+ LocalDate#lengthOfMonthを使う。（@rinp さんにコメントをいただきましたので追加。）

#ソースと実行結果

上記をそれぞれ30000回実行して時間を比較しました。以下、ソースと結果です。

```Java:ソース
package test;

import java.time.LocalDate;
import java.time.Month;
import java.time.temporal.ChronoField;
import java.util.function.LongSupplier;

public class Test {

    // --計測用--
    private void printProcessingTime(LongSupplier f) {
        int count = 30000;
        long start, end;
        start = System.currentTimeMillis();
        for (int i = 0; i < count; i++) {
            f.getAsLong();
        }
        end = System.currentTimeMillis();
        System.out.printf("出力確認:%s, 計測 %3d: ", f.getAsLong(), end - start);
        System.out.println();
    }

    // --計測--
    public static void main(String[] args) {
        new Test().test();
    }

    private void test() {
        System.out.println("rangeメソッドを使用して、月の日について最大を求める。");
        printProcessingTime(() -> {
            return LocalDate.of(2016, Month.FEBRUARY.getValue(), 1).range(ChronoField.DAY_OF_MONTH).getMaximum();
        });

        System.out.println("翌日初日-1を設定して月の日を求める。");
        printProcessingTime(() -> {
            return LocalDate.of(2016, Month.MARCH.getValue(), 1).minusDays(1L).getDayOfMonth();
        });
        System.out.println("LocalDate#lengthOfMonthを使う。");
        printProcessingTime(() -> {
            return LocalDate.of(2016, Month.FEBRUARY.getValue(), 1).lengthOfMonth();
        });
    }
}
```

以下、実行結果です。

```DOS:結果
rangeメソッドを使用して、月の日について最大を求める。
出力確認:29, 計測  86: 
翌日初日-1を設定して月の日を求める。
出力確認:29, 計測  26: 
LocalDate#lengthOfMonthを使う。
出力確認:29, 計測   2: 
```

LocalDate#lengthOfMonthが一番速いです。

#修正履歴

20161009

+ 文言修正。
+ 月末取得方法に@rinp さんに教えていただいた方法を追加。
+ ソースを修正し、java.util.functionを使用。
+ 出力結果も再実施。
テストしやすいコード、しにくいコード

# テストしやすいコード

## [参照透過性](https://ja.wikipedia.org/wiki/%E5%8F%82%E7%85%A7%E9%80%8F%E9%81%8E%E6%80%A7) を持った関数

> 引数のみで戻り値が決まる関数を、参照透過性のある関数という

* 引数と戻り値が一対一対応するのでテストを準備するのは簡単
    * 後は、効率のいい網羅方法を考えればいい
* Utility や Helper でもない限りまず無理だが・・・

## 状態が少なく再現しやすい関数、クラス

* たかだか数個の変数を持った構造体を引数にとる関数
* たかだか数個のグローバル変数に依存する関数
* メンバー変数がたかだか数個のクラス
* これらは、状態の再現が簡単に出来るのでテストしやすい


# テストしにくいコード

## プログラムの外に状態を持っている場合

* 外部に接続されている機器だったり、現在時刻など、プログラムの中で自分が準備しているわけではないモノに依存しているコード
* 外部にある状態とやり取りをする部分は、それ以外のもので直接再現できない
* どうしてもモノが必要な部分を分離することなら出来る

## プログラムの中に複雑な状態を持っているもの

* 1 万個のグローバル変数を持っているとか
    * 『○は A, B, C に依存していて、×は A, C, D, E に依存していて、△は B, E, F に依存している』などの、状況のパターンが多い、もっと複雑な場合もある
* グローバル変数は一つなんだけど、いろんな関数がそれを好き勝手に弄っているとか
    * 『今の状態は、A した後に B して C と D を同時にした後 E しなかった場合に発生する』などの、手順が複雑になる場合
* これらの複雑な状態は、再現の手間がかかるためテストしにくい（面倒くさい）
    * ひどい場合だと、どうしてその状況になったのか分からない場合もある（この場合意図して再現することが出来ない）

# 今後の方針

* 単体テストの出来ないもの、しにくいものと、出来るものを分離して、出来るもののテストを作っていく。
* 出来ないものはちゃんと、実機や実際の動作で確認をして、それ以外のところはすべてテストで動作を担保していく。


# 用語メモ

## 副作用

* 実行されると、結果を返す以外に何らかの状態変化を引き起こし、その関数自身もしくは他の関数の挙動や結果に変化を与えることを副作用と呼ぶ。
* 関数にとっては受け取った引数から、戻り値を求め返すことが作用であり、それ以外は副作用。
* IO 処理や、変数への代入がこれにあたる。

## 参照透過性

* 入力が同じであれば、同じ戻り値を返し、同じ動作をする性質


# 参考資料

* [副作用 (プログラム) - Wikipedia](https://ja.wikipedia.org/wiki/%E5%89%AF%E4%BD%9C%E7%94%A8_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0))
* [参照透過性 - Wikipedia](https://ja.wikipedia.org/wiki/%E5%8F%82%E7%85%A7%E9%80%8F%E9%81%8E%E6%80%A7)
* [「参照透過である」とは、何から何への参照がどういう条件を満たすことを言うのか - Qiita](http://qiita.com/knaka/items/b18134d9d11b51da4e2e)
* [参照透過性と副作用についての提言 - Qiita](http://qiita.com/sasanquaneuf/items/3df1001a027e868e9e0e)
Scene遷移の引数を文字列ではなくenum型にしてタイプセーフにしてみた

どうも、初投稿です。AiginaCoderです。
さっそく本題に入っていきます

```csharp
SceneManager.LoadScene("遷移先のシーン名文字列");
```
こんな感じでシーン遷移をしてらっしゃる方が多いと思います

これには以下の様な問題があります

- 存在しないシーン名文字列を指定しまう可能性がある

- 実行時にしかエラーが起きないので間違いが気が付きにくい

- シーン名を途中で変更したい場合、変更箇所が多くなる可能性がある

これは引数がstring型だから起きている問題です

以下の様に、引数がenum型のシーン遷移関数を自分で作れば問題が解決できます

```csharp
public enum SceneID {
	Title,
	Game
}

// enumからシーン名を取得するために必要
private Dictionary<SceneID, string> m_sceneNameDictionary = new Dictionary<SceneID, string> {
	{SceneID.Game, "Game"},
	{SceneID.Title, "Title"}
	};

// これを呼んでシーン遷移を行う
public void LoadSceneEX(SceneID sceneID) {
	SceneManager.LoadScene(m_sceneNameDictionary[sceneID]);)
}

// 文字列を渡すとそもそも型が違うのでエラー
// SceneIDで定義している値しか受け付けない
SceneManager.LoadScene(SceneID.Title);
```

これで問題は解決されたわけですが、シーンが追加するたびに自分で正確にそのシーン名をenumに定義してやる必要があります

なんと実はBuildSetteingsに追加したScene名を取得する方法があります

```csharp
// BuildSettingsに登録した全てのシーン名文字列が格納された配列が取得できる
		var sceneNames = UnityEditor.EditorBuildSettings.scenes
			.Select (scene => Path.GetFileNameWithoutExtension (scene.path))
			.Distinct ()
Add a comment to this line
			.ToArray();

```
これを使い、enumで宣言していきたいですが動的にenumを宣言はできないので「シーン遷移をするためのクラスファイルを出力する」方向で解決します
ファイル出力なら、先ほどのシーン名配列を使用してenumを宣言したクラスファイルが作れます

私はUnityの拡張エディタで作成した独自メニューを選んだら、シーン遷移をおこなうためのラッパークラスを出力するようにしました

「BuildSettingsにシーンを追加した」というイベントが取得できれば完全な自動化が可能なのですが、自分が調べた限り方法がわかりませんでした。知っている方がいれば教えていただきたいです

メニューを選んだら、シーン遷移をおこなうためのラッパークラスを出力するソースファイルはgithubにあげておきました
良ければお使いください
https://github.com/AiginaCoder/UnityTools/blob/master/SampleProject/Assets/Editor/CreateSceneTransitionManagerScriptEditor.cs

使い方はCreateSceneTransitionManagerScriptEditor.csをAssets/Editorに入れてメニューに追加されたAiginaCoder/Create/MakeSceneTransitionManagerScriptを選択してOKを選ぶとScene遷移クラスがScriptsフォルダに出力されます
シーンをBuildSettingsに追加するたびにこの操作が必要です
あとはシーン遷移したいところで

```csharp
AC.SceneTransition.Instance.LoadScene (AC.SceneTransition.SceneID."シーン名");
```
という感じです
自動でシーンID候補が出てくれるので簡単にシーン遷移ができます

なにかありましたらコメントお願いします
awsebcliのexit codeが正しくない件

# 問題

`awsebcli v3.7.7`だと実行が失敗してもエラーコードが`0`になってしまう。


```bash
$ eb --version
EB CLI 3.7.7 (Python 2.7.1)

$ eb deploy app-staging
WARNING: You have uncommitted changes.
Creating application version archive "app-5b75-260729_205520".
Uploading app-api/app-5b75-260729_205520.zip to S3. This may take a while.
Upload Complete.
ERROR: The configuration file .ebextensions/001.base.config in application version app-5b75-260729_205520 contains invalid YAML or JSON. YAML exception: mapping values are not allowed here
 in "<reader>", line 4, column 19:
        RootVolumeSize: '10'
                      ^
, JSON exception: Unexpected character (#) at position 0.. Update the configuration file.

$ echo $?
0
```

なんてこった。

# 回避

いろいろ試したところ、`v3.7.4`からの起こってるようなので`v3.7.3` を使う。

```bash
$ eb --version
EB CLI 3.7.3 (Python 2.7.1)

$ eb deploy app-staging
WARNING: You have uncommitted changes.
Creating application version archive "app-5b75-160727_215320".
Uploading app-api/app-5b75-160727_215320.zip to S3. This may take a while.
Upload Complete.
ERROR: The configuration file .ebextensions/001.base.config in application version app-5b75-160727_215320 contains invalid YAML or JSON. YAML exception: mapping values are not allowed here
 in "<reader>", line 4, column 19:
        RootVolumeSize: '10'
                      ^
, JSON exception: Unexpected character (#) at position 0.. Update the configuration file.

$ echo $?
4
```

ふう。

~~これはどこにフィードバックすれば良いんだろう。~~
aws forumに[追記した](https://forums.aws.amazon.com/thread.jspa?threadID=229121)。

コードはgithubに公開して欲しいなぁ
UIColor⇆CGColor変換

`UIColor`から`CGColor`に変換するのはよくあるが、`CGColor`から`UIColor`に変換するのに少し戸惑ったので共有

## `UIColor` → `CGColor`

```swift
UIColor.blackColor().CGColor
```

## `CGColor` → `UIColor`

```swift
UIColor(CGColor: UIColor.blackColor().CGColor)
```

簡単だけど調べると意外と出てこない。
なお、Swift3からは`CGColor`から`cgColor`になり、`lowerCamelCase`になるので注意

```swift
UIColor.blackColor().cgColor
```
MauticでVagrant再構築時「The site is currently offline 」のエラー

## 問題

vagrantで開発環境構築時、何度も環境を巻き戻し・再構築していたら、

「The site is currently offline  due to enountering an error.」

と出る。

![mautic-error-plugins-page.png](http://www.colourfulowl.com/images/mautic-error-plugins-page.PNG)

## 解決方法

app/config/local.phpを削除すれば解決した。
ここに管理者ユーザの情報がすべて記録されている。
このファイルがある場合、初回設定が済んだと見なされる。

この場合、データベース等がまだ未登録なのに、初回設定が済んだと思われた為、エラーが発生したらしい。
Turbolinks 5とTurbolinks Classic（2.x）の比較

# 変わりすぎて面食らう

ひょんな拍子にTurbolinks 5を使うことになったのですが、新機能を使わない状況であっても、ことごとくと言っていいぐらいに記法が変化していました。

なお、「Turbolinks Classic」は、Turbolinks 5が出た後に、Turbolinks 2.xに付けられた名称です。

## `<head>`内の記述
Turbolinks Classicでは、JavaScriptやCSSの変化を検知するために、`data-turbolinks-track`という属性を指定することになっていましたが、Turbolinks 5では、この`data-turbolinks-track`属性に`reload`という値を指定する必要があります。

```html+erb
<!-- classic -->
<%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %>

<!-- 5 -->
<%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => 'reload' %>
```

### キャッシュ
Classicでも、過去に見たページはキャッシュした上で、戻った時にそれを表示するというような処理を行っていましたが、Turbolinks 5では、そのキャッシュを、同じアドレスに再度アクセスした際にもプレビューとして表示する、という仕組みが取り入れられています。これを止めてClassic相当の処理に戻したい場合は、メタタグで制御することとなります。なお、`content=no-cache`とした場合、戻った時にもキャッシュが効かず再読み込み、という挙動になります。

```
<meta name="turbolinks-cache-control" content="no-preview">
```

## 一部止める
Classicでは、`data-no-turbolink`属性のついたリンク、あるいはこの属性が付く要素の中にあるリンクについてはTurbolinksが無効となっていましたが、Turbolinks 5では`data-turbolinks="false"`という指定が必要となります。なお、Turbolinksを無効にした親要素の中で、一部のリンクだけ有効にすることもできるようになっています。

```html
<div data-turbolinks="false">
  <a href='...'>このリンクは親要素で無効になっているのでTurbolinksが無効</a>
  <a href='...' data-turbolinks="true">こっちは有効</a>
</div>
```

## イベント名
Turbolinksの動作ごとに`document`でJavaScriptのイベントが発生しますが、これまた別な名前となっています。

| Turbolinks 5 | Classic | イベントの発動タイミング|
|---|---|---|
|`turbolinks:click`| （なし） | Turbolinksの効いたリンクをクリックした時 |
|`turbolinks:before-visit`| `page:before-change`| Turbolinksによる遷移が始まる直前（キャンセル可能）|
|`turbolinks:visit`| （なし）| Turbolinksによる遷移が始まった時|
|`turbolinks:request-start`| `page:fetch`| XHRのリクエストが飛ぶ直前|
|`turbolinks:request-end`| `page:receive`| XHRのリクエストが終了したタイミング|
|`turbolinks:before-cache`|（なし？）| 現在のページをキャッシュに保存する直前|
|`turbolinks:before-render`|`page:before-unload`| DOM描画の直前|
|`turbolinks:render`|`page:change`/`page:restore`| DOM変更の完了|
|`turbolinks:load`|`page:load`| ページの表示時 |

### `load`イベントのタイミングと`jquery.turbolinks`
名前は違えどどちらでも`load`イベントは起きますが、少し違いがあります。

* Turbolinks Classic…最初の読み込み時には`page:load`は**起きない**。
* Turbolinks 5…最初の読み込み時にも`turbolinks:load`が**起きる**。

ということで、Classic時代に`$(document).on('ready page:load')`と書いていたようなコードは、Turbolinks 5では`$(document).on('turbolinks:load')`だけでよくなります[^1]。一方で、`jquery.turbolinks`を使って、ページ遷移のたびに`ready`が発動するようにしていた場合、`jquery.turbolinks`のイベント名だけを書き換えて適用しようとすると、イベントが**2回発動してしまいます**。以下のように書いて、`ready`を`turbolinks.load`に変換してしまいましょう。

```js:jquery-turbolinks5.js
(function($){
  'use strict';
  $.fn.ready = function(func){
    $(document).on('turbolinks:load', function () {
      func($);
    });
  };
})(jQuery);
```

[^1]: もっとも、`ready`を`.on`で登録すること自体が非推奨となっているとのことです。
【Sensu】Ubuntu14.04でuchiwaを動かす

SensuのDashboard、Uchiwaを動かしてブラウザで見れるようにする。

# インストール

```
sudo apt-get install uchiwa
```
# 設定


`/etc/sensu/config.json`を追加＆編集。今回は`sensu-api`と同じサーバで動かす。

```/etc/sensu/config.json
{
  "sensu": [
    {
      "name": "Sensu",
      "host": "127.0.0.1",
      "ssl": false,
      "port": 4567,
      "user": "",
      "pass": "",
      "path": "",
      "timeout": 5
    }
  ],
  "uchiwa": {
    "host": "0.0.0.0",
    "port": 8000,
    "user": "admin",
    "pass": "secret",
    "interval": 5
  }
}
```

# 起動する

```
sudo service uchiwa start
```

Linux起動時に起動しておく

```
sudo update-rc.d sensu-client defaults
```

# アクセス

`localhost:8000`にアクセスする。認証は`uchiwa.json`で設定した`user`と`pass`。


<img width="1437" alt="スクリーンショット 2016-07-24 3.46.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/32184/80c394a1-f3ae-4e10-2104-7ad9c1844685.png">

みれた。

<img width="1433" alt="スクリーンショット 2016-07-24 3.46.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/32184/90927d23-ee64-455b-a45f-f57061252274.png">




# 参考

http://gihyo.jp/admin/serial/01/ubuntu-recipe/0361?page=3
[Linux] inotifywaitを使ってファイル更新時に任意のコマンドを実行する

[2016/07/29 追記]
systemd.pathを使えば同じことができそうなことが判明・・・orz

[2016/07/29 さらに追記]
systemd.pathからUnitにファイルパスを渡す方法が不明。できないのかな。
できないのならこのスクリプトも意味があるけど。
どなたかご存知でしたら教えてください。

## 事前準備

inotify-toolsをインストール (Redhat系)

```bash
yum install -y inotify-tools
```

## ソース

```bash:watch-file.sh
#!/bin/bash -eu
trap "exit 0" 3 # QUITシグナルで停止

WATCH_DIR=$1    # 監視するディレクトリ
FILE_PATTERN=$2 # ファイル名正規表現
COMMAND=$3      # ファイル更新時に実行するコマンド

# --formatで"ディレクトリ ファイル名 イベント"の形式で出力するように指定
inotifywait -e CLOSE_WRITE -m -r ${WATCH_DIR} --format "%w %f %e" | \
while read LINE; do

  # --format指定した通りに変数に格納
  declare -a eventData=(${LINE})
  dirPath=${eventData[0]}
  fileName=${eventData[1]}

  # ファイル名パターンマッチング (マッチしなかったら無視)
  [[ $fileName =~ ${FILE_PATTERN} ]] || continue

  ${COMMAND} "${dirPath}${fileName}"
  
done
```

### 解説

- オプション`-m`をつけないと最初のイベントで終了する。
- オプション`-r`でディレクトリを再帰的に監視
- 後で受け取りやすいように`--format`オプション指定
- bashの正規表現マッチングでファイル名の判定

## 使い方

```bash
watch-file.sh /data/app '^application-data-.*\.csv$' "echo" 
```
フォアグラウンドで実行し続けるので `Ctrl+C` で止める。


## Redhat系OSのサービス化

inotifywaitはフォアグラウンドで継続実行されるのでsystemdサービスにする。

```ini:/usr/lib/systemd/system/watch-file.service
[Unit]
Description=Watch files and archive

[Service]
Type=simple
ExecStart=/path/to/watch-file.sh /data/app '^.*\.csv$' gzip
ExecStop=/usr/bin/kill -QUIT $MAINPID
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
```

```bash
systemctl enable watch-file
systemctl start watch-file
```

これでZABBIXとかでサービス監視もできるようになる。
パッケージマネージャのコマンド比較まとめ

| [Apt](http://wiki.debian.org/Apt)        | [Homebrew](http://brew.sh/)  | [Chocolatey](https://chocolatey.org/) | [pip](https://pip.pypa.io/)       | [gem](https://status.rubygems.org/) | [cargo](https://crates.io/)  | [TeX Live](https://www.tug.org/texlive/) |
|------------------------------------------|------------------------------|---------------------------------------|-----------------------------------|-------------------------------------|------------------------------|------------------------------------------|
| apt-get install <*pkg*>                  | brew install <*formula*>     | choco install <*package*>             | pip install <*package*>           | gem install <*gemname*>             | cargo install <*crate*>      | tlmgr install <*package*>                | 
| apt-get remove [--purge] <*pkg*>         | brew uninstall <*formula*>   | choco uninstall <*package*>           | pip uninstall <*package*>         | gem uninstall <*gemname*>           |                              |                                          |
| apt-cache show <*pkg*>                   | brew info <*formula*>        | choco info <*package*>                | pip show <*package*>              |                                     |                              | tlmgr info <*package*>                   |
| apt-get install [--only-upgrade] <*pkg*> | brew upgrade <*formula*>     | choco upgrade <*package*>             | pip install --upgrade <*package*> | gem update <*gemname*>              |                              | tlmgr update <*package*>                 |
| apt list --installed                     | brew list [--versions]       | choco list --local-only               | pip list                          | gem list                            | cargo install --list         | tlmgr list --only-installed              |
| apt-get update                           | brew update                  |                                       |                                   |                                     |                              |                                          |
| apt list --upgradable                    | brew outdated                | choco outdated                        | pip list --outdated               | gem outdated                        |                              |                                          |
| apt-cache search <*regex*>               | brew search <*text*>         | choco search <*text*>                 | pip search <*text*>               | gem search <*text*>                 | cargo search <*text*>        | tlmgr search <*text*>                    |
PS3コントローラ (DUALSHOCK3; SIXAXIS)をROSに接続する（有線編）

## 筆者の環境と機器
* Ubuntu 14.04
* ROS Indigo
* DUALSHOCK3 WIRELESS CONTROLLER
* USBケーブル (A type - Mini B type)

## インストール
ROS Indigoは導入済みの時点から開始。
aptで必要なソフトウェアをインストール。

```
$ sudo apt-get install ros-indigo-joystick-drivers 
```

Ubuntuがコントローラを正常に認識していることを確認
```
$ ls /dev/input/js0
```

USBケーブルで、コントローラをPCに接続。またコントローラが十分に充電されていることを確認。
そして、ターミナルで
```
$ roscore
```

さらに別のターミナルで、
```
$ rosrun joy joy_node  
[ INFO] [1469617859.336444877]: Opened joystick: /dev/input/js0. deadzone_: 0.050000.
```

rostopicで出力を確認すると以下の通り。
```
$ rostopic echo -c /joy
header: 
  seq: 528
  stamp: 
    secs: 1469617998
    nsecs: 830194045
  frame_id: ''
axes: [-0.0, -0.0, -0.0, -0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.08682194352149963, 0.0]
buttons: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
```



## 参考
[ps3joy](http://wiki.ros.org/ps3joy)
Windows10でOneNote2010のスクリーンショットショートカット(Windows+S)を有効にする方法

#背景
Windows7環境でOneNote2010のスクリーンショットを撮る機能(Windows+S)が便利で、愛用しておりました。
Windows10では(Windows8.1から?) Windows+Sにはファイルサーチが割り当てられたようでして、先日Windows7からWindows10にアップグレードした際に、OneNote2010のショートカットが効かなくなりました。

#有効化の方法
どうやら、エクスプローラーのWindows+Sショートカットが優先されているようです。
このショートカットを無効化することで、OneNote2010のショートカットが効くようになりました。

以下のレジストリキーを登録することで、エクスプローラーのWindow+Sショートカットを無効化できました。
<pre>
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
"DisabledHotkeys"="S"
</pre>

レジストリエディタを使って、以下の手順で登録できます。

1. Windows+Rで「ファイル名を指定して実行」を起動し「regedit」と入力してEnter
2. レジストリエディタが起動するので以下の階層を下る<pre>HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced</pre>
3. Advancedディレクトリを右クリックし、「新規->文字列値」を選択
4. 名前を「DisabledHotkeys」、値のデータを「S」（半角大文字のエス）を設定
5. PC再起動



##参考URL
[How to disable Windows-S shortcut in Windows 8.1](http://superuser.com/questions/683274/how-to-disable-windows-s-shortcut-in-windows-8-1)
Node.js cluster -- その実力を知りたいを添えて

**PM2** パッケージを使って脳筋状態で `exec_mode: cluster` でアプリケーション開発すればいいと思っていた。
が、ワーカーを立てる必要が出てきたので `cluster` パッケージの実力を測ってみることにした。

プログラムはこんな感じ。いちおう説明すると
`http://localhost:8080/ho` にアクセスすると **ho**
`http://localhost:8080/yo` にアクセスすると **yo**
と言ってくれる。

```
const express = require('express');
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
const app = express();

app.get('/ho', function(req, res) {
  res.send('ho');
});

app.get('/yo', function(req, res) {
  res.send('yo');
});

app.listen(8080, function() {
  console.log('SERVER IS WORKING');
});
```

クラスタリングの書き方がわからない？
ここに部品を置いておくから、ツカイタマエ！！

```
if (cluster.isMaster) {
    for (let i = 0; i < numCPUs; i++) {
        cluster.fork();
    }
} else {
  // ここでなんやかんややりたいことを書く
}
cluster.on('exit', function(worker) {
  cluster.fork();
});

```

計測したのは以下の3個
1. なにもしない（つまり上記のコード）
2. `yo` を `なんやかんややりたいこと` に入れる
3. `app.listen` を `なんやかんややりたいこと` に入れる

テストは `siege` を使用。実際のコマンドはこんなだった。
```
siege -c 300 -t 10S -b -i --log=**.log -f urls.txt
```
意味は `10秒間300アクセスurls.txtに書かれているアドレスのどれかにアクセス` らしい。
http://qiita.com/takachan/items/078208b66691f076fddc

結果

|i|Date & Time|Trans|Elap Time|Data Trans|Resp Time|Trans Rate|Throughput|Concurrent|OKAY|Failed|
|---|---|---|---|---|---|---|---|---|---|---|
|1|2016/7/27 19:04|10818|9.15|0|0.19|1182.3|0|227.58|10818|109|
|2|2016/7/27 19:14|405|9.87|0|4.37|41.03|0|179.38|405|136|
|3|2016/7/27 19:17|12454|9.25|0|0.15|1346.38|0|208.5|12454|668|

なんか公平性を欠いているようにも見えるので、あくまでも参考程度でお願いします！
【Windows】AtomでLispを動かす環境を構築する

#目標
Atomエディタ上でLispを動かせるようにする

#Atomパッケージのインストール
script
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/465c3734-f2c2-21f6-cafb-ea4154d8bec0.png)

language-Lisp
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/de0b2e1d-72d9-068c-4953-c9fa7ddd73c3.png)

<br>
パッケージをインストールしただけでは警告が出て実行できません。
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/0138ca06-8eed-cdb3-d88e-ee4a253345a1.png)
sbclのインストールが必要みたいです。

#SBCLのインストール
下記URLからインストーラをダウンロードしてきてSBCLをインストールします.
http://www.sbcl.org/platform-table.html

# Lispを動かす
Windowsを再起動するとLispが動くようになります (Shift + Ctrl + B で実行)

```hello.lisp
 (print "Hello World")
```

![image](https://qiita-image-store.s3.amazonaws.com/0/44288/d2b817d7-02de-ae23-31bf-903fc2a209b0.png)
DMS が失敗するときに手動で mysql から redshift にコピーする

データが大きすぎて？　[AWS Database Migration Service](https://aws.amazon.com/jp/about-aws/whats-new/2016/05/aws-database-migration-service-now-supports-migrations-to-amazon-redshift/) や　[AWS Data Pipeline を使用した Amazon Redshift へのデータのコピー](https://docs.aws.amazon.com/ja_jp/datapipeline/latest/DeveloperGuide/dp-copydata-redshift.html) が失敗する・・ちなみに圧縮したtsvで13.8GiB でした

データはローカルにもあったので、次の手順でコピーした。基本的には SELECT INTO OUTFILE でtsv書き出してs3にアップロードして読み込み

### ec2 にmysqlのデータベースファイルごと移動してmysqlで読み込めるようにする

scp とかで。

### テーブルの内容をローカルにｔｓｖとして吐き出す

```
SELECT * FROM table_1 INTO OUTFILE '/dev/shm/table_1.tsv'
```

ec2 はメモリがすごいやつ借りてメモリストレージ( /dev/shm/ ）に書き出すとすごいはやい。t2.micro とかで数日がんばるよりいろいろよい。

### tsv を圧縮・分割しながら s3 にアップロード

```
cat /dev/shm/table_1.tsv|awk '{
  ym = substr($2,0,4) // $2 には　'2013-11-01' のような値が入るので月で分割。単純に行数で分割してもよい
  print $0 | "gzip|aws s3 cp - s3://mybucket/data/table_1_" ym ".tsv.gz"
}
```

SQL で分割できるならそれでもいいかも。今回は日付テーブルにインデックスとかなかったので…

### redshift でテーブルを作成

適当にmysql の create table からエラーが出る部分を削って作った。

### redshift でs3のファイルを読み込む

```
COPY meet_me_chat
FROM 's3://mybuckat/data/'
CREDENTIALS '<credentials>'
TIMEFORMAT 'YYYY-MM-DD HH:MI:SS'
GZIP -- gzip 圧縮されている
DELIMITER '\t'
ESCAPE -- \ をエスケープとして読み込む
ACCEPTINVCHARS -- 無効なutf8文字を??などに変換して受け入れる
COMPUPDATE ON -- 自動圧縮してロードする
;
``` 

エラーが出た時のみかたをググるといろいろ書いてあるけど、エラーメッセージに出る通りに stl_load_errors テーブルを見るだけでだいたい事足りる。
あと psql でいろいろやるなら `\x auto`すると見やすくなることがある（mysql の `\G` のようなもの）

### 整える

```
vacuum;
analyze;
```

バイナリなどがない場合は結構簡単。
Emscripten で libc をビルドしなおすには

# libc について

Emscripten は C のソースコードをコンパイルする際に、そのコードで利用されている標準ライブラリも JS にコンパイルします。

例えば次の Hello World は、出力のために prtinf を利用しています。この printf は C の標準ライブラリで定義されている関数です。そのためこのコードを実行するには、C の標準ライブラリである libc に含まれる該当部分とリンクされる必要があります。

```c:helloworld.c
#include <stdio.h>

int main(int argc, char **argv){
  prtinf("Hello, world!\n");
}
```

# Emscripten は libc の変換結果をキャッシュする

JS になった場合も状況は変わりません。ブラウザの提供する API には printf はありません。そのため上記のコードを JS に変換する際には、printf のコードも併せて変換しなければ、実行できません。そのため Emscripten は必ずこのライブラリをコンパイルし、中間コードにした後、対象のコードと一緒に JS へと変換します。

libc は必ず変換されますが、変更はほとんどされないライブラリでもあります。そのため毎回変換を行うのは時間の無駄です。このことから Emscripten は libc の変換結果をキャッシュします。通常は `~/.emscripten_cache`にキャッシュが保存されています。

```
$ls  ~/.emscripten_cache/
dlmalloc.bc    libc.bc    struct_info.compiled.json
```
ここでキャッシュされているのは JS ファイルではなく、コンパイル後に生成された中間コードです。これは Emscripten はリンク後 JS に変換を行うためです。

# キャッシュをクリアするには

次の場合、キャッシュがクリアされます。

* 使用する Emscripten のバージョンが変更された場合
* emcc に `--clear-cache` オプションをつけて実行した場合

前者は次のように `emsdk activate` を実行した場合に該当します。

```
$ emsdk activate latest
$ source ${EMSCRITEN_INSTALL_DIR}/emsdk_env.sh
```

後者は次のように emcc を実行すればキャッシュがクリアされます。

````
$ emcc --clear-cache
WARNING:root:clearing cache
INFO:root:(Emscripten: Running sanity checks)
$ ls ~/.emscripten_cache
ls ${HOME}/.emscripten_cache: No such file or directory
$ emcc -o helloworld.js helloworld.c
WARNING:root:generating system library: libc.bc...
WARNING:root:                                     ok
WARNING:root:generating system library: dlmalloc.bc...
WARNING:root:                                     ok
```
# どんなときに使うのか

ほとんど使うときはありません。

ただ LLVM がアップデートされ、Emscripten が期待しているものと違うものが利用された場合、正しくリンクができず、変換が失敗することがあります。そのような場合は、キャッシュを一旦クリアすると正しく変換されることがあります。
Yamlの基本


# 配列

```yml
- yamada
- sato
- tanaka
```

```yml
[yamada, sato, tanaka]
```

```yml
- yamada
- sato
  - taro
  - jiro
- tanaka
```

# ハッシュ

```yml
name: yamada
age: 31
```

```yml
{name: yamada, age: 31}
```

```yml
name: yamada
score:
  math: 70
  english: 69	
```

# 配列のハッシュ

```yml
name: [yamada, sato]
age: [20, 30]
```

# ハッシュの配列

```yml
- {name: yamada, age: 20}
- {name: sato, age: 30}
```

# アンカーとエイリアス

```yml
- &designer yamada
- *designer
```

- &で定義（アンカー）
- *で使用（エイリアス）

## ハッシュに使用する

```yml
- &yamada
  name: yamada
  age: 30
- &sato
  name: sato
  age: 25
  friends:
    - *yamada
- &tanaka
  name: tanaka
  age: 42
  friends:
    - *yamada
    - *sato
```

# ハッシュにエイリアスをつけてマージする

dbuserにエイリアスをつけて、各環境のハッシュにマージする。

```yml
dbuser: &dbuser
  user: dbuser
  password: dbpass

development:
  database: myapp_dev
  <<: *dbuser

production:
  database: myapp_production
  <<: *dbuser

test:
  database: myapp_test
  <<: *dbuser
```

# 複数の値

- ハイフンとドットで囲む

```yml
---
- hoge
- huga
- piyo
...
---
- foo
- bar
...
```
プラットフォーム毎(Linux, Solaris, HP-UX, AIX等)のエンディアンの違いを V$TRANSPORTABLE_PLATFORMビュー で確認する。

Oracle Database の V$TRANSPORTABLE_PLATFORMビュー を参照すると、
プラットフォーム毎(Linux, Solaris, HP-UX, AIX等)のエンディアンの
違いを確認できるんやで彡(ﾟ)(ﾟ)

```sql
SET LINESIZE 300;
SET PAGESIZE 100;
COLUMN PLATFORM_NAME FORMAT A50;
SELECT * FROM V$TRANSPORTABLE_PLATFORM ORDER BY PLATFORM_ID;

PLATFORM_ID PLATFORM_NAME                                      ENDIAN_FORMAT
----------- -------------------------------------------------- --------------
          1 Solaris[tm] OE (32-bit)                            Big
          2 Solaris[tm] OE (64-bit)                            Big
          3 HP-UX (64-bit)                                     Big
          4 HP-UX IA (64-bit)                                  Big
          5 HP Tru64 UNIX                                      Little
          6 AIX-Based Systems (64-bit)                         Big
          7 Microsoft Windows IA (32-bit)                      Little
          8 Microsoft Windows IA (64-bit)                      Little
          9 IBM zSeries Based Linux                            Big
         10 Linux IA (32-bit)                                  Little
         11 Linux IA (64-bit)                                  Little
         12 Microsoft Windows x86 64-bit                       Little
         13 Linux x86 64-bit                                   Little
         15 HP Open VMS                                        Little
         16 Apple Mac OS                                       Big
         17 Solaris Operating System (x86)                     Little
         18 IBM Power Based Linux                              Big
         19 HP IA Open VMS                                     Little
         20 Solaris Operating System (x86-64)                  Little
         21 Apple Mac OS (x86-64)                              Little

20 rows selected.
```
エンディアンは、おおよそ石(CPU)で決まるんやね……彡(-)(-)
鍵認証のサーバーにファイル転送コマンド

rsync -avze "ssh -i /home/hogehoge/id_rsa.rsa" /転送元/ user-name@xxx.xxxxx.xxx:/転送先/

phpからはsystem()コマンドなどで使える
http://php.net/manual/ja/function.system.php

lsync との合わせ技でごにょごにょ出来るっぽい
プルリクでやられると嬉しいことまとめ

前回[プルリクでやられると困っちゃうことまとめ](http://qiita.com/chooyan_eng/items/fc4b157851d611225e33)という記事を書いたのですが、これだけ読むとプルリク嫌いな人みたいな印象を与えてしまうような気がしてきたので、反対に嬉しいことをまとめてみました。
（プルリクを見ること自体はどちらかというと好きです。）

ではどうぞ。

# ちょっと嬉しいこと
* 「こんなプルリク出すので確認をお願いします」を口頭で言われる
* 複雑な処理、イレギュラーな処理に対し、「なぜこんなことをする必要があるのか」がコメントされている

# 嬉しいこと
* 指摘に対し、こうこうこういう意図があってこうしたのですがどうでしょうか、と前向きに議論してくれる

# とても嬉しいこと
* 自分の知らなかった技術が使われている。

# 解説
> * 「こんなプルリク出しましたので確認をお願いします」を口頭で言われる

気分的な問題なのですが、やはり無言でプルリクだけ投げられたりチャットで定型文投げられるよりは、直接言われた方が気持ちよくプルリクに臨めます。
どのくらいの細かさで見るのか、いつまでに見てほしいか、ざっくりどんな内容なのか、など、プルリクを見始める前に確認しておきたいことは結構いろいろあるので、それらをその場でさっと確認できるのも嬉しいです。

> * 複雑な処理、イレギュラーな処理に対し、「なぜこんなことをする必要があるのか」がコメントされている

「何をしているのか」よりも「なぜそうしているのか」がちゃんとコメントされていると、コードを読む側は助かります。
何をしているのかはコードを読めばよいので、「なぜ」が書いてあるそのコードがそこに書かれた意図が分かり、それが妥当なのかどうかを判断する大きな助けになります。

> * 些細な指摘に対しても、こうこうこういう意図があってこうしたのですがどうでしょうか、と前向きに議論してくれる

指摘する側も言い方にカドが立たないよう恐る恐る指摘していたりしますので、指摘に対し前向きに反応してくれると結構嬉しいです。
議論の結果、「確かにその通りだ。じゃあこのままで」となってもそれはそれで十分レビューとして成功だと思っています。
実装の意図を、実装した人だけでなくチームのメンバーが理解して説明できるようになることが重要だと思っています。

> * 自分の知らなかった技術が使われている。

やはり他の人のコードを見ていて一番楽しいのが、自分の知らない技術や考え方に触れることができたときです。
プルリクとして出されているということはある程度そのソースコードは機能している、ということですので、それを見ながら、不明点はググりながら自分の知識が増えていくのを実感することは、レビューをしていて一番楽しい時間です。本来の仕事を忘れて調べるのに熱中し、プルリクの続きを見るのを忘れることもあったりなかったり。。。

# まとめ

やはりプルリクを見ていて自分にとってもプラスになった瞬間が一番嬉しいです。次にプロダクトやチームがより良い状態になったときでしょうか。（自分本位）

気力と時間と視力を消費してプルリクを見ている訳ですので、何らかのリターンがお互いにあることが理想的なプルリク（というかソースレビュー）なのではないかと思います。
Effective Goを読んでて気になった型変換

ポケモンGOの公開とともにGoを勉強し始めて、今はEffective Goを読んでいるところなんですが、[Interface checks](https://golang.org/doc/effective_go.html#blank_implements)の節で、以下のような変換が書いてありました。


```go
var _ json.Marshaler = (*RawMessage)(nil)
```

(*RawMessage)がjson.Marshalerをimplementしてるかチェックするためのコードで、まぁそこの意味はわかるんですが、
変換ってT(value)で変換するか、value.(T)みたいにtype assertionする以外にもあるのかー、という疑問が湧いたのでspecを見てみました。

で、[specのConversions](https://golang.org/ref/spec#Conversions)の節を見るとドンピシャの内容が書いてありました。
> If the type starts with the operator * or <-, or if the type starts with the keyword func and has no result  list, it must be parenthesized when necessary to avoid ambiguity:

>*Point(p)        // same as *(Point(p))
>(*Point)(p)      // p is converted to *Point


結論としては、変換先の型に*がついてると、pを*Pointに変換するのかPointに変換するのか曖昧なので、括弧を使って曖昧さを回避しようという話でした。
言われてみればなるほどなー案件。
AVAssetResourceLoaderでHLSの再生検証


こんにちは。セキュアAVFoundationマスターの@toshi0383 です。
調子乗りました、ここ数年の新参者です。
斬新なユーチューブプレイヤーアプリとか作って有名になりたいと思うこと、ありませんか？私は半年に1回くらいあります。

ユーチューブなら特にセキュアにすることもないんですけど、以下のような記事を見つけたので、興味本位でAVAssetResourceLoaderの挙動を検証してみました。

http://stackoverflow.com/questions/9000614/how-to-let-avplayer-retrieve-playlist-secured-by-ssl
http://qiita.com/satoshi0212/items/6e662dd05d1f64fcc2bc

こういうとき、普通はローカルプロキシ立ててループバックするところなのですが、AVAssetResourceLoaderでイケるというのです。ほんとにい？

コードはこちらです。Platforms State of the Union - WWDC 2016 の一番低いビットレートのプレイリストをサンプルとして使いました。
https://github.com/toshi0383/StreamPlaybackSampler

結論から言うと、AVAssetResourceLoaderを通した場合、HLSコンテンツの再生はできませんでした。
![sss.png](https://qiita-image-store.s3.amazonaws.com/0/35008/671b5534-c110-fe6d-659b-91fe3fb401a7.png "sss.png")

m3u8と1つ目のtsは取れてきているし、特にエラーログも出ません。なぜ。。

```
2016-07-27 17:44:59.501 HLSTest[19147:1838663] -[ResourceLoaderController resourceLoader:shouldWaitForLoadingOfRequestedResource:]
2016-07-27 17:44:59.502 HLSTest[19147:1838663] URL:hello://devstreaming.apple.com/videos/wwdc/2016/102w0bsn0ge83qfv7za/102/0640/0640.m3u8
2016-07-27 17:44:59.502 HLSTest[19147:1838663] currentOffset:0
2016-07-27 17:44:59.503 HLSTest[19147:1838663] requestedOffset:0
2016-07-27 17:44:59.503 HLSTest[19147:1838663] requestedLength:9223372036854775807
2016-07-27 17:45:00.233 HLSTest[19147:1838722] data.length:15983
2016-07-27 17:45:00.234 HLSTest[19147:1838722] httpres.expectedContentLength:15983
2016-07-27 17:45:00.239 HLSTest[19147:1838663] -[ResourceLoaderController resourceLoader:shouldWaitForLoadingOfRequestedResource:]
2016-07-27 17:45:00.239 HLSTest[19147:1838663] URL:hello://devstreaming.apple.com/videos/wwdc/2016/102w0bsn0ge83qfv7za/102/0640/0640_00001.ts
2016-07-27 17:45:00.239 HLSTest[19147:1838663] currentOffset:0
2016-07-27 17:45:00.239 HLSTest[19147:1838663] requestedOffset:0
2016-07-27 17:45:00.239 HLSTest[19147:1838663] requestedLength:9223372036854775807
2016-07-27 17:45:00.528 HLSTest[19147:1838701] data.length:1639736
```

さらにググったところ、AVAssetResourceLoaderはtsファイルには対応していないとの情報を見つけました。なんじゃそれ。
http://stackoverflow.com/questions/29752028/unknown-error-12881-when-using-avassetresourceloader

結局よくわからないので、デベロッパフォーラムに投稿しました。
反応待ちの状態なのですが、誰か詳しい人いないかなーと思って公開しました。

以上になります。
進展あったらまた追記します。
Thymeleaf3で属性値へ動的に値を埋め込み＆テキストを追加したい場合

ものの見事にはまったのでメモ残し。

# 特に気にしなくても良い場合

属性値そのままを出力する場合は特に気にせず、次のように書ける。

```html
<a href="#" th:id="${page}">
```

id属性には Variableに格納した page の値を出力する。

# 属性値をテンプレート内で編集して出力する場合

先ほどの例では、属性値を全部入れておかないとならないので、Javaのロジック側にView用のコードを必要とする。しかしわざわざ専用のDiarectを作ってまで対応するかと言えばそうでなく、簡単なルールなのでHTMLテンプレート内のみで完結させたい。

その場合はこうする。

```html
<a href="#" th:id="'pageNumber_' + ${page}">
```

こうすると、id属性は pageNumber_3 など、文字列連結した結果を出力する。これはOGNL式がこのように解決するため。( Struts2のJSPやFreeMarkerと同じ )

# JavaScriptと関連する属性の場合

困るのがこのケース。

```html
<a href="#" onclick="pagination(6);" />
```

などを動的に行いたい場合、なんと **素直にかこうとするとテンプレート例外が出て詰まる**

正解はこうなる。

```html
<a href="#" th:attr="onclick='pagination(' + ${page} + ');'" >
```

シングルクォーテーションで区切った文字が、Variableからの参照なのかonclickで起動するスクリプトの区切り文字なのかで少し戸惑うが、${ } の前後にある連結記号が先に解釈される。
論文読み: Multiresolution Recurrent Neural Networks: An Application to Dialogue Response Generation

[Multiresolution Recurrent Neural Networks: An Application to Dialogue Response Generation](https://arxiv.org/abs/1606.00776)の内容のサマリ。

## どんなもの?

RNNはLSTMとかの構造をいじるのが主流になっているけれど、入力を工夫した方がいいんじゃない？ということで、入力列を通常の文字列とそこから「粗い(Coarse)」情報を抽出したものとを並列で入力するモデルを提案している(=multi resolution)。

## 先行研究と比べてどこがすごい?

通常のRNNは当然扱える系列は1つだけれども、本研究はこれを複数・パラレルにするという所に意義がある。

## 技術や手法のキモはどこ?

encoder-context-decoderというモデルを、通常文用と粗いもの用と2つ用意し、それを組み合わせている。

![image](https://qiita-image-store.s3.amazonaws.com/0/25990/6104c326-5949-5489-b1e1-6e8d465bd089.png)

「粗い」情報を作る方法として、名詞のみ抽出やActivity-Entity(dialog actと質問カテゴリのようなもの)を使用する方法が提案されている。Ubuntuテクニカルサポートの対話データとTwitterの対話(タスク指向&非タスク指向)双方で実験しており、それぞれにあったCoarseを使っている。

![image](https://qiita-image-store.s3.amazonaws.com/0/25990/c2e26048-3846-55ab-c73a-62c2ce971734.png)

## どうやって有効だと検証した?

ベースラインのモデルとして以下を用意して、precision、recall、f1、そして主観評価を比較。

* Seq2Seq+LSTM(RNNLM(RNN Language Model) + LSTM)
* HRED+LSTM (HRED = Hierarchical Encoder Decoder)

結果としてUbuntuのテクニカルサポートというタスク指向型対話、Twitterの非タスク指向型双方で既存のモデルを上回るという最強感のあるものとなっている。

![image](https://qiita-image-store.s3.amazonaws.com/0/25990/d8511a12-ecca-bf1e-2ff9-4be51d08bfb6.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/25990/cc401576-a211-ce9b-cf9d-c552eb07f172.png)


## 議論はある?

入力文字列に対する適切な抽象化を行うこと(fine-grained abstraction)は、対話中のコンテキストなどのより高次な抽象的な情報を抽出するのに有用な可能性が示された。このモデルは詩や論証といったものや、他の分野では音楽などといったものの生成にも使えると考えている

## 次に読むべき論文は?

この論文中に実装の方法などがかなりきめ細やかに書かれているので、まずはこれらを読み込むとよいと思う。
論文読み: Learning from Real Users: Rating Dialogue Success with Neural Networks for Reinforcement Learning in Spoken Dialogue Systems

[Learning from Real Users: Rating Dialogue Success with Neural Networks for Reinforcement Learning in Spoken Dialogue Systems](http://arxiv.org/abs/1508.03386)の内容のサマリ。

## どんなもの?

対話管理部には強化学習を利用したモデルが良く利用される(POMDPなど)。この学習にはやはり実際のユーザーからのフィードバックを使いたいが、問題がいくつかある。

* ユーザーの目的に合致しているかを使う場合: ユーザーの目的は当然事前にはわからないので、合っているかそもそもわからない
* ユーザーの主観評価を使う場合: PARADISEなどの評価フレームワークがあるが、値は揺らぎがでかい。特にお金で雇ったユーザーは本当に対話したいわけではないので、なおさら。

もしユーザーが感じている評価を予測するモデルがあったら、実際のユーザーとの対話からその評価を予測し、学習させることができるだろう。というわけで、ユーザーの主観評価を予測するモデルをつくろう！という話。

## 先行研究と比べてどこがすごい?

これができれば、ユーザーについての事前知識(目的が何かなど)がなくても強化学習を行うことができる。
※ただ、実際本当のユーザーとの対話はそれほど数が取れないので、学習させる際はユーザーの行動を模したユーザーシミュレーターを作成してそれを使って学習することが多い。ただ、本論文では「Real Users」からの学習にこだわりをもっている。

## 技術や手法のキモはどこ?

ユーザーのDialog Act、信念状態、システムAct、ターン数(1/限界ターン)を結合してベクトル化し(21,575,20,1=617次元)、それをRNNに突っ込んでユーザーの目的に合致している確率を算出する(CNNも検証しているが、精度が悪いので忘れていい)。

![image](https://qiita-image-store.s3.amazonaws.com/0/25990/d03aef02-1def-2895-fe32-a105cb2bc7af.png)

学習データは、アジェンダベースの対話をエミュレートするユーザーシミュレーターを作成して作成(この場合、ユーザーの目的は明らかなのでアノテーションも楽)。

## どうやって有効だと検証した?

RNNを使った報酬予測モデルで学習させたものと、これまで通りユーザーからのフィードバックを利用して学習させたものとの間の精度を比較した。結果、精度はほぼ同程度だった。

![image](https://qiita-image-store.s3.amazonaws.com/0/25990/04c045f4-62a1-ce84-c583-7b91b8b72519.png)
報酬と必要なターン数とが、baselineのモデルと同程度に遷移していることがわかる。

ユーザーからのフィードバックで学習させる場合は、850くらいの対話が必要でしかも揺らぎ(目的達成の評価と主観評価がずれているもの)のないものを厳選する必要があるので、この手間がなくなるのは大きい。

## 議論はある?

今回はドメインを限定した対話で行ったので、学習したモデルの他ドメインへの転移(transfer learning)などが今後の課題として挙げられる

## 次に読むべき論文は?

これはこれとして、Usersimulatorの作り方は見ておいた方がよいかも。下記はPOMDPのとてもよいまとめで、この5章にユーザーシミュレーターについての解説がある。

[POMDP-based Statistical Spoken Dialogue Systems: a Review](http://mi.eng.cam.ac.uk/~sjy/papers/ygtw13.pdf)
BigQueryで日付別テーブルをまとめて日付別に集計したい

# まえおき
ログを日付別テーブル(例：`nginx_log_20160727`とか)作ってBigQueryに毎日つっこんでる場合は

```sql
-- standard
select ...
from `dataset.nginx_log_*`
where _table_suffix between '20160701' and '20160727'
```
とかやって必要な期間のテーブルにまたがって集計できるんですが，そうではない，例えばシステムのユーザ情報テーブルを毎日BigQueryにつっこんで日次での変化を知りたいみたいな場合，日付のカラムがなかったりしてうまくいきません．

`users`テーブルに**BQにインポートした日**的なカラムを持たせておけばそいつを使って集計できそうですが，そもそも日付別に分けてるのにさらに日付を持たせるのが無駄っぽくてつらい．．．

# やったこと
- `__TABLES_SUMMARY__`を見て必要なsuffixを取得
    - そもそもBQのTableQueryとか使うと内部的に同じことをやってるらしいです[^so]
    - `__TABLES_SUMMARY__`は大文字じゃないとダメ(若干ハマった)
- 目的のテーブル群と`cross join`して，`_table_suffix`疑似カラムと一致するものを絞りこむ

たとえば，`users_*`の`xxx_status`ごとの人数をある期間で日別に集計したい場合はこんな感じ．

```sql
-- standard
WITH ts as
  (SELECT substr(table_id, -8) t
   FROM dataset.__TABLES_SUMMARY__
   WHERE table_id LIKE 'users_%')
SELECT parse_date('%Y%m%d', ts.t) t,
       xxx_status,
       count(id) c
FROM `dataset.users_*`,
     ts
WHERE _table_suffix = ts.t
GROUP BY t,
         xxx_status
```

## `WITH ts as(...)` を毎回書くのしんどいんでUDFにしてみる
Standard SQLを使ってるとそもそもUDFが動かない．．?(管理コンソール上のエディタ上のサンプル(`passthrough`)もStandardだと動かなかった)

```js
// Example user-defined function, documentation: https://goo.gl/6KR8O0
// Sample SQL: SELECT outputA, outputB FROM (passthrough(SELECT "abc" AS inputA, "def" AS inputB))


function generate_date_series(row, emit) {
    var start = new Date(row.start_date.substr(0, 4), row.start_date.substr(4, 2) - 1, row.start_date.substr(6, 2));
    var end = new Date(row.end_date.substr(0, 4), row.end_date.substr(4, 2) - 1, row.end_date.substr(6, 2));
    if (start.getTime() > end.getTime()) {
      var tmp = start;
      start = end;
      end = tmp;
    }
    do {
           emit({date: start});
           var s = new Date(start.getUTCFullYear(), start.getUTCMonth(), start.getUTCDate() + 1);
           start = s;
    } while (end.getTime() >= start.getTime())
}

bigquery.defineFunction(
  'generate_date_series',                           // Name of the function exported to SQL
  ['start_date', 'end_date'],                    // Names of input columns
  [{'name': 'date', 'type': 'timestamp'}  // Output schema
  ],
  generate_date_series                       // Reference to JavaScript UDF
);
```

エラー処理もなにもないが

```sql
SELECT FORMAT_UTC_USEC(date) 
FROM (generate_date_series(SELECT "20160701" AS start_date, "20160710" AS end_date))
```

とかやれば連続する日付のTimestampが取得できる．

# あとがき
Legacy SQLだと難しいかな．．．?思いついたら追記しよう．．．

---
[^so]: http://stackoverflow.com/a/22735031