OmniAICreator/Qiita-1.07M huggingface dataset:
さだまさし風の歌詞を自動生成する「さだロボ」

寄り道をしつつ**「ディアゴスティーニ」**(**サダゴスティーニ**とは節度のある大人なので言わない）的に週一頻度で記事を書いてきましたが、一応**「さだロボ」**が形になったのでそれをメインテーマに記事書きます。

一応念の為にお断りしておくと、さだまさしに限らず歌手の世界を完全に再現し、詞として完成されたものを自動生成する、というのはとても難しいテーマで、週末の空き時間を使って数日で作れるものでもありません...。
なので、今回出来上がったのはユーザー操作を前提とした作詞補助ツール（？）という位置づけになります。

# デモサイト
<https://sadatech.herokuapp.com/sadabot>

ページを開くと、`candidate phrase` 欄に一行、さだまさしっぽい歌詞のフレーズが表示されます。
このフレーズを使いたい場合は `add` ボタンを押すとこのフレーズを採用した上で、関連のあるフレーズを新たに表示します。採用した歌詞は `generated result` に表示されるようになります。
気に入らない場合は `retry` を押すと別のフレーズを生成します。
作られたものが気に入らない場合は `clear` を押すと全消去して最初から作り直します。

みたいな事を繰り返していくことで、さだまさし風の歌詞っぽいものが作成されていく、というものになっています。

なお、作成した歌詞を絵文字混じりの文字に変換したい方々（？）のために、絵文字変換ボタン (`to emoji`) も下の方に用意してある親切設計です。

## 動作イメージ
![sadabot.gif](https://qiita-image-store.s3.amazonaws.com/0/44364/7f3e7d95-bb29-e693-abe0-7c3031da5416.gif)

![sadabot2.gif](https://qiita-image-store.s3.amazonaws.com/0/44364/ab0cd68e-4e94-7516-bf00-13db45c91b53.gif)

# 実装について
文章の自動生成にはいくつかの選択肢があると思いますが、オンラインでデモを動かすという意味だとあまり計算に時間を使えないので、デモサイト上ではシンプルなマルコフ連鎖を用いています。

[Wikipedia - マルコフ連鎖](https://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%82%B3%E3%83%95%E9%80%A3%E9%8E%96)

ただし、単純にマルコフ連鎖のロジックを使うだけだとなかなか歌詞として自然な文章にならないので、出力に強い制約をかけることでデモは実現しています。

## 入力
出力の前に情報ソースの話ですが、先週作成した N-gram コーパス ( http://qiita.com/moaikids/items/1d8811320098e70ca98e ) を使います。
今回は、3-gram ~ 7-gram のデータを元に学習をさせてます。また出現頻度に応じて学習スコアを少し変えています。

## 出力
歌詞らしい文章を出力するために、以下の制約を加えています。

* フレーズの最初の単語の品詞は「名詞」「動詞」「形容詞」など(非自立語除く)
* フレーズの最後の単語の品詞は「助詞」「助動詞」など
* 長過ぎたり、短すぎる文章は除外する
* すでに作成されたフレーズと、自然なつながりになる文章を採用する
  * 今回は、作成済みのフレーズの末端の数単語と、新たに作成したフレーズの最初の数単語の組み合わせが N-gram コーパスの中に存在するかどうかでチェックをする

ローカル環境では、すでに作成されたフレーズ中に含まれている単語群と、新たに作成した単語群の Word2Vec による類似度を判定したりしていたのですが、 heroku 上で動かすには制約が多かったので外しています。

# このデモを作る上で参考にしたサイト
[シンプルなRNN/LSTMだけでまともな文章はできない](http://studylog.hateblo.jp/entry/2015/08/31/225124)
このアドベントカレンダーではマルコフ連鎖を使ったものを紹介していますが( RNN/LSTM を用いた例は明日書きます)、このブログ記事に書かれていた以下に引用する、コンピュータの文章生成精度を挙げるためのアプローチが参考になりました。

> 1.前の文字列のみを素性とするのではなく文法素性や言語資源をふんだんにぶち込む
2.大量に生成した文をからまともなものだけをピックアップする
3.生成した文を人手でチェックして修正する
4.出力に人手で作った厳しい制約を課す
5.学習させる文の種類を極端に狭める

今回のデモでは

* 3. : ユーザーインタラクションを前提とした UI にして、人による選択、修正が行えるようにしている
* 4. : 歌詞のフォーマットに沿いやすいように強い制約を与えている
* 5. : 「歌の歌詞」「さだまさし」という狭いコンテキストに限定している

という感じです。
こういうアプローチにすることで、今回みたいなかなりナイーブなアプローチでも、そこそこな精度が保てているように思えます(主観)。

# 個人的に気に入っているフレーズ
以下は、いろいろためす中で遭遇した、個人的にお気に入りのフレーズです。

* 作詩：さだロボ
* 補作詩(ボタンをポチポチ押す人)：moaikids

といった趣きです。

```text:sample1
一度だけの手紙を書いた
誰かに刻んだ
恋はいつでも
僕の胸に熱が上る
振り返り消えそうな
笑顔を思い出して
```

```text:sample2
人を愛してくれた
君はその時に
あなたに届くように
手を離さずに生きて
いたんだね

君の肩を抱きしめられた
時は過ぎて
恋は必ず消えて

夢を見ていた
誰かの誰かの
ために君は何処か
心に届くように
あなたの夢だった
```

さだまさしっぽいとも言えるし、そうでないとも言える気もしますが、、いずれにせよさだまさし氏の今までの素晴らしい曲の数々を教師データとして学習した「さだロボ」により創りだされた産物です。

# いずれにせよ
じゃあ「さだロボ」はともかくとしてコンピュータアルゴリズムがさだまさし本人を超えられるかというと短期的には想像が難しく、余人には到達できない前人未到の領域に達しているさだまさし氏に、人はおろか、機械もおいそれとたどり着くことは難しいことを、あらためて実感しました。
そして、いろいろとさだまさしの詞を解析していくなかで、改めてさだまさしの作品について理解し、その偉大さを感じる、個人的にはそんなアドベントカレンダーでした。

# まとめにかえて
なんとか最低限の水準では**「さだロボ」**を作り上げる事ができました。
残りの枠で、[RNN](https://en.wikipedia.org/wiki/Recurrent_neural_network) で文章作成することを試してみたり、出来上がった詩にメロディ（コード進行）をつけて曲にしてみたり、なんてことが出来ればと思います。
(時間があれば、ですが。)
Mac(OS:El Capitan)でのCOBOL開発環境構築


ドットインストールで勉強しようと試みたところ、
いきなりvagrantとcobolを導入した状態から始まるので開発環境を整える必要があった。

http://dotinstall.com/lessons/basic_cobol/27501

開発環境構築に手間取ったのでメモを残す。

————————————————————
環境の構築
————————————————————

●目的：home-brewにopencobolを導入する

１．home-brewを導入方法（El Capitanとの相性が悪いので詳細が記載されている）
http://blog.h-wd.info/2015/10/08/mac-os-x-10-11-el-capitan%E3%81%ABhomebrew%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/



▼上記で自分がどれに当てはまるのか調べるためusr/localの場所を調査
http://d.hatena.ne.jp/testnoda/20120515/1337069061



２．brewでopen cobolを導入
最新GNU COBOLはbrewでは導入出来ないようだった（20160115現在）
http://blog.morizotter.com/2014/05/03/my-first-cobol/


３．アプリケーションも導入出来るようにするためにHomebrew Caskも導入

▼vagrantやvirtualBOXをインストール
http://qiita.com/moomoo-ya/items/30f9ffdb7dd34caf9ec0


４．cobolファイルのコンパイル

４−１.コンパイルを試みるが
/usr/local/Cellar/open-cobol/1.1/include/libcob.h:24:10: fatal error: 'gmp.h'
      file not found
とエラーがでるので下記から
brew install gmp
brew install gettext
を追加
http://d.hatena.ne.jp/houmei/20111010/1318232081


▼シンボリックリンクを作成
libcob.hファイル内にgmp.hをincludeする記述があるのでincludeディレクトリ内にgmp.hのシンボリックリンクを設置
●コマンド
ln -s /usr/local/Cellar/gmp/6.0.0a/include/gmp.h /usr/local/Cellar/open-cobol/1.1/include


▼シンボリックリンクの作り方
http://qiita.com/pugiemonn/items/e5fb508df690a323ee14



4-2　さらに下記のエラーが
ld: library not found for -lgmp
clang: error: linker command failed with exit code 1 (use -v to see invocation)

▼コマンドラインツールを入れることで解消
http://qiita.com/takecian/items/bd9fd49c9b9704d6c425



５．無事コンパイル

▼home-brew導入から使い方まで記載
http://vdeep.net/intr-homebrew
Swiftはじめたい...その２ 変数


# 今日は変数を試してみます。
+ その１で作ったPlaygoroundで動かします。

# 変数、定数
+ 変数と同じレベルで定数があるんですね。

### 変数 
```swift:変数はvar
var a = 1
var b = "abc"

++a
b += "d"

print(a)
print(b)
```

```shell:結果
2
abcd
```

### 定数 
```swift:定数はlet
let a = 1
let b = "abc"

++a
b += "d"

print(a)
print(b)

```
+ コンソールにはエラーがでます。定数は変更できないです。

```shell:結果
Playground execution failed: /var/〜/playground114.swift:19:1: error: cannot pass immutable value to mutating operator: 'a' is a 'let' constant
++a
^ ~
/var/〜/playground114.swift:16:1: note: change 'let' to 'var' to make it mutable
let a = 1
^~~
var
/var/〜/playground114.swift:20:3: error: left side of mutating operator isn't mutable: 'b' is a 'let' constant
b += "d"
~ ^
/var/〜/playground114.swift:17:1: note: change 'let' to 'var' to make it mutable
let b = "abc"
^~~
var
```

## 変数の型

+ 型推論があるので、初期値を入れると型が決定するようです。

```swift:型推論
var a = 1   // 整数とされる。
a = a + 1   // OK
a = a + 0.1 // 小数点を足そうとしてエラー
```

+ 型は明示できるようです。

```swift:型推論
var a:FLoat = 1   // 小数点とされる。
a = a + 1   // 1も小数点とおもわれるのかOK
a = a + 0.1 // OK
```

# optional type とは？？

+ なんか変数に？マークがついてたりしますよね、あれです。

## 変数がnilになるのを許すか許さないか…「？」

```swift:普通ではnilを許しません。
var a:Int
print(a) // エラー
```

+ ?をつけるとnilでも許すことになります。

```swift:?でnilを許します。
var a:Int?
print(a) // nilとでる。
```

## 「！」マークはなに？

+ ?マークの変数に値を入れてみます。

```swift:?の変数に値を入れてみます。
var a:Int?
a = 1
print(a) // -- Optional(1)
```

	1 じゃなくて Optional(1) と出てしましました。?をつけた変数はOptional型ってやつになってしまうようです。

+ !マークを付けてみます。

```swift:?の変数に値を入れてみます。
var a:Int?
a = 1
print(a) // -- Optional(1)
print(a!) // -- 1
```

+ Optional(1)の中身の1が取れました。

## まとめ

+ objective-cと違って、なにもつけないとnilはエラーになります。
+ なのでnilになることがある変数のみ「?」をつける。
+ 「?」をつけた変数の中身はOptionalの中にあるので中身は「!」で取り出す。
+ …でいいのかな？

# 今日はここまで

+ 次回は配列とか辞書型を試したいと思います。
Windows でポート22番を開く方法

Windows で動いている sshd に接続する手順です。既に sshd は動いていると仮定します。sshd の起動は (Cygwin を使用している場合) 概ねこちらの記事の通りに設定できます。

* [CygwinのインストールおよびSSHデーモンの起動](https://docs.oracle.com/cd/E26854_01/install.12103/b65084/preinstall_req_cygwin_ssh.htm)

## 環境

* Windows 10 Home Edition

## コマンド

コマンドプロンプトか Cygwin ターミナルを管理者権限で開いて次のコマンドを打ちます。

```shell-session
netsh advfirewall firewall add rule name="sshd" dir=in action=allow protocol=TCP localport=22
```

## トラブルシューティング

マカフィーなどのアンチウィルスソフトが外部からの接続を妨げることがあります。接続に失敗するときは、それらのソフトウェアを無効にして動作確認をして、問題の切り分けをすることをおすすめします。
PySpark 1.5.2 + Elasticsearch 2.1.0 導入手順と実行


## はじめに
- pyspark から Elasticsearchを触りたい

## 環境
- Elasticsearch 2.1.0
- Spark 1.5.2

## Spark インストール

省略します。本日Spark 1.6も出ましたが、1.5.2で。


## Elasticsearch+hadoop ダウンロード
- 2016/1/6時点では、Elasticsearch 2.1.0では、elasticsearch-hadoop-2.2.0-beta1が必要です。

[公式ページ](https://www.elastic.co/downloads/hadoop)からダウンロードして展開するだけ

```
$ wget http://download.elastic.co/hadoop/elasticsearch-hadoop-2.2.0-beta1.zip
$ unzip elasticsearch-hadoop-2.2.0-beta1.zip
```

## pyspark + elasticsearch起動

```
/usr/local/share/spark/bin/pyspark --master local[4] --driver-class-path=elasticsearch-hadoop-2.2.0-beta1/dist/elasticsearch-spark_2.11-2.2.0-beta1.jar
```

## RDD生成
```
>>> conf = {"es.nodes" : "XXX.XXX.XXX.XXX:[port]", "es.resource" : "[index name]/[type]"}
>>> rdd = sc.newAPIHadoopRDD("org.elasticsearch.hadoop.mr.EsInputFormat","org.apache.hadoop.io.NullWritable", "org.elasticsearch.hadoop.mr.LinkedMapWritable", conf=conf)
```

## 基本操作
```
>>> rdd.first()
>>> rdd.count()
>>> rdd.filter(lambda s: 'aaa' in s).count()
```

## Map / Reduce

```
# name別にいくつのレコードがあるかカウント
counts = rdd.map(lambda item: item[1]["name"])
counts = counts.map(lambda ip: (ip, 1))
counts = counts.reduceByKey(lambda a, b: a+b)

# 実行
>>> counts.collect()
```

## ESへのsave
```
rdd.saveToEs('test/docs')
```

## ハマったとこ
- Elasticsearch側での、Network設定は注意。```network.publish_host```が正しくないと、接続が拒否されました系のエラーが出てはまった。
    - [Remote access about Spark and Elasticsearch](https://discuss.elastic.co/t/remote-access-about-spark-and-elasticsearch/23619)が参考になった。
 
```
<snip>
File "/usr/local/share/spark/python/lib/py4j-0.8.2.1-src.zip/py4j/protocol.py", line 300, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling z:org.apache.spark.api.python.PythonRDD.newAPIHadoopRDD.
: org.elasticsearch.hadoop.rest.EsHadoopInvalidRequest: [GET] on [_nodes/http] failed; server[hostname/XXX.XXX.XXX.XXX:Ports] returned [400|Bad Request:]
<snip>
```


## 参考
### Spark
- [楽しい可視化 ： elasticsearchとSpark Streamingの出会い](http://www.intellilink.co.jp/article/column/bigdata-kk02.html)

- [Elasticsearch in Apache Spark with Python—Machine Learning Series, Part 2](https://qbox.io/blog/elasticsearch-in-apache-spark-python)

### Elasticsearch
- [Apache Spark support](https://www.elastic.co/guide/en/elasticsearch/hadoop/current/spark.html)
- [Remote access about Spark and Elasticsearch](https://discuss.elastic.co/t/remote-access-about-spark-and-elasticsearch/23619)
	- AWSのDiscoveryの問題。network.publish_host の設定が重要。
- [elasticsearch.ymlの設定](http://www.tree-tips.com/elasticsearch/config/elasticsearch_yml/)
- [Elasticsearch Unplugged - 2.0におけるネットワークの変更(日本語訳)](http://blog.johtani.info/blog/2015/08/28/elasticsearch-unplugged-ja/)
UE4 でアクターのモーションを制御する方法

# 環境
UE 4.10.0
Visual Studio 2015

# 概要
Unreal Engine 4 を触ってみて動作を確認する
C++ プログラム上でモーションを制御する方法についてのまとめ

# 本文
## スケルタルメッシュとは？
モーション制御の前に UE4 のメッシュについて確認
UE4 では、メッシュは 2 種類あるようだ
雑な説明をすれば、以下のような大別ができる

+ スタティックメッシュ
こちらは、静的メッシュのようだ
ボーンの入っていないメッシュを扱う際はこちらを使用するようだ

+ スケルタルメッシュ
こちらは、動的メッシュのようだ
ボーンが入っており、モーションで制御するメッシュを扱う際はこちらを使用する
ようです

## モーションデータを準備する
サンプルを実装する前に、モーションデータをどうしようかと思っていたらマー
ケットプレイスに「アニメーションスターターパック」というのが無料であった
ので、これを使用するようにした。マーケットプレイスからダウンロードして、
プロジェクトに追加すればすぐに使用できる。

## アクターにプログラム上でコンポーネントを追加する
プログラム上でやる事は、必要なコンポーネントを追加し、アセットからの参照を
解決し、アニメーションの再生命令を出すの３つです。以下、サンプルです。

[ヘッダー]
UCLASS()
class TEST20160104_API AMyActor : public AActor
{
    GENERATED_BODY()

public:	
    AMyActor(const class FObjectInitializer& ObjectInitializer);

    virtual void BeginPlay() override;
	
    virtual void Tick( float DeltaSeconds ) override;

private:
    USkeletalMeshComponent* mSkeletalMeshComponent;
    USkeletalMesh*          mSkeletalMesh;
    UAnimSequence*          mAnimSequence;
};

[コード]
AMyActor::AMyActor(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
, mSkeletalMeshComponent(nullptr)
, mSkeletalMesh(nullptr)
, mAnimSequence(nullptr)
{
    PrimaryActorTick.bCanEverTick = true;
	
    // メッシュ初期化
    static ConstructorHelpers::FObjectFinder<USkeletalMesh> meshAsset(TEXT("/Game/AnimStarterPack/UE4_Mannequin/Mesh/SK_Mannequin.SK_Mannequin"));
    if (meshAsset.Succeeded())
    {
        mSkeletalMesh = meshAsset.Object;
        mSkeletalMeshComponent = ObjectInitializer.CreateDefaultSubobject<USkeletalMeshComponent>(this, TEXT("MeshComponentMeshName"));

        if (mSkeletalMeshComponent)
        {
            RootComponent = mSkeletalMeshComponent;
            mSkeletalMeshComponent->SetSkeletalMesh(mSkeletalMesh);
        }
    }

    // アニメーション初期化
    static ConstructorHelpers::FObjectFinder<UAnimSequence> animAsset(TEXT("/Game/AnimStarterPack/Idle_Pistol.Idle_Pistol"));
    if (animAsset.Succeeded())
    {
        mAnimSequence = animAsset.Object;
    }
}

void AMyActor::BeginPlay()
{
    Super::BeginPlay();

    if (mSkeletalMeshComponent)
    {
        mSkeletalMeshComponent->PlayAnimation(mAnimSequence, true);
    }
}

## コードの解説
まずは、ヘッダの解説。
スケルタルメッシュ、スケルタルメッシュコンポーネント、アニメーションシーケンス
の 3 つをメンバとして追加する。スケルタルメッシュの表示は、スタティックメッシュ
とほぼ同じ。他にモーション再生の為のインスタンスを追加する。

次は、コードの解説。
コンストラクタでは、スケルタルメッシュのアセットのパスを指定し、インスタンスを
初期化する。モーションのアセットのパスを指定し、インスタンスを初期化する。
BeginPlay で、モーションを再生の命令を出している。
アセットのパスが間違ってなければ、上記コードで動くと思う。

## まとめ
アクターでスケルタルメッシュにモーションさせる場合は、以下のコンポーネントを
メンバに追加し、初期化して、モーション再生命令を出す。

+ スケルタルメッシュ
+ スケルタルメッシュコンポーネント
+ アニメーションシーケンス
underscoreコードリーディング（uniq）


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



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


##uniqとは


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

こんな説明。
>####_.uniq(array, [isSorted], [iteratee]) Alias: unique 
>Produces a duplicate-free version of the array, using === to test object equality.
>In particular only the first occurence of each value is kept.
>If you know in advance that the array is sorted, passing true for isSorted will run a much faster algorithm.
>If you want to compute unique items based on a transformation, pass an iteratee function.


```javascript
_.uniq([1, 2, 1, 4, 1, 3]);
=> [1, 2, 4, 3]
```
------------- 
===での等値比較を利用した形での、重複のない形のarrayを生成します。
特にはじめて出現したそれぞれの値は絶対に存在します。
もし、そのarrayがソート済みだと事前にわかっている場合、isSortedにtrueを渡すことによって、もっと高速なアルゴリズムで計算します。
もし、計算に基づいたユニークなアイテムを求めたい場合は、iterateeに関数を渡すことによって計算できます。


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

```javascript
 // Produce a duplicate-free version of the array. If the array has already
  // been sorted, you have the option of using a faster algorithm.
  // Aliased as `unique`.
  _.uniq = _.unique = function(array, isSorted, iteratee, context) {
    if (!_.isBoolean(isSorted)) {
      context = iteratee;
      iteratee = isSorted;
      isSorted = false;
    }
    if (iteratee != null) iteratee = cb(iteratee, context);
    var result = [];
    var seen = [];
    for (var i = 0, length = getLength(array); i < length; i++) {
      var value = array[i],
          computed = iteratee ? iteratee(value, i, array) : value;
      if (isSorted) {
        if (!i || seen !== computed) result.push(value);
        seen = computed;
      } else if (iteratee) {
        if (!_.contains(seen, computed)) {
          seen.push(computed);
          result.push(value);
        }
      } else if (!_.contains(result, value)) {
        result.push(value);
      }
    }
    return result;
  };
```
uniqueにもエイリアスが張られている。
isSortedがtrueの場合、contextにiterateeを代入、iterateeにisSorted(true)を代入、isSorteedをfalseにする。

iterateeがnullではない場合、cbに渡して返り値で置き換える
返り値用のresultとseenを配列として定義する。
配列の長さだけfor文を回す。
valueに配列のi番目の値を格納、iterateeが存在すればcomputedにiterateeにvalue,i,arrayを渡した結果を、そうでない場合はvalueを格納
isSortedがtrueであれば
iが存在しないか、seenがcomputedではない場合はresultに格納する
その後、seenにcomputedを代入する//既にsortedなので、[1,1,2,3,3,3,4]のような形で、ひとつ前の値とのみ比較すれば良いため

isSortedがtrueではなく、iterateeが存在する場合はseenがcomputedに含まれているかどうかの確認後、含まれていない場合はseenにcomputedを、resultにvalueをpushする。

isSortedがtrueではなく、さらにiterateeもない場合、かつresultにvalueが含まれていない場合はresultにvalueをpushする。

これらを繰り返した後、resultを返す。
iOSアプリ開発用のマシンのセットアップ - 証明書の自動セットアップ -

# はじめに
iOSアプリを開発するためには、マシンのセットアップをやらないといけません。

どのようなことをやらないといけないかと言うと、[iOSアプリ開発におけるCI/CD](http://qiita.com/tarappo/items/b2fd7d59c50714c8ea0b)という記事を書いた時に必要なことを以下のように列挙しました。

```
 - 環境用意(Macのセットアップ周り)
   1. iOSアプリ開発用の証明書インストール
   2. Apple Dev Centerへの登録
     1. デバイスの追加
     2. Provisioning Profileの更新
   3. Provisioning Profileの設置
```

上記に関しての更新タイミングは以下のとおりです。

 - 1 「新しいマシンが追加」「証明書が更新(少なくとも1年に1回はある)」
 - 2-1 「新しい端末が追加」
 - 2-2 「2-1が行われた」「新しいアプリを作成」
 - 3 「2-2が行われた」

このように定期的におこなわれる作業なので、自動化しておかないと面倒です。
2と3については[別の記事](http://qiita.com/tarappo/items/ca5b828e6a0761cd23b6)で書いたので今回は1について書きます。

# 証明書のセットアップ
Apple DeveloperのMember Centerから証明書をダウンロードするのは、[cupertino](https://github.com/nomad/cupertino)を使っています。

証明書をダウンロードし、セットアップするまでのサンプルコードは以下のとおりです。

```bash:サンプルコード
bundle exec ios certificates:download "$NAME" --type development -u "$DEVELOPER_USER_ID" -p "$DEVELOPER_PASSWORD"
bundle exec ios certificates:download "$NAME" --type distribution -u "$DEVELOPER_USER_ID" -p "$DEVELOPER_PASSWORD"

echo $DISTRIBUTON_KEY_BASE64 | base64 -D > $(PWD)/dist.p12

KEYCHAIN=~/Library/Keychains/ios.keychain
KEYCHAIN_PASSWORD="$PASSWORD"

security create-keychain -p "$KEYCHAIN_PASSWORD" ios.keychain
#unlock-keychainをしないとiOSアプリのビルド時などパスワードを聞かれてしまうので注意
#これをしていてもビルド時にはパスワードをきかれることがあるので、ビルド前にunlock-keychainをするのが良い。
security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN

security import $(PWD)/ios_development.cer -k $KEYCHAIN -T /usr/bin/codesign
security import $(PWD)/ios_distribution.cer -k $KEYCHAIN -T /usr/bin/codesign
security import $(PWD)/dist.p12 -k $KEYCHAIN -T /usr/bin/codesign -P "$KEY_PASSWORD"
#これをしないと一覧に表示されません
security list-keychains -s ios.keychain

rm -rf $(PWD)/dist.p12
rm -rf $(PWD)/ios_*.cer
```

## 環境変数についての説明

|key                   |説明|
|:---------------------|:--|
|NAME                  |Member CenterのiOS Certificatesに書かれているName|
|DEVELOPER_USER_ID     |Apple DeveloperのUserID|
|DEVELOPER_PASSWORD    |Apple Developerのパスワード
|DISTRIBUTON_KEY_BASE64|秘密鍵を書きだしたp12ファイルをbase64エンコードした値|

### DISTRIBUTON_KEY_BASE64についての補足説明
キーチェーンアクセスから、iPhone Developer/iPhone Distribution証明書の秘密鍵を書き出し、保存したp12ファイルに対して以下のコマンドを用いて取得します。

```
cat dist.p12|base64|pbcopy
```

## Jenkinsでの対応方法
注意するべき点は以下の2つぐらいです。

 - ジョブは"マルチ構成プロジェクトのビルド"で作成し対象となるマシンに対して一括で更新できるようにします。
 - 環境変数は、"ビルド環境"の"環境変数としてパスワードをインジェクト"で設定します。

# おわりに
今回の対応と[以前の記事](http://qiita.com/tarappo/items/ca5b828e6a0761cd23b6)のコードがあれば、iOSアプリ開発におけるセットアップは自動化できます。


## 参考
 - https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/security.1.html
API定義管理のためにHerokuでCarteを使ってみた。

![carte.png](https://qiita-image-store.s3.amazonaws.com/0/87172/13b154af-f3c2-7681-f67e-0d23fea0b6dd.png)

## 背景とか

APIを使って開発する際に、仲間同士でAPI定義を共有できるプライベートな場所が欲しかった。
モックまで作ってくれるapiary.ioもいいけど、いかんせん有料だ（使ってみたい・・・）

そこで[Carte](https://github.com/Wiredcraft/carte)を使ってみることにした。
マークダウン書いてpushするだけで覚えることほとんどない。

今回は手軽に作りたかったので、常時起動させている必要もないし、herokuで作ることにした。
プライベートな場所にするためベーシック認証をつける

##Carteをgitからクローン
``` 
git clone https://github.com/Wiredcraft/carte.git 
```
##Gemfileの作成/編集
``` 
touch Gemfile
```
```text:Gemfile
source 'https://rubygems.org'
ruby '2.1.0'
gem 'bundler'
gem 'jekyll'
gem 'rack-jekyll'
```
``` 
bundle
```

## _config.yml編集
```yaml:_config.yml
exclude: ['config.ru', 'Gemfile', 'Gemfile.lock', 'vendor']
```

## config.ru編集
```rb:config.ru
require 'rack/jekyll'
run Rack::Jekyll.new
```

## ベーシック認証
以下を追加する

```rb:config.ru
use Rack::Auth::Basic, "Restricted Area" do |username, password|
  [username, password] == [ENV['BASIC_AUTH_USERNAME'], ENV['BASIC_AUTH_PASSWORD']]
end
```

herokuには以下の設定を行う

```
heroku config:add BASIC_AUTH_USERNAME="user"
heroku config:add BASIC_AUTH_PASSWORD="pass"
```

## herokuの準備
```
heroku create nameofyourblog --buildpack https://github.com/andycroll/heroku-buildpack-jekyll.git
```
すでにアプリが作成されている場合

```
cd my-project/
git init
heroku git:remote -a myapp
heroku buildpacks:set https://github.com/andycroll/heroku-buildpack-jekyll.git
```

## 確認
```
git add .
git commit -m 'first commit'
git push heroku master
heroku open
```

## 仲間同士でAPI定義
ソース管理を[bitbucket](https://bitbucket.org/)に変更

```
git remote add origin git@bitbucket.org:xxx/yyy 
```
  
[wercker](http://wercker.com/)でビルドとHerokuへのデプロイを行う
werckerでの設定は以下のとおり
<ol><li>Application settingsにてAddDeployTargetよりcustom deployを選択
</li><li>Deploy target nameにherokuと入力
</li><li>Auto deployをチェック
</li><li>branch nameにmasterと入力
</li><li>SAVEする</li></ol>

Deploy pipelineより変数を設定する
<ol><li>HEROKU_KEY　　（Herokuで発行する）
</li><li>HEROKU_USER　　（Herokuで設定したメールアドレス）
</li><li>HEROKU_APP_NAME　（Herokuでのアプリ名）
</li><li>SAVEする
</li></ol>

wercker.ymlは以下のとおりにする

```yaml:wercker.yml

box: ruby:2.1.8
build:
    steps:
        - bundle-install
deploy:
  steps:
    - heroku-deploy:
        key: $HEROKU_KEY
        user: $HEROKU_USER
        app-name: $HEROKU_APP_NAME
```

あとはみんなでpushし合えばOK

## 参考にしたサイト
[Serving a Jekyll Blog using Heroku](http://andycroll.com/ruby/serving-a-jekyll-blog-using-heroku/)
CentOS on vmware > RPiのデスクトップを表示する > on MacOSX | on Windows 7pro

```txt:動作確認
- CentOS6.5 on VMware Fusion on MacOS X 10.8.5
- Raspberry Pi2
```

RPiで動かす小さなソフトは以下の方法で実装している。

1. MacOS X上のターミナルからsshで接続
2. viでプログラム

しかしながらGUIを使いたくなった。

MacOS XにXサーバーを入れればいいのはわかっているが、あまり食指が動かなかった。

ふと、vmware上のCentOS上から`ssh -X`で接続したらどうなるかと思って試した。

## 手順 (on VMware Fusion on MacOS X 10.8.5)
CentOSのターミナルから以下を実行しログインする。

```
$ ssh -X -l pi 192.168.10.9
```

Xサーバーを立ち上げる。

```
$ lxsession
```

vmwareのウィンドウ下部にRaspberry Piのメニューが表示された。成功。


## try2 (on CentOS 6.5 on VMware workstation on Windows 7Pro)

```txt:動作確認
- CentOS6.5 on VMware workstation on Windows 7pro
- Raspberry Pi2
```


Windows版のVMware workstationでも試してみた。

lxsessionした時に表示されるステータスバーの左側が見えない。
画面サイズの問題だろうか。

CentOS側でディスプレイの解像度を 1440x900固定にしたらステータスバーの左側も表示されるようになった。
1024 x 768の設定でも成功。

色々いじっているうちに、VMwareをフルスクリーン表示でもステータスバーの左が見えるようになった。

## 備考

Windows, MacともにVMwareでCentOSイメージがあればRPiの画面を転送できることがわかった。

試していないが、VirtualBoxなどでCentOSなどのlinuxイメージを動かしたら同様に使えそう。

### try3 (on Ubunutu 16.04 LTS on VMWare workstation on Windows 10 v1809)
(追記 2019-01-23)

```txt:動作環境
- Ubunutu 16.04 LTS on VMWare workstation on Windows 10 v1809
- Raspberry Pi2
```

こちらの環境では以下の不具合は発生せず、問題なく使用できた。

> lxsessionした時に表示されるステータスバーの左側が見えない。
画面サイズの問題だろうか。


### 関連情報
(2019-01-30追記)

同じ症例の、対処が紹介されています。

- [Mac のディスプレイに Raspberry Pi のデスクトップを表示したときに LXDE のタスクバーが表示されず、制御不能になった時の対処](https://qiita.com/UedaTakeyuki/items/3fe3fe8b2c15ebb5143a)
    - @UedaTakeyuki さん


情報感謝です。
[解決済み]nginx の resolver で ipv6 を無効にする


nginx を、外部の画像サーバのリサイズとかキャッシュに使用していて、
proxy_pass $url で動的に色々な画像サーバのURLを指定しています。

### 不具合の現象

nginx ver 0.8.5 を 1.7 系にアップしたら、
特定のURLのみ ipv6 を引いて来てしまい、3回中1回位の確率で、upstream: に ipv6 の ip が指定されて、接続できない事がありました。

下記のようなログを大量に出力されてた。

```
2016/01/06 00:00:00 [alert] 721#0: *156131 socket() failed (97: Address family not supported by protocol) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET /resize?width=100&height=100&url=http://example.com/example_image.jpg HTTP/1.0", upstream: "http://[2404:6800:400a:805::2010]:80/img/gaikan/N941/N9414697/N941469780000020120T.jpg", host: "127.0.0.1:8080"
```

特定 URL が下記のような AAAA を返すのが原因の様でした。

```
[root@nginx]$ dig storage.l.googleusercontent.COM @192.168.1.1 any
; <<>> DiG 9.3.6-P1-RedHat-9.3.6-20.P1.el5_8.6 <<>> storage.l.googleusercontent.COM @158.205.237.131 any
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43948
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;storage.l.googleusercontent.COM. IN	ANY

;; ANSWER SECTION:
storage.l.googleusercontent.COM. 82 IN	AAAA	2404:6800:400a:806::2010
storage.l.googleusercontent.COM. 82 IN	A	216.58.196.240

;; Query time: 3 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Wed Jan  6 22:11:35 2016
;; MSG SIZE  rcvd: 93
```

そこで nginx.conf の resolver の設定に "ipv6=off" にして、無事解決しました！

```
server {
    listen 80;
    server_name localhost;
    resolver 192.168.1.1 ipv6=off;
```

[参考ページ](http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver)
Centos7でsquidを立てる



外部サーバにプロキシを立てる必要に迫られたのでメモ。

# まとめ
- squidでプロキシサーバを立ち上げ、そこ経由でWebにアクセスできる
  - 内部ネットではなく、外部ネットから見たときの挙動確認とかに便利
- yumで5~10分程度で構築できる
- Cenos7だとiptablesではなくfirewalldを使うのが主流（？）

# インストール
yumで入ります。
`yum -y install squid`

# 設定変更
適度に自分の環境に合わせて設定します。
`emacs /etc/squid/squid.conf`



```
# デフォルトはほとんどいじらないので省略

# アクセスを許可したいアドレス
# デフォルトでプライベートアドレスはA~Cまで許可済み
# 今回は外部のサーバにWebプロキシを立てるので書く
acl allowadress src x.x.x.x/255.255.255.255
http_access allow allowadress
http_access deny all

# 匿名性をあげる設定
forwarded_for off
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all

# Refererを切ると一部のサイトではおかしくなったりするので、
# 匿名プロキシじゃないと困る場合以外は設定しない方が良い
# request_header_access Referer deny all

# サーバのホストネームを入れる
visible_hostname example.com

# ポートを変更(デフォルトは3128)
http_port 12345

# キャッシュさせたくないのでOFF
no_cache deny all
```

# squid起動
`service squid start`

# firewall-cmdの設定
このままだと外部からアクセスできないので、アクセスできるように設定します。
また、Squidが動いていることを知らせない方がより安全なので、指定したアドレスからのみアクセスできるようにします。

```bash
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="x.x.x.x" port protocol="tcp" port="12345" accept"
firewall-cmd --reload
```

# その他
以上の手順により、プロキシを使ってアクセスできると思いますが、
うまくいかない場合は以下のように調べると良いと思います。

- サーバ上でSquidのポートにcurlでアクセス
  - アクセスできなければSquidが動いてない
- アクセスできたら手元でSquidサーバのポートにcurlでアクセス
  - アクセスできなければポートが開放されていない
- アクセスできているなら手元のマシンのプロキシ設定がおかしい

また、Webは見られるがたまに特定サイトでSquidのエラー画面が出てくる場合、上記のvisible_hostnameの設定を正しくすることで解決しましたが、確定ではないです。
FreeNAS tips - 電子証明書とオレオレ認証局

FreeNAS のちょっとした設定など。うっかり見落とし勝ちなものを中心に。

# オレオレ認証局

メニュー>システム>CAs で、FreeNAS が認証局作成をGUI化してくれています。これを知らずに [jail で認証の環境を用意してしまった](http://qiita.com/katz_engineer/items/9895f0f56c0976f382eb)私ですが…。早速こちらに乗り換えて、jail の環境は捨てました。まぁ、勉強にはなったので、無駄ではありませんでしたが。

# 電子証明書

認証局と同様に メニュー>システム>Certificates で証明書も作れます。オレオレ認証局での署名もちゃんと出来ます。署名する認証局も選択可能。素晴らしい。

# 証明書の置き場所

作成された電子証明書のFreeNAS上での置き場所は ```/etc/certificates``` でした。 ```find``` コマンドで探しました… なお認証局はそのサブディレクトリ ```/etc/certificates/CA``` でした。

# ダウンロード

認証局も証明書も、GUI上で選択すると、画面下に Export のボタンが表示されます。はい。これをクリックすると、いとも簡単に必要書類をクライアントマシンにダウンロードできます。いやいやいやいや、なんと簡単になった事でしょう。いいね！:+1:
MacでAndroidStudioを完全アンインストール

2021年5月
変わらず使えます。

----

普通にゴミ箱にポイってするだけだと
あれやこれや残りまくってしまう。

コマンドで以下を1個ずつ叩くとキレイに消えます。
**最後の一行はSDKの削除です**

## 4.1以降のAndroidStudioをお使いの方
```lang:ターミナルなどで
rm -Rf /Applications/Android\ Studio.app
rm -Rf ~/Library/Preferences/AndroidStudio*
rm ~/Library/Preferences/com.google.android.studio.plist
rm -Rf ~/Library/Application\ Support/Google/AndroidStudio*
rm -Rf ~/Library/Logs/AndroidStudio*
rm -Rf ~/Library/Caches/AndroidStudio*
rm -Rf ~/.gradle
rm -Rf ~/.android
rm -Rf ~/Library/Android*
```

## 4.1より前のAndroidStudioをお使いの方
```lang:ターミナルなどで
rm -Rf /Applications/Android\ Studio.app
rm -Rf ~/Library/Preferences/AndroidStudio*
rm ~/Library/Preferences/com.google.android.studio.plist
rm -Rf ~/Library/Application\ Support/AndroidStudio*
rm -Rf ~/Library/Logs/AndroidStudio*
rm -Rf ~/Library/Caches/AndroidStudio*
rm -Rf ~/.gradle
rm -Rf ~/.android
rm -Rf ~/Library/Android*
```


で消えます

## 全編動画はこちらです
https://youtu.be/1ZvyN9BgUvo
グラフの連結成分（JavaScript版）

こんにちは。
「[グラフの連結成分](http://qiita.com/kkdd/items/c75d3a10bbdd1bc05b1a)」を求めるコードを JavaScript で書いてみました。
![graph.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54617/0db94b92-88cc-489b-7da0-69fb5efa35e7.jpeg)

```console
$ js connected_components.js
[[ 0,1,2,3,4,6 ], [ 5,7 ]]
```

```connected_components.js
const graph = {"0": ["1", "2", "3"], "1": ["2"], "2": [], "3": ["4", "6"], "4": [], "5": ["7"], "6": [], "7": []};
//       0
//     / | \
//    1--2  3
//          | \
//          4  6
//    5--7

console.log(connected_components(graph));

function connected_components(graph) {
  const components = [];
  for (const n in graph) {
    if (!visited(n)) components.push(traverse(n));
  }
  return components;

  function traverse(n) { // recursive, depth-first
    const nodes = [n];
    for (const m of graph[n]) {
      if (!visited(m)) concat_(nodes, traverse(m));
    };
    return nodes;
  }

  function concat_(a, b) {
    Array.prototype.push.apply(a, b);
  }

  function visited(n) {
    return components.flat().includes(n);
  }
}
```
FreeNAS tips - NTP

FreeNAS のちょっとした設定など。うっかり見落とし勝ちなものを中心に。

# NTP

メニュー>システム>基本設定 の右下に[NTPサーバ]ボタンがあります。日本なら迷わず ntp.nict.jp を指定しましょう。

参考文献:
[日本標準時(JST)グループ](http://jjy.nict.go.jp/tsp/PubNtp/index.html)
Ansibleでサーバ毎にユニークな処理を行う


Ansibleを使うと、複数のサーバで一斉に同じ処理を実行することができます。しかし、IPアドレスを設定するなど、サーバ毎に異なる処理を実行したい場合には、ちょっとした工夫が必要です。
以下では、処理対象のサーバ毎にユニークな値の変数を記述したファイルを準備し、playbook からそれを読み込む方法を説明します。

# サンプルの内容

2台のサーバ tanuki と mujina に対して、各々、内容が異なる専用の変数ファイルを用意し、それらを読み込んで処理を実行する playbook を作成します。

# インベントリファイルの作成

インベントリファイル ansible_hosts にサーバを記述します。

    tanuki
    mujina

# 変数ファイルの配置先ディレクトリの作成

各サーバの変数ファイルを配置するための vars ディレクトリを作成します。

    # mkdir vars

# 変数ファイルの作成

varsディレクトリ配下に各サーバ毎に変数ファイルを作成します。ファイル名は ノード名.yml とします。内容としては、各サーバ固有のIPアドレスを my_iapddr 変数に設定するというものです。

  vars/tanuki.yml

    ---
    my_ipadder: 192.168.100.61
 
  vars/mujina.yml

    ---
    my_ipadder: 192.168.100.62

# サンプル playbook の作成

サンプルとして、vars_files で各サーバ専用の変数ファイルを読み込み、debug モジュールで変化の内容を表示させる playbook を作成します。

    ---
    - hosts: all
      vars_files:
        - vars/{{ansible_hostname}}.yml
    
      tasks:
        - debug: msg="my_ipaddr = {{ansible_hostname}}/{{my_ipaddr}}"

ここでは、読み込み対象のファイル名をマジック変数 ansible_hostname から動的に生成しています。ansible_hostname には、各ノードで hostname コマンドを実行した結果が設定されます。

# サンプル playbook の実行

サンプル playbook の実行結果は以下のようになります。

    # ansible-playbook -i ansible_hosts foreach.yml -u root -k
    SSH password: 
    
    PLAY [all] ******************************************************************** 

    GATHERING FACTS *************************************************************** 
    ok: [tanuki]
    ok: [mujina]
    tanuki: importing vars/tanuki.yml
    mujina: importing vars/mujina.yml
    
    TASK: [debug msg="my_ipaddr = {{ansible_hostname}}/{{my_ipaddr}}"] ********* 
    ok: [tanuki] => {
        "msg": "my_ipaddr = tanuki/192.168.100.61"
    }
    ok: [mujina] => {
        "msg": "my_ipaddr = mujina/192.168.100.62"
    }
    
    PLAY RECAP ******************************************************************** 
    tanuki                     : ok=2    changed=0    unreachable=0    failed=0   
    mujina                     : ok=2    changed=0    unreachable=0    failed=0   

各々のサーバ毎に専用の変数ファイルが読み込まれ、サーバ毎にユニークな値が表示されていることがわかります。
Ruby 2.3.0 + Rails 5.0 beta 1を独立した環境で動かす

Rails 5.0 beta 1がリリースされたし色々触ってみたい。
でもあくまで実験なので個人で使っているRubyの環境とは分離しておきたい。
と言うことで、rbenvでRails 5.0 beta1専用の環境を作って動かすことにしました。

# 方法
`ruby-build` を直接叩くと任意のプレフィクスでrubyをインストールできるので、それを使います。

# 手順
```zsh
$ brew upgrade ruby-build
$ ruby-build 2.3.0  `rbenv root`/versions/2.3.0-rails5-beta1
$ mkdir ~/rails5-beta1
$ cd !^
$ rbenv local 2.3.0-rails5-beta1
$ gem install bundler
$ gem search -a --prerelease ^rails$
$ gem install rails -v 5.0.0.beta1
$ rails -v
#=> Rails 5.0.0.beta1
$ rails new hello_rails5_beta1 --skip-test-unit --skip-turbolinks
$ cd !$
$ rails s -p 7777 -d
$ open http://localhost:7777
```

`~/rails5-beta1` に移動するとrbenvの力でRails 5.0 beta1専用のRuby環境に切り替わります。

# いらなくなったら
`rbenv uninstall 2.3.0-rails5-beta1`  で :ok_woman: 


# その他
`rbenv-alias`というプラグインで同じような事ができそうな気がしますが、これはシンボリックリンクを貼るだけなので実体は1つです。
主にマイナバージョンやパッチバージョンを意識したくないというニーズに応えるものなので、今回のケースにはマッチしないので注意してください。
Debianリリース毎のKernel/Pythonバージョンまとめ

Debian 5以上のリリース毎のLinuxカーネルバージョンと、
サポートしているPythonバージョンのまとめ。


# 一覧
Version|Code name|Kernel version|Supported Python version|Page
---|---|---|---|---
8.0|Jessie|3.16|2.7(default), 3.4|[DebianJessie - Debian Wiki](https://wiki.debian.org/DebianJessie)
7.0|Wheezy|3.2|2.7(default), 3.2|[DebianWheezy - Debian Wiki](https://wiki.debian.org/DebianWheezy)
6.0|Squeeze|2.6.32|2.5, 2.6(the default), 3.1|[DebianSqueeze - Debian Wiki](https://wiki.debian.org/DebianSqueeze)
5.0|Lenny|2.6.26|2.4 and 2.5(the default)|[DebianLenny - Debian Wiki](https://wiki.debian.org/DebianLenny)


# 参照元
- [DebianReleases - Debian Wiki](https://wiki.debian.org/DebianReleases)
- [Python - Debian Wiki](https://wiki.debian.org/Python)


# 備考
Python3がデフォルトになる流れになっているらしい。
[LinuxディストリビューションにおけるPython 3デフォルト化の流れ - orangain flavor](http://orangain.hatenablog.com/entry/python3-as-default)

>移行の具体的な日付やタイミングは見つかりませんでしたが、2020年にPython 2のメンテナンスが終了することもあり、次期メジャーリリースのDebian 9 (Stretch) またはDebian 10 (Buster) でPython 3をデフォルトにするべく取り組みが始まっているようです。
Dell Chromebook11にGalliumOSを入れる

chrxを使ったやり方の方が簡単なのでその方法で進める

1. デベロッパーモードにする
2. 普通にChromeOSを起動
3. 無線LANに接続してログインせずに`CTRL+ALT+F2`でターミナルを起動する
4. `chronos`ユーザー(パスワードなし)でログイン
5. `curl -O https://chrx.org/go && sh go -d galliumos`
6. 再起動がかかるので手順3に戻る
7. 2回目の再起動がかかったら`CTRL+L`でGalliumが起動する

ログイン画面は chrx/chrx でログインできるので後はご自由に！
Play 2.4.xでwarの作成


play 2.4.xでwarの作成したときのメモ

## 設定

APP_HOME/project/plugins.sbt

```scala
addSbtPlugin("com.github.play2war" % "play2-war-plugin" % "1.4-beta1")
```

APP_HOME/build.sbt

```scala
version := "1.0-SNAPSHOT"

import com.github.play2war.plugin._

Play2WarPlugin.play2WarSettings

Play2WarKeys.servletVersion := "3.1"
```

## ビルド

```bash
$ activator war
```

## 参考

https://github.com/play2war/play2-war-plugin/wiki/Configuration
【VMware】VMware vSphereにさわってみた


#基礎知識
[新卒 SE 社員が贈る　vSphere のキソ！第1回〜 vSphere を俯瞰する〜](https://blogs.vmware.com/jp-cim/2014/08/vsphere_kiso01.html)
がわかりやすい。

vSphere
ESXiとvCenterを含む仮想化ソフトウェアのスイートの総称


![20140813_vSphere1.jpg](https://qiita-image-store.s3.amazonaws.com/0/34560/2faa9ab0-a683-95ec-8f9f-3d37492d4ef5.jpeg)

※出展上記サイトのもの。

ハイパーバイザ型とよばれるハードウェア上に仮想環境、その上にゲストOSという形を取っている。各ハードウェアにインストールされるのがESXiと呼ばれるソフトウェア。

vCenterは司令塔みたいなもの。

共有ストレージに仮想マシンが保存されている。

ユーザはvSphere ClientまたはvSphere Web Clientで操作する。


#仮想OSを作ってみよう！
vSphereのインストールなどは完了済みで追加で仮想OSを作る話。

##インスタンス作りの巻
vSphere Clientを使ってやっていく。

①ESXホストで右クリックして「新規仮想マシン」選択
以下、構成：カスタムを選択した場合

②名前と場所

③ストレージ

④仮想マシンバージョン選択
最新のバージョン8を選択
→centの最新版を使いたいため

⑤ゲストOS

⑥CPU

⑦メモリ

⑧ネットワーク

⑨SCSIコントローラ
デフォ

⑩ディスク選択
新規仮想ディスクを作成

⑪ディスクの作成
プロビジョニング：Thin Provision
→使うたびにディスクを確保する設定

⑫詳細オプション
デフォ


##OSインストールの巻
①BIOS表示設定
→完全に自分の環境だけの話だけど、誰かがコブラというツールを入れてしまったためBIOS出す必要あるため。

仮想マシン右クリックして設定の編集。オプションタブの起動オプションをクリック。BIOSセットアップ画面に入るにチェックを入れる。

②インスタンス右クリックしてコンソールを開く。スタートボタンを押す。

③CDのマークをクリック。ローカルディスクのISOイメージにアクセスでISOイメージを選択。（事前にISOイメージを落としておく。）

あとは普通のインストールと一緒。

##VMware Toolのインストール
入れとくと何かと便利なツール。

①インスタンスを選択して、メニュー「イベントり」→「仮想マシン」→「ゲスト」→「VMwareToolのインストール/アップグレード」

③仮想のドライブにVMwareToolが入る。linuxの場合は/mediaにアーカイブがあるので、展開して実行する。perlが必要。

##ネットワークの設定の巻
通常のインストールと同様に行う。ゲストOSに設定すればOK。

linuxで静的なIPを設定する場合、「/etc/sysconfig/network-scripts/ifcfg-eth0」にIPアドレスとサブネットマスクとGateway設定しておけば良い。

```
DEVICE=eth0 #変更なし
BOOTPROTO=static #DHCP使わない
BROADCAST=192.168.1.255 #適宜変更
HWADDR=00:1E:90:AC:94:6A #変更なし
IPADDR=192.168.1.11 #適宜変更
NETMASK=255.255.255.0 #適宜変更
NETWORK=192.168.1.0 #適宜変更
ONBOOT=yes #起動時にネットワーク起動するか
```

windowsの場合、ファイアーウォールの無効とRDPの許可しないと、pingとリモートデスクトップできない。
Ansible の script module の挙動

# 言いたいこと：
script module のスクリプトを相対パスで指定するときは `roles/:name/files` の中にあると判断される

# Ansible 書くのが辛いから shell script 書いて ansible 内で実行してもいい？
って言われたもんでそういうモジュールあるかと思って調べたら script module ってのが[あった](http://docs.ansible.com/ansible/script_module.html)

使い方は

```yaml
- name: Run script
  script: /path/to/script.sh --with-args 1234
```

という感じで `script` のキーのあとに実行するスクリプトを指定するだけのシンプルなモジュールなのだけど、ドキュメントがすべて絶対パス前提になっている。

# 相対パスで指定した場合、どこにあるファイルが呼ばれるの？
ってことで確認。
次の Playbook を用意して `ping` という名前の role を用意。

```yaml:pingbook.yml
hosts: all
roles:
  - ping
```
rolesの内容は次のような感じ。

```yaml:roles/ping/tasks/main.yml
- name: Run script
  script: script.sh
  register: result
- debug:
    var: result
```

そしてどこで呼ばれるのかを試すためのディレクトリ構成は下のとおり。
あとスクリプトの中身も下にあるような感じで scripts, files, templates で末尾を変えてます。

```
takayuki@takayukioda:~/vagrant/sandbox$ tree roles/
roles/
└── ping
    ├── files
    │   └── script.sh
    ├── scripts
    │   └── script.sh
    ├── tasks
    │   └── main.yml
    └── templates
        └── script.sh

5 directories, 4 files

takayuki@takayukioda:~/vagrant/sandbox$ cat roles/ping/files/script.sh 
#!/bin/sh

pwd
echo "roles/ping/files"
```

ほいでもって実行結果はこちら。

```bash
takayuki@takayukioda:~/vagrant/sandbox$ ansible-playbook -i localhost pingbook.yml 

PLAY [Ping] ******************************************************************* 

GATHERING FACTS *************************************************************** 
ok: [localhost]

TASK: [ping | Run script] ***************************************************** 
changed: [localhost]

TASK: [ping | debug ] ********************************************************* 
ok: [localhost] => {
    "var": {
        "result": {
            "changed": true, 
            "invocation": {
                "module_args": "script.sh", 
                "module_complex_args": {}, 
                "module_name": "script"
            }, 
            "rc": 0, 
            "stderr": "", 
            "stdout": "/home/takayuki/vagrant/sandbox\nroles/ping/files\n", 
            "stdout_lines": [
                "/home/takayuki/vagrant/sandbox", 
                "roles/ping/files"
            ]
        }
    }
}

TASK: [ansible user] ********************************************************** 
ok: [localhost] => {
    "var": {
        "ansible_user_id": "takayuki"
    }
}

PLAY RECAP ******************************************************************** 
localhost                  : ok=4    changed=1    unreachable=0    failed=0   
```

ということで相対パスの際は `roles/:name/files` 直下のファイルが使われることが分かった。

ansible のドキュメントは基本丁寧なんだけど、たまに求めてるのがなくて辛い。
Arduino の 公式CLI で ビルド on OS X

## イントロ
Arduino IDE じゃなく Atom で Arduino 開発したい。

ひとまずTermainlからビルド、アップロードができればいいんだけど、
PlatformIOとかディレクトリ構造面倒だし、
そもそもサードパーティーのツール使いたくないな...

> _From version 1.5.0 arduino has its own official CLI_
(via http://playground.arduino.cc/Learning/CommandLine)

と思ったら公式が対応してたので、公式のCLIを使えるようにしました。

## Arduino公式のCLI使えるようにする手順
1. 最新 IDE 落としてきます。
2. `.bashrc` に落としてきたIDE内の"Arduino"のエイリアスを書く。  
（僕の場合は`/Applications/`フォルダに入れたのでこんな感じ。）  
```
alias arduino="/Applications/Arduino.app/Contents/MacOS/Arduino"
```
3. Finish  

こんな感じで使えます。

    $ arduino myskech/skech/skech.ino --verify // ビルドされる
    $ arduino myskech/skech/skech.ino --upload // アップロードされる

----
PlatformIO には Atomパッケージがあるので、
同様に公式CLIを使ったパッケージを作ってみたいぞ。
CentOS に ius リポジトリをさくっと追加する

CentOS に git をインストールするときには [ius](https://ius.io/) から入れているのですが、いつも、

```sh
yum install "http://dl.iuscommunity.org/pub/ius/stable/CentOS/7/x86_64/ius-release-1.0-14.ius.centos7.noarch.rpm"
```

みたいに糞長い URL を使っていました。

が、ここ（[https://ius.io/GettingStarted/](https://ius.io/GettingStarted/)）を見るに

```sh
yum install "https://centos7.iuscommunity.org/ius-release.rpm"
```

とかでいけるし、インストールスクリプトもありました。

```sh
curl -s https://setup.ius.io/ | bash
```

らくちん。
cloud-init の runcmd で firewalld を設定するときは firewall-offline-cmd を使う

cloud-init の runcmd で firewalld インストール＆設定するために user-data を次のように指定したところ、

```yaml
#cloud-config
runcmd:
  - yum -y install firewalld
  - systemctl enable firewalld
  - systemctl start firewalld
  - firewall-cmd --set-default-zone=trusted
  - firewall-cmd --zone=trusted --change-interface=eth0
  - firewall-cmd --zone=trusted --add-masquerade
  - firewall-cmd --runtime-to-permanent
```

`firewall-cmd` で次のようなエラーになりました。

```
ERROR:dbus.proxies:Introspect error on :1.7:/org/fedoraproject/FirewallD1: dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NoReply: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.
```

`firewall-offline-cmd` で設定を変更した後に firewalld を開始すれば大丈夫です。

```yaml
#cloud-config
runcmd:
  - yum -y install firewalld
  - firewall-offline-cmd --set-default-zone=trusted
  - firewall-offline-cmd --zone=trusted --change-interface=eth0
  - firewall-offline-cmd --zone=trusted --add-masquerade
  - systemctl enable firewalld
  - systemctl start firewalld
```

参考

- https://www.centos.org/forums/viewtopic.php?f=47&t=52162&p=220915
AngularJS の ng-if で one-time binding を使う時は必ず boolean になるようにしよう

みなさん [one-time binding](https://docs.angularjs.org/guide/expression#one-time-binding) 使ってますか？expression の値の変更がないとわかっている時に、初回以降 watch 対象から外してくれる便利なやつです。

さらに非同期にデータを取得するケース等を見越して、expression の評価結果が `undefined` の間は watch し続けて、データが入ってきたら watch 対象から外すという、かゆいところに手が届く仕様です。ところが、この仕様が仇になるケースに行き当たったので紹介します。

以下は何気ないテンプレートですね。`obj.prop` に値が入っていたら Something を表示するというものです。

```html
<div ng-if="::obj.prop">Something</div>
```

基本的には期待通りに動くのですが、非表示の時になぜか watch 対象のままになっているのです・・・。

そう！`undefined` の間は watch され続けるのでした。しっかり boolean に変換しましょう。

```html
<div ng-if="::!!obj.prop">Something</div>
```

ここに `::!!` という謎の記号が爆誕しました！Ruby の `&.` はぼっち演算子というそうですが `::!!` は何と呼んだら良いでしょうか・・・。
RHEL7/CentOS7でホスト名の変更

- 変更

```
# hostnamectl set-hostname (new_hostname) --static
```

- 確認

```
# hostnamectl status
```

### Cloud-Initの場合
- /etc/cloud/cloud.cfg の最下行に下記を追加

```bash:/etc/cloud/cloud.cfg
preserve_hostname: true
```
word2vecをTheano+Kerasで実装

gensimの
gensim.models.word2vec.Word2Vec
gensim.models.word2vec.Doc2Vec
の中のtrain関数のみをkeras+Theanoで実装しなおしてGPUでも動くようにした
[word2vec-keras-in-gensim](https://github.com/niitsuma/word2vec-keras-in-gensim)
train以外はgensimとまったく同じなので

```lang:python
import gensim.models.word2vec
from word2veckeras.word2veckeras import Word2VecKeras

vsk = Word2VecKeras(gensim.models.word2vec.LineSentence('test.txt'),iter=100)
print( vsk.most_similar('the', topn=5))
```
のような感じで使える．

インストールは

```lang:bash
pip install word2veckeras
```


本体ファイルは
word2veckeras.py
doc2veckeras.py
で，それぞれの

```lang:python
if __name__ == "__main__":
```

の下やdoctestに使用例が書いてある．


word2vecをkerasで実装した結果，簡単に改造できるようなった．例として追加情報の同時学習をする[改造](https://github.com/niitsuma/word2vec-keras-in-gensim/blob/master/word2veckeras/scoreword2veckeras.py)を置いている
Slackに分報を書きつつ他のチャットに気を取られない環境を作った

![image](https://qiita-image-store.s3.amazonaws.com/0/17353/8debda05-8cdd-0094-e035-418cfed8b375.png)

作ったというほど大層なもんでもないですが。

## 状況

分報を初めてもう結構経ちます。ゴムのアヒル効果とか、記憶の外出し→負荷軽減ができる効果とかもあって、とても気に入っています。
ただ、問題があって、気が散りやすい私は、Slackの画面を開いていると、他のチャンネルの新規発言があるとついつい気になって開いてしまいます。

## 解決策

Slackのwebページ上で、チャンネルを表示している部分のdivタグのidはcol_channelsです。このidのところだけ非表示にします。

ユーザースタイルシートを適用できる環境で（私はChromeで [Stylish](https://chrome.google.com/webstore/detail/stylish/fjnbnpbmkenffdnngjfgmeleoegfcffe) を使いました）、Slackの自分の分報ページのURLに対して以下のスタイルシートを適用します。

```css
#col_channels * {
    visibility: hidden !important;
}
```

アプリ版で実現する方法は見つけられませんでした。

1時間に1回くらいはアプリ版を開いて他のチャンネルの会話を確認してます。

## 課題

faviconが通知の有無とかで変わるのには対応してないので、そこがたまに気になったりします。
あと、@飛ばされた時にSlack閉じてるとスマホに通知が来ますが、↑の環境では開いている事になるので、通知が来なくて@飛ばされた事に気づくのが遅れたりします。それがどの程度許容されるかは状況によるでしょう。

## 終わりに

良い分報ライフを。
FuelPHPのIO時(DB, HTTPレスポンス, HTTPのPost)のデータ型について備忘録

FuelPHPでは(PHP全般？)IO時のデータ型の変換がかなり雑。なきがする。
はまったのでメモ。

DB: スキーマがintだろうが全部stringで返す
HTTPのPost(htmlのform): 全部string(AJAX通信のjson型で渡しても全てstringに変換される)
httpレスポンス(apiとか): 送信時のデータを保存
C# > Task.AsyncStateの動作を確認する

#背景
前回、[C# > Taskに引数を渡し復帰値を取得する](http://qiita.com/pec02304/items/770e59c937f517e5198d)でTaskについて学び、Task.AsyncStateの存在を知りました。
そこで今回はそのAsyncStateプロパティの動作について確認することにしました。
#ちょっと気になった点 その1
Taskをnewする時にTask<int>とかRun<int>とかStartNew<int>で書いたら、IDEから「もっとシンプルに書けるよ。&lt;int&gt;はいらないよ。」と言われました。確かに削除してもコンパイルは通りましたが、意味論的に同等なのかよく分かっておりません。
#ちょっと気になった点 その2
AsyncStateプロパティの型はobjectです。なので、中身を参照する時は元々の設定時の型にキャストしてやる必要があります。ジェネリックがある時代なのにキャストしなければならないという点がどうも腑に落ちません。stateの型はobjectだからAsyncStateプロパティの型もobjectなんですよね。Tにできない理由があるのでしょうか。T stateみたいな。
#サンプル
GitHub [TestTask](https://github.com/shimodateakira/TestTask.git)

```Program.cs:
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;

namespace TestTask
{
    class Program
    {
        static void Main(string[] args)
        {
            const int MaxCount = 10;
            int previous = -1;
            int current = 0;
            State state = new State() { Count = MaxCount, Current = 0 };

            // 呼び出し方法 その1
            // Taskのインスタンスを作ってからStartする。
            //
            //var task = new Task<int>(o => CountUpMethod((State)o), state);
            //task.Start();

            // 呼び出し方法 その2
            // Taskのインスタンスを作ってからRunするが、
            // stateはTaskのインスタンスに渡していない為、
            // task.AsyncStateがnullになり、NullReferenceExceptionが発生する。
            //
            //var task = Task.Run(() => CountUpMethod(state));

            // 呼び出し方法 その3
            // TaskのFactoryのStartNewでインスタンスの作成とスタートを同時に実行する。
            // また、stateをTaskのインスタンスに渡している(インスタンス内にstateが保存される) 
            var task = Task.Factory.StartNew(o => CountUpMethod((State)o), state);

            while (current < MaxCount)
            {
                current = ((State)task.AsyncState).Current;
                if(current != previous )
                {
                    Console.Write($"{current} ");
                    previous = current;
                }
#if DEBUG
                Debug.WriteLine($"{current}");
#endif
            }

            Console.WriteLine("\n\nPush any key!");
            Console.ReadKey();
        }

        static int CountUpMethod(State state)
        {
            int count = 0;

            for (int i = 0; i < state.Count; i++)
            {
                count++;
                state.Current = count;
                Thread.Sleep(1000); // 1秒
            }

            return count;
        }
        
    }

    class State
    {
        public int Current { get; set; }
        public int Count { get; set; }
    }
}
```
#実行結果
**コンソール**
0 1 2 3 4 5 6 7 8 9 10

Push any key!

**[出力]ウィンドウ**
1
1
1
(省略)
2
2
2
(省略)
9
9
9
(省略)
10
Mongodb 最短入門(1)EC2にインストール&起動&いきなり数万件入れてみた


#mongoDB のインストール　&起動　&バルクインサート

2行でやりたかったけど。。すでにある epel リポジトリ にもmongoあったけど、うまく動かんかったよ

~~yum install --enablerepo=epel mongodb-org~~


- ちゃんと公式のリポジトリ使ったほうがいいよ
- いろんな人の書いてるリポジトリはふるいから公式いってみたほうがいいよ。

インストールできても、実行するとエラーになるよ
`/usr/bin/mongod: symbol lookup error: /usr/bin/mongod: undefined symbol: _ZN7pcrecpp2RE4InitEPKcPKNS_10RE_OptionsE`

EC2だかららしい。 /lib64/libpcre.so.0.0.1 とか変えるつもりないから、リポジトリからいったほうがいいよ
http://stackoverflow.com/questions/20872774/epel-mongodb-will-not-start-on-ec2-amazon-ami


## おとなしく、リポジトリを追加から起動まで

今回はAmazon Linux用のページを参照した
https://docs.mongodb.org/manual/tutorial/install-mongodb-on-amazon/

※リポジトリのbaseurl で3.X 系　と 2.X 系を選ぶ。

### yum.repos.dの追加
> sudo vi /etc/yum.repos.d/mongodb.repo


```
[mongodb]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.2/x86_64/
gpgcheck=0
enabled=0
```
### インストール
> sudo yum install -y --enablerepo=mongodb mongodb-org

### サービス起動
> sudo service mongod start


はいはい、たちあがりました。

### コンソール起動
> mogo

## 試しに触ってみる

コマンドの公式Docmentはこちら

https://docs.mongodb.org/manual/reference/command/

### データ作る `honyarara にJSON形式のデータをいれる`

最初はtestというDBになっていて、use "dbname" で切り替えられる
おもむろになかったら作る系らしい。そういうの好きです。
honyarara がCollectionというデータセットの名前になるので好きなもので

```
db.honyarara.insert(
   {
     item: "test"
   }
)
```

### データ探してみる　`honyarara 全部ください`

```
db.honyarara.find()
```


入ってたね



### 探す　`item がtest って人ください`

```
db.honyarara.find("item":"test")
```
見つかった。

### 終了!
`quit()`


### バルクインサート
mongo はjavascript的な感じで
バルクインサートはこんなコマンド

```
db.collection.bulkWrite(
   [
      { insertOne : { "document" : { name : "sue", age : 26 } } },
      { insertOne : { "document" : { name : "joe", age : 24 } } },
      { insertOne : { "document" : { name : "ann", age : 25 } } },
      { insertOne : { "document" : { name : "bob", age : 27 } } },
      { updateMany: {
         "filter" : { age : { $gt : 25} },
         "update" : { $set : { "status" : "enrolled" } }
         }
      },
      { deleteMany : { "filter" : { "status" : { $exists : true } } } }
   ]
)
```

JSONでそんなことはやってられないので、CSVのgzipを解凍しながら、途中途中でいれながら数万件のレコードをいれてみる。

## python で　gz圧縮のテキストファイルを読み込みつつ1000件毎のバルクインサート

### pymongo というのを使うのでインストール

> pip install pymongo

### CSVファイルを読み込んで、mongodbに保存するスクリプトを実行

> python insert.py "filename.csv.gz"

おお!はや!600万件とかいれたけど順調

```py:insert.py
# coding: utf-8
import pymongo
import sys
import csv
import gzip
#Client取得
client=pymongo.MongoClient()
#database取得
db=client.test
#Collection取得
mongo=db.hoge

#ひとつめの引数がCSVファイルのパス
infiename=sys.argv[1]
#CSVファイルに入っている順番でカラム名のリスト
keynames=('name','age','gender')
#カウンタ　itemsのリストに追加しながら、指定件数に到達するとバルクインサート
i=0;
items=[]
#gzipを開けつつ―の
with gzip.open(infiename, 'r') as f:
#CSVを読みつつ―の delimiter の部分に区切り文字指定
    reader = csv.reader(f, delimiter=",")
    for row in reader:
#CSVの各行のデータにカラム名のキーをつけて辞書にして
        data=dict(zip(keys,row))
#リストに追加していく
        items.append(data)
        i=i+1
#1000件たまったら、フラッシュしてリセット
        if(i%1000==0):
            result=mongo.insert_many(items)
#入ったIDを返す
            #print result.inserted_ids
            items=[]
            i=0
#最後あまってたらいれる
if(i>0):
    mongo.insert_many(items)


```
(備忘録)自作モジュールのパスの通し方

Elcapitanをインストールして、いろいろ入れ直したので忘れないように。
#ゴール
自作ライブラリを以下のようにインポートすること。

```py
import hge
```
また、自作のモジュールを以下のように使用すること。

```py
$ etti.py
```


#検索パスを調べる
以下のようなスクリプトによって検索パスを調べる。

```py:test.py
import sys
A= sys.path
for i in A:
	print i
```


```py
$ python test.py 
/Users/XXXXX/Desktop
/Users/XXXXX/.pyenv/versions/2.7.10/lib/python27.zip
/Users/XXXXX/.pyenv/versions/2.7.10/lib/python2.7
/Users/XXXXX/.pyenv/versions/2.7.10/lib/python2.7/plat-darwin
/Users/XXXXX/.pyenv/versions/2.7.10/lib/python2.7/plat-mac
/Users/XXXXX/.pyenv/versions/2.7.10/lib/python2.7/plat-mac/lib-scriptpackages
/Users/XXXXX/.pyenv/versions/2.7.10/lib/python2.7/lib-tk
/Users/XXXXX/.pyenv/versions/2.7.10/lib/python2.7/lib-old
/Users/XXXXX/.pyenv/versions/2.7.10/lib/python2.7/lib-dynload
/Users/XXXXX/.pyenv/versions/2.7.10/lib/python2.7/site-packages
```

#パスを通す

調べたディレクトリのsite-packagesに`mymodules.pth`を追加。
内容は、自作モジュールを置いている場所（自分の場合は`~/.mymodules`）を表記する。

```mymodules.pth
~/.mymodules
```

また、`.bash_profile`に以下を追加。(うまく`etti.py`で使えなかったら、権限を確認する。)

```
export PATH=$PATH:/Users/XXXXX/.mymodules
```