OmniAICreator/Qiita-1.07M huggingface dataset:
PostgreSQL Download ( EnterpriseDB )

ダウンロード場所を覚えておけないので
http://www.enterprisedb.com/products-services-training/pgdownload

http://get.enterprisedb.com/postgresql/postgresql-9.4.0-1-windows.exe
http://get.enterprisedb.com/postgresql/postgresql-9.4.1-1-windows.exe
http://get.enterprisedb.com/postgresql/postgresql-9.4.2-1-windows.exe
http://get.enterprisedb.com/postgresql/postgresql-9.4.3-1-windows.exe
http://get.enterprisedb.com/postgresql/postgresql-9.4.4-1-windows.exe
http://get.enterprisedb.com/postgresql/postgresql-9.4.5-1-windows.exe

http://get.enterprisedb.com/postgresql/postgresql-9.4.4-3-windows-x64.exe
Data Science Toolboxのwarningを消す

「コマンドラインではじめるデータサイエンス」というオライリー本をよんだ。
この中で「[Data Science Toolbox](http://datasciencetoolbox.org/)」というUbuntuベースの仮想マシンが出てきて、これを使うように勧められる。
で、使ってみると、一部のコマンドでローカル設定に関するwarningが出てくる。

```bash
vagrant@data-science-toolbox:~$ perl -v
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = "en_US:",
	LC_ALL = (unset),
	LC_CTYPE = "ja_JP.UTF-8",
	LANG = "en_US.utf8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

This is perl 5, version 18, subversion 2 (v5.18.2) built for x86_64-linux-gnu-thread-multi
...

vagrant@data-science-toolbox:~$ man seq
man: can't set the locale; make sure $LC_* and $LANG are correct
```

動作自体は問題ないのだが、なんとなく気持ち悪いので[こちら](http://d.hatena.ne.jp/tkrd/20120828/1346123699)を参考に設定を追加して対応した。

```:.bashrc
export LC_ALL="en_US.UTF-8" # この行を追加
```

あとは`source .bashrc`すれば設定が反映されて先ほどのwarningが消える。
詳しくは上記リンクに書かれているが、どうもsshで仮想環境に入るとクライアント側の設定を引きずってしまうらしい。
Chromeでjsonのkeyを数字にしている場合、勝手に昇順にされる件。


筆者環境:MacOSX Yosemite, Google Chromeバージョン 46.0.2490.86 (64-bit)
表題通り、ありがた迷惑な機能。

これはV8 JavaScript EngineのECMAScript準拠でバグではない模様。
5年前くらい前から変わっていない。
firefoxでは降順ソートは維持され、問題ないことを確認。

		
##問題のIssue 37404 - chromium - Chrome reorders keys in the dictionary (object) http://bit.ly/1Qw0utr 



##例
こんな感じに成形して、keyを数字で降順ソートしたが、勝手にkeyで昇順にソートされる。

```json
{
	1444275582: {
		url: "https://instagram.com/p/8j9S8_r_BE/",
		img: "https://scontent.cdninstagram.com/hphotos-xap1/t51.2885-15/s640x640/sh0.08/e35/12120292_917670381655742_1569021259_n.jpg"
	},
	1444545530: {
		url: "https://instagram.com/p/8sALlWAfUJ/",
		img: "https://scontent.cdninstagram.com/hphotos-xtp1/t51.2885-15/e15/12106290_1294775143882158_1454631624_n.jpg"
	}
}
```


##対策
created_atのkeyだけで降順ソートでjson成形

```json
{
	{
		created_at: "1447984282",
		url: "https://instagram.com/p/-SfFKzy73D/",
		img: "https://scontent.cdninstagram.com/hphotos-xfp1/t51.2885-15/		s640x640/sh0.08/e35/12256594_516826635166064_1483786264_n.jpg"
	},
	{
		created_at: "1447984163",
		url: "https://instagram.com/p/-Se2neyurm/",
		img: "https://scontent.cdninstagram.com/hphotos-xfp1/t51.2885-15/e15/12230899_1538400876451449_364138165_n.jpg"
	}
}

```

##解決方法

###バックエンド側でjsonを吐き出す実装を変える（php）

```php
<?php

		 // APIから取得したデータを成形
        foreach($result["data"] as $k => $v){
            $insta_arr[$k]["created_at"] =  $v["created_time"];
            $insta_arr[$k]["url"] =  $v["link"];
            $insta_arr[$k]["img"] =  $v["images"]["standard_resolution"]["url"];            
            //いったんソートするキーを配列で取り出して、            
            $created_at_arr[$k] = $v["created_time"];
        }

        // keyで降順
        array_multisort($created_at_arr ,SORT_DESC,$insta_arr);
        echo json_encode($insta_arr);
        exit;
```

###js側でソート（lodash）
```javascript
	_.map(_.sortByOrder(insta_arr, ['created_at'], ['desc']), _.values);

```


##参考
Issue 37404 - chromium - Chrome reorders keys in the dictionary (object) http://bit.ly/1Qw0utr 

Issue 164 - v8 - Wrong order in Object properties interation - V8 JavaScript Engine
https://code.google.com/p/v8/issues/detail?id=164

Google Chromeでjsonオブジェクトを扱う際に、勝手にキーでソートされたよ
http://log.miraoto.com/2013/02/738/
ionic + Meteorにマテリアルデザインを導入できるか？


#### ionic + material
[vol.1](http://qiita.com/tacksman/items/00a3a49e47a0f6858e02)
[vol.2](http://qiita.com/tacksman/items/da101a3f10c81b2ea222)

### Materialデザインで作りたい

ここ数日、ionic + Meteorで作成した公式のチュートリアルアプリを対象にマテリアルデザインを導入するためのおいしいフレームワークを使えないか試してたので、それについて軽くまとめます。~~といってもまだふたつだけですが。~~

## 今まで使ったことのある || 使おうとしてたフレームワーク

###ionicMaterial

ionicにマテリアルデザインを導入しやすくするためのフレームワーク[^1]。
ionic単体になら、割りと簡単にマテリアルデザインを取り入れやすかったのでWebViewベースなモバイルアプリを作成する際にマテリアルデザインを導入するならすごくよさそうでした。

導入には`bower`コマンドを使用します。
`bower install ionic-material`でbower_componentsに追加され、Githubで紹介されている内容に従って準備すればOK

#### 問題点
ionic + Meteorな環境に導入してみようとしたが、`bower install`しただけの状態でアプリが動作しなくなりました。
ionic-materialはインストール時にionicやangularなど依存するものについても一緒にインストールを行っているらしく、そのあたりの部分がMeteorプラットフォームで用意したionicやangularの環境とぶつかっているのが原因のような気がします。

#### ちなみに
atmosphereに[jonmc12:ionic-material](https://atmospherejs.com/jonmc12/ionic-material)がmeteor addコマンドで取得できるパッケージとしてありますが、本家のzachsoftさんとは別の人がatmosphereに登録しているみたいです。
動作が確認できないというフラグが貼られていますので、こちらには触れないほうがいいかと思います(しかも参照できるGithubページがzachsoftさんのところだったりBug Reportの先もzachsoftさん)。

### Materialize

マテリアルデザインに基づいたフロントエンドフレームワークです[^2]。
導入方法もサードパーティ向けの方法もいくつかあり、その中にMeteorも入っています。
`npm install`や`bower install`も使用できるので個人的にうれしみがありました。

#### ionic + Meteor

前述で紹介しましたが、`meteor add materialize:materialize`コマンドでMeteorにMaterializeを導入できます。
あとはMaterialize公式のGetting Startedに従い、準備をするだけです。
チュートリアプリに簡単なボタンを追加し、インクエフェクトが出るところまで確認できました。

![スクリーンショット 2015-11-20 10.59.10.png](https://qiita-image-store.s3.amazonaws.com/0/66681/31628783-304f-5914-d36c-8b3b20fb1f73.png "スクリーンショット 2015-11-20 10.59.10.png")

#### 問題点
今回、ionic + MeteorのチュートリアプリにMaterializeを導入してみましたが、
画面底部にあるはずのタブが画面上部に移ってしまい、タイトルと被さってしまいました。
このタブはionicのion-tabを使用しているものだったので、ionic側のcssとMaterializeと相性よくないという可能性があります。

### まとめ
現在はionic-materialとMaterializeを試してみただけですが、現状ではMaterialize一択かなと思います(ionic-materialはionic + Meteor上で動作が確認できないし)。
ただ、Materializeもionicが関わる部分でレイアウトが崩れる可能性があるので、気をつけないといけないかなと思います。


[^1]: https://github.com/zachsoft/Ionic-Material
[^2]: http://materializecss.com/
自分がBracketsに載せてる拡張(メモ)


基本的にはこちらを参考にして入れてる。
Brackets おすすめエクステンション集・解説
http://qiita.com/assialiholic/items/c7962f804cdb21a49327#brackets-file-icons

## AsciiDoc Preview
Markdownよりリッチな文章マークアップ言語。
ページの構成に長ける為、これで同人誌を書こうか検討中。

AsciiDoc入門
http://qiita.com/xmeta@github/items/de667a8b8a0f982e123a

## Beautify
僕らの糞コードを見やすくする。

## Brackets CSS Class Code Hint
class, idを自動補完。

## Brackets Css Color Preview
行頭にカラーを表示してくれる。

## Brackets Editor Bookmarks
コードの中にブックマークを配置。しおり。

## Brackets File Icons
タブにアイコン表示

## Brackets Git
プロジェクトをgit管理。Windowsなら要git for windows(git bash)。黒い画面も出しやすい。

## Brackets Wordpress Hint
wordpress関数や定数を補完。

## ColorHints
css,htmdなどで、他で使用している色を補完。

## Console Plus
javascriptエラーなどを表示。デバッグに。

## CSSFier
cssコードにペーストされたHTMLコードを解析し、cssの雛形を作成。

## Emmet
htmlコードを短く書ける。個人的にはjadeよりも手軽で好き。

## Extentsions Rating
拡張機能でイケてるものを探す時に便利。

## Indent Guides
インデントを見やすくする。

## jQuinter
jQueryの関数を補完。jQueryガリガリ書く人向け。超使う。

## LESS AutoCompile
lessファイルをcssにしてくれる。

## Reload in Browser
ライブプレビューの更新をbrackets画面から。
js書いてる時に多用。

## SFtpUpload
bracketsからsftp(ftpも可)経由でファイルをアップロード。
プロジェクトごとにサーバーを変更できるので管理しやすい。

## Smarty Syntax Highlighting
Smartyテンプレート（.tpl）をハイライト表示。
emmetが有効にならないのが辛い……。
まだEC-CUBE2で消耗してる人は必須。

## Twig Syntax Highlighter
twigテンプレート（.twig）をハイライト表示。
EC-CUBE3にした人は必須。
Brackets Twigという拡張もあるけれど、こちらのほうが正確に出力してくれる。
あと、htmlファイルと認識しやすく、自動ハイライトにならないケースも多い。その場合は右下のファイルタイプをtwigに指定しよう。

## Tabs - Custom Working
タブ表示や分割表示が可能。

## 全角空白・スペース・タブ表示
タイトルまんま。日本人なら「Show Whitespace」よりコッチ。

# ついでに使用中のテーマ

## monokai Dark Soda
### font : '源ノ角ゴシック Code JP', ＭＳ ゴシック, 'MS Gothic', monospace
onlineTool > 時刻差を取得 > 11:14:33から11:17:13は何秒か? > Ke!san

bash、python、C#などでそれぞれプログラムを作ればいいのだが、色々な環境でパッと計算をしたい。
対象環境としては、iOS, android, CentOS, Windows, MacOSX.

結局、以下のサイト利用が最速であった。

[時間計算サイト](http://xn--kjvu88b4qkyhl.com/)

google検索で時刻差を計算できればいいのにと思った。

<hr>
(追記)

以下の方はリスト選択ではなく数値を直接入力できるので、キーボードが使える環境なら、さらに早い。

[Ke!san](http://keisan.casio.jp/exec/system/1356066502)
[SharePoint] ページビューアーWebパーツが動かない

# 問題 :dizzy_face: 

ページに「ページビューザー」Webパーツを追加し、URLを設定しているのに、まったく反映されないことがあります。

何度設定しても、画面はこのままで変わりません。

![pageviewr.JPG](https://qiita-image-store.s3.amazonaws.com/0/59475/b26bde9d-2877-26cc-620f-1b2ad651f1c6.jpeg)

> コンテンツにリンクするには、ツールウィンドウを開き、[リンク]テキストボックスにURLを入力します。

# 原因 :exclamation: :question: 

## (1) カスタムスクリプトの実行が許可されていない :question: 

Office365管理センターを開き、管理者カテゴリ内のSharePointを選択、設定をクリックすると下記の画面が出ます。

![sp-customscript.JPG](https://qiita-image-store.s3.amazonaws.com/0/59475/78ac144d-d2d5-71c4-bbe5-7c95e3074826.jpeg)

> カスタム スクリプト 
>
> 個人用サイトとセルフサービス作成サイトでユーザーがカスタム スクリプトを実行できるかどうかを制御します。注意: この設定に対する変更が有効になるまで最大 24 時間かかる場合があります。
>
> 詳細については、http://go.microsoft.com/fwlink/?LinkId=397546 を参照してください  

カスタムスクリプトを実行できるようにしてください。

## (2) 「ページの追加とカスタマイズ」権限がない :question: 

サイトの歯車アイコンからサイトの設定メニューを選択、ユーザと権限カテゴリにあるサイトの権限を開きます。

リボンのアクセス許可レベルをクリックします。

フルコントロールをクリックします。

![sp-pagecustomize.JPG](https://qiita-image-store.s3.amazonaws.com/0/59475/671d4981-7ae2-7029-a8e7-f82ee518e060.jpeg)

> ページの追加とカスタマイズ  -  HTML ページか Web パーツ ページを追加、変更、または削除し、Microsoft SharePoint Foundation 互換のエディターを使用して Web サイトを編集します。 

チェックがついていないければチェックをつけます。

該当ユーザにフルコントロール権限を付与します。
Linuxでグループ共有ディレクトリを作る


/var/www/htmlなどは、複数のメンバーで編集することになるので、通常、共有ディレクトリとして設定することになります。

###手順

まず、グループを作り、メンバーを追加します。

```bash
sudo groupadd webmaster
sudo gpasswd -a hoge webmaster
groups hoge
```

webmasterグループに共通ディレクトリを設定します。
ここでは、/var/www/htmlに設定してみます。

まず、グループをwebmasterに変更します。
さらに、グループに対する書き込み権限を与えます。
-Rをつけることで再帰的に実行できます。

```bash
sudo chgrp -R webmaster /var/www/html
sudo chmod -R g+w /var/www/html
```

この状態でも、ファイルの変更等がなければ問題ありませんが、新規で作成したディレクトリやファイルは作成したユーザーのグループが振られてしまいます。
そこで、sgid権限を付与し、グループがファイルに引き継がれるようにします。

```bash
sudo chmod g+s /var/www/html
```
これで、/var/www/html以下に新規にディレクトリやファイルを作成すると、グループがwebmasterとなり、誰もがR/Wできる状態となります。

>なお、sの意味はファイルとディレクトリでは異なりますので注意が必要です。

###注意点

共有ディレクトリを新規に作成する場合は問題ありませんが、既存のディレクトリ等にはsオプションは引き継がれません。必要に応じて設定する必要があります。

なお、sオプションはフィルとディレクトリでは意味が違うので、

```bash
chmod -R g+s /var/www/html
```
とすると予期せぬ動作になる可能性があるので注意しましょう。

その場合は、

```bash
find . -type d -print | xargs chmod g+s
```
とすればよいでしょう。

find . -type d -printは、カレントディレクトリの以下にあるディレクトリを再帰的に表示します。xargsは標準入力で受けとった内容を、コマンドの引数として渡すという機能があります。
security > パスワード > チャレンジ文字列 > 復号する時がわからない

**(追記 2017/08/30): 「復号化」から「復号」に訂正しました。**

http://qiita.com/yuba/items/9d2717211ed299d00743
> パスワードを平文で流したくないだけならチャレンジ文字列加えてハッシュ化するという手順で十分なんですもの…。

キーワード「チャレンジ文字列」というのを初めて知った。勉強になった。


[e-words](http://e-words.jp/w/%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8-%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E8%AA%8D%E8%A8%BC.html)

> チャレンジ/レスポンス方式では、まず認証を受けたいクライアントが認証要求をサーバに送り、サーバはそれに対しランダムな数値列（「チャレンジ」と呼ばれる）を返信する。

`ランダムな数値`とあるが、復号する時に相手側はチャレンジ文字列を必要とするのではないだろうか？

チャレンジ文字列も一緒に送るわけにもいかないだろうが。

よくわからない。
【AWS】Lambdaでpipしたいと思ったときにすべきこと

# はじめに
　Lambda関数を Python で書いていると、Lambda関数内でサードパーティのライブラリを使いたくなるときがあります。しかし、Lambda では pip を使ってライブラリをインストールすることはできません。今回はそんな状況で役に立つ方法を紹介します。

　具体的には Lambda に用意されているファイルアップロード機能を使います。つまりファイルをアップロードするときにサードパーティのライブラリをアップロードすることで、Lambda関数内からライブラリを使えるようにします。

今回は Python の HTTPライブラリである requestsを使ってみようと思います。

# 関連記事
　Lambda関数の基本的な作成方法は以下の記事を参考にしてください。

* [AWSのAPI GatewayとLambdaを使ってRest APIを書いてみた](http://qiita.com/Hironsan/items/de5dcd42e1c6f6a9b5c7)

# 手順
1. ローカルで作業用ディレクトリを作成する
2. ライブラリをインストールする
3. 作業用ディレクトリ内で Lambda関数を書く
4. Zip で圧縮する
5. 圧縮したファイルをアップロードする
6. 使用する関数の設定

## 作業用ディレクトリの作成
　まずは作業用ディレクトリを作成します。名前は workspace とでもしておきましょう。ディレクトリを作成したら、その中に移動します。

```shell-session
$ mkdir workspace
$ cd workspace
```

## ライブラリのインストール
　workspace の中に移動したら、pip を使用してライブラリをインストールします。以下のようにします。

```shell-session
$ pip install requests -t .
```
tオプションをつけることで、ライブラリのインストール場所を指定することができます。今回はカレントディレクトリ（workspace）にインストールしています。

## Lambda関数の作成
 ライブラリをインストールしたら、次は Lambda関数を書きます。ファイル名は **lambda_function.py**、関数名は **lambda_handler** としておきます。ファイル名と関数名は後で使用するので覚えておきます。

```py:lambda_function.py
import requests

def lambda_handler(event, context):
    res = requests.get("http://www.yahoo.co.jp/")
    return res.status_code
```

コードは上記のようになります。内容はYahooのトップページをGETしてステータスコードを返すという簡単なものです。ページを正常に取得できればステータスコードとして200番が返ります。

```py
>>> from lambda_function import lambda_handler
>>> lambda_handler(None, None)
200
>>> 
```

## Zipで圧縮
　zip コマンドを使って workspace 内のすべてのファイルを圧縮します。圧縮するファイル名は**upload.zip**とでもしておきます。

```shell-session
$ zip -r upload.zip *
```

## ファイルのアップロード
　zip コマンドで圧縮したら圧縮したファイルを Lambda にアップロードします。関数の設定画面中の 「Lambda function code」 という項目に、「Code entry type」があります。デフォルトでは「Edit code inline」となっていますが、ここを「Upload a .ZIP file」を選択します。選択すると「Upload」ボタンが現れるので、先ほど作成したファイル（upload.zip）をアップロードします。
<img width="935" alt="スクリーンショット 2015-11-20 10.44.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/77079/86d58ab9-318b-1034-7862-ca70d6c8c487.png">

## 使用する関数の設定
　ファイルのアップロードが終了したら、**Handler**に使用する関数を設定します。関数は「ファイル名.関数名」という形式で指定することができます。先ほど作成した Lambda関数のファイル名は、**lambda_function**、関数名は**lambda_handler**であったので「lambda_function.lambda_handler」と指定します。
<img width="915" alt="スクリーンショット 2015-11-20 10.51.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/77079/3c729d93-8c6e-6a4c-c634-a33848b516a7.png">

以上で設定は完了です。「Next」ボタン、「Create function」ボタンを選択して関数を作成してください。

# テスト
　テスト画面からテストをしてみてください。ステータスコードが返ってきていれば成功です。お疲れさまでした。
<img width="439" alt="スクリーンショット 2015-11-20 10.57.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/77079/6df5a94e-1c4a-1550-c0b8-6e9cb415a9aa.png">

# 参考
* [Lambdaのドキュメント](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html)
* [pipのオプション](http://pip.readthedocs.org/en/stable/reference/pip_install/#options)
kSar使用時の注意点(日本語FILEについて)

sarファイルを日本語の状態で出力してしまうと
kSarでグラフ化するときにerrorになる

#### 対応策
時->: 分->: 秒-> 平均値->Average
日付->MM/DD/YY

* command
	* s/時/:/g
	* s/分/:/g
	* s/秒//g
	* s/平均値/Average/g
	* 日付->MM/DD/YY
シグナルの一覧


シグナルの一覧は以下で出力できる

```
$ kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX
```

以下で説明が読める

```
$ man 7 signal
```

ファイル定義は以下

```
/usr/include/?/bits/signum.h
```
Windows8で突然vagrantが起動できなくなったら下記コマンドで解決

# Windows8で突然vagrantが起動できなくなったら下記コマンドで解決

vagrant upしてエラーとなり、vagrantが突然起動しなくなりました。

## エラーメッセージ
WinVerifyTrust failed on stub executable: WinVerifyTrust failed with hrc=Unknown Status 0x8009200D on '￥Device￥HarddiskVolume4￥programFiles￥Oracle￥Virtualbox￥virtualbox.exe' (rc=-22919)

##解決方法
コマンドプロンプトで
wusa /uninstall /kb:3081320

参考リンク
http://superuser.com/questions/1001187/error-winverifytrust-failed-with-hrc-unknown-status-when-launching-a-guest-mac
UILabelの省略記号が上下中央揃えになってしまう

# Problem

UILabelの省略記号が以下のように上下中央揃えになってしまう。

![スクリーンショット 2015-11-20 10.10.27.png](https://qiita-image-store.s3.amazonaws.com/0/9875/15673f44-dd8c-79e6-64af-319be01da20c.png)

これを普通の下揃えにしたい。

# Solution

上下中央揃えになる原因は、UILabelのAttribute Inspectorの設定で「Lines」を「0」にしていたことだった。
下揃えにするには、Linesに1以上の数値を入れれば良い。

![スクリーンショット 2015-11-20 10.10.32.png](https://qiita-image-store.s3.amazonaws.com/0/9875/5b53aa61-dfe2-b9b0-b6c0-7a28078ddb4c.png)
Ansible 2.0 RCX  is available for testing!

```
The tar.gz of the release can be found here:

http://releases.ansible.com/ansible/ansible-2.0.0-0.6.rc1.tar.gz
SHA256: 6d45c6ed5c36e92e3fce32f971bd6e2c58a4d5cf892b2af5dd9fa6874fc4ee6c

You can also test against the git repository as follows:

$ git clone https://github.com/ansible/ansible.git
$ cd ansible
$ git checkout v2.0.0-0.6.rc1
$ git submodule update --init

You can then source our testing script:

$ . hacking/env-setup

or you can build your own .tar.gz (output will be dist/ansible-2.0.0.tar.gz):

$ make sdist
```

```shell-session
$ git clone https://github.com/ansible/ansible.git
$ cd ansible
$ git checkout v2.0.0-0.7.rc2
$ git submodule update --init

You can then source our testing script:

$ . hacking/env-setup

or you can build your own .tar.gz (output will be dist/ansible-2.0.0.tar.gz):

$ make sdist
```
Jsonのシリアライズ、デシリアライズ

#はじめに
いまさらながらJsonを使うことになり、標準のJsonで使い方を調べエクステンションを使ったサンプルを作成した。

#サンプルコード

```csharp:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading.Tasks;

namespace JsonSample
{
    [DataContract]
    public class FriendInfo
    {
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public string Address { get; set; }
        [DataMember]
        public int Age { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var friends = new FriendInfo[]{
                new FriendInfo()
                {
                    Name = "Name1",
                    Address = "Hokkaido 1",
                    Age = 12
                },
                new FriendInfo()
                {
                    Name = "Name2",
                    Address = "Hokkaido 2",
                    Age = 13
                },
            };

            // シリアライズ
            var json = friends.ToJson();
            Console.WriteLine(json);
            // デシリアライズ
            // 無駄なオブジェクトが発生する拡張メソッドの例
            var defrie = new List<FriendInfo>().FromJson(json);

            // chocolamintさんの指摘を参考にstringのエクステンションに
            foreach (var info in json.DeserializingJson<List<FriendInfo>>())
                Console.WriteLine("Name:{0} Adress:{1} Age:{2}", info.Name, info.Address, info.Age);

            Console.ReadLine();
        }
    }
}

```

```csharp:ClassExtention.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

namespace JsonSample
{
    public static class ClassExtension
    {
        public static string ToJson<T>(this T obj) where T : class
        {
            var serializer = new DataContractJsonSerializer(typeof(T));

            using (var stream = new MemoryStream())
            {
                serializer.WriteObject(stream, obj);
                return Encoding.UTF8.GetString(stream.ToArray());
            }

        }

        public static T FromJson<T>(this T obj, string json) where T : class
        {
            using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json)))
            {
                var serializer = new DataContractJsonSerializer(typeof(T));
                return serializer.ReadObject(stream) as T;
            }
        }
    }
}

```

```csharp:StringExtention.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

namespace JsonSample
{
    public static class StringExtension
    {
        public static T DeserializingJson<T>(this string obj)
        {
            using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(obj)))
            {
                var serializer = new DataContractJsonSerializer(typeof(T));
                return (T)serializer.ReadObject(stream);
            }
        }
    }
}

```
testing/ editor > 桁数の見方の違い > Sublime Text / 秀丸 / C++Builder IDE / vi / メモ帳 > 数値の左側にカーソルを合わせる

シーケンス動作のテスト中、以下のデバッグ出力を得たとする。

```
0000000000100000000020000000000000000000000000000000000000003000000000000000000000000000000000000000 
```

1,2,3になっている位置は何番目か知りたい。

- Sublime Text : 数字の左側にカーソルを合わせる
- 秀丸 : 行番号表示にして、数字の左側にカーソルを合わせる
- C++ Builder IDE : 数字の左側にカーソルを合わせる
- vi : カーソルが数字にかぶっている (左右の概念がない)
- メモ帳 : 数字の左側にカーソルを合わせる

何かで数字の右側にカーソルを合わせて読み取ったことがあったような気がするが気のせいだった。
CentOS6.xでのOpenSSHの脆弱性について(2015年11月時点)

openvasでCentOS6.4の脆弱性診断をやったら、以下の二つがリスクのスコアがでてきたので、調べてみたまとめ。

*  OpenSSH Multiple Vulnerabilities
*  OpenSSH Security Bypass Vulnerability

いずれも、OpenSSHのバージョンを7.0以上では対応済みの模様。
CentOS 6.x系のバージョンは、5.3が現時点では最新。

対応済みかは[RedHatのsecurity-advisories](https://access.redhat.com/security/security-updates/#/security-advisories)で該当のCVEの対応状況をみるか、パッチのバージョンで判断する(`rpm -q --changelog openssh`を実行)。

# OpenSSH Multiple Vulnerabilities 

関係するCVEはつぎの三つ

1. [CVE-2015-6564](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-6564)
2. [CVE-2015-6563](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-6563)
3. [CVE-2015-5600](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-5600)


## CVE-2015-6564
ローカルユーザが、権限を取得できる
http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-004460.html

https://bugzilla.redhat.com/show_bug.cgi?id=1252852



## CVE-2015-6563
ローカルユーザが、他のユーザになりすまして攻撃できる
http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-004403.html

https://bugzilla.redhat.com/show_bug.cgi?id=1252844

## CVE-2015-5600
パスワード認証が有効なSSHサーバにおいて、keyboard interactive認証の処理に欠陥があり、ログイン試行の制限時間内で任意の数の認証要求を送信することができるというもの。総当たり攻撃を実行、またはサービス運用妨害の状態にされる。
http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-003969.html
https://access.redhat.com/security/cve/cve-2015-5600

パスワード認証ありでも、sshd_configの修正で対応可能。
https://www.softbanktech.jp/information/2015/20150804-01/

# OpenSSH Security Bypass Vulnerability

関係するCVEのつぎのもの

[CVE-2015-5352](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2015-5352)

ForwardX11Trusted モードが使用されていない場合、アクセス制限を回避される
http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-003968.html
https://access.redhat.com/security/cve/cve-2015-5352

## 参考サイト

[JVNの脆弱性レポートの読み方](https://jvn.jp/nav/jvnhelp.html)

https://www.ipa.go.jp/security/vuln/CVSS.html
Bashプロンプトの変更


サーバを複数台管理していると、どこにログインしているかわからなくなります。

プロンプトには通常ホスト名が表示されるようになっていますが、クラウド環境などだと、自動的にアサインされた覚えにくい名前になっていたりするので、分かりやすい名前に変更したい場合があります。

###環境

私はMacとLinux（CentOS）を使うことがほとんどなのでbashにします。
bash以外だと方法が違うので、適宜調べて下さい。

###今の状態の確認

プロンプトの表示フォーマットはbashでは、PS1という環境変数に入っていますので、その形式を表示してみます。

```bash
echo "$PS1"
[\u@\h \W]\$
```
環境によっても違いますが、多くの場合、上記の様になっています。
意味は、

* \u : ユーザー名
* \h : ホスト名
* \W : 今いるディレクトリ名
* \\$ : 一般ユーザーの時$,rootの時#を表示

というものです。@等は、普通に表示されます。
上記の場合、

```bash
[hoge@hostname ~]$
```
という感じで表示されます。
ローカル環境で、OSのhostname等を自由に変更できる場合などはいいのですが、クラウド環境や変更できない場合は静的に変更してやります。と入っても、ハードコーディングするだけなので、難しくありません。

###変更する

まず、変更したいのは、基本ホスト名だけです。あと、今いるディレクトリをフルパスで表示するようにしてみます。ここで、ホスト名をTEST_SERVERとしたいとします。

やりたい形式

```bash
[hoge@TEST_SERVER /var/www/html]$
```
表示のためのフォーマット

```bash
[\u@TEST_SERVER \w]$
```

最終的には.bashrcに設定を記述すればいいのですが、まずは一時的に試してみます。

```bash
export PS1="[\u@TEST_SERVER \w]$"
```
とすると瞬時にかわります。パターンが気に入らない場合は、いろいろといじってみるといいでしょう。

ただ、この場合、コンソールを閉じて、新しいコンソールを開くと、デフォルトの状態に戻ります。永続化したい場合は、上記の記述を.bashrcに記述します。

```bash
vi .bashrc
```
記述が終わったら、

```bash
source .bashrc
```
を実行し、値を反映させます。

なお、色も変えることができます。
色の指定は\[\e[色指定m\]というフォーマットで行います。

host名を別の色にして強調したい場合などは、

```bash
export PS1="[\u@\[\e[1;33m\]TEST_SERVER \[\e[m\]\w]$"
```

などとします。この場合、host名が黄色になります。
色は、指定した箇所から以下の以降の文字列全てに適用されるので、\[e[m\]（色指定無し）でリセットします。

色コードは、

```bash
    m   指定なし
0;30m   Black
0;31m   Red
0;32m   Green
0;33m   Yellow
0;34m   Blue
0;35m   Purple
0;36m   Cyan
0;37m   White
```
という感じです。

どの色にしても、ケバケバしいので、強調は白を使えばいいでしょう。

```bash
export PS1="[\u@\[\e[1;37m\]TEST_SERVER \[\e[m\]\w]$"
```

###参考

http://linuxconfig.org/bash-prompt-basics

##おまけ

###プロンプトに絵文字を入れる

まず、絵文字が表示されるかどうかチェック。

```bash
echo -e '\U1F439'
```

表示できるようなら、下記のようにする。
``で囲むことで変数内でコマンドの実行が可能なります。あとは、\hなどと組み合わせます。

```bash
export PS1=`echo -e '\U1F439 '`" \h:\W $ "
```

Macでは、絵文字はcontrol + command + spaceで表示できるので、好きな絵文字を右クリックして、ユニコードを取得し変更します。
形式はU+xxxxの形式になっているので、\Uxxxxxと直してあげます。以上。
VirtualBoxのRDP機能が便利

## 参考

* [VirtualBox上のLinuxゲストマシンにリモートデスクトップ接続する - Qiita](http://qiita.com/mashumashu/items/b3c8f1e9ee0f9231dd76)

## 既知の問題

* MS社のiOS用RDPクライアントから文字の入力ができない。
    * [Fix keyboard issue when using VirtualBox, Pidgin, and other VM software – Customer Feedback for Microsoft Remote Desktop](https://remotedesktop.uservoice.com/forums/265183-remote-desktop-for-ios/suggestions/8780344-fix-keyboard-issue-when-using-virtualbox-pidgin)
    * [IOS RDP keyboard to VM guest](https://social.technet.microsoft.com/Forums/windowsserver/en-US/b5c3a1ce-fd21-4813-9a93-e02c5133093e/ios-rdp-keyboard-to-vm-guest?forum=winRDc)
* [iRDP](https://itunes.apple.com/jp/app/irdp/id464560206?mt=8)からは文字の入力ができた。


## 設定

![rdp.png](https://qiita-image-store.s3.amazonaws.com/0/25728/bc6fb219-8dc4-f8ea-3316-48e0d36ab33a.png)

## 接続

```bash:接続
rdesktop localhost
```

```bash:接続
xfreerdp /v:localhost:3389
```

* 日本語入力問題なし。
* windowsキーも通る。
* 解像度変更も可能


## stoneを使って他のPCからも接続

```bash:33389でlisten
stone localhost:3389 33389
```

```bash:
rdesktop localhost:33389
```
[Unity] Oculus Utilitiesに含まれているOVRScreenFade（フェード）が面白かったのでメモ


通常のゲームであればPost Effectでフェードイン・アウトを実現すれば比較的簡単に実装できると思う。
が、[以前の記事](http://qiita.com/edo_m18/items/b0670b0274742fa1714e)で書いた方法をVRで試すとうまく行かなかった。
（使っているCardboard SDKとの相性の問題もあるかも。（おそらく）歪みをPostEffectで処理しているせいだと思ってる）

で、Oculusではそのあたりどうしているのかというと、どうやら画面全体を覆う板ポリを描いてそれを徐々に黒くする（あるいは黒から透明にする）という方法で実現しているみたい。（板ポリはあくまで概念で実際にはピクセルシェーダを操作しているんだと思うけど）

## C#コード

Utilityに含まれているCSコードは以下のようになっている。

```cs
using UnityEngine;
using System.Collections;

public class OVRScreenFade : MonoBehaviour {

	public float fadeTime = 2.0f;
	public Color fadeColor = new Color(0.01f, 0.01f, 0.01f, 1.0f);

	private Material fadeMaterial = null;
	private bool isFading = false;
	private YieldInstruction fadeInstruction = new WaitForEndOfFrame();

	void Awake() {
		fadeMaterial = new Material(Shader.Find("Oculus/Unlit Transparent Color"));
	}

	void OnEnable() {
		StartCoroutine(FadeIn());
	}

	void OnLevelWasLoaded(int level) {
		StartCoroutine(FadeIn());
	}

	void OnDestroy() {
		if (fadeMaterial != null) {
			Destroy(fadeMaterial);
		}
	}

	IEnumerator FadeIn() {
		float elapsedTime = 0.0f;
		fadeMaterial.color = fadeColor;
		Color color = fadeColor;
		isFading = true;
		while (elapsedTime < fadeTime) {
			yield return fadeInstruction;
			elapsedTime += Time.deltaTime;
			color.a = 1.0f - Mathf.Clamp01(elapsedTime / fadeTime);
			fadeMaterial.color = color;
		}
		isFading = false;
	}

	void OnPostRender() {
		if (isFading) {
			fadeMaterial.SetPass(0);
			GL.PushMatrix();
			GL.LoadOrtho();
			GL.Color(fadeMaterial.color);
			GL.Begin(GL.QUADS);
			GL.Vertex3(0f, 0f, -12f);
			GL.Vertex3(0f, 1f, -12f);
			GL.Vertex3(1f, 1f, -12f);
			GL.Vertex3(1f, 0f, -12f);
			GL.End();
			GL.PopMatrix();
		}
	}
}
```

やっていることはシンプルで、このスクリプトが読み込まれたタイミングで処理が始まり、毎フレームごとに `FadeIn` メソッドが呼ばれるようにしている。
そしてその処理の中で徐々にマテリアルの色を透明にしていく（＝フェードイン）という流れだ。

`OnPostRender` メソッド内の `GL` クラスがなんなのかまだ調べてないけど、シェーダに対する処理なのは間違いない。で、内容的には Z値だけ若干カメラの奥方向に移動した四角形を描いてそれをシェーダに送っているのだと思う。

[GL - Unity - Scripting API](http://docs.unity3d.com/ScriptReference/GL.html)


### シェーダコード

シェーダのコードは驚くほどシンプル。
Z値に対する書き込みをオフにし、普通の透過処理に必要なブレンドモードにした上で、あとは色を設定しているのみ。
`Pass` になにも書かれていないのはC#のコード側で `SetPass` されるためと思う。

```ShaderLab
Shader "Oculus/Unlit Transparent Color" {
	Properties {
		_Color ("Color", Color) = (1,1,1,1)
	}
	SubShader {
		Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Opaque" }
		LOD 100

		ZWrite Off
		Blend SrcAlpha OneMinusSrcAlpha
		Color [_Color]

		Pass { }
	} 
}
```

以上、Oculus  Utilitiesに含まれているフェードの仕組みでした。
こうした既存のものを参考にするのはとても勉強になるなぁ。
Macでhomebrew＆gemがトラブった時の対処例。

**以下、あくまで、こうしたら治ったという一例。修復インストール等の結果は自己責任で^^;**
#1. トラブルの概要

自宅Macで、SwiftのXML/HTML parserライブラリを試そうと思いたち、
まずは、cocoapodsからインストールしようとすると...

```
$ gem install cocoapods
sudo gem install cocoapods

ERROR: While executing gem ... (Errno::EPERM)
Operation not permitted - /usr/bin/{存在しないバイナリ名}
```

とのエラーが出る。
*#私のところでは、{存在しないバイナリ名}=fuzzy_match*

ならば、と、rbenvを入れようとすると、こちらもダメ:

```
$ brew upgrade rbenv ruby-build
Error: No such file or directory - /usr/local/Cellar/rbenv
Apple-no-MacBook-Air:local Apple$ brew install rbenv ruby-build
==> Installing dependencies for rbenv: ruby-build
==> Installing rbenv dependency: ruby-build
==> Downloading https://github.com/sstephenson/ruby-build/archive/v20151028.tar.gz
Already downloaded: /Library/Caches/Homebrew/ruby-build-20151028.tar.gz
==> ./install.sh
Error: parent directory is world writable but not sticky
Please report this bug:
    https://git.io/brew-troubleshooting
```
brewはrubyベース。ruby環境がおかしげなとき、brewでrbenvが入らない問題は解決できなそう...
roboVM関係とか、出たばかりの開発ツールたちをいろいろいれたことが元凶か...

#2. 対処
##a) Mac OSを修復インストール => brew復活

やったことはなかったのだが、普段から概ねのファイルはdropbox内なので、
その他のファイルのバックアップをとった後、
以下に従い、修復インストールする。
http://gori.me/mac/mac-tips/79032

[結果]一晩放置することとなったが、元の環境は保持されたまま、brewが治った。

```
$ brew install rbenv ruby-build
==> Installing dependencies for rbenv: ruby-build
==> Installing rbenv dependency: ruby-build
==> Downloading https://github.com/sstephenson/ruby-build/archive/v20151028.tar.gz
==> Downloading from https://codeload.github.com/sstephenson/ruby-build/tar.gz/v20151028
######################################################################## 100.0%
==> ./install.sh
🍺  /usr/local/Cellar/ruby-build/20151028: 173 files, 732K, built in 8 seconds
==> Installing rbenv
==> Downloading https://github.com/sstephenson/rbenv/archive/v0.4.0.tar.gz
==> Downloading from https://codeload.github.com/sstephenson/rbenv/tar.gz/v0.4.0
######################################################################## 100.0%
==> Caveats
To use Homebrew's directories rather than ~/.rbenv add to your profile:
  export RBENV_ROOT=/usr/local/var/rbenv

To enable shims and autocompletion add to your profile:
  if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi
==> Summary
🍺  /usr/local/Cellar/rbenv/0.4.0: 31 files, 152K, built in 7 seconds

```

### 参考 : Mac売却の際等のクリーンインストール方法は以下:
http://itea40.jp/technic/mac-maintenance/yosemite-initialization/

##b)　gemの管理対象先の変更

Xcodeインストールでgemのトラブルに見舞われる人もそこそこいるらしく、
以下で同様の議論が行われていた。
https://github.com/CocoaPods/CocoaPods/issues/3692

対処を実施:

```
$ mkdir -p $HOME/Software/ruby
$ export GEM_HOME=$HOME/Software/ruby
$ gem install cocoapods
Fetching: fuzzy_match-2.0.4.gem (100%)
Successfully installed fuzzy_match-2.0.4
Fetching: cocoapods-core-0.39.0.gem (100%)
Successfully installed cocoapods-core-0.39.0
(略)
15 gems installed
Apple-no-MacBook-Air:~ Apple$ export PATH=$PATH:$HOME/Software/ruby/bin
Apple-no-MacBook-Air:~ Apple$ pod --version
0.39.0
```

こちらの対処は一瞬だね。
以上で、対処、完了。
電子工作 > GPS > シリアル・ポート接続GPSの多くはDSUB9の４PINに＋５Vを供給する事で動作します。

USBシリアルケーブルにGPSを接続する際の工作を以下で見つけた。

http://blade8873.blogspot.jp/2015/03/win8pcgps.html
> シリアル・ポート接続GPSの多くはDSUB9の４PINに＋５Vを供給する事で動作します。

こういう工作は配線をあやまるとPCを壊しかねないので、注意。
技術英語 > I'll try. > Make sure you do. / I'm not asking you. I'm ordering you.

@ Star Trek Voyager > PROJECTIONS

ホログラムであるドクターが艦内を自由に歩き回れるように小型のプロジェクター装置をつけて行動しはじめる時に、注意事項を言うトレスとそれに呼応するドクターとのやりとり

トレス 「Try to stay away from energy discharge, phaser fire, force fields, that sort of thing.」
ドクター 「I'll try.」
トレス 「<font color=red>Make sure you do.</font>」

<hr>
関連して思い出したのは

Star Trek Deep Space Nineにて艦長が部下に対して言った言葉。どのエピソードかは忘れた。

> I'm not asking you. I'm ordering you.

訳すとすると「依頼をしているのではない。命令しているのだ」
Rails4 + Refinery CMSで友人のBlogサイトを作る

開発者目線でCMS選定しています。
ユーザーの要望を楽に満たせて、かつ開発しやすいものを選んでいると思います。

# なぜCMSでRailsか？
* wordpressは嫌
* メンテナンスしやすい
* Paasで安く手軽に運用したい
* HTMLを書きたくない Slimがいい
* 処理量が多くないので、Railsでも遅くならないはず
* デザインは自分で頑張りたい

　wordpressはPHPの特性のためか、HTMLと処理が同じソース内に存在します。 昨今MVCと口うるさく言われている開発者としては非常に気持ちが悪いです。またwordpress独自の実装方法を覚えないといけないのが最悪です。
　wordpressの良い点は非開発者でもサイトが簡単に作れるところ。しかし現実はデザイナーさんだけでは解決できない要望が多いのも事実です。メンテナンスがしにくいwordpressよりもRailsで楽に要望に応えられる方がメリットが多いと判断しました。

# どのCMSを使うか？
こちらのサイトを元に選定しました。
[9 Best Ruby On Rails Content Management Systems (CMS) - HackHands](https://hackhands.com/9-best-ruby-rails-content-management-systems-cms/)
すべての候補CMSでdemoがあれば触って、documentやgithubのリポジトリを見ています。

## 主な選定基準
- 現在も開発が行われているか
 - Rails3は嫌（遅い、文法違う）
 - 長期的に使うつもり
- wordpressライクなPOSTができるか（demoページで確認）
- Rails4対応

## 選定プロセス
上記候補群から選定基準をあてはめると、、

- Refinery CMS
- Locomotive CMS

が残りました。

　ほとんどgithubのリポジトリを見てはじいています。starがあまりにも少なかったり、masterブランチのコミットが最近活発でなかったりしたものです。

## 選定結果
表題の通り、[Refinery CMS](http://www.refinerycms.com)にしました。

### Refinery CMSとLocomotive CMSの比較

#### Locomotive CMSの良い点
- 割とメジャー
- かなり開発が盛ん
- 日本語対応

#### Locomotive CMSの悪い点
- liquidというファイル形式（最悪）
 - hamlみたいなものですが、これ必要？？とかなり疑問です
- slimが使えない
 - liquidという特殊な文法のため、slimが動かないようです
- yamlでコンテンツを管理する
- Railsから外れている？
 - assetsを直接public以下に置くようdocumentationされていました

#### Refinery CMSの良い点
- Railsから外れない
 - CMS独自の文法を覚える必要がない
 - slimが使える
- 管理画面がシンプル
 - wordpressのように、良くわかっていない管理者に勝手にアップデートされて、サイトを壊される心配がない（他のCMSも同じメリットはあります）
- 日本語対応

#### Refinery CMSの悪い点
まだ使いこんでいないので、悪い点が見えていません

# Rails4でのインストール手順

rbenvなり、rvmを使ってgemの管理をしてください。
以下はrbenvを使っています。

```
mkdir {name}
cd {name}

vim Gemfile
  # refinerycms関連を入れてください。その他は私の好みです。
  source 'https://rubygems.org'

  ruby '2.2.3'

  gem 'rails', '4.2.5'
  gem 'mysql2'
  gem 'sass-rails'
  gem 'uglifier'
  gem 'coffee-rails'
  gem 'therubyracer', platforms: :ruby
  gem 'jquery-rails'
  gem 'turbolinks'

  # refinerycmsで必須
  gem 'execjs'
  gem 'refinerycms'
  gem 'refinerycms-acts-as-indexed'
  gem 'refinerycms-wymeditor'
  gem 'refinerycms-authentication-devise'

  gem 'slim'

  group :development, :test do
    gem 'rspec-rails'
    gem 'factory_girl'
    gem 'pry'
    gem 'pry-doc'
  end

  group :development do
    gem 'spring'
    gem 'spring-commands-rspec'
    gem 'quiet_assets'
    gem 'thin'
    gem 'better_errors'
    gem 'binding_of_caller'
    gem 'rubocop', require: false
    gem 'bullet'
  end

  group :test do
    # gem 'capybara'
    # gem 'launchy'
    # gem 'poltergeist'
    # gem 'faker'
    # gem 'fuubar'
  end
:wq
bundle install --path vendor/bundle
bundle exec rails new -B -T -d mysql .        # dbは自由に選択してください
vim config/database.yml                       # 自身の環境に合わせて設定してください
bin/rails g refinery:cms --fresh-installation
bin/rails g rspec:install                     # rspec書くつもりないのであれば不要です。
bundle exec spring binstub rspec              # rspec書くつもりないのであれば不要です。

bin/rails s
open http://localhost:3000/refinery
```
openFrameworksのboostを最新版にする

openFrameworksに含まれるboostは1.0.0と古く、Asioといった便利なライブラリが使えない。
そこで、boostを最新版（執筆時1.59.0）にアップデートする方法をメモする。

環境は次の通り。

- OSX 10.11.1
- openFrameworks 0.9.0

## boostをダウンロードする

http://www.boost.org ここから最新版をダウンロードする。

## boostをビルドする
次のコマンドでboostをビルドする。
ポイントとしては、static libraryを出力するように指定するところ。

```
$ ./bootstrap.sh --prefix=path/to/installation/prefix
$ ./b2 install -j 5 link=static
```

出力されたヘッダファイルとstatic library(.aファイル)をopenFrameworksのlibsディレクトリ以下のboostが入っているフォルダへコピーする。
具体的には`$(OF_PATH)/libs/boost/include`にヘッダを、`$(OF_PATH)/libs/boost/lib/osx`にstatic libraryをコピーする。

## Xcodeの設定を変更する
XcodeのBuild Settingsから、`$LIB_BOOST_FS`と`$LIB_BOOST_SYSTEM`を次のように変更する。

- `$(OF_PATH)/libs/boost/lib/osx/boost_filesystem.a`→`$(OF_PATH)/libs/boost/lib/osx/libboost_filesystem.a`
- `$(OF_PATH)/libs/boost/lib/osx/boost_system.a`→`$(OF_PATH)/libs/boost/lib/osx/libboost_system.a`

boost/regixなどは適宜`other linker flag`にパスを追加する。

## Deployment targetを変更する
XcodeのGeneralからDeployment target を10.11に変更する。

## 終わり

これでビルドできるようになっているはず。
ただ、もともと使われているboostの参照先を直接変更しているため、openFrameworksの挙動全てに影響が出る可能性がある。

プロジェクトをアップデートするとXcodeの設定しなおしになるので注意。
`($OF_PATH)/libs/openFrameworksCompiled/project/osx/CoreOF.xcconfig`を修正することで設定しなおさなくても住むようになる。
[C++]コンパクトなBWT

今更FM-indexの勉強をしていて必要になったので。


```cpp
template <
  class RandomAccessIterator1,
  class RandomAccessIterator2,
  class OutputIterator,
  class DifferenceType,
  class LexicallyLesser = default_lexically_lesser<RandomAccessIterator1>
>
void bwt (RandomAccessIterator1 in, RandomAccessIterator2 aux, OutputIterator out, DifferenceType size)
{
  for (DifferenceType i = 0; i < size; ++i) { aux[i] = i; }

  std::sort(aux, aux + size, [&] (DifferenceType l, DifferenceType r) {
    return LexicallyLesser()(in + l, in + r); }
  );
  
  for (DifferenceType i = 0; i < size; ++i) { out[i] = in[(aux[i] + size - 1) % size]; }
}
```

`in` - 入力文字列の最初を指すイテレータ。
`aux` - 補助領域を指すイテレータ。DifferenceType型を指す。
`out` - BWT変換した文字列を格納するイテレータ。

イテレータは全て`RandomAccessIterator`。
`ContiguousIterator(since c++1z?)`でなくても良い。
`out`は`OutputIterator`を満たす。

終端文字も入力に含める。
終端文字も`size`に含める。

メモリ使用量は`O(size)`。
計算量は`sort`が律速。
今回は`std::sort`使ってるけど、文字列の分布の偏りを想定して変なソートかけるのが通らしい。

接尾辞配列そのものが欲しい場合はSAISみたいにもっと良い方法がある。

https://github.com/kktk-KO/kktkbwt

参考
----

[naoyaのはてなダイアリー](http://d.hatena.ne.jp/naoya/20081016/1224173077)
Amazon Linuxに Node.js と npm を入れる

## 単純にyumでインストール

```shell-session
$ sudo yum install nodejs npm --enablerepo=epel
```

がしかし、上記の方法だとインストールされる**Node.jsのバージョンが相当古い**。。（現在：v0.10）


## 最新のNode.jsを使えるようにする

nvm (Node Version Manager)を入れて、最新のNode.jsを使えるようにする。（現在：v5.1.0）

### 1 - nvmをインストールする

```shell-session
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash
```

### 2 - Node.jsの最新バージョンをインストールする

```shell-session
$ nvm install v5.1
```
*※ npmのver.も一緒に上がる*

### 3 - インストールしたNode.jsの設定 + デフォルトver.として指定する

```shell-session
$ nvm use 5.1
$ nvm alias default 5.1
```

### 4 - インストールされたNode.jsのver.を確認する

```shell-session
$ node -v
```

で`v5.1.0`と表示されるはず。


***
参考）
nvm githubページ: https://github.com/creationix/nvm/
Internet Explorer 11 のエンタープライズ モード

# ◆Internet Explorer 11 のエンタープライズ モード
[エンタープライズ モードとは](https://technet.microsoft.com/ja-jp/library/dn640687.aspx)
> Windows Internet Explorer 7 や Windows Internet Explorer 8 をエミュレートして、以前のバージョンの Internet Explorer で記述されテストされた Web アプリに関連する一般的な互換性の問題を回避できるように設計されています。

## ◆Internet Explorer 11をインストールするまで

まず

- Windows 7 Service Pack 1
- Windows Server 2008 R2 Service Pack 1

までWindowsをアップデートしておく

[Internet Explorer 11 用必須更新プログラム](https://support.microsoft.com/ja-jp/kb/2847882)を全て適用しておく

Internet Explorer 11をインストールする

## ◆Internet Explorer 11をインストールした後に
[Internet Explorer 11 crashes when you turn on or turn off Enterprise Mode in the Tools menu (KB2888049)：2014/04/07](https://support.microsoft.com/ja-jp/kb/2956283)

[Internet Explorer 用の累積的なセキュリティ更新プログラム (2950467)：2014/04/09](https://technet.microsoft.com/library/security/ms14-018)

## ◆エンタープライズ モードを管理する
[Enterprise Mode Site List Manager](https://www.microsoft.com/ja-jp/download/details.aspx?id=42501)でエンタープライズ モードを適用するサイトのリストを作成、メンテナンスできる

作成したリストは

- クライアントPC内
- クライアントPCからアクセスできる場所

に置くことができる

作成したリストは

- rules version

でバージョン管理されている

端末で保持しているバージョン(CurrentVersion)より新しいrules versionのサイトリストが見つかると更新される仕組みを持っている
テストマシン等でrules versionを書き換えたサイトリストを適用したものに本番データが適用されないことがあるので注意する
※ CurrentVersionの値がrules versionより大きければ適用されない

## ◆エンタープライズ モードを設定する
エンタープライズ モードは

- レジストリで設定  
(HKEY_CURRENT_USER\Software\Policies\Microsoft\Internet Explorer\Main\EnterpriseMode)  
(HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Internet Explorer\Main\EnterpriseMode)
- グループポリシーで設定  
[管理用テンプレート]-[Windows コンポーネント]-[Internet Explorer]-[[ツール] メニューからエンタープライズ モードを有効にして使用できるようにする]



で有効にすることができる
【Intel Edison Breakout board & Node.js】PWMを使ってLEDの明るさを制御

## 作業環境

*   MacBook Air (13-inch, Mid 2012) &amp; Mac OS 10.11
*   Intel Edison Breakout Board &amp; Poky (Yocto Project Reference Destro) 1.7.2

## 参考サイト

*   [Intel Edison (Breakout Board Kit)でＬチカ - Qiita](http://qiita.com/Cheap-Engineer/items/7b44e22008ad92f61776)
  +   基本的なLチカ
*   [iotapp-template-pwm/main.js at master · gomobile/iotapp-template-pwm](https://github.com/gomobile/iotapp-template-pwm/blob/master/main.js)
  +   PWMの参考プログラム
*   [mraa: Intel Edison](http://iotdk.intel.com/docs/master/mraa/edison.html)
  +   ピンの役割と名前の確認
*   [Edison - mraaライブラリ　用途別早見表 - Qiita](http://qiita.com/kouzuka/items/8317b7ded13ecd4a2ae2)
  +   上記のピンアサインメントを用途別に並び替えたもの

## 1. Intel XDK IoT Editionを使わずにLEDを点灯させる

以前はIntel XDK IoT Editionを使ってプログラムをしていたが、何故か使えない。
ちょうどよい機会なのでターミナルからプログラムを触ってみる。

まずはサンプルプログラムが格納されているフォルダに移動する。

``` lang:terminal
cd /usr/share/mraa/examples/javascript
```

次にプログラムを作成してviで開く。

``` lang:terminal
vi blink.js
```

次のプログラムを書き込み、保存してviを終了。

``` lang:node.js
var mraa = require('mraa'); //require mraa
console.log('MRAA Version: ' + mraa.getVersion()); //write the mraa version to the Intel XDK console

var myOnboardLed = new mraa.Gpio(14);
myOnboardLed.dir(mraa.DIR_OUT); //set the gpio direction to output
var ledState = true; //Boolean to hold the state of LedperiodicActivity(); //call the periodicActivity functionfunction periodicActivity()
{
  myOnboardLed.write(ledState?1:0); //if ledState is true then write a '1' (high) otherwise write a '0' (low)
  ledState = !ledState; //invert the ledState
  setTimeout(periodicActivity,1000); //call the indicated function after 1 second (1000 milliseconds)
}
```

以下のコマンドでプログラムを実行する。

``` lang:terminal
node blink.js
```

Breakout Boardの裏面にLEDを接続する

*   J18-1pin -&gt; LED + (足の長い方)
*   J19-3pin -&gt; LED - (足の短い方)

LEDが１秒おきに点滅する。(動画はプログラム修正前のものでJ18-2pinにつないでいる。)
直接ポートにLEDをつないでしまっているため、LEDの種類によっては電流が足りず光らない場合がある。(今回は赤色のものを使ったが、白色だと点かなかった。)

[![【Intel Edison Breakout board】Lチカ](http://img.youtube.com/vi/K_YZ7sBuhnU/0.jpg)](http://www.youtube.com/watch?v=K_YZ7sBuhnU)

プログラムの終了は`ctrl + z`。

## 2. プログラムを変えてPWMでLEDの明るさを変える

別のプログラムを作成してviで開く。

``` lang:terminal
vi ledpwm.js
```

次のプログラムを書き込み、保存してviを終了。(viの使い方は他のサイトを参照ください)

``` lang:node.js
var mraa = require('mraa'); //require mraa
//Initialize PWM on Digital Pin #1 (D1) and enable the pwm pin
var pwm1 = new mraa.Pwm(14);
pwm1.enable(true);

//set the period in microseconds.
pwm1.period_us(2000);
var value = 0.0;

setInterval(function () {
    if (value >= 1.0) {
        value = 0.0;
    }
    value = value + 0.03;
    pwm1.write(value); //Write duty cycle value.
    console.log(pwm1.read());//read current value that is set before.
}, 100);
```

以下のコマンドでプログラムを実行する。

``` lang:terminal
node ledpwm.js
```

Breakout Boardの裏面にLEDを接続する。

*   J18-1pin -&gt; LED + (足の長い方)
*   J19-3pin -&gt; LED - (足の短い方)

LEDが徐々に明るくなると同時にterminalにも数値が出力される。
[![【Intel Edison Breakout Board】PWMでLED制御](http://img.youtube.com/vi/Gnz4sPfaNNk/0.jpg)](http://www.youtube.com/watch?v=Gnz4sPfaNNk)

![image](https://40.media.tumblr.com/54bdd5f0dd324c996629b8f8f530d1cd/tumblr_inline_ny2q4pW0yw1sh9x8u_540.png)
promiseのタスク処理の粒度を決めて実行する


# promiseでタスク処理をするときに困ること

* Promise.allの並列度が高すぎてバックエンドがスパイクする（joinしてるだけだから当然かな）
* 順番に実行するには遅すぎる
* あとで粒度を変えたい（開発中は公開サーバー使わせてもらってあとで専用サーバーたてるとか）

# promiseのタスク処理するモジュール

順番に実行する処理をパイプラインとして複数用意し全部一度に実行すると実行数を制限できるのでそれでシンプルに実装してみた

# インストール方法

```
npm i promise-util-task
```

# 基本的な使い方

promiseを返す関数のリストを作り、利用したい粒度でタスク処理する関数を呼びます

## task.seq(tasklist)

一つずつ順番に処理されます
例では逐次的に実行するので一つ1秒かかる処理を10秒で終わらせています

```:seq.js
const task = require('promise-util-task');

const sleep = (callback, ms) => new Promise((resolve, reject) => {
        setTimeout(() => resolve(callback()), ms)
    })

const range = (max) => Array.from({length: max}, (v, k) => k + 1)
const createTask = (max) => range(max).map( (n) => async() => sleep( () => n, Math.random() + 100 ) )

const main = async() => {
    const tasklist = createTask(20)
    console.time("elapsed time - seq");
    const res_seq = await task.seq(tasklist)
    console.timeEnd("elapsed time - seq");
    console.log(res_seq);
}

main()
```

```:result
elapsed time - seq: 2067.995ms
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 ]
```

## task.all(tasklist)

すべて同時に実行されます（Promise.allの単なるラッパー）
例ではすべて同時に実行するので一つ1秒かかる処理を1秒で終わらせています

```:all.js
const task = require('promise-util-task');

const sleep = (callback, ms) => new Promise((resolve, reject) => {
        setTimeout(() => resolve(callback()), ms)
    })

const range = (max) => Array.from({length: max}, (v, k) => k + 1)
const createTask = (max) => range(max).map( (n) => async() => sleep( () => n, Math.random() + 100 ) )

const main = async() => {
    const tasklist = createTask(20)
    console.time("elapsed time - all");
    const res_all = await task.all(tasklist)
    console.timeEnd("elapsed time - all");
    console.log(res_all);
}

main()
```

```:result
elapsed time - all: 103.016ms
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 ]
```

## task.limit(tasklist, limit_count)

並列度を制限して同時に実行します
例では5個ずつ同時に実行するので一つ1秒かかる処理を2秒で終わらせています

```:limit.js
const task = require('promise-util-task');

const sleep = (callback, ms) => new Promise((resolve, reject) => {
        setTimeout(() => resolve(callback()), ms)
    })

const range = (max) => Array.from({length: max}, (v, k) => k + 1)
const createTask = (max) => range(max).map( (n) => async() => sleep( () => n, Math.random() + 100 ) )

const main = async() => {
    const tasklist = createTask(20)
    console.time("elapsed time - limit");
    const res_limit = await task.limit(tasklist, 5)
    console.timeEnd("elapsed time - limit");
    console.log(res_limit);
}

main()
```

```:result
elapsed time - limit: 419.363ms
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 ]
```
Docker Swarmで、agentがmanagerに登録できない

docker-machineを使って、DockerSwarmのクラスタを作っていた所、`swarm-agent`がクラスタに参加して来なくて小一時間詰まった。
Discoverのバックエンドにはetcdを使っていたので、etcdの中身を見えると、追加したいノードからちゃんとキーがセットされている。
`swarm-agent-master`のログを見ていると、以下のログを発見！
```
time="2015-11-19T16:37:35Z" level=error msg="ID duplicated. E4S7:YAHU:MXDC:VT6C:4H5D:CMV7:PHEG:FU7D:SZNW:HSKY:IRL3:K7JJ shared by 192.168.0.1:2376 and 192.168.0.2:2376"
```
ぐぐったら、以下のIssueがでてきた。
https://github.com/docker/swarm/issues/380

Dockerは初回起動時にユニークなIDを`/etc/docker/key.json`に作るらしい。

今回、docker-engineと使用予定のimageをpullした状態のVMをゴールデンイメージにしてクラスタを組もうとしていたので、IDが重複して、追加ノードがクラスタに参加できなかったみたいだ。

`/etc/docker/key.json`を消して、docker-engineを再起動後、クラスタに追加したら問題解決！
KenLMをC++で呼び出す。参考になればいいと思う

必要なので書いた。C++からならば簡単に使えるかと思ったが、そんなことはなかったので、自分で書いた。``` g++ -L$KENLM_INSTALL_DIR/lib -lkenlm ``` などとしてコンパイルすれば使える

build

```mk
kenlm:
        \curl http://kheafield.com/code/kenlm.tar.gz |tar xz
        cd kenlm && ./bjam --max-kenlm-order=5 --prefix=`pwd`
        mkdir -p kenlm/lib
        echo "\$$CXX \$$CXXFLAGS \$$objects -shared -o lib/libkenlm.so" >>kenlm/compile_query_only.sh
        cd kenlm && CXXFLAGS=-fpic ./compile_query_only.sh
```

use

```cpp
  void load_model(const char *model_file)
  {
    shared_ptr<lm::base::Model> rv = nullptr;
    using namespace lm::ngram;
    if (RecognizeBinary(model_file, model_type_)) {
      switch(model_type_) {
      case PROBING:
        probing_model_ = std::move(shared_ptr<lm::ngram::ProbingModel>(new ProbingModel(model_file, config_)));
        break;
      case REST_PROBING:
        rest_probing_model_ = std::move(shared_ptr<lm::ngram::RestProbingModel>(new RestProbingModel(model_file, config_)));
        break;
        /*
      case TRIE:
        rv = shared_ptr<lm::base::Model>(new TrieModel(model_file, config_));
        break;
      case QUANT_TRIE:
        rv = shared_ptr<lm::base::Model>(new QuantTrieModel(model_file, config_));
        break;
      case ARRAY_TRIE:
        rv = shared_ptr<lm::base::Model>(new ArrayTrieModel(model_file, config_));
        break;
      case QUANT_ARRAY_TRIE:
        rv = shared_ptr<lm::base::Model>(new QuantArrayTrieModel(model_file, config_));
        break;
        */
      default:
        std::cerr << "Unrecognized kenlm model type " << model_type_ << std::endl;
        abort();
      }
    } else {
      assert(0);
      //Query<ProbingModel>(model_file, config, sentence_context, show_words);
    }
  }
```

```cpp
  double get_cost(const lm::WordIndex *begin,
      const lm::WordIndex *end, lm::WordIndex w) const
  {
    lm::ngram::State state;
    lm::FullScoreReturn result;
    switch(model_type_) {
    case lm::ngram::PROBING:
      result = probing_model_->FullScoreForgotState(begin, end,
          w, state);
      break;
    case lm::ngram::REST_PROBING:
      result = rest_probing_model_->FullScoreForgotState(begin, end,
          w, state);
      break;
      /*
         case TRIE:
         rv = shared_ptr<lm::base::Model>(new TrieModel(model_file, config_));
         break;
         case QUANT_TRIE:
         rv = shared_ptr<lm::base::Model>(new QuantTrieModel(model_file, config_));
         break;
         case ARRAY_TRIE:
         rv = shared_ptr<lm::base::Model>(new ArrayTrieModel(model_file, config_));
         break;
         case QUANT_ARRAY_TRIE:
         rv = shared_ptr<lm::base::Model>(new QuantArrayTrieModel(model_file, config_));
         break;
         */
    default:
      std::cerr << "Unrecognized kenlm model type " << model_type_ << std::endl;
      abort();
    }
    return result.prob;
  }
```


```cpp
    lm::WordIndex state[N_GRAM-1];
    size_t i;
    for (i = 0; i < ctxt.size(); ++i)
      state[i] = ctxt[ctxt.size()-i-1];
    // Осторожно за range
    -get_cost2(state, state+i, w);
```