OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonで標準（エラー）出力をファイルにすると出力タイミングがおかしい

# はじめに
自分の環境だけでしょうか。

Pythonスクリプトで、標準（エラー）出力をファイルにしたり、他のPythonスクリプトから実行した時、出力のタイミングがおかしい。
printやsys.stdout.writeを実行したタイミングではなく、プロセスが終了した時点で一気に出てきてる。

# ファイルに書いてみる
## 出力タイミングがおかしいスクリプト
実行したPythonスクリプトはこれ。1秒おきに数字を出すだけ。

```py3:child1.py
from time import sleep

for i in range(10):
    print(str(i))
    sleep(1)
```

これを下記コマンドで実行すると、何も出力されず、10秒経過後に一気にログが出る。

```shell-session
$  python3 ./child1.py > stdout.log & tail -f stdout.log
```

## 修正版
次に修正版。printの後にsys.stdout.flushを実行してみる。

```py3:child2.py
from time import sleep
import sys

for i in range(10):
    print(str(i))
    sys.stdout.flush()
    sleep(1)
```
同様に下記コマンドで実行すると、1秒おきに出力される。

```shell-session
$  python3 ./child2.py > stdout.log & tail -f stdout.log
```

ちなみに、

```shell-session
$  python3 ./child1.py
```
と、画面に出力する分には問題なく出力される。

# 別のPythonスクリプトから呼び出す
親スクリプトとしては、[ここ](http://qiita.com/megmogmog1965/items/5f95b35539ed6b3cfa17)に掲載されていたものを使わせてもらった。

```py3:parent.py
import sys
import subprocess

def get_lines(cmd):
    '''
    :param cmd: str 実行するコマンド.
    :rtype: generator
    :return: 標準出力 (行毎).
    '''
    proc = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

    while True:
        line = proc.stdout.readline()
        if line:
            yield line.decode('utf-8')

        if not line and proc.poll() is not None:
            break

if __name__ == '__main__':
    for line in get_lines(cmd='python3 ./child1.py'): # ./child2.pyを実行すると1秒おきに出力される
        sys.stdout.write(line)
```

これだと画面に出力するときでも、child1.pyは10秒後に一気に出力され、child2.pyは1秒おきに出力される

# 結論
そういうもんなんかな？
→[そういうもん](http://qiita.com/mmsstt/items/469a9346ce545709f53c)らしいです。

（追記）
下記コメントでの指摘の通り、python3コマンド実行時に-uオプションをつければ随時出力されることが確認できました。また一つ賢くなりました。
\# 「できなかった」系も書いてみるもんですね。
1>/dev/null 2>&1と2>&1 1>/dev/nullの違い

## はじめに
「Linuxでコマンドをぶったたいてる時どっちが先だっけ？と迷うヤツ選手権」を開いたら、
恐らく、tarか/dev/nullへのリダイレクトが優勝すると思います。
ということで、今回は優勝候補の/dev/nullへのリダイレクトさんについて調べてみます。
順番間違ってても一見行けそうじゃん？と思うけど、実際はいけないんですよね。

## そもそも1とか2とかリダイレクトって何
ところで1とか2とか訳も分からず使ってるけどなんだっけ…という人のために。

1とか2とかは**ファイルディスクリプタ**と呼ばれるものです。(以降FDと略します)
FDは「fd_arrayという配列にある、ファイルオブジェクトを指し示すポインタを指し示すポインタ」です。

…書いてて意味が分からないので、図に示します。

![fd (15).png](https://qiita-image-store.s3.amazonaws.com/0/161568/af206622-3f3b-14ee-1948-26973408fafc.png)

まぁ、背番号みたいなものです。
あー…名前分かんないけど、**西武の背番号24番の人**にこの荷物届けてください！
っていったら**ブコビッチ**に荷物がちゃんと届くようなもんです。

そして、FDの**0**は**標準入力**、**1**は**標準出力**、**2**は**標準エラー出力**と呼ばれています。
通常、プロセスがエラー以外のメッセージを出力するときは標準出力、
エラーメッセージを出力するときは標準エラー出力を利用します。
(意図的にエラーではないメッセージをエラー出力に出す時もあります)

例えば、lsに存在するファイルと存在しないファイルを引数として与えて実行した場合、
見つかったファイル一覧は標準出力にぶん投げ、「そんなファイル見当たらん！」という
エラーメッセージは標準エラー出力にぶん投げます。
どちらも、基本的にはディスプレイに出力されます。

しかしながら、必ずしもディスプレイに表示したいわけではなく、
たまにはコマンド結果をファイルに記録しておきたいこともあります。
エラーメッセージは邪魔だから、エラーメッセージのみ表示しないようにしたい場面もあります。

そういったとき、FDの指し示す先を変更する事を**リダイレクト**と呼びます。

## 1>/dev/null 2>&1の動き
では、ようやく話の中心です。

1>/dev/null 2>&1と2>&1 1>/dev/nullは何が違うのか。
前者はメッセージがすべて表示されなくなります。
後者はありがちな間違いで、エラーメッセージが表示されてしまいます。
前者はいいやつ、後者はだめなやつですね。

まずいいやつから見ていきます。
(実際はプロセスがcloneされるのですが、そこは割愛で)

まず最初に、/dev/nullを開きます。FD3が割り当たります。
![fd (5).png](https://qiita-image-store.s3.amazonaws.com/0/161568/9874b6c9-efa9-848f-99ad-3e029690bd44.png)

次に、FD3を複製してFD1を作成します。つまり、**FD1の参照先が/dev/nullに変わります**。
![fd (6).png](https://qiita-image-store.s3.amazonaws.com/0/161568/96837c16-53da-2908-3cdb-8831b9b5764b.png)

FD3を閉じます。ここまでが1>/dev/nullの中身。
![fd (7).png](https://qiita-image-store.s3.amazonaws.com/0/161568/ad6fd85d-8320-f6a5-efad-026819719c79.png)

そして、FD1を複製してFD2を作成します。つまり、**FD2の参照先も/dev/nullに変わります**。これが2>&1。
![fd (8).png](https://qiita-image-store.s3.amazonaws.com/0/161568/ee705b34-e68f-6c87-b5bc-456666837d21.png)

結果、めでたく**標準出力と標準エラー出力が/dev/nullを向きました。**

## 2>&1 1>/dev/nullの動き
だめなやつです。

まず最初に、FD1を複製してFD2を作成します。この時点で同じものを見ているので、**意味ありません**。これが2>&1。
![fd (9).png](https://qiita-image-store.s3.amazonaws.com/0/161568/db7a4ca8-8e13-16ea-53e5-8e1e7f927fb6.png)

次に、/dev/nullを開きます。FD3が割り当たります。
![fd (11).png](https://qiita-image-store.s3.amazonaws.com/0/161568/43ed2e5b-92ac-b722-3c8a-badde6005ca4.png)

FD3を複製してFD1を作成します。FD1の参照先が/dev/nullに変わります。
![fd (12).png](https://qiita-image-store.s3.amazonaws.com/0/161568/e9704948-7bd1-104c-bcb1-21990673a0b4.png)

FD3を閉じます。ここまでで1>/dev/null。
![fd (13).png](https://qiita-image-store.s3.amazonaws.com/0/161568/9eda3f4f-95fa-9201-503d-75f1a3700f1e.png)

結局、**エラーメッセージが標準エラー出力から画面に出るだけ**です。

## 〆
ただのリダイレクトの話なのに、システムコールまで調べる羽目になりました。
動作的にはこうだろうな～、でもそれってどういう根拠で？
じゃあ調べよう…(ズブズブ

OSとかkernelとかファイルシステムとか考えた人はホント凄いですわ…。
GDC 2017 講演やリールまとめ

# GDC 2017
GDC公式ページ
http://www.gdconf.com/

## Award
2017 IGF & Game Developers Choice Awards

1
https://www.twitch.tv/videos/125742723

2
https://www.twitch.tv/videos/125750472

3
https://www.twitch.tv/videos/125754127

## GameEngine

### Unity
GDC 2017
https://unity3d.com/jp/gdc2017

[![Unity GDC 2017 Keynote](http://img.youtube.com/vi/YHweZ8dhOJA/0.jpg)](https://www.youtube.com/watch?v=YHweZ8dhOJA)


### Unreal Engine

GDC 2017 まもなく開催！
https://www.unrealengine.com/ja/blog/experience-everything-unreal-at-gdc-2017

**twitch Archive**
Unreal Engine - LIVE from GDC! #ue4 #gamedev #unrealengine #anima
https://www.twitch.tv/videos/125625961

https://www.twitch.tv/videos/125883747

**2017 Sizzle Reel | Unreal Engine**
[![2017 Sizzle Reel | Unreal Engine](http://img.youtube.com/vi/Vztn6HPL_Z4/0.jpg)](https://www.youtube.com/watch?v=Vztn6HPL_Z4)

The Imaginarium | Unreal Engine
[![The Imaginarium | Unreal Engine](http://img.youtube.com/vi/fwhvtdPQqd0/0.jpg)](https://www.youtube.com/watch?v=fwhvtdPQqd0)

The Human Race - Behind The Scenes - Unreal 
[![The Human Race - Behind The Scenes - Unreal ](http://img.youtube.com/vi/VJEoY1JT71c/0.jpg)](https://www.youtube.com/watch?v=VJEoY1JT71c)

Lineage II: Revolution Overview | Unreal Engine
[![Lineage II: Revolution Overview | Unreal Engine](http://img.youtube.com/vi/Vk1w7GFqGEg/0.jpg)](https://www.youtube.com/watch?v=Vk1w7GFqGEg)

**State of Unreal | GDC 2017 | Unreal Engine**
[![State of Unreal | GDC 2017 | Unreal Engine](http://img.youtube.com/vi/K6tRt7c2elU/0.jpg)](https://www.youtube.com/watch?v=K6tRt7c2elU)

### Lumberyard

GDC 2017 での Lumberyard
https://aws.amazon.com/jp/lumberyard/gdc2017/

Lumberyard GDC 2017, Moscone Center, San Francisco CA.
https://www.twitch.tv/amazonlumberyard

[![NVIDIA GDC 2017 - Amazon Lumberyard](http://img.youtube.com/vi/mNSHypdQ9jA/0.jpg)](https://www.youtube.com/watch?v=mNSHypdQ9jA)

### SnowDrop
[![Snowdrop GDC 2017プレゼンテーション映像](http://img.youtube.com/vi/aEfktsLN0-0/0.jpg)](https://www.youtube.com/watch?v=aEfktsLN0-0)

## GameEngine関連のTool
### Allegorithmic Substance

**GDC 2017 Allegorithmic Substance Showreel**
[![GDC 2017 Allegorithmic Substance Showreel](http://img.youtube.com/vi/BYQpPK-qrTM/0.jpg)](https://www.youtube.com/watch?v=BYQpPK-qrTM)

### Marmoset Toolbag | GDC 2017 Showcase

Marmoset Toolbag | GDC 2017 Showcase
https://vimeo.com/204026539

## VR

### HTC Vive
HTC and Vive Studios | Hands-on | GDC 2017

[![HTC and Vive Studios | Hands-on | GDC 2017](http://img.youtube.com/vi/tVITXqm2io0/0.jpg)](https://www.youtube.com/watch?v=tVITXqm2io0)

### Oculus

**Oculus at GDC 2017 | Hands-on | GDC 2017**
[![Oculus at GDC 2017 | Hands-on | GDC 201](http://img.youtube.com/vi/dLpXMY9qx6I/0.jpg)](https://www.youtube.com/watch?v=dLpXMY9qx6I)
【AWS】IAM簡易まとめ

[IAM 公式](https://aws.amazon.com/jp/iam/)

# IAMとは
AWSを利用するうえでの、ユーザやその権限。

# AWSリソース
各サービスはAWSリソースという言い方で、都度説明に出てくる。
覚えておこう。

# 料金について
無料

# ユーザ作成の勘所
## アクセスの種類について
**①「プログラムによるアクセス」の有効化**
開発ツール、AWSリソースによっては、
ユーザに一意な「アクセスキーID」「シークレットアクセスキー」が求められる。
その発行を行うかどうか。

各キーの注意点は、発行時のみしか確認できない。
必ず、何らかの方法で保管しておくこと。

**②「AWS マネジメントコンソールへのアクセス」の有効化**
言葉通り。

大半の人はAWSを利用する際に、Webコンソールを使用すると思うので、
その「ログインパスワード」を発行するかどうか。

ユーザ作成後は、所定のURL、ID、ユーザ、パスワードで
Webコンソールにログインする。

## ポリシーとは
AWSへのアクセス権限を設定としてまとめたもの。
このポリシーをユーザやグループに設定する。

単純なポリシーは、AWSで既に用意されており、
使用したいものをアタッチするだけ。

その実態は、JSON形式のテキスト。

```json:例
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": "ec2:*",
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}
```

||説明|
|:--|:--|
|Statement|権限の単位を配列でまとめる親。|
|Action|対象となるアクションを指定。<br>「サービス:アクション」で設定する。|
|Effect|アクションの許可(Allow)か拒否(Deny)。|
|Resource|アクションの対象となるAWSリソース指定。<br>ARNを指定したりする。|

### ARN？
[公式の解説](http://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-arns-and-namespaces.html)

Amazonリソースネームの略称。
AWSリソースはARNで一意に識別できる。

```lang:一般的な形式
arn:partition:service:region:account-id:resource
arn:partition:service:region:account-id:resourcetype/resource
arn:partition:service:region:account-id:resourcetype:resource
```

## グループへの所属
IAMのグループ機能は、ポリシーのグループというだけのこと。
１ユーザに複数のグループ登録が可能。

汎用性をもたせたければ、ユーザよりもグループを作り、グループにポリシーを設定。
ユーザをグループに所属させるほうが良い。

## リソースベースの設定
一部のサービス(S3、SQS、SNS等)に限っては、
そのリソースに対するアクセス設定が可能。

## MFAによるセキュリティ向上
専用端末や、スマートフォンによる認証方式。
特にAWS特有の何かがあるわけではないので、説明は省く。

## ロール
[公式の解説](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles.html)

アカウントに「信用されているユーザ」が「信用したユーザ」に、
一時的に委任するアクセス権限のこと。

各ユーザは、
IAMユーザであったり、特定のサービス(EC2)であったり、
IdPサービスによって認証されたユーザであったりする必要がある。

社内や社外の運用などで考慮することになるものだろう。
ここでは追求しない。
BlueprintのFormatTextノードの使い方 #UE4

UnrealEngine4(以下、UE4）では[文字列型が3つある](https://docs.unrealengine.com/latest/JPN/Programming/UnrealArchitecture/StringHandling/index.html)が、ユーザーにUIなどで表示して見せる文字列は`Text`型であるべきとされている。このText型の文字列の一部を置き換えたり加工したりするのに使えるのが**[FormatTextノード](https://docs.unrealengine.com/latest/INT/BlueprintAPI/Utilities/Text/FormatText/index.html)**だ。

![FT_normal.PNG](https://qiita-image-store.s3.amazonaws.com/0/54764/4f053eb0-6c1d-55b6-d2a9-c02893284439.png)


# TL;DR

* UE4でユーザーに見せる文字列は`Text`型である必要がある
* `Text`型の利点を損なうことなく、加工をするのに必要なのが **FormatTextノード**
* 具体的には**文字列内での変数展開**ができる
* `String`型を加工して使っちゃダメ

# なんで`Text`型を使うの？

* **どこに散らばっていてもgatherできる**
    * [localization dashboardのGatherで横断して収集できる](http://qiita.com/go_astrayer/items/9f6b2eae57c9d7c8efc1#%E6%8A%BD%E5%87%BA%E5%85%83%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B)
    * UMG内, LevelBP, ClassBP, WidgetBP, それらの各種パラメータなどバイナリのアセットファイルを横断して収集する
    * 本来は翻訳用だが、誤植修正や一括置換に使うこともできる
    * バイナリアセット内に含まれることが多いUE4では大きな利点
* UMGで文字列表示は原則`Text`型のみ
    * むりやりキャストすることもできるが、前述の利点がない
    
# FormatTextノードの使い方

## 文字列内で数字の引数を指定する

文字フォーム内の文字列に`{0}`といった記法で記入する。
記入後確定すると、数字の名前の付いた引数ピンがノードに追加される。

![FT_number_params.PNG](https://qiita-image-store.s3.amazonaws.com/0/54764/685f137c-f58c-c927-36c4-705c1437290a.png)

引数ピンは`Wildcard`型で以下の型が引数として許される。

 * 数値：`Byte`, `Integer`, `Float`
 * 文字列： `Text`
 * Enum: `ETextGender`

## 文字列内で名前つき引数を指定する

文字フォーム内の文字列に`{param}`といった記法で記入する。
記入後確定すると、その`param`という名前の引数の入力ピンが追加される。

![FT_named_param.PNG](https://qiita-image-store.s3.amazonaws.com/0/54764/bf7dd75e-b799-f49d-2e38-30bf913cf04c.png)

他の挙動も数字の引数と同じ。
マジックナンバーを防止する意味ではこちらのほうが良いかも。

## Formatピンにノードをつないだ後に +Add Pin

まずは引数を含んだ`Text`文字列を用意する（`Text`型の変数のデフォルト値や`MakeLiteralText`ノードで）。これを`Format`ピンにつなぐ。

![FT_addpin_01.PNG](https://qiita-image-store.s3.amazonaws.com/0/54764/8f46d862-6ba9-b8a1-f090-521c01396b4d.png)

すると`+Add Pin`ボタンが増えるのでクリックして入力ピンを増やす。

![FT_addpin_02.PNG](https://qiita-image-store.s3.amazonaws.com/0/54764/4a72c8d8-479c-4d26-bf6a-462126255967.png)

そのままでは`0`という名前の入力ピンで`{0}`以外は置き換えできないのでDetailsパネルで引数名（ピン名）を変更する。

![FT_addpin_03.PNG](https://qiita-image-store.s3.amazonaws.com/0/54764/a82125f9-051a-48e1-5390-bcb375357d9d.png)


この方法は手間は多いが文字列の中身にかかわらずピンを増やすことができる。

# まとめ

![FT_Sample.PNG](https://qiita-image-store.s3.amazonaws.com/0/54764/d00bd575-6c25-5638-d7c9-a80a71141a52.png)
![FT_print_text.PNG](https://qiita-image-store.s3.amazonaws.com/0/54764/2bfe92ba-c599-296f-4aa8-67e6834dd387.png)


# 参考

- [ユーザーに表示するテキストの書式設定](https://docs.unrealengine.com/latest/JPN/Gameplay/Localization/Formatting/index.html)
Rustをcross compileしてRaspberry Pi3で動かすぞ！

手元の良いマシンでRustのコンパイルして，それをRaspberry Pi3へ持っていって実行したい．．．

だけど，手元のマシンは `x86_64` で，Raspberry Pi3は `aarch64(ARM)` だから持っていくだけでは実行できない．．．
ということで，Rustでクロスコンパイルをして`x86_64`上で`aarch64`向けのバイナリを作りましょう！

# 環境
* ビルド環境
	* Ubuntu 16.04.2 LTS 64bit
	* `x86_64`
* Raspberry Pi3
	* ArchLinux ARM
	* `aarch64`

# 前提
Rust周りの開発環境は整っていることとします．（`cargo build`で自分のアーキテクチャ向けのコンパイルは出来る．)

# サマリ
別のアーキテクチャ向けにコンパイルできればよいので，`cargo build --target <another architecture>`ができるのがゴール．

RaspberryPi3は`aarch64`だったので，`aarch64-unknown-linux-gnu`に向けてコンパイル出来るようにする．

1. `rustup`で`aarch64`向けの`toolchain`をインストール 
	* `rustup install nightly-aarch64-unknown-linux-gnu`
	* ここでは`nightly`を使ってますが，お好みに合わせてどうぞ
1. `aarch64`向けのリンカが必要なので，`aarch64`向けの`gcc`をインストール
	* `sudo apt install gcc-aarch64-linux-gnu`
1. デフォルトで`aarch64`向けにビルドするようにプロジェクト配下の`.cargo/config`に次のものを追加

	```toml:.cargo/config
	[build]
	target="aarch64-unknown-linux-gnu"

	[target.aarch64-unknown-linux-gnu]
	linker = "aarch64-linux-gnu-gcc"
	```
1. `cargo build` すると，`aarch64`向けのバイナリが生成されます

Raspberry Pi3に持っていって実行しましょう！！！

# 説明
## `rustup`で`aarch64`向けの`toolchain`をインストール 
通常だと，以下のようにその環境向け（例えば`x86_64`）の`toolchain`しかインストールされていません．

```
$ rustup toolchain list
stable-x86_64-unknown-linux-gnu
nightly-x86_64-unknown-linux-gnu (default)
```

がしかし，RaspberryPi3上で`uname -m`を叩くと`aarch64`と表示されるので，`aarch64`向けの`toolchain`が必要そうです．

これを探すために`$rustup target list | grep aarch64`と叩くと以下のようになります．

```
$ rustup target list | grep aarch64
aarch64-apple-ios
aarch64-linux-android
aarch64-unknown-linux-gnu
```

`linux`向けの`aarch64-unknown-linux-gnu`が見つかりました！これを使うこととしますのでインストールします．

```:stableの場合
$ rustup install stable-aarch64-unknown-linux-gnu
```

```:nightlyの場合
$ rustup install nightly-aarch64-unknown-linux-gnu
```


これで一旦整ったと思い，おもむろに

```
$ cargo build --target=aarch64-unknown-linux-gnu
```

と叩くと，`ld`周りでエラーが出て，リンカがおかしいみたいだということがわかります．



## `aarch64`向けのリンカが必要なので，`aarch64`向けの`gcc`をインストール
ここ(https://github.com/japaric/ruststrap/blob/master/1-how-to-cross-compile.md) を見ていると，どうやら `rustc` がリンクを行うときにシステムのアーキテクチャのリンカをデフォルトで使ってしまうようで，指定してあげなければならないとのこと．

そこでまず，`aarch64`向けのリンカをインストールするために`gcc`ごと入れちゃいます

```
$ sudo apt install gcc-aarch64-linux-gnu
```

## デフォルトで `aarch64` 向けにビルドするようにプロジェクト配下の `.cargo/config` に次のものを追加

先の作業でリンカが手に入ったので`cargo`に使うリンカを教えてあげましょう．

そのためにプロジェクト配下の`.cargo/config`を以下のように書き換えます．

```toml:.cargo/config
[build]
target="aarch64-unknown-linux-gnu"

[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc"
```

このようにすることで，`cargo build`の際のデフォルト`target`が`aarch64-unknown-linux-gnu`になり一々指定しなくて良くなります．

また，`target`が`aarch64-unknown-linux-gnu`の時の`linker`を指定してあげることで`aarch64`向けのビルドの際には`aarch64`向けのリンカを使ってくれる様になります．


# 結論
Write once in Rust, run anywhere! 
(極めて言い過ぎ
X10インストール備忘録

# なにこれ

X10(http://x10-lang.org/) の処理系をVM上のArch Linuxに入れた。そのうち手順忘れそうなのでメモ取っとく。MPIランタイムが欲しいのと、ランタイムを最適化しておきたいのとで、ソースコードからビルドする。

# なんでWindowsに入れないの

Cygwin64bit環境下ではC++バックエンドがまともに動かない。

# 手順

手順はだいたい http://x10-lang.org/x10-development/building-x10-from-source.html に従う。

# 作業ログ

$HOME/x10ディレクトリ内でx10をクローンして、ここでビルドする。だから~/x10/x10というディレクトリ内で作業することになる。

## ソースコードの取得

ドキュメントはなぜかsshでcloneしているが、cloneするだけなんだからプロトコルはgitでいい。

```
iz@vm-arch ~/x10> git clone git://github.com/x10-lang/x10.git
Cloning into 'x10'...
remote: Counting objects: 345529, done.
remote: Total 345529 (delta 0), reused 0 (delta 0), pack-reused 345529
Receiving objects: 100% (345529/345529), 394.34 MiB | 1.84 MiB/s, done.
Resolving deltas: 100% (242306/242306), done.
```

## ビルド

次のものを事前にインストールしておく。

* jdk
* apache-ant
* gcc, g++
* openmpi

あと素の状態だとjni.hが見つからないらしいので、環境変数JAVA_HOMEを適当に設定しておく。

ドキュメントのサンプルは'squeakyclean'とかいうオプション付けてるけど、これは多分今まで作成したバイナリファイルなどをいったん全部消去したうえでビルドする、というようなものなので、初回にやるときにはいらないし、むしろ○○が足りなくてビルド失敗したーってときに、本当に全部最初からやり直しすることになるので無いほうがいい。

```
iz@vm-arch ~/x10> set -U JAVA_HOME /usr/lib/jvm/java-8-openjdk/
iz@vm-arch ~/x10> cd x10/x10.dist
iz@vm-arch ~/x/x/x10.dist> ant -DNO_CHECKS=true -Doptimize=true -DX10RT_MPI=true dist
```

## インストール

インストールに特別な作業は必要ない。それっぽい場所(/usr/localなど)に置きたければ、cloneしてできたx10ディレクトリをそこにmvすればいい。

あとはパス通すだけ。

```
iz@vm-arch ~> set -U fish_user_paths $fish_user_paths $HOME/x10/x10/x10.dist/bin
```

おしまい。
focusin/focusoutでメニュー外をクリックしたら勝手に閉じるドロップダウンメニュー

[【CSS4】:focus-withinでクリックタイプのドロップダウンメニュー？](http://qiita.com/chisyamori/items/37ad3489a93c769156af)
↑先日のこれは、
http://caniuse.com/#search=focus-within
このように、現状実務では使えません。
仕方ないのでjavascriptで実装してみましょう。
focusin/focusoutイベントを使います。
http://caniuse.com/#search=focusin
これは、focus/blurイベントのバブルアップする版です。`:focus-within`と似てるね！
Firefoxは次期バージョンである52からとなっていますが、試してみたら51でもなんかいけた。
というわけで現状、モダンブラウザでは問題なく使えそうです。

```html:dropdown.html
<div tabindex="-1" class="dropdown">めにう
  <ul>
    <li><a href="/hoge">hoge</a></li>
    <li><a href="/fuga">fuga</a></li>
    <li><a href="/piyo">piyo</a></li>
  </ul>
</div>
```

```css:focusin.css
.dropdown > ul {
  display: none;
}
.dropdown.focused > ul {
  display: block;
}
```

```javascript:focusin.js
$(".dropdown")
  .on("focusin", function() {
    $(this).addClass("focused");
  })
  .on("focusout", function(ev) {
    if($(ev.relatedTarget).closest(this).length) { return; }
    $(this).removeClass("focused");
  });
```

ごみん`.closest()`のとこがめんどくさそうだったのでjQuery使ってしまいました。
`event.relatedTarget`には次にフォーカスを受け取る要素が入ります。
要するに focusout の発火原因となった要素がメニュー内のものだったらメニューの表示を継続するという処理です。

blurイベントだとrelatedTarget受け取れないんじゃないかなあ。試してないのでわからんけど。
jenkins の表示時間を日本時間にする

# 表示時刻を日本時間にする

## デフォルトの場合
/etc/default/jenkinsの中の`JAVA_ARGS="-Dorg.apache.commons.jelly.tags.fmt.timeZone=Asia/Tokyo"`というふうに付け加えて再起動`service restart jenkins`をすれば良い

## 前回投稿した記事のようにSystemdに移動した場合

前回投稿した記事：[jenkins が他のプロセスによってダウンするのを防ぐ](http://qiita.com/gymnstcs/items/51fee25bdcd5d0720922)

には、以下のように変更

```
-Dorg.apache.commons.jelly.tags.fmt.timeZone=Asia/Tokyo
```
を`ExecStart`に追加し、以下のようにすればオッケー！

```
ExecStart=/usr/bin/java -Djava.awt.headless=true -Dorg.apache.commons.jelly.tags.fmt.timeZone=Asia/Tokyo -jar /usr/share/jenkins/jenkins.war --webroot=/var/cache/jenkins/war --httpPort=8080 
```
gem install mysql2 エラーの対策

## 経緯
ruby で MySQLを操作するためのプログラムを書きたくて、gemのmysql2をインストールしようとした際にハマったので自分のための備忘録。


## 環境

Ubuntu16.04
ruby2.3


## エラー

```
admin@hoge:/usr/local/share/update_pdns$ sudo bundle install --path vender/bundle
Don't run Bundler as root. Bundler can ask for sudo if it is needed, and installing your bundle as root will break this application for all non-root users on this machine.
Fetching gem metadata from https://rubygems.org/..............
Fetching version metadata from https://rubygems.org/.
Resolving dependencies...
Using concurrent-ruby 1.0.5
Using i18n 0.8.1
Using minitest 5.10.1
Using thread_safe 0.3.6
Using arel 7.1.4
Using mime-types-data 3.2016.0521
Installing mysql2 0.4.5 with native extensions
Using bundler 1.14.5
Using tzinfo 1.2.2
Using mime-types 3.1
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /usr/local/share/update_pdns/vender/bundle/ruby/2.3.0/gems/mysql2-0.4.5/ext/mysql2
/usr/bin/ruby2.3 -r ./siteconf20170303-8868-1xsjnvm.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in /usr/local/share/update_pdns/vender/bundle/ruby/2.3.0/gems/mysql2-0.4.5 for inspection.
Results logged to /usr/local/share/update_pdns/vender/bundle/ruby/2.3.0/extensions/x86_64-linux/2.3.0/mysql2-0.4.5/gem_make.out

An error occurred while installing mysql2 (0.4.5), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.4.5'` succeeds before bundling.

```

mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

どうやら rubyのヘッダーファイルが見つからないとのこと。

## 対策

```
$sudo aptitude install ruby-dev
```

ruby-devパッケージにヘッダーファイルが格納されてるらしい。
これをインストールしたら解決しました！

## 参考 URL

https://www.xmisao.com/2014/07/06/cannot-load-such-file-mkmf.html
Skypeのユーザ検索結果に非公開にしたいアカウントが含まれないよう設定する

# 概要
* Skypeと紐づけた覚えの一切ないマイクロソフトアカウントが勝手にSkypeの検索候補に出てくるので、Skypeのアカウントの検索候補から除外したい。
* 日本で多い苗字の「田中」で検索するとこんな感じですが、珍しい苗字だとすぐ個人が特定されてしまいます。マイクロソフトさん勘弁してください・・・

![skype00.png](https://qiita-image-store.s3.amazonaws.com/0/75076/3c721009-f2bb-155f-8409-26eff660c64a.png)

# 対策方法

* マイクロソフトアカウントのプロフィール設定画面へアクセス "https://secure.skype.com/portal/profile"

* 編集
![skype01.png](https://qiita-image-store.s3.amazonaws.com/0/75076/5bc86095-fdcb-4348-000c-01c482baa150.png)

*「人の検索および候補の表示に自分を含める」のチェックを外して保存

![skype02.png](https://qiita-image-store.s3.amazonaws.com/0/75076/7b95e9b0-1a12-ffdc-0957-a2d2fe963ac6.png)

以上で検索結果からは除外されるようになっているようです。

* Skypeの公式ヘルプによると マイクロソフトアカウントと Skypeアカウントの紐づけを解除することはできず、マイクロソフトアカウントを削除するしかないようですが、そんな事をするとOffice365や Azureなどの購入履歴も一緒に消えてしまうので なんだかなーもう (;´Д｀)
* Skype ヘルプ： https://support.skype.com/ja/faq/FA12060/skypenoakauntotomicrosoftnoakauntoworinkushitari-rinkuwojie-chu-shitarisurukotohadekimasuka
摸摸看 RxSwift - DisposeBag, 在 RX 中一個類似於 ARC 的機制

在每一段 RxSwift 在 subscribe （訂閱、註冊，也就是開始觀察變化）的時候，最後都會出現一段

```Swift
.addDisposableTo(disposeBag)
```

或是比較新的寫法（也是官方建議的寫法 - [CHANGELOG - 3.2.0](https://github.com/ReactiveX/RxSwift/blob/master/CHANGELOG.md)）

```Swift
.disposed(by: disposeBag)
```

這篇就是要說這個 DisposeBag 是什麼東西。

因為才剛始接觸 RxSwift ，如果有錯誤的地方，歡迎透過 edit request 或是下面留言提出來，謝謝。

## 袋子

> `DisposeBag`

從字面上來看，他就是一個袋子。 他是個有著類似於 ARC 的機制的類別，並具備 thread safe 的特性。

`DisposeBag` 這個類別是隸屬於 `RxSwift` ，所以也需要 import 這個 module 進到使用的檔案，通常會和 `RxCocoa` 這個 module 一併引入。

**用途**
> 他就是拿來裝可以被丟掉 (disposable) 的物件

**釋放**

在 DisposeBag 被釋放前，也就是他自己的 `deinit` 方法，這個袋子裡面裝的 disposables 就會被釋放掉了。

## 使用

在使用的時候，通常會有個 instance property 來放這個參數。

```swift
var disposeBag = DisposeBag()
```

## 手動釋放

如果不想要等到 disposeBag 所在物件的生命週期結束才釋放，可以選擇手動將原本的 disposeBag 替換成新的 instance 即可：

```
self.disposeBag = DisposeBag()
```

在沒有 memory leak/ retain cycle 的情形之下，原本的 `DisposeBag` 物件就會被 ARC 回收、自然而然會呼叫 `deinit` 把所握有的資源全部釋放掉。

## 參考
- [Getting Start - disposeBag](https://github.com/ReactiveX/RxSwift/blob/master/Documentation/GettingStarted.md#dispose-bags)
- [RxSwift Source Code - DisposeBag.swift](https://github.com/ReactiveX/RxSwift/blob/master/RxSwift/Disposables/DisposeBag.swift)

## 這篇在這裡也可以看
- [Qiita](https://medium.com/@vc7/%E6%91%B8%E6%91%B8%E7%9C%8B-rxswift-disposebag-%E5%9C%A8-rx-%E4%B8%AD%E4%B8%80%E5%80%8B%E9%A1%9E%E4%BC%BC%E6%96%BC-arc-%E7%9A%84%E6%A9%9F%E5%88%B6-ba7a4b42ce93#.hhr5q8lag)
[翻訳] LLVMコーディング標準3.9.1（１/４）：目次＆はじめに

コード整形には`clang-format`がいいらしい
　→ベーススタイルの１つとして、LLVM coding standardsがある
　　→先進的な感じに憧れるが、日本語資料が無い

ということで、LLVM coding standardsを翻訳してみました。
LLVM3.9.1版のドキュメントを元にしています。

[新版対応はこちら](//qiita.com/tenmyo/items/7e4847b88e63d5769dd8)


LLVMコーディング標準
=====================
[原文](http://releases.llvm.org/3.9.1/docs/CodingStandards.html)

目次
----
- [はじめに](#はじめに)
- [言語、ライブラリ、および標準](/tenmyo/items/e1194d8093b7a79abd5f)
    - C++標準のバージョン
    - C++標準ライブラリ
    - 利用するC++11言語とライブラリの機能
    - その他の言語
- [機械的なソースの問題](/tenmyo/items/eb0fd21212ff0184e933)
    - ソースコードのフォーマット
        - コメント
            - ファイルのヘッダ
            - クラスの概要
            - メソッド情報
        - コメント書式
        - ドキュメンテーションコメントでのDoxygenの使用
        - #includeの形式
        - ソースコードの幅
        - タブの代わりにスペースを使う
        - コードインデントの一貫
            - ラムダはコードブロックと同様に整形
            - ブレース初期化子リスト
    - 言語とコンパイラの問題
        - コンパイラ警告はエラーと同様に扱う
        - 移植可能なコードを書く
        - RTTIや例外を使わない
        - 静的コンストラクタを使わない
        - classとstructキーワードの使用について
        - ブレース初期化子リストはコンストラクタ呼び出しに使わない
        - コードを読みやすくするためにauto型推論を使う
        - autoでの不必要なコピーに注意
- [スタイルの問題](/tenmyo/items/c452c5c527b743d4b96e)
    - 高位の問題
        - 公開ヘッダファイルはモジュール
        - #includeは最低限に
        - 「内部」ヘッダは非公開
        - 早期終了とcontinueでコードをシンプルに
        - return後にelseを使用しない
        - Predicateはループから関数へ
    - 低位の問題
        - 型、関数、変数、および列挙子への適切な命名
        - アサートたっぷり
        - using namespace stdを使わない
        - ヘッダ内クラスは仮想メソッドアンカーを提供する
        - 列挙型を網羅したswitchにdefaultを使わない
        - ループで毎回`end()`を評価しない
        - #include <iostream>禁止
        - raw_ostreamの使用
        - std::endlを避ける
        - クラス定義内の関数定義で`inline`を使わない
    - 微視的詳細
        - 括弧の前にスペース
        - 前置インクリメントの選好
        - 名前空間のインデント
        - 無名名前空間
- See Also


はじめに
------------

この文書は、LLVMのソースツリーで使用されているいくつかのコーディング標準を記述しようと試みたものです。コーディング標準は、すべての事例で従うべき絶対的な要件とみなされるべきではありませんが、（LLVMのような）ライブラリベースの設計に従った大規模なコードベースでは特に重要となります。

この文書は、いくつかの機械的な書式設定の問題、空白やその他「微視的な詳細」のための指針を提供しますが、これらは固定的な基準ではありません。常に以下のゴールデンルールに従ってください。

**あなたが既存のコードを拡張、強化、または修正する場合は、すでにソースが用いているスタイルを踏襲してください。**


注意：一部のコードベース（例えば `libc++`）はコーディング標準から逸脱する本当に良い理由があります。例えば `libc++` の場合、命名およびその他の規則は、C++標準で定められています。もしここの標準から逸脱する特定の正当な理由があると思われる場合は、ぜひそれをLLVM-devメーリングリストへ挙げてください。

コードベースにはいくつかの逸脱も含まれます（例えば、命名規則）。これらは比較的新しく、またコードベースへの格納前に多くのコードが作成済みであったためです。私たちの長期的な目標はコードベース全体が規則に従うことですが、既存コードを大きく再フォーマットするパッチは*望んでいません*。何か別の修正を行う際に、併せてそのクラスのメソッドの名前を変更することは妥当です。ただし、機能変更と再フォーマットはコミットを分けてください。

これらのガイドラインの究極の目標は、私たちの共通のソースベースの可読性と保守性を高めることです。もし含まれるべきトピックの案があれば、ぜひ[Chris](mailto:sabre@nondot.org)までメールください。

----
[目次](#目次) | [次：言語、ライブラリ、および標準](/tenmyo/items/e1194d8093b7a79abd5f)

----
Windows10のL2TP/IPsec VPNで認証プロトコルにMS-CHAPv2を使いたい

Windows 8.1までは「ネットワークと共有センター」から「アダプターの設定の変更」を選ぶとVPNの接続プロファイルが表示されたので、そのプロパティの「セキュリティ」タブで「次のプロトコルを許可する」を選択することで、MS-CHAPv2を有効にできた。

![プロパティ](http://jpn.nec.com/univerge/ix/Support/l2tp_ipsec/img/Windows7-10.png)

Windows 10ではなぜかこの方法が使えないので、PowerShellからコマンドレットを叩く。

```powershell
PS> Set-VpnConnection -Name "VPNプロファイル名" -AuthenticationMethod MSChapv2
```
大きなフォルダをduコマンドで確認する

### ディスク容量を確認するコマンド
``` 
$ sudo du -sh *

4.0K	package.json
33.8M	server
 101M	src
4.0K	tsconfig.json
```

### 容量が多いフォルダを探せるコマンド
```
$ sudo du -g -x -d 10 / | awk '$1 >= 10{print}'

10	/.MobileBackups
16	/Applications/Xcode.app/Contents
18	/Applications
```

上記のコマンドで10GB以上のフォルダを確認できます。
slackのIncoming Webhookを試してみた。

# はじめに
仕事で **slack** を利用している人は多いと思います。チャットだけでなく、GitHubやZabbixなど、いろんな外部サービスと連携することも可能です。
そんなわけでまずは **Incoming Webhook**を試してみました。


# 設定
まずは [**slack API**](https://api.slack.com/) のページへ行き、 **Start Building** をクリックします。
![slack-inncommint-webhooks01.png](https://qiita-image-store.s3.amazonaws.com/0/82090/6ea0095f-320d-56a7-e5b2-a8ee7fd23f05.png)

#### ***Create an App***
すると Web API 作成画面が現れるます。
**App Name** と **Development Slack Team** を選択したら **Create App** をクリックして作成します。
![slack-inncommint-webhooks02.png](https://qiita-image-store.s3.amazonaws.com/0/82090/f8062ff6-853b-ba8a-39cb-ffeb3676597a.png)

#### ***Incoming Webhooks***
作成したら Features の **Incoming Webhooks** から、 **Activate Incoming Webhooks** を **On** にします。
![slack-inncommint-webhooks03.png](https://qiita-image-store.s3.amazonaws.com/0/82090/1a46d66c-6977-eddb-60ac-f9879e645dd6.png)

**On** にすると Webhook URLの作成ができるようになるので、 **Add New Webhook to Team** をクリックして作成画面へと進みます。
![slack-inncommint-webhooks03.png](https://qiita-image-store.s3.amazonaws.com/0/82090/9e82fc31-856a-5fec-4b84-eb9b654cbbcc.png)

ここでは投稿先をとなる **Channel** の指定を行います。
今回はとりあえず *#general* を指定し、 **Authorize** をクリックして作成します。
![slack-inncommint-webhooks05.png](https://qiita-image-store.s3.amazonaws.com/0/82090/5900dadd-424e-7ec8-b6d2-9ec25dfa06ca.png)

すると、 **Webhook URL** に先ほど作成した *#general* 宛のURLがリストされます。
![slack-inncommint-webhooks06.png](https://qiita-image-store.s3.amazonaws.com/0/82090/de716f2b-fd1c-849f-3cfd-b88d7707d5ca.png)

以上で設定は完了です。

# 投稿
ということで投稿してみます。
同じように作成していた場合、 **Sample curl request to post to a channel** をコピペするだけで大丈夫です。
![slack-inncommint-webhooks07.png](https://qiita-image-store.s3.amazonaws.com/0/82090/6d98e073-f773-8fa4-528e-7e1672a74f6d.png)

もし、違った場合はURLの部分を該当のURLヘ書き換えて実行しましょう。

```bash:コマンド(Hello,World!)
$ curl -X POST -H 'Content-type: applicatiodata '{"text":"Hello, World!"}' https://hooks.slack.com/services/*********/*********/************************''
```

APPからslack に *Hello, World!* と投稿されたら成功です。
![slack-inncommint-webhooks08.png](https://qiita-image-store.s3.amazonaws.com/0/82090/3dc29e4c-f760-bf5a-c2ce-c13204ba6934.png)

また、 *text* の内容を変えれば違う言葉を投稿することも可能です。

```bash:コマンド(こんにちは)
curl -X POST -H 'Content-type: application/json' data '{"text":"こんにちは!"}' https://hooks.slack.com/services/*********/*********/************************''
```

![slack-inncommint-webhooks09.png](https://qiita-image-store.s3.amazonaws.com/0/82090/862e2dbc-2afc-9c05-a2ca-06cf966acb00.png)


# おわりに
ちょっと設定するだけで Incoming Webhook はとても簡単に利用できます。
これを元にいろいろ試せたらなと思います。
摸摸看 RxSwift - 引子

這篇是「摸摸看 RxSwift」系列的第一篇
來日之後，穿梭在大大小小的 iOS 聚會，RxSwift 的聲音不絕於耳。
說是在幫 RxSwift 大力傳教也不為過。

對於 RxSwift 採用的各個階段，
比較深的包含設計模式、還有接近入門的導入思維，
甚至是對 RxSwift 的相依等議題，
在這些聚會的 LT 中陸續都有被提出來。

不論現階段還是未來會不會用到，
作為未來是否採用，和評估的基準，
決定來用用看 RxSwift 。

## 這篇在這裡也可以看
- [Medium](https://medium.com/@vc7/%E6%91%B8%E6%91%B8%E7%9C%8B-rxswift-%E5%BC%95%E5%AD%90-c7b94b6b2e89#.2y3ymii7b)
CMake : Custom Target 調べてみた

CMakeをマスターするには、custom_targetをマスターする必要がありそうです。
といわけで、チュートリアル作ってみました。


# Step1

カスタムターゲットを追加するには、`add_custom_target`コマンドを使います。
一番簡単な例をやってみましょう。下記のようなCMakeListsを用意することで、ターゲット`hello_cmake`を追加できます。



``` cmake:CMakeLists.txt
add_custom_target(hello_cmake)
```

いつもどおり、cmakeを実行します。

```
mkdir build
cd build
cmake ..
```

ここで、
```
make help
```
と実行してみてください。

```
$ make help
The following are some of the valid targets for this Makefile:
... all (the default if no target is provided)
... clean
... depend
... rebuild_cache
... edit_cache
... hello_cmake
```

一番下に、先ほど追加したターゲット`hello_cmake`が追加されてますね。このターゲットをビルドしてみましょう。
```
$ make hello_cmake
Scanning dependencies of target hello_cmake
Built target hello_cmake
```

`hello_cmake`をビルドしたようです。ですが、ビルド時に実行するコマンドを指定してないので実際には何もしてません。


# Step2
`hello_cmake`ビルド時に実行するコマンドを指定しましょう。
ここでは、`echo Hello CMake`を実行してみます。
先ほどのCMakeLists.txtを以下のように書き換えてください。

```
add_custom_target(hello_cmake echo Hello CMake)
```

もう一度`hello_cmake`をビルドしてみましょう。

```
$ make hello_cmake
Scanning dependencies of target hello_cmake
Hello CMake!!
Built target hello_cmake
```

`echo Hello CMake`が実行されて`Hello CMake`が標準出力に表示されました。

複数のコマンドを実行したい場合は

```
add_custom_target(hello_cmake echo first
                  COMMAND echo second
                  COMMAND echo third)
```
のように`COMMAND`の後にコマンドを書いていきます。

```
add_custom_target(hello_cmake
                  COMMAND echo first
                  COMMAND echo second
                  COMMAND echo third)
```
のように最初のコマンドにも`COMMAND`をつけても大丈夫です。こっちのほうがわかりやすいかも。

# Step3

このターゲットに「依存関係」をつけていきます。
「依存関係」って、make系のコマンドにとってはかなり肝となる概念なんですが、、、ちと説明しずらい。

というわけで、いきなり例題にいきます。
* 3つのTarget "child" "mother" "fater"を作成
* "child"は、"mather"と"father"に依存
という例をやってみます。

まず、依存関係の無いCMakeLists.txtを最初に作りましょう

```
add_custom_target(child echo I am a child)
add_custom_target(father echo I am a father)
add_custom_target(mather echo I am a mother)
```

cmake後、`make help`して、ターゲットが増えていることを確認してください。

その後、`make child`、`make father`、`make mother`も実行してみてください。

```
$ make child
Scanning dependencies of target child
I am a child
Built target child
```

`make child`したら、`echo I am a child`が実行されてます。

ここで、「childをビルドするときには事前にfatherとmotherもビルドしたい」という要望があるとします。これを解決するのが依存関係です。「childを、fatherとmotherに依存」させれば、childのビルド時には、事前にfatherとmotherがビルドされるようになります。

実際にCMakeLists.txtを改造して「依存関係」をつけてみましょう。下記のようにすることで、childが、fatherとmotherに依存するようになります。

```
add_custom_target(father echo I am a father)
add_custom_target(mother echo I am a mother)
add_custom_target(child echo I am a child
                  DEPENDS father mother)    # fatherとmotherに依存
```

`make child`してみましょう。どうなるかというと、、

```
$ make child
I am a father
Built target father
I am a mother
Built target mother
I am a child
Built target child
```

`I am a child`の前に、`I am a father`と`I am a mother`が表示されていますね。
ターゲットchildがfatherとmotherに依存するように設定したため、childターゲットのビルドの前に、fatherとmotherのビルドが行われているのです。
なお、`make father`、`make mother`した場合はそれぞれfather、motherだけがビルドされます。father、motherは何にも依存していないからです。
X11 Forwarding を利用してリモートホストからローカルのXに表示させる

## 概要

大抵開発は vagrant上で出来るけど、ちょいと GUI 立ち上げたり 127.0.0.1:4321 をブラウザで確認したい時もあるので、X11 Forwarding でやってみる。

- ローカル上のターミナル：Cygwin64
- ローカル上のXサーバー：Xming
- リモート先：CentOS6.4 on Vagrant

### ローカル上のXサーバー：Xming
Cygwin/X でもいいんだけど、Xming で。

[Xming X Server for Windows 日本語情報トップページ \- OSDN](https://ja.osdn.net/projects/sfnet_xming/)から
Xming-6-9-0-31-setup.exe と Xming-fonts-7-7-0-1-setup.exe をダウンロードしてインストール。

デフォルトだと文字が小さいので、ショートカットのリンク先に " -dpi 100"を加えてサーバーを起動する。

### ローカルターミナル
PuTTY で X11 Forwarding をチェックして ssh でつないでもいいんだけど、
ここはローカルターミナルの cygwin から ssh でつなげる。

#### 環境変数 DISPLAY をセット
ローカルでDISPLAYをセットしておかないとうまくいかない模様。

```sh
$ vi ~/.bash_profile
...
export DISPLAY=localhost:0.0
$ source ~/.bash_profile
```

#### Vagrantfileに forward x11 のフラグを追加


```sh
$ mkdir -p vagrant/centos64
$ vi Vagrantfile
Vagrant.configure("2") do |config|
  ...
  config.ssh.forward_x11 = true
end
$ vagrant up
```

ssh vagrant@192.168.33.10 でもいけるように ~/.ssh/config にセット。

```sh
$ vagrant ssh-config --host 192.168.33.10 > ~/.ssh/config
```

### リモート側 centos (vagrant)

Xクライアントやブラウザ(firefox)を入れる

```sh
$ sudo yum -y groupinstall "X Window System" "Japanese Support" firefox
```

出力先優先度の変更：X11 から試すように：

```sh
$ sudo sed -i.bak -e "s/id:[0-6]:initdefault:/id:5:initdefault:/" /etc/inittab
$ logout
...
```
入り直して xeyes が ローカルのX の画面にでるか確認：

```sh
$ xeyes
```

## 参考サイト
- [Vagrant の VM で GUI \(X11\) のアプリケーションを使う \| CUBE SUGAR STORAGE](http://momijiame.tumblr.com/post/71207485722/vagrant-%E3%81%AE-vm-%E3%81%A7-gui-x11-%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BD%BF%E3%81%86)
PythonでElixirのパイプっぽいことしたかった

# パイプ処理の例
最近(自分の中で)話題のElixir．
Haskellほど型ガッチガチしてなくて，今風な関数型言語です．
Elixirの魅力はたくさんあるのですが，その中でも関数のパイプ処理が自分の中では
結構気に入っています．

こんなやつ

```
[1, [2], 3, [4, 5] |> List.flatten |> Enum.map(&(&1 * 2))
```

`|>`って演算子を使うことで，返値を右側の関数に渡すことが出来ます．

Pythonを使っていて，複数の関数を上記の様に出来たら，いいなぁって思いました．

# 出来たもの

こんな感じにしました．

```
def hoge(a, b, c, d) :
  return a+b+c+d

pipe([1,2], 
  [
    pmap(lambda x: x*2),
    list,
    to(hoge, [3, 4]),
    print
  ]
)
```
pipe/2,to/2,pmap/1っていうのが，つくったものです．
それぞれの役割は，
## pipe
第一引数に，パイプ処理を行う初期値，第二引数に関数のリスト
実装は，

```
from functools import reduce
def pipe(elm, fn_list) :
    return reduce(lambda x, f: f(x), fn_list, elm)
```

## to
自作関数をpipe関数に適した形に変換する高階関数．
実装は

```
def to(fn, outer_args=None) :
    def _to(inner_args) :
        args = outer_args+inner_args if not outer_args == None else inner_args
        return fn(*args)
    return _to

```

## pmap
既存のmap関数をpipe関数用にラップしたもの
このほかにも，reduceとfilterもつくってありますが，とりあえず

実装は

```
def pmap(fn) :
    def _pmap(li) :
        return map(fn, li)
    return _pmap
```

# 感想
結構簡単なことをするだけで，自分のやりたいことが出来たので満足です．
ただ，書き方が標準的な書き方から大きく乖離しているので，自分用のコードでしか使えないなと思いました．
WPFのTreeViewの要素を数える

WPFのTreeViewの要素を数え上げるのをぱっと見調べても見つからなかったので書く
まあ正確にはTreeViewにバインドしたやつの数をしっかり数え上げたんだけども
結構悩んだけど再帰に気づけばあっさり片付いた。  
   
# 数える対象のクラス
まずはバインドしている数え上げの対象クラスの概要。
中に自分のリストを持つのが特徴。
自分の下がなければItemsはnullにしている。
  
```cs
public class TItem
{
~略
public List<TItem> Items { get; set; }
}

```

# 実際の関数部分  
refを使っているから隠す感じで2つの関数に分けた。
Itemsがnullになるまで再帰で潜るだけ。

```cs
public int TreeCount()
{
    int count = 0;
    this._TreeCount(this, ref count);
    return count;
}

private void _TreeCount(TItem item , ref int count)
{
    if (item.Items != null)
    {
        foreach (var i in item.Items)
            this._TreeCount(i, ref count);
    }
    count++;
}
```

再帰だと簡単だった。

# 実際に数える際には
実際にはTreeViewにバインドするのはTIemのコレクションなので
それをまとめて数え上げる。

上の関数2つをTItem内に入れてある場合は↓な感じでやって求める。

```csharp
//実際にはバインドしている値なのでこの辺はイメージ
var TItems = new ObservableCollection<TItem>();
//欲しい値
var count = TItems.Sum(v => v.TreeCount());
```
GitHubの公開キー使ってSSHログインできるようにしてみた.


GitHubには公開キーを複数登録しているので、
それをそのままSSHのログインに利用してみた.

`ssh-copy-id`はリモートホストにコピーしてくれるけど、
`ssh-copy-id-github`はリモート(GitHub)からローカルの`~/.ssh/authorized_keys`に追記します.

使い方はこんな感じ.

```
curl -o ssh-copy-id-github https://git.io/ssh-copy-id-github
chmod +x ssh-copy-id-github
ssh-copy-id-github octcat
```

`ssh-copy-id-github ${GITHUB_USER}`を実行するだけ.

ソースはGistに上がってます.

- https://gist.github.com/satoruk/1866c502b4dff531bd559c3a0ea049df

cronとか使って定期的に同期しておけばPC買い換えてもGithubに公開キーを登録するだけ.
yumでインストールしたパッケージの履歴を確認する


yumでインストールしたパッケージの履歴を確認するには、`yum history`を実行する。

確認環境はCentOS 7.1で、yumのバージョンは3.4.3。

```bash
$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)
```

```bash
$ yum --version
3.4.3
...
```

# インストール履歴の確認 yum history package-list

パッケージのインストール履歴は、`yum history package-list`で確認する。

```bash
$ sudo yum history package-list the_silver_searcher
読み込んだプラグイン:fastestmirror
ID     | 操作           | Package
-------------------------------------------------------------------------------
    41 | 更新           | the_silver_searcher-0.30.0-1.el7.x86_64
    41 | 更新           |                     0.33.0-1.el7.x86_64
    36 | インストール   | the_silver_searcher-0.30.0-1.el7.x86_64
history package-list
```

the_silver_searcherを確認すると、トランザクションIDが36のときにインストールし、IDが41のときに0.30から0.33に更新したことがわかる。

# インストール・更新した時の状況を確認 yum history info

`yum history package-list`で示されるトランザクションIDを用いて、そのときの状況を`yum history info`で確認する。

```bash
$ sudo yum history info 36
読み込んだプラグイン:fastestmirror
トランザクション ID : 36
開始時間            : Wed May 25 12:12:41 2016
開始 rpmdb          : 471:210f7df23165510b5a2c8ffc5915c47bb1ee5227
終了時間            :                           (0 秒)
終了 rpmdb          : 472:51b1a1a8bdfddc094ea7f7d64acdbd22485dd365
ユーザー            :  <te2u>
終了コード          : 成功
コマンドライン      : install the_silver_searcher
トランザクションの実行:
    インストール rpm-4.11.1-25.el7.x86_64                      @base
    インストール yum-3.4.3-125.el7.centos.noarch               @base
    インストール yum-plugin-fastestmirror-1.1.31-29.el7.noarch @base
切り替えたパッケージ:
    インストール the_silver_searcher-0.30.0-1.el7.x86_64 @epel
history info
```

the_silver_searcherをインストールしたのは2016/5/25で、時間は殆どかからずパッケージ単体でインストールしている。


```bash
$ sudo yum history info 41
読み込んだプラグイン:fastestmirror
トランザクション ID : 41
開始時間            : Thu Mar  2 16:22:49 2017
開始 rpmdb          : 476:9e2d7ca9abc998fed85b9f83b43d6526fb5f9ea9
終了時間            :                          (0 秒)
終了 rpmdb          : 476:1fd2e8c182bdafc223771c3c7a086b8cd091492e
ユーザー            :  <te2u>
終了コード          : 成功
コマンドライン      : install the_silver_searcher
トランザクションの実行:
    インストール rpm-4.11.1-25.el7.x86_64                      @base
    インストール yum-3.4.3-125.el7.centos.noarch               @base
    インストール yum-plugin-fastestmirror-1.1.31-29.el7.noarch @base
切り替えたパッケージ:
    更新 the_silver_searcher-0.30.0-1.el7.x86_64 @epel
    更新                     0.33.0-1.el7.x86_64 @epel
history info
```

the_silver_searcherを更新したのは2017/3/2で、時間は殆どかからずパッケージ単体を更新している。

# 参考
- [8.4. トランザクション履歴の活用](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-Yum-Transaction_History.html)

# 関連
- [yumでインストールしたパッケージを取り消す - Qiita](http://qiita.com/te2u/items/4be81cd75617285dfd8b)
DynamoDB 条件付き書き込み


DynamoDBでは新規アイテム[^1]の作成はputItemで行います。DynamoDBの各アイテムは必ずユニークになるプライマリキー[^2]（以下単にキーと表記）を持っている必要があり、アイテム作成時も必ずキーの指定が必要です。アイテム作成時に既存のアイテムとキーが衝突したときに、RDBの感覚だと一意性制約でエラーになるのを期待しますが、DynamoDBではなんと！上書きしてしまいます。RDBに親しんだ脳みそだと、それじゃ困るでしょ、ありえないでしょ、と考えますよね。もちろん上書き禁止の方法は用意されていて、ConditionExpressionというオプションを使うことで実現できます。キー重複以外にも様々な条件が指定できます。

ConditionExpressionについての公式ドキュメント
http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html

ConditionExpressionは、処理対象のアイテムに条件を適用します。書き込み処理の場合は、条件を満たしていれば処理が実行され、満たしていなければ処理を実行せずエラーを返します。読み込み系のオペレーションで使用した場合はフィルターとして機能します。今回のサンプルコードは全てputItemですが他のオペレーションでも使えます。

---

上書き禁止のputItemをPHPで書くと以下のようになります。attribute_not_exists関数を使います。キーが重複した時にfatal errorになるので、処理を続けたい場合はtry〜catchでエラーハンドリングします。$dynamodbは生成済みのDynamoDbClientインスタンスです。

```PHP:上書き禁止
try {
    $dynamodb->putItem([
	    'TableName' => 'SampleTable',
	    'Item'	=> [
            'Id'   => ['N' => '1'],//パーティションキー
            'Attr' => ['S' => 'ABC'],
	    ],
	    'ConditionExpression' => 'attribute_not_exists(Id)',
    ]);
} catch (Exception $e) {
    echo $e->getMessage();
}
```

公式ドキュメントを読んでちょっと戸惑ったのが、attribute_not_existsの説明が２つあって内容が違うように見えてしまうこと。なんか分かりづらいと思うんですがそんなことないですか。キーの重複をチェックしているのはattribute_not_exists関数ではなく、putItemオペレーションだと理解しましたがよいでしょうか。

---

上記の理由で、プライマリキーがパーティションキーとソートキーで構成されるテーブルでも、パーティションキーの指定だけで上書き禁止になります。下記の例だとattribute_not_existsで指定しているのはIdのみですが、キーの組み合わせが1-bのアイテムが存在しても、書き込みは成功します。書き込みが失敗するのは1-aのアイテムが存在する時だけです。

```PHP:ソートキーを持つテーブルでもパーティションキーの指定だけでOK。
$dynamodb->putItem([
    'TableName' => 'SampleTable',
    'Item'  => [
        'Id'      => ['N' => '1'],//パーティションキー
        'SortKey' => ['S' => 'a'],//ソートキー
        'Attr'    => ['S' => 'ABC'],
    ],
    'ConditionExpression' => 'attribute_not_exists(Id)',
]);
```

---

属性の有無ではなく属性の値を条件にする場合は、プレースホルダーを使って下記のように書きます。下記の例だとIdが1のアイテムが存在し、そのアイテムのAttrがXYZの時だけ失敗します。それ以外の場合、アイテムが存在すればAttrをABCに更新し、アイテムが存在しなければ新規アイテムを作成します。

```PHP:属性の値を条件に指定
$dynamodb->putItem([
    'TableName'	=> 'SampleTable',
    'Item'		=> [
        'Id'   => ['N' => '1'],//パーティションキー
        'Attr' => ['S' => 'ABC'],
    ],
    'ConditionExpression' => 'Attr <> :val',
    'ExpressionAttributeValues' => [':val' => ['S' => 'XYZ']],
]);
```

---

複数の条件を指定する場合はAND、ORでつなげます。NOTも使えます。

```
'ConditionExpression' => 'attribute_not_exists(Id) AND attribute_not_exists(SortKey)'
```

---

### batchWriteItemでConditionExpressionは使えない

batchWriteItemでもConditionExpressionが使えるかなと思って、下記のようなコードを試したのですが、ダメでした。batchWriteItemではConditionExpressionを指定しても無視されるようです。

```PHP:ダメコード
$dynamodb->batchWriteItem([
    'RequestItems' => [
        'SampleTable' => [
            [
                'PutRequest' => [
                    'Item' => [
                        'Id'   => ['N' => '1'],
                        'Attr' => ['S' => 'ABC'],
                    ],
                    'ConditionExpression' => 'attribute_not_exists(Id)'
                ],
            ],
        ]
    ]
]);

```

[^1]: アイテム: RDBのレコードをDynamoDBではアイテムと言う。公式ドキュメントでは項目と表記している。

[^2]: プライマリキー: DynamoDBではパーティションキー、またはパーティションキーとソートキーの組み合わせ。パーティションキーはハッシュキー、ソートキーはレンジキーとも呼ばれているよう。
R の data.frame, data.tableで1万倍高速に値を書き込む方法

Rでデータフレーム同士の相互インデックスを張ろうと思い、複数のレコードに値を入れる方法を探っています。1000万件程度のデータフレームにインデックスを指定して一括セットしようとすると、なかなか思うようなパフォーマンスが出ません。
data.frameやdata.tableで試しましたが、具体的には、1000万レコードのデータフレームに1件100レコードごとの要素代入を数万回程度行う処理です。

いろいろなやり方が考えられますが、やはりdata.tableが一番早いようです。また記法による違いに気づかず、最速の方法を見逃していました。

ベンチマークをしてみたので参考までに掲載しておきます。




# データ構造
## data.frame(df)
普通にデータフレームに代入します。

```R
df <- data.frame(idx = 1:n1, oidx = numeric(n1))
for (i in 1:n2) {
    df[floor(runif(n3, 1, n1)),]$oidx <- i
}
```
## data.table(dt)
データテーブルにデータフレームと同様の代入方法を行います。

```R
dt <- data.table(idx = 1:n1, oidx = numeric(n1))
for (i in 1:n2) {
    dt[floor(runif(n3, 1, n1)),]$oidx <- i
}
```

## data.table with setkey (dtk)
データテーブルでキーを設定します。

```R
dt <- data.table(idx = 1:n1, oidx = numeric(n1))
setkey(dt,idx)
for (i in 1:n2) {
    dt[floor(runif(n3, 1, n1)),]$oidx <- i
}
```
## data.table with ":=" (dt2)
data.tableでは := という演算子で代入を行うことができます。最初は記法の違いだけだと思っていましたが、大違いでした。

```R
dt <- data.table(idx = 1:n1, oidx = numeric(n1))
for (i in 1:n2) {
    dt[floor(runif(n3, 1, n1)), oidx := i]
}
```

## data.table with ":=" and setkey (dtk2)
さらにsetkeyも組み合わせます。

```R
dt <- data.table(idx = 1:n1, oidx = numeric(n1))
setkey(dt, idx)
for (i in 1:n2) {
    dt[floor(runif(n3, 1, n1)), oidx := i]
}
```

## list (list)
一度listとして抽出して代入する。

```R
dt <- data.table(idx = 1:n1, oidx = numeric(n1))
l <- dt$oidx
for (i in 1:n2) {
    l[floor(runif(n3, 1, n1))] <- i
}
dt$oidx <- l
```

## vector (vector)
一度vectorとして抽出して代入する。

```R
dt <- data.table(idx = 1:n1, oidx = numeric(n1))
v <- unlist(dt$oidx)
for (i in 1:n2) {
    v[floor(runif(n3, 1, n1))] <- i
}
dt$oidx <- v
```
# ベンチマーク1

代入先データ数(n1) 100万-1000万（変化させる）
代入回数(n2) 100
代入データ数(n3) 100

以下のように、data.frameの記法を使うと異様に遅くなることに気づきました。data.tableでも同じでした。おおよそ１００倍以上のスピードの差があります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/59dc8cda-4ebe-832f-00cd-776371ad9036.png)

":="記法によるものが最も効果が高いように見えます。この数ですと、list,vectorにして外部で処理してもほとんど変化ないようなので、転送の手間を考えると":="を使うのが最もよさそうです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/5abcdcb4-611a-6aca-6236-55cf48e20a93.png)

# ベンチマーク2

代入先データ数(n1) 100万-1000万（変化させる）
代入回数(n2) 10000
代入データ数(n3) 100

代入回数をもう少し増やしました。1万回というのが現在行っているスペックに近いのでやってみます。何と先ほどとは大きく異なり、listやvectorで扱うほうがやはり速いとなりました。また100倍近い差が付きました。最初から考えると1万倍ですか。。。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/ac104c85-49c2-cceb-8697-c667c0c81d70.png)

# ベンチマーク3

代入先データ数(n1) 100万-1000万（変化させる）
代入回数(n2) 100000
代入データ数(n3) 1000

unlist する意味は本当にないのでしょうか？n2,n3をそれぞれ10倍しましたが、両者の違いは見られませんでした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/4080f219-f649-d670-f751-312121142993.png)

#まとめ

相互インデックスを効率よくセットするにはdata.tableのカラムをlistとして扱い代入すると一番速い。ということでしょうか？
まさか１万倍以上の差が出るとは思いませんでした。。。
kmeans を使った画像のセグメンテーション

## 背景
スカイツリーの写真を使って画像のセグメンテーションを行い，建物部分だけを抜き出します．

使用環境: MATLAB R2016b 
使用したツールボックス: Image Processing Toolbox, Statistics and Machine Learning Toolbox 

## 画像の表示
<a href="https://jp.mathworks.com/help/matlab/ref/imread.html">imread</a> で画像を読み込みます．サイズが大きいので，<a href="https://jp.mathworks.com/help/images/ref/imresize.html">imresize</a> で0.2倍にしています．

```
img = 'skytree.jpg';
J = imread(img);
I = imresize(J, 0.2);

figure
imshow(I)
```

![tree1.png](https://qiita-image-store.s3.amazonaws.com/0/168437/3b88c3d1-dd72-ca74-e7c2-d6913dca3ace.png)


## スーパーピクセルを用いた画像の分割
画像を，画素単位ではなく輝度や色が似ている領域単位に処理するスーパーピクセルに変換します．L*a*b* 色空間に変換した場合は，<a href="https://jp.mathworks.com/help/images/ref/superpixels.html">superpixels</a> 関数のプロパティ **IsInputLab** を **true** に設定します．ここではスーパーピクセルの数を **1000** に設定しています。

```
Ilab = rgb2lab(I);     
[Ls, N] = superpixels(Ilab, 1000, 'IsInputLab', true); 
Bmask = boundarymask(Ls);  % セグメンテーションの領域境界を検出       
I1 = imoverlay(I, Bmask,'c');   % スーパーピクセルを画像に重ね書き   

figure;
imshow(I1);
```

![tree2.png](https://qiita-image-store.s3.amazonaws.com/0/168437/076b404d-ff69-f80e-af16-2130a2ee4274.png)


## スーパーピクセルごとの平均値を算出
N 個のそれぞれのスーパーピクセルに対して，L*, a*, b* の平均値を計算し，<a href="https://jp.mathworks.com/help/images/ref/imshowpair.html">imshowpair</a> で，元画像とスーパーピクセルごとに平均を取った画像を表示します．

```
pixIdxList = label2idx(Ls);    % 各ラベル領域の行列インデックスを取得
sz = numel(Ls);                % 画素数
superLab = zeros(N,3);
for  i = 1:N    
  superLab(i,1) = mean(Ilab(pixIdxList{i}      ));  % L* mean
  superLab(i,2) = mean(Ilab(pixIdxList{i}+   sz));  % a* mean
  superLab(i,3) = mean(Ilab(pixIdxList{i}+ 2*sz));  % b* mean
end
I2 = label2rgb(Ls, lab2rgb(superLab));

figure; 
imshowpair(I, imoverlay(I2, boundarymask(Ls),'w'), 'montage'); 
```

![tree3.png](https://qiita-image-store.s3.amazonaws.com/0/168437/2830dfc7-d245-e133-18f0-7b9bf5a65938.png)

## K-meansで色の類似度を用いたクラスタリング
今回はクラス数を2に設定します．クラスタリングは <a href="https://jp.mathworks.com/help/stats/kmeans.html">kmeans</a> を使用します．

```
numColors = 2;       
[idx, cLab] = kmeans(superLab, numColors);
Lc = zeros(size(Ls));
for i = 1:N                        
    Lc(pixIdxList{i}) = idx(i);    
end

I3  = label2rgb(Lc, lab2rgb(cLab)); 
I3b = imoverlay(I3, boundarymask(Lc), 'm');      

figure;
imshow(I3b); 
```

## 建物の部分のみを抽出
ほら建物だけ取れた．
宮殿みたいになってしまいました．

```
maskA = (Lc == 1);
maskA_filled = imfill(maskA, 'holes');       % マスクの穴を埋める
Iout = imoverlay(I, maskA_filled, 'w');

figure; 
imshowpair(I, Iout);                  
```

![tree4.png](https://qiita-image-store.s3.amazonaws.com/0/168437/2beeae0b-7e94-b5f2-8350-c67c430e530b.png)

[Code on GitHub](https://github.com/mizukirc/matlab-snippets/blob/master/image_segmentation/segmentation_ex.m)