OmniAICreator/Qiita-1.07M huggingface dataset:
Eclipse 4.6(Neon) へのScala IDE導入記録

#この記事について
[Big Data University](https://cognitiveclass.ai/)でScalaの勉強を始めました。
その中でEclipseへScala IDEを導入するくだりがあったため、忘れないようにメモ書き。

#環境
macOS Siera (10.12.5)
Eclipse 4.6.2 (Neon.2)

#参考
[Scala IDEのサイト](http://scala-ide.org/)

#手順
1. [help]-[Install New Software] からソフトウェアの追加を選択
2. Scala IDEのリポジトリを追加します
<img width="581" alt="Screen Shot 2017-06-19 at 17.08.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/184931/7384fd32-34c4-bea8-a2d7-b148a0a48e89.png">

3.色々選択画面が出ますが、Scala IDE for Ecliplseだけ選択し、Finish
<img width="983" alt="Screen Shot 2017-06-19 at 17.08.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/184931/72e0a77c-842d-496d-ebe9-b2bea67df98d.png">

4.Install確認画面が出るのでNext
<img width="983" alt="Screen Shot 2017-06-19 at 17.09.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/184931/c9c1115a-27c6-5f47-bed5-48473e9c439d.png">

5.ライセンスへ同意し、Finish
<img width="983" alt="Screen Shot 2017-06-19 at 17.09.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/184931/5608af2c-a3f0-34b7-fe52-7cc9ee8ef2ec.png">

6.Eclipse再起動が促されるので、再起動し、プロジェクトをインポートするとOK..のはずなのですが
  コンパイルエラーが出ているので、依存ライブラリを修正します

![Screen Shot 2017-06-21 at 13.49.18.png](https://qiita-image-store.s3.amazonaws.com/0/184931/2e5e13ee-7e11-f7de-591b-2b5f224500f9.png)

![Screen Shot 2017-06-21 at 13.53.19.png](https://qiita-image-store.s3.amazonaws.com/0/184931/3150fedc-14da-70d0-7210-c2fe17b0eb9d.png)

![Screen Shot 2017-06-21 at 13.53.11.png](https://qiita-image-store.s3.amazonaws.com/0/184931/46c20689-a544-b1ef-583e-99527f13366e.png)

7.これでOK!
![Screen Shot 2017-06-21 at 13.52.46.png](https://qiita-image-store.s3.amazonaws.com/0/184931/ad7da61a-cf06-c220-ab93-38fd84dcc548.png)
ASP.NET Core  - OAuth認証を行う (Google)

# 開発環境
- .NETCoreApp 1.1
- Windows 10
- Visual Studio Community 2017

# 準備
SSLを有効化しておいてください．
http://qiita.com/musubi05/items/b627effde1e10c43f2e6

# Google API Consoleで必要な認証情報を取得
https://console.developers.google.com/projectselector/apis/library にアクセスし，Googleアカウントでログインします．
![0.png](https://qiita-image-store.s3.amazonaws.com/0/81808/5c5c5923-c2a1-7294-c375-af07356194ae.png)

プロジェクトを作成します．
![1.png](https://qiita-image-store.s3.amazonaws.com/0/81808/44fd2f73-7c42-a88e-addc-6f22c63afd27.png)
![2.png](https://qiita-image-store.s3.amazonaws.com/0/81808/550e9026-037c-cfac-3bd6-cc3c5a823957.png)

作成後，Google+ APIの登録を行います．
ライブラリから，Google+ APIを選択します．
![3.png](https://qiita-image-store.s3.amazonaws.com/0/81808/6ae65818-9cab-8a5e-5263-569eb9ea3c65.png)

登録後，認証情報を作製します．
![4.png](https://qiita-image-store.s3.amazonaws.com/0/81808/2b982551-9f53-4f39-3d3f-7d6d9cf60a0c.png)

認証情報の種類: Google+ API
APIを呼び出す場所: Webサーバー (nodejs, Tomcatなど)
アクセスするデータの種類: ユーザデータ
を選択します．
![5.png](https://qiita-image-store.s3.amazonaws.com/0/81808/2b7ecf12-283a-36e4-3fb0-59a34ab027e8.png)

承認済みのリダイレクトURIに，自身のURLを入力します (SSLポートを指定する）．
必ず，**signin-google** を付加します．
例：https://localhost:44385/signin-google
![6.png](https://qiita-image-store.s3.amazonaws.com/0/81808/b407732d-205c-6cfc-15fd-17addef0916f.png)

登録します．
![7.png](https://qiita-image-store.s3.amazonaws.com/0/81808/d1feb471-0817-4c53-e4f5-1978dd51e988.png)


認証情報をダウンロードし，登録を完了します．
![8.png](https://qiita-image-store.s3.amazonaws.com/0/81808/ab01aa93-3dc4-654a-7c6a-e7b34ae58566.png)
![9.png](https://qiita-image-store.s3.amazonaws.com/0/81808/1a22db2f-c8fe-a710-1f6b-a2df1c5b3e40.png)

ダウンロードしたJSONファイルを開き，client_idとclient_secretを確認します．
![10.png](https://qiita-image-store.s3.amazonaws.com/0/81808/83ff2fe5-b620-aa31-a882-90daa961dbb7.png)

# ユーザシークレット情報の登録
先程入手したclient_idとclient_secretを，ユーザシークレット情報としてアプリケーションに登録します．
## コンソールから

```
dotnet user-secrets set Authentication:Google:ClientID <client_id>
dotnet user-secrets set Authentication:Google:ClientSecret <client_secret>
```
## Visual Studioから
ソリューションを右クリック->ユーザシークレットの管理(G)をクリック
開かれたsecrets.jsonファイルを以下のように記述します．

```json:secrets.json
{
  "Authentication:Google:ClientId": "<client_id>",
  "Authentication:Google:ClientSecret": "<client_secret>"
}
```

# NuGetでMicrosoft.AspNetCore.Authentication.Googleを入れる
認証に必要なパッケージをインストールします．

```
dotnet add package Microsoft.AspNetCore.Authentication.Google
```

# Google Middlewareを有効にする
以下に示す，app.UseGoogleAuthenticationの処理を，Startup.csのConfigureメソッド内に記述します．
必ず，**app.UseIdentity();**の後に記述します．

```C#:startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    // 中略
    app.UseIdentity();

    app.UseGoogleAuthentication(new GoogleOptions()
    {    
        ClientId = Configuration["Authentication:Google:ClientId"],
        ClientSecret = Configuration["Authentication:Google:ClientSecret"]
    });
    // 中略
}
```
ビルドが通れば，完了です．


# 参考
- https://docs.microsoft.com/en-us/aspnet/core/security/authentication/social/google-logins
GVMを使ってGoの開発環境を管理しよう！

 こんにちは！エンジニアのギです。

最近、プロジェクトでGoを使い始めました。
各プロジェクトでGoの環境設定が違うため、プロジェクト毎に
環境を再設定しなければなりません（これは、結構面倒な仕事です）

そこで、すぐにプロジェクトを切り替えられるようにする方法を調べてみました。

今回、[GVM](https://github.com/moovweb/gvm)の使い方をまとめて説明します！

## MacでGVMをインストールする

GVMをインストールするために、mercurialが必要となります。
事前にmercurialを入れておきます。

```
xcode-select --install
brew update
brew install mercurial
```

次に、GVMをインストールします。

```
bash < <(curl -s https://raw.github.com/moovweb/gvm/master/binscripts/gvm-installer)
source $HOME/.gvm/scripts/gvm
```

zshを使っている場合、以下のコマンドでインストールします。

```
zsh < <(curl -s https://raw.github.com/moovweb/gvm/master/binscripts/gvm-installer)
source $HOME/.gvm/scripts/gvm
```

インストールが終わったら、GVMのバージョンを確認できます。

```
gvm version
```

GVMは以下のコマンドでアンインストールできます。

```
gvm implode
```

## GVMを使う

- インストールしたGOバージョン一覧を表示する

```
gvm list
```

- GVMでGoをインストールする

```
gvm install go{goバージョン} -B

```

- GOバージョンを切り替える

```
gvm use go{goバージョン} --default
```

## プロジェクトの環境を設定する

例えば、二つプロジェクトがある。hogeプロジェクトはgo1.7を使って、GOPATHは$HOME/hogeです。
fugaプロジェクトはgo1.8を使って、GOPATHは$HOME/fugaです。
go1.7のGOROOTは$HOME/.gvm/go1.7で、go1.8のGOROOTは$HOME/.gvm/go1.8です。

まずは、GOプロジェクト用のフォルダを作成しておきます。

```
mkdir -p $HOME/hoge/{pkg,bin,src}

mkdir -p $HOME/fuga/{pkg,bin,src}
```

次に、GVMでプロジェクトの環境管理の設定ファイルを作ります。

```
gvm pkgset create hoge
gvm pkgset create fuga
```

作成したものを確認します。 `gvm pkgset list`


次に、GOPATHを編集します。

```
gvm pkgenv hoge
gvm pkgenv fuga

```

行12や行16を以下のように変更してください。



```
# hogeプロダクトの設定
# 行12
export GOPATH; GOPATH="/Users/nghinv/.gvm/pkgsets/go1.7/hoge:$HOME/hoge:$GOPATH"

# 行16

export PATH; PATH="/Users/nghinv/.gvm/pkgsets/go1.7/hoge/bin:${GVM_OVERLAY_PREFIX}/bin:$HOME/hoge/bin:${PATH}"


# fugaプロダクトの設定
# 行12
export GOPATH; GOPATH="/Users/nghinv/.gvm/pkgsets/go1.8/hoge:$HOME/fuga:$GOPATH"

# 行16

export PATH; PATH="/Users/nghinv/.gvm/pkgsets/go1.8/hoge/bin:${GVM_OVERLAY_PREFIX}/bin:$HOME/fuga/bin:${PATH}"


```


これで、設定は終わりです。


hogeプロジェクトを切り替える

```
gvm pkgset use hoge
```

fugaプロジェクトを切り替える


```
gvm pkgset use fuga
```

以上

私の[ブログ](http://tech.aainc.co.jp/archives/10945)より
monit.serviceをsystemdで常時起動処理をさせるために色々メモ

# systemdとは
linuxの起動処理やシステム管理を行う

前から使われていたのがSysvinit
現在、代替えとしてUbuntuはUpstart、Fedora 15やCentOS 7、Red Hat Enterprise Linux 7はSystemdです。

# ユニットとは
centOS7でデーモンの制御対象のこと。systemctlコマンドで制御を行う。
以下のコマンドでファイル単位で確認できる。

```bash
$ systemctl list-unit-files -t service

monit.service                                 enabled
NetworkManager-dispatcher.service             enabled
NetworkManager-wait-online.service            disabled
NetworkManager.service                        enabled
```
ここでenableになっているユニットは自動起動が有効との意味。無効になっているユニットはつまり他のユニットに依存するものなので自動起動の設定が不可能とのこど。

```bash
# ユーザごと個別の設定が可能。
# ここに同名のファイル(/usr/libのシンボリックリンク)を配置することにより優先される。
$ /etc/systemd/system  	
# RPMから直接ファイルが提供される場所であり、システムのデフォルト設定
$ /usr/lib/systemd/system 	
```


# monitのプロセスが落ちても自動で起動させる方法
```bash
$ sudo cp -p /usr/lib/systemd/system/monit.service /etc/systemd/system/
$ sudo vi /etc/systemd/system/monit.service
→ [Service]セクションに "Restart=always" を追加して保存する
→ discが変更されたのでreload
$ sudo systemctl daemon-reload 
```

# monitを使うために注意するべき点
ネットワーク障害/アクセス集中による高負荷などで連続してモニタに失敗した場合monitのmonitorが止まることがあるため、以下のcronの設定が必要

```bash
*/30 * * * * /usr/sbin/monit monitor all
```


# 参考
http://www.unix-power.net/centos7/systemctl.html
http://equj65.net/tech/systemd-boot/
linux kernel4にしたらdockerが動かない

Debian 9 "Stretch"にアップグレードしてカーネルも4.9にあげたらdockerが動かなくなりました。[こちらの手順](https://docs.docker.com/engine/installation/linux/debian/#docker-ee-customers)で docker-ce 1.7にあげてもだめです。

ログファイル /var/log/docker.log をみると以下のようなエラーが出ています。

```
time="2017-06-21T01:50:10.801236461+09:00" level=error msg="[graphdriver] prior storage driver aufs failed: driver not supported"
```

どうやらdockerがデフォルトで使っていた aufs というファイルシステムがDebianが提供するlinux kernel 4以降では標準で含まれないのが原因のようです。aufsは枯れていて安定して動くのがよさそうですが、この際より速いとされる overlay2 にしてしまうことにしました。

/etc/docker/daemon.json というファイルを新規作成して以下のように記述します。

```json
{
        "storage-driver": "overlay2"
}
```

これで docker が起動するようになりました。volume の中身は保たれますが、イメージやコンテナはなくなってしまうようです。作り直してください。念のためvolumeの中身のバックアップを忘れずに。
【使えなくなりました💧】新しいタブを整理してテーマを崇める

# 追記
キモの拡張機能が使えなくなったので、この記事の内容はおそらく再現しないです

![qiita12.PNG](https://qiita-image-store.s3.amazonaws.com/0/188173/af850d5b-67f1-2da0-9542-fb1ca357b513.png)

![qiita13.PNG](https://qiita-image-store.s3.amazonaws.com/0/188173/4caf659e-3e74-60fa-9a7d-2d3445cfde4c.png)

⏰この記事の内容は約1分で実行できます。

【注意】素人が書いた記事です。なまあたたかいめでみてね

#まとめ
- 新しいタブを開いたときに出てくる邪魔なロゴ、検索バー、リンクのサムネを消す
- 猫でもわかる簡単さ
- chrome限定
- chromeの拡張機能ありき
- chromeの拡張機能「stylish」、便利

つまり

1. chrome開く
2. 拡張機能「stylish」入れる
3. 新規スタイルを作る
4. こぴぺ

でできる

#まとめない
##stylishを入れる
chromeで下のリンクに飛んで、chromeに追加をぽち
[Chrome ウェブストア](https://chrome.google.com/webstore/detail/stylish-custom-themes-for/fjnbnpbmkenffdn![qiita2.PNG](https://qiita-image-store.s3.amazonaws.com/0/188173/ec3406f1-e1dd-a36c-fd52-7abb74451510.png)
ngjfgmeleoegfcffe)

ウィンドウの右上（ツールバーの右端）のこれをぽち
![stylish.PNG](https://qiita-image-store.s3.amazonaws.com/0/188173/d7a54e29-c2d3-5ed8-8575-02b0e12c6183.png)

点点点をぽち、スタイルを作るをぽち


##スタイルを作る


名前つけて、適用先を決めて、コード書く、保存、以上

![qiita7.PNG](https://qiita-image-store.s3.amazonaws.com/0/188173/8d39f5eb-3ecc-d7bf-56f0-a246727ccb7d.png)

##コードの例

```css:new_tab
#hplogo{display:none;}
#logo-sub{display:none;}
#f{display:none;}
#most-visited{display:none;}
```

少しばかしコメント付けてみる

```css:new_tab
/* googleロゴを消す */
#hplogo{display:none;}
/* 謎の文字列（日本）を消す */
#logo-sub{display:none;}
/* 検索バーを消す */
#f{display:none;}
/* サムネを消す */
#most-visited{display:none;}
```

でした

#リンク
- chromeのテーマ  
http://waka3.web.fc2.com/
- 参考にしたサイト  
http://qiita.com/neku/items/9de2bf2f0cbc81e08ef7
- stylish 提供サイト  
https://userstyles.org

#ヒトリゴト
読んでくださってありがとうございますっっ

```math
\def\textlarge#1{%
  {\rm\Large #1}
}
\def\textsmall#1{%
  {\rm\scriptsize #1}
}
```

（精一杯小声で）
　　$\textsmall{い　い　ね　く　だ　さ　い　！}$
PHP スマホサイトにする

![2017062101.png](https://qiita-image-store.s3.amazonaws.com/0/95187/7fa4e79a-023b-3470-4931-b951a201c4e4.png)
![screencapture-localhost-picture_upload-album2-php-1498038639263.png](https://qiita-image-store.s3.amazonaws.com/0/95187/38add7e9-ec36-908b-f218-a115490969f6.png)

簡単笑

```:html
<meta name="viewport" content="width=device-width,
 initial-scale=1.0,user-scalable=yes" />
```

これを入れるだけ笑

```html:スマホサイトの基本的な文
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>タイトルです</title>
<meta name="viewport" content="width=device-width,
 initial-scale=1.0,user-scalable=yes" />
</head>
<body>
<h1>スマートフォンサイトテスト</h1>
<p>初めてのスマートフォン向けサイトです</p>
</body>
</html>
```

[参考サイト](http://web-dou.com/html/smartphone.html)
Rails5でjqueryを動かす方法

#概要
jqueryを使うと初回ページ読み込み&リロードで動くが、ページ遷移して該当ページに戻ってくるとjqueryが動かない。
デフォルトgemであるturbolinks（ajaxとajaxとhistoryAPIを使ってページ遷移しやすくするもの）が動作しているため、そもそも**$(document).ready()が動かない**
##Rails4以前
Rails4以前までは、jquery-turbolinksを使っていた
`gem 'jquery-turbolinks'`
`bundle install`
application.jsのrequire jqueryと、require torbolinksの間に
`//= require jquery.turbolinks`
を記述。

#Rails5以降はこう
目的によって使い分けができる。
###素のjsの場合
```javascript:app/assets/javascripts/script.js
//初回読み込み、リロード、ページ切り替えで動く。
$(document).on('turbolinks:load', function() { });

//初回読み込み、ページ切り替えで動く。リロードは動かない
$(document).on('turbolinks:render', function() {　});

//ページ遷移前に行いたい処理用。ページ切り替えでもリロードでも動かない
$(document).on('turbolinks:request-start', function() {　});
```
###coffeeの場合
```javascript:app/assets/javascripts/script.js
//初回読み込み、リロード、ページ切り替えで動く。
$(document).on 'turbolinks:load', -> 

//初回読み込み、ページ切り替えで動く。リロードは動かない
$(document).on 'turbolinks:render', -> 

//ページ遷移前に行いたい処理用。ページ切り替えでもリロードでも動かない
$(document).on 'turbolinks:request-start', ->
```

####**'turbolinks:load'**としておけば間違いないです。jquery-turbolinksの読み込みも必要なし！
renderやrequest-startはどんなケースで使えるのか誰か教えてくださいm(_ _)m

参考：
[http://taillook.hateblo.jp/entry/2017/02/07/010750](http://taillook.hateblo.jp/entry/2017/02/07/010750)
[http://qiita.com/syou007/items/fda40f65634bb2fadf36](http://qiita.com/syou007/items/fda40f65634bb2fadf36)
Rubyのメソッドの使われ方を調べてみた

前回Rubyで[どちらのメソッドが良く使われているか](http://qiita.com/baban/items/443863a96b4e9017a480)について集計結果を見てみましたが、今回はその続き、ここで取れた結果を別の見方で集計してみてみましょう。

まずは前回のおさらいで集計方法の簡単な説明です。

集計は以下の基準でコードを収集して行いました。

1. [bestgems.org](http://bestgems.org/)でランキングされている人気のgemで、ダウンロード数Top 500のコードをサンプルにする
2. 各々のgemの中の`lib`ディレクトリ以下を調査の対象とした。つまりはテストのコードは集計から排除した
3. 動的な言語なのでどのクラスに属しているかの推論は諦めて、あくまでメソッド名の集計結果とした。

そして、集計のためのコードは[github](https://github.com/baban/ruby_mehod_statistic)上に、公開してあります。

これまでの段階で、メソッドとその呼ばれた回数は既に分かっているので、あとはこれをpythonで集計して表示するだけです。このコードも同じgithubリポジトリ上に置いておいたので興味があったら確認してください。

さて、まずはメソッドとその使用回数を単純に、使用回数の多い順で棒グラフで表示して並べてみた結果が下の図です。
数が多いので、見やすい様に、上位１００位までをプロットしています。

![distrubution_map.png](https://qiita-image-store.s3.amazonaws.com/0/10715/29413f8b-e4c5-451f-7dab-4ad670663168.png)

ふむふむ、きれいに並んでいますね。

こういうふうに何かしたらの曲線が出てくると、ここには何か法則がある様に見てきます。
ですので、もう少しグラフを整理してみましょう。

見た所、値が急激に下降しているので、これでは変化の具合が見えずらいです。

そこで定番ですが、対数を利用するという事で、表示は、両対数グラフの上にプロットをし直してみようとしたところ、表示された結果は、なかなかおもしろい結果になりました。

![log_distrubution_map.png](https://qiita-image-store.s3.amazonaws.com/0/10715/878cc877-840c-c5e7-3ade-d4cdecda221c.png)

なんとなく、直線になっているのがわかるでしょうか？

…実はこの結果は、あらかじめ予想をしていて、これは[ジップの法則](https://ja.wikipedia.org/wiki/%E3%82%B8%E3%83%83%E3%83%97%E3%81%AE%E6%B3%95%E5%89%87)という、そもそも自然言語の研究の世界で見つかっている法則と同じものなんですね。

log(rank)が2だとeの２乗は7.39なので、上位７位までの数値。
log(rank)が８以上から、グラフがジグザグに変わって来ているのは、呼ばれた回数が１０回以下の値がここに現れているので、呼び出し回数の１回の変化に敏感になっているからですね。

分かりやすい例として、Wikipediaから取ってきた、英語やスペイン語等30の言語で同じようにグラフを作成した結果を取ってきて、下に図としてまとめました。

どの言語も、おおよそ直線性を持って近い範囲に値が集約しているのが見て取れるでしょうか。

![Zipf_30wiki_en_labels.png](https://qiita-image-store.s3.amazonaws.com/0/10715/809a75a2-036f-5cf2-4af5-9dab09756c61.png)

今回は、プログラミング言語でもこの法則が適応可能か確認してみるのを目的の一つとして、統計を取りました。
Rubyでもこの法則が通用出来る、というか思った以上に綺麗な結果が出てきて驚いています。

プログラミング言語も、人の使う道具として自然言語と同じような法則が隠れている可能性を感じたので
誰か他のプログラミング言語でも試してみると面白いのではないでしょうか。
SaaSForceの画面に動画を挿入する方法

![wfc20161109051.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/d450fee6-3ee3-de5f-5413-4231d0eebfe3.jpeg)

SaaSForceで作るクラウドアプリは、youtubeにリンクさせて動画を表示させることが可能です。

![wfc20161109052.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/41d9f807-6759-9ea2-4189-7cc7db623a46.jpeg)

やり方はかなり簡単で、画面レイアウト作成の画面デザインの画面で「動画/サブウィンドウ」を押してパーツを新しく出します。

そのパーツの位置をおきたい場所に移動させて右クリックをしてリストを表示させます。

![wfc20161109053.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/04754cde-d363-8acd-f3ed-82d913a759ce.jpeg)

「動画/HP元ソース」を押すと次の画面がポップアップしてきます。

![wfc20161109054.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/bbfb6a3b-1b80-4bd6-dc48-1b8cdfd3acc5.jpeg)

この画面にyoutubeの「埋め込みコード」の一部で「embed」の記述のあるURLをコピー＆ペーストして保存します。

例えばこんな感じ。

![wfc20161109055.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/1bbcd7c9-cd9c-129e-d43c-290ec6dff861.jpeg)

この灰色になっている部分だけコピー＆ペーストで。

このアプリをテストサーバーでみるとこのようになります。![wfc20161109056.JPG](https://qiita-image-store.s3.amazonaws.com/0/184885/4f0e0f06-f126-e0c1-1a5d-d03f8f3b8104.jpeg)


いかがでしょうか。

例えばマニュアルアプリを作る場合、動画を掲載することでビジュアル的な理解が得られ、より情報の伝達が容易になります。
UiPathでRPAを実践してみる(3) ～ブラウザ操作の基本(データ入力編)～

今回はブラウザへのデータ入力について書いていきたいと思います。

##1. 準備(IE以外のブラウザを利用する場合)
UiPathは基本的にInternet Explorerを標準として動作します。但し、拡張機能を使えばChromeとFirefoxも利用可能です。
私は普段はChromeを使っているので、chromeのエクステンションを入れていきます。

####①UiPath Studioを起動して、SETUPタブにある、Setup Extensionsをクリック。Chromeを選択します。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/030b199c-d28e-4701-9354-21536fe642ec.png)

####②Chromeの拡張機能が立上がるので、「CHROMEに追加」をクリック。これで準備は完了です。
![キャプチャ(1).PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/9b860b10-4001-9d1f-91d9-590546449867.png)
ちなみに、この拡張を有効にしておかないと、実行時にエラーとなりますのでご注意ください。

##2. ブラウザへデータを入力する
では、さっそくデータの登録をしていきましょう。サンプルとしてQiitaのプロフィール編集用画面を使ってみます。
UiPath Studioではユーザーの操作を記録してくれる、Recording機能が備わっているので、これを使っていきましょう。
####①UiPath StudioよりRecording→Webを選択する
![キャプチャ(2).PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/3952d7cc-9009-ce4e-97d1-ddbce9f38332.png)

####②下記の画面が立ち上がりますので、入力情報を記録していきます。
まずはTextBoxに文字を入力してみます。Typeをクリックすると、次に入力対象となる要素を選択するように求められます。ここに、何らかの文字列を入力してEnterを押しましょう。
![キャプチャ(3).PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/cb38a8a2-c01b-94c8-b054-ebccfd2c70d9.png)

ここでは、URLに「www.abc.co.jp」と入力するようにしています。また、「Empty Field」にチェックが入っていますが、これは既にフィールドがあった場合、それを消して上書きする、という意味になります。このチェックが入っていない場合は、既にある文字の一番最後に、指定の文字列を追加する形になります。
![キャプチャ(4).PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/e655315c-8492-2a57-0a26-fd6c7d6be49e.png)

チェックボックスにチェックを入れます。この場合は、Click→checkを使いましょう。
![キャプチャ(6).PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/039edd54-7113-ce76-6550-9a114eae3923.png)


そして、保存ボタンをクリックします。この場合は、Clickを使います。![キャプチャ(7).PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/88b95402-6051-7170-8deb-ccd8c20b6974.png)

最後に、Save & Exitを押すと下記のシーケンスが自動生成されます。Typeのフィールドには、現在は固定値が入っていますが、もちろん変数の指定も可能です。前回書いた、Excelからデータを取得する機能を組合わせて、そのデータを元にWebの登録画面へエントリーさせる、という事も容易に出来ますね。
![キャプチャ(8).PNG](https://qiita-image-store.s3.amazonaws.com/0/154110/f08842c8-ab6f-c7e2-0661-2c67b44bcf58.png)

次回は、ブラウザからのデータ取得について書いていきます。
[Unity] StructuredBufferに配列を含んだ構造体を転送する

![unity.jpg](https://qiita-image-store.s3.amazonaws.com/0/127402/091729d5-85cf-a99c-9efc-e6362ed6208d.jpeg)

# 前置き
オブジェクトの衝突判定をGPU側に任せようとした際に直面した問題の解決方法です。

2次元の点と矩形の衝突判定では、「点」と「矩形の各辺」との交差判定を行う必要があります。その際に矩形の頂点を配列として定義しておけば、辺を算出するアルゴリズムが単純になります。
本記事では矩形の構造体を用意する前提で話を進めます。

**追記 :**
もっと効率のいい手法がありそうなので、調査完了次第記事にします。

# C#側の構造体
矩形には

- 矩形の頂点座標(左上、左下、右下、右上)
- ピボット(回転中心)座標
- ラジアン回転角

の情報を持たせます。
このデータの頂点座標4点が配列で扱えると嬉しいわけですが、

```csharp
struct Rectangle {
    public Vector2 p0;    // 左上
    public Vector2 p1;    // 左下
    public Vector2 p2;    // 右下
    public Vector2 p3;    // 右上
    public Vector2 center;    // ピボット
    public float rotation;    // 回転角
}
```
C#側は配列にせず、展開した状態で構造体を定義します。

# シェーダー側の構造体
シェーダーでの構造体定義で、矩形の頂点を固定長配列にすることで値を受け取ることができました。

```hlsl
struct Rectangle {
	float2 points[4];
	float2 center;
	float rotation;
};
```

値の利用は、単純にStructuredBufferから取り出すようにして

```hlsl
float2 leftUp = buffer[InstanceID].points[0]; 
```
で可能です。

# 追記
構造体の転送は、C#側で「マーシャリング」を行うことで柔軟に対応できるようです。
これに関する記事はを後日書く予定です。

# References

- [Possible for a Compute Buffer to pass a struct containing a Vector3 array?](https://forum.unity3d.com/threads/possible-for-a-compute-buffer-to-pass-a-struct-containing-a-vector3-array.370329/)
Debianでsystemctlが動かない

先日リリースされたDebian 9 "Stretch" にアップグレードして、そういえば Debian は SysV Initからsystemdに変更されていたんだよなと（Debian 8 "jessie"から）、いまさらのように思い出してサービスの一覧を表示しようとしてみたら、以下のようなエラーが。

```shell-session
% systemctl -t service
Failed to list units: No such method 'ListUnitsFiltered' 
```

どうやらsystemdがちゃんと動いていない様子。調べたところ systemd-shim というパッケージが入っているせいのようです。

> [本パッケージは systemd の機能を模倣して、systemd の init サービスを使わずに systemd のヘルパを実行する際に必要なものを提供します。](https://packages.debian.org/ja/jessie/systemd-shim)

とのことなのでこれを以下のように削除してrebootをかけたところ正常にsystemctlが実行できるようになりました（運用中のマシンでは怖くてできませんが）。

```shell-session
% sudo apt remove systemd-shim
```
ServiceNow メール通知を実装する

タイトルが連番では無いが、今回は[ServiceNow アプリケーションを作成する その４](http://qiita.com/Kisaragi13/items/72490c9e790bde68cbff)の続きとなる。
前回はアプリケーションのUIを整えたが、ここまでで以下赤枠の部分が終わったこととなる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/198f33d8-b41e-bcc5-f4a6-ca53f793d39e.png)

今後の項目は範囲が広く、技術的な内容となっていくので記事タイトルのナンバリングをやめた。統一性がなくなってしまったがご了承願いたい。

とは言っても最初はプログラムが絡まないメール通知を実装する。
インスタンスのビルドタイプはIstanbul。

※ 開発者向けインスタンスは最初、メール通知が無効となっているため以下の記事を参考に有効化が必要。
> - [ServiceNow初期設定 メール送信を有効化する](http://qiita.com/Kisaragi13/items/d6147e4e196b4a5bbc0c)

# メール通知を実装する
ServiceNow Studioを開く
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/0b8aab67-3ba3-3fb4-6a00-7cc85b090c3b.png)

ショートカットキー『 **Ctrl + Shift + C** 』
「**メール通知**」タブから「**メール通知**」を選択し「**作成**」ボタンをクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/86b123c4-40f9-8359-d1c9-3a6cb1b3851a.png)

メール通知設定画面が開く。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/795d07c5-cc0f-8749-fa73-169ba5ea97fd.png)

「**送信時期**」タブではメールを通知する条件を設定する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/9fd4aab7-1ac7-99ea-fd0c-2aad7386c628.png)

「**受信者**」タブではメールを受信するユーザを設定する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/785ad84c-3ac3-b737-904e-36452048c952.png)

「**内容**」タブではメール内容を設定する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/3ba4bc5e-c63c-4d39-8525-b2ed10f45359.png)

「**送信**」ボタンで保存。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/3e467c85-4894-f7d5-88e2-350426cdd03b.png)

テストデータを登録
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/72ced5c5-8d25-1287-ab5c-db02f431826e.png)

（設定していれば）メールが届く
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175688/d4792166-398f-0841-3bb2-c75b7a5f6eca.png)

以上でメール通知の実装は終了です。

# 関連記事
> - [ServiceNow初期設定 メール送信を有効化する](http://qiita.com/Kisaragi13/items/d6147e4e196b4a5bbc0c)

# 参考サイト
> 『ServiceNow Developers ― Training』
https://developer.servicenow.com/app.do#!/training/landing
Railsのi18nで定義している辞書情報を軒並み取得する方法


以前ど忘れして号泣したのでメモ。

日本語訳ファイルを定義して、

```config/locales/ja.yml
ja:
  date:
    formats:
      default: "%Y/%m/%d"
      short: "%m/%d"
      long: "%Y年%m月%d日(%a)"

    day_names: [日曜日, 月曜日, 火曜日, 水曜日, 木曜日, 金曜日, 土曜日]
    abbr_day_names: [日, 月, 火, 水, 木, 金, 土]

    month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月]
    abbr_month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月]

    order:
      - :year
      - :month
      - :day

  time:
    formats:
      default: "%Y/%m/%d %H:%M:%S"
      short: "%y/%m/%d %H:%M"
      long: "%Y年%m月%d日(%a) %H時%M分%S秒 %Z"
    am: "午前"
    pm: "午後"

  number:
    currency:
      format:
        unit: '¥'
        delimiter: ','
        separator: '.'
        precision: 0

  hello: 'world'
  good:
    morning: 'yeah!'
```

rails consoleで`I18n.t('.')`と叩いてみる。
hashで取得されるのでこれを必要に応じてあれこれごにょごにょしたりする。

```
$rails c
$pry(main)> I18n.t('.')
=> {:date=>
  {:formats=>{:default=>"%Y/%m/%d", :short=>"%m/%d", :long=>"%Y年%m月%d日(%a)"},
   :day_names=>["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"],
   :abbr_day_names=>["日", "月", "火", "水", "木", "金", "土"],
   :month_names=>[nil, "1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"],
   :abbr_month_names=>[nil, "1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"],
   :order=>[:year, :month, :day]},
 :time=>{:formats=>{:default=>"%Y/%m/%d %H:%M:%S", :short=>"%y/%m/%d %H:%M", :long=>"%Y年%m月%d日(%a) %H時%M分%S秒 %Z"}, :am=>"午前", :pm=>"午後"},
 :number=>{:currency=>{:format=>{:unit=>"¥", :delimiter=>",", :separator=>".", :precision=>0}}},
 :hello=>"world",
 :good=>{:morning=>"yeah!"}}

```
baserCMSのテストコード開発

#baserCMS
国産CMS、cakePHP
https://basercms.net/
https://github.com/baserproject/basercms

#インストール
上記githubよりクローンする

#テストコード開発
vagrantの設定ファイルがはいっているので、vagrantで開発
vagrantインストールは割愛

```
# デフォルトファイルをコピー
cp Vagrantfile.default Vagrantfile

# Vagrant を起動
vagrant up

# Vagrant にログイン
vagrant ssh

# アプリケーションフォルダに移動
cd /vagrant/app

# baserCMSをリセット
./Console/cake bc_manager reset

# baserCMSをインストール
./Console/cake bc_manager install "http://192.168.33.10" "mysql" "admin" "basercms" "webmaster@example.org" --host "localhost" --database "basercms" --login "root" --password "root" --prefix "mysite_" --data "nada-icons.default" 

#全てのテストを実行
./Console/cake baser_test baser BcAll

```


・リセットの際にエラーがでたら
app/Config/install.phpとdatabase.phpを削除する


・再インストール時はdbのbasercmsの中にデータがあるとエラーがでるので、上記の２つを削除した後に
192.168.33.10/phpMyAdminにアクセスしてbasercmsの中を全て削除してからインストールする





#公式
[環境構築](
http://project.e-catchup.jp/projects/basercms/wiki/%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89)
[テスト](http://project.e-catchup.jp/projects/basercms/wiki/%E3%83%86%E3%82%B9%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E8%BF%BD%E5%8A%A0%E3%81%A8%E5%AE%9F%E8%A1%8C)
Unity C# パフォーマンス向上（foreach編）


## 前振り
***iPhone5S***や***Android4.4, 5などで発売された端末***でやけにもっさりして、
パフォーマンスの見直しが必要だと思った方に見てもらいたい内容です。
　
　

そして、今回のテーマは「**的確なLoop処理の対応について**」です。
　
　

---

## 環境
　
**Unity** 5.5以降 5.6未満


## loop処理の改善
 

### 【それぞれのloop処理について】
1. 型[] array = new 型();
2. List<型> list = new List<型>();
3. Dictionary<型, 型> dic = new Dictionary<型, 型>();
4. IEnumerator<T> enu;
　

#### 【対応方法】
　
上記の4つのloop処理は、以下のような対応が必要となります。

**1.arrayの対応**

```csharp
for(int i = 0; i < array.Length; i++) {
  var data = array[i];
}
```

　
**2.listの対応**

```csharp
for(int i = 0; i < list.Count(); i++) {
  var data = list[i];
}
```

　
**3.dicの対応**

```csharp
foreach(var value in dic.Keys) {
　// keyが欲しいとき
}

foreach(var value in dic.Values) {
　// valueが欲しいとき
}
```

　
**4.enuの対応**

```csharp
var list = enu.GetEnumerator();
try {
  while(list.MoveNext()) {
  
    var data = list.Current;
    
  }
}
finally {
  list.Dispose();
}
```
　

### 【解説】

4の対応についてですが、一般的には、foreachでloop処理して中身を取り出すことが多いです。

C#の解説でもよく見かけますし、特に変わりはないとされていましたが、**Unity C#となると話は別**です。
　

#### using展開のコンパイラバグ

「List<T>をforeachで回すとGCゴミが出るのはUnityのコンパイラが古いせいでバグッてるから」というのが良く知られている話ですが、
より正しい理解に変えると、「構造体のIDisposableに対するusingの展開結果が最適化されていない（仕様に基づいていない）」ということになります。
この辺の話はECMA-334 C# Language Specificationにも乗っているので、C#コンパイラの仕様に対するバグと言えるのではないか。

***※参考記事に書かれている内容です。***
　

### 【参考記事】
C#のGCゴミとUnity(5.5)のコンパイラアップデートによるListのforeach問題解決について
http://neue.cc/2016/08/05_537.html

C# Dictionary のループのパフォーマンス
https://www.dcom-web.co.jp/lab/cs/dictionary-loop
　

　
---
　

### おまけ
ちなみにforeachの対応前と対応後になります。
そんなに変わりませんが、対応前よりもCPU　Usageで６０FPSをギリギリ超えなくなっていますね。
　
↓foreach対応前
![foreach対応前.png](https://qiita-image-store.s3.amazonaws.com/0/82601/3ed953d8-d0e6-7c9f-4b96-ec0d2f13c36b.png)

　

↓foreach対応後
![foreach対応後.png](https://qiita-image-store.s3.amazonaws.com/0/82601/c3912bdf-f0ba-d5db-da0c-9222f2ef7142.png)

　
---
　

### おまけ2
テラシュールブログの山村さんの記事で、以下の対応策が挙げられていました。
　
・localPositionを使う
・Vectorのoperationを減らす
・VectorのMathfを使用しない
・transformのキャッシュ
・エンジンコードの呼び出し削減
・time.deletaTimeの削減
・foreachを使用しない　← 今回のお話し
・一覧でアクセスするなら、Listではなく、Arrayを使用する
・NonAllocと名のつくAPIを使う(RaycastNonAlloc等)
・stringの結合は避ける(GCの発生を避ける)
・UpdateやLateUpdate等のコールバックを減らす
　

**参考記事**: 【Unity道場】パフォーマンス最適化の ポイント
https://speakerdeck.com/unitydojo/unitydao-chang-pahuomansuzui-shi-hua-false-pointo
FuelPHPでController_Restを利用したWebAPIでURLエンドポイントにIDを含めたい場合

FuelPHPのWebドキュメントを読んでも
`https://hogehoge.com/hoge/fuga/[ユーザID]` というURLエンドポイントのコントローラのメソッドの作り方が書いていなかったのでメモ。

つぶさにドキュメントみたら書いてあるのかもしれない。

```php
class Controller_Hoge extends Controller_Rest
{
    public function get_fuga($id)    // ★引数に指定する！
    {
        return $this->response(array(
            'foo' => Input::get('foo'),
            'baz' => array(
                1, 50, 219
            ),
            'empty' => null
        ));
    }
}
```

引数に指定するのがポイント。
`https://hogehoge.com/hoge/fuga/[ユーザID]`　の[ユーザID]に指定した値が
`get_fuga` メソッド内で$idとして取得できる。

FuelPHPだとAPIのURLが思ったようにするのが難しいのでストレス。
これもドキュメントを隅々まで見れば書いてあるのかもしれないが…
mastodon のテーマカラーの変更は簡単だよ

# やりたいこと
- mastodon のデザイン（配色）を変えてみたい

# 手順

```sass:app/javascript/styles/variables.scss
$classic-base-color: #282c37;         // Midnight Express
$classic-primary-color: #9baec8;      // Echo Blue
$classic-secondary-color: #d9e1e8;    // Pattens Blue
$classic-highlight-color: #2b90d9;    // Summer Sky
```

mastodon ではここで指定した4色をベースにしているようです。
他の色はベースを元に明度を変更して色を作っているようです。（マウスオーバーで明るさ20％あげる等）

## 変更のサンプル
### 緑系

```
$classic-base-color: #223322;
$classic-primary-color: #aaaa77;
$classic-secondary-color: #d9e1e8;
$classic-highlight-color: #aa77aa;
```

![Screen Shot 2017-06-21 at 11.43.46.png](https://qiita-image-store.s3.amazonaws.com/0/124341/3f830fbc-7450-65a6-324f-26ab9dae88c7.png)

### 某白いロボット風カラー

```
$classic-base-color: #ccc;
$classic-primary-color: #d33;
$classic-secondary-color: #d9e1e8;
$classic-highlight-color: #6667dd;
```

![Screen Shot 2017-06-21 at 11.32.42.png](https://qiita-image-store.s3.amazonaws.com/0/124341/8d3389af-f02a-2217-cbc5-776783460682.png)

白背景黒字にするときはテキストカラーの変更を忘れずに

```
$primary-text-color: $black !default;
```

-----
自分が立ち上げた、おもちゃ系マストドンでは某黒いロボット風のカラーにして見ました。
https://plasticmodels.tokyo/about

個性的なインスタンスが増えますように。
BiBTeXとは

BiBTeXについて自分なりにまとめてみたいと思います。

## BiBTeXとは
$\LaTeX$における参考文献のデータベースです。
以下の手順を行うだけで、参考文献欄にそれらしい形式で参考文献が出力されるため、参考文献周りの記述がかなり楽になります。

1. データベースに参考文献を追加する。
2. 本文中で引用する。
3. コンパイルする。

この際、引用されなかった参考文献は参考文献欄に出力されないため、とりあえずデータベースに参考文献を入れておく、といった使い方も出来ます。

## 使い方
### 前準備
1. 空のデータベースファイル`hoge.bib`を作成します。  
※空のテキストファイルを`hoge.bib`で保存すれば大丈夫です。  
※`hoge`の部分は自由に変えて大丈夫ですが、ここでは`hoge`にしたとします。
2. 本文中の参考文献を出力したい位置に以下の記述を追加します。

```tex:本文
\bibliography{hoge} %hoge.bibから拡張子を外した名前
\bibliographystyle{junsrt} %参考文献出力スタイル
```

なお、参考文献出力スタイルには主に以下のスタイルがあります。

|欧文用|和文用|特徴|
|:--:|:--:|:--:|
|`plain`|`jplain`|参考文献をアルファベット順で出力する|
|`unsrt`|`junsrt`|参考文献を引用された順で出力する|

これ以外のスタイルについては[文系のマカーにも「使える」LaTeX](http://ideas.paunix.org/latex/latex_6_bib.htm)をご覧ください。
※学術論文の場合には、参考文献出力スタイルが予め指定されている場合が多いため、投稿する学会の決まりに従って指定すると良いでしょう。

### 参考文献の追加
`hoge.bib`に参考文献を追加します。
#### 学術論文を追加する場合
[学術論文の情報をそれらしい形で出力する方法 - Qiita](http://qiita.com/SUZUKI_Masaya/items/a552ad66705f4f9a5710)をご覧ください。
#### Webページを参考文献として追加する場合
[BibTeX entry from URL](https://chrome.google.com/webstore/detail/bibtex-entry-from-url/mgpmgkhhbjgkpnanlmlhibjfgpdpgjec)を利用すると、BiBTeXの項目を自動的に生成できます。
#### 手で追加する場合
[BibTeX - Wikipedia](https://ja.wikipedia.org/wiki/BibTeX#.E6.9B.B8.E8.AA.8C.E6.83.85.E5.A0.B1.E3.83.95.E3.82.A1.E3.82.A4.E3.83.AB)を参考に記述してください。
#### アドバイス
* 著者が複数いる場合には`and`で繋げます。
* `van Valin`のように姓にスペースが入る場合には『姓, 名』で記述します (ex. Robert van Valin -> `van Valin, Robert`)。  
※`Robert van Valin`と記述した場合、`van`がミドルネーム、`Valin`が姓として扱われてしまいます。
* Robert York IIIのような場合、`York, III, Robert`の順番で記述します。
* 姓は先頭のみ大文字にして記述すると良いです (ex. `Suzuki`)。
* デフォルトではBiBTeX内の大文字は全て小文字として出力されてしまうため、文字列を`{}`で囲って記述すると良いでしょう。

```tex:例
@inproceedings{
  KyTea,
  title={Pointwise prediction for robust, adaptable Japanese morphological analysis},
  author={Neubig, Graham and Nakata, Yosuke and Mori, Shinsuke},
  booktitle={Proceedings of the 49th Annual Meeting of the Association for Computational Linguistics: Human Language Technologies: short papers-Volume 2},
  pages={529--533},
  year={2011},
  organization={Association for Computational Linguistics}
}
```

### 引用
例えば、以下の論文を引用したいとします。

```hoge.bib
@inproceedings{
  KyTea, %文献参照名
  title={Pointwise prediction for robust, adaptable Japanese morphological analysis},
  author={Neubig, Graham and Nakata, Yosuke and Mori, Shinsuke},
  booktitle={Proceedings of the 49th Annual Meeting of the Association for Computational Linguistics: Human Language Technologies: short papers-Volume 2},
  pages={529--533},
  year={2011},
  organization={Association for Computational Linguistics}
}
```

このとき、本文中の引用したい位置で以下のように記述します。

```tex:本文
%\cite{文献参照名}で引用
Neubigら\cite{KyTea}は...
```

### コンパイル
1. $\TeX$ファイルを1回コンパイルします。
2. 以下のコマンドを実行し、データベース中の参考文献を反映させます。
  * 欧文の場合  
`bibtex {TeXファイル名}`
  * 和文の場合  
`pbibtex {TeXファイル名}`
3. $\TeX$ファイルを3回コンパイルします。

## 参考文献
* [LaTeX 文献データベース(BibTeX)](http://www.yamamo10.jp/yamamoto/comp/latex/bibtex/bibtex.html)
* [BibTeX | Ryo Otoguro](http://otoguro.net/home/latex/bibtex/)
トラブルで500を返すサーバを curl で監視し、治った瞬間にメッセージを送る

5秒ごとに、Curlで監視し、５００以外を返すようになったら、メッセージを送ります。
以下では、IFTTT の Maker チャンネルと Line チャンネルで、Lineにメッセージを送るようにしています。

```
while :; do
  RESPONSE=`curl -H 'Content-Type: application/json' 'http://XXX' -d '"json body"' -w '%{http_code}' -s`;
  echo $RESPONSE;
  if [ $RESPONSE != '500' ]; then
     curl -X POST https://maker.ifttt.com/trigger/notify/with/key/XXXX;
     break;
  fi;
  sleep 5;
done
```
Scorer SDKを使ってみて

#テーマ
今回扱う[ScorerSDK](http://sdk.scorer.jp/)はとにかく、情報が無さすぎる！しかも、コミュニティサイトもあるけれど、8人くらいしかactiveしてない！？
テーマは、このSDKをもっと熱くさせよう！ということです。
#SDKの趣旨
本SDKは、インストールイメージとして手にはいる、無料のSDKです。
Pythonで画像を解析するための開発環境が手には要り、わずか数行でUSBカメラの画像から顔を認識して、Web上に結果を出力します。
また、RaspberryPi3にインストールされて、USBカメラとセットになったスターターキットもあります。
#スターターキットの魅力
実際私は、スターターキットでSDKを触りました。
SDKにはScorer-SDK-API(OSS)が内包されており、それを使って開発することができます。
本キット購入得点としてもれなく、アカウントを登録すれば、勝手にクラウドへUSBカメラから録画したファイルをアップロードします！止め方不明。

真面目に言うと以下が魅力です。
・IDEに[Cloud9](https://c9.io)を採用。同ネットワーク内の別端末から開発を行える設計
・サンプルプログラムが豊富。画像解析の勉強にうってつけ
#SDKへの文句
イメージとして入手できるのは良いんだけど、Root権限がないって．．．！！
そのため、1024までのすでに閉まっているPortの解放、Aptでのインストールができません。(解決方法を探し中)
#ここまでのまとめ
環境の構築がめんどくさがりにはぴったりなSDKでした。
オチとして、入っているライブラリも有名なものばかりのため、特別な環境ではありません。
また、紹介したAPIで呼び出せるものは、本当に特別なものではなく、有名なライブラリを用いることで実装できるものです。
iframeを含むページが印刷できない

2017年7月のWindows Updateで解消したようです。

# 現象
2017年6月のWindows Update以降、IEでiframe内のページを印刷すると空白だったり404エラーだったりという問題が発生。
ちなみにframesetの場合、この問題は発生しないようなので古いページは逆にセーフ！
※framesetはHTML5では廃止

```dummy.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title></title>
</head>
<body>
  <a href="#" onclick="window.print()">window.print</a>
</body>
</html>
```

```iframe.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>iframe</title>
</head>
<body>
  <!-- 印刷できない -->
  <iframe src="dummy.html"></iframe>
</body>
</html>
```

```frameset.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>frameset</title>
</head>
<frameset>
  <!-- 印刷できる -->
  <frame src="dummy.html"></frame>
</frameset>
</html>
```

# 対策
デベロッパーフォーラムによるとPrintPreview(jquery plugin)か`document.execCommand('print', false, null)`を使えば回避できるっぽいことが書かれている。
https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12349663/#comment-1

## PrintPreview
印刷対象を指定して印刷用の別ウィンドウをポップアップするプラグイン？
https://github.com/etimbo/jquery-print-preview-plugin
iframeが問題っぽいので別ウィンドウで開くことで回避

## document.execCommand
https://w3c.github.io/editing/execCommand.html
`execCommand(command, show UI, value) `
まだW3Cで正式勧告されていない
execCommandについてぐぐっても第1引数のcommandにprintが見つからない…


というわけで試してみた

```dummy2.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title></title>
</head>
<body>
  <!-- 印刷できない -->
  <a href="#" onclick="window.print()">window.print</a><br>

  <!-- 印刷できる -->
  <a href="#" onclick="document.execCommand('print', false, null)">document.execCommand</a>
</body>
</html>
```

とりあえずIE11(11.413.15063.0)では印刷できた。
ブラウザによってできるできないがありそうなので、IEに限る＆先にコマンド自体が使えるかチェックする…などが必要か。
Nutanix導入前のお勉強。

#はじめに
半年スクラムマスターをやって、久しぶりにインフラの仕事に戻ってきた。
またVMwareかよー、と思ったらNutanixが相手だったので、勉強と気になった点をまとめる。

- 参考書
    - [Nutanix Bible(日本語版)](http://nutanixbible.jp/)
    - [AHV Networking](https://www.nutanix.com/go/ahv-networking.html)
    - [Lenovo HX Operation guide(Ja)](www.lenovojp-cms.com/cmscontents/gdfiles.php?md=511)
    - [AFS guide](http://download.nutanix.com/documentation/v50/Acropolis-File-Services-Guide-v20.pdf)

##要件
CEじゃない方のNutanix with AHVを使って、その上でファイルサーバーを使う。
Windowsファイルサーバーでも良いのだが、Wannacry騒動もあり、AFSを使うかもしれない。

##構築
大まかな要件を決めて、パラメータシートを埋めてNutanixに投げれば、3週間後にネットワーク設定まで終わった状態で届く。配線して電源を入れ、Cluster upすれば動き出す。
機器もメニューから選ぶだけなので、サイジングも不要。

##Networks設計
VMwareとの用語比較は"AHV Newtworking"の後ろの方に付いているので、先に読んでおくと理解が早い。
CVM同士の通信は必ず10Gbが必要。1Gb IntefaceはUserVMの通信に使う事が可能だが、めんどくさいので10Gbだけで使いたい。
上位のSwitchはstackかVPCか判らないが、Uplinkはロードバランスしたい。
今後必要となりそうなVLANは先に作っておいて、UplingにTrunkして渡しておく。
- 気になった点
    - AHV~CVM間の通信に 192.168.5.0/24 を使う。既に使われていた場合はどうするのだろう。
    - br0-upのtrunk port化はPrismからできないんだろうか。

##AFS
SMBのみ。Active directoryが前提。今後WORKGROUPを相手にするなら根本的な検討が必要。
Storage(CVMと通信) External(UserやADと通信) 2つのnicを持たせる=IPアドレスが必要。
1 AFS=minimum 3 node DFSとして動作する。

テストするなら、ノードダウン時の挙動と、アクセス制御機能の確認くらいかな...

##テスト
パフォーマンステストは要件が無いのでやらない。基本機能のテストのみ。
- Nutanix部分
    - 色々と線の抜き差し
    - Split Brain時の挙動
    - CVMダウン時の挙動
    - Split Brain & CVMダウン時の挙動
    - Hot migration(vMotion)..はAHVで出来るんだろうか。
    - 監視...といってもCVMにagent導入できないのでSNMPやsyslog監視くらい
- AFS部分(Nutanixのテストとセットでやらないと2度手間かも)
    - 1ノードダウン時の挙動
    - アクセス制御機能の確認
    - ADと疎通できない場合のアクセス制御機能の確認
    - 監視...Nutanix経由で監視できるはず。

##その他
Cluster全体, AFSの起動停止と、Nutanix, AFSのノード追加手順は必要かも。
でも、全部止める事なんて無いから要らないのかも。

実際に導入してみて、気づきがあれば後日。
ざっくりSQSとSNSのメモ


# メッセージングとは？
* サーバー間、プロセス間、スレッド間でメッセージをやり取りすること

#　メッセージには同期と非同期がある
* 同期メッセージング
  * HTTP通信
  * senderはreceiverから結果が来るのを待つ

* 非同期メッセージング
  * 投げっぱなしで結果を要求しない
  * 受け手のサーバーを増やしたりすれば、並行処理できる量が増えるのでスケーラビリティが高い

# SQSとSNSの比較
* SQS(Simple Queue Service)
  * フルマネージドなキューイングサービス
  * キューに入れたメッセージを複数の受信者が並列で実行する
  * 日次のバッチ処理など1日数時間かかる処理を分散して高速処理できたりする

* SNS(Simple Notification Service)
  * フルマネージドなメッセージングサービス
  * マルチプロトコルでプッシュしたメッセージを通知できる
  * HTTP(S)、メール、SQS，モバイルプッシュ
  * 無料枠: モバイルプッシュ100万件、HTTP: 10万件、SQS: 無料、メール: 1000件
  * トピックをSubsribe->トピックへpublish->連携エンドポイントへプッシュ通知

# SNSのメリット
* 非同期メッセージなので、処理を待たずに並列処理できる
* イベントをトリガーに動作する疎結合なシステムが作れる
* 既存システムと組み合わせやすい
* 色んな通知に使える(監視数値が超えたらモバイル通知、メール通知)
* AWSの設定画面で受信側の設定ができて楽ちん
Python、Selenium2 を使用するときに役立ちそうなメモリンク

# とりあえず
いまさらながらですが「Python、Selenium2」でのブラウザ自動操作するための環境構築とスクリプト例です。仕事の合間に勉強できるかな？と思って参考になるサイトだけを調べた結果…です。

比較的簡単にスクリプトは記述できるのだけど、フレームを使った場合にelement指定どうするの？とか少しはまったので時間のあるときにまた勉強することにしました。

# リンく
>+ [まだmechanizeで消耗してるの? WebDriverで銀行をスクレイピング（ProtractorとWebdriverIOを例に）](http://motemen.hatenablog.com/entry/2014/10/01/scrape-by-protractor-webdriverio)
>+ [Awesome Selenium : 素晴しい Selenium ライブラリの数々](http://qiita.com/h_network21/items/a4cbff763b9ee8a7879a)
>+ [Selenium WebDriver入門](http://qiita.com/yulily@github/items/c3edbe25e84280c17776)
>+ [PythonでSeleniumを使ってスクレイピング (基礎)](http://qiita.com/kinpira/items/383b0fbee6bf229ea03d)
>+ [Python、Seleniumの基本](https://torina.top/detail/264/)
>+ [Pythonでスクレイピング(Selenium)](http://nisiki-satika.hatenablog.com/entry/2016/05/04/114154)
>+ [WebDriverでブラウザを自動化](https://trapti.tech/blog/281/)
kepler-mapperを使ってTopological Data Analysisらしきことをしてみた

# Topological Data Analysisとは
[Deep Learning の次は、TDA 「トポロジカル・データ・アナリシス」](http://qiita.com/HirofumiYashima/items/b07483af7ef31c30dacc#python%E8%A8%80%E8%AA%9E "Deep Learning の次は、TDA 「トポロジカル・データ・アナリシス」") の記事にもあるように、最近何かとTDAという言葉を耳にするようになった。

私はPythonをデータ分析のメイン言語として使っているので今後のことも考えてPythonでTDAを動かしたいのだが、探してみてもあまりそれに関するサンプルコードが見つからない(ぐぐるとPython Mapperとかいうのをよく見る)。

今回は色々出回っているソースのうち、[kepler-mapper](https://github.com/MLWave/kepler-mapper "kepler-mapper")を使ってPythonでTDAしてみたのでサンプルソースと使い方をまとめようと思う。

# とりあえず動かす
まずは先ほどの[kepler-mapper](https://github.com/MLWave/kepler-mapper "kepler-mapper")からkm.pyをDLする。
適当なディレクトリに置いてこれをコールするプログラムを書いてみる。

```Py3
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import km
import numpy as np
import pandas as pd

train = pd.read_csv("test.csv",header = None)
train = train.dropna()
data_columns = [c for c in train.columns if c != 0]
data = np.array(train[data_columns])
y = np.array(train[0])

REDUCER = km.manifold.TSNE()
EPS = 0.3 #最低距離
MIN_SAMPLES = 3 #最低包括ログ数
NR_CUBES = 5
OVERLAP_PERC = 0.3
GRAPH_CHARGE = 50
GRAPH_GRAVITY = 0.5
FILE_NAME = "results.html"
FILE_TITLE = "test_analysis"

# mapperの初期化
mapper = km.KeplerMapper(verbose=1)

# 描写用データの生成(TSNEの場合、N次元のデータを2次元に落とす)
data = mapper.fit_transform(data,projection = REDUCER)

# ノードとリンクを返却する
complex = mapper.map(data,clusterer = km.cluster.DBSCAN(eps=EPS, min_samples=MIN_SAMPLES),nr_cubes=NR_CUBES,overlap_perc=OVERLAP_PERC)

# complexをhtmlに書き出す
mapper.visualize(complex, path_html = FILE_NAME, title=FILE_TITLE, graph_charge=-GRAPH_CHARGE, graph_gravity=GRAPH_GRAVITY, custom_tooltips=y)

```

最初にデータを読み込んで、正解ラベル以外のデータを
```
data = np.array(train[data_columns])
```
としてdataに代入する。

その後各種パラメータを適当に設定し

```
1. mapperを初期化する(verboseはデバッグモード)
2. 描画用のデータを作成する(次元削減するアルゴリズムをREDUCERに設定。値はkm.pyに設定されている値かsklearn.manifoldにある次元削減アルゴリズム
3. 描画データからノードとリンクを求める。clustererにクラスタリングのアルゴリズムを設定する(サンプルの場合DBSCAN)
4. visualizeにcomplexを渡し、htmlを作成してもらう
```

この4ステップでTDAっぽいhtmlファイルを生成してもらえる。
csvのフォーマットはこんな感じ。先頭行に正解ラベルを、以降1行に正解ラベルを示すデータをだーっと書いていけばいい。

| 正解ラベル | データ1 | データ2 |
|:-:|:-:|:-:|
| A | 1  | 2  |
| B | 2  | 3  |

TDA自体は教師データは必要なく、visualizeするときのcustom_tooltipsに正解ラベルを貼り付けておくと分析がしやすいだけなので、正解ラベルについては必要に応じてつければ良い。

出力のhtmlファイルはこんな感じ、今回はmnistに対してTDAをしてみた。
![スクリーンショット 2017-06-21 10.34.04.png](https://qiita-image-store.s3.amazonaws.com/0/187732/a1cbb9b3-62fe-4df4-76fd-0b61218c0d66.png)

この1つ1つの丸(ノード)がクラスタになっており、線(リンク)が類似度のようなものを表しているっぽい。
例えば同じ0でも線が太い0もあれば細い0もあったり、同じ0でも特徴の捉え方がより細かくわかって面白い。
TDAのパラメータを色々変えて見るとまた違ったトポロジができるので色々研究してみようと思う。

# TDAとkepler-mapper
TDAに関する理論を調べているとノードやらエッジやら色々と難しい表現が出てくるのだが、今回のkepler-mapperを動かしてみた感じ要はこういうことのようだ。

1. 何かしらの方法で多次元データを2次元データに落とし込む(PCA、T-SNEなど)
2. 2次元データを何かしらの方法でクラスタリングし(DBSCAN、K-meansなど)、ノードとリンクを取得する
3. グラフに出力する

キーになりそうなのが1と2のロジック選択で、今回はT-SNEとDBSCANを利用しているのだがこの場合は厳密にはTDAではないのかもしれない。

TDAを調べて見るとTDAは単にPCAのように次元削減をするアルゴリズムではなく、高次元データをbirthとdeathという二次元データで表現可能な状態にすること(パーシステントホモロジーっていうらしい)が目的のアルゴリズムであるようで、この1と2に関しては本来はもっと正しいやり方があるような気がする。
おそらくグラフ表現は補助的なもので、本来はパーシステントホモロジーこそがメインの話なのであろう。

とりあえず自己満足するレベルにはプログラムを動かすことに成功したので、
ここから先はTDAに関する理論を深めて正しいロジックでプログラムを動かそうと思う。
Wordpressで無限スクロールを設定

表題の通り、投稿記事を無限スクロールで表示させる方法。


#読み込みファイル
```
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-infinitescroll/2.1.0/jquery.infinitescroll.min.js"></script>
```

#オプション設定
```
<script type="text/javascript">
  jQuery(function(){
    jQuery('#column-content').infinitescroll({
      loading: {
        finishedMsg: "",
        msgText: "<span class='message_text'>読み込み中</span>"  //最後の項目の後にはカンマを付けない
       },
      navSelector  : ".column-pagenavi",     // ナビゲーション要素を指定
      nextSelector : ".column-pagenavi a",　// ナビゲーションの「次へ」の要素を指定
      itemSelector : ".entry-column-item"   // 表示させる要素を指定
    });
  });
</script>
```

#表示側
```
<div class="column-pagenavi">
  <?php posts_nav_link(); ?>
</div>
```
【MySQL】AWA RDSでmax_allowed_packetを変更するのはコンソールから行う

<h3>この記事について</h3>

タイトルですべてを語ってます。自分が忘れた時に見返す用&「rds max_allowed_packet 変更」とかでググった人の気づきになればうれしいです。

詳細な手順は親切に示してあるページが沢山あるので割愛します。（気が向いたら追記するかも）

<h3>手順</h3>
1.AWSコンソールからRDSのmax_allowed_packetを変更したいインスタンスの所属しているパラメータグループを確認する
2.該当のパラメータグループの設定変更画面からmax_allowed_packetを変更し、保存する
3.該当のインスタンスを再起動する

<h3>参考にした記事</h3>

mysql max_allowed_packetを変更する - Qiita
http://qiita.com/_am_/items/91824da643256d46b847

Amazon RDS でパラメータグループの値を変更する
https://aws.amazon.com/jp/premiumsupport/knowledge-center/rds-modify-parameter-group-values/
(初心者向け)Swift3.0で初アプリ - 次のページを作ってみる

Swift3.0を使って簡単なiPhoneアプリを作ってみます
[初心者向け）Swift3.0で簡単なiPhoneアプリを作ってみる](http://qiita.com/egplnt/items/e8da2b9af1037e179a57)で作ったシンプルなSwift3.0アプリに次のページを作ってみます

#1. 次ページを追加します
- Xcodeでアプリを開きます
- ViewController.swiftの編集画面が開いている場合には、ViewController.swift編集画面の左上の「✕」印で閉じます
- 


- あ
Ruby on Rails備忘録

Railsを触ったので備忘録。

[小学生でもわかるRuby on Rails入門](https://openbook4.me/projects/92)さんを見ながら進めてみた。

逐次追記していくかも？

## ビューとコントローラー
### ビューとコントローラー作成
コントローラー名とそこで扱いたいビュー名を書いていくだけ。

```bash
rails g controller コントローラー名 ビュー名1 ビュー名2 ...
```

`app/controllers/` にコントローラーのファイルが、`app/views/コントローラー名` にビューのファイルが作成される。

### ルーティング
`app/config/routes.rb`にルーティングが記述してあるので必要に応じて書き換える

## DB
### モデル作成
モデル名と属性名・型を書くだけ。

```bash
rails g model モデル名 属性名:型 属性名:型 属性名:型 ...
```

`app/db/migrate` にマイグレーションファイルが作成される。
ただし、この時点ではモデルが作成されていないので注意。

```bash
rake db:migrate
```

上記のコマンドでマイグレーションファイルを反映させることで`app/models` にモデルが作成される。

### データベースの確認
`rails c`を使うことで行える。

### DBのデータ型変更
```bash
rails g migration change_datatype_カラム名_of_テーブル名
```

を実行すると`db/migrate` にマイグレーションファイルが作成される。

```~_change_datatype_hoge_of_fuga.rb
class ChangeDatatypeContentOfBlack < ActiveRecord::Migration[5.1]
  def change
    change_column :テーブル名, :カラム名, :データタイプ
  end
end
```

上のように記述後、

```bash
rake db:migrate
```

でマイグレーションファイルを反映させて終了。
gitでcommitしたファイルの一覧を表示、vi等で簡単に開く。

以下を.bashrcに追加

* git log で出力したファイルの一覧をawkで成形しています。

```bash:.bashrc
function gls () {
    git log --name-status -n1 $1 | awk -F' ' '{print $2}';
}
```

```text:commitしたファイルの一覧
$ gls
```

```text:viで直前にcommitしたファイルを開く
$ vi `gls`
```

```text:viで2つ前にcommitしたファイルを開く
$ vi `gls HEAD^`
```

* ついでなので git status バージョン

```bash:.bashrc
function gs () {
    git status | grep "(modified:|new file:)" | awk -F':' '{print $2}';
}
```

```text:viでcommit前のファイルの一覧
$ gs
```

```text:viでcommit前のファイルを開く
$ vi `gs`
```
[めも]Android Studioが極端に重い時(編集、補完など)

試した環境:Android Studio 2.2.x, Windows7 64bit, メモリ:16GB
※今回試したのは25.0.xまで。(試している環境では、minSdkVersionを10に設定してあるので)

補足: サポートライブラリ26.0.0-alpha1から、minimum SDKが14に変更されます。
[Recent Support Library Revisions - Revision 26.0.0 Alpha 1](https://developer.android.com/topic/libraries/support-library/revisions.html)
> Note: The minimum SDK version has been increased to 14.

#考察(暫定):
・おそらく、ADBが悪さをしています。(一旦デバッグを走らせた後に重くなるなど)
・ADB以外の部分(補完周り)も、何かあるような気がします。(検索ロジック依存の部分)
・ビルドエラーが発生中/後に重くなることも

追記:
ADBはbuild toolではなく、platform toolsのバージョンに影響を受けるはずなので、buildToolsVersionを変更すると治るのは気のせい?? (25.0.3では今の所大丈夫そうなので)
※adb.exeはplatform-toolsフォルダにあるファイル

#~~対処法1: (編集中は)buildToolsVersionを24系(24.0.2など)に戻す~~(25.0.2が重いのはADBのせいだったかも?)
※supportライブラリのバージョンもそろえる必要があるので注意。
・念のため、Invalidate cachesもしています。
・Gradleはオフライン(Offline work)にしています。

25系(25.0.2)が極端に重かったのでメモ。

注:現在は末尾が.3のバージョン(24.0.3、25.0.3などが出ていますが、まだ試していないので、.2の方で書いてあります。)

#対処法2: (Android Studioを一旦終了してから)ADBを止める
一部で、USB経由でADBを使用すると重くなるという情報があります。
Android Studioの起動中にADBを停止(kill-server)しても、一旦ADBが開始された後は、自動的にADBを再起動してしまいますので、止めたい場合は一旦Android Studioを終了しましょう。
※Android Studioを起動しただけでは、ADBは開始しません。
※Android Studio 2.2で試しています。(以前は、エディタの起動中にADBを停止すると動作がおかしくなっていました。どのあたりで変更が入ったかは未確認。)

#一時的な対処法: 補完候補の検索範囲が広がる操作を避ける
気の迷いを捨てて、(補完がかかる前に)文字を一気に打ってしまいましょう。

時間がかかる操作
・バックスペースなどで文字を消す(補完候補の再検索に時間がかかる)
・新しい変数を作る(変数名の補完に時間がかかる)

#現象1: おそらくADB(USB周り)の処理などが原因
・buildToolsVersionが25.0.2の場合、エディタで1文字追加/削除、行選択などをするごとに、数秒のラグが発生する(一旦編集すると少しだけ早くなる場合もある)
・Android Studioを開いたまま他のソフトを操作しようとすると、それらの操作も影響を受ける(ラグが発生する)

#現象2: 補完処理
・補完候補が表示されるまで、極端に時間がかかる
　バックスペースなどで文字を消した場合
　新しい(候補が存在しない)変数名を入力した場合　など
docker入門

大したことではないですが、忘れがちなので忘備録。

# 手順
1. Docker hubにて落としたいimageを選ぶ[Docker Hub | Explore](https://hub.docker.com/explore/)
2. `docker pull ubuntu:16.04` のように、`image:tag`と並べるとpullできる
3. 落としたイメージからコンテナを作成: 

`docker run -it -v HOST_ABS_PATH:CONTAINER_ABS_PATH --name CONTAINER_NAME IMAGE -p 9999:8888 /bin/bash`
-pオプションで、ホストport 9999からコンテナport 8888へのport forwardを設定しています。jupyter使う人などは必要だと思うので設定しましょう。--nameオプションで、コンテナ名をつけてください。この段階では**コンテナの作成**までしか行っていないので気をつけてください。-vオプションで、共有フォルダの作成が出来ます。

4. コンテナ起動: `docker start CONTAINER_NAME`とやると、コンテナが起動されます。終了するときは`docker stop CONTAINER_NAME`です。その他→[Dockerコマンドメモ](http://qiita.com/curseoff/items/a9e64ad01d673abb6866)
5. コンテナ内に入る(コンテナのbashを実行することで同等のことができる): `docker exec -it CONTAINER_NAME /bin/bash`とやると入れます。
VMware > ゲストOS同士の(テキスト,ファイル)コピペ失敗 > 原因と対処

```txt:動作環境
VMware(R) Workstation 12 Pro v12.5.1
ホストOS: Windows 10 pro
ゲストOS1: Windows 8.1 pro (64bit)
ゲストOS2: Windows 7 pro (32bit)
```

関連: http://qiita.com/7of9/items/ed75a3972b0118643123

ゲストOS同士でのコピペができなくなる症状について。

### コピペできない条件

vmxファイルの最後尾

```
isolation.tools.copy.disable = "FALSE"
isolation.tools.paste.disable = "FALSE"
usb:0.present = "TRUE"
usb:0.deviceType = "hid"
usb:0.port = "0"
usb:0.parent = "-1"
```

### コピペできる条件

vmxファイルの最後尾

```
usb:0.present = "TRUE"
usb:0.deviceType = "hid"
usb:0.port = "0"
usb:0.parent = "-1"
isolation.tools.copy.disable = "FALSE"
isolation.tools.paste.disable = "FALSE"
```

isolationの二行が最終行にない場合にコピペができなくなる。

### 原因

vmxファイルを編集して、isolationの二行が最終行にある状態にしても、あるタイミングで最終行でなくなる。

そのタイミングは「USBメモリを挿した時」のようだ。

ただし、ゲストOSが起動中はコピペは有効で、次回再起動以降からコピペできなくなる。

### 対処

USBメモリを挿したゲストOSについて、起動前にvmxファイルを編集して、isolationの二行が最終行になるようにする。