OmniAICreator/Qiita-1.07M huggingface dataset:
シェルの echo -e  \b ってどういう時に使うんだ？

CommandLine-Fuでなんだこれというのを見つけたので...

# echo の \b
```shell-session
[dharry@frank ~]$ echo -e ''$_{1..80}'\b+'
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
```

ファッ！？
プラス '+' が 80個ってどういうことよ。

# 解説

echoコマンドの -e は バックスラッシュでエスケープした文字を解釈させるオプション。
echoコマンドの -e \b は バックスペースの意味

```shell-session
DESCRIPTION
       -e     enable interpretation of backslash escapes
       \b     backspace
```


このバックスペースって何よ？っというのは、普通にバックスペースしているってこと。文字1つ削れるよ。

```shell-session
[dharry@frank ~]$ echo -e '123'
123
[dharry@frank ~]$ echo -e '12\b3'
13
```

で、なぜか、最後に\bを入れてもダメ。不思議。後ろにスペースを入れないといけない。

```shell-session
[dharry@frank ~]$ echo -e '12'
12
[dharry@frank ~]$ echo -e '12\b'
12
[dharry@frank ~]$ echo -e '12\b '
1
```

中身みると、バックスペース(0x08)入れてるっぽい。制御文字を出すようにcatするとC-Hが表示される。
なるほどねー。イメージとしては手で高速に入力して最後にバックスペースを入れてエンター押されているような感じだね。

```shell-session
[dharry@frank ~]$ echo -e '12\b' | hexdump -C
00000000  31 32 08 0a                                       |12..|
00000004
[dharry@frank ~]$ echo -e '12\b' | cat -v  hoge.txt
12^H
```

じゃあ、CommandLine-Fuのやつに戻って。
{1..80}はよく使うブレース展開 (brace expansion) ってやつですね。ホント便利。
ブレース展開の前後に文字つけてあげれば、それ付きで展開される。でも、通常のブレース展開だけだと、展開したものはスペースが入ってしまう。

```shell-session
[dharry@frank ~]$ echo -e ''$_{1..80}'\b+'
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

[dharry@frank ~]$ echo {1..5}
1 2 3 4 5

[dharry@frank ~]$ echo {1..5}+
1+ 2+ 3+ 4+ 5+

[dharry@frank ~]$ echo hoge{1..5}
hoge1 hoge2 hoge3 hoge4 hoge5
```

じゃあ、\bでスペースを削ってあげればいいんだ...でもうまくいかない...
ああ、そうか、ブレース展開した文字の変数を作り、その変数をechoしてNullStringとして出力されればいいじゃん。

```shell-session
[dharry@frank]~% echo {1..5}'\b+'
+ + + + +
[dharry@frank]~% echo {1..5}'\b+ '
+  +  +  +  +

[dharry@frank ~]$ echo -e ''$_{1..5}'\b+'  | cat -v
^H+ ^H+ ^H+ ^H+ ^H+

[dharry@frank ~]$ echo -e ''$_{1..5}'\b+'
+++++
```

# 結論
というので、CommandLine-Fuのワンライナーは ブレース展開をNullStringで出力して、バックスペースで消していました。
$_{1..5} と アンダーバーを使っているけど、このアンダーバーは何でもよくて、代入されていない変数であればいいです。

```shell-session
[dharry@frank ~]$ echo -e ''$hoge{1..5}'\b+' | cat -v
^H+ ^H+ ^H+ ^H+ ^H+

[dharry@frank ~]$ echo -e ''$hoge{1..5}'\b+'
+++++
```

# 別のやつ
ここまで説明して最後にどうかと思いますが、あまりこの処理は好きじゃないです。
こっちの方が良いと思う。

```zsh
[dharry@frank ~]$ zsh
[dharry@frank]~% repeat 80 echo -n '+'; echo
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
```

```bash
[dharry@frank ~]$ seq  -s + 81 | sed "s/[0-9]//g"
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
```

```awk
[dharry@frank ~]$ echo "" |  awk '{ for(i=0;i<80;i++) printf("+"); print  }'
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
```
テンキー左置き殺法。

# 我々エンジニアにテンキー？
まず俺が使用しているbluetoothでワイアレスなテンキーについて紹介しよう。
写真はアマゾンから拝借してきた。すまん。
http://www.amazon.co.jp/dp/B00H39T2Q4
![510FdnfiRBL._SL1000_.jpg](https://qiita-image-store.s3.amazonaws.com/0/14940/92a196ee-f6eb-9910-3b78-26f91dc10aeb.jpeg)

こいつである。
なぜ今テンキーかというと使いこなせば作業効率が上がるからである。

決してエクセルで事務仕事をひたすらするなんちゃってIT系のためだけのものではない。
差別用語が出てしまった。誠にすまない。

これを純正のワイアレスキーボードの左側に隣接して使用してほしい。
サイズもぴったりなので綺麗に隣におけるはずだ。

例えばこの状態でクリップボードの履歴管理アプリを起動しショートカットを割り当てれば数字キーだけで瞬時に10個の履歴を管理できる。

他にも使っていないマックユーザーは絶対いないと言われるBetterTouchTool(http://www.bettertouchtool.net) でアプリごとにショートカットを割り当ててやると作業効率が段違いだ。
キーが増えればそれだけ使用できるショートカットが増えるということ。

ちなみにテンキーのキーはキーボード本体の同じ数字や記号のキーとは別のキーとして認識されているためテンキーのキーの数だけキーが増えることになる。

そしてなぜかこういった使い方をする場合、キーボード本体の左側に置くことで威力を発揮する。
数字キーがパッド右側に集中しているため、それらのキーへの距離が近くなるからかもしれないが、通常のテンキーの位置とは異なるため、自然に知恵を絞り新たな可能性を模索するからかもしれない。

左側に配置できるのはテンキー一体型でないからこそである。

# 秘められた力を解放する
例えばフォトショップなどを使っている方なら、テンキーを使ったショートカットがデフォルトで割り当てられているためすでに有効活用しているのかもしれないが、テンキー一体型の有線キーボードを使っていることと思う。

テンキー一体型でないものを普通に使用するとキーボード本体のコマンド、オプション、コントロール、シフトキーは別途使用するテンキーとのコンビネーションが効かないからだ。
つまりこの状態では4C1 + 4C2 + 4C3 + 4C4 = 4 + 6 + 4 + 1で例えばnum1キーに対するコンビネーションだけでも15パターンが使えていないことになる。勿体無い。

これを解決するためKarabiner(https://pqrs.org/osx/karabiner/) を導入する。
これもキーボードの仕事を割り振るためのものだがショートカットを割り振る際、優先順位としては、
· IDEなどキーのカスタマイズが細かくできるアプリのショートカットはその環境、アプリ内で設定する。
· BetterTouchToolで設定する。
· それでも割り振れないEjectキーなどメタな感じのキーはKarabinerで設定する。

まあこれがKarabinerの使い道なのだが、今回着目すべきはKarabinerはインストールしアクティブにしておくだけで複数台のキーボードのキーのコンビネーションが有効になる点だ。

同商品を購入したフォトショッパーが商品レビューにキーのコンビネーションが効かない点を書いていたが、その点はこれで解決できる。

ちなみにコマンドキーとのコンビネーションをする場合、左手親指でコマンドを抑え薬指や小指でテンキーを操作するとしっくりくる。

というわけで左置きテンキーの可能性を模索する仲間が増えることを祈って終わり。

最後に登場したアプリのインストールコマンド

```sh
brew cask install Karabiner
brew cask install bettertouchtool
```
PHPの拡張モジュールGDが動くまでの試行錯誤 [8万View達成]

# PHPの拡張モジュールGDが動くまでの試行錯誤
Linux系OSへPHP拡張モジュールのGD（画像変換モジュール）をインストールするだけで結構はまったので試行錯誤をメモ。
PHPの拡張モジュールを入れる際の確認ポイントの参考にしてみるのもいいかも。

## GDのインストール確認
phpinfo() の ConfigureCommand 項目をみると
> --without-gd

になっている。
GD欄も存在しないので入っていないらしい。

```php:phpinfo.php
<? phpinfo(); ?>
```

以下のコマンドでも確認できます。
> php -m | grep gd

## GDをインストールしてみる
> yum install php-gd

失敗。
`失敗する原因として、PHPのバージョンに合っていない、他の関連モジュールの影響で入れられないといった原因が考えられます。`

インストールできるGDが他にないか確認
> yum list | grep gd

php54-php-gd.x86_64があった。
`x86_64, amd64 は64ビット　i386, i686, x86 は32ビット`

remiリポジトリからインストール。
`「yum」のデフォルトリポジトリのパッケージが古く、最新版のパッケージをインストールしたい場合には、RPMコマンドを使って外部リポジトリを追加します。「remi」はよく使われる外部リポジトリのひとつです。`
> yum install php54-php-gd.x86_64 --enablerepo=remi

成功。

## GDのインストール確認
/etc/php.ini に以下を追記して、Apacheを再起動。
> extension=gd.so

うまく動かない。

入れなおしてみたり
> yum remove php54-php-gd.x86_64
> yum install php54-php-gd.x86_64

効果なし。
`yum remove を行う場合は、他のモジュールが使用している関連モジュールを消さないように気をつけます。`

/etc/php.d/gd.ini を作ってみてもうまく動かない。

## 拡張モジュールの確認
> ls /usr/lib64/php/modules/gd.so

拡張モジュールがなかった。ありがち。

## 拡張モジュールを探す旅にでる
色々苦戦している人を発見する。
http://xiaoxia.exblog.jp/6226189

rpmパッケージの問題？
> rpm -qa | grep gd
php54-php-gd-5.4.39-1.el6.remi.x86_64
gd-2.0.35-11.el6.i686
gd-2.0.35-11.el6.x86_64
gd-progs-2.0.35-11.el6.x86_64
gd-last-2.1.1-1.el6.remi.x86_64

うーむ、パッケージは問題なさそう。。

gd.so がどこにあるか探す
> find /usr/ -name *gd\.so*

/usr/lib64/libgd.so.3.0.0 があったので、ショートカットリンク作成
> ln -s /usr/lib64/libgd.so.3.0.0 gd.so

> php -m | grep gd
> PHP Warning:  PHP Startup: Invalid library (maybe not a PHP library) 'gd.so' in Unknown on line 0

PHPのライブラリじゃないよって怒られて、上手くいかない。

インストールした場所を調べる。
> rpm -ql php54-php-gd.x86_64
> /opt/remi/php54/root/usr/lib64/php/modules/gd.so

いた。なんでそんなところに。。
仕方がないのでショートカットリンク作成
> ln -s /opt/remi/php54/root/usr/lib64/php/modules/gd.so /usr/lib64/php/modules/gd.so

Apacheを再起動したら動きました。

## まとめ
1. phpinfo() の ConfigureCommand 項目は割とあてにならない
2. 動かないときは拡張モジュールを確認する
3. ショートカットリンクでも動く

GDなどの拡張モジュールがインストールできなくて困っている人の助けになれば幸いです。
gulp をごっくんごくごく #ESLint 編

## 環境
* OS X Yosemite 10.10.3

## 前提
* Node.js v0.11.16
* npm 2.3.0
* Gulp 3.8.11

## gulp-eslint をインストール

```
$ npm install gulp-eslint
```

## gulpfile.js のサンプル

```
var gulp = require('gulp');
var eslint = require('gulp-eslint');


gulp.task('lint',function(){
	return gulp.src(['./*.js'])
		.pipe(eslint())
		.pipe(eslint.format())
		.pipe(eslint.failOnError());
});

gulp.task('watch',function(){
	gulp.watch('./*.js',function(event){
		gulp.run('lint');
	});
});

gulp.task('default',['lint'],function(){
	gulp.run('watch');
});
```

gulpを実行

```
$ gulp
```
HelixToolkitで、MeshElement3D派生オブジェクトをClickする

##概要
HelixToolkitは、HelixViewport3Dタグの中に3Dオブジェクトが表示されます。
見た目からすると3Dオブジェクトに対して、ユーザー操作することが可能な様に見えるのですが、APIとサンプルコードを調べた限りでは、WPFのUIElement派生クラスのようなイベント操作は出来ないようです。
WPFから見ると3Dオブジェクトは、HelixViewport3Dというコントロールの上に描かれた模様に過ぎないということのようです。

##クリック位置の3Dオブジェクトを取得する方法
HelixViewport3DのMouseDownイベントを監視し下記の方法で、3Dオブジェクトの参照を取得します。

```csharp:Test.xaml.cs
private void MouseDownHandler(object sender, MouseButtonEventArgs e)
        {
            var p = e.GetPosition(this.viewport3d);
            var hit = Viewport3DHelper.FindNearestVisual(this.viewport3d.Viewport, p);

            if (hit != null)
            {
                // クリック操作
            }
        }
```
javascriptで複数のDOMを一度に追加する方法

今まで知らなかったのでメモ。

#document.createDocumentFragmentを使う

```js
var fragment = document.createDocumentFragment();

for ( var i = 0,len = data.length; i < len; i++ ) {
  var li = document.createElement('li');
  li.textContent = data[i];

  fragment.appendChild(li);
}

element.appendChild(fragment);

```

どうやら見た目には反映しないDOMツリーを生成してくれる模様。レジ袋みたいな。

>https://html5experts.jp/yoshikawa_t/1932/
Twitterで特定のキーワードが含まれるツイートをCSVで保存する

Twitterで特定のキーワードがツイートに含まれるものを、
CSVに保存するスクリプト。

```python:twitcsvfield.py

#!/user/bin/env python
# -*- coding: utf-8 -*-
from requests_oauthlib import OAuth1Session
import csv
import json
import sys, codecs

C_KEY = "*************************"
C_SECRET = "*************************"
A_KEY = "*************************"
A_SECRET = "*************************"


def Home_timeline(field):
	url = "https://api.twitter.com/1.1/statuses/home_timeline.json"
	params = {
				"lang": "ja",
				"count": "100"
				}
	tw = OAuth1Session(C_KEY,C_SECRET,A_KEY,A_SECRET)
	req = tw.get(url, params = params)
	tweets = json.loads(req.text)
	
	f = open("tweetsearch.csv" , "ab")
	writer = csv.writer(f)
	writer.writerow(["Datatime", "User", "Name", "Text", "Place"])
	
	for tweet in tweets:
		created_at = (tweet["created_at"])
		User = (tweet["user"]["screen_name"].encode("utf-8"))
		Name = (tweet["user"]["name"].encode("utf-8"))
		Text = (tweet["text"].encode("utf-8"))
		Place = (tweet["place"])
				
		if (tweet["text"]) == field:
			writer.writerow([created_at, User, Name, Text, Place])
            f.close()
		else:
            pass
		
		
	return Home_timeline


	
def Limit_Status():
	url = "https://api.twitter.com/1.1/application/rate_limit_status.json"
	params = {}
	tw = OAuth1Session(C_KEY,C_SECRET,A_KEY,A_SECRET)
	req = tw.get(url, params = params)
	if req.status_code == 200:
		limit = req.headers["x-rate-limit-remaining"]
		print ("API remain: " + limit)
	return Limit_Status


	
Home_timeline(u"テスト")
Limit_Status()

```

このサンプルでは「テスト」という文字列がhome_timelineに存在していれば保存。
例によってCSVファイルはなければ作る、あれば上書きになるので、
連続して取得するとCSVヘッダが重複するので注意。

ここから色々改変して遊べそうな気はしている。
nginxでリバースプロキシ

ssdpサーバーとhttpサーバーを共存させてUPnPを実現させたいというとき、なぜかdescriptionなどを取るためのGETメソッドは8080に対してなのに、操作系のPOST命令は80に対してしてくるコントローラーがあったので、それを捌くためにnginxでリバースプロキシしてみた。

```
/usr/local/etc/nginx/nginx.conf
```

```
        #listen       8080;
        #for reverse proxy
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
            #for reverse proxy
            proxy_pass   http://127.0.0.1:8080;
        }
```

大事なのは、for reverse proxyの部分。これで8080へのリクエストには自前のサーバーへ、80へのリクエストでもnginxを通して8080へリダイレクトされる。
Cli で　`php artisan tinker`　とコマンドを実行してDBの内容をPHPArrayな形で出力する


多分もっと簡単な方法あると思うけど、こんな感じで。

```
<?php

>>> \App\Service::orderBy('created_at', 'desc')->take(30)->get()->map(function($obj){ return $obj->toArray(); });
=> <Illuminate\Database\Eloquent\Collection #00000000407506fc000000004d667cc2> [
       [
           "id"         => 1,
           "user_id"    => 1,
           "name"       => "開発中なサービス",
           "created_at" => "2015-05-07 17:21:38",
           "updated_at" => "2015-05-07 17:21:38"
       ]
   ]
>>>
```


真中部分をコピペでDBSeederにとかとか。
php5.5.5 インストール　(phpenv+php-build)

どうもマイクラ好きのサーバエンジニアです。

今回はphp5.5.5をphpenvとphp-buildを使って、
インストール手順をメモしておきたい思います。

#### **事前に入れておく必要があるもの**
・git
・[phpenv](http://qiita.com/furifan/items/981f476eb25b7fc06469)
・[php-build](http://qiita.com/furifan/items/72628a4a59e666819309)

#### **今回インストールしていくもの**
・php5.5.5

#### **作業開始**

まず、インストールできるバージョンを確認
`# phpenv install -l`

php5.5.5があるはずなのでこいつをインストールします。
`# phpenv install 5.5.5`

インストールが完了したら、PATHを通すために以下のコマンドを実行します。
`# phpenv rehash`

次にインストール済みphpパッケージを確認します。
`# phpenv versions`

php5.5.5があるのを確認したら、php5.5.5にphpのバージョンを切り替えます。
`# phpenv global 5.5.5`

最後にちゃんとphpが使用できるか確認。
`# php -v`

念のためphpenvで切り替わってるか確認。
`# phpenv versions`
(set by パス~)
って書かれてれば完了です。

めっちゃ簡単！（記事的には素っ気ないけど）
あとはphpを使って色々遊ぶだけです！

それでは、今日はここまで！
Kibana4のVisualizationでTermsAggregationの結果をURLDecodeする方法

なんだか色々あってくっそ悩んだのでメモ。

まず以下のファイルを<code>/etc/elasticsearch/scripts</code>(elasticsearch.ymlのある場所)に置く。

```groovy:uri_decode.groovy
import java.net.*
try {
 URLDecoder.decode(_value, 'UTF-8')
} catch(e){
 _value
}
```

全てのデータノードに同じファイルを置いてから60秒ほど待つと、このスクリプトがESで参照できるようになる。

あとはKibana4のVisualizeを編集する際に、Aggregationの項目でTermsを選び、任意のFieldについてそのJSON Inputに以下を入力する。

```json
{"script_file":"uri_decode"}
```

こうすると結果が（URLDecoderがUTF-8でdecode可能な場合に）URLDecodeされて表示される。
BehaviorをCodeBehindで参照・追加する方法

##Behaviorとは
Xamlは、表示をXMLで制御をC#で記述するのが基本的な書き方です。
（もちろん.Netですので、VBやF#で記述される方も居るでしょうが、一般的にはC#が使われます）
制御は、コードビハインドやViewModelと呼ばれる領域に記述します。
Xamlは、Triggerなどを使えば、ある程度処理を記述することができますが、やはり込み入った処理を記述する事はできません。
Xamlでは書けないがコードビハインドに書くにはViewに近すぎる処理を記述する技術がBehaviorです。
イメージとしては、特定のタグ要素にプラグインするコードビハインドといった所でしょうか。
Behaviorは、下記のように指定して、親のタグ要素の機能や振る舞いを拡張します。

```xaml:Test.xaml
<helix:BoxVisual3D>
    <i:Interaction.Behaviors>
        <local:MeshElement3DFillBehavior />
    </i:Interaction.Behaviors>
</helix:BoxVisual3D>
```

##コードビハインドからBehaviorを参照する
Behaviorは、複数指定できるような仕組みになっているのですが、UIElement派生クラスが管理している訳ではないためプロパティを調べてもBehaviorを参照することはできません。
下記のようなコードを使って、BehaviorCollectionを取得して、参照します。
どうやらビューツリーとは関係ない場所に格納されているみたいですね。

```csharp:Test.xaml.cs
var collection = System.Windows.Interactivity.Interaction.GetBehaviors(parent);
```

##コードビハインドからBehaviorを追加する
BehaviorCollectionへBehaviorを追加してやるだけです。

```csharp:Test.xaml.cs
var collection = System.Windows.Interactivity.Interaction.GetBehaviors(parent);

collection.Add(new MeshElement3DFillBehavior());
```
3D 基礎メモ1

※まだ途中

3D周りの基本的なことのまとめ

# 用語
|用語|説明|
|---|---|
|モデル|立体データのこと|
|ポリゴン数|3Dモデルを構成している三角形または多角形の数です|
|骨格・BONE|ポーズやアクションをさせるために必要なデータ|
|テクスチャ|3Dモデルに張り付ける画像|
|リグ|3Dモデルの物体構造を設定する機能|
|法線マップ|ポリゴンの向き(法線)の値を色のRGBでの表現にに変換したテクスチャ|
javascript小技集

実務で使う機会なんてあるか分からないけど、紹介します。


#【変数同士の値交換時に新しい変数を使わない】
```js
var x = 50,y = 100;
x = [y,y = x][0];
```

#【配列をループさせるスムーズな書き方】
```js
for(var i = 0,item;item = data[i++];) //配列が空か0だと終了
```

#【最大値を超えない数値の増加】
```js
var str = 'Hello';
var num = 0,str_len = str.length;
num++;
num %= str_len; //5以上なら0になる
```

#【奇数の判断高速化】
```js
var i = 1;
if(i % 2) /* ⇒ */ if(i & 1) //2進数で判断させる
```

#【Null, Undefined, Emptyのチェック】
```js
var i;
if(i || "") //上記と0以外ならtrue
```

#【0と1の入れ替え、またboolの入れ替え】
```js
var num = 0;
num ^= 1; //0⇒1
num ^= 1; //1⇒0
var bool = false;
bool = !bool; //true⇔false
```

三項演算子とかは皆さんご存じかと。色々あっても他人が知らないと使っても意味ないですね。
ESLint で console.log の  error 回避

ブロックコメントに eslint-disable no-console を入れる

```js

/* eslint-disable no-console */

(function(window){
  "use strict";

  var console = window.console;
  var hasConsole = typeof console !== "undefined";
  if(hasConsole){
    console.log('hoge');
  }
}(this));
```

※ 使うことないけどね！
rubyで該当するIPアドレスが含まれているか比較する方法


```ruby
require 'ipaddr'
ipaddr = IPAddr.new("192.168.1.0/24")
ipaddr.include? "192.168.1.1" #=> true
ipaddr.include? "192.168.2.1" #=> false
```


参考: http://docs.ruby-lang.org/ja/1.9.3/class/IPAddr.html
railsめも（gemの追加）

railsプロジェクトでのgemの追加方法メモ

1 プロジェクトルートの"Gemfile"に取得対象のGemfileを追加。
以下のように記載する。

```Gemfile
gem 'twitter'
gem 'omniauth-twitter'
```

2 以下コマンド実行して取得。
bundle install --without
css z-indexとtranslateY を同時に使うとうまくいかない。

一緒に使わない書き方をすれば、この問題は一発で解決するけど、
原因がわからずに少し詰まったのでメモしておく。

# サンプルコード

https://jsfiddle.net/akiho/t9rvsonu/

```html:html
<ul>
    <li>text1<span>remove</span></li>
    <li>text2<span>remove</span></li>
</ul>
```

scss(css)です。

```scss:css
ul {
    li {
        transform: translateY(30px);
        width: 100%;
        position: relative;
        span {
            position: absolute;
            width: 50px;
            height: 20px;
            top: 100%;
            left: 0;
            z-index: -1;
            opacity: 0;
            background: red;
        }
        &:hover span {
                z-index: 1;
                opacity:1;
            }
    }
}
```

# やりたかったこと。

```li```をhover したときにspan要素を表示させる。
上記コードの場合うまくいかない。

# translateY を削除すると期待通りの動きになった。
上記cssコードから```transform: translateY(30px);```を削除したら、期待している動きになった。
削除というか、translateY使いたい場合、ulにtransformを当てれば良い。
Androidエラー: duplicate entry: com/google/android/gms/analytics/internal/Command.class

# 問題

Android Studio でビルドしたところ、下記のエラーによりビルドが失敗しました。

```text
Error:Execution failed for task ':app:packageAllDebugClassesForMultiDex'.
> java.util.zip.ZipException: duplicate entry: com/google/android/gms/analytics/internal/Command.class
```

# 解決

メッセージが示しているように、Google Analytics のモジュールが重複していることが原因でした。

```groovy:問題のあるbuild.gradle（抜粋）
dependencies {
    ...
    compile files('libs/libGoogleAnalyticsServices.jar')
    compile 'com.google.android.gms:play-services:7.3.0'
}
```

`play-services`の中にGoogle Analyticsのモジュールが含まれているため、.jarの方と衝突してしまったようです。
Google Play Services のモジュールは分割してcompileに入れることができるので、下記のように変更しました（Google Cloud Messagingを使いたかったので、このモジュールに絞っています。）

```groovy:修正後のbuild.gradle（抜粋）
dependencies {
    ...
    compile files('libs/libGoogleAnalyticsServices.jar')
    compile 'com.google.android.gms:play-services-gcm:7.3.0' // play-services を play-services-gcm に変更
}
```

参考：http://developer.android.com/google/play-services/setup.html#split

※ Analyticsをjarで取り込んでいますが、[Maven repository](http://mvnrepository.com/artifact/com.google.apis/google-api-services-analytics)にあるので、通常はそちらを使ってください。
タッチスクリーン長押しのときにテキスト選択の色が付いてほしくない場合

よく私が使うcssとeventがこちら

#テキスト選択無効
```css
	-webkit-user-select: none;
	-ms-user-select: none;
	user-select: none;
```

#ハイライト透明
```css
	-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
	-ms-tap-highlight-color: rgba(0, 0, 0, 0);
	tap-highlight-color: rgba(0, 0, 0, 0);
```

#タッチスクロール禁止 
```css
	-webkit-touch-action: none;
	-ms-touch-action: none;
	touch-action: none;
```

#テキスト選択禁止
```js
element.addEventListener("selectstart", function(e) { e.preventDefault(); }, false);
```

完璧というわけではないが、少なくともマシな動作にはなるのかと
iptables あれこれをここに記す


* 行番号を表示

	```sh
/sbin/iptables -L -nv --line-number
	```

* 行番号でルールを削除

	```sh
/sbin/iptables -D INPUT "$NUM"
	```

* stringで弾く

	```sh
/sbin/iptables -I INPUT -p tcp -m string --string "www.hoge.com" --algo bm --dport 80 --to 128 -j REJECT
	```
Railsでcssのセレクタ数が4096を超えた場合の対処方法


IE9でもそれなりに見えていたので全然気づいてなかったのですが、セレクタ数がとうの昔に4096個を超えていて崩れがあったので、対処した際のことを書いておこうと思います。

## application.css.scssに定義されたセレクタ数を調べる

まずはセレクタ数が超えているかどうかを数えなければなりません。

参考URL
[CSSのセレクタ数を調べる | &lt;/gecko&gt;](http://geckotang.tumblr.com/post/62978089487/css-selector-counter)

ここに記述されていた、PHPで作られているセレクタカウンターを使いました。
ちなみに、JavaScriptのやつも試したのですが、それは数を少なく数えてしまってダメでした。

http://snippet.bevey.com/css/selectorCount.php

ここのフォームに対して、railsが作っているapplication.cssをアップロードしてみます。

私の場合は5000個近くなっていました…。

## cssを分割するgem css_splitterの導入

最初は`@import`するcssを分けようとしたのですが、sassの変数の参照が切れたりして全然捗らなかったので、早々にやめてgemを探しました。cssを分割するgem、なんかあるだろうと思って調べたら、ありました。

[github: zweilove/css_splitter](https://github.com/zweilove/css_splitter)

今回はこれを使います。

### インストール

まずはGemfileに追加。

```rb:Gemfile
gem 'css_splitter'
```

インストール。

```Bash
bundle install
```

### ファイルの編集

#### assets/stylesheets以下

application_split2.css.scssを作り、application.css.scssを読み込みます。

```scss:application_split2.css.scss
@import 'application';
```

#### config/application.rb

assets_precompileの対象に、application_split2.cssを追加します。
ここの拡張子はcss.scssではなく、cssのみです。お間違いなく。

```rb:config/application.rb
config.assets.precompile += %w(application_split2.css)
```

#### レイアウトファイル(application.html.slimなど)

最後に、レイアウトファイルを編集します。

まずは以下の行を削除します。

```slim:views/layouts/application.html.slim
= stylesheet_link_tag "application", media: "all"
```

次に、以下の行を追加します。

```slim:views/layouts/application.html.slim
= split_stylesheet_link_tag "application", media: "all"
```

やっていることは、`split_`を追加しているだけです。

## 結果

こうすると、IE9以下の場合だけsplitしたcssを読み込もうとします。
以下、実際に出力されたhtmlです。

```html
<link rel="stylesheet" media="all" href="/assets/application-20493ad8c8f67b5f167a6a711cc28574.css?body=1" />
<!--[if lte IE 9]>
<link rel="stylesheet" media="all" href="/assets/application_split2-419c245f7f2b698abe79ebfb002f23d7.css" debug="false" />
<![endif]-->
```

IE9でアクセスしたところ、レイアウト崩れが解消されたので、これでよしとします。
railsで特定ファイルのmigrationを実行したいとき

rails db:migrateを使って特定のファイルのmigrationだけ実行する方法を探していたところ、railsコマンドを使うのではなくコンソールからやってしまう方法を見つけたのでメモ

```
$ rails console
require Rails.root + 'db/migrate/20150508000000_add_some_index.rb'
AddSomeIndex.new.migrate(:up)
```

特定のファイルのmigrationを取り消す場合は、下記のようにする。

```filename:
AddSomeIndex.new.migrate(:down)
```

ちなみに前提としているmigrationファイルは例えばこんな感じ

```lang:migration_sample.rb
class AddSomeIndex < ActiveRecord::Migration
  def change
    add_index :some_models, :hoge_id, :unique => true
    add_index :some_models, :hoge_flag
  end
end
```
Linux のコマンドラインでオフライン英和辞書

「英単語の意味を調べようとブラウザ開いてぐぐったら2秒以上かかって、イライラしてPCを蹴ったらバタフライ効果で地球が消滅した」といった事態を未然に防ぐための記事。考え方によってはこの記事が地球を救ったとも言える。

「なんか apt-get で取れるいい感じの英和辞書があるだろう」と思ったけど意外にも見つからないので、それなら英単語とその意味だけがズラズラ載ってるテキストファイル無いかな、と思って探したらあった。

[GENE95 辞書](http://www.namazu.org/~tsuchiya/sdic/data/gene.html)

デフォルトでは SHIFT-JIS なので UTF-8 にしておく。

```
$ nkf gene.txt > gene-utf8.txt
```

行数は114742行、ファイルサイズは 3.3MB (UTF-8化後)。一部を抜粋すると

```
clamorously
騒がしく 
clamour
さわぎ,怒号
clamp
とめ金,留め金,締め具
clamp down
弾圧する 
clampdown
弾圧,締付け,取り締り 
clan
一族,一味,仲間
```

こんなかんじ。あとはみんな大好き `grep` を使えば簡易辞書の完成である。 `.bashrc` あたりに

```bash:.bashrc
function dict() {
    grep $1 /path/to/gene.txt -A 1 -wi --color
}
```

と書く。`-A 1`, `-w` `-i` はそれぞれ「該当部分とその次の行を表示」「単語単位で検索」「大文字小文字を区別しない」の意味。使い方はこんな感じ。

```
$ dict bash
bash
1.大打撃,2.たたく,強烈に非難する
bash one's head against a brick wall
(不可能なことをやろうとして)無駄骨を折る
```

bash 大打撃。
デッドロック発生時にリトライ

## はじめに

PlayFramework（Java)でEbeanを使って開発をしていると、1回くらいはこの例外を見る羽目になるのではないかと思います。

```
javax.persistence.PersistenceException: Query threw SQLException:ERROR: デッドロックを検出しました
```

そう、**デッドロック**です。

完全に回避は難しいので、デッドロックが発生したら一定回数のリトライをしたいところです。
今回は、既にそれなりに開発が進んでしまった後だったこともあり、
リトライを行うヘルパークラスを作って、そこにトランザクション管理を行っている層の関数を渡すという形で対応しました。
### リトライを行うヘルパークラスを作る

```java:DeadLockRetryHelper.java
import java.sql.SQLException;
import java.util.concurrent.Callable;
import javax.persistence.PersistenceException;

/**
 * デッドロックを検知してリトライします。
 */
public class DeadLockRetryHelper {

    private static final int DEFAULT_RETRT_MAX = 3;
    private static final int DEFAULT_DELAY = 1;
    private static Exception lastException = null;

    public static <T> T retry(Callable<T> callable) throws Exception {
        return retry(callable, DEFAULT_RETRT_MAX, DEFAULT_DELAY);
    }

    public static <T> T retry(Callable<T> callable, int maxRetryCount, int delaySeconds) throws Exception {
        int count = 0;
        while (count <= maxRetryCount)
        {
            try
            {
                return callable.call();
            }
            catch (Exception e)
            {
                if (isRetryable(e))
                {
                    try 
                    {
                        Thread.sleep(1000);
                    } catch (InterruptedException ie) {}

                    count++;
                    lastException = e;
                }
                else
                {
                    throw e;
                }
            }
        }

        // リトライ限界を超えた場合
        throw lastException;
    }

    /**
    * リトライ対象の例外か判別して返します。
    */
    private static boolean isRetryable(Exception e) {
        Throwable cause = e;
        final int CASE_LOOP_MAX = 3;
        int loopCount = 0;

        do
        {
            if(CASE_LOOP_MAX < loopCount)
            {
                break;
            }

            cause = cause.getCause();

            if (cause instanceof SQLException && (
                "40001".equals(((SQLException)cause).getSQLState())
                    || "40P01".equals(((SQLException)cause).getSQLState())))
            {
                return true;
            }

            loopCount ++;

        } while(cause != null);

        return false;
    }
}
```
### ヘルパークラスにトランザクション管理をしている層の関数を渡して実行する

```java:SampleController.java
DeadLockRetryHelper.retry( () -> XXXXController.updateUser(param1, param2);
```
selenium IDEでテストケースを作成してテストを行う。

# selenium IDEでテストケースを作ってテストをしてみた。
Webのプログラミングで~~めんどくさい~~ かなり手間になるのは、ブラウザ上のテストだと思う。
プログラム自体をUnit-Testする方法もある。しかし、プログラムの変更はほぼなしで環境の変更などの場合は
ブラウザテストを行うことになると思う。
そんなわけで、ブラウザテストを自動化してみた。
FireFoxユーザなのselenium IDEが使えるため、selenium IDEでテストケースを作ってテストしてみた。

## アドオンのダウンロード
http://release.seleniumhq.org/selenium-ide/2.9.0/selenium-ide-2.9.0.xpi
FireFoxで上記のアドレスにアクセスするとDL,インストールダイアログがでるのでそれにしたがってインストールを行う。

## selenium IDEを使う。
ツール→selenium IDE または ctrl+alt+Sでselenium IDEが開く。
![sel1.JPG](https://qiita-image-store.s3.amazonaws.com/0/57634/41e97247-a8ea-fdb4-b423-8b6d648cc00d.jpeg)

## 自動で記録する
テスト対象のページにいって、録画ボタン(赤丸)を押すとブラウザ上の動作が記録できる。
ここをクリックして、このページに飛んで・・・のような画面遷移系のテストの場合はこの機能を使うのがかなり楽。
![sel1_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/57634/d2727641-b1ea-f139-3d30-e56c7088c706.jpeg)



## テストパターンを追加する。
自動で遷移しても正しいページに飛んでいるかわからない。(もしかすると404ページに飛んでいるかもしれない。)
テスト中目視でずっと確認しててもいいけど、自動化した意味が薄れるので、目的のページに飛んでいるかを確認する。
ここではassertTextPresentを使って、特定の文字列が表示されたかの確認をする。

追加したいコマンドの前で右クリック→コマンドを挿入をすると、空のコマンドが挿入される。
コマンドに assertTextPresent
値に　特定の表示されていてもらいたい文字列を入れておく
すると、その文字列が表示されているかのチェックができる。

## waitする
画面遷移が高速に行われてしまい、Webページ側のレスポンスが完了していないと、
表示文字列の判定で引っかかる場合が多い。
seleniumはwebページからのレスポンスタイムを考慮してくれないので、
適宜waitさせる必要がある。
waitのコマンドは　pauseで値は pause_time (ミリ秒)
である。

![s3.JPG](https://qiita-image-store.s3.amazonaws.com/0/57634/2c7cecea-0624-2973-8dc6-cd046ee16bf0.jpeg)

## テストの実行
図上の緑三角を押すとテストが実行される。
テストが通らない場合赤くなる。
![s4_aka.JPG](https://qiita-image-store.s3.amazonaws.com/0/57634/f2109032-ba8d-71f7-74bc-cdeb4b1841f9.jpeg)

## 参考文献
https://codezine.jp/article/detail/7456
http://www.qript.co.jp/blog/technique/1691/
jQuery: CSSクラスの追加有無をboolで切り替える

## 追記：5/9

> smzk 2015/05/08 13:47
> それもtoggleClassで出来ますけど。
> $('.aaa').toggleClass('myclass', ok);

Oh... たしかに toggleClass でできました。ありがとうございます。参照していた情報が古かった（？）っぽ。

## 辛いこと
```js
if(ok){
    $('.aaa').addClass('myclass');
}
else{
    $('.aaa').removeClass('myclass');
}
```
こういうのが辛い。

## やりたいこと
```js
$('.aaa').enableClass('myclass', ok);
```
こう書きたい。

## jQuery拡張
```js
(function($) {
    $.fn.enableClass = function(className, enabled){
        if(enabled){
            this.addClass(className);
        }
        else{
            this.removeClass(className);
        }
        return this;
    };
})(jQuery);
```

enableClass というメソッドを追加した。これで前述の「やりたいこと」のコードが意図通り動くようになる。


## 補足
今回の例の条件 ok が $('.aaa').hasClass('myclass') である場合には、わざわざメソッド拡張せずに toggleClass を使えば良いです。
mysqldumpはこうした方がいいね

1. オンラインでバックアップを取る必要がある場合はロック出来ないので以下で！

	```sh
DB=fuga
MYSQL_PWD=password
mysqldump -h example.jp -u hoge --force --single-transaction --quote-names --default-character-set=binary --compress --add-drop-database --add-drop-table --databases $DB --log-error=$DB.log | gzip > $DB.gz
	```
	* dump取得後にgzip圧縮もしてる
	* ```--result-file=file_name, -r file_name```このオプションで出力を指定していると、エラーが起きた場合、ファイルが空で作成されるのでおすすめしない。
JavaのString生成方法がボトルネックになるのは本当か？検証

**前書き**
JavaのString生成方法がボトルネックになっていた話
http://www.scutum.jp/information/waf_tech_blog/2015/05/waf-blog-043.html
を読んで、本当か検証してみました。

**Gist**
https://gist.github.com/suzukitadashi/e4903c48319ffbbdf060
(Gistのコードを直で表示するのってどうやるの…？)


**結果**
一部見慣れないエンコードを指定しているので、遅くなっている場合もあり。

--------------------------------
CharsetCache.java
String(byte[] bytes, String charsetName) を使ってエンコードするバージョン

1回目
charset1    :73985459
charset1_1  :115044779
charset2    :91493051
charsetSame :274549442

2回目
charset1    :78754773
charset1_1  :118470847
charset2    :152582551
charsetSame :288952238

3回目
charset1    :69958835
charset1_1  :105426536
charset2    :148953705
charsetSame :303839895

--------------------------------
CharsetCache2.java
Charsetのインスタンスを予め生成しておき、それを使うバージョン。
※Blogに書かれている改善方法はこれだと思うが、間違っていたら指摘お願いします。

1回目
charset1    :66443819
charset1_1  :109843476
charset2    :62249249
charsetSame :119483800

2回目
charset1    :62851050
charset1_1  :93634654
charset2    :111577347
charsetSame :102624350

3回目
charset1    :65635508
charset1_1  :105505531
charset2    :67323351
charsetSame :114391661

--------------------------------
CharsetCache3.java
String(byte[] bytes, Charset charset) を使うバージョン。
CharsetCache2.javaとの違いはインスタンスを使いまわすか否かの違いのみ。

1回目
charset1    :74202855
charset1_1  :93675397
charset2    :108383603
charsetSame :214416604

2回目
charset1    :93722048
charset1_1  :133478243
charset2    :85850738
charsetSame :256129663

3回目
charset1    :71849455
charset1_1  :98108820
charset2    :114822097
charsetSame :217951214

**結論**
Blogに書かれているように、Charsetのインスタンスを前もって作って置くやり方は早い！
es5のforEachって高速なの？

es5でいろいろ関数追加されたので、underscoreとかjqueryよりもこっちを使ったほうが高速なのかなとかれこれ一年ぐらいもやもやしていたので調べてみた。

# 検証してみた

## 検証コード

```js
  var array = [];
  var i = 0;

  for (i;i<100000;i++){
    array.push("hoge"+i);
  }
```
forEach

```js
  console.time("forEach");
  array.forEach(function(item){
    item = item + "aaa";
  });
  console.timeEnd("forEach");
```

_.each

```js
  console.time("_each");
  _.each(array,function(item){
    item = item + "ccc";
  });
  console.timeEnd("_each");
```

for

```js
  console.time("for");
  for (i;i<100000;i++){
    array[i] = array[i] + "bbb";
  }
  console.timeEnd("for")
```

### 検証環境

Chrome 42.0.2311.135 (64-bit)
CPU 2.7 GHz Intel Core i5
OS Mac OS X 10.10.2


## forEach

28.434
20.039
39.702
20.401
27.185

avg 27.1522ms

## _.each

_.each
25.686
18.825
22.195
20.494
18.763

avg 21.1926ms

## for

0.007
0.008
0.008
0.01
0.008

avg 0.0082

forEachけっこう遅いですね。
underscoreのeachのほうがまだちょっと速いぐらい。

クロージャつくらないforがダントツで高速でした。
予想はしていましたがダントツすぎてびびりました。

## 追記

コメントで教えてもらいましたが
forEachが_.eachより遅いのはdeleteされた配列はスキップしてくれるからです。

_.eachやforの場合、中身があろうがなかろうが、
indexを参照します。

```js
var arr = [1,2,3,4];
delete arr[2];

//1,2,4が出力
arr.forEach(function(v){console.log(v)});
```

用途に応じて使い分けるのがよさそうですね。
SpectaでiOSアプリのUnitTestをしてみる

## spectaとは

- TDD / BDD用の軽量テストフレームワーク
- [Cocoapodsのガイド](https://guides.cocoapods.org/making/using-pod-lib-create.html)で推奨されていた

## install

[SpectaのGithub](https://github.com/specta/specta)

- pod lib createコマンドでテストフレームワークを選ぶところがあるのでspectaを選べばインストールされる
- そうじゃなくても、PodfileにSpectaを追加すればよし

## テストを書く

[SpectaのReadme](https://github.com/specta/specta)を参考にする

- before/afterの設定もできる
 - beforeEachの中にテストを書いてみたけど、Test navigatorに反映されてないから書かないほうがいい...?
- OHHTTPStubsを使ってスタブのテストを書いてみた例
 - PodfileにOHHTTPStubsも追加している

```objective-c
#import <Specta/Specta.h>
#import <OHHTTPStubs/OHHTTPStubs.h>

SpecBegin(StubTest)

beforeAll(^{
    
    NSDictionary *responseDic = @{@"key":@"value"};
    NSData *jsonResponse = [NSJSONSerialization dataWithJSONObject:responseDic options:0 error:nil];
    
    //CreateStub
    // Objective-C
    [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) {
        return [request.URL.absoluteString isEqualToString:@"https://example.com/2013-09-01/classes/Test"];
    } withStubResponse:^OHHTTPStubsResponse*(NSURLRequest *request) {
        return [OHHTTPStubsResponse responseWithData:jsonResponse
                                          statusCode:200
                                             headers:@{@"Content-Type":@"application/json"}];
    }];
});

describe(@"OHHTTPStubs", ^{
    it(@"should return stub response", ^{
        NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://example.com/2013-09-01/classes/Test"]];
        NSHTTPURLResponse *response = nil;
        NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
        expect([NSJSONSerialization JSONObjectWithData:responseData
                                               options:NSJSONReadingAllowFragments
                                                 error:nil]
               ).to.equal(@{@"key":@"value"});
    });
});

afterAll(^{
    [OHHTTPStubs removeAllStubs];
});

SpecEnd
```

- 値を検証するmatcherにはexpectaを使っている
 - 利用できるmatcherの種類は[Readme](https://github.com/specta/expecta)で確認できる

## テストを実行

XcodeのProduct / Testを実行すると、テストが実行されます。

### Test Navigaterの表示がリセットされない

- Xcode6.2での話
- プロジェクトを再度開かないと削除したテストケースはクリアされない。。。?

## テストクラス用テンプレートを作る

- テンプレートをXcodeに追加してくれるリポジトリがあった
 - [Specta-Templates-Xcode](https://github.com/Rebirthble/Specta-Templates-Xcode)
- git cloneして、テンプレートファイルを編集

```
vim Specta\ Spec.xctemplate/___FILEBASENAME___.m
```

import文を書き換えたのですが、
別に変更しなくてもいいかもしれないです。。。

```objective-c
//
//  ___FILENAME___
//  ___PROJECTNAME___
//
//  Created by ___FULLUSERNAME___ on ___DATE___.
//  Copyright ___YEAR___ ___ORGANIZATIONNAME___. All rights reserved.
//

//import文をちょっと変更
#import <Specta/Specta.h>
#import "___VARIABLE_testedClass___.h"


SpecBegin(___VARIABLE_testedClass___)

describe(@"___VARIABLE_testedClass___", ^{
    
    beforeAll(^{

    });
    
    beforeEach(^{

    });
    
    it(@"", ^{

    });  
    
    afterEach(^{

    });
    
    afterAll(^{

    });
});

SpecEnd

```

- ./install-templates.shを実行

新規ファイル作成時にSpectaを選択すると、
テスト対象のクラス名を入力してSpecファイルを作成できるようになる
PythonでPILを使用してExifから欲しいデータだけを抜き出す

お前の写真は偽物だ！
という疑念がわいた時、たいていスマホでとった写真にはExifデータがあるはず。
Twitterなどで時系列が疑わしい写真を解析したり、
そういうことに色々使えるんじゃないかなとか。

```python:pilexif.py

#!/user/bin/env python
# -*- coding: utf-8 -*-
import sys
from PIL import Image
from PIL.ExifTags import TAGS, GPSTAGS

def get_exif(file,field):

	img = Image.open(file)
	exif = img._getexif()

	
	exif_data = []
	for id, value in exif.items():
		if TAGS.get(id) == field:
			tag = TAGS.get(id, id),value
			exif_data.extend(tag)

	
	return exif_data

my_img = "sample.jpg"
print get_exif(my_img,"DateTimeOriginal")

```

最後のprintで渡している箇所を書き換えると特定データのみ拾える。

```
print get_exif(my_img,"DataTime")
```

```
print get_exif(my_img,"Model")
```

などなど。
heroku用のJavaプロジェクトをforemanで起動しようとしたときにエラーになる件について

# 事象
heroku用のJavaアプリケーションをIDEからではなく、foremanで起動しようとしたときに以下のエラーがでて、はまったのでメモ

最初は、slf4jのライブラリがおかしいのかと思って、googleを漁っていた。
(そこで長時間を費やす)

```
❯ foreman start web                                                                                                                                ⏎
10:40:10 web.1  | started with pid 28074
10:40:10 web.1  | Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
10:40:10 web.1  | 	at Main.<clinit>(Main.java:22)
10:40:10 web.1  | Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
10:40:10 web.1  | 	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
10:40:10 web.1  | 	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
10:40:10 web.1  | 	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
10:40:10 web.1  | 	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
10:40:10 web.1  | 	... 1 more
10:40:10 web.1  | exited with code 1
10:40:10 system | sending SIGTERM to all processes
```

# mvn cleanしてみる
`mvn clean`するとちょっと改善される

```
❯ foreman start web
11:13:28 web.1  | started with pid 28215
11:13:28 web.1  | エラー: メイン・クラスMainが見つからなかったかロードできませんでした
11:13:28 web.1  | exited with code 1
11:13:28 system | sending SIGTERM to all processes
```

# mvn clean installする
herokuの`Getting Started with Java on Heroku`を確認すると、`mvn clean install`が必要そうだ。

[Declare app dependencies](https://devcenter.heroku.com/articles/getting-started-with-java#declare-app-dependencies)

```
mvn clean install
```

起動できた。毎回これではまっているような。

```
❯ foreman start web
11:19:00 web.1  | started with pid 28257
11:19:00 web.1  | 11:19:00.471 [main] INFO  org.eclipse.jetty.util.log initialized Logging initialized @358ms
11:19:00 web.1  | 11:19:00.526 [main] INFO  org.eclipse.jetty.server.Server doStart jetty-9.2.10.v20150310
11:19:00 web.1  | 11:19:00.551 [main] INFO  o.e.j.server.handler.ContextHandler doStart Started o.e.j.s.ServletContextHandler@6093dd95{/,null,AVAILABLE}
11:19:00 web.1  | 11:19:00.583 [main] INFO  o.e.jetty.server.ServerConnector doStart Started ServerConnector@4f7d0008{HTTP/1.1}{0.0.0.0:5000}
11:19:00 web.1  | 11:19:00.583 [main] INFO  org.eclipse.jetty.server.Server doStart Started @475ms
```
bashのtrap ERRによるデバッグの落とし穴？

bashスクリプトのデバッグ手法として、擬似シグナルERRを使用して、エラー発生時にスクリプトを以下のような方法を使っていた。
（オライリーのbash本に書いてあるようでよく見かける）

`trap function ERR`

最近、サブルーチン内でのエラーが拾えずスクリプトが最後まで言ってしまう場合が場合があったので少し調べてみた。

擬似シグナルERRの条件をマニュアルで調べると

"コマンドや関数が非ゼロなリターンコードを返した場合の擬似シグナル"

サブルーチンの途中でエラーが起きてもその後のコマンドが正常終了すればサブルーチンはゼロを返してしまう。
そうすると「コマンド」や「関数」が非ゼロを返さないことになるので、trapできないのが原因か。。。納得。

いろいろ考えたが、結局サブルーチンを多用するようなbashスクリプトではERRはそぐわないと考え、暫定対処として、`set -e`を行いエラー発生時点でスクリプトを終了させ、EXITをtrapする形で対処した。

とりあえず暫定対処としてはこれでいいが、せっかくのERRが使用できず何か釈然としない。
誰か何かいい案ないですか？
define_method の中から super を呼ぶ方法

```ruby
module M
  def f
    "ok"
  end
end

class C
  include M

  define_method(:f) do
    super rescue $!              # => #<RuntimeError: implicit argument passing of super from method defined by define_method() is not supported. Specify all arguments explicitly.>
    method(:f).super_method.call # => "ok"
    super()                      # => "ok"
  end
end

C.new.f
```

試行錯誤しつつググったら、明示的に super に引数を渡せばいいようです。
(上記では引数がないことを明示)

参照
Module#define_methodとsuper
http://d.hatena.ne.jp/rubikitch/20080614/1213417931
MacにMongoDBインストール

#MacにMongoDBをインストール
##インストール
terminalで以下のコマンドを実行
```brew install mongodb
```

ログイン時に起動するよう設定
`ln -sfv /usr/local/opt/mongodb/*.plist ~/Library/LaunchAgents`

起動
`launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist`

MongoDBに接続
`mongo`

以下のWARNINGが発生。
`WARNING: soft rlimits too low. Number of files is 256, should be at least 1000`
ソフトリソースリミットサイズの警告なので、開発環境ではあまり気にしなくて良さそう。


##DB作成
sampleデータベースを作成

```
> use sample
switched to db sample
```

使用中のDBの確認

```
> db
sample
```

##コレクションとドキュメントの作成

* コレクション：RDBMSで言う所のテーブル
* ドキュメント：RDBMSで言う所のレコード

ドキュメントmembersにコレクションをinsertし、findで表示

```
> db.members.insert({"name":"test"});
WriteResult({ "nInserted" : 1 })
> db.members.find()
{ "_id" : ObjectId("554c16593e206a12d2be79b9"), "name" : "test" }
> 
```
リポジトリの更新をGit Bash を使ってGitHub にプッシュしたい

SSH keys は設定した，でも git push origin master を打つと
fatal: could not read Username for 'https://github.com': No such file or directory
と表示される．
そんな時は，以下のコマンドを打って再度 git push origin master を打つとよい．
git remote rm origin
git remote add origin 'git@github.com:username/repo.git'
[参考](http://stackoverflow.com/questions/20871549/error-when-push-commits-with-github-fatal-could-not-read-username)
携帯の場合のみ縦向き固定とする


対象の Activity で下記対応をする

```
if (isPhone(getApplicationContext())) {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}

...

public static boolean isPhone(Context context) {
    Configuration configuration = context.getResources().getConfiguration();
    if (configuration.smallestScreenWidthDp < 600) {
        return true;
    }
    return false;
}
```

android:screenOrientation のリファレンスはこちら

http://developer.android.com/guide/topics/manifest/activity-element.html#screen
ともかくDocker Registry 2.0を使ってみる

Quick start
-----------

Registry 2.0コンテナの `/tmp/registry-dev` を `-v` でマウントすれば、とりあえず使えます

```
docker run -p 5000:5000 -v /local/disk/path:/tmp/registry-dev registry:2.0
```

解説
----
本来なら `cmd/registry/config.yml` を調整した後 `docker build` するのが筋ですが、「ともかく、いますぐ、つかいたい！」って方向けのQuick startです

https://github.com/docker/distribution/blob/master/cmd/registry/config.yml にも書いてあるように、 storage/filesystem/rootdirectory に `/tmp/registry-dev` って書いてあるから、それをマウントすればOK

Docker Registry 1.0の保存先との共存
---------------------------------

Docker Registry 1.0とはディレクトリ構成がまるで違い、共存はできません
（ディレクトリを共有することはできますが、1.0でpush、2.0からpullとか、そんなことはできません）

ですので、すべてpushし直し、となります。
c++ builder XE4 > udpサーバ > echo server

受信したものをそのまま返信するエコーサーバー.

ポートは6000。
受信した文字列をそのまま返す。
SJISでやり取りする。


```cpp
//---------------------------------------------------------------------------
void __fastcall TForm1::IdUDPServer1UDPRead(TIdUDPListenerThread *AThread, const TIdBytes AData,
          TIdSocketHandle *ABinding)
{
	String rcvdStr;
	Idglobal::_di_IIdTextEncoding encSJIS;

	encSJIS = IndyTextEncoding(932);

	int init_pos = 0;
	rcvdStr = encSJIS->GetString(AData, init_pos, AData.Length);

	Memo1->Lines->Add(L"rcvd:" + rcvdStr);

	String peerIP = ABinding->PeerIP;
	int peerPort = ABinding->PeerPort;

	IdUDPServer1->Send(peerIP, peerPort, rcvdStr, encSJIS);

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
	IdUDPServer1->DefaultPort = 6000;
	IdUDPServer1->Active = true;
}
```
git checkout で error: Your local changes to the following files would be overwritten by checkoutと言われる解決方法

`git checkout`コマンドでエラーがでました。ここでは`hoge/pugiemonn`というい名前のブランチにcheckoutをしようとしています。

```bash:checkoutでエラー
git checkout hoge/pugiemonn
error: Your local changes to the following files would be overwritten by checkout:
	hoge.php
Please, commit your changes or stash them before you can switch branches.
Aborting
```
hoge.phpが変更されているために、checkoutで上書きされる可能性があるため、commitするかstashしろと書いてあります。

このような場合状況によって解決方法が変わると思いました。

# 1. commitして解決
hoge.phpが変更されているので、変更をcommitします。

```bash:変更をcommitする
git add hoge.php
git commit -m "hoge.phpを追加"
```
その後、`git checkout hoge/pugiemonn`するとcheckoutが通ります。

# 2. stashして解決
hoge.phpの変更をとっておきたいけれど、いまはcommitしたくない場合はstashします。

```bash:stashする
git stash
```
その後、`git checkout hoge/pugiemonn`するとcheckoutが通ります。

# 3. checkoutして解決
hoge.phpの変更を無効にする場合はcheckoutします。ただしcheckoutの場合はhoge.phpにあった変更は全て消えてしまいます。

```bash:checkoutする
git checkout hoge.php
```
その後、`git checkout hoge/pugiemonn`するとcheckoutが通ります。
Aurelia Breaking Change 5/1


Aurelia公式ブログに[最新の仕様変更](http://blog.durandal.io/2015/05/01/aurelia-may-status-and-releases/)についてのポストがでてきました。抄訳をここに記載します。それに伴って公式ドキュメントにも修正が入っていますが、こちらはまた翻訳次第ブログで紹介していきます。

## Changes
### ES2016 Metadata

すでに翻訳ログでも書きましたが、メタデータに代わってES7のデコレータを使うようになりました。これにより、APIを拡張する場合にベースクラスを継承する必要がなくなったため、ベースクラスが削除されています。

### Positive Side Effects

[TypeScript 1.5 Beta](http://blogs.msdn.com/b/typescript/archive/2015/04/30/announcing-typescript-1-5-beta.aspx)のアナウンスがありましたが、ここで `--emitDecoratorMetadata` というコンパイラオプションが追加されています。

これと `@autoinject()` アノテーションを使うことで、アノテーションで型を指定しなくても、コンストラクタの引数に指定されている型を自動でインジェクトしてくれます。

### Enumerations

これまで、Aureliaのフレームワーク中でEnum（ぽいもの）が幾つか使われてきましたが、これらの使い方を統一して、フレームワーク中で一貫して使うようにしました。それに伴い名前付け規則が定められ、単数形の名前をつけるようになりました。

### Naming Consistency

ライブラリ中の名前付け規則に一貫性をもたせました。
* `uri` -> `url`
* プラグインの初期化メソッド名を、Aureliaにあわせて`configure`とした。（従来は `install`)

## Routing

### Router Configuration

ルーターの設定方法が変更になっています。
以前は、ルーターをDIして、ビューモデルのコンストラクタ中でルーターを設定していました。それが、 `configureRouter` メソッドを実装するだけになりました。

これにより、子ルーターを誤って作ってしまうというような事故がなくなるとのことです。なお、ルーター階層で一番近いルーターがインジェクトされるようです。

### Route Generation

ルーターにルートURLの生成機能が追加されました。これにより、ルートをハードコードしなくてもよくなります。

ルート生成方法は、javascriptだと:

```javascript

let href = router.generate(routeName, params);
```

HTMLでは

```html

<a route-href="route: contacts; params.bind: {id:contact.id}"></a>  
```

のようになります。

### Activation Parameters

ビューモデルのフックメソッドのシグネチャが変わりました。

* 旧: `activate(params, queryString, routeConfig)`
* 新: `activate(params, config, instruction) `

paramsとqueryStringが統合され、paramsになっています。

## Status

ここ数ヶ月破壊的な変更が多かったのですが、よく利用されるAPIの変更はだいたい終わったので、これからは影響の少ない変更が多くなる予定とのことです。

### Performance

以前のリリースよりはサイズも小さく、速くなっていますが、まだまだ未着手の部分が多いです。

今後のロードマップとして、Durandalでも採用していた、view cache というビューの再利用機構の採用や、データバインディングシステムの内部実装の改良などが挙げられています。

### Continued Communication

開発プロセスが外部からよりよく分かるように、[ZenHub](https://www.zenhub.io/)の採用を行ったとのこと。開発者レベルで何を今やっているのかがわかるようになっているようです。
VBAマクロでファイル一覧を再帰的に取得するFunctionプロシージャを作成してみた。

VBAでファイル一覧を再帰的に取得するFunctionプロシージャを作成しました。
ネットの海をさまよってもSubプロシージャしか見当たらないので、これは自作するしか無いなと。

なお、FileSystemObjectを使用しているので、参照設定に「Microsoft Scripting Runtime」を設定して下さい。

##ソースコード
```vbnet:fileutil.cls
Option Explicit

Private m_fso As FileSystemObject
Private m_files As Collection

Property Get FSO() As FileSystemObject
    Set FSO = m_fso
End Property

Property Get Files() As Collection
    Set Files = m_files
End Property

' ファイル一覧を再帰的に取得する関数
' 引数： folder_path 取得する起点のフォルダ
' 引数： pattern 取得対象のパターン（正規表現）
Public Function getFileListRecursive(folder_path As String, Optional pattern As String = "") As FileUtil
    ' ファイル一覧の結果格納用
    Dim file_list_tmp As Collection

    ' ループ用変数の宣言
    Dim folder As Variant
    Dim file_path As Variant
    Dim dir As Variant
    
    ' オブジェクトの初期化
    Set file_list_tmp = New Collection
    
    ' 現在ディレクトリ内の全ファイルの取得
    For Each file_path In FSO.GetFolder(folder_path).Files
        If file_path Like "*" & pattern & "*" Then
            DoEvents    ' フリーズ防止用
            Call Files.Add(CStr(file_path))
        End If
    Next
    
    ' サブディレクトリの再帰
    For Each dir In FSO.GetFolder(folder_path).SubFolders
        Call getFileListRecursive(dir.Path, pattern)
    Next
    
    
    Set getFileListRecursive = Me
End Function

' メンバ変数の初期化
Private Sub Class_Initialize()
    Set m_fso = New FileSystemObject
    Set m_files = New Collection
End Sub

' メンバ変数の解放
Private Sub Class_Terminate()
    Set m_fso = Nothing
    Set m_files = Nothing
End Sub
```

# 使用方法

```vb.net:sample.bas
Dim fu As FileUtil
Dim file As Variant
Set fu = New FileUtil

' 結果格納用変数
Dim result As Collection

' your_path配下でsearch_patternに合致した情報を取得
Set result = fu.getFileListRecursive("your_path", "search_pattern").Files ' 第二引数を省略した場合は全取得

' ファイル一覧がフルパスで表示される
For Each file In result
  ' 好きな処理を記述
  Debug.Print(file)
Next
ドメイン取得からDDNS設定まで


# ドメインとは

ドメインとは、インターネット上にあるコンピューターを特定するために使われる、

一定のルールに従って作られた文字列のことを指します。
実は、インターネット上でコンピューターを特定しているのは、
「123.45.67.89」といった「IPアドレス」ですが、ドメインのIPアドレスと紐付くことで、
IPアドレスをいちいち覚えなくても特定のコンピューターへアクセスしやすくする役目を持っています。
よく「インターネット上の住所のようなもの」と例えられますが、
正確には「インターネット上の住所を分かりやすく見せるもの」になります。

# 早速ドメイン取得

ドメインを取得するには、「ドメイン取得業者」と呼ばれる ”ドメインの登録申請を、
代理で受け付けている事業者” を利用するのですが、
「ドメイン取得業者」は、複数存在するので、「どこで取得すればよいのか・・・」が課題になります。
そこで、代表的なドメイン取得業者の比較表を載せます。

||[お名前.com](http://www.onamae.com/)|[ムームードメイン](http://muumuu-domain.com/)|[スタードメイン](http://www.star-domain.jp/)|[バリュードメイン](https://www.value-domain.com/)|
|:-:|:-:|:-:|:-:|:-:|
|価格|◎|◎|◎|◎|
|ドメインの種類|◎|○|○|○|
|WHOIS代理公開|無料|無料|無料|無料|
|キャンペーン|多い|普通|普通|少ない|
|サポート|◎|○|○|△|
|備考|サポートに強い|初心者でも使いやすい|無料サーバーあり|上級者向け|
◎⇒良い, ○⇒普通, △⇒イマイチ

ドメイン取得業者にも色々特徴はあるのですが、
以降、[お名前.com](http://www.onamae.com/)でのドメインを取得した場合の説明となります。

# DDNS(Dynamic DNS)の設定

固定IPアドレスを取得していない回線では、
「グローバルIPアドレス」に紐づく「ホスト名（ドメイン名）」も、毎回切り替わっています。
ですが、このように毎回「IPアドレスorホスト（ドメイン）名」が切り替わっていたら、
自宅PCをサーバーとして利用することができません。(外部からドメイン名でアクセスできません。)

これの解決策として下記二点があるかと思いますが、今回はDDNSの設定方法を説明します。

* 「固定IPアドレス」を取得する
* DDNS(ダイナミックDNSサービス)によって、固定化されている「ホスト（ドメイン）名」に自宅回線のIPを紐付ける

DDNS(ダイナミックDNSサービス)は有料・無料多数ありますが、
私も愛用している「[MyDNS](http://www.mydns.jp/)」の設定を紹介します。(無料)

1. トップページ上部の「JOIN US」からユーザー登録
2. 登録したメールアドレスにMasterIDとPasswordが送られてくるのでログイン
3. 「Welcome Administratar」欄の「DOMAIN INFO」を選択
4. 下記のようにお名前.comで取得したドメイン名を「Domain」欄に入力して「CHECK」ボタンを選択
![mydns_domain_info.png](https://qiita-image-store.s3.amazonaws.com/0/53476/04762ab7-f725-0121-ecbb-0bc02b7a4c27.png)
5. 「Welcome Administratar」欄の「IP ADDRESS DIRECT」を選択
6. 下記のように自宅回線の動的IPアドレスを入力して「CHECK」ボタンを選択  
→ 自宅回線のIPアドレスを知るには[ココ](https://www.cman.jp/network/support/go_access.cgi)をクリック
![mydns_ip_address_direct.png](https://qiita-image-store.s3.amazonaws.com/0/53476/3fcc316b-c5fa-09b0-f81d-1346f3b5ee20.png)

これでDDNS([MyDNS](http://www.mydns.jp/)側)の設定は完了で、あとは[お名前.com](http://www.onamae.com/)側の設定のみです。

# お名前.comでネームサーバーをMyDNSを使用するように設定

1. [お名前.com](http://www.onamae.com/)のマイページへログイン
2. 「ドメイン設定」→「ネームサーバーの変更」→「取得したドメイン(hogehoge.com)」の順に選択
3. 「他のネームサーバーを利用」を選択し、下記のように設定  
1プライマリネームサーバー＝ns0.mydns.jp  
2セカンダリネームサーバー＝ns1.mydns.jp  
3＝ns2.mydns.jp ※設定できるなら  
![onamae_nameserver.png](https://qiita-image-store.s3.amazonaws.com/0/53476/1df2c6e4-aed5-da59-3858-1d95c7ae411b.png)
4. 最後に「確認画面へ進む」を選択後「設定する」を押下し反映  
※反映完了まで24時間から72時間程度かかる場合があります。

という流れで設定すれば取得したドメインを動的IPと結びつけることができます。
ぜひお試しを！
文字列に指定した文字列が含まれているか？

# 文字列内が複数のの文字列の何れかを含んでいるか

任意の文字列を含んでいるか？なら以下で事足りる。

```
string s = "abcdefg";
s.Contains("bcd");     // true
  
```

SQLのINのように書いてみたかったので、以下の様にしてみた。

```
    public static class GenericExtensions
    {
        public static bool Contains(this string str, params string[] param)
        {
            foreach (string s in param)
            {
                if (str.Contains(s))
                    return true;
            }
            return false;
        }
        public static bool In(this string str, params string[] param)
        {
            foreach (string s in param)
            {
                if (str.Contains(s))
                    return true;
            }
            return false;
        }
    }

    static void TestIn()
    {
        var inCause = new string[] { @"ABC", @"DEF", @"XYZ" };
        var testText1 = @"A B C DEF ZZZ";
        var testText2 = @"A B C D E F ZZZ";
        testText1.Contains(inCause);
        testText2.In("XYZ", "b");
    }
```

微妙な感じだけれども、用は足りたので、OKとしている。