OmniAICreator/Qiita-1.07M huggingface dataset:
MySQL コアダンプ出力設定

Ver 5.0 で出力されるか心配だったが、以下の手順でなんとか出力できた。

# 前提条件
/etc/init.d/mysqld を使って root で起動している

# 設定手順 概要
1. my.cnf の設定
2. /etc/profile 編集
3. suid_dumpable 設定
4. mysqld 再起動

# 手順詳細

##1. my.cnf に以下を設定

```mysql
[mysqld] 
core-file
[mysqld_safe]
core-file-size = unlimited
```

##2. /etc/profile 編集

ulimit -c unlimited を常に有効にするために、/etc/profile にある以下の箇所を変更。

(30行目付近)

```bash

ulimit -S -c 0 > /dev/null 2>&1
```
　　　　　↓

```
ulimit -c unlimited > /dev/null 2>&1
```

##3. suid_dumpable 設定

/etc/init.d/ 配下のスクリプトを root で起動しているアプリでもコアダンプ出力を有効にする

#### とりあえずすぐに有効にする設定

```shell-session
# echo 1 > /proc/sys/fs/suid_dumpable
```

#### 恒久設定

```bash
# vi /etc/sysctl.conf
　　-----
　　（↓以下を最終行に追加）
　　fs.suid_dumpable=1
```

##4. mysqld 再起動

```shell-session
# /etc/init.d/mysql restart
```

##5.コアダンプの出力テスト
####1. mysqlプロセス確認  

```shell-session
# ps -ef | grep mysql | grep -v grep
root      9681  9611  0 17:00 pts/1    00:00:00 tailf /var/log/mysqld.log
root     11915     1  0 20:39 pts/0    00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/data/mysql/datafile --socket=/data/mysql/run/mysql.sock --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --user=mysql
mysql    11971 11915  3 20:39 pts/0    00:00:01 /usr/libexec/mysqld --basedir=/usr --datadir=/data/mysql/datafile --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --open-files-limit=8192 --port=3306 --socket=/data/mysql/run/mysql.sock
```
####2. SIGSEGV シグナルでmysqldを落とす (SIGSEGV：セグメンテーション違反）
```shell-session
# kill -11 11971
```

 (↓mysqld.err)

```shell-session
Number of processes running now: 0
140807 20:40:24  mysqld restarted
```

mysqld_safe を介して立ち上げているため、プロセスダウンを検知してすぐに再起動がかかる

```shell-session
# ps -ef | grep mysql | grep -v grep  
root      9681  9611  0 17:00 pts/1    00:00:00 tailf /var/log/mysqld.log  
root     11915     1  0 20:39 pts/0    00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/data/mysql/datafile --socket=/data/mysql/run/mysql.sock --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --user=mysql  
#-↓ プロセスIDが違う（再起動がかかったため）  
mysql    12030 11915 12 20:40 pts/0    00:00:00 /usr/libexec/mysqld --basedir=/usr --datadir=/data/mysql/datafile --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --open-files-limit=8192 --port=3306 --socket=/data/mysql/run/mysql.sock  
```

####3. コア出力確認  
datadir に core.\<pid\> で出力されている

```shell-session
# ls -l /data/mysql/datafile/core*
-rw------- 1 mysql mysql 6817431552  8月  7 20:40 /data/mysql/datafile/core.11971
```
【Sublime Text 3】プラグイン簡易まとめ

## Sublime Text 3 プラグインまとめ

#### <font color="green"><b>効率アップ- コード補完</b></font>
・All Autocomplete
デフォルトで自動補完機能がついてますが、その機能を強化してくれます。
マッチする文字列があればサジェストしてくれるんで入れといて損なし。

・jQuery
jQueryのコード補完を補強するパッケージ。

・HTML5
HTML5のコード補完を補強するパッケージ。

・SublimeCodeIntel
JavaScript, Mason, XBL, XUL, RHTML, SCSS, Python, HTML, Ruby, Python3, 
XML, XSLT, Django, HTML5, Perl, CSS, Twig, Less, Smarty, Node.js, Tcl, 
TemplateToolkit, PHP　
の強調表示、コードの自動補完を行ってくれます。
関数などはコンテキストメニューから「Jump to Symbol Definition」を選択することで
定義箇所に飛ぶこともできます。

・Emmet
少ないコード記述でHTMLやCSSをサクサク記入できるパッケージ。
使い方がわからなくても[チートシート](http://docs.emmet.io/cheat-sheet/)を見ながら使っているうちに．手放せなくなります。

#### <font color="green"><b>効率アップ- その他</b></font>
・Alignment
プログラミングで変数や連想配列を定義する際に「=」の位置をそろえるパッケージ。
同様のパッケージとしてAbacusもある。範囲選択して、「Ctrl+Alt+A」。
[参考動画](https://www.youtube.com/watch?v=_c6ft-miHr4)

・AlignTab
イコールやカンマやコロンのカラムを綺麗にそろえることのできるパッケージ。
右クリックメニューから「Align By」。

・AutoFileName
プロジェクトフォルダ内のファイル名などを補完してくれるパッケージ。
images/のようにサブフォルダを指定しても保管してくれ、
画像の場合は幅と高さまで表示＆保管してくれます。

・Smart Delete
行末で［delete］キーで削除した際に、次の行の先頭にあるインデントも同時に削除する。

・DataConverter
CSV形式のデータをさまざまな形に変換するパッケージ。
変換の対象は、JSONやYAMLといったデータ形式だけでなく、PHPやRubyといったプログラムの
連想配列や、SQL文、HTMLのtableタグなど幅広く変換が行える。

#### <font color="green"><b>他ツールジャンプ</b></font>
・Terminal
開いているファイルやサイドバーの右クリックから、
そのファイルやディレクトリの場所をターミナルで開くことができる。
右クリックメニューから「Open Terminal Here..」。

#### <font color="green"><b>ミスを減らす</b></font>
・ConvertToUTF8
文字エンコードをUTF8に変換し、セーブした時にまた戻してくれるプラグイン。
sublime textはshift-jis に対応してないので euc-jp とか sjis とかプロジェクトによって
文字コード違ったりする時にいちいち気にしないで良くなる。
※ファイル開いて文字コード変わった後に
　「このファイル修正しないでよかったやつだ。command＋zで戻る！」とかやって
　変換される前の状態でセーブすると文字化けしたまま保存されます。

・TrailingSpaces
末尾にスペースが入っている時にハイライトしてくれ、保存する時に削除してくれます。

・BracketHighlighter
カッコやクォート、タグの開始/終了をハイライトしてくれます。
強調表示されることで不具合を発見し易くなります。

## 引用元
[WordPress開発がサクサク捗るSublime Textおすすめパッケージ27個まとめ](http://nelog.jp/sublime-text-packages)
[特におすすめしたい、Sublime Textのパッケージ - Build Insider](http://www.buildinsider.net/small/sublimetext/03)
[Sublime Textの作業効率を飛躍的に上げるプラグイン31個 - aucfan Engineers' blog](https://tech.aucfan.com/sublime-text-plugins/)
[SublimeText3を2年以上使って、生き残ったPluginを紹介します](http://qiita.com/MakoTano/items/8853caa206283df5e1f9)
helm-buffers-listとhelm-migemo(2)

helmのバッファマッチング関数がいつのまにか変わっていたようです。

```el
(defun helm-compile-source--migemo (source)
  (if (not (featurep 'migemo))
      source
    (let* ((match-identity-p 
            (or (assoc 'candidates-in-buffer source)
                (equal '(identity) (assoc-default 'match source))))
           
           (matcher 'helm-mp-3migemo-match)
           (searcher (if (assoc 'search-from-end source)
                         
                           'helm-mp-3migemo-search-backward
                         'helm-mp-3migemo-search)))
      (cond (helm-use-migemo
             `((delayed)
               (search ,@(assoc-default 'search source) ,searcher)
               ,(if match-identity-p
                    '(match identity)
                  `(match ,matcher
                          ,@(if (eq (cdr (assoc 'match source)) 'helm-buffers-match-function)
                                 '(helm-string-match-with-migemo)
                              (assoc-default 'match source))))
                  ,@source))
            ((assoc 'migemo source)
             `((search ,searcher)
               ,(if match-identity-p
                    '(match identity)
                  `(match ,matcher))
               ,@source))
            (t source)))))
(add-to-list 'helm-compile-source-functions 'helm-compile-source--migemo t)
```

にすればバッファ名での絞り込みが動作します。

```'helm-buffers-list--match-fn``` を ```'helm-buffers-match-function``` にしただけです。

でもhelm-migemoを使わないほうが```helm-buffers-list```の機能を十分に使えます。```*``` でモードでの絞り込み、```@```でmoccur? のような絞り込みができます。

helm-migemoを使う以上あきらめなければいけないのが残念です。

バッファを変えるだけならば無理に```helm-buffers-list```を使わず
とも```switch-to-buffer```のままでよいのかもしれません。
こちらはデフォルトでhelm-migemoでのバッファ名の絞り込みがききます。
そもそもバッファ名しかありませんけれども。
scala の play で routes にcase object 使う

# scala の play で routes にcase object 使う

enumより`case class`の方が良さそうだったので。

## バージョンとか

* scalaVersion := "2.11.2"
* addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.3.7")

## コード

* conf/routes

```
GET  /foo        controllers.Hoge.foo(device: controllers.Device)
```

* controllers/Hoge.scala

```scala:implicit定義
sealed abstract class Device {
  val name = this.toString.toLowerCase
}
object Device {
  case object Android extends Device
  case object iOS extends Device

  implicit def queryStringBinder = new QueryStringBindable[Device] {
    override def bind(key: String, params: Map[String, Seq[String]]): Option[Either[String, Device]] = {
      params(key).headOption map { deviceString =>
        deviceString.toLowerCase match {
          case Android.name => Right(Android)
          case iOS.name => Right(iOS)
          case _ => Left("Unable to bind a Device")
        }
      }
    }
    override def unbind(key: String, device: Device): String = {
      device.name
    }
  }
}
```

```scala:actionのとこ
object Hoge extends Controller {
  def foo(device: Device) = Action { request =>
    println(device, device.getClass)
    device match {
      case Device.Android => println("ぐーぐる")
      case Device.iOS => println("林檎")
    }
    Ok("OK")
  }
}
```

## 挙動

* 200 おｋ
    * curl -s -v "localhost:4080/foo?device=android"
    * curl -s -v "localhost:4080/foo?device=ios"
* 400 Bad Request
    * curl -s -v "localhost:4080/foo?device=andrd"
    * curl -s -v "localhost:4080/foo?device=firefox"
* 500 Internal Server Error
    * curl -s -v "localhost:4080/foo?devie=ios"

## 参考にしたとこ

主にこのへん。

* http://danieldietrich.net/play-with-scala-url-path-binding/
* http://tototoshi.hatenablog.com/entry/20130216/1360985707
* http://xerial.org/scala-cookbook/recipes/2012/06/29/enumeration/
キサマッ、方眼紙だな！通すわけにはいかないッ！ -Ruby で Excel方眼紙判定- #ruby #方眼紙

![hogan_title.png](https://qiita-image-store.s3.amazonaws.com/0/43480/0dc05035-8573-ea99-fe16-c3f449fffdf7.png)

## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
Excel 方眼紙かどうか判別する Ruby スクリプトを作成しました

## <i class="fa fa-file-text" style="font-size:1em;"></i> インストール
rubyXL を利用して Excel を操作します
<i class="fa fa-external-link" style="font-size:1em;"></i>[rubyXL](https://github.com/weshatheleopard/rubyXL)

~~~bash
gem install rubyXL
~~~

## <i class="fa fa-file-text" style="font-size:1em;"></i> 仕様
* 方眼紙の要件は以下とする
    * rubyXL で取得した row の ht(高さ) が 13.5
        * rubyXL が2列目以降のデータを正しく返してくれないの仕方なく 1列目だけチェック
    * rubyXL で取得した column の width が 2.25 ( Excel の GUI で列の幅に 1.63 を設定した場合の値 )
        * 1列目から5列目までチェック

※私は Excel 方眼紙が好きではないので詳しいことは知りませんが、
方眼紙を作る場合は、 **行の高さ** ***13.5***, **列の幅** ***1.63*** に設定するのが一般的なようです。

## <i class="fa fa-code" style="font-size:1em;"></i> ソースコード

~~~ruby
require 'rubyXL'
require 'pathname'

class ExcelHoganShi
  HOGAN_WIDTH = 2.25
  HOGAN_HEIGHT = 13.5

  def initialize(file)
    book = RubyXL::Parser.parse(File.expand_path(file))
    @sheet = book[0]
  end

  def hogan_shi?
    return false unless hogan_width?
    hogan_height?
  end

  private

  def hogan_width?
    (0..4).each do |i|
      return false unless @sheet.get_column_width_raw(i) == HOGAN_WIDTH
    end
    true
  end

  def hogan_height?
    @sheet.get_row_height(0) == HOGAN_HEIGHT
  end
end

excel_hogan_shi = ExcelHoganShi.new(ARGV[0])
if excel_hogan_shi.hogan_shi?
  puts "キサマッ、方眼紙だな！"
else
  puts "よろしい、通るがよい"
end
~~~

## <i class="fa fa-flask" style="font-size:1em;"></i> 動作確認
### 方眼紙(hoganshi.xlsx)

![hoganshi.png](https://qiita-image-store.s3.amazonaws.com/0/43480/ad084089-6c6e-c688-787b-cd4ebe11b1dc.png)

* 実行

~~~bash
% ruby excel_hogan_shi.rb hoganshi.xlsx
キサマッ、方眼紙だな！
~~~

### 方眼紙ではない(not_hoganshi.xlsx)

![not_hoganshi.png](https://qiita-image-store.s3.amazonaws.com/0/43480/bc81c488-6f42-ede5-d621-8b4a24f40490.png)

* 実行

~~~bash
% ruby excel_hogan_shi.rb not_hoganshi.xlsx
よろしい、通るがよい
~~~

## :books: 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i>[rubyXL](https://github.com/weshatheleopard/rubyXL)
Landscapeのみのautorotationにしようとしたらportrait設定が活きてしまう問題対応

横画面固定だが、ホームボタンが右でも左でも大丈夫なようにしようとしたとき、ビルドスクリプト側でこんな風に書いてました。

```lang:BatchBuild.cs
PlayerSettings.defaultInterfaceOrientation = UIOrientation.AutoRotation;
PlayerSettings.allowedAutorotateToPortrait        = false;
PlayerSettings.allowedAutorotateToPortraitUpsideDown = false;
PlayerSettings.allowedAutorotateToLandscapeRight  = true;
PlayerSettings.allowedAutorotateToLandscapeLeft   = true;
```
しかし何故か！縦画面ローテートが活きてしまう。何でだろう…と思ってたら実行時のメッセージにこんな表示が。

```file:
all orientations are disabled for auto-rotation. Enabling Portrait
UnityEditor.PlayerSettings:set_allowedAutorotateToPortrait(Boolean)
BatchBuild:AndroidBuild(Boolean) (at Assets/Editor/BatchBuild.cs:90)
BatchBuild:AndroidDevelopmentBuild() (at Assets/Editor/BatchBuild.cs:38)
```
90行目というのがちょうど`PlayerSettings.allowedAutorotateToPortrait=false`を設定しようとしているところで、うーんつまり「オートローテーションで全方向disableになってるから、portraitをenableにするね！」ということか？

じゃあfalseのところをコメントアウトしたらいいのかな？と思いましたが、これも失敗。

結論としてこれでいけました。

```lang:BatchBuild.cs
PlayerSettings.defaultInterfaceOrientation = UIOrientation.AutoRotation;
PlayerSettings.allowedAutorotateToLandscapeRight  = true;
PlayerSettings.allowedAutorotateToLandscapeLeft   = true;
PlayerSettings.allowedAutorotateToPortrait        = false;
PlayerSettings.allowedAutorotateToPortraitUpsideDown = false;
```
…うーん、何だか腑に落ちない…
Apache DrillからS3に配置したJSONに対してクエリを発行する

#はじめに
追加のライブラリを導入することで、Apache DrillからS3上に配置したJSONに対してSQLクエリを発行できます。

S3上のファイルに直接アクセスできれば、データをマシン上に配置しなくて済むので、EBSの領域を確保しなくて済みます。
また、Apache Drillを使いたいときだけスポットインスタンスを立ち上げるといったことも簡単になり、お財布にもとても嬉しいです。

ちなみに、このページで解説していることをやってみただけです。
http://drill.apache.org/blog/2014/12/09/running-sql-queries-on-amazon-s3/

動画も公開されていますので手順がわかりやすいです。
https://www.youtube.com/watch?v=jNUsprJNQUg

#セットアップ

##準備
- Apache Drillを実行できる環境を用意しておいてください。(公式サイトよりtar.gzをDLし解凍するだけ)
- S3のバケットを用意してください
- S3にアクセスできるAWSのアクセスキーとシークレットキーを用意してください

作業ディレクトリは、明示しない限りApache Drillを展開したディレクトリです。

##セットアップ手順
1. 下記サイトにあるライブラリをダウンロードし、JARをApache Drillのjars/3rdpartyディレクトリにコピーします。  
http://www.jets3t.org/

```bash
wget http://bitbucket.org/jmurty/jets3t/downloads/jets3t-0.9.3.zip
unzip jets3t-0.9.3.zip
cp jets3t-0.9.3/jars/jets3t-0.9.3.jar jars/3rdparty/
```
　
2. conf/hadoop-excludes.txt を編集し、「jets3t」の行を削除する
3. conf/core-site.xmlを作成する。下記テンプレートのIDとSECRETの部分をS3にアクセス可能なAWSのAccess KeyとSecret Keyに置き換える。

```xml
<configuration>
<property>
  <name>fs.s3.awsAccessKeyId</name>
  <value>ID</value>
</property>

<property>
  <name>fs.s3.awsSecretAccessKey</name>
  <value>SECRET</value>
</property>

<property>
  <name>fs.s3n.awsAccessKeyId</name>
  <value>ID</value>
</property>

<property>
  <name>fs.s3n.awsSecretAccessKey</name>
  <value>SECRET</value>
</property>
</configuration>
```
　
4. Drillのシェルを起動
シェルを起動することで http://<マシンのIP>:8047/ から設定画面を開けるようになります。
EC2の場合はセキュリティグループの設定で8047を開けておいてください。

```bash
./bin/sqlline -u jdbc:drill:zk=local
```
　
5. S3用のプラグインを設定する
http://<マシンのIP>:8047/ にアクセスして「Storage」タブを選択します。
Enable Storage Plugins内の「dfs」のUpdateをクリックします。
表示されたテキストエリアの内容をすべてコピーし、「Back」で元の画面に戻ります。
New Storage Pluginのテキストエリアに「s3-mybucketname」のように好きなプラグイン名を入力しCreateを押します。
テキストエリアに先ほどコピーした内容をペーストし、「file:///」を「s3n://my-bucket-name」[^1]に置換しCreateを押します。
「my-bucket-name」はS3のバケット名を指定してください。

#実行
セットアップが完了しましたので、S3に適当なjsonファイルを置いてクエリを投げてみます。

下記のtest.jsonを用意してS3バケットに配置しておきます。

```json:test.json
{"id": 1, "name": "foo"}
{"id": 2, "name": "bar"}
```

Apache Drillのシェルからクエリを投げます。
「s3-mybucketname」のところはセットアップで指定したプラグイン名になります。

```bash
0: jdbc:drill:zk=local> select * from `s3-mybucketname`.`test.json`;                                                                                                                                         
+------------+------------+------------+
|    dir0    |     id     |    name    |
+------------+------------+------------+
| mybucketname | 1          | foo        |
| mybucketname | 2          | bar        |
+------------+------------+------------+
2 rows selected (2.533 seconds)
```

ちなみに、200MBほどのJSONに対しても6秒ほどで集計できました。
EC2とS3のリージョンを合わせておけばなかなか高速に結果を得られます。

通常のファイルシステムへのアクセスと同じように、FROM句にディレクトリを指定すれば、配下のJSONが結合したテーブルとして扱うこともできます。
日別にJSONが分かれているようなケースでもひとつのテーブルとして扱えます。[^2]

#脚注
[^1]: 冒頭の英語版のサイトでは s3:// となっていますが、通常のJSONを扱う場合は s3n:// とする必要があります。
[^2]: パフォーマンスは落ちます。
Amazon SES で特定のメールアドレスからメールが届かない場合の解決方法

Amazon SES を使用していて、特定のメールアドレスのみ、特にドコモやソフトバンク、KDDIなどのキャリアメールのメールが届かない場合があります。

# Amazon SES からメールが届かない原因
該当のメールアドレスがAmazon SES のサプレッションリストに追加されていたの原因かもしれません。

Amazon SES から何度かメールの配信がバウンス（失敗）すると、該当のメールアドレスをサプレッションリストに登録するみたいです。

```text
Amazon SES サプレッションリストからの E メールアドレスの削除

Amazon SES は、過去 14 日以内に任意の Amazon SES のお客様のハードバウンスの原因となった受取人 E メールアドレスのサプレッションリスト（以前はブラックリストと呼ばれていました）を保持します。サプレッションリストに登録されているアドレスに Amazon SES 経由で E メールを送信しようとした場合、Amazon SES の呼び出しは成功しますが、Amazon SES は、この E メールを送信せず、代わりにハードバウンスとして扱います。
```
サプレッションリストに登録されたメールアドレスへのメール送信は、必ず失敗してしまうみたいです。

# サプレッションリストからメールアドレスを削除
サプレッションリストからメールアドレスを削除して、メールが届くようになることを期待します。

## 1.SESの管理画面へアクセスします。
https://console.aws.amazon.com/ses/

## 2.regionを選択
Amazon SES で使用しているregionを選択します。既にログインしたことがあると、このステップは飛ばせるかもしれないです。

## 3.**Suppression List Removal**を選択
メニューにある**Suppression List Removal**を選択します。

## 4.メールアドレス一件ずつ入力する
届かないメールアドレスを一件ずつ手動で入力します。キャプチャも入力しないといけません。

<img src="https://qiita-image-store.s3.amazonaws.com/0/1624/9dd0146c-532d-aa28-d6c6-82139ef3f4a6.png" alt="Amazon SES Submit a Suppression List Removal Request" width="320" />
一件ずつなので大変です。

# 結果
やった！メールが届くようになりました(☝ ՞ਊ ՞)

# それでもダメなとき
Amazon SES を使わないとメールが届くらしいです＼(^o^)／

# 参考
http://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/remove-from-suppression-list.html
ARC Welderの所感

[Getting Started with ARC - Google Chrome](https://developer.chrome.com/apps/getstarted_arc)

ARC: App Runtime for Chromeは、Chrome上で動く新しいAndroidエミュレータで、Android appをChrome app感覚で実行できます。以下は[Helium](https://play.google.com/store/apps/details?id=com.github.gfx.helium) をARC Welderで実行してみた結果です。

![Screenshot 2015-04-03 23.57.03.png](https://qiita-image-store.s3.amazonaws.com/0/207/04af9dfa-c520-c0a9-0cd7-0e0a90c4c57f.png)

実際に試してみると、単純なアプリはそれなりに動きますが複雑なアプリはレイアウトがぐずぐずであまりまともには動きませんし、すぐクラッシュします。まだまだβ版というところです。

ただ期待感はあって、とにかく起動が非常に早いので、将来的にはこれをテスト環境として強化していくと開発が非常にやりやすくなるのではないかと思います。Google Play Servicesもサポートするようですし。

その他ざっと気づいた特徴：

* 一度Android appを起動するとそれがChrome appとして登録される
    * 登録済みのアプリはMBAでも数秒で起動する
* Chrome inspector（[chrome://inspect/#apps](chrome://inspect/#apps)）を起動してispectorで `plugin.shell('adbd')` でadb daemonを起動しておくと、ホストPCから `adb shell` などもできる
    * ただし `adb install app.apk` するとアプリがクラッシュした
    * なのでAndroid Studioなどから普通のエミュレータ感覚で使うことはまだできない
* 暗黙的インテントでブラウザを起動すると、ホストPCのブラウザでウェブページを開く
    * つまりインテントもある程度サポートするつもりらしい

これはとても面白い技術で、先が楽しみです。
超ど素人がRendarManをいじってみる~インストール編~

Rendarman（レンダーマン）ってなにってところからわからない超ど素人です。
勉強のためにメモ的に記録を取っておこうって思います。

<h1>RenderManとはなに？</h1>
wikipediaから
>RenderMan（レンダーマン）はピクサー・アニメーション・スタジオによって開発されたレンダリング用のソフトの一群。

とのこと。
これまで、RenderManは有償だったそうです。
今回非商用利用に限って無償で公開されました。
これで、何か自作３Dアニメができちゃうのかもしれないの？ととりあえず興味をひかれたのです。

　※英語も苦手な私が引っかかったポイント「☆」で表示
　Macで作業しています。Macも初心者です。
<h1>ダウンロード・インストール</h1>
インストールの仕方を参考にしたのはGigazineの記事
　http://gigazine.net/news/20150324-free-renderman-pixar/

1.Intro
2.Register☆
　英語を読まずにすっ飛ばしてNextを押してしまいました。
　「Register: Create a RenderMan Forums Account」からアカウントを作らないとダウンロードできません。
 記事にスクリーンショットが貼られているので登録の仕方は間違いませんでした。
3.Install
　ここでダウンロード！!するとこんなファイルができました。
　![スクリーンショット 2015-04-03 17.49.25.png](https://qiita-image-store.s3.amazonaws.com/0/39911/2adea9ef-2452-dd8e-6d52-a1990523063c.png) 
　pkgを実行してインストールを行いました
実行していくと、[success!]って出たのでうまくいったみたいです。

<h1>実行してみる☆</h1>
きっとLaunchPadに入ってるのを叩けば良いのだろうと探ってみるとこんなのができていました。
![スクリーンショット 2015-04-03 17.57.59.png](https://qiita-image-store.s3.amazonaws.com/0/39911/2cdb507b-6c6b-f8c7-8586-6347fbf75510.png)
きっとこの絵がついているやつをダブルクリックすればいいんじゃ？って思ってクリックすると、ライセンスを聞かれました。

どうやら、これはインストーラらしいです。
どうしたらよいやら困っていたところ・・・・

<h1>コマンドラインで実行できるようにしてみる☆</h1>
手順の参考に教えてもらいました。
http://wakufactory.jp/rman/

1.環境設定をします
exportコマンドで設定するようになっていたので、このコマンドもよくわからないまま実行。

この状態でとりあえず
>`/Applications/Pixar/RenderManProServer-19.0/bin/render`

これを実行すると
>
```
$/Applications/Pixar/RenderManProServer-19.0/bin/render ; exit;
$/Applications/Pixar/RenderManProServer-19.0/bin/render: line 40: /usr/local/prman/bin/prman: No such file or directory
/Applications/Pixar/RenderManProServer-19.0/bin/render: line 40: exec: /usr/local/prman/bin/prman: cannot execute: No such file or directory
logout
```

とこんなエラーが戻ってきました。

参考資料の**「テストを動かしてみる」**をみてみる
>インストール先のetc/setupの下にテスト用のMakefileがあるので、setupフォルダごとコピーしてきて。make してみます。

Desctopに名前を変えておきました。そして、make実行
>
```
$ make
xcode-select: note: no developer tools were found at '/Applications/Xcode.app', requesting install. Choose an option in the dialog to download the command line developer tools.
```
![スクリーンショット 2015-04-03 18.24.36.png](https://qiita-image-store.s3.amazonaws.com/0/39911/438f220c-3885-79c3-da13-3b9d7e1edd44.png)

Xcodeをいれないといけないみたいです。
Xcode入手しよう。。
入手後、make再度実行
>
```
$ make
${RMANTREE:-RMANTREE not set!}/bin/shader -q finite.sl
/bin/sh: RMANTREE: command not found
make: *** [trial] Error 127
```

これは・・・・環境変数が設定解除されているんだな。。
もっかい設定してからmakeを実行。今度は成功
>
```
$ export RMANTREE=/Applications/Pixar/RenderManProServer-19.0
$ make
${RMANTREE:-RMANTREE not set!}/bin/shader -q finite.sl
${RMANTREE:-RMANTREE not set!}/bin/shader -q shield.sl
${RMANTREE:-RMANTREE not set!}/bin/render trial.rib
${RMANTREE:-RMANTREE not set!}/bin/cmptiff -q trial.tif check.tif 
The images are identical.
```
trial.tifができました！

![スクリーンショット 2015-04-03 23.30.46.png](https://qiita-image-store.s3.amazonaws.com/0/39911/4bf46980-9f38-74dd-0c43-5d7b21483709.png)

やったぁ　（＾0＾）/

この状態でもう一度、直接実行してみる。
>`/Applications/Pixar/RenderManProServer-19.0/bin/render`

やっぱりエラー。
ファイルを直接おかないときっとダメなんだな。
少し理解できたような気がしました。

追記）
コマンド実行は、RIBファイルがないといけないってことがわかりました。

```
/Applications/Pixar/RenderManProServer-19.0/bin/render RIBファイル
```
こうすれば実行できます！
Jekyll,Markdownでリンクを別タブで開く

Markdown記法のリンクを別タブで開くリンクに変えます。即席で作ったものなので、万能ではないですが...

```
{% if content contains '<a href=' %}
    {{ content | replace:'<a','<a target="_blank"' }}
{% else %}
    {{content}}
{% endif %}
```
.gitignore で無視したフォルダ配下の、特定のフォルダだけ無視しないようにする方法

【末尾に追記あり】
*この記事は Git のバージョン 2.6 時点での話です。2.7からは簡単にできるようになりました。*

---

.gitignore で、あるフォルダを無視したとします。
で、その配下の特定のフォルダだけ、やっぱり git で管理したいとします。

### たとえば

- **folder1 ← このフォルダ配下は無視したい**
    - folder1-1
      - folder1-1-1
      - **folder1-1-2 ← でも、このフォルダだけは無視したくない**
      - folder1-1-3
    - folder1-2
- folder2
- folder3

`/folder1` は無視したい。
でも `/folder1/folder1-1/folder1-1-2` は無視したくない。
とします。

### ダメな例

とりあえず、.gitignore に `!` 記法を使って

```
/folder1
!/folder1/folder1-1/folder1-1-2
```

で、いけるかと思ったらダメでした。
どうも一度 `/folder1` を無視してしまうと、その配下のものは `!` を使っても、こっちの世界に戻ってこないっぽい。

### できた例

こう書いたらいけました。

```
/folder1/*
!/folder1/folder1-1
/folder1/folder1-1/*
!/folder1/folder1-1/folder1-1-2
```

`/folder1` 配下のファイルは無視。
でも `/folder1/folder1-1` は無視しない。
で `/folder1/folder1-1/` 配下のファイルは無視。
でも `/folder1/folder1-1/folder1-1-2` は無視しない。

ひとつひとつ階層を掘って、順番に書いていけばOKっぽい。


### しかし

できたとはいえ、えらく冗長ですよね……
もっとシンプルな書き方ないのかなあ……

---

##【追記】Git 2.7 から簡単にできるようになった

Git 2.7 から、

> どうも一度 `/folder1` を無視してしまうと、その配下のものは `!` を使っても、こっちの世界に戻ってこないっぽい。

この部分の仕様が変わり、こっちの世界に戻ってくるようになりました。
なのでこう書くだけでOKです 🙌

```
/folder1
!/folder1/folder1-1/folder1-1-2
```

### 参考

- [Git 2.7 で .gitignore が便利になっている – Tips Note](http://www.tam-tam.co.jp/tipsnote/program/post8318.html)
- [Git 2.7 の優れた新機能 – Atlassian Japan](http://japan.blogs.atlassian.com/2016/01/git-2-7-release/)
VBA。フォームにコントロールを動的に追加する

VBAにおいて、フォームにコントロール（ボタンなど）を動的に配置する方法がわかりにくかったので、恥ずかしながらQAサイトなどからコードのかけらを集めてサンプルプログラムを書いてみました（3時間前に発見していたら嬉しかっただろうというものです）。

Dictionaryに格納した複数の文字列をボタンとして配置したフォームをポップアップさせます。
ボタンを押下すると、そのボタンに設定したnameプロパティをmsgboxで出力します。
（ここで押した場合の値を後で使用するにはグローバル変数に格納するのがよさそう？



```vb.net:SelectSortBookForm
'' ユーザフォームに空フォームを定義しておく。キャプションなど必要であればプロパティから変更しておく。
Private Sub SelectForm()

End Sub
```

```vb.net:MyButton
'' コマンドボタンの実態をクラスモジュールに作成しておく
Public WithEvents button As CommandButton

'' クリックイベント発生時の動作
Private Sub button_Click() 
    pub_clickedButtonName = button.name
    Unload SelectForm'フォームをメモリから解放する
End Sub
```

```vb.net:module1
'' Dictionary型を引数にとって全要素をボタンにしたFormを作成する
Sub make_form(dictionary As Object)
    Dim i As Integer
    Dim btn As Control
    Dim NewBtn() As New MyButton ''ボタンオブジェクトを動的配列

    ReDim NewBtn(1 To dictionary.Count) '' 配列の長さを動的に決定

    With SelectForm
        i = 1
        For Each Key In dictionary
            Set btn = .Controls.Add("Forms.CommandButton.1", dictionary(Key)) 
            '' 第一引数はコマンドボタンを表し、第二引数がnameプロパティになる
            With btn
                .Top = 5 + (i - 1) * 20
                .Left = 5
                .Height = 20
                .Width = 60
                .Caption = "No." & i & "：" & dictionary(Key)
            End With
            Set NewBtn(i) = New MyButton
            Set NewBtn(i).button = btn
            i = i + 1
        Next Key
        .Height = i * 20 + 10
        .Width = 70
        .Show ' フォームを起動する
    End With
End Sub

'' テストメソッド
' フォームで押されたボタンの名前を呼び出し元で利用するためにはpublicで変数を作成しておく必要がある。
Public pub_clickedButtonName As String

Sub test_make_form()
    Dim targetDictionary As Object
    Set targetDictionary = CreateObject("Scripting.Dictionary")
    
    targetDictionary(0) = "ビアンカ"
    targetDictionary(1) = "フローラ"
    targetDictionary(2) = "ルドマン"
    
    Call make_form(targetDictionary)

    msgbox pub_clickedButtonName
End Sub
```

### 雑感
- VBA系の公式ドキュメント、えらいわかりにくいorさがしにくい
- コントロールなどGUI系の用語よくわかっていない
nendさん家のコンバージョンタグを改良してみた。

最近イケイケでいろんな広告代理店が使いまくってるNendさん。
実にCVタグが実にウザい...

で、デフォルトだと
1つID設定して、js呼んで...
1つID設定して、js呼んで...
1つID設定して、js呼んで...
1つID設定して、js呼んで... 辛い

なので改良したぉ

nendってこれです。
http://nend.net/

Before
===
<問題点>
* 1つずつID設定とか死ねる
* そもそもtag_idって名前は他とぶつかるんじゃないの？
* UserAgentの判定が変。1つずつ文字列だけで判定するならsearchよりtypeOfじゃね？

```html:もとのHTML
<script type="text/javascript">
var tag_id = 99999999999999999999999999999999999;
var nend_domain = "https://s.nend.net";
</script>
<script type="text/javascript" src="https://s2.nend.net/js/nendRt.js"></script>
```

```js:もとのjavascript
if ("undefined" == typeof nend_domain) var nend_domain = "https://s.nend.net";
if ("undefined" == typeof nendRt) var nendRt = {
    init: function() {
        try {
            if (-1 != document.cookie.indexOf("nendoptout")) return 0;
            "undefined" != typeof tag_id && document.createElement("img").setAttribute("src", nend_domain + "/rt.php?tag_id=" + tag_id)
        } catch (a) {
            console.log(a)
        }
    }
};
var nend_user_agent = navigator.userAgent;
!navigator.cookieEnabled || (-1 == nend_user_agent.search(/AppleWebKit/) || -1 == nend_user_agent.search(/Android/) && -1 == nend_user_agent.search(/iPhone/) && -1 == nend_user_agent.search(/iPod/) && -1 == nend_user_agent.search(/iPad/)) || nendRt.init();
```



After
===
<直してみた箇所>
* 1つでも複数でもID設定できるようにした。(とりあえず安全のために終わったらundefinedで後片付けしてる)
* tag_idをnend_tag_idsに変えた
* UserAgentの判定をまとめた。こんなかんじでいいですよね。

```html:HTMLの改修アイディア
<script type="text/javascript">
var nend_tag_id = 99999999999999999999999999999999999;
var nend_tag_ids = [1111111111111111111,2222222222222222,33333333333333333,44444444444444444];
</script>
<script type="text/javascript" src="https://s2.nend.net/js/nendRt.js"></script>
```

```js:javascriptの改修アイディア
var nend_domain = nend_domain || "https://s.nend.net";
var nend_user_agent = navigator.userAgent;
var nendRt = {
  init: function() {
    try {
      if (-1 != document.cookie.indexOf("nendoptout")) return 0;
      if (typeof nend_tag_id != "undefined") {
        this.request(nend_tag_id); 
        nend_tag_id = undefined;
      }
      if (Object.prototype.toString.call(nend_tag_ids) === '[object Array]') {
        for(var i = 0, l = nend_tag_ids.length; i < l; i++) {
          this.request(nend_tag_ids[i]);
        }
        nend_tag_ids = undefined;
      }
    } catch (e) {
      console.log(e);
    }
  },
  request: function(t){
    console.log('test');
    return document.createElement("img").setAttribute("src", nend_domain + "/rt.php?tag_id=" + t);
  }
}
if ((navigator.cookieEnabled && /AppleWebKit|android|ip(hone|(a|o)d)/i.test(nend_user_agent))) nendRt.init();
```

以上、なかのプログラマさん見てたら直してください。
new Intent.... ああ、getApplication()か。

あまりいないとは思うんだけど、（本当にあまりいないと思うけど）
久しぶりにAndroid触って、あれ、intentがーってなったので、一応メモっておく。

どこのサイト見ても、だいたいActicvityの画面遷移は

```
Intent intent = new Intent(MainActivity.this, SubActivity.class);
startActivity(intent);
```
みたいに書いてある。
でも、2ページ目、3ページ目とどんどんnewして画面遷移して行きたい時に、エラーとなって、10分ほど悩んでしまった。

解決策はこれ。
```
Intent intent = new Intent(getApplication(), SubSubActivity.class);
startActivity(intent);
```

getApplication()すれば、エラー無くできますよ。

ちなみに、getApplication()の方が、OutOfMemoryのリスクは少ないらしいです。
chefでnginxをインストールする際にこけた箇所（yumのリポジトリ追加）

chefでnginxをインストールする際に

<pre>
ERROR: Cookbook yum not found. If you're loading yum from another cookbook, make sure you configure the dependency in your metadata
</pre>
というエラーが起きました。
centOSで起きるみたいで centOS の yumのリポジトリ設定が足りないそうです。
（引用：http://xoyip.hatenablog.com/entry/2013/04/16/140000 ）

んで
<pre>
$ cd chef-repo
$ knife cookbook site vendor yum
</pre>
でリポジトリの追加ができる。ということだったのですが
<pre>
ERROR: The cookbook repo path /home/vagrant/.chef/cookbooks does not exist or is not a directory
</pre>
こんなエラーが。。。
<pre>
$ knife cookbook site vendor yum -o cookbooks/
</pre>
ちゃんとパスを指定しないさい。ということですね。


注）ディレクトリについては
http://tatsu-zine.com/books/chef-solo
を参照
aws cli で iam の group に紐づく user, policy を見る




```bash

#!/bin/bash

aws iam list-groups | jq '.Groups[].GroupName' | xargs -I{} echo {} | \
    while read g
    do
        echo ${g} "-------------------------------------------------------------";
        aws iam get-group --group-name ${g} | jq '(.Group | {GroupName, Arn}), (.Users[] | {UserName, Arn})'
        aws iam list-group-policies --group-name ${g} | jq '.PolicyNames[]' | xargs -I{} echo {} | \
            while read p
            do
                aws iam get-group-policy --group-name ${g} --policy-name ${p}
            done
    one
```

bash の while が ruby の

``` ruby
a = [1, 2, 3]
a.each do |n|
	echo p
end
```

のように使えるとわかったので良かった。
あと jq 楽しいよ jq。
Office 2013 の操作中のアニメーションを止める

office 2007 から Office 2013 に乗り換えで気づいたこと。
操作時のアニメーションで、かなり動作がもたつくので停止した。


Windows 7でのアニメーションを停止する
----------------------------------

1. 「コンピュータ」を右クリック
1. 左ペインの「システムの詳細設定」
1. システムのプロパティの「詳細設定」タブ
1. パフォーマンスの「設定」
1. 「視覚効果」タブの「Window内のアニメーションコントロールと要素」のチェックをはずす。
最小構成のServiceWorker


今、話題のServiceWorkerを動かしてみましょう。
ServiceWorkerはプログラム可能なブラウザキャッシュです。
ブラウザからサーバーへのリクエストをフックして、レスポンスを改ざんできます。

Google Chrome 41.0.2272.118 で動きました。

## ファイル
### ServiceWorkerを登録するhtml 
`service-worker.js`をServiceWorkerとして登録します。

```html:index.html
<script>
    navigator.serviceWorker.register('service-worker.js')
        .catch(function(whut) {
            console.error(whut);
        });
</script>
```


### 登録するServiceWorker
全てのリクエストをフックして、文字列`hello`を返します。

```js:service-worker.js
self.onfetch = function(event) {
  event.respondWith(new Response('hello'));
};
```

## 動かす
### サーバーを起動
pythonを使います。

```
python -m SimpleHTTPServer
```

### 下記URLを開く
http://localhost:8000

一回目は何も表示しません。
リロードすると、`hello`と表示します。

## 登録したServiceWorkerを消す
chrome://serviceworker-internals/ を開きます。
`Scope: http://localhost:8000/` で登録されたServiceWorkerがあります。
`Unregister`ボタンを押して登録を解除します。

## ソースコードの説明
### index.html
ServiceWorkerを登録します。

```js
navigator.serviceWorker.register('service-worker.js')
    .catch(function(whut) {
        console.error(whut);
    });
```

#### navigator.serviceWorker
ServiceWorkerは[Navigator](https://developer.mozilla.org/en-US/docs/Web/API/Window/navigator)オブジェクトの[serviceWorker](https://developer.mozilla.org/ja/docs/Web/API/Navigator/serviceWorker)プロパティで参照できます。

#### register
[register](https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/register)メソッドを使ってServiceWorkerを登録します。
第二引数で、ServiceWorkerが動くscopeを指定できます。
大抵は相対パスで指定します。指定しなかったら`/`です。
今回は指定していないので`/`です。

`register`の戻り値はPromiseです。
今回はエラーを拾うために`catch()`メソッドにコールバックを指定します。
ファイル名を間違えると、エラーを表示します。

### service-worker.js

```js
self.onfetch = function(event) {
  event.respondWith(new Response('hello'));
};
```

#### self
`self`変数で[ServiceWorkerGlobalScope](https://developer.mozilla.org/ja/docs/Web/API/ServiceWorkerGlobalScope)を参照できます。

#### onfetch
[onfetch](https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerGlobalScope/onfetch)にコールバック関数を指定します。
[fetch](https://developer.mozilla.org/en-US/docs/Web/API/GlobalFetch/fetch)関数が呼ばれたときに実行されます。
サーバーにリクエストが飛ぶ前だと解釈しています。

#### FetchEvent
コールバックには[FetchEvent](https://developer.mozilla.org/en-US/docs/Web/API/FetchEvent)が渡されます。
これを操作してレスポンスを改ざんします。

#### Response
[Respose](https://developer.mozilla.org/en-US/docs/Web/API/Response/Response)メソッドを使って、レスポンスを作ります。
文字列`hello`を設定します。

#### respondWith
[respondWith](https://developer.mozilla.org/en-US/docs/Web/API/FetchEvent/respondWith)メソッドでレスポンスを返します。
ASP.NETみたいですね。struts起源かな？

#### 動き 
二回目以降は登録されたServeciWorkerがリクエストをフックします。
`http://localhost:8000`へのリクエストも対象になります。
`hello`が表示されます。
LiteIDEの設定

goのインストールした場所を確認する。
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/659c4db8-df34-1cbb-1ccd-1da4399d2e42.png)

liteIDEを開き、カーソルの位置にあるボタンをクリックする。
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/5f2e8967-7dd7-f947-b91c-98d482b6f2fb.png)
GOROOTを先ほどインストールしたgoのディレクトリパスに置き換える。
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/f6be8975-ee90-0137-7215-e06fbf2cfd1c.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/d7cf34f9-cc67-000f-09bf-3c477fae228e.png)

#保存したいフォルダの設定
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/a0415b69-1980-ee68-fe3e-27a8dc1c6197.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/422d5447-8236-bdc4-0eba-b0ee8d5173e0.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/4172cc4c-b06d-45fb-b953-8af8dfcf5b35.png)

新規プロジェクトの作成。
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/bbe751da-caa7-db6c-9cca-76b006f5777b.png)
ダブルクリックして下のエディットにに入力されたことを確認する。
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/901c1b9b-35e4-17ea-f812-19de0adb7c54.png)
Go1を選択する。
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/aea1f0a5-ac88-76a2-f316-ec7bd8e7dda3.png)
名前を入力。
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/54321a35-d892-1c1e-f0a7-58beba9b22da.png)
OKする。
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/6ba97bf0-1f30-d7cf-1b32-19c3bd632865.png)





パスが通っているか確認する。
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/b2722901-2289-f143-7fbb-cacfd438e3fe.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/ed161b77-f68e-0cd8-2be5-d9e9f3696189.png)
コンパイルできた。
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/70ec720f-682a-7738-611e-94438e830c8d.png)

#ビルド
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/51ec6c29-de92-1961-6b5c-055de5a86f36.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/70879/9173464b-2155-b770-ff3d-6ff57e5222c1.png)
Django1.7 + MySQLで寿司ビール問題が起きるようなカラムにindexを貼る

# 目的
Django1.7 + MySQL5.5以上で、utf8mb4を使う

# 普通にやると
```py:settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'hoge',
        'USER': 'hoge',
        'OPTIONS': {
            'charset': 'utf8mb4',
        }
    }
}
```
```py:models.py
from django.db import models

class User(models.Model):
    screen_name = models.CharField(max_length=255, unique=True)
```

Django1.7系からMigrationが使えるようになったので、それを使ってModelを定義する

```sql:create-db
create database hoge DEFAULT CHARSET utf8mb4;
```

```shell-session:shell
$ python manage.py makemigrations
$ python manage.py migrate

> django.db.utils.OperationalError: (1709, 'Index column size too large. The maximum column size is 767 bytes.')
```
よくある、InnoDBのindex sizeの問題である

# 解決法
http://blog.kamipo.net/entry/2012/11/13/102024
この辺にあるように`innodb_large_prefix`を使うのが良さげ

```my.cnf
[client]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
innodb_file_format = Barracuda
innodb_file_per_table = 1
innodb_large_prefix
```
しかし、ROW_FORMATはどうやって指定するんや

## ROW_FORMAT指定方法その１
http://qiita.com/miyagi389/items/ffc9918fd8ef2f2a1a45

しかし、これではmigrationsで作ったModelには反映されない！！

## ROW_FORMAT指定方法その2
```py:manage.py
#!/usr/bin/env python
# coding: utf-8
from __future__ import unicode_literals
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "testapp.settings")

    from django.db.backends.mysql.schema import DatabaseSchemaEditor
    DatabaseSchemaEditor.sql_create_table += " ROW_FORMAT=DYNAMIC"

    from django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)
```
migrateでもROW_FORMAT=DYNAMICが適用されるようになったよ！

# 補足
Djangoに組み込むモジュールによっては、
migrationに対応していないものもあるので、両方組み合わせて使うとよさげ
nginx のログを fluentdに流す（pattern not match対策）

Fluentdを通じてNginxのロッグを一箇所に集中しビジュアルにしたいです。

参考資料にこう書いてあルのは多いです：
```
<source>
  type tail
  format nginx
  path /var/log/nginx/access.log
  pos_file /var/log/td-agent/nginx-access.pos
  tag nginx.access
</source>```

実はこうしてパータンは認識されていません。（エラーログが出ています）

```
2015-04-03 10:55:49 +0000 [warn]: pattern not match: "192.168.33.1 - - [03/Apr/2015:10:55:49 +0000] \"GET /js/header.js HTTP/1.1\" 200 2988 \"http://gg.dev.com/\" \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36\" \"-\""
```

その**[warn]: pattern not match**はエラーです。

NginxのローグフォーマットはApacheと異なり、そのまま解析できないらしいです。

こう修正すれば問題解消します。

```
...
  pos_file /var/log/td-agent/nginx-access.pos
  format /^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)" "(?<forwarder>[^\"]*)")?/
  time_format %d/%b/%Y:%H:%M:%S %z
...
```


参考資料：http://bynatures.net/wordpress/1951/
よく使うFirefoxアドオンとそれに代わるChrome拡張

## ありがとうFirefox

学生のときからFirefox使ってて、ブックマークためまくって、
好きなAddonいれまくって自分仕様にしたり、思い出がたくさんあります。

仕事でもメインはFirefox、開発するときはChromeみたいに両方を使ってきたのですが、
先日Firefoxのバージョンを`27`から`36`に更新したら、見た目もずいぶん変わって「ああ、あの頃のFirefoxではもうないのか」と思い、これを期に Chromeをメインに一本化してみることにしました。


## オススメFirefoxアドオンとそれに代わるChrome拡張
Firefoxのアドオン機能に結構依存してたので、以降は下記の感じで代用する予定。
オススメがあったら是非教えて下さい！
（いくつかはこの期に見直して、使わないことにしました）

機能 | Firefoxアドオン | Chrome拡張
:---|:----------------|:----------
デバッガ/コンソーラ | [Firebug](https://addons.mozilla.org/ja/firefox/addon/firebug/) | Chromeデフォルトのやつ
開発ツール | [Web Developer](https://addons.mozilla.org/ja/firefox/addon/web-developer) | [Web Developer](https://chrome.google.com/webstore/detail/web-developer/bfbameneiokkgbdmiekhjnmfkcnldhhm)
マウスジェスチャ | [FireGestures] (https://addons.mozilla.org/ja/firefox/addon/firegestures/?src=userprofile) | ~~[Smooth Gestures](https://chrome.google.com/webstore/detail/smooth-gestures/lfkgmnnajiljnolcgolmmgnecgldgeld)~~ [^1]
スクリーンショット | [Pearl Crescent Page Saver Basic screenshot tool](https://addons.mozilla.org/ja/firefox/addon/pagesaver) | いいのがない [^2]
右クリック(コンテキストメニュー)から背景画像の表示 | ブラウザ標準機能 | [背景画像を表示](https://chrome.google.com/webstore/detail/view-background-image/cegndknljaapfbnmfnagomhhgbajjibd)
一定時間で自動リロード | [ReloadEvery](https://addons.mozilla.org/JA/firefox/addon/reloadevery/?src=userprofile) | やめた [^3]
ブラウザの再起動(タブを保持) | [Restartless Restart](https://addons.mozilla.org/ja/firefox/addon/restartless-restart/?src=userprofile) | `chrome://restart` をブックマークして実行

[^1]: Chromeストア上から削除されている?(過去にスパイウェア問題が発生したことが原因？[この記事](http://hayakuyuke.jp/archives/14535)が詳しい) この記事でも積極的に推奨はしませんので自己責任でお願いします。

[^2]: Chromeストアにたくさんあったんですが、どれもキャプチャを取ってからの工程(クリック数)が多かった印象。注記や赤枠追加などの機能はいらないので、ボタン１クリックで勝手にローカルにPNGを保存してくれるくらいの簡潔な拡張を知っていたら教えて下さい！

[^3]: 頻繁に使う機能ではなかったので右クリックコンテクストメニューで使える ReloadEveryをFirefoxの時には入れてました。Chrome拡張でも同じ機能のものはありましたが、メニューバーにアイコンが入って仰々しいのと、長い時間ソースを書いて、たまにブラウザ確認というスタイルになったのでこの機能自体一旦いらないかなと思ってなしにしてます。
NGUI UIButtonをロングタップ対応

```csharp

using UnityEngine;
using System.Collections;
using System;


[RequireComponent(typeof(UIButton))]
public class UIButtonLongTapComponent : MonoBehaviour
{

	[SerializeField]
	float intervalAction = 1.0f;

	float firstTapTime = 0f;
	bool isHoldAction;
	// 押しっぱなし時に呼び出すAction
	public Action OnLongTap = null;
	public Action OnShortTap = null;

	bool isPressing = false;

	void Update()
	{
		if (isPressing && isHoldAction && (firstTapTime + intervalAction < Time.realtimeSinceStartup)) {
			isPressing = false;
			LongTap ();
		}
	}

	void OnPress (bool pressed)
	{
		isPressing = pressed;
		if (pressed) {
			firstTapTime = Time.realtimeSinceStartup;
		}
		else
		{
			bool isLongTap = firstTapTime + intervalAction < Time.realtimeSinceStartup;
			if (!isHoldAction && isLongTap)
				LongTap();
			else if(!isLongTap)
				ShortTap();
		}
	}
	
	public void SetButtonAction(Action shortTap, Action longTap, bool isHoldLongTap) {
		isHoldAction = isHoldLongTap;
		OnLongTap = longTap;
		OnShortTap = shortTap;
	}

	public void CleanAction()
	{
		OnLongTap = null;
	}
	
	public void LongTap()
	{
		if (OnLongTap != null)
			OnLongTap ();
	}
	public void ShortTap()
	{
		if (OnShortTap != null)
			OnShortTap ();
	}

}


```
リクエストメソッド毎のパラメータの取得

REST APIを作っていてパラメータの取得で悩んだのでメモ

# リクエストメソッド別パラメータ取得コード
## GET
これは特に問題ないですね。いつも通り。

```php
$parameter = $_GET;
```

## POST
これも問題なし。

```php
$parameter = $_POST;
```

## PUT
ここからが問題。
結論としてはphp://inputで取得するようです。

```php
parse_str(file_get_contents('php://input'), $put_param);
```

## DELETE
PUTと同じように取得できます。

```php
parse_str(file_get_contents('php://input'), $delete_param);
```

# まとめ
上記を踏まえてリクエストメソッド毎にパラメータを取得するコードを書いてみました。

```php
function getParameter()
{
    $parameter = array();
    switch ($_SERVER['REQUEST_METHOD']) {
    case 'GET':
        $parameter = $_GET;
        break;
    case 'POST':
        $parameter = $_POST;
        break;
    case 'PUT':
    case 'DELETE':
    default:
        parse_str(file_get_contents('php://input'), $parameter);
        break;
    }
    return $parameter;
}
```

## テスト用コマンド
以下コマンドでテストしてみてください。

```bash
$ curl http://localhost/test.php -X PUT -d "abc=def&efg=hij"
```

# 上記コード利用時の注意点
公式にて以下のコメントがあります。

```text
PHP 5.6 より前のバージョンでは、 php://input でオープンしたストリームは、一度しか読み込めません。
```
つまり、1度読み込んでしまった場合、値を取得できないという事です。
フレームワークによってはRequestオブジェクトなどに格納するために、既に取得済みの場合があります。
この場合、上記コードではPUTのbodyは取得できませんので、フレームワーク備え付けのRequestオブジェクトなどから取得してください。
取得済みを確認したフレームワークは以下
* CakePHP2系 ： 取得できませんでした。`$this->request->input()`等で取得
* phalcon ： 取得できました。`$this->request->getPut()`でも取得できるみたいです。

参考：
[PHP公式 > php://](http://php.net/manual/ja/wrappers.php.php)
[PUTメソッドのbodyを取得する](http://qiita.com/shohhei1126/items/25451c8b04126884e536)
Tig を使い始めてみた



# tig を使い始めてみた
tig が便利とのことなので使い始めてみました
* https://github.com/jonas/tig

## tig とは

テキストベースの Git クライアントです  

refs-view：
![tig.jpg](https://qiita-image-store.s3.amazonaws.com/0/69965/7b83673f-a882-2b4f-e3dc-cbd4644112cd.jpeg)

## install

mac 環境であれば brew install するだけ

```
$ brew install tig
```

それ以外の方は以下を参考にしてください
* https://github.com/jonas/tig/blob/master/INSTALL.adoc

## 起動と基本操作

ターミナルで tig を起動  

起動後はメイン画面: main-view にいます  
ここから、git 操作にあわせてビューを切り替えていきます  

```
  m view-main         Show main view
  d view-diff         Show diff view
  l view-log          Show log view
  ...
  h view-help         Show help view
```

あとは、開いているビューモードにあわせてコマンドを実行
`h` キーでヘルプページが開くので、操作わからなかったら開いて確認

## .tigrc でカスタマイズ

細かい表示設定やキーバインドなどは .tigrc で設定可能  
晒しておきます

```
# Set Variables
set refs-view = date:local author:false id ref:true commit-title:true

# Set Key Bind
bind generic F none
bind generic F !git fetch

bind status + !git commit --amend
bind status S @git stash

bind refs n @git branch "%(prompt Enter branch name: )" %(remote)
bind refs R @git rebase -i %(branch)
bind refs ! ?git branch -D %(branch)
```

詳細は以下のページを参考
* http://jonas.nitro.dk/tig/tigrc.5.html

## 使ってみて

ちょっと長いコマンドや、ブランチ名のコピペから開放されてよかった。また、ログまわりなど通常のコマンドよりカラーリングされ見やすかったですね。

ただ、色々参考にしているうちに `zsh` と `peco` の環境を気に入ってしまったので、そちらに移行予定です
jqでcsvをjsonに変換する

メモ。jq便利

# CSVファイル
foobar.csv

```
1,foo
2,bar
```

# コマンド
`jq -s -R 'split("\n")|map(split(","))|map({"id": .[0], "name": .[1]})' foobar.csv`


# 結果
```json
[
  {
    "id": "1",
    "name": "boo"
  },
  {
    "id": "2",
    "name": "bar"
  }
]
```
S3で使えるURL一覧

よく忘れるのでメモ。
どれでも使える。SSLも行ける。
ただし最後の2つはbucket名にドットがあるとSSL証明書の検証に失敗するので使えない。

```
http://[bucket].s3.amazonaws.com/[path]
https://[bucket].s3.amazonaws.com/[path]
http://s3-[region].amazonaws.com/[bucket]/[path]
https://s3-[region].amazonaws.com/[bucket]/[path]
http://s3-[region].amazonaws.com/[path]
https://s3-[region].amazonaws.com/[path]
http://[bucket].s3-[region].amazonaws.com/[path]
https://[bucket].s3-[region].amazonaws.com/[path]
```

regionの部分は、東京リージョンなら、「ap-northeast-1」が入る。
pdfをコピペしたときに文字化けしてしまう問題


ただ単にpdfのテキストをコピペしたいだけなのに、文字化けしちゃう現象があります。
通常のpdf viewerでやってもダメなので、google driveで開いたりといろいろやっても、文字化けしてしまう。

ところが、Firefoxでpdfを開いてコピペすると文字化けせずにできるようです！
ただし、改行位置等がずれてしまう問題があるので、そこはなんらかのやり方で対処する必要あり。(URLバーにコピペするなど)
docker-compose pull しても image が更新されない場合の対処

タイトル通りなぜか更新されなくてなんでかと追っていったら docker-compose 1.1.0 が依存している docker-py が .dockercfg から認証情報を取ってくるときにご丁寧にホスト名にスキーマとパスを追加していたからだった。
https://github.com/docker/docker-py/commit/b1a858a14ddf7d49ab46209d420c0e281125ce6a

例えば独自レジストリに認証をかけていた場合、

```bash
docker login registry.example.com
```

として認証して

```bash
image: registry.example.com/my/image
```

などと docker-compose.yml に指定していると認証情報は https://registry.example.com/v1/ をキーに取得されるので認証エラーになってしまう。
しかも docker-compose は結果をなにも確認しないのでエラーになったかどうかすらわからない。
https://github.com/docker/compose/blob/1.1.0/compose/service.py#L521

対策としては最新の docker-compose が依存している docker-py ではホスト名だけで見てくれるので pip install --pre docker-compose などとすれば幸せになれる。

俺は stable しか使わないぞという強い信念を持っているなら

```bash
docker login https://registry.example.com/v1/
```
で認証するか .dockercfg をこれに書き換える
Pythonでメタプログラミング

Pythonでのメタプログラミングを紹介。
メタプログラミングを理解する上でtype、\_\_new\_\_、\_\_metaclass\_\_を理解する
必要があるためブロックで分けて紹介してます

## クラスの定義はtypeのインスタンスだった
まずPythonでのメタプログラミングを理解するには、
クラスの定義はtypeのインスタンスだったということについて理解しないければならない。

以下は通常クラスとtypeのクラスの定義で同様の挙動となります。

```py
class Hoge(object):

    def function1(self, args):
        return args

    def function2(self, args):
        return args + 50
```

```py
def func1(self, args):
    return args


def func2(self, args):
    return args + 50


# type(クラス名、親クラス、メンバー属性)になります
Hoge = type('Hoge', (object, ), {'function1': func1, 'function2': func2})
```

上記からわかるように、クラス定義は実はtypeのインスタンスだったということです。
type(Hoge) は type を返し、 isinstance(Hoge, type) は True を返します。

## \_\_init\_\_と\_\_new\_\_について
Pythonでインスタンスの生成を行うと\_\_init\_\_が呼び出されインスタンスの初期化が行われると
理解してますが、\_\_init\_\_の前には暗黙的に\_\_new\_\_による処理が存在しています。
この\_\_new\_\_で上記のようなtypeのインスタンス化が自動的に行われクラスが定義されています。

## \_\_metaclass\_\_について
上記で\_\_new\_\_でtypeのインスタンス化が行われていると説明しましたが、
このtypeのインスタンス化を別の定義で置き換えることができます。それが\_\_metaclass\_\_になります。
\_\_metaclass\_\_に関数やクラスを定義することでtypeのインスタンス化時にクラスを拡張することができます

```py
class HogeMeta(type):

    def __new__(mcs, name, bases, dictionary):
        cls = type.__new__(mcs, name, bases, dictionary)
        setattr(cls, 'member1', 10)
        setattr(cls, 'member2', 20)
        return cls

class Hoge(object):

    __metaclass__ = HogeMeta

print Hoge().member1   -> 10
print Hoge().member2   -> 20

```

## サンプル
複数のSkillクラス定義をMetaクラスで管理して、
skill_keyで任意のクラスを取得する場合。

```py
class AttackSkill(object):
    name = u'特大攻撃'


class HealSkill(object):
    name = u'回復'


class PoisonSkill(object):
    name = u'毒攻撃'


class SkillMeta(type):

    def __new__(mcs, name, bases, dictionary):
        cls = type.__new__(mcs, name, bases, dictionary)
        skills = {'attack': AttackSkill,
                  'heal': HealSkill,
                  'poison': PoisonSkill}
        cls.SKILLS = skills
        return cls


class Skills(object):

    __metaclass__ = SkillMeta

    SKILLS = {}

    @classmethod
    def get(cls, skill_key):
        return cls.SKILLS[skill_key]

Skill = Skills.get

print Skill('attack').name   -> 特大攻撃
print Skill('heal').name     -> 回復
```

## まとめ
サンプルでのやり方は、Metaプログラミングを利用せず、関数やdictを組み合せてもできるけど
前者でやった方がより拡張性が高く簡潔に書けそう。
あと、すべてクラスで完結できてるのでオブジェクト指向性が高い。


## 参考
http://www.yunabe.jp/docs/python_metaclass.html
指定サイズ分固定値で埋めたListの生成方法

指定サイズ（実行ごとに数は可変）分固定値で埋めたListを作りたい、と思った時に普通に

```java
int num = 5;

String[] arr = new String[num];
Arrays.fill(arr, "TEST");
List<String> lst = Arrays.asList(arr);

System.out.println(lst);
// [TEST, TEST, TEST, TEST, TEST]
```
だと3stepも書かなければいけないので別アプローチから

```java
int num = 5;

List<String> lst = Arrays.asList(new String[num]);
Collections.fill(lst, "TEST");

System.out.println(lst);
// [TEST, TEST, TEST, TEST, TEST]
```
としても2step。
なんで1stepで書けないんだと調べていたら`Collections#nCopies(int, T)`なる何このメソッド名的なメソッドが大昔（J2SE 1.2）からあって

```java
int num = 5;

List<String> lst = Collections.nCopies(num, "TEST");

System.out.println(lst);
// [TEST, TEST, TEST, TEST, TEST]
```
ああ、できた、というメモ。

ちなみに`Collections#nCopies(int, T)`は不変のリストを返却するので、作成したリストにさらに追加等の処理を行う場合は

```java
int num = 5;

List<String> lst = new ArrayList<>(Collections.nCopies(num, "TEST"));

lst.add("ABC");
System.out.println(lst);
// [TEST, TEST, TEST, TEST, TEST, ABC]
```
とする。
※コードはjava 7で書いています
NSDateFormatterの正しい使い方

追記：何故[この記事](http://qiita.com/gonsee/items/d3fb641914d2ca45e858)を見つけられなかったのか…
NSDateFormatterで検索したら一番上に出てきてすごく分かりやすくまとまっている。

---

"NSDateFormatter"でGoogle検索すると、dateFormatを指定して使う方法ばかり出てくる。
だから、それが普通の使い方だと信じて疑わない人が多いのではないだろうか。
僕は、５分前までそう信じていた。

NSDateFormatterを使って時間を表示したい場合、開発者の思い通りのフォーマットで表示したい場合というのは極限られた場合だと思う。
多くの場合、ユーザの設定した通りの表示方法で表示したいはず。
その場合は、以下の実装方法が正しい。

```swift:MyViewController.swift
class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let formatter = NSDateFormatter()
        formatter.dateStyle = NSDateFormatterStyle.ShortStyle
        formatter.timeStyle = NSDateFormatterStyle.ShortStyle
        let date = NSDate()
        label.text = formatter.stringFromDate(date)
    }
}
```

これは現在時刻を、
2015/04/03 18:33
のような形で表示する。

NSDateFormatterStyleには、5種類の値がある。

- NoStyle
- ShortStyle
- MediumStyle
- LongStyle
- FullStyle

の5つ。
デフォルト値はNoStyle。
NoStyleのときは、その項目は表示されない。

それぞれ、どのように表示されるかは、[別の記事](http://qiita.com/malt/items/d6f469b6a98532c19259)にまとめた。