OmniAICreator/Qiita-1.07M huggingface dataset:
Puppet導入前に知りたかったこと

Puppet導入前に知っていればよかったなと思うことです。
導入検討されている方に役立つかわかりませんが、ノウハウというよりは考え方をまとめました。

# 構成管理ツール ≠ 自動構築ツール
一言でPuppetを紹介する場合、Puppetはサーバの自動構築ツールです。
なのですが、自動構築ツールなイメージでPuppetを使うと、まわりくどさを感じることもあります。
構築時に１回だけ実行するだけであれば、単純にシェル書いた方が楽な場合あります。

もっと正確な紹介だと、**Puppetはサーバの構成管理ツール**です。
なのですが、構成管理って一言で説明しにくい。しばらくPuppetを使ってみてですが、

　**構成管理ツール = テスト + 修繕**

な、イメージかなと。もう少し具体的には、

- サーバのあるべき状態の定義を書いておく
- 定義にあっているかテストされる
- 定義とあっていなければ修繕する

です。なのでPuppetの作業負担感としては、構築自動化、単体テスト自動化を合わせたぐらいだと思った方がよいです。もちろん別途テストは必要ですが、手順書ベースの構築後のテストに比べてテスト項目は減らせるかなと。
何も設定してないサーバに対して適用するとあるべき状態に修繕されるので、結果的に自動的に構築されると見ることもできます。

# なんで構成管理ツール使うの？
その答えは、なんでGit使うの？に似ているかなと思います。
**ちょっと面倒だけど、なれるとトータルでは品質は良くなるから**と。
使っていない人に、メリットを説明する難しいのも似ています。

状態を定義するのは面倒だけど、状態チェックを含むから設定漏れが減ります。あと、同じ設定を横並び的に反映するのは得意です。デバック環境、ステージング環境、プロダクション環境、同じにすべき設定が同じであれば、意図しないインフラ差異での不具合を減らせます。

あと、

サーバのあるべき状態をコード化できる
→　**GitやSubversionで成果物管理できる**（あとで変更内容を追える）
反映結果にべき等性がある（1回行っても複数回行っても結果が同じ）
→　**インフラCI的なこともできる**

なので、単純に構築自動化というメリットだけでなく、品質管理やテスト自動化がやりやすくなります。

# どういう場合に向いているの？
次の場合に向いているかと。

- **システム構成が１サーバ１機能**
- **インフラリリースのルールが明確**

です。逆に、１サーバが多機能だったり、インフラリリースが不定期（頻度が高かったり、後からきた要件を先行反映しないといけない）だったりする場合は、できなくはないですがそれなりに苦労します。

また、一度構築したサーバは基本触らない的な運用であれば、Puppetは冗長かもしれません。その場合は、シェルとかFabricとかAnsibleとか、もっと自動構築に特化したものも検討しましょう。

# 各サーバにエージェントをインストールするの？
Puppetだと管理対象のサーバに、エージェント役のpuppetのインストールが必要です。内製システムであれば各サーバにエージェント入れるのは比較的容易ですが、SI案件だとそこが一番ハードル高いかと思います。

現状だと各サーバに**エージェントのインストール不要な構成管理ツールもあるので、構成管理の手始めとしてはそっちを使うのもありです。AnsibleとかItamaeとかです。**
個人的に同規模のシステムで各ツールを使っていないので、Puppetとは違う苦労もある可能性もあります。他ツールの経験浅いのでどういう場合かは比較できないですが、案件によってAnsibleが向いていたり、Puppetが向いていたりする場合があるのかなと思います。

残念なことに、現状エージェントを入れないとできないようなメリットはあまり感じないです。もしかしたら大規模システムであれば、エージェントが入っている方が負荷が分散されてよいかもしれないですが。。。あとは、定義の書きやすさですが、これは個人の好みによります。

# Agent/MasterとPuppet Applyどっちがいいの？
Puppetにはスタンドアローンで反映するApplyと、Master側でコンパイルした定義をAgentに反映する２タイプあります。

数台であればスタンドアローンのPuppet Applyの方が、導入準備が少ないので良いかと思います。
**台数が多い場合（明確に何台くらいかは難しいです）は、Agent/Masterの方が推奨**されています。

意訳ですが、参考までに。

https://docs.puppetlabs.com/puppet/latest/reference/architecture.html#note-differences-between-agentmaster-and-puppet-apply

- Master/Agent構成だと、Agent側には関係する部分だけ渡されるので、各サーバの負荷は少ないです。Applyだと各ノードで全定義を読むので負荷高いです。
- Master/Agent構成だと、Puppet実行時のレポート情報がMaster側に集まります。
- Master/Agent構成だと、Master上の定義だけ更新すればよいので楽です。
- Master/Agent構成だと、Agent側でコンパイルされないので、Agent側でpuppet用に必要なリソースは少なくすみます。
- Master/Agent構成であれば、Puppet masterには速いプロセッサ、多めのRAM、速いディスクをつけましょう。
- Master/Agent構成の場合、Master/Agentの通信があるためネットワーク帯域に余裕がない場合は見直してください。
- Master/Agent構成の場合、HTTPSを使ったセキュアな通信と、SSLでの認証を行っています。

マスター側で必要なリソースは、下記参照

https://docs.puppetlabs.com/puppet/latest/reference/system_requirements.html#hardware

- 少なくとも2プロセッサ、1GB RAM。
- 1000ノードの場合、2-4プロセッサ、少なくとも4GB RAM.

ただ、反映頻度やpuppetマニフェストの規模に依存するので、あくまでも目安なので、気持ち多めに積んだ方がよいです。

なお、台数が多い場合でもApplyの方が良い場合もありそうです。いろいろ情報見ていると、マニフェストをGitで管理して、各ノードにはマニフェストをclone(pull)してapplyする運用もあるようです。たぶんですが各サーバごとに設定をこまめに変更する運用の場合はGit+applyが良いかもしれません。

- 一部のサーバだけ古い（安定した）設定（リビジョン）で残しておくとか
- 一部のサーバ用の特別設定はブランチ切って特別に反映するとか
作業行を塗りつぶすマクロ

```vba:Worksheet_SelectionChange.bas
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Call entireRowColor(Target, RGB(224, 255, 255))
End Sub
```

```vba:entireRowColor.bas
PriSub entireRowColor(ByVal argTarget As Range, ByVal argCLR As Long)
    Static prevTarget As Range '移動前のセルを取得できないのでStaticで前回色を変えたセル範囲を保存する
    
    On Error Resume Next　’ファイルを開いて最初に呼び出されるとき、prevTargetはnullでエラーが発生する
    prevTarget.entireRow.ClearFormats
    On Error GoTo 0
    argTarget.entireRow.Interior.Color = argCLR

    Set prevTarget = argTarget

End Sub
```
typescript + karma + mocha + power-assert + browserify メモ


なんか選択肢がたくさんあって壮大にハマったのでメモしておきます。
完成形は[これ](https://github.com/n-kurasawa/test-sample/tree/master/js/client-ts-bfy)

##TL;DR
結論としてbrowserifyでいく場合は
karma-browserify + tsify + espowerify
でいくのがいいのではと。

karma.conf.jsはこんな感じで書きました。

```
module.exports = function(config) {
  config.set({
    basePath: '',

    frameworks: ['mocha', 'browserify'],

    files: [
      'test/**/*.ts'
    ],
    
    exclude: [
    ],

    preprocessors: {
      '**/*.ts': ['browserify']
    },

    browserify: {
      debug: true,
      plugin: [ 'tsify' ],
      transform: ['espowerify'],
      extensions: ['.ts', '.js']
    },

    reporters: ['progress'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['PhantomJS'],
    singleRun: false,
    concurrency: Infinity
  })
}
```


あと現在は以下の記事の対応しないとpower-assertの詳細情報がでません。
泣きそうになってたので大変助かりました。
http://qiita.com/wadahiro/items/5d8a81252f2105112339


これ以下は雑なメモです。

##雑なメモ
###とりあえずnpm initしとく
```
$ npm init
```

###ライブラリ
```
$ npm i karma typescript power-assert karma-browserify tsify espowerify -D
```

###karma設定
```
$ npm install -g karma-cli
$ karma init
Which testing framework do you want to use ?
Press tab to list possible options. Enter to move to the next question.
> mocha

Do you want to use Require.js ?
This will add Require.js plugin.
Press tab to list possible options. Enter to move to the next question.
> no

Do you want to capture any browsers automatically ?
Press tab to list possible options. Enter empty string to move to the next question.
> PhantomJS
> 

What is the location of your source and test files ?
You can use glob patterns, eg. "js/*.js" or "test/**/*Spec.js".
Enter empty string to move to the next question.
> 

Should any of the files included by the previous patterns be excluded ?
You can use glob patterns, eg. "**/*.swp".
Enter empty string to move to the next question.
> 

Do you want Karma to watch all the files and run the tests on change ?
Press tab to list possible options.
> yes
```

###tsconfig.jsonの生成
```
$ tsc --init 
```
編集してこんな感じに

```
{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es5",
        "noImplicitAny": false,
        "sourceMap": true
    },
    "exclude": [
        "node_modules"
    ]
}
```


###型定義ファイル
```
$ tsd init
$ tsd install mocha power-assert --save
```
ESP8266 (ESP-WROOM-02) の便利ライブラリまとめ (Ticker編)

## 概要
ESP8266 (以下 WROOM02) のプログラムにあたり、標準ライブラリの使い方まとめ。Ticker編。

## はじめに
WROOM02 (Arduino) でコーディングしていると、メッセージループが loop 一つなので、コードが if 文だらけになってしまいますよね。あるある。
定期的な処理をいい感じにやってくれる Ticker というクラスが標準であるので、その使い方まとめです。

## 使い方
### インクルード

```cpp
#include <Ticker.h>
```
Mac では、上記の実態は以下にあります。
~/Library/Arduino15/packages/esp8266/hardware/esp8266/2.0.0/libraries/Ticker/Ticker.h
~/Library/Arduino15/packages/esp8266/hardware/esp8266/2.0.0/libraries/Ticker/Ticker.cpp

### 簡単な例

以下で、
　1,000 msec (1秒) 毎に your_loop1 関数
　4,000 msec (4秒) 毎に your_loop2 関数
が実行されます。

```cpp
#include <Ticker.h>

Ticker ticker1;
Ticker ticker2;

void your_loop1() {
  Serial.print("Loop1 : ");
  Serial.println(millis());
}

void your_loop2() {
  Serial.print("Loop2 : ");
  Serial.println(millis());
}


void setup() {
  Serial.begin(115200);
  ticker1.attach_ms(1000, your_loop1);
  ticker2.attach_ms(4000, your_loop2);
}

void loop() {
  // Do nothing.
}
```

結果

```
Loop1 : 17286
Loop1 : 18286
Loop1 : 19285
Loop2 : 20280
Loop1 : 20285
Loop1 : 21285
Loop1 : 22286
Loop1 : 23285
Loop2 : 24280
Loop1 : 24285
Loop1 : 25286
```

ループを停止する場合は detach を実行します。

```cpp
  ticker1.detach();
  ticker2.detach();
```

### 1回しか実行しない場合
そもそも、１回しか実行しないなら once 関数が用意されています。

```cpp
ticker1.once_ms(1000, your_loop1);
```

### パラメータを渡す
パラメータを渡したいなら、template 版 が用意されています。

 - 4バイト(おそらくポインタ) しか渡せない。
 - パラメータはメモリ上から削除されないようにしないといけない。<br>
(new でヒープに確保するか、あるいは、static をつけておく)

```cpp
#include <Ticker.h>

Ticker ticker1;
Ticker ticker2;

class Param {
  public:
    const char* key;
    int value;
};

void your_loop(Param* p) {
  Serial.print("Loop ");
  Serial.print(p->key);
  Serial.print(" : ");
  Serial.println(p->value);
}

void setup() {
  Serial.begin(115200);

  static Param p1;
  p1.key = "Hello";
  p1.value = 200;

  static Param p2;
  p2.key = "World";
  p2.value = 600;

  ticker1.attach_ms<Param*>(200, your_loop, &p1);
  ticker2.attach_ms<Param*>(600, your_loop, &p2);
}

void loop() {
  // Do nothing.
}
```

結果

```
Loop Hello : 200
Loop World : 600
Loop Hello : 200
Loop Hello : 200
Loop Hello : 200
Loop World : 600
Loop Hello : 200
```

### 秒(float) で指定したい
関数名に _ms が付かない関数 (msec ではなくて 秒で指定する) も用意されてますが、秒が float で指定するのは気持ち悪いので、 msec で指定するほうが好まれるでしょう。


## まとめ
Ticker を使えば、loop 関数がすっきりします。

【しかし】Ticker で指定した関数内で通信処理ができないです(2016/01/10)。通信はメインループでしか不可能なのでしょうか？通信できた/通信できない の情報頂けるとありがたいです。


## 参考
全関数を載せておきます。

#### 繰り返し
```cpp
        void attach(float seconds, callback_t callback)

        void attach_ms(uint32_t milliseconds, callback_t callback)

        template<typename TArg>
        void attach(float seconds, void (*callback)(TArg), TArg arg)

        template<typename TArg>
        void attach_ms(uint32_t milliseconds, void (*callback)(TArg), TArg arg)
```
#### 一回だけ
```cpp
        void once(float seconds, callback_t callback)

        void once_ms(uint32_t milliseconds, callback_t callback)

        template<typename TArg>
        void once(float seconds, void (*callback)(TArg), TArg arg)

        template<typename TArg>
        void once_ms(uint32_t milliseconds, void (*callback)(TArg), TArg arg)
```
#### 停止
```cpp
        void detach();
```
cocos2d-jsでbase64エンコードされた画像をSprite化する

そう多くはないが、例えばスクリーンショットをlocalStorageに保持しておき、次回以降にそれを読みだすような場合、base64エンコードされた画像からSpriteを生成したい場合がある（もっと実際的な使いでもあるがそれは別エントリで）。
いくつか方法があるが、```cc.loader.loadImg```を使うのが最もcocos2dらしいコードになると思う。

```js:cc.loader.loadImg
var base64str = "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=";
cc.loader.loadImg(base64str , {isCrossOrigin : false}, function(err, img) {
    var whiteBox = cc.Sprite.createWithTexture(img);
    layer.addChild(whiteBox,1);
});
```
jsbで動くかどうかは試していない。
c++ builder XE4, 10.2 Tokyo > TeeChart > [未解決] 対数スケール > 右クリック時に縦軸が1からになってしまう

```txt:動作環境
C++ builder XE4
    TeeChart Lite v2013.08.130414
RAD Studio 10.2 Tokyo Update 2 (追記 2018/01/10)
    TeeChart v2016.17.160129 32bit VCL
```

TeeChartでグラフ縦軸を対数表示にしておいて、マウス右クリックでグラフの領域を変更すると縦軸が1からになってしまう。
1以下の小さい値がこれでは見えなくなる。

右クリックを不使用にするなり、なんらかの対策が必要。
c++ builder XE4, 10.2 Tokyo > fileIO > TFile::Copy() > ファイルが既存の時は例外が発生する > 上書きにするには3番目の引数をtrueにする 

```txt:動作確認
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/09)
```

`TFile::Copy()`を実行時、そのまま実行すると上書きで例外が出る。

以下に対応方法が記載されている。
http://www.gesource.jp/weblog/?p=5810
> コピー先にすでにファイルが存在する場合は例外が発生します。
すでにファイルが存在する場合にもファイルをコピーする場合は、3番目の引数をTrueにします。

<hr>
(追記 2016/06/14)

3回目のはまり。
いまさら GitBucket を、3分で動かす環境作り（windowsもokだぜ）

# GitBucket 
ああ判ってますます。いまさらの記事ってｗ
とりあえず GitLab の環境を壊してしまって作るのが手間だったのでさくっと作れる感じのものを探していただけです。そんな訳でこの GitBucket 、ぐぐるとまあ記事沢山でてくるもの判ってます。そんなわけで自分メモ。

# Java8 のインスコ
[Oracle のページ](http://www.oracle.com/technetwork/java/javase/downloads/index.html) からjdkをダウンロードするのだけど、Linuxの場合は rpm を windowsでダウンロードしてから転送して…rpm ってやり方をしていたのだけど便利な方法みつけたｗ

> [Linuxでjdkをwgetする方法](http://qiita.com/hajimeni/items/67d9e9b0d169bf68d1c9)

```
% wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u66-b17/jdk-8u66-linux-x64.rpm"
% sudo rpm -ivh jdk-8u66-linux-x64.rp
```

# GitBucket のダウンロード
https://github.com/takezoe/gitbucket/releases/ から最新版をダウンロードする。
※2016/1/10現在 v3.10.1

# 実行
windowsでもlinuxでも下記のコマンドでok。

```
java -jar gitbucket.war
```

アクセス方法は、localhost:8080 、id/pw は、共に root 。


![image](https://qiita-image-store.s3.amazonaws.com/0/44540/3b8ef6c2-c732-0aff-2793-7c827f63b4f5.png)

はい。ここまで３分でしたね。
ちなみにtomcatとか色々と連携している記事みますが、本家のwikiにはそれ以外の手順が多数説明されています。

> [Welcome to the GitBucket wiki!](https://github.com/gitbucket/gitbucket/wiki)
> [Developer's Guide](https://github.com/gitbucket/gitbucket/blob/master/doc/readme.md)

# どこにデータがあるの？バックアップの方法？そしてバージョーンアップ時は？？
どこにデータがあるの？
Linux であれば ```~/.gitbucket/```
Windows であれば ```%USERPROFILE%\.gitbucket```

バージョンアップ方法
最新の gitbucket.war をダウンロードして差し替えるだけｗ

バックアップの方法

> [GitBucket backup](https://github.com/gitbucket/gitbucket/wiki/Backup)
Xcodeでプロジェクトを複製して別のプロジェクトに流用する

##要約
Xcodeで作成した雛形のプロジェクトを別のプロジェクトに流用したいと思った。

##参考ページ
[1]http://kubou.net/archives/325
[2]https://ungacy.atlassian.net/wiki/display/IOS/PCH+was+compiled+with+module+cache

##手順
基本的に[1]の通り進めていけばいいわけだが、手順4でフォルダの指定ができなかったので原因を調べてみると、この操作をするときにはXcodeの一番左の欄の該当するフォルダを選択した状態でないと変更ができないらしい（それはそう）。

Product>Scheme>Manage Schemesで
新しいプロジェクト名も変更しておいた方がいいらしい。

あと最後の手順にあるPrefix Headerについても仕様が変わったのか見つからなかったため、buildエラーが治らなかった。
``pch was compiled with module cache path``
と言うエラーが出たのでググってみたら[2]からヒントが。
これやっても解決しなかったけど、
``(プロジェクトフォルダ名)/DerivedData/ModuleCache``
を削除したらビルドが通るようになった。

##問題点
iOSシミュレータでの出力先が一緒になってしまっているため、ビルドするとAppがシミュレータ上で片方しか見れなくなる。(シミュレータだから別にいいのかもしれないけど、複製したのだからAppも分けたいのが本音)

いろいろ探してみたけどDebugとReleaseでターゲットを分けるなどの手法しか見つからなかったため断念。ビルド→iOSシミュレータの仕組みをちゃんと理解する必要がありそう。

(おそらくPrefix Headerのところをちゃんと直せばうまくいくと踏んでる)

複製元と異なるアプリを作る場合には、やっぱり新しくプロジェクトを作り直して、欲しいところだけコピペする方が無難かもしれない。
「プロジェクト名の変更」に関しては問題なさそう。
304SH (android スマホ) > カメラ > オートフラッシュが動いてしまう > 動画で撮影して切り出す

```txt:動作確認
304SH (android スマホ)
```

カメラでZyboなどの画像を撮ろうとしたらオートフラッシュが動いてしまいサチュレートしてしまい何も見えなくなる。

オートフラッシュの切り方を調べたが見つからなかった。

代わりに以下のようにした。

1. 動画で撮影
2. 動画から写真を切り出し
Zybo > art number / familiy / device number / speed gradeの確認 > zyboのキャプチャから


[tutorial of Vivado and Basys3 @ youtube](https://www.youtube.com/watch?v=6_GxkslqbcU&list=PL_MJualihC5B5F2l_OOia2ew9rL66a_vV&index=54)
の1:55あたりに出てくる操作ではチップ(?)の表示を拡大して確認している。

Zyboの場合は、リストから選択するか不明だが、一応同じように写真を取ってみた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/3f17a02e-507b-1e15-65e2-7391ba952d3e.png)

youtubeでは以下のように確認している
- art number?(と聞こえる) > XC7A35T
- family > CPG235ABX1409
- device number > D23491A
- speed grade > 1C-ES9892? (画像がちょっと見えにくい)
kintone APIで”日時はISO8601形式の必要があります。”とエラーが出た場合すべき確認項目

#kintone APIで日付型の項目に値をセットしたらエラー！

>日時はISO8601形式の必要があります。

とエラーが表示される。

何の事はない、"2016-1-1"の形式であれば問題ありません。
ちょっと極端な例かもですが、"2016年1月1日"等kintoneが日付と解釈できないような値になっていないか確認してみましょう。。
（というか、自分がハマったのでこの記事を備忘録として書いているわけですが・・・ :astonished: ）

ちなみに月日を省略した場合はそれぞれ”01”で補完されます。

"2016"→"2016-01-01"
"2016-01"→"2016-01-01"

詳しくはこちら
https://cybozudev.zendesk.com/hc/ja/articles/201941754-REST-API%E3%81%AE%E5%85%B1%E9%80%9A%E4%BB%95%E6%A7%98#step6
技術英語 > the caribou were believed to be [going extinct] in Alberta within the next two decades.

@ LOE > September 21, 2012

http://loe.org/shows/shows.html?programID=12-P13-00038
> the caribou were believed to be <font color=red>going extinct</font> in Alberta within the next two decades. 

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

deprecated
http://qiita.com/7of9/items/13fb91effee664e34bfb

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

http://ejje.weblio.jp/content/obsolete

[How can I mark a package as obsolete with setup.py? @ SO](http://stackoverflow.com/questions/28064563/how-can-i-mark-a-package-as-obsolete-with-setup-py)
メモ:revel

* [Round 9 results - TechEmpower Framework Benchmarks](https://www.techempower.com/benchmarks/#section=data-r9&hw=peak&test=json) Webフレームワークの速度比較

## revelのインストール

* [Welcome to Revel, the Web Framework for Go!](http://revel.github.io/)

```bash:
# get revel framework
go get github.com/revel/revel

# get 'revel' command
go get github.com/revel/cmd/revel
```

```bash:getでエラーが出るが気にしなくて良い
# get samples and run chat app
go get github.com/revel/samples
revel run github.com/revel/samples/chat
```

* http://localhost:9000 にアクセス

![chat1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/8795b398-73a3-909e-7fd7-02f8cf2b00d3.png)

![chat2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/b7106bec-8e14-0f29-87a0-bca69cf4133a.png)


## 新規アプリ作成

```bash:
# create a new app and run
revel new github.com/myaccount/my-app

revel run github.com/myaccount/my-app
```

![app1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/7bb49e2e-9773-ef3b-ad0e-23b0098cb41e.png)

```bash:
cd $GOPATH/src/github.com/myaccount/my-app/
```

```bash:ファイル一覧
$ find . -type f
./conf/app.conf
./conf/routes
./.gitignore
./README.md
./tests/apptest.go
./public/js/jquery-1.9.1.min.js
./public/img/favicon.png
./public/img/glyphicons-halflings.png
./public/img/glyphicons-halflings-white.png
./public/css/bootstrap.css
./app/views/flash.html
./app/views/footer.html
./app/views/App/Index.html
./app/views/debug.html
./app/views/header.html
./app/views/errors/500.html
./app/views/errors/404.html
./app/controllers/app.go
./app/routes/routes.go
./app/init.go
./app/tmp/main.go
./messages/sample.en
```

```diff:app/views/App/Index.html
- <header class="hero-unit" style="background-color:#A9F16C">
+  <header class="hero-unit" style="background-color:yellow">
    <div class="container">
      <div class="row">
        <div class="hero-text">
-         <h1>It works!</h1>
+         <h1>日本語</h1>
          <p></p>
        </div>
      </div>
    </div>
  </header>
```

![app2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/b1e5b14d-561e-128e-5859-96d9f8a2d594.png)
メモ:gvm (go version manager)

* ubuntu 16.04 だと`gvm install`でコンパイルエラーになる。
* [cmd/link: fails on Ubuntu Xenial due to unsupported relocations on 386, amd64 · Issue #13114 · golang/go · GitHub](https://github.com/golang/go/issues/13114)

## 参考

* [Binary Figments | Go versies installeren en beheren](https://binaryfigments.com/posts/go-versies-installeren-en-beheren)

## go version manager

```bash:
apt-get install -y bison golang
```

```bash:gvmインストール
wget https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer
bash gvm-installer
```

```zsh:~/.fizsh/.fizshrc
## go version manager
export GOPATH=~/bin/go
source ~/.gvm/scripts/gvm
```

### gvmでgolangをビルド

* [Error with go1.5 install · Issue #155 · moovweb/gvm · GitHub](https://github.com/moovweb/gvm/issues/155)

```bash:
gvm install go1.4 
gvm use go1.4 
export GOROOT_BOOTSTRAP=$GOROOT 
gvm install go1.5
```

```bash:
gvm install go1.6beta1
```
プログラマでも必要なコミュニケーション能力

## 参考動画
もっと伝わるコミュニケーション術 -会話編-

http://schoo.jp/class/2966/room?trial=1&token=7fb1325e3cc164ec31352cb764bc96d9

上記見て学んだもの
備忘録として、（）内は主観


## （認識していなかった大事そうなこと）
・相手の気持ちを察して癒していく
・言葉の影響力は強い
・言葉は大事に扱う
・「自分に興味を持ってくれてると、はっきりとわかる人」が、もてる。全員に興味を持てば全員にもてる。
・面白いことを言う＜興味を持つこと
・独りよがり（自分のことばかり話す人）（自分語りの罠）=>話がくどい - マナー違反 - 相手の時間を奪っている
・（聴く）７：３（話す）が良い
・話をすることが苦手な人は、ストレスが溜まりやすい
・相手と共感するところを話していく
・質問は自分を受信してくれるアンテナの設置作業
　→相手に質問することで、相手は、自分にこういう興味を持ってくれてるんだなと思ってくれる。
　→関係を構築したいなら、相手の気持ちが良くなるような質問をする。
・会話の中でカッチーンときたとき、反射させてはいけない。
 　→（反射→増幅→連鎖）の悪循環に入る。
 　→人と、時間と空間を共有している貴重な時間を、後悔してしまう。
 　→怒りの感情のピークは、長くて6秒。
 　→その瞬間に反射させない方法を取る。（紹介では手の平に気持ちを書く）
・会話は信頼関係構築のためにするもの
・会話の練習では、相手の話を遮らないよう、心がける。
　→自分が話をしていて快適だなと思う方を真似する。

##（認識していた大事そうなこと）
・会話は濃密に
・聴くの対比が９、１０になると、話し手は「この人何考えてるんだろう？」となる
・会話は上手・下手ではなく本気・真剣

## （認識していたか不明）
・質問の目的は、
  「疑問の解消」 - 前提知識の問題か、説明方法の問題か。
  「関係の構築」 - 初対面の相手、好意をしっかり示したいとき
  「力量の見極め」 - 思考スピード・論理構築力・説明能力・経験値
  「圧力を加える」 - 無価値な仕事に対し、仕事の価値を引き出す目的等
・自分が見聞きしていない事象を聞くとき、なるべく複数人の意見を聞く。それぞれ主観が入るため。

## （面白い知識）
・日本の教育では、「君はどう思っているの？」といった考えを求めることはしていなく、「きちんと正解が決まっていて、そこに対する理解度を積み上げていく」スタイル。
・ティムクックは、スティーブジョブズの圧迫面接を受け、社長の座になった。
・スティーブジョブズの面接を受けるくらいなら社長にならなくて良いというエグゼクティブが何人もいる。
　→ジョブズさんの圧迫面接は凄い。業界でも有名
　→５ｍ以上離れると神に見えるが、５ｍより近づくと悪魔に見える
　→自分の座っている椅子に座らせる面接
・ディズニーランドのアルバイトへのマニュアルで、「お客様と否定語を使って会話しないこと」と書かれている。


## （疑問）
・相手が話したいことを訊く。→それが、自分にとって、聞きたい情報でない場合は？

## （思ったこと）
・ビジネスで初対面の相手に対して、珍しい名前であれば「珍しい苗字ですね」等、コミュニケーションに繋がることもある。
　→緊張しすぎて、名前が頭に入ってこない。
　→怒られると感じやすく、相手の気持ちを良くしようという考えが沸いていない。
 →改善方法をまた模索する。
Ubuntu Studio14.04にVirtualbox + Windows + iTunesでiPod nano(第7世代)と同期する

Windows→LINUXにして唯一困ったのがiPodです・・

## 結果

- USB2.0経由でiPod nano(第7世代)と同期可能になった
- 音楽ファイルはホストOSのUbuntuに置き、同期が必要になったらゲストOSのiTunesを立ち上げる

## これまでに試したこと

- 以下のソフトで同期を試みたが同期不可  
(いずれもソフト側からiPodは認識され、同期ボタンも動作したように思えたものの、iPod側で認識されず)
 + Amarok2.8.0
 + Banshee 2.6.2
 + gtkpod2.1.4
- wineでiTune10, iTune13を動かしてみたがiPodを認識できなかった
- iPod初期化
- iPodに直接ファイルを放り込む(iPod側で認識されず)

## 用意したもの

- 昔使っていたwindows XPのCD  
(公式でwindowsのisoイメージをdonwloadしても良いですね)

## 作業ログ

1. Virtualbox5.0.12をインストール
 + https://www.virtualbox.org/wiki/Downloads
 + `dpkg -i virtualbox-5.0_5.0.12-104815-Ubuntu-trusty_amd64.deb`
2. Extension Packもインストール
3. ゲストOSを新規作成、インストール
 + ここではwindowsXP(64-bit)をインストール
4. ゲストOS Settings->USBでiPodをAddしておく
![USB](https://qiita-image-store.s3.amazonaws.com/0/106789/4757d928-c41e-859e-bf4f-8e8cf0299926.png)
5. ゲストOS Settings->Shared FoldersでホストOSの音楽フォルダを指定  
 + この時、Read Onlyを外しておくとiTunesでも編集できて良いと思います
6. ゲストOSにiTunesをインストール
 + WindowsXP対応の[iTunes12](https://support.apple.com/kb/DL1614?viewlocale=en_US&locale=ja_JP)が出てました(Sep 16, 2015)
7. USBにiPodを接続、ゲストOSのiTunesで認識・同期

## 注意点

ファイル名が以下だとゲストOS側で扱えなかった

- *?":<>が混ざっている
- .で終わっている

Virtualboxのバグっぽい
[Mac OS Xではfixされたようです](https://www.virtualbox.org/wiki/Changelog)

リネーム(※検証していませんので予期せぬ動作をする可能性があります)

~~~
# *?":<>を削除
find . -regex ".*[\*|\?|\"\:|\<|\>].*" -print0 | xargs -0 -n 1 rename -n 's/[\*|\?|\"\:|\<|\>]//g'
# 末尾の.を削除
find . -regex ".+\.$" -print0 | xargs -0 rename -n "s/.$//g"
~~~

## iPod nano(第7世代)のシステム条件

https://support.apple.com/kb/SP656?locale=ja_JP&viewlocale=ja_JP

~~~
Mac：USB 2.0または3.0ポート、Mac OS X v10.7.5以降、iTunes 12.2以降
Windowsパソコン：USB 2.0ポート、Windows 7以降、iTunes 12.2以降
~~~


## その他

- Virtualboxをインストール中  
`WARNING: The character device /dev/vboxdrv does not exist`  
と出たときは以下を行った  
`sudo dpkg-reconfigure virtualbox-dkms`  
`sudo dpkg-reconfigure virtualbox`
USI(Universal Shogi Interface)プロトコルについての実態調査

USI(Universal Shogi Interface)プロトコルについて調査してみた。

原案: (リンク切れ)http://www.glaurungchess.com/shogi/usi.html
H.G.Mullerさんのサイトにある原案のコピー: http://hgm.nubati.net/usi.html
デファクト: http://shogidokoro.starfree.jp/usi.html

一応、将棋所にあるものがデファクトとの認識ではあるが、エンジンの中にはまだ対応できていないものも存在する。特にgo mateの挙動についてはだいぶ動作が異なる。

http://www2.ezbbs.net/cgi/reply?id=shogidokoro&dd=09&re=4

原案では、bestmoveが出力されるまでのinfo score mate で手順を出力させる意図だった模様。

詰め手順がない場合は、bestmoveが出力されるまでの間にinfo score mateの出力がないことで判断。go mate時のbestmoveは必ずしも詰め手順の最初の一手とは限らないということだ。

一方で、将棋所の作者による仕様では、明確にcheckmateという応答で対応させる。これは明確でわかりやすい仕様。

以下、私が調べたエンジン毎の動作。

# Laramie
```
info time 77 nodes 9253 depth 3 score mate +5 seldepth 8 pv G*8f 9f9g 8f8g 9g9h 8g8h
bestmove G*8f
```

infiniteとしても直にbestmoveが返ってくる。(stopを待っていない。)
詰まない場合はscore mateが出力されずにbestmoveが返ってくる。

# TJshogi
```
info depth 3 score mate 5 time 0 nodes 1557 nps 0 pv G*8f
info depth 3 score mate 5 time 30 nodes 2325 nps 77500 pv G*8f 9f9g 8f8g
info depth 4 score mate 5 time 30 nodes 2599 nps 86600 pv G*8f
info depth 4 score mate 5 time 40 nodes 4031 nps 100700 pv G*8f 9f9g 8f8g 9g9h
info depth 5 score mate 5 time 40 nodes 4900 nps 122500 pv G*8f
info depth 5 score mate 5 time 180 nodes 8305 nps 46100 pv G*8f 9f9g 8f8g 9g9h 8g8h
> stop
bestmove G*8f ponder 9f9g
```

詰まない場合はscore mateが出力されずにbestmoveが出力される。
詰む場合はscore mateが出力されるが、どれが完全な解かわからない。
最長マッチしたものが解か?
余詰め等考えると単に手数が長いだけでは十分ではない。むしろダメ。
一番短い手数のものを選ぶ必要があるが、過渡状態のものが含まれるので簡単ではない。
mate 5の5が手数だとするならば判別可能。moveの数と一致しているものが正解手順。

# gse
```
info time 1000 depth 3 nodes 63980 nps 63980 score cp -6618 pv G*8g 9f8e
info time 1000 depth 4 nodes 66029 nps 66029 score cp -6642 pv G*8g 9f8e 8g8f 8e9d 8f8e 9d9c
info time 1000 depth 4 nodes 70588 nps 70588 score cp 12994 pv G*8f 9f9g 8f8g 9g9h 8g8h 9h8i
info time 1000 depth 4 nodes 70588 nps 70588 score cp 12994 pv G*8f 9f9g 8f8g 9g9h 8g8h 9h8i
> stop
bestmove G*8f
```

なんでもbestmoveが返ってくる。
score mateも出ないし、詰んでるのか詰んでないのか判別不可能。
詰んでいるのにわけのわからない手が出力されている。

```
G*8f 9f9g 8f8g 9g9h 8g8h 9h8i
^^^^
```

# Spear
Spearの作者(Reijer Grimbergen氏)は将棋所の作者と繋がっており、
USIも将棋所の方にあわせてある模様。﻿
Swiftはじめたい...その４ いままでのまとめ Fizz Buzz やってみた。


# いままでのまとめでFizz Buzzやってみます。

+ これまで試したものを使えばFizz Buzzできるはずです。
+ https://ja.wikipedia.org/wiki/Fizz_Buzz

## いきなりコンパイルが終わらない...

+ メソッドチェーンで続けたらいきなりコンパイルが終わらなくなってしまいました。なんだこりゃ？？型推論のせい？？

## mapをつないでみた。

```swift:ちょっとかっこ悪いが...
let a1:[String] = (1...50).map { String($0) }
let a2:[String] = a1.map { ( Int($0)! % 3 == 0  && Int($0)! % 5 == 0 ) ? "Fizz Buzz" : $0 }
let a3:[String] = a2.map { ( Int($0) != nil && Int($0)! % 3 == 0 ) ? "Fizz" : $0 }
let a4:[String] = a3.map { ( Int($0) != nil && Int($0)! % 5 == 0 ) ? "Buzz" : $0 }
print(a4.joinWithSeparator(", "))
```

+ 最後は文字列配列にしたかったので文字列配列にしてます。
+ まだ if とか switch とかは試してないので使ってません。

```shell:結果です
1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, Fizz Buzz, 16, 17, Fizz, 19, Buzz, Fizz, 22, 23, Fizz, Buzz, 26, Fizz, 28, 29, Fizz Buzz, 31, 32, Fizz, 34, Buzz, Fizz, 37, 38, Fizz, Buzz, 41, Fizz, 43, 44, Fizz Buzz, 46, 47, Fizz, 49, Buzz
```

## まとめ

+ mapをつなげたら、なんでかコンパイルがやけに遅くなった。
PepperをBonjourサービスで探す

OSXの場合_dns-sd_コマンドを使います。

##サービスタイプ

サービスタイプは以下の２つのようです。

|サービスタイプ||
|:--|:--|
|\_nao._tcp|Pepper本体のみ|
|\_naoqi._tcp|バーチャルロボットも含む|

##探し方

```
> dns-sd -B _nao._tcp

Browsing for _nao._tcp
DATE: ---Sun 10 Jan 2016---
 0:50:04.697  ...STARTING...
Timestamp     A/R    Flags  if Domain               Service Type         Instance Name
 0:50:04.697  Add        2   4 local.               _nao._tcp.           pepper
^C
```

```
> dns-sd -B _naoqi._tcp

Browsing for _naoqi._tcp
DATE: ---Sun 10 Jan 2016---
 1:10:44.117  ...STARTING...
Timestamp     A/R    Flags  if Domain               Service Type         Instance Name
 1:10:44.118  Add        3  -1 local.               _naoqi._tcp.         MBP.local
 1:10:44.118  Add        2   4 local.               _naoqi._tcp.         pepper
^C
```

普通にpepper.localでアクセスできますが、IPを探したい場合はInstance Nameで検索することができます。

```
> dns-sd -q pepper.local

DATE: ---Sun 10 Jan 2016---
 0:49:32.685  ...STARTING...
Timestamp     A/R Flags if Name                          Type  Class   Rdata
 0:49:32.686  Add     2  4 pepper.local.                 Addr   IN     192.168.1.115
^C
```

ま、普通にPingしてもIP取得できるんですが、練習ということで。

```
> ping -c1 pepper.local 
PING pepper.local (192.168.1.115): 56 data bytes
64 bytes from 192.168.1.115: icmp_seq=0 ttl=64 time=7.123 ms

--- pepper.local ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 7.123/7.123/7.123/0.000 ms
```

## ごにょごにょ

どこにも具体的なサービスタイプの資料が無いのですが、以下のコードを参考にしました。
https://github.com/cgestes/ctafconf/blob/master/profile/aldebaran/bin/rlist
Linuxの場合はavahiというBonjour(mDNS)実装がありavahi-browseコマンドで同様に参照ができるようです。

資料が見つからなかったのでメモとして残しておきます。
非同期コマンドの完了を同期待ちする汎用関数

ベンダー製品付属のCLIを利用する時によくあるケースですが、非同期なサービス起動コマンドを実行した後に定期的にステータスを取得し、ステータス=処理完了が真になるまでループを回すことはよくありますが、そのようなサービス起動完了を同期待ちする汎用関数`sync_wait()`を実装してみました。

例えば、フェイルオーバー発生後の待機系ホストのサービス起動完了を同期待ちする用途などで使えそうです。

## バージョン

```shell-session:
$ bash --version
GNU bash, version 4.3.30(1)-release (i586-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
```

## sync_wait 関数の仕様

`sync_wait()`の第1引数には、サービス状態を判定するコールバック関数（`is_service_online`）を文字列リテラルで指定します。第2引数に指定した値が、コールバック関数の戻り値と一致するまで（=オンライン状態が検知されるまで）、本関数で同期待ちをします。第3引数に指定した秒数を超えてもオンライン状態が検知されない場合、タイムアウト発生とみなします。

```bash:libsample.sh
#!/bin/bash
set -u

#
# Wait until callback function returns expected status.
#
sync_wait()
{
    local callbackfn="$1"
    local status_expected="$2"
    local timeout_s="$3"
    local elapsed_s=0

    for((; ; elapsed_s++)){
        ${callbackfn}
        [[ $? -eq ${status_expected} ]] && return 0
        [[ ! ${elapsed_s} -lt ${timeout_s} ]] && break
        sleep 1
    }   
    return 1
}
```

## sync_wait 関数の使い方

```bash:sample.sh
#!/bin/bash
set -u

. ./libsample.sh
#
# Check if service is online.
#
is_service_online()
{
    # TODO : サービスの状態を取得するコマンドを実行し
    # TODO : その標準出力結果をawkとかでごりごり解析して
    # TODO : オンラインなら1、それ以外は0を返す処理をここに書く。
}

#
# Main
#
sync_wait "is_service_online" 1 10
status=$?
if [[ ${status} -ne 0 ]]; then
    echo "Timeout occurred. (${status})"
    exit 1
fi
echo "Service is online. (${status})"

#
# TODO : 後続処理
#

exit 0
```
IT女子のゼロから始めるIoTーステップ3: Raspberry pi2とNodejsで超音波距離センサーの値を取得する

[前回の投稿](http://qiita.com/aikumi/items/4714eb02244c65fa09a8)からの続きです！

前回はボタンとLEDをつなげて光らせるということを実施して、
GPIOの「in」と「out」を制御できました！

今回はその応用です。「in」と「out」のしくみを利用して、センサーとRaspberry piをつなぎそのセンサーの値を取得する、ということを実施しました。

# 習得できた知識
* 超音波距離センサーのしくみ
* Node.js 
    * process.nextTick([function])
        * イベントループの次以降のループで[]内で指定したfunctionを実行する
        * setTimeout([function],0)よりもはるかに早い！
    * process.hrtime()
        * 現在時刻を [seconds, nanoseconds] の配列で返す
        * 引数に、過去に取得した時刻をいれると差分がとれる
 
         ```lang:例
         var time = process.hrtime();
         var diff = process.hrtime(time);
         ```

# 用意したもの
* 前回と同様
* 超音波距離センサー(HC-SR04)

# まず超音波距離センサーの回路を理解する
* 超音波距離センサーの仕組み

1. outからinの時間を計る
2. 道のり= 時間/速さ に当てはめる
3. 距離が求められる！


![image](https://qiita-image-store.s3.amazonaws.com/0/76550/6344c9d6-e006-b90b-6203-ce78387e6d3d.png)

* つなぐ
    * センサーのピン4本を以下のようにつなぐ 
![20160109_235849.jpeg](https://qiita-image-store.s3.amazonaws.com/0/76550/b1f8ffbf-bddd-8f8b-dfe5-db5e931e4486.jpeg)

    * つないだ (27番ポート: in / 17番ポート: outとして使った)
![image](https://qiita-image-store.s3.amazonaws.com/0/76550/0087f191-57b2-9871-d8cb-345b2033ddc8.png)


# やりたいこと
* 「out」から「in」までの時間を測定するプログラムを作成したい！
    * 距離を測るアルゴリズム
    * 
![flow.png](https://qiita-image-store.s3.amazonaws.com/0/76550/d241bb0c-9dff-0f8b-fc17-59e6895f3b2f.png)


# 実行する

※ サンプルコードなのでこのまま書いても動きません

```lang:distance.js

// ポートを使う準備
var fs = require('fs');
・・・
(略)

// 27ポートの値を聞き続けるFunction
function kurikaesiFunc(){
    // 27ポートの値を取得
    var stdout = fs.readFileSync("/sys/class/gpio/gpio27/value");

    if(1 == stdout){
        // 1だった時はoutではかった時間との差分を取得する
        diff = process.hrtime(startTime);
        goalFunc(diffから距離を計算した値);
    } 
    process.nextTick(kurikaesiFunc); //くりかえし
};

// 非同期処理で呼び出すFunction
var outFunc = function(){
    // outに出力の命令を出す        
    // 時間を測る (process.hrtime()を使う)
};

// 距離を出力するFunction
var goalFunc = finction(distance){  
    console.log(distance)
};
```
上記のようなコードの流れでプログラムを実行する
値を取得できた！
→ まだ値が正確ではないので、もう少し精度向上を図る必要がありそう！
→ 完成したら更新しようと思います
IT女子のゼロから始めるIoTーステップ0: Raspberry pi2にNodejsの最新版をインストールする

「さあ、Raspberry Pi始めよう！！」
と思った時にnpmでのnodeモジュールのインストールがうまくいかない・・・という不具合が発生しました。
ここでたくさんの時間を費やしてしまったので、抜け出すまでにしたあれこれを記録したいと思います。

# 原因
インストールしたnode.jsのバージョンが低かった

# 対策
node.jsの最新バージョンをインストールする

# 試したこと3つ
* 1つめ：wgetで直接nodejsをダウンロードする
* 2つめ：Node.jsのバージョンを管理するためのマネージャnodebrewをインストールする
* 3つめ：「node-arm」というものを使ってインストール

# 1つめ
* [ここから直接ダウンロード](https://nodejs.org/download/)する
* wget  https://nodejs.org/dist/v0.12.7/node-v0.12.7-linux-x86.tar.gz
* 展開する
* /usr/local/ の下に展開したファイルを移動する
* 環境パスを通す
    * $ vi .bashrc
    * $ export PATH = /usr/local/node-v0.12.7-linux-x86/bin/:$PATH
* 設定ファイルの反映
    * $ source .bashrc
* -bash: /usr/local/node-v0.12.7-linux-x86/bin/node: cannot execute binary file
* と怒られる
* このバイナリは実行できない！とのこと
* 失敗した！

# 2つめ
* git.io/nodebrew をダウンロードしてきて、 即時実行
    * $ curl -L git.io/nodebrew | perl - setup
* エディタで"export PATH=$HOME/.nodebrew/current/bin:$PATH" を追加
    * $ vim .bashrc
    * $ source .bashrc
* インストールされてるか確かめる
    * $ nodebrew ls-remote    
* バージョンを指定してインストール
    * $ nodebrew install-binary v0.10.40
* → Error: Linux armv7l is not supported. at /home/pi/.nodebrew/current/bin/nodebrew line 722. となる。
* これも失敗！

# 3つめ (ここで成功！)
* [ここ](http://node-arm.herokuapp.com/)から最新のバージョンのnode.jsを直接インストールする
    * $ wget http://node-arm.herokuapp.com/node_latest_armhf.deb
    * $ sudo dpkg -i node_latest_armhf.deb
* これでできた！
    * $ node -v
    * で最新がダウンロードされていることを確認する
serversessionを使ってみた

[serversessionというライブラリがリリースされました :tada: ](http://blog.felipe.lessa.nom.br/?p=153)
これはサーバーサイドで管理するセッションを実装するためのライブラリです。今までも[wai-session](http://hackage.haskell.org/package/wai-session)や[Spock](http://hackage.haskell.org/package/Spock)などのようにそれぞれのフレームワーク向けに実装されたものはありましたが当然使い方がそれぞれ異なるという欠点がありました。しかし今後はserversessionを使うことで統一的に扱うことが出来るようになります。さらにserversessionはセッションのロジックを実装するところを**frontend**、セッションを管理するところを**backend**として分離しているので目的にあった技術を組み合わせて使うことが出来ます。今あるのは

* **frontend**
  * [serversession-frontend-yesod](https://hackage.haskell.org/package/serversession-frontend-yesod)
  * [serversession-frontend-snap](https://hackage.haskell.org/package/serversession-frontend-snap)
  * [serversession-frontend-wai](https://hackage.haskell.org/package/serversession-frontend-wai)
* **backend**
  * [serversession-backend-persistent](https://hackage.haskell.org/package/serversession-backend-persistent)
  * [serversession-backend-acid-state](https://hackage.haskell.org/package/serversession-backend-acid-state)
  * [serversession-backend-redis](https://hackage.haskell.org/package/serversession-backend-redis)

といったライブラリでこれらを好きに組み合わせて好きな構成でセッション機能を実装することが出来ます。今回はfrontendにwaiをbackendにredisを使って[wai-sessionのexample](https://github.com/singpolyma/wai-session/blob/master/example/Main.hs)を書きなおしてみました。

```hs
{-# LANGUAGE OverloadedStrings #-}

module Main where

import Control.Monad (when)
import qualified Data.Vault.Lazy as Vault
import Data.ByteString.Char8 (ByteString, pack)
import Data.ByteString.Lazy.Char8 (fromStrict)
import Data.Text (Text)

import Network.Wai
import Network.Wai.Session (Session)
import Network.Wai.Handler.Warp (run)
import Network.HTTP.Types (ok200)

import Web.ServerSession.Frontend.Wai (withServerSession)
import Web.ServerSession.Backend.Redis (RedisStorage(..))
import qualified Database.Redis as Redis

app :: Vault.Key (Session IO Text ByteString) -> Application
app session env = (>>=) $ do
  u <- sessionLookup "u"
  when (["favicon.ico"] /= pathInfo env) $
    sessionInsert "u" insertThis
  pure $ responseLBS ok200 [] (maybe "Nothing" fromStrict u)
   where
    insertThis = pack . show $ pathInfo env
    Just (sessionLookup, sessionInsert) = Vault.lookup session (vault env)

main :: IO ()
main = do
  key <- Vault.newKey
  conn <- RedisStorage <$> Redis.connect Redis.defaultConnectInfo
  session <- withServerSession key id conn
  run 3000 . session . app $ key
```

適当なパスのURLにアクセスするとアクセスするたびに前回アクセスしたパスが表示されるようなデモです。ブラウザが勝手に`/favicon.ico`を見に行くのでこれは記録しないように修正しています。
AndroidでC言語 teminal IDE

# Introduction

1. Terminal IDE app from GooglePlay store
2. Run the app
3. Tap `Install System`
4. Install system
5. Tap `Terminal IDE`
6. Enter `system/bin/install_gcc`
7. Enter `terminal-gcc --version`

If you can see `arm-eabi-gcc(GCC) [version number]`, that will be OK!

# Hello, Wold!

1. Enter `vim hello.c`
2. Code the following(hello.c)

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

int main(){
    puts("Hello, World!");
    return 0;
}
```

3. Enter `terminal-gcc -o hello hello.c`
4. Enter `./hello`

If you can see `Hello, World!`, you will be ok.
KoaでWeb開発: Webサーバの性能を比較してみよう


今回はとても**恣意的なエントリー**です。
目的は「Koaで開発しようぜ！」ってことなので。

# 概要

単純にちょっと待ち時間の発生するようなスクリプトを実行してみて、それによってかかる時間やメモリコストを実測しようという企画です。

## 比較対象

今回はKoaで構築するサーバとPHPer御用達のWEBサーバを比較対象としました。

1. Koaで作った非同期処理サーバ
2. Apacheを使ったオーソドックスなphpアプリ
3. Nginx + PHP-FPMを使ったサーバ

テストはローカルの仮想サーバで行い、各テストの後は一旦再起動しています。

## 方法

Macにはapache bench があるので、

```
$ ab -n 1000 -c 100 http://192.168.33.10/

```
こんな感じで計測し、動作サーバー上で

```
$ free -s 1
```
1秒毎にメモリ消費量を計測します。

apache benchでの計測パラメータは、-nと-cのパラメータを10倍変えています(リクエスト数 = 10 ☓ 同時接続数)。
計測数は, 10, 20, 100(, 1000)です。

## 処理内容

処理内容は、単純に「1.5秒待ってからhello worldを返す」という単純なものです。
詳しいコードは以下のとおりです

```app.js
'use strict'

const koa = require('koa');
const app = koa();

app.use(function* (){
  const x = yield new Promise(res => setTimeout(() => res(1), 1500));
  console.log(x);
  this.body = 'hello world';
});

app.listen(3000);
```

```index.php
<?php

usleep(1500000);

echo 'hello world';
```

# 結果

## Koa

| 同時接続数 | 平均レスポンス時間(ms) | メモリ使用量(KB) |
|:-----------:|:------------:|:------------:|
|10|1610.973|496|
|20|1613.035|1240|
|100|1606.868|9168|
|1000|1888.211|70060|

メモリ使用量は少々ゆらぎがあると思います。
レスポンス時間にほとんど1600msで収まっているところが特徴でしょう。
100msを接続にかけていると考えれば、実質各リクエストに処理の順番待が存在しなかったと考えていいと思います。
流石に1000同時接続だとレスポンスに影響が出ていますが、それでも300ms程度なので、それほど気にならないかもしれません。
メモリも70M程度で済んでいるようです。

## apache

| 同時接続数 | 平均レスポンス時間(ms) | メモリ使用量(KB) |
|:-----------:|:------------:|:------------:|
|10|1613.714|22244|
|20|1669.724|19812|
|100|2017.839|125952|

予想はできていましたが、やはりメモリの使用量が多いです。
また、同時接続数10での平均レスポンスは1.6sec程度ですが、実データの5%は2.5秒以上のレスポンス時間となっており、ある程度の遅延が発生しているようです
同様に、20接続だと、一部のレスポンスが2.5〜3.0secほどになっていました。
同時接続数100となると、幾つかのレスポンスは6秒を超えるようになります。それでも半分以上は正常にレスポンスを返せていました。
また、これ以上は接続数限界にも近づくようで、300接続も試せませんでした。

## nginx + php-fpm

| 同時接続数 | 平均レスポンス時間(ms) | メモリ使用量(KB) |
|:-----------:|:------------:|:------------:|
|10|1605.511|10976|
|20|1728.408|9312|
|100|3302.610|25436|
|300|9571.414|20000|


同時接続数20の時点で、レスポンスに少々影響が出ています。
実際の計測では、10%程度、大きく性能の落ちたリクエストがあるようです。
同時接続数が100の時、メモリについてはapacheに対して大きなアドバンテージを持っていますが、一方でレスポンスタイムに大きな性能低下が見られます。これはphp-fpmの子プロセスの個数による影響かと思います。
同時接続数300ではレスポンスが大幅に悪化し、リクエストがいくつか失敗していました。

# 考察

Koaというより、node.jsがそもそも大量同時接続に対応するように作られているだけあって、I/Oなどの非同期処理が処理時間の大部分を占めるアプリケーションであれば、想定通り大量アクセスをさばくことができます。
一方、apacheはプロセス作成によるメモリの消費量が大きいため、メモリについての不安があり、100接続程度でもレスポンスへの影響も出ていました。しかし、同時接続数100なんてのは相当多い数なので、案外堅牢なのかもしれません。
Nginx + php-fpm はちゃんとチューニングをやらないと性能が出ないように思います。php-fpm は予め最大の小プロセス数を決めているようで、おかげでメモリの消費量が制限できているように思えますし、一方で、同時処理数が少なくなって、結果的にNginxでの待ち時間が劇的に増えているように思います。

# まとめ

Koaを使う動機として、長い処理待ちがあり得るアプリに対する大量同時接続に強いという性質を確かめてみました。
また、Nginxでサーバ作るときはチューニング頑張らないといけないんだなぁと思いました。
CentOS 7.x 初期設定メモ

# 一般
## ユーザ/グループの作成 (if necessary)
```
# useradd {user name}
# passwd {user name}
# groupadd {group name}
# usermod -G {group name} {user name}
# cat /etc/group
```

## SELinuxの無効化
```
# getenforce
# setenforce 0
# vi /etc/sysconfig/selinux
```
```vim:/etc/sysconfig/selinux
SELINUX=disabled
```

## IPv6の無効化
```
# vi /etc/sysctl.conf
```
```vim:/etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
```
```
# sysctl -p
```

## 不要なサービスの停止
```
# systemctl stop NetworkManager
# systemctl disable NetworkManager
```

## 不要なサービスの削除
+ postfix
```
# systemctl stop postfix
# yum erase postfix
```

## パッケージの更新 (if necessary)
```
# yum -y update
```

# ネットワーク
## コマンド対応

|net-tools  |iproute2               |
|-----------|-----------------------|
|ifconfig   |ip a(addr), ip l(link) |
|route      |ip r(route)            |
|netstat    |ss                     |
|netstat -i |ip -s l(link)          |
|arp        |ip n(neighbor)         |

## インターフェースの確認
```
# ethtool {nicName}
```

## インターフェースの設定
```
# vi /etc/sysconfig/network-scripts/ifcfg-{NIC name}
```
```vim:/etc/sysconfig/network-scripts/ifcfg-*
DEVICE={NIC name}
TYPE=Ethernet
HWADDR={MAC Address}
BOOTPROTO=none
ONBOOT=yes
NM_CONTROLLED=no
IPV6INIT=no
IPADDR={IP address}
NETMASK={subnet mask}
GATEWAY={gateway IP address}
PEERDNS=no
```
```
# systemctl restart network
```

## 仮想インターフェースの設定
```
# vi /etc/sysconfig/network-scripts/ifcfg-{NIC name}:{id}
```
```vim:/etc/sysconfig/network-scripts/ifcfg-*
DEVICE={NIC name}:{id}
TYPE=Ethernet
BOOTPROTO=none
ONBOOT=yes
IPV6INIT=no
IPADDR={IP address}
NETMASK={subnet mask}```
```
```
# systemctl restart network
```

## スタティックルートの設定
```
# vi /etc/sysconfig/network-scripts/route-{NIC name}
```
```vim:/etc/sysconfig/network-scripts/route-*
192.168.0.0/24 via 192.168.0.254 dev eth1
default via 10.0.0.254 dev eth0
```
```
# systemctl restart network
# ip r
```

## [VLANの設定] (http://qiita.com/tomo_n/items/e99125ea5443a6d8449a)

## DNSの設定
```
# vi /etc/resolv.conf
```
```vim:/etc/resolv.conf
nameserver {IP address}
```
Android: shared_prefs 内容の確認


- 5.0 だと `adb exec-out` でファイル取り出せるようですが...
- とりあえず XMLをcatする
- XMLを json化して jq でクエリする

## bash alias

- tools.bash

~~~bash
# pip install xmltodict && sudo apt-get install jq
alias XJ='python -c "import xmltodict, json, sys; print json.dumps(xmltodict.parse(sys.stdin));"'

# shared_pref
alias PREF='adb shell "run-as ${DROID_PACKAGE} cat shared_prefs/${DROID_PACKAGE}_preferences.xml"'
~~~

~~~bash
$ source tools.bash
~~~

## string を取得

~~~
$ export DROID_PACKAGE=jp.lafoglia.droidmap
$ PREF | XJ | jq '.map.string["#text"]' -r

http://test.com:8000
~~~
.bat（バッチファイル）でライフゲーム（新）

　バッチファイルでライフゲームを作りました。

　作り直す前が[こちら](http://qiita.com/sawa_tsuka/items/8992aa9cf7ffbf39839b)

　**縦横の大きさ、壁の有無が選択可能**（壁無しだと上下左右が反対側にループする、ドラ○エの地図みたいな）です。
　また、**固定物体だけになるか全セルが死滅すると停止**するようになっています。
　振動子については調査すると重くなるので停止機能はありません。

　初期状態は乱数です。0と1で初期状態を書いた**txtをこのバッチの上にドラッグ＆ドロップすると、その状態から始めることができます。**

　Stepは世代、Wallは壁の有無です。総セル数が大きくなるとかなり時間を要するようになります。縦横ともに20くらいが限界かと思われます。

　実行例↓
![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/52542/2b87fe4b-183a-d428-9227-957b99725452.png)

```bat:LifeGame.bat
@echo off
setlocal enabledelayedexpansion

:Initialize
if "%1" neq "" goto LoadFile
set /p cellx="セル数（横）を指定してください。"
set /p celly="セル数（縦）を指定してください。"
for /l %%i in (1,1,%celly%) do for /l %%j in (1,1,%cellx%) do set /a cell[%%j][%%i]=!random!%%2

:Initialize2
set /p wall="壁無しなら０、壁有りなら１を指定してください。"
set /a step=0,overx=cellx+1,overy=celly+1
for /l %%i in (1,1,%celly%) do set /a cell[0][%%i]=0,cell[%overx%][%%i]=0
for /l %%i in (0,1,%overx%) do set /a cell[0][%%i]=0,cell[%overy%][%%i]=0
goto Main

:LoadFile
for /f %%i in (%1) do (
	set /a celly+=1
	set text[!celly!]=1%%i
)
set text=%text[1]:~1%
for /l %%i in (1,1,100000) do (
	set cellx=%%i
	set text=!text:~1!
	if "!text!" == "" (
		for /l %%j in (1,1,%celly%) do for /l %%k in (1,1,!cellx!) do set cell[%%k][%%j]=!text[%%j]:~%%k,1!
		goto Initialize2
	)
)

:Main
call :DrawCell
call :Calc
call :SetCell
goto Main

:Calc
rem loopx,loopyに計算対象の座標を代入
set /a loopy+=1
if %loopy% gtr %celly% set /a loopx+=1,loopy=0& goto Calc
if %loopx% gtr %cellx% exit /b
rem 対象の上下左右の座標をそれぞれyd,yi,xd,xiに代入。tempcellに太陽の座標の現在の値を代入。
set /a xd=loopx-1,xi=loopx+1,yd=loopy-1,yi=loopy+1,tempcell=cell[%loopx%][%loopy%]
rem 壁無しならxd,xi,yd,yiを反対側に置換
if %wall% == 0 (
	if %xd% == 0 set xd=%cellx%
	if %xi% == %overx% set xi=1
	if %yd% == 0 set yd=%celly%
	if %yi% == %overy% set yi=1
)	
rem ムーア近傍のセルの数値を全て足す。
set /a mooresum=cell[%xd%][%yd%]+cell[%loopx%][%yd%]+cell[%xi%][%yd%]+cell[%xd%][%loopy%]+cell[%xi%][%loopy%]+cell[%xd%][%yi%]+cell[%loopx%][%yi%]+cell[%xi%][%yi%]
rem 死亡で周囲が３なら誕生、生存で周囲が２か３以外なら死亡をtempcellに代入する。
if %tempcell% == 0 if %mooresum% == 3 set tempcell=1
if %tempcell% == 1 if %mooresum% neq 2 if %mooresum% neq 3 set tempcell=0
rem 最後に、tempcell[][]にtempcellを代入。
set tempcell[%loopx%][%loopy%]=%tempcell%
goto Calc

:SetCell
rem tempcellの中身をcellに転写
for /l %%i in (1,1,%celly%) do for /l %%j in (1,1,%cellx%) do set /a cell[%%j][%%i]=tempcell[%%j][%%i]
exit /b

:DrawCell
rem 表示。前回と今回が全く一緒ならpause-exit
cls
set /a prevstep=step,step+=1,loopx=1,loopy=0,same=0
echo Step=%step%,Wall=%wall% X%cellx%*Y%celly%
echo.
for /l %%i in (1,1,%celly%) do (
	for /l %%j in (1,1,%cellx%) do (
		if !cell[%%j][%%i]! == 0 (
			set line[%step%][%%i]=!line[%step%][%%i]!□
		) else set line[%step%][%%i]=!line[%step%][%%i]!■
	)
	echo !line[%step%][%%i]!
	if !line[%step%][%%i]!0 == !line[%prevstep%][%%i]!0 set /a same+=1
	
)
if %same% == %celly% goto Finish
if %step% == 1 echo 初期状態& pause >nul
exit /b

:Finish
echo 固定物体のみになるか、全セルが死亡しました。
pause >nul
exit
```
PDOでPostgresSQLを使おうとしたら'could not find driver'というエラーが出た

プログラムを実行したところ「PDOのPostgreSQLのドライバーがないよ」というエラーが出ました．

```
$ php test.php
Error: Uncaught exception 'PDOException' with message 'could not find driver'
```

##ドライバのインストール
`php -i` でPostgreSQLがあるかを確認
 
```
$ php -i | grep pdo
PHP Warning:  Module 'json' already loaded in Unknown on line 0
/etc/php.d/pdo.ini,
/etc/php.d/pdo_mysql.ini,
/etc/php.d/pdo_sqlite.ini,
PHP Warning:  Unknown: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in Unknown on line 0
pdo_mysql
pdo_mysql.default_socket => /var/lib/mysql/mysql.sock => /var/lib/mysql/mysql.sock
pdo_sqlite
```

ない．

yum でインストール
（yumパッケージがphpのバージョン（もしくはOSのバージョン）によって異なることがあるようです）

```
$ yum install php-pdo_pgsql
```

## pg_hbaファイルでlocalhostを許可
localhostの接続を変更していない場合は，以下のように変更します．

```
$ vi /var/lib/pgsql/9.5/data/pg_hba.conf
```

```
# IPv4 local connections:
host    all             all             127.0.0.1/32            peer
# IPv6 local connections:
host    all             all             ::1/128                 ident
```

localhostを許可するようにします
以下のように変更

```

# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 md5

```

これで通りました．


##参考
[PostgreSQL（Postgres Toolkit）　pg_hba.confファイルの設定　ユーザ”postgres”のIdent認証に失敗しました ](http://show-surumegohan.blogspot.jp/2015/06/postgresqlpostgres-toolkitpghbaconfpost.html)
[Do I have to recompile PHP for adding Postgres PDO support?](https://www.centos.org/forums/viewtopic.php?f=20&t=53221)
CentOS VLAN設定メモ

```
# yum install vconfig
# vi /etc/sysconfig/network
```
```vim:/etc/sysconfig/network
VLAN=yes
VLAN_NAME_TYPE=DEV_PLUS_VID_NO_PAD
```

|設定内容              |表記      |
|---------------------|----------|
|VLAN_PLUS_VID        |vlan0010  |
|VLAN_PLUS_VID_NO_PAD |vlan10    |
|DEV_PLUS_VID         |eth0.0010 |
|DEV_PLUS_VID_NO_PAD  |eth0.10   |

```
# vi /etc/sysconfig/network-scripts/ifcfg-{NIC name}
```
```vim:/etc/sysconfig/network-scripts/ifcfg-*
DEVICE={NIC name}
TYPE=Ethernet
HWADDR={MAC Address}
BOOTPROTO=none
ONBOOT=yes
IPV6INIT=no
```

```
# vi /etc/sysconfig/network-scripts/ifcfg-{NIC name}.{vlan id}
```
```vim:/etc/sysconfig/network-scripts/ifcfg-*
DEVICE={nic device name}
TYPE=Vlan
BOOTPROTO=none
ONBOOT=yes
IPV6INIT=no
IPADDR={IP address}
NETMASK={subnet mask}
```
```
# service network restart (または systemctl restart network)
# less /proc/net/vlan/config
```
UbuntuにRuby on Rails4.2

# Gitインストール
# 各種パッケージインストール
curl g++ zlib1g-dev libssl-dev libreadline-dev libyaml-dev libxml2-dev libxslt-dev
sqlite3 libsqlite3-dev nodejs
#rbenvインストール
```
git clone git://github.com/sstephenson/rbenv.git .rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
exec $SHELL
```
# ruby-buildインストール
```
mkdir -p ~/.rbenv/plugins
cd ~/.rbenv/plugins
git clone git://github.com/sstephenson/ruby-build.git
```
> アップデートは、ruby-buildで`git pull`して`sudo ./install.sh`
# rubyインストール
```
> rbenv install 2.3.0
> rbenv global 2.3.0
```
最新` rbenv install -l | grep -v -`で確認
# 設定確認
`rbenv version`でバージョン
'which ruby'でパス
> /home/"自分のフォルダ"/.rbenv/shims/ruby
'ruby -v`
# .gemrc作成
```lang:~/.gemrc
install: --no-ri --no-rdoc
update: --no-ri --no-rdoc
```
# Ruby on Rails 4.2インストール
```
gem install rails --version="~> 4.2"
rbenv rehash
```
# 作業フォルダ作成
適当なフォルダ。以降、workということで

# 動作確認アプリ作成
作業フォルダworkで作業。
アプリケーションはfooということで
```
rails new foo --skip-bundle
```
フォルダfooで作業
## 依存パッケージインストール
```
bundle install
```
## ユーザー管理機能作成
```
rails g scaffold user name:string email:string
rake db:migrate
```
## アプリケーション起動
```
rails s
```
##動作確認
> http://localhost:3000/users
AKAZEによる特徴点検出を試してみた

![akaze.png](https://qiita-image-store.s3.amazonaws.com/0/105738/ff4fffb0-2335-1d0f-1758-4ef0a5277e5c.png)

#環境
ubuntu 14.04 64bit
OpenCV 3.1.0 + Contrib 3.1.0
#AKAZE
OpenCV 3.0から提供された特徴点検出の手法である。
[モジュールの説明はここ](http://docs.opencv.org/master/d8/d30/classcv_1_1AKAZE.html#gsc.tab=0)
[またAKAZEを使用した特徴点マッチングのチュートリアルはここ](http://docs.opencv.org/3.1.0/db/d70/tutorial_akaze_matching.html#gsc.tab=0)
ただし、コードの説明が古いAPIなので注意が必要。

#サンプルコード
特徴点検出と描画のところのみ記述する

```
cv::Ptr<cv::AKAZE> akaze = cv::AKAZE::create();
std::vector<cv::KeyPoint> keypoints;
akaze->detect(gimage, keypoints);
cv::drawKeypoints(image, keypoints, image);
```

冒頭の画像は、いつものlena.jpgの特徴点を検出したものである。

#参考
thorikawa氏の[AKAZE特徴量の紹介と他特徴量との比較](http://poly.hatenablog.com/entry/2014/01/06/063012)は、いろいろ参考になる。　　
3.1の実装では、並列化はどうなっているか気になる。
reduxの@connectをデコレーター構文そのままにテストする(webpackの場合)

## 問題

react-reduxの[@connect](https://github.com/rackt/react-redux/blob/master/docs/api.md#connectmapstatetoprops-mapdispatchtoprops-mergeprops-options)が定義された要素をテストしようとすると、
以下の様なエラーになって実行する事が出来ません。

```js
// こんな感じのクラス
@connect
export defautl class Hoge() {
}
```

> Invariant Violation: Could not find "store" in either the context or props of "Connect(Login)". Either wrap the root component in a <Provider>, or explicitly pass "store" as a prop to "Connect(Login)".

## 対策(公式)

これはリファレンスの[Writing Tests](http://rackt.org/redux/docs/recipes/WritingTests.html)でも言及されていて、
decoratorを外して、connectされていないオブジェクトをテストする事を推奨されています。

```js
// In order to be able to test the App component itself without having to deal with the decorator,
// we recommend you to also export the undecorated component:

import { connect } from 'react-redux'

// Use named export for unconnected component (for tests)
export class App extends Component { /* ... */ }

// Use default export for the connected component (for app)
export default connect(mapDispatchToProps)(App)
```

*＃ 上記の例であれば`class App`に対してテストする*

## 反論
いや、せっかくのdecorator構文を外したくないです。
テストの為にプロダクトコードを改変する事は必要な場合もあると承知していますが、これはちょっとイヤです。

## 結論
というわけで、webpackを使っているので手っ取り早くexternalを使って逃げます。

私の場合は`karma.config.babel.js`の`webpack.externals`を以下のように弄ります。

```js
    externals: [
      {
        "react-redux": "{ connect: (con) => con }"
      }
    ]
```

ちゃんとmock化してもいいのですが、react-reduxのAPIはProviderとconnectしかないのでとりあえずはこれで満足です。

以上です。