OmniAICreator/Qiita-1.07M huggingface dataset:
Swift プログラム（コマンドライン）

こんにちは。
Swift プログラム（コマンドライン）の練習で、数値の切り捨てを行うプログラムを作りました。

オプション引数の処理に試行錯誤しました。Ubuntu 上でも動くはずと思っているのですが試していません。

```console
$ ./floor.swift -d0.5 2.8
2.5
$ export SDKROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platf
orm/Developer/SDKs/MacOSX10.11.sdk
$ swiftc floor.swift
$ ./floor -d0.5 2.8
2.5
$ ./floor -h

Name: floor - Obtain the floor of numerical values.

Usage: floor [options] number [number2 ...]

Options:
  -h, --help
  -dN             using a dividing value N (default 1)

Sample:
  $ floor -d0.5 2.8
   2.5
```

```floor.swift
#!/usr/bin/env swift

#if os(OSX)
import Foundation
#elseif os(Linux)
import Glibc
#endif

func substr(str:String, n:Int) -> (String, String) {
  if (str.characters.count < n) {return (str, "")}
  let i = str.startIndex.advancedBy(n)
  return (str.substringToIndex(i), str.substringFromIndex(i))
}

func usage_exit(cmd:String) {
    let c = cmd.stringByReplacingOccurrencesOfString("^\\./", withString: "", options:NSStringCompareOptions.RegularExpressionSearch)
    print(["",
    "Name: \(c) - Obtain the floor of numerical values.\n",
    "Usage: \(c) [options] number [number2 ...]\n",
    "Options:",
    "  -h, --help",
    "  -dN             using a dividing value N (default 1)\n",
    "Sample:",
    "  $ \(c) -d0.5 2.8",
    "   2.5"].joinWithSeparator("\n"))
    exit(0)
}

var div = 1.0
let args = Process.arguments

for arg in args.suffixFrom(1) {
  var sub = substr(arg, n:2)
  switch (arg, sub) {
    case ("-h", _), ("--help", _):
        usage_exit(args[0])
    case (_, ("-d", _)):
        var x = Double(sub.1)
        if(x != nil) {div = x!}
    default:
        var x = Double(arg)
        if(x != nil) {print(floor(x!/div)*div)}
  }  
}

exit(0)
```
Javascriptだけで簡易にブラウザ言語ごとにHTMLコンテンツを切替

CSS，JSファイルは、適宜分ける。

```html
<div id="ja-contents">
	------ 日本語コンテンツ ------
</div>
<div id="en-contents">
	------ 英語コンテンツ ------
</div>
<div id="zh-contents">
	------ 中国語コンテンツ ------
</div>

<style>
#ja-contents,
#en-contents,
#zh-contents {
	display: none;
}
</style>

<script type="text/javascript" charset="utf-8">
var browserLanguage = function() {
	var ua = window.navigator.userAgent.toLowerCase();
	try {
		// chrome
		if( ua.indexOf( 'chrome' ) != -1 ){
			return ( navigator.languages[0] || navigator.browserLanguage || navigator.language || navigator.userLanguage).substr(0,2);
		}
		// それ以外
		else{
			return ( navigator.browserLanguage || navigator.language || navigator.userLanguage).substr(0,2);
		}
	}
	catch( e ) {
		return undefined;
	}
}
// 日本語
if( browserLanguage() == 'ja' ){
	document.getElementById("ja-contents").style.display="block";
}
// 英語
else if( browserLanguage() == 'en' ){
	document.getElementById("en-contents").style.display="block";
}
// 中国語
else if( browserLanguage() == 'zh' ){
	document.getElementById("zh-contents").style.display="block";
}
// その他
else{
	document.getElementById("ja-contents").style.display="block";
}
</script>
```
Git コマンド基本的なコマンド


## gitコマンド
- コマンド 
 - 機能

- git log
 - コミット履歴を表示
- git log -p 
 - ソースdiff表示
- git log --graph --pretty=format:"%h [%cn]%s"
 - コミット履歴を一行ずつで表示  
- git stash
 -  変更を一時的に退避しておくことのできる機能
- git stash list
 - いまどんな変更を退避しているかを確認
- git stash apply stash@{0} 
 - 復活させたいstash名がわかったら次のコマンドで取り出すことができる
- git stash pop stash@{0} 
 - listから削除して取出し
- git stash drop stash@{N}
 - 削除
- git stash show stash@{N}
 - 表示 
- git config --global core.editor vim
 - エディタを設定する
- git config -l
 - リポジトリの設定で使用される値を表示する
- git config --global user.email "Your email"
 - デフォルトのメールアドレスを設定する
- git config --global user.name "Your name"
 - デフォルトのユーザ名を設定する
- git reset --soft HEAD^<br>git reset --mixed HEAD<br>git reset --hard HEAD^ [gitのコミット取り消し](http://qiita.com/shuntaro_tamura/items/db1aef9cf9d78db50ffe)

- git checkout `<file>`
 - 変更取り消し
- git branch -r
 - リモート branch の確認
- git checkout -b aaa 
 - 作業 branch を作成して切り替える
- git commit -a
 - コミット
- git push -u origin hoge or git push -u origin master
 - リポジトリにpush
- git config --global core.excludesfile ~/.gitignore
 - 　ローカルの.gitignoreを有効にする
- config --global core.editor vim
 - commit時のエディタをvimに設定　
- git ブランチを最新にしてリモートにpush ※初回のみ
 - git checkout master
 - git pull origin master
 - git checkout xxxx
 - git stash 
 - git rebase master
 - git stash pop
 - git push origin xxxx
- git commit --amend
 - commitを取り消し
- git ブランチ作成し直してpush
 - git branch -m tmp_branch
 - git co master
 - git pull origin master
 - git co -b XXXXX
 - git co tmp_branch 
 - git log
 - git co XXXXX
 - git cherry-pick 0ae71f33f59c9edf94755
- git ブランチ作成し直してpush　２
 - git branch -m tmp_branch
 - git co master
 - git fetch
 - git co -b XXXXX
- git マージコマンド
 - git co AAAA マージしたいブランチに移動
 - git merge —no-ff master マスターよりしたい時
 - git rebase XXXXX　派生したブランチよりマージ
 - git status でboth modified:が出たファイルを手動で修正
 - git add 手動で直したらaddする 
 - git rebase --continue
- git 削除コマンド
 - git branch —d XXXXX
 - git push origin :XXXXX
- git 直前取り消し
 - git reset HEAD^
- 現在のブランチから派生ブランチを作成する
 - git branch ブランチであることを確認
 - git checkout -b BN
- コンフリクトが発生してマージできないとき　（ブラウザ上から押せない）
 - git merge --no-ff master
 - git status　マージを直す
 - git commit
 - git push origin XXXXX
- リモートのブランチを取り込む
 - git fetch
 - git checkout -b XXXXX origin/XXXXX 
- マージ済みローカルブランチ削除
 - git branch --merged|egrep -v '\\*|develop|master'|xargs git branch -d
- 追跡ブランチ削除
 - git fetch --prune
- git remote branchの変更取り込み
 - git pull origin XXXXXX ←リモートリポジトリ名




[詳しい](http://qiita.com/masashi127/items/2e103c3fba9d1b058961)
レスポンシブなHTMLメールフレームワークを使う


<div style="text-align:center;">
<img src="https://cloud.githubusercontent.com/assets/6558790/12672296/7b66d8cc-c675-11e5-805d-c6d196320537.png" width="200">
</div>

# mjml

レスポンシブなHTMLメールを作成するためのフレームワーク。

mjmlの中身は、Reactで書かれていて、mjmlで用意されているComponentを使って
文書を作成し、mjmlでコンパイルすると、レスポンシブで様々なクライアントに対応した
レスポンシブなHTMLが出力されます。

Github: [mjmlio/mjml](https://github.com/mjmlio/mjml)
Website: https://mjml.io/

## インストール

```bash
$ npm install mjml --save-dev
```

## mjml文書作成

```bash:hello.mjml
<mj-body>
  <mj-section>
    <mj-column>
      <mj-text>
        Hello World!
      </mj-text>
    </mj-column>
  </mj-section>
</mj-body>
```

## コンパイル

* 即時実行

```bash
$ ./node_modules/.bin/mjml -r hello.mjml
```

* ファイルの変更をウォッチして自動でコンパイル

```bash
$ ./node_modules/.bin/mjml -w hello.mjml
```

## テンプレート

多彩なテンプレートも用意されています。
随時追加されているようです。

https://mjml.io/templates

## 表示確認

* [Email on Acid](https://www.emailonacid.com/)

月額：$45
1週間フリートライアル有り

* [Litmus](https://litmus.com/)

月額：$79
フリー有り（検証クライアントが限定されています）
avrdude: stk500_recv(): programmer is not responding エラー

# 状況
- Arduino Nanoでsleep機能をいろいろ試してみたら、アップロードできなくなった。
- 13番LEDが短い間隔で点滅しているので、おそらく変なソースコードをアップロードしたかも。
- エラーメッセージは、avrdude: stk500_recv(): programmer is not responding
- RX、TXピン外し、ドライバーアップデート、リセットボタン押下など全てダメ。
- 作業環境は、mac。

# 対応
ⅰ. Arduino IDEの環境設定を開く。
ⅱ. Show verbose output during項目のcompilationとuploadにチェックを入れて保存する。
ⅲ. Exasamplesから適当なソースコード（Blink）をアップロードする。
ⅳ. コンソールからupload部分をコピーし、ターミナルに貼り付けておく。
ⅴ. いろいろ見たいので、-v -v -v -v　オプションも追記しておく。
ⅵ. ここまでは、おそらくこんな感じとなる。

```
/Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/avrdude -v -v -v -v -C/Applications/Arduino.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf -v -patmega328p -carduino -P/dev/cu.wchusbserial1410 -b57600 -D -Uflash:w:/var/folders/1z/gpb1z1hd455f4n7b2gxryv9w0000gn/T/build4187799815596674335.tmp/Blink.cpp.hex:i
```

ⅶ. Arduino Nanoをusbケーブルから外して、再度接続する。
ⅷ. ⅶの0.5秒後に先ほどターミナルに貼り付けたコマンドを実行する。
ⅸ. 「avrdude done.  Thank you.」なら成功。
CakePHP3でビューにユーザ情報表示

ログイン認証付きWebサービスを作っていると、ユーザ名を画面上に表示したいことがよくあります。
そんな時にビューにユーザ情報を表示する方法について。

#isAuthorizedメソッドを使う
CakePHP3では、認証後にControllerのisAuthorizedメソッドが呼び出されるようになります。
isAuthorizedメソッドは引数にログインされているユーザ情報(ログイン処理時にsetUserしたEntity)が入ってくるので、そのEntityの必要な情報を変数に格納します。

```php:AppController.php
public function isAuthorized($user = null){
    	//ユーザ名格納
    	$this->set('username', $user['username']);
}
```

ビュー側では普通にここで設定した変数名を参照すればいいだけ。

#とはいえ
Controller側で変数に格納し、ビュー側で取り出すというのは何となくすっきりしない感じ。
出来ればビュー側だけで書きたいと思ったりもするけど、解決策はわかってないです。
SessionHelperとかあるみたいだから、そのあたりをうまく使えばかけるんですかね？
MacでPuTTYの.ppkファイルからOpenSSH形式の秘密鍵を生成しパスフレーズを取り除く

こんばんは :whale2: 

掲題の件、
拡張子`.ppk`(PuTTY private key)のファイルから OpenSSHっぽい秘密鍵を抜き出すのです。
(何番煎じかわからない記事を書いてごめんなさい)

## 環境

```bash:環境
# コンピュータ
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.11.3
BuildVersion:	15D21

# OpenSSH バージョン
$ ssh -V
OpenSSH_6.9p1, LibreSSL 2.1.8

# のちほど homebrew でインストールする(した) puttygen のバージョン
$ puttygen --help 2> /dev/null
puttygen: Release 0.66
```

## puttygen のインストール

homebrewでインストールします。

```bash
$ brew install putty
```

## PuTTY の ppk から OpenSSH 形式の秘密鍵を抜き出し

作業対象の PuTTY private key ファイルは `hoge.ppk` です。
今回は秘密鍵を抜き出すため`private-openssh`を指定します。[^memo]

```bash
$ puttygen hoge.ppk -O private-openssh -o ~/.ssh/id_rsa
  (ppkに設定された秘密鍵のパスフレーズを入力)
```

## 秘密鍵のパスフレーズを取り除く

```bash
$ openssl rsa -in ~/.ssh/id_rsa -out ~/.ssh/id_rsa
  (元のppkに設定された秘密鍵のパスフレーズを入力)

## パーミッション変更(だいじ)
$ chmod 600 ~/.ssh/id_rsa
```

おわりです。

## 参考と注釈

* [SSH鍵ファイルいろいろ - Qiita](http://qiita.com/kobake@github/items/0a0dcef5bac2d6a9ee52)
* [Puttyの.ppkファイルからopenssh用の鍵を取り出す - Qiita](http://qiita.com/nakata0705/items/4994dd2a81e6fd579f89)
* [MacでPuttyのPPK形式をOpenSSH形式に変換する - Qiita](http://qiita.com/reoring/items/b11ad94ac0c7650ae97f)
* [秘密鍵からパスフレーズを取り除く - Qiita](http://qiita.com/kadoppe/items/0c289244a3a7286b3d75)
* [SSH接続設定 - サルでもわかるGit入門](http://www.backlog.jp/git-guide/reference/ssh.html)

[^memo]: -O で `public-openssh` を指定すると、OpenSSH形式の**公開鍵**が抜き出せます。
「さくらのクラウド」のロードバランス対象サーバ作成用スタートアップスクリプト

# 構成
「さくらのクラウド」で以下のような構成を作ろうとしてました。
![WS001419.JPG](https://qiita-image-store.s3.amazonaws.com/0/101811/e146160c-2a17-39dd-4662-19cbd2d6a444.jpeg)

VPCルータのグローバルIPアドレスをロードバランサのVIPにNATして、Webサーバ2台にロードバランスさせる構成です。

こちらがロードバランサのマニュアルですが
http://cloud-news.sakura.ad.jp/load-balancer/

3. 導入設定→2. 実サーバのネットワーク設定
を見ると、ロードバランス対象のサーバに設定変更をする必要があるとのことで。

* sysctl.confの設定追加
* ループバックアドレスの追加

が必要なのですが、「これ一台一台やってたらめんどくさいな…」と思って
スタートアップスクリプト書きました。

```
#!/bin/sh
# @sacloud-once
# @sacloud-desc (このスクリプトは、CentOS6.7でのみ動作確認しています)
# @sacloud-text required shellarg maxlen=20 para1 "ロードバランサーのVIP"
PARA1=@@@para1@@@
PARA2="net.ipv4.conf.all.arp_ignore = 1"
PARA3="net.ipv4.conf.all.arp_announce = 2"
PARA4="DEVICE=lo:0"
PARA5="IPADDR="$PARA1
PARA6="NETMASK=255.255.255.255"

echo $PARA2 >> /etc/sysctl.conf
echo $PARA3 >> /etc/sysctl.conf
sysctl -p 1>/dev/null

touch /etc/sysconfig/network-scripts/ifcfg-lo:0
echo $PARA4 > /etc/sysconfig/network-scripts/ifcfg-lo:0
echo $PARA5 >> /etc/sysconfig/network-scripts/ifcfg-lo:0
echo $PARA6 >> /etc/sysconfig/network-scripts/ifcfg-lo:0
ifup lo:0
```
注意事項としては、サーバ作成前にVIPを決めておく必要があります。
VIPはサーバ作成時にテキストボックスが出てくるのでそこに入力します。
自動リロードするGreasemonkey

自動でリロードしてほしいページがあったため、Greasemonkeyで対応した際のメモです。

```js
// ==UserScript==
// @name        autoreload
// @namespace   haruyosh.name.space
// @include     http://example.com/static.html
// @version     1
// @grant       none
// ==/UserScript==

(function myloop(i) {
  setTimeout(function() {
    myfunc();
    if (--i) myloop(i);
  },180000)
})(1);

function myfunc() {
  window.location.reload(true);
}

var myp = document.createElement("p");
myp.textContent = "Last update: " + (new Date()).toString();
$("#top").append(myp);
```

## 参考文献
[How to reload a page using Javascript?](http://stackoverflow.com/questions/3715047/how-to-reload-a-page-using-javascript)
[How do I add a delay in a JavaScript loop?](http://stackoverflow.com/questions/3583724/how-do-i-add-a-delay-in-a-javascript-loop)
ESP8266 | AD2 > 1MHz 50% duty 測定 > リンギング？が見える

```txt:動作環境
ESP-WROOM-02 (以下 ESP8266)
Analog Discovery 2 (以下 AD2)
```

[macsbugさんの記事](https://macsbug.wordpress.com/2016/02/19/esp8266%E3%81%A7%EF%BC%91mhzwo/)を試してみた。

コードはそのままを拝借しました。感謝。

## 接続

ESP8266(左)とAD2(右)の接続

- IO13 <-> Scope ch1. Positive
- GND <-> Scope ch1. Negative

実際の接続の様子は以下の写真。
使用治具は以下のセット。

- AD2付属のリード付きコネクタ
- ICクリップ (ストレートピンヘッダをはんだづけ)

![DSC_0130.JPG](https://qiita-image-store.s3.amazonaws.com/0/32870/6d04fe38-38f0-6223-37c8-553ec9d092b0.jpeg)



## 結果

Periodは 1.000 MHzを達成。macsbugさんに感謝。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/402b497c-6d93-0695-c9a4-ae55dc155a0a.png)

しかしながら、エッジ部分に波が見える。これがリンギングというものなのかもしれない。
[macsbugさんの助言](https://macsbug.wordpress.com/2016/02/21/%E3%82%B9%E3%83%86%E3%83%83%E3%83%97%EF%BC%91%EF%BC%90%E3%81%A7%E7%B5%84%E3%81%BF%E4%B8%8A%E3%81%8C%E3%82%8B-d1-mini-%E7%B5%84%E3%81%BF%E7%AB%8B%E3%81%A6/#comment-129)

> ESP8266のGPIOポート等の「方形波」を見る時はプローブが必要になります。
その時、重要なのが最短距離で測る事。
GNDなどのリード線等の長さでリンギングが起きます。
立ち上がりのリンギングはGND線の長さ、つまりコイル成分がもろに出ます。
プローブのキャップを取りGNDと先端にピンを直付けします。
たとえばブレットボードに挿したESP8266の端子の直下で見ると良いかと思います。

上記の接続では全然最短距離になっていない。

BNCコネクタ部品などが届いてから再挑戦する。


## v0.2 

ふと、ツイストペアにすればどうだろうかと思った。
逆位相同士で減るノイズもあるはず。

Scopeの Positive と Negative の線をツイストしてみた。

多少ましにはなったが、まだまだリンギングは消えない。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/72616eba-2623-6d22-776e-0d900b2a78dd.png)


## 他に試したこと

- アルミホイルでリード線を巻いて、周囲からのノイズの混入を回避
  - 効果なし
- ブレッドボード用リード線（短い線）で測定
  - 効果なし
プラットフォーム別 広告 ID の仕様

# Google Advertising ID
## 取り方
[AdvertisingIdClient | Google APIs for Android | Google Developers](https://developers.google.com/android/reference/com/google/android/gms/ads/identifier/AdvertisingIdClient)

```java
AdvertisingIdClient.Info adInfo = AdvertisingIdClient.getAdvertisingIdInfo(context);
String aaidString = adInfo.getId();
```
## 仕様
[Format of the Advertising ID - Advertising ID | Android Developers](http://www.androiddocs.com/google/play-services/id.html#format)
には
> Google Play services APIs expose the user's advertising ID as a string format of UUID

とあり、`UUID` である事が判る。

# Apple Advertising Identifier
## 取り方
[advertisingIdentifier Property - ASIdentifierManager Class Reference](https://developer.apple.com/library/ios/documentation/AdSupport/Reference/ASIdentifierManager_Ref/#//apple_ref/occ/instp/ASIdentifierManager/advertisingIdentifier)

```objc
NSUUID *idfa = [ASIdentifierManager sharedManager].advertisingIdentifier;
NSString *idfaString = [idfa UUIDString];
```
## 仕様
`advertisingIdentifier` プロパティが返す `NSUUID` は、[NSUUID Class Reference](https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSUUID_Class/index.html#//apple_ref/swift/cl/c:objc(cs)NSUUID) に
> UUIDs created by NSUUID conform to RFC 4122 version 4 and are created with random bytes.

とあり、`RFC 4122 version 4` に準拠していると明記されている。

# Windows Advertising ID
## 取り方
[AdvertisingManager.AdvertisingId | advertisingId Property (Windows)](https://msdn.microsoft.com/ja-jp/library/windows/apps/windows.system.userprofile.advertisingmanager.advertisingid)

```csharp
string advertisingId = Windows.System.UserProfile.AdvertisingManager.AdvertisingId;
```
## 仕様
（公開されているもの）は無い。ひどい。

[advertisingid lenght - Msdn forums - Tools for Windows Store apps (archived)](https://social.msdn.microsoft.com/Forums/exchange/en-US/fcaee162-1a95-4bfe-8f21-ae3ef9d21142/advertisingid-lenght?forum=toolsforwinapps)
現状 32文字の文字列が取得できるが、その文字数という保証はない。

# おわりに
いい加減各方面の Advertising ID の頭字語を iAB あたりが決めてくれないかな。
CentOS6.7での chainer 1.7.0 with CUDA のインストール

# はじめに
## インストールのハマりどころ

- python 2.7系でも python 3.5系でもインストールは楽だった
- しかし、Chainerの最新版では gcc 4.8 以上が必要とされているが、CentOS6.7のでは 4.4 どまりである
- ちなみに、GPGPU (CUDA)を使わない場合は4.4でも問題ないが`python train_mnist.py -g 0` をすると死ぬ
    - core がない、などのエラーがでる
    - あれ自分の環境は？と思った人は、とりあえず `python -c 'import cupy'`をして何もエラーがなければ問題は無い
- Chainerをインストール（コンパイル）するときだけgcc-4.8が使えれば良く、実行時には必要とされないようだ

# インストール手順のメモ

## gcc 4.8を使えるようにする

wgetを使う方法がやたらと見つかるが、ここでは`yum`からSCL (Software Collection; devtools-3) を使う方法で試してみる。

``` bash
$ sudo yum install centos-release-scl-rh
$ sudo yum install devtoolset-3-gcc-c++
```

1行目でリポジトリが追加される。なお、鍵はない模様。`/etc/repos.d/`を眺めておくと良い。
2行目で`scl-utils`、`devtoolset-3-gcc`や`devtoolset-3-binutils`あたりもインストールされる。
なお、`gcc`などがインストールされる先は`/opt/rh/devtoolset-3/`以下であり、既存の`gcc`が上書きされたりパスを自動で通すことはない。

今回は一時的に新しい`gcc`と`g++`が使いたいのだが、他のSCLコレクションとは違ってshellを動かす必要があるみたい。ということで、

``` bash
$ scl enable devtoolset-3 bash
```

これで動く。バージョンを一応確認しておくと、

``` bash
$ gcc -v
```

4.9という文字が見えるはず。


# Chainerのインストール

いろいろ試行錯誤したあとにこのページを見つけていると思われるので、キャッシュ消しつつインストールする。

``` bash
$ pip unistall chainer
$ pip install chainer --no-cache
```

終わったらちょっとだけ確認。

``` bash
$ python -c 'import cupy'
```

何もエラーが出なければOK。

後は、mnist回してみましょう。

## 最後に

年のため、ログアウトしてからもう一度ログインしても、動くことをテストしておいた方が良いかもしれません。
JSONPathにおける[*]と..の違い

# 概要
JSONPathの構文で、[*]と..の違いがよくわからなくなったのでまとめる。

# JSONPathとは
JSONPath - XPath for JSON : http://goessner.net/articles/JsonPath/

# [*]と..で何が違うのか？
例えば、上記のサンプルコードを引用する。

```json
{ "store": {
    "book": [ 
      { "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
      },
      { "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "price": 12.99
      },
      { "category": "fiction",
        "author": "Herman Melville",
        "title": "Moby Dick",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      { "category": "fiction",
        "author": "J. R. R. Tolkien",
        "title": "The Lord of the Rings",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}
```

このとき、bookのpriceの一覧を取得しようとしたときに、
`$.store.book..price` と `$.store.book[*].price` の何が違うのか。

# 結論
`$.store.book..price`は、bookが配列でなくてもpriceを取得できる。
`$.store.book[*].price`は、bookが配列でないとpriceを取得できない。
ただし、どちらも結果は配列で取得できる。

つまり、以下のような場合、`$.store.book[*].price`ではpriceを取得できない。

```json
{ "store": {
    "book": { // bookが配列ではない。
        "category": "reference",
        "author": "Nigel Rees",
        "title": "Sayings of the Century",
        "price": 8.95
    },
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  }
}
```

なので、例えばRSpecでJSONPathを使ってテストを書こうとした場合、
必ず配列である場合には`[*]`を使って、単体だと配列にならず、複数だと配列になるような場合（そんな設計はそもそもどうなのというのはあるが）、`..`を使う。
CGFloatをもっとシンプルに

役に立つかどうかよくわからないTipsシリーズ

swift は型に厳密ですけど
型推論でなんとなくいい感じにポコッと収まりますよね

```swift
let intVal = 0
```

こう書けば `intVal` は Int型になります

だけど、こう書くとどうでしょう

```swift
let width = 100.0
let height = 100.0
let frame = CGRectMake(0, 0, width, height)
```
とたんに怒られます
`width` や `height` は、型推論で Float として扱われてしまうからです

CGFloat は CoreGraphic 系の中でも
座標指定したりする時に多用する型のひとつですが
こういうちょっとした融通の効かなさがありますね

で、普通なら

```swift
let width: CGFloat = 100.0
let height: CGFloat = 100.0
let frame = CGRectMake(0, 0, width, height)
```
こんな風に型を指定するか、もしくは

```swift
let width: 100.0
let height: 100.0
let frame = CGRectMake(0, 0, CGFloat(width), CGFloat(height))
```
こんな風にキャストして書きますね

長い、めんどくさい

そこで objective-c を思い出しました

```objc
CGFloat width = 100.0f;
CGFloat height = 100.0f;
CGRect frame = CGRectMake(0, 0, width, height);
```

objective-cは型宣言が必須なので、ソースコードの長さは変わらないけれど
語尾に `f` がつくことで、なんとなく型がわかる感じでした (← こんな書き方でいいのか?)

こんなノリを swift でも使いたい

そこで

```swift
extension Int {
	public var f: CGFloat {
		return CGFloat(self)
	}
}
extension Float {
	public var f: CGFloat {
		return CGFloat(self)
	}
}
extension Double {
	public var f: CGFloat {
		return CGFloat(self)
	}
}
```

とりあえず、Int と Float と Double の extension を作って
`f`という計算プロパティをこしらえました

すると・・・

```swift
// Before
let width: CGFloat = 100.0
let height: CGFloat = 100.0
let frame = CGRectMake(0, 0, width, height)

// After
let width = 100.f
let height = 100.f
let frame = CGRectMake(0, 0, width, height)
```

なんということでしょう
非常にシンプルに CGFloat の変数を作ることができました

このサンプルだと恩恵がよくわかんないですけど
座標計算がかさばってくると、このプロパティは助かります

Int や Float がまぜこぜになると、非常にめんどくさい作業がありますからね

たとえば

```swift
let interval = 20.0
let viewCount = 4

let x = (view.frame.size.width + CGFloat(interval)) * CGFloat(viewCount)
```

みたいなのが

```swift
let interval = 20.0
let viewCount = 4

let x = (view.frame.size.width + interval.f) * viewCount.f
```

と、型が簡単に統一される上に、ソースが短くなります

`CGFloat(数字)`みたいにキャストを多用してる人は試してみては?
春到来! C++ スタイルコーデ 6 集

春到来ですね! github で公開しているオープンソース C++ コードの外見もリフレッシュして新しいジブンにチャレンジしたいですね! あわよくば運命的な C++ 出会いも期待できちゃうかも...!

そこでここでは, 春トレンドを先取りした C++ スタイルコーデを集めてみました.

## Google C++ Style Guide
  
https://google.github.io/styleguide/cppguide.html

みんなの憧れ, デキる大人のギロッポン外資系クールな C++ スタイル!

なんだかルールがいっぱいで大変そう... と思ったズボラでうっかりな性格のアナタでも大丈夫! cpplint がコーデを自動でチェックして全力アシスト!

https://github.com/google/styleguide/tree/gh-pages/cpplint


## LLVM Coding Standards

http://llvm.org/docs/CodingStandards.html

アーティスティックでスタイリッシュ, でもちょっとコンサバな新宿スタイル!

clang-format と組み合わせて周りの視線をがっちりキャッチ!

http://clang.llvm.org/docs/ClangFormat.html

## WebKit Code Style Guidelines

https://webkit.org/code-style-guidelines/

オトナカワイイ渋谷スタイル!
デザイナーと仲良くなりたいなら WebKit コーデで決まり!

## GCC C++ Coding Conventions 

https://gcc.gnu.org/wiki/CppConventions

https://gcc.gnu.org/wiki/CppConventions

ヒッピー文化ただよう, 裏原スタイル!
古着(C++03)を着こなすファッションセンスを鍛えちゃお!


## HHVM Coding Conventions

https://github.com/facebook/hhvm/blob/master/hphp/doc/coding-conventions.md

ヒップでホップなウォーターフロントお台場スタイル!

Boost 使ってイケイケなジブンを表現したいなら HHVM コーデで決まり!

## Mozilla Coding style

https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Coding_Style

元祖情報大航海時代のオープンソースプロジェクト!

古くて新しい, ハマトラ(横浜トラディシナル)スタイル!

## 合わせて読みたい.

[C++コードのデトックス](http://qiita.com/MitsutakaTakeda/items/6b9966f890cc9b944d75) で内面もキレイに保ちたいですね!
Swiftをインタープリタ型言語として扱う

# Appleソフトウェアのためだけじゃない言語へ
Swiftがオープンソース化してその使用目的の裾野が広がる動きに合わせて、AppleはSwiftをXcode無しでも使えるようにしていたみたいです。ただあまり需要がまだ無いせいかあまりこのことについて言及している記事が少ないので公式のドキュメントをひも解きながらやっていきたいと思います。

参考: [Swift.org](https://swift.org/getting-started)

## インストール
Swiftオープンソース化ということでもちろんのことマルチプラットフォーム化しています。

### OS X
これに関してはもちろん元からインストールされているのでターミナルから使えるようにするだけでいいです。

```shell-session
$ export PATH=/Library/Developer/Toolchains/swift-latest.xctoolchain/usr/bin:"${PATH}"
```

もちろん.bashrcや.zshrcに書くのが手っ取り早いでしょう。

### Linux
clangに付いているみたいです。

```shell-session
$ sudo apt-get install clang
$ export PATH=/path/to/Swift/usr/bin:"${PATH}"
```

## REPLを起動
使い方は簡単です。

```swift
$ swift
Welcome to Apple Swift version 2.2. Type :help for assistance.
  1>
```

このようにswiftとうつことで起動されます。:helpでヘルプが見れますし終了したいときは:qで終了できます。ここらへんはHaskellのghciに似ていますね。

## 実際に使ってみよう
それでは実際に使ってみましょう。ドキュメントに沿ってやっていきます。

```swift
  1> 1 + 2
$R0: Int = 3
  2> let greeting = "Hello!"
greeting: String = "Hello!"
  3> print(greeting)
Hello!
```

このように扱うことができます。で、この出力フォーマットもしやと思いやってみたら案の定でした。

```swift
  4> print($R0)
3
```

ここらへんは実際にXcodeとかでコード書く時と同じなんですね。
エラーメッセージはこんな感じででます。

```swift
  5> let answer = "forty"-"two"
repl.swift:5:21: error: binary operator '-' cannot be applied to two 'String' operands
let answer = "forty"-"two"
             ~~~~~~~^~~~~~
  5>
```

またこのXcodeと同じようにTabでサジェストする機能もあるらしいです。

```swift
  5> "Hi!".re
Available completions:
	removeAll() -> Void
	removeAll(keepCapacity: Bool) -> Void
	removeAtIndex(i: Index) -> Character
	removeRange(subRange: Range<Index>) -> Void
	replaceRange(subRange: Range<Index>, with: C) -> Void
	replaceRange(subRange: Range<Index>, with: String) -> Void
	reserveCapacity(n: Int) -> Void
  5>
```

また複数行での入力にも対応しています。しかも自動インデントしてくれるみたいです。

```swift
  5> let numbers = [1,2,3]
numbers: [Int] = 3 values {
  [0] = 1
  [1] = 2
  [2] = 3
}
  6> for n in numbers.reverse() {
  7.     print(n)
  8. }
3
2
1
```

またライブラリをimportして使うことも出来るみたいです。import自体は

```swift
  9> import Darwin
 10> arc4random_uniform(10)
$R1: UInt32 = 2
 11>
```

というようにできます。ちなみにこのDarwinというのはOS XだけでLinuxはGlibcというのがかわりに使えるみたいです。

## 最後に
以上です。これによって簡単な処理をSwiftとかでやりたい時はPlaygroundとか起動するよりももっと手軽かつ便利に扱えるようですね。

ちなみに今回見ていたドキュメントには他にもSwiftコードを手動でビルドする方法とかコマンドラインからデバッグをする方法とかも書いてあります。そこで気付いたんですがlldbってどっかで聞いたことある単語だなと思ったらC言語のデバッグツールでしたね。
全然見た目違うけどSwiftはCベースの言語なんだなと感じました。
Xcodeメインウィンドウのパーツの名前の調べ方

仕事で使っているXcodeで、シミュレータを選択する箇所がなぜか消えてしまいました。
![xcode_main_window.png](https://qiita-image-store.s3.amazonaws.com/0/88743/b8909fec-354a-7e55-7c77-a58c03fc1281.png)

復活させるときに、画面のその部分をなんと呼ぶのかが分からず困りましたが、Appleのサイトでちゃんと説明されていました。
https://developer.apple.com/library/ios/recipes/xcode_help-general/Chapters/Recipe.html

正解は、ToolbarのScheme menu。

復活方法は、**ウインドを広げる！**
http://stackoverflow.com/questions/31318316/destination-toolbar-disappeared-on-xcode-6-4
kanonでgitを使う(3) - TrortiseGitでclone出来ない？

Ubuntu 12.04にkanon(Trac LightningのLinux版)をインストールし、そこにgitリポジトリを作成した。その際のメモ。

今回は、TrortiseGitからのcloneについて。

## TortoiseGitでclone出来ない?
kanonでgitリポジトリを作成した。
それをLinux上からはclone出来たが、WindowsPCにTortoiseGit+msysgit(=git fow windows)を入れてcloneを試みたら、認証エラーでclone出来なかった。
(URLとしては、"http://192.168.XX.XXX/git/GitTest" を指定)

調べてみると、msysgitのバージョン1.9.5にはBUG(?)があり、認証の際のrealm指定が空になっていた。(WireSharkでhttpパケットを解析)

## TortoiseGitでclone出来た
msysgitを2.7.2に更新。
URLとして"http://192.168.XX.XXX/git/GitTest" を指定して、clone出来た!

以上
UWP(Universal Windows Platform)についての情報のあるページ

UWPで作成するにあたって参照できるページをメモ。
***
- **"Hello, world" アプリを作成する (XAML)**
https://msdn.microsoft.com/library/windows/apps/dn765018.aspx

- **PDF 形式の UWP アプリの設計ガイダンス**
https://go.microsoft.com/fwlink/p/?LinkId=626098
上記は英語なのでこちらも

- **ユニバーサル Windows プラットフォーム (UWP) アプリのガイドライン**
https://msdn.microsoft.com/ja-jp/library/windows/apps/hh465424.aspx

- **Windows 10 アプリに関するハウツー ガイド**
 https://msdn.microsoft.com/ja-jp/library/windows/apps/xaml/mt244352.aspx

- **Universal Windows app samples(GitHub)**
https://github.com/Microsoft/Windows-universal-samples/archive/master.zip

- **Windows8の開発方法(XAML)**
https://msdn.microsoft.com/ja-jp/library/windows/apps/xaml/br229566.aspx
Windows8向けだけど情報が多いのでこれも

- **Windowsフォーム開発者のためのWindows 10 UWPアプリ開発入門（前編）**
http://www.atmarkit.co.jp/ait/articles/1509/29/news020.html

- **Visual Studio Community**
https://www.visualstudio.com/ja-jp/products/visual-studio-community-vs.aspx
これが一番大事かもしれない。
WebVR1.0の仕様を読んで変わったところと、ちょっと気になったこと

[WebVRの仕様が1.0となりました。](https://mozvr.github.io/webvr-spec/)

##旧スペックから変わったところ
1. VRHMDDeviceとVRPositionSensorDeviceが廃止され、VRDisplayという１つオブジェクトになった。
2. HMDに表示させるにはDOMのAPIであるrequestFullscreenを使用していたが、VRDisplayのrequestPresent()に変わった。
3. WebVR独自のrequestAnimationFrameの仕様が追加された。
4. Room Scale VRのサポートが追加された。(VRDisplay.VRStageParameters)
5. ~~gamepad APIにVRコントローラーのサポートが追加された？。~~(displayIdプロパティの追加のみですが)

大きいのが4.のRoom Scale VRのサポートでしょう。
つぎに、DOM API依存の排除。特にWebVR独自のrequestAnimationFrameの仕様が追加されたこと。
DOMのrequestAnimationFrameでは、(仕様には具体的な数字が見当たりませんでしたが)現在の主流のブラウザーにおいて最高でも1秒間に60回(60fps)のコールが限度となり、VRHMDデバイスでの表示に使用するには問題となっていました。
WebVR独自のrequestAnimationFrameは、VRHMDデバイスのスペックに合わせて1秒間に60回以上コールされるようです。

##ちょっと気になったこと
このWebVR1.0が実装されたChromeがすでにビルドされ[公開](https://drive.google.com/folderview?id=0BzudLt22BqGRbW9WTHMtOWMzNjQ&usp=sharing#list)されています。
~~早速ダウンロードしてちょっと試してみたのですが、DOMのrequestAnimationFrameが1秒間に私のマシンでは250回もコールされました。
たぶんバグだとは思いますが、ただ、DOMのrequestAnimationFrameを使用したWebアプリをこのChromeで実行すると少なからず影響が出ると思われます。~~
3/21に最新のビルドがアップされ、このDOMのrequestAnimationFrameのバグが修正されました。
kanonでgitを使う(2) - gitリポジトリの作成

Ubuntu 12.04にkanon(Trac LightningのLinux版)をインストールし、そこにgitリポジトリを作成した。その際のメモ。

今回は、gitリポジトリの作成について。

## gitリポジトリの作成

$ sudo /opt/kanon/bin/kanon-create-project
==> プロジェクト名："GitTest", リポジトリタイプとしてgitを指定
==> 途中に"注意: リポジトリのインデックスに失敗しました"というメッセージが出たが、たぶんOK

## httpでgit clone 出来ない???
上記の手順でgitリポジトリを作成したが、httpでgit clone出来なかった...
(どんなエラーだったかはメモしていなかった orz)

調べてみると、 /etc/apache2/sites-available/vcs の記述に誤り
(インストールした環境と違う)と思われる箇所があったので修正。
git-http-backendが存在するのは、/usr/libexec/git-core/配下ではなく、
/usr/lib/git-core/配下。

<変更前>
***
 38 # Gitの設定
 39 SetEnv GIT_PROJECT_ROOT /var/opt/kanon/git
 40 SetEnv GIT_HTTP_EXPORT_ALL
 41 ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/
***
<変更後>
***
 38 # Gitの設定
 39 SetEnv GIT_PROJECT_ROOT /var/opt/kanon/git
 40 SetEnv GIT_HTTP_EXPORT_ALL
 41 #ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/
 42 ScriptAlias /git/ /usr/lib/git-core/git-http-backend/
***

clone出来ない件と直接関係無いかも知れないが、git-coreもインストールした。
***
$ sudo apt-get install git-core
***
## httpでgit clone 出来た!
以下の様にして、httpを使ってgit cloneが出来ることを確認。
***
[xxx@localhost tmp]$ pwd
/tmp
[xxx@localhost tmp]$ git clone http://192.168.XX.XXX/git/GitTest
Cloning into GitTest...
warning: You appear to have cloned an empty repository.
[xxx@localhost tmp]$ ll GitTest
合計 256
drwxr-xr-x  3 xxx  xxx    4096  2月 27 20:17 ./
drwxrwxrwt 18 root root 249856  2月 27 20:17 ../
drwxr-xr-x  7 xxx  xxx    4096  2月 27 20:18 .git/
[xxx@localhost tmp]$
***

以上
MongoDBでレプリカセットのセカンダリに限定してアクセスするときのURL

ReplicaSetを組んでいて本番データで確認したいようなとき、特定のsecondaryメンバーにだけ接続したいときの URL をメモしておく。

```
mongodb://localhost:27017/?readPreference=secondary
```

上記が好ましい。
Node.js用mongodbライブラリのバージョン 2.0.46 では下記でもまだ動作した。

```
mongodb://localhost:27017/?slaveOk=true
```
pry-byebugでrubyをデバッグする

#pry-byebugとは
pryでデバッグするためのプラグイン
pry-debuggerの後継らしい
GitHub https://github.com/deivid-rodriguez/pry-byebug

#pryとは
irbのように対話的にrubyを実行するためのツール
irbに比べてドキュメントが見れたりシンタックスハイライトが効いたりする

#pry-byebugをインストールする
`gem install pry-byebug`


#pry-byebugを使う
デバッグしたいコードに`require 'pry'`を追加する
あとは、ブレークポイントをうちたい場所に`binding.pry`を書いて実行すればその箇所で処理が止まってくれてpryが起動します

```rb:sample.rb
#!/usr/bin/env ruby

require "thor"
require "pry"

x = 10
y = 20
z = 30

binding.pry # ここ
area = (x*y + y*z + z*x) * 2
volume = x * y * z
print "area: ", area, "\n"
print "volume: ", volume, "\n"
```

これを実行すればブレイクポイントを打ったとこで処理が止まる

```rb:
     6: x = 10
     7: y = 20
     8: z = 30
     9:
    10: binding.pry
=>  11: area = (xy + yz + zx)  2
    12: volume = x * y * z
    13: print "area: ", area, "\n"
    14: print "volume: ", volume, "\n"
```

#####変数の値を確認する
変数名を打てば変数には入っている値を確認できます

```irb
[1] pry(main)> area
=> 2200
```

#####pry-byebugで使えるコマンド
<dl>
 <dt>next</dt>
 <dd>次の行を実行</dd>
 <dt>step</dt>
 <dd>次の行かメソッド内に入る</dd>
 <dt>continue</dt>
 <dd>プログラムの実行をcontinueしてpryを終了</dd>
 <dt>finish</dt>
 <dd>現在のフレームが終わるまで実行</dd>
</dl>

#毎回nextなどを打つのが面倒くさいときは
`~/.pryrc`を作成しておくと楽です

```rb:.pryrc
if defined?(PryByebug)
  Pry.commands.alias_command 's', 'step'
  Pry.commands.alias_command 'n', 'next'
  Pry.commands.alias_command 'f', 'finish'
  Pry.commands.alias_command 'c', 'continue'
end
```
PowerShellでSHIFT-JIS to UTF-8 BOM

SHIFT-JISからUTF-8へ一括変換。
変換後はBOM付でした。

```
PS > Get-ChildItem ./ -Recurse -Include *.R | Rename-Item -NewName {$_.FullName + “.bkup”}| Rename-Item -NewName {$_.FullName + “.bkup”}
PS > Get-ChildItem ./ -Recurse -Include *.R.bkup | ForEach-Object {Get-Content $_.FullName | Out-File -Encoding UTF8 ($_.FullName -replace ‘.R.bkup’,’.R’)}
```

https://blogs.msdn.microsoft.com/jpvsblog/2015/08/03/visual-studio-2015-shift-jis/
kanonでgitを使う(1) - kanonのインストール

Ubuntu 12.04にkanon(Trac LightningのLinux版)をインストールし、そこにgitリポジトリを作成した。その際のメモ。

まずは、kanonのインストールについて。

## kanonインストールで参考にしたURL
### kanonとは
http://www.bytebucket.org/okamototk/kanonconductor
http://qiita.com/kaakaa_hoe/items/369f02a2c49db4bd80c4
### kanonのインストール方法
​http://www.bytebucket.org/okamototk/kanonconductor
​http://waddledoo.hatenablog.com/entry/20111216/1324065635
### kanonインストーラ
​http://www.bytebucket.org/okamototk/kanonconductor/get/a0a134e07b23.zip

## kanonインストール手順

$ cd /tmp/
$ wget https://www.bytebucket.org/okamototk/kanonconductor/get/a0a134e07b23.zip
$ unzip a0a134e07b23.zip
$ cd okamototk-kanonconductor-a0a134e07b23
$ sudo vi /tmp/okamototk-kanonconductor-a0a134e07b23/pluginlist  (注１)
$ sudo ./kanon-setup

(注1)
pluginlistを開いて編集。
 -------------------------------
 ...
 http://trac-hacks.org/svn/iniadminplugin/0.11
 http://trac-hacks.org/svn/xmlrpcplugin/trunk
 http://trac-hacks.org/svn/customfieldadminplugin/0.11
 http://trac-hacks.org/svn/tracdragdropplugin/0.12
 http://trac-hacks.org/svn/tracwysiwygplugin/0.12
 http://trac-hacks.org/svn/exceldownloadplugin/0.12
 http://trac-hacks.org/svn/tocmacro/0.11
 http://trac-hacks.org/svn/addcommentmacro/0.11
 ...
 -------------------------------
 ↓
 -------------------------------
 ...
 https://trac-hacks.org/svn/iniadminplugin/0.11
 https://trac-hacks.org/svn/xmlrpcplugin/trunk
 https://trac-hacks.org/svn/customfieldadminplugin/0.11
 https://trac-hacks.org/svn/tracdragdropplugin/0.12
 https://trac-hacks.org/svn/tracwysiwygplugin/0.12
 https://trac-hacks.org/svn/exceldownloadplugin/0.12
 https://trac-hacks.org/svn/tocmacro/0.11
 https://trac-hacks.org/svn/addcommentmacro/0.11
 ...
 -------------------------------

以上
Pentaho DIで指数表記を変換する

Pentaho DIで指数表記で書かれた文字列を数値として扱う方法を探してみた。
リソースとしては[Handling NUMBER format like 1e+006 ?](http://forums.pentaho.com/showthread.php?61836-Handling-NUMBER-format-like-1e-006&highlight=exponent) がある。この内容がほぼすべてで、基本的には文字列として取り込んで選択/名前変更でBigNumberに変換する。この方法で指数表記を数値化できた。
<link rel="preload">を使ってCSSを非同期で読み込む

```html
<link rel="preload" as="style" href="async_style.css" onload="this.rel='stylesheet'">
```

と記述すると、PreloadでCSSを取得して、読み込みが終わったらstylesheetを適用させるみたいな感じになる。Preloadはレンダリングをブロックしないので、非同期にCSSを読み込みつつ、読み込み終わったら適用させるみたいなことができる。シンプルでいい。

これは [Preload: What Is It Good For?](https://www.smashingmagazine.com/2016/02/preload-what-is-it-good-for/)
の [MARKUP-BASED ASYNC LOADER](https://www.smashingmagazine.com/2016/02/preload-what-is-it-good-for/#markup-based-async-loader)の箇所に書いてある話で、現在はChrome Canaryのみで対応されていて、問題なければ4月中頃にChromeで使えるようになるらしい。

Preloadについては、[仕様](https://w3c.github.io/preload/)には下記のように書いてある。
> The preload keyword on link elements provides a declarative fetch primitive that addresses the above use case of initiating an early fetch and separating fetching from resource execution. As such, preload keyword serves as a low-level primitive that enables applications to build custom resource loading and execution behaviors without hiding resources from the user agent and incurring delayed resource fetching penalties.

リソースを取得するタイミングは[仕様のProcessingの項目](https://w3c.github.io/preload/#processing)に詳細が記されているのですが、まあ、HTMLがパースしてpreloadのタグがDocumentに挿入されたタイミングとかで、読み込まれる。だからすぐ読み込まれるけど、リソースのexecutionはされない。HTMLのパースも止まらない。

[Preload: What Is It Good For?](https://www.smashingmagazine.com/2016/02/preload-what-is-it-good-for/)では、すでに存在しているprefetchやsubresourceとの違いについても触れられている。prefetchは次の画面で必要なリソースを「prefetch」するもの。subresourceとは現在の画面で使うリソースなんだけど、低いプライオリティでリソースを取得するので、subresourceを設定してもしなくても結局同じタイミングぐらいで取得されたりするらしい。その点、preloadはすぐにダウンロードがされていくので有用と。

あとHTTP/2 Pushの機能との比較も書かれていて、ひとつにはpreloadはloadのeventが発生するので、リソースがロードされたタイミングがわかると。あとブラウザのキャッシュとかとの相性もpreloadの方が良さそう。

Preloadの実装ではCSSの他にもいろんなリソースをPreloadすることができて、いろいろと便利に使えそうな気がする（たぶん）。

詳しくは[Preload: What Is It Good For?](https://www.smashingmagazine.com/2016/02/preload-what-is-it-good-for/)を。一読の価値はあると思います。
Runtime learning...


#####正在学习中...先记录今天的坑一枚。
**我准备在`NSMutableArray`的类别中，动态地替换`addObject:`方法。因为原先的方法，如果参数是nil，程序会崩溃。我想替换一个处理nil的方法。**
####我最初的代码为：
```Objective-C
#import "NSMutableArray+XXArray.h"
#import <objc/runtime.h>

@implementation NSMutableArray (XXArray)
- (void)newAddObject:(id)anObject{
    if (anObject == nil) {
        NSLog(@"虽然加入了空，但并不会崩溃。处理 nil");
        return;
    }
    [self newAddObject:anObject];
}

// 在内存被分配、初始化后就调用。
+ (void)load {
    Method _origin = class_getInstanceMethod([NSMutableArray class], @selector(addObject:));
    Method _modify = class_getInstanceMethod([NSMutableArray class], @selector(newAddObject:));
    method_exchangeImplementations(_origin, _modify);
}
@end
```

###这代码看起来并没有问题。但是当我运行时，始终没有替换掉原先的方法。太坑！！！！后面了解到`NSMutableArray`真正的类名字并不是NSMutableArray。而是`__NSArrayM`。好吧。我服了 OTZ.

####修改后的代码：
```Objective-C
#import "NSMutableArray+XXArray.h"
#import <objc/runtime.h>

@implementation NSMutableArray (XXArray)
- (void)newAddObject:(id)anObject{
    if (anObject == nil) {
        NSLog(@"虽然加入了空，但并不会崩溃。处理 nil");
        return;
    }
    [self newAddObject:anObject];
}

// 在内存被分配、初始化后就调用。
+ (void)load {
    Method _origin = class_getInstanceMethod(objc_getClass("__NSArrayM"), @selector(addObject:));
    Method _modify = class_getInstanceMethod(objc_getClass("__NSArrayM"), @selector(newAddObject:));
    method_exchangeImplementations(_origin, _modify);
}
@end
```

####代码测试。给NSMutableArray对象加入nil.
```Objective-C
#import <Foundation/Foundation.h>
#import "NSMutableArray+XXArray.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        
        NSMutableArray *arr = [NSMutableArray array];
        [arr addObject:@"Hello world"];
        
        // 这里虽然会报警告，但是并不会crash
        [arr addObject:nil];
        
        NSLog(@"%@", arr);
    }
    return 0;
}
```

####输出：
```
2016-03-03 19:18:37.739 runtime[41041:370141] 虽然加入了空，但并不会崩溃。处理 nil
2016-03-03 19:18:37.740 runtime[41041:370141] (
    "Hello world"
)
Program ended with exit code: 0
```


###PS.runtime非常的有研究性。我继续学习中...
Warning > Shfit count is too large < #define MAX_OS_U16 ( (1u << 16) - 1) @ 16bit マイコン > #define MAX_OS_U16 ( (1u << 15) + (1u << 15) - 1 )

```txt:動作確認
MSP430 (16bit)
```

```
#define MAX_OS_U16 ( (1u << 16) - 1 )
```

上記で定義したMAX_OS_U16を使おうとしたら以下の警告が出た。

> Warning[XXX]: shift count is too large

16bitのOSなので16ビット左シフトしているのがまずいとのことのようだ。

## 思いつき

```
#define MAX_OS_U16 ( (1u << 15) + (1u << 15) - 1 )
```

4ビットを上限とした例でデバッグ
http://ideone.com/BhkdtK

```
#include <iostream>
using namespace std;
 
#define MAX_OS_U4_TYPE_A ( (1u << 4) - 1)
#define MAX_OS_U4_TYPE_B ( (1u << 3) + (1u << 3) - 1)
 
int main() {
 
	cout << MAX_OS_U4_TYPE_A << endl;
	cout << MAX_OS_U4_TYPE_B << endl;
	return 0;
}
```

```txt:結果
15
15
```

いけそう。

いけた。警告が16なくなった。
phpのcliからcurlでファイルアップロード

## 参考

* [cURLでGET/POST送信する方法(PHP) | 合同会社スマート](https://www.smartllc.jp/blog/20150810-how-to-post-in-php/)
* [PHPでcURLのクソ仕様 "@" を回避する - Qiita](http://qiita.com/mpyw/items/c2d2f9cf67072e926721#2-3)


## 準備

```bash:
apt-get install -y php5-curl
```

## ファイルアップロード

送信側(ubuntu14.04のphp5.5.9で確認)

```php
$ch = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL         => 'http://myserver/upload.php',
    CURLOPT_POST        => true,
    CURLOPT_POSTFIELDS  => [
        'userfile[]' => new CURLFile('./a.txt'),
    ],
]);
curl_exec($ch);
```

受け側

```php
$uploaddir = '/tmp/';

$file = $_FILES['userfile'];
$uploadfile = $uploaddir . basename($file['name'][0]);

if (move_uploaded_file($file['tmp_name'][0], $uploadfile)) {
    echo "upload successfully.\n";
} else {
    echo "upload failed!\n";
}
```

* `/tmp/a.txt` が生成されていれば成功。

## GET

```php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://myserver/get.php?a=1&c=2');
curl_exec($ch);
curl_close($ch);
```

## POST(古い書き方)

```php
$data = array(
        'test1' => 'aaa',
        'test2' => 'bbb'
);

$ch = curl_init();
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, 'https://myserver/post.php');
$result = curl_exec($ch);
echo 'RETURN:'.$result;
curl_close($ch);
```
超初心者が始めるDocker入門？1


Dockerってあれでしょ？なんかスゴイやつ。
レベルの理解だった私がとりあえず本を一冊読み進めつつ其の成果をアウトプットしていく感じで。

<a href="http://www.amazon.co.jp/gp/product/B010N105SC/ref=as_li_ss_il?ie=UTF8&camp=247&creative=7399&creativeASIN=B010N105SC&linkCode=as2&tag=isaid-22"><img border="0" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=B010N105SC&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=isaid-22" ></a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=isaid-22&l=as2&o=9&a=B010N105SC" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

こんなクジラの本を購入。購入判断は薄かったから。

# Dockerとは？

## 開発環境では動く、本番環境では動かない

+ 割とよくある現象
 - gemが足りてない
 - apt-get忘れてる
+ 1台ならまだしも、複数台だと面倒
+ [vagrant](https://www.vagrantup.com)を使ってVMを作る
+ Dockerという別のアプローチ

### 完全仮想化のデメリット

+ 起動が遅い
+ メモリ、HDDの消費が大きい

完全仮想のVM自体は悪く無いけれど、手軽さが足りない

### Docker = **手軽な**仮想化

+ ホストのカーネル流用
 - 起動が早い
 - メモリ、HDDの消費が小さい
+ カーネルが違うVMは動かせない

動かしたいアプリケーションだけを含んだimageを使えば、**手軽に**そのアプリケーションを試せる。キーワードは**手軽さ**。簡単に作れてすぐ消せる。


# Dockerエキスパート養育読本

+ 名前にエキスパートとあるけど入門書
+ サブタイトルがゼロから始めるDocker入門だし

他にもまだ読んでないけど

+ <a  href="http://www.amazon.co.jp/gp/product/B015IZT854/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B015IZT854&linkCode=as2&tag=isaid-22">Docker実践入門――Linuxコンテナ技術の基礎から応用まで</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=isaid-22&l=as2&o=9&a=B015IZT854" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
+ <a  href="http://www.amazon.co.jp/gp/product/B0191B5FE4/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B0191B5FE4&linkCode=as2&tag=isaid-22">Docker実践ガイド</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=isaid-22&l=as2&o=9&a=B0191B5FE4" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

がよさ気。特にDocker実践ガイドの方は2015/12にでたばかりっぽくてGood。


## いきなり Boot2Dockerはdeprecated

古い本(それでも2014年)を買うとこういうことがしばしばおきます。薄さで選ばないほうがいいですね。

+ Boot2Dockerはdeprecated
+ 代わりに docker-machine を使えとのこと

```Bash:
brew cask install docker-machine
```

## docker-machine はホストカーネル選択

+ Boot2Docker はlocalhostに linux VMを立ててそれを選択していた
+ docker-machine はAWSとか他の選択肢もある

MacとかWindowsでBoot2Dockerをインストールするよう書かれているのはLinuxカーネルではないため。Dockerを動かすための最小構成Linuxをvirtualboxで用意してやらないと、これらのOSではそのままではDockerは使えない。

```Bash:
docker-machine create --driver virtualbox default 
```

ホストとして--driver virtualbox、それに名前defaultをつける

## docker pull, create, start

+ [Docker Hub](https://hub.docker.com)に登録されてるimageをpullして保存
+ このimageをもとにコンテナを作る

```Bash:
docker pull hello-world:latest  
docker create --name hello hello-world 
docker start -i hello
```

+ docker create --name *name* *image_name* でコンテナに名前 *name* をイメージ *image_name* から作る
+ docker start *name* で実行 -i でSTDINへ
+ いらないコンテナはdocker rm
+ いらないイメージはdocker rmi


基本操作はこれくらいかな。もう少し読み込んで気分が向いたらその２書きます。
Angular 入力フォームのデータをサーバーに送信する




データを送信する部分


View側（HTML）
```html
<input type="button" value="Save" class="btn btn-default" ng-click="save()" />
```

コントローラー（JS Angular）
```js
$scope.save = function () {
	$http.post('/Api/HogeController/', $scope.data)
	.then(function (response) { $location.path("home"); });
}
```

サーバー側
```csharp

[ResponseType(typeof(HogeDTO))]
public async Task<IHttpActionResult> Post(Hoge model)
{
    if (!ModelState.IsValid)
    {
        return BadRequest(ModelState);
    }

    db.Hoges.Add(model);

    try
    {
        await db.SaveChangesAsync();
    }
    catch (DbUpdateException)
    {
        if (HogesExists(model.ID))
        {
            return Conflict();
        }
        else
        {
            throw;
        }
    }
    var ret = await db.Hoges.Select(HogeItemDTO.SELECT).FirstOrDefaultAsync(x => x.ID == model.ID);
    return CreatedAtRoute("DefaultApi", new { id = model.ID }, model);
}
```
Angular ボタン押下時に確認アラート(confirm)を表示する。



##JS側

ngConfirmClickディレクティブを作成する

```js

var app = angular.module('app', []);

app.directive('ngConfirmClick', [
    function(){
        return {
            priority: 1,
            terminal: true,
            link: function (scope, element, attr) {
                var msg = attr.ngConfirmClick || "Are you sure?";
                var clickAction = attr.ngClick;
                element.bind('click',function (event) {
                    if ( window.confirm(msg) ) {
                        scope.$eval(clickAction)
                    }
                });
            }
        };
}])
```



##HTML側

```html
<button ng-click="sayHi()" ng-confirm-click="Would you like to say hi?">Say hi to {{ name }}</button>
```
Windows10のノートPCで内蔵キーボードは日本語、外付けキーボードは英語配列で使い分ける

## 手順
1. レジストリエディターを開く
2. `LayerDriver JPN`を`kbd101.dll`に変更する
3. 再起動する

## 注意
`OverrideKeyboardSubtype`を変更すると内蔵キーボードの配列も英字になってしまうため、変更しないように。
Implementing functional languages を頑張って読む.10日目

# 10日目

## 2.2
_state transition system_,状態遷移系を使ってグラフ簡約をする.
ステートマシンの説明ばっか.

## 2.3
template instantiation graph reduction machine の初期状態は _(stack, dump, heap, globals)_
_stack_は_addresses_用で,それぞれのアドレスはヒープにある_node_を指す.
それらのノードは評価されなければならない式である.
_a1:s_という表記はスタックトップはa1,残りはs,という意味.
dumpはMark1では使わないけど後で使う
_heap_はnodeを格納している.
_h[a : node]_という表記はヒープhのアドレスaはノードnodeを参照していることを表す.
_global_はscを表しているheap nodeのアドレスが入る

heap nodeは以下のようになる
__NAp__ _a1_ _a2_ はa2をa1に適用,
__NSupercomb__ _args_ _body_ はsupercombinator
__NNum__ _n_ は数字
NScじゃダメだったのだろうか

わからん
> the global mapping of names to heap addresses, f , augmented by the mapping of argument
> names to their addresses obtained from the stack.

(2.1),(2.2)で簡約できるらしい.本当か?

**時間がなくてあまり読めなかった.2.3.1までしか読んでない**
mongodbをWindowsで試してみる

# MongoDBをWindows環境で動かす

試す機会があったので実験

##前提
EC2上で動かすのでFirewallは停止
使用OSはWindows2012 R2
下記3台でのレプリカセットを作成

- mongodb01 Primary用
- mongodb02 Secondary用
- mongodb03 Arbiter用(たやすいことではない)

## 設定
###全サーバで実施
本体のダウンロード
インストール(指示通りに進めてCompleteを指定する)

インストール後確認を行う
バージョンを確認できればOK

```
cd C:\Program Files\MongoDB\2.6\Standard\bin
mongo.exe --version
```

C:\mongodb配下に下記の様にフォルダとcfgファイルを作る

```
C:\mongodb\db
          \log
          \mongodb.cfg
```

##コンフィグファイルを作成
mongodb.cfgを編集

```
systemLog:
   destination: file
   path: "C:/mongodb/log/mongod.log"
   logAppend: true
storage:
   dbPath: "C:/mongodb/db"
   journal:
      enabled: true
net:
   bindIp: 0.0.0.0
   port: 27017
replication:
   replSetName: レプリカ名
```    

MongoDBをサービスとして登録する

```
sc.exe create MongoDB binPath= "C:\Program Files\MongoDB\Server\3.2\bin\mongod.exe --service --config=\"C:\mongodb\mongod.cfg\"" DisplayName= "MongoDB" start= "auto"
```
MongoDBのサービスを起動する

## サーバ間の疎通確認
各ノード間でホストネームでの通信が出来るように設定する(AdなりHostsなり)
SecurityGroupも開けておくこと(27017)

## サーバ別の設定
Primaryとなるサーバにて実施
※全サーバでmongodbを起動してから実施

C:\Program Files\MongoDB\Server\3.2\bin配下にあるmongo.exeを実行
MongoDB shellが起動したことを確認
下記コマンドを実行

```
rs.initiate()
rs.add("mongodb02:27017")
rs.addArb("mongodb03:27017")
cfg = rs.conf()
cfg.members[0].priority = 100
cfg.members[1].priority = 50
cfg.members[2].priority = 50
rs.reconfig(cfg)

登録後設定を確認
rs.status()
```

各サーバの"stateStr"が正しく設定されていることを確認(PRIMARY,SECONDARY,ARBITER)

## データの登録テスト

- Primaryにて実施

```
windows:PRIMARY> show dbs
local    0.000GB
windows  0.000GB
windows:PRIMARY> use windows
switched to db windows
windows:PRIMARY> u = { name : "hoge" }
{ "name" : "hoge" }
windows:PRIMARY> db.Data.insert(u)
WriteResult({ "nInserted" : 1 })
```

- Secondaryにて実施

```
windows:SECONDARY> rs.slaveOk()
windows:SECONDARY> show dbs
local    0.000GB
windows  0.000GB
windows:SECONDARY> use windows
switched to db windows
windows:SECONDARY> show collections
Data
windows:SECONDARY> db.Data.find()
{ "_id" : ObjectId("56d8047c85878fc63cbf8f85"), "name" : "hoge" }
windows:SECONDARY>
```


## 調査とかトラブルシュート用メモ
- 構成確認
現在のマスターやホスト情報が見れる
ここで使用しているレプリカ名等見れる
`db.isMaster()` や `rs.status()`

- config のリセット
リセット前にはバックアップ等を取得すること
`rs.reconfig(cfg, {force : true})`

- bin配下のもの

|役割|バイナリ名|
|----|----|
|サーバ|mongodb.exe|
|クライアント|mongo.exe|
|モニタリングツール|mongostat.exe, mongotop.exe|
|バックアップ|mongodump.exe,mongorestore.exe,mongoexport.exe|
|インポート|mongoimport.exe|

```
>mongodump.exe -d windows
2016-03-03T10:09:09.827+0000    writing windows.Data to
2016-03-03T10:09:09.831+0000    done dumping windows.Data (2 documents)
```
mongodumpで出力するとBSONというmongo用の形式でdumpされる、直接編集が出来ない
JSON形式で出す場合はmongoexportを利用してJSONで出力する


##参考にしたサイト:
[Install MongoDB on Windows¶](https://docs.mongodb.org/v3.0/tutorial/install-mongodb-on-windows/)
[Tutorial: Install MongoDB on Windows with replication.](https://www.ulyaoth.net/resources/tutorial-install-mongodb-on-windows-with-replication.47/)

##感想
インストールが思った以上に簡単だったので驚きだった。
Arbiterって名前を聞く度にエリートのあの人の声が再生される。
Nagios のコマンド定義で任意のコマンドが実行できるようにしてしまう

Nagios で監視項目を追加するとき、次のようなコマンドの定義と、

```
define command{
    command_name    check_ping
    command_line    $USER1$/check_ping -H $HOSTADDRESS$ -w $ARG1$ -c $ARG2$ -p 5
}
```

次のようなサービスの定義が必要。

```
define service{
    use                     hoge-service-template
    service_description     PING
    check_command           check_ping!3000.0,80%!5000.0,100%
    servicegroups           hoge-servicegroup-ping
    hostgroup_name          hoge-hostgroup-real
}
```

サービスで `check_command` を指定するときは、コマンドの定義がどのようになっているかを意識する必要がある（`ARG1` が何で `ARG2` が何なのかを）。

これが超うざいので、コマンド定義は基本的に `ARG1` だけでホストアドレスを除くすべての引数を指定するようにしたい。

```
define command{
    command_name    check_ping
    command_line    $USER1$/check_ping -H $HOSTADDRESS$ $ARG1$
}
```

Nagios エージェント（nrpe）を使う場合、監視対象ホストの nrpe では次のようにコマンド定義しておいて、

```
command[check_load]=/usr/lib64/nagios/plugins/check_load $ARG1$
```

監視サーバで次のようにコマンドとサービスを定義する。

```
define command{
    command_name    check_nrpe
    command_line    $USER1$/check_nrpe -c $ARG1$ -a '$ARG2$'
}

define service {
    use                     generic-service
    host_name               ore-no-server
    service_description     load
    check_command           check_nrpe!check_load!-w 3 -c 6
}
```

## 任意のコマンドを実行できるようにしてしまう

あるいは nrpe のコマンド定義をこんな感じにしてしまって、

```
command[check_exec]=/usr/bin/env PATH=/usr/lib64/nagios/plugins:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin $ARG1$
```

監視サーバでこんな感じに設定してしまってはどうか。

```
define command{
    command_name    check_nrpe_exec
    command_line    /usr/lib64/nagios/plugins/check_nrpe -H $HOSTADDRESS$ -c check_exec -a '$ARG1$'
}

define service {
    use                     generic-service
    host_name               sv01
    service_description     load2
    check_command           check_nrpe_exec!check_load -w 3 -c 6
}
```

これなら対象ホストでプラグインのコマンド定義を個別にしておかなくても、任意のプラグインで監視することができる（もちろんプラグインをインストールしておく必要はある）。

**監視サーバは対象ホストで任意のコマンドを実行することができる**ということになってしまうけど、Sensu だって同じだと思うし、特に問題ではないだろう。