OmniAICreator/Qiita-1.07M huggingface dataset:
東大が大学ランキング首位から転落！？ 人工知能が国を管理する近未来社会、シンガポールが１位なら納得かも。。

## 東大がアジア大学ランキング１位から７位に転落
> イギリスの教育専門誌がアジア各国の大学の最新のランキングを発表し、シンガポールの大学がトップに立った一方、このランキングで３年連続でトップだった東京大学は７位に転落しました。
>[NHK NEWSより](http://www3.nhk.or.jp/news/html/20160621/k10010563841000.html)

って報道を見て、朝から*「いや、待てよ１位がシンガポール？東大も負けてないっしょ、おいいい！？」*と憤慨していた。

で、録画してあった**「NHKスペシャル：人工知能は天使か悪魔か」**でシンガポールが取り上げてたのを思い出した。それを見て、*「シンガポールが１位ならしょうがないか。。」* って納得して思わず書いたエントリー。

いやシンガポールやばいっすよ、まじ。**人工知能を国ぐるみで有効活用**している、アジアの小さい巨人でしたわ。

## シンガポールの人工知能事情
シンガポールは国土が狭い。人口密度は世界第２位で、東京都の人口密度も軽く上回っている。そんな中国際社会で生き残っていくために、国ぐるみで人工知能を活用した効率化社会を実現しようとしている。

NHKスペシャルの「人工知能は天使か悪魔か」で、シンガポールのスマートシティ大臣みたいな人が
> 人工知能で国を効率化する。シンガポールはその実験室になる。

みたいなことを言ってて、すっげーやる気だな、、って感心した。。

実際の取組を見てみても、

- **渋滞を未然**に防ぐ
- 国営マンションの住人の健康状態の把握
- 銀行でワイロなどの不正を事前に察知！

など。これを国と企業が協力して進めているんだから、凄まじい。自国の国際社会での状況などをしっかり把握してやっててすごい。。

いくつか簡単に紹介。

## 人工知能で不正を監視！

シンガポールの銀行が取り入れている人工知能。従業員の行動やチャット、社内メールの内容を解析して、*不正をしそうな人指数*みたいなものを定義。それを元に、収賄とかインサイダー取り引きとかを未然に防いでるのだとか。

その的中率は**約9割!!**とんでもねぇ。。

## 老人の孤独死はさせない！

シンガポールの国営マンションには監視するためのカメラを全ての部屋に設置するらしい。監視と言っても悪い使われ方は一切していなくて、
- 普段とは違う行動をしている人の健康状態の把握
- 異常があればその緊急度を察知して、家族や医師に連絡するかを判別
- みんな幸せ！ばんざい！

ってなるとか。日本の老人を全てこういった国営マンションに住ませて、**日常生活に困ってる度**を人工知能で計測。それが高い順に老人ホームとかに入れてあげるとかしたらもっと世の中は幸せになりそうだなぁ。。って思った

## 人工知能で渋滞改善

車の平均速度を測定、渋滞が起こる前兆の速度みたいなものを人工知能を活用して測定。それを検知すると、**青信号の時間を延ばして**渋滞を未然に防ぐらしい。。

こんな感じの社会は近未来だと思ってたのに、すぐ近くの国で実現されているなんておったまげた
とんでもねぇな、シンガポール！！

### 運営ブログ
[東大が大学ランキング首位から転落！？ 人工知能が国を管理する近未来社会シンガポール](http://u-kan.hatenadiary.jp/entry/univ-ranking)
Realtek Ameba  のイメージフォーマット

Realtek ameba　(RTL8711AF, RTL8711AM, RTL8195AM)のファームウェア書き込み用イメージフォーマットについて調べました。


Realtek amebaではSDKでram_all.binを生成して書き込みツールで書き込みます。
イメージ生成ツールを作成したいのでram_all.binのフォーマットについて調べました。

# ram_all.bin のフォーマット
* 形式はバイナリ
* 0x0000-0x7FFF は Image1 と呼ばれるブートローダーの領域。sdkに含まれるram_1.p.binの内容をコピーする
* 0x8000-0x8FFF 予約領域 0xFFでパディング
* 0x9000-0x9FFF は　0xFFでパディング。　flashのこの領域にはmacアドレス等の設定データが含まれる。ファームウェア書き込み時には、設定データを保持するためにこの領域は書き換えない。
* 0xA000-0xAFFF は0xFFでパディング。flashのこの領域はWLANのRFの調整値が含まれる。上と同様に書き換えない。
* 0xB000 以降が Image2と呼ばれる ファームウェアの領域。ファームウェアにはSRAM領域とSDRAM領域の二つが含まれる。
 * 0xB000の先頭16バイトはヘッダ
 * 4バイトはSRAM領域のサイズ
 * 4バイトはSRAM領域をARMメモリマップ上に配置する際のアドレス(0x100060000)
 * 8バイトはsignature.デフォルトのsignatureは "81958711"の文字列
 * 16バイト目以降がSRAM領域のコードとデータ
 * ４バイトはSDRAM領域のサイズ
 * 4バイトはSDRAM領域をARMメモリマップ上に配置する際のアドレス(0x３00000000)
 * ８バイトは0xffでパディング
 * 16バイト目以降がSDRAM領域のコードとデータ

# ram_all.binの例
* Image2のSRAM領域のヘッダ

```
000b000 60 01 03 00 00 60 00 10 38 31 39 35 38 37 31 31
```

* Image2のSDRAM領域のヘッダ 
* SDRAM領域は0xb010 + SRAM領域のサイズ(この例では0x30160) = 0x3b170から始まる。

```
003b170 20 b2 00 00 00 00 00 30 ff ff ff ff ff ff ff ff
```



# 参考
* SDKに含まれる UM0034 Realtek Ameba-1 memory layout.pdf
【ES6】Promiseクラスの基本的な使い方

# 概要

なんとなくで利用していたPromiseクラスについて、用語の整理とともににまとめ直します。

# Promiseとは

* 非同期処理を抽象化したオブジェクトとそれを操作する仕組み。
* Promiseクラスから生成されたオブジェクトは、then/catchなどの関数が使える。

# Promiseのインスタンス化

想定として単純な非同期通信(GET)をPromiseで実装する。

```js:common.js
let getURL = (URL) => {
  return new Promise((resolve, reject) => {
    let req = new XMLHttpRequest();
    req.open('GET', URL, true);
    req.onload = () => {
      if (req.status === 200) {
        let result = JSON.parse(req.responseText);
        resolve(result);
      } else {
        reject(new Error(req.statusText));
      }
    };
    req.send();
  });
};
```

getURL関数の実行によりPromiseオブジェクトをreturnする作りになっている。
Promiseクラスには、初期化時の引数として関数を渡す。
関数には **[resolve]** **[reject]** というPromiseクラス内部で利用する引数を与える。

resolveが呼び出された場合、Promiseオブジェクトの状態は **[Fullfilled]** となり成功状態となる。
rejectが呼び出された場合、 **[Rejectd]** となり失敗状態になる。

# Promiseオブジェクトの利用

```js:common.js
const URL = 'http://httpbin.org/get';

getURL(URL)
  .then((value) => {
    console.log(value);
  })
  .catch((error) => {
    console.log(error);
  });
```

先程作成した、getURL関数を実行する。
関数を実行するとPromiseオブジェクトが状態を保持して返って来る。
([Fullfilled]か[Rejected]か)
この[Fullfiled]か[Rejected]かどちらかの状態を保持しているPromiseオブジェクトの事をSettled状態(不変)という。

もし、Fullfiled状態なら、[then]関数が実行され、Rejected状態なら[catch]関数が実行される。(よくある非同期処理)

これで一連のPromiseを使った処理が完了し、PromiseオブジェクトはPending(保留)状態となる。

# 用語整理

* **resolve**
    * Promiseオブジェクトをインスタンス化する際の、関数の引数に渡す。resolve関数が呼ばれた際はPromiseオブジェクトのthenメソッドを実行する。resolve関数の引数は、thenの引数に当たる。
*  **reject**
    *  Promiseオブジェクトをインスタンス化する際の、関数の引数に渡す。reject関数が呼ばれた際はPromiseオブジェクトのcatchメソッドを実行する。
* **Fullfilled**
    * resolve関数の実行状態を持ったPromiseオブジェクト。
* **Rejected**
    * reject関数の実行状態を持ったPromiseオブジェクト。
* **Pending**
    * Promiseオブジェクトがインスタンス化された初期状態。(FullfilledでもRejectedでもない)
* **Settled**
    * FullfilledかRejected状態かどちらかの状態になっているPromiseオブジェクト。


# 終わり

Angularの$qやjQueryのdifferなど何気なく使っていたPromiseですが、ES6で標準仕様となった為、
再度勉強しなおしました。
今回は、基本中の基本ですが、次回以降でPromiseの使い所や、使うメリット・デメリットを記載していこうと思います。
クラウド環境のサーバコピー注意点

クラウド環境をコピーすると、NICのデバイス情報までCOPY元のまま。
COPYした環境を起動後、注意すべき点を記載。

1./etc/udev/rules.d/70-persistent-net.rules  を確認して、古い情報は削除。
  削除後、OS再起動すれば現在のNIC情報が記載されます。
  ※ 古い情報かどうかは、MACアドレスを確認すればすぐ分かる。
2. ホスト名の変更
3. クラウドによって勝手にIPアドレスやゲートウェイが設定されていないか確認。
   /etc/sysconfig/network に勝手にGATEWAYの記載が入ってないか。
4. COPY元のNIC情報が残ってないか確認。
   /etc/sysconfig/network-scripts/ifcfg-**** のUUID（削除していい）、MACアドレスを確認。
MacVimである日突然Ctrl+Uが効かなくなった時に疑うべきこと

El Capitan(10.11.4)
MacVim 7.4
で確認しています。

Ctrl+Uには半ページ戻るがキーバインドされているわけですが、なぜか効かない。効かないとストレス。
なんか変な設定加えたっけ、と.vimrcや.gvimrcをコメントアウトしても症状変わらず。

結局頼りになるのはstackoverflow先生。

> Ctrl-U doesn't work in MacVim
http://stackoverflow.com/questions/29712392/ctrl-u-doesnt-work-in-macvim

なんとことえりの設定のせいらしい。

El Capitanのlive conversionをONにした時、Enterを2回叩かないと確定しないのがうざくて、Windows-like shortcutsをONにしたのでした。（こうするとEnter1回で確定する)


<img width="300" alt="Screen Shot 2016-06-21 at 11.31.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/74328/5f535a41-7ba6-ce92-d77e-c571d8992fe7.png">



live conversionをOFF、Windows-like shortcutsもOFF。
これでCtrl+Uが復活。

めでたしめでたし。
本当に10分で始めるAngular2RC2開発

今回Angular1ベースのプロジェクトをAngular2に移転する作業をしました。node.jsプロジェクトは設定が難しくて大変ですが、今回は[angular-cli](https://github.com/angular/angular-cli)のおかげさまで簡単に終わりましたので記録を残します。

 
開発環境はマックブックですけど、他のプラットフォームでもそんなに変わりはないと思います。まずはnpmをインストールします。マックではnvmを利用して簡単に設置、管理出来ます。

```
brew install nvm
nvm install v6
```
v4でも良いでしょう。

angular-cliを使うためには以下のライブラリが必要です。

```
npm i -g eslint angular-cli typings
``` 
v6ではまだ警告メッセージが表示される場合がありますが、動作には問題ありませんでした。気になる方はv4で挑戦してみてください。
そして、見る通り、angular-cliはまだbetaなので、これからどう変わるか分かりません。このマニュアルの寿命も1ヶ月しないかもしれませんね。


そろそろ本格的にプロジェクトを生成しましょう。

```
cd ~/path_to_projects
ng new project
```
ngコマンドを使って簡単に生成出来ます。この段階で終わるのが理想ですが、angular-cliはまだRC２に対応してないので、ライブラリのバージョンアップと[angular/forms](https://docs.google.com/document/u/1/d/1RIezQqE4aEhBRmArIAS1mRIZtWFf6JxN_7B4meyWK0Y/pub)の適用が必要です。
 
私はAngular2の作業の為に[VS Code](https://www.visualstudio.com/en-us/products/code-vs.aspx)を使っています。viでもなんでもいいですが、やっぱりintellisenseは楽ですね。以下は私が使ってるプラグインです。

```
EditorConfig.EditorConfig-0.2.7/
christian-kohler.npm-intellisense-0.1.1/
dbaeumer.vscode-eslint-0.10.16/
johnpapa.Angular2-0.4.4/
```

これからはファイルの修正です。生成したプロジェクトフォルダーにあるpackage.jsonを修正します。

```
  "dependencies": {
    "@angular/common": "2.0.0-rc.2",
    "@angular/compiler": "2.0.0-rc.2",
    "@angular/core": "2.0.0-rc.2",
    "@angular/http": "2.0.0-rc.2",
    "@angular/forms": "0.1.0",
    "@angular/platform-browser": "2.0.0-rc.2",
    "@angular/platform-browser-dynamic": "2.0.0-rc.2",
    "@angular/router": "3.0.0-alpha.7",
...
```
rc.1をrc2に変えてrouterをlpha.3からalpha.7にします。@angular/formsの追加も忘れずに。

 

src/main.tsにhttpとforms関係の設定は追加します。

```
import { bootstrap } from '@angular/platform-browser-dynamic';
import { enableProdMode } from '@angular/core';
import { AwardResultComponent, environment } from './award-result/';
import { HTTP_PROVIDERS } from '@angular/http';
import { disableDeprecatedForms, provideForms } from '@angular/forms';

if (environment.production) {
  enableProdMode();
}

bootstrap(AwardResultComponent, [HTTP_PROVIDERS, disableDeprecatedForms(), provideForms()]);
```
disableDeprecatedFormsはRC2専用なので、RC3が出たら削除する必要があります。

 

src/system-config.tsにformsを追加します。

```
const barrels: string[] = [
...
  '@angular/forms',
...
``` 

ファイルの修正は終わりました。これからプロジェクトを始めましょう。

```
npm install
ng serve
```
http://localhost:4200/ に接続してapp works!メッセージが見えたら成功です。src/app/app.component.tsでtitleを変更して、自動にブラウザに反映されるか確認してください。もしbuilt-inサーバーが要らないならbuild –watchで十分です。

```
ng build --watch
```
これで終わりです。ng newからng serveまで本当に１０分もかからないです。

 
私の場合はbuilt-inサーバーの代わりにnginxを利用して作業をしましたが、dist/index.htmlをベースにページを作り、System.jsにbaseURLを設定したらなんの問題もなくAngular2が動作しました。

```
System.config({baseURL:'/path-to-projects/project/dist/'});
```

angular-cliを触ってみた感想はグーグル様はやっぱすごいってことでした。ngコマンドでいろんなことが可能なので、本当に別途に設定することがないくらいでした。

環境設定が簡単に終わったので残ったのはいいアプリを作成することです。[typescript](https://www.typescriptlang.org/)に慣れて、 angular2 quickstartやangular2 seedなどのサンプルを参考しに、素敵なアプリを作ってみましょう。言い忘れましたが、テストの為の[jasmine](http://jasmine.github.io/)、[karma](https://karma-runner.github.io/0.13/index.html)やajaxの為の[rxjs](https://github.com/ReactiveX/rxjs)も知っておくべきです。
Circle CIでAndroid Support Library v24.0.0を使ったプロジェクトのビルドを通すまで

ほとんど [Rocket.Chat.Android.LilyをCircle CIで自動ビルドしてFabric betaにアップロード](http://qiita.com/YusukeIwaki/items/dcc8a2b047a170cdf82b) で書いたのと変わりませんが、
今回は、会社の公式アプリをAndroid SDK v24対応するときにすこ～しだけハマったので、共有です。


## android-24が無いと言われる

```
* What went wrong:
A problem occurred configuring project ':app'.
> failed to find target with hash string 'android-24' in: /usr/local/android-sdk-linux
```

Circle CIはすぐに最新のSDKには対応してくれないので、手動でDependencyを追加する必要があります。

*Pre-dependency commands* の末尾を以下のようにします

```
git submodule init && git submodule update
echo "sdk.dir="$ANDROID_HOME > local.properties 

echo y | android update sdk --no-ui --all --filter tools
echo y | android update sdk --no-ui --all --filter android-24 ## 追加 ##
echo y | android update sdk --no-ui --all --filter extra-android-m2repository,extra-android-support
echo y | android update sdk --no-ui --all --filter extra-google-m2repository,extra-google-google_play_services
echo y | android update sdk --no-ui --all --filter build-tools-24.0.0 ## 変更 ##
```


## Java8を用意しろと言われる

```
> Building 65%Caused by: java.lang.RuntimeException: compileSdkVersion 'android-24' requires JDK 1.8 or later to compile.
> Building 65%	at com.android.build.gradle.tasks.factory.AndroidJavaCompile.compile(AndroidJavaCompile.java:44)
> Building 65%	at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
```

なので、[以前の記事](http://qiita.com/YusukeIwaki/items/dcc8a2b047a170cdf82b#java_home%E3%81%AE%E8%A8%AD%E5%AE%9A)でも書いてたように、環境変数のJAVA_HOMEを設定します。

|    key    |         value         |
|:---------:|:---------------------:|
| JAVA_HOME | /usr/lib/jvm/jdk1.8.0 |


## これで・・・

![image](https://qiita-image-store.s3.amazonaws.com/0/74571/b2ed1260-d8a8-d679-e0de-21ca825d0372.png)

ｷﾀ━━━━(ﾟ∀ﾟ)━━━━!!　となります。
動的にInMemoryのテーブルを生成し、SQL Serverのテーブルにデータを追加する方法

テーブルを動的に生成して、DBに突っ込む方法。

#SSISパッケージの作り方

- スクリプトタスクを追加する。
- ユーザー変数にObject型の変数を追加する。
- スクリプトタスク内でRecordSetを生成し、ユーザー変数に代入
- Foreach ループ　コンテナー追加し、ADO型で用意したユーザー変数から値をとる。
- ループ内にSQL実行タスクを追加し、DBにINSETする。


RecordSet内のカラムで、ADODB.DataTypeEnum.adVarChar型の変数にNULLが入っていると次のエラーが。
取り急ぎ空文字を入れて回避した。

`変数 "User::XXXXX" に代入されている値の型 (DBNull) が、現在の変数の型 (String) と異なります。変数の型は実行中に変更できません。変数の型は厳密に一致している必要があります。ただし、オブジェクト型の変数は除きます。`


コチラのサイトに、データフロータスクのソースにスクリプト コンポーネントを利用する方法が記載されているので参考にされたし。
https://www.timmitchell.net/post/2015/04/20/using-the-ssis-object-variable-as-a-data-flow-source/
intra-martのテナント環境セットアップ時にjava.sql.SQLExceptionが発生したときの対策

# 前提

intra-martのテナント環境セットアップ時にエラーが発生し失敗した際の対策方法です。
以下の環境での情報となります。

|app       |version|
|----------|-------|
|resin     |4.0.48 |
|intra-mart|8.0.11 |
|Oracle    |12c    |
|Postgresql|9.5.3  |

# エラー内容

セットアップ後、以下のようなエラーが発生します。

![セットアップ結果.png](https://qiita-image-store.s3.amazonaws.com/0/124612/a8dc4531-c4c9-4f42-e698-a176660466d4.png)

ログを確認すると以下のExceptionが発生しています。
ログの確認手順：[インポートエラーの原因をログから追跡する]

```bat:oracle
java.sql.SQLException: Schema changed
```

```bat:postgresql
org.postgresql.util.PSQLException: ERROR: cached plan must not change result type
```

# 対策

resin-web.xmlのprepared-statement-cache-sizeを「0」に設定することで、エラーを回避可能です。
テナント環境セットアップ処理中のみ「0」に設定し、その後はもとの値に戻すという作業が必要そうです。

resin-web.xmlの設定方法は以下となります。
[プリペアドステートメントキャッシュ設定]

後で気づいたのですが、以下のintra-martのドキュメントにて対応策が記載されていました。
Exceptionの内容でググっていて、ドキュメントになかなかたどりつけませんでした。
[Resin で PreparedStatement の キャッシュサイズに大きな値を指定している場合にテナント環境セットアップが失敗する]




[インポートエラーの原因をログから追跡する]:http://www.intra-mart.jp/download/product/iap/im_core/im_log_specification/texts/appendix/index.html#インポートエラーの原因をログから追跡する

[プリペアドステートメントキャッシュ設定]:http://www.intra-mart.jp/document/library/iap/public/configuration/im_configuration_reference/texts/resin/resin-web/index.html#プリペアドステートメントキャッシュ設定

[Resin で PreparedStatement の キャッシュサイズに大きな値を指定している場合にテナント環境セットアップが失敗する]:http://www.intra-mart.jp/download/product/iap/setup/iap_setup_guide/texts/appendix/prepared_statement_cache_size.html
MicrosoftAccessでコンボボックスの入力を固定値で行う

MicrosoftAccessで、コンボボックスの入力値にマスタテーブルなどを使わず、選択肢から固定値で行わせる方法の1つをご紹介しよう。なお、テキストボックスで選択肢を表示するのはよくわからなかったから諦めた。素直にコンボボックスを使おう。
使ってるバージョンはAccess 2013。

#書式タブ「列数」は1
列数は1だぞ。列幅は空欄にしておこう。

#データタブ「値集合ソース」と「値集合タイプ」を設定する
- 値集合ソースは「値リスト」
- 値集合タイプにセミコロン区切りで「値;値;値」の順で設定

```
"";○;×
```

これで設定終了だ。
マスタテーブルとか作ってやるのが正着手だけど、そんなの面倒だって時は手っ取り早くていいぞ。
npm moduleを検索するサイトまとめ

## npm module の検索するのに使っているサイト

※ぶっちゃけただ qiita slide mode を使ってみたかっただけである

---------------


## [npmjs.com](https://npmjs.com)

---------------

## npmjs.com

- 言わずと知れた公式サイト
- 公式なのでユーザーは一番多い（と思う）
- 自分は割りと　npm star をよく見る

![image](https://qiita-image-store.s3.amazonaws.com/0/6031/fe58baf3-fddc-db47-21ca-6af5bf961bbb.png)

---------------

## npmjs.com

- 検索は多分 couchdb
- package.json に書かれている description, keywords, name などがindex されているっぽい
- 検索時の sort 順は star 数とか検索の一致度合いで sort されている...? 

---------------

## [npmsearch.com](https://npmsearch.com)

----------------

## npmsearch.com

- elasticsearch に食わせてそこから検索

![image](https://qiita-image-store.s3.amazonaws.com/0/6031/196759b0-8cce-d13b-1443-bf09434354d7.png)

----------------

## npmsearch.com

- rating という独特の重み付けがあり、それが dependent 数、 ユーザー数、リリース頻度、テスト数、readme の充実度からなっている
- クエリーが elasticsearch のそれをそのまま使えて検索式が柔軟
- 公式は検索するのにpackage.json の description と keywords しか拾ってくれないが、こっちは README に書かれてる言葉まで拾ってくれる

```
curl "http://npmsearch.com/query?q=dom&fields=name"
```

---------------

## [npms.io](https://npms.io) 

---------------

## npms.io

- npmsearch.com と同様、　elasticsearch を食わせる形式
- 検索式はただの and だけっぽい(npmsearch.com ほどの充実した検索式はない)

![image](https://qiita-image-store.s3.amazonaws.com/0/6031/6183cbe0-8d4e-1185-6c73-ed60729570e6.png)

---------------

## npms.io

rating 機能がついてて下記の基準で計算される

- popularity (npm star, github star の数など)
- quality (test数とcoverage)
- maintenance (リリース頻度とかcommit頻度、open/close issue比率)
- personality (コミュニティの中での知名度(github follow数とか？))

※ personality については深く言及するのを避けててそれもまた面白い

----------------

## [node-modules.com](http://node-modules.com)

----------------

## node-modules.com

- mongodb に indexing している形式

![image](https://qiita-image-store.s3.amazonaws.com/0/6031/eb4b110c-51b0-882d-a756-7cf040625e80.png)

----------------

## node-modules.com

- personalized 機能がある
- githubやnpmでstarを付けていると優先的にヒットする

----------------

## まとめ

- npmjs.com 公式で安心
- npmsearch.com queryに応用が効く
- npms.io stats の付け方が面白い（特にpersonality)
- node-modules.com (personalized 機能がある)
CSVファイルをElasticsearchに取り込んでみる

分析につかうCSVファイルをElasticsearchに取り込んでみたときのメモ。
環境はOS X El capitan。Javaは1.8.0_05。

簡単な役割紹介（僕の理解）：
Embulk*1：CSV取り込み、パーサー。
Elasticsearch：取り込み先。
Kibana：表示。

参考資料：
Elasticsearch参考記事：チュートリアルを一通り実施。
https://www.elastic.co/guide/en/elasticsearch/reference/current/getting-started.html

Embulk参考記事：大変お世話になりました。
http://www.embulk.org/docs/recipe/scheduled-csv-load-to-elasticsearch-kibana4.html
http://n-agetsuma.hatenablog.com/entry/2016/02/24/224437

#インストール

## 1. Elasticsearch
[ココ](https://www.elastic.co/downloads/elasticsearch) からzipをダウンロードして作業用フォルダに展開。バージョンは2.3.3（以下確認）

```
$ elasticsearch-2.3.3 ./bin/elasticsearch --version
Version: 2.3.3, Build: 218bdf1/2016-05-17T15:40:04Z, JVM: 1.8.0_05
```

[ココ](https://github.com/mobz/elasticsearch-head)にある便利なプラグインを入れておく。

```
$ elasticsearch-2.3.3 ./bin/plugin install mobz/elasticsearch-head
```

動作確認：httpでRESTが実現できる。デフォルトは9200番。ブラウザで、以下叩いてみて下さい。
`http://localhost:9200/_plugin/head/`

## 2. Embulk
[ココ](http://www.embulk.org/docs/recipe/scheduled-csv-load-to-elasticsearch-kibana4.html)を参考にEmbulkをダウンロードして作業用フォルダに展開。
latestは執筆現在V0.8.9。バージョンは0.8.9（以下確認）

```
$ curl --create-dirs -o ~/.embulk/bin/embulk -L "http://dl.embulk.org/embulk-latest.jar
$ echo 'export PATH="$HOME/.embulk/bin:$PATH"' >> ~/.bashr
$ source ~/.bashrc
$ embulk embulk --version
$ embulk 0.8.9
```
Elasticsearch用のプラグインを導入。

```
$ embulk gem install embulk-output-elasticsearch
```

## 3. Kibanaインストール
[ココ](https://www.elastic.co/thank-you?url=https://download.elastic.co/kibana/kibana/kibana-4.5.1-darwin-x64.tar.gz) からダウンロードして作業用フォルダに展開。バージョンは4.5.1（以下確認）。

```
$ kibana-4.5.1-darwin-x64 ./bin/kibana --version
4.5.1
```

動作確認：ブラウザで以下叩いてみて下さい。Kibanaはポート5601
`http://localhost:5601/`


*1 Logstashのcsvプラグインを当初使った。一度取り込んだデータを使ってテストした際に、一度取り込んだデータを再度取り込まないような仕様になっている関係のところで躓いて挫折。。。また分析用CSVがWindowsからのコピーで、文字コードと改行コードの問題でEmbulkを選択。
Check! Visual Studio Code で PHP をデバッグ実行 (Xdebug)

こんにちは、オークファンの @dz_ こと大平かづみです。

Prologue - はじめに
====
プライベートでも使っている Visual Studio Code で PHP デバッグができるように、 PHP Debug の拡張機能を導入してみました！

![20160621_vscode_006.png](https://qiita-image-store.s3.amazonaws.com/0/3812/792dca72-27e0-0086-547b-1202106d2721.png)



Visual Studio Code とは？
----
さて、 [Visual Studio Code](https://code.visualstudio.com/ "Visual Studio Code - Code Editing. Redefined") は、Microsoft 製のオープンソースのエディタです。

Javascript をはじめ、 PHP もある程度補完してくれ、シンプルながら使いやすいエディタです。Windows はもちろん、Mac, Linux でも利用できるので、両刀遣いとしても重宝します。

[Visual Studio Code > Debuggers > PHP Debug](https://marketplace.visualstudio.com/items?itemName=felixfbecker.php-debug "PHP Debug | Visual Studio Marketplace")

前提
====

- 接続先のサーバーに [xdebug](https://xdebug.org/ "Xdebug - Debugger and Profiler Tool for PHP") がインストールされていること

おおまかな流れ
============
- 接続先サーバーの xdebug を設定する
- Visual Studio Code の拡張機能をインストールする
- Visual Studio Code デバッグ設定をする

手順
====
接続先サーバーの xdebug を設定する
-------------------------------
接続先サーバーの xdebug の設定が以下のようになってることを確認してください。

```ini
xdebug.remote_enable=1
xdebug.remote_autostart=1
```

Visual Studio Code の拡張機能をインストールする
-------------------------------------------
Visual Studio Code のコマンドパレットを開き、「ext install」と入力して、「Extensions: Install Extension」をクリックします。
![20160621_vscode_002.png](https://qiita-image-store.s3.amazonaws.com/0/3812/da863264-15a6-816e-1a19-95325e16ba7e.png)

`PHP Debug` をクリックし、インストールします。
![20160621_vscode_005.png](https://qiita-image-store.s3.amazonaws.com/0/3812/ec6e4d03-1a97-55a4-3408-37ba358b00d9.png)

Visual Studio Code のデバッグ設定をする
====
Visual Studio Code で、デバッグするコードを含むディレクトリを開きます。

デバッグ画面を開き、歯車のマークをクリックし、環境設定を開きます。
![20160621_vscode_001.png](https://qiita-image-store.s3.amazonaws.com/0/3812/0a820b93-5a14-16c7-d4cd-7f95ef03da1b.png)

`launch.json` が開かれるので、以下のように設定します。

```json:.vscode/launch.json
{
  "version": "0.2.0",
  "configurations": [
    //-- ここから
    {
      "name": "Custom Xdebug setting",
      "type": "php",
      "request": "launch",
      "port": 9000,
      "serverSourceRoot": "/var/www/html",
      "localSourceRoot": "${workspaceRoot}"
    }
    //-- ここまで
  ]
}
```

| 項目 | 内容 |
|------|------|
| `name` | 設定の名前 (任意の文字列) |
| `type` | `php` |
| `request` | `launch` |
| `port` | xdebug のポート (デフォルトでは `9000` ） |
| `serverSourceRoot` | 接続先サーバー上のドキュメントルート |
| `localSourceRoot` | ローカルマシン上のソースコードのディレクトリ ( `${workspaceRoot}` は Visual Studio Code で開いているディレクトリ) |

Epilogue - おわりに
====
しばらく使ってますが、とくに不便なく利用しています。ぜひ使ってみてください！
Backlogの課題追加のAPIで分かりにくい点

# はじめに
一括でBacklogの課題（チケット）を作成するために、Backlog APIを使いました。

Backlogの公式リファレンスが少しだけ不親切に感じる箇所があったので、分かりにくかった点を補足します。

（こういう意見みたいなのは、公式にお問い合わせしたほうが良いのでしょうか。）

# 課題の追加のAPI
こちらが課題の追加のAPIの公式リファレンスです。

- [課題の追加 | Backlog API | Nulab Developers](http://developer.nulab-inc.com/ja/docs/backlog/api/2/add-issue)

<!--
## リクエスト例
`curl`でリクエストするなら、次のようになります。
公式のリファレンスにリクエストの例があれば、ここまでハマることは無かったのに…

```bash
crul -X POST --data-urlencode='json={}'
```
-->

## カスタム属性
カスタム属性の説明が不親切でした。

- そもそもカスタム属性というのが何を指しているのか分からず、察する難易度が高めでした。
- パラメータのキーの説明が `customField_{id}` とあるだけでしたので、`id` が何を指していて、値の型が何で、何を入れるのかを察するのが難しかったです。
- ~~必須パラメータであるのに、リファレスンスには必須とは書いていない点も不親切に感じました。~~管理者による設定で必須になっていただけで、本来は必須ではないようでした。すみません。

カスタム属性とは、その名前の通り、管理画面で設定できる課題の属性値のことです。
自分のプロジェクトの設定では、ステータスという名称の属性となっていました。

`customField_{id}`の`id`は、カスタム属性のIDを指しています。カスタム属性が設定されたチケットに対して、[課題情報の取得のAPI](http://developer.nulab-inc.com/ja/docs/backlog/api/2/get-issue)を叩くことで確認できます。表面上は見えないIDです。

keyを動的に変更しないといけないのがトリッキーですね。

後述するように、URLエンコーディングでしかパラメータが渡せないため、ネストしたような構造は渡せません。
苦肉の策で、こういうkeyを動的に指定する微妙な仕様になったのでしょう…

具体例を挙げると、こんな感じです。

```json:GETのレスポンスのカスタム属性の箇所
{
"customFields":[{"id":11223344,
    "fieldTypeId":6,
    "name":"ステータス",
    "value":[{"id":1,
      "name":"未対応",
      "displayOrder":0}]}],
}
```

```text:POSTのカスタム属性の指定例
customField_11223344=1
```

ちょっと難しい。。。

## URLエンコーディング
リファレンスに書いてあるとおり、`Content-Type:application/x-www-form-urlencoded`です。

POST であろうが、パラメータはURLに埋め込まないと読んでくれません。

なぜかPOSTはJSONをリクエストボディに入れる先入観があったために、若干ハマりました。リファレンスはよく読みましょう。。。

## レスポンスコードは201
これもちゃんとリファレンスには書いてあったのですが、レスポンスコードは201です。
200だったら正常という処理をしていたせいで、これもハマりました…

# まとめ
リファレンスはよ〜く読みましょう。

管理者ではない、一般のBacklogユーザにとっては、カスタム属性が何を指すのか察するのは困難でした。
そこの説明はもっと欲しいかなと思いました。
USBメモリの中にリモートリポジトリを作ってバージョン管理する【TortoiseGit】

#はじめに
インターネットが使えない環境でチームでGitでバージョン管理をしたい場合、USBメモリの中に
リモートリポジトリを作ると便利です。

この記事ではTortoiseGitを使ってUSBメモリの中にリモートリポジトリを作り、ローカルリポジトリからリモートリポジトリへプッシュできるようにするまでの手順をご紹介いたします。

#1. ローカルリポジトリを作る
今回は以下のようなリポジトリを扱います。
![Hoge.png](https://qiita-image-store.s3.amazonaws.com/0/44288/94baae1e-2192-5e24-a842-fe3afa15e7ac.png)

#2. USBメモリの中にリモートリポジトリを作る
Git cloneしてUSBメモリの中へリポジトリをコピーします.
<img width = 450 src = "https://qiita-image-store.s3.amazonaws.com/0/44288/981c552e-b044-425e-6319-8e4cab8e54d9.png">

<br>
OKを押すとリポジトリが作られます。
<img width = 450 src = "https://qiita-image-store.s3.amazonaws.com/0/44288/40c3d3b8-e028-8ff3-38c4-54ea04fd8b0b.png">

<br>
リモートリポジトリの中身はこんな感じ
<img width = 450 src = "https://qiita-image-store.s3.amazonaws.com/0/44288/738f8d7d-bb19-2f95-eb4e-a2e7e97513ae.png">

#3. ローカルリポジトリをリモートリポジトリへPushできるようにする
ローカルリポジトリからリモートリポジトリへPushするには、リモートリポジトリのURLが指定されて
いる必要があります。

ローカルリポジトリを右クリック -> TortoiseGit -> Setting
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/9d202133-b041-6c7c-62f3-6404ab92cd27.png" width = 500>


Remoteを以下のように設定
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/4564d2ca-df5a-d4f1-2bed-21f06ea8bad0.png" width = 500>

これでローカルリポジトリからUSBメモリ内のリモートリポジトリへプッシュできるようになります (完)
Rails アプリケーションに Travis CI を設定する


## 概要

Rails のアプリケーションを Travis CI でテストしてみたかったのでやってみました。
Slack への通知方法もまとめました。
今回は Rails 標準のテスティングフレームワークを使ったものが対象になります。

## 準備すること

- Rails アプリ
- GitHub のアカウント

※ Slackへの通知を行いたい場合は Slack アカウントを用意して下さい

## Travis CI の設定手順

1. Github アカウントを使い Travis CI にログインする
1. 対象のリポジトリを選択する
1. リポジトリのルートディレクトリに以下のファイルを作成する

```yml:.travis.yml
language: ruby
rvm: <ruby-version>
services: postgresql
bundler_args: "--without development --deployment -j4"
cache: bundler
before_script:
  - cp config/database.travis.yml config/database.yml
  - bundle exec rake db:create
  - bundle exec rake db:migrate
script: bundle exec rake test
```

`db/schema.rb` が存在する場合は下記のように設定することも可能です。

```yml:.travis.yml
before_script:
  - cp config/database.travis.yml config/database.yml
  - bundle exec rake db:setup
```

また config ディレクトリに以下のファイルを作成

```yml:config/database.travis.yml
test:
  adapter: postgresql
  database: travis_ci_test
  username: postgres
```

変更を GitHub に push すると CI が動きます。

## Slackへの通知手順

この設定を行うと、 Slack のチャンネルに CI の結果を通知できます。

1. Travis CI のコマンドラインツールをインストール

```sh
$ gem install travis
```

1. Slack を開き左上のチーム名をクリックして Customize slack を選択
1. 左上の Menu から Configure Apps を選択
1. Travis CI を追加し Add Configuration を選択
1. 任意のチャンネルを設定し、 token を控える
1. リポジトリのルートディレクトリで以下のコマンドを実行する

```sh
$ travis encrypt "<account-name>:<token>" --add notifications.slack
```

push して Slack に通知されるか確認してください。
Amazon EMR(hive) + 外部メタストア(RDS)を利用した構築メモ



# Amazon EMR + 外部metastore( Amazon RDS for mysql)の構築手順

hive外部メタストアのをRDSで構築し、hiveとhueのデータ両方を格納するDBとする場合の手順。
のほほんと設定しているだけだとエラーが発生して、起動しなかったのでメモ。

## まとめ

Hueもインストールするときは、`create database <hue用のデータベース名>;`を実行してあらかじめつくりましょう。（完）

## Amazon RDS の作成

１．適当に作成する。
２．起動後、必要であればmetastoreアクセスユーザを作成しておく。
３．user,passwordをメモしておく
４．　`create database <hue用のデータベース名>;`を実行してデータベースを作成しておく。
## hive,hueの接続設定をかく。

Amazon EMRの起動設定のConfigurationsで利用する。

```
[{
	"Classification": "hive-site",
	"Properties": {
		"javax.jdo.option.ConnectionUserName": "metastoreにアクセスするためのユーザ",
		"javax.jdo.option.ConnectionPassword": "metastoreにアクセスするためのユーザパスワード",
		"javax.jdo.option.ConnectionURL": "jdbc:mysql://＜RDSエンドポイント＞:3306/<hiveのメタストアのデータを格納するDB名>?createDatabaseIfNotExist=true"
	},
	"Configurations": []
},{
	"Classification": "hue-ini",
	"Properties": {},
	"Configurations": [{
		"Classification": "desktop",
		"Properties": {
			"time_zone": "Asia/Tokyo"
		},
		"Configurations": [{
			"Classification": "database",
			"Properties": {
				"password": "metastoreにアクセスするためのユーザ",
				"engine": "mysql",
				"port": "3306",
				"host": "＜RDSエンドポイント＞",
				"name": "hue用のデータベース名",
				"user": "metastoreにアクセスするためのユーザ"
			},
			"Configurations": []
		}]
	}, {
		"Classification": "beeswax",
		"Properties": {
			"hive_server_port": "10000"
		},
		"Configurations": []
	}]
}]
```

## EMRの起動

ポイントのみ

- Configurationsに上記のJSONを書き込む。このときスペースと改行ははずす。（意味はないかもだけど）
- Security groupを適切に設定する。RDSにEMRクラスタからアクセスできること。
Git2.9でより便利になった差分表示

Git2.9がリリースされ、差分表示がより便利になりました。

- [Git 2.9 has been released | GitHub](https://github.com/blog/2188-git-2-9-has-been-released)
- [Git](http://git-scm.com/)

<i class="fa fa-pencil-square-o"></i> リネーム検知が有効でデフォルトに
------

`diff.renames` オプションがデフォルトで有効になりました。これまでは `.gitconfig` に設定するか、コマンドラインオプションに `--find-renames` を付けることで、ファイルの差分のリネームを検知を有効にしていました。Git2.9からはデフォルトでリネーム検知が有効となりました。

```diff:Git2.8
diff --git a/README b/README
new file mode 100644
index 0000000..778568c
--- /dev/null
+++ b/README
@@ -0,0 +1 @@
+Hello Project
diff --git a/README.md b/README.md
deleted file mode 100644
index 778568c..0000000
--- a/README.md
+++ /dev/null
@@ -1 +0,0 @@
-Hello Project
```

```diff:Git2.9
diff --git a/README.md b/README
similarity index 100%
rename from README.md
rename to README
```

<i class="fa fa-flask"></i> 試験的な差分エンジン
------

新たな差分エンジンが試験的に導入されました。 `.gitconfig` オプションでは `diff.compactionHeuristic`、コマンドラインからは `--compaction-heuristic` で有効になります。新たな差分エンジンは、空白行で区切られたコードの塊を崩さないように差分を表示します。

```diff:git2.8
diff --git a/foo.rb b/foo.rb
index 52cd08e..b543e7a 100644
--- a/foo.rb
+++ b/foo.rb
@@ -1,6 +1,10 @@
 def finalize(values)

   values.each do |v|
+    v.prepare
+  end
+
+  values.each do |v|
     v.finalize
   end
```

```diff:Git2.9
diff --git a/foo.rb b/foo.rb
index 52cd08e..b543e7a 100644
--- a/foo.rb
+++ b/foo.rb
@@ -1,5 +1,9 @@
 def finalize(values)

+  values.each do |v|
+    v.prepare
+  end
+
   values.each do |v|
     v.finalize
   end
```
Java EE7のGlassFish管理コンソールの不具合

業務都合でJava EE7にキャッチアップ。

大昔J2EEはやったし、Sunが悔い改めてEoDを掲げたEJB3?のハンズオンセミナーに参加したことはあるが、一定の距離を置いていた。SpringとかHibernateやってればどうにかなるだろうと思っていたが、書籍をざっと見ると知らないことが多々あることに気づく…。

そうなるとやってみるしかない！

環境は、Win7上で、NetBeansに全てを委ねるという堕落した感じ。DBはMySQLがたまたま入っているという理由で選択。

GlassFishの管理コンソール上で、jdbcのConnection Pools設定で早速試練がｗ

HTTP Status 500 - Internal Server Error
type Exception report
messageInternal Server Error
descriptionThe server encountered an internal error that prevented it from fulfilling this request.
exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
note The full stack traces of the exception and its root causes are available in the GlassFish Server Open Source Edition 4.1.1 logs.
これはGlassFishの既知の問題らしく、以下の方法で対処が可能とのこと。

```
C:\Program Files\glassfish-4.1.1\bin> asadmin create-jdbc-connection-pool --datasourceclassname com.mysql.jdbc.jdbc2.optional.MysqlDataSource --restype javax.sql.DataSource mySqlPool

JDBC connection pool mySqlPool created successfully.

Command create-jdbc-connection-pool executed successfully.

C:\Program Files\glassfish-4.1.1\bin>
```
各種プロパティを上記のコマンドで設定する方法が良くわからなかったので、コマンド実行後にGlassFishの管理GUIでプロパティを追加した

PortNumber 3306
Password *******
User root
serverName localhost
DatabaseName MySQL
AndroidアプリからFirebaseを使う。

AndroidアプリからFirebaseを使ってみたので覚え書き。

なんやかんや説明するよりもコードを紹介した方が話は早いのでとりあえずGitHubに載せた。

https://github.com/akiraabe/HelloFirebase

Firebaseって何？という方は、この辺をご覧ください。

Gihyoの記事：
http://gihyo.jp/dev/serial/01/firebase

本家サイト：
https://www.firebase.com/

本家サイトは当然英語ですが、読みやすいです。

クライアントはWeb(Js)、Android、iPhoneなどがサポートされていますが、ドキュメントやサンプルが結構そろっています。

今回は、題材としては（勉強用なので実用性はおいておいて）チャットアプリとしました。

ポイントは、オフラインでも使える（Firebaseが面倒みてくれる）、Push型で他のクライアントから書き込んだ内容が自動的に表示されるといった点ですかね。

アーキテクチャ的にはFirebaseはデータ管理だけなので、ロジックはクライアントサイドに書くことになり、Webアプリ（Servletなど）をやっているとちょっと発想の転換を要求されます。

このようなアーキテクチャで美しい設計というのはどういうパターンになるのか研究材料として興味があります。
arduinoでXFDを作る。「アラーム君」Linux、MAC版リリースしました。

#Linux、MAC版リリースしました。
[GitHub](https://github.com/Blue-Tone/AlarmBoy)でデモ動画、arduinoのソース、node-serialportのバッチ、Jenkins設定方法を公開しています。
https://github.com/Blue-Tone/AlarmBoy

Wikiに最新の情報を記載しております。
QAのページも書き始めました。

あとは、ドキュメントだな。Jenkinsの設定を画像つきでもう少し詳しく書こうかな。
サーバ監視としての使い方や、メーラから起動する設定も書こう。

Jenkins2.0のパイプラインでも動作確認OKでした。
パイプラインスクリプト良い感じですね！思ってたより使いやすい。
Jenins設定がコピペできますね。


###2号機組立完了
![IMG_4706.JPG](https://qiita-image-store.s3.amazonaws.com/0/128077/c83a3be2-230b-01e5-0b73-0e40ab8f5178.jpeg)


###Makers Bazaar Osaka vol.3出店します！

http://makersbazaar.jp/
2016/7/9(土)、7/10(日)
3500円ぐらいで販売予定です。気になる人は、見に来てください。
技術英語 > little noticed / little known truth / oversight

LOEで聞いたかと思ったが、該当のものを見ても見つからなかったが

> little noticed

http://eow.alc.co.jp/search?q=little-noticed

<hr>

little known truth

というのも何回か聞いたことがある。
「ほとんど知られていない真実」

<hr>
関連して調べてみたのが

http://eow.alc.co.jp/search?q=%E8%A6%8B%E8%90%BD%E3%81%A8%E3%81%97

> 見落とし
oversight（気付くべきことの）
Python3の代入周りのメモ

# 関数定義と代入は毎回新しいオブジェクト編
どこかで見かけた気がするような内容のめも。

```py:In[1]
def a():
    print('a')
f = a
f()
def a():
    print('b')
f()
```

```text:Out[1]
a
a
```

λにしても同じ。

```py:In[2]
a = lambda: print('a')
f = a
f()
a = lambda: print('b')
f()
```

```text:Out[2]
a
a
```

代入でなければ「意図する」動作をする。

```py:In[3]
a = [1]
f = a
print(f)
a.append(1)
print(f)
a = [2]
a.append(2)
print(f)
```

```text:Out[3]
[1]
[1, 1]
[1, 1]
```
詳細はコメントのとおり。

# グローバルに影響を与えたり与えなかったりする編

関数の中で代入するとどうなるか、試してみよう！

```py:In[4]
l = 1
def a():
    l = 2
a()
l
```

```text:Out[4]
1
```

無事、破壊活動に失敗した。
でも、リストを使うと破壊的な活動ができてしまうぞ！やばい！

```py:In[5]
l = [1]
def a():
    l[0] = 2
a()
l[0]
```

```text:Out[5]
2
```

どかーん、、、
この破壊活動のポイント（？）は、引数で渡さなくても中身を変えてしまえるというところ。
関数の中で変数を定義してクロージャを使う場合などは、確かにこのような事が起こっている。

# デフォルト引数にappendすると大変なことになるよ編

PyCharmが以下のような親切なメッセージを出すので試してみた。

> Default argument value is mutable
> 
> This inspection detects when a mutable value as list or dictionary is detected in a default value for an argument. Default argument values are evaluated only once at function definition time, which means that modifying the default value of the argument will affect all subsequent calls of the function. 


```py:In[6]
def a(x=[]):
    x.append(1)
    return x
a()
a()
a()
```

```text:Out[6]
[1,1,1]
```

ファッ！？
同様に、以下のようなこともできる。

```py:In[7]
def a(x=[0]):
    x[0] += 1
    return x[0]
a()
a()
a()
```

```text:Out[7]
3
```
ユーザーローカルの人工知能Bot APIを使ってみた

ユーザーローカルが提供を開始した人工知能Bot APIでちょっと使ってみました。
http://ai.userlocal.jp/

Facebook MessengerBot
Nodejs

Messengerから入力された文字列を言われた通りエンコードして、投げて、帰って来た結果を表示するだけという全くひねりのないBotをつくってみました。

###パラメータは下記の通り
<img width="939" alt="Screen Shot 2016-06-20 at 4.25.28 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/24723/7d609f57-94c9-47d7-34b0-649e07c0b5ca.png">


#####Demoビデオ
https://www.facebook.com/kj.kno000/videos/1835041870056933/

作りかけの Botのコードを部分的に持ってきたので、アレですが。
一応、載せておきます。

FacebookのBotの作り方についてはこちらに詳しい説明があります。
http://qiita.com/pochi-sato/items/f3f5598e36c1fa92d840

```js

router.post('/', function (req, res, next) {
    var messaging_events = req.body.entry[0].messaging,
        replayMessages = [];
    var baseURL = "";
    for (i = 0; i < messaging_events.length; i++) {
        event = req.body.entry[0].messaging[i];
        sender = event.sender.id;
        if (event.message && event.message.text) {
            var typedCommand = event.message.text;
            console.log("typed: ", typedCommand);
            var msg = encodeURIComponent(typedCommand);
            baseURL = "https://chatbot-api.userlocal.jp/api/chat?message="+msg+"&key="+aiKey;
            heyAI(baseURL);
        }
    }
    res.sendStatus(200);
});

function heyAI(url) {
    console.log("heyAI function started!");
    console.log("url",url);
    var options = {
        uri: url,
        gzip: false,
        json: true
    };

    request(options, function (err, response, body) {
        if (err || response.statusCode != 200) {
            console.log("Error/エラーですよ", err);
            return;
        }
        var items = body;
        var apiStatus = items.status;
        var text ="";
        text = items.result;
        text = "Something wrong man!!!!";
        sendTextMessage(sender, text.substring(0,320));
    });
}

```

二期の募集も始まったみたいです。
http://ai.userlocal.jp/#download
emacsの起動時にPATHなどの環境変数を引き継ぐ

[Mac や Ubuntu で Emacs を GUI で立ち上げると PATH の設定が引き継がれない](http://qiita.com/catatsuy/items/3dda714f4c60c435bb25)ので、引き継ぐための方法がいろいろ公開されている。しかし、elispからshellを起動して環境変数を取りに行っているものが多い。

## 自分なりの方法

### Ubuntu 16.04:
環境変数を.bashrcではなく.profileに記述してログインしなおせばemacsにも反映される。環境変数を.profileに書けば済む話？

```bash
$ cp /usr/share/applications/emacs24.desktop ~/.local/share/applications
$ diff /usr/share/applications/emacs24.desktop ~/.local/share/applications/emacs24.desktop 
8c8
< Exec=/usr/bin/emacs24 %F
---
> Exec=/bin/bash -lc "/usr/bin/emacs24 %F"
```

emacs24.desktopをコピーしてExecを変更すると、`.bash_login`に記述した環境変数も反映されるようになる。ログインしなおさなくてもよい。
emacs側で何も設定しなくても、`.bash_login`や`.profile`で設定した任意の環境変数がemacs上で`(getenv "環境変数名")`で取得できた。試しただけで普段は使っていないので不具合などは未確認。

### Fedora 24:
何もしなくても.bashrc, .bash_profileの環境変数が反映される。
ただしログインしなおす必要がある。

### Windows Cygwin + NTemacs:
`run`パッケージをインストール。
適当なフォルダに`C:\cygwin\bin\run.exe`へのショートカットを作成。
ショートカットの名前をemacsなどに変更。
ショートカットを右クリックしてプロパティを設定
リンク先 `C:\cygwin\bin\run.exe zsh -lic /usr/local/emacs/bin/emacs`
(cygwinから見たNTemacs(emacs.exe)へのパス。ログインシェルがbashならzshをbashに変える。)
作業フォルダー `%HOME%`
アイコンの変更 `%SystemDrive%\cygwin\usr\local\emacs\bin\emacs.exe`

cygwinのパスを理解させるために[`setuo-cygwin`](https://www.emacswiki.org/emacs/setup-cygwin.el)をインストール。

```el:init.el
(require 'setup-cygwin nil 'noerror)
```

ショートカットをクリックして起動すれば`.zshrc`などで設定した環境が引き継がれる。

#### 問題点:
windowsの場合は起動に使うshell(zsh)のプロセスがemacsを終了するまでwaitして残る。ウインドウは開かないのでタスクマネージャーで見なければ気にならない。
cygwinは`/etc/profile`や`/etc/zprofile`で環境変数`INFOPATH`を設定する。パスの表記がwindowsの形式ではないのと、セパレータが`;`ではなく`:`であるためntemacsではinfoが読めない。このためinfoに関してはemacs側でパスを再設定する必要がある。

```el:init.el
(when (eq system-type 'windows-nt)
  (setenv "INFOPATH" nil))
(setq Info-additional-directory-list
      '("c:/cygwin/usr/share/info"
	"c:/cygwin/usr/local/emacs/info"))
```
ただし環境変数INFOPATHを消しているので子プロセスにINFOPATHが引き継がれない。

### 参考:
[EmacsでPATHの設定が引き継がれない問題をエレガントに解決する](http://qiita.com/catatsuy/items/3dda714f4c60c435bb25)
[NTEmacs + cygwin or msys2 で exec-path-from-shell](http://qiita.com/KazuSoap/items/ee7a4dec80308dbd1d41)
Raspberry Pi3 Ubuntu 16.04 LTS へ do-release-upgrade で ownCloudが動かなくなったのを治す

# ownCloudが動かなくなったのを治す

「[ownCloud + Raspberry Pi で Google Drive代替 storage を 構築してみる](http://qiita.com/hidenorly/items/8bca74a4da5969f68e53)」 で構築したowncloud環境において、Ubuntu Mate 15.10 -> 16.04LTSへdo-release-upgradeした後に、ownCloudが動かなくなったので、これの修復。。。

php5からphp7へ変更になることからphp5用に入れたモジュールが使えなくなってしまっているので、再度以下を実行

```
$ sudo apt-get install apache2 php mysql-server libapache2-mod-php php-intl php-gd php-xml-parser php-mysql smbclient curl libcurl3 php-curl  php-json php-mysql php-intl php-mcrypt php-imagick php7-zip
$ sudo service apache2 restart
```

(下は不要でしたが一応)

```
# wget -nv https://download.owncloud.org/download/repositories/stable/Ubuntu_16.04/Release.key -O Release.key
# apt-key add - < Release.key
```

(もう１回reinstallしました)

```
# sh -c "echo 'deb http://download.owncloud.org/download/repositories/stable/Ubuntu_16.04/ /' >> /etc/apt/sources.list.d/owncloud.list"
# apt-get update
# apt-get install owncloud owncloud-deps-php7.0 owncloud-files
```

最初のphpのモジュールの追加と、多分、owncloud-filesだけ行えば大丈夫な気がします。
Eclipseをpleiades使って日本語化するときに詰んだところをシェア

#pleiadesを使って日本語化する。
[このへん](http://masatoshitada.hatenadiary.jp/entry/2015/07/08/113222)（大変参考になりました。ありがとうございました）を参照して、Eclipseの日本語化をしていたら、Eclipseのファイル構成が変わっていて詰んだので、シェア。

#Eclipseの変更点
##1.Eclipseのダウンロード方法の変更
Java界隈詳しくないのでいつ変わったのかはわかりませんが、EclipseのダウンロードがEclipse　Installerをダウンロードして、Installerから使用する言語に合わせて落とす形になったようです。 

（注1）コメント欄でご指摘頂きましたが、従来通りのダウンロードも可能です。ただし、Installerの表示がかなり目立っていて、わかりづらいので、下に追記します。（2016.6.21追記）

##2.Eclipseのフォルダ構成の変更 　

（インストーラーを使った場合）どこのサイトをみても、pleiadesのfeaturesとpluginsをEclipseの下層フォルダにある同名フォルダに追記するとあったのだけど、無くなったよう。

（注2）これもコメント欄でご指摘の通り、従来通りのダウンロード方法の場合は、上記2つのフォルダは存在します。（2016.6.21追記）

/Eclipse.app/Contents/eclipse/配下にpleiadesのfeaturesとpluginsをぶっこんだら、うまくいきました。
あとはeclipse.intに追記をすればOKです。

#Eclipseの従来通りのダウンロード方法（2016.6.21追記）
1.
<img width="1224" alt="スクリーンショット_2016-06-21_18_18_58.png" src="https://qiita-image-store.s3.amazonaws.com/0/84190/89899230-1c02-46d4-e02a-0ef3f34bb4a5.png">

2.「画像の文字、インストーラーが目立つけど〜」って、意味不明ですみません。インストーラーのバナーはスルーしてって意味です。
<img width="1227" alt="スクリーンショット_2016-06-21_18_18_38.png" src="https://qiita-image-store.s3.amazonaws.com/0/84190/e6b227ff-4c3b-384a-5232-d92274d7459d.png">

3.
<img width="1232" alt="スクリーンショット_2016-06-21_18_18_17.png" src="https://qiita-image-store.s3.amazonaws.com/0/84190/031f4e71-aa60-19a3-ed53-294d41660957.png">

4.
<img width="1228" alt="スクリーンショット_2016-06-21_18_18_00.png" src="https://qiita-image-store.s3.amazonaws.com/0/84190/9efc86bb-bbe3-bf42-8351-90f9a9923a80.png">

5.
<img width="1237" alt="スクリーンショット_2016-06-21_18_17_58.png" src="https://qiita-image-store.s3.amazonaws.com/0/84190/e220382f-0098-b84a-d8b2-b9e70f256e26.png">
jqueryで任意のnameを振ってあるinputに配列を使ってアクセスする方法

# nameがバラバラ、でも配列にまとめてからアクセスしたいの。。。

　そんな状況にはならないのが一番かもしれませんが、そうもいかないのがシャバというもの。というわけで、下記のようなHTMLがあるとします。

```html:sampleForm.html
<form>
    <input type="text" size="3" name="old" value="32">
    <input type="text" size="10" name="familyName" value="rotelstift">
    <input type="text" size="10" name="favorite" value="oyako_don">
</form>
```

　このinputを配列にまとめたいけど、nameがバラバラだから配列にできないかなぁ。。。

# そうだわ、[serializeArray()](https://api.jquery.com/serializeArray/)さんに甘えてみましょう！

　serializeArray()を使うと、formの要素を.nameと.valueにアクセスできるハッシュの配列にして返してくれます。

```html:sample.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8">
	   <title>Sample</title>
    <script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
    <script>
      window.onload = function () {

        // ここで$("input")に当てはまるinputを配列にする
        var inputAry = $("input").serializeArray();

        for(i = 0; i < inputAry.length; i++){
          // $("[name=" + inputAry[i].name + "]")でアクセスできるようになる
          $("div#hoge").append($("[name=" + inputAry[i].name +"]").val() + "<br />");
        }

      };
    </script>
  </head>
  <body>
    <form>
      <input type="text" size="3" name="old" value="32">
      <input type="text" size="10" name="familyName" value="rotelstift">
      <input type="text" size="10" name="favorite" value="oyako_don">
    </form>
    <div id="hoge"></div>
  </body>
</html>
```

　これでいろんなnameのinputに楽々アクセス！

# 【追記】これって直接inputオブジェクト取れないの？

　結論から言うと、取れません。この場合返ってくるのは.nameと.valueでしかアクセスできないハッシュの配列です。この機能は、単純にそれだけ取れれば用が足りる場合を想定しているっぽい。
　でもそれだけじゃ用が足らないよ、という場合に、```$("[name=" + inputAry[i].name + "]")```という力技でinputオブジェクトを取り直しましょう、というお話です。
SCSSの変数と、CSS3のcalc()を併用するには

SCSSの変数が展開されず文字列としてそのままCSSに出力される問題の解決法です。

## こんなSCSSを書いたとするよ。

```scss:scss
$var: 300px;
.box {
	width: calc( 100% - $var );
}
```

## コンパイル結果（`.css`）は、


```css:css
/* これが理想だけど */
.box {
	width: calc( 100% - 300px );
}

/* 現実はこう（`$var`が展開されず、SCSSがCSSとしてそのまま出力される・・） */
.box {
	width: calc( 100% - $var );
}
```

## これをどうすればいいかというと、こうすればいいらしい。

```scss:scss
$var: 300px;
.box {
    width: calc( 100% - #{$var} );
}
```

## 半角スペースも必要
ちなみに `calc()` の話ですが、四則演算記号の前後には半角スペースが必要です。
これじゃダメ。

```scss:scss
$var: 300px;
.box {
    width: calc( 100%-#{$var} );    // NG
    width: calc( 100% - #{$var} );  // Good
}
```

## おわりに
知らないとそんなことになっているなんて気づきもせずにハマってしまうポイントですね…。
GoでMySQLのエラー番号を取得してユニーク制約違反をハンドリングする

GoでRDBにアクセスするには標準パッケージの[database/sql](https://golang.org/pkg/database/sql/)を使うわけですが、[database/sql](https://golang.org/pkg/database/sql/)の返すエラーは文字列のエラーメッセージ以上の情報を持っていないので、発生したエラーに応じた処理ということができません。例えばユニーク制約違反をハンドリングしたい場合とか。

エラーメッセージの文字列を見てエラーの種類を判別するということも出来なくはないかもしれませんが、最期の手段にしたいところです。

なにか良い方法ないかなーと検索してみたら[こちらのトピック](https://groups.google.com/forum/#!msg/golang-nuts/Bmgvsn-SZ64/jGmmfzXz8LUJ)で、ドライバの生成するエラーがdatabase/sqlでラップされないんなら、型アノテーションでエラーを判別できるのでは？というアイデアが挙がっていました。

というわけで、database/sqlのソースを確認してみたところ、ドライバが生成したエラーはラップされずにそのまま返される様子。そして、[github.com/go-sql-driver/mysql](https://github.com/go-sql-driver/mysql)にはそのものずばりの`mysql.MySQLError`があるではないですか。

というわけで試してみました。

```go
package main

import (
	"database/sql"
	"log"

	"github.com/go-sql-driver/mysql"
)

func main() {
	// CREATE TABLE test (i INT PRIMARY KEY);

	db, _ := sql.Open("mysql", "foobar")

	db.Exec("INSERT INTO test VALUES (1)")

	_, err := db.Exec("INSERT INTO test VALUES (1)")
	if err != nil {
		if mysqlErr, ok := err.(*mysql.MySQLError); ok {
			log.Printf("Number: %d", mysqlErr.Number)
			log.Printf("Message: %s", mysqlErr.Message)
			log.Printf("Error(): %s", mysqlErr.Error())
		}
	}
}
```

実行結果

```shell-session
$ go run main.go
2016/06/20 23:55:57 Number: 1062
2016/06/20 23:55:57 Message: Duplicate entry '1' for key 'PRIMARY'
2016/06/20 23:55:57 Error(): Error 1062: Duplicate entry '1' for key 'PRIMARY'
```

いけました。`Number`フィールドに[MySQLのエラーコード](https://dev.mysql.com/doc/refman/5.6/ja/error-messages-server.html)、`Message`フィールドにMySQLのエラーメッセージが入れられているようです。[MySQLプロトコルのエラーパケット](http://dev.mysql.com/doc/internals/en/packet-ERR_Packet.html)から[取り出された](https://github.com/go-sql-driver/mysql/blob/7ebe0a500653eeb1859664bed5e48dec1e164e73/packets.go#L510)情報のようですね。SQLSTATEに関してはMySQLErrorには含まれないようです

これで詳細なエラー原因を判別することができそうですね。おそらくは保証された動作ではないでしょうから、そこには注意が必要そうですが、文字列で判別するよりは幾分ましかなと。
Silexを1.3系から2.0系にアップグレードしたメモ

※ [Silexを1.3系から2.0系にアップグレードしたメモ #php #silex - mimemo](https://mimemo.io/m/vj5XN4jvY486d73) からの転載です。

---

[Silex](http://silex.sensiolabs.org/) 1.3系から2.0系にアップグレードしたので、自分が使っている範囲で気が付いたことをメモ。内部で使われているDIコンテナである[Pimple](http://pimple.sensiolabs.org/)のバージョンが3系になったのが一番大きな変化。

## Serviceのコンテナへの登録方法が変わった

[Services - Documentation - Silex - The PHP micro-framework based on the Symfony Components](http://silex.sensiolabs.org/doc/master/services.html)

```php
// 1.3まで $app['xxx'] = $app->share(function () use ($app) { /* 返す */ };
$app['xxx'] = function () use ($app) { /* 返す */ };
```

今まで同一のインスタンスを取得するために`share`を書いていたが、いちいち書かなくてよくなった。`share`はメソッドごとなくなった。

## ServiceProviderの仕組みが変わった

[Providers - Documentation - Silex - The PHP micro-framework based on the Symfony Components](http://silex.sensiolabs.org/doc/master/providers.html)

今まで`Silex\ServiceProviderInterface`を実装していたのが`Pimple\ServiceProviderInterface`を実装するように変わった。また`register`メソッドの引数も`Silex\Application`から`Pimple\Container`に変わった。

さらに`boot`メソッドを実装していた場合は`Silex\Api\BootableProviderInterface`の実装として行うこととなった（こちらの引数は`Silex\Application`のまま変わらず）。

もちろん、2つのインターフェースを1つのクラスで実装すれば1.3系のころと同じように使える。

## エラーハンドラーの引数が変わった

[Usage - Documentation - Silex - The PHP micro-framework based on the Symfony Components](http://silex.sensiolabs.org/doc/master/usage.html#error-handlers)

```php
// 1.3まで $app->error(function (\Exception $e, $code) {
$app->error(function (\Exception $e, Request $request, $code) {
```

エラーハンドラーに`Symfony\Component\HttpFoundation\Request`のインスタンスが渡るようになった。エラーハンドラー内でステータスコードで処理を分岐させていた場合、今までコードが渡っていた位置に`Request`にインスタンスが渡ってくるのでうまく動かなくなるので注意。

## 細かいやつ

### `$app['request']`がなくなった

今までだと`$app`に`Symfony\Component\HttpFoundation\Request`のインスタンスが格納されていたのだけれど、入らなくなった。今のコードをできるだけ変えたくないのであれば、自分で`before`ミドルウェアの内部などで格納しておく必要がある。

### `Silex\Provider\UrlGeneratorServiceProvider`がなくなった

なくなった。
カウントアプリ

※ スライドモードを試すために作成しています。

# Xcode
- 7.3.x
- Swift 2.2

---

# Playgorundを作成

![Capture 2016-06-21 0.18.05.png](https://qiita-image-store.s3.amazonaws.com/0/42743/48256cc4-3ba1-b8ec-684b-6dcc656b051f.png)

---

# ソースコード

---

# 最低限必要な枠を作成

```swift
import UIKit
import XCPlayground // プレビュー用

// 表示用ViewController
class ViewController: UIViewController {

}

// プレビュー用に画面を設定
let currentPage = XCPlaygroundPage.currentPage
currentPage.liveView = ViewController()
currentPage.needsIndefiniteExecution = true
```

---

# プロパティを設定

```swift
class ViewController: UIViewController {
    let label = UILabel()
    let button = UIButton(type: .System)

    var count: Int = 0    
}
```

---

# 画面の設定

---
# 画面の背景を設定

```swift
// var count... の下に追加
view.backgroundColor = .whiteColor() // 背景白
view.frame = CGRect(
    x: 0,
    y: 0,
    width: 320,
    height: 568
)
```

---

# ラベルを追加
```swift
//     height: 568 
// ) の後に追加
label.text = "\(count)"
label.textAlignment = .Center
label.backgroundColor = .yellowColor()
label.frame = CGRect(
    x: 0,
    y: 0,
    width: 200,
    height: 100
)
view.addSubview(label)
```

---

# ボタンを設定
```swift
// view.addSubview(label)の下に追加
button.setTitle("カウント", forState: .Normal)
button.addTarget(
    self,
    action: #selector(tapButton),
    forControlEvents: .TouchUpInside
)
button.frame = CGRect(
    x: 0,
    y: 0,
    width: 100,
    height: 50
)
view.addSubview(button)
```

---

# ボタンを押したときの動作を追加
```swift
//     view.addSubview(button)
// } の下に追加
func tapButton() {
    count += 1
    label.text = "\(count)"
}
```

---

# ラベルとボタンをセンターに配置
```swift
//     label.text = "\(count)"
// } の下に追加
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    
    label.center = view.center
    button.center = CGPoint(x: view.center.x, y: view.center.y + 100)
}
```

---

# 完成

---

![image](https://qiita-image-store.s3.amazonaws.com/0/42743/7c11808a-f32f-38b9-00e2-91a629dad605.png)
RustとGoのgithub上のプロジェクト名の傾向

どうでもいいことが気になるたちです。

最近Rustのプロジェクトをいくつか始めたいと思い、リポジトリ名がどうなってるのか気になりました。

## 調査方法
Githubの検索APIを叩いてプロジェクト名拾うスクリプトを組んで調べてみました。プロジェクト数は検索数上限の1000を超えてるのでサンプルはスター数多い順に1000プロジェクトです。実際のスクリプトはリンク先を見ていただければと。

https://gist.github.com/hhatto/5f5cdac4d5f65ae9774e5fa76267bc85

## 結果

### Rust
Rustは`rust`と`rs`がよく目につくのでその2つのキーワードをプレフィックス/サフィックス、`-`か`.`繋ぎか繋ぎなしかでそれぞれ抽出してみました。

 key    | num      | example
--------+----------+------------------
 none | 429                | hoge
 prefix_rust_dash |  270   | rust-hoge
 suffix_rs_dash | 114      | hoge-rs
 prefix_rust | 79          | rusthoge
 suffix_rust_dash |  39    | hoge-rust
 suffix_rs_dot | 33        | hoge.rs
 suffix_rs | 11            | hogers
 suffix_rust | 11          | hogerust
 prefix_rs | 6             | rshoge
 prefix_rs_dash |  5       | rs-hoge
 prefix_rust_dot |  2      | rust.hoge
 suffix_rust_dot |  1      | hoge.rust
 prefix_rs_dot |  0        | rs.hoge


### Go
Goは`rust` `rs`のかわりに`go`だけで調べてみました。

key  | num | example
-----+-----+-----------------
none | 509 |             hoge
prefix_rs | 245       | gohoge
prefix_rs_dash | 168  | go-hoge
suffix_rs | 38        | hogego
suffix_rs_dash | 31   | hoge-go
prefix_rs_dot | 7      | go.hoge
suffix_rs_dot | 2     | hoge.go

## 考察
まぁ以上のような感じでした。好き名前にすればよいのではないでしょうか。

ちなみに以前始めたプロジェクトは [Github上はwoothee-rust](https://github.com/hhatto/woothee-rust) で [パッケージ名自体はwoothee](https://crates.io/crates/woothee) にしました。