OmniAICreator/Qiita-1.07M huggingface dataset:
Lumenをcentos7とphp7で環境作成する

## vagrant 取得
``` 
$ cd ~/Lumen
$ vagrant box add centos/7
$ vagrant init centos/7
$ vagrant up
$ vagrant ssh
```

## php7 install
```
$ sudo su
$ yum install epel-release
$ rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
$ yum install --enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-gd git
```

## composer install
```
$ cd ~/
$ curl -sS https://getcomposer.org/installer | php
$ mv composer.phar /usr/local/bin/composer
```

## MySQL 5.7 install
この方の記事を参考にしました。
http://qiita.com/ksugawara61/items/336ffab798e05cae4afc

## lumen install
```
$ /usr/local/bin/composer global require "laravel/lumen-installer”
$ export PATH="$PATH:~/.config/composer/vendor/bin"
$ cd /var/www/html/
$ mkdir lumen
$ cd lumen
$ lumen new site
```

## lumenインストール時のエラー
[lumen をcomposer経由でインストールしようとした時のエラー](http://qiita.com/nny-fujii/items/9aeb5db543a8cb6fb5ca)
[lumen にはzipエクステンションが必要](http://qiita.com/nny-fujii/items/4bf0ce067d24dfcaf286)
lumen をcomposer経由でインストールしようとした時のエラー

lumen をcomposer経由でインストールしようとした時のエラー

```
$ composer global require "laravel/lumen-installer”
```
実行した時に下記のエラーが。

```
Failed to download guzzlehttp/promises from dist: The zip extension and unzip command are both missing, skipping.
The php.ini used by your command-line PHP is: /etc/php.ini
Now trying to download from source
- Installing guzzlehttp/promises (v1.3.1)
Cloning a59da6cf61d80060647ff4d3eb2c03a2bc694646
```
単純にzipとunzip使えませんって言うエラーですね。
zipとunzipコマンドインストールして再実行するだけで解決しました。

```
$ sudo yum install -y zip unzip
```

```
$ composer global require "laravel/lumen-installer”
```
VagrantでGo言語の開発環境を立て、チュートリアルをしてみる

# 概要
Go言語を勉強しようと思いました
ただ、自前のMacの環境を変えたくない...
世の中はDockerブームですが、ここはあえてVagrantで

# インストール

## Vagrantをインストール

[Vagrantまとめ](http://qiita.com/tt0805/items/da43f3f4b94e6e6a89f0)

パス通せっていうエラが出たらSSHログインして下を実行

```
 sudo /etc/ini.d/vboxadd setup
```

## Goをインストール
ということで[CentOS6.5にGoをインストールする](http://qiita.com/TakashiOshikawa/items/e3db8b9b4ef6ab32bda1)を参考にInstall！

問題なく入りました。

## 練習練習
次に[golang.jp](http://golang.jp/go_tutorial)をしていきます
npmを用いてd3.jsのd3.scale.categoryを使う

# 概要
[d3.js](https://d3js.org/)には、あらかじめ10色や20色のカラーマップが用意されており、それらを利用することで簡単に色分けをすることができます。
（参考:[d3.jsのcategorical colorsページ](http://bl.ocks.org/aaizemberg/78bd3dade9593896a59d)）
本来は次のように使います。

```
const c10 = d3.category10()
const c20 = d3.category20()
```
これをnpmで利用しようとしたら少しハマったので、参考のためのメモです。

# 使い方
結論としては、npmを用いてこれらを利用するためには[npmのd3-scale](https://www.npmjs.com/package/d3-scale)を使う必要がありました。
そのため、d3-scaleをinstallして、

```
import * as d3_scale from 'd3-scale'
```
とimportして、

```
const c10 = d3_scale.schemeCategory10;
const c20 = d3_scale.schemeCategory20a;
```
とすれば使うことができました。
KotlinとSpring Boot

この記事は[Kotlin Advent Calendar 2016](http://qiita.com/advent-calendar/2016/kotlin)の23日目の記事です
が、12月23日に書き始めました……果たして間に合うんでしょうか？……
# はじめに
[Spring Boot](https://projects.spring.io/spring-boot/)はJavaでさくっとWebアプリが作れるフレームワークです
もちろんKotlinでも使えますし、公式のページに[記事](https://spring.io/blog/2016/02/15/developing-spring-boot-applications-with-kotlin)があるので安心です
# 始め方
[Spring Initializr](http://start.spring.io/)というWeb上でポチポチとボタンを押せば勝手にSpring Bootのプロジェクトファイルを作ってくれるサービスがあるので、これを使うのが一番ラクです
言語の設定はfull versionにする必要があるので、ページ下部のSwitch to the full version.のリンクをクリックすれば項目が出てきます

![Switch to the full version.PNG](https://qiita-image-store.s3.amazonaws.com/0/7164/1b35f61d-f886-9993-0aaf-c3e40b094ae7.png)

あとは、LanguageでKotlinを選べばOKです

![lang.PNG](https://qiita-image-store.s3.amazonaws.com/0/7164/bf3feb88-b666-1395-e4a8-007616a6665f.png)

あとは各種項目を好きに埋めて、Generate Projectボタンを押して完成です
プロジェクトファイルをzipファイルでダウンロードできます

試しにGradleで作ってみました。設定を確認するとさり気なくKotlinのVerが最新版です。嬉しい

![version確認.PNG](https://qiita-image-store.s3.amazonaws.com/0/7164/ac203b7b-ba9f-bea8-52ee-3ca7ed29b3bc.png)

あとは好き勝手にKotlinで書いていけばOKです

# 生成されたコードを読む
Spring BootではSpringBootApplicationアノテーションをつけたクラスを1つ作る必要があるのですが、それもSpring Initializrが自動で生成してくれます

```kotlin
import org.springframework.boot.SpringApplication
import org.springframework.boot.autoconfigure.SpringBootApplication

@SpringBootApplication
open class DemoApplication

fun main(args: Array<String>) {
    SpringApplication.run(DemoApplication::class.java, *args)
}
```

Spring BootはJavaで使われることを想定しているので、当然といえば当然ですがclassを渡すときはHogeClass::class.javaみたいな書き方をする必要があります

テストコードのサンプルも自動生成されます。初心者に優しい

```kotlin
import org.junit.Test
import org.junit.runner.RunWith
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.test.context.junit4.SpringRunner

@RunWith(SpringRunner::class)
@SpringBootTest
class DemoApplicationTests {

	@Test
	fun contextLoads() {
	}

}
```
# おわりに

KotlinとSpring BootというかSpring Initializr便利だよね！という話になりました
実際、KotlinとSpring Bootの組み合わせは某社の案件とかでも使っていますが、開発のしやすさとKotlinが入門しやすいのもあって重宝しています
また、AWS Lambdaと組み合わせて、Kotlinで共通ライブラリを作り、そのライブラリをSpring BootとAWS Lambdaから呼び出して使うみたいなこともしています
WebでもKotlin楽しい。そして、かわいい……今後も使っていきたいですね
$.ajaxから$httpに乗り換えて気がついたこと

##**動機**##
AngularJSでアプリケーションを構築しているのにもかかわらず、
HTTPリクエストをjQueryに頼っていた僕ですが、
幾度もチームメンバーからの冷ややかな目線を感じてましたので、
$httpに乗り換えてやろうと決意しました。

##**まずは$.ajaxコードを確認してみましょう。**##

```js:network.js
let queries = {
	"name": "Donald John Trump",
	"birthday": "1946-06-14",
	"money": NaN
}

$.ajax({
	type: "POST",
	url: "https://example.com/api/action",
	data: queries,
	dataType: "json",
	success: function (response, status, xhr) {
		//成功
	},
	error: function (XMLHttpRequest, textStatus, errorThrown) {
		//失敗
	}
});
```

うん、実に単純、これは手間かからなそうだ。
かっこつけてES6使ったろ（ドヤ顔

##**早速$httpに書き換えましょう**##
```js:network.js
let queries = {
	"name": "Donald John Trump",
	"birthday": "1946-06-14",
	"money": NaN
}

$http({
	method: "POST",
	url: "https://example.com/api/action",
	data: queries,
	responseType: "json"
}).then(
	(response) => {
		//成功
	}, 
	(errors) => {
		//失敗
	}
);
```

これは、ほぼ一緒だな、楽勝すぎる。
早速ビルドして送ってみましょう！

##**Responseを確認**##
>
>400 Bad Request
>

むぅ...なるほど、
一つだけ言えるのは、
僕はこの数字が嫌いだ。

そこでAPIから帰ってきたメッセージを読んでみると、
`"message": "不正なパラメーターです"`

ご親切にありがたいですね、リクエストの中身を見てみましょう。

##**Request Dataを確認**##
```js:$httpの場合
"name": "Donald John Trump",
"birthday": "1946-06-14",
"money": NaN
```
あれ？
一見なんの変哲も無いdataなんですが...
$.ajax時代のものと比較してみましょう！

```http:$.ajaxの場合
name=Donald John Trump&birthday=1946-06-14&money=NaN
```

あっ...これは...まさかjsonで送っているとは、
粋なことしてくれるなぁ
仕方が無い、headerを書き換えよう

##**再度チャレンジ**##
```js:network.js
// ...

$http({
	method: "POST",
	url: "https://example.com/api/action",
	headers: {
		//ヘッダーに追加してあげましょう
		'Content-Type': 'application/x-www-form-urlencoded'
	},
	data: queries,
	responseType: "json"
}).then(
	(response) => {
		//成功
	}, 
	(errors) => {
		//失敗
	}
);
```

さー、こい。

##**Responseを確認（2度目）**##
>
>400 Bad Request
>

`"message": "不正なパラメーターです"`

なるほど。
デジャブでしょうか。
再度リクエストの中身を確認しましょう。

```js:デジャブ
"name": "Donald John Trump",
"birthday": "1946-06-14",
"money": NaN
```

これはあれかね、
Content-TypeをAngularは見ていないのかね！？
おばかさんなのかね！？（半ギレ

##**とりあえず解決（？）**##

仕方が無い、手動で変換して差し上げましょう

```js:network.js
// ...

$http({
	// ...
	data: queryString.stringify(queries),
	// ...
);

let queryString = {
	parse: (text = location.search.substr(1), isDecode = false) => {
		const decode = (isDecode) ? decodeURIComponent : a => a;
		return text.split('&').reduce((obj, v) => {
			var pair = v.split('=');
			obj[pair[0]] = decode(pair[1]);
			return obj;
		}, {});
	},
	stringify: (value, isEncode = false) => {
		const encode = (isEncode) ? encodeURIComponent : a => a;
		return Object.keys(value).map(key => `${key}=${encode(value[key])}`).join('&');
	},
};
```

これで無事に動きました。
めでたし、めでたし。

って言いたいところですが、
これをAngularがサポートしてくれないわけが無い、
きっと僕の知らない魔法がどこかあるはず！

##**結論**##
- Angularはhttpリクエスト時にjsonでのやり取りを推奨している (公式ドキュメントでも明記)
- ~~$httpはおバカである~~ or 僕がおバカである
- ES6は使ってて気持ちが良い
- 僕は400番が嫌いだ
- ~~jQuery($.ajax)の方が楽~~
- **\:bride_with_veil: [追伸] `$httpParamSerializerJQLike` で解決！\:bride_with_veil:**

何か他に文明の利器は無いのでしょうか、
ちなみに他のhttpリクエスト系ライブラリーは今の所使う予定無いです。
なにかいい情報がありましたらご教授願いたいです...m(_ _)m

##**追伸**##
コメントでいただいた通り、 `$http` のドキュメントでPOSTされたものは全てJSONにしてやるぞ！と書いてありましたねーむぅ。
そして同じく頂いたコメント通りに `$httpParamSerializerJQLike` 実装をしたら無事にできました！
＼（＾〇＾）／アリガタヤアリガタヤ＼（＾〇＾）／
エラーメッセージ「[Oracle][ODBC][Ora]ORA-24374: フェッチまたは実行してフェッチする前に、定義されていません」

## エラーメッセージ

```
[Oracle][ODBC][Ora]ORA-24374: フェッチまたは実行してフェッチする前に、定義されていません
```

## 発生条件


.NET から ODBC 経由で Oracle に SQL を発行した際に「[Oracle][ODBC][Ora]ORA-24374: フェッチまたは実行してフェッチする前に、定義されていません」というエラーが発生することがあります。まったく意味がピンとこないメッセージですが、どうも SQL 文字列の中にコメントが入ってたりするとこのエラーになります。

## 対応

SQL では行コメントやブロックコメントが使えますが、この場合（.NET から ODBC 経由で Oracle に SQL 文字列を送信する場合）はどちらのコメントも使用できませんでした。このような場合は送信前にコメントを取り除く処理が必要です。
Node.jsでthen,then,then世

#仕事でNode.jsを使用してみての感想とか愚○・・・
（注）タイトルは少し皮肉ってます。。。



##使用した主なモジュール
bluebird
http://bluebirdjs.com/docs/getting-started.html

lodash
https://lodash.com/docs

Express
http://expressjs.com/ja/

sequelize
http://docs.sequelizejs.com/en/v3/

##愚○
###thenがやたら多い。。。
使っているバージョンが少し古いこともあって
```js
Promise.resolve()
.then(function(){})
.then(function(){})
.then(function(){})
```
こんな感じで非同期の内容をチェインし続けないと
同じ非同期として扱ってくれない・・・
どれだけthenを書けば・・・
まさにthen,then,then世

最新ではジェネレーターとか使ってもう少しわかりやすくかける模様

###thisがコロコロ変わる・・・
javascriptではチェインなどで繋いでいる関数でthisを呼び出すと
thisが思っているのと違うのになる。
これがPromiseのチェインが多発するNodeだと
中々気付きにくいバグになる・・・

対応策として
```js
var self = this;
Promise.resolve()
.then(function(){
　　　　　self.hoge();
})
```
とするか
```js
Promise.bind(this)
.then(function(){
　　　　　this.hoge();
})
```
とするとthisは変わらない。
どっちにしても、めんどい・・・

###bluebird(Promise)を使って気をつけた方がいいところ

Promise.allやPromise.mapはそのまま使うと
配列の量が大きいとかなりのCPUを使用してしまいました。
また、外部のサービス（redisやmysql)とかを使用する際は
コネクション数やCPU使用率があがり、サービスの提供に支障がでてしました。
なるべく、Promise.reduceやPromise.eachを使うようにした方が
安定したサービスを提供できました。

###個人的に入れないと辛いと思ったプラグイン
（エディタはvimでした。）
Eslint
http://eslint.org/
チェックツール。セミコロン忘れとかの防止に

vim-node
https://github.com/moll/vim-node
gfでrequrire先に一発で飛べる


### sequelize
ORマッパーです
よく使うメソッド
```js
　　　　　return this.findOrBuild({
　　　　　　　　　　where:{
　　　　　　　　　　　　　　　key: 'fuga'
　　　　　　　　　　}
　　　　　})
　　　　　.spread(function(instance, initialized){
　　　　　　　　　　return instance.save();
　　　　　})
```
みたいな感じで使ったりします。
findOrBuildはレコードがあれば、レコードの内容をもった
sequelizeのインスタンスを返します。
なければ、デフォルト値とwhereで指定した値をもった
sequelizeのインスタンスを返します。

気をつけないといけないのが
updateという関数をもっているのですが、これは更新した
レコード数しか返さないので、更新した内容のインスタンスが欲しい場合は
saveがオススメです。
（saveメソッドはなければ、insertあればupdateです。）

トランザクション
トランザクション中、同じDBに繋ぐ際はコネクションを共通したもので
繋がないとコネクションが1つ増えてしまう。
これが地味にめんどい。。。
```js
　　　　　sequelize.transaction(function (t) {
　　　　　　　　　　return hogeModel.find({
　　　　　　　　　　　　　　　where:{key: 'hoge'}
　　　　　　　　　　})
　　　　　　　　　　.then(function(result){
　　　　　　　　　　　　　　　fugaModel.find({
　　　　　　　　　　　　　　　　　　　　where:{id: result.id},
　　　　　　　　　　　　　　　　　　　　　　　　　transaction: t
　　　　　　　　　　　　　　　})
　　　　　　　　　　});
```
こんな感じだとコネクションが増えます・・・
怖い・・・

## 感想
ほとんどが愚○でした・・・
まだまだ、ありますがここら辺で止めておきます。
全体的にjavascriptだからか、コードはカオスになりやすいです。
なんとなくで書けてしまうから、怖いなと思います。
でも、性能はいいみたいで捌けるリクエスト数は結構いいみたいです。
見た目はいいけど中身がねってヤツです。
ああ、綺麗に書けるようになりたいなと思う今日この頃です。
UniRx のみで Cube を動かす


UniRx のみで一定時間かけて Cube を動かすサンプルです。

以下のサンプルでは、1.2 秒かけて Cube を (0, 0, 0) から (0, 3, 0) まで移動させています。

```csharp
    public void Move(GameObject gameObject)
    {
        Observable.Create<Unit>(observer =>
        {
            float elapsed = 0;
            float duration = 1.2f;
            var disposable = Observable.Interval(TimeSpan.FromMilliseconds(11f)).Subscribe(e =>
            {
                elapsed += Time.deltaTime;
                float y = Mathf.Lerp(0, 3, elapsed / duration);
                gameObject.transform.position = new Vector3(0, y, 0);
                if (elapsed > duration)
                {
                    observer.OnCompleted();
                }
            });
            return Disposable.Create(() => disposable.Dispose());
        }).Subscribe();
    }
```

`OnCompleted()` をコールしているので、リークはしていない(はず)。

## `Observable.FromCoroutine` を使う

```csharp
    public void Move2(GameObject gameObject)
    {
        var disposable = Observable.FromCoroutine(() => MoveInternal(gameObject)).Subscribe();
        // disposable.Dispose() でキャンセル
    }

    private IEnumerator MoveInternal(GameObject gameObject)
    {
        float elapsed = 0;
        float duration = 1.2f;
        while (elapsed < duration)
        {
            elapsed += Time.deltaTime;
            float y = Mathf.Lerp(0, 3, elapsed / duration);
            gameObject.transform.position = new Vector3(0, y, 0);
            yield return null;
        }
    }
```
Neovim で GStreamer アプリを書く

GStreamer Advent Calendar 2016 の 18日目の記事です。(遅)

DecodetimeBin の開発初日から4日間くらいは Gnome Builder を使ってましたが、
Vim emulation の完成度が低くかったので最近は Neovim に戻りました。

今日はそんな Neovim の環境を紹介します。

## はじめに

筆者の init.vim は Github に公開しています。

> https://github.com/shocrunch/dotfiles/tree/master/config/nvim

以下では init.vim の中でも GStreamer アプリ開発に使っているプラグインたちを紹介します。

## 一覧

- コード補完
  - [Shougo/deoplete.nvim](https://github.com/Shougo/deoplete.nvim)
  - [zchee/deoplete-clang](https://github.com/zchee/deoplete-clang)
  - [Shougo/neoinclude.vim](https://github.com/Shougo/neoinclude.vim)
- スニペット
  - [Shougo/neosnippet.vim](https://github.com/Shougo/neosnippet.vim)
  - [Shougo/neosnippet-snippets](https://github.com/Shougo/neosnippet-snippets)
- コーディング中の移動
  - [majutsushi/tagbar](https://github.com/majutsushi/tagbar)
- 静的解析
  - [scrooloose/syntastic](https://github.com/scrooloose/syntastic)
- 見た目
  - [bling/vim-airline](https://github.com/bling/vim-airline)
  - [vim-scripts/gtk-vim-syntax](https://github.com/vim-scripts/gtk-vim-syntax)
- リファレンスの参照
  - [thiblahute/vim-devhelp](https://github.com/thiblahute/vim-devhelp)

## コード補完

Gnome Builder にはおよびませんが、これら3つでそこそこのコード補完が効きます。

deoplete-clang ではなく [clang_complete](https://github.com/Rip-Rip/clang_complete) を使う選択肢もありますが、 私の環境は重すぎて (候補が多すぎ? 設定が甘い?) 使いものになりませんでした。。。

## スニペット

if, for, main とかの入力にはやっぱりあると便利なのでいれてます

## 静的解析

scrooloose/syntastic を使っている人はかなり多いはず。

GStreamer アプリを開発する場合はプロジェクトのルートディレクトリに`.syntastic_c_config`を置いておくと正しく動作してくれます。これがないと、『`gst/gst.h`ないよ！』とか言われます。

`.syntastic_c_config` は↓このように書きます。

```
-I/usr/include/gstreamer-1.0
-I/usr/include/glib-2.0
-I/usr/lib/x86_64-linux-gnu/glib-2.0/include
```

`pkg-config --cflag gstreamer-1.0` の結果を *改行して* 貼り付けただけです。**改行** 大切なので忘れずに。

ちなみに *プロジェクトのルートディレクトリに置く* というのは[こんな感じ](https://github.com/shocrunch/gst-decodetimebin/blob/ec1f4afacf39fd550b6cd1b850e905ad2e587aca/.syntastic_c_config)です

## 見た目

**airline**

airline は syntastic の出力先としても優秀ですよね :)

**gtk-vim-syntax**

`gint` や `TRUE` など glib のマクロやラップしてる型に色が付きます(ハイライトされます)。また、Deprecated になった関数をハイライトしてくれる機能もあります。

ただ、セットアップ方法がちょっと独特で`ftplugin/c.vim`に`syntax/glib.vim`などを読み込む処理を追記しないといけません。

筆者の ftplugin/c.vim を参考にしてみてください --> https://github.com/shocrunch/dotfiles/blob/master/config/nvim/ftplugin/c.vim

## リファレンスの参照

カーソル上の文字列から devhelp が引けます。超便利。

![anime.gif](https://qiita-image-store.s3.amazonaws.com/0/97187/39902b2a-1dc8-0c9c-01f6-1473e9ec65e4.gif)

## おわりに

やっぱり Vim emulation の環境より本物の Vim (Neovim)がいいよね(*´﹃｀*)
Datadog を使ってPloneをモニタリング

本稿は，Datadogアドベントカレンダー2016の23日目の記事となります。

## Datadog を使いPloneのモニタリング

[Plone](http://plone.org)はオープンソースのPython製のコンテンツマネージメントシステム(CMS)です。今回，操作（コンテンツの編集，ユーザーのログイン・ログアウトなど）がいつ行われたのかをビジュアルで確認するために， [Datadog](https://www.datadoghq.com/)でモニタリングするための機能拡張を作成しました。

- [ngi.notify.datadog](https://github.com/ngi644/ngi.notify.datadog)

操作等のイベント発生のタイミングでDatadogエージェントにメトリクスを送信ます。エージェントをインストールしていない環境でも，Datadog REST APIで送信できるようにしてあります。

システムの状況とCMSの操作とを同時に閲覧することで，状況確認がしやすくなりました。

下図は，Ploneで構築した学習支援システム(LMS)のモニタリング画面となります。
![dd_plone.png](https://qiita-image-store.s3.amazonaws.com/0/103734/6cd32b47-0fcf-6ac9-221a-34fdca993558.png)
【FileMaker】意外と敷居が高いらしい - スクリプトトリガ - OnPanelSwitch

はい、今日は、[AdventCalendar 2016 FileMaker Tips](https://qiita.com/advent-calendar/2016/filemaker-tips/) 12/23の記事です。

今日は、スクリプトトリガの[OnPanelSwitch](https://www.filemaker.com/help/14/fmp/ja/html/script_trigg.36.8.html)です。

まずは、どういう動きか、↓でどうぞ。
https://youtu.be/XZurPzn0BvU

今回は、タブコントロールで使ってみました。
「備考あり」にチェックが入っていて、かつまだ備考が入力されていない場合、タブを切り替えようとする際にリマインダのような役割でダイアログメッセージが出ます。
備考が入力されたら、ダイアログメッセージは出なくなります。

![スクリーンショット 2016-12-23 20.03.19.png](https://qiita-image-store.s3.amazonaws.com/0/60538/ccb294a1-7f65-85f0-5d00-aaf932488d32.png)

これを、「備考あり」のチェックボックスにスクリプトトリガで別のトリガを設定した場合、チェックボックスを操作した時でないとダイアログメッセージがでないため、タブを切り替えた時のリマインダとはなりません。
絶対してほしい「備考欄の入力」という意味合いが強い場合のチェック機能として利用できますね。

あと、2日でAdventCalendarも終わり。
誰か埋めてくれないかなー。
iOSのMPSCNNによる手書き数字認識のサンプルを読む - 前編

iOS 10でMetal Performance Shadersフレームワークに、CNN（Convolutional Neural Network）演算機能群が追加されました。**iOSデバイスのGPUで畳み込みニューラルネットワークの計算**をさせることができる、という代物です。iOSデバイスのGPUも日々進歩しているとはいえ、モバイルデバイスなのでさすがに学習までは厳しいところですが、**学習済みのネットワークの計算**であれば使えるケースはありそうです。


このMPSCNNのApple公式サンプルコードとして、**CNNで手書き文字認識を行うサンプル**が公開されています。

- [MPSCNNHelloWorld](https://developer.apple.com/library/prerelease/content/samplecode/MPSCNNHelloWorld/Introduction/Intro.html#//apple_ref/doc/uid/TP40017482)

ただこちらは一時期ずっとSwiftのバージョンの問題でビルドできなかったりした事情もあり、iOS-10-Samplerというサンプルコード集アプリに移植したものがあるので、今回はそちらを追っていきます。

- [iOS 10の新機能のサンプルコード集「iOS 10 Sampler」 - Qiita](http://qiita.com/shu223/items/f371655c2b101f1b0218)

多少リファクタリングしていますが、**基本的な実装は同じ**です。


![](https://qiita-image-store.s3.amazonaws.com/0/3180/e2cfc688-8812-8771-2fa8-405b4bb0492c.gif)


##オーバービュー

まずはCNNの中身に踏み込む前に、大局を把握するために、そのネットワークを利用するアプリケーション側（iOS-10-Samplerで`はMetalCNNBasicViewController`）の実装から見ていきます。

###ネットワークの入力部分について

上でネットワークの中身にはまだ踏み込まない、と書いたばかりですが、入力部分がどうなっているかだけ見ておきます。

本サンプルでの手書き文字認識のネットワークは、`MNISTDeepCNN`というクラスとして実装されています。

これが`srcImage`という`MPSImage`型のプロパティを持っていて、

```swift:MNISTDeepCNN.swift
var srcImage : MPSImage
```

ネットワーク初期化時に`srcImage`も初期化されます。

```swift:MNISTDeepCNN.swift
srcImage = MPSImage(device: device, imageDescriptor: sid)
```

ここに、以下で説明する実装によって、手書きした内容が入力として渡されてきます。


###1. 手書きした内容を、入力としてネットワークに渡す

まず、手書きしたビューの描画内容をCGContext（28x28のビットマップコンテキスト）として取得します。[^1]

[^1]: Core Graphicsの話なので`getViewContext`の実装内容については省略します


```swift:ViewController.swift
guard let context = digitView.getViewContext() else {return}
```

取得したビットマップコンテキストの`data`プロパティからピクセルデータへのポインタ（`UnsafeMutableRawPointer`）を取得し、ネットワークに渡します。

```swift:ViewController.swift
network.srcImage.texture.replace(
    region: region,
    mipmapLevel: 0,
    slice: 0,
    withBytes: pixelData,
    bytesPerRow: inputWidth,
    bytesPerImage: 0)
```

ここで、`network`は（本サンプルにおけるネットワーク実装クラスである）`MNISTDeepCNN`のインスタンスで、 `srcImage`は上で説明した通り`MPSImage`型のプロパティです。`replace〜`というメソッドを使って、手書き内容のピクセルデータをMPSImageの`testure`プロパティにコピーする、というのが上記コードでやっていることになります。

ちなみに、`MPSImage`の`texture`プロパティは、

```swift:MPSImage
open var texture: MTLTexture { get }
```

この定義の通り、**`MPSImage` の `texture` プロパティはread-only**なので、直接代入するのではなく、`replace〜`というメソッドを利用してピクセルデータをMTLTextureにコピーする、ということをやっています。

```swift:MTLTexture
/*!
 @method replaceRegion:mipmapLevel:slice:withBytes:bytesPerRow:bytesPerImage:
 @abstract Copy a block of pixel data from the caller's pointer into a texture slice.
 */
public func replace(region: MTLRegion, mipmapLevel level: Int, slice: Int, withBytes pixelBytes: UnsafeRawPointer, bytesPerRow: Int, bytesPerImage: Int)
```


###2. ネットワークの実行

入力画像を渡したら、あとはもう**順方向伝播（forward propagation）の計算を実行**して結果を受け取るだけ。

```swift:ViewController.swift
let label = network.forward()
```

アプリケーション側（畳み込みニューラルネットワークを利用する側）の実装としては非常にシンプルに済むことがわかります。


##つづく

ネットワークの中身の実装については、後編『[iOSのMetalで畳み込みニューラルネットワーク - MPSCNNを用いた手書き数字認識の実装](http://qiita.com/shu223/items/bdd537f38872a5af4e4c)』に続きます。
エンジニア１年目で応用情報処理技術者試験に一発合格した方法

エンジニアになって１年目の私が、
平成２８年度秋の応用情報情報処理技術者試験に一発合格したので
その方法と参考書籍を紹介したいと思います。

##勉強方法と期間
勉強を開始したのは平成２８年の5月末でしたが途中で飽きてしまい全く勉強しない時期が続いたので、
実質勉強したのは6月、7月、9月後半〜10月前半の３ヶ月程度です。

しかし、自分の場合、かなり効率よく勉強できたから一発合格できたと考えています。
さぁここからが本題です。

##やったことは３つだけ！！
1.基本情報情報処理技術者試験の薄い本を２周読む

2.電車に乗っているときにアプリで選択問題を解く

3.YouTubeにアップされている解説動画を暇な時に見る

情報処理技術者試験で大事なのは、すべてのジャンルを深く理解し１００点を目指すことではありません。

頻出ジャンルを広く理解し、合格ラインの６０点を取ることです。
これは絶対に頭の片隅にいれて忘れないようにしてください。


それでは実際に使用した本、サイトを紹介していきます。

##1.基本情報情報処理技術者試験の薄い本を２周読む
本屋さんに行くと大量の書籍が並んでおり、非常に悩みました。
しかも分厚い本が多い。。。始める前から心が折れそうになった覚えがあります笑

私が選んだ本はこれでした。決め手は、内容がしっかりしているわりに本が薄く、これなら飽きやすい自分でも読めるだろうと思ったからでした。
しかし、この本を選んだことで合格できたと言っても過言ではないと思います。

<a  href="https://www.amazon.co.jp/gp/product/4774178519/ref=as_li_tf_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4774178519&linkCode=as2&tag=codack1969-22">平成28-29年度 87テーマで要点整理 基本情報技術者のよくわかる教科書 (情報処理技術者試験)</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=codack1969-22&l=as2&o=9&a=4774178519" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

応用情報を受験するのに基本情報試験の本で勉強したの？と思う方もいるかもしれませんが、
応用情報情報処理技術者試験には、午前試験と午後試験があり、午前試験はほぼ基本情報試験と同じと思って大丈夫です。
なので、基本情報の勉強は必須です。

この本のいいところは頻出度ABCで分けられているかつ正しく簡潔に説明されているので、
必要なことだけを素早く理解できます。

試験直前になってきたら頻出Aのジャンルだけ何回も読み返すといいと思います。

##2.電車に乗っているときにアプリで選択問題を解く
使ったアプリはこれだけです。
https://itunes.apple.com/jp/app/ying-yong-qing-bao-chu-li/id923249999?mt=8

選択問題をひたすら解くだけです。
間違えた問題がなんども出てくるうちに問題 + 答えを丸ごと記憶できます。

##3.YouTubeにアップされている解説動画を暇な時に見る
ホワイトボードに書きながら解説してくれるので、書籍だけで理解しきれない部分をフォローします。
https://wakuwakustudyworld.co.jp/blog/youtube_ap

##これだけで本当に受けるのだろうか？？
午前試験は間違いなく合格できます。
問題は午後試験です。

私の個人的見解では午後試験の対策はあまり必要ないと思います。
なぜならば午後の問題は知識よりも文章読解能力が試されるからです。

もちろん対策不要とはいえ、過去問２、３年分ざっと目を通しておくと
どんな問題がでるのかわかるので、時間配分など考えておくのは十分有効だと思います。

以上、思いの外簡単に合格できる試験なので頑張って合格目指しましょう！！
[C#][.NET] オブジェクトの世代別ガベージコレクションでの世代番号を確認する

デバッグ用途にオブジェクトのGCでの管理されている世代を確認したいときのメモ

# 方法

`System.GC.GetGeneration(Object)` を使用する。

# 使用例
```csharp:使用例
var hoge = new Hoge();

Debug.WriteLine("{0}: GC Generation {1}", "Hoge", GC.GetGeneration(hoge));
```

# 関連
[[C#][.NET] ガベージコレクタ/ガベージコレクション(GC)に関するまとめ - Qiita](http://qiita.com/koara-local/items/d961511469795660cd61)

# 参考
[GC.GetGeneration メソッド (System)](https://msdn.microsoft.com/ja-jp/library/system.gc.getgeneration(v=vs.110).aspx)
[GC.Collect() は使い過ぎに注意です！と思って記事かいてみた - 都内で働くSEの技術的なひとりごと](http://ryuchan.hatenablog.com/entry/2014/10/19/224936)
ons-navigatorによるページのスタック管理について

[Onsen UI Advent Calendar 2016](http://qiita.com/advent-calendar/2016/onsenui) 23日目の記事です。

Onsen UIでは、`<ons-navigator>` というコンポーネントを使ってネイティブアプリのようなアニメーション効果つきの画面遷移を実現することができます。
今回は `<ons-navigator>` の使い方について掘り下げて紹介します。

# ページ管理のしくみ
`<ons-navigator>` には、代表的な2つのメソッドがあります。

- `pushPage()`　次のページへ進む
- `popPage()`　 前のページへ戻る

内部的には、以下の図のようにページがスタック状に積み重ねられて管理されています。

<img width="565" alt="navigator1.png" src="https://qiita-image-store.s3.amazonaws.com/0/152304/4c30ab26-49fe-4cbc-158b-19a813dd714a.png">


ページA → ページB → ページA → ページB → ページA → ページB といったように、2つのページを何度も行き来したい場合、通常は `pushPage()` と `popPage()` を交互に実行します。
しかしアプリの要件として、次のページへ進むアニメーション（現在のページの上に遷移先ページが重なる動き）で遷移したい場合もあると思います。
そのときに`pushPage()` だけを使って画面遷移を行うのは好ましくありません。
`pushPage()` を使い続けていると、スタック上に大量のページが積み重なっていくことになり、最終的にメモリリークが発生する危険があるためです。
仮に `pushPage("pageB.html")` を5回実行すると、スタックには5つのページが蓄積されます。同一のHTMLファイルであったとしてもページのインスタンスは新しく生成されるという点がポイントです。

ではどうするかというと、`bringPageTop()` を使います。`bringPageTop()` は、指定したページをスタックの一番上に移動する命令です。

<img width="480" alt="navigator2.png" src="https://qiita-image-store.s3.amazonaws.com/0/152304/e5c37f1c-c28e-6679-e873-2542f826e2a9.png">


（もしスタック内に指定したページが存在しない場合は、新しく生成されます）


また、よくある画面遷移の例として、TOP → 一覧画面 → 詳細画面 → 編集画面 → 完了画面 → TOP といったように、複数のページを経て最初のページに戻る場合があります。
こういった場合は、スタックに無駄なページが溜まらないように、TOPページに戻ったときにスタック内のすべてのページを消去しましょう。
`resetToPage()` というメソッドを使うと、指定したページに遷移した後にスタックがリセットされます。使い方は以下のようになります。


```js
document.getElementById("navigator").resetToPage("top.html", {animation:"default"});
```

※ resetToPage() は、デフォルトではアニメーションがつかないため、第二引数にアニメーションの種類を指定します。


その他にも、スタック内にページを挿入する `insertPage()` や、 スタック内のページを指定したページに置き換える`replacePage()` などのメソッドがあります。

またメソッドとしては用意されていませんが、`ons-navigator` の pageLoaderプロパティ（ページスタック）と pagesプロパティ（スタック内のページ配列）を使うことでスタック内のページを削除することもできます。

たとえば以下の図のように 一覧画面 → 検索画面 → 編集画面 と遷移し、編集画面で更新をした後は検索画面をスキップして一覧画面に戻りたい、といった場合、スタックから一つ前のページを削除した後に `popPage()` を実行します。

<img width="511" alt="navigator3.png" src="https://qiita-image-store.s3.amazonaws.com/0/152304/7509f924-c263-7926-f335-25cb07f6b47a.png">


```js:編集画面で更新処理完了後の処理
var navi = document.getElementById("navigator");
// 検索画面を削除
navi.pageLoader.unload(navi.pages[1]);
// 前のページに戻る
navi.popPage();
```

なお、`pageLoader.unload()` は Onsen UI 2.0.5 から追加された機能です。以前のバージョンでは利用できないので注意してください。

# まとめ
今回は `<ons-navigator>` によるページ管理の内部構造について説明しました。見た目上は問題なく動作していても、裏側ではスタックに大量のページが溜まっているケースがあります。アプリを使い続けているうちにパフォーマンスが低下してきたという場合、一度見直してみると良いでしょう。
go言語で画像をモノクロにする

今後画像処理の勉強のために画像がインプットして、関数を通ってアウトプット見たいのが欲しかったのでとりあえずモノクロにしました。

# とりあえずパクる
[ここ](http://miyabishi.hatenablog.com/entry/2015/12/26/180312)から拝借します。

# 要点
1. imageのライブラリを使う
2. [系加重平均法](http://koturn.hatenablog.com/entry/2016/02/05/010000)というのを使用してモノクロ値を取得する。

特出したことはなし。

# 結果
## 元画像
![plant4.jpg](https://qiita-image-store.s3.amazonaws.com/0/51009/3ac0a6af-7e7c-ccf7-8ca0-eb74955ba8f4.jpeg "plant4.jpg")

## 加工後
ダメでした。
![plant4_out.jpg](https://qiita-image-store.s3.amazonaws.com/0/51009/6c34201f-3bb4-c296-443a-7d4ff4c5f37e.jpeg "plant4_out.jpg")

# 検証
なぜダメだったかはプリントデバッグで値見ちゃう。
![スクリーンショット 2016-12-23 18.29.04.png](https://qiita-image-store.s3.amazonaws.com/0/51009/697e5555-6596-d5b6-352d-a519bd68f642.png "スクリーンショット 2016-12-23 18.29.04.png")
rの値→uint8(r)の値
なので、情報の欠損ですかね？16進数にします。
![スクリーンショット 2016-12-23 18.37.06.png](https://qiita-image-store.s3.amazonaws.com/0/51009/7149feb7-a58f-2b80-c250-96e409c1d282.png "スクリーンショット 2016-12-23 18.37.06.png")
上位２バイトの欠落で確定ですね、以下を修正します。
c#だとこの時って全部255にならんかったけ？なんにしろgoっぽいな、と思いました。

1. RGBAではなくRGBA64を使用する。
2. uint8の関数を取っ払う
3. 以下のに箇所はuint16を使う

```go
mono := uint16(outR + outG + outB)

col.A = uint16(a)

```
# 結果
出ました、ご納得。
![plant4_out.jpg](https://qiita-image-store.s3.amazonaws.com/0/51009/daf49643-2c78-3e58-7f03-9603a8800065.jpeg "plant4_out.jpg")
疑問点はいくつかあるけど、想像はつくから後回しやね。
ファイルやディレクトリの削除などはコマンドを使った方が早いかも

#【概要】
サイズの大きなファイルやディレクトリの削除は「右クリックで削除」や「Shift + Delete」を使うよりコマンドで行った方が早いですよ（たぶん）。
削除に限らずコピーや圧縮等もコマンドで行った方が早く済むと思う。

Shift + Deleteとコマンドでの削除にかかる時間をそれぞれ調べてみた。
今回は[Pleiades All in One](http://mergedoc.osdn.jp/)のJava Full Editionをダウンロードして解凍したものを使用した。
<img width="472" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/fc95c0d1-1909-c206-2006-188657842838.png">

#【Shift + Deleteによる削除時間を調べる方法】
①「pleiades」フォルダをクリックして「Shift + Delete」キーを入力。
②キーを入力した瞬間にストップウォッチを作動させ時間を計る。
　（誤差は許して）

<img width="347" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/7bd4f16b-9037-6d48-692b-2cf30d374d3c.png">

#【コマンドによる削除時間を調べる方法】
①以下のバッチファイルを用意する

```bat:削除時間計算.bat
@echo off

set beforeTime=%time:~6,2%

rd /s /q "pleiades - コピー"

set afterTime=%time:~6,2%

set /a result=%afterTime%-%beforeTime%

if %result% LSS 0 (
	set /a result+=60
)

echo 削除時間は%result%秒

pause
```

②上記のバッチファイルを「pleiades - コピー」フォルダのあるディレクトリに配置してダブルクリックする。
<img width="326" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/c41a8de1-dfb0-4210-bae4-62e8479defd9.png">


#【実験結果】
|      削除方法     |削除時間|
|:----------------:|:------:|
| Shift + Delete   |約14秒|
| コマンド          |約3秒|

**コマンドの方が早い！**
AWS IOTを使いRaspberry Piからデータを送信する

さくらVPS上のRailsアプリのREST APIでデータを溜めてみていたが、AWS IoTを試してみたく設定をしてみる。

Raspberri Pi2 BからAWS IoTへ接続まで。

1. AWSの管理画面からIoTを選択。
![スクリーンショット 2016-12-23 16.40.46.png](https://qiita-image-store.s3.amazonaws.com/0/46374/e5c59c9c-9e43-ab96-9021-cdf94759c92c.png "スクリーンショット 2016-12-23 16.40.46.png")
 
2. Thingsを作成する。今回はBaobabの名前で作成。
 ![スクリーンショット 2016-12-23 18.25.48.png](https://qiita-image-store.s3.amazonaws.com/0/46374/3ff003c5-95a9-11bf-1034-dbf112953456.png "スクリーンショット 2016-12-23 18.25.48.png")
![スクリーンショット 2016-12-23 18.25.34.png](https://qiita-image-store.s3.amazonaws.com/0/46374/b1702b1a-ab27-67ab-7179-f945faacfffc.png "スクリーンショット 2016-12-23 18.25.34.png")

3. AWS IoTへ接続するための証明書を作成してActivateとダウンロードしておく。
![スクリーンショット 2016-12-23 16.44.20.png](https://qiita-image-store.s3.amazonaws.com/0/46374/0ba0d81b-81a7-75f0-863d-e0fd71becdb7.png "スクリーンショット 2016-12-23 16.44.20.png")
![スクリーンショット 2016-12-23 16.44.44.png](https://qiita-image-store.s3.amazonaws.com/0/46374/70a9938c-f44c-343c-0257-d5010bc08a97.png "スクリーンショット 2016-12-23 16.44.44.png")

4. Raspberry PiからAWS IoTへ接続するSDKをダウンロードするが、
   この画面のHTTPSエンドポイントもコピーしておく。
![スクリーンショット_2016-12-23_18_31_29.jpg](https://qiita-image-store.s3.amazonaws.com/0/46374/fedf56b2-5336-4231-bbf0-dc1ec6f90c1b.jpeg "スクリーンショット_2016-12-23_18_31_29.jpg")
今回はLINUX/OSX -> Pythonを選択。Python 2.7+ or Python 3.3+に対応している。
![スクリーンショット 2016-12-23 18.32.25.png](https://qiita-image-store.s3.amazonaws.com/0/46374/1716069a-3eca-b19a-349c-ff4c006c11d7.png "スクリーンショット 2016-12-23 18.32.25.png")

 使い方はこちらが参考になった。
 https://github.com/aws/aws-iot-device-sdk-python


5. 3.でダウンロードしたキーと4.でダウンロードしたSDKをRaspbery PiへSCPやFTPソフトでアップロード。

6. AWS IoT root CAは鍵と同じディレクトリに準備する。

```
curl https://www.symantec.com/content/en/us/enterprise/verisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem -o rootCA.pem
```

7.Raspberry Piへターミナルでログインし、SDKをインストール。

```
$ pip install AWSIoTPythonSDK
```

8.サンプルプログラムで接続の確認。

```
$ python basicPubSub.py -e <endpoint> -r <rootCAFilePath> -c <certFilePath> -k <privateKeyFilePath>
```
鍵ファイルはフルパスで記載。

```
2016-12-23 18:40:01,310 - AWSIoTPythonSDK.core.protocol.mqttCore - DEBUG - Publish request 2 succeeded.
Received a new message: 
New Message 0
from topic: 
sdk/test/Python
--------------


2016-12-23 18:40:02,315 - AWSIoTPythonSDK.core.protocol.mqttCore - DEBUG - Try to put a publish request 3 in the TCP stack.
2016-12-23 18:40:02,317 - AWSIoTPythonSDK.core.protocol.mqttCore - DEBUG - Publish request 3 succeeded.
Received a new message: 
New Message 1
from topic: 
sdk/test/Python
--------------
```

接続できた。

9.ダッシュボードでも確認できます。
 
![スクリーンショット 2016-12-23 18.46.46.png](https://qiita-image-store.s3.amazonaws.com/0/46374/9e576832-ac9d-d0ef-b761-88b08a9c8831.png "スクリーンショット 2016-12-23 18.46.46.png")

前回のPythonプログラムを作り変えつつ、
LambdaでDBへ繋ぐなど全体の設計を見直してみる。
階層モデルがもたらす新しい設計について

vte.cxでは階層型のデータベースを採用しています。
アプリケーションを設計する際にRDBのテーブルをイメージする人は多いと思いますが、階層型をイメージするともっとシンプルに作ることができるかもしれません。

今日はこのあたりの話をしたいと思います。

#階層型のススメ

私自身、すでにRDB脳になっていて、なかなか階層型の発想ができなくなっているのですが、実際にvte.cxを使って階層型で設計してみると、「こんなにシンプルにできるのに、何でいままで難しく考えていたんだろう」と思うことがよくあります。
階層型に馴染みのない方も多いと思いますので、具体的な例で説明してみたいと思います。

以下は、よくあるECサイトのパンくずリストです。

```
家電 > ＡＶ > テレビ > プロジェクター
家電 > パソコン > プロジェクター
```

各カテゴリは親子関係になっており、親>子>孫・・と、階層は多段にもつことができます。
親カテゴリを選択すると子カテゴリのリストが表示されます。
子カテゴリは複数の親カテゴリをもつことができます。
例えば、「プロジェクター」は上記のように「テレビ」と「パソコン」の複数の親カテゴリに紐づいています。

このようなパンくずリストをRDBで表現するとしたらどうしますか？
詳しくは、[経路列挙モデル](http://www.geocities.jp/mickindex/database/db_tree_pe.html) や、[SQLアンチパターン　階層構造（前編）](http://it-phlogiston.doorblog.jp/archives/24872034.html) などを参照していただくとわかるのですが、はっきりいってRDBで階層表現するのは大変です。  

>なお、こんな記事を書いているくせになんですが、正直言ってRDBでかっこよく階層構造データを扱おうとするのは、真夏に旨い真牡蠣を食べようとするのと同じぐらい困難だと思っています。夏はおとなしく岩牡蠣を食べていろ、ということです。

[階層構造データへの挑戦](http://qiita.com/uchinami_shoichi/items/5fa52f340003107d46c1)

しかし、階層型のデータベースであれば割と簡単に表現することができます。
例えば、vte.cxの場合、/家電 の下に「AV」エントリと「パソコン」エントリを登録し、さらに、/家電/パソコンの下に「プロジェクター」エントリを登録、また、家電 > ＡＶの下に「テレビ」エントリを登録するだけです。「プロジェクター」エントリは別名に/家電 / ＡＶ / テレビ / プロジェクターをもちます。

#複雑な業務アプリの設計例

もう一つ、実践的な例を挙げてみます。
以下は代理店マスターをもつ販売管理アプリケーションの要件です。

 * 代理店が複数存在し、複数の販路をもつ。
 * 販路が複数存在し、商品が複数の異なる販路から販売されることがある。販路が違えば、売上金額、税込・税抜、マージンが異なる。
 * 商品ごとに受注データの構造が異なる。例えば、共通項目(商品コード、売上金額、税込・税抜、マージンなど)もあれば、そうではないものもある。

代理店マスター管理では、代理店情報に加え、販路情報や商品情報も管理します。
これを素直に設計すると、代理店>販路>商品というような階層構造になります。これは、前述したパンくずリストと同じ構造をしたものです。

実際のデータ構造は以下のような感じになります。このように階層型にすることで直感的に設計できます。

 * /d/client 配下に複数の代理店情報エントリー
 * /d/client/{代理店コード}配下に複数の販路情報エントリー
 * /d/client/{代理店コード}/{販路コード}配下に複数の商品情報エントリー

難しいのは、親エントリが変更になった際に配下の子エントリも連動するということです。例えば、子エントリが複数の親エントリに紐づく場合は単純には削除できません。なので、代理店マスター管理では１つの子エントリーが複数の親エントリーに紐づくのではなく、それぞれ別の値をもつようにしています。

また、販路マスターや商品マスターも別途、管理が必要です。

 * /d/market/{販路コード} に販路情報エントリー
 * /d/product/{商品コード} に商品情報エントリー

このようなデータ構造は、RDBでも頑張ればできなくもありませんが、階層型の方がより直感的に設計できることがわかるかと思います。

#RDB脳からの脱却してオブジェクト中心の世界を

業務アプリケーションにフォーカスするとオブジェクト設計の重要性がわかります。
一方で、これまであたりまえだと思いこんでいたリレーショナル設計については実は必要ないかもしれません。なぜなら、リレーショナル設計が必要なのはRDBを使っているからであり、本来はオブジェクトだけで十分だからです。O/Rマッパーによってオブジェクトをリレーショナルに変換しているわけですが、データストアにおいて直接オブジェクトを扱えるようになれば、リレーショナルな部分は必要なくなります。

リレーショナルな部分がなくなってオブジェクトの世界だけになり、前述したような階層型で設計することで、複雑な業務アプリケーションも直感的に作れるようになります。

これはオブジェクトデータベースが目指してきた世界のようにも思います。

それでは、また。
Amazon Dash ButtonのARPが取れない

[Amazon Dash Button](https://www.amazon.co.jp/b?node=4752863051)がHackするのに、ARPが取れないという事象が発生したのでメモ。

#１．何が起きたの？
findbuttonを実行して、Dash ButtonをプッシュしてもMACアドレスが表示されない・・・。

```Commnad
% sudo node ./.bin/findbutton
Watching for arp & udp requests on your local network, please try to press your dash now
Dash buttons should appear as manufactured by 'Amazon Technologies Inc.' 
Possible dash hardware address detected: XX:XX:XX:XX:XX:XX Manufacturer: BUFFALO.INC Protocol: arp
Possible dash hardware address detected: YY:YY:YY:YY:YY:YY Manufacturer: Raspberry Pi Foundation Protocol: arp
Possible dash hardware address detected: XX:XX:XX:XX:XX:XX Manufacturer: BUFFALO.INC Protocol: arp
Possible dash hardware address detected: YY:YY:YY:YY:YY:YY Manufacturer: Raspberry Pi Foundation Protocol: arp
```

XX:XX:XX:XX:XX:XXは無線LAN、YY:YY:YY:YY:YY:YYはRaspberry PiのMACアドレス。
私が欲しているはDash ButtonのMACアドレス。

#２．原因
犯人は無線LANの「Snooping 機能」

我が家の無線LANはBuffaloのWHR-G301Nを使用してて、AirStationにログインして確認するとSnooping 機能が有効化されていた。
![変更前.PNG](https://qiita-image-store.s3.amazonaws.com/0/109672/ab64c66b-9110-feae-cba9-46239599b13c.png)

Snooping 機能をオフにしてしばし待つ。
![設定変更中.PNG](https://qiita-image-store.s3.amazonaws.com/0/109672/028d60c9-4db4-934f-f038-b552021a5ff6.png)


#設定確認
Dash ButtonのMACアドレスが取れるようになった。
postfix で構築したサーバでsupport@ のメールが受信できない

#環境
centos7

```
cat /etc/redhat-release 
CentOS Linux release 7.3.1611 (Core)
```

[メールサーバ構築](http://qiita.com/bzy/items/6edc8cfe48cba3eacb18)後support@example.comへのメールが受信できないと連絡があったので調査

#調査
他のユーザからsupport宛にメール送信しログ確認

```
journalctl -xafu postfix
to=<root@example.com>, orig_to=<support@example.com>, relay=local, delay=0.02, delays=0/0.01/0/0.01, dsn=2.0.0, status=sent (delivered to maildir)
```

メール送信は```dsn=2.0.0```で成功してるんだが？

ちょっと待てroot宛に送ってるじゃないか！
いろいろ調べた結果```/etc/aliases```の記載でsupportがrootに紐づけられているじゃないか
support -> postmaster -> root
てことね

```
cat /etc/aliases
.
.
.
postmaster:	root

support : postmaster
```
なので

```
cat /etc/aliases
.
.
.
postmaster:	root

#support : postmaster
```
コメントアウトしてあげれば良い

あとはpostfixをリスタートして完了

```
systemctl restart postfix
```

無事メールがsupportのディレクトリに格納されました
blenderでモデルを作成して環境マッピングした話

## はじめに

12/23の[Blender勉強会](https://atnd.org/events/84014)で作成したモデルをthree.jsを使って環境マッピングしてみました。
基本的には[Blender Three.js ガラス その２（環境マップ）](http://ara-web.net/blog/three-js/post-2693/)の2番煎じです。

## 作成したモデル

![pet.png](https://qiita-image-store.s3.amazonaws.com/0/103779/4e50ef41-5692-3e7e-523d-e4b7ce565663.png)

ペットボトルです。（お手本見ずに適当に円柱こねくり回しました）

## Three.jsで表示

使用したテクスチャ[http://opengameart.org/content/winter-skyboxes](http://opengameart.org/content/winter-skyboxes)

```js
            const scene = new THREE.Scene();
            const renderer = new THREE.WebGLRenderer();
            const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
            camera.position.z = 5;

            const urls = ['./Forest/posx.jpg', './Forest/negx.jpg', './Forest/posy.jpg', './Forest/negy.jpg', './Forest/posz.jpg', './Forest/negz.jpg'];

            scene.background = new THREE.CubeTextureLoader().load(urls);

            const control = new THREE.OrbitControls(camera);

            const container = document.createElement("div");
            document.body.appendChild(container);
            container.appendChild(renderer.domElement);

            renderer.setSize(window.innerWidth, window.innerHeight);
            renderer.setClearColor( 0xeeeeee );

            new THREE.JSONLoader().load("petbottle.json", (geom, mat) => {
                const material = new THREE.MeshBasicMaterial( {
                    color: 0xffffff,
                    envMap: scene.background ,
                    refractionRatio: 0.7,
                    reflectivity: 1,
                    opacity: 0.6, 
                    transparent: true
                } );
                const mesh = new THREE.Mesh(geom, material);
                scene.add(mesh);

                render();
            });

            function render() {
                requestAnimationFrame(render);
                control.update();
                renderer.render(scene, camera);
            }

```

![bloggif_585ceb2e6712a.gif](https://qiita-image-store.s3.amazonaws.com/0/103779/b0c91184-bab9-f0d5-555d-7dfcf7ac7edb.gif)

かんたん！！
ASTERIA WARPのCDataアダプターを使ってTwitterのトレンドを取得してみる

EAIツールのASTERIA WARPには、CDataの機能を組み込んだアダプターという機能が用意されています。このアダプターを使うと、CDataが対応しているデータソースに簡単にアクセスすることができます。

ここでは一例として、CData Twitter アダプターを使ってTwitterのトレンドを取得してみたいと思います。
今の時期ですと、やはりクリスマスに関する話題が多いのではないでしょうか。
それでは早速やってみましょう。

#事前準備
Twitterへ接続するためにはConsumer KeyとConsumer Secretが必要になります。
Consumer KeyとConsumer Secretは下記の手順で取得することができます。

1. https://dev.twitter.com/apps にログインします。
2. ［Create New Apps］をクリックします。
3. ユーザーが接続時に表示される［Name］、［Description］、［Website］を入力します。
4. ［Callback URL］にhttp\://127.0.0.1/を指定します。

作成したアプリケーションのページにあるKeys and Access Tokensタブを開いて、Consumer KeyとConsumer Secretを取得します。
![twitter2.png](https://qiita-image-store.s3.amazonaws.com/0/151881/089b66bf-72fc-94f4-c886-6fd2c6c54e60.png)


#コネクションの作成
ASTERIA WARPのフローデザイナーでTwitterに接続するためのコネクションを作成します。

1. コネクションペインのツールバーのコネクション作成アイコンをクリックします。
2. コネクション作成画面が表示されるので、接続種別で「Twitter」を選択、名前を入力します。
![twitter3.png](https://qiita-image-store.s3.amazonaws.com/0/151881/43c6f1f5-e2d0-9d99-f047-9edd89c76985.png)

3. インスペクタで接続設定情報を入力します。

インスペクタの詳細タブに入力する情報
![twitter4.png](https://qiita-image-store.s3.amazonaws.com/0/151881/7168deb8-4f24-28e5-ea37-68925424ee07.png)
・Callback URL: http\://127.0.0.1/を指定
・Initiate OAuth:　GETANDREFRESHを指定
・OAuth Client Id:アプリケーション設定のConsumer Keyを指定
・OAuth Client Secret:アプリケーション設定のConsumer Secretを指定

#フローの作成
いよいよTwitterからトレンドを取得します。
地域を絞ることもできるので、ここでは東京に絞ってみます。

1. TwitterGetコンポーネントを配置して、コネクション名プロパティに作成しておいたコネクションを指定します。
2. 1で配置したコンポーネントをダブルクリックして「SQLビルダー」を起動します。
3. テーブル一覧から「Trends」をクリックしてドラッグを開始し、中央の領域にドロップします。
4. TopicフィールドのチェックボックスをONにします。
5. WoeIdフィールドを右クリックして、表示されたメニューから「条件の追加」を選択します。
6. 値のフィールドに「1118370」を入力して「OK」をクリックします。
![twitter7.png](https://qiita-image-store.s3.amazonaws.com/0/151881/fa905fb3-264f-a620-dbda-45945c83a303.png)

これで準備完了です。
さて、トレンドはクリスマスに関連する話題で埋め尽くされているのでしょうか？
簡単に結果を得るために「SELECTテスト」ボタンをクリックします。
![twitter8.png](https://qiita-image-store.s3.amazonaws.com/0/151881/f04fd4bb-b0a6-2e8c-f907-05d16b536bcd.png)

若干。。。ではありますが、クリスマス関連の話題がありますね。
明日、明後日にはきっと何倍にも増えていることでしょう。
Linux標準機能で簡単JSON整形

# はじめに

　Linuxユーザーのみなさま、コンソール上でJSONを扱うときどのように整形していますか。JSONはRESTful APIなどでもよく使われており大変便利で、よく目にしますが、整形せずに使うと可読性には欠けますよね。そこで、私がよく使っているのは[jqコマンド](https://stedolan.github.io/jq/)です。ですが、これはLinux標準ではないため、本番環境では使用できなかったりします。
　今回は、Linuxの標準機能だけでJSONを整形する方法をご紹介します。

# Linux標準機能でJSONを整形

Linuxは標準でPythonがインストールされていますが、Pythonの標準ライブラリの一つに***[JSON Module](http://docs.python.jp/3/library/json.html)***があります。パイプでJSONデータを渡すとコンソール上で簡単に整形できます。

```bash
$ echo '{"key1": "value1", "key2": {"key3": "value3"}}' | python -m json.tool
{
    "key1": "value1",
    "key2": {
        "key3": "value3"
    }
}
```

Let's JSON life!
electron-packager の `ignore` をたぶんほぼ完璧に指定する

Electron のパッケージを作成する際に、起動に必要のないmoduleを除外する必要があるけど、↓以下の記事で紹介されているような問題があって、単純に *package.json* の `devDependencies` に指定されているものを除外するだけでは devDependency が依存している module が除外できなくなる。

[npm v3 で Electron のパッケージサイズが大きくなる - Qiita](http://qiita.com/Kazunori-Kimura/items/bcc1214fd8bc602e06b8)

なので以下のような感じで頑張る（試してないけど↑で紹介されている `--global-style` を使ったほうが楽だと思う）

# 使うもの
* shelljs
* lodash

# コード
```js
require('shelljs/global');
const difference = require('lodash/difference');


const requireFiles = [
  'bundle.js',
  'index.html',
  'main.js',
  'node_modules',
  'package.json',
];

const installedNodeModules = ls('node_modules').map(e => e);
const productionInfo = JSON.parse(
  exec('npm list --production --depth=1000 --json', { silent: true }).stdout
);

function extractDependencies(info) {
  if (!info.dependencies) { return []; }
  return Object.keys(info.dependencies).reduce((pkgs, name) => {
    const childDeps = extractDependencies(info.dependencies[name]);
    return pkgs.concat(name, childDeps);
  }, []);
}

const productionDependencies = extractDependencies(productionInfo);
const devDependencies = difference(installedNodeModules, productionDependencies);

// これを electron-packager の ignore に指定する
const ignoreFiles = difference(ls('./').map(e => e), requireFiles)
  .concat(devDependencies.map(name => `/node_modules/${name}(/|$)`));
```

## なにやってんの
`requireFiles` は、Electronアプリを起動するのに最低限のファイル。*bundle.js* は browserify とか webpack で作ってるファイル名に適宜変える。あとでカレントディレクトリにあるファイルとの差分を取って、必要ないやつを指定する。 

`installedNodeModules` は `npm install` されてるやつを列挙してる。

`productionInfo` は、`dependencies` に指定してる module を、それが依存しているのも含めて取り出してる。たぶん 1000 も深く潜れば大丈夫だろうという指定をしている。

`extractDependencies` は、`productionInfo` が持ってる `dependencies` を潜ってって、必要なやつの名前を取り出して `productionDependencies` に入れてる。

`devDependencies` はさっき取り出した、すべての module と必要な module の差分を取ってる。

`ignoreFiles` はカレントディレクトリで必要ないやつと必要ない node_modules を結合してる。

---

終わり
ゆっくりとデータサイエンティスト回りの概念/手法を整理してみようと思う part1

どうも。Yuuseiと申します。
家の近所でアナリストをしてるんですが、
本格的にデータサイエンティストと名乗るために自分の中で整理をつけようと思い、
重い腰を上げた次第です。

お暇があれば[Part0](http://qiita.com/yuusei/items/49a63f4402afc66243e6)から読んでいただければと思います。

さて、前回の記事を書いたあとでだいぶ時間も開き、
忙しい中で知見を広める機会にも巡り会えたので、
いったんこのPart1にて、自分の中で「Data Scientistとはなんぞや？」を定義します。

そして、その理由を書き、
それに沿った形で後続のPartは手法やツール、概念の紹介にする流れにします。

それでは、年の瀬も近づき、
自分の中にあるなんやかやを整理する意味含めてこのエントリーを書きます。

#「Data Scientistとはなんぞや？」

**Data Scientistとは【ビジネスでROIの出せる応用物理者/数学者全般】である**

これが自分の中での落とし所になりました。
もう少し緩い定義として、次の様なものも考えていたのですが、

~~Data Scientistとは【物理学科卒業レベルの数式が読めるビジネスパーソン】である~~

これは少々ゆるふわ過ぎて、
自分が今後目指して行くものとしてはハードル低いと思ってやめました。
そもそも、ここまでレベルを下げると理系学部卒で研究経験の無い人達まで入るので
語弊が生まれそうですしね。


それでは理由について詳しく入る前に、まず要素を２つに分けましょう

	Data Scientist = ビジネスでROIの出せる ＋ 応用物理学者/数学者

次の準備として、日本データサイエンス協会の定義を改めて紹介します。

![alt](https://enterprisezine.jp/static/images/article/6415/6415_01.png)
(画像引用元：[Enter Prisezine: データサイエンティストの「ミッション、スキルセット、定義、スキルレベル」を発表](https://enterprisezine.jp/article/detail/6415))

こちらでは Data Scientistを３つのスキル集合の共通集合を持つ人間として定義してます。

	Data Scientist ＝ ビジネス力 ＋ データサイエンス力 ＋ データエンジニアリング力

となります。

比べてみてわかるのは「お前の定義は2要素だが、協会の定義は3要素じゃないか」ですかね。
そうです。この２つを一対一対応（単射）にするつもりは毛頭ありません。

翻訳すると：
　　　　　ビジネスでROIを出せる = ビジネス力 + データエンジニア力
　　　　　　応用物理学者/数学者 = データサイエンス力 (+ データエンジニア力)

つまり、
ビジネスでROIを出すために、ビジネス力とデータエンジニア力が必要で
そのROIを数学的に裏付けのある方法を用いれる人がData Scientistだと思っています。
応用の方に (+ データエンジニア力)とついているのは応用は実務転用が前提だからです。

例えば、

・待ち行列理論と損失関数で新しい店舗レイアウトのROIを決める
・顧客の購買行動を予測するモデルを作成し、そのモデルを元にROIの出るセグメントを見つけ出す

そう言う事を、統計や確率を使う際のマナーを踏まえて実行の為のブループリントを立てられる。
そんな人がData Scientistとなのではないかと思っています。

今、Deep Learningなどの機械学習がお手軽で便利なので、
Data Scientistといえば機械学習(と、データマイニング)のイメージが先行しています。
ですが、個人としては統計を使って品質を改善したり、
電車の運行ダイヤを最適化する人たちも含めて良いのではないかと思っています。

そう言う意味では、製造業系やサプライチェーン系、ファイナンス系の中に
Data Scientistと呼んでも良い人たちは少なくない数いるのでしょう。

世の中のイメージが彼らをどう呼ぶかは置いておいて、
僕自身は彼らもData Scientistとしてしまって良いと思います。

そしてその様な人達の多くは物理や数学系の学位を持っている筈なので、
どうしても「応用物理/数学者」と言う表現は残しておきたいわけです。

ただ、少し本題とズレますが、
こう言う人たちは自身を研究者と認識している場合が多く、
Data Scientistと呼ばれたくない人も多いんだろうと言うのは想像に難くないわけです。

その辺りは難しいところですね・・・

次のエントリでは、
そんなData Scientistは何故希少種のままなのか、
考えてみたいと思います。

それではまた、年内か、もしかしたら年明けにお会いしましょう。
[part2](http://qiita.com/yuusei/items/f55cfe69d3fcf8b3ce1b)
SketchUp > マウス真ん中 > ズームイン・アウト | オービット機能 | パン機能

```txt:動作環境
SketchUp Make v17.1.173
MacOS X El Capitan
```

Sketchupを使い始めた。　
自分が考えているものを作れるかどうか。

割り箸で作るほうが早そうであるが、今後の修正に対応するのはツールを使っている方が早い。

Sketchupを使い始めると以下のtutorial動画が掲示される。
http://www.sketchup.com/ja/learn/videos/58?playlist=58

その中の操作今後よく使いそうな機能を記載しておく。

動画の4:40以降

- ズームイン・アウト > マウス真ん中のホイールを上下
- オービット機能 > マウス真ん中のホールを押しながらマウスを移動する
   - ビューを回転できる
- パン機能 > Shift + マウス真ん中のホールを押しながらマウスを移動する
   - 視点方向は固定で、左右に移動できる
deinに乗り換えよう（第五段階）

# 前提条件

- MacOS ElCapitan 10.11.6
- vim8.0
- homebrew
- iTerm2
- ctags

# 今回の作業
言語は仕事の都合で色々手を出していて、プラグインを全部入れるのはもう・・・w
とりあえず今使ってるPHPとこれから使う予定のGoに関する設定をしていこうと思う

今回は、PHP関連のプラグインをインストール＆設定

- neocomplete-php
- PHP Documentor for VIM

# 手順

## neocomplete-phpをインストール

.vimrcに

```
" php plugins
call dein#add('violetyk/neocomplete-php.vim')
```
を追加してviを開き直すだけ。超（以下略）

## neocomplete-phpの設定
.vimrcに

```
let g:neocomplete_php_locale = 'ja'
```

を追加して

```
:PhpMakeDict ja
```

をviで実行

```
Error validating server certificate for 'https://svn.php.net:443':
・・・略
(R)eject, accept (t)emporarily or accept (p)ermanently? 
```

と聞かれるので、とりあえず「t」で

```
Press ENTER or type command to continue
```

って聞かれた挙句、viが起動しても延々と何やら流れているので、お茶でも飲みながら待ちましょう。
今回の作業で「:PhpMakeDict ja」の実行から完了までが一番長いかも・・・

## PHP Documentor for VIMをインストール

.vimrcに

```
call dein#add('vim-scripts/PDV--phpDocumentor-for-Vim')
```

を追加してviを開き直すだけ。

## PHP Documentor for VIMの設定

.vimrcに

```
inoremap <C-P> <Esc>:call PhpDocSingle()<CR>i
nnoremap <C-P> :call PhpDocSingle()<CR>
vnoremap <C-P> :call PhpDocSingle()<CR>
```

を追加します

ここまで出来たら適当なphpで試します（センスないネーミングなのは気にしないw）

```
<?php

class Hoge()
{
    function fuga($hoge)
    {
        return $hoge;
    }
}
```

最初のphpを打った時点でphpinfo()とか候補が出たら、neocomplete-phpは成功

functionの上にカーソルが来てる状態でControl+Pを押すと

```
    /**
     * fuga 
     * 
     * @param mixed $hoge 
     * @access public
     * @return void
     */
    function fuga($hoge)
・・・略
```

とか入ったらPHP Documentor for VIMも成功です。

次はGo言語関連。でもあるのか・・・？そもそも始める前なので、何が便利かわからないぞ？
というわけで、探すところから始めます
C#でニコニコ動画の動画説明文を編集できるようにする

#はじめに
次の記事でニコニコ動画から情報を取得する方法について記載しました。
[C#で任意のサイトの情報を抜き取る - ウェブスクレイピングはじめの一歩](http://qiita.com/rrryutaro/items/b80303145fac04485e43)

今回は引き続き同じ題材で、編集を行えるようにしたいと思います。

#ソースコード
```csharp
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace RniconicoEditor
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            webBrowser1.Navigate("http://www.nicovideo.jp/my/video");
        }

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            System.Diagnostics.Debug.Print(e.Url.ToString());

            if (e.Url.Equals("http://www.nicovideo.jp/my/video"))
            {
                HtmlElement el = webBrowser1.Document.GetElementById("video").Children[5];
                if (el != null)
                {
                    for (int i = 1; i < el.Children.Count; i++)
                    {
                        HtmlElement elm = el.Children[i].Children[1].Children[0].Children[0];
                        if (elm != null)
                        {
                            string key = elm.GetAttribute("href").Replace("http://www.nicovideo.jp/watch/", "");
                            if (!treeView1.Nodes.ContainsKey(key))
                                treeView1.Nodes.Add(key, elm.InnerText).Tag = key.Replace("sm", "");
                            else
                                treeView1.Nodes[key].Text = elm.InnerText;
                        }
                    }
                }
            }
            else if (0 <= e.Url.ToString().IndexOf("http://www.upload.nicovideo.jp/edit?f="))
            {
                textBox1.Text = webBrowser1.Document.GetElementById("movie_title").GetAttribute("value");
                textBox2.Text = webBrowser1.Document.GetElementById("movie_detail").OuterText;
            }
        }

        private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            webBrowser1.Navigate($"http://www.upload.nicovideo.jp/edit?f={e.Node.Tag}");
            textBox3.Text = "sm" + e.Node.Tag;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            webBrowser1.Document.GetElementById("movie_title").InnerText = textBox1.Text;
            webBrowser1.Document.GetElementById("movie_detail").InnerText = textBox2.Text;
            webBrowser1.Document.GetElementById("submitbtn").InvokeMember("click");
        }
    }
}
```

前回から付け加えたのは次の点です。

- Buttonコントロールを追加し```button1_Click```イベントを作成
- ```button1_Click```イベントにて```"movie_title"```と```"movie_detail"```エレメントへInnertTextで編集結果を設定
- ニコニコ動画側の更新ボタンをDeveloper ToolsでIdを調べて、clickを呼び出し

これだけです。
前回取得が出来ているので、取得した項目を上書きし、実行させるだけです。

以下、十差に作成したツールの動作の様子を動画にしましたのでご覧ください。
[ニコニコ動画の動画説明文をすばやく編集するためのツールを作ってみた ](https://youtu.be/jGtBCxDGE1E)

以上