OmniAICreator/Qiita-1.07M huggingface dataset:
laravel5.1から5.2へのアップデート


個人的にlaravel5.1で開発していたものを5.2にアップデートしたのでその時に詰まったのをメモ。

基本的に以下を参照
[Upgrade Guide - Laravel - The PHP Framework For Web Artisans](https://laravel.com/docs/5.2/upgrade#upgrade-5.2.0)

##composer.jsonの更新
composer.jsonに下記を追記


```cmposer.json
"require": {
    "php": ">=5.5.9",
    "laravel/framework": "5.2.*", //変更
}
"require-dev": {
	:
	:
    "symfony/dom-crawler": "~3.0", //追記
    "symfony/css-selector": "~3.0" //追記
    }
```


##auth.phpの修正
>You should update your `config/auth.php` configuration file with the following: https://github.com/laravel/laravel/blob/master/config/auth.php

との事。自分は`auth.php`は変更していなかったのそのまま持ってきて置き換た。


##エラー
これで`composer update`したらエラーが出た。


```
Script php artisan clear-compiled handling the pre-update-cmd event returned with an error

                                                                                               
  [RuntimeException]                                                                           
  Error Output: PHP Fatal error:  Uncaught exception 'ReflectionException' with message 'Class log does not exist' in /vagrant/dokoiko/vendor/laravel/framework/src/Illuminate/Container  
  /Container.php:738
  
  Stack trace:
                                                                                   
  #0 /vagrant/dokoiko/vendor/laravel/framework/src/Illuminate/Container/Container.php(738): ReflectionClass->__construct('log')                                                           
  #1 /vagrant/dokoiko/vendor/laravel/framework/src/Illuminate/Container/Container.php(633): Illuminate\Container\Container->build('log', Array)                                           
  #2 /vagrant/dokoiko/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(687) : Illuminate\Container\Container->make('log', Array)                                         
  #3 /vagrant/dokoiko/vendor/laravel/framework/src/Illuminate/Container/Container.php(853): Illuminate\Foundation\Application->make('Psr\\Log\\LoggerI...')                               
  #4 /vagrant/dokoiko/vendor/laravel/framework/src/Illuminate/Container/Container.php(808): Illuminate\Container\Container->resolveClass(Object(ReflectionParameter))                     
  #5 /vagrant/dokoiko/vendor/laravel/framework/src/Illuminate/Container/Container.php(779): Illuminate\Container\C in /vagrant/dokoiko/vendor/laravel/framework/src/Illuminate/Container/Container.php on line 738
```

結果としてどのサイトを参考にしたかは忘れてしまったが、`.env`に記述されていた`EMAIL_NAME`が

```
EMAIL_NAME=email name
```

になっていたのを

```
EMAIL_NAME='email name'
```

にしたら直った。スペースが入っていることがダメだったらしい。
WindowsのDLLをGoで作る

と銘打っていますが、薄いラッパーを被せてlib*.aをリンクしているのでピュアGoではないです…すいません。

ファイル一式とビルド用Makefileは
[nocd5/go_dll_sample](https://github.com/nocd5/go_dll_sample)
に置いておきます。

## 背景
Go1.7からWindowsでも`-buildmode=c-archive`がサポート予定ですが、
`c-shared`は未だサポートされずDLLの作成もできません。
しかし、staticリンク用のインポートライブラリ(`lib*.a`)が作れるのであれば
それをリンクして簡単にDLLを作れるんじゃないかな～と思ってサンプルを作ってみました。

## 環境

- Windows10 HOME 64bit
- Go 1.7rc3 32bit
- TDM GCC 5.1.0 32bit

## ファイル構成

```bash
+--dll
|  +--gofib.cpp
|  +--gofib.def
|
|--exe
|  +--main.cpp
|
+--go-fib
   +--main.go
```

ファイル構成は上記のようになっています。
`exe`以下は作成したDLLを読み込むサンプルプログラムなので、DLL作成に必要なのは`go-fib`以下と`dll`以下です。
`go-fib`はライブラリの本体、`dll`は薄いラッパーとなっています。

### `go-fib`の中身

「[Golang で Shared Library を出力する。](http://qiita.com/yanolab/items/1e0dd7fd27f19f697285)」から、まるっとコピペさせて頂きましたｗ

```go:go-fib/main.go
package main

import (
	"C"
	"log"
)

//export fib
func fib(n int) int {
	if n < 2 {
		return n
	}
	return fib(n-2) + fib(n-1)
}

func init() {
	log.Println("Loaded!!")
}

func main() {
}
```

まぁ御覧の通りフィボナッチです。

### `dll`の中身

ほんとスクリプトとかで生成できるレベルの薄さです

```cpp:dll/gofib.cpp
#include "libgofib.h"

#ifdef __cplusplus
extern "C" {
#endif

GoInt _fib(GoInt p0) { return fib(p0); }

#ifdef __cplusplus
}
#endif
```

`include`している`libgofib.h`はGoで`libgofib.a`ビルド時に一緒に自動で生成されるヘッダファイルですので
自分で書く必要はありません。

```def:dll/gofib.def
LIBRARY gofib.dll
EXPORTS
fib = _fib
```

DEFファイルはラッパー側で`_fib`の名前で定義した関数を`fib`で呼び出せるように置いています。

### `exe`の中身

一応DLLを呼び出すサンプルプログラムも記載しておきます。

```cpp:exe/main.cpp
#include "libgofib.h"
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
  if (argc != 2) {
    return 1;
  }
  printf("%d\n", fib(atoi(argv[1])));
}
```

`libgofib.h`はラッパーでインクルードしているファイルと同じものです。
"第一引数の値"番目のフィボナッチ数を出力するサンプルです。

## ビルド

### Goで書かれたライブラリのビルド

```bash
pushd go-fib
go build -buildmode=c-archive -o libgofib.a
popd
```

DLLや実行ファイルリンクじに`-lgofib`で予備出せるよう`libgofib.a`という名前で出力しておきます。

これで

- `go-fib/libgofib.a`
- `go-fib/libgofib.h`

が生成されます。

### ラッパーのビルド

```bash
pushd dll
gcc -o gofib.dll -mdll gofib.cpp -I../go-fib -L../go-fib -lgofib gofib.def -Wl,--out-implib=libgofib.dll.a -lwinmm -lws2_32 -lntdll
popd
```

DLL用のインポートライブラリを`libgofib.dll.a`という名前で出力しておきます。
dll.aとしている理由は「[ダイナミックリンクとスタティックリンクの混在(MinGW環境)](http://qiita.com/nocd5/items/29af80e5654938d1c128)」参照。

これで

- `dll/gofib.dll`
- `dll/libgofib.dll.a`

が生成されます。

### サンプルプログラムのビルド

```bash
pushd exe
gcc -o main.exe main.cpp -I../go-fib -L../dll -lgofib
popd
```

これで全て完了です。

```
exe/main.exe 9
```

とすれば`34`が出力されるはずです。

ちなみに、インクルードするヘッダファイルもインポートライブラリの名前も
通常通りstaticリンクする際と共通になるよう合わせてるので

```bash
pushd exe
gcc -o main.exe main.cpp -I../go-fib -L../go-fib -lgofib -lwinmm -lws2_32 -lntdll
popd
```

としてビルドすればDLLではなくスタティックリンクでビルドすることができます。
Error:Execution failed for task ':app:transformClassesWithDexForDebug' の原因

Android 開発で以下の様なエラーが出て、原因追求に 2 時間以上かかったので共有しておきます。

```shell-session
Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: java.lang.RuntimeException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command '/Library/Java/JavaVirtualMachines/jdk1.8.0_92.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1
```

このエラーは `⌘+F9` のビルド時には発生せず `^+R` の実行時にのみ発生します。

## 環境

* Android Studio 2.1.2
* Mac OS X 10.11.6
* Java version "1.8.0_92"

## 原因

以下の `enum COLOR` が原因でした。

```java
public class Foo {
    public enum COLOR {
        WHITE, BLACK,
    }
}
```

この enum の名前を `Color` や `COLOR1` にするとエラーは発生しません。

何故 `COLOR` という名前でエラーになるのかという根本原因までは調べきれていません。
[Sinatra] コードを書き換えても再起動しなくて済む方法  ~ 0からのSinatra編①

# コードを書き換えても再起動しなくて済む方法

今までずっとRailsを触ってきたのですが，コードを書き換えるたびに再起動する必要があって不便だなって思ってました

無知って恥ずかしいですね

そこで今回はわざわざ再起動しなくてもいいという方法があるよというお話しです。

## 前提条件
ruby実行環境
もちろん sinatra

## 導入
今回はapp.rbで簡単に立ち上げたいと思います。

1. まずsinatra-contribという自動リロードをしてくれるgemをインストールします。
```
gem install sinatra-contrib
```

2. コードはこのような感じです

```app.rb
require 'sinatra'
require 'sinatra/reloader' # 主役

get '/' do
  'hello world'
end
```

3. sinatra起動
下のコマンドを実行して,ブラウザを開くと 'hello world'が
表示されると思います。

```
ruby app.rb
```

![スクリーンショット 2016-08-01 20.12.58.png](https://qiita-image-store.s3.amazonaws.com/0/74135/2442eb35-a9d1-6ff7-a716-1093792a8919.png)

4. コード変更

```diff:app.rb
require 'sinatra'
require 'sinatra/reloader'　# 主役

get '/' do
- 'hello world'
+ '変更したよ'
end
```

![スクリーンショット 2016-08-01 20.13.21.png](https://qiita-image-store.s3.amazonaws.com/0/74135/c237c5d8-1160-36f7-8537-c45b228b2280.png)

以上です。
502 bad gataway解決


sudo service nginx start

[$root権限 railsapp] に戻ってから
bundle exec unicorn_rails -c config/unicorn.rb -E development -D


unicorn 停止

[test]# ps -aux |grep unicorn

root     12345  0.0  0.0 6873   872 pts/1    S+   22:43   0:00 grep unicorn
unicorn_rails master -c /var/www/html/test/config/unicorn.rb -E development -D                                                                                  
                                                            
[test]# kill -9 12345
【Swift】RxSwiftのPlaygroundを読む⑨

RxSwiftのPlaygroundを読んでみるシリーズ最終回は
デバッグ処理についてです。
([Debugging_Operators](https://github.com/ReactiveX/RxSwift/blob/master/Rx.playground/Pages/Debugging_Operators.xcplaygroundpage/Contents.swift))

# Debugging Operators
ログを出力する等、デバッグ時に有用なオペレータです。

## debug
subscribeやeventまた、disposeなど
発生した状況に対しログを出力する。

```swift
let disposeBag = DisposeBag()

let debug = PublishSubject<String>()

debug
    .debug()
    .subscribe {}
    .addDisposableTo(disposeBag)

debug.onNext("🍑")
debug.onCompleted()
```

**結果**

```
2016-08-01 19:43:25.051: playground48.swift:12 (__lldb_expr_48) -> subscribed
2016-08-01 19:43:25.053: playground48.swift:12 (__lldb_expr_48) -> Event Next(🍑)
2016-08-01 19:43:25.055: playground48.swift:12 (__lldb_expr_48) -> Event Completed
```

<br />   
  

```swift
let disposeBag = DisposeBag()

extension String: ErrorType {}

let debug = PublishSubject<String>()

debug
    .debug()
    .subscribe {}
    .addDisposableTo(disposeBag)

debug.onError("An error occurred.")
```

**結果**

```
2016-08-01 19:48:46.615: playground50.swift:12 (__lldb_expr_50) -> subscribed
2016-08-01 19:48:46.616: playground50.swift:12 (__lldb_expr_50) -> Event Error(An error occurred.)
```

<br />

```swift
let debug = PublishSubject<String>()

debug
    .debug()
    .subscribe {}.dispose()
```

**結果**

```
2016-08-01 19:50:42.255: playground52.swift:10 (__lldb_expr_52) -> subscribed
2016-08-01 19:50:42.257: playground52.swift:10 (__lldb_expr_52) -> disposed
```

## RxSwift.resourceCount
Rx関連のリソースの数を返す。
メモリリークのチェック等に使える。

```swift
_ = {
    
    print(RxSwift.resourceCount)
    
    let disposeBag = DisposeBag()
    print(RxSwift.resourceCount)
    
    let variable = Variable("🍑")
    print(RxSwift.resourceCount)
    
    let subscription1 = variable.asObservable().subscribeNext { _ in }
    print(RxSwift.resourceCount)
    
    let subscription2 = variable.asObservable().subscribeNext { _ in }
    print(RxSwift.resourceCount)
    
    subscription1.dispose()
    print(RxSwift.resourceCount)
    
    subscription2.dispose()
    print(RxSwift.resourceCount)
    
}()

print(RxSwift.resourceCount)
```

**結果**

```
0
1
2
3
4
3
2
0
```

# おわりに
以上RxSwiftのプレイグラウンドを読んでみましたシリーズ終了です。
これだけでは表面的な動きがいくつかわかったにすぎないので、
[サンプルプログラム](https://github.com/ReactiveX/RxSwift/tree/master/RxExample/RxExample/Examples)等を参考にさらに理解を深めていきたいと思います。

# 参考
https://github.com/ReactiveX/RxSwift/tree/master/Rx.playground
XCodeでMacVim+vim-fugitiveでDiffしたい

EclipseやJetBrains製IDEみたいなDiff機能がXCodeに見当たらなかったので、MacVim+vim-fugitiveによるVimDiffをXCodeから実行できるようにした。

## 前提条件
* MacVimインストール済み
* vim-fugitiveプラグイン導入済み

## *.swiftファイルをMacVimに関連付ける
1. Finderで*.swiftファイルを右クリック
2. 「情報を見る」を選択
3. 「このアプリケーションで開く」でMacVimを選択
4. 「すべてを変更」をクリック

## Open with External Editorにショートカットを割り当てる
1. XCodeのメニューバーのPreferences > Key Bindingsを開く
2. Open with External Editorのショートカットを`⌥E`とか適当に割り当てる

## Let's :Gdiff
1. XCodeのプロジェクトナビゲーターからSwiftファイルを選択し、`⌥E`キーでMacVimを起動
2. `:Gdiff`でVimDiffしましょう
IE11でjusty-content: centerしてるのに両端中央揃えできない時の原因

すごいハマったのでメモ。

IE11はflexに対応しているので不具合無いだろう...と考えてガンガンつかっていいった結果、見事につまづきました。



## 事の発端

簡単な例ですが、↓のようにflexを使用してたら、.childが**右揃え**になりました。

```html
<div class="container">
  <div class="child">いんたーねっとえくすぷろーらー</div>
</div>
```

```scss
.container {
	display: flex;
	justify-content: center;
	align-items: center;
	margin: 0 auto;
	width: 400px;
	height: 80px;
}

.child {
	margin: 0 auto;
	width: 200px;
	height: 20px;
}
```

`align-item`は効いているし、ググっても関連したものが出ず...
caniuseにもそれらしい文献は見当たらず...
とりあえず適当にCSSを削っていったところ、治った&原因判明。



## 原因

`.child`の`margin: 0 auto`の部分がダメだったようです。

参考文献
https://msdn.microsoft.com/ja-jp/library/jj127304(v=vs.85).aspx#start
↑の文献のcenterの項目に「余白の指定はなんか変なことなるよ」的な文章が書いてあったので、試しに`margin: 0`にしたところ、綺麗に左右中央揃えしました。
[Linux] 起動中のプロセスの環境変数を確認する

シェルの環境変数はenvコマンドで確認できますが、そこから起動したプロセスであっても、必ずしも同じ環境変数を使っているとは限りません。ここでは起動中のプロセスが適用している環境変数の確認方法を紹介します

# 確認方法

## 基本的な方法

起動中の環境変数を確認するには /proc ディレクトリの environ を見ます

```
# cat /proc/%プロセスID%/environ
```

プロセスIDはpsコマンドなどで確認してください

実行例
<pre>
root@vm-linux64:~# cat /proc/595/environ
CONSOLE=/dev/consoleSHELL=/bin/shTERM=linuxINIT_VERSION=sysvinit-2.88PATH=/sbin:/usr/sbin:/bin:/usr/binRUNLEVEL=3PWD=/PREVLEVEL=NSHLVL=1HOME=/BOOT_IMAGE=Linux_=/usr/sbin/crond
</pre>

## 改行で見やすくする

値が'\0'区切りで連結されていますが、画面では一行に繋がって見えにくくなってます。
見やすくするには sed コマンドで改行に変えると良いでしょう

```
# sed -e 's/\x0/\n/g' /proc/%プロセスID%/environ
```

実行例
<pre>
root@vm-linux64:~# sed -e 's/\x0/\n/g' /proc/595/environ
CONSOLE=/dev/console
SHELL=/bin/sh
TERM=linux
INIT_VERSION=sysvinit-2.88
PATH=/sbin:/usr/sbin:/bin:/usr/bin
RUNLEVEL=3
PWD=/
PREVLEVEL=N
SHLVL=1
HOME=/
BOOT_IMAGE=Linux
_=/usr/sbin/crond
</pre>

## 特定の値のみ表示

grep で絞り込んで必要な値のみさせます

```
# sed -e 's/\x0/\n/g' /proc/%プロセスID%/environ |grep %変数名%
```

実行例
<pre>
root@vm-linux64:~# sed -e 's/\x0/\n/g' /proc/595/environ |grep PATH
PATH=/sbin:/usr/sbin:/bin:/usr/bin
</pre>
Emacsで矩形選択

### rectangle-mark-modeの使い方

#### 操作方法

|Key|Description|
|:--|:----------|
|C-x SPC 	|矩形選択の開始|
|C-w/M-w/C-y 	|選択した箇所をカット／コピー／ヤンク など|
|C-o 		|矩形選択した箇所に空行を挿入|
|C-t CHAR 	|矩形選択した箇所を CHAR で置換|
|C-SPC → (region選択) → C-x SPC 	|選択したリージョンを矩形選択に変更|

ソース：[rectangle-mark-modeの使い方 [ShotakahaDokuWiki]](http://www-he.scphys.kyoto-u.ac.jp/member/shotakaha/dokuwiki/doku.php?id=toolbox:emacs:rectangle-mark-mode:start)

### 参考

* [GNU Emacs Manual: Rectangles](https://www.gnu.org/software/emacs/manual/html_node/emacs/Rectangles.html) 
* [Emacs 24.4で快適になった編集コマンドたち！新機能、改善点 | るびきち「日刊Emacs」](http://rubikitch.com/2014/10/22/emacs244-edit-changes/)  
> **C-x SPC (regctangle-mark-mode)** が新しく加わりました。
> regionを設定して、C-x SPCを押したら矩形を選択できます。
> その後C-wやC-yで矩形をコピペできます。

* [世界三大覚えてられないけど有用な知識 [2] Emacsで矩形に連番を挿入する "C-u C-x r N" - Qiita](http://qiita.com/kwappa/items/639b40ef0e18170edf43)
Infrastructure as Code(IaC)について、今更ながら調べました

#Infrastructure as Code調べてみました
いまさらながら、Infrastructure as Codeについて調査しました。

##Infrastructure as Codeって？
インフラ構成をコードにしておくことです(そのまんま）。
ミドルウェアのインストールや、設定変更などを、
一度実行できれば、再利用性の高い「コード」にして、
バージョン管理できる形で残していこう、というのがキモだと思います。
組織でバージョン管理を利用していないとかだと、メリットを活かしきれません。

###メリット
####ヒューマンエラーが激減
都度、マニュアルに従ってやっていたのでは、
(僕のようないい加減な)人間だと、変更したのにマニュアルを更新しなかったり、
特定のサーバに対して変更しわすれていたり、ということが起こりえます。
また、マニュアルで管理している場合だと、日本語の意味がわからないことや、
手順が入れ違っている、といったミスも頻繁に起こりえます。
コードで記述されていれば、それも殆どなくなります。

内容がコードで記述されていることで、
詳細を追いやすくなることも重要なメリットです。
インフラを設定したひとがその場にいなければ、
それ以外の人がおいそれと設定を変更出来ない、ということが少なくなります。

####冪等性によって、重複した変更によるバグが減る
また、冪等性を考慮することで、インフラ設定の差分について考えることも少なくなります。
冪等性とは、同じ変更(コード)を、どの対象(サーバ)に適用しても、
結果が変わらない、という事を意味しています。
例えば、AnsibleでApacheの最新版をインストールするコードを走らせると、
一度目は、インストールを実行し、インストール完了後、OKのステータスを返却します。
再びコードを走らせると、最新版がインストールされている事を確認し、OKを返却します。
返される内容は、ともにOKのステータスです。
二重にコードを走らせても、無駄なサービスの停止など、問題が起きづらくなっています。

###デメリット
####ルールが増える
あるときにはコードを実行して変更し、あるときはCLIからコマンドを実行して...とやっていたのでは、
IaCのメリットを教授できなくなってしまいます。
一度、IaCでインフラを管理するようにしたら、
必ずコードを実行する形でインフラを変更すべきです。
また、メリットに上げた冪等性についても、考慮しなければなりません

####変更の適用に掛かる時間が増える
複数のサーバに、一括で変更を適用するならば良いのですが、
一つのサーバに変更を適用するのにも、
コードを書いて、実行して、とやっていると、
変更に掛ける時間はむしろ増えてしまいます。

####プロビジョニングツールを利用するならば、それなりに学習コストが掛かる
ツールを利用する場合には、
そのツールを利用するための基本的な知識を
チーム全体が持っていなければなりません。
例えば、Apacheの設定変更をする場合でも、
Apacheの知識だけではなく
+ツール(Ansibleや、Chefなど)の基本的な知識が必要、ということです。

###まとめ
時間や、ルールといったリスクはありますが、
環境構築に対してのリスクを減らす、という大きなメリットのための投資だと考えれば、
安いものではないかなと思います。
開発での、テストコードのメリット・デメリットにも近いかもしれません。
DevOpsでいうところのOpsから次々と出される要求に
柔軟に、安全に応えるためには、必要な投資だと感じます。

## プロビジョニングツール
構成をシェルスクリプト等で管理することもできますが、
ツールを使った方が、より管理がしやすいです。
管理サーバから複数サーバに、一気に変更を適用できたり、
冪等性をある程度考慮したモジュールが揃っていたり。

現在、デファクトスタンダードとなっているのは、AnsibleとChefの２つのようです

###Chef
####特徴
言語にRubyを利用
####メリット
・Rubyの採用により、繰り返し処理など、プログラミングらしい処理が書きやすい
・冪等性を担保するためのツールがそれなりに揃っています
・幅広い構成に対応するためのツール郡(Chef-Zero, Chef-Serverなど)
####デメリット
・反映先の環境全てにChefがインストールされている必要あり
・Rubyに慣れていないと、すこし内容を見づらい

###Ansible
####特徴
言語にYAMLを利用
####メリット
・YAMLの利用により、記述がシンプル
・構成もシンプル。最低2ファイルで稼働
・反映先にAnsibleが入っていなくても、変更の適用が可能

####デメリット
・繰り返しや条件分岐は、Rubyに比べるとやりづらい
・シンプルさとのトレードオフで、大規模な構成になると、コードの管理に気を配る必要あり

###その他
IaaSなどのクラウド環境では、
ネットワークの構築など、プロビジョニングツール単体では対応が難しいものでも
組み合わせて対応できるようになることがあります。
(AWS CloudFormationなど)

###まとめ
小規模な構成で始めてみるなら、Ansibleの方がやりやすいかな、と感じました。
逆に大規模な構成 or 複雑な構成なら、
はじめからChefを利用している方が、その後の手間が省けるように感じました。
Bash | 環境変数を大文字で書くのは慣習に過ぎない

小文字でも環境変数に出来る。

```bash:snake.sh
export snake_case='shaaaa!!!!!!!'

printenv snake_case # => shaaaa!!!!!!!
```

逆に大文字でも、普通の変数にできる。

```bash:upper.sh
UPPERCASE='KNOCK DOWN!!!'

echo $UPPERCASE # => KNOCK DOWN!!!
printenv UPPERCASE # => 出力なし
```


# でもなるべく

- 定数は大文字
- 変数は小文字

で書くようにしよう。

# 環境

- bash 3.2

# 参考

- [Google Shell Style Guide](https://google.github.io/styleguide/shell.xml)
- [Bash | あなたが扱っているのは本当に環境変数ですか？ (環境変数を上書きできているようで出来てないケース )](http://qiita.com/YumaInaura/items/69c6935aa5193630da07)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
OpenCVで動画の背景と動体を分離してみる

# はじめに

OpenCV(Open Source Computer Vision Library)はBSDライセンスの映像/画像処理ライブラリ集です。画像のフィルタ処理、テンプレートマッチング、物体認識、映像解析、機械学習などのアルゴリズムが多数用意されています。

OpenCVを使った動体追跡の例 (OpenCV Google Summer of Code 2015)
[https://www.youtube.com/watch?v=OUbUFn71S4s](https://www.youtube.com/watch?v=OUbUFn71S4s)

インストールと簡単な使い方はこちら
[OpenCV 3（core + contrib）をPython 3の環境にインストール＆OpenCV 2とOpenCV 3の違い＆簡単な動作チェック](http://qiita.com/olympic2020/items/d5d475a446ec9c73261e)

静止画像のフィルター処理についてはこちら
[OpenCVでエッジ検出してみる](http://qiita.com/olympic2020/items/2c3a2bfefe73ab5c86a4)

動画ファイルの処理についてはこちら
[OpenCVで動画をリアルタイムに変換してみる](http://qiita.com/olympic2020/items/ce00fab38d829965db3b)
[OpenCVでWebカメラ/ビデオカメラの動画をリアルタイムに変換してみる](http://qiita.com/olympic2020/items/12a2eceaf65f142ec3df)

今回は、定点カメラで撮影した動画を使って背景と動体を分離してみます。
監視カメラで通りがかりの人を追跡するときに、人を抽出する方法として利用することができます。

# アルゴリズム

+ **背景の抽出方法**

    フレームに重みづけをしながら重ねていくと、動かない部分が浮かび上がってきます。
    単純に足すのではなく、現在のフレームを足しこんだ分、背景のフレームから引き算します。
    OpenCVでは、cv2.absdiff()を使います。また、重みづけ計算の誤差を減らすため、浮動小数点（np.float32）を用いて計算します。
    　  
    1. ゼロ埋めした背景フレームを用意する
    2. 新しい背景 ＝ 背景 × （１ － 重み） ＋ 現在のフレーム × 重み
    3. ステップ２を繰り返す
    　  
    　  
+ **動体の抽出方法**
    差分の絶対値が動体フレームになります。
    OpenCVでは、sv2.absdiff()を使います。

    　　動体フレーム ＝ ｜現在のフレーム － 背景｜

# プログラム

```diff&accum.py
import cv2
import numpy as np

# 定数定義
ESC_KEY = 27     # Escキー
INTERVAL= 33     # インターバル
FRAME_RATE = 30  # fps

WINDOW_ORG = "org"
WINDOW_BACK = "back"
WINDOW_DIFF = "diff"

FILE_ORG = "org_768x576.avi"

# ウィンドウの準備
cv2.namedWindow(WINDOW_ORG)
cv2.namedWindow(WINDOW_BACK)
cv2.namedWindow(WINDOW_DIFF)

# 元ビデオファイル読み込み
mov_org = cv2.VideoCapture(FILE_ORG)

# 最初のフレーム読み込み
has_next, i_frame = mov_org.read()

# 背景フレーム
back_frame = np.zeros_like(i_frame, np.float32)

# 変換処理ループ
while has_next == True:
    # 入力画像を浮動小数点型に変換
    f_frame = i_frame.astype(np.float32)

    # 差分計算
    diff_frame = cv2.absdiff(f_frame, back_frame)

    # 背景の更新
    cv2.accumulateWeighted(f_frame, back_frame, 0.025)

    # フレーム表示
    cv2.imshow(WINDOW_ORG, i_frame)
    cv2.imshow(WINDOW_BACK, back_frame.astype(np.uint8))
    cv2.imshow(WINDOW_DIFF, diff_frame.astype(np.uint8))

    # Escキーで終了
    key = cv2.waitKey(INTERVAL)
    if key == ESC_KEY:
        break
    
    # 次のフレーム読み込み
    has_next, i_frame = mov_org.read()

# 終了処理
cv2.destroyAllWindows()
mov_org.release()
```


# 実行結果

![org.png](https://qiita-image-store.s3.amazonaws.com/0/107056/3a4c259d-6fed-7add-55b8-3ad5ea41c090.png)
　　　　　　　　　　　　　　　　　　　　**元画像**

![diff.png](https://qiita-image-store.s3.amazonaws.com/0/107056/63c5623d-c9e7-6a9e-2ef6-d7db977e1507.png)
　　　　　　　　　　　　　　　　　　　　**動体抽出画像**

![back.png](https://qiita-image-store.s3.amazonaws.com/0/107056/26bf63ef-31b6-02dc-ceb8-b41c183ed998.png)
　　　　　　　　　　　　　　　　　　　　**背景画像**

歩いている人をうまく抽出することができました。
nullable, nonnullを明記することで幸せになる


## nullable

Objective-Cのプロパティなどはこれに値している。
プロパティの中身が `nil` であっても良いという場合のことが相当する。

Objective-Cで `nullable` を指定しておくことで、SwiftでOptionalとして使用することが可能になる。

```obj-c:nullableサンプル
@interface Sample()

@property (nullable, nonatomic) NSString *text;

@end
```

また、以下のようにすることで...

```obj-c:Objective-Cメソッドサンプル
@interface Sample : NSObject

- (nullable UIImage *)getHanayoKoizumi;

@end
```

メソッドの戻り値にも `nullable` を指定することでSwift側からのアクセスで強制アンラップをしない幸せなことが起こる！

```swift:Swiftメソッドサンプル
func getHanayoKoizumi() -> UIImage?
```

## nonnull

プロパティなどの中身が `nil` を許容しない場合にしようする。
また、 `nonnull` を明記することでOptionalではないことを表すことになります。

`NS_ASSUME_NONNULL_BEGIN` から `NS_ASSUME_NONNULL_END` を使うことでその間にあるものをすべて `nonnull` 属性を与えることができます。
また、この間でも `nullable` を指定しているものに関しては `nullable` として扱うことができます。

```obj-c:nonnullサンプル
@interface Sample ()

@property (nonatomic) NSString *text;

@end
```
Cakephp3のFormHelperでradioをlabelの外側に出す。


ずっと、``FormHelper``の``$_defaultConfig``の``templates``の``label``と``radioWrapper``を変更して思った通りに出力されないなって悩んでいたんだけど、``nestingLabel``と``radioWrapper``を直せばよかった。100マン年悩んでいたのが浄化した。

FormHelperでのデフォルト定義は、以下のようになっています。

```vendor/cakephp/cakephp/src/View/Helper/FormHelper.php
// snip
protected $_defaultConfig = [
	/// snip
	'templates' => [
		'label' => '<label{{attrs}}>{{text}}</label>',
		'nestingLabel' => '{{hidden}}<label{{attrs}}>{{input}}{{text}}</label>',
	// snip
```

これを、以下のようにテンプレートで指定し直す。

```hoge.ctp
<?php
$this->Form->templates([
	'nestingLabel' => '{{hidden}}{{input}}<label{{attrs}}>{{text}}</label>',
	'radioWrapper' => '<div class="wrapper-radio">{{label}}</div>',
]);
?>
<?= $this->Form->radio('job', ['1'=>'アルバイト','2'=>'正社員']);?>
```

出力

```hoge.html
<input type="hidden" name="job" value="">
<div class="wrapper-radio">
	<input type="radio" name="job" value="1" id="job-1">
	<label for="job-1"> アルバイト </label>
	</div>
<div class="wrapper-radio">
	<input type="radio" name="job" value="2" id="job-2">
	<label for="job-2">正社員</label>
</div>
```

参考
* [form helpers - Custom templates using 'radioContainer' in Cakephp 3 - Stack Overflow](http://stackoverflow.com/questions/26889198/custom-templates-using-radiocontainer-in-cakephp-3)
* [参考:cakephp/src/View/Helper/FormHelper.php](https://github.com/cakephp/cakephp/blob/603f4ee01735f2e8e3c2283540199b4bba70ded7/src/View/Helper/FormHelper.php#L96-L104)
Ruby使いなら知っておくべきgemたち―awesome_print

# 概要

## 名前
AwesomePrint

## URL
https://github.com/awesome-print/awesome_print

# 解説
[前回](http://qiita.com/okuramasafumi/items/958e48aee0bc24680676)に引き続きコンソールで使うgemを紹介。今回はコンソールでの出力をより良くしてくれる`awesome_print`。

## 機能
見たほうが早い。

![スクリーンショット 2016-08-01 18.50.39.png](https://qiita-image-store.s3.amazonaws.com/0/29297/01328f60-a553-8210-6676-8aacc8d7577d.png)

![スクリーンショット 2016-08-01 18.52.19.png](https://qiita-image-store.s3.amazonaws.com/0/29297/a0f67cef-aa58-e7c0-3698-bba5186789f4.png)


## 機能（詳細）
Rubyコンソールの出力を見やすく整形してくれる。デフォルトで色もつくし、インデントも揃う。ActiveRecordモデルであっても綺麗に出力してくれる。更に配列であればインデックスも補ってくれる。
つまり、見たほうが早い。

![スクリーンショット 2016-08-01 19.01.37.png](https://qiita-image-store.s3.amazonaws.com/0/29297/1d22e977-e9fd-b248-1de3-1413755e327d.png)

![スクリーンショット 2016-08-01 19.02.19.png](https://qiita-image-store.s3.amazonaws.com/0/29297/a095d33e-5828-7a0e-cb78-69ba75c3729a.png)

## 使い方

```shell-session:shell
gem i awesome_print
```

```~/.pryrc
begin
  require 'awesome_print'
  AwesomePrint.pry!
rescue LoadError
end

```

## 利点
`irb`でも`pry`でも動く。
綺麗は正義。

## 欠点
マシンごとに`gem i awesome_print`するのは面倒。

# まとめ
コンソールで過ごす時間が長いならぜひ使いたい。Railsとの相性も◎
Dockerを使ってみた（開発者）

話題のDockerを遅ればせながら使ってみました。
開発者なので開発者視点でのDockerの使い方になります。
（実際は1年ぐらい前に書いた記事です。下書き状態で忘れてました。）

## ChefやVagrantとDockerの何が違うの？
ChefやVagrantなど巷には色々あるありますが、Dockerと何が違うの？という所が最初は分かりませんでした。
#### Chef
> システム構築を自動化するためのソフトウェアツールあるいは枠組み（フレームワーク）の一種。システムの各種設定を変更したり、アプリケーションやミドルウェア、コンポーネントなどのソフトウェアをインストールしたりする作業を自動化できる。

#### Vagrant
> Vagrantは、開発環境の構築と共有を簡単に行うためのツールです。 どこでも同じ環境を再現できるように仮想マシン環境を管理する機能と、Atlasを通して共有する仕組みが提供されています。

#### Docker
> Linux上で独立した別のLinuxシステムを起動することができる、コンテナ型の仮想化ソフトウェアの一つ

簡単に言うとChefはサーバー設定ツールで、Vagrantは仮想マシンをパッケージング(box化)できるツール。Dockerはコンテナに仮想環境を構築できるツールになります。

Vagrantの仮想マシンとDockerのコンテナの一番の違いは、CPUやメモリ、ディクス使用などのオーバーヘッドがあるかないかです。仮想マシンは仕組み上、OSリソースを再現する為、どうしてもオーバーヘッドが生じますが、Dockerのコンテナの場合はソフトウェアとして実行される為、それらのオーバーヘッドはほとんどないそうです。

DockerはDockerfileというインストールなどのコマンドを一元管理できる機能があり、Dockerfileをビルドするだけでワンライナーで環境構築を行う事も可能です。

現状、DockerとVagrantを組み合わせて使う事はあってもDockerとChefを組み合わせて使うメリットはほとんどないように思います。

## Dockerを利用した開発環境構築
下記のような感じでVagrant＋Dockerの開発環境を構築しました。
1. Vagrantでcentos用のboxを作成、そのVirtualboxのCentOS7の仮想マシン上にDockerをインストール。
2. DockerのCentOS6用のイメージを取得し、コンテナを作成して実行。そのコンテナ上に開発環境を構築する。その時のインストールしたコマンドをDockerfileに明記。
3. Dockerfileはビルドするだけでワンライナーで動くようにする為、ソースなどのリソースはgitからcloneするようにし、dbの初期設定や初期データ投入などもDockerfileに明記するよう工夫する。
4. ワンライナーでビルドし、起動できるDockerfileが完成。gitにレポジトリを作成したDockerfileを共有する。
5. VagrantのVagrantfileにsshやhttp用のポートフォワード(ホスト機<->Vagrant<->Docker)、共有ファイルの設定やVagrant up時のDockerやコンテナ起動の設定を記述する。
6. ワンライナーでビルドでDockerイメージを作成、作成したイメージからDockerコンテナを作成、起動する
7. Dockerコンテナにeclipse用のdebugなどの設定を追加。
8. Vagrant upするだけでeclipseでデバック実行可能な開発環境の構築が完了。

## Dockerを利用したステージング環境構築（CI）
ステージング環境はローカルのCentOS7がインストール済みの端末に下記のような感じで構築しています。
1. CentOS7にDockerをインストール
2. gitからDockerfileをcloneし、ビルドを行い、イメージの作成、コンテナの作成と起動を行う。
(コンテナの起動はsshとhttpのポートフォワードを行い、ソースなどのリソースはボリュームオプションを使用し、ホスト機とファイル共有し、永続化する)
(この状態でホスト機にhttpアクセスするとステージング用のサービスがすぐに確認できる)
3. Jenkinsをインストール。
4. Jenkinsで対象のgitがpushされるとビルド時にDockerとファイル共有しているソースなどのリソースをgitから最新化するシェルを設定。
5. gitの対象リポジトリにpushすると即時にステージング環境に反映される環境が完成。

## Dockerの利点
#### **再利用性に優れている**
Dockerfileを作ってしまえば、CPUアーキテクチャが同じであれば、同じ環境をすぐに作成する事が可能です。またコンテナのエクスポートやイメージのエクスポート、インポートも容易にできます。

`ラズパイなどはCPUアーキテクチャが違うのでそのまま使えません。筆者は開発環境をラズパイに入れて遊んでみようと思いましたが、その事実に買った後に気付きました。`

#### **軽量**
VMやVurtuialboxに比べると軽量でオーバーヘッドもほとんどありません。

## Dockerの習得
基本的にはネットに転がっている情報である程度は分かると思います。私は環境構築まではネットだけの情報で調べながらやってみて、その後、体系的なまとまった知識が欲しかったので書籍を買って勉強しました。

本番運用となれば、現状の知識レベルでは難しい部分はあるとは思いますが、開発で使う分には大丈夫かな、というぐらいにはなれたと思います。

## 最後に
Dockerfileに記述するだけでワンライナーで環境が全てできるのは、最初は感動物です。やってみて楽しかったですし、Dockerは個人的にプログラマーライクな技術だと思いますので、一度は試してみる事をお勧めします。
「リモートチームでうまくいく マネジメントの〝常識〟を変える新しいワークスタイル」を読んで思ったこととか

## この本について

とりあえずアマゾンの[リンク](https://www.amazon.co.jp/dp/4534053428)置いておきます。

著者: 倉貫 義人

これに参加するにあたって講演者の本ぐらい読んでおくかーって思ったのがきっかけで読んでます。

https://remotework-okinawa.doorkeeper.jp/

## 読んで思ったこと

### 必要条件

- リモートワークするためにはセルフマネジメントできる必要がある
- セルフマネジメントできるようになるためにはタスクの分解ができる必要がある
- 振り返りを自身で行うことができる必要がある

チャレンジ中なのでできる必要があると言われると継続する気になれた。そして、自分の管理ぐらいできる必要があるなって感じた。

現状、セルフマネジメントができないので頑張らねばと思うのとできる人を採用するのは難しいと思うと感じた。
教育制度とかしっかりと考えなければいけないと思う。

### 採用面

- 遠隔地だから採用できない問題が無くなる
- いずれ離島に帰りたいと考えてる人を雇えない問題などが無くなる

これは僕にはあまり関係ないかと思ってたけど実家に帰ってきてほしいと最近言われるようになったので帰ることになったら仕事続けられないと漠然と感じてた不安が解消される気がした。


### 評価面

- 席に座ってる時間の評価じゃなくなる
- チームでの目標に対する評価に変わる

個人的にすごくよく感じる。個人で出せる成果よりチームとしての目標をしっかりと決めてそれを実現するために動きたいと感じた。

## 疑問に思ったこと

すぐに話しかけられる状態はいいと思うけど集中したタイミングから途切れると戻すのに時間かかるので(ピープルウエアでいうフロー状態)どういうアプローチしてるのか疑問に思った。

## まとめ

ざっくりと読んですぐに感想書いてますが、個人的に思ったことなので気になった方は読んで見てください。(僕が嘘ついてるかもしれないですｗ)

マネージメントの方法が表面上変わることや評価制度を見直す必要があること、セルフマネジメントをすべての人ができる必要性があることが分かった。
しかし、それをクリアすると様々なメリットがあることもわかった。

しっちゃかめっちゃかなまとめだけど一応そんな感じでした。


## 追記:勉強会に参加してきました

ほぼ本の内容と同じだったので個人的にはさっき聞いたって感じがして楽しめなかった。。。
一応本になかった内容だと

- 24人でも問題なくリモートワークできてる
- 同じレベルの人同士でチームを組むべき(プログラムが書きたい人に部下の育成を頼むのは退職するだけだからできるかぎりやめたほうが)
- 4月？5月ぐらいに完全にオフィスなくしたけど問題になることはなかった
- そもそも納品って概念をなくしている(著者の別の本がそういう感じのタイトル)
Unity:自作スクリプトテンプレートを複数個メニューに表示させる方法

初投稿です。宜しくお願いします。

## 動作確認環境

Mac版5.3.4f1、5.4.0f1
未確認ですが、Windows版でも可能だと思います。

## はじめに

C#スクリプトファイルの新規生成時の内容をカスタマイズする場合、81-C# Script-NewBehaviourScript.cs.txt の内容を編集する、
という紹介が多いのですが、用途ごとに複数個テンプレートファイルを作成し、Createメニューに表示させる方法を記載します。

用途ごとテンプレートを用意しておくことで、新規スクリプトの記述開始が早くなるのではないでしょうか。
また、この記事ではC#ファイルでの記述ですが、Javascriptやシェーダーなども同じアプローチで出来るとか思います。


デフォルトでは１つですが
![menu1.jpg](https://qiita-image-store.s3.amazonaws.com/0/48743/96cc0a59-e3d2-bdec-3bb4-f2d5c4901718.jpeg)

このようなことが可能です。（階層構造もOK）
![menu2.jpg](https://qiita-image-store.s3.amazonaws.com/0/48743/233f2d0a-777c-1c0e-af09-b7068446d86f.jpeg)

## 必要なもの

テンプレートを記述したテキストファイルで81-C# Script-NewBehaviourScript.cs.txtとは異なる名前のファイル
（最初の時点では拡張子txtならファイル名は何でも良いです。以降ファイル名について記載します）

## ファイルの置き場所

81-C# Script-NewBehaviourScript.cs.txt と同じフォルダです。

## ファイル命名規則

ファイル名にUnityが認識する規則性のあるファイル名にすることでCreateメニュー追加されます。

```
81-
```
ここはどのファイルでも共通です。C#スクリプトの場合、ファイル名の開始文字列は”81-”とします。
※Javascriptやシェーダーの場合82、83となっていると思いますので、以降は適宜読み替えて下さい。

例として、”C# My Custom C# Script” と表示されるテンプレートファイルを記載します。

```
81-C# My Custom C# Script-NewScript.cs.txt
```

### ポイント
-(半角ハイフン)がデリミタとなっていて、"ハイフン以降の文字列.cs"が実際にアセットファイル名として作成されます。
どのファイルでも共通です。

### 結果
![sample1.jpg](https://qiita-image-store.s3.amazonaws.com/0/48743/ae9f4fcc-d826-6135-4185-c37f685a5e51.jpeg)

![sample1_new.jpg](https://qiita-image-store.s3.amazonaws.com/0/48743/93e05ed4-5467-1929-a002-b7692aa93e25.jpeg)


## ここまでのまとめ

ここまでの流れをまとめますと以下の書式になります。

```
81-”Createメニューに表示させたいテキスト”-”実際に新規作成されるアセットファイル名”.cs.txt
```


## 階層構造を含める場合

![menu2.jpg](https://qiita-image-store.s3.amazonaws.com/0/48743/233f2d0a-777c-1c0e-af09-b7068446d86f.jpeg)

このようにする場合、実際にフォルダを作成するのではなくファイル名で解決できます。
フォルダとして認識するデリミタ文字は__（半角アンダースコア2文字）です。

### 例

先程記載した 81-C# My Custom C# Script-NewScript.cs.txt に対し、Createメニュー上で「C# My Script」という階層を付与した場合、こうなります。

```
81-C# My Script__My Custom C# Script-NewScript.cs.txt
```

### 結果

![sample2.jpg](https://qiita-image-store.s3.amazonaws.com/0/48743/9257628e-e908-d541-2d29-7e31470798b4.jpeg)

さらに階層を深くする場合、__（半角アンダースコア2文字）を再度使用することで実現できます。

### 例

![menu2.jpg](https://qiita-image-store.s3.amazonaws.com/0/48743/233f2d0a-777c-1c0e-af09-b7068446d86f.jpeg)

上図で選択されている Window Script の場合のテンプレートファイル名の例です。

```
81-C# Ext__Editor__Window Script-NewScript.cs.txt
```

## まとめ

以上をまとめますと、以下の書式になります。

```
81-”Createメニューに表示させたいテキスト（階層構造にしたい場合は階層分だけ＜階層名__＞を記述）”-”実際に新規作成されるアセットファイル名”.cs.txt
```
Kotlinコードでシンプルなコンストラクタ

## 書いていたコード
CustomViewを実装する際にコンストラクタをたくさん書いておりました。すっきりまとめる場合には@JvmOverloadsを使えばいいことを知りました。

今までこんな風に書いていました。

```kotlin
class PickerView: View {
    constructor(context: Context) : this(context, null) {
        prepare()
    }
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
        prepare()
    }
    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
        prepare()
    }

    fun prepare() {
    }
}
```

## @JvmOverloadsアノテーションを使う
@JvmOverloadsを使うとすっきりできますね！

```kotlin
class PickerView @JvmOverloads constructor(
        context: Context,
        attrs: AttributeSet? = null,
        defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
    init {
        prepare()
    }

    fun prepare() {
    }
}
```

他のものもすっきり書けそうでした。

```kotlin
class PickerViewPager : ViewPager {
    @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : super(context, attrs)
}
```


参考にさせていただきました!!
http://qiita.com/jmatsu/items/6c141ba0acb13409c7bf
[Sidekiq①] Redisインストール方法 for Mac ~ 0から始めるRails編 ~

# [Sidekiq①] Redisインストール方法 for Mac

## 前提条件
PC:mac
homebrewインストール済み

## 導入方法

```
brew install redis
ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.redis.plist

```


## 起動

```
redis-server
```

<img width="1280" alt="スクリーンショット 2016-08-01 18.19.09（2）.png" src="https://qiita-image-store.s3.amazonaws.com/0/74135/ffbf466e-3131-700b-4997-2a71759092f8.png">
Docker系のツールのアンインストール（Mac環境）

Docker for MacのStable版が出たので、インストールしてみたのだが、sudoしないとdockerコマンドが使えないという不具合（エラーメッセージ: "Cannot connect to the Docker daemon. Is the docker daemon running on this host?"）が発生しました。

この事象は、昔は、不具合ではなく仕様だったようで、回避するにはdockerという名のグループを作ってユーザをそこに所属させるなどの対応が必要だったようですが、現在のDocker for Macではその様な対応は不要で、古いDocker系ファイルを削除すれば解消します。

削除方法をメモしておきます。

### 環境
- MacOS X El Capitan 10.11.6
- バージョンいくつか忘れたけど、古いDocker, Docker Toolbox, boot2dockerがインストールされている

### ゴミ掃除

古いDocker, Docker Toolbox, boot2dockerを削除します。

だいたい、「[Mac OSXでDocker Toolboxのアンインストール](http://qiita.com/minamijoyo/items/ec5b35382797ac08e067)」に書いているとおりで良いけど、幾つかファイルが残ってしまうので、「[How to Fully Uninstall the Official Docker OS X Installation](https://therealmarv.com/how-to-fully-uninstall-the-offical-docker-os-x-installation/)」もやっておいたほうが無難。

あと、`~/.bash_profile`や`~/.bashrc`にゴミがないことを確認するのも忘れずに。

### インストール・動作確認

ちゃんとゴミ掃除してからであれば、[公式ドキュメント](https://docs.docker.com/docker-for-mac/)に書いている通りに進められるはずです。
kintone グラフをパワーポイント・ワードに追加

#kintone グラフをパワーポイント・ワードに追加する手順

kintone アプリでグラフをパワーポイント・ワードにコピペできませんので、手順をまとめておきます。
パワーポイント・ワードのスクリーンショット機能を使います。
同じ手順でブラウザやアプリケーションのスクリーンショットを取ることができます。

- kintoneアプリでグラフ全体が表示されるように、スクロールしておく

![グラフ1.png](https://qiita-image-store.s3.amazonaws.com/0/100572/e69562a3-ff1d-c682-1c00-6ab8141beb63.png)


- パワーポイント・ワードで、「挿入」＞「スクリーンショット」＞「画面の領域」をクリック


![グラフ2.png](https://qiita-image-store.s3.amazonaws.com/0/100572/78c5f69c-e770-740f-ded6-b461b2b68ec4.png)


- マウスでグラフの領域を選択

![グラフ4.png](https://qiita-image-store.s3.amazonaws.com/0/100572/085f6d65-fb03-cd08-df49-31c4bdbae225.png)


- パワーポイント・ワードにグラフが追加される

![グラフ3.png](https://qiita-image-store.s3.amazonaws.com/0/100572/ec26f051-aaaf-a9af-2d59-3beaeb03373b.png)
ChakraCore を Mac 上でビルドする

# Chakra-core とは？

Microsoft Edge で利用されている JavaScript 処理系です。オープンソース化されて GitHub にて公開されています。

長らく Windows でしかビルドできませんでしたが、この度 Mac と Linux でもビルドできるようになりました。

JIT はまだ動かないようですが…

# 事前準備

必要なものは次の3つ

* XCode およびコマンドラインツール
* cmake
* icu4c

コンパイラ、ビルドツール、Unicode の国際化対応を行うためのライブラリです。

XCode は Apple のサイトからダウンロードしてください。コマンドラインツールは GUI からもインストールできますし、次のように xcode-select コマンドからもインストールできます。

~~~
$ xcode-select --install
~~~

cmake と icu4c は HomeBrew 経由でインストールします。

~~~
$ brew install cmake icu4c
~~~

# ソースコードのダウンロード

[レポジトリ](https://github.com/Microsoft/ChakraCore) からダウンロード、もしくは clone します。

# ビルド

ソースコードが Chakra-core というディレクトリ以下に展開されている前提で、以下のコマンドを実行します。ディレクトリが異なる時は、1行目を適宜読み替えてください。

~~~
$ cd Chakra-core
$ ./build.sh --static --icu=/usr/local/opt/icu4c/include  -j=2
~~~

--icu オプションは icu4c をインストールした際に導入されるヘッダファイルの位置を指定します。Homebrew でインストールした場合は、上記の場所にインストールされます。

-j オプションで、ビルドに利用する CPU の数を指定します。MacBook Pro だと 2 つぐらい割り当てておくと良いのではないでしょうか。

ビルドが成功すると BuildLinux/Relase/ch に実行可能ファイルができます。

# Hello, World

次のような JS ファイルを作成します。ChakraCore は JavaScript インタプリタなので、ブラウザや node の提供する API を持っていません。console オブジェクトや、document オブジェクトも未定義です。そのため、出力にはデバッグ用の関数 ```print``` を利用します。

```javascript:hellowrld.js
const msg = "Hello, world!";
print(msg);
```

これを ch に与えて実行すると、コンソールに Hello, world!  が出力されます。

~~~
$ ./BuildLinux/Relase/ch helloworld.js
Hello, world!
~~~

# まとめ

ビルドは結構簡単です。build.sh がよしなに計らってくれます。

ChakraCore は単体だとほとんど何もできませんが、[node](https://github.com/nodejs/node-chakracore) や[自分のアプリに組み込む](https://github.com/Microsoft/ChakraCore/wiki/Embedding-ChakraCore)ことができるようです。ぜひそちらを試してみてください。
SceneKitのcubeNodeに色をつける

# はじめに
SceneKitでcubeNodeを次のように宣言している場合に、そのキューブに着色するためのコードをどう書いたらよいか。


```swift:InterfaceController.swift
var cubeNode = SCNNode(geometry: SCNBox(width: 5.0, height: 5.0, length: 5.0, chamferRadius: 0.0))
```

# 記述例

例えば、Swift3.0の資料に基づくと、青色に塗るためには、次のように記述できる。

```swift:InterfaceController.swift
let material = SCNMaterial()
material.diffuse.contents = UIColor.blue()
cubeNode.geometry?.firstMaterial = material
```
swift document読んでみた2:weak（備忘録的に書く）

前回循環参照でメモリリーク起きちゃうよって話をしましたが、今日はその解決策としてweak referenceを紹介します。

循環参照してしまいそうな変数に対してはweakをつけて宣言をしてあげることで循環参照を防ぐことができます。

例を見てみましょう。

```swift
class Person {
    let name: String
    init(name: String) { self.name = name }
    var apartment: Apartment?
    deinit { println("\(name) is being deinitialized") }
}
 
class Apartment {
    let number: Int
    init(number: Int) { self.number = number }
    //ここでweakを使っていますね。
    weak var tenant: Person?
    deinit { println("Apartment #\(number) is being deinitialized") }
}

抜粋：: Apple Inc. “The Swift Programming Language”。
```

weak が使えるのは「値を持たない可能性がある変数」に対してです。
要はnilになる可能性がある変数ですね。
Apartmentクラスのtenant(住人)はいてもいなくても成り立ちます、つまりtenantにはnilが入る可能性があるということです。

じゃあ、nilが入ることはないよっていう変数の場合は？というとunownedというのがあるようですが、それは次回ですw

では上記のクラスを実際に使ってみましょう。

```swift
var john: Person?
var number73: Apartment?
 
john = Person(name: "John Appleseed")
number73 = Apartment(number: 73)
 
john!.apartment = number73
number73!.tenant = john

抜粋：: Apple Inc. “The Swift Programming Language”
```

こんな感じでクラスを使ったとします。
この状態で

```swift
//以前はここでnilを入れてもApartmentで参照されていたため、Personクラスのjohnは破棄されることはありませんでしたが、今回はweakを使っていますので、ここでちゃんとdeinit()が呼ばれることになります。
john = nil

//もちろん、Apartmentオブジェクトに対してnilをいれた場合もdeinitが呼ばれ、オブジェクトが破棄されたことになります。
number73 = nil
```

なるほどねー。一つのクラスの中に違うクラスの変数を入れる場合で、且つその変数がnilになる可能性があるならweakをつけておいたほうがいいのね。
勉強になりますねー。

では次回はweakと同じ使い方ですが意味の違うunownedを読んでいきたいと思います。
Clear Linuxでyumを使用可能にする

Clear Linuxでyumを使いたい人向けのメモ
最新のパッケージは[こちら](https://download.clearlinux.org/current/x86_64/os/Packages/)で管理されています

Software update tool で、yumコマンドをインストールする

    swupd bundle-add os-clr-on-clr
    swupd bundle-add os-core-dev

yum用のディレクトリを作成

    mkdir -p /etc/yum/vars/
    mkdir -p /etc/yum.repos.d/

変数を定義(ClearLinux自体のバージョンが/lib/os-releaseに書かれています)

    grep VERSION_ID /lib/os-release
    echo XXXX > /etc/yum/vars/clearrelease

/etc/yum.conf を作成

    [main]
    cachedir=/var/cache/yum/$basearch/$clearrelease
    keepcache=0
    debuglevel=2
    logfile=/var/log/yum.log
    exactarch=1
    obsoletes=1
    gpgcheck=1
    plugins=1
    installonly_limit=5

/etc/yum.repos.d/clear.repo を作成

    [clearlinux]
    name=clearlinux
    baseurl=https://download.clearlinux.org/releases/$clearrelease/clear/$basearch/os/
    gpgcheck=0
    enabled=1
RPGツクールMVで「キーが押された瞬間」だけ条件分岐

「条件分岐」コマンドの「ボタンが押された時」はボタンが押されている間はずっと分岐し続けます。
では「ボタンが一度押された瞬間」だけ分岐する方法は無いでしょうか…？
あります。
![istriggered.png](https://qiita-image-store.s3.amazonaws.com/0/135524/59e686f6-8ba1-284c-06b4-c038603e8d1e.png)
図のように「スクリプト」に`Input.isTriggered('ok')`と書けば「決定キーが押された瞬間」だけ条件分岐します。
キャンセルキーにしたい場合は`ok`の部分を`cancel`に書き換えればオーケーです。
（その他に`up`, `down`, `left`, `right`, `pageup`, `pagedown`なども可能です）

スクリプトを少し活用するだけでも楽になることはあります。
尻込みせずにちょこちょこ使っていくと良いでしょう。
ゲームジャムで「ブランチ」を使ってみた

ゲームジャム環境でGitとかbitbucketとかSourceTreeを使う機会が多くなってきたのですが、
今回は初めて「ブランチ」という機能を使ってみた。
という備忘録。

「わざわざブランチとか使うの手間かかるよね。」
使わなくていいかでもいいのですが、
なんどもハマった経験から使った方がいい点もあることがわかった。

##用語について

###ブランチ　
 枝分かれ　マスターのある時点から違うものを作ること

###プルリクエスト 
 プル（ひっぱって）をお願いする。ここでは、「masterにブランチしたものをひっぱってきて」 というイメージ。

#なぜブランチするのか？

実のところ、慣れている人だけとか、一人で作業する分にはブランチいらないんです。
めんどくさいんですよね。
マスターだけでがんがんあげてればいい。
って思うけど。

まぁ

ブランチする条件は
- 「多人数」
- 「規模が大きくすべての把握が困難」
- 「実験的な機能追加中、元の方での修正が割り込まれそう」
な場合

ブランチのメリットは

- 作業を同時並行で、やっていることが他の人にもわかる。
- マスター履歴を汚さなくて済む。
- ブランチして行った作業をマスターに戻す時だけ気をつける。

- マスター管理の人（マージ専門の人）がいれば、「プルリクエスト」という形でお願いする。

###良い点は、

- マスター管理の人は、すべてのソースをなんとなく把握している必要があるけど、個別作業の人はだいたいおまかせできる。

- 勝手にマスターにマージされて、とんでもない事になったりしにくくなる。(必ずプルリクエストを経由するので、やばい更新が未然に防げる。)


###やばい更新例
- アセットが数ギガのものが含まれているとか、何か別のサンプルが大量に含まれているとか本来いらんものとか。

一度バージョン管理にファイルが登録されると、著しく更新が重くなったり、被害が大きいが、
初心者の人とかはまりやすい。（ローカルでいじっていた実験サンプルを全部あげちゃうとか）

###注意点としては

- マージ作業が分離されるから、開発側は気楽になれるけど、マージする人にその負担が移動しているだけなので、マージ不能なプルリクエストをしても却下される可能性はある。ので、あらかじめどう作業するかはある程度話し合っておく必要がある。　　話し合っていたけど例外は発生した時にここで止められるといった感じ。


#作業の流れとしては・・・

ざっくりとは、
- ブランチ作る
- プルリクエストを送る
- マージする

となる。もうすこし付け加えると

- マスターから自分作業用のブランチ作る
- ブランチ上で作業し、適宜コミットなどしておく。
- 作業が終わったら、マスターへマージするために、プルリクエストを送る
- マスターへマージする
- 作業ブランチ（ローカルの）を削除する。

という流れ。

#具体的な手順

bitbucket使っていて、SourceTreeでブランチの作業メモですが。

##ローカルを最新の状態に
![image](https://qiita-image-store.s3.amazonaws.com/0/96808/2fc1cfa8-f7cd-dedd-28e7-2cc2a76df281.png)

とにかく他の人の作業分をサーバーからとってくるため、
masterの一番上が太字になっている事を確認。

なってなかったら、フェッチとかプルとかリベースとかなんとかする。

##ブランチをつくる

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/b2c1d320-1e6c-451e-a8fb-e6e363326169.png)
ブランチに作業名とか、
作業が不明な場合は、名前と時刻とかユニークな名前になるようにしてブランチ作成します。

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/a49e153b-6567-adb6-27d1-f54904f5cabe.png)

このあとは、ブランチ側で、ガンガン作業する。
適宜プッシュしたりして、作業履歴を残しつつ作業ができる。
あと、master側にもブランチしているというのが他の人にも見える。（何か作業しているんだなぁと）


この間にマスター側が修正されていて、自分も影響うけそうなのがあったりするなら注意（コンフリクトするかも）

#プルリクエスト

![image](https://qiita-image-store.s3.amazonaws.com/0/96808/6860a667-aa97-49ba-d82c-730e081a5360.png)

で、一通り作業終わったら

ブランチを右クリックして「プル　リクエストを作成...」を選ぶ

と、bitbucketのブランチのページが表示されて、そこでブランチからmasterへのプルリクエストが作成できます。

続けて下のほうに差分がでていて、
右上に「マージ」ボタンがでてくるページが表示されます。

うちのチームではこのページのアドレスをslackで担当に伝達してお願いする形でやってました。

プルリクエストが通ったら、マスター取り直して、またブランチ作るということを繰り返します。

#さいごに

これで、masterへの更新のマージミスとか、コンフリクト時のパニックで作業時間をとられるとかが避けられるなら、
すばらしいことです。

- 実際のところ、ブランチし忘れてマスターで作業してたりとかミスして、そんな時に限ってコンフリクトして、なくなく手戻りとかもあったりします。
- あと、だれも弄ってない自分だけのソースやバイナリの場合は、自分でプルリクエストしてマスターにマージしてしまったりしています。

でも、一度、「何をするか」でブランチし、結果を「プルリクエストするまで」で、タスクが管理できるので、
ゲームジャム的に良い感じがします。
Git の基礎

# リポジトリ (Repository)

* Git によってバージョン管理されている作業領域
* Git の支配下にあるフォルダ

## ローカルリポジトリ (Local Repository)

* 自分の作業用 PC 上にある作業用リポジトリ
* 自分の修正は、まず、このリポジトリにコミットされる

## リモートリポジトリ (Remote Repository)

* 自分の作業用 PC 上以外のリポジトリ
* 通常はサーバー
* Subversion と違い、複数設置することが出来る
* それぞれに、URL とは別に識別用に名前を付ける
    * これは、サーバー側が名乗るのではなく、クライアント側が勝手につけるもの
    * 習慣上、デフォルトのリモートリポジトリには `master` と名前をつける
    * `master` には一般的にはそのプロジェクトのセントラルリポジトリが指定される

## ブランチ (Branche)

+ コードの管理の枝
    + 一つのコードの状態をもとにして複数の違った変更を積み重ねることができる。
* 各リポジトリは複数のブランチを持つ
    * ブランチは0個でも、1個でもいい
* 習慣上、デフォルトのブランチの名前は `master` にする
    * その他のブランチ名にも `Git Flow` 、 `GitHub Flow` などの管理方法がある
* Subversion とは異なり、ブランチ別のフォルダが現れコピーが作られるのではなく、ブランチを切り替えると Windows Explorer 上のファイルがそのブランチの状態に書き換えられる
    * 中間ファイルのタイムスタンプなどで問題が発生する場合があるので、ブランチを切り替えた際はビルドツール側でクリーンを行う必要がある
    * ブランチを切ってもコピーが発生するわけではないので、積極的にブランチを切ろう


# リポジトリへの更新作業

## Add

* ファイルをステージングエリア（Git の管理下）に追加するコマンド
* ステージングエリアに入ったファイルをコミットしていくことになる
* GUI 系のツールでは、チェックボックスにチェックを入れるだけのことが多いので特に意識する必要はない

## コミット (Commit)

* ローカルリポジトリに変更を記録する作業
* コミットログをつける（その他に、変更者のメールアドレスと名前をつける）
* 習慣上コミットログは、以下の様に書くことになっている（このルールにあわせているツールが多く、GitHub は完全にそうなっている）
    * 1行目にタイトル
    * 2行目は空行
    * 3行目以降に詳細
* コミットは、ローカルリポジトリに行われるだけなので、リモートリポジトリには、それだけでは影響はない

## マージ (Merge)

* あるブランチにある変更を他のブランチにも入れるコマンド
* 互いのブランチにのみある変更の状況によっては、どう統合すべきかを指定する必要がある


# リポジトリ間でのやりとり
![Gitの絵.jpg](https://qiita-image-store.s3.amazonaws.com/0/28936/a4ea6723-1e1a-8275-34f4-2fd15450e0e4.jpeg)

## プッシュ (Push)

* ローカルリポジトリに加えた修正を、リモートのリポジトリに加えるコマンド
* ローカルの○○ブランチの変更を、リモートリポジトリ□□の△△ブランチに加えるという形になる
* リモート側に該当する名前のブランチが無い場合は作成する

## フェッチ (Fetch)

* リモートリポジトリにある変更を、確認するコマンド
* 確認するだけで、ローカルリポジトリに変更は加えない

## プル (Pull)

* リモートリポジトリにある変更を、ローカルリポジトリに取り込むコマンド


# 参考資料

* [Git チュートリアル](https://www.atlassian.com/ja/git/tutorial/)
* [サルでもわかるGit入門](http://www.backlog.jp/git-guide/)
AndroidStudio 「Select Deployment Target」に何もデバイスが出てこない問題

##概要

Android Studio 2.1.2
OSX Elcapitan 10.11.5

の環境で、Genymotionや実機のデバッグをしようとしたが
普段は以下のように出るはずのSelect Deployment Targetになにも出ないで
Initializing AVDみたいなのだけ出てる状態だった。


いつもの状態

![スクリーンショット 2016-08-01 15.32.18.png](https://qiita-image-store.s3.amazonaws.com/0/56510/a6e83423-7f33-388b-113f-4a38dfe0d2c0.png)


今回の状態

![スクリーンショット 2016-08-01 15.39.30.png](https://qiita-image-store.s3.amazonaws.com/0/56510/9b903aed-2c56-9f28-066d-8cd3905a0126.png)


![スクリーンショット 2016-08-01 15.39.23.png](https://qiita-image-store.s3.amazonaws.com/0/56510/522feb93-ef79-9ffb-4379-fa6887a5c7e9.png)


デバイスも開発者モードとか諸々はちゃんとやってるのになぜだろう？
Android Studio の設定周りが悪いのではと思い色々やってみてうまくいった方法をここにメモします。

##やってみたこと

###1. ToolsからAVD Managerを開く

![スクリーンショット 2016-08-01 15.41.00.png](https://qiita-image-store.s3.amazonaws.com/0/56510/a0cda585-4905-b503-c112-8bc00f12a8ca.png)


###2. 一度何か適当なEmulatorを立ち上げる

![スクリーンショット 2016-08-01 15.42.31.png](https://qiita-image-store.s3.amazonaws.com/0/56510/ee6c2269-db85-22cb-fabd-3618467ff7ad.png)

###3. Emulatorを閉じてGenymotionとか自分のデバイスを接続

###4. runを実行

![スクリーンショット 2016-08-01 15.46.02.png](https://qiita-image-store.s3.amazonaws.com/0/56510/e185017c-b2fa-948d-a0a5-55ec8130577b.png)

なんかGenymotionのやつも出てきてくれた。とりあえずこれでデバッグできるようにはなったっぽい。


##補足
でも毎回AndroidStudio再起動するたびにこの手順踏むのは面倒。
何かいい方法があれば教えていただきたいです🙇
同僚に勧めてもらったエンジニア求人一覧

# 概要
PRしているのを聞いた・知った、同僚から勧めてもらったもののメモ。
直近で転職する予定はありませんが、この記事を見つけて、「こういう募集があるのを知っていれば応募したのに」と後悔する人が少しでも減れば幸いです。

転職せずとも、相手先の仕事に興味がある方は話を聞きに行くのもいいんじゃないでしょうか。

# 求人
- [未経験だけど、これから経験を積みたいマークアップエンジニアをWanted！](https://www.wantedly.com/projects/44434)
- [大阪拠点を技術で引っ張りたいフロントエンドエンジニアをWanted！！](https://www.wantedly.com/projects/48760)
- [
教育を変える！学校を変える！熱い想いのあるフロントエンジニア募集！](https://www.wantedly.com/projects/50529)
- [株式会社グッドパッチのフロントエンドエンジニアの求人](http://www.find-job.net/list/j109450.html)

# 転職
- [株式会社ツクルバに転職します](http://inkdesign.jp/notes/tsukuruba/)

# 関連リンク
- [「転職」の検索結果](http://qiita.com/search?q=%E8%BB%A2%E8%81%B7)
iOSアプリの利用ライブラリ情報

気になるアプリが利用しているライブラリを調べたのを載っけています。
アプリのライセンス情報を見て手書きしているので情報漏れや間違ってたりするかもしれません、その時はご連絡いただけると幸いです。

## アーカイブ
[NYT Now](http://qiita.com/andeight/items/9117465e20fd5166ba6b)（ニュースアプリ）
Tinder　調査中。。。（出合い系アプリ）

<script language="JavaScript">
$(document).ready( function () {
   $("a[href^='http']:not([href*='" + location.hostname + "'])").attr('target', '_blank');
})
</script>
擬似コードではなく、模擬コード（造語）のススメ

最近、良い感じのコーディング手法を思いついたので共有です。

# 先に擬似コードの説明

```
// ユーザを取得する。

// ユーザがアカウントロック中なら、エラーをスローする。

// ユーザが、hogeだったら、fugaする。
```

↑のような、コードを書かずに文章で表すやつです。その昔、コードコンプリートを読んだ時に書いてあって知ったのですが、実務ではあまり使ってなかったです。

## 擬似コードの利点
* レビュー時に、コードの細かいところに気を取られず、レビューアーの負担が少なくなる
* 自分で書いていて頭が整理されるなど

## 擬似コードの欠点
擬似コードからは、最終的なソースコードの姿が見えてこず、実際のソースとかけ離れているため、実装していく内に、悩むことがありました。（個人的なものかもしれませんが。。。）（達人は擬似コードから最終形が見えてくるのでしょうか？）

# 模擬コード（造語）とは

```
UserController

create(req, res)

  user = userService.find(req.id);

  if (userService.isLock(user)) {
    throw new Exception('user.accountLock');
  }

  if (userService.isHoge(user)) {
    userService.fuga(user);
  }

```

jsっぽい感じになってますが、最終的にはPHPになる予定のコードです。（わかれば何でも良い的な感じです。）

実際のソースとかけ離れているのが問題であれば、近づければ良いと思い試してみたのが、模擬コード（造語）です。エディタも色とか付くとそれに気を取られるので、色がつかないエディタや拡張子のファイルで作業するのがおすすめです。（僕は、マークダウンファイルでやっています。）

# やる際のポイント

* コメントは入れない（英語名だけで分かるようにする）
* エディタは色の付かないものにする（文法を気にしないように）
* 最終的に使用する言語から遠い書き方をしない（関数型的に書きづらい言語を使っている場合、模擬コードも関数型っぽく書かない）
* 引数とか、メソッド名は実処理で使うものを採用する
* 絵を書くときの下書きだと思って書く

# やってみて思ったこと

８年くらいjava, javascriptで実装していて、今は会社でPHPで実装しているのですが、結構矢印のバリエーションが豊富で、いちいちコンテキストスイッチが発生するので、なんとかならんか？と思い、試してみたら想像以上にうまくいったので、みなさまにもススメてみました。

暫定的に、模擬コードと命名しましたが、もっと良い名前があるとか、もっと良い方法があれば、コメントくださるとうれしいです。

あと、副作用ですが、縛りが無いので書いていて楽しいです。適当に書けば書くほど、後で修正が大変だなぁとか思いながら、適当に書けますw（個人的に、このコーディングスタイルは、テニスの王子様の「天衣無縫の極み」に似ているなぁと思います。実装力が上がるわけではないですがｗ）
cassandra.yamlを配布するansible playbook例


```cassandra.yaml.template
..
#listen_address: localhost
listen_address: {{ inventory_hostname }}
.
.
#rpc_address: localhost
rpc_address: {{ inventory_hostname }}
..
```

```cassandra.yaml
 hosts: worker
  sudo: yes
  tasks:
   - name: copy cassandra.yaml
     template: src=./cassandra/cassandra.yaml.template dest=/opt/cassandra/conf/cassandra.yaml
```

ansible-playbookの実行
```
ansible-playbook -h hosts cassandra.yaml -K
```
Synthesijerで作ったモジュールをMessagePack-RPCで制御する(リモートサーバー編)

## はじめに

少し間が空きましたが、[『Synthesijerで作ったモジュールをMessagePack-RPCで制御する(アーキテクチャ編)』](http://qiita.com/ikwzm/items/6cb623b057a687ff4a8e)の続編です。
今回は 

- socat を使って Zynq/DE0-Nano-SoC 上に MessagePack-RPC サーバーを作って
- Java で記述して Synthesijer で合成して FPGA 上に作ったモジュールを
- ネットワーク経由で
- python で作ったスクリプトで制御

します。

## socat 

### socat とは

[socat](http://www.dest-unreach.org/socat) は、簡単にソケット通信をサーバー側としてもクライアント側としても 使える便利なコマンドです。

Linux のユーザー空間アプリケーションと FPGA 上のモジュールとは TTY ドライバを経由して通信しています。詳細は[『Synthesijerで作ったモジュールをMessagePack-RPCで制御する(TTYドライバ編)』](http://qiita.com/drafts/533b905f7d1eb2e6c4d5)を参照してください。

socat は、この TTY ドライバとネットワークの仲立ちをします。

### インストール

Debian 系のLinux が載っている Zynq や DE0-Nano-Soc などでは、apt-get を使って簡単にインストールすることが出来ます。

```
shell% sudo apt-get install socat
```

### サーバーとして起動

次のように起動することにより、サーバーとして起動します。

```
shell% sudo socat -d -d tcp-listen:54321,fork /dev/zptty0,raw,nonblock,echo=0 &
```

- `tcp-listen:<port>` でサーバーとして待つポートを指定します。上の例では`<port>`に54321を指定しています。
- `/dev/zptty0,raw,nonblock,echo=0` で [『Synthesijerで作ったモジュールをMessagePack-RPCで制御する(TTYドライバ編)』](http://qiita.com/drafts/533b905f7d1eb2e6c4d5)で説明した TTY ドライバを指定します。


## クライアントから制御する例

### モジュール例

今回実装したモジュールは Java で次のように記述したものを、Synthesijer で論理合成しました。詳細は[『Synthesijerで作ったモジュールをMessagePack-RPCで制御する(アーキテクチャ編)』](http://qiita.com/ikwzm/items/6cb623b057a687ff4a8e)を参照してください。

````Java:Accumulator.java
public class Accumulator {
    public int reg;
    public int add(int x) {
        reg = reg + x;
        return reg;
    }
}
````

### クライアントからの制御

msgpack-rpc-python を使って、別のコンピューターから Zynq/DE0-Nano-SoC 上の MessagePack-RPC サーバーにアクセスします。
"???.???.???.???" には Zynq/DE0-Nano-SoC の IPアドレスを、54321 は socat を起動したときのポート番号を指定します。

```
shell% python
Python 2.7.10 (default, Oct 14 2015, 16:09:02) 
[GCC 5.2.1 20151010] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import msgpackrpc
>>> cli = msgpackrpc.Client(msgpackrpc.Address("???.???.???.???", 54321))
>>> result = cli.call('$SET', {"reg":1})
>>> result = cli.call('$GET', {"reg":None})
>>> print result
[{'reg': 1}]
>>> print cli.call('add', 10)
11
>>> result = cli.call('$GET', {"reg":1})
>>> print result
[{'reg': 11}]
>>> exit()
```

`$SET` で "reg" 変数に 1 をセットします。引数には`{変数名:値}`の辞書を指定します。
`$GET` で "reg" 変数の値を確認します。引数には`{変数名:None}`の辞書を指定します。戻り値は`{変数名:値}`です。
`add` で "reg" 変数の値に引数の値を加算します。引数には整数を指定します。戻り値は加算した値です。


##参照

[MessagePack for VHDL (https://github.com/ikwzm/msgpack-vhdl)](https://github.com/ikwzm/msgpack-vhdl)
[MessagePack for VHDL Examples (https://github.com/ikwzm/msgpack-vhdl-examples)](https://github.com/ikwzm/msgpack-vhdl-examples)
[MessagePack-RPCを使ってFPGAを制御](http://qiita.com/ikwzm/items/2644c6e50a7049c75d49)
[Synthesijerで作ったモジュールをMessagePack-RPCで制御する(アーキテクチャ編)](http://qiita.com/ikwzm/items/6cb623b057a687ff4a8e)
[Synthesijerで作ったモジュールをMessagePack-RPCで制御する(IP-Package編)](http://qiita.com/ikwzm/items/924fc3fd59bdf7da55a2)
[Synthesijerで作ったモジュールをMessagePack-RPCで制御する(ZYNQ論理合成編)](http://qiita.com/ikwzm/items/0254f1d49602095b5cde)
[Synthesijerで作ったモジュールをMessagePack-RPCで制御する(TTYドライバ編)](http://qiita.com/ikwzm/items/533b905f7d1eb2e6c4d5)