OmniAICreator/Qiita-1.07M huggingface dataset:
[UE4]Unreal.jsでBlueprintからJSを実行する

[Unreal.jsプラグイン](http://qiita.com/ConquestArrow/items/bb81ad5e63cf6bc4e549)では通常JSの実行手段は`Javascript`コンポーネントを任意のActorにつけるか、ファイル名を`extension-*.js`とする方法がある。ただし前者では何らかのActorをワールドに出す必要があり、後者はそもそもエディタの拡張用である。

可能なら任意のタイミングでBlueprint(以下、BP)からJS呼び出しのタイミングを制御したい。今回はその方法を簡単に説明する。


# ゲーム起動時にJSを実行：カスタム`GameInstance`クラスで呼ぶ

UE4ではゲームを最初に呼び出したときに`GameInstance`というクラスBPが呼ばれるが、このクラスBPはプロジェクト設定で任意のものに変更ができる。この機能を使ってJSを呼ぶBPを組んでおけば、ゲーム起動時にJSを実行できる。

## カスタム`GameInstance`クラスの準備

1. コンテンツブラウザのメニューから新規でBPクラスを作成する
2. 親クラスに`GameInstance`を指定
3. 適当な名前を付けて保存（例では「HelloFromBP」）
4. メニューのEdit > Project Settings... を選択
5. 「Map & Modes」を選択し、さっき作成したカスタム`GameInstance`クラスを指定
 - ![HelloFromBP_GameInstanceSetting.png](https://qiita-image-store.s3.amazonaws.com/0/54764/793ad329-7c44-0678-e759-95c0b20ebe37.png)

## 呼び出されるJSの用意

`/Content/Scripts/`以下に任意の名前のJSを用意する。今回は以下の内容で。

```js:hi.js
console.log("hi console log!")
```

## BPからJSを呼ぶノードを組む

1. カスタム`GameInstance`クラスをダブルクリックなどしてBPエディタを開く
2. 以下のようなノードを組む
 - ![HelloFromBP_BPcore.png](https://qiita-image-store.s3.amazonaws.com/0/54764/23599ad1-058a-84a0-4105-2713aaba7ccf.png)
 - http://blueprintue.com/blueprint/aqwx-7ba/
3. Event Initから開始
4. `Construct Object from Class`ノードを追加
   - Outerピンには自身`self`
   - クラスは`JavascriptIsolate`を指定
5. `Create Context`ノードを追加
   - Unreal.js導入で追加されるノード
6. （任意）JSからイベントを呼べるように`Expose`ノートを追加
    - 後述
7. `Run File`もしくは`Run Script`ノードを追加
    - `Run File`はファイルを指定するノード。例では`hi.js`を指定
    - `Run Script`は文字列をスクリプトとして実行するノード
    
## BPをコンパイルして実行
![HelloFromBP_console1.png](https://qiita-image-store.s3.amazonaws.com/0/54764/79083abd-29a0-0f76-0601-f4fc483e979e.png)

JavascriptConsoleに上記のログが出ればOK.

※なお`GameInstance`からはそのままでは`GWorld`が取得できないので注意。


# レベル読み込み時に実行：レベルBPから呼び出す

開始のノードが`Event BeginPlay`であること以外は基本的には同じように呼び出せる。

![HelloFromBP_LevelBP.png](https://qiita-image-store.s3.amazonaws.com/0/54764/033568a1-73c7-8142-555d-0ed2c28c6425.png)

もちろん、開始ノードを`Event BeginPlay`以外にすることで任意のタイミングでJSを実行可能。

# おまけ：JSからBPを実行する

カスタム`GameInstance`クラスに`Expose`ノードで名前を付けておくことでJSから呼び出せるようになる。

![HelloFromBP_ExposeNode.png](https://qiita-image-store.s3.amazonaws.com/0/54764/a649edac-bec1-0b9e-7a55-079d5804470a.png)

たとえば`HelloFromBP`と名前を付けておく。

![HelloFromBP_CustomEvent.png](https://qiita-image-store.s3.amazonaws.com/0/54764/df429947-f4d8-2cc1-054c-278a328d45ba.png)

適当な名前(例：「HelloBP」)でカスタムイベントを作成するとそのカスタムイベントを以下の形でJSから呼び出せる。

```js:hi.js
HelloFromBP.HelloBP();
```
![HelloFromBP_PIE.png](https://qiita-image-store.s3.amazonaws.com/0/54764/3d3af45e-3b9c-432b-fa67-e9ec6eec399a.png)

![HelloFromBP_console2.png](https://qiita-image-store.s3.amazonaws.com/0/54764/b65e6716-4338-a0d2-45c0-1adc59034605.png)

なお、Wikiには[クラスBPを継承したクラスをJSで作る例](https://github.com/ncsoft/Unreal.js/wiki/Subclassing)も載っているので併せて読むといいかもしれない。

# まとめ

- BPからJSを呼ぶには以下のノードの組み合わせでできる
    - `Construct Object from Class`
        - クラスは`JavascriptIsolate`を指定
    - `Create Context`
    - `Run File` or `Run Script`
- `GameInstance`やレベルBPなどの任意のBPの任意のタイミングから呼べる
- JSから見えるようにしておけば（`Expose`）JSからBPのカスタムイベントを呼ぶこともできる
Webアプリケーションのセキュリティの依り所

# これは何？
* Webアプリケーションのセキュリティを考える上で依り所となるドキュメントをかき集めたもの
* 何に対して対策していったら良いか？を考える糸口を作るもの

# ドキュメント
## セキュリティ全般（全体）

* PCI DSS（= Payment Card Industry Data Security Standard）
    * クレジットカード業界におけるグローバルセキュリティ標準
    * 使用許諾に同意後、[PDFでダウンロード可能](https://ja.pcisecuritystandards.org/minisite/en/pci-dss-v3-0.php)。（日本語）
* FISC（金融情報システムセンター：Center for Financial Industry Information Systems）
    * FISCより発行される「金融機関等コンピュータシステムの安全対策基準・解説書」のことを指す。
    * [項目例（総務省資料より）](http://www.soumu.go.jp/main_content/000051990.pdf)（日本語）
    * [AWSのFISC回答](https://d0.awsstatic.com/whitepapers/jp/security/FISC_Document_20120824JP.pdf)（日本語）
* ソフトウエアセキュリティ保証成熟度モデル
    * OWASP(=Open Web Application Security Project)によるソフトウェア開発にセキュリティを組み込むための手引き
    * [PDF](https://www.jpcert.or.jp/research/2010/SAMM_20100407.pdf)（日本語）
* ISMS（情報セキュリティマネジメントシステム:Information Security Management System)
    * JIS Q 27001：2014
    * http://kikakurui.com/q/Q27001-2014-01.html (HTML、画像なし、非公式)
    * 元リンクが張れないので、たどり方を。
        * http://www.jisc.go.jp/app/JPS/JPSO0020.html へ行って、「JIS規格番号からJISを検索」の検索テキストボックスに「Q 27001」のキーワードで検索 （ダウンロード禁止、IE Only?）

## Webアプリケーション
* 「安全なウェブサイトの作り方」改訂第7版
    * IPA（情報処理推進機構）発行のセキュリティ対策実装の冊子
    * [PDF](http://www.ipa.go.jp/files/000017316.pdf)(日本語)
* Webシステム／Webアプリケーションセキュリティ要件書 2.0
    * OWASP(=Open Web Application Security Project)によるWebアプリケーション（システム）のセキュリティ要件
    * [PDF](https://github.com/ueno1000/secreq/blob/master/OWASPWebApplicationSecurityRequirements2.0.pdf) (日本語)
    * https://github.com/OWASP/www-chapter-japan/tree/master/secreq
* Webアプリケーション開発者が気を付けるべき10のセキュリティ技術
    * OWASP発行
    * [PDF](https://drive.google.com/file/d/0B2_ziyIoPpCNXzhJRkdrcEx4Q1U/view) (日本語)
* アプリケーションセキュリティ検証標準
    * OWASP発行
    * [PDF](https://www.jpcert.or.jp/securecoding/OWASP_ASVS_20160623.pdf) (日本語)
* OWASP Top 10 (2013年)
    * OWASP発行
    * [PDF](https://www.owasp.org/images/7/79/OWASP_Top_10_2013_JPN.pdf)（日本語) 
* OWASP Top 10（2017年）
    * OWASP発行
    * [PDF](https://www.owasp.org/images/2/23/OWASP_Top_10-2017%28ja%29.pdf) (日本語)  

## クラウド
* 「クラウドサービス利用のための情報セキュリティマネジメントガイドライン」
    * 経済産業省発行
    * [クラウドサービス利用のための情報セキュリティマネジメントガイドライン改訂版](http://www.meti.go.jp/press/2013/03/20140314004/20140314004-2.pdf)
    * [クラウドセキュリティガイドライン活用ガイドブック](http://www.meti.go.jp/press/2013/03/20140314004/20140314004-3.pdf)

## チェックリスト
* OWASP Cheat Sheet Series のタイトル日本語訳
 * [リンク](http://blog.owaspjapan.org/post/130374053294/owasp-cheat-sheet-series%E3%82%92%E6%97%A5%E6%9C%AC%E8%AA%9E%E8%A8%B3%E3%81%97%E3%81%A6%E9%A6%B4%E6%9F%93%E3%81%BF%E3%82%84%E3%81%99%E3%81%8F%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F) （リンク先ドキュメントは英語）
 * [日本語訳リンク](https://jpcertcc.github.io/OWASPdocuments/)
* セキュリティ実装チェックリスト
    * 「安全なウェブサイトの作り方」改訂第7版のチェックリスト版
    * [エクセル](http://www.ipa.go.jp/files/000044403.xlsx)
* ソフトウェア出荷判定セキュリティ基準チェックリスト
    * 一般社団法人コンピュータソフトウェア協会発行
    * http://www.csaj.jp/NEWS/committee/security/160713_sec-release-decision.html

## Java言語
* Java セキュアコーディングスタンダード CERT/Oracle 版
    * https://www.jpcert.or.jp/java-rules/
* Java アプリケーション脆弱性事例解説資料
    * https://www.jpcert.or.jp/securecoding/materials-java-casestudies.html

## Ruby言語
* Rails セキュリティガイド
 * https://railsguides.jp/security.html
Postgres system triggers error: permission denied

ローカルのPostgres 環境でユニットテストを実行したら、以下のようなエラーが大量にでました。

```
ERROR:  permission denied: "RI_ConstraintTrigger_a_604690" is a system trigger
```

# 環境
* Ruby on Rails
* PostgreSQL
* RSpec


# 解決方法
ユニットテストでDBにアクセスユーザの権限レベルを上げれば良い

```
ALTER USER user_name with SUPERUSER;
```

このSQLを実行するにもsuperuser権限じゃないといけないので注意

# 参考
http://blog.endpoint.com/2012/10/postgres-system-triggers-error.html
サイト上でコードを表示する時におりかえさずスクロールするようにする

コードを囲んでいる要素に以下のCSSを適用する
code {   
   overflow-x:auto;
   white-space:pre;
}

以上

参考
http://www.will3in.co.jp/blog/article/switch-wrap-pre-text/
iPhoneで短いバイブレーションを鳴らす方法

iPhoneで短い「ブッ」という感じのバイブレーションを鳴らす方法です．
~~この実装がAppStoreの審査に通るかどうかは確認していません．~~（2016.10.29追記：コメントにあるように， @HihuSnow さんのアプリでは通ったようです．）

## 環境
* Xcode 8.0
* iPhone SE (iOS 10.0.2)

## 普通のバイブレーションの鳴らし方
バイブレーション用のシステムサウンド（システムサウンドID:4095＝`kSystemSoundID_Vibrate`）を鳴らす方法がよく紹介されています．
0.5秒くらいのバイブレーションです．

```swift
import AudioToolbox

func vibrate() {
    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
}

```

## 短いバイブレーションの鳴らし方
バイブレーションの長さやパターンを制御するAPIは用意されていないようですが，メッセージアプリで表示中の相手からメッセージが来た時の音（システムサウンドID:1003）を鳴らしてすぐ止める方法で，「ブッ」というバイブレーションだけ鳴らすことができました．
0.1秒くらいのバイブレーションです．

```swift
import AudioToolbox

func shortVibrate() {
    AudioServicesPlaySystemSound(1003);
    AudioServicesDisposeSystemSoundID(1003);
}

```

同様にシステムサウンドID:1007などを使うことで「ブッブー」というパターンのバイブレーションも鳴らすことができます．

当然ながら，普通のバイブレーションも短いバイブレーションも，`設定＞サウンド＞バイブレーション`の設定次第では鳴りません．

## 参考
* [AudioServices - iPhone Development Wiki](http://iphonedevwiki.net/index.php/AudioServices)
* [iOS 組み込みの効果音を鳴らしてみる - A Day In The Life](http://glassonion.hatenablog.com/entry/20110813/1313162455)
* [iphone - How to cancel a playing sound started with AudioServicesPlaySystemSound? - Stack Overflow](http://stackoverflow.com/questions/14002510/how-to-cancel-a-playing-sound-started-with-audioservicesplaysystemsound)
* [iphone - Vibrate command only works when phone is set to silent? - Stack Overflow](http://stackoverflow.com/questions/4839517/vibrate-command-only-works-when-phone-is-set-to-silent)
PostgreSQLで各クライアントからの接続数とその内訳を確認するSQL

```plpgsql
SELECT
  client_addr,
  sum(1) numconns,
  sum(CASE WHEN state = 'active' THEN 1 ELSE 0 END) active,
  sum(CASE WHEN state = 'idle' THEN 1 ELSE 0 END) idle,
  sum(CASE WHEN state = 'idle in transaction' THEN 1 ELSE 0 END) idle_in_transaction,
  sum(CASE WHEN state = 'idle in transaction (aborted)' THEN 1 ELSE 0 END) aborted,
  sum(CASE WHEN state = 'fastpath function call' THEN 1 ELSE 0 END) fastpath,
  sum(CASE WHEN state = 'disabled' THEN 1 ELSE 0 END) disabled,
  sum(CASE WHEN state IS NULL THEN 1 ELSE 0 END) undefined
FROM
  pg_stat_activity
GROUP BY
  client_addr
ORDER BY
  client_addr;
```
素人の言語処理100本ノック:24


[言語処理100本ノック 2015](http://www.cl.ecei.tohoku.ac.jp/nlp100/)の挑戦記録です。環境はUbuntu 16.04 LTS ＋ Python 3.5.2 \:\: Anaconda 4.1.1 (64-bit)です。過去のノックの一覧は[こちら](http://qiita.com/segavvy/items/fb50ba8097d59475f760)からどうぞ。

## 第3章: 正規表現
>Wikipediaの記事を以下のフォーマットで書き出したファイルjawiki-country.json.gzがある．
>・1行に1記事の情報がJSON形式で格納される
>・各行には記事名が"title"キーに，記事本文が"text"キーの辞書オブジェクトに格納され，そのオブジェクトがJSON形式で書き出される
>・ファイル全体はgzipで圧縮される
>以下の処理を行うプログラムを作成せよ．

###24. ファイル参照の抽出
>記事から参照されているメディアファイルをすべて抜き出せ．

####出来上がったコード：

```python:main.py
# coding: utf-8
import gzip
import json
import re
fname = 'jawiki-country.json.gz'


def extract_UK():
	'''イギリスに関する記事本文を取得

	戻り値：
	イギリスの記事本文
	'''

	with gzip.open(fname, 'rt') as data_file:
		for line in data_file:
			data_json = json.loads(line)
			if data_json['title'] == 'イギリス':
				return data_json['text']

	raise ValueError('イギリスの記事が見つからない')


# 正規表現のコンパイル
pattern = re.compile(r'''
	(?:File|ファイル)	# 非キャプチャ、'File'か'ファイル'
	:
	(.+?)	# キャプチャ対象、任意の文字1文字以上、非貪欲
	\|
	''', re.VERBOSE)

# 抽出
result = pattern.findall(extract_UK())

# 結果表示
for line in result:
	print(line)
```

####実行結果：

```console:端末
Royal Coat of Arms of the United Kingdom.svg
Battle of Waterloo 1815.PNG
The British Empire.png
Uk topo en.jpg
BenNevis2005.jpg
Elizabeth II greets NASA GSFC employees, May 8, 2007 edit.jpg
Palace of Westminster, London - Feb 2007.jpg
David Cameron and Barack Obama at the G20 Summit in Toronto.jpg
Soldiers Trooping the Colour, 16th June 2007.jpg
Scotland Parliament Holyrood.jpg
London.bankofengland.arp.jpg
City of London skyline from London City Hall - Oct 2008.jpg
Oil platform in the North SeaPros.jpg
Eurostar at St Pancras Jan 2008.jpg
Heathrow T5.jpg
Anglospeak.svg
CHANDOS3.jpg
The Fabs.JPG
PalaceOfWestminsterAtNight.jpg
Westminster Abbey - West Door.jpg
Edinburgh Cockburn St dsc06789.jpg
Canterbury Cathedral - Portal Nave Cross-spire.jpeg
Kew Gardens Palm House, London - July 2009.jpg
2005-06-27 - United Kingdom - England - London - Greenwich.jpg
Stonehenge2007 07 30.jpg
Yard2.jpg
Durham Kathedrale Nahaufnahme.jpg
Roman Baths in Bath Spa, England - July 2006.jpg
Fountains Abbey view02 2005-08-27.jpg
Blenheim Palace IMG 3673.JPG
Liverpool Pier Head by night.jpg
Hadrian's Wall view near Greenhead.jpg
London Tower (1).JPG
Wembley Stadium, illuminated.jpg
```

###ファイル参照とは？
問題26で参考情報として紹介されている[マークアップ早見表](https://ja.wikipedia.org/wiki/Help:早見表)の「ファイル」を指しているようなので、これに従いコーディングしました。なお、`File:`も同様のようなので、こちらも抽出しています。それにしても、なぜ`ファイル:`をやめて`File:`に統一しないのか不思議...
なお、前問の`Category:`とは異なり必ず`|`が続くようなので、そこまでをキャプチャ対象としています。また、行単位の検索は冗長のような気がしてきたので、やめてすっきりさせました。

　
25本目のノックは以上です。誤りなどありましたら、ご指摘いただけますと幸いです。
<hr>

*実行結果には、[100本ノックで用いるコーパス・データ](http://www.cl.ecei.tohoku.ac.jp/nlp100/#data)で配布されているデータの一部が含まれます。この第3章で用いているデータのライセンスは[クリエイティブ・コモンズ 表示-継承 3.0 非移植](https://creativecommons.org/licenses/by-sa/3.0/legalcode)（[日本語訳](https://creativecommons.org/licenses/by-sa/3.0/deed.ja)）です。*
ElectronでMacのスリープ・ロックを検知する

# やりたいこと

Electronでスリープやロックを検知して色々やりたい

# 環境

* OS X El Capitan
* Electron 1.4

# 本題

どちらもメインプロセス内で検知します。
なので、検知処理は　package.json の mainとして定義したjsファイル内で呼ぶ必要があります。

## スリープ

``` javascript
const electron = require('electron')
const app = electron.app

app.on('ready', () => {
  electron.powerMonitor.on('suspend', () => {
    console.log('suspend') // スリープ時
  })
  electron.powerMonitor.on('resume', () => {
    console.log('resume') // スリープからの復帰
  })
})
```

powerMonitor を使って検知できます。
powerMonitor は app の readyイベント以降でしか支えないので、readyイベントのcallback内で呼び出します。

## ロック

``` javascript
const electron = require('electron')
const app = electron.app
const BrowserWindow = electron.BrowserWindow

let mainWindow

function createWindow () {
  mainWindow = new BrowserWindow({width: 1000, height: 600})
  mainWindow.loadURL(`file://${__dirname}/index.html`)

  mainWindow.on('hide', () => {
    console.log('hide') // Lock時
  })

  mainWindow.on('show', () => {
    console.log('show') // Lock解除時
  })
}

app.on('ready', () => {
  createWindow()
})
```

BrowserWindowモジュールの hide, show で検知します。

## 検知したあとは

メインプロセス内で完結する処理であれば問題ないですが、レンダラープロセスに伝える必要があることがほとんどだと思います。

その場合はwebContents, ipcRendererの両モジュールを使って Main→Rendererに伝達します。

``` javascript:main.js
const electron = require('electron')
const app = electron.app
let mainWindow

function createWindow () {
  mainWindow = new BrowserWindow({width: 1000, height: 600})
  mainWindow.loadURL(`file://${__dirname}/index.html`)
}

app.on('ready', () => {
  electron.powerMonitor.on('suspend', () => {
    console.log('suspend') // スリープ時
    // 'suspend' をレンダラーに送る
    mainWindow.webContents.send('asynchronous-reply', 'suspend')
  })
  electron.powerMonitor.on('resume', () => {
    console.log('resume') // スリープからの復帰
  })

  createWindow()
})
```

``` javascript:renderer.js
(function() {
  const {ipcRenderer} = require('electron')

  ipcRenderer.on('asynchronous-reply', (event, arg) => {
    console.log(arg) // 'suspend' が表示される
  })
})();
```

BrowserWindow.webContents.send() → ipcRenderer.on() というやり取りです。

これでスリープ、ロックを検知して処理を行うことが可能になりました。
問題が明確化できているときは、半分解けている

ソフトウェアを書いて実現しようとする開発案件があるとき、なかなかうまくいかないことでイラつくこともあるだろう。

だが「問題が明確化できているときは、もう半分解けている」という言葉を贈ろう。
問題が隠れているときは、最後の最後の土壇場になって問題が発覚して足をとられることがある。
そのときには、その問題に対して取り組む時間も予算ももう残っていない。
問題が見えているときは、その問題に対して早めに取り組むことが可能になる。
だから、問題が隠れている状況よりは、問題が見えている状況の方がいい。

問題に気づいているのが1人だけという状況よりは、多くのメンバーがそのことに気づいている方がいい。
自分には解決できないことでも、別の人には容易に解決できることがある。

問題が何であるのかわかりにくいときは、その問題の別の表現を数多くしてみよう。
その中には、問題の本質を言い尽くしているのが出てくるはずだ。

問題を記述するときには、なるべく簡単になる表現がいい。
問題に対する解決案も、なるべく簡単になる表現の方がいい。

世の中にあるたいていの問題は、今回が初めての問題ってわけじゃない。
問題が明確化できれば、それに対する方策は、探せばなんかしら出てくる。


問題が明確化できているときは、半分解けている。
scpコマンドの注意点は？

# 概要
本番サーバ（linux）で出力したcsvファイルをローカルに持ってるくるにはどうすれば…そんなときには`scp`コマンドを使えばよいよ！と教えてもらいました。

すると、別の方にこんなコメントをいただきました。

> scpでサイズが大きいファイルを転送するときは気をつけてください。理由とどういった対策が必要かも考えてみてね☆（ゝω・）vｷｬﾋﾟ

というわけで、調べてみることにしました(｀･ω･´)ゞ

（調べてみたものの、間違っていたり、他にもあれば優しい方々がコメントくださることを期待しつつ…）

# 本題
## scpコマンドとは？
* sshと使ってホスト間で安全にファイルをやりとりするためのコマンドです。
* 使い方はこんな感じです。

```
$ scp [オプション][転送したいファイル名][転送先のパス]

# たとえば…
$ scp toshi0607@[サーバのIPアドレス（名前解決もしれくれる）]:/home/toshi0607/nyanchu.txt ~/Desktop/
```

## サイズが大きいファイルを転送するときの注意点は？
### 課題
* scpは指定ファイル名のファイルをオープンして転送します。そのため、転送中にファイルにアクセスされると書き込み途中ファイルが読み込まれてしまったり、転送を中断した場合転送先のファイルが破損する可能性があります。

### 対策
* 圧縮する
`-C`オプションを指定することで、データをコピーする際にデータを圧縮し転送することができます。

```
$ scp -C ユーザ名@リモートのホスト名:コピーしたいリモートのファイル ローカルのコピー先
```

* 同期に一時ファイルを作成するrsyncを使ってファイルの破損を防ぐ（ファイルが大きく、時間がかかるとファイルへのアクセスリスクも高まるということで…）

```
$ rsync -e ssh toshi0607@[サーバのIPアドレス（名前解決もしれくれる）]:/home/toshi0607/ ~/Desktop/
# あくまでディレクトリ内の同期…最後に`/`をつけると、ディレクトリ毎同期します。
```

## 他の注意点は？
* 同名のファイルやディレクトリがコピー先にあった場合、上書きしてしまう
* sshのポート番号を変えている場合は`-P`オプションを指定する
* 秘密鍵で接続する必要がある場合は`-i`オプションを指定する

くらいでしょうか…

## Linux全般学習アドバイスください！
以上です。サーバに入ってコマンドの打つのに無抵抗過ぎて、最近は[Linux標準教科（Ver2.0.0）](http://www.lpi.or.jp/linuxtext/text.shtml)をCentOS上でコマンドたたいて勉強してます…最低限こんくらい知っとけ！みたいな記事や本があれば教えていただけると幸いです m(_ _)m
ESP-WROOM-02でMicroPython (Mac) shellの導入

[ESP-WROOM-02でMicroPython](http://qiita.com/taka-murakami/items/a3c05115d5a5038ebb11)ではESP-WROOM-02にmicropythonのインストールまでを行いましたが、このままだとREPLで対話的に使うしかないです。1M以上のメモリがあればファイルシステムが使えるのですが、ファイルシステムにファイルをコピーするのも面倒です。そこで、[mpfshell](https://github.com/wendlers/mpfshell)という簡単なシェルを導入してみました。
# mpfshell
mpfshellはローカルのMacからftpライクにファイルのput、getや簡単なファイルアクセスができるツールです。
## 準備
### mpfshellのダウンロード
mpfshellを[https://github.com/wendlers/mpfshell](https://github.com/wendlers/mpfshell)よりダウンロードします。
### 関連ツールのインストール
mpfshellのドキュメントには、

```shell-session:
$ sudo pip install pyserial
$ sudo pip install colorama
$ sudo pip install websocket_client
```
以上の3つをインストールするように書いてありますが、私のmacにはpyserialがインストールされていましたので、省略しました。
インストールされているパッケージは、以下で確認できます。

```shell-session:
$ sudo pip list
```
### mpfshellのインストール
ダウンロードしたmpfshellの中にあるsetup.pyを実行し、mpfshellをインストールします。

```shell-session:
$ sudo python setup.py install
```
### テスト
mpfshellを起動し、ボードにアクセスしてみます。
'open tty.usbserial-xxxx'のxxxxは実際のUSBシリアルのデバイス名です。
openした後にlsすると、ボードのファイルシステムの一覧が見れます。
デフォルトではboot.pyがインストールされています。

```shell-session:
$ mpfshell 

** Micropython File Shell v0.7.6, sw@kaltpost.de ** 
-- Running on Python 2.7 using PySerial 3.1.1 --

mpfs [/]> open tty.usbserial-xxxx
Connected to esp8266
mpfs [/]> ls

Remote files in '/':

       boot.py
```
以上でインストールとテストは終了です。
## 使い方
使い方はftpと似ています。
### ファイル取得

```shell-session:
mpfs [/]> get boot.py
```
boot.pyファイルをMacのカレントディレクトリにコピーします。
### ファイル送信

```shell-session:
mpfs [/]> put main.py
```
main.pyをMacのカレントディレクトリからコピーします。
ちなみに、main.pyというファイルがあると、起動後に自動的に実行するようになってます。
### ファイルの表示

```shell-session:
mpfs [/]> cat boot.py
# This file is executed on every boot (including wake-boot from deepsleep)
#import esp
#esp.osdebug(None)
import gc
import webrepl
webrepl.start()
gc.collect()
````
### main.pyの実行
前回のLチカのスクリプトをmain.pyに書いて、LEDを点灯させます。
以下のファイルをMacで作成しておきます。

```shell-session:
$ cat main.py
import machine
import time

pin = machine.Pin(4, machine.Pin.OUT)
pin.high()
time.sleep(3)
pin.low()
````
mpfshellでファイルを送信し、mpfshellからreplを起動します。

```shell-session:
mpfs [/]> put main.py
mpfs [/]> cat main.py
import machine
import time

pin = machine.Pin(4, machine.Pin.OUT)
pin.high()
time.sleep(3)
pin.low()

mpfs [/]> repl

*** Exit REPL with Ctrl+] ***
>
MicroPython v1.8.4-10-gbc28ac8 on 2016-09-09; ESP module with ESP8266
Type "help()" for more information.
>>> 
````
ここで、Ctrlｰdを入力すると、ソフトリブートし、main.pyが実行されます。
うまくいけば、LEDが3秒間点灯するはずです。
replからmpfshellに戻るには、Ctrl+]を入力します。
ボードをリセットすると、同様にLEDが3秒点灯します。
AWS EC2のAmazon LinuxにElasticsearchをインストールする手順

# はじめに

AWSのEC2でサーバを構築した後、Elasticsearchをインストールしたのですが、若干手間取ったので、その手順を整理して記録します。

なお、sshでログインしてから以下の操作を行います。

# JAVAのバージョン確認

ElasticsearchではJAVAを使用するので、インストールされていることを確認します。

```sh:
$ java -version
java version "1.7.0_111"
OpenJDK Runtime Environment (amzn-2.6.7.2.68.amzn1-x86_64 u111-b01)
OpenJDK 64-Bit Server VM (build 24.111-b01, mixed mode)
```

# ダウンロードとインストール

以下のコマンドでインストールします。

```sh:
$ wget https://download.elastic.co/elasticsearch/release/org/elasticsearch/distribution/tar/elasticsearch/2.4.1/elasticsearch-2.4.1.tar.gz -O elasticsearch.tar.gz
$ tar -xf elasticsearch.tar.gz
$ sudo mv elasticsearch-* /usr/local/share/elasticsearch
$ sudo chown -R root:root /usr/local/share/elasticsearch/
```

※2016/10/18現在の最新版

# 環境設定

インストールした後に以下のコマンドで環境設定します。
やっていることは、ログファイルを作ることと、動作に必要なフォルダやファイルの追加です。

```sh:
$ cd /usr/local/share/elasticsearch/
$ sudo mkdir logs
$ sudo chown ec2-user logs
$ touch logs/elasticsearch.log
$ sudo mkdir plugins
$ sudo chown ec2-user plugins
$ sudo mkdir config/scripts
$ sudo chown ec2-user config/scripts
$ sudo mkdir data
$ sudo chown ec2-user data
```

# プラグインのインストール

日本語の形態素解析するプラグインがあるので、入れておきます。

```sh:
$ sudo bin/plugin install analysis-kuromoji
```

# 起動

以下のコマンドで起動します。

```sh:
$ cd /usr/local/share/elasticsearch/
$ bin/elasticsearch &
```

# 動作確認

以下のコマンドを入力して、レスポンスがあれば成功です！！

```sh:
$ curl localhost:9200
```
LINE Messaging APIとPythonを使ってChatbotを作ってみた(2)~サーバー編~

#はじめに
[株式会社サイシード](http://www.sciseed.jp/)のサマーインターンシップに参加してLINE Chatbotを開発してきました。2016/9/29にLINEから公式版のMessaging APIが発表されたので、今回は公式版のほうで自動応答してくれるbotを作成しました。
この記事は
[LINE Messaging APIとPythonを使ってChatbotを作ってみた(1)]
(http://qiita.com/Kosuke-Szk/items/eea6457616b6180c82d)
の続きとなっています。今回はサーバー構築とWebhook URL登録について記載していきます。

#ソースコード
githubにソースコードを公開しています。
https://github.com/Sciseed/yukko-line-bot

#開発環境
・MAC OS X 10.10.3
・Python 3.4.0
・Django 1.8.14
#必要なもの
.herokuアカウント
・heroku toolbelt
・virtualenv

#djangoで空アプリを作成
####アプリ用ディレクトリ作成
`$ mkdir bottest`
`$ cd bottest`
####仮想環境構築
`$ virtualenv virenv`
`$ source virenv/bin/activate`
####django-toolbeltをインストール
`$ pip install django-toolbelt`
####Djangoプロジェクトを作成
`$ django-admin.py startproject bottest`
####Djangoアプリを作成
`$ cd bottest`
`$ python manage.py startapp bot`
####gunicornの設定
django-toolbeltの中にgunicornが入ってるのでそれを用います
``
####Procfileの作成
アプリの一番上の階層にProcfile(拡張子なし)を作成し、以下の内容を記載します

```Procfile
web: gunicorn bottest.wsgi bot:app --log-file -
```

####pythonのバージョン指定
runtime.txtというテキストファイルをProcfileと同じ階層に作成し、以下のように記載します。

```runtime.txt
python-3.4.0
```

これでherokuでアプリを動かす際にpythonのバージョンが認識されます（3.X系では必須の作業）
####ローカルサーバーを起動してみる
    $ python manage.py runserver
今回の仕様では外部のAPIを通じてメッセージデータをやり取りするだけなので、内部でデータを保持する必要はなく、データベースを使用していません。なので、migrationを要求されますが不要です。
`http://127.0.0.1:8000/`
にアクセスして動作確認します。

#herokuにデプロイ
git管理を行う

```
$ git init
$ git add .
$ git commit -m "Initial commit"
```

herokuにリポジトリを作成
`$ heroku create [アプリ名]`
herokuへデプロイ
`$ git push heroku master`
デプロイされたかチェック
`$ heroku open`

#Webhook URLをテストする
herokuアプリケーションのURLをwebhook URLに打ち込んでverifyを通します。(テストの時点ではアプリ自体はリクエストに何も処理をほどこさないようにしたほうがいいです)
![image](https://qiita-image-store.s3.amazonaws.com/0/123589/90014dc4-93ff-9371-3896-26437999c6ba.png)
失敗した時はエラーステータスが通知されます。成功した時はなにも表示されません。

この時
`heroku logs -t`
でログを表示させておくことで、verifyのPOSTメソッドがどう処理されてるか確認できます。HTTPステータスで200が返って来たら成功です。

#LINEクライアントからテスト
LINEアプリからbotに向かって話しかけてみます。
成功していればherokuのlogからPOSTメソッドと共にテキストメッセージが投げられているのが確認できるはずです。
#ハマったとこ
・csrfでPOSTリクエストがずっとはじかれてた
djangoではCSRF(Cross site request forgeries)攻撃からwebアプリを守るために対策が施されています。ざっくり言うと、正規ルート以外のPOSTリクエストは受け付けませんよっていう機能です。これのためにたとえばcurlでアプリにPOSTを投げても、もちろんLINEからverifyを通そうとしてもエラーが返って来ます。
今回はテストなので一時的にcsrf防御をオフにします

```python:settings.py
    MIDDLEWARE_CLASSES = [
                 ...
    'django.middleware.csrf.CsrfViewMiddleware', #<=ここをコメントアウト
                 ...
]
```
・LINE APIのverifyを通す時、始めからリクエストに処理を加える実装をしていたので、LINEからリクエストを投げてもエラーが戻り続けて苦しみました。（LINEのレスポンス形式指定に則ったレスポンスを返せてなかった）
なのでテストの時はリクエストの処理部分は実装せず、POSTリクエストの受け取りと、それに対するシンプルなレスポンスだけをログで眺めてるのがいいです。
・LINE APIにリクエストを投げたときにヘッダーの形式を間違えていたために苦労しました。（正しく辞書形式で送信できていませんでした。）エラーが返ってくるときはヘッダーやボディが正しいフォーマットで記載されているかも確認してみてください。


#参考
[たった5分でDjangoアプリをherokuにデプロイする方法](http://qiita.com/kilhyungdoo/items/ae0b4d2970bc0937e884)
[Rubyに負けるな！HerokuでPython(Django)動かす方法](http://qiita.com/nakazye/items/48651e39f07da82fe79e)
HTMLを入れ子にするiframeタグの使い方


## フレームとは
HTMLのフレームとはHTMLを２つ以上に分割し、指定した領域に表示させる機能。
HTML4時代は`<frame>`,`<frameset>`,`<noframes>`などのタグがあったがHTML5には`<iframe>`のみが生き残った。

## iframeの使い方

iframeには別ファイルに定義されたhtmlを表示する方法とiframeタグ内部に直接入力されたhtmlを表示する方法がある。

### 別ファイルのhtmlを表示
iframeタグのsrc属性にファイルのURLを入力する。

```html:別ファイルのhtmlを表示
<iframe src="iframe_src.html"></iframe>
```

```html:iframe_src.html
<p>srcはファイルのURLを入力</p>
```

### 直接htmlを入力
srcdoc属性にhtmlを入力する

```html:htmlを直接入力して表示
<iframe srcdoc="<p>srcdocは直接htmlを入力</p>"></iframe>
```

[デモ](http://tetsuyanegishi.github.io/Warehouse/iframe_example/)

## 参考
[http://honttoni.blog74.fc2.com/blog-entry-175.html](http://honttoni.blog74.fc2.com/blog-entry-175.html)
SpringBoot + spockで groovy.sql.Sql を使った update のユニットテスト

# 概要

データベースの更新処理（update）のユニットテストをどう書くか。

- テストデータを登録
- 更新処理を実施
- 更新内容が正しいか更新後のDBを参照してassert

「更新内容が正しいか更新後のDBを参照してassert 」で `groovy.sql.Sql` を使ってみる

# こんな感じ

```groovy
@Unroll
@SpringBootTest
class SampleRepositorySpec extends Specification {

    // DBを使ってるなら、DIコンテナに登録済と思う
    @Autowired
    DataSource dataSource

    // テスト対象のリポジトリ   
    @Autowired
    SampleRepository sampleRepository

    // テストの実施
    def "更新されること"() {
        given:
        // テストデータの登録や更新内容の準備など

        when:
        // 更新処理を実施
        sampleRepository.update(sampleModel)

        then:
        // DataSourceを使ってSqlのインスタンス生成
        def sql = new Sql(dataSource)
        // 最初の一件だけ取得している
        // Groovyはヒアドキュメントが使えるので、SQLは読みやすいように書ける
        // バインドパラメータはリスト・配列・マップで渡せる(?.idのところ)
        def result = sql.firstRow("""
            select * from hoge
                where id = ?.id
            """, [id: 1])
        // 更新内容のassert
        assert result.COLUMN_NAME== '期待する更新値'
        sql.close()
    }
}
```

# おまけ

いつものJavaな感じ(Groovyにそのまま書ける)

```java
Connection conn = dataSource.getConnection()
Statement statement = conn.createStatement()
ResultSet resultSet = statement.executeQuery("select * from hoge")

resultSet.first()
resultSet.getObject("COLUMN_NAME") == "期待する更新値"

conn.close()
```

# 参考

http://docs.groovy-lang.org/latest/html/api/groovy/sql/Sql.html
http://d.hatena.ne.jp/nekozeoyaji/20150628/p1
http://npnl.hatenablog.jp/entry/20090505/1241504105
http://d.hatena.ne.jp/backpaper0/20110204/1296843674
RestTemplate  オレオレ証明書でSSL通信する　httpclient	 4.5.2ver

専用回線引いてるくせに、セキュリティを重視してSSLで通信して下さいと言われた。  
でも、なぜか証明書はオレオレ証明で・・・・・なんかSSLの意味がないような・・・。  
ということで、ネットに比較的新しい実装例がなかったのでここに備忘録として残しておく。

```java
public RestTemplate restTemplate(){

		//httpclient	: '4.5.2

		final String keyStoreType = "PKCS12";
		final String keyStorePath = "../../keyStore.p12";
		final String keyStorePassWord = "password";
		final String sslProtoCol = "TLSv1.2";


		HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();

		// keyStoreのロード
		KeyStore keyStore = KeyStore.getInstance(keyStoreType);
		keyStore.load(new FileInputStream(keyStorePath), keyStorePassWord.toCharArray());

		// KeyManagerの設定
		KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
		kmf.init(keyStore, keyStorePassWord.toCharArray());

		// SSLContextの生成
		SSLContext sslContext = SSLContext.getInstance(sslProtoCol);
		sslContext.init(kmf.getKeyManagers(),
				new X509TrustManager[]{ new LooseTrustManger()},
				new SecureRandom());

		httpClientBuilder.setSSLContext(sslContext);

		// 証明書のホストの検証を無視する
		httpClientBuilder.setSSLHostnameVerifier(new LooseHostnameVerrifer());

		HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
		factory.setHttpClient(httpClientBuilder.build());

		return new RestTemplate(factory);

	}

public class LooseTrustManger implements X509TrustManager{

	/**
	 * 検証を何もしない
	 */
	@Override
	public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}

	/**
	 * 検証を何もしない
	 */
	@Override
	public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}

	/**
	 * 証明書を返却しない
	 */
	@Override
	public X509Certificate[] getAcceptedIssuers() {return null;}

}

public class LooseHostnameVerrifer implements HostnameVerifier{

	@Override
	public boolean verify(String arg0, SSLSession arg1) {return true;}

}
```
こんな感じで、javaのkeytoolで作成したオレオレ証明書で通信できました。
findbagusにかけたら警告がでちゃいますが気にしない。
Aruba gem - Configuration

Aruba の Configuration 周りについてまとめます。  
`Aruba.configure { |c| c.some_config = some_value }` 形式で様々な設定をできます。  

例として

* Exit Timeout
* Home Directory

の設定をしてみます。

## <i class='fa fa-check'></i> Arubaって？
Arubaの基本については下記を参照ください

[Aruba gemでCLIのテストを支援する](http://qiita.com/tbpgr/items/41730edcdb07bb5b59ad)

## <i class='fa fa-cube'></i> Timeout
タイムアウト時間を設定します。
デフォルトは15秒です。

```ruby
require 'spec_helper'

RSpec.describe 'timeout', type: :aruba do
  context 'set exit_timeout' do
    before(:each) do
      Aruba.configure { |c| c.exit_timeout = 2 }
    end
    Aruba.configure { |c| it { expect(c.exit_timeout).to eq(2) } }
  end

  context 'in time' do
    before(:each) do
      Aruba.configure { |c| c.exit_timeout = 2 }
      run('sleep 1')
    end
    it { expect(last_command_started).to be_successfully_executed }
  end

  context 'timeout' do
    before(:each) do
      Aruba.configure { |c| c.exit_timeout = 1 }
      run('sleep 4')
    end
    it { expect(last_command_started).not_to be_successfully_executed }
  end
end
```

* 実行結果

```sh
$ rspec -fd -c ./spec/configuration/timeout_spec.rb

timeout
  set exit_timeout
    should eq 2
  in time
    should be successfully executed
  timeout
    should not be successfully executed

Finished in 3.22 seconds (files took 0.31093 seconds to load)
3 examples, 0 failures
```

## <i class='fa fa-cube'></i> Home Directory
ホームディレクトリの設定をします。

```ruby
require 'spec_helper'

RSpec.describe 'home directory', type: :aruba do
  context 'default home_directory' do
    Aruba.configure { |c| it { expect(c.home_directory).to eq(Dir.home) } }
  end

  context 'set home_directory' do
    before(:each) do
      Aruba.configure { |c| c.home_directory = '/home' }
    end
    Aruba.configure { |c| it { expect(c.home_directory).to eq('/home') } }
  end
end
```

* 実行結果

```sh
$ rspec -fd -c ./spec/configuration//home_directory_spec.rb

home directory
  default home_directory
    should eq "/Users/your_name"
  set home_directory
    should eq "/home"

Finished in 0.00722 seconds (files took 0.21765 seconds to load)
2 examples, 0 failures
```

## <i class='fa fa-graduation-cap'></i> まとめ
他の設定については

<i class="fa fa-external-link" style="font-size:1em;"></i> [Configuration - Aruba - docs](http://www.relishapp.com/cucumber/aruba/v/0-11-0/docs/configuration)

を参照ください。
Riot.js + Atomic Designのスタイルガイド用のテンプレート

[Riot.js と Atomic Design ではじめるテクニカルクリエイター](https://www.cyberagent.co.jp/technicalcreator/article/id=12462)
を参考にしていて、うちもStyle Guideがあったら作業が捗るかなということで、
とりあえずテンプレ的なものを作ってみました。

## 使い方
1. 適当にダウンロード 
https://github.com/negibouze/styleguide-template

2. パッケージをインストールして実行 
※一回目の起動はうまくいかないかもしれないです。 

```
npm install or yarn install
npm start
```

成功するとこんな画面が出ます。 
<img width="528" alt="template.png" src="https://qiita-image-store.s3.amazonaws.com/0/37319/c8964759-ecf9-7c80-48c4-c2d8e631bb7c.png">

3. コンポーネントの追加 

```
├── src
│   ├── components
│   │   ├── atoms
│   │   │   ├── foo
│   │   │   │   ├── example.tag
│   │   │   │   ├── foo.styl
│   │   │   │   └── foo.tag
│   │   │   └── plus
│   │   │       ├── example.tag
│   │   │       ├── plus.svg
│   │   │       └── plus.tag
│   │   ├── molecules
│   │   │   └── bar
│   │   │       ├── bar.styl
│   │   │       ├── bar.tag
│   │   │       └── example.tag
│   │   ├── organisms
│   │   │   └── baz
│   │   │       ├── baz.styl
│   │   │       ├── baz.tag
│   │   │       └── example.tag
│   │   └── styleguide
│   │       ├── atoms
│   │       │   ├── atoms.styl
│   │       │   └── atoms.tag
│   │       ├── molecules
│   │       │   ├── molecules.styl
│   │       │   └── molecules.tag
│   │       └── organisms
│   │           ├── organisms.styl
│   │           └── organisms.tag
│   ├── index.html
│   ├── main.js
│   └── main.styl
├── webpack.config.babel.js
```

こんな階層になっているので`atoms`, `molecules`, `organisms`の下に追加する。
追加したコンポーネントの`tag`, `svg`, `styl`は`npm start`を実行した時に`main.js`, `main.styl`にimportされます。

**実行前**

```javascript:main.js
/* inject:tag */
/* endinject:tag */

/* inject:svg */
/* endinject:svg */
```

```stylus:main.styl
/* inject:styl */
/* endinject:styl */
```

**実行後**

```javascript:main.js
/* inject:tag */
import './components/atoms/foo/foo.tag';
import './components/molecules/bar/bar.tag';
import './components/organisms/baz/baz.tag';
import './components/styleguide/atoms/atoms.tag';
import './components/styleguide/molecules/molecules.tag';
import './components/styleguide/organisms/organisms.tag';
/* endinject:tag */

/* inject:svg */
import './components/atoms/foo/foo.svg';
/* endinject:svg */
```

```stylus:main.styl
/* inject:styl */
@import 'components/atoms/foo/foo';
@import 'components/molecules/bar/bar';
@import 'components/organisms/baz/baz';
@import 'components/styleguide/atoms/atoms';
@import 'components/styleguide/molecules/molecules';
@import 'components/styleguide/organisms/organisms';
/* endinject:styl */
```

あとはよしなに。

まだ箱ができただけで自分でもほとんど使っていないので使い勝手とかは分かりませんが、誰かのお役に立てば幸いです。
勝敗予想モデルの学習->試験の成績が悪い : TensorFlow将棋ソフト開発日誌 #8

前回 [勝敗予想モデルの入力ベクトル形式の変更 : TensorFlow将棋ソフト開発日誌 #7](http://qiita.com/YusukeSuzuki@github/items/a42f891e2f0138b6dcc0)
目次 [TensorFlow将棋ソフト開発日誌 目次](http://qiita.com/YusukeSuzuki@github/items/30bcaf7b14f015493121)

ソース [githubにありますが今のところ自分にしか読めないコードです](https://github.com/YusukeSuzuki/ginkgo)

学習・1回・25時間

今回のお話
====================================================================

- 学習サンプルと試験サンプルを分けた
- 学習サンプルを使って1周学習をした
- 試験サンプルを使って正答率を出してみたら予想より低かった
- 今後の課題

学習サンプルと試験サンプルを分けた
====================================================================

今までは学習できるか、つまりバックプロパゲーションを繰り返してロスが下がっていくかだけを確認していたのでサンプルの扱いがぞんざいでしたが学習->試験を繰り返して性能を確認していく段階になったのでそれなりにきちんとしておきます。

- 2chkifu のデータを使っています
- 自分が取得した時点で 62626 戦のデータがありました
- このうち%TORYOで終了しているものを抽出
- 0 - 49999を学習データ 50000 - 62626 を試験データとしています

学習サンプルを使って1周学習をした
====================================================================

25時間かかったぜ・・・

今までのモデルと上記のデータを使用して1周学習をしました。

- 学習データの３０手以降の各盤面をサンプルとします。左右反転をしたものもサンプルとします。
- サンプル数は8,700,000程度、100サンプルをミニバッチとしています。

ロスのグラフです

<img width="948" alt="スクリーンショット 2016-10-18 20.46.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/25288/d5237fdf-639c-df53-aaac-af3197b811b7.png">

正答率のグラフです（correct_rateのつもりが誤字ってますね。最近気づきました）

<img width="953" alt="スクリーンショット 2016-10-18 20.46.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/25288/d5332b7c-b276-07a1-4510-f1ba6cc7e259.png">

割といい感じ。

試験サンプルを使用して正答率を出してみた
====================================================================

- １００のミニバッチを投入して正答の平均を出す
- ミニバッチごとの正答率をさらに投入回数で平均する

```
# 結果。正答率平均、全ミニバッチ中最低正答率、全ミニバッチ中最高正答率
correct rate(21400): avg 0.5575672660085642, min 0.3699999451637268, max 0.75
```

学習中の正答率よりかなり低い値になりました。将棋では先手の勝率が52%なんて言われています。つまり全部先手が勝つと予測すると52%正答するようなイメージです。それよりもちょっとだけいい感じ。つまり、うーん・・・。

考察と課題
====================================================================

### 試験の正答率が低い直接の原因

将棋のデータの性質上、学習サンプルにも試験サンプルにも同じ盤面が相当数入っている。ただし学習中に同じ対戦は投入していないので学習中の正答率と試験の正答率はだいたい同じくらいの値になると予想していた。しかし実際には試験の正答率は学習中のものよりもかなり低い数字になった。

バグ以外に考えられる原因がわからないのでコードレビューを終えたら「一旦はそういう性能である」と考えることにする。

### １エポックではそんなに性能が出ないのではないか

- イテレーション数 ＝ 学習のループ数。バッチ学習ならだいたい学習サンプル数 / ミニバッチサイズ
- エポック数 = 学習サンプル全体１セットを何回学習させたか

いろいろな論文を見ていると複数回のエポックで学習させているのが普通であり、自分の場合もこれから何回も学習させれば正答率が変わるかもしれない。その場合は１エポック25時間というのがネックになる。今のモデルは「えいやっ！」でとりあえず感覚的に作ったモデルであるためこれからチャンネル数は増えるだろうし層数も増やしたい。そうするとますます実験に時間がかかってくる。

half floatを使えば速度は稼げるかもしれないが学習に支障が出るかもしれないので避けたいところ。対応は可能だろうけれどあまりそこで手間を取られたくない。

あるいはどんなデータであれバリエーションを確保し投入していけば性能の向上が見込めるのであれば複数エポックを学習させるのではなく自己対戦による自律学習に移行してしまうのも良いのかもしれない。それであれば1回の投入データ数を絞ることで実験時間のコントロールは可能。しかし学習速度が遅いことには変わりがない。

札束か。やはり札束なのか。GPUを増やすことは少し考えています。

### 試験に時間がかかる

試験についてもミニバッチを投入する形で行っているがだいたい１０００サンプル/秒くらいかかっている（GPU使用率は100%付近で推移している）。将来的に実際に将棋を指すに当たってこの程度の速度ではあまり満足なソフトが書けない。TensorFlowの使いこなしの部分で問題があるかもしれないので調べていく。

今後の予定
====================================================================

- 平日に会社に行ってる間にもう何周か学習をしてみる。そして試験サンプルでの性能を見てみる。
- 指し手モデルを作り始める。
- 預金残高と相談する。
Google Apps ScriptからLINE NotifyでLINEにメッセージを送る

##LINE Notifyとは？
>Webサービスと連携すると、LINEが提供する公式アカウント"LINE Notify"から通知が届きます。
複数のサービスと連携でき、グループでも通知を受信することが可能です。

出典：https://notify-bot.line.me/ja/

LINEが新しく提供開始したサービスです。IFTTTやGit Hubと連携して、LINEに通知を送ることができます。APIも公開されており、
今までは、システムから、LINEに通知を送るには、Bot API TrialまたはBusiness Connectを使用する必要がありましたが、LINE Notifyでは、本当にかんたんに通知が送れるようになりました。Google Apps Scriptと組み合わせれば、時間ごとに通知を送ったり、Googleの検索結果を通知したりと色々できそうだと思い、試してみました。


## 送付準備

通知を送りたいトークルームに「LINE Notify」のアカウントを友達として追加しておきます。通知は「LINE Notify」アカウントから送られます。

次に、アクセストークンの発行を行います。[LINE Notifyのマイページ](https://access.line.me/dialog/oauth/weblogin?response_type=code&client_id=1476232700&redirect_uri=https%3A%2F%2Fnotify-bot.line.me%2Flogin%2Fcallback&state=cVUqnqvNYgJzq2EPMLqCVy&response_mode=form_post)(LINE IDでのログインが必要)にアクセスすると「トークンを発行する」ボタンがあります。これをクリックして、トークンを取得します。詳細は、以下の参考にしてください。

- [コマンドラインから LINE にメッセージを送れる LINE Notify](http://developers.linecorp.com/blog/ja/?p=3784)

アクセストークンが発行できたら、準備完了です。

##ソース

Google Apps Srciptで以下のコードを実行すると、先程、選択したトークルームに、LINE Notifyから通知が送られます。


```
function sendHttpPost(message){
  var token = [access_token];
  var options =
   {
     "method"  : "post",
     "payload" : "message=" + message,
     "headers" : {"Authorization" : "Bearer "+ token}
     
   };

   UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options);
}

function myFunction(){
  var message="Google App Srciptから送信" ;
  sendHttpPost(message);
}
```

## 参考リンク
- http://developers.linecorp.com/blog/ja/?p=3784
- https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app#fetchurl-params
- http://qiita.com/yukihisa-karako@github/items/30747232987c154a01be
Perlで日付の差分を求める

2つの DateTime オブジェクトから、その差を求める方法。
簡単に求まるかと思ったらちょっとハマったのでメモ。

# DateTimeオブジェクトの使い方

まずは、モジュールの使い方を。

```perl
use strict;
use DateTime;

my $dt1 = DateTime->new(year => 2016, month => 9, day => 1);
my $dt2 = DateTime->today;

print "$dt1\n";   #=> 2016-09-01T00:00:00
print "$dt2\n";   #=> 2016-10-18T00:00:00
```

# 2つの日付の差

2つの日付の差の日数を求めたいので、 `$dt2` から `$dt1` を引き算してやる。
DateTimeオブジェクト同士の差は DateTime::Duration オブジェクトとして返ってくる。
上のコードの続きにこうやって書く。

```perl
my $duration = $dt2 - $dt1;
print $duration->delta_days . "\n";   #=> 17
```

ふむふm...！？？
あれ？ `17` って何？？
1ヶ月どこ行った？？

## なぜこのようになるのか
というのは、DateTime::Durationの仕様のようで、

```perl
use Data::Dumper;
print Dumper($duration);
```

として、オブジェクトを確認してみると、

```
$VAR1 = bless( {
'seconds' => 0,
'minutes' => 0,
'end_of_month' => 'wrap',
'nanoseconds' => 0,
'days' => 17,
'months' => 1
}, 'DateTime::Duration' );
```

と、「1ヶ月と17日」という形で値を持っている。
1ヶ月が何日であるかは月によって異なるため、トータルで何日なのかを計算できないﾄﾉｺﾄ（すごい言い訳だ...）。

## 正しい日付差分の求め方

`delta_days` メソッドを使う！

```perl
my $delta = $dt2->delta_days($dt1);
print $delta->delta_days . "\n";   #=> 47
```

という感じで正しく差分の「47」日が得られる。
ウィキデータの紹介#3

※いまさらですが、当方、ウィキデータを知ってまだ日が浅いのでお気づきの点などありましたらコメント欄でご指摘ください。
# 項目(item)の構造
ウィキデータは世界のあらゆる物事や概念を項目(item)という単位で表現します。下図の全体が項目です。

![wikidata_model_ja.png](https://qiita-image-store.s3.amazonaws.com/0/35320/d156aeb8-aa02-9abb-894b-348669a1df86.png)

その内容をごく簡単に説明します。詳細は[ヘルプ・ポータル](https://www.wikidata.org/wiki/Help:Contents/ja)のあたりを参照してください。

## 項目を識別するための記述
### ラベル(label)
項目の内容を表す、タイトルに相当します。一般的な名前でなるだけ短いものを使用します。必ずしも一意である必要はなく、他の項目と同じになっても構いません。ウィキペディアでは同一タイトルの記事は「浅間神社 (松戸市)」のようにカッコ書きで区別されますが、ウィキデータではカッコ書きは不要で、次の説明欄と併せて類似の他の項目と区別できるように記述します。最低限ラベルだけあれば、項目を登録することができます。例：浅間神社
### 説明(description)
項目について、他と識別できるような最低限の説明を記述します。サブタイトル的な短い説明で最後の句点（。）は付けません。例：千葉県松戸市にある神社
### 別名(alias)
ラベル以外にも同一のものを指す別の名前がある場合に記述します。表記の揺れがある場合のバリエーションや新字体に対して旧字体がある場合などにも使います。

## 項目の属性についての記述
### 文(statement)
「プロパティ」－「値」のペアを基本として、項目に対する属性を、該当するプロパティが存在する分だけデータとして入れていきます。
### プロパティ(property)
項目に対する属性を示し、新しいプロパティを登録するためには所定の手続きが必要です。その構造は項目とよく似ていますがサイトリンクの追加はできず、代わりに値に対するデータ型が決められています。
### 値(value)
プロパティに対応する値。
### ランク(rank)
推奨ランク：人口など、調査年ごとにあるような値のうち、最新のものに設定。
通常ランク：デフォルト。
非推奨ランク：記録としては残してあるが、現在は正しくないと認識されているようなもの。例えば江戸時代の人口が記録として残されているが、それは正しくないことが一般的に認識されているような場合。
### 修飾子(qualifier)
プロパティと値のセットが有効な範囲などを修飾します。例えば人口と数字のセットに対する調査時点の日付など。
### 出典(reference)
修飾子と同様に、プロパティと値のセットに対して、その出典を記述します。
＜例＞
「移入元」－「ウィキペディア日本語版」
「出典」－「（本の名前）」
「出典URL」－「（閲覧したURL）」

# アカウント作成
アカウントが無くてもデータの編集には参加できますが、いたずらでないことを示すためにもアカウントを作成して参加されることをオススメします。
ウィキペディアやウィキメディアにアカウントを作成していれば、それを共通で使うことができます。ひとつも持っていない方は作成してください。

# 項目を修正してみる
初めのうちは身近な物事から始めると良いと思います。私のオフィスは上野なので、[ウィキデータのサイト](https://www.wikidata.org/wiki/Wikidata:%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)右上にある検索窓で「上野」を検索してみます。
![searchbox.png](https://qiita-image-store.s3.amazonaws.com/0/35320/77ac125f-6f9e-9b8c-9549-5005d54af516.png)

上野と名の付くものはいろいろありますがここでは「上野恩賜公園」を選んでみます。

![上野恩賜公園   Wikidata.png](https://qiita-image-store.s3.amazonaws.com/0/35320/ab85eba7-eaa5-79f0-c3ed-73d9cc373e38.png)

「説明」欄が未入力なので、これを入力してみましょう。「上野にある公園」だとどこの上野だよ、ってことになるので「東京都台東区にある公園」くらいが良いと思います。項目ページの右上にある「編集」をクリックします。

![上野恩賜公園   Wikidata_edit.png](https://qiita-image-store.s3.amazonaws.com/0/35320/36495f59-2fac-7d6b-8f61-059353440620.png)

説明欄で「東京都台東区にある公園」と入力します。また通称としてよく使う「上野公園」の名称が無いので別名欄にあわせて追加し、右上の「保存」をクリックします。なお、この部分についてはごく一般的な内容しか記述しないため、出典表記は不要です。

![上野恩賜公園   Wikidata_edit_after.png](https://qiita-image-store.s3.amazonaws.com/0/35320/68a7afc8-82cc-92af-cd13-32b073be0a1a.png)

今度は「上野公園」で検索してみると以下のように候補が表示され、「別名」や「説明」があることで検索時に判別しやすくなったことが分かります。

![searchboc_after.png](https://qiita-image-store.s3.amazonaws.com/0/35320/6742e4c2-fbbb-ae20-6dd9-3e57c2c9b15a.png)

ウィキデータはこのように誰でも編集に参加することができます。

今回、編集の初めの一歩として、項目を識別するための部分（ラベル、説明、別名）を少し編集してみましたが、同じ物事や概念はひとつの項目で管理されており世界中からそれぞれの言語で更新されます。それはすなわちウィキデータがCC0の翻訳辞書としての利用も可能ということです。上の例でも日本語の下に英語の行がありますが、英語が分かる方はそちらも併せて充実させて行くと良いと思います。ラベルの下の「入力済みの全言語」をクリックするとそれ以外の言語も全て表示されます。

[ウィキデータの紹介#2](http://qiita.com/higa4/items/f6ca788ee2b0d1dfb099) | [ウィキデータの紹介#4](http://qiita.com/higa4/items/e07768c96ac66b72f792)
WebStorm/PhpStormでTerminalを開く

WebStorm/PhpStormでTerminalを開く手順です。

# 手順
0. 画面左下のアイコンにマウスカーソルを合わせる
![01.png](https://qiita-image-store.s3.amazonaws.com/0/115750/febf8925-a2ac-69ca-ce41-390b441c7b81.png)

1. [Terminal]をクリック
![02.png](https://qiita-image-store.s3.amazonaws.com/0/115750/1c5b9dd4-ddd6-d746-d541-a9588300ab68.png)

2. Terminalが表示されます
![03.png](https://qiita-image-store.s3.amazonaws.com/0/115750/1f79d9c4-59fb-3e53-c087-0890f90d97ca.png)
Windows環境でWebStorm/PhpStormのPreferencesを開く

Windows環境のWebStorm/PhpStormで、Mac環境でのPreferencesに相当する設定画面を開く方法です。

画面上部のメニューバーより、
[File]-[Settings...]
で開きます。

または、ショートカットキー Ctrl+Alt+S でも開きます。

[公式サイト](https://www.jetbrains.com/help/webstorm/2016.1/settings-preferences-dialog.html)にも載ってます。
UWPメモ　Windows 10 Mobile実機デバッグエラー

# 概要
Windows 10 Mobileの実機デバッグがエラーでなかなか出来なかったときの記録。

# 当時の環境
* Windows 10 Home
* Visual Studio Community 2015 Update 3
* Windows 10 Mobile (バージョンはRedstone1より前)

# Windows 10 Mobileを開発者モードに設定
設定の[更新とセキュリティ]
![w10m01.png](https://qiita-image-store.s3.amazonaws.com/0/142879/4f8ef8c0-e1fb-dbee-a744-36f5adc124e6.png)
*※画面はビルド10.0.14393.321のもの。バージョンによって設定項目の位置は変わるかもしれない。*

[更新とセキュリティ] - [開発者向け]
![w10m02.png](https://qiita-image-store.s3.amazonaws.com/0/142879/ea6f3605-0c4c-10a3-65c7-ee9df6d9aae9.png)

[開発者モード]を選択
![w10m03.png](https://qiita-image-store.s3.amazonaws.com/0/142879/45bdd8af-35a9-ddea-50da-547640163b89.png)

普通はこれだけですんなりいくと思われる。
しかし、、、
これでPCとUSB接続し、Visual Studioで作ったUWPアプリをターゲット：ARMでデバッグ実行。
↓
エラー。ブートストラップに失敗したとか何とか。
Windows Phone IP over USB Transport (IpOverUsbSvc)サービスを実行しろとか出た気がするが、サービスの一覧を見ると既に実行中になっていた。

# レジストリ編集

[visual studio 2015 - How to develop windows 10 uwp on real device (mobile)? - Stack Overflow](http://stackoverflow.com/questions/33473200/how-to-develop-windows-10-uwp-on-real-device-mobile)

レジストリエディターで
`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SirepClient`
キーを作成。
DWORDで`DisableProtocol3`を作成、値は1。
![w10m04.png](https://qiita-image-store.s3.amazonaws.com/0/142879/9d7a7d77-7680-a5b1-ea4d-9c6e9aee6b0e.png)

デバッグ実行を試みる。
↓
エラー。エラー内容は先ほどと変わらなかった気がする。

# デバイスマネージャーでWindows 10 Mobileを削除

デバイスマネージャーでユニバーサルシリアルバスデバイスからWindows 10 Mobile Deviceを削除。
その後USBを抜き差しして再度ドライバインストールさせる。
![w10m11.png](https://qiita-image-store.s3.amazonaws.com/0/142879/d773039c-0fc8-c41a-9e89-43387e23543b.png)

デバッグ実行を試みる。
↓
成功！！

レジストリ編集は意味があったのか不明だが、とりあえず動くようになった。
Unityでのマウス入力遅延

#移動

例えば、こんなスクリプトを書いて、Canvas上のImageにAdd Componentします。

```MouseInput.cs
using UnityEngine;
using System.Collections;

public class MouseInput : MonoBehaviour
{
	void Update()
	{
		Vector2 pos = Input.mousePosition;
		gameObject.transform.position = pos;
	}
}
```
すると、マウスの動きに合わせてImageが動くわけですが、OSのマウスカーソルに比べると、遅れてますよね？

WindowsとMacとAndroidで試したんですが、どれも遅れました。Macが一番遅れが少なかったですが、それでも2〜3フレーム、WindowsとAndroidだと5フレームくらい遅れている印象です(60fps換算)。Androidでは「開発者向けオプション→タッチ操作を表示」でタッチ位置が描画されるので、それで気付きました。

いろいろ試したんですが、どうやってもこの遅延は発生するようで、偉い人に「なんで遅れるの？」と聞かれたら、「そういうものです」とお答えください。ただ、「この遅れる感じがいい」と言われて、遅延付きタッチポインターを実装する羽目になると思います(実話)。

#ボタン

ついでに、

```MouseButton.cs
using UnityEngine;
using System.Collections;

public class MouseButton : MonoBehaviour
{
	void Update()
	{
		if (Input.GetMouseButtonDown(0))
			Debug.Log("Update: " + Time.time);
	}

	public void Down()
	{
		Debug.Log("Event: " + Time.time);
	}
}
```
これをCanvas上の別のImageにAddComponentして、さらにEventTriggerをAdd。PointerDownイベントを追加して、Imageをターゲットに、FunctionをMouseDown.Downにします。そして、画面をクリックすると…同じ時間が表示されますね。つまり、Updateが呼ばれる前に入力は確定するようです。

ということで、Unityではどの入力APIが速いとかそういうのはなさそうです。

…あ、でも、PointerClickやButtonのOnClickはダメですよー。これらはマウスボタンを押したタイミングではなく、離したタイミングで発生します。これを「オフトリガー」と言います。押して離すのにそんな時間がかかるの？と思われる方もいらっしゃると思いますが、あの高橋名人でも1秒あたり16連射。指の上げ下げに同じだけの時間がかかるとすると、(1000ms÷16)÷2=31.25ms。60fps換算で約2フレームも遅れることになります。音ゲーなんかだと致命的です。

というわけで、アクション性の強いものではボタンを押したタイミング、いわゆる「オントリガー」、PointerDownイベントを受け取りましょう。
Linuxで高速なUARTを使ってみた

Linuxで2MbpsなUARTを使ってみたら、ハマりましましたが解決できました。

組み込みARMな環境で2MbpsのUARTを使ってバイナリデータの連続受信をしてみました。

プログラムを何も書かなくて、1.1Mbps程度のストリームデータを処理できることがすばらしいです。

# 2Mbpsが設定できない
* [busybox](https://www.busybox.net/)のsttyだと2000000が設定できない
* [GNU coreutils](http://www.gnu.org/software/coreutils/coreutils.html)のsttyを使うと設定できる。
* コマンド例

```
# stty -F /dev/ttySC8 2000000
```

* 参照 : [UART Baudrate設定 : アットマークテクノ ユーザーズサイト](https://users.atmark-techno.com/node/1299) 

# データが受信できない。データが化ける。
* テキストデータなら、想定したデータが受信できるのに、バイナリデータだと受信できなかったり、データが抜けたりした。
* Linuxではttyはcookedと呼ばれる 状態になっており、テキスト転送用の設定になっている。 改行を受信しないと受信バッファからデータが取り出せないことがあります。
* raw モードにしたら解決しました。
* コマンド例

```
# stty -F /dev/ttySC8 raw
```

# データが化ける
* ジャンパケーブルみたいなので配線をするとデータが化けます。
* ケーブルを短くして、良い感じのケーブルを使いましょう。

# 動作確認
* バイナリデータの受信を確認する場合はodを使って16進ダンプを表示させると良い。

```
# od -x /dev/ttySC8
```

# 結果

上記の対応をしたら、2MbpsのUARTで安定してバイナリデータを安定して受信できるようになりました。
こんな感じでTSの再生ができました。　　(ただし、エラーフリーにはなっていないと思います。エラーフリーが不要な案件だったので。。。)

```
# cat /dev/ttySC8 | mplayer - 
```

# その他
* FDTIのUSB UART(FT232RQなど)は3Mbpsまで対応しています。Windowsでは3Mbpsは動作していました。　(FT232Hは12Mbpsまで対応とあるが、持っていないので試したことはないです。)
* UARTのデータ抜けが無い事をチェックするのは、https://github.com/geertu/fifotest と https://github.com/geertu/sertest でテストするのが良いみたいです。
Phalconのconfigをymlで管理したい！環境[ENVIRONMENT]も切り分けたい！

# Phalconのconfigをymlで管理したい！

配列で管理するのもいいけど、個人的にymlの方が楽なのでymlで運用したい。
用途別にymlを分割したいので、複数のymlがあってもいいようにしたい。

なので、作ってみました。

php7+Phalcon3.0.xでしかテストしてませんが
基本、全てのバージョンで動くはず！


# github

[PhalconRouter](https://github.com/ienaga/PhalconRouter)


# 必要なライブラリ

```
sudo yum install libyaml libyaml-devel php-pecl-yaml
```

# Composer

```json
{
    "require": {
       "ienaga/phalcon-router-for-yaml": "*"
    }
}
```

## BASE_PATH and APP_PATH

ベースのパスは`!base_path`でappへのパスは`!app_path`でできるようにする。

```yaml
all:
  application:
    appDir:         !app_path  /
    controllersDir: !app_path  /controllers/
    modelsDir:      !app_path  /models/
    migrationsDir:  !app_path  /migrations/
    viewsDir:       !app_path  /views/
    pluginsDir:     !app_path  /plugins/
    libraryDir:     !app_path  /library/
    cacheDir:       !base_path /cache/
    baseUri:        /project_name/
```


# app/config/config.php

```php:app/config/config.php
$configLoader = new \PhalconConfig\Loader();
return $configLoader
    ->setIgnore(["routing"]) // ignore yml names
    ->setEnvironment("stg") // default dev
    ->setBasePath(realpath(dirname(__FILE__) . '/../..'))
    ->load(); // @return \Phalcon\Config
```