OmniAICreator/Qiita-1.07M huggingface dataset:
[Objective-C] 精度の高い時間計測


パフォーマンスチェックなどで、コードレベルでさっと時間計測を行いたい場合に使うやつのメモ。

```objc
#import <mach/mach_time.h>

uint64_t start, elapsed;

start = mach_absolute_time();

// do something.

elapsed = mach_absolute_time() - start;

NSLog(@"--------- Elapsed time: %llu", elapsed);
```


```objc
#import <mach/mach_time.h>

uint64_t start, end, elapsed, elapsedNano;

static mach_timebase_info_data_t sTimebaseInfo;

start = mach_absolute_time();

// 1秒の遅延を入れる
[NSThread sleepForTimeInterval:1.0f];

end = mach_absolute_time();

elapsed = end - start;

if (sTimebaseInfo.denom == 0) {
    (void)mach_timebase_info(&sTimebaseInfo);
}

// ナノ秒に変換（10億分の1（10のマイナス9乗）秒）
elapsedNano = elapsed * sTimebaseInfo.numer / sTimebaseInfo.denom;

NSLog(@"\n-------------------------------------\n   Elapsed time: %llu \n----------------------------------", elapsedNano);
```

詳細は[Appleのドキュメント](https://developer.apple.com/library/mac/qa/qa1398/_index.html)を参照。
CakePHP3の初期設定でディレクトリを作成する

logsやtmpのように、システムが書き込み可能なディレクトリを作っておきたい場合は、`src/Console/Installer.php`の該当箇所に書いておけば、composerでインストールされた時に作ってくれる。

例：uploadsディレクトリの作成を追加する

```php:src/Console/Installer.php
class Installer
{
・・・
    public static function createWritableDirectories($dir, $io)
    {
        $paths = [
            'logs',
            'tmp',
            'tmp/cache',
            'tmp/cache/models',
            'tmp/cache/persistent',
            'tmp/cache/views',
            'tmp/sessions',
            'tmp/tests',
            'uploads'
        ];
```
Mac OS X 10.10.4 Mail.app 文字化け対処 (文字コードを utf-8 -> iso-2022-jp に設定したい)

現状、あきらめている…


Mail.app で日本語入れると
Content-Type：text/plain; charset=utf-8
utf-8 で送られる。
ISO-2022-JPでエンコードしたいが道はないのか…？

http://www.it-a.jp/2011/03/mail-trouble-mac/
defaults write com.apple.mail NSPreferredMailCharset “ISO-2022-JP”

この設定の後でもMail.appで送信しても変わっていない…

ThunderBird使うか…
CircleCIのBuildに対してSSHをしてみる手順


[CircleCI](https://circleci.com/)のビルド中におかしな挙動があったりした時に、SSH接続をして原因を探る仕組みがあるようです。
https://circleci.com/docs/ssh-build

その時に行った手順のメモ。

## 公開鍵を作成
Macならば、ターミナルから以下のコマンドを実行して、鍵を作成します。
`ssh-keygen -t rsa -C "your_email@example.com" `

基本的にはEnterを連打でOKです。（パスフレーズはなしにします）
出来上がったファイルは以下のとおり。
```
$ ls ~/.ssh/
id_rsa      id_rsa.pub  ...
```
今回できた`id_rsa.pub`が公開鍵です。（無印は秘密鍵なので注意しましょう。）


## Githubに公開鍵を登録
「 __Setting__ -> __SSH keys__ -> __Add SSH key__ 」で先ほど作った公開鍵を登録します。（コピペ）
正しく設定された場合は、以下のコマンドを実行して確認します。
```
ssh -T git@github.com
```
初回アクセスの場合はいつものが表示されますが、その後に下記のように表示されたら成功です。
```
Hi username! You've successfully authenticated, but GitHub does not
provide shell access.
```

## CircleCIのビルドをSSH付きで再実行
Githubに公開鍵を登録する前にビルドをしても、アクセスが有効になりません。（ハマりました）
ビルドの画面右上にある「 __with ssh__ 」でビルドを再実行します。この時、ビルドが終わってから30分はデバッグのためにアクセスが有効になるようです。

## ビルドが開始されたらSSHでアクセスする
ビルドの画面について「 __Debug via SSH__ 」のタブを開くと、SSHの接続コマンドが表示されています。
```
例）
ssh -p xxxxx ubuntu@xx.xxx.xxx.xx
```
こちらのコマンドをコピペすればログインすることができます。

## 気になってたこと
そもそも、何でSSHアクセスしようとしていたかというと、`gradle`のタスクの中で、`gulp`の実行がコケてしまったことでした。
ですが、よく見ると、その前に実行している`npm`や`sass`や`bower`は動いており、これはどういうことか？と気になったからでした。
結果としては、`CircleCI`のコンテナにもろもろ標準で装備されていたらしく、PATHが通っていたために実行されていたというオチでした。
（ちなみに`gulp`はありませんでしたが`grunt`は入ってました）
Windowsにxgboost(python版)をインストール

## 動作環境

Windows 7 Professional 64bit
Python 2.7.9 (Anaconda)
Visual Studio 2010 Professional

## 手順

Cドライブ直下にxgboostをダウンロード。

```
> cd c:\
> git clone https://github.com/dmlc/xgboost.git
```

`c:\xgboost\windows`に`xgboost.sln`があるので、
Visual Studioで開きリリースモードでリビルドする。
ここで`xgboostjavawrapper`では`jni.h`が必要なようだけれど
Javaから使う予定はないので`xgboostjavawrapper`をアンロードしてソリューションから除外する。

リビルドが成功したら[setup.py]を実行する。

```
> cd c:\xgboost\python-package
> python setup.py install
```

問題なくインストールできているか確認。

```
> python
>>> import xgboost as xgb
```

エラーがでなければOK。

## 参考

[xgboost/windows](https://github.com/dmlc/xgboost/tree/master/windows)
Genymotionの起動 on GUIが遅いからterminal上で直接起動してみた


# 背景
Genymotion をいちいちアプリケーションフォルダからポチって、更に仮想端末をポチる手間を省きたくなったので、terminalから一発で立ち上げるためのワンライナーを書いてみました。

#ワンライナー

```
[hogehoge@192] ~/workspace/mf_android
% VBoxManage list vms | grep -i 'SOMETHING_UNIQUE_FOR_TARGET_VD' | head -1 | perl -ple 's/^.*\{(.*)\}/$1/g;' | xargs /Applications/Genymotion.app/Contents/MacOS/player --vm-name
```

上記のSOMETHING_UNIQUE_FOR_TARGET_VDに、(Macアプリとしての)Genymotion内で表示されるvirtual devices名を指定してやればおkです。例えば、下記の状況でNexus 6を指定してやりたければ、Nexus6なりAPI 22なりNexus6.*API 22なり書けばおkです。

![スクリーンショット 2015-08-12 0.37.19.png](https://qiita-image-store.s3.amazonaws.com/0/59166/74e76c59-3226-63d2-923e-1ed216ef299e.png "スクリーンショット 2015-08-12 0.37.19.png")
Robolectricの@Config以外でtargetSDKを指定する方法


# 始めに
Robolectric3.0でテストを書き始め、その際にこうしたらいいんじゃね？的な気づきが幾つかありました。そのうち、targetSDKを指定する方法を共有させて頂きます。

# Robolectric3.0にて22が対応されない
[こちらの投稿](http://qiita.com/KeithYokoma/items/b049202a39696cadf5ec)にもある通り、Robolectric 3.0では、API Level: 22は対応していません。Android開発者の皆様も一度は"UnsupportedOperationException"を経験されたのではないでしょうか。

# 対応方法その1 -> @Configアノテーションにsdk指定
上記にも記載がある通りなのでコードは省略します。

## 対応方法の短所
上記を全テストに追記しなければいけないので、私のようなテスト書き始めの開発者はともかく、経験の長い開発者にとってはメンドくさいかと思われました。

# 対応方法その2 -> CustomTestRunnerを作る
[マニュアル](https://github.com/robolectric/robolectric/wiki/2.4-to-3.0-Upgrade-Guide)通りに設定する場合の

```FooTest.java
@RunWith(RobolectricGradleTestRunner.class)
```

ですが、RobolectricGradleTestRunner#pickSdkVersion(Config config, AndroidManifest manifest)というそのまんまのメソッドがあったのでこいつをOverrideしたカスタムクラスを作成してやりましょう。
そしてそれを@RunWith内に指定してやればおkです。

## CustomTestRunnerクラスを作る
```MyCustomRunner.java
public class MyCustomRunner extends RobolectricGradleTestRunner {

    public MyCustomRunner(Class<?> klass) throws InitializationError {
        super(klass);
    }

    @Override
    protected int pickSdkVersion(Config config, AndroidManifest manifest) {
        // SDKバージョンを指定
        return PICK_YOUR_OWN_SDK_VERSION;
    }
}
```

## @RunWithにCustomTestRunnerを指定する
```FooTest.java
@RunWith(MyCustomRunner.class)
@Config(constants = BuildConfig.class)
public class FooTest {
```

こうすればRobolectricの対応SDKが将来的に変わっても楽に対応できるかと思いました。
Markdown 形式のリンクを簡単につくれる Chrome 拡張「Create Link」が便利

![image](https://qiita-image-store.s3.amazonaws.com/0/7823/60a38b9f-c4d7-e6c9-3da4-5cd67d72e3a0.png)

Markdown に対応したサービスが増えるにしたがって、日常業務中にも Markdown 形式のリンクをつくる機会も増えてきてますね。

皆さんどうやって作ってるんでしょ。

個人的には長い間 [Create Link](https://chrome.google.com/webstore/detail/create-link/gcmghdmnkfdbncmnmlkkglmnnhagajbm?hl=ja) を愛用してます。

右クリックか、ツールバーから選ぶだけで簡単にリンクが作成できます！

```
[Create Link - Chrome ウェブストア](https://chrome.google.com/webstore/detail/create-link/gcmghdmnkfdbncmnmlkkglmnnhagajbm?hl=ja)
```

↓

[Create Link - Chrome ウェブストア](https://chrome.google.com/webstore/detail/create-link/gcmghdmnkfdbncmnmlkkglmnnhagajbm?hl=ja)


# ショートカットキーの割り当てをするとさらに便利

意外と知られてなかったりもするのですが、Chrome 拡張はショートカットキーを割り当てることができます。

設定 -> 拡張機能 -> 一番下の「キーボードショートカット」より。

![SS 2015-08-12 9.30.15.png](https://qiita-image-store.s3.amazonaws.com/0/7823/7202f457-dc4a-2890-4048-f372d8cfc93f.png)

ボクは「Ctrl + Shift + l」を割り当ててます。便利。


# 色々拡張もできる

![image](https://qiita-image-store.s3.amazonaws.com/0/7823/65273969-979b-9017-9f8e-83567a922d8b.png)

簡単にオレオレフォーマットも作れるので更に便利。
キミだけの最強のリンクを作ろう！

**利用可能な変数**

`%text%`
選択中のテキストかページの TITLE。改行は半角空白に変換される。

`%text_n%`
選択中のテキストかページの TITLE。改行はそのまま。

`%text_br%`
選択中のテキストかページの TITLE。改行は `<br />\n` に変換される。

`%title%`
ページの TITLE

`%url%`
ページの URL

`%newline%`
改行文字(\n)

`%htmlEscapedText%`
選択中のテキストかページの TITLE。
安全でない文字(&<>'")は対応する文字参照に変換される。

`%input%`
テキスト入力用のダイアログが開く。
RStudioのショートカットキー変更


**2015/12/25 追記**
我輩の希望的観測は見事にはずれた。今日新たにリリースされたRstudioのPreviewRelease(v0.99.836)では、**ショーカットキーの作成**ができなくなった。なお**ショートカットキーのキーバインド変更**は引き続きできるようなので安心した。



Rstudioの今後としては新たにAddinの形で機能を追加していく方針になりつつあるようだ。



# Rstudioのショートカットの変更
RStudioでショートカットキーの変更ができるようになったのでメモる。
なおv0.99.644からなので投稿時現在の環境ではdevelop版を使うことになる。
参考というかほぼそのまま[公式サイト]のパクリ。


## 既存のショートカットの変更
現在行までのコードを実行してくれる便利なショートカット"Ctrl + Alt + T"はTerminalを開くショートカットと
もろかぶりなので変更する。

コンフリクトもわかりやすく表示される。

＊ なお、Altキーは特殊なようで、Altキーを用いたショートカットは登録できなかったが、
　　正式リリースまでに修正されるかも（希望的観測）

## 新しいショートカットの作成

まずはショートカットキーを保存するディレクトリを作成する。

```bash:mk_sht.sh
mkdir -p ~/.R/keybindings/R/
```
このディレクトリの下にショートカットの設定を書いたRscriptを保存する。

```r:Hello.R
insert_hello <- function(content, range) {
    action <- replaceTextAction(c(0, 0, 0, 0), 
                                "# Hello, world!\n")
    userCommandResult(action)
}

registerUserCommand("hello-world-insert",
                    "Ctrl+X Ctrl+G",
                    insert_hello)

```
使用する関数は
registerUserCommand、userCommandResult、replaceTextActionで、組み合わせて作る。

ここからよくわからなかった。作ろうとしたのはpipeRのOperatorを挿入するショートカット。

```r:insert_pipe.R
insert_pipeR <- function(content, range){
  action <- replaceTextAction(range = c(0, 0, 0, 0), 
                              text = " %>>% ")
  userCommandResult(action)
}

registerUserCommand("insert pipeR oprtr",
                    "Ctrl + Alt + M",
                    insert_pipeR, 
                    overwrite = TRUE)
```
これはうまく動かない。これを実行するとスクリプトの先頭に挿入される。
みそはreplaceTextActionの引数にrangeを入れることでカーソルのある場所に挿入してくれる。

```r:insert_pipe.R
insert_pipeR <- function(content, range){
  action <- replaceTextAction(range = range, 
                              text = " %>>% ")
  userCommandResult(action)
}

registerUserCommand("insert pipeR oprtr",
                    "Ctrl + Alt + M",
                    insert_pipeR, 
                    overwrite = TRUE)
```

referenceをみてよくわからなかったが、コード本体のコメントとregisterUserCommandのdescriptionで解決。




[公式サイト]:https://support.rstudio.com/hc/en-us/articles/206382178?version=0.99.652&mode=desktop
CustomPreferenceにおける「OnBindViewListener」の作り方



CustomPreference系は **`onBindView()`以前にレイアウトが内包するWidget（ButtonやEditText）を操作しようとすると`NullPointerException`で落ちる**ので注意。


## 作成ポイント

以下のポイントをおさえておけばとりあえずOK。
（カスタムビュー自体の実装方法は省略）

* CustomPreference内に通知用Listenerの`public interface`を作成（ここでは`OnBindViewListener`）
* CallBackメソッドを追加（ここでは`onBind()`）
* `PreferenceActivity/Fragment`にCallBackListenerをimplement
* CallBackメソッド内でWidgetを操作


## カスタムビューを`attrs.xml`に登録

カスタムビューの作成をしたら、`attr.xml`への登録を行うこと。

``` attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!-- CustomButtonPreference -->
    <declare-styleable name="CustomButtonPreference">
        <attr name="android:title" />
        <attr name="android:key" />
    </declare-styleable>
</resources>
```


## （コード例）CustomButtonPreference

Button1つのCustomPreferenceのコード例。
CustomButtonPreferenceに`CustomButtonPreference.OnClickListener()`も追加したもの。
内部的には`View.OnClickListener()`を介している。

``` CustomButtonPreference.java
public class CustomButtonPreference extends Preference implements View.OnClickListener {

    private Button mButton;
    private OnBindViewListener mBindViewListener;
    private OnClickListener mClickListener;

	//-------------------------
	// コンストラクタ、View生成など
	//-------------------------
	
    @Override
    protected void onBindView(View view) {
        super.onBindView(view);

		// 「onBindView内」 でfindViewByIdを呼ぶことが大切
        mButton = (Button) view.findViewById(R.id.button);

        // onBindView終了を通知する
        // 同時にView.OnClickListenerをセット
        if (mBindViewListener != null) {
            mBindViewListener.onBind();
            mButton.setOnClickListener(this);
        }
    }

	// OnBindViewListenerのセッター（PreferenceFragment内で呼ぶ）
    public void setOnBindViewListener(OnBindViewListener listener) {
        mBindViewListener = listener;
    }

	// OnClickListenerのセッター（PreferenceFragment内で呼ぶ）
    public void setOnClickListener(OnClickListener listener) {
        mClickListener = listener;
    }

	// 内部的にはView.OnClickListenerを介してCustomClickListenerで通知する
    @Override
    public void onClick(View v) {
        if (mClickListener != null) {
            mClickListener.onClick();
        }
    }

    /**
     * 本PreferenceのBindView終了を通知するリスナー
     */
    public interface OnBindViewListener {
    	// CallBackメソッド
    	void onBind();
    }

    /**
     * 本Preferenceのボタン専用クリックリスナー
     */
    public interface OnClickListener {
    	// CallBackメソッド
        void onClick();
    }
}
```
rspecを実行した時にcannot load such file -- spec_helper (LoadError)と言われる解決方法

rspecを実行したらspec_helperが無いというエラーがでました。

```bash:rspec実行でエラー
bundle exec rspec spec/models/event_spec.rb 

/var/www/html/pugiemonn.com/spec/models/event_spec.rb:23:in `require': cannot load such file -- spec_helper (LoadError)
	from /var/www/html/pugiemonn.com/spec/models/event_spec.rb:23:in `<top (required)>'
	from /home/vagrant/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/rspec-core-3.2.3/lib/rspec/core/configuration.rb:1226:in `load'

略
```
rspec:installを実行します。

```bash:generateコマンドを実行
rails generate rspec:install
      create  .rspec
       exist  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb
```

# 再度rspecを実行
今度は成功しました。

実際にspec_helper.rbが無かったからエラーになっていたみたいです。

# 参考
http://stackoverflow.com/questions/25800122/error-when-trying-to-run-rspec-require-cannot-load-such-file-rails-helper
c++ > mutable > 同時に呼び出すかどうか?

mutableの必要性がいまいち理解できていない。
メンバ変数を変更するのであれば、メソッドからconstをはずせばいいのかと勝手に思っていた。

以下を見つけた。
http://d.hatena.ne.jp/yohhoy/20130803/p1

> Polygon::get_area()はconstメンバ関数となっているため、呼び出し側は複数スレッドから同時に同メンバ関数を呼び出すことができる（とC++11 constセマンティクスにより解釈する）。get_area()メンバ関数の内部実装では、mutableなstd::mutexオブジェクトを利用した排他制御を行っている（C++11 constセマンティクスを守るためにこう実装する義務がある）。

> 一方Polygon::append()は非constメンバ関数のため、呼び出し側はこのメンバ関数を他メンバ関数と同時に呼び出す事はない（とC++11 constセマンティクスにより制限される）。このため、cached_area_メンバ変数に対して排他制御なしに変更操作を行っている（これが安全であるとC++ constセマンティクスにより保証される）。

まだきちんと理解できていない。
理解にもう少し時間が必要だろう。
Ubuntu14.10にOCamlをインストールする

## したいこと
Ubuntu14.10にOCamlをインストールする

## 手順
インストール確認

```
$ apt-cache search opam
opam - package manager for OCaml
opam-docs - package manager for OCaml (documentation)
```

インストール

```
$ sudo apt-get install opam
```

実行してみる

```
$ ocaml
        OCaml version 4.01.0

# "あ";;
- : string = "\227\129\130"
# 
```

日本語対応

```
$ vim .ocamlinit
$ cat .ocamlinit
let printer ppf = Format.fprintf ppf "\"%s\"";;
#install_printer printer
```

実行してみる

```
$ ocaml
        OCaml version 4.01.0

# "あ";;
- : string = "あ"
# 
```

これで準備はOK
tcp > 仕様では、再送を繰り返すと再送タイムアウトが2倍の値となる

引用: オンラインゲームのしくみ: Unityで覚えるネットワークプログラミング by 河田匡稔（まさとし）さん
2.3 知っておきたい基礎知識

> TCPの仕様では、再送を繰り返すと再送タイムアウトが２倍の値となるようになっています。そのため、再送時のタイムアウトは初回のタイムアウトの２倍の時間になります。つまり、再送信が行われたセグメントでロストが発生した場合、再送に初期値の２倍もの時間がかかってしまうのです(図2.14)。


<hr>
http://www.7key.jp/nw/tcpip/tcp/tcp2.html
> この再送するまでの待ち時間のことをRTO【Retransmission Time Out】（再送タイムアウト）と呼びます。
...
RTO の値は再送を行うたびに２倍に増やされ、最大で 64 秒までなります。
badui > ユーザが思い描くモデルと現実の動きにギャップがある

引用: 失敗から学ぶユーザインタフェース by 中村聡史さん

> この扉が何故BADUIなのかという点ですが、それはこの扉を開けようとする人（ユーザ）が頭に思い描く「この扉がどう開くのか？」というモデルと、「実際に扉がどう開くのか？」という現実の動きにギャップがあるためです。

ギャップがうまれる理由で思いついたのは以下。
1. そもそもユーザの動きを考えていなかった
2. 考えたが、考えたものと実際のユーザの動きにずれがあった

<hr>
引用: プログラマが知るべき97のこと by Kevlin Henney


> ユーザが何をするかを観察する（あなたはユーザではない） by Giles Colborne [web link](http://xn--97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/%E3%83%A6%E3%83%BC%E3%82%B6%E3%81%8C%E4%BD%95%E3%82%92%E3%81%99%E3%82%8B%E3%81%8B%E3%82%92%E8%A6%B3%E5%AF%9F%E3%81%99%E3%82%8B%EF%BC%88%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AF%E3%83%A6%E3%83%BC%E3%82%B6%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84%EF%BC%89)
>
観察しながら、「なぜ、この人はこういうことをするのだろう？」、「なぜ、こうはしないのだろう？」と考えるのです。
>
ユーザが「こうしたい」と口で言ったことと、実際にやっていることが食い違っているおとにもあなたは気づくでしょう。これも非常に厄介な問題です。ユーザが何を求めているかを知ろうとすれば、普通、彼らの言葉を頼りにするからです。実は、ユーザが求めているものを正しく知るには、言葉を聞くよりも、彼らの行動を観察する方がいいのです。彼らの求めるものを頭で考えて一日過ごすより、わずか１時間でも観察をした方が得るものは多いでしょう。
c++ > template > テンプレートベースAPIのデメリット > テンプレートコード内で発生するエラーについて冗長で混乱を招くメッセージを生成すること

引用: C++のためのAPIデザイン by マーティン・レディ
5.3 テンプレートベースのAPI

> 一般に知られているテンプレートのデメリットとして、大半のコンパイラがテンプレートコード内で発生するエラーについて冗長で混乱を招くメッセージを生成することが挙げられる。
...
市場にはBDソフトウェアのSTLFiltユーティリティなど、テンプレートのエラーメッセージを簡略化して解読できる製品が出回っているほどだ。
c++ > template > テンプレートベースAPI > 実装を.cppファイルに隠ぺいすることもできる > 明示的インスタンス

引用: C++のためのAPIデザイン by マーティン・レディ
5.3 テンプレートベースのAPI

> とはいえ、テンプレートの実装は.cppファイルに隠蔽することができる場合もある。これは<font color=red>明示的インスタンス化</font>と呼ばれるテクニックを使って可能になる。このテクニックについての詳細は第６章「C++の使用法」で解説する。
c++ > template > テンプレートベースAPIのデメリット > クラステンプレートの定義がパブリックヘッダに登場しなくてはいけないことだ > コンパイル時間の増加 | コード量がふくれ上がる

引用: C++のためのAPIデザイン by マーティン・レディ
5.3 テンプレートベースのAPI

> テンプレートを使った場合のデメリットのうち、API設計にとってクリティカルな問題は、クラステンプレートの定義がパブリックヘッダに登場しなくてはいけないことだ。
...
さらに、ファイルがインクルードされるたびにインラインコードを再コンパイルすることになり、このAPIを使用するモジュールごとに、生成したコードがオブジェクトに追加される。この結果、コンパイル時間が長引いたり、コード量がふくれあがったりする。

「コード量がふくれあがったりする」の部分は「オブジェクトサイズがふくれあがる」の誤訳だろうか?
技術英語 > there isn't a single way to [get it right] 

http://thecodist.com/article/you_39_re_doing_it_wrong

>  there isn't a single way to <font color=red>get it right</font> (assuming you can even define what right is).

<hr>
singleで思い出したもの (出典は失念)

> There is no single path to becoming a good translator,

訳すと「良い翻訳家になる道は一つではない」

noやsingleなどの組み合わせで意味が変わってくる(「一つではない」や「一つもない」）ので注意が必要。

<hr>
さらに関連して思い出しのは

> He didn't say a word. (彼は一言も発しなかった)

notとaの組み合わせで「一つもxxxない」
selenium-webdriver@2.46.1の致命的なバグをダウングレードで先送りにした話

最新版の [selenium-webdriver](https://github.com/SeleniumHQ/selenium/tree/master/javascript/node/selenium-webdriver)@2.46.1 ですが、現在致命的なバグがあります。


## 問題

例えば、以下のサンプルコードは動作しますが：

```
var webdriver = require('selenium-webdriver');
    
var driver = new webdriver.Builder()
  .forBrowser('firefox')
  .build();

// example.com に遷移し、"More information..." リンクをクリックする
driver.get('http://example.com');
driver
  .findElement(webdriver.By.linkText('More information...'))
  .then(function(el) { return el.click(); })
;
```

以下のコードは、"Scheduled tasks" は出力されますが、最初の example.com への遷移も起こらず、終了することもありません：

```
var webdriver = require('selenium-webdriver');
    
var driver = new webdriver.Builder()
  .forBrowser('firefox')
  .build();

driver.get('http://example.com');
setTimeout(function() {
  driver
    .findElement(webdriver.By.linkText('More information...'))
    .then(function(el) { return el.click(); })
  ;
  console.log('Scheduled tasks');
}, 1);
```

また、mocha テストコードとして定義した場合は、初めのサンプルのように書いても動きません。


## 原因

この原因は、以下の Issue です：

- [javascript interface not working with setTimeout](https://github.com/SeleniumHQ/selenium/issues/363)


> Problem is the flow gets confused and deadlocks itself when a command is scheduled asynchronously when there's a dependency on the running task.

タスクが非同期に登録され、そのタスクの（おそらくはフローの制御が）実行中のタスクに依存しているとバグるとのことです。（だいぶ適当訳）

「実行中のタスクに依存」という条件は、詳細は省略してしまいますが、普通にテスト的なのを書くと、この条件に合致すると思います。

**10/19に上記が解決された模様**

https://github.com/SeleniumHQ/selenium/commit/c42999ea6e71302313b2ed01ddd64c3bd3e6ffc5

詳細は未確認です。


## 対応（雑）

解決法なのですが、自分は `selenium-webdriver@2.44.0` へダウングレードしたらこの問題はなくなりました。

ダウングレードによる影響は未調査です。

ただ、仕事で結構な量を書いていますが、今のところ、少なくとも他の致命的な問題には遭遇していません。


## 対応（真？）

[Protractor](https://github.com/angular/protractor) は中で最新版を使っており、どうしているのかなーと思ったのですが：

- [[WebDriverJs] 2.45 breaks Yadda examples](https://github.com/SeleniumHQ/selenium/issues/567)

上記のような書き方でも対応できるようで、この辺で対応しているのかな？と思いました。

この点は憶測で、全く調べずに言っております。
Raspbianの初回起動時にやったこと

# Raspbianの初回起動時にやったこと

[MacOSXを使ってmicroSDにRaspbianを書き込む](https://qiita.com/or2/items/2e90056cdd13edfa8a4a)の続き

## microSDをRaspberry Piに取り付けて起動

### sshを使ってログイン
`ssh pi@192.168.0.101`  
Raspberry Piに割り当てられたIPアドレスをDHCPのログで確認しておく  
※今回は192.168.0.101が割り当てられていた

Raspbianの初期パスワードは`raspberry`

### Avahiをインストール
`sudo apt-get install avahi-daemon`  
※以降`hostname.local`として名前解決できるようになる  
ホスト名を変更していない場合は`raspberrypi.local`  
IPアドレスをいちいち確認しなくてもよいので便利(特にDHCP環境下ではIPアドレスがコロコロ変わることがあるので)  
端末側のBonjour
* MacOSXの場合はなにもしなくても動作する(最近はデフォルトで入っている)
* Windowsの場合は事前にBonjourのインストールが必要(iTunesとかをインストールすると一緒に入る)

### raspi-configで初期設定を行う
`sudo raspi-config`

* パーティションの拡張(Expand Filesystem)  
大きめのSDカードを使ったときに  
* パスワードの変更(Change User Password)  
適当に
* 日本語ロケール追加(Internationalisation Options → Change Locale)  
`ja_JP.UTF-8 UTF-8 `を追加した
* タイムゾーンを変更(Internationalisation Options → Change Timezone)  
`Asia/Tokyo`に変更した
* Host名を変更(Advanced Options → Hostname)  
必要に応じて適当に
* GPUメモリの割り当てを変更(Advanced Options → Memory Split)  
GUIを使わないので16MBに

### Raspberry Piを再起動する
raspi-configの終了時に再起動する  
それをしなかったときは  
`sudo reboot`  

## Raspberry Piが起動してきたら
しばらく待ってるとRaspberry Piが起動する  
`ssh pi@raspberrypi.local`  
IPアドレスを指定しなくてよくなったのはAvahiのおかげ

### パッケージ、ファームウェアの更新
`sudo apt-get update`  
`sudo apt-get upgrade`  
`sudo rpi-update`
paper_trailsでデータ変更時のコメントを保存する

# 参考

* [PaperTrailはどうやってActiveRecordのバージョン管理をしているか](http://qiita.com/yuku_t/items/c8eec239b7a466097663)
* [Add comment to version upon updating a record](https://github.com/airblade/paper_trail/issues/263)

# 手順

## versionテーブルにcommentフィールドを追加する

migrationファイル作成

~~~
$ ./bin/rails g migration add_comment_to_versions comment:text
~~~

~~~ruby
# 20150811184014_add_comment_to_versions.rb:

class AddCommentToVersions < ActiveRecord::Migration
  def change
    add_column :versions, :comment, :text
  end
end
~~~

migration実行

~~~
$ ./bin/rake db:migrate
~~~

## モデルの修正

~~~
class Post < ActiveRecord::Base
  has_paper_trail :meta => { :comment => :comment }

  attr_accessor :comment
end
~~~

上記の設定後、Postモデル変更時(`save`や`update_attributes`)のパラメータに`comment`を渡すと、Versionテーブルにコメントを保存することができます。
自分のRails4プロジェクトに最速でes6+browserifyな環境を整える方法


この方法は `sprockets-es6` gemに依存しているため、`3.0.0-beta1` 以上の `sprockets` gemが必要になります。

もし、利用しているgemの依存関係などで、3.0.0以上のsprocketsがインストールできない場合は、素直にes6にはnpmのbabelifyを使いましょう。
(たぶん[ここら辺](http://ppworks.hatenablog.jp/entry/2015/08/10/212937)が参考になります)

また、以下の手順は、手元に`rails new`した状態、あるいは既存のrails projectとruby、nodeおよびnpmがインストールされた状態を期待します。

##### 1. browserigy-rails / sprockets-es6 をGemfileへ追加する

``` ruby:Gemfile
gem 'browserify-rails', '~> 1.2.0' # とりあえず現時点の最新のverというだけの指定
gem 'sprockets-es6', require: 'sprockets/es6' # このgemの依存関係で sprockets 3.0.0以上がインストールされる
```

##### 2. package.json ファイルを作成してbrowserify/browserify-incrementalを追加する

```node:package.json
{
  "name": "MyRailsProject",
  "private": true,
  "license": "MIT",
  "dependencies": {
    "browserify": "^11.0.1",
    "browserify-incremental": "^3.0.1"
  }
}
```

本来ならば `npm init`してから`npm install --save browserify browserify-incremental` するべきなのだろうけれど・・・

##### 3. bundle install /npm install

```shell-session
$ bundle install
# npm install
```

以上、3手で完了です。

単に、es6なファイルを扱いたいだけなら、`sprockets-es6` のみで事足りますが、せっかくモダンな環境を手に入れるのであれば、jQueryから脱却してみるのもよいと思い、そのために `browserify-rails` も入れてみました。

あとは、適当なcontrollerと `app/assets/javascript`下にes6ファイルを作成するなり、使いたいnpmライブラリがあるのであれば、`npm install --save foo`でインストールして、動作を確認してみるとよいでしょう。

最後に、上記の手順を構築するために使ったレポジトリがあります。
よかったら参考にしてみてください。

https://github.com/toshiwo/browserify_and_es6_rails_example
VirtualBoxにlinuxbeanを入れる

8/12 まだ書きかけなう（☆の部分とりあえず寝ておきたら更新する）


#目的
重たいWindowsパソコンに快適なLinux環境をいれること


#手段

1. Cygwin
2. VirtualBoxにLinux
3. 個別に必要なコマンドをいれてく

3.はpythonがたいへんいって聞いたので辞めた
1.は飽きたので2に挑戦してみる
軽いと噂のlinuxbeanに挑戦


#流れ
VirtualBox本体、Linuxのイメージを落とす
VirtualBoxをインストール
OSイメージを読み込む
プロキシを通す（大学などプロキシ環境のひと）
環境最適化

前提としてネットワークはDHCPで、VMとホストはNATでつなぎます

#ハマったとこ
##インストールどうやってやるの
ターミナルから以下を叩くとインストーラが動きだす。
ubiquity gtk_ui automatic
##Q.isoファイルどこに設定するの
設定->ストレージ->コントローラー下のCDの絵をクリック->光学ドライブ横のCDマークをクリック。ISOファイルを指定する。

##Q.OSが起動すらできないんだけど
"設定"にある”システム”の中の”プロセッサー”を選択。
「PAE/NXを有効化」にチェックボックスをいれる


##Q.プロキシが設定できないんすけど・・・
どうも名前のあるプロキシ設定だとDNS解決してくれないっぽい
/etc/environmentに以下設定する
http_proxy="http://username:password@proxy:portno"
HTTP_PROXY="http://username:password@proxy:portno"
https_proxy="https://username:password@proxy:portno"
HTTPS_PROXY="https://username:password@proxy:portno"


/etc/apt/apt.conf.d/01proxyファイルを新規作成し以下追加。

Acquire::http::Proxy "http://username:password@proxy:portno";
 Acquire::https::Proxy "http://username:password@proxy:portno";

/etc/wgetrcに下記項目を追記。

http_proxy=http://username:password@proxy:portno
https_proxy=http://username:password@proxy:portno
ftp_Proxy=http://username:password@proxy:portno
use_proxy = on


##Q.それでもプロキシ動かないんだけど・・・
usernameに＠が入っているとだめ　パーセントエンコードで@を全て%40におきかえる
例えばusernameがedapiyo@hogehoge.comだった場合、
edapiyo%40hogehoge.com
が正解。

##Q.apt-getでエラーが返ります…
sudoの後に-Eをつけてスーパーユーザじゃないときのproxy環境を引き継ぐ
sudo -E apt-get install python-pip

#感想
もとのWindowsが激重だったのが原因なんだけど非常に快適になった
VMのOSだけで8GBのHDDさえあれば実行できるので辛い環境で開発しなきゃいけない人お試ししてみては

ここまで大体４時間ぐらいかかったよ
Typescriptで手っ取り早く外部ライブラリを使う

Typescriptをコンパイルする際に、コンパイラの知らない変数や関数を使おうとすると怒られます。

+ hello.ts

```
(() => jQuery("div").css("background", "red"))();
```

```
$ tsc hello.ts
> hello.ts(1,8): error TS2304: Cannot find name 'jQuery'.
```

それでもちゃんとコンパイルはしてくれるので通常はそこまで問題でもありませんが、
環境によってはタスクランナーを止めてくれたりする事もあります。
（riot.jsでTypescriptを利用する場合など）
こういう場合は型定義ファイル等を持ってくるのですが面倒なので、一行追加してあげます。

+ hello.ts

```
declare var jQuery: any;
(() => jQuery("div").css("background", "red"))();
```

```
$ tsc hello.ts
> 問題なく変換
```

次に、window直下等に変数を追加するタイプの場合

+ world.ts

```
(() => window.superagent.get("http://google.com/") )();
```

```
$ tsc world.ts
> world.ts(1,15): error TS2339: Property 'superagent' does not exist on type 'Window'.
```

こういう場合はinterfaceを利用します

+ world.ts

```
interface Window {
  superagent: any;
}
(() => window.superagent.get("http://google.com/") )();
```

```
$ tsc world.ts
> 問題なく変換
```

手っ取り早く黙らせる事ができました。
Riot+CoffeeScriptで転んだ

こんなのを

```html:my-tag.tag(type=none)
<my-tag>
  <input value={value}>
  <button each={list} onclick={click}>{name}</button>
  <script>
  this.value = 'initial'
  this.list = [
    {name: 'btn-1', value: 'update 1'},
    {name: 'btn-2', value: 'update 2'}
  ];
  click(e) {
    this.value = e.item.value
  }
  </script>
</my-tag>

```

こうしたら

```coffeescript:my-tag.tag(type=coffee)
<my-tag>
  <input value={value}>
  <button each={list} onclick={click}>{name}</button>
  <script type="coffee">
  @value = 'initial'
  @list = [
    {name: 'btn-1', value: 'update 1'}
    {name: 'btn-2', value: 'update 2'}
  ]
  @click = (e) ->
    @value = e.item.value
  </script>
</my-tag>
```

`value`が変わらなくなってしまった

それぞれコンパイル後のファイル(以下比較のため整形済み)を見比べてみたら

```js:my-tag.js(type=none)
riot.tag(
  'my-tag',
  '<input value="{value}"><button each="{list}" onclick="{click}">{name}</button>',
  function(opts) {
    this.value = 'initial'
    this.list = [
      {name: 'btn-1', value: 'update 1'},
      {name: 'btn-2', value: 'update 2'}
    ];
    this.click = function(e) {
      this.value = e.item.value
    }.bind(this);
  }
);
```

```js:my-tag.js(type=coffee)
riot.tag(
  'my-tag',
  '<input value="{value}"><button each="{list}" onclick="{click}">{name}</button>',
  function(opts) {
    this.value = 'initial';
    this.list = [
      {name: 'btn-1', value: 'update 1'},
      {name: 'btn-2', value: 'update 2'}
    ];
    this.click = function(e) {
      return this.value = e.item.value;
    };
  }
);
```

改行やスペースを除くと相違点は`.bind(this)` (と`return`)のみだった
ので

```coffeescript:my-tag.tag(type=coffee)
# 〜略〜
  @click = ((e) ->
    @value = e.item.value
  ).bind @
# 〜略〜
</my-tag>
```

のように修正したところ正常に動くようになった

----

`each`の中でなければ`bind`の必要は無い
が、純`riot`の場合と揃えるため毎回`bind`しといたほうがいい気がする
そのうちコンパイラ読もう
pythonで環境を作る時にメモ


#仮想環境を作る場合

##python2系
```
$mkdir -p $(作業ディレクトリ名)
$cd !$
$virtualenv venv
$source venv/bin/activate
```

##python3系
```
mkdir -p $(作業ディレクトリ名)
cd !$
python3 -m venv venv
source venv/bin/activate
```

##参考
[HomebrewのPython2とPython3でvirtualenv環境を作成する手順メモ](https://hnakamur.github.io/blog/2015/07/26/how_to_use_venv_with_homebrew_python2_and_3/)

#pyenvメモ

##環境を作る
```
$pyenv virtualenv {Python Version} {仮想環境名}
```
今年の祝日を取得する

更新

振替休日も取れるのでこっちのがいいですね

[祝日をWebAPIから取得するシェルスクリプトをワンライナーで](http://qiita.com/amanoese/items/7db079377d6ebc215f60)

---

皆さんはお盆に入りましたか？
自分は今日からお休みです。
月曜からまた仕事だと鬱で吊りたくなりますね。
次の祝日を知っておくと少しは頑張れる気がします。

[Perl 祝日名の取得 - とみぞーノート](http://wiki.bit-hive.com/tomizoo/pg/Perl%20%BD%CB%C6%FC%CC%BE%A4%CE%BC%E8%C6%C0)

```bash
$ cpanm Calendar::Japanese::Holiday
```

```pl:holiday.pl
use strict;
use warnings;
use Calendar::Japanese::Holiday;
use utf8;
use open qw(:encoding(utf8) :std);

my $year = 2015;
foreach my $month (1..12) {
  my $href = getHolidays($year, $month, 1);
  foreach my $day (sort keys %$href) {
    printf("%02d/%02d %s\n", $month, $day, $href->{$day});
  }
}
```

```bash
$ perl holiday.pl
01/01 元日
01/12 成人の日
02/11 建国記念の日
03/21 春分の日
04/29 昭和の日
05/03 憲法記念日
05/04 みどりの日
05/05 こどもの日
05/06 振替
07/20 海の日
09/21 敬老の日
09/22 国民の休日
09/23 秋分の日
10/12 体育の日
11/23 勤労感謝の日
11/03 文化の日
12/23 天皇誕生日

$ perl holiday_2016.pl
01/01 元日
01/11 成人の日
02/11 建国記念の日
03/20 春分の日
03/21 振替
04/29 昭和の日
05/03 憲法記念日
05/04 みどりの日
05/05 こどもの日
07/18 海の日
08/11 山の日
09/19 敬老の日
09/22 秋分の日
10/10 体育の日
11/23 勤労感謝の日
11/03 文化の日
12/23 天皇誕生日
```

次のシルバーウィークまで頑張りましょう(´Д｀)
ちなみに来年から山の日が追加らしいですね。

[山の日 - Wikipedia](https://ja.wikipedia.org/wiki/%E5%B1%B1%E3%81%AE%E6%97%A5)
シンボリックリンクが切れたファイルを削除する方法


目的
----
シンボリックリンクが切れたファイルが複数出来上がったので，それらを一括で削除

環境
---
- OS X Yosemite (10.10)
- zsh 5.0.8

方法
---
シェルコマンドのパイプを使います．

```sh:shell
$ find -L . -type l | while read f; do
> rm "$f"
> done
```


###参考
- [リンク切れのシンボリックリンクを削除](https://gist.github.com/beans15/8614669)
Go言語でCSVの読み書き(sjis、euc、utf8対応)

#Go言語でCSVファイルの読み書き

## このサンプルで詰まっている要素
* CSVファイル入出力(CRLF、デリミタ指定)
* 文字コード変換
* 引数
* ログ出力
* スライス処理
* 数値→文字列変換

カラムが2つ以上あるsjisなcsvファイルを用意してください。

```go:csv.go
/*
GOROOT、GOPATHの設定を忘れずに
例) GOROOT=c:\tools\go
    GOPATH=c:\tools\go
    PATH=c:\tools\go\bin

最初にパッケージのダウンロードとインストール
c:\>go version
go version go1.4.2 windows/amd64

go get golang.org/x/text/encoding/japanese
go get golang.org/x/text/transform

go run csv.go "入力ファイル.csv" "出力ファイル名.csv"
go build csv.go 
*/
package main

import (
	"golang.org/x/text/encoding/japanese"
	"golang.org/x/text/transform"
	"encoding/csv"
	"io"
	"flag"
	"log"
	"os"
	"fmt"
)

func failOnError(err error) {
	if err != nil {
		log.Fatal("Error:", err)
	}
}

func main() {
	flag.Parse()

	//読み込みファイル準備
	file1, err := os.Open(flag.Arg(0))
	failOnError(err)
	defer file1.Close()

	//書き込みファイル準備
	file2, err := os.Create(flag.Arg(1))
	failOnError(err)
	defer file2.Close()

	reader := csv.NewReader(transform.NewReader(file1, japanese.ShiftJIS.NewDecoder()))
//	reader := csv.NewReader(transform.NewReader(file1, japanese.EUCJP.NewDecoder()))
//	reader := csv.NewReader(file1) //utf8
	reader.LazyQuotes = true // ダブルクオートを厳密にチェックしない

	writer := csv.NewWriter(transform.NewWriter(file2, japanese.ShiftJIS.NewEncoder()))
//	writer := csv.NewWriter(transform.NewWriter(file2, japanese.EUCJP.NewEncoder()))
//	writer := csv.NewWriter(file2) //utf8
	writer.UseCRLF = true //デフォルトはLFのみ
//	writer.Comma = '\t'

	log.Printf("Start")
	for {
		record, err := reader.Read() // 1行読み出す
		if err == io.EOF {
			break
		} else {
			failOnError(err)
		}
		var new_record []string
		for i, v := range record {
			if i > 0 {
				new_record = append(new_record, fmt.Sprint(i) + ":" + v)
			}
		}
		writer.Write(new_record) // 1行書き出す
//		log.Printf("%#v", record[0] + "," + record[1])
	}
	writer.Flush()
	log.Printf("Finish !")
}
```
AppStoreでアプリのリリースを検出する

## 目的：リリースを検出したい
[GooglePlayStoreのアップデートを検出する](http://qiita.com/matsuokah/items/2bdcfe02bad114a44d03)のAppStore版です。

## アクション：アップデート日付を比較して検出する
[appstore_util](https://github.com/matsuokah/appstore_util)

## 使い方

```shell-session
# Twitter
./release_detector.py -u 'https://itunes.apple.com/jp/app/twitter/id333903271?l=ja&mt=8'
```
とすれば、最初の検知ではDetected, 2回目以降のrunで更新があればReleased!と表示されます。
チームではJenkinsで定期実行して、Hipchatへの通知スクリプトをフックしています。Hubotで同じような事ができればもっとスムーズにできそうですね。

## 注意
* パース部分がYYYY年MM月DD日でベタなので日本語オンリー。
* iTunes StoreのHTMLタグが変わるとメンテする必要がある
HTL23で処理落ちした話

Twitterクライアントを作成している時、デバッグ端末の一つであるHTL23を使っている際に発生した謎の処理落ち現象についてのメモを残しておきたいと思います。
#どのぐらいの処理落ちだったか
とにかく何をするにも遅い。
例えばEditTextに文字を入力しようとし、キーボードが出てくる際AndroidManifest.xmlに
`android:windowSoftInputMode="adjustResize"`
などと書いておくと自動で画面のリサイズを行ってくれますが、そのリサイズに2秒は軽く待たされる程度には処理落ちが激しかったです。
#解決しようと実行した手段
* ほぼすべてのViewに対して手動で描画更新を行う

しかし描画自体が処理落ちによってスキップされてるため解決には至らず。

* 同期処理を非同期処理に置き換える

今回の問題に対しては全くの効果なし。

* Viewの階層を見直す

これも効果は全くなし。

* AdapterのgetView()を見直す 

コードは整理されたけどこれも効果としてはほぼ無いに等しい。関係ないけどgetView()がすぐにスパゲッティと化するのは考えものである。

* Viewを一部非表示にしてみたりする

いくつかViewを非表示にすると処理落ちが無くなり効果があった模様

#どのViewが処理落ちの原因だったのか
原因はズバリImageViewでした。
ですがすべてのImageViewがという訳では無く、大きな画像を小さく表示すると処理落ちが起きるようです。

ImageViewは大きな画像でも小さく表示する際リサイズを行ってくれますが、どうやらHTL23はこの動作がかなりの苦手分野のようで、IS11CAなどのかなり初期の端末にも負けるようです。

どうも「大きい画像一つ用意しておけばなんとかなる」と思ってたのがこの処理落ちを発生させてしまったようです。
幸いなことに、画像が大きいのであれば適切なサイズのものを生成してくれるWebサービス（今回使用したのは[Android Asset Studio](http://romannurik.github.io/AndroidAssetStudio/)というサービス）があったりするので利用してみるのも良いかと思います。

また今回はHTL23で確認されたことですが、他の端末でも起きないとは限らないのでこの際に適切なサイズのアイコンを生成しておくと後で変なトラブルにはならないと思います。

#結論
リソース画像は適切なサイズのものを生成しましょう。
[エラー対応]Redmineの自動バックアップが効いていなかった



[こちらの記事]()のように、
AWS上に設置したRedmine(bitnami ver)を
S3に1日に一回、mysqldumpしていたものをアップロードしていました。

ローカルでコマンドを打つと動いていたのですが
cronで動いたときはS3へアップロードされているファイルが０バイトだった。

ということで調べてみた。

そして添付ファイルたちもことごとくアップロードできない。
（参照はできるのに。）

まだ全てが解決したわけではないですが、メモ代わりに残しておきます。


##疑惑１：mysqldumpのパスが通ってない

mysqldump を探してみたところ、binじゃなかった。　
> /opt/bitnami/mysql/bin/mysqldump

どうやらパスが通ってなかったようです…
絶対パスにしていしてやると解決。

##疑惑２：filesのパーミションがない

アップロードできない、つまりアクセス権限がない…？

> drwxr-xr-x 4 daemon  daemon 4096 Aug  5 15:23 2015
-rwxrwxr-x 1 bitnami daemon   36 Jul  7 19:47 delete.me


readあればいけるはずなんですが…あれ？

**ファイルがアップロードできない問題については引き続き要調査。**
BluemixでAnalytics 〜dashDBを作って見る


## きっかけ
仕事でちょっとしたデータ分析をすることになりました。内容はWebアプリケーションのログファイルを分析しアプリケーション内部で発行されているSQL文の処理時間を分析するというものです。
件数的にExcelでは処理しきれないため、何かいいツールないかなと思っていたところ、そういえばIBMのBluemixのアカウントをフリートライアルで登録していたことを思い出しました。

今回、実際に仕事に使えそうか勉強半分で利用してみることにします。

## ツール探し
Bluemixのサービスの中に分析系のものがあったはず。
まずは、データを格納しておく場所を確保しようとしてデータベースを検索。
**dashDB**というのが良さそう。

* データ量の制限は大きいし、１GBまでは無料。（要確認）
* 解析のためのデータベースとして高速になっている（データウェアハウス用にチューニングされている）
* Rと組み合わせて分析できるようになっている

![Kobito.ac7V5J.png](https://qiita-image-store.s3.amazonaws.com/0/89268/f987040e-77e8-9c7e-3315-adcaefaf41e0.png "Kobito.ac7V5J.png")

いくつかプランがありますが、まずはお試しなのでEntryを選択しました。月額5,250円に少しビビりましたが、今はBluemixのトライアル期間中なので無料のはず。クレジットカードも登録していないので引き落とされることもないはず。（1GBまでは無料っぽいし）

![Kobito.LAj1c3.png](https://qiita-image-store.s3.amazonaws.com/0/89268/99999768-b362-40d8-66ec-4c548bfc49aa.png "Kobito.LAj1c3.png")

## サービスを作ってみる
Entryプランを選択して、作成ボタンを押すと１分くらいでダッシュボードにdashDBのページが表示されます。
その画面に表示されている下のアイコン部分をクリックするとdashDBの管理用コンンソールページへ移動します。
![スクリーンショット 2015-08-11 19.12.58.png](https://qiita-image-store.s3.amazonaws.com/0/89268/a0811514-bcfd-5cbd-507a-3544c6b449fa.png "スクリーンショット 2015-08-11 19.12.58.png")

起動してきたのがdashDBの管理画面です。
![ss_2015-08-11_19_20_06.png](https://qiita-image-store.s3.amazonaws.com/0/89268/3478c0eb-96f7-b414-ff07-ad3bbbd3f9b5.png "ss_2015-08-11_19_20_06.png")

画面左側にメニューが配置されていてデータベース操作ができます。
とりあえず、今回は、ここまで。
##次回
今回の操作で、Bluemix上にdashDBという分析用のデータベースが作成できました。次回は、dashDBの管理画面を操作してテーブル作成、データロードを実行していきます。

***
シリーズ一覧
1.[BluemixでAnalytics 〜dashDBを作って見る](http://qiita.com/saboten10/items/75dce524abe42779e368)
2.[BluemixでAnalytics 〜dashDBにデータをロードしてみる](http://qiita.com/saboten10/items/74f4c2bd2b65c59df41c)
3.[BluemixでAnalytics 〜dashDBをSQLで操作してみる](http://qiita.com/saboten10/items/bf9c2b342ea6dc5cdfb9)
4.[BluemixでAnalytics 〜dashDBをRから使ってみる](http://qiita.com/saboten10/items/57c3ebb882656a9c5c35)
5.[BluemixでAnalytics 〜dashDBにR Studioから接続してみる](http://qiita.com/saboten10/items/ad537283fb1269ecb3fa)
mtrをAmazonLinuxにインストール

ネットワーク関連の確認のためにmtrをAmazonLinuxにビルドしてインストールしたのでその時のメモ。

# 環境

+ Amazon Linux AMI 2015.03 (HVM)

# 参考

## MTR
+ [traviscross/mtr](https://github.com/traviscross/mtr)
+ [MTR, BitWizard's MTR page with Unix downloads](http://www.bitwizard.nl/mtr/)
+ [MTR(FTP)](ftp://ftp.bitwizard.nl/mtr/)

## 使い方

+ [mtr – a network diagnostic tool](https://log4hc.wordpress.com/2015/02/11/mtr/)
+ [tracerouteの色々](http://d.hatena.ne.jp/rx7/20130815/p1)

# mtrとは?

以下引用。

> mtrは、宛先を指定すると、経路を探索し、それぞれの中継地点のルーターに対して、一定間隔でpingを実行し、RTT値やパケロスの統計を記録します。経路上のネットワークが不調の疑いがある場合など、しばらくmtrを実行して経過観察を行うことで、問題点の切り分けができます。

# yumでのインストール(0.75)

yumでインストールできる

```
$sudo yum install mtr
```

# ビルド(最新の0.86など)

コンパイル時に必要なパッケージのインストール
```
$sudo yum groupinstall "Development Tools"
```

ビルド、インストール

```
$wget ftp://ftp.bitwizard.nl/mtr/mtr-0.86.tar.gz
$tar -zxvf mtr-0.86.tar.gz
$cd mtr-0.86
$./configure
$sudo make
$sudo make install
```

確認

```
$/usr/local/sbin/mtr --version
mtr 0.86

$mtr --version
mtr 0.86
```
１から引数の数までを合計して表示するシェル書いた。


現実逃避に１から引数の数までを合計して表示するシェル書いた。

```lang:bash
#!/usr/bin/env bash

argv=$1

if [ $1 -lt 1 ] ; then
  echo "0"
  exit 0
fi

param=$((  $argv - 1 ))
ret=$( $0 $param )
echo $(( $argv + $ret))
```

実行中にCtrl-zしてpsで見ると、こんな感じ。

```lang:text
ukaji3   11071 21913  0 22:49 pts/4    00:00:00       bash ./sum.sh 1000
ukaji3   11072 11071  0 22:49 pts/4    00:00:00         bash ./sum.sh 999
ukaji3   11073 11072  0 22:49 pts/4    00:00:00           bash ./sum.sh 998
ukaji3   11074 11073  0 22:49 pts/4    00:00:00             bash ./sum.sh 997
ukaji3   11075 11074  0 22:49 pts/4    00:00:00               bash ./sum.sh 996
ukaji3   11076 11075  0 22:49 pts/4    00:00:00                 bash ./sum.sh 995
ukaji3   11077 11076  0 22:49 pts/4    00:00:00                   bash ./sum.sh 994
（以下略）
```
Pythonでwebsocket clientを作ってみる。（access token認証）

たまたまnulabのTypetalkというアプリのAPI( https://developer.nulab-inc.com/ja/docs/typetalk )をいじる機会があったのでwebsocketの実装を行ってみた。
pythonでやったことがなかったのでメモ

##開発環境
MaxOSX 10.10.3
Python 2.7.9

##インストール
pythonで必要なパッケージをインストールする

```shell
pip install websocket-client
```
を実行してpythonのwebsocket-clientをインストールする。

##websocketの実装
今回，Typetalkを使ったためtype talkからaccess tokenを取得，websocketclientを定義するところを紹介
このコードによって登録ユーザーの全ての挙動を確認することができるようになる，

```main.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
import sys
import urllib
import urllib2
import json
import string

import websocket
import requests

class TypeTalkSample:
    access_token = None

    def __init__(self):
    	# typetalkからaccess tokenを取得する 
        client_id = "xxxxxxx"
        client_secret = "xxxxxxx"
        params = {
            'client_id': client_id,
            'client_secret': client_secret,
            'grant_type': 'client_credentials',
            'scope': 'topic.read,topic.post',
        }
        data = urllib.urlencode(params)
        res = urllib2.urlopen(urllib2.Request('https://typetalk.in/oauth2/access_token', data))
        
        # access tokenを保持する
        self.access_token = json.load(res)['access_token']

		# websocketを定義する，ここでheaderにauthorizationを登録することでaccess tokenを使ったwebsocketを設定することができる。
        websocket.enableTrace(True)
        ws = websocket.WebSocketApp("wss://typetalk.in/api/v1/streaming", header=["Authorization: Bearer %s" % self.access_token], on_open=self.on_open, on_message=self.on_message, on_error=self.on_error, on_close=self.on_close)
        
        # websocketを起動する。Ctrl+Cで終了するようにする。
        try:
            ws.run_forever()
        except KeyboardInterrupt:
            ws.close()

	# ここで定義したメソッドがwebsocketのコールバック関数になる。
	# messageをうけとったとき
    def on_message(self, ws, message):
        print message

	# エラーが起こった時
    def on_error(self, ws, error):
        print error

	# websocketを閉じた時
    def on_close(self, ws):
        print 'disconnected streaming server'

	# websocketを開いた時
    def on_open(self, ws):
        print 'connected streaming server'


if __name__ == "__main__":
    typetalk = TypeTalkSample()
```

## リンク
Typetalk api (https://developer.nulab-inc.com/ja/docs/typetalk)
WerckerCliが便利だった

werckerはcliツールを提供している模様。
http://devcenter.wercker.com/docs/using-the-cli/index.html

これが何をしてくれるツールかというと、
local環境で`wercker.yml`のタスクを実行してくれるという代物。

従来のCIツールは`*.yml`を作って試しにデプロイしてみて失敗したらSSHでそのコンテナに入って調べるだとか、
ひたすらCIを回して原因を調べていくとかかなり面倒な作業が必要だったりするんだけど、
wercker cliを使えばローカル環境で、wercker上でCIが回るのと同じ感じでタスクを実行してくれる。

# インストール（Macのみ）

wercker cliはローカルでdockerコンテナを起動しているので、dockerをインストールする必要があります。

brewで`boot2docker`をインストールします。

```
brew install boot2docker
```

dockerの初期設定を行います。

```
boot2docker init
```

dockerを起動します。

```
boot2docker start
```

環境変数の類をセットしてあげます。

```
eval "$(boot2docker shellinit)"
```

これでdockerが利用出来るようになりました。
続いてwercker cliをダウンロードします。

```
curl https://s3.amazonaws.com/downloads.wercker.com/cli/stable/darwin_amd64/wercker -o /usr/local/bin/wercker
```

wercker cliをダウンロードしたら実行権限を付与します。

```
chmod +x /usr/local/bin/wercker
```

これでwercker cliが利用出来るようになりました。

# 試してみた

以下の様な`wercker.yml`を用意して、ローカルでCIを実行してみましょう。

```yml:wercker.yml
box: ruby:2.2.2
build:
  steps:
    - script:
      name: ruby version
      code: ruby -v
```

以下のコマンドを実行します。

```
wercker build
```

実行すると、以下の様な感じでwerckerでCIを実行しているような情報が出力されます。

```
--> No Docker host specified, checking for boot2docker: tcp://192.168.59.103:2376
--> Executing pipeline
--> Running step: setup environment
Pulling from ruby: 2.2.2
    .
    .
    .
    .
    .
Status: Downloaded newer image for ruby:2.2.2
--> Running step: wercker-init
--> Running step: ruby version
ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
--> Steps passed
--> Pipeline finished
```

---

便利でしたね、今CIを選ぶならwerckerですね！
Bitbucket、GitHubで、ブラウザで差分表示する時に空白を無視したい/タブ幅を変更したい


Bitbucket, GitHubでPull Requestを受けた時など、差分表示をすることがある。その際、ブラウザで差分表示すると、基本的に空白のみの差異についても差分として表示されるが、空白のみの差異は無視したい(表示させたくない)こともある。
Goで書かれたコードは通常commit前にツールで整形されるので、構造体にメンバーを追加した場合などが典型的な例。追加したメンバー以外も差分として表示され、実質的な変更箇所に集中できないことがあるのだ。

このような場合、checkoutしてローカルのツールやエディタで確認してもよいのだが、ささっとブラウザ上で済ましてしまいたいこともある。そのような時は、一旦ブラウザで表示後、URLに差分を無視するためのクエリを追加すると良い。この方法はBitbucket、GitHubとも共通なので覚えておいて損はないかもしれない。

# 空白を無視したい
例えば、URLが
https://bitbucket.org/user/repo/pull-requests/1/changes/diff
の場合、
https://bitbucket.org/user/repo/pull-requests/1/changes/diff?w=1
のように、URLの最後に`?w=1`を追記する。これで以下のとおり空白が無視される。

`?w=1`を指定しない場合:
![without_w=1.png](https://qiita-image-store.s3.amazonaws.com/0/88190/cb33d62a-9f0f-74da-5788-38976578d2eb.png)

`?w=1`を指定した場合:
![with_w=1.png](https://qiita-image-store.s3.amazonaws.com/0/88190/2be73bcc-f76d-ee98-b59b-623ebaf160ac.png)

#タブ幅を変更したい
タブ幅は、Bitbucket、GitHubともデフォルトで8になっている。変更する場合のクエリは、`?ts=タブ幅`。例えばタブ幅を4にしたければ`?ts=4`とする。有効なタブ幅は1〜8。

#空白を無視し、タブ幅も変更したい
この場合は、以下のような感じに、両方のクエリを&で接続して記述すれば良い。
https://bitbucket.org/user/repo/pull-requests/1/changes/diff?ts=4&w=1

いちいちクエリで指定させないで、設定を保存できるようにしてもらえるとありがたいのだが…

---
参考URL
https://blog.bitbucket.org/2015/01/30/new-year-new-features/
https://github.com/tiimgreen/github-cheat-sheet
これだけは覚えておきたい！Rubyにおけるハッシュの使い方

##導入
皆様、プログラミングの方は順調でしょうか。
私は今あるエンジニア育成キャンプの見習いメンターを務めるものです。
今回、受講生から受けた質問の中で、特出して多かった内容があります。
それは...

**ハッシュってなんやねん！！！**

ということです。配列っていう概念は耳にしたことはあっても、ハッシュに慣れている方はいらっしゃらないみたいですね。今回は、問題を解きながら、実際にハッシュの使い方を学んでいきます。

##問題
>テストの得点と、それに対応する生徒の名前を入力していきすべて入力し終わった段階で、テストの得点の高い方から順番に上から表示し、最後に平均得点を表示するプログラムを作ってください。

まずはここまではみなさん書くことができます。

```rb
def input_score
  puts "生徒の名前を入力してください"
  name = gets.chomp
  puts "得点を入力してください"
  score = gets.chomp
end

def show_all_score
end

while true do
  puts "得点を入力しますか？:[0]yes [1]no"
  input = gets.to_i

  if input == 0
    input_score
  else
    show_all_score
    exit
  end
end

```
しかし、input_scoreメソッドを見てください。
このままでは入力する生徒の数に応じて変数名を指定しておかなくてはならず、非効率です。そこでデータをまとめておこうということになり、ハッシュを使うことになります。
ではそもそもハッシュとはなんなのでしょうか？
##ハッシュとは、データの保管庫である！
どんな要素でもぶち込める配列に対して、ハッシュはキーに応じてデータをまとめることができます。今回の場合ですと、ハッシュというまとめに対して、そのまとめておきたい要素は
①生徒の名前
②点数
となります。

**このように、まとめ全体のことがハッシュというものであり、
そこに属するまとめたい要素がキーとなるのです！！！**

つまり今回の場合ですとこうなります。

```rb
def input_score
  score = {}
  puts "生徒の名前を入力してください"
  score[:name] = gets.chomp
  puts "得点を入力してください"
  score[:score] = gets.chomp
end

def show_all_score
end

while true do
  puts "得点を入力しますか？:[0]yes [1]no"
  input = gets.to_i

  if input == 0
    input_score
  else
    show_all_score
    exit
  end
end
```

二行目を見てください。
*score = {}*　と書いてあります

このように

**ハッシュ名 = {}**

とすることで、ハッシュを作ることができます。
そして四行目以降では

*score[:name] = gets.chomp*
*name[:score] = ~*
と書いてあります。
このように  

**ハッシュ名[:キー] = 入れたいもの　**

とすることで入れたいものをキーとセットにしてハッシュに入れることができます。
これで重要な操作は終りとなります。
スニペットアプリでJS


入力をJSに渡すやり方何かで使う機会があるかも。

![スクリーンショット 2015-08-11 22.01.56.png](https://qiita-image-store.s3.amazonaws.com/0/5472/77beae70-7906-b142-a3a3-5b71a87add96.png "スクリーンショット 2015-08-11 22.01.56.png")




```javascript:js
var input = '%filltext:name=日付:default=2015/08/11%';
var input2 = parseInt('%filltext:name=何日？:default=30%', 10);


var d = new Date( input );


var cnt = 0;
var len = input2;

function makeDateObj(year, month, date, dayNum) {
    var w = ["日","月","火","水","木","金","土"];
    var d = new Date(year, month - 1, date);
    d.setDate(d.getDate() + dayNum);

    var dayNum = d.getDay();
    return {
        year:       d.getFullYear(),
        month:      d.getMonth() + 1,
        date:       d.getDate(),
        youbi:      w[dayNum ],
        dayNum:   dayNum
    };
}

var dateObj = makeDateObj( d.getFullYear(), d.getMonth() + 1, d.getDate(), 0 );
var dateObj2 = null;
var output = '';


TextExpander.appendOutput( "【スケジュール】\n" );

for (; cnt<len; cnt++) {
    // 日付の取得
    dateObj2 = makeDateObj( dateObj.year, dateObj.month, dateObj.date, cnt );

    if ( dateObj2.dayNum === 0 ||
         dateObj2.dayNum === 6 ) {
        continue; 
    }

    // テキスト生成
    output = dateObj2.month +"月"+ dateObj2.date +"日（"+ dateObj2.youbi +"）\n";

    // 出力
    TextExpander.appendOutput( output );
        
}

```
htmlのid属性とclass属性の命名はハイフンかcamelかsnakeか


CSSはハイフン(foo-bar)[^1]、JavaScriptはCamel(fooBar)、Rubyはsnake(foo_bar)文化。
[^1]: cssは微妙だけど、少なくともcssのプロパティはハイフンだ(font-familyのように)。

じゃあ、みんなが共有するHTMLのid、class属性はどの書式で書けばいいのか?
HTML/CSSの人が書くことが多いからか、有名サイトを調べてみると、ハイフンが多い。
でも、JavaScriptで要素を取得したときに次のようにハイフンをCamelにしなければならないので、どうもしっくりこない。

```html
<div class="foo-bar">foo bar</div>
<script>
var fooBar = $('.foo-bar'); // foo-barなの？fooBarなの？
</script>
```


# 世の中のトレンド

## BEM

CSSの命名規則で有名な[BEM](http://bem.info)はハイフンもアンダースコア(\_)も、アンダースコア2つ(\_\_)も使う。
個人的には、うーん。。。

## Trello CSS Style Guide

色々と有名なCSSスタイルガイドはあるけど、個人的に一番好きなのがこれ。

[Trello CSS Guide](https://gist.github.com/bobbygrace/9e961e8982f42eb91b80)

* class名はハイフン区切り(分類はModifierとStateだけ)
* idはCSSでは使わない
* JavaScript用のclass属性には`js-`プレフィックスをつける

これだと、CSSとJavaScriptで住み分けができるので悪くはないけど、次のように違和感が残る。

```html
<div id="fooFoo">fooFoo</div>
<div class="class-for-css js-barBar">barBar</div>

<script>
var fooFoo = $('#fooFoo'); // こっちはOK
var barBar = $('.js-barBar'); // js-をとらなければならないので微妙
</script>
```

## ハイフン vs Camel論争

調べた中で、最も熱い議論だと思ったのがこれ。
結論はないけど、とてもよい議論。

[Why are dashes preferred for CSS selectors / HTML attributes?](http://stackoverflow.com/questions/7560813/why-are-dashes-preferred-for-css-selectors-html-attributes)

### ハイフン批判の概要

* ハイフンつなぎだと複数文字の結合扱いになるから補完が一発できかないし、ダブルクリックで全選択できないじゃないか(参考:[ハイフンとアンダースコアは異なる扱い](http://www.sem-r.com/seo/20110818061702.html))
* JavaScriptのオブジェクトのドットノーテーションが使えないじゃないか
* 数式のマイナスと区別がつきにくいじゃないか
* JavaScriptはCamelだからセレクターでとった要素の変数名がidと異なるものになるじゃないか

### ハイフン擁護の概要

秀逸な回答はこれ(他は略)。

* ハイフンにすると、[|= attribute selector](http://www.w3.org/TR/CSS21/selector.html#attribute-selectors)という便利なものが使えるのだよ

## JavaScriptはclass属性を使うな

批判が多いけど、個人的にはいいアイディアだと思う。

[Don't use class names to find HTML elements with JS ](http://roytomeij.com/blog/2012/dont-use-class-names-to-find-HTML-elements-with-JS.html)

* class属性はcss専用にする
* JavaScriptは`$('[data-age-group="0-12"]')`とか`$('[data-age-group]')`みたいにカスタムデータ属性で要素を取得する
* セレクターの速度はclass属性を使うよりも遅くなるけど大差ない

# 解決策

Trello方式とか全てCamelやsnakeで統一する方法以外であれば、次の方法がいいと思う。

## ルール

* CSSはclass属性しか使わない(id属性は使わない)
* CSS以外はclass属性を使わない
* JavaScriptはカスタムデータ属性(`data-id="fooBar"`など)を使う
* サーバーサイド(Ruby on Railsとか)が自動でid属性をCamel以外で設定するなら、JavaScriptはid属性を使わない。そうでなければ、JavaScriptはid属性を使ってもいい
* [2015/08/17 コメントをうけて追加]JavaScriptの操作がclass属性操作の場合は、JavaScriptでclass属性をつかってもいい

このルールにすると、次のように住み分けができる。

## 基本

分類 | 書式 | 用途
--- | --- | ---
id属性 | Camel | JavaScript専用
class属性 | ハイフン | CSS専用
カスタムデータ属性 | Camel | JavaScript専用

## サーバーサイドがid属性をCamel以外で自動設定する場合

例えば、Ruby on Railsのときは、次のとおり。

分類 | 書式 | 用途
--- | --- | ---
id属性 | snake | Rails専用
class属性 | ハイフン | CSS専用
カスタムデータ属性 | Camel | JavaScript専用
勝手に添削：RでCSVファイルを一行ずつ読み込む #rstatsj

こういう話がある。

- [RでCSVファイルを一行ずつ読み込む](http://blog.gepuro.net/archives/127)

> 学習データはサンプリングするからメモリに載せられるけど、 予測対象はメモリに乗らない時に一行ずつ読み込んで処理をさせたい。

それ、`foreach` と `iterators` でできるよ！

```r:R
library(foreach)
library(iterators)

iter <- iread.table("data.csv", header=FALSE, row.names=NULL, sep=",")
foreach(line.df = iter, .final=invisible) %do% {
  write.table(line.df, stdout(), row.names=F, col.names=F, sep=",")
}
```

もちろん `pforeach` でもできる。

```r:R
library(pforeach)
library(iterators)

iter <- iread.table("data.csv", header=FALSE, row.names=NULL, sep=",")
npforeach(line.df = iter, .final=invisible)({
  write.table(line.df, stdout(), row.names=F, col.names=F, sep=",")
})
```

Enjoy!

## 関連

- [【超訳】foreach パッケージの使い方](http://qiita.com/hoxo_m/items/04903cbbe9d023f0ed6d)