OmniAICreator/Qiita-1.07M huggingface dataset:
Rapberry Pi に USB DAC をつないでオーディオサーバーにする (接続編)

# 前提/計画

Raspberry Pi 3 を買ったので、これをなんでもサーバー化する計画を立てました。粒度が違う機能が並んでいますが、入れようと思っているのは...

1 NAS
2 メディサーバー
3 写真の自動バックアップ
4 オーディオサーバー

今回は最後のオーディオサーバーを立てるところをやってみたいと思います。

# ハード環境
登場人物は以下の四人です。USB HDD はすでにマウントされている前提です。

+ Raspberry Pi 3
+ USB DAC: DigiFi No.13 付録 の USB DAC つきデジタルパワーアンプ
+ Kenwood 製スピーカー
+ USB 2.0 HDD
+ テレビ (HDMI接続)

![_DSC6189.JPG](https://qiita-image-store.s3.amazonaws.com/0/93800/f720f86a-b44c-4eb6-5039-771426d8a577.jpeg)

関係ないですが、今は亡き(日本仕向けの開発はまだ続けるようですが...)、東芝のテレビが映っています。東芝だからダメというわけではないのですが、これが後述するように悪さをします。

# ソフト環境

+ OS: Raspbian Jessie
+ Alsa
+ RasPod

# Alsa + RasPod

RasPodを使うとシンプルなWeb UI 経由で MP3 などを再生することができます。まずは、こいつで実験。

```bash
pi@raspberrypi ~ $ sudo apt-get install python-tornado
pi@raspberrypi ~ $ sudo apt-get install vlc alsa-utils
pi@raspberrypi ~ $ git clone git://github.com/lionaneesh/RasPod.git
pi@raspberrypi ~ $ cd RasPod/
```

static ディレクトリーの下に再生したい MP3 を置くことになります。USB HDDを使用しているので、シンボリックリンクを置きました。

```bash
pi@raspberrypi:~/RasPod $ ls -l ./static/Media/
合計 4
-rw-r--r-- 1 root root 167  5月  1 19:49 README.txt
lrwxrwxrwx 1 root root  14  5月 15 03:30 mp3 -> /mnt/hdd0/mp3/
```

実行は以下のように。

```bash
pi@raspberrypi ~/RasPod $ python server.py 
```

ブラウザから以下のアドレスにアクセスします。XXX.XXX.XXX.XXX は raspberry pi 側の IP です。固定IPにしていない場合は ifconfig などで確認してください。

```
http://XXX.XXX.XXX.XXX:8888/
```

以下のように表示され、再生ボタンを押すと再生される...はずでした。

![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/93800/88f2d698-786b-e44d-1cda-2f32b90641ea.jpeg)


# 問題: USB DAC が優先されない。

## HDMI 接続のテレビから鳴ってしまう

鳴った！と思ったのですが、最初に鳴ったのは USB DAC ではなく HDMI 接続されたテレビでした。(これでいい人は以下の回避策は関係ないです。)

かと言ってテレビとの接続を切ってしまうと、後々のメディアサーバー化ができないし...と思い、映像はテレビ、音はUSB DACという構成にするためにHDMI の音声のみを切る方法を取りました。

[https://www.raspberrypi.org/documentation/configuration/config-txt.md](公式ページの config.txt 説明ページ)によると、HDMI接続デバイスを「音声非対応とみなす」オプションが有ることに気づきました。これを使ってみます。

``` bash
pi@raspberrypi:~ $ cat /boot/config.txt
...
HDMI_IGNORE_EDID_AUDIO 1
```

これでテレビからはならなくなりましたが、今度は音が出ないです。どうやら内蔵オーディーが優先されているようです。

```
hdmi_drive=2
```

とする方法もあると書いてありましたが、そちらは試していないです。

## 内蔵オーディオのほうがUSB DAC の優先度が高い

そもそも USB DAC を認識しているか以下のように確認します。

```bash
pi@raspberrypi:~ $ cat /proc/asound/cards
 0 [ALSA           ]: bcm2835 - bcm2835 ALSA
                      bcm2835 ALSA
 1 [DAC            ]: USB-Audio - USB AUDIO    DAC
                      BurrBrown from Texas Instruments USB AUDIO    DAC at usb-3f980000.usb-1.3.4, fu
```

1 の DAC が USB DAC ですね。これを優先させる設定の方法ですが、Raspbian Jessie から変更になったようです。google 先生にきいたら、

```
options snd-usb-audio index
```

などをいじれというblog記事が沢山出てきたのですが、これは Jessie 以前の設定のようで、うまくいきませんでした。

## /etc/asound.conf
まずこのファイルを以下のように編集してください。

```
pcm.!default {
    type hw
    card <number of your card>
}
ctl.!default {
    type hw
    card <number of your card>
}
```

先ほどの cat /proc/asound/cards で確認した時に USB DAC は 1 になっていたので <number of your card> は 1 にします。

## /usr/share/alsa/alsa.conf

またこのファイルも以下のようにデフォルト値を変更します。該当部分のみ書きます。

```
defaults.ctl.card 1
defaults.pcm.card 1
```

これで一旦、 reboot します。

```bash
pi@raspberrypi:~ $ sudo reboot
```

今度は USB DAC 側から鳴りました。
getTextContent()とgetNodeValue()の違いについての検証

XMLノードの要素内容を取得するために、`getTextContent()`、`getNodeValue()`のどっちを使うか一回迷ってしまいましたので、今回その違いについて検証してみました。

#検証

以下のXML文書の中に、ノードproductNameの要素内容「Apple」を取得する。


```xml
<?xml version="1.0" encoding="UTF-8" ?>
<product>
	<productID>00001</productID>
	<productName>Apple</productName>
</product>
```

以下のJavaソースを使ってXMLファイルを読み込み、productNameノードを取得する。

```java

	public static void main(String[] args) throws IOException, ParserConfigurationException, SAXException {

		// XMLファイル
		File xmlFile = new File("./resources/XML_1.xml");
		String xml = FileUtils.readFileToString(xmlFile, "UTF-8");
		
		// XML内容の読み込み
		DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
		Document doc = docBuilder.parse(new ByteArrayInputStream(xml.getBytes()));

		// ノードリスト
		NodeList nodeList = doc.getElementsByTagName("productName");
		// productNameノード
		Node node = nodeList.item(0);

	}

```

##カレントノードがproductNameの場合

```java
		System.out.println("getTextContent()の結果：" + selfNode.getTextContent());
		System.out.println("getNodeValue()の結果：" + selfNode.getNodeValue());
```

実行結果：

```
getTextContent()の結果：Apple
getNodeValue()の結果：null
```

##カレントノードがproductNameの子要素（テキストノード）の場合

```java
		System.out.println("getTextContent()の結果：" + selfNode.getFirstChild().getTextContent());
		System.out.println("getNodeValue()の結果：" + selfNode.getFirstChild().getNodeValue());
```

実行結果：

```
getTextContent()の結果：Apple
getNodeValue()の結果：Apple
```

#結論
`getTextContent()`はノードのテキスト内容を取得するための方法です。`getNodeValue()`は、当該テキスト内容を**テキストノード**として扱う場合（例：`node.getFirstChild()`）、そのテキスト内容を取得できます。
<img width="783" alt="プレゼンテーション1.png" src="https://qiita-image-store.s3.amazonaws.com/0/123138/308261e3-59d3-0123-90d5-167a5fc5c7e3.png">
pecoコマンド導入手順


goを使ってpecoコマンドを導入する手順。
（goを使わずにpecoをインストールする方法もあるが、その方法はここでは扱わない）

まずはgoの導入。

``` bash
$ mkdir ~/lib; cd $_
$ wget https://storage.googleapis.com/golang/go1.6.2.linux-armv6l.tar.gz
$ tar -xzf go1.6.2.linux-armv6l.tar.gz
$ echo 'export GOROOT=$HOME/lib/go' >> ~/.zshenv
$ echo 'export GOPATH=$GOROOT/packages' >> ~/.zshenv
$ echo 'export PATH=$GOROOT/bin:$PATH' >> ~/.zshenv
$ echo 'export PATH=$GOPATH/bin:$PATH' >> ~/.zshenv
$ exec zsh
```

これでgoの導入は完了。
次で確認できる。

``` bash
$ go version
go version go1.6.2 linux/arm
```

pecoの導入。

``` bash
$ go get github.com/peco/peco/cmd/peco
```

簡単に動作確認。

``` bash
ls | peco
```
これでファイルが一行ずつ選択できる。
選択したものが標準出力される。
IPython notebookをリモート接続する


raspberry pi 上でIPythonを起動しておき、外部から接続して利用したい。
この機能を実現するための作業ログ。

ちなみに利用環境は次の通り。

``` bash
$ python --version
Python 2.7.9
```


``` bash
sudo apt-get install ipython ipython-notebook
sudo apt-get install python-matplotlib python-scipy
sudo apt-get install python-pandas python-sympy
ipython notebook
```

これでIPython自体のインストールが完了。
次に、外部から接続できる環境を構築する。

``` bash
sudo pip install jupyter
```

JupyterのインストールはこれでOK。

外部接続環境用の設定ファイルを作成する。

はじめに、ipythonを起動してJupyterログイン時のパスワードを設定する。

``` bash
$ ipython
```

``` IPython
In [1]: from notebook.auth import passwd

In [2]: passwd()
	Enter password: <パスワードを入力>
	Verify password: <パスワードを再入力>
	Out[2]: 'sha1:<ハッシュ化されたパスワード>'
```
ハッシュ化されたパスワードをコピーしておく。

次に、設定ファイルを作成する。

``` bash
$ mkdir ~/.jupyter
$ vim ~/.jupyter/jupyter_notebook_config.py
```

``` ~/.jupyter/jupyter_notebook_config.py
c = get_config()

# matplotlibで描画したものがnotebook上で表示できるようにする
c.IPKernelApp.pylab = 'inline'
# 全てのIPから接続を許可
c.NotebookApp.ip = '*'
# IPython notebookのログインパスワード
c.NotebookApp.password = 'sha1:<ハッシュ化されたパスワード>'
# 起動時にブラウザを起動させるかの設定(デフォルトは起動させる)
c.NotebookApp.open_browser = False
# ポート指定(デフォルトは8888)
c.NotebookApp.port = <接続ポート>
```

設定終了。
動作を確認する。

``` bash
jupyter notebook
```

外部マシンのブラウザから `http://<ipアドレス>:<接続ポート>` に接続する。
パスワードを尋ねられるので、上で設定したパスワードを入力してログインする。
Atom on CentOS6

まだうまくいってない。
https://github.com/atom/atom/issues/2177
https://github.com/atom/atom/issues/5731
この辺を見る限り難しい？

######前段

公式サイトのrpmをインストールして実行すると、libnotify.so.4がないと怒られる。

```
$ cd /usr/lib64
$ sudo ln -s libnotify.so libnotify.so.4
```

しても、libc関連のエラー。どうにもならなさそうな感じ。
あきらめて、ソースコードからのビルドを試みる。

######required packagesのインストール（いろいろやった）

```
# yum install libnotify-devel
# yum install gnome-keyring-devel rpmdevtools
# yum install libc.so.6 libstdc++.so.6 libnss3.so
```

######Google Chromeのインストール
http://www.sssg.org/blogs/hiro345/archives/16612.html
を参考にした。

######nodejs, npmのインストール
https://nodejs.org/en/download/package-manager/
を参考にした。

```
# curl --silent --location https://rpm.nodesource.com/setup | bash -
# yum install -y nodejs
```

とするか、EPELリポジトリ経由で持ってくる。あるいはnvmをインストール
http://ah-2.com/2016/01/05/nodejs_install_centos67.html
を参考。

######その後、

```
# npm install npm -g
# npm install node-gyp -g
# npm config set python /usr/bin/python2 -g
# npm update
```

としてnpmのバージョンをアップデート？して、node-gypを入れる。python2を使うように設定する。依存関係等アップデートする。

```
$ git clone https://github.com/atom/atom
$ cd atom
$ git fetch -p
$ git checkout $(git describe --tags `git rev-list --tags --max-count=1`)
$ sudo script/build
```

Installing modules...の途中でよく分からないエラーで止まる。
たまに最初のInstalling build modules...で止まることも（メモリが足りない？）。
CakePHP3.x系でHttp Client で通信をしようとしてSSL使いたくないよって言ったらハマったこと

Cake3に用意されてるHttp Clientのクラスを使ってAPIとの通信をしようと考えていました。

設定はこんな感じで〜って言われて、
任せろみたいなことを言いました。

    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

初めてだったのでここで見ながら書き換えて
PHP マニュアル cURL 関数
http://php.net/manual/ja/function.curl-setopt.php

こんな感じに書きました！（失敗作）
## 失敗
       $option = [
            'timeout'              => 5,
            'ssl_verify_peer'      => false,
            'ssl_verify_host' => false,
            'auth' => [
                'username' => 'username',
                'password' => 'password',
            ]
        ];
        $http = new Client($option);
        $url = 'ponpon.com';
        $request = ['animal'=>'tanuki'];
        $response = $http->post($url, $request, $option);

ずっとSSL通信でfopen(): Peer certificateってでる…これfalseしたでしょ…
なんでだろうってコード見に行ったら「ssl_verify_peer_name」がデフォルトでtrueになってました。

……「ssl_verify_peer」がfalseでも「ssl_verify_peer_name」はtrueに…そうか…わかった…
'ssl_verify_peer_name' => falseの記述増そう。。。
## 成功

       $option = [
            'timeout'              => 5,
            'ssl_verify_peer'      => false,
            'ssl_verify_peer_name' => false,
            'ssl_verify_host' => false,
            'auth' => [
                'username' => 'username',
                'password' => 'password',
            ]
        ];
        $http = new Client($option);
        $url = 'ponpon.com';
        $request = ['animal'=>'tanuki'];
        $response = $http->post($url, $request, $option);

これで動きました。
Elixir 1.3から入る時間に関するsigil

[ブログ](http://joe-noh.hatenablog.com/entry/2016/06/04/220920)から転載

---

Elixir 1.3（正確には1.3.0-rc.0）から時間に関する構造体がいくつか定義されました。そのうちの3つ、`Date`, `Time`, `NaiveDateTime`をつくるsigilが追加されています。それぞれ`~D`, `~T`, `~N`です。

iexで`~D(2016-06-04)`と打っても、そのまま表示されてしまい何が作られているのかよくわからないので、`|> inspect(structs: false)`としています

```elixir
iex> ~D(2016-06-04) |> inspect(structs: false)
"%{__struct__: Date, calendar: Calendar.ISO, day: 4, month: 6, year: 2016}"

iex> ~T(22:05:33) |> inspect(structs: false)
"%{__struct__: Time, hour: 22, microsecond: {0, 0}, minute: 5, second: 33}"

iex> ~N(2016-06-04 22:05:33) |> inspect(structs: false)
"%{__struct__: NaiveDateTime, calendar: Calendar.ISO, day: 4, hour: 22, microsecond: {0, 0}, minute: 5, month: 6, second: 33, year: 2016}"
```

6月や5分などの1桁の数字は、`06`のようにゼロ埋めしていないとエラーになります。
CocoaPods OpenCVのインストール

iMac:~ Mac$ sudo gem update --system

iMac:~ Mac$ sudo gem install -n /usr/local/bin -v 0.35.0 cocoapods
Password:
Fetching: xcodeproj-0.20.2.gem (100%)
Successfully installed xcodeproj-0.20.2
Fetching: open4-1.3.4.gem (100%)
//省略
Parsing documentation for cocoapods-0.35.0
Installing ri documentation for cocoapods-0.35.0
11 gems installed

iMac:~ Mac$ pod setup
Setting up CocoaPods master repo
Setup completed

Projectフォルダへ移動
cd OpenCVExample01
Pod fileを編集
iMac:OpenCVExample01 Mac$ vi Podfile
platform :ios,'9.0'
use_frameworks!
target 'OpenCVExample01' do
pod 'OpenCV'
end
iMac:OpenCVExample01 Mac$ pod install
Analyzing dependencies
Downloading dependencies
Installing OpenCV (3.0.0)
Generating Pods project
Integrating client project

[!] Please close any current Xcode sessions and use `OpenCVExample01.xcworkspace` for this project from now on.
Sending stats
Pod installation complete! There is 1 dependency from the Podfile and 1 total
pod installed.
以上でCocoaPods OpenCVのインストールが行えました。
Podfileを下記のように記述
platform :ios,'9.0'
use_frameworks!
target 'ターゲット先(プロジェクト名やプロジェクトのテスト名)' do
ここでpod 'OpenCV'等を記載する
end
jquery custom event trigger

http://www.cnblogs.com/aaronjs/p/3452279.html

http://www.cnblogs.com/moonreplace/archive/2012/10/09/2717136.html

https://segmentfault.com/a/1190000000523349

http://www.cnblogs.com/aaronjs/p/3440647.html

not working:

```js
$(function(){
  $("#lala").bind("hello", function(){
    alert("1");
  })
  $("body").append("<div id='lala'></div>");
  $("#lala").trigger("hello");
})
```


working with dynamic element:

  
```js
$(function(){
  $("#lala").live("hello", function(){
    alert("1");
  })
  $("body").append("<div id='lala'></div>");
  $("#lala").trigger("hello");
})
```


传递数据


```js
$(function(){
  $("#lala").live("hello", function(e,m1,m2){
    alert("1");
    alert(m1);
    alert(m2);
  })
  $("body").append("<div id='lala'></div>");
  $("#lala").trigger("hello",[2,3]);
})
```
nim日付操作

# 概要
nimの日付・時刻操作をコツコツと。
## 以下メモ
### 今何時？
```nim
import times
proc `$`(t:TimeInfo) : string = format(t, "yyyy/MM/dd HH:mm:ss")
block:
  # 現在時刻を取得
  let now: TimeInfo = getLocalTime(getTime())
  # フォーマット化する
  let nowStr: string = format(now, "yyyy/MM/dd HH:mm:ss")
  echo "現在=",nowStr
  # 文字列をパースし、時刻型に変換
  let now2: TimeInfo = parse(nowStr,"yyyy/MM/dd HH:mm:ss")
  echo now == now2
```
```
(stdout)
現在=2016/06/05 09:42:19
true
```
### 日付情報
```nim
import times
proc `$`(t:TimeInfo) : string = format(t, "yyyy/MM/dd HH:mm:ss")
block:
  let time: TimeINfo = getLocalTime(getTime())
  echo "現在     =",time
  echo "second  =",time.second
  echo "minute  =",time.minute
  echo "hour    =",time.hour
  echo "monthday=",time.monthday
  echo "month   =",time.month
  echo "month   =",ord(time.month) + 1
  echo "year    =",time.year
  echo "weekday =",time.weekday
  echo "weekday =",ord(time.weekday) + 1
  echo "yearday =",time.yearday
  echo "isDST   =",time.isDST
  echo "tzname  =",time.tzname
  echo "timezone=",time.timezone
```
```
(stdout)
現在     =2016/06/05 09:42:20
second  =20
minute  =42
hour    =9
monthday=5
month   =June
month   =6
year    =2016
weekday =Sunday
weekday =7
yearday =156
isDST   =false
tzname  =JST
timezone=-32400
```
### うるう年？
```nim
import times
proc `$`(t:TimeInfo) : string = format(t, "yyyy/MM/dd HH:mm:ss")
block:
  echo getTime().getGMTime.year.isLeapYear
```
```
(stdout)
true
```
### 日付の加算・減算
```nim
import times
proc `$`(t:TimeInfo) : string = format(t, "yyyy/MM/dd HH:mm:ss")
block:
  let today: TimeInfo = getLocalTime(getTime())
  # TimeIntervalを生成する
  let day: TimeInterval = initInterval(hours=24)
  echo "明日    =",today + day
  echo "昨日    =",today - day
  # TimeIntervalを利用しないで、Rubyっぽい？かんじで計算
  echo "１秒後  =",today + 1.seconds
  echo "１分後  =",today + 1.minutes
  echo "１時間後=",today + 1.hours
  echo "１週間後=",today + 7.days
  echo "１ヶ月後=",today + 1.months
  echo "１年後  =",today + 1.years
```
```
(stdout)
明日    =2016/06/06 09:42:21
昨日    =2016/06/04 09:42:21
１秒後  =2016/06/05 09:42:22
１分後  =2016/06/05 09:43:21
１時間後=2016/06/05 10:42:21
１週間後=2016/06/12 09:42:21
１ヶ月後=2016/07/05 09:42:21
１年後  =2017/06/05 09:42:21
```
めざせpythonライブラリマスター （22）htmltag

#【ライブラリ説明】
　pythonでHTMLタグを生成できます。

#【準備】
　`pip install sphinx`　が必要

#【プログラム】
```py:htmltag.py
# -*- coding: utf-8 -*-

from htmltag import strong, foobar, a
from htmltag import table, tr, td

print (strong("SO STRONG!"))
# <strong>SO STRONG!</strong>

print foobar('Custom tag example')
# foobar>Custom tag example</foobar>

print (a('awesome software', href='http://liftoffsoftware.com/'))
# <a href="http://liftoffsoftware.com/">awesome software</a>

print(table(
        tr(td('100'), td('200'), id="row1"),
        tr(td('150'), td('250'), id="row2"),
))
# <table><tr id="row1"><td>100</td><td>200</td></tr><tr id="row2"><td>150</td><td>250</td></tr></table>
```

#【参考サイト】
　[github](https://github.com/LiftoffSoftware/htmltag)
ベトナムのエンジニアとの開発について

オフショアに限った話ではありませんが、海外のエンジニアと仕事をする機会がどんどん増えていると思います。私もベトナムのラボ型開発会社さんと2年ほどプロダクトを開発しています。

最初はどうなることやらという感でしたが、やってみると案外問題なく回るものでした。ベトナムの方の気質やエンジニアという職種自体がリモートワーク向きなのもよかったと思います。

以下、プロジェクトを円滑にすすめるために気をつけていることやTIPSをまとめます。提携や関係づくりの参考にしていただければと思います

## 何はともあれ英語

ベトナム語⇔通訳⇔日本語でのコミュニケーションは通訳が入ったとしても難しいです。英語でコミュニケーションが取れるエンジニアしかいない提携先を選ぶのがよいと思います。TOEIC990点でペラペラ喋れる必要はありません。私も高校3年が英語力ピークだったと思います（典型的日本人）。

使う表現は中3レベルで全然通じます。たとえばこんな感じです

```
Could you read the following specification and design the table schema first?
（ざっくり仕様書いたからこれを基にまずはテーブル設計してくれますか?）
```

```
Please put a pulldown menu to show HOGEHOGE for now. Our designer will code later. :bow:
（プルダウンをとりま置いといてくれますか? うちのデザイナーが後ほどコーディングするんで）
```

```
For performance, I think adding a column to hogehoge is appropriate. What do you think?
（パフォーマンスのために正規化崩したほうが今回はいいかも。どう思います?）
```

```
Please avoid using xxxx method. I found that this line would cause an error in production. :sad:
(そのメソッドは開発環境と本番で挙動が違っててエラーになることがあるから使うのは避けてもらえますか?)
```

この英語が文法的に合ってるか私は分かりませんが、問題なく伝わるのでよいのです。

## 最後はコードで例示

エンジニアの場合、英語がダメでもコードで示せば伝わります。コードでの例示を多用しています。骨組みを実装してしまいPRを作り、このPRにコミットしていってください、というようにタスクを渡すこともあります。

## レビュー負担が少ないFWを選ぶ

Railsは非常に向いています。ハイコンテキストなので、流儀と規約をアサイン前に勉強してもらえれば疎通違いが起きにくいです。オフショアの場合はJP側のレビュー工数が大きい（あなたが最後の砦です）ので、レビュー負担をなるべく少なくするのは大事だと思います。

フロントではたまたまAngularを使っていました。これもRailsと同じく縛りがきついFWなので向いていたと思います。特に問題なく実装してもらっています。

## GIFアニとスクショ

国籍問わず、ビジュアルの威力は絶大です。新規機能の説明の際も、UIモックツールの成果物をシェアできれば想定通り（ときには想定以上の）のoutputをしてくれる確率がかなり上がります。粒度が小さくとも、よほど自明な時以外はスクショを貼ってコミュニケーションします。

## 問題は分割する

製品xxxと交換できるクーポン機能を実装依頼するとします。その際は、(1) テーブル設計 (2) クーポン生成管理画面 (3) クーポン適応ロジック (4) クーポン入力UI くらいにマイルストーンを切るのがいいです。こまめにチェックすることで予期せぬ方向に実装が勝手に進んでしまうのを防げます（苦い経験が何度も...）。これはオフショアに限った話ではないですよね。

## VN側でレビューしてもらう　＆ チェック項目を指定してしまう

提携先にアサインされるエンジニアのレベルはコントロール(=予期)しにくいです。出来るエンジニアもいれば、あまり出来ないエンジニアもいます。ひどい場合は、動作確認もしないでPRを送ってくる時もあります。こちらのローカルにpullして動作確認したら早速エラーで動かない→絶望的気分みたいな事も。そういう事態を避けるため、提携先でのレビューを経てからJPでチェックするフローにしています。具体的には、githubのラベル機能を使いステータスを管理しています

![sc 2016-06-04 20.32.52.png](https://qiita-image-store.s3.amazonaws.com/0/27828/42d5e79b-a32c-bc20-5b58-6b6691ea652d.png)

↑ こんな感じ

また、中・大規模な案件の場合は、githubのmarkdownでチェックを付ける機能があるので、それを利用して予めこちらからチェックして欲しい項目を簡易的に指定してしまいます。これを確認してからPRください、というメッセージです

![sc 2016-06-04 20.38.12.png](https://qiita-image-store.s3.amazonaws.com/0/27828/d11e7b3d-d308-9385-fe3e-2d86918d3001.png)

↑ こんな感じ

なるべく仕組みで品質を一定に保ちたいものです。

## 根深い問題の調査が得意

根深い問題の調査依頼や、使うライブラリ候補のpros/consまとめなどが上手です。論理的に考えることが得意な国民性だと聞いていたのですがその通りだなあと思いました。こっちで調査してもいいけど機能開発優先したい〜〜という事は多々あるので助かります。


## たまにKPIをシェアする

サービスが成長していくのは楽しいしモチベーションが上がるものです。適宜、KPIが節目に来たり、当月の調子が良かったりしたときはslackでシェアしています。

```
ex)
UU of xxxx is growing! UU/PV records highest score on this month! Thank you for contributing! :bow:
```

## 運用勘はないのでJPでフォロー

大規模サービスを運用したことのあるエンジニアはベトナムには少ないと思います。なので、テーブルの(ユニーク)インデックスの貼り忘れや、カジュアルにデカイテーブルへのalter tableをPRに含めてきたり、ところどころ雑なUI/UX作りなどは起こりがちです。ある程度はJPでフォローするのはやむなしと考えています。


## まとめ

どうでしょうか。案外、日本の若手エンジニアと仕事をするときと大差ない気がしませんか?一度検討してみるのもよいとおもみます。
最後に、ベトナム料理は日本ではあまり見ませんが非常にうんまいです。現地で本場の味を楽しんで感動しました。こちらも一度ご賞味あれです。
Kernel Connection Mulitplexor (KCM)のプログラムを書くときに知っておくと良いこと

# はじめに

Linux 4.6でマージされたKernel Connection Mulitplexor (KCM)を使ったプログラムを書くときに、あらかじめ知っておいた方が良さそうなことをまとめます。

# 書いたプログラム

[A sample program of KCM](https://gist.github.com/peo3/fd0e266a3852d3422c08854aba96bff5) に書いたプログラムがあります。

やってることは適当なプロトコルを作って、KCMを使ってC/Sで簡単なメッセージのやりとりをしているだけです。プロトコルといっても、文字列を渡すだけのもので、メッセージのヘッダに文字列のサイズが書かれているだけです。BPFがメッセージのヘッダを解釈して、メッセージ毎に分割してユーザプログラムに返してくれます。

# KCMのプログラムを書くときに知っておくと良いこと

とりあえず、以前私が書いた [Kernel Connection Mulitplexor (KCM) - Qiita](http://qiita.com/peo3@github/items/6670e2f7f495e3b5e13f) を読むと概要がわかります :smile: 

- BPFの命令を書く時は [libbcc](https://github.com/iovisor/bcc) を使うと楽
    - [bpf(2)](http://man7.org/linux/man-pages/man2/bpf.2.html)を読むと自分でBPF命令を一命令ずつ記述することになっているが、libbccはC (+ヘルパ関数)で書ける
        - `bpf_module_create_c`, `bpf_module_create_c_from_string`, `bpf_prog_load`といったライブラリ関数を使う
    - Fedora 23だと`libbcc`という名前のパッケージがあるのでこれをインストールする
    - コンパイルするときに`-bcc`を付ける
- `socket(AF_KCM, ...)`とそれをクローン(`ioctl(kcmfd, SIOCKCMCLONE, ...)`)したファイルディスクリプタは同等の関係である
    - なんとなく親子関係があって、実際の通信にはクローンしたファイルディスクリプタを使うものだと思っていたけど、それは間違い
    - socketで作ったものが0番目のディスクリプタでクローンしたものが1番目というだけ
    - なのでクローンしなくてもKCMは使える
    - 特殊なことをしなければ最初にメッセージが届くのは0番目のディスクリプタなので、1番目で受信しようとすると(2個以上メッセージを投げないと)永遠にメッセージが届かなくてハマる...
- `ioctl(kcmfd, SIOCKCMATTACH, ...)`に渡す(TCP)ソケットは、`accept`した後のもの
- BPFプログラムが返す値は、メッセージ全体のサイズ
    - ヘッダを含んだサイズ
- BPFプログラムのサンプルにある`load_word`は64bitの値を返す
    - 32bitの場合は`load_half`
    - 注：アーキテクチャ依存かもしれない
- BPFプログラムの`load_half(skb, 0)`の意味は`sk_buff`にあるデータのオフセット0から32bitを読み込む
- プロトコルヘッダ内のメッセージサイズは(当然)ネットワークバイトオーダーで書く
- `/proc/net/kcm`, `/proc/net/kcm_stats`というKCMの状態を出力するprocfsのファイルがある
    - `/proc/net/kcm`が生成されたTCMインスタンス毎の状態, `/proc/net/kcm_stats`がシステムグローバルの統計情報を返す
    - デバッグするときは、`/proc/net/kcm`の`RX-Msgs`や`RX-Bytes`の値を見て、どのソケット(tcmやpsock)にメッセージが何個届いているか確認することになる

# おわりに

簡単ですが、私がサンプルプログラムを書くときにハマった所を書いてみました。これからKCMを使ってプログラムを書く人の助けになれば良いなと思います。

なお、使い方を完全に理解しているわけではないので、上記内容には間違いがあるかもしれません。もしあれば間違いを指摘していただけるとありがたいです。
Xcode.appのファイル名にスペースを入れていたせいでbrew install pygtkが失敗した件

# 状況
`brew install pygtk`が下記のエラーメッセージで失敗した

    /Applications/Xcode 7.0.1.app/Contents/Developer/usr/bin/make  all-am
    make: /Applications/Xcode: No such file or directory
    make: *** [all] Error 1

### 環境
- Mac OSX 10.10.5
- Homebrew 0.9.5 (git revision 6322c; last commit 2016-02-07)

# 原因
`Xcode 7.0.1.app`に含まれるスペースでパスが途切れてコマンドが正しく渡せてない

ちなみにXcodeはインストール時はXcode.appという名前だが、筆者の環境では複数のXcodeを共存させるためにこのファイル名を変えていた（[Xcodeの複数バージョンを共存](http://qiita.com/k_kuni/items/522719637f2c3f7c2b67)）
なお、この際`xcode-select`でデフォルトで使うXcodeのバージョンを変更している（[xcode-selectによるデベロッパディレクトリ管理](http://qiita.com/gooichi/items/017cf84ec52726ccd785)）

# 対処
- Xcode.appの名前でXcode 7.0.1.appへのシンボリックリンクを作成(`ln -s "/Applications/Xcode 7.0.1.app" /Applications/Xcode.app`)
- 使用するXcodeのパスを変更(`sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer`)
- 改めて`brew install pygtk`

# その他
- そもそもファイル名にスペース入れるべきじゃないので  
 ついでに`Xcode 7.0.1.app`を`Xcode7.0.1.app`にリネームしておくべきかも  
でも負けたような気がして悔しいので今回はこのまま
- 次回別バージョンのXcodeをインストールする機会にXcode.app（シンボリックリンク)を忘れずに削除しておかないと何か問題が起きそうな気がする
paizaのRでプロットがしたい。

#

#概要
paizaのRは、plotが動かん。でもプロットしたい。
#手順1
javascriptを挟んで、プリントアウト。
#実際
https://paiza.io/projects/PkrV2Xmz6GuX6bh4jA_4vg
#サンプルコード
```
cat("<script type=\"text/javascript\" src=\"https://www.google.com/jsapi\"></script><div id='chart'></div>")
cat("<textarea id=\"koko0\">") 
f <- function(x) 1 / (1 + exp(-3 - 0.5 * x))
x <- seq(0, 10, 0.1);
cat(x)
cat("</textarea>")
cat("<textarea id=\"koko1\">")
y <- f(jitter(x, amount = 0.2))
cat(y)
cat("</textarea>")
cat("<textarea id=\"koko2\">")
result <- nls(y ~ a / (1 + exp(-b - c * x)), start = c(a = 2, b = 1, c = 0.1))
predict.c <- predict(result)
cat(predict.c)
#plot(x, y, ann = F, xlim = c(0, 10), ylim = c(0.95, 1));   
#par(new = T)
#plot(x, predict.c, type = "l", xlim = c(0, 10), ylim = c(0.95, 1))
cat("</textarea>")
cat("<script type=\"text/javascript\" src=\"http://jsdo.it/ohisama1/A9Yl.js\"></script>")
```
#手順2
出力をコピーして、jsdoに貼り付ける。
#実際
http://jsdo.it/ohisama1/kske
#写真
![r.png](https://qiita-image-store.s3.amazonaws.com/0/18104/e4c294d5-55f7-860f-5ec0-fd07a6918acb.png)
UIButtonのタイトル文字をチラつかせず変更する + 便利プロパティ化

役に立つかどうかよくわからないTipsシリーズ

UIButtonのタイトルをプログラムから動的に変える時どうしてますか?

```swift
hogeButton.setTitle("ほげほげ", forState: .Normal)
```

まぁ、こんな感じですよねぇ

ただ、これを実際動かすと、文字切替時にボタンがチラつくんですよ
勝手にクロスフェードエフェクトみたいなのがかかってしまうんですね

デフォルトでオシャレなエフェクトがつくのはいいんですけど
要らない時は要らない
いやむしろ要らない時のほうが多い

そんな邪魔な処理を取り除きつつ
もっとシンプルに実装できる方法が以下になります

```swift
extension UIButton {
	
	/// ボタンのタイトルの取得/設定
	var title: String? {
		get {
			return self.titleForState(.Normal)
		}
		set(v) {
			UIView.performWithoutAnimation {
				self.setTitle(v, forState: .Normal)
				self.layoutIfNeeded()
			}
		}
	}
}
```

こういうextensionを書くことによって

```swift
hogeButton.title = "ほげほげ" 
```
おお、シンプル

そもそもボタンは基本的にNormalステータス時の文字列を設定することがほとんどですから
このプロパティは`.Normal`に固定してしまっても構わないと思っています

いわば、Normalステータス専用プロパティです

それ以外のステータスを触りたければ
標準的なやり方である`setTitle(_:forState:)`を使用するか
それ専用に別のメソッドを用意してやればいいわけです

こいつのミソは

```swift
UIView.performWithoutAnimation {
	self.setTitle(v, forState: .Normal)
	self.layoutIfNeeded()
}
```
冒頭の文字の邪魔なエフェクトによってチラつく現象のために
UIViewの`performWithoutAnimation(_:)`でアニメーションエフェクトをはずしてやって
`layoutIfNeeded()`を入れてやることですかね

こうすることで文字だけが入れ替わります


ちなみに、
画像、背景画像、文字色なんかにも使えそうですね
Finder 小技集

Mac の Finder のコマンドをよく忘れてしまうのでまとめていこうと思いました。

# ファイル/ディレクトリの切り取り

1. ` cmd + C ` で対象をコピー
2. 移動先ディレクトリで ` opt + cmd + C `

# 隠しファイルの表示
``` bash
$ defaults write com.apple.finder AppleShowAllFiles TRUE
# Finder を再起動し設定を反映
$ killall Finder 
```

# ファイルのパスをコピーできるようにする
[MacOSでfinderからファイルのパスを簡単にクリップボードにコピーする](http://qiita.com/biatunky/items/e567a8140ddfeef96ffc)
連番アニメーション用のSpriteをImageMagickでつくる


自分用メモ。

UnityのParticleSystemのTextureSheetAnimationを使って
連番画像を表示したい時、連番の素材はあるけど順番に並べて
１枚のSprite画像を用意するのにUnity内でできなさそうだった。

標準のSpritePackerを使ったら画像の順序はバラバラ、
NGUIのAtlasMakerでもそんな感じだった。

よって外部ツールでつくれないかと考え、コマンド一発で
１番楽そうだったImageMagicを利用してやってみた。

シートにしたい画像が入っているフォルダ内で
`montage *.png -tile 7x10 -geometry 512x512 -background transparent hogehoge.png`

*.png フォルダ内の画像
-geometry 512x512 画像１枚のサイズ (512x512+0+0)とかかけば余白も設定できるぽい
-tile 7x10 画像の配置をどうするか 横に7つ、縦に10つ。
-background transparent 透過を有効に
hogehoge.png 出力画像名


無事できましたー。
オフラインリアルタイムどう書くE04 の問題をRubyで解く

問題はこちら
http://mtsmfm.github.io/2016/06/04/doukaku-e04.html

```rb
def to_i(c)
  "ABCDEFGH".index(c)
end

def to_c(i)
  "ABCDEFGH"[i]
end

def solve(q)
  r,s = q.split(':')
  yr = []
  16.times{yr << "_" * (r.size+2)}
  r.split('').each_with_index{|e, i|
    yr[(e.to_i-1)*2+1][r.size - i] = '-'
  }
  si = to_i(s) * 2
  (r.size + 1).downto(0) {|i|
    yr[si][i] = 'x'
    if si == 0 and yr[15][i] == '-'
      si = 14
      yr[15][i] = 'x'
      next
    end
    if si > 0 and yr[si-1][i] == '-'
      yr[si-1][i] = 'x'
      si -= 2
      next
    end
    if si == 14 and yr[15][i] == '-'
      si = 0
      yr[15][i] = 'x'
      next
    end
    if si < 14 and yr[si+1][i] == '-'
      yr[si+1][i] = 'x'
      si += 2
      next
    end
  }
  ok = []
  8.times{|m|
    mi = m * 2
    ng = false
    0.upto(r.size+1) {|i|
       if yr[mi][i] == 'x'
        ng = true
        break
      end
      if mi == 0
        if yr[15][i] == '-'
          mi = 14
          next
        end
        if yr[15][i] == 'x'
          ng = true
          break
        end
      else
        if yr[mi-1][i] == '-'
          mi -= 2
          next
        end
        if yr[mi-1][i] == 'x'
          ng = true
          break
        end
      end
      if mi == 14
        if yr[15][i] == '-'
          mi = 0
          next
        end
        if yr[15][i] == 'x'
          ng = true
          break
        end
      else
        if yr[mi+1][i] == '-'
          mi += 2
          next
        end
        if yr[mi+1][i] == 'x'
          ng = true
          break
        end
      end
    }
    ok << to_c(m) unless ng
  }
  ok.empty? ? "-" : ok.join
end

DATA.readlines.each do |line|
  no,q,a = line.strip.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans
  puts ans == a ? ' o' : ' x'
end
__END__
0	2512:C	DEFGH	状況
1	1:A	CDEFGH	状況
2	:C	ABDEFGH	状況
3	2345:B	AGH	状況
4	1256:E	ABCDH	状況
5	1228:A	ADEFG	状況
6	5623:B	AEFGH	状況
7	8157:C	ABDEFGH	状況
8	74767:E	ABCFGH	状況
9	88717:D	ABCEFGH	状況
10	148647:A	ACDEFH	状況
11	374258:H	BCDEFH	状況
12	6647768:F	ABCDEH	状況
13	4786317:E	ABFGH	状況
14	3456781:C	-	状況
15	225721686547123:C	CEF	状況
16	2765356148824666:F	ABCDEH	状況
17	42318287535641783:F	BDE	状況
18	584423584751745261:D	FGH	状況
19	8811873415472513884:D	CFG	状況
20	74817442725737422451:H	BCDEF	状況
21	223188865746766511566:C	ABGH	状況
22	2763666483242552567747:F	ABCG	状況
23	76724442325377753577138:E	EG	状況
24	327328486656448784712618:B	-	状況
25	4884637666662548114774288:D	DGH	状況
26	84226765313786654637511248:H	DEF	状況
27	486142154163288126476238756:A	CDF	状況
28	1836275732415226326155464567:F	BCD	状況
29	62544434452376661746517374245:G	G	状況
30	381352782758218463842725673473:B	A	状況
```
KotlinでAndroid 事始め

練習も兼ねて初めての投稿です。
AndroidアプリをKotlinで作成するまでの手順をまとめてみます。
# Android Studio のインストール
* [公式ページ](https://developer.android.com/studio/index.html)からダウンロードする

# 新規プロジェクトを作成する
* [File] -> [New] -> [New Project]で作成
* 適当に名前、APIバージョンを指定する
* はじめはシンプルな状態からはじめるので「Empty Activity」を選択する

# プラグインを入れる
* メニューから[Preference]を開く
* 左ペインから「Plugins」を選択し、「Install JetBrains plugin..」を選択
* サーチバーで「Kotlin」と検索し、「Kotlin」というプラグインをインストールする
* Android Studioを再起動する

# とりあえずMainActivityをKotlinへ変換
* MainActivityを左ペインで選択肢、メニューの[Code] -> [Convert Java File to Kotlin File]を選択
* 自動でコンバートされる

# Kotlinファイルをビルドするための設定
* [Buid] -> [Rebuild Project]を選択
* 画面上部に「Kotlin not configured」と「Configure」のリンクが表示されるのでクリックする
    * これでGradleにKotlinをビルドするための設定が自動でされる
* 「Configure Kotlin Project」のダイアログがでるのでそのままOK
    * 任意のKotlinのバージョンを選択してもよい
* Gradleの設定を再読み込みするために、「Sync Now」が表示されるのでクリック
* 再度ビルドすると、ビルドが成功するはず

# ついでにテストファイルもKotlinに変換
* MainActivityの変換と同様の手順を行う
* クラス名の左にある緑の◯を押してテストを実行。グリーンになることを確認

これでKotlinでAndroidアプリを作成する準備が完了。
`gem install pg` が失敗するときの対処法


`pg` をインストールしようとすると次のような結果となる

```bash
$ gem install pg -v '0.18.4'
	Fetching: pg-0.18.4.gem (100%)
	Building native extensions.  This could take a while...
	ERROR:  Error installing pg:
		ERROR: Failed to build gem native extension.
...
```

ログを眺めてみるとこんな内容が書かれている

```.log
clang -E -I/usr/local/Cellar/ruby/2.3.1/include/ruby-2.3.0/x86_64-darwin15 -I/usr/local/Cellar/ruby/2.3.1/include/ruby-2.3.0/ruby/
conftest.c:3:10: fatal error: 'libpq-fe.h' file not found
#include <libpq-fe.h>
         ^
1 error generated.
```

`libpq-fe.h` が見当たらないらしい。
次のコマンドで postgresql をインストールすることで解決。

```bash
brew install postgresql
```

ちなみに、yumとかapt-getとか使ってる場合は次のコマンドを使えばいいらしい
（動作未確認...）

```bash
yum install postgresql-devel
apt-get install libpq-dev
```
CSSアニメーションでmarquee

- 「ページのこの部分を流れる文字にしたいです」と言われてしまった
- &lt;marquee&gt;は使いたくない…

ときのための、CSSアニメーションを使ったスタイル指定のサンプルです。

※「[【CSS3】全ブラウザ対応！ CSS3 で作る marquee の実装。 - ONZE](http://on-ze.com/archives/648)」さんのコードをもとに可変幅にして依存する前提を極力少なくしたものになります。例示用としてベンダープレフィックス(-webkit-等)も外しています。

```css
/** マーキーさせたい部分 */
.marquee {
  overflow: hidden; /* スクロールバーが出ないように */
  position: relative; /* マーキーの内容部分の位置の基準になるように */
}
 /* マーキーの内容部分の高さ確保 */
.marquee::after {
  content: "";
  white-space: nowrap;
  display: inline-block;
}
/* マーキーさせたい部分(内側) */
.marquee > .marquee-inner {
  position: absolute;
  top: 0;
  white-space: nowrap;
  animation-name: marquee;
  animation-timing-function: linear;
  animation-duration: 20s;
  animation-iteration-count: infinite;
}
/* マウスオーバーでマーキーストップ */
.marquee > .marquee-inner:hover {
  animation-play-state: paused;
  cursor: default;
}
/** マーキーアニメーション */
@keyframes marquee {
    0% { left: 100%; transform: translate(0); }
  100% { left: 0; transform: translate(-100%); }
}
```

マーキーさせたい部分は下記のようにタグ付けします。

```html
<div class="marquee">
  <div class="marquee-inner">商品1を入荷しました。ぜひお試しください。</div>
</div>
```

[デモ](http://codepen.io/anon/pen/mEJEye)

### アニメーションの位置指定について
「[スムーズなアニメーションを実装するコツと仕組みを説明するよ。CPUとGPUを理解しハードウェアアクセラレーションを駆使するのだ！（Frontrend Advent Calendar 2013 &#8211; 06日目） | Ginpen.com](http://ginpen.com/2013/12/06/hardware-acceleration/)」 を考えるとアニメーションの位置指定は `translate()` のみでできるとよいと思いますが、「左端にたどり着いて退場したらすぐ右端から出てくる」+「可変幅」を実現しようとすると 

- 流したい要素幅が内容幅ぴったり(shrink-to-fit)になっている必要がある (= `position:absolute` や `float` などの指定が必要。そうでないと、例えば要素幅が500pxで内容幅が100pxくらいだった場合に400px分の空白が流れ終わるのをまたないと右端から出てこない)
- 要素幅を内容幅ぴったりにすると `transform: translate(100%)` が右端に来ない ( `transform: translate(100%)`の代わりに `left: 100%; transform: translate(0);` にすると `transform: translate(-100%)` が左端にたどり着かない )

ということで `translate()` と `left` が両方指定されています…

(図にしてみました)

![css-marquee-2.png](https://qiita-image-store.s3.amazonaws.com/0/782/961209ee-c4fa-c9fb-c761-b17ce19cfd93.png)


他によい方法があればお知らせください。
めざせpythonライブラリマスター （21）hy

#【ライブラリ説明】
　pythonコンソールでLispを実行できます。

#【プログラム】
<img width="357" alt="python_lisp.png" src="https://qiita-image-store.s3.amazonaws.com/0/121997/bf6cfc81-39ef-213e-0873-72a856a2a9f6.png">

#【参考サイト】
　[pypi](https://pypi.python.org/pypi/hy/0.11.1)
　[document](http://docs.hylang.org/en/latest/index.html)
「ドキドキ登山」を ruby で解いた。

問題 http://mtsmfm.github.io/2016/06/04/doukaku-e04.html
実装リンク集 http://qiita.com/mtsmfm/items/6d9112fcc568908caaba
です。

とりあえず、コード。

```ruby
def amida( paths, pos )
  r=[]
  paths.each.with_index(0) do |path, ix|
    cands =  [path, (path+1)%8 ]
    if cands.include? pos
      r.push ix
      pos,=cands-[pos]
    end
  end
  r
end

def can_go( stone_path, paths, x )
  walk = amida( paths.reverse, x ).map{ |x| paths.size-x-1 }
  ( walk & stone_path ).empty?
end

def solve_impl(paths, stone)
  stone_path=amida( paths, stone )
  if stone_path.empty?
    [*0..7]-[stone]
  else
    (0..7).select{ |x|
      can_go( stone_path, paths, x )
    }
  end
end

def solve( src )
  path, stone = src.split(":")
  solve_impl( path.chars.map{|x| x.to_i-1}, stone.ord - ?A.ord ).map{ |x| (x+?A.ord).chr }.join
end

$stdout.sync=true

DATA.map{ |line|
  num, src, exp = line.scan(/(\d+).*\"([^\"]*)\".*\"([^\"]*)\"/).to_a.flatten
  act = solve(src)
  okay = act==exp
  puts( "#{num} #{okay ? "ok" : "**NG**"} #{src}->#{act} / e:#{exp}" )
  okay
}.all?.tap{ |x| puts( x ? "everything is okay" : "something wrong" ) }

__END__
/*0*/ test("2512:C", "DEFGH"
/*14*/ test("3456781:C", ""
/*30*/ test("381352782758218463842725673473:B", "A"
```

いつも通り、テストデータの大半は省略。

当日の説明で一番反響があったのは
`pos,=cands-[pos]`
の部分。
これは、
`pos,_ = cands-[pos]`
の「`_`」を省略したものなので、
`pos = (cands-[pos])[0]`
と同等。

* 横方向の動きのみを記録すればだいたいOK
* しかし、石が横方向に全く動かない場合は特別扱いする必要がある
* 石の動きと人間の動きがほぼ同じなので、どちらも「amida」で実装

という感じの実装になっている。

大変よい問題だったと思う。
私は難しめに感じたけど、会場ではそうでもない感じだった。
オフラインリアルタイムどう書くE04 Ruby で解く

問題はこちら

http://qiita.com/mtsmfm/items/6d9112fcc568908caaba

```rb
require 'bundler/inline'

gemfile do
  source 'https://rubygems.org'

  gem 'activesupport', require: 'active_support/all'

  gem 'minitest', require: 'minitest/autorun'
  gem 'minitest-reporters'

  gem 'awesome_print'
  gem 'tapp'

  gem 'pry'
  gem 'pry-rescue', require: 'pry-rescue/minitest'
  gem 'pry-stack_explorer'
end

MAP = {
  1 => %w(A B),
  2 => %w(B C),
  3 => %w(C D),
  4 => %w(D E),
  5 => %w(E F),
  6 => %w(F G),
  7 => %w(G H),
  8 => %w(H A)
}

def solve(input)
  lines, start_rock = input.split(?:)
  lines = lines.chars.map(&:to_i)

  ng_indexes = []

  rock = start_rock
  lines.each.with_index do |l, i|
    if MAP[l].include?(rock)
      rock = (MAP[l] - [rock]).first
      ng_indexes << i
    end
  end

  dead = []

  puts "start_rock: %s, rock: %s" % [start_rock, rock]

  (?A..?H).each do |man|
    puts man

    pos = man

    lines.each.with_index.to_a.reverse.each do |l, i|
      print pos

      if MAP[l].include?(pos)
        if i.in?(ng_indexes)
          dead << man
          break
        else
          pos = (MAP[l] - [pos]).first
        end
      end
    end

    dead << man if dead.exclude?(man) && (man == rock || pos == start_rock)

    p dead
  end

  ((?A..?H).to_a - dead).join
end

TEST_DATA = <<~EOS
  test("1228:A", "ADEFG")
EOS

Minitest::Reporters.use!(Minitest::Reporters::ProgressReporter.new)

describe 'Doukaku' do
  TEST_DATA.each_line do |test|
    input, expected = test.scan(/"(.*)", "(.*)"/)[0]

    it input do
      assert_equal expected, solve(input)
    end
  end
end
```
オフラインリアルタイムどう書くE04 の問題

@Nabetani さんが主催するオフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/42689 )で問題を出させてもらいました。

問題は「ドキドキ登山」という名前で、詳細は
http://mtsmfm.github.io/2016/06/04/doukaku-e04.html
です。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。
似たような問題をもっと解きたいという方は、Doorkeeper の コミュニティページ
http://yhpg.doorkeeper.jp/
に @Nabetani さんの過去問リンク集がありますので、そちらをご覧になると良いと思います。
AGAL入門 #2 : レジスタのコンポーネント(x,y,z,wプロパティ)を理解する

AGAL入門的メモ第二弾です。
各レジスタには浮動少数値のx,y,z,wのプロパティがあり、コンポーネントと呼ばれます。つまり、レジスタ＝４次ベクトル変数だと思えば良いです。こちらを演算時に指定した場合の挙動についてまとめます。(AGAL固有の話ではなさそう。)

#コンポーネント指定なしでの演算

```sample.agal
mul vt0, vt1, vt2
```

これは下記に等しいです。

```sample.agal
mul vt0.xyzw, vt1.xyzw, vt2.xyzw
```

mul掛け算の命令で、わかりやすく書くと、`vt0 = vt1 * vt2`と、なります。各要素ごとに演算をすることになります。
`vt1 = {1,2,3,4}`、`vt2 = {2,2,3,3}` の場合、 `vt0 = {2,4,9,12}` の結果が入ります。

（`vt1 = {1,2,3,4}`という書き方は`vt1.x=1`、`vt1.y=2`、`vt1.z=3`、`vt1.w=4`の状態をこの記事内のルールとして記してみたものです。）

#コンポーネントを指定指定した演算

４つまで好きな組み合わせ＋好きな順番＋重複ありで記述できます。以下はすべて正しい記述です。ざっと200通り以上組み合わせはありそうです。

```sample.agal
vt0.x
vt0.z
vt0.xy
vt0.yy
vt0.xzz
vt0.zwz
vt0.xxxx
vt0.xzzw
```

演算命令では各コンポーネント指定数を揃えるのが基本になります。コンポーネント指定なしは４つの指定だと思えば良いです。

```sample.agal
add vt0.x, vt1.x, vt2.x
add vt0.xy, vt1.zw, vt2.yy
add vt0.xyz, vt1.yzw, vt2.zzz
add vt0, vt1.zyxw, vt2.yzwy
```

xyzwの順番が入れ替わっている場合も、頭から１つずつ個別の演算をされると思えば良いです。結果をおさめるレジスタにコンポーネント指定して結果をおさめる対象を狭める事を、マスクする、と言います。

`add vt0, vt1.zyxw, vt2.yzwy`をかみ砕いて疑似コードで書くと

```
vt0.x = vt1.z + vt2.y;
vt0.y = vt1.y + vt2.z;
vt0.z = vt1.x + vt2.w;
vt0.w = vt1.w + vt2.y;
```

となります。単純な処理の演算子ではこのような計算になりますが、いわゆる行列演算をする場合はそれぞれで別のルールがあります。外積をベクトル演算する`crs`という命令では、

```
crs vt0.xyz, vt1.xyz, vt2.xyz
//は下記になる
vt0.x = vt1.y * vt2.z - vt1.z * vt2.y
vt0.y = vt1.z * vt2.x - vt1.x * vt2.z
vt0.z = vt1.x * vt2.y - vt1.y * vt2.x
```

という結果になります。

http://help.adobe.com/en_US/as3/dev/WSd6a006f2eb1dc31e-310b95831324724ec56-8000.html ここに各演算時の詳細が記されています。`component-wise`と記載がある命令が最初の例のように要素ごとに演算をする命令となります。`nrm`、`crs`、`m33`、`m34`などは結果を収めるレジスタは3つ以下にマスクされていなくてはいけないと書いてあります。

`m44`演算時などにコンポーネントの順序を入れ替えて指定するとどうなるかは、ちょっとわかりません。そのような需要があるのかどうか含めて、余裕があれば調べてみます。

#コンポーネント指定数がずれた演算

結果がおさめられるレジスタに限っては、他の２つ（１つ）と指定コンポーネント数がずれても演算がなされる場合があります。

```
sub vt0.xyz, vt1.x, vt2.x
//↓
vt0.x = vt0.y = vt0.z = vt1.x - vt2.x;
```

と、なります。（なるはずです。)

#おわりに
`コンポーネント指定数がずれた演算`の項目のように微妙なコンポーネント数指定の演算になるとやってみてのテストが確認がしずらく、かつパターンがたくさんあるので、実際に手元でいろいろ実証できていない状況です。ここでまとめた内容とは違った結果になるかもしれませんが、なにかあれば記事に追加修正します。

そのように微妙なコンポーネント指定をした場合、`mul`の乗算においてAGALのコンパイラ側にバグがあり正しい結果を得られなかった、との情報もあるので、ご注意ください。4年前の情報なのでさすがに修正されているかと思いますが。最新のAGALMiniAssembler.asは[ここ](https://github.com/adobe-flash/graphicscorelib/tree/master/src/com/adobe/utils/v3)にあります。AGAL3まで対応しています。

前回も紹介した、[Introduction to AGAL: Part 2](http://jacksondunstan.com/articles/1664) こちらを元にこの記事をかきました。素晴らしい記事をありがとう。
ドキドキ登山


円形あみだくじの横線で不可なものをマーク。ただし落石が横線にかからなかった場合は特別扱い。

```rb:tyama_henae04.rb
#!/usr/bin/env ruby
#http://qiita.com/mtsmfm/items/6d9112fcc568908caaba
#http://mtsmfm.github.io/2016/06/04/doukaku-e04.html
#1630-1659

N=8

if __FILE__==$0
	while gets
		line=$_.chomp.split(':')
		a=line[0].reverse.chars.map{|e|[(e.to_i+N-1)%N,(e.to_i)%N]}
		idx1=line[1].ord-65
		(a.size-1).downto(0){|i|
			x=a[i].index(idx1)
			if x
				idx1=a[i][x^1]
				a[i][2]=true
			end
		}
		f=a.none?{|e|e[2]}
		puts N.times.select{|i|
			next false if f && i==idx1
			idx=i
			a.all?{|e|
				x=e.index(idx)
				!x || (!e[2] && idx=e[x^1])
			}
		}.map{|e|(e+65).chr}*''
		STDOUT.flush
	end
end
```
contextの使い方

https://tip.golang.org/doc/go1.7#context

Go1.7で golang.org/x/net/context が
標準ライブラリに入るようなので改めて使い方のメモ。

# 変数の管理

```go
ctx := context.Background()
ctx = context.WithValue(ctx, "Foo", 1)
ctx = context.WithValue(ctx, "Bar", 2)

fmt.Println(ctx.Value("Foo").(int)) // 1
```

よくあるやつ。値を代入するたびに新しいcontextが生成される。
なので、乱暴に値を上書かない限りはあまり状態を気にしなくていい。

# TimeoutとCancel

`func WithCancel` `func WithDeadline` `func WithTimeout` はキャンセルを取り扱う。

`WithTimeout`, `WithDeadline` は特定時間になったタイミングでキャンセルされる。
引数で指定の仕方が 何秒後かと時刻指定がなのが違うだけ。

実際に`WithTimeout`の中身は [WithDeadlineを呼んでいる](https://github.com/golang/net/blob/master/context/pre_go17.go#L271-L273)だけ。

## WithTimeout, WithDeadline

指定した時間後にキャンセルイベントが起きる。

```go
// 5秒かかる処理
func heavyFunc(ctx context.Context) {
  time.Sleep(5 * time.Second)
}

func main() {
  ctx := context.Background()
  ctx, cancel := context.WithTimeout(ctx, time.Second) // 1秒後にキャンセル
  defer cancel()

  go heavyFunc(ctx)
  go heavyFunc(ctx)

  select {
  case <-ctx.Done(): // 1秒以上かかると Done() がcloseされる
    fmt.Println("done:", ctx.Err()) // done: context deadline exceeded
  }
}
```

## WithCancel

自分でキャンセルを使う場合に使う

```go
func heavyFunc(ctx context.Context) {
  time.Sleep(5 * time.Second)
}

func main() {
  ctx := context.Background()
  ctx, cancel := context.WithCancel(ctx)

  go heavyFunc(ctx)
  go heavyFunc(ctx)

  cancel() // 即キャンセル

  select {
  case <-ctx.Done():
    fmt.Println("done:", ctx.Err()) // done: context canceled
  }
}
```

# キャンセルの伝搬

親がキャンセルされると子にキャンセルが伝搬されていく

```go
func main() {
  ctx := context.Background()

  parent, parentCancel := context.WithCancel(ctx)
  child, childCancel := context.WithCancel(parent)
  defer childCancel()

  go heavyFunc(ctx)

  go func() { // 親を1秒後にキャンセル
    time.Sleep(time.Second)
    parentCancel()
    fmt.Println("parent cancelled")
  }()

  select {
  case <-child.Done(): // 子もキャンセルされる
    fmt.Println("parent:", parent.Err()) // parent: context canceled
    fmt.Println("child:", child.Err()) // child: context canceled
  }
}
```

# 使い方

goroutineで処理を実行して、所定より時間がかかった場合にエラーを返すのに使う。
ただ、結果が欲しい場合は、contextとは違う形でchannelを使い、値を受け取って返すようにする。(だいたいこっちの使い方になる)

```go
func heavyFunc(ctx context.Context) error {
  time.Sleep(time.Second)
  return nil
}

func exec(ctx context.Context) error {
  errChan := make(chan error, 1)

  go func() {
    errChan <- heavyFunc(ctx)
  }()

  select {
  case <-ctx.Done(): // キャンセルが発生した場合
    return ctx.Err()
  case err := <-errChan: // heavyFuncの結果を取得した場合
    return err
  }
}

func main() {
  ctx := context.Background()
  ctx, cancel := context.WithTimeout(ctx, 2*time.Second) // 全体2秒でタイムアウト
  defer cancel()

  if err := exec(ctx); err != nil {
    log.Fatal(err)
  } else {
    log.Print("ok")
  }
}
```

# まとめ

contextを使うと、値の取り回しやキャンセル処理は楽になる。だけど、goroutineを大量に使って細かく状態を管理をやってくれるものではないので注意。

# 参考

[x/net/context の実装パターン](http://qiita.com/tutuming/items/c0ffdd28001ee0e9320d)
めざせpythonライブラリマスター （20）pyyaml

#【ライブラリ説明】
　yamlファイルを整形できます。

#【プログラム】
```py:pyyaml.py
# -*- coding: utf-8 -*-

import yaml

yaml_data = yaml.dump({'name': "The Cloak 'Colluin'", 'depth': 5, 'rarity': 45,
               'weight': 10, 'cost': 50000, 'flags': ['INT', 'WIS', 'SPEED', 'STEALTH']})
                
print (yaml_data)
'''
cost: 50000
depth: 5
flags: [INT, WIS, SPEED, STEALTH]
name: The Cloak 'Colluin'
rarity: 45
weight: 10
'''

stream = open('document.yaml', 'r')
yaml_data2 = yaml.load(stream)
print (yaml.dump((yaml_data2)))
'''
Hello World: {null: This is madness, gh: 'https://github.com/{0}.git'}
'Yay #python': Cool!
default_context: {greeting: hello, gui: false, someint: 1000000, docs: true, email: raphael@hackebrot.de,
  123: 456.789, foo: 'hallo #welt'}
zZz: true
'''
```

```text:document.yaml
default_context: # foobar
    greeting: hello
    email: "raphael@hackebrot.de"
    docs: true
    gui: FALSE
    123: 456.789
    someint: 1000000
    foo: "hallo #welt" #Inline comment :)
zZz: True


# Block
# Comment

Hello World:
    null: This is madness   # yo
    gh: https://github.com/{0}.git
"Yay #python": Cool!
```

#【参考サイト】
　[PyYAMLホームページ](http://pyyaml.org/wiki/PyYAML)
Rubyのモジュール関数がややこしいのでgemを作った

別件でGemを自作している過程で、モジュール関数のハンドリングがややこしいことに気づいてしまったので、それをすっきりさせようとGemを作ってしまいました。

# モジュール関数とは
Rubyのメソッドは「`public`/`private`/`protected`」や「インスタンスメソッド/クラスメソッド/特異メソッド」というように区分できますが、「モジュール関数」は、これらの区分とは**大きく異なってくる**ものです。

というのも、「モジュール関数」は単体のメソッドを指す語ではなく、

* モジュールの`private`なインスタンスメソッド
* モジュールの`public`な特異メソッド

という、同じ名前・動作の2つのメソッドが存在するときに、その**セット**を指す語、ということです。

このように2つ定義することで、`Math.sin`のようにモジュールから呼ぶ、あるいは`include Math`とすれば`sin`だけで使える、というような利便性を持つことになります。

# ハンドリングの複雑さ

「モジュール関数」が2つのメソッドのセットから成っているので、操作を加えようとすれば何かと厄介なことになります。たとえば、`alias`でメソッドのコピーをしようとすると、`private`なインスタンスメソッドだけコピーされますし、あるモジュールで定義されたモジュール関数を別なモジュールに持って行って、そちらのモジュール関数としようとしても一筋縄では行きません。

# Gem化してみた
ということで、このあたりのハンドリングを担うGemとして、[jkr2255/function_module](https://github.com/jkr2255/function_module)を作ってみました。これには3つの機能があります。

## `Module#module_functions`
引数なしの`public`メソッドで、`private`インスタンスメソッドと`public`特異メソッドの両方で定義されているメソッド（≒モジュール関数）の一覧を返します。なお、`Module`自体やその先祖で定義されたメソッドは除外しています。

## `Module#include_module_functions(mod)`
別なモジュール内で`include SomeModule`の代わりに`include_module_functions SomeModule`とすると、通常の`include`に加えて、`SomeModule`内のモジュール関数を、`include`先の特異メソッドとしても使えるように処理してくれます。

## `Module#alias_module_function(new_name, old_name)`
`alias_method`の代わりにこれを使うと、`private`インスタンスメソッドのコピーだけでなく、特異メソッドの方もコピーします。
XcodeプラグインのXAlignを使う

Xcodeに「XAlign」というプラグインを入れてみましたよ

GitHubはこちら => [XAlign](https://github.com/qfish/XAlign)

##導入

CURLがあるなら、インストールはターミナルでこれを叩いて

```
curl -fsSL http://qfi.sh/XAlign/build/install.sh | sh
```
Xcodeを再起動するだけ


##効果

```swift
let label = UILabel()
label.text = "hoge"
label.textColor = UIColor.darkTextColor()
label.font = UIFont.systemFontOfSize(12.0)
label.textAlignment = .Right
```

プロパティ設定してるところをマウスで選択して`command + shift + x`すると

```swift
let label = UILabel()
label.text          = "hoge"
label.textColor     = UIColor.darkTextColor()
label.font          = UIFont.systemFontOfSize(12.0)
label.textAlignment = .Right
```

イコールで綺麗に揃いました
見やすさアップ!


ちなみにショートカットで揃えてくれるのはイコールのときのようなので
下記のような場合

```
@IBOutlet private weak var headerView: UIView!
@IBOutlet private weak var headerLabel: UILabel!
@IBOutlet private weak var footerView: UIView!
@IBOutlet private weak var selectButton: UIButton!
@IBOutlet private weak var deleteButton: UIButton!
@IBOutlet private weak var collectionView: UICollectionView!
```

Xcodeの `Edit` > `XAlign` > `Variables Group` を選ぶことで

```
@IBOutlet private weak var headerView:     UIView!
@IBOutlet private weak var headerLabel:    UILabel!
@IBOutlet private weak var footerView:     UIView!
@IBOutlet private weak var selectButton:   UIButton!
@IBOutlet private weak var deleteButton:   UIButton!
@IBOutlet private weak var collectionView: UICollectionView!
```

という感じに揃います

##まとめ
綺麗なソースコード。大事!
RTC > ZS-042 > 5Vで使用しないこと + 色々議論

ZS-042というRTCモジュールを購入した。

3.3V/5V両方で動作するとのことだが、5V動作しているとバッテリーが膨らんでくるとのこと。
https://forum.arduino.cc/index.php?topic=278270.0

~~バッテリ(LIR2032)はリンク先の写真右側のオレンジ色のもの。~~

その後いろいろ議論しているようだが、結局どうすればいいのかは把握できていない。

> Ah, ic, but as a LIR2032 is 3.6V, a VCC of 3.3V would be not be sufficient to charge it. So this thing is a complete fail?

という記載が気になる。

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

LIR2032はCR2032と同形の充電式ボタン電池のようだ。
LIR2032は3.6V, CR2032は3V。

以下に別の議論を見つけた。
http://www.meteocercal.info/forum/Thread-ZS-042-RTC-Battery-Problems

> For the obvious reasons I never used a CR2032 battery on these modules. They are designed to be used with LIR batteries, not just CR2032 batteries.

別途
http://wpdbox.blogspot.jp/2015/12/zs-042.html
> LIR2032のボタン電池を載せておけばArduinoから電源が途絶えても時を刻み続ける。(CR2032でも動くことは動くけど仕様上あんまりよくないかも)

<hr>
(追記 2016/06/13)

Vccで充電するからCR-2032でなくLIR2032を使うこと、という記載が以下にある。

http://woodsgood.ca/projects/2014/10/21/the-right-rtc-battery/
> shows a charging circuit (diode and 200Ω current-limiting resistor) designed to RECHARGE the battery when main voltage (Vcc) is applied.

> ...

> The correct battery for this module is therefore a RECHARGEABLE Lithium ion cell, type LIR2032

LIR2032を3V Vccで充電することについては要調査。
Intellij個人的設定 (随時追加)

# 共通

## plugin

気になったものを片っ端から。
主に拡張子に合った設定を追加してる。

## KeyMap

なるべくデフォのままを使いたい。

## code style

(フォーマッタがあればもちろんそれで。)

- method call arguments
  - align when multiple -> false

# Ubuntu 

## keyMap

- Navigate -> Back
  - Alt + Leftに変更
  - Ctrl + Alt + LeftはUbuntuでWorkSpace変更に使うため
  - 便利

- Navigate -> Forward
  - Alt + Rightに変更
  - 同上

- EditorTabs -> select next tab
  - Ctrl + Tabに変更
  - Alt + Rightは上で使ったため。
  - Chromeのtabの設定と同じにするため。

- EditorTabs -> select previous tab
  - Ctrl + Shift + Tabに変更
  - 同上

- EditorTabs -> close
  - Ctrl + wに変更
  - 同上

- navigate class
  - Ctrl + N

- navigate File
  - Ctrl + Shift + N

# Mac

- Navigate -> Back
  - Alt + Leftに変更
  - 便利

- Navigate -> Forward
  - Alt + Rightに変更
  - 同上

- EditorTabs -> select next tab
  - Ctrl + Tabに変更
  - Chromeのtabの設定と同じにするため。

- EditorTabs -> select previous tab
  - Ctrl + Shift + Tabに変更
  - 同上

- EditorTabs -> close
  - Ctrl + wに変更
  - 同上

- quick documentation
  - Ctrl + qに変更
  - Ubuntuに合わせる

- basic/smart completion
  - Cmd + (Shift) + spaceに変更
  - 同上

- reformat code
  - Cmd + i

- navigate class
  - Cmd + N

- navigate File
  - Cmd + Shift + N