OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu / ls > 端末 > ls --color=auto時にテキストが点滅する現象 > 対処: マウスの真ん中のWheelを上に回す

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
git version 1.9.1
```

以下の条件でテキストがおかしな点滅をする。

- フォルダのsymbolic linkがあるフォルダにいる
- 「端末」をターミナルエミュレータとして使用
- ls (ls --color=auto)を実行

ターミナルエミュレータを「XTerm」にすると発生しなかった。
とりあえずの対処としてXTermを使うことになりそうだ。

以下が似たような症状である。
https://github.com/mobile-shell/mosh/issues/500
> I just started to try mosh, and I found something weird, running ls --color=auto results in a weird colored blinking text. Any other tools (like vim and tmux for ie), seems to work fine. I have been searching, but I can't seem to find any reference to this issue. Any clue what could be causing it?

### 対応方法

(追記 2017/01/11)

マウスの真ん中のWheelを上に回す
USB HDDの電源制御 (Linux)


## USB HDDの電源OFF

udiskctlで電源切れる！
```
udisksctl power-off -b /dev/sdx
```

* [Power on/off USB ports](http://askubuntu.com/questions/342061/power-on-off-usb-ports)

## USB HDDの再電源ON

いろいろ試すが，そもそも /sys/bus/usb/drivers/usb/bind が書き込みできない？？

* [USB抜き差しせずコマンドで再認識](http://qiita.com/tukiyo3/items/e0f6ebe6b9713a7da537)
* [How to re-mount a USB stick after unmounting from Nautilus without disconnecting it?](http://unix.stackexchange.com/questions/7051/how-to-re-mount-a-usb-stick-after-unmounting-from-nautilus-without-disconnecting)
* [PowerTOPを使ってLinuxマシンを省電力化する](https://www.xmisao.com/2014/01/21/how-to-use-powertop.html)
* [電源連動 USB HDD の切断・再接続を CLI で](http://d.hatena.ne.jp/dayflower/20100723/1279874038#20100723f2)
windowsでXを使う (xming)


windows側からどうしてもリモート側のGUIアプリを動かしたいとき

## xming のinstall

- (参考) [WindowsでUNIXマシンのGUIアプリが使用できるXming]( http://win.just4fun.biz/%E9%96%8B%E7%99%BA%E3%83%84%E3%83%BC%E3%83%AB/%E7%84%A1%E6%96%99%E3%81%AEX%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%83%BBXming.html)

 ## teratermを設定

* teretermの 設定->SSH転送の「リモートアプリケーションをローカルサーバに表示する」にチェックする．

- (参考) [WindowsでUNIXマシンのGUIアプリをXmingとTera Termで使用する](http://win.just4fun.biz/%E9%96%8B%E7%99%BA%E3%83%84%E3%83%BC%E3%83%AB/Xming%E3%82%92TeraTerm%E3%81%A7%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B.html)
vagrant上のmysqlにSSH経由でIntelliJ IDEAから接続する

### vagrant / mysql の前提

1. `vagrant` ユーザで vagrant 環境に SSH 接続できること
2. `vagrant` ユーザで localhost の mysql に接続できること


### IntelliJ IDEA 側の設定 (おそらく PHPStorm/WebStorm でも同様と思う)

1. `Database` の「＋」(`New`) → `Data Source` → `Mysql` をクリック。
2. `SSH/SSL` タブで下記の設定:

    ![image](https://qiita-image-store.s3.amazonaws.com/0/29899/47c7d9da-a761-dc40-f002-7a217a0ed321.png)
    　
    
3. `General` タブで下記の設定:

    ![image](https://qiita-image-store.s3.amazonaws.com/0/29899/6ac34ff2-ab59-c263-7c7d-94314a3837d6.png)
    　

4. `Test Connection` で接続できることを確認

以上
CapistranoでGit LFSを使いたかった

[コミケのサークルスペースを検索するWebアプリ](https://circlesearch.paltee.net)を制作していて、仕上げにCapistranoでデプロイ！と思ったら、タイトルのとおり壁にぶち当たりました。

画像リソースをGit LFSに投げていて、リモートにインストールされていなかったことが原因です。

## 問題点
  * `$ bundle exec cap production deploy` する
  * ベアリポジトリがクローンされる
  * (リモートにGit LFSがインストールされていないので)フックが走らない
  * Git LFSに投げていた画像もろもろが表示できない

## 試みたこと
ローカルでアセットをプリコンパイルして投げようとしたら、rsyncが`Too many levels of symbolic links` を吐いて無事死亡しました(なんで)

Git LFSを入れずに素のままでやってみたかったのですが、「capistrano git lfs」でgoogle先生に聞いてもまず検索結果が2000件くらいでそれっぽい資料も見つからずじまい。「未指定: ~~capistrano~~」ばかりの検索結果に諦めようとしていました。

## 解決策
[capistrano-withrsync](https://github.com/linyows/capistrano-withrsync)を使いましょう。

`capistrano-withrsync`をGemfileに追加して`Capfile`でrequireしたところ、しっかりファイルを持ってきてくれました。

このGemはもともとCapistrano上でrsyncを用いてgitリポジトリを送り込むものですが、ローカルでのクローン時点でフェッチしたGit LFSのオブジェクトを流れでリモートにコピーしてくれます。

リソースが多くある場合はこうやって配信する形の方が良いのかな…？

![image](https://qiita-image-store.s3.amazonaws.com/0/55804/4d26972a-4bbf-85b0-7278-517fbe02288d.png)

Git LFSをインストールしているマシンでデプロイするコマンドを叩けば、いつも通り簡単にデプロイしてくれそうです。

## せんでん
[Circlesearch](https://circlesearch.paltee.net)では、各種同人イベントの参加サークルをTwitterから一覧にしています。参戦予定のイベントがあればぜひ使ってみてください。
mysql5.7 でユーザ追加の方法が変わったのでメモ

### 概要

mysql 5.7 になって `GRANT` でユーザ追加できなくなりましたね。
いつも忘れてしまうので方法メモ。

### 手順

#### create user

`create user` が必須に。パスワードの設定もここで行う。パスワードに使用するロジックも同時に指定する。

```mysql
CREATE USER 'anyusername'@'localhost' IDENTIFIED WITH mysql_native_password BY 'anypassword';
```

#### 権限設定

```mysql
GRANT ALL PRIVILEGES ON anydatabase.* TO 'anyusername'@'localhost';
FLUSH PRIVILEGES;
```

匿名ユーザ（`user`が空欄のユーザ）がいる場合、`%` よりも優先される。これにより安易に `%` で設定するのを防いでいると思われる。開発用で不要なら匿名ユーザを消してしまえばよい。


#### 確認

```mysql
SELECT user,host,plugin FROM mysql.user;
```
VirtualBoxで共有フォルダーを好きな場所に設定する方法（VBoxManage）

VirtualBoxの共有フォルダーは便利ですが、GUIから普通に設定すると

```
/media/sf_shared/
```

とゲストでの設定パスが固定されてしまいます。とあるプロジェクトで、どうしても別の場所に設定する必要があったので、その方法を探してみました。基本は、[VirtualBoxマニュアル](http://www.virtualbox.org/manual/ch04.html#sharedfolders)に書いてある内容になります。

VBoxManage
----

VirtualBoxをインストールすると、ホストPCに「`VBoxManage`」というツールもインストールされます。これを使って、共有フォルダーの場所を設定することができます。

ゲスト名が「`YourVmName`」とします。

### 共有するパスを指定する。

VBoxManageで共有フォルダーをマウントするパスを指定します。

```
VBoxManage guestproperty set YourVmName "/VirtualBox/GuestAdd/SharedFolders/MountDir" "/path/to"
```

```
/path/to/sf_shared/
```

### 共有フォルダー名の「`sf_`」を変更する

今度は、共有フォルダーの最初にくっついてくる「`sf_`」を変更します。

```
VBoxManage guestproperty set YourVmName "/VirtualBox/GuestAdd/SharedFolders/MountPrefix" ""
```

これで、次の場所に共有フォルダーが設定されました。

```
/path/to/shared/
```

めでたし、めでたし。

> Vagrant使えば簡単なんですが、うまく動かなかったのでVirtualBoxのツールを利用しました。
BoostnoteがCommonMarkエディタとして見やすい

# BoostnoteがCommonMarkエディタとして見やすい

### Boostnoteとは
* [Boostnote](https://b00st.io/)
* 日本の福岡の[MAISIN&CO.株式会社](http://maisin.co/)が開発したMarkdown＆Snippetエディタ
* ページではMarkdownって書かれてるけど実装仕様はCommonMarkらしいのでCommonMarkエディタだよ
  * 基本的にほぼ英語で構成されてたり、ページの作りが海外企業っぽく見える
* Atomと同じElectronで開発されているとかなんとか
* たまにバグも出るけど海外でも使われているだけあって結構早く対応してくれる
  * この記事に書いてたバグと、書いてなかったバグも2016/12/21 (ver.0.7.5) 時点で直ってました、ありがとうございます
  * 次見つけたら頑張ってプルリク飛ばしたいね

***

### 使い方は？
* ググれば出てくる、もっと慣れてきたら別の投稿でまとめたい
* CommonMarkで文章書いたり、ソースコードのSnippetが書いておけるよ
* Snippetは名前に拡張子付けるか自分で選んで言語毎のシンタックスハイライトをさせられるよ
  * 入力補完はないけど、スクリプト言語とかそのままコーディング出来そう
* Finderで探したSnippetの内容をそのままコピー出来るよ
* CommonMarkにもSnippetにもタグを付けてタグで検索することも出来るよ
  * ~~2016/11/20（ver.0.7.2）時点では **『タグを付けると他のノートの文章で上書きされることがある』** バグがある~~
  * ~~環境下の問題か全面的な不具合なのか良く分からないけど気をつけてね~~

***

### タイトルの『見やすい』って？
* CommonMarkで文章入力中はエディタ、エディタからフォーカス外すとプレビューになるよ
  * 他のエディタだとエディタとプレビューが横並びで幅をとりがち
* テーマがいっぱいあって、テーマを変えるとシンタックスハイライトの色も変わるよ
* フォントを自分で設定しなくても最初から見やすくて綺麗だよ
  * フォントは自分で設定も出来るので、特定フォントじゃないと嫌な人も安心

***

### もっとこうなるといいなってこと
* ~~**とりあえず上で書いたバグが早く直ると嬉しい**~~
  * この文章を一回ぶっ飛ばされてちょっと泣きそうになったよ
* MarkdownじゃなくてCommonMarkエディタを名乗って欲しい
* CommonMarkの入力補完をしてくれると嬉しい
* CommonMarkからHTMLをファイルに出力出来るようになると嬉しい
* 逆にHTMLからCommonMark記法に変換する機能が欲しい
  * Pandocで出来るみたいだけど、GUIはGUIで便利になって欲しいので
* BoostnoteがreST記法に対応してくれたらreST記法勉強します

***

### あとがき
* もうWordとか書きたくないし読みたくないので早く軽量マークアップ言語が流行って欲しい
  * Excel文書はまだ利点が分からなくもないけど、不都合がいっぱいあるので同様
  * ファイル開かないと検索が出来ないとか色々
* MarkdownエディタとしてはAtomやVSCodeも使いやすい、見やすいので合うのを探そう
  * 使いたかった環境でどっちもパッケージが取得できなかったので、今回は見送った

### おまけ
福岡は本当にIT系が強い、雰囲気が海外系っぽいのも共通点
日本でIT系やりたいんなら、福岡行くと良い環境で仕事出来るかもしれない
英語出来るならどこでも日本より良い環境で仕事出来ると思うけどね
node.jsのExpressを使ってローカルサーバを構築する。

##はじめに
node.jsのExpressを使った方法でローカルサーバを構築し、gulpから実行してみた。
その備忘録として書いておきます。

GitHubにアップしています。
⇒[ExpressServer](https://github.com/akakuro43/ExpressServer)

##前提
node.jsがインストール済みであり、npmの使い方もある程度わかっているものとします。

##Expressのインストール
適当なフォルダを作成しターミナルで移動後、package.jsonを生成します。

```cmd:ターミナル
$ npm ini
```

続いて、Expressのインストールしましょう。
ターミナルから以下のコマンドを実行します。

```cmd:ターミナル
$ npm install express --save-dev
```

##サーバ構築
今回は、以下のようなディレクトリでサーバを作成します。

```cmd:ディレクトリ
Root
  server.js
  dest
    index.html
  gulpfile.js
  package.json
```

##server.jsの内容
Expressの設定と、ポートの設定くらいの簡素な内容となっています。

```js:server.js
let express = require('express');

let app = express();
app.use(express.static('dest'));

let port = 3000;
app.listen(port, ()=> {
  console.log('Expressサーバー起動');
});
```

##サーバー起動
以下のコマンドでサーバを起動します。

```cmd:ターミナル
$ node server.js
```

正常に起動されればコマンドラインに「Expressサーバー起動」と表示されます。
ブラウザからhttp://localhost:3000 にアクセスするとindex.htmlの内容が表示されます。

##gulpからサーバ起動する
gulp-execを使うと、gulpからシェルスクリプトを実行できるようになります。

```cmd:ターミナル
$ npm install gulp-exec --save-dev
```

gulpfile.jsに以下のようにserver.jsを実行する記述をします。

```cmd:gulpfile.js
gulp.task('exec', function() {
    gulp.src('./') .pipe(exec('node server.js'));
});
```

ターミナルから実行してみましょう。

```cmd:ターミナル
$ gulp exec
```

再び、ブラウザからhttp://localhost:3000 にアクセスするとindex.htmlの内容が表示されるはず、、、です。

以上、簡単ですがnode.jsのexpressを使ったローカルサーバ構築手順でした。
catch you later.
MINCS (Mini Container Shellscripts) 解説

#これは何か
コンテナの仕組みを理解するためのシェルスクリプトとして開発している[MINCS](https://github.com/mhiramat/mincs)の基本機能概要です。

#MINCS概要
MINCSは所謂Linuxコンテナを作るシェルスクリプトです。

##MINCSの特徴
- 名前空間の切り出し、overlayfsによる階層型ルートファイルシステムの準備、/procや/devの準備、chrootによるコンテナ内への移行などが主な機能です。
- Docker likeなイメージの管理機能や、squashfsを用いた自己実行型のコンテナイメージ作成機能などもあります。
- Clear Container的なqemuを用いた仮想マシン混合コンテナも作れます。
- MINCSはPOSIX互換シェルスクリプトなのでbusyboxでも動かせます。
- シェルスクリプトなので非常に小さいです。

##MINCSのインストール
シェルスクリプトなのでビルドやインストールする必要はなく[^1]、ダウンロードしたスクリプトを実行するだけです。

```
 $ git clone https://github.com/mhiramat/mincs.git
 $ cd mincs
 $ ./minc --help
 ./minc - Run given command in a temporary namespace
 ...
```
[^1]: ただしQemuコンテナ機能を使うためには、カーネルなどをビルドする必要があります。

##MINCSの使い方
詳細は[README.md](https://github.com/mhiramat/mincs/blob/master/README.md)を参照してください。
完全な機能を持ったmincの実行にはroot権限が必要な点も注意が必要です。（限定的に非特権ユーザとして実行することも可能です）

```
 $ sudo ./minc 
 /#
```

これで現在使っているルートファイルシステムをベースにしたコンテナ空間でシェルが立ち上がった状態になります。試しに`ps -ef`コマンドを実行してみましょう。シェルがPID1で動いていることがわかります。

```
/# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 13:49 ?        00:00:00 /bin/bash
root        76     1  0 13:49 ?        00:00:00 ps -ef
```
また、mountコマンドを使うと、ルートファイルシステムがoverlayfsに変わっていることがわかります。

```
/# mount 
overlayfs on / type overlay (rw,relatime,seclabel,lowerdir=/,upperdir=/tmp/minc2591-MysBjw/storage,workdir=/tmp/minc2591-MysBjw/work)
```
このため、内部でかなり無茶をしても安全です。

```
/# rm -rf *
...
/# ls
bash: ls: command not found
/# exit
$ ls /
bin   dev  home  lib64       media  opt   root  sbin  sys  usr
boot  etc  lib   lost+found  mnt    proc  run   srv   tmp  var
```

###ルートファイルシステムの指定

mincに`-r <rootdir>`を渡すことで、chrootのように指定したディレクトリをルートファイルシステムとしてコンテナを実行できます。

```
 $ sudo ./minc -r ./debian
root@localhost:/# cat /etc/debian_version 
8.6
```

ルートファイルシステムを作るにはdebootstrapが使えます。なに？CentOSやFedoraのルートファイルシステムが欲しい？docker exportを使いましょう。dockerhubにはなんでもあります:wink:。

```
 $ sudo docker run --name=alpine alpine:latest echo exit
exit
 $ mkdir alpine
 $ sudo docker export alpine | tar -xC alpine/
 $ sudo ./minc -r alpine sh
/ # cat /etc/os-release 
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.4.4
PRETTY_NAME="Alpine Linux v3.4"
HOME_URL="http://alpinelinux.org"
BUG_REPORT_URL="http://bugs.alpinelinux.org"
```

###ローカルディレクトリのバインド

mincの起動時に`-b <hostdir>:<dir>`を渡してローカルディレクトリをコンテナにバインドマウントすることが出来ます。

```
 $ echo hello minc world > hello.txt
 $ sudo ./minc -r alpine -b ./:/opt cat /opt/hello.txt
hello minc world
```

## MINCSで出来ていないこと
- TTYのアタッチやデタッチ（これは何らかのタスクを立ち上げておかないと無理っぽい。多分tmuxと連携すればいいのだけど・・・）
- ネットワーク名前空間の設定([pipework](https://github.com/jpetazzo/pipework)があるので、これが使えるはず)
- Seccomp対応などのセキュリティ機能
- その他諸々（実際色んな機能が適当）


## MINCSの変わった機能
MINCSでは他のコンテナの機能の発表に合わせて、「へー、こういうのがあるんだ。試してみよう」の精神でお試し機能を追加しています。
- ホストのX11のunix socketをバインドして、GUIアプリをコンテナで動かす
- qemu-user-modeを利用して、他のアーキテクチャのバイナリ（ルートファイルシステム）を実行できるようにする
- 非特権ユーザでもコンテナを実行できるようにする
- 内部でqemu-systemを立ち上げて、コンテナを仮想マシンで動かす
- コンテナ内のアプリ動作に必要なファイルだけ残したファイルシステムを作り、squashfsでコンテナイメージをまとめて、自己実行型のコンテナを作る
Ubuntu / git > git addするときにTab補完 > 最近編集したファイルが優先される

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
git version 1.9.1
```

あるフォルダにて以下のファイルがあるとする。

- linreg2_feeddict.py
- linreg2_noShuffle.py


linreg2_noShuffle.pyの方を修正して、git addするとき

- git add linreg2まで入力
- Tabを押す
   - linreg2_noShuffle.pyまで補完される

アルファベットの順番だとlinreg2_feeddictの方が先にでると思われるが、最近編集したものまで判断して上記の補完が行われるのだろうか。

いずれにせよ、この機能は便利だと思う。
[Resolved] Qiita > UI > 編集リクエスト中へのアクセスがわからない > 編集リクエスト一覧へのリンクが追加されました

現在のUIで「編集リクエスト中」へのアクセスが分かりません。

前回のUIでは、記事の中に「編集リクエスト(8)」のように記載があり、それをクリックすると「未処理」の編集リクエスト一覧が表示されました。
その一覧から「編集リクエストの取り消し」もできたかと思います。

編集リクエストの取り消しは、現在のUIではどうすればいいのでしょうか?

編集リクエスト（未処理）を表示しない、という方針の場合はその旨の掲示をお願いいたします。

(2週間以上前に「編集リクエストお願いします」と言われた記事のリクエストが未処理のまま音沙汰もまったくないので、リクエスト取り消しを考えています。）。

<hr>
(追記 2016/11/24)

編集リクエスト一覧へのリンクが追加されていました。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/3030a074-7000-3f5f-5a01-4327ffa72644.png)

ご対応ありがとうございます。
Qiita > 記事内の用語の間違いについて > 主要となる３つの用語だけは正解を確認して記事を書くようお願いします

Qiitaの記事を見てきて気になるのが「用語の記載間違い」。

### 間違いの例

以下は、これまで見た間違いの例

- 本来、ハイフン(-)がない型番にハイフンをつける
  - GTX-1080 (正解: GTX 1080)
- 用語の漢字間違い。同じ記事に２つの表記がある
  - 誤差逆伝搬と誤差逆伝播

ハイフンを意図的につけている場合は、記事内に「xxxの理由で型番にハイフンを意図的につけています」という記載がほしい。
  
漢字間違いについては、「数十年続く研究室で伝統的に使っている漢字」というのであれば、「そちらだけ」使い続けるというのはいいと思う。問題は「同じ記事で２つの表記になっている」こと。
「数十年続く研究室で伝統的に使っている漢字」の場合は、その旨を記載いただくと後続の人が理解した上で用語を使えます。

### 正解の確認コスト

google検索すれば瞬時に正解が見つかる。
(google検索しても見つかりにくい表記を使っている場合を除く）
(インターネットにつながらない環境で書いている場合を除く)

### 間違いの影響

たくさんの「いいね」がついた記事の表記が間違っていると、

- それに引きづられて間違い用語の記事が増殖していく
- 場合によっては「タグの分離」が発生する
- キーワード検索時に、片方の記事しか見つからなくなる


記事を書くすべての人が「正解」を意識しながら書くわけではないから。自分もぱっと書く記事は確かにある。

**<font color=red>一方で、多くの人に読んでもらいたいきちんとした記事を書こうとしている場合は、正解の確認をしつつ記事を書いていただければと願う。</font>**

### どれくらいの確認をするのか

記事のすべての用語について、表記間違い、漢字間違い、などを調べるのは大変ではある。

**<font color=red>記事の中核をなす用語（使用しているボードの型番、主となる方法の用語などを含めて）３つ程度は確認するのがいいと思われる</font>**。


### 記事中に多くの同じ用語がある場合

コピペを推奨する。

melancolic(憂鬱の英語）が記事にたくさんある場合は、melancolicをコピペするのがいいでしょう。

コピペする限りはmelancolicをmelancolic以外の英語として打ち間違いはなくなる。

一旦記事を書いてから、清書の段階でmelancolicの記述間違いがないかコピペ上書きしながら作業するのでもいいと思われる。

> Note: 上の記事はコピペで書きました。

> 全くの余談：外人に「漢字教えて」と言われた時、melancolic(憂鬱）を英語と漢字両方で紹介すると「ウケる」率が高いと思われる。(ドイツ人 18人/20人)

### 細かいことは気にするなと思う場合

- 家のリフォームを工務店にお願いする
- 大金を出して物を組み立ててもらう
- 普段歩く範囲の建物の施工業者

以下の２種類の業者がある場合、どちらに仕事を依頼するだろうか。僕は後者です。

- ブログで間違った用語を使い続けて、大量の専門記事を書いている
- ブログで少量の記事を書いている。用語は常に正しい。

### 自分のことを棚にあげています

コードレビューの時に「自分のことは棚に上げろ」と書いている本があった。
そうしないとコードレビューで他の人のコードについて意見が出せなくなるため。

~~自分もたくさんの記事を書く中で用語の記載間違いあるだろうと思う。~~
自分もたくさんの記事を書く中で用語の記載間違いがあるだろうと思う。
（助詞「が」が抜けていました。)

今後も気をつけたいとは考えている。

(追記: 過去の自分の記事でタイトルの表記は小文字で統一、してきたが、最近それはぶれている。今後の記事は正確な大文字小文字表記にしようかと思う）
再帰データ型のように振る舞うset型を作る

## 概要と結論
集合論において普遍的な集合を取り扱う時，ある集合は元として集合そのものも含めることができる必要があります．

```math
A~ =~ \bigl\{~ 0,~ 1,~ 2,~ \bigl\{ ~ 3, ~ 4, ~ 5 ~ \bigr\} \bigr\} \\
```

よって仮にその集合をC++で表す型`set`があった時，以下のように動作することが望ましいです．

```cpp
int main(){
    set<int> A, B;

    // { 0, 1, 2 } ⊂ A
    A.insert(0);
    A.insert(1);
    A.insert(2);

    // { 3, 4, 5 } = B
    B.insert(3);
    B.insert(4);
    B.insert(5);

    // { 3, 4, 5 } ∈ A
    A.insert(B);

    return 0;
}
```

このsetを実装すると以下のようになります．

```cpp
#include <set>
#include <boost/variant.hpp>
#include <boost/any.hpp>
template<class T>
struct multiplex_less;

template<class T>
class set : public std::set<boost::variant<T, set<T>>, multiplex_less<T>>{
public:
    set() = default;
    set(const set&) = default;
    set(set&&) = default;
    ~set() = default;
};

template<class T>
struct multiplex_less{
    bool operator ()(const boost::variant<T, set<T>> &a, const boost::variant<T, set<T>> &b) const{
        if(a.which() < b.which()){
            return true;
        }else if(a.which() > b.which()){
            return false;
        }else{
            switch(a.which()){
            case 0:
                return std::less<T>()(boost::get<const T&>(a), boost::get<const T&>(b));

            case 1:
                {
                    const set<T> &sa = boost::get<const set<T>&>(a);
                    const set<T> &sb = boost::get<const set<T>&>(b);
                    if(sa.size() < sb.size()){
                        return true;
                    }else if(sa.size() > sb.size()){
                        return false;
                    }else{
                        auto iter = sa.begin();
                        auto jter = sb.begin();
                        for(; iter != sa.end(); ++iter, ++jter){
                            if(multiplex_less()(*iter, *jter)){
                                return true;
                            }else if(multiplex_less()(*jter, *iter)){
                                return false;
                            }
                        }
                        return false;
                    }
                }
            }

            // unreachable poiont.
            return false;
        }
    }
};
```
WordPressの投稿にカラーミーショップの商品を登録するプラグイン

#はじめに

WordPressの投稿にカラーミーショップの商品を登録できると便利ですよね。
そんな機能を簡単に追加できるプラグインを作りました。

#事前準備
- カラーミーショップのアカウント開設
- アクセストークンの取得([公式APIドキュメント](https://shop-pro.jp/?mode=api_started))
- WordPressのインストール

#設定方法

[github](https://github.com/yusuke-asaoka/colorme-wp)よりプラグインをダウンロードしてWordPressにアップロード、有効化して下さい。
その後[設定] → [カラーミーショップ設定]にアクセストークンを入力して下さい。

以上で事前準備は終わりです。

#商品の登録
投稿画面にカラーミーショップ商品IDという入力項目が追加されていると思います。
こちらにカラーミーショップの商品IDを入力して保存すれば完了です。
**「商品を確認する」**ボタンを押すことで商品IDが正しく入力されているか確認することができます。

![スクリーンショット 2016-11-20 7.12.35.png](https://qiita-image-store.s3.amazonaws.com/0/85153/b5ae2170-f2b9-f55e-d046-985a5bf6220f.png)

#フロントエンドでの使い方

プラグインを有効にすると**colorme**という関数が使用できるようになります。
こちらをループ内で使用することにより商品情報オブジェクトが一通り取得可能です。

```php
if(have_posts()):while(have_posts()) : the_post();
  if(function_exists('colorme')){
    $colorme_obj = colorme();
  }
endwhile; endif;
```

基本的な使用例

```php
if(have_posts()):while(have_posts()) : the_post();
  if(function_exists('colorme')){
    $colorme_obj = colorme();
  }
  if(!empty($colorme_obj)){
    $name = $colorme_obj->name //商品名
    $price = $colorme_obj->sales_price //販売価格
    $image = $colorme_obj->image_url //商品画像（オリジナルサイズ）
}
endwhile; endif;
```
その他、取得できる商品情報は[公式APIドキュメント](https://shop-pro.jp/?mode=api_interface#get-v1stocksjson)より確認できます。
技術英語 > in narrowing the space in which the [unterminated] comment or string is hiding.

@ Code Complete (No. 17743 / 36077)

> in narrowing the space in which the <font color=red>unterminated</font> comment or string is hiding.

http://ejje.weblio.jp/content/unterminated
> Not terminated

syntax highlightがつかないエディタの場合、上記のような終端を忘れたコメントは見つけにくい。

Sublime textなどを使っていると、コメント終端がないと後方のコードすべてが灰色になるので、ミスが見つかりやすい。
機械学習論文読みメモ_16

[Minding the Gaps for Block Frank-Wolfe Optimization of Structured SVMs](https://arxiv.org/pdf/1605.09346.pdf), ICML2016
structured SVM（SSVM)を考える。
SSVMは通常に２値予測ではない、構造的な予測問題に関して適用出来るSVMである。
損失関数は構造的予測に対するヒンジロスとしてloss-augmented decoding subproblemとも呼ばれるmaximization oracle関数を最小化する。
このmax oracleは、構造的な予測誤差に関して一般化して適用可能なヒンジロスである。
このロスに関して双対問題を解く事でSVMと似たような形式で解く事が出来る。
この問題を解く際に、Block Coordinate Frank-Wolfe(BCFW) methodが利用出来る。
これは出力空間を区分する事で、逐次的に各区間毎にFrank-Wolfe（FW) methodによる更新を行っていく手法である。
この時、双対問題で求めるラグランジュ変数ではなく、主問題における線形回帰の重みが実際に陽に求める値である。
これは区分された領域内で双対問題に関するFWにおける最適化と、主問題のヒンジロスに関する最適化の間には双対ギャップが存在する。
この双対ギャップを解析する事で、より適応的な指標に基づき最適化を行う事できる。
特に、更新する区域の非一様なサンプリングを提案、ペアワイズ更新といったBCFWの亜種を開発、FW更新を行う際に必要なmax orcale関数値を双対ギャップに基づき記憶しておく事で計算コストを節約した、SSVMの正則化パスを描けるようにした。

[Hyperparameter optimization with approximate gradient](https://arxiv.org/pdf/1602.02355.pdf), ICML2016
多くの機械学習モデルは少なくとも１つ以上のハイパーパラメータを持っている。
このハイパーパラメータ最適化を不正確な勾配情報を元に行う。
この手法を用いる事で、各回毎にモデルの収束を待つ事なくハイパーパラメータ更新を行っていく事が可能になる。
またこの手法が全体最適に収束するための十分条件を与える。

[Gromov-Wasserstein Averaging of Kernel and Distance Matrices](http://jmlr.org/proceedings/papers/v48/peyre16.pdf), ICML2016
別々の領域からサンプルされたデータ行列間の距離やカーネル関数を提案する。
この時２つのデータの間に行対行の一対一対応も必要がない。
そのための指標としてsoftassign criterionを用いる。
これは各データのsimilarity matrixからもう一つのものに対する行から行への写像を行った時に、その歪みが最も少なくなるようにする。
その指標は正則化されたGromow-Wasserstein(GW) distanceと考える事が出来る。
結局２つのデータ行列間の距離はこの提案された距離の重み付き平均を最小化するものとなる。
この最小化問題は非凸最適化問題として与えられる。
本論では高速な逐次最適化手法を提案してこれを解く。
GTX1050tiを取り付けからTensorFlowを動かすまで

機械学習用にGPUが欲しいけどお高いGTX1080等に手を出せずにいた自分が、ついにGTX1050tiを買っていろいろした話。

# 環境・目標
windowsとkubuntuのdualbootをしています。メインはkubuntu。これまではグラフィックはCPU(i7-2700K)についているHDGraphics3000頼り。
kubuntuで機械学習にGPUを使えるようにするのが目的。windowsは動けばOK。

# 取り付け・ドライバのインストール
「[自作Pcにwindows10とubuntu14.04をいれてみた(GPU有)](http://qiita.com/Fortis3M/items/3a0a9ffd77ea177b8e56)」によると、デフォルトのままの場合、GPUを挿すとGPU側から出力しようとするんだけど、相性の問題か、画面がほぼ全く映らない。なので、BIOSの設定をいじってCPU側から出力されるようにする。
こうすると、windowsもkubuntuも起動できるので、それぞれでドライバをインストール。windowsはnvidiaのサイトからドライバのインストーラを拾ってきて実行。

kubuntuが厄介だった。
「[GTX-1080 など GeForce を Ubuntu 16.04 LTS で CUDA-8.0RC と共に使う](http://qiita.com/hidenorly/items/a3eb3a0375e6703d163b)」をそのままなぞるのが正解だった。（「nvidia-番号」は適当に最新のもので）
cudaを入れた後に「nvidia-番号」をインストールし直すというのが謎の手法だが、nvidiaのサイトのドライバのインストーラを単純に実行して失敗した。（デスクトップ環境であるplasmashellが起動後すぐにクラッシュするようになった。）

# cuda・cudnn
cudaは上でインストールできたのでOK。cudnnはnvidiaの会員登録のようなものが必要。ダウンロードしたら、TensorFlowのサイトに書かれているやり方でインストール。(https://www.tensorflow.org/versions/r0.11/get_started/os_setup.html#optional-install-cuda-gpus-on-linux)

TensorFlowはバージョン0.11になってcuda8をサポートしたらしいので、自分の場合は現状の最新のものをインストールできたけど、本来は上手く行かない可能性があるので注意が要りそう。

# TensorFlow
pipコマンドで適当に入れればいいのだけど、CPUを使う環境を残しておきたい、GPU環境が修正不要でこのまま使うか疑わしい、という理由で、pyenv-virtualenvでGPU環境下のTensorFlowを作ることにした。pyenv-virtualenvは、環境に名前をつけたり、ディレクトリごとに環境を用意できるのがメリット。
pyenvはanyenvでインストールして、

```
git clone https://github.com/yyuu/pyenv-virtualenv ~/.anyenv/envs/pyenv/plugins/pyenv-virtualenv
```

でプラグインとしてインストール。
pyenvでpython環境を作るときに変な警告が出たのでpyenvのwikiに書かれた必要なものをインストールしました。(https://github.com/yyuu/pyenv/wiki/Common-build-problems)

そんな感じで、専用の環境を作り、その環境にTensorFlowを含め使いそうなパッケージをインストール。

とりあえず、`import tensorflow as tf`だけで動かしたり、mnistしてみたりして確認。肝心の計算スピードは、以前書いたCNNで試してみて、一分ちょっとで99%の精度が出たので満足。
Deep Learningフレームワーク(TensorFlow/Caffe/Theano/Torch)のトレンド比較

# はじめに
Deep Learningのフレームワーク、TensorFlow、Caffe、Theano、Torchのトレンド調査（2015/1～2016/11）をしてみました。

結論：TensorFlowが一番人気で確定です。

# Googleトレンド
青：TensorFlow
黄：Caffe
赤：Theano
緑：Torch

+ **2015/1/1～2016/11/19（すべての地域）**
![TensorFlow_Theano_Cafffe_Torch.png](https://qiita-image-store.s3.amazonaws.com/0/107056/f89905df-a328-49d3-7d1d-8916f1e0b1b1.png)
⇒ 2016年後半にTensorFlowがCaffeを抜きました。
　　

+ **2016/11/13～11/19（すべての地域）の瞬間風速**
![DeepLearning_Weekly.png](https://qiita-image-store.s3.amazonaws.com/0/107056/3add3472-6748-14d3-879e-48782f58d763.png)
⇒ 週間瞬間風速はTensorFlowが他の２倍の検索数を稼いでいました。ニュースで取り上げられることがあったのが影響しているかもしれません。

# Stack Overflow

|フレームワーク|質問(タグ)|
|:--|:--|
|[TensorFlow](http://stackoverflow.com/questions/tagged/tensorflow)|4935|
|[Caffe](http://stackoverflow.com/questions/tagged/caffe)|1332|
|[Theano](http://stackoverflow.com/questions/tagged/theano)|1675|
|[Torch](http://stackoverflow.com/questions/tagged/torch)|558|
⇒ 公開されてまだ１年のTensorFlowが他を圧倒しています。

# GitHub

|フレームワーク|Watch|Star|Fork|
|:--|:--|:--|:--|
|[TensorFlow](https://github.com/tensorflow/tensorflow)|3441|37398|16989|
|[Caffe](https://github.com/BVLC/caffe)|1685|13976|8626|
|[Theano](https://github.com/Theano/Theano)|467|5018|1761|
|[Torch7](https://github.com/torch/torch7)|617|5816|1691|
⇒ 公開されてまだ１年のTensorFlowが他を圧倒しています。

# Qiita

|フレームワーク|投稿|
|:--|:--|
|[TensorFlow](http://qiita.com/tags/TensorFlow)|539|
|[Caffe](http://qiita.com/tags/Caffe)|77|
|[Theano](http://qiita.com/tags/Theano)|33|
|[Torch](http://qiita.com/tags/Torch)|9|
|[Chainer](http://qiita.com/tags/Chainer)|265|
⇒ 公開されてまだ１年のTensorFlowが他を圧倒しています。
国産フレームワーク Chainerは、Qiitaでは、外国産Deep Learningに大健闘。

# おわりに
2015年末は、「Deep Learningフレームワークには、いろいろあります。」という状況でしたが、2016年末は、「Deep Lerningフレームワークの一番人気はTensorFlowです。」という状況になってきているようです。

Deep Learningフレームワークは、それぞれ独自のDSLを持ち、それをベースにしているため、フレームワークの乗り換えにはコストがかかります。そのため、Deep Learningのフレームワークとして、どれを選択するかは、慎重にならざるを得ません。（KerasでTensorFlow/Theano共通プログラムを書くことができます。）

TensorFlowは、公開されてからの歴史が最も浅いにもかかわらず、既に１番人気に躍り出ています。今後、TensorFlowは次のようなことが期待できます。

+ 今、他のフレームワークより劣る部分があったとしても解決される可能性が高い。
+ 今後、様々なエコシステムが構築される可能性が高い。
+ コミュニティからのアドバイスを受けられる可能性が高い。

以上。
【swift3】storyboardでナビゲーションバーを作る

- 環境
- 実装（16'11/20追記分）
- 実装
- 余談

# 環境
>
- Mac OS: 10.12.1
- Xcode: 8.1
- swift: 3.0.1

[【Swift1系】【Swift2系】Swiftで開発している人必見！ターミナルでSwiftのバージョンを確認する方法](http://qiita.com/g08m11/items/cea127dae914ffc0967a)

# 実装（16'11/20追記分）

ShinokiRyoseiさんから
Navigation Controllerの使用を薦めて頂いたので、
その手順もまとめます。(ありがとうございますm(_ _)m)


完成図
![nav3.gif](https://qiita-image-store.s3.amazonaws.com/0/143745/60ebf56a-9856-3d63-12a0-42ce5b832964.gif)


こちらが手順のgif
![nav4-iloveimg-compressed.gif](https://qiita-image-store.s3.amazonaws.com/0/143745/e96346c7-2d2f-833d-552c-d108648a2a12.gif)

1. ViewControllerを選択
2. Editor > Embed in > Navigation Controller
3. Navigation Controllerが作られる
4. ViewControllerをドラッグし、作る
5. Bar Button Itemを１つ目のViewに追加
6. Attributes Inspector > Bar Item > Title をNextに変更
7. **Ctrlを押しながら**６で追加したitemを、２つ目のViewにドラッグ
8. Segueでshowを選択
9. navigation bar部分を選択
10. Attributes Inspector の TitleにFirst View、Back ButtonにBackを記入
※ 移動先の「戻るボタン」に表示されるテキスト
11. ２つ目のViewにNavigation itemを追加
12. TitleにSecond Viewと記入


これで完成！


# 実装

storyboard上ですることまとめ（少し早いですが...）
![makeNav.gif](https://qiita-image-store.s3.amazonaws.com/0/143745/b3f2002a-1a04-3102-a751-b4cbc6d0ffca.gif)

1. ViewControllerをドラッグする（FirstViewControllerとする）
2. 1を繰り返す（SecondViewControllerとする）
3. Navigation Barを各Controllerにドラッグする
4. Bar Button Itemを各Controllerにドラッグする
5. FirstViewControllerに置いたボタンを**Ctrlを押しながら**SecondViewControllerにドラッグ
6. モーダルが表示されるので、showをクリック
7. SecondViewControllerに置いたボタンを**Ctrlを押しながら**、SecondViewControllerの**一番右の丸(Exit)**にドラッグ
8. モーダルが表示されるのでクリック

### gifに載っていないこと

- デフォルトで作られるViewControllerをFirstViewControllerにリネームする

>
右クリック > Refactor > Rename ではリファクタリングができない。(ObjCのみ)
[XcodeでSwiftのリファクタリングができないから、renameの代わりにターミナルのコマンドで一括置換してみた](http://jibiki.jp/wordpress/?p=1319)


- File > new > File... > swift.fileを選択（名前をSecondViewControllerにする）
- storyboard > (右側の)show the identity inspector > Custom Classに、FirstViewController, SecondViewControllerをそれぞれ入力
- 各Controllerに以下のコードを記述.

```swift:FirstViewController.swift
import UIKit

class FirstViewController: UIViewController {
    // SecondViewControllerから戻るために必要
    @IBAction func back(segue:UIStoryboardSegue) {}

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
```

```swift:SecondViewController.swift
import UIKit

class SecondViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
```


# 余談

- `import Fundation`

> `import Foundation`にはいくつかのAPIが含まれている。
`import UIKit`や`import Cocoa`に`import Foundation`の内容は含まれている。らしい。
 [what is differant 'import Cocoa' and 'import Foundation' in Xcode's Playground](https://goo.gl/fdalg4)

- Segue

[swift Segueの種類について](https://goo.gl/vQ8hyb)
Slackでメンバーが参加しているチャンネルをBotkit(Slack API)で調べる

## TOPIC
* Slackでメンバーが参加しているチャンネルを調べる

＜書かないこと＞

* Slackの操作説明（Botの連携方法）
* Botkitの使用方法（インストール、起動方法など）
* ソースコードの解説


# Slackでメンバーが参加しているチャンネルを調べる

Botkitのslack_bot.jsに下記の内容を追記しました。

```js:Botkitのslack_bot.jsに追記した内容
var async = require('async');

controller.hears(['^参加チャンネル(.*)'], 'direct_message,direct_mention,mention', function(bot, message) {
  var targetUser = message.match[1];
  var uid = ''

  bot.api.users.list({}, function(err, res){
    async.each(res.members, function(member, callback){
      if(!member.deleted){
        if(member.name.match('^'+targetUser+'$')){
          bot.reply(message, `${targetUser}さんのユーザIDは${member.id}です。`);
          uid=member.id
        }
      }
    });
    
    if(uid === ''){
      bot.reply(message, 'ユーザ検索にヒットしませんでした。');
    } else {
      userInChannel(uid, bot, message);
    }
  });

});

function userInChannel(uid, bot, message) {

  var joinChannels = '';

  bot.api.channels.list({}, function(err, res){
    async.each(res.channels, function(channel, callback){
      if(!channel.is_archived){
        var members = channel.members;
        for ( var i = 0; i < members.length; i++ ) {
          if ( members[i].match('^'+uid+'$')) {
            joinChannels = joinChannels + '\r\n' + channel.name;
          }
        }
      }
    });

    if(joinChannels === '' ){
      bot.reply(message, 'チャンネル検索にヒットしませんでした。');
    } else {
      msg='〜検索結果ここから〜' + joinChannels + '\r\n〜検索結果ここまで〜';
      bot.reply(message, msg);
    }
  });
}
```

## 実行結果

<img width="366" alt="Slack_参加チャネル検索.png" src="https://qiita-image-store.s3.amazonaws.com/0/148986/f2ced58d-08ef-eb2a-4f61-36504832e793.png">


**注）検索できるのはパブリックチャンネルのみです。**

## 動作した環境

* Slackで動作確認した日は【2016年11月20日】です。
* Botkitのバージョンは【0.4.1】です。
* Nodeのバージョンは【6.7.0】です。
* npmのasyncのバージョンは【2.1.2】です。

## 書いた背景
* 新たにSlackへ招待する時に、既存メンバーの●●さんと同じチャンネルに予め参加させてほしいと頼まれることが多かったので、●●さんが参加しているチャンネルを知りたかったので。
* チャンネルからメンバーの一覧は確認できるけど、その逆は確認できなかったので。
    * 制限付きのGuestアカウントは、管理者メニューから参加しているチャンネルを確認できるけど、Full Memberアカウントは参加しているチャンネルを確認できなかったので。


# 参考サイト

* Slack API
    * [channels.list method](https://api.slack.com/methods/channels.list)
    * [users.list method](https://api.slack.com/methods/users.list)

* Botkit
    * [GitHub:howdyai/botkit](https://github.com/howdyai/botkit)

* async
    * [package/async](https://www.npmjs.com/package/async)
Rubyのハッシュ再確認

# ハッシュとは  
簡単に言えば、__表__である
その表には__Key__と__Value__が存在する
ex).

|Key|Value|
|:-:|:-:|
|果物|個数|
|りんご|20|
|オレンジ|13|
|ぶどう|17|

# Rubyハッシュの初期化
### ハッシュオブジェクト作成
```
hash = {"りんご" => 20, "オレンジ" => 13, "ぶどう" => 17}
```

### 2次元のハッシュの初期化
```
hash = Hash.new{|h,k| h[k] = {} }
```
カウントなどに使用したい場合__0__に初期化する必要があるので__{}__の中に記述する
```
hash = Hash.new{|h,k| h[k] = Hash.new{|h,k| h[k]=0}}
```

# ハッシュ取り出し
### 値を表示する
```
puts hash["りんご"]
```
-> 20
Vagrant+ApacheでDocumentRootを共有フォルダへのシンボリックリンクにするとupでコケる

Vagrantの共有フォルダ機能を使い、ApacheのDocumentRootを /var/www/html とし、htmlを /vagrant/html へのシンボリックリンクとして、ホストPCから編集しながら勝手に同期されるようにしたかった。環境は以下。

- Windows 7
- Vagrant 1.8.7
- CentOS 7.2
- Apache 2.4.6

このような使い方をしている人はググると実際いるっぽいのだが、環境の相性なのか、この設定で vagrant up するとhttpdのサービスが立ち上がりに失敗し、

```
$ sudo systemctl status -l httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since 日 2016-11-20 01:50:20 JST; 1min 9s ago
     Docs: man:httpd(8)
           man:apachectl(8)
  Process: 1646 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=1/FAILURE)
  Process: 1368 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
 Main PID: 1368 (code=exited, status=1/FAILURE)

11月 20 01:50:20 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...
11月 20 01:50:20 localhost.localdomain httpd[1368]: AH00526: Syntax error on line 119 of /etc/httpd/conf/httpd.conf:
11月 20 01:50:20 localhost.localdomain httpd[1368]: DocumentRoot '/var/www/html' is not a directory, or is not readable
11月 20 01:50:20 localhost.localdomain systemd[1]: httpd.service: main process exited, code=exited, status=1/FAILURE
11月 20 01:50:20 localhost.localdomain kill[1646]: kill: cannot find process ""
11月 20 01:50:20 localhost.localdomain systemd[1]: httpd.service: control process exited, code=exited status=1
11月 20 01:50:20 localhost.localdomain systemd[1]: Failed to start The Apache HTTP Server.
11月 20 01:50:20 localhost.localdomain systemd[1]: Unit httpd.service entered failed state.
11月 20 01:50:20 localhost.localdomain systemd[1]: httpd.service failed.
```

こうなっている。
この後、`systemctl restart httpd`すると問題なく立ち上がる。
vagrantの共有フォルダが読めるようになるタイミングがhttpdの立ち上がりよりも後なので、DocumentRootが存在しないため失敗している？

~~どうにもならないので、DocumentRootをシンボリックリンクで丸ごと共有するのは諦め、 /var/www/html は通常のディレクトリにして、その下にシンボリックリンクを貼ることで一応解決。
ホストPCのブラウザからアクセスするURLが少し長くなるがしょうがない。~~
（追記）コメントで対処法をご紹介いただきました。
Vagrantfileの設定で毎回up後にhttpdをrestartするprovisionを走らせてあげればよいようです。
[Vagrantの共有フォルダをDocumentrootに設定する時に気をつけること](http://qiita.com/mossa/items/46b77804de77a5ccda8a)
現環境に合わせて、以下のように設定して解決。

```
config.vm.provision "shell", run: "always", inline: <<-SHELL
    systemctl restart httpd.service
SHELL
```

ホストPCのブラウザから開けたり開けなかったりで、ネットワーク周りを疑ってNATのポートフォワーディング、プライベートネットワーク、ファイアウォール、etc...を延々と見ていたので原因の特定にかなり手こずった・・・。
ノードをマージ - Houdini Python 練習

#これはなに？

Houdini Pythonの練習です。
車輪の再開発っぽい気もしますが、「選択中のSOPノードをMergeにつなぐ」という内容。

#スクリプト

```python
selNodes = hou.selectedNodes()

mrgNode = selNodes[0].parent().createNode('merge')
mrgNode.moveToGoodPosition()

mrgNode.setDisplayFlag(True)
mrgNode.setRenderFlag(True)


for i,node in enumerate(selNodes):
    mrgNode.setInput(i,node)
    #node.moveToGoodPosition()

mrgNode.setSelected(True, clear_all_selected=True)
```

これをシェルフに追加して、複数ノードを選択してから実行すると
<img width="993" alt="merge_node.png" src="https://qiita-image-store.s3.amazonaws.com/0/102581/78936bde-6b2a-0c72-3309-cbfe25f0004e.png">
こんな感じに。
Mergeノードが作成され、そこに選択中ノードが一括で接続されます。

##メモ

```python
hou.selectedNodes()
```
は超定番「いま選択中のを取得」です。リストで返ってきます。

```python
selNodes[0].parent()
```
でいま選択してるノードが置かれている階層を得ます。そこで`createNode`メソッドを使ってノードを作ります。`createNode('merge')`でMergeSOPが作られます。

```python
moveToGoodPosition()
```
ネットワークエディタ上で「適当にいい位置に」ノードを移動させてくれます。
後半のforループの中でも使っていますが、あんまり上手い配置にならなかったのでコメントアウトしています。
（コメント解除して動作を比較してみてください。）

```python
mrgNode.setDisplayFlag(True)
mrgNode.setRenderFlag(True)
```
ノードのディスプレイフラグ、レンダーフラグをONにしています。

```python
for i,node in enumerate(selNodes):
    mrgNode.setInput(i,node)
```
選択中のノードをforループでまわしてます。
さっき作ったMergeノードの`setInput`メソッドにノードを渡すことで、Mergeのインプットにそのノードが接続されます。Mayaでいう`connectAttr`的なものです。
`setInput`の第一引数では、そのノードを何番目につなぐかを指定できます。`enumerate`を使ってループの順番`i`を得ているので、それを渡しています。

```python
mrgNode.setSelected(True, clear_all_selected=True)
```
最後に、さっき作ったMergeノードを**選択状態**にします。フラグをONにするところに入れてもいいですね。
「選択する」コマンドじゃなくて「選択状態にする」ってところが風情ですね

#参考

selectedNodes
http://www.sidefx.com/docs/houdini15.0/hom/hou/selectedNodes

parent()やmoveToGoodPosition()、setInput()、setSelected()はこちら
http://www.sidefx.com/docs/houdini15.0/hom/hou/Node

setDisplayFlagはこちら
http://www.sidefx.com/docs/houdini15.0/hom/hou/SopNode
[Rust]セミコロンレスでFizzBuzzを書いてみた


## はじめに

世の中にはセミコロンレスJavaというものがあると知ったので、Rustでもセミコロンレスなコードを書いてみました。

## セミコロンレスとは

セミコロン(;)を一切使わずにコードを書くことらしい。

詳しくは下記のURLを参照してください。

[Semicolonless Java 2012](http://d.hatena.ne.jp/Nagise/20120407/1333767870)
[セミコロンレスJavaはJava8の夢を見るか？](http://d.hatena.ne.jp/bitter_fox/20141022/1413947357)


## 実装

セミコロンレスJavaではif文などを使ってセミコロンを使わないようにしているようだ。
Rustでもifを使って書いてみたのが以下。

```rust:main.rs
#![allow(unused_comparisons)]

pub fn main() {
    if (1..101).map(|n|
            println!("{}",
                if n % 15 == 0 {
                    "FizzBuzz".to_string()
                }else if n % 3 == 0 {
                    "Fizz".to_string()
                }else if n % 5 == 0 {
                    "Buzz".to_string()
                }else{
                    format!("{}", n)
                }
            )
        ).collect::<Vec<_>>().len() >= 0  // ブール値が必要なので意味もなくlen()を呼んで比較。
    {} // セミコロンレスにするためのifなので、{}の中身は不要。
}
```

## マクロバージョン

ifがそのまま見えていると気持ち悪いので、マクロにしてみたのが以下。

```rust:main.rs（改）
#![allow(unused_comparisons)]

macro_rules! semicolonless {
    ($e:expr) => (if $e {})
}

pub fn main() {
    semicolonless!(
        (1..101).map(|n|
            println!("{}",
                if n % 15 == 0 {
                    "FizzBuzz".to_string()
                }else if n % 3 == 0 {
                    "Fizz".to_string()
                }else if n % 5 == 0 {
                    "Buzz".to_string()
                }else{
                    format!("{}", n)
                }
            )
        ).collect::<Vec<_>>().len() >= 0
    )
}

```
初めてマージを理解した。

Ruby on Rails Tutorialを第5章まで進めています。
いろんな経緯で`master`に`checkout`したところ、いきなり作ったヘルパーとかなくなってるから焦りました。
ブランチの一覧とか、コミットの履歴とかいろいろ見ているうちに作業ブランチを間違えていたことに気づいたわけですね。
（てか、ここでやっとブランチとか`checkout`する意味とかわかりました・・・）

ということで、なんとか`master`にこれまでの変更箇所を反映させたく、お世話になります「サルでもわかるGit入門」さんで調べさせていただいたところ、「マージすればいいんだ！てか、マージってそういうことか！！」
と気づきましたので備忘録です。

##マージ方法
1.まずは変更する方のブランチへ

```
$git checkout master
```


2.マージする

```
$git merge issue
```

##まとめ
マージはブランチを統合することだと思っていましたが、実行してもブランチが1つになるわけではありませんでした。


＊こちらのページを参考にさせていただきました。
http://www.backlog.jp/git-guide/stepup/stepup2_4.html
Windows 10で画像を開く既定をWindowsフォトビューアーに戻す

Windows 10から画像の既定がフォトになったが、機能過多で、勝手に画像に補正をかけて表示するようなので具合が悪い。
以前のWindowsフォトビューアーもちゃんと残っており、tiff画像はこれで開けるので、pngやjpegの関連付けもフォトから移したい。


## 関連付け

下記エントリーのとおり。
[Windows 10でWindows フォト ビューアーを既定のアプリにする](http://d.hatena.ne.jp/nyanonon/20150928#p3)

既定のプログラムからはフォトビューアーが選べないので、tiffのftype設定を元に、pngやjpegの関連付けをコマンドプロンプトから直に書き換える。
その後 適当な画像を右クリック > プログラムから開く > 別のプログラムから開く でフォトビューアーを選び、常にこのアプリを～にチェックを入れてOK。


## 画像送りにエクスプローラーの並び順反映

フォトビューアーで開けるようにはなったが、そのままだと複数の画像があるフォルダで画像を「前へ」か「次へ」で送ったとき、以前と違ってエクスプローラーでの並び順が反映されないので地味に不便。
下記の投稿を参考に、レジストリに書き加えることで解決する。
[Windows Photo Viewer; sorting order not the same as view order](http://www.tenforums.com/software-apps/12946-windows-photo-viewer-sorting-order-not-same-view-order.html)

>[HKEY_CLASSES_ROOT\jpegfile\shell\open\DropTarget]
>"Clsid"="{FFE2A43C-56B9-4bf5-9A79-CC6D4285608A}"
>
>[HKEY_CLASSES_ROOT\pngfile\shell\open\DropTarget]
>"Clsid"="{FFE2A43C-56B9-4bf5-9A79-CC6D4285608A}"

BMPなども同様に。
【gif】Macでgifを作れる無料ツール

Qiitaに投稿する時にgifがあったらわかりやすいかも・・・
と思いまとめました。

# gif作成
丁寧に使い方が載っています。
特に説明を見なくともカンタンに使えます。
[簡単に画面をgifアニメとしてキャプチャするツール「lice cap」](http://qiita.com/kichikuchi/items/252a604a7a1db2b3b36e)

# gif編集
無料で使えます。
コマを削除する時、１枚ずつしか消せません。
またundoもできないので操作に注意。
操作自体は簡単です。
[PicGIF Lite](https://itunes.apple.com/jp/app/picgif-lite/id844918735?mt=12&ign-mpt=uo%3D4)

# gif圧縮
ブラウザで圧縮できます。
[GIFの圧縮](http://www.iloveimg.com/ja/compress-image/compress-gif)
ownCloud 9.xでサーバ上のディレクトリをWebから見る方法

オレオレGyazoのWebインターフェースをownCloudで済まそうと思ったときに困ったが解決したので投稿。ownCloudでシンボリックリンクとかcifsマウントしたかった人にも役に立つかも。
# 環境
Ubuntu Server 16.04 LTS
Nginx 1.10.2
ownCloud 9.1.1 Beta

# 結論
ownCloudのローカルマウント機能を使う。

ownCloudにログインし、管理画面を開く。外部ストレージの設定画面から任意のディレクトリを追加。
![0dc819dd501befb63bd4f59a3f6ec3d8.png](https://qiita-image-store.s3.amazonaws.com/0/150188/6c5e52e1-87e3-4090-e302-d4684e96220d.png)
フォルダ名にはownCloudに表示させたい名前、設定にはローカルディレクトリのフルパス、利用可能には許可するユーザを指定。

Webサーバが見れるようにパーミッション設定をする。
下記は/home/nginx/LHSをローカルディレクトリとして設定したときのコマンド。
```bash
$ sudo chown -R nginx:nginx /home/nginx/LHS
$ sudo chmod -R 750 /home/nginx/LHS
```
>chown -Rでディレクトリの所有者を変更
>chmod -Rでディレクトリのパーミッションを変更

# 模索
最初はシンボリックリンクを使用してオレオレGyazoのアップロードディレクトリを見えるようにすればいいだろうと思っていたが、ownCloud8以降からシンボリックリンクが無効になっているとのこと。

[tkamada_の日々: OwnCloud 8でシンボリックリンクを有効にする方法](https://tkamada.blogspot.jp/2015/12/enabling-symlink-folder-with-owncloud-8.html)

自分自身は、Gyazoの画像を見れればそれで良かったので、GyazoのアップロードディレクトリをownCloudの/data/user/以下に設置したが、それもWebインターフェイスから見ることができなかった。

どうやら、以前のownCloudでは、シンボリックリンクもマウントもすべて有効だったようだが、ownCloud9.xではただ単にdataディレクトリ内をWebインターフェイスで見せているわけではなく、ファイルキャッシュを持っていて、それをまず参照しているらしい。

ファイル一覧はまずそのファイルキャッシュを見て表示されるため、実際のディレクトリにファイルが存在していようがファイルキャッシュに存在していなければWebインターフェイスからは見えない。

見えるようにする(ファイルキャッシュを更新する)には下記コマンドでディレクトリをスキャンしなければならない。

```bash
# sudo -u nginx /var/www/html/owncloud/occ file:scan user
```
>**sudo -u nginx** 実行ユーザを指定 ここではnginxを使用。apache(ubuntu)の場合はwww-data。
>**/var/www/html/owncloud/occ** [occ](https://doc.owncloud.org/server/9.0/admin_manual/configuration_server/occ_command.html)の場所。コマンドラインでownCloudを操作できる。
>**file:scan user** [ファイルのスキャンをuserで行うコマンド](https://doc.owncloud.org/server/9.0/admin_manual/configuration_server/occ_command.html#file-operations-label)。userはownCloudのアカウント。

このコマンドで、ownCloudのdata/user/files以下の変更をownCloudに知らせることができる。
ただし、今回の目的は**GyazoのWebインターフェース**なので変更をすぐに確認できないこの方法はなし。

# 解決
フォーラムに頼ったところ、超速で回答をもらえた。外人さんありがとう。
[How to see changes in Data directory on ownCloud 9.x](https://central.owncloud.org/t/how-to-see-changes-in-data-directory-on-owncloud-9-x/4006)

「ownCloudのWebインターフェースを使わないでファイルを読みたいならownCloudのマウントでサーバ上の任意ディレクトリを使用すればいいよー。」とのこと。
おそらく、このマウント機能を使用したディレクトリにはファイルキャッシュは無く、アクセスの都度ディレクトリを見に行ってくれるのだろう。

私はこのディレクトリにSMBをマウントして不安定なownCloudのcifsの代わりにしている。

# 感想
バージョンアップに伴い、今までの方法で目的を完遂させることができなくなったりすることはよくあること。今回もownCloud9.xではファイルの扱いが大きく変わっていて、今までの情報では解決できなかった。

なにかわからないことがあったらTwitterにどうぞ。
[@kznr_luk](https://twitter.com/kznr_luk)
鼻から悪魔：不定値(indeterminate value)バージョン

問：次のC++プログラムの実行結果は？

```C++
#include <cstdio>

#define NUMBER 42

static
void func(int& rv)
{
  int local = rv;
  if (local == NUMBER) {
    std::puts("hit");
  } else {
    std::puts("stay");
  }
}

int main()
{
  int v; // indeterminate value
  func(v);
}
```

答え：

- [gcc 6.1, -O2オプション](http://melpon.org/wandbox/permlink/MROomKRCN2vE4nbG)： `stay`
- [clang 3.9.0, -O2オプション](http://melpon.org/wandbox/permlink/ffGmC5OS97dkRwPU)： `hit`

は？clangなにやってんの？

clangの場合、マクロ`NUMBER`を**任意の数値にかえたとしても**結果は`hit`になります。

一方のgccは何となく正しいようにも思えますかね？


# コンパイラのバグだろ？

いいえ、C++ソースコードのバグです。悔い改めてください。

変数`v`は不定値(indeterminate value)であり、参照`rv`を介した変数`v`読み取りは未定義動作(undefined behavior)を引き起こします。未定義動作を含むC++プログラムでは、**いかなることが起きようとも**それは**C++言語仕様に準じた振る舞い**であり、全ては誤ったC++ソースコードを記述した**プログラマの責任**です。つらい。

# コンパイル結果（出力アセンブリ）を覗く

[gcc 6.1(x86-64), -O2オプション](https://godbolt.org/g/arhW1b)：**無条件に**`stay`を出力します。`hit`に関する処理は消失しています。

```asm
.LC1:
        .string "stay"
main:
        subq    $8, %rsp
        movl    $.LC1, %edi
        call    puts
        xorl    %eax, %eax
        addq    $8, %rsp
        ret
```

[Clang 3.9.0(x86-64), -O2オプション](https://godbolt.org/g/zTTULA)：**無条件に**`hit`を出力します。`stay`に関する処理は消失しています。

```asm
main:
        pushq   %rax
        movl    $.L.str, %edi
        callq   puts
        xorl    %eax, %eax
        popq    %rcx
        retq
.L.str:
        .asciz  "hit"
```

鼻から悪魔の世界へようこそ。

# 関連POST
一連の「null安全」話にインスパイアされた記事ですが、正直言って直接的には関係しません。C/C++言語系の未定義動作は怖いという実例として。

- [null安全な言語は、本当にゼロコストか](http://qiita.com/kazatsuyu/items/a040992c5dff7cfe6537)
- [コンパイラのリミッタが外れつつある今、null安全は必須なのかもしれない](http://qiita.com/AoiMoe/items/2554f78dc9c197d22109)
- [C言語分かってなかった (I Do Not Know C)](http://qiita.com/yohhoy/items/960ee7a7b502e5c764b4)
TweetDeckをStylishでワイドな1カラム表示にする

デスクトップの隅にTweetDeckのTLだけを流しておきたいが、そのままウィンドウ幅を狭めるだけだとユーザーのホーム画面を開いたときにはみ出てしまったりするので、Stylishを使ってカラムの拡張とホーム画面の縮小をする。
TweetDeck側であらかじめ Settings > General > COLUMNS は Wide にしておく。

```
/* メイン */
.is-wide-columns .column {
    width: 500px;
}


/* ポップアップウィンドウ */
.mdl {
    width: 500px;
}
.mdl.s-wide {
    width: 500px;
}
.mdl-column-med {
    width: 137px;
}
.mdl-column-rhs {
    width: 330px
}


/* ヘッダー */
.sprite-drag-vertical {
    height: 6px;
}
.column-header,
.column-header-title {
    height: 25px;
    line-height: 25px;
}
.column-type-icon {
    font-size: 15px;
    width: 15px;
}
.column-title {
    font-size: 12px;
}
.column-title .attribution {
    font-size: 12px;
    padding: 0 0 0 4px;
}
.column-header-links {
    padding: 0 5px 0;
}
.column-header-link .icon-sliders {
    font-size: 19px
}
```

適用先は
次で始まるURL：https://tweetdeck.twitter.com/
にする。
Gitbucketを試すv4.6

GitBucketを試す
http://qiita.com/ymko/items/3fc4c469b3361921d183
の今版です。

# 簡単にためす

```txt
$ docker run  --rm -p 8080:8080 -p 29418:29418 -i -t centos:centos7 /bin/bash
# curl -LO https://github.com/gitbucket/gitbucket/releases/download/4.6/gitbucket.war
# yum install -y java-1.8.0-openjdk
# java -jar gitbucket.war
```

あとはhttp://[addr]:8080 でwebインターフェイスにアクセスできましたまる
管理者アカウントはrootでパスワードもrootです

 curlの `-LO` オプションは必須。LつけずにDLしたらhtmlファイルが落ちてきていてエラーでハマった。

```
# java -jar gitbucket.war
Error: Invalid or corrupt jarfile gitbucket.war
# file gitbucket.war
gitbucket.war: HTML document, ASCII text, with very long lines, with no line terminators
```

## System administration > User Management の設定

- rootを無効化して個人ユーザーを作る

## System administration > System Settings の設定

- [Base URL] "http://サーバーのIP:8080"
　（SSHを使う場合は要求されるので入れる）
- [Anonymous access] を Deny に変更
- [Enable SSH access to git repository] のチェックをつける
- [SSH Host] に "サーバーのIP" を入力
- [Apply changes] ボタン押す

## Account settings > SSH Keys の設定

- id_rsa.pubの中身を書く

# 永続化

```
$ mkdir gitbucket
$ cd gitbucket
$ pwd
/home/ymko/gitbucket
$ curl -LO https://github.com/gitbucket/gitbucket/releases/download/4.6/gitbucket.war
$ ls
gitbucket.war
```

Dockerfileを作る
（冗長だが気にしない）

```
$ cat Dockerfile
FROM centos:7
MAINTAINER ymko
EXPOSE 8080
EXPOSE 29418

RUN yum install -y java-1.8.0-openjdk
RUN mkdir /data \
 && chmod 777 /data \
 && cd /data

# /dataに置くので不要
#RUN curl -LO https://github.com/gitbucket/gitbucket/releases/download/4.6/gitbucket.war

VOLUME /data
WORKDIR /data

CMD /usr/bin/java -jar gitbucket.war --gitbucket.home=/data/storage
```

実行

```
$ docker build -t my_gitbucket .
Successfully built b6726241af99
$ docker run -d -p 8080:8080 -p 29418:29418 -v /home/ymko/gitbucket:/data -t my_gitbucket
```


# 参考

Dockerfile の書き方「私的」なベストプラクティス - ようへいの日々精進XP http://inokara.hateblo.jp/entry/2013/12/28/121828

DockerのVolume機能について実験してみたことをまとめます - Qiita http://qiita.com/namutaka/items/f6a574f75f0997a1bb1d

memorycraft: Dockerってなんじゃ？（Dockerfileでビルド） http://memocra.blogspot.jp/2014/02/dockerdockerfile.html

DockerのVOLUMEを調べてみた。 - Less is Best http://yss44.hatenablog.com/entry/2014/01/08/010022

Dockerfile ベストプラクティス (仮) - Qoosky https://www.qoosky.io/techs/f38c112ca9
CakePHP3でBootstrapの導入にチャレンジ！

以下のリンクを参考にしながらCakaPHP3にBootstrapを導入してみたので自分用のメモとして投稿。

参考にしたURL
　[CakePHP3でBootstrapを使う](http://qiita.com/ran/items/d41d5a0792aa53d63432)
　[CakePHP 3,Bootstrap3 Helpers by Hotl559](https://holt59.github.io/cakephp3-bootstrap-helpers/)

###**1.インストール**
　**git clone https://github.com/Holt59/cakephp3-bootstrap-helpers.git plugins/Bootstrap**

　これにより、plugins直下にBootstrapフォルダが生成されることが確認できるはずです。

　![1.png](https://qiita-image-store.s3.amazonaws.com/0/77607/18a4c292-358e-5f05-9655-699558ee21c0.png)

###**2.準備**
　**config/bootstrap.phpに以下を追加**

```php
　　Plugin::load('Bootstrap', ['autoload' => true]);
```
　**実際に記述した画面**
  ![2.png](https://qiita-image-store.s3.amazonaws.com/0/77607/59013477-54fd-ddc1-cec8-22b3d80da816.png)


  **src/Controller/AppController.phpに以下を追加**

```php
　public $helpers = [
    'Flash' => ['className' => 'Bootstrap.BootstrapFlash'],
    'Form' => ['className' => 'Bootstrap.BootstrapForm'],
    'Html' => ['className' => 'Bootstrap.BootstrapHtml'],
    'Modal' => ['className' => 'Bootstrap.BootstrapModal'],
    'Navbar' => ['className' => 'Bootstrap.BootstrapNavbar'],
    'Panel' => ['className' => 'Bootstrap.BootstrapPanel'],
    'Paginator' => ['className' => 'Bootstrap.BootstrapPaginator'],
　];
```

**実際に記述した画面**
![3.png](https://qiita-image-store.s3.amazonaws.com/0/77607/3ed07db7-08c3-ebd0-6f40-04e3c9249cd0.png)

　**src/Template/Layout/default.ctpに以下を追加**

```php
  <?= $this->Html->script('//ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js', ['block' => true]) ?>
  <?= $this->Html->script('//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js', ['block' => true]) ?>
  <?= $this->Html->css('//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css') ?>
```
 **実際に記述した画面**
![4.png](https://qiita-image-store.s3.amazonaws.com/0/77607/334294b7-fa30-3a5d-b336-c63fed560fba.png)

###**3.使用例**
　実際に参考例文を記載してみました。

```php
　<?php
    echo $this->Form->create(null, ['horizontal' => true]);
    echo $this->Form->input('username', ['type' => 'text']) ;
    echo $this->Form->input('password', ['type' => 'password']) ;
    echo $this->Form->input('remember', ['type' => 'checkbox']) ;
　　echo $this->Form->submit(__('Log In'), ['class'=>'btn-primary col-md-offfset-2']);
    echo $this->Form->end() ;
  ?>
```

　**実際に表示された画面**
 ![6.png](https://qiita-image-store.s3.amazonaws.com/0/77607/46898d04-df48-2891-7c01-eb3823090963.png)
Androidでユニットテストを始めるメモ１

今の時代テストを書いて、CDしないといけないよねって雰囲気があるので、勉強してみます。

https://developer.android.com/training/testing/ui-testing/espresso-testing.html
と、言いつつもこのページを読んで燃え尽きました。


## インストール
新規でつくると最新のAndroidStudioなら、プリセット通りで動きます。便利な時代になりました。
既存の場合は以下を追加すればできるかと思います。

```
dependencies {
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
}
```

テストファイルをつくるときは、プリセット通りにやる場合はandroidTestディレクトリ配下につくります。

## core
基本的なView(TextViewとかImageView）はonViewで、AdapterView（ListViewとかGridView）はonDataで操作を行います。

以下の例の場合だと、my_viewに対して、clickを行い、my_viewが表示されているか判定を行います。

```
onView(withId(R.id.my_view))            // withId(R.id.my_view) is a ViewMatcher
        .perform(click())               // click() is a ViewAction
        .check(matches(isDisplayed())); // matches(isDisplayed()) is a ViewAssertion
```

Viewに対しての操作の種類は"Performing Actions"の項に書いています。
matcherはこちらの[リファレンス](https://developer.android.com/reference/android/support/test/espresso/matcher/ViewMatchers.html)を見てください。

## intents
intentを投げることもできます。
これによりextraで別画面に何かしらのデータを送ることができます。


```build.gradle
dependencies {
    // core -> intents
    androidTestCompile('com.android.support.test.espresso:espresso-intents:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
}
```

## webview
webviewのテストもできるみたいです。
googleのsample
https://github.com/googlesamples/android-testing/tree/master/ui/espresso/WebBasicSample

Elementを指定して、いくつかのアクションをすることができるので、テストをすることができます。

```build.gradle
dependencies {
    // core -> web
    androidTestCompile('com.android.support.test.espresso:espresso-web:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
}
```


## おわりに
結構簡単にできますね。
ただ、基本的にUIテストはユーザーの入力に対して、何かしらの出力をするときに使うのであって、画面の遷移とか切り替わるとかで使う必要はなさそうですね。
使う機会があまり思い浮かばない。サンプルがもっと転がってるといいのですが。

あと、そもそもesspressoって、CDに対応してるんでしょうか。。。