OmniAICreator/Qiita-1.07M huggingface dataset:
Amazonの商品ページURLフォーマットに関するメモ

Amazonの商品ページURLをASINをもとにして作っていたらURLのフォーマットが何パターンかあったのが気になったので調査した。

## 利用可能なフォーマット
「B00TEY2W72」は商品のASIN番号

1. https://www.amazon.co.jp/gp/product/B00TEY2W72/
    - 2016/10時点での正式なURLフォーマット。特に理由がなければこれを使うべきか
2. https://www.amazon.co.jp/exec/obidos/ASIN/B00TEY2W72/
    - 2007年以前(正式な年月日不明)のフォーマット。一応Amazon側が互換を持たせているので普通に動作するが、あえて使う理由はなさそう
3. https://www.amazon.co.jp/o/ASIN/B00TEY2W72/
    - 2の短縮版フォーマット
4. https://www.amazon.co.jp/dp/B00TEY2W72/
    - Google等の検索エンジンからの流入用URLのフォーマット

また、どのフォーマットでも任意の文字列をURL中に挟むことが出来る。（挟める場所は異なる）
https://www.amazon.co.jp/あああああ/dp/B00TEY2W72/
https://www.amazon.co.jp/gp/product/B00TEY2W72/ああああああ/

## アフィリエイトリンクの場合

アフィリエイト用のトラッキングIDを付けたい場合は、GETパラメータとして「tag=トラッキングID」を付けてやればよい。
これは上記すべてのフォーマットで有効。
https://www.amazon.co.jp/gp/product/B00TEY2W72/?tag=トラッキングID

その他、どんなリンクが有効なのかは[リンクの動作確認ツール](https://affiliate.amazon.co.jp/gp/associates/network/tools/link-checker/main.html)で確認出来る。

## 参考
Aiming-Amazon
https://www.amazon.co.jp/Aiming-Amazon-Publishing-Marketing-Amazon-com/dp/093849743X
http://www.newselfpublishing.com/AmazonLinking.html
[JAWS-UG CLI] CodeCommit #3 サンプルコードの更新

CodeCommit上のリポジトリを更新してみます。


前提条件
========


CodeCommitリポジトリへのSSHアクセス権限
---------------------------------------

CodeCommit上のリポジトリにSSHでアクセスする権限があること。


unixコマンド
------------

- curlコマンドが利用できること。
- unzipコマンドが利用できること。


0. 準備
=======


ローカルリポジトリへの移動
--------------------------

```bash:コマンド:
cd ~/tmp/${CODEC_REPOSITORY_NAME} \
  && pwd
```


1. 事前作業
===========




2. リポジトリへの登録
=====================

```bash:コマンド:
cat << EOF > index.html
<!DOCTYPE html>
<html>
<head>
        <title>Updated Sample Deployment</title>
        <style>
          body {
            color: #000000;
            background-color: #CCFFCC;
            font-family: Arial, sans-serif;
            font-size:14px;
          }

          h1 {
            font-size: 250%;
            font-weight: normal;
            margin-bottom: 0;
          }

          h2 {
            font-size: 175%;
            font-weight: normal;
            margin-bottom: 0;
          }
        </style>
      </head>
      <body>
        <div align="center"><h1>Updated Sample Deployment</h1></div>
        <div align="center"><h2>This application was updated using AWS CodePipeline, AWS CodeCommit, and AWS CodeDeploy.</h2></div>
        <div align="center">
          <p>Learn more:</p>
          <p><a href="http://docs.aws.amazon.com/codepipeline/latest/userguide/">AWS CodePipeline User Guide</a></p>
          <p><a href="http://docs.aws.amazon.com/codecommit/latest/userguide/">AWS CodeCommit User Guide</a></p>
          <p><a href="http://docs.aws.amazon.com/codedeploy/latest/userguide/">AWS CodeDeploy User Guide</a></p>
        </div>
</body>
</html>
EOF


cat index.html
```

```bash:コマンド:
git commit -am "Updated sample application files" \
  && git push
```


3. 事後作業
===========

```bash:コマンド:
git log
```

```text:結果(例):
      commit xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
      Author: taro <taro@example.com>
      Date:   Sun Oct 10 13:40:00 2016 +0900

          Added sample application files
```


完了
====
TensFlowの環境設定メモ

TensFlowの環境構築手順メモです

# 手順
- python 3.5.2をインストール(参照したのは、[こちら](http://qiita.com/oct_itmt/items/2d066801a7464a676994)

```
brew update && brew upgrade
brew install pyenv
echo 'export PYENV_ROOT="${HOME}/.pyenv"' >> ~/.bash_profile
echo 'export PATH="${PYENV_ROOT}/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
exec $SHELL -l

pyenv install anaconda3-4.0.0
pyenv global anaconda3-4.0.0

pyenv global anaconda3-4.0.0
pyenv install -l
pyenv install 3.5.2
pyenv global 3.5.2  # 3.5.2を使う
```

これでpython3.5.2をinstall

- TensFlowのinstall
参照するのは[ここ](https://www.tensorflow.org/versions/r0.11/get_started/os_setup.html#anaconda-installation)

```
$ conda create -n tensorflow python=3.5
$ conda install -c conda-forge tensorflow
```

install後の確認。コンソール起動後TensFlowのサンプルを動かしてみます。

```
$ python
>>>import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b))
42

```
[Ruby] Line NotifyでLineにメッセージ送信する手順メモ



※こちらがLineのWeb管理画面からトークン取得までのキャプチャ画像有りの詳細手順です。
文章では分かりづらい場合はこちらも合わせてご参照ください。
[RubyからLine NotifyでLineにメッセージを送るかんたん手順](http://www.meguroman.com/send_msg_with_line_notify_on_ruby/)

## アクセストークンの取得

- Line Web管理画面にログイン

[こちら](https://notify-bot.line.me/my/)から、LineのWeb管理画面にいきます。

- トークン名、トークルームを選択

続いて、Lineへのメッセージ送信の際の通知名や、送信先チャットルーム（トークルーム）を選択します。


## curlで送信テスト

curlでAPIの動作確認します。詳細は[APIドキュメント](https://notify-bot.line.me/static/pdf/line-notify-api_ja.pdf?v=1.0)参照

```bash
$ curl -X POST -H 'Authorization: Bearer KorehaDummyNoTokenIdDayo3kmr5aQjM7kZ4swehzPBY' -F "message=ビルの窓ガラスによく張ってある、「▼」のマークってなんなの？" 'https://notify-api.line.me/api/notify'
{"status":200,"message":"ok"}
```

こんな感じで届きます　→ [スマホに届くメッセージ画面キャプチャ](http://www.meguroman.com/send_msg_with_line_notify_on_ruby/#received_msg)

先程のトークン作成時のトークン名などが結構関わってくるので受信画面のイメージを頭に持っておくのが大事です。




### Rubyで送信スクリプトを作成する

curlをRubyで再現しただけのかんたんスクリプト。トークン文字列だけ入れ替えればどの環境でも動くと思います。


```ruby:send_msg_with_line_Notify.rb
require 'net/http'
require 'uri'

class Line
  TOKEN = "KorehaDummyNoTokenIdDayo3kmr5aQjM7kZ4swehzPBY"
  URI = URI.parse("https://notify-api.line.me/api/notify")

  def make_request(msg)
    request = Net::HTTP::Post.new(URI)
    request["Authorization"] = "Bearer #{TOKEN}"
    request.set_form_data(message: msg)
    request
  end

  def send(msg)
    request = make_request(msg)
    response = Net::HTTP.start(URI.hostname, URI.port, use_ssl: URI.scheme == "https") do |https|
      https.request(request)
    end
  end
end

line = Line.new
msg = ARGV[0]

res = line.send(msg)
puts res.code
puts res.body
```

```bash:実行方法
$ ruby send_msg_with_line_notify.rb 'ビルの窓ガラスによく張ってある、「▼」のマークってなんなの？'
200
{"status":200,"message":"ok"}
```
apt-getで見つからないパッケージを追加する方法(debian, ubuntu両方対応)


## はじめに
apt-get installでパッケージ名を指定してインストールしようとした場合に、デフォルトにリポジトリに登録されておらずインストール出来ない場合がある。
今回はiozone3をインストールする例を使って説明する。

### 検証環境
Debian GNU/Linux 8


## 対象のパッケージがどこのリポジトリにあるか探す

### まずデフォルトのパッケージのリストからインストールを試みる

まずデフォルトのパッケージのリストからインストールを試みてパッケージが見つからないエラーが出ることを確認する

```sh
> apt-get install iozone3
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package iozone3
```

### パッケージがあるリポジトリを探す
パッケージ名を検索ウインドウに入れて調べると、どこのパッケージにあるか教えてくれる。

Debianの場合はこちら
https://www.debian.org/distrib/packages

Ubuntuの場合はこちら
http://packages.ubuntu.com/ja/


Debianのiozone3はnon-freeのリポジトリにある
https://packages.debian.org/jessie/utils/iozone3

以下よりnon-freeリポジトリをリポジトリのリストに追加する手順を説明する

## repositoryを追加する

まず現状のリポジトリのリストを確認する

```sh
> cat /etc/apt/sources.list
deb http://httpredir.debian.org/debian jessie main
deb http://httpredir.debian.org/debian jessie-updates main
deb http://security.debian.org jessie/updates main
```
non-freeがないことを確認

### apt-add-repositoryをインストールする

リポジトリの追加用のapt-add-repositoryパッケージをインストールする

```sh
# apt-add-repositoryがどこにあるかコマンドラインで調べたい場合はapt-fileを使う
> apt-get install apt-file
> apt-file update
> apt-file search apt-add-repository

# apt-add-repositoryは software-properties-commonに含まれているのでまるっとインストールする
> apt-get install -y software-properties-common
```

### non-freeリポジトリを追加する
先程調べたiozone3パッケージのあるnon-freeリポジトリをリポジトリのリストに追加してあげる

```sh
> apt-add-repository non-free
```

リポジトリリストの確認、一番最後の行にnon-freeが追加されていることがわかる

```sh
> cat /etc/apt/sources.list
deb http://httpredir.debian.org/debian jessie main
deb http://httpredir.debian.org/debian jessie-updates main
deb http://security.debian.org jessie/updates main
deb http://http.us.debian.org/debian/ jessie non-free
```

## iozone3のインストール

普通にapt-getでインストール出来ることを確認。

```sh
> apt-get update
> apt-get install -y iozone3
```

インストールできたことをバージョンを表示することで確認する

```sh
> iozone -v
       'Iozone' Filesystem Benchmark Program

        Version $Revision: 3.429 $
	Compiled for 64 bit mode.

       Original Author: William Norcott (wnorcott@us.oracle.com)
               4 Dunlap Drive
               Nashua, NH 03060

       Enhancements: Don Capps (capps@iozone.org)
        	  7417 Crenshaw
        	  Plano, TX 75025

  Copyright 1991, 1992, 1994, 1998, 1999, 2002   William D. Norcott

  License to freely use and distribute this software is hereby granted
  by the author, subject to the condition that this copyright notice
  remains intact.  The author retains the exclusive right to publish
  derivative works based on this work, including, but not limited to,
  revised versions of this work

  Other contributors:

  Don Capps       (Network Appliance)	capps@iozone.org

```
[Git] リポジトリ内の特定のブランチの特定のディレクトリのみcloneする

正確にいえば clone ではないですが、やりたいこととしては同じだと思います。
巨大なリポジトリの中の一部のファイルだけを取得したい場合は以下のようにすれば良いようです

```console:特定のブランチの特定のディレクトリを取得
$ git archive --remote=<repo_url> <branch> <path> | tar xvf -
```

# Githubだとサポートしてない問題

ただ、問題点としてGithubだと `git archive` のリモートでの取得は対応していないようです。(Gitlabだと動作しましたが）
["git archive" and github](http://www.gilesorr.com/blog/git-archive-github.html)

代わりに `svn export` は使えるとの情報はありました。
[git export from github remote repository - Stack Overflow](http://stackoverflow.com/questions/9609835/git-export-from-github-remote-repository)
[GitHubから特定のディレクトリだけを直接ダウンロード - Qiita](http://qiita.com/raucha/items/1219327df8a9ded494df)

```console:例：vimのmasterのtoolsディレクトリを取得
$ svn export https://github.com/vim/vim/branches/master/tools tools
A    tools
A    tools/rename.bat
Exported revision 11703.
```

svn使っちゃうとちょっとあれですが、目的は果たせるということで。

# 備考：sparse-checkoutについて

検索するとsparse-checkoutとかがよく出てきますが、こちらは一度全ファイルをcloneしてるので、巨大なリポジトリの場合は結局一度は時間のかかるcloneを実施してしまってるので違いますね・・・。
２度目以降も、見えている範囲には無いだけで管理対象にはなっているので、別に早くなるわけではなさそうです。

[Gitで他のリポジトリから一部のファイルのみをcloneする方法 - (DxD)∞](http://dxd8.com/archives/223/)
[sparse-checkoutでGitのサブディレクトリだけを自動デプロイする | 株式会社グランフェアズ](http://www.granfairs.com/blog/cto/deploy-subdirectory)

# 参考
[Cloning only a subdirectory with git - Stack Overflow](http://stackoverflow.com/questions/11834386/cloning-only-a-subdirectory-with-git)
[git-archive(1)](https://www.kernel.org/pub/software/scm/git/docs/git-archive.html)
機械学習の理論を理解せずに tensorflow で オセロ AI を作ってみた 〜導入編〜

#シリーズ目次
- 機械学習の理論を理解せずに tensorflow で オセロ AI を作ってみた ～導入編～
- [機械学習の理論を理解せずに tensorflow で オセロ AI を作ってみた ～実装編～](http://qiita.com/sasaco/items/fdb9771c146cb877b183)
- [機械学習の理論を理解せずに tensorflow で オセロ AI を作ってみた ～いざ対戦編～](http://qiita.com/sasaco/items/f9aa608860eebb3026c1)
- [機械学習の理論を理解しようとしてから オセロ AI を作ってみた 〜再始動‼〜](https://qiita.com/sasaco/items/5e102063c256bf56e396)
- [機械学習の理論を理解しようとしてから オセロ AI を作ってみた 〜何これ Alpha Zero 編〜](https://qiita.com/sasaco/items/d249ee3493b5b85c6eb5)
- [機械学習の理論を理解しようと エクセルでニュートラルネットワークを作ってみた 〜画像認識 mnist 編〜](https://qiita.com/sasaco/items/a70ea2940380f7f8e1a1)

この分野では門外漢の私が、「機械学習の理論」をまったく勉強せずに
オセロのAI を作ってみようと思います。
参考にしたサイトはこちら
・ [超シンプルにTensorFlowでDQN (Deep Q Network) を実装してみる 〜導入編〜](http://blog.algolab.jp/post/2016/08/01/tf-dqn-simple-1/)


#概要

構想をざっくり説明しますと
![AI.png](https://qiita-image-store.s3.amazonaws.com/0/142847/f6a691dd-7b92-826a-36ea-fddc08fa9fc4.png)
2体の人工知能がひたすらオセロの対決を行い、
後手のAIを保存し私（人間）と戦う。というわけです。

##環境条件

私の環境は下記の通りです。
OS
・ubuntu
開発環境
・python 3.5

この環境でも動くと思う
[Google Cloud Platform で Ubuntu python 開発環境を構築する](http://qiita.com/sasaco/items/39a0fde71a884e97453e)


#まずは動かしてみよう

はじめにソースコードをダウンロードします。
ソースはここにおいておきます。
[`$ git clone https://github.com/sasaco/tf-dqn-reversi.git`](https://github.com/sasaco/tf-dqn-reversi.git)


##学習

環境が整ったら、ソースコードのディレクトリに移動して、train.pyを叩くと学習が始まります。

```text:
$ cd tf-dqn-reversi
$ python train.py
```

下記のようなログが出ていれば、正しく学習が行われています。

```text:
player:1 | pos:32 | LOSS: 0.0000 | Q_MAX: 0.0041
player:2 | pos:15 | LOSS: 0.0000 | Q_MAX: 0.0009
…
layer:2 is only pos:56
player:2 | pos:56 | LOSS: 0.0000 | Q_MAX: 0.8607
EPOCH: 999/999 | WIN: player2 
winner is player2
```

>
※LOSS がほとんど 0 なんですけど問題ないのでしょうか[.](http://ja.stackoverflow.com/questions/30312/tensorflow%e3%81%a7dqn-%e3%81%aa%e3%81%9c%e3%81%8bq%e6%9c%80%e5%a4%a7%e5%80%a4%e3%81%8c%e5%b0%8f%e3%81%95%e3%81%84)
LOSS が何であるかすら 理解していません （￣＾￣）
どなたか詳しい方、ご教示をお願いいたします。
m(_ _)m
実装は、[実装編](http://qiita.com/sasaco/items/fdb9771c146cb877b183)をご覧ください。



##テスト

学習が終わるのに数時間掛かります。
では学習したモデルでテストしてみましょう。

```text:
$ python FightWithAI.py

------------- GAME START ---------------
*** userターン○ ***
  0  1  2  3  4  5  6  7
  8  9 10 11 12 13 14 15
 16 17 18 19 20 21 22 23
 24 25 26 ○ ● 29 30 31
 32 33 34 ● ○ 37 38 39
 40 41 42 43 44 45 46 47
 48 49 50 51 52 53 54 55
 56 57 58 59 60 61 62 63
番号を入力してください
[43, 34, 29, 20]

>>>
```

上記のようにゲームが開始されればば成功です。
きちんと動作しましたでしょうか？
対戦結果は[～いざ対戦編～](http://qiita.com/sasaco/items/f9aa608860eebb3026c1)に書きます。

[次回](http://qiita.com/sasaco/items/fdb9771c146cb877b183)は、実装編についてお届けします。
AWS SDK for RubyでALBを操作する


2016/08に新しいELBである、ALB(Application Load Banalcer)が発表されましたので、そちらをRubyで操作してみます。

## ドキュメント

http://docs.aws.amazon.com/sdkforruby/api/Aws/ElasticLoadBalancingV2/Client.html

## gemのインストール

sdk 2.5.3で対応されたようなので、それ以上のバージョンを入れましょう。

```
gem 'aws-sdk', '~> 2.5.3'
```

## ELB Clietnの生成

ALBは、Aws::ElasticLoadBalancingV2::Clientクラスを利用して操作します。

```
access_key =  "XXXXXXXXXXXXXXXXXXXXX"
secret_key =  "XXXXXXXXXXXXXXXXXXXXX"

credentials = Aws::Credentials.new(access_key, secret_key)

region = 'ap-northeast-1'

alb_cleint = Aws::ElasticLoadBalancingV2::Client.new(
        :credentials => credentials,
        :region => region
)
```

## ターゲットグループへのインスタンス追加・削除

ALBでは「ターゲットグループ」という新しい概念が登場しているため、インスタンスの取り外しをする場合はALBではなく、ターゲットグループに対して操作します。

```
target_group_arns = "arn:aws:elasticloadbalancing:ap-northeast-1:12345678:targetgroup/elb-xxxxxx/123456"

instance_id ="i-123456"

     alb_cleint.register_targets({
        target_group_arn: target_group_arns,
        targets: [
          {
             id: instance_id,
          },
        ],
      })


    alb_cleint.deregister_targets({
        target_group_arn: target_group_arns,
        targets: [
          {
            id: instance_id,
          },
        ],
    })
```
Bluemix経由で直接、Compose.ioのPostgreSQLやMongoDBなどOSSデータベースが利用可能になったので試してみた

Compose.ioというIBMが買収したサービスで、OSSデータベースのクラスタ環境がたった数クリック/数分で手に入る♪というのを、前に書いたのですが、BluemixからログインしてるくせにComposeのアカウントも作らなきゃいけないという面倒な仕様でした。

**PostgreSQL**
http://qiita.com/azzeten/items/c1e72b3fe3cb9421e3ba
http://qiita.com/azzeten/items/a7a786701cf25ef1a087

**MongoDB**
http://qiita.com/azzeten/items/2e3901c080aafed078eb


**ですが!!!**
こないだから、Bluemixのアカウントから直接、OSSデータベースの環境がデプロイできるようになりました。Composeのアカウントを作らずに手続きが完了します。

![スクリーンショット 2016-10-09 18.02.09.png](https://qiita-image-store.s3.amazonaws.com/0/119378/53f32d1e-1463-7345-4650-796b92a4304d.png)


**なお、バックアップやプラグインを追加するあのWEB UIはまだ使えないようです**
現在できるのは、単純にDBに接続してデータ入れて、操作すること。
テスト開発環境などで試験的に**とにかく環境が欲しい！というときに、ぱぱっと使うのは良い**かもしれません。

接続情報等はここで確認。
![スクリーンショット 2016-10-09 18.02.58.png](https://qiita-image-store.s3.amazonaws.com/0/119378/ebe0d93a-6b03-4847-09ad-05081256df41.png)

ためにしpsqlから接続もして、ちゃんと使えること確認済みです

![スクリーンショット 2016-09-27 10.14.06.png](https://qiita-image-store.s3.amazonaws.com/0/119378/76591083-c158-4983-7584-c4ade9616de2.png)

〜11月22日更新〜
現時点ではWEB UIは使えないよって話がcompose社のHPに書いてあったのでメモ。
https://help.compose.com/docs/bluemix-compose-support
ILSVRCとは何か？



ILSVRCは2010年から始まった大規模画像認識の競技会です。
現在は参加しているチームの殆どがDeep Learningを使用しており、
画像認識Deep Learningの大きな競技会と言えます。


## ILSVRCとDeep Learning
2012年のILSVRCでHinton先生のチームがDeep Learningで圧勝し、注目を浴びました。
（コンマ何%の精度を競い、人力での細かいチューニングの勝負となると思われていましたが、Task1とTask2で2位以下を10%以上引き離して勝利しました。）

Deep Learningで圧倒的に勝利したことで、画像認識の方向性を決定づけたものと言えます。


## 画像認識の今後
2015年にはILSVRCの結果で人間の認識性能を超えました。
これは、画像関連の事象について、人間が識別困難なものでも認識可能ということを意味し、例えば、将来的に医学診断で人間よりも効果のある診断ができることを意味していると考えられます。

これは様々な応用が可能であり、今後よりDeep Learningが重要となっていることを意味しています。


## ILSVRC2016
ILSVRC2016の内容を幾つか説明します。
詳細は以下を参照ください。
http://image-net.org/challenges/LSVRC/2016/


  
### 位置特定(Object localization:LOC)
画像がどこに写っているか？
学習データ：120万画像　1000カテゴリ
テストデータ：15万画像　1000カテゴリ


画像に複数の物体があり、その画像には場所とラベルが設定されており、その中の1つが正解として設定されている。
回答者は5個回答ができ、正解と合っていればよい。
以下であれば、Steel drumが正解として設定されており、回答の5個の中に場所とラベルがあっているものが含まれていれば良い。
（Drumではなく、Steel drumと回答することが求められており、1000カテゴリの分類と位置特定の両方が必要となる）



![ILSVRC2013_12_7_13_pptx.png](https://qiita-image-store.s3.amazonaws.com/0/118618/7b6f634c-9032-5b2e-a774-fa079eb1470a.png "ILSVRC2013_12_7_13_pptx.png")

（イメージ元　[http://www.image-net.org/challenges/LSVRC/2013/slides/ILSVRC2013_12_7_13_clsloc.pdf](http://www.image-net.org/challenges/LSVRC/2013/slides/ILSVRC2013_12_7_13_clsloc.pdf)）

2016年はTrimps-Doushen（中国公安局）というチームが勝利しています。

### 物体検出(Object detection:DET)
画像に何が写っているか？
200個のカテゴリーの内、何個のカテゴリーを検出できるかを競う

以下がサンプルです。

![image-net_org_challenges_LSVRC_2014_ui_det_html.png](https://qiita-image-store.s3.amazonaws.com/0/118618/93ca6a37-b893-176e-9869-1477a1c0536e.png "image-net_org_challenges_LSVRC_2014_ui_det_html.png")
（イメージ元　[http://image-net.org/challenges/LSVRC/2014/ui/det.html](http://image-net.org/challenges/LSVRC/2014/ui/det.html)）

2016年はCUImageというチームが勝利しています。


間違っているところがありましたら連絡をお願い致します。
船舶自動識別装置 AISデータをデコードする時の考え方


AISデータを扱うことになった方に向けて、基本的なAISの仕様についてとデコードの方法について解説していきます。

日本語のソースがほとんどないので、英語ができない学生は困っているはずなのでどうぞ活用してください。

以下の内容は「http://catb.org/gpsd/AIVDM.html」　こちらをほとんど和訳した内容です。
Eric S. Raymondさんありがとうございます。

この投稿でわからない部分は英語がわかる友達に聞きましょう。


AISとは船舶自動識別装置のことです。

典型的なAISの生データは以下のようなものです。

!AIVDM,1,1,,B,177KQJ5000G?tO`K>RA1wUbN0TKH,0*5C


コンマ「,」で区切られた一つ一つに意味があります。

この記事では「177KQJ5000G?tO`K>RA1wUbN0TKH」この部分をデコードする方法について解説していきます。

まずはじめに、デコードやエンコードという言葉が理解できない人のために言葉の解説をします。

エンコードとは、すごく簡単に言ってしまえば「短く簡単にする」ことです。
デコードとは、その逆です。

例：「こんにちは」→エンコードする→「00」
   「00」→デコードする→「こんにちは」

まだしっくり理解ができないかと思います。

野球中継を見たことありますか？

時々、「監督がバッターに向けてジェスチャー（サイン）をする」場面があります。

あれも一種のデコードとエンコードと考えられます。

バッターボックスとベンチは離れてますから、大きな声で指示を出すのは難しいです。
だから、ジェスチャーのサインを送るすんですね。

例えば、「大きく振れ！」のメッセージがサインでは「帽子を触る」だとします。

これは、「大きく振れ！」→エンコード→「帽子を触る」　ということです。

バッターはその逆で、デコードをして「帽子を触る」を「大きく振れ！」と解釈するわけです。


なんとなくわかってきましたか？

では、AISデータの話に戻ります。

AISデータをデコードするというのは、具体的に言い換えれば、

「177KQJ5000G?tO`K>RA1wUbN0TKH」⇦これを人間が読める形にする、ということです。

ここまでの説明で「AISをデコードする」という言葉の意味が理解できましたでしょうか？


それでは、次に「プロトコル」という言葉の説明をします。


プロトコルとはデコードとエンコードをする時のルールです。

意味わかんないですね。

また例を用いて説明します。

先ほど、二つの例を出しましたね。

「こんにちは」→「00」
「大きく振れ！」→「帽子を触る」


みなさん、もし誰かからメールが来て、そこに「00」とたった一言書いてあったら、どう思いますか？

びっくりしますよね。

「いや、あれは”こんにちは”って意味なんだよ」

と後で友達に説明されても「知らねーよ」ってなります。


野球でも同じことが起こります。

あるチームの監督が、別のチームの選手に向けて「帽子を触る」動作をしても意味が理解できません。

「なんか、やけにあの人帽子触るなぁ」

で終わりです。



メッセージを送る側と、受け取る側でルールがないと、意味が理解できませんよね？
このルールのことを情報技術(IT)ではプロトコル、と呼ぶのです。

AISにも当然プロトコルがあります。

それが次の表です。

難解な表に見えますが、びっくりしないでください。とても簡単です。

![image](https://qiita-image-store.s3.amazonaws.com/0/143882/425dd5ea-1980-4c52-6c16-d601c159404e.png)


この表の見方は簡単です。演習形式で理解していきましょう。

問1「表の1列目から”m”を探して、その右隣三つ目の二進法表示を教えてください」

小学生のおつかいくらい簡単です。

表を見て、「m」を探してください。
そしたら、その右隣三つめの0と1で表された数字を答えてください。


答えは「110101」です。

できましたか？

すごい！

実はここまでで、AISデコーディングの半分が終わっているのです！


今あなたがやったことを、AISデータの全ての文字に適用すれば、「AISデータを二進法表示する」ことに成功しているのです。

つまり、
「177KQJ5000G?tO`K>RA1wUbN0TKH」⇦これを一文字ずつ0と1に変えていけばいいのです。
↑この文字は２８文字あるので、二進数表示にすると28*6で168桁の二進数表示の数値になります。


しかし、まだこれでは人間が読んで理解出来る形ではないです。

もう一つの表が必要です。

それが次の表です。

![image](https://qiita-image-store.s3.amazonaws.com/0/143882/f475d4b1-3715-0600-699f-7ad50a7f1650.png)

表の使い方を説明します。

①168文字の二進数を左から順番に６個取り出します。
②これを１０進数に変換します（わからない人は「２進数　１０進数　変換」で検索）
③その数値がメッセージタイプを表しています。

表の使い方が理解できましたか？

表をみてください。

「Field」は二進数の桁（インデックス）を表しています。
その桁が表す情報を説明しているのが「Description」です。
例えば、61-88は経度の情報を表しているのです。
（ただし、これは分表示で10000を掛けられたものなので、度表示にするなら60*10000で割る）

表に従って１６８文字から０１を取り出して、１０進数に変換して必要ならまた別の処置を施して人間のわかる形にデコードをしてあげてください。


以上がAISのでコーディングの仕方でした。
エクセルでデコードをするのが楽ですよ。
macでphp開発環境構築


ruby、pythonと同様にphpもバージョンを切り替える必要性は高いはずなので、

## phpenvのインストール

phpenvのメジャーなリポジトリが2種類あって、両方ともそれほど更新が無いのだけど、枯れてるからなのか・・・
https://github.com/phpenv/phpenv
https://github.com/CHH/phpenv
前者の方が本元っぽいが、後者の方がまだ更新されているので、後者を選択。


インストールスクリプトphpenv-install.shを実行

```bash
curl -L https://raw.github.com/CHH/phpenv/master/bin/phpenv-install.sh | bash
```


インストールしたら、下記のように~/.bashrcに設定してねと言われる。

```
export PATH="/Users/名前/.phpenv/bin:$PATH"
eval "$(phpenv init -)"

Add above line at the end of your ~/.bashrc and restart your shell to use phpenv.
```

zshなら~/.zshrcに記載。
あと、

```
export PATH="/Users/名前/.phpenv/bin:$PATH"
eval "$(phpenv init -)"
```

より

```
export PATH="~/.phpenv/bin:$PATH"
eval "$(phpenv init -)"
```

の方が汎用的でdotfileをいろんな環境で使いまわす上でよい。

設定を読み込む

```bash
source ~/.bashrc
```

phpを複数バージョン使えるようになるプラグインphp-buildをインストール

```bash
git clone git://github.com/php-build/php-build.git ~/.phpenv/plugins/php-build
```

とか書いていたのだけど、下記ですべていいようにやってくれるっぽい。インストール後だったからか自分の環境では失敗したけど。
https://github.com/php-build/php-build より

```bash
curl -L http://git.io/phpenv-installer | bash
```

## phpのインストール

### phpに必要なライブラリをインストール

```bash
brew install libevent libjpeg libpng mcrypt libtool openssl autoconf libxml2 lemon re2c
```

インストール可能なphpバージョン一覧

```bash
phpenv install -l
```

特定のphpのインストール

```bash
phpenv install 7.0.9
```

下記のようなエラーが出るので、対処

```
/var/tmp/php-build/source/7.0.9/ext/openssl/openssl.c:44:10: fatal error: 'openssl/evp.h' file not found
```

下記のようにopensslとlibxmlを指定してインストールしないと駄目ぽい。面倒。。

```bash
PHP_BUILD_CONFIGURE_OPTS="--with-openssl=$(brew --prefix openssl) --with-libxml-dir=$(brew --prefix libxml2)" PHP_BUILD_EXTRA_MAKE_ARGUMENTS=-j4 phpenv install 7.0.9
```

インストールされたことを確認

```
% phpenv global 7.0.9                                                                                                                                  [13:26:30]
% phpenv versions                                                                                                                                      [13:26:42]
  system
* 7.0.9 (set by ~/.phpenv/version)
% php -v
PHP 7.0.9 (cli) (built: Oct 10 2016 13:23:25) ( NTS )
```
Raspbian(Jessie)でカーネルドライバ開発環境を構築する

カーネルビルドをしないでドライバ開発環境を構築する方法です。

#事前準備
bcをインストールしておく必要があります。
```
sudo apt-get install bc
```

#rpi-sourceの取得と実行
linuxのソースコードを取得します。rpi-sourceを使用するとカーネルモジュールのビルド環境の構築が楽です。
```
git clone git://github.com/notro/rpi-source
cd rpi-source
chmod +x rpi-source
./rpi-source
```

しばらくまてば完了です。
/home/piにこの様なファイルができました。
```
linux-2d31cd571e6f2ac61a3eda273d973058e1bb1f58.tar.gz
linux -> /home/pi/linux-2d31cd571e6f2ac61a3eda273d973058e1bb1f58
linux-2d31cd571e6f2ac61a3eda273d973058e1bb1f58
```

/lib/modulesにもリンクが作成されています。

```
pi@raspberrypi ~ $ uname -r
4.4.21-v7+
pi@raspberrypi ~ $ ls -l /lib/modules/4.4.21-v7+/
合計 1728
lrwxrwxrwx  1 root root     14 10月 10 12:06 build -> /home/pi/linux
drwxr-xr-x 11 root root   4096  1月  1  1970 kernel
-rw-r--r--  1 root root 449612  9月 22 17:08 modules.alias
-rw-r--r--  1 root root 467274  9月 22 17:08 modules.alias.bin
-rw-r--r--  1 root root   4574  9月 22 17:08 modules.builtin
-rw-r--r--  1 root root   6025  9月 22 17:08 modules.builtin.bin
-rw-r--r--  1 root root 143060  9月 22 17:08 modules.dep
-rw-r--r--  1 root root 209277  9月 22 17:08 modules.dep.bin
-rw-r--r--  1 root root    302  9月 22 17:08 modules.devname
-rw-r--r--  1 root root  58463  9月 22 17:08 modules.order
-rw-r--r--  1 root root     55  9月 22 17:08 modules.softdep
-rw-r--r--  1 root root 177294  9月 22 17:08 modules.symbols
-rw-r--r--  1 root root 220585  9月 22 17:08 modules.symbols.bin
lrwxrwxrwx  1 root root     14 10月 10 12:06 source -> /home/pi/linux
```

作成したカーネルモジュールをinsmodしても、エラーは起きませんでした。

#おまけ
自分はカーネルモジュールからSPIやI2Cを使って無線のドライバ開発をしています。
[JAWS-UG CLI] CodeCommit #2 サンプルコードの追加

CodeCommitのリポジトリにコードを追加してみます。


前提条件
========


CodeCommitリポジトリへのSSHアクセス権限
---------------------------------------

CodeCommit上のリポジトリにSSHでアクセスする権限があること。


unixコマンド
------------

- curlコマンドが利用できること。
- unzipコマンドが利用できること。


0. 準備
=======


ローカルリポジトリへの移動
--------------------------

```bash:コマンド:
cd ~/tmp/${CODEC_REPOSITORY_NAME} \
  && pwd
```


1. 事前作業
===========


サンプルコードの取得
--------------------

```bash:変数の設定
FILE_SAMPLE='SampleApp_Linux.zip'
URL_SAMPLE="https://s3.amazonaws.com/aws-codedeploy-us-east-1/samples/latest/${FILE_SAMPLE}"
```

```bash:コマンド:
curl ${URL_SAMPLE} > ${FILE_SAMPLE} \
        && unzip ${FILE_SAMPLE} \
        && rm ${FILE_SAMPLE}
```


2. リポジトリへの登録
=====================

```bash:コマンド:
git add -A
```

結果:

      (戻り値なし)
```

```bash:コマンド:
git commit -m "Added sample application files"
```

```text:結果(例):
      [master (root-commit) fce7ec3] Added sample application files
       7 files changed, 266 insertions(+)
       create mode 100644 LICENSE.txt
       create mode 100644 SampleApp_Linux.zip
       create mode 100644 appspec.yml
       create mode 100644 index.html
       create mode 100644 scripts/install_dependencies
       create mode 100644 scripts/start_server
       create mode 100644 scripts/stop_server
```

```bash:コマンド:
git push
```

```text:結果(例):
      ounting objects: 10, done.
      Delta compression using up to 4 threads.
      Compressing objects: 100% (8/8), done.
      Writing objects: 100% (10/10), 9.95 KiB | 0 bytes/s, done.
      Total 10 (delta 0), reused 0 (delta 0)
      remote:
      To ssh://git-codecommit.us-east-1.amazonaws.com/v1/repos/handson-20161010 * [new branch]      master -> master
```


3. 事後作業
===========

```bash:コマンド:
git log
```

```text:結果(例):
      commit xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
      Author: taro <taro@example.com>
      Date:   Sun Oct 10 13:40:00 2016 +0900

          Added sample application files
```


完了
====
vvvv-PatchboxでVVVVの開発環境を拡張する

# vvvv-Patchbox

vvvv-Patchbox
https://vvvv.org/contribution/vvvv-patchbox

VVVVに便利機能を追加するツールボックス的な感じのContributionsです。
テンプレート機能とかが追加されてだいぶ良い感じに捗ります。

![patchbox.PNG](https://qiita-image-store.s3.amazonaws.com/0/26489/87d319c6-a6dc-367a-f203-f1d3fad11ec0.png)

## 機能一覧
- **Patchlet** テンプレート
- **Operandomatic** 計算系ノード生成
- **IOScaler** IOBoxのリサイズ時にフォントサイズ連動
- **IOType** IOBoxの種別を簡単に変更
- **MagicIO** IOBoxを行列数指定で生成
- **Commander** パッチウィンドウの操作
- **SnapToGrid** ノードの移動・リサイズ時のスナップ

## 導入

Contributionsのdownloadに載っているURLだと1ヶ所バグっているので、修正版をGitHubから持ってきたほうが良いです。

https://github.com/velcrome/vvvv-Patchbox/tree/change_iobox_type
Clone or download から Download ZIP で。

適当なディレクトリに配置したら、 Patchbox (VVVV).v4p を開きます。
そのまま Alt+R のショートカットで root.v4p が開くので、`Patchbox`ノードが追加されていることを確認してください。

![rootv4p.PNG](https://qiita-image-store.s3.amazonaws.com/0/26489/02b2ab44-5e33-49ff-54db-c51065c61ff6.png)

この状態で root.v4p を保存すればVVVV起動時にPatchboxが常にインクルードされた状態になります。
ただし、Patchboxのパッチウィンドウを開いたまま保存すると起動時に毎回開いてしまうので、Hideしてから保存した方が良いです。
Hideはノードを右クリックするか、サブパッチ上でAlt+3。

ちなみに`Patchbox`サブパッチ内で個別の機能がON/OFFできるので、要らない機能は切っておくと良いかも。

## Patchlet (テンプレート)

NodeBrowserから`make <テンプレート名>`でパッチにテンプレートを展開できます。
テンプレートは予めPatchletディレクトリにv4pファイルを入れておく必要があります。

![patchlet.gif](https://qiita-image-store.s3.amazonaws.com/0/26489/f1528e80-9e44-5bd2-8fb0-36999f3553ad.gif)

デフォルトではmainloop, tty, render9の3つが用意されています。

## MagicIO (動的IOBox生成)

`col3`、`io5x5`、`toggle4x7` といった型と行列数でIOBoxを生成できます。
対応している型は io, int, bang, toggle, press, string, col, enumの8種類。

![iomagic.gif](https://qiita-image-store.s3.amazonaws.com/0/26489/fca9599a-6474-325d-cd9a-a5523808bfc8.gif)


## Operandomatic (計算ノード生成)

計算系ノード(+α)の生成を楽にするための機能です。
`+100`、`*2.5`、`>0.1`のようにシンボル1文字＋数値の入力で、任意の値を設定済みの計算系ノードが作れます。

![operandomatic2.gif](https://qiita-image-store.s3.amazonaws.com/0/26489/a1e3ef54-9dd0-8da7-7b60-57e7db01ca64.gif)

カンマ区切りで値を入力した場合はSpreadを設定してくれます。
対応しているシンボルとノード、指定した値が設定されるピンは次の通り。

|symbol|node|pin|
|:-:|:-:|:-:|
|+|Add (Value)|Input 2|
|-|Subtract (Value)|Input 2|
|*|Multiply (Value)|Input 2|
|/|Divide (Value)|Input 2|
|%|Mod (Value)|Input 2|
|@|GetSlice (Spreads)|Index|
|=|EQ (Value)|Input 2|
|<|LT (Value)|Input 2|
|>|GT (Value)|Input 2|
|i|I (Spreads)|.. To [|

## 内部実装

だいたいこんな感じの流れ。

1. `PatchAlias (VVVV ActivePatch)`ノードで編集中パッチファイルの情報を取得
2. `GetPatch (VVVV)`の`Patch Changes`ピンで編集されたXMLを読み取る
3. 読み取ったXMLを正規表現でパースしたりXMLを生成したりする
4. 生成したXMLを`SetPatch (VVVV)`ノードで設定

もともとVVVV側で開発環境そのものを拡張するためのノードが用意されているみたい。
vvvv-Patchbox自体にもそれをサポートするようなサブパッチが含まれているので、似たようなパッチ作っていろいろ便利機能追加してみても面白そう。
[自分用メモ] Pythonのシーケンス型・マッピング型


- シーケンス型
    - リスト
    - タプル
- マッピング型
    - 辞書

# シーケンス型
## リスト

```text:リストの定義方法
[value1, value2, value3, ... , valueN]
```
## タプル

```text:タプル
(value1, value2, ..., valueN)
```

## 集合
要素の重複を許さないデータ型

```text: 集合
{要素1, 要素2, 要素3, ..., 要素n}
```
#### 集合の操作

|関数|内容|
|---|---|
|add(要素)|要素を追加|
|remove(要素)|要素を削除|
|clear()|集合を空にする|

#### 集合の演算


|記法|内容|
|---|---|
|set1 ｜ set2 | 和|
|set1 & set2 | 積|
|set1 - set2 | 差|
|set1 ^ set2 | 排他的論理和?|

# マッピング型
## 辞書
所謂連想配列、ハッシュ。


```text:辞書の定義方法
{
     key1 : value1,
     key2 : value2,
     ...
     keyN : valueN
}
```
typescriptで書いているときにsinonでpromiseのstubを返したい時にハマったこと


# 前提
- typescriptで開発中
- promiseを返すメソッドについてstubを使いたい
- テストは mocha, chai

# 問題
- sinon-stub-promise を npm install, typings install したが、sinon-stub-promise を visual studio code が認識しない

# 解決
- dt から sinon の型定義を install した
    - npm にある type と dt にある type が異なっていた
    - 解決前は npm にある type が install されていた
- ↓に書いてあった解決をそのまま適用しただけ
    - http://stackoverflow.com/questions/38770726/augmenting-a-typescript-module
ownCloudの導入と保存先変更など

#概要

昨日の運動会で腰から下が痛いので、[ownCloud](http://owncloud.jp/)を以前紹介した[Raspberry Pi + USBメモリ4本（RAID10）](http://qiita.com/wakisuke/items/16fee0e5604b3dafa355)へ導入しました。

もう座るのも痛いので、あれこれ調べず、
Qiitaで見つけた記事を手本にownCloudを導入して、ちょろっとググって保存先を変更しましたというだけの記事です。

#ownCloudインストール

ownCloudのインストールは下記Qiitaの記事で苦労せずに導入できます。

[ownCloud + Raspberry Pi で Google Drive代替 storage を 構築してみる](http://qiita.com/hidenorly/items/8bca74a4da5969f68e53)

ただ一点だけ、、、[#初期設定](http://qiita.com/hidenorly/items/8bca74a4da5969f68e53#owncloud%E3%81%AE%E5%88%9D%E6%9C%9F%E8%A8%AD%E5%AE%9A)の部分でoccってなんだろうと思ったんですが、これはsetupOwncloud.shのocpathのディレクトリにあるフォルダのことです。
そのため、下記のよな感じになると思います。

```bash
$ cd /var/www/owncloud #上記setupOwncloud.shのocpath
$ sudo -u www-data php occ  maintenance:install --database "mysql" --database-name "owncloud" --database-user "root" --database-pass "mysqlのroot password" --admin-user "admin" --admin-pass "ownCloudのadminのパスワード"
```

#ownCloudの保存先変更

ownCloudの設定ファイルは下記になります。

```bash
root@raspberrypi:~# vi /var/www/owncloud/config/config.php
```

設定項目の内、 **datadirectory** が保存先の部分になるので、指定のパスを入力して保存します。

ディレクトリの所有者をapacheのアカウントとなるwww-dataにする必要があります。

```bash
root@raspberrypi:/media/usb_001# chown -R www-data:www-data ownCloud/
root@raspberrypi:/media/usb_001# ls -l
total 4
drwxrwx--- 4 www-data www-data 4096 Oct 10 11:19 ownCloud
```


このとき、もしすでにownCloudにアクセスして初期設定などを済ましてしまっている場合はMySQL等ですでに設定データが生成された状態です。
後々不都合起こる可能性があるので、初期状態フラグを立てて、再度設定データを生成するほうがいいかと思います。

初期値フラグは上記設定ファイルの **installed** にfalseを入力しておくと初期状態として扱われます。
（MySQLにはowncloudのデータベースがあるので、予めdrop databaseしておくといいと思います。

この設定でownCloudのアカウントのディレクトリは **datadirectory** のパスに保存されます。
Linuxとかでは /home の扱いという感じです。

#サーバ側でファイルを直接変更した場合

普通にファイルを追加してもownCloud側には反映されません。
その場合はoccのコマンドを叩く必要があります。

例えばファイルを追加した場合は、下記を実行すれば再読込が行われ、ownCloud上で認識されます。

```bash
root@raspberrypi:sudo -u www-data php /var/www/owncloud/occ files:scan [ownCloudのユーザ]
```

詳しくは[Using the occ Command](https://doc.owncloud.org/server/9.0/admin_manual/configuration_server/occ_command.html#file-operations)に書いてあります。
ファイルの更新等については[File Operations](https://doc.owncloud.org/server/9.0/admin_manual/configuration_server/occ_command.html#file-operations-label)
Mac起動時にVagrantを自動で立ち上げる


# 概要
Mac起動後、ターミナルを立ち上げて`vagrant up`コマンドを毎回打ち込んでいたので自動化の手順をまとめておきます。

同様にVagrantのsambaを自動でマウントするバッチファイル、gitで使う秘密鍵を自動でkeychainに登録するバッチファイルも合わせて作って登録しておくとより便利になります。

# 手順

## Vagrantを起動するためのバッチファイルを作る

- 下記のファイルを好きな場所に作ります（パスなどは適宜変えてください）

```text:vagrant_up.command
cd ~/vagrant/centos/
vagrant up
```

- 実行できるようにするためパーミッションを変更する（パスなどは適宜変えてください）

```text
chmod 700 ~/commands/vagrant_up.command 
```

## 自動起動の設定を行う

- 「左上のリンゴマーク->システム環境設定->ユーザとグループ」で「ログイン項目」タブに切り替える
- 「＋」ボタンを押して先ほどの「vagrant_up.command」を追加する
有限ステートマシンで遊ぼう　その2

はい、<a href="有限ステートマシンで遊ぼう　その１" target="_blank">前回</a>の続き。
下書きのままで邪魔なのでこのまま公開することにする。


前回のものからUI周りをわかりやすく修正し、幾つか処理を追加してみました。
カセットは前と同じ5つまま、
・探索
・睡眠
・食べる
・片付け
・リラックス

追加した機能的には
・前はログだけでわけわからなかったのでグラフィックを入れました
・あゆめぐの数を3匹にしてみました。今後キャラ同士のやりとりもできたらいいなと。
・探索できるエリアに川を追加しました。
・また、アイテムの種類を追加し、効果などのパラメータもつけてみました。肉は60 魚は50 木の実は20お腹回復)
・エリアでドロップされるものが違います
・持って帰ってきたものを家に収納し、家でご飯を食べる際は収納されたものを食べるようにしました
(それにより場合により食べ物が家にも所持品にもない場合、終了します。今後その時に餌がないのをしっていて、お腹空いたのを無視して探す等処理、フラグ等追加する必要がありますが・・・。)
・天気の概念をいれていました。まだ処理は未実装です。

<img src="http://ayumegu.daa.jp/img/Qiita/Project6.gif">

ここに、外部からの刺激(イベント)を受け取るようにしたいと思っています。
天気が変わると、それを監視しているエリアや外にいるあゆめぐ達に通知が行きます。
川であれば次のターンから増水し、アイテムが取れない、などの対応をいれようかと。
また、雨のあとの森は数ターンドロップ率が上がるなど・・・。
また、家に帰った時に他のあゆめぐがいるときはただいま->おかえりのやりとりなどできたらいいなと。

Dispatcher周りを作ろうと思ったらちょうどアセットがあったのでEvent System - Dispatcherこれを使います
<a href="http://qiita.com/ayumegu/items/e9acc40ee514c269ad8d" target="_blank">UnityでDispatcherで通知してみる(Event System - Dispatcher)</a>

勉強を兼ねたものなのでゲーム性などないですが。
GitLab CE on Dockerをアップデートする方法とエラーの対応

GitLab CEをDockerを使って構築している場合のアップデート方法です。8.8.5から8.12.4にアップデートした際にいくつかエラーが出たので、それの対応も書いておきます。

# アップデートの方法

コンテナ内でapt-getを叩くことで自動的にデータベースのバックアップをしてくれつつアップデートしてくれます。ただし、後述の通りエラーがでて動かなくなることもあるので、かならず自らバックアップとリストアのテストをしっかりした後に行ってください。

```
docker exec -it [コンテナ名] apt-get update
docker exec -it [コンテナ名] apt-get install gitlab-ce
```

何も問題なければ以下の操作でバージョンアップが反映されます。

```
docker exec -it [コンテナ名] gitlab-ctl restart
```

## アップデート中のRubyのエラー

```
================================================================================
Error executing action `run` on resource 'ruby_block[directory resource: /data/GitLab/repositories]'
================================================================================
以下だらだらと続く
```
対応方法は以下の通りです。

```
docker exec -it [コンテナ名] chmod 2770 /var/opt/gitlab/git-data/repositories
```

この後に再度アップデートを行えば問題なく完了しました。

参考）
https://gitlab.com/gitlab-org/omnibus-gitlab/issues/1601

## アップデート後にプロジェクトのトップで500エラーが出る

対応方法は以下の通りです。

```
docker exec -it [コンテナ名] gitlab-rails runner  "Project.where.not(import_url: nil).each { |p| p.import_data.destroy if p.import_data }"
```

参考）
https://gitlab.com/gitlab-org/gitlab-ce/issues/17873
GitHubのコードからnpmをインストールする

npmに上げるのもいいけれど、変更がなるべくサクサク反映できるようにしたいよね。

例えば https://github.com/ms2sato/bot-engine の`master`なら
```
npm install ms2sato/bot-engine.git#master
```

でできちゃう。なんて簡単な。
golang　switchの共通処理、ifの特殊(変)な書き方

<h1>golang</h1>

switchやifの追加や変更がしやすい書き方について紹介します。

<h2>switchの共通処理</h2>

gotoを使うことで簡単に共通処理を書くことができます。

<pre>
switch i{
case 0:
case 1:
case 2:
default:
  goto skip
}
//ここに共通処理
skip:
</pre>
こうします。

ifの場合は最後のelseにgotoを書いて同じようにします。

switch文では処理のないcaseを追加するだけで共通処理が実行されるので、ifよりも活用しやすいです。

<h3>実用例</h3>
<pre>
switch e.Code{
case key.CodeUpArrow:
	relY -= 0.1
case key.CodeDownArrow:
	relY += 0.1
case key.CodeLeftArrow:
	relX += 0.1
case key.CodeRightArrow:
	relX -= 0.1
default:
	goto none
}
//画面更新イベント送信
win.Send(size.Event{WidthPx:rc.width, HeightPx:rc.height})
none:
</pre>
矢印キーを移動処理をした後に、必ず画面を更新します。
例えば、画面の拡大縮小などのイベントを新たに追加すると自動で更新処理も呼び出されます。

<h2>if/switchの特殊(変)な書き方</h2>
<pre>
if true &&
  true &&
  false{
    //処理
}
</pre>
入れ子を解消して、インデントや行数を少なくできます。
また適切に改行を入れることで行が長くなりすぎるのを防ぎます。
改行だけで条件を追加できるのが魅力的です。

<h3>実用例</h3>
変更前
<pre>
if nameF || direF{
  if dFlag{
    if namesub.check(v.Name()){
      if diresub.checkContain(path){
        if lineF{
          fmt.Println(pathFormat(v, path) + "\n")
        }else{
          fmt.Println("not found")
        }
      }
    }
  }
}
</pre>
変更後
<pre>
if nameF || direF &&
  dFlag &&
  namesub.check(v.Name()) &&
  diresub.checkContain(path){
  lineF{
    fmt.Println(pathFormat(v, path) + "\n")
  }else{
    fmt.Println("not found")
  }
}
</pre>
switch版
<pre>
switch{
case
  nameF || direF &&
    dFlag &&
    namesub.check(v.Name()) &&
    diresub.checkContain(path):
  if lineF{
    fmt.Println(pathFormat(v, path) + "\n")
  }else{
    fmt.Println("not found")
  }
}
</pre>
switch否定版(処理内容は同じ)
<pre>
switch false{
case
  nameF || direF,
  dFlag,
  namesub.check(v.Name()),
  diresub.checkContain(path):
default:
  if lineF{
    fmt.Println(pathFormat(v, path) + "\n")
  }else{
    fmt.Println("not found")
  }
}
</pre>
インデントはgofmt準拠ですが、ちょっと違和感がある箇所もありますね。switchは、否定版の,(カンマ)区切りの方が違和感のないインデントでした。

どちらもあくまで追加変更がしやすい特殊な書き方なので、読みやすさは度外視です。
むやみに使わないこと、他人に見せるコードには使わないこと、忘れないよう適切なコメントを入れること。
Postgresql9.5~ upsert メモ

よく使いそうなので、メモ

```sql:sample.sql
insert into hoge (id,name) values (1,'hoge')
on conflict (id) 
do update set name = excluded.name;
```

* 「on conflict」の後の()にコンフリクトを判定するカラムとか制約名を指定。
* excludedはvaluesで指定した値を指す。もちろんべた書きでも良い。

## 参考
http://www.slideshare.net/noriyoshishinoda/postgresql-95-new-features-in-osc-2016-spring
「gitで大事なファイル上げちゃった（＞＜）」そんな時に見るやつ（リンクのみ）

https://help.github.com/articles/remove-sensitive-data/

大事なのはこれ。

```
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' --prune-empty --tag-name-filter cat -- --all
```
DayDream関連リンク

# 本Qiitaについて

DayDream関連のリンクをまとめています。

# 関連Qiita

* [DayDream開発機の設定](http://qiita.com/akira-sasaki/items/582d84b6e3e717aaf661)
* [UnityでのDayDreamデモアプリのBuild](http://qiita.com/akira-sasaki/items/6065e926b76620c12424)
* [DayDream Readyのスマフォ](http://qiita.com/akira-sasaki/items/4d648f9da28ff89973d4)
* [DayDream開発機の作り方](http://qiita.com/akira-sasaki/items/78e86d82dd307c494596)
* [Unity向けのWebSocketライブラリの組み込み](http://qiita.com/akira-sasaki/items/18a72f6b99acaa9601b8)
* [UnityでRESTでアクセス](http://qiita.com/akira-sasaki/items/09e4556ec4ad55a19a14)
* [UnityのJsonUtilityでJSON配列を処理する](http://qiita.com/akira-sasaki/items/71c13374698b821c4d73)

# Google

* [Google VR SDK for Unity](https://developers.google.com/vr/unity/)
* [Get Started with Daydream in Unity](https://developers.google.com/vr/unity/get-started-controller)
* [Google VR SDK for Unity Basics](https://developers.google.com/vr/unity/guide)
* [Controller API Basics](https://developers.google.com/vr/unity/controller-basics)
* Github [https://github.com/googlevr/gvr-unity-sdk](https://github.com/googlevr/gvr-unity-sdk)
* [Google VR for Unity SDK Script Reference](https://developers.google.com/vr/unity/reference/)

# Unity

* [DayDream Technical Preview](https://unity3d.com/jp/partners/google/daydream)
* [DayDream Preview forum](https://forum.unity3d.com/forums/daydream-preview.116/?_ga=1.15599536.74269498.1475519846)
考察 > L_001...L_008書換えを自動処理で実装 > 2年後に処理部分を探すのに時間がかかる

```txt:動作環境
C++ Builder XE4
```

Windowsソフトの実装において、コンポーネント名L_001, L_002, L_003など、自動的にインデックスを増加させながら表示したい項目があったとする。

処理としては以下のようなものを実装している。

```cpp
float val;
for (int di=0; di < SMR_CALIB_XXX; di++) {
	val = line->Strings[SMR_XXX + di].ToDouble();
	name = L"L_" + IntToStr(measStat) + L"0" + IntToStr(di);
	p = (TLabel*)FindComponent(name);
	if (p != NULL) {
		switch(SMR_XXX + di) {
		default:
			p->Caption = UnicodeString().sprintf(L"%.1f", val);
			break;
		case SMR_XXX:
		case SMR_YYY:
		case SMR_ZZZ:
		case SMR_VVV:
			p->Caption = UnicodeString().sprintf(L"%.1f", val);
			break;
		}
	}
	p = NULL;
}
```

`name = L"L_" + IntToStr(measStat) + L"0" + IntToStr(di);`
により
`L_001`,`L_002`,...`L_008`などの名前を取得している。

### 問題点

- 2年後にこのコードを変更することになった
- L_001...L_008の部分から1つ項目を消すことになった

関連コードを探そうにもL_00Xで検索しても引っかからない。
5秒で該当場所にたどれない。

### 対応

案1. コメントを追加する

```
/* L_001などの項目を代入する */
```

L_001で検索時に5秒で見つかる。
将来の自分に感謝されるかも。
「コードの意図」を残しておく。

別案: ソース分割をうまくやっておく。2年後にそのソース構造を覚えていたら探しやすいかも。自分は記憶力が悪いので、たぶんソース構造は忘れているだろう。

別案: ソース構造のドキュメントを残す。ソースを変更のたびにそのドキュメントを更新する、というのをきちんとする限りは有効。
swift3でのUIView.animateの挙動の違いについてのメモ

Xcode7からXcode8にアップデートしていて既存コードの動作に違いがあったんで備忘録。

UIView（self）を画面の下から出し入れするアニメーションを実装するとして

#### 【Xcode7 - Swift2】

制約の値を設定して、selfに対して`layoutIfNeeded()`で問題なくアニメーションされていた

```swift
    ///
    /// アニメーション表示
    ///
    self.constraintBottom.constant = 0
    UIView.animate(withDuration: 0.1, animations: { [weak self] in
        self?.layoutIfNeeded()
    }, completion: nil)

    ///
    /// アニメーション非表示
    ///
    self.constraintBottom.constant = -self.frame.size.height
    UIView.animate(withDuration: 0.1, animations: { [weak self] in
        self?.layoutIfNeeded()
    }, completion: nil)
```

#### 【Xcode8 - Swift3】

制約の値を設定して、selfに対して`layoutIfNeeded()`をやってもアニメーションされない
Stack Overflow によると`superview`に対して`layoutIfNeeded()`を呼びなさいとのこと
http://stackoverflow.com/questions/39489925/swift-3-uiview-animation

```swift
    ///
    /// アニメーション表示
    ///
    self.constraintBottom.constant = 0
    UIView.animate(withDuration: 0.1, animations: { [weak self] in
        self?.superview?.layoutIfNeeded()
    }, completion: nil)

    ///
    /// アニメーション非表示
    ///
    self.constraintBottom.constant = -self.frame.size.height
    UIView.animate(withDuration: 0.1, animations: { [weak self] in
        self?.superview?.layoutIfNeeded()
    }, completion: nil)
```

無事アニメーションされました
Windows 版 neovim で python3 (deoplete.nvim) を無理やり使う

# Windows 版 neovim で python3 (deoplete.nvim) を無理やり使う

どうしても windows 環境を整えたかったので，色々試したらできるようになったものの，正攻法とは言い難いのでメモ書き程度に．
もし，もっと筋の良い解決方法をご存知であれば，コメントしていただけると幸いです．

## neovimのインストール
[公式](https://github.com/neovim/neovim/wiki/Installing-Neovim#windows) に従ってインストール．
特につまづくところはないはず．

## `has('python3')` の返り値を1にする
[この Issue](https://github.com/neovim/neovim/issues/5360) に書いてあるように， windows 環境では `has('python3')` の返り値が 0．
python3 系をインストールして， `pip3.exe install neovim` を実行する．
[このコメント](https://github.com/neovim/neovim/issues/5360#issuecomment-248439686) の設定を init.vim に追加する．

```vim
let g:python3_host_prog = 'C:\Users\username\AppData\Local\Programs\Python\Python35\python.exe'
```

`$VIMRUNTIME\autoload\provider\pythonx.vim` に以下のパッチを当てる．

```diff
diff --git a/usr/local/share/nvim/runtime/autoload/provider/pythonx.vim b/media/huyu/BEA4-08FB/pythonx.vim
index 6d6b389..0ebae4f 100644
--- a/usr/local/share/nvim/runtime/autoload/provider/pythonx.vim
+++ b/media/huyu/BEA4-08FB/pythonx.vim
@@ -22,7 +22,7 @@ function! provider#pythonx#Require(host) abort
 
   " Python host arguments
   let prog = (ver == '2' ?  provider#python#Prog() : provider#python3#Prog())
-  let args = [prog, '-c', 'import sys; sys.path.remove(""); import neovim; neovim.start_host()']
+  let args = [prog, '-c', '"import sys; sys.path.remove(\"\"); import neovim; neovim.start_host()"']
 
   " Collect registered Python plugins into args
   let python_plugins = remote#host#PluginsForHost(a:host.name)
@@ -101,11 +101,11 @@ function! s:check_interpreter(prog, major_ver, skip) abort
   "   2  Neovim module cannot be loaded.
   "   Otherwise something else went wrong (e.g. 1 or 127).
   let prog_ver = system([ a:prog , '-c' ,
-        \ 'import sys; ' .
-        \ 'sys.path.remove(""); ' .
-        \ 'sys.stdout.write(str(sys.version_info[0]) + "." + str(sys.version_info[1])); ' .
+        \ '"import sys; ' .
+        \ 'sys.path.remove(\"\"); ' .
+        \ 'sys.stdout.write(str(sys.version_info[0]) + \".\" + str(sys.version_info[1])); ' .
         \ 'import pkgutil; ' .
-        \ 'exit(2*int(pkgutil.get_loader("neovim") is None))'
+        \ 'exit(2*int(pkgutil.get_loader(\"neovim\") is None))"'
         \ ])
 
   if v:shell_error == 2 || v:shell_error == 0
```
nvim-qt を起動して `:echo has('python3')` すると 1 が返ってくる．
`dein.vim` とか使って `deoplete.nvim` を導入すると動く．

## 動作環境
OS: Windows10(Build 14936)
neovim: v0.1.6-833-g35f67ee
python: 3.5.2
PowerShellメモ　一括でブロックの解除(ZoneId)

# 概要
ネットから落としてきたファイルに付いているこれ。

![ps04.png](https://qiita-image-store.s3.amazonaws.com/0/142879/a8f3eecb-641e-755d-fb8f-d0d4a857c3fa.png)


指定フォルダ配下のファイルを一括ブロック解除する方法。

# 書式

```PowerShell
Get-ChildItem 【フォルダパス】 -Recurse | Unblock-File
```

```PowerShell:もっと短く
ls 【フォルダパス】 -r | unblock-file
```

# 実行例

```PowerShell
ls "C:\Work\Download Files" -r unblock-file

# カレント配下をブロック解除
ls . -r | unblock-file
```

# 動作確認した環境
* PowerShell V5 (Windows 10)
韓国Rust使用者グループ

たまたま「[韓国Rust使用者グループ](https://rust-kr.org/)」（한국 러스트 사용자 그룹）というサイトを見つけました。

少人数の集まりで，主に IRC でやりとりされているそうです。

[会合の情報が Rust で書かれている](https://rust-kr.org/pages/meetup-2016-10-01)んですね。直近だと2016年10月1日にソウルのカフェテリアでコーディング会が開かれたようです。

左上の[シンボルマーク](https://rust-kr.org/static/logo.svg)なんですが，「R」の代わりに，ハングルで R の音を表す部品「ᄅ」[^rieul]が入ってます。

[^rieul]: この部品には「リウル」という名前がついている。単独では文字にならず，他の部品と組み合わせて文字にする。例えば A を表す部品「ᅡ」を組みわせて「라」（ラ）。
JenkinsでGmailを使用したメール送信ができない時の対処法

# 【Gmailを使用したテストメールの送信ができない】

Jenkinsで　Jenkinsの管理 → システムの設定
画面からメールのテスト送信をすることができます。

[Jenkinsでビルド失敗時にGmailで通知する](http://nomnel.net/blog/jenkins-notification-using-gmail/)
こちらのサイトを参考にしてメール通知のための設定を行いましたが、
`javax.mail.AuthenticationFailedException`
というエラーが出てしまいます。

#【対処法】
[安全性の低いアプリがアカウントにアクセスするのを許可する](https://support.google.com/accounts/answer/6010255?hl=ja)
こちらのサイトの「安全性の低いアプリ」というリンク先で
(事前にGoogleアカウントでログイン必要)

**安全性の低いアプリのアクセスをオンにします**

これでテストメールの送信が正常に完了します。
TensorFlow > link > cross entropy > - sum { y'_i * log(y_i) }の概念

MNISTのクラス分類などで出てくるcross entropyの式

```math
H_{y'}(y) = - \sum_i{{y'}_i log(y_i)} 
```

なぜ-log(y_i)を掛けるのかというのは以下の動画の12:50頃に紹介されている。

Gentlest Introduction to Tensorflow: Part 3
https://www.youtube.com/watch?v=F8g_6TXKlxw
javascript 完全個人用

			var year = 2017;
			var month = 4;
			var startDayOfWeek = START_SUNDAY;
			var week = 6;
			/*
			if(!year.matches(^\d{4}$))) return;
			if(!month.matches(^\d*$)) return;
			if(!(startDayOfWeek == START_SUNDAY) || (startDayOfWeek == START_MONDAY))) return;
			*/
			console.log(year + "年" + month + "月は" + countWeekOfMonth(year, month, startDayOfWeek) + "週です。");
			console.log(year + "年" + month + "月(開始曜日 : " + startDayOfWeek + ")の、週開始日は" +  getFirstDateOfNthWeekOfMonth(year, month, startDayOfWeek, week) + "日です");

			// monthは日本式  1月 → month=1
			function countWeekOfMonth(year, month, startDayOfWeek) {
				var daysOfMonth = new Date(year, month, 0).getDate();
				var day = new Date(year, month-1, 1).getDay(); // 今月の1日の曜日

				var weekCount = 1;
				for(var i=1; i<daysOfMonth; ++i){// 今月の2日目からカウント
					if((day+i)%7 == startDayOfWeek) weekCount++;
				}

				return weekCount;
			}

			function getFirstDateOfNthWeekOfMonth(year, month, startDayOfWeek, n) {
				if(n == 1){
					return new Date(year, month-1, 1);
				}
				var daysOfMonth = new Date(year, month, 0).getDate();
				var day = new Date(year, month-1, 1).getDay(); // 今月の1日の曜日

				var weekCount = 1;
				for(var i=1; i<daysOfMonth; ++i){// 今月の2日目からカウント
					if((day+i)%7 == startDayOfWeek) weekCount++;
					if(weekCount == n) return new Date(year, month-1, i+1).getDate();
				}

			}

			function daysOfMonth(year, month) {
				return new Date(year, month, 0).getDate();
			}
TensorFlow > Tensor Transformations > labels = to_tf.int64(labels)

https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html#tensorflow-mechanics-101
において出てきた型変換.

> Loss
> First, the values from the labels_placeholder are converted to 64-bit integers.
...

```
labels = tf.to_int64(labels)
```

Tensor Transformations
というらしい。
https://www.tensorflow.org/versions/r0.11/api_docs/python/array_ops.html
技術英語 > Ugly numbers like these [defy] any attempt to come up with a function ...

@ Code Complete (No. 14066 / 36077)

> Ugly numbers like these <font color=red>defy</font> any attempt to come up with a function ...

http://ejje.weblio.jp/content/defy
> ... (…を)受けつけない

<hr>
Voyagerに登場するUSS Defiant。
https://en.wikipedia.org/wiki/USS_Defiant

記憶の宮殿への格納用に例文を作ってみる。

Tom defies USS Defiant because of its appearance compared with Delta Flyer.


[外観の英語](http://ejje.weblio.jp/content/%E5%A4%96%E8%A6%B3)
[デルタ・フライヤー](http://ja.memory-alpha.wikia.com/wiki/%E3%83%87%E3%83%AB%E3%82%BF%E3%83%BB%E3%83%95%E3%83%A9%E3%82%A4%E3%83%A4%E3%83%BC)