OmniAICreator/Qiita-1.07M huggingface dataset:
docker-compose で sameersbn/redmine イメージから redmine を立ち上げる

検証で必要だったのでやったら少しはまったのでメモしておきます。

`docker-compose.yml` の作成。
mysql コンテナ側にも DB_NAME/DB_USER/DB_PASS を指定して、データベースとユーザーを作成しておく必要あり。

```
$ vi docker-compose.yml
```

```ruby
version: "2"
services:
  mysql:
    image: sameersbn/mysql:latest    
    volumes:
      - /srv/docker/redmine/mysql:/var/lib/mysql
    environment:
      - DB_NAME=redmine_production
      - DB_USER=redmine
      - DB_PASS=password
  app:
    image: sameersbn/redmine:3.3.2-1
    volumes:
      - /srv/docker/redmine/redmine:/home/redmine/data
    environment:
      - DB_HOST=mysql
      - DB_NAME=redmine_production
      - DB_USER=redmine
      - DB_PASS=password
    ports:
      - 3000:80
```

`docker-compose up -d` する。

```
# docker-compose up -d
Creating network "redmine_default" with the default driver
Creating redmine_app_1
Creating redmine_mysql_1
```

ここまでやると、Redmine が立ち上がる。

```
# curl localhost:3000 | grep Redmine | head -1
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3758    0  3758    0     0   163k      0 --:--:-- --:--:-- --:--:--  159k
<title>Redmine</title>
```
ショートカットを活用しよう - 19 - (Excel) Space + α

# Excel での <kbd>Space</kbd>の各種効果など
行列の選択を行います。
<kbd><kbd>Shift</kbd> + <kbd>Space</kbd></kbd>：行の選択（※IMEがOFFの場合）
<kbd><kbd>Ctrl</kbd> + <kbd>Space</kbd></kbd>：列の選択

この後続いて、コピー＆ペーストなどを行います。
例えば、行または列をコピーして別の位置に挿入する場合、<kbd><kbd>Shift</kbd> + <kbd>Space</kbd></kbd>で行選択、<kbd><kbd>Ctrl</kbd> + <kbd>Insert</kbd></kbd>でコピー、別のセル位置で再度<kbd><kbd>Shift</kbd> + <kbd>Space</kbd></kbd>で行選択した後、<kbd><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>+</kbd></kbd>（テンキー側の場合<kbd><kbd>Ctrl</kbd> + <kbd>+</kbd></kbd>）でコピーした行の挿入といった感じです。


ちなみに、<kbd>Alt</kbd>の場合、Excelというより全アプリケーション共通で、コントロールボックス(Windowの左上のアイコン部分と最小最大化ボタンなど)のメニュー表示です。
<kbd><kbd>Alt</kbd> + <kbd>Space</kbd></kbd>：コントロールボックスのメニュー表示

コントロールボックスについては、その後アクセスキーを押してウィンドウの操作を行うと便利です。
例えば、ウィンドウサイズを微妙に変更したい場合、<kbd><kbd>Alt</kbd> + <kbd>Space</kbd></kbd>、<kbd>S</kbd>、<kbd>→</kbd>、<kbd>↓</kbd>のようにすれば、カーソルがウィンドウの右下に移動します。その後続いて、矢印キーを操作することで、ウィンドウサイズの変更を行えます。この際、<kbd>Ctrl</kbd>を押しながら矢印キーを操作すると1pxずつの変更になります。


以上

|前回|方針|次回|
|:--|:--:|--:|
|[(Excel) <kbd>F11</kbd>の各種効果](http://qiita.com/rrryutaro/items/1629ac7d157a762e8da0)|[記事の方針](http://qiita.com/rrryutaro/items/74d60a6e31ff149c5710)|[(Excel) <kbd><kbd>Alt</kbd> + <kbd>Shift</kbd> + <kbd>→</kbd></kbd>](http://qiita.com/rrryutaro/items/d4646f9b5c3c8b411fe5)|
Cognos 10 BI と Cognos Analyticsの機能マッピング一覧

Cognos 10 BIに使い慣れたユーザーの方がCognos Analyticsに移行された時に、あの機能はどこに行ったのか、アイコンが見当たらない、といった問い合わせを受ける事が多くあります。

Cognos 10 BIでの機能の一覧を、Cognos Analyticsでの有無、その機能をどこから使用できるのか、というマッピングを作成しました。

Cognos Analytics 11.0.4ベースで作成したものを、11.0.5版に編集していますので、修正しきれてないところもあるかも知れません。
もし実際にやってみて、できないという箇所にお気づきになった場合は、是非この記事のコメントにご指摘下さい。

**Cognos 10 BI と Cognos Analyticsの機能マッピング一覧**
http://www.slideshare.net/ShinsukeYamamoto/cognos-bi-vscognosanalytics-72206109
vim: :%sを使って(nm)を==nmに書き換える

#やりたいこと

```
beautifulsoup4 (4.5.3)
bleach (1.5.0)
chardet (2.3.0)
cmsplugin-filer (1.1.3)
dj-database-url (0.4.1)
Django (1.8.17)
django-appconf (1.0.2)
django-classy-tags (0.8.0)
django-cms (3.4.1)
django-contrib-comments (1.7.3)
django-filer (1.2.5)
django-formtools (2.0)
django-mptt (0.8.7)
django-polymorphic (0.8.1)
django-sekizai (0.10.0)
Django-Select2 (4.3.2)
django-treebeard (4.1.0)
djangocms-admin-style (1.2.6.2)
djangocms-attributes-field (0.1.2)
djangocms-column (1.7.0)
djangocms-googlemap (1.0.2)
djangocms-installer (0.9.3)
djangocms-link (2.0.3)
djangocms-snippet (1.9.2)
djangocms-style (2.0.1)
djangocms-text-ckeditor (3.3.1)
djangocms-video (2.0.3)
easy-thumbnails (2.3)
filebrowser-safe (0.4.6)
future (0.16.0)
grappelli-safe (0.4.5)
gunicorn (19.6.0)
html5lib (0.9999999)
Mezzanine (4.2.2)
oauthlib (2.0.1)
olefile (0.43)
Pillow (4.0.0)
pip (9.0.1)
pytz (2016.10)
requests (2.12.4)
requests-oauthlib (0.7.0)
setuptools (20.10.1)
six (1.10.0)
tzlocal (1.3)
Unidecode (0.4.20)
urllib3 (1.19.1)
whitenoise (3.2.2)
yolk (0.4.3)
```

を

```
beautifulsoup4==4.5.3
bleach==1.5.0
chardet==2.3.0
cmsplugin-filer==1.1.3
dj-database-url==0.4.1
Django==1.8.17
django-appconf==1.0.2
django-classy-tags==0.8.0
django-cms==3.4.1
django-contrib-comments==1.7.3
django-filer==1.2.5
django-formtools==2.0
django-mptt==0.8.7
django-polymorphic==0.8.1
django-sekizai==0.10.0
Django-Select2==4.3.2
django-treebeard==4.1.0
djangocms-admin-style==1.2.6.2
djangocms-attributes-field==0.1.2
djangocms-column==1.7.0
djangocms-googlemap==1.0.2
djangocms-installer==0.9.3
djangocms-link==2.0.3
djangocms-snippet==1.9.2
djangocms-style==2.0.1
djangocms-text-ckeditor==3.3.1
djangocms-video==2.0.3
easy-thumbnails==2.3
filebrowser-safe==0.4.6
future==0.16.0
grappelli-safe==0.4.5
gunicorn==19.6.0
html5lib==0.9999999
Mezzanine==4.2.2
oauthlib==2.0.1
olefile==0.43
Pillow==4.0.0
pip==9.0.1
pytz==2016.10
requests==2.12.4
requests-oauthlib==0.7.0
setuptools==20.10.1
six==1.10.0
tzlocal==1.3
Unidecode==0.4.20
urllib3==1.19.1
whitenoise==3.2.2
yolk==0.4.3
```

に書き換えたいときは`:%s/ (\(.\{-1,\}\))/==\1/g`で置換可能。`(\(.\{-1,\}\))`で置換対象を選択して`==\1`で一気に変えている。

追記：
ここまで手をこらずとももっと楽に置換する方法
`:%s/ (\(.*\))/==\1/`、`:%s/ (/==/|%s/)`や`:%s/ (/==/` `:%s/)$//`
コメントをくださった方ありがとうございました。勉強になります。

#参考にしたリンク

- <a href="http://archiva.jp/web/tool/vim_regexps.html" target="_blank">Vimで使える正規表現</a>
- <a href="http://nupioca.hatenadiary.jp/entry/2013/06/27/021704" target="_blank">vimの正規表現</a>
- <a href="http://note103.hateblo.jp/entry/2015/04/06/154834" target="_blank">Vimの正規表現で最短マッチ（非欲張り型）を実現する</a>
Dropbox Paperの文書を削除するには

Dropbox Paperで文書を作成したあと、不要になったとき「削除」をしたくなりますが、メニューには出てきません。

しかし、実際には次の手順で削除できます。

1. 文書を開いて、右上のメニューから「アーカイブ」をクリックします。

![2017-02-16_7-58-37.png](https://qiita-image-store.s3.amazonaws.com/0/3977/bc02e0d4-9b06-8227-c1eb-904f55f318ad.png)

2. アーカイブ完了画面に、「完全に削除」というリンクがあるので、これをクリックします。

![2017-02-16_7-59-00.png](https://qiita-image-store.s3.amazonaws.com/0/3977/1a61ee8f-d398-c25d-f22c-44737a48faf4.png)
python-fu 自動操作おさらい

# Python-fu 操作おさらい
GIMPでよく使う基礎処理をまとめ。


## imageの取得

ファイルロード時

```
import sep

filepath = C:\"
filename = filepath + sep + raw_filename
image = pdb.gimp_file_load(filename, raw_filename)
display = pdb.gimp_display_new(image)
```
ロード済の状態から取得する場合

```
image = gimp.image_list()[0]
```
## 操作するレイヤーの設定
レイヤーIDで指定する場合。レイヤー一括処理する時に使う

```
num , ids= pdb.gimp_image_get_layers(image)
layer = gimp.Item.from_id(ids[0])	#リストからのレイヤーID指定
```

レイヤー名で指定する場合

```
layer = pdb.gimp_image_get_layer_by_name(image, name)	## レイヤー名からのレイヤ指定
```

## レイヤー追加
gimp.Layer()だけではアルファチャンネルは含まれない事に注意

```
image = gimp.image_list()[0]
name = "新規レイヤー"
width   = image.width
height  = image.height
type    = RGB_IMAGE
opacity = 100
mode    = NORMAL_MODE
layer = gimp.Layer(image, name, width, height, type, opacity, mode)

# 最前列にレイヤーを追加
position = 0
image.add_layer(layer, position)

# アルファチャンネルの追加
pdb.gimp_layer_add_alpha(layer)
pdb.gimp_edit_clear(layer)

```

# レイヤーの確認・作成
レイヤーのチェック、なければ作成

```
num , ids = pdb.gimp_image_get_layers(image)
name = "test" 
for layer_id in ids:
	layer = gimp.Item.from_id(layer_id)
	if layer.name == name:
		break
else:
	name = "mask"
	layer = add_layer(image,name)
```

# 全レイヤーを処理する例
```
num , ids = pdb.gimp_image_get_layers(image)
for layer_id in ids:
	layer = gimp.Item.from_id(layer_id)
	print layer
        
	# 名前で処理しないレイヤーを判別
	if  through_layername1 in layer.name or through_layername2 in layer.name:
		continue
		
	# レイヤーマスクを無効
	if pdb.gimp_layer_get_apply_mask(layer):
		pdb.gimp_layer_set_apply_mask(layer, True)

	# 不透明な範囲を選択
	pdb.gimp_selection_none(image)
	pdb.gimp_image_select_item(image, 0, layer)

    # 描画色の設定
    maskcolor = (255,255,255,1.0)
	pdb.gimp_context_set_foreground(maskcolor)
			
	# 塗りつぶす[Ctrl+;]
	pdb.gimp_edit_fill(layer, FOREGROUND_FILL)

```
機械学習論文読みメモ_40


[Tensorizing Neural Networks](https://pdfs.semanticscholar.org/e6f2/f3a5cc7c7213835b9aede15715b5830520e1.pdf), NIPS2015
deep learningモデルは高性能であるが、その分計算リソースを要求する。
特に全結合ネットワークなどはメモリ要求が高く、そのためローエンドのデバイスには適用が難しい。
本論では、全結合ネットワークをTensor Trainを用いた変換により、パラメータ量を大幅に削減する手法を提案する。
Tensor Trainではテンソルを低ランクな行列の積の連なりで表現する方法で、そのままのテンソルを保持するよりも大きくメモリを節約可能である。
本論ではこのTensor Trainフォーマットを用いてdeep learningモデルを表現し、学習まで行う事を可能にし、計算効率を高めた。

[VARIATIONAL CONSENSUS MONTE CARLO](https://papers.nips.cc/paper/5888-variational-consensus-monte-carlo.pdf), NIPS2015
データを分割しパラレルにMCMCを行う場合を扱う。
このような手法の中で特に、最初と最後のみに各処理クラスタ間で通信を行うconsensus monte carlo (CMC)を考える。
各クラスタでは、subposterior samplingによりサンプリングが行われ、最後にそれらが集められ、全体の事後分布サンプルが得られる事になる。
この場合、subposteriorを適切に求める事が出来れば、全体の事後分布サンプルを適切に求める事が可能になる。
また、各クラスタでサンプルされたものをどのような凝集するかが重要になり、それをガウス分布仮定に基づいた重み付き計算より行うのがCMCとなる。
しかしこの凝集に関してガウス分布仮定ではなくより良く事後分布を近似出来るような手法が考えられる。
また変数間の依存関係に関する制約を考慮に入れる事でさらなる改善も期待出来る。
本論ではこうした観点から、variational consensus monte carlo(VCMC)を提案する。
VCMCでは全結合分布を各独立分布の積として近似する変分ベイスの観点から、凝集を行う関数を推定する。
またデータ構造に関する情報も取り入れ可能である。

[Policy Evaluation Using the \Omega-Return](http://psthomas.com/papers/Thomas2015d.pdf), NIPS2015
強化学習におけるTD-lambda学習の代替手法としてTD-Omegaを提案する。
TD-lambdaはBellman equationより求める期待累積利得の各ステップにおける変化値に基づいて価値関数を近似的に更新する手法で、パラメータlambdaが大きいほど長いステップ間の変化値に基づいて更新を行う（lambda=1の場合、単純にmonte carlo RLになる）。
lambdaが小さい、短い期間での変化値を利用する場合、分散が小さいが推定バイアスが大きく、lambdaが大きい、長い期間での変化値を利用する場合、分散が大きいが推定バイアスは小さくなる。
従来手法はこれらの分散、バイアス変化を正確に予測する事で予測性能を向上するTD-gammaがあるが、結局、各ステップ長さ間の相関関係を考慮し活用したものはない。
提案するTD-Omegaでは各長さのステップ間の変化値に関して、それらの間に相関を仮定したモデルを提案する。
このモデルはしかし正確な予測が難しいため、本論では特にその近似推論手法についても提案する。
機械学習論文読みメモ_39


[Measuring Sample Quality with Stein’s Method](https://papers.nips.cc/paper/5768-measuring-sample-quality-with-steins-method.pdf), NIPS2015
モンテカルロ予測の実用性を向上するために、実践者はMCMCの漸近的正確さと計算速度のトレードオフを行う。
これは高速サンプリングによる分散の減少効果がその代償に生じるバイアスよりも重要である事を考えると理に叶っている。
しかしながらこのバイアスがある場合、例えば効果を発揮するための有効なサンプル数を見積もる際に正確な見積もりが難しくなる。
本論ではこの問題に対処するために、Stein's methodに基づいた様々な分布に適用可能なサンプル平均と真の平均との差を評価する指標を提案する。
Stein's methodは確率分布間の差を計算するための一般的な手法である。
本指標を用いて、ハイパーパラメータ選択、収束性、bias-varianceトレードオフの評価などを行った。

[Learning Theory and Algorithms for Forecasting Non-Stationary Time Series](http://papers.nips.cc/paper/5836-learning-theory-and-algorithms-for-forecasting-non-stationary-time-series.pdf), NIPS2015
non-stationaryでnon-mixingな一般的stochastic processのlearning boundを扱う。
従来研究においては、stationaryかつmixingが行われている前提での理論解析が行われてきた。
しかしながら、実際の現象においてはそれらは成立しない事が多い。
本論ではそれらが成立しないnon-stationaryでnon-mixingな環境においてのboundを考える。
その際通常のRadamacher complexityやcovering numberではなく、データシーケンスに依存した、シーケンス型の発展系を用いる。
これにより、実際のデータに依存した形でboundを導出する事が可能になる。

[Distributed Submodular Cover: Succinctly Summarizing Massive Data](https://papers.nips.cc/paper/5752-distributed-submodular-cover-succinctly-summarizing-massive-data.pdf), NIPS2015
大量データセットを近似するような出来る限り小さなデータ部分集合を探索する問題を考える。
この問題を扱うにあたっては、大量データと部分データを比較評価する関数が大事になってくる。
そのような関数を本論ではsubmodular cover problemとして定式化する。
比較評価関数はsubmodular性を持っていると仮定する。これはデータ要約において頻出する現象である。
この問題の最適化は、greedy法を用いる事でlogarithmの精度保証で求解可能だが、それは逐次的プロセスであり、大規模データ処理には向かない。
本論では、mapreduce的な計算を可能な手法を提案し、その近似保証を行った。
vim: タブの切替

タブの切替は`g + t`で右へ、`g + shift + t`で左へ、`num + g + t`で指定したnumのタブへ。
![vimmer8.gif](https://qiita-image-store.s3.amazonaws.com/0/87666/c341c565-714b-c89c-b1d3-33857bd70de2.gif)
問題解決についての個人的まとめ

#この記事を書いた理由#
ITとはちょっと外れてしまいますが、自分の仕事のやり方を固めていくために教えられたこと、考えたことを記載していきます。

#考える順序#
1.問題の現象の概要を書く。
2.時系列順に並べる。
3.解決すべきこと、考えることを絞る。
4.自分に判断できること、自分に答えが出せるかを考える
5-1.判断できるのなら、1つ1つキリよく調べる(途中で投げると中途半端になる
5-2.調べていったことを忘れずに記載する(調査の記録を残す。何をやったか忘れるのを防止する)
5-3.解決できるのなら、実施する予定(対策)のことを報告する
6.判断できないのなら、上司に相談する、もしくは詳しい人(担当者)に問い合わせる

#問題解決#
問題発生→事実を集める(調査 or 観察 or 分析)→仮説を立てる(推論)→対策提案

問題発生→仮説を立てる(推論・直感)→事実を集める(調査 or 観察 or 分析)→対策提案

<font color="Red">物事を判断するには、まず事実(根拠)を集めることから。事実なき仮説は、実際の原因と異なる可能性がため、対策が立ったとしても意味がないし、認められない。<\font>

参考
[仮説思考を紹介](http://www.nsspirit-cashf.com/logical/kasetsu_shikou.html)

#上手くいかないときはどうすればいいか#

| 現象       |       原因 |    対策    |
|:-----------------|------------------:|:------------------:|
| 誤った結論にたどり着いた| 判断する事実が足りない | 根拠が無いのに、推論している。<br>判断するに足るか事実を整理する|        

#なぜなぜ分析#
事実を概要にまとめ、時系列順に具体的に書き出し、なぜなぜ分析で掘っていく。
なぜなぜ分析は答えありき/結論ありきではない。主観じゃなく、客観的な事実からスタートしていくことに注意

[なぜなぜ分析とは？](http://www.management-dynamics.co.jp/nazenaze.html)
BLS署名と秘密分散を組み合わせる

# 初めに
BLS署名は[BLS署名の紹介と実装](http://qiita.com/herumi/items/e69721380278c5a30d01)で書いたように、公開鍵や署名の整数倍しか使わない署名方式でした。
そのため秘密分散と呼ばれる技術と相性がよく、分散された署名は多数決で物事を決める投票のような役割を担えます。
ブロックチェーンを使ったEthereumというプラットフォームのトランザクションを高速化するプロジェクト[DFINITY](https://dfinity.network/)で使われています。

# 秘密分散
(k, n)閾値秘密分散とはあるデータsをn個に分割し、そのうちk個集めれば元のsを復元できるという手法です。

やり方は次の通りです。
定数項はsで、他の係数をランダムに選んだ(k - 1)次多項式を用意します。

```math
f(x) = s + r_1 x + r_2 x^2 + ... + r_{k-1} x^{k-1}
```

すると$f(0) = s$です。
n人のユーザに対して、相異なる値$x_1, ..., x_n$を決めてi番目のユーザに$f(x_i)$を渡します（$x_i$はみなに公開してよい。$f(x_i)$はi番目のユーザ以外には秘密にします）。

$(f(x_1), ..., f(x_n))$がsの秘密分散です。

異なる$k$個の点を通る(k - 1)次はただ一つ決まるので、n個に秘密分散された値のうちk個が集まれば元の多項式が復元できます。つまり$f(0) = s$が求まるという仕組みです。
<img width="329" alt="ss.png" src="https://qiita-image-store.s3.amazonaws.com/0/11872/e39295ea-5faf-badb-2512-ba0d89cb067c.png">

グラフはk = 4のときの図で3次曲線が書かれています（『[クラウドを支えるこれからの暗号技術](https://www.amazon.co.jp/gp/product/479804413X)』11.3の図11.2の引用）。
$(x_1, y_1), ..., (x_5, y_5)$のうちどれか3個決めるとその点を通る3次曲線が決まるので$r_0 = s$が決まります。

sの復元方法の細かいことはここでは紹介しませんが$\\{y_i\\}$の線形和で求まる
ことが重要です。

```math
s = (なんとか) \times y_1 + (かんとか) \times y_2 + ...
```

# BLS署名に秘密分散を適用
BLS署名を復習します。$e:G_1 \times G_2 \rightarrow G_T$をペアリング、$H : \\{文字列\\} \rightarrow G_1$をハッシュ関数、QをG2の元としたとき、

1. 秘密鍵sの公開鍵はsQ
2. メッセージmの署名 s H(m)

でした。どちらもある値Q, H(m)をs倍している形です。

したがって秘密鍵sを秘密分散$f(x_1), ...$するとi番目のユーザの秘密鍵は$f(x_i)$, 対応する公開鍵は$f(x_i)Q$, メッセージmの署名は$f(x_i) H(m)$になります。

そして前節で記したようにそれらの線形和なので、秘密鍵だけでなく公開鍵や署名も同じ線形和で復元できます！

たとえばs,  s'を秘密鍵とすると対応する公開鍵はsQ, s'Qで署名はsH(m), s'H(m)です。
そこで2個の公開鍵から3(sQ) + 4(s'Q) =  (3s + 4s')Qを作ると、これは秘密鍵(3s + 4s')に対応する公開鍵であり、署名も3sH(m) + 4s'H(m) = (3s + 4s')H(m)と対応する署名となります。sやs'を知らなくても公開鍵や署名を計算できることに注意してください。

これはつまり次のことができます。

BLS署名のマスター秘密鍵sを一つ決めてn人に秘密分散し、各ユーザに分散された秘密鍵を配布します。そこでsは破棄してもかまいません。

すると各ユーザは、あるメッセージmに対して通常のBLS署名をつけられます。もちろんだれでもその正当性を検証できます。
そして、n人のうちk人が作った署名を集めればメッセージmに対するsによる署名を構築できます。
k人が結託して秘密鍵を共有することなく、署名を公開するだけならsは復元できません。また署名に乱数が入っていないので完全に同じ署名が復元できます。

[bls](https://github.com/herumi/bls)で実装したので興味ある方はごらんください。

このアイデアをブロックチェーンの中で十分な人数の署名が集まったときに次のステップに進む多数決の仕組みとして利用します。
冒頭で紹介した[DFINITY](https://dfinity.network/)ではEthereumのトランザクションより50倍速いとあります（私は未確認ですが）。
面白いですね。
技術英語 > As with dictionary keys, sets [are unordered]. / get things organized

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 1720 / 12833)

> As with dictionary keys, sets **are unordered**.

意訳「dictionary keysと同様に、setsには順番がない」

<hr>
関連して思い出したのは

**get things organized**

https://www.merriam-webster.com/dictionary/get%20organized

> get organized
:  to arrange one's things or one's affairs so they can be dealt with effectively <He never knows what he has scheduled or where anything is. He needs to get organized.>

身近にいる問題解決能力の高い人たちの共通の特徴 (What they have in common is that)は、「整理をしている」こと。
机の上、引き出し、書類棚などにおいて適切な道具を適切に使用して整理をしている。

「xxはどういう仕様だったでしょうか?」という質問に数秒で資料を引き出していただける。

自分もそういう技術者になりたい。
emacs で jedi を使うための設定の備忘録

# 環境
・ Ubuntu 16.04
・ Emacs 24.5.1

# やったこと

(1) ~/.emacs.d/init.el に下記を記述

```
;; melpa
(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t)
(package-initialize)
```

(2) 下記URLを参考にインストール
 
http://qiita.com/yuizho/items/4c121bdecc103109e4fd

~/.emacs.d/init.el は、以下のようになった。

```
;; melpa                                                                                                                         
(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t)
(package-initialize)

;;jedi                                                                                                                           
(add-hook 'python-mode-hook 'jedi:setup)
(setq jedi:complete-on-dot t)
```

(3) virtualenv インストールしてないとエラーになったので、インストールした

```
pip install virtualenv
```

# その他参考ＵＲＬ

http://qiita.com/yoshikyoto/items/3f5de63648febe897bee
Actor Sequence Editor Plugin #UE4Study

# Actor Sequence Editor Plugin

## 概要
4.15で追加されたBlueprintにSequencerの要素を試してみる。
[![Actor Blueprint](http://img.youtube.com/vi/PWlQP3_Mwwk/0.jpg)](https://www.youtube.com/watch?v=PWlQP3_Mwwk)


[![Actor Blueprint Viewport](http://img.youtube.com/vi/auuPgita6GI/0.jpg)](https://www.youtube.com/watch?v=auuPgita6GI)



## Plugin:Actor Sequence Editorを有効にする

ブループリント:BP_ActoreSequence(親：Actor)を作成する
コンポーネントでsequenceと検索するが、何も出てこない
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/be79e5b4-b4ac-a0c5-d2c7-ed065de6ef84.png)

編集->Plugins
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/ccc3e5ed-8772-e7fd-ffeb-6492fb8a31fb.png)

Sequenceで検索する
Actor Sequence EditorのEnabledをチェック
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/e6edcb34-ffb0-8cbd-f5aa-3d5fdee2f110.png)

はいをクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/799c0e23-d210-0bee-4a5c-6f1b6ccccbe2.png)

Restart Nowをクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/6fd277ea-3e15-5085-b8f6-59180572044a.png)

BP_ActoreSequcneを開いて、コンポーネントでsequenceを検索する
Actor Sequenceを追加する
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/8f1b1321-45a0-7f57-4741-a507a84212dc.png)

詳細の Open in TabをクリックするとSequenceタブが表示される
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/f35c74b3-31c1-b32b-0ed4-2ac43eae1f0a.png)

## コンポーネントを追加してSequencerを設定する

コンポーネントを追加する
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/90a9d453-1d72-ee3b-e2af-0fea074dcb15.png)

追加したコンポーネントをSequencerに追加する
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/703bfdd6-8699-3e6b-c1cf-1c0535364472.png)

トラックを追加する
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/524e937d-a9ed-413e-c21b-24dd53d4ad86.png)

キーを設定して、Playbackの詳細を設定する
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/8f1e543f-d16f-5813-f50b-4653053afb78.png)

画面に追加してからプレイして確認する
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/7c6e1c3b-891f-4457-e9b8-98222fa9b112.png)

## イベントグラフからBegin Playで実行するようにする

AutoPlayが無効の時にBlueprintから実行させることも出来る
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/7b3eff07-7d84-b02d-cd42-2dd48b3b4dd6.png)

## 他ブループリントクラスからの呼び出し

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/556128c4-8e94-2002-0644-7284d90cdb76.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/c75c0fa7-62fd-ea1a-b936-77248d57a13d.png)



## レベルブループリントで実行させる

レベルブループリントを開く
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/4e1215b6-65d8-d23b-526e-46811fb24655.png)

キーイベントで実行させると動作する
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/db45e54b-7b5a-f60b-792d-c983b6041182.png)

レベルブループリントでBeginPlayから呼び出すとエラーになった。
タイミングの問題なのだろうか
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/60c1594e-e078-510b-e093-4597d16ca7d0.png)

PIE:Error: エラー Blueprint Runtime Error: Accessed None trying to read property SequencePlayer from function: 'ExecuteUbergraph_Untitled' from node: Play Looping in graph: EventGraph in object: Untitled with description: Accessed None trying to read property SequencePlayer
Certbotで複数ディレクトリにまたがるドメインをカバーする証明書を発行する

Certbotで標準のwebrootプラグインを使ってLet's encryptの証明書を発行する時、複数のディレクトリにルートが存在するマルチドメインのSAN証明書を発行したい時がある。

### イメージ

```
/var/www
└── vhosts
    ├── example.com      // example.com, www.example.com
    └── info.example.com // info.example.com
```

こういうとき、certbotの`--webroot-map`オプションを使うと捗る。[[man]](https://certbot.eff.org/docs/using.html#certbot-command-line-options)
特に自動化が。

### 使い方と例

`--webroot-map`には`[]{ドメイン: ディレクトリ}`のJSONオブジェクトを渡してやる。

上記のディレクトリ構成に対して行う場合、こんな感じ。多分。

```bash

certbot --webroot --webroot-map '{"example.com: "/var/www/vhosts/example.com","www.example.com: "/var/www/vhosts/example.com","info.example.com: "/var/www/vhosts/info.example.com"}'
```

----
というか別に普通に`-w`(`--webroot-path`)と`-d`(`--domain`)オプションでもいい。ヘルプにある通り。

```bash
certbot --webroot -w /var/www/vhosts/example.com -d example.com -w /var/www/vhosts/example.com -d www.example.com -w /var/www/vhosts/info.example.com -d info.example.com
```

`-w`と`-d`の数があってないときは自動的にいい感じにされる、らしい。(最後のにフォールバックされる？)よくわからない。あわせておくのが無難そう。

----
この自動化でサーバー跨ぐのは流石に無理なのでDNS-01とか頼ったほうがはやそう。そもそも跨がなければいいんだけど。
LB構成でLet's encrypt使ってる人ってどうしてるんだろ……そもそもLE使ってないか。
Bash on WindowsでFirstStepReVIEW-v2をビルドする

Re:VIEWで同人誌の原稿を書いている場合、[TechBooster/C89-FirstStepReVIEW-v2](https://github.com/TechBooster/C89-FirstStepReVIEW-v2) がテンプレートとして役に立つことかと思います。一度セットアップしてしまえば、以降はコマンド一発でPDFファイルがビルドできるようになっているリポジトリで、これ自体Re:VIEWを使った本の執筆環境を解説するものです。

ただ、ビルド環境はMacOSやLinuxなどのUnix互換環境を前提としているようです。Windows環境でのビルド方法は自明ではありません。今回はWindows 10 Anniversary Update以降で追加されたBash on Windows (WSL) を使って、ユーザーでもこのリポジトリが使えるようにする方法を簡単にまとめます。

（Re:VIEW自体のビルドは[cygwinで出来るかもしれません](http://blog.ch3cooh.jp/entry/20130826/1377523171)が、ここではRe:VIEWの原稿を揃えるだけでPDFファイルのビルドまで出来るようにテンプレートが整備されているこのリポジトリを対象とします。）

まず、筆者はBash on WindowsをUbuntu 16.04環境に切り替えているので、これを前提とします。Ubuntu 14.04ベースのBash on Windowsでも、同様の操作は可能かもしれませんが、パッケージは存在していない可能性もあります。Windows 10 build 14951以降のBash on Windowsであれば、[Ubuntu 16.04になっているようです](http://www.omgubuntu.co.uk/2016/10/windows-10-linux-subsystem-ubuntu-16-04)。それ以前のビルドであれば、[手動でアップグレードが可能です](https://www.howtogeek.com/278152/how-to-update-the-windows-bash-shell/)。（ただ、問題が発生しないとは言えないので、いざという時に自力で調べて復元できる自信が無ければ、やめておいたほうが賢明でしょう。） 

さて、Bash on Windowsの環境が整った後は、大して難しいことはないはずです。ただし、review環境はtexliveの巨大なパッケージのインストールを必要とするもので、ディスクスペースは2GBくらい消費すると思います（正確には調べていません）。

まず、[github上のリポジトリ](https://github.com/TechBooster/C89-FirstStepReVIEW-v2)をcloneします。（`sudo apt install git` でgitをインストールしてから`git clone`するのが手っ取り早いでしょう。）

次に、リポジトリのビルドに必要になるパッケージをインストールします。以下の内容でたぶん大丈夫だと思います。（足りないものがあったらコメントで教えてください。） 後はほぼ `README.md` にある内容を実行するだけです。

	sudo apt install ruby nodejs texlive texlive-latex-extra texlive-binaries texlive-lang-japanese
	ln -s /usr/bin/nodejs /usr/bin/node
	sudo gem install bundler
	npm install
	npm run pdf

一つ注意すべきことですが、Ubuntuでインストールされるnode.jsのコマンドは `/usr/bin/nodejs` となっています。（Ubuntuにはnode.js以前から `node` というパッケージとコマンドが存在していたので、後から登場したnode.jsの `node` コマンドは改名せざるを得なかったわけです。） FirstStepReVIEW-v2で使われているパッケージの何かが、`node` を実行しようとして失敗するので、今回は（やっつけですが）ダミーの /usr/bin/node を作成してやり過ごします。

`npm run pdf` が成功したら、articles ディレクトリの下にPDFファイルが生成されているはずです。これをWindowsデスクトップ環境（/mnt/c/ = c:\\Users\\ユーザー名など）にコピーするなどして確認してみてください。

![npm run pdf正常終了](https://dl.dropboxusercontent.com/u/493047/2017/WSLreview.png)
EC2でMYSQLに問題があるようでサーバーが起動しない


## unicornでサーバー起動しても立ち上がらない

以下のコマンドでサーバー起動を試みる。

`unicorn_rails -c config/unicorn.rb -E production`

`config/unicorn.rb`ではunicornについての設定ファイルを指定、`-E production`で環境を指定している。

サーバーが起動せずプロセスも即終了してしまう。なぜだ。

## エラーログを確認してみる

`less log/unicorn.stderr.log`でエラーを確認する。

```
I, [2017-02-15T16:36:15.916766 #18260]  INFO -- : Refreshing Gem list
I, [2017-02-15T16:36:17.465988 #18260]  INFO -- : listening on addr=0.0.0.0:3000 fd=10
E, [2017-02-15T16:36:17.467622 #18260] ERROR -- : Access denied for user 'root'@'localhost' (using password: NO) (Mysql2::Error)
```

ふむふむ。なにやら`root`ユーザーでアクセスを試みて失敗している模様。
`using password: NO`という部分が気になる。環境変数で設定したパスワードが読み込まれていない？

`Access denied for user 'root'@'localhost' (using password: NO)`


## 適当なパスワードでmysqlにログイン

試しに適当なパスワードでログインを試みると、間違ったパスワードなので弾かれるが、`using password: YES`の記述が。

`unicorn`でサーバーを起動する際は`NO`だったので、やはりこれは「パスワードが存在しない」とされているようだ。

```
[ec2-user@ip-xxx-xx-xx-xx pairs-like]$ mysql -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
[ec2-user@ip-xxx-xx-xx-xx pairs-like]$
```

## 環境変数を変えて再度試みる

`env`で環境変数を表示しようとしてもDATABASEの環境変数とパスが表示されない。試しに`sudo env`を打つと表示される。`env | grep DATABASE_hogehoge`だと表示される。謎い。

という事で`TEST_DATABASE`にしてみたら`env`でもちゃんと表示された。railsの`database.yml`で読み込む変数もこれに変更して再度サーバーを起動してみる。

念のためmysqlサーバーを再起動

```
[ec2-user@ip-xxx-xx-xx-xx pairs-like]$ sudo service mysqld start
Starting mysqld:                                           [  OK  ]
```

**しかし結果は変わらず...。**

```
I, [2017-02-15T16:52:01.405933 #18452]  INFO -- : Refreshing Gem list
I, [2017-02-15T16:52:04.180356 #18452]  INFO -- : listening on addr=0.0.0.0:3000 fd=10
E, [2017-02-15T16:52:04.183666 #18452] ERROR -- : Access denied for user 'root'@'localhost' (using password: NO) (Mysql2::Error)
```

## 環境変数が使えてないのではないか....

mysqlの`password`を変えてみろとか書いている記事がいくつかあったのですが、それは面倒だし`mysql -u root -p`でログインは出来るので、そこじゃない。

そもそも`database.yml`内で環境変数が読み込めていないのではないか（記述がまちがっているとかで）。

ちなみに現在は `<%= ENV['hogehoge'] %>`のように読み込んでいる。これを一時的にパスワードをベタで書いてみるとどうか。

```
default: &default
  adapter: mysql2
  encoding: utf8
  pool: 5
  username: root
  password: hogehoge
  socket: /var/lib/mysql/mysql.sock
```

**動いた...！**

## 環境変数が正しく展開できていなかったのでは？

[[rails]production環境のdatabase.ymlでハマったこと（環境変数設定）](https://blog.hello-world.jp.net/ruby/3154/)

こんな記事が書かれていまして、ジェネレーターで生成したパスワードに`$`が含まれるなどして環境変数が正しく展開されない時があるとのこと。

確認してみたが、そう言った事は特にない模様。

## 結局、再度環境変数をdatabase.ymlに設定したら動いた

なんとも虚しい結果ですが、再度環境変数を設定して`database.yml`の記述を変更したら動きました。
意味不明です。`env`をしても表示されるようになりました。

世の中には不思議な事が沢山ありますね。
JSONファイルをオブジェクトにパースする

はじめに
--------------------

pythonでは標準のjsonモジュールで簡単にJSONファイルをパースできますが、dictになってしまうのがちょっとアレなので、ドットアクセスできるようにしてみます。

いきなりソースコード
--------------------

```py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json

class Json(object):
    def __init__(self, **kwargs):
        [setattr(self,k,v) for k,v in kwargs.items()]
            
def hook(dct):
    return Json(**dct)

def load(filename):
    with open(filename) as f:
        obj = json.load(f, object_hook=hook)
    return obj


if __name__ == '__main__':
    config = load('config.json')
    print(config.conf_1)            # conf_1
    print(config.conf_2.conf_21[0]) # conf_221
```

```json:config.json
{
  "conf_1" : "conf_1",
  "conf_2" : {
    "conf_21" : "conf_21",
    "conf_22" : [ "conf_221", "conf_222" ]
  }
}
```

解説
--------------------

- `json.load` メソッドに `object_hook` を渡します。
- `object_hook`に指定した `hook` では、用意した `Json` クラスのコンストラクタに、キーワードを展開して横流しします。
- `Json` クラスでは、キーワードで受け取った各引数を、アトリビュートとして追加します。
Python3を使った日本語自然言語処理③疎ベクトルの生成

##単語を特徴ベクトルに変換するとは

実際に文章の中に現れる単語を機械学習のアルゴリズムに渡すためには、それを数値に変換する必要があります。テキストを数値の特徴ベクトルに変換する方法として有名なものにBoWモデルがあり、今回はそれを使ってサクッと単語からベクトルを作ります。

##Bowモデルとは
BoWモデルとはBags-of-Wordsの略で、これ自体は
1. 文章から単語（token）からなる語彙を作成
2. 各文章での単語の出現回数を含んだ特徴ベクトルを生成する。
というシンプルなもの。

例えば「私は犬が好きです」「彼は犬が嫌いです」という二つの文章には「私」「彼」「好き」「嫌い」という単語はどちらか一つの文章にしか出現せず、「犬」「は」「が」「です」はどちらの文章にも登場しています。
['私', '彼', 'は', '犬', 'が', '好き', '嫌い', 'です']のそれぞれの単語が、ある文章について何回出現するかを数えると、
[[1, 0, 1, 1, 1, 1, 0, 1], [0, 1, 1, 1, 1, 0, 1, 1]]
となります。
この特徴ベクトルにおける値は単語の生の出現度と考えられ、tf(t, d)と表されます。
（これは後でtf-idfというモデルを考えるときにまた出てきます。）
また今回は短いかつ似たような単語で構成された文章なので0,1がバランス良く出ていますが、基本的には一つ一つの文章が長く、かつたくさんの文章が存在すれば単語の生の出現度は低くなり、ベクトルのほとんどが0となるため、この特徴ベクトルは「疎ベクトル」とも呼ばれます。

##Pythonで特徴ベクトルを作ってみる

では実際にpython3でこの特徴ベクトルを生成してみます。ここではnumpy, sckit-learnというpythonのライブラリを使用します。

```feature_vector_en.py
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer

def create_countvectorizer_from_texts(texts):
    count = CountVectorizer()
    docs = np.array(texts)
    bags = count.fit_transform(docs)
    print(bags.toarray())
    print(count.vocabulary_)

texts = ["He likes to play the guitar", \
"She likes to play the piano", \
"He likes to play the guitar, and she likes to play the piano"]
create_countvectorizer_from_texts(texts)

```
これを実行すると、

```
$ python3 feature_vector_en.py
[[0 1 1 1 0 1 0 1 1]
 [0 0 0 1 1 1 1 1 1]
 [1 1 1 2 1 2 1 2 2]]
{'likes': 3, 'guitar': 1, 'to': 8, 'and': 0, 'she': 6, 'the': 7, 'piano': 4, 'play': 5, 'he': 2}
```
最初の多次元配列がこの特徴ベクトルであり、次のディクショナリをみるとそれぞれの単語がどれだけ出現しているかを見ることができます。

次はこの特徴ベクトルから単語の重み付けをどう変え、分類に使っていくかについてです。
中国語のAutoCADのVBA本に載っていた「漢語」と「英語」と「日本語」の翻訳比較

#主に「AutoCAD VBA二次开发教程」より

中国語|日本の同一漢字|日本2017用語|英語
---|:-:|:-:|:-:
开发|開発|開発|
实体|実体|インスタンス|instance
对象|対象|オブジェクト|object
数据|数据|データ|data
数据表|数据表|データシート<br>データテーブル|
事件|事件|イベント|
三维|三維|三次元3D|
工具|工具|ツール|tool
宏||マクロ|macro
菜单|菜单|メニュー|
下拉菜单|下拉菜単|プルダウンメニュー<br>ドロップダウン|Dropdown
模型空間|模型空間|モデル空間|Modelspace
图紙空間|図紙空間|ペーパー空間|Paperspace
?|?|窓|zoomWindows
图层|図層|レイヤー|layer
布局|布局|レイアウト|Layout
打印|打印|印刷|Plot
视图|視図|ビュー|View
缩放|縮放|スケーリング|scaling
缩放视图|縮放視図|ズームビュー|Zoom view
控制|控制|コントロール|Control
用户|用戸|ユーザー|user
斜切|斜切|面取り|
圆|圓|円|Circle
样条曲线|様條曲線|スプライン|spline
多段线|多段線|ポリライン|Polyline
文字样式|文字様式|テキストスタイル|Text style
标题栏|標題欄|タイトルバー|Title bar
属性|属性|プロパティ|Property
文件|文件|ファイル|File
文档|文档<br>文檔|ドキュメント|document
保存|保存|セーブ|Save,saveas
快捷|快捷|ショートカット|
查找|查找|検索|Find
替换|替換|置換|replace
对话|対話|対話<br>ダイアログ|dialog
框中|框中|箱<br>ボックス|box
对话框<br>对话框中|対話框<br>対話框中|ダイアログボックス|dialog box
卡|卡|カード<br>カロリー|
选项卡|選項卡|タブ|tab
多行文字|多行文字|マルチテキスト|mtext
PostgreSQLでテーブルオーナを一括変更する方法

PostgreSQLでデータをバックアップファイルからリストアした時、オーナ情報を削除し忘れて、取得元のユーザを引き継いでしまったり、postgresユーザでインポート作業を行ってしまい、オーナが全部postgresになってしまうことがある。

そんな時、あわててデータベースのオーナを変更してもその下に紐付いているテーブルのオーナは変更前のままとなってしまう。
pgadminで変更を試みてもまとめて変更することはできないので、泣く泣く一旦DBを削除してインポート…なんてことは誰でもあるはず。

そんな時、テーブルのオーナを一括変更するコマンドを紹介する。





## postgresユーザ以外のユーザから別のユーザへのテーブルオーナ一括変更
一番簡単なのがこのコマンド。コマンド一行で該当ユーザ（old_user）がオーナとなっているテーブルを一括でnew_userに変更する。
このコマンドは個別にテーブル指定を行うことができないので、一括して変更される。
古いユーザを削除して新しいユーザを作り直すときなどに便利。（また、間違えてオーナ情報を設定してリストアした場合も…）

```sql:コマンド
--下記のcurrent_userとnew_userをそれぞれ実行環境に応じて置き換える。TOの後ろのユーザ名はダブルコーテーションで囲う事。
REASSIGN OWNED BY current_user TO "new_user";
```

## postgresユーザから別のユーザへのテーブルオーナ変更
先出のコマンドは、postgresユーザから別のユーザへのオーナ変更の際には利用できない。
理由は、一部のシステムテーブルはpostgresユーザからオーナを変更できないものがあり、その変換でエラーとなってしまうから。

そんなときは下記のコマンドで一括変更ができる。
ただし、この方法は一度オーナ変更を行うSQLを自動生成し、それを実行するという２段実行となる。この場合、自動生成されたSQLを自分で取捨選択できるため、オーナ変更を行うテーブルを選択できる。


```sql:コマンド
--下記のcurrent_userとnew_userをそれぞれ実行環境に応じて置き換える。
SELECT
    'ALTER TABLE ' || schemaname 
    || '.' || tablename || 
    ' OWNER TO new_user;'  --ここでSQLに記載する新しいオーナを指定
FROM pg_tables 
WHERE tableowner ='old_user' --ここで対象とするテーブルの現在のオーナを指定
```

上記のコマンドを実行することで、下記のSQLが結果に出力される。出力されたSQLを実行することで、オーナをnew_userに変更することができる。

```
"ALTER TABLE public.table_name1 OWNER TO new_user;"
"ALTER TABLE public.table_name2 OWNER TO new_user;"
"ALTER TABLE public.table_name3 OWNER TO new_user;"
"ALTER TABLE public.table_name4 OWNER TO new_user;"
"ALTER TABLE public.table_name5 OWNER TO new_user;"
```
【Spring】例外ハンドリングと仕組み

# 例外の種類
Webアプリケーションで発生する例外は、大きく3つに分類されます。

### （１）システム例外
処理を継続することができない例外（アプリケーション自体のバグ、依存ライブラリのバグ、ミドルウェアやハードウェアの故障、システムリリースの枯渇、ネットワーク障害など）は、システム例外に分類されます。
システム利用者にはシステムエラー画面を表示し、システム運用者にはシステム障害が発生したことが通知されるように実装します。

### （２）リクエスト不正を通知する例外
リクエストの内容が不正なときに発生する例外（存在しないパスへのリクエスト、バインディングエラー、入力チェックエラーなど）は、リクエスト不正を通知する例外に分類されます。
リクエスト不正を通知する例外が発生した場合は、システム利用者にリクエストの内容が間違っていることを通知するように実装します。

### （３）アプリケーション例外
ビジネスルールに違反したときに発生する例外（ユーザー登録時のIDの重複エラー、排他エラー、在庫数の不足エラー）は、アプリケーション例外に分類されます。
アプリケーション例外が発生した場合は、アプリケーションの要件が決められているエラー処理を実装します。

# 例外の発生箇所とハンドリング方法
![Screen Shot 2017-02-16 at 0.41.13.png](https://qiita-image-store.s3.amazonaws.com/0/140455/775717db-fe21-5daa-cce1-9c95d0680702.png)
### ① Servlet Filter
Servlet Filterで発生する例外に対する例外ハンドリング。Servlet Filterの中で発生した例外例外は、サーブレットコンテナのエラーページ機能 (web.xmlの<error-page>要素)を使用してエラー処理をする。

### ② DispatcherServlet
フロントコントローラーが行うフレームワーク処理で発生する例外に対する例外ハンドリング。
Spring MVCのフロントコントローラーで発生した例外は、Spring MVCが提供する例外ハンドリングの仕組み（HandlerExceptionResolver）を使用してエラー処理を実装する。

### ③ アプリケーション
Controller以降の処理（アプリケーションの個別の処理）で発生する例外ハンドリング。
アプリケーションの中で発生した例外は、プログラム内でのtry-catchやSpring MVCが提供する例外ハンドリング仕組み（HandlerExceptionResolver）を使用してエラー処理を実装する。

### ④ View（JSPなど）
View内で発生する例外に対する例外ハンドリング。
Viewの中で発生した例外は、サーブレットコンテナのエラーページ機能 (web.xmlの<error-page>要素)を使用してエラー処理をする。

## サーブレットコンテナのエラーページ機能の利用
サーブレットコンテナは、サーブレットコンテナまで通知された例外やエラー応答（HttpServletResponseのsendErrorメソッドの呼び出し）をハンドリングし、遷移先のページを指定することができる機能を提供しています。

※**エラー時の遷移先ページは、web.xmlの<error-page>要素を使用して設定します。**

```xml
<error-page>
    <error-code>500</error-code>
    <location>/WEB-INF/error/defailtError.jsp</location>
</error-page>
```
Python3を使った日本語自然言語処理②　MeCabによる形態素解析

##日本語形態素解析とは

>形態素とは意味を持つ最小の言語単位であり、形態素解析とは与えられた文を形態素単位に区切り、各形態素に品詞などの情報を付与する処理である。[Pythonによる日本語自然言語処理](http://www.nltk.org/book-jp/ch12.html)

つまり文章を単語に分割して、それぞれの単語について品詞を分類などを行うこと。日本語形態素解析はいくつかあるのですが、今回はMeCabというライブラリを使います。
[Python形態素解析ライブラリ3つを徹底比較](http://qiita.com/pika_shi/items/94df1d8f47ef82cf39c8)

##MeCabのインストール（Mac）

Mecabは京都大学を中心に作成されているオープンソースの日本語形態素解析ライブラリです。[Mecab公式サイト](http://taku910.github.io/mecab/)
基本的に公式のインストール手順に沿っていけば5分くらいでインストールが完了します。

公式からダウンロードしてくる必要があるもの

- mecab-0.996.tar.gz(Mecab本体)
- mecab-ipadic-2.7.0-20070801.tar.gz（辞書。これを使用して単語を拾っていくので、こちらも必須。ちなみにこの辞書は何種類かあります）

バージョンはその時々で変わるので公式から最新のものを持ってきてください。
あとはこのジップファイルがあるディレクトリに移動し、解凍、ターミナルで以下のコマンドを入力します。

```bash 
$ tar zxfv mecab-0.996.tar.gz
$ cd mecab-0.996
$ ./ configure 
$ make
$ make check 
$ sudo make install 
```

```
$ tar zxfv mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801
$ ./ configure 
$ make
$ make check 
$ sudo make install 
```
これだけでmecabは使えるようになるので、試しにターミナルで遊んでみます。

```
$ mecab
私は犬が好き
私	名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
犬	名詞,一般,*,*,*,*,犬,イヌ,イヌ
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
好き	名詞,形容動詞語幹,*,*,*,*,好き,スキ,スキ
EOS
```

ただこれだけではpythonで使えなため、python3のバインディングをインストールする必要があります。python3からpipでインストールできるので

`pip install mecab-python3`

とターミナルで入力すればオッケーです。

##Python3でMeCab形態素解析を行うコードを書く

Mecabは先ほどのように単語を分割し、品詞を推定するparse()メソッドの他に、解析結果をノードの双方向連結リストとして受け取るparseToNode()メソッドも存在します。

```mecab.py
import MeCab

def split_text_to_word(text):
    tagger = MeCab.Tagger("-Ochasen")
    tagger.parse('')
    text = text.replace(u" ", u"　")
    print(tagger.parse(text))

def split_text_to_node(text):
    tagger = MeCab.Tagger("-Ochasen")
    tagger.parse('')
    text = text.replace(u" ", u"　")
    node = tagger.parseToNode(text)
    while node:
        print("{0} : {1}".format(node.surface, node.feature))
        node = node.next

split_text_to_word("私は猫が好きです。")
split_text_to_node("私は猫が好きです。")
```

これを実行してみると、

```bash
$ python3 mecab.py
私	ワタシ	私	名詞-代名詞-一般
は	ハ	は	助詞-係助詞
猫	ネコ	猫	名詞-一般
が	ガ	が	助詞-格助詞-一般
好き	スキ	好き	名詞-形容動詞語幹
です	デス	です	助動詞	特殊・デス	基本形
。	。	。	記号-句点
EOS
 : BOS/EOS,*,*,*,*,*,*,*,*
私 : 名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
は : 助詞,係助詞,*,*,*,*,は,ハ,ワ
猫 : 名詞,一般,*,*,*,*,猫,ネコ,ネコ
が : 助詞,格助詞,一般,*,*,*,が,ガ,ガ
好き : 名詞,形容動詞語幹,*,*,*,*,好き,スキ,スキ
です : 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
。 : 記号,句点,*,*,*,*,。,。,。
 : BOS/EOS,*,*,*,*,*,*,*,*
```

実は文字コード周りでちょこっと細工しているのですがそれは割愛。
Python2で使うときはエンコード/デコードの点で少しやることが増えるので注意です。

次回はMecabによって得られたテキストデータをベクトルに変換してみます。
Travis CI+Carthageでprebuilt frameworkがダウンロードされない場合の対処法

Travis CIでCarthageを実行したときに、次のようなエラーが出てprebuilt frameworksがダウンロードされない場合の対処法です。

```
*** Skipped downloading RxSwift.framework binary due to the error:
        "Maximum number of login attempts exceeded. Please try again later."
```

どうやらこのエラーは同一IPのTravis CIコンテナがみんなのプロジェクトで共用されているために、GitHubのrate limitに引っかかったことが原因で発生しているらしいです。
以下のようにGitHub APIのアクセストークンを指定してあげることで、回避できます。

## （事前準備）travisコマンドのインストール

travisコマンドのgemをインストールしておきます。

```
sudo gem install travis --no-document
```


## アクセストークンの作成

https://github.com/settings/tokens へアクセスして、Travis CI用のアクセストークンを作成します。

(1) Generate new token ボタンを押します。
(2) Token description に「Travis」と入力して（※別になんでもいいんだけど、あとで自分がわかりやすい名前で）作成します。下にあるスコープのチェックボックスはすべて空欄で構いません。
![GenerateToken.png](https://qiita-image-store.s3.amazonaws.com/0/33397/f8810651-9780-e3a3-7c36-e04e7ed8683b.png)

(3) 作成されたトークンはコピーしておきます。
![CopyToken.png](https://qiita-image-store.s3.amazonaws.com/0/33397/55c62534-0439-0954-3723-c72cde08dc23.png)


## .travis.ymlへのアクセストークンの指定

travisコマンドを使って、先程コピーしたアクセストークンを（暗号化して） GITHUB_ACCESS_TOKEN環境変数にセットするように、.travis.ymlファイルを書き換えます。
（`<YOUR ACCESS TOKEN>` の部分にコピーしたトークンを指定してください）

```
travis encrypt GITHUB_ACCESS_TOKEN=<YOUR ACCESS TOKEN> --add
```

.travis.ymlに次のような記述が追加されるはずです。

```
env:
  global:
    secure: fDs1oSS...（以下略）
```

※ もし、travis encryptに失敗して、 `uninitialized constant GH::Error` というエラーが出た場合は（私がそうだったのですが）、次のようにbackportsを最新にすることで回避できるようです。（[参考](https://github.com/travis-ci/travis.rb/issues/253)）

```
sudo gem update backports
```


## 参考にしたサイト

https://github.com/travis-ci/travis-ci/issues/4195
https://github.com/Carthage/Carthage/pull/605

https://gist.github.com/topheman/25241e48a1b4f91ec6d4
https://github.com/travis-ci/travis.rb

https://github.com/travis-ci/travis.rb/issues/253
Docker導入

# DockerをプライベートPCに入れてみた。

## やること
1. Dockerをインストール
2. dockerコマンドが使えることを確認
3. docker+nginxでwebサーバー立てる

## 前提事項
OSはMacOS10.12.1です。
Dockerって？ということで、まずは以下のサイトで
ざっくり理解しました。
http://paiza.hatenablog.com/entry/docker_intro


### Dockerインストール
[Docker公式サイト](https://www.docker.com/)から、「Docker for mac」
でmac用のdockerインストーラーを落としてくる。

インストーラーが落とせたら実行して、applicationフォルダに入れるだけ。

terminalを起動させて、dockerコマンドが使えるか確認しましょう。

```
$ docker --version
```

### dockerでwebserver立てる
以下のコマンドを叩いて、DockerHub(レジストリ)からnginxのコンテナを取得する。
```
$ docker run -d -p 80:80 --name webserver nginx
```

エラーが発生しなければ、http://localhost/にアクセスして、以下の画面が表示されることを確認する。


<img width="605" alt="スクリーンショット 2017-02-16 0.20.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/137745/f1908cf2-8ec8-042c-b15b-7d1ddbb7a2b6.png">

※上記コマンドで、エラーが出た場合、80ポートが使われているのではないかと思われます。
　自分の場合は、apacheが起動していたので、ポートを変えて再度dockerでコンテナを取得しました。

#### apache起動確認
```
$ ps aux | grep httpd
```

#### 特定のコンテナの削除
```
$ docker rm -f [name]
```

#### 再度コンテナを取得する。（ポートは8081にしました。）
```
$ docker run -d -p 8081:80 --name webserver nginx
```

上記までやって、http://localhost:8081/
でアクセスするとwelcomページが表示されたので成功です。

これから仮想化技術と環境構築の自動化を目指して勉強していきます。
jupyter notebookを使い始めるための初期設定


# 日本語フォントの設定
まず、システムにインストールされているフォントを列挙する。

``` Python
import matplotlib.font_manager as fm
import pandas as pd
d = []
fonts = fm.findSystemFonts()
for f in fonts:
    font = fm.FontProperties(fname=f)
    try:
        d.append((f, font.get_name()))
    except:
        print("could not find: {0}".format(f))
df = pd.DataFrame(d, columns=['path', 'name'])
print(df)
```
その後、以下で設定

``` Python
import matplotlib.font_manager
font = matplotlib.font_manager.FontProperties(fname='/usr/share/fonts/truetype/takao-gothic/TakaoGothic.ttf')
# or
font = matplotlib.font_manager.FontProperties(fname='/Library/Fonts/Arial Unicode.ttf')
```

使用する際には、fontpropertiesに先のフォントを指定する。

``` Python
for i, w in enumerate(words):
    plt.annotate(w, xy = (xs[i], ys[i]), xytext = (3, 3), textcoords = 'offset points', ha = 'left', va = 'top', fontproperties=font, fontsize=10)
```

# 画像をインラインで表示するための設定+α

``` Python
%matplotlib inline
# -*- coding: utf-8 -*-
from __future__ import print_function
...

```

# 表示される画像のサイズを大きくするための設定
figsizeに大きな数字を指定する

``` Python
plt.figure(figsize=(8,6))
```
(UN)Effective Waterfall

友人とまとめました。[こちら](https://wf-pooop.github.io/-un-effective-waterfall/)　置いてあるものの複製です。

# (UN) Effective Waterfall


## 謝辞
　私たちは、先輩方の厳格な指導のもと、多くのメンバーと失敗や困難を共にしてきました。そんな中で常に私たちと共にあり続けたのが「ウォーターフォール開発」でした。偉大な先輩方、かつてのメンバー、及びそこから得られた素晴らしい経験に感謝を込めて、この「(UN)Effective Waterfall」をまとめました。

## 1. 原則

1. 原則ウォーターフォールであること。近年、開発手法が取り沙汰されているが、ウォーターフォールは、どのような開発プロジェクトでも成功に導くことができる、一般的かつ普遍的なな指針・手法である。

2. 工程に疑義が生じた場合は、記録を行い、改善プロセスの中で組織的な改善を図ること。
3. 顧客と価値共有を図る事。顧客にとっての価値は、まずは予算、次に機能である。

## 2. 基本設計

1. アプリケーション方式を初め、アーキテクチャや実現方法については、主担当以外にも、類似した案件を行なった人に他の良い方法がないかを聞き、比較する事。相反する意見が出された場合、実績等を判断し、総合的に上席が判断を下さなければならない。
2. 新しい技術より、実績のある技術を採用する事。短期開発のため、評判のよいフレームワークについての検討はしてもよい。（枯れた技術の水平思考）
3. プログラム変更にはテスト等の工数がかかるため、できる限り設定のみで変更できるように設計する事。
4. 将来的な変更可能性など、汎用性を考慮し、SQL文などクエリはできる限りDB上のテーブルに保存し、顧客要求にAjailに対応できるよう設計する事（ママ）。最低限、ループ処理でまわすクエリのorder by句とbreak キーはテーブル上で設定できなければならない。
5. 全ての人が閲覧、編集出来るよう、ドキュメントはMicrosoft Wordもしくは Excelで記述すること。UMLツールなど特定の技術に依存したものの利用は避けること。(learn once, write anywhere)
6. 設計書は分かりやすいことが重要なので、専門的な用語の利用は避けること。具体的にはクラス、オブジェクトなど。

## 3. 詳細設計

1. トレーサビリティ確保の為、詳細設計書のタイトルには必ず通し番号をつけること。また、実装コードの関数名にも同一の通し番号を付与すること。
2. 扱いやすいテーブル定義とすること。正規化しすぎると扱いにくいため、正規化されることよりも拡張性を持たせておくこと。
3. ライブラリ等、オープンソースや3rdパーティ製のものは、テストされていない等の問題が発生するため絶対に使用しないこと。アルゴリズム等、重要な部分は、一から設計・実装する事。
4. インターネット上の掲示板やブログ等に書かれているサンプルコードは充分なテストがされていないため、できる限り参考しないこと。工数削減等のために、どうしても使用する場合は、上司の許可の元、慎重に導入を検討すること。テストを必ず行うこと。(戦術とは、持てる手段で何ができるかを考える事である。)
5. 全てのレビューは主担当、上席、関連する機能の担当者(主担当以外は、協力会社を除く)を全て集めて行い、誤解が起こらないよう、会議の場で資料内容を説明すること。また、資料は事前に紙で印刷して置くこと。

## 4. 実装
1. 既存開発の類似コードがある場合は、コピーアンドペーストなどで流用すること。自身のプロジェクトの工数を短縮すること。完成済のコードにデグレ等の影響を与えないようにすること。「寝た子を起こすな。」
2. 複数の機能から、同じ処理を行う場合、共通化よりも、機能仕様の変化に対応を優先させるため、別々に作成すること。
3. ハード性能はどんどん新しくなるので、プログラムの最適化は考えなくてよい。
4. 事故防止の為、プログラマが不具合や仕様の間違いを発見した場合は速やかにリーダーに報告し、指示を待って行動すること。リーダーは、適時、古くからのベテランメンバーを招集し協議をおこなうこと。
5. 他のコンポーネント間との間で設計上の問題が発生した場合は、次の全体ミーティングの議題とし、部門間で協議すること。
6. チームメンバーを思いやってコーディングを行うこと。例としては、不要に見えたからと行って自分の都合でコメントアウトされた行を削除してはいけない。チームメンバーにとって意味のあるものかもしれないのだから。また、勝手にファイル名や関数名を変えてもいけない。決まったところに決まったものがないと、チームメンバーが見つけられないかもしれない。
7. スパゲッティコードになるのを防ぐ為、構造的なプログラミングを行うこと。具体的には、for,whileブロック内でのbreak,continueの禁止。不要なreturnの禁止。
8. ソースコードを修正する場合、元のソースコードのバックアップは残して置くこと。
9. バグのあるコードをコミットする事で他の人に影響を与えたりする事のないよう、リリース済のコードのみをコミットする事。
10. コーディング規約を設ける場合、コードレビューを行うこと。規約が守られているかどうかの点までチェックを行うこと。  
※(参考)割れ窓理論―軽微な犯罪も徹底的に取り締まることで、凶悪犯罪を含めた犯罪を抑止できるとする環境犯罪学上の理論。
UITextViewにタップ可能なリンクを挿入する

# 概要
 - UITextViewにタップ可能なリンクを挿入したい
 - 実装方法はNSMutableAttributedStringのNSLinkAttributeを利用する
 - TapGestureRecognizerを利用する実装方法もあるが、結構手間

# 完成イメージ
<img width="320" alt="screenshot_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/113553/5a8c91a3-49d1-88d0-7b27-ff881fe866f2.png">

# サンプルコード

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController, UITextViewDelegate {

    @IBOutlet weak var textView: UITextView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let baseString = "これは設定アプリへのリンクを含む文章です。\n\nこちらのリンクはGoogle検索です"
        
        let attributedString = NSMutableAttributedString(string: baseString)
        
        attributedString.addAttribute(.link,
                                      value: UIApplicationOpenSettingsURLString,
                                      range: NSString(string: baseString).range(of: "設定アプリへのリンク"))
        
        attributedString.addAttribute(.link,
                                      value: "https://www.google.co.jp/",
                                      range: NSString(string: baseString).range(of: "こちら"))
        
        textView.attributedText = attributedString

        // isSelectableをtrue、isEditableをfalseにする必要がある
        // （isSelectableはデフォルトtrueだが説明のため記述）
        textView.isSelectable = true
        textView.isEditable = false
        textView.delegate = self
    }
  
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    // MARK: - Text View Delegate
    
    func textView(_ textView: UITextView,
                  shouldInteractWith URL: URL,
                  in characterRange: NSRange,
                  interaction: UITextItemInteraction) -> Bool {
        
        UIApplication.shared.open(URL)
        
        return false
    }
}
```

# ポイント
 - `addAttribute`メソッドの引数rangeは`NSRange`型
 - Stringの`range(of:String)`メソッドでなく、NSStingのrange(of:String)メソッドを利用
 - Stringの場合、戻り値は`Range<String.Index>`型、NSStringの場合、戻り値は`NSRange`型のため

```swift:一部抜粋
attributedString.addAttribute(NSLinkAttributeName,
                                      value: "https://www.google.co.jp/",
                                      range: NSString(string: baseString).range(of: "こちら"))
```

# Github
Githubでソースコードを公開しています。
https://github.com/shtnkgm/LinkTextViewSample

# 参考
 - [HACKING WITH SWIFT / How to make tappable links in NSAttributedString](https://www.hackingwithswift.com/example-code/system/how-to-make-tappable-links-in-nsattributedstring)
Pygments を使ってCrystalのコードをターミナル上でハイライトする

Pygments を使ってCrystalのコードをターミナル上でハイライトします

## <i class='fa fa-download'></i> インストール
```sh
$ pip install Pygments
```

## <i class='fa fa-flask'></i> 試行
```sh
# Crystal の bumpup tool をクローン
$ git clone https://github.com/tbpgr/vup
$ cd vup
$ pygmentize src/vup.cr
```

![demo.png](https://qiita-image-store.s3.amazonaws.com/0/43480/add5db03-bd79-f8a6-ac35-f00c3736daaf.png)

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* [Pygments](http://pygments.org/languages/)
* [tbpgr/vup - GitHub](https://github.com/tbpgr/vup)
VirusTotal APIに関して

#目的
VirusTotal のAPIの使い方を覚えて、何かアンチマルウェア業界に貢献するツールを作ろうの会

#前提
python 2.7.5

#兎にも角にもひとまずリポジトリ
https://github.com/kanokanoka/virustotal_api/

#VirusTotalとは？
こちらです。
https://www.virustotal.com/

どういうページかというと、例えばの使い方ですが、怪しいファイルとかをぶち込めば、いろんなアンチウイルスにかけてくれて怪しいかどうか判定してくれたり、種々の解析情報を返してくれるページなのです。また、他の人がかけた結果もわかるので、例えばハッシュ値がわかって、すでに解析済みかどうかを調べることもできます。

#ではVirusTotal APIとは？
virustotalの機能をプログラムから利用できるAPIが公開されていて、多分ハッシュ値を投げれば情報を返してもらったり、その他もいろいろな事が出来ると思います(参考文献1.)。

#基礎の使い方
API keyは、ユーザ登録すれば個別に発行されるので、それを入れます。
hashのところは、ファイルハッシュをいれてください。

```python
#!/usr/bin/env python

import sys
import json
import urllib

#hash = "this is hash area"
hash= "hash かく"

url= "https://www.virustotal.com/vtapi/v2/file/report"
param = {"resource":hash, "apikey": "自分のapiキーかく"}

data= urllib.urlencode(param)
req=urllib.urlopen(url,data)
json=req.read()
print json
```

これでjsonが帰ってきます。

#何を作るか

ざっとAPI集をみた感じだと、以下ぐらいがAPIとしてありそうですね。

 - ファイルを送ってスキャン、再スキャン
 - ハッシュを送ってレポート検索
 - URLを送ってスキャン
 - IPアドレスを送ってスキャン

暗算だと、「それぞれが簡単に実行できるGUI」ですが、何か芸がないですね。オフィシャルを使えばいいわけですし。もう少し考えてみます。

#参考文献
1.公式API
https://www.virustotal.com/ja/documentation/public-api/

2.VirusTotal API の使い方
http://www.morihi-soc.net/?p=600
Ruby Strategyパターン


##はじめに
構造がきれいな設計のために、デザインパターンを再学習しています。
今回はStrategyパターンを扱います。

ちなみに、きれいなコードとはデザインパターンのような構造に関するものと、
[リーダブルコード](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655)に書いてあるような、読みやすコードの記述方法の２つからなると考えています。


##環境
Ruby 2.3.0


##概要
振る舞いに関するパターンのひとつで、アルゴリズムを交換できるよう実装します。
「別々のオブジェクトにアルゴリズムを引き出す」テクニックとのこと。
また、Strategyとは英語で「戦略」という意味です。

Strategyパターンを適用するとifをなくすことができます。

コンテキストにもよるので、ケースバイケースですが、
ifなどで分岐してしまうと、複雑になり、可読性も下がります。
理想はifができるだけ少ないプログラムです。

###コード1
コード１はクラスの継承による実装です。
継承を使用すると、他に継承できなくなる（多重継承はできない）のと、
アルゴリズムごとにクラスを用意する必要があることがイマイチな気がします。

```ruby:Strategy.rb
#継承(抽象)クラスを使用したstrategy
class AbstractFormatter
  def output
    raise "Abstract Method"
  end
end

class TextFormatter < AbstractFormatter
  def output
    puts "text"
  end
end

class HtmlFormatter < AbstractFormatter
  def output
    puts "html"
  end
end

class XMLFormatter < AbstractFormatter
  def output
    puts "XML"
  end
end

text = TextFormatter.new
text.output # => text

html = HtmlFormatter.new
html.output # => html

xml = XMLFormatter.new
xml.output # => xml

```

###コード２
コード２はProcオブジェクトを使用した実装で、
よりRubyらしく、アルゴリズムの切り替えも実装できています。

```ruby:Strategy_lambda.rb
#lambdaを使用したstrategy
class Formatter
  def initialize(&formatter)
    @formatter = formatter
  end

  def switch_formatter(&formatter)
    @formatter = formatter
  end

  def output
    @formatter.call
  end
end

text = -> { puts "text" }
html = -> { puts "html" }
xml = -> { puts "xml" }

formatter = Formatter.new &html
formatter.output # => text

formatter.switch_formatter &text
formatter.output # => html

formatter.switch_formatter &xml
formatter.output # => xml

```

##参考
- [Rubyによるデザインパターン](https://www.amazon.co.jp/exec/obidos/ASIN/4894712857/orangain-22/)
- [増補改訂版Java言語で学ぶデザインパターン入門](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%89%88Java%E8%A8%80%E8%AA%9E%E3%81%A7%E5%AD%A6%E3%81%B6%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E5%85%A5%E9%96%80-%E7%B5%90%E5%9F%8E-%E6%B5%A9/dp/4797327030/ref=sr_1_1?ie=UTF8&qid=1487168180&sr=8-1&keywords=java+%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)
画面を赤く塗りつぶすImageEffect

# 環境
- Unity 5.5系

[カメラにImageEffectの効果をつけるスクリプトはこちら](http://qiita.com/ShibainuBot/items/bfdeb01ef765a684b277)

# 画面を赤く塗りつぶすPostEffect
fragmentシェーダーで赤色を指定します。

```redScale.shrder
Shader "Custom/redScale"
{
	SubShader
	{
		// No culling or depth
		Cull Off ZWrite Off ZTest Always

		Pass
		{
			CGPROGRAM
            #pragma vertex vert
			#pragma fragment frag
					
			fixed4 _Color;

            float4 vert(float4 v:POSITION) : SV_POSITION {
                return mul (UNITY_MATRIX_MVP, v);
            }

			fixed4 frag () : COLOR
			{
				return fixed4(1, 0, 0, 1);
			}
			ENDCG
		}
	}
}
```

Before:
![スクリーンショット 2017-02-15 22.39.35.png](https://qiita-image-store.s3.amazonaws.com/0/141994/3befb778-2fab-2950-9109-1da082c391f1.png)

After:
![スクリーンショット 2017-02-15 22.39.25.png](https://qiita-image-store.s3.amazonaws.com/0/141994/554d19ed-effa-b00a-2bd5-77f57821c199.png)