OmniAICreator/Qiita-1.07M huggingface dataset:
Fabricではシェルスクリプト中のパイプの途中でのステータスコードは取得出来ないという話

# 背景

たとえば、

```bash
$ true | false | true
```

や

```bash
$ ls -S1 hoge* | haed -n1
```

の様なパイプ処理を含んだシェルスクリプトを動作させた直後に、

```bash
$ echo $?
```

などのコマンドでステータスコードを確認したとき、最初や途中の処理でエラーが発生していたとしても、パイプの最後のステータスコードしか取得出来ない。

途中経過のステータスコードを取得する際には、実行直後に、`${PIPESTATUS[@]}`という配列を参照することで得ることが出来る。

```bash
$ true | false | true
$ echo ${PIPESTATUS[@]}
0 1 0
```

# Fabric の場合

通常、Fabric の場合には、`run`コマンドや `sudo`コマンドなどの戻り値に`.succeeded`や`.failed`などというプロパティがあるので、これを参照することが多い。

```py
result = run("false", warn_only=True)
print result.succeeded
```

ただし、`${PIPESTATUS[@]}`に相当する変数はないため、途中でのステータスコードは取得出来ない。


# 問題点

冒頭のシェルスクリプトの様な例を考える。

```py
@task
def return_test():
    # カレントディレクトリの hoge という文字列を含むファイルのなかで一番大きいものを表示する
    result = run("ls -S1 *hoge* | head -n1")
    print result.succeed
    print result
```

このときに、カレントディレクトリに `hoge` を含むファイル/ディレクトリがない場合には、`.succeeded`は`run`の結果しか返しないし（headは実行出来ているので、ここは`True`）、内容としてはエラーの表示（標準エラー出力）がそのまま返ってしまう。

```
[192.168.0.1] Executing task 'return_test'
[192.168.0.1] run: ls -S1 *hoge* | head -n1
[192.168.0.1] out: ls: cannot access *hoge*: No such file or directory
[192.168.0.1] out:

True
ls: cannot access *hoge*: No such file or directory

Done.
Disconnecting from 192.168.0.1... done.
```

本来欲しい情報が返っているわけではないし、気持ち悪いのだけど、この例だとたまたまそういうディレクトリ名なのかも知れない場合もあるし困る。

# 解決法（結論）
お茶を濁しましょう。

```py
@task
def return_test():
    result = run("ls -S1 *hoge* 2> /dev/null | head -n1")
    print result
```
```
[192.168.0.1] Executing task 'return_test'
[192.168.0.1] run: ls -S1 *hoge* 2> /dev/null | head -n1


Done.
Disconnecting from 192.168.0.1... done.
```
Googleスプレッドシートサイトマップ作成便利関数まとめ

サイトマップを自動で作ってくれるサイトは色々ありますけど、自分で簡単にできないものかと思ってスプレッドシートを駆使した時のメモ。JavaScriptは使わず関数だけで。

## 指定したURLのタイトルを取得

IMPORTXML関数で簡単に取得できます。Excelにはない関数でとても便利。

|   | A | B |
|:-:|:--|:--|
| 1 | http://qiita.com/Qiita/items/c686397e4a0f4f11683d | |

B1セルに以下の式を記入します。

```
=IMPORTXML(A1,"//title")
```

すると、

|   | A | B |
|:-:|:--|:--|
| 1 | http://qiita.com/Qiita/items/c686397e4a0f4f11683d | Qiita - Markdown記法 チートシート - Qiita |

タイトル取れた！＼(^o^)／

問題は取得先のファイルがUTF-8でないといけないこと。
IISサーバーで、Shift_JIS使っていて、日本語タイトルが文字化けする罠にハマった。

## 指定したURL内のアンカーリンクを取得

これも同じくIMPORTXML関数で取得します。

|   | A | B |
|:-:|:--|:--|
| 1 | http://qiita.com/Qiita/items/c686397e4a0f4f11683d | Qiita - Markdown記法 チートシート - Qiita | 
| 2 | | |

要はソースコード内のa要素のhref属性の値を取得したいので、A2セルに以下の式を記入します。

```
=IMPORTXML(A1, "//a/@href")
```

|   | A | B |
|:-:|:--|:--|
| 1 | http://qiita.com/Qiita/items/c686397e4a0f4f11683d | Qiita - Markdown記法 チートシート - Qiita | 
| 2 | / | |
| 3 | http://shop.qiita.com/ | |
| 4 | /login?redirect_to=%2FQiita%2Fitems%2Fc686397e4a0f4f11683d | |
| 5 | /signup?redirect_to=%2FQiita%2Fitems%2Fc686397e4a0f4f11683d | |
| 6 | /tags/qiita | |
| 7 | ※以下省略 | |

取れた！＼(^o^)／
後はルートパスからの値は、先頭にドメインを結合するなど別セルで文字列にしてあげれば、指定したページからのリンクが確認できます。そのパスに対してタイトルを取得するようにすれば、リンク先が何のページかも確認できて便利です。

## URLのディレクトリ階層をセルに分割する

サイトマップを作る際にディレクトリの深度を知りたくて、「/（スラッシュ）」区切りでセルの分けることがしたかったので、以下の関数を用いて分割しました。
C1セルに以下の式を記入します。

```
=split(A1,"/")
```

|   | A | B | C | D | E | F | G |
|:-:|:--|:--|:--|:--|:--|:--|:--|
| 1 | http://qiita.com/Qiita/items/c686397e4a0f4f11683d | Qiita - Markdown記法 チートシート - Qiita | http:	| qiita.com | Qiita | items | c686397e4a0f4f11683d |

分割された〜！＼(^o^)／
あとはセルの数を数えて深度を計算して、その深度によって色を変えたりと色々工夫できます。

今回はサイトマップ作成だったので使いませんでしたが、テーブルやリストの取得には、[IMPORTHTML](https://support.google.com/docs/answer/3093339, "IMPORTHTML")関数を用いるようです。こちらもかな〜り便利。

## 参考
Googleドキュメントエディタヘルプ
https://support.google.com/docs/answer/3093342?hl=ja
PQI Air Cardをインフラストラクチャモードで自動起動する

WifiSettings画面で親となるアクセスポイントのSSIDが3つまで指定できて、
autorun.shで`/usr/bin/w2`を叩くと起動時にインフラストラクチャモードで起動できる、というのはちょっと検索すれば出てくる話。

けれど、アクセスポイントが見つからなかったときに、Eye-FiみたいにAPモードに切り替わって欲しい。
そのためのautorun.shが、以下。

```sh:autorun.sh
#!/bin/sh
a1
sleep 1
iwconfig
ifconfig mlan0 192.168.1.1 netmask 255.255.255.0 up
iwconfig mlan0 txpower 15
iwlist mlan0 scan
sleep 2
iwlist mlan0 scan 2>&1 > /tmp/wifilist.txt
connect_hotspot=0
for ssid in `cat /mnt/mtd/config/wsd.conf | egrep "AP_SSID : ." | perl -anle
do
    grep ESSID:\"$ssid\" /tmp/wifilist.txt
    if [ $? -eq 0 ]; then connect_hotspot=1; fi
done

if [ $connect_hotspot -eq 1 ];
then
    /usr/bin/w2 >> $statelog
else
    echo "fallback to AP mode" >> $statelog
    /usr/bin/w3
fi
```

`/usr/bin/a1`は、無線ハードウェアの初期設定用。
`iwlist mlan0 scan`で周囲のアクセスポイントがスキャンできるが、1度で全部出てこないことが多いので、2秒待ってもう一度スキャンし、2度目の結果をリストに保存している。
ブラウザから設定したSSIDなどは`/mnt/mtd/config/wsd.conf`に保存されているので、ここからAP_SSIDの設定だけを読み出し、スキャン結果に存在するかを確認している。
周囲に指定したアクセスポイントがあれば、w2を実行してインフラストラクチャモードに。
無ければ、w3を実行してAPモードで起動するようにしている。
fontforgeによるotf->ttf変換




よく見かけるスクリプトに、CIDFlatten()を付け加えませう。

```conv.sh
Open($1);
CIDFlatten();
Generate($1:r+".ttf");
Quit(0);
```

として、

```
fontforge -script conv.sh hogehoge.otf
```
とする。
なお、フォントのライセンスには十分注意しませう。
git stash popとは？



## git stash 
```hoge.rb
p hello
```
git add .

```hoge.rb
p hello world
```

git add .
git stash >　一時的にgit reset --hard HEADと同じ。

```hoge.rb

```
git stash pop > ステージングエリアのファイルを全てワーキングツリーに下ろして、復活。

```hoge.rb
p hello world 
```
herokuでspring-bootをgradleを使ってデプロイするときのコツ

# herokuとspring-boot
herokuにspring-bootをデプロイするときの`Procfile`の指定の仕方がいろいろあるようだが、しっくり来るのがあったのでメモ。
また、mavenではなくgradleを使ってデプロイする。

# gradleの準備
gradleは、`gvm`というパッケージ管理を使って、インストールする。
詳細は、こちら。

[MacでGradleのインストールについて＋GVMのコマンドなど使い方まとめ](http://www.task-notes.com/entry/20150412/1428807600)

# build.gradleファイルの準備
プロジェクト直下に(mavenでいうところの`pom.xml`と同じ場所)`build.gradle`ファイルを配置

```gradle:build.gradle
buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.3.RELEASE")
  }
}

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'spring-boot'

jar {
  baseName = 'spring-boot-sample'
  version =  '0.1.0'
}

repositories {
  mavenCentral()
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

dependencies {
  // tag::jetty[]
  compile("org.springframework.boot:spring-boot-starter-web") {
    exclude module: "spring-boot-starter-tomcat"
  }
  compile("org.springframework.boot:spring-boot-starter-jetty")
  // end::jetty[]
  // tag::actuator[]
  compile("org.springframework.boot:spring-boot-starter-actuator")
  // end::actuator[]
  testCompile("junit:junit")
}

defaultTasks "clean", "build"

task wrapper(type: Wrapper) {
  gradleVersion = '2.4'
}
```

# gradle wrapperでgradlewファイルを生成
この手順がわからずgradle使えないと思ってしまっていた。

```sh
gradle wrapper
```

- プロジェクト直下に`gradlew`ファイルが生成される。(`gradlew.bat`はWindowds用らしい)
- プロジェクト配下にgradleディレクトリが生成され、中にgradle-wrapper.jarが生成される。

![image](https://qiita-image-store.s3.amazonaws.com/0/38174/187808da-19e3-103c-8510-974b7d328ff6.png)

# gradlewから起動してみる

```sh
./gradlew build && java -jar build/libs/spring-boot-sample-0.1.0.jar
```

※ここで起動できないとあとに進まない

# ここから先は、以下のページを参考にした。

[GradleでビルドしたSpring BootアプリをHerokuで動かす](http://blog.scheakur.com/post/93002518387/gradle-spring-boot-heroku)

# Procfileを修正

```Procfile:Procfile
web: java -jar build/libs/spring-boot-sample-0.1.0.jar --server.port=$PORT
```

# foremanで起動してみる

```sh
foreman start web
```

※起動できるはず。起動できない場合は、ちゃんとjarファイルがあるか確認する。jarファイルの名前が間違っていないか？jarファイルがない場合は、`gradlew build`を実行してみる。

# .gitignoreに余計なファイルがコミットされないように設定を加える

```
.idea
/build/
/.gradle/
spring-boot-sample.iml
```

`gradle`ディレクトリは、必要だが、`.gradle`は不要。`build`も不要。

# herokuのカスタムbulidpackの設定

[heroku-buildpack-gradlew](https://github.com/marcoVermeulen/heroku-buildpack-gradlew)

READMEを見てみるとちょっと手順が違うようだが、動くので問題ないと思っています。

```sh
heroku config:set BUILDPACK_URL=https://github.com/marcoVermeulen/heroku-buildpack-gradlew.git
```

# gitにコミットして、herokuにpush

```sh
git push heroku master
```

herokuのログを確認。エラーがないこと。

```sh
heroku logs
```

起動を確認する

```sh
heroku open
```

動かくはず。
Turbolinks 3こそRailsの未来

# Turbolinks 3こそがRailsの未来

かもしれない。

# 追記 2016/2/22
と書いてたけど実現しない感じになってきました。
現状のTurbolinksは [Turbolinks classic](https://github.com/turbolinks/turbolinks-classic) とリポジトリ名が変更され、新たにTurbolinks5の開発が進められることになったようです。
背景にはiOSやAndroidとのCompatibilityを高めるためみたい。
Turbolinks3で目玉として導入される予定だったPartial ReplacementxはViewの遷移の責務がTurbolinksが持つことになり複雑さがますため、取りやめになりました。その代わりにpersistさせたいelementにdataを記述することでTurbolinksのDOMの置き換えがその部分は行われない手法が採用される予定みたい。これで複雑さを減らし、同じように高速化が実現出来るみたい。Rails5と同じタイミングでリリースされそうなので今後もチェックが必要そうです。




![](http://cdn.geekmonkey.org/teasers/images/000/000/014/normal/turbolinks-rails.png?1356743180)

先月行われた[RailsConf2015](http://railsconf.com)の[Keynote](https://www.youtube.com/watch?v=KJVTM7mE1Cc&list=PLE7tQUdRKcybf82pLlMnPZjAMMMV5DJsK)で[@dhh](https://twitter.com/dhh)がRails5について発表し、その中でRails5の目玉としてActionCabel, Turbolinks 3が紹介された。

Rails5以降、[Turbolinks3](https://github.com/rails/turbolinks)で何が変わるか。

## 今までのTurbolinks
* ページ遷移をする代わりにAjaxでGETリクエストを発行し、レスポンスからbodyタグの内容を取り出し、現在のページのbodyと入れ替えを行う事で、cssやjsのリクエストを減らす、それらのparseにかかる時間を短縮する効果が主な用途だった
* Turbolinksの特性上、ページ遷移を行わないため`document.ready`が発火しない、前のページで実行されたjsを明示的に終了させる必要がある、などの問題がありTurbolinksとjsのコードを共存させるのが難しい。

以前Turbolinksについて書いた記事、[こちら](http://qiita.com/saboyutaka/items/bcc0966313c6f7399a6e)も合わせてどうぞ

## 今日のWeb開発とその問題
Javascriptのクライアントサイドフレームワーク(Angular, Backbone, Emberなど)が多く出てきた事でブラウザ上で動くリッチなサイトが以前より開発しやすくなってきた。
しかしサーバサイドとクライアントサイドの両方の開発が求められるようになったため、その分エンジニアに両方のスキルが求められるか、またはそれらのスキルを持った複数のエンジニアが必要になってきた。
エンジニアのリソースが潤沢にある会社や、クライアントサイドもサーバサイドも両方こなせるエンジニアがいるチームなら問題ないのかもしれないがなかなか難しい。

## そこでTurbolinks
Railsの強みの一つは高速にWebアプリケーションを構築すること。スタートアップや個人が作りたいアプリケーションをできるだけ開発コストを抑えて最速で作成するのに適したWebアプリケーションフレームワークだと思う。
Turbolinks 3.0 から [Partial Replacements](https://github.com/rails/turbolinks#partial-replacements-with-turbolinks-30) の機能が追加され、今までbodyの中身全てを入れ替えていたところを、指定した一部のDOMのみを変更できるようになる。
クライアントサイドフレームワークを使用して動的にDOM操作をしていた箇所をTurbolinksを使うことで、ある程度置き換えることができる(かもしれない)。
Javascriptの使用をできるだけ抑え、Turbolinksを代わりに使用することで開発工数の増加を抑えることが狙い。

## Partial Replacements で実装できそうなこと
* ページのタブ操作やコンテンツ切り替え
* コメントの追加
* カートに商品を追加、個数の変更
* フォロー/アンフォローの切り替え
* ページ切り替え
* 検索キーワードに応じて結果を動的に切り替える
* 入力フォームのvalidation errorを画面遷移なしに表示(submitをするたびに)

などなど、これまでjsを使って実装するとなると割と工数がかかっていた事をほとんど実装することなく実現できるのではないだろうか。


## じゃあJavascriptはできるだけ使わないほうがいいのか
もちろんそれは一概には言えない。開発チームの構成、どういう機能が要求されるアプリケーションなのか、ユーザーエクスペリエンスがどのぐらい重要なのか、開発期間がどれくらいあるか、など様々な要因によって決まってくるのでなんとも言えない。開発工数を少なく素早く作りたい場合は、jsの使用はjQueryで簡単に実現できる程度で留めてクライアントサイドフレームワークを使わないという選択をすることもできる。それぞれメリット、デメリットがあるのでチームごとに考える必要がある。

## Rails API
RailsはTurbolinksを取り入れてJavascriptを完全に排除したいかというとそうではなくて、デフォルトの指針としてはJavascriptに極力手を出さずに開発することを目指すが、SPAのサーバやAPIサーバを構築する事も今後も積極的にサポートしていく。
Rails5から[Rails-API](https://github.com/rails/rails/pull/19832)がRails本体に取り込まれるとアナウンスしているので、こちらを使用してAPIサーバーとしてRailsを扱うこともできる。

## 今後のTurbolinks
Javascriptでも[React.js](https://facebook.github.io/react/)など新しく注目を集めるライブラリやフレームワークが出てきてますしクライアントサイドの開発は便利に、楽に、拡張性が高くなっていくはず。
しかし、Turbolinks3を使用することでJavascriptをそんなに必要とせずとも動的に動くサイトが比較的簡単に構築できるようになれば、リッチなサイトを構築することと開発工数との関係の一つの落とし所なのではーと期待してる。
ifort > ... causes the common block size to exceed the maximum of 2147483647 bytes

数値計算コードにてあるパラメータを大きくとった時、以下のエラーが出るようになった。

```
error #7911: Adding this variable to common-block-object-list causes the common block size to exceed the maximum of 2147483647 bytes.   [IT11]
     &     IT11(NPN6,NPN4,NPN4),IT12(NPN6,NPN4,NPN4),
-----------^
```

[intel](https://software.intel.com/en-us/forums/topic/278053)を見ていると以下のアドバイスは見つかった。
> jimdempseyatthecove  Sun, 05/27/2012 - 08:47
> If the array is in COMMON or module, make the array allocatable and perform the allocation in an init subroutine you call at the start of the program.

>If the variable is in subroutine/function scope use the heap arrays option.

>(this size of allocation will only work in x64 app)

ただ、非常に大きなメモリを使わないと解けない状況になっているのが問題である。
Jenkinsでスクリプト実行, jenkins-cli, 結果をメール通知, 拡張メール設定

# インストール

* http://jenkins-ci.org/
  * Java Web Archive (.war) をダウンロードし実行

```bash:javaが入っていない場合
apt install openjdk-7-jre-headless
```

```bash:dockerもある
docker run -p 8080:8080 jenkins
```


## 実行

```bash:8080ポートで実行
java -jar jenkins.war
```

ポート番号を変更したい場合は以下

```bash:8081ポートで実行
java -jar jenkins.war –httpPort=8081
```

## シェルスクリプトを実行させてみる

* 参考: [Jenkinsを使ってみよう（Mac OS X＆Linux）［Ruby、Rails］ - Build Insider](http://www.buildinsider.net/enterprise/jenkins/01)

# jenkins-cli

手元のPCから以下実行するとjenkinsサーバのコマンド結果が帰ってくる。

```bash:長いのでalias
alias jcli='java -jar jenkins-cli.jar -s http://192.168.100.22:8080/'
```

```bash:ジョブ一覧取得
jcli list-jobs
```

```bash:test_job_01のビルド
jcli build test_job_01
```

## 鍵のパスワード入力をスキップしたい場合

```bash:
$ jcli list-jobs
Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar 
Enter passphrase for /home/User/.ssh/id_rsa:
```

認証情報でアカウント作成し、`login`を使えば良いのだが面倒な場合は以下

```bash:改行を送れば良い。
yes | jcli list-jobs
```

## ビルド失敗をメール送信

* Jenkinsの管理 > システムの設定 >
  * (送信元) Jenkinsの位置 > システム管理者のメールアドレス
  * (送信先) E-mail 通知 > 高度な設定 > 返信先アドレス

* 試しにビルドを失敗させてみるとメール送信される。

## ビルド成功時もメールを送信

* 成功時もメールを送ってもらう場合は`Email-ext plugin`を使う。
* 標準では入っていないため追加でインストール
* ビルド後の処理の追加 > 拡張E-mail通知 > 
  * Advanced Settings > Triggers > Add Trigger > Always
  * Recipient List にメールアドレス入力
  * Attach Build Log
技術英語 > 30 to go > 残り30 / まだまだだなぁ

A「How many bugs do you still have?」
B「30 bugs to go.」
A「Really? You made good progress!」

残りいくつという時に使う。ただし、formalな場面ではleftを使って
We have 30 bugs left.
のように言う方が無難かもしれない。

to goを使う別の例としては
We've got a long way to go. (我々はまだまだです。)
という使い方もできる。
謙遜が美徳となる場面では使える。
secureCoding > 2の補数における事前条件の検査 > オーバーフローが発生しないことの確認

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> 次のコードは加算オペランドについて事前条件の検査を行い、オーバーフローが発生しないことを確認している。

```sample.c
signed int si1, si2, sum;

/* si1とsi2を初期化 */

unsigned int usum = (unsigned int)si1 + si2;

if ((usum ^ si1) & (usum ^ si2) & INT_MIN) {
    /* エラー処理 */
} else {
    sum = si1 + si2;
}
```

^はビットXOR
http://www.cppdrive.jp/cstart/ope/index6.html
2の補数 > 加算するか減算するかを決めるために、加算器もしくは減算器においてオペランドの符号を調べる必要がない

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

<hr>

[補数を使う利点](http://kccn.konan-u.ac.jp/information/cs/cyber03/cy3_hub.htm)
> 減算が加算として行える
- 減算回路を使用しなくてよくなる
- ハードウェアの構造を簡単にできる
人気プログラミング言語ランキング

#はじめに

オランダの TIOBE Software という会社がプログラミング言語の人気ランキング TIOBE Index というのを出しています。これはインターネットのGoogle などの主要サーチエンジン（の検索数) によって計算されているそうです。

#2015 年 4 月の状況

久々に様子を見てみたら下のようになってました。

![alt](http://bonk.red/articles/Misc/img/tiobeindex2015apr.png)

大きな変化として Java が C を上回り１位を獲得しましたね。これは C++ が増えた反動でしょうか。Java の長期低落傾向は変わってないように見えます。

Objecttive C は急激に伸びましたが、落ち込みも急激です。iOS 関連の開発が一段落したのと、Swift に移行した人が多いためでしょうか。

下の方ですが、Visual Basic が相変わらず頑張ってますね。この Visual Basic ですが、VBA などを含んでのものなんでしょうね。VBA の開発は今でもけっこうあるようで、国内でも求人がよく出てます。VB.NET はじり高ですが、国内でもサポート終了の Visual Basic 6.0 からの移行がけっこうあるようで、求人をよく見かけます。


#詳しい状況

詳しい状況ですが、上位はこんな感じです。

![alt](http://bonk.red/articles/Misc/img/tiobe_list2015apr.png)

Delphi / Object-Pascal が上位にあるのが目につきますね。国内ではずっと前にピークアウトして新規開発となると実行スピードが必要でグラフィカルな表示も必要なシミュレーション系のアプリとかでたまにある程度でしょうか？

MATLAB とか国内では研究所とか大学とかじゃないとあまりお目にかかりませんが、海外だと需要が多いんですね。ABAP も国内での求人はめったに見かけません。

R が19 位に上がってきましたが、ビッグデータの需要が増えているので、国内でもそのうち求人が増えるかもしれません。

20 位以下ですが、こんな感じです。あまり見たことがない言語がけっこうあります。この辺になると１％未満の順位なのでどちらが上でどちらが下なんてあまり関係がないです。COBOL、FORTRAN、Lisp、Ada、RPG とか大昔からある言語が未だに使われているようです。

![alt](http://bonk.red/articles/Misc/img/tiobe_list2015apr2.png)


[こちらはミラー](http://bonk.red/articles/Misc/popular_languages_2015apr.html)
secureCoding > x86-32アーキテクチャ > フラグレジスタのレイアウト

引用: C/C++ セキュアコーディング 第2版 by Robert C. Seacordら

> 図5-6 x86-32 アーキテクチャにおけるフラグレジスタのレイアウト

- オーバーフロー (OF)
- ディレクション (DF)
- 割り込み (IF)
- 符号 (SF)
- ゼロ (ZF)
- 補助キャリー (AF)
- パリティ (PF)
- キャリー (CF)

http://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture
HerokuでDockerでTrusterdを動かすまで　準備編その０

# 参考記事

- [DockerでHerokuでmrubyが動いたぞ!!1 - delirious thoughts](http://blog.kentarok.org/entry/2015/05/08/004452)

# Dockerfile

とりあえず、build_configを編集したら

```
heroku docker:start
```

を実行する際にmrubyをリビルドするようにしてみた。

```
FROM heroku/cedar:14

RUN useradd -d /app -m app
RUN chown app:app -R /app

WORKDIR /app

ENV HOME /app
ENV PORT 3000

# install mruby
WORKDIR /app
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get -y update
RUN apt-get -y install git libmagick++-dev
USER app
RUN git clone https://github.com/mruby/mruby.git
#RUN mkdir -p /app/heroku/trusterd
#RUN curl -s https://s3pository.heroku.com/node/v$NODE_ENGINE/node-v$NODE_ENGINE-linux-x64.tar.gz | tar --strip-components=1 -x -C /app/heroku/trusterd
#ENV PATH /app/heroku/trusterd/bin:$PATH

RUN mkdir -p /app/.profile.d
#RUN echo "export PATH=\"/app/heroku/trusterd/bin:\$PATH\"" > /app/.profile.d/trusterd.sh
#RUN echo "cd /app/src" >> /app/.profile.d/trusterd.sh

EXPOSE 3000

#RUN curl -s http://78.108.103.11/MIRROR/ftp/GraphicsMagick/1.3/GraphicsMagick-1.3.21.tar.gz | tar xvz -C /tmp
#WORKDIR /tmp/GraphicsMagick-1.3.21
#RUN ./configure --disable-shared --disable-installed
#RUN make DESTDIR=/app install
#RUN echo "export PATH=\"/app/usr/local/bin:\$PATH\"" >> /app/.profile.d/nodejs.sh
#ENV PATH /app/usr/local/bin:$PATH
ONBUILD RUN mkdir -p /app/src
ONBUILD WORKDIR /app/src
#ONBUILD COPY package.json /app/src/package.json
ONBUILD COPY ./build_config.rb /app/mruby/build_config.rb
#ONBUILD RUN npm install
ONBUILD WORKDIR /app/mruby
ONBUILD RUN ./minirake

ONBUILD COPY . /app/src
```

# が、問題が

最近作り始めたmruby-mrmagickを早速このbuild_config.rbに加えて

```rb
MRuby::Build.new do |conf|
  toolchain :gcc
  conf.gembox "default"

  conf.gem github: "iij/mruby-pack"
  conf.gem github: "iij/mruby-io"
  conf.gem github: "iij/mruby-socket"
  conf.gem github: "mattn/mruby-http"
  conf.gem github: "matsumoto-r/mruby-simplehttpserver"
  conf.gem github: "kjunichi/mruby-mrmagick"
end
```

としたが、Magick++-configコマンドがないとエラー！

結局Dockerfileにapt-get install にimagemagickを加える事になりましたとさ。

# さらに悪いことに

Herokuにデプロイしたところ、

```
2015-05-08T22:13:28.658784+00:00 heroku[web.1]: Starting process with command `/app/mruby/bin/mruby /app/src/server.rb 54430`
2015-05-08T22:13:30.122433+00:00 app[web.1]: /app/mruby/bin/mruby: error while loading shared libraries: libMagick++.so.5: cannot open shared object file: No such file or directory
```

# ここまでのおはなし

暗雲立ち込めてきた。。。

# ところで

Herokuはhttp2に対応しているの？

hint:
<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/%E3%81%8A%E3%81%AF%E3%82%88%E3%81%86?src=hash">#おはよう</a> lieveとlibeventはどうやら別物毎度、nghttp2のアプリがconfigureでNOになり、今回はこれだった</p>&mdash; kjunichi (@kjunichi) <a href="https://twitter.com/kjunichi/status/596787950202920960">2015, 5月 8</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# 続き

- [HerokuでDockerでTrusterdを動かすまで　準備編その1](http://qiita.com/kjunichi/items/63ee6085595b9192e46e)
LeakCanaryでメモリリークを検出する

# LeakCanary

Squareがメモリリークを検出するライブラリ [square/leakcanary](https://github.com/square/leakcanary) を公開したので、さっそく使ってみたらすごく便利だった話です。

# A small leak will sink a great ship

Piwaiが書いたLeakCanaryの記事がこちらです。
[LeakCanary: Detect all memory leaks!](https://corner.squareup.com/2015/05/leak-canary.html)

要約すると、

- Squareではビットマップキャッシュに顧客の署名を書いていたが、端末の画面のサイズ分のメモリを確保するので、署名をするときにクラッシュすることがあり、それがOOMの大半を占めていた。
- Bitmap.Configを変更したり、OOMをキャッチしてGCを走らせたりしたが、問題の解決には至らなかった。
- 我々は間違ったアプローチを取っていたことに気が付いた。ビットマップの大きさではなくメモリリークが根本的な原因だったのだ。
- 通常であればメモリリークを検出するのは手作業だが、これらをライブラリが自動で検出すればあなたはメモリリークの修正に集中することができる。そこでLeakCanaryというメモリリークを検出するライブラリを作った。
- その結果は素晴らしく、実に94%のOOMのクラッシュを減らすことができた。

<img src="https://corner.squareup.com/images/leakcanary/oom_rate.png" width="360px">

*If you want to eliminate OOM crashes, [install LeakCanary now!](https://github.com/square/leakcanary)*

# LeakCanaryの導入の仕方

Dependencyにleakcanaryを追加して、

```groovy
dependencies {
 debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
 releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
}
```

アプリケーションの初期化時にLeakCanaryを初期化するだけです。

```java
public class ExampleApplication extends Application {

  @Override public void onCreate() {
    super.onCreate();
    LeakCanary.install(this);
  }
}
```

リポジトリにサンプルプロジェクトがあるので、試してみることができます。

```sh
$ git clone git@github.com:square/leakcanary.git
$ cd leakcanary/library
$ ./gradlew leakcanary-sample:installDebug
```

メモリリークが発生すると通知が表示されて、タップするとActivityが開いて誰がどのオブジェクトを持っているのかを見ることができます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/179/f1aad11f-4f66-cc7d-ec8d-152aa8ce0065.png" width="360px">

さらに、メモリリークの通知はアプリとしてインストールされるので、いつでも確認できるようになります。これはサンプルではなくライブラリの機能なので、一行あなたのプロジェクトに追加するだけで、この便利な機能を使うことができます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/179/0cbb536a-1078-494f-6c5d-42cf79319c1b.png" width="360px">

# LeakCanaryのメモリリークの検出方法

## なぜ一行書くだけでメモリリークを検出できるのか

- `LeakCanary.install(application)` を呼ぶ。
- ActivityRefWatcherクラスによってActivityLifecycleCallbackに登録される。
- ActivityがonDestroyされる度にGCを走らせる。
- 参照が解放されたかチェックして、されていなければヒープをダンプして解析してDisplayLeakActivityに表示する。

## ヒープ情報はどこから来るのか

`Debug.dumpHprofData(fileName)` を呼んでいます。
hprofはバイナリなのですが `org.eclipse.mat` のパーサーを使ってSnapshotに変換して、そこから表示しやすくするためにLeakTraceに変換しています。

# 実際に使ってみた

さっそくアプリに入れてみたらメモリリークが！LeakCanaryを見てみると、破棄されるはずのActivityが参照を持っていて、調べるとあるFragmentの中でBusのunregisterが漏れていることが分かりました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/179/7a4ac55e-1c77-3431-1889-2b3245d405eb.png" width="480px">

一行入れるだけで簡単にメモリリークが調べられてすごく良いです。優秀なSquareのエンジニアでさえメモリリークは見逃してしまうものなので `largeHeap` を有効にする前にまずLeakCanaryを入れましょう。
goでlinux Armバイナリをクロスコンパイルする



##概要

自宅では [ReadyNAS® 104](http://www.netgear.jp/products/details/RN10400.html)を使っているのですが、
そいつで自作ツールを動かしたくなったので、arm用にクロスコンパイルする方法を調べました。

##環境の確認

まず、kernelを確認する

```
# uname -m
armv7l
```

arm v7 ぽいことがわかった。

https://github.com/golang/go/wiki/GoArm
で確認したところ、対応してる！


##前準備

とりあえず、 [いつもと同じように](http://qiita.com/Jxck_/items/02185f51162e92759ebe#2-5) make.bashで前準備を行う

```
# cd /usr/local/go/src/
# GOOS=linux GOARCH=arm ./make.bash
```
実行結果はいつもと同じように流れる

```
# Building C bootstrap tool.
cmd/dist

# Building compilers and Go bootstrap tool for host, darwin/amd64.
lib9
libbio
liblink
cmd/cc
cmd/gc
cmd/6l
cmd/5l
.
.
.

```


##コンパイル

このコードを

```go:main.go
package main

import "fmt"

func main() {
	fmt.Println("hoge")
}
```
GOARMでバージョンを指定してビルド

```
$ GOOS=linux GOARCH=arm GOARM=7 go build
```

そしてターゲットにコピーして実行

```bash:
$ scp armtest hogefuga:
$ ssh hogefuga

$ ./armtest
hoge
```
動いた！
clang-ompのセットアップ


Homebrew使います。

```
brew install clang-omp
```

.zshrc等に、

```
export LIBRARY_PATH=/usr/local/lib:$LIBRARY_PATH
export C_INCLUDE_PATH=/usr/include:/usr/local/include:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/usr/include:/usr/local/include:$CPLUS_INCLUDE_PATH
```

試す。

```c:hello.c
#include <libiomp/omp.h>
#include <stdio.h>

int main() {
#pragma omp parallel
  printf("Hello from thread %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads());
  return 0;
}
```

```
$ clang-omp -fopenmp hello.c -o hello && ./hello
Hello from thread 0, nthreads 4
Hello from thread 1, nthreads 4
Hello from thread 3, nthreads 4
Hello from thread 2, nthreads 4
```

参考：http://clang-omp.github.io
GoogleDriveにある画像ファイルをMarkdownに出したい

## 解決したい問題
### GitHub:e での Wiki なり Gist に使うカジュアルな画像ファイル置き場が欲しい
今回はコレをどうにかしたいって話になります。

#### 要件

1. 画像の内容的に外に公開はしたくない
    - リリース前のプロジェクトのキャプチャであったり
    - 内部の設計の図解であったり
2. 何度か差し替えたりする都合も考えるとgitリポジトリに画像ファイル置くのは面倒でつらい
    - GitHubのリポジトリ内のファイルへのURLはリンク切れよく起こすよね
    - commit->push->URL取る->貼ってみる->「差し替えたい…」
3. イントラネットにアクセスできる人なら確実に見えてくれないと困る
    - 全員が使ってるクラウドストレージって前提があると良い

今回は、 **「GoogleAppsっていうかGoogleDriveを皆が使ってくれている前提」** だとこういう風に解決できるっていうのを紹介します

## Demo
![LGTM](https://drive.google.com/uc?export=view&id=0B2wZU2hYh05XVVZmM19Ca3l2enc "LGTM")

↑ の画像は個人用のGoogleDriveを共有設定 **[ウェブ上で一般公開]** に指定したフォルダにつっこんであるgifです

```
![LGTM](https://drive.google.com/uc?export=view&id=0B2wZU2hYh05XVVZmM19Ca3l2enc "LGTM")
```

GitHub:e の中でクローズドに見せたい場合は「特定のユーザーのみ閲覧可」とか、GoogleAppsのユーザーなら閲覧可などに指定しておけば大丈夫です

## 1. GoogleDriveの共有リンクについて

「共有リンクを取得」で以下2種類のURLが取れます

（っていうか、結局これ飛び先一緒なのになんで2つに分けてあるのか謎）

```
# ファイル一覧からコンテキストメニューで取得できる共有用リンク
https://drive.google.com/a/${APP_DOMAIN}/open?id=${FILE_ID}&authuser=0

# プレビューから取得できる共有用リンク
https://drive.google.com/a/${APP_DOMAIN}/file/d/${FILE_ID}/view?usp=sharing
```

ここでの `FILE_ID` は英数字、つまり `[0-9a-zA-Z]+` の正規表現で取り出せます

対して、今回は画像を直で見せたいのでこのままだと上手く貼れません。URLをこのように差し替えます

```
https://drive.google.com/a/${APP_DOMAIN}/uc?export=view&id=${FILE_ID}
```


## 2. 正規表現で雑に置換
### 雑なRubyでも書いておきます

```drive-direct-url.rb
#!/usr/bin/env ruby

FILE_ID = "([[:alnum:]]+)"
PATTERN = [
    /(.*)\/open\?id=#{FILE_ID}.*/,
    /(.*)\/file\/d\/#{FILE_ID}.*/
]

def convert(url)
    unless url =~ /^https:\/\/drive\.google\.com/
        return "[INFO] It is not url of GoogleDrive."
    end

    if url =~ /(.*)\/uc\?export=view&id=#{FILE_ID}/
        return "[INFO] already converted."
    end

    PATTERN.each do |re|
        if url =~ re
            return "[INFO] convert => #{$1}/uc?export=view&id=#{$2}"
        end
    end
end


puts(convert($*[0]))
```

雑ですね。

### 雑JavaSciptも書いておきます
これをUserScriptなりブラウザ拡張なりに使うとか、(Markdownにある画像リンクに対して正規表現で引っ掛けて置換する)Atom用に作るとかとか、まぁ色々できるのでは

```js
function getDriveImageURL(url) {
    var pattern = [
        /(.*)\/open\?id=([0-9a-zA-Z]+).*/,
        /(.*)\/file\/d\/([0-9a-zA-Z]+).*/
    ];
    
    for (var i = 0; i < pattern.length; i++) {
        if (pattern[i].test(url)) {
            return url.replace(pattern[i], "$1/uc?export=view&id=$2");
        }
    }
}
```

以上です

## 参考リンク
- [Permalinks for Google Drive Images](http://googlesystem.blogspot.jp/2013/02/permalinks-for-google-drive-images.html)
- [stackoverflow - Displaying files (e.g. images) stored in Google Drive on a website](http://stackoverflow.com/questions/10311092/displaying-files-e-g-images-stored-in-google-drive-on-a-website)
なぜ「小数点」を「少数点」と間違えるのか

仕事で仕様書を見ると「少数点」という誤字をたまに見かけることがある。またネットで小数点について検索すると技術系ブログでも誤字をよく見かける。まだ文章中に「小数」と「少数」が混在しているならいいが、タイトルとして「少数点」と書かれていると萎える。

今回、このテーマで書く上で改めて「[少数点　javascript|Perl|C#|PHP|Ruby|VB|Excel](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#tbs=li:1&q=%E5%B0%91%E6%95%B0%E7%82%B9%E3%80%80Javascript%7CPerl%7CC%23%7CPHP%7CRuby%7CVB%7CExcel)」のキーワードの完全一致で検索したり、「[少数点 仕様書](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=%E5%B0%91%E6%95%B0%E7%82%B9+%E4%BB%95%E6%A7%98%E6%9B%B8&tbs=li:1&start=0)」のキーワードの完全一致で検索してみた。  
ちょっと驚いたのが、公的機関である県や市役所等の資料で「少数点以下」等の誤字が出てくることであり、特に電力関連に多くみられる。市役所の方だって人間であるから間違えることはあるだろうが、一般的には教養がある方々のはずなので恥ずかしいと思う。

しかし、なぜ「小数点」を「少数点」と間違えるのだろう。「小数」と「少数」の意味を理解していないのか。
小数は「小数点以下の小さい数」の意味しかないが、少数は「少ない数」で反対語として「多数」があり、少数意見や少数精鋭など一般的によく使用する言葉である。
そうすると、「小数」と「少数」の誤字ならIMEの変換ミスが考えられるが、「小数点」と「少数点」と点まで入るならば、通常のIMEなら「小数点」のみが表示されるはずであり、わざわざ「少数」に修正はしないだろう。
市役所等の資料などから推測されるなら、昔に間違えて作成された資料を日付など少しの変更のみで使いまわして気付いていないケースであろう。

日本語の誤用については、「確信犯」や「役不足」など意味の誤用が広まり過ぎていて、今では正しく使う人の方が少ないケースはある。また「危機一発」→「危機一髪」、「週間誌」→「週刊誌」が正しいが、意味ではなく漢字で誤用されて広まっているケースはそんなに無いと思われる。
例えば「保証」と「保障」は使い分けが難しく意味を知っても間違えてしまう場合があるが、「小数点」は小学4年生の算数から習っているわけで、馴染みがあるはずであり、プログラムを学んで技術系ブログまで書いている人が誤用をして公開している。

そこには一体何があるのか、闇のみが残る・・・。
[Git] とにかく速く特定のブランチをgit cloneしたい場合のTips

Vim の自動ビルドスクリプトを書いていたんですが、vim の clone が遅すぎるので対策を調べました

# TL;DR

Gitの`shallow clone`の機能を使いましょう。

`-b branchname --single-branch --depth=1` とやればよさそう

# 検証
## 普通に`git clone`した場合

```console
$ time git clone https://github.com/vim-jp/vim.git vim0

Cloning into 'vim0'...
remote: Counting objects: 56064, done.
remote: Compressing objects: 100% (131/131), done.
remote: Total 56064 (delta 76), reused 0 (delta 0), pack-reused 55933
Receiving objects: 100% (56064/56064), 157.80 MiB | 333.00 KiB/s, done.
Resolving deltas: 100% (35750/35750), done.
Checking connectivity... done.

real    8m12.556s
user    0m29.880s
sys     0m42.800s
```

ネット環境の影響もあるが遅い・・・

## `-b master --single-branch` を使用する

```console
$ time git clone -b master --single-branch https://github.com/vim-jp/vim.git vim1

Cloning into 'vim1'...
remote: Counting objects: 56063, done.
remote: Compressing objects: 100% (131/131), done.
remote: Total 56063 (delta 76), reused 0 (delta 0), pack-reused 55932
Receiving objects: 100% (56063/56063), 157.80 MiB | 325.00 KiB/s, done.
Resolving deltas: 100% (35750/35750), done.
Checking connectivity... done.

real    8m24.252s
user    0m31.904s
sys     0m43.812s
```

オブジェクト数は1減っているものの、時間は通信速度の影響下むしろ増加
ある程度歴史のあるリポジトリで、プランチが多く生存してる場合は効果がありそう。

## `--depth=1` を使用する

```console
$ time git clone --depth=1 https://github.com/vim-jp/vim.git vim2

Cloning into 'vim2'...
remote: Counting objects: 2663, done.
remote: Compressing objects: 100% (2548/2548), done.
remote: Total 2663 (delta 137), reused 1762 (delta 53), pack-reused 0
Receiving objects: 100% (2663/2663), 11.81 MiB | 319.00 KiB/s, done.
Resolving deltas: 100% (137/137), done.
Checking connectivity... done.

real    0m43.275s
user    0m2.500s
sys     0m3.020s
```

とても速い・・・!!

## `-b master --single-branch --depth=1` を使用する

```console
$ time git clone -b master --single-branch --depth=1 https://github.com/vim-jp/vim.git vim3

Cloning into 'vim3'...
remote: Counting objects: 2663, done.
remote: Compressing objects: 100% (2548/2548), done.
Receiving objects: 100% (2663/2663), 11.81 MiB | 322.00 KiB/s, done.
remote: Total 2663 (delta 137), reused 1762 (delta 53), pack-reused 0
Resolving deltas: 100% (137/137), done.
Checking connectivity... done.

real    0m42.486s
user    0m2.956s
sys     0m2.808s
```

`--depth=1`とさほどかわらず

## 結論
`-b branchname --single-branch --depth=1` とやればよさそう

# git submodule の場合

以下のようにすれば良さそうです

```bash
$ git submodule update --init --depth=1
```

ちなみに

```bash
$ git clone --recursive --depth=1 https://github.com/davidhalter/jedi-vim.git
```

とした場合、submodule の方には`--depth=1` が適用されませんでした (git v1.9.1)

## 追記（git 2.9 ~）

`--shallow-submodules` というオプションが追加されたようです。

```bash
$ git clone --recursive --depth=1 --shallow-submodules https://github.com/davidhalter/jedi-vim.git
```

## 追記（git 2.10 ~）
Git 2.10から以下のオプションが使えるようになったようです。（未検証）

```bash
$ git config -f .gitmodules submodule.<name>.shallow true
```

[Git shallow submodules - Stack Overflow](http://stackoverflow.com/questions/2144406/git-shallow-submodules)

# 関連

[[Git] shallow cloneしたリポジトリを、あとで完全にfetchする - Qiita](http://qiita.com/koara-local/items/3f0898d9fc1108c19bcd)
コンストラクタが暗黙に宣言されるとき、されないとき

こんにちは。
最近勉強し始めたc#でWPFをやってみましたが、もう見たくもありません。

さて、今日はc++を使っていても意外になかなか覚えない、コンストラクタの暗黙の宣言 / 非宣言をまとめておきたいと思います。
関連して、よく問題になる暗黙のコピー、ムーブの問題についても書き留めておこうと考えています。

コンパイラが用意してくれる特殊関数は以下になります。(c++14時点)

デフォルトコンストラクタ
コピーコンストラクタ
コピー代入演算子
ムーブコンストラクタ
ムーブ代入演算子
デストラクタ

何事もなければこれらが全て暗黙的に宣言・定義されます。( `class something {};` )
平和ですね。みんながみんなこうであればよいのですが、そうはいかないのです。

#コンストラクタが暗黙に宣言されるとき、されないとき

ざっくり以下に表にまとめました。
なお、constructorをctor, operatorをop, declarationをdeclと略しています。
[deprecated]は宣言されるものの非推奨の意（後述）です。
見方としては、例えば何かしらのコンストラクタを自前で書いた場合、横へ見ていって、デフォルトコンストラクタは宣言されない、コピームーブデストラクタはdefaultだな、といった感じです。

||default ctor|copy ctor / op|move ctor / op|destructor|
|:-:|:-:|:-:|:-:|:-:
|any ctors|no decl|default|default|default
|copy ctor / op |no decl|-|no decl|default
|move ctor / op |no decl|[deprecated]|-|default
|destrctor|default|[deprecated]|[deprecated]|-

~~パクリ元~~参考:
[特殊メンバ関数とコンパイラによる暗黙宣言](http://d.hatena.ne.jp/yohhoy/20140704/p1)
[本の虫: C++0xにすごい変更が来た](http://cpplover.blogspot.jp/2010/11/c0x.html)

なお、メンバ変数や基底クラスでdeleteされている関数は暗黙的にdeleteされます。
これは宣言されない(no decl)ではなく、削除(delete)なので、仮に明示的なデフォルト宣言(=default)をしたとしてもdeleted functionという扱いになります。

# 暗黙的コピーとムーブが定義されることの問題

上の図では、3箇所に[deprecated]が入っています。
定義されるものの非推奨と言ったのは、これらは本来暗黙的に定義されてはならないと言ってもいいものだからです。

例えば、デストラクタを自前で用意したときのcopy / moveはdeprecatedになっていますね。
デストラクタは何かリソースを解放するためのものと言っても過言ではありません。何かリソースを解放しなければならないクラスというのは、そのリソースについて所有権を持っており、責任を負っているということです。

```
class sth0
{
  int* p;
public:
  sth0() p( new int() ) {}
  ~sth0() { delete p; } 
};
```

リソースはなんでもいいですが、例えばこのようなクラスを書けば、ひと目で多重解放の危険があることが分かるでしょう。デストラクタを定義する場合のほとんどがこのようにリソースを管理する場合のはずです。

ゆえに、本当にデフォルト処理のコピーやムーブで構わないのであれば、それを明示してあげるべきです。

```
class sth1
{
public:
  // sth1() = default; // if you need
  sth1( const sth1& ) = default;
  sth1& operator ( const sth1& ) = default;
  sth1( sth1&& ) = default;
  sth1& operator ( sth1&& ) = default;
  ~sth1() { std::cout << "output log" << std::endl; }
};
```

このクラスでは、デストラクタの処理はログを記録するだけです。
なのでコピーやムーブはデフォルトのものを使って欲しいと明示してあげます。
なお、コピーやムーブコンストラクタを宣言することでデフォルトコンストラクタが宣言されなくなります。
もし必要であればデフォルトコンストラクタもdefaultで明示してあげなくてはなりません。

ここまでくればムーブを明示的に宣言したときにコピーが暗黙宣言されてしまうことがdeprecatedであることの理由は分かるかと思います。

何にせよ、全ての特殊関数をいちいち明示的に宣言/削除してあげるのが確実ですね。
少なくとも、人に読ませるようなコードではそうしたほうがいいかもしれません。

```
class something
{
  // ctor
  something() noexcept = default;
  // copy
  something( const something& ) = default;
  something& operator = ( const something& ) = default;
  // move
  something( something&& ) noexcept = default;
  something& operator = ( something&& ) noexcept = default;
  // dtor
  ~something() noexcept = default;
};
```
Docker Containerの自動再起動

Ubuntu on Vagrantな環境で、MySQL on Dockerを構築して、VMの起動で一緒にMySQL on DockerなDocker Containerが起動出来たら嬉しいな〜とか思っていて、調べたら、--restart=always を付けるだけでいいらしい。

http://deeeet.com/writing/2014/09/17/docker-1-2-restart/

provisionで、サクッとDBまで作って、VM外からも接続出来るようにgrants設定もするスクリプトを書いてみた。
これをVagrantfileでinline shellとして呼んでやればいいはず。

```bash
$docker_mysql = <<SCRIPT
    if type apt-get >/dev/null 2>&1; then
        echo I am provisioning...
        sudo apt-get update
        sudo apt-get -y dist-upgrade

        if [ ! $(type mysql >/dev/null 2>&1) ]; then
            sudo apt-get install -y mysql-client
        fi
        if [ ! $(type docker >/dev/null 2>&1) ]; then
            sudo apt-get install -y lxc-docker
        fi
    fi

    echo start docker container

    if [ 0 -eq $(docker ps -f name=storage -qa | wc -l) ]; then
        docker create --name storage -v /vagrant:/vagrant:rw -v /media/sf_share:/media/sf_share:rw busybox:latest
    fi

    if [ 0 -eq $(docker ps -f name=mysql -qa | wc -l) ]; then
        docker run --name mysql -p 3306:3306 --volumes-from storage:rw --privileged --net=host -e MYSQL_ROOT_PASSWORD=hogehoge --restart=always -d mysql:5.6
	sleep 10
	echo "CREATE DATABASE fugafuga DEFAULT CHARSET UTF8; grant all privileges on *.* to '%'@'%';" | mysql --user=root --password=hogehoge
    fi
SCRIPT
```
bcコマンドの限界は68桁？(回避方法あり

[hello worldより「コラッツの問題」書くほうがいろいろ学べそう](http://qiita.com/inaba178/items/9dc2026780ca7d148b26)という投稿でシェルスクリプトでコラッツの問題を書きました。

```bash:collatz.sh
#!/bin/sh
collatz() {
    n=$1
    echo $n
    sleep 0.5s
    if [ `echo "$n % 2" | bc` -eq 1 ] && [ $n != "1" ]; then
        collatz `echo "3 * $n + 1" | bc`
    elif [ `echo $n % 2 | bc` -eq 0 ]; then
        collatz `echo $n / 2 | bc`
    fi
}

collatz $1
```

この投稿で

>99999999999999999999999999999999999999999999999999999999999999995まで計算出来ました。

と書いたのですが、
99999999999999999999999999999999999999999999999999999999999999996はなぜダメだったかというとエラーが出ていたのです。
※環境はmacです。

```
99999999999999999999999999999999999999999999999999999999999999996
49999999999999999999999999999999999999999999999999999999999999998
・・・（省略
36947297000885009765624999999999999999999999999999999999999999999999
11084189100265502929687499999999999999999999999999999999999999999999\
(standard_in) 1: illegal character: \
collatz.sh: line 6: [: -eq: unary operator expected
(standard_in) 1: illegal character: \
collatz.sh: line 8: [: -eq: unary operator expected
```

68桁でバックスラッシュが入ってしまい数値化できずエラーというところでしょうか。
「なんで68桁でバックスラッシュが入るのかなぁ」と思ってbcに大きい値を入れてみると

```shell-session
$ echo 9999999999999999999999999999999999999999999999999999999999999999999999999999999 | bc
99999999999999999999999999999999999999999999999999999999999999999999\
99999999999
```

バックスラッシュが入りました。
どうやらbcが68桁でバックスラッシュを入れているみたいです。

# bcのmanを見る

man見たら何かわかるだろと思い、「bc man」でググって一番上の[Man page of bc - JM Project](http://linuxjm.sourceforge.jp/html/GNU_bc/man1/bc.1.html)へ
環境変数の項でなんとなく関係ありそうな説明を発見

>BC_LINE_LENGTH
>数字を出力するときの 1 行の文字数を整数で指定します。 数字が長過ぎると、バックスラッシュと改行を含めた出力となります。

これっぽい
現在のBC_LINE_LENGTHを見ようと

```shell-session
$ echo $BC_LINE_LENGTH

```

としてみても空行が返されるだけでした。
デフォルトで68桁なのでしょうか？

「BC_LINE_LENGTH」でググると

```shell-session
$ BC_LINE_LENGTH=999 echo 9999999999999999999999999999999999999999999999999999999999999999999999999999999 | bc
```

か

```shell-session
$ export BC_LINE_LENGTH=999
```

で変えられると書いてありました。
環境変数はなるべく汚したくなかったので最初は前者でやったのですが効きませんでした。

```shell-session
$ BC_LINE_LENGTH=999 echo 9999999999999999999999999999999999999999999999999999999999999999999999999999999 | bc
99999999999999999999999999999999999999999999999999999999999999999999\
99999999999
```

バックスラッシュで改行されます。
なので今度は後者で。

```shell-session
$ export BC_LINE_LENGTH=999
$ echo 9999999999999999999999999999999999999999999999999999999999999999999999999999999 | bc
9999999999999999999999999999999999999999999999999999999999999999999999999999999
```

改行されません！思ったとおりに動くと楽しいですね！
ではこれで最初の「コラッツの問題」をやってみましょう！！

```shell-session
$ export BC_LINE_LENGTH=999
$ sh collatz.sh 99999999999999999999999999999999999999999999999999999999999999996
・・・（省略
24921477006304688
12460738503152344
collatz.sh: line 6: [: -eq: unary operator expected
Segmentation fault: 11
```

エラーで落ちました。
「Segmentation fault: 11」は[セグメンテーション違反](http://ja.wikipedia.org/wiki/%E3%82%BB%E3%82%B0%E3%83%A1%E3%83%B3%E3%83%86%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%81%95%E5%8F%8D)というアクセスしてはいけないメモリにアクセスした時に起きるエラーのようです。
再帰処理だし、桁数多いからメモリ使うだろうしで、これはどうしようもないかもしれないですね(^_^;)
(再帰じゃなくてwhileで回す処理ならメモリ食わないのかな？とか考え中。)
アプリの状態が変わったタイミングで処理を行わせる実装

アプリがバックグラウンドに移行したり、フォアグラウンドになった場合はviewWillAppearなどのメソッドは呼ばれません。その場合は、下記のようなNSNotificationCenterを利用して、任意のメソッドを実行させるようにします。
## Notification一覧
使いそうなやつだけ記載。

|種類  |説明 |
|---|--- |
|UIApplicationWillEnterForegroundNotification |フォアグラウンドになる直前に呼ばれる|
|UIApplicationDidBecomeActiveNotification  |アクティブになったら呼ばれる  |
|UIApplicationWillResignActiveNotification |アクティブでなくなる直前に呼ばれる|
|UIApplicationDidEnterBackgroundNotification |バックグラウンドになったら呼ばれる|
|UIApplicationWillTerminateNotification|終了する直前に呼ばれる|
## 実装
各viewControllerのviewDidLoad内で実行したいメソッドをNotificationCenterに登録します

```objc
- (void)viewDidLoad {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(testMethod) name:UIApplicationDidBecomeActiveNotification object:nil];
}

- (void)testMethod {
    NSLog(@"%@", @"test");
}
```
PyPlot.jl でデフォルトのfigsizeを指定する方法

## 結論

`PyCall`を使えばできます。

## コード

```jl
using PyCall
matplotlib = pyimport("matplotlib")

# デフォルトのfigsizeを設定
# ** matplotlib["rcParams"]はPyObjectという型になっているので、Juliaの辞書のようにアクセスするために、PyDict型に包んでから代入する（`setindex!`を呼ぶ）
PyDict(matplotlib["rcParams"])["figure.figsize"] = (10, 5)
# ↑は、以下と等価
# setindex!(PyDict(matplotlib["rcParams"]), (10, 5), "figure.figsize") 

using PyPlot

# 適当な何か
plot(rand(10))
```

この方法は、すべてのfigureに対して設定を反映したいときに便利です。

PyPlotを使い始めた頃、Juliaからどうすればできるのかわからなかったのですが、PyCallを使えば可能でした。

## figureに対して個別にfigsizeを指定したい場合

以下のようにすれば可能です。

```jl
using PyPlot

# 指定したfigsizeでfigureを作成
figure(figsize=(16, 6))
# 何か描画
plot(rand(10))
```

おわり

## 参考

- [PyPlot.jl issue #114 comment / any way to custom font in PyPlot?](https://github.com/stevengj/PyPlot.jl/issues/114#issuecomment-73064596)
- [PyPlot.jl issue #87 comment / New issue use default backend if possible](https://github.com/stevengj/PyPlot.jl/issues/87#issuecomment-59574566)
- [PyPlot.jl issue #72 / changing font size for tick labels and axis labels](https://github.com/stevengj/PyPlot.jl/issues/72#issuecomment-50907076)
Macにフォントをコマンド一発で導入する！

# tl;dr

```bash
$ brew cask install font-source-code-pro
```

# 導入
[Homebrew](https://github.com/Homebrew/homebrew)
[Homebrew Cask](https://github.com/caskroom/homebrew-cask)

をあらかじめ導入しておきます 

かつ、https://github.com/caskroom/homebrew-fonts を`tap`しておく

```bash
$ brew tap caskroom/fonts 
```

# インストールできるフォントのリスト

```bash
$ brew cask search /font/
```

# 感想文

日本語対応フォントがまだまだな感じなので、プルリクでどんどん登録していただけると私としては大変ありがたいです
(許諾とったりがよくわかっていないので他人任せ顔
githubのREADMEに埋めるgif動画の作り方決定版

READMEに動画埋め込んでますか？
UIUX系だと動きがキモって言う場合多いですよね。

そんな時にサクッと動画を貼りたい！
皆gifにしてるしgifにしよう！
録画しよう！
movをgifに変換しよう！
フリーソフトで変換しよう！
容量でかいな！
あああああ

上記は僕の場合です。オンラインコンバーターとか色々巡りました。
そして結論としては、

##QuickTimeで録画してffmpegで書きだす！以上！

って感じです。
`ffmpeg -i sample.mov -vf scale=320:-1 -r 10 sample.gif`
で10秒のmovが大体6MBくらいになります。

ちなみにREADMEに貼るのは
`![タイトル](リンクURL)`
ですよ！
iOSでスプライトを使ったプログラムを書いてキャラクタを自由に動かす


![ofruby-splite](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20150506/20150506231611.gif)

[ofruby-0.7](http://ongaeshi.hatenablog.com/entry/ofruby-0.7)の絵文字表示機能を使うと自分で絵を書かなくても簡単にゲーム的なものを作ることが出来ます。簡単に移動、回転、スケールさせるためにPure Rubyで簡単なスプライトライブラリも実装してみました。

↑の🐖🚴🌴のソースコード全体はこちらから参照出来ます。

[ofruby-sample/sprite.rb](https://github.com/ongaeshi/ofruby-sample/blob/master/sprite.rb)

## 使い方

初期位置と読み込む画像を指定します。読み込みたい絵文字は[ofrubyをインストール](https://itunes.apple.com/jp/app/ofruby/id908715098?mt=8)した後に、[Sample: emoji.rb](https://github.com/ongaeshi/ofruby-sample#10-emoji)を使って確認して下さい。[Emoji cheat sheet](http://www.emoji-cheat-sheet.com/)などで取得出来る絵文字は大体いけるのでそっちを使ってもいいです。ただし指定はシンボル形式(`:pig2`)で。

まずは`Sprite.new(x, y, image)`で生成します。

```ruby
@pig = Sprite.new(50, 0, Image.emoji(:pig2))
```

デフォルトの基準座標は右上ですが`set_anchor_center`で中心に変更することが出来ます。

```ruby
@pig = ....
@pig.set_anchor_center
```

基準座標を足下にしたり、`mirror(vertical, horizontal)`で画像を上下左右反転させることも出来ます。

```ruby
@bicyclist = Sprite.new(50, GY, Image.emoji(:bicyclist))
@bicyclist.set_anchor_bottom
@bicyclist.mirror(false, true)
```

`vx`, `vy` に値を設定すると一定速度で動きます。`Sprite#update`を呼び出すのを忘れないようにしましょう。

```ruby
@bicyclist = ...
@bicyclist.vx = 2
```

スケーリングや回転も簡単にかけることが出来ます。

```ruby
# スケーリング
@pig.sx = @pig.sy = 3

＃回転
@pig.rotate = 45
```

## サンプルコードの説明

- 豚 .. 大きくして毎フレーム回転させる
- 自転車 .. 足下基準にして左右反転して地面に配置、横速度一定、画面左端に来たら座標を右端に戻す
- ヤシの木 .. スプライト使わずに描画、Yスケール掛けて一定間隔で配置

## スプライトライブラリ本体

40行位で書けました。`Image#draw`の前に`set_color_hex 0xffffff`しているのはopenFrameworksの画像描画は少しクセがあって、現在のset_colorの値をブレンド係数として使うからです。0xffffffだと画像の色がそのまま出力されます。0x0だと真っ黒になります。

```ruby
class Sprite
  attr_accessor :x, :y, :rotate, :sx, :sy
  attr_accessor :vx, :vy

  def initialize(x, y, image)
    @x = x
    @y = y
    @image = image
    @rotate = 0
    @sx = 1
    @sy = 1
    @vx = @vy = 0
  end

  def mirror(x, y)
    @image.mirror(x, y)
  end

  def set_anchor_center
    @image.set_anchor_percent(0.5, 0.5)
  end

  def set_anchor_bottom
    @image.set_anchor_percent(0.5, 1.0)
  end

  def update
    @x += @vx
    @y += @vy
  end

  def draw
    push_matrix do
      translate @x, @y
      Kernel.rotate @rotate
      scale @sx, @sy

      set_color_hex 0xffffff
      @image.draw(0, 0)
    end
  end
end
```

`Sprite#draw内のset_color_hexを`0xff0000`に変更すると画像のR(赤)成分だけが出力されます、不気味ですね。

ヤシの木だけ色が変わらないのはスプライトライブラリを使わずに描画しているからです。

![sprite-02-s.png](https://qiita-image-store.s3.amazonaws.com/0/3885/efaaa80f-7733-d031-5a59-c8f1a17ac2dc.png "sprite-02-s.png")

## おわりに
ぜひ絵文字機能を使ってゲームっぽいものを実装してQiitaで共有してください。分からない機能などありましたらこちらやTwitterで聞いて下さい。
NW.jsアプリ開発フォルダの作り方 (MacOSX)

Node-WebkitもといNW.jsは面白いんだけど日本語ドキュメントが少なくてGithub wikiの英語をちゃんと読む必要があります。

ここではNW.jsアプリのフォルダ構成について私なりに「こんな感じで作ればいいのかな」というものをメモしておきます。環境はMacOSX、NW.jsはv0.12.1です。

**１. NW.jsをダウンロードしましょう**
　[公式サイト](http://nwjs.io/)から自分の環境に合ったものをダウンロードします。
　私の場合はOSX64です。

**２. アプリケーションフォルダへ配置**
　ダウンロードしたzipフォルダをunzipすると以下３ファイルが現れます。

```
credits.html
nwjc
nwjs
```
このうち nwjs をアプリケーションフォルダへ移しましょう。
これが一つのアプリのひな形になります（おそらく）。

**３. ソースの配置**
　アプリケーションフォルダに配置したnwjsを右クリックして「パッケージの内容を表示」を選びます。

![スクリーンショット 2015-05-09 0.09.15.png](https://qiita-image-store.s3.amazonaws.com/0/51303/b7d6ec5d-b8bd-4a92-159d-f4a5a1877e3f.png)

以下のフォルダ構成となっていました。

![スクリーンショット 2015-05-09 0.22.30.png](https://qiita-image-store.s3.amazonaws.com/0/51303/fe862539-7825-6b18-73fc-ff6ba3dee6d1.png)

アプリのソースを配置するフォルダを"Contents\Resources"に作ります。

ここで一つ注意するべきなのが、フォルダ名の末尾に".nw"を付けるということです。ここでは”app.nw”とします。

このapp.nwフォルダ下にhtmlやjsファイルを格納します。NW.jsアプリは最低限一つのhtmlファイルとpackage.jsonファイルがあれば動きます。

package.jsonのフォーマットは[Githubのwikiページ](https://github.com/nwjs/nw.js/wiki/Manifest-format)などを参考にしてください。

app.nwフォルダ下に最低限のファイルを入れるとフォルダ構成は以下のようになります。

![スクリーンショット 2015-05-09 0.34.41.png](https://qiita-image-store.s3.amazonaws.com/0/51303/39187a30-eb56-af3c-82d8-1523c181ab3e.png)

**４. アプリを起動してみる**
　通常のアプリと同様に、nwjsアプリを起動してみます。
　app.nwフォルダ下のindex.htmlに記述された内容が表示されるはずです。

**５. ソースのバイナリ化をした場合は**
　NW.jsにはセキュリティのためにアプリのソースファイルをビルドしてバイナリ化する機能が備わっています。

[参考サイト](http://lealog.hateblo.jp/entry/2015/03/02/234536)

その場合にできる.nwファイルもResourcesフォルダ以下に配置すればOKです。


英語ドキュメントをざっくりで読んでいたら、バイナリ化したソースをResources下に入れることとか読み飛ばしていて結構ハマっていました。

注）私自身NW.jsを触り始めて日が浅いので以上の手順がスタンダードなものかは不明です。
jQuery で select タグに option タグを追加する

例えば `<select class="my-select" multiple>` という select タグに
jQuery を使って option タグを追加してみます。

```js
var characters = {
        yuno: 'ゆの',
        miyako: '宮子',
        sae: '沙英',
        hiro: 'ヒロ',
        nori: '乃莉',
        nazuna: 'なずな'
    },
    $select = $('.my-select'),
    $option,
    isSelected;

$.each(characters, function (value, name) {
    isSelected = (value === 'miyako' || value === 'nori');
    $option = $('<option>')
        .val(value)
        .text(name)
        .prop('selected', isSelected);
    $select.append($option);
});
```

[val](http://api.jquery.com/val/) メソッドで value 属性を、[text](http://api.jquery.com/text/) メソッドでテキストを、
[prop](http://api.jquery.com/prop/) メソッドで任意の属性 (今回の例では selected 属性) を option タグに設定します。
そして [append](http://api.jquery.com/append/) メソッドを使って select タグに option タグを追加します。

![options.png](https://qiita-image-store.s3.amazonaws.com/0/6697/38eaddd2-ffc4-6cc7-4513-c5e749a49357.png)

できたぞ！ ＼＼\\٩( 'ω' )و//／／

# 追記

@takeyuichi さんからアドバイスを頂きました。ありがとうございます！

1. タグの生成時にオブジェクトで属性を指定できる。 ([参考](http://api.jquery.com/jQuery/#jQuery2))
2. ループ内での DOM 要素の追加はコストが高いので、ループ外で一括で追加する。 ([参考](https://learn.jquery.com/performance/append-outside-loop/))

以上の助言を元にソースコードを更新してみました。

```js
var characters = {
        yuno: 'ゆの',
        miyako: '宮子',
        sae: '沙英',
        hiro: 'ヒロ',
        nori: '乃莉',
        nazuna: 'なずな'
    },
    $select = $('.my-select'),
    $option,
    options,
    isSelected;

// コールバック関数の引数の順序が $.each と異なることに注意。
options = $.map(characters, function (name, value) {
    isSelected = (value === 'miyako' || value === 'nori');
    $option = $('<option>', { value: value, text: name, selected: isSelected });
    return $option;
});

$select.append(options);
```
repMin を遅延評価を使わずに書く

遅延評価（または循環プログラミング？）の面白さを説明する例として `repMin` がある（[Repmin Problem - Circular programming - Haskell](https://www.haskell.org/haskellwiki/Circular_programming#Repmin_problem)）。

葉として整数値を持つ木があるとき、すべての葉を葉の最小値で置き換えるという問題だ。

```haskell:repMin.hs
data Tree
    = Leaf Int
    | Branch Tree Tree
    deriving Show
````

単純な解法では、まず木を一度走査して葉の最小値を見つけ出し、もう一度走査してすべての葉をその値で置き換える。

```haskell:repMin.hs
repMin :: Tree -> Tree
repMin tree = repLeaf (findMin tree) tree
  where
    findMin (Leaf n) = n
    findMin (Branch t1 t2) = findMin t1 `min` findMin t2
    repLeaf n (Leaf _) = Leaf n
    repLeaf n (Branch t1 t2) = Branch (repLeaf n t1) (repLeaf n t2)
```

しかし、次のようにすると木の走査を一回にできる。

```haskell:repMin.hs
repMin' :: Tree -> Tree
repMin' tree = t
  where
    (m, t) = replace m tree
    replace m (Leaf n) = (n, Leaf m)
    replace m (Branch t1 t2) =
      let
        (m1, t1') = replace m t1
        (m2, t2') = replace m t2
      in (m1 `min` m2, Branch t1' t2')
```

`(m, t) = replace m tree` の両辺に `m` が現れているのがミソだ。ここで、最小値 `m` は実際に値が必要になるまではサンク（未評価の値）になっている。

正格評価の言語の例として、 OCaml で、遅延評価を使わず同じくひとつの再帰関数で書いてみる。

```ocaml:
type tree
  = Leaf of int
  | Branch of tree * tree

let rep_min tree =
  let rec replace = function
    | Leaf n -> (n, fun m -> Leaf m)
    | Branch (t1, t2) ->
      let (m1, c1) = replace t1
      and (m2, c2) = replace t2
      in (min m1 m2, fun m -> Branch (c1 m, c2 m))
  in
  let (m, c) = replace tree in
  c m
```

Haskell 版で「最小値（を表すサンク）」と「葉を最小値で置き換えた木（を表すサンク）」を返していたのを、「最小値」と「値を受け取ると元の木の葉をその値で置き換えた木を返す関数」を返すようにする。「最小値」を計算しつつ、『「最小値」を使う計算』を陽に自分で組み立ててやる。
Safariの表示でfが重なった時カーニングがおかしくなる問題

# Safariの表示でfが重なった時カーニングがおかしくなる問題
について。

文字にofferとかあった場合letter-spacingがsafariではfとfの間が繋がって表示されて効いてくれない。

```css
-webkit-font-variant-ligatures: no-common-ligatures;  
```
で解決できた。
MongoDBのコンソールから日付で検索


個人的なメモ。

```mongoコンソール
// collectionNameは対象のコレクション（テーブル）名に置き換える
db.collectionName.count() //=> 50   レコード数が返る
col = db.collectionName
col.find({ "date" : { "$gte" : ISODate("2015-05-08T00:00:00Z")}})
//"date"フィールドが2015年5月8日以降のものを検索する
```

$gteは「>=」のこと。
$gt、$lt、$lteはそれぞれ「>」「<」「<=」に対応する。
$gteと$lteを一緒に指定すれば「X日〜Y日まで」という指定も可能。