OmniAICreator/Qiita-1.07M huggingface dataset:
速いサイトと遅いサイトの違いって？

ハイパフォーマンスWebサイトという本を読みまして、気になったポイントのまとめです。
詳しく知らなかったな、実務にすぐに取り入れられそうだなという視点でピックアップしました。

## バックエンドよりフロントエンド
この本では主にフロントエンドの改善方法が書かれていました。その理由としては、以下のようなことが挙げられます。

バックエンド側の応答時間を半分にしたとき、ユーザーに届くまでの全体の応答時間の削減率は5~10%だそうです。
フロントエンド側の応答時間を半分にしたとき、ユーザーに届くまでの全体の応答時間の削減率は40~45%だそうです。

![スクリーンショット 2015-10-08 23.39.35.jpg](https://qiita-image-store.s3.amazonaws.com/0/74581/3770bcb6-7a36-1dab-dd10-e44c33ade083.jpeg)

というわけで、フロントエンドの改善が有効というわけです。

## テクニック1:CDNの利用
CDN(Contents Delivery Network)というサービスでして、大規模なキャッシュサーバーみたいなものですね。有名なものでいうとAmazonのCloudFrontとかがあるかと思います。

メリットとしては、アクセスが増えたときにネットワークトラフィックの急増を吸収してくれる、キャッシュの保持をしてくれると言うことが有名です。
しかし、デメリットもあります。
それは他のWebサイトのトラフィックが急増したときも影響を受ける可能性があること、応答時間はアクセスする場所に依存すること、コンテンツサーバーを直接いじれないことがあることが挙げられます。

「応答時間はアクセスする場所に依存すること」は特に注意が必要で、東京でWebテストをしても遅くなかったサイトが、北海道からアクセスすると物理的な距離によって遅い現象が起こることがあります。
必ずしも早くなるわけではなさそうです。


## テクニック2:gzipで圧縮する
HTMLドキュメントを圧縮するのはよくあるらしいんですが、スクリプトやスタイルシートも圧縮するのがポイントだそうです。
そして、画像やPDFファイルは逆にgzipで圧縮してはいけません。すでに圧縮されているので、さらに展開するときにユーザー側のCPUを喰ってしまい、動作が重くなり、時間がかかる恐れがあります。

ただ、たまにブラウザがgzipに対応していないことがあるので、Accept-EncordingというHTMLリクエストのヘッダ情報を見て、圧縮したレスポンスにするかどうかを決めて返す必要があります。


## テクニック3:リダイレクトは遅い
条件分岐によって飛ばすページを変更するときにリダイレクトをよくすると思います。
ですがリダイレクトすることによって、新たなHTMLを呼ぶ必要があり、そのHTMLが読み込まれるまでレンダリングもダウンロードもできなくなってしまう状況が起きます。

なので、リダイレクトを使うのはなるべく避けるようにしましょう。

## テクニック4:スタイルシートは先頭に
スタイルシートは画像やスクリプトの前に読み込むことが鉄則なようです。
ブラウザに少しでも早くロードし終わったコンテンツから表示することによって、ユーザーに視覚的にフィードバックを返し、安心させることができるからです。

Webサイトにリンクしたとき、真っ白なページが続くのと、文字やスタイルが出た後で順に画像が出てくる方が、あれ？と思うことが少ないですよね？
なので、時間がかかる処理があるときにはローディングしてますとわかる表示があるといいですね。


## テクニック5:スクリプトは最後に
スタイルシートを先頭にもってくるのとは反対に、スクリプトは最後に持ってくるのが有効です。
HTTP/1.1の規格で、一つのホスト名に対して並列にダウンロードできるコンポーネント数は2つまでと制限されています。
ブラウザによって設定を変更できることもありますが、普通のユーザーはその設定をいじることはほぼありません。

そして、2つしかダウンロードできないところに重たいスクリプトファイルをダウンロードし始めてしまうと先に出す必要がある画像の表示が遅れてしまうことがあります。
こういった細かい設定がユーザーの離脱率を下げる要因になるかもしれませんね。


## Ajaxの活用
ページを遷移しないで通信を行うことができるAjax通信。
Ajaxにはパッシブリクエストとアクティブリクエストという2種類のリクエストがあるそうです。
- パッシブリクエスト：将来的な必要性を見越して行うリクエスト
例えばGメールのアドレス帳などは使う可能性が高いので、前もってリクエストしておくみたいな
- アクティブリクエスト：ユーザーのアクションに応じてリクエストを発行するリクエスト

Ajaxを用いた有名なサービスにGoogleMapがあるかと思います。
GoogleMapでいうパッシブリクエストは、「東京駅」で検索したときにちょっと動かす分にはスムーズに動く部分。アクティブリクエストは、「東京駅」からいっきに「大阪駅」に動かすと表示がちょっと遅れて動く部分。
と考えるとイメージしやすいかもしれません。

Ajaxを使うときに忘れていけないのは、非同期にすれば必ず早くなる！というわけでもないことです。
アクティブリクエストの場合は、周りのUIをいじることができるけども、結果的にユーザーは表示されるのを待つことがあることを忘れてはいけません。

## まとめ
CDNとかAjaxとか知っていて、使っていましたが、メリット/デメリットまで理解できていたわけではなかったため、なるほどと思いました。
また、先輩にこっち使う方が早いよって言われて調べるけどなんで？状態がいくつか解決できました。
Webサービスの開発始めたばかりだよっていうエンジニアにはオススメの本でした。

文字ばっかりですみません。。。
CloudFormation Designerを使ってみる


直感的にCloudFormationのスタックを作れるらしいとのことなので、軽く触ってみた。

##マネージコンソールからCloudFormationを選択する
![CloudFormation_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/23936/c65799fc-f437-b1c9-88ed-1671d0c798e6.png "CloudFormation_Management_Console.png")
「Design template」クリックするとすぐに立ち上がる
![AWS_CloudFormation_Designer.png](https://qiita-image-store.s3.amazonaws.com/0/23936/703c1d58-1bf4-30be-6508-eda604067525.png "AWS_CloudFormation_Designer.png")

基本的には左側にあるアイコンをドラッグ＆ドロップで持ってきて、それぞれのサービスをつないでいけばOKな様子。
![スクリーンショット 2015-10-09 0.07.17.png](https://qiita-image-store.s3.amazonaws.com/0/23936/838cb945-7558-ed94-9d9d-af3a8cf472c7.png "スクリーンショット 2015-10-09 0.07.17.png")

紫の丸はそれぞれ意味を持った端子のような感じになっていて、正しい端子を選ばないと接続できないor変なことになる様子。

##JSONテンプレートのインポートも可能
![スクリーンショット 2015-10-09 0.13.45.png](https://qiita-image-store.s3.amazonaws.com/0/23936/8d13cbfc-88e7-9710-30d0-4d515162ee65.png "スクリーンショット 2015-10-09 0.13.45.png")

メニューのopenからすでにあるテンプレートのインポートも可能な様子です。

![スクリーンショット 2015-10-09 0.13.56.png](https://qiita-image-store.s3.amazonaws.com/0/23936/17fafa8d-2247-0a0a-eaa6-b8fb03a334b0.png "スクリーンショット 2015-10-09 0.13.56.png")

S3に置いたファイルも参照可能とのこと。

![AWS_CloudFormation_Designer.png](https://qiita-image-store.s3.amazonaws.com/0/23936/c80fca81-e0e4-9b70-9c6c-1cbe843062c3.png "AWS_CloudFormation_Designer.png")
適当にいじってたテンプレートを入れてみる。

##サンプルもあるので安心（？）

よく見ると「Sample Template」なるものもある。

慣れるまではこれの構成を参考にしろということの様子。

![スクリーンショット 2015-10-09 0.15.57.png](https://qiita-image-store.s3.amazonaws.com/0/23936/01815b5f-d755-3de3-c9ba-7f6ccb602d93.png "スクリーンショット 2015-10-09 0.15.57.png")

LAMPからRuby、WordPressまで結構いろいろある。

![AWS_CloudFormation_Designer.png](https://qiita-image-store.s3.amazonaws.com/0/23936/61dd20ba-f770-f5b1-8b03-cd7e06d87936.png "AWS_CloudFormation_Designer.png")

ただしAWS本とかで紹介されているデザインパターンとはなんか違う感じに配置されるのでちょっと混乱するかも。
10分で出来る！Sketch3を使ったiOSアプリ申請時のスクリーンショット一括作成法(๑˃̵ᴗ˂̵)و

iOSアプリ申請時にiTunes Connectで提出するアプリ説明用スクリーンショット作成、サイズの種類が多くて大変ですよね。
4.7インチ、5.5インチ、4インチ、3.5インチ(iPad)の画像を各5枚ずつ1枚1枚作成とか気が遠くなります(๑•́ ₃ •̀๑)

本日は、そんなときに便利なSketch3を使ったiOSアプリ申請用スクリーンショット一括作成法をご紹介します(๑˃̵ᴗ˂̵)و

【用意するもの】
・Sketch3
・アプリ申請用スクリーンショット

【手順】
1. まず、Sketch3を起動し、左上の「+」をクリックし、アートボードをクリックします。
![iOSアプリ申請1.jpg](https://qiita-image-store.s3.amazonaws.com/0/52881/2032e5bb-db5f-f4a3-d974-5f72bbd0b0cb.jpeg)

2. すると右側の「iOS Device」に各サイズのアートボードリストが現れるので、作成したいサイズを選択します。
![iOSアプリ申請2.png](https://qiita-image-store.s3.amazonaws.com/0/52881/dd503177-989f-e706-7766-8b8405a94b19.png)

3. アートボードが表示されます。これを選択して、
![iOSアプリ申請3.png](https://qiita-image-store.s3.amazonaws.com/0/52881/0264b77a-fba3-f01a-8320-11a63229884e.png)

4. コピーアンドペーストでスクリーンショットの枚数分(最大5枚)増やします。
![iOSアプリ申請4.png](https://qiita-image-store.s3.amazonaws.com/0/52881/b0fc90a2-6c3b-1494-1f73-d8ed36e731e7.png)

5. 同じようにして他のサイズも作成します。
![iOSアプリ申請5.png](https://qiita-image-store.s3.amazonaws.com/0/52881/d852b093-c519-e1c9-b63b-8fb8f7a0b516.png)

6. ちなみに「iOS Device」の中に欲しいサイズがない場合は直接サイズ(WidthxHeight)を指定することも出来ます。
![iOSアプリ申請6.png](https://qiita-image-store.s3.amazonaws.com/0/52881/88e4b91c-e472-d92d-fdc2-026f4fbbe084.png)

7. アートボードの準備が整ったら、ボードの上に準備した申請用スクリーンショット画を配置します。
![iOSアプリ申請9.png](https://qiita-image-store.s3.amazonaws.com/0/52881/ce050030-723b-8026-8992-d47eb5bb2582.png)

8. ここから、画像出力準備です。出力したいアートボードを選択すると右側にExportの設定が現れます。

9.「Export」の文字の右側の「+」をクリックし、出力サイズやフォーマットを選択するだけで、出力パターンを増やせます。
![iOSアプリ申請10.png](https://qiita-image-store.s3.amazonaws.com/0/52881/29324b6f-5a89-2eb0-392b-7b5f22315450.png)

１０. Exportの設定が終わったら、「File→Export」をクリックし、出力したいものにチェックが入っているか確認し、「Export」をクリックします。
![iOSアプリ申請13.png](https://qiita-image-store.s3.amazonaws.com/0/52881/25c8a685-6e3a-13dc-0a2d-74a3d6e526e0.png)

１１. 11.このように各サイズの画像が出力されました。
![iOSアプリ申請14.png](https://qiita-image-store.s3.amazonaws.com/0/52881/0d522b10-c76d-12fd-194f-6178a7184d43.png)

以上で完了です！

いかがでしたか？みなさんのiOSアプリ申請のお役に立てましたらストックお願いします(๑˃̵ᴗ˂̵)و！
Stackで管理しているHaskellのプロジェクトをCircleCIでビルドする

最近話題のHaskellのビルドツール[stack](https://github.com/commercialhaskell/stack)をCircleCIでビルドする方法の一例を紹介します。

下記のように`circle.yml`を書けばOKです。

```yaml
dependencies:
  cache_directories:
    - "~/.stack"
  pre:
    - wget -q -O- https://s3.amazonaws.com/download.fpcomplete.com/ubuntu/fpco.key | sudo apt-key add -
    - echo 'deb http://download.fpcomplete.com/ubuntu/precise stable main'|sudo tee /etc/apt/sources.list.d/fpco.list
    - sudo apt-get update && sudo apt-get install stack -y
  override:
    - stack setup
    - stack build
    - stack build --test --only-dependencies

test:
  override:
    - stack test
```

`override`でテストに必要なライブラリをビルドしておくと、それもキャッシュされるので以降のビルドが早いです。

こちらを参考にしました。
https://gist.github.com/dbp/bef96402ea07001dfed2

上記の設定は[hs-git-gsub](https://github.com/fujimura/hs-git-gsub)というリポジトリで実際に使っています。正確に言うと[`728329b`](https://github.com/fujimura/hs-git-gsub/tree/728329b9dc74546a6a84e37590ada963d00e1787)時点の設定を一部改変したもので、ビルド結果は[こちら](https://circleci.com/gh/fujimura/hs-git-gsub/22)です。

stackについては下記リンクをご参照ください。

- [オフィシャルサイト](https://github.com/commercialhaskell/stack)
- [Haskellのビルドツール"stack"の紹介](http://qiita.com/tanakh/items/6866d0f570d0547df026)
- [Haskell環境構築_20151013_最新版_1_投稿済み.md](http://qiita.com/philopon/items/879c2011ce8744c838de)
- [もうcabal hellは怖くない、Stackを使ってみるよ!](http://tune.hateblo.jp/entry/2015/07/13/034148)
- [Stackでやる最速Haskell Hello world! (GHCのインストール付き！)](http://qiita.com/igrep/items/da1d8df6d40eb001a561)
初めての IBM Bluemix (お試し版)でRailsアプリ


事前準備として、IBMのユーザ登録、Bluemixの登録をしておく。
Bluemixが利用できるようになると、ダッシュボート画面が表示される。

![スクリーンショット 2015-10-28 22.50.18.png](https://qiita-image-store.s3.amazonaws.com/0/3184/4949e4b2-b479-cc84-9c68-05eddc3b613e.png "スクリーンショット 2015-10-28 22.50.18.png")

とりあえず、アプリを作りたいので、Cloud Foundryアプリを作成する。

![スクリーンショット 2015-10-28 22.50.57.png](https://qiita-image-store.s3.amazonaws.com/0/3184/a368f0d9-ff61-b52c-2bd1-8a5eef78dfe8.png "スクリーンショット 2015-10-28 22.50.57.png")

今回は、Railsにて作成したいので、Webアプリを選択する。

![スクリーンショット 2015-10-28 22.51.23.png](https://qiita-image-store.s3.amazonaws.com/0/3184/01a5d303-b888-51eb-2247-b3ae59cda7b7.png "スクリーンショット 2015-10-28 22.51.23.png")

Rubyを選択する。

![スクリーンショット 2015-10-28 22.52.11.png](https://qiita-image-store.s3.amazonaws.com/0/3184/e9a1f95e-d66d-e26a-322a-99ac425a5369.png "スクリーンショット 2015-10-28 22.52.11.png")


アプリ名は、URLの一部となるため、唯一のアプリ名にする。

![スクリーンショット 2015-10-28 22.54.26.png](https://qiita-image-store.s3.amazonaws.com/0/3184/2eb18512-0a25-b855-b87f-b9bdfbd38153.png "スクリーンショット 2015-10-28 22.54.26.png")

しばらくすると、ダッシュボードにアプリケーションが作成され、インスタンスが起動している。

![スクリーンショット 2015-10-28 23.13.12.png](https://qiita-image-store.s3.amazonaws.com/0/3184/78fe7c35-566a-4b6e-f6a7-5463ac275eb8.png "スクリーンショット 2015-10-28 23.13.12.png")

指定されたURLにアクセスすると、アプリが立ち上がっていることが確認できる。


![スクリーンショット 2015-10-28 23.05.15.png](https://qiita-image-store.s3.amazonaws.com/0/3184/6a8cdb32-0283-9699-f17d-3fbfaed7115c.png "スクリーンショット 2015-10-28 23.05.15.png")

非常に簡単です。

今後も触っていこう。とても期待。
多対多

たとえば「子ども」と「お稽古事」というデータモデルを考えます。一人の「子ども」は、複数の「お稽古事」を学ぶことができます。ピアノ教室に入って、水泳スクールにも入っていた方もいらっしゃるでしょう。逆に一つの「お稽古事」（の教室）から見ると、複数の「子ども」が入会しています。つまり、「子ども」のデータモデルと「お稽古事」のデータモデルの間には多対多の関連付けを行います。
RVMでインストールしたRubyを使う

RVMでローカルにインストールされているRubyのバージョン一覧を見るコマンド。
$ rvm list

使用するRubyのバージョンを変更するにはuseコマンドを使う。
$ rvm use 1.8.7

ターミナルを別タブで開いたりMacを再起動すると、Rubyのバージョンが元に戻ってしまうので、--defaultオプションで常に使用するバージョンを指定する。
$ rvm use 1.8.7 --default
rvm コマンドのまとめ

コマンド 動作
rvm list known　 インストール可能なrubyバージョンの一覧を表示
rvm list 　　　　インストールされているrubyバージョンの一覧を表示
rvm install 1.8.7 　ruby-1.8.7の安定版をインストールする
rvm install 1.9.2　 ruby-1.9.2の安定版をインストールする
rvm 1.8.7　　　 ruby-1.8.7の環境に切り替える (rvm use 1.8.7の短縮形)
rvm 1.9.2　　　 ruby-1.9.2の環境に切り替える (rvm use 1.8.7の短縮形)
rvm system　　 標準(rvm管理外)のruby環境に戻す (rvm use systemの短縮形)
rvm info 　　　現在選択されているrubyの環境情報を表示する
rvm uninstall 1.8.7 　　ruby-1.8.7をアンインストールする

Gemの環境切り替え

コマンド 動作
rvm gemset list　　 設定されているgemsetの一覧を表示
rvm gemset create rails30 　「rails30」という名前のgemsetを作成
rvm gemset create rails31 　「rails31」という名前のgemsetを作成
rvm 1.9.2@rails30 　　ruby-1.9.2にて「rails30」という名前のgemsetへ切り替える
rvm 1.9.2@rails31　　 ruby-1.9.2にて「rails31」という名前のgemsetへ切り替える
rvm gemset delete rails30 　「rails30」という名前のgemsetを削除
undefined method `configure'

状況
undefined method 'configure' for #<FirstApp::Application:0x007fb5278fe6c8> (NoMethodError)
対処方法　↓
•stackoverflowの回答によると、 config/environments/development.rb を変えてあげればいいとのこと
•アプリ名が「FirstApp」だったので、以下のように修正した
Gemfile

Rails.application.configure do
↓
FirstApp::Application.configure do
ｒｕｂｙ基本的用語

オブジェクト指向プログラミング とは
コンピュータプログラムの構造、構成法の一つで、関連するデータの集合体と、それを操作する手続きを「オブジェクト」（object）と呼ばれるひとまとまりの単位として一体化し、オブジェクトの組み合わせとしてプログラムを記述する手法。

ノーメソッドとは
メソッドを呼び出せって、そんなメソッドないあるよ

メソッドとは
オブジェクト指向プログラミングにおいて、各オブジェクトが持っている自身に対する操作

ハッシュとは
配列変数に似た機能でハッシュ機能があります。配列変数が番号を使ってデータにアクセスするように、ハッシュは、文字を使ってデータにアクセスします。
田中さんの成績
ハッシュは、配列変数のようなものなので、連想配列とも呼ばれます。
配列変数の『配列￥番号』を、『ハッシュ@キー名』のようにアクセスします。
下のプログラムはハッシュを使って、田中さんの成績を表したものです。
田中とはハッシュ
田中@「国語」は80
田中@「数学」は40
田中@「社会」は92
田中@「理科」は67

成績表示とはプロパティエディタ
成績表示のテキストは田中
これを実行すると、
国語＝８０
数学＝４０
社会＝９２
理科＝６７
のようにプロパティエディタに表示されます。
上のプログラムだと、あまりハッシュの有り難味がありませんので、ユーザーが入力した科目を表示するというプログラムを作ってみます。
田中@「国語」は80
田中@「数学」は40
田中@「社会」は92
田中@「理科」は67

「知りたい科目は？」と尋ねて、科目に代入。
田中@科目を表示。
これを実行して、国語と入力すると、８０が表示されます。また、数学と入力すれば、４０が表示されます。
このようにハッシュを使うと、好きなデータをキーによって取り出すことができるのです。

コンソールとは
コンピュータを操作するために使う入出力装置のセット。制御卓、操作卓などとも呼ばれる。

タスクとは
OSから見た処理の実行単位。通常はスレッドが実行単位となるが、OSによってはプロセス（複数のスレッドを含むプログラム全体）を1つの実行単位としてみる場合もある。

ヘルパーとは
Railsのviewでは元々用意されている様々な便利なメソッドを使用できます。（link_to など）
ただ、痒い所に手を届かせるためにはこれらのメソッドを自作する必要があります。
そしてこれらの利便性を向上させるメソッドをヘルパーと呼びます。

コミットとは
データベースにおける一連の更新処理が全て正常に完結したという宣言のことである。

コントローラクラスとは
Railsプログラミングを行う上で、まず基点となるものです
コントローラクラスの作成(構文）
rails generate controller name
name:コントローラ名　　options:動作オプション
eclipse + maven + m2e-code-quality で Java コードの品質を保つ

# m2e-code-quality とは

[m2e-code-quality](http://m2e-code-quality.github.io/m2e-code-quality/) は、eclipse の m2e の拡張プラグインで、m2e 同様、pom.xml のコード品質に関わる設定を eclipse の設定に反映します。

これによって、初回の maven プロジェクトのインポートでチームメンバーに設定を強制することができるので、面倒な設定手順をいちいち共有しなくても良くなります。

# 対応するツール

m2e-code-quality に対応するツールは以下のとおり。

* FindBugs
    * コンパイル後のバイトコードを解析し、ソフトウェアの不具合を探してくれるツール
* PMD
    * Java のソースコードを解析し、ソフトウェアの不具合を探してくれるツール
* Checkstyle
    * コーディング規約をチェックするための静的解析ツール

pom.xml に上記の設定を書いておくと、eclipse のプラグインも動いてくれます。

Jenkins 上で maven に FindBugs, PMD, Checkstyle のレポートを実行をしている場合、その設定と同じことをローカルの eclipse 上でも実行できるので、ローカルと CI のコード品質チェックを一致させることができます。

# 設定方法

* プラグインが対応しているかどうかによって対応が異なりますが、maven の設定をしておくのが基本です。

## FindBugs

pom.xml には [findbugs-maven-plugin](http://gleclaire.github.io/findbugs-maven-plugin/) が実行できるような設定を追記しておきます。

```xml:pom.xml
<plugin>
	<groupId>org.codehaus.mojo</groupId>
	<artifactId>findbugs-maven-plugin</artifactId>
	<executions>
		<execution>
			<id>fb</id>
			<goals>
				<goal>findbugs</goal>
			</goals>
			<phase>compile</phase>
		</execution>
	</executions>
	<configuration>
		<effort>Default</effort>
		<omitVisitors>[ディテクタ]</omitVisitors>
	</configuration>
</plugin>

```

* 注意点
    * visitors を指定すると、全部 OFF にして visitors にあるディテクターだけ ON になる。omitVisitors を指定すると、デフォルトの状態から指定のディテクターを OFF にするらしい。

## Checkstyle

pom.xml には [maven-checkstyle-plugin](https://maven.apache.org/plugins/maven-checkstyle-plugin/) が実行できるような設定を追記しておきます。

```xml:pom.xml
<plugin>
	<groupId>org.apache.maven.plugins</groupId>
	<artifactId>maven-checkstyle-plugin</artifactId>
	<executions>
		<execution>
			<id>checkstyle</id>
			<phase>compile</phase>
			<goals>
				<goal>checkstyle</goal>
			</goals>
		</execution>
		<configuration>
			<configLocation>[URL or 相対パス]</configLocation>
		</configuration>
	</executions>
</plugin>
```

## PMD

省略

# まとめ

* コード品質を保つ設定を pom.xml にだけ書くことで eclipse に反映する方法をまとめました。
* プラグインの開発によって eclipse の反映がうまくいかないことがあるかもしれませんが、pom.xml にプロジェクト設定を一元化し、その設定を見て、IDEやその他の環境に反映されるという環境づくりは、各人の開発環境の独立性を確保し、好きな開発環境を構築することができます。eclipse でなくても netbeans などで pom.xml の設定を反映できれば、自由な開発環境をエンジニアが選択できます。また、Jenkins などの CI 環境での動作も保証できます。
* maven のプロジェクトのポータビリティ性を活用して、Java エンジニアの自由度を上げた開発環境を構築してみたはどうでしょうか？
InDesignのJavaScriptでaddEventListener()

## InDesignでのaddEventListener()の使い方

スクリプト冒頭で`#targetengine "seccion"`の指定が必須。

```js:AFTER_SAVE.js
#targetengine "session"

var main = (function() {

  // 現在アクティブな書類
  var doc = app.activeDocument;

  // ドキュメントの保存後にコールバックを実行
  doc.addEventListener(Document.AFTER_SAVE, function(){
    alert('test');

    // すべてのイベントリスナーを削除
    doc.eventListeners.everyItem().remove();
  });

})();

```
CornerstoneでWorking Copiesのサイドバーが消えたまま戻らない時の対処法

#CornerstoneでWorking Copiesのサイドバーが消えた時の対処法

1. Cornerstoneを起動している場合は一旦落とし起動し直す。
1. 起動したら、どのボタンも押さない状態で、Cornerstoneウィンドウ左端にマウスカーソルを右から近づける。
1. マウスカーソルが変わるのでそのまま右へ引っ張り出す。以上。
How to infer MAP estimate of HMM with PyStruct


PyStructを使ってHMMでラベル系列の事後確率最大推定．

```py:準備
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

from pystruct.inference import inference_dispatch
```

データは以下のもの．時系列データの整数化・平滑化を試す．

```py:データ
d = '17.2 19.7 21.6 21.3 22.1 20.5 16.3 18.4 21.0 16.1 17.5 18.5 18.4 18.3 16.0 21.2 18.8 24.3 23.3 20.5 16.9 22.4 20.1 24.5 24.2 22.7 19.6 23.6 23.3 24.6 25.0 24.3 22.2 22.7 19.5 20.5 17.3 17.2 22.0 20.9 21.5 22.3 24.0 22.4 20.2 15.7 20.4 16.3 17.7 14.3 18.4 16.6 13.9 15.2 14.8 15.0 11.5 13.4 13.5 17.0 15.0 17.5 12.3 11.8 14.5 12.4 12.9 15.8 13.8 11.4 6.5 5.9 7.2 5.6 4.6 7.5 8.9 6.6 3.9 5.7 7.3 6.1 6.8 3.1 2.6 7.9 5.2 2.0 4.0 3.4 5.7 8.1 4.7 5.4 5.9 3.6 2.9 5.7 2.1 1.6 2.3 2.4 1.2 4.2 4.2 2.4 5.6 2.5 3.0 6.1 4.9 7.1 5.0 7.2 5.2 5.1 10.4 8.3 6.9 6.8 7.8 4.2 8.0 3.2 7.9 5.9 9.5 6.4 9.2 11.7 11.6 15.5 16.7'
d = np.array([ float(c) for c in d.split()])
```

ではHMMモデルの構築と推論の実行．
- データ項 (unary term) は (ノード数,クラス数) のndarray
- ペアワイズ項 (pairwise term) は (クラス数, クラス数) のndarray．エッジ毎に変えるなら，(エッジ数, クラス数, クラス数) のndarray（API reference manualが間違っている場所あり．注意．）．

```py:実行!
nClasses = 20 # 離散クラスの数．20
p = 10 # 隣接するノードのクラスが異なった場合のコスト．（同じなら0）

# データ項．ラベルとの差の絶対値
unaries = np.array([ [ abs(i-j) for j in range(nClasses) ]  for i in d  ])

# ペアワイズ項．同じラベルなら0，異なるならp
pairwise = np.array((np.ma.ones((nClasses, nClasses)) - np.eye(nClasses)) * p)

# ノードを連結するエッジの設定．HMMなので1次元．
edges = np.array([ [i, i+1] for i in range(unaries.shape[0]-1) ])


# 推論実行．この関数は最大化するので，unaryiesとpairwiseにマイナスをつける．
res = inference_dispatch(-unaries, -pairwise, edges, inference_method='max-product')

# プロット．
plt.plot(d, label="data")
plt.plot(res, label="result")
plt.legend()
```

![Unknown.png](https://qiita-image-store.s3.amazonaws.com/0/44835/3e062178-db89-a4fb-7484-6a721de44b41.png)
【AWS】初めてのCodeCommit

AWSのWebinerでCodeCommitとCodePipelineとCodeDeployの紹介があったので、
まずはCodeCommitを利用してみました。

# やってみた
AWSアカウントを持っていれば誰でも利用できます。
以下手順で設定をしましょう。

１．IAMでCodeCommitのPolicyをAttache

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "codecommit:*"
      ],
      "Resource": "*"
    }
  ]
}
```

２．Public Keyをアップロード
自身のマシンで鍵を作成して、登録します。
まず、PCで以下コマンドを実行。

```
$ ssh-keygen
```

作成時に指定した鍵を開いて、内容をコピーします。
AWSのマネージメントコンソールで
IAM -> Users -> ユーザー選択 -> Security Credentialsタブ
と進んで、画面下部にあるUpload SSH public keyボタンを押下して登録します。

登録後に次の手順で利用するSSH Key IDが表示されます。（Upload SSH public keyボタンの下あたり）

３．Config設定

先ほど作成した秘密鍵と、公開鍵をIAMに登録した際に発行されたSSH Key IDを登録します。
以下が例です。

```~/.ssh/config
Host git-codecommit.*.amazonaws.com
  User 1234567890ABCDEFGHIJK  # SSH Key ID
  IdentityFile ~/.ssh/id_rsa  # 秘密鍵のパス
```

４．git clone
コマンドはgitと同です。
無事cloneできました！

注）Macで鍵を複数作成している場合はIdentityFileに指定した鍵をssh-addしてください。
　　permission deniedでおこられます。

# あとがき
ほぼgithubと同じような設定で利用することができました。
ただ、githubやGitlabのすべての機能が使えるわけではありません。

Webinerでも言っていましたが、

>pull requestやmerge requestの要望は多いが、未だ実装には至っていない

ということです。

さすがにrequest機能がない状況で複数人数での運用は厳しいので、
今回はとりあえず個人プロジェクト用に利用してみたいと思います。

今度はCodePipelineとCodeDeployの連携をやってみます。
AndroidAsyncのサーバーが止まらない件

[issue](https://github.com/koush/AndroidAsync/issues/351)に載ってた。

## 症状

```java
private AsyncHttpServer server;

public void start() {
  server = new AsyncHttpServer();
}

public void stop() {
  server.stop(); // これを実行しても接続済みコネクションがある場合サーバーが停止しない!!
}
```

`server.stop()`を呼ぶとHTTPサーバーが停止するはずなのですが、すでに接続しているコネクションがある場合にそのコネクションが残ったままになります。ブラウザーの更新ボタンを押したりしても普通に通信できてしまいます。
新規接続を受け付けることはできなくなっているようですが……これは困ります。

## 解決策

```java
private AsyncHttpServer server;

public void start() {
  server = new AsyncHttpServer();
}

public void stop() {
  server.stop();
  AsyncServer.getDefault().stop(); // これを追加するとすぐ止まる
}
```

ひとまずこれですぐにサーバーを止めることができました。めでたしめでたし。
dockerコンテナの中でgcloudコマンドを使う

dockerコンテナから `gcloud` コマンドを使うことでGCEの操作を行う事ができますが、そのためにはログイン認証をする必要があったりして、いまいち自動化の恩恵に預かれません。

一度どこかで `gcloud auth login` 認証を行って、`~/.config/gcloud`の中から `./credentials`と`application_default_credentials.json`をコピーして配置してあげれば大丈夫なようです。

以下、Google cloud sdkのインストールとクレデンシャルの配置を行う`Dockerfile` の例

```Dockerfile
RUN apt-get update && apt-get install -y curl python
RUN curl https://sdk.cloud.google.com | bash
ENV CONFIG /root/.config/gcloud
ENV PATH /root/google-cloud-sdk/bin:$PATH
COPY ./credentials $CONFIG/credentials
COPY ./application_default_credentials.json $CONFIG/application_default_credentials.json
RUN gcloud config set account <GCE account email>
RUN gcloud config set project <GCE project name>
```

当然ながら、このimageをpublicなリポジトリに公開してはいけません。
セキュアなプライベートリポジトリでの運用が必須ですね。
{質問}青い目にならない

pepperは人を認識すると、目がピンク色になり、その後青くなり話を聞こうとするはずなんですが、所有のpepper（8月予約分）は、そうなりません。
人を認識して、目がピンク色になりますが、その後は目が白いままでこっちを見ています。
青い目になるのは、pepperが勝手にしゃべった後だけです。
再起動しても変わりません。
何か設定があるのでしょうか？
PowerShellで関数名とエイリアス名が衝突して無限ループに陥った件

あるいは関数命名ルールについて。。。

当たり前といえば当たり前なんですが、もうタイトルの通りです。

## うっかりエイリアスを設定した
PowerShellではUnixっぽさやコマンドプロンプトとの互換性を確保するためにエイリアスが多用されています。加えてUnix同様、カレントディレクトリ中の実行ファイルであっても正しくパスを与えないと動作しない仕様。

**なので、**PowerShellスクリプトを書いたらエイリアスを設定してやると便利ですよねー。

1. Script.ps1内にhogehoge()という関数をかいた

2. Script.ps1内でhogehogeを呼び出すスクリプトだ

3. ./Script.ps1って入力するのめんどくさい

4. Set-Alias hogehoge C:\User\home\Script.ps1

5. &gt;&gt;&nbsp;hogehoge

…止まりません。（泣

だって関数名には機能を表す名前つけるじゃないですかー。エイリアスだって機能を表すコマンド名にしたいじゃないですかー。

関数の呼び出しにカッコ付けないというPowerShellの仕様は如何なものか。o(｀ω´ )o

## エイリアスについて
TechNetによりますと。
[Windows PowerShell エイリアス](https://technet.microsoft.com/ja-jp/scriptcenter/powershell_owner07.aspx)

> Windows PowerShell におけるエイリアスとは、コマンドレット、関数、スクリプト、実行可能ファイルなどに割り当てられた別名のことです。PowerShell コマンド プロンプトから実行できるほとんどすべての処理には、エイリアスを割り当てられます。

エイリアスは関数に対しても割り当てることができるから、名前がかぶっちゃったらエイリアスが最優先されるんだね。

だからさっきプロンプトでhogehogeって入力したら一旦Script.ps1が呼び出されたんだけど、内部で関数をコールしたつもりのhogehogeはエイリアスを呼んで…

＿人人人人人人人人人＿
＞　無限ループ！！　＜
￣ＹＹＹＹＹＹＹＹＹ￣

## 関数について
TechNetによりますと。
[Windows PowerShell: より良い関数を作成する](https://technet.microsoft.com/ja-jp/magazine/hh360993.aspx)

> 関数名はコマンドレット名と同じ形式にする必要があります。つまり、Get のような Windows PowerShell でよく使用される動詞で始まり、単数名詞で終わる必要があります。

まじかー！

とりあえずこのルールに則らなくても関数は機能するけれど、直接コマンド的に呼び出す関数名はともかく、スクリプト内で使用する関数名はこれに従ったほうがよさそう。

## 別解、スクリプトブロック
TechNetによりますと。
[about_Script_Blocks](https://technet.microsoft.com/en-us/library/hh847893.aspx)

> Syntactically, a script block is a statement list in braces, as shown in 
    the following syntax:


>        {<statement list>}

関数のFunction hogehoge()部分を取っただけみたいな。。。

これを変数に代入できるので、呼び出し時は\$で始まる`$hogehoge`になるのでエイリアスと干渉しない。これでもいいか。
PowerShell リモート操作

# 操作される側の設定

PowerShellを管理者として実行する。

```
Enable-PSRemoting
```

# 操作する側の設定

PowerShellを管理者として実行する。

```
Set-Item WSMan:\localhost\Client\TrustedHosts -Value 接続先のIPアドレス
```

TrustedHostsを削除する場合は下記を実行する。

```
Clear-Item WSMan:\localhost\Client\TrustedHosts
```

# リモートホストへの接続(ワークグループ環境の場合)

PowerShellを管理者として実行する。

```
Enter-PSSession 接続先のIPアドレス -Credential 接続先アカウント名
```

# 接続の切断

```
Exit-PSSession

または

exit
```
Rでチョットヘンな縦持ち横持ち変換をしたい

# 縦持ち横持ち変換（チョットヘン）

具体的に、どのあたりが変なのか？

<img width="491" alt="qiita1.png" src="https://qiita-image-store.s3.amazonaws.com/0/94255/ad99d77c-a6a7-7d87-e638-0de5e6e5ceff.png">

なんとなーく、普通でない感じがしますよね。
普通にやると、length(a)×length(b)の形のデータフレームないしマトリクスになってしまいます。

## やりかた１

readrを使います。ソート順が乱れません。ちょっと遅いです。
windowsで動かしているのでiconvをしないといけないのがポイント。

```r:
> library(readr)
> N=10
> df <- data.frame(a=1:N,b=sample(N,N))
> df[1,"a"] <- "日本語であそぼ"
> b<-proc.time()
> str<-paste(paste(df[,1],collapse = ","),paste(df[,2],collapse = ","),sep="\n")
> df <- read_csv(iconv(str,from="cp932",to="utf-8"))
> c<-proc.time()
> c-b
   ユーザ   システム       経過  
      0.05       0.02       0.06 
> df
  日本語であそぼ 2 3  4 5 6 7 8 9 10
1              3 7 6 10 9 4 8 1 5  2
```

## やりかた２

reshape2を使います。ちょっと早いです。
しかし、ソートが乱れてしまうという、業務アプリ的には重大な欠点があります。
分析にはそんなに重要でない場合も多いですが…
※列名の先頭に数値とかをつければ、解決しますが。

```r:
> library(reshape2)
> N=10
> df <- data.frame(a=1:N,b=sample(N,N),c=1)
> df[1,"a"] <- "日本語であそぼ"
> b<-proc.time()
> df <- dcast(df,c ~ a, value.var = "b")[,-1]
> c<-proc.time()
> c-b
   ユーザ   システム       経過  
      0.02       0.00       0.03 
> df
  10 2 3 4  5 6 7 8 9 日本語であそぼ
1  4 3 5 1 10 8 6 7 2              9
```

何かいい方法があれば、ぜひ教えてください。

## よだん

なぜこんなことをやりたかったかというと、shinyのselectInput()が、このような形式のデータフレームを欲しているからです。なぜこんな形にしないといけないのだー。
shiny側での対応方法があれば、ぜひとも教えてください。
WordPress the_*とget_the_*の違い

#はじめに
詰まったのは,投稿日を取得して投稿内容にくっつけようとしたので

    $time = the_time();
    $content .= $time;
    echo $content;
のような感じで実装したらcontentよりも投稿日のほうが先に出力される事態になった.

#the_\*とget_the_\*の違い
* the_\*はこのAPIが実行された際に表示も一緒に行ってくれる.

* get_the_\*はthe_\*で表示される文字列を戻り値として送ってくれるAPIのこと.

なので例えば

    the_content();
を実行するとコンテツが表示されるが,

    get_the_content();
を実行してもコンテンツは表示されない.
なので,

    $content = get_the_content();
などとして扱う.

#注意点
特にcontentの場合,get_the_contentはWordPressのフィルターを介さずデータのみ戻すのでショートコードや,動画の自動埋め込み等が文字として渡されてしまう.
例えば,

    [gallery]
のように記事に記載してもそのまま[gallery]が戻されてしまうといったように動作がことなる場合があるので注意が必要である.

#おわりに
なので

    $time = get_the_time();
    $content .= $time;
    echo $content;
としたら理想的な動作をしてくれた.
Ansibleでvagrantにssh接続できない


##エラーメッセージ
```ansibleで接続
ansible -i hosts vagrant-php -m ping                                                                                                                                                                                         
192.168.33.10 | FAILED => SSH Error: Host key verification failed.
    while connecting to 192.168.33.10:22
It is sometimes useful to re-run the command using -vvvv, which prints SSH debug output to help diagnose the issue.
```

##原因
`vagrant destroy`で一度壊した仮想サーバのフィンガープリントが保存される。
そのまま`vagrant up`をするとSSH接続時には、以前保存したこのフィンガープリントと、新しく出来たサーバのフィンガープリントが一致しなかったため、接続ができなかった。

##対策
~~viで`~/.ssh/known_hosts`ファイルのエラーとなったIPアドレス(192.168.33.10)から始まる行を1行削除。~~
コメントの方法を参考にして改良した。
`vagrant ssh-config "ホスト名" >> .ssh/config`で設定し、
inventoryファイルにホスト名を追記で:ok:。
##参考
http://qiita.com/grgrjnjn/items/8ca33b64ea0406e12938
http://mawatari.jp/archives/solution-of-vagrant-ssh-connection-error
Travis CIからgithub.ioにデプロイする方法


備忘録も兼ねて書きます。
この方法でも`gh-pages`にデプロイ可能ですが、今回は個人ではなく
OrganizationでのGithub Pagesの利用なので`[組織名].github.io`にデプロイをします。

##1. 開発用リポジトリを作ります。
適当に開発用のhtmlやcssをjsをおいてコミットしてください。

##2. 別リポジトリ`[組織名]/[組織名].github.io`を作成
リポジトリにはあとでファイルを追加するので空にしておいてください。
 今回は`example/example.github.io`を作ったとします。

##3. Travis CIの設定
ルートリポジトリに`.travis.yml`を設置してください。今回は以下のとおりです。
デプロイの実行は`deploy.sh`で行います。
マスターブランチかつプルリクじゃない場合はデプロイをするようにしています。

```.travis.yml
language: node_js
node_js:
  - 0.12
sudo: false
script:
  - '[ "$TRAVIS_BRANCH" == master ] && [ "$TRAVIS_PULL_REQUEST" == "false" ] && bash ./deploy.sh'
cache:
  directories:
    - node_modules
```
その後はTravis CIからGithubにアクセスするにはAPIトークンが必要です。しかしそのままトークンを設定するのはマズイので暗号化します。Travis CIでは環境変数を暗号化することができます。
今回の場合、Travis CIのgitからpushするために、Github.comの[Personal access tokens](https://github.com/settings/tokens)からトークンを取得しルートディレクトリ直下で

```
npm install travis-encrypt -g
travis-encrypt -r '組織名/リポジトリ名' -k GH_TOKEN -v 'Githubから取得したトークン' --add
```

をすると自動的に設定した環境変数が追加されます。

```.travis.yml
env:
  global:
    - secure: dfei543fe...　//GH_TOKEN
```
##4. deploy.sh

あとはdeploy.shをディレクトリ直下に置く

```
#!/bin/bash
set -e
rm -rf public || exit 0;
mkdir public

# publicフォルダに開発用ファイルを展開する。
cp -r src/* public

cd public

git config user.email "example@example.com"
git config user.name "Travis-CI"

git init
git add .
git commit -m "Deploy to GitHub Pages"
git push --force --quiet "https://${GH_TOKEN}@github.com/example/example.github.io.git" master:master > /dev/null 2>&1
```
`gh-pages`にデプロイする場合は`master:master`を`master:gh-pages`にしてください。

あとはTravisCIと連携してpushで回るはず。



##参考
* [Publishing gh-pages with Travis-CI](https://medium.com/@nthgergo/publishing-gh-pages-with-travis-ci-53a8270e87db)
* [promises-guide/deploy-gh-pages.sh](https://github.com/w3ctag/promises-guide/blob/master/deploy-gh-pages.sh)
* [Chrome Extensionでユニットテストしてみる #TddAdventJp](http://sue445.hatenablog.com/entry/2013/12/24/000054)
Rubyでテンプレートファイルから日本語の文字列を抽出する

タイトルのままですが、非エンジニアの方にHTMLファイルやテンプレートファイルを翻訳してもらう際、日本語を手動で抽出するのが面倒だったため、つくってみました。

完璧ではありませんので、あくまで自己責任で参考程度にお使いください。
例えば、"Rails大好き"みたいなテキストで"Rails"は抽出されないので。。

```ruby:get_japanese_from_file.rb
# 正規表現
japanese_regex = /[\p{Han}\p{Hiragana}\p{Katakana}，．、。ー・]+/

File.open('./japanese.txt', 'w') do |japanese_file|
  Dir.glob('views/**/*.html.erb') do |template_file|
    # ファイル名出力
    japanese_file.puts("対象ファイル名：#{template_file}")

    # ファイル読み込み
    text = File.read(template_file, encoding: Encoding::UTF_8)

    # 日本語抽出
    japanese_words = text.scan(japanese_regex)
    uniq_japanese_words = japanese_words.uniq

    # 日本語出力
    japanese_file.puts(uniq_japanese_words)
  end
end
```

PHPよりRubyの方が正規表現つくりやすそうだったので、Rubyで書きましたが、Ruby慣れていないので書きっぷりで変なところがあればご指摘ください。
もちろん、もっとよい抽出方法があれば教えてください！

## 参考サイト
Ruby の正規表現で日本語（ひらがな/カタカナ/漢字）にマッチさせる：
http://easyramble.com/japanese-regex-with-ruby-oniguruma.html
Windows 7 システム修復

# システム修復ディスク

コントロールパネル > システムとセキュリティ > バックアップの作成 > システム修復ディスクの作成

**Note**
CD / DVDメディア以外は書込み先として選択できない。

# システムイメージ

コントロールパネル > システムとセキュリティ > バックアップの作成 > システムイメージの作成

# システムイメージからの復元

コントロールパネル > システムとセキュリティ > バックアップの作成 > システム設定またはコンピュータの回復 > 高度な回復方法 > 以前に作成したシステムイメージを使用してコンピュータを回復する > スキップ > 再起動
レイヤーでフィルタリングできるSceneビューを作る

<img width="1322" alt="スクリーンショット 2015-10-28 午後6.58.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/5973/05337c71-805f-0af4-2d95-c81e65e5fdb2.png">

``` LayerBaseSceneView.cs
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Reflection;
using InternalEditorUtility = UnityEditorInternal.InternalEditorUtility;

public class LayerBaseSceneView : SceneView
{
	[MenuItem("Window/LayerBaseSceneView")]
	public static void Open ()
	{
		ScriptableObject.CreateInstance<LayerBaseSceneView> ().Show ();
	}

	private const int _AllLayerMask = 0xFFFF;
	private MethodInfo _internalOnGUI;
	private int _currentLayerMask;
	private int _selectedLayerMaskIndexies = 0xFFFF;

	public override void OnEnable ()
	{
		base.OnEnable ();
		// SceneView.OnGUIを取得する
		var type = typeof(SceneView);
		_internalOnGUI = type.GetMethod ("OnGUI", BindingFlags.Instance | BindingFlags.NonPublic);
	}

	///
	public virtual void OnGUI ()
	{
		if (_internalOnGUI != null) {
			int visibleLayers = Tools.visibleLayers;
			// SceneViewに映るレイヤーを制限してから
			Tools.visibleLayers = _currentLayerMask;
			// 標準のSceneView.OnGUIを描く
			_internalOnGUI.Invoke (this, null);
			// レイヤーの制限を戻す
			Tools.visibleLayers = visibleLayers;
		}
		// ウィンドウの下の方に、LayerMaskを描く
		Rect pos = position;
		Rect maskRect = new Rect (){ width = pos.width - 20f, height = 20f, x = 0f, y = pos.height - 20f };
		string[] layers = InternalEditorUtility.layers;
		EditorGUI.DrawRect (new Rect (maskRect) {width = pos.width}, Color.black);
		int currentMaskIndexies = EditorGUI.MaskField (maskRect, "Visible Layer", _selectedLayerMaskIndexies, layers);
		if (currentMaskIndexies != _selectedLayerMaskIndexies) {
			_selectedLayerMaskIndexies = currentMaskIndexies;
			_currentLayerMask = 0;
			for (var i = 0; i < layers.Length; ++i) {
				int layerNumber = _selectedLayerMaskIndexies & (1 << i);
				if (layerNumber == 0) {
					continue;
				}
				int mask = LayerMask.NameToLayer (layers [i]);
				_currentLayerMask |= (1 << mask);
			}
		}
	}
}
```
ScalaでExcelを操作する　コピーした行を挿入する編


ExcelのUI操作だと行を右クリックでコピーして挿入とかする訳ですが、それと同じことをScalaでやる方法です。

「コピーした行を挿入」みたいな便利メソッドはないので（もしくは、見つけられなかった）、以下の手順を踏みます。

* コピー元の行を取得
* ワークシートに新しい行を追加
* 行を追加する位置以降の行を追加行分ずらす
* 追加した行の各セルに、コピー元セルの
	* スタイルをコピー
	* セル値をコピー
	* マージ状態をコピー


# 準備
* POIの導入と基本的な読み書きについては[こちら](http://qiita.com/modal_soul/items/83074d5ef768a8edb3c9)を参照

# コピー元の行を取得
```scala
import java.io.{File, FileOutputStream}

import org.apache.poi.ss.usermodel._
import org.apache.poi.ss.util.CellRangeAddress

val workbook = WorkbookFactory.create(new File("/path/to/excel"))

val sheet = workbook.getSheetAt(0)

val originalRow = sheet.getRow(0)
```

# 新しい行を追加
シート末尾に1行追加します。

```scala
val lastRowNum = sheet.getLastRowNum

sheet.createRow(lastRowNum + 1)
```

# 行を追加する位置以降の行を下にずらす
行を追加したい位置を`startRowNumber`とすると、そこから下の全行を１行下にずらします。

```scala
val startRowNumber = 5

sheet.shiftRows(startRowNumber, lastRowNum + 1, 1)

```


# 追加した行のスタイル・セル値を設定
今回はスタイルとタイプ、値のみコピーしていますが、他にもセルのコメントなども必要ならば同じようにコピー＆設定します。

```scala
  val newRow = sheet.getRow(startRowNumber)

  for{
  	index <- 0 until originalRow.getLastCellNum
  } {
  	val originalCell = originalRow.getCell(index)
  	val newCell = newRow.createCell(index)

  	// セルのスタイルのコピー
  	val newCellStyle = workbook.createCellStyle
  	newCellStyle.cloneStyleFrom(originalCell.getCellStyle)
  	newCell.setCellStyle(newCellStyle)
  	// セルタイプのコピー
  	newCell.setCellType(originalCell.getCellType)
  	// セル値のコピー
  	originalCell.getCellType match {
      case Cell.CELL_TYPE_BLANK =>
        newCell.setCellValue(originalCell.getStringCellValue)
      case Cell.CELL_TYPE_BOOLEAN =>
        newCell.setCellValue(originalCell.getBooleanCellValue)
      case Cell.CELL_TYPE_ERROR =>
        newCell.setCellErrorValue(originalCell.getErrorCellValue)
      case Cell.CELL_TYPE_FORMULA =>
        newCell.setCellFormula(originalCell.getCellFormula)
      case Cell.CELL_TYPE_NUMERIC =>
        newCell.setCellValue(originalCell.getNumericCellValue)
      case Cell.CELL_TYPE_STRING =>
        newCell.setCellValue(originalCell.getStringCellValue)
  	}

  }
```

# 追加した行にマージ状態を設定
```scala
val newRow = sheet.getRow(startRowNumber)
for{
	index <- 0 until originalRow.getLastCellNum
} {
// 略
  for {
    index <- 0 until sheet.getNumMergedRegions
    cellRangeAddress <- Option(sheet.getMergedRegion(index)) if cellRangeAddress.getFirstRow == originalRow.getRowNum
  } {
    sheet.addMergedRegion(new CellRangeAddress(
      newRow.getRowNum,
      newRow.getRowNum + (cellRangeAddress.getLastRow - cellRangeAddress.getFirstRow),
      cellRangeAddress.getFirstColumn,
      cellRangeAddress.getLastColumn
    ))
  }
  
  // ファイルに書き出す
  val out = new FileOutputStream("/path/to/output")
  workbook.write(out)
  out.close
}
```

以上で、行を追加したい位置にコピー元と同じ行が追加されていると思います。
これをちょっとアレンジすれば複数行のコピーもいけます。
WindowsAzure ApiAppsにカスタムドメインを設定するリンクがわかりづらい

場所がわかりづらいのでメモ。
ApiAppのブレードを開いて出てきた要点の中のAPI app hostの青色リンクをクリック。（セキュリティのためリンクはペイントで消してあります）

![WebApiCustomDomain.png](https://qiita-image-store.s3.amazonaws.com/0/96483/87dd9452-8c39-1d8e-20f1-21f4694d5e61.png)

出てきた設定のブレードのカスタムドメインをクリック

![WebApiCustomDomain1.png](https://qiita-image-store.s3.amazonaws.com/0/96483/468d155e-0fe1-0b33-56a8-0988fbfe974d.png)

あとは説明を見ながらでおけー。
https://azure.microsoft.com/ja-jp/documentation/articles/web-sites-custom-domain-name/

これでいけます。
備忘録: Python OrderedDict の先頭と最後のアイテムを非破壊的に取得する

たまに欲しくなる OrderedDict の先頭か最後のアイテム (ただし非破壊的に)。
順番覚えてるくせにインデクシングできないって何なん?的な。

#先頭のアイテム
```Python:
>> from collections import OrderedDict

>> od = OrderedDict(((1, 'a'), (2, 'b'), (3, 'c')))

>> od
OrderedDict([(1, 'a'), (2, 'b'), (3, 'c')])

>> next(iter(od))
1

>> next(iter(od.values()))
'a'

>> next(iter(od.items()))
(1, 'a')
```

#最後のアイテム
```Python:
>> next(reversed(od))
3
```
以下略。

ソースは stackoverflow のどこかわすれました。
enum の rawValue のデフォルト値

swift の enum で rawValue を String にした場合、

```
enum MyEnum : String {
    case Apple
    case Orange
    case Banana
}
```

と書いたら「それぞれに値を設定しなさい」とエラーになるのですが、ただ、文字列自体はユニークでさえあれば良いという場合に、名前がそのまま値にすることができたらありがたいと思います。例えば省略時はそのまま

```
enum MyEnum : String {
    case Apple = "Apple"
    case Orange = "Orange"
    case Banana = "Banana"
}
```

と同じ意味だと解釈してくれると楽なんですけど。
ZXingライブラリでAndroid上でQRコードを作成する

外部のQRコード生成APIに頼らずアプリ内でQRコードを作成したかったので、ZXingライブラリを使ってやってみました。

## 準備

build.gradle の`dependencies`に以下の記述を追加します。

```groovy
dependencies {
    ...
    compile 'com.google.zxing:core:3.2.1' // これを追加
}
```

## QRコードのBitmap作成メソッド

ZXingはAndroidに限らないJava向けの汎用ライブラリなので、Android固有のBitmap等へ変換する箇所は自分で実装する必要があります。
といっても、QRコードの黒く塗るべきドットとそうでないドットはZXingが教えてくれるので、それを使ってBitmapを生成するのは簡単です。

```java
public static Bitmap generateQR(String qrText, int size = 500) throws WriterException {

    // QRコードのビットマトリクスを作成
    QRCode qrCode = Encoder.encode(qrText, ErrorCorrectionLevel.H);
    ByteMatrix byteMatrix = qrCode.getMatrix();

    // QRコードのサイズのBitmapを作成
    Bitmap bitmap = Bitmap.createBitmap(byteMatrix.getWidth(), byteMatrix.getHeight(), Bitmap.Config.ARGB_8888);

    // 各ピクセルを黒か白で埋める
    for (int y = 0; y < byteMatrix.getHeight(); ++y) {
        for (int x = 0; x < byteMatrix.getWidth(); ++x) {
            byte val = byteMatrix.get(x, y);
            bitmap.setPixel(x, y, val == 1 ? Color.BLACK : Color.WHITE);
        }
    }

    // 必要な大きさに拡大する
    bitmap = Bitmap.createScaledBitmap(bitmap, size, size, false);

    return bitmap;
}
```

## 補足

`Encoder.encode()`の第二引数はエラー訂正レベルです。`ErrorCorrectionLevel.H`が最も高く、`ErrorCorrectionLevel.Q`,`ErrorCorrectionLevel.M`,`ErrorCorrectionLevel.L`となるにつれて低くなります。
エラー訂正レベルが高いほうが、汚れ等でコードの一部が見えなくなっても正しく読み取れるようになりますが、その分データ量（画像サイズ）が大きくなります。

`bitmap.setPixel()`の部分で実際の色を決めます。違う色にしたい場合は`Color.RED`などに変更することも可能です。
sublime text2 > ファイルをUTF-8からShift_JISに変換 > .hファイルは文字化けする > 秀丸:別ファイル名でShift_JISに変換 / ST2:Save Asで元のファイルに保存

```txt:動作確認
Sublime Text2 + ConvertToUTF8
```

##はまった

UTF-8で保存してしまったファイルをShift_JISに変換しようとしてはまっている。

変換は秀丸でファイル保存時にエンコーディング変換をしている。

1. .cppファイル : 変換可能
2. .hファイル : 変換してもASCIIとなり失敗

.hファイルを別の名前の.hファイルにすると Sublime Text2 で開いた時にShift_JISとなるが、元の.hファイルの名前ではASCIIとなる。

Sublime Text2がファイル名に対応するEncoding情報を保持してしまっているのだろうか？


## try1 

以下の解決策を思いついた。

1. 秀丸にて元とは違う.hファイル名で保存 (例: xxx.h)
2. xxx.hファイルをSublime Text2で開く -> 文字化けしない
3. Sublime Text2のSave As...にて元の.hファイル名で保存

別の名前のファイル名では文字化けしない点を利用。


## try2
上記の方法でも文字化けが解消しない時があった。

以下の対応で解決した。
1. 秀丸にて元とは違う.hファイル名で保存 (例: xxx.h)
2. xxx.hファイルをSublime Text2で開く -> 文字化けしない
3. 元ファイルをSublime Text2で開く
4. 2で開いたファイルの内容をコピーして(ctrl+C)、3で開いたファイル内に上書き(Ctrl+V)して、ファイル保存する。

## try 3
try2でうまくいかない場合、try2の方法の中で以下もやってみる。

[File]-[Set File Encoding to]-[Japanese (Shift_JIS)]

## try 4
(追記 2016/02/22)

秀丸を使わなくてもSublime Textで

[File]-[Set File Encoding to]-[Japanese (Shift_JIS)]

をしてSaveするだけでも変更できる場合がある（失敗する場合もある)。

ソースをgitで管理している場合は、とりえあずこれをやってみて、失敗した時には変更を破棄して上記のいずれかを試す、というのがよさそう。
WebGL学習記録(3) シェーダの生成とVBO


参考[webglorg](http://wgld.org/);
原則として上記ページを見ながら学習した記録です。


##大まかな流れ
* HTMLからcanvasエレメントを取得
* canvasからWebGLコンテキストの取得
* シェーダのコンパイル
* モデルデータを用意
* 頂点バッファの生成と通知
* 座標変換行列の生成と通知
* 描写命令発行
* canvasを更新してレンダリング

##ソースをコンパイルしてシェーダを生成する一連の流れ
```javascript
function create_shader(id){
    // シェーダを格納する変数
    var shader;
    
    // HTMLからscriptタグへの参照を取得
    var scriptElement = document.getElementById(id);
    
    // scriptタグが存在しない場合は抜ける
    if(!scriptElement){return;}
    
    // scriptタグのtype属性をチェック
    switch(scriptElement.type){
        
        // 頂点シェーダの場合
        case 'x-shader/x-vertex':
            shader = gl.createShader(gl.VERTEX_SHADER);
            break;
            
        // フラグメントシェーダの場合
        case 'x-shader/x-fragment':
            shader = gl.createShader(gl.FRAGMENT_SHADER);
            break;
        default :
            return;
    }
    
    // 生成されたシェーダにソースを割り当てる
    gl.shaderSource(shader, scriptElement.text);
    
    // シェーダをコンパイルする
    gl.compileShader(shader);
    
    // シェーダが正しくコンパイルされたかチェック
    if(gl.getShaderParameter(shader, gl.COMPILE_STATUS)){
        
        // 成功していたらシェーダを返して終了
        return shader;
    }else{
        
        // 失敗していたらエラーログをアラートする
        alert(gl.getShaderInfoLog(shader));
    }
}

```

##プログラムオムジェクトの生成とリンク
シェーダを生成できたら次はプログラムオブジェクトを生成する。

頂点シェーダからフラグメントシェーダへデータを渡すために、 varying 修飾子付きの変数を使うことができるが、このシェーダからシェーダへのデータの橋渡しを実現してくれるのが、プログラムオブジェクト。

プログラムオブジェクトは、頂点シェーダとフラグメントシェーダ、また WebGL プログラムと各シェーダとのデータのやり取りを管理してくれる重要なオブジェクト。

```javascript
function create_program(vs, fs){
    // プログラムオブジェクトの生成
    var program = gl.createProgram();
    
    // プログラムオブジェクトにシェーダを割り当てる
    gl.attachShader(program, vs);
    gl.attachShader(program, fs);
    
    // シェーダをリンク
    gl.linkProgram(program);
    
    // シェーダのリンクが正しく行なわれたかチェック
    if(gl.getProgramParameter(program, gl.LINK_STATUS)){
    
        // 成功していたらプログラムオブジェクトを有効にする
        gl.useProgram(program);
        
        // プログラムオブジェクトを返して終了
        return program;
    }else{
        
        // 失敗していたらエラーログをアラートする
        alert(gl.getProgramInfoLog(program));
    }
}
```



  
  

##モデルデータと頂点属性

###頂点属性とは
頂点属性とは、頂点が持つ様々な要素のこと。
WebGL の場合は最低限、頂点が位置情報という属性を持っている必要がある。

###頂点属性とVBO
VBO を生成するためには、まず先に頂点の個数に応じた配列を用意する。
例えば三つの頂点からなる一枚のポリゴンを定義するときは・・・

```javascript
var vertex_position = [
    // X,   Y,   Z
     0.0, 1.0, 0.0,
     1.0, 0.0, 0.0,
    -1.0, 0.0, 0.0
];
```

##VBOの生成
createBufferを使う。
バッファを操作するためには、バッファをWebGLにバインドする必要がある。

```javascript
function create_vbo(data){
    // バッファオブジェクトの生成
    var vbo = gl.createBuffer();
    
    // バッファをバインドする
    gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
    
    // バッファにデータをセット
    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(data), gl.STATIC_DRAW);
    
    // バッファのバインドを無効化
    gl.bindBuffer(gl.ARRAY_BUFFER, null);
    
    // 生成した VBO を返して終了
    return vbo;
}
```
WebGL学習記録(2) GLSLについて


参考[webglorg](http://wgld.org/);
原則として上記ページを見ながら学習した記録です。


#GLSLについて知る
GLSL は OpenGL との親和性を持つシェーダ記述言語で、C 言語ライクな独自の文法によって記述する。

##シェーダの役割
頂点シェーダには、頂点に関する情報の全てを渡すことができる。頂点の位置情報や、頂点が持つ法線、テクスチャ座標、頂点の色など、頂点に関する情報の全てをシェーダに渡すことが可能。

ちなみに頂点の座標は必須。


フラグメントシェーダは画面にどんな色を出力すればいいのかを決めることができる。


##GLSL基礎
必ずmain関数を定義し、その中に処理を記述する。
また、頂点シェーダーではgl_Positionという組み込み変数に頂点データを渡さねばならない。

```javascript
attribute vec3 position;

void main(void) {
    gl_Position = position;
}
```


##attribute装飾子
attribute という修飾子を付けて宣言された変数(上記の場合なら position)が、頂点の情報をシェーダ側で受け取る変数になる。
attribute 修飾子は、頂点ごとに異なるデータを受け取るためのもの。
たくさん存在する頂点は、それぞれ位置情報などが異なっている。そういった頂点ごとに異なるデータを受け取るための仕組みが attribute 修飾子付き変数である。


##座標変換もGLSL
uniform 修飾子を使うと、全ての頂点に対して一律に処理される情報を渡すことが可能になる。

```GLSL
attribute vec3 position;
uniform mat4 mvpMatrix;

void main(void) {
	gl_Position = mvpMatrix * position;
}
```

ここで出てきている mvpMatrix というのは、モデル・ビュー・プロジェクションのそれぞれの変換行列を掛け合わせた座標変換行列。
その座標変換行列を uniform 修飾子付きの変数に WebGL 側から渡してあげる。

##フラグメントシェーダーとの連携
頂点シェーダーとフラグメントシェーダーの橋渡しをする装飾子がvarying 装飾子。

```GLSL
attribute vec4 position;
attribute vec4 color;
uniform mat4 mvpMatrix;
varying vec4 vColor;

void main(void) {
	vColor = color;
	gl_Position = mvpMatrix * position;
}
```



```GLSL
varying vec4 vColor;
void main(void) {
	gl_FragColor = vColor;
}
```


このように、頂点シェーダからフラグメントシェーダにデータを渡したい場合には varying 修飾子付きの変数を使い、そしてgl_FragColor にデータを代入する。

##頂点バッファ
###ローカル座標
頂点の位置情報は必ず持っていなければならないもの。

頂点は、最終的に画面上に描画される際には、モデル座標変換やビュー座標変換、プロジェクション座標変換などを経て描画されることになる。

頂点群がどのように配置されているのかを表した座標を、一般にローカル座標と呼ぶ。


###格納するもの
頂点情報を格納する入れ物が頂点バッファ。
OpenGLではVBO(vertex buffer object)と呼ぶ。

###頂点バッファは一つというわけではない。
頂点バッファには頂点に関するあらゆる情報を格納できる。
法線、色、テクスチャ座標、頂点の重さ、などなど。
つまり個別にVBOがいるということ。


###頂点バッファと attribute
attribute 変数にデータを渡す役割を担うのが VBO。

まずは VBO に頂点データを格納しておき、どのVBOが、どのattribute変数に関連付けられてるのかをシェーダに通知する。

時系列順に並べると

* 頂点の各条をいったん配列に格納
* WebGLのメソッドを使ってVBOを作成
* WebGLのメソッドを使いVBOに配列のデータを転送
* 頂点シェーダ内のattribute変数とVBOを紐付ける
Swiftで編集を完了するボタンをキーボードに実装したい


今回はiPhoneでキーボードを使って入力してる際に、入力を終了するボタンの実装について話していきたいと思います。

# UIButtonを使ってボタンを作成
キーボードに完了ボタンを実装するためのUIViewを追加し、そこに編集を完了するボタンをUIButtonで作成し、追加していきます。

```swift
//ボタンを追加するためのViewを生成します。
let myKeyboard = UIView(frame: CGRectMake(0, 0, 320, 40))
myKeyboard.backgroundColor = UIColor.lightGrayColor()

//完了ボタンの生成
let myButton = UIButton(frame: CGRectMake(300, 5, 70, 30))
myButton.backgroundColor = UIColor.darkGrayColor()
myButton.setTitle("完了", forState: .Normal)
myButton.layer.cornerRadius = 2.0
myButton.addTarget(self, action: "onClickMyButton:", forControlEvents: .TouchUpInside)

//Viewに完了ボタンを追加する。 
myKeyboard.addSubview(myButton)
 
```

このmyKeyboardをTextFieldのフィールドに設定すれば完了ボタンは表示されますが、まだボタンを押しても何も起こりません。
次の項目ではボタンを押した際に呼び出される編集を完了するメソッドについて説明していきます。

#編集を完了するメソッドの実装

次に完了ボタンを押した時と改行を押した時にキーボードを下げるメソッドを実装します。

```swift
//ボタンを押すとキーボードが下がるメソッド
func onClickMyButton (sender: UIButton) {
        self.view.endEditing(true)
    }
//改行押すとキーボードが下がるメソッド
func textFieldReturn(textField: UITextField) -> Bool {
        self.view.endEditing(true)
        return false
    }
```
**self.view.endEditing(true)** で編集を完了できます。

#例えば

次にこの具体的な実装の仕方を例を用いてやっていきます。

```swift
//TextFieldを生成
myTextField = UITextField(frame: CGRectMake(self.view.frame.width/2, self.view.frame.height/2, 100, 50))
myTextField.backgroundColor = UIColor.grayColor()
      
//ボタンを追加するためのViewを生成します。
let myKeyboard = UIView(frame: CGRectMake(0, 0, 320, 40))
myKeyboard.backgroundColor = UIColor.lightGrayColor()

//完了ボタンの生成
let myButton = UIButton(frame: CGRectMake(300, 5, 70, 30))
myButton.backgroundColor = UIColor.darkGrayColor()
myButton.setTitle("完了", forState: .Normal)
myButton.layer.cornerRadius = 2.0
myButton.addTarget(self, action: "onClickMyButton:", forControlEvents: .TouchUpInside)

//Viewに完了ボタンを追加する。 
myKeyboard.addSubview(myButton)
       
//ViewをFieldに設定する
myTextField.inputAccessoryView = myKeyboard
myTextField.delegate = self
        
//myTextFieldを追加する 
self.view.addSubview(myTextField)
```

```swift
//ボタンを押すとキーボードが下がるメソッド
func onClickMyButton (sender: UIButton) {
        self.view.endEditing(true)
    }
//改行押すとキーボードが下がるメソッド
func textFieldShouldReturn(textField: UITextField) -> Bool {
        self.view.endEditing(true)
        return false
    }
```

ここでは
**ボタンを表示させたいTextField.inputAccessoryView = ボタンを追加したView**
でキーボードに完了ボタンを実装しています。これを使えば完了ボタンだけでなく様々な機能をキーボードに追加できるので覚えておきましょう。
今回はキーボードに完了ボタンを実装しましたが、他にも様々なカスタマイズができるので皆さんも試してみてください。
eccube 改修メモ


ecccubeの改修対応でのメモです

#eccubeで修正するファイルの置き場

###見た目を直したい＞

テンプレートファイルを修正します

置き場）
　{eccubeTOP}/data/template/default/


###データの流れをいじりたい＞

classファイルを修正します

置き場）
　{eccubeTOP}/data/class_extends/


###参考
http://www.eccube-school.jp/files.html

###メモ＞

逆に言うと、上記以外のファイルを修正することはあまりないです（後述）


#classファイルの修正

eccubeではsmartyの仕組みを利用しており、コアファイルと言われる修正すべきではないファイル群があります。

classファイルを修正したい！となったとき、
WebGl学習記録(1) WebGLのセットアップ


参考[webglorg](http://wgld.org/);
原則として上記ページを見ながら学習した記録です。

##canvas
WebGLももちろんCanvasないで描写されます。
WebGL を扱うためのコンテキストはwebglコンテキスト。
コンテキストとは要するに、描画処理を行なうための API を実装したオブジェクトのこと。

##3D描写の基礎
###座標系
WebGL、つまり、OpenGLは右手座標系。


###座標変換
結果的にディスプレイに表示するということは、2Dに変換せねばならないということ。
その際に座標変換が必要。
座標変換は三つあり

* モデル変換
* ビュー変換
* プロジェクション変換

がある。

モデル変換とは、被写体となる物体が三次元空間のどの位置にあるのかを定義するための座標変換。原点からモデルが相対的にどの位置にあるのか。

ビュー変換では、実際にカメラがどの位置にあるのか、そしてカメラはどこを向いているのかなどを定義する。

プロジェクション変換では、いわゆる遠近法の効果が得られる。三次元空間のどの領域を撮影するのかなどを定義する。幅広くパノラマとして撮影するのか、あるいは縦長の映像として撮影するのか、どのくらい遠くまでを撮影するのか。

##レンダリング

###シェーダ
固定機能パイプラインという、座標変換などを一度にやってくれる便利な機能がないので、ここら辺は全部自前で記述せねばならない。
そこでシェーダーを使う。
シェーダーには

* 頂点シェーダ
* フラグメントシェーダ

の2種類が存在する。
WebGL、シェーダなんかを記述するためのHTMLテンプレートは以下の通り。


```html
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=windows-1252">

        
        <title>WebGL TEST</title>
        <!-- 行列計算のライブラリ -->
        <script src="minMatrix.js" type="text/javascript"></script>
        <!-- WebGL各種処理のjsファイル -->
        <script src="script.js" type="text/javascript"></script>

        <script id="vs" type="x-shader/x-vertex">
        頂点シェーダー
		</script>
		
		<script id="fs" type="x-shader/x-fragment">
		フラグメントシェーダー
		</script>

    </head>
    <body>
        <canvas id="canvas" width="300" height="300"></canvas>
    </body>
</html>
```

シェーダのソースは単なる文字列でしかないので、javascript の内部で文字列として記述しておきそれを利用する。

##行列（マトリックス）
3D描写において、行列による計算は非常に効率の良いもの。ゆえに必須知識。
3Dプログラミングでは4*4の行列を用いるのが一般的。

###行列計算によって何ができるのか
描画したい 3D モデルの位置や、拡大縮小の有無、そして回転しているかどうかなどを一つの行列で定義できる。


##頂点とポリゴン
WebGLの世界で基本的に

* 点
* 線分
* 三角形

しか描写できません。


###頂点を結ぶ順序とカリング
3Dの世界なので、当然のことながらアングルによっては見えない部分も存在する。そう言った部分を描写するのは無駄なので、見えない部分を描写しない仕組みというのがカリング。

このカリングの設定している場合、頂点を結ぶ順序を間違えると、あるはずなのに描写されなかったりするので、この描写順は結構重要。


##コンテキストの初期化
テンプレートの通り、script.jsというファイルを用意して今回は初期化をしていく。


```javascript

// canvas要素の取得
var c = document.getElementById('canvas');

// canvasサイズ
c.width = 500;
c.height = 300;

```

続いて、getContextメソッドでwebglコンテキストを取得。

```javascript
var gl = c.getContext('webgl') || c.getContext('experimental-webgl');
```

###画面の初期化
クリアメソッドで画面をまっさらな状態にする。

```javascript
gl.clear(gl.COLOR_BUFFER_BIT);
```
色をクリアするだけなので、COLOR＿BUFFER＿BITのみを指定。

```javascript
gl.clearColor(0.0, 0.0, 0.0, 1.0);
```
続いてクリアするときの色を指定。

これらをonloadにそのまま全ての処理を関数として渡す。

```GLSL
onload = function(){
    // canvasエレメントを取得
    var c = document.getElementById('canvas');
    c.width = 500;
    c.height = 300;

    // webglコンテキストを取得
    var gl = c.getContext('webgl') || c.getContext('experimental-webgl');
    
    // canvasを黒でクリア(初期化)する
    gl.clearColor(0.0, 0.0, 0.0, 1.0);
    gl.clear(gl.COLOR_BUFFER_BIT);
};
```
これで真っ黒な画面が出る。

![Screen Shot 2015-10-28 at 15.37.04.png](https://qiita-image-store.s3.amazonaws.com/0/54225/73858e89-d487-4350-2783-3d6ede87b733.png "Screen Shot 2015-10-28 at 15.37.04.png")

これでWebGLを使い始める準備は完了。
Railsでerrbitにカスタムエラーの通知


## 動機

エラーが起きただけでなく、任意の箇所や、自前の情報を与えてエラー情報を[errbit](https://github.com/errbit/errbit)に通知したい.

## 方法

`Airbrake.notify(exception, opts = {})`メソッドを呼ぶ.
第二引数にrequest.env['action_controller.instance'].airbrake_request_dataを指定するとrackからcallする情報と同様の情報を送信可能.

```ruby:my_controller.rb

def action_in_my_controller
  begin
    MyException.new('An error occured')
  rescue MyException => e
    Airbrake.notify(e, request.env['action_controller.instance'].airbrake_request_data)
  end
end

```

適当に実装すると上のように書ける.


## 問題1

requestメソッドを使用するので、controller内でないと利用できないのがネック.

モデルや別のレイヤーからrequestを参照する方法は以下の記事が参考になった.

http://qiita.com/ainame/items/823b396d560d82194d48

## 問題2

request.env['action_controller.instance'] がnilじゃないことを確認すること.
以下のようなメソッドを用意しておくと良い.

```ruby

def airbrake_request(env)
  if env['action_controller.instance'].respond_to?(:airbrake_request_data)
    env['action_controller.instance'].airbrake_request_data
  else
    { rack_env: env }
  end
end
```