OmniAICreator/Qiita-1.07M huggingface dataset:
Go 事始め：標準入力

なんだかモゾモゾとした Go への興味を持ちつつ、Scala でコレクション操作の気持ちよさを覚えたり、nodejs の http リクエストの簡単さに驚きと喜びを覚えてしまったが故に、コレクション操作ゼロ・http リクエスト一つ飛ばすのに結構な行数を必要とする Go を勉強するのがなんだか億劫になっている今日この頃。

でも頑張って勉強中

そんでもって今回は標準入力を使ってデータを読み込んで、よしなに処理して、標準出力に出力
といったプログラムを組みたかったので、折角だし Go でトライしてみた

## まずは os パッケージを調べた
まずはドキュメントを調べよう。
確か Go には os って名前のパッケージがあったはず。。。。
標準入出力っていったらやっぱ os パッケージでしょー

ってことで `Golang os` で検索。

[公式ドキュメント](https://golang.org/pkg/os)を無事発見して stdin でページ検索。
お、[やっぱあった](https://golang.org/pkg/os/#pkg-variables)

## でもどうやって入力読み込むのこれ？
`os.Stdin` はパッケージの中で `Stdin  = NewFile(uintptr(syscall.Stdin), "/dev/stdin")` って定義されているそうな。
って事はこれは File タイプなので、 File インターフェースに紐付いたメソッドを確認。

fmfm、`func (f *File) Read(b []byte) (n int, err error)` とな。
とりあえず試す。

```go:stdin.go
package main

import (
    "os"
    "fmt"
)
func main() {
    buf := []byte{}
    n, _ := os.Stdin.Read(buf)
    fmt.Println("Read", n, "lines")
    fmt.Println("Buf", string(buf))
}
```

```bash
$ echo "hello world!" | go run stdin.go
Read 0 lines
Buf
```

。。。ん？

```bash
$ echo "hello?" | go run stdin.go
Read 0 lines
Buf
```

あ、違う...の？

## `Golang stdin` で調べてみた
[一発だった](http://qiita.com/hnakamur/items/a53b701c8827fe4bfec7)

```go:stdin.go
package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    stdin := bufio.NewScanner(os.Stdin)
    for stdin.Scan() {
        if err := stdin.Err(); err != nil {
            fmt.Fprintln(os.Stderr, err)
        }
        fmt.Println(stdin.Text())
    }
}
```

公式ドキュメントを[覗いてみる](https://golang.org/pkg/bufio/#NewScanner) と定義は
`func NewScanner(r io.Reader) *Scanner` となっている

。。。ん？
io.Reader？

でも渡しているのは `os.Stdin` で、これは `File` タイプ。
そして Go に継承はないらしい。。。
どういうこっちゃ？

## インターフェースの便利さを（なんとなく）知る
io.Reader の定義を[覗きに行く](https://golang.org/pkg/io/#Reader)と次のような定義がある。

```go:io.Reader
type Reader interface {
        Read(p []byte) (n int, err error)
}
```

ん？これさっき見た？
もっかい File タイプを[調べると](https://golang.org/pkg/os/#File.Read)やっぱりあった。

```go:File.Read
func (f *File) Read(b []byte) (n int, err error)
```

あ〜、同じメソッドが定義されてるから、定義としてなくても、io.Reader と互換性があるって事で使えるのか :bulb: 

自分が活用できるかはさておき納得 :stuck_out_tongue: 

## ちなみに `(s * Scanner).Scan()` は毎行読み込むのに必要
`(s *Scanner).Text()` は、今のバッファ内文字列を返すだけで、バッファの内容を次の行に更新するには `(s *Scanner).Scan()` のコールが必須。
逆に言うと `(s *Scanner).Text()` は必ず同じ値を返すので、変数に格納する事なくガンガン呼べる。（ある程度回数がある場合は利便性のために変数に格納した方が良いとは思うけど）（あとパフォーマンス面ではどうなるのか知らない）
rbenvをシステムワイドにインストールしてのCapistranoデプロイする時にRBENV_ROOTが$HOMEからのになって困った（＞＜）


http://office.tsukuba-bunko.org/ppoi/entry/systemwide-rbenv
こんな風に `/usr/local/rbenv` にインストールした後、デプロイしようとして

```
(master) $ bundle exec cap production deploy
 DEBUG [0178f860] Running [ -d $HOME/.rbenv/versions/2.3.1 ] as myapp@x.x.x.x
 DEBUG [0178f860] Command: [ -d $HOME/.rbenv/versions/2.3.1 ]
```

こんな感じになってしまったらインストールが失敗してしまう（当たり前）。サーバー側のrbenvは$HOMEと関係ないとこに入ってるのだから。

`capistrano/rbenv`がこのパスを操作しているらしいことは`require`を消したりしてみたらわかった。とりあえずその周辺が怪しい。

http://qiita.com/hmuronaka/items/d8edd5bb252711684b99

こちらを確認してたら`rbenv`についてのオプションがあった。下記のような内容にしたらいいんだなー。

```rb
set :rbenv_ruby, '2.3.1'
set :rbenv_path, '/usr/local/rbenv'
set :rbenv_prefix, "RBENV_ROOT=#{fetch(:rbenv_path)} RBENV_VERSION=#{fetch(:rbenv_ruby)} #{fetch(:rbenv_path)}/bin/rbenv exec"
```

`rbenv_path` の指定が大事ですよということで。

あと、こちらによると `default_environment`の設定も大事ですよと。
http://tk0miya.hatenablog.com/entry/2013/02/18/115433

あんまりcapistranoいじり倒したことなくて、相談受けた時にすぐにわからんかった。まだまだ修行が足らんのう。
SwiftでStopWatchを作ってみた

この動画↓

SwiftでなんちゃってStopWatchを作ってみた（その１）http://www.nicovideo.jp/watch/sm24733337
SwiftでなんちゃってStopWatchを作ってみた（その２）http://www.nicovideo.jp/watch/sm24739192


を参考にStopWatchアプリを作ってみた。

挙動こんな感じ
StopWatch - Swift 
https://youtu.be/5pcY_DGGPeY


動画通りに作ってもバージョンの違いで最初はエラー、ビルド通っても動かずなど色々ありましたが、試行錯誤したソースコードが後述のものです。


ちなみに、

swift 2.2
Xcode 7.3.1

で作成しました。


後から色々機能を付け足すつもりでプロジェクトをタブバーアプリケーションで作成したため、
関数呼び出し時にクラス名も記述している箇所などはバージョン云々ではなく書き方が違うと思うのですが、
細かいところがいくつか違うのでご参考までに。





```Swift:
import UIKit

class FirstViewController: UIViewController {

var countNum = 0
var timerRunning = false
var timer = NSTimer()

func update(){
    countNum+=1
    let ms = countNum % 100
    let s = (countNum - ms) / 100 % 60
    let m = (countNum - s - ms) / 6000 % 3600
    label.text = String (format: "%02d:%02d.%02d", m,s,ms)
}
    
    
    @IBOutlet weak var label: UILabel!
    
    @IBAction func start(sender: UIButton) {
        if timerRunning == false{
            timer =
                NSTimer.scheduledTimerWithTimeInterval(0.01,
                                                      target:self,
                                                      selector: #selector(FirstViewController.update),
                                                      userInfo: nil,
                                                      repeats: true)
           timerRunning = true
        }
        
        
    }
    
    @IBAction func stop(sender: UIButton) {
        if timerRunning == true{
            timer.invalidate()
            timerRunning = false
        }
        
        
    }
    
    @IBAction func reset(sender: UIButton) {
        countNum = 0
        label.text = "00:00.00"
    }
    

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
PublicIPでEC2にSSH接続ができなくて困った話


## 現象

踏み台サーバであるAから別サーバのBにSSHで接続しようとしたときに

* PrivateIP、PrivateDNSを指定すると接続可能
* PublicDNSを指定すると接続可能
* PublicIPを指定すると接続不可能

という状況でした。NetworkACLは特に設定しておらず
__AB間のSecurityGroupは許可し合っているはずなのに…。__

## 原因

### PrivateIPで接続可能である理由

接続先（サーバB）のSecurityGroupのInboundには
サーバAからのSSH接続を許可する内容を設定してありましたが
送信元としてサーバAが属する __SecurityGroup__ を記載していたのが原因でした。

[公式ドキュメント](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-network-security.html)には以下のように記載されています。

> ルールの送信元または送信先としてセキュリティグループを指定する場合、
ルールはセキュリティグループと関連付けられるすべてのインスタンスに影響します。
着信トラフィックは、ソースセキュリティグループに関連付けられたインスタンスの
プライベート IP アドレスに基づいて許可されます
（パブリック IP アドレスまたは Elastic IP アドレスは考慮されません）。

結果として、サーバBのInboundで許可されていたのはサーバAのPrivateIPのみ。
PrivateIP/DNSを使えば問題なく接続できたのはこのためですね。

SSH接続先としてPublicIPを指定した際には
PublicIP間の通信となり、セキュリティグループに阻まれたと考えています。
サーバBのInboundセキュリティグループにサーバAのPublicIPを直接書くと
PublicIP指定でも接続できるようになりました。

### PublicDNSで接続可能である理由

[Discussion Forums](https://forums.aws.amazon.com/thread.jspa?threadID=81025)の記載内容によると

> When you use the public DNS name from within the same EC2 region, you will actually get the current private IP address.

-> 同じリージョンにあるEC2のPublicDNSを解決すると、PrivateIPが得られる。
実際にEC2インスタンスを立てて試してみました。

```bash:同じリージョンで解決を行った場合はPrivateIPが得られる
# @Singapore
$ nslookup ec2-52-78-50-129.ap-southeast-1.compute.amazonaws.com 
Server:         10.0.0.2
Address:        10.0.0.2#53

Non-authoritative answer:
Name:   ec2-52-78-50-129.ap-southeast-1.compute.amazonaws.com
Address: 10.0.8.105 # <- PrivateIP
```

```bash:違うリージョンで解決を行った場合はPublicIPが得られる
# @Sydney
$ nslookup ec2-52-78-50-129.ap-southeast-1.compute.amazonaws.com
Server:		10.0.0.2
Address:	10.0.0.2#53

Non-authoritative answer:
Name:	ec2-52-78-50-129.ap-southeast-1.compute.amazonaws.com
Address: 52.77.49.128 # <- PublicIP
```

つまり、PublicDNSがPrivateIPに変換され
同一ネットワーク内のPrivateIP同士の通信が行われるため
セキュリティグループでの指定通りに接続できたと考えています。

## まとめ

PublicIPでSSH接続ができない問題について解説しました。

問題が概ね解決したあとに、以下のような記事を見つけました。
[AWSのセキュリティグループにセキュリティグループを指定した時の落とし穴](http://qiita.com/white_aspara25/items/48e91e671bff25474b02)

こちらがかなり参考になり、解決に至ったのですが
そもそも今回の問題を端的に表すキーワードがなく
ググラビリティが非常に低いため、面を増やすためにこの記事を書いた次第です。
見積もり精度の「不確定性原理」

量子力学には不確定性原理があって、以下の関係式を超える精度を同時に満たすことはできない。

```math
\Delta x\,\Delta p\geq {\frac {\hbar }{2}}
```

位置の精度を上げようとすると、運動量の精度は上がらない。
運動量の精度を上げようとすると、位置の精度は上がらない。


これと同じように、作業の見積もり精度を上げようとすると作業の処理速度に干渉が入りすぎる。

作業量の精度・作業速度の精度には一種の「不確定性原理」に似た限界があるのではないか。



### 経験則
- 詳細を詳しく記載した見積もりを作成したときは、必ずといっていいほど、見積もりの前提条件が変更になる。




### 見積もり精度は上がらない。それでも見積もりが必要な理由
- 待ち受けている困難の度合いを知っておく必要があるため。
- 作業の優先順位を見定める必要があるため。
- 早めに手を打っておけるようにするため。

###見積もりをこう使うべきでないと個人的に感じている使い方
- 「何週間でできる言ったよね」
- まだ十分検討されていないので未知のことがあるのに、知ったかぶりで「このスケジュールでいける」という作らせられた無理な見積もりを妥当な指針として進める。


###　Performanceの見積もり精度をあげることを要求しすぎると、開発することになってしまう
30分以内にUnityにPhoton Chatを使ってチャット機能を導入する

## 概要
この記事は、UnityにPhoton Chatをインストールして
チャット機能を導入する方法を書いたものです。

この記事を書いたときのUnityのバージョンは、5.3.4

## Photon Chatを導入するメリット
・チャット専用にサーバを用意する必要がない。
・無料で使うことができる(ただし制限あり)
・一からチャット機能を実装する必要がない

## 導入手順
(1)photonのサイトでアカウントを登録する
アカウントを登録します。
登録は無料です。

photon
https://www.photonengine.com/ja-JP/pun/

(2)アプリケーションの登録

<img width="1181" alt="スクリーンショット 2016-10-15 10.05.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/46535/d223018e-7023-d286-eeea-d14cd4ea590b.png">

ダッシュボードにてアプリの登録します。
登録時、アプリケーションIDが発行されるので保存しておきます。
アプリケーションIDは、このあとUnity側の設定で使います

https://www.photonengine.com/ja-JP/Dashboard/Chat

(3)Photon Chat SDKをAsset Storeからダウンロードする
<img width="1194" alt="スクリーンショット 2016-10-15 9.45.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/46535/fffdc749-e9d1-bd30-afa5-b2e596590db9.png">

(4)SetUpする
Unityを起動し(2)で取得したアプリケーションIDを入力する。
<img width="350" alt="スクリーンショット 2016-10-15 9.48.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/46535/136976f0-6884-c167-f56a-ecbef6fe8579.png">

以上で、チャット機能の導入は終了です。

詳しい関数の使い方は、本家の「Photon Chatイントロ」を見てください！
わかりやすく書いてます。
http://doc.photonengine.com/ja-jp/chat/current/getting-started/chat-intro


Assets以下にある「Demo Chat」 Chat-Scene(サンプルアプリ)を起動する。

その結果、Unityプレイヤー上で発言した内容が
画面に反映されることがわかります。
このサンプルをIOSに書き出し、チャットを起動すると、
UnityプレイヤーとIOSとの間で文字のやり取りができるかと思います。
composerについて初期学習まとめ

composerについて勉強したのでまとめておく。
composer.jsonファイルに設定を記述していく形式らしい。

# 依存パッケージの指定

``` json
{
  "require" : {"illuminate/console": "5.0.22"}
}
```

# オートローディング

以下の3つがある。

* PSR-4規約
* クラスマップ
* 指定ファイルを起動時に読み込む

## PSR-4規約

``` json
{
  "autoload": { "psr-4": { "Vehicle\\Car\\": "Norimono" } }
}
```

名前空間が`\Vehicle\Car`下のクラスのアクセス時に、そのクラスがロードされていない場合、composer.jsonが置かれたディレクトリからの相対パスで指定された`Norimono`ディレクトリ以下のファイルが読み込まれる。

大文字、小文字、アンダースコアはそのまま対応する。
クラスファイル名は、「{クラス名}.php」とする。

## クラスマップ

``` json
{
  "autoload": { "classmap": [ "lib", "vendor/lib" ] }
}
```

libとvender/libディレクトリ内でクラスを定義しているPHPファイルがオートローディングの対象となる。
パスの基準は、composer.jsonが置かれたディレクトリ。

下記コマンドで、対応付けのためのクラスマップが生成される。

```
% composer dump-autoload
```

## 指定ファイルを起動時に読み込む

``` json
{
  "autoload": { "files": { "hoge.php": "lib/fuga.php" } }
}
```

hoge.phpとlib/fuga.phpがオートローディングの対象となる。
パスの基準は、composer.jsonが置かれたディレクトリ。

# コマンド

composerコマンドを実行するときに「-vvv」オプションを実行するとデバッグ情報が出力される。トラブル時に便利。

## update

パッケージを新規インストール、アップデート、削除する。
「--no-dev」オプションを付与するとrequire-devセクションのパッケージを除外できる(本番環境で利用)。

```
% composer update
```

## install

composer.lockファイルの内容に基づいてパッケージを構成する。このファイルにないものはcomposer.jsonの内容に従う(rubyのbundlerのbundle installと同等だと思う)。

```
% composer install
```

## require

require-devセクションを対象にする場合には「--dev」オプションを付与する。
require-devセクションを対象外にする場合には「--update-no-dev」オプションを付与する。

```
% composer require ベンダー名/パッケージ名:バージョン ...
```

## remove

オプション(--dev, --update-no-dev)に関しては、requireと同じ。

```
% composer remove ベンダー名/パッケージ名
```

## global

globalを付与しない場合には、COMPOSER_HOME環境変数(通常は、「~/.composer」)に対してinstall、update、requireが実行される。
globalを付与した場合には、COMPOSER_HOME環境変数が示すディレクトリの下の「vendor/bin」にPATHを通しておくと利用できる。

```
% composer global require ベンダー名/パッケージ名:バージョン
% composer global update
% composer global install
```

## self-update

composer自身を更新する。
--rollbackオプションで1つ前のバージョンに戻せる。古いバージョンはCOMPOSER_HOME環境変数の指す場所に保存されている。
--clean-backupsオプションを実行すれば、古いバックアップは削除される。

```
% composer self-update
```

## create-project

基本的なプロジェクト後続を構築する。(rails newと同等)

```
% composer create-project ベンダー名/パッケージ名[:バージョン] [インストールパス]
```

## dump-autoload

オートローディングに関する情報ファイルを生成するコマンド。
PSR-4規約による定義、クラスマップによるロード対象クラスの変更がった場合このコマンドを再実行する。
--optimize(又は-o)オプションを付けるとPSR-4規約のオートローディング対象となっている全クラスがクラスマップに含まれる。
これによりロード時間を速くできるらしい。

ただし、PSR-4よりもクラスマップの方が優先されるので、PSR-4の対象を変更するとオートローディングが正常に動作しないことがあるらしいので注意する。
composer update終了時もデフォルトは`php artisan optimize`が実行されるらしく、この不具合が発生する可能性がある(`php artisan optimize --psr`に変更する方法があるらしいが未調査)。

```
% composer dump-autoload
```

## clear-cache

composerのローカルキャッシュを削除する。
変更、更新などがうまく動作しないときは、キャッシュをクリアしてみるとよい。

```
% composer clear-cache
```

## info又はshow

いずれも同じコマンド。
PHP環境とインストール済みの全パッケージの情報を表示する。
パッケージ名を指定するとそのパッケージの情報を見ることができる。

```
% composer info
% composer show
```
how thin load rack's ru file

thin -R [ru file]

https://github.com/macournoyer/thin/blob/master/lib/thin/runner.rb#L71-L72

https://github.com/macournoyer/thin/blob/master/lib/thin/controllers/controller.rb#L71-L75

https://github.com/macournoyer/thin/blob/master/lib/thin/controllers/controller.rb#L175-L186

https://github.com/macournoyer/thin/blob/master/lib/rack/adapter/loader.rb#L31-L34

```rb
    def self.load(config)
      rackup_code = ::File.read(config)
      eval("Rack::Builder.new {( #{rackup_code}\n )}.to_app", TOPLEVEL_BINDING, config)
    end
```
FirebaseをUnityで使うメモ (RealtimeDatabase)

追記: OSS版のライブラリはなくなります。https://firebase.google.com/docs/unity/setup を参考にしてください

Firebaseはリアルタイムで同期してくれるデータベースがあります。
Unityで使えたらゲームに手軽にオンライン要素を組み込むことができそうです。

ただ公式のSDKは絶賛開発中なので製品で使うのは厳しいです。
ゼミの課題で「オンライン対応してます！！！」みたいなことをしたい場合以外はやらないのが賢明だと思います。

https://github.com/firebase/Firebase-Unity

# 環境

Firebase 3.5.0
Mac El Capitan
Unity 5.3.5f1

# インストール

GitHubのリポジトリに`firebase.unitypackage`があるので[ダウンロード](https://github.com/firebase/Firebase-Unity/blob/master/firebase.unitypackage?raw=true)します。

プロジェクトを開いた状態でダウンロードしたパッケージをクリックすれば取り込むAssetsを選択できます、とりあえず全部入れておきましょう。

ここからMacの人はFirebaseProxyのライブラリのリンクを切り替える必要があります。
僕の環境では`/Library/Java/Home/jre/lib/server/libjvm.dylib`にあったので以下のコマンドをプロジェクトのルートで実行しました。

```base
$ install_name_tool -change "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/server/libjvm.dylib" "/Library/Java/Home/jre/lib/server/libjvm.dylib" Assets/Plugins/Editor/FirebaseProxy.bundle/Contents/MacOS/FirebaseProxy
```

# Firebase のセットアップ

[コンソール](https://console.firebase.google.com/)で新規のプロジェクトを作成します。

Database > ルール で以下のようにセキュリティルールを変更しました。
完全に公開されちゃってるので 開発用以外ではやらないようにしておきましょう。

```json:database.rules.json
{
  "rules": {
    ".read": true,
    ".write": true
  }
}
```

ちゃんと認証を入れておきたかったのですがEditorでは匿名認証ができなくて諦めたからです。
AbndroidかiOSに書き出せば認証はできるかもしれないです。

# 動作確認

Assets/TestScript を編集しながら試しました。

```csharp:TestScript.cs
using UnityEngine;
using System.Collections;

public class TestScript : MonoBehaviour
{
    IFirebase firebase;

    // Use this for initialization
    void Start()
    {
        firebase = Firebase.CreateNew("https://<projectID>.firebaseio.com/");

        firebase.ChildAdded += (sender, e) =>
        {
            Debug.Log("Child added!: " + sender);
        };

        firebase.ChildRemoved += (sender, e) =>
        {
            Debug.Log("Child removed!");
        };

        firebase.SetJsonValue("{\"example_child\":{\"child_working\" : true}}");
    }

    // Update is called once per frame
    void Update()
    {

    }
}
```

これで実行するとルートディレクトリに書き込まれます。

pathを指定したい場合はCreateNewのところで以下のようにpathを指定します。

```csharp
Firebase.CreateNew("https://<projectID>.firebaseio.com/player");
```

こうすることでplayer内に書き込めました。
DB/集計テーブルにクエリ一発でレコードを作る(更新する）方法

集計テーブルとかを作る場合にはSELECTしたものをINSERTしたり、SELECTしたものでUPDATEしたりすると、1つのクエリで処理でき便利です。

確認環境：MySQL5.6.21

以下のようなテーブルがあったとします。t_salesは売上の生データ、t_sales_summaryは商品毎の売上数の集計テーブルです。

````
CREATE TABLE IF NOT EXISTS `t_sales` (
  `sales_id` int(11) NOT NULL AUTO_INCREMENT,
  `product_id` int(11) NOT NULL,
  `amount` int(11) NOT NULL,
  `timestamp` timestamp NOT NULL,
  PRIMARY KEY (`sales_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

INSERT INTO `t_sales` (`sales_id`, `product_id`, `amount`, `timestamp`) VALUES
(1, 1, 10, '2016-10-15 10:44:14'),
(2, 1, 20, '2016-10-15 10:44:14'),
(3, 2, 5, '2016-10-15 10:44:14'),
(4, 2, 10, '2016-10-15 10:44:14'),
(5, 3, 50, '2016-10-15 10:44:14');

CREATE TABLE IF NOT EXISTS `t_sales_summary` (
  `product_id` int(11) NOT NULL,
  `amount` int(11) NOT NULL,
  PRIMARY KEY (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
````

#SELECTしたものをINSERT
これらのテーブルに対して、以下のクエリを実行すると、t_salesに対して集計処理が実行され、その結果がt_sales_summaryに格納されます。

    INSERT INTO t_sales_summary(product_id, amount) 
      SELECT product_id, SUM(amount) FROM t_sales GROUP BY product_id

#SELECTしたものでREPLACE
以下のクエリを実行すると、t_sales_summaryが上書き更新されます。ただし、t_salesからレコードが削除された結果、特定の製品の売上が無くなった場合、t_sales_summaryからレコードが消えないことに注意が必要です。事前にTRUNCATEでサマリテーブルを空にするか、DELETEするか、UPDATEでamountを0にしましょう。

    REPLACE INTO t_sales_summary(product_id, amount) 
      SELECT product_id, SUM(amount) FROM t_sales GROUP BY product_id

#SELECTしたものでUPDATE
以下のクエリを実行すると、t_sales_summaryがUPDATEされます。
t_sales_summaryが他のフィールドを持っていて、値を保持する必要がある場合はこの方法で更新しましょう。

    UPDATE 
      t_sales_summary, 
      (SELECT product_id, sum(amount) total_amount FROM t_sales GROUP BY product_id) tbl 
    SET 
      t_sales_summary.amount = tbl.total_amount 
    WHERE 
      tbl.product_id = t_sales_summary.product_id 

JOIN を使って以下のように書くこともできます。上記のクエリと等価です。

    UPDATE t_sales_summary
    JOIN (SELECT product_id, SUM( amount ) total_amount FROM t_sales GROUP BY product_id) tbl 
      ON tbl.product_id = t_sales_summary.product_id
    SET 
      t_sales_summary.amount = tbl.total_amount 

#まとめ
SELECTの結果を使って、INSERT・UPDATE・REPLACEすることで簡単に集計テーブルを作成・メンテンナスできます。
SELECT対象のテーブルからレコードが減った場合にゴミデータが残る場合があるので以下のような方法で回避しましょう。

- 事前にTRUNCATEもしくはDELETEしてしまう。
- 事前に集計対象フィールドをUPDATEで消去しておく。
- 集計結果と、マスターテーブルを外部結合することで必ず全てのレコードが更新されるようにする。（マスター消えたら知らん）
- 集計結果と、集計結果テーブルを外部結合することで必ず全てのレコードが更新されるようにする。
Neo4j Docker版を動かしてみました

Neo4j Docker版を動かしてみました。Neo4j Docker版は、コミュニティ版とエンタープライズ版のとちらも使えます。ここでは、Neo4j Docker版のインストール方法などを簡略に紹介します。

## 事前準備
LinuxサーバーにDockerインストールしてください。

* AWS
* CentOS 7.2
* Small
* Docker 1.12.2
* Neo4j Community 3.0.6

Dockerのインストールは、こちらを参照しています。
[Install  On CentOS](https://docs.docker.com/engine/installation/linux/centos/)


```
$ sudo yum update -y

$ sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF

$ sudo yum install docker-engine -y

$ sudo systemctl enable docker.service

$ sudo systemctl start docker

$ sudo usermod -a -G docker ec2-user
```

ec2-userでdockerコマンドを使うためには、ログインしなす必要があります。sudo su ec2-userでごまかしてもいいでしょう。

```
$ docker info
```

## Neo4j Docker版のインストール
Neo4jのデータベース、ログ、環境ファイルは、ホスト上のボリュームをマッピングして使います。

```
$ docker run \
    --detach \
    --publish=7474:7474 --publish=7687:7687 \
    --volume=$HOME/neo4j/data:/data \
    --volume=$HOME/neo4j/logs:/logs \
    --volume=$HOME/neo4j/conf:/conf \
    --ulimit=nofile=40000:40000 \
    neo4j:3.0

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                      NAMES
76766d1d933c        neo4j:3.0           "/docker-entrypoint.s"   2 minutes ago       Up 2 minutes        0.0.0.0:7474->7474/tcp, 7473/tcp, 0.0.0.0:7687->7687/tcp   drunk_leavitt
```
ポートは、次の通りです。

|ポート|プロトコル|
|:---:|:-------:|
|7474 |HTTP|
|7473 |HTTPS|
|7687 |Boltドライバー|

ボリュームマッピングを確認してみましょう。$HOME配下に、Neo4jの構成ファイルが作られているはずです。

```
$ ls
neo4j

$ ls neo4j/
conf  data  logs
```

ここで、環境ファイルを確認してみると、何もないはずです。

```
$ ls neo4j/conf
```
これは、次ようにダンプできます。

```
$ docker run --rm\
  --volume=$HOME/neo4j/conf:/conf \
  neo4j:3.0 dump-config

$ ls neo4j/conf
neo4j.conf  neo4j-wrapper.conf
```

本格的にNeo4jを使おうとすると、少々Dockerの技も覚える必要があります。ここでは、これ以上深堀しません。興味ある方は、文尾の[参考文献]を参照してください。

# Webインターフェース
では、Webブラウザーから接続してみましょう。

```
http://<Public IP>:7474
```

![login-on-docker-1.png](https://qiita-image-store.s3.amazonaws.com/0/69832/f83061db-c421-2603-40b3-f3f9cb93d2fe.png)

パスワードを初期化し、Webインターフェースの初期画面を表示してみてください。ここまで表示できたら、インストールは成功です。

![login-on-docker-2.png](https://qiita-image-store.s3.amazonaws.com/0/69832/927320ed-5c54-2f57-badb-d43bb401b9dc.png)

## まとめ
以上、Neo4j Docker版を動かしてみました。

[参考文献]
[Neo4j with Docker](https://neo4j.com/developer/docker/)

[Docker](http://neo4j.com/docs/operations-manual/current/deployment/single-instance/docker/)

[docker#docker-store](https://neo4j.com/developer/docker/#docker-store)

[Neo4j 3.0 Docker page](http://neo4j.com/docs/operations-manual/current/deployment/single-instance/docker/)
[Lazurite 920J #1] 購入、開封

センサーネットワーク大好き、Matsuokaです。
2014年にTWE-Liteを[レポート](https://drive.google.com/open?id=0Bw7FgCy5HgpFdTdVa25ycmlhUFk)してから、しばらく新たなデバイスを試すことは無かったのですが、ロームさんから[Lazurite 920J](http://www.lapis-semi.com/lazurite-jp/products/lazurite-920j)というデバイスが発売されたので、飛びついて購入しました。

#買う気にさせたポイント

##920MHzのIEEE802.15.4e
XBeeやTWE-Liteは、IEEE802.15.4。
"e"が付いただけ、、、ですが、これを試してみたかった。Bluetooth LEみたいに、周波数ホッピングして、周波数混信の耐性が強いらしい。920MHzの飛びも知りたいし。
##ローム製
性能がどうのこうのではなくて、mbed祭りとかで~~おもしろい~~ロームの中の人と知り合っていたから。困ったときになんとかしてもらえるという期待感。
##入手しやすい
スイッチサイエンスさんから[買える](https://www.switch-science.com/catalog/2955/)から。

#買ったもの

IEEE802.15.4eは、（WiFiやBluetoothと違い）スマートフォンやパソコンに内蔵されていません。そのため、通信を試すには最低2個必要になります。
あと、Lazurite 920Jにプログラムを転送するために、Lazurite Mini writerが1個は必要になります。2個あったほうが、いろいろと試すのに便利かとも思いましたが、Lazurite Mini writerでシリアル通信モニターができるか分からなかったので、とりあえず1個だけにしました。

|品名|数量|単価|
|---|---|---|
|[Lazurite 920J](https://www.switch-science.com/catalog/2955/)|2|4536円|
|[Lazurite Mini writer Type B](https://www.switch-science.com/catalog/2956/)|1|3780円|

#Lazurite 920J 外観
Lazurite 920Jのパッケージはこんな感じ。
![20161015A.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/3f5e36b7-1553-11d8-4ed3-998664248d3a.jpeg)

製品と説明書。
写真には写っていないが、ピンヘッダーは折れないように導電スポンジで保護ってありました。
![20161015B.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/d7247e43-50ad-5a36-fe25-d1ba193d722c.jpeg)

オモテは、アンテナとケーシングされたモジュール？、LEDが3個と、スイッチが1個。外部アンテナが接続できるよう、U.FLっぽいコネクターがある。
スイッチはリセットスイッチかな？特に何も書かれていない。
LEDは25,26,pwrと書かれている。
![20161015C.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/66d6dd7b-41cc-4d3b-8b3e-2ba2f9c1ae64.jpeg)

ウラは、1.27ピッチのピンヘッダーが3個と、ケーシングされたモジュール。"4062"と手書きされたタグ。
タグはアドレスかな？
![20161015D.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/7354b973-627c-393a-2b98-3f297caed757.jpeg)

>オモテとウラに、ケーシングされた部分がある。
オモテに無線モジュールBP3596Aで、ウラにマイコンML620Q054Hが入っているんじゃないかという想像。

このアンテナ、見た目かっこいい。
コンデンサかな？メチャ小さい。
![20161015E.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/f679f993-1a9b-b713-c1f1-73b685a64146.jpeg)

LEDの電流制限抵抗もメチャ小さいし。
![20161015F.jpg](https://qiita-image-store.s3.amazonaws.com/0/109634/b614b66e-7bdd-c34e-2191-0ecb9695936a.jpeg)
Swiftのデバッグにdumpが使える

Swiftでクラスのインスタンスの中身を確認しようとしたとき、
こんな経験はありませんか？

```Swift
class Member {
    let name: String
    let age: Int
    let account: Account
    
    init(name: String, age: Int, account: Account) {
        self.name = name
        self.age = age
        self.account = account
    }
}

let yoshio: Member = Member(name: "yoshio", age: 62, account: account)

// 出力!
print(yoshio)
```

出力結果：

![LLDB 2016-10-15 18.01.01.png](https://qiita-image-store.s3.amazonaws.com/0/30423/21b80e9e-fe2b-3352-e65b-add62fff4e8f.png)

**うん。知ってる**

そんな中、最近[@shapesさんのツイート](https://twitter.com/shaps/status/785786934375448576)で、dump関数がSwiftでも使えることを知ったので、少しだけ掘り下げてご紹介します。

## dumpメソッドを使うメリット

ビルトイン関数の`dump(value: T)`を使うと、
**クラスのインスタンスがインデント付きで確認**できて便利です。

```swift
let yoshio: Member = Member(name: "yoshio", age: 62, account: account)
dump(yoshio)
```

出力結果：

　![LLDB2 2016-10-15 18.07.40.png](https://qiita-image-store.s3.amazonaws.com/0/30423/55c34f98-e37f-81e9-0a07-e13a1481c464.png)

ちゃんと、yoshioオブジェクト内のaccountオブジェクト(構造体)まで、階層になって見れてます


## printとdumpを比較してみた
他にもdumpを使ったほうが便利なケースはないか検証してみました


### 辞書

```swift
let dict: [String: String] = ["職業": "エンジニア", "趣味": "ゲーム"]
print(dict)
print("-------")
dump(dict)
```

![dict.png](https://qiita-image-store.s3.amazonaws.com/0/30423/bc0295ba-6a36-b092-1d57-c340e7f22e1e.png)

printのほうがkey: valueの形になっているので、見やすい


### 配列

```swift
let primeNumber: [Int] = [2, 3, 5, 7, 11, 13, 17, 19]

print(primeNumber)
print("-------")
dump(primeNumber)
```

![array.png](https://qiita-image-store.s3.amazonaws.com/0/30423/f40cc6f9-c6ea-f8a3-8ce5-93d79fa2e3d0.png)

どっちでもいい..。
ただ、dumpだと配列の個数まで見れるので、ケースによっては便利かも。あと多重配列のときとか


### タプル

```swift
let tuple: (String, Int) = ("hiroshi", 29)
print("-------")
print(tuple)
dump(tuple)
```

![tuple.png](https://qiita-image-store.s3.amazonaws.com/0/30423/9e76b1c0-f697-dd46-0ff4-704733def781.png)

どっちでもいい..。

### 構造体

```swift
let account: Account = Account(id: 001, email: "hiroshi@example.com")
print("-------")
print(account)
dump(account)
```

![struct.png](https://qiita-image-store.s3.amazonaws.com/0/30423/f70e4528-2783-f79a-06ac-f06097d8e892.png)

どっちでもいい

### ためしに..
ViewControllerの`self.view.frame`を出力したところ

```
print(self.view.frame)
dump(self.view.frame)
```

![CGRect.png](https://qiita-image-store.s3.amazonaws.com/0/30423/ac39fc3e-b119-ce29-d2aa-b66b91cf9fd0.png)

**d..dumpのほうが見やすい!**

printの場合、値だけが出力されますが、
dumpだとCGRect内の`origin: CGPoint`、`size: CGSize`プロパティまで掘って見やすく表示してくれるようです。
PYNQ に Polyphony をインストールして使ってみる

PYNQ が IPython あらため Jupyter をつかっているとのことで、ここは Python つながりで、Polyphony をつかって Python のコードを verilog に変換してみます。
ついでに Zybo とかその後 i386 の docker でのチャレンジも

# Polyphony のインストール
pip3 で簡単にインストールできます。

```
$ pip3 install polyphony
```

# Jupyter へアクセス
PYNQ は Samba を使っているので  pynq:9090 で Windows からアクセスできたりします。
![Juypter](https://qiita-image-store.s3.amazonaws.com/0/99921/bcc1dc2e-8f0f-169b-884e-f4ad20f92506.png)

## Folder をつくる
New のメニュから Folder を選択して Folder を作ります。ここでは Polyphony という名称に変えました。
![create folder](https://qiita-image-store.s3.amazonaws.com/0/99921/131c16fe-429c-73d1-4dda-11e317e9f657.png)

## list11.py を入力
New で Text File を選び(Python 3 は選ばない) 下の Python ソースを打ち込みます。できたソースは untitled.txt なので rename して list11.py にしておきます。

```python:list11.py
from polyphony import testbench


def sum(l1:list):
    def sub_sum(l2:list):
        def sub_sub_sum(l2:list):
            s = 0
            for l in l2:
                s += l
            return s
        return sub_sub_sum(l2)
    return sub_sum(l1)

def list11(x):
    data1 = [x, 1, 2]
    data2 = [x, 1, 2, 3, 4, 5]
    s1 = sum(data1)
    s2 = sum(data2)
    return s1 + s2 + x

@testbench
def test():
    assert 18 == list11(0)
    assert 21 == list11(1)
    assert 24 == list11(2)

test()
```

手元にソースがある場合は upload もできます。

## コンパイル
今度は New で Python3 を選びます。これで、jupyter の UI が使えます(マスマティカ風の UI）。
まずは必要なモジュールの import

```
import polyphony
import subprocess
```

polyphony がインストールされていれば import がうまくいきます。続いて polyphony でコンパイル

```
subprocess.check_output(["polyphony", "list11.py"])
```

これで list11.py がコンパイルされ Folder に戻ってみると polyphony_out.v が生成されています。

![2016-10-15 (7).png](https://qiita-image-store.s3.amazonaws.com/0/99921/55fbb011-23f8-f665-d1bc-8e86803a4672.png)

### え？それだけ！？
そう、それだけです。ここでは verilog の中身は見ません。興味のある人は次の記事を参考にしてください。

[フィボナッチを求める回路をPolyphonyとMessagePack-RPCでFPGAに実装してみた] (http://qiita.com/ikwzm/items/48acfa3003522cf0c7a3)
[Pythonベースの高位合成コンパイラPolyphonyを試してみた](http://shtaxxx.hatenablog.com/entry/2015/11/12/225637)

いろんな意味で今後に期待ということで許してください。

# Docker でもやってみた。

```
docker run -d -p 8888:8888 -v `pwd`/notebooks:/home/jovyan/work -e GRANT_SUDO=yes --user root mokemokechicken/jupyter-tensorflow 
```

jupyter の初期画面でパスワードを必要とするなら -e PASSWORD="ぱすわーど" も必要。後は同じなので割愛。

[DockerでJupyter Notebook環境をお手軽に準備する(TensorflowやGraphvizもあるよ）](http://qiita.com/mokemokechicken/items/18a760f4d7fe8a26351c)
をつかうと graphviz も入っているみたい。こっち使えばよかった、、、

# Zybo でできるか？
素の jupyter なら Zynq でもできるんじゃないかな？と思って試してみました。
大事なことは /etc/rc.local の /root/4_boot_leds.sh をコメントアウトしておくこと。その他、fpga をさわりにいくようなことをしたらだめ。(Zybo 用の fpga.bit がこの時点でないから）

PYNQ の image に boot.bin u-boot.img uEnv.txt zybo-zynq7.dtb を入れ替える。uImage と partition2 の rootfs はそのまま。すると、Linux としてはとりあえず立ち上がる。

おーすると jupyter だけはとりあえず立ち上がる。その先は同じだから割愛。
IAMポリシーでaws:SourceIpを使うとRDS暗号化できない

AdministratorAccess権限を持っているIAMユーザーで[RDSの暗号化]が何故かできなくて困っていました。
全てのIAMユーザーは (セキュリティ対策として) IAMグループのポリシーで以下の接続IP制限をつけていました。

```json:IPSourceRestriction
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "*",
            "Resource": "*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "xxx.xxx.xxx.xxx/32",
                        "yyy.yyy.yyy.yyy/32"
                    ]
                }
            }
        }
    ]
}
```

## なんでか？

[AWSリソースの管理に関するポリシーの例] に以下の注意書を発見しました。

> Important
> 
> aws:SourceIp 条件キーは、テストされた API をユーザーとして直接呼び出す場合に IAM ポリシーでのみ機能します。代わりにサービスを使用してターゲットサービスを呼び出した場合、ターゲットサービスは元のユーザーの IP アドレスではなく呼び出し元サービスの IP アドレスを認識します。これは、AWS CloudFormation を使用して Amazon EC2 を呼び出すことでインスタンスを自動的に作成した場合などに生じることがあります。現在のところ、IAM ポリシーで評価を行うために、発信元サービスを通じて元の IP アドレスをターゲットサービスに渡す方法はありません。これらのタイプのサービス API 呼び出しでは、aws:SourceIp 条件キーを使用しないでください。

IP制限外したら[RDSの暗号化]付けてRDS作れたので、これが原因だった様子。

## 解決案

以下の様に、特定のサービス (今回はKMS) をIP制限から外しました。


```json:IPSourceRestriction
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "*",
            "NotResource": "arn:aws:kms:*",
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "xxx.xxx.xxx.xxx/32",
                        "yyy.yyy.yyy.yyy/32"
                    ]
                }
            }
        }
    ]
}
```

> 除外したサービスには指定外の接続IPからでも操作出来るようになってしまうので、ちょっと微妙...


[RDSの暗号化]:https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Overview.Encryption.html
[AWSリソースの管理に関するポリシーの例]:http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies_examples.html
CocoaPodsの作業ディレクトリ"Xcode project directory"

https://cocoapods.org/
で、GET STARTEDを読んで始めるときに、

>Search for pods (above). Then list the dependencies in a text file named Podfile in your Xcode project directory:

どこどこ、と思ったので、調べてφ(..)メモメモした記事です。

## Xcode project directory

Xcodeでプロジェクトを作ったときに、.xcodeproj が存在するディレクトリです。

## Podfileを作る

そのフォルダでPodfileの雛形を作りましょう。

```
pod init
```

すると、Podfileというファイルができるので、次のコマンドで開きます

```
open -a Xcode Podfile
```

開いたファイルは以下のようになっているので

```
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'MyApp' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

  # Pods for MyApp

end
```

ここからはCocoaPodsのGET STARTEDに戻って、同じように
podから始まる行を追加します。

```
platform :ios, '8.0'
use_frameworks!

target 'MyApp' do
  pod 'AFNetworking', '~> 2.6'
  pod 'ORStackView', '~> 3.0'
  pod 'SwiftyJSON', '~> 2.3'
end
```

以上です！
安裝 Composer

![](https://getcomposer.org/img/logo-composer-transparent.png)

Composer 是 PHP 的套件管理工具，今天就來利用假日裝一下，
在開始前，首先電腦要先有裝有 PHP 的 cli 工具，怎麼裝 PHP 這邊就不敘述了。

## 下載並產生 composer.phar 檔

先選一個自己方便的資料夾，我是直接在使用者根目錄操作：

```
cd
```

於是直接下載 installer ，並透過 php 執行它，就會得到一個 composer 的執行檔案：

```
curl -sS https://getcomposer.org/installer | php
```

這時候根目錄就會多出一個

```
composer.phar
```

這樣一個檔案

## 搬移

接著，我們把它搬到他應該去的位置：

```
sudo mv composer.phar /usr/local/bin/
```

這時候會需要你的管理者密碼，直接輸入即可完成搬移


## 設定指令

接著要設定指令去執行 `composer.phar` 這個檔案

於是來編輯這個檔案：

```
vim ~/.bash_profile
```

在檔案最後面加上一行 alias ，指向 composer.phar 這個檔案：

```
alias composer="php /usr/local/bin/composer.phar"
```

儲存並關閉

## 讓變更生效

有兩個方式可以讓這個變更生效：

- 可以關閉目前的 terminal session ，另開新視窗
- 執行 `source ~/.bash_profile` 即可
ContainerViewControllerを使うときの初期化の順序がわかりにくい

<img width="832" alt="Main_storyboard_—_Edited7.png" src="https://qiita-image-store.s3.amazonaws.com/0/12939/4d0d5bcd-34bd-c913-943f-debd71f20983.png">

![アクティビティ図0.png](https://qiita-image-store.s3.amazonaws.com/0/12939/a011e06a-8aec-90b3-1c2b-3580d02e0efe.png)

StoryBoardの話です。初期化の順序を意識しておかないと、子ビューコントローラのframeがおかしいまま親ビューコントローラの中に表示されたりします。アクティビティ図にまとめてみました。おかしいところがあればご指摘下さい。

```swift:ViewController.swift
//セグエ先のPreviewViewControllerのプロパティを取得する方法
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "preview" {
            let previewViewController = segue.destinationViewController as! PreviewViewController
            //PreviewViewControllerのプロパティをprintする
            print("MainViewController@prepareForSegue: ", previewViewController.view.frame)
        }
    }
```

なお`prepareForSegue`が実行されるタイミングは早く、`viewDidLoad`や`viewDidAppeared`よりも先に実行されます。

したがって、このときの子ビューコントローラの**frame**などは、まだ親ビューコントローラに`addSubView`される前の値のため、この**frame**を使ってビューを作ったりすると変なことになります。

### 2016/10/17

図はこうかな？

![アクティビティ図0.png](https://qiita-image-store.s3.amazonaws.com/0/12939/8769c135-fb39-288a-8e15-8e711611166c.png)

---
ブログやっています：http://weed.nagoya
Heroku の MongoDBアドオン 『mLab MongoDB』を使う

## アドオンを有効にし、DBにアクセスする準備をする

### クレジットカード情報の登録
Herokuアカウントにクレジットカード情報を登録していないとアドオンを使えない。
Herokuダッシュボードの右上のユーザーアイコンをクリックし、**Account settings** をクリック。
**Billing** を選択し、Billing Informationでクレジットカード情報を登録する。

### mLab MongoDB アドオンを追加
Herokuのアプリのページ ⇒ Resources ⇒ Add-ons で **Find more add-ons**ボタンをクリック。
**mLab MongoDB** のパネルをクリック。
**Install mLab MongoDB** ボタンをクリック。
**インストールするアプリを選択**し、**continue**をクリック。

Plan nameが **Sandbox - Free**になっていることを確認して、**Provision**をクリック。

### mLabのパスワードを設定
Add-ons に 『mLab MongoDB :: Mongodb』が追加されているはず。
これをクリックすると、mLab のページに飛ぶ。
ここでユーザー名/パスワードの設定などを行う。

右上の **user: "heroku_xxxxxxxx"** をクリックする。 

```
 { user: "heroku_xxxxxxxx", account: "heroku_xxxxxxxx" }
```

Contact Info画面が表示されるので、**パスワードを設定**し、**Update contact info**ボタンをクリックする。

## Robomongoからアクセス

[juliashibalkoさんのコメント](https://github.com/paralect/robomongo/issues/949#issuecomment-237190894)通りにやればアクセス出来る。

元になる文字列は Herokuダッシュボードの Settings ⇒ Config Variables ⇒ MONGODB_URI にセットされているので、これを元に Robomongo の Connection Settings ダイアログに値をセットする。

```
mongodb://heroku_dxxxxx:pppppppppppppppppppppppp@dxxxxx.mlab.com:3xxxx/heroku_dxxxxx
          UserName      Password                 Address         Port  Database
```

Connection Settings ダイアログ

| タブ | 項目 | 値 |
|:-:|:-:|:-:|
| Connection  | Address  | dsxxxxx.mlab.com  |
|             | Port     | 3xxxx |
| Authentication  | Database  | heroku_xxxxx  |
|   | UserName  | heroku_xxxxx  |
|   | Password  | @dxxxx.mlab.comの前の長ったらしい文字列  |

### これから

API Keyの意味だとか、DBユーザーとの関係だとか、まだよく分からない。
gopkg.inに、プルリク送るときの開発レポジトリ

オリジナルの開発自体はGitHubで行われていて、
`gopkg.in`で管理されてるレポジトリにプルリクを送りたい時に以下のような問題に直面します。

## ■ 通常のPR

[github.com/go-redis/redis] (https://github.com/go-redis/redis)をforkして、[github.com/yyoshiki41/redis](https://github.com/yyoshiki41/redis)とした場合、
ローカルマシン上の`$GOPATH/src/github.com/yyoshiki41/redis`ディレクトリで開発を行う。

### 問題点

以下のように開発すると、

```bash
$ cd $GOPATH/src/github.com/yyoshiki41/redis
$ vim redis.go
```

各所に下記のようなimport文があり、自分のレポジトリ下で変更した差分が取り込めない問題に直面します。

```go
import "gopkg.in/redis.v5/internal"
```

`gopkg.in/redis.v5`を`github.com/yyoshiki41/redis`に一括置換したりするのもイケていない、
`gopkg.in/redis`以下で開発してpatchファイル作るとかもイケてない。。


## ■ 解決策

「`gopkg.in`以下に同期する自分のレポジトリを追加する。」

### 手順

１. `go get`

```bash
$ go get gopkg.in/ORIGINAL_REPOSITORY
```

２. GitHub上でfork

https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY をforkして、自分のレポジトリに追加する。


３. 同期するレポジトリを追加

```bash
$ cd $GOPATH/src/gopkg.in/ORIGINAL_REPOSITORY
$ git remote -v
origin	https://gopkg.in/ORIGINAL_REPOSITORY (fetch)
origin	https://gopkg.in/ORIGINAL_REPOSITORY (push)
# `myrepo`を追加する
$ git remote add myrepo git@github.com:YOUR_USERNAME/YOUR_FORK
$ git remote -v
myrepo	git@github.com:YOUR_USERNAME/YOUR_FORK (fetch)
myrepo	git@github.com:YOUR_USERNAME/YOUR_FORK (push)
origin	https://gopkg.in/ORIGINAL_REPOSITORY (fetch)
origin	https://gopkg.in/ORIGINAL_REPOSITORY (push)
```

４. リモートへpush

```bash
$ git checkout -b feature
$ git commit -m "Add feature"
$ git push myrepo feature
```

これで無事、`github.com/YOUR_USERNAME/YOUR_FORK`へのpushが完了し、プルリクを作成して終わりです。

`myrepo`の名前はなんでもOKですが、`upstream`ではないと考え(他の要件での衝突も考え)避けています。
Swift4でDispatchQueueを使う

Swift2 -> 3の移行メモ的な記事でしたが、Swift4でもまだ使えるようなので、ちょっと加筆しました(18.09.30)。iosのUIを更新する処理は単一のスレッド(main thread)から実行しなければならない、というルールに従って処理を記述する例です。

```swift
DispatchQueue.global().async {
    // 重たい処理
    DispatchQueue.main.async {
    	// UIを更新する処理
    }
}
```

例えば、1秒おきにラベルのテキストを更新する処理だと以下のようになります。

```swift 
var i = 1
DispatchQueue.global().async {
    while true {
        Thread.sleep(forTimeInterval: 1)
        DispatchQueue.main.async {
            self.label.text = "\(i)"
            i += 1
        }
    }
}
```

ちなみに、同じ処理をTimerで実装すると以下のようになります。上記例の場合、こちらの方が（わざわざsleepを入れるより）適していそうです。

```swift
var i = 1
Timer.scheduledTimer(withTimeInterval: 1, repeats: true) {_ in
    self.label.text = "\(i)"
    i += 1
}
```     


--

http://stackoverflow.com/questions/37801370/how-do-i-dispatch-sync-dispatch-async-dispatch-after-etc-in-swift-3
Dueling Networkを実装する（１）

##環境

GPU GTX1070
ubuntu 14.04
chainer 1.14.0
など
##はじめに
最近numpyを復習しているが、その過程で昔実装したDueling Networkが間違っていたのではないかという疑念が湧いてきた。そこで改めてDeuling Network固有の層を確認し、問題があればコードを修正する。

Z. WangらのDueling Networkの論文は以下。
https://arxiv.org/pdf/1511.06581v3.pdf
この解説を簡潔にまとめています。
http://www.slideshare.net/ssuser07aa33/introduction-to-dueling-network
##DQNからDueling Networkへ
今回実装するDueling NetworkはMnihらのDQN論文(2015, nature)に対して出力層を変更しただけのものとする。つまりDouble DQN、あるいはPriorized Replayなど論文中の他のテクニックは実装しない。
##実装部分の概要
以下の図はMnih(2015)らのDQNとDueling Networkを比較したものである。
![qiita_DN01.png](https://qiita-image-store.s3.amazonaws.com/0/116706/fb75f5d0-74b7-132c-b448-8b990c24dfa6.png)
DQNはconv層３つのあと、全結合層を経て出力のQ値へとつながっている。一方でDueling Networkではconv３層のあと２つの全結合に分かれ、一方がVの算出、もう一方がAの算出となっている。最後にこれらからQ値を求めている。この詳細が以下の図である。
![qiita_DN02.png](https://qiita-image-store.s3.amazonaws.com/0/116706/b2f95c75-f906-505f-aec2-bb6857b0fffc.png)
VおよびAを求めるまではlinearにReLuなので問題ない。最後のQ値の層だけ既存のconnectionを修正して新たに作る必要がある。前回と同様にforward関数、backward関数などを修正することで図中の数式を実現する。

##bilinear.pyを確認する。
今回は２つの流れを結合させるので、`bilinear.py`を修正することになる。そこで`chainer/functions/connection/bilinear.py`の適当なところに

```py
print 'W.shape',
print W.shape
```

などとプリントアウトしたところ、以下の図ような仕組みになっているみたい。![bilinear_for.png](https://qiita-image-store.s3.amazonaws.com/0/116706/a3cc89d9-88f3-dfe5-0cf0-c62f66475ee3.png)
![bilinear_back.png](https://qiita-image-store.s3.amazonaws.com/0/116706/5d3df6aa-e66b-87d8-e49b-42788836c13c.png)
今回はforwardもbackwardも演算がbilinearのそれと全く違うので、重要なのは渡されるデータのサイズくらいだろう。特にforward()で重みWを使用しない。しかし戻り値のvariableオブジェクトにWとかgWとかがないとエラーが出るかも知れないので、適当な値を入れておく。

以下、その（２）に続く。
一般ユーザからrootになってX11Forwardする

環境変数を適切に設定することで、一般ユーザに割り当てられた`$DISPLAY`を使うことができる。

```shell-session
[user@localhost ~] $ ssh -XY user@example.com

[user@example.com ~] $ echo $DISPLAY
localhost:10.0
[user@example.com ~] $ su -

[root@example.com ~] $ export XAUTHORITY=/home/user/.Xauthority
[root@example.com ~] $ export DISPLAY=localhost:10.0
```
勝敗予想モデルの入力ベクトル形式の変更 : TensorFlow将棋ソフト開発日誌 #7

前回 [データ読み込みの非同期化と勝敗予想モデルの進捗 : TensorFlow将棋ソフト開発日誌 #6](http://qiita.com/YusukeSuzuki@github/items/f5ce32b5fcd08c0f5e23)
目次 [TensorFlow将棋ソフト開発日誌 目次](http://qiita.com/YusukeSuzuki@github/items/30bcaf7b14f015493121)

今回のあらすじ
====================================================

（あまり面白い話では）ないです

- 入力ベクトルの形式を変える理由
- 新しい入力ベクトルの形式
- 簡易測定
- 次の予定

入力ベクトルの形式を変える理由
====================================================

今までのモデルは大雑把に言って以下のような感じでした

```
9x9xコマの状態ベクトル

コマの状態ベクトル = [そのコマに王があるか, そのコマに王を動かせるか, そのコマに玉があるか, そのコマに玉が動かせるか, そのコマに角があるか, そのコマに角が動かせるか, そのコマに角があるか, そのコマに角が動かせるか, そのコマに馬があるか, そのコマに馬が動かせるか, そのコマに馬があるか, そのコマに馬が動かせるか, ... 中略 ... ,そのコマにと金があるか, そのコマにと金が動かせるか]

各次元において自分のコマは1, 相手のコマは-1が代入される。コマが存在しなければ0が代入される。成りゴマ、持ち駒によって自分、相手のコマの持ち数が変動する場合、自分のコマを先、相手のコマを後に詰めていく。
```

こうしている理由

- コマを別次元に分離することでコマ種についての分離性能を向上したい
- 動き次元を与えることで（単にコマの配置を入力した時のような）コマの動きのルール（すでに人間がわかっているデータ）をニューラルネットに学習させる無駄を排除したい

この方法のデメリット

- 自分のコマと相手のコマが同じ次元にあり得るので分離性能の低下が予測される
- 「自分のコマを先、相手のコマを後にして前方に詰める」という手順があるため似たような盤面に対してベクトルの距離が遠くなりうる
- 自分と相手を入れ替える処理がめんどい

新しい入力ベクトルの形式
====================================================

前節事由により以下のようにしました

```
9x9x（自分のコマの状態ベクトル+相手のコマの状態ベクトル)

コマの状態ベクトル = [そのコマに王（玉）があるか, そのコマに王（玉）を動かせるか, そのコマに角があるか, そのコマに角が動かせるか, そのコマに角が成りで動かせるか, そのコマに角があるか, そのコマに角が動かせるか, そのコマに角が成りで動かせるか, そのコマに馬があるか, そのコマに馬が動かせるか, そのコマに馬があるか, そのコマに馬が動かせるか, ... 中略 ... ,そのコマにと金があるか, そのコマにと金が動かせるか]
```

つまり

- 自分のコマと相手のコマでコマ状態ベクトルを分離した
- 成りについて成りゴマの動きベクトルに状態を代入していたが専用の次元を作った

これで分離性能が上がるはず。たぶん。

デメリット

- 次元が増えたので学習コストが増える
- スパース性が上がったのでニューラルネットの学習が困難になるかもしれない
- まだ完全に「近い状態に対して近いベクトル」になっていない

簡易測定
====================================================

測定と言いつつ比較のための前回のログデータを保存してなかった。時間がないのでスクリーンショットベースで。今までのモデルだと以下のような感じでした。２５０００イテレーションあたりを比べます。

### 前回までのモデルでのスクリーンショット

ロス、２５０００イテレーションで0.5付近
<img width="983" alt="スクリーンショット 2016-10-10 21.03.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/25288/adacddfb-b591-d6db-e129-9820324ced43.png">

正答率、２５０００イテレーションで0.64付近
<img width="979" alt="スクリーンショット 2016-10-10 21.02.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/25288/237c7fd8-8c71-fc78-65d1-82e535a11dc4.png">

### 今回のモデルでのスクリーンショット

<img width="1257" alt="スクリーンショット 2016-10-13 19.44.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/25288/186b294e-2ec9-a909-f6a5-19c8b216b7e9.png">

ロス、２５０００イテレーションで0.45付近
<img width="1020" alt="スクリーンショット 2016-10-15 16.43.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/25288/8687b6ac-e39a-2439-c756-7c905b3363a9.png">

正答率、２５０００イテレーションで0.69
<img width="1013" alt="スクリーンショット 2016-10-15 16.42.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/25288/831d0096-1c38-cf26-41b6-97bed9b59613.png">

バッチのランダムのことを考えると有意に差がある気はしない。けれども性質としては合理的だしプログラムも組みやすいし学習も出来ているので今後はこの入力ベクトルの形式で作業を進めます。

次の予定
====================================================

- 学習サンプルとテストサンプルの整理
- 左右反転の学習
- 後手の学習
- サンプルを消費し尽くしたら学習を止める処理の実装
  - 今まで実験的に学習したモデルは使い捨てていたがエポックを導入して複数回学習させたりする
  - そのためにモデルのセーブとレストアを実装する
- ここまでの実装で「学習 -> 学習データとは別の動作で試験」をやってみる

ここまで出来たら一旦勝敗予測モデルは区切りをつけて指し手モデルに着手していきます。
Raspberry Pi  モニタなしキーボードなしマウスなし パソコンのみでRaspberry Piのデスクトップにアクセスする。

##### 2019/3/1 動作確認済み
##### 2019/8/24 思ったより人気だったので、改良。
##### 2020/4/27 更新&動作確認


# はい、早速RaspberryPi君が届いたのですが...

# まだ、モニタ届いてない、有線キーボード届いてない、有線マウス届いてない、でもRasPi早く使いたい！！！

そこで、VNCをインストールしてキーボード、マウスなしで接続することに成功しました。
では、方法を説明します。

## IPアドレス検出
RaspberryPiをコンセントに接続し起動します。
念のため、2分待ってから、MacまたはLinuxで以下のコマンドをターミナルで実行してください。
```arp -a
```
実行できたら、
![スクリーンショット 0028-10-15 16.38.21.png](https://qiita-image-store.s3.amazonaws.com/0/128374/fe47e3fe-85b4-a622-c54f-1075355ec3f1.png)
このように出てくるはずです。
僕の場合だと、上から、```192.168.10.25```、```192.168.10.26```、```192.168.10.31```と出てきているIPアドレスをメモします。
また、後ろの２つは、メモしなくて良いです。
##### 判断基準
恐らく、192.168.XX.OOという形のようなIPアドレスが出てくると思います。
今回は、先頭が、192.168かつ、XXの部分が、決まっているもの（自分の場合だと、XXが10のもの）をメモします。



次に、
``` ssh pi@[IPアドレス]```
をターミナルで実行します。
[IPアドレス]の部分には、先ほどメモした、IPアドレスを一つずつ当てはめてください。
僕の場合だと、

```
ssh pi@192.168.10.25
ssh pi@192.168.10.26
ssh pi@192.168.10.31
```
を順番に実行します。
このコマンドは、少し時間がかかるので、待ってください。

その中で、接続できた物がRaspberryPiです。
この接続できたIPをメモしてください。

接続できた場合は、

```
The authenticity of host '192.168.10.44 (192.168.10.44)' can't be established.
ECDSA key fingerprint is *******************************.
Are you sure you want to continue connecting (yes/no)?
```
というように、出ます。このように出たら、ctrl+cでキャンセルしてください。
接続できない場合は、
`ssh: connect to host 192.168.10.32 port 22: Connection refused`
というように、または、
`ssh: connect to host 192.168.10.39 port 22: Operation timed out`
というように出ます。

あとは、VNCサーバーを立てるだけです。

## SSH

```
ssh pi@[IPアドレス]
```
に先ほど成功したIPアドレスを当てはめを、実行して、yes/noが聞かれたらyesを答えます。
パスワードを入力します。
パスワードは、初期段階では、raspberryです。
これで、ssh成功です。
## VNCざーばー

~~sudo apt-get tightvncserver~~
（2017年10月16日追記：教えていただきました．@G-awaさんありがとうございました）
先ほどのsshに入った状態で下のコマンドを実行し、

```
sudo apt-get install tightvncserver
```

でvncサーバーをインストールします。

```
sudo tightvncserver
```
でserverを起動します。
初めての場合は、VNCに設定するパスワードを決めます。
忘れないようにしましょう。

## VNC接続

<img width="580" alt="スクリーンショット 2017-03-30 10.31.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/128374/11150819-3054-ca5c-481c-8b55f9c07fb8.png">

デスクトップをクリックして 移動→サーバーに接続　を選択。

<img width="501" alt="サーバへ接続.png" src="https://qiita-image-store.s3.amazonaws.com/0/128374/511142fd-925e-2500-0283-e2469835467a.png">

これで、パスワードを聞かれるので、先ほど決めたパスワードを入力します。

これで、おそらくRaspberryPiデスクトップが現れたはずです。
#最後に
あっ，これ使えばモニタもキーボードもマウスも買わなくてよかったのに．（泣）

最後までありがとうございました。
質問等はコメント欄にお願いします。
Android6.0対応でのPermissionの落とし穴

#Android6.0でのRuntime-Permissionの落とし穴

Android6.0から、アプリで使うpermission(権限)のうちいくつかは、実行時に権限を確認しないといけなくなったのはご存知の通り。

アプリで使うpermissionは **AndroidManifest.xml**に記述すれば良いが、
実際には使用しているライブラリが権限を追加する場合があり、6.0の場合は
**追加した覚えのないpermissionがアプリに付与されている**ことがあるので注意が必要。

例えば以下の例では、権限をなにも付与していない

```AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="tone.ne.jp.myapplication">
    <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"   
```



しかし,ライブラリとしてplay-service-locationを使っている場合、設定アプリから権限を確認してみると、
**位置情報**と**ストレージ**の権限が付与されている。

```build.gradle
(省略)
dependencies{
   compile "com.google.android.gms:play-services-location:7.5.0"
}
```

これはビルド時にライブラリが使うpermissionをAndroidManifestに勝手に付与してるためで、permissionがmergeされた実際のmanifestは
**app/build/intermediates/manifests/full/debug/AndroidManifest.xml**を見ればわかる

```build/intermediates/manifests/full/debug/AndroidManifest.xml
（省略）

    <!-- Include required permissions for Google Maps API to run -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<android:uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
```

さらに詳しい説明を見たい場合は、
**app/build/outputs/logs/manifest-merger-debug-report.txt**
にて、mergeされた権限の情報をみることができる。
(READ/WRITE EXTERNAL_STORAGEを確認できる)

```manifest-merger-debug-report.txt
 （省略）
 ADDED from [com.google.android.gms:play-services-maps:7.5.0]
   ../play-services-maps/7.5.0/AndroidManifest.xml:21:22-64 uses-permission#android.permission.WRITE_EXTERNAL_STORAGE
 
 android:uses-permission#android.permission.READ_EXTERNAL_STORAGE
IMPLIED from /Users/user1/AndroidStudioProjects/MyApplication3/app/src/main/AndroidManifest.xml:2:1-31:12 reason: com.google.android.gms.maps requested WRITE_EXTERNAL_STORAGE
```

ライブラリが付与するpermissionを取り除きたい場合は、以下のようにAndroidManifest.xmlで取り除くことができる。
（ストレージ権限は確認されなくなる）

```AndroidManifest.xml
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
                     tools:node="remove"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
                     tools:node="remove"/>
```

ただし,ライブラリがpermissionを付与されているかを確認するような実装になっているとは限らないので、注意が必要。当然ながら、**SecurityException**を吐く場合もあるので、**あくまで自己責任**で注意してpermissionをOFFにするべき。
ドットインストール勉強用rails環境構築 自分用メモ

ローカル開発環境の構築 [Windows編] (全10回)がベース
http://dotinstall.com/lessons/basic_localdev_win

virtualBox、vagrantインストール
vagrant init bento/centos-6.7
vegrantのCentOS6.7のロケール変更
　http://saosao-0706.hatenablog.com/entry/2016/04/03/205246

centos6.7に
sudo yum -y install git gcc gcc-c++ openssl-devel readline-devel libffi-devel 
git clone https://github.com/dotinstallres/centos65.git
cd centos65
./run.sh
php -v
python --version
ruby -v
exec $SHELL -l
ruby -v
mysql --version
sudo service httpd status
 sudo yum -y groupinstall "Desktop"
 sudo yum -y groupinstall "Japanese Support" "General Purpose Desktop"
sudo vi /etc/inittab
i でインサートモードに
init:3:をinit:5:に変更しescキーを押しshift+zを２回押す
sudo shutdown -r now
sudo yum install rails -v 4.1.1
sudo yum install firefox
CentOSにMeCabをインストールして使う

### CentOSにMeCabをインストールして使う方法。

CentOS環境で形態素解析をしたいということで、MeCabをRubyで使う。

やり方は、ほとんど下記投稿に書いてあることの踏襲。
http://qiita.com/xkumiyu/items/50e449235985ca1b0271
だが、いくつか止まってしまうポイントがあったので補足。

### Groongaレポジトリ追加
```
$ sudo rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm
```
### mecab本体と辞書ファイルをインストール
```
$ sudo yum install mecab mecab-ipadic
$ sudo yum install mecab-devel
```
### 確認
```
$ mecab
すもももももももものうち
すもも   名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも  名詞,一般,*,*,*,*,もも,モモ,モモ
も 助詞,係助詞,*,*,*,*,も,モ,モ
もも  名詞,一般,*,*,*,*,もも,モモ,モモ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
うち  名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS
```
### nattoをインストール
```
$ gem install natto
$ gem install mecab #不要かも
```
### libmecab.soの場所を探す
```
$ sudo find / -name libmecab.so*
/vagrant/mecab-0.996/src/.libs/libmecab.so
/vagrant/mecab-0.996/src/.libs/libmecab.so.2
/vagrant/mecab-0.996/src/.libs/libmecab.so.2.0.0
```
### libmecab.soにPATHを通す
```
$ echo 'export MECAB_PATH=/vagrant/mecab-0.996/src/.libs/libmecab.so' >> ~/.bash_profile #so.2に通すとうまくいかなかった
$ source ~/.bash_profile
```
### mecabとmecab辞書の文字コードをshift-jisからutf-8に変更
```
$ sudo ./configure --with-charset=utf8
```
### rubyファイルを書いて実行
```ruby:mecab.rb
require 'natto'

text = 'すもももももももものうち'
nm = Natto::MeCab.new
nm.parse(text) do |n|
  puts "#{n.surface}\t#{n.feature}"
end
```
```
$ ruby mecab.rb
すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
        BOS/EOS,*,*,*,*,*,*,*,*
```
という感じでした。