OmniAICreator/Qiita-1.07M huggingface dataset:
PHP7 + CakePHP3.xの開発環境構築手順


目的：PHP7とCakePHP3.xの開発環境を作ること
環境：LAMP(CentOS6.7, Apache2.2, MySQL5.7, PHP7.0)


## Aapache インストール
まずはApacheをインストールしていきます。

```
# yum -y install httpd
```

apacheの設定はこちらを参考にしました
http://centos.server-manual.com/centos5_apache2.html

```
# vim /etc/httpd/conf/httpd.conf
```

## PHP7 インストール
つづいて、PHP7をインストールしていきます。
インストール手順はこちらを参考にしました
https://webtatic.com/packages/php70/
まずは、yumにパッケージを追加します。

```
# rpm -Uvh https://mirror.webtatic.com/yum/el6/latest.rpm
```

そしてphp7のライブラリをyum installしていきます。

```
yum install php70w php70w-opcache php70w-cli php70w-common php70w-devel php70w-mcrypt php70w-mysql php70w-intl php70w-mbstring
```

## MySQL インストール

最後にmysql(5.7)をインストールします。
yumを使ったインストールの方法は、公式ドキュメントにまとめられています
https://dev.mysql.com/doc/refman/5.7/en/linux-installation-yum-repo.html

まずは、http://dev.mysql.com/downloads/repo/yum/
からyumレポジトリをダウンロードしておきます。

```
# wget http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm
```

続いて先ほどダウンロードしたレポジトリをyumに読み込ませます

```
# yum localinstall mysql57-community-release-el6-7.noarch.rpm 
```

MySQLをインストールします。

```
# yum install mysql-community-server
```

mysql5.7から、rootの初期パスワードは、 /root/.mysql_secretにないので注意が必要です。
http://yoku0825.blogspot.jp/2015/06/centos-66mysql-57yum.html


文字コードの設定はこちらの記事を参考にしました
http://www.webcyou.com/?p=4718




## CAKEPHP3.x インストール

公式ドキュメントのインストール手順を参考にします。
http://book.cakephp.org/3.0/ja/installation.html
cakephp2.x系とcomposerインストールの使い方が違うので注意です。
あらかじめ作業ディレクトリを用意しておき、そのディレクトリ上でインストールを進めます。
[app_name]にはプロジェクト名を入れます。

```
$ php composer.phar create-project --prefer-dist cakephp/app [app_name]
```

インストール手順どおり進めていけば、インストールは完了します。
私の環境では、databaseの設定でタイムゾーンに関するエラーがでました。
タイムゾーンの設定はこちらの記事が参考になりました
http://qiita.com/subaru/items/75c32fc6ef172215f599
&lt;html:form&gt;でアクションフォームBeanが取得できずJSPでエラーが発生


Form bean not specified on mapping for actionというエラーで、JSPページが表示されなくて詰まってしまいました。

これはstruts-config.xmlでaction要素でform-beanが結びついていない場合に起きるエラーです。actionのname属性とform-beanのnameが違っているとマッピングに問題が起きます。しかし、今回はここが原因でありませんでした。原因はactionのtype属性が指定されていないことでした。

```xml
<!-- struts-config.xml -->
<action-mappings>
        <action path="/TestAction" name="TestActionForm" type="TestAction" scope="request">
            <forward name="success" path="/pages/Welcome.jsp">
    	</forward></action>
<action-mappings>
```

リクエストパス（~.do）に対し、まずアクションフォームBeanがセットされてから、アクションクラスが実行されます。このリクエストパスで実行されるアクションクラスが指定していないため、form-beanとのマッピングが上手くいってなかったようです。
良いコードを書くための5つの習慣

新卒の時に読んだ記憶がある[”良いコードを書く技術”](http://www.amazon.co.jp/%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E6%8A%80%E8%A1%93-%EF%BC%8D%E8%AA%AD%E3%81%BF%E3%82%84%E3%81%99%E3%81%8F%E4%BF%9D%E5%AE%88%E3%81%97%E3%82%84%E3%81%99%E3%81%84%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E4%BD%9C%E6%B3%95-WEB-DB-PRESS-plus/dp/4774145963)という本を引っ越しの際に見つけたのでさらっと読み返してみたら、基本的だけど読みやすくて再確認できることがあったのでメモしておきます。

### 第2章 良いコードを書くための5つの習慣(P.9)
### 習慣その1 読む
自分でコードが書けると思っても井の中の蛙になっているかもしれません。
とにかくオープンソースや他の人のコードを読んで良いところを取り入れるべき。

**コード検索サービスでコードの海を泳ぐ**
koders 
https://code.openhub.net/

コード検索サイトまとめ
http://matome.naver.jp/odai/2139368317683744601

### 習慣その2 書く
とにかく書く。仕事でコードを書くのはもちろん、日々の単純作業を効率化するツールやスクリプトを書いたり、新しい言語やフレームワークを試してみよう。

### 習慣その3 道具を磨く
コードを書く上で必要な道具や環境を最高の状態に保ちましょう。

### 習慣その4 知る
**書籍-原典とHow To本の2冊買いがおすすめ**
正しいことは何なのか、良いコードとは何なのかを知るうえで、書籍はコストパフォーマンスに優れています。書籍を選ぶときは良書を入手しましょう。

### 習慣その5 聞く
・コードレビューを受ける
・ブログを書く
・コミュニティや勉強会に参加する
・成果を発表する

### まとめ
良いコードを書くために具体的な方法は仕事の中で徐々に身に着けていけていっているけれど、こういう基本的な習慣は忘れがちになってしまっていたので、再確認できました。
自分のペースで習慣化できれば自然と力が付くと思うので意識していきたいです。
この本は基本中の基本しか書いていないので、他の章に書いてある良いコードを書くための具体的な内容については他の本で掘り下げて詳しく勉強したほうが良いと思います。
UPFセットアップ

Visual StudioをUPF対応に更新した。

![VS_UWP_setup1.png](https://qiita-image-store.s3.amazonaws.com/0/103010/d78df25d-1297-68b9-05ad-09b06d742256.png)

新規作成からプロジェクトを選択

![VS_UWP_setup2.png](https://qiita-image-store.s3.amazonaws.com/0/103010/fafcb8db-cee9-e5a2-d3ec-751a90939215.png)

テンプレートのWindowsを選択するとユニバースがあるので
UPFツールのインストールを開始する

![VS_UWP_setup3.png](https://qiita-image-store.s3.amazonaws.com/0/103010/eb52153b-c0f2-1a63-7d3e-59220da2396a.png)

更新、インストールと進み
欲しいツールにチェックを入れてセットアップ完了。

容量が重たいので
余裕のない人はデフォルト設定で行う
：や；とのつきあい方

### -::::;::::;-

この記事はhttp://qiita.com/advent-calendar/2015/english_translation
の6日目の記事です。
(前日はコチラ http://qiita.com/Uemmra3/items/06c0eeda5fafd44bef36)
(翌日はコチラ http://qiita.com/Uemmra3/items/911f5bcb9cbef80ac27e)

# ：(コロン)が来る場合
英文においては、結論から先に始めるのが基本のパターンである。
：(コロン)が来た時は、最初に「見出し」や、「簡単な結論」を持ってきて、その後に詳細な説明などを加える場合が多い。これは**そのままで良い**と思う。

例えば、
> Run the following command in Terminal:
sudo apt-get install autoconf2.13 bison bzip2 ccache curl flex gawk gcc g++ g++-multilib git ia32-libs lib32

を訳すと、
> ターミナルで下記のコマンドを実行します:
sudo apt-get install autoconf2.13 bison bzip2 ccache curl flex gawk gcc g++ g++-multilib git ia32-libs lib32

となる。

# ；(セミコロン)が来る場合
;(セミコロン)の後は、前の部分の「言い換え」である事が多い。

例えば、
> make sure you follow the on-screen instructions for these devices; you will need to accept a licence agreement.

を訳すと、
> これらの端末用の画面上の指示にきっちり従います。**つまり**ライセンス同意書を受け入れる必要があるでしょう。

となる。

# まとめ
**:(コロン)**はそのまま、**;(セミコロン)**は**つまり**と訳せば良い
【楽々一括リネーム！】バッチファイルでファイル名の先頭・末尾に文字を追記する


サイトのメンテナンスをしている時にたくさんの画像をリネームする時があります。ファイル名の頭にimgやphをつけたり、後ろに日付をつけたりと。これを手作業でやろうと思うと、とても大変です。キーボードだけで操作してF2キーを駆使しても、時間がかかります。これをバッチファイルで自動化してみましょう。

下記のバッチファイルを実行しますと、バッチファイルと同じディレクトリのファイルすべてに実行バッチファイル名が末尾に追記されます。つまり、ファイル名の末尾に追記したい文字をバッチファイル名にしておくということです。

```bat
@echo off

rem 実行バッチファイル名を取得
set add=%~n0

rem ファイル名の末尾に追記
for %%i in (*) do ren %%i %%~ni_%add%%%~xi

rem ファイル名の先頭に追記する場合
rem for %%i in (*) do ren %%i %add%_%%~ni%%~xi

pause
```

ファイル名の先頭に追記する場合は、コメントアウトしている部分を差し替えれば可能です。例として140401という日付を＿（アンダーバー）でつなげて、後ろに追記する場合は、実行バッチファイル名を「_140401」とリネームしてから実行します。そうすると、同じディレクトリのすべてのファイル名の末尾に日付が追記されます。ただし、問題点として実行バッチファイル自身にも追記されてしまいます。

使い方と機能がわかったところで、少しソースの解説をしていきます。  
まず最初に環境変数addに実行バッチファイル名を格納します。%0は実行バッチファイル名をフルパスで取得するので、そこに修飾指定子nをつけると（拡張子を含まない）ファイル名のみの取得となります。あとは、これをもとにfor文で一括リネームするだけです。

このソースでは環境変数の修飾指定子が重要ですので、一度下記で一覧をおさえておくと良いです。

[Windows 2000 活用講座Windows 2000 コマンドライン徹底活用：第７回　forコマンド（その１） (1/3) - ＠IT](http://www.atmarkit.co.jp/ait/articles/0104/27/news002.html)

次は、さきほど実行バッチファイル名に文字が追記されてしまう問題点を改良してみましょう。

```bat
@echo off

rem 実行バッチファイル名を取得
set add=%~n0

for %%i in (*) do (
    rem 実行バッチファイル自身以外に実行
    if not %%i==%~n0%~x0 (
        rem ファイル名の末尾に追記
        ren %%i %%~ni_%add%%%~xi
    )
)

pause
```

わかりやすいようにブロック文を使用しています。変更点はforの中で繰り返されるrenコマンドを実行バッチファイル以外で実行するようにしました。if文の条件式について解説します。環境変数iには次々とファイル名が差し替えられていきます。それを実行バッチファイル名と比較して、違う場合には処理を実行しています。%0で実行バッチファイルが取得できて、修飾指定子nでファイル名、xで拡張子を表します。これで、比較対象を作成しています。

これで何度でも同じ文字を追記できるようになりました。しかし、まだまだ改良点はあります。下記にリストアップしてみます。

1.  文字の追記の場所を選択できない。
2.  説明しないと、バッチファイル名が追記されることはわからない

この2つの解決にはバッチファイルが実行された時にすぐにリネーム作業に移るのではなく、追記場所の選択と、追記文字の入力を表示してから、リネームするようにしましょう。

```bat
@echo off

echo バッチファイルと同じディレクトのすべてのファイルをリネームします。
echo （拡張子を含まない）ファイル名のどの位置に文字を挿入しますか？
echo;
echo 0:先頭
echo 1:末尾

set /p select="数字で選択して下さい："
set /p add="追記する文字を入力して下さい："

if %select%==0 (
    for %%i in (*) do (
        rem 実行バッチファイル自身以外に実行
        if not %%i==%~n0%~x0 (
            rem 先頭に追記
            ren %%i %add%%%~ni%%~xi
        )
    )
) else (
    for %%i in (*) do (
        rem 実行バッチファイル自身以外に実行
        if not %%i==%~n0%~x0 (
            rem 末尾に追記
            ren %%i %%~ni%add%%%~xi
        )
    )
)
```

`set /p`で文字の入力をさせることができます。それをもとに、何が選択されたかをif文で判定すれば良いです。ちなみにfor分なかでif文を書けば、if文は1つにまとまることができますが、今回はあえてforの外に出しています。理由はファイル数が100個あったとしたら、100回も先頭（0）、末尾（1）のどちらかが選択されたかを判定することになってしまいます。それを防ぐためにもif文はfor文の外に出して、はじめに選択を判定するようにしています。
バッチファイルのfor・if文の中で変数使う際につまづくこと


コマンドプロンプトとはWindowsでの黒い画面のことですが、その中でスクリプト（プログラム）を記述することができます。下記の質問によるとUNIXのシェルスクリプトとは違うようで～言語という呼称はないようです。

[Windowsの.batファイルのプログラムは何言語？？ - その他(プログラミング) - 教えて！goo](http://oshiete.goo.ne.jp/qa/3945952.html)

何か他のプログラム言語をかじった人が同じように、バッチファイルの中でfor・if文を使うと、動作が想像と違いつまづくかと思います。私は複文、ブロック文の中で変数を使用した際につまづきました。

コマンドプロンプトでブロック文を使う際には、下記のように記述します。他の言語と違うところは、閉じカッコは行頭に置くことです。

```bat
for %%i in (*) do (  
)

if %i% == 1 (  
)
```

繰り返しの中で変数を使用する場合は、毎回変数の中身が変わると思うのですが、コマンドプロンプトではそうはいきません。forの中で変数iをインクリメントしながら環境変数xに格納します。そしてechoで表示しましょう。しかし、下記のように書くと、何故かすべて3が表示されてしまいます。

```bat
@echo off
for /L %%i in (1,1,3) do (
    set x=%%i
    echo %x%
)
echo for終了時 x:%x%
pause
```

```
ECHO は <OFF> です。
ECHO は <OFF> です。
ECHO は <OFF> です。
for終了時 x:3
```

何故か、環境変数xの中身が表示されません。for文の変数iは中身がないのでしょうか。確かめてみましょう。

```bat
@echo off
for /L %%i in (1,1,3) do (
    echo %%i
)
pause
```

```
1
2
3
```

変数iをechoで表示してみると、ちゃんとインクリメントされていることがわかります。問題は環境変数xにありそうです。この問題が下記の記事で解説されていました。

[バッチファイルのif文やfor文で気をつけること](http://dalmore.blog7.fc2.com/blog-entry-79.html)

実はfor文、if文の中の環境変数は処理が終了後に格納した値が反映されます。これを環境変数の即時展開と言います。

下記でざっくりと説明されていますので、一読して整理しましょう。

[CMD.EXEの遅延環境変数の展開 - ふなWiki](http://blue-red.ddo.jp/~ao/wiki/wiki.cgi?page=CMD.EXE%A4%CE%C3%D9%B1%E4%B4%C4%B6%AD%CA%D1%BF%F4%A4%CE%C5%B8%B3%AB)

さきほどの1～3を表示するソースを下記のように書き換えてみましょう。

```bat
@echo off
setlocal enabledelayedexpansion
for /L %%i in (1,1,3) do (
    set x=%%i
    echo !x!
)
echo for終了時 x:%x%
pause
```

```
1
2
3
```

今度は意図したとおりに表示されました。

> 各コマンドが実行されるときに環境変数が展開されるのではなく、バッチファイルのテキスト行が読み取られるときに展開が行われてしまうからで、上の例は次のように解釈されているために期待した結果が得られないのです。
>
> 引用元: 
> <cite>ふなWiki</cite>

ふなwikiの一文からの推測ですが、テキストを読み取る、つまりifやforの行に移動して、この2つのコマンドを読み取るとき、つまりコマンドの実行前に環境変数は展開されてしまうのだと思います。コマンドは環境変数を先に展開してから実行するのだとすると、最初のソースが何も表示されない理由がわかります。

`set x=%%i`はまだ実行されていない状態で環境変数xを展開するので中身は空のままだったのです。その後、環境変数に値は格納はされていきますが、すでに展開はされていますので、ブロック文の中では空の中身が表示されることになります。

環境変数についてもう少し知りたい方は下記で学んでおきましょう。

[Windows環境変数メモ(Hishidama's Windows Environment Memo)](http://www.ne.jp/asahi/hishidama/home/tech/windows/env.html)
RubyでYAMLファイルをloadするもう1つの便利な方法

先日の[投稿](http://gipcompany.github.io/ruby/2015/12/13/hashie%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6%E3%83%A1%E3%82%BF%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0.html)で[`Hash`クラス](http://ruby-doc.org/core/Hash.html)を拡張した[`Hashie`](https://github.com/intridea/hashie)というクラスを見ていきましたが、実はこの`Hashie`は他にも様々な機能があります。今回の投稿ではYAMLファイルをloadしたオブジェクトをいい感じにしてくれる(`Hash`のキー名でアクセサーを定義してくれる)機能があることがドキュメントに記載されていたので、実際に試してみようと思います。

## 準備

事前に適当なYAMLファイルを用意します。
今回は[`rails`](https://github.com/rails/rails)にcommitされている`.travis.yml`を検証対象とすることにしました。

以下のように、`wget`で`sample.yml`として保存します。

```bash
$ wget https://raw.githubusercontent.com/rails/rails/master/.travis.yml -O _snippets/sample.yml
```

以下が`sample.yml`の内容です。

```yaml

language: ruby
sudo: false
script: 'ci/travis.rb'
before_install:
  - gem install bundler
  - "rm ${BUNDLE_GEMFILE}.lock"
  - curl -L https://github.com/kr/beanstalkd/archive/v1.10.tar.gz | tar xz -C /tmp
  - cd /tmp/beanstalkd-1.10/
  - make
  - ./beanstalkd &
  - cd $TRAVIS_BUILD_DIR
  # 以下省略
```

## 普通にYAMLファイルをloadする

普通にYAMLファイルをloadするには、Rubyの標準ライブラリ[`YAML`](http://ruby-doc.org/stdlib/libdoc/yaml/rdoc/YAML.html)を使用することになるかと思います。

```rb
require 'yaml'

yaml = YAML.load_file("_snippets/sample.yml")

yaml.class # => Hash

yaml["language"] # => "ruby"

yaml.language
# => NoMethodError: undefined method `language' for #<Hash:0x007fd97d6def08>
```

上述のように、loadしたYAMLファイルは`Hash`オブジェクトになります。そしてキーを指定して値を取り出せます。
当然ながら、キーをアクセサ(上述の例でいうと、`language`メソッド)として呼んでも誰もそのようなメソッドは定義してくれてはいないので`NoMethodError`となります。

## HashieでYAMLファイルをloadする

次に、`Hashie`でYAMLをloadし、同様に`language`メソッドで値が取れるかを検証してみます。

```rb
require 'hashie'

yaml = Hashie::Mash.load("_snippets/sample.yml")

yaml["language"] # => "ruby"
yaml.language # => "ruby"
yaml.notifications.irc.on_success # => "change"
```

ご覧ください。

user-friendlyに値を取得することができました。

`Hashie`を使えば括弧(`[]`)やダブルクォーテーション(`""`)の入力の手間が省略できるので、YAMLをご使用の際はHashieを是非検討してみてください。


## 最後に

大変お忙しい中、私の投稿を最後まで読んで頂き有難うございました😊

現在、Udemyというオンライン学習プラットフォームで[GraphQL](http://bit.ly/2JLHqYZ)や[React](http://bit.ly/2zF07J4)が学べるコースを公開しており、有り難いことに大変ご好評頂いております。

下記のリンクからだと95%オフの価格で購入できますので、もしご興味がありましたらご覧頂けると大変嬉しいです😊

* 「[GraphQL with React入門 - QueryとMutationを学びPaginationの実装にチャレンジ！](http://bit.ly/2JLHqYZ)」
* 「[フロントエンドエンジニアのためのReact・Reduxアプリケーション開発入門](http://bit.ly/2zF07J4)」

それでは今日も皆様にとってハッピーなハッキングライフを!!!😋

Dive into Hacking!!!🤩

はむ
JavaScript入門 ４.文字列を使う <個人メモ>

改行：\n
タブ：\t
連結：+

例：
 strA = "改行\nを入れます";
 strB = "タブ\tを入れます";
 strC = "文字列" + "を連結します";


`<!DOCTYPE html>
<html lang="ja">
<head>
　　<meta charset="utf-8">
　　<title>JavaScript</title>
</head>
<body>
　　<script>
　　strA = "改行\nを入れます";
　　strB = "タブ\tを入れます";
　　strC = "文字列" + "を連結します";
　　alert(strA);
　　alert(strB);
　　alert(strC);
　　</script>
</body>
</html>`
Ruby 2.3のHash#digについて思ったこと


[RubyKaigi](http://rubykaigi.org/2015)で尻の耐久試験をしてきました。
Ruby3.0は1.9以来の大変革になりそうですね。並列性を持たせるためにどういう仕組みが導入されるのか、本当に3倍速くなるのか、楽しみでなりません。

[RubyMotion](http://www.rubymotion.com/jp/)や[mruby](https://github.com/mruby/mruby)に関してもかなり興味深い話を聞きました。クライアントもサーバもRubyで書く、Rubyistに（だけ）優しい世界はもうそこまで来ているのかもしれません。

未来への興味も尽きないわけですが、現在の話。
Kaigiの初日に合わせて[Ruby 2.3.0-preview2がリリースされました。](https://www.ruby-lang.org/ja/news/2015/12/11/ruby-2-3-0-preview2-released/) 
早速ダウンロードしましたが、新機能の中でもsafe navigation operatorはうれしいですね。
それと、ArrayとHashのdigもコードの削減にはかなり効きそうです。
が、試してみて一つ地味に驚いたことが。

```dig.rb
h = Hash.new(0)
h.dig(:a, :b, :c)
#=> nil
```

見ての通り、Hashにデフォルト値を指定していても、
Hash#digで存在しないキーを掘り当てたときの戻り値はnilです。
おそらくArray#digと動作を合わせるための仕様なんでしょうけど、
メソッドチェインする場合なんかは地味に困りそうです。
そんなときのためのsafe navigation operatorなんでしょうけどね。

ちなみに、Rubyのsafe navigation operator（&.）は
Matz曰く「ぼっち演算子」なので、書いていると寂しくなりそうです。
長いメソッドチェインだと集団ぼっちなんでしょうか。

##追記
>最近、
>
>h = Hash.new(0)
>h.dig(:a, :b, :c)
>
>はエラーになるようになりました(h[:a]の値０がdigをしらないので)。

とのこと。正式版はこの動作になると思われるので、深い階層の存在しない可能性のあるキーを掘る必要がある場合は下手にデフォルトを指定しない方が良さそうです。
「インスタンスが存在しない」制約を記述する

Scala Advent Calendar 2015、15 日目です。
Existential Types について書くかなーと思ってたんですがそんな誰も使わない機能について書いても仕方ないのでやめました。同程度に使われそうにないことについて書きます。

#Context Bound による制約
今更なんやかんやと説明する必要もないでしょう。

```scala
trait Show[T] { def show(t: T): String }
implicit val stringShow = new Show[String] {
  def show(s: String) = s
}

def show[T : Show](t: T) = implicitly[Show[T]].show(t)
show("Hello") // => Hello 
```

よくあるやつです。

#インスタンスが存在しないことを保障する
割と書ける。

```scala
trait !:[T, F[_]]
object !: {
  implicit def notFound[F[_], T]: !:[T, F] = new !:[T, F] { }
  implicit def found[F[_], T](implicit ev: F[T]): !:[T, F] = ???
}

def cannotShow[T](t: T)(implicit ev: T !: Show) = ()
cannotShow(new {})
cannotShow("Hello") // => !!!Error!!!
```

ContextBound とは制約として逆なので "!:" にしてみました。型注釈のための ":" が近くにあるおかげで最高に読みづらいですね…

#何に使うの
Show のような、機能を提供するための物に対して使うことはまずないでしょう。あったらびびる。
Implicits は型に対するある種の制約、述語として利用することができます。そのような性質を持つものとして、Predef では "=:=" や "<:<" 等が定義されていますね。 

```scala
type IsInt[T] = T =:= Int

implicitly[IsInt[Int]]
implicitly[IsInt[Char]] // => !!!Error!!!

trait Base
trait Inherited extends Base
type IsInheritedBase[T] = T <:< Base

implicitly[IsInheritedBase[Inherited]]
implicitly[IsInheritedBase[Nothing]]
implicitly[IsInheritedBase[Any]] // => !!!Error!!!!
```

これにさっき定義した "!:" を使うと、こんな具合に。

```scala
implicitly[Char !: IsInt]
implicitly[Any !: IsInheritedBase]
```

本当は下のように書けるといいんですが、Type Projection 使わないと無理です。使うとあんまり綺麗じゃなくなるので今回はしませんでした。

```scala
implicitly[Not[IsInheritedBase][Any]] // ill-formed
```

#実践編
真面目に書こうと思ってたんですが面倒になってきた。
Phantom Types とかと組み合わせて色々できるんじゃないでしょうか。And は複数並べればいいから必要ないけれど、Or は欲しいなあ。

```scala
trait Or[F[_], G[_], T]
implicitly[Or[IsInheritedBase, IsInt, Int]]
```

というわけで Or のインスタンスを返す implicit な定義を書くのは各自の宿題ということで。どちらも満たす場合を考慮すると、ちょっと面倒になるかな。

#まとめとか言い訳とか

最初に書いたとおり、登録したときは Existential Types について書くつもりで、実際ちょっと書いたのですが、あまりにもつまらない。
それで何書こうかなあとぼーっとしてたら、そういえばこの前ドワンゴ秘蔵のトランザクションが云々で Read と ReadWrite の権限を継承関係による制約で扱ってたけど、権限周りのルールがもっと複雑な場合これじゃ無理だよなー、でも普通に書いても面白くない…
などと思ってたら「インスタンスが存在しない制約」とかいう、わけのわからないものが思いついたので、とりあえず書いてみました。誰か頑張って役に立ててみてください。

おしまいです。明日は takezoux2 さんですが、明日って Scala 勉強会 in 東京とその忘年会のはず…大丈夫なのだろうか…！
C# 学び始めに書き溜めてた TIPS まとめ


# はじめに

この記事は C# 初心者向け TIPS のまとめです。
僕はもともと C++er でしたが、ツール制作や Unity で C# を触るようになりました。
その際に調べたことなどを簡単にまとめたいと思います。

また、この記事は、C# ADVENT CALENDER 2015 の 15日目のものです。

## 1. event を上手く使おう

C# は event や delegete が存在しオブザーバーパターンのようなことが非常にしやすい言語です。
ですが、event は使いづらい部分もあります。

例えば event の登録のみ行い解除をしない場合メモリリークが発生することです。
event に登録してあると参照が残ってしまっており消したとおもったら消えていないという状況になることがあります。
結構気づきづらいことなので、意識して使う必要があります。

[イベントの購読とその解除](http://ufcpp.net/study/csharp/MiscEventSubscribe.html)はメモリリークのことや、登録・解除にまつわる問題点などが記載してわかりやすかったです。
event はメリットもすごくある機能ですので、うまく制御して使いましょう。


## 2. struct はよく考えて使おう

C# には値型の struct があります。
struct は使いどきがわかりづらいものです。
調べたところ、[MSDN のフレームワークの設計ガイドライン クラスまたは構造体の選択](https://msdn.microsoft.com/ja-jp/library/ms229017(v=vs.100).aspx)に下記の記述がありました。

>型のインスタンスが小さく有効期間が一般に短い場合や、型のインスタンスが一般に他のオブジェクト内に埋め込まれる場合は、クラスではなく、構造体を定義することを検討します。
型が次に挙げるすべての特性を持たない場合、構造体は定義しません。

>プリミティブ型 (整数、倍精度浮動小数点数など) に似た単一の値を論理的に表す。
インスタンスのサイズが 16 バイト未満である。
変更できない。
頻繁にボックス化する必要がない。

struct を使うべきか迷ったときは上記を覚えておくとよいかもしれません。


## 3. List\<T\> を返すときは Collection\<T\> や ReadOnlyCollection\<T\> を使おう

[CA1002: ジェネリック リストを公開しません](https://msdn.microsoft.com/ja-jp/library/ms182142.aspx)というデザイン上の警告があり、List\<T\>で返すのは非推奨で下記のように述べられています。

>System.Collections.Generic.List\<T\> は、継承ではなくパフォーマンスを目的としたジェネリック コレクションです。
System.Collections.Generic.List\<T\> には、継承クラスの動作を変更しやすくする仮想メンバーは含まれていません。
継承を目的としたジェネリック コレクションを次に示します。
公開するときは System.Collections.Generic.List\<T\> ではなく、これを使用してください。

> System.Collections.ObjectModel.Collection\<T\>
System.Collections.ObjectModel.ReadOnlyCollection\<T\>
System.Collections.ObjectModel.KeyedCollection\<TKey, TItem\>

上記は拡張を開くためという理由ですが、ReadOnlyCollection は読み取り専用にする効果もあり、そういった際には積極的に使うべきかと思います。

[Collection\<T\>やReadOnlyCollection\<T\>で、リストのプロパティを公開する](http://d.hatena.ne.jp/atsukanrock/20090326/1238043201)にはもっと詳しい考察も記載されています。

## 4 #if よりも Conditional属性を使おう

define は、デバッグ版とリリース版を区別したり、プラットフォーム別処理を書いたりとよく使われる機能です。
ですが、場所によっては #if がネストしてしまうなど、#end の位置を気にしなければなりません。
さらに、関数を #if で囲んだ場合、呼び出し先にも #if を書かなければいけません。

こういった場合、Conditional を使うことで、簡潔に書くことができます。

詳しくは [Conditional (C# プログラミング ガイド)](https://msdn.microsoft.com/ja-jp/library/4xssyw96(v=vs.90).aspx)をご覧ください。

# おわりに

僕が C# を学び始めた時に書き留めておいたものから抜粋して、もっとよりよく書くための TIPS を記載してみました。
もしも間違っている点がありましたら指摘していただけると大変嬉しいです。

また、[Effective C#](https://www.shoeisha.co.jp/book/detail/9784798122519) などにももっとよりよいノウハウがたくさんありますので、気になる方は読んでみるとよいかと思います。
pyenvを利用してPython環境を整備する方法

LIGアドベントカレンダー15日目です！こんにちは、Jack (@kazuhikoyamashita) です。

最近の趣味はPythonで行列計算をする事です。
今回は、pyenvを利用してPython環境を構築する手順をまとめたいと思います。

# pyenvをインストールする

## brewコマンドを実行する
pyenvをインストールするには下記コマンドを実行します。
brewコマンドで簡単にインストールする事ができます。

```zsh
% brew install pyenv
```

## .zprofileに設定を追記する
ターミナル起動時にpyenvが自動実行させるように、.zprofileに下記設定を追加してください。

```zsh
% echo 'if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi' >> ~/.zprofile
```

## 設定を反映する
sourceコマンドを利用して、.zprofileに追記した設定を反映します。
反映するためのコマンドは下記となります。

```zsh
% source ~/.zprofile
```


# Pythonをインストールする

## Pythonのバージョンを調べる
Macに標準インストールされているPythonのバージョンを調べます。
バージョンを確認するには、下記コマンドを実行します。
私の環境では、現在Python 2.7.10がインストールされています。

```zsh
% python --version
Python 2.7.10
```
今回はpyenvを利用して、最新（2015/12/15時点）のPython 3.5.0をインストールしてみます。

## Python 3.5.0をインストールする
Python 3.5.0をインストールするには、下記コマンドを実行してください。

```zsh
% pyenv install 3.5.0
```

他のバージョンをインストールしたい場合は、下記コマンドでインストール可能なバージョンを確認する事ができます。

```zsh
% pyenv install --list
```

## Python環境の切り替え
システムのPython環境からpyenvでインストールしたPython環境に切り替えるには、下記コマンドを実行してください。

```zsh
% pyenv global 3.5.0
% python --version
Python 3.5.0
```
これでPython 3.5.0に切り替わりました。

## 実際に動かしてみる
下記手順で「Hello, World!」を出力してみましょう。

```zsh
% python
Python 3.5.0 (default, Dec  9 2015, 17:22:19) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.72)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> string = 'Hello, World!'
>>> str(string)
'Hello, World!'
```

次回は行列計算の記事を書きたいと思います。
以上です！
GitHub製のGitHub利用支援ツール hub の便利なコマンドとWindowsでセットアップした時のメモ


GitHubを便利に使えるhubというコマンドラインツールを最近知って、Windows環境で使ってみた時のメモです。

### 環境

 * OS: Windows 10.0（ビルド 10240）
 * コンソール: Cmder v1.1.4.1
 * Git: version 1.9.4.msysgit.0
 * hub: version 2.2.2

ちなみにCmderは、Windowsで使えるコンソールです。見た目も機能もかなりいい感じなので、もうdos窓には戻りません。

 * [Windowsのターミナル環境にCmderを使う ～Nyagosとmsys2を添えて～ - 長文書くところ](http://zenito9970.hatenablog.com/entry/2015/06/19/163701)
 * [WindowsにおけるCUI環境 - Qiita](http://qiita.com/ntk1000@github/items/32596b4a8623975e638a)

### インストール

hubのインストール手順は公式にいくつか挙げられてます。Macな人はbrewを使えば簡単。

```bash
$ brew install hub
```

私のようにWindows環境の場合はChocolateyを使いたいところですが、`chocolatey list`コマンドで検索しても出てきませんでした。（[Chocolateyの管理下にはあるようなんですが…](https://chocolatey.org/packages/github-hub)　多分時が解決してくれます）実行ファイルを[ここ](https://github.com/github/hub/releases)からダウンロードしましょう。インストールはインストーラ`install.bat`を起動して（PCを再起動して）終わりです。

hubは基本的にgitの上位互換的なソフトで、`hub`コマンドはそのまま使うのではなく、`git`コマンドを拡張したかのように使う方法が推奨されています。以下の記述を`.bash_profile`に追加すればそのように動作するようになるということなのですが…

```bash:.bash_profile
eval "$(hub alias -s)"
```

私はWindows/Cmder環境なので、Cmder.exeがあるフォルダの`config/aliases`に以下の記述を追加することでそれっぽく使うことにしました。

```bat
git=hub $*
```

これで`git`コマンドが`hub`コマンドでパワーアップしたように使えるようになりました。

```bash
$ git version
git version 1.9.4.msysgit.0
hub version 2.2.2
```

### 使いそうなコマンドメモ

```bash
# URLが大幅短縮なclone
$ git clone USER_NAME/REPO_NAME

# カレントディレクトリの名前でリポジトリ作成
$ git create

# 指定した名前でリポジトリ作成
$ git create REPO_NAME

# 現在のリポジトリをブラウザで開く
$ git browse

# masterとDiff
$ git compare BRANCH

# Pull Request
$ git pull-request
```

最後の`git pull-request`を実行したら、`error using text editor for pull request message`と出た。他のコマンドでは勝手にVimが立ち上がってくれてるのに。。

以下の設定で、解消しました。

```bash
$ git config --global core.editor vim
```

### 参考

 * [github/hub](https://github.com/github/hub)
 * `pull-request`のもう一つのエラー： [hub pull-requestがError creating pull requestになってしまうときは - Qiita](http://qiita.com/shoma2da/items/c4356e9f17e1e1d5e2fc)

### 全然関係ないメモ

```bash
# Windows 10のビルド確認方法
$ winver
```
ESLint2について調べた


[Node.js Advent Calendar 2015](http://qiita.com/advent-calendar/2015/nodejs)の7日目の記事です。遅刻してごめんなさいごめんなさい。

sinopiaをs3対応して記事を書こうと思ったのですが、思ったより手こずってしまい、ESLintの2系のalpha版が出たので、そちらについて調べました。

[ESLint v2.0.0-alpha-1 released](http://eslint.org/blog/2015/12/eslint-v2.0.0-alpha-1-released/)

## 新しいルール

下記のルールが新しく追加される。

- [array-callback-return](http://eslint.org/docs/2.0.0/rules/array-callback-return)
  - Arrayのfilterやreduceなど、callback内で値を返す必要があるのに返してない場合にエラーを出す。
- [no-implicit-globals](http://eslint.org/docs/2.0.0/rules/no-implicit-globals)
  - 暗黙的にグローバルに定義されている変数がある場合にエラーを出す
- [no-restricted-imports](http://eslint.org/docs/2.0.0/rules/no-restricted-imports)
  - 任意のパッケージのimportを禁止する
- [prefer-rest-params](http://eslint.org/docs/2.0.0/rules/prefer-rest-params)
  - ES6のRest Parameterを使ったほうが良い時にエラーを出す
- [yield-star-spacing](http://eslint.org/docs/2.0.0/rules/yield-star-spacing)
  - `yield`前後のスペースのルール

## マイグレーションが必要そうなところ

[Migrating to v2.0.0](http://eslint.org/docs/2.0.0/user-guide/migrating-to-2.0.0)

### 設定ファイル

`.eslintrc`と`package.json`の`eslintConfig`フィールドの両方がある場合、現状は両方の設定がマージされ適用されるが、2.0.0からは`.eslintrc.*`が存在する場合は`package.json`の`eslintCofig`フィールドは無視される。

`.eslintrc.*`と`package.json`の`eslintConfig`フィールドが併用されている環境がある場合は、どちらかに寄せよう。


### 組み込みのグローバル変数

2.0.0以前はES6の機能である`Promise`, `Map`, `Set`, `Symbol`が何も設定しなくてもグローバル変数と認識されており、ES5の環境で上記の機能が使えない場合にも、`no-undef`ルール等でエラーとして認識されないという問題があった。

```sh
$ eslint -v
v1.10.3

$  cat .eslintrc.json
{
  "extends": "eslint:recommended"
}

$ cat index.js
'use strict';
// Promiseを使ったコード
new Promise(function (resolve) {
  resolve(10000);
});

$ eslint index.js

# 何もエラーが出ない
```


2.0.0からは、明示的に`env: { es6: true }`を設定しないとエラーになった。

```sh
$ eslint -v
v2.0.0-alpha-1

$  cat .eslintrc.json
{
  "extends": "eslint:recommended"
}

$ cat index.js
'use strict';
// Promiseを使ったコード
new Promise(function (resolve) {
  resolve(10000);
});

$  eslint index.js

/Users/pirosikick/src/github.com/pirosikick/eslint-next-playground/next/index.js
  2:5  error  "Promise" is not defined  no-undef

✖ 1 problem (1 error, 0 warnings)

# env: { es6: true }を追加
$  cat .eslintrc.json
{
  "env": {
    "es6": true
  },
  "extends": "eslint:recommended"
}

$ eslint index.js

# 何もエラーが出ない
```

### ecmaFeaturesオプション

2.0.0から`ecmaFeatures`オプションのES6系のフラグ（`arrowFunctions`や`blockBindings`など。`modules`, `jsx`, `experimentalObjectRestSpread`以外）は廃止になって、代わりに`parserOptions.ecmaVersion`オプションに`6`を設定するとES6系のフラグを全部trueにしたのと同じになる。

```js:.eslintrc.js
module.exports = {
  parserOptions: {
    // 3, 5 ,6が設定可能で、デフォルトは5
    ecmaVersion: 6
  }
};
```

`ecmaFeatures`の`modules`フラグは廃止になり、`parserOptions.souceType`に`"module"`を設定すると同じ設定になる。

```js:.eslintrc.js
module.exports = {
  parserOptions: {
    // "script"と"module"が設定可能で、デフォルトは"script"
    sourceType: "module"
  }
};
```

`ecmaFeatures`の`jsx`フラグと`experimentalObjectRestSpread `フラグは`parserOptions.ecmaFeatures`に設定する。

```js:.eslintrc.js
module.exports = {
  parserOptions: {
    ecmaFeatures: {
      jsx: true,
      experimentalObjectRestSpread: true
    }
  }
};
```

ルール開発周りのSchemaの修正と[Code Path Analysis](http://eslint.org/docs/2.0.0/developer-guide/code-path-analysis.html)については、もうちょっと調べて書きます。
【Perfume × STAR WARS】1分で始めるChainerで画風変換


## はじめに
この記事は、[1分で実現できる有用な技術 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/one-minute) 14日目の記事です。

ここでは、[mattya](https://github.com/mattya)さんによる[画風を変換するアルゴリズム](https://research.preferred.jp/2015/09/chainer-gogh/)をお手軽に試してみようと思います。

## 画風変換とは？
詳しい内容は元記事の[画風を変換するアルゴリズム](https://research.preferred.jp/2015/09/chainer-gogh/)を読んで頂きたいのですが、概要としては
『コンテンツ画像に書かれた物体の配置をそのままに、画風をスタイル画像に変換した画像をDeep Neural Network使って生成しよう』
という感じになります。

![Screen-Shot-2015-09-10-at-2.34.39-PM.png](https://qiita-image-store.s3.amazonaws.com/0/19111/47db8f88-3808-edb6-d441-1ea932cf90f3.png "Screen-Shot-2015-09-10-at-2.34.39-PM.png")

![Screen-Shot-2015-09-10-at-2.35.40-PM.png](https://qiita-image-store.s3.amazonaws.com/0/19111/2de55be7-14f2-2dea-9bc2-c1ce479e3b28.png "Screen-Shot-2015-09-10-at-2.35.40-PM.png")

## 実行環境
+ Mac OSX 10.11.1
+ Python 2.7.10

## Perfume × STAR WARS

それでは早速試してみようと思います。
題材としては、『Perfume × STAR WARS』を取り上げました。トレンドにも乗った、考えただけで胸が高まるコラボです。
### コンテンツ画像
先月メルセデス・ベンツとのタイアップで貞本義行氏によってアニメ化されたPerfume
[Perfumeがメルセデス・ベンツのキャラクターに、デザインは貞本義行](http://natalie.mu/music/news/167201)
![perfume.png](https://qiita-image-store.s3.amazonaws.com/0/19111/05faf92e-bb26-678f-e1dc-7b7084310371.png "perfume.png")

### スタイル画像
最新作の上映を今週に控えて世界的な盛り上がりを見せているSTAR WARS
[スター・ウォーズ｜STAR WARS｜](http://starwars.disney.co.jp/home.html)
![style.png](https://qiita-image-store.s3.amazonaws.com/0/19111/9a22f549-2b17-c300-c4d8-fd7df9d7cc88.png "style.png")


## 実行準備

`pip install chainer`
`cd <作業ディレクトリ>`
`git clone https://github.com/mattya/chainer-gogh.git`
任意のモデルをダウンロード(https://github.com/mattya/chainer-gogh)

これで準備は終わりです!!
この後の実際の処理は結構時間かかりますが、セットアップまでは本当にタイトル通り「1分で始める」ことができると思います。

## 実行結果
`python chainer-gogh.py -m nin -i perfume.png -s star_wars.png -o ~/Desktop -g -1`

![im_04950.png](https://qiita-image-store.s3.amazonaws.com/0/19111/8310f3c8-b91e-94af-78f8-3562681ce0f8.png "im_04950.png")

うーん...Perfumeの顔とかは崩れちゃいましたが、Star Warsの画風はいい感じに当てはめることができました。
お手軽にDeepLearningで遊べるChainerすごい！
Elixir × PhoenixのプロジェクトをTravis CIでテストする


# やりたいこと
GitHub上の**Elixir** × **Phoenix**のプロジェクトを[Travis CI](https://travis-ci.org)でテストする。

# 方法
Phoenixプロジェクトの作成とGitHubリポジトリへの`push`は済んでいるものとします。

1. [Travis CI](https://travis-ci.org)とリポジトリの連携
2. プロジェクトルートに`.travis.yml`の設置
3. GitHub上のリポジトリへ`push`

## 1. [Travis CI](https://travis-ci.org)とリポジトリの連携
 [Travis CI](https://travis-ci.org)にアクセスし、GitHubアカウントを用いてサインインします
![スクリーンショット 2015-12-15 0.04.26.png](https://qiita-image-store.s3.amazonaws.com/0/35230/3f43a0e8-40f2-9c0c-b87a-90bc55c7a50b.png)

連携承認画面が表示され、承諾するとGitHubのpublicリポジトリのリストが出てくるので、Travis CIと連携したいリポジトリのスイッチをONにします。
![スクリーンショット 2015-12-15 0.06.35.png](https://qiita-image-store.s3.amazonaws.com/0/35230/2edb5509-cdbe-b44a-bc6f-1e3723d4baae.png)

以上でTravis CIとの連携は完了です。

## 2. `.travis.yml`の設置
`.travis.yml`をプロジェクトの最上位ディレクトリへ追加します。内容は次のような感じです。(ファイル名は必ず`.travis.yml`にしてください)

```yaml:.travis.yml
language: elixir
elixir:
    - 1.1.0
otp_release:
    - 18.0
sudo: false
addons:  
    postgresql: '9.4'
before_script:  
    - npm install
    - mix do ecto.create, ecto.migrate
script: mix test
```

おおまかに説明すると、

* 言語を**Elixir**に指定
* **Elixir**のバージョンを**1.1.0**、**Erlang**のOTPリリースバージョンを**18.0**に指定
* `sudo`を使用しない
* **PostgreSQL**のバージョン**9.4**を利用する
* テスト実行前に**npm**のインストール、およびDBの初期化とマイグレーション
* `mix test`でテストを実行

というような感じです。

## 3. GitHub上のリポジトリへ`push`
上記1〜2を行うと、以後はTravis CIと連携したGitHub上のリポジトリへ`push`する度に自動でテストが走って、終了し次第その結果がメールで通知されます。

Travis CIのリポジトリ管理画面はこんな感じ
![スクリーンショット 2015-12-15 0.21.28.png](https://qiita-image-store.s3.amazonaws.com/0/35230/faeb042a-e996-8cb5-8cd8-605a5ce3c606.png)

やったぜ！

# まとめ
1. Travis CIとリポジトリの連携
2. プロジェクトルートに`.travis.yml`の設置
3. GitHub上のリポジトリへ`push`

# おまけ
よくGitHubでみかけるなんかかっこいい感じのバッチ
![スクリーンショット 2015-12-15 0.24.41.png](https://qiita-image-store.s3.amazonaws.com/0/35230/d5fd2bdb-a715-d76b-03d0-c5a1886fbe07.png)

Travis CIのリポジトリ管理画面で、リポジトリ名の右にあるバッチをクリックすると、そのバッチを設置するためのmarkdownや画像のURLを得ることができます。

![スクリーンショット 2015-12-15 0.25.13.png](https://qiita-image-store.s3.amazonaws.com/0/35230/80a1d765-7a8f-32c9-480b-d6f8b26aad36.png)

それを`README.md`に埋め込むとあっという間にかっこよくなります。

# 参考文献
この記事を執筆する上で次のサイトを参考にさせていただきました。

* [Travis CI - Building an Elixir Project \(beta\)](https://docs.travis-ci.com/user/languages/elixir)
* http://natescottwest.com/continuous-deployment-of-phoenix-apps-with-travis-and-heroku/
RailsでCould not find 'railties' と出た時の解決法

大した問題ではありませんが、メモがてら。

##ある日のこと

いつものようにrailsコマンドを実行しようとしたら、rails s, rails -vなど様々なコマンドが使えず下記のようなエラーが出る。

```/Library/Ruby/Site/2.0.0/rubygems/dependency.rb:318:in `to_specs': Could not find 'railties' (>= 0.a) among 9 total gem(s) (Gem::LoadError)
```
railtiesがないって言われてます。

##検証
ここで ```gem list``` とコマンドを打ってみましょう。
インストール済みのgemが確認できます。

``bigdecimal (1.2.0)
bundler (1.11.0)
io-console (0.4.2)
json (1.7.7)
minitest (4.3.2)
psych (2.0.0)
rake (0.9.6)
rdoc (4.0.0)
test-unit (2.0.0.0)``

ふむふむ、どうやらrailtiesはないらしい。
昨日までは何も問題なかったのになー(・-・)

##解決策
`` gem install rails``

このコマンドがrailsのgemの抜け落ちた依存関係をインストール・ダウンロードし直してくれるので実行。

ちょっと時間がかかりますが待ちましょう。
終わったら、```gem list```コマンドで再度確認。

``railties (4.2.5)``

あった・・・！


というかrailties以外にもいろいろ抜け落ちていたみたいです。
なんでだろう。。

``bundle install`` を叩いて

``rails s`` 

動きました。yay!

ダメ出し、助言募集しております(・~・)

[Reference from stackoverflow](http://stackoverflow.com/questions/9212116/rails-could-not-find-railties)
FuelPHPで困ったこと集


#初めに
この記事はAdvent Calendar FuelPHPの15日目です。

今日までにFuelPHP含め色々なAdvent Calendarに様々な投稿があり、皆様の頭もいっぱいいっぱいだろうと存じます。
ということで、ここらで骨休めとして簡単な話でも眺めていきましょう。
内容としましては、FuelPHPを少しやってみて困ったことなどを羅列していこうと思います。
Advent Calendarを読まれているような諸兄の皆様には当たり前じゃんと思われるかもしれませんが、生暖かい目で見てくれれば助かります。

#FormatクラスだけどTSV使いたい
ある時TSVを扱う必要があったのですが、残念なことにFormatクラスにはTSV用のメソッドがなかった。悲しい。ただ、以下のようにdelemiterを変えることで扱えるようにはなる。

```php
\Config::load('format');
\Config::set('format.csv.delimiter', "\t");
$tsv = \Format::forge(\File::read(APPPATH . '/../tmp/test.tsv', true), 'csv');
```

しかしcsvとして扱うのが非常に気持ち悪いし、やってはいないですが、tsvからcsvに変換するような処理を書くときにconfigをsetし直すなんてことをやらなきゃいけないので面倒です。なので、拡張して_from_tsvメソッドを定義するのが良いのでしょうね。
まずなんでTSVなんていう微妙なやつを使わなければならなかったかってことですが、そこは闇が深いので無視していただきたい。


#Imageクラスを利用すると画像が劣化しちゃう
ある時コントローラを介して画像を返すAPIちっくなものを実装する必要がありました。FuelPHPにはImageクラスがあり、そこにoutputというメソッドがありました。これはヘッダを設定して画像を返してくれる便利メソッドです。
じゃあこれを使えばいいじゃん！　となって、究極的にいえば以下のコードを書いたわけです。

```php
class ControllerImage {
	public function get($id) {
		return Image::load($id . '.png')->output();
	}
}
```

画像も平和に出力されやった簡単だねみたいに思ってたのですが、別のところから指摘があって、画像が劣化していることがわかりました。
loadしてoutputしてるだけなのになんで劣化するの！？と思ったわけですが、直接Imageクラスを読んでみると、loadした段階でコンバートなりをかけていることがわかりました。これがconfigのimage.phpのquallityを100にしても劣化しちゃう。しかもそこそこ重い。仕方がないのでImageクラスを使わず、自前でヘッダを返すようにしました。


#taskとwebアクセス時でDOCROOTが違う
FuelPHPを使ってる方には常識かもしれませんが、taskを実装する時とwebでアクセスした時のDOCROOTの値が違うという現象。これはバグなどではなく仕様です。DOCROOTは起動スクリプトだから、とのこと（oilコマンドで起動する場合は、oilコマンドのディレクトリが起動スクリプトということなのでしょう）。以下で議論されてました。
http://fuelphp.com/forums/discussion/8023。

でもConfigとかで設定を共有したい場合ってあるじゃん？　同じパスを利用したい時ってあるよね？　仕方ないのでAPPPATHからたどるようにしました。これはどうするのが一番いいんでしょうね。

#Langクラスのロードはキャッシュされる
これも使われてる方には常識っていうかなんで知らないの？　って話なのかもしれませんが、Lang::load()を一回やっちゃうとキャッシュされて新たに読み込み直すときにはちゃんとフラグを渡してあげないとキャッシュがあるからと読み込んでくれない。ドキュメントをちゃんと読めってやつですね。


#ファイル名がわかりづらい
これは私以外の人から上がった意見ですが、ファイル名だけ見ていると今自分がどこのファイルを編集しているのかがわかりづらいということがありました。IDEなんかでは上にタブでファイル名が並ぶわけですが、view modelやコントローラー名、viewを同じにしていると、どのファイルがどれなのかというのがわかりにくい。みんな、例えばindex.phpだったりするわけです。
かといってフルパスを表示させるためには余白が足りない。ファイル名を変えたら今度はどこと関連づいてるのかわかりづらい気がする。これもどうしたらよいのでしょうね？


#まとめ
適当に困ったことや思ったことを羅列してみました。
中身のない話でしたが、ちょうど真ん中あたりですし、息抜き程度に思って見ていただけたらと思います。
皆さんも困ったこととかありますかね？
近年メジャーとなった脆弱性問題まとめ

近年メジャーとなった脆弱性問題まとめ

##脆弱性一覧
- Heartbleed Bug
http://japan.zdnet.com/article/35047296/
- CCS Injection脆弱性(CVE-2014-0224)
https://lepidum.co.jp/news/2014-06-05/news-CCS-Injection/
- Shellshock,Bashの脆弱性
http://www.trendmicro.co.jp/jp/security-intelligence/vulnerability/shellshock/index.html

- CVE-2014-4877: Wget FTP Symlink Attack Vulnerability
http://www.tiger1997.jp/report/activity/securityreport_20141107.html
- POODLE，
http://blog.trendmicro.co.jp/archives/10564
- Linuxカーネルの権限昇格，CVE-2014-3153
https://www.softbanktech.jp/information/2014/20141128-01/
- NTPのバッファオーバーフロー
http://xn--u9j0md1592aqmt715c.net/ntpd-cve-2014-9295/
- GHOST CVE-2015-0235
https://access.redhat.com/ja/node/1333303

- Freak 脆弱性
https://access.redhat.com/ja/node/1373913
前日にビルド成功したDockerfileが翌日にビルドできなかったことについて

#概要
前日にbuild成功したDockerfileが翌日build失敗する現象についての記録。
結論としてはメモリ不足が原因。再起動で解決。

#開発環境
環境は以下のとおり。

- Windows7
- vagrant1.7.4
- virtualbox5.0.10
- 仮想マシンubuntu14.04
- 仮想マシン上Docker 1.6.2

#記録
buildしようとしたDokcerfileは以下

```Dockerfile.
FROM node:5.2.0

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY package.json /usr/src/app/
COPY gulpfile.js /usr/src/app/

#タスクランナーインストール
RUN npm install -g gulp
RUN npm install --save-dev gulp 
RUN npm install --save-dev require-dir 
RUN npm install --save-dev gulp-if 
RUN npm install --save-dev gulp-livereload

#サーバーインストール
RUN npm install --save-dev express 
RUN npm install --save-dev body-parser 
RUN npm install --save-dev cookie-parser 
RUN npm install --save-dev debug 
RUN npm install --save-dev jade 
RUN npm install --save-dev morgan 
RUN npm install --save-dev serve-favicon 

# ウェブソケットインストール
RUN npm install --save-dev socket.io

# DBドライバインストール
RUN npm install --save-dev mongodb

CMD [ "gulp", "watch" ]
```

１つ１つ ```RUN npm install ```しているのは、前日package.jsonに記述して
```RUN npm install ```とやったら以下のエラーが出てbulid失敗したため。

```
make: Entering directory '/usr/src/app/node_modules/bufferutil/build'
  CXX(target) Release/obj.target/bufferutil/src/bufferutil.o
Killed
INFO[0082] The command [/bin/sh -c npm install --save-dev socket.io] returned a
non-zero code: 137
```

前日の時は、上記のDockerfileのように１つずつインストールすることによってエラーを回避することはできた。
ただし、何故エラーがおきて、何故１つずつでエラーが起きなくなるのかはわからなかった。

翌日、少し変更をして```docker build ```としたら先のエラーが出現。変更を元に戻してもbuild失敗する。
あれこれいじっていたら次のエラーがでた。

```
`fork': Cannot allocate memory
```

メモリが足りない、ということでvagrantの再起動を行ったところ、buildが成功するようになった。
ということは、前日にpackage.jsonに全てのパッケージを記述してインストールする方法も、メモリが足りなかった可能性が高い。１つずつRUNすることによってエラー回避できたのは、使用メモリが減ったためか。
意識低いRetina対応。レガシーサイトの画像は俺の嫁に丸投げ (それとjpegノイズ対策)

# 三行説明
機械学習のチカラでRetina対応されてない画像の倍率をx2.0に変換して高ppi化。
jpeg臭いのが嫌ならGIMPを使おう。
iPhone6Plusの話はやりたくない。

# 何故やるのか
iPhoneのRetina液晶を始めとした高精細な液晶を搭載する携帯・タブレット端末・パソコンが増えた為、従来の等倍比率の画像が貼り付けられたWebをこれらの環境で閲覧すると、モヤッとしてしまう。

例えばimgタグに埋め込む画像を、今の2倍の縦横比のものにして、それを1/2の幅指定で埋め込めば良い。

もちろん、現在掲載しているjpg,pngをふつーに拡大処理するだけでは意味がない。普通のアプリケーションでこれらを拡大してもたかが知れており、モヤッは結局消えずじまいだろう。

なので全てのファイルを解像度に余裕がある.psdで管理しているならば、それを改めて書き出せば良い。画像が多ければ、全部の画像を2倍にできるようなバッチスクリプトを書けば良い。

面倒。

ならば、ここは"俺の嫁"にご登場願う他ないだろう。


# 何をやるのか
waifu2xを利用する。
[二次元画像を拡大したいと思ったことはありませんか？](http://ultraist.hatenablog.com/entry/2015/05/17/183436)
[写真を綺麗に拡大できるようになった「waifu2x-caffe」の使い方](http://nelog.jp/waifu2x-caffe-for-picture)

実装もいっぱい。
[waifu2xとその派生ソフト一覧](http://kourindrug.sakura.ne.jp/waifu2x.html)

コマンドラインが苦手な方へのオススメはこちら(windows)。個人的にはcaffeを推す。
[waifu2x_win_koroshell](http://inatsuka.com/extra/koroshell/)
[waifu2x-caffe (for Windows)](https://github.com/lltcggie/waifu2x-caffe/releases)

※ 本家でウェブサービス版があるが、サーバ負荷（AWSかな）が高いそうなので、なるべくスタンドアロンで使おう。

![qiitaup.jpg](https://qiita-image-store.s3.amazonaws.com/0/23318/fc2aa68f-bcfd-618e-6e3c-f97c6ce8ee8a.jpeg)

(画像はx2.0,ノイズ除去:弱)
waifu2xで吐き出した画像は、もちろん等倍で見るには微妙なところもあるものの、これを縦横比1/2に縮小した際の画質は、従来のソフトで倍化したもののそれを上回る。
「特有の塗り絵臭さ」も、Retina液晶で閲覧すると目立たなくなる（ユーザが拡大操作を行った時は流石に目につく）。

## issue: jpeg特有のモスキートノイズが乗って、それがそのまま拡大される
輪郭周辺にモヤモヤができる、あのノイズの対策が肝となる。とりあえずはwaifu2xの「ノイズ除去」を試してみよう。案外と有能(実際、上記の画像例がwaifu2xでのノイズ除去。まだ目元あたりに変な色ムラが出ているのが視認できる)。

しかしそれでもどうしても取りきれないノイズも存在する。また、レンダリング速度が落ちるのも辛い。そこで、GIMPのフィルタ「選択式ガウスぼかし」を利用し、予めノイズリダクションしておこう。

[tips - GIMPでJPEGの蚊を退治して"PNG"化する](http://blog.livedoor.jp/dankogai/archives/51821974.html)

![gimp.jpg](https://qiita-image-store.s3.amazonaws.com/0/23318/74a2cd88-d299-2127-a87f-b036ac17eaaf.jpeg)

ノイズ除去に有りがちな、線の輪郭がボケる感じを抑えたまま、スピーカー・スリッパなどの目立つ劣化を改善できる。また、戸棚や服などのディテールも、ある程度は保持できている。
例ではイラストだが、写真ではディテールに大きく影響する。パラメータの値を調整して妥協点を見出そう。当方では調整後に薄くシャープをかけることも多い。
もっとも、waifu2xに突っ込む前提の話なので、あまり神経質にならなくても問題ない。

## issue: 「1分で実現できる有用な技術 Advent Calender」って銘打ってるけど、本当に1分で終わるの？ CLIで複数画像指定とかしたら時間かかるのでは。
手間は１分、暇は１時間以上。

＿人人人人人人人人人＿
＞　カレンダー詐欺　＜
￣Y^Y^Y^Y^Y^Y^Y^Y￣
Pythonで円周率を1000000桁出力するワンライナー

多分これが一番早いと思います

`python -c "import urllib2;print(urllib2.urlopen('http://www.angio.net/pi/digits/pi1000000.txt').read())"`


参考
===
http://qiita.com/eqs/items/d138170c87e90953d841
Unity5.3.0にしてシェーダーが機能しない場合の対処方法

# 概要
Unity5.3.0.f4にプロジェクトを移行してから、シェーダーがうまく動作しなくなりました。
（OSXでのUnity Editor上でのみ）
具体的には dot関数が0ベクトルしか返さず、他にも色々と不具合が出ておりました。

## 原因
これを原因といってよいかわかりませんが、Unity5.3からプラットフォームごとに選択できるグラフィックAPIがデフォルトでOpenGLCoreになってるためでした。
OpenGLCoreに関しては、詳細がよくわからないこともあり、とりあえず以前の状態に戻すために設定を変更することで対応します。

## 手順
1. メニューから[Edit]-[Project Settings]-[Player]を選択
2. [Other Setting]から[Auto Graphics API for Mac]のチェックボックスを外す
3. OpenGLCoreが最上位に来てるので、OpenGL2を最上位に変更してApplyする。
4. 以上

## コメント
本当はAdvent Calendarに投稿しようと思ってたんですが、よくわかっていないところが多く、
（例えばなんでOpenGLCoreでは動作しないのか、その理由など）
辞退しました。
とはいえ、困ってる人も多いと思うのでメモ代わりに記事にしました。
(CRI Manaを使ってる人もこれで直ったりします）
a=aは未定義動作になりうるか?

a=aは未定義動作になりうるか?
============================

はじめに
--------
### 注意
この記事は僕が[C11の規格](http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf)を独自に解釈したものであり，この記事の正当性を何ら保証するものではありません．
この記事を吹聴して恥をかいても，自己責任でおねがいします．
寧ろツッコミ大歓迎です．

### 知っておくと良いこと(前提知識ではないので知らなくても良い)
- `i=++i+1;`は未定義動作
- [注釈84](http://port70.net/~nsz/c/c11/n1570.html#note84)より自明．
- 自明というからには説明できるんでしょうね．[はい．書きました](http://qiita.com/amama/items/20880e91650b5ef5d21b)

主張
----
**式文 `a=a` は未定義動作になりうる.**

### 条件
変数(オブジェクト)`a`が`volatile`修飾子付きで宣言されている．
例えば，

```c
int main(void) {
volatile int a = 0;
a = a;
}
```

など

この時，全ての`a`に対するアクセスは[6.7.3 paragraph 7](http://port70.net/~nsz/c/c11/n1570.html#6.7.3)によって処理系定義であることに注意すべき．

### なぜ未定義動作になるか
1. [5.1.2.3 paragraph 2](http://port70.net/~nsz/c/c11/n1570.html#5.1.2.3)より，**volatile objectへのアクセスはside effect，即ち副作用を生む．**
2. [6.5.16 paragraph 3](http://port70.net/~nsz/c/c11/n1570.html#6.5.16)より，左辺値への代入は副作用を含み，その副作用は右のオペランドと左のオペランドを評価したあとに行われ，**左右のオペランドの評価の順序は**unsequencedである(**定義されない**？でいいのか)．
3. [6.5 paragraph 2](http://port70.net/~nsz/c/c11/n1570.html#6.5)によって，あるオブジェクトに対する副作用が同じオブジェクトの別の副作用と関係していて，それらの副作用の順序が定義されていない時，**未定義動作**である．
4. 1. より，`a=a`は右辺を評価した時に`a`に副作用が生じ，
  単純代入の式なので，`a`を`a`にするという副作用が生じる．
  また，これらの副作用の順序は定義されず，副作用完了点までに副作用が生じていれば良い．  
  よって，3. の条件を満たすため， `a=a`は**未定義動作**となる．
  
結論
----
以上により，`a=a`は未定義動作になりうる．

参考
----
[http://port70.net/~nsz/c/c11/n1570.html]()
Staringスマホアプリ開発テクニック (使える！DragonBones その2)


こんにちは、harayokiです。
この記事はDragonBonesの裏技的な使い方、の第二弾です。

![cover.png](https://qiita-image-store.s3.amazonaws.com/0/8302/1e5a5292-c8b1-8498-3bae-027d0110a6f7.png)

# 意外な使い道#2 美しいテクスチャ画像を扱う
DragonBonesが書き出すキャラクターアニメーションデータは、テクスチャアトラス(png + json形式)とアニメーションデータ(json形式)という（アニメーションツールでよくある）フォーマット以外に、独自の**dbswf形式**で書き出す事ができます。ある事情により拡張子が異なるが中身はswfそのものです。loadMovieして再生する類のものでなく、ランタイムが読み込んで使う、パーツ画像とアニメーションデータ詰まったデータとしてのswfなのですが、これがかなりの優れものです。

このdbswf形式を的確に用いた場合、ファイルサイズが小さく、美しいアトラス画像のキャラクターアニメーションを再生させる事ができます。(メカニズムは後述します。）そしてキャラクターアニメーションデータ内で使われているテクスチャは、プログラムからパーツ別に参照することができますので、キャラクターアニメーションを用いないコンテンツでも、利用したい画像を適当に配置しただけのdbswfを書き出すなどして、美しい画像データを得るためだけの目的にDragonBonesを利用する事ができます。

ちょっと意味が通じないかな。簡単にまとめると、DragonBonesを利用すると綺麗なテクスチャ画像が得られる、ということです。

# dbswf形式の長所

下記にテクスチャアトラス形式と比較した場合の、dbswf形式の長所を解説します。
 
#### ・アニメーションデータサイズが小さい
アニメーションデータはJSONテキストでなくdbswf内にバイナリのまま保持されているので、非常にサイズが小さくなります。swf形式ですのでさらに全体にZLIB圧縮もかかっているかと思われます。
#### ・画像ファイルサイズが小さい
アニメーションに画像ではなくパス素材を使っていた場合、dbswf内にはパスのままデータが保持されていますので、場合によってはファイルサイズが激しく小さくなります。(制御点が多い複雑パス画像の場合は逆にファイサイズが大きくなります。そのような場合はFlashPROの機能でパスをビットマップ変換してしまえば良いでしょう。)
#### ・テクスチャ画像が劣化しない
同じくパス素材を使った場合ですが、DragonBonesランタイムはデータの初読み込み時にパス画像をテススチャアトラス形式に変更しますので、事前にテクスチャトラス画像(pngやその他形式)を減色してファイルサイズダウンするときにおこしてしまう**画質の劣化が起こりません。**減色にさまざまなツールを用いて、画質とファイルサイズのバランスを取る戦いは日々開発現場で行われているかと思いますが、dbswfを使う場合、その戦いから解放されるわけです。特に**グラデーションを多用したデザインを扱う場合に効果的**で、顕著に美しさが感じられると思います。
#### ・ピクセルパーフェクト可能
スケーリング指定したテススチャアトラス変換も可能なので、端末の解像度に合わせて**ピクセルパーフェクトな画面を作ることも可能**です。
#### ・透明度付きjpgが使える
dbswf内ではswfの画像書き出し設定がそのまま適用されて画像が書き出されています。ロスレスにするか jpgにするか、というあれです。ここでswfフォーマットではビットマップ素材のjpg書き出しでもアルファ情報を保持できることを思い出してください。透明度をもった大きな画像パーツを扱わなくてはいけない場合、透明度付きjpgはかなり効率良く画像ファイルサイズを圧縮します。通常は泣く泣くpngにせざるを得なかったりしていないでしょうか。

これらの長所を生かしてdbswfデータを作成すれば、比較的ファイルザイズを気にしないで開発を進められるので、美しいテクスチャ画像を持ったアニメーション再生をさせることができます。

# dbswf形式を扱う際の注意点

以下は dbswf形式を扱う際の注意点です。

* 動的なテクスチャアトラス変換処理は同期で最初の１回だけおこなわれ、データ構造によってはそこそこ重たい処理となります。ゲームではシーンの初めにまとめてデータを読み込んで初期化しておくのが良いでしょう。途中でdbswfを読み込んで初期化すると、ロード時にガクガクっとフレームレートが落ちるあれが出てしまいます。Webコンテンツだとあまり気にされてませんでしたが、最近のアプリでこれがあると目立ちますね。
ActionScript Workerを利用するなどしてデータの初期化時にも滑らかな演出を見せておくなどの対応も良いかもしれません。(自分はWorker機能はちゃんと活用したことがないのでうまくいくかわかりませんが。）
　　
* あまり大きいアトラス画像に動的変換すると、メモリが足りなかったり、GPU側が対応している画像サイズを超えてしまう場合があります。アトラス画像拡大率の上限は決めておき、上限を超えた場合、それを画面サイズにあわせて拡大表示する方法をとれば良いでしょう。
　

* パフォーマンスを優先する場合などはdbswfでなくアトラス画像形式でデータを書き出したほうが良い場合もあります。
　

* 素材に細かいpng画像が多い場合などでは、画像にロスレス書き出し設定がされてると、そこまでdbswfのサイズは小さくならないと思わます。その場合も最初からアトラス画像形式で書き出し、外部画像ツールで減色対応をしたほうが良いでしょう。

# その他

* テクスチャの直接参照の仕方はここのチュートリアルに例があります。最後の方のドラゴンがTシャツを着替えているコードがそれです。
https://dragonbones.github.io/DBGettingStarted_V2.0_ja.html
　

* アトラス変換処理中はStage.qualityの値をHIGHかBEST設定にしてください。LOWにしておくと、生成されるテクスチャアトラス画像を回転した際にジャギジャギに見えてしまう事があります。変換処理完了後は適切な値に戻して大丈夫です。スマホではアンチエイリアス処理をいれても目立たないので、Stage.quality はMEDIUMにする事が一般的かと思います。

# 終わりに

上記テクニックは適用しずらい場面もあるかと思いますが、うまくはまるとかなり効果的です。機会があればぜひ一度お試しください。

今回は以上です。次回も(カレンダーの空きと自分の時間があれば）DragonBones絡みでUIを作る方法のポストをします。ではまた。
今年作ったEmbulkプラグインのご紹介(input-remote, filter-hash)

この記事は[Embulk Advent Calendar](http://qiita.com/advent-calendar/2015/embulk)の15日目の記事です。

今回紹介するプラグインはどちらも紹介記事をすでに書いてるのですが、あまり読まれてないっぽいので、、、宣伝のため再度書かせていただきます。

- [input-remoteの記事](http://kamatama41.hatenablog.com/entry/2015/04/14/213004)
- [filter-hashの記事](http://qiita.com/kamatama_41/items/d0318038a9744f8a1115)

ちなみに本日12/15は[Embulk Meetup Tokyo #2](http://eventdots.jp/event/575046)が開催されます。
執筆時点(12/14夜)でまだ空きはありましたのでEmbulkに興味がある方は参加されると良いかと思います。

---
## embulk-input-remote
https://github.com/kamatama41/embulk-input-remote

SCPを使ってリモートホストからファイルを読み込むためのinputプラグインです。remoteっていう命名はちょっと大げさすぎたかなと反省しています(embulk-input-scpとかで良かった...)

昨今のクラウド時代、アプリケーションログなんかは基本的に別途S3とかpapertrailといったクラウドサービスに転送していることが多いかと思いますが、SIerや息の長いWebサービスとかで今でもオンプレ環境で運用している場合、生のログファイルをSCPで収集していることもあるのではないでしょうか。(というか以前運用していたサービスはそうでした)
　


#### 使い方
基本は対象のホスト群と読み込みたいファイルもしくはディレクトリを指定します。ディレクトリを指定すると配下のファイルを全部読み込みます。

SSHの認証方法は`auth:`内に指定します。

- `type: public_key`(公開鍵認証)
- `type: password`(パスワード認証)

```yaml
in:
  type: remote
  hosts:
    - host1
    - host2
  path: /some/path/app_20150414125923.log
  auth:
    user: kamatama41
# 公開鍵認証
    type: public_key
    key_path: /usr/home/.ssh/id_rsa
# パスワード認証
#    type: password
#    password: {password}
```
　
#### `hosts_command`, `path_command` オプション
対象Hostとファイルパスは任意のコマンドの結果を利用することができます。

- Host管理(サービスアウト、インなど)を別のミドルウェアで管理している場合
- 読み込みたいファイルに日時が付いてて動的に変えたい場合

なんかの利用を想定しています。が、今はliquidテンプレート機能があるので、そちらでも実現できるかもしれません。

```yaml
in:
  type: remote
  # hostsをechoコマンドで指定
  hosts_command: echo 'host1,host2'
  # hostsのセパレータ(デフォルトは半角スペース)
  hosts_separator: ','
  # ファイルパスの日付部分を動的に指定
  path_command: echo /some/path/app_`date "+%Y%m%d%H%M%S"`.log
```
　
#### `ignore_not_found_hosts` オプション
このオプションを使うことで、リモートに**ファイル(or ディレクトリ)が存在しない**Hostがあった場合の挙動を調整できます(デフォルトはfalse)。ちなみにSSHが繋がらなかった場合など、ファイルの不存在以外でエラーになった場合はresumeの対象になります。

- trueの場合、無視されます(resumeの対象外になる)
- falseの場合、失敗した扱いになります(resumeの対象になる)

## embulk-input-hash
https://github.com/kamatama41/embulk-filter-hash

任意の列を任意のアルゴリズムでHash文字列に変換するフィルタです。
用途としては以下のようなものを想定しています

- メールアドレスや電話番号などの機密情報をExport先のキー項目として使いたいが、生で保存するのはちょっと...

値をtoStringしてからHash化するので一応すべての列をHash化できます。が、timestamp型やdouble型がどういう結果になるかは保証できません。

### 使い方
```yaml
filters:
  - type: hash
    columns:
    - { name: username }
    - { name: email, algorithm: SHA-512, new_name: hashed_email }
```

- `columns`: Hash化したい列を配列で指定します
  - `name`: inputの列名です。
  - `algorithm`: Hashアルゴリズムを指定します。[MessageDigest](https://docs.oracle.com/javase/7/docs/api/java/security/MessageDigest.html)を内部的には使ってて、そこで指定可能なアルゴリズムを記述します。(デフォルトは`SHA-256`)
  - `new_name`: ハッシュ化した列に新しい名前を付けたい場合に記述します。デフォルトはinputの列名です。

アルゴリズムに関して、JavaドキュメントによるとJVMによって使えるものが違うらしいので、自分たちのJVMで使えるアルゴリズムを確認したい場合は以下のコードを実行してみてください。デフォルトで`MD5`,`SHA-1`,`SHA-256`は必ずサポートされているようです。

```java
for (String algorithm : java.security.Security.getAlgorithms("MessageDigest")) {
    System.out.println(algorithm);
}
```
Zabbixイベントをタイムラインに並べる

この記事は[Zabbix Advent Calendar 2015](http://qiita.com/advent-calendar/2015/zabbix)の15日目です。

# Zabbixイベントをタイムラインに並べたい

私が関わっている、とあるチームでは毎週、一週間に起きた障害の振り返りを行っていて、大きな障害の情報を共有したり、多く発生している警告などについてその対策を考えたりしています。

その振り返りミーティングのときにはZabbixの「レポート > 障害発生数上位100項目」をメンバーで眺めています。

しかし「障害発生数上位100項目」に表示される情報はあまり多くないので、「イベント履歴」の画面に飛んだり、当該時間のアイテムのグラフの画面に飛んだりで、当該時刻の状況を俯瞰的に把握するには辛いものがあります。

たとえば「5xxカウント > 閾値」のイベントが発生したとき、同時刻に発生した警告・障害をさっと把握できるといいなぁ…などと考えていました。

# Zabbix-Plugin-Timeline

それでそんなことができるツールをいろいろと探してみたところ、[Zabbix-Plugin-Timeline](https://github.com/SinaMSRE/Zabbix-Plugin-Timeline)というプラグイン？が見つかりました。

これは、以下のようにZabbixのWeb画面にタブを追加して、タイムラインを表示するものです。

[SinaMSRE/Zabbix-Plugin-Timeline](https://github.com/SinaMSRE/Zabbix-Plugin-Timeline)
![](https://github.com/SinaMSRE/Zabbix-Plugin-Timeline/raw/master/timeline.png)

「求めていたものはまさにこれだ！」と思ったんですが、残念ながらZabbix 2.2でしか動かない…
がんばれば2.4に対応できるかも知れないと思いつつ、魔改造系プラグインをがんばって修正するのもなんだかな…と躊躇していました。

# 自作することにした

Zabbix-Plugin-Timelineを眺めていたら、タイムラインの描画には[Timeline.js](http://almende.github.io/chap-links-library/timeline.html)というJSライブラリを使っているようで、使うのはそんなに難しくはなさそうでした。

また、Zabbixイベントも以下のようにAPIをたたけば取ってこれます。

```rb
#!/usr/bin/env ruby
require 'zabbix/client'
require 'pp'

client = Zabbix::Client.new('http://zabbix.example.com/zabbix/api_jsonrpc.php')
client.user.login(user: 'Admin', password: 'zabbix')

# https://www.zabbix.com/documentation/2.4/manual/api/reference/event/get
events = client.event.get(
  filter: {object: 0, value: 1},
  sortfield: :clock,
  sortorder: :DESC,
  select_alerts: [:subject],
  selectRelatedObject: [:description],
  selectHosts: [:host],
  limit: 10000)

pp events
#=> [{"eventid"=>"718",
#     "source"=>"0",
#     "object"=>"0",
#     "objectid"=>"13676",
#     "clock"=>"1449916803",
#     "value"=>"1",
#     "acknowledged"=>"0",
#     "ns"=>"350684510",
#     "hosts"=>[{"hostid"=>"10119", "host"=>"zabbix-client-002"}],
#     "relatedObject"=>{"triggerid"=>"13676", "description"=>"CPU"},
```

コア部分の実装についてはそれほど手間がかからないことが分かったので、自作してみることにしました。

# Zabbix Timeline

ということで、できたのが以下のWebアプリです。

[winebarrel/zabbix_timeline](https://github.com/winebarrel/zabbix_timeline)
![](https://raw.githubusercontent.com/winebarrel/zabbix_timeline/master/etc/zabbix_timeline-demo.gif)

作ったばかりで、まだ実践では活用できていないのですが、障害振り返り時の効率改善につながればいいなーと考えております。

興味のある方はどうぞご利用ください。

明日は、atanaka7さんです。