OmniAICreator/Qiita-1.07M huggingface dataset:
Searchを使い分ける


PhpStorm上には数多くの検索機能があります。それぞれ用途が違いますが、多すぎて分かりにくいところもちょこちょこあります。
それぞれの機能について説明してみます。

## Find(Cmd+F)
![AccountController.php_-_candycane_-____www_candycane_-2.png](https://qiita-image-store.s3.amazonaws.com/222/20074/913c684d-8b54-0d96-ad7d-b51c332f6351.png "AccountController.php_-_candycane_-____www_candycane_-2.png")


一番ベーシックな検索機能です。開いているファイル内に対して文字列検索出来ます。
右のオプションを設定することで[正規表現での検索][大文字小文字完全一致での検索]も切り替えられます。

既に検索状態にある場合にはF3/Shift+F3でそれぞれ次の検索マッチした文字列/前の検索マッチした文字列の箇所にジャンプ出来ます。


また、検索文字列を入力してある状態で検索メニューバーの[Find All]を押すと、以下の様な感じでファイル内Grep表示してくれます。一覧で見れるので地味に便利です。

![AccountController.php_-_candycane_-____www_candycane_.png](https://qiita-image-store.s3.amazonaws.com/222/20074/65ba350c-5bc7-cbbb-c974-6e35278aaab2.png "AccountController.php_-_candycane_-____www_candycane_.png")

ちなみに派生機能でFind Word At Caret(Cmd+F3)もあります。こちらはわざわざ検索単語を入力/選択せず、カーソル下の単語に対してFindするような感じです。

## Find in Path(Ctrl+Shift+F)
![Find_in_Path_と_AccountController.php_-_candycane_-____www_candycane_.png](https://qiita-image-store.s3.amazonaws.com/222/20074/ce4bf548-08fa-efc8-5744-377bfa53585b.png "Find_in_Path_と_AccountController.php_-_candycane_-____www_candycane_.png")

こちらはプロジェクト全体や特定ディレクトリ配下に対する検索が行えます。
上述のFindよりもオプションが充実していて、

- 正規表現での検索
- 大文字小文字完全一致での検索
- コメント内のみ検索
- シングルクォートやダブルクォート内の文字列のみ検索
- 特定拡張子のファイルのみ検索

といったオプションが細かく設定出来ます。

検索結果は以下のように、各ディレクトリのファイル毎にツリー形式で表示されます。ツリー表示の有無など、表示方式は左のメニューからカスタマイズも出来ます。
![AccountController.php_-_candycane_-____www_candycane_.png](https://qiita-image-store.s3.amazonaws.com/222/20074/da5932dc-f0ec-323c-5fe8-7dab8099fb48.png "AccountController.php_-_candycane_-____www_candycane_.png")

また、プロジェクトエクスプローラ上でディレクトリを選択している状態でFind in Pathを実行すると、そのディレクトリ配下での検索が出来るので、これも地味に便利です。

![AccountController.php_-_candycane_-____www_candycane_-7.png](https://qiita-image-store.s3.amazonaws.com/222/20074/867bfd0e-8388-7870-b30c-4794c6c3b508.png "AccountController.php_-_candycane_-____www_candycane_-7.png")



## Find Usages(Ctrl+F7)
![AccountController.php_-_candycane_-____www_candycane_.png](https://qiita-image-store.s3.amazonaws.com/222/20074/258519a3-d390-1be0-555c-96a2f5b23fbd.png "AccountController.php_-_candycane_-____www_candycane_.png")


カーソル下の変数やメソッド、クラスに対して「そのオブジェクトを使用している/継承している/そのオブジェクトに対して書き込んでいる箇所」を一覧で表示してくれます。

･･･が、PHPという言語の特性上、あまり精度は高くありません。
クラスやメソッド、変数に対してしっかりPHPDocでアノテーションを含めてコメントを書いてやれば正しく機能すると思いますが、個人的にはあまり使わない機能です。

[Find Usages in File]というショートカットもありますが、こちらは上記の機能が現在のファイル内のみ対象になるものです。
上述の理由により、こちらの説明は省略します。

## Highlight Usages in file(Cmd+Shift+F7)
![AccountController.php_-_candycane_-____www_candycane_.png](https://qiita-image-store.s3.amazonaws.com/222/20074/f080b4ac-43ea-aabb-f11b-45cf73231f4c.png "AccountController.php_-_candycane_-____www_candycane_.png")

こちらは検索ではなくファイル内のハイライトに特化した機能です。
任意の文字列を選択した状態でHighlight Usage in fileを実行すると、そのファイル内でマッチした文字列の箇所がハイライトされます。

上述のSearchでも似たようにハイライトされますが、違いとしては
- 解除(Escape)を押すまでハイライト状態が続くので、マーキングしたままコーディング可能
- 複数の単語をハイライト状態にできる

というところが上げられます。
また、Searchと同様にF3/Shift+F3でハイライトされている文字列にジャンプ出来ます。
Thorで作ったコマンドラインインターフェースをRspecでテスト


Thorで作ったコマンドラインインターフェース(CLI)のクラスをRSpecでテストする方法

* ThorでCLIを作成すると以下のようにThorクラス継承したクラスを作る事になる。
  * 例えば以下のようなクラスを作ったとする

```ruby
class MyCLI < Thor

  desc "run", "run task"
  method_option :output
  def run
     options[:output]
  end
end
```

* このテストをする際に以下のように書くとoptionsに値をセットする事ができない。

```ruby
it "should display output" do
  Sample.new.run.should eq "xxx"
end
```

* optionsの値もセットした状態で実行するにはinvokeメソッドを使用する。
  * 第一引数はメソッド名、第二引数は引数、第三引数はoptionsの値をhashで渡す。

```ruby
it "should display output" do
  Sample.new.invoke(:run, [], {output: "xxx"}).should eq "xxx"
end
```
今度こそ快適・王道なTDD生活が始められる良記事10選+α [Rails/RSpec]


## はじめに

この記事は[TDD Advent Calendar 2013](http://qiita.com/advent-calendar/2013/tddadventjp)の17日目の参加エントリです。

前日は[id:a_suenami](http://a-suenami.hatenablog.com/about)さんの[TDDが僕に教えてくれたこと](http://a-suenami.hatenablog.com/entry/2013/12/17/001446)でした。

## このエントリが目指すところ

「Railsで開発しつつも実はあまりテストを実践出来ていない」という方を対象に、

- Rails*RSpecでunit/functional test
- Capybaraでブラウザの挙動をシミュレート
- FactoryGirlでテストデータを自由に準備
- Guardでファイル編集の度にテストを自動実行
- Sporkでサイクル高速化

を実現するために役立つ記事を紹介します。


## RSpecの基本

#### [改めて学ぶ RSpec](http://magazine.rubyist.net/?0035-RSpecInPractice)
#### [RSpec 簡潔に記述する](http://shinsukekatsuyama.blogspot.jp/2011/07/rspec-1-it.html)

「RSpecとは何か」と「基本的な書き方」が身に付く2記事。
describeやcontext、subjectといった「骨組み」をこちらで抑えておきましょう。

#### [RSpec/Capybara入門](http://www.oiax.jp/rails/rspec_capybara_primer.html)

Rails上で動かしていくので実践に近い形で学べる。
併せてCapybaraやFactoryGirlがどんなものかも分かります。
[should はどこに行ったの？](http://www.oiax.jp/rails/rspec_capybara_primer/basic_structure.html)も抑えておきましょう。
まずは第6回の「モデルテストの演習」まで。

※なぜかChromeだとサンプルコードが読みづらいです。Safariなら問題ありませんでした。

## RSpecもう一歩

#### [Railsのコントローラをテストする](http://www.atmarkit.co.jp/ait/articles/1208/06/news119.html)

モデルのテスト（unit test）より書きづらいと言われる
コントローラテスト（functional test）ですが、こちらですべきことが分かります。

#### [RSpec でテストを作るのに役立つ「モック/スタブ」のシンプルな説明](http://morizyun.github.io/blog/rspec-model-controller-ruby-rails/)

各テストを綺麗に分離していこうすると必要になってきます。

## Capybara

※概要やセッティングは上記[RSpec/Capybara入門-テストの基本構造](http://www.oiax.jp/rails/rspec_capybara_primer/basic_structure.html)で掴んでおきましょう。

#### [[Rails][RSpec] Capybaraでフォーム入力をシミュレートしてテストする](http://qiita.com/kidachi_/items/b0e607c83e9da9380d7e)

Capybaraの便利さを感じる。


#### [Capybara README.md Ja](https://github.com/willnet/capybara-readme-ja#navigating)

「何ができるのか」のリファレンスとして、「Navigating」以下の
項目に目を通しておくと良いでしょう。


## FactoryGirl

※概要やセッティングは上記[RSpec/Capybara入門-letメソッドとFactory Girl](http://www.oiax.jp/rails/rspec_capybara_primer/let_and_factory_girl.html)で掴んでおきましょう。

#### [factory_girl で最低限知っておきたい4つの使い方](http://blog.livedoor.jp/sasata299/archives/51931175.html)

FactoryGirlの概要を理解した後、いざ実践の際に困るのは
「アソシエーションを持つモデルのデータをどう作るか？」ではないでしょうか。
そんな疑問はこちらで解決。

#### [[Ruby] FixtureからFactoryGirlへ](http://eblog.drecom.jp/entry/14)

こちらまで理解すればFactoryGirlの普段使いで困ることは無くなると思います。


## Guard/Spork

#### [[Rails] RSpecによるBDD（振舞駆動開発）の基本 [SporkとGuardも]](http://qiita.com/kidachi_/items/cb8910eb74e924456df9)

自動かつ高速な快適テスト環境を作りましょう。

## ＋α

#### [Rails でつくる API のテストの書き方（RSpec + FactoryGirl）](http://blog.inouetakuya.info/entry/2013/10/27/200111)

APIのテストを書きたくなったらこちら。

#### [rubyで標準出力をテストする方法](http://pochi.hatenablog.jp/entries/2010/03/24)

標準出力をテストケースに入れたくなることもありますね。


## 最後に

紹介した記事は必ずしも上から順にクリアしていく必要はなく、
相互に理解を深め合えるような内容です。

よく分からない部分にぶつかっても、どんどん先に進んでみましょう。


## バトンタッチ

明日のエントリは[@naghbIQtIqHom](https://twitter.com/naghbIQtIqHom)さんです。
よろしくお願い致します！
rubyの例外についてまとめてみた


ちょっとこんがらがったので整理

# 先に結論

- 型指定なしで rescue すると、 `StandardError` のサブクラスのみ catch する
- アプリケーションレベルでの標準的なエラーは `RuntimeError` のサブクラス
    - `RuntimeError` は、`StandardError` のサブクラス
- なので、アプリケーション内で独自の例外を書く場合、普通は `RuntimeError` を使ったほうが良い
- 1.8 系の場合 `Timeout::Error` は、`StandardError` のサブクラスではない

# `raise` 関数に型を渡さない時に発生する例外は、 `RuntimeError`

```rb
raise "エラーメッセージ" # => RuntimeError が発生
```

## `RuntimeError` って?

> 特定の例外クラスには該当しないエラーが起こったときに発生します。
> また Kernel.#raise で例外クラスを指定しなかった場合も RuntimeError が発生します。 

[class RuntimeError (Ruby 2.3.0)](http://docs.ruby-lang.org/ja/2.3.0/class/RuntimeError.html)

# `rescue` でクラスを省略した時にcatchする例外は、 `StandardError`

```rb
rescue => e # => StandardError を catch
end
```

> 通常のプログラムで発生する可能性の高い 例外クラスを束ねるためのクラスです。
> StandardError とそのサブクラスは、 rescue 節でクラスを省略したときにも捕捉できます。 

[class StandardError (Ruby 2.3.0)](http://docs.ruby-lang.org/ja/2.3.0/class/StandardError.html)

> Rubyの組み込み例外は(SystemExit や Interrupt のような脱出を目的としたものを除いて) StandardError のサブクラスです。

[制御構造 (Ruby 2.3.0)](http://docs.ruby-lang.org/ja/2.3.0/doc/spec=2fcontrol.html#raise)

# `Exception` の位置づけは?

>全ての例外の祖先のクラスです。 

[class Exception (Ruby 2.3.0)](http://docs.ruby-lang.org/ja/2.3.0/class/Exception.html)



# `StandardError` は、 `Exception` のサブクラス

- `Exception` は、システム関係の例外も含む
- アプリケーションレベルの例外であれば、 `StandardError` を使うべきという思想らしい
- そのため、 `rescue` で、型指定をしない場合は、 `StandardError` を継承している例外のみ `catch` する

```rb
begin
  raise "エラーメッセージ" # catch する
  raise Exception.new("エラーメッセージ") # catch しない
rescue => e
  p e.message
end
```

#  `RuntimeError` は `StandardError` のサブクラス
- `StandardError` は、通常のプログラムで発生すエラーを意味するクラス
    - これを継承した場合は、通常のプログラムで発生すエラーを意味することになる
- `RuntimeError` は、`StandardError` の中で、特定の例外クラスには該当しないエラーを意味するクラス
    - 「クラス指定のない `raise` 」専用のクラスといえる

# `Exception` を `rescue` するとどんな時困るの?

例えばこんな時

```rb
1.upto(10) do |i|
  begin
  p i
  sleep(1)
  rescue Exception => e
    p e.class
    p "catch!"
  end
end
```

これを実行中に、ctrl-c で処理を停止しようとすると、 `Interrupt` 例外が発生して、処理が続行されちゃう
けど、それって意図したことじゃないよね

```shell-session
$ ruby 01.rb
1
2
^CInterrupt
"catch!"
3
4
5
^CInterrupt
"catch!"
6
7
8
9
10
```

# 1.8 系での Timeout::Error の罠

1.8 系だとTimeout::Error が、StandardError ではなく、Interrupt を継承しているため、
型指定なしでの rescue では、catch されないという罠がある
[Class: Timeout::Error (Ruby 1.8.7)](http://www.ruby-doc.org/stdlib-1.8.7/libdoc/timeout/rdoc/Timeout/Error.html)


例えば、こんな時に、タイムアウトが発生しても catch されない

```rb
require 'net/http'
begin
  Net::HTTP.start("test.net") do |http|
    ...
  end
rescue =>e 
  ...
end
```

例外の型指定は複数の型を指定できるので、こんな回避方法もある

```rb
begin
  ....
rescue Timeout::Error, StandardError =>e
end
```

ちなみに 1.9 系以降では、StandardError になっているので、解決している
[Class: Timeout::Error (Ruby 1.9.3)](http://www.ruby-doc.org/stdlib-1.9.3/libdoc/timeout/rdoc/Timeout/Error.html)

### 参考

- [Rubyで自前の例外クラスを作るときExceptionではなくStandardErrorを継承する理由 - yarbの日記](
http://d.hatena.ne.jp/yarb/20121005/p1)
- [【Ruby】Ctrl-cの強制停止はrescueで補足できる | one's world](http://no-zom.jp/blog/?p=588)
- [Timeout::Errorに注意 - dreammindの日記](http://d.hatena.ne.jp/dreammind/20090217/1234813224)
wallflowerコマンド一発で静的ページを書き出す

[MojoliciousでMiddleman的なことをする簡易版 - Qiita [キータ]](http://qiita.com/yusukebe/items/ffee7ad26ddfb24c17f1) の記事について、tokuhirom氏から「 **wallflower** 使ったらどうなる？」と意見をもらった。具体的には `App::Wallflower` モジュールに同封されているコマンドもしくは `Wallflower` モジュールを指すことになるんだけど、ドキュメント等によると本来動的であるPlackアプリケーションを静的HTMLのサイトに変換することを目的とされている。Songmuさんの[Riji](https://github.com/Songmu/p5-Riji)の内部でも使われている。詳しくはチュートリアルがあるのでこの辺りを…

- [Wallflower::Tutorial - Turn your Plack app into a static site - metacpan.org - Perl programming language](https://metacpan.org/pod/release/BOOK/App-Wallflower-1.004/lib/Wallflower/Tutorial.pod)

で、試した見たところ、MojoliciousはPSGIを簡単に吐いてくれるので `wallflower` コマンド一発で静的HTMLを見事に書き出してくれた。例えばこんなアプリがある。

```pl:lib/MyApp.pm
package MyApp;
use Mojo::Base 'Mojolicious';

sub startup {
    my $self = shift;
    my $r = $self->routes;
    # Rootコントローラはつくらず auto_render でテンプレートを直接レンダリングさせる
    $r->get('/')->to('root#index');
    $r->get('/about.html')->to('root#about');
    $r->get('/news.html')->to('root#news');
}

1;
```

テンプレート内でリンクを張っているとそこを `wallflower` が辿ってくれるので、URLをとりわけ明示しなくてもよい。なので共通で使用するレイアウトの部分でメニューを用意した。

```html:templates/layout/default.html.ep
<!DOCTYPE html>
<html>
  <head><title><%= title %></title></head>
  <body>
    <ul id="menu">
      <li><a href="/index.html">Top</a></li>
      <li><a href="/about.html">About</a></li>
      <li><a href="/news.html">News</a></li>
    </ul>
    <%= content %>
  </body>
</html>
```

あとは個別に

- index.html
- about.html
- news.html

の中身を適当に書く。そしていよいよ `wallflower` コマンド実行。`-a` もしくは  `--application`  で渡すオプションは `mojo generate app MyApp` で生成されるスクリプトを指定してみた。

```
$ wallflower -a script/my_app -d public

200 / => public/index.html [283]
304 /index.html
200 /about.html => public/about.html [287]
200 /news.html => public/news.html [285]
```

おお、出来た出来た＼(^o^)／ 当然「Any Plack Application」に対応しています。「Plack寄せ」ならこうかな！
ファイルを分割していると OMake + BibTeX がうまくいかない

OMake + BibTeX の話です。

OMake で BibTeX (もしくは LaTeX) を扱う方法について調べてみると、一様に皆こんな感じのことを言っています:

 * めっちゃカンタンだった。
 * 何もしなくてもよかった。
 * すべてよしなにしてくれた。
 * [身長が 5cm 伸びた。](http://d.hatena.ne.jp/hayamiz/20081208/1228727272)

おいおいマジか。じゃぁカンタンなんだろう… うちの OMake + LaTeX でも BibTeX させちゃうぞ！

```mf:~/hoge/OMakefile
open build/LaTeX

LATEX=platex
BIBTEX=pbibtex
DVIPDFM=dvipdfmx

LaTeXDocument(hoge, hoge)
.DEFAULT: hoge.dvi hoge.pdf
```

```shell-session
uda@host:~/hoge $ omake
*** omake: reading OMakefiles
*** omake: finished reading OMakefiles (0.17 sec)
- build . hoge.dvi
+ <if ... then ... [else ...]>
Enviroment variables TEXINPUTS, BIBINPUTS, BSTINPUTS set to .:
- build . hoge.dvi
+ Shell.run-latex(platex -kanji=utf-8 hoge)
This is e-pTeX, Version 3.1415926-p3.4-110825-2.6 (utf8.euc) (TeX Live 2013/Debian)
 restricted \write18 enabled.
 :
 :
- build . hoge.pdf
+ dvipdfmx -p a4 -o hoge.pdf hoge.dvi
hoge.dvi -> hoge.pdf
[1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16]
```

ん？

んんん？

```shell-session
uda@host:~/hoge $ ls *.bbl
zsh: no matches found: *.bbl
```

なんか…… bibtex 先生…… **呼　ば　れ　て　な　い　!!!?!?**

やだなー とりあえず clean してキャッシュ削除してもっかいやってみるかー… 変わらないなー… んー、```TEXDEPS[]``` 書くといいのかな？… 変わらないなー… う、うーん………？？？

ググってもみんなカンタンだカンタンだ身長伸びたと言ってるのにうまくいかない、つらいですね。まぁなんでダメだったのか結論を言うと、OMake のデフォルトの build/LaTeX モジュールが、ファイルを分割している場合の BibTeX に対応していなかったんですね。

```mf:/usr/lib/omake/build/LaTeX.om
#
# Required version of omake
#
OMakeVersion(0.9.8.5, 0.9.8.5)

########################################################################
# Building LaTeX documents.
#
# Copyright (C) 2003-2007 Jason Hickey and Mojave Group
 :
 :
            if $(and $(file-exists  $(name).aux), $(grep q, $'\\citation', $(name).aux), $(grep q, $'\\bibdata', $(name).aux))
                $(BIBTEX) $(name)
                run-latex $(prog) $(flags) $(name)
 :
 :
```

今の場合、hoge.aux が存在してかつそこに ```\citation``` と ```\bibdata``` の記述がある場合にのみ ```$(BIBTEX)``` が呼び出される仕組みになっているようです。しかし、私は、TeX ファイルを分割するため ```\input{other}``` を使っていました。すると、.aux ファイルは次のようになります。

```~/hoge/hoge.aux
\@input{other.aux}
```

```~/hoge/other.aux
\citation{fuga}
\bibdata{reference}
```

```hoge.aux``` には ```\citation``` も ```\bibdata``` もないからわざわざ ```$(BIBTEX)``` 呼び出す必要はないね！飛ばそう！ **全　然　よ　く　な　い　！**

はい、仕方ないので、```/usr/lib/omake/build/LaTeX.om``` をコピーしてきて、該当行だけ修正してビルドすることにしました。```\@input{other.aux}``` を読んで再帰的に条件をチェックするのはダルそうなので、単純に ```hoge.aux``` の存在確認だけするようにします。

```mf:~/hoge/OMakefile
#open build/LaTeX
open myLaTeX
 :
 :
```

```mf:~/hoge/myLaTeX.om
:
:
            if $(file-exists  $(name).aux)
                $(BIBTEX) $(name)
                run-latex $(prog) $(flags) $(name)
:
:
```

これで無事 ```omake``` したときに ```(p)bibtex``` が呼ばれるようになりました。めーたしめーたしー

## 参考文献
* [13. ビルド関数とユーティリティ &mdash; OMakeマニュアル 日本語訳](http://omake-japanese.sourceforge.jp/build.html?highlight=latex)
* 有象無象の blog たち
ohai 


インベントリ収集ツール
chef-client / chef-solo が使っている

###コマンドライン

```
$ ohai
```

###Ohai::Systemオブジェクと

```
$ pry
> ohai = Ohai::System.new
> ohai.data
{}
```
プラグインパスは設定されている

```
> Ohai::Config[:plugin_path]
=> ["/Users/hogehoge/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/ohai-6.20.0/lib/ohai/plugins"]
```

### OS情報取得

```
> Ohai::Config[:plugin_path]
=> ["/Users/hogehoge/.rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0/gems/ohai-6.20.0/lib/ohai/plugins"]
> ohai.require_plugin “os” 
> ohai.data
```

### プラットホーム
 
```
> ohai.require_plugin “platform”
=> => {"languages"=>
  {"ruby"=>
  — .. —
 "os"=>"darwin",
 "os_version"=>"13.0.0",
 "platform"=>"mac_os_x",
 "platform_version"=>"10.9",
 "platform_build"=>"13A603",
 "platform_family"=>"mac_os_x"}
```

### パスにあるプラグインをすべて実行

```
> ohai.all_plugins
> ohai.seen_plugins
```
Carton を使う


perlのbundler。ローカルのフォルダにインストールできるので、配布時に便利。

###1. ローカルユーザでcpanを実行

基本デフォルト値でOK
macの場合、こんなの表示されるので xxshrc などに追加

```bash
export PERL_LOCAL_LIB_ROOT="/Users/<ユーザ名>/perl5:$PERL_LOCAL_LIB_ROOT";
export PERL_MB_OPT="--install_base "/Users/<ユーザ名>/perl5"";
export PERL_MM_OPT="INSTALL_BASE=/Users/<ユーザ名>/perl5";
export PERL5LIB="/Users/<ユーザ名>/perl5/lib/perl5:$PERL5LIB";
export PATH="/Users/<ユーザ名>/perl5/bin:$PATH";
```

local::lib を使えば楽にexportできる。

```bash
$ eval $(perl -I/home/hogehoge/perl5 -Mlocal::lib)
```

```bash
$ eval $(perl -I/home/hogehoge/local/lib/perl5 -M"local::lib '/home/hogehoge/local'")
```

###2. cpanminus のインストール

```bash
$ brew install cpanminus
```

centなどはyumレポジトリにないので直接インストール

```bash
$ sudo curl -L http://cpanmin.us | perl - --sudo App::cpanminus
```

###3. carton のインストール

```bash
$ cpanm Carton
```

###4. cpanfile を書いて、インストールする

```
$ cd somedirectory
$ vim cpanfile
requires ‘JSON’
$ carton install
```

cpanfile の syntax は、
http://search.cpan.org/~miyagawa/Module-CPANfile-0.9031/lib/cpanfile.pod
を参考にする
情報収集の光と闇

#はじめに
この記事は、
- [NEET Advent Calendar 2013 - Qiita [キータ]](http://qiita.com/advent-calendar/2013/neet)
の17日目のものです。

ここではニートのための情報収集術を書こうと思います。

ただ、どのRSSリーダーが良いとか、Evernoteで情報を整理しようとか、そういう技術的な話は一切しません。

#順風満帆から転落へ

自分も今でこそほぼニートですが、昔はれっきとしたITエンジニアでした。

常に最新の情報を取り入れようとRSSリーダーの数百件の記事を消化しつつ、勉強会にも積極的に出席し、新しい技術が現れたらすぐに試してみて、良さそうであればプロジェクトに取り入れる、そんな毎日でした。

そしてオーバーワークの末、脳がオーバーヒートしました。

#転落から再起、しない

その後一年間ほど、一切の技術的な情報をシャットアウトして暮らしていました。

するとだんだん、自分はただ情報の海に溺れていただけなんだと分かってきたのです。情報収集のやり方が根本的に間違っていたことを思い知らされました。

だから再起は、しません。

#ニートのための情報収集術

やっと本題です。

##情報収集はただの娯楽である

最新の情報をキャッチアップすることを、何か崇高な行為だと勘違いしていませんか？

そんなことはなく、ただの娯楽です。ゲームで遊んだり、カラオケで歌ったりするのと何の違いもありません。そこんとこを意識して、ほどほどに情報収集をプレイしましょう。

##焦燥感を捨てる

毎日情報収集していると、謎の焦燥感に襲われることはないですか？

置いてけぼりにされそうな、漠とした不安。

「このムラ（業界）から追い出される恐怖」と言い換えてもよいでしょう。

それは全て幻想です。はっきり言えば、 **情報収集中毒** です。麻薬と同じ。後から恐ろしい後遺症がやってきます。

そんなものは、捨ててしまいましょう。

##休むの大事
身体が健康であることを、その他すべてのことより優先させてください。

「スキマ時間でできる情報収集術！」などといった記事に惑わされてはなりません。スキマ時間は休むためにあります。

##幅を広げる
ニートになると運動不足になるので横幅が広がりますね。

そういうことではなく、IT系の情報のみ収集していると一本道にハマってしまい、奥行きは深くなりますが、幅は狭いままとなり、いざというときに逃げられなくて積みます。

ですから、IT系以外の情報も収集しましょう。いくつかのメリットがあります。

- 息抜きになる
- 煮詰まっていることの解決策になったりすることも
- 世界の広さを知り、自分の中の風通しが良くなる

自分のおすすめは「図書館に行き、古典を読む」です。貧乏だけど時間だけは有り余っているニートにはピッタリですね。

古典は長年生き抜いてきただけあって、強くて正確です。

#おわりに
決して情報収集がいけないことだとか、情報収集を軽んじているわけじゃありません。無理せず、自然にやりましょう。てことで。
MojoliciousでMiddleman的なことをする簡易版

**そもそもMiddleman使ったこと無くて** 静的HTML書き出しは都度簡単なスクリプトを書いてて、とはいえ、Mojolicious::Liteアプリを一枚立ち上げとけばいいよな、なんて思ってたら、GitHub Pages使う時なんか便利だよねーと思っている今日このごろです。で、[15日のAdvent Calendarでmozquitoさんが「MojoliciousでMiddleman的（静的HTML書き出し）なことをする」というエントリーを書いてて](http://qiita.com/mozquito/items/4f204d74249b17b53f6e)

> あーなるほどこういうMojoliciousの使い方あるんだー

と非常に面白かったです。で、もうちょっと簡単に、例えば「Mojoliciousのテンプレート機能だけ使いたいんだよ！」とわりきって使う方法があるかなーと考えてみました。各種設定は、Mojolicious::Plugin::Configを使うもしくは、テンプレート内でstashを経由して引き回すことを想定しています。今回はあまりディレクトリ切らずに

```
$ mojo generate app MyApp
```

としてアプリケーションをつくりました。そこにRoutingの定義を書きます。これは存在して欲しいHTMLファイルをベターと書けばOKです。`root#index` とありますが `Root` コントローラーはつくらないで `auto_rendering` を効かせてそのままテンプレートをレンダリングします。

```pl:lib/MyApp.pm
package MyApp;
use Mojo::Base 'Mojolicious';

sub startup {
    my $self = shift;
    my $r = $self->routes;
    $r->get('/index.html')->to('root#index');
    $r->get('/about.html')->to('root#about');
    $r->get('/news.html')->to('root#news');
}

1;
```

静的ページなので `.html` と拡張子を付けておきます。あとはmozquitoさんのスクリプトをヒントにしてスクリプトを書きます。この際に明示的に `Mojolicious::Routes` の `chiildren` メソッドを呼び出し `Mojolicious::Routes::Route` の一覧を取得。`render` メソッドでパスを取得しています。この場合だと

- /index.html
- /about.html
- /news.html

になります。それをそのまま `Path::Tiny` に食わせて `public` ディレクトリに書き出しています。この辺はまぁー各自の環境によってよしなに。

```pl:publish.pl
use strict;
use warnings;
use Mojo::UserAgent;
use Path::Tiny;
use MyApp;

my $ua = Mojo::UserAgent->new();
$ua->server->app( MyApp->new );
my $routes = $ua->server->app->routes();
for my $r ( @{ $routes->children() } ) {
    my $path = $r->pattern->render();
    my $tx = $ua->get($path);
    next if $tx->error;
    my $html = $tx->res->text;
    print "Redering $path ...\n";
    path('public')->child($path)->spew_utf8($html);
}
```

個人的にはMojoliciousのテンプレート周りは使い勝手が非常によいのでそれでスタティックサイトをつくれるとなるとなかなか便利じゃね！って思ったのでmozquitoさんのアイデアと実装に感謝ですね。

### 追記

### SEE ALSO / Thanks to tokuhirom 

- [Sorry I can't dance, I'm holding on to my friend's purse | BooK [blogs.perl.org]](http://blogs.perl.org/users/book/2012/09/sorry-i-cant-dance-im-holding-on-to-my-friends-purse.html)
RSpecでヘルパーメソッドを定義する


複数のテストケースで共通する処理を別メソッドに置きたい場合、以下のようにヘルパーメソッドを定義する事ができる。

```ruby
describe “a test group” do

  def my_helper_method
     :available
  end

  it “has access to methods defined in its group” do
    expect(my_helper_method).to be(:available)
  end
end
```

- メソッドのスコープはグループ内
  - 子グループは親グループのメソッドを使用できるが、親は子のメソッドを参照できない。
- 参照： https://www.relishapp.com/rspec/rspec-core/docs/helper-methods/arbitrary-helper-methods

- 他にも module にhelperメソッドを定義する方法もある。広い範囲で共通に使われる処理はこのように定義しておいた方が便利。
  - https://www.relishapp.com/rspec/rspec-core/v/3-0/docs/helper-methods/define-helper-methods-in-a-module
【jQuery】要素の選択(children,parent,siblings,next,prev)

こんにちは。
本日は要素の選択をやっています。

##やっていること自体の理解はできているのですが、  
##どのように使われるのかがちょっとまだ理解できていません。  
  
jQueryでリスト表示とか、あのアコーディオンみたいな  
選択メニューの際に使われるのでしょうか。  
と、あたりをつけています。  
  
'私'を基点として、学習していくと、
結構理解しやすかったです。  
  
参考：  
http://jeek.jp/study/section30/1
  
```html
<div id="grandparent">祖父
  <div id="parent">父
    <div id="sibling1">兄</div>
    <div id="sibling2">姉</div>
    <div id="target">わたし
      <div id="children1">息子</div>
      <div id="children2">娘</div>
    </div>
    <div id="sibling3">弟</div>
    <div id="sibling4">妹</div>
  </div>
</div>
```
  
>
children() ... 各要素内全ての「子」要素を選択
parent() ...   各要素内全ての「親」要素を選択
siblings() ... 各要素内全ての「兄弟」要素 を選択 
  
>
next() ... 1つ次に来る「兄弟」要素を選択
prev() ... 1つ前に来る「兄弟」要素を選択  

```js:ex)
$(function(){
    $("target").next().children().css("color","blue") ;
)}
```

この場合だと、id="target"要素の次に来る兄弟要素の子要素。
ということなんですね～。
やりかたは理解！

さて選択ができるようになったところで、
どのように活かせるのだろうか～調べてきます。

それでは、これからも宜しくお願いいたします。
Vim tips


## Using backspace/delete

Add this to your .vimrc

    :set backspace=2

## Using mouse in vim

    # in your .vimrc
    :set mouse=a
    # for NERDTree
    let g:NERDTreeMouseMode=3 

## Display current working file path and name

    :echo expand('%:p')

## Replacing 

    # replace " at the beginning of each lines with four spaces. Note a space after ".
    :%s/^ /    / # note that you don't need the last / but there are four spaces.
    # move intentation to left for every line
    :%normal <<


## Select all and yank

    gg"+yG

    :%y+

## Reload .vimrc from Vim

    # if you are in .vimrc
    :so %
    # from other file
    :so $MYVIMRC

    # check your .vimrc
    :echo $MYVIMRC

Or add the following to your .vimrc to auto-load

ex1

    augroup myvimrchooks
        au!
        autocmd bufwritepost .vimrc source ~/.vimrc
    augroup END

ex2 [Auto-Reload Your Vimrc](http://www.bestofvim.com/tip/auto-reload-your-vimrc/)

    augroup reload_vimrc " {
        autocmd!
        autocmd BufWritePost $MYVIMRC source $MYVIMRC
    augroup END " }


## No highlight after search
After a search words are hightlighted. but using `:noh` or `:nohl` hightlight will be disabled. If you want it back then type `n`.

    :noh

## vim and shell

    # go to shell
    :sh 
    :shell
    # go back to vim
    exit

    # go to shell
    ctrl+z
    # go back to vim

## Save as

    :w ~/dirname/filename.md
    # to overwrite
    :w! ~/dirname/filename.md

## Printing vim doc

Print it out from a browser. 

    # change to html
    :TOhtml
    # save it
    :w ~/Documents/filename.html
    # open it in a browser and print it out
    # or save it as a txt and open it from another programme and print it out.
    
## Delete all

    :%d

% is all lines in range. So you can use `:%s/old/new/g` to substitute all.

## Range 
[Range](http://vim.wikia.com/wiki/Ranges)

    1 # first line
    $ # last line
    . # current line
    % # all lines
    21,25 # lines 21 to 25 inclusive
    .,$ # current line to end
Ping の結果 192.168.0.255/24

ネットワーク上のPC台数(NIC数)を調査するために使った。

```bat:誤った例
echo off
for /L %i in (1 1 255) do ping 192.168.0.%i
echo on
```

### 実行

```bat:ブロードキャストピング
ping 192.168.0.255
```

### 結果確認

```bat:windows
arp -a
```

```bat:linux(流行らない)
arp -n
```
AngularJS　まずやってみるひと！へのまとめ

##読み込み
CDNを読み込み。

```html
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.min.js"></script>
```


##宣言

```html
<body ng-app>
```



##View
###テキスト
{{メソッド名}}



###attrの付与
```html
ng-click="メソッド名()"
```


###classの付与
even、oddで交互にclass付与可能。

```html
<div ng-class-even="'クラス名'"></div>
```



##Controller
###html側の設定

```html
<div ng-controller="helloCtrl">
	<span>{{hello}}</span>
</div>
```
⇒controller内にcontrollerの入れ子も可能、親を継承。

###js
基本の形はこれ。

```javascript
function コントローラー名($scope){
  $scope.メソッド名 = xxx;
}
```

上のHTMLに対応させるとこんな感じ。

```javascript
function helloCtrl($scope){
  $scope.hello = "Hello, World";
}
```

次に、クリックで反応させるとなるとこんな感じ。

```html
<button ng-click="goodbye()">Good Byeに変更</button>
```

```javascript
function helloCtrl($scope){
  $scope.goodbye = function(){
    $scope.hello = "Good Bye";
  }
}
```

##Tips
###データとリピートについて

```javascript
$scope.users = [
	{"name":"A", "score":"1"},
	{"name":"B", "score":"2"},
]
```
```html
{{users.length}}
```

リピート内では、userになる。

```html
ng-repeat="リピート内の変数名 in 元の変数名"
```

```html
<div ng-repeat="user in users">
	{{user.name|uppercase}} //大文字
</div>
```



**indexを取得**

```html
<div ng-repeat="user in users">
	{{$index+1}} //◎番目かを返す。
	{{$first}} //1番目true、それ以外false。
	{{$middle}} //first、last以外true。
	{{$last}} //最後true、それ以外false。
</div>
```

###フィルタについて
* **お金**
|currency:"¥"

* **日付**
|date:'yyyy-MM-dd'

```javascript
var today = new Date();
```
```html
{{today|date:'yyyy-MM-dd'}}
```

* **順番**
|orderBy:'-score' //scoreの大きいもの順。-を外せば小さいもの順。

* **個数限度**
|limitTo:3 //3つだけ抽出

* **文字フィルタ**
inputの内容に応じて表示される。

```html
<input type="text" ng-model="query"> //全プロパティに反応
<input type="text" ng-model="query.name"> //nameプロパティにしか反応しない
<div ng-repeat="user in users|filter:query">
```


###その他

* htmlの{{}}内はjs動く（？）
　{{5 * 3}}　と記述すると、ブラウザでは15 と出る。
一階述語論理ベースの古典的プランニングと lisp

はい。

http://guicho271828.github.io/advent-calender-2013-17/

コメントはここへおねがいします。

update:
here are additional comments by alexf (sorry currently my IM's dead)


```
[18時47分38秒] AlexF: ＞速度こそが一番の重要事項であるこれらのプランナの実装は、 昔はCL製のものもあったものの、今はC++などに移ってきています。
ＮＡＳＡの場合、そのとおりでしたが、それは１９９０年代のon-board CPUが非常に性能悪いプロセッサだったからです。DS-1をはじめ、９０年代から２０００年代前半まで使われたのは　RAD6000 http://en.wikipedia.org/wiki/IBM_RAD6000

wikipedia: "The computer has a maximum clock rate of 33 MHz and a processing speed of about 35 MIPS.[2] In addition to the CPU itself, the RAD6000 has 128 MB of ECC RAM."

当時こんな環境でＬｉｓｐが動いただけでもvery impressive.
2000年代になってＡＩ分野若手研究者のＬｉｓｐ離れが（いろいろな理由）が原因で、プランニングの研究もＬｉｓｐ＝＞ｃ＋＋へ。　
ＣＬでも十分早いプランナは書けるはず。全く同じアルゴリズムをc++ 対ＣＬで比較すると２．５倍程度の差があるが、　この分野の場合、そもそも定数倍（small constant)の差で勝ち負けきまる勝負なんかせず、　１０倍以上の差、あるいはstate-of-the-artで全くとけない問題を解く新たなプランナを目指すべき。新しいアイデアをバンバン出すならrapid prototyping に向いたＣＬは良いと思います。
```
Eclipseでファイルのdiff方法


複数ファイルを選択し、右クリック
` Compare With` -> `Each Other`
で可能


# 参考
[How do I compare two files using Eclipse? Is there any option provided by Eclipse? - Stack Overflow](http://stackoverflow.com/questions/4623564/how-do-i-compare-two-files-using-eclipse-is-there-any-option-provided-by-eclips)
Vimの即興シェルで拡張子変換


#例
`*.md`を`*.markdown`に変換

### 対象ファイルがあるディレクトリでVimを開く
```sh
-> % vim
```

### 一覧取得
ノーマルモードで以下を実行

```vim
!!find . -name '*.md'
```
もしくはzshなら

```vim
!!ls -1 **/*.md
```
でも可。
これで１行に１ファイルのリストが取得出来る。

### コマンド作成
取得したリストを元にmvコマンドを生成。
コマンドモードで以下を実行。

```vim
:%s/\(.*\).md/mv & \1.markdown/
```
これで`*.md`を`*.markdown`にmvするコマンド一覧が作成出来る。

### シェル実行
生成したコマンドをシェルに流す。
コマンドモードで以下を実行。

```vim
:%!sh
```

そして`:q!`でVimを抜ければ作業終了。
シェルスクリプトをわざわざ作らずに即興で作業したい場合に便利です。

あと、ファイル名のキャメルケース、スネークケース変換など
Vimプラグイン固有の機能を使いたい場合などにも本Tipsが役に立つと思います。

* https://github.com/tpope/vim-abolish
* [markup編集時に使用しているpluginとか - CHROMA](http://chroma.hatenablog.com/entry/2013/01/10/235018)
関数エイリアス

文字列から1文字を見つけてみます。

```php
if (strchr('abcde', 'c')) echo 'c 見つけた';
```

しかし、よく考えると、PHPには1文字を表す型は無かったのでは？

```php
if (strchr('abcde', 'bcd')) echo 'bcd 見つけた';
```

これでも正常に見つかります。関数名と挙動が一致していません。

どうやら、strchr関数はstrstr関数の別名らしいのです。
これを **関数エイリアス** と言います。

どちらの関数を呼び出しても、全く同じ機能を提供します。

##関数エイリアスのリスト

詳しくは<http://php.net/manual/ja/aliases.php>

個人的に混乱しやすいものを以下にまとめます。

| **エイリアス名** | **元の関数名** |
|:-----|:-----|
|strchr |strstr |
|fputs |fwrite |
|die |exit |
|join |implode |
|chop |rtrim |
|is_double |is_float |
|is_long |is_int |
|sizeof |count |

他の言語から移行してきた方は注意が必要かも？
##注意点
- fputs関数とfwrite関数は同じ関数ですが、fgets関数とfread関数は別の関数です。fgets関数は一行、fread関数は指定したバイト数を読み込みます。
- join関数とimplode関数は同じ関数ですが、split関数とexplode関数は別の関数です。split関数は区切り文字に正規表現が使えます。explode関数は正規表現は使えませんが高速です。PHP 5.3.0 以降はsplit関数は非推奨となりましたので、preg_split関数を使いましょう。
- echoとprintは別の言語構造です（どちらも関数ではありません）。挙動が微妙に違いますが、あまり意識する必要はないでしょう。
JavaScriptで文字列をObject.createするとTypeError、new Stringすると・・・

GoogleChrome31で試しました。

# Object.create
直接Object.createするとTypeErrorが起きます。

```js
> Object.create("abc");
TypeError: Object prototype may only be an Object or null
```

new Stringすると・・・

```js
> Object.create(new String("abc"));
String {0: "a", 1: "b", 2: "c"}
```

# 文字列化

ただし、文字列化しようとするとTypeErrorが起きます。

```js
> String(Object.create(new String("abc")));
TypeError: String.prototype.toString is not generic
```

newしただけなら文字列化できます。

```js
> String(new String("abc"));
"abc"
```
[Grails]servicesで直接SQLを実行する方法

SQLを全部自分で書きたい！という場合はserviceの中に書いてしまいます。

まずは以下のコマンドでSerivceクラスを生成

```groovy
grails create-service hogepackage.Hoge
```

生成されたソースを以下のよう編集。

```groovy
package hogepackage

import grails.transaction.Transactional
import groovy.sql.Sql

import javax.sql.DataSource

@Transactional
class HogeService {

    def serviceMethod() {

    }

    // DataSourceをDI
    // これで現在実行中の環境（devとかtestとかprodとか）でのデータベースコネクションが利用できる。
    DataSource dataSource

    def foobar(){

        def sql = new Sql(dataSource)

        def query = """
            ここにSQLを記述
        """.toString()
        sql.rows(query)
    }

}
```

で、上記のサービスのメソッドをコントローラで利用する場合は以下のような形で記述する。

```groovy
    // ココで、上記で作ったサービスをDI
    // メンバ変数として、単純にクラス名（サービス名）の先頭を小文字にしたものを宣言するだけ。
    def hogeService 
    def testMethodInController(){

        hogeService .foobar()

    }
```
PHPのissetの罠

これは[ADVENTARのPHP Advent Calendar](http://www.adventar.org/calendars/101)17日目のエントリです。

早速ですが、このコードの`var_dump`は何を出力すると思いますか？

```php
$hoge = "fuga";
var_dump(isset($hoge["fuga"]));
```

実行してみましょう

```
$ php -r '$hoge="fuga";var_dump(isset($hoge["fuga"]));'
bool(true)
```

`true`です。なぜだか分かりますか？僕は最初このphpの処理系が茶目っ気を出してふざけてるのかと思いました。

一度`isset`を外してみましょう

```
$ php -r '$hoge="fuga";var_dump($hoge["fuga"]);'
string(1) "f"
```

`f`が返りました。この`f`はなんでしょう？
実は`$hoge`に格納された文字列の1文字目です。

つまり、`$hoge["fuga"]`の`"fuga"`が数値にキャストされ`0`になり、`$hoge[0]`が評価され文字列の1文字目が取り出されたわけです。で、最初の話に戻って`isset($hoge["fuga"])`が`true`になったわけです。PHPの豆腐のような柔軟性にはほとほと困ったものです。

ですが、流石にPHPの中の人も「流石にねーわ」と思ったのか、PHP5.4.0からは挙動が変わりました。

    Changelog
    Version		Description
    5.4.0		Checking non-numeric offsets of strings now returns FALSE.

http://php.net/isset#refsect1-function.isset-changelog

5.4.0から文字列入った変数のnon-numericなoffsetsのチェックはfalseを返すよ、って感じですね。
ちなみにさっきの実行したphpは5.3でした。

```
$ php -v
PHP 5.3.26 (cli) (built: Jul  7 2013 19:05:08)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies
```

では5.4で実行してみましょう。

```
$ phpenv global 5.4snapshot
$ php -v
PHP 5.4.24-dev (cli) (built: Dec 11 2013 01:49:21)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
    with Xdebug v2.2.1, Copyright (c) 2002-2012, by Derick Rethans
$ php -r '$hoge="fuga";var_dump(isset($hoge["fuga"]));'
bool(false)
```

確かにfalseが返りますね。ちなみにほぼこれやるためだけにphpenv入れました。
ここで一つ疑問に思ったんですが、"non-numeric"ってどこまでがnumericでどこからnon-numericなんでしょう？
PHPには`is_numeric`という関数がありますし、それに従う気もします。
というわけで`is_numeric`と合わせて試してみました。versionはさっきと同じ5.4.24です。

```
$ php -r '$hoge="fuga";
$numerics = array(0, "0", 0x0, "0x0", 0.0, "0.0", 0.5, "0.5", 01, "01", 0b0, "0b0", 1e0, "1e0", false, null, array());
foreach ($numerics as $numeric) {
    var_dump($numeric, isset($hoge[$numeric]), is_numeric($numeric));
    echo "\n";
}'
```

このスクリプトを実行した結果を表にしたのが以下です。

|`$numeric`|`isset($hoge[$numeric])`|`is_numeric($numeric)`|
|:-:|:-:|:-:|
|0|true|true|
| "0"|true|true|
| 0x0|true|true|
| "0x0"|true|true|
| 0.0|true|true|
| "0.0"|false|true|
| 0.5|true|true|
| "0.5"|false|true|
| 01|true|true|
| "01"|true|true|
| 0b0|true|true|
| "0b0"|false|false|
| 1e0|true|true|
| "1e0"|false|true|
| false|true|false|
| null|true|false|
| array()|false|false|

一貫性がなさすぎてびっくりですね...
この結果をまとめると

- （`$hoge`の文字列の長さの範囲の）数値を渡した場合は`isset`, `is_numeric`ともに`true`になる
    - `0.5`で`isset`が`true`になるのが気に食わない
    - ちなみに`$hoge[0.5]`を使おうとするとNoticeが出る
- `null`や`false`は`is_numeric`は`false`のくせに`isset`は`true`
- `array()`は当然どちらも`false`
- 文字列の`is_numeric`は`"0b0"`が`false`、それ以外は`true`
    - `0b`で始まるのは[2進数の整数リテラル](http://php.net/manual/ja/language.types.integer.php)
    - `is_numeric`は本題ではないが`"0x0"`とか`true`になるのに`"0b0"`が`false`になるのが気に食わない（バグ？）
- 文字列の`isset`は`"0"`, `"01"`, `"0x0"`が`true`、他は`false`
    - `"0b0"`や`"1e0"`が`false`で`"0x0"`がtrueなのが気に食わない。

この実験から分かることは、そもそも文字列に`isset`使うな、という話ですね。`isset`を使う時は配列を相手にすることが多いと思うので、そういう場合は`is_array`で配列であることを確認してから`isset`を使うのが良さそうです。

ちなみにphp5.3で（`0b0`を抜いて）実行した場合、`isset`の列は全てtrueになりました。
Sencha ExtJSにおけるGrid操作のメモ書き

### Sencha ExtJSにおけるGrid操作のメモ書き

この記事は [Sencha Advent Calendar 2013](http://www.adventar.org/calendars/137) 17日目の記事です。

初めてこういった記事を書きます。
まだまだ勉強中の身で何を書こうかさんざん迷った末、最近苦労したGridのことについて書くことにしました。

---------------------------------------

##### 前提として

やりたかったこと

+ Gridにたくさんのカラムを表示（300個とか）
+ 表示するカラムをサーバーから取得するデータによって変える

といったことをやろうとしました。

---------------------------------------

##### 最初に試したこと

    showColumns: function(grid) {
        var me = this,
            columns;

        columns = grid.down('headercontainer').getGridColumns();

        Ext.Array.each(columns, function(col) {
	        // 条件分岐とかここで入れる
            col.show();
        });

    }

Gridのcolumnsは全て **hidden** で定義しておいて、必要なものを上記のようなコードで必要なものだけ **show** しようとしました。

Gridの全カラムは

    grid.down('headercontainer').getGridColumns();

とすることで取得できます。

その結果・・・

いつまでたっても表示されない!!

なんで(´・ω・｀)

実行時間を計測してみました。

    showColumns: function(grid) {
        var me = this,
            columns;

        columns = grid.down('headercontainer').getGridColumns();

        console.time('columnShow');

        Ext.Array.each(columns, function(col) {
            col.show();
        });

        console.timeEnd('columnShow');
    }

３００個のカラムをshowした結果がこちら

![timer.png](https://qiita-image-store.s3.amazonaws.com/0/30646/2e431cb6-2b65-38cb-6a38-0a2687cf53ae.png "timer.png")

この数になるとshow/hideでのレイアウト計算にかなり時間がかかってしまうんですね。
かかる時間が現実的ではないのでこの方法では駄目ですね。

---------------------------------------


##### ではどうするか？

Gridに便利なメソッドが用意されていました。

***reconfigure***

このメソッドはGridの **store** や **columns** の定義を新しくしてくれるのです。
引数は２つ、 store, columns の順番で、変更したくないものは渡さなければよいとのこと。

ふむふむ


試してみました！

    showColumns: function(grid) {
        var me = this,
            columns;

        console.time('showColumns');

        columns = me.createColumns();
        grid.reconfigure(undefined,columns);

        console.timeEnd('showColumns');
    },

    createColumns: function() {
        var me = this,
            colConfig = [];

        for (var i = 1; i <= 300; i++) {
            var tmp = {
                text: i,
                dataIndex: 'test' + i,
                width: 60
            }

            colConfig.push(tmp);

        };

        return colConfig;
    },


![reconfigure.png](https://qiita-image-store.s3.amazonaws.com/0/30646/121e0e27-3bee-e498-e2d7-170d6d2c002c.png "reconfigure.png")


これは早い！
このメソッドを使えば、columnsを変えたり、storeを変えたりが簡単にできるのでした。

便利なメソッドがあるものです。もっと[APIドキュメント](http://docs.sencha.com/)読み込まねば・・・!

---------------------------------------

というわけでGridの **reconfigure** についてでした。
Advent Calendar も残り８日ですね。毎日みなさんの記事を楽しみにしています。

それではまたの機会に・・・
AngularJSのTutorialのstep-10よりEvent Handlerの組込み

AngularJSの[Tutorial](http://docs.angularjs.org/tutorial/)の[step-10](http://docs.angularjs.org/tutorial/step_10)を遂行したレポートになります。

## [step-10](http://docs.angularjs.org/tutorial/step_10)

このstepでは、clickイベント時の処理を実装したデモを通して、課題を遂行します。
clickイベントで、スマホのメイン写真を選択してクリックしたサムネイル写真に切り替えるevent handlerを作成したControllerの抜粋が下記です。

### Controller

```js:app/js/controllers.js
phonecatControllers.controller('PhoneDetailCtrl', ['$scope', '$routeParams', '$http',
  function($scope, $routeParams, $http) {

  .... 省略 ...
 
    $scope.setImage = function(imageUrl) {
      $scope.mainImageUrl = imageUrl;
    }
  }]);
```

この実装を見た時に、あまりにも理にかなっていて逆に違和感を覚えました。
メイン画像設定event handler functionは、スマホ詳細画面のevent handlerでありその他では利用されないものである。


> ### Controllerとevent handler functionの違いメモ
> 
> ここで初めて、Controllerで定義するfunctionとevent handler functionの違いをはっきり理解できていなかったことに気づいていた。
> Controllerの説明の振り返りになるが、Controllerは、ngControllerディレクティブを持つBlockタグに囲まれた領域内の＄scope変数のData Binding が有効になる。または、ngViewで囲まれた領域内でData Bindingが有効になる。
> event handler functionは、ngControllerディレクティブもしくはngViewで囲まれた領域内でevent handlerを設置でき、またControllerと同じく＄scopeの変更結果は、ngControllerディレクティブもしくはngViewで囲まれた領域内に適用される。
> 内部的な処理結果の反映は同じである。違いは、
> 
> * Controllerは、ページ内にngControllerで指定されているかRoutingで定義したURLにアクセスされたときに詳細が分かる
> * event handler functionは、ユーザの操作が操作したときに初めて実行されることになる(event handlerなのだから当然か)。


### テスト

```js:test/e2e/sceinarios.js
...
  describe('Phone detail view', function() {
 
...
 
    it('should display the first phone image as the main phone image', function() {
      expect(element('img.phone').attr('src')).toBe('img/phones/nexus-s.0.jpg');
    });
 
 
    it('should swap main image if a thumbnail image is clicked on', function() {
      element('.phone-thumbs li:nth-child(3) img').click();
      expect(element('img.phone').attr('src')).toBe('img/phones/nexus-s.2.jpg');
 
      element('.phone-thumbs li:nth-child(1) img').click();
      expect(element('img.phone').attr('src')).toBe('img/phones/nexus-s.0.jpg');
    });
  });
});
```

1. デフォルトのメイン画像URLをチェックして
1. 3番目のサムネイル画像をクリックして、メイン画像URLが期待する画像になっているかを確認
1. 元のメイン画像に戻す

という上記の結果を、e2eテストという形で実装されている。

> ### ここでのデモスクリプトにおけるevent handler function実装の何が嬉しいか?
> 
> ｊQueryでは、各種event handler functionを定義する場合、$(function(){});という無名関数を使う。そして、この時、無名関数に実装された処理について知る方法として、ソースコードを読む以外に、ファイル名もしくはコメントで知ることになる。
> 大概の場合、特に管理されていない事が多く、一つの無名関数に無数の処理が羅列される。
> 
> AngularのようにController内に書くルールにすれば、Controller名がパッケージ的な役割で内部実装の明確な目的を与えてくれる。
> 一つの画面に数々の処理が実装されるような複雑な場合、フィーチャをグルーピングしてControllerを作成することになるのか。
ランダムな値を返す関数 on GLSL

## 実装

GLSL には noise[1234] が定義されているが、実装が GPU のドライバに強く依存するのでそれに依存しない擬似ランダム関数を GLSL だけで作れないかという話。http://stackoverflow.com/questions/4200224/random-noise-functions-for-glsl からそのまま引用。

```glsl
float rand(vec2 co){
    return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}
```

引数 co にはフラグメントシェーダの場合は **gl_FragCoord.xy** を渡す。引数は明らかに読み取り専用なので **const vec2 co** としたほうがよいかもしれない。使う場面として SSAO とか。

## どこから出てきたの？

ちなみにこの関数についてどこがオリジナルなのかの質問もある。どうやらそのサイトはすでに消滅しており、2008年2月にアーカイブされてたものがおそらくのオリジナルだろうということのようだ。
http://stackoverflow.com/questions/12964279/whats-the-origin-of-this-glsl-rand-one-liner

## Mali-400 上だと動かない模様

ARM の GPU である Mali-400 ではこの関数をそのまま使うことが出来ないようで対策版が作られている模様。
https://gist.github.com/johansten/3633917
image_optimを使ってMiddlemanのBuild時に画像を圧縮しよう


アドベントカレンダー2013 8日目の記事です。
[Middleman Advent Calendar 2013 - Adventar](http://www.adventar.org/calendars/251)

# 今北産業

* homebrewでimage_optimに必要なファイルをいれる
* gemとconfig.rbの設定
* buildに結構時間がかかるようになる(！)



## homebrewで必要なものをいれる
``` sh
$ brew install advancecomp gifsicle jhead jpegoptim jpeg optipng pngcrush
```

これだとpngoutだけ入らないので

[画像ファイルをまとめて最適化する - 終わる世界とコンテンツ](http://blog.geta6.net/post/28459947179)

``` sh
$ brew tap adamv/alt && brew install pngout
```

これをしておこうとしたら、この`adamv/alt`リポジトリがなかった。  
ので、無理やり入れてみる

[ImageOptim::BinNotFoundError when pngout is not installed. · Issue #1 · plasticine/middleman-imageoptim](https://github.com/plasticine/middleman-imageoptim/issues/1)


``` sh
$ brew install https://raw.github.com/cbguder/homebrew/53ea33bab5372ea74117ace8c44aa7ea988e93c2/Library/Formula/pngout.rb
```

これでおk


##  middleman-imageoptimのインストール
``` Gemfile
gem "middleman-imageoptim", "~> 0.1.3"
```

``` zsh
$ bundle install --path vendor/bundle
```


## cofig.rbでの設定

``` config.rb
configure :build do
  activate :imageoptim
end



activate :imageoptim do |options|
  # print out skipped images
  options.verbose = true

  # Setting these to true or nil will let options determine them (recommended)
  options.nice = true
  options.threads = true

  # Image extensions to attempt to compress
  options.image_extensions = %w(.png .jpg .gif)

  # compressor worker options, individual optimisers can be disabled by passing
  # false instead of a hash
  options.pngcrush_options  = {:chunks => ['alla'], :fix => false, :brute => false}
  #options.pngout_options    = {:copy_chunks => false, :strategy => 0}
  options.optipng_options   = {:level => 6, :interlace => false}
  options.advpng_options    = {:level => 4}
  options.jpegoptim_options = {:strip => ['all'], :max_quality => 100}
  options.jpegtran_options  = {:copy_chunks => false, :progressive => true, :jpegrescan => true}
  options.gifsicle_options  = {:interlace => false}
end

```

# これで middleman buildでimage optim できた！

## でも、結構時間がかかる

めちゃくちゃ画像の数が多くなるとけっこう困る遅さ。  
10ファイルで2〜3秒くらいかかってる。
ARC #008 のB問題


はい。
[http://arc008.contest.atcoder.jp/](http://arc008.contest.atcoder.jp/)

大まかな方針
英字キットを先頭から末尾まで見る。名前の中の文字と一致したらそれを削除。
英字キットを使い切ったのに開始前と名前の長さが変わってなかったら永遠に作れないので-1
長さが減ってればカウントを1上げてもう一度英字キットを先頭から〜

```python:op.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import sys
import io
import re
import math

(n,m) = map(int, raw_input().split())
#o = map(str, raw_input().split())
name = list(raw_input())
#p = map(str, raw_input().split())
kit = list(raw_input())
ans=0
zen=0
stp=len(name)
while 1:
    for i in range(len(kit)):
        if kit[i] in name: name.remove(kit[i])
    ans+=1
# != の条件は1周目でnameが0になる場合の対策
    if stp==len(name) or (zen==len(name) and len(name)!=0):
        ans = -1
        break
    elif len(name)==0:
        break
    zen=len(name)
print ans
```

見たことがないモジュールを使ってらっしゃる回答を見たのでメモ

```python:めも.py
>>> from collections import Counter
>>> a=Counter(raw_input())
abcdefgh
>>> a
Counter({'a': 1, 'c': 1, 'b': 1, 'e': 1, 'd': 1, 'g': 1, 'f': 1, 'h': 1})

>>> a['a']
1
## [' '] の中に要素名を入れると要素数を出せるっぽい

type(a) #<class 'collections.Counter'>
```
zshでファイル名を入力するとlessで開き、ディレクトリ名を入力するとls -laする（コマンドが見つからなかった時の処理をカスタマイズする）

# 概要
Twitterを眺めてたら

    「ディレクトリを指定したらls -la、ファイルを指定したらless」ってできないのかな
    https://twitter.com/kyo_ago/status/411365469552005120

っていうのを見かけて、zshなら出来そうだなーと思って調べたら出来そうだったので書きました。

# Code
以下を.zshrcに記述する。

```zsh
unsetopt auto_cd
function command_not_found_handler() {
    if [ $# != 1 ]; then
        return 127
    elif [ -d $0 ]; then
        ls -la $0
        return 0
    elif  [ -f $0 ]; then
        less $0
        return 0
    else
        return 127
    fi
}
```

# 解説
zshには`command_not_found_handler`という関数があり、コマンドが見つからなかった時の処理をカスタマイズ出来ます。引数はその時見つからなかったコマンドです。
また、127をreturnするとコマンドが見つからなかった時の通常処理が発動し、0を返すとそれが発動しません。
で、上記のコードでは、「引数が1つじゃなかったら通常の処理、ディレクトリなら`ls -la`、ファイルなら`less`で開き、それ以外は通常の処理」となっています。
また、zshには`auto_cd`というオプションがあり有効にすると、ディレクトリ名を入力した場合そのディレクトリに`cd`します。この時`command_not_found_handler`が発動しないので、このオプションを`command_not_found_handler`の定義の前で無効にしてます（oh-my-zshを使ってると勝手に有効になるらしいです）

ちなみに、`less`も`ls`も引数を複数とれるのでこの`command_not_found_handler`も複数の引数に対応しようと思えば出来ます。面倒なので書いてないです。

参考：http://mollifier.hatenablog.com/entry/20091207/p1
写真をリサイズするとOOM


 Titanium.Media.showCamera()を呼び出し、撮影した写真をsuccessコールバックの中で以下のように適当なサイズにリサイズするだけで40Mbyte近く一気にメモリを食ってしまいます(Galaxy S3, Android Debug Monitorで確認)。Galaxy S3上で撮影した写真をリサイズすると２回に一回くらいの割合でOut of memoryの例外(3.2系のコードだと戻り値でnullが返ってくるっぽい)が起きてしまうので困っています。 

```javascript
event.media.imageAsResized(200,200)
```

TitaniumのJavaのコードを適当に眺めてるときっとここら辺が呼ばれてるんだろうなーと推測。getImage()内のBitmapFactoryの処理あたりで食ってるのかな。

https://github.com/appcelerator/titanium_mobile/blob/3_2_X/android/titanium/src/java/org/appcelerator/titanium/TiBlob.java#L533

 yanzmさんのサイトを見ると、表示する画像に対して、カメラの画像をそのまま読み込むのは非効率(携帯の画面の解像度に対してカメラの画像の解像度が高すぎる)なので、inSampleSizeを使って表示する解像度に近い解像度でメモリ上に読み込むような処理をするとOOMも抑えられて効率的なことが書かれています。上記のTitaniumのコードだとinSampleSizeは指定されていないので、高解像度の画像をそのままメモリに読み込んでガッツリメモリ食っちゃうんですかねぇ。

http://y-anz-m.blogspot.jp/2012/08/android.html

 リサイズするときもinSampleSize使って適当なサイズで読み込んでリサイズするとかできないんですかね。それともリサイズする場合はオリジナルのサイズで読み込まないとだめなんですかね。画像を扱うコードを普段書かない上にAndroidのコードも適当にしか書いてないのでなんとも。。。とりあえずJavaでリサイズ用のサンプルコードでも書いてみようかな。
JenkinsでSlaveノードを追加する


## Slaveノードの事前準備

1. MasterからSSHで接続できる状態にしておく。認証方法は、鍵認証でもパスワード認証でも可。
2. Javaと利用するビルドツールをインストールしておく。

## Slaveノードの追加設定

システム管理からノード管理を選択

　![001.jpg](https://qiita-image-store.s3.amazonaws.com/0/30521/6a0a73ad-efbf-46b1-6cdc-d8133df86b46.jpeg)

新規ノードを選択

　![002.jpg](https://qiita-image-store.s3.amazonaws.com/0/30521/cf401c59-f366-2816-07d6-41695ded276b.jpeg)

Slave名を入れる。
　![003.jpg](https://qiita-image-store.s3.amazonaws.com/0/30521/df1d36c3-9d75-4ce7-fa8f-28310a330a50.jpeg)

Slave情報を入れて完了。

![007.jpg](https://qiita-image-store.s3.amazonaws.com/0/30521/4daa611d-bc47-9ecb-be66-0de57065d7dc.jpeg)
NSLogで変数名も表示する

プリプロセッサディレクティブの文字列化演算子 # を利用する方法がある。
マクロの引数を利用する際に#を付けると、実引数がダブルクォーテーションで囲まれた(C言語の)文字列に置き換わる。

こんな感じでマクロ定義して

```Objective-C
#define OBJ_DESCRIPTION(var)	[NSString stringWithFormat:@"%s: %@", #var, var]
```

こんな感じで使うと

```Objective-C
	NSNumber *hoge = @123;
	NSArray *fuga = @[@"foo", @"bar"];
	NSLog(@"%@", OBJ_DESCRIPTION(hoge));
	NSLog(@"%@", OBJ_DESCRIPTION(fuga));
```

こんな感じのログが出ます

```
hoge: 123
fuga: (
    foo,
    bar
)
```
NSErrorによるエラー判定実装方法

```objectivec
//エラーの発生する可能性のあるメソッド
- (BOOL) setCategory:(NSString*)theCategory error:(NSError**)outError {
	//処理
	if (outError) {
		*outError = [NSError errorWithDomain:@"ドメイン" code:-1 userInfo:nil];
		return NO;
	}
	return YES;
}

//呼び出し側
NSError *error = nil;
BOOL success = [self setCategory:@"TEST" error:&error];
    
//エラー発生確認
//メソッドから処理結果判定が行えない場合はif(error)により判定を行う
if (!success) {
	NSLog(@"%@ %ld %@",[error domain],(long)[error code],[[error userInfo] description]);
}
```

&errorでNSErrorのポインタを渡してメソッド側でNSErrorオブジェクトを生成
その後メソッドの戻り値（またはNSErrorオブジェクトの有無）によりエラー内容を判定する。
Qtを使ったアプリをMac用に配布する時

アプリをビルドして .appをまるごとコピーしたはいいものの、別環境だと動かないというときの解決法

# 結論
<del>アプリが依存しているQtのフレームワークをコピーしてきて、`install_name_tool` で参照先を書き換えて一緒にバンドルする</del>
2013/12/17追記：`macdeployqt`というSDKに付属のコマンドを使うのがシンプルで良さそうです。教えて頂いた @shimacpyon さんありがとうございました。

# 手順

以下、macdeployqtを使わずマニュアルでする方法

## 1. otoolでアプリが使用している共有ライブラリを調べる

hoge.app/Contents/MacOS/ に移動して、アプリ本体のバイナリに対して以下

```bash
otool -L hoge
```

大体以下のようなQtライブラリが見つかる

```
/Applications/Qt/5.1.1/clang_64/lib/QtGui.framework/Versions/5/QtGui (compatibility version 5.1.0, current version 5.1.1)
/Applications/Qt/5.1.1/clang_64/lib/QtCore.framework/Versions/5/QtCore (compatibility version 5.1.0, current version 5.1.1)
```

他の環境にコピーしたとき、上記パスにQtがない場合は動かないので、フレームワークをバンドルしてパスを書き換える必要がある

## 2. install_name_toolでフレームワークの参照先を変更

例えば、`hoge.app/Contents/Frameworks`というディレクトリを作って、上記のフレームワークをコピーする。そして、バイナリファイルに対して以下のコマンド

```bash
install_name_tool -change "/Applications/Qt/5.1.1/clang_64/lib/QtGui.framework/Versions/5/QtGui" "@executable_path/../Frameworks/QtGui" hoge

install_name_tool -change "/Applications/Qt/5.1.1/clang_64/lib/QtCore.framework/Versions/5/QtCore" "@executable_path/../Frameworks/QtCore" hoge
```

`@executable_path`というのは、バイナリファイルのパスのこと。これで.app内にコピーしたライブラリを参照してくれるので、別の環境にコピーしても動く。

## 3. アプリ配布

.appフォルダ毎コピればおｋ。

いじょう、簡単だけどめんどくさいです。

書いてから思ったけど、QtにかぎらずMacで共有ライブラリを使ったアプリを配布する際の話でした


# windowsの場合
QtCore.dll、QtGui.dllとかライブラリをexeと一緒のフォルダに入れておけばOK