OmniAICreator/Qiita-1.07M huggingface dataset:
SublimeText2でC++を実行する時のビルド設定（Mac）

SublimeText2でC++を実行する時のビルド設定
====

動作確認済みのビルド設定を下記にメモしておきます。

## 環境

- Mac (OSX Yosemite)
- SublimeText2

```json:C++_make.sublime-build
{
	"cmd": ["make"],
	"working_dir": "${file_path}",
	"selector": "source.cpp",
	"variants":
	[
		{
		"name": "Run",
		"cmd": ["make", "run"]
		}
	]
}

```

## Makefileの例

```Makefile:Makefile
main: test.o test2.o
	g++ -Wall test.o test2.o -o main

test.o: test.c
	g++ -c test.c

test2.o: test2.c
	g++ -c test2.c

run: ./main
	./main
```
c++ builder XE4, 10.2 Tokyo > __historyの作成をやめる > [ツール] -> [オプション] -> [エディタ設定] > 「バックアップファイルの作成(C)」のチェックをはずす

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/26)
```

.gitなどでソースコード管理をしていると、`__history`をもつ意味がないような気がする。
また、`__history`が関係するのかわからないが、XE4の挙動がおかしい時に`__history`を消すと正常になる時がある。

以上の理由から、`__history`書き出し機能を使わないという方法を調べた。

http://stackoverflow.com/questions/836877/delphi-2007-how-to-avoid-having-a-history-folder

> Tools \ Options \ Editor Options \
> Uncheck "Create Backup Files"

[ツール] -> [オプション] -> [エディタ設定]
において左側中段にある「バックアップファイルの作成(C)」のチェックを外したら`__history`を出力しなくなった。

### 検索用キーワード

- 履歴
YubiKey Edge で ２段階認証 ～ WordPress編


# 概要
YubiKeyは、USBポートに差し込んで認証を行えるハードウェアセキュリティキーです。
通常WordPressへログインする際はユーザー名とパスワードを利用しますが、加えてYubikeyのOTPを使って認証するようにします。
OTPを利用するため、YubiKeyはEdge以上の製品が必要になります。

WordPressのバージョンは 4.3.1–ja です。

YubiKeyを使うかどうかはユーザー毎に設定できます。
設定ミスなどでログインできなくなってしまった場合に備えて、複数の管理ユーザーを登録してから設定を行った方が無難でしょう。

# WordPress yubikey-plugin のインストール

WordPress の管理画面から、プラグイン「yubikey-plugin」をインストールします。

![wp001.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/2312413a-2051-e2d8-feb0-851c0a630d14.png)

# WordPress yubikey-plugin の設定

https://upgrade.yubico.com/getapikey/ へアクセスし、設定に必要なClient IDとSecret Keyを取得します。

![wp002.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/335999a0-0bfa-08b7-232b-193cb8b29457.png)

「Your e-mail address」にはメールアドレスを入力します。
「YubiKey one-time password」にはYubiKeyのOTPを使って入力します。YubiKeyのSlot 1にOTPが設定されている場合（YubiKeyの初期設定）、カーソルがテキストボックスにある状態でYubiKeyとタップすると自動的にパスワードが入力されます。

![wp003.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/a7a01ed2-5ae3-c035-5223-5de4fb9aad91.png)

Client IDとSecret Keyが発行されました。

WordPressに戻り、設定のYubikeyを開きます。

先ほど取得したClient ID をYubiko API IDに、Secret Key を Yubico API key に入力して Save Changes を押します。

![wp004.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/f21a4767-9de2-94f3-455f-7b26eeda91e6.png)

続いて、YubiKeyによる２段階認証を設定するWordPressユーザのプロフィールを編集します。

ユーザプロフィールを開くと Yubikey settings の項目が追加されています。

ユーザー毎にYubiKeyを使った認証を有効にするか設定できます。

Yubikey authentication で Use Yubico server を選択し、Key ID 1 にカーソルがある状態でYubiKeyをタップします。
成功すると自動的に設定が保存されます。

Key ID 2 とKey ID 3 は複数のキーを登録したい場合に利用します。

ここまでで設定は完了です。

![wp004a.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/0bcf19ab-3a4f-a8f3-5082-4f9dfc92fd5a.png)

# 動作確認

WordPress 管理画面からログアウトしてみましょう。

すると、ユーザー名とパスワードの下に、Yubikey OTP が表示されます。

![wp005.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/7f818e80-e66b-8e22-7a02-c0045a7233de.png)

ユーザー名とパスワードを入力し、Yubikey OTPにカーソルがある状態でYubikeyをタップするとログインすることができます。

Yubikey OTPの入力欄がカラだったり、内容が間違っていたりすると認証エラーになります。

![wp006.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/0b60ae4c-d0c6-4b19-67b8-eed77f9aa2bd.png)

また、YubiKey を有効にしていないユーザーは、Yubikey OTPを入力せずユーザー名とパスワードのみで認証できます。
fragmentのパラメーター


###fragment（パラメーター付き）生成


```
public static HogeFragment createInstance(String hoge)
HogeFragment fragment = new Hogeframent;
Bundle args = new Bundle();
bundle.putString("key",hoge);
fragment.setArgument(bundle);
return  fragment

```

###パラメーター取得

パラメーターの取得はonCreateメソッドなどでgetArgumentメソッドを使用して取得するといいらしいので

```
@Override
public void onCreate(Bundle savedInstanceState) {
	super.onCreate(saveInstanceState)
	
	Bundle bundle = getArguments();
	
	String type = bundle.getString("key")

}

```





##参考

[Y.A.M の 雑記帳](http://y-anz-m.blogspot.jp/2012/04/androidfragment-setarguments.html)
fragment使う方法　軽くメモ


##xmlで書く。(静的なFragment)

簡単な使い方。

```xml
<FrameLayout
.
.
.

<fragment
	android:layout_width="wrap_content"
	android:layout_width="wrap_content" />
</FrameLayout>

```


##javaで書く

javaで書く場合は
FragmentManeger を用いる。

###FragmentTransaction

fragmentManegerからFragmentTransactionを取得して、
FragmentTransactionを使って、Fragmentの追加や置き換えをします。

一連のFragment処理をトランザクションにとして一つにまとめ、
commitして保存します。




###fragmentManeger
fragmentを使うためにはこいつを通さないとダメっていうもの。

###配置までの手順

どのレイアウトに追加するのかを記述

``` 
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.hoge);
```

イスンタンス生成して(fragmentは用意しておく。)

```
   fragment = new　FragmentSample();
```
トランザクションを生成、

```
 FragmentTransaction fragmentTransaction =
getSupportFragmentManager().beginTransaction();
```
実行したいトランザクションを記述して、保存

``` 
fragmentTransaction.add(R.id.contents,fragment);
            fragmentTransaction.commit();
```

##動的に

違うfragmentに切り替えたい場合、
今いるfragmentに新しいfragmentを生成するコードを記述する。

まず
インスタンスして

```
Fragment fragment = new FragmentSample2();
```

トランザクションを開始して、

```
FragmentTransaction fragmentTransaction =
                    getSupportFragmentManager().beginTransaction();
```

すでにあるfragmentを置き換える処理

```
fragmentTransaction.replace(R.id.contents,fragment);
```

トランザクションを保存

```
fragmentTransaction.commit();
```








##参考

[Android　Fragment を使う](http://y-anz-m.blogspot.jp/2011/05/androidfragment_19.html)

[Android　FragmentTransaction のまとめ](http://y-anz-m.blogspot.jp/2012/03/androidfragmenttransaction_14.html)
El capitanにアップデートしてCPU使用率がやばくなった時の対応法

YosemiteからEl Capitanにアップデートしたら、CPU使用率が100%で張り付くようになった。

下記は、それに対応した際のメモ書きです。

## まずやるべきこと
`キーチェーンアクセス.app` を開いて、怪しげな証明書を更新する
下記のサイトを参照。
http://f-shin.net/fsgarage/3818

## `キーチェーンアクセス.app`が起動しなくなったら

* 下記のコマンドで `Keychains`ファイルを一旦なくす。

  ```
cd ~/Library
mv Keychains Keychains.org
```
こうすることで、アプリが起動するようになる。
（しかし、これを行うと、これまで保存しておいたパスワードを再度入力しないといけなくなリます）

* 次に、証明書を削除する
ベリサイン系の証明書が怪しかったが、沢山ある証明書の精査や更新がめんどくさかったので、全部バックアップを取ってから削除。
（※バックアップはコンテキストメニューから普通にできます)


---
ちなみに、下記、当方のマシン環境。

```
MacBook Pro (Retina, Mid 2012)
2.3 GHz Intel Core i7
```
ディレクトリのコピー（配下すべて、ファイルは0バイト）

#どんな時に便利か
ファイルの中身は関係ない、ファイル抽出のbatのテストをしたい。
ディレクトリをコピッてテストしたいが、ファイルの容量が大きいのでコピーしたくない。
そんなときにご利用ください。

#嗚呼、robocopy
以下を実行
```
robocopy <source_dir> <dest_dir> /E /CREATE
```
/Eスイッチはサブディレクトリ（ファイルを有しないディレクトリを含む）
ファイルを有しないディレクトリはコピーしない場合は /Sスイッチに
/CREATE オプションは0バイトのファイルを生成するオプション
robocopyは中断時の挙動も含め多くのオプションがあり、非常に便利です。

#備忘録
サブディレクトリ含む
特定の名前のファイル
※一部のディレクトリは除く
をコピーするには

```bat
robocopy <source_dir> <dest_dir> FILE_NAME.EXT /S /XD EX1 EX2 
```
cowsayの全てのフォーマットを試すワンライナー

記念に残しておく (何の記念かわからないけど...)
perlとcowsayが必要です


```
for cmd in `cowsay -l | perl -nle '$i++;if($i>1){foreach my $cmd (split (/ /, $_ )) {print "$cmd";}}'`; do cowsay -f $cmd "全てのcowsayを表示"; done
```
El Capitan からの font-family の指定方法

El Capitan から ヒラギノ角ゴシックが、ヒラギノ角ゴに変更となり、フォントのウェイトがW0-W9まで収録されています。

## Yosemite までの font-family

```
font-family: "ヒラギノ角ゴ ProN W3", "Hiragino Kaku Gothic ProN", Meryo, "メイリオ", Osaka, "ＭＳ Ｐゴシック", "MS P Gothic", sans-serif;
font-weight: 300;
```

この設定をしていたのですが、

## El Capitan からの font-family

El Capitanからは、以下の指定をするとヒラギノ角ゴを使うことができます。
`font-weight`を使った細かいウェイトの指定をすることができるようになりました。
W0 - W9 まで使えるので、細字から太字まで使うことができます。

```
font-family: "Hiragino Sans", "ヒラギノ角ゴ ProN W3", "Hiragino Kaku Gothic ProN", Meryo, "メイリオ", Osaka, "ＭＳ Ｐゴシック", "MS P Gothic", sans-serif;
font-weight: 300;
```

## ヒラギノ角ゴシック W1/W2 を Yosemite でも使いたい場合
実は、YosemiteからはヒラギノのW1/W2については隠しフォントとして収録されています。

```
font-family: "HiraginoSans-W1", ".HiraKakuInterface-W1";
font-family: "HiraginoSans-W2", ".HiraKakuInterface-W2";
```

という指定をしてあげると、El CapitanでもYosemiteでも多少フォントの形が異なりますが、使うことができます。

## sample

![スクリーンショット 2015-10-08 11.45.52.png](https://qiita-image-store.s3.amazonaws.com/0/18326/cc89ae6d-a3d4-0821-5afc-8123053235a7.png)

<iframe height='268' scrolling='no' src='//codepen.io/puzzeljp/embed/vNxWeG/?height=268&theme-id=11101&default-tab=result' frameborder='no' allowtransparency='true' allowfullscreen='true' style='width: 100%;'>See the Pen <a href='http://codepen.io/puzzeljp/pen/vNxWeG/'>vNxWeG</a> by hiroaki wakatsuki (<a href='http://codepen.io/puzzeljp'>@puzzeljp</a>) on <a href='http://codepen.io'>CodePen</a>.
</iframe>
JavaScriptで非同期無限ループ

# 非同期無限ループ色々

```js
FRAME_PER_SEC = 60; // [frames/s]
FRAME_TIME    = 16; // [ms/frame]
```

## `setInterval` (Browser, Node)

```js
setInterval(function() {
  console.log(Date.now());
}, FRAME_TIME);
```

0の指定は可能ですが、少なくとも4msは間隔が空くようです。また、この最小間隔はランタイム依存なので、0にはしないほうが良いでしょう。

https://html.spec.whatwg.org/multipage/webappapis.html#timers

## `setTimeout` (Browser, Node)

```js
(function loop() {
  setTimeout(loop, FRAME_TIME);
  console.log(Date.now());
})();
```

`setInterval`と所感は同じ。

## `requestAnimationFrame` (Browser)

```js
var timer = Date.now();
(function loop() {
  var now = Date.now();
  if (now - timer > FRAME_TIME) {
    console.log(now);
    timer = now;
  }
  requestAnimationFrame(loop);
})();
```

フォアグラウンドのタブで60FPSで実行されるということになっています。

https://developer.mozilla.org/ja/docs/Web/API/Window/requestAnimationFrame

## `process.nextTick` (Node)

```js
var timer = Date.now();
(function loop() {
  var now = Date.now();
  if (now - timer > FRAME_TIME) {
    console.log(now);
    timer = now;
  }
  process.nextTick(loop);
})();
```

## `setImmediate` (Browser, Node)

```js
var timer = Date.now();
(function loop() {
  var now = Date.now();
  if (now - timer > FRAME_TIME) {
    console.log(now);
    timer = now;
  }
  setImmediate(loop);
})();
```

## `Promise` (Browser, Node)

```js
Promise.resolve(0).then(function loop() {
  var now = Date.now();
  return new Promise(function(resolve) {
    if (now - timer > FRAME_TIME) {
      console.log(now);
      timer = now;
    }
    resolve();
  }).then(loop);
});
```

へ～という感じですが、ぱっと見普通じゃないですし、メモリも食い潰します。

# どれを使うべきなのか

## Browser
    
* 使えるなら`requestAnimationFrame`
    * タブがbackgroundの時にCPUを食い潰さない。
* と見せかけて、もはや`setTimeout`でもいいんじゃねという話もある様子
    * http://0-9.sakura.ne.jp/pub/lt/modest/start.html
* `setInterval`は良く分からない。
    * ループ止めるのに戻り値の管理が必要なのがAPIとして使いづらいと感じているので、個人的にはほぼ使わない
* `setImmediate`は今のところIEでしかサポートされていないようなのでスルー。

## Node

まずは以下を読むべし。
http://jxck.hatenablog.com/entry/for-with-eventloop

* I/Oイベントの前が良いなら`process.nextTick`
* I/Oイベントの後が良いなら`setImmediate`
* delayを指定したいなら`setTimeout`でも良いと思う。
    * `setTimeout(, 0)`な用途なら`setImmediate`のほうが適切（体感はほぼ変わらないとは思いますが...）

ちなみにプログラムはイベントが無くなった時点で終了します。

```js
var prime = 997;
(function loop() {
  var now = Date.now();
  if (now % prime) {
    process.nextTick(loop);
  } else {
    console.log(now + " = " + prime + " * " + (now / prime));
  }
})();

// 以下を入れれば当然即終了
//process.exit(); 
```
jQueryとPHPでJSONデータをやり取りする


jQueryとPHPでJSONデータを扱う時に使う関数はこちらです。

|種類| エンコード | デコード |
|:----|:----|:----|
|jQuery|JSON.stringify|JSON.parse|
|PHP|json_encode|json_decode|

jQueryから非同期にサーバーにJSONデータを送信し、
PHPで処理した後、JSONデータを返す場合は、このような処理になります。

```test.js:jQuery側の処理
$(function() {
	$('#btn').click(function() {
		var testdata = new Object();
		testdata.num = 1;
		testdata.str = 'str';
		testdata.b1 = true;
		testdata.b2 = false;
		testdata.obj = new Object();
		testdata.obj.name = 'obj';
		testdata.ar1 = [ 1, 2, 3 ];
		testdata.ar2 = { name: 'obj1', age: 10 };
		testdata.ar3 = [ { name: 'obj1', age: 10 }, { name: 'obj2', age: 20 }, { name: 'obj3', age: 30 } ];
		var data = JSON.stringify(testdata);
		$.post('index.php', {
			data: data
		}, function(rs) {
			if (rs.contents !== null) {
				$('#contents').html(rs.contents);
			}
		});
	});
});
```

```test.php:PHP側の処理
<?php
$html_contents = '';

// testdata.
if (isset($_POST['data'])) {
	$testdata = json_decode($_POST['data']);
	$html_contents .= '<p>num='.$testdata->num.'</p>';
	$html_contents .= '<p>str='.$testdata->str.'</p>';
	$html_contents .= '<p>b1='.($testdata->b1 ? 'true' : 'false').'</p>';
	$html_contents .= '<p>b2='.($testdata->b2 ? 'true' : 'false').'</p>';
	$html_contents .= '<p>obj.name='.$testdata->obj->name.'</p>';
	$html_contents .= '<p>ar1:';
	foreach ($testdata->ar1 as $n) {
		$html_contents .= $n.', ';
	}
	$html_contents .= '</p>';
	$html_contents .= '<p>ar2:';
	foreach ($testdata->ar2 as $k => $v) {
		$html_contents .= $k.' => '.$v.', ';
	}
	$html_contents .= '</p>';
	$html_contents .= '<p>ar3:';
	foreach ($testdata->ar3 as $a) {
		foreach ($a as $k => $v) {
			$html_contents .= $k.' => '.$v.', ';
		}
	}
	$html_contents .= '</p>';
}

$rs = array(
	"contents" => $html_contents,
);

header('Content-Type: application/json; charset=utf-8');
echo json_encode($rs);
```

```txt:結果
num=1

str=str

b1=true

b2=false

obj.name=obj

ar1:1, 2, 3,

ar2:name => obj1, age => 10,

ar3:name => obj1, age => 10, name => obj2, age => 20, name => obj3, age => 30,
```
【WordPress】ページスラッグからパーマリンクを取得する



```php:php
<?php
$page = get_page_by_path( 'スラッグ' );
$permalink = get_permalink( $page->ID );
?>
<a href="<?php echo $permalink; ?>">
```

コレでできた。

```php:php
<a href="<?php echo get_permalink( get_page_by_path( 'スラッグ' )->ID ); ?>">
```

一行でもできる。
[Swift] 画像の特定のピクセルの色を調べる

# 概要
* 画像の特定のピクセルの色を調べる(クリックした場所のピクセル色とか)

# ポイント 
* CFDataGetBytePtrの戻り値がUnsafePointerで、中身がバイナリデータ(?)なので取得したいピクセルのデータが入っている場所を計算してアクセスする
* 1pixel分のデータは4Byteで、1ByteずつR,G,B,Aの色情報になっている
* Retinaの考慮が必要(非Retinaの1pixelが、Retinaだと4pixel分のデータ量になるのでアクセスする位置がズレる)
- Gistはこちら
[ohkawa/UIImage+PixelColor.swift](https://gist.github.com/ohkawa/17fa56656d1a7594f2a5)

# ソースコード
```UIImage+PixelColor.swift
import UIKit

let pixelDataByteSize = 4

extension UIImage {

    func getColor(pos: CGPoint) -> UIColor {
        
        let imageData = CGDataProviderCopyData(CGImageGetDataProvider(self.CGImage))
        let data : UnsafePointer = CFDataGetBytePtr(imageData)
        let scale = UIScreen.mainScreen().scale
        let address : Int = ((Int(self.size.width) * Int(pos.y * scale)) + Int(pos.x * scale)) * pixelDataByteSize
        let r = CGFloat(data[address])
        let g = CGFloat(data[address+1])
        let b = CGFloat(data[address+2])
        let a = CGFloat(data[address+3])
        
        return UIColor(red: r, green: g, blue: b, alpha: a)
    }
}
```
# 使い方
* UIImageのExtensionとして作れば、こんな感じで使えます

```Useage.swift
let image = UIImage(named: "myImage")
let pixelColor = image!.getColor(CGPointMake(100, 100))
```
- 例によってお気づきの点があれば気軽にコメントください!
CとC++のファイルオープン（CSV）のメモ

数字　数字のものを読み込むのはC++だと表示がちょっとめんどくさい。
表示だけってこともないと思うけれど。


	//C++　書き込み
	ofstream fout("test1.txt");
	if(!fout){
		cout << "ファイルをオープンできませんでした。\n";
		return 0;
	}
	else
		cout <<  "ファイルをオープンしました。\n";

	fout << "100 4000\n" ;
	cout << "ファイルを書き込みました。\n" ;

	fout.close();

	//C++　読み込み
	ifstream fin("test1.txt");
	if(!fin){
		cout << "ファイルをオープンできませんでした。\n" ;
		return 0;
	}
	else
		cout << "ファイルをオープンしました。\n" ;

	int number1[2];

	fin >> number1[0] >> number1[1] ;
	cout << number1[0] << " " <<number1[1] <<"\n" ;

	fin.close();

	//C　書き込み
	FILE *fp;

	fp=fopen("text2.txt","w");

	if(fp==NULL){
		printf("ファイルをオープンできませんでした。\n");
		return 0;
	}
	else
		printf("ファイルをオープンしました。\n");

	fprintf(fp,"100 4000\n");

	printf("ファイルを書き込みました。\n");

	fclose(fp);

	//C　読み込み
	fp=fopen("text2.txt","r");

	if(fp==NULL){
		printf("ファイルをオープンできませんでした。\n");
		return 0;
	}
	else
		printf("ファイルをオープンしました。\n");

	int number2[2];

	fscanf(fp,"%d %d",&number2[0],&number2[1]);

	printf("%d %d\n",number2[0],number2[1]);

	fclose(fp);
Cellなどの高さ計算の処理をViewのstructで行う


ちょっとしたtipというかメモ的な記事です。最近、これでうまくいっているので自分に刻み付ける目的もあって書きます。

セルに複数行の文字を出力したい場合、セルの高さ計算が必要です。iOS8からself-sizingが加わりましたが、表示時は良いのですが画面に表示するセルが多くなった時に、セルの高さ計算がうまくいかずスクロールがかくつくという問題に直面し、結局計算をしています。

その際の計算処理をどこにどう書くかということです。

僕はMVVMで開発していて、モデルの情報は一旦 **ItemViewModel** というようなViewModelにもたせます。その段階で表示時の見た目を用意したりできるのですが、そうすると複数の違う見せ方をしたい時に複数のビューの見た目を持つのはやっぱりおかしいです。ViewのことはViewにやらせるのが良いと思って書き換えました。

## 構造

具体的にいうと下記のような構造になります。まずはシンプルに高さ計算が必要ない場合の例です。ViewModelを渡していますが、これは別に表示情報であればなんでも良いです。

```swift
final class UserCell: UITableViewCell {
    struct Layout {
        static func height(vm: UserViewModel) -> CGFloat {
            return 68.0
        }
    }

	...
}
```

利用時は、このようになります。

```swift
let vm = ...
return UserCell.Layout.height(vm)
```

高さ計算が必要な場合は下記のようになります。

```swift

final class ItemCell: UITableViewCell {
    struct Layout {
        static let LeftAreaMargin: CGFloat = 67.0
        static let RightAreaMargin: CGFloat = 14.0
        static let TopAreaHeight: CGFloat = 41.0
        
        static let NameFont = UIFont.boldSystemFontOfSize(12)
        
        static let TitleTopHeight: CGFloat = 8.0
        static var TitleMaximumSize = CGSize(width: UIScreen.mainScreen().bounds.width - Layout.LeftAreaMargin - Layout.RightAreaMargin, height: CGFloat.max)
        static let TitleFont = UIFont.boldSystemFontOfSize(16.0)
        static let TitleAttributes = [NSFontAttributeName: Layout.TitleFont]
        
        static let BottomHeight: CGFloat = 18.0
        
        static func height(vm: ItemViewModel) -> CGFloat {
            return height(NSAttributedString(string: vm.title.value, attributes: Layout.TitleAttributes))
        }
        
        static func height(attributedTitle: NSAttributedString) -> CGFloat {
            var height: CGFloat = 0.0
            height += Layout.TopAreaHeight
            height += Layout.TitleTopHeight
            height += Layout.TitleHeight(attributedTitle)
            height += Layout.BottomHeight
            return ceil(height)
        }
        
        static func TitleHeight(attributedTitle: NSAttributedString) -> CGFloat {
            let options : NSStringDrawingOptions = .UsesLineFragmentOrigin | .UsesFontLeading
            let rect: CGRect = attributedTitle.boundingRectWithSize(Layout.TitleMaximumSize, options: options, context: nil)
            return ceil(rect.size.height)
        }
    }

	...
}
```

わかりやすいようにシンプルに必要な部分を抜き出して書きましたが、実際はもう少し計算処理があったりします。利用時はこのようになります。


```swift
let vm = ...
return ItemCell.Layout.height(vm)

```

シンプルな場合と同じです。

## 補足的な

高さ計算のメソッドをstaticなfuncにしていますが、これは引数を取るからです。引数を取らない場合もありますが、取る場合もあるのでfuncに統一しています。Layoutというstructをわざわざ作らなくても良い気がしますが、これを作っているのは高さ計算の処理を一つの場所にまとめやすいからです。計算済みのセルの高さをどこでキャッシュするかという問題ですが、これは利用側でやれば良いと思っています。

こんな感じです。誰かのヒントになれば。また、もっといい感じのやり方があるよ！というのがあれば是非、コメントください〜。
cssのheightについて

## 備忘録
いつもheight: 100%が効かない。
使いたいときたまにあるけど、そういうときに限って効かないってあると思います。
とりあえず親の要素にheightが指定されているかが重要。
親要素にheightがないと一切仕事をしてくれないので、そういうときは親要素にheightを設定しよう

## 参考
分かりにくいCSS height のパーセント設定のまとめ
http://etc9.hatenablog.com/entry/20111027/1319730407
forループの深さを動的に変える方法

```C:static_loop
for(s_0_0 ; s_0_1 ; s_0_2){
    block_0_0
    for(s_1_0 ; s_1_1 ; s_1_2){
        block_1_0
        for(s_2_0 ; s_2_1 ; s_2_2){
            block_2_0
            block_2_1
        }
        block_1_1
    }
    block_0_1
}
```

```C:dynamic_loop
const int depth = 3;
int d;
int firstFlg[depth] = {1,1,1};
for(d=0 ;; ){
    if( firstFlg[d] ){
        firstFlg[d] = 0;
        s_d_0;
    }
    if( s_d_1 ){
        block_d_0
        if( d < depth - 1 ){
            ++d;
            continue;
        }
CONTINUE_POINT:
        block_d_1
    }else{
        firstFlg[d] = 1;
        --d;
        if(d == -1){
            break;
        }else{
            goto CONTINUE_POINT;
        }
    }
    s_d_2;
}
```

```C:sample.c
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define MESSAGE_FIRST(d) \
do{ \
	int _i;\
	for(_i=0 ; _i<d ; _i++){ \
		printf("\t"); \
	} \
	printf("s%d_%d\n",d,i[d]); \
}while(0)
#define MESSAGE_LAST(d) \
do{ \
	int _i;\
	for(_i=0 ; _i<d ; _i++){ \
		printf("\t"); \
	} \
	printf("e%d_%d\n",d,i[d]); \
}while(0)

int main(int argc,char *argv[]){
	int *firstFlg;
	int *l;
	int *i; // カウンタ変数
	int depth; // ループの深さ
	int d; //現在のループの深さ

	depth = argc > 1 ? atoi(argv[1]) : 3;

	firstFlg = (int *)malloc(sizeof(int) * depth);
	l        = (int *)malloc(sizeof(int) * depth);
	i        = (int *)malloc(sizeof(int) * depth);

	srand((unsigned)time(NULL));
	for(d = 0 ; d<depth ; ++d){ l[d] = (rand() % 5) + 1; }
	for(d = 0 ; d<depth ; ++d){ firstFlg[d] =  1; }
	
	for(d=0 ;; ){
		if( firstFlg[d] ){
			firstFlg[d] = 0;
			/* s1 */
			i[d] = 0;
		}
		// if( s2 )
		if( i[d] < l[d] ){
			MESSAGE_FIRST(d);
			if( d < depth - 1 ){
				++d;
				continue;
			}
CONTINUE_POINT:
			MESSAGE_LAST(d);
		}else{
			firstFlg[d] = 1;
			--d;
			if(d == -1){
				d = 0;
				break;
			}else{
				goto CONTINUE_POINT;
			}
		}
		/* s3 */
		i[d] += 1;
	}

	free(firstFlg);
	free(i);
	free(l);
	return 0;
}
```
Amazon RDS For Aurora

2014年に発表されたRDS

![スクリーンショット 2022-05-04 17.09.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55160/47c30f21-7b23-d3fb-139a-537debe56ea9.png)

Amazon RDSは2009年の10月にリリース
2019年には、Amazon RDSとAuroraデータベースエンジン全体で100を超える機能をリリース


Amazon Aurora は、MySQL と PostgreSQL との完全互換性であり、商用データベースの10分の1のコストで提供。Aurora のスループットはMySQLの5倍、PostgreSQLの3倍

```lang:AmazonAurora
Amazonが設計開発のRDBMSですね。5つめのDBエンジン
Auroraのストレージは最大64Tバイトまで自動拡張できる(10GB～)
使用した分だけ支払う。
セキュリティもデータをブロック暗号化する。
ストレージ領域のスケールアウトはお任せか。
MySQLと何が違うのかな？？
レプリケーションの処理
EC2インスタンスにMySQLをインストール→読み書きのスループットが約5倍
```

まもなく「東京リージョン」かな。

```lang:AWSデータベースサービスをまとめる
Amazon RDSはSQLが使えるリレーショナルデータベース
Amazon DynamoDBはNoSQLデータベース
Amazon Redshiftは、データウェアハウスのためのサービス：集計処理に使われる。
```
vmware fusion > シリアルポート4つをパイプで接続 > 2個のゲストOS使用

```txt:動作確認
MacOS X 10.8.5
VMware Fusion v 6.0.4
```

４つのシリアルポートへの接続を行ってソフトを開発していきたい。
接続先はエミュレーターソフトを用意するのでパイプ接続したい。

vmware(Fusion)ではシリアルポートは最大４つまでのようだ。パイプにすると結局２つのポートしか使えない。

そのため、2つのゲストOS(Win7, Win8.1)で４つずつシリアルポートを用意して、片方のゲストOS(Win8.1)でパイプのサーバーとして、もう片方のゲストOS(win7)でパイプのクライアントとする。

windows版のvmware workstationではvmwareの設定にて、パイプ、サーバーかクライアントかの設定ができたが、mac版のvmware fusionではシリアルポートのパイプ設定は .vmx ファイルを直接編集する必要があるようだ。
参考: http://www.monzen.org/blogn/index.php?e=140

以下のようにすることで、２つのゲストOS間でパイプ接続できることを確認した。

Win7側 .vmxファイル (パイプのクライアント側)

```txt:win7.vmx
...
serial0.startConnected = "TRUE"
serial0.present = "TRUE"
serial0.fileType = "pipe"
serial0.fileName = "/tmp/pipe_com_1"
serial0.pipe.endPoint = "client"
serial0.tryNoRxLoss = "TRUE"

serial1.startConnected = "TRUE"
serial1.present = "TRUE"
serial1.fileType = "pipe"
serial1.fileName = "/tmp/pipe_com_2"
serial1.pipe.endPoint = "client"
serial1.tryNoRxLoss = "TRUE"

serial2.startConnected = "TRUE"
serial2.present = "TRUE"
serial2.fileType = "pipe"
serial2.fileName = "/tmp/pipe_com_3"
serial2.pipe.endPoint = "client"
serial2.tryNoRxLoss = "TRUE"

serial3.startConnected = "TRUE"
serial3.present = "TRUE"
serial3.fileType = "pipe"
serial3.fileName = "/tmp/pipe_com_4"
serial3.pipe.endPoint = "client"
serial3.tryNoRxLoss = "TRUE"
```

Win8.1側設定ファイル (パイプのサーバー側)

```txt:win8.1.wmv
serial0.startConnected = "TRUE"
serial0.present = "TRUE"
serial0.fileType = "pipe"
serial0.fileName = "/tmp/pipe_com_1"
### serial0.pipe.endPoint = "client"
serial0.tryNoRxLoss = "TRUE"

serial1.startConnected = "TRUE"
serial1.present = "TRUE"
serial1.fileType = "pipe"
serial1.fileName = "/tmp/pipe_com_2"
### serial1.pipe.endPoint = "client"
serial1.tryNoRxLoss = "TRUE"

serial2.startConnected = "TRUE"
serial2.present = "TRUE"
serial2.fileType = "pipe"
serial2.fileName = "/tmp/pipe_com_3"
### serial2.pipe.endPoint = "client"
serial2.tryNoRxLoss = "TRUE"

serial3.startConnected = "TRUE"
serial3.present = "TRUE"
serial3.fileType = "pipe"
serial3.fileName = "/tmp/pipe_com_4"
### serial3.pipe.endPoint = "client"
serial3.tryNoRxLoss = "TRUE"
```

パイプのサーバー側にしたい場合は .pipe.endPoint = "client"は消す。
.tryNoRxLossの効果は未調査。
パイプファイルはどこでもよかったが、２つのゲストOSからの参照が楽なので、/tmp以下に置いた。
プリミティブ型の暗黙的な型変換


# はじめに

別の記事を読んでいて、プリミティブ型の暗黙的な型変換について誤解されているようなコードがちょっと気になったので、簡単に解説してみたいと思います。

# このコード分かりますか？

まず最初に質問です。以下は正常に動作するコードです。このコードが(3)で最後に出力する値は何でしょうか？また、その理由はなぜでしょうか？
答えはすぐ下にありますが、まずは答えを見ないで考えてください。

```js
//このコードは非strict modeの場合のみ動作します。strict modeの場合は(2)でTypeErrorとなります。

var num = 100; // (1)
num.question = "What is this code ?"; // (2)
console.log(num.question); // (3)
```

## 答え

(3)で、```console.log(num.question)```の出力結果は```undefined```となります。

## 理由
(2)では```num```は自動的にラッパーオブジェクトに変換され、変換されたオブジェクトのプロパティ（```question```）に文字列が代入されます。(3)でも同様に```num```はラッパーオブジェクトに変換されます。これは(2)とは別のラッパーオブジェクトです。そのため、そのプロパティ```question```は```undefined```となります。もし,
このコードを意図した（numにプロパティを追加したい）ものにしたければ、(1)では明示的にラッパーオブジェクトを生成する必要があります（[こちらに載せてます](http://qiita.com/pebblip/items/c4fdb1ea04e356955bcf#%E5%BF%9C%E7%94%A8%E4%BE%8B)）。

# 解説

JavaScriptではプリミティブ型に対するプロパティアクセスが発生した場合、対応するラッパーオブジェクトに暗黙的に型変換が行われます。

1. (1)では、変数```num```は数値```100```を代入しているのでプリミティブ型（number型）となります。
2. (2)では、```num```のプロパティ```question```にアクセスしていますが、```num```はプリミティブ型なので、自動的にラッパーオブジェクトであるNumberに型変換されます。
3. 変換後のオブジェクトのプロパティ（```question```）に文字列が代入されます。
4. (3)では、```num```のプロパティにアクセスしていますが、ここでも自動的にNumberオブジェクトに型変換されます。
5. 4.で生成されたオブジェクトのプロパティ（```question```）は存在しないので、```undefined```となります。

ここで、注目して欲しいのは、2.で型変換により生成されたオブジェクトと4.で生成されたオブジェクトは別物だということです。

この暗黙的な型変換をコードで表すと以下のようになります。

```js
var num = 100;

var _numWrapper1 = new Number(num); // ラッパーオブジェクトに変換。
_numWrapper1.question = "What is this code ?";

var _numWrapper2 = new Number(num); // ラッパーオブジェクトに変換。上記のオブジェクトとは別オブジェクト。
console.log(_numWrapper2.question);
```

ここで、```_numWrapper1```と```_numWrapper2```は別のオブジェクトであることに注意してください。

# 応用例
上記のように数値型だけではなく、文字列やブーリアン型などの他のプリミティブ型でも型変換は行われます。

```js
var s = "Hello, world!";
console.log(s.length); // 13
console.log(s.toUpperCase()); // メソッドも呼び出せます。"HELLO, WORLD!"

var n = 10000.123;
console.log(n.toExponential()); // "1.0000123e+4"

var b = true;
console.log(b.toString()); // "true"
```

このように、プリミティブ型からラッパーオブジェクトへの型変換は自動的に行われるため、以下のように、プリミティブ型をいちいちラッパーオブジェクトに変換する必要はないでしょう。

```js
var s = new String("Hello, world!"); // 自動的に型変換されるので、冗長。
console.log(s.toUpperCase());
```

ただし、冒頭の質問のように値を永続化したい場合は、以下のように（プリミティブ値にプロパティを追加する是非はおいておいて）ラッパーオブジェクトを使う必要があるでしょう。

```js
var num = new Number(100);
num.question = "What is this code ?";
console.log(num.question); // "What is this code ?";
```

# 参考文献

[JavaScriptパターン ―優れたアプリケーションのための作法](http://www.amazon.co.jp/JavaScript%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-%E2%80%95%E5%84%AA%E3%82%8C%E3%81%9F%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E4%BD%9C%E6%B3%95-Stoyan-Stefanov/dp/4873114888)
WordPressプラグイン [CSV Importer] にコメントメタデータのインポート機能を追加する。

WordPressのプラグインにCSV Importerというものがあります。
https://wordpress.org/plugins/csv-importer/
操作方法が簡単だし、いい意味で枯れているので、結構使う機会が多いです。

普段使いの際には、機能的に問題なく満足なのですが、先日「コメントのメタデータ」をインポートしたいという局面があり、このプラグインにはコメントメタデータをインポートする機能が見つかりませんでした。

そこでコードを書き足してコメントメタデータもインポートできるようにしました。
そのときのメモ。

書き換えるのはcsv_importer.phpのみです。


```php:csv_importer.php
/*517行目付近*/
        
        $comments_meta=array();//=== このコードを追加 ===
        
        foreach ($data as $k => $v) {
            // comments start with cvs_comment_
            if (    preg_match('/^csv_comment_([^_]+)_(.*)/', $k, $matches) &&
                    $v != '') {
                $comments[$matches[1]] = 1;

                /* ===以下のコードを追加=== */
                if(preg_match('/^csv_comment_[^_]+_meta_(.*)/', $k, $matches_meta)) {
                	$comments_meta[$matches[1]][]=$matches_meta[1];
                }
                /* ===コード追加ここまで=== */

            }
        }


・・・・・・


/*573行目付近*/
            $id = wp_insert_comment($new_comment);
            if ($id) {
                $count++;

                /* ===以下のコードを追加=== */
                if($comments_meta[$cid]){
                    foreach($comments_meta[$cid] AS $meta_key){
                    	if($data["csv_comment_{$cid}_meta_{$meta_key}"]){
                            $meta_key=convert_chars($meta_key);
                            $meta_value=convert_chars($data["csv_comment_{$cid}_meta_{$meta_key}"]);

                            add_comment_meta($id,$meta_key,$meta_value,false);
                        }
                    }
                }
                /* ===コード追加ここまで=== */

            } else {


・・・・・・


```

上記のようにコードを追加します。

##使い方

コメントメタデータ追加用フィールド
csv_comment_*_meta_(meta_key)

*はコメントの番号と合わせてください。

※基本的な操作方法は元プラグインのを参考にしてください。
https://wordpress.org/plugins/csv-importer/other_notes/


##追加したファイルをgithubにあげてみました。

一応、上記のコードを追加したファイルをgithubに追加してみました。

https://github.com/shin1kt/-csv_imprter-plus-comment_meta_import

そのままダウンロードしたりして、プラグインフォルダにアップしてもよいですし、CSV_Importerをすでにインストールしている場合は、csv_importer.phpを上書きしてもOKです。
プラグインを「CSV Importer」として、アップデートをすると追記部分が削除されてしまう可能性がありますのでご注意ください。

そんなわけで、
サイトを構築していちばん最初に記事を一括インポートする必要があるときなど、一回限りの使用のときにオススメです。


##参考サイト

（元のプラグイン）
https://wordpress.org/plugins/csv-importer/
Vagrantfileを分割する

自分の環境固有の設定や自分しか使わないであろうプラグインの設定などは、Vagrantfileに書いてgitで管理したくないので、別の設定ファイルに分けてignoreしておきたい。そういうときに以下のようにしておくと便利。

```rb:Vagrantfile
Vagrant.configure(2) do |config|
  # ...
end

# Load local configurations
load "./Vagrantfile.local" if File.exist?("./Vagrantfile.local")
```

```rb:Vagrantfile.local
Vagrant.configure(2) do |config|
  # ...
end
```
vmware fusion > .vmxファイルを編集する > ファインダにて .vmwarevm ファイル上にて「右クリック」ー＞「パッケージの内容を表示」

```txt:動作確認
MacOS X 10.8.5
VMware Fusion v 6.0.4
```

vmwareのファイルが .vmwarevm という一つのファイルになっていて、.vmxをどう編集すればいいのかわからなかった。

参考 http://www.monzen.org/blogn/index.php?e=140
> VMWare Fusionで作成している仮想マシンのvmxファイルは、そのままでは編集できないが、「ファインダー」→「仮想マシン」→「右クリック」→「パッケージの内容を表示」とすると関連ファイルの一覧が表示される。

上記の方法により .vmx ファイルを編集できるようになった。
mailboxの容量を制限してActorの遅延に対処する

### メッセージの遅延の伝播
Actor ModelのActorはmailboxに届けられたメッセージを自分のスレッドで一つずつ処理するので、何らかの障害が起こって処理の遅延が発生した時に処理の遅延が後続のメッセージの処理にも伝播します。

例えば、ある処理が平均50msの処理時間がかかるときに、メッセージの送り手(Producer)が50ms以上の間隔でメッセージを送り続けたりすると、レイテンシはどんどん大きくなってしまいます。このとき、producerが40msの間隔でメッセージを送り続けると、1秒後には250msの遅延が発生します。

### mailboxの容量
ここで発生しうるメッセージの遅延時間は以下のようになります。

```
(mailboxに溜まっているメッセージの数) × (メッセージの1つあたりの処理時間)
```

つまりmailboxに積まれるメッセージの数を制限することでメッセージの遅延時間も制限することができます。mailboxの容量を制限した場合、容量を超えたメッセージの処理は失敗になるので、メッセージの送り手の方でtimeoutによるエラー処理を行うか内部で失敗を検知して回復処理を行う必要があります。

### Akkaでのmailboxの制限の仕方
AkkaのActorでmailboxを制限するには、mailboxの容量を制限するAcorにRequiresMessageQueueトレイトをmix-inして必要な設定を行います。

```
// メールボックスの容量を制限するActor
class Worker extends Actor
    with RequiresMessageQueue[BoundedMessageQueueSemantics] with ActorLogging {
  import Worker._
  lazy val counter = context.actorSelection("/user/master/counter")

  def receive = {
    case work: Work =>
      Thread.sleep(150L)
      counter ! Finished
  }
}
```

```
# application.conf

akka.actor.mailbox.requirements {
  "akka.dispatch.BoundedMessageQueueSemantics" = bounded-mailbox
}

bounded-mailbox {
  # mailboxの型
  mailbox-type = "akka.dispatch.BoundedMailbox"
  # mailboxの容量
  mailbox-capacity = 4
  # mailboxにメッセージを積むときにこの時間以内にmailboxが空かなかったらtimeoutになる。
  # timeoutになったメッセージはdead letterに送られる。
  mailbox-push-timeout-time = 50ms
}
```

### タイムアウト
メールボックスから溢れて失敗したメッセージは何もしないとDead Letterに送られるだけなので、リカバリなどの対処が必要な場合は送り手の方でタイムアウトして何らかの処理を行う必要があります。

```
import akka.pattern.ask
import akka.util.Timeout
import scala.concurrent.duration._
import java.util.concurrent.TimeoutException

...

val timeout = 50.milliseconds

worker ? work onFailure {
  case te: TimeoutException =>
  // 何らかの処理
}
```

ここでask patternを用いる代わりにCircuit Breakerを用いることでProducerがConsumerにかける負荷を制限することができます。

#### 参考文献
[Reactive Design Patterns](https://www.manning.com/books/reactive-design-patterns) - 2.2.5 Bounding Latency even when Things go Wrong
Macのキーボード記号対応表( ⌘ / ⌃ / ⌥ / ⇧ )



意味あるかわからないが、よく忘れるので備忘録として。。

# 対応表

| 記号  |  コマンド |
|---|---|
| ⌘  | Command  |
| ⌃   |  Control |
| ⌥   | Option  |
| ⇧  |  Shift |
技術英語 > See if you can isolate the problem. / iWillNotProcrastinate

@ Star Trek Voyager > CATHEXIS

> See if you can isolate the problem.

セットしたコースから船が勝手に軌道を変えたことについて、艦長からパリスへの問い合わせ。

たいていの問題は isolate できれば7割程度は解決できるのはでないかと個人的に思う。

<hr>
githubで検索してみた。

https://github.com/joshim5/iWillNotProcrastinate
> Use iWillNotProcrastinate to isolate the problem, work on it, and track your progress over time!

上記関連して、githubのタイトルに出ている procrastinate は

http://ejje.weblio.jp/content/procrastinate
> ぐずぐずする，(後まで)延ばす.
Nexus5X, Nexus 6PとAndroid M (Marshmallow)概要


http://androidlover.net/android-os/android-m/android-m-new-feature.html


## ハード面
### 指紋認証
- iOSと同じ
- API公開されてる 

### 給電
- USB Type-Cを搭載したAndroidデバイス

## ソフト面
### パーミッション
- ダイアログ出すタイミング自由
- [Android Marshmallow対応！Permissions事始め](http://qiita.com/chihiro/items/314c1a69d2f2e122aad6)

### マルチウィンドウ
- モバイルMAX2, タブレットMAX4

### フォント
- モトヤフォントからNoto Sans CJK
cozを使ってコピペ駆動開発を自動化する

コピペで済ませたい、と思う場面は割とよくある。開発をしているとかなりよくある。

例えば、

+ pythonのサーバ側のWebAPIとそのドキュメント、クライアント側のSwift/Javaのエンティティで同じような定義情報やらコメントを持っていたい。
+ GitHubのWikiとREADMEとpackage.jsonの一部に重複した情報を埋め込みたい。
+ HTTPのGETとPOSTとPUTとPATCHとDELETEで個別のハンドリングメソッドを用意したいけど中身はほとんど一緒。

とかね。
泥臭い手作業や、禍根を残す無責任なコピペをやめて、こういうのを全部クールに自動的にいい感じにしたい。

既に世の中にはいろんな自動生成ツールがあり、それらを上手く取り入れ、ちゃんと組み込み、しっかり運用することができればきっとできるはずだ。

と思っていろいろ試してみたのだけれど、なかなか上手くいかない。

理由として

+ 事前に用意されたテンプレートは微妙に用途が合わない
+ 自分でテンプレートを用意すると管理が大変
+ 自動生成ツールが混ざるとどれが何をどう作成しているのかわからなくなってカオスになる

既存の組み合わせだとどうも上手くいかない。

そこで[coz][coz_url]だ。

[![coz-banner.png](https://qiita-image-store.s3.amazonaws.com/0/14107/200c473d-3f4e-6c8c-4340-ec3d89cb54c1.png)][coz_url]


cozではメタ情報ファイルに各種の生成ルールを記述し、コマンドからレンダリングを走らせるツールだ。


![coz-outline.jpg](https://qiita-image-store.s3.amazonaws.com/0/14107/4aa09e9a-a02d-76dd-e88f-12a917c684b9.jpeg)


## インストール

cozはNode.jsで作られており、[NPM][npm_url]からインストールできる。

```bash
# Instal coz via npm
$ npm install coz -g
```

イストールが成功すると`coz`コマンドが使えるようになる

```bash
# Show installed coz version.
$ coz --version
```

## Hello world

cozでは[budファイル][coz_bud_url]と呼ばれるメタファイルに生成ルールを記述する。
budファイルには何をどこからどう生成するか、という情報が含まれている。文法はjavascriptで記述されており、`require()`を使って外部モジュールを読み込める。

***.have-a-nice-day.txt.bud***

```js
// Define rendering rule.
module.exports = {
    path: 'have-a-nice-day.txt', // File path to write
    tmpl: '.have-a-nice-day.txt.hbs', // Template file
    force: true, // Overwrite each time
    mode: '444',  // As readyonly file
    data: require('./my-datasource.json') // Data to render
}
```

budファイルの`tmpl`の項目には、budファイルからの相対パスでテンプレートを指定する。
テンプレートの解釈は、デフォルト設定では[Handlebars][handlebars_url]エンジンによって行われる。
 
***.have-a-nice-day.txt.hbs***

```html
Have a nice day, {{name}}!
```

これらのファイルを用意した後、
renderコマンドの引数に.budファイルのパスを渡すとレンダリングが実行される

```bash
$ coz render .*.bud
```

***have-a-nice-day.txt***

```html
Have a nice day, jhon!
```

budファイルの名称や配置先は何でもよいが、先頭にドットをつけた隠しファイルとして、出力先と同じディレクトリに置くことが推奨される。
これは、どのファイルがどのbudファイルから出力されたかを追いやすいようにするためである。

## Advanced

### tmpl,pathの省略

budファイル内の`tmpl`,`path`の項目は省略できる。
何も書かなければbudファイル自身のパスから自動で類推される。

例えば `foo/.bar.js.bud`の場合、
`tmpl`のデフォルト値は`foo/.bar.js.hbs`
`path`のデフォルト値は`foo/bar.js` 
となる。

### 複数まとめてレンダリング

同じようなファイルをたくさん作る場合はbudファイルの中身を配列にすればよい。

**.-entity.js.bud**

```js
var names = ["User", "Department"];
module.exports = names.map(function(name) {
   return {
      path: name + 'Entity.py',
      force: true,
      mode: '444'
   }
});
```







## Links
+ [coz][coz_url]
+ [coz examples][coz_example_url]
+ [coz tutorial][coz_tutorial_url]

[coz_url]: https://github.com/coz-repo/coz
[coz_bud_url]: https://github.com/coz-repo/coz#spec-bud-spec
[npm_url]: https://www.npmjs.com
[handlebars_url]: http://handlebarsjs.com/
[coz_example_url]: https://github.com/coz-repo/coz/tree/master/example
[coz_tutorial_url]: http://coz-repo.github.io/coz/apiguide/tutorial-01%20-%20Installing%20coz.html
MacでHomeBrewにて最新Rubyに更新する方法


個人的に、`Mac`や`CentOS`や`Windows`を使用している関係で、`Ruby`の更新方法等が、頭の中で整理されていないので覚え書き。今回は`Mac`。
もともと、どこかのサイトの見よう見まねで`Ruby`インストールしていた為、気付かぬうちに`Ruby`のバージョンを`rbenv`で管理していた。(※昔は`RVM`でインストールした記憶があったような?)

現在インストールされているのは、`2.0.0`なので、`2.3`にしたくなった。

##Rubyのインストール可能なリストの確認

`rbenv`で確認してみると、`2.2.0`までしか見当たらなく。

```
$ rbenv install --list
  2.1.0-dev
  2.1.0-preview1
  2.1.0-preview2
  2.1.0-rc1
  2.1.0
  2.1.1
  2.1.2
  2.1.3
  2.2.0-dev
  2.2.0-preview1
```

## rbenvとruby-buildのアップグレード

`HomeBrew`を利用して`rbenv`をインストールした記憶があるので、`rbenv`と`ruby-build`をアップグレードしてみた。

```
$ brew upgrade rbenv ruby-build
Error: rbenv 0.4.0 already installed
==> Upgrading 1 outdated package, with result:
ruby-build 20150506
==> Upgrading ruby-build
==> Downloading https://github.com/sstephenson/ruby-build/archive/v20150506.tar.
######################################################################## 100.0%
==> ./install.sh
🍺  /usr/local/Cellar/ruby-build/20150506: 160 files, 680K, built in 3 seconds
```

どうやら、`rbenv`は最新、`ruby-build`はアップグレートされた模様。
もう一度`rbenv`でインストール可能なリストの確認。

```
$ rbenv install --list
  2.1.5
  2.1.6
  2.2.0-dev
  2.2.0-preview1
  2.2.0-preview2
  2.2.0-rc1
  2.2.0
  2.2.1
  2.2.2
  2.3.0-dev
```

どうやら、`Mac`の`rbenv`でインストール可能なバージョンは`2.3.0-dev`が最新のようだ。


##Rubyのインストール

```
$ rbenv install 2.3.0-dev
Cloning https://github.com/ruby/ruby.git...
Installing ruby-2.3.0-dev...

BUILD FAILED (OS X 10.10.3 using ruby-build 20150506)
```

`2.3.0-dev`は怒られた。
そこでキッパリ諦めて`2.2.2`にすることにした。

```
$ rbenv install 2.2.2
Downloading ruby-2.2.2.tar.gz...
Installing ruby-2.2.2...
Installed ruby-2.2.2 to /Users/xxxx/.rbenv/versions/2.2.2
```

##Rubyバージョン指定
```
$ rbenv global 2.2.2
$ rbenv versions
  system
  1.9.3-p429
  2.0.0-p195
  2.1.3
* 2.2.2 (set by /Users/xxxx/.rbenv/version)
```

更新完了。
アップデートした El Capitan で Library not loaded: libmysqlclient.18.dylib (LoadError)  と出る

Yosemite から El Capitan にアップデートしたら、`rails s`をしたら、

```
bin/rails:6: warning: already initialized constant APP_PATH
***/bin/rails:6: warning: previous
definition of APP_PATH was here Usage: rails COMMAND [ARGS]

The most common rails commands are:  generate    Generate new code
(short-cut alias: "g")  console     Start the Rails console (short-cut
alias: "c")  server      Start the Rails server (short-cut alias: "s")
dbconsole   Start a console for the database specified in
config/database.yml
             (short-cut alias: "db")  new         Create a new Rails application. "rails new my_app" creates a
             new application called MyApp in "./my_app"

In addition to those, there are:  application  Generate the Rails
application code  destroy      Undo code generated with "generate"
(short-cut alias: "d")  plugin new   Generates skeleton for developing
a Rails plugin  runner       Run a piece of code in the application
environment (short-cut alias: "r")

All commands can be run with -h (or --help) for more information.
```

と出るようになってしまいました。

`rake rails:update:bin` を打つと、情報が出てくるということで（http://ja.stackoverflow.com/questions/10290/warning-already-initialized-constant-app-path）打ってみたところ、
`Library not loaded: libmysqlclient.18.dylib (LoadError)` と出てしまいました。。。

どうやら、 `libmysqlclient.18.dylib`　が見つからない模様。

Yosemite までは、 `sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib` とやるといいらしいんですが、例によってできないので、

```
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib
```
<a href="https://github.com/brianmario/mysql2/issues/646">Relative path not allowed in OS X: &quot;unsafe use of relative rpath libmysqlclient.18.dylib&quot; · Issue #646 · brianmario/mysql2</a>

El Capitanだとこれが有効なようです。
これで、`Library not loaded: libmysqlclient.18.dylib (LoadError)` は出なくなりました。
YubiKey Edge で ２段階認証 ～ Googleログイン編


# 概要
YubiKeyは、USBポートに差し込んで認証を行えるハードウェアセキュリティキーです。
Googleのような「ログインID＋パスワード」でログインできる認証に加えて、「アカウントに関連付けたYubiKeyを持っていること」を条件とすることができます。

スマホを使った２段階認証はコードを入力するのが手間だったりしますが、USBポートに差し込んでおくだけでいいので手間がかかりません。

# 購入
現在はAmazonでYubiKey正規販売代理店が販売しているものがあります。
今回はYubiKey Edgeを購入しました。

YubiKey Edge
http://www.amazon.co.jp/Yubico-Y-121-YubiKey-Edge/dp/B00VV8SI1I/

2015年10月に注文し、翌日にポストに届きました。

なお、Google認証などFIDO U2Fのみ利用できればいい場合は、Yubico セキュリティキー FIDO U2F準拠 でもいいかと思います。 
http://www.amazon.co.jp/Yubico-Y-121-YubiKey-Edge/dp/B00NLKA0D8/

# Google初期設定

ブラウザはChromeを利用します。

YubiKey自体の設定は何もする必要がないようです。

Googleにアカウントにログインし、ログインとセキュリティから２段階認証プロセスの設定に進み、セキュリティー キーを追加します。

![yubico001.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/aa030f90-f593-33bd-6e09-e748a4bbda1c.png)

登録ボタンを押します。
YubiKeyがUSBポートに挿入されている場合は一旦抜いてから登録ボタンを押します。

![yubico002.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/b3a636f6-1369-1642-3ec0-b5af8f2f3019.png)

すると、セキュリティ キーを挿入してタップするよう求められるので、YubiKeyをUSBポートに挿入しタップします。

![yubico003.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/77b5ffe8-5390-0702-bb7d-4285e6823037.png)

登録済みと表示されれば完了です。

![yubico004.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/0ccbf045-bbc1-afcf-a618-4653e8e11da4.png)

アカウントに関連付けされているセキュリティ キーを確認できます。

![yubico005.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/17ac3796-0384-4ca2-ef23-c338acbc15ba.png)

# YubiKey を使用してGoogleにログインする

一度Googleからログアウトして再度ログインしてみましょう。

メールアドレスとパスワードを入力してログインしようとすると、セキュリティ キーの挿入を求められます。

![yubico007.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/60a64907-e540-fa9d-3ecf-44340344536d.png)

セキュリティ キーを挿入してタップすると、ログインすることができます。

セキュリティ キーが手元にない場合は、別の方法でログインすることができます。

![yubico008.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/09810662-8b1b-d47a-ec61-bb7d9a6d737f.png)

セキュリティ キーの他に、「Google 認証システム」アプリからの確認コードを取得といった、携帯端末を使った２段階認証でもログインすることができます。
もちろん予めこれらの認証を許可しておく必要があります。

# Chrome以外のブラウザでの挙動

Microsoft Edge や Firefoxでは YubiKeyでGoogleにログインすることはできません。
ログイン画面でセキュリティ キーを求められることはなく、「Google 認証システム」アプリからの確認コードを取得など、その他の認証方式のみ表示されます。

# 紛失したとき

２段階認証での認証方法を複数用意しておき、１つのキーを紛失したら即座にもう１つのキーで設定を変えるのが望ましいでしょうか。
YubiKeyによる認証と、Google 認証システムによる認証を両方有効にしておくのはありだと思います。

# YubiKeyの管理

YubiKeyを紛失したら大変です。なくさないようにしましょう。
また、なくした場合はすぐに気がつくように管理しましょう。
なくしたことに気づかず、攻撃者に渡って痛い目を見ないように。
Raspberry Pi 2（略してパイ２）で内向きDNS


# 概要
Raspberry Pi 2にdnsmasq を導入して、プライベートネットワーク内の内向きDNSサーバとして利用します。
DNSといえばbindが一般的だと思いますが、bindは機能は豊富だけど設定が面倒。
dnsmasq は軽量で、hostsファイルを編集するだけで内容を展開してくれるので運用が簡単です。

# dnsmasq の導入
dnsmasq は apt-get でインストールできます。
設定内容については他のサイトで解説されているのでそちらをご覧ください。

```bash
$ sudo apt-get install dnsmasq
$ sudo vi /etc/dnsmasq.conf
	port=53
	domain-needed
	bogus-priv
	local=/local.example.com/
	expand-hosts
	domain=local.example.com

$ sudo service dnsmasq restart
```

# Aレコードの登録

hostsファイルに記述するだけでdnsmasq がAレコードと判断してくれます。
hostsファイル変更後は、dnsmasq を再起動する必要があります。

```bash
$ sudo vi /etc/hosts
	192.168.1.192   host1.example.com

$ sudo service dnsmasq restart
```

# クライアントで名前解決ができることを確認
WindowsOSの場合、コントロールパネルのイーサネットの設定から優先DNSサーバーに raspberry piのIPアドレスを指定します。
代替DNSサーバーは、内向きDNSがraspberry piのみであれば、普段使っているルーターなどを指定すればいいでしょう。

![pi011.PNG](https://qiita-image-store.s3.amazonaws.com/0/94538/f0a99bba-5e1f-ce6f-3a81-8c007628b029.png)

ここでは名前解決してApacheにアクセスできるかを確認してみます。
ブラウザからraspberry piのhostsで指定した http://host1.example.com/ へアクセスしてみましょう。
raspberry piにアクセスできれば成功です。

# dnsmasqのメモリ使用量

psコマンドのRSS値を見てみましょう。

```bash
$ ps aux
	USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
	dnsmasq   2040  0.0  0.2   4448  2344 ?        S    22:03   0:00 /usr/sbin/dnsmasq -x /var/run/dnsmasq/dnsmasq.pid -u dnsmasq -r /var/run/dnsmasq/resolv.conf -7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new
```

ほぼ起動直後で2.3MB程度のメモリを使用しているようです。

# dnsmasq がダウン後に復旧した場合

dnsmasqがダウンすると当然内向きDNSは機能しません。

試しにraspberry piのLANケーブルを抜いてみます。

当然raspberry piのhostsに設定した内容は引けず、代替DNSサーバーへの問い合わせになります。

抜いたLANケーブルを再び差し込んでみます。

WindowsOSの場合、このままではすぐにdnsmasqを見てくれません。
WindowsのDNSキャッシュをクリアする必要があります。
コマンドプロンプトから下記のコマンドを実行します。

```text
ipconfig /flushdns
	Windows IP 構成
	DNS リゾルバー キャッシュは正常にフラッシュされました。
```
ブラウザを再起動すると、再びdnsmasqを参照してくれるようになります。
El Capitanにしてから開発環境を復活させるまでにしたことまとめ


# Xcodeのコンポーネントのインストール

Xcodeから普通に。

# Homebrewの復旧

`sudo chown $(whoami):admin /usr/local && sudo chown -R $(whoami):admin /usr/local`を実行する

参考：https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/El_Capitan_and_Homebrew.md


# oh-my-zshの復旧

```
zsh:12: command not found: ___main
(eval):1: no matches found: *:all-files
_tags:comptags:36: can only be called from completion function
_tags:comptry:55: can only be called from completion function
_tags:comptags:60: can only be called from completion function
_tags:comptags:67: can only be called from completion function
```

暫定的に.zshrcのpluginsからgithubを外す。

https://github.com/robbyrussell/oh-my-zsh/pull/4443 で対応中。

参考：https://github.com/robbyrussell/oh-my-zsh/issues/4439


# Vagrantの復旧

```
Command: ["hostonlyif", "create"]

Stderr: 0%...
Progress state: NS_ERROR_FAILURE
VBoxManage: error: Failed to create the host-only adapter
VBoxManage: error: VBoxNetAdpCtl: Error while adding new interface: failed to open /dev/vboxnetctl: No such file or directory

VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component HostNetworkInterface, interface IHostNetworkInterface
VBoxManage: error: Context: "int handleCreate(HandlerArg*, int, int*)" at line 68 of file VBoxManageHostonly.cpp
```

VirtualBoxを最新版にアップデート。

https://github.com/mitchellh/vagrant/issues/1671 によると`sudo /Library/StartupItems/VirtualBox/VirtualBox restart`の実行で復旧しているひとも居るらしい（未確認）

# XtraFinderの復旧

XtraFinderはSIP(System Integrity Protection)を無効化しないと使えない。
私はSIPを無効化したくなかったので、使うのを諦めました。

以上！
JSの地図ライブラリOpenLayers3動かしてみた

# OpenLayers3とはjs仕様の地図ライブラリです。 (未対応ブラウザIE8)

公式サイト [http://openlayers.org/] (http://openlayers.org/)


1.クイックスタート用のコード本家 [http://openlayers.org/en/v3.9.0/doc/quickstart.html] (http://openlayers.org/en/v3.9.0/doc/quickstart.html)

```
<!doctype html>
<html lang="en">
  <head>
    <link rel="stylesheet" href="http://openlayers.org/en/v3.9.0/css/ol.css" type="text/css">
    <style>
      .map {
        height: 400px;
        width: 100%;
      }
    </style>
    <script src="http://openlayers.org/en/v3.9.0/build/ol.js" type="text/javascript"></script>
    <title>OpenLayers 3 example</title>
  </head>
  <body>
    <h2>My Map</h2>
    <div id="map" class="map"></div>
    <script type="text/javascript">
      var map = new ol.Map({
        target: 'map',
        layers: [
          new ol.layer.Tile({
            source: new ol.source.MapQuest({layer: 'sat'})
          })
        ],
        view: new ol.View({
          center: ol.proj.transform([37.41, 8.82], 'EPSG:4326', 'EPSG:3857'),
          zoom: 4
        })
      });
    </script>
  </body>
</html>
```




2. 羽田空港がdefaultの場合

```
<script type="text/javascript">
  var map = new ol.Map({
    target: 'map',
    layers: [
      new ol.layer.Tile({
        source: new ol.source.OSM()
      })
    ],
    view: new ol.View({
      center: ol.proj.transform([139.77, 35.55], 'EPSG:4326', 'EPSG:3857'),
      zoom: 1411
    })
  });      
</script>
```

## apiオブジェクトの説明
**随時更新予定**

###ol.Map
mapObjectの生成
target,layers,viewを持ち
targetに表示するdivのidを入れる。

###ol.View
  viewオブジェクトの生成
  center で地図の中央を指定できる。center: [0, 0]でオーストラリア
  zoomで拡大する倍数を指定

###ol.layer.Tile
  tileオブジェクトの生成

###ol.control.FullScreen()
全画面表示にするボタンの設置と全画面表示


###ol.control.MousePosition
クリックした場所の座標取得

###ol.control.ZoomSlider
ズームスライダーの導入


##導入は手軽にできるので、是非是非。
GoでJSONとYAMLを相互変換するツールを作った

# 表題の通りですが

- [y13i/j2y](https://github.com/y13i/j2y)

Golangの習作です！！！

# バイナリもあるよ

- [Releases](https://github.com/y13i/j2y/releases)

無駄にマルチプラットフォーム。無駄なkusocommitで [Travis CI](https://travis-ci.org) さんの貴重なリソースを浪費してしまい申し訳ない :sob: 

# つかいかた

`$PATH` の通ったところにポイーすればインストール完了です。

小機能なので [readme](https://github.com/y13i/j2y/blob/master/README.md) か `j2y --help` を読めばすぐ分かると思います！

## JSONをYAMLに変換

[JSON Tutorial](http://www.w3schools.com/json/) からサンプルJSONを拝借。

```shell-session
$ cat example.json
{"employees":[
    {"firstName":"John", "lastName":"Doe"},
    {"firstName":"Anna", "lastName":"Smith"},
    {"firstName":"Peter", "lastName":"Jones"}
]}
$ j2y example.json
employees:
- firstName: John
  lastName: Doe
- firstName: Anna
  lastName: Smith
- firstName: Peter
  lastName: Jones
```

## ファイルに出力

```shell-session
$ j2y -o example.yml example.json
$ cat example.yml
employees:
- firstName: John
  lastName: Doe
- firstName: Anna
  lastName: Smith
- firstName: Peter
  lastName: Jones
```

## YAMLからJSONに変換

```shell-session
$ j2y -r example.yml
{
  "employees": [
    {
      "firstName": "John",
      "lastName": "Doe"
    },
    {
      "firstName": "Anna",
      "lastName": "Smith"
    },
    {
      "firstName": "Peter",
      "lastName": "Jones"
    }
  ]
}
```

## YAMLからJSONに変換（JSONを1行出力）

```shell-session
$ j2y -r -m example.yml
{"employees":[{"firstName":"John","lastName":"Doe"},{"firstName":"Anna","lastName":"Smith"},{"firstName":"Peter","lastName":"Jones"}]}
```

## 引数に直接入力文字列を書く

```shell-session
$ j2y -e '{"employees":[{"firstName":"John","lastName":"Doe"},{"firstName":"Anna","lastName":"Smith"},{"firstName":"Peter","lastName":"Jones"}]}'
employees:
- firstName: John
  lastName: Doe
- firstName: Anna
  lastName: Smith
- firstName: Peter
  lastName: Jones
```

## 標準入力を渡す

```shell-session
$ echo '{"employees":[{"firstName":"John","lastName":"Doe"},{"firstName":"Anna","lastName":"Smith"},{"firstName":"Peter","lastName":"Jones"}]}' | j2y
employees:
- firstName: John
  lastName: Doe
- firstName: Anna
  lastName: Smith
- firstName: Peter
  lastName: Jones
```

# 感想

ほとんど神パッケージ2つをくっつけただけの他力本願寺ツールでした。

- [ghodss/yaml](https://github.com/ghodss/yaml)
- [codegangsta/cli](https://github.com/codegangsta/cli)