OmniAICreator/Qiita-1.07M huggingface dataset:
存在すら無視された gen_server:start_link の返り値

最初に断わっておくが、無視し続けても何も困らない可能性があるので、このページを見ても、内容は直ぐに忘れてもらっても構わないと思う。

`gen_server:start_link/3, 4` の返り値に `ignore` がある。
これはどういう時に返ってくるかというと `Module:init/1` で `ignore` を返した時である。

http://erlang.org/doc/man/gen_server.html#start_link-4

> If `Module:init/1` returns `{stop,Reason}` or `ignore`, the process is terminated and the function returns `{error,Reason}` or `ignore`, respectively.

> `Module:init/1` が `{stop, Reason}` または `ignore` を返すと、プロセスは停止し関数はそれぞれ `{error, Reason}` か `ignore` を返す。

さて、この `ignore` 、何に使うかというと `supervisor` のページを見れば理由がわかる。

http://erlang.org/doc/man/supervisor.html#start_child-2

> * If the child process start function returns `ignore`, the child specification is added to the supervisor (unless the supervisor is a `simple_one_for_one` supervisor, see below), the pid is set to `undefined`, and the function returns `{ok,undefined}`.

> * 子プロセスの start 関数が `ignore` を返した場合、子の仕様は supervisor に加えられるが pid は `undefined` に設定され、( `start_child` ）関数は `{ok, undefined}` を返す。

つまり、プロセスは起動させないが ChildSpec を登録するというようなことができる。

<font color="red">**この影響で `supervisor:child()` の型には `pid()` だけでなく `undefined` が含まれるので注意しなければならない。**</font>

ちなみに、 `simple_one_for_one` の時は子の仕様は追加されない。

http://erlang.org/doc/man/supervisor.html#start_child-2

> For a `simple_one_for_one` supervisor, when a child process start function returns `ignore`, the functions returns `{ok,undefined}` and no child is added to the supervisor.

> `simple_one_for_one` の supervisor においては、子プロセスの start 関数が `ignore` を返した時、（ `start_child` ）関数は `{ok, undefined}` を返し、子は supervisor に追加しない。

もちろん、 `supervisor:start_link/2, 3` も `ignore` を返せる。

ただ、めったに使うことがないと思われるので、皆さん **ignore** しておいてもいいのではないでしょうか。
CentOS 7のfirewall-cmdでブラックリストを使う

# CentOS 7のfirewall-cmdでブラックリストを使う
某中華系のホストからの執拗なポートスキャンが続いたのでCentOS 7のファイアウォール機能を使ってブラックリストベースの接続拒否を行なってみたらとても簡単だった。

```shell:
# ipset create blacklist hash:ip hashsize 4096
# ipset add blacklist 58.218.199.182
# firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -m set --match-set blacklist src -j DROP
```

追記
最近のfirewalldではrich roulesが拡張されてfirewalls(firewall-cmd)からもipsetが扱える様になったので、以下の様にfirewall-cmdだけでもipsetコマンドとfirewalldのdirectルールを使った場合と同じ様な設定を行えます。

```shell:firewall-cmdだけでipsetを使ったフィルタリングを実施
# firewall-cmd --permanent --new-ipset=blacklist --type=hash:ip
# firewall-cmd reload
# firewall-cmd --ipset=blacklist --add-entry=58.218.199.182
# firewall-cmd --add-rich-rule='rule source ipset=blacklist drop'
```
※ "firewall-cmd --new-ipset=" で新しくipsetのセットを作る場合には--permanentオプションを指定して恒久的な設定とする必要があります。(一時的なセットは作れない！)
※よって、 "firewall-cmd reload" で一旦設定をリロードして有効にする必要があります。

また、以下の様に "--add-entries-from-file=" でIPアドレスが列挙されたテキストファイルからセットを一括で読み込むことができます。

```shell:ファイルからセットを読み込む
# firewall-cmd --ipset=blacklist --add-entries-from-file=/somewere/blacklist
```

```shell:セットに登録されたエントリーの一覧を取得する
# firewall-cmd --ipset=blacklist --get-entries
```

firewall-cmdのパラメーターでエントリーの表示がlistだったりshowだったりgetだったり、削除がremoveだったりdeleteだったり、是非統一して欲しい…
A/B/n Testing Library

phpで簡単にA/Bテストが行えるphpライブラリーを[packagist](https://packagist.org/packages/dimgraycat/split-testing)に公開しました。

```php:sample.php
<?php
use Ab\SplitTesting;

$params = array(
    'use'       => 'random',
    'variation' => array(
        'foo',
        'bar',
        'baz'
    );
);

$result = SplitTesting::get($params);

// $seed is optional
// e.g.) userId, IpAddress
$seed = 1234;
echo SplitTesting::get($params, $seed);
```

詳しくはこちらで！
https://engineer.blog.lancers.jp/2017/01/php-ab-testing-tool/
独断と偏見で　Visual C++ vs C++Builder

個人的な独断と偏見による視点で比較。

| 項目 | Visual C++ 2015| C++Builder Berlin|
|:--|:--|:--|
| 使用者数 | **多い** | 少ない  |
| 難易度（主観） | 難 | **簡単** |
| モバイル開発 | **無料で可能** | Pro版かつ別途費用もしくはEnterprise以上のエディションが必要 |
| コードの綺麗さ | 煩雑になりやすい | **とてもシンプルになりやすい** |
| エディタ | **それほど重さを感じない** | 動作が重い、落ちやすい、ダサい。ほんとダメ |
| ビルドしたアプリのデザイン | 標準以外は外部のフレームワーク等を使用 | **標準でデザイン用のフレームワークVCL、FireMonkeyが使用可能** |
| 文字列の処理 | 種類が多すぎたり相互キャストが非常に面倒 | **UnicodeString , AnsiStringが優秀** |
| C++対応 | **C++11/14/17一部対応<br/>[（対応表参照）](https://msdn.microsoft.com/ja-jp/library/hh567368.aspx#cpp17table)** | C++11 |
| GUIの標準部品数 | 少い | **多い**  |
| 標準コンポーネント数 | 少い | **多い**  |
| 使用可能な外部ライブラリ | **多い（OpenCvとか）** | 少ない |
| CMake | **対応** | Win32の一部のみ使用可能。[対応予定あり（？）](https://community.embarcadero.com/answers/how-to-use-opencv-in-c-builder-xe10) |

C++Builderは、それ単体で作成出来る範囲のアプリケーションなら高速、簡単、綺麗に作りやすいが、大規模なプロジェクトになると流石に使える資産の量でVisual C++に分があるように思える。
あと、C++Builderはせっかくモバイル対応を売りにしているのに、それを作成するための費用がProfessional版＋Mobile Add Onを別途購入する必要があるため個人で開発するとすると結構な費用になる。

17/2/17追記
下記URLにCMakeのサポートを検討しているとある。ということは、OpenCvのサポートも？
https://community.embarcadero.com/blogs/entry/2016-8-2
「私たちは、IDEにありがちな閉鎖的で孤立した体制を少し開放しようと、コンパイラについてはCMakeサポートやある程度のIDE統合の検討を始めています」
MovableType4(MT4)でウェブページを同一MT内の別ブログに移す

のっぴきならない事情により、古めかしいMovableType4(MT4)を弄る必要が出てきました。
特に、一つのブログ内にある「ウェブページ」を、別のブログに移さなくてはならなくなったのですが……
何と、それがオフィシャルではできない！！　……という、超残念仕様に、立ち向かってみました。


# 前提
## MovableTypeって？
数多くある静的CMSのうちの一つです。
[公式サイト](https://www.sixapart.jp/movabletype/)


## MT内部の階層構造(ざっくり)
同一MT内で複数のブログを運用することができます。
階層構造は概念的にはこういう感じです。

* MT
  * blog_1
      * blog_entries
          * blog_entry_1
          * blog_entry_2
          * ...
      * web_pages
          * web_page_1
          * web_page_2
          * ...
      * etc...
  * blog_2 
      * blog_entries
          * ...
      * web_pages
          * ...
      * etc...
  * blog_3
      * ...

# やりたいこと：ブログ間を跨ってウェブページを移したい
今回、上記の例でいえば、

* blog_1
    * web_pages
        * web_page_1

blog_1 に存在している web_page_1 を　↓

* blog_2
    * web_pages
        * web_page_1

blog_2 へと、移したいのです。
「ね、簡単でしょ？」案件だと思うではないですか。

が、それが公式でサポートされていない！！


## MT4では「ブログ記事」しかインポート＆エクスポートできない
[MT 要望 - ウェブページのエクスポート・インポート](http://communities.movabletype.jp/2010/06/post-106.html)

> 現在、記事のエクスポート・インポートは「ブログ記事」のみであって「ウェブページ」の内容は対応していない

うん？　ちょっと何を言っているのか分からないな。そんな馬鹿なことあるわけないじゃないか……(震え声)
しかし、どこをどう探しても、エクスポートできません。本当にできないようです。

## プラグインを使っても、MT4ではブログ間を跨ったページコピーなどはできない
エクスポートできなければ、複製すればいいじゃない。
複製機能が実装されていないなら、プラグインを入れればいいじゃない。

* [「ブログ記事」「ウェブページ」の「複製」を行うMT Duplicate プラグイン。](http://junnama.alfasado.net/online/2007/09/mt_duplicate.html)

……ブログ内での複製はできたものの、ブログを超えた複製ができなかった。

* [ブログ記事を複製または移動するMovableTypeプラグイン:DuplicateEntry](http://www.skyarc.co.jp/engineerblog/entry/duplicateentry.html)

……MT4に対応していなかった。

＼(^o^)／

さて、どうしたものかな……


# MT内部のMySQLを直接弄ってウェブページを別ブログへ移してやる
MTが内部で使用しているデータベースはMySQLです。
なので、もう、直接MySQLの中を見て弄ってしまえ！という判断。

## MT内部のMySQLを調査してみた
まずは、調査してみました。これは別記事に分割しました。

[Qiita - MovableType4(MT4)で使われるMySQLテーブルと各カラムの説明](http://qiita.com/Hi_Noguchi/items/f205370277b428d4cbfd) 

調査の結果で驚いたのは、「ブログ記事」と「ウェブページ」とが、 mt_entry という同一テーブル内で論理的に分けられているだけだった、という点ですね……
**物理的に別テーブル管理であるならまだしも、同一テーブル内なのに、ブログ記事はインポート&エクスポートできて、ウェブページはできないのか！！**
悲しい。

## どのテーブルのどのカラムをどうすればいいか
* テーブル ：mt_entry 
* カラム ：entry_blog_id, entry_atom_id

こいつらですね。
上記記事から該当箇所を引用。

```
* entry_blog_id ：どのブログ内の記事か

* entry_atom_id ：固有キーとか色々合成されているフィールド
  * 入力される書式例 ： tag:hoge.com,2017:/blog_name//99.123456
  * 上記例の 2017 にあたる数字は、このレコードの entry_authored_on の year 部分である
  * 上記例の 99 にあたる数字は、このレコードの entry_blog_id である
  * 上記例の 123456 にあたる数字は、このレコードの entry_id である
```

なので、たとえば、 entry_blog_id = 99 から、 98 へ移したい場合は……

```
entry_blog_id : 99 (blogのディレクトリ名が blog_name_1 であるとする)
entry_atom_id : tag:hoge.com,2017:/blog_name_1//99.123456
```

↓

```
entry_blog_id : 98 (blogのディレクトリ名が blog_name_2 であるとする)
entry_atom_id : tag:hoge.com,2017:/blog_name_2//98.123456
```

こうしてあげればいいわけですね。

実際、やってみたところ……**問題なく移せました！！**　良かった。救われた。
全部手動コピーをしていかなくてはならないとか、つらすぎますからね……

テーブルは同じなので、ブログ記事を移すことももちろんできます。簡単にできるんですよ、テーブルが同じなので(強調)

### 注意点
blog_name_1 → blog_name_2 へ、ウェブページを移した後ですが、 blog_name_1 をブログ単位で「再構築」しない限り、出力済みの静的ファイルは居残ってしまいます。
ご注意ください。
Word > ショートカット > 図の書式設定 > Alt + J P S Z

```txt:動作環境
Word 2013 on Windows 8.1 pro (64bit)
```

Wordの「図の書式設定」のショートカット。

- 図を選ぶ
- Alt + J P S Z

「日本のサイズ」と勝手に覚えておく。

あとはTabで項目移動して、数値を変更してEnterする。

<hr>
上記書式にて画像のサイズ拡大(縦横比固定)は、続けて

- Alt + H 
- 数値を入力
VimiumのCustom search enginesを使って検索をスムーズに


##はじめに
プロネットサーファーになるためにはキー入力でなんでもできないといけません。カーソルを動かしてクリックしてるなんて徒歩のように遅いです。vimiumを入れカスタマイズして、世界中のサイトを飛び回りましょう。

### vimiumとは
- vimライクにwebブラウジングできるChromeの拡張機能(プラグイン)
- 豊富な操作。j,kキーでスクロール、tで新しいタブ、xで閉じる、タブ移動など、あげるときりがない。もちろんキーの設定は変更可
- インストールは次を参考に。[Chromeをvimライクに使えるようにするvimium](http://qiita.com/satoshi03/items/9fdfcd0e46e095ec68c1)

### Custom search enginesとは
vimiumの機能です。以下で好きな検索ができます。
`o(キー)(スペース)(単語)`
例えば後述する設定ではamazonでカエルを検索したければ、
`oa かえる`

![vimiでamazon検索.gif](https://qiita-image-store.s3.amazonaws.com/0/77619/14a3ff91-3755-4899-6cc7-2393f948a403.gif "vimiでamazon検索.gif")




## 導入
###前提
- macのchromeでvimiumのプラグインが入ってる(Winでも同様だと思う)

###かんたん設定
Chrome右上から、「Vimiumのアイコン→Options」でVimum Optionsのページにとぶ。

![Vimium_Options.png](https://qiita-image-store.s3.amazonaws.com/0/77619/9b142179-0b25-841b-650c-98604dc6cd16.png "Vimium_Options.png")

赤枠に以下を貼り付ける。複数行あるが一行が一つのキーに対応している。コロンの左がキーです。これでgoogle,youtube,amazonをCustom search enginesで検索できます。もちろんqiitaもあります。(媚びた目)

```
g: http://www.google.com/search?q=%s Google
y: http://www.youtube.com/results?search_query=%s Youtube
gm: https://www.google.com/maps?q=%s Google maps
a: http://www.amazon.co.jp/s/?field-keywords=%s Amazon
t: https://translate.google.com/#en/ja/%s Google translate
tw: https://twitter.com/search?q=%s Twitter
q: https://qiita.com/search?q=%s Qiita
qs: https://qiita.com/search?stocked=1&q=%s Qiita stock
gp: http://www.google.co.jp/search?hl=ja&source=hp&q=%s&tbm=isch Google image
```

###カスタマイズ
お好みで設定しよう。スペース忘れずに。以下が上記の設定の公式みたいなもんです。
`(キー): (url) (任意のヘルプワード)`

- キーは`o`の次に入力する文字
- urlには対応url(検索クエリを`%s`にしたもの)
- ヘルプワードには`o`で検索モード入った時に表示されるやつ(なくてもいい)

###Tips
- `shift+o`でCustom search enginesのモードに入ると、遷移先を新しいタブで開いてくれる

##ちょっとあれなとこ
- urlで表現できない検索はできない

##さいごに
検索効率中毒になった方は、よかったら、
「JK shortcuts navigator」という拡張機能も試してみてください。
j,k+Enterで検索結果に遷移できます！
sbt-native-packager メモ

- Scala アプリを起動スクリプトを付けてパッケージ化してくれる。
- Windows, Mac, Linux(deb, rpm) に対応している。(Universal(zip) しか試していない)

## 設定

project/plugins.sbt に追加

```scala:project/plugins.sbt
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.2.0-M8")
```

build.sbt に追加

```scala:build.sbt
lazy val root = (project in file("."))
  .enablePlugins(JavaAppPackaging)
  .settings(
    ...
  )
```

## 実行

- stage コマンドで target/universal/stage 配下に必要なファイルがコピーされる。(実行しなくても良い)
- universal:packageBin コマンドで target/universal/"name"-"version".zip が作成される。(変更可能)

## メモ

- src/universal 配下のファイルはディレクトリ構成含めてtopDirectory 配下にコピーされる。
- 個別にファイルを追加する場合は mappings を使う

マニュアルを読んでも mappings の記載場所がわからなかったので、試行錯誤した結果以下のようになった。

以下の設定で baseDirectory 配下の README を doc/README に配置する。
project().mappings や settings() の中に記載したらエラーになった。

http://www.scala-sbt.org/0.13/docs/Mapping-Files.html

```scala:build.sbt
lazy val root = (project in file("."))
  .enablePlugins(JavaAppPackaging)
  .settings(
    ...
  )

mappings in Universal += {
  file("README") -> "doc/README"
}
```

マニュアルにある以下の設定はエラーになる。
package-zip-tarball => packageZipTarball が正しいと思われる。

```
mappings in Universal in package-zip-tarball += file("README") -> "README"
```

```
mappings in Universal in packageZipTarball += file("README") -> "README"
```

### mappings について

http://www.scala-sbt.org/0.13/docs/Mapping-Files.html
http://www.scala-sbt.org/0.13/docs/Paths.html

※ 正規表現でも指定できるはずだが試していない。

mappings の型は Seq[(File, String)]、PathFinder は File and Seq[File] を返す。
pair メソッドから Seq[(File, String)] を作れるとあるが、よくわからない。

確認

```
show universal:packageZipTarball::mappings
```

```
mappings in Universal ++= (baseDirectory.value / "config" * "*" get) map
  (x => x -> ("config/" + x.getName)),
```
GIMP / ImageMagick / bash > 複数画像から同じ領域を切り取り続ける方法

```txt:動作環境
CentOS 6.8 (64bit)
ImageMagick 6.7.2-7 2016-06-16 Q16 http://www.imagemagick.org
GIMP 2.6.9
```

複数画像から同じ領域を切り取り続けたい。
1つ１つ手動で切り取りをする作業を120枚程度の画像に対してしていたら日が暮れる。

## 手順

- GIMPにて切り取りしたい領域の[始点座標、サイズ]を把握する
- ImageMagickを用いて切り取る
  - 参考 http://qiita.com/7of9/items/3c27d08ebaa5739b6c40


例えば以下の場合、始点[50,50]からサイズ[100x200]の領域を切り取る。

```
convert -crop 100x200+50+50 Main.png 2.png
```

## bash script

複数画像を処理するスクリプト

### v0.2

```bash:loop_crop_170201_exec
#!/usr/bin/env bash

# v0.2 Feb.01,2017
#  - use [start] and [end] instead of [width],[height] for runtime parameters
# v0.1 Feb.01,2017
#  - crop based on the runtime parameters
#

if [ $# -lt 4 ]; then
	echo "Usage:"
	echo "  [cmd] [start_x] [start_y] [end_x] [end_y]"
	echo "   to crop all the png images in this directory"
	echo 
	exit
fi

width=$(($3-$1+1))
height=$(($4-$2+1))

RESULT_DIR="RESULT"
mkdir ${RESULT_DIR}

for afile in $(ls *.png);do
	echo "[$afile] processed"
	convert -crop ${width}x${height}+$1+$2 $afile ${RESULT_DIR}/$afile
done
```

### 実行例 > 引数なし > 使い方の表示

```
$ bash loop_crop_170201_exec 
Usage:
  [cmd] [start_x] [start_y] [end_x] [end_y]
   to crop all the png images in this directory
```

### 実行例 > 引数指定

```
$ bash loop_crop_170201_exec 799 373 1285 658
[160705.png] processed
[160706.png] processed
[160707.png] processed
[160708.png] processed
[160709.png] processed
```

`eog RESULT/160705.png`
にてきちんと切り出しできたか確認する。

### 余談

使っているツールの機能で、上記の処理を簡単にできることが分かったのは数秒前だ。

お蔵入りscriptがまた一つ。
CentOS6でphonopyのインストール

CentOS6はデフォルトでpython2.6、phonopyはpython2.7ベースで書かれている模様なので、2.6の環境はそのままで、2.7を使えるようにしてから、pipでphonopyをインストールしました。

概要は以下の通りです。

１　python2.7をインストール
（参考）http://toomuchdata.com/2014/02/16/how-to-install-python-on-centos/
２　pipをインストール
（参考）http://yaplog.jp/consadole_spo/archive/134
３　phonopy（最新版：1.11.6.20）をpipを使ってインストール
（参考）https://pypi.python.org/pypi/phonopy
	

１　python2.7をインストール
yum groupinstall "Development tools"
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel

vi /etc/ld.so.conf
で2行目追加
include ld.so.conf.d/*.conf
/usr/local/lib

/sbin/ldconfig

mkdir src
cd src

wget https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tgz
tar xvfz Python-2.7.13.tgz
cd Python-2.7.13
./configure --prefix=/usr/local --enable-unicode=ucs4 --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"
make
make altinstall

ll /usr/local/lib/python2.7/
表示されるか確認

/usr/local/bin/python2.7 -V
Python 2.7.13
バージョンを確認

２　pipをインストール

cd ..

wget https://bootstrap.pypa.io/get-pip.py
/usr/local/bin/python2.7 get-pip.py

/usr/local/bin/pip2.7 -V
pip 9.0.1 from /usr/local/lib/python2.7/site-packages (python 2.7)
バージョンを確認

３　phonopy（最新版：1.11.6.20）をpipを使ってインストール

pip2.7 install numpy
pip2.7 install matplotlib
pip2.7 install pyyaml
pip2.7 install h5py
pip2.7 install phonopy

ll /usr/local/bin/phonopy
ファイルを確認

phonopy
以下のようなバージョンが表示されるか確認
1.11.6
RAIIでピン止め

小ネタです。一時的に配列の生ポインタが欲しかったので、[RAII](https://ja.wikipedia.org/wiki/RAII)でピン止めするクラスを作りました。

```fsharp
open System
open System.Runtime.InteropServices

type Pin(o) =
    let gch = GCHandle.Alloc(o, GCHandleType.Pinned)
    member x.Addr = gch.AddrOfPinnedObject()
    interface IDisposable with member x.Dispose() = gch.Free()
```

一行`do`で使う例を示します。

```fsharp
let a = [|0; 1; 2; 3|]
do use p = new Pin(a) in printfn "0x%x" p.Addr
```

# P/Invoke

P/Invokeと組み合わせた例です。

```fsharp
[<DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)>]
extern int puts(nativeint s)

let s = [|'a'B; 'b'B; 'c'B; 0uy|]
do use p = new Pin(s) in puts p.Addr |> ignore
```

この例では`nativeint`で渡すために無理矢理ピン止めしていますが、普通はそんなことをする必要はありません。

```fsharp
[<DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)>]
extern int puts(byte[] s)

let s = [|'a'B; 'b'B; 'c'B; 0uy|]
puts s |> ignore
```

ピン止めのことを意識していれば、`byte[]`を指定しても裏側ではマーシャリングでピン止めされている状況が想像できます。

引数に`obj`を指定してもコンパイルは通りますが、実行時にアクセス違反が発生します。

```fsharp:アクセス違反
[<DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)>]
extern int puts(obj s)

let s = [|'a'B; 'b'B; 'c'B; 0uy|]
puts s |> ignore
```

# 動機

OpenGLには [glVertexPointer()](https://www.opengl.org/sdk/docs/man2/xhtml/glVertexPointer.xml) の第4引数`pointer`のように、引数で渡す配列の型が可変な関数があります。型ごとに別のP/Invokeを定義する以外の方法として、一時的に生ポインタを取得することを試みました。

F#でのOpenGLについては以下の記事を参照してください。

* [F#でOpenGL](http://qiita.com/7shi/items/029343420518b6884d7c) 2017.01.19
Babel 5 から 6 へのバージョンアップで一部の import 文が動かなくなった

# 概要

ここに 2 つの JavaScript ファイルがあります。

```magica.js
const magica = {
  madoka: '鹿目 まどか',
  sayaka: '美樹 さやか',
  mami: '巴 マミ',
  kyoko: '佐倉 杏子',
  homura: '暁美 ほむら'
};

export default magica;
```
```kyubey.js
import { mami, sayaka } from './magica.js';

console.log(mami); // 巴 マミ
console.log(sayaka); // 美樹 さやか
```
```
$ babel-node --version
5.8.23

$ babel-node kyubey.js
巴 マミ
美樹 さやか
```

この kyubey.js の `import` 文ですが、オブジェクトを[分割代入](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment)するときのように[^1]、オブジェクトから任意の値だけを取り出せるので、便利でよく使っていました。次のようなイメージです。

```js
const magica = {
  madoka: '鹿目 まどか',
  sayaka: '美樹 さやか',
  mami: '巴 マミ',
  kyoko: '佐倉 杏子',
  homura: '暁美 ほむら'
};

({ mami, sayaka } = magica);

console.log(mami); // 巴 マミ
console.log(sayaka); // 美樹 さやか
```

ところが、Babel 6 に更新したところ kyubey.js がシンタックスエラーで動かなくなてしまいました。

```
$ babel-node --version
6.22.2

$ babel-node kyubey.js
undefined
undefined
```

`undefined` …こんなのってあんまりだよ :sob:

# 原因

最初はバージョンアップを間違って Babel 環境がおかしくなってしまったのかと思いましたが、そうではありませんでした。どうやら、先ほど紹介した `import` 文の書き方が ECMASCript の仕様に背いた書き方だったようです。

Babel 6 でこの書き方が取り除かれるまでの経緯が以下の公式 issue にありました。

* [babel/babel > Issues > #2212 Kill CommonJS default export behaviour](https://github.com/babel/babel/issues/2212)

# 解決策

## default export を使う場合

```magica.js
const magica = {
  madoka: '鹿目 まどか',
  sayaka: '美樹 さやか',
  mami: '巴 マミ',
  kyoko: '佐倉 杏子',
  homura: '暁美 ほむら'
};

export default magica;
```
```kyubey.js
import magica from './magica.js';

const { mami, sayaka } = magica;

console.log(mami);
console.log(sayaka);
```
```
$ babel-node --version
6.22.2

$ babel-node kyubey.js
巴 マミ
美樹 さやか
```

いったんオブジェクトに `import` してから、変数に分割代入します。

## named export を使う場合

```magica.js
const madoka = '鹿目 まどか';
const sayaka = '美樹 さやか';
const mami = '巴 マミ';
const kyoko = '佐倉 杏子';
const homura = '暁美 ほむら';

export { madoka, sayaka, mami, kyoko, homura };
```
```kyubey.js
import { mami, sayaka } from './magica.js';

console.log(mami);
console.log(sayaka);
```
```
$ babel-node --version
6.22.2

$ babel-node kyubey.js
巴 マミ
美樹 さやか
```

あるいは `export` したものを全て読み込む場合は、

```kyubey.js
import * as magica from './magica.js';

const { mami, sayaka } = magica;

console.log(mami);
console.log(sayaka);
```
```
$ babel-node --version
6.22.2

$ babel-node kyubey.js
巴 マミ
美樹 さやか
```

# まとめ

Babel 5 で `export default` したオブジェクトを分割代入の記法で `import` しているコードを書いていると Babel 6 で挙動が変わるので、もし古いバージョンの Babel を使っている場合は書き換えましょう。

# 参考

* [Misunderstanding ES6 Modules, Upgrading Babel, Tears, and a Solution – Medium](https://medium.com/@kentcdodds/misunderstanding-es6-modules-upgrading-babel-tears-and-a-solution-ad2d5ab93ce0#.8z62zbl7r)
* [babel/babel > Issues > #2212 Kill CommonJS default export behaviour](https://github.com/babel/babel/issues/2212)

[^1]: [babel/babel > Issues > #3049](https://github.com/babel/babel/issues/3049) で "That's not destructuring, it just has similar syntax. It's an ImportsList." と言及されていました。
強化学習

「機械学習と深層学習」の文献中に例題として取り上げられているプログラムを実装してみる。
文献ではC言語でプログラムを記述しており、これをPythonで自分なりに実装してみた。
今回は強化学習による迷路抜け知識の学習を取り上げる。

## 強化学習とは
- 一連の行動の最後に評価が与えられるような場合に用いる学習方法

例）将棋

- 教師あり学習の場合
コンピュータプレイヤーが一手ごとにその手の評価を先生から教わる方法
	- 効率的な学習は可能だが、大量の教師データを用意する必要があり大変
	- 一手だけ取り出してその手が正しいかどうかは、多くの場合判断することができない


- 強化学習の場合
一連の着手が終了した後に評価を得て、その評価に基づいて学習を進める
	- ゲームの勝敗によって評価（勝ち、負け、引き分け） → **報酬**
	- 最終の評価から、一手一手の行動に関する知識を学習する

## Q学習
- 強化学習を実現する方法として、**Q学習**がある
- ある場面において次にとるべき行動を選択するための指標 → **Q値**
- Q値に従って行動を選択する

例）将棋

- 次に選択できる手のそれぞれにQ値を与える
- Q値の大きさに従って次の行動をとる
- Q学習を繰り返していくとQ値の値が改善されていき、やがて選択が適切に行われるようになる

![image1.jpg](https://qiita-image-store.s3.amazonaws.com/0/145075/d1cc60d7-31b2-91fe-9b8e-3784253716a4.jpeg)

## 迷路抜け知識の学習
### 問題設定
- スタート地点から開始
- 分岐を繰り返して最下段までたどり着くと、その場所に応じた報酬が得られる
- なるべく多くの報酬がもらえるような行動知識を学習する
- 今回はs14が最大の報酬を与え、s7が最大の半分の報酬を与えるとする

![image2.jpg](https://qiita-image-store.s3.amazonaws.com/0/145075/698bfb68-8903-804c-c890-ca2d37fe7c30.jpeg)

### 初期状態
学習の初期の行動はランダムに選択される
初期状態でたまたま目標とする行動パターンに近いものが現れることがある
→ この時に得た報酬によってその行動パターンのQ値が増加
→ 次回からその行動パターンが選択されやすくなる

![image3.jpg](https://qiita-image-store.s3.amazonaws.com/0/145075/d56b70fa-ad72-cb78-71cc-8472561d9680.jpeg)

これでは…
　報酬に直結する行動のQ値が改善されるだけで、初期の行動に対するQ値はランダムに決定された値のまま更新されない

そこで
　次の行動に移ったとき、選択可能な行動に対するQ値の中で、最大のQ値に比例する値を直前のQ値に加える

![image4.jpg](https://qiita-image-store.s3.amazonaws.com/0/145075/67ce95d2-441c-2edc-9c1f-1a2edc0e788c.jpeg)

こうすることで
　学習を繰り返していくと報酬を得ることができる行動パターンに対するQ値が増加する

### Q値更新の計算

```math
Q_{s_t,a_t} = Q_{s_t,a_t} + α(r + γ・max・Q{s_{t+1},a_{t+1}} - Q_{s_t,a_t})
```
- $s_t$: 時刻tにおける状態
- $a_t$:$s_t$において選択した行動を表す
- $max・Q_{s_{t+1},a_{t+1}}$: 次の時刻において選択できる行動に対するQ値の中で最大の値
- $r$: 報酬（得られなければ0）
- $α$: 学習係数（0.1程度）
- $γ$: 割引率（0.9程度）

### ε-グリーディ法
行動選択はQ値の大きい行動を優先する
→ 初期のランダムに決まったQ値がたまたま大きな値となった行動だけが常に選択されてしまう

そこで

- ある適当な定数を用意（ε = 0.3）
- 行動選択の際、0~1の間の乱数を生成し、その値がε以下であればランダムに行動を選択する
- εより大きければQ値の大きい行動を選択する

こうすることで
　Q値の初期値に依存することなく、様々な行動に対する適切なQ値の学習が可能となる

![image5.jpg](https://qiita-image-store.s3.amazonaws.com/0/145075/df1c271a-3e2a-f571-caa7-e55e26b5f1c3.jpeg)

### Q学習の手順
1. 全てのQ値をランダムに決定
2. 学習が十分進むまで以下を繰り返す
	- 動作の初期状態に戻る
	- 選択可能な行動から、Q値に基づいて次の行動を決定する
	- Q値を更新
		- 報酬を得たら、報酬に比例した値をQ値に加える
		- 次の状態で選択できる行動に対するQ値のうち、最大値に比例した値をQ値に加える
	- 目標状態に至ったら2に戻る
	- 2に戻る

## プログラム
プログラム => [Github](https://github.com/youichiro/MachineLearning-DeepLearning/blob/master/section_2/Q-Learning/qlearning.py)

## 実行結果
![image6.png](https://qiita-image-store.s3.amazonaws.com/0/145075/1a3d641f-2413-d246-ebd0-17d15487d4d4.png)

![image7.png](https://qiita-image-store.s3.amazonaws.com/0/145075/16a1c0b7-d467-edde-de99-c9392f8d77cf.png)
超シンプルメモ: CentOS で Open SSL をアップデートする方法


```
# OpenSSL のバージョンを確認
rpm -qa | grep openssl
# yum list installed openssl

# yum のキャッシュを削除
sudo yum clean all

# OpenSSL のアップデート
sudo yum update openssl openssl-devel

# Web サーバーの config を一応チェックして再起動
sudo nginx -t
# sudo /etc/init.d/https configtest
sudo nginx -s reload
# sudo /etc/init.d/https restart
```

CentOS 6.6 (Final) で確認
VBSでCRUD

#概要
VBSでデータの永続化やってみる。

#テーブル生成
create.vbs

```
Dim cd
Dim sh
Dim db
Dim sql
Set sh = CreateObject("WScript.Shell")
cd = sh.CurrentDirectory
Set db = CreateObject("ADODB.Connection")
db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & cd & "\test.mdb;"
sql = "CREATE TABLE blog_data (id integer IDENTITY(1,1) NOT NULL PRIMARY KEY, title text NOT NULL, body text NOT NULL, modified timestamp DEFAULT NOW() NOT NULL)"
Set rs = db.Execute(sql)
msgbox "ok"
```

#Create（生成）
add.vbs

```
Dim cd
Dim sh
Dim db
Dim sql
Set sh = CreateObject("WScript.Shell")
cd = sh.CurrentDirectory
Set db = CreateObject("ADODB.Connection")
db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & cd & "\test.mdb;"
sql = "INSERT INTO blog_data(title,body) VALUES('test', 'test')"
Set rs = db.Execute(sql)
msgbox "ok"
```

#Read（読み取り）
view.vbs

```
Dim cd
Dim sh
Dim db
Dim sql
Set sh = CreateObject("WScript.Shell")
cd = sh.CurrentDirectory
Set db = CreateObject("ADODB.Connection")
db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & cd & "\test.mdb;"
sql = "SELECT * FROM blog_data"
Set rs = db.Execute(sql)
Do Until rs.EOF
	msgbox "id:" & rs(0) & " title:" & rs(1) & " body:" & rs(2) & " mod:" & rs(3)
	rs.MoveNext
Loop
```

#Update（更新）
edit.vbs

```
Dim cd
Dim sh
Dim db
Dim sql
Set sh = CreateObject("WScript.Shell")
cd = sh.CurrentDirectory
Set db = CreateObject("ADODB.Connection")
db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & cd & "\test.mdb;"
sql = "UPDATE blog_data SET title='test2', body='test2' WHERE id=2"
Set rs = db.Execute(sql)
msgbox "ok"
```

#Delete（削除）
del.vbs

```
Dim cd
Dim sh
Dim db
Dim sql
Set sh = CreateObject("WScript.Shell")
cd = sh.CurrentDirectory
Set db = CreateObject("ADODB.Connection")
db.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & cd & "\test.mdb;"
sql = "DELETE FROM blog_data WHERE id=1"
Set rs = db.Execute(sql)
msgbox "ok"
```
画像解析にあたってのデバイス学習まとめ

#はじめに
OpenCVやDNNを用いてAI+IoTのプロジェクトを進めていくにあたり、デバイスやハードウェアに関して調べたり学習したりした結果を備忘録として下記にまとめる。

#Raspberry Pi（ラズベリーパイ）
###ラズベリーパイとは
・イギリスで開発された教育向けの安価なコンピュータ
・安くて小さくて遊べる、小さくても機能は満載（USBやLAN、HDMIなどパソコン並みのインターフェースを搭載）
※ただし、CPUの性能は低い
参考：http://style.nikkei.com/article/DGXMZO79030620Z21C14A0000000?channel=DF090220166687&style=1

###特徴
・小型で低コスト
・GPU搭載
・HDMI出力、USBポート、LANポートを持つ
・OSが使用可能
・組み込みよりサーバー向け
参考：https://furien.jp/columns/58/

###想定用途
・機器本体の組み込み
→ロボット・電子機器・医療機器
・機器本体とインターネットと繋げるIoT
→特にセンサー（温度センサー、加速度センサー、感知センサー）
・アプリケーション構築
→ウェブアプリケーションサーバとして構築（電力削減）
参考：https://furien.jp/columns/58/

###関連スキル
・Linux
・仮想サーバ
・Python
・ネットワーク
・組み込み
参考：https://furien.jp/columns/58/

###参考資料リスト
http://style.nikkei.com/article/DGXMZO79030620Z21C14A0000000?channel=DF090220166687&style=1
2016年10月21日以降に発行されたStartSSLの無料証明書は無効

# いきさつ

[中国のWoSign及び傘下にあるStartComが不正な証明書を発行していた問題](https://japan.cnet.com/article/35089807/)で、MozillaやGoogle等から今後はこの二社によるルート証明書を削除し拒否するという発表が昨年10月にありました。

SSLの無料証明書ではStartComが提供するStartSSLの証明書が人気でしたが、この措置により新規に発行して使用することが出来なくなります。

これらルート証明書が実際にブラウザから削除されるのは、Firefoxではバージョン51、Chromeではバージョン56以降とのことですが、共に正規リリースされたようですので実際に新規発行したStartSSLの証明書を用いたサイトを用意し、動作確認を行いました。

# Firefox(51.0.1)

![sc03.png](https://qiita-image-store.s3.amazonaws.com/0/55192/a552a9f2-5378-b046-f17d-235320304ab4.png)

予告通り証明書が無効になっておりアクセスが出来ません。

# Chrome(56.0.2924.76)

![sc02.png](https://qiita-image-store.s3.amazonaws.com/0/55192/3bc782f5-bfcc-7d6f-a199-495f0913b5d9.png)

ChromeではFirefoxに比べ、攻撃者の悪意への警告の意思を強く感じます。

# Safari(10.0.3)

![sc01.png](https://qiita-image-store.s3.amazonaws.com/0/55192/a30f5beb-23ca-c5a8-dea0-d5ff3db26c43.png)

Mac版Safariでも確認しました。
やはり証明書が無効となりアクセスが出来なくなっています。
証明書の詳細を確認するとこのように上位階層の証明書が無効になっていることが確認できます。

# まとめ

発表通り、主要ブラウザで証明書が無効になりアクセスできないことが確認できました。
無効になるのは以下の条件を満たした場合です。

* 2016/10/21 00:00:00 UTC 以降に発行された証明書であること
* Google Chromeではメジャーバージョン番号56以降
* Firefoxではメジャーバージョン番号51以降

その他のブラウザにおいてはどのバージョン以降無効とされているのか不明ですが、Safariのように最新バージョンで既に無効化されているか近々無効にされるかのどちらかであると思われます。

なお、無料証明書では他に[Let’s Encrypt](https://letsencrypt.org)が存在します。
ただ、こちらは証明書の期限が3ヶ月と短くサーバー上での自動更新を前提とした仕組みになっているため、1年もしくは3年もの有効期限を持つStartSSLとは少し運用が異なりますのでご注意ください。

# 参考資料

https://blog.mozilla.org/security/2016/10/24/distrusting-new-wosign-and-startcom-certificates/

https://security.googleblog.com/2016/10/distrusting-wosign-and-startcom.html

https://support.apple.com/ja-jp/HT204132

https://support.apple.com/ja-jp/HT202858
ぼっちObserverパターン

Observer がいないので自分を Observer として使います。

```ruby
require "observer"

class Player
  include Observable

  def initialize
    add_observer(self)
  end

  def run
    changed
    notify_observers(self)
  end

  def update(player)
    p player
  end
end

Player.new.run
```

#### 利点
  - 疎結合にしたつもりで考えられる

#### 欠点
  - 何がしたかったのか、あとで余計にわからなくなる場合がある
anacondaでRDSへポートフォワードしながらデータを取得してみる。

# はじめに
データ分析をする際にデータがそもそもそのデータがデータベースの中にあるという事があると思います。
その場合にローカルにあればいいのですがAWSのRDSにある場合などはリモートに接続してデータを取得する必要があります。この場合、1つの方法としてローカルとリモートでポートフォワーディングして取得する方法があります。今回はanacondaを使ってこれを実行して見たいと思います。


# 準備
下記のものをcondaもしくはpipでインストールしておきます。

```
※ポートフォワーディングするのに使います。
sshtunnel
※mysqlへの接続に使います。
mysql.connector
pandas

```

# ポートフォワーディングして
sshtunnelをインポートしてポートフォワードします。

```
※必要な物をインポートします
from sshtunnel import SSHTunnelForwarder
※ポートフォワーディングの設定
host = 'リモートホスト'
localhost = '127.0.0.1'
ssh_username = 'ユーザー名'
ssh_private_key = '秘密鍵の場所'
server = SSHTunnelForwarder(
          (host, 22),
          ssh_private_key_password="秘密鍵のパスワード",
          ssh_username=ssh_username,
          ssh_private_key=ssh_private_key,
          local_bind_address=('0.0.0.0', バインドするローカルポート),
          remote_bind_address=(localhost, バインドするリモートポート))

server.start()
※ポートフォワードを終わらせる時はstopをします。
server.stop()
```
# ポートフォワーディングしてデータベースからデータを取得する
上記のソースでポートフォワーディングできている状態で、
データベースに接続しデータを取得、データフレームでデータを表示しています。

```
import mysql.connector
import pandas as pd

#データベース接続情報
connect = mysql.connector.connect(user='DBユーザー名', password='DBパスワード', host='127.0.0.1',port='ポートフォワーディング先', database='DB名', charset='utf8')
cursor = connect.cursor()

cursor.execute("select * from table WHERE id = 1")
result = cursor.fetchall()
dataframe = pd.DataFrame(result)
dataframe
```
# 終わりに
anacondaで直接データを取得できるようになったの簡単にデータを取得することができるようになりました。
kibana 5.2.0リリース記念 Heatmapで遊ぼう

# 概要

https://www.elastic.co/blog/kibana-5-2-0-released

によると、Heatmapが使えるようになりました、ということなのでさっそく遊んでみましょう。

こんな画面を作れます。
X軸に地域を、縦軸に犯罪種別をとって、地区ごとの犯罪種別でHeatmapを作ってみました。

![Kibana.png](https://qiita-image-store.s3.amazonaws.com/0/111676/9bd01c52-1bb4-ed59-9e9e-ac864d533380.png)


# 使用したもの

```yaml
version: '2'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:5.2.0
    container_name: elasticsearch
    ports:
      - 9200:9200
      - 9300:9300
  kibana:
    image: docker.elastic.co/kibana/kibana:5.2.0
    container_name: kibana
    links:
      - elasticsearch:elasticsearch
    ports:
      - 5601:5601
```

docker-compose up -d でおしまい。

# HeatMapができるまで

## Visualizeでの追加を確認

Visualize画面を開くと、新たに「Heatmap Chart]ができているのが確認できます。

![Kibana01.png](https://qiita-image-store.s3.amazonaws.com/0/111676/d7e3bd8b-aa24-741c-ad6a-071a461b7916.png)


## グラフ部品の作成

![Kibana02.png](https://qiita-image-store.s3.amazonaws.com/0/111676/fcebc5d7-4c28-82be-5268-d1622fc02857.png)

最初に開いた画面では、他のBar Chartと同じような見た目になっています。
ここから、 metrics > value　や　bucketsを編集していきます。

今回は、X軸に地域、Y軸に犯罪種別としたかったので設定は以下のようになりました。

### metrics value

| label | value |
|-------|-------|
| Aggregation | Sum |
| Field       | (件数が入ったフィールド名) |
| Custom Label | 発生件数 |

Area Chartのように複数のmetricsを選択できるわけではないので、bucketsからY-Axisの分割をするようにします。

### buckets

| label | value |
|-------|-------|
| Aggregation | Terms |
| Field       | location(地区名が入ったkeyword型のフィールド) |
| Order By | Term |
| Order | Ascending 60 (23区と市町村分ぐらい） |
| Custom Label | 発生地区 |

このあと、「Add sub buckets」- 「Y-Axis」とすることで、metrics valueを分割するようにしていきます。

## オプションの確認

### Color Schema

|　色設定 | 備考 |
|--------|------------:|
| Blues | 青の濃淡で表現 |
| Greens | 緑の濃淡で表現 |
| Greys | 灰色の濃淡で表現 |
| Reds | 赤の濃淡で表現 |
| Yellow to Red | 黄色をベースに数が多くなると赤になる |

例えば、Bluesを選択してみると、こんな表示になる。
![blue.png](https://qiita-image-store.s3.amazonaws.com/0/111676/d2f6369c-3981-0e7b-d1a4-152103c58e33.png)

### Number of colors

デフォルトだと４。どれぐらいの色を使うか。2から10まで指定可。
当然２にすると、濃淡が全然でなくて寂しい画面となる。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/111676/20837e65-423f-b2e7-9c66-fd3e4c3f8b96.png)

10だと、細かくでる。
![10.png](https://qiita-image-store.s3.amazonaws.com/0/111676/42765270-756a-2c5d-b312-7c91dd144e1b.png)



入っているデータの分布によって調整すると良いかもしれない。


### Show Labels

metricsの値をテキストで表示してくれる。
ただ、今回の例のように、１つのマスが小さいとテキストが入りきらないこともあり、その場合は警告がでる模様。

> Some labels were hidden due to size constrains

![hidden.png](https://qiita-image-store.s3.amazonaws.com/0/111676/d85c483e-7595-4e1d-cee8-cb767a3d5036.png)



# （参考資料）テストデータの入手元

[東京都の自治体別刑法犯発生状況（平成23年～27年【確定値】）（XLSファイル：61KB）](http://www.keishicho.metro.tokyo.jp/about_mpd/jokyo_tokei/jokyo/keiho.files/suii_h23_h27.xls)
からExcelをもってきて、適当に入れてみた。
[python, CPython] 例外を投げた際のGCの挙動

python(CPython)で例外を投げると、例外を投げたフレームが例外をキャッチしたフレームに追加される。
このため、リファレンスカウントの動作が非自明になり、オブジェクトの寿命が意図せず延長される。

```py 
class Foo(Exception):
    def __init__(self):
        print 'construt'
    
    def __del__(self):
        print 'destruct'
    
    def raiseError(self):
        raise Exception()

def main ():
    print 'enter main'
    foo = Foo()
    try:
        foo.raiseError()
    except:
        print 'catch exception'
    foo = None
    print 'exit main'

try:
    main()
finally:
    print 'finish'
```

以上のコードの出力は以下のようになる。

```text
enter main
construt
catch exception
exit main
destruct
finish
```

以上のように、`main`内の`foo`オブジェクトを'exit main'の前に解放する事を意図したとしても`main`のフレームが解放されるまで`foo`の寿命が延長される。
これは、例外を投げた`raiseError`内のフレームが、`main`内のフレームに保持され、`raiseError`内のフレームは`self = foo`を保持しているためだ。

例外フレームの解放は`sys.exc_clear()`で行う。

似たようの事例としては、ループ内でtry-catchしている時に、ループ内で確保したオブジェクトの解放のタイミングが1ループ分ずれる等があり得る。
これは例外フレームが次のループでの例外スローによって解放されるからだ。

http://stackoverflow.com/questions/8822418/object-not-freed-after-an-exception-raise-in-python-2-7
PHP $_SERVER $_SERVER ['REQUEST_METHOD'] === 'POST'

![201702021.png](https://qiita-image-store.s3.amazonaws.com/0/95187/c1b99eac-4b08-4e80-56a1-1dc0b8a8302b.png)

###**$_SERVER連想配列**
---
サーバはヘッダやパス・スクリプトの位置などいろいろな情報を持っていますが、そのサーバの情報にアクセスできる変数
[$_SERVERについて](http://www.tryphp.net/phpref-server/)

###**``$_SERVER['REQUEST_METHOD']``**
・ページがリクエストされたときのリクエストメソッド名を返す
・ブラウザからのリクエストが、POSTメソッドなのかGETメソッドなのか、スクリプト側で判別したい

```$_SERVER ['REQUEST_METHOD'] === 'POST'```
は何かが投稿された　
という意味

##**変数は最初から初期化しないとエラーになる**
``$err = '';`` 又は　``$err = false;``
これがないと
``Notice: Undefined variable``
になる。




```php:test23.php編集リクエスト後
<?php
$username = '';
// $err = '';
$err = false;
// ===→型と値が等しいときTRUE ==→値が等しいときTRUE
// REQUEST_METHOD→ページにアクセスする際に使用されたリクエストのメソッド名
// $_SERVER['REQUEST_METHOD']ページがリクエストされたときのリクエストメソッド名を返す
// $_SERVER['REQUEST_METHOD']現在のページにアクセスする際に使用されたメソッド
// 何かが投稿された
if ($_SERVER ['REQUEST_METHOD'] == 'POST') {
// if ($_SERVER ['REQUEST_METHOD'] === 'POST') {
	$username = $_POST ['username'];
	if (strlen ( $username ) > 8) {
		$err = true;
	}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xm1ns="http://www.w3.org/1999/xhtml">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript">


<title>PHP入門</title>
</head>
<body>
	<!-- action=""自分自身に飛ばす -->
	<form action="" method="post">
	<?php function h($str){
		return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
	}?>
		<input type="text" name="username" placeholder="user name" value="<?php echo h($username);?>">
		<input type="submit" value="Check!">
</form>
<?php
 if(!empty($err)){ echo "Too long!";}
?>

</body>
</html>
```

```php:test23.php編集リクエスト前
<?php
$username = '';
// $err = '';
$err = false;
// ===→型と値が等しいときTRUE ==→値が等しいときTRUE
// REQUEST_METHOD→ページにアクセスする際に使用されたリクエストのメソッド名
// $_SERVER['REQUEST_METHOD']ページがリクエストされたときのリクエストメソッド名を返す
// $_SERVER['REQUEST_METHOD']現在のページにアクセスする際に使用されたメソッド
// 何かが投稿された
if ($_SERVER ['REQUEST_METHOD'] == 'POST') {
// if ($_SERVER ['REQUEST_METHOD'] === 'POST') {
    $username = $_POST ['username'];
    $err = false;
    if (strlen ( $username ) > 8) {
        $err = true;
    }
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xm1ns="http://www.w3.org/1999/xhtml">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript">


<title>PHP入門</title>
</head>
<body>
    <!-- action=""自分自身に飛ばす -->
    <form action="" method="post">
    <?php function h($str){
        return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
    }?>
        <input type="text" name="username" placeholder="user name" value="<?php echo h($username);?>">
        <input type="submit" value="Check!">
</form>
<?php if(!empty($err)){ echo "Too long!";}
 if($err) { echo "Too long!";}
 ?>

</body>
</html>
```

![20170201.png](https://qiita-image-store.s3.amazonaws.com/0/95187/70a3a490-f52c-09ce-666c-d701a084c579.png)
スクロールに合わせてパスを描く【SVG + JavaScript】

某所で使ったのでメモ。

HTML上にSVGを描画し滑らかなアニメーションをさせるテクニックは最近よく見かけますね。
動くものがあると目を引きますし、なによりSVGだからクライアントの解像度に気を遣う必要がありません。

SVGをアニメーションさせる方法は解説されているサイトが沢山あります。
ここではSVGパスをスクロールに合わせて描画するサンプルを紹介。

まずはサンプルデモを。

[デモ](http://synapse-blog.xyz/scroll-svg/)

パスの始点から終点まで、スクロールと一致するようになっています。

使うもの : __jQuery__
スクロールの値を取得するためにjQueryを使用。



##html

```html
<div id="stroke">
  <svg id='scroll-line'>
  </svg>
</div>
```
##CSS
(※画面幅に関わらず真ん中に表示するようにしてるだけ)

```css
div#stroke{
        width:100%;
        max-width:1920px;
        height:100%;
        position:relative;
        margin:0 auto;
        overflow:hidden;
}

svg#scroll-line{
        width:100%;
        height:100%;

        position:absolute;
        left:50%;
        margin-left:-960px;
}

```



##JavaScript
```javascript
//スクロール状態。0で一番上、1で一番下
var scrollPos = 0;
//スクロールできる = 画面から隠れてる範囲
var scrollRange;
var line;
var strokeLength;
var ankerPoint = [960, 0, 960, 950, 800, 950, 800, 850, 900, 850, 900, 2000];

//スクロールの値を取得
$(function() {
        $(window).scroll(function(){
                scrollRange = $(document.body).height() - $(this).outerHeight();
                scrollPos = $(this).scrollTop() / scrollRange;
                line.style.strokeDashoffset = strokeLength - strokeLength * scrollPos;
                line.style.visibility = 'visible';
        });
});

window.onload = function(){
        //パスを定義
        line = document.createElementNS("http://www.w3.org/2000/svg",'path');
        line.setAttribute('d', 'M 960, 0 L ' + ankerPoint.join(','));
        line.setAttribute('fill', 'none')
        line.setAttribute('stroke', '#00eeff');
        strokeLength = line.getTotalLength();
        line.style.strokeDasharray = strokeLength + ' ' + strokeLength;
        line.style.storkeDashoffset = strokeLength;
        line.style.visibility = 'hidden';
        $('#scroll-line').append(line);
}
```


配列ankerPointで、path要素のMコマンドで使うパスの数値を設定しています。
勿論、svgデータを別で用意しDOMから拾ったり、ベジェ曲線を描くのもアリ。




window.onload以下の

```javascript
line.style.strokeDasharray = strokeLength + ' ' + strokeLength;
line.style.storkeDashoffset = strokeLength;
```

この辺りでパスの長さ(strokeLength)分画面から外に追い出しています。

```javascript
line.style.strokeDashoffset = strokeLength - strokeLength * scrollPos;
```
上記でパスの長さにスクロール距離のパーセンテージ(scrollPos)をかけています。
一番下までスクロールされた(scrollPosが1になった)ところでstrokaDashoffsetが0になり、パス全体が描かれるというわけです。




うーん、jQuery苦手だなぁ...
Luigiの依存関係に対する誤解と解釈

Luigiフレームワークに関して、ずっと誤解しており、非常に苦しんだため、もしかしたら同じ悩みで苦しむ人もいるかもしれないため、書き遺しておきます。

# 依存とは何なのか

## 誤解
- 依存先タスクの完了を待つ

## 実際
- 依存先タスクの完了は待つ
- 後続処理の続行には、依存先タスクの成功が必要

## 依存関係におけるタスクの成功と失敗とは
### タスクの成功
``output``で指定したターゲットへのファイル出力

### タスクの失敗
タスク内における例外発生

## この誤解が孕む問題
例えば、以下のようなケースを考えます。
``input``で引き取ったリストに記載されている、1000行そこそこのURLのリストを読み取り、そのURLからファイルを引き取る処理。
ありがちな処理かと思いますが、ここに罠があります。
1000個、ファイルをダウンロードしてくるために直列処理はしたくないですし、``input``で引き取ったデータを元にタスクにパラメータを与えたいため、[動的依存](http://luigi.readthedocs.io/en/stable/tasks.html#dynamic-dependencies)として書くことになると思います。
仮に1000個作成されたタスクのうち、一つでもタスクが失敗すれば、後続処理は実施されません。
しかしながら、WEBサーバの不調や、URLの記載誤りによって、一個や二個、タスクが失敗するケースというのは往々にして考えられるわけで、それによって、後続の処理が停止してしまっては困る場合。
この場合、後続処理タスクとタスク生成をしているタスクに依存関係を張ってはならず、luigiの外で処理を書くべきであるという結論です。
FreeBSDのiconv

FreeBSD 10Rからiconvがlibcに含まれるようになりました。iconvはファイルシステムの処理でも利用するので、GPLなlibiconvではなくBSDライセンスなiconvを入れたようです。元々NetBSD方面にあったものの様で、日本の方も関わっていたものかもしれません。

```c
main()
{
        int res;

        res = iconv_open("UTF-8", "UTF-16LE");
}
```

このコードは-liconvを付けなくてもコンパイルできます。

```
% ldd a.out
a.out:
        libc.so.7 => /lib/libc.so.7 (0x80081f000)
```

個別の変換の処理はlibcの中には存在せずモジュールで別になっていて/usr/lib/i18nの下にあります。これらは直接リンクされているのではなく、このディレクトリにあるsoをdlopenで利用しています。

```c:lib/libc/iconv/citrus_module.c
        handle = libc_dlopen(p, RTLD_LAZY);
```

どのsoを読むかは

/usr/share/i18n/

の下のファイルを参照しています。

ちなみにpkgのlibiconvとの区別は/usr/local/includeにコピーされるiconv.hでiconv_openをlibiconv_openに変換するとで区別しているようです。

コンパイル時に"-I/usr/local/include -I/usr/include"にするとpkgのlibiconvが使われます。

configureでiconv_open()の関数チェックをヘッダーの読み込み無しに実行されると、必ずlibcの方が有効になってしまって、/usr/local/の方を使えない状態になってしまって困った事になることがありました。

buildworld時にMK_ICONV=noにするとlibcから外すことができるようです。
goでstructをJSONに変換した時の結果が、埋め込みのフィールドがinterfaceである場合とstructである場合で異なる

## はじめに
goでstructをJSONにしたい時には `enccoding/json` を使う。埋め込みを含んだsturctのencodeの結果が埋め込まれたフィールドがstructであるかinterfaceであるかで変わる。気づかなかったので忘れないようにメモ。

## 例

以下のような `Person` structがある。

```go
// Person :
type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}
```

このstructに対して、structとして埋め込んだ `PersonWithStruct` と interfaceとして埋め込んだ `PersonWIthInterface` を用意してみる。以下のようなもの。

```go
// PersonWithStruct :
type PersonWithStruct struct {
	Person
	Type string `json:"type"`
}
```

interfaceを埋め込んだものはこう。

```go
// IPerson :
type IPerson interface{}

// PersonWithInterface :
type PersonWithInterface struct {
	IPerson
	Type string `json:"type"`
}
```


### JSON化の結果

以下の様なコードを書いてJSON文字列に変換してみる。

```go
func main() {
	encoder := json.NewEncoder(os.Stdout)
	encoder.SetIndent("", "  ")
	person := Person{Name: "foo", Age: 20}

	{
		wperson := PersonWithStruct{Type: "struct", Person: person}
		if err := encoder.Encode(wperson); err != nil {
			panic(err)
		}
	}
	{
		wperson := PersonWithInterface{Type: "interface", IPerson: person}
		if err := encoder.Encode(wperson); err != nil {
			panic(err)
		}
	}
}
```

結果は以下の様になる。

```
// structを埋め込んだもの(PresonWithStruct)
{
  "name": "foo",
  "age": 20,
  "type": "struct"
}

// interfaceを埋め込んだもの(PeresonWithInterface)
{
  "IPerson": {
    "name": "foo",
    "age": 20
  },
  "type": "interface"
}
```
structを埋め込んだ場合には出力結果がフラットになる一方で、interfaceを埋め込んだ場合はinterface名でラップされた形で出力される。

## see also

goのissueを見るとこれは期待された結果らしい。

- [encoding/json: Struct behind interface embedding behaves differently to struct-only embedding · Issue #7230 · golang/go](https://github.com/golang/go/issues/7230)
SourceTreeで特定のコミットメッセージをコピーする

普段 git を使うときは、SourceTree で作業しているのですが、コミットメッセージを使いまわしたいことが結構あるので、そのための設定をメモ。

## どうやって実現するか

SourceTree には「カスタムアクション」という機能があり、この機能を利用すると様々なgitの操作を登録することができます。

詳しくは下記のサイトをご覧ください。

- [SourceTreeの使い方 | コミット間の差分ファイルの抽出 (カスタム操作を使う方法) - ICS MEDIA](https://ics.media/entry/4475)

- [SourceTreeでコミット間の差分ファイルを圧縮しないで取り出す方法 - Qiita](http://qiita.com/youthkee/items/8579c7a963c24bd4e655)

以降の説明は Mac OS 上での設定を想定しています。

## スクリプトの作成

コミットメッセージの取得には、 `git show` コマンドを使いました。
引数 `$1` には、選択したコミットのSHA-1が入ります（後で設定します）。

```sh:copy_message.sh
#!/bin/sh
git show $1 --quiet --pretty='%s' | pbcopy
```

また、実行権限を付与しないとエラーが発生するので、以下のコマンドで実行権限を追加します。

```bash
chmod +x copy_message.sh 
```

## スクリプトの登録

メニューから [SourceTree] -> [環境設定] -> [カスタムオプション] -> [追加]

- メニューキャプション: `任意（例: コミットメッセージをコピー）`
- 実行するスクリプト: `作成したスクリプトのパス`
- パラメータ: `$SHA`

として登録します。

## 実行してみる

実際にやってみるとこんな感じ

![image](https://qiita-image-store.s3.amazonaws.com/0/86238/c454ac82-155c-acff-b7ee-dc06ea7626e1.png)



## 参考

- [SourceTreeの使い方 | コミット間の差分ファイルの抽出 (カスタム操作を使う方法) - ICS MEDIA](https://ics.media/entry/4475)
- [SourceTreeでコミット間の差分ファイルを圧縮しないで取り出す方法 - Qiita](http://qiita.com/youthkee/items/8579c7a963c24bd4e655)
- [Git で最新のコミットのコミットログの summary を取得 - Qiita](http://qiita.com/ka_/items/f434fb7ce1334ac54930)
- [gitで特定コミットのコミットされた時刻だけを取得する - ダメ人間オンライン](http://blog.dameninngenn.com/entry/20120107/1325881887)
Laravel responseにheader設定する方法とトラップ

Laravelではviewをresponseとして返す幾つかの方法があります。:clap:

```php
\Response::view('view.template', $param) # 方法１
response()->view('view.template', $param)　# 方法２
view('view.template', $param)　# 方法３
```

方法３が一番短くて、うまく行きます。

そして、responseにheader情報を入れましょう。

```php
view('view.template', $param)->header('hello',　'world')
```
上記のコードはエラーになります。viewにはheaderメソッドがないです。
大丈夫です。ドキュメントにはもっと強いwithHeadersメソッドがあるって書いてます（実際は私の理解が間違ってます）。
じゃ早速使ってみよう。:relaxed:
https://laravel.com/docs/5.3/responses

```php
view('view.template', $param)->withHeaders([
　　　　'hello' => 'world',
])
```

エラーがなくなりました。:clap:
責任を持って、headerが設定されているのかを見ったら、されてないです。:scream:
[ソースコード](https://github.com/illuminate/view/blob/master/View.php#L398)を見ったら、上記のコードはheader設定とは全く関係なく、viewに値を渡すだけです。
viewでwithXXXXを利用して値渡す機能ってそもそも要らないんじゃないかと思います。

結論は、responseにheaderを設定したい場合は、以下のコードを使うのが正しいです。

```php
\Response::view('view.template', $param)->header(...)
\Response::view('view.template', $param)->withHeaders(...)
response()->view('view.template', $param)->header(...)
response()->view('view.template', $param)->withHeaders(...)
```
Gitスタックで一時的に変更点を隠す

# git stash
> 
ブランチを切り替えてちょっとだけ別の作業や最新のソースを一旦反映したいときなんかに使えるのが、<b>Gitスタック</b>です。
Gitスタックを使えば、コミットをせずとも変更したソースを<b>一時的に保存</b>しておくことができます


``git stash save`` でコミットはせずに一時保存

```
$ git stash save "追加機能の一時保存"
```

スタックしているリストを表示したい場合は、``git stash list``で確認できます。

```
$ git stash list
stash@{0}: WIP on master: test3
stash@{1}: WIP on master: test2
stash@{2}: WIP on master: test1
```

直前のスタックを適用させる場合は``git stash apply``を使います。

```
$ git stash apply
```

それ以前のを適用したい場合は、名前を指定します。

```
$ git stash apply@{2}
```

apply はスタックに隠した作業を再度適用するだけで、スタックにはまだその作業が残ったままなので、スタックから削除するには、``git stash drop``で削除します。

```
$ git stash drop stash@{0}
```


``git stash pop``を実行すれば、隠した内容を再適用してその後スタックからも削除してくれます。

```
$ git stash pop
```
MacOSXにPythonを用いた機械学習を行うための環境を構築する


下記の書籍を読み進めるための開発環境の構築メモです。

書籍：Pythonによるスクレイピング＆機械学習 開発テクニック
http://www.socym.co.jp/book/1079

![ac15a1df2c2dca10a4c215f6096d8892.jpg](https://qiita-image-store.s3.amazonaws.com/0/160696/35c8e7d2-cd55-8f52-5c96-fc639a3aa3d6.jpeg "ac15a1df2c2dca10a4c215f6096d8892.jpg")

##Homebrewのインストール

まず最初に、MacOSX用のパッケージマネージャー「Homebrew」をインストールします。
http://brew.sh/index_ja.html

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

途中、sudoのパスワードを入力します。

##pyenv

次に、Pythonのバージョンマネージャー「pyenv」をインストールします。

Pythonのバージョンごとに環境（インストールしているパッケージ）を変えることができます。

```
$ brew install pyenv
```

環境変数をセットします。

```
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile
$ echo 'eval "$(pyenv init -)"' >> ~/.profile
$ . ~/.profile
```

pyenvを用いてインストールできるバージョンやパッケージを確認します。

```
$ pyenv install --list
```

最新のPython3.6.0とanaconda3-4.2.0をインストールします。

```
$ pyenv install 3.6.0
$ pyenv install anaconda3-4.2.0
```

インストールされているバージョンを確認します。

```
$ pyenv versions
```

バージョンの切り替えは以下のように行います。（特定のディレクトリのみに適用する場合はglobalをlocalに変更します）

```
（python3.6.0への切り替え）
$ pyenv global 3.6.0
$ pyenv rehash
$ python --version
Python 3.6.0
$ pyenv versions
  system
* 3.6.0 (set by /Users/hisashi/.pyenv/version)
  anaconda3-4.2.0

（anaconda3-4.2.0への切り替え）  
$ pyenv global anaconda3-4.2.0
$ pyenv rehash
$ python --version
Python 3.5.2 :: Anaconda 4.2.0 (x86_64)
$ pyenv versions
  system
  3.6.0
* anaconda3-4.2.0 (set by /Users/hisashi/.pyenv/version)
```

##パッケージ管理

Pythonのパッケージ管理は「pip」で行います。
また、Anacondaのパッケージ管理は「conda」と「pip」で行います。

##エディタ

エディタはAtomが良いと思います。
https://atom.io

##PhantomJSとSelenium

ブラウザを経由したスクレイピングの設定です（2章2節）。
機械学習でよく利用される「anaconda3-4.2.0」を利用します。

```
$ pyenv global anaconda3-4.2.0
$ pyenv rehash
```

書籍ではUbuntu + dockerでの環境構築が紹介されていますが、MacOSXでは下記のようにして環境構築が行えます。

```
$ brew install phantomjs
$ pip install selenium
$ pip install beautifulsoup4
```

##TensorFlowのインストール

引き続き「anaconda3-4.2.0」を利用します。

書籍では、以下のコマンドが記載されていますが、エラーが出て途中で止まります。

```
$ pip install --upgrade https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.12.1-py3-none-any.whl
```

エラーを回避するため「-I setuptools」オプションを付与する必要があります。
http://datalove.hatenadiary.jp/entry/python/anaconda/install-tensorflow-into-anaconda-environment

```
$ pip install --upgrade -I setuptools https://storage.googleapis.com/tensorflow/mac/cpu/tensorflow-0.12.1-py3-none-any.whl
```
C++ Builder > I/Oエラー (123)

```txt:動作環境
C++ Builder XE4
Windows 7 / 8.1 / 10
```

作成したexeファイルを実行して操作していた時に、以下のエラーに遭遇した。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/897ffa13-5c9d-4c41-6666-b34c4c13ef23.png)

問題はActiveDirectoryで共有しているフォルダ上で実行した時に発生した。

同じexeファイルをPC上にコピーしてから実行すると問題は発生しなかった。


関連 http://itknowledgeexchange.techtarget.com/itanswers/io-error-123/
Macで蓋を空けたり閉じたりした時間をログから拾う方法

タイトルのとおりだけど
自分が作業している時はほぼMacに向かっており、終わる時は必ず蓋を締めてSleepにしている。
これをログから拾えば作業時間がわかるかもとおもってやってみた

## Sleepに入った時間と解除された時間

以下のコマンドからログを見ることができた

```
sudo pmset -g log | grep "Kernel Idle sleep preventers"
```

結果はこんな感じ

```
2017-01-18 10:02:00 +0900 Assertions          	Kernel Idle sleep preventers: IODisplayWrangler          
2017-01-18 21:31:40 +0900 Assertions          	Kernel Idle sleep preventers: -None-          
2017-01-19 10:06:27 +0900 Assertions          	Kernel Idle sleep preventers: IODisplayWrangler          
2017-01-19 11:38:27 +0900 Assertions          	Kernel Idle sleep preventers: -None-          
2017-01-19 11:46:53 +0900 Assertions          	Kernel Idle sleep preventers: IODisplayWrangler          
2017-01-19 12:07:55 +0900 Assertions          	Kernel Idle sleep preventers: -None-          
2017-01-19 12:26:11 +0900 Assertions          	Kernel Idle sleep preventers: IODisplayWrangler          
2017-01-19 12:30:10 +0900 Assertions          	Kernel Idle sleep preventers: -None-          
2017-01-19 13:19:49 +0900 Assertions          	Kernel Idle sleep preventers: IODisplayWrangler          
2017-01-19 20:31:31 +0900 Assertions          	Kernel Idle sleep preventers: -None-          

```

たぶん開け閉めした時間が記録されてる。
ただ直近１５日間くらい？しか出てこなかった。

```pmset``` コマンドで少し探してみたけどそれより過去のログの参照方法は今のところ不明