OmniAICreator/Qiita-1.07M huggingface dataset:
VSCodeでElectronのMainおよびRendererプロセス(だたし一つのみ)両方をデバッグ実行する方法

以前VSCodeでElectronのデバッグするという記事を投稿したのですが、その時はMainプロセスのみでした。
VSCodeのアップデートにより、"Multitarget debugging"という複数のデバッグターゲットに対して一度にデバッグ実行が行える機能が実装されました。
今回は、この機能を使ってMainプロセスおよびRendererプロセス(BrowserWindow)の両方をデバッグ実行する方法です。
ただ、Rendererプロセスはアタッチで行いますので(最後に作成した)１つのBrowserWindowしかデバッグできません。
launch.jsonを以下のように記述します。
(動作検証はWindowsのみ。MacやLinuxでは動作検証は行っていません)

```json:launch.json
{
    "version": "0.2.0",
    "configurations": [{
            "type": "node",
            "request": "launch",
            "name": "Main",
            "program": "${workspaceRoot}/app.js",
            "runtimeExecutable": "electron.exeもしくはelectron.cmdのフルパス",
            "runtimeArgs": [
                "--remote-debugging-port=9222"
            ],
            "cwd": "${workspaceRoot}"
        },
        {
            "name": "Renderer",
            "type": "chrome",
            "request": "attach",
            "port": 9222
        },
        {
            "name": "Renderer",
            "type": "chrome",
            "request": "attach",
            "port": 9222
        }
    ],
    "compounds": [{
        "name": "Main & Renderer",
        "configurations": ["Main", "Renderer"]
    }]
}
```

これで、デバッグを行うときに"Main & Renderer"を選択してデバッグ実行すればできます。
![debug.png](https://qiita-image-store.s3.amazonaws.com/0/17554/b01b0628-238d-8a02-571a-69c1ef974c9b.png)

もし、VSCodeでElectronの複数のRendererプロセスを行える方法をご存知の方がいらっしゃいましたらコメント等で教えていただけないでしょうか。よろしくお願いします。
USD 入門編４：macOS 10.12.2 で USD のアニメーションを試してみる

前回の記事: [USD 入門編３：macOS Sierra で USD を試してみる] (http://qiita.com/takahito-tejima/items/559391bb7126bbda830f)


12/13、macOS Sierra 10.12.2 アップデートが配布開始されました。
いろいろ修正や更新が入っているようですが、SceneKit の USD サポートも向上していて、アニメーションが部分的にですが動くようになりました。次のファイルをファインダーでプレビューしてみてください

```rotate_cube.usda
#usda 1.0
(
    startFrame = 0
    endFrame = 8
)

def Xform "xform"
{
  def Cube "Cube"
  {  
  }
  float xformOp:rotateY.timeSamples = {
    0: 0,
    1: 10,
    2: 20,
    3: 30,
    4: 40,
    5: 50,
    6: 60,
    7: 70,
    8: 80
  }
  uniform token[] xformOpOrder = ["xformOp:rotateY"]
}
```

キューブが回ります！
まだ頂点データのアニメーションなどは未対応のようですが（もちろん usdview では再生されます）、iOS でも usd のアニメーションが簡単に再生できるようになったということで、いろいろ夢が広がってくるんじゃないかと思います。VR アプリとか・・・そうですね・・・

というわけで、今回は超短いですが、おわり。
docker-machineでgenericドライバを使ってみた

## 参考

* [汎用(generic)ドライバ — Docker-docs-ja 1.13.RC ドキュメント](http://docs.docker.jp/machine/drivers/generic.html)
* https://github.com/docker/machine/releases

## 手順

```bash:鍵のパスワードを何度も聞かれるので先に読み込んでおく
ssh-agent bash
ssh-add ~/.ssh/id_rsa
```

```bash:a.sh
IP=192.168.2.2
KEY=~/.ssh/id_rsa
NAME=machine1

docker-machine create \
  --driver generic \
  --generic-ip-address=$IP \
  --generic-ssh-key $KEY \
  $NAME
```

## 接続

```bash:確認
docker-machine env $NAME
docker-machine ssh $NAME
```

```bash:evalするとdockerコマンドで操作できる
eval $(docker-machine env $NAME)
docker ps -a 
docker pull alpine
docker run --rm -it alpine /bin/sh
```

## volumeの扱い

```bash:
eval $(docker-machine env $NAME)
docker run --rm -it -v /root:/mnt alpine /bin/sh
```

とすると、dockerが動いているホスト上の /root が /mntにマウントされる。
docker-machine を実行したホストの/root がマウントされるのではないことに注意。

## memo: jessieにdockerインストール

```bash:
# https://docs.docker.com/engine/installation/linux/debian/
set -eu

apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
echo "deb http://apt.dockerproject.org/repo debian-jessie main" > /etc/apt/sources.list.d/docker.list

apt update
apt install -y docker-engine
```

----

## docker-machineの設定ファイル

* ~/.docker/machine/machines/ホストごとにフォルダ/config.json
    * config.json 内にファイルの絶対パスが書かれている。
* ~/.docker/machine/machines/ホストごとにフォルダ/id_rsa
* ~/.docker/machine/certs/ホストの鍵(?)

ここの id_rsa は以下で指定した鍵のコピーが置かれる。

```diff:
 docker-machine create \
  --driver generic \
  --generic-ip-address=$IP \
+ --generic-ssh-key ~/.ssh/id_rsa \
  $NAME
```

## (検証中)docker-machine操作するホストを複数にできない

* mac で docker-machineした後、同じホストに対し Linuxでdocker-machineすると macでは接続できなくなる。
* 他の端末で共有するためには `--storage-path` で /opt/ とか指定しておくのが吉
* docker-machine を追加し直すと、コンテナが停止する。(--restart=alwaysの場合は未確認)
C > complex.h > 複素数を代入してprintfする > dcval = 3.14 + 1.592 * I; / creal(dcval) / cimag(dcval)

```txt:My_Environment
Ubuntu 14.04 LTS Japanese Remix
GNU bash, version 4.3.11(1)-release

gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 
(also for g++)
```

`#include <complex.h>`で複素数を扱っているコードの作業をしている。

complex型の扱いはほとんど覚えていないのでとりあえず代入とprintfまで確認した。

参考 http://stackoverflow.com/questions/6418807/how-to-work-with-complex-numbers-in-c

```stduy_complex.c
#include <stdio.h>
#include <stdlib.h>
#include <complex.h>

int main(int argc, char *argv[])
{
	double complex dcval;

	dcval = 3.14 + 1.592 * I;

	printf("%f %f\n", creal(dcval), cimag(dcval));

}
```

```txt:実行
$ gcc study_complex.c && ./a.out 
3.140000 1.592000
```
途切れたdocker execにもう一度つなぐ

`docker exec`で実行中のプロセスがあるときにネットワーク接続が切断された場合、プロセスは残っていますが出力を得ることができなくなります。

その場合、プロセスの`PID`を調べて

```
reptyr -T $PID
```

すると、見失ってしまった出力に再び出会うことができます。

ubuntu trusty以降などの環境では、以下の設定が必要になるかもしれません。

```
echo 0 > /proc/sys/kernel/yama/ptrace_scope
```

参考）
https://github.com/nelhage/reptyr
[Monaca] InAppBrowserプラグインについて

Monacaで開発するアプリは、Single Page Application（SPA）のため、HTMLの`<a>`等で外部サイトに画面遷移をした場合、遷移先のページに前のページに戻るリンクが設定されていないと、アプリに戻ることができません。

このような場合、InAppBrowserプラグインを使用することで、この問題を解決することができます。

InAppBrowserプラグインは、Monacaの基本Cordovaプラグインに含まれており、Basicプランから利用することができます。

#InAppBrowserプラグインの使い方

まず初めに、対象のプロジェクトの「Cordovaプとラグインの設定」から、InAppBrowserプラグインを有効にします。
プロジェクトでInAppBrowserプラグインが利用できるのは、devicereadyイベント発行後になります。

```html
<script>
  document.addEventListener("deviceready", onDeviceReady, false);
  function onDeviceReady() {
    alert("InAppBrowserプラグインが利用できます");
  }
</script>
```

InAppBrowserプラグインでは、起動させるプラウザーを選択することができます。

| target  | 用途 |
|:--------|:------------|
| _blank  | InAppBrowserを開きます。 |
| _system | システム標準のWebブラウザーを開きます。 |
| _self   | ホワイトリストに対象のURLが登録されている場合には、Cordova WebViewを開きます。<br />それ以外の場合には、InAppBrowser を開きます。 |


#`<a>`からInAppBrowserプラグインを利用する

次のようにaタグを設定した場合、Monacaのページからアプリへ戻ることができません。

```html
<a href="https://ja.monaca.io/">Monaca</a>
```

次のように設定することで、InAppBrowserが起動します。

```html
<a href="#" onclick="openMonaca();">Monaca</a>

<script>
  function openMonaca() {
    window.open("https://ja.monaca.io/", '_blank', 'location=yes');
    return false;
  }
</script>
```

InAppBrowserでは、前の画面に戻るためのGUIを提供しているので、`<a>`で画面遷移をしてもアプリに戻ることができます。


#InAppBrowser.executeScript

InAppBrowserプラグインでは、InAppBrowserの画面上で、指定のJavaScriptコードを実行することも可能です。

```html
<script>
  // backgroundColorをblueに変更する。
  function openMonaca() {
    var ref = window.open("https://ja.monaca.io/", '_blank', 'location=yes');
    ref.addEventListener('loadstop', function() {
      ref.executeScript({
        code: "document.body.style.backgroundColor='blue';"
      }, function() {
        alert("Success!!");
      });
    });
    return false;
  }
</script>
```


InAppBrowserプラグインでは、この他にもOSごとの様々な設定等がありますので、詳しくは、[InAppBrowserプラグイン](https://docs.monaca.io/ja/reference/cordova_6.2/inappbrowser/)を参照してください。
技術英語 > it's not worth [sacrificing clarity] for a performance gamble.

@ Code Complete (No. 19586 / 36077)

本の内容をかいつまむと、
「パフォーマンスを上げようとしてコードを変更した結果、読みにくくなった。しかしながら、実のところ、コンパイラの最適化がすでに働いていて同じ変更(配列の最適な読み出し)をすでに実行済みであったため、パフォーマンスは上がらなかった」という状況。

> it's not worth **<font color=red>sacrificing clarity</font>** for a performance gamble.

https://www.merriam-webster.com/dictionary/sacrifice
> `1 :  an act of offering to a deity something precious; especially :  the killing of a victim on an altar

意訳「簡潔さを犠牲にしてパフォーマンスギャンブル（性能が上がるか分からない）をする価値はない」
electronのウィンドウサイズで指定した大きさとhtmlの大きさが合わない問題の解決



##現象
例えば下記のように設定をし

```
win = new BrowserWindow({
  width: 800,
  height: 600,
});
```


```
body{
  width: 800px;
  height: 600px;
}
```
Electronで800 x 600の大きさを作った時にhtmlの方の大きさを800px x 600pxにすると画像のようにスクロールバーが出る

![Electron_と_1__node.png](https://qiita-image-store.s3.amazonaws.com/0/40340/b267a053-2e13-eba4-8013-a9249af5f947.png "Electron_と_1__node.png")

縦の方はこのタイトルバー分スクロールバー出てるっぽくて、横の方は多分縦のスクロールバーのせいとかでスクロールバー出てる。


## 解決法
[electronのBrowserWindowのAPIページ](http://electron.atom.io/docs/api/browser-window/)によると
ウィンドウサイズっていうのは枠の部分（タイトルバーとか枠線）も含めたsizeの指定だという事だった。
useContentSizeってオプションをtrueにすればウェブページ部分の大きさとしてwidthとheightオプションが解釈されるので、無事スクロールバーを表示しない状態にできた。


```
const createWindow = () => {
  win = new BrowserWindow({
    width: 800,
    height: 600,
    useContentSize: true,
  });
```
同一スコープに同じ名前でタイプエイリアスと変数があるとSwiftが混乱する

便所の落書きレベルなので、クソ暇な人は、暇つぶしにどうぞ。以下のように同じスコープ内に同じ名前のタイプエイリアスと変数が共存するときにはタイプエイリアスが勝つみたいです。

```swift
private let ID = "id"

struct Book {
    
    typealias ID = String
    
    let dict: [String:String] = ["id":"114514", "name":"1919"]
    
    var id: String {
        return dict[ID] 
        //=> Cannot convert value of type '(Book.ID).Type'(aka 'String.Type') to expected argument type 'DictionaryIndex<_, _>'
    }
    
}
```

では、もうちょっと親切に dict へのキー指定に `index(forKey: String)` を使ってみれば、さすがに大丈夫なのかなと思ったのですが、そうでもなかった。

```swift
private let ID = "id"

struct Book {
    
    typealias ID = String
    
    let dict: [String:String] = ["id":"114514", "name":"1919"]
    
    var id: String {
        return dict.index(forKey: ID)
        //=> Cannot convert value of type '(Book.ID).Type'(aka 'String.Type') to expected argument type 'DictionaryIndex<_, _>'

    }
    
}
```

おとなしくどっちかの名前を変えてあげることで対応しました。Swiftでのプログラミングは楽しいですね！！！！！
iOSデバイスを使っているデザイナーやエンジニアと話したい、Android バックボタンの挙動

iOSユーザーのプロマネとエンジニアとアプリを開発していて、
Android のアプリでバックボタンを押下した時、おかしな挙動をしました。

普段iOSデバイスを使用している、プロマネに伝えたところ、

```
iOSユーザー ： 「バックボタンてなんですか？ 」
```

普段、iOSデバイスを使用している、iOSエンジニアさんやデザイナーさん、テストエンジニアさんも
バックボタンについての挙動はちゃんと確認してませんでした。。。

ここから、いろいろやり取りするのに苦労したので、簡単ですがまとめました。

# 1. バックボタンというものを意識したことがない?

Androidデバイスには、`ホームボタン`、`マルチタスクボタン`のほかに、`バックボタン` があります。
iOSデバイスが同じ（似たような）挙動を示す対応は下記になります。

| Android | => |iOS|
| :-------: | :---: | :-------: |
| ホームボタン　| => | ホームボタン |
|　マルチタスクボタン　| => | ホームボタン2回押し　|
| バックボタン | => | ? |

ホームボタンや、マルチタスクボタンの挙動は、説明しやすいんですが、バックボタンの説明が難しかった。

# 2. iOSの戻るボタンについて

iOSの `戻るボタン` は、`画面左上` に実装します。
iOSを使用している全てのデザイナーさんがそうではないですが、出来上がったデザインは、
Androidにも画面左上に `戻るボタン` が配置されていることが多いです。

果たして、これは正しいのか？？

# 3. Androidの画面左上のボタン

Androidの developer サイトにある[Back ボタンと Up ボタンを使用したナビゲーション](https://developer.android.com/design/patterns/navigation.html)を読んでみます。

Androidのアクションバーに設置する画面左上のボタンは、正式には`アップボタン`といい、
バックボタンと区別します。


# 4. アップボタンと、バックボタンの定義

- アップボタン

>アップボタンは、画面間の階層関係に基づいてアプリ内を移動するために使います。
画面がアプリのトップ レベル（アプリのホーム）であれば、Up ボタンを表示する必要はありません。


- バックボタン

>システムの Back ボタンは、最近使用した画面をさかのぼって順番に移動する場合に使用します。
通常、このナビゲーションはアプリの階層ではなく、画面を表示した順番に基づいています。


`画面を表示した順番` がポイントです。


# 5. アップボタンと、バックボタンの違い

- 基本原則


> Up ボタンではユーザーの移動がアプリ内に限られるのに対して、Back ボタンではホーム画面や、別のアプリにも戻れます。


- アップボタンの例外

> 参照リストで結び付けられていない関連詳細ビュー間をブラウジングする場合は例外です。
たとえば Play Store で同じデベロッパーのアプリや同じアーティストのアルバム間をブラウジングする場合です。 
この場合、各リンクをたどると履歴が作成され、Back ボタンで以前に表示した各画面に戻ることになります。 
Up ボタンを使用するとこれらの関連画面をバイパスして、直前に表示したコンテナ画面に移動します。


iOSの `戻るボタン` は、 Androidの `アップボタン` と挙動に似ているので、
Androidの左上にボタンを設置すること自体は、間違いではないようにも思えます。
(iOSと挙動を合わせるという仕様でなければ。。)

# 6. Android アプリケーション品質ガイドライン

iOSの戻るボタンは、Androidのアップボタンと似たような挙動で要件を定義したとして、
では、Androidのバックボタンの機能は、「一つ前の画面に戻る」ボタンと伝えて良いのかと言われると、
そうではないですね。

Androidのバックボタンは、様々な機能を持っています。

- バックボタンの期待する動作


> Back ボタンは、画面間を直接ナビゲーションするだけでなく、次のような動作にも対応しています。
・　フローティング ウィンドウ（ダイアログ、ポップアップ）を閉じる
・　コンテキスト アクションバーを閉じて、選択したアイテムのハイライト表示を解除する
・　画面上のキーボード（IME）を非表示にする

また、[Android アプリ品質ガイドライン](https://developer.android.com/distribute/googleplay/quality/core.html)では、

>・アプリはシステム アイコンの予想機能（[戻る] ボタンなど）を再定義しません。
・すべてのダイアログは [戻る] ボタンを使用して取り消すことができます。

にあるように、ダイアログも取り消すようにしなければ本当は良くないなんですね。
(なにも実装しなければ消すようになっているのですが。。)

あと、Webviewでは、意識しないとブラウザバックのような挙動をしないです。。
この部分は、Webviewで表示するコンテンツをきちんと検討して、定義していくしかないのかなと思ってます。


ダイアログについても、必要ならバックボタンを押下しても反応しないようにして、
ユーザーにダイアログのボタンをちゃんと意思決定させてもいいかなと思います。
(バックボタンを押下するのも意思決定と言われると。。。)

個人的には、メイン画面でバックボタンを押下すると、
「バックボタンをもう一回押すと・・・」 ダイアログ
はいらないと思うんですけどね。

# 7. 結論

今回の問題は、担当エンジニアが、画面遷移時に、finish()を呼び出さず、
バックボタンでstartActivtiy()を呼び出して、画面が二重表示してしまったんですよね。。

本題の件ですが、バックボタンの機能が多く、
一画面ごと検討して、提案していくしかないかなーと思いました笑

ガイドラインを知っている上で、より良いのユーザー体験を提供できそうであれば、
ガイドラインに沿わなくても、良いのかな〜と思います。

バックボタンについて、デザイナーやエンジニアに知識を求めるのではなく、
Androidエンジニアが、要件を定義してもらうためのアドバイスができるように
ガイドラインを精読して、知識を深めておこうという話でした。


### 参考
***
- [Back ボタンと Up ボタンを使用したナビゲーション](https://developer.android.com/design/patterns/navigation.html)
- [Android アプリ品質ガイドライン](https://developer.android.com/distribute/googleplay/quality/core.html)
iPhoneで使ってる既存の1Passwordの中身を新しいMacに同期させる方法


# 忙しい人のための結論

環境設定 > 詳細設定

![](https://www.evernote.com/l/AFoax9j7lKdDG6ehlgTVv_Uc0uN7e5wGjXEB/image.png)

ここをオンにして同期しよう

# 序

過去に半額セールかなにかの際に購入した1Password。
もともとMacとiPhoneで特に支障なく使えていたんですが、
ある日Macで「1Passwordが壊れました。AppStoreからインストールしなおしてください」的なことを言われるようになってしまった。
パスワード機能自体は動いていたが、気持ち悪いので再インストールしようと`/Application`から1Passwordを削除してAppStoreを開くと、
そこには定価で購入しろという1Passwordのアイコンしかない。

また金払うのはシャクだ。iPhoneにも入ってるし何とかなるだろ。と思い、
http://1password.com をブラウザで開いてログインしようとすると、ログイン方法がわからない。。

それもそのはず、アカウントなど作っていなかったのだ。

ちょっと不安になりながら、1password.comにて個人の新規アカウントを作成した。

# 破

iPhoneアプリに↑で作ったアカウントを入力した。
すると、アカウントは紐付いたが、保存庫（Vaults）というのが「プライマリ」と「個人」二つ出来ている。
どうやらいままでのパスワードはすべて「プライマリ」に入っている。
そして「個人」のパスワードは空である。

Macの方でも、新規で作られたアカウントのマイページから、Mac用アプリをダウンロードすることに成功。
サインインすると、「個人」の保存庫だけが表示された。

# 急

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/kymtgt">@kymtgt</a> なるほど！iPhoneの保存先ってiCloudとかになってるのかな？？それならiCloudのプライマリをMac側で指定すればいけそうな気がするけどなあ。あとはMacとiPhoneを統合する場合、統合なのか、上書きなのか選べたはず？？ないかなそういうの。</p>&mdash; g.O.R.i（gori.meの中の人） (@planetofgori) <a href="https://twitter.com/planetofgori/status/809774641287790597">2016年12月16日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

って言われたので、iPhoneアプリで同期にiCloudを使うようにしたけど
Macで **iCloudを指定** する方法がわからない！！
「同期」なんてどこにもないんだが！！

となり、いろいろ見た結果

設定 > 詳細設定 を開くと

> 1Password アカウントの外部保管庫の作成を許可

というのがあり、ナンノコッチャわからんってなったんですが、その下の説明をよく見ると「主要保管庫」と書いてあり、これもしかして「プライマリ」のことじゃね？と思ってチェックを入れてみると、
「プライマリ」が作成され、同期の方法iCloudも選ぶことができ、


無事iPhoneの内容がMacへ同期されました。
PIL/Pillowで画像の色を高速に置換する

PIL/Pillowで色を置換する場合、簡単に思いつくのはImage.getpixel/Image.putpixelを使う方法だ。

しかしながら、Image.getpixel/Image.putpixelは1枚の画像を処理するのに数秒かかってしまうほど遅い、非常に遅い。
numpyを使って高速に置換する方法もあるが、色の置換ごときに依存モジュールを増やすのも馬鹿らしい。

そこでシンプルにPIL/Pillowのみで高速に色を置換する方法を考えた。

サンプルとして以下の画像の服の色(255, 204, 0)を(48,255,48)に置換してみよう。

<img width="250" alt="sample.png" src="https://qiita-image-store.s3.amazonaws.com/0/140075/f4e2bba5-04ca-f459-660c-d1aeb54f8849.png">　<img width="250" alt="result.png" src="https://qiita-image-store.s3.amazonaws.com/0/140075/1cff6bbf-03a5-73fc-2984-986e891fc092.png">

なお画像はRGB24ビットでアルファなし、コードはpython2で記述する。

## 画像を色ごとに分解する
まず、Image.splitを使い画像を各色ごとのバンドに分解する。

```python
from __future__ import unicode_literals, print_function, absolute_import
from PIL import Image, ImageChops

img = Image.open("sample.png")

r, g, b = img.split()
```

各RGBバンドの内容は以下のようになる。

<img width="200" alt="r.png" src="https://qiita-image-store.s3.amazonaws.com/0/140075/dbf4a919-892f-13e8-2bc1-64f598c74c74.png"> <img width="200" alt="g.png" src="https://qiita-image-store.s3.amazonaws.com/0/140075/91f2e797-5b20-87a8-26bc-7bfa16331a4e.png"> <img width="200" alt="b.png" src="https://qiita-image-store.s3.amazonaws.com/0/140075/c50c4ff9-7e58-52a5-07c1-5d4eb2930a07.png">


## Image.pointで特定の色ごとに2値化する

```python
src_color = (255, 204, 0)

_r = r.point(lambda _: 1 if _ == src_color[0] else 0, mode="1")
_g = g.point(lambda _: 1 if _ == src_color[1] else 0, mode="1")
_b = b.point(lambda _: 1 if _ == src_color[2] else 0, mode="1")
```

Image.pointはテーブル変換するメソッドである、今回はlambdaを使用して各バンドごとに特定の値のみ抜き出す画像を生成している。

ポイントは引数にmode="1"を指定しているところで、modeに"1"を指定すると色深度が1ビットの画像が生成される。
これは後に述べるImageChopsモジュールでの変換に必要な処理である。

各RGBバンドの内容は以下のようになる。

<img width="200" alt="_r.png" src="https://qiita-image-store.s3.amazonaws.com/0/140075/00179e24-ab11-956b-3daa-1e872cfb28ad.png"> <img width="200" alt="_g.png" src="https://qiita-image-store.s3.amazonaws.com/0/140075/2331a30d-6eec-df15-4668-47abb67ac928.png"> <img width="200" alt="_b.png" src="https://qiita-image-store.s3.amazonaws.com/0/140075/bb88a42c-8c4e-ed63-0acd-10a97ca54537.png">


## 各バンドをAND合成してマスクを生成する
ImageChopsモジュールは、加算合成や乗算合成など様々な合成処理を行える便利なモジュールである。

今回はImageChops.logical_andを使用してAND合成をする、このメソッドはmode="1"のImageしか受け付けない。

```python
mask = ImageChops.logical_and(_r, _g)
mask = ImageChops.logical_and(mask, _b)
```

すべてのバンドで1になっているピクセル（つまり特定の色）を抜き出したマスクができる。

<img width="200" alt="mask.png" src="https://qiita-image-store.s3.amazonaws.com/0/140075/887ddb71-42bd-6d46-d124-592cab5380cf.png">

あとはこのマスクを使用して置換したい色を塗ればOK。

```python
dst_color = (48,255,48)
img.paste(Image.new("RGB", img.size, dst_color), mask=mask)
```

## 処理速度

getpixel/putpixelを使用した場合と処理を比べてみた。


```
In [27]: %time replace_put_pixel(img, src_color, dst_color)
Wall time: 234 ms

In [28]: %time replace_fast(img, src_color, dst_color)
Wall time: 1.96 ms
```

getpixel/putpixel版は234 msなのに対し、今回の方法は1.96 msとなった。
実に100倍以上の速さである。
GCP上で独自ドメインを使う

# 背景

[前回の記事](http://qiita.com/esplo/items/76a1ecaf09843c49cfaf)の続きです。
今回は、前回立ち上げたRailsに独自ドメインでアクセスできるようにしてみます。

特に手順として難しいものは無いですが、https化へのつなぎの意味合いが強い記事です。

# 準備

ドメインを持っていない方は、[freenom](http://www.freenom.com/ja/index.html)などで無料のドメインを登録しましょう。
既に持っている方は、そちらをご利用ください。

# 手順

## StaticなIPをもらう

[前回](http://qiita.com/esplo/items/76a1ecaf09843c49cfaf)の手順の最後でExternal IPが得られたと思いますが、これは**Ephemeral**なアドレスで、状況によって変更されてしまいます。
そこで、これをStaticなアドレスに変更します。

やり方は簡単。
Webコンソールの左のメニュー "Networking" -> "External IP addresses" から先ほどのIPの項目を選び、
EphemeralとなっているtypeをStaticに変更するだけです。
Nameは何でもOKです。

## DNSゾーンを作る

まずはゾーンを作ります。
"Networking" -> "Cloud DNS" から、"CREATE ZONE"を押します。
Zone nameには適当な名前、
DNS nameには取得したドメインを入れます。

すると、NSレコードが4つ表示されます。
`ns-cloud-b1.googledomains.com.`など

## レジストラで設定
このNSレコードをお使いのレジストラで設定します。

freenomであれば、”Manage" -> "Management Tools" -> "Nameservers" -> "Use custom nameservers (enter below)"という所で5つまで設定できるので、1-4をgoogleのNameserverに設定します。
"Change Nameservers"をクリックし忘れると保存されないので要注意です。

## Aレコードを設定する

先ほどStaticにしたIPを指定したAレコードを作ります。

## 確認

適当な時間をおいてアクセスしてみます。
IPでアクセスした場合と同じ表示が出れば成功です:tada:

# その他

mailgunなどの設定ではドメイン認証が必要ですが、同じメニューでTXTレコードなどを追加できます。
CloudFrontを利用する際に気をつけたほうがいいこと

#はじめ

普段、CloudFrontをあまり使いこなせていません...というより、あまり利用していません。
先日CloudFrontについて、社内利用部門からの問い合わせの対応に少し困っていました。(自分なりに調べて解決できましたが)
またつい最近、CloudFrontの利用時にハマった事例を聞けましたので、
自分の学習メモも兼ねて、下記2点について、Qiitaに書こうと思いました。
1. SSLハンドシェイクエラー 
2. 断続的に通信失敗

# SSLハンドシェイクエラー

構成: CloudFront　→　ELB　→　オリジン

## 事象
(CloudFront経由せず)ELB経由の場合は問題なくオリジンにアクセスできましたが、CloudFront経由ですと、ハンドシェイクエラーが発生し、オリジンにアクセスできませんでした。

## 原因

結論から言いますと、Hostヘッダーが一致していないことです。
今回SSLハンドシェイクエラーが発生したケースにおいて、 CloudFrontのBehaviour設定画面に<font color="Red">*Forward Headers = All* </font>というのが設定がされていました。
<img width="1488" alt="WechatIMG2.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/117156/94d569ef-dd6f-5fb3-da6d-52a8c603c8a2.jpeg">


CloudFrontのデフォルト設定ですと、Hostヘッダーは転送されませんが、
<font color="Red">*Forward Headers = All* </font>を設定してしまうと、CloudFrontが自分のDNS名(例えば abcd.cloudfront.net)をHost Headerとしてオリジンに転送されます。
その後、CloudFrontがオリジンから送付された証明書(例えばexample.com)を検証しますが、<font color="Red">CloudFrontのHost header(**abcd.cloudfront.net**)とオリジンのHost Header(**example.com**)が一致していないため、SSL通信が確立されず、ハンドシェイクエラーになってしまいます。</font>

## 解決策

CloudFrontから通過させるヘッダーを一度洗い出し、BehaviourのForward Headersを設定する際に、ALLではなく、Whitelistで通過させるヘッダーを設定することです。


# 断続的な通信エラー

## 事象
(つい最近の話)CloudFront経由の通信がある日から<font color="Red">通信ができたり、できなかったり</font>とかすることが発生します。

## 原因

前提として、セキュリティグループでアクセスを制限し、CloudFrontからのアクセスのみ許可していることです。

AWSが[CloudFrontのキャッシュサーバが追加したから](https://aws.amazon.com/jp/about-aws/whats-new/2016/11/announcing-regional-edge-caches-for-amazon-cloudfront/?nc1=h_ls)です。これにより、CloudFrontが利用するIPが増え、元々セキュリティグループに登録されていないCloudFrontのIPからのアクセスですと、当然通信ができません。

## 解決策

CloudFrontが利用するIPレンジの情報は[ip-ranges.json](https://ip-ranges.amazonaws.com/ip-ranges.json)から取得できますので、
新たに追加されたCloudFrontのIPをセキュリティグループに登録しておくことです。
※```"service": "CLOUDFRONT"```で検索すると便利

なお、CloudFrontのIPを追加されたのをどうやって分かるかと言いますと、
下記[AWSの記載](https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-ip-ranges.html#subscribe-notifications)によると、SNSを設定することにより、更新される度に通知してくれます。(全然知らなかった)
>AWS の IP アドレス範囲の通知
>
>AWS の IP アドレス範囲に変更があるたびに、AmazonIpSpaceChanged トピックのサブスクライバー>に通知が送信されます。

**補足情報**

1. 上記のAWS SNSからの通知を受け、Lambdaが起動し、自動的にセキュリティグループを更新してくれるコードがGitHub上にがあります。利用したことがないですが、[aws-cloudfront-samples](https://github.com/awslabs/aws-cloudfront-samples)ってものです。

2. セキュリティグループインバウンドルールの上限(デフォルト)は50個ですので、現状ですと、上限を超える前に、AWSサポートに(100まで)上限緩和を申請するか、セキュリティグループにさらに入れ子のセキュリティグループを登録するか2択です。


# 最後

とりあえず、自分が知っている範囲で書きました。
CloudFrontについて、全然勉強足りていないことが分かっていて、これからもどんどん触っていきたいと思っています。

# 参考リンク

1. [Cloudfront-Origin間のHTTPS通信エラー原因と対策（502:Bad Gateway）](http://qiita.com/kaojiri/items/4e2d2f112acfca14970e)
2. [[新機能] Amazon CloudFrontでHostヘッダを転送する
](http://dev.classmethod.jp/cloud/cloudfront-host-header-forward/)
3. [CloudFront エッジサーバーの場所と IP アドレス範囲](http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/LocationsOfEdgeServers.html)
4. [AWS IP アドレスの範囲](https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-ip-ranges.html)
RictyをMacに入れるのが思ったより面倒？

フォントです。

## ファイルのダウンロード
### Inconsolata
https://fonts.google.com/specimen/Inconsolata

Inconsolata-Regular.ttf
Inconsolata-Bold.ttf

### Migu 1M
http://mix-mplus-ipa.osdn.jp/migu/
https://ja.osdn.net/projects/mix-mplus-ipa/downloads/63545/migu-1m-20150712.zip/

migu-1m-regular.ttf
migu-1m-bold.ttf

### Ricty生成スクリプトとRicty Discordコンバートスクリプト
ricty_generator.sh
ricty_discord_converter.pe

## ttfファイルの生成
これらを同一ディレクトリにまとめてricty_generator.shを実行
`./ricty_generator.sh Inconsolata-{Regular,Bold}.ttf migu-1m-{regular,bold}.ttf`

## 生成されるファイル
RictyDiscord-Bold.ttf
RictyDiscord-Regular.ttf
Ricty-Bold.ttf
Ricty-Regular.ttf

## 配置
`cp -f Ricty*.ttf ~/Library/Fonts/`
FizzBuzz with Perl 6

こんにちは、Perl 6アドベントカレンダーの17日目の投稿になります。

今日はPerl6ishにFizzBuzzしましょう。


# 読み進める前に

## 注意!
+ 読者レベルとしては、[Perl 6アドベントカレンダー1日目](http://qiita.com/titsuki/items/549ac95b8c37feb1dee1)で紹介した[Perl 6 introduction](https://github.com/hankache/perl6intro)などのチュートリアルを一通り終えたレベルを想定しています。
+ わかりやすく紹介するために、正確ではない表現がところどころ出てくるかもしれません。
 + より正確な情報を知りたい場合は、[Perl 6アドベントカレンダー1日目](http://qiita.com/titsuki/items/549ac95b8c37feb1dee1)で紹介した[公式ドキュメント](http://qiita.com/titsuki/items/549ac95b8c37feb1dee1#%E5%85%AC%E5%BC%8F%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88) や公式テストケースの[roast](http://qiita.com/titsuki/items/549ac95b8c37feb1dee1#roast)などを参照ください。
+ 日本語訳が定着していないようなPerl 6独特の英単語を目にするかもしれません。基本的に解説中ではそのまま英単語で書き、その後補足しますのでご容赦ください。
+ Perl 6のモットーはTMTOWTDI (やり方は一つじゃない) です。特に正解はありません。でも、「これのほうがもっとかっこよく簡潔に書けるよ！」といった指摘は大歓迎です！

# where FizzBuzz

+ `where` を使うと引数に細かな制約を与えることができます

```pl:where-fizzbuzz.p6
proto sub fizzbuzz ($) { * }
multi sub fizzbuzz (Int $ where * %% 15) { "FuzzBuzz" }
multi sub fizzbuzz (Int $ where * %% 3) { "Fizz" }
multi sub fizzbuzz (Int $ where * %% 5) { "Buzz" }
multi sub fizzbuzz (Int $number) { $number }

fizzbuzz($_).say for 1..15;
```

## 補足

+ これはroastにもあります
  + https://github.com/perl6/roast/blob/master/S06-multi/syntax.t#L153-L164

+ `where`について詳しく知りたい場合は次のページを参照してください：
  + https://docs.perl6.org/type/Signature#index-entry-where_clause_%28Signature%29

# subset FizzBuzz

+ `subset` を使ってみるとよりPerl6ishなコードが書けます（※個人の感想です)

```pl:subset-fizzbuzz.p6
my subset Fizz of Int where * %% 3;
my subset Buzz of Int where * %% 5;
my subset FizzBuzz of Int where Fizz&Buzz;
my subset Number of Int where none Fizz|Buzz;

proto sub fizzbuzz ($) { * }
multi sub fizzbuzz (FizzBuzz) { "FuzzBuzz" }
multi sub fizzbuzz (Fizz) { "Fizz" }
multi sub fizzbuzz (Buzz) { "Buzz" }
multi sub fizzbuzz (Number $number) { $number }

fizzbuzz($_).say for 1..15;
```

## 補足

+ `subset`について詳しく知りたい場合は次のページを参照してください：
  + https://docs.perl6.org/language/typesystem#index-entry-subset-subset

## NOTE

過去のサンプルコードについて、`where all Fizz|Buzz`は間違いでした。すみません。
正しくは、`where Fizz&Buzz`です。

+ 下記のようなコマンドを実行すると違いがわかるかと思います：

```
$ perl6 -e 'say all 1|2'
all(any(1, 2))
$ perl6 -e 'say 1&2'
all(1, 2)
```

# EVAL FizzBuzz

+ `EVAL` を使ってFizzBuzzすることもできます。これは引数として与えた文字列をコードとして評価します。

```pl:EVAL-fizzbuzz.p6
use MONKEY-SEE-NO-EVAL;

proto sub fizzbuzz($) { * }

my Str $code-text = gather for 1..15 -> $number {
    my $answer = do { $number %% 15 ?? "FizzBuzz"
                      !! $number %% 5 ?? "Buzz"
                      !! $number %% 3 ?? "Fizz"
                      !! $number
                    };
    take " multi sub fizzbuzz($number) \{ \"$answer\" \}; "
}.join;

EVAL $code-text ~ 'fizzbuzz($_).say for 1..15;';
```

## 補足

+ `EVAL`について詳しく知りたい場合は次のページを参照してください：
  + https://docs.perl6.org/routine/EVAL


いろいろなパターンのFizzBuzzを考えてみると文法力がついて楽しくなってきますね！
以上、Perl 6アドベントカレンダーの17日目の投稿でした。
gomobile でテキストを表示する方法

# この記事は

この記事は [ACCESS Advent Calendar 2016](http://qiita.com/advent-calendar/2016/access) 17日目の記事です。
ACCESS の @pankona です。

gomobile で font パッケージ等を使ってテキストを表示する方法について書きます。

# はじめに 

## gomobile とは

そもそも gomobile ご存知でしょうか。gomobile 。
gomobile って何かっていうのをすごく平たく言うと、「Go 言語でモバイルアプリ作れちゃうやつ」です。
ここでいうモバイルアプリというのは、つまり Android、iOS のアプリのことです。

公式ページはこちら → https://github.com/golang/go/wiki/Mobile
興味あったら見てみてください。

## とはいえ Experimental

モバイルアプリを作れると書きましたが、gomobile は Go 言語開発プロジェクトの中でもまだ Experimental な位置づけです。
使い方にもよりますが、いざこれでゲームを作ってみようなんて思いたって作り始めた日には、色々機能が足りない、もしくはやれそうな気がするがやり方が不明、なんてことに結構ぶちあたります。
その中のひとつが、 **「画面にテキストを表示する」** という機能です。

ということで今回は、少しでもそういった壁にぶちあたった方々の参考になればと思いつつ、
「gomobile でテキストを表示する方法」について書いてみます。

# 完成したものがこちら

何はともあれ、テキストを表示するとどうなるか見てください。
むやみに回転させてみました。

![output.gif](https://qiita-image-store.s3.amazonaws.com/0/36552/3f5cd3a3-c6d2-1fb6-ee93-6509269ebc6f.gif)

## ソースコード

ソースコードはこちら → https://github.com/pankona/gomobile_font_test
※ gomobile に含まれている example をベースにして書きました。

実際にテキスト表示したい！けどやり方がわかんない！というような方はだいぶ稀有でしょうが、しかしそういう方にとって上のソースコードがきっと参考になるだろうことを願ってやみません。

## ちなみにフォントは gofont パッケージのものを使用

表示するフォントは truetype ならそんじょそこらで入手したフォントでも表示できると思われますが、
実は上記 GIF 動画で使用しているフォントは gofont というパッケージに含まれているモノのうち、 goregular というのを使っています。

Go fonts についてはこちら → [Go fonts - The Go Blog](https://blog.golang.org/go-fonts)
上の記事には色々書いてあるんですが、特に興味深い箇所は「Go fonts の特徴はそのライセンスだよ」って書かれてるところです。

> Perhaps the most remarkable feature of the Go fonts is their license: They are licensed under the same open source license as the rest of the Go project's software, an unusually free arrangement for a high-quality font set. 

Go プロジェクトの他のソフトウェアと同じライセンスだよ、って書いてると思うんですが、
だとするとたぶん BSD ライセンスってことですかね。割と気楽に使えるフォントがパッケージとして提供されてるっていうのはなかなか嬉しいのでは。

# 終わりに

さてテキストぐるぐるをお見せしました。いかがでしたでしょうか。
gomobile に限らず、Go 言語あまりわからん、という方も、これを期に Go 言語デビューしてみてはいかがでしょうか。Go 言語、楽しいよ！

明日 12/18 の ACCESS Advent Calendar は @shotasakamoto さんの出番です。お見逃しなく！
OpenAMの設定データをバックアップして、リストアする

## 今日やること

今日はOpenAMのバックアップとリストアについてです。
先日は監査ログという、少し運用に近い範囲のお話を取り上げましたので、もう少し続けてみたいと思います。

## OpenAMのデータストア

OpenAMの設定データの格納先はLDAP（あと、ファイルも少々）となっています。ゆえに、**本気でOpenAMを冗長構成でセットアップする**際には、このLDAPを**冗長化**したり、**分散**させたりします。

こんな具合に...

![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/148404/9b012d5e-6981-8568-7bb1-15ee12b50b5b.jpeg)

しかし、このAdvent Calendarで使用しているOpenAMは、OpenAMに内蔵されているLDAPをしようしています。

こんな構成です。

![002.jpg](https://qiita-image-store.s3.amazonaws.com/0/148404/325d1c7e-e478-48b4-a08b-1a7eb30ab0a9.jpeg)

よって、本日取り扱うお話としては、このOpenAMに内蔵されているLDAPに対してのオペレーションとなります。

余談ですが、LDAPに設定データを保持するって、今時珍しいですね。きっとSun時代の遺産によるところがあるのでしょうが、何か**LDAPであることで嬉しいこと**ってのがあるのでしょうか？どうしてもユーザー情報を格納するデータベースというイメージがあるもので...

## バックアップする

では、まずバックアップを取得してみましょう。OpenAMの設定ファイル等が格納されているディレクトリ（本記事では`/home/openam/openam/opends/bin/`）以下にLDAPを操作するクライアントコマンドが配置されています。このなかの`export-ldif`コマンドを使用します。

```bash
/home/openam/openam/opends/bin/export-ldif \
    --port 4444 \
    --hostname iam.example.com \
    --bindDN "cn=Directory Manager" \
    --bindPassword password \
    --backendID userRoot \
    --includeBranch dc=openam,dc=forgerock,dc=org \
    --excludeBranch ou=tokens,dc=openam,dc=forgerock,dc=org \
    --ldifFile /tmp/backup-`date -u +%F-%m-%s`.ldif \
    --start 0 \
    --trustAll
```

コマンド実行後、下記のファイルができあがります。

```bash
ll /tmp/*.ldif 
-rw------- 1 openam openam 2131287 Dec 17 00:43 /tmp/backup-2016-12-16-12-1481903027.ldif
```

お気づきかもしれませんが、このコマンドはOpenAMを停止することなく、実行することができます。

## リストアする

リストアは同ディレクトリ以下に`ldapmodify`が配置されているので、それを使用します。ただし、変更内容ごとに`ChangeType`をつけないと、正常にロードされません。

基本的な使い方としては前回バックアップ取得時との差分を検出し、差分のみを適用（もちろんChangeTypeもつける）した状態のLDIFを作成してから`ldapmodify`するみたいです。んー、めんどうですねー。

## もろともバックアップ・リストア

もし、停止が許容されるのであれば、ディレクトリもろともバックアップをとっていいみたいです。

```bash
cd /home/openam/
zip \
    --recurse-paths /tmp/backup-`date -u +i5%F-%m-%S`.zip \
    openam .openamcfg/ \
    --exclude openam/openam/debug/* openam/openam/log/* \
              openam/openam/stats* openam/opends/logs/* \
              openam/opends/locks/*
```

リストアするときは、再度同じディレクトリに配置するだけですね～。

## まとめ

忘年会ばっかで書く時間がとれなくなってきたぞ～(´ρ`)

まとめは

* OpenAMはLDAPに設定情報を保持している
* LDIF形式で設定情報を保持できるけど、リストアがめんどくさい
* もろともバックアップはシステムの停止が必要だけど、簡単である。

休日に書き溜めせねば...

ばい！
HoloLensで猫の顔を認識する Dlib FaceLandmark Detector #アセットアドカレ

## はじめに
この記事は [Unity Assets Advent Calendar 2016](http://qiita.com/advent-calendar/2016/unity-asset) 10日目の記事になります。

本日は前日のOpenCV for Unityと同パブリッシャーである[Enox Software](https://www.assetstore.unity3d.com/jp/#!/search/page=1/sortby=popularity/query=publisher:7690)さんの[Dlib FaceLandmark Detector](https://www.assetstore.unity3d.com/jp/#!/content/21088)をご紹介します。

## Dlib FaceLandmark Detector 1.0.5
[![image](https://qiita-image-store.s3.amazonaws.com/0/32347/b2528e52-c68f-60b1-bc36-77ce09c0e42e.png)](http://u3d.as/uKr)

Dlib FaceLandmark Detector | DlibFaceLandmarkDetector can ObjectDetection and ShapePrediction using Dlib C++ Library. 
https://enoxsoftware.com/dlibfacelandmarkdetector/

### Dlib FaceLandmark Detectorについて

OpenCVとは別物で、Dlib FaceLandmark Detectorは[Dlib](http://dlib.net/)という機械学習アルゴリズムや画像処理を含むオープンソースのC++ライブラリです。
Dlib19.0からObjectDetectionとShapePredictionをUnityで使えるようになるアセットです。

> 参考
> UnityでDlibFaceLandmarkDetectorを利用した顔器官検出アプリ事始め
http://qiita.com/utibenkei/items/2f392d6fa00960f39e45

OpenCVよりナウいライブラリらしい。

### アセットについて

- Texture2D、WebCamTexture、画像バイト列から、正面を向いた人の顔と68ポイントの顔のランドマークを検出が可能。
    - Texture2DSample、WebCamTextureSampleのデモシーン
![image](https://qiita-image-store.s3.amazonaws.com/0/32347/e84f201b-6aa0-1730-1e25-88bed0de4bd5.png)

- 訓練データファイルを差し替えることで任意のオブジェクトの検出が可能。
    - CatDetectionSampleのデモシーンで**猫顔**を検知
![image](https://qiita-image-store.s3.amazonaws.com/0/32347/9a491b4a-ecff-8fb1-63c6-ab0b9d3416b2.png)

## HoloLensで猫の顔を認識する

### 環境
- Unity 5.6.0b1(https://unity3d.com/jp/unity/beta/unity5.6.0b1)
- Dlib FaceLandmark Detector 1.0.4 (Dec 01, 2016)
- HoloToolkit-Unity
    - https://github.com/Microsoft/HoloToolkit-Unity/tree/master
   の20161215最新 [0397cfa](https://github.com/Microsoft/HoloToolkit-Unity/tree/0397cfa)

### サンプルのCatDetectionSampleをHoloLensに対応する
1. DlibFaceLandmarkDetectorの初期設定。
 ![image](https://qiita-image-store.s3.amazonaws.com/0/32347/e3ceaa04-a925-3f2a-b160-ed163abba511.png)
2. CatDetectionSampleを開く
3. 下の図のように設定する
 ![image](https://qiita-image-store.s3.amazonaws.com/0/32347/2c0d226f-a263-9b0c-ba3b-462840e3a262.png)
4. 完成

※なお猫アレルギーのためテストは実施しない。

### 犬の顔も認識できる
**How to extract the shape predictor from "mmod_dog_hipsterizer.dat"**
https://enoxsoftware.com/dlibfacelandmarkdetector/how-to-extract-the-shape-predictor-from-mmod_dog_hipsterizer-dat/
Cypherのノード(Node)の基本を理解する

Neo4jのCypherの文法、サンプルは豊富にあるのですが、文法がちょっとわかりづらいです。今回は、ノード(Node)とリレーションシップ(Relationship)のうちの、ノード(Node)を見ていきます。１つ１つ順を追って理解していけるように、徐々に膨らませていきます。

## 最小限のノード

これだけで作れます。

```
CREATE()
```

`ID`が`22`というだけの、ノードができます。

![スクリーンショット 2016-12-16 23.55.34.png](https://qiita-image-store.s3.amazonaws.com/0/10290/1ecd2e51-f422-6a05-d0e4-9bcf388af625.png)



## 名前(プロパティ)をつけてみる

ノードを作るからには、データを入れたいことでしょう。`()`の中に`{名称:値}`を追加します。

```
CREATE({name:'Taro'})
```

`name`に`Taro`が設定されたノードができました。

![スクリーンショット 2016-12-16 23.56.08.png](https://qiita-image-store.s3.amazonaws.com/0/10290/1a5ca396-c587-5bfa-e7ce-7539fe98dbb4.png)

カンマ区切りで複数設定できます。

```
CREATE({name:'Taro',age:33})
```

`name`に`Taro`、`age`に`33`が設定されたノードができました。

![スクリーンショット 2016-12-16 23.56.41.png](https://qiita-image-store.s3.amazonaws.com/0/10290/cfbfe8a1-0f26-8741-c70b-ad700ac67a39.png)

> 先ほど作ったTaroノードと共存しています。IDが異なるので、別のノードとして扱われています。

### 値に利用できる型

* 数字(10進、16進、8進)
* 文字列(`"`か`'`で囲む)
* ブール値 (`true`,`false`,`TRUE`,`FALSE`)
* リスト (`[`と`]`で囲む)

参考：[オンラインドキュメント 3.2.2.1. Expressions in general](https://neo4j.com/docs/developer-manual/current/cypher/syntax/expressions/)

## 君は何者だ(ラベル)

検索しやすくするために、「ラベル」でグルーピングできます。ラベルは、オブジェクト指向での「クラス」や「インターフェース」、Qiitaでの「タグ」のような感じのものです。`(`の直後に`:ラベル名`を追加します。

```
CREATE(:Person {name:'Taro',age:33})
```

`Person`というラベルがついた、ノードができました。

![スクリーンショット 2016-12-16 23.37.29.png](https://qiita-image-store.s3.amazonaws.com/0/10290/1f706ac7-07bf-7142-328b-7f21d5139ce8.png)

ラベルも、`:ラベル名`を繰り返して、複数つけることができます。

```
CREATE(:Person:Developer:Boss {name:'Taro',age:33})
```

`Person`で`Developer`で`Boss`なノードができました。

![スクリーンショット 2016-12-16 23.42.50.png](https://qiita-image-store.s3.amazonaws.com/0/10290/05d8dd3f-a346-2705-8026-9a774015ec49.png)


## 作成したノードをすぐに使いたい(識別子)

これまでで、ノードに関しては一通り網羅しました。え、本に`CREATE(n)`とか`CREATE(n:Person)`とかって書いてあるんだけど`n`は要らないのかって？

ぶっちゃけ、**すぐに使わないのなら、`n`は不要です**。`n`(やその他の記号)が必要なのは、その直後に、作成したノードを使って何かをする場合のみです。これは例えて言えば、オブジェクトは作るものの、作ったオブジェクトを参照する用がなければ変数に入れる必要がないのと一緒です。

Cypherの識別子は常に`(`の直後に書きます。

```java:Javaの例
Person n = new Person("Taro", 33);
System.out.println(n.name);
```

```:Cypherの例
CREATE(n:Person {name:'Taro',age:33})
RETURN n.name;
```

作成されたノードに`n`などの識別子の情報は一切持ちません。

![スクリーンショット 2016-12-16 23.58.16.png](https://qiita-image-store.s3.amazonaws.com/0/10290/07130e08-4967-7573-56af-44541e774c84.png)

### 識別子の命名規約

識別子は`n`でなくてもいいです。アンダースコアと英数字の組み合わせなら何でも良いです。最初の文字はアルファベットにする必要があります。大文字と小文字は区別します。空白を含める時は、識別子全体を\`で囲います。

参考：[オンラインドキュメント 3.2.3. Variables](https://neo4j.com/docs/developer-manual/current/cypher/syntax/variables/)
org.joda.time.DateTimeをISO8601形式でJSONにシリアライズするとミリ秒が付いてくる

```groovy
// Groovy Version: 2.4.5 JVM: 1.8.0_77 Vendor: Oracle Corporation OS: Mac OS X
@Grab('com.fasterxml.jackson.core:jackson-core:2.8.5')
@Grab('com.fasterxml.jackson.datatype:jackson-datatype-joda:2.8.5')

@Grab('joda-time:joda-time:2.9.6')

import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.databind.util.ISO8601DateFormat
import com.fasterxml.jackson.datatype.joda.JodaModule
import org.joda.time.DateTime

def now = new DateTime()
def bean = new Bean(date1: now.toDate(), date2: now)

def objectMapper = new ObjectMapper()
        .registerModule(new JodaModule())
        .setDateFormat(new ISO8601DateFormat())

def json = objectMapper.writeValueAsString(bean)
println json



class Bean {
    Date date1
    DateTime date2
}
```

結果

```json
{
  "date1": "2016-12-23T06:33:01Z",
  "date2": "2016-12-23T06:33:01.045Z"
}
```

`java.util.Date` である`date1`の方はミリ秒は付いていない。
ちゃんと `@com.fasterxml.jackson.annotation.JsonFormat` で整形する必要がありそう。

### おまけ

```groovy 
def objectMapper = new ObjectMapper()
        .registerModule(new JodaModule())
//        .setDateFormat(new ISO8601DateFormat())
        .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
```

上のような状態で試すと`date1`にもミリ秒が付く。タイムゾーン指定子も`Z`じゃなくて`+0000`に変わっちゃってるけど。。

```json
{
  "date1": "2016-12-23T06:38:26.270+0000",
  "date2": "2016-12-23T06:38:26.270Z"
}
```
syntax-rulesでfree-identifier=?, bound-identifier=? を書く

この記事は [Lisp Advent Calendar 2016](http://qiita.com/advent-calendar/2016/lisp) 17日目の記事です。

R6RS Scheme には識別子の等価性を判定する [bound-identifier=?](http://www.r6rs.org/final/html/r6rs-lib/r6rs-lib-Z-H-13.html#node_idx_1140) と [free-identifier=?](http://www.r6rs.org/final/html/r6rs-lib/r6rs-lib-Z-H-13.html#node_idx_1142) という述語がある。

詳しい説明は R6RS の本文に譲るとして、使い方で言うと、 `free-identifier=?` は `cond` の `else` のような構文キーワードの一致判定に使い、 `bound-identifier=?` は `(lambda (a a) ...)` の `a` のように変数束縛の中に重複があるケースを検出するのに使うのが代表的な使い途だ。

これらの手続きは、 R6RS では `syntax-case` を使った低レベルマクロを書くために提供されているが、 http://okmij.org/ftp/Scheme/macro-symbol-p.txt の方法を使うと R[567]RS の `syntax-rules` でこれらの手続きと同様の意味の述語を書ける。

定義は以下の通り。

```scheme
(define-syntax syn-free-identifier=?
  (syntax-rules ()
    ((_ a b kt kf)
     (let-syntax ((test (syntax-rules (a)
                          ((_ a) kt)
                          ((_ x) kf))))
         (test b)))))

(define-syntax syn-bound-identifier=?
  (syntax-rules ()
    ((_ id b kt kf)
     (let-syntax ((id (syntax-rules ()
                        ((_) kf)))
                  (ok (syntax-rules ()
                        ((_) kt))))
         (let-syntax ((test (syntax-rules ()
                              ((_ b) (id)))))
             (test ok))))))
```

手続き版と区別するために、 `syn-` という接頭辞を付けている。また、 Scheme のマクロは最外簡約であるため、手続きのように値を返すことができないので、識別子 `a`, `b` が等しいときとそうでないときの継続 `kt` と `kf` を渡し、判定結果によりいずれに展開されるかを選択するようにしている（これは `syntax-rules` で合成可能なマクロを書くときの常套手段だ）。

`syn-free-identifier=?` の方は、 `syntax-rules` のリテラルが、ちょうど `free-identifier=?` の意味で一致判定をすることを利用している（`syntax-rules` を使った `cond` マクロの定義を思い出すとよい）。

`syn-bound-identifier=?` の方はもう少し込み入っているが、 `bound-identifier=?` の定義である「マクロ展開結果で一方が束縛変数になるとき、もう一方はその変数のスコープ内に現れた場合その束縛を参照する[^1]ならば `#t` を返す」というのをそのまま書き下したようになっている。

[^1]: 識別子 *a*, *b* があるとき、例えば、 `(lambda (`*a*`) ... `*b*` ...)` に *a* は束縛変数として現れる。このスコープ内の *b* が *a* の束縛を参照するなら 

`(syn-bound-identifier=? a a #t #f)` で、ふたつの `a` が字面としては等しく、識別子として異なる場合、これを `a#0` と `a#1` のようにして表記することにすると、 `(syn-bound-identifier=? a#0 a#1 #t #f)` 展開結果は下のようになる。

```scheme
(let-syntax ((a#0 (syntax-rules ()
                    ((_) kf)))
             (ok (syntax-rules ()
                   ((_) kt))))
    (let-syntax ((test (syntax-rules ()
                         ((_ a#1) (a#0)))))
        (test ok)))
```

`a#0` と `a#1` は異なる識別子なので、 `test` のパターン部の `a#1` はテンプレート内の `a#0` を捕捉しない。

この結果、 `(test ok)` は `(a#0)` に展開され、結果は `kf` になる。

ふたつの識別子が `bound-identifier=?` である場合は、ふたつを `a#0` と書くと、展開結果は次のようになる

```scheme
(let-syntax ((a#0 (syntax-rules ()
                    ((_) kf)))
             (ok (syntax-rules ()
                   ((_) kt))))
    (let-syntax ((test (syntax-rules ()
                         ((_ a#0) (a#0)))))
        (test ok)))
```

`syn-bound-identifier=?` の第一、第二引数が `bound-identifier=?` である場合、 `test` のパターン変数とテンプレートが同一の変数を参照し、 `(test ok)` の展開結果は `(ok)` になり、最終的に `kt` になる。

というような感じで、 R6RS の低レベルマクロの一部として紹介されているものでも、 `syntax-rules` で記述できるものがある。 `syntax-rules` には想像以上の表現力がある。
私がAVRマイコンをいじるまで

# うちの大学の情報工学専攻は...楽すぎる...
まず、今期は月曜日が全休です。金曜日も全休です。
あと火曜日、水曜日、木曜日が基本的に午後休です。
そのおかげで、冬休みが実質２倍に伸びました。

また、レポートはほとんどありません。
コーディングは月に１度程度です。
中間テストもありませんでした。

...将来、大丈夫かな。

# このままでは、高校時代の方がコーディングしてる
というわけで、プログラミングができるサークルに入りました。
ロボコンサークルです。
ロボコンの公式サイトは以下のリンクから。
NHK学生ロボコン　http://www.official-robocon.com/

ロボット製作ではプログラミングできました。

ちなみにロボットにプログラムを組み込む際には、
マイコンという小さなデバイスにプログラムを書き込み、それを載せます。
マイコンは電圧によって入力・出力を行い、回路を制御しています。
基本的には入力はセンサからの値で、出力はアクチュエータの動作です。
また通信も可能で、回路を作成すればPCと無線通信をすることも可能です。

　
　
ここまでが、昨年までの話です。
今年からは後輩の教育係で、後輩が主にコーディングをしてます。

でも、だんだんと教えることが細かすぎるものになってきました。
細かすぎて伝わらないアレです。

...何か後輩に教えられることを新しく勉強しなければ。

# よし、AVRやろう。
AVRは安価に入手できるマイコンです。
AVRの中にも種類がありますが、安いものでは秋月で50円ほどで手に入ります。

話はズレますが、秋月電子は電子部品を取り扱っているサイトです。
配達もしていますので、電子工作に興味があれば覗いてみてください。
電子工作と言わずに、今でいえばIoTというやつですかね。
秋月電子　http://akizukidenshi.com/

話を戻して、AVRのATtiny13A。小さくて可愛い。
大きさは10×10×10くらいですかね。これが50円です。
![ATtiny13A](http://akizukidenshi.com/img/goods/C/I-02911.jpg)

ロボコンとか電子工作とか全く縁のなかった人は、
この子に何ができるか分からないと思います。

でも、違うんです。
この子だけでも、回路があれば大抵のことができます。
皆さんが何をさせるのかが大事だと私は主張したい。特に後輩に。

この子に書き込んだプログラムを以下に紹介します。
至って普通のC言語であることを感じていただければ幸いです。

``` adc_sample_main.c
int main(void)
{
	int result;
	
	//出力ポートを設定
	set_bit(DDRB, DDB2, 1);
	set_bit(PORTB, PORTB2, 1);
	
	//A/D変換のチャネルを選択 ADC3（PB3）
	set_bit(ADMUX, MUX1, 1);
	set_bit(ADMUX, MUX0, 1);
	
	//基準電圧を選択（Vcc）
	set_bit(ADMUX, REFS0, 0);
	
	//結果を右揃えに
	set_bit(ADMUX, ADLAR, 0);
	
	//ADTS2-0 = 000（連続変換動作）
	set_bit(ADCSRB, ADTS2, 0);
	set_bit(ADCSRB, ADTS1, 0);
	set_bit(ADCSRB, ADTS0, 0);
	
	//システムクロックの分周値 1/8 -> 150kHz
	//ADPS2-0 = 011
	set_bit(ADCSRA, ADPS2, 0);
	set_bit(ADCSRA, ADPS1, 1);
	set_bit(ADCSRA, ADPS0, 1);
	
	//A/D変換自動起動許可
	set_bit(ADCSRA, ADATE, 1);
	
	//A/D許可
	set_bit(ADCSRA, ADEN, 1);
	
	//A/D変換開始
	set_bit(ADCSRA, ADSC, 1);
		
	while (1) 
	{
		//変換結果を取得
		result = ADCL + (ADCH << 8);
		
		if(result > 614){	// 614 -> 3.0V
			set_bit(PORTB, PORTB2, 1);
		}else{
			set_bit(PORTB, PORTB2, 0);
		}
		
		_delay_ms(10);
	}
}
```

簡単に上のプログラムを説明すると、これはAVRでAD変換を行っているプログラムです。
AD変換とはアナログ電圧値をデジタル数値に変換する機能です。
入力された電圧が3.0Vより大きいならLEDを点灯し、それ以下なら消灯するものです。

教育用のサンプルなので使い道については...触れるな...

# まとめ
講習用資料のまとめもいつも数行なので、数行にまとめます。

電子工作たのしい。
マイコン使うと何でもできる。
みんなやるんだ。
プリント基板 CAD KiCad のマニュアルを翻訳している話

*この記事は [技術翻訳 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/translation) の17日目です。*

オープンソースの [プリント基板 CAD KiCad](http://kicad-pcb.org/) のマニュアルを翻訳している話を書きます。

# 現在の状況
KiCad は現在 バージョン 4.0.4 なのですが、メンテナンスリリースの 4.0.5 がまもなくリリースされます。それに向けてマニュアルの更新を行っていました。マニュアル翻訳の完成目標日は12/16(金)に設定されていて、丁度それを終えた所です。
翻訳の呼びかけを [KiCad ドキュメントの開発者メーリングリスト](https://lists.launchpad.net/kicad-doc-devs/msg00053.html) や 
[Github の課題管理](https://github.com/KiCad/kicad-doc/issues/462) で行い、翻訳者の参加状況や翻訳の進捗状況を書き込んで見える化していました。
今回、特に追い込んで翻訳を更新したマニュアルでは、ドイツ語、スペイン語、フランス語、イタリア語、ポーランド語 そして 日本語 と6つの言語の翻訳がありました。

# マニュアル作成に使われている技術

KiCad のマニュアルは現在は [asciidoc](http://www.methods.co.nz/asciidoc/) で書かれています。そして翻訳のために [PO4A](https://po4a.alioth.debian.org/) が使われています。
マニュアルの原文は英語で書かれており、asciidoc 形式の .adoc ファイルになっています。この .adoc から翻訳文を書き込むための .po ファイルを PO4A で生成しています。翻訳での .po ファイルの編集には [POEDIT](https://poedit.net/) 等のツールが使われています。
ドキュメントの最終出力形式は HTML、PDF、EPUB の3形式です。
これらの処理を cmake でビルドする仕組みになっています。

# 翻訳活動での難しい点

翻訳活動での難しいことは色々あると思いますが、特にこの KiCad マニュアルでの活動で直面してきたことを以下に書いてみます。

## ツールの使い方でのつまずき

翻訳するぞ、と来てくれる人達が皆コンピュータ開発のツールに慣れ親しんでいるわけではないのでツールの使い方でつまずくというのはいまだにあります。
「.po を最新にしてから翻訳して GitHubにプルリクしてね」とかって結構ハードル高いのだと思うのです。
KiCad のマニュアルの場合は、.po ファイルを 原文の .adoc に対して更新するために updatepo する必要があったり、Linux 環境でないと作業できないようなこともあり、翻訳を始めるまでの敷居が高いように感じてます。

そういう翻訳する人にとって面倒な作業を必要に応じて支援するようなことを今回はしていました。

## 書く人 vs 翻訳する人

英語の原文を修正を行いたい人がいて、それにより原文の質が向上するので素晴らしいことなのです。
一方、翻訳する人から見ると、原文が修正されると翻訳していたものがやり直しになるという負担になってしまいます。
翻訳作業というのはそういうものなのですが、可能な限り翻訳した人の作業が無駄にならないようにしたい。
KiCad マニュアルでは、**master** ブランチで英語の原文をガシガシ直して行き、**安定版(stable)** のブランチでは翻訳を進めて極力原文の変更を行わないことにしています。

## 翻訳する人、翻訳した人の状況

言語によって、翻訳した人が今もまだ翻訳する人として活動してる場合もありますが、過去に翻訳した人が今はもういないということもあります。また新たな翻訳者が現れる場合もあります。オープンソース活動なので仕方がないことです。
翻訳する人が魅力的に思える状況を作るのがモチベーションに繋がっていくのかなと思いつつ、どうすれば魅力的になるのかはいまだによく分かりません。

翻訳する人がいても、たまたまその人が仕事で忙しいということもあるでしょう。また今みたいなシーズンだと今月の後半に掛かるようなスケジュールでは皆作業したくなかったりするでしょうね。作業日程の組み方によって参加できる／参加できないが決まることもあると思うので要注意です。

# まとめ

KiCad マニュアルの翻訳の作業について書いてみました。
マニュアルのメンテナンス作業はなかなか大変な仕事だなあと関わってみてあらためて感じてます。
その反面、原文を修正する人と翻訳する人とのやりとりだけでなく、マニュアル内で紹介したいサンプルソースコードを開発者にお願いしたり、パッケージングする人にバージョンを指定したり、と関わる範囲が広いという面白さもありました。
どこかで誰かが自分の関わっているマニュアルを読んで KiCad を操作してるのかなと思えるのも楽しいです。

引き続き、このプロジェクトがより良いマニュアルをリリースしていけるものであるといいなあと思います。
Azure 初心者が Azure SDK for .NET の存在を知らないとどうなるか

# 結論

「ただ新規作成しただけの ASP.NET アプリケーションを Azure に置くことが何故か出来ない！」
「[Azure SDK for .NET](https://docs.microsoft.com/ja-jp/azure/dotnet-sdk) 入ってますか？」
「なんですかそれ？」
「インストールしましょう」

# 書いてる人

  - C は少し書いたことある。
  - Azure 初心者。
  - Azure についての書籍を読んだことがない（ASP.NET 本の巻末に手順が一応ありました）。

# Azure との出会い

  - 名前は知ってた。
  - ASP.NET やってみたいけど Windows Server 高いナー（ライセンスもよくわかんないナー）
  - 勉強目的なら Azure でいいな、触ろう。

# 触った結果

無料のライセンスも取った、Visual Studio も入ってる、ローカルでは ASP.NET アプリも動いたし、
ポチポチやってれば Azure でも It works!

![05-failure.PNG](https://qiita-image-store.s3.amazonaws.com/0/113234/afbf8108-6d8d-268b-65aa-da714ca744bd.png)

「Microsoft Azure Web App の作成が失敗しました。」[^2][^3][^4]

oh...

# 彷徨うこと２日

  - Entity Framework と出会う（便利）
  - Knockout.js と出会う（名前がカッコいい）
  - <strong>Azure SDK for .NET</strong> と出会う

# Azure SDK for .NET

これが何なのかについては調べていません（優しい人は教えてください）。
[Azure .NET SDK とは](https://docs.microsoft.com/ja-jp/azure/dotnet-sdk)
[Azure SDK とツールのダウンロード | Azure](https://azure.microsoft.com/ja-jp/downloads/)
てっきり素の VS 2015 でやれるものだと・・・。
私は VS Community 2015 でしたので VS 2015 をダウンロードしてインストールしました。

# そして…

![12-deployed.PNG](https://qiita-image-store.s3.amazonaws.com/0/113234/777bfb83-5c35-b637-376b-080907130eed.png)

<strong>Yes!</strong>

![13-it-works.PNG](https://qiita-image-store.s3.amazonaws.com/0/113234/a80fe8ec-f01a-33a1-700f-5ba0eaa68f8c.png)

<strong>It works!</strong>

# 最後に

行き詰ってエラーメッセージを google 先生に投げてみたんですが、あまり芳しくなく、
書籍には書いてあるかもですが、ネット上には見当たらず・・・。
理屈はともかく動いたので書きとめておきます。

# 注釈

[^2]: Microsoft Azure Web App の作成が失敗しました。Following errors occured during the deployment:
[^3]: Error during deployment for resource 'AppInsightsComponents WhyNotDeploy' in resource group 'WhyNotDeployGroup': MissingRegistrationForLocation: The subscription is not registered for the resource type 'components' in the location 'Central US'. Please re-register for this provider in order to have access to this location..
[^4]: Error during deployment for resource 'WhyNotDeployDbServer' in resource group 'WhyNotDeployGroup': NoRegisteredProviderFound: No registered resource provider found for location 'South Central US' and API version '2.0' for type 'servers'. The supported api-versions are '2014-01-01, 2014-04-01, 2014-04-01-preview'. The supported locations are 'centralus, eastus, westus, southcentralus, eastus2, northcentralus, eastasia, southeastasia, japanwest, japaneast, northeurope, westeurope, brazilsouth, australiaeast, australiasoutheast, centralindia, westindia, southindia, canadacentral, canadaeast, westus2, westcentralus, uksouth, ukwest'..
組込みプログラミング > エミュレータを作る利点と欠点

記事執筆の皆様、お疲れ様です。

12月17日担当の7of9(セブンオブナイン)です。

http://qiita.com/7of9/items/ecdac553a7d325f11870
においてデバッグ方法をいくつか挙げました。
その中のエミュレータについての補足記事とします。

### エミュレータの定義

この記事ではエミュレータを以下のように定義します。

> **実機の動作(振る舞い)を模擬する**

シミュレータとエミュレータなどの定義の仕方が違うかもしれませんが、この記事としては「エミュレータ」とします。

関連 http://d.hatena.ne.jp/itog/20110209/1297220706

### エミュレータの必要性・利点

エミュレータが必要な理由(+利点)としては以下を挙げます。

- 実機が用意されていない場合
   - 実機製作中など (仕様だけはある)
- 実機の設置場所と開発PCの場所が異なる
   - 実機のサイズ、電源事情などにより開発PCの隣に置けない場合もある
   - 毎回、設置場所に移動して動作確認は効率が悪い
   - ノートPCに開発環境を入れて設置場所に赴けない場合もある
- 実機をそのまま使っても測定データが得られない場合
   - 測定データを得るための環境条件の再現が難しい場合
   - エミュレータなら「模擬測定データ」を出力できる
- 実機動作では時間がかかる、条件を成立しにくい場合
   - エミュレータで条件成立を可能にする
- 実機では終了処理が厳密で、デバッグ試行回数に制約が出る場合
   - エミュレータでは即座に終了し、再試行ができる
- 実機で起こしにくい「異常系」のデバッグをしたい場合
   - 例: 通信遅延
   - 例: 通信パケットのロス

### エミュレータの欠点、考慮点

- エミュレータの作成時間がかかる
- エミュレータ自体のデバッグ作業が必要となる
- エミュレータの保守をどれくらい行うか
   - 機能追加に追従する必要性の検討
   - 主な処理だけとする考えも
- タイミングが実機と微妙に異なる
   - シビアなタイミングのエミュレーションは難しい
- エミュレーション対象装置の理解が必要
   - 公開情報と非公開情報
   - 非公開情報を如何にして調べるか (自作ツールの利用など)
- エミュレーション対象装置の再現は難しい場合もある
   - 関連: [セガ「ナイツ」の移植の話](http://nights.sega.jp/nights1/ps2/image/memory/vol15/home.html)
       - 組込みではないですが、「エミュレータ」の話です
       - > この「人工知能」様は最後の最後までバグをだしまくり、細かなオリジナルとの違いを高橋Ｄと奥成Ｐから指摘され続け、担当者は悪夢にまで見ながらこのチマチマした生き物の再現に力を尽くした。 

### エミュレータの例

組込みプログラミング限定で考えた場合、以下のようなエミュレータを挙げてみます。

- UARTで応答するもの (*1)
   - 取込み側とUARTでつながる 
       - 例: 複数基板間通信
       - 例: 外付けセンサー(UART接続)
- DA出力するもの (*2)
   - 取込み側のAD端子につながる
   - 例: ステップ状のアナログ値を出力するもの
   - 例: 任意のアナログ値を環境条件に基づき出力するもの
- 特定のシーケンスでGPIOをON,OFFするもの (*2)
- 特定の条件でGPIOをON,OFFするもの (*2)
   - 例: レベルセンサー
   - 例: proximity センサー
   - 例: 人感検知センサー

(*1): PCソフトで再現するのが簡単。CPU基板で再現することも可能。
(*2): PCソフトで再現するにはPCI接続のボード(例:GPIOボード)が必要となり、数万円くらいします。こういう場合は、PCソフトでのエミュレーションではなく、Raspberry PiやArduinoで再現というのも一つの方法です。


### エミュレータを作る/作らない?

以下を検討します。

- そのエミュレータを今後どれくらい使うか
- １つのエミュレータから分岐して、別のエミュレータにできるか
  - 作った機能の再利用
  - 新規エミュレータ作成時間の短縮
- エミュレータの機能を実際に使う場合
  - 計算処理を共通化してエミュレータと実基板の両方で使う場合
- エミュレータを作ることで得られることはあるか
  - 例: エミュレーション対象装置の理解

### まとめ

プロジェクトごとにエミュレータの利点と欠点を考慮して、必要であればエミュレータを作りましょう。

注意事項としては「エミュレータがあれば実機は不要、ではない」ということです。
**エミュレータを使ってある程度の開発はしながら、まとまった段階で実機動作検証は必要です**。
自分がプロジェクトで使っているGemの脆弱性チェックしてる？

自分のプロジェクトでGem使ってますか？
定期的に新しいバージョンがあるかチェックしたり、更新していますか？
その更新するかどうかの基準として脆弱性チェックしていますか？

Gemfileに登録しているgemを管理する(脆弱性があるかとか)のに使えそうな情報をまとめてみました。

# 新しいバージョンが来たら通知してくれる(RSS)

#### **GithubのRSS**(https://github.com/)
例: rails https://github.com/rails/rails/releases.atom
Githubで管理されているgemの場合はこっち

#### **rubygemorgのRSS**(https://rubygems.org/)
例: rails https://rubygems.org/gems/rails/versions.atom
rubygemに登録されている場合はこっち

# 新しいバージョンがあるかチェックするツール

#### **bundle outdated**(http://bundler.io/v1.13/bundle_outdated.html)
bundileコマンド。もっと新しいバージョンが入手可能かどうか調べてくれる。

# 脆弱性情報RSS

#### **ruby-security-ann**(https://groups.google.com/forum/#!forum/ruby-security-ann)
Ruby Gemの脆弱性情報RSS

#### **Ruby on Rails: Security**(https://groups.google.com/forum/#!forum/rubyonrails-security)
Ruby on Railsの脆弱性情報RSS

# 脆弱診断チェックツール

#### **Gemnasium**(https://gemnasium.com/)
アカウント登録し、リポジトリを登録すると、脆弱性があるとメールを飛ばしたりする機能がある
画面はRubyGemsOrgっぽい感じ。
プライベートブランチは有料

@spring_aki さんに教えて頂きました。

#### **bundler-audit**(https://github.com/rubysec/bundler-audit)
Gem。コマンドでインストールされているgemの脆弱性をチェックする

#### **Is it vulnerable?**(https://isitvulnerable.com/)
トップページのドロップエリアへGemfile.lockをドロップすると、そこに書かれたGemの脆弱性情報の一覧を表示してくれる。
[参考サイト]http://www.softantenna.com/wp/webservice/is-it-vulnerable/

# 脆弱性情報

#### **ruby-advisory-db**(https://github.com/rubysec/ruby-advisory-db)
上記のチェックツールの参照してる脆弱性情報データ
ymlで管理されてる

# 補足情報

ruby-advisory-dbに書いてるCVEについて

#### **CVE**(http://cve.mitre.org/)
脆弱性情報データベース
Common Vulnerabilities and Exposures（共通脆弱性識別子）の略称


#### **JVN**(http://jvndb.jvn.jp/)
脆弱性情報データベース
CVEについて日本語で調べたりできる。