OmniAICreator/Qiita-1.07M huggingface dataset:
bundlerのParallel installationの速さを体感

[Parallel installation - pullreq](https://github.com/bundler/bundler/pull/2481)

#導入
[Bundlerで並列処理？？bundle installを爆速で処理する方法。](http://qiita.com/camelmasa/items/5ca27ab398f105f86c76)

```
$ gem install bundler --pre
$ bundle install --jobs=4
```

#計測
使用したGemfile

```rb:Gemfile
source "https://rubygems.org"
gem "rails"
```

##v1.3.5

|       |  1  | 2 | 3 | 4 | 5 | AVG |
|:-----|----------:|----------:|----------:|-----------:|----------:|-----------:|
|real  | 36.110s| 33.427s| 31.694s| 34.629s| 36.245s| 34.421s|
|user |  5.073s|   5.104s| 5.080s| 5.003s| 5.169s| 5.0858s|
|sys   |  0.961s|   0.907s| 0.888s| 0.930s| 0.897s| 0.9166s|

##v1.4.0.pre.1

|       |  1           | 2           | 3           | 4         | 5           | AVG |
|:-----|-----------:|----------:|----------:|----------:|----------:|------------:|
|real  | 24.492s| 19.518s| 20.728s| 20.412s| 20.329s| 21.096s |
|user |   5.626s|   5.334s|   5.455s|   5.529s|   5.393s|    5.467s|
|sys   |   1.185s|   1.051s|   1.097s|   1.051s|   1.071s|    1.091s|

##v1.3.5 vs v1.4.0.pre.1

|       |  v1.3.5   |  v1.4.0.pre.1 | DIFF |
|:-----|-----------:|----------------:|----------:|
|real  | 34.421s|        21.096s|  13.325s|
|user |   5.086s|          5.467s|   -0.382s| 
|sys   |   0.917s|          1.091s|   -0.174s|
PHPのマイナーバージョンアップ方法

PHP5.4.17releaseしましたね！（今更）
http://php.net/archive/2013.php#id2013-07-04-1

開発環境用サーバ郡と、本番用サーバ群で
齟齬が出てしまっていたので、5.4.16→5.4.17へマイナーバージョンを上げることに。

```
# yum update --enablerepo=remi php
```

remiを指定すればバージョンアップできます。

※外部リポジトリ追加の方法はこちらの方がまとめて頂いてます。（丸投げすいません）
http://qiita.com/ryurock/items/662e41376efa97251575
CakePHP BoostCake の導入手順

#### 手順.1
***
リポジトリからソースをDL
[https://github.com/slywalker/cakephp-plugin-boost_cake](https://github.com/slywalker/cakephp-plugin-boost_cake)


#### 手順.2
***
解凍後、BoostCake にリネームして /plugins/ へコピー


#### 手順.3
***
/app/Config/bootstrap.php に、プラグインのロードの記述を追加

	CakePlugin::load('BoostCake');


#### 手順.4
***
/app/Controller/AppController.php 内に、ヘルパーを追加

	class AppController extends Controller {
		public $helpers = array(
			'Session',
			'Html' => array('className' => 'BoostCake.BoostCakeHtml'),
			'Form' => array('className' => 'BoostCake.BoostCakeForm'),
			'Paginator' => array('className' => 'BoostCake.BoostCakePaginator'),
		);
	}

Auth コンポーネントを利用する場合は、公式ドキュメントを参照。
[http://slywalker.github.io/cakephp-plugin-boost_cake/](http://slywalker.github.io/cakephp-plugin-boost_cake/)

#### 手順.5
***
/app/View/Layouts/default.php の head 要素を書き換え

	<head>
		<?php echo $this->Html->charset(); ?>
		<title>
			<?php echo $cakeDescription ?>:
			<?php echo $title_for_layout; ?>
		</title>
		<?php

			echo $this->Html->meta('icon');

			// jQuery CDN
			echo $this->Html->script('//code.jquery.com/jquery-1.10.2.min.js');

			// Twitter Bootstrap 3.0 CDN
			echo $this->Html->css('//netdna.bootstrapcdn.com/bootstrap/3.0.0-rc1/css/bootstrap.min.css');
			echo $this->Html->script('//netdna.bootstrapcdn.com/bootstrap/3.0.0-rc1/js/bootstrap.min.js');

			echo $this->fetch('meta');
			echo $this->fetch('css');
			echo $this->fetch('script');
		?>
	</head>

Bootstrap の CDN は、下記参照。
[http://www.bootstrapcdn.com](http://www.bootstrapcdn.com)

#### 手順.6
***
フォーム、ページネーション、アラートの記述方法は、公式ドキュメントを参照。
[http://slywalker.github.io/cakephp-plugin-boost_cake/bootstrap3.html](http://slywalker.github.io/cakephp-plugin-boost_cake/bootstrap3.html)

その他は、従来どおり必要に応じて要素へ class を付加。
コンソール越しに git コマンドから Gtk-WARNING **: cannot open display と怒られた時

以下の呪文を唱える。`unset SSH_ASKPASS` ! 

```sh:
$ git pull

(gnome-ssh-askpass:11826): Gtk-WARNING **: cannot open display: 

$ echo $SSH_ASKPASS
/usr/libexec/openssh/gnome-ssh-askpass

$ unset SSH_ASKPASS
$ git pull

Password: 
Already up-to-date.
```

## SSH_ASKPASS の利用

OpenSSHはパスワードを必要とするとき、`SSH_ASKPASS` に設定されたコマンドを利用します。

上の例では、GUIを必要とする `gnome-ssh-askpass` が指定されていたために、起動できずに失敗していたわけです。実際、GUI環境だと  `gnome-ssh-askpass`  プログラムがパスワードをキャッシュしてくれるので便利です。コンソールでログインしてる時にこの環境変数が設定されちゃってるから変だというだけで。

以下のように、こいつに適当なスクリプトを食わせて自動化を行うこともできます。

- http://blog.nickmontgomery.com/?p=163

やってみました。

```
$ git pull

Password: 
Already up-to-date.

# git pull でパスワードが要求される

$ export SSH_ASKPASS ./git_pass.sh
$ echo "#/bin/sh" >> git_pass.sh
$ echo "echo hogehoge" >> git_pass.sh
$ chmod +x git_pass.sh

$ git pull

Already up-to-date.

# git pull でパスワードが要求されなくなった
```

特定の状況で便利そうだけど、うっかり多用されるとパスワード直書きしたスクリプトがいろんなところに置かれてモラルハザードを引き起こしそうですね。
Windows7での開発環境セットアップ

# Capsキーの入れ替え
- [Ctrl2cap](http://technet.microsoft.com/ja-jp/sysinternals/bb897578.aspx)
-- (*) Win7のコマンドプロンプト起動時、右クリックで「管理者権限で実行」するのをわすれずに

# Google日本語変換の変換/無変換キーでのIME切り替え
- [Google日本語入力でIME ON/OFFを変換・無変換キーに割り当てる【ver 2.0】 | TeraDas－テラダス](http://www.teradas.net/archives/2927/)

# ログ監視ツール(tail)
- [WindowsでTailコマンドを扱える便利ツール「LogExpert」 - あおきのTechメモ](http://d.hatena.ne.jp/aoki1210/20120218/p1)
- [LogExpert](http://www.log-expert.de/)

# 全般
- [Windows7 搭載マシンを買ってきてやったことまとめ - IT戦記](http://d.hatena.ne.jp/amachang/20111226/1324874731)
Ruby docstrings would be great

How to simulate docstrings like Python or Lisp? I found one way to do it in this gist: 

[Python-like docstrings in Ruby!](https://gist.github.com/chendo/2146319)

```rb:docstring.rb
class DocStrings
  def docstrings!
    """
      This is a docstring that's syntactically valid!
      It'll do multiple lines!
    """
  end
 
  def single_line_docstring
    """Single line docstring!"""
  end
 
  def why?
    """
      Cause I can? Duh.
    """
  end
 
  def how_does_it_work?
    """
      I learnt that two strings side by side concats them together
      and is valid Ruby from Peter Cooper (@peterc)'s Ruby Trick Shots found
      at http://rubyreloaded.com/trickshots/
 
      Then the rest is just some good ol' regex.
    """
  end
 
  def notes
    """
      Double quotes not together like this: ""
      breaks it.
 
      Requires Method#source_location
 
      Code below is unoptimised and needs further work
    """
  end
 
  def no_docstring
 
  end
end
 
 
 
class Method
  def doc
    @doc ||= begin
      path, line_number = source_location
 
      return nil unless path && File.exists?(path)
 
      file = File.read(path)
 
      if file =~ Regexp.new(%Q{\\A(?:.*?\n){#{line_number}}\s*?"""([\\s\\S]+?)"""})
        $1.gsub(/\n\s+/, "\n").strip
      else
        nil
      end
 
    end
  end
end
 
 
doc = DocStrings.new
(doc.methods - methods).each do |method_name|
  puts "method name #{method_name.to_s}:"
  puts doc.method(method_name).doc
  puts "----"
end
```
Sphinx使ってGithub Pages作る時の話

GithubのHosting (http://pages.github.com/) をSphinx使って作ったら，画像とかCSSとか死んでました．

なんでかな，とおもったら，どうも，アンダースコアから始まるものは無視されるようです．
なので

https://github.com/blog/572-bypassing-jekyll-on-github-pages

.nojekyllという名前で空のファイルを作ってgit addしてgit commitしてgit pushするといいらしいです．

どうでもいいですが，sphinxのデフォルトテーマはいつHTML5が導入されるんでしょうね．
Mash: Make hash from Enumerable

People used to do it this way:

```rb:
hash = {}
input.each do |item|
  hash[item] = process(item)
end
hash
```

: (

Two solutions:

```rb:
# from http://www.h6.dion.ne.jp/~machan/misc/FPwithRuby.html
module Enumerable
  def mash(&block)
    self.inject({}) do |output, item|
      key, value = block_given? ? yield(item) : item
      output.merge(key => value)
    end
  end
end

module Enumerable
  def mash(&block)
    Hash[self.map do |item|
      if block_given?
        yield(item)
      else
        nil
      end
    end]
  end
end
```

## syntax

```rb:
pry > ["I", "love", "Ruby"].mash { |w| [w, w.size] }
=> {"I"=>1, "love"=>4, "Ruby"=>4}
```

Which one do you prefer?
シェルスクリプトを利用してカレントディレクトリを移動する方法


```bash:example.sh
#!/bin/sh

cd [移動したいディレクトリの絶対パス]

```

## ドットコマンドを使う

	$ . example.sh

## sourceコマンドを使う

	$ source example.sh

- - -
> Blog URL : http://www.utano.jp/ (Syntax Error.)
ユーザ関係のまとめ


##新規ユーザの追加
　ユーザの追加はuseraddコマンドで行います。追加したユーザを確認する場合には`-a`オプションを利用します。

~~~ bash:
$ useradd hogehoge　#ユーザの作成
$ id -a hogehoge　#確認
uid=514(hogehoge) gid=514(hogehoge) 所属グループ=514(hogehoge)
~~~ 


###useraddのオプション
`-M`
: ホームディレクトリを無しにする。

`-c comment`
: 新規ユーザのコメント。

`-d home_dir`
: ホームディレクトリを指定する。

`-e expire_date`
: ユーザアカウントが無効となる日付。日付は YYYY-MM-DD の形式。

`-f inactive_days`
: パスワードがの使用期限が切れてから、このオプションで与えた日数経過するとアカウントは永久に使用不能となる。
値として 0 を指定すると、パスワードが失効した直後にアカウントは使用不能となり、-1 を指定すると、この機能は無効となる。
デフォルト値は -1。

`-g initial_group`
: ユーザの属する主グループのグループ名またはグループ ID。

`-G group,[...]`
: ユーザの属するサブグループのグループ名またはグループ ID。グループはコンマで区切り、空白を含めてはいけない。

`-s shell`
: ユーザのログインシェル名。

`-u uid`
: ユーザ ID。

`-o`
: UIDの重複を許可する。

##useraddのデフォルト値
　useraddでオプションにて指定されなかった項目はデフォル値が使用されます。このデフォルト値は`/etc/default/useradd`に記録されており,
また`useradd -D`コマンドにて確認する事も可能です。

　また`useradd -D <option>`にて,デフォルト値を変更することも可能です。

###useradd -D のオプション

`-b default_home`
: 新規ユーザのホームディレクトリへのパス。default_home の後にユーザ名を付け加えたものが新規ディレクトリ名として使われる。

`-e default_expire_date`
: ユーザアカウントが無効となる日付。日付は YYYY-MM-DD の形式。

`-f default_inactive`
: パスワードの使用期限が切れてからアカウントが使用不能となるまでの日数。デフォルトは` -1 `で無期限。

`-g default_group`
: 新規ユーザの属する主グループのグループ名またはグループ ID。グループ名、グループ ID は、すでに存在するものであること。

`-s default_shell`
: 新規ユーザのログインシェル。


##パスワードの変更
　パスワードの変更はpasswordコマンドで行います。

~~~~
$ passwd [username]
~~~~

usernameを指定しない場合,カレントユーザのパスワードが変更されます。

##ユーザ情報の変更
　ユーザ情報の変更では汎用的なusermodコマンドが便利です。

~~~~
usermod
[ -c comment ] [ -d home_dir [ -m ] ]

[ -e expire_date ] [ -f inactive_time ] 

[ -g initial_group ] [ -G group [ ,... ] ]

[ -l login_name ] [ -p passwd ] 

[ -s shell ] [ -u uid [ -o ] ] [ -L | -U ] <username>
~~~~

###usermodのオプション
`-c comment`
: ユーザのコメントを変更する。

`-d home_dir`
: ユーザのホームディレクトリをhome_dirに変更する。後ろに-mをつけると、現在の内容を新しいディレクトリに移動する。ディレクトリが存在しない場合は新たに作られる。

`-e expire_date`
: アカウントが使用不能になる日付。日付はYYYY-MM-DDで指定する。

`-f inactive_days`
: パスワードの使用期限が切れてからアカウントが永久に使用不能になるまでの日数。 0とすると、パスワードの期限が切れると同時にこのアカウントは使用不可能になる。-1を指定すると無期限に。

`-g initial_group`
: デフォルトのグループをinitial_groupに変更する

`-G group,[...]`
: アカウントが属する、サブグループを追加。グループはコンマ区切り。元々入っていたグループをここで指定しないと、そのグループから削除されます。

`-l login_name`
: ユーザのログイン名をloginからlogin_nameに変更する。パスワードとかもそのまま。ホームディレクトリの名前くらいはを変えてあげましょう。

`-s shell`
: ログインシェルをshellに変更する。

`-u uid`
: ユーザのID番号を指定したものへ変更する。

`-L`
: ユーザのパスワードをロックする。ロックされたアカウントは、パスワード認証でのログインができなくなります。

`-U`
: ユーザのパスワードをアンロックする。-L の反対です。
Macでファイルの関連付けをする


今まで知らなかった。

右クリックでコンテキストメニューを出して「情報を見る」を選択。

![スクリーンショット 2013-08-11 16.53.16.png](https://qiita-image-store.s3.amazonaws.com/0/8511/4f876dc4-0903-ddbf-3b84-03057fc59731.png "スクリーンショット 2013-08-11 16.53.16.png")

「このアプリケーションで開く」のドロップダウンリストでアプリケーションを選択。

![スクリーンショット 2013-08-11 17.15.10.png](https://qiita-image-store.s3.amazonaws.com/0/8511/2ffd51df-7284-14fe-aac3-2c01ff87232b.png "スクリーンショット 2013-08-11 17.15.10.png")

戻ってきたら「すべてを変更」ボタンをクリックする。
確認ダイアログが出てくるので「続ける」をクリックして完了。

![スクリーンショット 2013-08-11 17.10.53.png](https://qiita-image-store.s3.amazonaws.com/0/8511/132b41c3-8736-a33f-ac31-e5e0ccafba7e.png "スクリーンショット 2013-08-11 17.10.53.png")

便利。

## 参考サイト

- [Monologue:Mac OS X のファイル関連付け変更方法](http://blog.teachat.org/archives/50459430.html)
SPLオートローダシステムの実装



　fuelphpなどでお馴染みのオートローダを実装する方法について。これさえマスターすれば別にどんなFWでもオートロード出来るのです。

　オートローダの登録は`spl_autoload_register`関数で行います。この関数はオートロードしたいクラスをコールする前に実行する必要があります。

~~~PHP:
bool spl_autoload_register (
[ callable $autoload_function 
  [, bool $throw = true 
    [, bool $prepend = false ]
  ]
] )
~~~

###$autoload_function
第一引数には登録する関数を指定します。関数名(文字列)またはクロージャでOK。
ここで登録する関数は第一引数でクラス名を取得できます。

###$throw
第一引数の関数を登録できなかった際に例外を投げるかどうかの指定
###$prepend
第一引数の関数を先頭に追加するかどうか。デフォルトはfalseで末尾に追加される。
###return
第一引数の関数が登録できたかどうかをboolで返します。
  
**注意**:トレイトはオートローダの対象外です!!


##スタックの操作
###スタック一覧の取得
　オートローダ関数の一覧は、`spl_autoload_functions`関数で取得可能です。
  
  引数は無し。戻り値は配列で取得出来ます。
  
###スタックからの削除
  オートローダに追加された関数を削除する場合には`spl_autoload_unregister`が利用可能です。
  
****
bool spl_autoload_unregister ( mixed $autoload_function )
****
###$autoload_function
　削除する関数名またはクロージャ
MYSQLの関数 GROUP_CONCAT


　1対多テーブルの処理周りでのムチャぶりに対応してくれる、GROUP_CONCAT関数です。

~~~~
GROUP_CONCAT(
    [DISTINCT] expr [,expr ...]
    [ORDER BY {unsigned_integer | col_name | expr}
    [ASC|DESC] [,col_name ...]]
    [SEPARATOR str_val])
~~~~

要は使い方としてはこんなかんじで。

~~~~mysql:
SELECT 
    users.*,
    GROUP_CONCAT(
        DISTINCT users.id
        ORDER BY users.id DESC SEPARATOR ','
    ) as user_list
    FROM users
    GROUP BY users.area;
~~~~

コレで`user_list`列にエリア毎のユーザIDの一覧が,区切りで入ってくる。

セパレータはSEPARATORで指定して、デフォルトは`,`
INT列とかを結合して,スクリプト側でSEPARATORによる分割、とかしたら楽に処理できる、はず。

後々分割すること考えたら文字列とかの結合には不向きな気がする。

ORDER BY側のデフォルトはASC。特に指定しなくてもOK
MYSQLの関数 COALESCE


　リストの最初の非NULL値を返すとかいうやつ。ぱっとしないけど使い方しだいでは化ける。

###構文
 
~~~~
COALESCE(value,...)
~~~~

COALESCE関数は任意の個数の引数を取り,引数の最初の非NULL値を返します。非NULL値が存在しない場合のみNULLを返します。

###使い道
　うまく使うことで条件分岐の制御構造として利用可能。

~~~ mysql:
SELECT
    shop.name,
    COALESCE(
        shop.building_name,
        shop.area_name,
        "地域情報なし"
    ) as spot
FROM
    shop
  ....
~~~

複数カラムの内容を段階的に突っ込んでいく、みたいなことが可能。
上の例だとspot列として店舗のビル名を、ビル名がnullの場合エリア名を、エリア名がnullの場合"地域情報なし"の文字列を入れる、って感じになる。
        
##英語的に
　読み方は「コーアレス」。後アクセント。ラテン語由来でスペルと音を紐付けるのが厳しい。 意味は「合体」。まぁそんなとこか。
QueryDSL があんまり安全じゃない

数ヶ月前に [QueryDSL](http://www.querydsl.com/) を使おうと思ったのですが、これが想像していたほど型安全ではなかったので採用を見送りました。何が安全ではないかというと、例えば ```User``` と ```UserGroup``` みたいなエンティティがあり、それぞれに ```name``` という ```String``` のプロパティを持っていたとすると、これが区別されない。QueryDSL が APT で生成するプロパティを見れば分かるんですが、こんな感じでプロパティがエンティティ型を持っていないのですね。

```java
public final StringPath name = createString("name");
```

実際問題 ```User.name``` と ```UserGroup.name``` を厳密に区別して型安全に扱う必要性があるかというと、それが必要になるケースというのは稀だと思うので QueryDSL は意図的に割り切っているのかなという印象を持ちましたが、それまで自前で作成していた ORM では厳密に型を区別していたため、なんだかなぁと思って採用を止めたのでした（[そういえば Doma がこのような型パラメータを採用したみたいですね](http://d.hatena.ne.jp/taedium/20130811)）。

QueryDSL 使えば安全ですワイワイとか思っているとそうでもないというお話でした。

---

※ ちなみに自分では[こんな感じのライブラリ](http://tech.usopla.com/blog/2012/12/26/honeyant/)を自作しました……。
workmodeをsudoなしで実行するやり方

何ヶ月前からか、workmodeという特定サイトにアクセスを遮断して集中する環境を作るフィルタリングソフトウェアを使ってる。例えば、ニコニコ動画やはてブにかなりの時間を使ってしまう場合などそのサイトのアクセスを制限できる。それなりにお手軽にフィルタリングできるのでとても便利。

けど、workmodeはインストールの仕方によってはsudoをしないと実行できないみたいで、とてもめんどくさい。nodeの入れ方を工夫する方法はよくわからないのでworkmodeをsudoなしで実行できるようにする方法をここに書く。

インストールは
→ [Homebrewでnode.jsとnpmをインストール](http://bulblub.com/2013/04/20/install_nodejs_with_homebrew/)
とか
→ [Node.js と npm のインストール方法（Windows編）](https://sites.google.com/site/nodejyuku/how_to_install_for_windows)
を参考にしてnpmをインストールして

`npm install workmode -g`

でworkmodeをインストールする。

#パスワード無しでworkmodeを実行する

いままではこんな感じで実行してた。

`crontab -e`

```shell-session:crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/share/npm/bin
MAILTO=''
HOME=/
3*/11 */1     *       *       *       sh /var/tmp/forworkmode.sh
```

```forworkmode.sh
echo "password" | sudo -S workmode start
```
こんな感じでやってたけどパスワードを直書きするのはちょっとどうなのかなと思ってた。
特定コマンドをsudoなしで実行できる方法があったのでそっちに移行した。

参考 : [特定のコマンドをパスワードなしでsudo する設定](http://d.hatena.ne.jp/LukeSilvia/20080716/p1)

`sudo visudo`

を実行して、

```
pogin   ALL=NOPASSWD: /usr/local/share/npm/bin/workmode 
```

を付け加える。workmodeの場所は`type workmode`、`which workmode`とかで見つかるかも？

```diff:/etc/sudoers
# Uncomment to allow people in group wheel to run all commands
%wheel  ALL=(ALL) ALL

# Same thing without a password
# %wheel        ALL=(ALL) NOPASSWD: ALL
+ pogin   ALL=NOPASSWD: /usr/local/share/npm/bin/workmode 
```

これでworkmodeでのsudoのパスワード入力をやらなくて済む。

#参考
[集中して仕事。指定サイトへのアクセスを遮断する「workmode」](http://www.moongift.jp/2012/10/20121030-3/)
[特定のコマンドをパスワードなしでsudo する設定](http://d.hatena.ne.jp/LukeSilvia/20080716/p1)
IntelliJでプロパティのnative2ascii変換をEclipse互換にする

# IntelliJとEclipseのnative2ascii変換の違い

IntelliJでは`Settings`の`File Encodings`で`Transparent native-to-ascii conversion`をオンにするとJavaのプロパティファイルを透過的にnative2ascii変換してくれます。

```properties:元のプロパティファイル
log.error=エラーが起きました
```

```properties:IntelliJで変換
log.error=\u30A8\u30E9\u30FC\u304C\u8D77\u304D\u307E\u3057\u305F
```

ですが、Pleiades All in Oneに同梱されているProperties Editorを使うとIntelliJと違い小文字に変換されます。

```properties:Eclipseで変換
log.error=\u30a8\u30e9\u30fc\u304c\u8d77\u304d\u307e\u3057\u305f
```

Eclipse使いが大半を占める中で一緒に開発していると、1文字変更しただけでも大文字小文字の違いでほとんどの値に差分が出てしまい、本当の差分が分かりにくくなります。

# IntelliJでも小文字に変換する

IntelliJではnative2asciiの大文字小文字変換のようなニッチな設定も可能です。
ニッチ故に少し面倒ですが`idea.properties`に以下の値を追加します。

```properties:idea.properties
idea.native2ascii.lowercase=true
```

## idea.propertiesの場所

WindowsとLinuxの場合はIntelliJをインストールしたフォルダの中にあります。

```console:WindowsとLinuxの場合
<IntelliJ IDEA installation folder>/bin/idea.properties
```

Macでも同じようにIntelliJをインストールしたフォルダの中にありますが、
`~/Library/Preferences/IntelliJIdea12/idea.properties`にコピーするとこちらが優先されます。
コピー先のフォルダはバージョン毎に異なるので、バージョンアップしたときは忘れないように再度コピーして設定してください。

```console:Macの場合
~/Library/Preferences/IntelliJIdea12/idea.properties
/Applications/IntelliJ IDEA 12.app/bin/idea.properties
```

これでEclipse使いが多い開発でも安心です。

# IntelliJ IDEA 2018.3 Help

以上の内容はIntelliJのヘルプを参考にしました。

* [Resource Bundle](https://www.jetbrains.com/help/idea/resource-bundle.html)
* [リソース・バンドル](https://pleiades.io/help/idea/resource-bundle.html)
Eclipse + Maven(m2e)でライブラリが見つからない的なエラーが出たときの対応方法


以下いずれかでだいたいは解決しました。

## indexのリビルド/再作成
Eclipse上で、

1. Windows -> Show View -> Maven Repositories
1. Local Repositories, Global Repositories内の各リポジトリを右クリック -> Rebuild Index or Update Index

## lastUpdated
ファイルシステム上で、

1. ローカルリポジトリ内の対象ライブラリのフォルダを探す。
   デフォルトではユーザーのホームディレクトリ。Windowsだと`C:\Users\{ユーザー名}\.m2\repository\\{groupId}\\{artifactId}\\{version}`
1. `ライブラリ名-{versoin}.lastUpdated`を削除する。

Eclipse上で、

1. 対象プロジェクトを右クリック -> Maven -> Update Project…
Mac OS X で zsh ＋ oh-my-zsh の環境を作って一通り設定するまで

## (1) homebrew をインストール

* http://brew.sh/

公式のイントロの通り。rbenvなどをすでに brew で入れているかもしれない。

インストールの確認

```bash
brew -v
#=> Homebrew 0.9.4
```

パッケージのアップデート

```bash
brew update
```

## (2) zsh をインストール

```bash
brew install zsh
```

`/usr/local/bin/zsh` を起動すると、新しい `zsh` のセッションに入る。何も設定されていないので表示が簡素。いったん `exit` でログアウトする。

## (3) oh-my-zsh をインストール

* https://github.com/robbyrussell/oh-my-zsh

公式の通り

```bash
curl -L https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh | sh
```

これでインストールされる。

途中で、デフォルトのシェルをzshにする、と言う旨のメッセージが出るので、パスワードを入れて更新してもらう。

インストールしたら新しいタブを開く or ターミナルを再起動して、新しいセッションを立ち上げる。

## (4) プラグインを使う

`~/.zshrc` と言うファイルに設定を記述する。何かのエディタで開く。

このファイルの下の方にこういう行があるはずなので、

```zsh
plugins=(git)
```

ここを変更してプラグインを利用する。

```zsh
plugins=(git ruby osx bundler brew rails emoji-clock)
```

* `ruby` - ruby に関連する便利な機能を提供
* `bundler` - 単に `ruby` などとするだけで `bundle exec ruby` を実行したのと同じになる
* `emoji-clock` 絵文字時計を表示するコマンドが使える :clock3:

なお、以下のコマンドで設定の読み直しができる。 `source` コマンドは設定などを読み直す際のシェルの一般的なコマンドなので覚えておこう。

```bash
source ~/.zshrc
```

## (5) テーマを適用する

先ほどの `~/.zshrc` の先頭の方に


```zsh
ZSH_THEME="robbyrussell"
```

という記述がある。この、「robbyrussell」をテーマ名に変更して、設定を読み直せばテーマを変更できる。

* https://github.com/robbyrussell/oh-my-zsh/wiki/Themes

↑から気に入ったテーマを探すこともできる。

カスタムテーマをつくる場合は、まず、もとにしたいテーマのファイルをコピーしておく。

```bash
cp ~/.oh-my-zsh/themes/cloud.zsh-theme ~/.oh-my-zsh/themes/original.zsh-theme
```

そうして新しくつくったテーマの `~/.oh-my-zsh/themes/original.zsh-theme` を編集する。 `PROMPT` と言う変数をいじれば見た目などを変えられるが... こればっかりは慣れた人でも試行錯誤を繰り返すことになる。

テーマをつくったら、 `ZSH_THEME="original"` などと設定を変更してまた読み直してみる。

テーマの設定内容そのものはGitHubからでも参照できるので、本気でつくりたい場合は読んでみるといいかも...

* https://github.com/robbyrussell/oh-my-zsh/tree/master/themes

### おまけ: Boxen

この手のセットアップ作業を

* コマンド一発でできる
* どんなマシンでも再現できる
* 設定内容を GitHub などに公開できる、プルリクエストなどを送ってもらえたりするかも

と言う便利そうなツール、 [Boxen](http://boxen.github.com/) というものがあったりします。もちろん、 [zsh](https://github.com/boxen/puppet-zsh) のための設定内容もあります。
JSF2(Mojarra)でBean Validationを無効にする


web.xmlにcontext-paramを追加すればよい。

```xml:web.xml
  <!--
    Bean Validatorによる妥当性検証を無効にしたい場合はparam-valueをtrueに設定します。
    有効にしたければparam-valueをfalseに設定するか、この定義を削除してください。
  -->
  <context-param>
    <param-name>javax.faces.validator.DISABLE_DEFAULT_BEAN_VALIDATOR</param-name>
    <param-value>true</param-value>
  </context-param>
```
Oracleでテーブルロックしているsessionを殺す


例: テーブルfoobarをロックしているsessionを探す

```sql
SELECT
  object_name,
  oracle_username,
  s.sid,
  s.serial#,
  s.logon_time,
  sql_address
FROM v$locked_object l,
  dba_objects o, 
  v$session s
WHERE l.OBJECT_ID = o.OBJECT_ID
  AND l.SESSION_ID = s.SID
  AND object_name = 'foobar'
;
```

見つけたsessionをkill

```sql
ALTER SYSTEM kill session 'sid, serial';
```
Travis CIでsecret valueを扱う

[Secure-environment-variables](http://about.travis-ci.org/docs/user/build-configuration/#Secure-environment-variables)のとおり。
やってみる。

## 準備
Travis Clientをインストールする。

```bash:
$ gem install travis
```

## Encrypt
公開鍵を使って暗号化するようです。[ソース](https://github.com/travis-ci/travis/blob/3851f5c04a375e7fa56a78429758f7f4cdb0c501/lib/travis/client/repository.rb#L15)

```bash:
$ cd my_project
$ travis encrypt MY_SECRET=super_secret
Please add the following to your .travis.yml file:

  secure: "Vl4wZ31VKVsF+w2Vowv1l/hC6p1a7BR8mwonSswcvpdbmz289dFE7oUW7gw3nwzE1lRe71Soh90YqMnGmMY6UASRWHMkDLbf4BACkt4jJKSfQyWRf+J1YmHS8l1lrhk6V+RUsQjNdGbOkuZ5PQVzpwsPzHut4UgrxuLfpW9SkIg="

Pro Tip: You can add it automatically by running with --add.
```

--add env.globalのようにaddオプションを使うと.travis.ymlに自動で更新してくれますが、インデント崩れたりする。

## 試してみる

https://github.com/arukoh/sandbox/commit/a9628184edc3bff153d465354fdacbf3c2d5adeb

```yaml:.travis.yml
env:
  global:
    - secure: "Vl4wZ31VKVsF+w2Vowv1l/hC6p1a7BR8mwonSswcvpdbmz289dFE7oUW7gw3nwzE1lRe71Soh90YqMnGmMY6UASRWHMkDLbf4BACkt4jJKSfQyWRf+J1YmHS8l1lrhk6V+RUsQjNdGbOkuZ5PQVzpwsPzHut4UgrxuLfpW9SkIg="
```

```rb:test/env_test.rb
def test_secret
  assert_equal "super_secret", ENV['MY_SECRET']
end
```

### result
https://travis-ci.org/arukoh/sandbox/jobs/10072765
herokuの試行

Rails 4.0の試行も兼ねて実施してみました。

参考資料：Web+DB vol.71 P.83 第２章RailsではじめるHeroku

基本的には書いてある通りに実行するが、１か所はまるところがあった。

ローカルマシンで適当なアプリケーションを作成し、rails serverで動作確認し、Herokuのサインアップ後、ローカルのアプリケーション上でheroku apps:createでheroku上にアプリケーションが作成される。
その時に、一緒にローカルのアプリケーションのgitの設定ファイルにherokuのリモートリポジトリが設定される。

その後、herokuのリモートリポジトリにgit pushすればデプロイ完了なのだが、以下のメッセージが出てプッシュできない。

```メッセージ
The authenticity of host 'heroku.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'heroku.com,xx.xx.xx.xx' (RSA) to the list of known hosts.
Permission denied (publickey).
fatal: The remote end hung up unexpectedly
```
当然といえば当然なのだが、herokuコマンドでローカルマシンの公開鍵をheroku側に転送する必要がある。

$ heroku keys:add ~/.ssh/id_rsa_heroku.pub

で無事、デプロイできた。
Rails Mailerが送信したメールをスマホで見れない

Content-Type: text/html で送信したメールの本文が「認識できないメール形式のため表示できません」で内容が見れない（少なくとも、私が持っているauのXperia IS11Sでは見れませんでした）。

結論から言うと、htmlフォーマット用のview（*.html.erb）に対応したtextフォーマット用のview（*.text.erb）を、中身が空で良いのでダミーとして作成しておくと、なぜか解決されることがわかりました。

例えば、mailer classを

```app/mailers/message.rb
class Message < ActionMailer::Base
  default from: "xxx@yyy.zzz"

  def summer_greeting address,name
    @name = name

    mail(to: address, subject: '暑中見舞い')
  end
end
```

htmlフォーマット用のviewを

```app/views/message/summer_greeting.html.erb
<p><%= @name %>さん、</p>
<p>今日も暑いですね。水分をこまめに摂って熱中症にならないよう気をつけて下さい。</p>
```

とした場合、`$ touch app/views/message/summer_greeting.text.erb`でダミーファイルを作成すればOK。メール送信の時のログを見てみると Content-Type が multipart/alternative となっており、 text/plain と text/html の両方が送信されていることがわかる。スマホはこの形式だと、ちゃんと html の方を表示してくれる。何でだろう。よくわからないが、これで html のメール本文を表示できるようになったので良しとする。
javaのお勉強


```java
tv.setText("いらっしゃいませ");
```

という直接プログラムに文字列を入力して表示する方法を
`/TestApp/res/values/strings.xml`に

```xml
<string name="Wlecome">いらっしゃいませ</string>
```

と定義しておくことで

```java
tv.setText(R.string.Wlecome);
```

でも表示できるように変更しました。
ブロック引数を呼び出し側の環境で実行する

さんざん悩んだ後で考へてみるとタイトルが答へそのものなんですけどね。
知ってる人にはかなりどうでも良い話なのですが、僕は忘れてました。

その悩みがどういふことかといふと、

```ruby
class X
  def initialize (&proc)
    p 1 => self
    proc.call
  end
end

class Y
  def self.x
    X.new { p 2 => self }
  end
end

Y.x
```

このとき、標準出力には何が出力されるでせう…? といふ話です。
もちろんこの仕様は正しいのですが、`1 =>` と `2 =>` の指す値が同じであってほしいこともありますよね。

それが可能になれば、以下のように書くことも可能になるはずです。

```ruby
class X
  def initialize (&proc)
    ???
  end
  def hello
    puts:hello
  end
end

class Y
  def self.hello
    X.new { puts hello }
  end
end

Y.x
```

`puts hello` では `X#hello` が呼び出されることを期待します。わくわくしますね。
さっさと結論に進みますが、解決策は `proc.call` の部分を `instance_eval &proc` にするだけです。お手軽ですね。

どうしてこんなことになるのかの解説は話しはじめると長いし、こんな時間だから眠いので各自考へてみてくださいね。
fuelphp エラーハンドリングのまとめ

　fuelphpのエラーハンドリングがややこしい。処理記述箇所が複数有るっぽいのがそもそもの原因。

追記1014:なんか違うっぽかったので修正しました。

##基本的な流れ(ExceptionHandler系)

　catchサれなかった例外に対する処理は次の通り

1. handleメソドの有無を調べてアレば実行
2. handleが無くて本番環境なら,`errors/production`をレンダする。
3. handleが無くて本番でも無ければ、`errors/php_fatal_error`をレンダする。

こんなかんじの流れ。handleメソド実装しとけばとりあえずなんでも出来る、って感じになってる。

本番かどうかは`Fuel::$env === 'production'`で判定。

自動レンダする`errors/production.php`はFinder_Path依存で。デフォルトの表示はCoreの方のFinder_Pathから持ってきてる。appに置いたら上書き出来る。というか間違えて置かないように。

##ルーティング設定周りの処理(自動catch)
　上記は*未catch*の例外に対して適用される処理。fuelphpでは結果を生成する際、内部で`HttpNotFoundException`のみ自動でcatchする。

　catchして何をするかというとルーティング設定の_404_ディレクティブを見てこちらに飛ばそうとする。`_404_`設定が有効でなければパススルーでまた例外をそのままthrowする。

##組み込み例外
　基本的には例外はhandleメソド持ってないので,未catch例外に対しては上で言う2.3.あたりの処理が行われる(通常のエラー画面)。

　が、中にはいくつかhandleメソド実装済みの組み込み例外も存在するよう。

###HttpServerErrorException
　handle内では`views/500.php`のレンダが指示されている。

###HttpNotFoundException
　handle内では`views/404.php`のレンダが支持されている。

　これらは全て`HttpException`の継承。コレの継承クラスなら,handleメソドを実装せずとも、
responseメソドでreturn ResponseするだけでOKみたい。
PHPでObjectをforeachする

objectをforeachするときのあれ。

##Objectのforeach

基本的にはオブジェクトはforeach*出来る*。

通常Objectにforeachをかけると可視性の範囲でプロパティが舐められる。

つまり

インスタンス化したオブジェクトをforeach
: public プロパティがイテレート!!

クラス内部のオブジェクトコンテキストで$thisをforeach
: 内部定義の全プロパティ&継承されたpublic,protectedプロパティ

##インターフェイスの実装
　Iteratorインターフェイスを実装するとforeachの挙動をあれ出来る。でもこれ、実際問題面倒。

　クラス内部に舐めたい配列が有るならIteratorAggregateインターフェイスの実装で足る。

~~~~
class Item_Box implements \IteratorAggregate
{
    public $container = [];

    public function getIterator()
    {
        return new \ArrayObject($this->container);
    }
}
~~~~

`IteratorAggregate`の実装は`getIterator`の実装のみでたる。ココで注意しないと行けないのは返り値。
getIteratorはイテレータブルな値をreturnしなければならないが、
単純に配列をreturnしても駄目。

なのでここに配列を返したい場合にはArrayObjectでラップする必要がある。

##ほかほか
　Generatorとかも気軽にforeachできるみたいだけど、その辺はまた後ほど(ローカルに5.5入ってない)
Rubyの最長API名を探してみた

http://qiita.com/yohhoy/items/b61d175e161ce3493096
が面白かったので、自動で取れないか試してみたらそれっぽいのが・・・

定数名＋メソッド名の長さで、被りとか細かいことは気にしないという前提で書いたものがこれ

```ruby
# ruby -v: ruby 2.1.0dev (2013-08-10 trunk 42476) [x86_64-linux]

$VERBOSE = true

class BasicObject
  def longest_method_name
    (methods(true) | private_methods(true)).reject { |name|
      /\Alongest_(?:instance_)?method_name\z/ =~ name }.max_by(&:length)
  end
end

class Module
  def longest_instance_method_name
    (instance_methods(true) | private_instance_methods(true)).reject { |name|
      /\Alongest_(?:instance_)?method_name\z/ =~ name }.max_by(&:length)
  end

  def longest_api(ignore_modules=[])
    apis = [[name, longest_instance_method_name].join('#')]
    constants.each do |const_name|
      const = const_get const_name
      if const.kind_of?(Module) && !ignore_modules.include?(const)
        apis << [const.name, longest_method_name].join('.')
        ignore_modules << const
        apis << const.__send__(__callee__, ignore_modules)
      else
        apis << [[name, const_name].join("::"), longest_method_name].join('.')
      end
    end

    apis.max_by(&:length)
  end
end

p Object.longest_api
#=> Gem::Specification::NONEXISTENT_SPECIFICATION_VERSION.outdated_and_latest_version
```
vagrant ssh のログインで使用するユーザ名と秘密鍵を変更する

vagrant コマンドは、裏で仮想マシンにsshログインして色々していますが、そのログインユーザを変更したかったため方法をメモしておきます。

対象の仮想マシンの Vagrantfile 内で

```
config.ssh.private_key_path = "鍵のパス"
config.ssh.username = "使用したいユーザ名"
```

とすることで、設定を上書きすることができます。
vagrant ssh すると、正しくユーザが変更されていることがわかります。

ただし、設定したユーザが NOPASSWD で sudo できないと、他の vagrant コマンドで色々問題が発生すると思われます。
PHPのトレイト、競合関係のまとめ

公式 : [PHP: トレイト - Manual](http://php.net/manual/ja/language.oop5.traits.php) 

##メソドについて

優先順位は次の通り

1. 現在のクラスのメンバー
2. トレイトのメンバー
3. 継承したメンバー

公式ドキュメントには上記の様にあるが、実際には継承メンバーとトレイトメンバに同名メソドがある場合に,引数の型等の違いが有ると,エラーになる。可視性の違いは気にしないみたい。

クラスのメンバーがある場合、トレイトのメンバーは無視される。この場合はトレイトと継承メンバーに引数違いが会っても問題なし。クラスメンバーと継承メンバーで引数が同じならOK。

問題はtraitを利用する事によって、継承メンバのメソドが**上書きされる**という事。例えばファクトリーのforgeメソドとか。この辺は実装側で調整する必要があるっぽい。

調整はuseブロックの後ろに、`{}`をつけて行える。

~~~~
    use Container{
        Container::forge as forge_from_trait;
    }
~~~~

ドキュメントには,単純に複数トレイトの衝突管理での利用が主に書かれてるけど、このような形で単一トレイトで衝突調整が必要になることは多々ある。

##プロパティについて

- 静的プロパティは参照可能だが定義はできない
- オブジェクトコンテキストのプロパティは定義可能だが,利用するクラス側で同じプロパティを定義できない。定義した場合はE_STRICT(可視性と初期値が同一)またはFatal errorが発生。

##まとめ
トレイトで基底メンバが**上書き**されるのは痛い。

トレイト使う時は,内部のメソドめちゃクチャ吟味しながら使う必要があるっぽい。
(特にFW周りのクラスから継承してくる時とかは)

インターフェイスも使えないし、なんか全体的に微妙感は拭えない。
関数よりのメソド中身に持たせる、とかそんな感じの使い方になるのかなぁ、と
API名最長選手権

なが〜い名前のAPI（関数名やクラス名など）たち。括弧内は文字数。

## Windows/Win32API

`DeriveRestrictedAppContainerSidFromAppContainerSidAndRestrictedName` (67)

thanks to @egtra さんコメント

`RtlWriteDecodedUcsDataIntoSmartLBlobUcsWritingContext` (53)
`ConvertSecurityDescriptorToStringSecurityDescriptor{A,W}` (52)
`ConvertStringSecurityDescriptorToSecurityDescriptor{A,W}` (52)

http://ashutoshmehra.net/blog/2010/02/long-function-names/

## Mac OS X/Cocoa

`kCMSampleBufferConduitNotificationParameter_UpcomingOutputPTSRangeMayOverlapQueuedOutputPTSRange` (96)

thanks to @ReplicantNexus6 さんコメント

`kBluetoothAMPManagerCreatePhysicalLinkResponseAMPDisconnectedPhysicalLinkRequestReceived` (88)
`NSAccessibilityLayoutPointForScreenPointParameterizedAttribute` (62)
`NSAccessibilityScreenPointForLayoutPointParameterizedAttribute` (62)

http://psionides.eu/2010/10/31/the-longest-names-in-cocoa/

`shouldBreakLineByHyphenatingBeforeCharacterAtIndex` (50)

http://d.hatena.ne.jp/kaiseh/20080629/1214716829

## Java

`HasThisTypePatternTriedToSneakInSomeGenericOrParameterizedTypePatternMatchingStuffAnywhereVisitor` (97)

https://javadoc.io/doc/org.aspectj/aspectjweaver/1.8.10/org/aspectj/weaver/patterns/HasThisTypePatternTriedToSneakInSomeGenericOrParameterizedTypePatternMatchingStuffAnywhereVisitor.html

`InternalFrameInternalFrameTitlePaneInternalFrameTitlePaneMaximizeButtonWindowNotFocusedState` (92)

http://www.pushing-pixels.org/2007/11/07/and-the-longest-jre-class-name-is.html

`supportsDataDefinitionAndDataManipulationTransactions` (53)

http://d.hatena.ne.jp/chiheisen/20101010/1286697081

## Windows/.NET

`WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10` (103)
`WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10` (103)

`UpDownBase+UpDownButtons+UpDownButtonsAccessibleObject+DirectionButtonAccessibleObject
IDataGridColumnStyleEditingNotificationService` (86)

http://weblogs.asp.net/rchartier/archive/2004/02/05/68350.aspx

`GetTextEffectCharacterIndexFromTextSourceCharacterIndex` (55)

http://shevaspace.blogspot.jp/2006/12/longest-method-name-in-net-framework.html
文字列の途中の文字コードを一つ増やしたい

"pqr" の二番目( インデックスは 1 )の文字の文字コードを一つ増やしたいとする。
最初に思いついたのは `+=` を使うこと。
試したのは ruby 2.0.0p247。

```ruby
a="pqr"
a[1] += 1 # TypeError: no implicit conversion of Fixnum into String
```
言われてみればそのとおり。a[1] は String だ。

じゃあ `succ!` しようかと思った。

```ruby
a="pqr"
a[1].succ!
p a #=> "pqr" 変化なし
```

`a[1]` が返す一時オブジェクトを `succ!` してしまうようで、無意味な計算になっているけどエラーにはならない。

結局のところ

```ruby
a="pqr"
a[1] = a[1].succ!
p a #=> "prr"
```
と書くのがいいみたい。
`a[1]` と二度書かねばならないところが悔しい。
RubyMotionやるなら使えるかもしれないライブラリ集


30分くらい時間あったので、RubyMotionでの開発をさらに加速してくれそうなライブラリをGithubでふらふら探してたのでまとめた。

見つけたのは以下。一つ一つ詳しく見たわけではないので、使う場合は自分でよく調べてください。

* teacup
* bubble-wrap
* ProMotion
* SimpleView
* SugarCube
* ParseModel
* ib
* motionmodel
* motion-layouts
* motion-state-machine

## teacup
CSSチックにスタイル指定できるライブラリ
https://github.com/rubymotion/teacup

## bubble-wrap
HTTP通信以外にも色々な便利拡張を提供しているライブラリ
http://bubblewrap.io/

## ProMotion
よりRubyらしく書くための拡張
https://github.com/clearsightstudio/ProMotion

## SimpleView
Viewを構築するためのDSLを提供
https://github.com/seanho/SimpleView

## SugerCube
いくつかのメソッドや定数をRubyチックに書くための糖衣構文集
https://github.com/rubymotion/sugarcube

## ParseModel
[Parse](https://www.parse.com/docs/ios_guide#top/iOS)への保存に対応したモデルをActiveRecordっぽく提供しているライブラリ
https://github.com/adelevie/ParseModel 

## IB
IB OutletをRubymotionの中で使いやすくしてくれる。
https://github.com/yury/ib

## MotionModel
こちらもモデル周りに便利メソッド提供してくれるgem。
https://github.com/sxross/MotionModel

## motion-layouts
SimpleViewなんかとも似ているView周りを定義し再利用しやすくするためのライブラリ。
https://github.com/malkomalko/motion-layouts

## elevate
ドメインロジック（ログインする、とか）がバラバラに分散してしまうのを避けられるようまとめるためのツールを提供してくれる。面白い。
https://github.com/mattgreen/elevate

## motion-state-machine
ビューや通信周りなんかの複雑な状態管理をうまく扱うためのライブラリっぽい。もう少し調べてみる。
https://github.com/opyh/motion-state-machine

-----------
色々ありますが、まだまだ色んなライブラリが出てきそう。
自分でもなにか作りたい…
berks install メモ

`berks install` で `~/.berkshelf` にインストールされる。
`berks install -p cookbooks` とするのが一般的。

## Berkshelf
1. `~/.berkshelf` マシン全体な感じ（イメージとしてただのキャッシュ感がある）
- `cookbooks` そのプロジェクトでのベンダークックブック
- `site-cookbooks` そのプロジェクト固有のクックブック

##Rails に例えると
1. `system gem`
- `vendor/bundle`
- `./lib`

な感じ

## 表にしてみた

|  | Berkshelf | Rails で例える |
|:-----------|:------------|:------------|
| マシン全体  | ~/.berkshelf | system gem     |
| ベンダ      |  cookbooks  | vendor/bundle |
| プロジェクト固有 | site-cookbooks | ./lib |

## Berkshelf では site-cookbooks を使わない

以下の形で使うことが想定されている

- Berkshelfでは site-cookbooks を使わない
- ローカルだろうが野良だろうが ops comunity だろうが、全ては cookbooks 以下へ
Ruby on Rails 4.0 チュートリアル: Factory Girlの小さな問題



http://railstutorial.jp/chapters/updating-showing-and-deleting-users?version=4.0#sec-the_destroy_action

Ruby on Rails 4.0 チュートリアル第9章、9.4.2「destroyアクション」
この節の destroyアクション用rspecコードは、そのままでは動作しない。rspecで以下のエラーが発生してしまう。

```
Failures:

  1) UserPages index delete links as an admin user
     Failure/Error: let(:admin) { FactoryGirl.create(:admin) }
     ArgumentError:
       Factory not registered: admin
     # ./spec/requests/user_pages_spec.rb:41:in `block (5 levels) in <top (required)>'
     # ./spec/requests/user_pages_spec.rb:43:in `block (5 levels) in <top (required)>'
```

https://github.com/jonleighton/spring/issues/88#issuecomment-14296795

上で指摘されているように、以下のコードをspec/spec_helper.rb に追加する必要がある。

```
config.before(:all) do
	FactoryGirl.factories.clear
	FactoryGirl.sequences.clear
	FactoryGirl.find_definitions
end 
```
Google Chromeで書きだした（印刷した）PDFのサイズを小さくする（Mac）

Google Chromeの印刷機能を使って書きだしたPDFはやたらサイズが大きい上にAcrobat Proのサイズ縮小機能を使おうとしてもエラーが起きることがある。

![スクリーンショット 2013-08-10 9.51.21.png](https://qiita-image-store.s3.amazonaws.com/0/4140/e2bad798-b4d4-e1e9-228a-d9af752d202c.png)

そういうときは「プレビュー」アプリの「書き出し」でReduce Sizeを使うことでサイズをある程度縮小できる。
最近のOccur modeについて

最近のEmacs (Ver. 24.1以降)に付属のoccur modeには編集機能がつくようになった．
`M-x occur`を実行したあと，*Occur*バッファ内で`e` (`occur-edit-mode`)を押下すると編集可能になる．
編集が終了したら`C-c C-c`とすればよい．
`M-x all`などに頼らずとも編集が完結するようになったのは大きいだろう．
また，*Occur*バッファ内で`C-c C-f`(`next-error-follow-mode`)とすれば，*Occur*バッファ内の
カーソル移動に元のバッファのカーソルが追随するようになるので覚えておくと便利である．
解除したい場合は再度`C-c C-f`を押せばよい．

isearch中に`M-s o`を押下すると，isearchのクエリでoccurが発動したりもする（Emacs 23以降）．
ブロックつきのEnumerable#grepの活用

こんなコードを書いていたとき、

```rb:
def process_list con
  con.query("show full processlist").select{|row| row['Info'] }.map{|row| row['Info'] }.to_enum
end
```

このままではEnumerable#selectとEnumerable#mapの分で2回ループをまわすことになり効率が悪いのでなにかないかと思っていたところ、ブロックつきのEnumerable#grepを使う方法があるようだ.

```rb:
def process_list con
con.query("show full processlist").grep(->(row){ row['Info'] }){|row| row['Info'] }.to_enum
end
```

なかなか目から鱗だったのでメモしておく.
Hello! ServiceStack [クライアント編]

#前回のお話#
旋回はWeb Serviceを作りました。でもWeb Serviceだけあっても意味が無いですよね？
やはり、クライアントと連携しなければ・・・ね・・・。

というわけで今回はクライアント編です。
といっても、ものすごく簡単。Web Service編あんなに長いpostだったのに、ものの数行で終わっちゃうくらいに簡単。

#ゴタクはいいからコードを見せろ#
はい、もうコードはこんな感じです。
あ、事前にサービス参照とServiceModelの参照忘れずに。
サービス参照は http://webserver/soap12 みたいな感じでよろしくです。
>つーかこの辺りは公式Wikiに載ってる・・・

```csharp:Program.cs
using System;
using ServiceStack.ServiceClient.Web;
using ServiceStackHelloSample.ServiceModel.Operations;
using ServiceStackHelloSample.ConsoleApp.ServiceStackHelloWebService;

namespace ServiceStackHelloSample.ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            JsonServiceClient client = new JsonServiceClient("http://localhost:8080/");
            HelloResponse response = client.Get<HelloResponse>("/hello");
            Console.WriteLine(response.Result.ToString());
            Console.ReadLine();
        }
    }
}
```

簡単ですね！
上のコードはJSON形式で取るようにしてますが、他にもXMLで取ったりSOAPで取ったりできます。
その辺はもう公式Wiki読んで下さい・・・はい(´・ω・｀)

*****

一応、今回のコードはこちらからドウゾ＞　[GitHub : https://github.com/LainZero/ServiceStackHelloSample.ConsoleApp](https://github.com/LainZero/ServiceStackHelloSample.ConsoleApp)
Bundlerで並列処理？？bundle installを爆速で処理する方法。

[bundler](https://github.com/bundler/bundler)周りを調べていた時に、bundle installを爆速にする方法を発見したので記事を書きました。

## Bundlerで並列処理

なんと最新版のBundler(v1.4.0.pre.1)から **並列処理** が出来る様になりました！

準備はこれだけ。最新のBundlerをインストールします。

```zsh:
gem install bundler --pre
```

これで下記のコマンドで並列処理された`bundle install`が実行できます。

```zsh
bundle install --jobs=4
```

もしくは。

```zsh
bundle install -j4
```

滅茶苦茶高速化されて、ライフチェンジング :tada: 

v1.5.0からは`bundle config --global jobs 4`とするとデフォルトとして設定できます(http://bundler.io/v1.5/whats_new.html)

[bundle installのドキュメントはこちら(GitHub)](https://github.com/bundler/bundler/blob/master/man/bundle-install.ronn#L92-L93)

## 注意！

@take からコメントがあり

> ちなみに pre1 だと後方互換性が保たれてないので pre2 を入れることをオススメします。
> 
> ref: https://github.com/bundler/bundler/issues/2600

とのこと。ご注意ください！
gem install にかかる時間を短縮する


`~/.gemrc`に以下を追記します。

**追加情報** [最近のguide](http://stackoverflow.com/a/17201281)によると--no-documentが推奨されているようです。試した感じだとRuby2.0系に附属のgemだと使えるみたい。

```
gem: --no-document
```

古めのgemを使っている人は以下を。Ruby1.9.3に附属のgemだとこちら。

```
gem: --no-ri --no-rdoc
```

ドキュメントが不要な人は設定しておくと結構速くなります。

自分の環境で--no-documentが使えるかどうかは実際にgemをインストールしてみるのがいいです。

```
$ gem install tapp --no-document
```

**参考文献**

- [ruby - How to make --no-ri --no-rdoc the default for gem install? - Stack Overflow](http://stackoverflow.com/questions/1381725/how-to-make-no-ri-no-rdoc-the-default-for-gem-install)
不可解なバグ？

```objc:
using UnityEngine;
using System.Collections;

public class test : MonoBehaviour {
	string a; // 後
	float b;
	
	// Use this for initialization
	void Start () {
		b = 1f;
	
	}
	
	// Update is called once per frame
	void Update () {
	}
}
```
でシーンを再生すると...
Assets/Script/test.cs(9,17): error CS0103: The name `b' does not exist in the current context
となります。"後"という漢字がいけないっぽいです。  
とりあえず、Unityは日本語には注意ということでしょうか。
というかMonoDevelopの問題かな。
VisualStudio 2012 Express for WebでNUnitを使う

Visual Studio 2012 Expressはやはりいろいろ制限されていて、そのままではNUnitを起動できない。
しかもfor Webはその名の通りWeb系しか作れないので、Runnerが使用できない！
よって、ムリヤリインスタンス起動時に動かしちゃおうという設定。

というか通常のProfessionalとかで入ってる設定ですね。
但し、64bitや32bit指定の場合はNUnitのexe指定が違うので注意！（64bit： **nunit.exe**　32bit： **nunit-x86.exe**）

```xml:Test.csproj
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <StartAction>Program</StartAction>
    <StartProgram>D:\Program Files (x86)\NUnit 2.6.2\bin\nunit.exe</StartProgram>
.....
  </PropertyGroup>
```

NUnit.Gui.Runner使えたらこんな苦労する必要ないのに・・・(´・ω・｀)
jqクソ良い

# jqいいわ

今更jqに触れた。

# DigitalOceanのimage idを調べたいんだけど...

[packer](http://www.packer.io/)の[DigitalOcean builder](http://www.packer.io/docs/builders/digitalocean.html)を指定していたとき、image_idを指定したいのだけれど知りたいためにはAPIを叩かないといけない。
叩くのはいいんだけどJSONで結果が返ってくる。

## pretty-printしない場合

```
curl -X GET "https://api.digitalocean.com/images/?client_id={ユーザーのclient_id}&api_key={ユーザーのapi_key}
```

![スクリーンショット 2013-08-08 0.02.26.png](https://qiita-image-store.s3.amazonaws.com/0/3985/bdef269a-4416-3571-02bd-91fb6df00443.png)

ウッつらい…これ人間が読むものじゃないよな...

## pretty-printしたい場合

jqコマンドに対して、APIのレスポンスをパイプでつないでやると...

```
curl -X GET "https://api.digitalocean.com/images/?client_id={ユーザーのclient_id}&api_key={ユーザーのapi_key} | jq '.'
```

![スクリーンショット 2013-08-08 0.03.51.png](https://qiita-image-store.s3.amazonaws.com/0/3985/5a056e30-98e9-4a71-470b-2c3340f7f149.png)

美しい...綺麗で見やすい。

# これだけじゃアレなんで

パイプで結果をつないでいけるので簡単なの試してみた。

```
curl -X GET "https://api.digitalocean.com/images/?client_id={ユーザーのclient_id}&api_key={ユーザーのapi_key} " | jq '.images | .[] | if .distribution == "Ubuntu" then .distribution, .name, .id else "" end'
```

1. 出力されたJSONをフィルタリング 
2. .imagesの中身を取り出す
3. arrayに入ってるので展開 
4. distribution key が "Ubuntu"であれば、distribution, name, id それぞれの中身を出す。なければ空文字("")を表示する。

## 結果

![スクリーンショット 2013-08-10 0.25.28.png](https://qiita-image-store.s3.amazonaws.com/0/3985/f4fc78e7-12fa-f863-7a75-a234dd5a0277.png)

### うむむ
```and```, ```or```, ```not```, ```==``` など、[評価結果についてBoolean(true or false)を返す](http://stedolan.github.io/jq/manual/#ConditionalsandComparisons)のがアレで、
真だったら```true```じゃなく評価した値を返してくれるようにすると
多段フィルタリング可能なんじゃないかなーとか思ったりする。
if文がelse節必須なのもだるさが...

# 言語向けのバインディング

Python向けの[jq.py](https://github.com/mwilliamson/jq.py)を見つけた。
が、以下の理由でインストール試してない...

環境はMac OS X 10.8.4。

- setup.pyで指定しているファイル名にtypoがある ([PRしといた](https://github.com/mwilliamson/jq.py/pull/1))
- (setup.pyを修正した上で)Python 3.3.2でインストールできない
- (setup.pyを修正した上で)Python 2.7.5でインストールできない

うーむ。

# Haskellバージョンが有る...

ブランチ見てたら[haskell-version](https://github.com/stedolan/jq/tree/haskell-version)とかある。
実装のためのプロトタイプはHaskellで組んだのかなこれ...

# 総評

jqいいですね。
Random Ruby Quiz –– count words in a phrase

You will need [minitest]() gem:

    gem install minitest

Quiz: Write a program that given a phrase can count the occurrences of each word in that phrase.  Your code should pass this test suite:

```rb:test_phrase.rb
gem "minitest"
require 'minitest/autorun'
require_relative 'phrase'

class PhraseTest < Minitest::Test

  def test_count_one_word
    phrase = Phrase.new("word")
    counts = {"word" => 1}
    assert_equal counts, phrase.word_count
  end

  def test_count_one_of_each
    phrase = Phrase.new("one of each")
    counts = {"one" => 1, "of" => 1, "each" => 1}
    assert_equal counts, phrase.word_count
  end

  def test_count_multiple_occurrences
    phrase = Phrase.new("one fish two fish red fish blue fish")
    counts = {"one"=>1, "fish"=>4, "two"=>1, "red"=>1, "blue"=>1}
    assert_equal counts, phrase.word_count
  end

  def test_count_everything_just_once
    phrase = Phrase.new("all the kings horses and all the kings men")
    phrase.word_count # count it an extra time
    counts = {
      "all"=>2, "the"=>2, "kings"=>2, "horses"=>1, "and"=>1, "men"=>1
    }
    assert_equal counts, phrase.word_count
  end

  def test_ignore_punctuation
    phrase = Phrase.new("car : carpet as java : javascript!!&@$%^&")
    counts = {"car"=>1, "carpet"=>1, "as"=>1, "java"=>1, "javascript"=>1}
    assert_equal counts, phrase.word_count
  end

  def test_handles_cramped_lists
    phrase = Phrase.new("one,two,three")
    counts = {"one"=>1, "two"=>1, "three" => 1}
    assert_equal counts, phrase.word_count
  end

  def test_include_numbers
    phrase = Phrase.new("testing, 1, 2 testing")
    counts = {"testing" => 2, "1" => 1, "2" => 1}
    assert_equal counts, phrase.word_count
  end

  def test_normalize_case
    phrase = Phrase.new("go Go GO")
    counts = {"go" => 3}
    assert_equal counts, phrase.word_count
  end
end
```

write code in `phrase.rb` that pass this test suite

```
.
├── phrase.rb
└── test_phrase.rb
```

You could run the test via:

    ruby test_phrase.rb

Answer is in the comment.
「第6回オフラインリアルタイムどう書くの問題」をPHPで解く

http://qiita.com/Nabetani/items/5e1c944541f09f0f9711
http://nabetani.sakura.ne.jp/hena/ord6kinship/

家系図から二人の関係を算出します。

```php:
<?php
	class RELATIONSHIP{
		
		/**
		* 続柄を返す
		* @param  String 「5->2」みたいな文字列
		* @return String 「mo」みたいな文字列
		*/
		public function get($input){
			// 続柄
			$relation = ['me', 'mo', 'da', 'si', 'au', 'ni', 'co'];
		
			// ->で分割
			list($from, $to) = explode('->', $input, 2);
			$from = (int)$from;
			$to = (int)$to;
			
			// 続柄判断
			foreach($relation as $val){
				if($this->{'is'.ucfirst($val)}($from, $to)){ return $val; }
			}
			return '-';
		}
		
		// 自分自身であるか
		private function isMe($from, $to){
			return $from === $to;
		}
		
		// 親であるか
		private function isMo($from, $to){
			return $this->getMo($from) === $to;
		}
		
		// 娘であるか
		private function isDa($from, $to){
			return $this->getMo($to) === $from;
		}
		
		// 姉妹であるか
		private function isSi($from, $to){
			return $this->getMo($from) === $this->getMo($to);
		}
		
		// おばであるか
		private function isAu($from, $to){
			return $this->getMo($this->getMo($from)) === $this->getMo($to);
		}
		
		// 姪であるか
		private function isNi($from, $to){
			return $this->getMo($this->getMo($to)) === $this->getMo($from);
		}
		
		// いとこであるか
		private function isCo($from, $to){
			return $this->getMo($this->getMo($to)) === $this->getMo($this->getMo($from));
		}
		
		// 母を取得
		private function getMo($from){
			return intval(($from+1)/3);
		}
	}
	
	// テスト
	$test = [
		['5->2', 'mo'],
		/* 省略 */
	];

	$relationship = new RELATIONSHIP();
	foreach($test as $key=>$data){
		$answer = $relationship->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
```

とりあえず各メソッドを作っていたら答えになっていた。
時間は30分足らず。

さてロジックをよく見てみると、姉妹であるかのチェックで、自分自身ではないという確認を行っていません。
よって実際は正確な判定ではないのですが、しかし今回は先に自分自身であるかを確認しているので事実上問題ありません。
おば判定で親チェックを行っていない、いとこ判定で姉妹や自分自身チェックを行っていないことについても同様です。
順不同でもきちんと判定を行いたいのであればそこらのチェックも必要になります。
「第7回オフラインリアルタイムどう書くの参考問題」をPHPで解く

http://qiita.com/Nabetani/items/7b08b0eb9ef84d7cfe49
http://nabetani.sakura.ne.jp/hena/ord7xysort/

行列をソートするというもの。
PHPにはarray_multisort()という超絶便利関数があるので、こいつ呼ぶだけで一発だろーはっはっはー、とか思って作り始めたところ、実は全てのソート関数が値が同じときの順番を保証しないという事実が発覚して全滅。
http://jp2.php.net/manual/ja/array.sorting.php
仕方ないので自力でソートする羽目に。なんてこった。

```php:
<?php

	class XYSORT{
		
		/**
		* 二次元でソート
		* @param  String 「AvEx」みたいな文字列
		* @return String 「305027」みたいな文字列
		*/
		public function get($input){
			
			// 初期状態
			$table = [
				[4, 1, 4, 2, 1, 3],
				[7, 3, 2, 0, 5, 0],
				[2, 3, 6, 0, 6, 7],
				[6, 4, 5, 7, 5, 1],
				[3, 1, 6, 6, 2, 4],
				[6, 0, 5, 5, 5, 1]
			];
			// 文字に対応する列
			$map = [
				'A'=>0, 'B'=>1, 'C'=>2, 'D'=>3, 'E'=>4, 'F'=>5,
				'u'=>0, 'v'=>1, 'w'=>2, 'x'=>3, 'y'=>4, 'z'=>5
			];
			
			// 現在のテーブルが縦か横かのフラグ
			$tableCol = true;
			
			// 入力値でくるくる
			for($i=0; $i<strlen($input); $i++){
				// 縦か横か
				$isTableCol = (strtoupper($input[$i]) === $input[$i]);
				
				// 縦横が合ってないときは転置
				if($tableCol !== $isTableCol){
					$tableCol = !$tableCol;
					$table = $this->getTransposed($table);
				}
				
				// ソート基準列
				$columnid = (int)$map[$input[$i]];
				$column = $table[$columnid];
				
				// ソート基準列を、昇順安定ソート
				uksort($column, function($a, $b) use($column){
					if($column[$a] < $column[$b]){
						return -1;
					}elseif($column[$a] > $column[$b]){
						return 1;
					}else{
						return $a > $b;
					}
				});
				
				// テーブルを基準列に合わせてソート
				$tmp = [];
				foreach($column as $key=>$val){
					foreach($table as $row=>$data){
						$tmp[$row][] = $table[$row][$key];
					}
				}
				$table = $tmp;
			}
			
			// 最後に転置されてたら戻す
			if($tableCol === false){
				$table = $this->getTransposed($table);
			}
			
			// 終了
			return implode('', $table[0]);
		}
		
		/**
		* 転置行列を得る
		* {@see http://blog.supermomonga.com/articles/php/array-to-transverse-matrix.html }
		* @param  array 二次元配列
		* @return array 縦横を入れ替え
		*/
		private function getTransposed($array){
			return call_user_func_array('array_map', array_merge(array(null), $array));
		}
	}
	
	// テスト
	$test = [
		['AvEx', '305027'],
		/* 省略 */
	];

	$xysort = new XYSORT();
	foreach($test as $key=>$data){
		$answer = $xysort->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
```

いやー、想像以上に残念なコードになってしまった。
array_multisortにコールバックを渡せればねえ。

残念なのですが、いまいちこれよりよさげなアルゴリズムを考えつかないのでとりあえず保留。
またいずれリベンジしたいものですね。
intelliJ 12 で Rails 4 アプリを起動

IntelliJ 12 はまだ Rails 4 に対応していないので、Rails 4 の server を起動できません。 Edit configuration で指定しても、Rails server launcher wasn't found in project というエラーになります。

Rails 4 server を起動する場合は以下のようにします。

1. Run/Debug configurations のウィンドウを開く 
2. '+' ボタンを押して、 **Ruby を選択** する。Rails ではない点に注意! 
3. 'Ruby script' に bin/rails のパスを指定し、'Script arguments' には 'server' を指定します。

これでサーバを起動できるようになります。
Sublime Text2でLaravel4開発をするならsublime-laravelgeneratorが便利！

SublimeText2+Laravel4で開発を行なうときに便利なプラグインをご紹介します。

前回書いた[Laravel4を使って最速簡易ブログ作成の方法](http://qiita.com/razokulover/items/9cfe62223e0a0bc5444f)でscaffoldingなどを便利に行なえるようにするLaravel4-generatorを紹介しました。[sublime-laravelgenerator](https://github.com/gnarula/sublime-laravelgenerator)を導入すれば、それらコマンドをいちいちターミナルから実行すること無くSublimeText2上から実行できるようになります。

## インストール
1. Package InstallからLaravel4 generatorを検索してインストール

インストールはこれだけです（笑）

これでコマンドパレットを開き、「laravel」と入力すると以下のようなコマンドがずらっとでてきます。

![スクリーンショット 2013-08-29 18.25.18.png](https://qiita-image-store.s3.amazonaws.com/0/13609/f056e9cb-d24d-08d5-6580-c1c8b0f780b7.png)

## 使い方

例えばscaffoldの場合は、
1.まずmigrateするテーブル名を入力します。ここではdogsにします。

![スクリーンショット 2013-08-29 18.36.21.png](https://qiita-image-store.s3.amazonaws.com/0/13609/1e1bbe19-3275-0abe-add8-fb4e13208bf9.png)

2. 次にdogsテーブルのカラム名をいれます。ここでは、nameとageカラムを作成します。

![スクリーンショット 2013-08-29 18.40.07.png](https://qiita-image-store.s3.amazonaws.com/0/13609/3eeb5b47-1685-37b6-4f38-5e0ab942139e.png)

3.これで、dogsに関するcontroller,model,view,routes,migration,seedファイルが出来上がり。

![スクリーンショット 2013-08-29 22.14.13.png](https://qiita-image-store.s3.amazonaws.com/0/13609/8ff7cef4-dda3-e94b-b23d-8ce851cc74d5.png)

参考)[Pro Workflow in Laravel and Sublime Text](http://net.tutsplus.com/tutorials/tools-and-tips/pro-workflow-in-laravel-and-sublime-text/)