OmniAICreator/Qiita-1.07M huggingface dataset:
sendmail tips relay先の冗長化とか再送間隔とか。

たまーにしかやらないので忘れないようにする場所。


## めっちゃ参考になるところ
http://www.rinneza.com/junya/tech/solaris8_x86/sendmail_8.12.10_cf_setup.html
http://blog.azumakuniyuki.org/2011/08/4-ways-to-relay-email-from-sendmail-to.html
http://www.gadgety.net/shin/tips/unix/sendmail.html

## メールゲートウェイを複数指定する

### sendmail.mcで指定する場合

:区切りで複数指定すると、左から順に接続を試みます。
全部ダメならmqueueに溜め込み、設定された再送間隔に則ってリトライします。

```sendmail.mc
define(`SMART_HOST', `mailer:hostname')dnl

ex. define(`SMART_HOST', `maingateway.ne.jp:subgateway.ne.jp:smtp.sendgrid.ne.jp')dnl
```

### mailertableで指定する場合

FEATURE(`mailertable')で使えるmailertable。
,区切りで複数指定できます。

```mailertable
hoge.ne.jp     smtp:[maingateway.ne.jp,subgateway.ne.jp,smtp.sendgrid.ne.jp]
.hoge.ne.jp     smtp:[maingateway.ne.jp,subgateway.ne.jp,smtp.sendgrid.ne.jp]
```

## 特定の宛先以外のメールを送信させない

### mailertableで制御する

FEATURE(`mailertable')で使えるmailertable。
*hoge.ne.jp宛のメールのみ送信。残りは/dev/nullに捨てます。

mailertableはsendmail.cfのrelay設定より先に評価されるので、ここで捨てておけば余計なメールが飛ぶことはありません。

```mailertable
hoge.ne.jp     smtp:[maingateway.ne.jp,subgateway.ne.jp,smtp.sendgrid.ne.jp]
.hoge.ne.jp    smtp:[maingateway.ne.jp,subgateway.ne.jp,smtp.sendgrid.ne.jp]
.              local:trash
```

## mailertableとsendmail.cfの評価順

mailertableはsendmail.cfのrelay設定より先に評価されます。


## 再送間隔

何らかの理由でメールが送信できなかった場合、
mqueueに溜め込み、設定された再送間隔に従って再送信を試みます。
デフォルトでは30分。

```sendmail.mc
define(`confMIN_QUEUE_AGE', `30m')dnl
define(`confTO_HOSTSTATUS', `30m')dnl
```


queueに入ってから一定期間経過したメールは再送を諦め、返送されます。
デフォルトでは5日。
設定値は下記。

```sendmail.mc
define(`confTO_QUEUERETURN', `5d')dnl
```

## 再送間隔(2)

なんらかの理由によりqueueで配送待ちとなっているメールの再送間隔。
前述したHOSTSTATUSとの優先順位などはわからっていない。←必要になったら調べます。

```bash:/etc/sysconfig/sendmail
QUEUE=1h
1mなら1分
```

## テスト
### 再送間隔

ちゃんと設定通りの間隔でメール再送を行うかを確認するため、
メールをすぐ配信せずにqueueに入れる。
DeliveryMode=qオプションを使えばOK。

```bash
echo "5mintest" | sendmail -ODeliveryMode=q atesaki@mail.domain.com
```

## sendmail.mcとsendmail.cf

sendmail.mcはsendmailの設定ファイルの元。
sendmail.mcからm4コマンドでsendmail.cfを作成します。

```bash
m4 sendmail.mc > sendmail.cf
出来たsendmail.cfを設定置き場に上書いてから(ex. cp -i sendmail.cf /etc/mail/ )
その後restart
/etc/init.d/sendmail stop
/etc/init.d/sendmail start
```
clone()したものを削除する

# 既存のDOMを再利用して不要になったら削除するやり方
それ用のメソッドが無かったので、パッと思いついた簡単な方法はこんなの。

```main.js
//cloneと同時に適当なclass名を付与する
$('.obj').clone().insertAfter(this).addClass('cloned');
//不要になったらそのclass名を指定してremove();
$('.cloned').remove();
```
sbatchコマンドTips

# 実行ノード数とCPU数の指定の関係
sbatch コマンドのオプションについて、

　「-N」は実行ノード数（並列数）の指定
　「-n」はCPU数（プロセス数）の指定

なのだが、これを両方指定した場合の関係について質問を受けたので、
せっかくだから書いておこう。正解は、

　「-n」で指定されたCPU数（プロセス数）が、
　「-N」で指定された実行ノード数（並列数）で均等に割られ、並列処理される

である。
例えば、

　-n 30 -N 5

と指定した場合は、1 ノード当たり 6 プロセスの並列計算となる。
rubyでマイナス数値を判別する方法

https://www.ruby-forum.com/topic/111045
この一連の流れは面白い。
最後のオチ必見

大昔に見てそれから探せられなかった。
「Railsで `negative?`ってあったかな？」と思って探すと出てきた。
実際Railsには `negative?` は無いけど、また笑いたくなった時のためのメモ。
[SublimeText3] 新しいファイルでも既にあるウィンドウのタブで開くようにする

# 発端
FTPクライアントで開いて保存と同時に転送、というような開発を進めているが、
ファイルを開くとき、いちいち別ウィンドウで開いてしまう。
新しいファイルを開く度にひとつウィンドウが別で立ち上がるので鬱陶しいし、
開く度にタブを引っ張ってってひとつのウィンドウにまとめて…という非効率なことをしていた。
コマンドライン上では`subl -a`すると同じウィンドウで開いてくれるが、
これを「ファイルを開く」した時でもやってくれないかなーと思った。

# 解決策
`Preference => Setting - User`を開く。
(Macなら ⌘-,  だし、Windowsなら Ctrl-, で開くと思う)
以下のように設定を追加する。

```
{
    // ....
    // いままでの設定 （末尾にカンマを忘れずに）,
    "open_files_in_new_window": false
}
```

これでいつも同じウィンドウで開いてくれる。
インスタンス起動前にORA-09925が出た時の対処

# 概要

Oracleインスタンスが未起動状態の際、SQL*Plusからシステム権限でログインしようとすると、ORA-09925 が出てログイン出来ない場合の対処をまとめました。

## エラーメッセージ

```
oracle@localhost:~$ sqlplus / as sysdba
ERROR:
ORA-09925: Unable to create audit trail file
Linux-x86_64 Error: 2: No such file or directory
Additional information: 9925`
```

## 対処

以下のディレクトリの作成とoracle:oinstallへの読み書き権限の付与。

```
oracle@localhost:~$ mkdir -p <初期化パラメータAUDIT_FILE_DESTで指定したディレクトリ> 
oracle@localhost:~$ mkdir -p $ORACLE_BASE/admin/$ORACLE_SID/adump
oracle@localhost:~$ mkdir -p $ORACLE_HOME/rdbms/audit
oracle@localhost:~$ chmod 770 <初期化パラメータAUDIT_FILE_DESTで指定したディレクトリ> 
oracle@localhost:~$ chmod 770 $ORACLE_BASE/admin/$ORACLE_SID/adump
oracle@localhost:~$ chmod 770 $ORACLE_HOME/rdbms/audit
```

# 原因

元々、HA構成のクラスタサーバーを作ってたのですが、Oracleは稼動系待機系それぞれのローカルHDD上にインストールして、DIAGNOSTIC_DESTとORADATA領域は共有ディスク上にという構成で作成していました。

DBCAからDBインスタンス（ORACLE_SID=orcl）を作成する際は、共有ディスクをマウントした稼動系から実施し、共有ディスク上にデータファイルを作成しました。その際、稼動系では\$ORACLE_BASE/admin/orcl/adumpと\$ORACLE_HOME/rdbms/auditが自動的に作成されましたが、待機系側では該当のディレクトリが作成されていないため、待機系側に共有ディスクをマウントして起動しようとすると、「as sysdba」によるログインの記録を残すためのディレクトリにアクセス出来ず、ログイン段階からエラーとなる事象のようです。

初期化パラメータ AUDIT_FILE_DEST で指定したディレクトリは初期化パラメータを読み込む（＝インスタンスが起動状態）段階から使われますが、それ以前の監査情報は初期化パラメータが見れない状態のため、\$ORACLE_HOMEや\$ORACLE_BASE上のフォルダに監査情報を残しているのですね。

普段あまり監査情報まで見ないので勉強になりました。

## 参考情報元

以下のブログでほぼピンポイントの情報を見つけて、これが解決の決め手でした。

[ORA-09925: Unable to create audit trail file tips](URL "http://www.dba-oracle.com/t_ora_09925.htm")

> There is a note 69642.1 on MOSC   that lists 4 possible causes for this ORA-009925 error.  All of the error relwte to file ans directory permissions not allowing writes to the files (i.e. chmod 760):
> 
> 1) AUDIT_FILE_DEST is not writable (chown +w \$AUDIT_FILE_DEST)
> 2) \$ORACLE_BASE/admin/\$ORACLE_SID/adump exists but is not writable
> 3) \$ORACLE_HOME/rdbms/audit is not writable
windows 32bit環境へのpython2.7インストール


2017/2/14 追記．

記事を書いた時点では，使いたいライブラリがpython3系に対応していないことがあるなどの理由で2.7系をオススメしてましたが，
既にかなりの数のライブラリがpython3に対応しているので特に事情がないなら3系のインストールを推奨します．  
特に, python2系と3系では文字列の扱い方が変わっているので, 日本語圏の人が2から3に移行しようとして苦労するより, 最初から3を使用するほうが無難です．
主要なpythonライブラリの対応状況は下記のサイトから確認できます．
https://python3wos.appspot.com/


--------

使用できるライブラリ数などの理由により2.7系，32ビット版をインストールするものとして説明します．
3系や64ビット版をインストールする場合も手順自体は同じです．

# インストーラの取得
以下の手順でインストーラを公式HPから取得してください．

1. PythonのHPページ( https://www.python.org/ )にアクセス

2. Downloadsタブからwindowsを選択

3. 画面を下のほうにスクロール

4. Python2.7.9（2015/3/20時点での2系の最新版) を見つける

5. [windows x86 MSI installer]をクリックしてDownload


![スクリーンショット 2015-03-20 15.59.33.png](https://qiita-image-store.s3.amazonaws.com/0/58048/2ab6871b-be07-73df-9617-362164fa168a.png)

![スクリーンショット 2015-03-20 16.08.51.png](https://qiita-image-store.s3.amazonaws.com/0/58048/8eca3fef-3a93-9a2d-7eeb-e22da175e776.png)

![スクリーンショット 2015-03-20 16.11.21.png](https://qiita-image-store.s3.amazonaws.com/0/58048/a78818e5-a77c-635f-2d2b-d2d4a02778d5.png)


# インストール設定

Downloadしてきたファイル`[python-2.7.9]`をダブルクリックするとインストールが始まります．
後で楽になるので[Add python.exe to Path]にチェックをいれておきましょう．
インストールの設定は3つ目のページにあります．


![スクリーンショット 2015-03-20 16.35.50.png](https://qiita-image-store.s3.amazonaws.com/0/58048/dfbadef4-e0fd-c51f-2de0-c0f3d159e637.png) 
個人用にするかどうか，なのでお好きな様に．

![スクリーンショット 2015-03-20 16.35.58.png](https://qiita-image-store.s3.amazonaws.com/0/58048/b8b417d8-ddad-979a-82bb-1a9204106ed9.png)
pythonをインストールする場所．
特にこだわりが無ければそのままで大丈夫です．

![スクリーンショット 2015-03-20 16.36.09.png](https://qiita-image-store.s3.amazonaws.com/0/58048/e7c9769b-0458-bd99-8011-ec3f3c431de4.png)
install時の設定．
[Add python.exe to Path]はデフォルトで ☓ になっていると思いますが，
[Will be installed on local hard drive]を選択しておくと後でPATHを通す必要がなくなります．

![スクリーンショット 2015-03-20 16.37.00.png](https://qiita-image-store.s3.amazonaws.com/0/58048/8a762d92-9b71-038c-fcb4-90621b4d581a.png)
このページまで来たら完了です．

# 実行テスト

実行するにあたって，まずはコマンドプロンプトを起動させましょう．
コマンドプロンプトは，スタートメニューの「プログラムとファイルの検索」に`cmd`を打ち込んでenterキーを押せば起動します．
![スクリーンショット 2015-03-20 16.51.24.png](https://qiita-image-store.s3.amazonaws.com/0/58048/159df101-9ef8-7bd2-813a-aec8dc6cdc77.png)  →  ![スクリーンショット 2015-03-20 16.51.45.png](https://qiita-image-store.s3.amazonaws.com/0/58048/1c5d9ca5-cb76-734d-fde5-bfeb200555cd.png)

windowsキーを押しながらRボタンを押すと以下のようなwindowが起動しますので，そこに`cmd`を打ち込んでenterキーを押しても起動します．
![スクリーンショット 2015-03-20 16.52.00.png](https://qiita-image-store.s3.amazonaws.com/0/58048/315a188f-4b96-013e-5069-a78c9a5c38ff.png)


コマンドプロンプトが起動すると以下の様な画面がでてきますので，そこに `python` と打ち込んでenterキーを押しましょう．
インストールが正常にできていれば，pythonのバージョン番号が表示され，`>>>` という入力コンソールがでてくるはずです．
![スクリーンショット 2015-03-20 16.52.24.png](https://qiita-image-store.s3.amazonaws.com/0/58048/954b6f06-2a55-75af-e800-0ead9fd2bad9.png)

この画面から抜けるには```>>> quit()```と入力するか，Ctrl-Zをおした後にenterキーを押せばpythonが終了します．


## プログラムを書き始める前に
pythonはライブラリが充実しており，自分が使いたいライブラリを組み合わせて
新しいプログラムを作っていくことになると思います．
ライブラリは直にインストールするのではなく，仮想環境を作った上でインストールすることを推奨します．
[こちら](http://qiita.com/maisuto/items/91143d26b609d6cfc1ac "仮想環境の作り方")に仮想環境を記述しましたので参考にしてください．
TIME_WAITの数をtopっぽくカウントする方法

netstatでtcpのTIME_WAITを継続して確認したいときはがあると思いますが、

`netstat -na | grep -c TIME_WAIT`

って打ち続けるのはhistory汚すしやりたくないなーと思って、
topっぽく1秒ずつカウントしてコンソールに出してくれるやつを作りました。

`clear; while :; do clear; echo '---NETSTAT TIME_WAIT COUNT---'; netstat -na | grep -c TIME_WAIT; sleep 1; done`

これで、コンソールの一番上の方でぽこぽこ更新し続けてくれます。
whileのところにあるコマンドを変えればいろいろ応用できそうですね。
Composerにはイベントをフックしてコマンドを実行する機能があった

# やりたかったこと
ComposerでPackagist以外からインストールした場合にサブモジュール扱いとなってしまうのを回避したかった。

# 背景
Composerを利用していると、インストールされたライブラリー群も同リポジトリに含めるかどうかの選択に迫られると思います。
僕は含めました。

含めなかった理由として一番大きいのは**デプロイ時にPackagistやその他のリポジトリを参照するのが嫌だった。**
Satisを使えば回避出来るっぽいけど、その管理が増えるのはあまりメリットに感じませんでした。

というわけで僕の目の前にはcomposer.lockファイルだけじゃなく、vendorディレクトリも丸々入ったプロジェクトがあるんですが、ひとつ困ったことがありました。

**Packagist以外から（たとえばGitHub）リポジトリを直接指定して入れるようにしたライブラリーがサブモジュールとして管理されてしまったのです。**

理由は**.gitディレクトリが含まれているからでした。**

どうやらPackagistからインストールされる場合は.gitのようなファイルを削除してくれるようで、このような事態にはなりません。

ググったところSatisを利用するとSatis様が削除してくれるそうです。
しかしSatisを使うのはプライドが許さなくて他の手段を探したところ、**ComposerにはCommand Eventsというのがあってinstallやupdadteをフックしてコマンドを実行する機能がありました。**

# Command Events
|イベント|タイミング|
|:----------------|:-------------------------------|
|pre-install-cmd  |composer install コマンドの実行前|
|post-install-cmd |composer install コマンドの実行後|
|pre-update-cmd   | composer update コマンドの実行前|
|post-update-cmd  | composer update コマンドの実行後|

その他イベントは試してないのでドキュメントを参照ください。結構いっぱいあります。
https://getcomposer.org/doc/articles/scripts.md#command-events

# composer.jsonでコマンドを予約する
composer.jsonのrequireやrequire-devの並びにscriptsという情報を加えます。
こんな感じ

```composer.json
  <<省略>>
    "require": {
        "laravel/framework": "5.0.*",
        "illuminate/html": "~5.0"
    },
    "require-dev": {
        "phpunit/phpunit": "~4.0",
        "phpspec/phpspec": "~2.1"
    },
    "scripts": {
        "post-install-cmd": [
            "find ./vendor -name .git | xargs rm -rf"
        ],
        "post-update-cmd": [
            "find ./vendor -name .git | xargs rm -rf"
        ],
    },
  <<省略>>
```

上の例ではinstall後とupdate後それぞれ１つしか予約していませんが、配列で指定するようになっていて
**複数のコマンドを予約する事もできます。**

# .gitディレクトリを削除するコマンド

```
find ./vendor -name .git | xargs rm -rf
```

xargsを使わないで``find ./vendor -name .git | rm -rf``だとディレクトリがうまく削除出来ないので注意です。
どうやら-rfがfindのオプションとみなされるっぽい。。

# まとめ
正直バッドノウハウなんじゃないかという疑念は捨てきれないのですが、この方法でサブモジュール化されてしまう事を防ぐことが出来ました。
[Mac] 間違って [Cmd+Q] を押してしまう方へ

アプリケーションを切り替えようとして、[Cmd+Tab]を押すつもりが、誤って[Cmd+Q]を押してしまい、アプリを終了することがたびたびあり、いつもムキーとしてましたが解決しました。

---

* 以下のアプリをインストール
    * Karabiner https://pqrs.org/osx/karabiner/index.html.ja
* Karabinerを起動
* 設定項目が多いので [press command Q twice] で項目を検索
* [Press Command+Q twice to Quit Application]にチェック！
![スクリーンショット 2015-03-20 16.44.17.png](https://qiita-image-store.s3.amazonaws.com/0/23389/d96c8902-f5ba-11e7-e7a1-c4e90adc6a05.png)

---

これで、Commandを押しながらQを2回押さないとアプリが終了しなくなります。
超快適！
AWSのAPIを用いてRoute53をいじるときの注意

AWS SDK for PHPを例に出しますが、おそらく他でもそうかと思います。

例として、

- ```example.com``` に ```ass IN CNAME example.org``` を追加もしくは既存レコードの変更を行いたい

とします。

#症状1

[ここ](http://docs.aws.amazon.com/aws-sdk-php/latest/class-Aws.Route53.Route53Client.html#_changeResourceRecordSets)を参考に、

```:PHP
try{
        $result = $route53Client->changeResourceRecordSets(array(
                'HostedZoneId' => '(example.comを指すHostedZoneId)',
                'ChangeBatch' => array(
                        'Changes' => array(
                                array(
                                        'Action' => 'UPSERT',
                                        'ResourceRecordSet' => array(
                                                'Name' => 'ass',
                                                'Type' => 'CNAME',
                                                'ResourceRecords' => array(
                                                        array(
                                                                'Value' => example.org
                                                        )
                                                )
                                        )
                                )
                        )
                )
        ));
}catch(Exception $ex) {
        echo "execution failed:".$ex->getMessage()."\n";
        return;
}
```

みたいな感じで投げると
```execution failed:Invalid request``` と言われる。

#原因1

面倒臭がらず、__TTL__をちゃんと設定しましょう。

#症状2

```:PHP
try{
        $result = $route53Client->changeResourceRecordSets(array(
                'HostedZoneId' => '(example.comを指すHostedZoneId)',
                'ChangeBatch' => array(
                        'Changes' => array(
                                array(
                                        'Action' => 'UPSERT',
                                        'ResourceRecordSet' => array(
                                                'Name' => 'ass',
                                                'Type' => 'CNAME',
                                                'TTL' => 300,
                                                'ResourceRecords' => array(
                                                        array(
                                                                'Value' => example.org
                                                        )
                                                )
                                        )
                                )
                        )
                )
        ));
}catch(Exception $ex) {
        echo "execution failed:".$ex->getMessage()."\n";
        return;
}
```

のように投げると
```execution failed:RRSet with DNS name ass. is not permitted in zone example.com.```
と言われる

#原因2

```'Name' => 'ass',``` ではだめです。面倒臭がらずに ```'Name' => 'ass.example.com',```としましょう。

#まとめ

Web Consoleをいっぱい使ってる人だと、AWS側が自動で色々やってくれるので、
こういう細かいところで引っかかりがちな気がします。
プログラミング Haskell 第 8 章

<a href="http://estore.ohmsha.co.jp/titles/978427406781P">プログラミング Haskell</a> 第 8 章 関数型パーサーのコードはそのままでは動きませんが、簡単な修正で動くようになります。

```parser.hs
type Parser a = String -> [(a, String)]
```

本ではパーサーの型が関数になってますが、このままでは Monad にできない（というか、もともと関数は Monad なので、独自の `>>=` を定義できない）ので、新しい型で<ruby><rb>包</rb><rp>（</rp><rt>くる</rt><rp>）</rp></ruby>んで Monad のインスタンスにします。

```parser.hs
data Parser a = P (String -> [(a, String)])

instance Monad Parser where
    return v = P (\inp -> [(v, inp)])
    p >>= f = P (\inp -> case parse p inp of
        [] -> []
        [(v, out)] -> parse (f v) out)
```

そして、いくつかの関数を書き換えれば OK です。

```parser.hs
failure :: Parser a
failure = P (\inp -> [])

item :: Parser Char
item = P (\inp -> case inp of
    [] -> []
    (x:xs) -> [(x, xs)])

parse :: Parser a -> String -> [(a, String)]
parse (P p) inp = p inp

(+++) :: Parser a -> Parser a -> Parser a
p +++ q = P (\imp -> case parse p imp of
    [] -> parse q imp
    x -> x)
```

これで先に進めるようになったはず。とりあえず `"[1, 2, 3]"` はパースできました。
Google Analyticsに任意のパスやタイトルで ga('send','pageview') する時の注意点


## サマリー

ページビューを送信する処理を無名関数の中に書いて、
gaを引数に渡してローカルスコープにすると、うまく飛ばなかった、
のでメモ。

## 説明

Google Analytics（ユニバーサルアナリティクス）で、埋め込みコードをそのまま使った場合は、ページ読み込み時に、そのページのサーバルートからのパスと、`<title>`に設定されているタイトルがページビュー送信されます。

が、任意のタイミングにpageviewを送信したいとき、また同一のhtmlでモーダル上などでコンテンツを表示する時にも同様にpageviewを送信したい時は、

```js
ga('send', 'pageview', {
  'page' : 任意のパス,
  'title': 任意のタイトル
});
```

のように、`'page'` と `'title'` に任意の情報を上書きして送信します [^1]  。

[^1]: pageは、ハッシュ(#)を後ろにつけて固有化してもGoogle Analyticsのレポート上では切り捨てられてしまうようなので、Googleのヘルプに書いてあるように `?id=hoge` などクエリストリングにするか `/hoge` とスラッシュで切るのが良いかも。

### コード例

```js:pageviewの送信処理
(function(window, path) {

  window.sendAnalytics = function sendAnalytics(id, name) {
    //カスタムのpageとtitleでpageview送信
    if(id && name) {
      var page  = path + "?id=" + id,
          title = window.document.title + ":" + name;
      ga('send', 'pageview', {
        'page'  : page,
        'title' : title
      });
    }
    //通常のpageview送信
    else {
      ga('send', 'pageview');
    }
  }
  
})(this, location.pathname);
```

```js:実行側
(function(window) {

  //ページ読み込み時に通常のpageviewを送信
  window.sendAnalytics();

  //同htmlでコンテンツを表示するボタンがクリックされた時にはコンテンツを識別できるパスとタイトルを付与してpageview送信
  $('.btn').on('click', function(){
    window.sendAnalytics('hoge', 'ほげ');
    return false;
  });

})(this);
```

### 結果

ページ読み込み時(通常のpageview送信)

![スクリーンショット 2015-03-20 15.26.39.png](https://qiita-image-store.s3.amazonaws.com/0/48396/514cba81-6563-c360-53e9-b993fb083e73.png)

同htmlでコンテンツを表示した時(カスタムのパスとタイトルでpageview送信)

![スクリーンショット 2015-03-20 15.26.50.png](https://qiita-image-store.s3.amazonaws.com/0/48396/1b263c6b-c766-15e1-dfb8-ed1afabedc97.png)


## はまった点

最初、グローバルスコープの`ga`をそのまま使うのは...などと思って、`ga`自体も無名関数の中に引数で渡してしまっていたのですが、pageとtitleを上書いた任意タイミングのpageview送信が飛ばなかった(ファンクション自体は発火していたのですが)ので以降気をつける。

```js:こうするとクリック時のpageviewが飛ばなかった
(function(window, path, _ga) {

  window.sendAnalytics = function sendAnalytics(id, name) {
    //カスタムのpageとtitleでpageview送信
    if(id && name) {
      var page  = path + "?id=" + id,
          title = this.document.title + ":" + name;
      _ga('send', 'pageview', {
        'page'  : page,
        'title' : title
      });
    }
    //通常のpageview送信
    else {
      _ga('send', 'pageview');
    }
  }
  
})(this, location.pathname, ga);
```
JUnit 入門

概要
=
Javaプログラムの*単体テスト*を行うためのツール(フレームワーク)


目的
=
- 不具合を発見する
- 仕事が完了したことを確認する
- システムをより優れたものに改良する

利用手順(テストクラスの作成と実行)
=
(Eclipseで利用する)
1. JUnitプラグインをインストール
※Eclipse JDTには標準で入っている
2. テストコードを書きたいソースコードを右クリックして、[新規] > [JUnitテストケース]を選択。⇒テストケース作成
3. 実行する時は「プロジェクト・エクスプローラー」からテストクラスを選択して右クリック→「実行」→「実行の構成」でJUnitを選択して実行する

Eclipseでは，Eclipse JUnitプラグインを利用すると簡単にテストケースが作成できる。

利用例
=
###(例1)###
↓↓テストコードを書きたいソースコード

```java:Sample.java
public class sample {
    public static int num() {
     return 10;
    }
}
```
↓↓テストを実施するクラス

```java:SampleTest.java
import static org.junit.Assert.*;
import org.junit.Test;

public class SampleTest {

   @Test
   public void testNum() {
      assertEquals(10, sample.num());
      assertEquals("10じゃない!!",10, sample.num());
   }
}
```

Sample.javaのnumメソッドを使用したら「10」が返ってくるかどうかのテストを行っています。
↓は10でなければエラーになる

```java
assertEquals(10, sample.num());
```
↓は10でなければ「10じゃない!!」というメッセージが出力されてエラーになる

```java
assertEquals("10じゃない!!",10, sample.num());
```

結果
=
テストはassertEqualsメソッドで期待値と結果値をチェックして判定を行う。判定の結果(エラーの場合)メッセージを出力することもできる。

ルール
=
1. テストクラスの命名規則「XxxTest.java」
2. テストメソッドの命名規則「testXxx()」
3. テストメソッドの前に「@Test」を付ける
4. テストメソッドは「引数なし」+「返り値なし」
5. テストメソッドに 「assertEquals("error時の文",期待値,実測値)」

補足
=
JUnit = Javaプログラムの*単体テスト*を行うためのツール

###**単体テスト**とは…###
**作成したコードが要件を満たしているか、確認するためのもの**
組み立ててしまってから不具合が見つかった場合、どの「部品」が悪いのか探し当てるには、多くの時間と労力が必要
= **不具合の発見に有効**

###**XP**(eXtreme Programming) 開発方法論###
設計仕様を単体テストの形で与えることを唱えています。
設計時に単体テストを作成し、単体テストをパスする＝完成とする
単体テストはテストプログラムの形で与えます。
テストプログラムを作成し、自動化テストを行うことが望ましい
1. 何度でも試せる
テストプログラムは、一度書いてしまえば、手軽に何度でもテストを行うことができます。
2. 使いまわしがきく
似たような機能のテストを行うとき、テストプログラムのコードを再利用することにより、より短時間にテストを完成させることができます。
[Swift]条件に応じて異なる配列を戻して操作したい...


配列は値型で引き回すため、関数の戻り値などで配列を受け取っても、その後で（元の配列に対して）変更を加えることができません。

（そもそも設計が良くない！という意見はとりあえず横に置いておきます。）

```swift:こんなコードは動かない
class Hoge {
    private var array1 = [Int]()
    private var array2 = [Int]()
    
    /// なんかの条件
    var condition = false
    
    var array: [Int] {
        return condition ? array1 : array2
    }
}

let hoge = Hoge()
println(hoge.array) // 取得はできるが
hoge.array.append(5) // 変更はできない
```

```text:エラー
playground128.swift:16:6: error: immutable value of type '[Int]' only has mutating members named 'append'
hoge.array.append(5) // 変更はできない
```

このような場合は、クロージャを使ってinoutで配列を受け取れば一応目的は達成できます。

```swift:
class Hoge {
    private var array1 = [Int]()
    private var array2 = [Int]()
    
    /// なんかの条件
    var condition = false
    
    var array: [Int] {
        return condition ? array1 : array2
    }
    
    func arrayProc(proc: (inout [Int]) -> ()) {
        if condition {
            proc(&array1)
        } else {
            proc(&array2)
        }
    }
}

let hoge = Hoge()

hoge.arrayProc {
    (inout array: [Int]) in
    array += [1, 2, 3]
}

println(hoge.array) // "[1, 2, 3]"
```

stackoverflowでも同じような事が書かれていたので、これぐらいしかやりようは無いかなという気がします。

* [How to return an inout (reference) in a swift function?](http://stackoverflow.com/questions/27539533/how-to-return-an-inout-reference-in-a-swift-function)
指定したフォルダ以下にあるファイルを条件付きで再帰的に列挙する

ファイル・フォルダの列挙自体は `std.file` の [dirEntries](http://dlang.org/phobos/std_file.html#.dirEntries) で可能で、ワイルドカードの指定も可能なのですが、もっと複雑な条件で絞り込みたいときは `std.algorithm` の [filter](http://dlang.org/phobos/std_algorithm.html#.filter) を使うと便利です。

たとえば、 `dir` ディレクトリ以下のディレクトリ・ファイルを幅優先で列挙して、最後にファイルだけのリストを得たいときは

```d
import std.algorithm;
import std.array;
import std.file;

string dir = "/home/kazoo04/hoge";
auto files = dirEntries(dir, SapnMode.breadth).filter!(a => a.isFile).array();
```

とかやるとファイル名の文字列の配列が得られます。

`filter` の中には、もちろん任意のDの式が書けます。
詳しくは [std.algorithm](http://www.kmonos.net/alang/d/phobos/std_algorithm.html) を見てください。
qemuで使っていた.qcow2形式のファイルシステムイメージをx64 debian上でマウントしてファイルを修復したりfsckしたりした話


## あらすじ
ARM用クロスコンパイル環境として、`qemu` を使って仮想ARMマシンを立ち上げ、その上で開発していました。

ある日、仮想マシンにログインできなくなる事件が発生。
結論から言うと `/etc/passwd` とかが壊れていました。これを修復する方法を模索した話です。

## 手順

OS Xからやる方法が見つからなかった（分からなかった）ので、Linux上で作業することにしました。

### 前準備
今回はvagrantで仮想マシン上にdebianを上げて、その上で作業しました。
これはLinuxマシンなら何でも大差無いと思うので手順は省略。debian系ディストリであれば同じ手順でいけるのではと思います。

ちなみにvagrantでファイルの共有をするには `Vagrantfile` に以下のような感じで記述。

```
config.vm.synced_folder "~/qemudir", "/shared/qemu"
```

この辺りも手段は問わない感じです（仮想debianから `.qcow2` がいじれれば）

### vagrantで仮想Linuxを起動しログイン

vagrantならこんな感じ。やっていることは普通にVirtual Box等で仮想Linuxを起動してログインしているだけです。

```bash
% vagrant up   # 仮想マシン起動
% vagrant ssh  # 仮想マシンにログイン
```

### 仮想マシン上で修復準備

```bash
# root権限がないと出来ないことばかりなのでrootになってしまう
# ここは逐一sudoでコマンドを叩いても良いと思います
$ sudo su

# 仮想Linuxにqemu-utilsをインストール
$ apt-get install qemu-utils

# nbdというカーネルモジュールをロード
$ modprobe nbd max_part=8

# qcow2を/dev配下のブロックデバイスとして見えるようにする
$ qemu-nbd --connect=/dev/nbd0 diskimage.qcow2

# fdiskでパーティションを（一応）調べてみる。今回は/dev/nbd0p1 というのがメインパーティションだった。
$ fdisk /dev/nbd0
```

### 仮想マシン上でファイルシステム修復

```bash
# ブロックデバイスとして扱える状態なので、fsckができるようです
$ fsck /dev/nbd0p1

# マウント。これで中身が見られるようになります
$ mount /dev/nbd0p1 /mnt

# 終わったらアンマウントして後処理。
$ umount /mnt
$ qemu-nbd --disconect /dev/nbd0
```

壊れていた `/etc/passwd` を正しいものに置き換えたところ、無事ログイン出来るようになりました。

## 参考サイト
大変参考にさせていただきました。ありがとうございます。

* [壊れたqcow2のパーティションをfsckで修復する方法 -- ぺけみさお](http://www.xmisao.com/2013/11/26/recover-fsck-a-qcow2.html)
Text::Markdown::DiscountでFenced code blocksを有効にする

perlでMarkdownを変換する必要があったので[Text::Markdown::Discount ](https://metacpan.org/pod/Text::Markdown::Discount)を使ってみました。
テーブルや定義リストなど、いくつかの拡張記法に対応しているので重宝しています。

ですが、普通にインストールするだけでは[GFMでサポートされているFanced code blocks](https://help.github.com/articles/github-flavored-markdown/#fenced-code-blocks)や[PHP Markdown Extraスタイルの定義リスト](https://michelf.ca/projects/php-markdown/extra/#def-list)が利用できません。

Text::Markdown::Discountでこれらを利用するにはMakefile.PLを書き換えてdiscountのオプションを有効にする必要があります。
オプションを有効にしてインストールする手順は次のとおりです。

```shell-session
$ curl -L https://cpan.metacpan.org/authors/id/S/SE/SEKIMURA/Text-Markdown-Discount-0.11.tar.gz | tar xzf - 
$ cd Text-Markdown-Discount-0.11
$ sed -i.bak -e 's/sh configure.sh;/sh configure.sh --with-fenced-code --with-dl=Both;/' Makefile.PL
$ cpanm .
```

Text::Markdown::Discountを使うときには参考にしてみてください。
[Swift]関数のネストを複数用いてエラーになる場合


ある関数の中の共通処理なんかをネストした関数（ローカル関数）に書くと非常に捗る事があります。
特に、ネストした関数内では、親の関数が持っている引数やローカル変数にもアクセスできるため、共通処理などを関数の外に出す場合に比べて、引数の数を減らすことができ、呼び出す方も楽ができます。

ただ、そうした変数のキャプチャが絡むと、ネストされた関数から更に別のネストされた関数を呼び出そうとした時にコンパイルエラーが出ることがあります。

* Xcode6.3 beta3 + Playground

```swift:再現を目的とした特に意味の無いコード
import UIKit

func hoge(param: Int) {

    /// ネストされた関数B
    func nestedFuncB(mul: Int) {
        println(param * mul)
    }
    
    /// ネストされた関数A
    func nestedFuncA(mul: Int) {
        nestedFuncB(mul * 10)
    }

	nestedFuncA(10)
}

hoge(1)
```

```text:エラー
playground55.swift:12:9: error: cannot reference a local function with captures from another local function
        nestedFuncB(mul * 2)
```


こうした場合は、関数ではなくクロージャに置き換えてやると、期待した動きをしてくれるかと思います。

```swift:置き換えたもの
import UIKit

func hoge(param: Int) {

    /// クロージャに置き換えたもの
    let nestedFuncB = {
        (mul: Int) -> () in
         println(param * mul)
    }
    
    /// ネストされた関数A
    func nestedFuncA(mul: Int) {
        nestedFuncB(mul * 10)
    }

    nestedFuncA(10)
}

hoge(1) // 100
```

ネストされた関数とクロージャでどんな違いがあるのかよくわかりませんが、動いたので良しとします。
関数を要素に持つ構造体の定義

インターフェイスの動作をちょっと変えたいと思い構造体の要素に関数を持つ方法を調べても直ぐに出て来なかったのでメモ

```go
type Hoge struct {
	Huga  func(int) bool
}
```
これで、Hugaはint型の引数を一つ持ち、bool型を返す関数の型の要素になる
知識レベルの質問（アナリシスパターン）

PartyTypeとPartyのサブタイプ属性の関連がわからなくなってしまったため、ご教示ください。

Partyのサブタイプとして、Person、LegalPersonが存在する場合、
このサブクラスはクラス（プログラム）として作成しますか？

作成する場合は、サブクラス自体がPartyTypeを指し示すと思うので、
PartyTypeは不要だと感じますが、何故必要なのでしょうか。

作成しない場合は、サブタイプの属性をどこに保持させるのでしょうか。
PartyTypeのインスタンスでサブタイプ（種類）は把握できますが、
属性は保持できないと思っています。
FRP で YouTube のモーダルスクリーンを実装してみる。


YouTube の [Player API](https://developers.google.com/youtube/iframe_api_reference) で YouTube 動画のモーダルスクリーンを実装する機会があったので、[Bacon.js](https://baconjs.github.io/) で実装してみたメモ。

- [デモ](http://jsbin.com/jonote/1/edit?js,output)

全体のコードはこんな感じ:

```javascript
(function (w, d, $, B) {

  // YouTube Player API の読み込み関数
  var youtubePlayerAPI = function (cb) {
    var el = d.createElement('script'), topEl = d.getElementsByTagName('script')[0];
    el.src = 'https://www.youtube.com/iframe_api';
    w.onYouTubeIframeAPIReady = function () { cb(w.YT); };
    topEl.parentNode.insertBefore(el, topEl);
  };

  // YouTube プレイヤのコンストラクタ関数
  var createYoutubePlayer = function (YT, selectorId, videoId, cb) {
    return new YT.Player(selectorId, {
      videoId: videoId,
      width: 320,
      height: 180,
      playerVars: {
        controls: 1,
        loop: 1,
        rel: 0,
        showinfo: 0,
        wmode: 'transparent'
      },
      events: { onReady: cb }
    });
  };
  
  // YouTube API 読み込み完了を待つストリーム
  var youtubeAPIReady = B.fromCallback(youtubePlayerAPI);
  // DOM 読み込み完了を待つストリーム
  var contentLoaded = B.fromCallback($(d).ready);
  // 上記 2 つの読み込み完了を待つストリーム
  var ready = B.combineWith(function (content, api) { return api }, contentLoaded, youtubeAPIReady);

  // 上記ストリームの読み込み完了タイミングで実行されるリスナ
  ready.onValue(function (YT) {
    var $open = $('#open'), $close = $('#close'), $layer = $('#layer'), $main = $('#main');

    // 個別 YouTube 動画の読み込み完了を待つストリームバインダ
    var videoBinder = function (selectorId, videoId) {
      return function (sink) {
        createYoutubePlayer(YT, selectorId, videoId, function (ev) {
          sink(ev.target);
          sink(new B.End());
        });
      };
    };

    // 上記バインダを利用したストリーム
    var playerReady = B.fromBinder(videoBinder('player', 'DVwHCGAr_OE'));
    
    // モーダルを開くリンクのクリック監視をするストリーム
    var openClick = $open.asEventStream('click').doAction('.preventDefault');
    // 上記開くリンクのトリガと YouTube 動画読み込み完了を待つストリーム
    var open = openClick.combine(playerReady, function (click, player) { return player; });
    
    // モーダルを閉じるリンクのクリック監視をするストリームプロパティ
    var closeClick = $close.asEventStream('click').doAction('.preventDefault').toProperty(w.event);
    // モーダル背景のクリック監視をするストリームプロパティ
    var layerClick = $layer.asEventStream('click').toProperty(w.event);
    // 上記 2 つどちらかのトリガを監視するストリームプロパティ
    var closeOrLayerClick = closeClick.or(layerClick);
    // 上記トリガと YouTube 動画読み込み完了を待つストリーム
    var close = closeOrLayerClick.combine(playerReady, function (click, player) { return player; });
    
    // 開く処理がトリガされた時に実行されるリスナ
    open.onValue(function (player) {
      $layer.css({ display: 'block' });
      $main.css({ display: 'none' });
      player.playVideo();
    });

    // 閉じる処理がトリガされた時に実行されるリスナ
    close.onValue(function (player) {
      player.stopVideo();
      $layer.css({ display: '' });
      $main.css({ display: '' });
    });
  });

})(window, document, jQuery, Bacon);
```

様々な非同期処理を、ストリームという時系列に値が `push` されていく無限配列のようなオブジェクトに、Underscore.js のような配列操作で、様々な処理を書いていけるのが FRP っていうのが、今の認識。
Hamlの書き方

htmlを記述するとき、簡単かつ簡易的に記述できるHamlについての書き方を記します。

Ruby On Rails などを扱うとき、Hamlで記述する人も多いでしょう。

ちなみに私はSlimなども好きです。

# Hamlの基本
（例）

    !!!
    %html{lang: "ja"}
      %head
        %meta{charset: "utf-8"}
      %body
        hello world!

＜コード解説＞
1. !!!
<!DOCTYPE html>を表す  
2. %
タグの前に%を付けると< 開始タグ >と< 終了タグ >を表す。  
3. インデントを必ず入れる
入れ子構造にする時は字下げを必ず同じスペース分入れる。
ちなみに私の場合はRubyが主ですがその他プログラムでも記述するときは字下げ（タブ幅）を2にしています。だいたい4つスペースか2つスペースなんかが一般的でしょうか。  
4. 属性を入れる場合
Ruby風に{}とシンボルで書ける。
尚、HTML風に書くなら「%html(lang="ja")」  

# コメント記法


1. HTML的に記述  
「/ コメントだよ」  
もしくは複数行書くときは  
/ コメントだよ
  コメントだよ
  コメントだよ 

2. HTMLには反映させないけどHamlの中では反映させたい場合  
「**-#**」を「1」と同様に記述する。

# 改行
    %p
      Hello!
上記は以下となる。

    <p>
      Hello
    </p>

尚、一行にしたい場合は

    %p Hello
上記は以下となる。

    <p>Hello</p>


また、Haml上では見やすく改行して記述した場合、**HTML上でも改行付きになるが、それを改行なしで表示させたい場合**は以下のように**「<」**を入れる。
（例）

    %ul
      %li<
        item1

これはHTML上では以下となる。

    <ul>
      <li>item1</li>
    </ul>

尚、親要素の改行も取り除きたい場合、逆の不等号「>」を用いる。

    %ul
      %li<>
        item1

以下でも良い。

    %ul<
      %li<
        item1

# id、classなどの属性指定方法
（例）

    %div#main.mainClass

尚、「div」はよく使われるので省略可能。
slimでも同じですね。

    #main.mainClass

# styleタグ、scriptタグを入れる場合
    :css
      #main {
        color: red;
      }
    :javascript {
      x = 1;
      if(x == 1) {
        alert("OK!")
      }
    }

# RailsでのerbファイルをHamlに変換する場合

◇ Hamlの中でRubyの式を評価する場合 `#{}` を使う。

`%p #{10 * 4}`
`%p{id: "main-#{i}"}`

◇ `each、if` などのロジック部分の先頭に ` - ` を記載する。

    - @posts.each do |post|
      = post.title

◇ `<%= ... >`は ` = ` にする。yieldとrenderのときは、`==` にする。
`== yield`
Monaca開発入門_01


ヽ(´@ω@｀)ﾉ

## ログイン機能の作成

RSSから読みたい記事をストックする機能を入れたかったので、ログインを実装します。
参照:[monaca公式リファレンス](http://docs.monaca.mobi/cur/ja/reference/javascript/cloud/user/)

### 画面
![ログイン画面.png](https://qiita-image-store.s3.amazonaws.com/0/62826/7e6cd89d-6678-0e15-7eb9-3e302381c87f.png "ログイン画面.png")


ユーザーIDとパスワードを入れて新規登録押せば自動で登録されてログインまでできてしまうザル。

### ソースコード

```login.js
$("#regist").click(function(){
        var username=$("#username").val();
        var password=$("#password").val();
        monaca.cloud.User.validate(username).done(function(result){
            monaca.cloud.User.register(username, password).done(function(result){
               console.log("Hello, " + result.user._username);
               location.href="#Index";
            }).fail(function(err)
            {
               console.log("Err#" + err.code +": " + err.message);
            });
        }).fail(function(err){
            alert("validation failued !!");
        });
    });

    $("#login").click(function(){
        var username=$("#username").val();
        var password=$("#password").val();
        monaca.cloud.User.login(username, password).done(function(result){
           console.log("Hello again, " + result.user._username);
           location.href="#Index";
        })
        .fail(function(err)
        {
           console.log("Err#" + err.code +": " + err.message);
        });
        
    }); 
```

`$("#regist")`と`$("#login")`がそれぞれ登録ボタン、ログインボタンと対応します。
`$("#username")`と`$("#password")`はテキストボックスです。
ログインができ次第、location.hrefでページ遷移をしています。

ここで私はハマったのですが、どうやら別のhtmlに遷移するとセッションが切れてしまうようで、ログイン状態を維持できなくなりました。
上記事項を避けるために[jQueryMobile](http://jquerymobile.com/)を導入し、ひとつのhtmlで複数ページを作成しています。

### 設定

monaca cloud側の設定は画面左メニュー>クラウド>左上歯車マークより「バックエンド設定」>ユーザー認証
ユーザー名の最短文字数、パスワードの最短文字数はここから設定します。


KobitoとQiitaで表示違うのなんとかならんのかな(´@ω@｀)
QML TableViewのサンプル

QMLのTableView(と言うか、TableViewが参照するModel)の使い方が、ドキュメントを読むだけではわかりにくかったので、簡単なサンプルを作ってみた。

https://github.com/false-git/qtsamples の、TableViewDemo に置いてある。

ビルドして起動すると、二つのTableViewが表示される。
左が QML の ListModel を Model とした TableView で、右が C++ の QAbstractListModel を Model とした TableView である。

画面下部にテキストフィールドとボタンがあり、行の追加、更新、削除ができるようになっている。

また、アプリケーションのメニューに Settings と言うものがあり、そこでソートのあり/なしを選ぶことができる。

# ソースの読み方
## ListModel
ListModelのソースは、QmlListModelTableView.qml のみである。

ListModelにはソートの機能がないため、http://qt-project.org/forums/viewthread/11108 のコメントで紹介されていた、Javascriptでのquick sortの実装を入れてある。
件数が少ない場合はこれで問題ないが、多くなると速度的に厳しくなってくるだろう。

見るべきところは、TableViewの onCurrentRowChanged, appendRow, updateRow, deleteRowである。

### モデルからのデータの取得
ListModelのget()を使う。

### モデルへのデータの追加
Javascriptのオブジェクトを作成し、ListModelのappend()を使う。

### モデルのデータ更新
ListModelのsetProperty()を使う。

### モデルからのデータの削除
ListModelのremove()を使う。

## QAbstractListModel
QML側のソースは、QAbstractListModelTableView.qmlである。
C++側のソースは、personlistmodel.h/personlistmodel.cpp/main.cppである。

personlistmodel.h/cpp で、PersonListModelと言うクラスを作成している。これは、QAbstractListModelのサブクラスである。
メンバとしてQListを持ち、ここにモデルのデータを格納する。

QAbstractListModelはabstract classなので、最低限以下の関数の実装が必要である。

* rowCount() - モデルが持つデータの件数(行数)を返す
* data() - データを返す
* roleNames() - role名のHashを返す

Tableと言うのは一般的にrow/columnsモデルであるが、QML の TableViewはrow/roleモデルである。rowが行を、roleが列を表す。(ここ、すごく気に入らないところ)

TableViewにデータを表示するだけであれば、最低限上記を実装すれば良い。

しかし、今回は追加/更新/削除を実行したいので、以下の関数を実装する。

* get() - データ取得
* appendRow() - データ追加
* updateRow() - データ更新
* removeRow() - データ削除

※ QAbstractListModelの親クラスであるQAbstractItemModelは、insertRow(), setData(), removeRow()があるので、それに合わせても良いかもしれないが、QMLのTableViewはそれらを呼んでくれないので使いやすいようにインターフェイスを変えてしまって良いと思う。

これらの関数を実装する上で重要なのは、モデルの変更をViewに伝えてやることである。

* beginInsertRows()
* endInsertRows()

のような関数が用意されており、これらを呼び出すと適切なsignalをemitしてくれる。
ただし、データの更新だけは setData() の呼び出しで dataChanged signal が emit されるのだが、今回は setData() を使用していないため、直接 dataChanged を emit している。

後は、ソートに対応するために以下のプロパティを追加する。

* sortEnabled - ソートが有効かどうか
* sortOrder - ソート順(Qt::AscendingOrder/DescendingOrder)
* sortRole - ソートする列のrole

※ ソートを実行したときに emit すべき signal についても理解できていない。今回は、beginResetRows()/endResetRows()を使った。

後は、このクラスをQMLから使えるようにするためにアプリケーションに登録してやる必要がある。
main.cpp で、QApplicationを生成した後に以下の呼び出しを追加する。

```cpp:main.cpp
qmlRegisterType<PersonListModel>("PersonListModel", 1, 0, "PersonListModel");
```
これで、QML側で以下のようにimportすると他のQML Elementと同じように使うことができる。

```qml:QAbstractListModelTableView.qml
import PersonListModel 1.0
```

# Qt のモデルについて
ListやTableのModelは、C++では一番親に QAbstractItemModelがあり、そのサブクラスとして QAbstractListModelやQAbstractTableModelがある。

この設計思想が曲者で、QAbstractItemModel がすごく大きくて、なんでもできるようになっているのだ。
親子関係があり、RowがありColumnがありRoleがある。
これ一つでTreeViewも、TableViewも、ListViewも対応できるような設計になっている。
そして、サブクラスの QAbstractListModelやQAbstractTableModel は、どちらかと言うと巨大な親の機能を制限するような方向で設計されている。(ように見える)

さらに話をややこしくするのが、QML の TableViewがModelにQAbstractTableModelではなくQAbstractListModelを使うことだ。
これは、おそらくQMLのModelとしてはListModelのみがあり、TableModelがないため、TableViewのデータ構造として row/columnモデルではなくrow/roleモデルを採用してしまったことによると思われる。

この辺を理解してしまえば、使うことはできると思うのだが、微妙な気持ちになってしまうのである。
LaTeXでmonkey patching

monkey patchとは、既存のコードの挙動を後からすげ替えて変更するもので、一部の動的型付け言語方面で多用されているものです。うまくやると効果が大きいものの、変更が局所的にならずに大域的に影響したりすることもあって、要注意な技術でもあります。

さてLaTeXでも同様に、既存のcommandを変更したいことがあります。そこでLaTeXでmonkey patchを試してみます。

# monkey patchの実現方法

monkey patchを実現するには、

* 既存のcommandのコピー
* コピーを変更しない再定義

の２つができれば実現できます。

LaTeXの場合、前者は`\let`が使えます。

```latex
\let\newcomm\oldcomm
```

また後者については、`\renewcommand`を使うと、`\let`でコピーしたコマンドを消さずに、新しい挙動を定義できます。

```latex
\renewcommand{\foo}{%
%% いろいろ
\oldfoo %% \letで作ったコピー
%% あれこれ
}
```

これを使って、`\texttt`の挙動を差し替えてみます。
元の`\texttt`は`\origtexttt`で参照できるようにします。

```latex
\documentclass{jsarticle}
\usepackage{xcolor}
\begin{document}

%%commandの差し替え
\let\origtexttt\texttt

%%コピーできていることの確認
\texttt{abc}
\origtexttt{ABC}

%%commandの再定義（コピーは変更されない）
\renewcommand{\texttt}[1]{\origtexttt{\color{blue}#1}}

%%入れ替わっている && オリジナルへの参照も残っている
\texttt{abc}
\origtexttt{ABC}

%%戻すこともできる
\renewcommand{\texttt}[1]{\origtexttt{#1}}

%%戻っているのを確認
\texttt{abc}
\origtexttt{ABC}

\end{document}
```

出力結果は以下のようになります。

![result.png](https://qiita-image-store.s3.amazonaws.com/0/4293/0a0ee44d-c733-5ad2-82f5-06c272837178.png)

2番目だけ、`abc`が青く表示されます。

### 参考

* http://tex.stackexchange.com/questions/193379/how-to-rename-an-existing-command
【iOS】重なったviewにおけるUserInteractionEnabled

##■ 概要
xibファイルで作成した重なる複数のviewに対して、特定のviewのみ `UserInteractionEnabled` を有効にしたい時の解決法を紹介します。
アプリを作っていると何気にこういった状況に陥りますね。
同僚が知らなかったので、何気に知らない人もいるかと思いまして。

####◆ 環境
Xcode: v6.2
Swift: v1.1

##■ 実装
**下記の様なviewがあるとします。**
![sam001.png](https://qiita-image-store.s3.amazonaws.com/0/50890/c9781404-6b26-5fd0-08d8-a33dbe7735cd.png)

---
　
**階層は下記です。**
![sam002.png](https://qiita-image-store.s3.amazonaws.com/0/50890/86e534f1-0a54-d085-40fb-0a544c9149d5.png)
大枠の `View` の中に `Button`がありその上に `View` が重なり、その中に `image` が置かれています。
表示上はimageを見せたいけれども、タップ時はbuttonを反応させたい、という時の対処方になります。

---
　
つまり、下記の図の `button` のみを反応させたい！という状態。
![sam003.png](https://qiita-image-store.s3.amazonaws.com/0/50890/d3ea6b5f-9583-31d8-a229-e3c2999bfa82.png)

---

####１. まず上記階層図の**大View**の `UserInteractionEnabled` をtrueにします。
**大View**を選択し、Xcode右ペインのAttributeInspector内の下記赤枠にチェック。
これで大枠のviewにアクセス可能になりました。
![sam004.png](https://qiita-image-store.s3.amazonaws.com/0/50890/c964db5d-03dc-a88c-9a22-98071b6054aa.png)
　
####２. Buttonより上の階層のviewの `UserInteractionEnabled` を`false`にします。
上記階層図の**灰色view**を選択し、Xcode右ペインAttributeInspector内の先ほどチェックを入れた箇所にチェックが入っていたら外します。
これで**灰色view**へのインタラクションが無効になりました。
**灰色view**の `UserInteractionEnabled` が`true`になっていると、ユーザタッチなどのイベントは**灰色view**あるいは**青色image**に反応してしまい、buttonまで到達しません。
>※この時**青色image**の `UserInteractionEnabled` は `false` でも `true` でも構いません。なぜなら、**灰色view**の反応が無効になっている以上、内包されている**青色image**にも反応は届かないからです。
同じ道理で、１.で `true` にした**大View**が `false` だった場合、そもそも **大View** が内包しているすべてのviewに反応は届かなくなります。

　
####３.上記階層図の**赤色button**の `UserInteractionEnabled` をtrueにします。
**赤色button**を選択してXcode右ペインのAttributeInspector内の下記赤枠にチェック。
これで上に**灰色view**が重なっていても**赤色button**のインタラクションを反応させる事が可能になりました。
RailsでCustom Web fontを使う

icomoonなどのCustom web fontをrailsで使う方法です。

## Web fontの配置

```
|-app/
|---assets/
|-----fonts/
|-----images/
|-----javascripts/
|-----stylesheets/
```

こんな感じで配置。

## asset のpathに追加

```rb:app/config/initializer/assets.rb

Rails.application.config.assets.paths << Rails.root.join("app", "assets", "fonts")
```

##scssの編集

```scss
@font-face {
  font-family:'icofonts';
  src:font-url('icofonts.eot');
  src:font-url('icofonts.eot?#iefix') format('embedded-opentype'),

  ...
} 
```

ポイントはcssでいうところの`src:url()`を`src:font-url()`にすることです。


あとはunicornとかの再起動すれば反映されます。

##参考

[Custom Web Fonts and the Rails Asset Pipeline](http://anotheruiguy.roughdraft.io/7379570-custom-web-fonts-and-the-rails-asset-pipeline)
hubotをforeverでデーモン化するときにハマった

[最新版のインストール方法](https://hubot.github.com/docs/)だとcoffee-scriptをグローバルインストールしなくても動きます。


この方法でインストールしたら、foreverでデーモン化する際にハマってしまったのでメモ。


**以下のコマンドで必ずcoffee-scriptをグローバルインストールしておくこと！**

```bash
sudo npm install -g coffee-script
```

foreverでデーモン化するためのstart.sh

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

export HUBOT_CHATWORK_TOKEN="XXXXXXXX" # APIのアクセストークンを入力します。
export HUBOT_CHATWORK_ROOMS="ZZZZZZ"   # カンマ区切りでルームIDを指定します。
export HUBOT_CHATWORK_API_RATE="60"   # 1時間あたりのAPIリクエスト数(間隔)を指定します。

forever start -c coffee node_modules/.bin/hubot -a chatwork -n kaki-bot
```
iPhone 6/6 PlusでViewやWindowをキャプチャすると表示がブレる現象への対処法

キャプチャを行う時に使われる

```objc:UIView.h
- (BOOL)drawViewHierarchyInRect:(CGRect)rect afterScreenUpdates:(BOOL)afterUpdates NS_AVAILABLE_IOS(7_0);
```
afterScreenUpdates に YES を渡すと現象が発生する。
NO を渡すことでこの現象を防ぐことができる。
※使用目的と要相談。
RailsアプリをOpsWorksにデプロイする


**環境**

- Ruby 2.1
- Rails 4.2.0
- MySQL
- nginx and Unicorn

**参考**

- [Deploying Ruby on Rails Applications to AWS OpsWorks](http://ruby.awsblog.com/post/Tx7FQMT084INCR/)
- [Chef デプロイフックの使用 - AWS OpsWorks](http://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/workingcookbook-extend-hooks.html)
- [Rails 4.2 写経用サンプルアプリ](http://qiita.com/usutani/items/2194b55cf1b975cf528d)

**サンプル**

- [https://github.com/usutani/store_rails420 branch: **opsworks**](https://github.com/usutani/store_rails420/tree/opsworks)

# Railsアプリの準備
## opsworksブランチの作成
RailsアプリにOpsWorks用のブランチを作成します。
例：私は[Rails 4.2 写経用サンプルアプリ](http://qiita.com/usutani/items/2194b55cf1b975cf528d)をクローンし、OpsWorks用のブランチを作成しました。

```bash
git checkout -b opsworks
```

## Gemの追加
GemfileにMySQL接続用のライブラリを追加します。

```Gemfile
gem 'mysql2', '~> 0.3.18'
```

therubyracerとunicorn行のコメントを外し、Gemを有効にします。

```Gemfile
gem 'therubyracer', platforms: :ruby
gem 'unicorn'
```

## アセットのプリコンパイル
deploy/before_symlink.rbファイルを追加し、シンボリックリンクステージの前にプリコンパイルを実行します。

```bash
mkdir deploy
vi deploy/before_symlink.rb
```

```deploy/before_symlink.rb
run "cd #{release_path} && RAILS_ENV=production bundle exec rake assets:precompile"
```

## GitHubリポジトリに反映

```bash
bundle install
git add -A
git commit -m OpsWorks
git push origin opsworks
```

# OpsWorksの設定
## Stack

デフォルト値のままで、Nameだけ入力し、「Add Stack」ボタンを押下します。

- Amazon Linux 2014.09

## Layers
**Rails App Server**

- Ruby version ```2.1```
- Rails stack ```nginx and Unicorn```
- RubyGems version ```2.2.2```
- Bundler version ```1.7.4```

**MySQL**

- デフォルト設定

## Instances

**Rails App Server, MySQL**

- t2.small などに変更します。

## Apps
**Application Source**

- Repository URL ```https://github.com/usutani/store_rails420.git```
- Branch/Revision ```opsworks```

**Environment Variables**

- SECRET_KEY_BASE **Protected value**

（参考）Mac：```bundle exec rake secret | pbcopy```でクリップボードにコピーします。

## Deployments

- Migrate database **YES**
- Advanced >> Custom Chef JSON

アプリ名```store_rails420```を置き換えてください。

```json
{
  "deploy":
  {
    "store_rails420":
    {
      "database":
      {
        "adapter": "mysql2"
      }
    }
  }
}
```
仮想マシン上のESXiへのVMware Tools導入

# 概要

仮想マシン上に構築されたvSphere ESXi 5.*にも、テクニカルプレビュー版のVMware Toolsをインストールできます。これにより、VMware Toolsによる時刻同期や、「ゲストのシャットダウン」メニューなどを利用できるようになります。

なお、5.*用としてはこのFLING（お試し）版をインストールする形でしたが、ESXi 6.0では最初から組み込まれていて、FLINGは不要になったようです。

# 詳細

## 入手

1. [VMware Tools for Nested ESXi – VMware Labs](https://labs.vmware.com/flings/vmware-tools-for-nested-esxi)にアクセスします。
2. `Instructions`タブを開きます。
3. `Option 1`の“Download _the VIB file_ and upload to an ESXi datastore”行のリンクをクリックします。

## インストール

ESXiのインストール後、通常のVIBパッケージと同じように、`esxcli`コマンドでインストールします。

    esxcli software vib install -v /vmfs/volumes/[DATASTORE]/esx-tools-for-esxi-9.7.1-0.0.00000.i386.vib -f

成功時の出力には、以下のような行が含まれます。

    Installation Result
       Message: The update completed successfully, but the system needs to be rebooted for the changes to be effective.
       Reboot Required: true
       VIBs Installed: VMware_bootbank_esx-tools-for-esxi_9.7.1-0.0.00000

成功したら、ESXiを再起動します。

## 効果

VMware Toolsの各機能を利用可能になります。例えば以下が含まれます。

* VMware Toolsによる時刻同期を利用できます。仮想マシンの「設定の編集」画面で有効にできます。
* 「ゲストのシャットダウン」メニューなどを利用できるようになります。またvAppでのシャットダウンアクションでも「ゲストのシャットダウン」を指定できます。
Start up the Paradise


神様は言いました。産めよ増えよ地に満ちよ
そして僕らは地に満ちた。ここはパラダイス？
世の中は人に溢れ、人が人を殺す
最終戦争やっているアルマゲドンだぁ

Start up the Paradise 天国を作ろう
Start up the Paradise 戦争をやめよう

理想家は言いました。宗教が無ければ
そんなことありえないよ　宗教は沢山
無宗教いう人も　宗教を攻撃
宗教批判が争い事　増やしてるんじゃねぇ？

Start up the Paradise 天国を作ろう
Start up the Paradise 戦争をやめよう

色んな考え許すのは　簡単ではないよね
縄張り争い負ければ　元の木阿弥だ

夢や理想じゃないよ　実現可能だよ
江戸時代　今の日本　戦争無いよ
これから戦地に行くのは　戦争無くすため
最終戦争終わらせ　天国作る為

Start up the Paradise 天国を作ろう
Start up the Paradise 戦争をやめよう
Start up the Paradise 戦争をやめよう
Emojiでログをたのしく探しやすく

# 従来のログ

CocoaLumberjackなどでXcodeのconsole logを見やすくするのは一般的です。

- [CocoaLumberjack/XcodeColors](https://github.com/CocoaLumberjack/CocoaLumberjack/blob/master/Documentation/XcodeColors.md)

いわゆるログのレベルに応じて、行に色を付けるカラーログの形式です。
これは、ぱっと見でログの種類がわかりやすいという実用的なメリットが存在します。

# 絵文字ログ

絵文字ログでは、ログのlevelに応じて、絵文字を設定します。
例えば以下のように。

| level | emoji |
|-------|:--------:|
| error | 🍣 |
| warn  | 🍺 |
| info  | 🍀 |
| debug | 🐳 |
| verbose | 🍙 |

絵柄はログの色のイメージになんなく合わせています。

![emoji_log.png](https://qiita-image-store.s3.amazonaws.com/0/15000/a3ccf881-dc40-4c99-63cf-65b4c5881243.png)

表示してみるとこんな感じ。

## メリット

なにいってんだこいつと思ったあなた、実用的なメリットも存在します。

1. ログの検索性が向上する (coloringではgrep検索できない)
2. 省スペース (たったの1文字!)
3. ログを見るのが楽しくなる (🍣🍣🍣)

簡単なサンプルを書いてみました。

- [EmojiLog.swift](https://gist.github.com/mattak/c81a3609b207568730a8)

ログのレベルにしか適用していませんが、タグやチャンネルにもルールを決めてつけてみるといいと思います。

# まとめ

絵文字を使う = 省スペース & 検索性の向上 & 楽しい!
javascriptで、非同期処理を永久に繰り返す

簡単に言うと、while(true)の非同期版みたいな感じ。npm / bowerのasync.foreverというのがあるのですが、これだとstart / stop機能がないので、この機能を加えたものを再実装してみました。

概念的にはスレッドと違いますが、ユースケースはスレッドと近く、バックグラウンドスレッド的な使い方をすることができます。

```js
function forever(handler, stopHandler){
    var isRunning = false;
    var shouldBeStopped = false;
    var _handler = function() {
        handler(function next(stop) {
            if(stop || shouldBeStopped){
                isRunning = false;
                stopHandler && stopHandler(stop);
            }else{
                _handler();
            }
        })
    }
    return {
        start: function(){
            shouldBeStopped = false;
            if(!isRunning){
                isRunning = true;
                _handler();
            }
        },
        stop: function(){
            shouldBeStopped = true;
        }
    }
}
```

# 例
```js
  var infiniteTask = forever(function(next){
    asyncFunc(function(x){
       if(x){
         next(); // continue
       }else{
         next(true); // stop
       }
    })
  }, function(){
    console.log('task finished');
  });
  infiniteTask.start();
  infiniteTask.stop();
  // この場合、asyncFuncは一度だけ実行される
サービスのサーバー移管に伴うSSL移管手順

## 前提
皆一度は経験するであろうサービスのサーバー移管
SSLの導入手順はよくあれど、移管手順はあまりなかったのでmemo

## 手順（準備）
0. 予めDNSのTTLを短くしておく（600等）

1. 元サーバーより以下3ファイルを探し出し、移行するサーバーにscp等で移動
  * .crtファイル（サーバー証明書）
  * .csrファイル（公開鍵）
  * .keyファイル（秘密鍵）

2. 移行サーバー内のお好きな位置に上記3ファイルを置く（ex. ***/.ssh）

3. mod_sslがapacheに入っていない場合以下コマンドで取得
  * ```yum -y install openssl```
  * ```yum -y install mod_ssl```

4. ssl.confファイルを以下のように編集
```SSLCertificateFile ***/.ssh/***.crt```
```SSLCertificateKeyFile ***/.ssh/***.key```

5. ```service httpd restartで再起動```

6. 確認方法
  * ローカルの/etc/hostsファイル内に以下追加し、アクセスしてみる
      * ```移行先のIPアドレス 移行先のドメイン名```
      * ```例：49.***.***.*** example.com ```

## 手順（移管）
7. DNSの設定を変える（おそらく主に以下）
  * Sirial： YYYYMMDD No
  * IN A  ："移管先のIPアドレス"
  * IN TXT v=spf1 --------

8. 確認（移管先サーバーにて）
```dig @localhost ドメイン名```
をうち移管先のIPが引けていたら成功


## その他memo
#### 秘密鍵の内容確認
```openssl rsa -in "***.key（秘密鍵）" -text```

#### CSRの内容を確認
```openssl req -in "***.csr（公開鍵）" -text```

#### 証明書の内容を確認
```openssl x509 -in "***.crt（証明書）" -text```


#### オプションmemo
* -text：バイナリファイルの内容をテキストで表示
ローカル開発環境の作成方法（Windows）


Vagrant、VirtualboxによるCentOSの作成方法を記します。

**「PC内に仮想マシンを入れるってどんなメリットがあるの！？」**
複数人で同じものを開発していると、個人のPCによる差異でうまく動かないものが出てくる場合があり、または開発環境と本番環境で違いが出てきてしまう事もあるため、開発の最初から本番環境で作ってしまおう、という理由から本番環境に近い仮想マシン内で作るんです。


基本的にWindowsで導入する場合、やることはまずは仮想マシン（CentOS、つまりLinux環境）を入れる事です。
これには手軽に行えるVirtualBoxとVagrantというものを使えば簡単です。

次にやることですが、これに関しては入れても入れなくても良いのですが、PuTTYというシェルを入れると、Windowsのコマンドプロンプトよりも扱いやすいものが手に入ります。

次は、実際に仮想マシンを入れたけど、ただ入れただけではプログラムは動きませんね。
PHPなり、Rubyなり使いたいプログラムをインストールします。

その際に一番迷いやすい、間違えるので以下に示すやり方は簡単でおすすめです。


> VirtualBox導入

[VirtualBoxダウンロード](https://www.virtualbox.org/wiki/Downloads)
上記ダウンロードページからWindows版のダウンロード&インストールをする。
インストールはデフォルト設定のままで良い。

> Vagrant導入

[Vagrantダウンロード](https://www.vagrantup.com/downloads.html)
上記ダウンロードページからWindows版のダウンロード&インストールをする。
インストールはデフォルト設定のままで良い。

> VagrantでCentOS立ち上げ

コマンドプロンプトなどで以下のコマンドを打つ。

1. mkdir localdev
2. cd localdev
3. mkdir mycentos
4. cd mycentos
5. vagrant init chef/centos-6.5
6. vagrantfile編集  
vagrantfile内の「config.vm.network "private_network", ip: "192.168.33.10"」のコメントアウトを外す。そして保存する。
7. vagrant up

> PuTTY導入

PuTTYはフリーの Win32 用 Telnet/SSH クライアント。
日本語版があるのでそちらが便利。

[ダウンロード](http://yebisuya.dip.jp/DL/putty-0.60-JP_Y-2007-08-06.exe)

インストール完了したら詳細設定をします。

1. ホスト名  
192.168.33.10を記載する
2. 文字コード  
UTF-8へ変更
3. セッション名追加  
「セッション一覧」へ「mycentos」と入力
4. 「開く」をクリック  
開くとログイン名とパスワードを聞かれるので二つとも「vagrant」
するとログインした状態となる

> 仮想マシン内にプログラムをインストール

細かい設定記述があるので迷いやすい。（自分は最初よくわからず迷いまくりでした...）
そのため今回は[ドットインストールさん](http://dotinstall.com)が非常に分かりやすく簡単なのでそちらから閲覧するのが良いかと。
簡単にまとめると以下コマンドとなります。

1. sudo yum -y install git
2. git clone https://github.com/dotinstallres/centos65.git
3. cd centos65
4. ./run.sh
5. php -v
6. python --version
7. exec $SHELL -l
8. ruby -v
9. mysql --version
10. sudo service httpd status

> CentOSの起動方法及びシャットダウン方法

* PuTTYのログアウト方法  
exitとコマンドを打つ
* Vagrantの一時停止方法  
コマンドプロンプトで以下のコマンド  
vagrant suspend
* 再度Vagrantを起動させる場合  
CentOSのフォルダまで移動し「vagrant up」

> WinSCP(ファイル転送ツール)の導入

WinSCP以外だとFileZillaがあるが、使いやすさと見た目的にも個人的にはWinSCPかな。
1. [WinSCPページ](http://winscp.net/eng/download.php)　から「Installation package」をクリック。
2. 設定項目からホスト名（192.168.33.10）、ユーザ名（vagrant）を記述
3. 「ディレクトリ」の「リモートディレクトリ」に「var/www/html」を記述
4. セッションの保存名を「mycentos」と記述
5. ログイン
6. パスワード「vagrant」