OmniAICreator/Qiita-1.07M huggingface dataset:
CSV編集パッケージ「Tablr」がマルチバイト対応されたため宣伝


今朝気付いたのだが、CSVをMS Excelのようなテーブルエディタで編集することができるパッケージ「[Tablr](https://atom.io/packages/tablr)」がついにマルチバイト対応されたようだ。
私の環境ではMS Excelから出力されたShift-JISなCSVや、過去の遺産から出力されたEUC-JPなCSVが飛び交うため、非常に嬉しくなってしまい記事を書くことにした。

## 動作サンプル

例として郵便局が配布している[郵便番号データ](http://www.post.japanpost.jp/zipcode/download.html)を用いる。
拡張子が大文字(.CSV)だとAtomがCSVと認識してくれなかったため、小文字(.csv)に直す必要がある。

CSVを読み込むとTablrの設定画面が表示される。
郵便番号データはShift-JISのため、プレビュー表示で文字化けしていることが確認できる。

![初期表示](https://bytebucket.org/from_kyushu/qiita_posts/raw/1aa9460bb4cc889fe551ccc236a2f96adde6e5b9/images/tablr_multilang/open_first.jpg)

画面右側の"Encoding"を選択し、"Japanese (Shift JIS)"を選択する。
(Atomにとって)比較的大きいファイルサイズのCSVを読んでいるからか、リストの文字が表示されるのにやや時間がかかった。リストを開いたら真っ白だったという場合も慌てずしばらく待ってみて欲しい。

![文字コード選択リスト](https://bytebucket.org/from_kyushu/qiita_posts/raw/1aa9460bb4cc889fe551ccc236a2f96adde6e5b9/images/tablr_multilang/select_encoding.jpg)

正しい文字コードを選択すると、プレビュー欄が更新されて正しいデータが表示される。
その後他の設定項目を適時設定し、"Open Table Editor"をクリックして編集画面に移動する。

![文字コード選択後のプレビュー表示](https://bytebucket.org/from_kyushu/qiita_posts/raw/1aa9460bb4cc889fe551ccc236a2f96adde6e5b9/images/tablr_multilang/preview.jpg)

表示だけでなく、入力や更新後の再読み込みでも文字化けすることなく扱うことが出来た。

!["Open Table Editor"選択後](https://bytebucket.org/from_kyushu/qiita_posts/raw/1aa9460bb4cc889fe551ccc236a2f96adde6e5b9/images/tablr_multilang/editor.jpg)

これでどのようなCSVが来てもAtom一本で対応できる。
少量のデータであれば通常のテキストエディタでも充分編集可能だが、これが百件超のデータ量となるとかなり作業しづらい状況となる。
その度にMS Excel等開くのは非効率なので、AtomだけでスムーズにCSVが編集できるのは非常に嬉しい限りである。

## 注意事項

### CSVの新規作成

Tablrは編集専用であり、新規作成には対応していない。
もし新規に作る場合は一度"Open Text Editor"からテキストエディタを開き、ヘッダーだけ手動入力してから"Open Table Editor"を選択するようにしてほしい。

### 文字コードの判別

残念ながら文字コードの自動判別機能は実装されていない。
デフォルトはUTF-8で読もうとするので、もしCSVの文字コードが分からなければ別途確認するか、"Encoding"リストから総当りで確認する必要がある。
Macで覚えておくと便利なショートカットキー


| 操作 | 概要 |
|:-----------|:-----------|
| Control + F1 | フルキーボードアクセスをオンオフ |
| Control + F3 | Dockを操作 |
| Control + F2 | メニューバーを操作 |
| Control + F8 | メニューエクストラを操作 |
| Control + F4 | ウインドウを順に前面に |
| Control + F6 | フローティングウインドウを前面に |
| Control + F5 | ツールバーを操作 |
|Control + shift + power|スクリーンロック|

## 参考
http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-operate-dock-and-menu-with-keyboard-short-cuts-in-macos.html
pymolrcの設定

pymolrc

#Windows
windowsの場合、
C:\User\username\
に以下のファイルを置けばよい。

```pymolrc.pml
#pymolrc for windows

set h_bond_cutoff_center, 3.5
set h_bond_max_angle, 30
```

pymolを起動したときに、自動的にこのスクリプトが読み込まれ、実行される。

#Linux（Mac）

linuxの場合も、homeに

~/.pymolrc

を置けばよい。
ActiveRecordのActiveRecord::PendingMigrationErrorを無視する

Railsは未適用のマイグレーションを見つけると `ActiveRecord::PendingMigrationError`を投げる。
基本的に便利なんだけど、たまーにこのチェック機構を無効化したいことがあるのでメモしておく。

## 未適用のマイグレーションのチェック機構を無効化する

[Configuring Rails Applications](http://guides.rubyonrails.org/configuring.html)には載っていないけれど、次の方法で無視できる。

```rb:config/environments/development.rb
config.active_record.migration_error = false
```

## ソース

`ActiveRecord::Migration::CheckPending` のコメントに設定方法がある。

```rb:4-2-stable/activerecord/lib/active_record/migration.rb
    # This class is used to verify that all migrations have been run before
    # loading a web page if config.active_record.migration_error is set to :page_load
    class CheckPending
      def initialize(app)
        @app = app
        @last_check = 0
      end

      def call(env)
        if connection.supports_migrations?
          mtime = ActiveRecord::Migrator.last_migration.mtime.to_i
          if @last_check < mtime
            ActiveRecord::Migration.check_pending!(connection)
            @last_check = mtime
          end
        end
        @app.call(env)
      end

      private

      def connection
        ActiveRecord::Base.connection
      end
    end
```

初期化はこんな感じ

```rb:4-2-stable/activerecord/lib/active_record/railtie.rb
    initializer "active_record.migration_error" do
      if config.active_record.delete(:migration_error) == :page_load
        config.app_middleware.insert_after "::ActionDispatch::Callbacks",
          "ActiveRecord::Migration::CheckPending"
      end
    end
```


## 蛇足：スマートじゃない方法

最初はこんなコードを使ってた。

```rb:config/initializers/skip_activerecord_migration_check_pending.rb
Rails.application.config.middleware.delete 'ActiveRecord::Migration::CheckPending'
```
octopress deployがエラーになった

octopressを`rake deploy`でGitHubにデプロぃすると、下記のエラーが出ました：

```
$ rake deploy
...
## Copying public to _deploy
cp -r public/. _deploy
cd _deploy

## Committing: Site updated at 2016-01-04 02:14:08 UTC
[master 8faa983] Site updated at 2016-01-04 02:14:08 UTC
 7 files changed, 62 insertions(+), 2 deletions(-)

## Pushing generated _deploy website
To git@github.com:liubin/liubin.github.io.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:liubin/liubin.github.io.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

```

エラーメッセージから見ると、リモートブランチと一致していないみたいです。


まずはリモートと同期します。

```
$ cd _deploy/
$ git pull origin master
```

再び`rake deploy`を無事に成功しました。
Makefileにパラメータを渡す方法と条件文

小さいMakefileを書きました、新しい修得したスキールをメモにしました。

### Makefileにパラメータを渡す方法

```
$ make foo=bar target
```

こうして、Makefileに`${foo}`が使えるようにしました。

### Makefileにおける条件文

`foo`の値に応じて異なる処理する場合、条件文が使えます。

```
# Makefile抜粋

ifdef foo
  FN=${foo}
else
  FN=default
endif
```

`make foo=bar`の場合、`FN`が`bar`となって、`make`のみなら、`FN`が`default`になります。

`ifdef`以外にも、`ifndef`、`ifeq`など多数ありますので、[7. Makefileの条件文](http://quruli.ivory.ne.jp/document/make_3.79.1/make-jp_6.html)を参考してください。
イベントビューワの内容をコマンドで出力する

コマンドプロンプトから出力できたので忘れないようにメモ。

```lang:コマンドプロンプト
// システムログ出力
wevtutil export-log system C:\hoge.evtx
// アプリケーションログ出力
wevtutil export-log application C:\hoge2.evtx
```

検索条件とかも設定できるみたい。
https://technet.microsoft.com/ja-jp/library/cc732848(v=ws.10).aspx
引数の最後の引数が「裸のHash（Bare hash）」

```rb
content_tag :span, "Hello", id: "foo", class: "bar"
```

のように、ハッシュの要素を引数にいくつも並べて書ける理由をきちんと理解していなかった。

>Ruby は、メソッドの**最後の引数**がハッシュリテラルなら、ハッシュリテラルを囲む `{}` を省略できるようにしている。これは**裸のハッシュ（bare hash）**と呼ばれることがあり、別々の名前付き引数を渡しているような見かけになる。
>（「プログラミング言語 Ruby」を改変・強調して引用）

なるほど。

つまり

```rb
content_tag :span, "Hello", { id: "foo", class: "bar" }
```

のシンタックスシュガーである、ということ。

該当のソースコードはこうなっている。

```rb
def content_tag(name, content_or_options_with_block = nil, options = nil, escape = true, &block)
  if block_given?
    options = content_or_options_with_block if content_or_options_with_block.is_a?(Hash)
    content_tag_string(name, capture(&block), options, escape)
  else
    content_tag_string(name, content_or_options_with_block, options, escape)
  end
end
```

ついでに、 Symbol にはハイフンを含むことが出来ないので

```html
<div hidden-area="true"></div>
```

は

```rb
content_tag :div, "hello", "hidden-area": "true"
```

のように、キーを引用符で囲まないとシンタックスエラーになる。

なお、ハッシュの

```
key: value
```

表記は Ruby 1.9 から可能になったが、引用符 + ":" が可能になったのは 2.2 から。

したがって、1.9以上2.2未満のバージョンの場合は、

```rb
content_tag :div, "hello", :"hidden-area" => "true", class: "foo"
```

になる。「そこだけは旧表記」ということ。
WebdriverIO と Selenium で Node.js からスクレイピングできる環境をつくる。

昨今、[PhantomJS](http://phantomjs.org/) さえあれば何でもスクレイピングできるのか思ったら、そうでもない web サイトがあったりして、[Selenium](http://www.seleniumhq.org/) を試してみたので、OS X での手順をまとめておきます。


# Selenium 環境をつくる

## Selenium Standalone Server を導入

[Selenium Standalone Server](http://www.seleniumhq.org/download/) をダウンロードして適当なディレクトリに配置します。

```
cd ~/Developer/opt/selenium-server-standalone
curl -LO http://selenium-release.storage.googleapis.com/2.49/selenium-server-standalone-2.49.0.jar
```

今回は `~/Developer/opt/selenium-server-standalone` 以下に配置する事にします。

## WebDriver として ChromeDriver を導入

Selenium の標準 WebDriver は Firefox みたいですが、今回は Google Chrome を使いたいので [ChromeDriver](https://sites.google.com/a/chromium.org/chromedriver) もダウンロードして PATH が通ったディレクトリに配置します。

```
cd ~/Developer/opt/selenium-server-standalone
curl -LO http://chromedriver.storage.googleapis.com/2.20/chromedriver_mac32.zip && unzip -d . ./chromedriver_mac32.zip && rm ./chromedriver_mac32.zip
ln -s ~/Developer/bin/chromedriver ~/Developer/bin/chromedriver
```

今回は `~/Developer/opt/selenium-server-standalone` 以下に配置し、PATH の通った `~/Developer/bin/` 以下に `chromedriver` のシンボリックリングを配置します。


# Node.js で Selenium を使う環境をつくる

## WebdriverIO の導入

適当な作業ディレクトリを用意して [WebdriverIO](http://webdriver.io/) をインストールします。

```
npm install webdriverio
```


# Node.js でスクリプトを動かす

## WebdriverIO 用のスクリプト作成

WebdriverIO をインストールしたディレクトリ下で、次のテストスクリプトを作成します。

```js:test.js
'use strict';

var webdriverio = require('webdriverio');

var client = webdriverio
.remote({ desiredCapabilities: { browserName: 'chrome' } })
.init()
.url('https://www.google.com/');

client
.getTitle()
.then(function (title) {
  console.log(title);
})
.getHTML('body')
.then(function (data) {
  console.log(data);
})
.end();
```

## スクリプトの実行

まず Selenium Standalone Server を起動します。

```
cd ~/Developer/opt/selenium-server-standalone
java -jar ./selenium-server-standalone-2.49.0.jar
```

そして、先ほどのスクリプトを Node.js で実行します。

```
node ./test.js
```

あとは、[WebdriverIO - API Docs](http://webdriver.io/api.html) にある API に沿ってスクリプトを書けば、スクレイピングでも何でもできそうです。
Bullet をテスト環境で実行する

Webアプリケションのパフォーマンスに多く影響してしまう N+1 問題。
正直製品レベルのアプリケーションだと基本的にないのが当たり前だと思っていますが、うっかりミスで残っちゃったりするのも事実。
なので N+1 問題を教えてくれるgem、[Bullet](https://github.com/flyerhzm/bullet) を使っている人は多いと思います。

最近では Rails では API サーバのみを作り、フロントエンドは JS フレームワークやスマホアプリで実装というケースが増えてきました。
こういったプロジェクトでは Rails で画面をまったく作らないので、画面があること前提の開発支援系 gem を使えなくて困ったりします。
そこで bullet に関してはテスト環境で動作させるようにしました。

## bullet のテスト環境設定

とっても簡単です。

```rb:config/environments/test.rb
config.after_initialize do
  Bullet.enable = true
  Bullet.bullet_logger = true
  Bullet.raise = false # raise an error if n+1 query occurs
end
```

```rb:spec/spec_helper.rb
if Bullet.enable?
  config.before(:each) do
    Bullet.start_request
  end

  config.after(:each) do
    Bullet.perform_out_of_channel_notifications if Bullet.notification?
    Bullet.end_request
  end
end
```

これだけ。

## bullet の警告の確認

bullet を通常の画面の存在する Web アプリで実行した場合は、画面表示時に Javascript の alert ダイアログが表示されるという、非常に~~ウザい~~ 分かりやすい通知方法になっていると思います。
API サーバでは画面がないのでそういった確認方法は使えないので、代わりにログを吐く設定をテスト環境で行っています。
bullet のログは `log/bullet.log` に吐かれますので、テスト実行時に `tail` するなりしておくと良いかもしれません。
後述していますが、N+1 問題警告時にテストが落ちるように設定することもできます。

## 解説のようなもの。

公式の [bullet#Run-in-tests](https://github.com/flyerhzm/bullet#run-in-tests) に書いてる内容ほぼそのままです。
ただしあちらの内容だと `Bullet.raise = true` に設定されており、N+1 問題のあるクエリが実行されると軒並みテストが落ちるようになるので、若干鬼設定かなあと `false` に変えています。
より確実に bullet の警告に気づくようにしたいのであれば、公式と同じくここを `true` にしておくと良いです。

実際にはこの手のテストの設定は `rails_helper.rb` に書いてる人も多いでしょうから、こんな風になることの方が多いかもしれません。

```rb:spec/rails_helper.rb
  :
RSpec.configure do |config|
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.use_transactional_fixtures = false
  config.order = 'random'
  config.include FactoryGirl::Syntax::Methods
  :

  config.before(:each) do
    DatabaseCleaner.strategy = :transaction
    FactoryGirl.reload
    DatabaseCleaner.start
    # ↓ココ
    Bullet.start_request if Bullet.enable?
  end

  config.after(:each) do
    DatabaseCleaner.clean
    # ↓ココから
    if Bullet.enable?
      Bullet.perform_out_of_channel_notifications if Bullet.notification?
      Bullet.end_request
    end
    # ↑ココまで
  end
end
```

bullet 用に処理部分を追加する必要はないので、`config.before(:each)` や `config.after(:each)` の、DatabaseCleaner や DatabaseRewinder の呼び出しを行っているだろう当たりに適当に突っ込んでおけば動きます。 
と、Rspec 前提で書いてますが他のテスティングフレームワークだとどうなるのか良く分かりません。
公式に書かれているように Bullet の開始と終了処理を、個々の example 実行の前後で呼び出してあげると動くと思います。
Youtubeの360度動画用画像をPOV-Rayでレンダリングする

#結果
YoutubeにPOV-Rayでレンダリングした360度用の動画をアップロードしました。

[![POV-Rayでレンダリングした360度用動画](http://img.youtube.com/vi/5UBw4F81Op0/0.jpg)](http://www.youtube.com/watch?v=5UBw4F81Op0)
(画像をクリックでYoutubeの動画へジャンプします)

#使用環境
* Mac OS X 10.9.5
* POV-Ray 3.7
* Blender 2.76 ※記事中では触れません
* 360 Video Metadata Tool

#やり方
要約すると以下の手順で行いました。
1. POV-Rayシーンの既述&レンダリング
2. 動画を作成(今回はBlenderを利用)
3. 360 Metadata Toolで360度動画のメタデータ埋め込み
4. Youtubeへアップロード

## Pov-Rayでシーンの既述&レンダリング
任意のシーンを既述し、cameraの設定を以下のようにするだけです。

```pov
camera{
	spherical 
	angle 360 180
}
```

レンダリングする画像の解像度はYoutubeの推奨
> アスペクト比が 16:9 になるようにつなぎ合わせた動画を 4K（3840x2160）の解像度でアップロードすることをおすすめします。

にしたがって、3840x2160でレンダリングしました。

### 宣伝
MacのPov-Ray環境にはGUIがなかったのでSublime-text用のパッケージを作成しました。よろしければご利用ください。
[[POV-Ray][SublimeText2]SublimeText用POV-Rayパッケージを作成しました](http://www.cho-design-lab.com/2013/11/13/creatingpov-raypackage/)

## 動画を作成
お好きなソフトウェアで動画にしてください。解像度は上記のように4K（3840x2160）にします。このとき、[アップロードする動画の推奨エンコード設定](https://support.google.com/youtube/answer/1722171)に従ってmp4形式(h.264)の動画にしました。また、mp4でないと次の360 Metadata Toolで選択することができませんでした。

## メタデータ埋め込み
360 Metadata Toolを[360 度動画のアップロード](https://support.google.com/youtube/answer/6178631?hl=ja&ref_topic=2888648)からダウンロードしました。
起動後、動画を指定し「Spherical」のチェックボックスにチェックをしたらセーブすれば準備完了です。
![360_metadata_tool.png](https://qiita-image-store.s3.amazonaws.com/0/109715/d5ff2a52-3143-eb2e-8545-388a9db6a299.png)

出来上がった動画をYoutubeへアップロードして、完了です。
Git | 現在のブランチルートから簡単に  rebase -i できるようにする

# 結論

`.gitconfig` にエイリアスを登録する。

( 先頭に ! をつけて、コマンドを直接書く )

```
[alias]
  rbi = !git rebase -i $(git merge-base master HEAD)
```

実行。

`$ git rbi`

結果は。

```
pick 25cf857 Good touch the Green Green Glass
pick d2057d7 Goodbye Joe he got a go me oh my oh
pick 4ca967e Country load take me home
```

いい感じ！

( @pasela さんありがとうございます )

# 問題

「現在のブランチルートから、インタラクティブモードで rebase する」
これはコマンドがめちゃくちゃ面倒くさい。使用頻度が高いのに。ほんとに面倒くさい。

だがしかし。 .gitconfig にエイリアスを登録してもダメなのだ。

```.gitconfig
[alias]
  rbi = rebase -i $(git merge-base master HEAD)
```

なぜなら `$(git merge-base master HEAD)` の部分はコマンドだからね。

しかし先頭に ! を書くことで、シェルコマンドを登録できることが分かった。
なので解決策は冒頭に書いたとおり。

# 環境

- git version 2.3.8 
- Mac ( OSX )



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
AWS Lambdaを使うときに注意する４つのこと -> ３つになりました

# Lambda

AWSにLambdaがローンチされて早１年がすぎ、いろいろなところでLambdaを使ったという話を聞くようになりました。
そんなLambdaですが、使うときに注意しなければならないことがいくつかわかってきたので、整理しておきたいと思います。

## AWS Lambdaとは

なんでしょうか。簡単に確認しておきましょう。
AWSのページ( https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html )を見ると

 - AWS Lambda は、コードを AWS Lambda にアップロードすると、サービスが AWS インフラストラクチャを使用してコードの実行を代行するコンピューティングサービスです。

と、書いています。
通常、サーバ側でなんらかの処理をするためには、EC2上でアプリケーションを動かして、そこで処理をすると思いますが、LambdaはEC2を使わずに、リクエストを処理するサービスです。
最近はやりのサーバレスアーキテクチャでシステムを構築するときに、非常に有効なサービスです。
また、Lambdaを利用することで、あまりアクセスがないときにEC2のインスタンスが無駄に起動していたり、念のため２台稼働するような必要もなく、コストメリットもあります。
さらに、EC2で構築すると、アクセス数から必要な台数を予想して起動したり、アクセスが増えた時にAutoScaleを使って台数のコントロールをしますが、Lambdaはそれを気にする必要がありません。AWSがすべて自動的にやってくれるので、安心です。

# 注意すること

## その１、Javaが遅い

Lambdaがローンチされた時、使える言語はNode.jsだけでした。
その後、2015年5月にJavaが使えるようになりました。(さらに2015年10月にPythonも使えるようになりました。)
JavaでLambdaを実行できると、過去の資産がたくさん利用できたり、既存のシステムを移行しやすいなど、喜んだ人も多いのではないでしょうか。
ただ、Javaで動作させるとおそい(というか処理時間にばらつきがある)です。
Node.jsだと数10msで実行完了する処理が、Javaだと数10msから数100msかかる場合もあるようです。
原因を探っていくと、Javaのクラスをロードするのに時間がかかっているようです。
Lambdaのインスタンスが再利用された場合は早いのですが、新たにロードする場合は時間が余計にかかってしまうのです。
せっかく、時間単位の課金で金額が削減できるのに、JavaだとNode.jsに比べてコストがかかってしまうことがあり、効果が薄まってしまいます。
なので、どの言語で実装するかの検討は注意が必要です。(ごめんなさい、Pythonでは試していません)

## その２、制限

Lambdaで動くインスタンスにはメモリの制限があります。
128MB〜1.5GBまで、64MB単位で使用するメモリ量を指定できます。違う言い方をすると、1.5GB以上のメモリが確保できないということです。メモリが大量に必要になる処理だとメモリを確保できずに、Lambdaが使えないこともあります。
また、処理時間の制限もあります。
処理がタイムアウトになるまでの時間を指定します。(最大300秒)
こちらも同様に、300秒以上かかる処理の場合、Lambdaが使えないので、普通にEC2で実現する必要があります。

## その３、失敗時に３回リトライしてくれる
理由２と繋がるのですが、Lambdaの処理に失敗した場合、３回自動的にリトライしてくれます。
Lambdaがリトライする条件として、その２で書いたメモリ不足や、実行時間のタイムアウトが発生した場合や、Lambdaの処理が失敗した場合もリトライします。
Node.jsの場合、context.fail()を呼び出した場合、処理が失敗したと判断します。再実行してほしい場合は良いのですが、再実行しても失敗するような場合、context.fail()を呼び出してしまうと、リトライされてしまうので、注意が必要です。実行回数や時間が追加されてしまうので、コストも無駄になってしまいます。
このような場合は、context.done()を呼び出すと再実行せずに終了します。

## その４、VPCの中に入れない

<del>VPCの中に入れないということはどういうことでしょうか。
単純にLambda内で処理をするだけであれば問題ないのですが、AWS内の他のサービスにアクセスするときに問題になります。
わかりやすい例でいうと、処理結果をDBに格納したい場合、どうなるでしょうか。
AWSのRDSでDBを構成している場合、RDSはVPCに入っているのですが、LambdaはVPCに入れません。LambdaからRDSにアクセスするためには、セキュリティグループで、**すべてのIPアドレスから受け入れるようにする必要があります。**
。。。。。。。。。。。
いやいやいやいや、それはないでしょー！！
超暫定対策としては、Lambdaが取りうるIPアドレスすべてをセキュリティグループに追加する事がありますが、AWS内からは誰でもアクセスに可能になってしまいますし。。。。
いやいやいやいや。
もう少しちゃんとした対応をするならば、Lambdaの中で自分のIPアドレスをセキュリティグループに追加して、終わる前に外す処理をすることで対応できると思います。。。。。。
めんどくさい。
これはAWSも把握していて、対応すると言っています。(re:Invent2015の時に「年内に対応する」ということだったのですが、2015/01/18時点ではまだ対応されていません。) </del>

つ、ついに、AWSで対応されました！(詳しくはこちらを見てください -> http://aws.typepad.com/aws_japan/2016/02/access-resources-in-a-vpc-from-your-lambda-functions.html)

# まとめ

とのように、いくつか課題がありますが、きちんと使えばとても便利なサービスであることに変わりはありません。
ぜひ、チャンスがあれば使ってみてください！
Arch linuxでのvimのカラースキーム設定

ググればいくらでも出てくるけど，いつもわからなくなるのでメモ。
環境はArch linux

１インストール
sudo pacman -S vim

２molokaiをダウンロード
ダウンロード先（molokai.vim 1.1)
http://www.vim.org/scripts/script.php?script_id=2340

３molokaiを移動
mkdir -p ~/.vim/colors
mv ~/Downloads/molokai.vim ~/.vim/colors/molokai.vim

４.vimrcの設定
sudo nano ~/.vimrc
以下を追記。
colorscheme molokai
set t_Co=256
syntax on


ここまでやるとカラフルに表示されるようになるけど，sudo vim だと反映されないので，

５.bashrcの設定
以下を追記
alias sudo='sudo -E '

これでsudo時に環境変数を引き継ぐ。
sudo vim で.vimrcを使えるようにするにはググれば色々やり方が出てくる。
セキュリティの問題とかあるみたいだけど，とりあえずこれが一番簡単なような気がする。
Coda 2 & 2.5 のターミナルで秘密鍵を追加で使えるようにする方法 (Mac OS の SSH 全体も同じ)


Coda 2 & Coda 2.5 の SFTP 接続では、秘密鍵ファイルを指定することができますが、Terminal で秘密鍵ファイルを別途指定することができません。

ローカルのターミナルで追加する必要があります。

## 最新版

http://ja.katzueno.com/2016/01/3562/

## 秘密鍵を登録する手順手順

1. Terminal を開く、もしくは、Coda の Terminal を `To Localhost` で選択して開く

2. 秘密鍵 [pem-file] を保存してあるパスを取得 or `cd` でそこまで行く or ~/.ssh/ 配下に保存する
 
3. chmod で、その秘密鍵を 600 に設定する
   `chmod 600 [pem file]`
   
4. SSH に秘密鍵を追加するコマンドを入力
    `ssh-add -K [pem-file]`

## 秘密鍵の登録を削除する

続き
http://ja.katzueno.com/2016/01/3562/

以上

## 参考

http://blog.hersoncruz.com/2012/06/coda-2-ssh-terminal-connection-with-private-key/
libFMexeを動かすまで (R Wrapper for the libFM Executable参照記事)

###はじめに
Kaggleなどでよく使われる手法の1つにFactorization Machinesがあります。手法についての説明は、日本語の記事だと、[@wwackyさんのこちらの記事](http://qiita.com/wwacky/items/b402a1f3770bee2dd13c)が非常に参考になります。[元文献はこちら(Factorization Machines)](http://www.csie.ntu.edu.tw/~b97053/paper/Rendle2010FM.pdf)。こちらの記事中の、どうやってFactorization Machinesを実行したらいいの？の部分に、[libFM](http://www.libfm.org/)というライブラリを使うといいよ、との記述がありました。このlibFMはC++で書かれていることもあり、高速ですがプログラミングゆるふわ勢にはちょっととっつきにくいところがあります。  
Rで使えたらいいなと思って探していたところ、libFMのwrapperである、[libFMexe](https://github.com/andland/libFMexe)というパッケージを見つけたので、インストールの手順を[パッケージのGithub (R Wrapper for the libFM Executable)](https://github.com/andland/libFMexe)を参考にまとめました。

###インストール
インストールに先立ち、[libFM](http://www.libfm.org/)をインストールしておく必要があります。私の環境はOSX 10.10.5です。ソースコードを落としてきて解凍、ディレクトリを移動して`make all`でインストールできました。

続いてRパッケージのインストールです。

```{r package}
# install.package("devtools")
library(devtools)
```

```{r install}
# install.package("devtools")
devtools::install_github("andland/libFMexe")
```
定番のdevtoolsからインストール出来ます。

このまま使えればベストですが、RからlibFMの`PATH`を通しておかないと動きませんでした。こちらの記事[(Building R packages: missing path to pdflatex)](https://danieljhocking.wordpress.com/2012/12/15/missing-pdflatex/)を参照し、

```{r environment}
Sys.setenv(PATH=paste(Sys.getenv("PATH"),"/Users/local/libfm-1.42.src/bin",sep=":"))
```
で、`libfm-1.42.src/bin`にパスを通せばめでたく動かせるようになります。もしくは以下のように、計算を実行する際にパスを直接`exe_loc`内に指定することでも計算が実行できるようです。

```{r alternative}
libFM(..., exe_loc = "/Users/local/libfm-1.42.src/bin")
```

実行の詳細は[パッケージのGithub (R Wrapper for the libFM Executable)](https://github.com/andland/libFMexe)や、helpをご参照いただければと思いますが、以下のようにtraining, testデータを指定し、`formula`, 次元数, `iter`, `task`(回帰"`r`" or 分類"`c`")を指定すれば動きます。この他には最適化の手法 ("mcmc",
  "sgd", "als", "sgda") を選んだりもできるようですね。

```{r example}
library(libFMexe)

data(movie_lens)

set.seed(1)
train_rows = sample.int(nrow(movie_lens), nrow(movie_lens) * 2 / 3)
train = movie_lens[train_rows, ]
test  = movie_lens[-train_rows, ]

predFM = libFM(train, test, Rating ~ User + Movie,
               task = "r", dim = 10, iter = 500)

mean((predFM - test$Rating)^2)
#> [1] 0.8191034
```

私はFactorization Machinesの中身やプログラム周りに詳しいわけではないので、普段使っている環境で試しながら勉強できるのはとてもありがたいですね。だれかの参考になれば幸いです。

###参考資料
[R Wrapper for the libFM Executable](https://github.com/andland/libFMexe)
[libFM: Factorization Machine Library](http://www.libfm.org/)
[Building R packages: missing path to pdflatex](https://danieljhocking.wordpress.com/2012/12/15/missing-pdflatex/)
[Factorization Machines](http://www.csie.ntu.edu.tw/~b97053/paper/Rendle2010FM.pdf)
[Factorization Machinesについて調べてみた](http://qiita.com/wwacky/items/b402a1f3770bee2dd13c)
ブラウザ上にデスクトップが作れるらしい、OS.jsを使ってみた【Mac】

OS.jsというのが面白そうだったので公式サイトを参考にMacに入れてみました。

【公式サイトURL】
http://os.js.org/#install


## インストールは簡単ワンライナーで出来る

上記の公式サイトにも載ってますが、以下コマンド叩くだけです。

```bash
$ curl -sS http://os.js.org/installer | sh
```

## 起動も簡単

インストール終わったら、ディレクトリ移動して、サーバー起動するだけ！

```bash
$ cd OS.js

$ sh bin/start-dist.sh
```

8000ポートで起動するので、

```
http://localhost:8000/
```

にアクセスすると、

![スクリーンショット 2016-01-18 13.17.50.png](https://qiita-image-store.s3.amazonaws.com/0/105934/8ebc4149-56fd-208e-95bf-c2f087ffaade.png)

接続できました！

今後どう発展していくのか楽しみ！
#PHP 5.4以降で html_entity_decode() を用いて `&apos;` を `'` に decode する

## <i class="fa fa-times" /> `ENT_QUOTES` だけでは `&apos;` は `'` にならない

```php:php
echo htmlentities("'", ENT_QUOTES);// &#039;
echo html_entity_decode("&#039;&apos;", ENT_QUOTES); // '&apos;
```

## <i class="fa fa-circle-o" /> PHP 5.4以降ならば、flagsに`ENT_HTML5`を加える

```php:php
echo htmlentities("'", ENT_QUOTES | ENT_HTML5);// &apos;
echo html_entity_decode("&#039;&apos;", ENT_QUOTES | ENT_HTML5); // ''
```

## <i class="fa fa-file-text-o" /> 参考

- http://stackoverflow.com/questions/6791298/convert-apos-to-an-apostrophe-in-php
- http://cakecatz.hatenadiary.com/entry/2014/05/22/112220
- http://php.net/manual/ja/function.htmlentities.php
- http://php.net/manual/ja/function.html-entity-decode.php
サクラエディタで条件にヒットした行を削除

集計したデータをちょっとだけ、いじりたいときに便利です。
たまに使いそうなので忘れないようにメモしておきます。

:see_no_evil: 例えば、下記のサンプルで餃子だけ置いていきたいようなとき

```sample.txt
name:孫悟空	power_level:8000
name:クリリン	power_level:1770
name:ヤムチャ	power_level:1480
name:亀仙人	power_level:139
name:天津飯	power_level:1830
name:餃子	power_level:610
name:ピッコロ	power_level:3500
name:ヤジロベー	power_level:970
name:桃白白	power_level:130
name:孫悟飯	power_level:2800
name:ベジータ	power_level:18000
name:ナッパ	power_level:4000
name:南の界王	power_level:3500
name:栽培マン	power_level:1200
```

1.Ctrl+R
2.「置換前」に下記を入力(改行コードに注意)
```.*餃子.*\r\n```
3.「置換後」は空欄
4.「置換」を実行
※空行にしたい場合は改行コードを入力しなければOK.


:hear_no_evil: 逆に、餃子だけ残したいとき
```^((?!餃子).)*$\r\n```

:speak_no_evil: また、戦闘力が1000未満のやつを置いていくとき
```^((?![0-9]{4,}).)*$\r\n```
MongoDBのフィールドの値を一括変換するJavaScript

#はじめに
MongoDBに入ってる固定データを、全て違う値に置換する必要が出来た。
複数のテーブルに同様の値が入っているが、フィールド名が少し違ったりしていて面倒だったので、JavaScriptで処理を書いた。

#やりたいこと
1. userコレクション、enemyコレクションのto_jobフィールドに職業コードが入っている。
コードが変更になったため、全レコードのto_jobフィールドの値を、変更後の値に変えたい。
 　"aaaaaa" なら "111111"に変更
 　"bbbbbb" なら "222222"に変更
といった具合に。
主キーは"_id"

2. job_masterコレクションで変換したいフィールド名はjob_code。
　行う処理は1と同じ。フィールド名だけが違う。


処理は以下の通り

```js:convert.js
// 変換テーブル {変換前 : 変換後}
var jobList = {
    "aaaaaa" : "1111111",  // swordsman
    "bbbbbb" : "2222222",  // monk
    "cccccc" : "3333333",  // lancer
    "dddddd" : "4444444",  // warrior
    "eeeeee" : "5555555",  // archer
    "ffffff" : "6666666"   // witch
};

var convertTable = [
  {
    "tableName" : "user",
    "key" : "to_job",
  },
  {
    "tableName" : "enemy",
    "key" : "to_job",
  },
  {
    "tableName" : "job_master",
    "key" : "job_code",
  }
];
var obj = {};

convertTable.forEach(
  function(table){
    db.getCollection(table.tableName).find({}).forEach(
        function(e){
            if (e[ table.key ] != null) {
                obj[ table.key ] = jobList[ e[ table.key ] ];
                writeResult = db.getCollection(table.tableName).update({"_id":e._id}, { $set : obj } );

                // 更新エラー時の対応
                if (writeResult.hasWriteError() || writeResult.hasWriteConcernError()) {
                    print("convert " + table.tableName + " failed. _id = " + e._id + ". " + table.key + " = " + e[ table.key ]);
                }
            }
        }
    );
    print(table.tableName + " table is finished.");
  }
);

print("convert is finished.");
``` 


実行

```zsh:Terminal
mongo {db_name} --quiet convert.js
```
Thetaを愛でる

#概要
Thetaの画像が良かったので、工夫して見ました。
#test0
cesiumで表示。
http://jsdo.it/ohisama1/uimw
#test1
webglで表示。
http://jsdo.it/ohisama1/2iRT
#test2
away3dで表示。
http://jsdo.it/ohisama1/y4fh
#test3
threeで表示。
http://jsdo.it/ohisama1/gSlv
#test4
リトルプラネットに加工。500*500
[こちらの記事参考](http://qiita.com/kingpanda/items/13f7bc06bdb95d3c0bc0)
http://jsdo.it/ohisama1/wanN
#test5
リトルプラネットに加工。2048*1024
[こちらの記事参考](http://qiita.com/ELIXIR/items/dcc1aca47c76a4076d43)
http://jsdo.it/ohisama1/efrJ
Example default .codeclimate.yml

ときに、CodeClimateへの連携時に、エラーで連携すら完了しないことがありますね。

エラーが出るファイルを除外してしまえばいいんだけども、除外をしてするためのYAMLにナニカを記載すると、それしか解析してくれなくなる。まずはデフォルト設定で解析してくれるやつを全部解析してほしいわけですよ。

たとえば、[excluding-files-and-folders](https://docs.codeclimate.com/docs/excluding-files-and-folders)に書いてある通りにしたら、engineしていしろと怒られちゃうんですね。公式サイトを見れば、[カスタマイズ方法](https://docs.codeclimate.com/docs/example-codeclimateyml)は分かるんだけど、これ書いちゃうとデフォルトで実行されるエンジンが除外されてしまうので、デフォルトの設定を知りたい

しかし、一度解析成功したプロジェクトの場合は、以下のように、Analysis Configurationから現在の設定をダウンロードできる。解析すら成功しないプロジェクトのことは忘れて通りそうなプロジェクトをささっと通してみましょう。

![スクリーンショット 2016-01-18 12.09.51.png](https://qiita-image-store.s3.amazonaws.com/0/1172/7eed2e14-1edc-f891-8abe-06201b624a83.png)

このpatchを展開すると以下のようになります。このデフォルトyaml自体は中々見つけられなかったので、検索ようにこのような記事を置いておきます。


```.codeclimate.yml
engines:
  brakeman:
    enabled: true
  bundler-audit:
    enabled: true
  csslint:
    enabled: true
  coffeelint:
    enabled: true
  duplication:
    enabled: true
    config:
      languages:
      - ruby
      - javascript
      - python
      - php
  eslint:
    enabled: true
  fixme:
    enabled: true
  rubocop:
    enabled: true
ratings:
  paths:
  - Gemfile.lock
  - "**.erb"
  - "**.haml"
  - "**.rb"
  - "**.rhtml"
  - "**.slim"
  - "**.css"
  - "**.coffee"
  - "**.inc"
  - "**.js"
  - "**.jsx"
  - "**.module"
  - "**.php"
  - "**.py"
exclude_paths:
- config/**/*
- db/**/*
- spec/**/*
- vendor/**/*
```

## おまけ

解析に失敗してしまう幾つかのパターンの原因はこちら

* hash記述のsyntax error 
    * [ruby_parserにpull request](https://github.com/seattlerb/ruby_parser/pull/208)が出ているんですが、`{ 'hoge': :fugo }`という感じの記述を`ruby_parser`がparse出来ない問題
* エンコード問題
    * [このへん](https://github.com/seattlerb/ruby_parser/blob/4431d1859b1249ab5128d85070efd7738b1ac2e6/lib/ruby_parser_extras.rb#L15-L20)に起因する正規表現の記述方法による`invalid multibyte character`
Project Euler 50

問題
===
素数41は6つの連続する素数の和として表せる:

 `41 = 2 + 3 + 5 + 7 + 11 + 13.`

100未満の素数を連続する素数の和で表したときにこれが最長になる.

同様に, 連続する素数の和で1000未満の素数を表したときに最長になるのは953で21項を持つ.

100万未満の素数を連続する素数の和で表したときに最長になるのはどの素数か?

回答
===
次のように解いた。
1. 素数のリスト`pri['list']`を作成
2. ある起点の素数`pri['list'][i]`を定める。
3. 最大値MAX以下の範囲で起点の素数以降の和sを作成。この時連続した素数の個数をcとしてカウントする。
4. sが素数かつcがc_maxよりも大きければ、当該sをansとし、c_maxをcとする。
5. 2～4を繰り返し、最終的に得られたansを出力する。

```py
import mymath

def main():
  MAX = 10**6
  pri = mymath.get_primes(MAX)
  pri_length = len(pri['list'])
  i, c_max, ans = 0, 0, 0
  while i < pri_length:
    s, j, c = pri['list'][i], i + 1, 1
    while j < pri_length and s + pri['list'][j]< MAX:
      s += pri['list'][j]
      c += 1
      if pri['bool'][s] and c_max < c:
        ans, c_max = s, c
      j += 1
    i += 1
  print ans
  
main()
```
MockitoのArgumentCaptorでリスト型を扱いたいとき

リスト型の引数のメソッドのテストで、わたされた引数についてassertionしたいときのメモ。
@Captorアノテーションを使うのと、MockitoAnnotations#initMocksを使うのがみそ。

# 手順

* @Captorをつけて欲しいArgumentCaptorを定義
* @BeforeでinitMocks(this)をして、captorのインスタンス生成
* verifyでcaptor.capture()で渡された引数を指定
* captor.getValue()で渡された引数を取得


```lang:SampleTest.java

@Captor
ArgumentCaptor<List<Person>> captor;

@Before
public void before() {
  MockitoAnnotations.initMocks(this);
}

@Test
public void test() {
  PersonService service = ... ;
  
  service.execute();
  
  
  verify(service).update(captor.capture());

  assertThat(captor.getValue()).isEmpty();
}

```

# 参考サイト

http://www.agilearts.nl/tasty-test-tip-using-argumentcaptor-for-generic-collections-with-mockito/
【Unity】一度読み込んだリソースをキャッシュする場合としない場合で読み込み速度にどれくらい差が出るか検証しました

■2016/1/18 18:30 追記
最後の表の「キャッシュしない場合」「キャッシュする場合」が逆になっていたため修正しました

----

Resources.Loadでリソースを読み込む際に
一度読み込んだリソースをキャッシュするかしないかで
どれくらい速度に差が出るか気になったので検証しました

## 検証環境

- Unity：5.3.1f1  
- OS：Android  
- モデル番号：Nexus 7  
- Androidバージョン：5.0.1  

## 検証に使用するリソース

1024x1024のテクスチャ

## 読み込む方法

### キャッシュしない場合

キャッシュしない場合はResources.Loadを直接使用します  

```cs
Resources.Load<Texture>( "image" );
```

### キャッシュする場合

キャッシュする場合は下記のようなラッパークラスを作成して使用します  

```cs
using UnityEngine;
using System.Collections.Generic;

public static class Loader
{
    private static readonly Dictionary<string, Texture> mList = new Dictionary<string, Texture>();

    public static Texture Load( string path )
    {
        if ( !mList.ContainsKey( path ) )
        {
            mList[ path ] = Resources.Load<Texture>( path );
        }
        return mList[ path ];
    }

    public static void Clear()
    {
        mList.Clear();
    }
}
```

```cs
Loader.Load( "image" );
```

## 読み込み時間(秒)の比較

|形式|1,000件|10,000件|100,000件|
|:--|:--|:--|:--|
|キャッシュしない場合|<span style="color: #d32f2f">0.0139160200</span>|<span style="color: #d32f2f">0.135650600</span>|<span style="color: #d32f2f">1.34741200</span>|
|キャッシュする場合|<span style="color: #1464b3">0.0009155273</span>|<span style="color: #1464b3">0.007965088</span>|<span style="color: #1464b3">0.08035278</span>|


## 検証用のスクリプト

https://gist.github.com/baba-s/957f7f549d5852e2bc12
https://gist.github.com/baba-s/53e486f3832268f56953
TextHelper#concat + content_tag のハマりどころ

concat と ブロック付きの content_tag を組み合わせてつかうとき、

```rb
concat content_tag(:div) do
  concat content_tag(:span, "Sample")
end
```

とすると、

```html
<div></div> 
```

と出力されてしまう。

```rb
concat(content_tag(:div) do
  concat content_tag(:span, "Sample")
end)
```

とすれば、

```html
<div><span>Sample</span></div>
```

期待通りに出力される。

前者の場合、content_tag に付属させることを意図したブロックが実際には concat に渡されるため、とのことです。

参考：[stackoverflow](http://stackoverflow.com/questions/19319661/rails-concat-method-and-blocks-with-do-end-doesnt-work)
Macで辞書アプリをコマンドでらくらく開く


以下で開ける。

```
open dict://{単語}
```

めんどくさいのでエイリアスを貼る。
しかし、zsh, bashだと引数付きのエイリアスは貼れないので関数として定義する

```.zshrc
dict() { open dict://$1; }
```

以下でよりシンプルに開けるようになります。

```
dict {単語}
```
シェルスクリプト　その３

シェルスクリプトの関数についてのメモです。

・関数の型"foo() {comand;}"

・return [#]で戻り値を設定でき、"$?"で参照可能。戻り値を未設定の場合は関数内で最後に実行されたコマンドのステータスが代入されている。

・関数をそのまま実行すればカレントシェル、ファイルなどに結果を書き出せばサブシェルで実行する。前者のケースで実行時に関数内にファイル移動・変数変更・exitコマンドがあればカレントシェルに反映されるので要注意。

・関数内で呼んだ"$0"は関数を呼んだシェルスクリプトの名前を保持している。

・":"ヌルコマンドは何もしないで戻り値に０を必ず返す。無限ループ作成時などに使える。

・"."ドットコマンドは現行のシェルのプロセスを使って指定したファイルを実行する。

・"eval"はよくわからない。

・"exec"コマンドは引数のコマンドを新しいプロセスをつくらず、現行のシェルのプロセスと置き換えて実行する。

・"read"コマンドはキーボードからの入力を引数の変数にセットする。

・"readonly"コマンドは引数に指定したファイルを変更・unsetできなくする。

・"set"コマンドはシェルのオプションをオン・オフする。+でフラグオン。-でフラグオフ。

・"test"コマンドは条件を判定して真偽を返す。whileやifの条件判定に使う。

・"umask"コマンドはファイルを作成するときのモードを指定する。引数には３つの８進数の組み合わせをとる。

・"unset"コマンドは指定した変数・関数を消去する。

・"wait"コマンドは引数にしていした動作中のPIDが終了するまで待つ。引数未指定ならシェルから派生している子供のプロセスすべてが終わるまで待つ。

参考資料：入門UNIXシェルプログラミング　改訂第２版　第３章（発行所：SBクリエーティブ株式会社）

[シェルスクリプト　その１](http://qiita.com/woolon/items/7bcfa18320f0abd74ca0)
[シェルスクリプト　その２](http://qiita.com/woolon/items/c69482474ba1564d5057)
[シェルスクリプト　その４](http://qiita.com/woolon/items/514db422f8ccea0ca94c)
[シェルスクリプト　その５](http://qiita.com/woolon/items/6366dd6dac12387d84b7)
[シェルスクリプト　その６](http://qiita.com/woolon/items/6e89c67220b9095a6414)
[シェルスクリプト　その７](http://qiita.com/woolon/items/4e3c986587f428742b79)
iTerm2とtmux2.1の組み合わせで「Send hex code」が動かない場合の対処法

こちらを参考にさせて頂きました。
http://dackdive.hateblo.jp/entry/2015/10/31/091204

```lang:.tmux.conf
'set -g assume-paste-time 0'
```

上記を追記して反映
http://qiita.com/kaorukit/items/68ee632ba4367091a493
Rails4でのテスト実行時にafter_commitを呼ぶ

Rails4での話。(3以下は未確認。おそらくRails3でも同じ)

## tl;dr

- rails4ではテスト実行時に`transactional_fixtures`のせいで`after_commit`が呼ばれない
- [test_after_commit](https://github.com/grosser/test_after_commit)を使えば解決できる
- rails5では修正されている

## 問題

test実行時に`ActiveRecord::Callbacks`の`after_commit`が呼ばれない
そのため、意図通りに動かない・テストが通らないということになる

`after_commit`のドキュメントには以下のように書いてある
https://github.com/rails/rails/blob/v4.2.5/activerecord/lib/active_record/transactions.rb#L235-L237

> Note that transactional fixtures do not play well with this feature. Please
use the +test_after_commit+ gem to have these hooks fired in tests.

意訳すると、

> テスト実行時に`transactional fixtures`を使ってると`after_commit`が呼ばれないので`test_after_commit`を使ってね。

## transactional_fixtures

> http://anti-pattern.com/transactional-fixtures-in-rails から
Transactional fixtures simply wrap each test in a database transaction and start a rollback at the end of it, reverting the database back to the state it was in before the test. 
If the database was empty before the test, it will roll it back and be empty after the test. If the database had preloaded test data (like fixtures) in it before the test, it will roll it back and have that same data after the test. 
Even though this feature is unrelated to fixtures themselves, fixtures are the default way to create test data in Rails, hence the name “transactional fixtures”.


意訳すると、


> Transactional fixturesはテストごとにDBのtransactionを開始しテスト終了後にDBをrollbackされ、DBはテスト実行前の状態に戻る。
テスト実行時にDBが空っぽならば空っぽに戻るし、`fixtures`などでデータが用意されていれば同じデータを持った状態に戻る。
この機能は`fixtures`とは関係ないが、`fixtures`がrailsのテストデータを用意するデフォルトの方法なので、`transactional fixtures`という名前が付いている


つまり、`database_cleaner`等と同等の機能。 
(rails4ではdataase_cleaner等は基本的には必要ない。ただ、mongodbなどには対応していないので、そういう時には`database_cleaner`等を使う必要がある)

- テスト実行ごとにtransactionを開始してrollbackをしている
- つまりDBにcommitをしていない
  - たぶん!(実装ちゃんと見てないのでわからないが、DB的にはcommitしていないだけでなのかなと思う)
- そのため`after_commit`が呼ばれない
  - (そのためかどうか、は実装ちゃんと見てないのでわからない)

という感じなのだと思う。

## 解決策

- railsのドキュメントにある通り、 [test_after_commit](https://github.com/grosser/test_after_commit)を使う
- `transactional_fixtures`をoffにし`database_cleaner`を使い、`DatabaseCleaner.strategy`を`:transaction`ではなく`:truncation`にする
  - 本当に`after_commit`が呼ばれるかは未確認。動く気がしているだけ

## Rails5

rails5では`transactional_fixtures`を使っていても`after_commit`が呼ばれるようになっている
あと、`transactional_fixtures`ではなくて`transactional_tests`という名前になっている
関連PR
https://github.com/rails/rails/pull/18458 Support after_commit callbacks in transactional fixtures
https://github.com/rails/rails/pull/19273 ‘test_after_commit’ gem is not require in Rails 5, remove note from doc ...
https://github.com/rails/rails/pull/19282 Renaming transactional fixtures to transactional tests


## これまでに書いた大半のことが書いてある素晴らしいやつ

http://anti-pattern.com/transactional-fixtures-in-rails
テスト用のmp3ファイルをsayコマンドを使って作成する

音声再生系のサービスのテストでmp3のダミーデータが欲しい時にMacユーザーならsayコマンドを使って簡単に用意できます。

terminalを開いてまずはhomebrewをインストール
`ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`

homebrewのインストールが終わったらffmpegをインストール
`brew install ffmpeg`

sayコマンドで「こんにちは」と喋らせ、それを.aiffとして書き出し
`say -v Kyoko こんにちは -o first.aiff`

ffmpegを使ってaiffをmp3ファイルに変換
`ffmpeg -i first.aiff hello.mp3`


**参考**
[Macのsayコマンドの使い方](http://qiita.com/zakuroishikuro/items/0c17acb21f119647c205)
[ffmpegの使い方](http://tech.ckme.co.jp/ffmpeg.shtml)
make cleanで削除するファイルの指定に.gitignoreを使う

# 問題

.gitignoreの内容と`make clean`で削除対象とするファイル or ディレクトリはたいてい同じものになる。
同じ記述を別々の所に書くのも面倒なので、ここはDRYにしたいところである。

# 解決策

以下の記述をMakefileに書くと、.gitignoreで無視すると指定したファイル or ディレクトリを`make clean`で消すことができる。

```mf:Makefile
.PHONY: clean
clean:
	git clean -X -d -f
```

`git clean`のオプションはそれぞれ次の意味。

|オプション|意味|
|---|---|
|-X|.gitignoreで指定したファイルのみを削除する|
|-d|ファイルだけではなくディレクトリも対象にする|
|-f|本当に削除を実行したいとGitに念押しする（このオプションが無いとデフォルトではGitは削除を実行しない）|

とはいえこの方法には欠点もある。
`make -n clean`をしても実際にどのファイル or ディレクトリが削除されるのか確認できないのである。

# 別の解決策

こちらの方法は`make -n clean`でどのファイル or ディレクトリが削除されるのかを確認できる。

```mf:Makefile
.PHONY: clean
clean:
	rm -rf $(shell LANG=C git clean -X -d -n | sed 's/^Would remove //')
```

ただしこちらは別の欠点がある。
もし名前にスペースを含むファイル or ディレクトリがあった場合、`make clean`すると意図しない場所に`rm -rf`が行われて悲惨なことになる。
どちらの方法を使えばいいかはプロジェクトの性質によると思う。
ソースコードの一部を切り取ってクリップボードにコピーするワンライナー


ソースコードの一部のみクリップボードにコピーし、別のエディタなどで利用したい時に使えそうです。

# こう書いてみた

```
$ cat sample.swift  | sed -n '3,10p' | pbcopy
```
短くすみました。sedのnオプションは指示した行のみ標準出力に書き出す時に使います。ここでは3行目から10行目までを書き出す(printする)ように指定しています。pbcopyはクリップボードにコピーするコマンドです。

# 簡単に説明してみる

元のファイルがsample.swiftになります。Swiftでstructを使った簡単なサンプルです。

```sample.swift
#!/usr/bin/swift

struct Languages {
	let lang1: String
	let lang2: String

	func favoriteLanguages() -> String {
		return "1: \(lang1)\n2: \(lang2)\n"
	}
}

let lang = Languages(lang1: "Swift", lang2: "Python")
print(lang.favoriteLanguages())

```

ターミナルで次のように打ち込みます。上のファイルの構造体を定義する部分（３行目から１０行目）のみ切り取って、クリップボードにコピーします。

```
$ cat sample.swift  | sed -n '3,10p' | pbcopy
```

別のエディタに貼り付けた結果はこのようになります。

```
struct Languages {
	let lang1: String
	let lang2: String

	func favoriteLanguages() -> String {
		return "1: \(lang1)\n2: \(lang2)\n"
	}
}
```


# 反省
ファイルの一部を切り取りクリップボードにコピーする方法を、簡単なワンライナーで実現することができました。ちなみに`pbpaste`すればペーストできます。クリップボードにコピーされた内容を確認するのに使えます。
ステッピングモーターをDCモーターの様に扱うモジュール

#概要
arduinoからステッピングモーターをDCモーターの様に扱うモジュールをattiny13aで作った。
アセンブラで書いた。
idle air control valve を動かした。
スタート・ストップ、正転・逆転で指示する。 
#動画
https://www.youtube.com/watch?v=iw2Boqvj0Gg
#写真
![MVC-010S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/16394a43-286a-b861-f290-2d60926f31bc.jpeg)
#回路図
![iacv.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/c1cd18d0-c375-fb87-e516-694ab2e4b949.jpeg)
#サンプルコード
```
.include "tn13def.inc"
.cseg
.org 	0
	rjmp	setup
	reti
	reti
	reti
	reti
	reti
	reti
	reti
	reti
	reti

delay_10ms:
	clr 	r1
	ldi 	r17, 20
delay_10ms_loop:
	dec 	r1
	brne	delay_10ms_loop
	dec 	r17
	brne	delay_10ms_loop
	ret

setup:
	cbi 	DDRB, PB0
	sbi 	DDRB, PB1
	sbi 	DDRB, PB2
	sbi 	DDRB, PB3
	sbi 	DDRB, PB4
	cbi 	DDRB, PB5
	sbi 	PORTB, PB0
	sbi 	PORTB, PB1
	sbi 	PORTB, PB2
	sbi 	PORTB, PB3
	sbi 	PORTB, PB4
	sbi 	PORTB, PB5
	ldi 	r16, low(RAMEND)
	out 	SPL, r16
	ldi 	r21, 1

loop:
	ldi 	r19, 0
	sbic	PINB, PB0
	ldi 	r19, 1
	ldi 	r20, 0
	sbic	PINB, PB5
	ldi 	r20, 1
	cpi		r19, 1
	brne	tugi7
	cpi		r20, 0
	brne	tugi0
	dec 	r21
	rjmp	tugi1
tugi0:
	inc 	r21
tugi1:
	cpi 	r21, 1
	brcc	tugi2
	ldi		r21, 4
tugi2:
	cpi 	r21, 5
	brcs	tugi3
	ldi		r21, 1
tugi3:
	cpi 	r21, 1
	brne	tugi4
	sbi 	PORTB, PB1
	cbi 	PORTB, PB2
	cbi 	PORTB, PB3
	cbi 	PORTB, PB4
tugi4:
	cpi 	r21, 2
	brne	tugi5
	cbi 	PORTB, PB1
	cbi 	PORTB, PB2
	sbi 	PORTB, PB3
	cbi 	PORTB, PB4
tugi5:
	cpi 	r21, 3
	brne	tugi6
	cbi 	PORTB, PB1
	sbi 	PORTB, PB2
	cbi 	PORTB, PB3
	cbi 	PORTB, PB4
tugi6:
	cpi 	r21, 4
	brne	tugi7
	cbi 	PORTB, PB1
	cbi 	PORTB, PB2
	cbi 	PORTB, PB3
	sbi 	PORTB, PB4
tugi7:
	rcall	delay_10ms
	rjmp	loop
```
GitHub API の罠にハマった

GitHub API の罠にハマって10分位悩んだ

# 結論

GitHub API を使うときにはHTTPヘッダーの `User-Agent` を設定しよう！

# 経緯
## 403 Forbidden が返ってくる
GitHub の API を node を使って叩くサンプルを作ろうとして
ユーザ情報を取得する `GET /user` を叩くだけの簡単なプログラムを書いたら `403` エラーが返ってくる現象が起きた。

トークンのせいかな？と思うもトークンが違えば `401 Unauthorized` が帰ってくるはずなので何かがおかしい

## curl コマンドを使うとうまく行く
しかも curl コマンドを使うと同じトークンでも問題なく実行できるという謎っぷり

## User-Agent が設定されていないと受け付けない
手元で試すだけではどうしようもなくなったので大人しくドキュメントを読むことに。
`403 Forbidden` をキーワードに検索をかけてみると `User Agent Required` という項目を発見。

GitHub の API は User-Agent が設定されていないとそもそもリクエストを受け付けないらしい。

ドキュメントは[ここ](https://developer.github.com/v3/#user-agent-required)

curl は下のように実は User-Agent も付与して送ってたから実行できてた事も分かった。

```bash:terminal
takayuki@takayukioda:~$ curl -v -X HEAD github.com
* Rebuilt URL to: github.com/
*   Trying 192.30.252.129...
* Connected to github.com (192.30.252.129) port 80 (#0)
> HEAD / HTTP/1.1
> Host: github.com
> User-Agent: curl/7.43.0
> Accept: */*
```

「User-Agent があるからセキュリティが向上する」とは言えないけど、こういうところからきちんと情報を集めるんだな〜と感心した。

今後APIを公開する事があったらこういう部分もしっかり~~パクッ~~考えていきたいなと思った次第です。
技術英語 > Is this [the universal greeting] when the communication is down? / I think it's the universal greeting when you don't like someone.

@ Star Trek movie > 叛乱

通信に応答しない時にその相手から光子魚雷を撃ち込まれてライカーが

> Is this <font color=red>the universal greeting</font> when the communication is down?

それに対してラ・フォージが

> I think it's the universal greeting when you don't like someone.

<hr>
Trans FORMERSのWikiに以下の記載がある
http://tfwiki.net/wiki/Universal_greeting

> The universal greeting is used as a means <font color=red>to express good will</font> toward alien beings when a language barrier is present.

<hr>
huluのStar Trek moviesは露のごとく消え去った。
VoyagerとLiving On Earthのリスニングに戻るとしよう。
シェルの機能を使用してGitで現在のブランチと同名のブランチにプッシュ/プルする(シェル)

# 追記

こんなシェル芸しなくても

```bash
git push origin HEAD
```

でいけます。なんなら

```bash
git push -u origin HEAD
```

すれば次回からは`git push`で済みます。

#コマンド

```bash:Bash/tcsh
git push origin `git branch | fgrep '* ' | tr -d '* '`
git pull origin `git branch | fgrep '* ' | tr -d '* '`
```

#``内は何をやっているのか
まず、`git branch`でブランチの一覧を取り出します。出力の形式は次のようになります。

```
  他のブランチ1
  他のブランチ2
    ・
    ・
    ・
  他のブランチk-1
* 現在のブランチ
  他のブランチk+1
    ・
    ・
    ・
  他のブランチn
```

現在のブランチのところにだけ「`* `」がついています。そこで`fgrep`の出番です。これは`git branch`の出力から「`* `」がある行だけを残して次の`tr`に渡します。最後の`tr`は、余分な「`* `」を削除する働きをします。``は内部のコマンドの出力を全体のコマンドの一部の文字列として挿入するものなので、それぞれ


```bash:Bash/tcsh
git push origin (現在のブランチ)
git pull origin (現在のブランチ)
```

に置き換わります。
ansibleで引っかかったこと


備忘録。

### bitbucketのprivate repoからcloneできない

前提として以下が必要（httpからcloneしててハマってたので忘れないように書いておく）

 * bitbucketに公開鍵が登録してあること
 * 「git@bitbucket.org」から始まるURLでcloneすること

(1) taskで以下のように`accept_hostkey`を加える

```
- name: clone repo
  git: repo=git@bitbucket.org:celeron1ghz/mogemoge.git dest="/home/agile/mogemoge" accept_hostkey=true
```


(2) `ansible.cfg` に以下を追記

```
[ssh_connection]
ssh_args = -o ForwardAgent=yes
```

上記の二つの設定で、ansibleを実行しているhostの秘密鍵を使ってgit cloneをしてくれるようになる。
これでprivate repoからcloneはできるようになった。


### SSL証明書を入れたnginxの再起動が失敗する

参考：http://qiita.com/kadoppe/items/b17bf60337ebb18f00e8

```
- name: run nginx
  service: name=nginx state=restarted
  sudo: yes 
```
こんな感じでnginxを再起動しようとするとエラーで止まる。


これは、証明書にパスワードをつけていると再起動時にパスワードで認証できずにnginxの起動が失敗しているので、単純にパスワードをなくせば良い。

```bash
$ cp cert.key cert.key.org
$ openssl rsa -in cert.key.org -out cert.key
```

このkeyファイルでサーバの証明書ファイルを上書きして解決。


これでplaybookを一発流せばアプリケーションが新しくなるようになった！
matplotlib出力画像の文字化け解消法

Excelで描けるようなグラフを、pythonで描くことができます。

その機能を提供しているのがmatplotlibというパッケージ。

Excelで描けるものをスクリプト言語で描く意味は、主に自動化のためですかね…。

日々更新される類のデータを定期的に取得してグラフ化し、その画像をメールで送信するのを自動化するような用途で使えます。

ここでは例として、[文部科学省が公表している国立私立大の授業料推移データ](http://www.mext.go.jp/b_menu/shingi/kokuritu/005/gijiroku/06052921/005/002.htm)を使います。

以下のようにdata.csvファイルとして保存します。（vimで空白を,に置換する等、適当に整形してあります）

```
年度,授業料（円）,入学料（円）,検定料（円）,授業料（円）,入学料（円）,検定料（円）,授業料（倍）,入学料（倍）,検定料（倍）
昭和50年,36000,50000,5000,182677,95584,9647,5.1,1.9,1.9
昭和51年,96000,50000,7500,221844,121888,11452,2.3,2.4,1.5
昭和52年,96000,60000,7500,248066,135205,13084,2.6,2.3,1.7
昭和53年,144000,60000,10000,286568,157019,14722,2,2.6,1.5
...
```

国立私立それぞれの授業料実データ部分をpythonで読み取り、リスト化して、ラベル設定や判例表示設定など調整し、最後にgraph.pngに書き出しています。

```python
from matplotlib import pyplot

with open("data.csv", "r", encoding="shift-jis") as fp:
    x, xlabels = [], []
    y1, y2 = [], []
    for linenum, line in enumerate(fp):
        if linenum is 0:
            continue
        x.append(linenum)
        xlabels.append(line.split(",")[0])
        y1.append(line.split(",")[1])
        y2.append(line.split(",")[4])

# x軸のラベル設定
pyplot.xticks(x, xlabels, rotation=90)
# x軸のラベル表示スペースを拡大
pyplot.subplots_adjust(bottom=0.2)

# cyanの実線で描画
pyplot.plot(x, y1, 'c-', label="国立大学")
# magendaの実線で描画
pyplot.plot(x, y2, 'm-', label="私立大学")

# grid, title, 凡例表示
pyplot.title("国立大学と私立大学の授業料等の推移")
pyplot.legend()
pyplot.grid()

#pyplot.show()
pyplot.savefig("graph.png")
```

その結果が以下の図です。

![](https://farm6.staticflickr.com/5755/23508632942_794c8b078d_z_d.jpg)

いわゆる豆腐ですね…。これはmatplotlibが日本語フォントを持たないためです。

ちょっと古い上、python2の情報ですが、[How to set Helvetica as the default sans-serif font in Matplotlib](http://blog.olgabotvinnik.com/blog/2012/11/15/2012-11-15-how-to-set-helvetica-as-the-default-sans-serif-font-in/)でフォントの追加方法を解説しています。[^1]

システムから日本語対応したフォントを引っ張ってきてもいいんですが、手持ちのマックにはttfフォントが見当たらなかったので、[IPAフォント](http://ipafont.ipa.go.jp/old/ipafont/download.html#en)を頂きました。

ダウンロードしたzipファイルを解凍し、以下のようにコピーします。コピー先は環境に依るのでご注意を。

```bash
$ cp ~/Downloads/IPAfont00303/*.ttf /usr/local/lib/python3.4/site-packages/matplotlib/mpl-data/fonts/ttf/
```

設定ファイルをホーム下にコピーして、それを編集します。

```bash
$ cp /usr/local/lib/python3.4/site-packages/matplotlib/mpl-data/matplotlibrc ~/.matplotlib/
$ vi ~/.matplotlib/matplotlibrc
```

font.familyにフォント名を設定します。

ここで指定するのはフォントファイル名ではないのでご注意を。

`open ipa.ttf`のようにして、使いたいフォント名を確認してから設定してください。

```bash:matplotlibrc
# The font.size property is the default font size for text, given in pts.
# 12pt is the standard value.
#
font.family         : IPAmincho
```

キャッシュデータを削除します。

```bash
$ rm ~/.matplotlib/fontList.py3k.cache
```

これで、次回`import matplotlib`した時に、キャッシュデータが自動的に生成され、日本語表示が可能になります。

先ほどのpythonスクリプトを再実行すると、以下のように豆腐が解消されているのがわかります。

![](https://farm6.staticflickr.com/5703/23439509492_98fdb9472a_z_d.jpg)

[^1]: matplotlib標準のフォントが美しくない！とご立腹の様子
anyenv環境でpyenvインストール後にハマったのでメモ

[発電状況監視システム](http://grid.rinka-blossom.com/)のような、何か簡単なWebシステムを作りたくなった時、Ruby on railsがあると楽に組めるだろうか？rubyも勉強してみようか？

なんて考え始めると、複数バージョンのインタプリタを管理できるrbenvを入れておきたくなる。

同様に、pythonにもpyenvというものがある。

最近流行りのnodejsにもndenvというものがある。

名前が似ているだけでなく、使い方もほぼ同じ。

ということは、これらを一括管理する方法があるのでは？

と思ってググったらありました。[anyenv](https://github.com/riywo/anyenv)です。

インストール手順は上のリンク先を見れば分かりますが、一応解説。

# anyenvコード取得

homeディレクトリ下にanyenvコードをcloneします。

```bash
$ git clone https://github.com/riywo/anyenv ~/.anyenv
```

# anyenv環境設定

homeディレクトリ下の.bash_profileにanyenv環境設定して、shellを再起動する。

bash以外のshellを使う方は適宜読み替えてください。

```bash
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(anyenv init -)"' >> ~/.bash_profile
$ exec $SHELL -l
```

# anyenv動作確認

以下のようにコマンドを実行すると、使用可能なenv系ツールをリストアップしてくれます。

…Go, Lua, Scalaにも同様のツールが存在することを、ここで初めて知りました。

```bash
$ anyenv install -l
Available **envs:
   Renv
   crenv
   denv
   erlenv
   ...
   goenv
   luaenv
   ...
   ndenv
   ...
   pyenv
   rbenv
   ...
   scalaenv
```

# anyenv環境下のpyenvへのプラグイン導入

virtualenvプラグインも、以下のようにすれば導入できます。

```bash
$ git clone https://github.com/yyuu/pyenv-virtualenv ~/.anyenv/envs/pyenv/plugins/pyenv-virtualenv
```

# トラブルシューティング

こんなに簡単な導入手順なのに、何故かハマりました。

`pyenv global 3.5`のようにコマンド実行しても、pythonバージョンが切り替わらないのです。

いろいろググってみると、どうも事前にpyenvを導入した後uninstallした際、pyenvの設定ファイルが中途半端にhome下に残っていたのが原因であることが判明しました。[^1]

```
pyenvのバージョン選択はまず、pyenv shellで設定されるPYENV_VERSION環境変数。
次に、pyenv localで設定できる、カレントディレクトリにある.python-versionファイル。
次に、pyenv global で設定できる~/.pyenv/versionファイル。
全てがなかったらsystemのpython。
```

既にpyenvインストール済みだった人は上記のファイルを全て削除しておきましょう。

[^1]: [pyenv globalで切り替わらない！](http://qiita.com/1234224576/items/11ad3509fe4b0a9a33ed)
クラスパス上にあるPNGファイルをBASE64形式で取得する

## きっかけ

HTMLないしはCSSなどからごく小さな画像ファイルをBASE64で受け取る、いわゆるdata URI schemeと呼ぶものに対して、作ることがあったのでメモを残します。

## コード例

```java:PictureDecodeService.java

import org.apache.commons.codec.binary.Base64;

public class PictureDecodeService {
	String loadBinaryImage(String filename) throws Exception {

		// ファイルインスタンスを取得し、ImageIOへ読み込ませる
		File f = new File(filename);
		BufferedImage image = ImageIO.read(f);
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		BufferedOutputStream bos = new BufferedOutputStream(baos);
		image.flush();

		// 読み終わった画像をバイト出力へ。
		ImageIO.write(image, "png", bos);
		bos.flush();
		bos.close();
		byte[] bImage = baos.toByteArray();

		// バイト配列→BASE64へ変換する
		Base64 base64 = new Base64();
		byte[] encoded = base64.encode(bImage);
		String base64Image = new String(encoded);
		
		return base64Image;
	}
}
```

こうして生成したBASE64をdataURISchemeに渡せば完成です。

```html
<img src="data:image/png;base64,(BASE64化した文字列)">

JSPを使うと、

<img src="data:image/png;base64,${base64Image}"> とかでも使えますね！


```
あれ？あのUNIXコマンドなんだったっけな…という時の対処法

### やり方その1

`history 1000 | grep 検索したいコマンド`

`history`の次の節で、過去何件分を表示するか指定できます。

### やり方その2

`Ctrl-R`を押下した後に、検索したい文字列を入れると出てきます。