OmniAICreator/Qiita-1.07M huggingface dataset:
Microsoft Azure Webapps (Websites) の PHP から Oracle Database に接続する

Microsoft Azure Webapps (Websites) で、独自に Extension を追加したい場合は、 Azure ポータルの「アプリケーション設定」で PHP_EXTENSIONS を設定しますが、 OCI8 ドライバの場合は、これとは別に Oracle Instant Client の DLL が必要なため、この方法が使えません。

独自に Handler Mapping を追加することで、 OCI8 ドライバも使用できるようになります。

1. [Oracle Instant Client のダウンロード](http://qiita.com/nanasess/items/efa7c027838509a44586#oracle-instant-client-%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89) を参考に、 Oracle Instant Client をダウンロードしておきます。
2. [カスタムの PHP ランタイムを使用する](https://azure.microsoft.com/ja-jp/documentation/articles/web-sites-php-configure/#php-2) を参考に、 PHP の設定をします。
4. Oracle Instant Client の DLL を 2 の PHP ディレクトリ内にコピーします。
5. 2 の php ディレクトリ内 にある php.ini を修正します。

```ini
extension_dir=D:\home\site\wwwroot\bin\php\ext\ ;; 修正
;extension=php_oci8.dll    ;; Oracle 11g より前のバージョンはこちらを有効に
extension=php_oci8_11g.dll ;; Oracle 11g 以降のバージョンはこちらを有効に
extension=php_pdo_oci.dll  ;; 追加
```

`phpinfo()` を確認して、 OCI8 の項目が確認できれば成功です。

![OCI8.PNG](https://qiita-image-store.s3.amazonaws.com/0/40662/16abe224-0e64-d284-3870-159af67fe6e8.png)
PHP: UserAgent毎にページを振り分けるサンプル 全力丁寧ver

リファクタリング案件中、すごくグチャグチャなコードに出会ったので
今の自分の知りうる限りの丁寧さで書いたらどうなるのか気になったので書いてみました。
コードレビューしていただけると嬉しいです。

メインの処理

```php
$ua = $_SERVER['HTTP_USER_AGENT'];
$has = hasStrMaker($ua);
switch (true) {
	case isMobile($has):
		header("Location: m/");
		break;
	case isTablet($has):
		header("Location: t/");
		break;
	case isKtai($has):
		header("Location: k/");
		break;
	default:
		header("Location: pc/");
		break;
}
```

ライブラリ

```php
// PHP 5.3 以下は"calllable"を外す。
function isMobile(callable $has){
	switch (true) {
		// Android Phone は "Android" と "Mobile"
		case $has('Android') && $has('Mobile'):
		case $has('iPhone'):
		case $has('Windows Phone'):
			return true;
	}
	return false;
}

function isTablet(callable $has){
	switch (true) {
		case $has('Android'):
		case $has('iPad'):
			return true;
	}
	return false;
}
function isKtai(callable $has){
	switch (true) {
		case $has('DoCoMo'):
		case $has('KDDI'):
		case $has('Vodafone'):
			return true;
	}
	return false;
}

function hasStrMaker($s){
	return function($n) use(&$s){
		if(strpos($s,$n) === false){
			return false;
		}
		return true;
	};
}
```

テスト

```php

<?php
//Tests:
$mobiles = [
	// Android Phone
	"Mozilla/5.0 (Linux; U; Android 2.3.5; ja-jp; ISW11K Build/145.0.0002) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
	// iPhone
	"Mozilla/5.0 (iPhone; CPU iPhone OS 6_0_1 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10A523",
	// Windows Phone
	"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; KDDI-TS01; Windows Phone 6.5.3.5)"
	];

$tablets = [
	// iPad
	"Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25",
	// Android Tablet
	"Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03S) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19"
	];

$Ktais = [
	// DoCoMo
	"D501i	DoCoMo/1.0/D501i",
	// Au
	"KDDI-HI31 UP.Browser/6.2.0.5 (GUI) MMP/2.0",
	// Vodafone
	"Vodafone/1.0/V702NK/NKJ001[/xxx] Series60/2.6 Nokia6630/x.x.x Profile/MIDP-2.0 Configuration/CLDC-1.1"
	];

function uaFuncSet_Test($testFunc, $array){
	foreach ($array as $ua) {
		$has = hasStrMaker($ua);
		if($testFunc($has) == true){
			echo '.';
		}else{strpos($cstr,$t);
			echo "fail: $ua";
		}
		echo "\n";
	}
}
$testFunc = isMobile;
uaFuncSet_Test($testFunc, $mobiles);
//uaFuncSet_Test($testFunc, $tablets); // 失敗テスト

$testFunc = isTablet;
uaFuncSet_Test($testFunc, $tablets);

$testFunc = isKtai;
uaFuncSet_Test($testFunc, $Ktais);
```

isMobile系はチェック関数をシンプルに各中で作るか、クロージャを渡すしてDRYに書くか、迷ったのですが後々の変更やテストのしやすさ（DI的な？）を考えたらDRYを取りました。
読みやすさを少し犠牲にした部分の様な気もしますが大丈夫な範囲でしょうか？
Riot.jsのHTML部分をJadeで書いてgulpするメモ

普段Railsでhamlを使っていた身としては、
どうせコンパイルするのなら、slimとかJadeとかインデントで書いてスッキリしたいよね。
ってことでRiot.jsはJadeで書けます！

##Jadeだとこんな感じで書ける
scriptの後に.（ドット）を付けるとベタ書きできる

```jade(hello.tag)
hello
  h1#title.center {title}
  ul.list(each="{content, i in contents}")
    li(class="{even: (i % 2 === 0)}")
      p.number {content}

  script.
    this.title = "HELLO"
    this.contents = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```

##必要になるnpmパッケージ
jadeとriotも忘れずに

```json(package.json)
"dependencies": {
  "jade": "1.9.2",
  "gulp": "3.8.11",
  "gulp-riot": "0.2.14",
}
```

##gulpのタスク
{template: "jade"}ってするのがポイント

```coffeescript(gulpfile.coffee)
gulp.task "riot", ->
  gulp.src [
    "hello.tag"
  ]
  .pipe riot {template: "jade"}
  .pipe gulp.dest "hello.js"
```

##実行しておわり
ね、簡単でしょ？
ElasticBeanstalkにPostgresのRailsアプリを乗せるのに参考にした情報（リンクのみ）

Herokuからの載せ替えのイメージが掴みたかったので新規アプリを試しにアップしたのですが、下記がとてもわかりやすかったです。多謝。

http://fiveteesixone.lackland.io/2015/01/17/set-up-rails-4-2-on-elactic-beanstalk-with-postgresql-1/
http://fiveteesixone.lackland.io/2015/01/18/set-up-rails-4-2-on-elactic-beanstalk-with-postgresql-2/

こちらをざっと眺めると雰囲気掴みやすいかも。
http://qiita.com/jr_qrank/items/aadc076ebf93a2692d14

大元の情報
http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/create_deploy_Ruby_rails.html



以前Javaでやっていたのですが、また戻ってきました。一度環境作るとHerokuばりに簡単かも。CI連携までいきたいすねー。
すでにApacheが動作している環境にDockerコンテナのApacheを追加してみる。



今回はDockerで開発環境作るぜ！
持ち運びできるぜ！
と息巻いてDockerImageを作ったわけですが、ステージングサーバではすでにApacheが稼働しているので、それらは変更せずにDockerコンテナ内のApacheも動かそう、という試みです。

状況的にはこんな感じ。

![AWS Design.png](https://qiita-image-store.s3.amazonaws.com/0/75412/ca417bb5-f46a-c5a5-3517-70d54dd07480.png "AWS Design.png")



結論から言うと、mod_proxyを使い、内部でポート転送をします。

###Dockerコンテナ作成後のポートを確認

```
docker ps
```

|CONTAINER ID|IMAGE|COMMAND|CREATED|STATUS|PORTS|NAMES|
|:----------:|:---:|:-----:|:-----:|:----:|:---:|:---:|
|0xxxxxxxx|imagename:tag|"/bin/bash"|1m|1m|0.0.0.0:49154->80/tcp|container name|  

ということで、49154番ポートがあてがわれていることがわかります。

###Virtual Hostの設定

```bash:
<VirtualHost {ip-address}:80>
    ServerName {domain-name}.com

    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:49154/
    ProxyPassReverse / http://127:0.0.0:49154/

</VirtualHost>
```


これでOK。簡単！
HDFS NameNodeの利用ディスク容量肥大の対処(Amazon EMRのケース)


## 課題

EMRの単一のクラスタを長い期間運用していると`/mnt/var/lib/hadoop/dfs-name/current`が肥大してくるケースがある。EMR(Hadoop2.4.xの場合)では`/home/hadoop/conf/hdfs-site.xml`下記のような指定があるので、当該ディレクトリはHDFS NameNodeのディレクトリであることがわかる。

```
<property>
	<name>dfs.name.dir</name>
	<value>/mnt/var/lib/hadoop/dfs-name</value>
</property>
```

## 仕組みと原因

このCurrentというディレクトリの中には`fsimage`と呼ばれるHDFSのスナップショットファイルと`edits`と呼ばれるジャーナルファイルが保存されている。他にもいろいろあるが、この2つがおもにディスク容量を食う原因。

- fsimage
 - HDFSのメタデータのスナップショット
 - `dfs.namenode.num.checkpoints.retained`で何世代とっておくかが指定されている
 - デフォルト値は2。EMRではそのままデフォルト値が採用されている。
- edits
 - スナップショット以降のジャーナルファイル
 - `dfs.namenode.num.extra.edits.retained`でとっておくジャーナルの操作数？を指定されている
 - デフォルト値は1,000,000。こちらもEMRではデフォルト値が採用されている。

ある条件を満たすとeditsがfsimageにコンパクションされていく。
ちゃんと自分で検証できていないが、2者のうち、特に`edits`が肥大化しやすいとのこと。なので、こいつをいかに抑制するかがポイントの模様。

いちおう、Apache本家のhdfs-default.xmlの解説をみると、下記のように書いてはあるので、無限に肥大していくわけではないはず。

>  Typically each edit is on the order of a few hundred bytes, so the default of 1 million edits should be on the order of hundreds of MBs or low GBs.


## 対策

いくつか考えられる

### 1. editsの保存操作数を抑制する

`dfs.namenode.num.extra.edits.retained`もしくは`dfs.namenode.max.extra.edits.segments.retained`の値でeditsに保存される操作数を抑制する。

### 2. コンパクションの間隔を縮める

Clouderaのドキュメントには下記のように書いてあるので、　`dfs.namenode.checkpoint.period`もしくは`dfs.namenode.checkpoint.txns`を調整して、コンパクションの間隔をコントロールする。
> checkpointing is triggered by one of two conditions: if enough time has elapsed since the last checkpoint (dfs.namenode.checkpoint.period), or if enough new edit log transactions have accumulated (dfs.namenode.checkpoint.txns). The checkpointing node periodically checks if either of these conditions are met (dfs.namenode.checkpoint.check.period), 

### 確認できていないこと

コンパクションが発生したあとに、古いeditsがちゃんと捨てられるかどうかはためせていない。

### 注意点

下記のClouderaのドキュメントにもあるが、Secondary NameNodeやStandby NameNodeがあれば、そちらでコンパクションを実施するという記述があるが、EMRは現状(2015/5時点)で、NameNodeはシングル構成なので注意。

## 参考資料

- [A guide to checkpointing in Hadoop](http://blog.cloudera.com/blog/2014/03/a-guide-to-checkpointing-in-hadoop/)
- [hdfs-default.xml](https://hadoop.apache.org/docs/r2.4.1/hadoop-project-dist/hadoop-hdfs/hdfs-default.xml)
- Hadoop 第3版 10章 Hadoopの管理 10.1 HDFS

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

## Disclaimar

このポストは個人のメモであり、わたしの雇用者を代表する意見やドキュメントではありません。
kindle for mac で自動ページめくり(AppleScript)

こんな感じで自動再生できる．Automatorだとうまくできなかった．

```
repeat with p from 1 to 110
    tell application "Kindle"
        activate
        tell application "System Events"
            delay 1
                key code 123
            -- ページ送り (カーソルキー)
        end tell
    end tell
end repeat
```

間にスクリーンショットをはさんで(ry 

http://ryskt.com/wp/?p=212
【爆即コピペ】公開鍵認証 SSH ログイン設定

1.キー作成

```
ssh-keygen -t rsa
mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys
chmod 600  ~/.ssh/authorized_keys
```

2.公開鍵認証を許可

```
vi /etc/ssh/sshd_config

公開鍵認証を許可するため、以下をコメントアウト
PubkeyAuthentication yes
```

3.サービスの再起動

```
service sshd restart
```
$KeepPrivateフィールドの状態

# $KeepPrivateとは
* Notesクライアントで印刷の制御を行うために生成されるフィールドです。

    * Notesクライアントのみで有効な機能です。<br>
    （webブラウザ等では動作しません。）

# フィールドの値と、フィールドの有無による動作の整理

|\$KeepPrivateの状態|動作|
|:---|:---|
|"1"|印刷不可|
|""(ブランク)|印刷可|
|フィールドが存在しない|印刷可|

* 上記の条件に沿って$KeepPrivateの値を更新すれば、印刷を制御することができます。
* 同名のフィールドを手動で追加しても同様に動作します。

# $KeepPrivateが作成される条件<br>
（下記の何れかの条件に合致する場合に作成されます。）

1. ACLで[文書を複製またはコピー]が無効となっているユーザーが文書を作成するとき。
1. フォームの設計で[印刷/転送/クリップボードへのコピーを不可]が有効なとき。

# 注意点

上記の条件によって$KeepPrivateフィールドは自動生成されますが、一度作成されたフィールドは更新されません。
何らかの方法でフィールドを更新したり、削除した後で元の状態に戻すためには、そのための機能を追加する必要があります。
C言語　めっちゃ基本メモ

// int型の変数に10をセット
int x = 10;

// int型のポインタを定義
int* p;

// xのアドレスをint型のポインタpにセット
p = &x;

// pの値に5を入れる
*p = 5;

// char型を10個持つaを定義
char a[10];

// char型のポインタを定義
char* p

// pにchar型の配列aの先頭アドレスをセット

p=a
 or
p=&a[0]
Dockerのbusyboxは永続コンテナと言いながらexport/saveコマンドでは持ち運びできないよ


このエントリーを見て永続コンテナを作ったのですが、
export/saveしても内容が空になってしまうんですよね。
http://qiita.com/mopemope/items/b05ff7f603a5ad74bf55

困った困った。

ということで、公式に情報がありました。
http://docs.docker.com/userguide/dockervolumes/#creating-and-mounting-a-data-volume-container


apacheで使用するソースコードのバックアップをしてみています。

###永続コンテナのバックアップ（store）
```bash:
docker run --rm \
	--volumes-from www-data \
	-v $(pwd):/backup \
	busybox tar cvf /backup/www-data.tar /var/www/html
```

```bash:解説
docker run -rm \
	--volumes-from {データが入っているコンテナの名前} \
	-v $(pwd):/backup \
	busybox tar cvf /backup/{保存するtarの名前}.tar {マウントしているディレクトリ}
```


###永続コンテナのリストア(restore)

まずは空のコンテナを作る

```bash:
docker run --name www-data \
	-v /var/www/html busybox true
```

tarをリストアする

```bash:
docker run --rm --volumes-from www-data \
	 -v $(pwd):/backup \
	 busybox tar xvf /backup/www-data.tar
```

```bash:解説
docker run --rm --volumes-from {リストア先のコンテナの名前} \
	 -v $(pwd):/backup \
	 busybox tar xvf /backup/{保存してあるtarの名前}.tar
```


--rmはコンテナが終了した瞬間に消す、というoptionらしい。
Solaris10にgitをインストールする

顧客環境でまだまだ現役バリバリなSolaris 10。
そんな環境でも自前のソフトウェアを動作保証するために、gitリポジトリにあるテストセットをダウンロードしてテスト実行する環境を作りたい！

しかしハマったので自分向けメモ。

とりあえず、[git本家](https://git-scm.com/download/linux)を見ると、
そうかー、Solaris 11だとpkg installでできるんだー。いいなー(棒)

Solaris10はソースからビルドしないといけないらしい。
なので、ソースを[github](https://github.com/git/git)からDownload ZIPする。

とりあえずSolaris10上で展開してmakeを叩いてみる。。。。やっぱりSolarisのmake(/usr/ccs/bin/make)ではだめですね。
gccもインストールしないといけない。

### 結論として、必要なもの
1. SolarisStudio
2. make-4.1.tar.gz
3. gcc-3.4.6.tar.gz
4. openssl-1.0.2a.tar.gz
5. Linux環境...

### 1. SolarisStudioのインストールは割愛。
/opt/solarisstudio12.3 に入れた。その後、PATH設定を追加
`export PATH=/opt/solarisstudio12.3/bin:$PATH`

### 2. GNU makeのインストール
```shell-session
cd /tmp/make-4.1
./configure
make
make install
```
その後、PATH設定を追加
`export PATH=/usr/local/bin:$PATH`

### 3. gccのインストール
```shell-session
cd /tmp/gcc-3.4.6
./configure --disable-werror --enable-languages=c
make
make install
```

### 4. opensslのインストール
このとき、/etc/skel/local.profileを編集して/usr/local/binがデフォルトで通るようにしておく。

```shell-session
cd /tmp/openssl-1.0.2a
./config
make
make install
```

### 5. Linux環境で、一旦gitのソースディレクトリ上でmake configureする。
そして、Solaris環境のgitソースディレクトリへ持っていく

### 6. ようやく、gitのビルド
しかし、/usr/ccs/bin/make と /usr/xpg4/bin/make が間違えて使われて途中で止まるので
それら2つのファイルをリネームか何かして一時的に無効化しておく。
そうして、ようやくビルド。

```shell-session
./configure --prefix=/usr/local
make NO_TCLTK=1 all
make NO_TCLTK=1 install
```
AutoLayout制約値を変更したアニメーションで勘違いしていた件

@SatoTakeshiX さんの勉強会でAuto Layout の制約をいじったアニメーションについて教えてもらいました。
UIView.animations ブロックの中で制約の値変えたら良いのかと思ってたけど違うんですねー。完全に勘違いしてました。

制約を変えるのは animations ブロックの外。animatinosブロックの中では self.view.layoutIfNeeded を呼ぶのが正解。知らんかったわー。

- ↓×これは間違い
 
```objc
[UIView animateWithDuration:0.3 animations:^{
    self.leftSpaceConstraint.constant = 430.f;
}];
```
- ↓○これが正解
 
```objc
// (※1) 
[self.view layoutIfNeeded];

// 値の変更はアニメーションブロックの外！
self.leftSpaceConstraint.constant = 430.f; 

// アニメーション実行
[UIView animateWithDuration:0.3 animations:^{
    [self.view layoutIfNeeded]; // <-- ココ注目！
}];
```

※1【5/28追記】
@dokubeko さんからご指摘頂きました。
「制約を変更する前に一度layoutIfNeededを実行して未適用の表示を確実に更新しておくこと」とアップル公式のセッションビデオにあるとのことです。確かにー！
ご指摘ありがとうございます！


iOS開発会議は毎週木曜渋谷beezで開催中です。
ご興味ある方はぜひー！
https://www.facebook.com/groups/407821455988195/
いい加減Composer使おうぜと思ったメモ


#Composerとは？
JSON形式で複数のライブラリやパッケージを管理できるPHP製の依存管理ツール。

nodeで言う「npm」、rubyの「bundler」的な存在。

#インストールする
##グローバルインストール
よくわからんならこれでいいかと思う。
```
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer
```


#準備
ルートディレクトリにcomposer.jsonを作る。
せっかくだからPHPUnitを入れてみよう。
```json
{
    "require-dev": {
        "phpunit/phpunit": "4.6.*",
        "phpunit/php-invoker": "*",
        "phpunit/dbunit": ">=1.2",
        "phpunit/phpunit-selenium": ">=1.2"
    }
}
```

##.gitignore
composerがgit管理下に色々持ってくるので、間違えてデプロイしないように監視外にしておく
```
vendor/
```

＊composer.jsonとcomposer.lockはメンバー全員が同じバージョン・ライブラリを使うためにもgit管理下に入れましょう
　→kamedon39さんありがとうございます！

#インストール！
```
composer install
```

これでvenderディレクトリにphpunitとその関連ライブラリがどさっとインストールされてます。
ファイルの存在チェック

チェックしたいファイルを列挙

```text:files.txt
foo/bar/a.txt
hoge
```

チェックスクリプト

```bash:check.sh
#!/bin/bash

for file in `cat -`
do
  if [ ! -e "${file}" ] ; then
    echo "NotFound ${file}"
  fi
done
```

実行

```bash
cat files.txt | sh check.sh
```
Linuxコマンドでユーザーのグループ確認・変更。

## ユーザーが所属しているグループ確認。
~~~ shell
# groups tetsuya
tetsuya : tetsuya
~~~

## ユーザーの所属グループをwheelに変更。
~~~ shell
# usermod -G wheel tetsuya
# groups tetsuya
tetsuya : tetsuya wheel
~~~

## グループwheelには誰が所属しているのか確認。
~~~ shell
# getent group wheel
wheel:x:10:tetsuya,hoge_user,foo_user
~~~
GrovePi の starter キットを始めようとして bus = smbus.SMBus(1) が IOError: [Errno 2] No such file or directory になったとき


#始めに
GrovePi の __FORUM__ がもの凄くクイックで、質問したら __28分__ で回答をもらえました！意味のある回答がかえってくるのに２週間ぐらい平気でかかって、その間こっちの開発が止まってしまうような有償サポートが当たり前なこの業界で、こういう素早さは本当にありがく感じます。私の場合、製品やサービスの機能、品質、性能よりもこのQAの”速さ”に魅力を強く感じることが多いというか、「これは使っても大丈夫だな」という安心感を感じます。

#原因
原因は python で smbus が使えるようになっていなかったからという... エラーメッセージちゃんと読めよ、と日本の殺伐としたメーリングリストだったら叱られそうな... 親切な Exadon さんに感謝！

#対応
教えて頂いた手順

```
sudo apt-get install python-smbus
sudo apt-get install i2c-tools
```

あと、raspi-config で I2C が enabled になっているかの確認

#参考URL
- 当該QAの[ポスト](http://www.dexterindustries.com/forum/?topic=grovepi-starter-kit-ioerror-with-led-brink-tutorial/#post-5517)
- [設定手順](https://drive.google.com/file/d/0B0WChwP4CnLBblJMZWM3MzhIT0k/view?usp=sharing)
- 試していてエラーになった LED blink の[チュートリアル](http://www.dexterindustries.com/GrovePi/projects-for-the-raspberry-pi/raspberry-pi-led-tutorial/)
- [GrovePi Starter Kit](http://www.dexterindustries.com/GrovePi/get-started-with-the-grovepi/grove-pi-starter-kit/)そのものの説明
- GrovePi Starter Kit の[発売元のページ](http://www.dexterindustries.com/site/?product=grovepi-starter-kit-raspberry-pi)、これだけそろって89$という嬉しさ。距離センサ、LCD に リレーまではいってるんですよね
- なぜか[秋月](http://akizukidenshi.com/catalog/g/gK-09168/)のほうが安い... しかも商品写真のセンスが日本的でかわいい
技術英語 > on a regular basis / on a need-to-know basis

定期的に、と言いたいとき
on a regular basis
が使える。

regularlyでもいいだろう。


[university of california](http://its.ucsc.edu/security/updates.html)
> ... to download operating system updates on a regular basis.


onとbasisで検索していて以下のものも見つけた (オックスフォード現代英英辞典)
> on a need-to-know basis
> with people being told only the things they need to know when they need to know them, and no more than that
> - Information will be released strictly on a need-to-know basis


regularで思い出したのは「常連」regular customer.
KVMをインストールする

# 前提条件の確認 
OS の仮想化を実現するには、CPU が Intel VT もしくは AMD-V に対応している必要があります。
対応しているかどうかを確認するには、次のコマンドを実行し、出力結果が0 にならないことを確認します。

```text
# egrep -c '(vmx|svm)' /proc/cpuinfo
```

# KVM のインストールと基本設定 
KVM 関連のパッケージをインストールします。

```text:RedHat系の場合
# yum install kvm virt-manager libvirt libvirt-python python-virtinst
```

```text:Ubuntuの場合
$ sudo apt-get install kvm virt-manager libvirt-bin bridge-utils
```

インストール完了後、KVM モジュールがインストールされていることを確認します。

```text
# lsmod | grep kvm
kvm_intel             143592  0
kvm                   459835  1 kvm_intel
```

TODO: 以下のコマンドの効果については要検証
ネットワーク仮想化のオーバーヘッドを減らすことができるvhost-net を有効にします。

```text:Ubuntu
# echo vhost_net >> /etc/modules
```

# kvm(libvirtd) の起動設定 
libvirtd を起動し、必要に応じてOS 起動時に自動的に起動するように設定します。

```text:RedHat系
# systemctl start libvirtd
# systemctl enable libvirtd
```



```text:Ubuntu
$ sudo service libvirt-bin start
$ sudo update-rc.d libvirt-bin defaults
```


libvirt が起動すると、デフォルトで仮想NAT インタフェースが作成されていることが確認できます。

```text
$ ip link show virbr0
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
    link/ether 52:54:00:63:13:ae brd ff:ff:ff:ff:ff:ff
```

# 次の記事
KVMブリッジネットワークの設定
http://qiita.com/TsutomuNakamura/items/e15d2c8c02586a7ae572

# 参考 

```text:IBMPowerKVM
http://www-01.ibm.com/support/knowledgecenter/linuxonibm/liabo/liabokickoff.htm
```
[Ruby]LevelDBでお手軽にKVS

Rubyで触ってみたメモです。

データの永続化、データの個数が多くなるほどファイル保存では苦しくなってきて、データベースを使うべきなんだけど、SQLiteのSQL文はつらく、KVSのお手軽さが嬉しいけどサーバーを立てたくないし、「鯖不要で動く手軽なKVSないかな………」と思ってたらありました。世界は優しい。

LevelDBはSQLiteのKVS版、といったところ。なんといってもサーバーが不要です。

```bash:OSXにインストール
$ brew install leveldb
$ brew uninstall snappy # やらないとエラー http://shokai.org/blog/archives/7078
$ gem install leveldb-ruby
```

## Example

[leveldb-ruby gem](https://github.com/wmorgan/leveldb-ruby)のおかげで、LevelDBを文字列専用のHashのように触ることができます。実にお手軽です。

```ruby:example.rb
require 'leveldb'

db = LevelDB::DB.new("test.db") # なければカレントディレクトリにtest.dbフォルダが作成される

db["first"] = "first text"      # Put
db["first"]      #=> "first text" Get
db.to_h          #=> {"first"=>"first text"}

db.delete("first") # Delete
db["first"]        #=> nil

# key valueは文字列しか使えないよ
db[123]         #=> TypeError
db["123"] = 789 #=> TypeError
```

他のオブジェクトが使いたいなら、シリアライズするとかJSON使うとか。


## 関連

- [LevelDB入門 (基本編) - from scratch](http://yosuke-furukawa.hatenablog.com/entry/2014/05/05/095207) (LevelDBのわかりやすい解説)


- [Rubotyのデータ永続化にLevelDBを使う - Qiita](http://qiita.com/nownabe/items/06977acec7f08133d8c9) (Linuxへのインストール手順など)
DocumentRootをシンボリックリンクにしているときのPassengerの設定


通常だと、VirtualHostのDocumentRootはシンボリックリンクにしないかと思いますが…

```bash:
$ echo "PassengerResolveSymlinksInDocumentRoot on" >> /etc/httpd/conf.d/passenger.conf
```

とかをするとシンボリックリンクでも有効になるようです。

## 参考

- [[Redmine Rails] Passenger がシンボリックリンクを解決してくれない | Javable.Jp](http://www.javable.jp/blog/530.html)

- [Phusion Passenger users guide, Apache version](https://www.phusionpassenger.com/documentation/Users%20guide%20Apache.html)
mac の PhpStorm に Laravel Plugin 入れてるのに Controller や View への補完が効かない時は、日本語入力切り替えや Spotlight のショートカットを見直すと良いかも

# 結論: `Ctrl + Space` が Spotlight のキーボードショートカットに奪われてないか確認する

`Ctrl + Space` が Spotlight のキーボードショートカットに奪われてるなら、解除してやる。

※`Cmd + Space` に割り当ててる人は、もしかしたら日本語入力切り替えで同様の現象が起きてるかも。

システム環境設定 > キーボード > キーボードショートカット > Spotlight から「Spotlight 検索フィールドを表示　^スペース」のチェックを外す。

これで、コード中で `Ctrl + Space` で補完が有効になる。

-----

## PhpStorm に Laravel Plugin を入れる

Preferences > Plugins > larave で検索して、'Laravel Plugin' を入れる。

で、 File > Invalidate Caches / Restart ... からリスタートする。(普通にリスタートでも問題ない。)

## 任意の Lravel Project を開いたら Laravel Plugin を有効にする

Preferences > Other Settings > Laravel Plugin から、「Enable plugin for this project」 にチェックを入れる。

※もし、 Laravel5 を使っていて、 blade をデフォルトのまま使ってるなら、 laravel4 からタグが変わったので、Preferences > Languages & Frameworks > PHP > Blade から、「Content tags」の値を「{!!」「!!}」、「Escaped tags」の値を「{{」「}}」にしておくと良い。

## コード補完のキーボードショートカット

`Ctrl + Space` でコード補完です。

何もしなくても、サジェストされるので忘れがちです。

※mac の PhpStorm の使い方で、「`Cmd + Space` でコード補完、」と、説明している文章をよく見ます(というか、JetBrains のドキュメントに書いてある)が、 `Ctrl + Space` がデフォルトのはず。(違ってたら指摘頂けると幸いです。。)

## 実際にコード補完してみる

例えば、

```app/Http/Controllers/CodeCopletionController.php

public function index()
{
    return view('ap');
}
```

という状態で、「'ap'」にフォーカスを当てたまま、`Ctrl + Space`すると、 views/ 以下のそれっぽいものを一覧で出してくれる。

他にも Redirect::action(), View::make() などなど。

※ redirect(), route(), trans(), config() の記述でもOK。

各々、対称となるものを一覧で出してくれる。

-----


PhpStorm + Laravel の便利な使い方

参考: https://confluence.jetbrains.com/display/PhpStorm/Laravel+Development+using+PhpStorm
pythonを初めてみる


![images.jpeg](https://qiita-image-store.s3.amazonaws.com/0/61297/0e1e915c-384c-471b-9f03-7717e06d45f4.jpeg)
Python is powerful... and fast;
plays well with others;
runs everywhere;
is friendly & easy to learn;
is Open.

# Pythonをはじめる前に
仕事でPythonを書いたりすることが多くなってきたのだが、知識がなくても意外と実装できたりと、Javaより読みやすいと感じる。

https://www.python.org/about/
上記のPythonのオフィシャルホームページにて、
> Pythonは強力かつ高速で、その他でうまくいき、どこでも実行でき、フレンドリで簡単に学べ、オープンである。

自画自賛かと思うのはとりあえずほっといて、簡単でイケてる言語ぽい。
Pythonについての知識があやふやだし、いい機会なので本格的に初めてみる。

# Ubuntu 15.04でPythonの実行環境を作ってみる
以下のリンクを参考にPython 3.4.3をインストールしてみる。
https://www.youtube.com/watch?v=aYUH08BM37g

[Ctrl]+[alt]+[t]でTerminalを開く。
Step1. OpenSSLのパッケージをインストール
`sudo apt-get install libssl-dev openssl`
Step2. optディレクトに移動
`cd /opt`
Step3. Pythonのオフィシャルホームページから最新のPythonの圧縮ファイルをダウンロード
`sudo wget python.org/ftp/python/3.4.3/Python-3.4.3.tgz`
Step4. 解凍する
`sudo tar -xzvf Python-3.4.3.tgz`
Step5. Python-3.4.3ディレクトリに移動
`cd Python-3.4.3`
Step6. configureを実行してMakefileを作成
`./configure`
Step7. コンパイルする
`make`
Step8. インストールする
`sudo make install`
Step9. ハードリンクを作成
`sudo ln -fs /opt/Python-3.4.3/python /usr/bin/python`

完了！

# とりあえず動かしてみる
Step1. お試しpythonスクリプトを作成。

```py3:sample.py
#!/usr/bin/env python

def main():
    print("Nanka nemui")

if __name__ == '__main__':
    main()
```

Step2. Terminalで実行

```
yuta@Aspire:~/Desktop$ python sample.py
Nanka nemui
```
でた

・Python ver 2.xとver 3.xってあるけど、その違いってなんだろう、、、
2.x系がずっとマイナーアップデートしてるぽいし、よくわからん
GentooのWebAppでApache入ってないよ的なFatal errorが出るとき

`emerge`の最後にこんなエラーが出る時

```shellsession
 * vhosts USE flag not set - auto-installing using webapp-config
 * This is an installation
 * FooBarWebApp-9999 is not installed - using install mode
 * Running /usr/sbin/webapp-config -I -h localhost -u root -d /FooBarWebApp FooBarWebApp 9999
* Fatal error: Your configuration file sets the server type "Apache"
* Fatal error: but the corresponding package does not seem to be installed!
* Fatal error: Please "emerge >=www-servers/apache-1.3" or correct your settings.
* Fatal error(s) - aborting
>=www-servers/apache-1.3
```

`/etc/vhosts/webapp-config`の`vhost_server`を適切なものに修正する。

```
# what web server are you using?
# your choices are:
#
# apache
# lighttpd
# cherokee
# nginx
# gatling

#
# you can override this setting by using the -s switch to webapp-config

vhost_server="nginx"
```
SSLSessionCache: 'shmcb' session cache not supported (known names: ). Maybe you need to load the appropriate socache m...he_shmcb?

Apache2.2の設定ファイルをApache2.4に移植しようとしたらこんなエラーが出ました。

```
SSLSessionCache: 'shmcb' session cache not supported (known names: ). Maybe you need to load the appropriate socache m...he_shmcb?
```


# 解決方法

`mod_socache_shmcb`というモジュールをロードすれば解決しました。

```
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
```

# 参考
http://damelog.com/computer/server-administration/apache/gentoo%E3%81%AEamd64%E3%81%ABapache-2-4-1%E3%81%8C%E6%9D%A5%E3%81%9F%E3%81%AE%E3%81%A7%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/
Python:lambdaでfoldl,foldrを作ってみる。あと時間計測とかも

Pythonをさわり始めたついでの演習問題。やってみる。
#foldl,foldr

```Python
box=lambda *x:x
unbox=lambda x:x[-1]
do=box
switch=unbox

foldl=(lambda f,acc,xs:
	switch(
		xs == [] and do( acc )
		or 		do( foldl(f, f(acc, xs[0]), xs[1:]) )
	)
)

foldr=(lambda f,xs,acc:
	switch(
		xs == [] and 	do( acc )
		or 		do( foldr(f, xs[:-1], f(xs[-1], acc)) )
	)
)

```
できた。結構素直にいけて拍子抜け。
いや、すごいH本カンニングしながらでした。自前ではとてもとても...
#自前計測ツール
元々あるreduceとかsumとかと比べてみる。
timeitというのが使えるそうだが、IDLE上でどうしていいか分からなかったので、自前で計測ツールを作ってみる。
まあ、何かの練習にはなるでしょう。

```Python
import time

measure_t=(lambda f , *arg :
	(lambda m_start = time.time() ,
		 m_stop = time.time :
			( f( *arg),
			m_stop() - m_start ,
			)[-1]
	 )()
   )
```
できた。
関数の実行のタイミングでプチはまる。

+ 計測したい関数fと引数*argを別に渡してここぞ！というときに実行。
+ その前で一回time.time()してm_startに代入しておく。
+ m_stopは定義だけしておいてf()実行後に実行。
+ 最後にかかった時間を返す。

適当に作った割には使いまわせそう。
#測ってみた。
```Python
>>> measure_t(foldl,lambda x,y:x+y,0,range(1,100))
0.00026679039001464844
>>> measure_t(foldr,lambda x,y:x+y,range(1,100),0)
0.000247955322265625
>>> measure_t(reduce,lambda x,y:x+y,range(100))
7.605552673339844e-05
>>> measure_t(sum,range(100))
6.198883056640625e-06
```

+ foldl,foldrは大体同じぐらい。
+ reduceはその三倍ぐらい速い。
+ sumはさらにその十倍速い。（独自調査）

おとなしく極力builtins使うのが吉。ということでしょうか...

以上です。
RustのDrop traitの確認

コード：

```rust
struct DropTest {
  id: u32,
}

impl DropTest {
  fn create(id: u32) -> DropTest {
     DropTest { id: id }
  }
}

impl Drop for DropTest {
  fn drop(&mut self) {
     println!("Dropping {}...", self.id);
  }
}

fn sample_func(_: &DropTest, _: &DropTest) {
   println!("sample_func");
}

fn main() {
  println!("Start main");
  {
     println!("Start block");
     let d = DropTest::create(1);
     sample_func(&DropTest::create(2), &d);
     println!("End block");
  }
  println!("End main");
}
```

結果

```shell-session
Start main
Start block
sample_func
Dropping 2...  →呼び終わったらdrop
End block
Dropping 1...  →block終わったのでdrop
End main
```
5問目を解いてみた

[5問目](http://www.softantenna.com/wp/software/5-programming-problems/)が流行ってたようなので書いた。本家より超頭が悪い総当たり。40分くらいだけど[オフラインどう書く](https://yhpg.doorkeeper.jp/)の会場だったら時間内に解ける気がしない。

```hs
module Main (main) where

import Control.Monad (forM_)

main :: IO ()
main = forM_ (map showCandidate answers) putStrLn

type Atom = (Char, String)
type Candidate = [Atom]

answers :: [Candidate]
answers = filter ((== 100) . calc) . filter (isplus . head) $ candidates

candidates :: [Candidate]
candidates = makeCandidate "123456789"

makeCandidate :: String -> [Candidate]
makeCandidate = makeCandidate' []

makeCandidate' :: String -> String -> [Candidate]
makeCandidate' [] [] = []
makeCandidate' ns [] = plusminus ns
makeCandidate' ns (x:xs) = ans1 ++ ans2
  where
    ans1 = do
      h <- plusminus (ns ++ [x])
      t <- makeCandidate xs
      return $ h ++ t
    ans2 = makeCandidate' (ns ++ [x]) xs

plusminus :: String -> [Candidate]
plusminus ns = [[('+', ns)], [('-', ns)]]

isplus :: Atom -> Bool
isplus ('+', _) = True
isplus _ = False

calc :: Candidate -> Int
calc = ($ 0) . foldr (\atom f -> hom atom . f) id

hom :: Atom -> Int -> Int
hom ('+', ns) = (+ (read ns))
hom ('-', ns) = (subtract (read ns))

showAtom :: Atom -> String
showAtom (c, ns) = c:ns

showCandidate :: Candidate -> String
showCandidate = tail . concatMap showAtom
```

リストモナドでdo記法が使えるのは楽。
telnetがない！そんな時に

Serverで作業していると、時々、telnetをtelnet用途以外で使いたい時ありますよね？ね？ね？

例えば、生でHTTPを喋りたい時、SMTPを喋りたい時、POP3を（ｒｙ

そこで、おもむろに、

```bash
$ telnet localhost 80
zsh: command not found: telnet
```

残念。そんな時は慌てない、慌てない。

```bash
$ python -m telnetlib localhost 80


```
ほら、telnetがなくても大丈夫！

たいていのLinux環境には標準でPythonはインストールされているはずなので、慌てなくてすみます。
お試しあれ。
Railsでjsonファイルのデータをdbに入れる

##はじめに
railsでwebアプリを作るにあたって利用したいjsonデータがある。
これをdbにどかんと入れたい。

##db>seeds.rbを使う
dbフォルダ直下にあるseeds.rbは、railsアプリのデータベースにデータを投入するやつ。

```shell-session
$ rake db:seed
```
のコマンドでデータを投入することができる。
例えば、hogeモデル（hogesテーブル）に新しいレコードを入れる時は、
seeds.rbに、

```rb:db>seeds.rb
Hoge.create( column1:"セル1", column2:"セル2", column3:"セル3")
```
と書いてやる。

そして、

```shell-session
$ rake db:seed
```
してやるならば、

```
$ rails dbconsole 
SQLite version 3.7.13 2012-07-17 17:46:21
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>.tables
hoges              schema_migrations
sqlite>select * from hoges;
1|セル1|セル2|セル3|2015-05-24 04:03:24.555191|2015-05-24 04:03:24.555191
```
となる。
入った。

##seeds.rbを使って、jsonファイルから一気に読み込む
あとは、seeds.rbをうまいように書けばいいだけ。
投入するjsonファイルはこんな感じ。

```json:hoge.json
[
{"key1":"value1-1", "key2":"value2", "key3":"value3", "key4":"value4",},
{"key2":"value2-1", "key2":"value2-2", "key3":"value2-3", "key4":"value2-4",},
....
]
```
ここから、key1とkey4の値を取り出して、dbのhogesテーブルに投入するためのseeds.rbは、

```rb:db>seeds.rb
# ActiveSupport::JSONを使ってhoge.jsonをデコードしてrubyオブジェクトに変換。変数jsonに展開
json = ActiveSupport::JSON.decode(File.read('hoge.json'))

# 変数jsonに入った配列状態のjsonデータを一つ一つ取り出して、モデル.createを使ってdbに投入
json.each do |data|
  Hoge.create(column1:data['key1'], column2:data['key4'])
end
```
こんな感じ。

すると、dbのhogesテーブルはこうなる。

```shell-session
$ rails dbconsole 
SQLite version 3.7.13 2012-07-17 17:46:21
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>.tables
hoges              schema_migrations
sqlite>select * from hoges;
1|value1-1|value1-4|2015-05-24 04:03:24.555191|2015-05-24 04:03:24.555191
2|value2-1|value2-4|2015-05-24 04:03:24.555191|2015-05-24 04:03:24.555191
3|value3-1|value3-4|2015-05-24 04:03:24.555191|2015-05-24 04:03:24.555191
...
n|valuen-1|valuen-4|2015-05-24 04:03:24.555191|2015-05-24 04:03:24.555191
```
たくさん入っている。

##おわりに
これで、大量のデータも投入することができるようになりました。

##参考
https://gist.github.com/shvetsovdm/6317604
http://www.rubylife.jp/rails/model/index10.html
http://railsdoc.eiel.info/active_support/json/
MacOSX Terminal で天気予報表示 - wego

# MacOSX Terminal で天気予報表示 - wego 

# 概要

wegoというソフトウェアをインストールしてTerminal上に天気予報表示します。
※wegoはGoで作られたオープンソフトウェアです。

# 導入手順

## go インストール

以下gistを参考にしてください。
<https://gist.github.com/kenzo0107/5b6caeea10e036675d4c>

## wego インストール

```
$ go get github.com/schachmat/wego
```

※go get は goのパッケージマネージャです。
`go get <package>`のように利用します。

※pythonのpipと同様です。


実行してみると

```
$ wego
```

.wegorc にAPIキー設定しろと怒られる。
README読んでよって罵られる。


## WORLD WEATHER ONLINE に登録

以下サイトにアクセスしてください。
<https://developer.worldweatheronline.com/auth/register>

※Facebook, Gitアカウントで登録可能です。

さりげなくレスポンシブサイト

![WORLD WEATHER ONLINE](http://i.imgur.com/kKL6yBt.png) 


登録するとメールアカウントにメールが届きます。
以下リンクをクリックして登録完了です。

![mail](http://i.imgur.com/9WIvqLv.png) 



## Free-Weather-API-V2 の Key 取得

WORLD WEATHER ONLINE にログインした後
[Get a new key for this API]ボタンクリックしてkey取得してください。


## ~/.wegorc 編集

APIKey : 取得したAPIを設定してください。
City : 都市を指定してください。

※細かい設定、千葉県長生郡長生村なんてのはできなかったです(TへT)

```
{
        "APIKey": "xxxxxxxxxxxxxxxxxxxxxxx",
        "City": "Tokyo",
        "Imperial": false
}
```

## 実行

`wego` と入力すると天気予報が表示されます♪

 ```
 $ wego
 ```

 ![wego image](http://i.imgur.com/QO8yZQh.png)
 

ひとつ上のオトコへ
HHVMをCentOS6.5 - lamp - Wordpress環境で動作させた時のメモ

facebookが開発したというPHPのJITコンパイラー環境「HipHop Virtual Machine」をさくらVPS上で動かした時のメモ。

以前のコンパイラーであるHipHopforPHPは実行させるまでかなり面倒が重なったり、ワードプレスがなかなか動かなかったので諦めていましたが、今回は期待大でした。

サーバ上で複数ドメインを名前ベースで運用しており、全て動かすことを念頭に、、

まずはyumでhhvmをインストール。

> \# cd /etc/yum.repos.d
> \# wget http://www.hop5.in/yum/el6/hop5.repo
> \# sudo yum install hhvm
> \# sudo yum update hiphop-php

Apacheのバージョンが2.2系のためfastcgiを入れる。

> \# yum install mod_fastcgi --enablerepo=rpmforge

/etc/httpd/conf.d/fastcgi.confを編集

> User apache
> Group apache
> LoadModule fastcgi_module modules/mod_fastcgi.so
> DirectoryIndex index.php
> \<IfModule mod_fastcgi.c\>
> \<FilesMatch \.php$\>
>   SetHandler hhvm-php-extension
>   \</FilesMatch\>
>   Alias /hhvm /hhvm
>   Action hhvm-php-extension /hhvm virtual
>   FastCgiExternalServer /hhvm -host 127.0.0.1:9000 -pass-header Authorization -idle-timeout 300
> \</IfModule\>

/etc/hhvm/php.iniに追加　↓

> date.timezone = "Asia/Tokyo"

コマンドを打ってhhvmを常駐させる

> \# hhvm --mode daemon -vServer.Port=9000 -vServer.Type=fastcgi -vServer.FixPathInfo=true -config /etc/hhvm/config.hdf

このままだと既存のApacheのモジュールPHPが動いたままなので、/etc/httpd/conf.d/php.confをそのまま削除して無効にする。

デーモンを再起動してもいいが、OSを再起動することに。

> \# reboot

phpinfo.phpにアクセスすると、見事「hiphop」とだけ表示される。(セコい)

名前ベースで複数ドメインをWPで立ち上げていましたが、全て問題無く動作しました！

その他、/etc/init.dにhhvmスクリプトがあるので、自動スタート設定を作る。

* * *
*ab等のツールで測っていませんが、表示・レンダリングの感じがとても速くなり、楽にブラウズできると実感しました。*
Handlebarsことはじめ



```
npm install handlebars

handlebars

handlebars: command not found

パスが通っていないので
./node_modules/.bin/handlebars
```

文法は公式を参照
 [Handlebars.js: Minimal Templating on Steroids](http://handlebarsjs.com/)

いい感じに名前空間くぎってのコンパイルの仕方はnpmリポジトリ参考
[npm : gulp-handlebars](https://www.npmjs.com/package/gulp-handlebars)

ことはじめるまでもありませんでした。


・・・なんですが、一つだけ。
今回初めてjavascriptテンプレートというものを使ったのであんまり空気感がわかってませんでしたが、handlebarsはifの制御構文は記述できるものの、評価に式を使う事はできないというのはちょっと戸惑います。

```
OK
{{#if something }}
<p>hogehoge</p>
{{/if}}

NG
{{#if (num > 10) }}
<p>hogehoge</p>
{{/if}}

```

公式によると `false`,`undefined `,`null`,`0`,`""`,`[]`以外はture扱いという事らしいです。
テンプレートに流す前に評価してやらないといけないと言う事ですね。まぁつまりロジックはロジック側でということらしいです。

ちなみに、handlebarsではこのifなどの制御構文はHelper関数で定義していて、さらに自作のHelper関数を追加できます。ということは式を評価するifっぽいのつくれるのでは？

```javascript
Handlebars.registerHelper('myif', function(val1,operator,val2, opt) {
  var cond;

  if ( operator === '===' )
  {
    cond = val1 === val2;
  }
  else if ( operator === '!==' )
  {
    cond = val1 !== val2;
  }
  else if ( operator === '==' )
  {
    cond = val1 == val2;
  }
  else if ( operator === '!=' )
  {
    cond = val1 != val2;
  }
  else if ( operator === '>' )
  {
    cond = val1 > val2;
  }
  else if ( operator === '>=' )
  {
    cond = val1 >= val2;
  }
  else if ( operator === '<' )
  {
    cond = val1 < val2;
  }
  else if ( operator === '<=' )
  {
    cond = val1 <= val2;
  }

  if (cond) {
    return opt.fn(this);
  } else {
    return opt.inverse(this);
  }
});
```

```sample.hbs
{{#myif num1 ">=" num2}}
<p>TRUE!</p>
{{else}}
<p>FALSE!!</p>
{{/myif}}
```

```index.html
// sample.hbsをコンパイルした後
var html1 = Handlebars.templates['sample.hbs']({
  num1 : 10,
  num2 : 20,
});

console.log(html); // <p>FALSE!!</p>

```

とまぁ簡単にできますが、こういうことをしてテンプレートにロジックを持って行くのが良くないという思想だと思いますので良くない気がします。以上。

### special thanks
+ [Handlebars.jsの基本的な使い方のメモ - console.lealog();](http://lealog.hateblo.jp/entry/2012/12/09/093059)
Yii2設定（メモ）

> LAMP CentOS6.6 2015.5.27

#Composerをインストール

```
$ curl -s http://getcomposer.org/installer | php
$ sudo mv composer.phar /usr/local/bin/composer
```
インストール済みの場合、composerをアップデータする。

```
$ composer self-update
```
#phpバージョン確認

```
$ php -v
```
php5.4以上の環境が必要のため、状況によってアップデートを実施しておく。
##phpアップデート
デフォルトではphpの情報が古いようで、yumの対象レポジトリを拡張する。

```
$ rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
$ rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ rpm -Uvh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
```
レポジトリを確認する

```
$ ll /etc/yum.repos.d/
```
phpをアップデートする

```
$ yum --enablerepo=epel,remi,rpmforge info php
$ yum --enablerepo=epel,remi,rpmforge update php
```
バージョンの再確認

```
$ php -v
```
#Yii2インストール
先ず、composerでbower、npmパッケージを管理できるようプラグインをインストール

```
$ composer global require "fxp/composer-asset-plugin:1.0.0"
```
※一度実行すればオッケー。しかしphp環境が変わったら再度実行する必要はある気がする。
次に、webアクセス可能なフォルダに移動してYii2をインストールする

```
$ cd /var/www/html
$ composer create-project --prefer-dist yiisoft/yii2-app-basic basic
# github access token is needed to input
```
basicフォルダにYii2がインストールされる。
#Yii2確認
webサーバーを再起動必要がある。

```
$ service httpd reload
```
ブラウザに、
> http://***.**.**.***/basic/web/index.php

Congratulations!画面が表示されれば成功！
CSSベタープラクティス殴り書き　

ベターなプラクティスについて __アンチパターン__ 含めて考えてみる。

## 項目

* セレクタの適応範囲が必要以上に広くない
* セレクタの詳細度ができるだけ小さく保たれている
* セレクタに不必要な要素名（タグ名）での指定がない

### セレクタの適応範囲が必要以上に広くない

```css
/* Bad */
span {
  color: red;
}
```

上記例ではページ全てのspanに影響を及ぼす。対象となる箇所をコーディングしている時だけは問題なくとも、あとあと大きな障害となる

```css
/* Good */
.warning {
  color: red;
}
```

必要な箇所のみが対象となるよう、CSSを設計する

### セレクタの詳細度ができるだけ低く保たれている

あるセレクタの詳細度が高い場合、そのスタイルを打ち消すためにさらに詳細度の高いセレクタが追加される傾向がある

```css
/* Bad */
#main .list {
  margin: 0;
}

/*　これは有効にはならない　*/
.list {
  margin: 0 0 20px 0;
}

/*　さらにクラスを追加して対応してしまう　*/
#main.category01 .list {
  margin: 0 0 20px 0;
}

/*　その場限りの対応を続けるうちに複雑なセレクタが増えていく　*/
#main.category01 #nav .list {
  margin: 0 0 20px 0;
}

/*
 最悪なパターン
 詳細度が高い
 範囲が広範囲である
*/
#wrapper ul {
  margin: 0 0 20px 0;
}
```

```css
/* Good? */
.list {
  margin: 0;
}

/*　必要最低限の追加で対応　*/
.list.list--hoge {
 margin: 0 0 20px 0;
}
```
### セレクタに不必要な要素名（タグ名）での指定がない

```css
/* Bad */
nav.list {
  margin: 0;
}
```

上記のようなセレクタでは要素名(nav)は必要ない。必要のない詳細度があがってしまう。

```css
/* Good */
.list {
  margin: 0;
}
```

クラス名のみで十分である。


```css
/*
  クラス、要素名でごちゃごちゃ
  要素名は必要ない
  こういう場合liは必要ないけど書いてしまいがち
*/
div.mainContent ul.list li a.blank {
  margin: 0;
}

/* リファクタリング! */
.mainContent .blank {
  margin: 0;
}

/* もしくは */
.blank {
  margin: 0;
}
```

ただし、以下のような場合はOK

```css
.gnav a {
  display: block;
}
```

```html
<ul class="gnav">
  <li><a>メニュー1</a></li>
  <li><a>メニュー2</a></li>
  <li><a>メニュー3</a></li>
</ul>
```

要素名をセレクタに含めても影響範囲が狭く保たれている、またHTMLの構造も大きく変更されることがない。
Rubyの変数「宣言」

Rubyには明示的な変数宣言の構文はありませんが、それでも無秩序に使えるわけではありません。また、Rubyには大きく分けて4種類の変数がありますが、それぞれごとに挙動が少しずつ違っています。

# グローバル変数
Rubyの場合、グローバル変数は`$`で始まります。グローバル変数へ代入せずにいきなりアクセスすると、エラーが発生することはなく、`nil`値が入っているものとみなされますが、この挙動に頼るのは行儀がよくない、とのことです。

# インスタンス変数
Rubyの場合、インスタンス変数は`@`1つで始まります。これまた、未初期化でも`nil`としてアクセス可能です。

# クラス変数
Rubyの場合、クラス変数は`@@`で始まります。クラス定義で初期化できる[^1]からかどうかはわかりませんが、未定義へのクラス変数へのアクセスは`NameError`を引き起こします。

# ローカル変数
ローカル変数は特にプレフィックスがありませんが、メソッド名と同じ形で、しかも引数のないメソッドはカッコを省略できると来たものなので、微妙にややこしくなります。一度も代入していない名前を参照した場合、それはメソッド呼び出しとみなされます[^2]。代入すると、（メソッド呼び出しの引数がない）その名前はローカル変数として処理されますが、空のカッコを付けることでメソッドの方を呼び出すことも可能です。

```rb
# Kernel#rand…乱数を返すメソッド
p rand #0から1の乱数値（小数）

rand=2

p rand #変数のほうが読まれて2となる

p rand() #メソッド呼び出し

p rand 3 #カッコがなくても引数があればメソッドと解釈される
```


[^1]: クラス定義中に`@foo=5`のようなものを書くと、それはクラスインスタンス変数として処理されます。
[^2]: さらにそこで`method_missing`が加わると、一歩間違えれば[悲惨なこと](http://qiita.com/kidach1/items/75ae4a29c99a79816384#2-4)になります。
FreeBSDがXenのDom0になれるらしいので試してみた #1

Dom0環境構築

Xen4.5とFreeBSD 11-currentの組み合わせでDom0として動くようです。
まだ開発途上なので色々と未実装、制限事項ありますが、試す分には充分以上に動きます。
EPT, IOMMU をサポートするCPU, マザーボードが必須です。

http://wiki.xen.org/wiki/FreeBSD_Dom0
https://wiki.freebsd.org/FreeBSD/XenNG
http://wiki.xen.org/wiki/FreeBSD_PVH
https://lists.freebsd.org/pipermail/freebsd-xen/2015-May/002391.html

## ためしてみる
ハードウェアは、自作機
CPU: Xeon E3 1265Lv2
MB:  Asus P8B WS (C206チップセット)
メモリは NonECC 32GB

```shell-session:FreeBSDのバージョン
%uname -v                                                  [~]
FreeBSD 11.0-CURRENT #0 r283309: Sun May 24 01:30:32 JST 2015     root@:/usr/obj/usr/src/sys/GENERIC 
```

## FreeBSDのインストール
OSのインストール手順は割愛します。
-current を入れるという事だけど、配布されているスナップショットイメージを使ったらコンパイル作業中にカーネルパニックが多発して作業にならなかったので、10.1-STABLEをインストールしてから11-currentに更新しています。

## Xen環境の作成
色々と設定しますが、見落としがちなのは主に以下の3点かと思います。

- BIOS設定で VT-d が有効になっている事
- login.conf の設定
- if_tap.koのロード

`emulators/xen-kernel` `sysutils/xen-tools` をインストールしますが、`emulators/xen` がこれらのメタポートになってますので、これを入れます。
xen-kernel の pkg-messages に必要な設定が載っていますので、これに従い設定を行ってください。

```shell-session:console
% sudo portmaster emulators/xen
...
% cat /usr/ports/emulators/xen-kernel/pkg-message
Please add the following entries in order to boot the xen kernel

in /etc/sysctl.conf:
        vm.max_wired=-1

in /etc/ttys
        xc0     "/usr/libexec/getty Pc"         xterm   on  secure

In /boot/loader.conf for a dom0 with 2G memory and 4 vcpus
        xen_kernel="/boot/xen"
        xen_cmdline="dom0_mem=2048M dom0_max_vcpus=4 dom0pvh=1 com1=115200,8n1 guest_loglvl=all loglvl=all"

Add
        console=com1 to the above xen_cmdline in order to activate the serial console

In /boot/menu.rc.local
        try-include /boot/xen.4th
```
サンプルではDom0のメモリが 2GBですが、ZFSを使うなら 4GB以上割り当てておいたほうが良いと思います。
上記に記載はありませんが、追加で設定を行います。

- /etc/login.conf で、memorylocked の値を unlimited に設定
- if_tap.ko を起動時にロード

login.confを編集し、memorylocked の項目を unlimited に変更し、`cap_mkdb` コマンドでDBに書き込んで内容をシステムに反映させます。

```shell-session:login.conf
% sudo vi /etc/login.conf
...
default:\
...
        :memorylocked=unlimited:\
...
root:\
...
        :memorylocked=unlimited:\
...
daemon:\
...
        :memorylocked=unlimited:\
...
% sudo cap_mkdb /etc/login.conf
```

if_tap.koを起動時に読み込むように、/boot/loader.conf に `if_tap_load="YES"`の行を記載します。

```file:loader.conf
% cat /boot/loader.conf
kern.geom.label.gptid.enable="0"
zfs_load="YES"
xen_cmdline="dom0_mem=4096M dom0_max_vcpus=4 dom0pvh=1 com1=115200,8n1 guest_loglvl=all loglvl=all"
xen_kernel="/boot/xen"
if_tap_load="YES"
```

システムを再起動すると、Xen Dom0 として FreeBSD が起動してきます。
ゲストのセットアップ等、xl コマンドの使い方自体は変わりません。

躓いた点を挙げると、
OS起動時にパニックする
=> BIOSでVT-d、IOMMU、EPT あたりが無効になっている
ゲストの起動時にエラー
=> login.conf の設定漏れ
=> if_tab.ko がロードされていない
でした。

Windows 8.1Proを入れてみましたが、問題なく動作しています。
:primary_keyと:foreign_keyを同時指定して、主キーではないけど共通なカラム同士で関連付けする

（Rails + MySQL を想定しています）

↓のような3TBLがあるとする

```rb
class CreateAtbl < ActiveRecord::Migration
  def change
    create_table :atbls do |t|
      t.string :name
    end
  end
end

class CreateBtbl < ActiveRecord::Migration
  def change
    create_table :btbls do |t|
      t.string :name
      t.integer :b_a_id  # AテーブルのIDを保持
    end
  end
end

class CreateCtbl < ActiveRecord::Migration
  def change
    create_table :ctbls do |t|
      t.string :name
      t.integer :c_a_id  # AテーブルのIDを保持
    end
  end
end
```
```rb
class Atbl < ActiveRecord::Base
  has_many :btbls, foreign_key: "b_a_id"
  has_many :ctbls, foreign_key: "c_a_id"
end

class Btbl < ActiveRecord::Base
  belongs_to :atbl, foreign_key: "b_a_id"
  
  ### ここに Ctbl との has_many を定義したい ###

end

class Ctbl < ActiveRecord::Base
  belongs_to :atbl, foreign_key: "c_a_id"
end
```
```
# atbls
id	name
1	A1

# btbls
id	name	b_a_id
2	B1      	1

# ctbls
id	name	c_a_id
3	C1      	1
```

__Bテーブル => Cテーブルの`has_many`関連__ をどう設定するか？

## `has_many :ctbls, through: :atbl`を使う
* BテーブルとCテーブルはお互いにAテーブルのIDを保持しているので、`:through`でAテーブルを経由すれば紐付く

```rb
class Btbl < ActiveRecord::Base
  belongs_to :atbl, foreign_key: "b_a_id"

  has_many :ctbls, through: :atbl # ★★★
end
```

```
[Ruby2.2.2][Rails4.2.1](beers|test_arel)> bdata = Btbl.find(2)
  Btbl Load (0.2ms)  SELECT  `btbls`.* FROM `btbls` WHERE `btbls`.`id` = 2 LIMIT 1
+----+------+--------+
| id | name | b_a_id |
+----+------+--------+
| 2  | B1   | 1      |
+----+------+--------+
1 row in set

[Ruby2.2.2][Rails4.2.1](beers|test_arel)> bdata.ctbls
  Ctbl Load (0.3ms)  SELECT `ctbls`.* FROM `ctbls` INNER JOIN `atbls` ON `ctbls`.`c_a_id` = `atbls`.`id` WHERE `atbls`.`id` = 1
+----+------+--------+
| id | name | c_a_id |
+----+------+--------+
| 3  | C1   | 1      |
+----+------+--------+
1 row in set
```

しかし、 __お互い同じ内容のカラムを保持しているのにわざわざ経由テーブルと `INNER JOIN` するのは無駄__
`btbls.b_a_id` と `ctbls.c_a_id` を直接結合したい


## `has_many :ctbls, primary_key: "b_a_id", foreign_key: "c_a_id"`を使う
* `has_many :紐付け先, primary_key: "自TBLの結合用カラム", foreign_key: "紐付け先TBLの結合用カラム` と書くと良い

```rb
class Btbl < ActiveRecord::Base
  belongs_to :atbl, foreign_key: "b_a_id"

  has_many :ctbls, primary_key: "b_a_id", foreign_key: "c_a_id" ## ★★★
end
```

```
[Ruby2.2.2][Rails4.2.1](beers|test_arel)> bdata = Btbl.find(2)
  Btbl Load (0.2ms)  SELECT  `btbls`.* FROM `btbls` WHERE `btbls`.`id` = 2 LIMIT 1
+----+------+--------+
| id | name | b_a_id |
+----+------+--------+
| 2  | B1   | 1      |
+----+------+--------+
1 row in set

[Ruby2.2.2][Rails4.2.1](beers|test_arel)> bdata.ctbls
  Ctbl Load (0.4ms)  SELECT `ctbls`.* FROM `ctbls` WHERE `ctbls`.`c_a_id` = 1
+----+------+--------+
| id | name | c_a_id |
+----+------+--------+
| 3  | C1   | 1      |
+----+------+--------+
1 row in set
```

* __`INNER JOIN`してないのでパフォーマンス的に`:through`するよりも有利__
    * ただし経由テーブルにデータが存在することがMUST、という場合には当然`:through`すべき

`:through`の使い方で疑問に思うことがあったので、調査メモとして残しとく
Facebook Analytics for Apps 導入リファレンス

# Facebook Analytics for Apps
[Facebook Analytics for Apps](https://developers.facebook.com/docs/analytics)は、2015年03月にリリースされたアプリ向けの解析ルーツです。

```
Facebook Analytics for Appsは、あなたのアプリをどのようにユーザーが使用しているのかを、より理解するのに役立ちます。毎日アプリを起動するユーザー数 や、アプリ内課金ユーザー数といった主要なアクションを俯瞰するための数多くのグラフで構成されています。(サイト説明文より)
```

![image](https://qiita-image-store.s3.amazonaws.com/0/41255/363cc464-701f-8f85-cac1-273b2bddf5f3.png)


# 主な機能
### 主要数値のダッシュボード表示(数値とグラフ)
アプリのインストール数、利用ユーザー数、課金者数、課金数などの主要な情報がグラフなどで可視化され、それが一覧で見られます。

### デモグラフィック分析
Facebookの会員情報を活用し、アプリを使用しているユーザーのデモグラフィック(人口統計)分析ができます。
89％の正確性を誇るFacebookの会員情報に基づいているため、他の推計情報よりも正確なデータであることが期待できます。

### セグメント分析
先月インストールした男性ユーザーといった「セグメント」を任意に作成し、その「セグメント」がアプリ内でどのように動いたか、という分析ができます。

### コホート分析
インストール後の継続率などの分析が可能です。
インストールした人 => 起動する といった「誰が(=ユーザー郡=コホート)、次に何をした」という条件を指定し、そのユーザー郡が行動に至った割合を分析できます。

### ファンネル分析
インストール => 商品ページ => カート => 購入 といった「ユーザー流れ」を任意で指定し、その途中でどの程度離脱していくのか、という分析ができます。

# SDKの導入
+ Analytics専用のSDKはなく、Facebookが既に用意している【Facebook SDK】を導入することでAnalyticsも使えるようになります。

|OS|紹介ページ|SDK本体|ドキュメント|導入手順|
|:----:|:----:|:----:|:----:|:----:|
|iOS|[■](https://developers.facebook.com/docs/ios)|[■](https://developers.facebook.com/resources/facebook-ios-sdk-current.pkg)|[■](https://developers.facebook.com/docs/reference/ios/)|[■](https://developers.facebook.com/docs/ios/getting-started)|
|Android|[■](https://developers.facebook.com/docs/android)|[■](https://developers.facebook.com/resources/facebook-android-sdk-current.zip)|[■](https://developers.facebook.com/docs/reference/android/current)|[■](https://developers.facebook.com/docs/android/getting-started) |

+ Facebook SDKの導入にあたっては、Facebook Developerアカウントへの登録が必要です。
+ 既にFacebook SDKを導入されている場合は、[こちら](https://www.facebook.com/analytics)からレポートの閲覧ができます。

# Analytics導入にあたって必要な設定
アナリティクスに表示される元データをFacebookサーバーに送信するため、「イベント」を設定する必要があります

## iOS / [ヘルプページ](https://developers.facebook.com/docs/app-events/ios)
+ アプリがアクティベーション(起動)されたことを通知するイベントと、アプリ内で課金が発生したことを通知するイベントを設定します。
+ iOSでは、Facebook Devbelopersページの設定を変更することで、アプリ内課金を**すべて自動で**取得することが可能です。[詳細はこちら](https://developers.facebook.com/docs/app-events/faq#auto_in_app_purchase)
+ その他、「アプリ内検索」や「チュートリアル完了」などが、プリセットイベントとして用意されています。※「Events」という項目に一覧テーブルが記載されています。

## Android / [ヘルプページ](https://developers.facebook.com/docs/app-events/android)
+ iOSと同様に、起動と課金のイベントを設定します。
+ Androidにはアプリ内課金の自動取得は用意されていませんので、課金のタイミングでイベントデータの送信が必要です

# 参考
+ [スライド資料](http://www.slideshare.net/adinnovationtokyo/facebook-analytics-for-apps)
iOS開発/CocoaPods導入手順/Swift


# 最初に
プロジェクト配下で

```
```

```
$ pod init
```

できなかったら

```
$ sudo gem install cocoapods
```
またはiTerm再起動

# CocoaPodsインストール
```
$ pod install
```
これでprjフォルダ以下に```Podfile```ができる。

# ライブラリ追加
```Podfile
# Uncomment this line to define a global platform for your project
# platform :ios, '6.0'
use_frameworks!

target 'mapple-pass' do
  pod 'Alamofire'
  pod 'SwiftyJSON'
end

target 'mapple-passTests' do

end
```

cocoapodからライブラリインストール(bundlerでいうbundle install)

```
Pod install
```

# ライブラリ検索
https://cocoapods.org/

# プロジェクトを開くとき
オブジェクト配下のワークスペースを開く

# error
```
[!] Pods written in Swift can only be integrated as frameworks; this feature is still in beta. Add `use_frameworks!` to your Podfile or target to opt into using it.
```

```Podfile
use_frameworks!
```

```
pod install
```
できたら、ワークスペースできた。
次からhoge.xcworkpaceで開きましょう。
↓podsができます。
![スクリーンショット 2015-05-27 22.39.02.png](https://qiita-image-store.s3.amazonaws.com/0/47874/a8017f57-b6de-39ab-82a8-a63bc70ccacc.png)


# 参考
http://www.raywenderlich.com/64546/introduction-to-cocoapods-2
http://hajipion.com/1066.html