OmniAICreator/Qiita-1.07M huggingface dataset:
angularjsで戻る時に警告を出す。


http://stackoverflow.com/questions/14809686/showing-alert-in-angularjs-when-user-leaves-a-page

```hogeCtrl.js
$scope.$on('$locationChangeStart', function( event ) {
    var answer = confirm("Are you sure you want to leave this page?");
    if (!answer) {
        event.preventDefault();
    }
});
```
ASP.NET MVC Web API のヘルプページへドキュメントを反映させる

ASP.NET MVC プロジェクトをWebAPIで作成すると、ヘルプページが自動で作成されてとても便利です。

そんなの知らないぜ、欲しいぜって方はNuGetからインストールできます。(MVC 5 だと初めから入ってました)

```bash
Install-Package Microsoft.AspNet.WebApi.HelpPage
```

しかし、そのまま公開されたヘルプページを見てみると、関数のドキュメントはことごとく無視され、Descriptionなどは空のままです。
これではヘルプにならない!

![sc0057.png](https://qiita-image-store.s3.amazonaws.com/0/111100/9c5fa243-436b-419c-8b13-cf89ed89084c.png)

---
そこで、ソース内のドキュメントをxmlとして出力し、ヘルプページに読み込んでもらうように設定します。

### ヘルプページ設定

1. {Project}\Areas\HelpPage\App_Start\HelpPageConfig.cs を開く
1. Register関数の始めにある↓を(言われるがまま)アンコメント

```csharp
//// Uncomment the following to use the documentation from XML documentation file.
config.SetDocumentationProvider(new XmlDocumentationProvider(HttpContext.Current.Server.MapPath("~/App_Data/XmlDocument.xml")));
```

### xmlの保存

1. webプロジェクトのプロパティを開く
1. ビルド > 出力 にある XMLドキュメントファイルをチェック
1. 先ほどHelpPageConfig.csで設定したパスを出力先として設定
![toritori.png](https://qiita-image-store.s3.amazonaws.com/0/111100/20182b81-66f8-9691-8e37-0de9f019bb2a.png)

### 確認

ビルドしたら実行してみます。
![sc0058.png](https://qiita-image-store.s3.amazonaws.com/0/111100/baed2c70-046e-4f59-0a50-eb2cbb8157a6.png)

マーベラス！
あとは好みに合わせて外観をカスタマイズしていきましょう。

あと、この状態でビルドすると
ヘルプに関係ない関数でも「xmlコメントがないですよ!」と嬉々として警告をだしてくれますが、
それ、あなたたちが自動生成したソースでしょ...。
実行中のプロセスをログアウトしても動かし続ける方法２つ

うっかり時間のかかるプロセスをnohupなしで実行してしまったときにログアウトしたい。そんなときに。

#方法１

1. ```ctrl+z```でジョブを一時停止。
1. ```bg```でバックグラウンドへ。
1. ```job```でジョブの確認
2. ```disdown```でログアウトしても実行されるようにする

```
rpmbuild -ba hoge.spec
# Ctrl+Zで中断
bg 1
jobs 1
disown %1
```

#方法２
huponexitの設定を変えます。これがonになっていると、ログアウトしたときにバックグラウンドプロセスがキルされます。

 *  ```shopt huponexit```で設定を確認し、offだったらok
  * ```shopt -s huponexit```でON
  * ```shopt -u huponexit```でOFF

あとは、

1. ```ctrl+z```でジョブを一時停止。
1. ```bg```でバックグラウンドへ。


#帰れる・・・・
http://blog.glidenote.com/blog/2013/09/26/bg-and-disown/
http://deno-blog.com/post-196/
Theta Sの動画からタイムラプス用にJPEGを切り出す

# 目的
Theta Sで撮った動画から、指定フレームごとにJPEGを保存します。
(動画で撮ったはいいけど、リアルタイムで全部見るのはなかなか大変なので、短縮バージョンとしてタイムラプス動画を作ってます。)

なお、以下で切り出したjpegを、[Theta+アプリ](https://play.google.com/store/apps/details?id=com.thetaplus)でタイムラプス化すれば、グリグリできる動画となります。
なお、Theta+アプリはJPEG300枚までしかタイムラプス動画を作成できないようなので、それ以上の場合は[Lapse It Time Lapse Proアプリ](https://play.google.com/store/apps/details?id=com.ui.LapseItPro)で作ってます。

# 参考サイト
イチから書くスキルがないのでいろんなところから借用^^; ありがとうございます。

1. Python3.0環境にOpenCV3.0をインストールする
http://retrofocus28.blogspot.jp/2015/08/python3-opencv3windows.html
2. OpenCV3.0で動画ファイルの読み込み
http://derivecv.tumblr.com/post/73561473978

# 使い方
python mp42jpg.py MP4FileName [FrameInterval]
FrameIntervalは何フレームごとにJPEG保存するかを指定します。省略時は120(ThetaSの動画はほぼ15fpsだそうですので、15fps×8秒毎)フレーム毎です。

# ソース
```mp42jpg.py
import cv2
import os.path
import sys

interval = 120  #about 15fps*8sec

if len(sys.argv) >= 2 and len(sys.argv) <= 3:
    filename = sys.argv[1]
    if len(sys.argv)==3:
        interval = int(sys.argv[2] )
else:
    print('Usage: python %s mp4_filename [frame_interval]' % sys.argv[0])
    quit()

cap = cv2.VideoCapture(filename)
max_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)
file_basename, ext = os.path.splitext(filename)
ret = cap.grab()

while(ret):
    frame_count = cap.get(cv2.CAP_PROP_POS_FRAMES)
#    ret, frame = cap.read()
    ret, frame = cap.retrieve()
    
    if ret :

        #cv2.imshow('frame',frame)
        print("frame count:%d" % frame_count)
        cv2.imwrite('%s_%d.jpg' % (file_basename,frame_count),frame)
        if (frame_count + interval ) > max_frames:
            break;
        cap.set(cv2.CAP_PROP_POS_FRAMES,frame_count+interval)
        
#        if cv2.waitKey(1) & 0xFF == ord('q'):
#            break

cap.release()
#cv2.destroyAllWindows()
```

上記コメントになっているimshowを実行すると、Windowに表示するようになります。
QdmailでHTMLメールを送るときの４つの嵌りポイント

#環境
PHP 5.1.2
qdmail 1.2.6b

#qdmailでのHTMLメール送信のさせ方

http://hal456.net/qdmail/oopbase

基本的な使い方は、下記です。

```lang:php
require_once 'qdmail.php';

$mail = new Qdmail();

$mail -> to( 'address@example.com' , '宛先日本語名' );
$mail -> subject( 'タイトルも日本語で' );
$mail -> html( 'ここに内容をいれます' );
$mail -> from( 'from@example.com' , '配信元日本語名' );

$mail ->send();
```

#嵌りポイント1：文字コード
UTF-8で合わせる場合は、下記のように指定します。

```lang:php
mb_language('ja');
mb_internal_encoding('UTF-8');
```

私の環境では「件名」で文字化けしてしまった為に
下記設定を使って文字化けを回避しました。

```lang:php
$mail -> unitedCharset( 'UTF-8' );
```

#嵌りポイント2：URLをリンクにする
※配信するテキストをユーザに入力してもらう形のツールを
　作っていたので、嵌りました。普通にHTML書いていれば、特に気にならないポイントだと思います。

GmailやYahooメールは、自動でURLをリンクにしてくれますが
Becky!ではURLをリンクに自動変換してくれませんでした。

下記記事を参考にURLをリンク変換するとよさそうです。
http://qiita.com/mpyw/items/1e422848030fcde0f29a

#嵌りポイント3：HTMLを表示させないメールクライアントに対応
qdmailではデフォルトで、HTMLが表示できないメールクライアントでは
代替テキストを表示するようになっています。

##Gmail対応
マルチパート部分の順序が「HTML→テキスト」になっている為
Gmailでは、HTMLメールを送信しても、必ずテキスト表示されてしまいます。

下記記事で説明されているように、マルチパート部分の順序を変更します。
http://www.webdesignersblog.jp/archives/2010/04/16184520.php

#嵌りポイント4：HTMLと代替テキストで体裁を合わせる
##preタグ
\<pre>タグは、改行方法が「\<br />」と「\n」の
２通りあり、HTMLと代替テキストで改行が合わなくなる原因となる為、使わない方がよいです。

##改行
HTMLの代替テキストは「\<br />」で改行されますが
複数「\<br />」がついていても、１改行しかされません。

複数改行を行う場合は、何かしら１行に文字が入っていないと
ダメなようだったので、半角スペースをひとつ入れて「\<br />」を入れる事で
改行させました。

※私が知らないだけで、何か方法があるのかもしれません。

#注意点：文字化け
iso-2022-jpで送信すると、
半角カナ(メールでは基本使わないですが)や機種依存文字、
IBM拡張文字、NEC選定IBM拡張文字で文字化けしました。
http://hal456.net/qdmail/irregular_char

特殊文字を送信する場合は、UTF-8で本文エンコードをbase64に
するのがよいようです。（試してないです）

完全に文字化けしないメール配信ツールを作るのは難しいので
見れない場合は、サーバに保存したHTMLを見てもらう形で逃げるのも手ですかね。
shuffle.jsで複数条件の絞り込み

グリッド上でソートや絞り込みができるshuffle.jsを使って複数条件の絞り込みをします。

###複数の項目を持つものを、1つの条件で絞り込む

```html:html
<ul class="type">
  <li data-group="t1">果物</li>
  <li data-group="t2">野菜</li>
</ul>

<div id="container">
  <div class="box" data-groups='["t2"]'>トマト</div>
  <div class="box" data-groups='["t2"]'>キャベツ</div>
  <div class="box" data-groups='["t1"]'>いちご</div>
  <div class="box" data-groups='["t1","t2"]'>スイカ</div>
</div>
```

```jquery:javascript
$('.type li').click(function(){
  $('#container').shuffle('shuffle', $this.data('group'));
  return false;
});

$('#container').shuffle({
  itemSelector: '.box',
});
```

###複数の条件でOR検索
果物と野菜の両方が選択できて、どちらかを持つものが表示される。

```html:html
<ul id="type">
  <li data-group="t1">果物</li>
  <li data-group="t2">野菜</li>
</ul>

<div id="container">
  <div class="box" data-groups='["t2"]'>トマト</div>
  <div class="box" data-groups='["t2"]'>キャベツ</div>
  <div class="box" data-groups='["t1"]'>いちご</div>
  <div class="box" data-groups='["t1"]'>スイカ</div>
</div>
```

```jquery:javascript
var $grid = $('#container');

$grid.shuffle({
  itemSelector: '.box'
});  

$('#tabs li a').on('click', function() {
  var $this = $(this);
  var $grid = $('#container');
  
  if($this.hasClass('active')){
    $this.removeClass('active');
  }else{
    $this.addClass('active');
  }

  $grid.shuffle('shuffle', function($el, shuffle){
    var g = [];
    $('#type a.active').each(function(){
      g.push($(this).data('group'));
    });
    return g.indexOf($el.data('groups')[0]) > -1;
  });

  return false;
});
```


**以下のコードはおかしいので修正予定**
###複数の条件で絞り込む

```html:html
<ul class="type">
  <li data-group="t1">果物</li>
  <li data-group="t2">野菜</li>
</ul>
<ul class="color">
  <li data-group="c1">赤</li>
  <li data-group="c2">緑</li>
</ul>

<div id="container">
  <div class="box" data-groups='["t2","c1"]'>トマト</div>
  <div class="box" data-groups='["t2","c2"]'>キャベツ</div>
  <div class="box" data-groups='["t1","c1"]'>いちご</div>
  <div class="box" data-groups='["t1","c2"]'>スイカ</div>
</div>
```

```jquery:javascript
var t='',c='';
$('.type li').click(function(){
  t = $(this).data('group');
  return false;
});
$('.color li').click(function(){
  c = $(this).data('group');
  return false;
});

var shuffleFilter = function(){
  $('#container').shuffle('shuffle', function($el, shuffle){
    var d = $el.data('groups');
    var g = 0;
    g += (t != '' && d[0] != t)?-1:0;
    g += (c != '' && d[1] != c)?-1:0;
    return g === 0;
  });
}

$('#container').shuffle({
  itemSelector: '.box',
});
```

上の書き方はdata-groupが必ず2つの項目を持っている場合、という条件で書いてるので
項目数が可変の場合は書き方を変えないとダメです。

条件判断のところがもっとスマートに書けそうなんだけど。。


あと、上の場合は選択した条件を変数に格納していますが
クリックされたらaddClass('active')とかしておいて
shuffleFilter()の中でhasClass('active')なのを取ってゴニョゴニョした方がいいかも
osxcrossでpkg-configのパスを設定するには

# 背景

mruby-cliでmruby-mrmagickをマルチプラットフォームでビルド可能にしようと奮闘していた。

# PKG_CONFIG_PATHが効かない

ImageMagcikはどうやらPNGサポートの有効無効の判定をpkg-configコマンドで
判断している模様。

しかも、クロスコンパイル指定していると、対象のpkg-configコマンドを検出して、これを利用するようだった。

libpngを/usr/x86_64-apple-darwin14/配下に入れており、この配下の
/usr/x86_64-apple-darwin14/lib/pkgconfigに
PKG_CONFIG_FILEパスを追加しようとするもNG

ちなみにpkg-configはosxcrossの物は

```
ls -l `which x86_64-apple-darwin14-pkg-config `
lrwxrwxrwx 1 root root 29 Aug  2  2015 /opt/osxcross/target/bin/x86_64-apple-darwin14-pkg-config -> x86_64-apple-darwin14-wrapper
```

stringsして文字列に当たりをつけた。

```bash
strings `which x86_64-apple-darwin14-pkg-config `|grep PKG
OSXCROSS_PKG_CONFIG_NO_MP_INC
OSXCROSS_PKG_CONFIG_SYSROOT_DIR
OSXCROSS_PKG_CONFIG_PATH
OSXCROSS_PKG_CONFIG
PKG_CONFIG_LIBDIR
```

```
OSXCROSS_PKG_CONFIG_PATH=/usr/x86_64-apple-darwin14/lib/pkgconfig x86_64-apple-darwin14-pkg-config libpng --libs

-L/usr/x86_64-apple-darwin14/lib -lpng16  
```

という事で、

```txt
OSXCROSS_PKG_CONFIG_PATH
```

# 関連投稿

- [Dockerを使ってクロスコンパイルしてmrubyのワンバイナリを作成してみた - Qiita](https://qiita.com/kjunichi/items/72305db2397930b16803)
- [クロスコンパイルしてwindows用のOpenCVライブラリを作る - Qiita](https://qiita.com/kjunichi/items/60a14d73fab2b41cc6bc)
技術英語 > of a say > Architects are getting less and less power, and contracters are getting more and more [of a say]. / have [some degree of] positive significance

@ AXIS Feb. 2016 > Cover interview: Frank Gehry

2003年ころからWebサイト構築関連でデザインの勉強のため数年間買っていた AXIS という雑誌(結局、最後までデザイン能力は身につかなかった)。
この雑誌には日本語の記事とその対訳英語が記載されている。内容も技術的なことが少しはある気がする。
ふと１冊、久しぶりに買ってみた。
なお、1800円なので安くはない。

<hr>

建築家が力を失いつつ、契約者（建設業者）が力を強めていくという文章で

> Architects are getting less and less power, and contracters are getting more and more <font color=red>of a say</font>.

http://eow.alc.co.jp/search?q=of+a+say&ref=sa
> have its share <font color=red>of a say</font> in the world
> 〔国が〕世界でそれなりの発言権を持つ

<hr>
http://eow.alc.co.jp/search?q=%E3%81%9D%E3%82%8C%E3%81%AA%E3%82%8A

> それなりの意味がある
have some degree of positive significance
storyboard.instantiateViewControllerWithIdentifier から初期化すると IBOutlet が nil  になる

呼び出した viewController の view にアクセスすると IBOutlet が生成されるので、 viewController.view を呼び出した後に IBOutlet にアクセスすれば nil にはならない。


```swift
let content = storyboard?.instantiateViewControllerWithIdentifier("Storyboard ID")
if let content0 = content! as? HogeViewController{
    let v = content0.view // v は使用しない。もっとスマートなやり方がある気がするけど。
    content0.descriptionLabel.text = "hello world" // descriptionLabel が IBOutlet のビュー
}
```
abstract type members の使いどころ

良い設計には良い抽象が必要ですが、抽象化にも手段が複数通り考えられる場合があります。それぞれの利点を知っておくことは重要なことです。

硬い感じで始めてしまいましたが、abstract type members についてざっくりと書きます。変な時間に寝てしまった結果変な時間に起きてしまったので、デレステのスタミナが回復するまでの暇つぶしをします。

結論からいうと abstract type members は実装詳細の隠蔽に使えます。もっというと、実装詳細の隠蔽を行っていることも隠蔽…とはいえませんが、こそこそとできます。どうこそこそなのかは後述。

シンプルな例。

```scala
trait Exists { type A }
type Forall[B] = Exists { type A = B }
```

どちらも何かしらの型があるのだなということは分かります。Exists はメンバに、Forall は型パラメタにそれが表れています。継承する場合。

```scala
trait Foo extends Exists
trait Bar[A] extends Forall[A]
```

Exists を継承する場合、Foo は type A について何も知る必要も、与える必要もありません。勿論、それが型であろうと、抽象メンバがあると instantiation はできないので、最終的には type A とは何か、を誰かが決めてやる必要があります。しかし、Exists を直接継承するクラスないしトレイトに、必ずしもその責務があるとは限りません。

Forall を継承する場合、Bar は Forall に型パラメタを与えてやる必要があります。Forall を継承するクラスないしトレイトが適切な型パラメタを知っているなら問題ないのですが、そうでない場合には型パラメタをたらいまわしする必要があります。おかげで Bar も型パラメタを持つ羽目になってしまいました。Bar が A にとって興味がない場合、これは大変だるい。Bar を利用する側もだるい。

結局のところ、abstract type member にすべきか、generics（と取り合えず呼びます）にすべきかは、利用者がその型について知りたいかそうでないか、という所に落ち着きます。C や C++ を使っている人なら、abstract type members は opaque pointer のようなもの、という一文で理解してもらえると思います。generics はあえて言うなら template 相当ですね。勿論これは例えで、実際には表現力が全然違います。

あとは以下のようなコードを見るのも分かりやすい気がする。こそこそする例。

```scala
// abstract type members の場合
val a: Exists { type A = Int } = ...
val b: Exists { type B = Double } = ...
val c: Exists { type C = String } = ...
// 素直に書ける
val eseq: Seq[Exists] = Seq(a, b, c)

// generics の場合
val a: Forall[Int] = ...
val b: Forall[Double] = ...
val c: Forall[String] = ...
// existential types(Java の wildcard)を使う必要がある
val fseq: Seq[Forall[_]] = Seq(a, b, c)
```

Exists の Seq は素直に書けますが、Forall の Seq は existential types を使う必要があってだるいですね。今回の Forall は Exists の type alias なので、実際には existential types を使わなくても型推論は通るのですが、type A <: Double with Int with String みたいな、どうしようもない制約がついて使い物にならなくなるので、結局 existential types が必要になります。

勿論欠点もあります。Forall なら、existential types で隠蔽したりしていない限りは、型パラメタに表れてるくらいならので、その型について知ることができます。Forall[Int] なら Int でしょうし Forall[Double] なら Double です。当たり前のことですね。
一方 Exists の場合は、その型について基本的には知ることができません。path-dependent types を使ってコードを書く際、それがなんの型であるか知る術はありません。実際には Exists { type A = Int } として instantiation されたものであったとしても、型レベルで Exists であることしか分かっていないコンテキストでは、A が Int であることを利用者が知ることはできません。Exists { type A = Int } みたいな場合はそりゃ Int って分かるんですけど。generics 素直に使えよという感じですね。
というわけで、利用者が型について知る必要があるなら abstract type members は適任ではありません。利用者が知るべき型は、そもそも実装詳細とは呼べないですね。abstract type members で隠蔽しちゃいけません。

まとめ。abstract type members は実装詳細の隠蔽に使えます。同様のことは generics でもできなくはないですが、実装詳細にとって必要な型が型パラメタに表れてくるので大変めんどくさいです。Java はこれができないので、めんどくさい気持ちになる場合が稀によくある。ただし実装詳細の型を利用者が知らないといけない場合には generics を使うべきです。が、実装詳細の型を利用者が知らないといけない時点で、それは本当に実装詳細なのか、とか色々と設計を疑うべきでしょう。
C や C++ を知っている人は、opaque pointer のように使えるものなんだなーと思ってれば、それで大体大丈夫です。おわり。

適当なライブラリから実際のコード例をひっぱってきたかったんですが、スタミナが回復したのでおしまいです、デレステして寝ます。とはいえこれでおしまいはあまりにもあんまりなので、後で思い出したら追記するかもしれません。
蛇足、型の小難しい話。abstract type members は ML の abstract types 相当ですし、Forall の例で Scala の言語機能である existential types を使ったことからも分かるように（Scala の言語機能ではなく、一般にいうところの）existential types です。
あとデレパ Co Mas 一発でフルコンできました。良かったですね。おやすみなさい。
技術英語 Options, Settings, Properties, Configuration, Preferencesの違い

http://stackoverflow.com/questions/2074384/options-settings-properties-configuration-preferences-when-and-why
によれば、Visual Studioのガイドでは下記の通りらしい。

* **Properties（プロパティ）**一つのコンポーネントまたはオブジェクトの特性を表すもの
* **Options（オプション）**グローバルな振る舞いを変えるもの。無効にできるというニュアンス
* **Settings（設定）**と**Preferences（ユーザー設定）**複数の選択肢があり、無効化するものではないというニュアンス
* **Configuration（構成）**ユーザー向けにカスタマイズするもの（ユーザーでなくアプリケーション提供者が予め設定しておくということだろうか？）

下記のような意見もある。

* Preferencesは比較的表面的な設定というニュアンス
* これらの用語はOSやプラットフォームごとに違う

これらを踏まえた上で自分が使い分けルールを作るとしたら、

- アプリケーション提供者が決め、ユーザーの目に触れないものはconfiguration（構成）
- ユーザーが決めるものはsettings（設定）
- preferencesは不使用
- optionsはコマンドラインオプションなど特定の文脈でのみ使用。

という感じだろうか。

下記からマイクロソフトの訳語集をダウンロードできる。中身はXML。
https://www.microsoft.com/ja-jp/language/Terminology
Polymerを使って普通のウェブサイトを作った

作ったものはアプリケーションではなくごく普通のシングルページのウェブサイトなので、Polymerの機能を完全に使いこなしたという話ではありません。一番の目的はCSSのコンポーネント化だったんだけど、結局はこの目的が完全に達成された、とはいいにくい結果になりました。

- https://github.com/hbsnow/hbsnow.github.io

以下はサイトを作っていて気づいたことや、便利だなーと思えた感想みたいなもの。

## Polymer1.2におけるShadow DOM

Polymer1.2ではというよりも、1.0かららしいがどうも0.5から大きく仕様が変更されたらしく、使いやすくなってるんだか使いにくくなってるんだかよくわからないものになっています。目的が達成できなかった理由はこれです。

- [Global Polymer settings](https://www.polymer-project.org/1.0/docs/devguide/settings.html)

dom-optionsのオプションがdefaultでshadyになっています。細かい違いはあるかもしれないけれども、おそらく0.5のときはshadowと同じような仕様だったはずです。

このshadyというのがちょっとしたクセ者で、これについてはQiitaの以下の記事がとてもわかりやすいです。1.0となっていますが1.2でも変わっていません。

- [Polymer1.0におけるStylingとCSS Variables](http://qiita.com/laco0416/items/f5a36934c1c8d047d521)

強引に簡単にまとめてしまうと、ある程度の外からのスタイリングができる甘えが許されるようになった反面、`<content>`内で表示される内容のCSSの継承順位が高くて困るときにはとても困るといった感じです。

結局shadyで作成したのですが、これはオプションの設定の存在に気がついたのが製作半ばを過ぎていたという理由からで、次に作る機会がもしあればshadyではなくshadowを使うと思います。できるだけ大きく変わることはないだろう仕様にはそった形にしておきたいからです。

## 外部の`.css`のファイルを読み込めない

1.0では`<link rel="import" type="css" href="my-awesome-button.css">`のようにかけましたが、1.1からdeprecatedされ`<style include="paper-material"></style>`と記述するようになりました(一応1.2でも動きはします)。ここでincludeしているのはCSSのファイルではなく、ほぼCSSだけが記述されているHTMLです。

- [Styling local DOM](https://www.polymer-project.org/1.0/docs/devguide/styling.html)

CSSを別にわけて管理したかった理由はPostCSSを通したかったこともそうなのですが、Vue.jsの`.vue`とかも自分はあんまり好きじゃないので、こういったコンポーネント化でHTMLとCSSが一緒になっていることに抵抗があったということもあるかもしれません。

実際にどうわけたかというと、HTMLをJadeで書いていたので、Jadeで`include`させただけです。

## Polymerのコンポーネントの`:root`

通常のCSSの`:root`というと`<html>`要素になるわけだけれども、Polymerのコンポーネントで指定する`:root`はどうも`<body>`要素になっているらしい。作っていて気づいたことなのでドキュメントのどこに書いてあるのかはちょっと探してないのでわかりません。

`:root`が`<body>`に適用されるため、ブラウザの`<body>`にある`margin`は`:root`に指定することで`0`にすることができます。

## 便利なiron-media-query

便利だなと思えたElementsはいくつかあったのですが、今回のサイトで特にそう思ったのが[iron-media-query](https://elements.polymer-project.org/elements/iron-media-query)でした。

Reactでいうと使ったことはありませんがおそらく[react-responsive](https://github.com/contra/react-responsive)が同様のものになると思います。一度こういった便利なものを使ってしまうと、コンポーネント化されていないCSSでmedia queryを書くのがつらくなる……。

## Vulcanize

Vulcanizeでimportしているファイルを一つにまとめることができます。将来的にHTTP/2が使えるころには不要になってきそうですが、今の段階では多くの人がVulcanizeする必要がありそう。

[crisper](https://github.com/PolymerLabs/crisper)はHTML一つではなくJavaScriptは別ファイルにしてくれるものらしく、最初は何に使うのかさっぱり理解できませんでしたがどうやらBabelを使うときに必要になることがある感じのようです。
Django1.4やってて詰まったので、absolute path(絶対パス) と relative path(相対パス) に関する”メモ”書き

#背景

Djangoを覚えようとしてて勉強してたんだけど、pathのあたりでつまずいたのでこの問題だろうと思って調べた。


#relative path
自分のいまいるディレクトリをを基準にしてファイルを呼び出す方法。自分のいるところから見た景色をもとにしてpathを書く

Djangoの練習をしているので、以下を参考にして説明。現在いるディレクトリは以下のような感じ。
```
/Users/ユーザー名/Projects/python/dj/mysite
```

mysiteディレクトリのファイル構成はこれ。

```.
├── books
│   ├── __init__.py
│   ├── __init__.pyc
│   ├── admin.py
│   ├── admin.pyc
│   ├── models.py
│   ├── models.pyc
│   ├── tests.py
│   ├── views.py
│   └── views.pyc
├── manage.py
├── mydb

```

今現自在自分は大元の . のところ(mysiteディレクトリ)にいる。相対パスでbooksの中のadmin.pyを呼び出すならば、

```
books/admin.py
```

とやるだけ。なんだ簡単かよ。


#absolute path
コンピューターのrootからみた景色をもとにしてpathを書く。自分がどこにいるかに関係なく、呼び出す。

上と同じ例でいくと、
```
/Users/ユーザー名/Projects/python/dj/mysite
```

要はターミナル開いて、
```
pwd
```
って打ってでてきたパスを入力してあげるらしい。


#それでもやっぱり謎はある

結局これを調べて両方やってみても大元の謎は解けなかった。てかtemplateが存在するディレクトリまでいって正しい名前でコールしてるにも関わらず、

template does not exist

とか言われ続けて辛かった。


２日間調べて悩んだ挙句、

```
import os

PATH_PROJECT = os.path.realpath(os.path.dirname(__file__))

```

ってやって、TEMPLATE_DIRのところに

```
PATH_PROJECT + '/templates/'
```
ってやることでなんとか解決した。未だ謎だけど。


#追記

と思ったら解決した！絶対パスの基準点の書き方が違っていたらしく、shellで**pwd**呼び出して打って、出てきたパスをTEMPLATE_DIRに入れてあげたら見事成功！

まとめるっていいことありますね。
glibcの脆弱性対策（CVE-2015-7547）

# 概要
2016/2/16 に GNU Cライブラリの「glibc」に深刻な脆弱性が見つかりました
インパクトは Critical とのこと

多々利用されていそうな getaddrinfo()関数に、バッファオーバーフローの脆弱性があるとのことなので早々に対処しておいたほうが良さそうです

[CVE-2015-7547](https://googleonlinesecurity.blogspot.jp/2016/02/cve-2015-7547-glibc-getaddrinfo-stack.html)

確認したOSは以下のとおりです

| Distribution | glibc Old Version | Up Version |
| --- | --- | --- |
| Red Hat 5.x | 2.5 | 対応不要 |
| Red Hat 6.x | 2.12 | 2.12-1.166.el6_7.7 |
| Red Hat 7.x | 2.17 | 2.17-106.el7_2.4 |
| CentOS 5.x | 2.5 | 対応不要 |
| CentOS 6.x | 2.12 | 2.12-1.166.el6_7.7 |
| CentOS 7.x | 2.17 | 2.17-106.el7_2.4 |
| Fedora 22 | 2.21 | DNE（未対応） |
| Fedora 23 | 2.22 | DNE（未対応） |
| Debian 6.x | 2.11 | 2.11.3-4+deb6u11 |
| Debian 7.x | 2.13 | 2.13-38+deb7u10 |
| Debian 8.x | 2.19 | 2.19-18+deb8u3 |
| Ubuntu 12.04 | 2.15 | 2.15-0ubuntu10.13 |
| Ubuntu 14.04 | 2.19 | 2.19-0ubuntu6.7 |
| Ubuntu 15.10 | 2.21 | DNE（未対応） |

# glibc のバージョン確認

```bash:RedHat6/CentOS6
$ cat /etc/redhat-release 
CentOS Linux release 6.0 (Final)
$ rpm -q glibc
glibc-2.12-1.80.el6_3.6.x86_64
```

```bash:Debian/Ubuntu/Vine
$ locate libc.so.6
/lib/x86_64-linux-gnu/libc.so.6
$ /lib/x86_64-linux-gnu/libc.so.6
GNU C Library stable release version 2.11.1, by Roland McGrath et al.
:
```

# パッチ適用

```bash:RedHat6/CentOS6
$ sudo yum update glibc
```

```bash:Debian/Ubuntu/Vine
$ sudo apt-get update
$ sudo apt-get upgrade libc6
```

サーバを再起動して終了です

以上です
glibc脆弱性についてのまとめ

社内向けにまとめておいたものをとりあえずチラ裏レベルですが。。。
何か間違いがあればご指摘ください。

#対応が必要なバージョン
http://image.itmedia.co.jp/l/im/enterprise/articles/1602/17/l_glbvlnr02.jpg
https://www.conoha.jp/conoben/archives/11014

#確認方法
yum list installed | grep glibc
2.9以上のバージョンだったら対応が必要

#対応方法
yumでglibcをupdateのちOS再起動かglibcを使っているプロセスを再起動

#クラウドサービス対応状況
AWSは一旦大丈夫そう（例外あり）

- さくらVPC => http://support.sakura.ad.jp/mainte/mainteentry.php?id=18152  
このアップデートでglibcがアップデートされるとは明記されていない。掲載日がglibcの脆弱性が発表される前なのでこれで大丈夫かは微妙
- ロリポップ => 未発表
- AWS => https://aws.amazon.com/jp/security/security-bulletins/cve-2015-7547-advisory/

# その他関連記事
https://www.jpcert.or.jp/at/2016/at160009.html
http://www.itmedia.co.jp/enterprise/articles/1602/17/news065.html
http://dev.classmethod.jp/cloud/cve-2015-7547-aws/
[メモ] MBRとかPBSとかの図解(FAT16/FAT32)

最近、MBRとかその辺の情報が(趣味で)必要になったので、むか～し(SDHCの規格に対応させるために)自分がわかりやすいようにまとめたものをメモっておく。
当時のSDFormatter(v2?)でフォーマットしたSD/SDHCをダンプしたものを使用(してるハズ..)

***
- MBR (Master Boot Record)
![FAT1.png](https://qiita-image-store.s3.amazonaws.com/0/75594/8da31552-fae4-97b6-e40b-448c6a57575f.png)

***
- MBR: CHS and LBA
![FAT2.png](https://qiita-image-store.s3.amazonaws.com/0/75594/b433257a-96cb-4438-9662-bd346cadda8d.png)

    ```
CHS => sector_num:
sector_num =  C * (NumOfHeads * SectorsPerTrack) + H * SectorsPerTrack  + S - 1
(例) 959 * (32*63) + 31 *(63) + 63-1 => 1,935,359
```
***
- PBS:FAT12/16 (Partition Boot Sector)
![FAT3.png](https://qiita-image-store.s3.amazonaws.com/0/75594/ca78a880-bbe8-6ba9-be24-b99983f115ca.png)

***
- PBS:FAT32 (Partition Boot Sector)
![FAT4.png](https://qiita-image-store.s3.amazonaws.com/0/75594/41a37413-9538-1e1a-f7ee-50fc55de2b9a.png)

***
- Directory Entry
![FAT5.png](https://qiita-image-store.s3.amazonaws.com/0/75594/38d10dca-2db0-2547-1a90-1b9d39b5651e.png)

***
- FAT32:FSInfo
![FAT6.png](https://qiita-image-store.s3.amazonaws.com/0/75594/2b6d9cb4-7d48-6917-9669-647479727d91.png)

***
- 履歴

    ```
Rev 0.3 – 2016-02-17 :  一般公開用に編集
Rev 0.2 - 2006-11-01
Rev 0.1 - 2006-10-30
```

***
- スクショ(ALT+PrintScreen)で、ペイントに貼り付けて、クロップして、PNG保存。
- FATクラスタチェーンはまとめてなかったので、調べなければならない。
RailsでDBのレコードが”時々”なくなる！？

私が弊社に入る前からDBのレコードが全て消えるという現象が発生していて
今回私が原因っぽいところを発見して解決するまでの軌跡を。。。

※ 追記(ご注意)
この時の環境は複数ユーザー間でデータを共有したかったと言う
**特殊な環境**で発生した現象です。
基本はローカルに開発用DBとテスト用DBを建ててくださいね。



## 環境  
* Rails 4.1.8
* Rspec 3.0.4(rspec-rails)

## 問題
単体テストを流すDBにデータ（レコード）が必要だったからです。
本当だったらFactoryGirl等で初期データを登録する等もあるんですが。。。

# 結論(先出し)

```rails_helper.rb
# Checks for pending migrations before tests are run.
# If you are not using ActiveRecord, you can remove this line.
ActiveRecord::Migration.maintain_test_schema!
```

この一行はRailsのバージョン4.1以降から対応しているもので

実行環境のDBと現在のマイグレーションの差分を検知し、
自動的にマイグレーションを掛けてくれるというものです。

この差分を検知し、自動的にマイグレーションをかける際に
DBを一度DROPしてからマイグレーションを流すため
DBの全レコードが無くなっていました。

## 解決
```/config/environments/target.rb
  config.active_record.maintain_test_schema = false
```

を付加することで、差分を検知したとしても
そのままフローが進むように設定することが出来ます。
つまりデータ(レコード)は残る！！

※ 設定内容に関しては下のリンクから確認できます。

## 発見まで
上記のように弊社に入社してから度々DBの全レコードが無くなる現象が発生していた。  
私は最近バックエンドの修正でRailsプロジェクトの開発を行っていて、
なぜか私が単体テストを流す度にDBの全データが無くなっていた。

この辺りで、当Railsプロジェクト。
さらに言えば、マイグレーション周辺がおかしいんだろうと言うアタリをつけて
持っていたタスクそっちのけで調査していた。

Rails初心者なのでRailsが悪いのか、Rspecが悪いのか、ActiveRecordが悪いのか
調査するのには時間が掛かりました（汗

まずは実行環境に目を付けました。  

### 原因１(？) 実行環境(test)自体
Railsには3つの実行環境が標準で存在しています。

* production -本番環境
* test -テスト機
* development -開発機

私は、Railsは規約を重んじていたよね？ということで
testの実行環境は問答無用でテスト開始前に全レコードを削除しているのでは？と言う事で  
**実行環境(test)を別名にして実行してみた。(”時々”はどこに。。。)**  

案の定間違っていたので、実行環境毎の設定ファイルを眺めてみることに。  

-----

#### ※ここで罠が...

```config/environment/test.rb
# The test environment is used exclusively to run your application's
# test suite. You never need to work with it otherwise. Remember that
# your test database is "scratch space" for the test suite and is wiped
# and recreated between test runs. Don't rely on the data there!
config.cache_classes = true
```

私の英語力に問題があったと思いますが、  
<code>config.cache_classes = true</code>であればDBがリセットされると勘違いしてしまいました。  
実際は上記の結論なので。

-----

### 原因２(？) 実行環境の設定
該当する実行環境以外では全レコードが無くなる現象は起きなかったため  
**他の実行環境をコピーした。**

だが、ここでも意味はなかった。
次に、そもそもとしてどのようなSQLが流れているのかちゃんと確認しようということでログ・ファイルを確認した。  

ログはroot直下のlogディレクトリに実行環境毎にあった。  
中を見ると、

```
DROP DATABASE IF EXISTS `database_name`
```

**DROPが。。。流れてる！！？**

DROPが流れているということでRspec関連ファイルの

* spec_helper.rb
* rails_helper.rb

を見てみることに。  
ここから順繰り中身を見ていって結論に記載している

```ruby
# Checks for pending migrations before tests are run.
# If you are not using ActiveRecord, you can remove this line.
ActiveRecord::Migration.maintain_test_schema!
```
が問題だと判明しました。

#### 使用したコマンド達
```
1$ RAILS_ENV=test bundle exec rake db:migrate
2$ bundle exec rspec path_to_file.rb
```

* 1$
実行環境を指定(test)し、マイグレーションを行う。  

* 2$
Rspecで単体テストを流す。  

### 最後
そもそもテスト流す前にマイグレーション掛けようぜ！？

##### 参考リンク
* https://www.relishapp.com/rspec/rspec-rails/docs/upgrade#pending-migration-checks
* http://stackoverflow.com/questions/25877734/rails-4-resetting-test-database
PHPで三項演算子を二重にするとどうなるか？

# 問題
#### 問1  
以下のコードの`$num`が`1, 2, 3`それぞれの場合の出力結果はどうなるか？

```php
print($num == 3 ? $num == 2 ? "2です。" : "3です。" : "1です。");
```

答えは、こう。  

```php
$num = 1; // 1です。
$num = 2; // 1です。
$num = 3; // 3です。
```

`$num = 2`の時だけ答えが期待値とはズレてるね。  
では、次の問題。
  

#### 問2  
以下のコードの`$num`が`1, 2, 3`それぞれの場合の出力結果はどうなるか？

```php
print($num == 3 ? "3です。" : $num == 2 ? "2です。" : "1です。");
```

答えは、こう。  

```php
$num = 1; // 1です。
$num = 2; // 2です。
$num = 3; // 2です。
```

今度は`$num = 3`の時、答えがズレている。
なぜこうなったのか？PHPにおける__三項演算子__のネストはどうなるかを確認した。

#三項演算子の詳細
PHPの公式ページより、PHPにおける三項演算子の仕様を確認したところ、

> (expr1) ? (expr2) : (expr3) という式は、式1 が TRUE の場合に 式2 を、 式1 が FALSE の場合に 式3 を値とします。
> PHP 5.3 以降では、三項演算子のまんなかの部分をなくすこともできるようになりました。 式 expr1 ?: expr3 の結果は、expr1 が TRUE と同等の場合は expr1、 それ以外の場合は expr3 となります。

（[公式ページ](http://docs.php.net/manual/ja/language.operators.comparison.php#language.operators.comparison.ternary)より引用）  

とありました。簡単に言うと、左から右に評価されるということ。公式ページを読み進めていくといくつか注意点が記載されているが、その中に__「三項演算子を "積み重ねて" 使用することは避けましょう。」__とあった。そもそも三項演算子をネストすることは避けるべきらしい。（笑）  

※まぁ、わざわざ三項演算子でネストするくらいなら、`if-else`文や`switch`文で書けよ、ってことかな。

#プログラムの解説
上記を踏まえて、二つの問いのプログラムの解説をば。
問1のプログラムは以下のコードを同じものとなる。

```php:問1(改)
print($num == 3 ? ($num == 2 ? "2です。" : "3です。") : "1です。");
```

したがって`$num = 3`以外の時は全て "1です。" が表示される事になる。これは簡単。  
続いて問2のプログラムは以下のコードと同じ。

```php:問2(改)
 print(($num == 3 ? "3です。" : $num == 2) ? "2です。" : "1です。");
```

`$num = 3`の時、`($num == 3 ? "3です。" : $num == 2)`の結果は "3です。" となる。この結果をもって次の三項演算子に処理が移るので、
全体としては`("3です。" ? "2です。" : "1です。")`となる。ここで、"3です。"はPHPでは`true`と見なされるため、"2です。"が表示される事になる。  

~~ちなみに三項演算子を二重ではなく三重にしようとしたら、`syntax error`となったので、実行できないようだ。（そんなプログラムを書くことはおそらくないとは思うが）~~
自分の書き方がミスっていただけでした。すみません。
Haskellの関数 String -> PortNumberを作る

NetworkモジュールのPortNumberというのはよく使う型だと思う。  
で、環境変数からPortNumberを得たい、という用途のために

```hs
parsePortNumber :: String -> Either String PortNumber
```
という関数が欲しくなったのだが、PortNumberはReadのインスタンスになっていない。どうするか。

分かってしまえば簡単なのだが、PortNumberはNumのインスタンスになっている。ということはfromIntegerが適用できるではないか。

```hs
fromInteger :: Num a => Integer -> a
```

つまりreadでいったんIntegerにしてから、fromIntegerでPortNumberに変換すればよい。
ということで最終的には次のような実装になった。

```hs
parsePortNumber s = case readMaybe s of
                      Nothing -> Left ("invalid port number -> " ++ s)
                      Just i  -> Right $ fromInteger i
```

たった３行のコードを書くのに二晩くらい悩んでしまった。
Haskell でサムネイル #2

この記事は [Haskell でサムネイル](http://qiita.com/satosystems/items/abdb9696185f647b65a2)の続きです。まだの方はそちらを先にどうぞ。

# imagemagick

サムネイル生成といえば ImageMagick が思い当たります。ImageMagick は Ruby、Python、PHP、Perl、Java、Go、その他いろいろな言語のバインディングがあり、我らが Haskell にも [imagemagick](https://hackage.haskell.org/package/imagemagick) というパッケージが存在しました。

存在はしましたが、画像の向きをどうにかする機能は Haskell のバインディングでは提供されていませんでした（0.0.4.1 ではコメントアウトされています）。

# ImageMagick

ImageMagick は画像に関する様々な処理がコマンドラインで行えます。例えば、画像ファイルの情報を取得するには以下のように行います。

```bash
$ identify original.jpg
original.jpg JPEG 3264x2448 3264x2448+0+0 8-bit sRGB 3.288MB 0.000u 0:00.000
```

画像の幅と高さだけが欲しい場合、以下のように行います。

```bash
$ identify -format "%w %h" original.jpg 
3264 2448
```

画像をリサイズする場合は以下のように行います。

```bash
$ convert -resize 200x150 original.jpg thumb.jpg
```

今回行いたい処理は、縦横のどちらかが 200px 以内になるようにアスペクト比を維持したまま、Exif の Orientation が設定されていればその向きに補正しつつ、不要な Exif はすべて除去しつつサムネイルを生成する、というものです。

```bash
$ convert -auto-orient -strip -resize 200x200 original.jpg thumb.jpg
```

`-resize 200x200` というのが空気を読んでくれる素晴らしいオプションでした。元画像のサイズから計算したり Exif Orientation を取得して回転計算を行ったりする必要はありません。

# Haskell から実行する

```Sample.hs
import System.Process

main :: IO ()
main = do
  system "convert -auto-orient -strip -resize 200x200 original.jpg thumb.jpg"
  return ()
```

身も蓋もないんですが、システムコマンドを実行してしまいます。

thumbnail の `mkThumbnail'` なら、サムネイルの画像サイズが以下のように取得できますが：

```hs
  thumb <- mkThumbnail' ((50, 50), (200, 200)) contents
  case thumb of
    (Left _) -> return Nothing
    (Right t) -> return $ Just (fst $ sz t, snd $ sz t)
```

convert コマンドでサムネイルの画像サイズを取得する場合、例えば以下のようにできます：

```hs
  system $ "convert -auto-orient -strip -resize 200x200 " ++ org ++ " " ++ thumb
  wh <- readProcess "identify" ["-format", "%w %h", thumb] []
  let a = " " `splitOn` wh
  return $ Just (read $ a !! 0, read $ a !! 1)
```

# まとめ

[Haskell でサムネイル](http://qiita.com/satosystems/items/abdb9696185f647b65a2)で使用したライブラリは、どちらも Exif Orientation を考慮したサムネイルを生成してくれませんでした。

今回の記事では、オリジナルの JPEG から Exif Orientation を読み取り、回転しているようであれば生成したサムネイルを回転させるか Exif Orientation を付与するか、という方法を検討していました。Haskell で Exif を読み取れる [hsexif](https://hackage.haskell.org/package/hsexif) というパッケージがあります。これは以下のように使用します。

```Sample.hs
import Data.Either (either)
import Data.Map.Lazy (fromList)
import Graphics.HsExif (getOrientation, parseFileExif)

file :: FilePath
file = "tools/4f517b31-caea-4ade-9cc5-069d6c9970dd.jpeg"

main :: IO ()
main = do
  eexif <- parseFileExif file
  let exif = either (\a -> fromList []) id eexif
      mio = getOrientation exif
  print mio
```

`getOrientation` という便利な関数が提供されており、例えば左に 90 度回転した画像だと、このサンプルは `Just (Rotation MinusNinety)` を出力します。

ただし、hsexif は Exif の読み取りのみをサポートし、Exif の書き込みはサポートしていないこと、[ExifTool](http://www.sno.phy.queensu.ca/~phil/exiftool/) を使用すれば Exif の書き込みが可能ではあるが、システムコマンドを実行するのであれば ImageMagick でコマンド一発でサムネイルを生成する方が簡単であることから、今回のような結果となりました。

OpenCV の Haskell バインディングである [CV](http://hackage.haskell.org/package/CV) ならできるかも、と思って API を探してみましたが、OpenCV の Resize 相当が見当たらなかったため、実装されていないのだろうという結論です。
【Vysor】開発中のAndroidアプリを別の人のPC上で操作してもらう

# 概要
USB接続されたAndroid端末をPCから閲覧、操作できるgoogle chromeの拡張機能のVysorの紹介です。

# Vysor
<img width="939" alt="スクリーンショット 2016-02-18 0.59.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/4052/3abb374c-f643-101b-c849-5d2b742c87ca.png">

http://www.vysor.io/
導入は難しくないと思います。

# 便利なところ
* 実機の画面をPC上で表示できる
* AさんのPCに繋がっているAndroid端末を、BさんのPC上で操作することができる共有機能

# 共有機能の使い方
<img width="481" alt="スクリーンショット 2016-02-18 0.52.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/4052/7bdaab49-4815-c5ff-f18c-fed1f6b5d53a.png">
Vysorを立ち上げた時のデバイス選択画面の「share」というボタンをクリックすると、共有用のURLが発行されます。

そのURLを別のPC上で実行すると、Vysorが立ち上がり、端末が操作できるようになります。

# 想定される便利な場面の一例
* 東京で開発しているエンジニアAさんが、開発中のアプリの動きをちょっと確認してもらいたいと思った時に、Vysorを立ち上げて共有用のURLを発行する。
* そのURLをアメリカにいるディレクターBさんに共有。
* アメリカにいるBさんのPC上で、東京にいるAさんのPCに繋がった端末のアプリの動作確認ができる。
* わざわざアプリをインストールして確認してもらう必要がなくなる

# Vysorの作者
https://github.com/koush
OpenCV画像処理＋FFmpegファイル書出の雛形

OpenCVライブラリの`cv::Mat`型として生成した映像フレームを、FFmpegライブラリ(libavformat,libavcodec,libswscale)で動画ファイルとして書き出すまでの雛形コード。

https://gist.github.com/yohhoy/37f010d1fb8b3eb8b06a8669177d05f7

（ 前バージョン：https://gist.github.com/yohhoy/52b31522dbb751e5296e ）

- 一部のFFmpeg映像符号化サンプルコードはコーデック遅延(`CODEC_CAP_DELAY`)に対応しないものがあり、エンコーダによっては出力映像ストリームの末尾パケットが欠落する。ストリーム終端到達後の`avcodec_encode_video2` NULL通知により正しく対応。
- FFmpegサポート有りOpenCVビルドでも同じことを実現できるが、`cv::VideoWriter`では入力画像としてRGB色空間を要求する。動画系コーデックはYUV色空間ネイィブが主流のため、無駄な色空間変換コストを抑えたい場合に便利（かもしれない）。またOpenCVよりも対応するファイル形式／動画コーデックが多岐にわたる。
- FFmpegの出力フォーマット推定機能を利用しているため、出力ファイル名の拡張子からファイル形式と動画コーデックを自動選択する。エンコーダを明示指定したければ`avcodec_find_encoder`付近をいじる。符号化パラメータを調整したければ`vstrm->codec`メンバ変数を設定＋`avcodec_open2`の`options`指定を行う（エンコーダ毎に対応が異なる）。
 - `.mp4`: MPEG-4 ISOファイル形式 + H.264/AVC動画コーデック 
 - `.ogg`: Oggファイル形式 + Theora動画コーデック
 - `.avi`: AVIファイル形式 + MPEG-4 Video動画コーデック
 - `.wmv`: ASFファイル形式 + MS-MPEG4 V3動画コーデック
 - `.ts`: MPEG-2 TSファイル形式 + MPEG-2 Video動画コーデック
 - `.gif`: アニメーションGIF
 - `output%d.bmp`, `dump-%05d.jpg`など: 連番静止画ファイル（`%d`部分は連番数値に置き換えられる）
reveal.js参考サイト

# ■ reveal.jsとは
HTMLでプレゼンテーション用のスライドを作成するツール。

# ■ 導入

[本家](https://github.com/hakimel/reveal.js/#installation)からダウンロードする。

中身のindex.htmlがスライドとなる。


# ■ 基本構成

```html
<!--↓ここから開始 -->
<div class="reveal">
  <!-- Any section element inside of this container is displayed as a slide -->
  <div class="slides">

    <!--↓sectionごとに各スライドが切り替わる -->
    <section data-markdown>
        <!--↓scriptの中にスライドの内容をmarkdownで記載する -->
        <script type="text/template">
          スライド1
        </script>
    </section>

    <section data-markdown>
        <script type="text/template">
          スライド2
        </script>
    </section>  
</div>
```


# ■ スライドの属性 

 * data-markdown : スライドの内容を記載した外部markdownファイルのパスを指定
 * data-separator : 同じsection内でのスライドを区切るときの区切り文字を正規表現で指定(次のスライドは横方向)
 * data-separator-vertical : 同じsection内でのスライドを区切るときの区切り文字を正規表現で指定(次のスライドは縦方向)　　
* data-transition : スライド内コンテンツのアニメーションの指定
* data-background-transition : スライド自体のアニメーションを指定
* data-background : 背景色または、背景画像の指定
* data-separator-notes : スピーカーノートの区切り文字を正規表現で指定

```html
<section data-markdown="md/test.md"
        data-separator="---$"
        data-separator-vertical=">>>$"
        data-transition="zoom"
        data-background-transition="slide"
        data-background="green"
　　	data-separator-notes="^Note:">
    <script type="text/template">
  </script>
</section>
```

markdownファイルは、下記のように書くと区切られる。
※markdownファイルを本体の HTML から切り離して外部ファイルとして参照する場合、作ったコンテンツをWeb サーバー上で動かさなければならないので、オフラインでは使用できない。
https://gist.github.com/masakielastic/9d15ee8f46488183f8c0

```
スライド1

---

スライド2

>>>

スライド3
```

# ■ スピーカーノート
発表者用のカンペなどを表示する機能。

```html
<aside class="notes">
    スピーカーノートウィンドウを's'で表示。
    ここに書いた内容はスライドには表示されないないが、
    スピーカーウィンドウ上に表示される。
</aside>

data-separator-notesを使用した場合は、

Note:
ここからスピーカーノートにできる

```

# ■ テーマの変更

下記のcssファイルを変更する。

```html
<link rel="stylesheet" href="lib/css/zenburn.css">
```

# ■ 色の変更

```html
<section data-markdown>
    <script type="text/template">
        # <span style="color:green">色</span>

        <span style="color:red">タグ</span>を使って<span style="color:blue">色</span>を変える
    </script>
</section>
```

# ■ スライドの操作

| コマンド | 内容 |
|---|---|
| o または ESC | スライド一覧(オーバービュー) |
| f | フルスクリーンモード |
| s | スライドノート表示 |
| Alt + | マウスクリックでズーム |
| .(ピリオド) | スライドをブラックアウト |

# ■ 参考

* [各種設定方法](http://blog.sojiro.me/blog/2014/08/31/presentation-by-reveal-dot-js/)

* [用意されているテーマを視覚的に確認できる](
http://m0t0k1x2.tumblr.com/post/138522071369/%E3%83%9E%E3%83%BC%E3%82%AF%E3%83%80%E3%82%A6%E3%83%B3%E3%81%A0%E3%81%91%E3%81%A7revealjs%E3%81%AE%E3%83%97%E3%83%AC%E3%82%BC%E3%83%B3%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%82%8Breveal-ck)

* [Readme翻訳](http://qiita.com/hilohiro/items/eab479f6dcf4a100e31b)

* [Reveal初期値](http://qiita.com/tbpgr/items/fe0a1a7ca91cbb59eb99)

* [解説が記載されたサンプル](http://flatbird.github.io/revealjs-markdown/#/about-revealjs)

* [導入から操作まで](http://qiita.com/qt6hy/items/a8213db72462c1c46ae9) 

* [印刷方法など諸々](https://gist.github.com/masakielastic/9d15ee8f46488183f8c0)
【未完】Cucumber の結果をJSONで出力してRailsで表示したかった

# TL; DR

* Cucumber で rerun した結果も含めて一つの結果として出力したい。
* HTML出力は一回の実行しか出力してくれないので、1回 rerun すると最初の結果と含めて二つのファイルに分割されて出力される。
* あと、HTML出力のデザインがなんか芋い。
* JSON出力したデータを加工してWEBで見れるようにしたらいいのでは？
* Railsの勉強もしたいし、Rails経由で表示しよう。
* なんだかんだでRailsでやる意味がないのでは？ということに気づく。
* 一週間無駄にした！記事にしないとやってらんない！！

# 事の発端

　仕事でCucumberを使ってテスト自動化的なものをやっているわけですが、テスト結果をHTMLで出力して保存していってます。これがくせ者でして(というか私のシステムの組み方が悪いんでしょうけど)、HTML出力毎にJSとCSSを一つのファイルに組み込んで出力します。私の環境では、FeatureファイルごとにHTMLを出力するようにしていて、数百キロのファイルが1回のCucumberの実行で数十個出来上がります。毎日実行してたら、HDDを圧迫して仕方ない。
　かつ、Cucumber の rerun 機能を使って、失敗したテストケースを最大で5回繰り返すということを行っているので、1 Feature につき最大で5ファイル作成されてしまいます。
　こうなると、結果も煩雑になりますし、一回の実行で出力されるデータ量も相当なものになります。

# 解決策1

　世の中には、JenkinsというCIサーバーがあります。そして、Cucumberの実行を助けるプラグインというもの存在しているようです。ただ、Jenkinsを使うまでのテストでもないしなぁというので、今回は見送りました。

# 解決策2

　Cucumberは様々なフォーマットで出力できます。HTMLだったり、プレーンテキストだったり。その中でJSONがあり、JSONなら余計なデータがないのでデータサイズが小さくて済みそうだなぁということで、JSONを整形していて見やすい形で表示できないかなぁと思って、RailsでJSON受けて、DBに入れて、それをWEBで表示する方法がいいのでは？ということで実行することに。

# DBむずい、まずは、JSONパースしてHashでデータとってRailsで表示すればいいか？

　つーこって 127.0.0.1:3000/result にアクセスするとコントローラ内部でxquote使ってcucumberを実行して、その結果を文字列として取得。JOSNパーサでハッシュ化して、それをViewに渡して表示。って感じで表示した。

![lm6bRjLC7e.gif](https://qiita-image-store.s3.amazonaws.com/0/12550/beadb23e-9594-2077-f3d0-be1170375240.gif)

一番時間かかったのはCSSだったというのはRailsあるあるなんだろうか。。。

# よし、JSONデータでの実装はできた。これをDBに落とすようにすれば完成だ。。。

　と思って、どうDBに落とすかなぁというところで、indexページにボタン配置して、ボタンを押すとCucumberが動いて終了したらcurl使ってrailsにPOSTするって方法を考えて実行したんだけど、待てど暮らせどボタンを押してから帰ってこない。
　まぁ、理由はRailsから外部プログラムを実行してその中でRailsにポストしてたから。外部プログラムはRailsの処理の完了を待つし、Railsは外部プログラムの完了を待つという、ある意味デッドロックの状態に陥ってた。

# 非同期処理をせねば！！

 そこで登場 sidekiq。Railsは外部プログラムの実行をsidekiqに任せることで外部プログラムの処理を待たずして次の処理に進むことができる。外部プログラムもsidekiqごしにRailsにアクセスするので、通常のRailsのPOST処理が実行できる。

sidekiqの使い方は[ここ](http://qiita.com/nysalor/items/94ecd53c2141d1c27d1f)を参考にした。

# 機構はできた。さぁDB設計だ。。。

 ということで、JSONのデータをDBに落とし込むためのDBを定義しようと思って、ふと考える。
　JSONはCucumberの実行単位でPOSTされる。ということは、それが一回目の実行なのか、二回目の実行なのかをデータで持つ必要がある。もっと言うと、rerunした結果なのかも知る必要が出てくる。。。むむ。。なんだかややこしいぞ？

# Cucumber の Formatter 書いた方が早くね？

　ここまでやって、結構肥大化してきたなぁという実感が湧き始め、CucumberのFormatterをJSONじゃなくて、新しいHTMLフォーマットで作成してそれを保存するような方法の方がいいじゃないか？と思って、モチベがなくなりました。なんだか、陶芸家がお皿を割る気持ちが少しわかったきがする。

# 今後の展望

　CucumberのFormatterを作ってみようと思います。もしかしたら、やっぱりRails使ったほいがいいや！！ってなるかもしれません。そうなって、なおかつ完成したらまた記事にしますね。
storyboardのSceneを並べ替える

Xcode7 で storyboard の Scene を並べ替える方法を紹介します。

<img width="505" alt="before.png" src="https://qiita-image-store.s3.amazonaws.com/0/39720/3160f951-f0e2-4691-db79-ad1d601bd281.png">

# 結論
storyboard の xml を直接修正します。
# 手順
**1. `Project名/Base.lproj/Main.storyboard` をエディタで開きます。**
**2. `<scenes>` タグのなかにある `<scene>` を表示したい順序に並べ替えます。**

<img width="1099" alt="スクリーンショット_2016-02-17_23_37_31_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/39720/c8e9f1c6-9f0f-2f08-fcf5-b8ae2a992211.png">

**3. 並べ替えることができました。**

<img width="626" alt="after.png" src="https://qiita-image-store.s3.amazonaws.com/0/39720/7bbf8cf9-7720-7c85-ada8-9b13231632a5.png">
[Atomパッケージ]キーボードマクロをvim-modeにも作ってみた


以前に[[ATOM]キーボードマクロ作ってみた](http://qiita.com/JunSuzukiJapan/items/692dc5390ec545178e7d)のだが、勢いあまってvim-modeにもキーボードマクロを作ってみた。

[atom-keyboard-macros-vim](https://atom.io/packages/atom-keyboard-macros-vim)

でも、自分はemacsキーバインドしか使わないから、メンテしなくなりそう…。

緩募：メンテナー
tmux で 一時拡大の resize-pane -Z が便利。(ver1.8以降)


tmux でターミナルを分割して使っている時に、一時的に大きくしたい時とかありますよね。
一時的に man みたいとか、出力結果を less で見たいとか、過去の出力結果を遡ってみたいとか。

そんな時には ``[prefix] z`` で拡大できます。

![tmux_resizepane.gif](https://qiita-image-store.s3.amazonaws.com/0/47832/e71dc0b1-555f-5ea5-d362-c43c6ab48d1e.gif "tmux_resizepane.gif")


拡大中は Window の名前に「*Z」が追加されて 「zsh*Z」 などに名前が変わるので、
Zoom 中で他にも pane があるということが認識できる。

元に戻すときにも同じで ``[prefix] z``

ちなみに、タイトルにかかれている様に、version 1.8 で搭載された機能です。

tmux の version に関しては
　　mac だと brew で 2.1
　　Cent6 系で rpmforge 使っている人は 1.6
　　Cent7 系は 1.8
　　fedora23 は 2.0
なのかな。(2016.2 現在)


Cent6 系でこの機能を使いたい人は以下のような形でアップデートが必要。
以下は Cent6.5 で tmux1.9a のインストールだけど、
参考元のコメントでは、他バージョンでも動作している模様


```csh:
# Install tmux on Centos release 6.5
yum install gcc kernel-devel make ncurses-devel

# DOWNLOAD SOURCES FOR LIBEVENT AND MAKE AND INSTALL
curl -OL https://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
tar -xvzf libevent-2.0.21-stable.tar.gz
cd libevent-2.0.21-stable
./configure --prefix=/usr/local
make
sudo make install

# DOWNLOAD SOURCES FOR TMUX AND MAKE AND INSTALL
curl -OL http://downloads.sourceforge.net/tmux/tmux-1.9a.tar.gz
tar -xvzf tmux-1.9a.tar.gz
cd tmux-1.9a
LDFLAGS="-L/usr/local/lib -Wl,-rpath=/usr/local/lib" ./configure --prefix=/usr/local
make
sudo make install
```

参考元
https://gist.github.com/rothgar/cecfbd74597cc35a6018



この機能が出る前は 別 windows 開いたり、``[prefix] !`` の break-pane とかで、
別 Window にしたりしていたけど、resize-pane -Z のほうが使い勝手がいいかな。


ちなみに、2.1 系からは mouse 関連のオプションが変わっているので、
.tmux.conf に mouse 関連のことを記載している人は変更が必要。
PHP:オブジェクトからネームスペースを取り除いたクラス名を取得する関数

`Foo\Bar\Buz`クラスのインスタンスから`"Buz"`を求める関数です。

いろんな実装方法があるのですが、結論から言うと読みやすさと速さの観点から`(new \ReflectionClass($obj))->getShortName()`が一番良さそうです。

## 実装1: クラス名をファイルパスに見立ててbasenameで調べるhackeyなパターン

```php
namespace Foo;
class Bar {}

function get_simple_name1($obj) {
	return basename(strtr(get_class($obj), '\\', '/'));
}

assert(get_simple_name1(new \Foo\Bar) === 'Bar');
assert(get_simple_name1(new \Exception) === 'Exception');
```

## 実装2: 一度配列にして取り出すパターン

```php
function get_simple_name2($obj) {
	return array_slice(explode('\\', get_class($obj)), -1)[0];
}

assert(get_simple_name2(new \Foo\Bar) === 'Bar');
assert(get_simple_name2(new \Exception) === 'Exception');
```

## 実装3: リフレクションで調べるパターン

```php
function get_simple_name3($obj) {
	return (new \ReflectionClass($obj))->getShortName();
}

assert(get_simple_name3(new \Foo\Bar) === 'Bar');
assert(get_simple_name3(new \Exception) === 'Exception');
```

## 実装4: 文字列のオフセットで切り取るパターン

```php
function get_simple_name4($obj) {
	$class = get_class($obj);
	return substr($class, -strrpos($class, '\\'));
}

assert(get_simple_name4(new \Foo\Bar) === 'Bar');
assert(get_simple_name4(new \Exception) === 'Exception');
```

## 速さのベンチマーク

どれが良いかよくわからないので、速度を比較してみる。

```php
function benchmark($name, callable $test) {
    $start = microtime(true);
    for ($i = 0; $i < 100000; $i += 1) $test();
    echo $name, ': ', microtime(true) - $start, PHP_EOL;
}

$obj = new \Foo\Bar;
benchmark('get_simple_name1', function() use ($obj) {
	get_simple_name1($obj);
});
benchmark('get_simple_name2', function() use ($obj) {
	get_simple_name2($obj);
});
benchmark('get_simple_name3', function() use ($obj) {
	get_simple_name3($obj);
});
benchmark('get_simple_name4', function() use ($obj) {
	get_simple_name4($obj);
});
```

結果は、リフレクションが一番早いけれど、有意差があるかは不明だが、~~`get_class`が遅いんじゃないかという仮説がたちました~~。

```
get_simple_name1: 0.41280698776245
get_simple_name2: 0.42476606369019
get_simple_name3: 0.39611792564392
get_simple_name4: 0.41671085357666
```

`get_class`はリフレクションより早かったです。

```php
$obj = new \Foo\Bar;
benchmark('get_class', function() use ($obj) {
	get_class($obj);
});
benchmark('ReflectionClass', function() use ($obj) {
	(new \ReflectionClass($obj))->getShortName();
});
```

```
get_class:       0.15777897834778
ReflectionClass: 0.31506705284119
```
Effective Java：Enum編


###定数固有メソッド実装をもつenum型

```
public enum Operation{
   PLUS{double calc(double x, double y){return x + y;}},
   MINUS{double calc(double x, double y){return x - y;}},
   TIMES{double calc(double x, double y){return x * y;}},
   DIVIDE{double calc(double x, double y){return x / y;}} 

   abstract double calc(double x, double y);
}
```

###戦略enumパターン
OperationにPLUS{double ~}として処理を記述しているが、
戦略enumに処理を委譲する事もできる。
機能と実装を分離してみる。


```
public enum Operation{
   PLUS(Strategy.PLUS),

   private Strategy strategy;
   Operation(Strategy strategy){ this.strategy = strategy;}

   double calc(double x , double y){
       return strategy.calc(x,y);
   }
}

public enum Strategy{
  PLUS{double calc(double x, double y){return x + y}},

  abstract double calc(double x, double y);
}
```
量化記号〜$\forall$とか$\exists$について

$\forall$とか$\exists$について

# こいつら何者？
量化記号という論理記号です。この２つだけなので、名前は覚える必要はありません。$\forall$はfor all、$\exists$はthere existsと自分は読んでいます。

# $\forall$
$\forall$は、「すべての〇〇について☓☓が成り立つ」ということを表す記号です。集合$A$のすべての要素$a$で条件$P(a)$が成り立つということを$\forall$を使えば、

```math
\forall a \in A, P(a)
```
のように書きます。このように何らかの集合のすべての要素で成り立つという条件を書くのに使います。
For all a in A P(a)と読むと理解しやすいと思います。allの頭文字aを大文字にして上下ひっくり返した記号です。

# $\exists$
$\exists$は、「ある〇〇について☓☓が成り立つ」ということを表す記号です。同じことですが、「☓☓が成り立つ〇〇が存在する」とも読めます。集合$A$のある要素$a$で条件$P(a)$が成り立つということを$\exists$を使えば、

```math
\exists a \in A, P(a)
```
のように書きます。もしくは、

```math
\exists a \in A\ s.t. P(a)
```
s.t.というのは、such thatの略です。$a$の条件がその後に書かれることを明記した記法です。There exists a in A such that P(a)と読むと理解しやすいと思います。existの頭文字eを大文字にして左右ひっくり返した記号です。

# 教科書と少し違う！
人によって少し違う場合がありますが、意味は一緒です。

# どこで登場するの？
頻繁に出てきます。ですが、おそらく、最初に理解するのに苦労するのは$\varepsilon$-$\delta$論法だと思います。これは、極限の定義をきちんと書いたもので、$\forall$も$\exists$も使います。
$\lim_{n\to \infty}a_n = a$とは、

```math
\forall \varepsilon > 0, \exists N \in \mathbb{N}\  s.t. \forall n\in \mathbb{N}, n>N \Rightarrow -\varepsilon < a_n - a < \varepsilon
```

詳しくは微積で勉強してください。これは数列バージョンなので$\delta$は無いです。
HTMLでプレゼンテーションを作ってみた!

#HTMLでプレゼンテーションを作る
LTで登壇することになったけどネタがない。。。(本番前日)
HTMLでプレゼン作れると聞いたのですぐさまテンプレ探しへ。

検索かけて出てきたのテンプレートが
・reveal.js
→[GitHub](https://github.com/hakimel/reveal.js),<a href="http://lab.hakim.se/reveal-js/#/">デモ画面</a>
・jmpress.js
→<a href="https://github.com/jmpressjs/jmpress.js">GitHub</a>,<a href="http://jmpressjs.github.io/jmpress.js/#/home">デモ画面</a>


一番簡単そうに見えたreveal.jsを使って編集してみることに決めました。
作ってて<a href="http://lab.hakim.se/reveal-js/#/">デモ画面</a>が面白くて作ってるだけで楽しめました笑。

#内容
簡単にHTML,CSSを紹介した後、google chromeでDeveloper Toolを用いてCSSを編集する方法を紹介するという構成に決定(本番20時間前)。
<a href="http://ascii.jp/elem/000/000/997/997889/">ASCⅡ.jp</a>さんの記事を参考に開発ツールのページから直接編集する方法を写真も交えて解説

やっぱりcssはちゃんとエディタで修正する方がいいなと思いつつも紹介することにしました笑。

#プレゼンの作り方
HTMLで\<section>タグで囲まれた内容が1ページ分のスライドになるらしく、\<section>タグの中で\<section>タグを書くとスライドのスライドが上下にアニメーションするようになります。(説明難しいです汗)

こんな感じで沢山機能があるのですが、デモ画面を見ながら各タグ、クラスの意味を理解していけば簡単に作れると思います。
デモ画面のスクリプトはそれぞれの画面で使われてる機能の説明してるので(全部英語ですがいい勉強になりますね笑)

gifとかも入れられるのかと感動しつつ17枚のスライドを3時間~4時間ほどで作り終えることができました~(本番前日午後23時半)

完成したプレゼンテーションのGitHubは[こちら](https://github.com/k-nish/presentation)

#参考URL
だいぶ雑な説明になりましたが、他にもいろいろテンプレートがあるようなので興味あったら見てみると楽しいと思います!
##HTMLプレゼンテーション 参考URL
・[なんかかっこいいプレゼンテーションテンプレートを探しているならreveal.js使ってみろって](http://qiita.com/ryurock/items/9c6de36b9d6a716e7992)

・[JavaScript/HTML5でプレゼン用スライドをつくる方法まとめ](http://qiita.com/KENJU/items/938c947d84ca9fc35108)

・[HTMLベースで作成できるプレゼン用スライドのまとめ](http://coliss.com/articles/build-websites/operation/work/html-basedpresentation.html)

##プレゼン内容　参考URL
・[CSSの修正が捗る「リアルタイムコーディング」とは](http://ascii.jp/elem/000/000/997/997889/)
John Carmack Interview 1

John Carmack 

https://www.youtube.com/watch?v=sWRctnQU2F4&index=55&list=PL_MJualihC5AxdlHgVUROYKbNAaPJ5PE4

以下、INTはインタビューしている人。JohnはJohn Carmack。

(00:00-)
INT: So, I guest, just kind of generally, I mean, some of the most impressive things, you know, what we really <font color=red>XXX1</font>, you know, video graphics development. 

(00:07-)
INT: So, I mean, I guess, the first question is, Ahm, just, you know, <font color=blue>what</font> some of the most impressive <font color=red>XXX2(inter?)</font> graphical effects, Ah, you know, you think, you are going <font color=red>XXX3</font> 2 dimension.

(00:18-)
John: Well, the, I, know things <font color=red>XXX4</font> get out of way.
This is something I say a lot of times, just I really don't believe special effects where you point out something in, Say "look at the special effect going on here", is over that last several years bunch of things come out in graphics cards where you could do ...


赤文字ははっきり聞き取れない部分。
青文字はそのように聞き取れるが、文法的にしっくりいかない部分。

結構細かい部分が聞き取れていない。

また、話がつながっていくので、どこで区切るかが問題だ。
さくらのレンタルサーバに ImageMagick をインストールする方法

さくらのレンタルサーバにパッケージを導入する場合、[pspkg](http://qiita.com/bellflower2015/items/4aa2f388a29b1702dc0e) というツールが非常に便利ですが、残念ながら ImageMagick は pspkg では導入できませんでした。

ということで自前でインストールします。

```bash
$ mkdir ~/works
$ cd ~/works
$ wget -c http://www.imagemagick.org/download/ImageMagick.tar.gz
$ tar xf ImageMagick.tar.gz
$ cd ImageMagick-6.9.3-4/
$ ./configure --prefix=$HOME/usr --disable-openmp --disable-opencl
$ make
$ make install
$ echo "export PATH=\$HOME/usr/bin:\$PATH" >> ~/.bash_profile
$ echo "export PKG_CONFIG_PATH=\$HOME/usr/lib/pkgconfig" >> ~/.bash_profile
$ source ~/.bash_profile
```

`./configure --prefix=$HOME/usr --disable-openmp --disable-opencl` がポイントです。さくらのレンタルサーバが使用する FreeBSD 環境がなのが、その環境が使用する clang がなのかはわかりませんが、とにかく OpenMP がサポートされていないため、`--disable-openmp` オプションなしでビルドすると `undefined reference to omp_destroy_lock@OMP_3.0` というたぐいの実行時エラーが発生します。ImageMagick のライブラリとのリンク時にも同様のエラーが発生します。このオプションで OpenMP と、ついでに `--disable-opencl` で OpenCL も無効にします。

最後の 3 行は実行ファイルへパス、ImageMagick のライブラリに対して `pkg-config` が適切な結果を返すようにするための環境変数の整備です。

インストールに成功していれば、以下の様な結果を返すはずです。

```bash
$ which convert
/home/xxx/usr/bin/convert
```

```bash
$ convert -version
Version: ImageMagick 6.9.3-4 Q16 x86_64 2016-02-17 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2016 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Features: Cipher DPC 
Delegates (built-in): bzlib fftw fontconfig freetype fpx jbig jng jpeg lcms lqr png tiff xml
```

```bash
$ pkg-config --libs ImageMagick
-L/home/xxx/usr/lib -lMagickCore-6.Q16
```