OmniAICreator/Qiita-1.07M huggingface dataset:
Elixir の Hex を中国から使う方法

Elixir のパッケージ管理ツール [Hex](https://hex.pm/) はデフォルト設定のままでは、中国から利用できません。これは、Hex のデフォルト `cdn_url` が Amazon S3 の北米リージョンに設定されており、GFW によりブロックされているからです[^1] [^2]。そこで `cdn_url` を Amazon S3 シンガポール・リージョンにあるミラーサイトに変更します。

[^1]: 2015年12月現在の状況。s3.amazonaws.com は、少なくてもこの２年間はブロックされています。
[^2]: http://www.greatfirewallofchina.org/ では、中国国外にいる時に、中国からのアクセスがブロックされているかどうかテストできます。（中国国内からはアクセス不可）

## Hex のインストール

`mix local.hex` コマンドは、以下のように失敗します。（同様に `mix deps.get` も失敗します）

```shell-session
$ mix local.hex

16:09:54.236 [error] Failed updating session: 
   ProfileName: :httpc_mix
   SessionId:   {{'s3.amazonaws.com', 443}, #PID<0.78.0>}
   Pos:         7
   Value:       0

...（中略）...

16:09:54.656 [error] GenServer #PID<0.78.0> terminating

...（中略）...

Could not fetch archive at:

    https://s3.amazonaws.com/s3.hex.pm/installs/1.1.0/hex-0.9.0.ez

Please download the archive above manually to your current directory and run:

    mix archive.install ./hex-0.9.0.ez
```

もし運良くインストールできたなら、次のステップ（Hex の `cdn_url` を変更する）に進みます。

もしダメなら、シンガポール・リージョンにあるミラーサイトからパッケージをダウンロードして、エラーメッセージに書かれていた通り `mix archive.install` でインストールします。

Hex のバージョン部分 `0.9.0` は、エラーメッセージを元に書き換えてください。

```shell-session
$ curl -O https://s3-ap-southeast-1.amazonaws.com/s3-asia.hex.pm/installs/1.1.0/hex-0.9.0.ez 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  274k  100  274k    0     0  32570      0  0:00:08  0:00:08 --:--:-- 48767

$ mix archive.install ./hex-0.9.0.ez
Are you sure you want to install archive "./hex-0.9.0.ez"? [Yn] 
* creating /home/tatsuya/.mix/archives/hex-0.9.0.ez
$
```

## Hex の `cdn_url` を変更する

Hex の `cdn_url` を、Amazon S3 シンガポール・リージョン（ap-southeast-1）にある、ミラーサイトへ変更します。

```shell-session
$ mix hex.config cdn_url https://s3-ap-southeast-1.amazonaws.com/s3-asia.hex.pm
Registry update failed (http_error)
{:failed_connect, [{:to_address, {'s3.amazonaws.com', 443}}, {:inet, [:inet], :etimedout}]}
cdn_url: "https://s3-ap-southeast-1.amazonaws.com/s3-asia.hex.pm"
```

ただ、これも最初に s3.amazonaws.com にアクセスしようとするみたいで、かなり待たされます。もしダメな時は、`Ctrl + C, A` でアボートして、hex.config を以下のように書き換えるといいでしょう。

```shell-session
$ cat ~/.hex/hex.config 
{cdn_url,<<"https://s3-ap-southeast-1.amazonaws.com/s3-asia.hex.pm">>}.
```

## 使えるかどうか試してみる

```shell-session
$ mix hex.info        
Hex v0.9.0

Registry file available (last updated: 2015-12-23 08:52:57)
Size: 918kB
Packages #: 999
Versions #: 4440

$ mix hex.search ex_doc
ex_doc
ex_doc_dash
ex_doc_epub
ex_dockerapi
```

大丈夫なようです。

## 参考

- GitHub Issue - [elixir-lang: (Mix) httpc request failed with #3956](https://github.com/elixir-lang/elixir/issues/3956)
- [Qiita: Hex で Elixir のライブラリをリリースする方法](http://qiita.com/ma2ge/items/0e19bf3f03078f589096)
アルゴリズム1000本ノック #6. ZigZag Conversion

#### Problem
問題は [LeetCode](https://leetcode.com/problems/zigzag-conversion/) から拝借しておりますが, 例題を見る限りPaypalのインタビューにて出題された事があるのではと推測されます.

```
文字列 "PAYPALISHIRING" を３行のジグザグ状に羅列すると以下のようになる

P   A   H   N
A P L S I I G
Y   I   R

これを行ごとに読むと次のようになる: "PAHNAPLSIIGYIR"
同じ要領で, 元の文字列と行数を与えられた時にジグザグ状に羅列して行ごとに読んだ時の
文字列を出力する関数を記述せよ.

string convert(string text, int nRows);

convert("PAYPALISHIRING", 3) は "PAHNAPLSIIGYIR" を返却する.
```

#### Solution

![example1](http://f.st-hatena.com/images/fotolife/r/rdtr/20151108/20151108232110.png?1447053680)

ジグザグに羅列したあとの各行を `t0`, `t1`, `t1` と名付けると, 元々の文字列をジグザグ状 (`t0, t1, t2, t1, t0, t1, ...)` に格納していくとそれぞれの行は作成できることがすぐ分かります.

Python版コード:

```py
class Solution(object):
    def convert(self, s, numRows):
        leng = len(s)
        if leng == 0:      return ''
        if numRows <= 0:   return ''
        elif numRows == 1: return s
        
        resRows = [''] * numRows
        
        i = 0
        resRowNum = 0
        step = 1
        while i < leng:
            resRows[resRowNum] += s[i]
            
            if (step == 1 and resRowNum == numRows - 1) or (step == -1 and resRowNum == 0):
                step = -1 * step
            
            resRowNum += step
            i += 1
        
        return ''.join(resRows)
```

計算量: `O(M)`, 空間量: `O(M)` (Mは与えられた文字列の長さ).

Java版のコード:

```java
public class Solution {
    public String convert(String s, int numRows) {
        int len = s.length();
        if (len == 0 || numRows == 0) return "";
        if (numRows == 1) return s;
        
        StringBuilder[] resRows = new StringBuilder[numRows];
        for (int i = 0; i < numRows; i++) {
            resRows[i] = new StringBuilder();
        }
        
        int rowIdx = 0;
        int step = 1;
        for (int i = 0; i < len; i++) {
            resRows[rowIdx].append(s.charAt(i));
            if ((step == 1 && rowIdx == numRows - 1) || (step == -1 && rowIdx == 0)) {
                step = -1 * step;
            }
            rowIdx += step;
        }
        
        StringBuilder sb = new StringBuilder(resRows[0]);
        for (int i = 1; i < numRows; i++) {
            sb.append(resRows[i]);
        }
        
        return sb.toString();
    }
```
よく使うiTermのショートカット

#ペイン
##分割
　縦：cmd+d
　横：shift+cmd+d
##移動
　cmd+alt+←↑↓→
##削除
　cmd+w
##タブ内のペインを同期
　shift+cmd+i → OK
　※もう一度実行で解除

#タブ
##新規
　cmd+t
##移動
　cmd+←↑↓→
##削除
　cmd+w
##並べて表示
　cmd+alt+e
Amazon VPC NAT Gatewayがあるとき。ないとき。

# はじめに

[CYBIRDエンジニア Advent Calendar 2015](http://qiita.com/advent-calendar/2015/cybird) 24日目を担当する2度目の登場@gotyooooです。

昨日は@cy-mitsukiさんの[DevToolsのTimelineパネルを見ながら、レンダリングの仕組みを理解する](http://qiita.com/cy-mitsuki/items/51a0a4c17b89154a7af2)でした。

ブラウザ自体のレンダリングの仕組みとか考えたこともなかったので目からうろこです。

# 本日の内容

* 先日(2015/12/17)リリースされたAmazon VPC NAT Gatewayの話
* なにが出来てどう良くなったのかを書こうと思います

# 特徴
* NAT用のEC2インスタンスクラスタを作ってくれて管理してくれる！素敵。

# Amazon VPC NAT Gatewayがないとき

## デフォルトの機能を使うと・・・

* VPC作成時に選択するとEC2でNAT用インスタンスが**1台**起動
* **NATインスタンスがお亡くなりになるとプライベートセグメントに置いたインスタンスは通信できなくなる**

![old_nat1.png](https://qiita-image-store.s3.amazonaws.com/0/59261/4f86659a-339e-5d10-8e06-79b058dc2d78.png)

## 冗長構成頑張ってみた

* 流れ
 1. 内部ELBを経由してProxyに振り分け
 1. ProxyからルーティングでNATインスタンスへ
* 利用しているNatインスタンスがお亡くなりになったら
 * それを検知して以下を自動で行う
 * スタンバイ側にElasticIPを付け替え
 * ProxySubnetのルーティングをスタンバイのNatインスタンスへ変更

![old_nat2.png](https://qiita-image-store.s3.amazonaws.com/0/59261/ce85ed21-91ee-e0c7-7805-e793d6e9c6b1.png)

# Amazon VPC NAT Gatewayがあるとき

![natgateway.png](https://qiita-image-store.s3.amazonaws.com/0/59261/94d6bd67-552e-b37d-c790-9e253a9c1d40.png)

* シンプル！
* 冗長構成を前のような複雑なことをやらなくてすみますね

# まとめ

* AWSの弱点(筆者の感想)であったNATまわりが整備されたことにより、よりセキュアなセグメントを安心かつ安全に利用できるようになった
* 外部のとあるAPIサービスを利用するためにIPアドレスを固定しなくてはいけない・・・そんなときにこれがベストである。

# 最後に

[CYBIRDエンジニア Advent Calendar 2015](http://qiita.com/advent-calendar/2015/cybird) 最終日は、私の後輩である今年新卒入社の@jin_kさんですよ。
なにやらCapistranoまわりの話をするみたいです。最後までお楽しみに!

# 参考

* [【新機能】マネージドNATゲートウェイが利用可能に - Amazon Web Serviceブログ](http://aws.typepad.com/aws_japan/2015/12/managednat.html)
Railsでhas_manyな関連先の最新の一件が条件を満たすのを取得

==================================================


### 参考
+ [sql - Rails query through association limited to most recent record_ - Stack Overflow](http://stackoverflow.com/questions/5247886/rails-query-through-association-limited-to-most-recent-record)




```rb
class User < ActiveRecord::Base
  has_many :stamps
  has_one  :last_stamp, ->{ order(created_at: :desc) }, class_name: 'Stamp'
end
```

```rb
class Stamp < ActiveRecord::Base
  belongs_to :user

  scope :_this_week, -> { where(created_at: Date.today.all_week) }
end
```

というのがあって、最後のStampが今週に作成されたUser一覧を取得したいというとき

```rb
User.joins(:last_stamp).merge(Stamp._this_week)
```

と書いても

```sql
SELECT "users".* FROM "users" INNER JOIN "stamps" ON "stamps"."user_id" = "users"."id" WHERE ("stamps"."created_at" BETWEEN '2015-12-21' AND '2015-12-27')
```

という具合に、普通にINNER JOINされて最後のStamp以外もひっかかってしまう。

こうするとうまくいく

```rb
User.joins(:stamps).where('stamps.created_at = (SELECT MAX(stamps.created_at) FROM stamps WHERE stamps.user_id = users.id)').merge(Stamp._this_week).group('users.id')
```

```sql
SELECT "users".* FROM "users" INNER JOIN "stamps" ON "stamps"."user_id" = "users"."id" WHERE (stamps.created_at = (SELECT MAX(stamps.created_at) FROM stamps WHERE stamps.user_id = users.id)) AND ("stamps"."created_at" BETWEEN '2015-12-21' AND '2015-12-27') GROUP BY users.id
```


メソッド化
--------------
```rb:app/models/user.rb
class User < ActiveRecord::Base
  has_many :stamps
  has_one  :last_stamp, ->{ order(created_at: :desc) }, class_name: 'Stamp'
  
  scope :_last_stamp_this_week, -> {
  	last_stamp_merge { Stamp._this_week }
  }
  
  private
  	def self.last_stamp_merge(&:block)
  	  joins(:stamps).where(<<-SQL.squish!
  	  	stamps.created_at = (
  	  	  SELECT MAX(stamps.created_at)
  	  	  FROM  stamps
  	  	  WHERE stamps.user_id = users.id
  	  	)
  	    SQL
  	  ).merge(yield).group('users.id')
  	end
end
```

```rb:app/models/stamp.rb
class Stamp < ActiveRecord::Base
  belongs_to :user

  scope :_this_week, -> { where(created_at: Date.today.all_week) }
end
```
windowsでのgit導入手順

windowでgitを導入する際の手順をメモ。
コマンドではなくソースツリーの導入の流れで記載。

sshでのgitへの接続では秘密鍵、公開鍵を準備する必要がある。
macではopenSSH形式の鍵を作成するだけだが、windowsではputty形式というものを準備しないといけないということなので、そこら辺の流れをざっくりと。

#puttyをインストール
(参考 : http://webkaru.net/linux/putty-install/)

#sourcetreeをインストール(この時点でgitの導入できているはず、、、はず！)
(参考 : https://www.atlassian.com/ja/software/sourcetree/overview)

#sourcetreeのメニューバーの[ツール]より「SSHキーの作成・インポート」を選択。↓のwindowが出てくる。
![](http://www.backlog.jp/git-guide/img/ref/ssh/capture_ssh_1_1_win.png)

#Generateボタンを押してwindow上でマウスをぐりぐり動かせばゲージが溜まっていく。
![](http://www.backlog.jp/git-guide/img/ref/ssh/capture_ssh_1_2_win.png)

#ぐりぐりが終わるとSave public keyとSave private keyのボタンが押せるようになるので押す。これで作成できるのがputty形式の鍵
【ファイル名はこれで保存】
　　id_rsa.ppk    ・・・秘密鍵
　　id_rsa.pub.ppk・・・公開鍵


#次にopenSSH形式の鍵を作成する
まずkeyの囲いの中に記述されているものがopenSSHの公開鍵
Conersionsメニューの中からExport OpenSSH keyを押すとopenSSH形式の秘密鍵が作成される
　【ファイル名はこれで保存】
　　id_rsa    ・・・秘密鍵
　　id_rsa.pub・・・公開鍵

#作成したファイルを「.ssh」ディレクトリに保存する
※「.」で始まる名前のフォルダは右クリックからのフォルダ作成では作れないのでmkdirコマンドで作成。(.sshフォルダは、windowsでは絶対必要なわけではないらしいが、一応このフォルダに置くのが基本かなぁと思い、私は作成してます。)

#鍵の登録
puttyをインストールした段階でタスクトレイにPutty authentication agentのマークがあるはずなので、右クリックからのポップアップメニューより「View Keys」をクリック。

開いたウィンドウの[add key][remove key]でキーの登録/解除が行える。ここで先ほど作成したprivate keyを登録する。(putty形式の秘密鍵のほう)

※↑の処理は↓の処理と同じ
・ソースツリーのオプションから全般タブを選択し、「SSHクライアントの設定」のSSHキーのところで鍵ファイルを選択するとプライベートキーの設定ができる。

githubにsshキーを登録する手順は割愛。ローカル側でのwindowsのめんどくさいなーと思った部分でした。

#※ソースツリーでsshキーをセットしても、いつまでもgitのリポジトリだと判定されない場合は以下の方法で確認を試みるといいかと思います。
トータスgitをインストールして、それで該当のsshのurlからクローンを試みる。
もともとキャッシュされていた鍵が解除される。
ソースツリーだとキャッシュのクリアができない？らしく、トータスgitではできました。

ざっくりと箇条書きで書きました。上から順番にやっていくだけで、問題なく終わるはず。
gitの鍵作成なんてそんなにやらないしメモしたけど、windowsのやり方、macよりめんどくさい気がする。。
うろ覚えで書いたので抜けがあるかもしれません。
家のPCで復習してみて修正があれば書きます。
Coverage.pyでDjangoアプリケーションのカバレッジを計測する

この記事は[Python その2 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/yet_another_python)の23日目の記事です。

## Djangoでカバレッジを測定する
Djangoでユニットテストのカバレッジを計測するには、[django-nose](https://pypi.python.org/pypi/django-nose)を使うのが定番です。

設定の仕方はちょっと検索すれば、たくさん情報が出てくるのでここでは再掲はしません。Qiita上の記事だと、以下の記事がDjango 1.9がリリースされた現在でも通用します。

- [Django でのテスト](http://qiita.com/seizans/items/2f78f2a263c63c36b267)

試しに[このミニマムなDjangoアプリケーション](https://github.com/hunza/django-sample-app/tree/hotfix-django-nose)に`django-nose`を使うように設定して、カバレッジを計測してみます。

```
$ ./manage.py test sample --with-coverage --cover-package=sample --cover-html
nosetests sample --with-coverage --cover-package=sample --cover-html --verbosity=1
Creating test database for alias 'default'...
.
Name                 Stmts   Miss  Cover   Missing
--------------------------------------------------
sample.py                0      0   100%
sample/settings.py      21      9    57%   58, 76, 112-130
sample/urls.py           4      0   100%
sample/views.py          5      0   100%
--------------------------------------------------
TOTAL                   30      9    70%
----------------------------------------------------------------------
Ran 1 test in 0.011s

OK
Destroying test database for alias 'default'...
```

## Coverage.pyでカバレッジを計測する
ほとんどの場合django-noseを使えば問題ないはずですが、現時点で最新版の`django-nose==1.4.2`では[Django 1.8の新機能に追いついていない点がある](https://github.com/django-nose/django-nose/issues/244)のが気になっています。

またカバレッジを出力しやすいということ以外はdjango-noseの利点を感じにくくなってきたので、Djangoの標準のテストランナーでもいいやという気も強くなってきています。

[このstackoverflowの投稿](http://stackoverflow.com/questions/22726449/django-test-coverage-vs-code-coverage)によると、[Coverage.py](https://pypi.python.org/pypi/coverage)を直接使ってカバレッジを計測することもできるようなので、自分で試してみました。

- [Django test coverage vs code coverage](http://stackoverflow.com/questions/22726449/django-test-coverage-vs-code-coverage)

先ほどのサンプルDjangoアプリケーションでは、[こちらのリビジョン](https://github.com/hunza/django-sample-app/tree/48949c2b018d371c19067214b413da61f2ab52ce)になります。

カバレッジを計測しつつテストを実行。

```
$ coverage run --source=sample --omit='*/tests/*' manage.py test sample
```

カバレッジレポートを出力。

```
$ coverage report
Name                 Stmts   Miss  Cover
----------------------------------------
sample/__init__.py       0      0   100%
sample/settings.py      20      0   100%
sample/urls.py           4      0   100%
sample/views.py          5      0   100%
sample/wsgi.py           4      4     0%
----------------------------------------
TOTAL                   33      4    88%
```

カバレッジレポートをHTMLで`cover`ディレクトリに出力。

```
$ coverage html --directory=cover
```

django-noseのカバレッジ計測機能もCoverage.pyをラップしただけなので、コンソール上のレポートもHTMLレポートもほとんど出力は同じです。

ワーキングディレクトリに`.coveragerc`を定義しておけば、上記のコマンドのオプションを省略可能です。

```
[run]
omit = */tests/*

[html]
directory = cover
```

実行例。

```
$ coverage run --source=sample manage.py test sample
$ coverage report
$ coverage html
```

`.coveragerc`についてはドキュメントを参照。

- http://coverage.readthedocs.org/en/latest/config.html

## 最後に
django-noseではなく、Coverage.pyでカバレッジを計測する例を紹介しました。

django-noseなしだと3回コマンドを実行しないと実現できないことが、django-noseでは1回で出来るので便利なことは間違いないですが、CIでうまく自動化してしまえば、Coverage.pyだけでやるというのも選択肢としてはありですね。
あるとちょっと便利なコマンドラインツール3つ

[マイネット Advent Calender](http://qiita.com/advent-calendar/2015/mynet)22日目の記事です。

開発環境などコマンドラインで作業していて、気が効くなあと思ったものをご紹介します(既に有名ですが)。
どれもbrewでインストールできて、バイナリでも配布されてる(Windowsも!)ので試しに使ってみるのもおすすめです。

## ccat

[jingweno/ccat](https://github.com/jingweno/ccat)

シンタックスハイライトしてくれるcatです。

![ccat.png](https://qiita-image-store.s3.amazonaws.com/0/33898/fc3ea602-dd68-efd0-e26e-d3501dde9be9.png)

## The Platinum Searcher

[monochromegane/the_platinum_searcher](https://github.com/monochromegane/the_platinum_searcher)

超高速なgrep。`.git`やgitignoreなファイルなどを無視して再帰的に検索してくれます。

![pt.png](https://qiita-image-store.s3.amazonaws.com/0/33898/80cb4d05-ed6c-4340-ae56-c386242f20ec.png)

Vimでgrepの代わりに使うコマンドに設定すると便利で速いです。

```vim:.vimrc
set grepprg=pt\ --nogroup\  --nocolor
```

## peco

[peco/peco](https://github.com/peco/peco)

標準入力を受け取って

* インクリメンタルサーチしたり
* 正規表現で検索したり
* (複数)行を選択したり

して標準出力に出力してくれます。

使い方は無限ですが、単純に`ll | peco`で名前が曖昧なファイルを探したりできて便利です。
MySQL WorkbenchでデータベースのデータをER図に出力

掲題の件ですが、やり方がわかりにくかったので、自分用のメモ残します！
下記のサイトを参考にしました。けれど、これもイマイチわかりにくかったです。

http://ryus.co.jp/blog/mysqlworkbench3/


作成する手順としては、下記です

１、MySQL Workbenchからデータベースに接続
２、Database>ReverseEngeenerを押す
３、continueを押し続ける
４、そしたら、ER図の作成完了

sqlファイルをインポーツする必要などはないので、要注意！！
IPythonで、値を見ようと思ったらジェネレータだったのでイラッとしたときに思いついたこと。

IPythonなどのインタラクティブ環境でPythonいじってたら、リスト型じゃなくジェネレータ型だったため、

```pycon
In [2]: foo()
Out[2]: <generator object foo at 0x7f1f35a3dee8>
```

のように表示され、イラッとした経験、あると思います。特にPython3になってから顕著になったと思います。
そんなときは、まぁ、`list(foo())`に修正すればいいわけなんですが。
Ctrl+A (もしくはHome), 'l', 'i', 's', 't', '(', Ctrl+E (もしくはEnd), ')'
と、8キーも押さないといけません。面倒です。イラッとします。

そこでふと思いついたのですが。

```py3
class Apply:
    def __init__(self, f):
        self.f = f
    def __lt__(self, x):
        return self.f(x)

L = Apply(list)
```

と、一度書いてしまえば、

```pycon
In [2]: foo()
Out[2]: <generator object foo at 0x7f1f35a3dee8>
```

イラッとしても、

```pycon
In [8]: foo() >L
Out[8]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
```

ってするだけで、簡単にリストになりますね。
`$HOME/.ipython/profile_default/startup`ディレクトリに`50-apply.py`とでも作っておけば、以後、イラッとしても落ち着いて` >L`でリストにできますね。
ワンライナーで平均と標準偏差を計算する

この計算のために、初めてRをインストールした。

### コマンド
```
R -q -e "x <- read.csv(file='filename',header=F); summary(x); sd(x[ , 1])"
```

### 実行例
```
$ seq 1 10 | R -q -e "x <- read.csv(file='stdin',header=F); summary(x); sd(x[ , 1])"
> x <- read.csv(file='stdin',header=F); summary(x); sd(x[ , 1])
       V1       
 Min.   : 1.00  
 1st Qu.: 3.25  
 Median : 5.50  
 Mean   : 5.50  
 3rd Qu.: 7.75  
 Max.   :10.00  
[1] 3.02765
> 
> 
```

参考文献

- http://stackoverflow.com/questions/9789806/command-line-utility-to-print-statistics-of-numbers-in-linux
- http://stackoverflow.com/questions/16493669/how-to-read-input-from-the-terminal-using-dev-stdin-and-read-csv
typealiasというSwiftの仕様を把握する

Swiftで型の別名を付ける事のできる`typealias`について調べてみました。

## 基本的な使い方
Intのaliasとして使います。

```swift
typealias MyInt = Int

let int: MyInt = 1
print(int)
print(int.value)
```

## 元のクラスにメソッドを追加した場合の動き
元のクラスであるIntに追加したメソッドは反映されます。

```swift
typealias MyInt = Int

extension Int {
    func myMethod() {
        print("My Method")
    }
}

let int: MyInt = 1
print(int.myMethod())
```

## Aliasの型
dynamicTypeで型を調べた所、元の型になりました。
typealiasの名前通り、Intの別名を作っているだけで実態は同じもののようです。

```swift
typealias MyInt = Int

let int: MyInt = 1
print(int.dynamicType) // → Int
```

## 関数のAlias
関数の別名を付ける事もできます。
メソッドの引数部分がすっきりするので、複雑な関数については別名を付けると良さそうです。

```swift
typealias MyBlock = () -> ()

func method(block: MyBlock) {
   block()
}
```

## タプルのAlias
タプルに対して別名を付ける事もできます。
簡単なアプリを作る際は、クラスの代わりにタプルを使うのも手軽で良さそうです。

```swift
typealias User = (id: Int, name: String)
let users = [
    User(id: 1, name: "Name1"),
    User(id: 2, name: "Name2"),
    User(id: 3, name: "Name3"),
]
print(users.first!.id)
```

## クラス内のtypealias
別クラス内で定義した型を使う場合は`ClassForAlias.MyInt`という形で利用する必要があります。

```swift
class ClassForAlias {
    typealias MyInt = Int
}
class MyClass {
    func method() {
        ClassForAlias.MyInt.max
    }
}
```

## protocolのtypealias
protocol内でもtypealiasを使う事ができます。

```swift
protocol MyProtocol {
    typealias MyInt = Int
}
class MyClass: MyProtocol {}

let int: MyClass.MyInt = 1
```

protocol内で宣言だけする事もできます。
その場合はそのprotocolを使うクラスで型の定義をする必要があります。

```swift
protocol MyProtocol {
    typealias MyInt
}
class MyClass: MyProtocol {
    typealias MyInt = Int
}
let int: MyClass.MyInt = 1
```

ややこしいですが、protocol内ではprotocolによる制限をかける事ができます。

```swift
protocol MyProtocol {
    typealias MyInt: IntegerType // MyIntはIntegerTypeに準拠している必要がある
}
class MyClass: MyProtocol {
    typealias MyInt = Int // typealias MyInt = Stringなどはできない
}
```

MyIntが特定の型の時だけextensionによるメソッド追加をする事ができます。

```swift
protocol MyProtocol {
    typealias MyInt
}
class MyClass: MyProtocol {
    typealias MyInt = Int
}
extension MyProtocol where MyInt == Int {
    func method() {}
}
MyClass().method()
```

MyIntが特定のプロトコルを使ってるかどうかで絞り込みもできます。

```swift
protocol MyProtocol {
    typealias MyInt
}
class MyClass: MyProtocol {
    typealias MyInt = Int
}
extension MyProtocol where MyInt: IntegerType {
    func method() {}
}
MyClass().method()
```

コメントで教えて頂いたのですが、この辺りはSwift3.0で一部キーワード名が変わるかもしれません。

https://github.com/apple/swift-evolution/blob/master/proposals/0011-replace-typealias-associated.md
ノート感覚でマーカーを利用し直感的に情報共有

ノート感覚でコメントや画像にマーカーをつけて情報共有を行うサービス

![markerchat.jpg](https://qiita-image-store.s3.amazonaws.com/0/101165/76767c13-5dba-9122-62af-367a6067a916.jpeg)


チャットとしても利用可能ですが、チャットを主目的に利用するには適しません。
チャットだとすぐに返信しなければならないような強迫観念が襲う為、(私が)嫌いだからです。

リアルタイム更新(push通知)に対応させたのは、（わがままですが）時にはチャットのようにやり取りした方がいい場合がある事を考慮してです。


開発した動機は、文章を書くのも、読むのも得意ではないので、箇条書きで詳細な情報を記述できるものが欲しかった為です。（既存のブログや掲示板だと箇条書きしたものの下に詳細を記述しなければならず、把握しずらいと思っていた。）

開発目標
- Linuxなどの各種設定ファイルのDefaultと変更部分をすぐに把握できるようにする。
- 手順書などで、大まかな手順を箇条書きにし、詳細部分を分かりやすくなるようにする。
※マーカー部分をクリックする事で、当該マーカー詳細に飛ぶようになっておりますので、個人的には満足です。

[MarkerChat ノート感覚でマーカーを利用し直感的に情報共有を行うサービス](http://www.markerchat.com)

![20140902225905.gif](https://qiita-image-store.s3.amazonaws.com/0/101165/1efd1847-593e-dac1-021d-43e72ec7e156.gif)

![20140902225958.gif](https://qiita-image-store.s3.amazonaws.com/0/101165/aaa1a648-4cc0-4cb1-a4aa-106ce2093a4c.gif)



以下は私の実際の手順書メモです
![sample (1).png](https://qiita-image-store.s3.amazonaws.com/0/101165/b1af80e8-4889-5d0f-768c-aeb0bc59af0f.png)
FreeMarkerでちょくちょく見る記法や、おっ！と感じたTips集

こんにちは、スマートフォン向けソーシャルゲームのフロントエンドやってます。
うちのプロジェクトでは**[FreeMarker](http://freemarker.incubator.apache.org/)**というJavaのテンプレートエンジンを使っています。

[Freemarkerのリファレンスの使い方でよく使用するものを日本語でまとめ](http://iwb.jp/freemarker-reference/)

こちらのブログは簡潔で分かりやすく、とても気に入っています。
ただ、ここに書かれてはいないけれど、よく使われているものは当たり前ですがまだ沢山あります。
今までプロジェクト内で見てきたもので、この書き方いいなあと思ったものや、自分が書いたものでこれはまたそのうち書きそうだな、と感じたものを少しだけコメントも交えてまとめようと思います。

上記の記事の内容を一通り頭に入れた後にこの記事を見ると、うちのプロジェクトの大抵のページのコードがFreeMarkerの観点でいえば、問題なく読めることを目指しています。

---

## ?string

### flg?string('hoge', 'fuga') - 三項演算子みたいな


```
<#assign flg = true>
${flg?string('flgはtrue', 'flgはfalse')}
```
> flgはtrue

jsでいう`flg ? 'hoge' : 'fuga'`みたいなことができます。  


### date?string('yyyyMMddHHmmss') - 日付表現

```
<#assign date = 201503252200?datetime('yyyyMMddHHmm')>
${date?string('yyyy年MM月dd日HH時mm分')}
```
> 2015年03月25日22時00分


### seconds?string('00') - ゼロ埋め

```
<#assign restTime = {'minutes' : 5, 'seconds' : 3}>
${restTime.minutes}:${restTime.seconds?string('00')}
```
> 5:03

「0:00」のような表記をしたいのに、数値型で値が来てしまい「0:0」となってしまうのを防げます。


## その他ビルトイン

### ?datetime('yyyyMMddHHmm')

```
<#assign dateNum = 201511262200>
${dateNum?datetime('yyyyMMddHHmm')?string('MM月dd日')},

<#assign dateStr = '2015年11月26日22時00分'>
${dateStr?datetime('yyyy年MM月dd日HH時mm分')?string('yyyy/MM/dd HH:mm')}
```
> 11月26日, 2015/11/26 22:00


### 大文字、小文字、一文字目大文字
```
<#assign str = 'hoGe'>
${str?upper_case}, ${str?lower_case}, ${str?capitalize}
```
> HOGE, hoge, Hoge


## #{q} - 小数を四捨五入せずに表示

```
<#assign q = 2.6>
${q}, #{q}
```
> 3, 2.6


## list

### 1..n - 配列なしで指定回数回したいとき

```
<#assign n = 5>
<#list 0..n as i>
	${i}
</#list>
```
> 0 1 2 3 4 5


## Tips

### <#assign list = list + [item]>

```
<#assign inputList = ['hoge', 'fuga']>

<#assign outputList = []>
<#list inputList as item>
	<#assign outputList = outputList + [item]>
</#list>

<#list outputList as out>
	${out}
</#list>
```
> hoge fuga

push(item)みたいなことができるのか、なるほどと感じました。

### ${['zero', 'one', 'two', 'three'][n]}

```
<#assign n = 2>
${['zero', 'one', 'two', 'three'][n]}
```
> two

数字って素晴らしいなと思いました。

### ${item['${key}']}
```
<#assign item = {'name': 'hoge'}>
<#assign key = 'name'>
${item['${key}']}
```
> hoge

入れ子にできるみたいで書いてて驚きました。
これからSwiftを始める場合に注意した方がいい3つの事

自分自身がSwiftをやって困っている点・周りの人が新しくSwiftを始めた時に困ってる点を書いてみました。

## 1. 古い記事のサンプルコードが動かない
Swiftも最初の発表から1年半近く経ちインターネット上の記事が非常に充実してきました。
しかし2015年9月以前の記事のサンプルコードはそのままでは動かない事が多いです。

2015年9月はSwift2.0の正式版がリリースされました。
Swift2.0の発表時は`protocol extension`や`try-catch`など機能の追加が注目されましたが、それ以外にも様々な変更がありました。
それに伴い既存の記事のサンプルコードも修正が必要なものが多く出てきました。

大きな修正としては`try-catch`導入があります。
`try-catch`を導入した事でエラー処理方法が変わっているライブラリが多々あります。
他にもグローバルな関数がクラスに移動したり、メソッドの引数が微妙に変わっていたりと多くの変更がありました。

Swiftを始める際は極力新しい情報を探す事が重要かと思います。

## 2. ライブラリの保守が追いつかない
Swiftを始める際はライブラリとの付き合い方も気をつける必要があります。
Swift2.0になり多くのライブラリはSwift2.0対応をしたのですがまだ対応されていないライブラリも時々遭遇します。
有名なライブラリは大抵対応されているのですが、小さいライブラリは対応されてない事が多いです。

Swiftの場合は 最新iOSに対応する必要がある → 最新のXcodeを使う必要がある → Swiftも併せてアップデートされる という流れになるので、ライブラリの対応を待ちきれない点も厄介です。

それと結構前はSwiftのライブラリをCocoaPodsで使えないという問題がありましたが今は解消しています。
対応OSをiOS8.0以上にする必要はありますが、Podfileで管理できるようになっています。

## 3. Xcodeが少しおかしい動きをする
XcodeのSwift対応はまだ怪しい所があります。
「Xcodeが時々補完が効かなくなる」「リファクタリング機能を使った名前変更ができない」「ブレークポイントを仕掛けるとXcodeが落ちる事がある」などがあります。
1と2に比べると小さい問題ですが時々困るので今後の改善に期待しています。

逆に昔言われていたビルド速度の遅さについては大分改善されてきましたので(差分ビルドも動いていそう)その辺りは安心して使えるかと思います。

## 参考URL
[Swift 2.0 大域関数の行方から ](http://www.slideshare.net/tomohirokumagai54/swift-20-49927701)
Spark MLlib (ML Pipeline) の決定木モデルの木構造をダンプするコード

決定木はそのロジック的にモデルの解釈がしやすくて、意外と現実世界で利用されることが多いような気がします。

そんなわけで、Spark MLlib (ML Pipeline) の [決定木](http://spark.apache.org/docs/latest/mllib-decision-tree.html) のモデルについて、その構造を標準出力する機能を作ったのでメモとして残して置きます。

```scala
package biz.k11i.spark.misc

import org.apache.spark.ml.classification.DecisionTreeClassificationModel
import org.apache.spark.ml.tree.{CategoricalSplit, ContinuousSplit, InternalNode, LeafNode}

/**
  * spark.ml の DecisionTreeClassificationModel の木構造を標準出力に書き出す。
  */
object DecisionTreePrinter {
  def printTree(model: DecisionTreeClassificationModel): Unit = {
    model.rootNode match {
      case node: InternalNode => printNodes(node, 0)
      case leaf: LeafNode => printLeaf(leaf, 0)
    }
  }

  def printNodes(node: InternalNode, numIndents: Int): Unit = {
    val indents = "  " * numIndents

    node.split match {
      case cat: CategoricalSplit => println(s"${indents}category, featureIndex=${cat.featureIndex}, left=${cat.leftCategories.mkString(",")}, right=${cat.rightCategories.mkString(",")}")
      case con: ContinuousSplit => println(s"${indents}continuous, featureIndex=${con.featureIndex}, threshold=${con.threshold}")
    }

    Seq(node.leftChild, node.rightChild).foreach {
      case internalNode: InternalNode => printNodes(internalNode, numIndents + 1)
      case leafNode: LeafNode => printLeaf(leafNode, numIndents + 1)
    }
  }

  def printLeaf(node: LeafNode, indent: Int): Unit = {
    val indents = "  " * indent
    println(s"${indents}prediction=${node.prediction}")
  }
}
```

これにちょこっと手を加えれば、Random forest のモデルも Gradient-boosted trees のモデルも同様にダンプできると思うけど、面倒くさいのでまた今度。
パイプラインの考え方

## パイプラインの考え方

元となるデータを集めて、それを徐々に加工していくイメージ。

## 処理の基本的な流れ

コレクションを……

1. 取得する
2. 絞り込む
3. 加工する
4. 利用する

※[yuroyoro](http://qiita.com/yuroyoro) さんの「[Scala的な考え方 - Scalaがとっつきにくいと思っている人へ](http://yuroyoro.hatenablog.com/entry/20100317/1268819400)」を参考にしました。

## 例

[訪日外国人旅行者向け無料公衆無線 LAN スポットの一覧](https://www.hokoukukan.go.jp/free_wifi.html)のうち、駅構内に設置されているスポットの数を都道府県ごとに集計します。

```ps1
# 1. コレクションを取得する（CSV ファイルを読み込む）
Import-Csv -Path jta_free_wifi.csv -Encoding Default |
# 2. 絞り込む（駅構内に設置されているスポットに限定する）
?{ $_.カテゴリー -match "鉄道" } |
# 3. 加工する（都道府県ごとにスポット数を集計する）
Group-Object 都道府県 | Select-Object Name, Count | Sort-Object Count -Descending |
# 4. 利用する（集計結果を CSV ファイルに出力する）
Export-Csv -Path ranking.csv -Encoding Default -NoTypeInformation
```

## 個人的な背景

少し前まではパイプラインに「前のコマンドの出力をそのまま次のコマンドの入力にできるから便利」程度の認識しか持っていなかったので、コマンドをどのように連携させればいいのか分からず、複数のコマンドを組み合わせて処理を行うことがうまくできていませんでした。

その後 PowerShell を触り始めると、パイプラインでオブジェクトのコレクションを渡すという PowerShell 仕様のおかげで「集めたデータを徐々に加工することで処理を完了させる」という考え方ができるようになり、以前と比べコマンドをうまく使えるようになってきました。

この考え方は大事だなと思ったので、備忘録として残しておきます。

Unix系OSを触っていたときは、この考え方にはたどり着けませんでした。データを行で管理するかコレクションで管理するかの違いでしかなくて、本質的には同じはずですが……（´・ω・｀）
Googleアドセンスにログインできなかったのが、スマホアプリで解決した件

## まずは答えから

「このアカウントは既に AdSense で使用されています。」とエラーが出てAdsenseにログイン出来ない時は、スマホアプリ版のAdSenseに一回ログインすると、Webからもログイン出来るようになりますよ。

## 経緯

数年ぶりに GoogleAdsenseにログインしようとしたら、アカウントにログインできなかった。

* 「このアカウントは既に AdSense で使用されています。」と出る
* 「新しいアカウント or このアカウントでログイン」と出る
* 「このアカウントでログイン」すると、強制ログアウトさせられ「ログインor新規登録」なページに行く
* 「新規アカウント作成」にいくと、新しいgoogleアカウント(=gmailの登録）にいっちゃう

いろいろ調べて試した結果、以下はダメだった。

* Chromeのシークレットモード
* 別ブラウザ(OSX, Safari)
* 別PC(Win10, Chrome)
* スマホブラウザ(iOS, Safari)
* Adsenseにログインできないのトラブルシューティング…


新しいアカウントとっても良かったんだけど、混乱しそうなのでこのアカウントを使いたかった。

とりあえず、AppStoreからAdSenseのアプリをDLして入れてログインしたら治った。

おそらく、規約が更新されまくってたのを放置してたのが原因だと思う。
一回スマホ版でログインするだけで治った。Web版にログインし直すと「規約にOKしてね」が出て、それでOKだった。
bash-completionを使用したsshのホスト名を自動補完

#実現したいこと
bashコマンドの補完を強化してくるbash-completionを使用して、
独自に作成したスクリプトの実行結果（IPアドレスとホスト名のリスト）を読み込んで、sshのホスト名自動補完を実現したい。
sshのホスト名自動補完では、デフォルトでは/etc/hosts~.ssh/config~/.ssh/known_hostsが読み込まれるようだが、
ここに独自スクリプトの実行結果の読み込まれるようにしたい。
今回は、PowerDNSの全レコードをAPIを使用して取得し、その結果を用いてsshのホスト名自動補完を実現する。

#環境
CentOS 6.4
bash-completion 1.3-5

#インストール方法

```
## バージョン確認
$ rpm -qa | grep bash-completion
bash-completion-1.3-5.el6.noarch

## epelリポジトリを有効にするしてからインストールする。
$ sudo yum install bash-completion
```

#やったこと
当初どのようにやろうかと迷っていたら、
似たようなことを既に実現した方がいらしたので、そちらをそのまま試してみることに。
参考：[consul membersの結果でbash補完する](http://qiita.com/sfujiwara/items/f4fa907ead53ed104e1a)

上記ページを見ると、_known_hosts_real()の中身をごっそり書き換えた
今回は、/etc/bash_completionに追記する形で対応した。
 
```
_known_hosts_real()
{
    local pdns_list=$(pdns-cli list)
    COMPREPLY=( $( \
        compgen -W "$pdns_list" \
        ${COMP_WORDS[COMP_CWORD]} \
    ))

    return 0
}
```


上記はpdns-cliスクリプト（自家製）の実行結果を最終的に「COMPREPLY」という配列に値を入れています。
ただし、「COMPREPLY」にいれるだけだと、sshでタブ補完しようとした際、関係のない全ホスト名が候補として表示されてします。
そこでcompgenコマンドで入力した文字にマッチするものだけを表示するよう処理をしています。
この辺で実行しているコマンドの解説は以下のページが参考になりました。
参考：[Bashの補完について](http://rcmdnk.github.io/blog/2015/05/14/computer-linux-mac-bash/)
[Julia] REPLの中でプログラムソースを取り込むには

# はじめに
　Julia の REPL の中で、プログラム・ソースを読み込む方法を紹介します。関連するディレクトリ操作の命令も説明します。
　以下では、Windows上での実行例を示します。

# include : プログラム・ソースを読み込む
　`include(path)` は、外部ファイルを読み込んで評価(実行)します。`path` は、読み込むファイルのパス名です。

　例えば、Windows ユーザの `tenfu` さんが、デスクトップに作った `a.jl` というファイルを読み込むには

```jlcon
julia> include("c:\\Users\\tenfu\\Desktop\\test.jl")
bar (generic function with 1 method)
```

と打ち込みます。`\`は エスケープ文字ですから、二つ重ねないといけません (`\` は (半角の) `￥` に見えるかもしれません) 。
　ファイルを読み込むと、そのファイルを評価した結果が印字されます。上では、関数 `bar` を定義したと表示されました。
　指定したパスにファイルが見つからないと
`ERROR: could not open file ファイル名`
という例外が発生します。

# カレント・ディレクトリの操作
　パス名は (カレント・ディレクトリを基準にした)相対パスで指定することもできます。そのためには、カレント・ディレクトリを操作できないといけません。Un*x シェルのコマンドと同じ命令が、Juliaで使えます。以下で説明しない命令は、Julia のドキュメントを参照してください → Julia FileSystem http://docs.julialang.org/en/release-0.4/stdlib/file/

## pwd : カレント・ディレクトリを得る
　`pwd()` で、カレント・ディレクトリの文字列が得られます。

```jlcon
julia> pwd()
"c:\\users\\tenfu\\desktop"
```

　`include`の引数に、相対パスを指定できます。

```jlcon
julia> include("test.jl")
julia> include("..\\desktop\\test.jl")
```

## cd : カレント・ディレクトリを変更する
　`cd()` で、カレント・ディレクトリを変更します。

```jlcon
julia> cd("c:\\users\\tenfu\\Documents")

julia> pwd()
"c:\\users\\tenfu\\Documents"
```

## ファイル名は入力補完できる
　REPLで、ファイル名・ディレクトリ名を補完できます。
　例えば、`cd("c:\\users\\tenfu\\` などと、ディレクトリの区切り文字 `\\`を打ち込んだ時点で、TAB文字を入力すると、そのディレクトリのファイル名一覧が得られます。
　ファイル名を途中まで打ち込んだ時点で、それに続くファイル名の候補が一つしかなければ、TAB入力で補完されます

# edit : エディタを起動する

　`edit(path, [line])` で、エディタを起動します。`path` は編集するファイルのパス名です。第2引数 `line` は行番号です (省略すると `1` )。

```jlcon
julia> edit("c:\\users\\tenfu\\Desktop\\test.jl")
Unknown editor: no line number information passed.
The method is defined at line 1.
julia> 
```
　起動するエディタは、環境変数 `JULIA_EDITOR`, `VISUAL`, `EDITOR` に (そのパスを)設定しておきます。
　起動するエディタが指定されていないと、`Unknown editor` のメッセージがでます。Windows環境では、そのファイルを編集するアプリケーションが起動されます (あるいは、それを指定するように促されます)。
　エディタが起動すると、プロンプトに戻ります。

　エディタの起動には、もう一つの方法があります。
　`edit(func, [types])` とすると、関数 `func` を定義したファイルを編集します。第2引数 `type` (省略可)には、編集したい関数 `func`の型を指定します。

```jlcon
julia> edit(bar)
Unknown editor: no line number information passed.
The method is defined at line 7.
```
　関数に複数の型があり特定できない場合は `ERROR: function has multiple methods;` の例外が出ます。`methods(func)` で関数型を調べて、特定しましょう。
　この命令で編集できる関数は、プログラム・ソースが与えられた関数です。REPLから直接定義した関数は編集できません (残念です)。
　ユーザが定義した関数だけでなく、Julia ライブラリの関数も、定義された場所が特定でき、編集できてしまいます。副作用を残さないように、注意してくださいね。

# less : 関数定義を閲覧する
　
　関数定義を閲覧したいなら、`edit`ではなく、`less` を用いる方が安全です。
　`less(func, [types])` とすると、関数 `func` を定義したソース(の部分)を閲覧できます。第2引数 `type` (省略可)には、閲覧したい関数 `func` の型を指定します。

```jlcon
julia> less(bar)
    foo()
end
```

# REPLとエディタを用いた開発手法

　自分の使いなれたエディタで、Julia プログラムを編集しましょう。`include`命令を用いてソースプログラムを読み込んだら、REPLから、すぐに関数動作を試すことができます。

　REPLや Jupyter で以前作業していた際、注意すべき振舞いに遭遇しました。( 例 → http://qiita.com/tenfu2tea/items/6bcbdd7586ea070cc25d の最終パラグラフからコメントの議論を参照。本文は 2015/12/23時点で未修正ですが、そのうち修正します)。この振舞いにびっくりないためにも、プログラムはファイルに書いて読み込んだ方がよいです。
curlでHipChatへファイルアップロード（ファイル名を変えて・メッセージを添えて）

#使ったもの
- bash (v4.3)
- curl (v7.43)
- HipChat

#curlでファイルアップロード
まずは単純なファイルアップロードから

```bash:file-upload.sh
#!/bin/bash
FILEPATH=/foo/bar/baz
curl -X PUT \
  -F "file=@${FILEPATH}" \
  https://www.example.com/files/
```
-Fオプションを使って"@ファイル名"とするだけでファイルを読み込んでくれるから簡単ですね。

#curlでHipChatへファイル共有
先ほどのスクリプトをベースに、HipChatへファイルを送るには
[HipChat - API - Share file with room](https://www.hipchat.com/docs/apiv2/method/share_file_with_room)
このAPIを利用します。

```bash:hipchat-share-file.sh
#!/bin/bash
AUTHTOKEN=`cat .authtoken`
ROOMID=roomid
FILEPATH=/foo/bar/baz
curl -X POST \
  -H "Content-type: multipart/related" \
  -F "file=@${FILEPATH}" \
  https://www.hipchat.com/v2/room/${ROOMID}/share/file?auth_token=${AUTHTOKEN}
```
ヘッダにmultipart/relatedを足しておくことと
auth_tokenに、指定した部屋に対してsend_messageの権限を持ったものを使うことに気をつければ、そこまで難しくはないと思います。

#ここからが本題
よく見かける説明はここまでで、

- アップロード時にファイル名を変える
- メッセージと一緒に送る

という例があまり見当たりません。
というわけで・・・

#curlでHipChatへファイル名を変えてファイル共有
元のファイル名をそのままHipChat上に表示するのではなく、
任意の名前の変えて表示できるようにします。

APIのページの"Example Request"のところで、"filename="upload.png"とあるので

```bash:share-file-change-name.sh
#!/bin/bash
AUTHTOKEN=`cat .authtoken`
ROOMID=roomid
FILEPATH=/foo/bar/baz
curl -X POST \
  -H "Content-type: multipart/related" \
  -F "file=@${FILEPATH};filename=hoge.txt;type=text/plain" \
  https://www.hipchat.com/v2/room/${ROOMID}/share/file?auth_token=${AUTHTOKEN}
```
このように、ファイルを指定する際に";filename={任意のファイル名}"とすることで、アップロード元のファイル名とは異なるファイル名で表示することができます。
この例では"hoge.txt"として表示されます。
";type=text/plain"は送るファイルの形式にあったContent-typeを指定してあげてください。

#curlでHipChatへメッセージを添えてファイル共有
ついでに、ファイル共有すると同時にメッセージも送ってみます。
こちらもファイル名を変えた時と同じように"Example Request"が参考になります。

```json:/hoge/fuga/piyo.json
{
  "message" : "Please check this file!"
}
```
```bash:share-file-change-name.sh
#!/bin/bash
AUTHTOKEN=`cat .authtoken`
ROOMID=roomid
MESSAGE=/hoge/fuga/piyo.json
FILEPATH=/foo/bar/baz
curl -X POST \
  -H "Content-type: multipart/related" \
  -F "metadata=@{MESSAGE};type=application/json" \
  -F "file=@${FILEPATH};filename=hoge.txt;type=text/plain" \
  https://www.hipchat.com/v2/room/${ROOMID}/share/file?auth_token=${AUTHTOKEN}
```
この例では、送るメッセージを別ファイルにして、metadataパラメーターで送っています。
メッセージファイルの中身はJSON形式で、"message"キーに表示したいメッセージを設定します。
その時に";type=application/json"もお忘れなく。

ファイルと一緒にメッセージを送る場合は、メッセージもファイルにして
-Fオプションで読み込むのが簡単でいいと思います。


#さいごに
HipChatへファイルアップロードする方法はいろいろなところで見かけるのですが、
ファイル名を変えたり、メッセージも一緒に送ったりといった方法が載っていなかったので
自分のメモを兼ねて投稿してみました。
HipChatでファイルを共有する際の参考になれば幸いです。
Emacsからネタ画像を検索したい

## Emacsからtiqavを使う

突然ですが、[tiqav](http://tiqav.com/)というサービスをご存知でしょうか？一言でいうとチャットでのレスポンスなどに使えるちょっとしたネタ画像を検索できるサービスで、わたしも~~同僚を煽るために~~業務上のコミュニケーションを円滑に進めるためによく使っています。

ただブラウザから使おうとすると、tiqavのサイトを開いて、検索窓にキーワードを入れて、目的の画像をマウスでクリックして……と意外と手順が多く面倒です。オモシロ画像を貼るためにせっせとマウスでURLをコピペする姿も、ウケるために必死な感じが出てしまいますしあまり人に見られたくありません。

何かもっと楽な方法は無いかと考えていたところ、いつも使っているEmacsに画像を表示する機能があったことを思い出したので、Emacsからtiqavの画像を検索して結果を選択する`helm-img-tiqav`というコマンドと、汎用的な処理を切り出した`helm-img`というライブラリを作ってみました。

![helm-img.gif](https://qiita-image-store.s3.amazonaws.com/0/14347/e04ec311-b71f-a1a8-eb1d-a55f3b316e41.gif)

ミニバッファで指定したキーワードでtiqav検索して結果をhelmバッファに表示し、選択した画像のURLをコピーすることができます。そんなに難しいことはしていないのですが、helmの候補として画像を表示するというアイディアが実は新しいのではないかと自分では思ってます。

## インストール

ソースはgithubにあるので、わかる人はためしにloadして使ってみてください。
コア部分とtiqav固有の処理を分離しているのでhelm-img.elとhelm-img-tiqav.elがload-pathに存在する必要があります。

* [http://github.com/l3msh0/helm-img](http://github.com/l3msh0/helm-img)
* [http://github.com/l3msh0/helm-img-tiqav](http://github.com/l3msh0/helm-img-tiqav)

先ほどMELPAにも申請のpull-reqを投げたので、近日中にMELPA経由でインストールできるようになると思います。MELPAに載った際にはこの記事でもお知らせしますので、気になる方はこの記事をストックしておいていただくとQiitaの通知で更新を確認できてよいかもしれません。

(2015/12/31追記)
先日パッケージがMELPAに登録されましたので、`package-archives`にMELPAが登録されていれば`M-x package-install RET helm-img-tiqav`でインストールすることができます。

インストール後は`M-x helm-img-tiqav`でコマンドを実行してください。

## 普通の画像検索もしたい

tiqavを検索できるようになったのは良いのですが、ピンポイントで何かの画像が欲しい時にはやはりGoogle画像検索など汎用の検索エンジンも使いたくなります。そのようなケースを考慮し、今回作成した`helm-img`は入力を受け取ってURLのリストを返す関数だけ用意するだけで他の検索ソースも簡単に追加できるようになっています。実際、MicrosoftのBing Search APIを利用して画像検索を行う`helm-img-bing`コマンドもこの機構を使って簡単に実装できたので、`helm-img`のリポジトリに一緒に入れておきました。

以下のようなコードで比較的簡単に`helm-img`用のsourceを定義できるので、誰かtiqavやbing以外にも面白いsourceを追加してもらえるとうれしいです。

```scm
(require 'helm-img)

;;; 指定したディレクトリにある画像をhelmバッファに表示する例

;; 入力を受け取り画像パスのリストを返す関数
(defun helm-img-dir-make-candidates (dir)
  (directory-files (expand-file-name dir) t "\\.png\\|\\.PNG\\|\\.jpg\\|\\.JPG"))

;; helmのsourceを定義するマクロを呼ぶ
;; 第1引数にhogeを渡すと、helm-img-source-hogeという名前でhelmのsourceが定義される
;;
;; :candidate に引数を1つ取りURLかファイルパスのリストを返す関数を渡せば、
;; URLからの画像を取得する処理などはマクロ側で吸収してくれる。
;;
;; 単なるリストではなく '(('thumb . "サムネイルのURL") ('full . "元サイズ画像のURL)) 形式の連想リストのリストを返すと、
;; helmバッファには元画像ではなくサムネイルを表示することができる。
(helm-img-define-source "dir" :candidates 'helm-img-dir-make-candidates)

;; 定義したsourceを用いてhelmコマンドを実行する。パラメータはhelm-img-queryにバインドする。
(defun helm-img-dir (dir)
    (interactive "DDirectory: ")
    (let ((helm-img-query dir))
      (helm
       :sources helm-img-source-dir
       :buffer "*helm image dir")))

(provide 'helm-img-dir)
```

## 課題

* elispに不慣れなため実装が素朴
* 画像の取得を1つずつ同期処理で行っているので件数が多いと結構遅い
* ドキュメント

この辺はまだまだ不足していると思うので年末年始にでも対応していきたいと思っています。

## 終わりに

helm-imgはもともと9月に札幌で開かれた[Emacs寄合](http://niku.name/articles/2015/09/19/Emacs寄合を開いた)に参加させてもらった時に作りはじめたものでしたが、アドベントカレンダーによる締切効果もありなんとか年内に公開できる形に漕ぎつけることができました。わたしは基本怠惰な人間なので、こういう機会でも無ければなかなかパッケージを作るというところまではできなかったと思います。きっかけを作ってくださった @niku さん、LingrのEmacs部屋で相談に乗っていただいた皆さん、どうもありがとうございました。
UE4 でアクターを定義してみる

# 環境
UE 4.10.0
Visual Studio 2015

# 概要
Unreal Engine 4 を触ってみて動作を確認する
まずはチュートリアルに習い、アクターで動くものを作ってみる

# 本文

## プロジェクト作成
[新規プロジェクト] -> [C++] を選択
プロジェクト名を ActorTest とし、プロジェクトを作成

## クラス追加
[ファイル] -> [C++クラスを追加] 
親クラスに「アクター」を選択し、ファイル名を Actor1 としてクラスを作成
こうすると新規 C++ コードが追加され、ついでにコンパイルされる

## コンテンツブラウザを確認
コンテンツブラウザに先ほど追加した Actor1 クラスが追加されている
Actor1 をビューポートにドラッグ＆ドロップするとアウトライナーに Actor12 という
名前でオブジェクトが追加されている

## コンポーネントを追加してみる
エディタの [ウィンドウ] -> [詳細] -> [詳細1] で詳細ウィンドウを開いておく
Actor12 オブジェクトをクリックすると詳細ウィンドウに Actor12 オブジェクトの詳細
が表示される。
[コンポーネントを追加] ボタンで、基本形状の球を選択
これで、ビューポート上で球体を動かす準備ができた

## コンパイルしてみる
エディタに [コンパイル] ボタンがあるので、それで実行できる
もしくは Visual Studio でいつも通りビルドすればエディタに反映される

## 実行してみる
エディタに [プレイ] ボタンがあるので、それで実行できる
現状で実行すると球が半分地面に埋まった画面が見えるはず

## 追加されたコード
追加されたコードを確認してみる。
以下のコードのテンプレートが出来ているはず

[Actor.h]
 #include "GameFramework/Actor.h"
 #include "Actor1.generated.h"
UCLASS()
class ACTORTEST_API AActor1 : public AActor
{
    GENERATED_BODY()
public:	
    AActor1();

    virtual void BeginPlay() override;

    virtual void Tick( float DeltaSeconds ) override;
};

[Actor.cpp]
 #include "ActorTest.h"
 #include "Actor1.h"

AActor1::AActor1()
{
    PrimaryActorTick.bCanEverTick = true;
}

void AActor1::BeginPlay()
{
    Super::BeginPlay();
}

void AActor1::Tick( float DeltaTime )
{
    Super::Tick( DeltaTime );
}

## コードの中を検証して修正してみる
いくつか謎のマクロが定義されているが、それ以外は普通のクラス
コンストラクタ、BeginPlay、Tick メソッドが実装されている

たぶん BeginPlay が、実行前にコールされる初期化メソッドで Tick が毎フレームの
更新処理なんだろう。BeginPlay に座標を設定すれば地面に埋まった球体を地面の上に
表示できるはず

## BeginPlay 修正
座標を設定しなおすと、意図通りの挙動になった
高さを修正するのにベクトルの Z を変更する必要があるらしい
( デフォルトでは Y UP ではなく、Z UP らしい )
この辺りは設定を変更できないだろうか？
まぁ、数学の計算はライブラリのものを使用するだろうから別に問題ないが
void AActor1::BeginPlay()
{
    Super::BeginPlay();
	
    FVector pos = GetActorLocation();
    pos.Z = 100.0f;
    SetActorLocation(pos);
}

## Tick 修正
徐々に球体が浮かぶようにコードを修正してみる
void AActor1::Tick( float DeltaTime )
{
    Super::Tick( DeltaTime );

    FVector pos = GetActorLocation();
    pos.Z += 0.05f;
    SetActorLocation(pos);
}

# まとめ
これで UE4 でオブジェクトを動かす下準備が整ったので、色々動かしてみようと思う
【Karma + Jasmine】通信を含む場合のテストコード

通信を含むメソッドのテストを書く．

``` coffeescript
# sample.coffee

class Sample
    getData: ->
        url = "http://example.com/1/json"
        
        xhr = new XMLHttpRequest()
        xhr.open("GET", url, false)
        xhr.send()
        
        data = null
        
        if xhr.status is 200
            data = JSON.parse(xhr.responseText)
            
        return data
```

`.getData` のテストを書く際に，xhrの通信部分をスタブしたい．

[jasmine-ajax](https://github.com/jasmine/jasmine-ajax)，[jasmine-jquery](https://github.com/velesin/jasmine-jquery) を使用する．

```
$ npm install jasmine-ajax --save-dev
$ npm install jasmine-jquery --save-dev
```

```coffeescript:sampleSpec.coffee
describe Sample, ->
    beforeAll ->
        jasmine.Ajax.install()
    afterAll ->
        jasmine.Ajax.uninstall()
    
    describe '.getData', ->
        beforeEach ->
            mockedData = {sample: 1}
    
            requestUrl = "http://example.com/1/json"
            jasmine.Ajax.stubRequest(requestUrl).andReturn
                status: 200
                responseText: JSON.stringify(mockedData)
                
            @sample = new Sample()
            
        it 'should got data', ->
            expect(@sample.getData().toBe({sample: 1})
```

beforeAllで `jasmine.Ajax.install()` する．
`.getData()` 呼び出し時のxhrリクエストをスタブし，返り値のテストをしている．
パイプライン入力を受け取るパラメータの指定方法

## 疑問

* パイプしたオブジェクトはどのパラメータに渡されるのか？
* 複数のパラメータがパイプライン入力を受け取る場合、受け取り先をどう指定するのか？

## 基本的な受け取り方

PowerShell ではパラメータごとにパイプライン入力の可否が設定されており、許可されたパラメータのみにオブジェクトが渡されます。

また、複数のパラメータがパイプライン入力を受け取る場合、それぞれのパラメータには基本的にパラメータ名と名前が一致する「パイプされたオブジェクトのプロパティ」が渡されるようになっています。

## 各コマンドレットにおける受け取り方の確認方法

各コマンドレットの詳細は `Get-Help <コマンドレット名> -Full` で確認できます。

パイプライン入力の可否は「パイプライン入力を許可する」に記されており、パラメータ名と一致するプロパティのみ受け取る場合には `ByPropertyName` が指定されています。

|パイプラインの入力を許可する|ByPropertyName|受け取るもの|
|:-:|:-:|:--|
|false|-|パイプライン入力を受け取らない|
|true|指定なし|パイプされたオブジェクト|
|true|指定あり|パラメータ名と一致する、パイプされたオブジェクトのプロパティ|

なお `ByValue` が指定されているときには、パイプされたオブジェクトとパラメータの型が一致している場合、もしくは型変換が可能な場合にのみ受け取ることができます。

パイプラインの詳細は `Get-Help About_Pipeline` で確認できます。
h2oでhttp2を試してみる

h2oでもhttp2を試してみた記事です。

h2o
https://github.com/h2o/h2o
https://h2o.examp1e.net/

<h4>環境</h4>
CentOS Linux release 7.1
vagrant 
<h4>事前準備</h4>

`````
#yum groupinstall "Development Tools"
#yum install cmake libyaml-devel zlib zlib-devel openssl-devel libssl-#devel libuv wslay gcc bison
``````

<h4>本体のインストール</h4>

``````
#git clone https://github.com/h2o/h2o.git
#git submodule update --init --recursive
#cmake .
#cmake -DWITH_BUNDLED_SSL=on .
#make
#make install
``````

<h4>設定</h4>

``````
cd /home/vagant/h2o/examples/h2o/h2o.conf
vi /home/vagrant/h2o/examples/h2o/h2o.conf
``````

``````lang:h2o.conf
# to find out the configuration commands, run: h2o --help

listen: 80
listen:
  port: 443
  ssl:
    certificate-file: /home/vagrant/h2o/examples/h2o/server.crt
    key-file: /home/vagrant/h2o/examples/h2o/server.key
hosts:
  "127.0.0.1.xip.io:80":
    paths:
      /:
        file.dir: examples/doc_root
access-log: /h2o/logs/access_log
error-log: /h2o/logs/error_log

hosts:
  "127.0.0.1.xip.io:443":
    paths:
      /:
        file.dir: examples/doc_root
access-log: /h2o/logs/ssl_access_log
error-log: /h2o/logs/ssl_error_log
```````

<h4>鍵の準備</h4>

`````
#mkdir ssl
#cd ssl
#openssl genrsa 2048 > server.key
#openssl req -new -key server.key > server.csr
``````

設定ファイルに記載のある場所にmoveする

<h4>起動</h4>

````````
#/usr/local/bin/h2o -m daemon -c examples/h2o/h2o.conf
````````


``````lang:output
# ps ax | grep h2o
 4528 ?        S      0:00 perl -x /usr/local/share/h2o/start_server --log-file=/root/h2o/logs/ssl_error_log --daemonize --port=0.0.0.0:80 --port=[::]:80 --port=0.0.0.0:443 --port=[::]:443 -- /usr/local/bin/h2o -c examples/h2o/h2o.conf
 4529 ?        Sl     0:00 /usr/local/bin/h2o -c examples/h2o/h2o.conf
 4533 ?        S      0:00 perl -x /usr/local/share/h2o/annotate-backtrace-symbols
 4608 pts/0    S+     0:00 grep --color=auto h2o

# ss -anp | grep 443
u_str  ESTAB      0      0                      * 13443                 * 14391 users:(("systemd-logind",566,12),("systemd-logind",566,10))
u_dgr  UNCONN     0      0                      * 14438                 * 5663  users:(("NetworkManager",558,4))
u_str  ESTAB      0      0      /var/run/dbus/system_bus_socket 14391                 * 13443 users:(("dbus-daemon",567,10))
tcp    LISTEN     0      128                    *:443                   *:*      users:(("h2o",4529,20),("h2o",4529,7),("perl",4528,7))
tcp    LISTEN     0      128                   :::443                  :::*      users:(("h2o",4529,21),("h2o",4529,8),("perl",4528,8))
```````
CS-Cart: installディレクトリの削除をgitで無視する

CS-Cartはインストールすると、installディレクトリが削除されてしまう。installディレクトリもGitで管理はしたいが、プロダクション環境では削除は無視したいということがある。

この場合、installディレクトリが削除された後に、`git update-index --assume-unchanged`で変更を無視するように設定するといい。

まず、下記コマンドで無視するファイルのリストを確認しておく。

```
git ls-files -d
```

そのリストで問題なければ、下記コマンドで更新を無視するように設定する。

```
git ls-files -d | xargs git update-index --assume-unchanged
```

この設定は、git cloneしてきたその環境でのみ有効なので、デメリットとしてはインストールする度に設定する必要があるが、メリットとしてはコードベース(リモートのmasterなど)に影響しないという点がある。
D言語くんの歴史

これは[D言語くんアドベントカレンダー](http://qiita.com/advent-calendar/2015/d-man)22日目の記事です．今年に入って大きな盛り上がりを見せているD言語くんの歴史を調べました．

![d3.png](https://qiita-image-store.s3.amazonaws.com/0/11714/4cce563c-c3ed-e3ea-36da-240bfe313158.png)

# D言語くんの歴史
D言語くんは[Overview](http://dlang.org/overview.html)のページでその愛くるしい姿を見ることができるのですが，いったいいつ彼は登場したのでしょう？

[D-Programming-Language/dlang.org
](https://github.com/D-Programming-Language/dlang.org)で確認できる限りのログを漁ったところ，なんと一番最初の2008年のコミットからD言語くんは居たようです！これ以上は遡れませんでしたが，D言語君は少なくとも7年間はマスコットとして輝き続けているのですね．

ただ，一時期D言語くんの姿を見ないことがありましたが，コミットログを見る限りではずっと居るんですよね・・・不思議・・・

元々は荒いgif画像が使われていたのですが，[D logo vectorized](http://web.archive.org/web/20050213192629/http://w148.de/~mmartin/d/logo.html)で2005年[^1]に描かれた透過png画像が2013年のコミット[^2]で取り込まれています．

![d3.gif](https://qiita-image-store.s3.amazonaws.com/0/11714/9a4203b7-d41a-bcc6-0f3e-942ea8940ced.gif) ![d3.png](https://qiita-image-store.s3.amazonaws.com/0/11714/4cce563c-c3ed-e3ea-36da-240bfe313158.png)

また，今年（2015年）の8月のコミット[^3]では[Download](http://dlang.org/download.html)のページでもDMD[^4]のロゴとしてD言語くんが登場しました！D言語くんは今も愛されていることが分かりますね．

# 生みの親
D言語くんを産んだのはD言語自体の生みの親であるWalter Brightです．彼はフォーラムで次のように語っています:

[Re: I came up with a new logo for the D language](http://forum.dlang.org/post/mght5k$12hm$1@digitalmars.com)より
>I drew that on an envelope many years ago, and scanned it in.
>
>My only foray into cartooning :-)

>（訳）
>何年も前に僕はそれ（訳注：D言語くん）を封筒に書いてスキャンしたんだ．
>
>僕の唯一の漫画絵への挑戦だよ :-)

[Re: D Mascot](http://forum.dlang.org/post/dvmoih$bfj$1@digitaldaemon.com)より
>I originally approached three professional cartoonists to do a D-man. One couldn't be bothered with it. Another "didn't do that kind of work." The third wanted royalties and to retain copyright, as if D-man was the next Steamboat Willie. Criminy. I just sketched him out on some scratch paper and scanned him in!

>（訳）最初は3人のプロの漫画家にD言語くんを頼んだんだ．一人はわざわざそんなことはしてはいられないと返してきて，もう一人は「そういった仕事はしない」とさ．三人目は使用料と著作権の保持を要求してきたんだ，まるでD言語くんが次の蒸気船ウィリー（訳注：ミッキーマウスのデビュー作）だとでも言うようにね．おやおや，そこで僕は彼をメモ用紙にスケッチしてスキャンしたのさ！

D言語とD言語くんは兄弟どうしだったのですね．

また，WalterはD言語くんへの愛をたびたび語っています．たとえば，[Re: D Mascot](http://forum.dlang.org/post/dvlga7$1j96$2@digitaldaemon.com)より
>Hey! What's wrong with D-man? &lt;g>

>（訳）（別のマスコットを作る提案を受けて）おい！D言語くんの何が悪いってんだい？

彼のお気に入りは組み立て作業（アセンブリ）中のD言語くんみたいですね:

[Re: D Mascot](http://forum.dlang.org/post/dvqd69$230i$2@digitaldaemon.com)より
>The "some assembly required" cartoon was my favorite.
>（後略）

>（訳）この『アセンブリが必要』の漫画がお気に入りさ．

このD言語くんもかわいいですね．本当は[Inline Assembler](https://dlang.org/spec/iasm.html)のページにあるはずなのですが正しくリンクされていないようです．
![d5.gif](https://qiita-image-store.s3.amazonaws.com/0/11714/706905df-f6ec-ef00-8ac8-8d55beb12d45.gif)

# D言語くんの未来
来年からもD言語くんを盛り上げていい年にしましょう！

[^1]: これは2005年には既にD言語くんが居たと見ていいんでしょうか？
[^2]: コミットのハッシュは6a26e70986c9512415b94abadaacbef72656468a
[^3]: コミットのハッシュは0aa3d03c052bfb8bad2f5aca174f333ba5d8a11d
[^4]: DMD(Digital Mars D)は公式のD言語コンパイラ．他にもGDC(Gnu D Compiler)やLDC(LLVM D Compiler)などが存在するがいずれもDMDをフロントエンドとして利用している．
require しておかないと org-export-dispatch (C-c C-e) で表示されない export 方法がある。

# 概要

`C-c C-e`(`org-export-dispatch`) では表示されないので、毎回毎回`M-x`から実行していた org-mode の export 方法が、実は一度実行したのちには `org-export-dispatch` のテーブルに登録されていたので、そのことについてのメモ。

# 観測した挙動

* `org-odt-export-to-odt` : オープンオフィス文書(odt) への出力
* `org-md-export-to-markdown` : マークダウン形式への出力

など、 org-mode には便利なフォーマットへの exporter がデフォルトで備わっている。しかし、これらのフォーマットは、何も考えずに org-mode を起動した状態では、`C-c C-e` による export コマンドへの dispatcher 便利コマンドでは、登録項目として表示されない。(自分の環境ではされていない)

一度でも、手動で(`M-x`で)関数を実行してしまえば、その後は dispatcher に登録される。その理由は、次である様子:

* これら関数は autoload されていて、関数を実行したタイミングで、定義ファイルが読み込まれること
* dispatcher テーブルへの関数の登録は、その関数の定義ファイルの中で行われていること


# 理由考察と対処

これらの export 関数は、割と分量があり、 load に時間がかかるので、デフォルトでは autoload で関数の情報のみが登録されているのだと思う。このコマンドを頻繁に使うのであれば、 その定義ファイルを init.el の中で `require` してやれば、最初から `C-c C-e` で dispatch できるようになる。
validation engineの小技まとめ

jQuery Validation Engineの小技備忘録です
https://github.com/posabsolute/jQuery-Validation-Engine

#エラーを1つだけ表示する
```html
$('form').validationEngine({ maxErrorsPerField: 1 });
```

#分割された入力フィールドのエラーを一つにまとめる
電話番号などで[ ]-[ ]-[ ]と分割されている場合

```html
<input type="text" name="tel1" class="validate[required]">
<input type="text" name="tel2" class="validate[required]">
<input type="text" name="tel3" class="validate[required]">
```
とすると、すべての入力欄にメッセージが出るので一つにまとめたい

```html
<input type="text" name="tel1" id="tel1" class="validate[required]">
<input type="text" name="tel2" id="tel2" class="validate[condRequired[tel01]]">
<input type="text" name="tel3" id="tel3" class="validate[condRequired[tel02]]">
```
condRequired[tel01]でtel01が入力されていたら必須になるので
前から順番に1つだけメッセージが表示される。


#エラーが出たフォームにクラスを付けたい
addFailureCssClassToField:"クラス名"を指定する

```js
$("#form").validationEngine({addFailureCssClassToField: "inputError"});
```