OmniAICreator/Qiita-1.07M huggingface dataset:
dokku-altとheroku-buildpackで捗る社内サービス開発(Linuxパッケージ依存編)

# 事の経緯
1. 社内サービス開発！PHPで！出来によってはサービス化も！？どんなサーバーでも動くようによろしく！
2. 社長！Imagickのみだとリソースやばいです！[（前回参照）](http://qiita.com/aozora0000/items/b6124c33848b3cf737c8)
3. aptパッケージなら何とか実用に耐えられる速度・・・、レンタルサーバー等は諦めよう。
4. ただデプロイも簡単にしたいしお金掛けたくないし、複数アプリを１台で簡単に賄えるようにしたいし、人的依存や管理コストも問題。
5. dokku-altで何とかならんのか・・・？
6. ~~なんとかなりました。~~なりませんでした。
7. dokku-altからdokkuに変更しました。(なんとかなりました)

# 追加
- 2016/04/09
 - .envにtesseract-ocr用データを追記
 - Aptfileにtesseract-ocr用日本語・英語ライブラリを追加

# dokkuのインストール等々、参考サイト
- http://dokku.viewdocs.io/dokku/installation/

# ~~dokku-altのインストール等々、参考サイト~~
- http://knowledge.sakura.ad.jp/tech/2545/
- http://freedom-man.com/blog/dokku-alternative/
- http://kray.jp/blog/dokku-alternative/

# 準備
```.bash
// laravelインストール
composer create-project laravel/laravel sampleapp --prefer-dist
cd sampleapp

// PHPのExtensionパッケージはここで指定出来る
// 参照: https://devcenter.heroku.com/articles/php-support#extensions
vi composer.json
~略~
"require": {
    ~略~
    "ext-imagick": "*",
    ~略~
}

// おまじない
echo "WAIT=5" > CHECKS

// nginx起動用のconf指定
vi Procfile
web: vendor/bin/heroku-php-nginx -C nginx_app.conf public/

// tesseract-ocr用のライブラリ場所を指定
vi .env
TESSDATA_PREFIX=/app/.apt/usr/share/tesseract-ocr

// nginxのconf(locationのみでいい？)
vi nginx_app.conf
location / {
    try_files $uri @rewriteapp;
}

location @rewriteapp {
    rewrite ^(.*)$ /index.php/$1 last;
}
```

# buildpackを指定する
```
// .envにビルドパックのURLを指定する。今回は複数のビルドパックを使いたいのでbuildpack-multiを指定
echo "BUILDPACK_URL=https://github.com/ddollar/heroku-buildpack-multi" >> .env

// 利用するビルドパック群を指定する
vi .buildpacks
https://github.com/ddollar/heroku-buildpack-apt
https://github.com/aozora0000/heroku-buildpack-php-custom // 自分でカスタムしたのも指定出来る

// heroku-buildpack-aptでインストールするaptパッケージを指定
vi Aptfile
tesseract-ocr
tesseract-ocr-jpn
tesseract-ocr-eng
poppler-utils
```

# デプロイ
あとは何時も通り、commitしてから、```git remote add dokku dokku@dokku.local:sampleapp```するだけ。

# aptパッケージの行方
コンテナ内に入って```which pdfimages```してみると、```/app/.apt/usr/bin/pdfimages```にありました。
コンテナ内でパスは通っているので大丈夫だと思いますが、絶対パス指定したい場合はこの辺りを指定してあげるといいかもです。

# dokku-altアプリの開発中の問題
- ubuntu14.04+dokku-alt in virtualboxだと、docker周りが安定しない
 - ```Error response from daemon: Cannot start container cb4bcaa009ff8f039215ff9d3631fe37293dbcec41b3764051b347a8f69c7450: Error getting container cb4bcaa009ff8f039215ff9d3631fe37293dbcec41b3764051b347a8f69c7450 from driver devicemapper: Error mounting '/dev/mapper/docker-8:1-268031-cb4bcaa009ff8f039215ff9d3631fe37293dbcec41b3764051b347a8f69c7450' on '/var/lib/docker/devicemapper/mnt/cb4bcaa009ff8f039215ff9d3631fe37293dbcec41b3764051b347a8f69c7450': no such file or directory```
 - こんなん出てデプロイ落ちる。
 - 一応dokkuサーバーにログインして```dokku delete sampleapp```後に再度pushすると戻る、が手間
 - **dokku-altからdokkuに変更すると出なくなった！**
- ```vagrant halt && vagrant up```したら、dokkuユーザーからdocker繋がらない
 - ```sudo su -```でrootに入った後、```usermod -G docker dokku```すると繋がった。
 - 初めてだとコケがちだと思うので公式対応して欲しいな・・・
- composer.lockを.gitignoreに入れると死ぬ。
- heroku/heroku-buildpack-phpのcedir-14.Dockerfileとは何だったのか・・・
inputタグの「type="image"」の挙動

inputタグの type="image" のことを今更知ったので、メモります。

以下のようなHTMLがあるとします。

```
<input type="image" name="image" src="画像のパス">
```

これにより、指定した画像パスの画像の送信ボタンが出来上がるのですが、以下のような二つのパラメーターが入ります。

```
?image_x=3&image_y=15
```

これは何かと言うと、画像ボタンのクリック時のx,y座標です。

今更知りました。

短いですが、以上です。
Node.js+Express経由でSQLite3にデータ登録する

前回、Node.jsのインストールを実施しました。
[CentOS7.2にNode.js環境を構築する](http://qiita.com/kaikusakari/items/2088dcd9d51766af73a3)

今回は、フレームワークであるExpressと、SQLite3を導入していきます。

**Expressの導入**

```sh
[am@Alnilam ~]$ npm install express
```

**テスト用アプリを作る**

```js:test.js
let server = require('express')();
server.get('/', function(req, res){
  res.send('This is Anfield.');
});
server.listen(3000);
```

**起動**

```sh
node test.js
```

**ブラウザでアクセスする**
![res.png](https://qiita-image-store.s3.amazonaws.com/0/110457/bbee9cd3-7f4f-4485-6a4c-d53f0ef57ac2.png)

Expressのインストールは終わったので、SQLiteを導入します。
1台の貧弱なサーバにNode.js、DBなどすべて含む構成であるため
SQLiteを選択します。

**インストール**

```sh
[root@Alnilam ~]$ yum install sqlite
[am@Alnilam ~]$ npm install sqlite3
[am@Alnilam ~]$ sqlite3 -version
3.7.17 2013-05-20
```

インストールが終わったので、早速使ってみます。

**ドライバのサンプルを動かす**
[参考ページ](http://expressjs.com/ja/guide/database-integration.html#sqlite)

```js
var sqlite3 = require('sqlite3').verbose();
var db = new sqlite3.Database('sample');
db.serialize(function() {
  db.run('CREATE TABLE lorem (info TEXT)');
  var stmt = db.prepare('INSERT INTO lorem VALUES (?)');
  for (var i = 0; i < 10; i++) {
    stmt.run('Ipsum ' + i);
  }
  stmt.finalize();
  db.each('SELECT rowid AS id, info FROM lorem', function(err, row) {
    console.log(row.id + ': ' + row.info);
  });
});
db.close();
```

**実行**

```sh
[am@Alnilam ~]$ node testsqlite.js
1: Ipsum 0
2: Ipsum 1
3: Ipsum 2
4: Ipsum 3
5: Ipsum 4
6: Ipsum 5
7: Ipsum 6
8: Ipsum 7
9: Ipsum 8
10: Ipsum 9
```

**SQLiteの確認**

```sh
[am@Alnilam ~]$ sqlite3 sample
sqlite> .header on
sqlite> .mode column
sqlite> .table
sqlite> select * from lorem;
info      
----------
Ipsum 0   
Ipsum 1   
Ipsum 2   
Ipsum 3   
Ipsum 4   
Ipsum 5   
Ipsum 6   
Ipsum 7   
Ipsum 8   
Ipsum 9 
```

登録できました。次回こそ、簡単なAPIを作成したいと存じます。
Elixir入門（２）

勉強したことをほぼ写経するだけ

# Number

```
iex> int = 1234
1234
iex> hex = 0x12ab
4779
iex> oct = 0o127
87
iex> bin = 0b1010
10
iex> million = 1_000_000
1000000

iex> num1 = 1.0
1.0
iex> num2 = 0.1
0.1
# 小数点の前後に数字は必須
iex> num3 = .1
** (SyntaxError) iex:52: syntax error before: '.'
iex> num4 = 0.314e1
3.14
iex> num6 = 314.0e-2
3.14
# 指数の場合は小数点表記が必須
iex> num5 = 314e-2
** (SyntaxError) iex:53: syntax error before: e
```

# Atom

```
# 英数字, "_", "@"はOK
# 末尾が"!", "?"はOK
# ダブルクォートで囲めばそれ以外の文字もOK
iex> :hoge
:hoge
iex> :is_deleted?
:is_deleted?
iex> :delete!
:delete!
iex> :aa!bb
** (SyntaxError) iex:64: syntax error before: bb
iex> :hoge@
:hoge@
iex> :hoge@2
:hoge@2
iex> :=
:=
iex> :"hoge fuga"
:"hoge fuga"
iex> :"call/2"
:"call/2"
```

# Range

```
iex> 1..4
1..4
iex> "a".."z"
** (ArgumentError) ranges (first..last) expect both sides to be integers, got: "a".."z"
```

# Regular Expression

```
# ~r/regexp/
# デリミタは、英数字以外であれば使える
iex> Regex.scan ~r/[aiueo]/i, "cAterpillar"
[["A"], ["e"], ["i"], ["a"]]
iex> Regex.scan ~r{[aiueo]}i, "cAterpillar"
[["A"], ["e"], ["i"], ["a"]]
```

# Tuple

Tips: 要素が４つを超える場合は、Mapなどを使うべき

```
iex> {status, count, action} = {:ok, 42, "next"}
{:ok, 42, "next"}
iex> status
:ok
iex> count
42
iex> action
"next"

iex> {status, file} = File.open("hoge.txt")
{:error, :enoent}
iex> status
:error
iex> file
:enoent
iex> {status, file} = File.open("hoge.txt")
{:ok, #PID<0.63.0>}
iex> status
:ok
iex> file
#PID<0.63.0>
```

# List

```
iex> [1, 2, 3]
[1, 2, 3]
iex> [1, 2, 3] ++ [4, 5, 6]
[1, 2, 3, 4, 5, 6]
iex> [1, 2, 3] + [4, 5, 6]
** (ArithmeticError) bad argument in arithmetic expression
iex> [1, 2, 3, 4] -- [2, 4]
[1, 3]
iex> [1, 2, 3, 4] - [2, 4]
** (ArithmeticError) bad argument in arithmetic expression
iex> 1 in [1, 2, 3, 4]
true
iex> 5 in [1, 2, 3, 4]
false
```

# Keyword List

```
iex> [name: "hoge", age: 10, birthday: "2015-01-01"]
[name: "hoge", age: 10, birthday: "2015-01-01"]
# tupleを使った表現でも同じ結果になる
iex> [{:name, "hoge"}, {:age, 10}, {:birthday, "2015-01-01"}]
[name: "hoge", age: 10, birthday: "2015-01-01"]
iex> [1, name: "hoge", text: "fuga"]
[1, {:name, "hoge"}, {:text, "fuga"}]
iex> {1, name: "hoge", text: "fuga"}
{1, [name: "hoge", text: "fuga"]}
```

# Map

```
iex> %{"name" => "hoge", "age" => 10}
%{"age" => 10, "name" => "hoge"}
iex> %{name: "hoge", age: 10}
%{age: 10, name: "hoge"}
# keyのtypeは一緒である必要はない
iex> %{"one" => 1, :two => 2, {1, 2, 3} => 3, [1, 2, 3] => 4}
%{:two => 2, {1, 2, 3} => 3, [1, 2, 3] => 4, "one" => 1}

iex> map = %{"name" => "hoge", "age" => 10}
%{"age" => 10, "name" => "hoge"}
iex> map["age"]
10
iex> map["hoge"]
nil

# keyがatomの場合は、"."でアクセス可能
# ただし、keyが存在しない場合はエラー
iex> map = %{name: "hoge", age: 10}
%{age: 10, name: "hoge"}
iex> map.name
"hoge"
iex> map.hoge
** (KeyError) key :hoge not found in: %{age: 10, name: "hoge"}
```
ASP.NET Web サイトプロジェクトでも NDoc を作る

## 結論

C:\Users\アナタ\AppData\Local\Temp\Temporary ASP.NET Files の中にプロジェクトのフォルダがあり、デバッグ実行などで一時ファイルが作られます。
その中のどこかに XML ファイルがあるので、これを源泉として Sandcastle Help File Builder（以下 SHFB） からヘルプが作ることができました。

## 経緯

自分としては Web アプリよりも Web サイトの方が開発・保守がしやすいのでそれを使っていたのですが、コメントの XML ファイルが吐き出されないので Sandcastle（SHFB）などは使えず悶々としていました。

以下のサイトを見て Web.config にも手を入れてみましたが~~効果がありません。~~
※ （追記）すみません。やっぱり web.config に「compilerOptions="/doc+"」を書き加えないと上記の一時ファイル置き場に XML ファイルは出力されませんでした。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=34813&forum=7


何度も調べて何度もあきらめたのですが、未練を捨てきれず...。

やがて「タイプヒンティングができているのだから一時ファイルが作られているはず」と思い至り、Visual Studio の一時ファイル置き場を探して SHFB に食わせてみたらビンゴ。

## 免責
Visual Studio 2008 + Windows 7 での話です。他のバージョンでは同様の方法が使えるのか、一時ファイルの置き場所は同じなのか、などわかりません。

## 終わりに
- 長年の懸案が解消されてすっきりしました。
- 需要が少ないんでしょうかね？
Jenkins 利用可能な次のエグゼキュータ―を待っています の状態からビルドが実行されない


# 経緯

とある事情で、jenkinsを別サーバにバックアップ(/var/lib/jenkins配下すべて)しておいたデータからリストアすることになった。
データを丸ごと持ってきてもうまく動作しなかった為、以下復旧までの対処方法を書きます。

# 環境

Centos7.1 x86_64
Jenkins Ver 1.656

## はまったところ

手動でビルド実行するとうまくいく場合もあるが、概ねビルド実行をクリックしても何も反応しない。
裏では、/var/log/jenkins/jenkins.logで後で書くエラーがでていた。

定期実行でビルド実行しているが、何10分たっても実行されず、、
終いに下記エラーで止まる

```
pending - 利用可能な次のエグゼキュータ―を待っています
```

解決方法として、ビルド履歴を削除し、その後jenkinsを再起動する必要がある

## 移行後、ビルド実行時に/var/log/jenkins/jenkins.logに下記エラーが出力されるようになった

### error内容

```
重大: Unexpected executor death
java.lang.IllegalStateException: cannot create a build with number 10625 since that (or higher) is already in use among [10614, 24093, 24094, 24095, 24096, 24097, 24098, 24099, 24100, 24101, 24102, 24103, 24104, 24105, 24106, 

<snip>

26098, 26099, 26100, 26101, 26102, 26103, 26104, 26105, 26106, 26107, 26108]
        at jenkins.model.lazy.AbstractLazyLoadRunMap.proposeNewNumber(AbstractLazyLoadRunMap.java:373)
        at hudson.model.RunMap.put(RunMap.java:191)
        at jenkins.model.lazy.LazyBuildMixIn.newBuild(LazyBuildMixIn.java:176)
        at hudson.model.AbstractProject.newBuild(AbstractProject.java:1018)
        at hudson.model.AbstractProject.createExecutable(AbstractProject.java:1209)
        at hudson.model.AbstractProject.createExecutable(AbstractProject.java:144)
        at hudson.model.Executor$1.call(Executor.java:364)
        at hudson.model.Executor$1.call(Executor.java:346)
        at hudson.model.Queue._withLock(Queue.java:1371)
        at hudson.model.Queue.withLock(Queue.java:1232)
        at hudson.model.Executor.run(Executor.java:346)

4 08, 2016 6:57:13 午後 hudson.model.Run execute
```

# 解決手順

## jenkinsのホームディレクトリは、/var/lib/jenkinsの場合です

#### プロジェクト毎すべてのbuildsディレクトリを削除する
```
# rm -rf /var/lib/jenkins/jobs/*/builds
```

#### 削除されたか確認

```
# ls -lad /var/lib/jenkins/jobs/*/builds
ls: /var/lib/jenkins/jobs/*/builds にアクセスできません: そのようなファイルやディレクトリはありません
```

#### 次回、ビルド番号が1から始まるように上書き

```
# for i in `ls /var/lib/jenkins/jobs/*/nextBuildNumber` ; do echo "1" > $i ;
done
```

#### すべて1か確認

```
# cat /var/lib/jenkins/jobs/*/nextBuildNumber
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
```

#### 最後に、jenkinsプロセス再起動

```
/etc/init.d/jenkins restart
```

## 他の考えられる原因

### ノードがオフラインになっている

「Jenkins の管理」> 「ノードの管理」でオフラインになっていないノードがないか確認

### DISK空き容量不足

Jenkinsが搭載されているサーバのDISK容量(もしくはinode)が枯渇している場合

jenkinsを定期実行して、しばらくすると失敗するようになり、調べたらまさかのinode枯渇。。
ビルド履歴を一定期間で削除するよう設定しないとダメです。

ジョブ毎の設定>古いビルドの破棄にチェック
ビルドの保存日数、ビルドの保存最大数が設定可能です。

以上
Google Calendar の予定をテキスト化

## カレンダーをテキスト化したいよね

Google カレンダーをはじめとするツールは、コピペビリティが悪い。
メールに「今週一週間の予定」を貼り付けるのがまず難しい。

じゃぁってことで、DOMスクレイピングをしてみる。

以下のJavaScriptのコードを、Chromeのコンソールに貼り付ければ、別のウィンドウ（もしくはタブ）に、今週の予定がテキストとして出力される。

## JavaScriptソース

```js
(function(){
var days = document.querySelectorAll('.wk-daynames th');
var tdCols = document.querySelectorAll('.tg-col,.tg-col-today');
var ary = [];
for(var i=0;i<7;i++){ary.push(days[i].textContent + ' : ' + tdCols[i].textContent);}
var w = window.open('about:blank');
var t = w.document.createElement('textarea');
t.style.width='100%';
t.style.height='100%';
t.value=ary.join("\n");
w.document.body.appendChild(t);
t.focus();t.select();
})();
```

こういう予定の画面のChromeコンソールで実行すると
![スクリーンショット 2016-04-09 13.50.30.png](https://qiita-image-store.s3.amazonaws.com/0/53489/e5027eaa-e32a-fb90-3507-f7f32ee39f0d.png)

こういう出力結果になる
![スクリーンショット 2016-04-09 13.53.46.png](https://qiita-image-store.s3.amazonaws.com/0/53489/12fc7bf7-ca96-0e6c-836d-f97b28faa723.png)

出力してなお、全選択してコピペの準備まで促すという親切さ。

「週次モード」でないと動かないが、こういう感じで、querySelectorAllメソッドを使うと、CSSセレクタで、ノードリストが取得できるから、あとは欲しい深さまで降りていって、textContentプロパティを取得すればオッケー。
Electron の IPC と Node.js の IPC はどちらが速いのか

## 概要

UI の動きやユーザの操作を妨げないためには処理を非同期に行う必要があります．特に CPU 負荷が大きい処理は別のコアで処理させるために別スレッドでやらせます．しかし JavaScript はマルチスレッドで動かないため，こういったユースケースでは別プロセスに重い処理を任せます．
この時，ほぼ必要になるのがプロセス間通信（IPC）です．Electron アプリでは基本的に2種類の IPC が使えます．

1. Electron アプリではほとんどがレンダラプロセスで処理される．なので手の空いているメインプロセスを使って，Electron の IPC API で通信する．
2. レンダラプロセスから `child_process.fork()` で新しいプロセスを起こし，`send()` や `'message'` イベントで通信する Node.js の IPC

どちらのほうが良いのかを知りたかったので試してみました．

今回のコードは全て下記のリポジトリにあるので，ここには必要な情報だけ書きます．

https://github.com/rhysd/electron-ipc-vs-nodejs-ipc

## テスト環境

- OS X
  - MacBook Pro 2015 Mid
  - CPU: 2.7 GHz Intel Core i5
  - Memory: 8 GB 1867 MHz DDR3
  - Node.js 5.10.1
  - Electron 0.37.4

## テスト内容

1. **大きめのオブジェクト** 送信側から受信側に1ツイート分のオブジェクトを98回順番に送信し，1回の送信とその ACK にかかった時間を調べます
2. **小さめのオブジェクト** 送信側から受信側に整数1つを98回順番に送信し，1回の送信とその ACK にかかった時間を調べます

それぞれを Node.js と Electron それぞれの API で10回ずつ行います．

## 結果

送信にかかった平均時間と，データをざっと見た感じかかる時間の振れ幅が結構大きかったので分散も出しました．

### 平均時間 [ns]

|       | Node.js           | Electron           |
|-------|-------------------|--------------------|
| Large | 938029.1246169561 | 779345.2921348314  |
| Small | 832760.226762002  | 406117.63636363635 |

### 分散 [ns^2]

|       | Node.js        | Electron     |
|-------|----------------|--------------|
| Large | 45081610954226 | 110908047760 |
| Small | 43818214306282 | 72026021464  |

比較するとツイート1つ分程度までなら Electron の IPC のほうが優秀です．また，小さいデータ（整数1つ分）については Electron のほうが倍近い速いです．
ただ，Electron の IPC は送信サイズが大きくなると性能が悪化するとのことなので，これよりさらに大きいオブジェクトになると逆転するかもしれません．

また，この程度の差なら別の要素で決めてしまって良いかもしれません（すでにメインプロセスが動いてるからそっちを使いたいや，2つ以上動かして死活管理したいから Node.js IPC 使いたい，そもそもレンダラプロセスを fork するのはメモリ使用量とか的にどうなのなど）．ヘビーに使う人でなければそんなに気にする必要は無さそうです．
Xamarin for Visual Studioに必要なAndroid SDK関連をセットアップする

# はじめに
Visual Studioに無料で追加されたことで、今Xamarinは一躍注目を集めています。
特にAndroid SDKは必要な設定事項が多く、しかもインストーラにしたがってインストールすると、Xamarin.Formsがビルドできないという地雷が存在します。

本エントリーでは、「Androidなんて初めてやります！」な人向けに、Android SDK周りの設定方法を図解付きで解説します。

なおXamarinのスタートアップ時にハマりそうなトラブルのQAを以下にまとめていますので、良かったら参考にしてください。
> Xamarin for Visual Studio スタートアップ トラブルQA集
> [http://nuits.hatenadiary.jp/entry/2016/04/07/215641](http://nuits.hatenadiary.jp/entry/2016/04/07/215641)

# 前提条件

* 既にAndroid SDK自体はインストールされていること
* Visual StudioにAndroid SDKが紐づけされていること

# 設定手順

まずはVisual Studioを起動してください。

![SnapCrab_No-0012.png](https://qiita-image-store.s3.amazonaws.com/0/99262/c6d0a980-c317-24b8-2015-252d9815d2b5.png)

その上で、「ツール」->「Android」->「Android SDK Manager」をクリックしてください。  
すると以下のような画面が開きます。  

![SnapCrab_No-0002.png](https://qiita-image-store.s3.amazonaws.com/0/99262/0581a776-c2d9-0c2d-256f-31cb71357669.png)

ここで、必要なものを選択していきます。  
ここで注意点があります。  

以下を全てインストールして下さい。
もしかしたら過不足があるかもしれませんが、XamarinネイティブおよびForms双方でデバック実行できるところまでは確認してあります。  

* Tools  
    * Android SDK Tools  
    * Android SDK Tools Platform-tools  
    * Android SDK Build-tools 23.0.3  
* Android 6.0(API 23)  
    * SDK Platform  
* Android 5.1.1(API 22)  
    * SDK Platform  
* Android 5.0.1(API 21)  
    * SDK Platform  
* Android 4.4.2(API 19)  
    * SDK Platform  
* Android 4.1.2(API 16)  
    * SDK Platform  
* Android 5.0.3(API 15)  
    * SDK Platform  
* Extras  
    * Android Support Library  

以上です。

# さいごに
Xamarin初めての方で、何かお困りごとのある方は、コメントに情報いただければお手伝いできるかもしれません。
お気軽にご相談ください。
Xamarin for Visual Studioインストール後、Androidプロジェクトをデバックしようとしたら配置エラーが発生した場合の対処法

# はじめに
Visual Studioに無料で追加されたことで、今Xamarinは一躍注目を集めています。
しかし、Xamarinの特にVisual Studioとの統合環境構築は、多くの「ハマり所」が存在し環境構築に苦労されている方も多いのではないでしょうか？

本エントリーではXamarin for Visual Studioインストール後、Androidプロジェクトをデバックしようとしたら配置エラーが発生した場合の対処方法を記載します。

なおXamarinのスタートアップ時にハマりそうなトラブルのQAを以下にまとめていますので、良かったら参考にしてください。
> Xamarin for Visual Studio スタートアップ トラブルQA集
> [http://nuits.hatenadiary.jp/entry/2016/04/07/215641](http://nuits.hatenadiary.jp/entry/2016/04/07/215641)

# 対策方法
デバック開始のボタンが以下のように緑三角と「開始」の文字だけが表示されていませんか？
![003.png](https://qiita-image-store.s3.amazonaws.com/0/99262/c4b44c45-eb75-422a-70d0-98ebafe8554b.png)

正常な場合、以下のようにエミュレーターの詳細情報が表示されるはずです。
![004.png](https://qiita-image-store.s3.amazonaws.com/0/99262/30b324e0-55fa-7337-5ed7-302bc6b103d5.png)

この場合、PCを再起動すれば治ります。
エミュレーターが表示されていても、PCを再起動すれば治ることがあります。

もし治らなかったり、これが原因じゃなければコメントください。
もしかしたら何かわかるかもしれません。

# 原因
これは、ユーザグループのHyper-V Administratorsに、アカウントが登録されていいことが原因です。
もしくは、Hyper-V Administratorsに、アカウントが登録した後に、PCを再起動していないためです。

たいていは前者でしょう。
ただし、デバック実行するとHyper-V Administratorsに、アカウントが登録されていないと自動的に登録されます。
しかし、登録されても、登録後にPCを再起動しないと有効にならないため、エミュレーターが起動できず、配置エラーが発生します。

念のため「コンピューターの管理」->「ローカル ユーザーとグループ」->「グループ」を開いてください。 
Hyper-V Administratorsグループに自身のアカウントが登録されていることが見て取れるはずです。
登録されていない？
おかしいな？
まぁ、自信のアカウントを登録して再起動すれば、あとは正常に動作するはずです。

以上です。

# さいごに
繰り返しになりますが、この対処法で治らなかったり、これが原因じゃなければコメントください。
もしかしたら何かわかるかもしれません。
CentOS7.2にNode.js環境を構築する

CentOSにNode.jsをインストールする

**インストールとバージョン確認**

```sh
[root@Alnilam ~]$ yum install nodejs --enablerepo=epel
[root@Alnilam ~]$ node -v
v0.10.42
```

非常に簡単ですが、バージョンが凄く古いようです。
公式からソースコード取得の上、ビルドします。

2016年4月8日時点の安定版は、以下のようです
![nodejs.png](https://qiita-image-store.s3.amazonaws.com/0/110457/a8fb337b-ef10-321e-c142-80e31e4b4a7b.png)


**コンパイラのインストールとビルド**

```sh
[root@Alnilam ~]$ yum install wget
[root@Alnilam ~]$ yum install gcc-c++
[root@Alnilam ~]$ wget https://nodejs.org/dist/v4.4.2/node-v4.4.2.tar.gz
[root@Alnilam ~]$ tar -zxvf node-v4.4.2.tar.gz 
[root@Alnilam ~]$ cd node-v4.4.2
[root@Alnilam node-v4.4.2]$ ./configure
[root@Alnilam node-v4.4.2]$ make
#・・・30分ほど待つ
[root@Alnilam node-v4.4.2]$ make install
[root@Alnilam node-v4.4.2]$ /usr/local/bin/node -v
v4.4.2
```

インストールできました。今後はExpressを利用してAPIなど構築したいと存じます。
AWRから指定したSQL IDの実行統計を取得する方法

SQLごとの実行時間や読込み量等の統計を取得するスクリプトです。

```sql:dba_hist_sqlstat.sql

set linesize 10000
set pagesize 10000
set trimspool on
set termout off
set colsep "|"
spool dba_hist_sqlstat_by_sqlid.log

select sn.BEGIN_INTERVAL_TIME, st.*
from DBA_HIST_SQLSTAT st,
     DBA_HIST_SNAPSHOT sn
where 
      st.SNAP_ID = sn.SNAP_ID
  and st.DBID = sn.DBID
  and st.INSTANCE_NUMBER = sn.INSTANCE_NUMBER
  and sn.BEGIN_INTERVAL_TIME between to_date('2016/03/01 13:50:00', 'yyyy/mm/dd hh24:mi:ss')
                                 and to_date('2016/03/31 19:10:00', 'yyyy/mm/dd hh24:mi:ss')
  and st.SQL_ID in ('a1dkahc57tu6k','958gy5ujrpcrd','7kmbrw7q8hn4g','fhf8upax5cxsz');
spool off

```

dba_hist_sqlstatにはsql idごとに実行時間や読み込み量などスナップ間のデルタ値を保持しているため、
例えば、ELAPSED_TIME_DELTA / EXECUTIONS_DELTA を求めることで1実行あたりの平均実行時間の算出ができます。

Excelに取り込み、ピボットグラフでの整形例
![dba_hist_sqlstat_elap.png](https://qiita-image-store.s3.amazonaws.com/0/120705/aafca81e-2279-3dba-7b6f-4fb905d31553.png)

Oracle® Databaseリファレンス 12c リリース1 (12.1) - [DBA_HIST_SQLSTAT](https://docs.oracle.com/cd/E49329_01/server.121/b71292/refrn23447.htm "dba_hist_sqlstat")
（SQLはDB 12.1.0.2にて試行）
EC-CUBE3でDoctrine/DBALを使う

EC-CUBE3では、データベースの操作は通常、Doctrin/ORMというO/Rマッパーを使っています。
O/Rマッパーは便利ですが、複雑な集計を行うときなど、SQLを直接書きたい場面もあると思います。

そんな時はDoctrine/DBALを使うとSQLでデータを取ってくることができます。

こんな感じ。PDOと同じような使い方です。

```php
$stmt = $app['db']->query('select * from dtb_product');
while ($row = $stmt->fetch()) {
    dump($row);
}
```

クエリビルダを使ってSQLを構築することもできます。

```php
$qb = $app['db']->createQueryBuilder();
$stmt = $qb
    ->select('*')
    ->from('dtb_product')
    ->where('name = :name')
    ->setParameter('name', 'パーコレーター')
    ->execute();

while ($row = $stmt->fetch()) {
    dump($row);
}
```

参考
http://www.doctrine-project.org/projects/dbal.html
Linux開発環境⇔リモートリポジトリ間のgit操作をWindowsのSourceTree上からできるようにするまでの長い道のり

* 開発環境のソースをwindowsから開発 ← つまりsambaを設定する
* 開発環境の作業コピーとリモートリポジトリ間のgit操作をWindowsからSourceTreeで行なう

つまり、この不安を煽るレベルで線の粗い下記の図のようなことをしたい

![0001 2 (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/57635/6425b5c6-bead-0931-ce75-ee749a9100b0.jpeg)

# 手順

* sambaを設定し、windowsから開発環境に直接アクセスできるようにする
* 開発環境 ⇔ リモートリポジトリ間のsshキー登録
* SourceTree ⇔ リモートリポジトリ間のsshキー登録
* SourceTreeから開発環境に作業コピーを作成
* あとはpushなりpullなり自在にできるようになる(あとは快適なSourceTreeライフを！)

...と順調にいければそれに越したことはないが、何かとエラーが発生したので、そのエラーと対応について以下にまとめる

# そもそもcloneでsshのurlを指定すると永遠にgitリポジトリであることを認識してくれない

urlからcloneする際に、通常であればcloneするリポジトリを指定すればSourceTree側からGitリポジトリであることを認識してくれる。
ここで、sshのurl(git@bitbucket.org~から始まるurl)を指定してもずっと読み込み中になってしまうという現象に見舞われる。
ちなみに、httpsのurlを設定するとこれが認識できたりする。

## 原因:思わぬ場所のsshの設定が足りていない

開発環境 ⇔ リモートリポジトリ間もSourceTree ⇔ リモートリポジトリ間もsshの設定ができたのにまだ足りないというのか!?
はい。そうです。

コマンドプロンプトで以下を実行
※ 「privatekey.ppk」の箇所は自分で設定した名前

```
> C:\Program Files (x86)\Atlassian\SourceTree\tools\putty\
> plink.exe -ssh -C -i "privatekey.ppk" git@bitbucket.org
```

あとはこちらを参照
http://qiita.com/moo/items/5ee3208254c34719914b

# 開発環境上では出てこないmode変更の差分が出てくる

ようやくgit cloneができたかと思ったら、今度は身に覚えのない差分がわんさかと出てきて泣けてくる。

## 原因:filemodeの設定がtrueになっている

そういった時はwindows側の.gitconfigと、開発環境の作業コピー内の.git/configに以下の設定を追加する。

```
[core]
        repositoryformatversion = 0
        filemode = false
```

こちらを参照
http://qiita.com/hishida/items/35d929845c0ac824b1c0

# indexにステージしようとしても「error: unable to write sha1 filename [作業コピーの場所]/.git/objects/pack/pack-[なんか不規則な文字列].pack: Permission denied」と出てしまう

よし、cloneができて余計な差分もでなくなった。
気を取り直して変更内容をpushしてみようという矢先にコレである。
一難去ってまた一難とはまさにこのことだ。諦めたくなる。

## 原因:sambaの設定不足

/etc/samba/smb.confに以下の行を追加して再起動をする。

```
   create mask = 0777
   force create mode = 0777
   security mask = 0777
   force security mode = 0777
   directory mask = 0777
   force directory mode = 0777
   directory security mask = 0777
   force directory security mode = 0777
```

その他の設定はこちらを参照
http://language-and-engineering.hatenablog.jp/entry/20110820/p1

# これらの設定を経て...
indexに変更ファイルをステージできた🎉
commitもできた✨
pushもpullもできた😂

めでたしめでたし。諦めないで良かった。
Solidusで決済手数料をさくっと導入する

Ruby on Rails製のECシステムであるSolidusは非常に拡張性に富んだ設計がされているものの、デフォルトのままだと文字通り必要最低限の機能しかないうえに、海外の商習慣に基いて作られているため日本国内で使う場合には多くの箇所を自力でカスタマイズするしかありません。

この記事でテーマとしている決済手数料も、日本国内では未だ少なくないECサイトが「代金引換決済の場合324円発生します」とかしているにも関わらず標準のSolidusではそれを実現することができません。

エクステンションを用いて実現することも可能ですが古いバージョンのまま更新が止まってしまっていたり、複数通貨にも対応していて多機能過ぎたりします。もっとシンプルに実装したい場合には今回紹介する方法を用いると良いかもしれません。


最初にコードを記します。

* 動作環境 Solidus 2.3系

```ruby:app/models/spree/payment_method_decorator.rb
Spree::PaymentMethod.class_eval do
  preference :payment_method_fee, :integer
end
```

```ruby:app/controllers/spree/checkout_controller_decorator.rb
Spree::CheckoutController.class_eval do
  before_action :update_payment_method_fee, only: :update

  private
  def update_payment_method_fee
    return unless params['state'] == "payment"

    if params[:order][:wallet_payment_source_id].present?
      # solidusはparams[:wallet_payment_source_id]の有無でwalletの使用/不使用を判定している
      # カードの場合0円にしてます。適時書き換えてください。
      payment_method_fee_is = 0
    else
      payment_method_fee_is = Spree::PaymentMethod.find(params['order']['payments_attributes'][0]['payment_method_id']).preferred_payment_method_fee
    end
    payment_method_fee_was = @order.adjustments.eligible.where(label: Spree.t(:payment_method_fee)).sum(:amount).to_i

    if payment_method_fee_is != payment_method_fee_was
      @order.adjustments.eligible.where(label: Spree.t(:payment_method_fee)).update_all(eligible: false)
      Spree::Adjustment.create(label: Spree.t(:payment_method_fee), adjustable: @order, order: @order, amount: payment_method_fee_is) if payment_method_fee_is != 0
      @order.adjustments.reload
      @order.updater.update # @order.totalや@order.adjustment_totalを再計算する
    end
  end
end
```

これら2つのファイルをプロジェクトに追加するだけで実現できてしまいます。簡単ですよね。

## 仕組み

### PREFERENCE

決済手数料の金額は、SolidusのPreferenceを使用して保存しています。Preferenceについて詳しくは下記の記事をご覧いただければと思いますが、簡単に説明するとDBにカラムを追加せずに任意のキーの変数をActiveRecordインスタンスやアプリケーション全体に対して保存できる仕組みのことです。

[[日本語訳] PREFERENCES - DEVELOPER GUIDE | SPREE COMMERCE](http://qiita.com/yuskamiya/items/2c8e00ff384e89a86254)

なおSpree::PaymentMethodクラスはデフォルトでPreferenceを使用できる設計になっています。新しくPreferenceを定義すると自動で`admin/payment_methods/:id/edit`に型に応じたフォームが現れるのでビューをいじる必要もなく任意の変数を保存することができます。あとはこのフォームから金額を設定してあげるだけですね。

あとは`checkout_controller_decorator.rb`が決済方法に応じた手数料を注文に付与してくれます。解説についてはコード内にコメントで書いた通りです。

ちなみに`Spree::Payment`のコールバックとかで決済手数料を計算しようともしてみたんですがうまく行きませんでした。adjustmentを作るだけと思いきや、order.totalやpayment.amount辺りも値を更新する必要があるのでタイミングが結構シビアです。色々試した結果checkout_controllerで計算するのが一番という結論に至りました。

## ついでに

Solidusを使ってECサイトを作る場合、コアとなるようなメソッドに手を加えてしまうとSolidus本体のアップデートの際にシステムが壊れてしまったり、コードの見通しが悪くなったりとあまり良いことがありません。

カスタマイズする場合は、今回みたいにコントローラのbefore_actionやコールバック等を活用してSolidusのコアと疎結合になるよう組み立ててゆきましょう。
OnsenUI 2 Beta.9をAndroidで動かすとpopPage()のアニメーションがデフォルトのやつになる

Beta.9バグ多すぎじゃないか？

# 記事の対象者
- OnsenUI 2 Beta.9を使っている人
- Android端末で動かしている人

かつ
- pushPageにデフォルト以外のアニメーションを設定している人
- popPage() または ons-back-buttonを使っている人

# 問題
pushPage()に設定したアニメーションはpopPage()にも反映されるはずだが、OnsenUI 2 Beta.9をAndroid端末で動作させた場合はデフォルトのアニメーションになる。

# 解決法

animationを直接設定する。今回はslideを設定してみた（liftはバグる）。
ons-back-buttonを使ってる場合はons-toolbar-buttonに切り替える。

```html
<ons-toolbar>
    <div class="left">
        <ons-toolbar-button ng-click="nav.popPage({animation:'slide'})">
            <ons-icon icon="ion-ios-arrow-back, material:md-arrow-back" size="32px, material:24px"></ons-icon>
            <ons-if platform="ios other">戻る</ons-if>
        </ons-toolbar-button>
        <!--<ons-back-button>戻る</ons-back-button>-->
    </div>
</ons-toolbar>
```

クッソ面倒。
ons-iconの新構文が使えるのが唯一の救いか。

# 結論
自分でアニメーションを設定して、さらにons-back-buttonを使わなければ大丈夫。

Beta.9はバグが多いので、Beta.8を使うか今後の修正を待った方が良い。
ベータ版だから仕方ない。
AWRから指定した期間のload profileをcsv形式で取得する方法

AWRのload profileをcsv形式で出力するためのスクリプト例です。


```sql:get_load_profile.sql

set termout off
set pagesize 0
set linesize 10000
set trimspool on
set heading off

spool load_profile.log
prompt begin_snapid,yyyy,mm,dd,hh,end_snapid,instance_num,name,value

select                                         '"' ||
    bsn.SNAP_ID                           || '","' ||
    to_char(bsn.END_INTERVAL_TIME,'yyyy') || '","' ||
    to_char(bsn.END_INTERVAL_TIME,'mm')   || '","' ||
    to_char(bsn.END_INTERVAL_TIME,'dd')   || '","' ||
    to_char(bsn.END_INTERVAL_TIME,'hh24') || '","' ||
    esn.SNAP_ID                           || '","' ||
    bsn.INSTANCE_NUMBER                   || '","' ||
    bsy.STAT_NAME                         || '","' ||
    (esy.VALUE - bsy.VALUE)               || '"'
from
    DBA_HIST_SNAPSHOT bsn,
    DBA_HIST_SNAPSHOT esn,
    DBA_HIST_SYSSTAT  bsy,
    DBA_HIST_SYSSTAT  esy
where 
        bsn.DBID = esn.DBID
    and bsn.INSTANCE_NUMBER = esn.INSTANCE_NUMBER
    and bsn.END_INTERVAL_TIME = esn.BEGIN_INTERVAL_TIME
    and bsn.STARTUP_TIME = esn.STARTUP_TIME
    and bsn.DBID = bsy.DBID
    and bsn.INSTANCE_NUMBER = bsy.INSTANCE_NUMBER
    and bsn.SNAP_ID = bsy.SNAP_ID
    and esn.DBID = esy.DBID
    and esn.INSTANCE_NUMBER = esy.INSTANCE_NUMBER
    and esn.SNAP_ID = esy.SNAP_ID
    and bsy.STAT_NAME = esy.STAT_NAME
    and bsy.STAT_NAME in ('execute count','parse count (hard)','consistent gets',
                          'physical reads','redo size')
    and bsn.END_INTERVAL_TIME >= to_date('2016/04/05 09:50','yyyy/mm/dd hh24:mi')
    and esn.END_INTERVAL_TIME <= to_date('2016/04/08 13:10','yyyy/mm/dd hh24:mi')
order by bsn.SNAP_ID;
spool off
/

```

出力されたデータをexcelに取り込み、
ピボットグラフを活用することで容易に可視化できます。

カラムをカンマで分割
![excel.png](https://qiita-image-store.s3.amazonaws.com/0/120705/211ef8f6-5929-3a16-463b-82e6b7e1aa7b.png)

ピボットグラフを選択
![pivot.png](https://qiita-image-store.s3.amazonaws.com/0/120705/40bd0e29-6bea-8925-44d3-cbdd126c08b7.png)


軸、列を指定し整形
![graph.png](https://qiita-image-store.s3.amazonaws.com/0/120705/bf659cd1-3f48-6127-f713-85afa08b83f6.png)

グラフ化することで複数期間にわたる傾向分析が容易にできます。
（SQLはDB12.1.0.2にて試行）
UIPageViewControllerやContainer View上のUITableViewやUIWebViewでバーのtranslucentに対応する

もう懐かしい話となってしまいますが、UITableViewControllerやUICollectionViewController、WebViewを全画面で配置する際には、上端と下端をLayout Guide **ではなく** UIViewControllerのrootの **view全体に** 対するConstraintsを追加する必要があります。

これによって、UITableView、UICollectionView、UIScrollView、UIWebViewがUINavigationBar、UITabBar、UIToolBarの下に潜り込み（automaticallyAdjustsScrollViewInsetsがオンの場合）、透過されたBarの下にも表示されるようになります。

http://qiita.com/yimajo/items/254c7cebab7864678246

ただ、automaticallyAdjustsScrollViewInsetsは **Child View Controller** に対しては働かないという弱点があります。Child View Controllerとは、View Controllerの中にView Controllerを埋め込んでいる状態です。例えば、 **UIPageViewContorller** やInterface Builder上で指定できる **Container View** を使った場合はこの状態になります。

そこで、Layout Guideのある一番親のViewControllerまでさかのぼって、Layout Guideの幅をゲットし、それをUIScrollViewにセットするスニペットを使っています。

```objc
+ (void)setupInsetForScrollView:(UIScrollView *)scrollView onChildViewController:(UIViewController *)viewController
{
    if (!viewController.automaticallyAdjustsScrollViewInsets) {
        return;
    }
    UIViewController *currentViewController = viewController;
    UIViewController *rootParentViewController;
    while (currentViewController.parentViewController) {
        currentViewController = currentViewController.parentViewController;
        if ([currentViewController isKindOfClass:[UITabBarController class]] ||
            [currentViewController isKindOfClass:[UINavigationController class]] ||
            [currentViewController isKindOfClass:[UIPageViewController class]]) {
            continue;
        }
        rootParentViewController = currentViewController;
    }
    if (!rootParentViewController) {
        return;
    }

    // http://stackoverflow.com/a/21541533/1474113
    CGFloat topLength = rootParentViewController.edgesForExtendedLayout & UIRectEdgeTop ?
        rootParentViewController.topLayoutGuide.length : 0;
    CGFloat bottomLength = rootParentViewController.edgesForExtendedLayout & UIRectEdgeBottom ?
        rootParentViewController.bottomLayoutGuide.length : 0;
    UIEdgeInsets insets = UIEdgeInsetsMake(topLength, 0.0, bottomLength, 0.0);
    scrollView.contentInset = scrollView.scrollIndicatorInsets = insets;
}
```

これをChild View Controllerからこんな感じでviewWillLayoutSubviewsの時に呼び出せば自動調整されます・・！

```objc
- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];
    [YPLayoutGuideHelper setupInsetForScrollView:self.collectionView onChildViewController:self];
}
```

https://gist.github.com/ypresto/2f448ff5ec3a9f8ba637

※UIWebViewの場合はwebView.scrollViewを渡してください！
Reproを使ってユーザテストしたら最高だった話

## はじめに 

自分で作ったサービスのユーザテストしてますか？
私もユーザテストを数回実施しているのですが、ユーザテストする上で撮影機器の準備とか会議室の準備とか大変すぎて準備段階で疲れ果ててしまった経験があります:sob: 
そんな時良さげなサービスを教えてもらって実際に使った結果、かなり良さを感じたので紹介します :raising_hand: 
※モバイルアプリ向け

## 結論 : [Repro超便利](https://repro.io/) :tada: 
アプリのスクリーンキャプチャ&フロントカメラ撮影の動画を作る機能を持っているので撮影機器いらず。 
アプリ起動で録画開始->自動で動画を転送してくれてRepro上で見れるので動画データの共有はReproにinviteすればOK。SDカードから動画を取り出す必要ナシ。
つまり、スマートフォンと記録用ノートPCだけでユーザテスト出来る！！！１１！(出来ました)

Reproの導入にあたって行った作業は↓だけ(iOS)

1. Reproにユーザ登録
2. ```pod "Repro"```
3. AppDelegateのdidFinishLaunchingWithOptionsに以下2行コードを追加

```
Repro.setup("YOUR_REPRO_APP_CODE")
Repro.startRecording()
```

撮影機器の準備が要らなくなったので1時間以上の時間短縮に。
大掛かりな撮影機器が無くなったので場所の制約から解放。
ユーザテスト後の撮影動画を公開する作業から解放。
占めて2〜4時間以上の工数削減を期待出来るんじゃないかなと思います。
PCとスマートフォンだけのカジュアルユーザテストが可能に :muscle: 

## 詳細説明するよ
従来のユーザテストと今回行ったユーザテストの構成を紹介します。

## 従来のユーザテストの構成 :airplane: 
従来だとこんな感じでするのかなと思ってます

- ユーザテストの設計
  - ユーザテストで確認したい内容を決める
  - ユーザテストの流れを決める(画面遷移とか)
  - 質問、アンケート内容
  - 使うツール：スプレッドシート、テキストエディタ
- テスト端末
  - iPhone、Android
- ユーザの操作を撮影する機器
  - 後で見返すためにユーザの操作と声を録音する
  - ビデオカメラ、検証用などで余ったスマートフォン、三脚、機器固定クリップ…etc
- ユーザテストの進捗をメモするためのPC
- 場所を押さえる
    - 撮影機器の搬入と設置、モニタリング
- テストしてくれるユーザの手配
    - 押さえた場所の予約時間に合わせて来てもらう必要アリ

## 従来のユーザテストでめんどくさいところ :cold_sweat: 
スプレッドシートと格闘した後以下の作業が必要なのでかなりめんどい

- 場所を押さえる
  - 撮影機器の運搬、設置が必要なので会議室などを一定時間抑える必要がある
- 撮影機器の設置
  - ビデオカメラの位置調整、録画操作…etc
- 撮影後の動画共有
  - SDカードからの取り出し、メンバーへ配布
- テストしてくれるユーザの手配
  - 場所の時間が限られてるのでスケジューリングの必要アリ

## 今回のユーザテストの構成 :rocket: 

- ユーザテストの設計(従来通り) 
- 場所を押さえる(New!)
  - 特に場所を押さえませんでした
  - 会社のカフェスペースで実施
- ユーザの操作を撮影する機器(New!)
  - Reproを使用(iOS)
  - ReproをCocoaPodsで入れて2行コード書くだけ
  - アプリを起動すれば録画される
- テストしてくれるユーザの手配(New!)
  - 手配は従来通りだが、場所に縛られなかったのでフレキシブルなスケジュール調整

## Reproの良い所 :+1: 

- 撮影機器いらず
  - アプリ内に組み込んだReproが撮影してくれる
- 場所の制約から解放される
  - 喫茶店みたいなところで行ったんですが問題なく録音出来ていました。
  - 人混みだと厳しいかも。
- 撮影機器から動画を取り出す必要ナシ
  - 共有が楽チン。サービスにinviteしてURL送るだけ
- 対応プラットフォームが豊富
  - iOS、Android、Unity、Cocos-2dx
  - 今回はiOSを使用

## Reproの不便な所 :-1: 

- 撮影時間が最長480秒(8分)
  - ユーザテスト中に一度ホームボタン押し、再度アプリを立ち上げ直して再録画する運用でカバーしました。

## 最後に :thought_balloon: 

- 今回のユーザテストは私一人で行ったので準備作業が減るのはかなり助かりました。
- Reproは今回初めて導入したのでより良い使い方あるかもしれません。でもAppDelegateに2行書くだけで撮影環境作れるのは超便利だと思う。
- ユーザテストは手法がガチっと決まってなく属人的な所も多いと思うので難しいです。他にこんなツールつかってるよーとかあれば気軽に教えてもらえると嬉しいです :pray:
プログラマが持っておくといいかもしれない3種の神器+α

# はじめに

もうエンジニア4年目な人です。
エンジニアがすなるQiitaというふものを我もしてみんとてするなり。

ということで、ちょうど書きやすそうな [新人プログラマ応援](http://qiita.com/tags/%E6%96%B0%E4%BA%BA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E5%BF%9C%E6%8F%B4) 企画に乗ってみることにしました。
しかし本稿はプログラムの話ではなくハードウェア・・・広義の開発環境の話です。


# この記事について

プログラマ(に限らないと思いますが)が持っておくときっと役にたつ(と思う)アイテムを紹介していきます。

# 3種の神器

## 1.マウス
付属品でいいやと思ってはいけません。
大手の通販サイトやパソコンショップの店頭・通販ページなどを見てみるとわかりますが、非常に多くのモデルがあります。
本格的に語ると長くなるのでさっとまとめますが、良いマウスを使うと(個人差があります)

- 多機能・高性能なので作業が早く正確になる
- 仕事のやる気が出る
- マウスがカッコイイのでモテる(｀・ω・´)

などなどいいことがあります。
性能を求めないとしても、手の大きさやマウスの持ち方は人それぞれなので、いろいろな大きさや形、重さのものを試してみて「これ持ちやすい！」と思えるマウスはぜひ入手しておきたいものです。

## 2.キーボード
付属品でいいやと思ってはいけません。(大事なことなので2回)
マウスと同じく多くのモデルがあります。
こちらも語ると長くなるのでさっとまとめますが、良いキーボードを使うと(個人差があります)

- タイピングが早く正確になる
- 仕事のやる気が出る
- キーボードがカッコイイのでモテる(｀・ω・´)

などなどいいことがあります。
キーボードを変えると劇的にタイピングが楽になったりするので、今使っているものに特に不満がなくてもいろいろ触ってみると世界が変わるかもしれません。

## 3.PC用メガネ
職業としてプログラマをやるならば、（プライベートでスマホやPCやテレビを見る時間もあるので）1日の半分以上液晶ディスプレイを見ているということも珍しくはありません。

液晶を長く見ていると目が疲れる！頭痛がする！という方はブルーライトをカットするPC用メガネを装備してみましょう。けっこう改善します。

# +α

プログラミングと関係ないものでも大事です。これはもう人それぞれなので自分で見つけていきましょう。
ちなみに私の場合はコーヒー器具(ミル、ケトル、ドリッパー、カップ)です。
どうしても机に張り付きがちになる性分なので、コーヒーを淹れて飲むというリフレッシュの時間をとることがいい気分転換になっています。

# まとめ

PC1台で仕事ができる職業ではありますが、道具は大事な相棒です。
自分にあった良い道具を使うことで効率や気持ちの乗りが上がっていくので、ぜひともこれというものを見つけてください！
atom でファイルの文字コードの自動判別

# 手動で文字コード判別させるのはどうも手間なので・・・
atomはファイルを開いて期待している文字コードで開かなかった場合、`Ctrl+Shift+u`の操作で文字コードを判別し直すことは出来るようですが、やはりサクッっと開いたときに自動判別させたいです。

やってみて、ファイルが開かれたとき、文字化けが無く期待している文字コードでファイルが開くのはこんなに気持ちいいものかと思いました。


既にされている方がおられましたので、参考にさせていただきました。
ありがとうございました。
[ATOM でファイルを開いたら自動文字コード判定を行う](http://qiita.com/tokudiro/items/bc232c7d36261dc45936)
[ファイルの文字コードの自動判別](http://d.hatena.ne.jp/nextliteracy/20150801/1438418711)


# 今回の環境
以下の通りです。
> Windows 7-64bit
> atom-1.6.2

# インストール
※`hoge`はWindowsログインのユーザー名なので、ご自身のユーザー名に読み替えてください。

iconv-liteとjschardetというものが必要なようです。
npmでインストールするらしいので、Node.jsをインストールしておいてください。

こちらにwindowsにNode.jsをインストールする記事がありました。
[Node.js / npmをインストールする（for Windows）](http://qiita.com/tokudiro/items/bc232c7d36261dc45936)

では、iconv-liteとjschardetをインストールします。

```bash
npm install iconv-lite
npm install jschardet
```

iconv-liteとjschardetは、`C:\Users\hoge\node_modules`のディレクトリの中に、`iconv-lite`ディレクトリと`jschardet`ディレクトリが作成されインストールされていました。

## ここで、.atomディレクトリ内に、`node_modules`ディレクトリを作る
わたしの場合、`.atom`ディレクトリは`Users\hoge\.atom`でした。 そこに`node_modules`ディレクトリを作ります。

```bat
c:
mkdir \Users\hoge\.atom\node_modules
```
そして、先ほどインストールされた`iconv-lite`ディレクトリと`jschardet`ディレクトリをガサッっとコピーしました。
（mklinkでリンクを張ってもいいのかもしれません）

## init.coffeeの修正
.atomフォルダにあるinit.coffee にスクリプトを書きます。
つぎの様なメニュー操作で、init.coffeeが開くようです。
![１.png](https://qiita-image-store.s3.amazonaws.com/0/20451/bbf8a276-685a-3231-372f-727cf34bd896.png)


ここに、次のようなスクリプトを書いて保存します。

```coffeescript
fs = require('fs')

atom.workspace.observeTextEditors (editor) ->
  try
    filePath = editor.getPath()
  catch error
    return
  return unless fs.existsSync(filePath)

  jschardet = require 'jschardet'
  iconv = require 'iconv-lite'
  fs.readFile filePath, (error, buffer) =>
    return if error?
    {encoding} = jschardet.detect(buffer) ? {}
    encoding = 'utf8' if encoding is 'ascii' or encoding is 'windows-1252'
    return unless iconv.encodingExists(encoding)

    encoding = encoding.toLowerCase().replace(/[^0-9a-z]|:\d{4}$/g, '')
    editor.setEncoding(encoding)
  return
```
あとは、試しにatomを再起動させて、いろんな文字コードのファイルを開いて問題ないか確認してみてください。
# まとめ
ちょっとスクリプトを設定しないといけなかったりして敷居が高そうですが、出来てしまえばいろんな文字コードのファイルを書かなければならない人にとっては大変便利だと思います。

けっこう、気持ちいいです。
Ubuntu 15.10にSonarQubeをインストールする

仮想環境にUbuntu入れて、そこで自由に試せるSonarQube環境を構築したので、手順のメモメモ。

# 環境

* Windows7
* VirtualBox 5.0.12
* Ubuntu 15.10
* JDK 1.7.0_95
* SonarQube 5.4
* MySQL 5.6.28

## そもそもSonarQubeとは

ソースコードの品質管理のため、予め設定したルールに違反するコードを自動で検出してくれるツールです。
いわゆる技術的負債であったり複雑度であったり、そういった情報も数値化することができるので
プロジェクトの定期診断に使うことが出来ます。
[公式サイト](http://www.sonarqube.org/)

# 必要（推奨）環境

* JDK 7u55以上★
* RAM 1GB以上
* ディスク空容量 10GB以上

※★は必須

# MySQLのインストール・設定
まずはSonarQubeが使うDBを用意してやる必要があります。

## バージョンの確認

```
$ sudo apt-get update
$ apt-cache show mysql-server | grep Version
Version: 5.6.28-0ubuntu0.15.10.1
Version: 5.6.25-0ubuntu1
```
別に確認はしなくてもいいですが、念のため。

## MySQLインストール

```
$ sudo apt-get install mysql-server
$ mysql --version
mysql Ver 14.14 Distrib 5.6.28, for debian-linux
```
rootのパスワードは個人で使う分には必ずしも設定しなくていいと思います。
この先は設定しなかったものとして進めます。

## MySQL起動

```
$ mysql -u root
```

## データベース作成

```
mysql> CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> CREATE USER 'sonar' IDENTIFIED BY 'sonar';
mysql> GRANT ALL ON sonar.* TO 'sonar'@'%' IDENTIFIED BY 'sonar';
mysql> GRANT ALL ON sonar.* TO 'sonar'@'localhost' IDENTIFIED BY 'sonar';
mysql> exit
```

データベースの準備はこれで終了です

# SonarQubeのインストール

いよいよSonarQube本体のインストールです。
/opt配下にインストールしますが、どこでもいいのでお好きなところに。

## ダウンロードと配置

```
$ wget https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-5.4.zip
$ unzip sonarqube-5.4.zip
$ sudo mv sonarqube-5.4 /opt
$ cd /opt
$ sudo ln -s sonarqube-5.4 sonar
```
バージョンアップしやすいようにシンボリックリンクにしておきます。

## 設定変更

```
$ cd sonar/conf
$ ls
sonar.properties wrapper.conf
$ cp sonar.properties sonar.properties.bk
$ vi sonar.properties
```

以下のように変更します。
username, passwordはコメントアウトを解除しつつ、値を設定。
jdbc.urlはコメントアウトを解除するだけでOKです。

```sonar.properties
sonar.jdbc.username=sonar
sonar.jdbc.password=sonar

sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance
```

## 起動

```
$ cd /opt/sonar/bin/linux-x86-64
$ sudo ./sonar.sh start
Starting SonarQube...
Started SonarQube.
```

ここまでくればSonarが起動しています。
早速ブラウザで
http://localhost:9000/
へアクセスしましょう。
初回は結構ページが表示されるまで時間がかかるかもしれません。
テストメソッド作成スクリプト

最悪Excelでも出来るけど。。

```groovy
def methodName = 'testSomeProcess'
'''\
正常系
アレでエラーになること
'''.eachLine {
  println """\
  @Test
  public void ${methodName}_${it}() {}
  """
}
```

result

```Java
  @Test
  public void testSomeProcess_正常系() {}
  
  @Test
  public void testSomeProcess_アレでエラーになること() {}
```
Elasticsearch で検索時のみ助詞を除外する


## はじめに

日本語の全文検索エンジンとしてElasticsearchを使おうとする時、 [`kuromoji`](https://www.elastic.co/guide/en/elasticsearch/plugins/current/analysis-kuromoji.html) を使うかと思います。

ですが、デフォルトでは全ての形態素解析した単語に関して計算をします。
例えば、クエリとして文章を入れた時、「が」や「です」も考慮して検索します。
しかし、そのようなどの文書にも出てくるような単語しかひっかからなかった場合、よくわからない文書が出てきてしまいます。

そこで、インデックス時に『助詞』を省くことが考えられますが、
後で何かに使えるかもしれないのでインデックスだけはしておきたいけど、
検索時には除外したい、を実現するにはどうするかという内容になります。

### 環境

```
$ curl -s -XGET 'http://localhost:9200' | jq '.version.number' -r
2.2.0
```

## Analyzer の設定

[Controlling Analysis](https://www.elastic.co/guide/en/elasticsearch/guide/current/_controlling_analysis.html) の日本語が[こちら](http://otiai10.hatenablog.com/entry/2015/03/11/011839)にまとめられています。

`analysis` の設定に `default_index` と `default_search` があるので、インデックス時と検索時のアナライザーを分けることができます。

## 品詞によるフィルターの設定

[この記事](http://suzuki.tdiary.net/20150709.html)にも書いてありますが [kuromoji_part_of_speech](https://www.elastic.co/guide/en/elasticsearch/plugins/current/analysis-kuromoji-speech.html) というトークンフィルターが用意されています。

## 実際に使ってみる

`Sense` を起動して下記ページを開いて実際に動かしてみてください。

http://localhost:5601/app/sense?load_from=https://raw.githubusercontent.com/sosuke-k/custom_elasticsearch_ranking/master/stop_posfilter.json

### インデックスの設定をする

```
PUT kuromoji_sample
{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "default_index": {
            "type": "custom",
            "tokenizer": "kuromoji_tokenizer"
          },
          "default_search": {
            "type": "custom",
            "tokenizer": "kuromoji_tokenizer",
            "filter": [
              "stop_posfilter"
            ]
          }
        },
        "filter": {
          "stop_posfilter": {
            "type": "kuromoji_part_of_speech",
            "stoptags": [
              "助詞-格助詞-一般",
              "助詞-終助詞"
            ]
          }
        }
      }
    }
  }
}
```

### 形態素解析の結果を確認する

[Explain API](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-explain.html) を使って、
形態素解析した品詞の結果を単語毎に確認します。

```
GET kuromoji_sample/_analyze?explain
{
  "text": "寿司が美味しいね"
}
```

`が` が `助詞-格助詞-一般` 、 `ね` が `助詞-終助詞` に分類されているのがわかります。

### データを保存

```
POST kuromoji_sample/document
{
  "text": "寿司が美味しいね"
}
```

### 助詞以外の単語を変えて検索してみる

`寿司` を `料理` に、 `美味しい` を `うまい` に変えてみました。

```
GET kuromoji_sample/document/_search
{
  "query": {
    "simple_query_string": {
      "query": "料理がうまいね",
      "fields": ["text"]
    }
  }
}
```

結果はヒット数０になるはずです。

### 助詞がインデックスされていることを確認する

`が` だけで検索してみます。

```
GET kuromoji_sample/document/_search
{
  "query": {
    "simple_query_string": {
      "query": "が",
      "fields": ["text"]
    }
  }
}
```

先ほど登録した `寿司が美味しいね` がヒットすると思います。

これは `が` 単体のクエリでは形態素解析の結果が `助詞` になっていないからです。
確認してみます。

```
GET kuromoji_sample/_analyze?explain
{
  "text": "が"
}
```

`接続詞` になっていることがわかります。
twitter-bootstrap-railsでglyphiconが読み込まれない場合の対処法（Rails4、Bootstrap3）


## 解決方法
### 1. フォントファイルの有無を確認
Halflingsと言うフォントファイルがtwitter-bootstrap-railsと一緒にインストールされているかをまず確認する。

```
$ cd [Rails.root]
$ find ./ -name "glyphicons-halflings*"
.//vendor/bundle/ruby/2.3.0/gems/twitter-bootstrap-rails-3.2.2/app/assets/fonts/glyphicons-halflings-regular.eot
.//vendor/bundle/ruby/2.3.0/gems/twitter-bootstrap-rails-3.2.2/app/assets/fonts/glyphicons-halflings-regular.svg
.//vendor/bundle/ruby/2.3.0/gems/twitter-bootstrap-rails-3.2.2/app/assets/fonts/glyphicons-halflings-regular.ttf
.//vendor/bundle/ruby/2.3.0/gems/twitter-bootstrap-rails-3.2.2/app/assets/fonts/glyphicons-halflings-regular.woff
.//vendor/bundle/ruby/2.3.0/gems/twitter-bootstrap-rails-3.2.2/app/assets/fonts/glyphicons-halflings-regular.woff2
```
これらのファイルが、
　ある場合　->　5. へ
　ない場合　->　2. へ


### 2. フォントファイルの取得
Bootstrapのファイル一式をダウンロードしてfontsフォルダの中身を`vendor/assets/fonts`に移動

```
$ cd
$ curl -O https://github.com/twbs/bootstrap/releases/download/v3.3.6/bootstrap-3.3.6-dist.zip
$ unzip bootstrap-3.3.6-dist.zip
$ cp -a bootstrap-3.3.6-dist/fonts [Rails.root]/vendor/assets/
```

### 3. フォントファイルをasset pipelineの対象に設定
```config/initializer/assets.rb
Rails.application.config.assets.paths << “#{Rails}/vendor/assets/fonts”
```

### 4. lessファイルに取得したフォントファイルへのpathを設定
```app/assets/stylesheets/bootstrap_and_overrides.css.less
@font-face {
  font-family: 'Glyphicons Halflings';
  src: url('/assets/glyphicons-halflings-regular.eot');
  src: url('/asstes/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),
  url('/assets/glyphicons-halflings-regular.woff') format('woff'),
  url('/assets/glyphicons-halflings-regular.ttf') format('truetype'),
  url('/assets/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg');
}
```

ここまでやって`rails s`してうまくロードされていれば、5.の対応は多分不要

### 5. glyphicon.lessをimport
bootstrap_and_override.css.lessの以下のコメントアウトを除去

```app/assets/stylesheets/bootstrap_and_overrides.css.less
// @import "twitter/bootstrap/glyphicons.less";
```
　↓↓

```app/assets/stylesheets/bootstrap_and_overrides.css.less
@import "twitter/bootstrap/glyphicons.less";
```

## 環境
```
$ sw_vers -productVersion 
10.11.4
$ ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin15]
$ rails -v
Rails 4.2.5.1
$ bundle list | grep twitter-bootstrap-rails
  * twitter-bootstrap-rails (3.2.2)
```

## 問題
twitter-bootstrap-railsでglyphiconが表示されない問題が発生。

Bootstrap3から、Halflingsと言うフォントをglyphiconの表示に利用しているため、そのフォントファイルが必要となり、かつrailsでassetとしてロードされている必要がある。

以前同じ問題に直面した時は
http://blog.10rane.com/2015/02/18/introduced-bootstrap3-to-rails4/
このあたりの情報を参考にして解決したが今回は解決せず、
よくよく見たらgemと一緒にフォントファイルがすでに取得されていたため、5.の方法で解決した次第。

gemのバージョンによるのかフォントファイルがセットになっている場合となっていない場合があるので、解決方法が２つに分かれるっぽい。

**余談**
Herokuにアップした時にどうなるか不安。ひょっとしたら、

```config/initializers/assets.rb
config.assets.precompile +=  %w( *.woff *.eot *.svg *.ttf )
```
を追加して

```
$ rake assets:precompile
```
をしないとダメかも。（少なくとも前回はそうだった）
qperf で CentOS7 で InfiniBand の性能を測定する

漢なら CentOS7 で InfiniBand ですよね!

最近では qperf というのでお手軽に性能測定できるようになりましたので試してみましょう.

InifiniBand ドライバや IPoIB など一式セットアップ済みを仮定します.

## qperf

qperf を入れます.

    $ sudo yum install qperf

## ポート開放

CentOS7 デフォルトだとポートが開放されていないので, qperf 用にポートを開けます(firewall サービスを仮定します)

10000 ~ 10010 までのポートを開放します.

    $ sudo firewall-cmd --add-port=10000-10010/tcp --permanent

## 測定

サーバで qperf を動かします.

    $ qperf --listen_port 10000

クライアントで qperf を動かします. server の ip(IPoIB) が 172.24.0.8 とします.

    $ qperf --listen_port 10000 172.24.0.8 rc_rdma_read_bw
    rc_rdma_read_bw:
        bw  =  1.56 GB/sec

Voala! お手軽に計測できました.

測定できる項目はいくつかあります. お好みでどうぞ.

Happy RDMA measurement!

``` 
$ qperf --help tests
Miscellaneous
    conf                    Show configuration
    quit                    Cause the server to quit
Socket Based
    rds_bw                  RDS streaming one way bandwidth
    rds_lat                 RDS one way latency
    sctp_bw                 SCTP streaming one way bandwidth
    sctp_lat                SCTP one way latency
    sdp_bw                  SDP streaming one way bandwidth
    sdp_lat                 SDP one way latency
    tcp_bw                  TCP streaming one way bandwidth
    tcp_lat                 TCP one way latency
    udp_bw                  UDP streaming one way bandwidth
    udp_lat                 UDP one way latency
RDMA Send/Receive
    rc_bi_bw                RC streaming two way bandwidth
    rc_bw                   RC streaming one way bandwidth
    rc_lat                  RC one way latency
    uc_bi_bw                UC streaming two way bandwidth
    uc_bw                   UC streaming one way bandwidth
    uc_lat                  UC one way latency
    ud_bi_bw                UD streaming two way bandwidth
    ud_bw                   UD streaming one way bandwidth
    ud_lat                  UD one way latency
    xrc_bi_bw               XRC streaming two way bandwidth
    xrc_bw                  XRC streaming one way bandwidth
    xrc_lat                 XRC one way latency
RDMA
    rc_rdma_read_bw         RC RDMA read streaming one way bandwidth
    rc_rdma_read_lat        RC RDMA read one way latency
    rc_rdma_write_bw        RC RDMA write streaming one way bandwidth
    rc_rdma_write_lat       RC RDMA write one way latency
    rc_rdma_write_poll_lat  RC RDMA write one way polling latency
    uc_rdma_write_bw        UC RDMA write streaming one way bandwidth
    uc_rdma_write_lat       UC RDMA write one way latency
    uc_rdma_write_poll_lat  UC RDMA write one way polling latency
InfiniBand Atomics
    rc_compare_swap_mr      RC compare and swap messaging rate
    rc_fetch_add_mr         RC fetch and add messaging rate
Verification
    ver_rc_compare_swap     Verify RC compare and swap
    ver_rc_fetch_add        Verify RC fetch and add
```
既存のディレクトリをSourceTreeに追加＆リモートにも作成

忘れそうなので


1. 「新規リポジトリ」→「ローカルリポジトリを作成」
2. 「保存先のパス」を既存のディレクトリに指定して「リモートリポジトリも作成」にチェック
3. 名前等を自由に設定して「作成」
4. おわり