OmniAICreator/Qiita-1.07M huggingface dataset:
Webアプリに全文検索を導入する

#はじめに

Rails4.2 + MySQL5.6 ので動くアプリに対し、全文検索（日本語）がしたく、全文検索とは何かわかっていない状態から調べたときのまとめです。
MySQLを使う方法と、別の全文検索サーバーを用いる方法について調べました。



#全文検索とは

複数文書にまたがって、文書に含まれる全文を対象とした検索
https://ja.wikipedia.org/wiki/全文検索

##主なやり方
文書にインデックスをつけて、インデックスを引くことで高速に検索
インデックスの辞書を作るために、文章からインデックス（索引）を抽出する必要がある

###英語の索引文字抽出
* わかち書き(スペース区切り)であるため、スペースで区切る

###日本語の索引文字抽出
* 形態要素解析
* N-Gram
 * "おはよう" であれば "おは　はよ　よう" のように分解する  
 * RubyでN-Gram
 http://d.hatena.ne.jp/lettas0726/20120210/1328873031

#MySQLを使う
##MySQLに日本語全文検索対応のストレージエンジンを使う

* Mroonga
  http://www.clear-code.com/blog/2015/11/10.html

##MySQLの Fulltext indexを使う
* MySQL 5.7を使う
    * 5.7から Fulltext indexが日本語対応

* MySQL 5.6を使う
    * 事前に形態要素解析またはN-Gramにより分割しておき、Fulltext indexを使う
http://www.tatamilab.jp/rnd/archives/000389.html#c
    * RailsとMysql5.6で全文検索
http://ria10.hatenablog.com/entry/20140107/1389071672
http://qiita.com/nabeen/items/275e46d318103ff737b0
http://blog.wackwack.net/entry/2016/03/21/221821

#全文検索サーバーを使う

下記のような選択肢がある

* Elasticsearch
 * Elasticsearchを自分でたてる
 * Elasticsearch service (AWS) 
 * Elastic cloud (Elasticsearchを作っている会社のサービス) 
* Amazon Cloudsearch
* Solr
* Groonga
* Sphinx

全文検索エンジンの比較
http://mojavy.com/blog/2014/02/10/search-engine-comparison/

Amazon cloud searchから Elasticsearchに乗り換えた理由
http://blog.otakumode.com/2016/07/15/replace-cloudsearch-to-elasticsearch/

##Elasticsearchの導入

既存のRailsアプリにElasticsearchを導入してみる
http://qiita.com/moriyaman/items/373107a3870c33229bac

Wantedlyの例
http://engineer.wantedly.com/2014/02/25/elasticsearch-at-wantedly-1.html

FRILの例
http://mosowave.hatenablog.com/entry/2015/12/07/000000

##MySQLとElasticserachの同期
* logstashでELBのログを2週間分だけAmazon Elasticsearch Serviceに取り込む
http://dev.classmethod.jp/cloud/aws/import-elb-logs-using-logstash/

* ElasticsearchのRiverプラグインを使う
http://dotnsf.blog.jp/archives/1005246681.html

#結論

まずはMySQLのFulltext indexで様子をみて、耐えられなければ、またより柔軟な検索を行いたければ別の全文検索サーバーをたてる。全文検索サーバーではElasticsearchがはやりのよう。
Thorで終了ステータス 1 で終了するための exit_on_failure とその現状

RubyのCLIの開発を支援するライブラリである thor は
デフォルトで引数不足などの異常終了時に status 0 を返却します。

これは thor の `exit_on_failure` メソッドが false を固定で返却していることによります。
そのため、このメソッドを true でオーバーライドすることによって 1 を返却するように
変更することができます。

```ruby
class HogeCommand < Thor
  class << self
    def exit_on_failure?
      true
    end
  end

  desc 'hoge', 'hoge command'
  def hoge
    puts "hoge"
  end
end
```

## <i class='fa fa-github'></i> Thor 本体の Issue
Thor の Issue でこの問題は起票済みで、2017/01/13現在未修正であるようです。

>Ok, so we bump the major version of Thor, and put it in the changelog. That's what semantic versioning is for, right?

メジャーバージョンアップで修正されるとのことなので version 1 になったら修正されるのかな？
（現在は version 0.19.4）

[Returns exit 0 when a required argument is not provided - issue 244 - erikhuda/thor - GitHub](https://github.com/erikhuda/thor/issues/244)

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* [Thorで終了ステータス 1 で終了する - Qiita](http://qiita.com/KitaitiMakoto/items/c6b9d6311c20a3cc21f9)
[PHP] mb_decode_mimeheader() は Quoted-printable なヘッダのデコードに失敗する

## 現象

MIMEエンコードされたメールヘッダを、PHPの[mb_decode_mimeheader](http://php.net/manual/ja/function.mb-decode-mimeheader.php)関数でデコードすると、半角スペースがアンダースコアでデコードされてしまうことがあります。
これは`mb_decode_mimeheader`のバグと思われます。

## 解決方法

imap拡張をインストールして、[imap_mime_header_decode](http://php.net/manual/ja/function.imap-mime-header-decode.php)関数を使いましょう。

## 解説

MIME(Multipurpose Internet Mail Extensions)というメールの仕様があります。
MIMEでは、メールのSubject等にASCIIの範囲外の文字を含める際は、所定の符号化を行う必要があります。
符号化方式としては、Quoted-printable方式と、Base64方式があります。

`mb_decode_mimeheader`には、Quoted-printable方式で符号化されたヘッダのデコードに問題があります。

MIMEの仕様(RFC2047)では、「4.2. The "Q" encoding」において以下のように定めています。

<blockquote>
The 8-bit hexadecimal value 20 (e.g., ISO-8859-1 SPACE) may be
       represented as "_" (underscore, ASCII 95.).
</blockquote>

MIME文字列中で、半角スペースは`=20`という文字列にエンコードされることもあれば、`_`（アンダースコア）にエンコードされることもあります。

下記は、「テストThis is valid subject of MIME header」という文字列をQuoted-printableでMIMEエンコードしたものです。

```
=?utf-8?Q?=E3=83=86=E3=82=B9=E3=83=88This_is_valid_subject_of_MIM?=
 =?utf-8?Q?E_header?=
```

しかし、この文字列に対して`mb_decode_mimeheader`を実行すると、「テストThis_is_valid_subject_of_MIME_header」という文字列が返ってきます。
半角スペースがアンダースコアとして表現されることもある、という仕様に沿っていないのです。

では、どうするか。一番手軽な解決方法は、imap拡張を入れて、`imap_mime_header_decode`関数を使うことです。
imap拡張はその名の通り、IMAPプロトコルをPHPで扱うためのライブラリですが、メール用のユーティリティ関数も含まれています。

### imapの使用例

imap拡張はPHPにデフォルトでは含まれないので、別途インストールが必要です。
以下は、`imap_mime_header_decode`関数と、それに類似の関数を使って、MIMEエンコードされた文字列をデコードする例です。

```php
<?php

$subject = <<<TXT
=?utf-8?Q?=E3=83=86=E3=82=B9=E3=83=88This_is_valid_subject_of_MIM?=
 =?utf-8?Q?E_header?=
TXT;

var_dump(mb_decode_mimeheader($subject)); // string(45) "テストThis_is_valid_subject_of_MIME_header"
var_dump(imap_utf8($subject)); // string(45) "テストThis is valid subject of MIME header"
var_dump(decode_mime_header($subject)); // string(45) "テストThis is valid subject of MIME header"

function decode_mime_header($str) {
    $decoded = '';
    $parts = imap_mime_header_decode($str);
    foreach ($parts as $part) {
        $decoded .= $part->text;
    }
    return $decoded;
}
```

imapには[imap_utf8](http://php.net/manual/ja/function.imap-utf8.php) という関数もあり、出力はUTF-8限定ですが、正しく動作します。
ただし、`imap_utf8`が上手く動かないという情報も見かけるので、`imap_mime_header_decode`を使っておいたほうが無難かと思います。

`imap_mime_header_decode`は、入力の各行の情報を格納した`stdClass`のオブジェクトの配列を返します。
`mb_decode_mimeheader`や`imap_utf8`と同じ感覚で使えるよう、関数にラップすると使いやすいと思います。

### やってはいけないワークアラウンド

imap拡張を入れずとも、以下のような関数を用意すれば対応できるのでは? と思うかもしれません。

```
function decode_mimeheader($str) {
    return mb_decode_mimeheader(str_replace('_', '=20', $str));
}
```

しかし、上記関数は、文字列がQuoted-printableでMIMEエンコードされている場合にしか正しく動作しません。
例えば、「Subject: mb_decode_mimeheader」という、MIMEエンコードされていないヘッダに上記関数を適用すると、「Subject: mb=20decode=20mimeheader」となってしまいます。

MIMEデコードを正しく実装するのは難しいので、既存のライブラリやメーラーでもたまにバグが見つかります。
できるだけまともなライブラリを選んで使うようにしたいところです。

## 参考

* RFC2047: https://www.ietf.org/rfc/rfc2047.txt
* RFC2047の日本語訳： http://www.t-net.ne.jp/~cyfis/rfc/mime/rfc2047_ja-1.html
* MIMEの基礎: http://www.mew.org/~kazu/doc/newsletter/3.html
初めてのAWS vpc作成→中にec2作成→sshログインまで

## 忘れないようにメモしとく

目指すのはひとまずこれ

![architecture.PNG](https://qiita-image-store.s3.amazonaws.com/0/47896/93e6829f-710e-15e6-e07b-dee871b7056e.png)


## VPC

### なぜVPCを作るのか

⇒ サブネット毎にポリシーを設定することで高いセキュリティを保証できる

インターネットから参照されないであろうRDSを内部のネットワークに置くなど


⇒ 簡単に地理的冗長構成が作れる

異なるvpcをアベイラビリティーゾーン(__AZ__)に設定する。
__例.)__
それぞれのvpc内にRDSを置いてレプリケーションさせることで
片方のネットワークが使えなくなったときもサービスを続ける事ができる

__しかもRDSにはMultiAZのオプションが用意されている
簡単に例のような構成がとれる__


#### ①私は本家のチュートリアルにあったVPCウィザードから作成。
https://ap-northeast-1.console.aws.amazon.com/vpc/home の
__VPCウィザード開始ボタン__から行える。

#### ②1個のパブリックサブネットを持つVPC

今回はVPCの中にサブネット作ってその中にec2入れるので
上記でいいでしょう。

入力はVPC名とかサブネットの名前つけるくらい　__↓こんな感じ__

![vpc.PNG](https://qiita-image-store.s3.amazonaws.com/0/47896/28ae76ce-8c6f-59e9-b6d0-7bb543f6cd37.png)

#### ③サブネットを確認

VPC作成後サブネットも作成されているかVPC管理画面のサイドバーから
サブネット管理画面にアクセス

存在していたら
__自動割り当てパブリック IP:はい__になっているかも確認

__でないと後々ec2インスタンスを作ったときにパブリックIP/DNSが
振られない可能性があります__

#### ④インターネットゲートウェイの作成

__VPCからインターネットに接続するためのルーター__
awsのネットワークの外に出てインターネットに接続できるようになる

__ゲートウェイ作成後に先ほど作ったVPCをアタッチするだけ__

#### ⑤ルートテーブルの作成と設定

VPC内のサブネット内で発生する通信と後に設定するインターネットゲートウェイの橋渡し役
ネームは任意。VPCは先ほど作ったものを指定する。

__作成後__、先ほど作ったサブネットの紐づけを行う
![route-subnet.PNG](https://qiita-image-store.s3.amazonaws.com/0/47896/d55d2119-fb59-d3c2-6f03-1fc167bc5237.png)

ルートの設定も行う
編集から、送信先に__0.0.0.0/0__, __先ほど設定したインターネットゲートウェイ__を選択する
![_route_route.PNG](https://qiita-image-store.s3.amazonaws.com/0/47896/d7c5d168-8d51-cb98-4b10-7c3d318a7401.png)

__この設定行わないとVPC内に通信が入らないし出ていかないので注意__

## EC2

#### ①ec2のコンソールからインスタンスの作成を押す

#### ②AMI, インスタンスタイプは任意のものを選ぶ

私は、ひとまずt2.microを選択

#### ④インスタンスの設定

- ネットワーク → 先ほど作成したVPC
- サブネット → 先ほど作成したサブネット
- 自動割り当てパブリック IP → __有効化(後で設定しなおせないので注意)__

#### ④セキュリティグループ

最低限、sshは設定しましょう

#### ⑤作成押して秘密鍵をDLした後、インスタンスの生成

__この鍵ないとec2の中に入れないので本当に大切に機密に扱うこと__

#### ⑥パブリックIP / DNSが振られているか確認

#### ⑦ログイン

```bash
$ chmod 400 your-ec2-key.pem
$ sudo ssh -i "your-ec2-key.pem" ec2-user@[パブリックDNS] #AMI前提とするとユーザーはec2-user
```

__出るか。。（笑）__

![ec2_welcome.PNG](https://qiita-image-store.s3.amazonaws.com/0/47896/7c341cb6-04a6-0ef7-4382-8b1a8f7e75d0.png)



## 参考
0から始めるAWS入門
http://qiita.com/hiroshik1985/items/9de2dd02c9c2f6911f3b
Docker for Mac の docker-compose up がすごく遅いとき

Docker for Mac で docker-compose up がすごく遅かった時のメモ。
（特定のネットワーク回線を使っている場合のみ？）

# 症状
- docker-compose upで、コンテナ起動がすごく遅い
- docker runだと、すぐコンテナ起動できる
- docker-compose upでも、ネットワークを切っておくと速い(WiFiを切にするなど)

# 解決方法
Macのネットワーク設定で、DNSにGoogle Public DNSを追加する。

```
8.8.8.8
8.8.4.4
```

参考にしたページによると、localunixsocketの名前解決に時間がかかるのが原因？

## 変更手順

※利用環境に合わせて設定する必要があるため、
もし設定方法に不安がある場合は、ネットワークに詳しい方と一緒に変更してください。

メニューバーのりんごマークから「システム環境設定」を開いてから、「ネットワーク」をクリック。

![wifi1.png](https://qiita-image-store.s3.amazonaws.com/0/95528/22748449-a7af-160d-188f-2b39adb6ba8c.png)

変更するネットワーク（例では、Wi-Fi）を選んでから、右下の「詳細」をクリック。

![wifi2.png](https://qiita-image-store.s3.amazonaws.com/0/95528/3223e4bb-2811-cc73-2b80-d4b4e1591a08.png)

DNSを選んで、「+」をクリックしてGoogle Public DNSを追加して、「OK」をクリック。

![wifi3.png](https://qiita-image-store.s3.amazonaws.com/0/95528/d2dc57f6-5d56-7ac4-fd18-0e73dc2eb5a6.png)

最後に「適用」をクリック。

![wifi4.png](https://qiita-image-store.s3.amazonaws.com/0/95528/cda3ecc4-49f0-3c42-90d3-3083d5c2146b.png)

# 参考
- https://github.com/docker/compose/issues/3419

# 環境
- macOS Sierra 10.12.2
- Docker version 1.12.6, build 78d1802
- docker-compose version 1.9.0, build 2585387
nginxをビルドした際の覚書

# 試験環境
* ubuntu 16.04
* gcc 6.3.0

なるべく最新版で一通り揃えたい人向けかも。

# ソース一式を揃える
* zlib-1.2.10
* openssl-1.1.0c
* nginx-1.11.8
* pcre-8.40
* headers-more-nginx-module-0.32

これらを適当な場所に解凍しておく。

# configure
nginxはconfigureするときにソースのライブラリの場所を指定すると自動でビルドしてくれる。
apacheのDSOみたいに*.soを読み込んでるわけじゃないので、ソースからビルドした時は静的リンクされます。
zlibとsslを有効化するときは以下のような感じ。
```
 ./configure
--with-openssl=../openssl-1.1.0c
--add-module=../headers-more-nginx-module
--with-pcre=../pcre-8.40 
--with-zlib=../zlib-1.2.10 
--with-http_ssl_module 
--with-http_v2_module 
--with-select_module
--with-poll_module 
--with-pcre-jit
```
この設定でmake && make install。

# nginx.confを編集
ヘッダを隠したいので以下の設定を追加。
```
server_tokens off;
more_clear_headers Server;
more_clear_headers ETag;
more_clear_headers Content-Type;
more_clear_headers Transfer-Encoding;
more_clear_headers Date;
more_clear_headers Status;
more_clear_headers X-Request-Id;
more_clear_headers X-Runtime;
more_clear_headers X-UA-Compatible;
more_clear_headers Cache-Control;
more_clear_headers Connection;
more_clear_headers Last-Modified;
more_clear_headers Cache-Control;
more_clear_headers Accept-Ranges;
```

# 起動して確認
nginx -tで設定ファイルを確認。おｋだったらnginxで起動しlocalhostを確認。

お疲れ様でした。

# 忘れないようスクリプト書いておく
```bash
#!/bin/bash                                                                                                                                                                                                                                                            
if [ $# -ne 1 ]; then
  echo "input prefix dir without last / like:"
  echo "/home/user/local"
  echo "this must be absolute path"
  exit 1
fi

# download zlib
wget http://zlib.net/zlib-1.2.10.tar.gz
tar zxf zlib-1.2.10.tar.gz
 
# download openssl
wget https://www.openssl.org/source/openssl-1.1.0c.tar.gz
tar zxf openssl-1.1.0c.tar.gz
 
# build nginx
wget http://nginx.org/download/nginx-1.11.8.tar.gz
git clone https://github.com/agentzh/headers-more-nginx-module/
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.40.tar.gz
tar zxf nginx-1.11.8.tar.gz
tar zxf pcre-8.40.tar.gz
cd nginx-1.11.8
./configure --prefix=$1  --with-openssl=../openssl-1.1.0c --add-module=../headers-more-nginx-module/ --with-pcre=../pcre-8.40 --with-zlib=../zlib-1.2.10  --with-http_ssl_module --with-http_v2_module --with-select_module --with-poll_module --with-pcre-jit
make -j32
make -j32 install
cd ../ 
rm -rf nginx-1.11.8* headers-more-nginx-module* pcre-8.40* *zlib-1.2.10* openssl-1.1.0c*

```
月の日数を取得する

dateオブジェクトを使用して簡単に求めることができます。
setDateの仕様で`0`を指定した場合は、前月の末日に設定されます。
この仕様を利用して下記のように求めます。

```js
/**
 * 指定月の日数を取得
 * @param  {number} year  年
 * @param  {number} month 月
 * @return {number} 指定月の日数
 */
const getLastDay = (year, month) => {
    return new Date(year, month, 0).getDate();
};

// 28
const lastDay = getLastDay(2017, 2);
```
cocoapodがおかしくなった時に行うこと

ライブラリーが読み込めない、ビルドに失敗するなど、何かしらcocoapodでおかしなことが起こったときの備忘録を書きます。

```bash
rm -rf ~/Library/Caches/CocoaPods
rm -rf Pods
rm -rf ~/Library/Developer/Xcode/DerivedData
pod install

```

* CocoaPodsのキャッシュを消して
* Podsファイルを消して
* XcodeのDerivedDataを消して
* `pod install`でインストールし直す。
Super Mario Run は Apple のガイドラインに違反しているのであのデザインを参考にしてはいけない

## 目的

　実際にあった話を共有することで、同じように無駄な時間を使う人が減ることを期待しています。

## tl; dr

　通常であればアプリをアンロックするような、永続的に効果を発揮する機能について IAP 機能は非消費型アイテムとして設定されるべきであり、消費型として実装してはならない。

　購入を行った Apple ID で紐付けられているユーザのすべてのデバイスで復元可能としなければならない。


## 概要
　Super Mario Run は、ガイドラインのこの部分に違反しているため、それを真似て実装するとリジェクトされます。

- https://developer.apple.com/app-store/review/guidelines/#in-app-purchase

> Remember to assign the correct purchasability type or your app will be rejected.

　Super Mario Run は IAP 商品に対して正しいプロダクトタイプを設定していません。

　プロダクトタイプについてはこちらを参照します。

- https://support.apple.com/ja-jp/HT202023
- https://developer.apple.com/jp/documentation/StoreKitGuide.pdf

> ● 消耗型（Consumable）プロダクト。アプリケーションの実行に伴って消費されていく項目です。
Voice over IPアプリケーションで通信できる残り分数や、音声の転送など一度限りのサービスが例として挙げられます。

　消費型のコンテンツの例としては以下の通りです。

- 新しい形式で書き出せるファイルのパッケージ
- ゲームの通貨
- ゲームのヒント
- ライフの追加
- 経験値の獲得

> ● 非消耗型（Non-consumable）プロダクト。ユーザのすべてのデバイス上で無制限に使用できる項目です。ユーザのすべてのデバイスで使用可能になります。例としては、書籍やゲームレベルなどのコンテンツ、およびアプリケーションの追加機能などがあります。

> 1 回のみ購入が必要で、それ以降はお使いの Apple ID に関連付けられているほかのデバイスに転送できます。非消費型のコンテンツが消滅した場合、無料で再ダウンロードできる可能性があります。

　非消費型のコンテンツの例としては以下の通りです。

- プロエディションへのアップグレード
- 広告の削除
- ゲームの完全版のロック解除
- 無制限のヒント
- 追加のキャラクター
- 追加のアクセサリ
- ボーナスゲームレベル
- 都市ガイドマップ

　Super Mario Run の場合、アイテムへの支払いによって得られるものはゲームの完全版へのロック解除であるため、本来なら非消費型に該当するべきで、これは本来であれば、その Apple ID で紐付けられているユーザのすべてのデバイスで復元可能とならなければいけません。

　`仮にサーバ側で別のシステムのアカウントを用意していたとしても、永続的に効果のあるものは、非消費型のプロダクトタイプを指定し、その Apple ID で紐付けられているユーザのすべてのデバイスで復元可能とならなければいけません` ……と言う説明をレビューチームから電話で受け、自分のアプリはリジェクトされました。 Super Mario Run は、おそらく何か特別な事情があってそのようなプロダクトタイプの設定が許可されているだけで、通常はあの支払いデザインを真似てアプリを作ることはできません。


　私と同じように、不用意に有名アプリの真似をする人が減ることを祈ります。
Kotlin スクリプト実行 (kscript)

こんにちは。
Kotlin スクリプトファイルを（shebang を付けて）実行させることができる [kscript](https://github.com/holgerbrandl/kscript) というものを見つけました。これの[実体](https://github.com/holgerbrandl/kscript/blob/master/kscript) (https://git.io/vaoNi) はシェルスクリプトです[^1]。（似たものとして [kotlin-scripting-kickstarter](https://github.com/andrewoma/kotlin-scripting-kickstarter) というものもあるようです。）

インストールして動かしてみました。

```console
$ curl -L -o ~/bin/kscript https://git.io/vaoNi && chmod u+x ~/bin/kscript
$ cat hello.kts 
#!/usr/bin/env kscript
println("Hello, World!")
$ ./hello.kts 
Hello, World!
$ unzip -l .hello.76a762.jar 
Archive:  .hello.76a762.jar
  Length     Date   Time    Name
 --------    ----   ----    ----
       55  01-13-17 17:00   META-INF/MANIFEST.MF
      523  01-13-17 17:00   Hello.class
      748  01-13-17 17:00   Main_Hello.class
 --------                   -------
     1326                   3 files
```

なお Kotlin は homebrew 利用でインストールしました。

```console
$ brew install kotlin
$ kotlinc-jvm
Welcome to Kotlin version 1.0.6-release-127 (JRE 1.8.0_102-b14)
Type :help for help, :quit for quit
>>> println("Hello, World!")
Hello, World!
```

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

[^1]: "[c (Compile and execute C "scripts" in one go!)](https://github.com/ryanmjacobs/c)" と同様ですね。
Teensy3.1でDXMを送信する

# Teensy3.1でDXMを送信する

TeensyからDMXを送信するのをやってみる。

# 材料

Teensy 3.1
RS485/RS422トランシーバ SN75176BP
XLRコネクタ 3ピン メス
抵抗 100Ω
DCジャック 2.1mm
ブレッドボード
ジャンパワイヤ

# 回路

![arduino__dmx-sheld_bb.png](https://qiita-image-store.s3.amazonaws.com/0/16283/2d51e39d-65a9-66f6-4249-3586cd89befc.png)

# コード

とりあえずサンプルのまま。

```c
#include <DmxSimple.h>

void setup() {
  DmxSimple.usePin(17);
  DmxSimple.maxChannel(4);
}

void loop() {
  int brightness;
  for (brightness = 0; brightness <= 255; brightness++) {
    DmxSimple.write(1, brightness);
    delay(10);
  }
}
```

# リファレンス

ＲＳ４８５／ＲＳ４２２トランシーバ　ＳＮ７５１７６ＢＰ: 半導体 秋月電子通商 電子部品 ネット通販 http://akizukidenshi.com/catalog/g/gI-07430/

EIA-485 - Wikipedia https://ja.wikipedia.org/wiki/EIA-485

RS-232C/422/485 シリアル通信とは。基礎知識、用語集｜コンテック http://www.contec.co.jp/product/device/serial/basic.html

Arduino Playground - DMXShield http://playground.arduino.cc/DMX/DMXShield

Moonwalkers Lab.の　活動記録　【Arduino】ArduinoでDMX信号を出して照明を制御しちゃう【DMX】 http://moonwalkers.blog20.fc2.com/blog-entry-157.html
【GAS】QUERY関数で補集合を求める

　GASというよりGSS（グーグルスプレッドシート）の話なんですけど【GSS】って書いても？かなと思い、広義のGASということでお願いします。

　いま、たとえば商品の購入実績の履歴がずらーっとあって（集合A）、もう片方にはいま在庫がある商品が並んでいる（集合B）ものとします。そして集合Aから集合Bを取り除いた集合を求める、換言すればB列から在庫なしのものを抽出するということです。

　もっとも集合Bにあるものは必ず集合Aにも存在するという前提がありますので純粋な意味での補集合にはならないですが大目に見て下さい。

　スプレッドシートで表現するとこのような感じでしょうか。F列が抽出結果です。

![スクリーンショット 2017-01-13 23.33.25.png](https://qiita-image-store.s3.amazonaws.com/0/139134/0d813184-de79-4980-c274-843ced5c42cd.png)


　これを1式で実現します。セルF2に入っている式です。

```
=QUERY(QUERY({UNIQUE(B2:C);D2:E},"select Col1,count(Col2) where Col1 != '' group by Col1"),"select Col1 where Col2=1")

// 適当に改行して見やすくすると

=QUERY(
　QUERY(
　　{
　　UNIQUE(B2:C); // #1 
　　D2:E
　　}, // #2
　"select Col1,count(Col2) where Col1 != '' group by Col1"), //#3 カウント
"select Col1 where Col2=1") // #4 カウントが1のものを抽出

```

　長い式なので分解して考えてみます。

\#1 B列をユニークな形に整形します。
　UNIQUE(B2:C)　<font color="blue">＊補足</font>

\#2 D列と和結合します。
　{#1;D2:E}　<font color="blue">＊補足</font>

\#3 果物名でgroup byしてカウントします。
　QUERY(#2,"select Col1,count(Col2) where Col1 != '' group by Col1") <font color="blue">＊補足</font>
　これにより、カウントが２のもの（B列にもあってDれつにもあるということ）は在庫あり、1のもの（B列にしかない）は在庫なしというふうに分けられます。

\#4 あとは#3をQUERYの選択範囲としてカウントが1のものを抽出すれば完成です。
　QUERY(#3,"select Col1 where Col2=1")

　このように<font color="red">QUERY関数の選択範囲はセル範囲を直接選択するだけではなく、他のQUERY関数の実行結果をセル上に出力することなくそのまま選択範囲にすることができる</font>という点に注目して下さい。通常のSQLで言うところのインラインビューに相当することが使えるということです。

　<font color="blue">＊補足</font>
　そしてここの範囲のとり方ですが、一見なぜ果物だけ、つまりB列とD列だけでいいんじゃないのか？C列とE列関係は空列だし関係ないと思われたかもしれません。実は、count()するとき、同じ列を選ぶことが出来ないのです。select Col1, count(Col1) group by Col1といったような形はできないのです。そこで、意図的に他の列を巻き込んでその列をcount()することでうまくいきます。

　それから和結合を使っているのでselect A,B・・・ではなく、select Col1,Col2・・・のようにすべきことも留意してください。

　これが使いこなせるようになるといろいろ応用範囲が広がってくると思います！もちろん、作業列を作ったりして頑張れば同じことはできるんですけど。。。
C言語スタイルのforループで<=を使うときのSwift3への書き換え例

# はじめに
C言語スタイルのforループをSwift3の文法に書き換える方法について。
@codelynx さんがまとめてくださった記事「[Swift 3.0 で C言語スタイルの for ループが廃止されるので、その書き換え方法のまとめ](http://qiita.com/codelynx/items/899c26dd2cbdba7d2b00)」が親切です。
終了条件に<=を使っている場合について、自分が勘違いしないようにメモを残します。

# for var i = 0; i <= end; i += 1

```swift:c-style
for var i = 0; i <= end; i += 1 {
}
```

```swift:Swift3
for i in (0 ..< end + 1) {
}
```

終了条件を<=から<に書き換えるため、**end に1を加えています**。
それだけです。

(追記) @sora0077@github さんがコメントしてくださったclosed range operatorを使った例のほうがより簡潔です。

```swift:Swift3
for i in 0...end {
}
```

# for var i = end ; i >= 0 ; i -= 1

```swift:c-style
for var var i = end ; i >= 0 ; i -= 1 {
}
```

```swift:Swift3
for i in (0 ..< end + 1).reverse() {
}
```

(追記) closed range operatorの例。

```swift:Swift3
for i in (0...end).reverse() {
}
```
gitの操作を取り消す


``` bash:console
git log --oneline

ab2c34b fixes #11
de0820f #11 画像リソース指定方法を、絶対URLからドメイン相対URLに変更。
397eda8 fixes #10
87f5813 #10 URL変更漏れを修正
2173c17 fixes #7

git reset --hard [397eda8]
git log --oneline

397eda8 fixes #10
87f5813 #10 URL変更漏れを修正
2173c17 fixes #7

git push -f
```
CentOS7にTomcat8を構築する方法


## インストール


### yum-fastestmirrorインストール

* yum-fastermirrorインストール
	
	```bash:terminal
	yum -y install yum-fastestmirror
	```

### jdkインストール

* jdkインストール
		
	```bash:terminal
	yum -y install java-1.8.0-openjdk-devel
	```
	
* 確認

	```bash:terminal
	java -version
	
	openjdk version "1.8.0_111"
	OpenJDK Runtime Environment (build 1.8.0_111-b15)
	OpenJDK 64-Bit Server VM (build 25.111-b15, mixed mode)
	```

* パスを通す

	```bash:terminal
	echo "export JAVA_HOME=$(readlink -e $(which java)|sed 's:/bin/java::')" >  /etc/profile.d/java.sh
	echo "PATH=\$PATH:\$JAVA_HOME/bin"                                       >> /etc/profile.d/java.sh
	source /etc/profile.d/java.sh
	```


### tomcat取得&配置

* tomcatユーザー作成

	```bash:terminal
	useradd -s /sbin/nologin tomcat
	```
	
* tomcatダウンロード

	```bash:terminal
	mkdir -p /usr/local/src/tomcat
	cd /usr/local/src/tomcat
	curl -OL http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/tomcat/tomcat-8/v8.5.9/bin/apache-tomcat-8.5.9.tar.gz
	```
	
* tar.gz展開&配置

	```bash:terminal
	tar zxvf apache-tomcat-8.5.9.tar.gz
	mv apache-tomcat-8.5.9 /opt/
	chown -R tomcat. /opt/apache-tomcat-8.5.9
	```

* 今後発生するVupによるパス差分をシンボリックリンクで吸収しておく

	```bash:terminal
	ln -s /opt/apache-tomcat-8.5.9 /opt/tomcat
	```

* パスを通す

	```bash:terminal
	echo 'export CATALINA_HOME=/opt/tomcat'  >  /etc/profile.d/tomcat.sh
	source /etc/profile.d/tomcat.sh
	```
	

## 初期設定 & 起動

* サービス定義ファイルを作成
 
	```bash:terminal
	vi /etc/systemd/system/tomcat.service
	```
	
	```ini:/etc/systemd/system/tomcat.service
	[Unit]
	Description=Apache Tomcat 8
	After=syslog.target network.target
	
	[Service]
	User=tomcat
	Group=tomcat
	Type=oneshot
	PIDFile=/opt/tomcat/tomcat.pid
	RemainAfterExit=yes
	
	ExecStart=/opt/tomcat/bin/startup.sh
	ExecStop=/opt/tomcat/bin/shutdown.sh
	ExecReStart=/opt/tomcat/bin/shutdown.sh;/opt/tomcat/bin/startup.sh
	
	[Install]
	WantedBy=multi-user.target
	```

* 権限付与

	```bash:terminal
	chmod 755 /etc/systemd/system/tomcat.service
	```
	
* 起動

	```bash:terminal
	systemctl start tomcat
	```
	
## 確認

* ブラウザで「http://ipaddress:8080」アクセス
	* Apache Tomcat/8.5.9 の画面が表示されればOK。

	![Kobito.fBsd5c.png](https://qiita-image-store.s3.amazonaws.com/0/102123/fdb5ed6d-c7e4-ab27-5a9a-33e373760611.png "Kobito.fBsd5c.png")
	
* つながらないとき…
	* firewallなどで止められているかも…

		```bash:terminal
		service firewalld stop
		```
git: Djangoでlocal_settings.pyを.gitignoreに入れておく理由

Djangoでプロジェクトを入れていたら`.gitignore`に以下を指定するように記載されていた。

```
venv_ryugakuotaku
__pycache__
staticfiles
local_settings.py
db.sqlite3
*.py[co]
```

ところで`local_settings.py`を含める理由が何なのか疑問に思ったので調べてみることに。

結論から言うと「ローカルデータベース上でのコンフリクトを防ぐため」ではないかという結論に至りました。

詳しく言うと、djangoではローカルデータベースを`local_settings.py`で管理しています。ローカルでデータベースは作業している人によって形状が異なることがあるのでその点を考慮しているのではないかという結論に至りました。

また以下のSOFでの質問: 

>every time we merge branches on GitHub, we get merge conflicts with our database file. 

という問題への解答が

>Add your database file to .gitignore. Then you can keep it in its current location, but it will not be under version control.

だったことからも以上の結論が推測されます。

#参考にしたリンク
- <a href="http://stackoverflow.com/questions/14665695/git-merge-conflicts-with-our-database-file-multiple-developers" target="_blank">git merge conflicts with our database file (multiple developers)</a>
Stanfordの授業CS231nでニューラルネット、畳み込みニューラルネットを学ぶ

[StanfordのCS231n](http://cs231n.stanford.edu/)という授業の教材を使って、機械学習を学んだ。
自分のメモのまとめ。
（写経に近いので注意）

ちなみにこのCS231nは「ゼロから作るDeepLearning」という本の元ネタのよう。

### Module 1: Neural Networks

* [Image Classification: Data-driven Approach, k-Nearest Neighbor, train/val/test splits](http://yusuke-ujitoko.hatenablog.com/entry/2017/01/02/181808)
    * L1/L2 distances, hyperparameter search, cross-validation
* [Linear classification: Support Vector Machine, Softmax](http://yusuke-ujitoko.hatenablog.com/entry/2017/01/04/205622)
    * parameteric approach, bias trick, hinge loss, cross-entropy loss, L2 regularization, web demo
* [Optimization: Stochastic Gradient Descent](http://yusuke-ujitoko.hatenablog.com/entry/2017/01/05/214805)
    * optimization landscapes, local search, learning rate, analytic/numerical gradient
* [Backpropagation, Intuitions](http://yusuke-ujitoko.hatenablog.com/entry/2017/01/08/154237)
    * chain rule interpretation, real-valued circuits, patterns in gradient flow
* [Neural Networks Part 1: Setting up the Architecture](http://yusuke-ujitoko.hatenablog.com/entry/2017/01/09/114740)
    * model of a biological neuron, activation functions, neural net architecture, representational power
* [Neural Networks Part 2: Setting up the Data and the Loss](http://yusuke-ujitoko.hatenablog.com/entry/2017/01/09/221530)
    * preprocessing, weight initialization, batch normalization, regularization (L2/dropout), loss functions
* [Neural Networks Part 3: Learning and Evaluation](http://yusuke-ujitoko.hatenablog.com/entry/2017/01/10/235433)
    * gradient checks, sanity checks, babysitting the learning process, momentum (+nesterov), second-order methods,   Adagrad/RMSprop, hyperparameter optimization, model ensembles
* [Putting it together: Minimal Neural Network Case Study](http://yusuke-ujitoko.hatenablog.com/entry/2017/01/11/213849) 
    * minimal 2D toy data example

### Module 2: Convolutional Neural Networks（更新予定）
* Convolutional Neural Networks: Architectures, Convolution / Pooling Layers
    * layers, spatial arrangement, layer patterns, layer sizing patterns, AlexNet/ZFNet/VGGNet case studies, computational considerations
* Understanding and Visualizing Convolutional Neural Networks
    * tSNE embeddings, deconvnets, data gradients, fooling ConvNets, human comparisons
* Transfer Learning and Fine-tuning Convolutional Neural Networks
ゼロから作るDeep Learningのメモまとめ

ゼロから作るDeep Learningを読んだ。
その読書メモのまとめ。

* [1章 Python入門](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/25/155824)
* [2章 パーセプトロン](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/25/163053)
* [3章 ニューラルネットワーク](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/25/232555)
* [4章 ニューラルネットワークの学習](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/27/195809)
* [5章 誤差逆伝播法](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/28/155150)
* [6章 学習に関するテクニック](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/29/133729)
* [7章 畳み込みニューラルネットワーク](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/29/192635)
* [8章 ディープラーニング](http://yusuke-ujitoko.hatenablog.com/entry/2016/12/29/212540)

この本では、Deep Learningの理論が非常にわかりやすく噛み砕かれていて、
はじめてDeep Learningに触れる読者にとっては、最初の一冊に最適だと思う。
pythonコードを作りながら学ぶというコンセプトもいい。

ただ、あまりにも説明が流暢で、かつ提供されるpythonコードもあまりにも洗練されすぎていて、
深く考える必要なく読破できてしまうため、他の同レベルの本を読んだ時に、
「あれ、これ知ってるけど、なんだっけ...」といった状態になってしまった。

オススメはこの本で、Deep Learningの概要を掴んだら、
別の本で概念の確認をしてみることだと思っている。
tmuxでGNU screenのようにwindowの中身のpaneを入れ替える試み#1

GNU screenのwindowは本物のwindow（窓）で、中身を入れ替えられるのですが、tmuxのwindowはwindowというよりはpaneを貼り付ける掲示板のようなもので、画面1と2を並べて、その後画面1と3を並べたい、というような使い方をするのが難しいです。link-windowのような、link-paneがあると良いのですけどね。

ということで、swap-paneを使って強引にGNU screenのようにpaneの中身を入れ替えて使う事を試みてみました。以下のようなkey bindを用います。

``.tmux.conf``

```
bind u \
  run-shell "tmux swap-pane -t :`tmux showenv TM_#{pane_id}|sed s/[^=]*=//`" \;\
  command-prompt -p window: 'run-shell "tmux setenv TM_#{pane_id} '%%'"; \
  run-shell "tmux swap-pane -t :`tmux showenv TM_#{pane_id}|sed s/[^=]*=//`"'
```

`<prefix> u` と打つと、 `window:` というプロンプトが出るので、
自分以外のwindow番号もしくは <#window>.<#pane> のような形式でもってきたいpaneを指定します。そうすると現在のpaneと指定のpaneが入れ替わり、
入れ替えた先のpane識別子が `TM_#{pane_id}` 環境変数に保存されます。
さらに他のpaneと入れ変えようとすると、直前の入れ替えをもとに戻してから入れ替えを行います。

GNU screen の `<prefix>+number` に近い挙動になっているかなと思いますが、制限として、同じpaneを別々のpaneから入れ変えようとすると問題が生じます。
MySQLデータのエクスポートとインポート(phpMyAdmin)

まず初めにインポートとエクスポートについて意味があやふな方は下記URLをご覧になってみてください。
[インポートとエクスポートとは](http://www.pc-master.jp/words/import.html)



##MySQLのエクスポート
まずはエクスポートしたいDBの所まで移動してください。画像のtop部分を見ると今いる位置が確認できるはずです。(今回私はqiita_testというテーブルをエクスポートしてみます<img width="963" alt="スクリーンショット 2017-01-10 18.59.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/132753/6a747fa3-252d-4e6a-05a4-1df940b9ee2d.png">
。）
<img width="1038" alt="スクリーンショット 2017-01-10 16.51.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/132753/7608fd2f-6a3e-4b1b-83c9-f843bf97dbb5.png">
選択したらエクスポートをクリックしてください。クリックしたら下記ようなページに遷移するので設定をしていきます。

<img width="470" alt="スクリーンショット 2017-01-10 17.00.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/132753/7d5c17b1-6dfc-b306-b2f3-f1419f9529a7.png">

詳細ボタンにチェックをするとエクスポートされるテーブルが表示されるので、エクスポートしたい情報だけ選択してみてください。

フォーマットについてはオプションが数種類ありますが、今回はデフォルト通りSQLを選択します。

出力のオプションでは、エクスポートした結果をファイルで保存するか、ブラウザの画面上に表示するかを指定することができるので今回はファイルで保存する形式で行いました。
<img width="920" alt="スクリーンショット 2017-01-10 18.53.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/132753/c8871a9e-21f7-b56d-3431-c882177de562.png">


最後に設定に問題がなければ一番下にある実行ボタンをクリックします。

クリックすると選択したDBがエクスポートされダウンロードされます。ファイル名はデフォルト設定でlocalhost.sqlとなっているはずです。ご確認ください。

ではダウンロードしたファイルを確認してみましょう。
省略はしておりますがこのように記述されておりエクスポートしたかった情報が記載されていればエクスポートの完成です。
<img width="516" alt="スクリーンショット 2017-01-10 19.01.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/132753/df4ac252-8efb-eb68-8b0c-4808392387b9.png">



##MySQLのインポート
では次はインポートをしてみます。先ほど作ったqiita_testテーブルをインポートしたいので一度削除します。<img width="963" alt="スクリーンショット 2017-01-10 18.59.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/132753/113109b7-b5ca-c95a-ba5b-34311f3e1bb9.png">

削除が終わったらインポートをしてみましょう。インポートをクリックしたら下記のようなページに遷移するはずです。
<img width="1005" alt="スクリーンショット 2017-01-10 19.05.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/132753/32befea7-e997-2beb-d683-dca964efb05c.png">

ではまずインポートするファイルを選択します。ファイルを選択するボタンをクリックし先程エクスポートしたファイルを選択してください。
<img width="542" alt="スクリーンショット 2017-01-10 19.00.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/132753/52e2e7e1-e4d8-a252-ee7b-0fd4df035f76.png">

選択が完了したら一番下にある実行ボタンをクリックしてください。
無事にデータが復元していればインポートの成功です。
以上簡単にphpMyAdminで行うインポートとエクスポートについてまとめました。

何か間違いがありましたら修正したいのでコメントください。宜しくお願い致します。
laradockで簡単laravel環境構築

  
## 1 dockerのインストール

dockerのホームページにアクセス
https://docs.docker.com/docker-for-mac/

'Get Docker for Mac [stable]' をクリック
ダウンロードしたものをインストールすれば勝手に入ってくれる
  
  

    
## 2 laradockの準備
  
  
### laradockのインストール
  
terminalを開く
  
・使用したいディレクトリでプロジェクトディレクトリを作り、そこに移動
` $ mkdir laravelWork`

`$ cd laravelWork`

  
・laradockをダウンロードする

`$ git clone https://github.com/LaraDock/laradock.git`

  
・ダウンロードして出来たlaradockディレクトリに移動

`$ cd laradock`
  
  
  
  
### workspaceにて初期設定
  
・workspaceを立ち上げる
`$ docker-compose up -d workspace`
  
・workspaceに入る
`$ docker exec -it laradock_workspace_1 bash`

・composerが遅いので、hirak/prestissimoを入れる(※1)
`$ composer global require hirak/prestissimo`

    
    
    
・laravelのプロジェクトを作る

`$ composer create-project laravel/laravel laravelWork`
<br>
>※もしLaravel5.1等、環境が限られている場合は

>`$ composer create-project laravel/laravel laravelWork  "5.1.*"`

<br>
  
・workspaceから出る

`$ exit`


### docker-compose.ymlの変更
　　
・dockerを停止させる

`$ docker-compose stop`

　　
・docker-compose.ymlを変更する

`$ vi docker-compose.yml`  
  
まずはルートディレクトリを以下に変更する。

```yml:laradock/docker-compose.yml
# docker-composer.yml
### Laravel Application Code Container ######################

    application:
        build: ./application
        volumes:
-            - ../laravelWork:/var/www/laravel
### Databases Data Container ################################
```
  
次にapache2のポートを変更する

```yml:laradock/docker-compose.yml
### Apache Server Container #################################

    apache2:
        build:
            context: ./apache2
            args:
                - PHP_SOCKET=php-fpm:9000
        volumes_from:
            - applications
        volumes:
            - ./logs/apache2:/var/log/apache2
        ports:
            - "8000:80"
            - "443:443"
        links:
            - php-fpm

### HHVM Container ##########################################
```
   
      
        

    
    
## 3 laradockの起動とブラウザ確認
　　
・dockerを立ち上げる

`$ docker-compose up -d php-fpm apache2 mysql`    
    
    
・以下にアクセスし、表示を確認する。
http://localhost:8000/
  
indexページが表示されれば完了。
____
###引用

※１
hirak/prestissimo
https://github.com/hirak/prestissimo
pyenvでpythonインストール時にエラーが出たときの対処法


## 環境
- macOS Sierra 10.12.2

## 症状
pyenvでpythonをインストールしようとしたところ、以下のようなエラーが出て失敗した。

```
$ pyenv install 2.7.xx

Installing Python-2.7.xx...

ERROR: The Python zlib extension was not compiled. Missing the zlib?

Please consult to the Wiki page to fix the problem.
https://github.com/yyuu/pyenv/wiki/Common-build-problems

BUILD FAILED
```

## 対処法

メッセージに書かれているページによると、以下のように入力すれば良いらしい。

```
$ CFLAGS="-I$(xcrun --show-sdk-path)/usr/include" pyenv install -v 2.7.xx
```

これで治らなかった場合は、XCode command line toolsの再インストールをしろと書かれている。

```
$ xcode-select --install
```
【検証】Google Tag Manager（GTM）でカスタムJavascriptグローバル変数を定義すると挙動がおかしくなる件

#【検証】Google Tag Manager（GTM）でカスタムJavascriptグローバル変数を定義すると挙動がおかしくなる件
Google Tag Managerの「変数」→カスタムJavascriptでローカル変数を定義すると挙動がおかしくなるので、メモがてら下記に記載します。
（※本件、下記挙動の理由や対処方法がわかる方がいらっしゃいましたら、ご教示いただけますと幸いです。。）

----------------------------------------------------------------------------
【検証方法】
①GTMの「変数」→「カスタムJavascript」で以下のスクリプトのグローバル変数を定義
```
function() {
  window.itemIdMap = {};
  try{
    window.itemIdMap = {
      test1:'1'
    };
  }catch (e) {
  }
  return;
}
```

②変数を登録したら、[プレビュー]でグローバル変数（itemIdMap）の存在を確認

③ ②の後、[公開]をしてサイドグローバル変数（itemIdMap）の存在を確認

【検証結果】
　・[プレビュー]時：GTMで定義したitemIdMapの存在を対象ページ上で確認
　・[公開]時：GTMで定義したitemIdMapの存在を対象ページ上で確認できず

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

上記から、GTMのカスタムJavascriptでグローバル変数の定義、利用は避けたほうが良さそうです。

ちなみに、上記事象に関して要因や対処法など情報がわかる方がいらっしゃいましたら、
コメントでご教示いただけますと幸いです。。。
S3 maniacs


# Sample bucket policies
## receive by ses
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSESPuts-1554483843511",
            "Effect": "Allow",
            "Principal": {
                "Service": "ses.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::your-s3-bucket/*",
            "Condition": {
                "StringEquals": {
                    "aws:Referer": "your_account_id"
                }
            }
        }
    ]
}
```

# Bucket ACL
Bucket Owner = AWS account @ this bucket.

# Object ACL
ACL per S3 objects.
No IAM User.
To set ACL for other aws account, use `CanonicalID`

## CannonicailID is ...

```json:
{
    "Owner": {
        "DisplayName": "aaaaaaa",
        "ID": "aebdafahfojdsaojfodsaofhsoajfdsajofhoqjfdsafhvhajofuf89fdsa8fu9d"
    },
    "Grants": [
        {
            "Grantee": {
                "Type": "CanonicalUser",
                "DisplayName": "aaaaaaaa",
                "ID": "aebdafahfojdsaojfodsaofhsoajfdsajofhoqjfdsafhvhajofuf89fdsa8fu9d"
            },
            "Permission": "READ"
        },

```
## Inherit upper Object ACL
`cloudberry exproler` support it.

# Bucket Policy

## I upload some files, but my Bucket Policy n/a! why?
Bucket Polices effects only when

`Object Owner = Bucket Owner`

So, upload s3 object via cross-aws-account (not switch role) is n/a bucket policy. Due to them owner is not bucket owner but cross-aws-account.

## Way to change s3 object owner
Just one Copy! 
But we can change ACL via `put-object-acl` .

# X account (not switch role)
1. bucket policies supports  `principal: iam/user` but ___DOES NOT___ iam/group
2. ___DOES NOT___ Inherit upper object/bucket ACL (via cloudberry)

## Permit specific API calls
AWS Account A had bcuket 'b'
AWS Account B created IAM user 'imaoka'

bucket 'b' allo AWS Account B via bucket policy (or bucket ACL).
When imaoka have read_only s3 @ AWS Account B, cannot put object to bucket 'b'  



# IAM
【Java】Aizu Online Judgeの小噺2

#小噺1は
↓ここ↓
http://qiita.com/66zaha_9su/items/1fd46b7f23501ce03b45
です。

#本題
1日前に書いた
小噺1のコメントありがとうございます。

コメントからアイデアを出してもらったおかげで、
自分なりの解法を出しました。
![希望のかけら.png](https://qiita-image-store.s3.amazonaws.com/0/139300/60e2b409-935b-df8a-dca0-c44181c0666c.png)

余事象みたいな考え方でこぎつけました。
uWSGIのクイックスタートでつまづいたとき

uWSGI + NGINX + python + centOS7で環境構築を行っていた時につまづいたのでメモ。

### uWSGIのクイックスタートでアクセスできない

まずは[uWSGI本家サイト](http://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html)に記載のクイックスタートをやってみた。
手順は以下の通り

#### インストール

```
$pip install uwsgi
```

#### サンプルファイルを作成
とりあえずホームディレクトリに作成

```python:/home/vagrant/foovar.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"]
```

#### uWSGIの起動

```
$uwsgi --http :9090 --wsgi-file foovar.py
```

#### アクセス

```
http://192.168.33.10:9090
```


これでいけるはず・・・だったが。


アクセスできない。



「　このサイトにアクセスできません　」








なぜだ。




接続拒否される。




クイックスタートで失敗するなんて。。。

ポートを指定せずにpingを飛ばすと返ってくるのに。




結局以下の通りに解決しました。



```
$sudo /sbin/iptables -I INPUT 5 -p tcp --dport 9090 -j ACCEPT
```


9090のポートが空いてなかったのですね(笑)


ググっても同じ事象に陥っているひとは見つからず・・・。
これで丸1日を無駄にしましたw



以上！！！
Sphinxのインストールから、外部テーマ(Bootswatch)利用までの解説

本稿ではPythonモジュール"Sphinx"に関する

- インストール方法
- プロジェクト作成方法
- 標準テーマ変更方法
- 外部テーマ(Bootswatch)変更方法

について解説します。

Sphinxに関する詳しい解説などは以下サイトを御覧ください。
[Sphinx日本ユーザー協会](http://sphinx-users.jp/index.html)

# 使用環境
- Mac OSX El Capitan
- Python3.5.1
- VirtualEnv

今回は仮想環境を作成しインストールしていますが、
この手順は各自の仮想環境モジュールをご使用いただくか、こだわりがなければ不要です。

# インストール方法
任意の場所に仮想環境を作成し、起動します。

```
$ mkdir Sphinx
$ virtualenv --no-site-packages Sphinx
$ cd Sphinx
$ source bin/activate
(Sphinx)$ 
```

続いて、Sphinxモジュールをpipを用いてインストールします。

```
(Sphinx)$ pip install sphinx
```

ここまでで、Sphinxのインストールは完了です。

# プロジェクト作成
任意の場所にプロジェクト専用のフォルダを作成し、
その中でsphinx-quickstartコマンドを実行します。

```
(Sphinx)$ mkdir MyProject
(Sphinx)$ cd MyProject
(Sphinx)$ sphinx-quickstart
```

コマンド実行すると、あらゆるオプションに関して質問されますが、基本Enterキーを押しておけば問題ありませんが、

- ProjectName
- Author Name
- Version

の3つのみ入力必須項目となっていますので、適切に入力してください。
1項目言語設定がありますが、日本語にする場合はjaと入力し続行してください。

プロジェクト作成完了後

```
(Sphinx)$ make html
```

を実行すると、カレントディレクトリの_build/html内にHTMLが生成されます。
_build/html/index.htmlをブラウザで表示すると、ドキュメントが生成されていることがわかります。

# 標準テーマの変更
テーマ変更に関する設定は、プロジェクトフォルダ(今回はMyProject)内にある
conf.pyで行います。

```py3:conf.py
html_theme = 'default'
```

の文字列部分を変更することで標準テーマを変更することができます。

変更後は忘れずに

```
(Sphinx)$ make html
```

を行いましょう。

標準テーマは以下の9つがあります。

- default
- basic
- sphinxdoc
- scrolls
- agogo
- nature
- pyramid
- haiku
- traditional
- epub

使用できる標準テーマイメージは以下サイトに掲載されています。
[標準テーマ集](http://sphinx-users.jp/cookbook/changetheme/)

# 外部テーマの使用
Sphinxでは、外部テーマを使用することも可能です。
今回はBootswatchテーマを使用して解説します。
[Bootswatch](http://bootswatch.com/)

・ Bootswatchのインストール
引き続き仮想環境内で作業します。

```
(Sphinx)$ pip install shpinx_bootstrap_theme
```

・ BootswatchテーマのSphinxへの設定
これについても、プロジェクトフォルダ内のconf.pyで設定します。

まずはじめに、conf.pyの先頭行でモジュールをインポートします。
コメントはつけないよう気をつけてください。

```py3:conf.py
import sphinx_bootstrap_theme
```

引き続き、テーマの保存されているディレクトリ
及びテーマ名を設定します。

```py3:conf.py
html_theme = 'bootstrap'
html_theme_path = ['../lib/python3.5/site-packages/sphinx_bootstrap_theme']
```

~~Bootwatch公式ドキュメンテーションではhtml_theme_pathの設定に専用の関数が用意されているとの記載がありましたが、私の環境ではエラーが出たため、モジュールへの相対パスで記載しています~~

---------------------------------------
**追記:yuntas様ご指摘** 
conf.py の以下コメントアウトを解除すれば解決するようです。

```py3:conf.py
import os
import sys
sys.path.insert(0, os.path.abspath('.'))

...

html_theme_path = sphinx_bootstrap_theme.get_html_theme_path()
```

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

次に、どのBootwatchテーマを使用するかを先程のコードの真下に指定します。
テーマの種類についてはこちらを参照ください。
[Bootswatch](http://bootswatch.com/)

```py3:conf.py
html_theme_options = {'bootswatch_theme': "cosmo"}
```

こちらも変更後は忘れずに

```
(Sphinx)$ make html
```

を行いましょう。

以上で、外部テーマの設定が終了しました。
rmagickのインストールにハマった


## tl;dr
* rmagickを `bundle install` しようとしてエラー
* imagemagicのバージョン制限があった
* Homebrewで過去バージョンのimagemagickをインストールして解決できた

## 環境
* Macbook Pro 2016 Mid
* MacOS Sierra (10.12.2)
* ruby

    ```shell
    $ ruby -v
    ruby 2.3.2p217 (2016-11-15 revision 56796) [x86_64-darwin16]
    ```

## ハマリポイント

* ずっと出続けていたエラーは以下

   ```
   Can't install RMagick 2.16.0. Can't find MagickWand.h.
   *** extconf.rb failed ***
   ```

* 同じような解決策が色んな所で見つかるが罠   
	* エラーで調べると、環境変数をゴニョゴニョしているものが多いが全く解決しない
	* ヘッダファイルが読めない→環境変数だろう→色んな人が環境変数で直ったって言ってる！→なんとかなりそう！という感じで無駄な時間を費やす
	* pkg-configとか何度もインストールし直しても駄目

* バージョンが合わないことに全く気づかず
	* rmagickは `2.16.0` でも、imagemagick 7系に対応していない！
	* imagemagickの6系をインストールして解決できた

* HomebrewのFomulaの古いバージョンを入れる方法が、バージョン1から代わった
	* `brew versions` って書いてあるドキュメントは全部使えない


## 解決した方法

* 色んな所を見ながら探していたら、Googleの検索結果に、以下の情報を発見

>	RMagick 2.16.0 の時点では ImageMagick 7 系に未対応であり、ImageMagick 6 系を入れる必要がある。
	参考) http://www.ownway.info/Ruby/rmagick/howtoinstall/windows
	
* ということで、brewを操作して過去バージョンのimagemagickをインストールした

	```
	$ cd /usr/local
	$ brew log imagemagick
	ここで表示される適当なバージョンのリポジトリを捜す
	$ cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/
	$ git checkout 6f014f2b7f1f9e618fd5c0ae9c93befea671f8be imagemagick.rb
	$ brew install imagemagick
	```
	参考) http://qiita.com/ShuntaShirai/items/c582c0acebe2dbf03fc3

* あとは、rmagickをインストールするだけ
    
    ```
    gem install rmagick -v '2.16.0'
    ```
macOSにphpbrewにgdをインストールする際、jpegサポートも入れる

こうする。

```shell-session
✗ phpbrew ext install gd -- --with-jpeg-dir=/usr/local/Cellar/jpeg/8d/lib
```

/usr/local/Cellar/jpeg/8d/libには、いつの間にか👇 これが入ってた！

```shell-session
✗ ls -la /usr/local/Cellar/jpeg/8d/lib                                           
total 1816
drwxr-xr-x  5 araiyujiro  admin     170 11 16 12:34 .
drwxr-xr-x  9 araiyujiro  admin     306 11 16 12:34 ..
-r--r--r--  1 araiyujiro  admin  414624 11 16 12:34 libjpeg.8.dylib
-r--r--r--  1 araiyujiro  admin  505168 11 16 12:34 libjpeg.a
lrwxr-xr-x  1 araiyujiro  admin      15 11 16 12:34 libjpeg.dylib -> libjpeg.8.dylib
```

CentOSの時は、こうやった。

```
$ phpbrew --debug ext install gd -- --with-jpeg-dir=/usr/lib64 --with-png-dir=/usr/lib64
```
CakePHP の cake コマンドを Windows バッチで連続で実行する方法

現象
----------------------------------------------------------------------

CakePHP の cake コマンドを複数行書いても最初の一行しか実行されない。

~~~
bin/cake migrations migrate ←これしか実行されない
bin/cake migrations seed --seed UsersSeed
bin/cake migrations seed --seed BookmarksSeed
bin/cake migrations seed --seed TagsSeed
bin/cake migrations seed --seed BookmarksTagsSeed
~~~

原因
----------------------------------------------------------------------

cake.bat の最後に「exit /B %ERRORLEVEL%」が書かれているため、
そこでバッチ処理が終了してしまう。

解決
----------------------------------------------------------------------

バッチの中では「call bin/cake」のように call をつけて実行する。

~~~
call bin/cake migrations migrate
call bin/cake migrations seed --seed UsersSeed
call bin/cake migrations seed --seed BookmarksSeed
call bin/cake migrations seed --seed TagsSeed
call bin/cake migrations seed --seed BookmarksTagsSeed
~~~
td-agent 3.0 for Windows

fluentdがv0.14からWindowsで動くようになりました．それにともない，fluentd v0.14を使うtd-agent 3.0もWindows用のmsiパッケージを提供することにしました！
で，msiパッケージを作ってみたので，興味のある方に試してもらいたく，使い方を書きます．

正式版リリース時には，fluentdの公式ドキュメントにもちゃんとした手順は追加する予定です．これらの手順は管理者権限を持ったアカウントで実行しているのを想定しています．

## インストール

msiパッケージをダウンロードしてクリックすればインストール出来ます．パッケージのURIは以下です．

https://packages.treasuredata.com/3/windows/td-agent-3.0.0-0-x64-beta1.msi

beta1とついている通り，まだbetaです．今後いくつか変更予定がありますが，それは最後に書きます．

## Fluentdを動かす

### プロンプトを起動する

msiパッケージをインストールすると，`Td-agent Command Prompt`というのも一緒にインストールされます．

<img width="255" alt="td_prompt.png" src="https://qiita-image-store.s3.amazonaws.com/0/566/76a871f7-88ab-f3ba-e9f3-fd44ccc33a38.png">

Windows Server 2012だとこんな感じの表示です．これをクリックすると，td-agentのrubyとかにPATHが入った状態でプロンプトが起動します．

### 設定ファイルとログのディレクトリを用意する

まだスクリプトの修正が完全ではなく，td-agent.confとかを勝手に作らないので，ここは現状自前で用意する必要があります．

- C:/opt/td-agent/conf/td-agent.conf

テスト用なので`in_forward`と`out_stdout`を使ってみます．

```
<source>
  @type forward
</source>

<match test.**>
  @type stdout
</match>
```

### fluentdコマンドで動かす


プロンプトが起動したら`C:/opt/td-agent`に最初からいるので，以下のコマンドでfluentdを起動させます．

```
> fluentd -c conf\td-agent.conf
```

これでfluentdが起動するはずです．

### fluent-catで動作確認

新しくTd-agent promptを立ち上げ，以下のコマンドを入力すれば，fluentd側で受け取れているのが確認できます．

```
> echo {"message":"hello"} | fluent-cat test.event
```

スクリーンショットだけ貼っておきますが，`in_tail`も基本的な動作は確認しています．

<img width="1259" alt="tail_windows.png" src="https://qiita-image-store.s3.amazonaws.com/0/566/c2b35f05-efff-9a7e-4953-c9ad2afb716c.png">

## Fluentdをサービスとして登録する

手順は下記の記事と同じ流れになります．

[fluentd Windows版をWindowsサービスとして動かす](http://qiita.com/okahashi117/items/9b55418e770f1f5ce4b7)

### fluentdをサービスとして登録する

Td-agent promptから以下のコマンドを入力します

```
> fluentd --reg-winsvc i
```

そうすると，サービスとして`Fluentd Windows Service`が登録されます．これは管理ツールから確認出来ます．

### fluentdの起動オプションを設定する

プロンプト上で以下のコマンドを入力してください

```
> fluentd --reg-winsvc-fluentdopt '-c C:/opt/td-agent/conf/td-agent.conf -o C:/opt/td-agent/log/td-agent.log
```

ログディレクトリは現状インストール時に自動で作られないので，`C:/opt/td-agent/log`を作ってから実行してください．

また，トラブルを回避するため，fluentdのオプションで指定するパスは`\`区切りではなく，`/`区切りで指定してください．これはfluentdの設定ファイル内のファイルパスも同じです．

### Fluentd Windows Serviceからfluentdを起動する

Fluentd Windows Serviceのプロパティを開き，`Start`を押せば走るようになります．上記の記事にスクリーンショットがあるので，そちらも参考にしてみてください．

これらが基本的な操作になります．また，Td-agent promptから`fluent-gem`を使えば，プラグインもインストール可能です．

## 今後のタスク

いくつか追加・変更が入る予定です

- Rubyを2.4にする．現状ruby 2.4に対応していないgemを回避するため2.3.3を使っていますが，正式版の時には2.4.0にする予定です．
- ヘルパーとなるスクリプト群を用意する．上記のサービス登録やオプション追加などを一発でやるスクリプトを入れます．
- Windowsのイベントログを集めるプラグインを同梱する．[okahashiさんが作ってくれたプラグインがある](https://github.com/okahashi117/fluent-plugin-winevtlog)ので，これを叩き台にしてmsiパッケージに同梱しようと思ってます．必要な機能など，イベントログ周りに詳しい人に色々と教えてもらいたいです．

以上です．是非試してフィードバックを貰えると嬉しいです．また，Linux/Mac向けのtd-agent 3.0.0もすぐリリースします．その時にもまた変更点など記事を書く予定です．
Cousera の機械学習講座から深層学習までの知識の溝について

# Coursera の講座について

[Coursera の講座](https://www.coursera.org/learn/machine-learning/)については、いろいろなかたが絶賛しているので、機械学習をこれから勉強しようとか、少しかじったけどもっと網羅的に理解したいとかという人には最適です。僕も最近、一通り終えました。

(参考) レビューなどはこちら
[機械学習をゼロから1ヵ月間勉強し続けた結果](http://qiita.com/junichiro/items/3457e33e502086a200f1)

# 深層学習へ

それから、分類の問題(二値ではなく多値)にもう少し踏み込もうと考え、TensorFlow を触ってみたり、深層学習の本を読んだりしています。

* [多分もっともわかりやすいTensorFlow 入門 (Introduction)](http://qiita.com/junichiro/items/8886f3976fc20f73335f)
* [Deep MNIST for Experts &nbsp;|&nbsp; TensorFlow](https://www.tensorflow.org/versions/master/tutorials/mnist/pros/)
* [深層学習 (機械学習プロフェッショナルシリーズ)](http://amzn.to/2gK0Uk1)

前述の講座のおかげで、理解がはやく、ものすごいさくさく勉強が進むのですが、2点ほどその講座では触れられていなかったことがありましたので、ここにまとめておきたいと思います。

# 正規化 / 正則化

まず、正則化についてです。講座では英語だったので regularization と呼ばれ(書かれ)ていましたが、日本語訳は正規化となっていました。日本語の書籍を読むと、正則化という訳をあてるほうが多いようでした。

それから、正則化はこれ！というような紹介のされかたをしていましたが、講座で紹介されていたのは数ある正則化手段のうちのたったひとつであるということがわかりました。

講座で解説されていた正則化はいわゆる「重み減衰」と呼ばれる方法です。

$$ + \frac{ \lambda }{ 2m }\sum_{ j = 1 }^{ n }\theta_j^2 $$

このような「自身の重み」に比例してペナルティを課す(減衰させる)方法です。
正則化にはこれのほかにも、重みを減衰させるのではなく、大きな重みは上限を設ける「重み上限」の方法などがあります。

$$ \sum_{ j = 1 }^{ n }\theta_j^2 < c $$

例えばこれを満たさなかったら、$ \theta $ に1未満の数字を掛けるという手法です。そして現在では「重み減衰」より「重み上限」のほうが上回る効果があるという報告もあるようです。(前述の書籍「深層学習」より)

# 活性化関数

講座ではニューラルネットワークの活性化関数に、sigmoid 関数を使っていました。

```math
h_\theta(x) = \frac{ 1 }{ 1 + e^{ -\theta^T x } }
```

活性化関数にsigmoid を使った場合の誤差関数

```math
J(\theta) = -\frac{1}{m} \Bigl[\sum_{i=1}^m y^{(i)}\log h_\theta(x^{(i)}) + (1 - y^{(i)})\log(1 - h_\theta(x^{(i)}))\Bigr]
```

こちらも数ある活性化関数のうちのひとつです。特に、sigmoid は二値分類で使うものですが、講座では多値分類でもそのままsigmoid を使っていました。しかし、多値分類ではソフトマックス関数というものを使う方が一般的かつ、精度もよいようです。TensorFlow のチュートリアルで、MNIST の手書き文字認識をするときはソフトマックス関数を使っていました。下記の記事で、そのチュートリアルの活性化関数部分を、ソフトマックス関数を使う場合とsigmoid 関数を使う場合とを比較しています。

* [多分もっともわかりやすいTensorFlow 入門 (Introduction)](http://qiita.com/junichiro/items/8886f3976fc20f73335f)
ある程度イテレーション数を増やして調整すると、結果はあまり変わりませんでしたが、若干ソフトマックス関数のほうが収束がはやい、もしくは着地の精度がよいように感じました。)

ソフトマックス関数の中身も少し紹介しておきます。

```math
h_\theta(x) = \frac{ e^{ \theta^Tx } }{ \sum_{ j = 1 }^{ K }e^{ \theta^Tx } }
```

(数学的に厳密ではありませんが、イメージはこういう形です)

ニューラルネットワークの活性化関数は「あるユニットはそのユニットへの入力すべてに依存」していましたが、ソフトマックス関数は少し特殊で「当該ユニットへの入力だけでなく、そのレイヤーへの全ての入力」に依存します(分母部分)。

そしてその場合の誤差関数は下記のようになります。

```math
J(\theta) = -\sum_{i=1}^m\sum_{j=1}^k y_j^{(i)}\log h_\theta(x_j^{(i)})
```


これは交差エントロピー(cross entropy)と呼ばれます。TensorFlow のチュートリアルではこれらを使っています。

# リファレンス

いずれも下記の書籍に詳細が載っているのでおすすめです。
[深層学習 (機械学習プロフェッショナルシリーズ)](http://amzn.to/2gK0Uk1)
Windows7のDocker Toolboxでdocker-compose up のエラー対応メモ

# Windows7のDocker Toolboxでdocker-compose up のエラー対応メモ

Docker超初級者です。
`docker-compose up`を実行した際にエラーに遭遇しましたので共有させていただきます。

Docker Quickstart Terminal上で操作しています。

## 環境

* Windows 7
* Docker Toolbox (1.12.6)
    * Docker version 1.12.6, build 78d1802
    * docker-compose version 1.9.0, build 2585387

## エラー内容

```sh
$ docker-compose up
Creating mt6_mysql_mt6_1

ERROR: for mysql_mt6  Cannot create container for service mysql: Invalid bind mount spec "C:\\Users\\tom\\Projects\\mt6\\db\\mysql:/var/lib/mysql:rw": Invalid volume specification: 'C:\\Users\\tom\\Projects\\mt6\\db\\mysql:/var/lib/mysql:rw'
ERROR: Encountered errors while bringing up the project.
```

ファイルパスの指定方法が間違っており、ファイルのマウントが出来ないようです。

`C:\\Users\\tom\\Projects\\mt6\\db\\mysql:/var/lib/mysql:rw`

パスがWindowsの形式になっていますね。


```yaml:docker-compose.yaml抜粋
    volumes:
      - ./db/mysql:/var/lib/mysql
```

volumesの設定は相対パス。


## 原因と対策

### 原因
最新版のdocker-compose(1.9.0)にはBreaking Changeがあり、WindowsでDocker Toolboxを使っている場合、今まで自動でWindowsパスを変換（C:\Users →  /c/Users）してくれていたが、1.9.0からはデフォルトで無効となったとのこと。

[参考　→　github.com/docker/compose/releases/tag/1.9.0](https://github.com/docker/compose/releases/tag/1.9.0)

### 対策
環境変数に`COMPOSE_CONVERT_WINDOWS_PATHS=1`を設定することでWindows形式のファイルのパスを変換するようになります。

```shell-session
$ COMPOSE_CONVERT_WINDOWS_PATHS=1 docker-compose up
```

私の環境ではこれでうまくいきました。

---
以上です。