OmniAICreator/Qiita-1.07M huggingface dataset:
Rails4 turbolink に気をつけてモーダル用のjQueryライブラリremodalを使う


Rails駆け出しなので、
ページ遷移をajaxでやってくれるturbolink の作用による
jQueryライブラリRemodalが上手く使えないことに
とまどったので、メモ。
(これしばらく下書きのままだったの忘れてた)


_header.html.slim とかに下記を記載して、
remodal()がちゃんと呼ばれるように明示的に書く。

```slim
- content_for :bottom_script
  javascript:
    $( function(){
      $( '#nav li:has(ul)' ).doubleTapToGo();
  	});
    $('[data-remodal-id=modal]').remodal()
```

## 参考
[Ruby - Rails 4 で turbolinks をオフにする方法 - Qiita](http://qiita.com/kazz187/items/12737363d62b9c91993c)

[VodkaBears/Remodal](https://github.com/VodkaBears/Remodal#readme)

## おまけ
ソーシャルボタンもturbolinkに気を配る必要があったので、
下記記事に助けられました
[Rails / Turbolinksに対応したソーシャルボタンを配置する（Facebook, Twitter, Google+, Pocket, はてブ） | Workabroad.jp](http://www.workabroad.jp/posts/2083)
[DynamoDB] DynamoDBをLocalで使う

# はじめに

DynamoDBをローカルで起動し、使う方法です。
実行可能jar形式になっているので、VirtualBoxなどは不要です。

# ダウンロード

以下からDynamoDB Localをダウンロードします。

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tools.DynamoDBLocal.html

# 実行

以下で実行します。

```
java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar
```

# credentialsファイルをつくる

接続時に必要な情報です。

```
C:\Users\ユーザー名\.aws\credentials
```

内容はこんなのでよいです。

```
[default]
aws_access_key_id=Your Access Key ID
aws_secret_access_key=Your Secret Access Key
region=Optional, the default region to use for this profile
```

# 接続

以下でDynamoDB Localに接続できます。
あとはご自由に。

```
AmazonDynamoDBClient dynamoDB = new AmazonDynamoDBClient(new ProfileCredentialsProvider());
dynamoDB.setEndpoint("http://localhost:8000");
```
vagrant+nginxにLarave4導入

前提条件
　centosにnginxとmysqlとphpとcomposerをインストール済み

・自分は下記の手順で環境を構築
・vagrantで作ったローカル環境(centOS)にnginxを導入してみた<br>　http://qiita.com/TetsuTaka/items/68900b57309b89a8ed7c
・vagrant+CentOSにmysql5.6を導入<br>　http://qiita.com/TetsuTaka/items/682cac36c34a93992ace
・mysqlを自動接続する様にする<br>　http://qiita.com/TetsuTaka/items/acdf7c440457258a1214
・vagrant+CentOSにphp5.5(当時の最新版)を導入<br>　http://qiita.com/TetsuTaka/items/8bf8877a7d603fcaf9ef
・vagrant+CentOSにcomposerを導入<br>　http://qiita.com/TetsuTaka/items/1431bb202e1a00777f82
※「.php」を使える様にする。phpinfo()を確認する方法<br>　http://qiita.com/utano320/items/36b6eac2bbd5bb5657f6

・Larave4をインストール
自分はドキュメントルートが「/var/www/html」なので、その配下で下記を実施。
※ phpのインストール時にphp-mcryptをインストールしていないとエラーが出ます
<pre>composer create-project laravel-ja/laravel プロジェクト名 --prefer-dist</pre>

ではでは、publicの中のindex.phpを拝見しますかね。。。
「Error_in_exception_handler」・・・？

エラーにハマりました。

まずはこちらを見つける。
http://sugi511.hatenablog.com/entry/2014/08/11/Laravel4でインストールした時に「Error_in_exception_handler.」

んで、chmodが機能せず、こちらを見つける。
http://www.webcyou.com/?p=5464

解決！

無事にindex.phpが表示され、Larave4の画面が見れました^^

・Larave4導入の参考サイト
<pre>http://www.monster-dive.com/blog/web_system/20140328_001128.php</pre>
Linuxでハードディスクのデータを消してしまう #linux


## 目的
Linuxサーバから、すべてのデータを完全に消したい。

「完全に」がポイント。


### 注意

rmコマンドでファイルを消去すれば、見かけ上そのファイルの内容を表示することはできなくなるが、
rmコマンドは該当ファイルのiノードを解放するだけで、データの内容自体はディスク上に残るようです。

## ハードディスクの消去に使われるコマンド

* shred
shredは特別なパターンで繰り返し上書きしデータの復旧がより困難にするデータ消去に特化したコマンドです。
shredは、ファイルを特別なパターンで繰り返し上書きすることによりデータの復旧をより困難にするツールで、GNU core utilsに含まれている。

* dd
ファイルのコピー・ディスクダンプ・バックアップ・リストア・ファイル作成のコマンド。
入力から出力へデータをコピーするコマンドで、dd はファイルからデバイス、デバイスからファイル、デバイスからデバイスへのコピーも可能で、ディスクのバックアップやダンプにも使用できます。
ハードディスクの消去の際には、ddはダミーデータで埋め尽くしに使用します。


## 今回使用したコマンド

HDDの先頭512バイトにパーティションテーブルを含むMBRが確保されていますので、ここをddコマンドで初期化しました。

```bash
sudo dd if=/dev/zero of=/dev/sda bs=512 count=1
```

* if
入力ファイル (デバイス)。指定しないと標準入力。
* of
出力ファイル (デバイス)。指定しないと標準出力。
* bs
入出力のブロックサイズを指定。ibs(入力のブロックサイズを指定) と obs(出力のブロックサイズを指定) の両方に同じ値をセットする場合に使用する。
* count
コピーするブロック数を指定

## 周辺知識

* MBR
Master Boot Record
MBRはシステムディスク（HDD）の先頭セクタ（第0セクタ）に置かれて、BIOSがシステムをブートするために使うソフトウェアとデータが格納されています。
1つのセクタに格納するので512バイトという限られたサイズにプログラムやデータが格納されてます。


* セクタ
HDDでは，磁性体を塗布したアルミ・ディスクに磁気を利用してデータを書き込みます。
ディスクは，セクターという一定サイズの小さな記録領域に分割されています。
一般にデータは，分割されて複数のセクターに記録されます。セクターの大きさはさまざまですが，現在では，一般に1セクター当たり512バイトとなっています。
データは，セクターを単位としてディスクに入出力されます。セクターより小さな単位でデータをやりとりすることはできず，どんなに小さなデータでもディスクに保存するときは1セクター利用します。


* ファイルシステム
カーネルの管理機構。
各ファイルのデータがディスクのどのセクターに，どのような順番で保存されているかを管理します。
ファイル・システムでは，効率を上げるためにいくつかのセクターをまとめて1つのデータ・ブロックとしています。
ex) ext2/ex3/ext4/ReiserFS

* デバイスファイル
Linuxでは接続されたデバイスは/dev以下にデバイスファイルとして扱い、ハードウェアの管理を行う。
ハードディスクの接続形態として、IDE,SCSI,SATAなどがあります。
IDEデバイスは安価
SCSIデバイスは高価、専用コントローラがデバイスを制御するのでCPUに負荷がかからない
SCSIデバイスファイル名（SATA接続のデバイスも同様）
　/dev/sda  ： 1番目の接続デバイス
　/dev/sdb  ： 2番目の接続デバイス
　/dev/sdc  ： 3番目の接続デバイス
　/dev/sdd  ： 4番目の接続デバイス
　/dev/scd0 ： SCSI接続のCD-ROMドライブ
IDEデバイスファイル名
　/dev/hda  ： プライマリマスター
　/dev/hdb  ： プライマリスレーブ
　/dev/hdc  ： セカンダリマスター
　/dev/hdd  ： セカンダリスレーブ
　/dev/fd0 ：フロッピーディスク
　/dev/cdrom:IDE接続のCD-ROMドライブへのシンボリックリンク
IDEでは接続インターフェイスとしてプライマリとセカンダリの２つが用意されており、それぞれに２台づつのデバイス（マスターとスレーブ）を接続することができます。
vagrant+CentOSにcomposerを導入

前提条件
　vagrantにsshで接続
　スーパーユーザになっている

・composerインストール
<pre>curl -sS https://getcomposer.org/installer | php</pre>

・そのまま叩いても使えますが、面倒なので「/usr/local/」にインストール
<pre>mv composer.phar /usr/local/bin/composer</pre>※composer.pharをcomposerに名前を変更
vagrant+CentOSにphp5.5(当時の最新版)を導入

前提条件
　vagrantにsshで接続
　スーパーユーザになっている
　yum update済み

・リポジトリのインストール
<pre>rpm -ivh --force http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh --force http://rpms.famillecollet.com/enterprise/remi-release-6.rpm</pre>

・php各種インストール
<pre>yum install --enablerepo=remi --enablerepo=remi-php55 php php-devel php-mbstring php-fpm php-mysql php-mcrypt</pre>

・バージョンの確認
<pre>php --version</pre>

php5.5が入っていれば完了！

・phpinfo()を確認する方はこちらを参照(nginx)
<pre>http://qiita.com/utano320/items/36b6eac2bbd5bb5657f6</pre>
Vagrantでのホスト・ゲスト間の共有フォルダ設定について

## 環境
Mac 10.9.4
vagrant 1.6.3
VirtualBox 4.3.12

## 内容
vagrantで環境構築していて、共有フォルダの設定でいろいろ悩んだのでメモ。
そもそもvagrantのことをよく分かってない状態から、調べながら環境構築したので時間かかってしまった。

## 要件
* Vagrantで構築したゲストOSと、ホストOSのファイル共有をしたい。
* 共有するディレクトリは、ホスト側（任意の位置）、ゲスト側（apacheのDocumentRoot）
* 共有したディレクトリは、git管理する。

## 調べたこと
* ホスト側のVagrantfile置いてあるディレクトリと、ゲスト側の/vagarantが元々共有になっている。<br>→ゲスト側の指定のディレクトリを共有したいので、今回の要件には合わず。シンボリックリンク貼ったりしてみたけどダメでした。
* VirtualBoxマネージャー（GUIのアレ）経由で共有フォルダ設定しても、vagrant reloadすると設定が消える。<br>→vagrant側に設定しないとダメということが分かった。
* Vagrantfileにvirtualboxの共有フォルダ設定が書ける。<br>→これで解決した。<br> 
`config.vm.synced_folder "ホスト側Vagrantfileあるディレクトリ", "ゲスト側ディレクトリ"`<br>
設定後、vagrant reloadするとvirtualboxマネージャーの共有フォルダ設定が追加されている。（＝共有フォルダマウントされる。）

## 振り返り
途中、環境を何度か作り直したりしてるうちに、vagrant upできなくなったり、vagrant ssh接続できなくなったりしたけど、壊して作り直したら動いてしまったので、その原因は分からず・・・。まあそうやって何度もお手軽に作り直せるのがvagrantのよい点なんだろうな。

---
* 2014/09/03 環境を書いてなかったので、追記しました
iTerm2 瞬時に開く閉じる

<strong>iTerm2のPreferencesからKeysタブを選択。
HotKeyの下のShow/hide iTerm2~のチェックボックスを入れ
（筆者は)`control+Space`と入力。
これで`control+Space`コマンドを打つことで瞬時に
iTerm2を開いたり閉じたりできる。   </strong> 

![スクリーンショット 2014-09-03 3.06.05.png](https://qiita-image-store.s3.amazonaws.com/0/34498/01e87ec3-fdfd-7ad2-5918-15b24db6f360.png)  
  
<hr>
  
<strong>`command+Enter`と押すと全画面表示になるのだが、
Mac特有の右への動きが気持ち悪いし、瞬時とはいえないので、
Generalタブのwindowのチェックを全て外す。
すると `command+Enter` で瞬時に全画面且つ、 
`control+Space` で開閉を瞬時に行うことが可能となる。 </strong> 
  

![スクリーンショット 2014-09-03 3.10.29.png](https://qiita-image-store.s3.amazonaws.com/0/34498/16622966-7d75-61f2-4698-bb95c30d8ddf.png)
Macの環境設定(3) zshを入れる


## はじめに
[前回](http://qiita.com/nenokido2000/items/e79a0779b95f2abaef7b)の続きです。
MaxOSXでの通常のシェルはbashが使用されますが、zshを入れると色々と幸せになれそうだったのでセットアップしてみます。

## zshのインストール
Mavericksでは、標準でインストール済みです。
ターミナルから、以下を実行し、

```
zsh
```
psでプロセス確認してみると、zshが起動しているのが分かるかと思います。
せっかくなので、最新版を入れたほうがよいかと思いますので、Homebrewでインストールしましょう。

```
brew install zsh
```

## ログインシェルをzshに変更する
都度zshを叩いて使うのもあまり意味がないので、ログインシェルをzshにしてしまいましょう。
以降の作業は、ターミナルから行います。

### /etc/shellsの編集
`/etc/shells`に使用可能なシェルの一覧が設定されています。
これを開いてみると、以下のようになっているかと思います。

```:/etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
```

`/bin/zsh`は最初からインストール済みだったzshになるので、先程Homebrewで入れたzshを選択できるように編集します。
（最後の1行を追加しています。）

```:/etc/shells(編集後）
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/zsh
```

### chsh実行
chshを叩いて、ログインシェルを変更します。
こんな感じです。

```
chsh -s /usr/local/bin/zsh
```

## 設定ファイルを作成する
ホームディレクトリの.zshrcが、zsh起動時の設定ファイルとなります。
ファイル自体がない場合は、`touch ~/.zshrc` などで作成しておきましょう。

### .zshrcの編集内容
色々設定できるみたいなんですが、今回は[少し凝ったzshrc](https://gist.github.com/mollifier/4979906)を頂戴することにしました
.zshrcファイルをvimで開いて、[少し凝ったzshrc](https://gist.github.com/mollifier/4979906)の内容をコピペして保存します。

### .zshrcの設定反映
次回ターミナル起動時から.zshrcの設定が反映されますが、現在のターミナルに反映させたい場合は

```
source ~/.zshrc
```

で、設定を読み込ませてください。

### 設定反映の確認
ターミナルの見た目が変わるのでそれだけでも分かりますが、何かのコマンドの補完をやってみるといいかと思います。
例えば `git` とブランクを入力した後にtabを打つと、gitで利用可能なサブコマンドの一覧が表示されます。 

## 次回へ続く
zshをインストールし、ログインシェルに設定してみました。
高機能で全然使いこなせていないですが、tab補完だけでも相当幸せになれます。

後2回くらいで、残りの設定についてまとめられればと思っています。

## 参考
以下を参考にさせていただきました。
ありがとうございました。
* [初めてMacでzshを使う人のためのチュートリアル](http://mollifier.hatenablog.com/entry/2013/02/22/025415)
MongoDBの地理空間インデックス・クエリ整理

MongoDBの地理空間インデックス・クエリは結構複雑なので、整理してみました。

### ドキュメントへの格納の仕方
地理空間データの格納の方法は以下の二通り

|            |座標|GeoJSON|
|------------|------------|------------|
|概要| 従来の、座標を表すデータ。主に平面上の点を扱うのに使う | 新しい、様々な形を表現できるデータ。主に地球面上の緯度経度を扱うのに使う。 |
|サンプル|  `{loc:[10,20]}`| `{loc:{type:"Point",coordinates:[10,20]}}` |
|  表現できる図形 |点|  点、直線、多角形、およびこれらの集合  |

* `loc`の部分は任意の文字列にかえられます

### クエリの種類
クエリは以下の三種類

||内包|重なり|近傍|
|---------|----------|--------|-------|
|オペレータ|`$geoWithin`|`$geoIntersects`|`$near`|
|検索条件|GeoJSON-多角形、座標-四角、座標-多角形、座標-円、座標-地球上面の円|GeoJSON-点、GeoJSON-線、GeoJSON-多角形|GeoJSON-点と距離、座標-点と距離|
|利用するインデックス|2dと2dsphereの両方(※)|2dsphereのみ|2dと2dsphereの両方|

(※)インデックス無しでも計算可能

### 検索条件
クエリで利用できる検索条件は以下の通り

|タイプ|図形|サンプル|
|-----|-----|----|
|GeoJSON|点|`$geometry :{ type : "Point" ,coordinates:[lon,lat]}`|
|GeoJSON|直線|`$geometry :{ type : "LineString" ,coordinates:[[lon,lat],[lon,lat]]}`|
|GeoJSON|多角形|`$geometry :{ type : "Polygon" ,coordinates:[[[lon,lat],[lon,lat],...]]}`|
|GeoJSON|GeoJSONの集合|`$geometry :{ type : "GeometryCollection",geometries:[...]}`|
|座標|点|`[x1, y1]`|
|座標|四角|`$box : [[x1, y1], [x2, y2]]`|
|座標|多角形|`$polygon : [[x1, y1],[x1, y2],[x2, y2],[x2, y1]]`|
|座標|円|`$center : [[x1, y1], r]`|
|座標|地球面上の円|` $centerSphere: [[x, y], radius]`|


### インデックスの種類
地理空間インデックスの種類は以下の二つ

|            |2d|2dsphere|
|-----------|------------|------------|
| 対応データ       |  座標           |  座標とGeoJSON     |
| クエリ       |  平面上で計算 (※)          |  地球面上で計算    |
| 複合インデックス   |  2dインデックスの後に続くひとつのキーのみ複合インデックスにできる| 位置に関係なく、スカラインデックスと2dsphereインデックスで複合インデックスを作ることができる | 

(※)円の中に存在するかどうかのクエリ(`$geoWithin`と`$centerSphere`の組み合わせ)だけは地球面上で計算できる

### 所感
マニュアルを基に整理してみましたが、非常に複雑です。。。
特に、座標とGeoJSON、平面上と地球面上、これらの関係性が難しい！
整理して初めて気づいたのですが、**二つの多角形の重なりは、平面上では計算できない**んですね（$geoIntersectsが2dインデックスに対応していないため）。

もしかしたら間違っているかもしれません。間違いを見つけたらどしどしご指摘ください。


### 参考
* 一番まとまっている本家のページ
 * →[Geospatial Indexes and Queries](http://docs.mongodb.org/manual/applications/geospatial-indexes/)
* クエリのオペレータ、条件、対象データがわかりやすく整理されています
 * →[Geospatial Query Compatibility](http://docs.mongodb.org/manual/reference/operator/query-geospatial/#geospatial-query-compatibility-chart)

* GeoJSONの仕様
 * →[GeoJsonの仕様](http://geojson.org/geojson-spec.html)
Gitでマージを忘れているブランチを表示する

ひとりで開発しているときはそんなこと起こらないかもしれませんが、チームで開発しているときは、developブランチがどんどん先に進んで、まだマージしていない自分のブランチが忘れ去られてしまうことがあります。（私はありました。）

そんなときにこのオプションを知っていると便利です。

```bash
git branch --no-merged develop
```

最近では週に一回は確認するようにしていて、覚えやすいようにエイリアスを作っています。

```bash
git config --global alias.no-merged "branch --no-merged develop"
```

同じようなことで困っているかたの参考になれば幸いです。


P.S.
むかし、ブログに書いたgit-graphも便利なので参考になれば！

http://yumewaza.yumemi.co.jp/2010/07/git.html

当時からずっと使い続けています。
HTMLタグを出力する一時変数の初期化

#tl;dr
* content_tagを連結していく処理で、一時変数の初期化をするときは空文字をhtml_safeしよう

```rb
content_string = ''.html_safe
content_string << link_to('Hogeページヘ', hoge_path) if hoge?
content_string << link_to('Fugaページヘ', huga_path) if huga?
```

# kwsk

Railsのヘルパーに、条件によってリンクを動的に作成するようなメソッドを実装しようと思いたち、以下のように作ってみました。

```application_helper.rb
# 利用者を判別してメニューを作成する
# @return [String] メニューのHTML
def user_menu
  content_string = ''

  content_string << link_to('管理ページ', admin_path) if current_user.try(:admin?)

  content_string << if topics_exists?
    link_to 'Top', top_with_topics_path
  else
    link_to 'Top', top_path
  end
  
  content_string << content_tag(:p, "ようこそ#{current_user.try(:user_name) || 'Guest'}さん!!")
  content_string
end
```

```_menu.html.haml
.user_menu
  =user_menu
```

ブラウザで表示すると

```
<a href="/admin">管理ページ</a><a href="/">Top</a><p>ようこそGuestさん!!</p>
```

と表示されます :weary: 
HTMLソースを覗いてみると`<`などの記号が`&lt;`のようにエスケープされているようです。
これをちゃんと表示するには

```_menu.html.haml
.user_menu
  = raw user_menu
```

としてあげなければいけないのですが、<del>面倒くさい</del> せっかくヘルパーにしたのに、呼び出し元でも更に加工しなければならないのが不便 :sweat: 
さらにいえば、例えばuser_nameをユーザーが自由に入力できるときに、ページに意図しないHTMLソースを埋め込まれる可能性があります（今回の場合は、埋め込まれたところでどうってことありませんが）。

実は`link_tag`や`form_for`などで生成される`<xx>..</xx>`という文字列は、Stringクラスを拡張したActiveSupport::SafeBufferというクラスのオブジェクトです。
ActiveSupport::SafeBufferオブジェクトがViewに描画されるときは、安全な文字列として判断しHTMLタグをエスケープせずに出力してくるようです。

ある文字列をActiveSupport::SafeBufferオブジェクトに変換するには`String#html_safe`を使いましょう。

```application_helper.rb
# 利用者を判別してメニューを作成する
# @return [String] メニューのHTML
def user_menu
  content_string = ''.html_safe

  content_string << link_to('管理ページ', admin_path) if current_user.try(:admin?)

  #中略

  content_string
end
```

```_menu.html.haml
.user_menu
  =user_menu
```

ブラウザで確認してみれば、ちゃんとリンクで構成されたメニューが表示されました！ :satisfied: 

# btw
少し話しはずれますが、StringオブジェクトとActiveSupport::SafeBufferオブジェクトを連結した時の動作は以下のようになります。
動作確認はRails4.1.4で行いました。

```rb
str = ''
safe_str = ''.html_safe

str.class       #=> String
safe_str.class  #=> ActiveSupport::SafeBuffer

(str + str).class            #=> String
(str + safe_str).class       #=> String
(safe_str + str).class       #=> ActiveSupport::SafeBuffer
(safe_str + safe_str).class  #=> ActiveSupport::SafeBuffer
```

下から２つめのパターンは時に罠となりえそうです。

```rb
content_string = ''.html_safe
content_string << link_to('hoge', hoge_path)
content_string << user.profile # ユーザーの自己紹介を連結
```

上のコードでは、ユーザーの自己紹介に悪意あるコードが含まれていても、Viewにcontent_stringが書き込まれる際にエスケープされません。注意しましょう。

代換え・類似の手段として、以下のようなものもあるようです。

* [I18n.tでHTMLを出力するのにrawを使ってはいけない - Qiita](http://qiita.com/tnj/items/c9e893124c1b000b5355)
  * 要点：　I18nから引用する文章にHTMLタグがあるなら、キーの名前を「XX_html」にすればエスケープされない
* [ビューで配列を改行するなら脆弱なjoinではなくsafe_joinにしよう -TechRacho](http://techracho.bpsinc.jp/hachi8833/2014_06_19/17964)
  * 要点：　Array<String>の連結にはsafe_joinを使うといいという話

# ref.
[rails/actionview/.../tag_helper.rb - Github](https://github.com/rails/rails/blob/v4.1.5/actionview/lib/action_view/helpers/tag_helper.rb#L134-L138)
[rails/actionview /.../buffers.rb - Github](https://github.com/rails/rails/blob/08754f12e65a9ec79633a605e986d0f1ffa4b251/actionview/lib/action_view/buffers.rb)
PHP 5.6.0で増えたopcodeについて調べてみる

PHPのZend VMのopcodeの定義はZend/zend_vm_opcodes.hにあり、このファイルのバージョン間の差分を見れば増えたopcodeがわかります。PHP 5.6.0で増えたopcodeは下記の4つです。

- ZEND_RECV_VARIADIC
- ZEND_SEND_UNPACK
- ZEND_POW
- ZEND_ASSIGN_POW

これらがPHPのどんな言語構造に対応するものか、PHP 5.6.0で[vld](http://derickrethans.nl/projects.html#vld)を使って調べてみました。ただし、vldに自前で5.6対応パッチを当てる必要があるので注意してください。そのうち本家にパッチを送っておきます。

# ZEND_RECV_VARIADIC

「...」を使った可変長引数の定義に対応します。たとえば次のようなコードで使われます。

```php
<?php
function f(...$list) {
    foreach ($list as $elem) {
        var_dump($elem);
    }
}
f(0,1,2,3);
```

参考：[「PHP 5.6 以降における ...」](http://php.net/manual/ja/functions.arguments.php#functions.variable-arg-list.new)

# ZEND_SEND_UNPACK

「...」を使った、配列やTraversableの引数展開に対応します。たとえば次のようなコードで使われます。

```php
<?php
function f($el1, $el2) {
    var_dump($el1);
    var_dump($el2);
}
f(...[0,1]);
```

参考：[「PHP 5.6 以降における ...」](http://php.net/manual/ja/functions.arguments.php#functions.variable-arg-list.new)

# ZEND_POW

べき乗演算子「**」に対応するものです。たとえば次のようなコードで使われます。

```php
<?php
$a = 3 ** 2
```

参考：[「代数演算子」](http://php.net/manual/ja/language.operators.arithmetic.php)

# ZEND_ASSIGN_POW

べき乗代入演算子「**=」に対応するものです。たとえば次のようなコードで使われます。

```php
<?php
$a = 3;
$a **= 2;
```

# まとめ

opcodeの観点からPHP 5.6の新機能を見てみました。リリースノートだけ見ても正直ピンと来ないので、こういうアプローチの調査も良いのではないでしょうか。
net-snmpの設定


## はじめに

net-snmpの設定のうち、アクセス制御とシステム情報について記述します。

## net-snmpの設定

### アクセス制御

* com2sec

セキュリティの定義を行います。

「NAME」には、セキュリティ名を指定します。
「SOURCE」には、ホスト名、サブネットまたは"default"を指定します。
"default"は任意のネットワーク(0.0.0.0)を指定したこととなりすべてのアクセスに該当します。

```conf:snmpd.conf
# com2sec NAME SOURCE COMMUNITY
com2sec local localhost private
com2sec mynetwork 192.168.0.0/24 internal
com2sec mynetwork 172.16.0.0/255.255.0.0 internal
com2sec public default public
```

* group

グループの定義を行います。

「NAME」には、グループ名を指定します。
「MODEL」には、「v1」、「v2c」または「usm」のいずれかを指定します。
それぞれ、snmpバージョン1、snmpバージョン2、snmpバージョン3に対応します。
「SECURITY」には、com2secで定義したセキュリティ名を指定します。

```conf:snmpd.conf
#group NAME MODEL SECURITY
group local_group v1 local
group local_group v2c local
group local_group usm local
group mynetwork_group v1 mynetwork
group mynetwork_group v2c mynetwork
group mynetwork_group usm mynetwork
group public_group v1 public
group public_group v2c public
group public_group usm public
```

* view

SNMPで取得可能な情報の範囲を定義します。

「NAME」には、ビュー名を指定します。
「TYPE」には、「included」または「excluded」のいずれかの指定します。
「SUBTREE」には、MIBのオブジェクトIDを指定します。
「MASK」は、16進数で指定します。指定がない場合は"ff"を指定したこととなります。

```conf:snmpd.conf
# view NAME TYPE SUBTREE [MASK]
view   view_all  included  .1
view   view_mib2  included  .1.3.6.1.2.1
view   view_ucdavis  included  .1.3.6.1.4.1.2021
```

* access

アクセス許可の設定を行います。

「NAME」には、groupで定義したグループ名を指定します。
「MODEL」には、「any」、「v1」、「v2c」または「usm」のいずれかを指定します。
「CONTEXT」は v1または、v2cのアクセスの場合は空文字列を指定します。
「LEVEL」には、「noauth」、「auth」または、「priv」のいずれかを指定します。v1または、v2cのアクセスの場合はnoauthを指定します。
「PREFX」には、「exact」または、「prefix」のいずれかを指定します。
「READ」「WRITE」「NOTIFY」には、viewで定義したビュー名を指定します。

```conf:snmpd.conf
# access NAME CONTEXT MODEL LEVEL PREFX READ WRITE NOTIFY
access local_group "" any noauth exact view_all
none none
access mynetwork_group "" any noauth exact view_mib2
none none
```

### システム情報

* syslocation

システムの場所を設定します。

```conf:snmpd.conf
#syslocation STRING
syslocation Datacenter1, Row 10, Rack 1
```

* syscontact

システムの連絡先を設定します。

```conf:snmpd.conf
#syscontact STRING
syscontact Root <root@example.com>
```

* sysname

システムの名前を設定します。指定がない場合は、ホスト名が設定されます。

```conf:snmpd.conf
#sysname STRING
sysname srv.example.com
```

## 参考

[Man page of SNMPD.CONF]
(http://linuxjm.sourceforge.jp/html/ucd-snmp/man5/snmpd.conf.5.html)

[エンタープライズ： - 第6回：SNMPによるネットワークモニタリング](http://www.itmedia.co.jp/help/howto/linux/0007master/06/05.html)

[第3回　SNMPによるモニタリングセキュリティの実態 (2/5)](http://www.itmedia.co.jp/enterprise/articles/0705/16/news011_2.html)

[障害の兆候を見逃さないためのサーバ監視 (3/3)](http://www.atmarkit.co.jp/ait/articles/0303/15/news004_3.html)

[Net-SNMP viewの設定](http://fdbklp.blogspot.jp/2011/06/net-snmpview-oid-mask.html)
スクショを送られてきた時にデバッグを楽にするライブラリを作った

バグってんだけど…これちょっとおかしい…デザインくずれてんだけど…
といわれてスクショだけ送られてきたことが一度はあるかと思います。
(まぁどういう状況なのか見た目から推測できるので無いよりもマシだけども...)

さて、スクショだけを送られてきてバグってるといわれた時に何が困るでしょうか。

それは<b>情報が足りずにデバッグを始める前に情報集めをしないといけない</b>ことです。
当然ユーザーのための画面にエンジニアが必要な情報が出ていることはまずないでしょう。

個人的にはこの情報を集めるのがクソめんどくさい！！！！！１

送ってきたユーザーはだれ？
デザインが崩れているデータはどれ？
自社で API も開発してる場合は原因はサーバーサイド？それともクライアントサイド？

スクショを撮った時に表示されてる UIViewController からなら上記のような疑問を解決するのは容易なのに…と思いながら、それらを特定するための情報を集めるところからはじまります。

リクエスト先の API が自社の場合だと Access Tokenと Request Parameter が分かれば、
実際にリクエストを送り原因がサーバーサイドなのかクライアントサイドなのかを特定することができて便利ですね。
(Access Token を出力する場合はセキュリティ上、注意が必要なので自己責任でやってください)

また UIWebView を使用している Application だと特定の WebStorage や Cookie が見れたらデバッグが捗るかもしれません。

デバッグに必要な情報は画面(<b>UIViewController</b>)毎に異なります。

前置きが長くなりましたが、デバッグに必要な情報を揃えてるプロセスがそもそも無駄だなと常々思っていました。

それを解決する方法を思いついたのでライブラリにして公開しました。

<a href="https://github.com/dealforest/DFTDebugScreenshot" target="_blank">dealforest/DFTDebugScreenshot</a>

方法はシンプルでデバッグ情報がほしい UIViewController に <code>- (id)dft_debugObjectForDebugScreenshot
</code> を定義し、デバッグに必要なオブジェクトを返すようにしておけばスクショを撮った際に、そのオブジェクトの description した結果が画像として出力されます。

<img src="https://raw.githubusercontent.com/dealforest/DFTDebugScreenshot/master/images/demo.gif" alt="demo" />

CocoaPods にも公開しているのですぐに使えます。

長くなってきたので、ライブラリの詳細については別エントリーにしようと思います。

<a href="https://atnd.org/events/55682" target="_blank">yidev 第16回勉強会</a> で発表する予定なので、この辺りのことをまとめて話せればと思ってます。
もし他で話す機会があれば話そうかなと思います。

ではでは。

<b>おまけ</b>

Homebrew や PromiseKit で有名な Max Howell(<a href="https://twitter.com/mxcl" target="_blank">@mxcl</a>) 氏に公開してすぐにスターをつけてくれたのでやる気に満ち溢れています。

<b>追記</b>
コピペ対策に [0.0.4](
https://github.com/dealforest/DFTDebugScreenshot/releases/tag/0.0.4) からデバッグ用の画像の EXIF(userComment) にテキストで保存されるようになりました。
Reveal.js 関連記事まとめ

# Reveal.js 関連記事まとめ

更新日: 2014/09/11 21:46:39

|No.|タイトル|作成日|ストック数|
|--:|:--|:--:|--:|
|1|[Reveal.js  Fragment の動作設定](http://qiita.com/tbpgr/items/765477dfc5eb1debb8fc)|2014/09/03 00:27:51|0|
|2|[Reveal.js  Yeoman + Reveal.js 構成について](http://qiita.com/tbpgr/items/73917244f6d4ce23d100)|2014/09/03 23:44:51|3|
|3|[Reveal.js  コードのシンタックスハイライト](http://qiita.com/tbpgr/items/216406fced22009ba618)|2014/09/03 00:30:41|1|
|4|[Reveal.js  スライドのページの属性設定](http://qiita.com/tbpgr/items/12275cd50d52b08cdef3)|2014/09/03 00:26:08|0|
|5|[Reveal.js  テーマ](http://qiita.com/tbpgr/items/1782561aaa734e5edf8d)|2014/09/03 00:31:35|0|
|6|[Reveal.js  デフォルトのキー操作](http://qiita.com/tbpgr/items/d345e35e6ea700f0e0a9)|2014/09/03 00:30:07|0|
|7|[Reveal.js  初期設定](http://qiita.com/tbpgr/items/fe0a1a7ca91cbb59eb99)|2014/09/03 00:27:14|0|
|8|[Reveal.js  水平スライドと垂直スライドの追加](http://qiita.com/tbpgr/items/7d570a6a0963c38c7a6c)|2014/09/03 00:24:00|0|
|9|[Reveal.js  要素への属性設定](http://qiita.com/tbpgr/items/37009899a4b6dd2cc85c)|2014/09/03 00:25:15|0|
|10|[Reveal.js を利用した内部公開スライドサーバーでスライドの自動デプロイを行う](http://qiita.com/tbpgr/items/107d75bc8a4732d9c294)|2014/09/10 22:22:07|2|
|11|[Reveal.js を利用した内部公開スライドサーバー構成について](http://qiita.com/tbpgr/items/f9a0c3a04044918b2ace)|2014/09/10 01:28:28|7|
|12|[スライドショーサーバー メニュー作成スクリプト + Hubot 連携](http://qiita.com/tbpgr/items/71cfe7715f97ee9042d8)|2014/09/11 21:44:38|0|
Reveal.js | テーマ

# Reveal.js | テーマ

## 概要
Reveal.js における、テーマの設定について

index.html の

~~~html
<link rel="stylesheet" href="css/theme/default.css" id="theme">
~~~

を書き換えることでテーマを設定可能。

## テーマ設定サンプル

### beige.css
http://tbpgr.github.io/revealjs_samples/sample_theme_beige.html

### night.css
http://tbpgr.github.io/revealjs_samples/sample_theme_night.html

### serif.css
http://tbpgr.github.io/revealjs_samples/sample_theme_serif.html

### simple.css
http://tbpgr.github.io/revealjs_samples/sample_theme_simple.html

### sky.css
http://tbpgr.github.io/revealjs_samples/sample_theme_sky.html

### solarized.css
http://tbpgr.github.io/revealjs_samples/sample_theme_solarized.html

## 参照
https://github.com/hakimel/reveal.js/
Reveal.js | コードのシンタックスハイライト

# Reveal.js | コードのシンタックスハイライト

## 概要
Reveal.js における、コードのシンタックスハイライトの設定

## サンプルコード

~~~html
		<div class="reveal">
			<div class="slides">
				<section data-markdown>
					<script type="text/template">
						## Syntax Highlight

						### Ruby
						~~~ruby
						class Hoge
						  def hoge(msg)
						    "hoge-#{msg}"
						  end
						end
						~~~

						### Java
						~~~java
						public class Java {
						  public static void main(String[] args) {
						    System.out.println("hoge");
						  }
						}
						~~~

						### Brainf*ck
						~~~bf
						+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.
						------------.<++++++++.--------.+++.------.--------.>+.
						~~~
					</script>
				</section>
			</div>
		</div>
~~~

## 動作確認
http://tbpgr.github.io/revealjs_samples/sample_syntax_highlight.html

## 参照
https://github.com/hakimel/reveal.js/
Reveal.js | デフォルトのキー操作

# Reveal.js | デフォルトのキー操作

## 概要
Reveal.js における、デフォルトのキー操作について

## 一覧

|キー|操作|
|:--|:--|
|右キー|次のスライドへ水平移動|
|l|同じ（ vi と同じ）|
|左キー|前のスライドへ水平移動|
|h|同じ（ vi と同じ）|
|下キー|下のスライドへ垂直移動|
|j|同じ（ vi と同じ）|
|上キー|上のスライドへ垂直移動|
|k|同じ（ vi と同じ）|
|space|次のスライドへ垂直＝＞水平の順に移動|
|n|space と同じ（ next ）|
|shift + space|前のスライドへ垂直＝＞水平の順に移動|
|p|shift + space と同じ（ previous ）|
|Home|最初のスライドへ|
|End|最後のスライドへ|
|.|ブラックアウト・ブラックイン|
|/|. と同じ|
|b|. と同じ(black)|
|Esc|概要表示|
|o|Escと同じ|
|f|全画面表示（fullscreen）。Escで戻す|

## 確認
好きなスライドショーでショートカットを試してみてください
http://tbpgr.github.io/revealjs_samples/#/

## 参照
https://github.com/hakimel/reveal.js/
第三章 IDリクワイアド


第三章 IDリクワイアド

「なんでもかんでも "id" 追加したらいいと思うなよ！」



## いんとろだくしょん
動画に紐づくタグが存在する、動画とタグの組み合わせは重複をはじきたい

### 解決策1 行の重複をはじくには主キーを設定すれば良いんだよ(ﾄﾞﾔｧ

``` 主キー(id)をつけてみた
CREATE TABLE MovieTags (
  id
  movie_id
  tag_id
  FOREIGN KEY (movie_id) REFERENCES Movies (id),
  FOREIGN KEY (tag_id) REFERENCES Tags (id)
);
```

#### 該当テーブルを SELECT してみる

```
SELECT * FROM MovieTags WHERE movie_id = 1;
```
#### 結果

| id | movie_id | tag_id |
|:-:|:-:|:-:|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 2 | 

ID の値が異なるにも関わらず、同じ関連づけを持ったレコードが２件入ってしまった。

#### 解決策2
``` UNIQUE制約をつけてみた
CREATE TABLE MovieTags (
  id        INT PRIMARY KEY,
  movie_id  INT UNSIGNED NOT NULL,
  tag_id    INT UNSIGNED NOT NULL,
  UNIQUE KEY(movie_id, tag_id),
  FOREIGN KEY (movie_id) REFERENCES Movies (id),
  FOREIGN KEY (tag_id) REFERENCES Tags (id)
);
```

movie_id と tag_id の組み合わせの重複を防げた！
UNIQUE KEY で重複を防ぐなら、そもそもなんで id が必要なんだろう？

## 目的
すべてのテーブルが主キー(primary key)を持つ事


### 主キー(primary key)は大切
- テーブルの全ての行が一意であることを保証する
- 外部キーから参照されることで、テーブルの関連付けを行う。

### どの列を主キーにするかが難しい
一意であると保証できるパラメータは難しい

- 名前、名字 => 重複あり得る
- メールアドレス => 複数人でシェアしてたら？

疑似キー(idなど) : 対象領域をモデル化したテーブルに意味を持たない人工的な値を格のして主キーとする

## アンチパターン: すべてのテーブルに「id」列を用いる
書籍やフレームワークの影響ですべてのテーブルには id がなくてはならないという考え普及している。


この考えは誤解である! すべてのテーブルに id 列を加えると意図に反した影響を生じる事がある

### 冗長なキーが作成されてしまう
同じテーブルにある別の列が「自然な」主キー (自然キー) として使え、かつ UNIQUE 制約が付与できる場合

```
CREATE TABLE Movies (
  id        INT PRIMARY KEY,
  movie_id  INT UNSIGNED NOT NULL,
  (略)
  UNIQUE KEY(movie_id),
);
```

### 重複行を許可してしまう
いんとろだくしょんの例 参照
id 以外の２列に UNIQUE制約が必要であると id 列はただの無駄な列になる。
UNIQUE 制約をつけると同時に UNIQUE INDEX も貼られるので、INDEX も一つ無駄になる。

主キーが複合キー場合、疑似キーを用いた場合では、クラスタ化インデックスの構成が変わるがパフォーマンスはほぼ変わらないようです。
http://d.hatena.ne.jp/yutakikuchi/20120129/1327810052


### キーの意味がわかりにくくなる
そのまま、JOIN した際などに どの id か分からなくなってしまう。

```
SELECT
  b.id, a.id
FROM
  Bugs b
INNER JOIN
  Accounts a
ON
  b.assigned_to = Accounts.id;
```
id ってなんなんだー
bug_id, account_id ならすぐにわかる。

### 複合キーは使いにくい
扱いにくい理由、複合キーからID列に主キーを移動させるべきでない理由が文章からはよくわからず。。。


## アンチパターンの見つけ方
- テーブルの主キーの列名「id」である
- 主キーは不要！ 疑似キーと主キーを勘違いしている
- 多対多の関連が重複してしまう


## アンチパターンを用いてもよい場合
開発をシンプルにするため設定より規約の原則に従っているフレームワークがある。
ex) rails の Model は id が存在することで利用できる機能が多い


自然キーがながすぎる場合
ex) メールアドレスを主キーにしてインデックスをつけるのは非効率


## 解決策： 状況に応じて適切に調節する
### わかりやすい列名にしよう
### 規約に縛られない
用いても良い例にでていますが、多くのフレームワークは id の規約を上書きして別の名前を宣言することができる。

``` Model_Class
self.primary_kdy = 'movie_id'
```

### 自然キーと複合キーの活用
下記条件のキーが有るなら、主キーにする

- 一意である事が保証できる
- NULL を許容しない
- 行の識別に使える

※ ただし長過ぎるなど扱いにくい列が上記条件を満たす場合は疑似キーを用いた方が良い。
連番じゃないと index 効率悪いしね。。。

下記条件であれば複号キーを用いる

- 交差テーブル
- 行を識別するための最適な方法が複数の属性の組み合わせである
Reveal.js | Fragment の動作設定

# Reveal.js | Fragment の動作設定

## 概要
Reveal.js における、Fragment の動作設定

## サンプルコード

~~~html
		<div class="reveal">
			<!-- Any section element inside of this container is displayed as a slide -->
			<div class="slides">
				<section>
					<p class="fragment grow">grow 大きくする</p>
					<p class="fragment shrink">shrink 小さくする</p>
					<p class="fragment roll-in">roll-in 回転しながら表示</p>
					<p class="fragment fade-out">fade-out フェードアウト</p>
					<p class="fragment current-visible">visible only once 一度だけ表示</p>
					<p class="fragment highlight-current-blue">blue only once 一度だけ青くする</p>
					<p class="fragment highlight-red">highlight-red 赤くハイライト</p>
					<p class="fragment highlight-green">highlight-green 緑にハイライト</p>
					<p class="fragment highlight-blue">highlight-blue 青にハイライト</p>
					<p class="fragment fade-in">
						<span class="fragment fade-out">フェードイン・フェードアウト</span>
					</p>
				</section>
			</div>
		</div>
~~~

## 動作確認
http://tbpgr.github.io/revealjs_samples/sample_fragment.html

## 参照
https://github.com/hakimel/reveal.js/
Reveal.js | 初期設定

# Reveal.js | 初期設定

## 概要
Reveal.js における、各種属性の初期設定について。

Reveal.jsのhtmlの最下部の、

~~~javascript
Reveal.initialize({
// 略
})
~~~

に設定を行うことでスライド全体に対する初期設定をします。

## サンプルコード

デフォルトの設定を色々と変更してみます。

~~~javascript
Reveal.initialize({
	controls: false,                 // 右下のコントロールを非表示
	progress: false,                 // 下部の進捗バーを非表示
	slideNumber: true,               // 右下にスライドのページ番号を表示
	history: true,                   // 各ページをブラウザの履歴に残す
	overview: false,                 // Escで表示できる「概要」ページを表示不可にする
	center: false,                   // スライドの垂直方向中央表示をしない（上寄せになる）
	touch: false,                    // タッチ操作を無効化
	loop: true,                      // スライドをループさせる
	rtl: true,                       // 右から左へのスライド
	fragments: false,                // fragmentsを無効化する
	autoSlide: 1000,                 // 自動スライドをミリ秒単位で設定。デフォルトは0（自動スライドしない）
	autoSlideStoppable: false ,      // 左下の自動スライド停止用のボタンを非表示にする
	mouseWheel: true,                // マウスのホイールによるスライドを可能にする
	transition: 'cube',              // キューブ状の transition でスライドを動作させる
	                                 // 設定値 default/cube/page/concave/zoom/linear/fade/none
	transitionSpeed: 'slow',         // スライド速度を遅く設定。 設定値 default/fast/slow
	// 視差背景の画像URL設定
	parallaxBackgroundImage: 'https://s3.amazonaws.com/hakim-static/reveal-js/reveal-parallax-1.jpg',
	// 視差背景のサイズを設定
	parallaxBackgroundSize: '2100px 1024x',

});
~~~

## 動作確認
http://tbpgr.github.io/revealjs_samples/sample_configration.html

## 参照
https://github.com/hakimel/reveal.js/
Reveal.js | スライドのページの属性設定

# Reveal.js | スライドのページの属性設定

## 概要
Reveal.js における、スライドのページの属性設定

スライドのページ内に HTML のコメント内に設定を行うことで
ページに対する属性を設定できます。

## サンプルコード

fragment 属性を利用します。

~~~html
		<div class="reveal">
			<div class="slides">
				<section data-markdown>
					<script type="text/template">
					<!-- .slide: data-background="black" -->
						背景に黒を設定
					</script>
				</section>
			</div>
		</div>
~~~

## 動作確認
http://tbpgr.github.io/revealjs_samples/sample_slide_attributes.html

## 参照
https://github.com/hakimel/reveal.js/
Reveal.js | 要素への属性設定

# Reveal.js | 要素への属性設定

## 概要
Reveal.js における、要素への属性設定

スライドのページ内に配置した各要素に HTML のコメント内に設定を行うことで
属性を設定できます。

## サンプルコード

fragment 属性を利用します。

~~~html
		<div class="reveal">
			<div class="slides">
				<section data-markdown>
					<script type="text/template">
						## Use Fragment
						- Fragment 1 <!-- .element: class="fragment" data-fragment-index="2" -->
						- Fragment 2 <!-- .element: class="fragment" data-fragment-index="1" -->
					</script>
				</section>
			</div>
		</div>
~~~

## 動作確認
http://tbpgr.github.io/revealjs_samples/sample_element_attributes.html

## 参照
https://github.com/hakimel/reveal.js/
Reveal.js | 水平スライドと垂直スライドの追加

# Reveal.js | 水平スライドと垂直スライドの追加

## 概要
Reveal.js における、水平スライドと垂直スライドの追加

* 水平スライドは section タグによって追加する
* 垂直スライドは section タグ内に入れ子で section タグを記述することによって追加する

## サンプルコード

~~~html
		<div class="reveal">

			<!-- Any section element inside of this container is displayed as a slide -->
			<div class="slides">
				<section>Single Horizontal Slide</section>
				<section>
					<section>Vertical Slide 1</section>
					<section>Vertical Slide 2</section>
				</section>
				<section data-markdown>
					<script type="text/template">
						## Single Horizontal Slide(Markdown)
					</script>
				</section>
				<section>
					<section data-markdown>
						<script type="text/template">
							## Vertical Slide 1(Markdown)
						</script>
					</section>
					<section data-markdown>
						<script type="text/template">
							## Vertical Slide 2(Markdown)
						</script>
					</section>
				</section>
			</div>

		</div>
~~~

## 動作確認
http://tbpgr.github.io/revealjs_samples/sample_pages.html

## 参照
https://github.com/hakimel/reveal.js/
bashでOSを判別する

* シェルスクリプト実行時にMacOSX,Linux,Cygwinのいずれかを判別する

```bash
if [ "$(uname)" == 'Darwin' ]; then
  OS='Mac'
elif [ "$(expr substr $(uname -s) 1 5)" == 'Linux' ]; then
  OS='Linux'
elif [ "$(expr substr $(uname -s) 1 10)" == 'MINGW32_NT' ]; then                                                                                           
  OS='Cygwin'
else
  echo "Your platform ($(uname -a)) is not supported."
  exit 1
fi
```


```shell-session
echo $(uname)
```
## 情報源

* /usr/local/bin/atom
* Macにインストールしたatomエディタの起動スクリプトを読んでいて気がつきました。

## 以上

* 自分メモ
Vagrant(Virtualbox) 上で CoreOS を動かす


## 必要なもの

* VirtualBox 4.3.10 以上
* Vagrant 1.6.3

## セットアップ

```bash
$ git clone https://github.com/coreos/coreos-vagrant.git && cd coreos-vagrant
$ vagrant up
```

ログイン

```bash
$ vagrant ssh core-01
```

## クラスタを作成

```bash
$ cp user-data.sample user-data
```

https://discovery.etcd.io/new を curl して etcd の discovery token を取得して `discovery` の値にセット

```diff
@@ -4,7 +4,7 @@ coreos:
   etcd:
     # generate a new token for each unique cluster from https://discovery.etcd.io/new
     # WARNING: replace each time you 'vagrant destroy'
-    #discovery: https://discovery.etcd.io/<token>
+    discovery: https://discovery.etcd.io/xxxxxxxxxxxxxx
     addr: $public_ipv4:4001
     peer-addr: $public_ipv4:7001
   fleet:
```

```bash
$ cp config.rb.sample config.rb
```

```diff
@@ -27,7 +27,7 @@
 # after the equals sign..

 # Size of the CoreOS cluster created by Vagrant
-#$num_instances=1
+$num_instances=3
```

これで `vagrant up` すると 3 台の CoreOS マシンからなるクラスタが起動する。

```bash
$ vagrant up
# 既に起動している場合は `vagrant reload --provision` 
$ vagrant ssh core-01
```

3 台のクラスタが出来ている事が確認できる

```bash
core@core-01 ~ $ fleetctl list-machines
MACHINE		IP		METADATA
34db3563...	172.17.8.103	-
4755ce5a...	172.17.8.102	-
a7d9e8b9...	172.17.8.101	-
```

## REF

* [Running CoreOS on Vagrant](https://coreos.com/docs/running-coreos/platforms/vagrant/)
タグ欄に SML# と書くと編集不能になる怪現象w

タグ欄に　SML# と書くと編集不能になります。投稿時にエラーが出ます。

 ml# #ml abc# aml# # 等なら大丈夫なので、sml# だけをピンポイントで狙っていますｗ


![無題.png](https://qiita-image-store.s3.amazonaws.com/0/44522/2c90cae8-2e2b-b90e-79f5-814de1c3a0a9.png)
railsアプリで数字と文字を同時に検索する方法

###利用例
idか名前に「3」を含む利用者を検索したい場合

###実現方法
ransackを利用した場合を記述します

````none:Gemfile
  gem 'ransack'
````

````app/views/users/index.html.erb
<%= search_form_for @q, url: users_path do |f| %>
  <%= f.text_field :search_word %>
  <%= f.submit 'Search' %>
<% end %>
````

````app/controllers/users_controller.rb
def index
  params[:search_word]
  @q = User.ransack({ id_or_name_cont: params[:search_word] })
  @users = @q.result(distinct: true)
end
````

````app/models/user.rb
private
ransacker :id do
  Arel::Nodes::SqlLiteral.new("CONVERT(#{table_name}.id, CHAR(8))")
end
````

###注意点
ransackerはmodelに記述します。
このようransackerを記述することで、文字列に変換されたidが検索に使われます。


以上です。
誰かのお役に立てれば幸いです。
間違いなどがありましたら指摘していただけると嬉しいです。

###参考
https://github.com/activerecord-hackery/ransack/issues/85
https://github.com/activerecord-hackery/ransack
GenymotionをAndroid Studioで使う

趣味でandroidアプリを開発しようと思いAndroid Studioという開発環境を以前インストールしました。
ただエミュㇾータの起動が遅すぎてこれではやる気がなくなると思いググったところ、最近はGenymotoinというものが速くてよさそうだと思ったのでさっそくインストールしてみました。
以下、環境構築のメモ

## 導入した環境
--------------------
Fedora 20
x86_64

# VirtualBoxをインストール

```sh:
yum install VirtualBox-4.3
```

# Genymotionをインストール
下記サイトから必要なバイナリをダウンロードする。
[genymotion][1]

# Android Studioにプラグインをインストール
-Genymotion Plugin 入れる。

# Genymotionを起動する
- ./genymotionとする。(ここでいろいろlibaudio.so.2がみつからないとう感じのエラーになった)

## VirtualBoxの設定 
1. VT-x/AMD-Vがサポートされてないという感じのエラーになったのでそこの設定を見直した。
1. ネットワークの設定でエラーにな場合がある。

# Android StudioでGenymotionを使う
- Genymotion でdevice を起動しておく。


# 参考サイト
[Genymotion で Android の超爆速エミュレータ環境を構築する][2]
[Genymotion + Android Studio で Android 爆速開発メモ][3]

[1]:http://dev.classmethod.jp/smartphone/android/genymotion-install/
[2]:http://dev.classmethod.jp/smartphone/android/genymotion-install/
[3]:http://qiita.com/tatsuoSakurai/items/b080a57c6148012bc8d0
[Git] リモート上のタグが指しているコミットIDを表示する

リモート上のタグの指しているコミットIDは、`git ls-remote` コマンドで確認できます。

```
git ls-remote --tags origin mytag^{}
```

originというリモートリポジトリにmytagというタグがプッシュされている前提です。
タグの末尾に ^{} を付ける必要があるので注意。

実行結果は以下のとおり。

```
$ git ls-remote --tags origin mytag^{}
$ <コミットのハッシュ>                       refs/tags/mytag^{}
```
composer updateでエラー

$ composer update をしようとしたところ下記エラーが発生.

```bash
Fatal error: include(): Cannot redeclare class composer\command\licensescommand in phar:///usr/local/bin/composer/vendor/composer/ClassLoader.php on line 269
```

Stack OverFlowより.
https://github.com/composer/composer/issues/264
CLIバージョンのPHPでAPCを有効にする、apc.enable_cliがOnになっていると起こる現象らしい.

apcの設定を確認

```bash
$ php -i | grep apc.enable
apc.enable_cli => On => On
```

apcの設定ファイルを変更

```bash
$ vim /etc/php.d/apc.ini
apc.enabled=0
```

apache再起動

```bash
$ httpd -k graceful
```

無事composer updateできた.
ionic frameworkで作ったアプリをherokuで公開する

簡単に出来ないものかと調べたら、かなり簡単に出来た。
社内デモなどに使える便利な配布方法かもしれない。

大変参考になったのは以下。
http://forum.ionicframework.com/t/has-anyone-deployed-an-ionic-app-to-heroku/8284/5

nodeのexpress frameworkを使用する。

`/package.json`に`express`を加える。

```
{
  "name": "ionicSampleApp",
  "version": "1.0.0",
  "description": "App: An Ionic project",
  "dependencies": {
    "gulp": "^3.5.6",
    "gulp-sass": "^0.7.1",
    "gulp-concat": "^2.2.0",
    "gulp-minify-css": "^0.3.0",
    "gulp-rename": "^1.2.0",
    "express": "4.8.4"
  },
  "devDependencies": {
    "bower": "^1.3.3",
    "gulp-util": "^2.2.14",
    "shelljs": "^0.3.0"
  }
}
```

npmでexpressをインストール

```
npm install
```

ルートに`web.js`とか適当な名前でサーバー立ち上げるためのコードをおく。

```
var express = require('express');
var app = express();
 
app.use(express.static(__dirname + "/www"));
app.listen(process.env.PORT || 5000);
```

上記を使用してwebサーバー起動するよう記載した`Procfile`をアプリケーションルートにおく。

```
web: node web.js
```

これで`forman start`でサーバーが立ち上がるようになる。

あとはherokuにpushすればいい。

```
heroku create
git add .
git commit -m "Initial commit."
git push heroku master
heroku open
```

以上。
Graphvizの中でSVGシェイプを使うとエラーになる件の対処(解決)

## 動機

Ubuntu 14.04.1 LTSにおいてGraphvizで生成するPDFの中でSVGを扱いたい。

[Pandoc+beamer+GraphvizでAWSの図を描く](http://qiita.com/ooharak/items/78f79fe8a57668550a82)を実施した際に悩んだ点。

SVGをシェイプとして使おうとすると、OS X Lionではうまくいっていたものが、Ubuntuでは普通に`apt-get`でインストールしたバージョンだと以下のエラーになる。
これを回避したい。

~~~sh
$ cat k.dot
digraph {
 a [image="elb.svg"]
 }
$ dot -Tpdf k.dot > /dev/null
Warning: No loadimage plugin for "svg:cairo"
~~~

## エラーの原因

Graphvizが扱えるファイル形式は`dot -P | dot -Tpdf -o list.pdf`で得られる.
この結果と、うまくいっている環境(OSX Lion)との比較から、Ubuntu向けのGraphvizのパッケージでは、 rsvgというライブラリと連携動作するようなコンパイルオプションが指定されていないために、SVG→PDF変換の経路がなく、失敗しているとわかる。

## 対策

Ubuntuではppaという仕組みによって有志ビルドのようなものが管理されているそうだが（今回初めて知った）、2014.9.2時点ではGraphvizのrsvgオプションを有効にしたppaは存在しないようだ。

そこでパッケージのソースを取得してビルドすることにした。
その方法は [Ubuntu 14.04 で vim パッケージをリビルドする](http://t2y.hatenablog.jp/entry/2014/04/26/191252)を参考にさせていただいた。

以下、各自のUbuntu環境の状態によって違いはあると思う。

オプションを有効にするのに伴い、当該ライブラリへの依存が生じるので、ライブラリはインストールしておく必要がある。


なお、もしここで行った変更を再配布するのであれば、依存関係をパッケージ構成記述としてどこかに追記する必要があるのだと思われるが、ここでは完全に私家版ビルドなので、その点は考慮していない。

~~~sh
$ sudo apt-get librsvg2-dev
$ sudo apt-get build-dep graphviz
$ sudo apt-get install dpkg-dev
$ apt-get source graphviz
$ sudo apt-get install devscripts
$ cd graphviz-2.36.0
~~~

`rsvg`を有効にする`configure`フラグを有効にし、プラグインをインストールするように、書き換えを行う。ついでにGDKプラグインも有効にする(これはあまり意味はない)。

書き換えた結果を以下に示す。

~~~sh
$ diff debian/rules{.org,}
73c73
< 	--without-rsvg \
---
> 	--with-rsvg \
$ diff debian/libgvc6.install{.org,}
7a8,9
> usr/lib/graphviz/libgvplugin_rsvg.so.*
> usr/lib/graphviz/libgvplugin_gdk.so.*
~~~

書き換えたらビルドを行う。
最後のsudoについては自己責任なので注意されたい。

~~~sh
$ debchange -i
# CHANGELOGを入力すること
$ debuild -us -uc
$ cd ..
$ sudo dpkg -i *.deb
~~~

これで`dot -Tpdf k.dot > /dev/null`してもエラーにならない環境になった。
gulp-sassで.sassファイルを使うときの注意点（更新あり）


- Ruby SassはBootstrapとかコンパイルすると遅すぎて辛い
- Lessは速いけどインデントで書きたい(curly braceを書きたくない)
- StylusはBootstrapが公式にサポートしてない(個人的に使ったことない)

`.sass`で書きたい。

### 環境
- gulp 3.8.10
- gulp-sass 1.3.2

**2015/1/30更新。**
`node-sass`のアップデートに伴って`gulp-sass`のバージョンも上がり、以前と対策方法が変わっています。以前の内容は更新履歴を見てください。


## 普通に`.sass`を渡すとコケる
```coffeescript:gulpfile.coffee
g = require 'gulp'
sass = require 'gulp-sass'
g.task 'default', ->
    g.src './style.sass'
    .pipe sass()
    .pipe g.dest './'
```
このままだとコンパイルできない。`.sass`という拡張子でも`.scss`として解釈される。インデントスタイルのシンタックスでコンパイルするには、

> If you want to use the indented syntax (`.sass`) as the top level file, use `sass({indentedSyntax: true})`.

<https://github.com/dlmanning/gulp-sass/blob/master/README.md>

とのことです。つまり

```coffeescript:gulpfile.coffee
g = require 'gulp'
sass = require 'gulp-sass'
g.task 'default', ->
    g.src './style.sass',
    .pipe sass
        indentedSyntax: true    
    .pipe g.dest './'
```

で`.sass`ファイルをコンパイルできます。

ただ、<https://github.com/dlmanning/gulp-sass/pull/181>がマージされれば拡張子をチェックして自動で`indentedSyntax`オプションを振ってくれるようになるので特別にオプションを設定することなく`.sass`ファイルもコンパイルできるようになると思います。
そうなればこの記事も不要になるので、確認次第こちらも更新いたします。


## Libsassはコンパイルが早くて素晴らしいけど……
LibsassはRubySassに対してコンパイルが速い点以外の優位性はないので、Rubyが死ぬほど嫌いでRubyをインストールしたくない人以外で、速度が気にならない人はgulp-ruby-sassを使うといいでしょう。あっちは`compass`も使えるしね。
emscriptenをアップデートする

# 入れっぱなしのEmscripten SDKをアップデートする

```bash
./emsdk update
./emsdk install latest
./emsdk activate latest
source ./emsdk_env.sh
```

# 古いものを消す

## リストを出す

```bash
./emsdk list --old
```


## 消す

どうやら、clang等個別にちまちま一つづつ指定する必要がある。

```bash
./emsdk uninstall clang-e1.16.0-64bit 
./emsdk uninstall emscripten-1.13.0
```

# まとめ

最近はHomebrewで入れてもいいのかもだが、
現在のPortable SDK以前から使っていることもあるので、
なんとなく、素の状態で入れてるままになっている。

# 関連記事

- [emscriptenでOpenGL](http://abrakatabura.hatenablog.com/entry/2013/07/20/081301)
- [Webrubyを試した #OSX](http://abrakatabura.hatenablog.com/entry/2013/07/27/074354)
- [Emscriptenでファイルを読み込む](http://abrakatabura.hatenablog.com/entry/2013/10/03/120831)
- [jsdo.itでEmscriptenを動かすときのメモ](http://abrakatabura.hatenablog.com/entry/2014/04/17/072514)
- [slコマンドのWebGL版を作ろうとしたら](http://abrakatabura.hatenablog.com/entry/2014/04/09/071724)
- [SLコマンドをEmscriptenでWeb化する 2014年秋編](http://abrakatabura.hatenablog.com/entry/2014/11/01/170855)
- [OpenCVをEmscriptenでJS化して動かせた](http://abrakatabura.hatenablog.com/entry/2015/08/22/095842)
- [libiconvをemscriptenでjs化し、node.jsで使った](http://abrakatabura.hatenablog.com/entry/2015/04/18/115323)
- [slコマンドをWebAssembly化して動かした](http://abrakatabura.hatenablog.com/entry/2016/03/28/071449)
- [公式のOpenCVでWASM版のOpenCV.jsがビルドできたのnode.jsで動かそうとした件](http://abrakatabura.hatenablog.com/entry/2017/11/29/063247)
fuelphp1.7.2をzipで入れた場合にcomposer使うとfuelが動かなくなる

fuelphp1.7.2のzipを解凍して設置すると正常に動作しますが、
この状態でcomposerを使うとfuelが動かなくなるので注意。

```
php composer.phar install
```

とかを実行すると以下のエラーになる

```
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Warning: The lock file is not up to date with the latest changes in composer.json. You may be getting outdated dependencies. Run update to update them.
Nothing to install or update
Generating autoload files

Fatal error: Class 'Monolog\Logger' not found in /path/to/fuel/core/classes/log.php on line 100

Fatal error: Class 'Monolog\Logger' not found in /path/to/fuel/core/classes/log.php on line 100
Script php oil r install handling the post-install-cmd event returned with an error
                      
  [RuntimeException]  
  Error Output:       
                      
```

この状態になるとブラウザから接続した際も以下のエラーが出て動かない

```
Fatal error: Class 'Monolog\Logger' not found in /path/to/fuel/core/classes/log.php on line 100
```

恐らく1.7.2からの変更点としてfuel/coreなどのリポジトリをcomposerからインストールできるようになった変更が影響しているのだと思います。今の問題は、zipに含まれる fuel/vendor　以下のパッケージがcomposerで管理されていないのが原因。

以下の作業ですべてcomposerで管理するようにすれば解決した

## fuel/vendor のディレクトリごと削除

fuel/vendorのディレクトリごと削除します。
少なくともfuel/vendor/composer は消さないと以下のエラーが出ます

```
[RuntimeException]                                                                                                                                    
  The .git directory is missing from /path/to/fuel/vendor/composer/installers, see http://getcomposer.org/commit-deps for more information   
```

## composer.json の内容を編集

zipのcomposer.jsonにはmonolog等をインストールする記述がなくなってるので、1.7.2でzipに含まれていたパッケージをインストールするようにcomposer.jsonを修正します

```json:composer.json
{
    "name": "fuel/fuel",
    "type": "project",
    "description" : "FuelPHP is a simple, flexible, community driven PHP 5.3+ framework, based on the best ideas of other frameworks, with a fresh start!",
    "keywords": ["application", "website", "development", "framework", "PHP"],
    "license": "MIT",
    "require": {
        "php": ">=5.3.3",
        "composer/installers": "~1.0",
        "monolog/monolog": "1.5.*",
        "fuelphp/upload": "2.0.*",
        "michelf/php-markdown": "1.4.*"
    },
    "suggest": {
        "dwoo/dwoo" : "Allow Dwoo templating with the Parser package",
        "mustache/mustache": "Allow Mustache templating with the Parser package",
        "smarty/smarty": "Allow Smarty templating with the Parser package",
        "twig/twig": "Allow Twig templating with the Parser package",
        "pyrocms/lex": "Allow Lex templating with the Parser package",
        "mthaml/mthaml": "Allow Haml templating with Twig supports with the Parser package"
    },
    "config": {
        "vendor-dir": "fuel/vendor"
    },
    "scripts": {
        "post-install-cmd": [
            "php oil r install"
        ]
    },
    "minimum-stability": "dev"
}
```

具体的には

```
        "monolog/monolog": "1.5.*",
        "fuelphp/upload": "2.0.*",
        "michelf/php-markdown": "1.4.*"
```

を追加してます

## Composerでパッケージインストール実行


```
php composer.phar self-update
php composer.phar update
```

これでブラウザから接続したら復旧してるはず。
Zurb Foundation 5が最近のsassで使えない問題への回避策

[2014/9/6追記]
対応がマージされました。 https://github.com/zurb/foundation/pull/5708

---

foundation-rails 5.4.3がsass-3.4.2で使えない問題への回避策。

# 結論
非常に筋が悪いが、回避策としては app/assets/stylesheets/foundation_and_overrides.scssにsass標準のindex関数の代わりを定義する。

```scss
@function index($list, $value) {
   $i: 1;
   @each $e in $list {
      @if ($e == $value) {
        @return $i; 
      }
      $i: $i + 1;
   }
   @return false;
}
```

早く直らないかな...
https://github.com/zurb/foundation/pull/5708

# 詳細
Zurb Foundation は、中でコンポーネントの重複出力を防ぐため、sass-import-onceという仕掛け（イディオム）を使っている。
["@include exports" what is it for?](http://foundation.zurb.com/forum/posts/2803-include-exports-what-is-it-for)

このsass-import-onceは、読み込んだモジュールの一覧を維持し、その一覧にあるかどうかで処理するかどうかを決めるという単純なもの。コードは以下の通り。

```scss
$modules: () !default;
@mixin exports($name) {
  @if (index($modules, $name) == false) {
    $modules: append($modules, $name);
    @content;
  }
}
```

https://github.com/zurb/foundation/blob/master/scss/foundation/_functions.scss

しかし、ここで利用しているindex関数が、項目が存在しない場合は昔はfalseを返していたが、nullを返すように変更されてしまっているため、上記のコードではif文が通らなくなり、各種コンポーネントのスタイルが出力されなくなってしまっている...
[Deprecate index()'s false return value](https://github.com/sass/sass/issues/1127)

上述の@if (index(...) == false) を @if (not index(...)) とすれば良いのだが、gem側を書き換えるといろいろ残念なので、
rails g foundation:installで作成され、こちらで管理しているfoundation_and_overrides.scssに過去と同一の挙動をする
index関数を用意した。

各種コードがきちんと@if (not ...で判定していれば問題ないはず...
Instagram APIから写真を全件取得する

自分の写真を取得するために使用するURLは下記の通り。

```
https://api.instagram.com/v1/users/self/media/recent/?access_token=アクセストークン

self部分をユーザIDにすることでも可能
```

このままだと、写真の取得件数は初期設定である20件しか取得できない。
パラメータとして、countをオプションでつけることも可能。

```
https://api.instagram.com/v1/users/self/media/recent/?access_token=アクセストークン&count=100
```

count=100と指定したが、実際に取得されるのは約30件前後の写真しか取得できない…

50件とか100件とか中途半端な件数を表示する方法がよくわからないが、
`count=-1`とすると、自分がアップロードしている全件分の写真を取得できる。
PostgreSQLのCOPYコマンドでヘッダ付きtsvファイルを読み込む

# 昔の俺

PostgreSQLで以下のように普通にCOPYコマンドを打つ場合、読み込むデータのヘッダは無視されない。

```sql
copy table_name from '/absolute_path/to/data.tsv';
```

そのため、ヘッダなしでデータを作ることになる。
しかし、ヘッダがないとパッと見て何の値か分かりにくい。カラム数が多いテーブルのテストデータを作っている時は特に。
なんとかヘッダ付きのtsvファイルを読み込ませたい。。

# 今の俺

いろいろ試した結果、以下のように書けばヘッダ付きのtsvを読み込むことが出来た。

```sql
copy table_name from '/absolute_path/to/data.tsv' delimiter '    ' csv header;
```

>[追記 2014/09/08]
>@s87 さんからコメントいただいた。上記は以前のバージョンでの書き方のようで、カッコを付けて記載すればマニュアル記載の構文で実行出来た。

```sql
copy table_name from '/absolute_path/to/data.tsv' ( delimiter '    ', format csv, header true );
```

`delimiter`の文字にはタブを入力する。（ターミナルで Ctrl+v を押してからタブ押下）
csvファイルヘッダ付きで区切りはタブ文字、的な指定になっている。

正直マニュアルに載っている書き方と全然違うと思うのだが、何故出来るのか。
https://www.postgresql.jp/document/9.3/html/sql-copy.html

まあ出来てくれてありがたいことには変わりないので気にしない。

>[追記 2014/09/08]
>@tsugai さんからコメントいただいた。上記ページ最下部にある「互換性」の書き方には沿っていたらしい。