OmniAICreator/Qiita-1.07M huggingface dataset:
Rails で MySQL の返した Incorrect string のバイト表記文字列を、読める文字列に戻す

# 概要
HEX表記の文字列を、UTF8の文字列に変換する方法は、HEX を取り出して pack する。

# 経緯

MySQL で utf8mb4 を設定しているのに、`🎶` という文字の保存がエラーになった。

> Mysql2::Error: Incorrect string value: '\xF0\x9F\x8E\xB6' for column 'content' at row 1: UPDATE `topics` SET `content` = '🎶', `updated_at` = '2016-04-22 01:53:02.596188' WHERE `topics`.`id` = 17

仕方ないので、Rails でキャッチして、エラーメッセージを返すことにしたが、エラーメッセージの変換に苦労したので、共有する。

# コード

```
  rescue ActiveRecord::StatementInvalid => e
    if e.message.include? "Mysql2::Error: Incorrect string value:"
      message = "扱えない文字が含まれています: "
      m = e.message.match(%r{Incorrect string value: '(.*)' for})
      if m
        m1 = m[1].scan(/../).map { |b| b.to_i(16) }.reject { |x| x == 0 }.pack("C*")
        message += URI.encode(m1[0..3])
      end
      errors[:base] << message
      false
    else
      fail
    end
  end
```

# 詳細
MySQL は、エラーメッセージとして、扱えない文字を返すが、それは HEX 表記の文字列だった。

```
m[1] => "\\xF0\\x9F\\x8E\\xB6"
```

欲しいのは、UTF8 としての文字列である

```
"\xF0\x9F\x8E\xB6"
```

よって、"\\x" を削除して、hex を文字列に置き換えれば、UTF-8 のバイト列が取得できる。

```
[178] pry(main)> a = "\\xF0\\x9F\\x8E\\xB6"
=> "\\xF0\\x9F\\x8E\\xB6"
[179] pry(main)> a.scan(/../).map{ |b| b }
=> ["\\x", "F0", "\\x", "9F", "\\x", "8E", "\\x", "B6"]
[180] pry(main)> a.scan(/../).map{ |b| b.to_i(16) }
=> [0, 240, 0, 159, 0, 142, 0, 182]
[181] pry(main)> a.scan(/../).map{ |b| b.to_i(16) }.reject{|x| x == 0}
=> [240, 159, 142, 182]
[182] pry(main)> a.scan(/../).map{ |b| b.to_i(16) }.reject{|x| x == 0}.pack("C*")
=> "\xF0\x9F\x8E\xB6"
[183] puts a.scan(/../).map{ |b| b.to_i(16) }.reject{|x| x == 0}.pack("C*")
🎶
```

一回で変換できるものはないのだろうか？

# 調査中
utf8mb4 を使っているので、`①` とかは、保存される。
なぜ`🎶`が保存されないのだろうか。

# 参考
http://stackoverflow.com/questions/862140/convert-decode-hexadecimal-string-to-binary-string
Windows ネイティブなmruby.exeをmsys2で作る

mruby を githubから取ってきて、`build_config.rb`を修正。

```rb:build_config.rb
MRuby::Build.new do |conf|
  #
  # ... 中略 ...
  #
  conf.cc do |cc|
    cc.command = ENV['CC'] || 'i686-w64-mingw32-gcc'
  end

  conf.linker do |linker|
    linker.cmmand = ENV['LD'] || 'i686-w64-mingw32-gcc'
  end
end
```

あとは、コマンドプロンプトから`make`すればネイティブなmruby.exeを作れる。

`Mruby::Build`毎に上記修正が必要。

`make test`で同じようにしたい場合は`Mruby::Build.new('test')`の中を修正すること。
PhpStormでよく使うショートカット&IDE操作

PhpStormでよく使っているショートカットとIDE操作を書いてみます。
（Windowsでの表記のみです）
随時更新していこうと思います。

PhpStormのバージョンは2016.1です。

▼こちらの記事も参考にさせていただきました。
[PhpStormでまず覚えるべきショートカット](http://qiita.com/crifff/items/bbdf850f0d90ad16415a)

[PhpStormでさらに覚えるべきショートカット(IDEAもね)](http://qiita.com/tanakahisateru/items/560fda72b627aa73cc1e)

ショートカット
-----------------------------------------------------------
### ファイル名・クラス名、シンボル検索
`Shift2回押し`・・・ファイル名orクラス名orシンボル検索
`Ctrl + N`・・・クラス名検索
`Ctrl + Shift + N`・・・ファイル名検索

### コード補完
`Ctrl + Space`
![1.png](https://qiita-image-store.s3.amazonaws.com/0/27057/ce0f7fca-9464-06b3-6a50-70689f8e6889.png)

### 定義元に移動
`Ctrl + B`
または
`Ctrl + (変数やクラス名部分を)マウスクリック`

### 自動整形
`Ctrl + Alt + L`
※範囲選択してから実行した場合、選択部分だけを整形してくれる。

IDE操作
-----------------------------------------------------------
### 開いているファイルをプロジェクトビュー（ディレクトリツリー）で選択
↓のマークをクリック
![2.png](https://qiita-image-store.s3.amazonaws.com/0/27057/5f688173-b361-9bf3-78c0-ced9e5bb0c64.png)
または歯車のマークをクリックし、
[Autoscroll from Source]にチェックを入れておくと、
常にディレクトリツリーで選択してくれる。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/27057/d123c293-825b-7fae-57af-6d6d847d1510.png)

### 開いているファイルをエクスプローラーで表示
右クリックで、[Show in Explorer]をクリック。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/27057/0cc63b93-a865-1a94-0406-200dad687fbb.png)

### 画面分割
タブを右クリックし、[Split ～～]で分割。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/27057/919d96d7-f9e6-a0c2-6455-9bcbc074d07a.png)

Git操作
-----------------------------------------------------------
### Commit Chanages
`Ctrl + K`

### Push Commit
`Ctrl + Shift + K`

### 現在開いているファイルをadd
`Ctrl + Alt + A　`
フット入力 > システムブロック

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

## システムブロック図の検討

vmwareにて以下で使いたい

- ホストOS
- ゲストOS x 2

図はdraw.ioで作成 (名前: FootInput_160422)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/037988f4-68c3-76ee-baed-e872dc17175b.png)

それぞれの接続について

- Case A
  - 利点: Ethernet使用時は物理的な配置の制約を緩和できる
  - 欠点: OS切替時にESP8266 / RPi側で送信先のIPを変更しないといけない
  - 欠点: WiFi分の消費電力が増える
  - 欠点: 送信先OSの切替が必要 (broadcastではだめ)
- Case B
  - ESP8266をWiFiサーバーにする
  - 利点: Ethernet使用時は物理的な配置の制約を緩和できる
  - 利点: vmwareのゲストOS１つとの通信にできる
  - 欠点: WiFi分の消費電力が増える
  - 検討: cmdを送るインターバル (300 msec?)
- Case C
  - 利点: WiFi使用より消費電力は小さい
  - 欠点: 各OSにRS-232Cドライバを入れないといけない
  - vmwareの設定で切替はできるかもしれない
  - 欠点: 分離できないシステムのため物理的な配置は要検討

<hr>
(追記 2016/4/27)
Case Bで実装を進めている。
フット入力 > キーの検討

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

# 使いたいキー

右手が使えない場合にフット入力で使いたいキー(優先度順)

- Ctrl
  - ~~Ctrl+Space: C++ Builder XE4の入力補完~~ : 左手だけでできる
  - 右手入力分のキーを左手で打つときに使う
- Shift
  - 右手入力分のキーを左手で打つときに使う
- BackspaceもしくはDelete
- Alt
  - Alt+F9: C++ Builder XE4のコンパイル
- カーソル上下左右
- ~~Tab~~
  - Sublime Textの入力補完で使用する
  - 左手でできる

ピアノのフットペダルのようなもので6つくらいついたものが理想だが、とりあえず3つくらいでまずは検討する。

Ctrl/Shfit/Altの場合「キー押下解除」という判定が必要になる。
iOS アプリ申請時のバージョン番号、ビルド番号を自動で採番して更新する

ちょっと前から…、いやだいぶ前になっちゃうのかな…。いまは iOS アプリを申請する時に `Version` と `Build` の値を意識して使い分けるようにしないといけなくなっていると思います。

超ざっくり言うと `Version` が AppStore 上でも表示されるバージョン番号で、申請する時はこのバージョン番号でビルドしたアーカイブをアップロードします。`Build` は `Version` に紐づくマイナーアップデート番号みたいな扱い（のよう）です。

iTunes Connect に申請する場合、`Version` と `Build` のセットが同じバイナリはアップロードできません。たとえば「Version=1.0.0, Build=1」でビルドしたバイナリをアップロードしたら、「Version=1.0.0, Build=1」のバイナリは二度とアップロードできません。もしなにか不具合などがあって審査前に更新したい場合は、通常は「Version=1.0.0, Build=2」みたいな感じで `Build` 番号をインクリメントすると思います。

でも、この採番作業って地味にめんどくさいですよね。というかこの値の書き換えをリポジトリにコミットするのかどうかとか悩ましいし。率直に言ってうっとしい。

というわけで、ビルド時に自動で `Version`, `Build` の値が反映されるようにしてみました。git で管理していることが前提です。

`Version` に入る値は git tag で付けたタグの名前がそのまま入るので、 `git tag 2.1.6 -m ""` みたいな感じで予めタグをつけておく必要があります。

`Build` は、コミット回数が入ります。つまり生涯増え続ける値です。

あとついでに `COMMIT_HASH` っていう名前で最終コミットのハッシュ値も格納しています。

## 実装方法

### スクリプトの準備

以下のスクリプトをどっか適当なところに用意します。たとえば、プロジェクトのルートディレクトリに *auto-versioning.py* という名前でおきましょうか。

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

import os

from subprocess import Popen, PIPE
from Foundation import NSMutableDictionary

version_number = os.popen4("git describe --abbrev=0")[1].read().strip()
build_number   = os.popen4("git log --oneline | wc -l")[1].read().strip()
commit_hash    = os.popen4("git log -1 --pretty=format:'%h'")[1].read().strip()

info_plist = os.environ['TARGET_BUILD_DIR'] + "/" + os.environ['EXECUTABLE_FOLDER_PATH'] + "/Info.plist"

plist = NSMutableDictionary.dictionaryWithContentsOfFile_(info_plist)

# プロダクションバージョン番号
plist['CFBundleShortVersionString'] = version_number

# ビルド番号
plist['CFBundleVersion'] = build_number

# git ハッシュ
plist['COMMIT_HASH'] = commit_hash

plist.writeToFile_atomically_(info_plist, 1)
```

### Xcode の準備

`Build Phases` の後ろの方に `Run Script` を追加して、シェルコマンドとしてさっきのスクリプトを指定します。

```
python "${SRCROOT}/auto-versioning.py"
```

![スクリーンショット 2016-04-22 11.59.02.png](https://qiita-image-store.s3.amazonaws.com/0/3336/f613a7ad-ec8e-636f-f77e-aec0dee8ffb9.png)

以上です。この状態でビルドすると、ビルドしたバイナリにバージョン番号とビルド番号が自動で入ってとてもいい感じです！

ちなみにすっごくわかりにくいのですが、コードから値を参照する場合は `CFBundleShortVersionString` がバージョン番号で `CFBundleVersion` がビルド番号です。なんでなんだろうね！

## 終わりに

これを書きながらふとググったりしていたら、ところさんが書いてる記事を見付けました。そういえば以前にも見た記憶が…。

 * [これがXcodeでのバージョニングの決定版になるかも](http://www.tokoro.me/2014/05/19/xcode-versioning/)

*Info.plist の直接書き換えは不安定* といったような記述がありますね。やり方更新したほうがいいのかなー。自分が紹介したやり方はもう何年もやっててこれといった不具合には出会ってないということは一応書いておきます（気付いてないだけなのかもしれないけど）。
Vagrantで作成したVirtualBox仮想環境がネットワークに接続できない場合の対処

Vagrantで作成したVirtualBoxの仮想環境で、apt-getができないなど、インターネットに接続できない場合の対処方法。
ほぼ自分メモ。
## 環境
自分はこの環境で発生した。という意味で、一応バージョンを。
* Windows10
* VirtualBox (ver. 5.0.16 r105871)
* Vagrant (ver. 1.8.1)

## 方法
Vagrantfileに以下のコードを追加する。

```ruby
# add for dns
config.vm.provider :virtualbox do |vb|
  vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"]
  vb.customize ["modifyvm", :id, "--natdnsproxy1", "on"]
end
```
Vagrantfileは入れ子構造になっているので、そのあたりを考慮して追加する必要はある。
## その他
つながらない原因がDNSに起因する場合に有効だと思う。その他でもこの方法が当てはまるかどうかは不明です。
## 参考
Virtual Box ゲストから外部ネットワークにつながらない（解決済み）
[http://makotow.github.io/blog/2014/05/05/cannot-connect-to-virtulbox-guest-through-nat/](http://makotow.github.io/blog/2014/05/05/cannot-connect-to-virtulbox-guest-through-nat/)
KotlinでAndroidのIntentでの遷移をよくしたい！

##背景
Activity遷移でよくあるパターン
```
Intent intent=new Intent(context,Hoge.class);
intent.putExtra("foo","bar");
startActivity(intent);
```
1.contextはActivityのメンバー変数なんだからわざわざ書きたくない
2.Builderパターンを使うには、おおげさすぎ
3.putExtraがあったりなかったりで、下手にstartActivityまでメソッドの中にいれるとputExtraを入れられなくなる
4.ページによっては固定でputExtraいれることがあり、たまーに入れ忘れたりする

どうにかKotinらしいコードにならないかな
ということで作ってみた
https://github.com/kamedon/KotlinIntentSample

##ちょっとよくする
###余談
droidkaigi2016でPageをenumで定義していて、
確かにページとタイトルを結びつけて管理していたほうが、
どのActivityがどのページだっけ？とかなくなり、
あとから見直した時にわかりやすいと思った。
https://github.com/konifar/droidkaigi2016/blob/master/app/src/main/java/io/github/droidkaigi/confsched/model/Page.java

###実際のコード
Taroさんの資料を参考して、Activityの拡張関数を使うとうまいことできそう
資料だと、ActivityごとにputExtraがあったりなかったした時に面倒そう。
それも踏まえて、インテント遷移を考える

```kotlin:Page.kt

enum class Page(val nameId: Int, val page: Class<out Activity>) {
    MAIN(R.string.page_main, MainActivity::class.java) {
        override fun intent(context: Context): Intent {
            return super.intent(context).apply { addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)  }
        }
    },
    SECOND(R.string.page_second, SecondActivity::class.java),
    THIRD(R.string.page_third, ThirdActivity::class.java);

    open fun intent(context: Context) = Intent(context, page)
    fun name(resources: Resources) = resources.getString(nameId)
}
```

- pageに必ず付加するデータがある場合はintentをoverrideする。
    - 例：MainのときはFLAG_ACTIVITY_CLEAR_TOPをつけている
- 後から付加するデータがある場合は、 f: (intent: Intent) -> Intentで記述。inlineなのでノーコスト！！


```kotlin:ActivityExtension.kt
inline fun Activity.go(page: Page, f: (intent: Intent) -> Intent) = startActivity(f(page.intent(applicationContext)))
fun Activity.go(page: Page) = startActivity(page.intent(applicationContext))
```
- new Intent(context,Activity.class)のcontextはActivityのメンバー変数のため、拡張関数でいちいち打たなくてよくする

###Activityでの利用の仕方
```kotlin:Activity.kt

    val btnSecond: Button by lazy {
        findViewById(R.id.btnSecond) as Button
    }

    val btnThird: Button by lazy {
        findViewById(R.id.btnThird) as Button
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        btnSecond.setOnClickListener {
            //値をつける
            go(Page.SECOND) {
                it.putExtra("foo", "bar")
            }
        }

        btnThird.setOnClickListener {
            //ノーマルな遷移
            go(Page.THIRD)
        }
    }
```

##まとめ
だいぶわかりやすいなったと思うし、データをつけるときも{}で囲まれてすっきりとみえる。
finishをつけたいときにも簡単。
どうかな。。。

##参考
AndroidでKotlinフル活用プログラミング #Kotlin_SansanbyTaro Nagasawa
http://sssslide.com/speakerdeck.com/ntaro/androiddekotlinhuruhuo-yong-puroguramingu-number-kotlin-sansan

Advanced Kotlin for Android #DroidKaigi #DroidKaigiB
http://sssslide.com/speakerdeck.com/ntaro/advanced-kotlin-for-android-number-droidkaigi-number-droidkaigib

konifar/droidkaigi2016
https://github.com/konifar/droidkaigi2016
cmdのバッチファイルで、1コマンドを複数行にわたって記述したい場合


# 複数行に渡ったコマンドの書き方
行末に「^（5E [サーカムフレックス](https://www.wikiwand.com/ja/%E3%82%B5%E3%83%BC%E3%82%AB%E3%83%A0%E3%83%95%E3%83%AC%E3%83%83%E3%82%AF%E3%82%B9)）」を入れる。
 
 例

| before | after |
| :-: | :-: |
| ![src.png](https://qiita-image-store.s3.amazonaws.com/0/29233/a66ea453-9b90-8cd7-e68c-5a069e969c28.png) | ![result.png](https://qiita-image-store.s3.amazonaws.com/0/29233/77d90df5-93ea-a089-ccf1-9d0a3b5e4f7f.png) |
expect を使って ssh-add のパス入力を省きログイン時に自動実行

こちらの記事を参考にしました。

- [ssh-agent と expect で ssh のパスフレーズ入力を自動化 - Qiita](http://qiita.com/abpla/items/52e18c393d4cf2875384)

作業環境は MacOSX El Captain です。

自分の場合、登録したい鍵がいくつかあったので、シェル関数化して Bash スクリプト経由で `ssh-add` するようにしました。
また、鍵ファイルの PATH とパスフレーズは `~/.ssh/mysecrets.txt` というファイルに書いておくようにしました。

```
# ~/.ssh/mysecrets.txt
秘密鍵1のPATH  パスワード1
秘密鍵2のPATH  パスワード2
:
```

※秘密鍵のPATH は `~/.ssh` からの相対PATHとしました。

Bash スクリプトは下のようなもの。

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

set -e

ssh-add-expect() {
  target=$1
  pass=$2
  cat <<-EOEXP | expect -
    set timeout 3
    spawn ssh-add $HOME/.ssh/$target
    expect {
      "Enter passphrase for" {
        send "$pass\r"
      }
    }
    expect {
      "denied" { exit 1 }
      eof { exit 0 }
    }
EOEXP
}

cat ~/.ssh/mysecrets.txt | while read secret; do
  ssh-add-expect $secret
done
```

これを例えば `ssh-init.bash` として、 `~/.bash_profile` の最後に下のように書いておくと、初回ログイン時に実行してくれます。

```bash
if ! ssh-add -l >/dev/null; then
  /path/to/your-script/ssh-init.bash
fi
```

`ssh-add -l` は登録されている鍵がない場合、 `$?` が `1` になったので、`if` 節でこれを利用しました。

これまで毎回ログイン時にパス入力していましたが、これで楽になりました。
個人用：翻訳ブックマークレット

選択範囲だけを簡単に翻訳したかったので、作りました。選択していない場合、エラーにならないように新規タブでページごと翻訳。


##ブックマークレット保存用
```js:google_translate.js(COMPRESSED)
javascript:var%20t='https://translate.google.co.jp/#auto/ja/';var%20u='http://translate.google.com/translate?hl=ja&sl=auto&tl=ja&u=';var%20s=document.getSelection().toString();var%20q=location.href;if(s.length%3E0)%7Bvar%20e=encodeURIComponent(s);var%20w=window.open(t+e,'_blank','width=1280,height=800,scrollbars=yes')%7Delse%7Bvar%20e=encodeURIComponent(q);var%20w=window.open(u+e,'_tab')%7Dvoid(0);
```

##展開ソース
``` js:google_translate.js(UNCOMPRESSED)
javascript:
    //日本語ではなく他の言語に翻訳したい場合は、「ja」の部分を変更（ex. 英語の場合は「en」）
    var t = 'https://translate.google.co.jp/#auto/ja/';
    var u = 'http://translate.google.com/translate?hl=ja&sl=auto&tl=ja&u=';
    var s = document.getSelection().toString();
    var q = location.href;
    if (s.length > 0) {
        //テキストを選択している場合、Google翻訳をポップアップで表示
        var e = encodeURIComponent(s);
    var w = window.open(t + e, '_blank', 'width=1280,height=800,scrollbars=yes');
    } else {
        //テキストを選択していない場合、新規タブでページ翻訳
        var e = encodeURIComponent(q);
        var w = window.open(u + e, '_tab');
    }
    void(0);
```

##参考サイト
iPhone_User_Now!
http://ameblo.jp/keitaxxx1/entry-11499922175.html
GitHub の Star 数とかを img として表示する

http://shields.io/ を使うよ。React.js だと [![GitHub stars](https://img.shields.io/github/stars/facebook/react.svg)]()

Qiita で複数のリポジトリーを比較するのに使ってみた:

http://qiita.com/takatama/items/ddaf9e85c71f7f0e922a

使い方

HTML:

```html
<img src="https://img.shields.io/github/stars/[GitHubのユーザー名]/[GitHubのリポジトリー名].svg"/>
```

Markdown:

```markdown
[![GitHub stars](https://img.shields.io/github/stars/[GitHubのユーザー名]/[GitHubのリポジトリー名].svg)]()
```
ScalaのJSONライブラリいくつかベンチマーク

case classに対するcodecを自動で定義してくれる系のJSONライブラリをいくつか試してみました

- [argonaut-shapeless](https://github.com/alexarchambault/argonaut-shapeless)
- [circe](https://github.com/travisbrown/circe)
- [JSON4S](https://github.com/json4s/json4s)
- [spray-json-shapeless](https://github.com/fommil/spray-json-shapeless)

コード: https://github.com/ocadaruma/benchmark-json-libs

## それぞれの簡単な使い方

```scala
case class Foo(a: String, b: Double, c: Boolean)
val foo = Foo("foo", 42.0, true)
```

### argonaut-shapeless

```scala
import argonaut.Argonaut._
import argonaut.Shapeless._

foo.asJson.nospaces // => {"c":true,"b":42.0,"a":"foo"}
"""{"c":true,"b":42.0,"a":"foo"}""".decode[Foo].toOption // => Some(Foo(foo,42.0,true))
```

### circe

```scala
import io.circe.parser._
import io.circe.syntax._
import io.circe.generic.auto._

foo.asJson.noSpaces // => {"a":"foo","b":42.0,"c":true}
decode[Foo]("""{"a":"foo","b":42.0,"c":true}""").toOption // => Some(Foo(foo,42.0,true))
```

### JSON4S

```scala
import org.json4s._
import org.json4s.jackson.{Serialization, JsonMethods}

implicit val formats = DefaultFormats

Serialization.write(foo) // => {"a":"foo","b":42.0,"c":true}
JsonMethods.parse("""{"a":"foo","b":42.0,"c":true}""").extract[Foo] // => Foo(foo,42.0,true)
```

### spray-json-shapeless

```scala
import spray.json._
import fommil.sjs.FamilyFormats._

foo.toJson.compactPrint // => {"a":"foo","b":42.0,"c":true}
"""{"a":"foo","b":42.0,"c":true}""".parseJson.convertTo[Foo] // => Foo(foo,42.0,true)
```

## ベンチマーク結果

sbt-jmh使いました。

```
[info] Benchmark                                         Mode  Cnt   Score   Error  Units
[info] BenchmarkJsonLibs.argonautShapelessDeserialize   thrpt   10  41.063 ± 1.909  ops/s
[info] BenchmarkJsonLibs.argonautShapelessSerialize     thrpt   10  37.530 ± 0.926  ops/s
[info] BenchmarkJsonLibs.circeDeserialize               thrpt   10  52.426 ± 4.896  ops/s
[info] BenchmarkJsonLibs.circeSerialize                 thrpt   10  46.619 ± 1.056  ops/s
[info] BenchmarkJsonLibs.json4sJacksonDeserialize       thrpt   10  50.363 ± 1.359  ops/s
[info] BenchmarkJsonLibs.json4sJacksonSerialize         thrpt   10  29.081 ± 0.509  ops/s
[info] BenchmarkJsonLibs.json4sNativeDeserialize        thrpt   10  37.430 ± 1.234  ops/s
[info] BenchmarkJsonLibs.json4sNativeSerialize          thrpt   10  28.723 ± 0.934  ops/s
[info] BenchmarkJsonLibs.sprayJsonShapelessDeserialize  thrpt   10  70.349 ± 2.470  ops/s
[info] BenchmarkJsonLibs.sprayJsonShapelessSerialize    thrpt   10  29.165 ± 0.468  ops/s
```

Serializeはcirceがもっとも速く、Deserializeではspray-json-shapelessが一番速いという結果になりました。

今度Parserを変えていろいろ試してみよう
aタグの中にaタグを書きたい時のtips

html5ではインライン要素とブロックレベル要素の分類はなくなり、html4以前でインライン要素だったものの中にブロック要素を入れることができたりするようになりました。

また、そうすることでコンテンツ全体をaタグで囲い、その中にまたaタグを入れるようなレイアウトが出来るように成りました。

##よくあるリンクの中にリンクを入れたいレイアウト

![sample2.png](https://qiita-image-store.s3.amazonaws.com/0/5186/9b8144c2-abe7-8a1f-03ee-1452bd9ec8c6.png)

よくありますよね！
全体をリンクにしてるけど、中の一部は違う場所にリンクを貼りたい！
これの実装を考えてみます。

##実装方法

###見た目通り普通に書いてみる
aタグの中にaタグを書いて実装しようとすると以下のように書くと思います。
 
```html
<a href="/articles/1"> <!-- 全体をクリックすると記事ページヘ遷移 -->
  <img src="/assets/articles/1.jpg">
  <p>タイトルタイトル</p>
  <div>
    <span>著者名：</span>
    <a href="/users/fukami">ふかみ</a>　<!-- 著者名をクリックすると著者ページに遷移 -->
  </div>
  <div>
    <span>タグ：</span>
    <a href="/tags/yakei">夜景</a><!-- タグをクリックするとそのタグページヘ遷移 -->
    <a href="/tags/buildings">ビル</a><!-- タグをクリックするとそのタグページヘ遷移 -->
    <a href="/tags/beautiful">綺麗</a><!-- タグをクリックするとそのタグページヘ遷移 -->
  </div>
</a>
```

しかしこちら、ブラウザでhtmlファイルをパースされた後は、こうなります。

```html
<a href="/articles/1">
  <img src="/assets/articles/1.jpg">
  <p>タイトルタイトル</p>
</a>
<div>
  <a href="/articles/1">
    <span>著者名：</span>
  </a>
  <a href="/users/fukami">ふかみ</a>
</div>
<div>
  <span>タグ：</span>
  <a href="/tags/yakei">夜景</a><!-- タグをクリックするとそのタグページヘ遷移 -->
  <a href="/tags/buildings">ビル</a><!-- タグをクリックするとそのタグページヘ遷移 -->
  <a href="/tags/beautiful">綺麗</a><!-- タグをクリックするとそのタグページヘ遷移 -->
</div>

```
　
ブラウザが勝手にaタグの閉じ位置を補完してくれるので意図していない形に書き換えられてしまいます。

それではどのように実装すればいいのでしょう

###1.jsで飛ばす
先ほどのaタグ内にあるaタグを全てspanタグ等のタグで書き換え、jsで飛ばしてしまいましょう。

```html
<a href="/articles/1"> <!-- 全体をクリックすると記事ページヘ遷移 -->
  <img src="/assets/articles/1.jpg">
  <p>タイトルタイトル</p>
  <div>
    <span>著者名：</span>
    <span data-url="/users/fukami" class="js-link">ふかみ</span>　<!-- jsで著者名をクリックすると著者ページに遷移 -->
  </div>
  <div>
    <span>タグ：</span>
    <span data-url="/tags/yakei" class="js-link">夜景</span><!-- jsでタグをクリックするとそのタグページヘ遷移 -->
    <span data-url="/tags/buildings" class="js-link">ビル</span><!-- jsでタグをクリックするとそのタグページヘ遷移 -->
    <span data-url="/tags/beautiful" class="js-link">綺麗</span><!-- jsでタグをクリックするとそのタグページヘ遷移 -->
  </div>
</a>
```

```js
$('.js-link').on('click', function(e){
  //伝播をストップ
  e.stopPropagation();
  e.preventDefault();
  
  //リンクを取得して飛ばす
  location.href = $(this).attr('data-url');
})
```

今までこの方法で飛ばしていましたが、レイアウトを実現するためだけにjavascriptのイベント呼び出してて気持ち悪いし、SEO的にちゃんとリンク拾ってくれてるのかな？って疑問に思ってました。

###2.aタグ内のaタグはobjectタグで囲む
aタグ内のaタグはobjectタグで囲ってあげると正しくパースされます。

```html
<a href="/articles/1"> <!-- 全体をクリックすると記事ページヘ遷移 -->
  <img src="/assets/articles/1.jpg">
  <p>タイトルタイトル</p>
  <div>
    <span>著者名：</span>
    <object><a href="/users/fukami">ふかみ</a></object>
  </div>
  <div>
    <span>タグ：</span>
    <object><a href="/tags/yakei">夜景</a></object>
    <object><a href="/tags/buildings">ビル</a></object>
    <object><a href="/tags/beautiful">綺麗</a></object>
  </div>
</a>
```

こうするとjsも何も使わずにaタグ内にaタグを使用してレイアウトを組むことができます。

**が！！！**

[★HTML5タグリファレンス](http://www.htmq.com/html5/object.shtml)のobjectの項目を引用すると
> <object>タグは、文書に外部リソースを埋め込む際に使用します。 <embed>がプラグインを必要とするデータを埋め込むのに対して、 <object>には外部リソース全般を指定することができます。

となっており、「外部リソースを埋め込む際に使用する」とあります。
もうなんか文章の構造的にも意味不明なのであまりオススメはしませんが、
レイアウトを実現するためだけなら無駄なjsなどを使わずに実装できるのでおすすめです。
連続してRDPする謎スクリプトを作った

[Windows]Windowsの資格情報一括登録、一括削除

むかーしむかし、暇だったので作った謎スクリプトです。何に使えるかは不明

csvに書いたターゲットに連続でRDPを仕掛ける謎スクリプト
そして使い終わった後登録した資格情報をお掃除するまたまた謎スクリプト

① csvを書きます
② 資格情報登録スクリプトを動かします
③ RDP多重接続スクリプトを動かします

csvに書いてあるクライアントにRDP仕掛けます。

スクリプトとｃｓｖは全部同じディレクトリに格納して下さい。

---

```bat:資格情報登録スクリプト.bat
@Echo off
setlocal

rem TargetIP=IPアドレス
rem UserName=ユーザ名
rem Password=パスワード
REM Cmdkey /generic:TERMSRV/%SERVER% /user:%USERNAME% /pass:%PASSWORD%

FOR /F "tokens=1-3 skip=1 delims=," %%i In (%TargetFile%) do (
CALL :ADD_CMDKEY %%j
GOTO :EOF
)


REM -------------------------------------------------------

:ADD_CMDKEY
set TargetIP=%~3
set UserName=<ユーザ名>
set Password=<パスワード>
cmdkey /generic:%TargetIP% /user:%UserName% /pass:%Password%

```


```bat:RDP多重接続スクリプト.bat
@Echo off
setlocal

rem TargetIP=IPアドレス

FOR /F "tokens=1-3 skip=1 delims=," %%i In (%TargetFile%) do (
Start mstsc /v:%%k
GOTO :EOF
)

```

```csv:TargetFile.csv
no,hostname,ip-addr
1,hogehoge1,192.168.10.1
2,hogehoge2,192.168.10.2
...
...
...
```
【AWS】教訓　S3＋Route53 静的ウェブサイトホスティング

S3の静的Webサイトホスティング設定時にハマったことを教訓に。

###独自ドメインの利用

S3を使ってWebサイトホスティングを有効化すると以下の様なS3エンドポイントが払い出される

__<バケット名>.s3-website-ap-northeast-1.amazonaws.com__

【やりたいこと】
コレではWebサイト運用にこまるためRoute53を使って独自ドメインアクセスを可能としたい

---

###ハマりポイント＝＞エイリアスが利用できない！
Route53からS3エンドポイントをエイリアスしたがったが出来なかった。

###理由：バケット名とホストするゾーン名は合わせなければならない

S3のバケット名を自分は下記のように設定していた

```:バケット名
<AWS_ACCOUNT_ID>-hogehoge_zone.com
```

Route53でホストしていたゾーン名はこうだ

```:ドメイン名
hogehoge_zone.com
```

このようになっているとエイリアスが利用できないのと、CNAMEで直に設定しても名前の不一致で利用することが出来ません。

```:バケット名
hogehoge_zone.com
```

```:ドメイン名
hogehoge_zone.com
```

というように合わせることにしましょう。

---

S3のデフォルトのindex.htmlはバケット直下じゃないとしていできません。
しかし、Apacheからそのまま移植したりする場合、Rootの関係とかでなかなか難しいこともあるかと・・・
そんな時は直下に0バイトのindex.htmlを作成し、メタデータの __Website Redirect__ で対象までのパスを指定しましょう

```
バケット/hoge/fuga/index.html
```

をデフォルトに使用したい場合は

```
/hoge/fuga/index.html
```

を値に設定すればよい。
Windows Script Hostを無効化

# .jsファイルの実行を無効化する

ランサムウェアで流行ってるので無効化する方法

1. jsファイルの関連付けを外す
2. レジストリをいじる

2はF-Secureのブログに書いてありました。

`HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Script Host\Settings\Enabled`

0にすると実行できなくなるけど、VBSも使えなくなります。
RDSをSSHトンネルでつないでRailsで使ってみた

RDSをSSHトンネルしてRailsのDBに指定した時にハマった時のメモ。

セキュリティを考慮して、RDSは同じVPC内からしか接続できない（publicにしない）設定をし、
VPC内のEC2サーバを経由して指定したIPからだけSSHで接続できるようにした（SSHトンネル）。

ここまでは、下記URLの通りやったらすんなりできた。

http://chxo.com/be2/20040511_5667.html
https://blog.cloudpack.jp/2014/12/16/connect-to-amazon-rds-mysql-in-vpc-with-ssh-portforward/

ローカルの3307ポートにフォワードしているので、下記のmysqlコマンドで接続を確認して、

```
$ mysql -h 127.0.0.1 --port=3307 -u user_id -p
```

RailsのDBに下記のように指定したところ、接続できず。

```database.yml
development:
  adapter: mysql
  database: dev_db
  username: user_id
  password: password
  host: localhost
  port: 3307
```

結論として、下記のようにhostに127.0.0.1を指定すると無事RailsのDBとして利用できた。

```database.yml
development:
  adapter: mysql
  database: dev_db
  username: user_id
  password: password
  host: 127.0.0.1
  port: 3307
```
DockerfileのRUN命令ごとにカレントディレクトリがトップに戻る


Dockerでgem install --localをしようとしてハマった時のメモ。
結論から言うと、DockerfileのRUN命令ごとにカレントディレクトリがトップに戻ることを知らなかった。

gemが多かったので、下記のようにgem installを数行に分けていたら、

```Dockerfile
RUN /bin/bash -c "cd /usr/local/package/lib/gems;"
RUN /bin/bash -c "gem install --local rake"
RUN /bin/bash -c "gem install --local will_paginate"
```

docker buildすると、


```
ERROR:  Could not find a valid gem 'rake' (>= 0) in any repository
ERROR:  Could not find a valid gem 'will_paginate' (>= 0) in any repository
```

というエラーが出る。そこで１行目に、ls -lを追加したところ、ファイルは確かにあるようなので、

```Dockerfile
RUN /bin/bash -c "cd /usr/local/package/lib/gems;ls -l"
RUN /bin/bash -c "gem install --local rake"
RUN /bin/bash -c "gem install --local will_paginate"
```

途中にpwdを追加したところ、ルートに戻っていた。

```Dockerfile
RUN /bin/bash -c "cd /usr/local/package/lib/gems;ls -l"
RUN /bin/bash -c "pwd"
RUN /bin/bash -c "gem install --local rake"
RUN /bin/bash -c "gem install --local will_paginate"
```

カレントディレクトリを引き継ぐ方法がよくわからなかったので、とりあえず、cdするようにして解決。
（「/」は複数行にRUNを分けるための記法）

```Dockerfile
RUN /bin/bash -c "cd /usr/local/package/lib/gems;ls -l"
RUN /bin/bash -c "cd /usr/local/package/lib/gems;/
 gem install --local rake will_paginate"
```
Kotlin の Class Delegation を使ってモック生成を簡単にするパターン

Kotlin には [Class Delegation](https://kotlinlang.org/docs/reference/delegation.html) という機能が言語レベルで用意されています。

```kotlin
interface MyInterface {
  fun hoge(): String
}
class Impl : MyInterface {
  override fun hoge() : String = "implemented!!"
}

class Delegation : MyInterface by Impl()

val i = Delegation()

println("${i.hoge()}") // implemented!!
```

コードサンプルを書くとなんてことが無い機能で、 interface の実装をクラス定義の際に別のインスタンスへ委譲できるようになります。確かに、多重継承が許されている Kotlin では、この機能を利用することで同じ実装が何度も登場するのを防ぐことができる・・・そんな気がします。

とは言え、具体的にどこで使用するべきなのか、となると良いサンプルが思いつきませんが、例えばテストを書くときに、モックオブジェクトの生成を Class Delegation を使うことで簡単にできます。

## 無名オブジェクトを作って、必要な部分のみをオーバーライドする

ユニットテストを書くときモックを作るパターンはよくあります。モックを作るための仕組みとして [mockito](http://mockito.org/) 等のライブラリがあります。しかし、 Kotlin ではライブラリに依存することなく Class Delegation を利用することでモックの生成が可能になります。

```kotlin:impl.kt
interface User {
  val name: String
  val id: Long
  val address: Address
}

fun testTargetFunction(u: User) : String = u.name.toUpperCase()
```

上記のような interface `User` と実装 `testTargetFunction` があった物として。

```kotlin:test.kt
fun loadUserByJSON(json: String) : User = { ... }

fun test() {
  val user = object: User by loadUserByJSON(json) {
    override val name: String = "name"
  }

  val expected = "NAME"
  val actual = testTargetFunction(user)
  assert(expected == actual)
}
```

このように、テストのときに必要なメソッドのみをオーバーライドした無名オブジェクトを作ることができます。

WEBサービスと連携をするアプリなんかを作るときに、テスト用データを利用してテストをするときに便利だと思います。

便利な Kotlin を使ってスマートにテストを書いていきましょう。
URLスキームで電話がかけられるかどうかの判別方法 (not canOpenURL but CoreTelephony)


# TL;DR
iPod touchも含め、iOSデバイスで電話がかけられるかどうかを判別するためには、`CoreTelephony.framework`を使う。

# 今までやっていた方法

```swift
let application = UIApplication.sharedApplication()
let canCall: Bool
if let URL = NSURL(string: "tel://") {
    canCall = application.canOpenURL(URL)
} else {
    canCall = false
}

if canCall {
    application.openURL(URL)
} else {
    print("can't call")
}
```

# 問題点
iPod touchでは判別できない。 (iOS 8, 9両方とも)

# 解決策
CoreTelephony.framework を使う。

[CTCarrier Class Reference - iOS Developer Library](https://developer.apple.com/library/ios/documentation/NetworkingInternet/Reference/CTCarrier/index.html#//apple_ref/occ/instp/CTCarrier/isoCountryCode)

```swift
// CTCarrier
var isoCountryCode: String? { get }
```
>The value for this property is nil if any of the following apply:
The device is in Airplane mode.
There is no SIM card in the device.
The device is outside of cellular service range.


`isoCaountryCode`がnilの場合、下記のいずれかに該当する

- 機内モード
- SIMカードが入っていない
- 携帯電話サービスの圏外

ドキュメントには書かれていないが、iPod touchの場合、`CTCarrier`が取得できず、`nil`になっていた。


```swift
import CoreTelephony

let netInfo = CTTelephonyNetworkInfo()
let carrier: CTCarrier? = netInfo.subscriberCellularProvider

// SIMカードが挿入されたiPadを除外するために `userInterfaceIdiom` をチェックする
let isPhone: Bool = (UIDevice.currentDevice().userInterfaceIdiom == .Phone)

let canCall: Bool = (carrier?.isoCountryCode != nil) && isPhone

if canCall {
    UIApplication.sharedApplication().openURL(URL)
} else {
    print("can't call")
}
```

# 参照
- [CTTelephonyNetworkInfo Class Reference - iOS Developer Library](https://developer.apple.com/library/ios/documentation/NetworkingInternet/Reference/CTTelephonyNetworkInfo/index.html#//apple_ref/occ/instp/CTTelephonyNetworkInfo/subscriberCellularProvider)
- [CTCarrier Class Reference - iOS Developer Library](https://developer.apple.com/library/ios/documentation/NetworkingInternet/Reference/CTCarrier/index.html#//apple_ref/occ/instp/CTCarrier/isoCountryCode)
iij/ipgenを試してみる

[iij/ipgen](https://github.com/iij/ipgen)というFreeBSD上で動作するパケットジェネレータがGitHubで公開されていたので試してみました。

以下の手順は[iij/ipgen/README.md](https://github.com/iij/ipgen/blob/master/README.md)の内容を元に、FreeBSD+NetBSDでテスト環境を構築するまでの手順です。

# ネットワーク構成

今回は以下のようなネットワーク構成で試してみました。

```
+-------------------------------------+
|               FreeBSD               |
+---+-----------------+---------------+
    |em1              |em2
    |172.16.0.59      |172.16.1.159
    |                 |
    |                 |
    |wm1              |wm2
    |172.16.0.58      |172.16.1.158
+---+-----------------+---------------+
|                NetBSD               |
+-------------------------------------+
```

FreeBSDは10.3-RELEASEを使用しています。

```
$ freebsd-version -ku
10.3-RELEASE
10.3-RELEASE
```

# netmap機能をカーネルに組み込む

ipgenは[netmap](http://info.iet.unipi.it/~luigi/netmap/)というパケットI/Oフレームワークを使用しています。この機能はGENERICカーネルには組み込まれていないため、事前にカーネルを再構築します。

```
$ mkdir -p ~/work/pakeana
$ cd ~/work/pakeana
$ curl -O http://ftp.jaist.ac.jp/pub/FreeBSD/releases/amd64/10.3-RELEASE/src.txz
$ tar Jxvf src.txz -C .
$ cd usr/src/sys/amd64/conf/
$ cp -p GENERIC PAKEANA01
$ vi PAKEANA01
...
$ diff -ur GENERIC PAKEANA01
--- GENERIC     2016-03-25 10:09:25.000000000 +0900
+++ PAKEANA01   2016-04-20 00:41:01.631701000 +0900
@@ -364,3 +364,5 @@

 # VMware support
 device         vmx                     # VMware VMXNET3 Ethernet
+
+device         netmap
$ config PAKEANA01
Kernel build directory is ../compile/PAKEANA01
Don't forget to do ``make cleandepend && make depend''
$ cd ../compile/PAKEANA01/
$ make cleandepend
$ make depend
$ make
$ sudo make install
```

これでnetmapが組み込まれたカーネルがインストールされました。FreeBSDを再起動した後、以下のコマンドでnetmapが有効になっていることを確認できます。

```
$ sysctl -a | grep device | grep netmap
device   netmap
```

# ipgenのビルドとインストール

次にipgenをビルドします。ipgenはlibeventを使用しているので予めパッケージからインストールしておきます。

```
$ pkg search libevent2
libevent2-2.0.22_1             API for executing callback functions on events or timeouts
$ sudo pkg install libevent2-2.0.22_1
$ git clone https://github.com/iij/ipgen.git
$ cd ipgen
$ make depend
$ sudo make install
```

# NetBSD側での準備

対向側のマシンとなるNetBSDでは、IP forwardingを有効にしておきます。

```
# sysctl -w net.inet.ip.forwarding=1
net.inet.ip.forwarding: 0 -> 1
```

これでipgenを試してみるための準備が整いました。

# ipgenでパケット送出

以下のコマンドでパケットを送出します。"T"はTx、"R"はRxですね。

```
$ sudo ipgen -Tem1,172.16.0.58,172.16.0.59/24 -Rem2,172.16.1.158,172.16.1.159/24
```

実行画面はこんな感じです。CLI(TUI?)からパケット送出の開始・停止や送出パケットサイズ等を変更することができます。

![img101.png](https://qiita-image-store.s3.amazonaws.com/0/61137/62c5fc6f-b7e6-64fa-a127-da663257d8b8.png)

また、CLIと共にWebインタフェースも利用できます。8080番ポートにアクセスすると、ブラウザからパケット送出の制御が行えます。

![スクリーンショット 2016-04-22 8.08.52.png](https://qiita-image-store.s3.amazonaws.com/0/61137/161e4bdd-e452-1b45-11f1-7e36c7d51d75.png)

こんな感じでipgenを試してみるための環境が構築できました。

# まとめ

iij/ipgenというパケットジェネレータを試してみました。Raspberry Pi+FreeBSDでipgenを動かすようにすると、(NICが100Mなのが玉にキズですが)お手軽に利用できるパケットジェネレータ環境として活用できそうです。また、ipgenのソースコードを参考にnetmapを調べてみるのも面白そうです。
ChainerをUbuntu14.04へインストールした際の手順メモ

Dense CaptioningやSelective Search
DQNの実装を目指してChainerをインストールしました。

［Dense Captioning]
http://cs.stanford.edu/people/karpathy/densecap/

参考書からセットアップしたので手順をメモしておきます。

環境はUbuntu 14.04
#Chainerの依存ライブラリインストール

```
$ sudo apt-get install python2.7
$ sudo apt-get install python-numpy
$ sudo apt-get install libhdf5-dev
$ sudo pip install -U setup-tools
$ sudo pip install -U cython
```

setuptoolsのインストールについては参考にした書籍に誤記があるかも知れません
<ul>

<li><a href="http://qiita.com/manjiroukeigo/items/d88d2f97adc314dc6231" target="_blank" >Ubuntu14.04 への Chainerのインストール中にsetuptoolsインスコで躓いたのでメモ - Qiita</a><i class="fa fa-external-link"></i></li>
</ul>


 



#Cudaの環境変数の設定
ＧＰＵの使用に対して環境変数と
-CuDNN v4
-protocol buffers
上２つのライブラリが必要です

```
$ export CUDA_ROOT=/usr/local/cuda
$ export PATH=$PATH:/usr/local/cuda/bin
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/lib
$ export CPATH=$CPATH:/usr/loca/cuda/include
$ export CUDA_INC_DIR=/usr/local/cuda/bin:$CUDA_INC_DIR 
```


#Chainerのインストール
protocol bufferのインストールと
Chainerのインストール(自身のアカウントのホーム領域配下に記載)

```
$ sudo pip install protobuf
$ sudo pip install chainer
```
サンプルのインストール
```
$ sudo git clone https://github.com/pfnet/chainer.git
```
 

ministを使用した動作確認テスト

```
$ cd　~/chainer/examples/mnist
$ mnist sudo python train_mnist.py
$ mnist sudo python train_mnist.py --gpu=0　//GPU使用する場合
$ sudo python train_mnist.pyGPU: -1
```
*GPU使用の場合 --gpu=(GPUのID)


学習結果が表示されます

```
# unit: 1000
# Minibatch-size: 100
# epoch: 20
Network type: simple

load MNIST dataset
epoch 1
graph generated
train mean loss=0.192183390001, accuracy=0.942250003902, throughput=205.787747527 images/sec
test mean loss=0.097593400433, accuracy=0.969000005126
epoch 2
train mean loss=0.0745383219374, accuracy=0.977550010482, throughput=204.740891398 images/sec
test mean loss=0.0760766306671, accuracy=0.976100005507
.

.

.

test mean loss=0.0971296599999, accuracy=0.982500005364
epoch 19
train mean loss=0.00823042495485, accuracy=0.997333335876, throughput=208.702609375 images/sec
test mean loss=0.112126590184, accuracy=0.982200008631
epoch 20
train mean loss=0.00885681845254, accuracy=0.997333335777, throughput=207.561653063 images/sec
test mean loss=0.112605881691, accuracy=0.982200006247
save the model
save the optimizer
```

#Caffe 学習済みモデルのインポート

必要なライブラリをインストール

```
$ sudo pip install pillow
$ sudo pip install protobuf 
```

ネットワークから必要なモデルをダウンロード
今回はalexnetをダウンロードしました

```
$ cd ~/chainer/examples/modelzoo
$ sudo python download_model.py alexnet
```


参考書籍

[イラストで学ぶディープラーニング](http://www.amazon.co.jp/%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88%E3%81%A7%E5%AD%A6%E3%81%B6-%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-KS%E6%83%85%E5%A0%B1%E7%A7%91%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8-%E5%B1%B1%E4%B8%8B-%E9%9A%86%E7%BE%A9/dp/406153825X
)
技術英語 > A week's worth.

@ Star Trek Voyager > MELD

キムとトム・パリスがビリヤードでの勝負で賭けるものを話している。Voyagerの世界では、フードレプリケーターでエネルギーを使えば自由に食料を作れるという設定があるので、そのエネルギーをどれくらい賭けるか、という話をしている。

> A week's worth.

1週間分のレプリケーターのエネルギーを賭ける。

現実世界にはレプリケーターはない。「ある機能の実装にどれくらいの時間をかけるか」というような場合に使えるだろうか。

http://blogs.itmedia.co.jp/komata/
のどこかの回で、プロトタイピングを１日でやってしまう、という記事が確かあった。A Day's worth. という使い方ができるだろうか。

プログラミングでメシが食えるか!? by 小俣光之さん
の方だった。

> 商品開発のような作業の場合、１日でプロトタイプができなかったら、一度止めます。１日必死に考えてダメなことを、何日もだらだらやっていてもまずできないからです。
dein.vim を使ってみた (というかただ初期設定してみた)


重い腰を上げて、ようやく [NeoBundle](https://github.com/Shougo/neobundle.vim) から [dein.vim](https://github.com/Shougo/dein.vim) に乗り換えてみました。

## 何はなくともまずはGitHub

とにかくインストールしてみよう！ってことで、下記を実行。

```bash:公式リポジトリのREADMEより
$ curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh
$ sh ./installer.sh {specify the installation directory}
```

```{specify the installation directory}```の部分は何を指定したら良いんだろう？と思ったけど、たぶん```$HOME/.vim```でいいんじゃね？って事でこうしてみた。

```bash:こうしてみた
$ sh ./installer.sh $HOME/.vim
```

```bash:こんな風になった
$ sh ./installer.sh $HOME/.vim
Install to "/home/vagrant/.vim/repos/github.com/Shougo/dein.vim"...

git is /usr/bin/git

Begin fetching dein...
Initialized empty Git repository in /home/vagrant/.vim/repos/github.com/Shougo/dein.vim/.git/
remote: Counting objects: 2931, done.
remote: Compressing objects: 100% (72/72), done.
Receiving objects: 100% (2931/2931), 465.40 KiB | 166 KiB/s, done.
remote: Total 2931 (delta 36), reused 0 (delta 0), pack-reused 2853
Resolving deltas: 100% (1690/1690), done.
Done.

Please add the following settings for dein to the top of your vimrc (Vim) or init.vim (NeoVim) file:


"dein Scripts-----------------------------
(略)
"End dein Scripts-------------------------


Done.
Complete setup dein!
```

ちなみにワンライナーでこんな風にも書ける。

```bash:ワンライナー
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh)" -- ~/.vim
```

## $HOME/.vim/repos/github.com/Shougo/dein.vim ？？？

ん・・・？ **なんかやたら階層深くね？**

・・・と思ったけど、どうやら```$HOME/.vim/bundle```の代わりが```$HOME/.vim/repos```って感じらしい。
```repos```の配下はリポジトリURLに対応する感じなのね。なるほどね。

## $HOME/.vimrc

というわけで、うちの```$HOME/.vimrc```はこんな風にしてみました。

```vim:$HOME/.vimrc
"dein Scripts-----------------------------
if &compatible
    set nocompatible " Be iMproved
endif

" Required:
set runtimepath^=~/.vim/repos/github.com/Shougo/dein.vim

" Required:
call dein#begin(expand('~/.vim'))

" Let dein manage dein
" Required:
call dein#add('Shougo/dein.vim')

if filereadable(expand('~/.vimrc.dein'))
    source ~/.vimrc.dein
endif

" Required:
call dein#end()

" Required:
filetype plugin indent on

" If you want to install not installed plugins on startup.
if dein#check_install()
    call dein#install()
endif

"End dein Scripts-------------------------

runtime! conf.d/.vimrc.*
if filereadable(expand('~/.vimrc.local'))
    source ~/.vimrc.local
endif
```

```dein.vim``` で管理したいプラグインは ```$HOME/.vimrc.dein``` に追記していく感じで。
Windows10にh5pyをサクッとインストールする方法【非公式】

[h5py](http://docs.h5py.org/en/latest/)のインストールに少し手間取ったので、メモ用として投稿する。
ソースからビルドすると「no such h5py.h」などのエラーが大量に出力されて地獄だったので、サクッとインストールする方法を以下に記す。

なお、h5pyの公式アナウンスはAnacondaやMinicondaを使うことを強く推奨している。
が、ソースからインストールしたい場合は以下を手順を行う。

## h5pyのwheelを拾ってくる。
[Python Extension Packages for Windows - Christoph Gohlke](http://www.lfd.uci.edu/~gohlke/pythonlibs/)から自身の環境に合ったh5pyのwheelをダウンロードする。
私はWindows10でPython3.4を使っているので「h5py-2.6.0-cp34-cp34m-win32.whl」を使った。

## pip installでインストール
以下のコマンドを叩くだけだ。
```
pip install h5py-2.6.0-cp34-cp34m-win32.whl
```

これで完了。

Chainer1.5から[h5pyに依存](http://qiita.com/unnonouno/items/c491b6df59352159cbf0)するようになったらしいので、h5pyのインストールで手間取っている方に参考にして貰えると幸いだ。

以上

## 参考文献
1. [h5py](http://docs.h5py.org/en/latest/#)
2. [Python Extension Packages for Windows - Christoph Gohlke](http://www.lfd.uci.edu/~gohlke/pythonlibs/)
3. [Chainer 1.5のインストールがうまくいかない人への非公式なTips](http://qiita.com/unnonouno/items/c491b6df59352159cbf0)
Objectのequalsメソッドは==と等価

二つのObject型に対する equals メソッドはObject型参照変数のアドレスが一緒であれば true となります。== と同じ。

```lang:ObjectEquals.java 
public class ObjectEquals {
  public static void main(String[] args) {
    Object obj1 = new Object();
    Object obj2 = new Object();
    Object obj3 = obj2;
    System.out.println(obj1 == obj2);
    System.out.println(obj1.equals(obj2));
    System.out.println(obj3 == obj2);
    System.out.println(obj3.equals(obj2));
  }
}
```

false
false
true
true
と表示されます。

[実験はこちら](https://jgist.herokuapp.com/0265eb0b6fb9b8fd51fb43f5c39d0abc/ObjectEquals.java?rows=15)

以下「Java(tm) Platform, Standard Edition 8 API仕様」 Object#equals からの引用です。 
（https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Object.html）

>Objectクラスのequalsメソッドは、もっとも比較しやすいオブジェクトの同値関係を実装します。つまり、null以外の参照値xとyについて、このメソッドはxとyが同じオブジェクトを参照する(x == yがtrue)場合にだけtrueを返します。

（shiracamusさんからアドバイスをいただきました。ありがとうございます。）
。
Java の arraycopy メソッドの引数は「元配列、元開始位置、先配列、先開始位置、個数」の順で「上書き」

いつも忘れるので備忘録的メモ。

```lang:ArrayCopy.java
import java.util.Arrays;

public class ArrayCopy {
  public static void main(String[] args) {
    int[] array = {1, 2, 3, 4, 5};
    System.out.println(Arrays.toString(array));
    System.arraycopy(array, 2, array, 1, 2);
    System.out.println(Arrays.toString(array));
  }
}
```

[1, 2, 3, 4, 5]
[1, 3, 4, 4, 5]

と表示されます。

[実験はこちら](https://jgist.herokuapp.com/0265eb0b6fb9b8fd51fb43f5c39d0abc/ArrayCopy.java?rows=15)
Delphi 10.1 Berlin で実装された FireUI App Preview

#概要
FireUI App Preview（たまに Live Preview と書いてあったりする）は、編集中の画面をリアルタイムに*実機*に表示する機能です。

#使ってみる
まずは、プレビューを表示したい端末に FireUI App Preview アプリをインストールします。

[Android 用 FireUI App Preview 10.1 Berlin](https://play.google.com/store/apps/details?id=com.embarcadero.LivePreview101)
[iOS 用 FireUI App Preview 10.1 Berlin](https://itunes.apple.com/us/app/fireui-app-preview-10.1-berlin/id1090861997)

~~残念なことに、iOS 用の App Preview クライアントは、まだ準備中でリリースされていません！~~
~~近日リリースとのこと！~~
リリースされました！

さて、このアプリを起動すると自動的にローカルネットワークをサーチして、起動している Delphi 10.1 Berlin の IDE を探してきます。

![app.png](https://qiita-image-store.s3.amazonaws.com/0/12977/a7b9c2f5-75a3-f231-8d92-4e0d65a38748.png)

ここで、リストから接続したい IDE を選択して、右下の [Connect] ボタンを押すと…

![device.png](https://qiita-image-store.s3.amazonaws.com/0/12977/e0d4bd55-5d4c-aa94-54be-aa1725910dc8.png)

こんな風に設計時の画面がリアルタイムにプレビューできます！！

#何が嬉しいの？
マルチデバイスプレビューなどを使っても、所詮はエミュレート。
FireUI App Preview は本物のフォントや素材でレンダリングされます。

例えば、上の画像、設計画面には「リアルタイムにプレビューできるぞ！！」と表示されているのに端末側では「リアルタイムにプレビューでき」までしか表示されていません。
これは、フォントの違いによる物です。
こういった違いをリアルタイムにチェックできるわけです。

#まとめ
本当にビックリするほどリアルタイムに表示されるので、とても便利です。
マルチデバイスプレビューと共にかなり役立つ機能ではないでしょうか！
Yet Another .bash_profile vs .bashrc + .profile 備忘録

# 基本の基本

`.bash_profile` には、まず`.profile` と `.bashrc` を読み込む設定を記述する。([ソース: bash - Difference between .bashrc and .bash_profile](http://superuser.com/questions/183870/difference-between-bashrc-and-bash-profile))

抜粋:

```sh
if [ -r ~/.profile ]; then . ~/.profile; fi
case "$-" in *i*) if [ -r ~/.bashrc ]; then . ~/.bashrc; fi;; esac
```

`.profile` には、環境変数の export をひたすら記述する。シェル自身と、シェルから実行されていくすべてのプロセスに影響を与えたいような設定（つまりはだいたいが環境変数の `export`）をここに記述する。bash をログインシェルとして介さないもろもろがあったりする場合にも、 `.profile` に書いておくと読み込まれる場合がある様子なので、できるかぎりこっちに寄せた方がいいっぽい。([ソース](http://superuser.com/questions/789448/choosing-between-bashrc-profile-bash-profile-etc))

対話シェルの時だけあればいい設定はすべて `.bashrc` に書く。 `alias` もは、下の理由によりおそらくここに記載しないとおかしなことに。

# alias を profile に書いたら？

alias は shell からコマンドを exec したら受け継がれない様子。[ソース](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/alias.html)

対話的 bash の中でもう一回 `bash` を実行したら、 `.bash_profile` や `.profile` のみに記述がある alias は、その新しく起動した `bash` では使えない。ので、 `.bashrc` に記述されるべき。

# 補足: ubuntu に ssh したときに出る welcome メッセージとか

profile 系のどこかに記述があるので、最初のログイン時に表示される仕組みらしい。

# 補足2: mac os x の端末の場合

タブを開くたびに毎回ログインシェルを立ち上げている。ので、 `.bash_profile` のみにすべて記述していても（だいたい）問題なく動く
Delphi で NSDictionary.objectForKey を使う方法（Berlin では簡単になったよ！）

#概要
NSDictionary の objectForKey を Delphi から呼ぶ方法です。

#なぜ解説が必要なのか

NSDictionary の objectForKey がポインタ（ID型）を受け取る様になっているからです。
そのため、下記の様なコードは失敗します。

```delphi
var
  Dic: NSDictionary;
  KeyStr: String;
  Value: Pointer;
begin
  Dic := GetDictionary; // なにか NSDictionary を返す関数とか
  KeyStr := 'なんらかのキー';

  // 単に NSString をポインタにキャストしてもエラーになる
  Value := Dic.objectForKey(Pointer(StrToNSStr(KeyStr)));
end;
```

#正解のコード

```delphi
var
  Dic: NSDictionary;
  KeyStr: String;
  Key: NSString;
  KeyID: Pointer;
  Value: Pointer;
begin
  Dic := GetDictionary; // なにか NSDictionary を返す関数とか
  KeyStr := 'なんらかのキー';

  // まずは NSString に変換
  Key := StrToNSStr(KeyStr);

  // こんな感じで ID 型（実体へのポインタ）に変換してやる
  KeyID := (Key as ILocalObject).GetObjectID;

  // これで呼び出せる
  Value := Dic.objectForKey(KeyID);
end;
```

#ILocalObject
Macapi.ObjectiveC に定義されているインターフェース。
TOCGenericImport など ILocalObject を継承しているクラスでは GetObjectID で Objective-C の生のポインタが手に入ります。

#Berlin !!
上のコード面倒くさいと思った？思いましたね！
なんと 10.1 Berlin からは StringToID 関数や NSObjectToID 関数, NSStringToID 関数が使えます。
これらは Macapi.Helpers に定義されています。

これを使って上記を書き直すと…

```delphi
var
  Dic: NSDictionary;
  Value: Pointer;
begin
  Dic := GetDictionary; // なにか NSDictionary を返す関数とか

  Value := Dic.objectForKey(StringToID(’何らかのキー’));
end;
```

たったこれだけになりますよ！奥さん！
スゴい簡単！！

#まとめ
Pointer を受け取るメソッドが上手く動かないときは ILocalObject を思い出して下さい。
backgroundまとめ。ショートハンド、複数指定、各プロパティ


## ショートハンドで指定できるプロパティ
|プロパティ|初期値|
|:--|:--|
|background-color|transparent|
|background-image|none|
|background-repeat|repeat|
|background-origin|padding-box|
|background-position|0% 0%|
|background-size|auto auto|
|background-attachment|scroll|
|background-clip|border-box|

このうち、background-sizeについてはbackground-positionの指定の後に、'/'で区切って指定しなければならないため注意が必要。

### 例
```
background: #333 url('bg.png') no-repeat border-box left top/contain fixed content-box;
```

**ブラウザ問題**
このショートハンドはAndroid4.4以下ではうまく作動しないことを確認している。
原因は'/'で区切る部分なのでそれまではOKか。
ただし、Android4.4以下はbackground-positionのleft、topなどを指定してのオフセット表記、background-sizeのcontain、coverが効かないなど割りと問題児。
background-positionはleft、topを指定せずに記述、background-sizeは100% autoまたはauto 100%にするなど代替方法はあるが注意が必要。
[CanIuse（css-background-offsets）](http://caniuse.com/#feat=css-background-offsets)
## 複数の背景設定
###カンマ区切りで指定できるが、、、
```
background: url('bg.jpg') no-repeat left top, #444 url('bg2.jpg') no-repeat right bottom;
```
ショートハンドでも普通にカンマ区切りで指定できる。
ただし、background-colorについては最後のひとつに対してしか指定できないので注意が必要。
また、スマートフォンなどでは以下の不具合（仕様？）があるので注意。

### backgroudの画像を複数指定するとうまく表示されない！？
画像を複数指定するとショートハンドではうまく表示されない場合があるので、プロパティごとに分けて記述する。

```
background-color: #444;
background-image: url('bg.jpg'), url('bg2.jpg');
background-repeat: no-repeat, no-repeat;
background-position: left top, right bottom;
```

## 忘れがちなbackgroundプロパティについて
### background-origin、background-crip
originは背景画像の配置領域を決める。
cripは背景の配置領域そのものを決める
正直あまり使うことはない。

#### border-box
ボーダー領域から背景が描かれる。
ただし、ボーダーの奥に描かれる。

#### padding-box
ボーダー領域には背景が描かれない。
パディング領域から背景が描かれる。

#### content-box
パディング領域には背景が描かれない。


### background-position
```
background-position: left 20% bottom 50px;
```
基本的に縦方向、横方向の2つの値を指定する。
top、bottom、left、right、centerで四隅または中央を指定できるほか、
それらに続けて相対値、絶対値でのオフセットを指定できる。
デフォルトでは0% 0%（正確にはtop 0% left 0%）。

### background-size
#### 100% 100%
背景配置領域の縦横の100%を背景画像に適用する。
背景画像の縦横比率は保たれない。
背景配置領域に空きはでない。

#### cover
背景配置領域の縦横の大きい方を基準に背景画像の縦横比率を保ったまま表示する。
つまり、背景画像は大きくなり領域をリサイズすれば画像ははみ出す場合がある。
背景配置領域に空きはでない。

#### contain
背景配置領域の縦横の小さい方を基準に背景画像の縦横比率を保ったまま表示する。
つまり、背景画像は小さくなり領域をリサイズしても画像がはみ出すことはない。
背景配置領域に空きがでる。

### background-attachment
#### fixed
スクロールしても背景画像が固定されてついてくる。

## 参考URL
[background - CSS | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/background)
指定したディレクトリ配下で10分以内に更新されたファイルを一覧する

Jekyll で生成してる Web サイトのキャッシュクリアのために10分以内に更新されたファイルの一覧が必要になったのでそのコマンドをメモっとく。

`find` でディレクトリを指定して、`mmin` オプションで `-10` を指定する。`mmin` は modified minutes の意味のようだ。オプションに指定する値が、`10` なら10分前に更新されたファイルで、`-10` なら10分前〜現在に更新されたファイルで、`+10` なら過去〜10分前に更新されたファイルというように意味が異なる。

```bash
$ find _site -mmin -10
```

ちなみに下記のようなコマンドで CDN のキャッシュクリアに必要な URL を取得した。

```bash
$ find _site -mmin -10 | sed "s#_site#http://example.com#"
```

# 参考文献

http://qiita.com/narumi888/items/9ea27362a1eb502e2dbc
Spring-Batch FlatFileItemWriterの使い方

`Spring-Batch`における`FlatFileItemWriter`の実装方法に関して、ググッても全く出てこなかったので仕方なくライブラリのソースを読みつつ実装したので以下に残す。

```java:SampleAggregator.java
public class SampleAggregator implements LineAggregator<SampleInputDto>{

	@Override
	public String aggregate(SampleInputDto item) {
		StringBuilder sb = new StringBuilder();
		sb.append(item.getParam1());
		sb.append(",");
		sb.append(item.getParam2());
		sb.append(",");
		sb.append(item.getParam3());
		return sb.toString();
	}
}
```

```java:SampleBatchConfiguration.java
    @Bean
    public FlatFileItemWriter<SampleOutputDto> writer() {
    	FlatFileItemWriter<SampleOutputDto> writer = new FlatFileItemWriter<SampleOutputDto>();
    	writer.setResource(new FileSystemResource("C:¥tenp¥sample-data.csv"));
    	writer.setLineAggregator(new SampleAggregator()); 
        return writer;
    }
```

はまったのは、以下の1点。

①`LineAggregator`インターフェースを`implements`して、`aggregate`メソッドを`@Override`したクラスのインスタンスを`setLineAggregator()`で設定しないと（確か）IllegalArgumentExceptionが発生する

`@Override`する`aggreagete`メソッドの実装内容は、引数に入力のPOJOが渡されるので、ファイルの1行出力内容をString型で返却してやれば良い。

■補足
Java8ならラムダ式が使えるので、いちいち`SampleAggregator`クラスを実装するのが面倒くさい場合、以下のようにも書ける。

```java:SampleBatchConfiguration.java
    @Bean
    public FlatFileItemWriter<SampleOutputDto> writer() {
    	FlatFileItemWriter<SampleOutputDto> writer = new FlatFileItemWriter<SampleOutputDto>();
    	writer.setResource(new FileSystemResource("C:¥tenp¥sample-data.csv"));
    	writer.setLineAggregator(item -> {
    	　　　　　　　　StringBuilder sb = new StringBuilder();
            sb.append(item.getParam1());
            sb.append(",");
            sb.append(item.getParam2());
            sb.append(",");
            sb.append(item.getParam3());
            return sb.toString();
    	});
        return writer;
    }
```
以下参考
http://www.mybatis.org/spring/ja/batch.html
機械学習を勉強するためにPython3.5.1をインストールしてみた

Python3.5.1をインストールしてみます

OSはWindows10(32bit)を使用しました

下記ページからインストーラをダウンロードしてください
https://www.python.org/downloads/release/python-2711/

DownloadsタブのPython3.5.1をクリック
![8f05e804-9b8e-9ffa-f951-97cea400b6b9.png](https://qiita-image-store.s3.amazonaws.com/0/122361/3e373d21-dd9c-4561-d697-8192a78e999a.png)

インストーラがダウンロードできました
\# アイコンおしゃれ
![スクリーンショット 2016-04-22 00.03.16.png](https://qiita-image-store.s3.amazonaws.com/0/122337/6bce9f14-c159-3338-716b-c74748ba5759.png)

インストールを開始して少し待つこと1分…

インストールできました！

![スクリーンショット 2016-04-21 23.58.20.png](https://qiita-image-store.s3.amazonaws.com/0/122337/b9c45002-c8d2-0596-cff9-e99dee3f7794.png)

さて確認です

下記内容のファイルを作成し実行できるか確認します

```lang:sample.py
print("Hello Python")
```

たったこれだけ(笑)

よくサンプルで「print "Hello World"」と書いてありますが
python v3以降は↑の書式が使えないので上記のように記述しましょう

コマンドプロンプトから下記コマンドを実行

```lang:sample.py
python sample.py
>  Hello Python
```

上記結果が得られれば成功です

お疲れ様でしたm(_ _)m