OmniAICreator/Qiita-1.07M huggingface dataset:
ObjectMapperからDecodableに書き換える

# 気をつけること

* 他の class (struct) に依存していない class (struct) から書き換える

# 変換

Before

```swift
import ObjectMapper

struct Item: Mappable {
	var id: Int = 0
	var name = ""

	init?(map: Map) { }

	mutating func mapping(map: Map) {
		id <- map["id"]
		name <- map["name"]
		...
	}
}
```

After

```swift
import Decodable

struct Item {
	let id: Int
	let name: String
}

extension Item: Decodable {
	static func decode(_ json: Any) throws -> Item {
		return try Item(
			id: json => "id",
			name: json => "name"
		)
	}
}
```

# ネストしてある class (struct) を置き換えるときはこんな感じになる

親 class (struct)

```swift
import ObjectMapper

struct User: Mappable {
	var id: Int = 0
	var name = ""
	var item: Item?
	...

	init?(map: Map) { }

	mutating func mapping(map: Map) {
		id <- map["id"]
		name <- map["name"]
		...

		do {
    		item = try Item.decode(map["item"].JSON)
		} catch {
			// なんか例外処理
		}
	}
}
```

子 class (struct)

```swift
import Decodable

struct Item {
	let id: Int
	let name: String
}

extension Item: Decodable {
	static func decode(_ json: Any) throws -> Item {
		return try Item(
			id: json => "item" => "id",
			name: json => "item" => "name"
		)
	}
}
```

こんな感じでちまちま置き換えて、すべての子 class (struct) がDecodableになったら親ごと一気にDecodableで最適化していきます。

# 毎日少しずつリファクタリングしていきます。

🐣:raised_hand:
【ECCUBE3】DoctrineのFilter

Filterを使って強制的にWHERE句を追加する。
ここでは del_flg = 0

# 使用例　SoftDeleteFilter

## SQLFilter の定義

```/src/Eccube/Doctrine/Filter/SoftDeleteFilter.php
<?php
namespace Eccube\Doctrine\Filter;

use Doctrine\ORM\Query\Filter\SQLFilter;
use Doctrine\ORM\Mapping\ClassMetadata;

class SoftDeleteFilter extends SQLFilter
{
    public $excludes = array();

    public function setExcludes($excludes)
    {
        $this->excludes = $excludes;

        return $this;
    }
    
    public function getExcludes()
    {
        return $this->excludes;
    }

    public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
    {
        if ($targetEntity->hasField('del_flg') && !in_array($targetEntity->getName(), $this->getExcludes())) {
            return $targetTableAlias . '.del_flg = 0';
        } else {
            return "";
        }
    }
}
```

## CartService
```/src/Eccube/Service/CartService.php
<?php
//////// 省略　////////
    /**
     * カートに保存されている商品の ProductClass エンティティを読み込み、カートへ設定します。
     */
    protected function loadProductClassFromCart()
    {
        /* @var $softDeleteFilter \Eccube\Doctrine\Filter\SoftDeleteFilter */
        $softDeleteFilter = $this->entityManager->getFilters()->getFilter('soft_delete');
        $excludes = $softDeleteFilter->getExcludes();

　　　　// ここからProductClassエンティティのクエリに強制的にdel_flg = 0 を追加する。
        $softDeleteFilter->setExcludes(array(
            'Eccube\Entity\ProductClass',
        ));

        foreach ($this->cart->getCartItems() as $CartItem) {
            $this->loadProductClassFromCartItem($CartItem);
        }
　　　　// del_flg = 0 追加分を削除( 元に戻す作業 )
        $softDeleteFilter->setExcludes($excludes);
    }
```

## 参考
オブジェクト取得過程

```参考.php 
<?php
$this->entityManager->getFilters()->getFilter('soft_delete');


get_class($this->entityManager)； // "Doctrine\ORM\EntityManager"
get_class($this->entityManager->getFilters()); // "Doctrine\ORM\Query\FilterCollection"

```
プログラミング言語Go読書会 #1 (まえがき- 1.2) [2017/03/17]

[Go読書会 #1 ](https://lancers-engineer.connpass.com/event/52949/) が[ランサーズ株式会社](https://www.lancers.co.jp/)で行われたので進捗と技術的なメモ書きを書いておきます。読書会の内容は[プログラミング言語Go](https://www.amazon.co.jp/dp/4621300253/?&_encoding=UTF8&tag=amesho-22&linkCode=ur2&linkId=7e29043d833086d36f8b64c2ed3721b2&camp=247&creative=1211)を冒頭から皆で読み進めていくというものです。

## 進捗した内容

+ まえがき
	+ Goの起源
	+ Goプロジェクト
	+ この本の構成
	+ より多くの情報を探すには
	+ 謝辞
+ 1章 チュートリアル
	+ 1.1 ハローワールド
	+ 1.2 コマンドライン引数

## 話題に上がった話

### まえがき

Goの起源で、プログラミング言語の樹形図[参考](http://gigazine.net/news/20070126_computer_languages_history/)が出てきまして以前読んだときはよく見るなと思って流していたのですが、よくよく考えるとALOGOL60とか見たことも触ったことも無いし現在使用されているメジャーなC,Pascalぐらいしか見たことがないことに気づいて、参会者に以下のことを聞いてみました。

+ ALGOL60を触ったことある人
+ Pascalを触ったことある人

ALGOL60を触ったことある人はさすがにいませんでした。Pascalに関して言えば [Delphi](https://ja.wikipedia.org/wiki/Delphi)の存在で触ったことがある人、授業で触ったことがある人がいました。並行性に関するプロセス計算の理論である[CSP](https://ja.wikipedia.org/wiki/Communicating_Sequential_Processes) の話もでてきました。こちらも論文読んだことある人はいないか、聞いてみましたがさすがにいませんでした。


### チュートリアル



まだGoを触ったことも無い人も参加者にはいたのでDLしてinstallするところから開始しました。ここで出た話は、開発環境の構築ですね。基本的にはDlから落としてくるだけなのですが[Install the Go tools](https://golang.org/doc/install#install) まで既にinstallしている人が案内して基本的な設定は無事出来ました。


ここでは、

+ package main
+ go fmt
+ go doc
+ go imports

ついて話しました。

package mainにおけるmain関数の役割は、Cの場合は[GNU開発ツール](http://www.oversea-pub.com/store/gnu_development_tools)に詳しいです。LinuxのCにおける_startルーチン等を確認する概ね分かります。(Windowsはどうしているのでしょうか。) Goの場合も同様かと考えています。

go importsに絡んでgoが使用していないimportがあるとコンパイルエラーが起きること、使用されていない変数が有るとこれもコンパイルエラーが起きることとgo fmtでコードの整形をすることを伝えた上で、良くあるインデント戦争がこれで回避されるねという話もしました。

コマンドライン引数から

```
for文の使い方
```

これまでの使っている言語とちがい、繰り返しがforだけで書かれますwhile文に相当するfor conditionで回すところが始めて見る方は面食らったりしたようでその辺を話しました。

あとは、forの書き方の違いでどのようなASTが生成されるのか気になったのでrubyだとこんな感じで書けるんですけどGoだとどうすればいいんですかねという話をしていました。

```
ruby --dump=parsetree -e 'puts "hello world"'
```

あとで調査したらGoの場合は以下のURLの方法でいけました。

https://golang.org/pkg/go/ast/#example_Print


大体それぐらいの話をしたときに時間で次回は1.3から開始する予定です。
変数名自体を取得する の理解のためのメモ

# <i class="fa fa-cubes"></i> どれ？

[変数名自体を取得する - Qiita]
これ。

なに？

* 参照渡し
* [openssl_random_pseudo_bytes]
* 代入

>すごい、何やってるか全然分からない...

# <i class="fa fa-graduation-cap" aria-hidden="true"></i> 結論

* 引数の値と`$GLOBALS`の値が同じものの、`$GLOBALS`のキーを返して判定している。
* 値で判定しているので、値は引数、`$GLOBALS`ともに一致するユニーク値でなければならない。
  * なぜなら、同値の別変数がある場合、どちらの変数名を返すか予測が難しいから。誤判定がある。
* そのために参照渡しにして、関数内での引数の書き換えが`$GLOBALS`にも及ぶようにしている。
* 値のユニーク化に[openssl_random_pseudo_bytes]を使い、100桁の十分にユニークなランダム文字列を作っている。
* `$GLOBALS`を書き換えているので、もともとの値を保存しておき、最後に戻す処理を加えている。
* こうすることで、関数実行時点で同値を持つ変数がいくらあろうと、判定は100桁のランダム文字列で行われるので誤判定がまず無くなる。


# <i class="fa fa-cube"></i> 検証

工夫をしない関数を使ってみる

```php
<?php

function get_var_name($var) {
    foreach ($GLOBALS as $k => $v) {
        if ($v === $var) {
            return $k;
        }
    }
    return null;
}

$hoge = 'foo';

var_dump(get_var_name($hoge)); // string(4) "hoge"
```

いけるじゃんとなるが、

```php
<?php

function get_var_name($var) {
    foreach ($GLOBALS as $k => $v) {
        if ($v === $var) {
            return $k;
        }
    }
    return null;
}

$hoge = 'foo';
$huga = 'foo';

var_dump(get_var_name($hoge)); // string(4) "hoge"
var_dump(get_var_name($huga)); // string(4) "hoge"

```

ダメになる。
$GLOBALSに先入れ、かどうかは分からないが、先に現れたものがヒットする。


***

なんとなくやりたくなるときがいまだにまれにある。
今後も忘れた頃にやりたくなって見直すたびに混乱するのもあれなのでメモる。

やりたくなる割になんでやりたかったのかすぐ忘れるたぐいの何か。

[変数名自体を取得する - Qiita]:http://qiita.com/mpyw/items/43e7d2e17f1c4507b363
[openssl_random_pseudo_bytes]:http://php.net/manual/ja/function.openssl-random-pseudo-bytes.php
fastTextの学習済みモデルをPythonから使う

gensim が提供しているラッパーが使える。

[gensim: models.wrappers.fasttext – FastText Word Embeddings](https://radimrehurek.com/gensim/models/wrappers/fasttext.html)

モデル学習:

```shell-session
$ fasttext skipgram -input data.txt -output model
$ ls model*
model.bin  model.vec
```

gensim のインストール:

```shell-session
$ pip install gensim
```

使い方:

```pycon
>>> from gensim.models.wrappers.fasttext import FastText
>>> model = FastText.load_fasttext_format('model')
>>> model['営業']
array([-0.03654   ,  0.19302   ,  0.2026    ,  0.14026   ,  0.06685   ,
        0.10969   , -0.095857  , -0.20964   , -0.27291   , -0.33750001,
        ...
        0.47084001, -0.030295  , -0.003683  , -0.10061   ,  0.17308   ], dtype=float32)
>>> m.most_similar('営業')
[('営業職', 0.7841936945915222),
 ('テレアポ', 0.7670873403549194),
 ('飛込', 0.7659018039703369),
 ('電話営業', 0.7384717464447021),
 ...]
```

モデル学習自体を gensim のラッパーから行うこともできるが、あまりメリットが無さそうなので省略。
PythonでGPSモジュールから10Hzでデータを取得する

gpsdを使わない、シリアル接続でのGPS10Hz化です。
コードは以下の通りで、一番下のメイン部分に受け取ったデータを処理するコードを書きます。

```py3:mtk3339_set_10Hz.py
#!/usr/bin/python3
# -*- coding: utf-8 -*-

from time import sleep
import serial

# シリアル接続baudrate初期値:9600
ser=serial.Serial('/dev/ttyS0', baudrate=9600, timeout=30)

class GPS: 
    def __init__(self):
        UPDATE_100msec=  r"$PMTK220,100*2F\r\n"        # 更新間隔 100msec(10Hz)
        UPDATE_200msec=  r"$PMTK220,200*2C\r\n"        # 更新間隔 200msec(5Hz)
        UPDATE_250msec=  r"$PMTK220,250*29\r\n"        # 更新間隔 250msec(4Hz)
        UPDATE_500msec=  r"$PMTK220,500*2B\r\n"        # 更新間隔 500msec(2Hz)
        UPDATE_1000msec=  r"$PMTK220,1000*1F\r\n"      # 更新間隔 1sec(1Hz)
        MEAS_100msec= r"$PMTK300,100,0,0,0,0*2C\r\n"   # 測定間隔 100msec(10Hz)
        MEAS_200msec= r"$PMTK300,200,0,0,0,0*2F\r\n"   # 測定間隔 200msec(5Hz)
        MEAS_250msec= r"$PMTK300,250,0,0,0,0*2A\r\n"   # 測定間隔 250msec(4Hz)
        MEAS_500msec= r"$PMTK300,500,0,0,0,0*28\r\n"   # 測定間隔 500msec(2Hz)
        MEAS_1000msec= r"$PMTK300,1000,0,0,0,0*1C\r\n" # 測定間隔 1sec(1Hz)
        BAUDRATE_9600 = r"$PMTK251,9600*17\r\n"        # ttyのbaudrate 9600bps
        BAUDRATE_19200 = r"$PMTK251,19200*22\r\n"      # ttyのbaudrate 19200bps
        BAUDRATE_38400 = r"$PMTK251,38400*27\r\n"      # ttyのbaudrate 38400bps
        BAUDRATE_57600 = r"$PMTK251,57600*2C\r\n"      # ttyのbaudrate 57600bps
        BAUDRATE_115200 = r"$PMTK251,115200*1F\r\n"    # ttyのbaudrate 115200bps

        #Commands for which NMEA Sentences are sent
        GPRMC_ONLY= "$PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*29\r\n" # Send only the GPRMC Sentence
        GPRMC_GPGGA="$PMTK314,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28\r\n" # Send GPRMC AND GPGGA Sentences
        SEND_ALL ="$PMTK314,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0*28\r\n"  # Send All Sentences
        SEND_NOTHING="$PMTK314,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28\r\n" # Send Nothing

        ser.write(BAUDRATE_115200.encode('utf-8')) # Set Baudrate to 115200
        sleep(1)
        ser.baudrate=115200
        ser.write(UPDATE_100msec.encode('utf-8'))  # Set update interval 100ms
        sleep(1)
        ser.write(MEAS_100msec.encode('utf-8'))    # Set measurement interval 100ms
        sleep(1)
        ser.write(GPRMC_ONLY.encode('utf-8'))      # Set report GPRMC message only
        sleep(1)
        ser.flushInput()
        ser.flushOutput()
        print("GPS is Initialized\n")

gps=GPS() # インスタンス初期化時にGPSの設定を行っている
while(1):
    while ser.inWaiting()==0:
        pass
    data=ser.readline()
    # ここに取得データの処理を書く
    print(data)
```

updateとmeasurementの設定が分かれているのはなぜだろう？連動しないと意味が無いような気がしますが。
PowerShellにて大きいファイルを検出する

PowerShellにて

    Get-ChildItem -Recurse | ?{$_.length -gt 10mb}

（補足）実行ポリシーの確認と設定は下記参照。

http://www.atmarkit.co.jp/ait/articles/0805/16/news139.html

現在のポリシーの取得

    Get-ExecutionPolicy

ポリシーの設定

    Set-ExecutionPolicy RemoteSigned
werckerのinternal/docker-pushでGCRへPUSHする(2017/3/18~4/10)

werckerのinternal/docker-pushは予め用意したコンテナ内で様々な処理をして
その処理結果をコンテナイメージとして固めて PUSHする stepである。
GCR(Google Container Registry)の他Docker Hubやquay.io、ECRにも対応している。


<font color="red">※ 2017/4/10に見たところマニュアルが修正されていたので日本語での参考情報程度に...</font>

GCRの v1 API廃止の影響で、マニュアル通りだとPUSHができないので対応策を以下に示す。

公式のマニュアルが更新されるまでのつなぎで。
slackのwercker communityでは対応策が示されているけど流れるだろうし...

# 公式のマニュアル
http://devcenter.wercker.com/docs/containers/pushing-containers#-a-name-gcr-class-anchor-a-pushing-to-the-google-container-registry-gcr-io-

ただしこのマニュアル通りだと動作しない。

このままだとGCR v1 APIを使用してPUSHを行うようだが、
https://cloud.google.com/container-registry/docs/support/deprecation-notices

の通り2/15で停止された
(実際は3/17の午後から完全にアクセスできなくなった。)

# 対応策
単純に以下の用にregistryの末尾に /v2をつければ良い

```
deploy:
    - internal/docker-push:
        username: _json_key
        password: $GCR_JSON_KEY_FILE
        repository: gcr.io/<MY-PROJECT-ID>/<MY-IMAGE>
        registry: https://gcr.io/v2
```

日本でのGCPユーザの場合 asia.gcr.ioにpushするだろうけど、その場合は

```
registry: https://asia.gcr.io/v2
```

としてやれば良い。
MacOS Sierra で nokogiri-1.7.1のインストールに失敗

# エラー発生
Rails new したら、

```
$rails new hoge
 .
 .
 .
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
 .
 .
 .
xmlIO.c:1450:52: error: use of undeclared identifier 'LZMA_OK'
    ret =  (__libxml2_xzclose((xzFile) context) == LZMA_OK ) ? 0 : -1;
                                                   ^
1 error generated.
make[2]: *** [xmlIO.lo] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2
========================================================================
*** extconf.rb failed ***
 .
 .
 .
An error occurred while installing nokogiri (1.7.1), and Bundler cannot
continue.
Make sure that `gem install nokogiri -v '1.7.1'` succeeds before bundling.
         run  bundle exec spring binstub --all
* bin/rake: spring inserted
* bin/rails: spring inserted
$
```

こんなんでました。nokogiriのバージョンが新しくなってインストールしてみたけど失敗したらしい。
色々やって。

# 結論

```
$brew unlink xz
$gem install nokogiri -v '1.7.1'
```
ののちに

```
$rails new hoge
```

で成功。

#環境

MacOS Sierra
rails 5.0.2
gpsdでGPSモジュールの測定周期を10Hzに変更する

GPS10Hz化計画ですが、gpsdの起動後にgpsctlで10Hz化することに成功しました。
gpsdのソース書き換えと再コンパイルが必要になります。

まずgitでソースを取ってきます。aptを使った方法は[前回の記事](http://qiita.com/snz/items/624544d508867e6473c2)の@mt08さんのコメントを御覧ください。(@mt08さんありがとうございました)

```bash:
$ git clone https://git.savannah.gnu.org/git/gpsd.git
```
drivers.cを書き換えます。ifdef部分のコードを変更しています。

```c:drivers.c
static bool mtk3301_rate_switcher(struct gps_device_t *session, double rate)
{
    char buf[78];

    unsigned int milliseconds = (unsigned int)(1000 * rate);
    if (rate > 1)
    milliseconds = 1000;

#ifdef MTK3339_ENABLE
    else if (rate < 0.1)
       milliseconds = 100;
#else
    else if (rate < 0.2)
    milliseconds = 200;
#endif /* MTK3339_ENABLE */

    (void)snprintf(buf, sizeof(buf), "$PMTK300,%u,0,0,0,0", milliseconds);
    (void)nmea_send(session, buf);  /* Fix interval */
    return true;
}
```

もう一箇所

```c:drivers.c
const struct gps_type_t driver_mtk3301 = {
.
.
.
#ifdef MTK3339_ENABLE
    .min_cycle      = 0.1,      /* max 10Hz */
#else
    .min_cycle      = 0.2,      /* max 5Hz */
#endif /* MTK3339_ENABLE */
.
.
.
```

SConstructのMTK3301の下辺りにMTK3339を追加します。

```:SConstruct
.
.
.
     ("itrax",         True,  "iTrax hardware support"),
     ("mtk3301",       True,  "MTK-3301 support"),
     ("mtk3339",       True,  "MTK-3339 support"),
     ("navcom",        True,  "Navcom NCT support"),
.
.
.
```

コンパイルします。

```bash:
$ scons
```

「systemctl stop gpsd」した後、作ったgpsdを元のgpsdコマンドと置き換え、「systemctl start gpsd」します。その後、

```bash:
$ gpsctl -c 0.1
```
で10Hzで動かすことができました。

余談
調べていると、「GPSなんて5Hzもあれば十分」のような議論(?)が所々で見られました。物理、数学的に5Hz以上は意味が無いのでしょうか？
そうでなければ今後GPSが高精度化するに従って、10Hzどころか100Hz～の需要も出てくると思うのですが。
2018年には次世代GPS(GPSという名前が受け継がれるか不明)が運用開始され、位置情報誤差が数cmとなるようなので、使い方が広がりますね。
なぜビットコインの承認時間は、平均10分なのか?

以下に移行しました<br><a href="http://block-chain.jp/tech/bitcoin-10-minutes/" title="なぜビットコインの承認時間は、平均10分なのか?">なぜビットコインの承認時間は、平均10分なのか?</a>
【Laravel】ffmpegで動画ファイルからサムネイル画像を取得してS3にアップロードする方法

# 概要
* ユーザが動画ファイルをアップロードしてサイトで表示するようなサービスで、その動画のサムネイル画像を自動で指定したいときってありませんか？
* そういう時、いちいち動画の中からサムネイル用画像を切り出すのってめんどくさいですよね
* そこでFFMpegを使って、動画の1フレーム目を自動的に画像として取り出して、サーバにアップロードする機能を実装しました

# FFmpegのインストール
[FFmpeg](https://ffmpeg.org/)とは、動画や音声の変換や合成などの処理が可能なオープンソースのソフトウェアです。

インストール方法は下記の公式サイトで詳しく説明されているため、そこを参考にインストールしてみてください。
https://trac.ffmpeg.org/wiki/CompilationGuide

ちなみに自分はCentOS6系にインストールしたかったので、下記の記事を参考にさせていただきました。
[CentOS6.xにFFmpegをインストールする - Code Life](http://blog.code-life.net/blog/2013/04/14/how-to-install-ffmpeg-on-centos6-x86-64/)

インストールが終わると、ターミナルなどから`ffmpeg -version`のコマンドを実行して、きちんとインストールされたかどうかを確かめましょう。

# Laravel FFMpegのインストール

インストールが終わったら、次はLaravelで使うための準備です。LaravelからFFmpegを使うためには、[PHP-FFMpeg](https://github.com/PHP-FFMpeg/PHP-FFMpeg)のラッパーライブラリである[Laravel-FFMpeg](https://github.com/pascalbaljetmedia/laravel-ffmpeg)をインストールします。

ちなみにこのライブラリは、**Laravel 5.1以上**かつ**PHP 7.0, 7.1**のみで動作するそうなので、バージョンには気をつけてください。

composer.jsonに下記のように一行を追加します。

```json:composer.json
   "require": {
        "pbmedia/laravel-ffmpeg": "1.1.4"
    },
```

その後、`composer update`を実行して、ライブラリをインストールしてください。
インストール後は、config/app.phpを下記のように編集します。

```php:config/app.php

'providers' => [
    ...
    Pbmedia\LaravelFFMpeg\FFMpegServiceProvider::class,
    ...
];

'aliases' => [
    ...
    'FFMpeg' => Pbmedia\LaravelFFMpeg\FFMpegFacade::class
    ...
];
```

# サムネイル画像の取得方法

これで準備は整ったので、あとは実装です！
基本的にライブラリの使い方は、GitHubのREADME.mdをみればわかるのですが、例えば、ローカルに保存した動画ファイルから、サムネイル画像を自動で取得し、S3にアップロードする処理を実装しようとすると、下記のようになります。

```php:app/Http/Controllers/VideoController.php
<?php
namespace App\Http\Controllers;

use FFMpeg;

    public function upload_video()
    {
        // ローカルにある動画ファイルからサムネイル画像を取得し、S3にアップロード
        FFMpeg::fromDisk('local')
            ->open($file) // ローカル(storage/app)に保存したファイル名を指定
            ->getFrameFromSeconds(1)
            ->export()
            ->toDisk('s3')
            ->save('temp/thumbnail.jpg');
    }
```

`getFrameFromSeconds(1)`というのが、「動画の1フレーム目」を表しています。
これで簡単にサムネイル画像の取得とアップロードが実装できちゃいます。
他にも動画の形式の変換や、音声ファイルの変換もできるようなので、ぜひLaravelで実装したい方はお試しください。
Hyperledger Fabric v0.6 スターターキットのセットアップ

下に移行しました<br><a href="http://block-chain.jp/tech/hyperledger-fabric-v0-6-%e3%82%b9%e3%82%bf%e3%83%bc%e3%82%bf%e3%83%bc%e3%82%ad%e3%83%83%e3%83%88%e3%81%ae%e3%82%bb%e3%83%83%e3%83%88%e3%82%a2%e3%83%83%e3%83%95%e3%82%9a/" title="Hyperledger Fabric v0.6 スターターキットのセットアップ">Hyperledger Fabric v0.6 スターターキットのセットアップ</a>
Tensorflow XLAによる高速化、メモリ効率化、サイズの最適化によるポータビリティ向上について

# この記事を読む方へ

英語ができる方は下記の資料の方がオススメです。

[TensorFlow w/XLA:TensorFlow, Compiled!](https://autodiff-workshop.github.io/slides/JeffDean.pdf)

Tensorflowをもっと高速化やメモリの効率化、サイズの最適化をしてみたい方向けです。

XLAの利点は大きく5個あります。

- 実行スピードの高速化
- メモリの効率化
- カスタムされた操作の依存性の除去
- モバイルのフットプリントを除去
- ポータビリティの向上

ただしXLA自体が実験的な状態な点と状況によってはスピードが下がると言われているのでこの点を考慮して実際に性能を測りながら使用する方が良いと思います。


# XLAがどのように動作するか

![Screenshot from 2017-03-21 05:02:15.png](https://qiita-image-store.s3.amazonaws.com/0/10496/79f4fcf5-b9ed-5fb0-a2c8-f4923eb855dd.png)


- HLO（High Level Optimizet）によってターゲット環境とは独立して最適化
    - 操作の融合
    - バッファーの解析
    - メモリーの実行時間の配分（計算時間に依存）
- HLOによってターゲットに適した最適化を行う。
    - 特にGPUの場合は操作の融合は計算の際のパーティションの区切り方を決める際に有用で操作もしく組み合わせによってライブラリの呼び方が変わる。
- ターゲットに依存したコードの生成を行う。
    - LLVMをLow Level IRのために使用して最適化されたコードの生成を行う

# なぜ早くなるか

従来は左側の構成のため、マシーンごとに最適化できていませんがXLAを使用することによってマシーンごとに最適化をしています。その最適化にJITを使用しています。

![Screenshot from 2017-03-21 05:56:00.png](https://qiita-image-store.s3.amazonaws.com/0/10496/89b46857-2819-68af-069a-9c223c8d6809.png)


## JITとは

Just in Time compilationの略で下記のような特徴があります。

- 実行時にビルド
- コンパイル時のオーバーヘッドが少ない

詳細は下記

https://en.wikipedia.org/wiki/Just-in-time_compilation#Overview


# 実際にどれくらい早くなるか

MNIST: GPU

学習速度：30％アップ
予測速度：20％アップ

![Screenshot from 2017-03-21 06:04:05.png](https://qiita-image-store.s3.amazonaws.com/0/10496/72a55eae-ba9b-4752-7ca2-8ae481d9953e.png)

複雑なモデルのケース

Attention：　20％向上
LSTM: 20％向上

![Screenshot from 2017-03-21 06:05:53.png](https://qiita-image-store.s3.amazonaws.com/0/10496/d3e42496-e219-8128-96e4-f4425e458d68.png)

# 実際に使うには

## ソースからのビルド

実験段階なのでXLAを有効にするにはソースからビルドする必要があります。
詳しくは下記をご覧下さい。

https://www.tensorflow.org/install/install_sources

configureの際に下記の質問に`y`にして答える必要があります。

```
Do you wish to build TensorFlow with the XLA just-in-time compiler (experimental)? [y/N]
```

##使用方法

### セッション全体での使用

```
# Config to turn on JIT compilation
config = tf.ConfigProto()
config.graph_options.optimizer_options.global_jit_level = tf.OptimizerOptions.ON_1

sess = tf.Session(config=config)

```

### 一部で適用

```
    jit_scope = tf.contrib.compiler.jit.experimental_jit_scope

    x = tf.placeholder(np.float32)
    with jit_scope():
      y = tf.add(x, x)  # The "add" will be compiled with XLA.
```

### デバイスを指定して適用

```
with tf.device("/job:localhost/replica:0/task:0/device:XLA_GPU:0"):
  output = tf.add(input1, input2)
```

## Example のコード

[mnist_softmax_xla.py
](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax_xla.py)

# 参考

[XLA Overview ](https://www.tensorflow.org/performance/xla/)
[TensorFlow w/XLA:TensorFlow, Compiled!](https://autodiff-workshop.github.io/slides/JeffDean.pdf)
[Using JIT Compilation ](https://www.tensorflow.org/performance/xla/jit)
Ubuntu 16.04のUEFI起動Vagrant Box自動作成

# これは何？
VirtualBoxでUEFIを有効にした状態のUbuntu 16.04.xのVagrant boxをPackerで作成しました。

出来上がったビルドスクリプトは[こちら](https://bitbucket.org/poad1010/packer)

# ハマりポイント
作成するにあたって、以下の点に苦労しました。

 - インストールCDのGRUBオプションがわからなかった<br>
 `boot_command` の最後に `boot /linux` を指定する必要がある<br>
 [こんな感じ](https://bitbucket.org/poad1010/packer/src/4ef714b635a05444c73a6b7a0a468c854b1d997f/ubuntu-16.04-amd64.json?at=master&fileviewer=file-view-default#ubuntu-16.04-amd64.json-25)
 - パーティション設定がおかしくてコケる(どうおかしかったかはわかりません)
 他の方の設定を参考に修正しました。何がいけなかったのだろう？<br>
 結果、[このようになりました](https://bitbucket.org/poad1010/packer/src/4ef714b635a05444c73a6b7a0a468c854b1d997f/http/preseed.cfg?at=master&fileviewer=file-view-default#preseed.cfg-24)
技術英語 > But the walls can be breached: if you need to, ... / weathering

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2820 / 12833)

> But the walls can be breached: if you need to, ...

https://www.merriam-webster.com/dictionary/breach
> breach
verb
...
> : to break or violate (something)
> : to make a hole or opening in (something)

異なる名前空間において宣言された変数参照において、「壁」を定義している。上記の文章の続きは以下。

> you can access names in other namespaces in various ways.

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

http://ejje.weblio.jp/content/weathering
> 風化(作用)
ymlから簡単にerdを生成するyml2erdを作った

先日複数人でDB設計をしている時「erdあった方が分かりやすいから作ろう」って話になり作ろうとしたのですが簡単にerdをｼｭｯと生成するツールが見つからなかったので作りました。

[yml2erd](https://github.com/asmsuechan/yml2erd)

既存ツールとしてMySQL Workbenchなどあるにはあるのですが、作るのが面倒くさい + 作り方覚えるのが面倒くさい + 手でﾎﾟﾁﾎﾟﾁするのしんどいみたいな感じだったので自作の道を選びました。

また、Haskell製の[erd](http://www.moongift.jp/2014/11/erd-er%E5%9B%B3%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%A9%E3%82%A4%E3%83%B3%E3%83%84%E3%83%BC%E3%83%AB/)というツールもあるのですが使いこなせませんでした・・・

# インストール
まず、graphvizという描画ツールをインストールします。macなら

```
$ brew install graphviz
```

で入ります。他は[こちら](http://www.graphviz.org/Download..php)を参考にしてください。

次に、yml2erdをインストールします。

```
$ gem install yml2erd
```

これでインストールできました。

# 使い方
インストールができたら実際にerdを生成します。今回は[sample.yml](https://github.com/asmsuechan/yml2erd/blob/master/sample.yml)を使用します。

```
$ yml2erd convert sample.yml
```

これで生成されたoutput.pngがerdとなります。また、生成するファイルはパス指定できて

```
$ yml2erd convert sample.yml -o hoge.png
```

とするとhoge.pngが生成されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131581/c1396bf7-92d3-12fb-c3a5-f7314f5566f7.png)

pngだけでなくsvgでも出力できます。詳しくは[README](https://github.com/asmsuechan/yml2erd)を参照してください。

# ymlの書き方
基本的には以下の形式です。間違ってたらエラーが出ます。

```
<テーブル名>:
  columns:
    - <カラム名>: <カラムの型>
  relations:
    belongs_to:
      - <テーブル名>
    has_many:
      - <テーブル名>
```



# 参考
[rails-erd](https://github.com/voormedia/rails-erd)

http://qiita.com/rubytomato@github/items/51779135bc4b77c8c20d
http://www.graphviz.org/doc/info/shapes.html

http://qiita.com/komeiy/items/6bb8621620337e0308f4
http://karur4n.hatenablog.com/entry/2015/02/20/155411
Jupyter Notebookの本道ではないかもしれない？使い方

# はじめに
最近，Jupyter Notebook を導入し，いじっているが，とても楽しい．

仕事でも活用している．とはいっても私はプログラマではないので，「開発」とかそういう言い方はできないが，設計技術者なので簡単な数値計算は自分で主に Python3 でプログラムを作って行っている．

この際，主計算のプログラム，グラフ化のプログラム，計算理論やプログラミング上のメモなどを１ファイルに残しておけるところが，あとで見直すときに便利だし，気に入っている．

さて，今回の話題であるが，「Jupyter Notebookの本道ではないかもしれない？使い方」と題してみた．「本道ではないかもしれない」というのは，New で Python3 を選んでおきながら，全く Python を使っていないためである．やっていることは，本来 Terminal で動かしていた，GMT (Generic Mapping Tools) や ImageMagick を Jupyter Notebook から使ってしまおうというものである．
別に大したことではないが，今後の活用の可能性を広げるため，実験的に行ってみたものである．

ちなみに使用マシンは，MacBook Pro (Retina, 13-inch, Mid 2014)である．

# これまでのやり方
これまでは，GMT で作図する場合，以下のステップが必要であった．

+ テキストエディタによる GMT および ImageMagick コマンドのスクリプト作成・保存 (GMT は eps 出力しかできないので，報告書や html に貼り付けるため png に変換するところまでを含むスクリプトを作成する)
+ Terninal を立ち上げ，スクリプトを実行
+ 作成画像数が少ない場合は Preview による確認
+ 作成画像数が多い場合は html の table タグと img タグで画像を配置・表示する文書を作成し，これを実行して全体を把握
+ 必要に応じて，エディタを立ち上げ修正，気に入るまで上記ステップを繰り返す．

ここまでで，少なくとも，（１）テキストエディタ，（２）terminal，（３）Preview もしくは html（ブラウザ） と３種類のツール類を行ったり来たりしていることになる．

# Jupyter Notebook の便利な使い方
Jupyter Notebook は，コードセルに ```%%bash``` と書くと，これ以降のシェルスクリプトを実行してくれる機能がある．この機能を使って，本来 Terminal で実行していた GMT と ImageMagick のコマンドを Jupyter Notebook で実行してしまえ，というものである．
これにより，Jupyter Notebook の１ページ内ですべての作業を完結することができるはずである．

Jupyter Notebook画面のスクリーンショットを以下に示す．
なお，この記事は「使い方」に関するものなので，実際に使っているスクリプトの詳細は省略する．

### Jupyter Notebook の Code セルに GMT と eps から png に変換する ImageMagick コマンドを含むスクリプトを作成．先頭には ```%%bash``` を書いておく．
![Screenshot 2017-03-21 04.56.26.png](https://qiita-image-store.s3.amazonaws.com/0/129300/b9683842-f896-d4ec-d200-1e6e0eb52b5c.png)

### png 画像を表示する html 文書を Markdown セルに記載
![Screenshot 2017-03-21 04.56.47.png](https://qiita-image-store.s3.amazonaws.com/0/129300/d9daa362-b25a-1178-7420-4089114db74c.png)

### Code セル実行後，Markdown セルを実行し，Jupyter Notebook 上で html を表示したところ
![Screenshot 2017-03-21 04.59.26.png](https://qiita-image-store.s3.amazonaws.com/0/129300/f340d01d-fe0c-32a9-e9ad-e03f4567feff.png)
![Screenshot 2017-03-21 04.59.47.png](https://qiita-image-store.s3.amazonaws.com/0/129300/a5b3024a-c26c-3838-8f22-7c1a21ab313d.png)

# 結論
思った通りのことができた．

私の環境では，プログラム言語は Python3 しか入れていないが，Jupyter Notebook 付属の機能で，Python および Markdown (html) のみならず，Teminal 上で実行できるコマンド（少なくとも GMT と ImageMagick）は動かすことができる，すなわちプログラム・スクリプト・解説文を含む一連の作業の流れを，再現可能な形で，１ファイルに保存しておくことができることが確認できた．
ただし，今のところ，私ができるレベルまでの話であり，あまり高度なことは試せないのでわからない．

でも Jupyter Notebook，楽しい！

# （追加情報：TeXも回せます）
この記事を投稿したあと，Terminal で実行できるものは全て行けそう，ということで，TeX 文書をコンパイルし，pdf を作成してみたら，うまくいきました．
コードセルで ```%%bash``` のあとにヒアドキュメントで TeX 文書を作り，platex, dvipdfm を実行して pdf を作成する手順です．

```
%%bash
cat << EOT > tex_doc.tex
\begin{document}
......
\end{document}
EOT

platex tex_doc.tex
dvipdfmx tex_doc.dvi
```

注意点としては，表の改行につかう ```\\```（バックスラッシュ２つ）は，```\\\\ ```（バックスラッシュ４つ＋空白）としないと，TeX 文書をテキストファイルとして保存するときに，本来必要なバックスラッシュ２つの書き込みをしてくれないということです．
バックスラッシュ１つは，そのまま書き込んでくれるようです．

他にも色々試してみようと思います．

以　上
Scalaで外部コマンドを実行して標準出力とエラーを取得する

Scalaで外部コマンドの実行は`scala.sys.process`があるおかけで、Javaよりも圧倒的に簡単！

```scala
// 実行結果を取得
Process(Seq("cmd", "/c", "dir")) !
```

Javaだとめんどくさい標準出力の取得もこれだけ

```scala
Process(Seq("cmd", "/c", "dir")) !!
```

これでStringで返ってくるのでとても便利。Listでの取得もできる。
ただ、実行結果と標準出力の両方が取れなくて地味に不便。そういうときはProcessLoggerを使えば良いらしい。

で、下記がProcessLoggerを使ったサンプル。

```scala
  case class ExecResult(result: Int, out: List[String], err: List[String])

  def exec(cmd: Seq[String]) = {
    import scala.collection.mutable._
    import scala.sys.process._

    val out = ArrayBuffer[String]()
    val err = ArrayBuffer[String]()

    val logger = ProcessLogger(
      (o: String) => out += o,
      (e: String) => err += e)

    val r = Process(cmd) ! logger

    ExecResult(r, out.toList, err.toList)
  }
```

実行はこんな感じ。

```scala
exec(Seq("cmd", "/c", "dir"))
```

これで、戻り値として実行結果と標準出力/エラーが返ってくるので色々はかどります。

それではHappy Hacking!

## 参考：

- [Scala Standard Library](http://www.scala-lang.org/api/current/scala/sys/process/index.html)
- [scalaで外部コマンドを実行する](http://qiita.com/ktz47/items/02a9bf4ac363dc684a07)
- [Scala 2.9.0のscala.sys.processパッケージが便利過ぎる件について](http://kmizu.hatenablog.com/entry/20110510/1304985703)
- [Grabbing process stderr in scala](http://stackoverflow.com/questions/5563439/grabbing-process-stderr-in-scala)
[翻訳] Why Go? 

(この記事は Dave Cheney さんの [Why Go?](https://dave.cheney.net/2017/03/20/why-go) の翻訳です。)

数週間前、友人に「Goに注目に値するのはなんで？」と聞かれました。
彼は私がGoに情熱を注いでいることを知っていましたが、なぜ私が他の人もGoを気にするべきだと思っているのかを知りたいようでした。
この記事は、私がGoを重要なプログラミング言語だと考える、3つの大きな理由を紹介します。

## メモリ安全

個人としては、私もあなたもC言語でメモリリークも危険なメモリの再利用もしないプログラムを書く事ができるでしょう。しかし、40年以上の経験から、集団としてのプログラマーはC言語で信頼できるプログラムを書けない事がはっきりしています。

コードの静的解析、 valgrind, tsan (訳注: たぶん ThreadSanitizer), `-Werror` といったツールは10年以上前から使えますが、それらのツールが広く認知されているかは疑わしく、広く採用されているとは全く言えない状況です。総じて言えば、プログラマーは自分たちがメモリを安全に管理できないことを示してきました。
そろそろC言語をやめるべきです。

Go はプログラマーによる直接のメモリ管理に依存しません。すべてのメモリアロケーションは言語のランタイムにより管理され、利用前に初期化され、必要に応じて境界チェックが行われます。
もちろんGoはこの種の安全性を提供している最初の主要な言語ではありません。おそらく Java (1995) がその候補でしょう。要するに、もうメモリ安全でないプログラミング言語に需要はないので、Goはデフォルトでメモリ安全なのです。

## 開発者の生産性

1970年代にハードウェアの時間は開発者の時間よりも安価になりました。
開発者の生産性は広大なトピックですが、要点としては、どれだけの時間を有益な作業に利用することができ、どれだけの時間をコンパイラを待ったり他人のコードベースの中で迷子になることに浪費するかです。

GoはC++のプログラムのコンパイルを待っている間に開発されたという冗談があります。
それくらい高速なコンパイルはGoにとって重要な特徴であり、また新しい開発者を惹きつける点でもあります。
コンパイル速度は論争が絶えない話題ではあるものの、他のいくつかの言語でコンパイルに数分かかるものがGoだと数秒しかかからないとは言えるでしょう。

開発者の生産性にとってより重要なのは、Goプログラマーたちはコードが読まれるために書かれるのであることを知っているので、書くときのことよりも読むときのことを重要視しています。
Goはツールと慣習によって、すべてのコードが特定のスタイルでフォーマットされることを強制してきました。これによりプロジェクトごとの言語の方言による摩擦を取り除き、またミスが「間違っているように見える」ので見つけやすくなります。

解析と機械的なアシストに集中した結果、C言語のプログラマーには広く受け入れられなかったような、一般的なコーディング上のエラーを見つけるためのより多くのツールがGoプログラマーに受け入れられてきました。Goの開発者はコードをクリーンに保つためのツールを歓迎しています。

## コンカレンシー

10年以上前から、チップの設計者たちは「フリー・ランチ」の終わりを警告してきました。
安価な携帯電話から最も電力を食うサーバーに至るまで、より多くの、しかし遅いCPUコアによる並列性を、言語がサポートしている場合にだけ利用できます。
なので、今日のハードウェアで動くソフトウェアを書くのにコンカレンシーは欠かせません。

Go はOSのマルチプロセス／マルチスレッドによる並列性モデルをそのまま利用している言語の一歩先を行っています。Goは、 goroutine と呼ばれているコルーチンに基づいた軽量なコンカレンシーモデルを提供しています。
goroutine によりプログラマーは入り組んだコールバックを避けることができ、代わりに言語ランタイムがCPUのコアを利用するのに必要なだけのスレッドを利用します。

## 3つのルール

メモリ安全、生産性、コンカレンシーが、私がGoを友人に推める3つの理由です。
個々に見ていけば、これらのうち1つか2つを満たす言語はいくつかありますが、3つすべてを持っていることが、Goを今日における多くのプログラマーに取って素晴らしい選択肢にしています。
[]byte型をuint・int・stringに相互変換するヘルパー関数

はじめに
--------------------

- いつもの通り、備忘録的めもです
- ビット・バイトのエンディアンに注意
- 気になるとことかあればコメントにて

コード
--------------------

```go
package helpers

import (
	"encoding/binary"
	"fmt"
	"strconv"
	"strings"
)

// Str2bytes converts string("00 00 00 00 00 00 00 00") to []byte
func Str2bytes(str string) []byte {
	bytes := make([]byte, 8)
	for i, e := range strings.Fields(str) {
		b, _ := strconv.ParseUint(e, 16, 64)
		bytes[i] = byte(b)
	}
	return bytes
}

// Bytes2str converts []byte to string("00 00 00 00 00 00 00 00")
func Bytes2str(bytes ...byte) string {
	strs := []string{}
	for _, b := range bytes {
		strs = append(strs, fmt.Sprintf("%02x", b))
	}
	return strings.Join(strs, " ")
}

// Bytes2uint converts []byte to uint64
func Bytes2uint(bytes ...byte) uint64 {
	padding := make([]byte, 8-len(bytes))
	i := binary.BigEndian.Uint64(append(padding, bytes...))
	return i
}

// Uint2bytes converts uint64 to []byte
func Uint2bytes(i uint64, size int) []byte {
	bytes := make([]byte, 8)
	binary.BigEndian.PutUint64(bytes, i)
	return bytes[8-size : 8]
}

// Bytes2int converts []byte to int64
func Bytes2int(bytes ...byte) int64 {
	if 0x7f < bytes[0] {
		mask := uint64(1<<uint(len(bytes)*8-1) - 1)

		bytes[0] &= 0x7f
		i := Bytes2uint(bytes...)
		i = (^i + 1) & mask
		return int64(-i)

	} else {
		i := Bytes2uint(bytes...)
		return int64(i)
	}
}

// Int2bytes converts int to []byte
func Int2bytes(i int, size int) []byte {
	var ui uint64
	if 0 < i {
		ui = uint64(i)
	} else {
		ui = (^uint64(-i) + 1)
	}
	return Uint2bytes(ui, size)
}
```
ionic Error　まとめ

# IonicでAndroid用のapkビルド時に発生するERROR時の対処法
プラグインによるバージョンが原因らしく、以下のエラーが発生することがある。
その場合の対処法。

```
Error:(20, 1) A problem occurred evaluating root project 'android'.
  > Failed to apply plugin [id 'com.android.application']
  > Minimum supported Gradle version is 3.3. Current version is 2.14.1. If using the gradle wrapper,
  try editing the distributionUrl in /< App Pash >/platforms/android/gradle/wrapper/gradle-wrapper.properties to gradle-3.3-all.zip

```

下のfile内を書き換える。

```
  > /< App Pash >/platforms/android/cordova/lib/builders/GradleBuilder.js

...
// var distributionUrl = process.env['CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL'] || 'https\\://services.gradle.org/distributions/gradle-2.14.1-all.zip';
   var distributionUrl = process.env['CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL'] || 'https\\://services.gradle.org/distributions/gradle-3.3-all.zip';
...

```

※今後対処したエラーがあれば追加する予定。


## 参照記事 Link

参照した記事: [CordovaでGradleのバージョンが低いと怒られた][link01]

[link01]:http://qiita.com/mana-bin/items/eaa0c2c2335140e3f707
pollyを介して日本語を話すalexa skillのサンプル

# Alexa + pollyのサンプル
Alexaはまだ日本語の聴く話すはできない。pollyを挟んで、日本語を話させてみた。

https://github.com/khwada/alexa_polly_sample


## 作ったCustom Skill
"what's the date today?"と質問すると、"2017年3月21日です。"と答える。引き続いて、"what day?"と尋ねると、"火曜日です。"と答える。

![alexa.PNG](https://qiita-image-store.s3.amazonaws.com/0/124221/3753be5e-8474-6f86-b731-932f9bd93950.png)


## Alexa
### 概要
Lambdaを利用して、Alexa Skillを実装。

ユーザがAlexaに話しかけると、Alexaが音声認識＋自然言語処理をして、IntentとSlotsをlambdaに渡してくれる。

Intentが各イベントに相当。IntentごとのサンプルのUtterance（発話）を事前登録し（複数の言い回しを登録可能）、ユーザ入力をIntentに紐づける。発話の揺れはAlexaが吸収してくれる。

SlotsはIntent中の変数に相当。

下記では、AskIntent、DaysOfWeekIntentの２つのIntentを用意している。{Date}の部分が、Slots。

```SampleUtterances.txt
AskIntent what's the date {Date}
AskIntent what is {Date} date

DaysOfWeekIntent what day

AMAZON.StopIntent good bye
AMAZON.StopIntent see you
AMAZON.StopIntent stop
```

IntentSchemaは下記のように登録する。

```IntentSchema.json
{
  "intents": [
    {
      "intent": "AskIntent",
      "slots": [
        {
          "name": "Date",
          "type": "AMAZON.DATE"
        }
      ]
    },
    {
      "intent": "DaysOfWeekIntent",
      "slots": []
    },
    {
      "intent": "AMAZON.ResumeIntent"
    },
    {
      "intent": "AMAZON.PauseIntent"
    },
    {
      "intent": "AMAZON.StopIntent"
    }
  ]
}
```

backendとなるlambda側で、Intentごとに分岐して、処理を実装する。英語であれば、lambdaの返却xmlにテキストを入れておけば、Alexaが発話してくれる。

なお、lambda側から返却するjsonにSessionAttributeとして定義することで、同一session内で文脈を引き回すことができる。今回は、"what's the date today?"と聞くと、日付をsessionAttributeに格納し、次に"what day?"と質問すると、最初に答えた日付の曜日を回答する。


### 手順
https://github.com/khwada/alexa_polly_sample

- lambda functionを用意
  + バージニアに作る
  + トリガーは「Alexa Skills Kit」
  + lambda_function.pyの内容をコピー 
- Alexa Skillを登録
  + https://developer.amazon.com/edw/home.html#/ より登録
    - Invocation Nameが、Skillを起動するときの名前となる。（例： Date Respondent）
  + IntentSchemaを登録（slotsもこの中で定義）
  - intentSchema.jsonの内容をコピー
  + SampleUtteranceを登録
    - SampleUtterances.txtの内容をコピー
  + エンドポイントに用意してlambdaのARNを登録
- テスト
  + Developer Consoleからテスト可能
  + 入力jsonをコピーして、lambdaを直接テストすることも可能
- Alexa Appに登録。
    - http://alexa.amazon.com/spa/index.html#skills
    - your skillで作成したskillを登録
- シミューレタによるテスト
  + echosim（echoのシミュュレータ）を利用して、skillを使ってみることができる。
  + https://echosim.io
  + Tell Date Respondent what's the date today
  + Alexa App側に、カードとして発話内容が記録される。 http://alexa.amazon.com/spa/index.html#cards


## polly
### 概要
テキストを音声に変換可能。日本語にも対応済。（日本語のvoiceは現状"Mizuki"のみ）

lambdaの戻りの中のSSML（Speech Synthesis Markup Language）の中でmp3を利用可能。返却する日本語テキストをpollyを利用して音声のmp3ファイルに変換し、S3にアップしておくことで、Alexaは日本語を話すことが可能となる。

### 手順
- s3 bucketを用意
  + regionは、US standardに作成
  + アクセス許可 -> バケットポリシーの変更で、すべてのユーザがget可能にしておく

```
{
	"Version": "2012-10-17",
	"Statement": [
		{
			"Sid": "AddPerm",
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::{bucket_name}/*"
		}
	]
}
```
- lambda functionを用意
  + lambda_function_2.py
  + lambda/s3/pollyに権限をもったrollを付与する
  + 環境変数として、key:"AUDIO_BUCKET"に、作成したs3 bucketの名前を設定する
  + 本来は、polly変換結果の音声ファイルのキャッシュや、内容によっては音声ファイルのアクセス制御などが必要と考えられるが、考慮していない
- Alexa SkillのlambdaのARNを、新たに作成したlambdaのARNに変更して、同様にテストを実施
  + 日本語で返答が返ってくる
Go の json は tag を間違えるとハマる

Go をちびちびと勉強中にハマったので備忘録

## Go は json タグの ダブルクォート `"` が超重要

ダブルクォートが抜けていると何故か文字列のパースはできてるのに数値が全部 0 リセットされた状態になる。
もうちょい条件がある気もするけど一旦は割愛

なぜ文字列はパースできているのかが最も謎。

json tag の[ドキュメントはここ](https://golang.org/pkg/encoding/json/#Marshal)

```go
package main
import (
    "bytes"
    "log"
    "json"
)
/**
 * この json tag のダブルクォート、超重要
 */
type User struct {
    Id        int    `json:"id"`
    Name      string `json:"name"`
    Following int    `json:"following"`
    Followers int    `json:"followers"`
    Unreads   int    `json:"unreads"`
    CreatedAt int    `json:"created_at"`
}
func main() {
    var buf *bytes.Buffer //ここに json データが入るとしよう
    /**
     * 簡単のため、色々と省略
     */
    var user User
    err := json.Unmarshal(buf, &user)
    if err != nil {
        log.Fatal(err)
    }
    println(user)
}
```

ここをダブルクォート `"` 抜きで書いちゃうと

```go
type User struct {
    Id        int    `json:id`
    Name      string `json:name`
    Following int    `json:following`
    Followers int    `json:followers`
    Unreads   int    `json:unreads`
    CreatedAt int    `json:created_at`
}
```

こんな事になる

```bash
# With double quote
$ go run main.go
{ 1234 username 23 17 0 1490027932013 }

# Without double quote
$ go run main.go
{ 0 username 0 0 0 0 }
```
ImageMagick7系だとrmagickが入らない

Can't install RMagick 2.16.0. Can't find MagickWand.h.


An error occurred while installing rmagick (2.16.0), and Bundler cannot continue.
Make sure that `gem install rmagick -v '2.16.0'` succeeds before bundling.

こんな感じで怒られてはまりました。

http://kno75.hatenablog.com/entry/2017/01/21/215709


原因はこれでした。
「素晴らしい」サービスを作るのには（記事途中）

#はじめに
<a hare="https://www.buckmoon.co.jp" target="_blank">Buckmoon Inc.</a>
会社をたてました。
とりあえず何も成してはいないが、CTOになったので何か書きたいと思いました。
まず「素晴らしい」サービスの定義から
#「素晴らしい」サービスの定義
###1. 稼げる事
まずは稼げる事。どんなに良いサービスでも稼げないことには、作り手は疲弊し、サービスの品質は落ち、もっと稼げなくなってサービスは消えます。「何をするにも余裕から」と、どこかの尊敬する社会学者さんは言ってました。大げさに言うとユーザーの役に立たなくても、まず稼ぐことが大切（資金調達も1つの手、アメリカはそれが当たり前。日本は難しい）

###2. 役に立つ事
これはサービスとしての本質です。
・時間削減
・コスト削減
・やる気増幅
・ect
Google Mapsを使えば、現時点から目的地までの最短経路をおしえてくれ行くまでの時間を短縮してくれます。AWSなどのクラウドサービスを使えば、自社でオンプレミスで初期投資して人件費をかけて保守するよりも、高い確率で低コストのシステム構成を考え実現することができます。一種のソーシャルゲームなどはその人のモーチベーションを高めてくれるでしょう。これらサービスの本質がよければ「素晴らしい」サービスと言えるでしょう。

###3. 継続する事
1も継続性の一つではありますが、別の視点で。サービスと言っても色々ありますが、この先の未来を予想して、運用しているサービスが未来に残る可能性を考えることが継続性に繋がります。AIが発達して、4割の仕事を奪うと言われてますが、個人的に本当の話だと思います。AIでなくても効率化とは仕事を簡単にする、逆を返せば奪うということです。無駄大国と言われている日本ではサービスが発達しても、まだその心配はないと思いますが。
（どっかの売り言葉で具体的に話せないので違かったら申し訳ないです）
仕事を奪う側のサービスなのか、奪われる側のサービスかなのかは見極めないといけないです。

---
結局のところ1,2,3ともクリアしないと「素晴らしい」サービスとは言えないでしょう。
本題である、「素晴らしい」サービスを作るのに必要な事はまた後日一生懸命考えて書きます。
GPSモジュールの測定周期を10Hzに変更できたが gpsdを起動すると1Hzに戻される

引き続きGPSの測定周期を10Hz化しようとしています。
とりあえずシリアル通信で10Hz化することはできました。

以下のようなコマンドでGPSの10Hz化とシリアル通信速度の115200bps化ができます。USBでGPSモジュールを接続している場合はttyS0をttyUSB0等に置き換えます。
なお、PMTKコマンドについて詳しくは[こちら](https://cdn-shop.adafruit.com/datasheets/PMTK_A11.pdf)等に書いてあります。チェックサムは[計算してくれるサイト](http://www.hhhh.org/wiml/proj/nmeaxor.html)があるので、そこで算出できます。

```bash:
$ echo -e "\$PMTK220,100*2F\r\n" > /dev/ttyS0
$ echo -e "\$PMTK300,100,0,0,0,0*2C\r\n" > /dev/ttyS0
$ echo -e "\$PMTK251,115200*1F\r\n" > /dev/ttyS0
```

本体側の通信速度も115200bps化します。

```bash:
$ stty -F /dev/ttyS0 115200
```

上記を/etc/rc.localに記載すると起動時に自動で10Hzで立ち上げることができます。


```bash:
$ cat /dev/ttyS0
```
とすると、0.1秒周期で位置情報がだーっと流れるのを見ることができます。プログラムからは標準ストリームとして開けば良いでしょう。


ここまでは良いのですが、ntp同期なども考えてgpsdを起動したところ、周期が1Hzに戻ってしまいました。下記コマンドで5Hzに再設定できましたが、10Hzには設定できません。

```bash:
$ gpsctl -c 0.2
```

現在drivers.cにおいて5Hz以上をはじく処理を見つけておりますが、良い感じに修正できるか検討中です。
また、できればgpsdの起動時に10Hzで起動したいところです。
Cpputestのマルチプラットホーム環境構築からチュートリアルまで

# CppUTest環境のマルチプラットホーム環境構築からチュートリアルまで
2017年3月版
## 課題
組み込みC言語の世界でもTDDできるらしい
というかレガシーコードをテストする環境だけでも切実に欲しい。。。  
そんなときCppUTestなるフレームワークがオススメと[偉い人](https://www.amazon.co.jp/dp/toc/4873116147)が言っていた  
ついでに職場の環境もついにwindows10に移行したしこのタイミングで色々やっときたい
当然ながら自分のMacとマルチプラットホームに対応してくれないと困る  
windowsは特に環境構築がめんどうなので手探りで進めることに。。。
というかCppUTestの日本語情報って少ないですね  

## 各種ソフトのバージョン
- windows10 64bit  
	- cygwin 2.7.0
		- autoconf 2.69
		- automake 1.9.6
		- cmake 3.6.2
		- gcc-core 6.3.0
		- gcc-g++ 6.3.0
		- gdb 7.10.1
		- git 2.8.3
		- libtool 2.4.6
		- make 4.2.1
	- CppUTest 3.8

- macOS sierra 10.12.3
	- xcode 8.2.1
	- CppUTest 3.8

ちなみにIDEはCLion 2016.3.3を使っています
マルチプラットホームにも対応しててよい感じ

## windows10環境の構築
1. 64bit版cygwinを導入 (32bit版でもいいのかもしれない)
	- install from internet
	- Root Directory はデフォルトで (C:¥cygwin64)
	- local package はお好きにどうぞ
	- Direct Connection
	- Download sites は日本のサーバーを選ぶのが良いのでは (hogehoge.jpを探そう)
	- select packageで上記した環境を構築すること
2. githubからCppUTestをcloneする
	- お好きなディレクトリを選んでどうぞ
	- 以下、CppUTestのディレクトリを\<CppUTest>と表記します
3. cygwinでCppUTestをビルドする
	とりあえず以下のコマンドをうてばOK  

	```sh
	cd <CppUTest>/cpputest_build
	../configure
	make
	```
	
	そのまま以下のコマンドをうてばきちんとインストールできたか確認できる  
	
	```sh
	make tdd
	```
	
	テストが実行されてpassしたりignoreしたりするはず  
	うまくインストールできていたら環境変数を設定しておくと良い  
	
	```sh
	CPPUTEST_HOME=<CppUTest>  
	```
	
	なんならスクリプトもインストールしておくと良い  
	
	```sh
	cd <CppUTest>/scripts
	chmod u+x *.sh
	./InstallScripts.sh
	```

4. CppUTestのバグ？に対応  
	[チュートリアル](https://github.com/davisford/cmake-cpputest)を拾ってきてビルドしてみるが。。。  

	こんな感じで試してみる  

	```sh
	git clone https://github.com/davisford/cmake-cpputest
	cd cmake-cpputest
	mkdir build
	cd build
	cmake ..
	make
	```

	**そのまま適当にチュートリアルサンプルを拾ってきてmakeしても通らないっぽい！！！**  

	’\<CppUTest>/src/CppUTest/libCppUTest.a'をmakeするルールがないとかでエラーになる  
	ライブラリファイルをきちんとしたディレクトリにコピーできてないっぽい  

	**\<CppUTest>/cpputest_build/lib** にある  

	**libCppUTest.a**
	**libCppUTestExt.a**  

	を**\<CppUTest>/src/CppUTest** にコピーしてから上記のコマンドを実行。。。  
	晴れてmakeできるようになりました  

## mac環境の構築
Homebrewでインストールできるらしいけどgitでやっちゃいました  
git clone以下windowsと同様にするだけでよい  

> **\<CppUTest>/cpputest_build/lib** にある
> 
> **libCppUTest.a**
> **libCppUTestExt.a**
> 
> を**\<CppUTest>/src/CppUTest** にコピー

を忘れないこと  

## おまけ：CLion環境の構築
macは特別なことは何もしないでいい
windowsもcygwinさえ設定すればいい  
上記のチュートリアルサンプルをCLionで開くとcmakeのバージョン違いのために警告が出るが、ビルドに問題はない  
CLionであればbuildのconfigでProgram argumentsに-vを追加しておくとテスト結果が常に見られて捗る  

## まとめ
とりあえず自分がcygwin導入からCppUTest環境構築まで一気通貫の日本語解説を欲しいと思ったので  
ここまでやればでスタート地点には立てるのでは  
今はひとまず手探りで英語と戦いながらゴリゴリとテストを書いております  

## 参考文献
- [テスト駆動開発による組み込みプログラミング](https://www.amazon.co.jp/dp/toc/4873116147)
- [Cpputest](https://cpputest.github.io/index.html)
- [cppUTest のインストール](http://qiita.com/Paragraph_14/items/c83362266003ad5a5079)
- [No rule to make target `../lib/Gcc/libCppUTest.a](https://groups.google.com/forum/#!topic/cpputest/sR6f9gj5Z5w)
USBメモリにLinuxをインストールする

# はじめに

「USBメモリにLinuxをインストールする」とした場合、多くはUSBメモリでLive CDを起動することを意味している。
しかし、Live CDの多くは日本語が使用できず、作成したファイルが保存できないので大変不便である。
そこで、真にLinuxがインストールされたUSBメモリを作成しようと考えた。

# Live CDをUSBメモリで起動する方法

USBメモリにLinuxをインストールするには、ドライバが充実しているLive CDを使用するのが便利である。
今回、DVDメディアがない代わりに8GBのUSBメモリが2本あったので、1つはLive CDを起動するために使用した。
Windows上でLive CDをUSBメモリに入れるためには[Universal USB Installer 1.9.7.4](https://universal-usb-installer.jp.uptodown.com/windows)を使用すると良い。
使い方はとても簡単なので、ここでは敢えて使い方を説明しない。

※[UNetbootin 625](https://unetbootin.github.io/)も使って見たが、作成されたUSBメモリでは起動しなかった。

# LinuxをUSBメモリにインストール

Live CDで起動したLinuxから実行するインストーラでは、通常HDDをインストール先としているが、手動でインストール先にUSBメモリを指定すれば、簡単にLinuxをUSBメモリにインストールすることができる。
今回、[Ubuntu MATE 16.04.2 LTS](http://cdimage.ubuntu.com/ubuntu-mate/releases/16.04.2/release/ubuntu-mate-16.04.2-desktop-amd64.iso)と[CentOS Live GNOME 7.3.1611](http://ftp.iij.ad.jp/pub/linux/centos/7.3.1611/isos/x86_64/CentOS-7-x86_64-LiveGNOME-1611.iso)を試したが、どちらも1時間ほどでUSBメモリにインストールすることができた。

実際のLive CD起動時はHDDが/dev/sda、Live CDを起動したUSBメモリが/dev/sdb、インストール先のUSBメモリが/dev/sdcにマッピングされたので、Linuxのインストール先として/dev/sdcを選択した。
間違ってHDDをインストール先に指定してしまい、大事なパーティション（ボリューム）が失われないように注意しなければならない。

なお、Ubuntu MATEをインストールするときに、インストールと同時に更新するオプションを設定すると、8GBのUSBメモリでは容量不足となるので、更新はインストール後に行う必要がある。

# おわりに

使用したUSBメモリはあまり速いものではなかったので、操作中は何かと待たされることが多かった。
ストレスなくUSBメモリでLinuxを運用するには、できるだけ速いものを使う必要があると思う。
Emacs Tramp Mode使い方（port指定＋sudo権限）

正直よくわかっていないが，どうやらemacsには`tramp-mode`という
**remote server上のファイルをlocalで（にあるかのように）編集できる機能**
があるらしいので，さっそく試してみた．

いくつかつまづいたポイントがあるので，メモ書き程度に残しておく．

## 使い方
`C-x C-f /ssh:user1@hostname1:path/to/file`
でremoteにあるファイルにアクセスできる

以下はそのときの`~/.ssh/config`

````
host user
	 HostName hostname1
	 User user1
````

## Portの指定
ここがちょっとつまづいたところ.
port番号を指定してsshする場合などはこれが必要になる．
`C-x C-f /ssh:user2@hostname2#22:path/to/file`
HostNameのあとにport番号（#22）を指定するのがミソ

以下はそのときの`~/.ssh/config`

````
host user
	 HostName hostname2
	 User user2
     Port 22
````

## sudo権限で実行
ここがさらにつまづいたところ.
例えば，`/etc/`以下のファイルなどをいじるときはこれが必要になる．
`C-x C-f /ssh:user3@hostname3|sudo:hostname3:path/to/file`
`|sudo:hostname3`がミソ

## port指定+sudo権限
最終的に，自分のsudo権限が必要なファイルにport番号指定してアクセスするのは，
`C-x C-f /ssh:user4@hostname4#44|sudo:hostname4:path/to/file`
でいける．

以下はそのときの`~/.ssh/config`

````
host user
	 HostName hostname4
	 User user4
     Port 44
````

## 参考にさせていただいた記事

[Tramp でポート指定する方法](http://qiita.com/biwakonbu/items/1e4899ccb8f91cb69ff4)
[[Emacs] tramp-modeが便利](http://qiita.com/maueki/items/dac0aa68e3499fb46f26)
Visual Studioのメモリウィンドウがこんなに使いやすいなんて知らなかった

## Before

ブレークポイントで止めて、メモリのウィンドウを開いて、、、、ここまではいいんですけど、ここからが長かったんです、、
まず、調べたいポインタにマウスを当てて表示されたポインタをコピーして、ウォッチウィンドウのアドレスにペーストしてエンター。。
ウォッチウィンドウの値からコピペするときなんて、変な文字列が付いてきて死にたくなっていました。。

![before1.gif](https://qiita-image-store.s3.amazonaws.com/0/36728/b0053da0-d21c-3e69-3bc1-94988ef20890.gif)

## After

### アドレスの数値だけじゃなくて式を入れてもいいんですよ

アドレスとして評価されるポインター式を入力してエンターすると、勝手に値に変換してくれるんです。
![after1-2.gif](https://qiita-image-store.s3.amazonaws.com/0/36728/fc34d8f9-5366-e0b3-c4d9-4f58015a0aa9.gif)


### ドラッグ＆ドロップで入力できるんですよ

ダブルクリックでポインタ変数を選択して、メモリウィンドウにドラッグ&ドロップするだけでもいいんです。まじやばくね。
![after2.gif](https://qiita-image-store.s3.amazonaws.com/0/36728/2b57aa36-4cd7-3d82-1747-30cfb53d1944.gif)

### ポインタの追跡もできるんですよ（ライブ式）

ポインター式を入力して、右側のリフレッシュアイコン（自動的に再評価ボタン）を選択した状態でデバッグすると、アドレスが勝手に更新されるんです。
![after3.gif](https://qiita-image-store.s3.amazonaws.com/0/36728/53ebff53-201d-6535-a047-aeb588597d3f.gif)


## あとがき

最近、VSでCUDAを使っているのですが、ホスト側のメモリとか、デバイス側のメモリとか確認しながらやっています。もちろん上の内容はCUDAのデバッグでも使えます。GPU上のメモリも同じ感じで確認できます。

元ネタはMSDNのこちらのページですが、読んだだけではよくわからんでしたのでGIFってみました笑
https://msdn.microsoft.com/ja-jp/library/s3aw423e.aspx
ツール開発者さん的にはライブ式がおすすめみたいですね。
【エディタ拡張】カメラ一覧（CameraChecker）


カメラを複数使うときに、どのカメラを使用しているか分かりやすいようにしてみました。

![image](https://qiita-image-store.s3.amazonaws.com/0/30731/ea047dd4-47b7-8f37-f718-66256c17f05d.png)

```csharp:Assets/Editor/CameraChecker.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class CameraChecker {

	public class CameraComparer : IComparer
	{
		public int Compare(object x, object y) {
			Camera c1 = x as Camera;
			Camera c2 = y as Camera;
			if (c1 == null && c2 == null) {
				return 0;
			}
			if (c1 == null) {
				return -1;
			}
			if (c2 == null) {
				return 1;
			}
			return c1.depth.CompareTo (c2.depth);
		}
	}

	public class BackgroundColorScope : GUI.Scope
	{
		private readonly Color color;
		public BackgroundColorScope(Color color) {
			this.color = GUI.backgroundColor;
			GUI.backgroundColor = color;
		}
		protected override void CloseScope() {
			GUI.backgroundColor = color;
		}
	}

	static int windowID = 1001;
	static Rect windowRect = new Rect(10, 10, 200, 100);
	static CameraComparer comp = new CameraComparer();

	[MenuItem("Tools/CameraChecker")]
	static void SwitchCameraChecker() {
		string menuPath = "Tools/CameraChecker";
		bool val = Menu.GetChecked(menuPath);
		Menu.SetChecked(menuPath, !val);
		SceneView.RepaintAll ();
	}

	[InitializeOnLoadMethod]
	static void InitCameraChecker() {
		SceneView.onSceneGUIDelegate += OnGUI;
	}

	static void OnGUI(SceneView sceneView ) {
		if (!Menu.GetChecked ("Tools/CameraChecker")) {
			return;
		}

		Handles.BeginGUI ();
		windowRect = GUILayout.Window (windowID, windowRect, WindowFunction, "CameraChecker");
		Handles.EndGUI ();
	}

	static void WindowFunction(int _windowID) {
		Camera[] cameras = Object.FindObjectsOfType<Camera> ();
		System.Array.Sort (cameras, comp);
		System.Array.Reverse (cameras);
		if (cameras != null) {
			for (int i = 0; i < cameras.Length; i++) {
				string cameraName = cameras [i].name;
				if (cameraName.Length > 10) {
					cameraName = cameraName.Substring (0, 10);
				}
				string txt = string.Format("D({0}) {1} [{2}]", cameras[i].depth, cameraName, (cameras [i].enabled ? "ON" : "OFF"));
				if (cameras [i].gameObject == Selection.activeGameObject) {
					using (new BackgroundColorScope (Color.green)) {
						if (GUILayout.Button (txt, GUILayout.Width (200))) {
							Selection.activeGameObject = cameras [i].gameObject;
						}
					}
				} else {
					if (GUILayout.Button (txt, GUILayout.Width (200))) {
						Selection.activeGameObject = cameras [i].gameObject;
					}
				}
			}
		}
		GUI.DragWindow ();
	}
}
```