OmniAICreator/Qiita-1.07M huggingface dataset:
yarn global addが動作しない場合の対処

# 本事象が発生した環境

* macOS Sierra 10.12.3
* nvmでnodejsを管理してい(る|た)
* brewでyarnをinstall

# yarn global binがおかしい

本来ならyarnが管理しているpathが表示されてほしいのだが、
なぜかnvmで管理しているpathが表示される

# yarn global lsは正しい

binはおかしいくせにlsだとちゃんと管理されている

# yarn global removeは動作しない

`This module isn't specified in a manifest`のようなメッセージが出る

# 対処

`export PATH="$PATH:$HOME/.config/yarn/global/node_modules/.bin/"`
上記を`$HOME/.bash_profile`などに書いておく

# 参考というか本家のissue

https://github.com/yarnpkg/yarn/issues/1321
特にデーモンとして動くことを意識していなかったPythonスクリプトをCentOS7で常時起動させておくためにsystemdを使った時のメモ

＜3/15 17:32 追記ここから＞
/usr/lib/systemd/system/ は、システムがインストールしたパッケージに含まれるサービスを置く場所とのご指摘をいただきました。
ご指摘の通り、/etc/systemd/system/ 下に置くほうがお行儀が良いようなので、下記は修正しています。ご指摘ありがとうございました！
＜3/15 17:32 追記ここまで＞


あとで追記予定。とりあえずホントのメモ。

下記のようなユニットファイルを /etc/systemd/system に「xxxxx.service」というファイル名で作成。

```
[Unit]
Description=Sample Hogehoge Script
[Service]
ExecStart=/home/hogemi/fuga.py hikisu
Restart=always
Type=simple
PIDFile=/var/run/fuga.pid
[Install]
WantedBy=multi-user.target
```

いくつか見つかった先人たちの例では、Type=forking となっているものが多かったが、これは、スクリプト側の挙動として「起動されたら自分自身は終了して子を残す」という動きをするスクリプトを対象としたもので、フォアグラウンドに居座り続けるタイプのものの場合には、Type=simpleとする。

上記のユニットファイルを fuga.service として作成していた場合、

```
systemctl start fuga
```

でサービスが起動する。

先程のユニットファイルのところで、Type=simpleとしない場合、フォアグラウンドに居座り続けるタイプのものを起動すると、systemctl自体が終わらない。Type=simpleとなっていると、コマンド発行時点でsystemctlがきちんと終わる。

続きは後で。
Python / numpy / statistics > difference > standard deviation > population / sample > 不偏分散の英語表記

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
```

標準偏差の実装中に以下気になったリンク。

[Standard deviation in numpy [duplicate]](http://stackoverflow.com/questions/34050491/standard-deviation-in-numpy) @ Stackoverflow

> user1700890 Dec 2 '15 at 19:07
> I think default of numpy is population standard deviation, which is N and sample standard deviation is N-1.

不偏分散と「そうでない（名称知らない）分散」の違いのようだ。

http://d.hatena.ne.jp/Rion778/20110217/1297935974

[EXCEL > 関数 > STDEV > 不偏分散](http://qiita.com/7of9/items/081101a5e746333cbb11)

~~誰かの記事でコメント欄に不偏分散のことが書かれていたが、どの記事だったか見つからない。~~
見つかった。
[数式とプログラミングの関係](http://qiita.com/ryouka0122/items/3027b833b451e8660a26)

https://ja.wikipedia.org/wiki/%E6%A8%99%E6%BA%96%E5%81%8F%E5%B7%AE


### 母分散 / 標本分散 / 不偏分散

https://stat.biopapyrus.net/statistic/var.html

用語として以下があるようだ。

- 母分散
- 標本分散
- 不偏分散

population variance / sample variance / unbiased variance
がありそう。

wikipediaの「名称の混乱」も留意しておく事項。
SSH接続があればGitでデプロイできる

## 前提
ここでいうサーバーとはAWS EC2インスタンス (Amazon Linux) のこととする

##手順
### 1. サーバー側にGitをインストールする
```bash
$ sudo yum install -y git
```

### 2. サーバー側にGitリポジトリを作成する
```bash
$ mkdir -p /home/ec2-user/git-repo/my-git-repo.git
$ cd /home/ec2-user/git-repo/my-git-repo.git
$ git init --bare
```

### 3. サーバー側にPost-receive Hookを追加する
Gitリポジトリがコードを受け取った後、Webサーバーのドキュメントディレクトリにプッシュさせる必要がある

```bash
$ cd /home/ec2-user/git-repo/my-git-repo.git

$ cat > hooks/post-receive
#!/bin/bash
GIT_WORK_TREE=/var/www/html/public
export GIT_WORK_TREE
git checkout -f

$ chmod +x hooks/post-receive
```

### 4. ローカル側でSSH接続を設定する
ec2-serverという名前で接続できるようにする

```text:~/.ssh/config
Host ec2-server
Hostname xx.xx.xx.xx
User ec2-user
IdentityFile ~/.ssh/secret-key.pem
```
### 5. ローカル側でSSH接続をテストする

```bash
$ ssh ec2-server  #これで接続できればオーケー
```

### 6. ローカル側でGitリポジトリを追加する
すでに~/my-projectというディレクトリで開発が進行中とする
ec2という名前のリモートリポジトリを登録する

```bash
$ cd ~/my-project
$ git remote add ec2 ec2-server:/home/ec2-user/git-repo/my-git-repo.git
```

### 7. ローカル側からサーバーへデプロイする

```bash
$ git push ec2 +master:refs/heads/master  #初回デプロイ
$ git push ec2 master #2回目以降
```

## 参照

[Jeff Hoefs » Setup git deploy for AWS ec2 Ubuntu instance](http://www.jeffhoefs.com/2012/09/setup-git-deploy-for-aws-ec2-ubuntu-instance/)
selenium-webdriverで<select>フィールドから選択中の値を取得する

調べたので備忘録代わりにメモ。

例えば、以下のようなプルダウンメニューがあって、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/82152/9b668c33-f602-904a-ae3c-0574bc5780a0.png)

ここから「A型」という値を取得したい場合のコードです。

ページのソースは以下のようになっていますので、

```html
<p>血液型：<br>
<select name="blood">
<option value="A">A型</option>
<option value="B">B型</option>
<option value="O">O型</option>
<option value="AB">AB型</option>
</select></p>
```

```ruby
blood_type = Selenium::WebDriver::Support::Select.new(driver.find_element(:name, 'blood')).first_selected_option.text

puts blood_type # =>A型
```

これで現在選択されているoptionの値を取ってくることができます。

## 引用
※画像とコードは[こちら](http://www.htmq.com/html/select.shtml)から拝借しました。
API Gatewayに独自リクエストヘッダを追加するための設定

## 正しく設定しないとこうなる

API Gateway利用時に、カスタムヘッダをRequest Headerに追加してブラウザ（axios）からリクエストすると、OPTIONSメソッドのレスポンス時に下記のようなエラーが出てしまい、GETメソッドがリクエストされずに困った。

```
XMLHttpRequest cannot load https://aaabbbccc.ap-northeast-1.amazonaws.com/hogefuga. Request header field x-foo-bar is not allowed by Access-Control-Allow-Headers in preflight response.
```

これはAPI Gatewayに必要な設定がされていないことが原因だった。
以下、設定方法。

## 設定方法

1. API一覧の中から該当APIをクリック
1. リソースの中から該当リソース（例： `/hogefuga` ）をクリック
1. `アクション` と書かれたプルダウンをクリック
1. `CORSの有効化` をクリック
1. `Access-Control-Allow-Headers` の項目に、独自ヘッダ名（ `x-foo-bar` ）をカンマ区切りで追加
1. `CORSを有効にして既存のCORSヘッダーを置換` と書かれたボタンをクリック
1. APIをデプロイ
1. 完了
BigQuery の TIMESTAMP 型のある Schema にて 時間・分・秒単位での行数を知る方法

## 時間単位

```
SELECT
  SUBSTR(STRING(TIMESTAMP_COLUMN_NAME), 1, length('yyyy-mm-dd hh')) AS duration, count(TIMESTAMP_COLUMN_NAME) as cnt
FROM
  `DATASET.TABLENAME`
GROUP BY
  duration
ORDER BY
  duration ASC
```

## 分単位・秒単位

```length('yyyy-mm-dd hh')``` を ```length('yyyy-mm-dd hh:mm')``` や ```length('yyyy-mm-dd hh:mm:ss')``` に変える
SSHでログインできるサーバのMySQLにしれっとログインする

あるサーバへのMySQLログインがリモートでは出来なくって，SSHアクセスしてからMySQLログインしていたのだけれどこれが面倒だったので **あたかもリモートアクセスしているかのようにしれっとログイン** 出来る方法を調べてみました。

調べてみるとSSHトンネル?というものを設定するとそれっぽい事が可能?みたいなので試してみました。

## SSHアクセスの設定

### `.ssh/config`の準備

アクセス元環境に以下のような`.ssh/config`を作成しておきます。

```
Host target_server_sql
  HostName 192.168.11.101
  Port 22
  User target_server_user
  IdentityFile ~/.ssh/id_rsa
  GatewayPorts yes
  LocalForward 3307 localhost:3306  # 3307は，アクセス元の空いているポートを。3306のところは，アクセス先(target_server)のMySQLポートを。
```

基本的にはアクセス先(target_server側)の情報をババッと書いていきます。
`LocalForward`の所だけ，アクセス元の空いているポートを記述する箇所があるので注意です。

## SSHトンネルを掘る

```
$ ssh -f -N target_server_sql
```

## しれっとアクセスする

```
$ mysql -utarget_server_mysql_user -ptarget_server_mysql_password --port 3307 --host 127.0.0.1;
```

アクセス先(target_server側)のMySQLログインユーザ名やらパスワードやらを入力するのはなんとなくわかると思うけれど，ポートの指定は`~/.ssh/config`で設定した **自分の空きポート** を指定します。
また，ホストも **自分自身** です。

## トンネルを潰す

```
$ ps aux | grep target_server_sql
hoge 26564  0.0  0.0  59836  1252 ?        Ss   0:00   0:00 ssh -f -N target_server_sql

$ kill 26564
```

使わなくなったり，指定したポートを変えたくなったりしたらとりあえず`ps`で確認して`kill`でOK。
fastlane/scan でテストを実行する

# fastlane/scan

![scan\.png \(1759×652\)](https://raw.githubusercontent.com/fastlane/fastlane/master/scan/assets/scan.png)

fastlane/scan は fastlane シリーズの中でテストの実行を担当します。
fastlane シリーズはいろいろ触りましたが、一番単純でわかりやすいと思います。

## 何ができるか

### いままで

コマンドラインで Xcode のテストを実行しようとすると以下のようなコマンドを打たねばなりません。

```
xcodebuild \
  -workspace MyApp.xcworkspace \
  -scheme "MyApp" \
  -sdk iphonesimulator \
  -destination 'platform=iOS Simulator,name=iPhone 6,OS=8.1' \
  test
```

人間が入力する文字ではないですね。

### scan を使う

設定ファイル書いておくことで単に scan コマンドを実行するだけでテストを実行できます :relaxed: 

```
bundle exec fastlane scan
```

## 使い方

### Gemfile

```
gem 'fastlane'
```

`bundle install --path vendor/bundle` します。

### Scanfile

`fastlane scan init` と打つと Scanfile のひな型が作成されるので、好きなように修正します。
私は以下のように書いています。

```Scanfile
scheme "HogeTests"
configuration "Staging"

device "iPad Retina"
workspace "hoge.xcworkspace"

open_report true
clean true
skip_build true
output_types "html"
```

### 実行

`bundle exec fastlane scan` でコンパイルとテストが実行され、テスト結果が表示されます :tada:

```
+--------------------+-----+
|       Test Results       |
+--------------------+-----+
| Number of tests    | 224 |
| Number of failures | 0   |
+--------------------+-----+
```

## 便利機能

### slack 連携

テスト実行するとこんな感じで連携される。
(ENV["SLACK_URL"] に webhook url は必要)

![unspecified.png](https://qiita-image-store.s3.amazonaws.com/0/5678/50b804c9-14c4-c41f-aa09-1877c899517e.png)


### テスト結果の表示

output_types "html" でテスト結果がいい感じに見れます。
テストに要した時間も書かれていて良いですね。

![unspecified.png](https://qiita-image-store.s3.amazonaws.com/0/5678/2c924b09-0976-9293-f2f3-f7e99b9d469b.png)

### カバレッジも出せる

[iOS 開発での Pull Request と テストカバレッジの連携 // Speaker Deck](https://speakerdeck.com/starhoshi/ios-kai-fa-defalse-pull-request-to-tesutokabaretuzifalselian-xi)
【Bash忘備録 1】プロセスをまとめてKILLする魔法のコマンド

先日、Crondにより大量に生成されたままフリーズしてしまったgit系プロセスを殲滅するために、こんなコマンドを実行しました。

**ps aux |grep git |awk '{ print "kill -9", $2 }' |sh**

もちろんですが、**絶対に気軽には使わないこと**。
最悪サーバ全体クラッシュして死にます。
必ず使用前にサーバ屋さんに確認して下さい。
コマンドを叩く前に**ps aux |grep git**や**ps aux --forest**でgitを含むgit関連以外のプロセスがいないか確認しましょう。

また、gitの部分をhttpdなど他の単語に変えれば応用可能ですが、httpdやlsyncdなどはツリー状のプロセスとなるため、基本的に親プロセス1個殺せば子プロセスが全滅するのであまり出番はないと思います。
cronで間違って100個くらいPHPの無限ループを作ってしまった、といったケースには有効になりそうなコマンドです。
「プログラムでシダを描画する」をScratchで描画する

こんにちは、@zukkunです。

[「プログラムでシダを描画する」一覧 \- Qiita](http://qiita.com/qt-luigi/items/b22204c7ef73260324bd)

かれこれ2年ほど前にQiitaではシダ描画ブームが来たわけですが、ここでなぜかScratchでシダを描画することを思いついてしまったので、やらずにはいられません。

プログラムを作り、描画し始めてから10分近く経った様子です。

![Scratch Project Editor - Imagine, Program, Share - Google Chrome 2017-03-15 15.17.26.png](https://qiita-image-store.s3.amazonaws.com/0/636/f8296e3e-be34-f902-a39e-32198e0ca424.png)

描画完了まで時間がかかりそうなので、プログラムの解説をします。

プログラムは、透明な1x1サイズのスプライトに対して作成しました。

## 用意した変数

![Scratch Project Editor - Imagine, Program, Share - Google Chrome 2017-03-15 15.34.39.png](https://qiita-image-store.s3.amazonaws.com/0/636/918a9610-625e-02b4-e9f8-e15eaf533d85.png)

用意した変数は`x`、`y`、`ret`の3つです。

## 各定義

座標値計算用の定義ブロックです。

![Scratch Project Editor - Imagine, Program, Share - Google Chrome 2017-03-15 15.21.12.png](https://qiita-image-store.s3.amazonaws.com/0/636/5b50a68d-48bd-4d3c-1599-4a18ecca73fc.png)

![Scratch Project Editor - Imagine, Program, Share - Google Chrome 2017-03-15 15.21.46.png](https://qiita-image-store.s3.amazonaws.com/0/636/c7388ae4-adb5-4ba3-cb9e-573a971f1f3d.png)

![Scratch Project Editor - Imagine, Program, Share - Google Chrome 2017-03-15 15.22.14.png](https://qiita-image-store.s3.amazonaws.com/0/636/fbaa2450-0545-89ef-5f43-a38569d86b7e.png)

![Scratch Project Editor - Imagine, Program, Share - Google Chrome 2017-03-15 15.22.31.png](https://qiita-image-store.s3.amazonaws.com/0/636/dff0aa80-031e-b2d3-1d0f-901f8039b941.png)

次に、点を描画するための定義ブロックです。

![Scratch Project Editor - Imagine, Program, Share - Google Chrome 2017-03-15 15.22.45.png](https://qiita-image-store.s3.amazonaws.com/0/636/f92a59e2-a78d-d16b-0d3e-aae93450c626.png)

点の描画は、Scratchのペン機能を用います。

次に、フラクタル構造を再帰で実現するための定義ブロックです。

![Scratch Project Editor - Imagine, Program, Share - Google Chrome 2017-03-15 15.23.04.png](https://qiita-image-store.s3.amazonaws.com/0/636/fc21ba29-131e-8cdd-bb92-11f89026628f.png)

定義ブロックは、戻り値という概念が無いようでしたので、一旦`ret`という変数に計算結果を入れ、あとで`ret`の値を参照する、という方法を取りました。

## メインプログラム

![Scratch Project Editor - Imagine, Program, Share - Google Chrome 2017-03-15 15.27.04.png](https://qiita-image-store.s3.amazonaws.com/0/636/f7de58bc-8363-f713-a961-5a61903c2b42.png)

プログラムスタートで、ペンの初期化を行って、定義したfブロックを呼ぶだけです。描画中にスクリーンショットを撮っているので、ブロックが光っています。

## 描画の様子

![Scratch Project Editor - Imagine, Program, Share - Google Chrome 2017-03-15 15.30.38.png](https://qiita-image-store.s3.amazonaws.com/0/636/f372f3a7-c530-5420-bde1-6b7de6b412bb.png)

ページ冒頭から、さらに10分近く経ちましたが、まだこの薄さです。

教育用プログラム環境でハードな処理はやるもんじゃないですね。

## 実行開始してから50分

50分経ちましたが、まだ描画してます。このくらいにしておきます。

![Scratch Project Editor - Imagine, Program, Share - Google Chrome 2017-03-15 16.00.46.png](https://qiita-image-store.s3.amazonaws.com/0/636/78c4a6bd-cd9d-cdf2-91b5-fd75d484e92c.png)
WordPressの年別アーカイブを和暦へ

WordPressの"get_archives_link"を使用時に

年別アーカイブを使用時に
平成表記を使いたい場合は
function.phpに以下を追記します。

個人的には、平成のみで良かったので、昭和や明治は省きました。
月別で行い方は、ググると出てきます。

```php:function.php
function add_ja_year_archives( $link_html ) {
    return preg_replace_callback(
          "/[0-9]+?<\/a>/"
        , function ( $matches ) {
              $y = $matches[1];
          
                  $gg = "平成";
                  $yy = $y - 1988;
             
              return "{$gg}{$yy}年</a>"";
          }
        , $link_html
    );
} 
add_filter( 'get_archives_link', 'add_ja_year_archives' );
```
CentOS7の最少インストールから3Gmodemを使えるようにするまで

CentOSを最小インストール

CentOS7.2のインストールDVDに含まれるカーネルや管理ソフトでは正常に認識
されなかった。```yum update```を実行して更新しておく

その後次のパッケージをインストール

```
yum install ModemManager NetworkManager-wwan
```

※　Wifiを使う場合は、 NetworkManager-wifiもinstallする

サービスの起動
```
systemctl start ModemManager
systemctl enable ModemManager
systemctl restart NetworkManager
```

モデムの接続
```
nmcli connection add autoconnect no type gsm ifname "*" apn soracom.io user sora　password sora
nmcli c up gsm
```
apn設定はSoracomの場合の例です
自動起動の設定などは、nmcliの設定方法を参照

動作確認したカーネル
```3.10.0-514.10.2.el7.x86_64
```
関連パッケージのバージョン
```NetworkManager-1.4.0-17.el7_3.x86_64
NetworkManager-wwan-1.4.0-17.el7_3.x86_64
ModemManager-1.6.0-2.el7.x86_64
```
mbed import でエラーが発生する場合の対処方法

mbed import コマンドでエラーが発生する場合の対処方法です。
# 証明書エラーが発生する場合
以下のようなエラーが発生した場合の対処方法です。

```
$ mbed import https://developer.mbed.org/teams/xxxx/code/yyyy/

[mbed] Importing program “yyyy" from "https://developer.mbed.org/teams/xxxx/code/yyyy/"
abort: certificate for developer.mbed.org has unexpected fingerprint 70:f0:1e:e4:c6:89:2f:12:e8:a0:64:05:f7:cf:a6:c6:ba:19:15:e6
(check hostfingerprint configuration)
fatal: https://developer.mbed.org/teams/xxxx/code/yyyy/info/refs not valid: is this a git repository?
[mbed ERROR] Unable to clone repository (https://developer.mbed.org/teams/xxxx/code/yyyy/)
```
mbedコマンドから呼び出している Mercirual (hg) から clone 出来てないようなので、直接呼び出してみます。

```
$ hg clone https://MACRUM@developer.mbed.org/teams/xxxx/code/yyyy/

abort: certificate for developer.mbed.org has unexpected fingerprint 70:f0:1e:e4:c6:89:2f:12:e8:a0:64:05:f7:cf:a6:c6:ba:19:15:e6
(check hostfingerprint configuration)
```
同じエラーが発生しました。調べてみると以下のような例がありました。

https://answers.atlassian.com/questions/241767/check-hostfingerprints-warnings

Mercurial のバージョンをアップデートしても問題が発生する場合は、コンフィグレーションファイル（```.hgrc``` または、```Mercurial.ini```）を直接編集し、以下のように修正します。私が使用していた Windows 7 の場合は、```%APPDATA%``` に隠し属性ファイル Mercurial.ini がありました。

```
[hostfingerprints]
developer.mbed.org = 70:f0:1e:e4:c6:89:2f:12:e8:a0:64:05:f7:cf:a6:c6:ba:19:15:e6
```

再度 ```mbed import``` を実行し、正常にインポート処理が行われたことを確認します。

# 503エラーが発生する場合

```
$ mbed deploy

[mbed] Adding library "I2CEeprom" from "https://developer.mbed.org/users/rhourahane/code/I2CEeprom" at rev #b23f5561266c
abort: HTTP Error 503: Service Unavailable
fatal: https://developer.mbed.org/users/rhourahane/code/I2CEeprom/info/refs
not valid: is this a git repository?
[mbed] ERROR: Unable to clone repository (https://developer.mbed.org/users/rhourahane/code/I2CEeprom/#b23f5561266c)
```
上記エラーは、```mbed import``` で発生していますが、該当するリポジトリのみを ```hg clone``` した場合も、以下のようなエラーになりました。

```
$ hg clone -verbose --debug https://MACRUM@developer.mbed.org/users/rhourahane/code/I2CEeprom/

using https://developer.mbed.org/users/rhourahane/code/I2CEeprom/
proxying through http://proxy.xxxx.co.jp:8080
http auth: user MACRUM, password not set
sending capabilities command
developer.mbed.org certificate successfully verified
abort: HTTP Error 503: Service Unavailable
```

この場合は、proxy の設定が必要になります。先ほどの例と同様に ```.Mercurial.ini``` を修正します。

```
[http_proxy]
host = proxy.xxxx.co.jp:8000
passwd = password
user = username
```

以上です。
オブジェクト 'f_eval'は 'namespace：lazyeval'によってエクスポートされず、ggplot2はロードされません。 

##ggplot2が使用できなくなった

エラーメッセージは以下
![ggplot2エラー.png](https://qiita-image-store.s3.amazonaws.com/0/147821/dad463ad-f411-c09c-cdea-8eabe2ccd786.png)


#このエラーに注目 

```
オブジェクト 'f_eval'は 'namespace：lazyeval'によってエクスポートされず、ggplot2はロードされません。 
```

#解決法

```.R
install.packages（"lazyeval"）
```

を実行してから、再度

```.R
install.packages("ggplot2")
library(ggplot2)

```

を実行で解決。
詳しいことはわからないので、わかったら追記します。
RubyとSeleniumによる自動テスト～スクリプト作成～

#SeleniumIDEを使ったスクリプト作成
全てのスクリプトを手作業で作ると大変なので、べーすになるものをSeleniumIDEで作成します。
　※SeleniumIDEの使い方は割愛します

#SeleniumIDEからRubyのコードをExportする
- テストスイートの保存

SeleniumIDEのメニューから、
`「ファイル」→「テストスイートをエクスポート」→「Ruby / RSpec / WebDriver」`
とたどり、名前を付けて保存する。

名前は、 `テストケース名と同一` にすること
（テストスイートの中で、そのファイル名で読み込む記述になっている）
######これを、テストケース毎に実行する必要があってツラいです・・・
######できることなら、この操作をSeleniumで自動化したいくらいですｗｗ

#Exportしたコードの変更
##変更点(1)
コードはExportしたままだとエラーになり、動作しません。
テストケースのソースファイル内で **`${receiver}`** を **`@driver`** に全て置換してください。

##変更点(2)
上記の変更のみだと、テストケース毎にウィンドウが開くことになってしまいます。
使い方によっては、同一のウィンドウで操作を実行するようにしたい場合もあります。
（前後のテストケースで連続性があるような場合）
その場合は、この変更を行ってください。
###テストケースの変更
テストケースに記述されている以下の箇所を共通化するため、全てテストケースからは削除して、テストスイートに記述します。

- before(:each) do ～ end
- after(:each) do ～ end
- def element_present?(how, what) 以降に宣言されているメソッド

###テストスイートの変更
**before**

```ruby:テストスイートのソース（Exportされた状態）
require "spec/ruby"
require "spec/runner"

# output T/F as Green/Red
ENV['RSPEC_COLOR'] = 'true'

require File.join(File.dirname(__FILE__),  "checkcase009")
  ：
  ：
```

**after**

```ruby:テストスイートのソース（修正後）
require 'selenium-webdriver'
# require 'pry'

# output T/F as Green/Red
ENV['RSPEC_COLOR'] = 'true'

# :firefox / :chrome / :edge / :ie
driver = Selenium::WebDriver.for :firefox
base_url = "http://example.com"

RSpec.configure do |config|
  config.before(:each) do
    @driver = driver
    @base_url = base_url
    @accept_next_alert = true
    @driver.manage.timeouts.implicit_wait = 30
    @verification_errors = []
    puts "TestCase : #{self.class.to_s.split('::').last}"
  end

  config.after(:each) do
    unless @result.nil? then
      puts "ProcTime : #{@result}s"
      @result = nil
    end
    @verification_errors.should == []
  end

  config.after(:suite) do
    driver.quit
  end
   
  config.include TestHelper
end

module TestHelper
  def element_present?(how, what)
    @driver.find_element(how, what)
    true
  rescue Selenium::WebDriver::Error::NoSuchElementError
    false
  end
   
  def alert_present?()
    @driver.switch_to.alert
    true
  rescue Selenium::WebDriver::Error::NoAlertPresentError
    false
  end
   
  def verify(&blk)
    yield
  rescue ExpectationNotMetError => ex
    @verification_errors << ex
  end

  def close_alert_and_get_its_text(how, what)
    alert = @driver.switch_to().alert()
    alert_text = alert.text
    if (@accept_next_alert) then
      alert.accept()
    else
      alert.dismiss()
    end
    alert_text
  ensure
    @accept_next_alert = true
  end
end

  ：
  ：
```

##変更点(3)
必要に応じて、以下のようなロジックを追記してください。

- 画面のキャプチャを保存するロジックの追加

キャプチャを撮るタイミングの箇所に
> @driver.save_screenshot([保存ファイル名])

を記述する

- 時間計測のロジックの追加

レスポンスを計る等、時間計測の必要があるときは、テストケースの **時間を計測したい処理ロジック** の箇所を下記のように変更してください。

```ruby:sample.rb
　：
require 'benchmark'
　：
    result = Benchmark.realtime do
     #（時間を計測したい処理ロジック）
    end
    puts "処理時間 #{result}s"
　：
```

#テストスクリプトの実行
コマンドプロンプトから
> rspec スクリプトファイル名.rb

#クロスブラウザのテスト
テストスイートの最初の方に記載のある
> driver = Selenium::WebDriver.for :firefox

の `:firefox` を `:chrome` や `:ie` に変更すると、それぞれのブラウザで動作させることができるはずです。
`:edge` もできるはずなのですが、WebDriverが対応していないとか何とかで、Rubyからはうまく動作させることができません。。。
（ブラウザが起動しますが、最初のURLの呼び出しもしてくれません）
RubyとSeleniumによる自動テスト～環境構築～

IE11での動作確認をすることを目的にSeleniumの環境構築をした際のメモです。
が、ついでにChromeの環境もいっしょに作ってみました。
まずは環境構築編。
RubyからSeleniumをキックできる環境構築まで。

#SeleniumIDEの導入
　　**※FireFoxのインストールは割愛します。**
##SeleniumIDEのインストール
FireFoxで以下にアクセスし、Selenium IDEをインストールする。
　https://addons.mozilla.org/ja/firefox/addon/selenium-ide/

#Ruby環境
Ruby 2.3.1（2.3.3でも確認しました）
（RubygemsとDevKitの導入が必要？）
##bundlerのインストール
> gem install bundler

##必要なGemのインストール
```ruby:Gemfile
source "https://rubygems.org"
gem "selenium-webdriver"
gem "rspec"
gem "pry-byebug"
```
> bundle install

#WebDriverのダウンロード
[ダウンロードサイト](http://www.seleniumhq.org/download/)
##FireFox/Chrome/Edge用ドライバ
上記ダウンロードサイトの「 **Third Party Drivers, Bindings, and Plugins** 」からダウンロードする。
##IE用ドドライバ
上記ダウンロードサイトの「 **The Internet Explorer Driver Server** 」から32bit or 64bitをダウンロード
※ 64bitだとスクリプトの動作が極端に遅くなる現象が発生しました。
　　64bit環境でも32bitの方を使うと解消されました。
　　→参考[Selenium の IE Driver で SendKeys したときに1文字ごとの入力が異様に遅い場合の対処](http://devadjust.exblog.jp/19305561/)
上記ファイルをダウンロードし、配置したフォルダにPathを通す。

#IE11の環境設定
##IE11の保護モードを有効にする
`インターネットオプション` の `セキュリティ` タブから、

- インターネット
- ローカルイントラネット
- 信頼済みサイト
- 制限付きサイト

の4つ全てについて **保護モードを有効にする** にチェックを入れます。

##拡張保護モードを無効にする
同、 `詳細設定` タブから、
**拡張保護モードを有効にする** のチェックを外します。

#動作確認
動作確認用プログラム

```ruby:seleniumtest.rb
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :firefox
# driver = Selenium::WebDriver.for :chrome
# driver = Selenium::WebDriver.for :ie
driver.get "http://www.google.co.jp/"
# driver.quit
```
実行
> ruby seleniumtest.rb

#補足（ってゆーか、ハマったとこ）
実行環境にもよりますが、会社だと社外に接続するためにはProxyの設定が必要な場合があります。
今回の環境もProxyが必要な環境でした。
そして、Proxyの環境変数にやられました　(T-T)

環境変数で **HTTPS_PROXY** や **HTTP_PROXY** を設定する必要がある
しかし、HTTP_PROXYが設定されていると、 **ローカルホストで動作しているWebDriverへProxy経由でアクセスしようとしてエラー** になってしまいます。
こちらを参考に解決しました。
→[Webブラウザの自動操作 (Selenium with Rubyの実例集)](https://www.qoosky.io/techs/71dd2d67ea)
　「http_proxyという環境変数が定義されている場合」を参照

-----
以上、とりあえず、環境構築まででした。
～スクリプト作成～に続きます。
Sparkで配列型のデータを加工する備忘録（その２）



まずはじめに
---

[前回の記事](http://qiita.com/RyujiKawazoe/items/4418f85713a1069c7770)で @poad1010 様にご指摘いただきもっと簡単に描けそうだったので、新しい記事として投稿してみました。
結果的には前回がクソコードすぎて、コード量的には半分以下になりました。

後述するおまじないの部分はZeppelinとかで動かしている時には遭遇しませんが、jarにするときとかにコンパイルエラーが起こるので注意すべし



やりたかったこと
---

idだけを格納した配列があり、それをSpark上でidからvalueを引っ張ってきて、「：」でつなげる処理をしたかった。

具体的なイメージとしては

```
[1, 3, 5, 7]
```

といったデータを以下の形式に変更したかった。

```
りんご：もも：バナナ：パイナップル
```


環境
---

* spark(2.1.0)
* scala(2.11.8)

やったこと
---

* explodeで配列を展開
* 商品が載っているDatasetを外部結合
* groupByKeyでキーごとに値をまとめる


具体例
---


* ユーザー購入データ

| user_id | buy_list |
| --- | --- |
| 1 | [1, 2, 3] |
| 2 | [2, 4] |

* 商品データ

| product_id | product_name |
| --- | --- |
| 1 | りんご |
| 2 | バナナ |
| 3 | レモン |
| 4 | みかん |


結合コードは以下。

```
# spark: SparkSession インスタンス
# df: ユーザー購入データのDataset
# procuctDf: 商品データのDataset

# おまじない（後述）
val sparkSession: SparkSession = spark
import sparkSession.implicits._

val master = df.select(df.col("user_id"), explode(df.col("buy_list")).as("buy_list"))
  .join(procuctDf, procuctDf.col("product_id").equalTo(col("buy_list")))
  .select(df.col("user_id"), procuctDf.col("product_name"))
  .as(Encoders.tuple(Encoders.STRING, Encoders.STRING))
  .groupByKey(x => x._1)
  .mapGroups((x, y) => (x,  y.map(z => z._2).mkString(":")))
  .select(col("_1").as("user_id2"), col("_2").as("product_name2"))
```

master.show()とかすると以下の結果になっているはず

| user_id2 | product_name2 |
| --- | --- |
| 1 |  りんご：レモン：バナナ|
| 2 |  バナナ：みかん|


おまじないについて
---

一番最初はこんなコードを書いてました。

```
val master = df.select(df.col("user_id"), explode(df.col("buy_list")).as("buy_list"))
  .join(procuctDf, procuctDf.col("product_id").equalTo(col("buy_list")))
  .select(df.col("user_id"), procuctDf.col("product_name"))
  .groupByKey(x => x.getString(0))
  .mapGroups((x, y) => (x, y.map(z => z.getString(1)).mkString(":")))
  .select(col("_1").as("user_id2"), col("_2").as("product_name2"))
```

このコードでコンパイルすると、

```
 Unable to find encoder for type stored in a Dataset.  Primitive types (Int, String, etc) and Product types (case classes) are supported by importing spark.implicits._  Support for serializing other types will be added in future releases.
```

と言うエラーが。
groupByKeyでRowクラスを使っているのが悪いのかな。

と言うことで、これに対応するには以下のおまじないと

```
val sparkSession: SparkSession = spark
import sparkSession.implicits._
```

groupByKeyの前段階で以下の処理を追加する。

```
as(Encoders.tuple(Encoders.STRING, Encoders.STRING))
```
pdfから文字領域を表示するpdf2xml-viewer

ともかく簡単だったのでメモ。
ただpdfの中にちゃんと文字が登録されてる場合に限る。写真の場合は無理。

<img width="946" alt="スクリーンショット 2017-03-15 14.52.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/64334/bdf61f53-1a53-c00a-cbb1-0d49e9488048.png">

ソース
https://github.com/WZBSocialScienceCenter/pdf2xml-viewer

#xmlに変換

```
pdftohtml -c -hidden -xml input.pdf output.xml
```

#表示

```
python -m SimpleHTTPServer 8080
```

http://127.0.0.1:8080/
に接続してファイルを指定してLoad


#詳細アルゴリズム
スキャンしたページイメージを抽出し、PDFのOCRテキストを含むXMLを生成する pdftohtml
pdf2xml-viewerでテキストボックスとスキャンページを表示する
ページとテキストボックスを記述するXMLを読み込む
スキャンしたページの直線を検出し、ページのスキューや回転を見つけて修正する
テーブルの列を識別するための垂直線のクラスタを検出する
テキストボックスのy座標の分布を分析して、テーブルの行位置を調べる
列と線のグリッドを作成する
テキストボックスをグリッドに一致させて、それをExcelおよびCSVファイルとしてエクスポートするために表データを抽出する


<hr>

#pdf2htmlEXも試してみる

写真の切り出しなどなうまくいかなかった。
pdftohtmlよりpdf2htmlEXの方が精度が高いという記事を見つけたのでpdf2htmlEXも試してみる
https://github.com/coolwanglu/pdf2htmlEX

```
brew install pdf2htmlEX
brew install ttfautohint
brew install xpdf
```

unicodeの変換対応表がない場合エラーになってる可能性あり
そもそもuni以外に変換して使えばいいのでは？
http://d.hatena.ne.jp/jeneshicc/20091122
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/736pdffont.html
to unicode
http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/5411.ToUnicode.pdf
mapのキーに自作のクラスを使う

# 環境
VisualStudio2012
Windows7

# やりたいこと
複数の要素からなるキーに応じて何かの値を持ちたい。

```cpp
struct KeyData
{
    std::string name;
    int score;
};
std::map<KeyData, std::string> mp;
mp[getKeyData(0)] = "abcde";
mp[getKeyData(1)] = "qwert";
```

# やり方
簡単に言えば、キーとなるクラスや構造体に **operator<** を定義すればよいだけ。


# コード
```cpp
#include <iostream>
#include <string>
#include <map>
#include <locale>
#include <clocale>
#include <tuple>

namespace
{
    //! キーとなる構造体
    struct KeyData
    {
        //! 名前
        std::wstring name;
        //! ID
        int id;

        //! コンストラクタ
        KeyData()
            : name()
            , id(0)
        {
        }
        //! コンストラクタ
        KeyData
        (
            const std::wstring& name_,
            const int id_
        )
            : name(name_)
            , id(id_)
        {
        }
        //! 比較演算子
        bool operator<(const KeyData& value) const
        {
#if 1
            //! @note コメントでの指摘反映。
            return std::tie(name, id) < std::tie(value.name, value.id);
#else
            if (name < value.name)
            {
                return true;
            }

            if (name == value.name)
            {
                if (id < value.id)
                {
                    return true;
                }
            }

            return false;
#endif
        }
    };

    //! KeyDataをキーにしたマップ
    typedef std::map<KeyData, int> KeyDataMap;

}   // namespace

int main()
{
    std::locale::global(std::locale("japanese"));
    std::setlocale(LC_ALL, "japanese");

    KeyDataMap mp;
    mp[KeyData(L"人間",     0)] =  0;
    mp[KeyData(L"モスラ",   0)] =  1;
    mp[KeyData(L"モスラ",   1)] = 11;
    mp[KeyData(L"人間",     2)] = 22;
    mp[KeyData(L"モスラ",   3)] = 33;
    mp[KeyData(L"ゴジラ",   4)] = 44;

    // 上書き
    mp[KeyData(L"ゴジラ",   4)] = 9999;

    for (auto const &v : mp)
    {
        const auto &key = v.first;
        std::wcout << L"[" << key.name << L"]"
                   << L"(" << key.id   << L")"
                   << L":" << v.second << std::endl;
    }
    
    return 0;
}
```

出力
![bandicam 2017-03-15 14-47-40-351.png](https://qiita-image-store.s3.amazonaws.com/0/119600/ff29e6ad-e5bb-4d16-6ca2-c1387545439e.png)


# 参考
[C++ の STD::MAP のキーに構造体を使う方法と、ハマったこと](http://panda.holy.jp/2014/01/117/)
[setやmapのキーに任意のクラスを渡す](http://qiita.com/izmktr/items/17e3009041b841b26a34)
[優先順位付き大小比較](http://faithandbrave.hateblo.jp/entry/20121210/1355126432)
PowerShellでフォルダ一覧を再帰的にTSVファイルに出力する方法

フォルダ一覧を高速にエクスポートする方法を模索していたところ、PowerShellでの実装にたどり着きました。

＜要件＞
・指定したフォルダを再帰的に探索して、フォルダ一覧を作成したい。
・フォルダ名、フルパス、親フォルダのフルパス、フォルダのサイズと所有者も取得したい。

幾つかの方法を試しましたが、今ところPowerShellでの実行がお手軽で高速でした。
検証環境では、60GBの共有フォルダ（15000フォルダあった）を2分半程度で探索し終わります。

以下の情報を参考にスクリプトを作成しました。
https://technet.microsoft.com/en-us/library/ff730945.aspx

Scripting.FileSystemObject という昔からあるネイティブライブラリを呼び出すことで、
サイズ付きのフォルダ一覧を高速にエクスポートすることができます。

``` code:powershell

$targetRootDirectory="\\sharedserver\foldername"
$filePath = "C:\temp\Export.csv"

$objFSO = New-Object -com  Scripting.FileSystemObject
Get-ChildItem -Path $targetRootDirectory -Recurse -Force | Where-Object {$_.PSIsContainer} | Select-Object @{Name="ParentPath"; Expression = {$(Get-Item -LiteralPath $_.PSParentPath)}},Name,Parent,Exists,Root,FullName,Extension,CreationTime,CreationTimeUtc,LastAccessTime,LastAccessTimeUtc,LastWriteTime,LastWriteTimeUtc,Attributes,@{Name="Length" ; Expression={$objFSO.GetFolder($_.FullName).Size}} |  Export-Csv -Path $filePath -Encoding Default -Delimiter "`t"

```


上記スクリプトの中の、以下の記述がミソで、フォルダサイズも一緒に出力します。
不要でしたら、削除してください。
``
@{Name="Length" ; Expression={$objFSO.GetFolder($_.FullName).Size}}
``

フォルダの所有者も出力したい場合は``@{Name="Owner";Expression={(Get-ACL $_.FullName).Owner}}``も追加してください。

``` code:powershell
$targetRootDirectory="\\sharedserver\foldername"
$filePath = "C:\temp\Export.csv"

$objFSO = New-Object -com  Scripting.FileSystemObject

Get-ChildItem -Path $targetRootDirectory -Recurse -Force | Where-Object {$_.PSIsContainer} | Select-Object @{Name="ParentPath"; Expression = {$(Get-Item -LiteralPath $_.PSParentPath)}},Name,Parent,FullName,LastAccessTime,LastWriteTime,@{Name="Length" ; Expression={$objFSO.GetFolder($_.FullName).Size}} ,@{Name="Owner";Expression={(Get-ACL $_.FullName).Owner}}|  Export-Csv -Path $filePath -Encoding Default -Delimiter "`t"
```

追記：
探索の際にGet-ChilditemにForceオプションを付けていて、隠しフォルダも探索の範囲としている。
スクリプト内で親フォルダのフルパスも取得しているが、
親フォルダがドットで始まる隠しフォルダの場合、この書き方だと空文字が返ってくる。
``@{Name="ParentPath"; Expression = {$(Get-Item -LiteralPath $_.Parent.FullName)}}``

こちらの書き方であれば、取得できる。
``@{Name="ParentPath"; Expression = {$(Split-Path  $_.FullName -Parent)}}``
【JavaScript】ポップアップを自前で作ろう【HTML】

ポップアップもライブラリを使えば、実現できますが
これも自前で実装できるようになりましょう。
ポップアップの外側又はポップアップのcloseボタンをクリックすると閉じるようにしています。

<a href="http://jstech.web.fc2.com/html0002/index.html">こちら</a>からプログラム動かすことができます。(positionがabsoluteになっています)

```html
<!-- レイヤー -->
<div id="layer"></div>
<!-- ポップアップ -->
<div id="popup">
    <div>popup</div>
    <input type="button" id="close" value="close popup">
</div>
```


```css
#layer {
    display: none;  /* 初期表示は非表示 */
    position: fixed; 
    left: 0px;
    top: 0px;
    width: 100%;
    height: 100%;
    background-color: black;
    opacity: 0.20;
}
#popup {
    display: none;  /* 初期表示は非表示 */
    position: fixed; 
    left: 50%;
    top: 50%;
    width: 300px;
    height: 200px;
    margin-left: -150px;
    margin-top: -100px;
    background-color: white;
    border-radius: 5px;
    text-align: center;
}
```


```js
$(function() {
     
    // show popupボタンクリック時の処理
    $('#show').click(function(e) {
        $('#popup, #layer').show();
    });
     
    // レイヤー/ポップアップのcloseボタンクリック時の処理
    $('#close, #layer').click(function(e) {
        $('#popup, #layer').hide();
    });
     
});
```
Rails | rspec の change + have_attributes でレコードが作成されたことを検証する

「レコード数だけ」を検証するより厳密なやり方。

```rb
require 'rails_helper'

RSpec.describe User, type: :model do
  # レコードを作成する(もしくは状態を変更する)何らかの処理
  subject{ -> { User.create(first_name: 'Alice', last_name: 'Lidell') } }

  # レコードが0件から1件に増えたことのテスト
  it { is_expected.to change { User.all.size }.from(0).to(1) }

  # 特定の値でレコードが作成されたことのテスト
  it 'creates record' do
     is_expected
      .to change { User.first }
      .from(nil)
      .to(
         have_attributes(
           first_name: 'Alice',
           last_name: 'Lidell'
         )
       )
  end
end
```

`User.first` を取っているところがイケてないので、もっと良い書き方が出来るかも。

# 結果

```bash
bundle exec rspec -fd spec/models/user_spec.rb
```

```
User
  should change result from 0 to 1
  creates record

Finished in 0.02523 seconds (files took 1.98 seconds to load)
2 examples, 0 failures
```


# 環境

- rspec-rails (3.5.2)









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Galaxy で、ジョブがうまく動かないときに調査するところ

# 概要

Galaxy で、ジョブがうまく動かない
そんなときに調べること

再起動したら同じものが動かないなど

# 結論

1. まずは、エラーになっている、ヒストリで番号が一番若いものを確認
2. そこにエラーがないときは、そのジョブに必要だったデータセットを確認（大抵は何もエラーがないが、メッセージをよく読む ）

# 参考情報

１５でエラーがでているが、このジョブの入力である１３が上手く動かずに、データが正しく生成されたことによる。
（写真では、１４のエラーが開いているが１３も似たようなものだった）

エラーが出たデータセットは、正常におわっているようにみえるが、実際には、エラーがあったようだ。

![Screenshot from 2017-03-15 13-52-51.png](https://qiita-image-store.s3.amazonaws.com/0/82011/991a6fea-49dc-8f18-e027-ba925f44a36c.png)
Python > 可変列の3ファイルを合成して、各行に3項目ずつ出力する実装

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1を使用。
```

関連 [bash > 可変列の3ファイルを合成して、各行に3項目ずつ出力する実装 > 遅い実装と速い実装](http://qiita.com/7of9/items/c96c6c573e68cbedbe61)
のPython実装。

参考 http://stackoverflow.com/questions/7637957/reading-space-separated-input-in-python

```combine_3files_170315.py
#!/usr/bin/env python

with open('out_val_170315') as vfp:
	val = vfp.read()
with open('out_lat_170315') as afp:
	lat = afp.read()
with open('out_lon_170315') as ofp:
	lon = ofp.read()

for elm in zip(val.split(),lat.split(),lon.split()):
	print(elm)
```

bashで処理しても、その後の処理(緯度経度値によるフィルタなど)はPythonの方が楽な気がしてきたのでPythonに変更した。

```txt:結果
$ python combine_3files_170315.py | head
('0.00', '36.07', '131.17')
('0.00', '36.07', '131.29')
('0.00', '36.07', '131.41')
('0.00', '36.07', '131.53')
('0.00', '36.07', '131.65')
('0.00', '36.07', '131.77')
('0.00', '36.07', '131.89')
('0.00', '36.07', '132.01')
('0.00', '36.07', '132.13')
('0.00', '36.07', '132.25')
```
踏み台経由のSSH接続で詰まった話

AWSのVPC内EC2インスタンスに踏み台サーバー経由で接続しようとしたら詰まった話のでメモを残したいと思います。

結論から言うと秘密鍵を解決できていなっただけです。


## やろうとした事

ProxyCommandを使って一発アクセス


### 接続先情報

```
ローカルマシン(Mac)
↓
踏み台サーバー
↓
VPC内インスタンス
```

※踏み台サーバーには秘密鍵置いていません。


### ローカルのssh用設定

#### .ssh/config
```
Host bastion
  User ユーザー名
  Hostname 踏み台サーバーのアドレス
  Port ポート番号
  IdentityFile 秘密鍵のパス

Host instance
  Hostname VPC内インスタンスのアドレス
  ProxyCommand ssh -W %h:%p bastion
```

## 突然の失敗

ここまでやったところで行ける！とsshコマンドを打ちました

```console
$ ssh instance
```

秘密鍵のパスフレーズを求められてパス入力。

しかし、

```
＿人人人人人人人人人人人人人人人人人人＿
＞　Permission denied (publickey)　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣
```

なぜ！？(この後かなりハマる……)

## 原因

踏み台サーバーからVPC内インスタンスに接続するところで、秘密鍵を解決できていないのが原因でした。

```console
$ ssh-add 秘密鍵のパス
```

を実行後に、再度sshコマンド打ったら繋がりました！


## 更に良い解決方法(mac限定)

秘密鍵のパスフレーズをキーチェーンに登録すれば、もう再起動してもパスフレーズ入力を求められることはない

```console
$ ssh-add -K 秘密鍵のパス
```

同じ問題に悩まされた時に読んでいただけると嬉しいですmm
phantomjsで特定部分のキャプチャ取得

phantomjsでウェブページの特定箇所のキャプチャ
取得したい領域の位置（X,Y,縦,横）を取得してキャプチャを取得。
(macであればbrew install phantomjsで簡単にインストール可能)


```sample.js
var page = require('webpage').create();
var clipUrl = 'http://www.****.com/*****';

var imageName = 'capture.png';

page.open(clipUrl, function(status) {
    if (status !== 'success') {
        console.log('Unable to load the address!');
    } else {
    setTimeout(function(){
        var clipRect = page.evaluate(function () { 
            var imageClassName = 'classname';
            // document.querySelector('.viewSide').click();
            // document.querySelector('.changeRandom').click();
            return document.getElementsByClassName(imageClassName)[0].getBoundingClientRect(); 
        });
        page.clipRect = {
            top:    clipRect.top,
            left:   clipRect.left,
            width:  clipRect.width,
            height: clipRect.height
        };
        page.render(imageName);
        phantom.exit();
    },5000);
    }
});
```

後は、ローカルから
phantomjs sample.js

特にsetTimeoutは無くてもよいが、サイトによっては表示がでそろうまでに時間がかかる場合があるため。
（コメント部分はなんらかの画面の部品をクリックした上でデータを取りたい場合に操作）
pygameをUbuntu 16.04で使うと、CPU使用率が100%になる

#症状
Ubuntu 16.04でpygameを使うとCPU使用率が100%になります。

```python:main.py
import time
import pygame

pygame.init()

while True:
    time.sleep(1)
```

何もしていないコードですが、topで確認すると  

``` text:top
top - 13:18:43 up  6:21,  1 user,  load average: 0.78, 0.56, 0.48
Tasks: 329 total,   1 running, 328 sleeping,   0 stopped,   0 zombie
%Cpu(s): 26.0 us,  4.8 sy,  0.6 ni, 68.2 id,  0.4 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 12222916 total,  5867808 free,  3502168 used,  2852940 buff/cache
KiB Swap: 12502012 total, 12502012 free,        0 used.  7608068 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND     
18635 USER     20   0  704956  31568  18668 S  93.8  0.3   0:41.60 python2.7   
 1800 USER     20   0 1251136 113176  64712 S   6.2  0.9   6:27.81 compiz      
    1 root      20   0  119960   6064   3932 S   0.0  0.0   0:03.00 systemd     
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kthreadd    
    3 root      20   0       0      0      0 S   0.0  0.0   0:00.21 ksoftirqd/0 
    5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:+ 
    7 root      20   0       0      0      0 S   0.0  0.0   0:09.43 rcu_sched   
    8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh      
    9 root      rt   0       0      0      0 S   0.0  0.0   0:00.09 migration/0 
   10 root      rt   0       0      0      0 S   0.0  0.0   0:00.04 watchdog/0  
   11 root      rt   0       0      0      0 S   0.0  0.0   0:00.04 watchdog/1  
   12 root      rt   0       0      0      0 S   0.0  0.0   0:00.07 migration/1 
   13 root      20   0       0      0      0 S   0.0  0.0   0:00.20 ksoftirqd/1 
   15 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/1:+ 
   16 root      rt   0       0      0      0 S   0.0  0.0   0:00.04 watchdog/2  
   17 root      rt   0       0      0      0 S   0.0  0.0   0:00.08 migration/2 
   18 root      20   0       0      0      0 S   0.0  0.0   0:00.24 ksoftirqd/2 
```

となり、Pythonがえげつない時間CPUを専有していることがわかります。

環境は以下の通りです。
CPU:Core i3 4005u
Memory:12G
OS:Ubuntu 16.04(LTS)


#調査・原因
どうもpygame.init()が悪さをしているようです。
[pygameのドキュメント](http://westplain.sakuraweb.com/translate/pygame/)によると、pygame.init()は複数のモジュールを一括で初期化する関数のようです。
pygame.[モジュール名].init()で指定したモジュールのみを初期化できます。
というわけで、モジュールを個別に分けて初期化すると、pygame.base.init()を呼び出した直後にCPU使用率が100%になりました。これが原因かな？



#対策
pygame.init()と書かずに、初期化が必要なモジュールがあればpygame.[モジュール名].init()で初期化するようにしました。幸いなことにpygame.baseは初期化しなくてもエラーにならないようなので、とりあえずはこれで解決しました。
スワイプ直後のタップ禁止


主にiOSでスワイプの慣性が終わりきらないうちに、
スワイプ前にボタンがあった位置を再度タップすると、
ボタンが反応してしまうというバグの対策。

スワイプ直後に要素を押せないようにするために、
y方向に30px以上スワイプした場合、
500msの間ダミーの要素を全体にかぶせるというコード。

デモ：http://codepen.io/mo4_9/pen/JWywYy

```javascript:banTapJustAfterSwipe.js
import $ from 'jquery';

// スワイプ直後のタップ禁止
export function banTapJustAfterSwipe() {
  
  let touchStartX, touchStartY,
      touchMoveX, touchMoveY;
  let moveDistY = 0;

  let timer;
  let isMoving = false;

  const $cover = $('.swipe--cover');
  $cover.hide()

  window.addEventListener("touchstart", (event) => {
    touchStartX = event.touches[0].pageX;
    touchStartY = event.touches[0].pageY;
    // console.log("touchstart");
  }, true);

  window.addEventListener("touchmove", (event) => {
    touchMoveX = event.changedTouches[0].pageX;
    touchMoveY = event.changedTouches[0].pageY;
    // console.log("touchmove");
    isMoving = true;
  }, true);

  window.addEventListener("touchend", (event) => {
    // console.log("touchend", isMoving, touchStartY, touchMoveY, moveDistY);
    // タップの場合（touchmoveが発火しない）
    // touchendが発火してからも慣性がかかり進んでしまうのを調整
    if (!isMoving) touchMoveY = touchStartY;
    moveDistY = Math.abs(touchStartY - touchMoveY);
    if (moveDistY > 30) {
      $cover.show();
      clearTimeout(timer);
      timer = setTimeout(() => {
        $cover.hide();
      }, 500);
    }
    isMoving = false;
  }, true);

}
```

> 参考
[【JavaScript】スマホやタブレットでのスワイプ・フリック動作を取得する方法](http://www.hp-stylelink.com/news/2014/06/20140617.php)
Unityで曲線を描いてターゲットに進むお話し(n番煎じ)

こんにちは。unityで手軽にスクリプトを使って曲線を描いて追尾できないかと考えて実装してみました。僕は15ドルするアセットを持っていたのですが、結局似たようなもんができてしまいました（向こうのほうが確実にリアルだし損はなかった...はず）
#パターン１
```c#:sample.cs
  public void HogemoveTowards()
    {  
　　　  Target=GameObject.Find("hogefuga");　//hogegugaに飛んでいくよ
        float speed=1.0f;
        float stepFloat=0;
        stepFloat = Time.deltaTime * speed;
        transform.position = Vector3.MoveTowards(transform.position, Target.transform.position, stepFloat);
    }
```
Vector3.MoveTowardsを使って実装してみました。動きはなめらかで、スピード調整もある程度スピードの係数を大きくしても遅めの動きなので細かい調整がしやすいです。活用度の高さはこっちのほうがありそうです。
#パターン2
```csharp:sample2.cs
 public void Hogeslerp()
    {
        Target=GameObject.Find("hogefuga");
　　　　 float speed=1.0f;
        var vec = Vector3.Slerp(transform.position, Target.transform.position, Time.deltaTime * speed);
        transform.LookAt(vec);
        transform.position = vec;
    }
```
こちらはSlerpを使って球形補間型にしてみました。動きの軌道は一緒ですが、係数が小さくても動きが速いです。ホーミング弾を実装するのには最適かもしれません。
#パターン３：クオータニオンで向きを補正する
```c#:sample3.cs
public void HogeQuaternion(){
  float Setter=1f;//調整して
  Target=GameObject.Find("hogefuga");
  float stepFloat=0;
  float speed=1;
  stepFloat = Time.deltaTime * 1f;
  transform.position = Vector3.MoveTowards(transform.position, Target.transform.position, stepFloat);  
  transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.LookRotation(Target.transform.position - transform.position), Time.deltaTime *Setter);
  Vector3 front = transform.TransformDirection(Vector3.forward);
  this.GetComponent<Rigidbody>().AddForce(front*speed,ForceMode.VelocityChange);
}
```
MoveTowardsと合わせて使うといい感じにターゲットの方を向いて動いてくれます。クオータニオンでターゲットと動くオブジェクトの間を補間できるので便利ですね。Slerpでも動くはずです

#実装例

```c#:hoge.cs
using UnityEngine;
using System.Collections;



public class HogeHoge : MonoBehaviour
{
    void Update()
    {
            if (Input.GetMouseButton(1))
            {
                Hoge();
            }
        }
    }
    public void Hoge()
    {
       //パターン１か２か３
    }
}
```
マウス入力で呼び出せるようにしてみました。私の環境だとこれで無事に動きます。
#注意点など
この実装はただちょっと曲がってターゲットに行くだけです。もっとより自由自在に曲がるポイントを設定したい場合は、ベジェ曲線などを用いて複雑なものを書く必要があります。誰か強い人ベジェ曲線使って追尾システム作ってほしいなぁ（チラッチラッ
Qiitaの記事にクリップボードの画像を張り付ける(魔法でアップロードする！)。この記事を見た人は1万円払ってくださいね！

<div align="center">
  <a href="http://bit.ly/cyginst"><img width="426" height="67" src="https://raw.githubusercontent.com/javacommons/qiita/master/jc-banner-2017-0419-0240.gif" /></a>
</div>

<hr />

Qiitaにスクリーンショットを張り付けながら記事を書くのって結構面倒ですよね。(他の環境では試してませんが)Windows10とFirefoxを使えば簡単にスクショやクリップボードにコピーされた画像を記事に挿入できます。

* 追記: Windows10とGoogle Chromeでもできました。

# 操作手順

ALT+[プリントスクリーンボタン]を押します。クリップボードに現在アクティブなウィンドウのスクリーンショットが格納されます。(ALTを押さないでデスクトップ全体をクリップボードにコピーしたり、その他の方法で画像をクリップボードにコピーしてもかまいません)

その後、Firefoxをアクティブにして、Qiitaの記事編集画面を表示し、以下のように画像を挿入したい場所にカーソルを移動します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/7c7afa26-8801-02b3-7657-bc2c81c137b2.png)

キーボードから「Ctrl-V」を押します。画像ファイルに保存したり、画像ファイルを選択することなく、クリップボード内の画像がアップロードされ記事に張り付けられます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140610/64414d7c-3155-23ff-11e9-3d8f6ee91047.png)

後は、記事を書いて投稿するだけです。
尚、1記事中で何回でも張り付けできます。

# 動作確認済み環境

* Windows10 64bit
* Firefox or Google Chrome

# 最後に

Google Slides 等でも同様のことができますが、どういう仕組みでこれが実現されているのかさっぱりわかりません！・・・が、スクショを取りながら(徒然なるままに)説明・解説を書いていく時には便利でしょう！

# 支払いについて

* この記事は「1万円払う価値がある」のですが、私からあなたに「1万円差し上げます」！
* なので、差し引き０でお金は振り込まなくてかまいません。

# 参考(スクリーンショットについて)

* この記事のスクリーンショットは「[Screenpresso](https://goo.gl/66wA5x)」というソフトを使って撮りました。(参考記事 ⇒ [機能はSkitch超え！画像に美しい注釈を加えられる「Screenpresso」がスゴい](https://goo.gl/66wA5x)) [※](https://goo.gl/#analytics/goo.gl/66wA5x/all_time)

<table height="400" width="600"><tr><td>
😲<b>セーラームーン / ムーンライト伝説 (ユーロビート)ver.</b>
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">セーラームーン / ムーンライト伝説 (ユーロビート)ver.<a href="https://t.co/o91qCKNtAW">https://t.co/o91qCKNtAW</a></p>&mdash; JavaCommons (@javacommons) <a href="https://twitter.com/javacommons/status/849831235933224960">2017年4月6日</a></blockquote>
</td></tr></table>

```
    2017/03/19 417views
    2017/03/17 367views
```
Laravel5.4でマルチ認証

##概要
基本的にhttp://dog-ears.net/laravel/160523/ の方の記事の内容でマルチ認証を実装可能です
 * adminのテーブル、モデル追加
 * config/auth.php にadminを追加
 * コントローラ、ビューのAuthをAdminAuthをコピー
 * コピーしたファイルの修正

ただし、5.3もしくは5.4の場合Laravel5.2から5.3にかけてauth周りのファイル構成等が変わっているので
追加設定を記載します。

## ルーティングの設定

routes/web.phpに以下を追加

```app/routes/web.php
$this->get('admin/login', 'AdminAuth\LoginController@showLoginForm')->name('admin.login');
$this->post('admin/login', 'AdminAuth\LoginController@login');
$this->post('admin/logout', 'AdminAuth\LoginController@logout')->name('admin.logout');
// Registration Routes...
$this->get('admin/register', 'AdminAuth\RegisterController@showRegistrationForm')->name('admin.register');
$this->post('admin/register', 'AdminAuth\RegisterController@register');
// Password Reset Routes...
$this->post('admin/password/email', 'AdminAuth\ForgotPasswordController@sendResetLinkEmail')->name('admin.password.email');
$this->get('admin/password/reset', 'AdminAuth\ForgotPasswordController@showLinkRequestForm')->name('admin.password.request');
$this->post('admin/password/reset', 'AdminAuth\ResetPasswordController@reset');
$this->get('admin/password/reset/{token}', 'AdminAuth\ResetPasswordController@showResetForm')->name('admin.password.reset');
```

## コントローラの設定

新規に作ったadmin用のcontrollerの設定はメンバ変数ではなくメソッドのオーバーライドで設定

LoginController.phpに以下のメソッドを追加

```app/Http/Controllers/AdminAuth/LoginController.php
    public function showLoginForm()
    {
        return view('adminAuth.login');
    }
    protected function guard()
    {
        return \Auth::guard('admin');
    }
    public function logout(Request $request)
    {
        $this->guard()->logout();
        $request->session()->flush();
        $request->session()->regenerate();

        return redirect('/admin/login');
    }
```

RegisterController.phpに以下のメソッドを追加

```app/Http/Controllers/AdminAuth/RegisterController.php
    public function showRegistrationForm()
    {
        return view('adminAuth.register');
    }
    protected function guard()
    {
        return \Auth::guard('admin');
    }
```

ResetPasswordController.phpに以下のメソッドを追加

```app/Http/Controllers/AdminAuth/ResetPasswordController.php
    protected function guard()
    {
        return \Auth::guard('admin');
    }
    public function broker()
    {
        return \Password::broker('admins');
    }
```

ForgotPasswordController.phpに以下のメソッドを追加

```app/Http/Controllers/AdminAuth/ForgotPasswordController.php
    public function showLinkRequestForm()
    {
        return view('adminAuth.passwords.email');
    }
    public function broker()
    {
        return \Password::broker('admin');
    }
```

## ミドルウェアの設定
例外ファイルのunauthenticatedメソッドの修正

```app/Exceptions/Handler.php
    protected function unauthenticated($request, AuthenticationException $exception)
    {
        if ($request->expectsJson()) {
            return response()->json(['error' => 'Unauthenticated.'], 401);
        }
+        if(in_array('admin',$exception->guards()))
+            return redirect()->guest('admin/login');

        return redirect()->guest('login');
    }
```

参考
http://takayukii.me/post/20160914887
scala-nativeでファイル読み込み

scala-native(0.1)で一行だけ読み込んでみる。
あってるのか微妙・・・。

環境: mac osx yosemite

```scala
package main

import scalanative.native._;

object Main {
    def main(args: Array[String]): Unit = {
      println(s"Hello ${readOneLine} .")
    }
    def readOneLine(): String  = stdio.fopen(c"hoge.txt", c"r") match {
      case null => ""
      case fp => {
        val buf = stackalloc[Byte](256)
        stdio.fgets(buf, 256, fp)
        stdio.fclose(fp)

        buf(string.strlen(buf)-1) = '\0'
        fromCString(buf.asInstanceOf[CString])
      }
    }
}

```
scalaなのにnull。
otoolで共有関係を見てみる。

```bash
$ otool -L ./target/scala-2.11/hoge-out

./target/scala-2.11/hoge-out:
        /usr/local/opt/bdw-gc/lib/libgc.1.dylib (compatibility version 2.0.0, current version 2.3.0)
        /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 120.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
```

なんかそれっぽい。


## 0.2バージョン 追記

0.2が出たみたいなので、更新してみました。
File I/O APIがサポートされたようですよ。

```scala

package main

import scalanative.native._

import java.io.FileReader
import java.io.BufferedReader

import scala.io.Source

object Main {
    def main(args: Array[String]): Unit = {
      println(s"Hello ${readOneLineByFileReader} .")
      println(s"Hello ${readOneLineBySource} .")
    }

    def readOneLineByFileReader(): String = {
      val br = new BufferedReader(new FileReader("hoge.txt"));
      br.readLine()
    }

    def readOneLineBySource(): String = Source.fromFile("hoge.txt").getLines.toList.head
}
```

コンパイル時にエラーが表示されたので、正規表現用のライブラリ？`brew install re2`を
いれてあげたら、コンパイルできました。

↓コンソール

```
$ brew install re2
<略>

$ cat hoge.txt
1 a
2 b
3 c

$ sbt run
<略>
[info] Compiling to native code (2250 ms)
[info] Linking native code (336 ms)

Hello 1 a .
Hello 1 a .

$ otool -L target/scala-2.11/hoge-out
target/scala-2.11/hoge-out:
        /usr/local/opt/bdw-gc/lib/libgc.1.dylib (compatibility version 2.0.0, current version 2.3.0)
        /usr/local/opt/re2/lib/libre2.0.dylib (compatibility version 0.0.0, current version 0.0.0)
        /usr/local/opt/llvm/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0)
        /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
        /usr/lib/libc++abi.dylib (compatibility version 1.0.0, current version 125.0.0)
```