OmniAICreator/Qiita-1.07M huggingface dataset:
Java8 LocalDateTime と Java6 Date で最小値の取り扱いが難しい

JSON を経由して、Java8 `LocalDateTime` と、Java6 `Date` で、シリアライズ・デシリアライズをしようとしたときに表題の件でハマったのでメモ。

イメージとしては、プロジェクトをまたいで、以下の様なことをしようとしました。

```
Java8 DateTime -> (Serialize) -> JSON -> (Deserialize) -> Java6 Date
```

すると、 `LocalDateTime` と、`Date` での値の取りうる範囲の違いがあらわれてきます。具体的に何が起きるかというと、`LocalDateTime.MIN` などの `Date` で表現できない範囲の値をもったものをデシリアライズしたとき、もとの値が失われてしまいます。

より具体的には、以下の実行結果のようになります。

```kotlin
import java.time.LocalDateTime
import java.time.ZoneOffset
import java.time.format.DateTimeFormatter
import java.util.Date
import java.text.SimpleDateFormat

fun main(args: Array<String>) {
    val formatter = SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss")
    
    val minLocalDateTime = formatter.format(formatter.parse(
        DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(LocalDateTime.MIN)))
    val minDateText = formatter.format(Date(Long.MIN_VALUE))
    val zeroDateText = formatter.format(Date(0L))
    
    val zeroEpocLocalDateTime = formatter.format(formatter.parse(
        DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(
            LocalDateTime.ofEpochSecond(0L, 0, ZoneOffset.UTC))))
    
println (
"""Java8 DateTime | LocalDateTime.MIN     | ${LocalDateTime.MIN}
Java6 Date     | LocalDateTime.MIN     | $minLocalDateTime
Java6 Date     | Date(Long.MIN_VALUE)  | $minDateText
Java6 Date     | Date(0L)              | $zeroDateText
Java8 DateTime | ofEpochSecond(0L, 0,) | $zeroEpocLocalDateTime
""")
}
```

実行結果。

```
Java8 DateTime | LocalDateTime.MIN     | -999999999-01-01T00:00
Java6 Date     | LocalDateTime.MIN     | 169087565-03-15T04:51:43
Java6 Date     | Date(Long.MIN_VALUE)  | 292269055-12-02T04:47:04
Java6 Date     | Date(0L)              | 1970-01-01T12:00:00
Java8 DateTime | ofEpochSecond(0L, 0,) | 1970-01-01T12:00:00
```

実行結果でもすでに触れていますが、この差分を吸収するには、エポックタイムを利用します。
`LocalDateTime` を使用する側の最小値を、エポックタイムでの最小値に定めてしまうことで、互換性を維持するというわけです。

`LocalDateTime.ofEpochSecond(0L, 0, ZoneOffset.UTC)` を使用することで、エポックタイムの最小値を得られるので、`LocalDateTime` を使用する側では、これを使用すれば、Java6 を使用しているプロジェクトとの互換を取ることができるようになります。
HAPROXY構築

MySQL GROUP REPLICATION用HAPROXY設定
Ubuntu16.04を想定
HAPROXY1.5までは起動時の名前解決を持ち続けて再起動するまで更新できないので注意

#インストール
sudo apt-get install haproxy
sudo vi /etc/haproxy/haproxy.cfg

```
frontend mysql-gr-front_write
bind *:13306
mode tcp
default_backend mysql-gr-back_write

backend mysql-gr-back_write
mode tcp
balance leastconn
option httpchk
server mysql1 xxx.xxx.xxx.xxx:3306 check port 6446 inter 1000 rise 1 fall 2 on-marked-up shutdown-backup-sessions
server mysql2 xxx.xxx.xxx.xxx:3306 check port 6446 inter 1000 rise 1 fall 2 backup

frontend mysql-gr-front_read
bind *:23306
mode tcp
default_backend mysql-gr-back_read

backend mysql-gr-back_read
mode tcp
balance leastconn
option httpchk
server mysql1 xxx.xxx.xxx.xxx:3306 check port 6447 inter 1000 rise 1 fall 2
server mysql2 xxx.xxx.xxx.xxx:3306 check port 6447 inter 1000 rise 1 fall 2

listen  stats
        bind 0.0.0.0:1936
        mode http
        maxconn 10
        stats enable
        stats hide-version
        stats refresh 30s
        stats show-node
        #stats auth admin:password
        stats uri /
```

sudo /etc/init.d/haproxy start

#起動
sudo netstat -natp | grep haproxy
ログが出力されるようrsyslogの再起動
sudo /etc/init.d/rsyslog restart

#状態監視
http://xxx.xxxx.xxx.xxx:1936/
ファイルサイズをヒューマンリーダブルな形に変換する

　大きなファイルの操作で，ユーザに進捗を見せる時，byteだけ見せるとツライですよね．
　百分率で表示するのもいいですが，これだと絶対的なファイルの大きさがわからない不安もあります．

　なので，ユーザに見せるときは以下のようにヒューマンリーダブルな形変換してあげると良いわけですが

- 10240(bytes) → 10KB
- 16684887565184(bytes) → 15.17TB

　難しくないロジックのせいか，Java標準にもApache commonsあたりにも見当たらないんですが，フォーマットに特にこだわらなければAndroidSdkで機能提供されていますので，利用すると良いと思います．

```java
import android.text.format.Formatter;

Formatter.formatFileSize(context, 1024); // -> "1.00KB"
Formatter.formatFileSize(context, 900); // -> "900B"
Formatter.formatFileSize(context, 1024 * 1024); // -> "1.00MB"
```

Contextを要求されるのは， KBなどの文字列をリソースから読んでいるためですね．
Amazon Linux 2016.09 にh2loadをインストールする

久々にインストールしたら、わりとはまったのでメモ

* ライブラリが揃ってないとh2loadはインストールされない。./configureの実行ログでライブラリがすべて揃っているか確認する。**揃ってなくても、エラーは出ず、コンパイル・インストールはされるが、h2loadはインストールされない**。以下のようにすべてyesである必要がある

```
    Libs:
      OpenSSL:        yes (CFLAGS=' ' LIBS='-lssl -lcrypto  ')
      Libxml2:        yes (CFLAGS='' LIBS='-lxml2  ')
      Libev:          yes (CFLAGS='' LIBS='-lev')
      Libc-ares       yes (CFLAGS=' ' LIBS='-lcares  ')
      Libevent(SSL):  yes (CFLAGS=' ' LIBS='-levent_openssl -levent  ')
      Spdylay:        yes (CFLAGS='-I/usr/local/include  ' LIBS='-L/usr/local/lib -lspdylay  ')
      Jansson:        yes (CFLAGS=' ' LIBS='-ljansson  ')
      Jemalloc:       yes (LIBS='-ljemalloc')
      Zlib:           yes (CFLAGS=' ' LIBS='-lz  ')
      Boost CPPFLAGS:
      Boost LDFLAGS:
      Boost::ASIO:
      Boost::System:
      Boost::Thread:
```

* 最初に実行しているコマンドは　autoREconf であってautoconfではない

# ライブラリのインストール
```bash
yum-config-manager --enable epel
yum install -y libevent-devel jansson-devel jemalloc jemalloc-devel boost boost-thread Cython c-ares-devel
```

* いくつかのパッケージは、epel レポジトリを追加する必要がある。それでもlibevはバージョンが足りない

```bash
cd /usr/local/src
wget http://dist.schmorp.de/libev/libev-4.24.tar.gz
tar xvzf libev-4.24.tar.gz
cd libev-4.24
./configure
make 
make install
```

* libevはyumでは要求するバージョンのものを入れることができないので、ソースからコンパイルする必要があった


# ダウンロード・インストール

* spdylay インストール(nghttp2のインストールに必要なライブラリ)

```bash
cd /usr/local/src
git clone https://github.com/tatsuhiro-t/spdylay.git
cd spdylay
autoreconf -i
automake
autoconf
./configure
makeautoreconf -i
automake
autoconf
./configure
make
make install
```

* nghttp2のインストール(これにh2loadが含まれている)

```bash
cd /usr/local/src
git clone https://github.com/nghttp2/nghttp2   
export PKG_CONFIG_PATH=/lib/pkgconfig:/usr/lib/pkgconfig:/usr/lib64/pkgconfig:/usr/local/lib/pkgconfig
autoreconf -i
automake
autoconf
./configure --with-spdylay --enable-apps
make
make install
```
re: [AMIMOTO]サーバー内にあるWordPressのバージョンをまとめて確認する

>パス指定すればWP-CLIコマンドをどのディレクトリで実行しても問題ないので、lsとawk組み合わせたらなんとかなる。
[[AMIMOTO]サーバー内にあるWordPressのバージョンをまとめて確認する](http://qiita.com/motchi0214/items/f31282767de2a1018206)

惜しい、サブディレクトリ内にインストールされてる WP もあるかもしれないので、どうせなら find 使ってサブディレクトリ内も全部探しましょう。

```bash
$ cd /var/www/vhosts/
$ find . -type f -name 'wp-config.php' -exec bash -c '_wp=$(echo {} | sed -e s/[^\/]*$//); echo -n "${_wp}:  "; wp --path=${_wp} core version' \; 2>/dev/null
./example.net/:  4.7.2
./wp-kyoto.net/:  4.7.2
```

ただ、これ wp-config.php があるディレクトリが WordPress インストールされているディレクトリとして仮定してるので、wp-config.php の位置を変えていたら動かないです。そこだけ注意
wp-load.php を find 対象にしたほうがいいかも

```bash
$ cd /var/www/vhosts/
$ find . -type f -name 'wp-load.php' -exec bash -c '_wp=$(echo {} | sed -e s/[^\/]*$//); echo -n "${_wp}:  "; wp --path=${_wp} core version || echo "WP not installed."' \; 2>/dev/null
```
asustorのNASでsubversionを起動する

asustorのNASにはappcentralというアプリケーションでsubversionいれたのはいいんですが、設定がめんどうだったので放置してました。

で、NAS学校みたいな名前のページがあって、そこでおおざっぱな設定はできるんですが、これがまたなかなかいい加減なので、メモを作りました。
https://www.asustor.com/online/College_topic?topic=244&lan=jpn

### 前準備
subversionはappcentralからインストールします。
更新などがあったときもappcentralからできます。

次にsshでログインできるようにします。
これはサービス→ターミナルで、SSHを有効にすればOKです。
ログインはsshが使えるクライアントで行います。
コマンドラインがめんどうな人は、ここで終わりです。

### リポジトリ用ディレクトリを作る
sshでログインしたら、次にリポジトリを作りたい場所に移動します。
今回は、volume1しか作ってないところなんで、/volume1/の下にsvnを作りました。(/volume1/svn)

次にsvnadmin create でリポジトリを作ります。
``svnadmin create /volume1/svn/repos``

### svnの設定
この辺は、svn conf とかで検索すると結構いろんなサイトが(qiitaも含め)出てくるので、設定してください。

### svn起動
svnserveを使う方法しか書いてないので、これを使います。
``svnserve -d -r /volume1/svn/repos``

S99svnserve.shなんかを作る場合は、
``#!/usr/bin/sh
svnserve -d -r /volume1/svn/repos
``
これでいいと思います。
.shはあってもなくてもいいですが、asustorの例ではついてます。
ファイル内の#!のあとに/bin/shと書かれていて、実行権限があれば通常は動くと思いますのでまずはシェル上で動作テストをしてみてください。
S99svnserveを実行したあとにps auxでsvnserveがあればうまく起動できています。

ADMバージョン2.6.6.RCF2の環境では、?99svnserveなどを置く場所は
``/usr/local/etc/init.d`` 
でないとうまくいきませんでした。
/usr/localはvolume1の特殊ディレクトリへのシンボリックリンクでした。


### アクセス
``svn://[ipアドレスなど]/``
で、リポジトリのルートにアクセスできるので、ディレクトリを作るなりおもむろになんかコミットすればいいと思います。
tortoisesvnでは、リポジトリブラウザからディレクトリ作れます。

### ファイルコピーでエラーが出てロックされてるとき
svnsyncでのロックはsvn:svn-lock
svnrdumpでのロックはsvn:rdump-lock
をそれぞれ propdel のパラメータに設定する
一旦全部終わって、差分でバックアップを取るときは --incremental

### ローカルリポジトリを再配置したときにUUIDエラーがでる
http://junko.hatenablog.com/entry/2013/02/22/215532
こちらのサイトの「本体svnのuuidとバックアップ先のuuidをそろえる」という項目の作業が必要

これで、uuidのファイルをコピーしろとかいう大丈夫か？と思うような作業はしなくても大丈夫そう。
統合ターミナルのシェルで実行したいキーバインドが VSCode で実行される

# 内容

統合ターミナルで Bash on Ubuntu を利用している際に、`Ctrl+P` でコマンド履歴を表示させようとすると VSCode で同じキーバインドが設定されている「ファイルに移動」にフォーカスを奪われてしまう。

# 対応

ユーザー設定 (settings.json) より、`terminal.integrated.commandToSkipShell` の設定を変更する。

`terminal.integrated.commandToSkipShell` に Command id が書かれている場合、キー実行時にコマンドがターミナル内のシェルに送信されずに VSCode に送られるので、同じキーバインドの場合はシェルに対して実行されない。

今回は `Ctrl+P` のキーバインドをシェルで使えるようにしたいので、「ファイルに移動」のアクションである `workbench.action.quickOpen` をコメントアウトする。

```json
{
    "terminal.integrated.commandsToSkipShell": [
        "editor.action.toggleTabFocusMode",
        "workbench.action.debug.continue",
        "workbench.action.debug.restart",
        "workbench.action.debug.run",
        "workbench.action.debug.start",
        "workbench.action.debug.stop",
        "workbench.action.openNextRecentlyUsedEditorInGroup",
        "workbench.action.openPreviousRecentlyUsedEditorInGroup",
        //"workbench.action.quickOpen",
        "workbench.action.showCommands",
        "workbench.action.terminal.clear",
        "workbench.action.terminal.copySelection",
        "workbench.action.terminal.focus",
        "workbench.action.terminal.focusNext",
        "workbench.action.terminal.focusPrevious",
        "workbench.action.terminal.kill",
        "workbench.action.terminal.new",
        "workbench.action.terminal.paste",
        "workbench.action.terminal.runSelectedText",
        "workbench.action.terminal.scrollDown",
        "workbench.action.terminal.scrollDownPage",
        "workbench.action.terminal.scrollToBottom",
        "workbench.action.terminal.scrollToTop",
        "workbench.action.terminal.scrollUp",
        "workbench.action.terminal.scrollUpPage",
        "workbench.action.terminal.toggleTerminal"
        ],
}
```

設定後は、ターミナルにフォーカスがある状態で `Ctrl+P` を実行すると履歴が表示され、ターミナルにフォーカスがない状態で実行すると「ファイルに移動」が実行されるようになる。

## 参考

- [Integrated Terminal in Visual Studio Code](https://code.visualstudio.com/docs/editor/integrated-terminal#_forcing-key-bindings-to-pass-through-the-terminal)
- [Visual Studio Code Key Bindings](https://code.visualstudio.com/docs/customization/keybindings)
Mac の諸々の情報（シリアル番号とか）をコマンド一発で確認する

## 会社の都合で Mac のシリアル番号やら諸々の情報を集める必要があった
けどめんどいねん！！

自分のだけだったら About This Mac から確認して終わるんだけど、
他の社員に「About This Mac にあるシリアル番号と、OS情報と、これとあれとそれと〜」とか
一人ひとりにお願いするのは明らかにダルいわけで、

「このコマンド叩いて、出てきた情報を全部コピペしてくれ」で済ませられないかなと思って探した。

## system_profiler
というコマンドがあって、欲しい情報は全て詰め込まれていた

#### けど長い。実行時間が異様に長い。ってか俺のだと途中でいきなり落ちる
まぁシステムに関わる全ての情報を集めているわけで、時間がかかるのは分かるんだけど、
「そんな情報いらんねん」って情報まで丁寧に集めてくれるので、まぁいらない事いらない事

```
Accessibility:

    Accessibility Information:

      Cursor Magnification: On
      Display: Black on White
      Flash Screen: Off
      Mouse Keys: Off
      Slow Keys: Off
      Sticky Keys: Off
      VoiceOver: Off
      Zoom Mode: Full Screen
      Contrast: 0
      Keyboard Zoom: Off
      Scroll Zoom: On
```
出してくれてありがとう。でも、それ、いらないんだ。

## system_profiler SP***DataType
こうすることで特定のセクション情報だけを抽出可能になるそうな。

#### `SPHardwareDataType` `SPSoftwareDataType` `SPSerialATADataType`
という事で結論としては、次のコマンドを打てば基本欲しいであろう情報が得られる。

```bash
$ system_profiler SPHardwareDataType SPSoftwareDataType SPSerialATADataType
```

`SPMemoryDataType` とかもあるけど、総メモリ数に関しては `SPHardwareDataType` で出るので、
より詳細情報が欲しい場合にだけつければ良いと思います。

## サンプル結果（一部ダミー）& ストレージ情報は割愛（サイズが書いてある）

```
Hardware:

    Hardware Overview:

      Model Name: MacBook Air
      Model Identifier: MacBookAir7,2
      Processor Name: Intel Core i7
      Processor Speed: 2.2 GHz
      Number of Processors: 1
      Total Number of Cores: 2
      L2 Cache (per Core): 256 KB
      L3 Cache: 4 MB
      Memory: 8 GB
      Boot ROM Version: MBAxx.yyyy.zzzz
      SMC Version (system): x.yyyy
      Serial Number (system): SER14LNUMB3R
      Hardware UUID: uuuuuuuu-iiii-iiii-dddd-uuuuuuuu

Software:

    System Software Overview:

      System Version: OS X 10.11.6 (15G1217)
      Kernel Version: Darwin 15.6.0
      Boot Volume: Macintosh HD
      Boot Mode: Normal
      Computer Name: Qiita's MacBook Air
      User Name: Qiita
      Secure Virtual Memory: Enabled
      System Integrity Protection: Enabled
      Time since boot: 21:16
```

#### ちなみに
Model Identifier がどれと一致するかは以下のURLから
(About This Mac に出てくる `Retina, 13-inch, Early 2015` みたいな部分と一致する)

- MacBook Pro: https://support.apple.com/ja-jp/HT201300
- MacBook Air: https://support.apple.com/ja-jp/HT201862
- MacBook: https://support.apple.com/ja-jp/HT201608
rubyでのお店のオープン日などの曜日の範囲表記の方法

最近作ってるサービスで、
利用可能日を月〜金,日みたいな風に表示する必要があったので、やり方をまとめてみる。
お店のオープン日や、貸し出し系のサービスなどで使えるかなーと思います。

![スクリーンショット 2017-02-06 18.27.08.png](https://qiita-image-store.s3.amazonaws.com/0/31292/4005f80f-0bfa-df8b-cc3a-a0948ba20ba0.png)
こんな感じでチェックボックスで選択してもらって
![スクリーンショット 2017-02-06 18.35.23.png](https://qiita-image-store.s3.amazonaws.com/0/31292/ea9fe13c-c024-3d0b-d2fc-bb5cac6cf82e.png)

こんな感じに表示します。

やり方としてはDBには文字列として
"0,2,3,4,6"
こんな感じで保存して表示の際に表記を日本語にする感じです。


# DBとView(入力)

| id | name | open_days |
|:-:|:-:|:-:|
| 1  | "ショップA"  | "0,2,3,4,6"  |
| 2  | "ショップB"  | "0,1,2,3,4,6" |

テーブルはこんな感じで、Shopテーブルに曜日を文字列で持てるようにしておきます。

```erb:new.html.erb
<% 7.times do |i| %>
  <%= check_box_tag "shop[open_days][]", i, false, {id: "open_days_#{i}"} %>
  <label for="open_days_<%=i%>"><%= I18n.t('date.abbr_day_names')[i] %></label>
<% end %>
```

で、viewでこんな感じでやってやればいいと思います。

```erb:edit.html.erb
<% 7.times do |i| %>
  <% if @shop.open_days.match(/#{i}/) %>
    <% match = true %>
  <% else %>
    <% match = false %>
  <% end %>
  <%= check_box_tag "shop[open_days][]", i, match, {id: "open_days_#{i}"} %>
  <label for="open_days_<%=i%>" class=""><%= I18n.t('date.abbr_day_names')[i] %></label>
<% end %>
```
editの時は@shop.open_daysに正規表現で都度対応する曜日の数字をmatchさせて結果を変数に突っ込んで、check_box_tagのcheckedプロパティを設定してやるといいと思います。

# Controller

```ruby:shops_controller.rb
@shop.available_date = shop_params[:open_days].join(",")
private
def shop_params
  params.require(:shop).permit(
    :name,open_days: []
  )
end
```
strong_parametersに追加して、
コントローラで受け取った値を,つなぎの文字列に整形して保存します。

# View(表示)
あとはshop.open_daysの値を整形して表示するのみです。

```ruby:shops_helper.rb
def nums_to_num_range(str)
  nums = str.split(',').map { |i| i.to_i }.uniq.sort
  nums.inject([[nums.shift]]) { |r, s|
    if r.last.last.succ == s
      r.last << s
    else
      r << [s]
    end
    r
  }.map { |i|
    if i.size == 1
      i.first
    elsif i.size == 2
      [i.first, i.last].join(',')
    elsif i.size > 1
      [i.first, i.last].join('~')
    end
  }.join(',')
end
def replace_num_in_str_to_day_names(str)
  str.gsub(/\d/) {|num| I18n.t('date.abbr_day_names')[num.to_i] }
end
```
"0,2,3,4,5"のようなカンマ区切りの文字列を"0,2~4,6"のような範囲形式っぽいものに整形するメソッドと
nums_to_num_rangeで整形した文字列の数字部分を曜日に変換するメソッドをhelperに定義してやって、viewで呼び出せば完了です。

## 参考記事一覧
[Ruby で、連続した数列を範囲形式にまとめてみる : フッ君の日常](http://fkmn.exblog.jp/7032414/)
WebRTCの手動シグナリングでSDPをいじってみる

# はじめに
この記事は、[WebRTCもくもく会 at ヒカリエ](https://connpass.com/event/47474/) の発表用です。

# 手動シグナリング

- WebRTCではP2P通信を始めるために手続きが必要
    - Offer SDP / Answer SDP を交換
    - この過程がシグナリング
- 手動で行うことも可能
    - [手動でWebRTCの通信をつなげよう](https://html5experts.jp/mganeko/19814/)


# SDPを手で変更してみる

- 推奨されていないが、SDPを直接編集することで、通信の条件を変更できる
    - 将来的には、SDPを触らずに、パラメータ指定で変えられるようになるはず
- デモページ
    - [https://mganeko.github.io/webrtcexpjp/basic2016/hand_signaling_modify.html](https://mganeko.github.io/webrtcexpjp/basic2016/hand_signaling_modify.html)
- 手順
    - Offer側
        - createOffer
        - Offer SDP編集
        - setLocalDescription
        - Offer SDPを送信（コピー）
    - Answer側
        - Offer SDPを受信 (ペースト）
        - setRemoteDescription
        - createAnswer
        - Answer SDP編集
        - setLocalDescription
        - Anwser SDPを送信（コピー）
    - Offer側
        - Answer SDPを受信 (ペースト）
        - setRemoteDescription


## VP9を使う
- Chorme と Firefox で
- デフォルトの映像コーデックはVP8
- これをVP9に変更してみる


```
m=video 9 UDP/TLS/RTP/SAVPF 100 101 107 116 117 96 97 99 98
```

↓ 優先を101(VP9)に変更する

```
m=video 9 UDP/TLS/RTP/SAVPF 101 100 107 116 117 96 97 99 98
```

- [chrome://webrtc-internals](chrome://webrtc-internals) で確認
    - ssrc_xxxxxx_send (ssrc)
        - googCodecName 


## bandwidth を制限する

- Chrome と Chrome
- デフォルトでは 2Mbps ぐらいまで上がる

```
a=mid:video
```

↓ 制限を付け加える（Videoを500kbpsに）

```
a=mid:video
b=AS:500
```

- [chrome://webrtc-internals](chrome://webrtc-internals) で確認
scrapy経由でダウンロードした結果が英語になってしまう時の対処


ブラウザでページを見ると日本語なのに、scrapy経由でダウンロードすると英語のページがダウンロードされてしまうことがあります。
これはscrapyがwebサーバーにリクエストを投げる時のAccept-Lauguageがデフォルトで`en`なためなので、以下の内容をsettings.pyに書くことで日本語ページをリクエストすることができます。

```python
DEFAULT_REQUEST_HEADERS = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'ja,en-US;q=0.8,en;q=0.6',
}
```

参考：
https://doc.scrapy.org/en/latest/topics/settings.html#std:setting-DEFAULT_REQUEST_HEADERS
ruby-mode のファイル保存時にファイルの先頭に `# frozen_string_literal: true` を挿入する


以下を init.el かなんかに書く。

```init.el
(defun ruby-mode-set-frozen-string-literal-true ()
  (when (eq major-mode 'ruby-mode)
    (save-excursion
      (widen)
      (goto-char (point-min))
      (unless (looking-at "^# frozen_string_literal: true")
        (insert "# frozen_string_literal: true\n\n")))))

(add-hook 'ruby-mode-hook (lambda()
                            (add-hook 'before-save-hook 'ruby-mode-set-frozen-string-literal-true)))
```

カスタマイズすれば frozen_string_literal 以外にもいろいろできそう。
Hugoと自作シェルスクリプトによるMarkdownメモ環境の構築

# はじめに

これまで仕事（研究）関連のログは主に連携の必要性からOneNoteを使って取っていたものの、最近プログラミングの仕事が多くなってきたことからEmacsでログを取りたいなあと考える。
OneNoteはログを共有するという点で素晴らしく使い勝手がいいプログラムだし、初心者でもWord/Powerpointに慣れていればすぐ使えるという利点もある。ただし、個人的に不満な点は

- 長めの文章を書くのにできればEmacs or Emacsキーバインディングで書きたい
- プログラムコードのメモをするのにOneNoteはsyntax highlightしてくれない（プラグインを使うと可能だが有料）

ということで個人的なログを残すのにはテキストベースのものに以降をすることに決める。選択肢としてはEmacs org-modeかMarkdownか迷ったものの、Org-modeはいまいち文法がしっくりこないのと、機能が豊富すぎて混乱する（キーバインディングが覚えられない、、！）[^1]という理由から、Markdownを使うことにする。

[^1]: もちろんOrg-modeをディスってるわけではありません、念のため。。。


# Markdownを使ったメモ環境の構築 

さて、環境を構築するにあたって考慮したのは、

- メモやログはEmacsで書きたい。すなわちテキストベースで完結するもの
- でも画像も時々入れたい
- Emacsでも画像表示はできるが、後々見返す時のためにも全体をもっとキレイに表示できるようにはしたい
- でもいちいちHTMLに変換したりするのは面倒くさい（できれば避けたい）
- オンラインでもオフラインでも使えるのがいい
- Dropbox等で共有して、どのマシンでも気が向いた時に編集したい

というわがままな理由を全部満たしてくれるもの。過去にも[chalow](http://chalow.org/)や、テキストベースのWiki
などでメモを取っていたので、できれば同じような感覚で使える（でももっとモダンな）ツールを探していたところ、最終的に行き着いたのが[Hugo](https://gohugo.io)。
他にも [MDwiki](www.mdwiki.info/)を使うことも考えたが、Syntax highlightingに対応している言語があまり多くなく、しかも自分が使っている言語に対応していないので結局パス。


## Hugo

Hugoの基本的な設定に関してはQiitaですでに[色々と書かれている記事がある](http://qiita.com/search?q=hugo)ので、説明はそちらlを参照してください。今回、自分で使いやすくするためにした変更は以下。

### トップページをmarkdownで書きたい

デフォルトだとトップページ（ホームページ）はhugoを実行した際、自動で生成されるようになっている。しかし、これだと各記事のサマリーが表示されていたりして、あまり好きじゃないので自分で編集できるようにする。[このページ](https://github.com/spf13/hugo/issues/330)を参考に以下のように設定。

- `layouts/index.html`

```
{{ range .Data.Pages }}
    {{if eq .Type "index" }}
        {{ template "partials/header.html" . }}
        {{.Content}}
    {{end}}
{{ end }}
```

- `layouts/_default/single.html`

```
{{ template "partials/header.html" . }}
    {{ .Content }}
{{ template "partials/footer.html" . }}
```

そして `content/index.md` を以下のような感じに作成

```
+++
type = "index"
title = "My Hugo Site"
+++

# Journal

 * [2017-01-31](post/2017-01-31/) -- Qiita用記事
 * [2017-02-02](post/2017-02-02/)
 * [2017-02-04](post/2017-02-04/)
```

### Pygmentsによるsyntax highlight

Pygmentsはcondaなりpipからインストールする。さらに Code Fence（｀｀｀）でsyntax highlightしてくれるように `config.toml` を以下のような感じで設定。

```
languageCode = "en-us"
title = "Research Log"
baseurl = "http://example.org/"
PygmentsCodeFences = true
pygmentsstyle = "default"
```


## 自作スクリプト

いろんなショートカットなり、コマンドはいちいち覚えていられないので、メモを書きたいときにサクっと書き始められるようシェルスクリプトを書く。

- [自作スクリプトはこちら](https://gist.github.com/so1tsuda/65071ebdbfcdb69da2ebc4b278ecdf46)

大したスクリプトじゃないですが、何をやってるのか簡単に書いておくと、

- まず起動すると何をやるか聞いてくる。

```
What to do? 

  a. Write a journal 
  b. Open an existing journal 
  c. Add a todo 
  d. Write a memo

Choose (a-d): 
```

- メモを取るには`a`を選択して、ファイル名を入れる（デフォルトは`YYYY-MM-DD.md`）。
   - 必要であればタイトルも入れる。その場合のファイル名は`YYYY-MM-DD-<title>.md`。
- さらに新しく作られたファイルへのリンクを`index.md`に追加し、hugoを起動、ブラウザで`localhost:1313`を開く。

# 終わりに

これまでorg-modeやJupyterなど、いろいろなメモ環境を試していたものの、いずれもしっくりこない、という問題がありました。結局それなら自分で作ったほうがいいんじゃね？という結論から最終的に自作メモスクリプトを作るに至りましたが、自分の好きなエディタでメモが取れる、しかもいろんなショートカットを覚え無くていいため、今ではかなりストレスなしにメモがとれます。Emacsでの使用を想定してスクリプトを書きましたが、基本的にはちょっと手を加えれば他のエディタでも動くはずです。

参考になれば幸いです。
Unity5で作成したアプリのメモリリークを調査する方法

# はじめに
OOMでアプリケーションが終了した！という時、特にある条件によるアプリの強制終了でない限りまずメモリリークを疑います。
そんな時に役立つメモリリークの調査方法に関してまとめておきます。

# 概要
今回まとめるのはUnity5で作成したアンドロイド向けアプリのメモリリークを調査する事を前提とします。

# 使用ツール
adk(AndroidSDK)内のmonitorツール(実際使用するのはDDMSの機能)
Eclipse Memory Analyzer(stand alone版) 通称mat
jdk(JavaSDK)内のVisualVM

ツールのDLとインストールについては省略
jdkやadkについては事前に環境変数のPathにルートパスを登録しておくと便利です

# 調査手順
1. 調査対象アプリをビルドする。その際にUnityの"Development Build"が有効である必要があります。

2. アプリを実機にインストール。

3. adkの"monitor.bat"を実行。

4. アプリを起動しMonitor上で"Update Heap"を押す

5. リークが起きているを思われる箇所の操作を一通り完了した後、"Cause GC"を押してGCを発生させ"Dump HPROF file"を押しダンプファイルを取得します

6.  取得したhprofはそのままの形式(Dalvik形式)である場合mat等で開けないので以下のコマンドでJ2SE形式に変換する
```hprof-conv xxx.hprof yyy.hprof```
xxxは変換元、yyyには変換後のファイル名を指定します
※このコマンド処理はadkに含まれています

7. 変換したhprofをmatもしくはVisualVMで開き調査します

# matの使い方
hprofファイルを[file]→[open heap dump]を選択して開きます
開く際にLeak Suspects Reportにチェックを入れてFinishを押すとレポート画面が確認できます。

確認画面からはリークの疑いのあるインスタンスが確認できます。
ここからおおよそのリーク箇所を推測可能です。

# VisualVMの使い方
"jvisualvm"コマンドでツールを起動できます。(要jdk)
起動後hprofファイルを読み込めば残存インスタンスの確認ができます。
GCを行っても本来消えているはずのインスタンスが残っているか検索して探し出すのも有効ですがmatのレポートを指針に探す方が良いかもしれません。

# さいごに
メモリリークの原因をつかむ為には以上の作業を行えば"ある程度"の予測はつきますが、解消する為には地道に実コードをチェックしていくしかありません。
それでもこれらの調査を踏まえて行えばより効率的に早く解決できるでしょう。
はじめてのVim

職場の開発環境にあったエディタがvimだったのでVimを練習中です。
はじめてVimを触る人が読んでおくと便利な記事集を勝手にまとめます。

# vimスタートガイド
aとか押してインサートモード、Escでコマンドモード。
とりあえずこれ読まないと使えない。
http://qiita.com/marrontan619/items/dc99db67cf4c0a25a327


# Vimにはチュートリアルあるんだよ。
コメント頂いたので追記します。

```
vimtutor
```

で30分程度のチュートリアルができるので、
一番最初にこれをやるのがいいかも。

# vim初心者ガイド
これだけ覚えておけば「ただの使いにくいエディタ」が
「軽量でサクサク使えるエディタ」になります。
http://qiita.com/marrontan619/items/94228ff809f01198b613

# vim設定ガイド（少し初'級'者向けな内容だと思います）
http://qiita.com/marrontan619/items/541a1374e1ac672977e6

# vimの種類
↑でも触れてますが、ひとくちに「vim」っていってもたくさん種類あるんですって。
Huge入れとけって話。
http://qiita.com/b4b4r07/items/f7a4a0461e1fc6f436a4

# 初心者用Cheet Sheet
日本語でいうとカンニングペーパー。ひゃっほい。机に貼っておこう。
学生の頃はできなかったけど今ならカンニングし放題だぜぇ。
http://www.namaraii.com/files/vim-cheatsheet.pdf



# 複数ファイルを開く方法
単にワイルドカード＊を使うだけでもできます。
http://qiita.com/waoooon/items/60af17b56bf4661d75de

-pオプションつけるとタブ起動する。

タブについての解説
http://qiita.com/wadako111/items/755e753677dd72d8036d


**（未解決）シンタックスハイライトの設定**
なぜかうまくいかない（Smallだから？）ので解決したら追記予定。
GradleでFlavors別にCrashlyticsを分ける方法

##はじめに
開発用と本番用で別々にCrashlyticsを分けようとしたときのメモです。
すでにCrashlyticsが設定済みの状態から進めます。

##設定
新しいApiKeyを作って、Flavorsごとに設定すれば分けられるとてっきり思っていましたが、
1アカウントにつき、ApiKeyは1つしかありませんでした。

ではどうするのかというと、パッケージ名をFlavorsごとに分けることで、Crashlyticsを分けられました。
buildTypesごとに分けたい場合は、buildTypesで設定してもOKです。

```:build.gradle
productFlavors {
    develop {
        applicationId "myapp.app.develop"
    }
    product {
        applicationId "myapp.app.product"
    }
}
```

これだけでもいいのですが、「myapp.app」が2箇所に書かれているので、applicationIdSuffixを使ったほうがいいです。

```:build.gradle
defaultConfig {
    applicationId "myapp.app"
}

productFlavors {
    develop {
        applicationIdSuffix ".develop"
    }
    product {
        applicationIdSuffix ".product"
    }
}
```

あとはわざとクラッシュさせてみて確認。

##参考
* [Android Studio でお手軽パッケージ名変更](http://qiita.com/tanjo/items/5da377d3b8ec71048f02)
[Rails] Rails5でES6 + Sass + Slimが使える環境を整える

※ 2017/09/23 追記
Rails5.1からwebpacker推奨になり、
sprockets-commonerは非推奨となっています。

## Gem

```Gemfile
gem 'slim-rails'
gem 'sprockets-commoner'
gem 'sass-globbing'
gem 'autoprefixer-rails'
```

gem入れるだけのやつが多い。
`bundle install`後は再起動したほうがいいかも。

* slim-rails
 - viewをslimで書ける
* sprockets-commoner
 - es6&npmが使えるようになる
* sass-globbing
 - sassでワイルドカードが使える
* autoprefixer-rails
 - ベンダープレフィックス補完

## sprockets-commonnerの設定

**※ 2017/02/21追記**

このファイルなしでもRAILS_ENV="development"なら動いたが、RAILS_ENV="production"だと動かない現象が起こったので追記


```config/initializers/sprockets_commoner.rb
Rails.application.config.assets.configure do |env|
  Sprockets::Commoner::Processor.configure(env,
    include: ['node_modules', 'app/assets/javascripts'],
    exclude: ['vendor/bundle', 'vendor/assets'],
    babel_exclude: [/node_modules/, 'vendor/assets']
  )
end
```

「babelするのは app/assets/javascripts以下だけ」という指定をしている


## babelの下準備


必要なnpmをインストール

```
yarn add babel-core babel-preset-es2015 babel-preset-stage-0
```

もしくは

```
npm install babel-core babel-preset-es2015 babel-preset-stage-0
```


.babelrcファイルを新規作成

```..babelrc
{
  "presets": [
      "es2015",
      "stage-0"
  ]
}
```

## application.css周辺

ファイルをまたぐmixinや変数が使えないのが不便なので
cssのエントリポイントはcss→sassにする

```
mv application.css application.css.scss
```

```app/assets/stylesheets/application.css.scss

@import "./modules/**/*";
```

sass-globbingを使うとワイルドカード指定ができて便利

## application.js周辺

turbolinksはOFFにするのが無難

``` app/assets/javascripts/application.js
//= require jquery
//= require jquery_ujs
//= require turbolinks  # これを消す
//= require_tree . # これも消す
```

``` app/views/layouts/application.html.slim
= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload'
= javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
```

`'data-turbolinks-track': 'reload'` を消す

## coffeeとsassファイルが自動生成されないようにする

``` config/application.rb
    config.generators do |g|
      g.stylesheets false
      g.javascripts false
    end
```
URIを解析するJavaScriptのfunction

# `A`タグを利用して、URIの構成要素を解析する

`A`タグの`href`要素を利用して、簡易的にURIを解析する。

```javascript
/**
 * URIを解析する。
 * @param uri URI
 * @returns {{protocol: (*|null|string|number), hostname: (*|string), port: (*|string|number|Function), path: (*|string), query: (*|string)}}
 */
function parseUri(uri) {
    var parser = document.createElement('a');
    parser.href = uri;

    return {
        protocol: parser.protocol,
        hostname: parser.hostname,
        port: parser.port,
        path: parser.pathname,
        query: parser.search
    };
}
```
RSpec で複数の子要素を一斉更新するときに削除と追加が同時にできない

## やりたいこと
Rails で作った API で1対多のときに PATCH で JSON を投げると複数の子要素を同時に更新できるようにした。
が、しっかりとそのテストも書こうと思ったのだが思うように動かなかった。
具体的には

* 削除だけ行う→可
* 追加だけ行う→可
* 削除と追加を同時に行う→不可

という状態だった。
原因は「 **RSpec 側が渡したパラメータを勝手に改造しやがること** 」だったので、それを直したい。

## 検証環境
* User、Memo の2つのモデル
* User には `name` のデータがある
* Memo には `content` のデータがある
* User は複数の Memo を持っている(1対多)

以下コード。

```app/models/user.rb
class User < ApplicationRecord
  has_many :memos, dependent: :destroy
  accepts_nested_attributes_for :memos, allow_destroy: true
end
```
```app/models/memo.rb
class Memo < ApplicationRecord
  belongs_to :user
end
```
```app/controllers/users_controller.rb
class UsersController < ApplicationController
  def update
    @user = User.find(params[:id])
    
    respond_to do |format|
      if @user.update(user_params)
        format.json { render json: {message: 'ok'}, status: :created }
      else
        format.json { render json: @user.errors, status: :unprocessable_entitiy }
      end
    end
  end
  
  private
    def user_params
      params.require(:memo).permit(:name, memos_attributes: [:id, :user_id, :_destroy])
    end
end
```

`app/models/user.rb`で `allow_destroy: true` と書いているのと、
`app/controllers/users_controller.rb` のストロングパラメータで `:_destroy` を許可しているので、子要素の削除を行えるようにしている。

## RSpec
```
describe 'PATCH /users/:id' do
  let!(:user) { create(:user) }
  let!(:memo) { create(:memo, user: user, content: 'content') }
  
  specify 'ユーザーが更新されること' do
    params = { user: {name: 'foobar', memos_attributes: [{id: memo.id, _destroy: 1}, {content: 'content2'}, {content: 'content3'}]} }
    patch user_url(user, format: :json), params: params
    
    ## 省略
    
    user.reload
    expect(user.memos.count).to eq (2)
  end
end
```
のように update メソッドに `{ user: {name: 'foobar', memos_attributes: [{id: memo.id, _destroy: 1}, {content: 'content2'}, {content: 'content3'}]} }` というパラメータを投げるのだが、なぜか `{id: memo.id, _destroy: 1}` の部分が無視されて、最初に let! で作ったメモと合わせてメモの数が3つになりテストがコケた。

## 原因
ログを見ると、コードで記述したパラメータは上記にあるように

```
{ user: {name: 'foobar', memos_attributes: [{id: memo.id, _destroy: 1}, {content: 'content2'}, {content: 'content3'}]} }
```
だったのだが、実際に渡っているパラメータは

```
{ user: {name: 'foobar', memos_attributes: [{id: memo.id, _destroy: 1, content: 'content2'}, {content: 'content3'}]} }
```

のように
`{id: memo.id, _destroy: 1}` と `{content: 'content2'}` がなぜか合体していたせいで、削除はされず、content が「content2」と「content3」の子要素が追加されるだけだった。

これは RSpec では、ハッシュの配列をフォームデータとしてデフォルトでは扱ってくれないことが原因だった。

## 解決策

こんだけ長ったらしく書いたものの
パラメータに
```
params = { user: {name: 'foobar', memos_attributes: [{id: memo.id, _destroy: 1}, {content: 'content2'}, {content: 'content3'}]} }.to_json
```
をつけ、PATCH で投げるときに

```
patch user_url(user, format: :json), params: params, headers { "CONTENT_TYPE": "application/json", "ACCEPT": "application/json" }
```
のように投げるとハッシュが合体せずにパラメータが渡る。

## まとめ
feature スペックとかで書けばそもそも PATCH で投げる必要もないが、
今回のように API の update をテストする場合かつ子要素の更新もする時はこんな感じできる。
ちなみに私が実際に更新したかった子要素は base64 でエンコードされた画像であったためログがカオスになった。(さっさとファイル名をテキトーな文字列に置き換えろ)

まあ何にせよログって大事だね

## 参考・関連
<a href="http://stackoverflow.com/questions/18337609/rspec-request-test-merges-hashes-in-array-in-post-json-params">stack overflow</a>
Laravel EloquentのEager LoadingでWrite接続を使用する


小ネタです。

master/slave構成を取っているDBを使用する場合、LaravelではRead/Write接続を設定して
Connectionの切替を行うことが多いかと思われます。

Read/Write接続の参考：https://readouble.com/laravel/5.3/ja/database.html

たまに、レプリケーションの遅延等々を考えた際に、処理によっては必ずWrite接続(master)を
使用してクエリを実行したいケースが発生することはないでしょうか。

自分はそんなケースがあったので、Write接続を使用するように、以下のようなコードを書きました。
※ 受注(Order)情報を取得する、というケースのイメージになります。

```php:Order.php抜粋
...中略

class Order extends Model
{

...中略

    protected $table = 'orders';
    
...中略

    public function details()
    {
        return $this->hasMany(OrderDetail::class, 'order_code', 'order_code');
    }

}
```

```php:Write接続を使用して検索する
$order = Order::useWritePdo()->find($orderId);
```

useWritePdoを呼び出すことで、Write接続を使用して検索クエリが実行されます。  
接続取得の切り分けは、  

Illuminate\Database\Connection#select → getPdoForSelect

の辺りで実装されていたので、そちらを見るとよく分かるかなと思います。

ここまではすぐできるのですが、上記の例で受注明細(OrderDetail)をEager Loadingで取得したい場合、かつ
Write接続で検索したい場合はどうすればよいのだろう？というのが今回ちょっと詰まったところです。

単純にwithを使うとこんな感じになって、

```php:with使う
$order = Order::useWritePdo()->with('details')->find($orderId);
```

以下2本のクエリが実行されます。

```sql:実行されるクエリ
select * from `orders` where `orders`.`id` = ? limit 1
select * from `order_details` where `order_details`.`order_code` in (?)
```

これでよさそうな感じがしますが、Illuminate\Database\Connection#selectにデバッグ張って見てみると、
2本目のクエリはRead接続を使用して実行されていることが確認できました。
※ Illuminate\Database\Connection#select実行時に、接続切り分けの引数「$useReadPdo」がtrueになっている。
親の検索で使用されたBuilderと、違うインスタンスが使用されている？ようです。

今回は、2本目の検索もWrite接続を使用したかったのです。

色々調べてみたのですが、withのcallbackでEager Loadingで使用されるBuilderインスタンスが
触れるということだったので、そちらでuseWritePdoを呼び出してWrite接続を使用することにしました。

```php:Eager&nbsp;Loading時にWrite接続を使用する
$order = Order::useWritePdo()->with(['details' => function ($query) {
    /** @var \Illuminate\Database\Query\Builder $query */
    $query->useWritePdo();
}])->find($orderId);

```

これで、Eager Loading時のクエリもWrite接続を使用することが確認できました。
ちょっとスマートじゃない感もあるので、、、よりよいやり方があれば教えてください。

## 環境
Laravel Framework 5.2.45
PHP 7.0.3

## 参考ページ
以下を参考にさせていただきました。
ありがとうございました。  

https://laravel.com/docs/5.3/eloquent-relationships#lazy-eager-loading
JavaScriptでi18n対応


- 事前準備

packageにnode-translateをいれます

``$ yarn add node-translate``

react.js前提で、ディレクトリ構成は以下で作成

```
.
├── src
    └── javascripts
         └── sample.js
         └── locales
              └── locale-jp.js
              └── i18n.js
```

- i18nの定義ファイルを作成する
 
```js:locales/locale-jp.js
export default {
  "app": {
    "sample": "サンプルだよ"
    }
  }
}
```

- 定義ファイルをimportしたi18nとひもづける

```js:locales/i18n.js
import i18n from "node-translate"
import locale from './locale-jp'

i18n.requireLocales({
  'locale-jp': locale
});

export default i18n;
```

- こんな感じで使う。

```js:sample.js
import React, { Component, PropTypes } from "react"
import i18n from "../../locales/i18n"

class Sample extends Component {
  render() {
    return (
      <div>
       {i18n.t('app.sample')}
      </div>
    )
  }
}
```
XCode + OpenCV3.xで、Expected Identifierエラーが出る場合の対処方法

#はじめに
OpenCV3.2をダウンロードしてきてコンパイルした時に、以下のようなエラーが発生したので備忘的にまとめます
#エラー内容
```exposure_compensate.hpp
Expected identifier
```
```blenders.hpp
Expected identifier
```
#原因
どちらも標準のNOマクロと、OpenCV内の該当ファイルで定義されているNOマクロがバッティングしているために発生しています。
以下のような記述があるので該当ソースを見ると一目瞭然なのですが・・・

```exposure_compensate.hpp
#if defined(NO)
#  warning Detected Apple 'NO' macro definition, it can cause build conflicts. Please, include this header before any Apple headers.
#endif
```
#対処方法
OpenCVのヘッダファイルを、標準のヘッダファイルより、前に持ってきます。

例えば、

```[修正前]TestOpenCv.mm

//
//  TestOpenCv.mm
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

#import <opencv2/opencv.hpp>
#import <opencv2/imgcodecs/ios.h>
#import "CvTest02-Bridging-Header.h"
```

こうなっているものを、

```[修正後]TestOpenCv.mm
//
//  TestOpenCv.mm
//
#import <opencv2/opencv.hpp>
#import <opencv2/imgcodecs/ios.h>

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "TestOpenCv-Bridging-Header.h"

```
このようにします。
#関連リンク
[Build with opencv 3.1 in ios failed because of the enum name #6114](https://github.com/opencv/opencv/issues/6114)
VSCode の統合ターミナルで Bash on Ubuntu を利用するための設定

Windows 上で使用している VSCode の統合ターミナルで Bash on Ubuntu (on Windows) を利用するための設定。

> 公式ドキュメント: [Integrated Terminal in Visual Studio Code](https://code.visualstudio.com/docs/editor/integrated-terminal#_windows)

# 設定

1. [ファイル]-[基本設定]-[ユーザー設定] を選択
2. 検索欄に `terminal.integrated.shell.windows` を入力
3. 右側の User Settings に以下を入力し、保存

```json
{
    // Bash on Ubuntu (on Windows)
    "terminal.integrated.shell.windows": "C:\\Windows\\sysnative\\bash.exe",
}
```

Bash on Ubuntu (on Windows) ではなく PowerShell やコマンドプロンプト、Git Bash を利用したい場合は以下の通り設定:

> コマンドプロンプト

```json
{
    // 64-bit cmd if available, otherwise 32-bit
    "terminal.integrated.shell.windows": "C:\\Windows\\sysnative\\cmd.exe"
}
```

> PowerShell

```json
{
    // 64-bit PowerShell if available, otherwise 32-bit
    "terminal.integrated.shell.windows": "C:\\Windows\\sysnative\\WindowsPowerShell\\v1.0\\powershell.exe",
}
```

> Git Bash

```json
{
    // Git Bash
    "terminal.integrated.shell.windows": "C:\\Program Files\\Git\\bin\\bash.exe",
}
```

> 2017/12/29 追記

> Microsoft Store から入れた Ubuntu

```json
{
    // Ubuntu (Windows Subsystem for Linux)
    "terminal.integrated.shell.windows": "C:\\Users\\<ユーザ名>\\AppData\\Local\\Microsoft\\WindowsApps\\ubuntu.exe",
}
```
zshのRPROMPTがずれるのを直す

# RPROMPTがずれる

http://qiita.com/peccul/items/c3d3541ae9e6587712df

↑の記事でも言われているとおり、RPROMPTで以下のような色指定をすると表示がずれる。

```
RPROMPT="${fg[cyan]}%~${reset_color}
```

# 色指定を `%{` `%}` で囲めばOK

```
RPROMPT="%{${fg[cyan]}%}%~%{${reset_color}%}
```

これでずれなくなりました。
Google OAuth 2.0 認証を使ったログインの実装

#Google OAuth 2.0 認証を使ってgoogleでログインを実装してみる。
よくあるGoogleでログインという物を作るためGoogle OAuth 2.0 認証を使ってみる。

##Googleアカウントを作成
Googleアカウントを作成します。個人の物ではなく、サイト専用に作成した方が良いと思います。

##Google Developers Consoleにてサイト情報などの設定
Google Developers Console から、プロジェクトを作成、認証情報や、OAuth 用クライアントID等を取得します。

###Google Developers Consoleにログイン、プロジェクトの作成などを行っていきます。
https://console.developers.google.com/project

左上の「Project」よりプロジェクトを作成を選択します。
プロジェクト名などを入力しプロジェクトを作成します。

作成したプロジェクトを選択し、左メニューの認証情報を押下します。
すると下記のような画面になります。!

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/56889/15c792c6-2e1e-09fe-2c25-03a554ba1321.jpeg)


###OAuth同意画面の設定
サービス名やURLなど必要事項を記載します。

###認証情報の作成を行います。
認証情報を作成ボタンを押下し、OAuthクライアントIDを選択します。

![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/56889/905daffa-3644-d21d-39d0-01c619296c5a.jpeg)


今回はWEBアプリなのでアプリケーションの種類にはウェブアプリケーションを選択し、名前、制限事項、
認証された後に遷移するURL(callbackURL)などを設定していきます。

作成後、クライアントIDとクライアントシークレットが発行されるのでメモしておきます。

###実装
```lang:php
        $querys = array(
                'client_id' => HogeUtil::getGoogleClientId(),
                'redirect_uri' => HogeUtil::getGoogleClientCallBack(),
                'scope' => 'https://www.googleapis.com/auth/userinfo.profile',
                'response_type' => 'code',
        );

        return 'https://accounts.google.com/o/oauth2/auth?' . http_build_query($querys);
```

上記でログインボタンのリンクを作成し、コールバック側で

```lang:php
    private function getGoogleAuthToken($code) {
        $baseURL = 'https://accounts.google.com/o/oauth2/token';
        $params = array(
                'code'          => $code,
                'client_id'     => HogeUtil::getGoogleClientId(),
                'client_secret' => HogeUtil::getGoogleClientSecret(),
                'redirect_uri'  => HogeUtil::getGoogleClientCallBack(),
                'grant_type'    => 'authorization_code'
        );
        $headers = array(
                'Content-Type: application/x-www-form-urlencoded',
        );

        $options = array('http' => array(
                'method' => 'POST',
                'content' => http_build_query($params),
                'header' => implode("\r\n", $headers),
        ));

        $response = json_decode(
                file_get_contents($baseURL, false, stream_context_create($options)));

        if(!$response || isset($response->error)){
            return null;
        }

        return $response->access_token;
    }
```

トークンを取得して

```lang:php
    private function getGoogleUserId($asscessToken) {
        if (empty($asscessToken)) {
            return null;
        }

        $userInfo = json_decode(
                file_get_contents('https://www.googleapis.com/oauth2/v1/userinfo?'.
                'access_token=' . $asscessToken)
        );
        if (empty($userInfo)) {
            return null;
        }

        return $userInfo->id;
    }
```

こんな感じでuseridを取得できます。
useridが取得できたのでこれをうまいこと自システムのテーブルなどに入れてユーザ管理すればいいと思います。

id以外にもメールアドレスとかもとれるのでその辺りはgoogleの管理画面で調整してみてください。
JenkinsでAndroid SDKを更新する

##はじめに
JenkinsでAndroid SDKを更新させたときのメモ。

##設定
ジョブの設定で「ビルド」->「シェルの実行」に以下を記述して実行してみる。

```sh
$ANDROID_HOME/tools/android -s update sdk -u
```

これでやってもうまくいきませんでした。
コンソールを見たところ、ライセンス承諾でレスポンスがないからダメそう。
> Do you accept the license 'android-sdk-license-c81a61d9' [y/n]: 
Unknown response ''.

以下のように記述したらうまくいきました。

```sh
echo y | $ANDROID_HOME/tools/android -s update sdk -u
```

更新したいSDKを絞りたいときは以下のようにします。

```sh
echo y | $ANDROID_HOME/tools/android -s update sdk -u --filter build-tools-24.0.2,android-24
```

##今後は
調べていたら、Gradle Plugin for Androidをv2.2.0-alpha4からはauto-downloadを使って自動的にSDKダウンロードができるらしいです。
[CI環境でAndroid SDKのダウンロードを自動化する2016](http://qiita.com/Nkzn/items/b9a0ddd1345fb78d7d44)

今後は、こちらのやり方のほうが便利そうです。

##参考
* http://qiita.com/mattak/items/50fb72b586390a137d24
MacにSwagger Editor導入したときのメモ

## dockerインストール
https://docs.docker.com/docker-for-mac/

## dockerイメージ取得
docker pull swaggerapi/swagger-editor

## 実行
docker run -d -p 8001:8080 swaggerapi/swagger-editor

### メモ
* -d: デーモン化して実行する。
* -p: {ホストのポート番号}:{コンテナのポート番号}→Dockerサーバのホストとポートマッピングを指定。

## ブラウザからアクセス
http://localhost:8001
Railsで大量データをインポートする際、システムに負荷をかけないようにtransactionのサイズを調整する

mysqlのtransactionって結構コストかかりますよね。
知ってたけど、改めて思ったので備忘録として。
1000000件のデータをインポートするケースを考える。

## ダメな例: 逐一コミット

何も考えずに書くと以下のようになり、1000000回COMMITが走る。
commitのコストが1000000回重ねるとバカにならず、結果、時間もシステムリソースも大量に食う。

```ruby:batch.rb
1000000.times do |t|
  Model.new(name: “aaa”).save
end
```
```SQL:クエリ
(0.2ms)  BEGIN
(0.3ms)  INSERT INTO `models` (`name`) VALUES (‘aaa')
(4.0ms)  COMMIT
(0.2ms)  BEGIN
(0.3ms)  INSERT INTO `models` (`name`) VALUES (‘aaa')
(4.0ms)  COMMIT
...
```

## ダメな例: 一括コミット
じゃあ、全部transactionで囲めばいいじゃんとなる
しかし、マシン性能などにもよるが、件数が多いとmemoryなどが足りなくなって落ちる

```ruby:batch.rb
ActiveRecord::Base.transaction do
  1000000.times do |t|
    Model.new(name: “aaa”).save
  end
end
```
```SQL:クエリ
(0.2ms)  BEGIN
(0.3ms)  INSERT INTO `models` (`name`) VALUES (‘aaa')
(0.3ms)  INSERT INTO `models` (`name`) VALUES (‘aaa')
(0.3ms)  INSERT INTO `models` (`name`) VALUES (‘aaa')
(0.3ms)  INSERT INTO `models` (`name`) VALUES (‘aaa')
... システムリソースが足りませんエラー
```

## いい例: 適切なサイズ（10000件とか）ごとにコミット

10000回ごとにCOMMITすれば、BEGIN, COMMITのコストを削減できるし、システム負荷も抑えられる。
if文の中に `end` を書いたりするのは気持ち悪いけど。

```ruby:batch.rb
ActiveRecord::Base.transaction do
  1000000.times do |t|
    Model.new(name: “aaa”).save
    # 10000回ずつコミットする
    if t % 10000 == 0
      ActiveRecord::Base.connection.execute("COMMIT;")
      ActiveRecord::Base.connection.execute("BEGIN;")
    end
  end
end

```
```SQL:クエリ
(0.2ms)  BEGIN
(0.3ms)  INSERT INTO `models` (`name`) VALUES (‘aaa')
(0.3ms)  INSERT INTO `models` (`name`) VALUES (‘aaa')
(0.3ms)  INSERT INTO `models` (`name`) VALUES (‘aaa')
(0.3ms)  INSERT INTO `models` (`name`) VALUES (‘aaa')
(0.3ms)  INSERT INTO `models` (`name`) VALUES (‘aaa')
(0.3ms)  INSERT INTO `models` (`name`) VALUES (‘aaa')
(0.3ms)  INSERT INTO `models` (`name`) VALUES (‘aaa')
(0.3ms)  INSERT INTO `models` (`name`) VALUES (‘aaa')
(0.3ms)  INSERT INTO `models` (`name`) VALUES (‘aaa')
(xx.0ms)  COMMIT
...
```
WordPress 4.7 及び 4.7.1 における脆弱性

WordPress 4.7 及び 4.7.1 におけるセキュリティ上の脆弱性が指摘されています．WordPressのバージョンアップを直ちに行うことが推奨されています．


# 対象
WordPress 4.7 及び 4.7.1

# 問題点
遠隔の第三者によって，サーバ上でコンテンツを改ざんされる可能性がある．

参考：[WordPress 4.7.1 の権限昇格脆弱性について検証した - 徳丸浩の日記](http://blog.tokumaru.org/2017/02/wordpress-4.7.1-Privilege-Escalation.html)

# 解決策
WordPress を最新のバージョン (4.7.2) に更新する．

# 参考情報
* [WordPress 4.7.1 の権限昇格脆弱性について検証した - 徳丸浩の日記](http://blog.tokumaru.org/2017/02/wordpress-4.7.1-Privilege-Escalation.html)
* [WordPress の脆弱性に関する注意喚起 - JPCERT/CC](https://www.jpcert.or.jp/at/2017/at170006.html)
* [WordPress 4.7.2 Security Release - WordPress](https://wordpress.org/news/2017/01/wordpress-4-7-2-security-release/)
* [Content Injection Vulnerability in WordPress - Sucuri](https://blog.sucuri.net/2017/02/content-injection-vulnerability-wordpress-rest-api.html)
* [WordPress の脆弱性対策について - IPA](https://www.ipa.go.jp/security/ciadr/vul/20170206-wordpress.html)
[AMIMOTO]サーバー内にあるWordPressのバージョンをまとめて確認する


##追記:
サブディレクトリインストールやwp-config.phpが移動されている場合にも対応したバージョンが来てました。
http://qiita.com/wokamoto/items/4f70664a743f7e82bb16

##追記前本文ここから

パス指定すればWP-CLIコマンドをどのディレクトリで実行しても問題ないので、lsとawk組み合わせたらなんとかなる。

```bash
$ cd /var/www/vhosts/
$ ls -d $PWD/* | awk '{print "echo "$1";wp core version --path="$1}'  | sh
/var/www/vhosts/example.net
4.7.2
/var/www/vhosts/i-999XXXX
Error: This does not seem to be a WordPress install.
Pass --path=`path/to/wordpress` or run `wp core download`.
/var/www/vhosts/wp-kyoto.net
4.7.2
```


アップデートしたい時はたぶん以下のコマンドでいける。
たたこっちは横着せずに１サイトずつやることをおすすめします。

```
$ ls -d $PWD/* | awk '{print "wp core update --path="$1}'  | sh
```

複数サイトを１サーバで管理してて、WPバージョン確認してまわるのツライって時にどうぞ。

##変更履歴
- 2017/2/6: サブディレクトリ等対応版のリンク追加
- 2017/2/7: `--allow-root`オプションを削除
複数のVMkernelポートを作成する時はセグメントを分ける

# 概要

複数のvmkernelポートを作成する（管理専用、vMotion専用、NFS用、...を分ける）時はセグメントを分けます。

# 詳細

vmkernelポートの用途は管理通信、vMotion通信、NFS通信など複数あります。これらのトラフィックを分けたり、トラフィックシェーピングをかけるなどの目的で、個別にvmkernelポートを作成することがあります。この時は、各vmkernelポートグループに別々のセグメントのIPアドレスを与えます。

## 同一セグメント使用時の挙動

「[ESX/ESXi 上のマルチホーミング (2094476) | VMware KB](https://kb.vmware.com/kb/2094476)」によれば、複数のVMkernel ポートを同じIPサブネットで作成すると、次のような動作をします。

> 例：VMkernel ポートを次のように構成した場合
> ・vMotion 用の 1 つの VMkernel ポート。次の名前を付けます。 vmk0
> ・iSCSI 用のもう 1 つの VMkernel ポート。次の名前を付けます。 vmk1
> これらの vmknic の両方が同じ IP サブネットで構成される場合、VMkernel TCP/IP スタックでは、そのサブネットで出て行くすべての VMkernel トラフィック（vMotion および NFS）の 2 つのインターフェイスのうちいずれかを選択します。

「[Why is vMotion using the management network instead of the vMotion network? - frankdenneman.nl](http://frankdenneman.nl/2013/02/07/why-is-vmotion-using-the-management-network-instead-of-the-vmotion-network/)」によれば、以下の動作をするようです（該当部を筆者が和訳）。

> 管理ネットワーク（正確には1つ目のVMkernel NIC）とvMotionネットワークが同じサブネット（同じIP範囲）を共用している場合、vMotionはトラフィックをこのネットワークに接続された1つ目のVMkernel NICから送り出します。vMotionネットワークを別の標準スイッチや分散スイッチに作成しているかとか、別のNICを割り当てているかには関わらず、vMotionは同じIP範囲/サブネット上で検出された1つ目のVMkernelをデフォルトとします。
> この挙動は送信元のホストによる送出にだけ適用されることに注意してください。宛先ホストではvMotionネットワークでのみ到達したvMotionトラフィックを受け取ります！

## 問題

以下の問題状況が想定されます。

* 管理ポート(vmk0)とvMotion用ポート(vmk1)を分け、vMotion用ポートにトラフィックシェーピングをかけたのに、実際のvMotion時には大域幅いっぱいの通信が流れる。
* 管理通信とvMotion通信の物理NICやスイッチを分けている場合、送信側ホストは管理ポート(vmk0)からvMotionトラフィックを送り出し、宛先側ホストはvMotion用ポート(vmk1)で待ち受けるため、vMotionトラフィックが届かない。

# 参照

* [ESX/ESXi 上のマルチホーミング (2094476) | VMware KB](https://kb.vmware.com/kb/2094476)
* [Why is vMotion using the management network instead of the vMotion network? - frankdenneman.nl](http://frankdenneman.nl/2013/02/07/why-is-vmotion-using-the-management-network-instead-of-the-vmotion-network/)

----

本ページ内容は筆者が参照の便のためにある持点でまとめた個人的なメモです。内容を保証するものではなく、また筆者の所属組織等とは一切かかわりがありません。
Arduino と Processing 連携


Arduinodで信号が送られた際に、Processing上で映像を変化させるためのメモ。
後々、MaxかTouchDesignerで映像を数値で切り替えられればいいな。

>　参考 シリアル通信でArduinoからProcessingに情報を渡す
> http://tsukutta.hatenablog.com/entry/2013/06/27/190219


***
なぜか、シリアル通信できない。
なんで？
***

できた。
firamataつかえばいい。
※setup をsetuo って書いてた。

```
//processim firmate test

import processing.serial.*;
import cc.arduino.*;
import org.firmata.*;

final int sP = 0;
final int lp = 9;

Arduino arduino;

void setup(){
 size(400,400);
 arduino = new Arduino(this, "/dev/tty.usbmodem1411", 57600);
 arduino.pinMode(lp, Arduino.OUTPUT);
}

void draw(){
 // int sV = arduino.analogRead(sP);
  int sV = arduino.analogRead(sP);
  int b =  round(map(sV, 0 , 1023, 0, 255));
  background(b);
  arduino.analogWrite(lp, b);
}

```

arduino側では、firmataのサンプルのstandardFiramataを使えばいい。
JavaScript作業MEMO バッククオートを使用し綺麗にまとめる

# バッククオートを使用し綺麗にまとめる

```xxx.js
function buildHTML(user) {
  var user_name = user.name
  var member = $('<div class="chat-group-user__name">').append(user_name);
  var add_button = $('<div class="chat-group-user__btn chat-group-user__btn--add">').append("テキスト");
  var list = $('<li class="chat-group-user">').append(member, add_button);
  $(".member-list").append(list);
}
```

バッククウォートを使用し、綺麗にまとめると以下のようになる。

```xxx.js
function buildHTML(user) {
    var user_name = user.name
    var list = $(`
      <li class="chat-group-user">
        <div class="chat-group-user__name">${user_name}</div>
        <div class="chat-group-user__btn chat-group-user__btn--add">テキスト</div>
      </li>
      `);
    $(".member-list").append(list);
}
```
___Point___
・「.append」を多用しないのでパッと見てわかりやすい
・改行をそのまま書くことができる
・${～} の中には、変数や計算式を入れられる。

# 参考リンク
[JavaScript の テンプレートリテラル を極める！](http://qiita.com/kura07/items/c9fa858870ad56dfec12)
[もうはじめよう、ES6~ECMAScript6の基本構文まとめ(JavaScript)~](http://qiita.com/takeharu/items/cbbe017bbdd120015ca0)
Spring Boot環境で、PUT/DELETE/PATCHをPOSTで実行できるWebAPIを作る（x-http-method-override）

## Web apiを広く使ってもらうために

最近、会社でweb api（REST）を作ったのですが、HTTPメソッドを沢山使うようになりました。PUTとか、DELETEとか、PATCH、その他…。以前にjspとかで画面を作っているころ＝GETとPOSTだけの時代から比べると、隔世の感がありますね…年をとりました…:older_man_tone1:

一方で、書籍等では、『クライアントが、GET/POSTしか使えない環境であるときのために、POSTでも実行できる手段を提供すること』という下りもあり、PUTとかDELETEというメソッドの使用を強いるというのも宜しくないようです。

IBMの解説サイトの[あるページ](http://www.ibm.com/support/knowledgecenter/ja/SSTLXK_8.0.1/com.ibm.wbpm.bpc.doc/topics/rdev_restapis_httpmethods.html)では、FirewallがPUT/DELETEなどを通過させないことがある、と述べています。なんと！

## Spring MVCでの実現方法は？

どうやら2種類あるようです。
1. formにhiddenの項目（_method）を作り、methodを指定する
2. HTTPヘッダにx-http-method-overrideを設定する

1番の方法では、[HiddenHttpMethodFilter](http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/filter/HiddenHttpMethodFilter.html)という実装を使うことが知られています。このクラスはフィルターとして動作し、HttpServletRequestに格納されたHTTPメソッド名を差し替える働きがあるようです。

今回は紹介する方法は、2番の方法になります。理由は、今回のAPIでは、formデータ（application/x-www-form-urlencoded）ではなく、JSONデータ（application/json）を送信するためです。
＃json={"xxxx":"yyyy"}などのように、formデータとしてJSONを送信することも可能だとは思いますが、今回はストレートにJSONです。

[追記-2017/02/15] bodyでは無くても、urlの末尾に_methodを付けても動作するよ！（=Content-Typeは自由だよ）とのご指摘を頂きました。そうですね！今回はURL末尾につける"_command"のような書式を、オプション的な位置付けの独自コマンドに温存したいこともあり、HTTPメソッドのoverrideをヘッダで指定する方式を選択しました。


## X-HTTP-Method-Overrideを使う

調べてやってみると、意外にシンプルでした。Spring MVCのRequestMapping機能は、もともとHTTPヘッダの値を使ってマッピングを絞り込むことができたのでした。
ですので、POSTメソッドをマップするcontrollerのメソッドのRequestMapping定義に、headers=を加えれば良かったのでした。

下記が実際に動作したソースのサンプルです。

``` SampleController.java

    @RequestMapping(value = "/method/{param}",method = RequestMethod.POST,
            headers={"X-HTTP-Method-Override=DELETE"})
    public ResponseEntity<?> delete2(
            @PathVariable String param,
    ){
        // 本来のdeleteメソッド
        return this.delete(param);
    }
```

POSTかつheadersで絞り込んでリクエストを受け、本来の処理に流せば完了です。


参考資料は[こちら](https://books.google.co.jp/books?id=rf1_CwAAQBAJ&pg=PA45&lpg=PA45&dq=spring+rest+x-http-method-override&source=bl&ots=73FmweIpC2&sig=h6TSmjzyGFTAFP-wsVoRGOs3jgk&hl=ja&sa=X&ved=0ahUKEwiXl7CP4PbRAhVIWLwKHaacCSI4ChDoAQgrMAI#v=onepage&q=spring%20rest%20x-http-method-override&f=false)
（おわり）