OmniAICreator/Qiita-1.07M huggingface dataset:
ジャバ、名前

ジャバでパッケージの名前空間を考えたり、クラスやフィールド、メソッドの名前を考えたりするときに自分が考えたことのメモ。

プログラミングについてよく分かってないので、アドバイスとか意見とかあれば歓迎です。

## パッケージ、クラス

`TilyEvaluator` というライブラリがあるとする。`TilyEvaluator` にはメインのエバリュエーターと、それを実現するためのさまざまなマッチャ、エクスプレッション、ユーティルなどが存在している。

### ルビーの場合

自分が慣れ親しんだルビーの場合はこんな感じのファイル構造にすると思う。

```
lib/
  |- tily_evaluator.rb
  `- tily_evaluator/
       |- matcher.rb
       |- matcher/
       |    |- one.rb
       |    `- another.rb
       |- expression.rb
       |- expression/
       |    |- one.rb
       |    `- another.rb
       |- util.rb
       `- util/
            |- one.rb
            `- another.rb
```

コードにするとこんな感じ。

```
class TilyEvaluator
  class Matcher
    class One
    end

    class Another
    end
  end

  class Expression
    class One
    end

    class Another
    end
  end

  class Util
    class One
    end

    class Another
    end
  end
end
```

### ジャバの場合

ジャバの場合だったらこんな感じにすると思う。ジャバはパッケージ名前空間が必要だから、ここでは仮に `tokyo.prgrphs.evaluator.*` としている。



```
src/
  `- main/
       `- java/
            `- tokyo/
                 `- prgrphs/
                      |- evaluator/
                           |- TilyEvaluator.java
                           |- matcher/
                           |    |- AbstractTilyMatcher.java
                           |    |- OneTilyMatcher.java
                           |    `- AnotherTilyMatcher.java
                           |- expression/
                           |    |- AbstractTilyExpression.java
                           |    |- OneTilyExpression.java
                           |    `- AnotherTilyExpression.java
                           `- util/
                                |- OneTilyUtil.java
                                `- AnotherTilyUtil.java
```

パッケージの名前空間と、クラス名の名前空間を両方意識する必要があると思っている。

パッケージの名前空間は、そのままで `tokyo.prgrphs.evaluator.*` 配下のファイル構造。

クラス名の名前空間というのは、クラス名にあまりにも普遍的な名前 (たとえば `String` とか `Pattern` とか `List` とか) をつけてしまうと、標準ライブラリの名前と衝突してしまうこと。

衝突してしまってもエラーは出ないんだけど、import はできず、クラスを参照するときに名前空間をつけなくてはならなくなる。

```
prgrphs.tokyo.evaluator.util.String str = new prgrphs.tokyo.evaluator.util.String();
```

とかやらなくてはならないのでできる限り回避したい。(オープンソースでライブラリを提供する場合とかは特に回避したいと思う)。
MacでSCPコマンドを使ってAWSのディレクトリごとダウンロード。

サーバーのログイン情報(IPアドレス、ユーザー名)とhoge.ppkを渡されてMacでどうにかしたメモです。

## .ppkファイルから.pemファイルへ変換

brewでputtyをインストール。
<pre>brew install putty</pre>

hoge.pemファイルのあるところへ移動。
<pre>cd ~/Downloads</pre>

以下コマンドでpkkファイルを基に新しくpemファイルが作成される。
<pre>puttygen hoge.ppk -O private-openssh -o hoge.pem</pre>

## SSH設定
ターミナルから簡単に接続できるように設定します。

hoge.pemはユーザー直下の.sshに設置します。
<pre>mv hoge.pem ~/.ssh/hoge.pem</pre>

<pre>vi ~/.ssh/config</pre>

追記します。

```lang:~/.ssh/config
Host hogesite
HostName XX.XX.XXX.XXX
IdentityFile ~/.ssh/hoge.pem
Port 22
User username
```

Hostは任意
HostNameはIPアドレス
IdentityFileは先ほど作成した秘密鍵の場所
Portはポート番号指定
Userはユーザー名

以下コマンドでSSH接続できます。
<pre>ssh hogesite</pre>

## SCPコマンドでディレクトリごとローカルに落とす方法
FTPが使えない場合などにとりあえず使えます。

以下コマンドでローカルのデスクトップにサーバーのpublic配下のファイルを再帰的にごっそり落とせます。
<pre>scp -r -i ~/.ssh/hoge.pem -P 22 username@XX.XX.XXX.XXX:/var/www/public /Users/niiyz/Desktop</pre>
Sails.js に定時にバッチ処理を行わせる

Sails の便利な機能や自分が作った Model を使ってバッチ処理を定期的にやりたいとかありますよね。

同じことを考えた人たちが既に何人かいて、[Issue に投稿](https://github.com/balderdashy/sails/issues/2092)してたりしてるんですが、本家に採り入れられるまでには至ってません。
（「誰か Pull Request 送ってくれれば採用するよ」と言ってますが、今のところ誰もやってない。残念）

色々書き方はあるようですが、できるだけ Sails の素直なスタイルで最小限に書ける方法をここでは紹介します。

## 必要な NPM パッケージをインストール

定時実行と言えば UNIX システムの cron が思い浮かびますが、OS の機能に依存するのはイケてません。Node のサーバは常に起動されているはずなので、Node に実行してもらいましょう。

[node-cron](https://github.com/ncb000gt/node-cron) という NPM パッケージを使います。タイムゾーン指定に [node-time](https://github.com/TooTallNate/node-time) も必要なので、併せてインストールします。

```bash
$ npm install cron --save
$ npm install time --save
```


## config/crontab.js を作成

`config/` ディレクトリに `crontab.js` というファイルを作成して、そこにタイムテーブルと実行したい処理を JSON 形式で記述します。

```js:config/crontab.js
module.exports.crontab = {

  "*/10 * * * *": function hoge() {
    // 10分ごとに /tmp/hoge-{NOW}.txt ファイルを作成する
    var fs = require('fs');
    var file = '/tmp/hoge-' + Date.now() + '.txt';

    fs.writeFile(file, Date.now(), function(err) {
      if (err) {
        sails.log.error("Hoge file writing error occured.");
        throw err;
      } else {
        sails.log("Hoge file has been wrote successfully.");
      }
    });
  },

  "0,15,30,45 * * * *": function piyo() {
    // 15分ごとに /tmp/piyo-{NOW}.txt ファイルを作成する
    var fs = require('fs');
    var file = '/tmp/piyo-' + Date.now() + '.txt';

    fs.writeFile(file, Date.now(), function(err) {
      if (err) {
        sails.log.error("Piyo file writing error occured.");
        throw err;
      } else {
        sails.log("Piyo file has been wrote successfully.");
      }
    });
  }
}
```

タイムテーブルの書式は UNIX システムの cron と同じで以下の通り。

分|時|日|月|曜日
---|---|---|---|---|---
|0-59|0-23|1-31|1-12|0-7|

詳しくは [crontab の man](http://crontab.org/) 等を参照のこと。


## config/bootstrap.js で登録

`config/bootstrap.js` は Sails 起動時に実行したい処理を書いておくためのファイルですが、ここで `crontab.js` に記述されたジョブを登録するようにします。

```js:config/bootstrap.js
module.exports.bootstrap = function(cb) {

  cb();

  // Register cron jobs
  var CronJob = require('cron').CronJob;
  var jobs = sails.config.crontab;

  for (table in jobs) {
    if (typeof table === 'string') {
      new CronJob(table, jobs[table], null, true, 'Asia/Tokyo');
    }
  }
```

これで、`sails lift` すると、`config/crontab.js` に記述された処理が定時実行されます。

なお注意点として、タイムテーブルの文字列を JSON のキーにしているため、同じタイムテーブルの処理を `config/crontab.js` に並べて記述すると、先に書いたものが上書きされてしまいます。同じタイムテーブルで実行したい処理がある場合は、まとめて書いておきましょう。

```js:crontab.jsのダメな例
module.exports.crontab = {
  "0 9 * * *": function hoge() { /** hogeの処理 **/ }, // 上書きされる
  "0 9 * * *": function piyo() { /** piyoの処理 **/ }
}
```


## もうちょっと整理して書くには

上の例では `crontab.js` に処理を直書きしてますが、もうちょっと整理して書きたい場合は、処理そのものは `api/services/` に書いて、`crontab.js` ではそれをコールするだけというようにすると、すっきりした構造になります。
korw

マスク付きvpandd(http://qiita.com/tanakmura/items/0838f0244bd93cc7a2b6 )で書いたようにAVX-512では、多くの命令にマスクが付けられます。

C言語上では、\__mmask16 は、unsigned shortのtypedefになっているようですが、機械語上は、マスクの値は汎用レジスタではなく、k0-k7 という別のレジスタに入れられます。k0-k7 はAVX512Fでは、16bit、AVX512BW拡張が入っていれば64bitのレジスタです。

AVX2 までは、比較結果は、ベクタレジスタに入れられるようになっていましたが、AVX-512では、比較結果などは、このマスクレジスタに入るようになります。

```cpp
#include <immintrin.h>
#include <stdio.h>

double in0[8] = {1,2,3,4,5,6,7,8};
double in1[8] = {1,2,1,2,5,6,5,6};
double in2[8] = {2,2,4,4,6,6,8,8};

int
main()
{
    __m512d v0 = _mm512_loadu_pd(in0);
    __m512d v1 = _mm512_loadu_pd(in1);
    __m512d v2 = _mm512_loadu_pd(in2);

    __mmask8 cmp0 = _mm512_cmp_pd_mask(v0, v1, _CMP_EQ_OQ);
    __mmask8 cmp1 = _mm512_cmp_pd_mask(v0, v2, _CMP_EQ_OQ);

    printf("%x\n", cmp0);
    printf("%x\n", cmp1);

}
```

```
 $ ./sde  -- ./a.out 
33
aa
```
\__mmask16 値はC言語上は、スカラ値と同じように扱えるようですが、普通に使うと汎用レジスタに入れるためのkmovという命令が入ります。


```cpp
#include <immintrin.h>
#include <stdio.h>

double in0[8] = {1,2,3,4,5,6,7,8};
double in1[8] = {1,2,1,2,5,6,5,6};
double in2[8] = {2,2,4,4,6,6,8,8};

int a;

int
main()
{
    __m512d v0 = _mm512_loadu_pd(in0);
    __m512d v1 = _mm512_loadu_pd(in1);

    __mmask8 cmp0 = _mm512_cmp_pd_mask(v0, v1, _CMP_EQ_OQ);

    a = cmp0;
}
```

```gas
main:
.LFB2245:
	.cfi_startproc
	vmovupd	in0(%rip), %zmm0
	vmovupd	in1(%rip), %zmm1
	vcmppd	$0, %zmm1, %zmm0, %k1
	kmovw	%k1, %eax                # k1 → eax へ転送
	movzbl	%al, %eax
	movl	%eax, a(%rip)
	ret

```

マスク値を加算したりすることはあまり無いかもしれませんが、条件が複数あるときなどは、論理和、論理積が欲しい場合はそれなりにあると思います。


このとき、いちいち汎用レジスタに入れたり出したりするのは無駄があるような気がしますね。なので、マスクレジスタだけで、いくらかの論理演算ができるようになっています。


korwは、ふたつのマスクレジスタの16bit論理和をとります。

```cpp
#include <immintrin.h>
#include <stdio.h>

double in0[8] = {1,2,3,4,5,6,7,8};
double in1[8] = {1,2,1,2,5,6,5,6};
double in2[8] = {2,2,4,4,6,6,8,8};

double out[8];

void
dump_bits8(__mmask8 a)
{
    for (int i=0; i<8; i++) {
        if (a & (1<<(7-i))) {
            putchar('1');
        } else {
            putchar('0');
        }
    }
    puts("");
}

int
main()
{
    __m512d v0 = _mm512_loadu_pd(in0);
    __m512d v1 = _mm512_loadu_pd(in1);
    __m512d v2 = _mm512_loadu_pd(in2);

    __mmask8 cmp0 = _mm512_cmp_pd_mask(v0, v1, _CMP_EQ_OQ);
    __mmask8 cmp1 = _mm512_cmp_pd_mask(v0, v2, _CMP_EQ_OQ);


    dump_bits8(cmp0);
    dump_bits8(cmp1);
    dump_bits8(_mm512_kor(cmp0,cmp1));
}
```

```
 $ ./sde  -- ./a.out 
00110011
10101010
10111011
```


以下のようなプログラムを書けば、無駄な転送が減っていることが確認できますね。


```cpp
#include <immintrin.h>
#include <stdio.h>

double in0[8] = {1,2,3,4,5,6,7,8};
double in1[8] = {1,2,1,2,5,6,5,6};
double out[8];
int a;

int
main()
{
    __m512d v0 = _mm512_loadu_pd(in0);
    __m512d v1 = _mm512_loadu_pd(in1);
    __mmask8 cmp0 = _mm512_cmp_pd_mask(v0, v1, _CMP_EQ_OQ);
    __mmask8 cmp1 = _mm512_cmp_pd_mask(v0, v1, _CMP_LT_OQ);
    __mmask8 cmpor = _mm512_kor(cmp0, cmp1);

    _mm512_mask_storeu_pd(out, cmpor, v0);
}
```

```gas
main:
.LFB2229:
	.cfi_startproc
	vmovupd	in0(%rip), %zmm1
	xorl	%eax, %eax
	vmovupd	in1(%rip), %zmm0
	vcmppd	$0, %zmm0, %zmm1, %k2
	vcmppd	$17, %zmm0, %zmm1, %k1
	korw	%k2, %k1, %k1
	vmovupd	%zmm1, out(%rip){%k1}
	ret
```


明日は、@tanakmura が kortestw について書きます。
シェルの $0 とsymlinkの合わせ技でコマンドを簡略化する

## $0 の挙動
シェルの `$0` は、symlink越しで呼ばれた場合はsymlinkの名前に置き換わる

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

echo `basename $0`
```

このa.shをPATHの通ったディレクトリに配置し、そのまま実行すると`a.sh`と表示される

このスクリプトに対して、同じくPATHの通ったディレクトリへ`ln -s a.sh b`とsymlinkを張り b を実行すると`b`と表示される。

これを応用すると諸々のコマンド実行を簡略化する事が出来る

## 例

`ssh USER@server1`というssh接続コマンドを`server1`とサーバー名を入力するだけで実現する。

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

ssh USER@`basename $0` $*
```
```bash
$ ln -s dossh.sh server1
```

dossh.sh にはssh接続コマンドを記述し、サーバー名は`basename $0`で受ける。このスクリプトをPATHが通ったディレクトリに置く。これに対して同じくPATHが通ったディレクトリに __サーバー名(=server1)でsymlinkを張る。__

これで`server1`と入力するだけでserver1へのssh接続を実行することが出来る。

自分の場合以前は愚直にaliasを個別に切るという事をしていたのだが、この手法の方が管理もスッキリするし、諸々応用も効くのでオススメ

## ブクマ
* [Hack #67. Turbo-mode ssh Logins - Linux Server Hacks](https://www.safaribooksonline.com/library/view/linux-server-hacks/0596004613/ch06s03.html)
Love:2Dゲームエンジンその2



02:png画像表示まで
環境：Mac OSX 10.7.5 Love2Dインストール済み。

ファイル配置
作業ディレクリに以下を配置。

![kobito.1418562225.257699.png](https://qiita-image-store.s3.amazonaws.com/0/33317/e51e9610-b323-b074-b3d0-63990462fa7c.png "kobito.1418562225.257699.png")

main.lua

```lua:main.lua
--load Image
function love.load()
   gpz = love.graphics.newImage("gpz.png")
   --width = gpz:getWidth()
   --height = gpz:getHeight()
   w650 = love.graphics.newImage("w650.png")

end
--draw
function love.draw()
	love.graphics.setColor(0, 255, 123);
 	love.graphics.print("I love2d and my Bikes", 10, 10)
 	love.graphics.draw(gpz, 30, 30)
 	love.graphics.draw(w650, 300, 300,0,0.5,0.5)
end
```
pngはお好みで

作業ディレクトリより、以下コマンドを発行

```Terminal:cmd
zip -r ../${PWD##*/}.love *
```

実行するとこんな感じです。

![kobito.1418563465.363662.png](https://qiita-image-store.s3.amazonaws.com/0/33317/9aad0819-0a35-c113-37ef-3fe9704e2ecd.png "kobito.1418563465.363662.png")
gccをwindowsで使うならstd::random_deviceを使ってはいけない

gccのstd::random_deviceはwindowsではmt19937、linuxまたはosxでは/dev/urandomを使っています。
mt19937を使う場合、シードはtokenパラメータで決めます。
std::random_device("mt19937")ならシードは5489に固定され、
std::random_device("12345")ならシードは12345になります。
でもtokenを数値にすると一部のシステムで例外がスローされます。

結論からするとstd::random_deviceは使わないのが吉です。
最初からmt19937を使うか、自分でラッパー関数を書くかにするべきです。

ソースコード
https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/src/c%2B%2B11/random.cc
https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/tr1/random.h

ちなみにlibc++はrand_sを使っています。
https://github.com/llvm-mirror/libcxx/blob/master/src/random.cpp
Arduino Esploraのジョイスティックでサーボを動かす

ArduinoのAdvent Calendarを見つけたので、飛び入りで参加します。

http://www.adventar.org/calendars/348

Arduino Esploraはセンサー全部載せのArduino。ちょっと値が張りますが、センサーが載ってるだけでなく、ソフトウェアも書きやすいという特徴もあります。

![](http://farm9.staticflickr.com/8069/8209014766_1b5a58e3c2_c.jpg)

私が作った[マシュマロ・カタパルト](http://matome.naver.jp/odai/2135321780835381201)もそうですし、[Maker Faire Tokyoでスイッチ・サイエンスさんが展示してた超音波スピーカー](http://mag.switch-science.com/2014/11/28/mft2014_demo_list/)でも使われてましたが、Esploraのジョイスティックとサーボの相性は抜群なので、簡単な作り方を紹介します。

## ジョイスティックの値を読む

ジョイスティックは秋月とかで手に入らなくもないですが、綺麗に基板に乗っててくれてる上に、[ライブラリのサンプル](http://arduino.cc/en/Reference/EsploraReadJoystickX)のように、setup()でピン指定を指定せずにスッキリと使えます。

```c
void loop(){
    int value = Esplora.readJoystickX();
    Serial.println(value);
    delay(1000);
}
```


# Output Tinkerkit Connectorsでサーボを動かす

Tinkerkitというのは、Arduinoでセンサやスイッチを簡単に扱える規格です。こういうキットもあって、センサ全部載せなEsploraを、さらに拡張できるわけです。

[https://www.switch-science.com/catalog/681/](https://www.switch-science.com/catalog/681/)

ただ、Tinkerkitって、あんまりはやってみたいなので、自分でコネクタとかを使って引き出す必要があります。私はチキンなので秋葉原のガード下で店員さんに確認してもらいましたが、MXJ 5051と刻印があったので、このコネクタと思います。

http://www.monotaro.com/p/0856/0666/

コネクタだけでなく、金具も買うのを忘れないように。

http://www.monotaro.com/p/0856/0745/

ピン番号ですが、基板のシルクにD3,D11と書かれてます。[回路図(PDF)](http://arduino.cc/en/uploads/Main/arduino-esplora-schematic.pdf)でも確認できます。

Arduino公式のサーボライブラリのサンプルを参考に配線し、ピン番号を書き換えて、ジョイスティックの値を流し込めば、ジョイスティックに合わせてサーボを動かせます。

http://arduino.cc/en/Tutorial/Sweep

スケッチはこちら。

```c
#include <Servo.h>
#include <Esplora.h>

Servo myservo;
int pos = 0;
int servoPin = 11;

void setup(){
  myservo.attach(servoPin);
}

void loop(){
  pos = map(Esplora.readJoystickX(),0,1023,0,180);
  myservo.write(pos);
}
```
Rubyでchannel使ってSSHする

Rubyでchannel使ってSSHしたいので。メモ。

```
#coding: utf-8

require 'net/ssh'

Net::SSH.start('host', 'user', :password => 'pass') do |ssh|

  ssh.open_channel do |channel|

    channel.on_data do |ch, data|

      #標準出力
      puts data

    end

    channel.on_extended_data do |ch, type, data|

      #標準エラー
      p data

    end

    channel.send_channel_request "shell" do |ch, success|

      if success

        ch.send_data("ld\n") #標準エラーから出力される
        ch.send_data("ls\n") #標準出力から出力される
        ch.process
        ch.eof!

      else

        p "channel request error"
      end

    end

    channel.on_request "exit-status" do |ch, data|

      #終了ステータス
      p data.read_long

    end

  end

  ssh.loop

end
```
ActiveScaffoldでreadonly属性を作る

管理画面を作るとき便利な[ActiveScaffold](https://github.com/activescaffold/active_scaffold)。

```
class As::UsersController < AsController
  active_scaffold :user do |config|
    config.columns = [
      :name,
      :email,
      :address,
      :tel,
    ]
  end
end

```

こんなかんじのコントローローラーを一個書けば、いい感じの管理画面を生成してくれます。

![Anytimes.png](https://qiita-image-store.s3.amazonaws.com/0/30743/b567cd24-2b5d-c1ab-2080-d527f4d8cf7d.png)

管理画面においては、ユーザーIDも見えているといろいろ便利ですよね。

```
    config.columns = [
      :id,
      :name,
      :email,
```

![Anytimes 2.png](https://qiita-image-store.s3.amazonaws.com/0/30743/a8e42780-21a9-1f5c-ab99-3e42ffa9225e.png)

これで実現できましたが、編集画面でidが変更できてしまうと、うっかりidを変更してしまう事故が起きることが予想されます。

![Anytimes 3.png](https://qiita-image-store.s3.amazonaws.com/0/30743/861e70b9-7e12-608b-0bb9-46e10fafb982.png)

残念ながら、readonly属性を作れるようにしてほしいという要望は闇に消えてしまったようですが...
([Easy way to define a readonly column would be nice](https://code.google.com/p/activescaffold/issues/detail?id=251))

が、単に一覧画面でIDを見たい、編集はさせたくないという要望は、編集画面からIDを外すことで実現できます。

```
class As::UsersController < AsController
  active_scaffold :user do |config|
    config.columns = [
      :id,
      :name,
      :email,
      :address,
      :tel,
    ]
    config.update.columns.exclude :id
  end
end
```
![Anytimes 4.png](https://qiita-image-store.s3.amazonaws.com/0/30743/70cc9ed3-c675-f689-c633-0c4e844d1975.png)
シェルで簡易ポートスキャンツール

###制約
nmapもexpectも使えないとする。

###実行形式
`portscan.sh 接続先リストファイル`

###リストファイルのフォーマット

```bash
IPアドレスorホスト名 ポート番号
.
.
.
```

区切り文字はスペースかタブとする。空行、コメント行（#）を認める。

###出力形式

```bash
yyyy/mm/dd HH:MM:SS - yyyy/mm/dd HH:MM:SS IPアドレスorホスト名 ポート番号 OK
yyyy/mm/dd HH:MM:SS - yyyy/mm/dd HH:MM:SS IPアドレスorホスト名 ポート番号 NG
.
.
.
```

標準出力に上記を出力。正常に接続できたら「OK」、それ以外はすべて「NG」とする。接続時のメッセージは/dev/nullに捨てずにログファイルに記録する。

###サンプルコード

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

logfile=portscan.log
portlist="$1"

if [ $# -lt 1 ]; then
    echo "Usage: `basename $0` portlist"
    exit 0
fi

if [ ! -r ${portlist} ]; then
    echo "${portlist} can not read."
    exit 1
fi

echo `date +'%Y/%m/%d %H:%M:%S'` `basename $0` scanstart >> ${logfile}

while read line
do
    # 空行とコメント行を無視する
    echo ${line} | grep -E -e '^[[:blank:]]*$' -e '^[[:blank:]]*#' >/dev/null
    if [ $? -eq 0 ]; then
        continue
    fi

    echo -e "`date +'%Y/%m/%d %H:%M:%S'`\c"

    # IPアドレス（ホスト名）とポート番号を取得
    dest=`echo ${line} | awk '{print $1,$2}'`
    # telnetでログインしたらすぐ切断
    (sleep 1; echo -e "\x1d"; sleep 1; echo quit) | telnet ${dest} >> ${logfile} 2>&1

    # 接続結果を表示
    if [ $? -eq 0 ]; then
        echo " - `date +'%Y/%m/%d %H:%M:%S'` OK"
    else
        echo " - `date +'%Y/%m/%d %H:%M:%S'` NG"
    fi

done < ${portlist}

echo `date +'%Y/%m/%d %H:%M:%S'` `basename $0` scanend >> ${logfile}

```

`sleep 1`については、応答時間以上の値を指定する必要がある。過去実績を参考にするのが良い。
`echo -e "\x1d"`はbashのechoコマンドの仕様に合わせて書いている。仕事で使っているOSのechoがSystem V仕様である場合-eは不要なため、コマンドは`echo "\x1d"`となる。様々な環境で使用する場合は、echoの差異を吸収する関数を作成しても良いかもしれない。
ちなみに`\x1d`は`Ctrl+]`のASCII制御文字（16進数）である。
正規表現の何が便利なのか、分からない人へ


`.`は任意の一文字、`*`は直前の文字を０回以上繰り返す。

各記号が何を意味するかは調べれば分かるけど
それを使うとどんないいことがあるのか分からない。
そんな人向け。

## いいことその１ 全ての行を特定の文字で挟む

全ての行を置換文字の`<b></b>`の間に挟む。

![gif1.gif](https://qiita-image-store.s3.amazonaws.com/0/13571/0e1e96dc-a5b2-a665-f195-4dc72007464f.gif "gif1.gif")

```
置換前：`hoge`
置換後：`<b>hoge</b>`

検索文字：(.+)
置換文字：<b>$1</b>
```

### 解説

**検索文字**
`.+`：任意の一文字を一回以上繰り返す、つまり一行全て
`()`：グループ化

**置換文字**
`$1`：(秀丸、さくらなどは`\1`)とすると、グループ化した文字を取り出すことができる。

**応用**
`$1`はグループ化した１つ目という意味になるので、`$2`を使ってこんなことも可能。

```
置換前：hoge piyo
検索文字；(.+)\s(.+)
置換文字：<a href="$2">$1</a>

置換後：<a href="piyo">hoge</a>
```


## いいことその２ 全行の行頭に任意の文字を挿入
![gif2.gif](https://qiita-image-store.s3.amazonaws.com/0/13571/d84cb2d9-16d1-2f76-b93b-30de1060e005.gif "gif2.gif")

全ての先頭に`_`を挿入する。

```
置換前：`hoge`
置換後：`_hoge`

検索文字：^
置換文字：_
```

### 解説

**検索文字**
`^`：行頭

**置換文字**
`_`：特に意味は無い普通の置換文字。

**応用**
当然行末で〜ということも可能。

```
置換前：hoge
検索文字；$
置換文字：_piyo

置換後：hoge_piyo
```


## いいことその３ 全行の先頭にある可変長文字の削除
![gif3.gif](https://qiita-image-store.s3.amazonaws.com/0/13571/9cf7f98d-7a8b-69bd-9e8c-9f7de1001c0a.gif "gif3.gif")

先頭にある可変長数値とスペースの削除

```
置換前：`10 hoge`
置換後：`hoge`

検索文字：^[0-9]+\s
置換文字：検索文字を削除したいので、置換文字無し
```

### 解説

**検索文字**
`^`：行頭
`[0-9]+`：０〜９までの数値の繰り返し、つまり任意の長さの数値
`\s`：スペース、タブなど

**応用**
`^`を外せば、先頭じゃない数値も削除できるし、`[a-z]`とすれば小文字の任意の文字を削除できるし、
当然純粋に検索することも可能。
アルゴリズム　Rubyメモ

##二分探索


```math

計算量 O(log_2n)

```

```rb

def binary_search(size, value)
  arr = (1..size).to_a

  left = 0
  mid = 0 #=> 中央の値
  right = arr.last

  loop do
    mid = (left + right) / 2
    if arr[mid] == value
      return "Found"
    elsif arr[mid] < value
      left = mid
    else #arr[mid] > value
      right = mid
    end
  end
end

```

##しゃくとり法


```math

計算量 O(n)

```

長さnの数列a0,a1,,,,anと整数Sが与えれています。
連続する部分列で、その総和がS以上となるようなもののうち、最小の長さを求めなさい。
また、そのときの総和S
を求めなさい。
解が存在しない場合は０を出力しなさい。


```rb

LENGTH = 5
SUM = 11
ARRAY = [1,2,3,4,5]

total = 0
res = LENGTH
go = 0
back = 0

arr = []

loop do
  while go < LENGTH && total < SUM
    total += ARRAY[go]
    go += 1
  end
  break if total < SUM
  res = [res, go - back].min
  arr << total
  total -= ARRAY[back]
  back += 1
end

if res > LENGTH
  puts "0"
else
  puts "総和は#{arr.min}, 最小の長さは#{res}"
end

```

##深さ優先探索

```math

計算量 O(2^n)

```

```math

整数a_1,a_2、、、、、a_nが与えられた時、その中からいくつか選び、その和をKにすることができるか判定しなさい

```

```rb

N = 4
ALLAY_VALUE = [1,2,4,7]
SUM = 13

def depth_first_search(val, total)
  if val == N
    total == SUM
  elsif depth_first_search(val + 1, total)
    true
  elsif depth_first_search(val + 1, total + ALLAY_VALUE[val])
    true
  else
    false
  end
end

if depth_first_search(0, 0)
  puts "Yes"
elsif
  puts "No"
end


```

##動的計画法

```rb


# 値を再利用しながら解いていく、動的計画法
M = gets.to_i
N = gets.to_i
arr_key = Array.new(N)
arr_value = Array.new(N)
min_cost = 0

N.times do |i|
  key, value = gets.split(" ").map(&:to_i)
  arr_key[i] = key
  arr_value[i] = value
  min_cost += value
end

dp = Hash.new
dp[0] = 0

N.times do |ind|
  dp_tmp = dp.clone
  dp.each do |key, value|
    total_key = key + arr_key[ind]
    total_value = value + arr_value[ind]

    unless dp_tmp.has_key?(total_key)
      dp_tmp[total_key] = total_value
    end

    if total_key >= M && min_cost > total_value
      min_cost = total_value
    end
  end

  dp = dp_tmp
end

p min_cost


```
【Vim】Vimでソースコードを一行に圧縮する【1円にもならない無駄な技術】

# はじめに
Vimでソースコードを一行に圧縮する方法を紹介します。
なんの役に立つかはみなさんで考えてみてください。

ひとつ思いつくのは、嫌いな先生に提出するレポートにソースコードを添付する時くらいですかね。


# 一行に圧縮するコマンド
ノーマルモードで、

```
:ggVGJ
```


# 解説

```gg``` でコードの1行目に移動して、

```V``` でヴィジュアルモードにして、

```G``` でコードの最終行まで移動して、

```J``` で改行コードを削除。


# 一言
これの逆バージョンもあればいいのにね。
ECMAScript6を試す

ECMAScript６は次期javascriptの仕様で各々ブラウザーで実装状況に開きがある。
今一番実装が進んでいるのがFireFoxである。

最新の実装状況は下記リンクから参考にして下さい。
ECMAScript 6 compatibility table[http://kangax.github.io/compat-table/es6/]

ここではECMAScript６を使いたいのでtraceur-compilerを使用する。
使用法は下記リンク参照
https://github.com/google/traceur-compiler/wiki/GettingStarted

htmlファイルを作って下記のソースを追加する

```ecma6:html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<script src="https://google.github.io/traceur-compiler/bin/traceur.js"></script>
<script src="https://google.github.io/traceur-compiler/src/bootstrap.js"></script>
<script>
  traceur.options.experimental = true;
</script>
    
```

##アロー記法
関数オブジェクトを短くかける、Rubyっぽい

```js

var square_1 = function(x){
      return x * x
    };

    var square_2 = (x) => { return x * x; };
    //引数が一つの場合は括弧を省略できる
    //var square_2 = x => return x * x;

    console.log(square_1(10));
    console.log(square_2(10));
```

Rubyでは以下のように似たような感じで書ける

```rb
#Rubyではprocオブジェクト
 ruby_example = ->(x){ return x * x }
 ruby_example.call(2)
```
ClionでOpenCVを使う場合のCMakeListsの書き方


忘れないようにメモ。


```CMakeLists.txt
cmake_minimum_required(VERSION 2.8.4)
project(test)

find_package(OpenCV REQUIRED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES main.cpp)
add_executable(test ${SOURCE_FILES})
target_link_libraries(test ${OpenCV_LIBS})
```
Raspberry Pi (Raspbian) にOracle HotSpotVMを導入する方法


# はじめに
少し古いですが、ベンチマークの結果が有ります。

Java On Raspberry Pi Performance - Resin 4.0 Wiki
http://wiki4.caucho.com/Java_On_Raspberry_Pi_Performance

レスポンスが必要な場面で頻繁にJVMを使うのであれば、HotSpotVMを使わない手はありません。

OracleはJava SEを配布していますのでそれを使いましょう。

以前、Oracle(Sun)は戦略上、ARMにはJava SEではなくJava ME用のJVMを配布していました。
最近、組み込み向けのラインナップをJava SEに統合し省サイズのJava SE Embeddedを配布しています。

試していませんが、glibcなど必要なライブラリがあればRaspbian以外のLinuxディストリビューションでも問題ないとおもいます。

# OpenJDK: Vesrionの確認
javaコマンドでversionを確認しましょう。

```bash:
$ java -version

OpenJDK Runtime Environment (IcedTea 2.5.1) (7u65-2.5.1-2~deb7u1+rpi1)
OpenJDK Zero VM (build 24.65-b04, mixed mode)
```
「OpenJDK Zero VM」は、JITがないOpenJDK実装です。
さっそく、Oracle JDKを入れてみましょう。

# JDK選択とダウンロード
参考文献のJDK配布先からダウンロードしてください。

ダウンロードには、ブラウザが必要になりますので、CUIのlinksなどを使ってダウンロードしましょう。
別PCのブラウザからダウンロードして、共有したり、scpなどでコピーしたりするのもよいでしょう。

取得の手順は、いつもどおりライセンスを読んでラジオボタンを承認に変更して、ダウンロードとなります。

Raspberry PiのCPUは、Hard Floatに対応してますので、Hard Float版をダウンロードしましょう。

Raspberry Pi上のアプリケーション起動速度に関しては、
JDK7 > JDK8
となっています。
必要な機能に応じてダウンロードして下さい。

jdk-7u60-linux-arm-vfp-hflt.tar.gzを展開するとjdk1.7.0_60フォルダが出来ますので、

ユーザディレクトリ内か全体か検討して配置します。

全体の場合、ベンダツールは、sudoコマンドなどで /opt フォルダに展開する場合が多いです。


パスを通す必要がある場合は、設定しましょう。

```bash:
export JAVA_HOME=/opt/opt/jdk1.7.0_60
PATH=$JAVA_HOME/bin:$PATH

```

# alternatives
デフォルトに設定したい場合、alternativesコマンドで入れ替えることも出来ます。

```bash:
#alternativesを確認
sudo update-alternatives --config java

#最後の数字は空いているところに
sudo update-alternatives --install "/usr/bin/java" "java" "/opt/opt/jdk1.7.0_60/bin/java" 1
sudo update-alternatives --install "/usr/bin/java" "java" "/opt/opt/jdk1.8.0_06/bin/java" 2

#再度確認切り替え
sudo update-alternatives --config java
```

# 終わりに
それでは、快適なRaspberry PiのJVMライフを楽しみましょう。
ちなみに、clojureのREPL起動にはHotSpotVMでも18秒ぐらいかかるので、dripコマンドなどで起動済みにしておかないと辛いです。

# 参考文献
Embedded: Resin On Raspberry Pi - Resin 4.0 Wiki
http://wiki4.caucho.com/Embedded:_Resin_On_Raspberry_Pi

Java On Raspberry Pi Performance - Resin 4.0 Wiki
http://wiki4.caucho.com/Java_On_Raspberry_Pi_Performance

# JDK配布元
JDK7 for ARM Download
http://www.oracle.com/technetwork/java/javase/downloads/jdk7-arm-downloads-2187468.html

JDK 8 for ARM - Download
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-arm-downloads-2187472.html

Java SE Embedded - Downloads | Oracle Technology Network | Oracle
http://www.oracle.com/technetwork/java/embedded/embedded-se/downloads/index.html
Local Outlier Factorによる異常検知


C++とOpenCVでLOF(Local Outlier Factor)による異常検知プログラムを実装。何故か毎フレーム描画しているが、とりあえずあげておく。

#LOF(Local Outlier Factor)とは
データマイニング分野で利用される異常検知手法。あるデータの密度がその他のデータの密度と比べて小さいかどうかを評価することで、異常なデータを見つける。

[Wikipedia](http://en.wikipedia.org/wiki/Local_outlier_factor)
[元論文](http://www.dbs.ifi.lmu.de/Publikationen/Papers/LOF.pdf)

#実験結果
入力データは(x, y)の２次元データ３０個
![入力データ](https://raw.githubusercontent.com/saigyo-k/ForStudy/master/LOF/original.jpg)

異常と判定されたデータは赤い点で描画。
![結果](https://raw.githubusercontent.com/saigyo-k/ForStudy/master/LOF/result.jpg)

#使用方法
1. Window上で左クリックして、データ点を作成。３０個程度あれば、十分のはず。
2. ”l”を押すと、異常検知を行う。異常（外れている）点は赤色で表示。
3. 適当なキーを押すと、異常データの表示を終了。
4. ”q”を押すと、終了。

#ソースコード

[Github](https://github.com/saigyo-k/ForStudy/tree/master/LOF)

動作環境： Mac(OS X Yosemite), Clion, OpenCV2.4.8, C++11
Cómo utilizar Smarty con CakePHP 3.0

Este es un tutorial para instalar Smarty para CakePHP 3.0.

en [English](http://qiita.com/yukikikuchi/items/f8d7ab3eb068e17b6b67)
en [日本語](http://qiita.com/yukikikuchi/items/f64182288a6e23087c12)

# Steps

## 1. Descargue el SmartyView

desde aquí: https://github.com/yukikikuchi/cakephp3-smartyview
Descargar guardar SmartyView como app/src/View/SmartyView.php

## 2. Descargue el Smarty

http://smarty.php.net/download.php
Extraer a app/vendor/smarty

## 3 . Incluya en su controller

```php:AppController.php

class AppController extends Controller {
    public $viewClass = 'App\View\SmartyView';
}

```

## 4 . Crear el archivo layout

Crear un fichero app/src/Template/Layout/default.tpl

```tpl:default.tpl

{$this->fetch('content')}

```
Jenkinsのコンソール出力が読みづらくなっている人向けのメモ

[Log Parser Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Log+Parser+Plugin)を使ってParseするときに、文字化けや色の制御文字が邪魔になるので、その対策をまとめています。

## コンソール出力が文字化けする
* Javaのバージョンにもよりますが、JVM起動オプションを変更することで解決します。
* Jenkinsの「システムプロパティ」で以下のエンコードを確認してください。
 * ```file.encoding```
 * ```sun.jnu.encoding```

### CentOSの場合
* ```/etc/sysconfig/jenkins```を編集

```bash
# arguments to pass to java
JAVA_ARGS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"
```

* 編集後、Jenkinsを再起動

```bash
$ sudo service jenkins restart
```

### Ubuntuの場合
* ```/etc/default/jenkins```を編集

```bash
# arguments to pass to java
JAVA_ARGS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8"
```

* 編集後、Jenkinsを再起動

```bash
$ sudo service jenkins restart
```

### Mac(Homebrew)の場合
* ```~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist```を編集

```xml
    <key>ProgramArguments</key>
    <array>
      <string>/usr/bin/java</string>
　　　 <string>-Dfile.encoding=UTF-8</string>
　　　 <string>-Dsun.jnu.encoding=UTF-8</string>
      <string>-jar</string>
      <string>/usr/local/opt/jenkins/libexec/jenkins.war</string>
    </array>
```

* 編集後、Jenkinsを再起動

```bash
$ launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
```

### Mac(OSX Installer)の場合
* ```/Library/LaunchDaemons/org.jenkins-ci.plist```のProgramArgumentsの起動方法を確認
* java指定起動であればHomebrewの場合と同様
* jenkins-runner.sh指定起動であれば```/Library/Application Support/Jenkins/jenkins-runner.sh```にjavaArgsを追加

```bash
javaArgs=""
javaArgs="$javaArgs -Dfile.encoding=UTF-8"
javaArgs="$javaArgs -Dsun.jnu.encoding=UTF-8"
heapSize=`$defaults heapSize` && javaArgs="$javaArgs -Xmx${heapSize}"
permGen=`$defaults permGen` && javaArgs="$javaArgs -XX:MaxPermSize=${permGen}"
```

* 編集後、Jenkins再起動

```bash
$ sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
$ sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist
```

### Windowsの場合
* システム環境変数をセットする。

```
JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8
```

* 実行ジョブごとに「Windowsバッチコマンドの実行」先頭に以下を追加

```bat
chcp 65001
```

* 参考
 * [Windows を Jenkins の Slave にして Git管理してる Rspec のテストを実行するためのセットアップ手順](http://qiita.com/yui/items/f813013863673f9684cf)
 * [コマンドプロンプト起動時、自動的に文字コードをUTF-8にして日本語もちゃんと表示できるようにする方法](http://qiita.com/yui/items/86a455f948a3e1c0ef97)

### スレーブ起動の場合(OS共通)
* 変更したいスレーブの「設定」を開く
 * 「高度な設定」「起動方法」
 * JVMオプション```-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8```を追加(スペース区切り)
* 追加後Jenkins スレーブを再接続

## コンソール出力でターミナルの色指定が制御文字で表示される
* [AnsiColor Plugin](https://wiki.jenkins-ci.org/display/JENKINS/AnsiColor+Plugin)を使うと解決します。
* プラグインインストール後、Jobごとの設定で「ビルド環境」で「Color ANSI Console Output」を有効にしてください。
CISSP CPEの稼ぎ方

(ISC)2が認定する情報セキュリティの国際資格CISSPのホルダーは，資格維持のために，継続的なセキュリティ学習を行った証跡となる*CPEポイント*をためる必要があります．1CPEは，1時間相当の学習で与えられるものとされていて，1年で*40CPE*の取得が目安となります．ちなみに，1年間で20CPEなければ，資格が保留状態になり，しばらくして失効します．

私は，CISSP資格取得後，このCPEの稼ぎ方がよくわからず困った経験がありますので，同じようなことで悩んでいる方が参考になればと思い，私の稼ぎ方をご紹介します．

----
※監査対象となった場合，(ISC)2に証跡を提出しなければならないため，認定書や領収書などはとっておくようにします．

**e-Symposium（無料）**
https://live.blueskybroadcast.com/bsb/client/CL_DEFAULT.asp?Client=411114
オンラインのシンポジウム（英語）．Youtubeのような専用サイトで，約3時間の動画を見た後に出題される10問くらいのクイズに正解すると3CPE獲得．年4回程度開催．事前にCISSPの番号をサイトに登録しておくことで，クイズクリア後，自動的に(ISC)2のシステムにCPEが登録される．
- 監査証跡にクイズの回答結果の画面コピーを念のため保存．
- 動画を全部見ないと，クイズの画面にはたどり着けないようになっています．頑張って見ましょう．
- 英語が分からなくても，発表資料をCtrl+Fで検索すれば，ある程度は回答できます．
- クイズは合格する（正答率70%?）まで3回挑戦可能．それ以降は再チャレンジ不可．

**InfoSecurity Professional Magazine（無料）**
https://www.isc2.org/infosecurity_professional/default.aspx
オンラインの雑誌（英語）．PDF形式．約10問のクイズに答えると2CPE獲得．年6回発行．
e-symposiumの仕組みと同じ．30分もあれば読める．

**ThinkTank（無料）**
https://www.brighttalk.com/channel/5385
オンラインのショートレクチャー（英語）．e-Symposiumの単体版のイメージで，1回1時間で手軽に聴講できます．1回みると，1CPE獲得．頻繁にやっています．
- CPEの登録は，(ISC)2のサイトに行き，自ら実施．
- 証跡は不明．（私はやっていません）

**(ISC)2アンケート調査協力（無料）**
時折，(ISC)2からアンケート調査の依頼がくるため，これに協力することでCPEが得られることがある（CPE数については，依頼メールに明記）．2014年は5CPEのアンケートが1回来ました．
- CPEの登録は，(ISC)2のサイトに行き，自ら実施．
- 証跡は，アンケート回答内容を保存．

**書籍レビュー（無料～書籍代）**
セキュリティに関係する書籍（日本語でもOK）のレビューを書いて(ISC)2のCPE登録サイトに投稿．ただし，レビューは英語で書く必要があります．たしか，100語程度でOKなので，中学生程度の単語でよいので要点を記載すればよいと思います．年最大5CPEまで登録可．
- CPEの登録は，(ISC)2のサイトに行き，自ら実施．
- 証跡はレシート，もしくは図書館の貸し出し記録など

**雑誌の定期購読（書籍代）**
セキュリティに関係する雑誌（日本語でもOK）を購読すれば，年最大5CPEまで登録可．
日本の(ISC)2のサイトによれば，日経コンピュータ等の定期購読があれば，5CPE登録できるとのこと．
- CPEの登録は，(ISC)2のサイトに行き，自ら実施．
- 証跡はレシートや，送り状など．

**セミナー・会合等参加（無料～有料）**
セキュリティに関するセミナーや会合に参加すると，参加した時間*1CPEが獲得．
情報処理安全確保支援士（登録セキュスペ, RISS)の年次講習も登録可能（オンライン講習6CPE程度が目安）
仕事の打合せはNGとのこと．
- CPEの登録は，(ISC)2のサイトに行き，自ら実施．
- 証跡は，セミナーの参加証や，Certificate，議事録など

**書籍・論文執筆（無料～有料）**
セキュリティに関する書籍や論文を執筆すると，5～10CPE（執筆量による）獲得．
- CPEの登録は，(ISC)2のサイトに行き，自ら実施．
- 証跡は書籍・論文の原稿．

e-SymposiumとMagazineだけで，24CPE（= 3CPE * 4回 + 2CPE * 6回）は獲得できますので，あとは書籍で5CPE, 雑誌で5CPE，アンケートで5CPEと合わせて39CPEは，確保できます．雑誌書籍の代わりにThinkTankの視聴や，都会にお住いの方は，LocalEventに参加されるのもよいと思います．また，(ICS)2関係のボランティア参加にもCPEをもらえますが，私はコネもないので参加していません．

ちなみに，CPE登録サイトはこちら（ログイン要）
https://cpe.isc2.org/s/
How to use Smarty with CakePHP 3.0

This is a tutorial for installing Smarty to CakePHP 3.0.

In :[日本語](http://qiita.com/yukikikuchi/items/f64182288a6e23087c12)
In :[español](http://qiita.com/yukikikuchi/items/4c7904ff196e2811a5ca)

#Steps

##1. Download the SmartyView

from here: https://github.com/yukikikuchi/cakephp3-smartyview
Save SmartyView as app/src/View/SmartyView.php

##2. Download the smarty template engine

http://smarty.php.net/download.php
Extract it to app/vendor/smarty


##3. Include in your controller

(in AppController.php to do it app-wide)

```php:AppController.php

class AppController extends Controller {
    public $viewClass = 'App\View\SmartyView';
}

```

##4. Create the layout file

Create a file app/src/Template/Layout/default.tpl and paste in that file:

```tpl:default.tpl

{$this->fetch('content')}

```
Arduino Pro MiniでFSLPを動かすときの注意

Arduino Pro Mini(3.3V/8MHz)でFSLP(http://akizukidenshi.com/catalog/g/gP-04746/) を使うときに、SenceLineをA6に接続すると、ポジションの取得に失敗する。(1023付近の値しか帰ってこない)

別のアナログピンを使うと問題なく動作する。

https://www.switch-science.com/catalog/876/
によると

````
このバージョンでアナログ入力が2本(A6,A7)多く使えるようになりました。
ただし、今のところ(2012/11/01現在)この2本はArduino IDEで対応していません。
A6,A7を使いたい場合、Arduino IDE 1.0以降で、(Arduino.exeのあるフォルダ)\hardware\arduino のboard.txt を開き、pro328.build.variant=standard を pro328.build.variant=eightanaloginputs と書き換える必要があります。
もちろん、A6,A7を使わなければ通常通り、Arduino IDEからお使いいただけます。
````

だそうです。
とあるゲームのカジノ勝率をJSで解析した結果・・・

ダイス&モンスターズというスマホゲームの最初のカジノ「チキン ジャック ダイス」が妙に勝てる気がしたのでJSで解析してみました。
**使用ツールは、CodeRunner + JavaScript** これだけ

##勝てそうと思った手
「18以上になったら自動的に降りる」という手だとかなり勝率高いんじゃね？と体感的に思ったので試行してみましたよっと。

##「100回ゲーム」を10000セット繰り返します
持ちコインが1000からのスタートです。
これは人間がタップしてやるなら5万時間くらいかかる計算です（適当）

## 結果・・・
###平均増加数 : 4261枚
###100ゲームやって減った回数 0回 / 10000回
![スクリーンショット 2014-12-14 18.40.25.png](https://qiita-image-store.s3.amazonaws.com/0/57193/6c5405aa-b99b-4f2f-cecb-575338825d14.png)

うひょー・・・やっぱり勝てるｗ
しかも100ゲームやればほぼ確実増えるという結論に。

##コードはこちら
```js:chickenjackdice.js
var coins = 1000;
var flg = 0;
var results = [];

//100回ワンセットのゲームを1000セット試行
for (cnt=1;cnt<=10000;cnt++) {
	play100times();	
}

//100回ゲームをする
function play100times()
{
	coins = 1000;
	for (i=1;i<=100;i++) {
		mainGame(0);
	}
	if (coins < 1000) {
		flg += 1;
	}
	results.push(coins);
	console.log(coins);	
}

//平均増加数を出す
var total = 0;
for(var i = 0;i<results.length;i++){
	total += results[i];
}
var average = Math.floor(total/results.length) - 1000;

console.log("試行回数 : 10000回");
console.log("負けた回数 → " , flg);
console.log("平均増加数 → " ,  average);

//1回のゲーム
function mainGame(num)
{
	var firstresult = dice();
	num += firstresult;
	//console.log(num);
	
	if(num <= 18)
	{
		mainGame(num);
	}
	else if(num >= 22)
	{
		coins -= 100;
	}
	else
	{
		coins -= 100;
		coins += getRewards(num);
	}
}

//さいころをふる
function dice()
{
	return Math.floor(Math.random() * 6) + 1;
}

//結果のゲッタ
function getRewards(result)
{
	switch (result) {
		case 16:
			return 66;
		case 17:
			return 100;
		case 18:
			return 133;
		case 19:
			return 166;
		case 20:
			return 200;
		case 21:
			return 250;
		default:
			return 0;
	}
}

```

##結論
「チキン ジャック ダイス」はチキンでも勝てる（ブヒっ）
Vagrantの基本操作


## 基本操作
・以下の基本操作は、Vagrantfileがある階層で行う必要があります。

### 起動（電源オン）
$vagrant up

### 仮想サーバへのログイン
$vagrant ssh

### 終了（電源オフ）
$vagrant halt

### 仮想サーバの状態を表示
$vagrant status

### 仮想サーバの再起動
$vagrant reload

### 仮想サーバの削除
$vagrant destroy

## VagrantBoxの作成
$ vagrant box add [box-name] [vagrant box url]

[vagrant box url]は下記にたくさんある
http://www.vagrantbox.es/

vagrant addした際は、以下のフォルダにBOXが保存される。
/Users/username/.vagrant.d/boxes

###  Boxから仮想マシンの作成・起動まで
下例はホームディレクトリ配下に作成した場合

・仮想端末を作成するディレクトの作成
$ mkdir -p ~/Vagrant/CentOS65
$ cd ~/Vagrant/CentOS65

・仮想端末のもとになるVagrantfileの作成
$ vagrant init centos65

・仮想端末の起動（初回時はVagrantfileより仮想端末自身の作成が行われる）
$ vagrant up


### 現状のBoxをリスト表示
$ vagrant box list
centos56     (virtualbox, 0)
centos56mini (virtualbox, 0)

## VagrantBoxの削除
不要なBOXは以下のコマンドで削除可能。ここでいうBOXはネットから落としてきたBOXファイル自体であることに注意。
$ vagrant box remove Box名


## 現状の仮想状態からVagrantBoxの作り方
$ vagrant package --base CentOS56_default_1416925688529_53839 --output test.box


## 仮想端末の削除
Vagrantfileがある階層まで移動し削除コマンドを投入する

$ vagrant destroy

### 仮想端末の場所
vagrant init で作成した仮想端末は以下のフォルダにある。

/Users/username/VirtualBox VMs


## とりあえずそれっぽく動かしたいとき

Vagrant上でWEBサーバを動かして、ホストOSからWebページを表示させる

### Apatch Web Serverのインストール
$ sudo yum -y install httpd
$ sudo service httpd start
$ sudo service iptables stop

ホストOSのifconfigで見えるvboxnet0は、vagrantが使用するホストオンリーアダプタのこと
$ ifconfig
$ VBoxManage list -l hostonlyifs
$ sudo iptables -L

### VagrantへIPアドレス設定
Vagrantfileに以下の行を追記
\#config.vm.network "private_network", ip: "192.168.33.10"

###接続試験
ゲストOSより、 http://192.168.33.10/ を投入する。
成功すればApatchが表示される！
CentOS+Vagrant+Jboss


MacOS上にVagrantを入れてCentOSを動かし、さらにJbossなるものを動作させてみたいと思う。


## ネットワーク設定
CentOSの設定を変更

### hostsファイル

hostsファイルにゲストOS情報の記載がないと、以下のようなエラーが出力され、起動が若干おそいので、/etc/hostsへゲストOSのIPアドレスとホスト名(uname -a)を追記。

	WARN  [com.arjuna.ats.arjuna] (Transaction Expired Entry Monitor) ARJUNA12210: Unable to use InetAddress.getLocalHost() to resolve address.

ゲストOSのホスト名を確認
$ hostname
vagrant-centos64.vagrantup.com

ホスト名とIPアドレスを追記
$ vi /etc/hosts
以下を追記

	192.168.33.10 vagrant-centos64.vagrantup.com


### serviceファイル

影響度合いが不明なのだが、8080を追加

$ vi /etc/service


### ネットワークの再起動

ネットワーク関連のファイルを修正した場合には、再起動が必要

$ service network restart

## JRE Linux 7u51のインストール

Jbossの動作にはJREを入れる必要があります。

$ rpm -ivh jdk-7u51-linux-x64.rpm

## Jbossのインストール

### Jbossの解凍
/opt に圧縮ファイルを置いて解凍
$ cp jboss-as-7.1.0.Final.zip /opt
$ unzip  jboss-as-7.1.0.Final.zip 

### 起動ポート&IPアドレスの変更

対象ファイル

	/opt/jboss-as-7.1.0.Final/standalone/configuration/standalone.xml

（１）ファイルで8080と記載されている部分を80へ変更する

	<socket-binding name="http" port="8080"/>

（２）起動するとlocalhost（127.0.0.1）で待ちになるようで、インターフェイスのIPアドレスを設定する必要がある。以下でIPアドレスが記述された2箇所は、デフォルトでは127.0.0.1となっています。

    <interfaces>
        <interface name="management">
            <inet-address value="${jboss.bind.address.management:192.168.33.10}"/>
        </interface>
        <interface name="public">
            <inet-address value="${jboss.bind.address:192.168.33.10}"/>
        </interface>
    </interfaces>
    
## Jbossを起動する
	
$ cd /opt/jboss-as-7.1.0.Final/bin
$ ./standalone.sh 

ゲストOSのブラウザから接続してJbossが見れたらOK！
http://192.168.33.10/


## Jbossを使用する準備

### 管理ユーザの追加

管理ユーザを追加しないと何もできませんので。

# /opt/jboss-as-7.1.0.Final/bin/add-user.sh 

	What type of user do you wish to add? 
	 a) Management User (mgmt-users.properties) 
	 b) Application User (application-	users.properties)
	(a): a

	Enter the details of the new user to add.
	Realm (ManagementRealm) : admin
	Username : admin
	Password : 
	Re-enter Password : 
	The username 'admin' is easy to guess
	Are you sure you want to add user 'admin' yes/no? yes
	About to add user 'admin' for realm 'admin'
	Is this correct yes/no? yes


### Helloプログラム

standalone/deploymentsに移動して、ディレクトリtest.warを作成(.warを付けないと、Webモジュールと認識されない)。

test.war配下に移動してtest.jspを作る。

	<html>
	<head>
	</head>
	<body>
	1 + 2 = <%= 1 + 2 %>
	</body>
	</html>

test.warと同階層のディレクトリ（test.war配下ではない）に、test.war.dodeployを作成。

touch test.war.dodeploy

数秒待つとdeployedという拡張子に変わる。

$ ls
README.txt  test.war  test.war.deployed

ゲストOSのブラウザから接続してtest.jspが見れたらOK！

		http://192.168.33.10:8080/test/test.jsp
Tao3Dの基幹にある謎の言語XLRに迫る

Tao3Dは、インタラクティブなスライドやアニメーションが作成できるプログラミング言語および開発プラットフォームで、Windows版, OS X版, Linux版のパッケージが用意されています。今年、[Tao3D Libre Edition](http://tao3d.sourceforge.net/)が公開され、[日本でも報道されました](http://news.mynavi.jp/news/2014/11/04/286/)。

Tao3Dの使い方を、ブログに少し書きました。 [Tao3Dで検索 - M59のブログ](http://mandel59.hateblo.jp/search?q=Tao3D)

# XLR

Tao3Dは一種のDSL（domain-specific language; ドメイン特化言語）で、その実体はXLRというプログラミング言語です。

[XL Extensible Language](http://xlr.sourceforge.net/)

[言語リファレンス](http://xlr.sourceforge.net/xlr-ref)によれば、C言語, Pascal, Ada, ModulaなどといったAlgol系に似た自然な構文を持ちながらも、Lisp由来の同図像性を持つ言語の力を備えるよう設計された言語だそう。強そう。

## 構文

XLRの構文は、パースされてXL0という抽象構文木の形式になります。XL0には4種のリテラルノード型（整数、実数、テキスト、シンボル）と4種の構造ノード型（前置、後置、中置、ブロック）があります。

XLRにはインデントによるブロック（[オフサイドルール](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%95%E3%82%B5%E3%82%A4%E3%83%89%E3%83%AB%E3%83%BC%E3%83%AB)）があります。また、文と式の区別があり、文の優先順位より優先順位が低い中置演算子は文を、優先順位が高い中置演算子は式を区切ります。このようなルールによって、同図像性を持ちながらPythonやRubyのような書き方ができる言語になっています。

XLRの各演算子の優先順位・結合法則は`xl.syntax`ファイルで定義されています。また、それとは別に定義することが可能です。

次のコードは条件分岐の制御構造を中国語風に定義し、使ってみたものです。

```ddd
syntax (PREFIX 121 如)
syntax (INFIX 50 則)
syntax (INFIX 31 否則)

如 true 則 TrueBody 否則 FalseBody -> do TrueBody
如 false 則 TrueBody 否則 FalseBody -> do FalseBody

如 mouse_x < 0 則
  color "red"
否則
  color "blue"
```

## 意味

XLRの意味 semantics は、[項書き換え](https://ja.wikipedia.org/wiki/%E9%A0%85%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88)に基づいています。次のような構文が、XLRコンパイラーによって特別に扱われます。

- 項書き換え宣言 `パターン -> 実装`
- データ宣言 `data パターン`
- 型宣言 `名前:型`
- ガード `宣言 when 条件`
- 代入 `参照 := 値`
- 順序演算子 `;`または改行
- インデックス演算子 `参照.フィールド`または`参照[インデックス]`

### 項書換え宣言

抽象構文木の書き換え規則を書きます。普通の関数宣言だと思って書いてもいいです。

パターンマッチを持つ言語によるプログラミングに慣れた人ならすぐにプログラムが書けると思いますが、ラムダ計算ではないということに注意してください。`如 Cond:boolean 則 TrueBody 否則 FalseBody`のように、複雑なパターンを使うこともできます。

### 型

XLRは強く型付けされています。XLRの値の木の形によって、その値が型に属しているかどうかが決まります。例えば、`boolean`型は`true`か`false`にマッチし、`block`型はブロックノードにマッチします。

### 評価

XLRは[必要呼び](https://ja.wikipedia.org/wiki/%E9%81%85%E5%BB%B6%E8%A9%95%E4%BE%A1)をします。ただし、シーケンスとして実行される`A;B`や、`do`を使った`do A`の形の式は、その場で評価されます。
push 通知からブラウザ起動させる際に注意すること


## push 通知からブラウザ起動させる際に注意すること
push 通知からダイレクトにブラウザを起動させたとき、アプリが10秒くらい固まった後にようやくブラウザが起動する問題が起こりました。どうやら、Application Delegate の didReceiveRemoteNotification(※) や didFinishLaunchingWithOptions で [UIApplication openUrl] を呼ぶとアプリが固まってしまうそう。。
※ iOS8 からは didReceiveRemoteNotification ではなく以下に変更されてます。

    - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)notification


### 対応方法 
対応方法としては GCD（Grand Central Dispatch）を使って openUrl を呼び出すことで解決できます。

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://~"]];
    });


GCD は iOS におけるマルチスレッドの手法の一つです。処理したいタスクを Block で渡すことで逐次実行します。dispatch_async を使うことでタスクの処理を非同期で実行してくれます。同期処理させたい場合は dispatch_sync。

なぜ固まるのか原因が定かではないですが、これによってスムーズにブラウザを起動させることができます。
64bitなWindowsにMilkodeをインストールする

64bitのWindowsへのインストールではまったのでメモ。

## まずはRubyをインストール
1. [RubyInstaller for Windows](http://rubyinstaller.org/)からRubyのインストーラーをダウンロード
1. exeを起動して、次々進めて完了


## 次にDEVELOPMENT KITをインストール
1. 同じく、[RubyInstaller for Windows](http://rubyinstaller.org/)からDevKitのインストーラーをダウンロード
1. exeを起動して、ファイルを展開する
1. コマンドプロンプト で 先ほどDevKitを展開した階層に移動
 - エクスプローラーでパスを開いて、なにもないところをShift + 右クリック→「コマンドウィンドウをここで開く」を使うと便利。
1. `ruby dk.rb init`を実行して初期化
 - 32bit OSなら正常に初期化できるのですが、64bit OSだと上手く行きませんでした
 - 同階層に作成される`config.yml`の最後に`- C:\Ruby21-x64`のような記述がない場合、追記してあげてください。
1. `ruby dk.rb install`を実行してインストール完了

> #### 参考
[DevKitのインストール](http://www.rubylife.jp/railsinstall/rails/index4.html)


## Milkodeのインストール
ここまででRubyを使える環境が整ったので、早速Milkodeをインストールしましょう。
コマンドプロンプトで `gem install milkode` を実行するとなんか怒られました。
![image](https://qiita-image-store.s3.amazonaws.com/0/41133/9be1be00-f280-8194-a233-06e8a6a95100.png)
httpsで通信したいけど、証明書がなんかアレやでって言われてるらしいです。

### 証明書の追加
httpを使うのも一つの手ですが、やっぱりhttpsやろってことで [Windows で Ruby のSSL証明書を更新](http://igarashikuniaki.net/diary/20130617.html) を参考にして、証明書を更新してあげましょう。

もう一度実行すると、次は
![image](https://qiita-image-store.s3.amazonaws.com/0/41133/c43f1e95-1dd9-7dc5-9c43-31ac4a42a854.png)
わけのわからないエラーが出ましたが、EventMachineとかいうのがダメみたいですね。

### EventMachineのインストール
[Eventmachine gem install fail](https://stackoverflow.com/questions/17361958/eventmachine-gem-install-fail/17386686)
調べてみたらなんかバグっぽいので、[ここ](https://github.com/eventmachine/eventmachine/pull/450/files)を参考にしてソースを直してビルド・インストールしましょう。
32bit版では正常にインストールできます。

もう一度実行すると成功するはずです。

## Milkodeの設定
`milk init --default`を実行してMilkodeの初期化をしましょう。
次は検索したい対象を追加します。
追加したい場所をカレントディレクトリにしたあと、
`milk add .`を実行してあげると準備は完了です。

これでもう検索できます。
![image](https://qiita-image-store.s3.amazonaws.com/0/41133/3e8bc2ca-1b8d-8923-347b-b7a2681ee8a0.png)

## ブラウザで検索する
ただ、ブラウザから見れるのがMilkodeの売りなので `milk web` を実行します。
![image](https://qiita-image-store.s3.amazonaws.com/0/41133/1b813986-eb3c-9ba1-ca1f-4ae6bad1ecd6.png)

またエラーになっちゃいましたが、ここでエラーになってるthinってやつがEventMachineに依存してるせいでエラーになってるらしいです。
なので、thin を使わずに webrick を使いましょう。
`milk web -s webrik` を実行すると、
![image](https://qiita-image-store.s3.amazonaws.com/0/41133/daa018d6-2ddc-c0e6-ed98-c135bb8777bf.png)
おぉ、うまいこと起動しました。

勝手にブラウザを開いたり、ほかの端末から見れなかったり、ポート番号が9292だったりするので、
`milk web -s webrick -n -p 36510` とかやってあげましょう。

それでは快適なMilkode生活を！
go で Windows service を作成する



概要
====

golangでdaemonを作成しそれをWindowsに移植することになったので、golang製daemonをwindowsサービス化させるためのメモです。


手段
====

1. [NSSM (the Non-Sucking Service Manager)を使う方法](http://sanatgersappa.blogspot.jp/2013/07/windows-service-with-go-easy-way.html)

2. [kardianos/service](https://github.com/kardianos/service)を使う方法

の2通りの手段があるがあるようです。
前者は、NSSMというサービス登録ツールを利用してプログラムをサービスぽくWindowsに認識させる方法と、 後者は真面目にサービスプログラムらしく実装できるパッケージを使う方法となっています。

今回は[kardianos/service](https://github.com/kardianos/service)を使う方法を紹介します。



[kardianos/service](https://github.com/kardianos/service)
===================

このパッケージは、Windowsサービスを作ることに特化したパッケージではなく、Linuxのupstartを使ったdaemonの作成や、MacOSのdaemonの作成にも対応しているようです。

使い方
-----

使い方は、
[service/simple/example/main.go](https://github.com/kardianos/service/blob/master/example/simple/main.go) 通りになるのですが、

とても簡単で、
ちょっとためしてみようと、exampleを書き写したのですが、
結局、doWork()にメイン処理を書くだけで、殆どオリジナルexampleそのままになりました。

https://github.com/masahide/test-winservice/blob/master/main.go


ビルド
-----

Macでコンパイルするので、[Go のクロスコンパイル環境構築](http://qiita.com/Jxck_/items/02185f51162e92759ebe)を参考にコンパイル環境の準備をします。 といっても以下のコマンド一発です。

```bash:
$ cd $(go env GOROOT) # go をインストールしたディレクトリに移動
$ cd src              # その下の src
$ GOOS=windows GOARCH=amd64 ./make.bash
```

あとはリポジトリ上で、以下のようにOSを指定してビルドを実行します。

```bash:
$ GOOS=windows GOARCH=amd64 go build
```

上側がMac版バイナリでexeがwindowsです。 ずいぶん大きさが違いますね。

```bash:
$ ls
-rwxr-xr-x   1 masahide  staff  4106960 12 14 15:47 test-winservice
-rwxr-xr-x   1 masahide  staff  2509824 12 14 16:39 test-winservice.exe
```


実行方法
-----------

exampleのまま作成すると以下のようにコマンドでサービスの登録や実行などが行えます。

```cmd:サービス登録
C:\Users\Masahide\Desktop>test-winservice.exe install
Service "Go Service Test" installed.
```

```cmd:サービス開始
C:\Users\Masahide\Desktop>test-winservice.exe start
Service "Go Service Test" started.
```

```cmd:サービス停止
C:\Users\Masahide\Desktop>test-winservice.exe stop
Service "Go Service Test" stopped.
```

```cmd:サービス削除
C:\Users\Masahide\Desktop>test-winservice.exe remove
Service "Go Service Test" removed.
```


その他
------

* 標準出力などの出力はどうなるの？
  * ~~-> イベントログのアプリケーションログとして出力されます。~~
  * -> [service.Logger](https://bitbucket.org/kardianos/service/src/4e1ffc68731b82f4a8a3d070120ba0524b92917a/service.go?at=default#cl-129)  を使いましょう。 イベントログのアプリケーションログに出力してくれます。
Componentを拡張してみる

今回はちょっとした小ネタとして、既存のComponentを拡張したようなComponentを作りたい時の話をしたいと思います。

それには、v0.12で追加されたJSXのspread attributesを使うと簡単に出来ます。

## テキスト付きの画像Component

例として、テキストと画像をセットにしたImageTextというComponentを考えてみたいと思います。

I/FとしてはimgのComponentに渡すものにプラスしてテキストで考えてみます。

```js
var ImageText = React.createClass({
  render() {
    return (
      <span>{this.props.text}<img src={this.props.src} width={this.props.width} height={this.props.height} /></span>
    );
  }
});
```
```html
<ImageText text="名前です" src="/img/foo.png" width="100" height="200" />
```

単純に実装するとこんな感じです。とはいえ、imgにはaltも渡せたりするのでaltも...とか考えると面倒な感じになります。

こういった場合にspead attributesを使うとこんな感じで書くことが出来ます。

```js
var ImageText = React.createClass({
  render() {
    var {text, ...other} = this.props;
    return (
      <span>{text}<img {...other} /></span>
    );
  }
});
```

この時渡すimgには関係ないProp(text)は渡さない方がいいのでtextとotherでspread attributesを使って分割しています。JavaScriptでも_.omitを使うことで同じようなことは出来ます。

これを使う場合、ComponentのI/Fがわかりにくくなるので、PropTypesをなるべく指定しておく方がわかりやすくていいと思います。

### クリックイベントを送信するようにしてみる

次はクリックイベントを送信するようにしてみましょう。

```js
var request = require('superagent');
var ImageText = React.createClass({
  onClick() {
    request.get("/click_img", { img: this.props.src });
  },
  render() {
    var {text, ...other} = this.props;
    return (
      <span>{text}<img {...other} onClick={this.onClick} /></span>
    );
  }
});
```

こんな感じで`onClick`を追加することでPropの値をmergeしてくれます。`onClick`を`{...other}`の前に持ってくると`onClick`の挙動を上書きされてしまいます。

これをJSXなしで実装する場合は、_.extendやObject.assignなどを使うことになります。


こんな感じでComponentを拡張したい場合はJSXのspread attributesを使うと便利ですというネタでした。

明日はmixinについて書きたいと思います。
TwitterのcreatedAt(String)をDateにparseする

[Twitter Kit](https://dev.twitter.com/twitter-kit/android)で取得できるTwitterクラスの`createdAt`は、型がStringなのでDateとして扱うためにはparseする必要があります。

まぁ普通に`SimpleDateFormat`を使ってparseするだけでいいんですが、ちょっとハマったのでメモを残します。

```java
private static final String DATE_FORMAT_TWITTER = "EEE MMM dd HH:mm:ss ZZZZZ yyyy";

public static Date convertToDate(String twitterDate) {
    // 第2引数のLocaleをセットしないとエラーになるので注意。
    SimpleDateFormat sf = new SimpleDateFormat(DATE_FORMAT_TWITTER, Locale.ENGLISH);
    try {
        return sf.parse(twitterDate);
    } catch (ParseException e) {
        Log.e(TAG, e.getMessage());
        return null;
    }
}
```