OmniAICreator/Qiita-1.07M huggingface dataset:
Laravel プロジェクトを AWS の ELB 443(HTTPS) -> EC2 80(HTTP) とした時、強制的に HTTPS にする方法

**2017-09-15 追記**

https://github.com/fideloper/TrustedProxy を使うのが良さそう。

参考: https://laravel-news.com/trusted-proxy

2017-09-15 追記ここまで

**2017-09-20 追記**

TrustedProxy を使う方法書いた → https://qiita.com/hokutoasari/items/b25ddb48853638aded43

2017-09-20 追記ここまで


のメモ。

Laravel で作成したアプリケーションを ELB ４４３ で受けて、 EC2 の ８０ に転送していた場合、 route() 関連や redirect() 関連などなどが HTTP となってしまう。

ユーザーは ELB 越しに ４４３ の HTTPS でアクセスしているが、 Laravel 自身は ８０ の HTTP で動作しているから生じる現象。

すべてのリクエストを HTTPS として処理してしまって良い場合は以下の方法で対処可能。

`./app/Providers/AppServiceProvider.php` の `boot` メソッドに、以下の内容に追加する。

```
public function boot()
{
        if ($this->app->environment() == 'production') {
            URL::forceSchema('https');
        }
}
```

※`production` 部分は必要に応じて書き換える。

一部のリクエストだけ HTTPS にしたい場合などは、リンクやリダイレクトの処理時に明示的に示してコードを書くのが望ましいんやなかろうか。

また、それらを開発環境、検証環境でも妥当に動作するように環境構築しておくのが望ましそう。

また、 ELB から ８０ で受けない場合は、それほど気にしなくて良いが、もし、 ELB 80 -> EC2 80 も併用している場合、上記の設定だけでは URL 直打ちで HTTP で動作してしまうので要注意。
Lockyに見るランサムウェアの傾向と対策

[ランサムウェア](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%B3%E3%82%B5%E3%83%A0%E3%82%A6%E3%82%A7%E3%82%A2)とは勝手にファイルを暗号化して身代金を要求するマルウェアの一種です。最近、Lockyと呼ばれるランサムウェアの被害を目にする機会がありました。破壊されたファイルの復旧を試みましたが、前身と思われるVVVランサムウェア（[トレンドマイクロ社による情報](http://blog.trendmicro.co.jp/archives/12632)）で通じた復旧手法がことごとく対策されていました。

被害を最小限に食い止める対策を検討するため、プログラミング的な観点から考察を試みます。

# 注意事項

* 筆者はセキュリティの専門家ではありません。回答できるだけの知見もなく、**ご相談には応じかねます。**
* Lockyの検体をリバースエンジニアリングしたわけではありません。素人が下手に手を出すと感染の拡大を招く危険があるためです。
* 感染したのは筆者ではありません。ファイルの復旧を試みただけです。
* ファイルの復旧には失敗しました。**この記事に復旧方法はありません。**

# 感染経路

[トレンドマイクロ社による情報](http://esupport.trendmicro.com/solution/ja-JP/1113571.aspx)にも記載されている、Document2というスパムメールの添付ファイルから感染しました。

このメールは差出人が自分自身となっており、家と会社間で自分にメールを送る習慣のある人を油断させる狙いがあるようです。（そもそもそれ自体が情報漏洩につながる問題行為ですが、ここでは立ち入りません）

ウィルス対策ソフトは入れていましたが、パターンファイルが対応していないらしく検出されませんでした。ベンダーに連絡して、指示に従い検体を提出しました。

原因となった添付ファイルはただのブートストラップで、本体はダウンロードするようなので、いたちごっこが激しいようです。

# VVVとの比較

前身と思われるVVVランサムウェアはTwitterでも大きく話題になりました。

* [【VVVウィルス】広告を見ただけで感染する？新種のランサムウェアの被害が甚大すぎる - Togetterまとめ](http://togetter.com/li/909110)

このケースでは[ShadowExplorer](http://www.shadowexplorer.com/)というソフトで復旧できたようです。

* [【ランサムウェア】VVVウイルス(TeslaCrypt)の被害が場合によってはShadowExplorerというフリーソフトで復旧出来る？ - てすたんの日記](http://testan.hatenablog.com/entry/TeslaCrypt_ShadowExplorer) 2015.12.09

LockyではShadowExplorerは通用しませんでした。すべてのシャドウコピーは削除され、わざわざ破壊後にシャドウコピーが取られていました。

また、VVVではシャドウコピーの他、削除ファイル復元ツールでもサルベージできたらしいです。これもLockyでは通用しませんでした。

VVVの抜け道が知れ渡ったことに対して、ランサムウェアの作者が対策を打って来たことが読み取れます。背筋が凍ります。

悪質化した点として、VVVでは拡張子を変えるだけでファイル名が残るため何のファイルだったかは分かりますが、Lockyではファイル名もランダム化されるため元が何だか分からなくなります。

今の所、Lockyは破壊活動に専念するだけで、他のPCに感染することはないようです。しかしローカルネットワークの共有フォルダを探し出す機能があり、被害はネットワークに広がります。感染が広がったわけではないため、感染したPCを隔離すれば活動は封じ込められます。

ある程度破壊が進行してから、デスクトップを書き替えて脅迫文を表示します。この時点では既に手遅れです。

# ファイルの破壊手順

プログラミング的な考察です。

VVVでは復元ポイントが消されているのにシャドウコピーが残っていたことから、System Volume Informationフォルダは削除されなかったと思われます。Lockyでは削除されるようになったようです。

VVVで削除ファイル復元ツールが使えたことから、以下の手順で破壊活動を行ったと推測されます。

1. 別ファイルに暗号化
2. 元ファイルを削除

Lockyではファイルが削除された形跡がないことから、手順が変わったと思われます。

1. 元ファイルをランダムアクセスで開く
2. ファイル自身を暗号化データで上書き
3. ファイル名をランダムな16進数に変更（ユーザー識別IDをプレフィックスに含む）

このようなやり方をされると、復旧は事実上困難です。

逆に言えば、マルウェアではないまともなツールは復旧しやすく作るべきです。保存の際に別ファイルに書き出して完了後に置き替えるようにしないと、上書き保存中にバグで落ちれば旧ファイルを巻き添えにして消えてしまいます。実際にそういう挙動を示すソフトを見掛けることがあります。

# 並列実行

破壊されたファイルを時系列に並べると、複数のフォルダで並行して破壊活動が進行していたことが読み取れました。マルチスレッドで動いているのでしょうか？

1つの箇所に深く侵入するより、横に広がる戦略だと思われます。

処理速度はかなり高速で、2時間で4万ファイル（4GB）ほども処理されてしまいました。

# RAIDとバックアップ

RAIDはバックアップではないとはよく言われます。そのことを痛感しました。

今ほどマルウェアの脅威がなかった時代でも、ハードディスクはよく壊れました。それにはRAIDで対応できるため、それで十分だと判断したまま今に至っていました。

RAIDでは人為的なミス（削除・上書き）にも無力ですが、最近の低価格NASにはゴミ箱機能が実装されており、その程度のミスなら対応できていました。これもまたバックアップの必要性を感じなかった理由です。

バックアップがなければ悪意を持った攻撃には無力だという視点が欠けていました。

注意点として、バックアップは共有から外しておく必要があります。もしバックアップが簡単に使えるようにと読み書きで共有していれば、マルウェアの餌食になりバックアップの役目を果たせません。

## シャドウコピー

シャドウコピーが何の意味もないというわけではありません。

感染PCのシャドウコピーは削除されますが、NASに感染するわけではないため、NAS側にシャドウコピーがあれば復元は可能です。

# おわりに

とりとめもない内容になりましたが、実際にランサムウェアの被害に会った衝撃は大きく、記録として残しました。
Sisimaiでバウンスメールを解析してみる

### 内容
バウンスメールの解析用ライブラリである[Sisimai](http://libsisimai.org/)を会社で使う機会があったのでメモ。
(Perl版とRuby版がありますが、今回はRuby版を使ってます)
機能的には[bounceHammer](http://bouncehammer.jp/)のパース部分を抜き出した感じ。
(残念ながらこちらは2016/2/29を以ってEOL。すでにダウンロードできなくなってます。。。)

### 入手元とかマニュアルとか
URL: http://libsisimai.org/
GitHub: https://github.com/sisimai
ライセンス: 2条項BSDライセンス

### 検証環境  
Amazon Linux
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]

### 導入方法
\# gem install sisimai
\# gem list
...
sisimai (4.17.0)
oj (2.14.6)
...

### 使い方  
Sisimai.make("filename")でバウンス理由などをパースした結果を返してくれる。
dumpでJSON形式で出力してくれるので、DBに突っ込むとかいろいろ加工するとか。
超適当なスクリプトで実験。

```rb:sisimai-parser.rb
require 'sisimai'

param=ARGV[0]
files = Dir.glob(param + "/*")
unless files == nil
  files.each do |file|
    data = Sisimai.make(file)
    unless data == nil
      data.each do |d|
        mail = d.dump
        print(mail)
      end
    end
  end
end
```

```shell:sisimai-parser.sh
#!/bin/bash
if [ $# -ne 1 ]; then
  echo "ディレクトリが指定されていません"
  exit 1
else
  ruby ./sisimai-parser.rb $1
  exit 0
fi
```
GitHubのset-of-emailsレポジトリ下にテスト用のバウンスメールがあるので、適当に食わせてみる。(jqで見やすく表示してます)

```
# ./sismai-parser.sh set-of-emails | jq
...(略)...
{
  "token": "d0ded153a6032bcf57faf0e0cf6a533ffdbe1f98",
  "lhost": "mv-osn-hcb007.ocn.ad.jp", 
  "rhost": "mx01.example.co.jp",  
  "alias": "kijitora@example.co.jp",
  "listid": "",
  "reason": "userunknown",
  "action": "failed",
  "subject": "TEST",
  "messageid": "A8F82EDD-E518-4F5C-8C70-BC4EFF24AB9F@example.ne.jp",
  "replycode": "550",
  "smtpagent": "Postfix",
  "softbounce": 0,
  "smtpcommand": "RCPT",
  "destination": "example.co.jp",
  "senderdomain": "example.ne.jp",
  "feedbacktype": "",
  "diagnosticcode": "550 5.1.1 Address rejected kijitora@example.co.jp",
  "diagnostictype": "SMTP",
  "deliverystatus": "5.1.1",
  "timezoneoffset": "+0900",
  "addresser": "shironeko@example.ne.jp",
  "recipient": "kijitora@example.co.jp",
  "timestamp": 1274695609
}
```
すごい便利です。
Raspberry Pi3が通販で買える店（技適についても）

やっぱり最新モデル欲しいので調べてみてます。（2016/03/27：技適の件があるので、スイッチサイエンスさんを最初に持ってきました。）


[スイッチサイエンス](https://www.switch-science.com/catalog/2650/)
→技適についてかなり良い情報が。。（品切れかもですが目を通しておきましょう）
>いわゆる技適の表示について
本製品Raspberry Pi 3 Model B（RSコンポーネンツ製）について、工事設計認証を受けています。マニュアルと箱に技適マークの表示があります。基板本体への表示は確認しておりません。本製品については、製造者が認証機関に確認をとった上で「当該特定無線設備（取扱説明書及び包装又は容器を含む。）の見やすい箇所」への表示で問題ないと判断し出荷されています。
>
>マニュアルおよび箱への表示が適法であるためには、「当該表示を付すことが困難又は不合理である特定無線設備」である必要があります。「本製品について”表示を付すことが困難又は不合理である”として判断して問題ないか？」と総務省に確認したところ、表示については製造者によって判断されるとの回答がありました。
>
>製造者と認証機関の見解を尊重し、マニュアルおよび箱への表示を確認し販売しています。いざというときに提示する用途としてマニュアルと箱を保管いただくと安心です。

とのことですので、スイッチサイエンスさんで売ってる奴にはマニュアルと箱にマークついてるっぽいので、それを大事にとっとけばOK牧場のようです。


[Amazon](http://www.amazon.co.jp/s/ref=nb_sb_ss_i_1_12/378-9472225-5906808?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&url=search-alias%3Daps&field-keywords=raspberry+pi+3&sprefix=raspberry+pi%2Caps%2C310&tag=scfi-22)
→色々ありますが、技適マークがついてないやつも混じってる臭い（最初の方のロットとか？）。問合せて確認してから買って下さい。

[RS Online](http://jp.rs-online.com/web/generalDisplay.html?id=raspberrypi)
→いずとしれたRSさんですが、3/26時点で個人向け販売してない・・・？

[KSY](https://raspberry-pi.ksyic.com/)
→こちらだと、2.5AのUSBアダプタも専用であるみたいです。


[せんごくネット](http://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-4WLM)
~~→技適マークついてるのかしら？番号は記載してあるけど、、、ついてないと使っちゃダメだそうな。~~
→店舗で買ってきましたが、箱にマークついてました。

[leocom](http://www.leocom.jp/)
~~→なんか特設ページあるっぽですがリンク切れでてますね。（2016/03/26 1:37時点）~~
→その後リンクは動いてる様です。

[共立エレショップ](http://eleshop.jp/shop/g/gG3O311/)
→2016/03/27時点で在庫切れてますね。


[Farnell](http://uk.farnell.com/buy-raspberry-pi
)
→英語読める人、技適の事なんとかできる人向け。
→3/26に確認した時は在庫が２万５千位あった気がしますが、本日７千程度だったので大分売れてるようです（2016/03/27）


[マルツ](http://www.marutsu.co.jp/pc/i/599905/)
→3/~~27~~26の11時から店頭販売するそうですよ。
→2016/03/27時点で在庫切れてますね。


とりあえずそんなところでしょうか。


#2016/03/27追記：

USB電源については２．５Ａが推奨のようですが、丁度２．５Aってのが意外と無かったりするので、マニュアルに記載の２．０Ａ以上でるもの探したほうが良さそうです。
KSYさんで２．５Aのセットを買うか、
[RAVPower 24W 2ポート](http://www.amazon.co.jp/gp/product/B015NXGW82/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B015NXGW82&linkCode=as2&tag=scfi-22)
とか
[M4145 USBスマートタップ 2.4A 3コンセント電源+2USB](http://www.amazon.co.jp/gp/product/B00UEJ3I0G/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B00UEJ3I0G&linkCode=as2&tag=scfi-22)
とか？
あとiPadの充電器も２．０A位なのであまり激しい処理をしない場合はなんとか動くっぽいですね。
iPhone用の小さいのは１Aなのでご注意下さい。


#2016/03/30追記：
https://www.raspberrypi.org/blog/raspberry-pi-3-on-sale/
こちらの記載では、2.5Aアダプターが必要なのは電力を要するUSBを繋ぐ場合、というような記載があります。
>This time round, we’re recommending a 2.5A adapter if you want to connect power-hungry USB devices to the Raspberry Pi.

ただ、[該当記事](https://www.raspberrypi.org/blog/raspberry-pi-3-on-sale/)の下部のコメントでGPU使うと食うだのWifiの内訳がいくつだの色々コメントがあってよくわからんです。コメントしてる人が一般人なのか中の人（＝公式見解）なのかもパッと見た感じ不明。少なくとも上の引用部分は公式見解ですかね。

**接続するUSBの消費電力が低いということが確実な人は最小の2.0Aで**良さそうですが、逆に言うと、**今後どんなことするかわからんから念の為という人は2.5A**が良いのかもです。
余ったiPad用のアダプタある人は、とりあえずそれで運用しておいて、作業中にバシバシ落ちる用になってムキー！ってなってきたら買い足すでも良いのかも。
諸々、自己責任でご判断下さい。（まぁ、ラズパイは電子工作の一部と考えたら容量設計とかもちゃんと考えろよ、という公式からのフリ？違うか。）
Google Services(Google Spreadsheet & Google Apps Script & goo.gl & Google Calendar)を使った個人開発メモ

# 概要
とあるサービスを開発中に祝日情報がJSON形式で欲しくなり、Google Servicesで開発した時に感じたことの備忘録

# 使用したもの
|サービス名|用途|
|:--|:--|
|[Google Spreadsheet](https://www.google.com/intl/ja_jp/sheets/about)|Webブラウザでスプレッドシートを操作|
|[Google Apps Script](https://developers.google.com/apps-script/reference)|Google SpreadsheetをJavaScriptで操作|
|[goo.gl](https://goo.gl/)|Google Apps Scriptで公開したWebアプリのURLが長く使いづらいので、短縮したURLを生成|
|[Google CalendarのICAL<br>(設定->カレンダー->日本の祝日->カレンダーのアドレス->ICAL)](https://calendar.google.com/calendar/ical/ja.japanese%23holiday%40group.v.calendar.google.com/public/basic.ics)|iCalendar形式での祝日情報の取得|

# Google Apps Script
* 自分が使用したメソッドをリストアップ

|クラス|戻り値|メソッド(引数)|用途|
|:--|:--|:--|:--|
|Logger|Logger|log( data )|ログ出力|
|PropertiesService|Properties|getScriptProperties()|スクリプト単位のプロパティの取得|
|Properties|Properties|setProperty( key, value )|プロパティの設定|
||String|getProperty( key )|プロパティの取得|
|SpreadsheetApp|Spreadsheet|create( name )|スプレッドシートの作成|
||Spreadsheet|openById( id )|スプレッドシートを開く|
|Spreadsheet|String|getId()|スプレッドシートのID取得|
||Sheet|getSheetByName( name )|シートの取得|
||Integer|getNumSheets()|シート数の取得|
||Sheet|insertSheet( sheetName, sheetIndex )|シートの追加|
|Sheet|Range|getRange( row, column )|セル範囲の取得|
||Range|getRange( row, column, numRows, numColumns )|セル範囲の取得|
||Range|getDataRange()|データが入力されているセル範囲の取得|
||Integer|getLastColumn()|データが入力されている最後の列数の取得|
||Integer|getLastRow()|データが入力されている最後の行数の取得|
|Range|Range|setValue( value )|セルに値を設定|
||Range|setValues( values )|セルに値を設定|
||Object|getValue()|セルから値を取得|
||Object[][]|getValues()|セルから値を取得|
||Integer|getColumn()|セルの列番号を取得|
||Integer|getRow()|セルの行番号を取得|
||Integer|getMaxColumns()|シートの最大列数の取得|
||Integer|getMaxRows()|シートの最大行数の取得|
||Range|setFontColor( color )|文字色の設定|
||Range|setHorizontalAlignment( alignment )|水平方向の配置の設定|
||Range|setVerticalAlignment( alignment )|垂直方向の配置の設定|
||Range|setWrap( isWrapEnabled )|折り返しの有無の設定|
|UrlFetchApp|HTTPResponse|fetch( url, params )|HTTP通信を行う|
|HTTPResponse|String|getContentText()|HTTPレスポンスのコンテンツをテキストで取得|
|ContentService|TextOutput|createTextOutput( content )|テキストコンテンツを生成|
|TextOutput|TextOutput|setMimeType( mimeType )|MIMEタイプの設定|
||String|getContent()|テキストコンテンツの取得|

* 注意点

|問題|対策|
|:--|:--|
|Logger.log()の使用状況が限定される<br> - 通信ごとにリセットされる<br> - POSTメソッド実行時には表示できない|ログ出力専用シートを作成し、1ログを1セルに保存する|
|ライブラリを利用する側でライブラリのデベロッパーモードを有効にするときは注意が必要|デベロッパーモードが無効の場合は指定したバージョンが使用されるが、有効な場合はリアルタイムな状況のライブラリが使われることになるので、注意。<br>ただし、ライブラリとライブラリを利用するスクリプトを並行して開発する場合は有効にしておくと便利なので、最初は有効にしておきライブラリが安定したときに無効にするとGood!|
|公開したライブラリのバージョン削除は慎重に行う必要がある|Webアプリの場合、Webアプリとして公開した最新のバージョンは削除できないが、ライブラリの場合はライブラリとして利用されているバージョンでも削除できる。<br>もし、使用していたライブラリのバージョンが削除された場合は、実行時にライブラリが見つからずにエラーになる|

# 成果物
|サービス名|Google Apps Script公開形式|
|:--|:--|
|[ogas](https://github.com/liveralmask/ogas)|ライブラリ|
|[holiday](https://github.com/liveralmask/holiday)|Webアプリ|

# まとめ
* JavaScriptでスプレッドシートを操作すると気持ちいいので、Let's challenge!
* Googleが超ヤバイ！
JavaScriptのDomについて


## ノードとは
### 代表的なものは4つ存在する。
- documentノード
- elementノード
- textノード
- attributeノード


![20130421213050.png](https://qiita-image-store.s3.amazonaws.com/0/47909/d33a9cb3-e920-9587-62e3-bbd98ba9c447.png)

引用：<a href="http://akiok-jp.hatenablog.com/entry/2013/04/21/215225" target="_blank">【DOM連載#3】JavaScriptのDOMでHTML要素を追加・削除 - Noise of Web Programming</a>
複数の二次元多角形領域を調整修正（互いに素で、平面を余さず被覆）

こんにちは。
「複数の二次元多角形領域(polygon)が互いに素で、平面を余さず被覆」の集合となるよう調整修正を施す方法を探してみました。

目的は polygon同士のギャップや重なりを無くすことです。これらは検出が容易ではないですが、[結合](http://qiita.com/kkdd/items/775588319f01f5e03b11)させてみるとギャップの存在が分かります[^1]。

polygon の集合は GeoJSON 形式を仮定しました（入出力ファイル）。

- ogr2ogr ([GDAL](http://www.gdal.org/index.html)) で、```ST_MakeValid```を施し、各 polygon の self-intersection を修正する。

```console
$ ogr2ogr -f GeoJSON -explodecollections output.json input.json -dialect sqlite -sql "select ST_MakeValid(geometry) as geometry from OGRGeoJSON"
```

- [pprepair](https://github.com/tudelft3d/pprepair) (planar partition repair) ：入力形式は自動的に各種に対応しますが、出力形式は今のところ、 cmake の引数で指定した一種類です。入力ファイル内で ```"properties": {}``` のように空になっていると segment fault になります。

```
$ cmake -DDRIVER="GeoJSON" .
$ make
$ ./pprepair -h
$ ./pprepair -i input.json -v
$ ./pprepair -i input.json -o output.json -rrlb
```

----------
[^1]: 実例は、「[結合でできた「隙間」を排除する](http://qiita.com/yellow_73/items/739a8745d9f9513a0a38)」。
２．DRUPAL7のインストール続き

#[DRUPAL7のインストールその１からの続き](http://qiita.com/crimson_21/items/cbc44e7f287b7bebca21 "Qiita")

##GUIで下記のとおり進んでいきます

![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/13000/cb017df5-0589-e7d3-9f44-15276cf8ddec.png)

![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/13000/66a8cc78-e6d9-5280-332f-242d4b9a40a4.png)

![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/13000/1d5a7af4-340b-16de-a509-bfdaf09f5aef.png)

![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/13000/7327b91b-7f93-1743-2f9f-e8758fa0014e.png)

![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/13000/e34a9d6c-9a69-6696-6477-329cdbc982b5.png)

![007.png](https://qiita-image-store.s3.amazonaws.com/0/13000/f88f50ca-bcf6-3e91-ab3c-b0969638da8c.png)

![008.png](https://qiita-image-store.s3.amazonaws.com/0/13000/4ce31708-7437-0cc3-839e-dcfe6644dee7.png)

![009.png](https://qiita-image-store.s3.amazonaws.com/0/13000/7b6cb65e-a67a-01f3-c9ce-d8eb1d84b276.png)
Unity（ある意味）恐るべし


#売り切りライセンスにいつの間にか有効期限がつけられていた

Unityの英語サイトではライセンスを買おうとすると月額プランが推されるようになった。
一応今でも買い切りライセンスを（わかりにくいリンクを辿れば）買えるようにはなっていたが

Unity 5.x Pro perpetual licenses will be updated with new features, improvements and fixes until March, 2017.

と書いてあるのでこの記事を書いた時点であと1年しか持たないことになる。
月額7500円なら12か月使っても1年で9万円なので今から18万円出すのは明らかに損だ。

逆に日本語サイトでは未だに買い切りプランを押しているようだし、月額プランはわかりにくいところにリンクがある。
しかも買い切りプランがあと1年で期限が切れることに関しては書かれていなかった。
（もしかしたら日本語サイトから円建てで買った買い切りライセンスに有効期限をつける予定はないのだろうか？）

#自分がProfessional Licenseを購入した理由
1年以上前にライセンスを購入したが、iOSライセンスやAndroidライセンスを買っているわけではないので、意味がないように思われるだろう。

実は自分のお目当はProfessional Skinだ。

ダークインターフェイスは開発者の目に優しい。
黒い画面はデベロッパー達のスイッチをオンにする。
Dark interface makes a developer developer.

これのために18万払った。アホではない。しかも当時、金に余裕はなかった。

#ライセンスが失効したら
ライセンス購入時には聞いてもいない有効期限がついたわけだが、なんとかその後も永続的にダークなインターフェイスを使えないだろうか。

Professional Licenseがなければ設定画面からスキンを切り替えられない。（グレーアウトしている。）

思いついたのは直接的に設定ファイルを書き換えるのだ。
とりあえずMacなら~/Library/Preferences/com.unity3d.UnityEditor5.x.plistを編集すればいい。

ちなみに暗号化されているのでテキストエディタでは設定を編集できない。（化ける）
Xcodeでは化けずに開けたが、保存すると内容が壊れた。

なので
defaults write com.unity3d.UnityEditor5.x UserSkin -int 1
してみた。

無事に書き込めた。
Unityを再起動してみた。
　
　
　
　
　
　
　
　
　
　
　
　
　
　
　

ダメだった。

今回は10minutemailというサービスで
http://10minutemail.com/10MinuteMail
使い捨てのメールアドレスで使い捨てのUnityアカウントを作って実験した。
それでサブで使ってるMacに新規インストールして、先ほどのアカウントでログインして起動した。

つまり有効なライセンスがないとダメだということのようだ。

#終わりに

今の所、購入したライセンスが有効なのでいいのだが、失効したら目がチカチカする灰色インターフェイスに戻されるのだろうか？
できることならダークインターフェイスのみの提供でいいので今後のメジャーバージョンアップでも使い続けられるようにして欲しいものだ。
HTML,CSS勉強メモ #1

初めまして。
1年以上勉強してるんですが全く身にならず、あるブログでアウトプットすると良いと書かれていたので、こちらで勉強メモがてら日々書いていく事にしました。


##**勉強内容**##
`HTML`,`CSS`,`JavaSqript`
(いつか`Ruby`や`PHP`にも挑戦したいです)

##**教材**##
主にドットインストール

##**終了済**##
CSS入門,CSS3入門,JavaSqript入門,jQuery入門
HTML,HTML5は他サイトにて勉強

##**本日の進度**##
###CSSレイアウト入門:###
04ワンカラムレイアウトを作ろう
Atomにて実践
###CSS3入門:###
ベンダープレフィックスを使おう
までのノートまとめ


とりあえず今日は現在の状況について。
T460s に Linux を入れたときに TrackPoint でドラッグができない問題

`xinput test 'TPPS/2 IBM TrackPoint'` でイベントを見てみると、ボタンを押しっぱなしなのに button press の直後になぜか button release イベントが発生している。

原因はカーネルのドライバのバグ。
https://bugzilla.kernel.org/show_bug.cgi?id=114321 にてパッチが投稿されているので、現時点 (Linux 4.5) ではこれをあててビルドする必要がある。
おそらくどこかのバージョンでこのパッチが入ると思うので、それ以降は最新のカーネルを使えばよくなるはず。

## SEE ALSO
https://bbs.archlinux.org/viewtopic.php?pid=1611391
Dreamweaverでかゆいところに行きとどく設定、コマンド



## td要素をth要素に変更

プロパティインスペクタを表示
<a href="http://webdesignclass.blog.fc2.com/blog-entry-16.html" target="_blank">[Dreamweaver CS5.5]プロパティインスペクターが展開しないときは-初心者のためのWEBデザイン教室</a>
↓
セルを選択後、ヘッダにチェックボックスをチェック
<a href="http://momoka1099900.blog105.fc2.com/blog-entry-93.html" target="_blank">ドリームウィーバーで始めるホームページ制作記録　ドリームウィーバーtable内のthとtdの変更</a>


## 行や列の削除
Ctrl+Shift+M = 行の削除
Ctrl+Shift+- = 列の削除

<a href="http://bashalog.c-brains.jp/11/01/12-224206.php" target="_blank">【Dreamweaver】テーブルを組むときによく使うショートカットキー | バシャログ。 | 横浜でWeb制作を行うシーブレインスタッフによる技術情報ブログ</a>
GroongaでPDFを全文検索する（概要編）

[Groongaで学ぶ全文検索 2016-03-25 - Groonga | Doorkeeper](https://groonga.doorkeeper.jp/events/41015)のメモ。

## 目的

* PDFのテキストを検索したい
* Groongaは手段

## おおまかな流れ

* 1. インデックスを作る
  * 毎回grep（シーケンシャル検索）するのは遅い
* 2. 検索する

## こまかい流れ

### 1. インデックスを作る

* 1-1. 生データ用のテーブルを作る
* 1-2. PDFからテキスト（生データ）を抽出する
* 1-3. 生データをテーブルに入れる
* 1-4. インデックス用のテーブルを作る
  * すでにデータが入っているので、テーブルを作成したタイミングでインデックスが作成される（[静的インデックス構築](http://groonga.org/ja/docs/reference/indexing.html#offline-index-construction)）。
  * 先にインデックス用のテーブルを作成した場合、データを入れたタイミングで都度インデックスが作成される（[動的インデックス構築](http://groonga.org/ja/docs/reference/indexing.html#online-index-construction)）。

#### 1-1. 生データ用のテーブルを作る

* テーブル
  * `TABLE_HASH_KEY`が無難
  * キーにはPDFファイルのフルパスを入れる
  * 重複しないならファイル名だけでも可
* カラム
  * bodyカラム
  * PDFから抽出したテキストを入れる
  * 型に注意

#### 1-2. PDFからテキスト（生データ）を抽出する

* [Poppler](https://ja.wikipedia.org/wiki/Poppler)などを使う
  * Popplerに付属している`pdftotext`コマンドでPDFからテキストを取り出せる
  * [Ruby/Poppler](https://github.com/ruby-gnome2/ruby-gnome2/tree/master/poppler)を使えばRubyらしい書き方でPopplerを使える
  * 参考: [Ruby で PDF と戯れるの巻 - Qiita](http://qiita.com/yancya/items/2992cd21cf390570f47a)
* [Origami](https://github.com/mobmewireless/origami-pdf)というgemもある

#### 1-3. 生データをテーブルに入れる

* Groongaにデータを入れるloadコマンドはJSON形式
* エスケープが必要
* 抽出してエスケープしてGroongaのコマンドを出力するスクリプトを書けばコピペしなくて済む

#### 1-4. インデックス用のテーブルを作る

* はじめのうちは[おすすめ設定のテンプレ](https://gist.github.com/kou/6baea90d8acc714745fb#file-create-index-grn)を使おう
* テーブル
  * [`TABLE_PAT_KEY`](http://groonga.org/ja/docs/reference/tables.html#table-pat-key)
      * パトリシアトライ
  * [`TokenBigram`](http://groonga.org/ja/docs/reference/tokenizers.html#token-bigram)
      * N-gramの一種
  * [`NormalizerAuto`](http://groonga.org/ja/docs/reference/normalizers.html#normalizerauto)
      * 全角半角や大文字小文字を正規化
* カラム
  * `COLUMN_INDEX`
      * インデックスカラム
  * `WITH_POSITOIN`
      * 位置情報（文書内のどこに出現したか）をインデックスに含めるかどうか

### 2. 検索する

* `select`コマンド
* `--query`オプションでキーワードを指定
* `--output_collumn`オプションでほしいカラムを指定

## まとめ

* GroongaでPDF検索を実現できる
* [Honyomi](http://honyomi.nagoya/ja/)というGroongaを使ったPDFの全文検索エンジンがあるので、一から作らなくてもHonyomiを使えばいいかも
  * [GitHub](https://github.com/ongaeshi/honyomi)にソースコードが公開されているのでカスタマイズも可

## 雑談したこと

* GroongaのGは大文字
  * コマンド名を指す場合は小文字
* テーブル名の先頭は大文字にしたほうがよい？
  * 統一されていればどちらでもよいのでは
  * [チュートリアル](http://groonga.org/ja/docs/tutorial.html)では先頭大文字になっている
  * 最近は先頭小文字が流行り？（Rails界隈など）
* [SQLのように](http://www.geocities.jp/mickindex/database/db_manner.html#LocalLink-capital)、`select`などのキーワード（予約語）を大文字で書ける？
  * 書けない。大文字と小文字を区別しているため。
１．DRUPAL7のインストール

#DRUPALのインストール

まずは今回はDRUPAL7のインストールから。
例えばCentOS6でDRUPAL7を動かすにあたって必要となるパッケージは下記のとおりです。

##必要なパッケージの一覧

<dl>
  <dt>apache</dt>
  <dd>httpd</dd>
  <dt>PHP関連</dt>
  <dd>php</dd>
  <dd>php-mbstring</dd>
  <dd>php-mysql</dd>
  <dd>php-dom</dd>
  <dd>php-gd</dd>
  <dt>MYSQL関連</dt>
  <dd>mysql-server</dd>
</dl>

##インストールコマンド

```
yum -y install httpd php php-mbstring php-mysql php-dom php-gd mysql
-server
```

##mysqlの専用ユーザおよび専用データベースの作成

```
  create database [DB名];
　grant all privileges on [DB名].* to [ユーザ名]@localhost identified by '[パスワード]';
　flush privileges;
　exit
```
##DRUPALコア・日本語化ファイルのダウンロード
```
wget https://ftp.drupal.org/files/projects/drupal-7.43.tar.gz
wget http://ftp.drupal.org/files/translations/7.x/drupal/drupal-7.43.ja.po
```
##必要ファイルの展開と設置
```
tar zxfvp ./drupal-7.43.tar.gz
cp ./drupal-7.43.ja.po ./drupal-7.43/profiles/standard/translations/
mkdir /var/www/drupal7
cp -R ./drupal-7.43/* /var/www/drupal7/
chown -R apache.apache /var/www/drupal7
```
##apacheの設定
```
NameVirtualHost *:80
<VirtualHost *:80>
    ServerAdmin wabmaster@hoge.jp
    DocumentRoot /var/www/drupal7
    ServerName drupal7.hoge.jp
    ErrorLog logs/drupal7.hoge.jp-error_log
    CustomLog logs/drupal7.hoge.jp-access_log common
</VirtualHost>
```
##apacheのサービス起動
```
service httpd restart
```

以上でDRUPALを配置は準備OKです。
drupal7.hoge.jpにアクセスするとインストール画面に進みます。

#[DRUPAL7のインストールその２へ続く](http://qiita.com/crimson_21/items/5af2fe66559275657bf3 "Qiita")
名前ベースVirtualHost(SSL)をELBでうまいこと振り分ける方法

### この記事の内容

ELB(SSL Terminationしない) -> 複数の名前ベースVirtualHost(SSL)の振り分け設定でちょっとハマったので、調べて試してうまく行った結果をメモ。

### 環境

VPC: 192.168.0.0/16
Public Subnet: 192.168.0.0/24  (こっちにELB)
Private Subnet: 192.168.1.0/24 (こっちにEC2)

Apache: httpd-2.4.18

### やりたいこと  

- ELB (SSL Terminationしない) + EC2 (Apache + mod_ssl)
- 名前ベースVirtualHostで複数のサイトをホストする 

### httpd.confの設定(必要なところのみ)

```apache:httpd.conf

Listen 192.168.1.10:443

# ダミー用 (site-aとsite-bに該当しないものはすべて403扱いにする)
<VirtualHost 192.168.1.10:443>

    ServerName            dummy
    ServerAdmin           postmaster@example.com
    DocumentRoot          "/usr/local/httpd2/htdocs"
    DirectoryIndex        index.html

    SSLEngine On
    SSLCertificateFile    "/usr/local/httpd2/ssl/server.crt"
    SSLCertificateKeyFile "/usr/local/httpd2/ssl/server.key"

    <Directory "/usr/local/httpd2/htdocs">
        Require all denied
    </Directory>

</VirtualHost>

# site-a用のVirtualHost
<VirtualHost 192.168.1.10:443>

    ServerName            site-a.example.com
    ServerAdmin           postmaster@example.com
    DocumentRoot          "/var/www/site-a"
    DirectoryIndex        index.html

    SSLEngine On
    SSLCertificateFile    "/usr/local/httpd2/ssl/site-a.crt"
    SSLCertificateKeyFile "/usr/local/httpd2/ssl/site-a.key"

    <Directory "/var/www/site-a">
        Require all granted
    </Directory>

</VirtualHost>

# site-b用のVirtualHost
<VirtualHost 192.168.1.10:443>

    ServerName            site-b.example.jp
    ServerAdmin           postmaster@example.jp
    DocumentRoot          "/var/www/site-b"
    DirectoryIndex        index.html

    SSLEngine On
    SSLCertificateFile    "/usr/local/httpd2/ssl/site-b.crt"
    SSLCertificateKeyFile "/usr/local/httpd2/ssl/site-b.key"

    <Directory "/var/www/site-b">
        Require all granted
    </Directory>

</VirtualHost>
```

### ELBの設定
リスナーの設定で、ロードバランサー/インスタンスともにプロトコルをTCP:443に設定する。
こうすることで、ELBがL4レベルのロードバランサーとして振る舞う(単純に裏側のEC2インスタンスに振り分けられる)。
この際、ELBは当然HTTPヘッダを覗かないので、X-Forwarded-Forなどの情報を利用することはできなくなる。
つまり本来の接続元クライアントを特定することができなくなる(ApacheのログにはELBのプライベートIPアドレスが接続元として記録される)。
その代わりELBではX-Forwarded-Forの代用としてProxy Protocolをサポートするよう設定が可能である。
Proxy ProtocolはL4レベルで動作するプロトコルで、転送を受けたWebサーバはこちらの情報を参照することで、
接続元クライアントを特定することができる(Apacheは標準でサポートしてないみたい？)。


```
ステップ1: ロードバランサーの定義

・ロードバランサーを配置する場所: 192.168.0.0/16

・リスナーの設定

ロードバランサーのプロトコル  :  TCP
ロードバランサーのポート    　:  443
インスタンスのプロトコル      :  TCP
ロードバランサーのポート      :  443

・サブネットの選択: 192.168.0.0/24

ステップ2: セキュリティグループの割り当て
セキュリティグループ(sg_testとでも)
送信元: 0.0.0.0/0 ポート範囲: 443
を割り当てる

ステップ3: セキュリティ設定の構成
TCP -> TCPなので設定項目なし。次へ

ステップ4: ヘルスチェックの設定
ELBから届くところをPing対象として設定
タイムアウト、ヘルスチェック間隔など設定(この辺は自明なので段々雑になってきた...)

ステップ5: EC2インスタンスの追加
振り分け対象のEC2インスタンスを追加する(以下略)

```

### 確認

上記のような感じで設定をして
https://site-a.example.com/
https://site-b.example.jp/
にアクセスし、SSL接続可能なことを確認する。
USBメモリに出来た複数のパーティーションをWindowsの標準機能だけで削除する

#概要

USBメモリに、イメージファイルを書き込む等の操作をすると、複数のパーティーションや、大きな空き領域を持つUSBメモリが出来ることがあります。

Windowsのエクスプローラでは、単一のパーティーションのUSBメモリしか想定しておらず、先頭のパーティーションしか認識してくれません。
また、GUIの管理ツールである「ディスクの管理」でもUSBメモリのパーティーションを削除することが出来ません。※1

しかし、コマンドラインツールの「diskpart」コマンドを使うと、特別なツールをインストールすることなくパーティーションを削除することが出来ます。

※1 2018/5/7 追記
少なくともWindows7では上記の通りですが、改めて現在の環境 Windows10(Redstone 3(ver1709))で記事の内容を検証をしたところ、GUIでも複数パーティーションのUSBメモリを扱えるようになっていましたので、GUIでの手順を追記しました。


#手順
##コマンドラインの場合

「コマンドプロンプト」もしくは「ファイル名を指定して実行」からdiskpartを起動します。
`diskpart`

ディスクのリストを表示して、該当のUSBメモリのディスク番号を確認します。
`list disk`

リストで確認した番号でUSBメモリを選択します。
(番号を間違うと、cleanを実行した時に関係ないディスクのパーティーションを消してしまうので要注意)
`select disk [ディスク番号]`

念の為、選択したディスクの情報を表示し、間違いないことを確認します。
`detail disk`

cleanコマンドでディスクから構成情報を全て削除します。
(実行するとパーティーションが何もない状態になります。)
`clean`

プライマリパーティーションを作成します。
`create partition primary`

あとは通常の手順で好きなフォーマットでフォーマットすればOKです。

###実行例
![image.png](https://qiita-image-store.s3.amazonaws.com/0/36514/b71409d3-93ae-d1cb-82ed-721e1db49b91.png)
cleanコマンド実行前までの実行例


## GUIの場合(Windows 10)

スタートボタンを右クリックして「ディスクの管理」を起動します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/36514/a780bcf8-e179-595d-8a98-c75712109c00.png)



対象のディスクのパーティーションを右クリックして「ボリュームの削除(D)」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/36514/66b24739-55ab-d9a2-0063-b9f7c200b04b.png)

不要なパーティーションを削除出来たら「新しいシンプルボリューム(I)」でパーティーションを作成し、フォーマットすることが出来ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/36514/7162cc1b-9b0c-5213-178a-a303994cb85d.png)

### 補足
この方法は、Windows 7では「ボリュームの削除(D)」がグレーアウトして実行できません。
どのバージョンのWindowsから出来るようになったかは不明です。

### 余談
####「ディスクの管理」ツールを使ったボリュームの縮小に注意
「ボリュームの縮小」の機能が使えたので、この機能を使って手順確認用のUSBメモリを作成したのですが、元に戻す際に必要な「ボリュームの拡張」は未使用領域があってもグレーアウトしていて使えませんでした。
手順の再現確認をする際は注意して下さい。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/36514/45c8c794-8138-2fe4-71f0-56613d8e71ad.png)
Swiftのprotocol extensionで何でも通知に使えるようにする実験


Qiitaで面白い記事を読みました。

[Swiftでイベントをタイプセーフに送受信できるライブラリEventHubを書きました。 - Qiita](http://qiita.com/mishimay/items/6a9b8fc05cf04c55ea72)

その影響で（？）、自分でも通知周りの処理を書いてみました。

## 動作を確認した環境

|環境	|情報			|
|-------|---------------|
|Xcode	|7.3 (7D175)	|
|iOS	|9.3			|
|Swift	|2.2			|
|Date	|2016/3/25		|

## 使い方

・通知を区別するenumに、通知を実装したプロトコルを適用しておきます

```
enum PenTest: NotificationProtocol {
	case White
	case Gray
	case Black
}
```

・Observerの登録

```
PenTest.White.addObserver(self) { [weak self] in
	self?.stateLabel.text = "\(NSDate())"
}
```

・通知の送信

```
PenTest.White.postNotify()
```

自分で作ったenumがそのまま通知の識別子になって、そのまま送受信に使えるようになります。enumに適用する事を想定して作られていますが、何にでも使えるはずです。たぶん。

通知に関する処理はprotocol extension経由で実装されてるので、プロトコルの適用以外にする事はありません。


## ソースコード

こんな感じです。

```
import Foundation

/// 通知関係のプロトコル
protocol NotificationProtocol {
	func addObserver(observer: AnyObject, block: (()->Void))
	func postNotify()
}

/// 通知関係の実装
extension NotificationProtocol where Self: Equatable {
	func addObserver(observer: AnyObject, block: (()->Void)) {
		let notify = NotificationCenter.Observer(key: self, observer: observer, block: block)
		NotificationCenter.observerArray.append(notify)
	}

	func postNotify() {
		NotificationCenter.flash()
		for ob in NotificationCenter.observerArray {
			if let key = ob.key as? Self where key == self {
				if let block = ob.block as? (()->Void) {
					block()
				}
			}
		}
	}
}

/// 通知の管理をするための下請け構造体
struct NotificationCenter {
	struct Observer {
		let key: NotificationProtocol
		weak var observer: AnyObject?
		let block: Any?
	}

	static var observerArray = [Observer]()

	/// 不要になったObserverを排除
	static func flash() {
		observerArray = observerArray.filter() { ob in ob.observer != nil }
	}
}
```

## 問題点

* 通知に付随する情報を送る事が出来ません
* スレッド関係の事を考慮していません
* 真面目にテストしてません

『protocol extensionでこんな事が出来るよ』ってサンプル程度に見て下さい。
Python3.5 + mod_wsgi + Apacheを Macで動かすメモ

一時間くらい悩んだからメモ

mod_wsgiをインストール

```
pip3.5 install mod_wsgi
```

httpd.confに以下を追記（最下段でいい）


```apache:/etc/apache2/httpd.conf
LoadModule wsgi_module /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/mod_wsgi/server/mod_wsgi-py35.cpython-35m-darwin.so
WSGIScriptAliasMatch ^/wsgi-bin/((?!(?i:webobjects)).*$) /your/wsgi/script/dir/$1 #テスト用のファイル置き場のpath

<Directory /your/wsgi/script/dir/>
Order deny,allow
Allow from all
</Directory>
```
この`/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/mod_wsgi/server/mod_wsgi-py35.cpython-35m-darwin.so`
のpathをインストール時に把握しておく必要がある。これで詰まった。
バージョン変わったらモジュール名も変わると思う。

Apacheの再起動
```
sudo apachectl restart
```

httpd.confに設定したディレクトリにテストコードを置いて動作するか確認する

```python3:/your/wsgi/script/dir/test.py
def application(environ,start_response):
    status = '200 OK'
    response_header = [('Content-type', 'text/plain')]
    start_response(status, response_header)
    return [b"Hello World"]
```
権限付与忘れない

```lang:/your/wsgi/script/dir/
chmod 755 test.py
```

`http://localhost/wsgi-bin/test.py`にブラウザからアクセスして
Hello Worldが出たらおっけー
pushdとpopdとcurrent directoryの関係を分かりやすく表現する工夫

pushdはcdのように指定したディレクトリにcurrent directoryを変更するコマンドですが、pushdする前のディレクトリを記憶していて、pushdの後にpopdすると一個まえのディレクトリに戻れる便利コマンドです。

タスクをシェルスクリプトで自動化するときに、pushdとpopdを組み合わせると便利ですが、シェルスクリプト上で多重pushdをするとcurrent directoryがどこなのか分かりにくくなってしまいます。また、pushdにどのpopdが対応しているかも見えにくくなったりもします。

```bash:どのディレクトリにいるかわかりにくいシェルスクリプト
#!/bin/bash -eux

pushd /var
command
pushd /var/log
command
popd
pwd
command
popd
pwd
```

current directoryがどこなのか分かりやすくする工夫として、コマンドにインデントをつける方法が考えられます。

```bash:多少書き方を工夫したシェルスクリプト
#!/bin/bash -eux

pushd /var
	command
	pushd /var/log
		command
	popd
	pwd
	command
popd
pwd
```

この書き方の難点としては、エディタによっては自動インデントがうまく行かなかったり、IDEによってはインデントがフラットに勝手に直されてしまうことがあるのと、pushdとpopdの対応が他のコマンドに埋もれてしまって認識しにくい点が改善されていないことです。

こういった場合は、Bashの複合コマンド`{}`と`&&`オペレータを使って書くと、インデントでcurrent directoryが多少把握しやすくなるとともに、pushdとpopdの対応づけも出来て良さそうです。

```bash:
#!/bin/bash -eux

pushd /var && {
	command
	pushd /var/log && {
		command
	} && popd		
	pwd
	command
} && popd
pwd
```
ApacheでPHPのソースが表示される場合の対処

> [目的]
ApacheでPHPファイルを配置した際に、PHPが実行されずにソースが表示された場合の対処をする

[こちら](http://qiita.com/ikenyal/items/598e9972636f7a28e648) で構築した環境で、PHPファイルを配置した場合、PHPのソースがそのまま表示されてしまいます。

```php:PHPファイルとして配置してもブラウザでソースのまま表示される
<?php
echo phpinfo();
?>
```

PHPのソースが表示される要因として、ApacheにPHPモジュールが追加されていないことが考えられる。

/etc/httpd/conf/httpd.conf にモジュールを追加しようとすると、libphp5.so が存在しないため、エラーになる。

```apache:/etc/httpd/conf/httpd.confに追記
LoadModule php5_module modules/libphp5.so
```

```bash:Apache再起動するとエラーになる
service httpd restart
```
```shell-session
Redirecting to /bin/systemctl restart  httpd.service
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to manage system services or units.
Authenticating as: user
Password: 
==== AUTHENTICATION COMPLETE ===
Job for httpd.service failed because the control process exited with error code. See "systemctl status httpd.service" and "journalctl -xe" for details.
```

これは、libphp5.so が　/etc/httpd/modules/　配下に存在しないのが原因である。

そのため、libphp5.so を追加する。

```bash:yumでphpをインストール
sudo yum install php
```
```shell-session
読み込んだプラグイン:fastestmirror, remove-with-leaves, show-leaves
Loading mirror speeds from cached hostfile
 * base: ftp.iij.ad.jp
 * epel: ftp.kddilabs.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ php.x86_64 0:5.4.16-36.el7_1 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

================================================================================
 Package       アーキテクチャー バージョン                 リポジトリー    容量
================================================================================
インストール中:
 php           x86_64           5.4.16-36.el7_1            base           1.4 M

トランザクションの要約
================================================================================
インストール  1 パッケージ

総ダウンロード容量: 1.4 M
インストール容量: 4.4 M
Is this ok [y/d/N]: y
Downloading packages:
php-5.4.16-36.el7_1.x86_64.rpm                             | 1.4 MB   00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : php-5.4.16-36.el7_1.x86_64                      1/1 
  検証中                  : php-5.4.16-36.el7_1.x86_64                      1/1 

インストール:
  php.x86_64 0:5.4.16-36.el7_1                                                  

完了しました!
New leaves:
  php.x86_64
```

これで、libphp5.so が配置される。

```bash
ls /etc/httpd/modules/libphp5.so 
```
```shell-session
/etc/httpd/modules/libphp5.so
```

```bash:Apache再起動で反映
service httpd restart
```
BigQueryの追加機能 gcp next2016

以下公式ページでBigQueryのアップデート内容について記載されていたので、あとでぱっとみて分かるように以下のページを意訳してまとめてみた。

https://cloud.google.com/blog/big-data/2016/03/google-bigquery-cuts-historical-data-storage-cost-in-half-and-accelerates-many-queries-by-10x

# 90日以上前に作成されたデータのコストは半分になる
0.02ドル / GB /Monthのコストが90日以上前のデータだと0.01ドル /GB /Monthに自動的にしてくれる。
対象のテーブルを更新した場合はリセットされる。
値段が安くなるからといって、データが低速のディスクにいったり、パフォーマンスが落ちたりすることはない。

# Capacitor Storage Engine
ColumnIOからCapacitorに置き換えたことにより、クエリが10倍から1000倍高速になる。いくつかの改良点はあるが、Capacitorでは圧縮データをそのまま操作することが可能。

以下は公式ページの図を引用。
ColumnIO
![bq-cost-ten-2.png](https://qiita-image-store.s3.amazonaws.com/0/95399/a635e9bc-01a9-2979-3b9a-1588dd52fbe6.png)

Capacitor
![bq-cost-ten-4.png](https://qiita-image-store.s3.amazonaws.com/0/95399/2713d674-70e6-5389-78e8-592a4649fb96.png)

ColumnIOでは圧縮されたデータを解凍したものに対してwhereで指定したのを比較しているが、CapaciorではWhereで指定したのを圧縮してから比較し、指定しているcolumnのみ結果を解凍している。上記の例だと、ColumnIOでは6x2個のデータを解凍しているが、Capacitorでは1個のデータのみ解凍している。このため演算処理対象が少なくなり高速化の要因となっていると思われる。
※ここは自分の解釈であり、公式資料には記載なし。

# Poseidon
クエリに影響を与えることなく、ImportとExportが5倍高速になった。
Dremelの効果を活用するためにImportとExportのPipelineをリビルドした。

# Table Partitions v1 - Alpha
テーブルパーティションの最初のバージョンで、利用者は1つのテーブルだけでデータを管理することができるようになる。自動パーティショニングはデータ処理を安く、速く、簡単にする。
最初のバージョンのテーブルパーティションはデフォルトで、BigQueryにデータをインジェストした時刻をベースにパーティショニングされる。将来的にはユーザが設定した時刻をベースにパーティショニングできるようにカスタマイズできる。

公式ページの図が分かりやすいので引用させてもらう。
テーブルパーティションの前は以下の図のように、日付毎にテーブルを分けてTABLE_DATE_RANGEを使っていた。
![bq-cost-ten-3.png](https://qiita-image-store.s3.amazonaws.com/0/95399/66ce47bc-b372-cd09-a152-59e4e5f157ca.png)

テーブルパーティションを使う場合、BigQueryが自動的に日付単位にパーティショニングし、_PARTITION_LOAD_TIMEを使う。

![bq-cost-ten-10.png](https://qiita-image-store.s3.amazonaws.com/0/95399/46c6d734-37e6-3917-b2d5-312289e5fff4.png)

テーブルパーティションを適用する前、c1とc3の列で20160103と20160104のデータだけ分析したいケースであっても、列全てを読み込んでいた。

![bq-cost-ten-5.png](https://qiita-image-store.s3.amazonaws.com/0/95399/17457b90-c6b6-367f-e1e6-b65557db33c9.png)

テーブルパーティションを使用すると、どのパーティションを読み込むか指定できる。この例ではc1とc3の列で、さらに20160103と20160104のパーティションだけ読み込む。読み込むデータが少なくなるのでコストセーブになる。

![bq-ten-11.png](https://qiita-image-store.s3.amazonaws.com/0/95399/67d63af3-2e88-e9df-e20e-9e63a0bd5680.png)


# AVROフォーマットのサポート
CSVとJSONに加えてAVROもサポートするようになった。

```
# GCSにAVROファイルに対してクエリをかける
bq query --external_table_definition=foo::AVRO=gs://test/avrotest.avro* "SELECT * FROM foo"

# AVROファイルをGCSからBigQueryにロードする。 
bq load --source_format=AVRO project:dataset.dest_table gs:://test/avrotest.avro
```

# 自動スキーマ検知
BigQueryにCSVやJSON，AVROファイルをロードするとき、BigQueryはスキーマを自動的に検知しようとするようになった。
Googleの人工知能ロボットハンドの論文を読んでみた

最近では[AlphaGo](https://ja.wikipedia.org/wiki/AlphaGo)が世間を騒がせていますが、今度はGoogleがロボット14台を並べてハンドで物をつかむのを800,000回の学習データを使って学習させた研究が発表されました。

![robots.png](https://qiita-image-store.s3.amazonaws.com/0/14516/4e3569f6-1b98-2bc1-3ab2-9f65cc132903.png)


http://googleresearch.blogspot.jp/2016/03/deep-learning-for-robots-learning-from.html
http://gigazine.net/news/20160310-google-deep-learning-robot/

論文は以下にあります。
http://arxiv.org/pdf/1603.02199v1.pdf

驚いたのは、ただ色んな物をつかむだけでなく、**散らかった環境から邪魔なものはどけつつ、物をつかむ**のを学習によって習得したそうです。さらに、**ロボットには個体差を持たせていて、カメラ位置、ハンドの形状が異なるそうです。**以下がその驚きの動画です。

[![](http://img.youtube.com/vi/l8zKZLqkfII/0.jpg)](https://www.youtube.com/watch?v=l8zKZLqkfII)

今回はこの論文を読んだ内容をまとめてみたいと思います。

#CNNによる把持成功予測
次のような構成のCNNを学習します。

![cnn_structure.png](https://qiita-image-store.s3.amazonaws.com/0/14516/4fa58510-7d78-251a-ae73-5064f9d6b356.png)

* 入力
    * 初期画像 $I_0$ (サイズ472×472)
    * 現在画像 $I_t$ (サイズ472×472)
    * $v_t = 最終ハンド位置 - 現在ハンド位置$
* 出力
    * 把持成功確率

画像はロボットハンドの上部に設置された単眼カメラから取得されます。一連の把持シーケンスが$T$ステップで行われるとしたときに、$i$番目の把持シーケンスにおいて、$(I_t^i, p_T^i - p_t^i, l^i)$を学習データに用いるようにします。ここで、$p_T^i$は最終ハンド位置、$p_t^i$は$t$ステップ目でのハンド位置、$l^i$は$i$番目の試行における把持成功かどうかのラベルです。

#CNNからモータコマンドの作成
現在画像$I_t$から最適なモータコマンド$v_t^*$を求めます。
方法としては、上で説明したCNNを使って、現在画像を入力した際に出力の把持成功確率が最大になるように入力$v_t$を求めます。

```math
\newcommand{\argmax}{\mathop{\rm argmax}\limits}
v_t^* = \argmax_{v_t} (g(I_t, v_t))
```

最適化の手法としては[CEM(Cross Entropy Method)](https://en.wikipedia.org/wiki/Cross-entropy_method)という手法が用いられています。
この$v_t^*$をそのまま使うのではなく、アームを動かさないとき(その位置で把持する)の確率$g(I_t, \emptyset)$との比を計算して、その値に応じてモータコマンドを決定しているようです。

#データ収集
まずランダムなモータコマンドから開始して、ステップ数$T=3$でデータを集めます。全データ中半分はランダムモータコマンドによって得られたデータを用いて、もう半分はそれまでとられたデータが適用されたネットワークから得られたデータを用います。ネットワークは4回更新し、把持シーケンスのステップ数$T$を3〜10まで増加させています。

#結果
以下の4つの方法を比較して本手法の優位性を示しています。

* ランダムに動作を行った場合
* ハンドチューニング動作
* オープンループ(画像を最初だけ用いて、その中で把持確率が高い物体を把持する動作)
* 提案手法(毎タイムステップでモータコマンド求めるサーボループ)

提案手法はランダムやハンドチューンよりもちろん良い結果なのですが、オープンループと比較しても半分くらいの失敗率になってました。

#まとめ
このタスクでは比較的閉じられた世界での学習データ収集が可能ですが、今後は様々なタスクを行っていくために実世界でのロボットによるデータ収集方法を考えていくそうです。

#感想
いよいよ実ロボットでもDeep Learningが使われ始め、成果が出てきているのを見ると、SFに出るようなAIも夢では無い気がしてワクワクしてきますね。まだまだ今後も発展していく分野だと思うので、自分も勉強していきたいと思いました。
iOS appの名前を変更する

アイコン下のアプリ名はデフォルトではプロジェクト名ですが特定の名前をつけたい場合は下記を変更します。

 Info.plist ファイルを選択
　+　で新規作成
　Bundle Display name　を選択して特定の名前を設定

以上
Crafting Rails4 (Chapter1) 1


```bash
vagrant init
```

```bash
vi Vagrantfile
```

```Vagrantfile
Vagrant.configure(2) do |config|
  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", 2048]
  end

  config.vm.define "crafting_rails_vm" do |crafting_rails|
    crafting_rails.vm.box = "centos_6.6"
    crafting_rails.vm.network "private_network", ip: "192.168.33.100"
  end
end
```

```bash
vagrant up
```

```bash
vagrant ssh
```

password is vagrant

```bash
su -
```

```bash
cd /usr/local/src/
```


```bash
wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.0.tar.gz
```

```bash
tar xvzf ruby-2.3.0.tar.gz
```

```bash
cd ruby-2.3.0
```

```bash
./configure
```

```bash
make
```

```bash
make install
```

```bash
gem install rails -v 4.0.0 --no-rdoc --no-ri
```

```bash
mkdir -p /var/www/crafting_rails
```

change to vagrant user

```bash
exit
```

```bash
cd /var/www
```

```bash
sudo chown -R vagrant:vagrant crafting_rails
```

```bash
cd /var/www/crafting_rails/
```

```bash
rails plugin new pdf_renderer
```

```bash
cd pdf_renderer/
```

```bash
rake -T
```

```bash
vi test/dummy/config/boot.rb 
```

exists → exist

```ruby:test/dummy/config/boot.rb 
equire 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
```

```bash
rake test
```
ソフトウェアの特許出願に際して発明者から聞きたいこと

はじめに
---
現在、私は弁理士として特許出願等の業務を担当している。
特許出願を依頼された際に、発明者からどんなことを聞きたいかということを記載してみる。
ソフトウェアの特許出願をするプログラマの参考になれば幸いである。

聞きたいこと概要
---
1. 従来技術とその問題点
2. アルゴリズムのうち、従来と違う点
3. 入力、出力（表示画面など）
4. 効果(何がいいのか)
5. アルゴリズムと効果との関係
6. どういうことに使い、どういうことで収入を得る予定なのか

特に5と6が重要である。

従来技術とその問題点
---
もともとあった最も近いと思われる技術を教えてほしい。出来れば、その技術が記載された文献、基礎となる技術が記載された文献(URL等)を知りたい。また、従来技術の問題点があればそれも教えてもらいたい。

アルゴリズムのうち、従来と違う点
---
「新しい」と思えるところがあればそれを教えてほしい。
フローチャートなどの図面もあるとありがたい。例えば、ALPHA GOなら、囲碁のプロ棋士の棋譜をディープラーニングで模倣するように学習したのち、自己対戦で学習を繰り返すなど。

入力、出力
---
どういう入力でどういう出力がなされるのか。どこから入力され、どこに出力されるのか。
入力は予め保存しておくべきデータなどもあるといい。ALPHA GOなら、囲碁のプロ棋士の棋譜、局面が入力で、選択された一手、局面の評価値が出力であるなど。
図面があるとうれしい。

効果
---
何が便利になるのか。例えば、ALPHA GOなら、プロ棋士に勝てるくらい強いアルゴリズムが出来るなど。

アルゴリズムと効果との関係
---
アルゴリズムからなぜ効果が奏されるのか。これがいわば（日本では）特許になるかどうかを決めるところだと思う。
例えば、従来は、計算量が膨大になってしまうために、時間内に適切な手を選択することができるアルゴリズムを作れなかったが、ALPHA GOでは、囲碁のプロ棋士の棋譜をディープラーニングで学習しているので、有力でない手を計算対象から除外することが出来、計算量を大幅に削減することが出来た。これにより、時間内に適切な手を選択することができるようになった。
アルゴリズムから効果までが飛躍なく説明されていることが重要である。

どういうことに使い、どういうことで収入を得る予定なのか
---
どういうことに使い、どういうことで収入を得る予定なのかで、どのように出願書類を作成するかも変わってくる。
例えば、ALPHA GOならば、プロ棋士と公開対戦をすることで、その対戦の棋譜を販売するなどで収入を得るのか、それともALPHA GOによる碁の有力手に関する情報を提供する会員制のサイト等を運営することにより、収入を得る予定なのかなどが判るとうれしい。
飛び飛びArrayのイテレート

ブラウザのコンソールで直接JavaScriptをゆるゆるいじってるときに、
range関数が欲しいなーと思って、さくっとnew Array(length).mapとやったら失敗。

```js
// こういうのが欲しい
// range(10);
// => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

function range(num){
  return new Array(num).map(function(_, i){
    return i;
  });
}

range(10);
// => [undefined × 10]
```

？？？

なんで？どうして？教えてMDN！

> map は、与えられた callback 関数を配列の各要素に対して順番に一度ずつ呼び出し、その結果から新しい配列を生成します。callback は値が代入されている配列のインデックスに対してのみ呼び出されます。つまり、すでに削除されたインデックスや、まだ値が代入されていないインデックスに対しては呼び出されません。
> [Array.prototype.map() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map)


はえー。
**「インデックスが飛び飛びのArrayオブジェクト」はイテレートも飛び飛びになる**ようだ。
for文と食い違って混乱するから使わないほうが無難だね。
（というより、そもそも飛び飛びのArrayオブジェクトはあまり使わない方が良いのだろうが。）

```js
// undefinedのとこだけ(undefinedという)「値がある」状態。
// 他は「値が無い(undefined)」状態。
var arr = [,,,,,,,,undefined,,,,,,,,]; 

// lengthも適当に入れてみる
arr.length = 100;

// イテレートしても呼ばれるのは一回だけ！
arr.forEach(function(value, index){
  console.log(value + ',' + index);
});
// => undefined,8

// もちろんfor文なら全部回る
for(var i=0, len=arr.length; i<len; i++){
  console.log(arr[i] + ',' + i);
}
// => undefined,0
// => undefined,1
// => ....
// => undefined,99
```

----

「飛び飛びのArrayオブジェクト」から「みっちり詰まったArrayオブジェクト」に変換するには
Array.fromが使えた。（非対応ブラウザではPolyfillが必要）

* [Array.from() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/from)

Array.fromはArrayのようでArrayではない、ArrayもどきオブジェクトをArrayにする関数。
argumentsやNodeListでArray.prototypeの関数使いたいときによく使う。
これでnew ArrayしたオブジェクトをArrayに変えられる。

new Array(length)はArrayもどきオブジェクトだった...？

```js
// コンソール上の表示も変わる
new Array(3); // => [undefined × 3]
Array.from(new Array(3)); // => [undefined, undefined, undefined]

Array.from(new Array(10)).map(function(_, i){
  return i;
});
// => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

// lengthさえあればOK
Array.from({length:10}).map(function(_, i){
  return i;
});
// => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```

なお、argumentsのArray化でよく見かけるArray.prototype.slice.callは、
飛び飛びのArrayに対しては使えないようだ。

```js
Array.prototype.slice.call(new Array(10)).map(function(_, i){
  return i;
});
// => [undefined × 10]
```

rangeの作り方調べてたら、さらなる黒魔術もあるのを知った。なにこれ怖い！

```js
Array.apply(null, {length: 10}).map(Number.call, Number);
// => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```

* [JavaScriptで0からn-1までを要素にもつArrayを作成する方法 - blog.scheakur.com](http://blog.scheakur.com/post/96000209437/javascript%E3%81%A70%E3%81%8B%E3%82%89n-1%E3%81%BE%E3%81%A7%E3%82%92%E8%A6%81%E7%B4%A0%E3%81%AB%E3%82%82%E3%81%A4array%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)

ちなみに、数字をpushなりして作る方がはるかに速いので、
真面目にrange使うなら普通に作りましょーね。（台無し）


追記:
Spread operator使ってもみっちり化できた。だからどーした！

```js
(function(...arr){
  return arr.map(function(_, i){
    return i;
  });
}).apply(null, {length: 10});
// => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
```
Groongaで学ぶ全文検索2016-03-25


今回も全文検索の具体例を見てみました。

## やりたい事
PDFの本文を全文検索して、キーワードが含まれるパスを取得する

## 全体の流れ
1. PDFをテキストに変換
1. Groongaに投入
1. この状態で検索 
1. インデックス作成
1. 再度検索

## やってみる

###1)PDFをテキストに変換<BR>

https://poppler.freedesktop.org/
などを使ってPDFをテキストに変換する

###2)Groongaに投入<BR>

テーブルとカラムを作成する

```
$ groonga -n ./pdfs.db < create-table.grn
```


```create-table.grn
table_create pdfs \
  TABLE_HASH_KEY \
  ShortText

column_create pdfs body \
  COLUMN_SCALAR \
  Text
```

データを投入(データはJSONにする)

```
$ groonga pdfs.db < load.grn
```

load.grn
https://gist.github.com/kou/6baea90d8acc714745fb#file-load-grn


###3)この状態で検索<BR>
0.02秒で検索できました。

```
$ groonga pdfs.db < select.grn
[
  [
    0,
    1458908822.06077,
    0.0255997180938721
  ],
  [
    [
      [
        1
      ],
      [
        [
          "_key",
          "ShortText"
        ]
      ],
      [
        "/usr/share/doc/virtualbox/UserManual.pdf"
      ]
    ]
  ]
]

```

```select.grn
select pdfs \
  --query body:@API \
  --output_columns _key \
  --output_pretty yes
```

###4)インデックス作成<BR>

```
$ groonga pdfs.db < create-index.grn
[[0,1458909124.8641,0.00386977195739746],true]
[[0,1458909124.86806,0.0781242847442627],true]
```


```create-index.grn
# 「terms」以外はテンプレ
table_create terms \
  TABLE_PAT_KEY \
  ShortText \
  --default_tokenizer TokenBigram \
  --normalizer NormalizerAuto

# 「terms」と「body_index」と
# 「pdfs」と「body」以外はテンプレ
column_create terms body_index \
  COLUMN_INDEX|WITH_POSITION \
  pdfs \
  body
```

###5)再度検索<BR>

0.0013秒で検索できました！

```
$ groonga pdfs.db < select.grn
[
  [
    0,
    1458909188.45909,
    0.00138068199157715
  ],
  [
    [
      [
        1
      ],
      [
        [
          "_key",
          "ShortText"
        ]
      ],
      [
        "/usr/share/doc/virtualbox/UserManual.pdf"
      ]
    ]
  ]
]
```

```select.grn
select pdfs \
  --query body:@API \
  --output_columns _key \
  --output_pretty yes
```

## まとめ

インデックスを使うとやはり速い！

## その他メモ

* PDFを検索するならHonyomiを使うのが良いかも<BR>
https://github.com/ongaeshi/honyomi

Ruby + Groonga で作られた検索エンジン
検索したPDFの画像が表示されるものでとても良くできているなと思いました！
frisbyでPostのAPIのテストを実行する

# 1.準備(環境はMac 10.11.4)
1. node.jsが入ってない時は、[pakageをダウンロードする](https://nodejs.org/en/)。v4.4.1でOK。
2. 下記を実行する。

```
mkdir frisbytest
cd frisbytest
sudo npm install frisby
sudo npm install -g jasmine-node
```

# 2.テスト実施
1.ディレクトリを作成する。

```
mkdir spec
cd spec
vim first_spec.js
```

2.テストを記載する。
例えば、curlで書くと↓な感じの場合、

```
curl \
    -X POST \
    -H 'Host:example.com' \
    -d '{
        "api": "auth",
        "params": {
            "id": "hoge",
            "password": "fuga"
        }
    }' \
    http://192.168.1.2/test ;
```

↓な感じ記載します。

```javascript:first_spec.js
var frisby = require('frisby');
frisby.globalSetup({
    request: {
        headers: {'Host': 'example.com'}
    }
});

frisby.create("sample test").post(
    "http://192.168.1.2/test",
    { api: "auth",
      params : {
        service_key: "hoge",
        service_id: "fuga"
      }
    }, {json: true} )
.inspectJSON().toss();

```

3.テストを実行する。
jasmine-nodeはspec.jsというファイル名であればテストとして実行してくれます。
↓みたいだったらOKです。

```
$ jasmine-node .
{ result: { code: 200 }}
.

Finished in 0.163 seconds
```


# 参考
上記ではAPIを実行して結果を確認するだけでしたが、期待するjsonやステータスコードとかもいろいろ書けるようですので、いろいろ試してみてください。  

- [REST APIのテストをFrisbyで自動化する](http://blog.asial.co.jp/1259)  
- [【Node.js】Jasmine/Frisbyで はじめる ガチのWebAPIテスト入門](http://ttr-hamasaki.hatenablog.com/entry/2015/09/27/070557)  
- [frisby.js document](http://frisbyjs.com/docs/api/)
TensorFlow動作確認メモ



MacOSX環境

```
$ python --version
Python 2.7.9 --  64-bit 
$ sudo easy_install --upgrade six
$ sudo pip install --upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.6.0-py2-none-any.whl
```

```test.py
import tensorflow as tf

def x2_plus_b(x, b):
    _x = tf.constant(x)
    _b = tf.constant(b)
    result = tf.square(_x)
    result = tf.add(result, _b)
    return result

with tf.Session() as sess:
    result = sess.run([x2_plus_b(2., 3.)])
    print result
```

```
$ python test.py 
I tensorflow/core/common_runtime/local_device.cc:40] Local device intra op parallelism threads: 4
I tensorflow/core/common_runtime/direct_session.cc:58] Direct session inter op parallelism threads: 4
[7.0]
```

とりあえず動いたので、次からは何をしているか確認していく。
java による template engine benchmarks のリポジトリ実行してみた

https://github.com/agentgt/template-engine-benchmarks やってみました。

mac で clone して `ant all` しただけ

```
stringbuilder:
     [java] ntimes: 10000, real time: 505(msec)

freemarker:
     [java] ntimes: 10000, real time: 1507(msec)

velocity:
     [java] ntimes: 10000, real time: 1089(msec)

beetl:
     [java] ntimes: 10000, real time: 749(msec)

rythm:
     [java] ntimes: 10000, real time: 632(msec)
     [java] 3 25, 2016 7:18:57 午後 org.rythmengine.RythmEngine
     [java] 情報: Shutting down Rythm Engine: [re-E0S]

jamon:
     [java] ntimes: 10000, real time: 971(msec)

httl:
     [java] ntimes: 10000, real time: 461(msec)

jmte:
     [java] ntimes: 10000, real time: 1589(msec)

jangod:
     [java] ntimes: 10000, real time: 7038(msec)

thymeleaf:
     [java] ntimes: 10000, real time: 12632(msec)

mustache:
     [java] ntimes: 10000, real time: 903(msec)

jmustache:
     [java] ntimes: 10000, real time: 1906(msec)

handlebars:
     [java] ntimes: 10000, real time: 1775(msec)
```

![image](https://qiita-image-store.s3.amazonaws.com/0/116987/a65595c2-b116-aa75-1e49-9800ecb812f2.png)

↓ thymeleaf,jangod を除いたグラフ

![image](https://qiita-image-store.s3.amazonaws.com/0/116987/0022662c-d843-1029-b507-bc3b95783171.png)

spring boot でレンダリングの速度気にするなら freemarker か mustache かな？
thymeleaf なら csrf token 自動挿入、html 自動エスケープ(?) のメリットもある。
電子工作 > Link > OPアンプ > NJM2904D > 単電源

OPアンプを２種類購入した。

そのうちの片方の単電源動作のもの。
http://akizukidenshi.com/catalog/g/gI-09216/

2回路だがとりあえずは１回路だけ使う

- 1: A
- 2: -
- 3: +
- 4: V-
- 5: V+

`V-`については未学習。とりあえずGNDにしておいて、`V+`に3Vをいれてみる。