OmniAICreator/Qiita-1.07M huggingface dataset:
Bower + Grunt + Yeomanでつくるフロントエンド・ワークフロー 

## Bower + Grunt + Yeomanでつくるフロントエンド・ワークフロー
参考:
[Bower入門(基礎編) - from scratch](http://yosuke-furukawa.hatenablog.com/entry/2013/06/01/173308 "Bower入門(基礎編) - from scratch")
[Bower入門(応用編) - from scratch](http://yosuke-furukawa.hatenablog.com/entry/2013/06/04/085537 "Bower入門(応用編) - from scratch")
[[Grunt]Yeomanで開発ワークフローを楽にしよう[bower] ｜ Developers.IO](http://dev.classmethod.jp/etc/yeoman/ "[Grunt]Yeomanで開発ワークフローを楽にしよう[bower] ｜ Developers.IO")
[Yeoman を触ってみる - albatrosary's blog](http://albatrosary.hateblo.jp/entry/2013/05/13/124501 "Yeoman を触ってみる - albatrosary's blog")

### 現状の問題
* 開発環境
  - LiveReloadによるLESSコンパイルはしているが、bootstrap等のライブラリの管理は手動で行っている
  - 依存性の管理は、Rails側のAssets Compileで行っている(application.js)
* 本番環境
  - 同上

### 解決手段
#### Bower

    npm install -g  bower

Rubyでいうgem。

    bower install <libname>

--save オプションを付けると、bower.jsonに依存関係が記述されるので、基本的に付ける

    bower install bootstrap --save
    
#### Grunt

    npm install -g grunt

"JavaScript Task Runner"を名乗っている。SassやLESS、CoffeeScript、Haml等プリプロセッサのコンパイルが可能

    grunt

コマンドで、Gruntfile.jsに指示されたタスクを実行できる。

##### grunt-bower-task
Gruntを補助するレイアウトツール。

    npm install grunt-bower-task --save-dev

[Bower入門(応用編) - from scratch](http://yosuke-furukawa.hatenablog.com/entry/2013/06/04/085537 "Bower入門(応用編) - from scratch")を参考に、Gruntfile.jsに追記する。

    module.exports = function (grunt) { //の中に↓を入れる
```
   bower: {                                                                      
      install: {
        options: {
          targetDir: './app/assets/bower', //ライブラリの配置先のディレクトリ
          layout: 'byType', // レイアウト、説明は後述します
          install: true, //grunt実行時にbower installを実行するかどうか
          verbose: false, // ログの詳細を出すかどうか
          cleanTargetDir: true, // targetDirを削除するかどうか
          cleanBowerDir: false // bowerのcomponentsディレクトリを削除するかどうか
        }
      }     
    }     
```
    grunt.loadNpmTasks('grunt-bower-task');
    grunt.registerTask('default', ['bower:install']);

#### Yeoman

BowerとGruntを使って、テンプレートを作成するツール

    npm install -g yo

以下の手順で使う

##### 最も一般的な、generator-webappをnpmで追加
これ以外もたくさんのgeneratorテンプレートが、npm searchで見つけられる

    npm install -g generator-webapp 

##### generator-webappに設定されたファイル群が、bowerとgruntを使ってインストールされる
    yo generator-webapp
【python】web開発準備（仮想環境の構築）

せっかくpythonを勉強し始めたので、
フレームワークを使ってweb関連も覚えようと思い立った。

webフレームワークなんて、java関連の物くらいしか扱ったことないから、
pythonみたいな言語のスピード感あふれるフレームワークにすでに心が踊っている。

使用する候補に上がったのが、Pyramid、Flask、Djangoの3つ
いろいろ悩んだ結果、Pyramidを使うことにしました。

ちなみに環境はDebian 3.10.5-1 (LMDE）
python3.3で作業していきます

で、とりあえず[公式ドキュメント](http://docs.pylonsproject.jp/projects/pyramid-doc-ja/en/latest/index.html)に沿ってインストールから始めようとしたところで、

__「仮想の Python 環境を構築する」__

という見慣れないワードが目に飛び込んできた。

少し調べたところ、pythonの仮想環境を自由に作ったり消したりできる、見るからに便利そうな機能だそうだ。
こういう機能って常識なんだろうと思うと、自分の世界の狭さを反省させられる・・・。

とりあえずvirtualenvってのを導入すればいいみたいなので、ちゃちゃっと導入。


導入には[distribute_setup.py](http://python-distribute.org/distribute_setup.py)ってモジュールをダウンロードして実行


その後、下記コマンドでvirtualenvをインストール

```
$sudo easy_install virtualenv
```

とりあえずこれで仮想環境が作れるようになったらしい。
続きは後日。



------------------------------------------------------------
2014/1/31 追記
distribute_setup.py について。
元はsetuptoolsっていうのだったんだけど、しばらく更新がほっぽらかしになってたみたいで、
基本的にはsetuptoolsをforkしたdistributeを使えっていうことで、distributeを使ってる。

でも、これは去年くらいまでの話で、今はsetuptoolsとdistributeがマージされたみたいで、
setuptoolsの最新版を使用すればOKだと判明。

てことでこれから環境作る人は[setuptools](http://pythonhosted.org/setuptools/index.html)の最新版を使用したほうがいいかなあと。
GitHubのcontributionsをターミナルに表示してみた


### 成果物

![result.png](https://dl.dropboxusercontent.com/u/1971404/images/result-capture.png)

- https://github.com/luckypool/github-contributions-calendar

### 事の発端

GitHubでは、1年間のcommit数などのcontributionをグラフにしていますね。

↓こんなやつ

![capture.png](https://dl.dropboxusercontent.com/u/1971404/images/github-home.png)

こいつをターミナルで見れるようにしてみようと突如思ったので、やっつけてみました。

### どういうふうに実装したか

調べてみると

```
https://github.com/users/<username>/contributions
```

でデータが取得できるらしいです。（[参考](http://stackoverflow.com/questions/15978845/how-can-i-add-current-streak-of-contributions-from-github-to-my-blog)）

実際にGETでアクセスしてみると、下記のようなJSONが得られるようでした。

```
[["2013/01/27",2],["2013/01/28",2],["2013/01/29",0],["2013/01/30",0],["2013/01/31",0],...]
```

スクレイピングせずとも、こいつをゴニョゴニョすればいける・・・！

ってことで、あんまりrubyさわったことなかったので、練習がてらスクリプト書いてみた習作でした。

ちなみに、下記のgemを使いました。

- [mixlib-cli](http://rubygems.org/gems/mixlib-cli) - コマンドオプションのパーサー
- [rainnbow](http://rubygems.org/gems/rainbow) - 色付け
- [text-table](http://rubygems.org/gems/text-table) - テーブルの整形

会社ではPerlメインだったけど、Rubyも楽しいね！！
日本語で読める！tigに関する有用な記事リンク集

tigの日本語情報はまだあまり多くないので、筆者が見つけたtigに関連した有用な記事をまとめてみます。

# 概要・導入

* [git を CUI 環境で操作する tig が必須ツールだった](http://www.machu.jp/diary/20130113.html#p01)

> そこに、 tig というツールをインストールしてみたら、あまりに便利で驚いた。もうtigなしではgitを使えない。名前は前から知っていたのに、なんで今まで使っていなかったんだろう。

* [git? tig!](http://japan.blogs.atlassian.com/2013/05/git-tig/)

> 私はいつもこれを使っていますが、あまり使っている人がいないようなので、少し宣伝することにしました。ではなぜ tig はすごいのでしょうか？

> あなたが欲しい情報だけを表示するように調整した、素敵な git log コマンドを持ってますか？そのアウトプットを tig にパイピングするだけで、きれいに色づけし、前後に簡単にスクロールできるようします。

* [CUI な Git ブラウザ tig を入れてみた](http://blog.yuyat.jp/archives/557)

> Vim に近い操作感で使えるのが Vim 使いには非常に嬉しいところです。以下で、インストール方法と基本操作について紹介します。

* [Tig(text-mode interface for git)を使う | Kwappa研究開発室](http://randd.kwappa.net/2010/11/15/187)

> twitterで流れてきたリンクに、CUIからgitを使うためのツールについての情報があった。早速試してみたらかなり便利だったので紹介してみる。

* [git - tigの画面をアニメGIFで紹介してみる（ブラウズ編）](http://qiita.com/yoshikazusawa/items/93653a6aa2013b3c3396)

> tigの操作のうち、リポジトリを探索する時に使う画面をお見せします。

* [gitの新人研修でtigを使うことをおすすめする理由](http://qiita.com/yoshikazusawa/items/e7f6ab2c416ad37d9f90)

> 新人研修の中でgitを教える際に、筆者はtigの活用をおすすめしています。
講師の立場からすれば、短い時間に高効率でgitの本質を伝えることができます。
研修生の立場では、tigを利用して簡単で直感的にgitリポジトリを閲覧・操作することができます。

* [tigでgitをもっと便利に！ addやcommitも](http://qiita.com/suino/items/b0dae7e00bd7165f79ea)

> tigは、コンソール上で使えるgitブラウザです。実はずっと、ただのきれいなgit logだと思っていたのですが、本当はそんなことはありません。かなり使えるやつなのです。

# 使い方のtips

* [Tig の表示方法あれこれ](http://qiita.com/tyabe/items/4ce9918b6dd6971d60e4)

> README.rdoc ファイルの、直近 1 週間のリビジョンを表示:
> 2つのブランチ間の差を表示:

* [git blameを再帰的に行う](http://qiita.com/awakia/items/7c6899a7c42cd93ba218)

> ある行の変更がどういう経緯でなされたか知りたい時に。
リファクタリング等々の原因でgit blame一発では知りたいChangeに辿りつけないことありますよね。


# カスタマイズ

* [gitのログ確認をより便利にするtigについて改めて](http://blog.kyokutyo.com/git/git%E3%81%AE%E3%83%AD%E3%82%B0%E7%A2%BA%E8%AA%8D%E3%82%92%E3%82%88%E3%82%8A%E4%BE%BF%E5%88%A9%E3%81%AB%E3%81%99%E3%82%8Btig%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E6%94%B9%E3%82%81%E3%81%A6/)

> (今回調べて知ったことだけ)
・2ペイン時にフォーカスを移動する: Tab (毎回qで閉じてたや)
・検索: / (検索できたのね、、)

* [tigのキーバインドを変更して高速に大量のgitログを確認する](http://hiroki.jp/2012/05/30/4182/)

> そこで、CUI専用のgitリポジトリブラウザである「tig」を試したところ、めちゃくちゃ高速に大量のコミットログと差分を確認できました。

> 効率的に閲覧するためにキーバインドを変える設定などをしました。

> みなさんも日頃の大量のコミットを見る人は、こうすると捗ります。

* [やけに丁寧なtigの設定ガイド（表示制御編）](http://qiita.com/yoshikazusawa/items/d99e8b5d6f6a45aa6e2e) 

> .tigrcをいじると色々なカスタマイズができますが、一度に多くの設定を書いてしまうと、
何が変わったかわかりづらかったり、変更の利点が曖昧になる時もあると思います。
そこで本記事では、.tigrcに関して筆者がオススメする4つの表示制御設定を紹介します。

* [tig でいま見ているコミットをブラウザで開く](http://blog.kyanny.me/entry/2012/07/22/033134)

> tig で Git リポジトリのログを読んでるときに「このコミットのページをブラウザで見たい！でもコピペするのは面倒だ！」と思ったので o 押したら開くようにした。

* [やけに丁寧なtigの設定ガイド（キーバインド概論編）](http://qiita.com/yoshikazusawa/items/3eaa6db78fa348d38bfe)

> まず試しに以下のキーバインドを設定してみましょう。これは筆者が強くオススメする設定です。

* [.tigrcにコピペして使える！tigカスタムキーバインド紹介（mainビューとbranchビュー編）](http://qiita.com/yoshikazusawa/items/c3eb0e299e6d96850c75)

> やけに丁寧なtigの設定ガイド（キーバインド概論編） の続きで、筆者がよく使っているキーバインドを紹介します。
> .tigrcにコピペすればすぐに使えます。


以上です。他にも良い記事があればぜひ教えてください。
Firefoxのブラウザのタイムアウト時間を設定する

Firefoxを使っていて、サーバ側の処理はタイムアウトせずに終了してるはずなのにブラウザで描画が始まらずずっとクルクルしている。
なんて状態のときはブラウザ側でkeep-aliveがタイムアウトしているかもしれません。
そこで、Firefoxではタイムアウトする時間の設定が出来ます。

1.URLバーにabout:configを入力する

2.「最新の注意を払って使用する」ボタンをクリック

3.検索バーに「network.http.keep-alive.timeout」を入力し検索

4.default値が「115」（秒）になっているので任意の値に変更

以上でFirefoxがkeep-aliveをタイムアウトさせる秒数を設定する事が出来ます。
CentOS6.xでbundle installが遅い場合の対処



あんまり遅いので調べたところ、こんな方法がありました。

```/etc/resolv.conf
; generated by /sbin/dhclient-script
nameserver 10.0.2.3
#以下を追記
options single-request-reopen  
```

これだけでかなり違います。
カラムの最大値？ - MAX()関数の謎

さて、何故でしょうか？

```
mysql> select hoge_id from gao;
+---------+
| hoge_id |
+---------+
| 1       |
| 2       |
| 3       |
| 4       |
| 5       |
| 6       |
| 7       |
| 7       |
| 9       |
| 10      |
| 11      |
| 12      |
| 13      |
| 1       |
| 15      |
| 16      |
| 17      |
| 18      |
| 19      |
| 20      |
| 21      |
| 22      |
| 23      |
| 24      |
| 25      |
| 26      |
| 27      |
| 28      |
| 29      |
| 30      |
| 31      |
| 32      |
| 33      |
| 34      |
| 35      |
| 36      |
| 10      |
+---------+
37 rows in set (0.00 sec)

mysql> select max(hoge_id) from gao;
+--------------+
| max(hoge_id) |
+--------------+
| 9            |
+--------------+
1 row in set (0.00 sec)
```
Androidアプリエンジニア入門のログ (1日目)


iPhoneしか使ったことないのびー氏が、Andoridの勉強を始めたらしいよ!!
せっかくなのでログをとりつつがんばります。

1日目はとにかく、ゼロベースからどこまで行けるか。

## 前提
 - Mac OS Lion
 - Eclipse未インストール

## やったこと

### 環境構築
 - 参考文献発見
   - http://gihyo.jp/dev/serial/01/androidapp/0002

 - android SDKを落としてくる
 - よくわからんけど、Eclipseっていうものも一緒に落ちてきたので、それを使うことにしてみる
 - よくわからんけど、SDKと一緒に落としてきたんだから、Eclipseとの連携はできてると判断
 - SDKのtoolsにパスを通す (.bashrc書き換え)
 - とりあえずストレージ容量めちゃくちゃ持って行かれたので、手元のファイル整理。

### エミュレーターを出そう
 - Android Virtual Device Managerより、仮想端末作ってみて起動 → 起動途中で止まる
   - なんかAndroid Emulatorってむちゃくちゃ遅いって聞いたことある → 速いやつを導入しよう
 - Intel HAXM (Hardware Accelerated Execution Manager)
   - http://www.webtech.co.jp/blog/developer-news/5966/
 - それでも遅いきがするけど…とりあえず起動! ヽ(=´▽`=)ﾉ
 - やっぱでも、実機で進めた方が現実的っぽいなー
 - **あとでログ見たら、HAXMが有効になってなかった説もあるので、また今度調べる**

### サンプルコードを動かしてみよう
   - スケルトンというやつがなかなか見つからなかったり
   - Create project from existing sourceから
   - 見つからないと思ったらインストールしてなかったり
   - なんか気づかないうちに実機で実行してたりして焦ったけど動いた

### Logを埋め込んでみて、Activityについてちょっと勉強
  - AndroidアプリのコードにおいてActivityはすごく大事らしい
  - 要するに、メモリを司ってるものって感じかしら
  - frontに出ている状態から、ホーム画面に戻ると ```onPause```、再開すると ```onResume``` が発生するらしい
  - これらは、Android SDKのActivityクラスがもともと備えているメソッドらしい。
  - 自作アプリは、このActivityを継承しつつ、この ```onPause``` とか ```onResume``` とかをoverride & superする感じ。

### デバッグ中はDDMSという画面を出しとくといい
 - Eclipseと別のアプリケーションとして存在してるみたいだけど、Eclipseのperspectiveというものにも乗っけられる
   - http://www.javadrive.jp/android/debug/index1.html
 - エディタとしてはやっぱりEclipse気に喰わないので、基本このDDMSモードで起動しとくのがいいんじゃないかと思った
 - ```Log.d``` の、第1引数はタグ・第2引数がメッセージ
  - ```Log``` には他に、エラーログを出す ```Log.e``` とかもあるみたいだけど、この (タグ, メッセージ) のルールは変わらない模様


### リソース管理について

> - 1画面，1アクティビティとする
> - 強制終了される前提でリソースを扱う
> - アクティビティを跨いでリソースを使用しない

らしい。

- http://gihyo.jp/dev/serial/01/androidapp/0004?page=2

### Viewをつくる
 - [File] -> [New] -> [Android XML File]から、レイアウトを定義するXMLファイルをつくる
 - Activityの方のコードの ```onCreate``` で、```setContentView(R.layout.#{レイアウト名})``` とすると、そのレイアウトが適用される
 - 画面遷移するときには、 ```Intent``` というものを介している。(あんまりわかってない)
   - Intentを通して、画面間でデータをやりとりすることもできる。( ```intent.putExtra```, ```intent.getExtra``` )
 - どうも ```R``` は、resource(ディレクトリで言うとres)を指してるっぽい
   - resに置いたxmlで定義しているモノは、 ```R``` のプロパティからとってくる感じ


### GENYMOTIONとな!?
 - 通りすがりの[@hilotter](http://twitter.com/hilotter)さんが **GENYMOTION** という単語を置いていったのでインストールしてみた
 - むっちゃはやいAndroidエミュレーターであった…!
   - [Genymotion](http://www.genymotion.com/)
   - [Genymotion で Android の超爆速エミュレータ環境を構築する | アドカレ2013 : SP #6 ｜ Developers.IO](http://dev.classmethod.jp/smartphone/android/genymotion-install/)
 - ちゃんとEclipseとの連携もできた
   - ちなみに、Eclipse側のエミュレーターを使う時と違って、GENYMOTIONの端末を起動すると、Eclipse側からその端末は **実機として** 認識されるみたい
   - こいつを選択してRunすればよい
terminus詳しい方がいれば、助けてください。

#terminusとcapybaraでサイト自動操作について

rubyでブラウザーの自動操作をしたいのですが、
ネットでいろいろ調べた結果、terminusがとてもかっこいいです。
一部のデモが下記のURLでみれます。
http://vimeo.com/26649163

本家サイトは下記の通りです。
http://terminus.jcoglan.com/

ただ、ネット上関連情報が少なく、rubyの初心者にとって環境構築しにくいです。
どなたか興味があれば、ぜひ試してみてください。

良かったら、環境構築の情報もぜひ公開してください。

ちなみに、私がgem install terminusインストールした後に、
コマンドラインでterminusを入力したら、下記のエラーが表示されています。

```
/Users/username/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/terminus-0.6.0/lib/terminus/server.rb:5:in `<top (required)>': uninitialized constant Thin::Logging (NameError)
	from /Users/username/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/terminus-0.6.0/lib/terminus.rb:50:in `create'
	from /Users/username/.rbenv/versions/2.0.0-p0/lib/ruby/gems/2.0.0/gems/terminus-0.6.0/bin/terminus:16:in `<top (required)>'
	from /Users/username/.rbenv/versions/2.0.0-p0/bin/terminus:23:in `load'
	from /Users/username/.rbenv/versions/2.0.0-p0/bin/terminus:23:in `<main>'
```
備忘:cURLppを使ってみた

C++のHTTPクライアントライブラリのcURLpp(cURLのC++ラッパ)を使ってみたので、
[curlpp を使ってみる - GET 編 - 私の日常](http://tsuyuguchi.com/masaaki/mt/archives/2007/10/21-1416.php)を参考(そのまま)にサンプルコードを作ってみた。

```C++:curlpp_exam.cpp
#include <curlpp/cURLpp.hpp>
#include <curlpp/Easy.hpp>
#include <curlpp/Options.hpp>
#include <iostream>

using namespace std;
using namespace cURLpp::Options;

class CurlExam {
public:
        string m_content;

        bool get(const string &url)
        {
                try {
                        cURLpp::Cleanup cleaner;
                        cURLpp::Easy    req;
                        req.setOpt(new Url(url));
                        req.setOpt(new WriteFunction(
                                cURLpp::Types::WriteFunctionFunctor(this, &CurlExam::writeMemoryCallback))
                        );

                        req.perform();
                } catch (cURLpp::LogicError & e) {
                        return false;
                } catch (cURLpp::RuntimeError & e) {
                        return false;
                }
                return true;
        }

private:
        size_t writeMemoryCallback(char *pstr, size_t size, size_t nmemb)
        {
                size_t allsize = size * nmemb;

                m_content.append(static_cast<const char *>(pstr), allsize);

                return allsize;
        }
};

int main(void)
{
        CurlExam cx;
        bool ret;

        ret = cx.get("http://blog.alaif.net/");
        if (ret) {
                cout << cx.m_content;
        }

        return ret;
}
```

ビルドは、

``
clang++ -I/usr/local/include -L/usr/local/lib -lcurl -lcurlpp curlpp_sample.cpp -o curlpp_sample
``

で。

うん、簡単にできるもんだ。

次は、C++11の機能も使って書いてみよう。
MacVim-KaoriYa インストールの雑多な流れ

#(個人的)MacVim環境構築メモ


##MacVim-KaoriYaをインストール

(1)Macvim.appをApplicationにつっこむ
(2).bashrcに以下の内容を追加

    alias vi='env LANG=ja_JP.UTF-8 /Applications/MacVim.app/Contents/MacOS/Vim "$@"'
    alias vim='env_LANG=ja_JP.UTF-8 /Applications/MacVim.app/Contents/MacOS/Vim "$@"'

(3).vimrcと.gvimrcと.vimファイルを同じくホームディレクトリに作成
(4)お好みに合わせて.vimrc .gvimrcを編集。

これでターミナルからMacVim-KaoriYaを起動できる

##カラースキーム

カラースキームはSolarizedを使用

Solarized:https://github.com/tomislav/osx-terminal.app-colors-solarized

(1)Solarizedをダウンロード
(2)ターミナルの環境設定/設定タブ/左下の歯車/読み込み でSolarizedを読み込む
(3)起動タブの起動時に開く:でSolarizedを設定してあげる。デフォルトにしておく
(4).vimrcで設定してあげる

    syntax enable
    set background=dark
    colorscheme solarized
    let g:solarized_termcolors=256

##フォント
フォントはRictyを使用する。
ライセンスの関係でTrueType形式での配布がなくなったので
自分で材料を用意してあげる必要があるらしい。

このサイトを参照した
http://knagayama.net/blog/2011/07/27/generate-ricty-font/

以上で環境が構築できた
ステータスバーの通知アイコンを非表示にする


##やりたいこと
常駐するサービスでForeground属性を使うため、Notificationを指定している。
ステータスバーへのアイコン表示は目立つため、できるなら消したい。

以前は空のNotificationインスタンスを渡すと、Foreground属性を指定していても通知領域には表示されなかった。


最近のAndroidだと、空のnotificationをForeground属性の指定に利用するとシステムが自動生成するnotificationが表示される。(Nexus5で確認)

(参考:iBattery)
![status_bar_icon.png](https://qiita-image-store.s3.amazonaws.com/0/20559/146862d3-d9a8-2b85-8d96-286b2897b138.png "status_bar_icon.png")
![notification_sample.png](https://qiita-image-store.s3.amazonaws.com/0/20559/25c12e1c-072c-6823-8755-f6ce2956facf.png "notification_sample.png")

この記事では、通知欄からNotificationを消すことはできないが、ステータスバーへの通知は見えないようにする方法を紹介します。
(ユーザが嫌がるのはステータスバーに常に表示されてることだと思う...)

##やること
実現するためにやることは２つです。

* 通知アイコンを透明にする
* ステータスバー上の表示位置を右側によせる

##通知アイコンを透明にする
これは簡単でNotification.Builder#setSmallIcon()に透明なdrawableを渡せばいいです。

res/drawable/ic_stat_transparent.xml

```xml:ic_stat_transparent.xml
<?xml version="1.0" encoding="utf-8"?>
<color xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="#00000000" >
</color>
```
このままだと通知欄を展開した時のアイコンも透明のままなので、ランチャーアイコンなどのBitmapをNotification.Builder#setLargeIcon()で指定します。

```java:Sample
Drawable largeIconDrawable = getResources().getDrawable(R.drawable.ic_launcher);
Bitmap largeIconBitmap = ((BitmapDrawable)largeIconDrawable).getBitmap();

notificationBuilder.setLargeIcon(largeIconBitmap);
```

##ステータスバー上の表示位置を右側によせる
ステータスバー上のアイコンの位置はAPI 16から用意されているNotificationのPriority指定である程度操作することができます。

Notification.Builder#setPriority(int pri)で設定できます。
用意されている定数は
PRIORITY_MAX = 2
PRIORITY_HIGH = 1
PRIORITY_DEFAULT = 0
PRIORITY_LOW = -1
PRIORITY_MIN = -2
の5つです。
数値が大きいほど左側に表示されるので、PRIORITY_MINを使います。

```java:Sample
// API 16以上のみ指定する
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN) {
    notificationBuilder.setPriority(Notification.PRIORITY_MIN);
}
```

これで透明な通知アイコンが一番右側に表示されるので、通知アイコンが見えないようになりました。

通知欄からも消せたらベストだけど、さすがにそれはできなさそう...
二分木を線型時間でリストにする４つの方法

要素数nの二分木を最悪計算量O(n)でリストへと平坦化 (flatten) する方法を4つ紹介する．

二分木は次のものを使う．

```hs:definition
data Tree a = Leaf | Node (Tree a) a (Tree a)
```
実験する場合は，次を使うといいと思う．

```hs:experiment
lefttree, righttree, perfecttree :: Int -> Tree Int
lefttree 0 = Leaf
lefttree n = Node (lefttree (n-1)) n Leaf
righttree 0 = Leaf
righttree n = Node Leaf n (righttree (n-1))
perfecttree 0 = Leaf
perfecttree n = Node (perfecttree (div n 2)) n (perfecttree (div n 2))
```

```bash:bash
> length $ flatten $ righttree 100000
100000
> length $ flatten $ lefttree 100000
100000
> length $ flatten $ perfecttree 100000
131071
```

まずは愚直解．最悪計算量は，木が完全に左に偏っている場合で O(n^2)．

```hs:naive
flatten :: Tree a -> [a]
flatten Leaf = []
flatten (Node l x r) = flatten l ++ [x] ++ flatten r
```

ではさっそく，最悪計算量がO(n)である実装を見ていこう．

1番目は，差分リストを使う方法．

```hs:dlist
flatten :: Tree a -> [a]
flatten t = toList (go t)
  where
    go :: Tree a -> DList a
    go Leaf = fromList []
    go (Node l x r) = go l ++* fromList [x] ++* go r

type DList a = [a] -> [a]
fromList :: [a] -> DList a
fromList xs = (xs ++)
toList :: DList a -> [a]
toList dxs = dxs []
(++*) :: DList a -> DList a -> DList a
(++*) = (.)
```

2番目は，蓄積変数を使う方法．本質的には差分リストを使う方法と変わらないが，オーソドックスなテクニックだといえる．山本和彦氏がTwitterで教えてくださった．

```hs:accum
flatten :: Tree a -> [a]
flatten t = go t []
  where
    go Leaf xs = xs
    go (Node l x r) xs = go l (x : go r xs)
```

3番目は，差分リストを脱関数化する方法．http://h2.jaguarpaw.co.uk/posts/demystifying-dlist/ に載っていた．

```hs:demystify
flatten :: Tree a -> [a]
flatten t = toList (go t)
  where
    go :: Tree a -> TList a
    go Leaf = fromList []
    go (Node l x r) = go l ++* fromList [x] ++* go r

data TList a = Tip [a] | Branch (TList a) (TList a)
fromList :: [a] -> TList a
fromList = Tip
toList :: TList a -> [a]
toList (Tip xs) = xs
toList (Branch (Tip xs) t) = xs ++ toList t
toList (Branch (Branch l r) t) = toList (Branch l (Branch r t))
(++*) :: TList a -> TList a -> TList a
(++*) = Branch
```

4番目は，不思議な方法．おそらく一番美しい方法．3番目をヒントに思い付いた．O(n)になることを確認してほしい．

```hs:wonder
flatten :: Tree a -> [a]
flatten Leaf = []
flatten (Node Leaf x t) = x : flatten t
flatten (Node (Node l x r) y t) = flatten (Node l x (Node r y t))
```
シンプルな問題でも本当に奥が深い．
jQueryMobileでtitleタグが勝手に変換される問題

やられた......
jQueryMobileでtitleタグが勝手に書き変わる事に気づかず、SEOがぁぁぁ！
ってハマった問題。

■titleタグが書き換わるケース

```html
<section data-role="page">
<header data-role="header">
<h1><?php bloginfo('description'); ?></span></h1>
</header>
</section>
<section data-role="content">
・・・・・・
</section>
```

■data-role="content"でheaderを内包すればOK

```html
<section data-role="page">
<section data-role="content">
<header data-role="header">
<h1><?php bloginfo('description'); ?></span></h1>
</header>
</section>
</section>
```
node.jsで正規分布のサンプリング

一様分布変数から正規分布を得るには一般的にはBox-muller法を用いる

[Box-muller法](https://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%EF%BC%9D%E3%83%9F%E3%83%A5%E3%83%A9%E3%83%BC%E6%B3%95)

Scratchから書いても良さそうだけれど、npmには便利なライブラリが用意されている


[box-muller @npm](https://npmjs.org/package/box-muller)

使い方は簡単

## install

```
$ npm install bux-muller
```

## sampliing

```
var generator = require('box-muller');

var sample = generator();
// sampleには標準正規分布N(0, 1)に従う分布からサンプリングされた値が入る
```
マルチスクリーンWebアプリケーション開発のためのjQueryプラグイン"jQluster"をリリース

"jQluster"と名付けたjQueryプラグインをリリースした。

- http://d.hatena.ne.jp/debug-ito/20140126/1390723187

普通のjQueryは自分のHTMLページのDOMオブジェクトを操作したりするのに使うけど、jQlusterを使うと **よそのブラウザで開いているページ** のDOMオブジェクトを操作できるようになる。

jQlusterを使ったサンプルアプリはこちら。

- http://jqlusterdemo-debugito.rhcloud.com/

このように、複数のページやWebブラウザが連携するWebアプリケーションをjQueryと似たような感覚で作ることができる。
JuicyPixelsで画像を縮小

開発中のWebアプリより抜粋。

```haskell
import Codec.Picture

bilinear :: (Integral (PixelBaseComponent a), Pixel a) => a -> a -> a -> a -> Float -> Float -> a
bilinear p q r s u v = mixWith (f v) (mixWith (f u) p q) (mixWith (f u) r s) where
        f t _ x y = floor $ fromIntegral x * (1 - t) + fromIntegral y * t

resize ::  (Integral (PixelBaseComponent a), Pixel a) => Int -> Int -> Image a -> Image a
resize w h img@(Image w0 h0 _) = generateImage f w h where
    f x y = let x' = fromIntegral x / fromIntegral w * fromIntegral w0
                y' = fromIntegral y / fromIntegral h * fromIntegral h0
            in bilinear
                (pixelAt img (floor x') (floor y'))
                (pixelAt img (floor x' + 1) (floor y'))
                (pixelAt img (floor x') (floor y' + 1))
                (pixelAt img (floor x' + 1) (floor y' + 1))
                    (x' - fromIntegral (floor x'))
                    (y' - fromIntegral (floor y'))
```
『アルゴリズムを、はじめよう』読み始め

あまりにも自分の知識が不甲斐ないので、簡単なところから始めなければ続かないかもと心配になったので、伊藤静香『アルゴリズムを、はじめよう』を読むことにしました。

これまで写経だけでは分からなかった仕組みが丁寧に書いてあって、実に分かりやすい。しかし、一方で本気のアルゴリズムが始まると、書かれていることは分かるような気がするけど、動かしてみないと不安だ。

これをRubyで動かせるようになったら上達もするし、不安も解消されるのではないか、と明日からやってみることにした。流れ図がきちんと書かれているので、リファレンスを引きながらならなんとかできるだろう、と。

なお、扱われているのは、
・線形探索法
・二分探索法
・ハッシュ探索法
・単純選択法
・単純交換法
などなど。
[Bower] bower_components ディレクトリはgitで管理すべきか問題


`bower`は`gem`や`composer`と違って`*.lock`ファイルがありません。

`bower`を利用した際に実ファイルが`bower_components`ディレクトリに保存されますが、

`git`で管理すべきか？という話。

## `bower_components` は管理しなくても良い

結論を言うと __管理しなくてよい__ です。

しかし実際`bower`を使っていると、たまに依存が解決できない時があります。

```bash:
Unable to find a suitable version for jquery, please choose one:
    1) jquery#>=1.8.0 <2.1.0 which resolved to 2.0.3 and has bootstrap#2.3.2 as dependants
    2) jquery#>=1.7 which resolved to 2.1.0 and has bootstrap-select#1.3.7 as dependants
    3) jquery#>=1.9.0 which resolved to 2.1.0 and has bootstrap-switch#2.0.1 as dependants
```

その際には`bower`がどれを採用するかを聞いてきて、人間が指定して依存を解決します。

しかしこれだけでは、`bower_components`ディレクトリをバージョン管理していない場合に同じことが起こります。

この現象に出くわすと`bower_components`をバージョン管理したくなりますが、必要ありませんでした。

## resolutions

`bower.json`の`resolutions`にパッケージのバージョンをあらかじめ書いておく事で、コンフリクトを起こさずに済みます。

```js:bower.json
{
    "resolutions": {
        "jquery": "1.8.3"
    }
}
```

バージョンを指定するだけなので、`composer.lock`のようなgitのコミットハッシュより安心感は無いですが、依存を毎回手動で解決する必要はなくなります。

どうしてもこのコミットじゃなければだめだ！という場合以外は、`resoltions`を指定する事で解決できます。

> bowerが依存解決を聞いてきた時に、`!`を前に付けて返事をすると自動的に`bower.json`が更新されます。
> 例: `!2`

bowerの返事をよく読んでなかった＆調べてもあんま出ないのでモヤッとしてました。笑
weblocファイルを作るワンライナー


Firefoxからはドラッグアンドドロップでweblocファイルを作れないので、Terminal.appでクリップボードに入っているURLを開くweblocファイルを作る。

```ワンライナー
pbpaste | sed 's/.*/{URL="&";}/' | plutil -convert xml1 -o tmp.webloc -
```

## くどい解説
1. クリップボードからURLを取り出す
2. `sed`で json にする
3. `plutil`で xml の plist に変換する
4. "tmp.webloc" というファイル名で保存
rubocopのdisableに設定するクラス名の一覧


> 2014.09.12 
下記のQiita記事のほうがより詳細ですので、そちらの参照をおススメします。
[RuboCopの警告をコメントで無効化する方法](http://qiita.com/tbpgr/items/a9000c5c6fa92a46c206)

概要：rubocopでdisableに設定したいが、設定するクラス名がわからない
解決策：`rubocop -D`または`rubocop --display-cop-names`

下記の例では2つのクラスが見える。

- EmptyLines
- LineLength

```Bash
Inspecting 3 files
C..

Offences:

app.rb:10:1: C: EmptyLines: Extra blank line detected.
app.rb:11:91: C: LineLength: Line is too long. [97/90]
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
                                                                                          ^^^^^^^

3 files inspected, 2 offences detected
```

---

ほか、`rubocop -fo`または`rubocop --format offences`だと下記の結果

```

1  LineLength
1  EmptyLines

```
Jettyを組み込んだall in one jarを作成する

備忘録。細かいところで過不足あるかも。

# sbt
sbt-assemblyプラグインを指定

```scala:plugins.sbt
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.10.2")
```

ビルド定義ではJettyを依存ライブラリに追加して、sbt-assemblyの設定

```scala:build.sbt
import sbtassembly.Plugin._
import AssemblyKeys._

libraryDependencies ++= Seq(
  "org.eclipse.jetty" % "jetty-webapp" % "8.1.8.v20121106" % "compile;container",
  "org.eclipse.jetty.orbit" % "javax.servlet" % "3.0.0.v201112011016" % "compile;container;provided;test" artifacts (Artifact("javax.servlet", "jar", "jar")))

assemblySettings

jarName in assembly := "xxx.jar"

mainClass in assembly := Some("JettyLauncher")

assemblyOption in assembly ~= { _.copy(includeScala = true) }
```

# アプリ
Basic認証つきのランチャobjectを作成する。

```scala:JettyLauncher
object JettyLauncher {
  def main(args: Array[String]) {
    val server = new Server(8080)
    val context = new WebAppContext()
    context setContextPath "/"
    context.setResourceBase("/src/main/webapp")
    // ↓scalatra前提
    context.addEventListener(new ScalatraListener)
    context.addServlet(classOf[DefaultServlet], "/")
    context.addServlet(new ServletHolder(new MyDefaultServlet), "/css/*")

    val securityHandler = new ConstraintSecurityHandler()
    val constraint = new Constraint()
    constraint.setName(Constraint.__BASIC_AUTH)
    constraint.setRoles(Array[String]("user"))
    constraint.setAuthenticate(true)
    // mappings
    val mapping = new ConstraintMapping()
    mapping.setPathSpec("/")
    mapping.setConstraint(constraint)
    securityHandler.setConstraintMappings(Array[ConstraintMapping](mapping))
    // login service
    val loginService = new HashLoginService()
    loginService.putUser("XXX", new Password("yyy"), Array[String]("user"))
    securityHandler.setLoginService(loginService)
    // authenticator
    val authenticator = new BasicAuthenticator()
    securityHandler.setAuthenticator(authenticator)
    // set Security
    context.setSecurityHandler(securityHandler)

    server.setHandler(context)

    server.start
    server.join
  }
}

class MyDefaultServlet extends DefaultServlet {
  override def getResource(resourceString: String): Resource =
    {
      val url = this.getClass().getResource(resourceString)
      Resource.newResource(url)
    }
}
```

# ビルド

```shell-session:ビルドコマンド
sbt assembly
```

# 起動

```shell-session:起動コマンド
java -Xmx2048M -cp ./xxx.jar JettyLauncher
```
# Docker初心者が、CentOSでアレした手順を書いてみた

<img src="https://www.docker.io/static/img/homepage-docker-logo.png">

CentOS 6.5からでDockerが使えるようになったらしい！

Docker はひとつの Linux システムの上で、複数の Linux システムを動かすためのソフトウェアらしいです。
システムの分離には Linux Containers (LXC) を、ファイルシステムまわりには Advanced multi layered unification filesystem (Aufs) をつかっているとのこと。。（この辺りは僕のレヴェルではまだまだ理解できない。）

とりあえず、centOS上にcentOSを立てれる！やってみよう

### Mac

今回はvagrantを使ってます。
vagrantは普段から使ってるので余裕です( ｰ`дｰ´)ｷﾘｯ

```
$ vagrant init opscode-centos65 http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box
$ vagrant up
$ vagrant ssh
```

centos6.5のboxをダウンロードして、立ち上げて、sshして

## CentOS

次はCentOS上での手順などなど

### インストール

```
$ cd /usr/local/src/
$ sudo su
$ rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm を取得中
警告: /var/tmp/rpm-tmp.ig0t00: ヘッダ V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
準備中...                ########################################### [100%]
   1:epel-release           ########################################### [100%]

$ yum -y install docker-io
$ chkconfig docker on
$ service docker start
Starting cgconfig service:                                 [  OK  ]
Starting docker:	                                   [  OK  ]
```

### Docker で Hello World

ではさっそく Docker を試してみましょう。Docker 公式の centos イメージを使って、コンテナ内で echo を実行してみます。

```
$ docker run centos /bin/echo "Hello World"
Unable to find image 'centos' (tag: latest) locally
```

初回はcentosのイメージが見つからないから時間がかかります。

```
Pulling repository centos
539c0211cd76: Download complete 
```

おわったぁぁぁぁ。（僕の場合は３分程度）

```
Hello World
```

こんにちは！！

/bin/bashを実行したら、コンテナ内でシェルが起動する

```
$ docker run -i -t centos /bin/bash
bash-4.1# exit
exit
```

たしかに。

## 参考
http://www.1x1.jp/blog/2013/12/docker_on_centos65.html
MFCプログラミング：エラーメモ

VC++のMFCでプログラム作成中に出たエラーのメモ。

##画像保存場所
すごい初歩的なことだと思うんですが…
CImageによる画像表示をしようとすると、エラーが出て表示できませんでした。実は、

```cpp
img.Load("C:\\Users\\hoge\\Documents\\Visual Studio 2008\\Projects\\test_hoge\\test_hoge\\hogehoge.jpg");
```

こんな所に画像保存していたり。

```cpp
img.Load("C:\\Users\\hoge\\Documents\\Visual Studio 2008\\Projects\\test_hoge\\test_hoge\\res\\hogehoge.jpg");
```

こうするとエラーが出なくなりました。どうも保存場所がよくなかったようで…

##実行時のエラー
２枚の画像を重ねて表示しようとすると、コンパイルは通ったのに実行時にエラーが発生。
調べても原因が分からなかったので、コメントアウトで原因探しをすると…

```cpp
myDC.CreateCompatibleDC(pDC);
```

どうもこれを２度呼び出したのが原因みたいです。

##ダイアログ表示時に文字列を表示する
ネットで調べるとボタンをクリックして表示する、というものが多かったので。
ダイアログを表示した際に文字列を表示する方法でだいぶ詰まってました。

・スタティックテキストやエディットボックスなど文字列の表示できるコントロールを用意
・カテゴリ「Value」でコントロール変数を作成（CString型）
・表示先で、作成するダイアログのクラスのインスタンスを生成
・コントロール変数に文字列を代入
・ダイアログを呼び出す

```myDlg.h

class CmyDialog : public CDialog
{
public:
    CString m_ss;  //Valueカテゴリのコントロールメンバ変数
}
```

```MeinDlg.cpp
CmyDialog dlg;
CString ss;

ss = _T("文字列を表示します");

dlg.m_ss = ss;
dlg.DoModal();
```
コンソールプログラムをMonoインストールなしで実行する


##Problem
コンソールプログラムをXamarin Studioで作ってコンパイルすると出来上がるのは.exeです。Windowsならそのまま，OSXやLinuxなら `mono xxx.exe` として実行することとなります。
Monoインストール環境ならシェルスクリプトでラップしてあげればいいですが，業務アプリとかはなかなかそういうわけにはいかなかったり。
検証はOSX10.8, 10.9で行っています。

##Solution
まずは `mkbundle` です。こんな感じで実行します。DLLを使ったりするときは別にオプションが必要ですがそこはGoogle先生に…

`mkbundle -o [output] [source.exe] --deps`

事前にお膳立てが必要で，以下のような環境変数が必要です（Mac）。

```mkbundle向け環境変数
export PKG_CONFIG_PATH=/Library/Frameworks/Mono.framework/Versions/Current/lib/pkgconfig
export AS="as -arch i386"
export CC="clang -arch i386 -mmacosx-version-min=10.6"
```

exeを投入してmkbundleを実行すると，clangやらなんやら実行されてUnix Executableが出来上がります。これを `otool -L` します。出力はプログラムによりますが以下のような感じです。

```
% otool -L test
test:
	/Library/Frameworks/Mono.framework/Versions/3.2.5/lib/libmonoboehm-2.0.1.dylib (compatibility version 2.0.0, current version 2.0.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
```

本当は `mkbundle --static` があるんですが，どうにもうまく動かない。挙げ句mkbundle.csを修正して再コンパイルしろと言われる始末。それはちょっと手間だし，静的リンクさせてしまうとLGPLが強制されて困る場面も多々ありそう。
そこで実行ファイルと同じフォルダからdylibを読み込むように設定します。`install-name-tool` です。こうです。

```install_name_tool
install_name_tool -change /Library/Frameworks/Mono.framework/Versions/3.2.5/lib/libmonoboehm-2.0.1.dylib @executable_path/libmonoboehm-2.0.1.dylib [source]
```

これでもう一度 `otool -L` すると参照先が変わっているかと思います。実行ファイルと同じフォルダにdylibをコピーして配布すれば動く，はずです。

##A bit more...
それなりに簡単に単体実行ファイルを作り出すことができます。Windowsでも同じように.NET Frameworkのない環境で動作するファイルを作れますが，そんな環境はあるのでしょうか。考えなくともよさそうです。

Xamarin Studioでビルド時にこの動作を行うように設定しておくとそれなりに便利です。こんな感じです。
![Screen Shot 2014-01-27 at 18.26.34.png](https://qiita-image-store.s3.amazonaws.com/0/34563/2b1817aa-5662-a4ad-9524-79ea2a81f210.png "Screen Shot 2014-01-27 at 18.26.34.png")

```mkbundle -o ${ProjectName} --deps -z ${TargetFile};
install_name_tool -change /Library/Frameworks/Mono.framework/Versions/3.2.5/lib/libmonoboehm-2.0.1.dylib
 @executable_path/libmonoboehm-2.0.1.dylib ${ProjectName}```


##Conclusion
mkbundle, otools, install_name_tool でなんとかなります。
山折り谷折り〜 横へな 2014.2.1 参考問題

( 元ネタは http://nabetani.sakura.ne.jp/hena/ord18mafovafo/ )
( 他の解答例は http://qiita.com/Nabetani/items/373105e7fafd12f5e9fd )

最初にMFVF.hsを書き始めて出力が正しいかどうかの確認が終わるまででちょうど20分。
うーん。これはちょっと簡単すぎないかな……
前回の「折って切る」を更に簡単にしたものになってるような……

型シグニチャを書きながらそれを手がかりに考えつつ本体を書いていくのが好きなので、「折り目」のデータ型をきちんと定義せずに`Char`やらで暗黙に代用するのは好きではないのだが、簡単に書きたければこんな感じか（紙の状態を`String`で表現するので出力整形とか気にしないでいいのが利点なのかなあ）：

```hs:MFVFbis.hs
module Main where

turn = map inv . reverse
  where inv 'm' = 'V'; inv 'V' = 'm'

unFold f p = let q = turn p in case f of 
  'L' -> q ++ "V" ++ p
  'J' -> p ++ "V" ++ q
  'Z' -> p ++ "m" ++ q ++ "V" ++ p
  'S' -> p ++ "V" ++ q ++ "m" ++ p
  'U' -> q ++ "V" ++ p ++ "V" ++ q

develop = foldr unFold ""

main = do
  s <- getContents
  mapM_ (putStrLn . develop) (lines s)

```

みたまんま、標準入力から食わせれば標準出力に吐きます。

ちなみに以下のものが頭から考えながら20分程度でそのまま書き下ろした当初のヴァージョン。情弱らしくアラだらけだが、まあ情弱なのでこんなものだろう。

```hs:MFVF.hs
module Main where
import Data.List
import System.Environment (getArgs)

data Folding = MF | VF 
instance Show Folding where
  show f = case f of
    MF -> "m"
    VF -> "V"

type Paper = [Folding]

turn :: Paper -> Paper
turn p = map inv $ reverse p
  where inv MF = VF
        inv VF = MF

unfolding :: Paper -> Char -> Paper 
unfolding p ch = case ch of 
  'L' -> turn p ++ [VF] ++ p
  'J' -> p ++ [VF] ++ turn p
  'Z' -> p ++ [MF] ++ turn p ++ [VF] ++ p
  'U' -> turn p ++ [VF] ++ p ++ [VF] ++ turn p
  'S' -> p ++ [VF] ++ turn p ++ [MF] ++ p

develop :: String -> Paper
develop s = foldl' (unfolding) [] (reverse s)

pprint :: Paper -> String
pprint = concat . map show

main = do
  input <- getArgs
  let s = input !! 0
  putStrLn $ pprint $ develop s

```

おまけ （Data.Sequence版）

```hs:MFVFTer.hs
module Main where

import Prelude hiding (reverse)
import Data.Foldable (toList)
import Data.Sequence

turn = fmap inv . reverse
  where inv 'm' = 'V'
        inv 'V' = 'm'


unFold f p = let q = turn p in case f of
  'L' -> q >< singleton 'V' >< p
  'J' -> p >< singleton 'V' >< q
  'Z' -> p >< singleton 'm' >< q >< singleton 'V' >< p
  'S' -> p >< singleton 'V' >< q >< singleton 'm' >< p
  'U' -> q >< singleton 'V' >< p >< singleton 'V' >< q

develop = foldr unFold empty

main = do
  s <- getContents
  mapM_ (putStrLn . toList . develop) (lines s)

```
ActiveRecord#arel_tableでcondition作成

# やりたいこと
* 複数の検索キーワードでor条件で検索したい
* クエリを一回で済ませたい

# 解決方法
* ActiveRecordのarel_talbe使ってやってみた
* 専用メソッドをmodelに作成

# モデル
* Employee
 * id, kanji_name, kana_name, roman_alphabet_name, department_idカラムを持つ
* Departmentクラス
 * id, nameカラムを持つ

---

# arel_tableでできること
* 検索条件の追加ができる
* 複雑な条件を付けるときに便利

# 使い方

* 基本

```rb
employee_arel_table = Employee.arel_table
conditions = employee_arel_table[:kanji_name].eq("田中")
Employee.where(conditions).first
#=> #<Employee id: 1, kanji_name: "田中" ... >
```

* 部署名にkeyが入って入れば、その部署のメンバー全員を取得する

```rb
key = "総務"
departments = Department.where("name like ?", key)
condition = employee_arel_table[:department_id].in(departments.ids)
Employee.where(condition)
```

* 複数の条件をorで繋ぐ

```rb
key = "田中"
conditions = []
[:kanji_name, :kana_name, :roman_alphabet_name].each do |name|
  conditions << employee_arel_table[name].matches(key)
end
condition = conditions.shift
conditions.each do |c|
  condition = condition.or c
end
Employee.where(condition)
```

---

# 作成したmodel

```rb:app/models/employee.rb
class Employee < ActiveRecord::Base
  belongs_to :department
  validates :kanji_name, :presence => true

  def self.where_all_type_name(keyword)
    raise ArgumentError if keyword.class != String
    raise ArgumentError if keyword.blank?

    employee_arel_table = self.arel_table
    key = "%#{keyword}%"
    conditions = []

    [:kanji_name, :kana_name, :roman_alphabet_name].each do |name|
      conditions << employee_arel_table[name].matches(key)
    end 
    departments = Department.where("name like ?", key)
    conditions << employee_arel_table[:department_id].in(departments.ids)

    condition = conditions.shift
    conditions.each do |c| 
      condition = condition.or c
    end 

    self.where(condition)
  end 
end
```

```rb:app/model/department.rb
class Department < ActiveRecord::Base
  has_many   :employees
  validates :name, :presence => true
end
```

* 使い方

```rb
@employees = Employee
keywords = ["hoge", "fuga", "piyo"]

keywords.each do |keyword|
  @employees = @employees.where_all_type_name(keyword)
end
```
Pryのコンソールで使えない変数

Pry::Commandsと衝突すると使えない
s, c, その辺

```rb
[1] pry(main)> c = ...
Error: Cannot find local context. Did you use `binding.pry`?
```

https://github.com/nixme/pry-nav/issues/3
https://github.com/pry/pry/issues/492
Apache filter_moduleでgzip圧縮(AmazonLinux)

# 概要
* filterモジュール使ったconfの書き方と、動作確認をまとめておく
 * AddOutputFilterByTypeディレクティブ使った方法はApache2.2で非推奨
* 圧縮レベルは5
* 対象はtext/*のやつ全部
* ログは効果確認できたら出さないようにする

# conf

```apache:httpd.conf
# deflate_module と filter_moduleをアンコメント
LoadModule deflate_module modules/mod_deflate.so
LoadModule filter_module modules/mod_filter.so
```

```apahce:app.conf
<IfModule mod_deflate.c>
  DeflateCompressionLevel 5
  <Location />
    FilterDeclare  Comp CONTENT_SET
    FilterProvider Comp DEFLATE req=Accept-Encoding $gzip
    FilterProvider Comp DEFLATE resp=Content-Type /^text/
    FilterChain Comp
  </Location>

  # ログは重くなるので効果確認できたら消す
  DeflateFilterNote Input instream
  DeflateFilterNote Output outstream
  DeflateFilterNote Ratio ratio
  LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
  CustomLog logs/deflate_log deflate
</IfModule>
```

# 効果確認

* curlで確認

```shell-session
curl -H "Accept-Encoding: gzip" -H "Pragma: no-cache" "http://localhost/index.css"
sudo tail -1 /etc/httpd/logs/deflate_log
"GET /index.css HTTP/1.1" 3877/16699 (23%)
```

# 参考
* サーバ構築の実際がわかるApache[実践] 運用/管理
* http://httpd.apache.org/docs/2.2/ja/mod/mod_deflate.html
* http://bibwild.wordpress.com/2012/11/20/apache-conf-for-rails-asset-pipeline/
RailsログLTSV対応(LTSV Logger + UUID)

# 概要

* RailsログのLTSV対応するのに既存のgem使ってみた
* 条件 : UUIDを出せること
* 使ってみたのは
 1. ltsv-logger
 1. logger-ltsv

# 結論
* 非常に簡単に使える
* どちらもあまりメンテされてなさそう
 * 色々やりたければ自前の方がいいかも

# 使ってみた

## 1 ltsv-logger

* https://github.com/terut/ltsv-logger

```rb:config/environments/development.rb
    # ltsv-logger
    config.log_tags = [ :uuid ]
    config.logger = ActiveSupport::TaggedLogging.new(LTSV::Logger.open("log/development.log"))
```

* ログ出力例

```
time:2014-01-27 17:23:52 +0900	message:[8f72b641-edf2-4f6e-8484-fb3e3c471709] Started GET "/" for 127.0.0.1 at 2014-01-27 17:23:52 +0900
time:2014-01-27 17:23:52 +0900	message:[8f72b641-edf2-4f6e-8484-fb3e3c471709]   ActiveRecord::SchemaMigration Load (0.1ms)  SELECT "schema_migrations".* FROM "schema_migrations"
time:2014-01-27 17:23:52 +0900	message:[8f72b641-edf2-4f6e-8484-fb3e3c471709] Processing by LepusController#top as HTML
time:2014-01-27 17:23:52 +0900	message:[8f72b641-edf2-4f6e-8484-fb3e3c471709]   Rendered lepus/top.html.erb within layouts/application (0.9ms)
time:2014-01-27 17:23:52 +0900	message:[8f72b641-edf2-4f6e-8484-fb3e3c471709] Completed 200 OK in 41ms (Views: 27.9ms | ActiveRecord: 0.0ms)
```

* logger-ltsv
 * https://github.com/tnakamura/logger-ltsv
 * http://tnakamura.hatenablog.com/entry/2013/05/04/173645
* 変更点 

```rb:config/environments/development.rb
    # logger-ltsv
    config.log_tags = [ :uuid ]
    config.logger = ActiveSupport::TaggedLogging.new(LTSVLogger.new("log/development.log"))
```

* ログ出力

```
severity:INFO	datetime:2014-01-27 17:27:06 +0900	message:[4285dacb-16ec-484b-b73a-96b1dd4d7f05] Started GET "/" for 127.0.0.1 at 2014-01-27 17:27:06 +0900
severity:DEBUG	datetime:2014-01-27 17:27:06 +0900	message:[4285dacb-16ec-484b-b73a-96b1dd4d7f05]   ActiveRecord::SchemaMigration Load (0.1ms)  SELECT "schema_migrations".* FROM "schema_migrations"
severity:INFO	datetime:2014-01-27 17:27:06 +0900	message:[4285dacb-16ec-484b-b73a-96b1dd4d7f05] Processing by LepusController#top as HTML
severity:INFO	datetime:2014-01-27 17:27:06 +0900	message:[4285dacb-16ec-484b-b73a-96b1dd4d7f05]   Rendered lepus/top.html.erb within layouts/application (0.8ms)
severity:INFO	datetime:2014-01-27 17:27:06 +0900	message:[4285dacb-16ec-484b-b73a-96b1dd4d7f05] Completed 200 OK in 41ms (Views: 27.5ms | ActiveRecord: 0.0ms)
```
Scalaでパーサーを作ってみる

たまにパーサーを定義して自分用コマンドを作りたくなったり、
整形されたテキストを解析して使いやすいデータにしたいということがあるはずだ
そういう時にはScalaのParserモナドを使うと便利なようだ

試しに簡単な足し算をパースするようなプログラムを書いてみる

```scala:TestParser.scala
import scala.util.parsing.combinator._

object TestParser extends RegexParsers {
  // <digit> ::= "0" | ... | "9"
  def digit : Parser[Char] = acceptIf(c => ('0' <= c && c <= '9'))(e => "Err: Digit: "+e)

  // <number> ::= <digit>+
  def number : Parser[Int] = rep1(digit).mkString.toInt

  // <expr> ::= <number> "+" <number>
  def expr : Parser[(Int, Int)] = for {
    a <- number
    _ <- accept('+')
    b <- number
  } yield (a, b)
}

TestParser.parseAll(TestParser.expr, "1+2").map { println _ }  // ==実行結果==> (1, 2)
```

この例では数字をdigitとして 0 ~ 9 の値を受け取るパーサー、
numberは数字(digit)が１回以上記されているものを受け取るパーサー、
exprはnumberパーサーを使った足し算のパーサーになっている

ここで注目してもらいたいのは、exprは numberと'+'一文字だけを受け取るパーサーの
組み合わせで作られているということだ。exprのfor式は中身のどれか一つでも失敗になると
全体として失敗し、成功すると値を返すということになっており、これ自体もひとつのパーサーとして
見ることができることから、レゴブロックを組み合わせてお城を作るみたいにパーサーを書けてしまう。

これをちょっと拡張してコマンドをパースできるように改造してみると下のようになる。
ちょっと見てもらえると分かると思うが、digit, number, expr パーサーには
一切手を触れずに拡張できるのが分かる。こんなようにScalaに限らずパーサを書くには
モナドを使ったほうが便利で楽しく書けるんじゃないだろうか。

```scala:TestParser2.scala
import scala.util.parsing.combinator._

object TestParser2 extends RegexParsers {
  override val skipWhitespace = false

  // <digit> ::= "0" | ... | "9"
  def digit : Parser[Char] = acceptIf(c => ('0' <= c && c <= '9'))(e => "Err: Digit: "+e)

  // <number> ::= <digit>+
  def number : Parser[Int] = for {
    cs <- rep1(digit)
  } yield cs.mkString.toInt

  // <expr> ::= <number> "+" <number>
  def expr : Parser[(Int, Int)] = for {
    a <- number
    _ <- accept('+')
    b <- number
  } yield (a, b)

  // <command> ::= <name> [" "+] [<expr>]
  def command : Parser[String] = for {
    com <- """[a-z]+""".r
    _ <- rep(accept(' '))
    ns <- opt(expr)
  } yield {
    com.mkString match {
      case "add" =>
        ns.map{ case (a, b) => a + b }.getOrElse("").toString
      case "hello" =>
        "world"
      case _ =>
        "Err: Invalid syntax"
    }
  }
}

// OK
TestParser2.parseAll(TestParser2.command, "add 1+2").map{ println _ } // ==> 3
TestParser2.parseAll(TestParser2.command, "add 2+3").map{ println _ } // ==> 5
TestParser2.parseAll(TestParser2.command, "hello").map{ println _ }   // ==> world

// FAIL
TestParser2.parseAll(TestParser2.command, "add 1+a").map{ println _ } // 何も出力されない
```

追伸：
このコードは以下のように実行することができる

$ scala TestParser.scala
(1, 2)
$ scala TestParser2.scala
3
5
world
細かすぎて伝わらない、mroongaでメルカトル座標が挿入できなくてムカついた話

mysqlの全文検索拡張[mroonga](http://mroonga.org/ja/)は、POINT要素しか含めないながら、GEOMETRY型が使えるらしい。
全文検索＋位置検索系の要件があるので、ちょっと使ってみた。

位置情報えきすぱあとであれば、関数インデックスの使えるPostGIS等ならばともかく、mysqlならGEOMETRY型には経緯度ではなく[メルカトル座標を入れるのが常道](http://d.hatena.ne.jp/hfu/20080128/1201500677)。
メルカトル座標と緯度毎の距離倍率を計算するphp関数を用意してやって、メルカトル座標をGEOMETRY型に蓄積してやりました。

```sql
mysql> INSERT INTO `spot` (`geom`) VALUES (GeomFromText('POINT(15028131.257091932 4163881.144064294)'));
Query OK, 1 row affected, 2 warnings (0.00 sec)
```

表示してやる。

```sql
mysql> SELECT AsText(`geom`) FROM `spot` WHERE `id` = 30;
+----------------------------------------------+
| AsText(`geom`)                               |
+----------------------------------------------+
| POINT(-596.5232355555555 -596.5232355555555) |
+----------------------------------------------+
1 row in set (0.00 sec)
```

はあああああ？

なんかmroongaのGEOMETRY型には経緯度で取り得る値の周辺の値しか突っ込めないみたい。
それやったらメルカトル座標値使えんやんけーーー！距離ベースの周辺検索どないすんねんあほー。

と思ったけど、どうも独自で円検索するインタフェースが[mroonga_commandとかいう独自SQL拡張](http://qiita.com/groonga/items/7abca5004d2ae386d388)で用意されてるようなので許す。

…と思ったけど、独自拡張の書式が特殊すぎて他のSQLと混ぜるの面倒そうやな…。
メルカトル座標値を10万分の1とかにして、突っ込むかな…。
bashの補完で大文字小文字を無視する


まずは設定ファイルを書きます。

```Bash:~/.inputrcもしくは/etc/inputrc
set completion-ignore-case on
```

書き終わったらbashの入力画面に戻って、``Ctrl-X`` + ``Ctrl-r``と入力して設定を有効にできます。

これで小指が助かりそうです。
そのほかbashの小技などなどについてはこの本がかなり役に立ちました。

<a href="http://www.amazon.co.jp/gp/product/4873112540/ref=as_li_ss_il?ie=UTF8&camp=247&creative=7399&creativeASIN=4873112540&linkCode=as2&tag=qiita-22"><img border="0" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4873112540&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=qiita-22" ></a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=qiita-22&l=as2&o=9&a=4873112540" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
Twitter APIリミットの残存回数取得メソッド

[Twitter APIリミットの残存回数取得メソッド - 別館 子子子子子子（ねこのここねこ）](http://d.hatena.ne.jp/riocampos+tech/20140126/p1)からの引用です。詳細情報は上記サイトを参照頂ければ幸いです。

##メソッド

（1/28更新）
オープンクラスで`rate_limit_status`と`rate_limit_status_all`メソッドを作ってみました。Twitter gemバージョン5以上の対応です。4以下の場合にはオープンするClassを`Twitter::REST::Client`から`Twitter::Client`に変更すれば動くはずです（4.8.1確認済）。
なお、`rate_limit_status`も180回/15分の制限がありますのでご注意ください。

###`rate_limit_status`メソッド

引数にpath（StringまたはSymbol）を与えると

- 上限回数・残存回数・リセット時刻（エポックタイム及び`Time`オブジェクト）・Twitterへアクセスした時刻

をハッシュで返します。（keyは順に`:limit`, `:remaining`, `:reset`, `:reset_time`, `:time_now`）

###`rate_limit_status_all`メソッド

リミットがある全てのAPIの情報をハッシュで返します。このハッシュに含まれているのは

- 各API毎の上限回数・残存回数・リセット時刻（エポックタイム及びTimeオブジェクト）のハッシュ（keyはpath（StringまたはSymbol））
- Twitterへアクセスした時刻（keyは`:time_now`）

です。

##スクリプト
（Twitter gem バージョン5.13.0以降。5.12.0以前のものは[Twitter APIリミットの残存回数取得メソッド - 別館 子子子子子子（ねこのここねこ）](http://d.hatena.ne.jp/riocampos+tech/20140126/p1)をご参照ください。）

```ruby:
class Twitter::REST::Client
  def rate_limit_status(path)
    result_hash = rate_limit_status_all[path.to_sym]
    result_hash[:time_now] = rate_limit_status_all[:time_now]
    result_hash
  end
  
  def rate_limit_status_all
    result_hash = {}
    result_hash[:time_now] = Time.now
    rate_limits = perform_get('/1.1/application/rate_limit_status.json')[:resources]
    rate_limits.each do |genre, path_limits|
      path_limits.each do |path, limits|
        limits[:reset_time] = Time.at(limits[:reset])
        result_hash[path] = limits
        result_hash[path.to_s] = limits
      end
    end
    result_hash
  end
end
```

##実行結果
`rate_limit_status`の引数であるpathは、StringでもSymbolでも同じ返値が得られます。

```ruby:
pry(main)> client.rate_limit_status("/statuses/user_timeline")
=> {:limit=>180,
 :remaining=>180,
 :reset=>1390917352,
 :reset_time=>2014-01-28 22:55:52 +0900,
 :time_now=>2014-01-28 22:40:53 +0900}
pry(main)> client.rate_limit_status(:"/statuses/user_timeline")
=> {:limit=>180,
 :remaining=>180,
 :reset=>1390917362,
 :reset_time=>2014-01-28 22:56:02 +0900,
 :time_now=>2014-01-28 22:41:03 +0900}
```

`rate_limit_status_all`メソッドでも同じ情報へアクセスできます。複数APIの残存回数を取得したい場合には、この`rate_limit_status_all`を使ってください。
また`rate_limit_status`メソッドと同じく、`rate_limit_status_all`で返される（ハッシュ）オブジェクトのkeyに与えるpathは、StringでもSymbolでもどちらでも同じ値が返されます。

```ruby:
pry(main)> client.rate_limit_status_all["/statuses/user_timeline"]
=> {:limit=>180,
 :remaining=>180,
 :reset=>1390917398,
 :reset_time=>2014-01-28 22:56:38 +0900}
pry(main)> client.rate_limit_status_all[:"/statuses/user_timeline"]
=> {:limit=>180,
 :remaining=>180,
 :reset=>1390917404,
 :reset_time=>2014-01-28 22:56:44 +0900}
```

なお`rate_limit_status_all`の返値の詳細は上記[Twitter APIリミットの残存回数取得メソッド - 別館 子子子子子子（ねこのここねこ）](http://d.hatena.ne.jp/riocampos+tech/20140126/p1)をご確認ください。また、上記しましたが、これらのメソッドを使うと"/application/rate_limit_status" APIを消費するので、その点も注意してください。
CloudTrailを触ってみる

## 参照
* [AWSサイト](http://aws.amazon.com/jp/cloudtrail/)
* [【AWS発表】 AWS CloudTrail - AWS APIコールの記録を保存](http://aws.typepad.com/aws_japan/2013/11/aws-cloudtrail-capture-aws-api-activity.html)
* [AWSの操作履歴を記録するCloudTrailを試してみた](http://blog.serverworks.co.jp/tech/2013/11/14/cloudtrail/)
* [【JAWS-UG-shimane#1】吉田真吾さんの発表](http://jaws-ug.jp/es/jaws-ug-shimane-1/)

## CloudTrailとは 
* 2013/11 新しいAWSサービスである
* EC2, EBS, VPC, RDS, IAM, STSなどサービスに対して、コールを記録できる
* 誰、いつ、何をやる、操作のIPアドレスを、S3バケットに保存するたびに、SNSのトピックに対して通知できる

## CloudTrailアーキテクチャ(参照: aws.typepad.com)
![aws.typepad.comから参照](http://media.amazonwebservices.com/blog/2013/cloudtrail_flow_4.png)

## 起動と設定
#### AWS console
1. aws cloudtrailコンソール画面を開ける
2. 「Get Started」をクリックする
3. S3バケットネームを入力する
4. file prefixを入力する

#### AWS CLI

```bash
$ aws cloudtrail create-subscription \
$   --name=awscloudtrail-test \
$   --s3-new-bucket=awscloudtrail-test-bucket \
$   --s3-prefix=prefix-test
```
RailsのApplication Templateでmysqlのcollation設定を追加

[Rails - ActiveRecordでデフォルトの照合順序を変更する - Qiita \[キータ\]](http://qiita.com/kamipo/items/d7863f0df24916005657)に書かれていますが、config/database.ymlでcollationを指定しないとutf8_unicode_ciとして扱われてしまいます。

utf8_general_ciを使いたい場合は、下記のように明示的にcollationを指定する必要があります。

```yaml
development:
  adapter: mysql2
  encoding: utf8
  collation: utf8_general_ci
  database: foo_development
  pool: 5
  username: root
  password:
  socket: /tmp/mysql.sock
```

この設定追加をApplication Templateで行う方法を紹介します。

[Module: Thor::Actions — Documentation for wycats/thor (master)](http://rdoc.info/github/wycats/thor/master/Thor/Actions#gsub_file-instance_method)を使って、```encoding: utf8```の行を置換して```collation: utf8_general_ci```の行を追加します。

https://github.com/hnakamur/rails-app-templates/blob/fe9162ff9aa96d344765b36962d6bb53a83a09f4/rails4-app-template.rb#L12-L14

```rb
# add mysql collation configs to database.yml
gsub_file 'config/database.yml',
  /^  encoding: utf8$/, "\\0\n  collation: utf8_general_ci"
```