OmniAICreator/Qiita-1.07M huggingface dataset:
Python 機械学習プログラミング 第1章 「データから学習する能力」をコンピュータに与える まとめ

# はじめに
- 機械学習
    - データの意味を理解するアルゴリズムの応用と科学
        - コンピュータサイエンスにおいて興奮に満ちた分野
- 本章では機械学習の主な概念とその種類を扱う
- 扱う内容
    - 一般概念
    - 3種類の学習と基本用語
    - システム設計するための構成要素
    - Pythonセットアップ
- サンプルコード
    - [python-machine-learning-book/code/ch01/ch01.ipynb](https://github.com/rasbt/python-machine-learning-book/blob/master/code/ch01/ch01.ipynb)
    - なお以下のまとめでは、コード、数式は記載しておりません。申し訳ございません。

---

# 1.1 データを知識に変える「知能機械」
- 大量のデータ
    - 構造化データ
    - 非構造化データ
- 日常生活での応用例
    - メールスパムフィルタ
    - 文字・音声認識ソフトウェア
    - 検索エンジン
    - 棋士との対戦

---

# 1.2 3種類の機械学習
- 教師あり学習
- 教師なし学習
- 強化学習

---

# 1.3 「教師あり学習」による未来予測
- 目標
    - トレーニングデータからモデルを学習し、未知のデータや将来のデータを予測できるようにすること
- 教師ありデータ
    - 望ましい出力信号がすでに判明しているサンプルの集合
    - メールスパムフィルタデあれば「スパム」か「スパムでない」か。
- 例
    - 分類：離散値のクラスラベルを持つ
    - 回帰：出力信号が連続値を持つ

---
## 1.3.1 クラスラベルを予測するための分類
- 目的
    - 過去の観測に基づき、新しいインスタンスを対象として、クラスラベルを予測すること
- クラスラベルは離散的で順序性のない値（所属関係）
- 2値分類
    - メールのスパムフィルタ
- 多クラス分類
    - 手書き文字認識


## 1.3.2 連続値を予測するための回帰
- 目的
    - 複数の予測変数と連続値の応答変数が与えられ、結果を予測できるようにそれらの変数の関係を探る
- 線形回帰

---
# 1.4 強化学習による対話問題の解決
- 目標
    - 環境とのやりとりに基づいて性能を改善するシステム（エージェント）を開発すること
- 教師あり学習に関連する分野とみなせる
    - 環境の現在の状態に関する情報には報酬信号も含まれる
    - このフィードバックは正解のラベルや値ではなく、「報酬」関数によって測定された行動の出来具合を数値化
- 報酬の最大化
    - 試行錯誤アプローチ
        - モデルを使用しない
    - 塾考的プランニング
        - モデルを使用する
- 例
    - チェスエンジン
        - 報酬は勝ち負け

---
# 1.5 「教師なし学習」による隠れた構造の発見
- 教師なし学習
    - ラベルづけされていないデータや構造が不明なデータを扱う

---

## 1.5.1 クラスタリングによるグループの発見
- クラスタリング(教師なし分類)
    - 大量の情報を意味のあるグループとして構造化できる探索的データ解析
        - 探索的データ解析：データの統計量を計算、分布の可視化を行ったりして、データに関する知見を探索的に導き出す
- 例
    - マーケティングにおける顧客集団の発見

---

## 1.5.2 データ圧縮のための次元削減
- (教師なし)次元削減
    - 関連する大半の情報を維持した上で、データをより低い次元の部分空間に圧縮する
- 目的
    - 大量の値を処理するのは記憶域、計算性能が限られていることから避けたい
    - データの可視化
- 手法例
    - 教師なし次元削減
        - 主成分分析
        - カーネル主成分分析
    - 教師あり次元削減
        - 判別分析

---

# 1.6 基本用語と表記法
- サンプル
- 特徴量
- ターゲット
- 線形代数
    - ベクトル
    - 行列

---
# 1.7 機械学習システムを構築するためのロードマップ
- 予測モデリングに機械学習を使用する場合の一般的なワークフロー

1. 前処理
2. 学習
3. 評価
4. 予測

---

# 1.8 前処理：データ整形
- 前処理
    - 機械学習アルゴリズムの性能を最適化するのに必要な形式に変換する
- 選択された特徴量の尺度を同じにする
    - 特徴量を0、1の範囲に変換
    - 平均0、分散1の標準正規分布に変換
- 抽出された特徴量によっては相関高く一定の重複
    - 次元削減
- 新しいデータセットにも応用できるか（汎化されるか）チェック
    - データセットをトレーニングデータセットとテストデータセットに分割

---

## 1.8.1 予測モデルのトレーニングと選択
- 性能の良いモデルをトレーニングして選択するには数種類のアルゴリズムを比較することが不可欠
- 性能を測定するための指標
    - 正解率
- モデルの汎化性能の推定
    - トレーニングデータセットをトレーニング用と検証用に分割し、交差検証
- ハイパーパラメータの最適化

## 1.8.2 モデルの評価と未知のインスタンスの予測
- 汎化誤差の評価
    - モデルをテストデータセットに適用し、未知のデータに対する性能がどの程度発揮されるのかチェック
- 特徴量のスケーリング、次元削減と言った前述の手続きのパラメータがトレーニングデータセットでのみ取り出される

---

# 1.9 機械学習にPythonを使用する
## 1.9.1　Pythonパッケージのインストール
- Numpy
    - 多次元配列
- Pandas
    - より高レベルなデータ操作ツール
- matplotlib
    - 数値のデータの可視化
- scikit-learn
    - 機械学習

---

# 参考書籍
- [Python 機械学習プログラミング](http://amzn.to/2eOmjpP)

---

# ありがとうございました。
ESXiでCoreOS(ova版)を使う

GRUBとか良く分からなくてハマったのでメモ

# 出来る環境

```
core@localhost ~ $ cat /etc/os-release
NAME=CoreOS
ID=coreos
VERSION=1122.3.0
VERSION_ID=1122.3.0
BUILD_ID=2016-10-20-2045
PRETTY_NAME="CoreOS 1122.3.0 (MoreOS)"
ANSI_COLOR="1;32"
HOME_URL="https://coreos.com/"
BUG_REPORT_URL="https://github.com/coreos/bugs/issues"

core@localhost ~ $ docker version
Client:
 Version:      1.10.3
 API version:  1.22
 Go version:   go1.5.4
 Git commit:   1f8f545
 Built:
 OS/Arch:      linux/amd64
Server:
 Version:      1.10.3
 API version:  1.22
 Go version:   go1.5.4
 Git commit:   1f8f545
 Built:
 OS/Arch:      linux/amd64

core@localhost ~ $ docker-compose version
docker-compose version 1.9.0-rc1, build 28788bd
docker-py version: 1.10.4
CPython version: 2.7.9
OpenSSL version: OpenSSL 1.0.1t  3 May 2016
```

# CoreOS(ova版)のセットアップ

## CoreOSのダウンロード
Running CoreOS on VMware
https://coreos.com/os/docs/latest/booting-on-vmware.html
からstableをダウンロード。

## ESXiへデプロイ
vSphereのファイル→OVFテンプレートのデプロイから
ダウンロードしたcoreos_production_vmware_ova.ovaを選択しデプロイ→起動

CoreOS vmx+vmdk イメージのインストール/構成 (2105725)
https://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2105725

とか参考にしてもGRUBの修正の仕方が良く分からずCoreOSにログイン出来なかったが
素晴らしく分かりやすいサイトを発見

How-To Install and Configure CoreOS OVA Image on ESXi
http://www.vladan.fr/how-to-install-and-configure-coreos-ova-image-on-esxi/#prettyPhoto

coreos.autologinをvmlinuz-aの$usr_uuidの後ろに追記

```
setparams 'CoreOS default'

    gptprio.next -d usr -u usr_uuid
    if [ "$usr_uuid" = "7130c94a-213a-4e5a-8e26-6cce9662f132" ]; then
       linux$suf /coreos/vmlimuz-a mount.usr=PARTUUID=$usr_uuid coreos.autologin
    else
       linux$suf /coreos/vmlimuz-b mount.usr=PARTUUID=$usr_uuid
    fi
```

# IP固定化
```/etc/systemd/network/static.network
[Match]
Name=ens192
[Network]
Address=192.168.1.5/24
Gateway=192.168.1.250
DNS=192.168.1.1
```
参考サイト：CoreOSの固定IPアドレス設定
http://qiita.com/nobwak/items/02ff9b5929935ef9c074

# 追加設定
## docker用proxy

```:/usr/share/oem/run
#!/bin/bash
systemctl set-environment HTTP_PROXY=http://proxy.url:port
```

参考サイト：プロキシ環境下でのCoreOS + Docker
http://qiita.com/kawasima/items/6cdb79913b5dfffd1a31

## docker-compose
サイトを確認
https://github.com/docker/compose/releases/
1.9.0-rc1が出ているのでこれを使う。

```
$ sudo -i
# mkdir -p /opt/bin
# curl -L https://github.com/docker/compose/releases/download/1.9.0-rc1/docker-compose-`uname -s`-`uname -m` > /opt/bin/docker-compose
# chmod +x /opt/bin/docker-compose
```

Bash-Completionが上手くインストール出来なかった。
分かる人おしえて下さい。

参考サイト：CoreOSにdocker-composeとBash-Completion
http://qiita.com/maosanhioro/items/07b4c3dc5947c9b2a714
Cron登録しているシェルスクリプトからSlackにメッセージを送る。


## 概要
Cron登録しているバッチの処理完了、エラーの通知をSlackに置き換えました。（メールだと埋もれるし見なくなるので）
非常に簡単だったのでコピペで使えるようにサンプルコードを紹介します。


## 手順
1. Slack側でIncommingWebhookを登録してAPIトークンを発行する。
2. CurlでPOSTする。

以上。
こちらの記事が詳しくてわかりやすいです。
http://qiita.com/tt2004d/items/50d79d1569c0ace118d6


## コピペ用サンプルコード
詳しい使い方は先述の記事を読んでいただくとして、ここではコピペで使えるコードを紹介します。

```sh:ShellからSlack通知
#!/bin/bash

# Please Customize
SLACK_URL=https://hooks.slack.com/services/XXXXXXX # 
FALLBACK_TEXT=testfallbacktext
PRE_TEXT=pretesxt
TITLE=title
TITLE_LINK=title_link
TEXT=text
COLOR='#7CD197'
EMOJI=:sob:
USER=username
MESSAGE=slackbottest

#send slack notification
function post_slack(){
ATTACHMENTS='{'\
'"fallback": "'$FALLBACK_TEXT'",'\
'"pretext": "'$PRE_TEXT'",'\
'"title": "'$TITLE'",'\
'"title_link": "'$TITLE_LINK'",'\
'"text": "'$TEXT'",'\
'"color": "'$COLOR'"'\
'}'

PAYLOAD=\
'payload={"text": "'$MESSAGE'", '\
'"icon_emoji": "'$EMOJI'", '\
'"username": "'$USER'", '\
'"attachments":['$ATTACHMENTS']}'

  curl -X POST --data-urlencode "$PAYLOAD" $SLACK_URL
}


# How to Use

echo "DO SOMETHING"

if [ $? -gt 0 ]; then
# エラーの場合
TITLE="エラーが発生しました！！"
TEXT="確認してください！！"
post_slack

else

TITLE="正常に終了しました"
TEXT="安心してください。"
post_slack

fi


```

## 使い方
必要な変数に値を設定してpost_slack関数を呼ぶだけです。

メッセージの書式などは公式を参考にしてください。
https://api.slack.com/docs/message-formatting
https://api.slack.com/docs/message-attachments

以上です。
関連を持つテーブルにおけるFabricate.Lib の書き方

メモ
CakePHPにおける関連を持つテーブルのFabricateの書き方
ｽｯｷﾘ
※ https://github.com/sizuhiko/Fabricate

```.php
$id = 1;
$userId = 'test_user';
$modelA = ['id' => $id, 'user_id' => $userId];
$modelB = ['user_id' => $userId, 'modelA_id' => $id];

Fabricate::create('ModalA', 1, $modelA);
Fabricate::create('ModalB', 2, $modelB);

// テスト実行
...

```

もう１つの方法

```.php
$id = 1;
$userId = 'test_user';
Fabricate::create(
    'ModelA',
    1,
    function ($data, $world) use ($userId) {
        return [
            'user_id' => $userId,
            'ModleB' => $world->association(
                'ModleB',
                2,
                function ($data, $world) use ($userId) {
                    return [
                        'user_id' => $userId,
                    ];
                }
            )
        ];
    }
);
```
raspberry pi 1 model bで、node-red　その９

#概要
raspberry pi 1 model bの、node-redで、httpでmythingsを発火させてみた。
#開発環境
raspberry pi 1 model b
raspbian 2016_09_23 jessie lite
#写真
![ras12.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/d5fbc3f3-3987-4aab-cc7c-5a0ef56c70c1.jpeg)

#mythingsアプリの設定
idcfで条件を満たしたら、自分に通知する。
トリガー: trigger-1
メッセージ: {{text1}}
#http requestの設定
Method:  post
URL:  http://hoge/data/trigger-1_uuid
#functionの設定
```
msg.payload = {
    "text1": "okok"
};
msg.headers = {
    "meshblu_auth_uuid": "trigger-1_uuid", 
    "meshblu_auth_token": "trigger-1_token"
};
return msg;
```
プロキシ環境でElasticsearch 5.0のプラグインをインストールする

https://www.elastic.co/guide/en/elasticsearch/plugins/5.0/_other_command_line_parameters.html
ここに書いてありますがメモ。

Elasticsearch 2.x系までと異なり、環境変数ES_JAVA_OPTSにJAVA_OPTSの値（http.proxyHostとhttp.proxyPort）を設定します。

### Linux
```
sudo ES_JAVA_OPTS="-Dhttp.proxyHost=host_name -Dhttp.proxyPort=port_number -Dhttps.proxyHost=host_name -Dhttps.proxyPort=https_port_number" bin/elasticsearch-plugin install analysis-icu
```

### Windows
```
set ES_JAVA_OPTS="-DproxyHost=host_name -DproxyPort=port_number -Dhttps.proxyHost=host_name -Dhttps.proxyPort=https_port_number"
bin/elasticsearch-plugin install analysis-icu
```

### 参考
- [elasticsearch の plugin をProxy環境内からインストール – katz+](http://katzplus.com/centos-6/elasticsearch/elasticsearch-%E3%81%AE-head-plugin-%E3%82%92proxy%E7%92%B0%E5%A2%83%E5%86%85%E3%81%8B%E3%82%89%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)
Cloud9でRuby on Railsアプリケーションを開発する際に忘れがちなターミナルコマンド

Cloud9でRuby on Railsアプリケーションを開発する際に、最初の段階で使うターミナルコマンドがいくつかあります。そこで使ったターミナルコマンドのメモを残します。

**PostgreSQLの起動**
`sudo service postgresql start`

**Railsサーバーの起動**
`rails s -b $IP -p $PORT`
【PHP】WEBスクレイピングして求人情報の一覧を表示させてみる

#0. はじめに
求人情報をチェックするのって疲れますよね。
「もっと楽をして職探しをしたいなぁ」
ということで求人ページをWEBスクレイピングして、簡単に求人情報をチェックできるようにするページを作ってみました。

#1. 用意するもの
・PHPが動くサーバー環境
・goutte.phar 

#2. PHPコードを書く
今回はワークポートの<a href="http://www.workport.co.jp/all/search/job-3051600/">
プログラマー／PG（WEB・オープン・モバイル系)・求人情報一覧
</a>をWEBスクレイピングして会社名・職種名を一覧表示させてみます。

```workport.php
<?php
require_once 'goutte.phar';
use Goutte\Client;

// Goutteオブジェクトの生成
$client = new Client();

// WEBページを取得
$crawler = $client->request('GET',
        'http://www.workport.co.jp/all/search/job-3051600/');

$text_ary = array();
$link_ary = array();

// 1行ずつ取得する
$dom = $crawler->filter('h2.ttl');
$dom->filter('a')->each(function ($node) use (&$text_ary) {
        $text_ary[] = $node->text();
        });
$dom->filter('a')->each(function ($node) use (&$link_ary) {
        $link_ary[] = 'http://www.workport.co.jp'. $node->attr('href');
        });

// 求人情報を表示する
echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">';
for ($i=0; $i<count($text_ary); $i++){
    $text = $text_ary[$i];
    $link = $link_ary[$i];
    echo "<a href=". $link. ' target="_blank">'. $i. ".  ". $text. "><br><br>";
}
?>
```
上記の ```workport.php``` をサーバー上に置けば準備完了。あとはブラウザで開くだけです。

#3. 結果
```workport.php``` をブラウザで開くと以下のように求人情報の一覧表示が出ます。(完)
![image](https://qiita-image-store.s3.amazonaws.com/0/44288/95169abe-1325-ff77-1f04-c995eaa71ddd.png)

VivaldiのWEBパネルとして表示させるようにすればいつでも気軽に求人情報がチェックできて便利です。

#参考URL
Webスクレイピングを行う（Goutte）
http://www.buildinsider.net/web/bookphplib100/088
【備忘録】Mac の Finder に SFTP のディレクトリを表示する方法

#### 開発環境  
- Sublime Text3
- vagrant
- Cyberduck  

#### 自分のレベル
- マウントってなに？やったことない
- SFTPってまだ他人に説明できるほど理解できてない。。


この環境で自分はPHPを書いています。
少し前にSublimeのサイドバーでサーバーファイルをプロジェクト管理したいと思って色々格闘して上手く行かなかったのですが、良さそうなやり方があったので備忘録。


※ ちなみに上手くいかなかった戦い
- ローカルで管理できればドラック&ドロップでできるになー
- Cyberduckの同期(ミラーリング)→ただコピーされるだけかい
- Add Folder to Project...→最近使ったファイルしか出てくれないんかい


### **FUSE for macOS**
https://osxfuse.github.io/

#### できること
- SublimeTextのサイドバーでSSHサーバーのファイルをプロジェクト管理できる
- Cyberduckを開かずに開発できる

#### 使い方
- 「FUSE for macOS」と「SSHFS」の最新版をダウンロード
- 特にいじらず、ローカル環境で下記を実行してインストールを確認

```
$ sshfs --version
SSHFS version 2.5 (OSXFUSE SSHFS 2.5.0)
OSXFUSE library version: FUSE 2.7.3 / OSXFUSE 2.8.2
no mount point
```

- 新たなディレクトリを作成し(ここではTest)、以下のように実行。

```
$ mkdir Test
$ sshfs root@192.168.11.11:/var/www/html Test/
```
※ ちなみに2行目はこんな意味合い

```
sshfs [user@]host:[dir] mountpoint [options]
```
※ 上記では、sshfsでTestにマウントする階層を***/var/www/html***に指定するかたち
 
- パスワードを聞かれたらvagrantのパスワードを答えましょう
- Finder上でみると、Testなど作成したディレクトリがOSXFUSE Volume 0 (sshfs)に変身しています。


<img width="654" alt="スクリーンショット 2016-10-27 11.26.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/145861/7aad8613-25e4-73af-877a-96850be942dd.png">  

- この中で***/var/www/html***配下のサーバーファイルが見れるようになります。
- この中のプロジェクトをSublimeTextにドラッグ&ドロップしてやると、もれなくファイルを確認ができるようになります。
- アンマウントは下記です。

```
$ umount Test
```

#### 注意
- vagrant upでvagrantを起動した状態でマウントしましょう。そうしないと、マウントが上手く行かず作ったディレクトリの後処理がめんどくさい
- ログアウトとかスリープしてるとちょいちょいマウントが切れる
- git管理はまだうまく行くか試せてない


エディターのサイドバーで見れることに感動した(きちんと同期されている！)ものの、まだ色々試している最中です。
何かわかったらまた残します。
ssh接続でToo many authentication failures


ssh接続で以下のようなエラーが発生

```sh
$ ssh 10.123.123.123
Received disconnect from 10.123.123.123: 2: Too many authentication failures for user1
```

接続数の上限に引っかかってしまっているよう。

```sh
$  grep MaxAuthTries /etc/ssh/sshd_config
MaxAuthTries 4
```
上記の項目。

とりあえず接続したいので、

```sh
$  grep MaxAuthTries /etc/ssh/sshd_config
#MaxAuthTries 4
$ sudo /etc/init.d/sshd restart
```

とコメントアウトして(もしくは数値を増やして)再起動すれば接続できる。


参考
http://tkuchiki.hatenablog.com/entry/2013/02/20/104609
Failed at the unicode@0.6.1 postinstall script 'node install.js' (事例として)

#はじめに
タイトルのようなエラーがでてパッケージのinstallに失敗したものの
設定を変えるでもなくもう１回やったら成功してしまったという話。

nodeはv6.9.1
npmは3.10.8

です。

#類似事例

似た事例が別パッケージで報告されていて
[generator wont install #15](https://github.com/mcasimir/generator-mobileangularui/issues/15)

どうもunicodeパッケージ内のファイルが取得できてない

```
One workaround If you're using a unix based system is to create the path /usr/share/unicode/ and download this file -> http://unicode.org/Public/UNIDATA/UnicodeData.txt into it.
```

後述しますが、素直にこの通り作業すれば解決するのですが
この一文を読んだ時、環境依存やパッケージのバグを場当たり修正しているような印象を受けて
（私の勘違いなのですが）
こういう対応したくないな、どうしようかなと悩みつつ
もう１回エラー出力を見てみようと思い
なんとなくもう一回installを試みたところ
以下のようにinstallに成功しました。

結論としては一時的に一部ファイルの配布元に接続しづらかったのが理由でした。

#再度installした時の出力

`try to read file /usr/share/unicode/UnicodeData.txt …`

を何度も繰り返し
何度かリトライした後

```
GET unicode.org:80/Public/UNIDATA/UnicodeData.txt
fetching …
```

となっています。

```
> unicode@0.6.1 postinstall /path/to/repos/node_modules/unicode
> node install.js

try to read file /usr/share/unicode/UnicodeData.txt …
/usr/share/unicode/UnicodeData.txt not found.
try to read file /usr/share/unicode-data/UnicodeData.txt …
/usr/share/unicode-data/UnicodeData.txt not found.
try to read file UnicodeData.txt …
UnicodeData.txt not found.
try to download …
GET unicode.org:80/Public/UNIDATA/UnicodeData.txt
fetching …
saving data as Cc.js …
saving data as Zs.js …
saving data as Po.js …
saving data as Sc.js …
saving data as Ps.js …
saving data as Pe.js …
saving data as Sm.js …
saving data as Pd.js …
saving data as Nd.js …
saving data as Lu.js …
saving data as Sk.js …
saving data as Pc.js …
saving data as Ll.js …
saving data as So.js …
saving data as Lo.js …
saving data as Pi.js …
saving data as Cf.js …
saving data as No.js …
saving data as Pf.js …
saving data as Lt.js …
saving data as Lm.js …
saving data as Mn.js …
saving data as Me.js …
saving data as Mc.js …
saving data as Nl.js …
saving data as Zl.js …
saving data as Zp.js …
saving data as Cs.js …
saving data as Co.js …
done.
```

# 原因のinstall.jsを読んで見る

[dodo/node-unicodetable](https://github.com/dodo/node-unicodetable/blob/master/install.js)

見たまんまですね。。。

[README.md](https://github.com/dodo/node-unicodetable/blob/master/README.md)

しかも

```
If you have problems installing UnicodeData.txt because unicode.org is down or you're behind a proxy, try installing unicode-data via your system package installer.

If you got the file already at hand you can specify the path to it in the environment varialbe NODE_UNICODETABLE_UNICODEDATA_TXT.
```

ちゃんと書いてあるし。

# 最後に
そもそも
npm-debug.log
に手がかりがあったはずなんですが、見る前に消してしまったのが悔やまれます。。。

また、落ち着いてinstallに失敗したパッケージについて調べればなんてことはないという話ですが、同じエラーに遭遇した人の役に立てば。
jsonapi-resourcesについて調べた

# jsonapi-resources

https://github.com/cerebris/jsonapi-resources

## description

[Cerebris Corporation](http://www.cerebris.com/)

- open source活動好き
- サービス作っていた
- コンサル業したり

みたいな会社が作った[JSON API](http://jsonapi.org/) 準拠のAPI builder

## philosophy

- JSON API specificationでRESTを取り扱いやすくした便利ツールというイメージ
- railsへの組み込みをかなり意識して作られている
  - sample app https://github.com/cerebris/peeps
- resourceという概念で整理されている。
  - この名前はどうなのか、、、 gem名から察するに分かるが、、、
  - model名に `_resource` suffixを問題を解決する
- controllerに `include JSONAPI::ActsAsResourceController` と定義することで
  - json api準拠のinterfaceとして動作する
  - resourceが自動で連携されるのでなんかキモい感はある

## syntax(DSL)のかきやすさ

- controller -> resource -> (model
  - 実質手をいれるのはcontrollerとresource
  - modelもjson api準拠で使うことを意識した作りを矯正される
  - ただしcontrollerはキモい

```
# ContactsController
class ContactsController < ApplicationController
  include JSONAPI::ActsAsResourceController

  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :null_session
end

# contact resource
class ContactResource < JSONAPI::Resource
  # apiで利用するattribute定義
  attributes :name_first, :name_last, :email, :twitter
  attribute :name_full

  # includesの定義やlink生成のために関連が必要
  has_many :phone_numbers

  def name_full
    "#{name_first} #{name_last}"
  end
end

# contact model
class Contact < ActiveRecord::Base
  # resourceの関連の実態はmodelの関連を通してcallされる。
  has_many :phone_numbers

  # validationはmodelに依存する
  validates :name_first, presence: true
  validates :name_last, presence: true
end
```

- resourceをserviceとしてもつかえるし、modelのwrapperとしても使える
- apiのためのdecoratorみたいな認識を持った

### 良い面

- validationがいずれからのアクセスによっても共通化出来る
- resourceをserviceとしてもつかえるし、modelのwrapperとしても使える
  - apiのためのdecoratorみたいな認識を持った
- controllerに`ActsAsResourceController` をincludeすると必要なことが一通り整う
- responseとして返すobject郡のsortやら色々便利メソッドがある

### 悪い面

- APIに伴うresource設計とmodel設計はしっかり切り離したいが、、、
  - ロジックが定義がmodelやresourceに分散する臭がする
  - 自由度はあるが、この自由度が仇になるようなきがしてならない
  - 基本complexなrequirementになることが往々にしてあるはずなので、カジュアルに使えるようにするより、そこらへん意識してドメインしっかり分けて出来ると良いよね
- APIの受け口とresourceの関連が密過ぎてツライ気がする。
  - json api specification準拠だから良いのか？
- validationがresoruceとmodelで定義できないのもツライ
- post requestがデフォルトでtransactionに包まれる
  - この手のものはservice層にちゃんとやりたくなる
  - ツライ臭がする

ドメインがまとまっていない感を感じる

## error handling

- processing errorはcontroller
- ソレ以外はresource, modelの定義に分散
- error messageもjson api specification準拠なのでやりやすそうではある
  - http://jsonapi.org/format/#errors

## performance

- ほぼcontrollerのwrapper なのでperformanceは普通にrails使うのとあんまし変わらない。

## APIの粒度( modelと同等なresource粒度か、それともまとめるか？)

model同等

## versioningのしやすさ

- versioningの概念は無い
- routingとcontrollerでなんとかしろってことかな？

## messageのサポート種類(mssagepack, xml, json)

- only json!!!

## JSONのschemaの厳しさ( HAL, JSON-schemaに固定されているかどうか）

- JSON API specification準拠

## template化の可能性

- templateは特に無い

## 所感

- 大規模なrails案件や、複雑な要件にはあまり 向いていないと思う
- ただ、ある程度楽をしつつ作れる感もある。
- serializerは力作感ある
  - https://github.com/cerebris/jsonapi-resources#serializer

## その他

- JSONを利用するAPI策定の流れ
  - http://docs.spring.io/spring-hateoas/docs/current/reference/html/
  - http://stateless.co/hal_specification.html
javaでPHPのMD5の結果を同じにする方法

#概要
パラメーターの改ざん対策にMD5を使ってPHPとJavaで同じ結果にしたい

# やってみよう
## 1. PHPでは
```
      // MD5(固定文字列+12345)
        $key = md5(固定文字列.12345);
```

## 2. Javaでは
```
String key = getHash(固定文字列+12345);

private String getHash(String param) throws BusinessException {
    String md5_str = "";

    try {
         byte[] str_bytes = param.getBytes("UTF-8");
         MessageDigest md = MessageDigest.getInstance("MD5");
         byte[] md5_bytes = md.digest(str_bytes);
         BigInteger big_int = new BigInteger(1, md5_bytes);
         md5_str = big_int.toString(16);
        } catch (Exception e) {
          throw new Exception("MD5 fail");
        }
        return md5_str;
    }
```
Realm Java 2.1.0を導入したメモ

## これは何
Realmを導入した手順のメモ
最低限の手順でありRealmの機能紹介や良さの説明はしていないので注意

## 前提条件 
- Android Studio 2.1.2
- RoBoHoN(Android 5.0.2 Lollipop API21)
- Windows 10
- Realm Java 2.1.0
- Lombok 1.16.10

ライブラリバージョンは2016/10/26時点の最新版
公式で最新版を確認してください

realm公式：https://realm.io
realm公式手順：https://realm.io/docs/java/latest/#getting-started

## Realm導入
1. build.gradle (Prpoject)  
プロジェクトのbuild.gradleのbuildscript→dependenciesに下記を追加  
`classpath "io.realm:realm-gradle-plugin:2.1.0"`
2. build.gradle(Module:App)  
モジュールのbuild.gradleの直下に下記を追加  
`apply plugin: 'realm-android'`

## Lombok導入
Realmを使う上で必須ではないがGetter/Settterなど省略できるので一緒に導入
取りあえずRealm使いたいだけならこの手順は飛ばして良い

1. build.gradle(Module:App)  
dependenciesに下記を追加  
`compile "org.projectlombok:lombok:1.16.10"`  
2. lombok.config  
build.gradle (Prpoject) がある階層にlombok.configという名前のファイルを作成  
内容は下記のとおり  
`lombok.addGeneratedAnnotation = false`  
※この設定ファイルが無いとAndroid環境ではビルドエラーが出る

## モデル(テーブル)の作成  
RealmObjectを継承したデータモデルクラスを作成
https://realm.io/docs/java/latest/#models

フィールドをprivateで定義する場合（getterとsetterにLombokを利用）

```lang:java
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class SampleObject extends RealmObject {
    private int id;
    private String name;
}
```

フィールドをpublicで定義する場合

```lang:java
public class SampleObject extends RealmObject {
    public int id;
    public String name;
}
```

アノテーションを付けた場合

```lang:java
public class SampleObject extends RealmObject {
    @PrimaryKey
    public int id;
    @Required
    public String name;
}
```
@Ignoreを付けると保存されない項目になる
@Indexを付けると検索インデックスが設定される

## Realmの設定
設定とはDB実体のファイル名や暗号化の有無などなど
下記のコードはデフォルト設定を使う場合
Applicationクラスを継承したクラスのonCreate()に下記のコードを記載すると
アプリ全体で使えるので便利

```lang:java
import io.realm.Realm;
import io.realm.RealmConfiguration;

public class MyApplication extends Application {
    public void onCreate() {
        super.onCreate();

        // Realm設定ここから
        Realm.init(this);
        RealmConfiguration config = new RealmConfiguration.Builder().build();
        Realm.setDefaultConfiguration(config);
        // Realm設定ここまで
    }
   ~~~ 省略 ~~~
}
```

カスタム設定を使う方法
https://realm.io/docs/java/latest/#configuring-a-realm


## Realmインスタンスの取得

デフォルト設定の場合

```lang:java
Realm realm = Realm.getDefaultInstance();
```

カスタム設定の場合は`getInstance(RealmConfiguration configuration)`を使うので注意

## 書き込み
書き込みは必ずトランザクションで囲む必要がある
createObjectの2個目のパラメータはモデルにPK（@PrimaryKey）を設定した場合にPKの値を指定する
PKを設定していない場合は指定しない

```lang:java
int id = 1;
Realm realm = Realm.getDefaultInstance();
realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        SampleObject obj = realm.createObject(SampleObject.class, id);
        obj.name= 'test1';
    }
});
```

## 取得（クエリ）

https://realm.io/docs/java/latest/#queries

```lang:java
Realm realm = Realm.getDefaultInstance();

// SampleObjectの id=1 のデータを取得
SampleObject obj= realm.where(SampleObject.class).equalTo("id", 1).findFirst();

// SampleObjectの全レコード取得
RealmResults<SampleObject> objs = realm.where(SampleObject.class).findAll();
```

~~idを文字指定するところがいけてないけどサンプルをざっと見た感じわからなかった~~
Realm Field Names Helperを入れるとidの文字列指定を回避できます
zaki50さんありがとうございます
RailsでMaterialアイコンを使う (Material Icons for Rails)

# Material Icons for Railsの使い方
Material Icons for RailsはRailsで簡単ににMaterial Designのアイコンを使えるGemです。

ダウンロード：https://github.com/Angelmmiguel/material_icons

# インストール方法
Gemfileに以下を追加

```Gemfile.
gem 'material_icons'
```

bundle installを実行する

# CSS
application.cssに以下を追加

```application.css
/*
 *= require material_icons
 */
```

# 呼び出し方

```sample.html.erb
<i class="material-icons">face</i>
<i class="material-icons md-36">face</i>
```

# その他のアイコン一覧
以下のサイトにアイコンとアイコン名の一覧があります
https://material.io/icons/
swift関連

Xcodeでのビルドを自動化するxcodebuildコマンドとIPAファイルを作成してiTunes Connect(Testflight)に投げる方法
http://blog.ch3cooh.jp/entry/20150210/1423573065

A replacement for Apple's xcodebuild that makes it easier to build and test iOS or OSX apps.
https://github.com/facebook/xctool

Command-line application launcher for the iOS Simulator
https://github.com/phonegap/ios-sim

fastlane
https://github.com/fastlane/fastlane

ios-sim
https://github.com/phonegap/ios-sim

simctl
https://github.com/plu/simctl

Xcodeなしで楽しむSwift (REPLからライブラリ生成まで)
http://qiita.com/demmy/items/c4a6a430787d3097a6df

awesome-swift
https://github.com/matteocrippa/awesome-swift

What's new in Swift 3.0
https://www.hackingwithswift.com/swift3

simctlでiOSシミュレータを制御する
http://qiita.com/garsue/items/aad6e11091b2331c6ce3

iOS Simulatorのシステムログを確認する
http://qiita.com/rizumita/items/fbf41717a80bde1c05c8

Swiftのログプラットフォーム、SwiftyBeaverのセットアップ方法
http://qiita.com/kzykbys/items/20a3e08b453023ec2ec1

Cocoapodsの設定がうまくいかない時
http://qiita.com/kurosawa_kuro/items/c1e5e01e57545382cbe9

Swift 2.2での日付・時刻関連の処理
http://qiita.com/kaorumori/items/ce78c4d9c44ea812981f
Googleスプレッドシートで多言語に翻訳

Googleの翻訳APIを使って一括で多言語ローカライズできないかなーと調べていたら、
Googleスプレッドシートに神マクロ発見！！！

# GOOGLETRANSLATE

`=GOOGLETRANSLATE(テキスト, [ソース言語], [ターゲット言語])`

これを書くと、Google翻訳APIで翻訳してくれます。
素晴らしい…

# サンプル

https://docs.google.com/spreadsheets/d/1nSPmDVmSlFa0Auh6L7LmejRFsc1KGa0UY4VoUn1qyDo/edit?usp=sharing

最初は、英語→他言語という翻訳に統一していたのですが、
ゲームの難易度表記で、
簡単：EASY→簡単
難しい：HARD→"固い"
となったので、base-wordとbase-languageを作りました。
Reactの翻訳チュートリアルが消えました

https://facebook.github.io/react/docs/tutorial-ja-JP.html
は現在閲覧できません。

あなたのPCの問題ではありません。
一時的な障害ではありません。
ファイル場所の移動ではありません。

2016/10/22に新しいドキュメントがコミットされました
[New Documentation · facebook/react@455d2d1]

(大きいです)
その際に、各言語のファイルがごっそり削除されています。

原文と齟齬がでてしまうこともわかるのですが、そういうものなのかとわりかしびっくり。

forkして巻き戻せば見れるのかな？と思いましたが、fork時点でGithub Pagesを見ると、本家にリダイレクトされる模様で断念…
もっと中身を読めばできるのかな？

何時のバージョンかはわかりませんが、外部の翻訳を見るか、新ドキュメントの翻訳待ちになるでしょうか。
英語が読めないならば…

読み始めて三日後に消えるのは悲しい…

[React.js v15 チュートリアル【日本語翻訳】 | mae's blog]

日本語はまだ…かな？
[「New Docs」 Set Up Localization Effort · Issue #8063 · facebook/react]

[New Documentation · facebook/react@455d2d1]:https://github.com/facebook/react/commit/455d2d1b48e5cdaeac5d0b4fd92b29b4d52bcaec


[React.js v15 チュートリアル【日本語翻訳】 | mae's blog]:http://mae.chab.in/archives/2872

[「New Docs」 Set Up Localization Effort · Issue #8063 · facebook/react]:https://github.com/facebook/react/issues/8063
Vimをより暗黒パワーに染めるべくdein.vimに端末固有のプラグインをロードさせるようにするメモ


## はじめに

昨日[Vimを暗黒パワーに染めるべくdein.vimを導入してみたメモ](http://qiita.com/from_kyushu/items/17b5c8b9061de4521cde)に書いた通り、プラグインマネージャーを[pathogen](https://github.com/tpope/vim-pathogen)から[dein.vim](https://github.com/Shougo/dein.vim)に乗り換えた。
pathogenの場合は`~/.vim/bundle`内に`git`に管理させない状態で端末固有のプラグインを放り込んでおけばそれぞれ読み込んでくれたが、dein.vimの場合は`dein#add()`や`dein#local()`、`dein#load_toml()`で明示的に読み込む必要がある。
私のやり方では`~/.vimrc`は全端末共有の設定を書き、`~/.vimrc.local`に各端末固有の設定を書くようにしているのだが、dein.vimはプラグインのロードを一箇所の`dein#begin()`ブロック内に書かなければならないため、端末固有のプラグインのロードも`~/.vimrc`に書く必要があった。

そこで、TOMLファイルを全端末共通のものと各端末固有のものの2種類準備し、全端末共通のものだけgit管理下に置いて共有するようにした。

## 設定

```vim
" use dein.vim
if &compatible
  set nocompatible
endif

augroup MyAutoCmd
  autocmd!
augroup END

let s:dein_dir = $HOME . '/.vim/dein'
let s:dein_repo_dir = s:dein_dir . '/repos/github.com/Shougo/dein.vim'
let &rtp = &rtp .",". s:dein_repo_dir

if !exists('g:dein_toml_list')
  let g:dein_toml_list = []
endif
let g:dein_toml_list += [s:dein_dir . '/config.toml', s:dein_dir . '/config_local.toml']

if dein#load_state(s:dein_dir)
  call dein#begin(s:dein_dir)
  for toml in g:dein_toml_list
    if filereadable(toml)
      call dein#load_toml(toml)
    endif
  endfor
  call dein#end()
  call dein#save_state()

  if dein#check_install()
    call dein#install()
  endif
endif

silent! execute 'helptags' s:dein_repo_dir . '/doc/'
```

`g:dein_toml_list`というリストを準備し、そこに読み込ませるTOMLファイルをひたすら追加していく。
その後それぞれファイルが存在し読み込むことが出来れば`dein#load_toml()`で読み込むようにした。
~~`dein#begin()`の第二引数に監視対象のファイルを指定するようにしているため、こちらにも端末固有のTOMLファイルを追加するようにする。~~
**2016/10/31 Update Shougo氏からご指摘いただき、`dein#begin()`の第二引数を削除（コメント参照）**

あとは端末固有のTOMLファイル（私の例では`~/.vim/dein/config_local.toml`）にそれぞれの端末でのみ使いたいプラグインを列挙しておけば良い。
SFDC Dataloaderの設定ファイルのパス

## 45.0.0～
### config.properties
C:\Users\○○\y\v45.0.0\configs

## ～44.0
### config.properties
C:\Users\○○\AppData\Local\salesforce.com\Data Loader 44.0.0\conf

## 37.0で執筆時のパス
### config.properties
C:\ProgramData\salesforce.com\Data Loader XX.0.0
→GUI接続時のプロクシ設定等の変更を掛けるときに使用
　下記リンクの情報は古いです、注意！
　https://help.salesforce.com/apex/HTViewSolution?id=000193612&language=ja

### log-conf.xml
C:\Program Files (x86)\salesforce.com\Data Loader\bin
→バッチモード時にコンソールに吐かれるINFOログを抑制するときに使用
ターミナルのプロンプトを短くする。

#対象
Sun Solalis, vine linux, ubuntu, fedora, redhat では通用する内容のはず。 
他のディストリビューションは使ったことがないですが、おそらく同じかと思われます。

#ubuntu 11系以降でのデフォルト設定
```shell:~linuxuser/.bashrc
if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
```
プロンプトの様子はこんな感じ。
```bash:prompt
username@pcname:~$ cd /opt
username@pcname:/opt$ mkdir -p /opt/dir1/dir2/dir3
username@pcname:/opt$ cd dir1/dir2/dir3
username@pcname:/opt/dir1/dir2/dir3$
```
絶対パスが入るので見難いです。
※もちろん、用途や状況によって必要なときもある。。。はず。

#短くする。
 - PC名表示しない、
 - ディレクトリ表記をカレントディレクトリだけにする。

```shell:~linuxuser/.bashrc
if [ "$color_prompt" = yes ]; then
#    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
     PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@:\[\033[01;34m\]\W\[\033[00m\]\$ '
else
#    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
    PS1='${debian_chroot:+($debian_chroot)}\u@\W\$ '
fi
```
.bashrc書き換え後、
- source .bashrc とか
- source . とか
- ターミナルリブート
で設定を反映する。

プロンプトの様子はこんな感じ。
```bash:prompt-short
username@:~$ cd /opt/dir1/dir2/dir3
username@:dir3$
```

※動作確認ができたら、ねんのため、バックアップファイル.bashrc~を消しておくといいと思います。
ページ上の全てのリンクを正規表現で取得するブックマークレット

#できる事
ページのアンカータグのリンクとテキストを正規表現で絞り込んで取得します。取得できた物をエクセル等に貼り付けやすいように、別ウィンドウにテーブルで出力します。

#使い方
以下の###your regular expresstion###
の所に正規表現を入れてください。

例えば
http://example.com/000/　
のようなURLを取りたい場合は以下のようにすれば

match(/http:\/\/example.com\/[0-9]+\/$/)
となります。

```
javascript:(function(){
var%20d=window.document;
var%20as=d.getElementsByTagName("a");
var%20s="";
for(var%20i=0,len=as.length;i<len;i++){
if(as[i].href.match(/###your regular expresstion###/)){s+="<tr><td>"+as[i].innerText+"</td><td>"+as[i].href+"</td></tr>";}}
nwin=window.open("");
nwin.document.open();
nwin.document.write("<table>"+s+"</table>");
nwin.document.close();
d.body.appendChild(v);})();void(0);
```

#バリエーション
##テキストがないものは除く

as[i].innerText!=''を正規表現のマッチと併せてチェックする

```
javascript:(function(){
var%20d=window.document;
var%20as=d.getElementsByTagName("a");
var%20s="";
for(var%20i=0,len=as.length;i<len;i++){
if(as[i].href.match(/###your regular expresstion###/)%20&&%20as[i].innerText!=''){s+="<tr><td>"+as[i].innerText+"</td><td>"+as[i].href+"</td></tr>";}}
nwin=window.open("");
nwin.document.open();
nwin.document.write("<table>"+s+"</table>");
nwin.document.close();
d.body.appendChild(v);})();void(0);
```

##カンマ区切りで出す
```
javascript:(function(){
var%20d=window.document;
var%20as=d.getElementsByTagName("a");
var%20s="";
for(var%20i=0,len=as.length;i<len;i++){
if(as[i].href.match(/###your regular expresstion###/)){s+=as[i].innerText+","+as[i].href+"<br />";}}
nwin=window.open("");
nwin.document.open();
nwin.document.write(s);
nwin.document.close();
d.body.appendChild(v);})();void(0);
```
Azure Machine LearningのWeb Serviceにjavaからアクセスする

#Azure Machine LearningのWeb Serviceにjavaからアクセスする
Azure Machine LearningのWeb Serviceを作成するとサンプルのコードを見ることができますが、
サンプルで使用されている言語がC#、Python、Rでした。

既存のシステムに組み込む場合、javaからアクセスしたいパターンも多いかなと思って、javaから
Web Serviceを呼び出すコードを書いてみました。

また、Azure Machine Learningは自力で分かち書き処理が組み込まれていないので
設定ファイルでテキストデータを分かち書き出来るようにしました。

##前提
Azure Machine LearningのWeb Serviceが作成されていることを前提として作成しています
Web Serviceの作成はこちらのサイトを参考にさせていただきました。
　http://pronama.azurewebsites.net/2015/03/16/azure-machine-learning/

##使用ライブラリ
- Web Serviceへのアクセス：apache http client
- 設定ファイル(json)の読み込み：jackson
- 学習用データファイル(CSV)：openCSV
- 形態素解析：kuromoji

##Github
https://github.com/atsu4sai10o/AmlClient.git

##実行方法
java AmlClient 【CSVデータファイル】

##設定ファイル(param.json)の設定
configフォルダ内のparam.jsonファイルで設定を行います

- url : WebServiceにアクセスするためのurl
- api_key : WebServiceのAPI key
- MorphoLogical : 形態素解析を行いたい列のカラム名を指定(配列形式)
- StopWords : 形態素解析結果に含めない品詞を指定(形態素解析はkuromojiを使用)

##各クラス解説  
Githubにアップされているプロジェクトに修正、変更する場合に参考にしてください
src/main/java
- Main.java：メインクラスです。処理の呼び出しを行います。
- Common.java：ユーティリティクラスです。設定ファイルやCSVファイルの読み込み、リクエストに使用するjsonデータの作成、形態素解析処理を行います。
- HttpUtility.java：http Clientの処理を行います。リクエストはpostで送信します。
Chainerの基本オブジェクトについて〜links編〜

Chainerの基本オブジェクトについて書いています．
今回はlinksについてです．

#links
linksはfunctionsと似ていて，Variablesを変数に持つ関数を提供します．
違いはというと，functionsは関数にパラメータを持ちませんが，linksはパラメータを持ちます．
具体的に見ていきます．

#Linear
例えば，l層が3個のノード，l+1層が4個のノードから構成されているとします．

![links.png](https://qiita-image-store.s3.amazonaws.com/0/28622/95e2dbe1-6d21-ab3e-38a2-db586517e19d.png)


これは，l層の出力（l+1層の入力）をyとすると，その写像は

```math
y = wx + b
```

という線形で表すことができます．

linksはこのように，層から層への写像を提供します．この場合，パラメータはwとbです．

これを（ノード3からノード4の層へ），linksで表現すると，

```
>>> from chainer import links as L
>>> y = L.Linear(3, 4)
```

wには適当な値が，bには0が入っています．

![linear.png](https://qiita-image-store.s3.amazonaws.com/0/28622/488cbe82-16fb-0403-e0e0-3571c7e7c53d.png)


対してfunctionsは活性化関数や誤差関数などに用いる関数を提供しました．sigmoid関数を見てわかるように，

```math
y =  \frac{ 1 } { 1 + e^{-x} }
```

パラメータはありません．

ニューラルネットワークにおいて，このパラメータを推定することが鍵となります．

では，次回はそのパラメータ推定のために重要なChainオブジェクトについて書きます．

#参考

新納浩幸
Chainerによる実践深層学習～複雑なNNの実装方法～　オーム社
link > linux / yum / rpm > ファイルがどのパッケージに含まれているかを教えていただいた

@tukiyo3 さんに教えていただいた「ファイルがどのパッケージに含まれているか」を知る方法。

今後も使いそうなので検索性向上のためのリンク記事とします。
http://qiita.com/7of9/items/9ab581c15fe89127f429#comment-4c0af51a3b161de40ef6

<hr>
(追記 2016/11/05)

> また、locateはupdatedbで一覧更新する必要があります。
(たしかcronで毎日更新される)

TensorFlowインストール直後にlocateではmnist.pyが見えませんでした。
updatedbを実行してからmnist.pyがlocateで見つかるようになりました。

情報感謝です。
@tukiyo3 さん
anyenvでphpenvとrbenvの共存

## rbenvとphpenvの共存

sassのコンパイルにてcompassが必要になり、Rubyをrbenv経由でインストールしようとした時、もとからphpenvが入っていたため不具合が生じた。
複数の◯◯envを共存させるには、anyenvを使うと良いです。

### 既存のphpenv／rbenv削除

brewでインストールした場合

```
$ brew uninstall phpenv 
```

gitでインストールした場合

```
$ rm -rf ~/.phpenv
```

### anyenvのinstall

gitでインストールします

```
$ git clone https://github.com/riywo/anyenv ~/.anyenv
```

### pathの設定

zshを使っています。適宜読み替えて下さい

```
$ vi ~/.zshrc
```

.anyenv/envsの中にインストールした◯◯envが入っているので、その数だけPATHを通している

```
...

if [ -d $HOME/.anyenv ] ; then
    export PATH="$HOME/.anyenv/bin:$PATH"
    eval "$(anyenv init -)"
    # tmux対応
    for D in `\ls $HOME/.anyenv/envs`
    do
        export PATH="$HOME/.anyenv/envs/$D/bin:$PATH"
    done
fi
```

```
$ source .zshrc
```

### install rbenv

rbenvをインストールします

```
$ anyenv install rbenv
```

### install ruby

rubyをインストールします

```
$ rbenv install 2.3.1
$ rbenv global 2.3.1
$ rbenv rehash
$ ruby --version                                                                                                  
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]
```

### install phpenv

phpenvを改めてインストールします

```
$ anyenv install phpenv
```

### install php

phpをインストールします

```
$ phpenv install 7.0.12
$ phpenv global 7.0.12
$ phpenv rehash
$ php --version                                                                                                   
PHP 7.0.12 (cli) (built: Oct 26 2016 22:07:26) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.12, Copyright (c) 1999-2016, by Zend Technologies
    with Xdebug v2.4.1, Copyright (c) 2002-2016, by Derick Rethans
```

### phpインストールでエラーが起きた場合

基本的にコンパルエラーの内容を見て下さい。私の場合は以下の方法で解決しました。
ちなみに、エラー内容は

```
configure: error: build test failed.  Please check the config.log for details.
```

と、内容の無いものでした。config.logもどこにあるのかわからなかったです。
以下、解決したログです。

openssl, libxml2, mcryptのPATHを表示します。
まだインストールされていない場合は、brewでインストールしてください

```
$ echo -e "--with-openssl=$(brew --prefix openssl)\n--with-libxml-dir=$(brew --prefix libxml2)\n--with-mcrypt=$(brew --prefix mcrypt)"
--with-openssl=/usr/local/opt/openssl
--with-libxml-dir=/usr/local/opt/libxml2
--with-mcrypt=/usr/local/opt/mcrypt
```

以下のとおり、php-buildの設定ファイルを編集します

```
$ vi .anyenv/envs/phpenv/plugins/php-build/share/php-build/default_configure_options
```

以下のとおり編集します。
もとからある、--with-opensslを変更。--with-mcryptを変更。--with-libxml-dirを追加

```
- --with-openssl
+ --with-openssl=/usr/local/opt/openssl
- --with-mcrypt
+ --with-mcrypt=/usr/local/opt/mcrypt

...

+ --with-libxml-dir=/usr/local/opt/libxml2
```

再度インストールを試して下さい。

### 参考
https://teratail.com/questions/51089
上記のログで助かりました。ありがとうございます
TensorFlow > link > tf.argmax(y_,1) > is the label our model thinks is most likely for each input

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

https://www.tensorflow.org/versions/r0.11/tutorials/mnist/beginners/index.html
の
mnist_with_summaries.py
を学習中。


```py
  with tf.name_scope('accuracy'):
    with tf.name_scope('correct_prediction'):
      correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
```

上記のコードにおいて`tf.argmax(y, 1)`の意味が不明瞭だった。

tf.argmax()は最大値を返す関数であるが、yはラベルなので「ラベルの最大値って？」という疑問を持った。

https://www.tensorflow.org/versions/r0.9/tutorials/mnist/pros/index.html
> Evaluate the Model
...
> For example, tf.argmax(y,1) is the label our model thinks is most likely for each input, while tf.argmax(y_,1) is the true label. 

"most likely"という意味でのtf.argmax()ということと理解した。
Qiita:team導入検討する人がしっておきたい項目

# Qiita:teamとは
Qiita:teamとはパブリックな場所では書けない内容を書きたいときに使うサービスです。社内議事録や社内だけにしか共有できない情報などをまとめる場合には、QiitaではなくQiita:teamを使用することになります。
Qiitaを使ってるエンジニアから、Qiita:teamを導入したいとの要望を受けた管理者が予め抑えておくべきポイントを7個まとめてみました。

1. ドメイン
2. 見た目
3. ユーザー数と料金
4. 役割
5. ユーザー管理
6. グループ機能
7. Oraganizationとの違い

#1.ドメイン
Qiita:teamを申し込むとサブドメインが発行されます。

例えば、hogehogeてteamを作成するとQiita:teamのURLは、**http://hogehoge.wiita.com**となります。
QiitaとQiita:teamの切り替えは、URLか右上のロゴから切り替え可能です。

![2016-10-27 6-52-22.jpg](https://qiita-image-store.s3.amazonaws.com/0/65435/f73547e3-ec83-9bfa-3aa8-8d7c3175fd98.jpeg)

#2.見た目
事故防止のため、QiitaとQiita:teamでは見た目で差がわかるようになっています。

## Qiita

![2016-10-27 6-54-31.jpg](https://qiita-image-store.s3.amazonaws.com/0/65435/fa086951-1128-3877-7d93-63ee94bf1217.jpeg)

##Qiita:team

![2016-10-27 6-54-59.jpg](https://qiita-image-store.s3.amazonaws.com/0/65435/cef48e07-9a5e-95e5-acda-237ffe860ca0.jpeg)

##投稿時
Qiita:teamでもQiitaでも使用しているアカウントでQiitaに投稿しようとすると、TeamじゃなくQiitaだけど大丈夫？っと確認してくれます。

![2016-10-27 7-18-57.jpg](https://qiita-image-store.s3.amazonaws.com/0/65435/649d5d53-0d9e-032e-a1fd-bd9e781533f7.jpeg)

#3.ユーザー数と料金

料金体系は[Price](https://teams.qiita.com/pricing)に記載されています。
個別に連絡して何人使用できるかを設定してもらいます。

会社では150人で申請していますが実際には、112人分のアカウントしか設定していないので課金も112アカウント分の課金になっています。

#4.役割
権限は、ユーザーと管理者とオーナーの3つに分かれています。

##オーナー
オーナーは1アカウントだけで開設時に申請したアカウントに設定されます。
オーナー権限を持っているアカウントで支払い情報や請求情報を見ることができます。

##管理者
管理者は、オーナーか管理者が設定できます。
管理画面から登録ユーザーに管理権限を付与したり解除したりできます。

![2016-10-27 7-01-20.jpg](https://qiita-image-store.s3.amazonaws.com/0/65435/69f8d3ed-d847-c92c-405d-63845ee4a366.jpeg)

ユーザー登録や削除、管理者権限の付与や解除は管理画面上では操作ログでないのが悲しい。管理操作ろぐはGithubみたいに監査機能的に記録されていると嬉しいですね。ちなみにユーザーの追加と削除は、Integrationしておくと通知はきます！おしい。

![2016-10-27 7-05-00.jpg](https://qiita-image-store.s3.amazonaws.com/0/65435/f76063a5-6bdc-506a-9202-7c5446db8198.jpeg)

##ユーザー
ユーザーはQiita:team内で記事を投稿したり、コメントしたりPRしたりできます。
通常のQiitaのユーザーと同じです。

#5.ユーザー管理
現時点では、SSO的な管理方法が提供されていないので管理画面でユーザーを追加したり削除したりする必要があります。
退職者管理が面倒(;´･ω･)
ただ一昔前と違って、現在では管理画面でユーザーのメールアドレスが表示されるようになったのが救いです。
昔はユーザー名しか表示されないのに、ユーザーで名前を変更できてしまったので、このアカウント誰の？？的な悲しみがありましたが、今は登録時のメールアドレスが表示されるので救われます。

弊社都合的には、Google Appsと紐づいてくれてSyncしたら特定ディレクトリのユーザーのアカウント作成＆削除をしてくれると管理コストが下がって嬉しいですね。ついでにGoogle AppsのSSOに対応すれば行こうと無し。

#6.グループ機能
2016年6月に[グループ機能](http://blog.qiita.com/post/145238176529/group-feature)が追加されたので、組織内（部とかグループ）に閉じないといけない情報もこれで管理できるようになりました。
![2016-10-27 7-13-46.jpg](https://qiita-image-store.s3.amazonaws.com/0/65435/5b022e47-f4f2-7b4d-0057-d05ce7d6bd7f.jpeg)

#7.Oraganizationとの違い
Qiita:teamはチームに閉じたQiitaを作成できる機能で組織内に閉じた情報をやりとりするのに使うものです。
一方でOrganizationはQiitaというパブリックに公開されている情報や人に色をつける機能です。
このアカウントはこの組織に所属しているアカウントですよ！って宣言しちゃうものです。
全然違う趣旨のものですね。
こちらはQiita:teamとは別に申請が必要。

[Organization一覧](http://qiita.com/organizations)


というわけで、gloopsではQiitaを使ってます。絶賛[エンジニア採用](http://gloops.com/recruit/)中ですｗ
python > 複数行の書き方 > mnist_with_summaries.pyでの書き方 > 行連結記号がなくてもよさそう

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

過去にいくつかの言語での行連結について記事にした。
http://qiita.com/7of9/items/021bb0fa9443c2efc44b

TensorFlowというDeep Learningようフレームワーク？のコード　mnist_with_summaries.pyにおいて以下のコードを見つけた。

```py
  with tf.name_scope('train'):
    train_step = tf.train.AdamOptimizer(FLAGS.learning_rate).minimize(
        cross_entropy)
```

行連結記号がなくてもいいようだ。

文字列の連結の場合は以下のリンク先に紹介されている。
[[Python]文字列を複数行に分けて書きたい @ memlogさん](http://blog.taikomatsu.com/2008/10/08/python%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E8%A4%87%E6%95%B0%E8%A1%8C%E3%81%AB%E5%88%86%E3%81%91%E3%81%A6%E6%9B%B8%E3%81%8D%E3%81%9F%E3%81%84/comment-page-1/)


### ideoneで確認

http://ideone.com/n5Rim5

```py
def func_print(var):
	print var

var = 3.14
func_print(var)
func_print(
	var)
```

「関数の引数に関しては」という条件つきかもしれない。
接続されている全ビデオキャプチャデバイスの名前取得方法

#目的
現在接続されていビデオキャプチャデバイスをプログラムから取得します。
ビデオキャプチャデバイスを扱うライブラリとしては DirectShow が有名だと思いますが、2016年現在でサポート期間中である WindowsVista 以降では Media Foundation が後継となっていますので、Media Foundation を使用します。

#サンプルコード
必要ライブラリ

* mfplat.lib
* Mf.lib

```cpp:sample.cpp
#include <cstdint>
#include <iostream>
#include <vector>
#include <string>
#include <memory>
#include <mfapi.h>
#include <mfidl.h>

HRESULT GetVideoDeviceNames(std::vector<std::wstring>& deviceNames)
{
	HRESULT hr;

	std::shared_ptr<IMFAttributes> pAttributes;
	{
		IMFAttributes *prawAttributes = nullptr;
		hr = MFCreateAttributes(&prawAttributes, 1);
		if (FAILED(hr))
			return hr;

		pAttributes = std::shared_ptr<IMFAttributes>(prawAttributes, [](auto* p) { p->Release(); });
	}

	hr = pAttributes->SetGUID(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID);
	if (FAILED(hr))
		return hr;

	IMFActivate** pprawDevice = nullptr;
	uint32_t count(0);
	hr = MFEnumDeviceSources(pAttributes.get(), &pprawDevice, &count);
	if (FAILED(hr))
		return hr;

	deviceNames.resize(count);
	for (int i(0); i < count; ++i)
	{
		wchar_t* buffer;
		uint32_t length;
		hr = pprawDevice[i]->GetAllocatedString(MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME, &buffer, &length);
		if (FAILED(hr))
			return hr;

		deviceNames[i] = buffer;
	}

	if (pprawDevice != nullptr)
	{
		for (int i(0); i < count; ++i)
			pprawDevice[i]->Release();

		CoTaskMemFree(pprawDevice);
	}

	return S_OK;
}

int main(int argc, char* argv[])
{
	HRESULT hr;
	hr = MFStartup(MF_VERSION);
	if (FAILED(hr))
		return hr;

	std::vector<std::wstring> deviceNames;
	hr = GetVideoDeviceNames(deviceNames);
	if (FAILED(hr))
		return hr;

	for (const auto& wstr : deviceNames)
		std::wcout << wstr << std::endl;

	hr = MFShutdown();
	if (FAILED(hr))
		return hr;

	std::wcout << std::endl;
	std::wcout << L"Press any key to exit..." << std::endl;
	std::wcin.get();

	return 0;
}
```

#結果
Surface Pro で試した結果を載せます

>Front LifeCam
>Rear LifeCam

>Press any key to exit...
TensorFlow > link > reduce_max(var) > 縮約操作系関数

```txt:動作環境
Ubuntu 14.04 LTS desktop amd64
GeForce GTX 750 Ti
ASRock Z170M Pro4S [Intel Z170chipset]
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v7.5
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
```

https://www.tensorflow.org/versions/r0.11/tutorials/mnist/beginners/index.html
の
mnist_with_summaries.py
を学習中。

74行目の以下のtf.reduce_max()のreduceが気になった。

```
tf.scalar_summary('max/' + name, tf.reduce_max(var))
```

以下のリンクが分かりやすい。
http://dev.classmethod.jp/machine-learning/tensorflow-math/

> 縮約操作系関数について
...
> まず、reduce_sum 関数はテンソルのみを引数に渡すと、全ての要素で和をとり0階のテンソルとしてスカラー値を返却します。

reduce_max()は最大値をスカラー値として返す、という理解をした。
技術英語 > I'll sleep on it.

Deep LearningをDeepにLearning中の7of9。
ここ最近2回寝過ごして朝の学習をすっぽかしたのは夜の学習が多すぎるためか。
Deep Learningを<details><summary>以下略</summary>Sleep Learningに切り替えた学習をしているとも言える。@継続の天才 by 竹内均さん「アンリ・ポアンカレはその著作である「科学と方法」で、独創が生まれるための時期を、意識・無意識・意識的活動の３つに分けている。第一の意識の時期には、要素や断片を集め、次の第二の時期、無意識のときにこうした要素や断片の結合や配列が行われ、さらに第三の意識的活動の時期にいたって、実験や計算などの知的活動を通して結合や配列の検証がなされるというわけだ。」つまりは、Sleep Learning中にDeep Learningの内容が無意識下で整理され、そのエッセンスがAutoEncoderにより特徴抽出され、その結果、720万倍に高速化された数値光散乱シミュレーションコードの実装が成し遂げられ、24世紀の未来に人類未踏の宇宙に勇敢に航海する。by ファーザー@神聖モテモテ王国(嘘)</details>

sleep関連で思いだした英語を。

> I'll sleep on it.

http://eow.alc.co.jp/search?q=sleep+on+it&ref=crx

意訳「一晩考えてみます」

即決できない事項で、じっくり考えた方がいい提案をされた時などに使う。
追加したタクソノミーに投稿を一括で紐付けたいとき


すでに投稿されている記事に、WPプラグイン「Custom Post Type UI」で追加したタクソノミーを一括で割り当てるには、Custom Post Type UI → タクソノミーの管理 → タクソノミーを編集 から、一番下の項目にチェックを入れる

![Kobito.Jddkc3.png](https://qiita-image-store.s3.amazonaws.com/0/82372/0585de87-7c5a-acbe-8c4c-3cfcef615903.png "Kobito.Jddkc3.png")

すると投稿の一括編集画面に、カテゴリーの他に追加したタクソノミーが表示されている。

タクソノミーを一括変更するためのプラグインを2時間くらい探し回った。
Ruby on Rails 製の CMS Refinery を試してみる

Ruby on Rails 製の CMS Refinery を試してみました。  

## <i class='fa fa-question-circle'></i> Refineryとは？
Ruby on Rails 製の CMS です

## <i class='fa fa-check-circle'></i> 特徴
* Rails Way に乗っている
* エンドユーザーにフォーカスしたUI
* 開発者向けのツールが充実している
* 開発者向けコミュニティのサポートが手厚い

## <i class='fa fa-list'></i> 手順
### <i class='fa fa-cube'></i> Install
```sh
$ gem install refinerycms
```

### <i class='fa fa-cube'></i> Create Application
```sh
$ refinerycms refinary_sample
```

### <i class='fa fa-play-circle'></i> 動作確認
```sh
$ rails server
```

* http://localhost:3000/refinery/users/register にアクセス

ユーザー登録画面が開きます

![sample1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/c6585a70-f547-52c6-45a8-0f17121511c4.png)

* 登録が完了し、管理画面が表示されます

![sample2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/65dc87ae-3de9-0024-b58b-45a2d8090ac0.png)

* HOME の編集ボタンをクリックします

![sample3.png](https://qiita-image-store.s3.amazonaws.com/0/43480/72331bdf-b8e2-7db9-523d-e88eea8205ee.png)

* HOME を編集し、Saveをクリックします

![sample4.png](https://qiita-image-store.s3.amazonaws.com/0/43480/63b9bd19-f5b1-ea23-74a5-c5c38585255c.png)

* 保存されました。目のアイコンでPreviewを表示します

![sample5.png](https://qiita-image-store.s3.amazonaws.com/0/43480/86b7e3b7-13fc-12fa-fc3b-262e14094b92.png)

* 変更が反映されました

![sample6.png](https://qiita-image-store.s3.amazonaws.com/0/43480/9ffe9418-aec8-ff34-c863-7802d9b0fe7c.png)

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* [refinery/refinerycms - GitHub](https://github.com/refinery/refinerycms)
* [Getting Started - refinerycms](http://www.refinerycms.com/guides/getting-started)
* [Recommended Hosting Companies - refinerycms](http://www.refinerycms.com/hosting)
* [Rails4 + Refinery CMSで友人のBlogサイトを作る - stormyMonday - Qiita](http://qiita.com/stormyMonday@github/items/0fd7fa28f42ce285d9b7)
C言語でフォルダ内のファイル数とファイル名を取得

#概要

**コメントでアドバイスをもらったやり方が一番よさそうだったのでそっち参考にしてください**

めっちゃ放置しててすいません


~~少し気になったので指定したフォルダ内のファイル数とファイル名を取得するプログラムを書きました。~~
~~ファイル名は二次元の動的配列に格納されます。~~
~~chdirに調べたいフォルダを指定してください（プログラムと同じ階層の場合はコメントアウトしてください）~~
~~Windows専用です（Systemのところの命令変えたらLinuxでも多分できる())==

~~※tmp.txtを一時的に生成して削除するのでプログラムと同じ階層にtmp.txtがある場合はプログラム内のファイル名を適当なのに変えてください。~~

~~**多分もっといい方法あると思うので、よければ教えてくださるとありがたいです...**~~



~~書いてるときに疲れてるから文章が堅い...((((((~~

#ソース
```
#include<stdio.h>
#include<string.h>

int main(){
	char **file_name;
	int i,len,file_num=0;
	char input[128];
	FILE *fp;
	
	//■■■■■■■■■■■■■■■■■■■■■■■■■■■
	//調べるフォルダ名
	chdir("a");
	system("dir /B > ../tmp.txt");
	chdir("../");
	
	fp=fopen("tmp.txt","r");
	while(fgets(input,64,fp)!=NULL){
		file_num++;
	}
	fseek(fp,0,SEEK_SET);
	file_name = (char**)malloc(sizeof(char*)*file_num);
	for(i=0;i<file_num;i++){
		fgets(input,64,fp);
		len=strlen(input);
		file_name[i]=(char *)malloc(sizeof(char)*len);
		sprintf(file_name[i],"%s",input);
	}
	fclose(fp);
	remove("tmp.txt");
	//■■■■■■■■■■■■■■■■■■■■■■■■■■■
	
	//表示
	printf("ファイル数:%d\n",file_num);
	for(i=0;i<file_num;i++){
		printf("%s\n",file_name[i]);
	}
	
	//解放
	for(i=0;i<file_num;i++){
		free(file_name[i]);
	}
	free(file_name);
	
	return 0;
}
```