OmniAICreator/Qiita-1.07M huggingface dataset:
Redis 4.0の新機能 (RC1 is out!)

Redis4.0 RC1がリリースされました

http://www.antirez.com/news/110

## 新しいレプリケーションの仕組み(PSYNC2)

レプリケーションの仕組みが新しくなります。
マスターのインスタンスが同一でなければ、スレーブがレプリケーションをいったん停止して再開したときに、停止時点からの
データの同期ができない(全データの同期が必要となる)という制限を取り除くものです。
これによってスレーブがマスターに昇格した場合などに、効率的に同期できるようになります。

詳細（英文）：
https://gist.github.com/antirez/ae068f95c0d084891305

## LFU

キャッシュアルゴリズムとしてLFU(Least Frequently Used)が使えるようになるようです。
参照回数に基づくデータの維持ができるようになるので、キャッシュとして使う場合に、適したケースではキャッシュヒット率をあげられます。

## 動的ロード可能な拡張モジュール

Redis 4.0からは動的ロードによってモジュールを読み込み、Redisの機能を拡張することができます。

モジュールを使って新しいデータ型やコマンドを実装することができます。

例えばRedis作者自身によるニューラルネットワーク機能はモジュールによって実装されています。
https://github.com/antirez/neural-redis

またサンプルとしてhelloworldモジュールもrepository内にあります。
https://github.com/antirez/redis/tree/unstable/src/modules

詳細（英文）：
http://antirez.com/news/106
https://github.com/antirez/redis/blob/unstable/src/modules/TYPES.md

## RDB-AOF mixed format

AOFファイルの先頭にRDBのデータを保持したRDBとAOFを合体させたフォーマットが使えるようになります。
aof-use-rdb-preamble というオプションで設定できます。

RedisではAOFファイルが肥大化したときやBGREWRITEAOFコマンドを実行したときにAOFファイルのサイズを小さくするための最適化処理が実行されます。
このフォーマットを使うことで最適化後のファイルサイズの削減やロード時間の短縮などができるものと思われます。

## Background Deletion

delコマンドやexpireの期限によってオブジェクトの解放が必要になったときに、即座に解放処理を行わずに、バックグラウンドスレッドに解放処理を移譲する機能のようです。

下記の３つのオプション追加が確認できるので、background deletionの有効・無効はオブジェクトの解放の種類ごとに設定で決められるようです。

lazyfree-lazy-eviction
lazyfree-lazy-expire
lazyfree-lazy-server-del

関連ソース：
https://github.com/antirez/redis/blob/unstable/src/lazyfree.c
https://github.com/antirez/redis/blob/unstable/src/bio.c

## MEMORY

MEMORYコマンドが追加されています。
いくつかサブコマンドがあり、メモリの使用状況などを確認できます。

```
127.0.0.1:6379> MEMORY HELP
1) "MEMORY USAGE <key> [SAMPLES <count>] - Estimate memory usage of key"
2) "MEMORY STATS                         - Show memory usage details"
3) "MEMORY PURGE                         - Ask the allocator to release memory"
4) "MEMORY MALLOC-STATS                  - Show allocator internal stats"
```
Yesodのテンプレートから生成されるファイルの役割

Yesodを使ってWebアプリケーションを作るとき、よほどのことがなければYesodのベストプラクティスが詰まったテンプレートをベースに開発するのが、無難な選択です。

Haskellのビルドツールである[stack](https://docs.haskellstack.org)にはYesodのテンプレートが提供されています。

このエントリではテンプレートが生成するファイルの中でも、特に重要なものを解説します。

各ファイルの役割を知ることで、独自のカスタマイズや拡張を施したいときに、どうすればいいか当たりが付けやすくなります。

# stackでYesodプロジェクトを作る

例えば、データベースがPostgreSQLのYesodプロジェクトをテンプレートから生成するコマンドは次のようになります。

```
stack new <プロジェクト名> yesod-postgres
```


# stackが生成する初期ファイル

```
  ▸ app/
  ▸ config/
  ▸ Handler/
  ▸ Import/
  ▸ Settings/
  ▸ static/
  ▸ templates/
  ▸ test/
    Application.hs
    Foundation.hs
    Import.hs
    Model.hs
    Settings.hs
    stack.yaml
    test.cabal
```

# app/ディレクトリ

さわることはありません！

# config/ディレクトリ

```
  ▾ config/
      favicon.ico
      keter.yml
      models
      robots.txt
      routes
      settings.yml
      test-settings.yml
```

名前の通り、設定系のファイルがあります。

## favicon.ico
ファビコンファイルです。自分のサイトのファビコンを作って上書きします。

## keter.yml
Yesodをデプロイするツールであるketerの設定ファイルです。
keterを使うと非常にデプロイが便利なので、利用をおすすめします。
keter.ymlはそのままでは使えません。環境に合わせて編集が必要です。

## models
データベースのスキーマを書きます。
とても重要です。
私は新しい機能を開発するときは、まずこのファイルを編集します。

## robots.txt
Googleのクローラーなどに指令を出します。
Yesod独自のファイルというわけではなくWebサイトでは一般的に使うファイルです。

## routes
どのURLにどのメソッドでリクエストが来た時に、どのハンドラ関数が動くかを書きます。
とても重要です。

## settings.yml
その名の通り、各種設定です。
データベースの設定やコピーライトなどを書きます。
独自の設定を追加することもできます。

### test-settings.yml
テスト時の設定です。

# Handler/ディレクトリ

最もよく触るファイルが格納されています。
いわゆるハンドラ関数、つまりURLにリクエストが来た時に動作する関数が定義されたファイルを格納します。

Yesodでの開発は、ハンドラ関数を作るのがメインの作業です。

# Import/ディレクトリ

 ``` NoFoundation.hs ``` というファイルが１つだけ格納されています。
たまに触ります。
ハンドラ関数の中でよく使うパッケージをまとめたファイルで、トップレベルにある ``` Import.hs ``` から参照されています。
ハンドラ関数の中で頻繁に使うユーティリティを書いた時に編集することがあります。

# Settings/ディレクトリ

 ``` StaticFiles.hs ``` というファイルが１つだけ格納されています。
触ることはありません。

# static/ディレクトリ

その名の通り、静的なファイルを格納するため、「触るときは触る」とい感じです。

重要なのは、YesodとReactを組み合わせるときです。
Reactをコンパイルした結果のJavaScriptファイルはこのディレクトリの下に格納することになるので、その場合は非常に頻繁に触ることになります。


・・・他のファイルの役割は、随時追加していきます。
技術英語 > changes during construction can be more [freewheeling] / rework

@ Code Complete (No. 18154 / 36077)
> changes during construction can be more **<font color=red>freewheeling</font>** - the system is in a more dynamic state, and the penalty for making mistakes is low.

http://www.merriam-webster.com/dictionary/freewheeling
> c :  not bound by formal rules, procedures, or guidelines <a freewheeling investigation>

作り始めの失敗の対策コストは低い。

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

http://e-words.jp/w/%E6%89%8B%E6%88%BB%E3%82%8A.html
> rework

https://github.com/mrdoob/three.js/commit/1e5fc98582e2663bd068d3f22ea6b2da9440b7f0
> Reworking Scene Graph setup.
fishシェルでSDKMANを使えるようにする方法

良いと聞いたfishシェルをお試し中。が、SDKMANが動かない…。

fishシェルでも動作する方法を上げてくれている人がいて、その方法＋αで一応動作するようになった。

ほとんど、 [Using SDKMAN with the Fish Shell | Ted Wise](http://tedwise.com/2016/02/26/using-sdkman-with-the-fish-shell) に書いてある方法。

まずは、 ``~/.config/fish/functions/sdk.fish`` を以下の内容で作成。（上記Webサイトから転載）

```bash:sdk.fish
function sdk --description 'Software Development Kit Manager'
  set after_env (mktemp -t env)
  set path_env (mktemp -t env)

    bash -c "source ~/.sdkman/bin/sdkman-init.sh && sdk $argv && printenv > $after_env"

    # remove any pre-existing .sdkman paths
    for elem in $PATH
      switch $elem
        case '*/.sdkman/*'
          # ignore
        case '*'
          echo "$elem" >> $path_env
      end
    end

    for env in (cat $after_env)
      set env_name (echo $env | sed s/=.\*//)
      set env_value (echo $env | sed s/.\*=//)
      switch $env_name
        case 'PATH'
          for elem in (echo $env_value | tr ':' '\n')
            switch $elem
              case '*/.sdkman/*'
                echo "$elem" >> $path_env
            end
          end
        case '*'
          switch $env_value
            case '*/.sdkman/*'
              eval set -g $env_name $env_value > /dev/null
          end
      end
    end
    set -gx PATH (cat $path_env) ^ /dev/null

    rm -f $after_env
    rm -f $path_env
end
```

これで、例えば ``sdk list gradle`` すると実行はできるようになる。
ただ、これだけだと、シェルを開いた時に ``gradle -v`` するとPATHが通ってなくて実行できなくて、一回何かしらsdkコマンドを実行しないとダメ。

なので、 ``config.fish`` に以下を追記する。

```bash:config.fish
sdk help > /dev/null
```

ここまでの設定をすれば、fishシェルでもSDKMANが使えるようになるんだけど、SDKMANにアップデートがあると、アップデート可否の質問が出たまま止まってしまう…。
これを防止するために、暫定でSDKMAN自身のアップデートを自動に設定しておいた。

```bash:~/.sdkman/etc/config
sdkman_auto_selfupdate=true
```

## 関連：fishシェルでJAVA_HOMEを設定
Macで、zshとかbashから引き継いで、

```bash
export JAVA_HOME=`/usr/libexec/java_home -v 1.8.0_45`
```

って、 ``config.fish`` に書いてもJAVA_HOMEがセットされない。

fishシェルの場合は、こんな書き方。 ``java_home`` の実行がバッククォートじゃないのがポイント。

```bash:config.fish
set -x JAVA_HOME (/usr/libexec/java_home -v 1.8.0_45)
```

これで、SDKMANもSDKMANでインストールしたものも実行できるようになる。

## 参考
* [Using SDKMAN with the Fish Shell | Ted Wise](http://tedwise.com/2016/02/26/using-sdkman-with-the-fish-shell)
「おなじテストを複数回実行する」から見るSpockのUnrollの世界

# はじめに
このエントリーは[G*Advent Calendar(Groovy,Grails,Gradle,Spock...) Advent Calendar 2016](http://qiita.com/advent-calendar/2016/gastah)の3日目の記事です。
前日は[@it__ssei](http://qiita.com/it__ssei)さんの[Groovyでログを出す方法まとめ](http://qiita.com/it__ssei/items/e43bee9ceff60536dc55)でした。

今日はSpockの小ネタ書きます。

# 複数回おなじテストを実行する
タイトルのとおりなのですが、まれにこういうケース、ありますよね。
どうやったらできるんだろう？　ってわからなかったので調べました。

## 結論：Unrollでできる

こんな感じ

```groovy
import spock.lang.Specification
import spock.lang.Unroll

class RunMultipleTimesSpec extends Specification {

    @Unroll
    def "#n回目のテスト"() {
        expect:
        println n

        where:
        n << (1..10)
    }
}
```

Unroll、こういう記法もあるんですね。

## なぜこんなことができるのか

Spockのwhereといえばテーブル記法のイメージだったので、こんな書き方もできるんだなー。
でもどうしてできるんだろう？

と思って調べたらドキュメントにかいてありました。
- 本家：http://spockframework.org/spock/docs/1.0/data_driven_testing.html
- 日本語版はこちら：http://spock-framework-reference-documentation-ja.readthedocs.io/ja/latest/data_driven_testing.html#data-pipes

曰く

```
データテーブルだけが、データ変数へデータを供給する唯一の方法ではありません。データテーブルは、実際には1つ、または複数のデータパイプのシンタックスシュガーです。
(中略)
データパイプは左シフト（<<）演算子を使用し、データ変数とデータプロバイダを接続します。データプロバイダはイテレーションごと1つ使用する、すべての値を保持します。データプロバイダには、Groovyでイテレーションが可能なオブジェクトであれば、どんなオブジェクトでも使用できます。
```

とのこと。なのでこういった書き方もできるらしい

```groovy
where:
a << [3, 7, 0]
b << [5, 0, 0]
c << [5, 7, 0]
```

それどころか、

```
データプロバイダの値をテキストファイルや、データベース、スプレッドシート、またはランダムに生成したデータといった、外部リソースからデータを取得することもできます
```

とのことで、例にこんなのがでてました

```groovy
where:
[a, b, _, c] << sql.rows("select * from maxdata") // 不要なデータは _ に入れると無視されるらしい
```

# まとめ
SpockのUnrollとwhere、まだまだ奥深いので調べてみるともっといろんな場面でつかえそう！

## 明日のエントリー
再びの[@it__ssei](http://qiita.com/it__ssei)さんです。よろしくお願いします！！
Heroku + DockerでRedmine

一人でお勉強するにも目標なくやっていると色んな誘惑に負けそうになるので
子供のご褒美シールという程のものでもないけど工程管理で達成感を持ちたい！

## Heroku
以下を頼りにインストールしていると
https://devcenter.heroku.com/articles/container-registry-and-runtime

```
heroku container:login
```
ここの部分でエラー発生

```
events.js:160
      throw er; // Unhandled 'error' event
      ^

Error: spawn docker ENOENT
    at exports._errnoException (util.js:1007:11)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:182:32)
    at onErrorNT (internal/child_process.js:348:16)
    at _combinedTickCallback (internal/process/next_tick.js:74:11)
    at process._tickCallback (internal/process/next_tick.js:98:9)
    at Function.Module.runMain (module.js:577:11)
    at startup (node.js:160:18)
    at node.js:456:3
```
ググってもポート解放してないんじゃないっていう旨の解決策が書いてあって
解放してもダメでした・・・ということでherokuは辞め！
NSSortDescriptorを使用したNSMutableArrayのソート【swift 3.0】

NSSortDescriptorを使用したNSMutableArrayのソートのサンプル

```swift
// swift 3.0

// テストデータ
let data:NSMutableArray = [
  ["id":1,"published":"2016-12-02 10:00:00"],
  ["id":2,"published":"2016-12-01 12:00:00"],
  ["id":3,"published":"2016-12-02 11:00:00"]
]
        
// publishedでソート
let sd = NSSortDescriptor(key:"published",ascending:false) // 降順
let result = data.sortedArray(using: [sd]) as NSArray
        
print(result)

/* 出力結果
(
    (
        {
            id = 3;
            published = "2016-12-02 11:00:00";
        },
        {
            id = 1;
            published = "2016-12-02 10:00:00";
        },
        {
            id = 2;
            published = "2016-12-01 12:00:00";
        }
    )
)
*/
```

ソートキーを複数指定する場合

```swift

let sd1 = NSSortDescriptor(key:"key1",ascending:false) // 降順
let sd2 = NSSortDescriptor(key:"key2",ascending:true) // 昇順

let result = data.sortedArray(using: [sd1,sd2]) as NSArray

```
WindowsにNeo4jをサクサク入れる

# chocolatelyインストール
macでいうhomebrew。

コマンドプロンプトを管理者で開く(Win + Xの後、A)

```bat
@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin
```

## PowerShellで入れたい方はこちらを参照
事前にPowerShell上でバージョンを確認しておくと良い

```shell-session
$PSVersionTable
```

「Chocolateyを使った環境構築の時のメモ」http://qiita.com/konta220/items/95b40b4647a737cb51aa

# Neo4j Community Editionインストール

```bat
choco install neo4j-community
```

## コマンドプロンプトの場合

インストール後、再起動する

## PowerShellの場合

インストール後、環境変数を反映する

```shell-session
refreshenv
```

# インストール後の作業
インストールとともに自動で起動してくる

## ユーザ設定

http://localhost:7474
にアクセスし、初期パスワードを入力する(画面に表示されている)


## チュートリアル

「Jump into code」の「Write Code」を押す。

「Movie Graph」の「Create a graph」を押す。

あとは画面の説明に従って進めると、こんな感じに映画DBのサンプルが表示できる。簡単！

![neo4j.png](https://qiita-image-store.s3.amazonaws.com/0/31245/5b56c5fb-0fb8-2081-d06b-db05c2b654ab.png)
クリップボードの内容でファイル作成

#動機
ブラウザゲーな感じのクリッカーゲームやっててデータのExportしてゲームデータをシリアライズしたような大量の文字列をコピーしたりペーストしたり名前つけて保存したりするんですが、
いちいちファイル作ってコピーしたり貼り付けたりも面倒なので

#方法
ゲーム上からデータのExportでセーブデータ文字列をコピーしたらターミナルから

echo `xclip -o -selection clipboard` > /saveTo/hogehoge`date +"%Y_%m%d-%H%M"`

でクリップボードの内容で日付付きのセーブデータにしちゃう
（毎回ファイル作ってるコマンド打ってるとヒストリも大変なことになってくるので1つのコマンドで）

環境はubuntuだけど
xclipは標準でインストールされてないのでapt-getしてください
HBase 1.2で導入されたSimpleRegionNormalizerについて

[Distributed computing (Apache Hadoop, Spark, ...) Advent Calendar 2016](http://qiita.com/advent-calendar/2016/distributed-computing)の二日目です。HBase 1.2で導入され、CDH 5.7以降に含まれるSimpleRegionNormalizerを紹介します。本記事で対象とするロジックは[CDH 5.9.0](https://github.com/cloudera/hbase/blob/cdh5.9.0-release/hbase-server/src/main/java/org/apache/hadoop/hbase/master/normalizer/SimpleRegionNormalizer.java)とします。

さて、その名のとおりこれは非常にシンプルな機能で、定期的に指定されたテーブルの平均リージョンサイズをチェックし、（算術）平均から上下に大きく外れたサイズのリージョンをスプリット、あるいはマージすることでリージョンサイズの偏りを解消するものです。チェック間隔はデフォルトで5分(300000ms)、HMasterの`hbase.normalizer.period`にてmsで明示的に指定することができます。

ただし、テーブル単位で動作するこのチェックはすべてのテーブルでデフォルト無効です。有効化するにはテーブルのプロパティで明示的に設定してやる必要があります。

```
> disable 'table_name'
> alter 'table_name', 'NORMALIZATION_ENABLED' => true
> normalizer_switch true
> normalizer_enabled
true
> enable 'table_name'
```

具体的なロジックを見てみましょう。

```SimpleRegionNormalizer.java
...
    int candidateIdx = 0;
    while (candidateIdx < tableRegions.size()) {
      HRegionInfo hri = tableRegions.get(candidateIdx);
      long regionSize = getRegionSize(hri);
      // if the region is > 2 times larger than average, we split it, split
      // is more high priority normalization action than merge.
      if (regionSize > 2 * avgRegionSize) {
        LOG.info("Table " + table + ", large region " + hri.getRegionNameAsString() + " has size "
            + regionSize + ", more than twice avg size, splitting");
        plans.add(new SplitNormalizationPlan(hri, null));
      } else {
        if (candidateIdx == tableRegions.size()-1) {
          break;
        }
        HRegionInfo hri2 = tableRegions.get(candidateIdx+1);
        long regionSize2 = getRegionSize(hri2);
        if (regionSize + regionSize2 < avgRegionSize) {
          LOG.info("Table " + table + ", small region size: " + regionSize
            + " plus its neighbor size: " + regionSize2
            + ", less than the avg size " + avgRegionSize + ", merging them");
          plans.add(new MergeNormalizationPlan(hri, hri2));
          candidateIdx++;
        }
      }
      candidateIdx++;
    }
...
```

たったこれだけです笑 
SimpleRegionNormalizerは、テーブルのリージョンをひとつずつ、まずは平均サイズの2倍を越えるかどうか確認します。もし2倍以上であればスプリット対象とし、次のリージョンを精査します。そうでなければ次のリージョンと足したサイズが平均以下かどうか確認し、もし平均に満たなければ両リージョンをマージ対象として次の次のリージョンの精査に入ります。

このようにスプリットあるいはマージ対象のリージョンを集め、HMasterがひとつずつ実行するわけです。

なお、リージョンの合計サイズが1MBに満たない場合、スプリットもマージも発生しません。
事実の自動評価

## 事実(fact)とは

ここでは、事実(fact)を次のような3つ組で表すとします。
`<entity, relation, entity>` です。

例えば、 

`Barack Obama is visiting Rome to attend the G8 Summit`

のような文があり、既に固有表現抽出できている時に以下のような3つ組考えられるとします。

![https://gyazo.com/67c7061e08f7ce2dd79f3921c8205e2d](https://i.gyazo.com/67c7061e08f7ce2dd79f3921c8205e2d.png)

その中で実際に正しいものが太文字になっていますが、これらを自動で正しいと評価するという話です。

## 自動評価の方法

[Automatic evaluation of relation extraction systems on large-scale](http://dl.acm.org/citation.cfm?id=2391204) では、ある何らかの事実抽出アルゴリズムを用いて抽出した事実が正しいのか、抽出されていないものの中で正しいものはないかを
次のように情報検索を使って推定しています。

![https://gyazo.com/b3dcc5e7241596ad223d7eeb2216bc0f](https://i.gyazo.com/b3dcc5e7241596ad223d7eeb2216bc0f.png)

このPMIの値がある事前に決めた閾値を上回ったものを正しいとします。

## 実験

ちょっとしっかり調べていないので、閾値などをどう決めるかわからなかったのですがとりあえず数値を出してみます汗

そういえば、今年の[SIGIR2017のオーガナイザー](http://sigir.org/sigir2017/organization/)に酒井哲也教授がいます。

### `"Tetsuya Sakai" AND ("SIGIR 2017" OR "SIGIR2017")`

[![https://gyazo.com/2ae6dadc57571cf1810da3abbad8ef0a](https://i.gyazo.com/2ae6dadc57571cf1810da3abbad8ef0a.png)](https://www.google.com/search?gl=us&hl=en&pws=0&site=webhp&q=%22Tetsuya+Sakai%22+%22SIGIR+2017%22&spell=1&sa=X&ved=0ahUKEwjU4sXfkdDQAhUKnJQKHZLtDqIQBQgZKAA&biw=1280&bih=699&dpr=2#gl=us&hl=en&pws=0&q=%22Tetsuya+Sakai%22+AND+(%22SIGIR+2017%22+OR+%22SIGIR2017%22))

### `"Tetsuya Sakai" AND "organize" AND ("SIGIR 2017" OR "SIGIR2017")`

[![https://gyazo.com/52a6b74faefe9029f9c1de532f4899a3](https://i.gyazo.com/52a6b74faefe9029f9c1de532f4899a3.png)](https://www.google.com/webhp?gl=us&hl=en&gws_rd=cr&pws=0#gl=us&hl=en&pws=0&q=%22Tetsuya+Sakai%22+AND+%22organize%22+AND+(%22SIGIR+2017%22+OR+%22SIGIR2017%22))

### `"Tetsuya Sakai" AND "general chairs" AND ("SIGIR 2017" OR "SIGIR2017")`

[![https://gyazo.com/b508679c8163a46caa606e74fbeae531](https://i.gyazo.com/b508679c8163a46caa606e74fbeae531.png)](https://www.google.com/webhp?gl=us&hl=en&gws_rd=cr&pws=0#gl=us&hl=en&pws=0&q=%22Tetsuya+Sakai%22+AND+%22general+chairs%22+AND+(%22SIGIR+2017%22+OR+%22SIGIR2017%22))

$$
\frac{272}{458} = 0.59 \cdots
$$

はい。。。。
他でも試してみないとわからないですね。。。


## まとめ

SIGIR が東京であります。
行きたいです。

## 参考

* [Automatic evaluation of relation extraction systems on large-scale](http://dl.acm.org/citation.cfm?id=2391204)
* [日本からアメリカのGoogle (google.com) で英語で検索する方法](https://www.suzukikenichi.com/blog/how-to-search-on-google-com-in-english-from-japan/)
class名のせいでコンテンツが表示されなくなっていた件

<h2>概要</h2>
Webサイトのコンテンツが一部消えているようだ、
とユーザーから指摘を受け対応した話。

社内PCからはきちんと表示されているので、
不思議に思いながら調査していたところ、
消えたとされる要素のクラス名に、ある共通点があることに気づきました。

<h2>原因</h2>
単刀直入に言うとAdBlockの影響でした。

**idやclassに"ad"から始まる文字列が入っていると、広告と判断されてしまい消されることがあるようです。**

今回の場合は、西暦の意味の"AD"を含むクラス名が原因でした。

<ul>
西暦だけでなく、
<li>アドオン開発</li>
<li>広告関連ツール</li>
<li>注意欠陥障害</li>
<li>アルツハイマー病</li>
<li>アンドラ公国</li>
</ul>
など略称が「AD」になる分野のサイトを作る際は注意が必要ですね。

あと他サイトで"ansbg"というクラス名を持つdivが消えている例も見かけました。何ででしょうね。
IoTプラットフォームについて思うこと

#はじめに
 [さくらインターネットのアドベントカレンダーの３日目](http://qiita.com/advent-calendar/2016/sakura)　のエントリーになります。

IoTに対する定義や、細かいテクノロジーについてはきっと他の人がやってくれると思いますので、僕がごくごく個人的に最近IoTについて思っていることについて、書かせていただきます。
畑違いの分野も多いので間違った認識をしていたり、正確性を欠く表現があるかもしれませんが、「僕はこう思っている」ってことで書いているのでよろしくお願いいたします。


#IoTは次の世の中を動かす技術の一部分のその要素でしかないと思うんだ

最近よく「IoTって何ができるんですか？」という質問を受けます。
この質問は結構きつくて、IoTって次の世の中を構成する技術の一つでしかなくて、それ単体では、とくに何というわけではないのかなと考えています。
今まででもできていたっていうのはもちろんあって、下に挙げたいろいろな技術が少しずつ世の中に浸透して、仕事や生活が変化し始めているのが今じゃないのかなぁ。

+ センサー	：　モノゴトを電気信号に変換するもの、最近はとてつもなく安価になったね
+ IoT		：　世の中のモノゴトのデータを集めたり、モノゴトにつたえたりするよ。
+ AI		：　集められたデータの分析し相関性・関連性をもった情報が得られるんだって。
+ ロボティクス	：　情報を元にリアルの世界にフィードバック！、自動運転とかも広い意味ではそうかもね
+ VR		：　リアルとバーチャルの境界線を人間が超えるための技術なんじゃないかなぁ。
+ フィンテック	：　モノとヒトとの間で価値をやりとりさせるためのテクノロジーじゃないかな。

リアルの世界に出てくるときに、複数の技術が組み合わさっているし、ベースとなる部分に、クラウドとかのコンピューティングリソースを使うので、わかりにくなっているのはそうなんだろうなぁ。

#ところで、「仕事」ってさ

古代ギリシアでは、仕事はいくつかに分類されて理解されていたっていう本を読んだんすよ。

- レイバー	：作業
- アート・ワーク	：芸術・建築
- アクション	：考えの伝播・伝達

僕は現代の仕事は、上記３種類が個別に存在しているのではなく、ひとつの仕事の中に複雑に組み合わさるかたちでできていると思っています。最近AI技術の発達によって、人の仕事が奪われるということを聞くようになりましたが、
職種がなくなるというよりは、自分の仕事の中のレイバーの部分が次第に減っていくことから始まるのかな。


#おっと、IoTだった。

AIにやってもらおうが、人間がやろうが情報をまずはデータを取ってくることが必要、ほしいのは、データ。データがあることが絶対に必要だと思っているんです。

ネットワークにデータを上げる、それが使いやすいところから使えるようにして、そのフィードバックをおくるのが、
本来の目的だったのではないかな？
人のインターネットから使えることは大切だけど、僕らはそこをあえて分割することによって、極めて安全で安心できる
モノゴトのデータのネットワーク化を進めようとしているのが”今”なのかなぁ。


今、世の中では、いろんな分析や解析を比較的簡単にかつ低コストで扱うことができるようになってきていますね。僕の所属しているさくらインターネットは、そういったことの基盤となるようなデータセンターや高火力コンピューティングという、サービスを提供しています。
どれか一つの技術をどうするかというよりは、技術をベースにしながら、次の世界でテクノロジーが貢献できる部分をしっかりやっているという感覚がすごくある。
新しい技術を使って、あたらしい生活をするための布石の一貫って感じかなぁ。。。


#僕らのチームが提供しているもの
いま部屋いる人はちらっと周りをみてください、電気を使って動いているたくさんのものってありますよね？
いまある家電とか、電気を使って動いているモノには、マイコンっていう小型のコンピュータが使われているんですよね。
まずはこれらが通常使っている電気信号とネットワークで使っているJSONを双方向に変換する仕組みを作ってやらなくてはいけないことじゃなくて、やりたいことを実現しやすいようにする。これがいま僕らのチームが作って、提供しようとしているさくらのIoTプラットフォームかな。

簡単に書いているけど、実際のプラットフォーム中身は、マイコンの知識やモバイルキャリアに関する知識、クラウド側のネットワークの知識、外部の仕組みと連携するための知識、いろんな知識とアイディアを総動員して、やりたいことがある人が本当にやりたいことに集中できるような仕組みを作り上げているのが今かなぁ。やばいくらいギリギリでいろんな方針を決めたり作ったりしています。

そういえば、僕のチームはチャットやGitを多用し、業務時間や場所やむしろ所属企業にさえとらわれない、あたらしい働き方をしている若いメンバーがたくさんいます。（そういや、前にあったのいつだったっけ？みたいな人もいるなぁｗ）
そして、それを会社としてサポートする仕組みがどんどん出来ています。なんだか会社自体が超高速で進化を続けているのが実感できていますね。
僕の参加している他にもたくさんチームはあるのですが、言うなれば、それぞれが企業内ベンチャー企業のような形でどんどん進んでいる感じで、とても楽しいですよ！

どんな形でも一緒に働ければうれしいですね！
[もし興味を持ってくれた方](https://www.sakura.ad.jp/recruit/) がいたらぜひ！
Electronで-webkit-app-region: dragが効かない場合も焦る必要はありません

Electronでアプリケーションをドラッグ可能にするときに下記のようなCSSを追加します。

```html:main.html
<body style="-webkit-app-region: drag">
</body>
```
開発を進めていてドラッグが効かなくなって、モヤモヤした日々を送っていたのですが、単純にデベロッパーツールを非表示にすればドラッグが効きましたとさ。

ずっとデベロッパーツールを表示していたから気づかなかったんですね。
Azureのファイアーウォール設定

#ネットワークセキュリティーグループ(NSG)
ネットワーク セキュリティ グループ (NSG) には、仮想ネットワークの VM インスタンスに対するネットワークトラフィックを許可または拒否する一連のアクセス制御リスト (ACL) 規則が含まれています。[引用](https://docs.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-nsg)

**要は、リソースマネージャーごとにファイアーウォールの設定が可能であるということ**

**NSGの設置条件**

- 仮想マシン(クラシックのみ)
- NIC(リソースマネージャーのみ) ※ 1つのNICに 1つのNSG
- サブネット(クラシック＆リソースマネージャー)

**NSGの制限**

- NSGを設置できるのは、1箇所につき1つ
- サブスクリプション内のリージョンごとに 100まで
- NSGあたりのルール数 200まで

#ネットワークセキュリティーグループ(NSG)の作成
下記の順番にアクセスし、NSGを作成する
【新規】➡︎【ネットワーキング】➡︎【ネットワークセキュリティグループ】➡︎【作成】
![1.png](https://qiita-image-store.s3.amazonaws.com/0/130097/bebc399f-e1db-f25f-2da1-4bb8ed81b5a1.png)

- **名前:任意**
- **リソースグループ：既存のもの**
- **場所：任意**

![2.png](https://qiita-image-store.s3.amazonaws.com/0/130097/989ec3e8-bc58-3939-f492-c7fddfe1d418.png)

作成されたNSGの設定の中の**受信セキュリティ規則**を選択し、**【追加】**をクリック
ここでは受信側のファイアーウォールの設定をしているが送信側の設定もできる！！

![3.png](https://qiita-image-store.s3.amazonaws.com/0/130097/adba0f91-1192-69d7-0553-ad96e3935bfe.png)

適当に追加したい名前と優先度、ソースやサービスプロトコル、ポートを設定することで、アクセス制限を設けることができる。　例えば、あるリソースはWebサーバしか使っていないのであれば、それ以外のアクセスはおかしいであったり、そういう面で役に立つ

- 名前：任意
- 優先度：100～4096 **※小さい数が優先**
- ソース：送信元IP
- プロトコル：【TCP/UDP】
- 宛先ポート範囲：宛先のポート番号
- アクション：【拒否/許可】

設定が完了したら**【概要】**からACL(アクセス制御リスト)を確認できる
![4.png](https://qiita-image-store.s3.amazonaws.com/0/130097/b8ad2e5b-cc0e-cd8f-9610-3f34e49918c6.png)


#参考
http://www.cloudou.net/virtual-network/vnet002/
https://docs.microsoft.com/ja-jp/azure/virtual-network/virtual-networks-nsg
フリーランスになって、嫌な思い出

まあ、「フリーランスエンジニア」という、名称はカッコイイですが、
実情は使い捨ての派遣エンジニアです。
もっと言い方を悪くすれば、フリーターです。

数年フリーランスで働いていれば、嫌なことや嬉しいこともあるので、
今日は先に嫌なことを書きます。

## 嫌な事その１「人間として扱われなかった」

とある大手ベンチャー企業に某C社の紹介でSESで働くことになりました。
まあ、よくある労働時間精算の準委任委託請負業務で、業務の指示は
常駐先の上司から指示を受けるが、納品物を保障しない形式です。

面接の時に、「そこまで早くコードは書けないし、Githubも苦手です。」と
嘘偽り無く申し出ました。

案の定、GitのCommit時に謎のエラーで手間取ってしまったり、ソースコードを
書くのが若者に比べて遅かったりして、その分を取り戻そうと、早く来て、遅く
まで作業をしていました。
特に、その作業を指示した上司から、進捗も普通に聞かれ、注意もされず、
歓迎会という飲み会が開かれ、その次の日の７営業日目の朝。
その上司に呼び出されました。

「君は、スキルが足りてないから、今日から来なくていいよ」

突然の話で混乱している自分に、その上司はさらに追い打ちをかけ、

「契約して7日目だから、まだクーリングオフが出来るよな」
「次は使える人間を紹介して欲しいと（某C社の営業に）言ってくれ。」

と、まるで不良品だから返品扱い。

もうその日は、業務をさせて貰えず、自分のPCを持ち込んでいたので、
その上司の目の前で業務に関するデータを全て消去して、帰路に着きました。

エンジニアはロボットじゃないので、感情もあります。
悔しい気持ちで一杯で、夕食を食べずにその日は寝ました。

お金の事で、内容証明を送りつけられたのも嫌だったけど、
人間扱いされないフリーランスの現場の方がもっと嫌でした。

その人間扱いされない会社って、大手有名ベンチャー企業の某社だったんですけどね。

そんなことを平然とやる人間が作るWebサービスなんか使いません。
もう二度と関わりたいとも思いません。

これでちょっと心の病気にもなり、しばらくは生きているのが辛い日々を送っていました。


まあ、フリーランスでやっているといろんな人と出会うので、こういう人間扱いしてくれない上司に出会うこともあるよってことで。

では、また明日。
[WIP]Visual Studio Team ServicesでXamarinをもっと楽に使う

# はじめに
アドベントカレンダーのXamarinツヨイ人たちの記事を読んで、「Xamarinを使って、自分も始めるか」という気分になった時に読んでください。

## 対象読者
以下のいずれかに心当たりのある人

* 興味がある
  * モバイルアプリ開発に興味があり、Windowsを使っている
    * [Xamarin](https://www.xamarin.com/)に興味を持っていると尚良い
  * Xamarinアドベントカレンダーを読み始めた
* 開発したい
  * でも、課金したくない
  * 開発には[CI(継続的インテグレーション)](https://ja.wikipedia.org/wiki/%E7%B6%99%E7%B6%9A%E7%9A%84%E3%82%A4%E3%83%B3%E3%83%86%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)を活用したいけど、複数のサービスを使うのはメンドイと思っている
  * でも、1人でも始めたい

## 今回のシナリオ
1. Xamarinアドベントカレンダーで、イケてる記事が公開される
1. [GitHub](https://github.com/)に登録されていたら、自分もForkして試せる
1. さらに言うなら、もっとラクに試したい

### 準備
アカウントをまだ持っていなかったり、Visual Studioをインストールしていない場合は、準備しましょう

* Visual Studio
  1. [Visual Studio 2015 with Update 3のダウンロード](http://qiita.com/masanori1102/items/57ee992d1531d55f77c6)
  1. Visual Studio 2015 with Update 3のインストール
* GitHub
  1. アカウントの登録
      * [今さら聞けない！GitHubの使い方【超初心者向け】 | TechAcademyマガジン](https://techacademy.jp/magazine/6235)を参考に、GitHubのアカウントをFreeプランで登録しましょう
  1. リポジトリを作る(または、Forkする)
      * Forkについては、[初心者がプルリクまでに覚えるべきたった 9つの厳選 Gitコマンド - akiyoko blog](http://akiyoko.hatenablog.jp/entry/2014/12/02/000939)参照しましょう
  1. 外部サービスと連携する為に、Personal access tokensを発行する
      * [Visual Studio OnlineとGitHubを連携する方法 GitHub側準備編 #tfsug](http://changesworlds.com/2015/07/how-to-cooperation-of-visual-studio-online-and-github-github-side-setup-guide/)を基に、外部サービスと連携する為に、Personal access tokensを発行します。GitHubのUIは変更されていますが、同様の操作が可能です。なお、**生成されたPersonal access tokensをコピーして保存するのを忘れずに**
* Visual Studio Team Services(VSTS)
  1. [使い始める](http://qiita.com/masanori1102/items/310c41666830d7b7bc6d)
  1. プロジェクトを作成する
     * Recent projects & teamsのNewを選択し、プロジェクトを追加します![vsts_home.png](https://qiita-image-store.s3.amazonaws.com/0/46949/dfe000df-662e-cf7a-ba5f-4f1ac221a04b.png)
     * この時、Process TemplateはAgileかScrum、Version controlはGitにしましょう![CreateTeamProject.png](https://qiita-image-store.s3.amazonaws.com/0/46949/68fa503a-8895-4adc-84c5-4c34b444f87c.png)
* [Xamarin](https://www.xamarin.com/)
  1. Xamarinアカウントを作成する
     * パスワードを忘れた人はリセットしましょう

### ゴール
記事を読んだ人が、「もっと『面白そうな、良い』プログラムに触れて、自分でもいろいろ試そう」って気持ちになる事

# 手順
1. Visual Studio Team Servicesを開く
1. 準備でVisual Studio Team Servicesに作成したプロジェクトを開き、Build & Releaseを選択する![vsts_project_home.png](https://qiita-image-store.s3.amazonaws.com/0/46949/9c0b7a90-91c0-9e06-53b6-9cb874f22a96.png)
1. +ボタンを押し、表示される[Create new build definition]でテンプレート(本記事では、Xamarin.Android)を選択し、Nextを押す![vsts_Create_new_build_definition.png](https://qiita-image-store.s3.amazonaws.com/0/46949/d6c3e2a3-dab2-5d75-4684-4e53e7313932.png)
1. Repository sourceでGitHub、Default agent queueでHostedを選択したら、Createを押す![vsts_Create_new_build_definition2.png](https://qiita-image-store.s3.amazonaws.com/0/46949/c3ca439f-74bd-e009-d523-2d08a2809e54.png)
  * Hostedを選択する事により、毎月240分無料でビルドをVSTSでおこなう事が可能になります。

---以降は、後で追加する
Paper Plane xUI(PPx)とLinuxコマンドの連携

PPxからLinuxコマンド等、外部コマンドの実行は、まずショートカットキーやメニュー、ファイル判別時に実行されるコマンド群登録内容を設定し、そこから直接、もしくはPPb経由で行えます。

なお、この登録内容の事を、この記事内では便宜上「コマンド群」と呼ぶ事にします。

![commands.png](https://qiita-image-store.s3.amazonaws.com/0/51728/efc237da-3efc-77b1-9923-6f89fcd2067b.png)

# コマンド群で出来る事

以下の事が出来ます、詳しくは[公式HELP](http://toro.d.dooo.jp/ppxhlp.html)へ。

* 外部コマンドの実行
  * %Ob、または%OBでPPb経由で実行
* 内部コマンドの実行
  * 上記画像で見えてる「*script」は[PPx Script Module](http://toro.d.dooo.jp/slppx.html#ppxscr)で追加されるスクリプトを実行するコマンド
* 環境変数やエイリアスの展開
  * %'ARG'、%'ALIAS'等で展開
* マクロ文字の利用
  * %FCで選択中のファイル名、等
* *ifmatchによる条件分岐

これらを連携しコマンド群を書くことが出来ますので、一種のスクリプトのようになっています。

例えば、以下のようなコマンド群の場合

```
%OB echo %#
```

PPb経由でechoコマンドを実行し、選択したエントリー一覧を引数として渡して表示します、選択したエントリーの数が多いと自動で複数回の実行に分割されます。

```
%OB echo %FC
```

この場合は、エントリーの数分だけエントリーが一つ一つ渡されてechoが実行されます。


# Linuxコマンドとの連携方法

エントリー一覧をLinuxコマンドへ渡したり、将来的にLinuxコマンドの実行結果をListFileに出力したいとなると、コマンド群の実行は一度で抑えたくなります。
%#でも引数の最大幅を超えると分割動作する為、この辺りの処理を自作します。
スクリプト内で外部コマンドを実行する処理を書く方法もありますが、こちらはパイプが使えない、標準出力へ出せない、引数の最大幅の制限がある、等の影響を受けます。

ではどうするかというと、エントリー一覧をテキストファイルに吐き出し、そこから標準出力へ吐きだします、そうすればあとはパイプとxargsがありますのでLinuxコマンドの連携は何とかなります。

## エントリー一覧のテキストファイル書き出し

この処理は、JScriptで書きます。

```js:entry2file.js
//!*script

//
// エントリー一覧をfilepathへと書き出す
// 引数のサイズ制限の為に実行が複数へと分けられないようにするのに使用
//
// PPx.Arguments.item(0) : 対象のファイルパス
//

var filepath = PPx.Arguments.item(0);
if (filepath == '') {
	PPx.Echo('not found path');
	PPx.Quit(-1);
}

// エントリー一覧をファンクタへと渡す
function enumEntryName(callback) {
	for (var items = new Enumerator(PPx.Entry); !items.atEnd(); items.moveNext()) {
		callback(items.item().Name);
	}
}

// エントリー一覧の書き出し
// ListFileの場合
//file.WriteLine(";ListFile");
//file.WriteLine(";Base=" + PPx.Extract("%1") + "|1");
var fs = new ActiveXObject("Scripting.FileSystemObject");
var file = fs.OpenTextFile(filepath, 2, true);
enumEntryName(function (entryName) {
	file.WriteLine(entryName);
});
file.Close();
```

## エントリー一覧テキストから標準出力への吐き出し

エントリー一覧は単純な一覧テキストのため、catコマンド出力で十分です。
スクリプトのパスを各自の環境に合わせて下さい。

```:コマンド群
*set ENTRY_FILE=%'temp'\entryfile.tmp
*script %0\script\entry2file.js, %'ENTRY_FILE'
%OBsq cat %'ENTRY_FILE' | nkf -Lu -w
```

JScript作られたテキストは改行コードがCRLF、文字コードがsjisの為、標準出力をLinuxコマンド用にnkfでUTF8のLFに変換しています。
あとはこの標準出力をパイプで受け取れば、Linuxコマンドと連携するコマンド群を一度の実行に抑える事が出来ます。

# 終わりに

この記事では連携部分の触りだけを紹介しました、複数の記事で紹介する関係上、各記事毎にスクリプト等が小出しになっており把握し辛くなっています、申し訳ないです。
全記事を書ききったら僕が利用している設定やスクリプトをまとめてアップしようと思います。
MacOS Sierra で vagrant box add できない。

## 結論

vagrant の embedded curl が Sierra でうまくいってない様子。
ここに答えがあった。
https://github.com/Varying-Vagrant-Vagrants/VVV/issues/354#issuecomment-259220933

## 現象

MacOS Sierra (10.12.1), Vagrant 1.8.7 で `vagrant box add` しようとしても存在するはずの box が `could not be found or could not be accessed in the remote catalog` って怒られる。

```
$ vagrant -v
Vagrant 1.8.7

$ vagrant init
vagrantA `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

$ vagrant box add ubuntu/trusty64
The box 'ubuntu/trusty64' could not be found or
could not be accessed in the remote catalog. If this is a private
box on HashiCorp's Atlas, please verify you're logged in via
`vagrant login`. Also, please double-check the name. The expanded
URL and error message are shown below:

URL: ["https://atlas.hashicorp.com/ubuntu/trusty64"]
Error: 
```

## 解決方法

前述の GitHub Issue のコメントにあった。 curl がなんかダメなようだ。
https://github.com/Varying-Vagrant-Vagrants/VVV/issues/354#issuecomment-259220933

> knesbit commented 24 days ago
> I'm using mac os v 10.12.1 - i removed the curl that was packaged with vagrant in /opt/vagrant/embedded/bin so that it would use the version installed by the os and it fixed the problem for me.

ってことで削除は躊躇したので rename した

```
$ sudo mv /opt/vagrant/embedded/bin/curl /opt/vagrant/embedded/bin/curl_renamed
```

で `box add` できた。

```
$ vagrant box add ubuntu/trusty64
==> box: Loading metadata for box 'ubuntu/trusty64'
    box: URL: https://atlas.hashicorp.com/ubuntu/trusty64
==> box: Adding box 'ubuntu/trusty64' (v20161129.0.0) for provider: virtualbox
    box: Downloading: https://atlas.hashicorp.com/ubuntu/boxes/trusty64/versions/20161129.0.0/providers/virtualbox.box
....【省略】
```

## 感想

`Varying-Vagrant-Vagrants/VVV` で既出なのだからそのうち直ると思われる。
最初何が悪いのか全くわからなかった。ありがたや。
Trello で定期的に発生するタスクをカード化したいときに便利な Card Repeater Power-Ups

Trello で定期的に発生するタスクを登録することはありますか？  

週次のナニカ。
月次のナニカ。

そんなとき、 Card Repeater Power-Ups が便利です。

## <i class='fa fa-wrench'></i> Power-Ups の設定
Menu の Power-Ups から Card Repeater Power-Ups を有効にします

![enable_card_repeater.png](https://qiita-image-store.s3.amazonaws.com/0/43480/8af9465a-d262-70ed-7a29-4fce413a792d.png)

## <i class='fa fa-files-o'></i> 利用方法
### <i class='fa fa-check-circle'></i> Repeat ボタンを選択する
Power-Ups が有効になると、カードのメニューに Repeat ボタンが追加されます。
これを選択します。

![card_repeater1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/31fa3fff-2deb-3706-4568-4172adc96b40.png)

### <i class='fa fa-check-circle'></i> 任意の設定をします
Repeat Card ダイアログが開くので任意の値を設定します。

* リピート間隔
  * 週次
  * 月次
  * 年次
* リピート時刻
* 曜日
* 対象List
* 追加位置
  * 先頭
  * 末尾

が設定できます。

![card_repeater2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/c4595cd4-738a-47c6-50fa-b978954e3d4e.png)

### <i class='fa fa-trophy'></i> 完了
設定は以上です。設定した日の設定した時刻になるとカードが複製されます。
カードはコメントを含めて全て複製されるので、テンプレート専用のカードを用意して
そのカードにはコメントをしないようにするとよいでしょう。

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* [Trello Card Repeater: How To Stick Regular Tasks on Repeat](http://blog.trello.com/trello-card-repeater?utm_source=powerups&utm_medium=meta)
Vagrant + Ubuntu Trusty で MySQL 5.7 を入れたい

基本的には下記URLの通り
http://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/#repo-qg-apt-repo-manual-setup

su してる前提で provision 関連のファイルに突っ込んだ。

## MySQL GPG Public Key を apt-key add する

> Download the MySQL GPG Public key (see Signature Checking Using GnuPG on how to do that) and save it to a file, without adding any spaces or special characters. Then, add the key to your system's GPG keyring with the following command:
> shell> sudo apt-key add path/to/signature-file

もしくは pgp.mit.edu で入手する手も。

> Alternatively, you can download the GPG key to your APT keyring directly using the apt-key utility:
> shell> sudo apt-key adv --keyserver pgp.mit.edu --recv-keys 5072E1F5 

めんどいので後者にした。

```
% apt-key adv --keyserver pgp.mit.edu --recv-keys 5072E1F5
```

## Ubuntu のバージョンにあった MySQL のレポジトリを登録する

> Create a file named /etc/apt/sources.list.d/mysql.list, and put into it repository entries in the following format:
> deb http://repo.mysql.com/apt/{debian|ubuntu}/ {jessie|wheezy|precise|trusty|utopic|vivid} {mysql-5.6|mysql-5.7|workbench-6.2|utilities-1.4|connector-python-2.0}

```
% echo "deb http://repo.mysql.com/apt/ubuntu/ trusty mysql-5.7" | tee /etc/apt/sources.list.d/mysql.list
```

## apt-get install

あとは普通にインストール

```
% apt-get update
% apt-get install -y mysql-server
```

## まとめ

ということで provision のファイルに下記を追加した。

```
# via. http://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/#repo-qg-apt-repo-manual-setup
apt-key adv --keyserver pgp.mit.edu --recv-keys 5072E1F5
echo "deb http://repo.mysql.com/apt/ubuntu/ trusty mysql-5.7" | tee /etc/apt/sources.list.d/mysql.list
apt-get update
apt-get install -y mysql-server
```

## 感想

最初 `mysql-apt-config_0.X.X-X_all.deb` ファイルをダウンロードして紫背景の設定画面を操作するマニュアルなインストール方法しか見つけられなくてハマった。
Slack のデコ文字を19個作った - slack_tb_decomoji



Slack のデコ文字を19個作りました。
作成したデコ文字は https://github.com/tbpgr/slack_tb_decomoji にあります。

## <i class='fa fa-list'></i> 作ったデコ文字リスト
|デコ文字|ファイル名|日本語|
|:---:|:---:|---|
|![conflict.png](https://qiita-image-store.s3.amazonaws.com/0/43480/ab7085c9-e5ca-75f6-fadd-7080b9bd8571.png)|conflict|コンフリクト|
|![context.png](https://qiita-image-store.s3.amazonaws.com/0/43480/97b308be-0d0d-3121-bb17-a121e6400c70.png)|context|コンテキスト|
|![degrade.png](https://qiita-image-store.s3.amazonaws.com/0/43480/0323ffdb-60e9-1760-36b3-8ac029d02ffa.png)|degrade|デグレ|
|![dry.png](https://qiita-image-store.s3.amazonaws.com/0/43480/d3776384-c519-f54f-a947-0ce88655b416.png)|dry|DRY|
|![hantai.png](https://qiita-image-store.s3.amazonaws.com/0/43480/fb385ae6-5b11-b039-4ef2-cda08f85f6f4.png)|hantai|反対|
|![i_want_you.png](https://qiita-image-store.s3.amazonaws.com/0/43480/2f3c8c28-e228-777a-9130-a20877015d6b.png)|i_want_you|君が欲しい|
|![igiari.png](https://qiita-image-store.s3.amazonaws.com/0/43480/d5af4037-a3b5-296e-7edb-e9dab83cacd8.png)|igiari|異議あり！|
|![kyoka_shazai.png](https://qiita-image-store.s3.amazonaws.com/0/43480/c40f9446-825a-6557-0267-fcc5a043954d.png)|kyoka_shazai|許可より謝罪|
|![lgtm.png](https://qiita-image-store.s3.amazonaws.com/0/43480/a37a4fa0-08fc-6737-b382-a99dd104ebf0.png)|lgtm|LGTM|
|![matta.png](https://qiita-image-store.s3.amazonaws.com/0/43480/8dc4a2ae-0f7a-b711-0700-1da1072cc32b.png)|matta|待った！|
|![mijikai.png](https://qiita-image-store.s3.amazonaws.com/0/43480/78d034a9-66c8-65c3-2675-bd8f2d510fec.png)|mijikai|短い|
|![nagai.png](https://qiita-image-store.s3.amazonaws.com/0/43480/d27c07b0-d024-9bc2-7ec4-ab607701d43e.png)|nagai|長い|
|![saiko.png](https://qiita-image-store.s3.amazonaws.com/0/43480/2c96ff78-1dcc-102c-68ca-8f4859af34ee.png)|saiko|最高かよ|
|![sansei.png](https://qiita-image-store.s3.amazonaws.com/0/43480/53832d74-cf80-4d64-ae3e-e0179b6117ed.png)|sansei|賛成|
|![todo.png](https://qiita-image-store.s3.amazonaws.com/0/43480/b6417d3b-e3f9-fd9d-c538-49bff02bcc9f.png)|todo|TODO|
|![unknown.png](https://qiita-image-store.s3.amazonaws.com/0/43480/fa758127-4b16-044a-eacf-780359c3a9f6.png)|unknown|知らなかった|
|![wet.png](https://qiita-image-store.s3.amazonaws.com/0/43480/55c66882-a946-96fb-6bdb-be14ee0a761f.png)|wet|WET|
|![wip.png](https://qiita-image-store.s3.amazonaws.com/0/43480/44e2bb0b-61cf-4b9a-a213-d6773e313cf2.png)|wip|WIP|
|![yagni.png](https://qiita-image-store.s3.amazonaws.com/0/43480/b93e090e-289f-a0a6-e251-0a5bedbae97e.png)|yagni|YAGNI|

## <i class='fa fa-book'></i> 参考サイト
* [Slackのリアクションで使うテキスト絵文字を作成する - Qiita](http://qiita.com/Will_meaning/items/ebfc5c02842c002acfab)

## <i class='fa fa-book'></i> 使用ツール
<script async class="speakerdeck-embed" data-id="b3690648491f4599b5d72c7ee0085522" data-ratio="1.33333333333333" src="//speakerdeck.com/assets/embed.js"></script>

* [絵文字 ジェネレーター](https://emoji.pine.moe/#!/)
MySQLに日本語が入らない（日本語が???でインサートされる）ときの直し方

久しぶりにMySQLをphpMyAdminで触ったんでやたら時間がかかりましたが解決しましたのでここに記します。
（この方法が正しいのかはわからないです・・・正しいのですかこれ？）

##■何が起こったか
CakePHPの勉強中に起こったのですが、以下の画像（Comments部分）のとおり、
日本語を入力すると全部「?????」みたいになってしまう。

![WS000054.JPG](https://qiita-image-store.s3.amazonaws.com/0/85815/010fe706-d409-571c-abb0-cd11e53ad06a.jpeg)

##■何が原因だったか
どうやらMySQL側の問題だったようなので、phpMyAdminで色んな所のエンコードをutf-8に設定しました

###・全体の設定
![WS000056.JPG](https://qiita-image-store.s3.amazonaws.com/0/85815/9b8e4112-6f44-09e5-d3d4-d44851793f39.jpeg)

###・DBの設定
![WS000057.JPG](https://qiita-image-store.s3.amazonaws.com/0/85815/bf5202bd-571f-a200-ac52-6620b28e8d77.jpeg)

###・テーブルの設定
![WS000055.JPG](https://qiita-image-store.s3.amazonaws.com/0/85815/45dfea2b-fbbd-18a9-ca33-0d3a336dde88.jpeg)


で、最後に行ったのがこれ
![WS000059.JPG](https://qiita-image-store.s3.amazonaws.com/0/85815/21df2839-5f6d-be8c-f706-29d892bcf7ad.jpeg)

赤枠の照合順序を「utf8_general_ci」に設定し、
「Change all column collations（すべての列の照合順序を変更する）」をチェックして実行

これで日本語がインサートされるようになりました。

![WS000060.JPG](https://qiita-image-store.s3.amazonaws.com/0/85815/83ec77ea-958d-48c1-a0f5-bd484d80bbdf.jpeg)

おわり
中高生のうちに知れると楽だったかもしれないエンジニア的な考え方


![_prw_PI2fl_30ZwGyi7.png](https://qiita-image-store.s3.amazonaws.com/0/42614/8dbe3658-b6b4-0c7e-7112-484837820125.png "_prw_PI2fl_30ZwGyi7.png")

Androidメンターのほっしゃんです。Life is Tech !のAdvent Calendar、3日目です！毎日プログラミングも疲れるかなと思ったので、今日はしない方向で書こうと思います！
簡単に、自己紹介をすると、普段は個人事業主としてアプリ開発を中心に仕事を受けていて今年で3年になります。あと、昔はハッカソンなどに多く出ていて、年に20個から30個ほど参加していたりもしました。
今までの経験の中で、先輩やお師匠様たちから授かった、もっと早く知っておきたかったエンジニアリングに関する考え方を書いていこうと思います。

## なんで書くのか & 「エンジニアは考えることが仕事」

僕は、エンジニアはコードを書くことが仕事ではなく、コードを使って自分、または他人の考えを表現することが仕事だと思っています。なので、仕事の大半は考え、試行錯誤する時間に当てていますし、最近ではプロジェクトで実際にコードを書かないことあります。ですが、エンジニアだと胸を張っていえます。
話を戻して、エンジニアは考えることが仕事なので、今の考え方の根底にある考えをここに早いうちに伝えられるなら伝えたいと思いました。
考え方は、僕個人の今の考えなので、参考程度にとらえてもらえるといいと思います。

## 「自分が理解できない仕様は、ユーザーにとっても理解できない」

サービスを開発する中で、「ユーザーに心地よく使ってもらいたい！」と思うあまり次々と仕様（動作や、機能などの取り決め）を追加していって、気づいたら複雑になってしまっていることは多いと思います。
こういう時、その仕様を渡されて、理解しようとすごい努力をしている作成者でさえ理解できない仕様を、仕様など気にせず使いたいユーザーが理解できるわけはありません。なので、もし自分が理解できない仕様があった場合は、素直に理解できないと言っていいですし、ユーザーのためにならないとも言っていいと思います。

## 「課題を見つけてから、対処を考えればいい」

プログラミングを少しやったことがある人は、別の全く新しい言語を扱う際や、サービスを作る際に最初から多くのことについて調べてからアクションを行うというケースが少なくないと思います。ある程度調べることは必要ですが、なぜ調べるのかが重要だと思います。
なので、サービスなどを作る中で課題と思うポイントを整理して、それに対する解決策を継ぎ足していく形がいいと思います。

## 「１つのことにしがみつかずに、スペシャリストになる」

エンジニアだと、プログラミングをしていくうちに１つの言語を好きになる人がいます。そして、１つの言語や、言語思想を好きになるあまり、他の言語には全く手を出さない人もいます。１つのことを極めることは良いですが、新しい技術や知識を得る際に、自分で線引をしてしまい損をしている人を多く見てきました。１つのことにしがみついて線引をしてしまうと、その１つのことでさえ、偏った見方しかできずに極めるのが難しくなります。
何かを学ぶ時、自分の今のスキルを伸ばすために、次にどんなスキルが必要か、一旦言語だけでなく分野も超えて広く探してみると良いと思います。

## 「師匠やメンターを見つければエネルギーを節約できる」

自分の師匠やメンターを見つけることは、生きる上ですごい重要な事だと思っています。生きる上で、自分で考える事、決断することはすごく重要なことです。ですが、同時にすごくエネルギーを使うことでもあります。そんな時、自分よりも一歩先にいる人生の先輩を、師匠やメンターとして観察することで、何かを考えるときや決断する時のエネルギーを減らすことができます。
こうして、エネルギーを節約した分、また別のことに向ければ将来的にはそのメンターよりも上に行けると僕は考えています。

## 「自分の師匠を見つけたら、勝手に弟子入りすればいい」

僕はこれまで、１年間や半年などの期間で新しい師匠となる人を見つけては、その師匠を見てその期間に学ぶことを考えてきました。ですが、今まで１度として弟子入りをさせてくださいと言ったことはありません。
今の世の中、SNSやブログなど、色んな発言の場があり、直接話さなくても多くの考えを知ることができます。何処かに通ったりする必要はありません。
ただ、自分の師匠にしたい人を見つけたら、図々しくSNSやブログをフォローして、勉強会などでたまに会える機会を作れれば、その時点で弟子入り完了です。

## 「正しいはどこにもない、あるのは正しそうだけ」

エンジニアの文化で、コードのレビュー（確認）でOKを出す際に **LGTM(Looks Good To Me)** とだけコメントをする文化があります。そのコードなどを確認した際に、自分から見ていいと思うという意です。
つまり、言いたいことは誰もあなたが絶対に正しいということは言えないし、逆に言うと絶対に間違っているとも言えないということです。（当然、コードが仕様や自分の意図した通りに動かないと間違いですが・・）
なので、このような文化の中で大切なのは、自分の書いたコードや仕事にしっかりとした考えを持つことが重要になります。逆に言えば、設計など多少悪くても、しっかりと考えを持っていれば、相手も快く間違いを教えてくれますし、そこから直すことも簡単にできます。

## おわりに
また、思い出し次第随時更新していきたいと思います。
AdventCalendarはまだまだ続くので、技術系の記事は他で書いていきたいと思います。


**明日は、今回のAdventCalendarの発起人で、機械学習が得意な東大生メンターのへむへむです！！**
MSDeployでフォルダのバックアップ/リストア

# やること
IIS上のWebアプリケーションに新バージョンをデプロイする前にファイルのバックアップを取得する。
リリース作業で何かが起きて切り戻す事になった時に、元の状態に戻す。
rsyncっぽいことをする(?)

# アクセス権限は無視してバックアップ
```backup.ps1
msdeploy.exe -verb:sync -source:contentPath=`"Default Web Site/fuga`" -dest:contentPath:C:\fugaBackup
```
リストアする場合はsourceとdestを入れ替える。

```restore.ps1
msdeploy.exe -verb:sync -source:contentPath=C:\fugaBackup -dest:contentPath:`"Default Web Site/fuga`"
```

# アクセス権限ごとバックアップ
includeAcls=Trueを設定するとアクセス権限を含めてバックアップできる。

```backup.ps1
msdeploy.exe -verb:sync -source:contentPath=`"Default Web Site/fuga`",includeAcls=True -dest:contentPath:C:\fugaBackup
```
リストアする場合はsourceとdestを入れ替える。

```restore.ps1
msdeploy.exe -verb:sync -source:contentPath=C:\fugaBackup,includeAcls=True -dest:contentPath:`"Default Web Site/fuga`"
HSPでmap, reduce, filterを定義する

[文字列操作比較16言語](http://qiita.com/yosgspec/items/605e68bb1ca21e6ff819)を書いていた時、HSPはmapとかreduceとかfilterみたいな今時のリスト処理が全然入って無くてさびしかったのでざっと定義してみた。

```clj:HSP
#runtime "hsp3cl"

#define global map(%1,%2,%3,%4) \
	dimtype %2,vartype(%1),length(%1) :\
	foreach %1 :\
		%3=%1(cnt) :\
		%2(cnt)=%4 :\
	loop

#define global reduce(%1,%2,%3,%4) \
	%2=%1(0) :\
	repeat length(%1)-1,1 :\
		%3=%1(cnt) :\
		%2=%4 :\
	loop

#define global filter(%1,%2,%3,%4) %tfilter\
	%i=0 :\
	foreach %1 :\
		%3=%1(cnt) :\
		if %4 {\
			%2(%p0)=%3 :\
			%o++ \
		}:\
	loop


arr1=1,2,3,4,5

mes "!map"
dim arr2,length(arr1)
map arr1,arr2,val,val*10
foreach arr2
	mes arr2(cnt)
loop

mes "\n!reduce"
reduce arr1,sum,val,sum+val
mes sum

mes "\n!filter"
filter arr1,arr3,val,val\2!=0
foreach arr3
	mes arr3(cnt)
loop
```

```text:Echo
!map
10
20
30
40
50

!reduce
15

!filter
1
3
5
```

仕組みとしてはいたって簡単で、defineの何でも定義に投げ込める仕様を利用してラムダ部分に当たる式を第4引数で指定する。

ちなみにfilterはdefineでやたら長くなるのを嫌って結構実装が適当。
filterで返る配列はsplitで生成されるのでstr型の配列となる。

* 2018/9/12: 色々整形。filterも真面目に作り直した。


## 構文

```clj: 
map array anyArray,ref array result,var param,lambda
    anyArray        ;変換元の配列
    result          ;返り値
    param           ;lambdaに渡す引数名
    lambda          ;返り値を返す式

reduce array anyArray,ref var param1AndResult,var param2,lambda
    param1AndResult ;lambdaに渡す引数及び返り値
    param2          ;lambdaに渡す引数2

filter array anyArray,ref array result,var param,booleanLambda
    booleanLambda   ;真理値を返す条件式
```

## 実行環境
HSP : Hot Soup Processor ver3.5
Raspberry Pi VS ESP-WROOM-02

# 自己紹介
河野くんにそそのかされて「HAL Advent Calendar」に投稿すること
HAL大阪ロボット学部２年まっきーです。
ロボット学科なんで授業ではhttpだのWebSocketだの無縁なわけですがそんな僕が今回はiotについて書かせていただきます。最後までお付き合いください

# きっかけ
去年HEWではRaspberryPiを使ったwebラジコンを作って最近ESP-WROOM-02を使っています。
そこでなるほど！と実感したことを少し書いていきます。

#　Raspberry Pi VS ESP-WROOM-02
## 大きな違い
同じ「小型のマイコン」で同じように「GPIO」がついててネットワークに繋がるボードなんですが大きな違いは、
やはりOSが乗っているということです。
OSが乗っているということはどういうことかといいますとOSの上でLチカなどのプログラム動くということです。こちらは何が便利かといいますと、wifiの制御や並列処理など考えなくてもいいので初心者でも比較的かんたんにプログラムを組むことができます。

## 消費電力
Raspberry Pi と ESP-WROOM-02では消費電力が大きく異なります。実際に計測してみました。
比較の条件としては両方wifiに接続して簡単なwebページを返すwebサーバを立ちあげるという単純なプログラムにしました.
まずはRaspberry Piの結果は

__480mA__

最大の消費電力が2500mAということでビクビクしてたのですがwebサーバ立てるだけなら480mA必要でした

次にESP-WROOM-02

__70mA__



なんと70mAという結果にESP-WROOM-02はOSが乗っていない分限られた処理しかしないので、
省電力と言えるでしょう。

##まとめ
###Raspberry Pi
- メリット
    - wifiや複数のタスクの並列処理はOSが担ってくれるので容易
    - 複数言語ライブラリが使えるのでできる幅が広い
    - 記事もたくさんあるので詰まることが少ない。
- デメリット
    - 電力消費が激しいので長時間のバッテリ駆動などは難しい

### ESP-WROOM-02
- メリット
    - 小型で省電力ウェアラブルデバイスなどにできる
    - 安価で入手できるので大量生産も夢じゃない
    - プログラミングスキルによってはかなり動作が軽い
- デメリット
    - wifiの処理などもすべて自分で記述しなければ行けないので大変
    - メモリが限られているので動画の保存などは向いていない
   


# 最後に
まだ書きたいことがあったのですが時間がなかったので
また後程追記します

最後までお付き合いいただきありがとうございました。
MeteorでCSSをカスタマイズできる且つページが分かれるログイン機能を実装してみた

MeteorでWebアプリを作ろうとおもったらなんだかんだ結局必要になってくるアカウント機能を実装してみたので、その時の順路をまとめてみたいとおもいます。account-uiを使ってBootstrapでサクッとという記事はけっこう見つけたんですけど、セルフスタイリングとルーティングに関する情報があんまりなくて、誰かのために書いておこうかなと。

## 要件定義
- ログイン機能を実装すること
- 各登録系ページが個別に存在できること（トグルじゃない
- CSSを自分で書きたい

## 必要なもの
### useraccounts
サクッとページ遷移のないログインモジュールを設置したい方は><code>accounts-ui</code>してください。FacebookログインとかGithubログインとかサクッとできるはずです。
自分でカスタマイズしたい方は<code>meteor-useraccounts</code>を使いましょう。

```:プロジェクトルート
meteor add useraccounts:unstyled
```
<code>:unstyled</code>を忘れないでください。これでスタイルなしになります。

### accounts-password
useraccounts以外に何か一つ<code>meteor add accounts-password</code>とか<code>meteor add accounts-facebook</code>とか入れてという指示が公式に書いてあったのでその通りに。今回はノーマルのメールとパスワード認証なので<code>accounts-password</code>を使用します。

```:プロジェクトルート
meteor add accounts-password
```
そういえば、先にブログ記事とかみてやってたら、結構<code>account-password</code>となっていて軽くつまづきました。<code>accounts-password</code>ですね。<code>s</code>が大事！途中から変わったんですかね。

### useraccounts:iron-routing
これはページを分けるルーティングを簡単に行うパッケージです。

```:プロジェクトルート
meteor add useraccounts:iron-routing
```

これでプロジェクト内でいろいろとコードが使えるようになりました。ルーティングからいきましょう。
<code>/client/</code>かどこかに<code>routes.js</code>みたいなのをつくって記述します。

- 初期設定
- ルーティング設定

が必要とのことです。

```Javascript:/client/routes.js

// 初期設定
Router.configure({ //ルーティング設定
    layoutTemplate: 'masterLayout', // 基本となるテンプレートを指定
    yieldTemplates: {
        myNav: {to: 'nav'}, // ここらへんは適宜インクルード部分
        myFooter: {to: 'footer'}, // 同じく
    }
});

AccountsTemplates.configure({ //ログイン部分の設定
    defaultLayout: 'myLayout', //基本となるレイアウトを設定
});


// ルーティング設定
// 基本構文：AccountsTemplates.configureRoute(route_code, options);

AccountsTemplates.configureRoute('signIn', { // route_codeは対応するページ
    name: 'signin',
    path: '/login', //パスの設定ここ
    template: 'myLogin', //またまたテンプレート指定
    layoutTemplate: 'myLayout',
    redirect: '/user-profile', //処理後のリダイレクト先
});

```
そうすると、/loginにアクセスすると入力欄とかもろもろが出力されます。あとはそれぞれに関してルーティングを設定していけば、晴れてお望み通りのカスタマイズ可能なログイン出力部分ができあがります。

そうそう、<code>route_code</code>部分で使用できるコード一覧はこちらです。

![スクリーンショット 2016-12-03 0.28.07.png](https://qiita-image-store.s3.amazonaws.com/0/144150/f703cb21-8016-e20a-d4d0-1a4ffc8780b8.png)

これのroute_codeってとこですね。Route PathでデフォルトのURLが確認できます。
あとは・・・がんばってください。

## 参考
[Meteor Developers - Accounts](https://guide.meteor.com/accounts.html)
[User Accounts](https://github.com/meteor-useraccounts/core/blob/master/Guide.md)
[Accounts Password](https://atmospherejs.com/meteor/accounts-password)
[useraccounts:iron-routing](https://atmospherejs.com/useraccounts/iron-routing)
PowerShellでフォルダのアクセス権限を設定する

# やりたいこと
mkdirコマンドでフォルダを作ったりした時にアクセス権限を設定したい。
GUIでポチポチするのが面倒だからスクリプトにしてしまいたい。

# やりかた
1. アクセス権限を設定するための配列をつくる
2. 1.で作った配列を基にFileSystemAccessRuleのオブジェクトをつくる
3. 対象フォルダのACLを取得し、2.で作ったFileSystemAccessRuleをセットする
4. 対象フォルダに3.のACLをセットする

```hoge.ps1
mkdir fugafuga
# アクセス権限設定のための配列
# 1つ目の要素がアクセス権限を設定するユーザー/グループ名
$permission = ("IUSR", [System.Security.AccessControl.FileSystemRights]::ReadAndExecute, [System.Security.AccessControl.InheritanceFlags]::ContanerInherit, [System.Security.AccessControl.InheritanceFlags]::ObjectInherit), [System.Security.AccessControl.PropagationFlags]::None, [System.Security.AccessControl.AccessControlType]::Allow)
# FileSystemAccessRuleオブジェクトの作成
$accessRule = New-Object -TypeNames System.Security.AccessControl.FileSystemAccessRule $permission
# フォルダにアクセス権限をセットする
$targetPath = "fugafuga"
$targetACL = Get-Acl $targetPath
$targetACL.SetAccessRule($accessRule)
$targetACL | Set-Acl $targetPath
```

## よく使いそうな[System.Security.AccessControl.FileSystemRights]
- Read:読み取り
- ReadAndExecute:読み取りと実行
- Modify:変更
- FullControl:フルコントロール
Sikuliの永久ループを止める方法

とあるソフトのテストしていたのですが、時間がかかる、batで動かせない、、、という状態になったので、sikuliというソフトを使ってみました。
sikuliという画像認識でテストしてくれるツールがあるということは知っていたのですが、実際に使うのは初めて。
想像以上に使いやすくてびっくりしました。

インストールや、基本的な使い方は下記の記事を参考にしました。
http://qiita.com/YHayama@github/items/483198cba0e7c4baa78c

現状のバージョンは、1.1.0です。
サイトによっては、画像認識がいまいちという評価を見かけますが、改善されているのかかなり実用的に使えます。
IDE上の画像をクリックすると、画像の一致度、クリックする位置なども正確に設定することが可能です。

で、土日に適当にループでテストさせておきたいのですが、マウス操作系のソフトは出来が悪いのだと止められなくなったりする可能性があって心配していたのですが、止める方法もちゃんと用意されていました。
流石、テスト用のツール。
ちなみに、ctrl + c　では止まりません。

# sikuli実行の止め方

> Windows: alt-shift-c
> Mac: cmd-shift-c
> ... or kill the respective Java process

https://answers.launchpad.net/sikuli/+question/197403

よく見たら、IDE起動時にも表示されてましたね。
ということで、永久ループのテストとか、wait を　FOREVER　待機するとか何も問題なく使用して大丈夫です。

# おまけ

sikuliをデフォルトの設定でインストールすると、テストプログラムはJythonで記述出来ます。
永久ループはこのようなプログラムで記述出来ます。

```
while True:
    click(........
    ・
    ・
```

長期間動作させたい場合は、何回動いたのかもカウントしたいですね。

```
count = 0
while True:
    count += 1
    click(........
    ・
    ・
    print count
```

python の文法は　++ とか、　--　のインクリメント、デクリメントは使用出来ないみたいです。
http://qiita.com/motokitsu/items/0e1cf895252b63e0b4e5




これから、どんどんGUIのテストも自動化していきたいですね。
JavaScriptの大小比較は数値に変換される

JavaScriptにおける大小比較では、数値以外の型を数値に変換してから比較します。
従って、以下のような直感に反する例がtrueになったりします。

```js
3 < 5     //true (うん)
2 >= 4    //false (うんうん)
true <= 8 //true ?!(trueは数値変換すると1)
null < 7  //true !?(nullは数値変換すると0)
[9] > 6   //true !?!?!?!?(配列は数値変換すると「要素が１個の数値」の時のみその数値になる)
```

同値比較では、等価演算子（==）と厳密等価演算子(===)があり
後者の厳密な比較を用いると、型が一致しない時はfalseを返してくれますが、
**大小比較にはそんな便利な演算子はありません。**

直感的に「片方が数値じゃないなら大小比較もクソも無い、よってfalseを返すだろう」
などと甘えているとJavaScriptに刺されます。
特にやってしまいそうなのが、nullを許容する数値型の変数を大小比較する際に
「nullは0になる」を忘れてバグを引き起こすパターンでしょうね。
大小比較の対象となる変数の型については十分注意しましょう。

なお、唯一の例外として両方が文字列の場合の大小比較は辞書順（文字コード順）です。
記事タイトルにあるような「数値への変換」もありません。

（追記）
gaogao_9さん、コメントにて厳密な補足ありがとうございます！
というわけで、本記事はコメント欄までで完結します、続けてお読みください↓↓↓