OmniAICreator/Qiita-1.07M huggingface dataset:
第9回オフラインリアルタイムどう書くの参考問題。ruby による実装例。

イベント : http://atnd.org/events/37587
問題 : http://nabetani.sakura.ne.jp/hena/ord9nummake/
解答リンク集 : http://qiita.com/items/7c46e8409c456e8fabd1

再帰を使った順当な実装のつもり。

```ruby:ord9nummake.rb
module NumMake
  class Solver
    def removed( ary, val )
      r=ary.dup
      r.delete_at( ary.index( val=='9' ? '6' : val ) )
      r
    end
    def initialize( len )
      @found=0
      @len = len
    end
    def num_at( ord, nums, x="" )
      if x.size==@len
        @found+=1
        return x if @found==ord
      else
        cand=nums.uniq-(x.size==0 ? [?0] : [])+(nums.include?( ?6 ) ? [?9] : [])
        cand.each do |c|
          r=num_at( ord, removed( nums, c ), x+c)
          return r if r
        end
      end
      nil
    end
  end
end

def NumMake.solve( src )
  items=src.split(":")
  NumMake::Solver.new(4).num_at( items.first.to_i, items.last.chars.sort ) || '-'
end
```

いつもとはちょっと違って、テストは rspec で。

```ruby:nummake_spec.rb
require 'rspec'
require 'ord9nummake'

describe NumMake do
    data = <<TESTDATA
0   13:01167    1109
1   1:1234  1234
2   2:1234  1243
TESTDATA
    data.lines.each do |t|
        ix,src,expected=t.strip.split( /\s+/ )
        context [ ix, src, expected ].inspect do
            subject{ NumMake.solve( src ) }
            it { should eq expected }
        end
    end
end
```

テストデータの大半は省略。
rspec を使っている意味があまりないような気がする。

それはさておき実装。

人間がこの問題を解く場合の手順をそのまま書いたつもり。
そうすると必然的に再帰になる。
`num_at` メソッドが長すぎるし、最後の nil が不明瞭だと思うんだけど、改善案が思いつかない。
それと、`cand` への代入の行が長くて `?` がたくさんありすぎる気がする。
Rails+Cucumberで項目にエラーが表示されるというテストをどう書くか悩んだ


Railsのデフォルトの動作では、ラベルの周りに`.field_with_errors`のついたDivタグがつく

よって、

``` step.rb
ならば(/^、"(.*?)"がエラーとなる$/) do |key|
  page.find(".field_with_errors label").should have_content(key)
end
```

とか書いてお茶を濁したんだけど、なんとなくスマートじゃない気がしてる  
う～ん
CentOS6.4インストール時のOpenGLが失敗する

##概要
veeweeを使ってvagrantのboxを作っていたんですが、

```zsh:veewee-sample
‥
Building the main Guest Additions module
[  OK  ]
Building the shared folder support module
[  OK  ]
Building the OpenGL support module
[失敗]
(Look at /var/log/vboxadd-install.log to find out what went wrong)
‥
````

上記のように失敗します。
ログを見ると、

```zsh:vboxadd-install.log
/tmp/vbox.0/vboxvideo_drm.c:110: error: unknown field ‘reclaim_buffers’ specified in initializer
/tmp/vbox.0/vboxvideo_drm.c:110: 警告: initialization from incompatible pointer type
make[2]: *** [/tmp/vbox.0/vboxvideo_drm.o] エラー 1
make[1]: *** [_module_/tmp/vbox.0] エラー 2
make: *** [vboxvideo] エラー 2
```

上記のようになっています。
どうやら`vboxvideo_drm.c`ファイル`110行目`が原因っぽい
OpenGLを使うようなことはあまりないのですが、何となく気持ち悪いのでエラーを直したいと思います。
<br>
##修正方法
難しいことをするわけではなくVirtualboxにあるTicket通りに修正します。

* [Virtulbox Ticket](https://www.virtualbox.org/ticket/11586)

```zsh:virtualbox.ticket
#私は下記のところにファイルがありました。
/opt/VBoxGuestAdditions-4.2.10/src/vboxguest-4.2.10/vboxvideo/vboxvide_drm.c

‥‥
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0)
    .reclaim_buffers = drm_core_reclaim_buffers,　←この行を
#endif
‥‥

‥‥
#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0)
    //.reclaim_buffers = drm_core_reclaim_buffers,　←このように変更
#endif
‥‥
```

コメントアウトしただけです。
変更を保存し、下記コマンドを実行してみてください。

```zsh:vboxadd.setup
sudo /etc/init.d/vboxadd seup
```
このようになれば成功です。

```zsh:vboxadd
Removing existing VirtualBox non-DKMS kernel modules       [  OK  ]
Building the VirtualBox Guest Additions kernel modules
Building the main Guest Additions module                   [  OK  ]
Building the shared folder support module                  [  OK  ]
Building the OpenGL support module                         [  OK  ]
Doing non-kernel setup of the Guest Additions              [  OK  ]
You should restart your guest to make sure the new modules are actually used
```
以上です。
mongo-ruby-driver で条件付き count()


以下のようなプログラムを書いて動かしていたら、Macbook がチュイーンと音を立て始めた。よく見てみると無限ループになっている模様。

```rb
while col.count(foo: nil) > 0
  do_something
end
```

以下のようにしないといけなかったようです。

```rb
while col.count(query: { foo: nil }) > 0
  do_something
end
```

MongoDB ネイティブなら `db.col.count({ foo: null })` でいけるのに・・・。API が紛らわしいですね。

参考
http://api.mongodb.org/ruby/current/Mongo/Collection.html#count-instance_method
gitで今日の作業を振り返る

Gitでその日にしたコミットのログを全て取得する方法。


--onelineオプションで各コミットを一行で表示します。
--branchesでブランチを指定するのですが*を渡せば全てになります。


```sh
git log --after="`date '+%Y-%m-%d'` 0:0" --oneline --branches *
```


作業報告しろとか面倒くさい指示をしてくる部長がいたらこうしましょう。

```sh
git log --after="`date '+%Y-%m-%d'` 0:0" --oneline --branches * | mail -s "本日の作業報告" butyo@example.com
```

複数のユーザがコミットしていて自分のコミットだけ抽出したい場合は--authorオプションを指定して以下のように。

```sh
git log --after="`date '+%Y-%m-%d'` 0:0" --oneline --author=name --branches *
```

午前0時を回るヘビープログラマの方はこちらのコマンドをおすすめします。
24時間以内のコミットが全て取得可能です。

```sh
git log --after='24 hour ago' --oneline
```


以上です！
山ライオン環境のrbenvで1.8.7系をインストールした時にBUILD FAILEDが出る問題の対応

以下のページの通り実行したらインストールできた。
https://gist.github.com/jpinnix/3186304

```
 $export CPPFLAGS=-I/opt/X11/include
 $CC=/usr/local/bin/gcc-4.2 rbenv install 1.8.7-p371
```
emacsでゴミ箱を使う

下記を設定すると、`delete-file` や `delete-directory`で削除したファイルやフォルダは削除されずに`~/.Trash`に移動します。これはDiredでの削除にも設定が反映されます。

```scm
(custom-set-variables
 '(delete-by-moving-to-trash t)
 '(trash-directory "~/.Trash"))
```

これでうっかり削除しても安心です。
Emacs 23.1からの機能なのに、ついさっき知りました。
VimのVundleによるプラグイン管理


vimのVundleでのプラグイン管理がすごく便利そうだったのでメモ.

## Vundleのインストール
Linuxマシンでのインストールの場合で書いてますが, Windowsのgvimなどでもインストールできると思います.

```
$ git clone http://github.com/gmarik/vundle.git ~/.vim/bundle/vundle
```

ターミナルから, gitコマンドで, [gmarik/vundle.git](http://github.com/gmarik/vundle.git) をcloneするだけでインストールが完了します.

## .vimrcの設定

``` .vimrc
set nocompatible               " be iMproved
filetype off                   " required!
set rtp+=~/.vim/bundle/vundle/
call vundle#rc()
" let Vundle manage Vundle
" required!
Bundle 'gmarik/vundle'
" My Bundles here:
"
" original repos on github
Bundle 'tpope/vim-fugitive'
Bundle 'Lokaltog/vim-easymotion'
Bundle 'rstacruz/sparkup', {'rtp': 'vim/'}
Bundle 'tpope/vim-rails.git'
" vim-scripts repos
Bundle 'L9'
Bundle 'FuzzyFinder'
" non github repos
Bundle 'git://git.wincent.com/command-t.git'
" ...
filetype plugin indent on     " required!
"
" Brief help
" :BundleList          - list configured bundles
" :BundleInstall(!)    - install(update) bundles
" :BundleSearch(!) foo - search(or refresh cache first) for foo
" :BundleClean(!)      - confirm(or auto-approve) removal of unused bundles
"
" see :h vundle for more details or wiki for FAQ
" NOTE: comments after Bundle command are not allowed..
```

上記の.vimrcのコードを.vimrcに追記してあげる感じです.

``` Bundle 'hogehoge'```

のhogehogeの部分が, インストールしたいプラグイン名になります. プラグイン名を検索したいときは, vim内で ```:BundleSearch hogehoge```としてあげればいいみたいです.

インストールしたいプラグインを```Bundle 'hogehoge'```の形式で.vimrcに保存, 再読み込みした状態で, 

```
:BundleInstall
```

を行えば, プラグインの更新・インストールを行ってくれます.
tmuxとosxのクリップボードを共用する


## reattach-to-user-namespaceをインストールする
>
$ brew install reattach-to-user-namespace

## tmux-pbcopy を作成
via. http://koseki.hatenablog.com/entries/2011/08/16

```shell:tmux-pbcopy
#! /bin/sh

tmux save-buffer /tmp/.tmux_to_pbcopy
cat /tmp/.tmux_to_pbcopy | pbcopy

# 下記は表示だけなのでなくてもOK
HEAD=`head -1 /tmp/.tmux_to_pbcopy`
TAIL=`tail -1 /tmp/.tmux_to_pbcopy`
tmux display-message "Copy:  $HEAD  -  $TAIL"
```
上記のスクリプトをpathが通ったところに置く

## .tmux.confに下記を追記
```
set-option -g default-command "reattach-to-user-namespace -l $SHELL"
bind C-q run-shell 'reattach-to-user-namespace tmux-pbcopy'
```

## tmuxからmacのクリップボードにコピーする場合
C-t(prefix) [　でcopyモードへ。
Emacs keybindにしてあるのでC-spaceで選択開始、C-wでtmux のクリップボードに保存されるので、macのそれにコピーしてあげる必要がある。これは前述の通り、C-t C-qで実行できる。

## macのクリップボードから tmuxにコピーする
>
$ pbpaste

でOK。
Enable to show css & js on save_and_open_page


### Gemfile

```ruby
gem 'guard-rails-assets'
```

### Guardfile

```ruby
guard 'rails-assets', run_on: :change do
  watch(%r{^app/assets/.+$})
end
```

### config/environments/test.rb

```ruby
  # guard-rails-assets
  config.assets.prefix = 'assets-test'

  # capybara
  config.action_controller.asset_host = "file://#{::Rails.root}/public"
```
windowsでheroku

山形のohisamaです。
heroku始めました。
##環境
>ruby 1.9.3
rails 3.2.13
heroku-toolbelt
eclipse 3.5 galileo
windows xp

##railsアプリ作成
>rails new myapp
cd myapp
rails g scaffold post title:string body:text
bundle install
rake db:migrate
rails server
http://localhost:3000/postsで確認

##project作成、修正
>eclipse起動
新規-プロジェクト-プロジェクト名-testrails
myappのすべてをプロジェクトにコピペ
チーム-プロジェクトの共用-Gitでリポジトリ作る
Gemfileを修正

```sh:Gemfile
group :production do
  gem 'pg'
  gem 'therubyracer-heroku'
  gem 'thin'
end
```
>cd testrails
bundle install --without production
rake assets:precompile
チーム-コミットでコミットする。

##herokuにデプロイ
>cd testrails
heroku create ohiapp
heroku addons:add heroku-postgresql:dev
git push heroku master
heroku run rake db:migration
heroku open
【調査】HerokuにCronは無くなってしまったけれど…

今はHerokuSchedulerがあるぜ！
https://devcenter.heroku.com/articles/scheduler

ドキュメントはRuby中心で書けれているけれどnode.jsでも動かせる様子。
http://www.youtalk.jp/post/13964633597/heroku-scheduler
詳しくはこのへん
https://devcenter.heroku.com/articles/scheduler#defining-tasks

導入すると下記の用に表示される。
Added scheduler:standard to [yourappname] (Free). This add-on consumes dyno hours, which could impact your monthly bill. To learn more: http://devcenter.heroku.com/addons_with_dyno_hour_usage 
To manage scheduled jobs run: heroku addons:open scheduler

適当な訳：
schedhler:standardを[yourappname]に追加したよ（無料だ）。このアドオンはdyno hoursを消費するので、monthly billに影響するでしょう。もっと知りたかったらhttp://devcenter.heroku.com/addons_with_dyno_hour_usage
へどうぞ。
ジョブを管理したいならheroku addons:open schedulerを実行してね。

リンク先は切れていたが、下記の様子。
https://devcenter.heroku.com/articles/addons-with-dyno-hour-usage

課金が750時間無料枠ということらしく、これを溢れない程度に利用していれば無料で使えるようだ。
https://devcenter.heroku.com/articles/usage-and-billing

まだ実装していないので調査まで。
[Windows8] Surfaceでアプリ画面のキャプチャ（スクリーンショット）を撮る方法！

Surface RT/Pro には、スクリーンショットを撮るキーがありません。
しかぁし、ちゃんとスクショ機能が搭載されていることがわかりました！！
（特にSurfae RT(Windows RT)だと、アプリストアに画面キャプチャアプリケーションがまだないので、諦めていたところでした。）

それは、ハードウェアキーを使います。

__左側面にある音量下ボタン　+ 画面下にあるWindowsマークのキー を同時押し__

これで表示されている画面のスクショが撮れますよ！

また、同時押しじゃないとできないかと思いましたが、やりやすいやり方がわかりました。
Windowsマークのキーの方は、長押しできるので、その間に音量下ボタン押すのがやりやすそうです。

スクショ画像は、クリップボードにコピーされているので、そのままペーストできます。
また、画像自体も保存場所は、「ピクチャ」に「スクリーンショット(Screenshots)」フォルダが作成されて、そこに保存されます。

ぜひご活用ください～！
ストアアプリの紹介に重宝しますね！

----
ちなみに、ネタ元は、なんと Skitch アプリ（Windows Store アプリ）です。
この場を借りて感謝をお伝えしたいと思います。ありがとうございます！

![Skitchのスクリーンショット方法表示画面](https://s3-ap-northeast-1.amazonaws.com/blogres/images/misc/130323/skitch_tell_howto_capture.png "Skitchのスクリーンショット方法表示画面")
RでEMアルゴリズムによる混合ガウスモデル最尤推定

PRML 9.2.2に記載の通り、EMアルゴリズムによって混合ガウスモデルの最尤推定が行われる過程と、対数尤度関数の収束の様子を示します。

![](https://dl.dropbox.com/sh/cwfemibvr7gk4cy/8j8iHsbmWy/22.GaussianMixtureEM.png)

```r
library(mvtnorm)
library(plotrix)
frame()
set.seed(0)
par(mfrow=c(4, 4))
par(mar=c(2.5, 2.5, 1, 0.1))
par(mgp=c(1.5, .5, 0))
xrange <- c(-2, 2)
yrange <- c(-2, 2)
D <- 2
K <- 2
data(faithful)
x <- as.matrix(faithful)
N <- nrow(x)
#N <- 100
#x <- rmvnorm(N / 2, c(-1, -1), matrix(c(.4, 0, 0, .4), D))
#x <- rbind(x, rmvnorm(N / 2, c(1, 1), matrix(c(.4, 0, 0, .4), D)))
x <- t((t(x) - apply(x, 2, mean)) / apply(x, 2, sd))  # normalize
mu <- matrix(c(-1.5, 1, 1.5, -1), K, byrow=T)
sigma <- rep(list(diag(0.5, D)), K)
pz <- rep(1 / K, K)
gamma <- matrix(NA, nrow=N, ncol=K)
likelihood <- numeric()

iteration <- 0
repeat {
	cat("mu\n");print(mu)
	cat("sigma\n");print(sigma)
	cat("pi\n");print(pz)
	
	plot(x, xlim=xrange, ylim=yrange, col=ifelse(is.na(gamma[, 2]), 1, hsv(gamma[, 2] * .4)), pch=1)
	for (k in 1:K) {
		e <- eigen(sigma[[k]])
		draw.ellipse(mu[k, 1], mu[k, 2], sqrt(e$values[1]), sqrt(e$values[2]), 
			atan2(e$vectors[2, 1], e$vectors[1, 1]) / pi * 180,
			border=hsv((k - 1) * .4, 1, 0.8), lwd=2)
	}
	title(paste0("EM step#", iteration))

	# E step
	for (n in 1:N) {
		pzx <- sapply(
			1:K, 
			function(k) pz[k] * dmvnorm(x[n, ], mean=mu[k, ], sigma=sigma[[k]])
			)
		gamma[n, ] <- pzx / sum(pzx)
	}
	
	# M step
	nk <- colSums(gamma)
	for (k in 1:K) {
		mu[k, ] <- colSums(x * gamma[, k]) / nk[k]
		sigma[[k]] <- matrix(
			rowSums(sapply(1:N, function(n) gamma[n, k] * outer(x[n, ] - mu[k, ], x[n, ] - mu[k, ]))),
			D) / nk[k]
		pz[k] <- nk[k] / N
	}
	
	# likelihood
	likelihood <- c(likelihood, sum(sapply(1:N, function(n)
			log(sum(sapply(
				1:K, 
				function(k)
					pz[k] * dmvnorm(x[n, ], mean=mu[k, ], sigma=sigma[[k]])
				)))
			)))
	
	if (length(likelihood) > 1 
		&& likelihood[length(likelihood)] - likelihood[length(likelihood) - 1] < 1.0E-2) {
		break
	}
	iteration <- iteration + 1
}

plot(likelihood, type="l", xlab="iteration", ylab="ln p(X)")
title("ln p(X)")
```
android.R.drawable.* を表示する

リフレクションで android.R.drawable.* をとってきて表示するだけのアプリを作った。

* https://github.com/gfx/android-builtin-resource

Webにも[Android R Drawables](http://androiddrawableexplorer.appspot.com/)とかあるのだけどなぜか存在しないものも多くて参考にならなかったりする。また、Androidのバージョンによっては同じ名前のdrawableでも見た目がまったく違ったりするので実機で確認もしたい。

Webで見れるのが理想だけどアプリとしてもまあいいか、という感じ。
OS X で起動時に任意のコマンドを実行する

OS X 10.5 以降で起動時に任意のコマンドを自動で実行したい場合、本来であれば *launchd(8)* を使用した制御が必要なので **/System/Library/LanchDaemons/** 以下に plist ファイルを準備する必要がありますが、**/Library/StartupItems** にコマンド起動用のスクリプトファイルを設置する事で、起動時に任意のコマンドを実行できます。
基本は普通のシェルスクリプトですので、シェルスクリプトに慣れている場合はこちらの方が使いやすいかも知れません。

## /Library/StartupItems に任意の名称のディレクトリを作成する
ここでは "*サービス*" とします。 

```sh:
# mkdir /Library/StartupItems/サービス
```

## 作成したディレクトリに起動スクリプトを作成する
スクリプトファイルは "*サービス*" と同じファイル名にします。

```sh:
# cat << EOF > /Library/StartupItems/サービス/スクリプト
> #!/bin/sh
>
> . /etc/rc.common
>
> StartService ()
> {
>	# 起動時に実行するコマンドを記述する
> }
>
> StopService ()
> {
>	# シャットダウン時に実行するコマンドを記述する
> }
>
> RestartService () { StartService; }
>
> RunService "$1"
> EOF
```

## サービスの説明を記述した plist ファイルを作成する
サービスの説明と提供するサービスの内容を書いたテキストファイルを作成します。
ファイル名は **StartupParameters.plist** とします。

```sh:
# cat << EOF > /Library/StartupItems/サービス/StartupParameters.plist
> {
>	Description     = "サービスの説明";
>	Provides        = ("提供するサービスの内容");
> }
> EOF
```

## 正しい権限を設定する
セキュリティ上の理由から、ファイルの所有者が root 以外の場合は自動実行されない様なので権限を正しく設定します。

```sh:
# chmod 755 /Library/StartupItems/サービス名/スクリプト名
# chown -R root:wheel /Library/StartupItems/サービス名
```

これで次回の起動時より指定したコマンドが自動で実行されます。
【未解決】さくらのレンタルサーバースタンダードでSSHログインを拒否される



いままで普通にSSHリモートログインできてたのに、急にできなくなった…　マジで困る…　どなたか解決策をご存知の方教えてください！

```
$ ssh ユーザ名@アカウント名.sakura.ne.jp
$ Connection to アカウント名.sakura.ne.jp closed by remote host.
Connection to アカウント名.sakura.ne.jp closed.
```

ちなみに下記によると、この場合IPが拒否されてる可能性があり、`/etc/hosts.allow`に接続元のIPを記入すれば良いとある。

- [「ssh_exchange_identification: Connection closed by remote host」というエラーの対処 - くらげだらけ](http://kudakurage.hatenadiary.com/entry/20090324/1237878523)
- [仕事SPOT: ssh_exchange_identification: Connection closed by remote host](http://wsjp.blogspot.jp/2012/08/sshexchangeidentification-connection.html)

```
sshd : [IPアドレス1]
sshd : [IPアドレス2]
sshd : [IPアドレス3]
```
か、全部許可なら

```
sshd:ALL
```

とのこと。

が、FTPにて`/etc/hosts.allow`を開けるものの、保存ができない…　うー。マジで困った。
requestモジュールでJSONのレスポンス想定で受信する

facebookのアクセストークンからアプリケーションをチェックしようとしたらレスポンスヘッダがtext/javascriptで返ってきていた。requestモジュールでjsonを想定して受信する方法は下記でjsonを見ると概ねわかる。
https://github.com/mikeal/request#requestoptions-callback

実はここを見ていなくてソースを読んで解決して後で気づいたが…

例えば以下のようなコードになる。

```js
request('https://graph.facebook.com/app?access_token=' +  token, {json: true}, function(){
...
});
```
秘密鍵のパスフレーズ入力をスルーする

# 秘密鍵のパスフレーズ入力をスルーする。

ShellScriptでSCPやらなんやら使おうとしたら、鍵認証しか出来ない。
しかもパスフレーズかかってる。

## 環境変数の変更

```
[root@localhost ~]# eval `/usr/bin/ssh-agent`
Agent pid 5148
```

##秘密鍵の追加

#ssh-addを使用してssh-agentに秘密鍵を登録し、パスフレーズを維持する。

```
[root@localhost ~]# ssh-add ~/.ssh/id_rsa

Enter passphrase for /root/.ssh/id_rsa:　←ここでパスフレーズ入力

Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)
```

※もちろん公開鍵は接続先のAuthorized_keysへ。

##接続確認

SSHを叩いてみて、スルー出来ればOK

```
[root@localhost ~]# ssh remote
```
IronRuby で クリップボードを使う

.Net Framework では System.Windows.Clipboard に クリップボードを扱うクラスがある。しかし、IronRuby で require ‘System.Window’ としても、no such file to load – System.Windows (LoadError) となる。
msdn のWEBリファレンスを確認すると、Assembly: PresentationCore (in PresentationCore.dll) という記述がある。IronRubyのLibにもPresentationCore.rbがあるのでこれを使う。

```ruby:clipbord.rb
# coding : windows-31j
require 'PresentationCore'
require 'System.Windows.Forms'

System::Windows::Clipboard.SetText("あいうえお") #=> クリップボードに"あいうえお"をセットする。

Thread.start { system("notepad.exe") } #=> 貼り付け用アプリ起動 

sleep 1 #=> notepad.exeが起動するまでスリープ ( きっと別の良い方法があるはずだが、今回は保留 )

System::Windows::Forms::SendKeys.SendWait('^V') #=> ^Vを送信することで、Ctrl + V となる。
```
Array#sort わからないんです。そんな私が調査してみました。

Array#sort ってややこしいですよね、イメージがわかないというか。（私だけ？） ということで、ちょこっと触って、それなりに理解できたのでメモ。 大まかにいうと、a <=> b とした値が-1なら a を先に、1ならbを先にするということらしいです。 以下、調査した時のスクリプト

```ruby:sort.rb
# coding : windows-31j
# 0 から 1000 までのランダムな整数を10個もつ配列を生成
arr = 10.times.collect do |i|
  rand(1000)
end

puts "Random Integers"
p arr

# Array#sort は
# 要素1 <=> 要素2 の結果が
# -1 なら 要素1が先
#  0 なら 同じ
#  1 なら 要素2が先
# となる。
# <=> は オブジェクトによって再定義可能なメソッドであるため
# -1, 0, 1 を返す条件はオブジェクトに依存するが、基本的には
# 要素1が大きければ1 等しければ0, 要素2が大きければ-1を
# 返すように作ることが期待されている。

# 昇順ソート
asc_arr = arr.sort do |a, b|
  a <=> b
end

puts "Ascending Sort"
p asc_arr

# 降順ソート
# -1 : bを先にaを後にする
#  0 : 交換しない
#  1 : aを先にbを後にする
desc_arr = arr.sort do |a, b|
  b <=> a
end

puts "Descending Sort"
p desc_arr

# ブロックを渡さずとも、デフォルトで昇順ソートになる。
puts "Default Sort(Ascending Sort)"
p (arr.sort)

# ブロックを渡すと便利な場合として、テーブルのソートがある
# カラムにID番号を整数で格納するid と 何かの名前を文字列で格納するnameを持った
# クラスが配列にランダムに格納されていたとする。
class AnyRecord
  attr_accessor :id, :name
  def initialize
    @id = create_id
    @name = create_name
  end

  def create_id
    rand(1000)
  end

  def create_name
    # ランダムな文字列生成
    a = ('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a
    (
      Array.new(16) do
        a[rand(a.size)]
      end
    ).join
  end
  
  def to_s
    "id:#{@id} name:#{@name}"
  end
end

table = 10.times.map do |i|
  AnyRecord.new
end

puts "Random Records"
table.each { |r| p r }

# ID で昇順ソート
sorted_by_id_table = table.sort do |a, b|
  a.id <=> b.id
end

puts "Sorted by id Records"
sorted_by_id_table.each { |r| p r }

# name で昇順ソート
sorted_by_name_table = table.sort do |a, b|
  a.name <=> b.name
end

puts "Sorted by name Records"
sorted_by_name_table.each { |r| p r }

# ちなみに、引数なしでソートしようとするとエラーになる
# table.sort #=> comparison of Any Record with AnyRecord faild (ArgumentError)
# これはAnyRecord に 比較演算子 <=> が定義されておらず、比較できない為に発生する
# AnyRecord に 比較演算子 <=> を定義してやることで問題は解決する。
class AnyRecord
  # ここでは、idでのソートをデフォルトソート(ブロックなしソート)とする
  def <=>(other)
    self.id <=> other.id
  end
end

sorted_by_default_table = table.sort

puts "Sorted by default Records"
sorted_by_default_table.each { |r| p r }

# 複数のキーでソートする場合は以下のようにする
# nonzero? で nil になると、次のor節が評価される.
puts "Sorted by multi keys"
table.sort { |a, b|
  (a.id <=> b.id).nonzero? ||
    (a.name <=> b.name)
}.each { |r| p r }
```
JavaScriptのプロトタイプからオブジェクト指向を学ぶ

# JavaScriptの「プロトタイプ入門」

JavaScriptはオブジェクト指向です。

クラスという概念はないため、
擬似的なクラスの表現を使ったパターンがあります。

ただ今回はそちらではなくプロトタイプベースの説明をします。

その前にコンストラクタについて知らない人はこちらへ。
[JavaScriptのクラス？コンストラクタ？](http://qiita.com/items/010752b1427773558f7c)


#プロトタイプって？

そもそもプロトタイプってなに？

実は、、プロトタイプとは「オブジェクト」のことなんです。
そして感覚としては親だと思って大丈夫です。

親の能力は子にも受け継がれている。。的なニュアンスですね。
（まぁ意味合いはちがいますがw）

#prototypeプロパティ

ここで新規に関数を生成してみましょう。
そうするとprototypeプロパティが自動で作成されます。

```javascript:
function proto() {} //proto.prototypeは自動で生成
```

このように関数を生成した時点で、
proto.prototypeプロパティが自動で生成されます。

そしてそれは新たな空オブジェクトへの参照を持っているんですね。
そしてprototypeプロパティは自分の親への参照だと思って下さい。

ここは非常に重要です。。。
ということで見るより慣れろ！

先に実用例をチェックします。

#実用例

```javascript:
function Dog() {}
Dog.prototype.bark = function() {
  console.log('わんわん');
};

var dog = new Dog();
dog.bark(); //'わんわん';
```

といった感じです。。
dog自体は何も持っていませんが、
親がbark関数を持っているので、あたかも自分のようにつかえちゃいます。

あれ、でもこれって…下と何が違うの？？

```javascript:
function Dog() {
  this.bark = function() {
    console.log('わんわん');
  };
}
var dog = new Dog();
dog.bark(); //'わんわん';
```

ふーむ、挙動は一緒ですね。
ただ前者のほうがbetterです。

実は後者だと毎回毎回関数が生成されちゃうんです！

・・・？？

前記事でも説明しましたが、
newはこんな暗黙のルールをもっています！

```javascript:
function Dog() {
  // var this = {};
  this.bark = function() {
    console.log('わんわん');
  };
  // return this;
}
```

なのでこれでは毎回空オブジェクトを作成し、
毎回新しくbark関数を定義しちゃっていますね。。

そこでプロトタイプの出番です！
そしてプロトタイプは親だと思ってください。
そして子は親のプロパティを共通で使えちゃいます！

ここでも実践例！

```javascript:
function Dog(cry) {
  this.cry = cry;
}
Dog.prototype.bark = function() {
  console.log(this.cry);
};

var chiwawa = new Dog('きゃんきゃん');
chiwawa.bark(); //'きゃんきゃん';

var shiba = new Dog('わんわん');
shiba.bark(); //'わんわん';
```

といった感じです。

これだと関数は無駄に生成されていませんね♪
なぜならnewを使った挙動は下記だからですね。

```javascript:
function Dog(cry) {
  // var this = {};
  this.cry = cry;
  // return this;
}
```

そしてポイントです！
newを使った場合のthisのプロトタイプは、
Dogのプロトタイプと同じ参照を持っています！

すなわちこれによって生成されたインスタンスはbark関数が使えちゃいます。

#実践のポイントは一点のみ

単純にプロトタイプを使用したい場合は、
ポイントは一点のみ！

・汎用的な関数はprototypeに定義

これだけです！

プロトタイプ（親）に汎用的な関数を定義し、
あとはインスタンス（子）はみんなで仲良くその一つを使うわけですね。

そして関数以外は上のcryのように子自身に定義しちゃいます。

とまぁ、入門としてはこの使い方ができれば十分だと思います。
ではでは、おさらばです♪

# 外部アカウント

技術情報のみつぶやくアカウント作成しました。JavaScriptは最新情報も追っていきます。
[Twitterはこちら]
(https://twitter.com/takeharumikami)
[Feedlyのフォローはこちら]
(http://cloud.feedly.com/#subscription%2Ffeed%2Fhttp%3A%2F%2Fqiita.com%2Ftakeharu%2Ffeed)

# おすすめの記事

入門者がつまづく、thisの挙動を4種類に分けて簡単に学ぶならこれ。Apply, callの挙動までわかる。
[JavaScriptの「this」は「4種類」？」](http://qiita.com/takeharu/items/9935ce476a17d6258e27)

JavaScriptでは関数はすべてクロージャ。
[そもそもクロージャって？JavaScriptでクロージャ入門](http://qiita.com/takeharu/items/4975031faf6f7baf077a)
WiresharkのCLI版tsharkを使ってrubyにキャプチャデータを渡すある一つの方法

その方法はパイプ。 IO.popenでtsharkを起動させ、標準出力に表示されるデータをrubyに渡します。 今回はtsharkのオプション設定でxmlを標準出力に出力させています。 (パケットの始まりと終わりがよくわからなかったので、XMLのタグで識別する方法をとりました) XMLになれば、ノードを検索し煮るなり焼くなり好きにできます。 スレッドにしているのはキー入力待ち状態にして、キーが押されたらキャプチャ終了というようにしたかっただけなので、こうしなければ動かないということではありません。

```ruby:rshark.rb
# coding : windows-31j
require 'rexml/document'
include REXML

cmd = [
  'C:/temp/Wireshark/tshark.exe',
  '-i 1',
  '-T pdml',
].join(" ")

io = IO.popen(cmd, "rb")
Thread.new do
  loop do
    if (_str = io.gets) =~ /^<packet>/
      str = _str
      until (_str =~ /<\/packet>/)
        str << io.gets
      end
      xml_doc = REXML::Document.new(str)
      search_text = 'packet/proto[@name="geninfo"]'
      puts xml_doc.elements[search_text].attributes['size']
    end
  end
end

loop do
  if gets
    io.close
    exit
  end
end
```
DropBox Linux CLI インストール

# Dropbox Linux CLI インストール手順

##pythonのインストール

```
# yum install python
```

##ソースコードのダウンロード

```
# wget -O - http://www.dropbox.com/download?plat=lnx.x86_64 | tar xzf -
```

##Dropboxデーモンの実行

###下記コマンド実行後に表示されるURLでアカウントの登録
```
# ~/.dropbox-dist/dropboxd
```

##操作用コマンドのダウンロード

```
# mkdir /root/.dropbox/bin ←パスが通っているところ
# cd /root/.dropbox/bin
# wget -O dropbox.py https://www.dropbox.com/download?dl=packages/dropbox.py
# chmod u+x dropbox.py
```

##dropbox.pyの変更

###ディレクトリの確認

```
# ls /usr/bin/python{tab}
```

##dropbox.pyの一行目を変更

```
# vi /dropbox.py
#!/usr/bin/pythonを#!/usr/bin/python{上記で書くにしたディレクトリ}
```

##dropboxの起動

```
# dropbox.py start
```

##LAN接続時の同期をOFF

```
# dropbox.py lansync n
```
MySQLでrootパスワードを忘れた時のリセット方法

# MySQLのrootパスワードを忘れたときの対処法

まずroot権限に。

```
# su -
password:
```

次にmysqlをkillする。

```
# killall mysqld
```

セーフモードでmysqlにログイン

```
# /usr/local/mysql/bin/safe_mysqld --user=root --skip-grant-tables & mysql mysql
```

もしくは

```
# /usr/bin/mysqld_safe --user=root --skip-grant-tables & mysql mysql
```

これでmysqlにログインできるのでパスワードを初期化

```
mysql> update user set Password=null where Host='localhost' and User='root';
mysql> exit
```
次にセーフモードではなく普通の状態でmysqlを再起動

```
# /etc/rc.d/init.d/mysqld restart
```

mysqlにroot(パスワードなし)でログインしてにパスワードを再設定

```
# mysql -u root
mysql> set password for root@localhost=password('rootパスワード');
```

以上で再設定完了。
SSHをShellScriptで秘密鍵認証を使わずにパスフレーズを通す。

```bash:auto_scp.sh

#!/bin/sh
expect -c ”
spawn scp data.txt user@192.168.xxx.xxx:/tmp/
expect {
  ￥”Are you sure you want to continue connecting (yes/no)?￥” {
    send ￥”yes￥r￥”
    expect ￥”password:￥”
    send ￥”（パスワード）￥r￥”
  } ￥”password:￥” {
    send ￥”（パスワード）￥r￥”
  }
}
interact
”
```
gem パッケージのバージョン番号は gemspec で定義すれば良い

`bundle gem` でテンプレートを生成すると、`version.rb` というファイルに `Package::Name::Version::VERSION` という定数を作ってそこにバージョン番号を定義してくれる。gemspec では `version.rb` を `require` して、`VERSION` 定数を参照することで gem パッケージのバージョンを設定する。

この方法は、バージョン番号の定義が一カ所だけになって DRY だが、`Package::Name` をモジュールではなく、`Object`ではないクラスのサブクラスにしたい場合に問題を発生させる。

その問題とは、`lib/package/name.rb` と `lib/package/name/version.rb` の2つのファイルで、以下のようにスーパークラスを二重に書く必要があることだ。

```
# lib/package/name.rb
module Package
  class Name < SuperClass
  end
end

# lib/package/name/version.rb
module Package
  class Name < SuperClass
    module Version
      VERSION = '1.0.0'.freeze
    end
  end
end
```

`SuperClass` が `Array` などの組み込みクラスなら、スーパークラスの指定が DRY じゃないというだけなんだが、他のライブラリで定義されているクラスだったりするともっと困る。`version.rb` をロードするだけで `SuperClass` を提供しているライブラリもロードしてしまうからだ。`version.rb` は gemspec でロードされるので、gemspec をロードしただけで依存するライブラリをロードしてしまう困ったちゃんになってしまい、ユーザが激おこプンプン丸に変身してしまう。

これを解決する方法として、バージョン番号を gemspec に直接書く方法を発見した。

原理は簡単だ。gem パッケージ内のファイルをロードできるということは、そのパッケージの gemspec が既にロードされていることを意味する。だから、ライブラリ内では `Gem.loaded_specs['package-name']` で自分自身の `Gem::Specification` オブジェクトが取り出せる。

よって、以下のように `lib/package/name.rb` の中で `VERSION` 定数を直接定義してしまえばよい。

```
# lib/package/name.rb
module Package
  class Name < SuperClass
    VERSION = Gem.loaded_specs['package-name'].version.to_s.freeze
  end
end
```

`version.rb` はもう必要無い。
Chef で Amazon VPC 内に配置したインスタンスの node["ec2"] が nil になってしまう場合


# 解決方法

参考: http://www.opscode.com/blog/2012/05/30/ohai-6-14-0-released/

`/etc/chef/ohai/hints/ec2.json` があれば期待通り動作する。中身は valid な JSON であれば何でも良い。

```bash
mkdir -p /etc/chef/ohai/hints
echo {} > /etc/chef/ohai/hints/ec2.json
```

で OK。

# 原因

サーバの情報を収集する Ohai で、EC2 か判定する処理で下記のメソッドが使用される。

```ruby
# ohai-6.16.0/lib/ohai/plugins/ec2.rb
def has_ec2_mac?
  network[:interfaces].values.each do |iface|
    unless iface[:arp].nil?
      if iface[:arp].value?("fe:ff:ff:ff:ff:ff")
        Ohai::Log.debug("has_ec2_mac? == true")
        return true
      end
    end
  end
  Ohai::Log.debug("has_ec2_mac? == false")
  false
end
```

しかし、VPC 内ではこのメソッドは false を返すため、EC2 であると判定されない。`/etc/chef/ohai/hints/ec2.json` があれば、このメソッドを使うことなく、EC2 であると判定するようになる 

ちなみに `/etc/chef/ohai/hints/rackspace.json` なら rackspace だと判定したりする。冒頭の参考 URL 参照。

# Chef でこのファイルを作成すると...

Cookbook の template で作成してみたけど、node の情報は Cookbook のロードより前に収集してるのか、初回の cook ではうまくいかない。次からは期待通りに動作するのだけど。うーむ。

# 別のパスにする...のは難しそう

`/etc/chef/ohai/hints` というパスは `Ohai::Config.hints_path` で (1 要素の Array で) 指定されているので、ここに任意のパスを追加すればよい...のだけど、Chef 使用時にどのタイミングで指定すればいいのかわからなかった。
heroku/ruby で bower install する hack

nodejs アプリケーションならふつうに [package.json の postinstall](http://stackoverflow.com/a/14828252/338986) でいいのですが、 ruby アプリケーションだと package.json を実行してくれません。 

しかし、 [ruby buildpack は `assets:precompile` rake task があれば実行する](https://github.com/heroku/heroku-buildpack-ruby/blob/master/lib/language_pack/ruby.rb#L587-L597)ので悪用します。

```ruby:Rakefile
task "assets:precompile" do
  `(cd /tmp && curl -O https://heroku-buildpack-nodejs.s3.amazonaws.com/nodejs-0.8.19.tgz)`
  `(mkdir -p bin/nodejs && cd bin/nodejs && tar xzf /tmp/nodejs-0.8.19.tgz)`
  `(cd bin && ln -s nodejs/bin/node node)`
  `node bin/nodejs/bin/npm install`
end
```

rails の場合はすでに `assets:precompile` が定義されているのでなんとかしてください(別 task にして assets:precompile が依存するようにすればいいのかな?)。
mod_spdy をインストールする


```
mkdir -p ~/bin
cd ~/bin
svn co http://src.chromium.org/svn/trunk/tools/depot_tools

export PATH=~/bin/depot_tools:$PATH

mkdir ~/mod_spdy
cd ~/mod_spdy/

gclient config "http://mod-spdy.googlecode.com/svn/tags/current/src"

gclient sync --force
cd src/
make BUILDTYPE=Release

cp out/Release/libmod_spdy.so /var/apache22/modules/mod_spdy.so

./build_modssl_with_npn.sh
```

httpd.confに以下の記述を加える。

```
LoadModule spdy_module /var/apache22/modules/mod_spdy.so
SpdyEnabled on
```

```
# オリジナルのmod_ssl.so はバックアップ取ること
cp mod_ssl.so /opt/apache22/modules/
```

注意点は、mod_ssl.so をコピーしてから apacheを再起動するまでの間は
mod_ssl がエラーを吐いてSSL通信できなくなるため、サービス中断しないでのインストールはできないということ。

後、こちらの環境では、apache再起動はgracefulでなくてrestartでないとサービス再開できませんでした。
Perlの"bad interpreter"エラー


コマンドラインやCGIなどのPerlプログラムで**bad interpreter**というエラーが出て実行できない時がある。

    $ cat crlf.pl
    #!/usr/bin/perl        use strict;    use warnings;        print "Hello\n";
    
    $ ./crlf.pl
    -bash: ./crlf.pl: /usr/bin/perl^M: bad interpreter: No such file or directory

これは**大抵改行コードの問題**。

Perlインタープリターに明示的にファイル名を与えると特に問題がない。

    $ perl crlf.pl 
    Hello

なので、ネット上ではPerlインタープリターに明示的に渡せないCGIで困っているケースが散見される。

"./script" などと「直接実行」した場合、まず実行しているOS環境(Linuxとか\*BSDとか)が、それがスクリプトファイルなのか直接実行形式ファイルなのかを判別するが、前者の場合は1行目のshebang行が頼りになる。

ただ、Linuxなどの環境で改行コードとしてCR+LFを想定していない場合、shebang行がエディタでの見かけ上 #!/usr/bin/perl などとなっていても、それがCR+LF改行コードの場合には、LFが改行コードのOSにとってshebang行は

    #!/usr/bin/perl<CR>

となってしまい「"/usr/bin/perl\<CR\>" なんて存在しない」と言われることになる。これが bad interpreter の意味。

解決方法は**エディタで改行コードをLFに変更する**こと。

一番上の実行例では"^M"としてCRが可視化されているから分かりやすいものの、可視化されない環境もある。

----

ネットでは「shebang行を #!/usr/bin/perl から #!/usr/bin/perl -w に変更すれば動く」という「解決法」も紹介されているが、たまたまperlが -\<CR\> というオプションを無視するから上手くいくだけで、これはバッドノウハウでしかない。モダンなPerlプログラムはshebang行の -w で warnings を有効にするのではなく、warnings プラグマで有効にする (use warnings; する) ほうが一般的。

「改行コードをLFに変換したらWindowsのメモ帳で改行が無くなった」というクレームに対しては、HTMLならまだしも「通常UNIX系OSで実行されるスクリプトファイルの改行コードはLFなのだから対応するエディタを導入してください」という回答が最適だろう。そういったエディタはフリーソフトで大量に存在する。
Debian Wheezy にSteam を導入

公式にはUbuntu のパッケージはあるが，Debian のものはない．
以下のGist を使わせてもらう．
"Steam installer for Debian" https://gist.github.com/grindars/4231563

>
$ git clone https://gist.github.com/4231563.git
$ sh 4231563/steam_bootstrap.sh

これだけでSteam が入る．
初回起動時にはアーカイブ落として導入の続きが走る．
そのあとアカウント登録．

Demos の2p 目あたりにあった．「The Book of Unwritten Tales: The Critter Chronicles」を入れてみた．
NotePC のオンボードですが結構普通に動いてるような感じです．
PhpStormでさらに覚えるべきショートカット(IDEAもね)


PhpStormで自分がよく使うショートカットです。[PhpStormでまず覚えるべきショートカット](http://qiita.com/items/bbdf850f0d90ad16415a) とかぶっているのは書いてないのでお先にどうぞ。

IntelliJ IDEA でもわりと共通しています。面倒なので表記がMac専用ですがWindowsでもたぶん同じ機能が使えますよ、きっと。

## 無敵コマンド

`⌘+⇧+A`

出てきたポップアップに、こんなのできるかなぁ、できたはずだけどな、と、やりたいことをなんとなく英語で書くと、機能をメニューで選んで直接実行できます。ショートカットが割り当ててあればそれも表記されるうえ、入れた単語が設定ダイアログで見つかれば、設定の該当箇所を開いてくれたり。

## 定義と使用箇所を行ったり来たり

定義元へジャンプは、キャレット位置のワードに対して `⌘+B` する他にも、`⌘+ワードをクリック` があります。コマンドキーを押しながらマウスカーソルをホバーさせたら、辿れるワードだけアンダーラインが出てくれます。ツールチップにシグニチャが出たりもします。なんでマウスを好んでいるかというと、キャレットの位置がそのままなのが嬉しいからです。

定義元へジャンプの逆をやるのが `⌘+⌥+F7` です。変数やメソッドを使っている場所へジャンプ。コンテキストメニューの _Find by usage_ よりも素早くて、直前の検索ツールウィンドウの結果をクリアしてしまわないのが嬉しいです。

定義と使用箇所にジャンプする機能を使うなら、ぜひ憶えておいて欲しいショートカットが、 `⌘+⌥+←` です。Webブラウザの「戻る」と同じことができます。ほとんどのジャンプは、行き先のコードを参照するのみ、あってもせいぜい数行変更するだけで、だいたいはすぐに元のコードに戻ってきますよね。

「戻る」では戻れないぐらい探検しすぎたときは、最後に**編集した**場所に行く `⌘+⇧+⌫` が便利です。これ、戻る/進むのヒストリとは関係ないジャンプです。

ちなみにですが「進む」のは `⌘+⌥+→` です。戻りすぎたときにどうぞ。

## 移動するまでもないコード参照

`F1` でキャレット位置のメソッドのDocコメントの内容が出せます。ドキュメントコメントは大事。

`⌘+P` ではメソッドのパラメータヒントが小さく出てきます。普通の補完とドキュメントがあればいいじゃないかと思いきや、キャレット位置のワードがどの引数に対応しているかが、太字になってわかるという機能です。憶えておいて損はないですよ。

ドキュメントがない場合は定義のコードを見るしかないですが、いちいち定義元へジャンプしなくても、`⌥+Space` で定義行がポップアップとして出てくれます。ちょっと参照したいだけの時はこの方が便利。

## 行きたいところにすぐに行く

`⌘+O` で適当に名前を打ってクラスを開きます。開いたら Structure ツールウィンドウ... でもいいんですが、キーボードから手を離したり、ウィンドウのフォーカスを移動したりしたくはないです。

`⌘+F12` で Structure ポップアップを開けます。そこで適当に何文字か打ってメソッド名を絞り込んでジャンプ。

文法的にクラス名とメソッド名を確実に指定できるので、grepで探してそこに行くより確実で処理も早いですね。

## 補完

文法にしたがった補完は `^+Space` ですが、単語レベルの補完 `⌥+/` もあります。

`Map` や `array()` の要素名、SQLで取ってきた結果のカラム名などは文字列だったりすることも多いので、それだと文法上意味のある単語と認識されません。そういうのを補完するのに都合がいいです。押すたびに、同じファイルのより手前に出てきた単語を探してくれます。

(PHPだと、array地獄な某フレームワークとか、全クラスがマジックメソッドに感染している某フレームワークとか、`$repos->getEntity('Hoge')` ってクラス名なのに文字列じゃんって某ORMとか、とか… 単語補完ありがたいです)

キャレット位置より後に向かって探すときは `⌥+⇧+/` です。

## 選択やキャレット移動など

`⌘+⇧+8` で矩形選択モードになります。個人的に矩形選択がないエディタは使わない主義です。

`⌥+↑` と `⌥+↓` が面白くて、「構造的にひとつ広く選択」「その逆」です。キャレット位置→変数名→式→行→構文ブロック→メソッド定義全体、というふうに選択が広がったり狭まったり。名前や式をコピーするのにマウスを使ったりカーソルキーを連打しなくてもいいやつですね。

他にも修飾キーとカーソルの組み合わせで、次の単語まで、とか、行末/行頭とかいけるので、ひととおりやってみたら、ある種の濃いエディタを使っている人も納得だと思いますよ。

## リファクタリングやコード生成など

`^+T` と `⌘+N` 最初はこれだけ憶えておけばOK。やりたいことをポップアップメニューで探して実行。どっちみち名前などを指定するためのダイアログが出てくるので、最初にメニューから選ぶのなんて大したことないですよ。

それでもカーソルキーとかマウスとか遠いよと言うような人は、メニュー項目に付いている番号を打てばいいと思います。

リファクタリング、オブジェクト指向バリバリに思えますが、経験的には、Rename と Extract と Inline をローカル変数やprivateに対してやるのが一番多い気がします。

## バージョン管理

`⌘+9` はいこれだけ。

`git status` (あるいは他のバージョン管理システムの変更確認)した結果が常に見えている状態に。しかもエディタとリアルタイム同期。なにか操作して見えるんじゃなくて、常に見えているということが大事。

もしエディタが狭いと思ったらもういちど同じのを押せば隠せます。

## 最後にこれだけ

`ESC`

あまり意識されてないと思うのがこれ。当然のことながら、ポップアップメニューやダイアログが出てきたときは、`ESC` キーで閉じることができますが、このキー、なんとウィンドウを閉じるキーというよりは、エディタに戻るためのキーと言ったほうが合っているのです。

つまり、ツールウィンドウにフォーカスが移ったとき、マウスに手を動かすことなくエディタにフォーカスを戻せるということ。バージョン管理を意識してコードを書いているときよくある操作は...

編集 → `⌘+9` → HEADとのdiffを見る(選んで`⌘+D`) → `ESC` → 編集再開

早いでしょ。
応用的なCoffeeScriptの書き方を覚えたら、きっと昨日よりもモテるよね？ね？


いつまでたってもイージーな書き方しかできないから、ちゃんとします。
サンプルは公式から取ってきた
[http://coffeescript.org/](http://coffeescript.org/)

## 一行でObjectを書いちゃう
``` coffeescript
$('.account').attr class: 'active'

yearsOld = max: 10, ida: 9, tim: 11
```
↓

``` javascript
$('.account').attr({
  "class": 'active'
});

yearsOld = {
  max: 10,
  ida: 9,
  tim: 11
};
```

## 読みにくいけど三項演算子ほしい

http://coffeescript.org/#conditionals

``` coffeescript
date = if friday then sue else jill
```


↓

``` javascript
date = friday ? sue : jill;
```

じゃっかん読みにくいけど、三項演算子つかいたい。

## forまわり
http://coffeescript.org/#loops

### 一行でforする

``` coffeescript
foods = ['broccoli', 'spinach', 'chocolate']
eat food for food in foods when food isnt 'chocolate'
```

### 一行でforして配列ゲットする

``` coffeescript
countdown = (num for num in [10..1])
```

とか

``` coffeescript
shortNames = (name for name in list when name.length &lt; 5)
```


### `by`なんてやつがある

``` coffeescript
evens = (x for x in [0..10] by 2)
```


### 黒魔術にしか見えないRangeをつかおう

http://coffeescript.org/#slices

``` coffeescript
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]

start   = numbers[0..2]
middle  = numbers[3...6]
end     = numbers[6..]
copy    = numbers[..]
numbers[3..6] = [-3, -4, -5, -6]
```


## 存在演算子

http://coffeescript.org/#operators
↑ここの下の方 The Existential Operator


``` coffeescript
speed ?= 15 #speedがなかったら15が入る

footprints = yeti ? "bear" #yetiがなかったら'bear'が入る

zip = lottery.drawWinner?().address?.zipcode
```

	
## prototypeに追加

http://coffeescript.org/#classes

``` coffeescript
String::dasherize = -&gt;
  this.replace /_/g, "-"
```

↓

``` javascript
String.prototype.dasherize = function() {
  return this.replace(/_/g, "-");
};
```


## Objectから抜き出すやつ(なんて名前？nodeでよく{exec}とかでみかけるやつ)
http://coffeescript.org/#destructuring
↑ここの5つめくらい

``` coffeescript
class Person
  constructor: (options) -&gt; 
    {@name, @age, @height} = options
```

↓

``` javascript
Person = (function() {
  function Person(options) {
    this.name = options.name, this.age = 	options.age, this.height = options.height;
  }
```


## Switchで初期化
http://coffeescript.org/#switch

``` coffeescript
score = 76
grade = switch
  when score &lt; 60 then 'F'
  when score &lt; 70 then 'D'
  when score &lt; 80 then 'C'
  when score &lt; 90 then 'B'
  else 'A'
# grade == 'C'
```

## Chained Comparisons
http://coffeescript.org/#comparisons


``` coffeescript
cholesterol = 127
healthy = 200 > cholesterol > 60 # true
```


## `do`でクロージャをつくろう
(よくわかってない)

## 逆にこの応用はつかわないよ

### 読みにくいので使わない

* `unless` ←個人的に直感的でない
* 後置の`if` ← 単純に読みにくい。「えっ。この行、このタイミングで条件付き？ガチで？」ってなる。


### どこで使うのか検討がつかない
[Destructuring Assignment](http://coffeescript.org/#destructuring)

``` coffeescript
theBait   = 1000
theSwitch = 0

[theBait, theSwitch] = [theSwitch, theBait]
```



## これで完璧！今日から、ドヤ顔してモテよう！

スタバでドヤリングしてCoffeeでも飲もう！

![image](http://img.theinterviews.jp/photos/13/L_ad4896fd59b57f9a18df6e49f71f8cef.jpg)
MySQLでの絵文字（4byte文字）対応（utf8）めもめも


## 問題点
MySQL5.5以前では4byteのutf8文字列を入れることができない
⇒日本での絵文字などはこれにあたる。
⇒他の国の言語も一部ここにあたる

## 現象
実際に入れてみると、4byte文字を境に後ろの文字列が全て消えてしまう。すっぱりと・・・！
`あい[絵文字]うえお`->`あい`
`abc[絵文字]def`->`abc`
どんなに長い文字列も絵文字の部分から後ろが全部切れてしまうorz


## CHARCODE設定
CHARCODE設定をutf-8からutf8mb4に変更


## skip-character-set-client-handshake設定
skip-character-set-client-handshakeを入れるといいよ！という記事があるものの、利用環境によるかもしれない。
SQLインジェクションの脆弱性がある。
利用している環境にあわせてskip-character-set-client-handshakeを使うか、skip-character-set-client-handshakeは使わずに対応していくのがよさそう

## JDBCドライバ(Connector/J)の対応
Connector/Jのバージョン5.1.12より前のバージョンでは???に文字化けしていまう問題がある
⇒バージョンを5.1.12より新しいものにする
`Illegal mix of collations (utf8mb4_general_ci,IMPLICIT) `のエラーが出る。
⇒connectionCollationの設定をする
`characterEncoding=UTF-8`
`connectionCollation=utf8mb4_general_ci`


----
## 参考
### MySQLで4byteのutf8文字列を入れる
- [MySQL に iOS の絵文字（4bytes UTF-8）が入った文字列を INSERT/UPDATE すると絵文字以降の文字がぶった切られる件](http://tetsuwo.tumblr.com/post/35327902400/mysql-ios-4bytes-utf-8-insert-update)
- [mysql に 4バイトutf8 の文字を入れたい](http://netsket-koshiba.blogspot.jp/2012/11/mysql-4utf8.html)
- [UTF-8 エンコードされた絵文字を MySQL / JDBC で取り扱うには？](http://blog.k11i.biz/2012/11/utf-8-mysql-jdbc.html)
- [UTF-8で4バイトになる文字](http://www.softel.co.jp/blogs/tech/archives/596)


### JDBCドライバ(Connector/J)でutf8mb4
- [MySQL Bugs: #54175: Connector/J cannot handle supplemental characters supported by utf8mb4](http://bugs.mysql.com/bug.php?id=54175)
- [JavaプログラムからMySQLに4バイトのUTF-8文字を放り込んでみる](http://d.hatena.ne.jp/hhelibex/20120111/1326291308)
- [UTF-8 エンコードされた絵文字を MySQL / JDBC で取り扱うには？](http://blog.k11i.biz/2012/11/utf-8-mysql-jdbc.html)
- [Error in running Java Code code ( Unknown character set: 'utf8mb4' )?](http://stackoverflow.com/questions/9879864/error-in-running-java-code-code-unknown-character-set-utf8mb4)

### skip-character-set-client-handshakeパラメータについて
- [2007/04/23-01、skip-character-set-client-handshake について](http://goungoun.dip.jp/app/fswiki/wiki.cgi/debianetch?page=2007%2F04%2F23-01%A1%A2skip-character-set-client-handshake+%A4%CB%A4%C4%A4%A4%A4%C6)
- [mysqlでskip-character-set-client-handshakeはもう使わないほうがいいと思われ](http://blog.everqueue.com/chiba/2009/08/27/291/)
VMイメージ内でMACアドレスとインターフェース名(eth0とか)の関係が固定化されるのを防ぐ

今時のLinuxはudevが親切にもネットワークインターフェース名とMACアドレスの関係を固定化してくれるんだが、この機能って同じディスクイメージの複製が使いまわされることが前提の仮想マシンを前提にすると非常に邪魔になる。具体的にはコピーしたイメージ上ではeth0が出来なかったり、eth1になっちゃったりとか…。

このMACアドレスの固定化設定は`/etc/udev/rules.d/70-persistent-net.rules`というファイルにシェルスクリプトして保存されている。なのでこれを削除してやれば次回起動時は期待通りにeth0が使えるようになる、のだがその際にまたこのファイルが再生成されてしまうので非常に邪魔！

というわけでVMイメージの場合は消すだけじゃなく、以下のようにファイルが出来るべき場所にディレクトリを作っておくことでファイル作成が出来ないようにして防ぐってことをしている。

```sh
rm -f /etc/udev/rules.d/70-persistent-net.rules
mkdir /etc/udev/rules.d/70-persistent-net.rules
# 後で見た人がこのディレクトリの意味で悩まないよう、メモを残しておく
echo https://qiita.com/kawaz/items/dc33294c907755e9ee44 >/etc/udev/rules.d/70-persistent-net.rules/README
```

一応これで良い感じにMACアドレスの固定化を避ける事が出来るようになる。
元に戻したければこのディレクトリを削除してやれば良い。

```
rm -rf /etc/udev/rules.d/70-persistent-net.rules
```

もしもっとスマートな方法があるよ、ってのがあれば教えてください(^^;
sshごしのvimからクリップボードにコピーする


<もっと評価されるべき>

## 参考サイト

* 受信側（手元のマシンに入れるスクリプト）
	* http://yskwkzhr.blogspot.jp/2011/04/copying-remote-screen-paste-buffer.html
* 送信側（ssh先のマシンに入れるスクリプト）
    * http://blog.remora.cx/2011/08/yank-to-local-clipboard-from-vim-on-screen.html


## 必要な作業

* clipboard_text_listerner.pl
	* TCPで受け取った情報をクリップボードに突っ込むスクリプトです
	* cloneして起動します

			git clone git://github.com/yoshikaw/ClipboardTextListener.git
			cd ClipboardTextListener
			./clipboard_text_listener.pl -key パスワード文字列 -encoding utf8 -debug 2
* 送信用vimスクリプト
	* netcatを使って、TCPでvimのregisterの中身を送信するスクリプトです
		* ncコマンドがない環境では動きません
	* .vimrcにコピペします
		* http://blog.remora.cx/2011/08/yank-to-local-clipboard-from-vim-on-screen.html
	* ~/.exchange.key にパスワード文字列を保存しておきます
	* 普通にyankした後、\<Leader\>yを押すと、送信されるはずです！
		* 成功していれば、下記のようなメッセージがclipboard_text_listener.plのコンソールに出るはずです

				2013/04/11 12:33:09 TextListener[36155]: (127.0.0.1:53529) *** RECEIVE DATA *** (166/3)
消したはずのリモートブランチがローカルで表示されるので削除する

`git branch -a`を実行したら、消したはずのリモートブランチが居ることがある。

自分で`git push origin :hoge-br`で消した奴は出てこない。
他の人が消したか、あるいはgithubの機能で削除したとき、この現象が起きるようだ。
鬱陶しいので消したい。
どうすればいいか。

## 確認する

```
$ git remote show origin
```

このコマンドを打つと、現在のブランチの状態的なものが確認できる。
問題ないブランチ（現在利用されているとか、削除されていないもの）は、「tracked」と表示される。
対して、消えない腐ったブランチは「stale」と表示されるはず。

## 削除する

staleなブランチを消すにはどうしたらいいか。
削除するには`prune`を使う。

```
$ git remote prune origin
```

「stale」の奴らを一掃してくれる。
消されるブランチを事前に確認したい人は`dry-run`を利用しよう。

```
$ git remote prune origin --dry-run
```

これでスッキリ。

## 参考記事

http://blog.s21g.com/articles/992
※この記事だと`dry-run`で実行されてしまった、と書いてあるが、自分が試したときはちゃんと確認だけ実行された。
HTML Purifier を使って html を消毒する

HTML の入力を許容するケースでの、 XSS 対策として。
徳丸本 P117 に紹介されている HTML Purifier を利用。

``` html_purifier.php
<?php
require_once('$PATH_TO_LIBRARY/HTMLPurifier.includes.php');
use HTMLPurifier;
use HTMLPurifier_Config;

function sanitize($tainted_html) {
  $config = HTMLPurifier_Config::createDefault();
  $config->set('Cache.SerializerPath', $PATH_TO_TEMPORARY_DIR);
  $purifier = new HTMLPurifier($config);
  return $purifier->purify($tainted_html);
}
```
バージョンは Version 4.5.0 でした。

Cache.SerializerPath には、書き込み権限のあるディレクトリを指定すること。
キャッシュを利用したくない場合は、 Cache.DefinitionImpl に null を指定することもできるが、パフォーマンスが落ちるとのこと。

その他細かい設定は http://htmlpurifier.org/live/configdoc/plain.html を参照。


include には、 HTMLPurifier.auto.php を使うこともできるけど、
オペコードキャッシュ利用してるなら HTMLPurifier.autoload.php でなくHTMLPurifier.includes.php 使ってもいいんじゃないかな。

HTMLPurifier_Bootstrap::registerAutoload とか泣ける。。。


### Link
* HTML Purifier http://htmlpurifier.org/
* [体系的に学ぶ 安全なWebアプリケーションの作り方(Amazon)](http://msm.to/48M8ItL)
* [XSS Filter Evasion Cheat Sheet](https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet)
PyCharm での type hinting を使いこなす 

PyCharm を使うと、 docstring のコメントを元に型推論してくれます。

```python
def foo(x):
    """
    :rtype: list of str
    """
    return x

def bar(x):
    a = foo(x)
    a[0].  # <- この時点で文字列のメソッドが候補になる
```

##docstring

Sphinx の書き方と Epytext の書き方を受け付けるようですが、 Python では Sphinx の方が一般的なのでそれに習いましょう。

```python
def repeat(x, y):
    """
    :param str x: value to repeat
    :type  y: int
    :param y: number of repeat
    :rtype:   str
    :return:  repeated string
    """
    return x * y
```

引数は `:param 型 名前:` という書き方でもいいですし、 `:type 引数名: 型` という書き方もできます。
戻り値は `:rtype:` で書きましょう。

##型宣言

`StdlibTypes2.properties` というファイルをみると書き方が大体わかります。このファイルは Mac だと `/Applications/PyCharm 2.7.2 EAP.app/helpers` というディレクトリにあります。

いくつか抜粋してみます。

```python
__builtin__.locals = \
  :rtype: dict of (string, unknown)

__builtin__.filter = \
  :type function_or_none: collections.Callable or None \n\
  :type sequence: collections.Iterable of T \n\
  :rtype: list of T \n\

__builtin__.enumerate.__init__ = \
  :type iterable: collections.Iterable of T \n\
  :type start: int or long \n\
  :rtype: enumerate of (int, T) \n\

__builtin__.enumerate.next = \
  :rtype: (int, T) \n\

__builtin__.dict.__init__ = \
  :type seq: collections.Iterable of (T, V) \n\
  :rtype: dict of (T, V) \n\

__builtin__.dict.__getitem__ = \
  :type y: T \n\
  :rtype: V \n\

__builtin__.dict.items = \
  :rtype: list of (T, V) \n\

```

複合型は、タプルの場合のみ `(int, str)` のような書き方ができて、それ以外の場合は `dict of (T, V)` のように `of` を使って表すようです。

型引数は T だけじゃなくて任意の大文字一文字が使えそうです。

一般的な型を返す時は `collections` にある ABC を `of T` の形で使えばよさそうです。

複数の方を受け取れる場合は、 ``int or None`` の用に `or` でつなげるようです。

##その他の変数への type hinting

```python
#: :type: int
x = unknown()
```

のようにコメントをつけると hinting できます。でも、

```python
#: ????
a, b = unknwon()
```

この場合にどうやって hinting すればいいのかまだ判りません。
一回タプルで受け取ることもできますが、不恰好なので、関数側にちゃんと :rtype: を定義するのがよさそうです。
スゲい簡単なPerl入門 - 7thDay　リファレンス　リファレント　デリファレンス

# リファレンス
 
* リファレンス: 別のデータを指すデータのこと
* リファレント: リファレンスに指されたデータのコト
* デリファレンス: リファレントを調べること

では
referece: ref
referent: ret
dereference: der
としたとき、

ref -> ret
der: check ret.

こんな感じ。イマイチわかりにくいか...
というわけで実際のコードをみましょう。


````arrayRef.pl
#! /bin/perl -w
#
# arrayRef.pl 配列変数へのリファレンスを作る
#
# sample file name : arrayRef.pl
@month = ('January', 'February', 'March', 'April','May','June','July', 'August', 'September', 'October','November','December');
$refMonth = \@month;
print "refMonth: $refMonth -> @$refMonth \n";
````

ここでは一気にデリファレンスが行われています。

````arrayRef.pl
$redMonth = \@month

````

$refMonthがリファレンス。\@monthがリファレントになります。
リファレンスは基本スカラー変数になります。リファレントが配列でもです。

デリファレンスは以下の様に行われています。

````arrayRef.pl
@$refMonth
````

デリファレンスは、リファレントがスカラー変数であれば、$$hoge のように$を先頭につけ、
リファレントが配列であれば、@$hogeの様になります。（リファレンスは基本的にスカラー変数）


上記ファイルの実行結果を見て行きましょう。

````
$ perl arrayRef.pl
refMonth: ARRAY(0x6bc3040) -> January February March April May June July August September October November December
````

$refMonth が ARRAY(0x6bc3040)と表されています。
\@monthは、@monthの要素がすべて表示されています。

リファレンス自体は「参照」であり、リファレントのデータ自体を指し示しません。
デリファレンスはリファレントそのものを指し示します。
その為、こういう差が生まれるようです。
Node.js + express で、routing コールバックから app を参照する

```js:route/hoge.js
exports.hoge = function(req,res){
  gv = app.get('globalVar');
};
```

のように書くと
`ReferenceError: app is not defined` とエラーが出ます

なので app.js の一番最後とかに

```js:app.js

module.exports = app;
```

と書いておいて、参照する側の js で

```js:route/hoge.js

var app = require('../app');
```

と呼び出します。

※出典:[Express: accessing app.set() settings in routes(stackoverflow)](http://stackoverflow.com/questions/14822584/express-accessing-app-set-settings-in-routes)
スマートフォンでの絵文字のコードマッピングはこんな感じ？

1年前の記事だけど、[スマートフォンブラウザの絵文字事情](http://tech.dclog.jp/2012/02/blog-post.html)を読んだ感じ次のようになるのかなぁ。

|   | OS            | コード                                      | 備考                        |
|---|---------------|---------------------------------------------|-----------------------------|
| 1 | iOS 4以前     | Softbankの独自コード（Unicodeの私用領域）   |                             |
| 2 | iOS 5以降     | Softbank、auともにUnicode 6.0の絵文字コード | ただし[1]も表示可能         |
| 3 | Android 3以前 | Googleの独自コード（Unicodeの私用領域）     | 端末が独自で表示してる      |
| 4 | Android 4以降 | Unicode 6.0の絵文字コード                   | 端末によっては[3]も表示可能 |

あまりこれだ！ってまとまった情報が見つけられず、かといって個別に調べるには至ってないので間違ってるかもしれない。もし間違ってたらご指摘ください、もっといい情報がある場合にも教えていただけると助かります。
git-svnでディレクトリ削除時に空のディレクトリが残る場合の対処

## dcommit 時に --rmdirオプションをつける

ディレクトリを削除したリビジョンが含まれるものをdcommitするときに--rmdirオプションを使う

```
% git svn dcommit --rmdir
```


## すでにdcommitしている状態の時

すでにコミットしている場合は、、git-svnじゃどうにもいかないようなので、素直にSVNのコマンドで削除する。

```
% svn delete -m "delete empty dir" https://URL/hoge/EMPTY_DIR
```

他に方法があれば教えて下さいー！
IntelliJ IDEAのIdeaVimでAutopop Code CompletionにESCキーを取られにくくする設定

IntelliJ本当に素晴らしいIDEです。更にIdeaVimもVimのキーバインドをそこそこ再現してくれていてかなり良い感じです。
ただ、たまにESCキーがうまく動かない時があります。それはAutopop Code Completionという自動補完機能のツールチップを消す機能の方にESCキーを取られてしまうからでした。

それを直すためには、
Preference > Editor > Code Completion > Autopop code completion in (ms) :
という設定項目を
0から1000などに変更すればこの問題を大体解決することができます。
そもそもこのオプションをオフにしてしまうのもひとつだと思います。

以上、健忘録です。
スゲい簡単なPerl入門 - 6thDay /usr/bin/perl  perl ruby の一行の謎目

# Perlのコードをかくとき、だいたいいつもこんなものを記述してませんか？

````hoge.pl
#!/usr/bin/perl -w
````

これ**" #! "** は**『シェバング』** といい **「シェルなどインタプリタを起動するためのもの」**です
また **この行全体** を **『シェバング行』** と言います。
語源は "Shell Bang", "Sharp Bang"などがあるようです。
ちなみに、"Bang"は俗語で"!: イクスクラメーションマーク"の意味をしています。

````
./hoge.pl
````

でもhoge.plには、シェバング行が書かれているので、
実際にはこういう命令になっています。

````
/usr/bin/perl -w hoge.pl
````

よくシェバング行は「2行目以下のスクリプトに対して適応する」とく記述がされますが、
つまりは、そのシェバングが書かれたファイルのスクリプトの実行コマンドであると考えて良いかと思います。

シェバングに付けるパラメーターはこんな感じ。まぁそれぞれの言語の実行コマンドをものと同様ですね。

````
- w : アラートを出す
- d : デバッグモードにする
- c : 文法チェック
- v : バージョンの表示、スクリプトの実行はされない
````

ここらまで見ていて代替分かったかと思いますが、シェバング行とはつまり、コマンドをファイル内に書き込んでいる　という意味合いを持っています。
なので、シェバングに書いてある内容はコマンドラインでも当然再現出来るわけです。


ref) http://x68000.q-e-d.net/~68user/unix/pickup?%A5%B7%A5%A7%A5%D0%A5%F3%A5%B0


余談：
通常コンピューターはマシン語のみを解釈し、実行します。
ファイルを丸々マシン語になおすことをコンパイルと呼び、C言語などで行われている方式です。
Perl, Puby, shなどは、インタプリタ言語、逐次翻訳していきます。
これがシェバングに関係しているかなって思ったりもしましたが、そうでもないかもしれませんね。(；´Д｀)
Alloy.createController でコントローラー指定する際のパスに注意

Android対策じゃぁぁぁ！って言って、`Alloy.createController`で指定するコントローラーを絶対パスで指定すると、iOSの実機で死ぬ。AndroidとiOSのシミュレータは大丈夫。

**これは死ぬ**

```javascript
var ctrl = Alloy.createController('/rider/detail/rider_detail_info_button', {});
```

**これで幸せ**

```javascript
var ctrl = Alloy.createController('rider/detail/rider_detail_info_button', {});
```
switch文の使いどころの悩み

PHPのswitch文は悪名高い`==`演算子による比較を行うので、気を付けて使わないとバグを埋め込みやすい。

```php
<?php
switch (true) {
    case 0:
        echo '数字の0';
        break;
    case '0':
        echo '文字列の0';
        break;
    case '0.0':
        echo '文字列の0.0';
        break;
    case true:
        echo '真偽値のtrue';
        break;
}
```

↑は`文字列の0.0`を出力する。PHPを知らない人が見たらPHP嫌いになると思う。

なので、基本的にはswitchは使わないようにして、使いたくなるような場面があれば、連想配列を使って辞書を作るか、命名規則をうまく作って可変関数にするか、ポリモーフィズムで解決するか考えた方がいい。

ただ、個人的には、OR条件文の代替としてswitch文を使うことがたまにある。比較対象の変数の型が固定であれば…まあ何とか使えるだろうか。

```php
<?php
if ($_GET['hoge'] === 'foo' || $_GET['hoge'] === 'moo' || $_GET['hoge'] === 'soo') {
  //...
} elseif ($_GET['hoge'] === 'baa' || $_GET['hoge'] === 'buu') {
  //...
}
```

↑を↓みたいに書く。ちょっとすっきりする。

```php
<?php
switch ($_GET['hoge']) {
  case 'foo': case 'moo': case 'soo':
    //...
    break;
  case 'baa': case 'buu':
    //...
    break;
}
```

in_array()を使う方法もある。in_arrayなら`===`による比較をオプションとして指定できるので、安全かもしれない。

```php
<?php
if (in_array($_GET['hoge'], ['foo', 'moo', 'soo'], true)) {
  //...
} elseif (in_array($_GET['hoge'], ['baa', 'buu'], true)) {
  //...
}
```