OmniAICreator/Qiita-1.07M huggingface dataset:
L被覆(2013.11.24の過去問？)

1日1個 @nabetani さんの作った問題を解く、どう書くAdventCalendarの7日目です。

今日は本戦( http://atnd.org/events/45016 )がありますので、その参考問題を解きます。過去問じゃないですけど！ 問題は http://nabetani.sakura.ne.jp/hena/ord16lcove/ にあります。

```hs
module Doukaku.LCover (solve) where
import Data.List.Split (splitOn)
import Data.Char (ord)
import Data.Maybe (isJust)

type Dots = [(Int, Int)]
type LCover = ((Int, Int), (Int, Int), Int, Int)

boardsize :: Int
boardsize = 10

solve :: String -> String
solve = show' . minimum' . map minArea . allDirections . parse
  where
    allDirections :: Dots -> [Dots]
    allDirections = flip (scanr ($)) $ replicate 3 turnLeft
    minimum' xs = let xs' = filter isJust xs
                  in if null xs' then Nothing else minimum xs'
    show' Nothing = "-"
    show' (Just x) = show x

parse :: String -> Dots
parse = map pair . splitOn ","
  where
    pair (x:y:_) = (digit x, digit y)
    digit = (subtract (ord '0')) . ord

turnLeft :: Dots -> Dots
turnLeft = map (\(x, y) -> (boardsize - 1 - y, x))

area :: LCover -> Int
area ((x1, x2), (y1, y2), w, h) = (x2 - x1 + 1) * (y2 - y1 + 1) - w * h

isCovered :: Dots -> LCover -> Bool
isCovered ds ((x1, x2), (y1, y2), w, h) = all inIt ds
  where
    inIt (x, y) = x1 <= x && x <= x2 && y1 <= y && y <= y2
                  && (x > x1 + w - 1 || y > y1 + h - 1)

minArea :: Dots -> Maybe Int
minArea ds = minimum' . map area . filter (isCovered ds) $ ls
  where
    ls = [((x1, x2), (y1, y2), w, h) | x1 <- [0..x2], w <- [1..x2 - x1],
                                       y1 <- [0..y2], h <- [1..y2 - y1]]
    x2 = maximum . map fst $ ds
    y2 = maximum . map snd $ ds
    minimum' [] = Nothing
    minimum' xs = Just . minimum $ xs
```

左上が欠けているL字被覆の最小面積を求めるロジック`minArea`を実装し、90度ずつ回転させて4回チャレンジさせています。`minArea`は総当りで、全領域を被覆できているL字のうち最小の面積となるものを返しています。昨日解いたテトロミノのように余白をカットするアプローチをとってしまうと、左上の角が埋まっている場合に切り詰めた領域内ではL字が作れず苦しい場合分けを強いられそうなので、切り詰めませんでした。実装時間は1時間をちょっと超えるくらいだと思います。

後、組み込みの`minimum`は`Maybe Int`に適用できるため型チェックが通ってしまって初めハマったのですが、この実装では`Nothing`が`Just x`よりも小さいので今回の目的には合いません。`Just x`を優先するような`minimum'`を実装して使っています。

http://qiita.com/Nabetani/items/7be4bc2a3514bbfbfc15 に他の方の回答もありますので、見ると参考になるでしょう。
習作、Pythonで数字あてゲーム

習作、標準入力から数字当てゲーム！

```py:test.py

#! F:/Python/python.exe
# -*- coding: utf-8 -*-

import random
import re

# 桁数
SCALE = 4

# ランダムな重複なしの数字の配列を返す
def GetRandomNumbers(place):

	seed = range(0, 10)
	random.shuffle(seed)

	result = ""

	for i in range(0, place):
		result = result + str(seed.pop())

	return result

# 解答と回答を比較
def CompareSolAns(solution, answer):
	h = 0
	b = 0
	
	for sIndex, sValue in enumerate(answer):
		for aIndex, aValue in enumerate(solution):
			if sValue == aValue :
				if sIndex == aIndex :
					h += 1
				else :
					b += 1
	
	return {"H":h, "B":b, "A":answer}


# 解答を生成
solution = GetRandomNumbers(SCALE)

# 正解までループ
count = 0
history = []
while True :
	# 回答入力カウント
	count += 1
	
	# 解答の入力
	inputStr = "Turn "+str(count)+", Input Number:"
	inputStr = inputStr.decode('utf-8')
	ans = raw_input(inputStr)
	
	# 正規表現で入力をチェック
	checkMatch = re.match(r'^\d{'+str(SCALE)+'}$', ans)
	
	# 入力が正規表現通りでなければ、やり直し
	if checkMatch is None :
		print u"Bad Input"
		continue
	
	# 解答を正解と比較
	result = CompareSolAns(solution, ans)
	
	# 正解の場合は終了
	if result["H"] == SCALE:
		break
	
	# 不正解の場合は結果をスタックして表示し、ループ
	history.append(result)
	
	# 結果の表示
	print('------------------------------')
	for i, val in enumerate(history) :
		print "Turn "+str(i+1)+"\t"+val["A"]+"\t"+str(val["H"])+"H\t"+str(val["B"])+"B\t"
	print('------------------------------')

print unicode("****** Exactly! ****** "+str(count)+" turn you are seikai")


```
Go 用 web ツールキット Gorilla に関するメモ


Web 関連のユーティリティ群。フレームワークではありません。
http://www.gorillatoolkit.org/

## [gorilla/context](http://www.gorillatoolkit.org/pkg/context)

リクエストに紐づけてキーと値を放り込んでおける。
自分で `context.Clear()` して消す。`ClearHandler` や `mux` などにまかせることも。

## [gorilla/mux](http://www.gorillatoolkit.org/pkg/mux)
ルーティング。名前は HTTP request multiplexer から。けっこうリッチでいろいろやってくれる。一番よく使いそう。

## [gorilla/reverse](http://www.gorillatoolkit.org/pkg/reverse)

ルーティングに使うユーティリティ。正規表現を使って URL からパラメータを抽出したり、その逆で正規表現にパラメータを渡して URL を作ったり。

## [gorilla/rpc](http://www.gorillatoolkit.org/pkg/rpc)

RPC。できるだけ RESTful に行きたいので、当面使わないかも。

## [gorilla/schema](http://www.gorillatoolkit.org/pkg/schema)

フォームから来たデータ（`map[string][]string` 型）で任意の struct のプロパティを埋める。

ちなみに `map[string][]string` は string -> string の slice の map。ネストしたデータの場合、キーは `Phones.0.Label` のように `.` で区切られている必要あり。

## [gorilla/securecookie](http://www.gorillatoolkit.org/pkg/securecookie)

Cookie の改変防止と暗号化。

## [gorilla/sessions](http://www.gorillatoolkit.org/pkg/sessions)

いわゆるセッション。設定するには明示的に `Save()` が必要。flash 機能もあり。encoding.gob を使っている。`gob.Register()` で任意の型のポインタを登録可能。
Servoをビルドしてみる

![スクリーンショット 2013-12-07 11.22.38.png](https://qiita-image-store.s3.amazonaws.com/0/25489/ffcfd32d-6140-5156-a068-18a375d84260.png)

## はじめに

ServoとはMozillaやサムスンがバックアップしている関数型言語Rustで作成されているHTMLレイアウトエンジンです。

今日は、RustのキラーアプリであるServo Layout Engineをビルドして使ってみます。

関数型言語で作っているのできっと、型安全でセキュリティホールが少ないブラウザになっていくのでしょう。

## servoのページ

https://github.com/mozilla/servo

githubにServoはあります。あらかじめ、Rust0.8がインストールされていましたけど、Rust自体もServoに含まれているようでした。

## ビルド

環境は osx mercurial, homebrewです。

まずは、autoconf213.rbとautomakeとかのツールをインストール

```
brew install https://raw.github.com/Homebrew/homebrew-versions/master/autoconf213.rb
brew install automake libtool pkg-config
```

clone

```
git clone https://github.com/mozilla/servo.git
```
servoのビルド

```
cd servo
mkdir -p build && cd build
../configure
```
configureは時間がかかるので寝て待ちましょう。

暇なので、コマンドライン引数の翻訳とかしてみます。

### コマンドライン引数

* ```-p INTERVAL```  プロファイラをオンにし、コンソール  ```INTERVAL``` 秒ごとに情報をダンプします
* ```-s SIZE``` レンダリングのためのタイルサイズを設定します。デフォルトは512です

* ```-z``` すべてのグラフィック出力を無効にします。JS/レイアウトのテストを実行するのに便利です


### キーボードショートカット

* ```CTRL-L```新しいURLを参照するためのダイアログを開きます（現在はMacのみ）
* ```Ctrl - - ```ズームアウト
* ```Ctrl - =```でズーム
* ```Backspace``` ヒストリを戻る
* ```Shift - Backspace``` ヒストリを進む
* ```ESC``` サーボを終了

キーボードショートカットも翻訳してみた。しかしまだなんかやってます。
記事も書き進めてっと、あ、終わった。

終わったら、makeです。servoのページには```make && make check```と書いてあったのですが、チェックも長そうだから、```make check```はやらなくてもいいんじゃないかな。

```
make
```

rustのビルドが始まったぞ、、、。長そうだ。2013-10-28のrustを使っているようです。

```
extracting rust-stage0/lib/libstd-6c65cf4b443341b1-0.9-pre.dylib
```

とか出てるので、すでに0.9に対応しつつあるのかな？
LLVMのビルドしてるし、大分かかりそうだ。時間も記録しておけば良い気もするけどまぁ、いいや。llvmが終わったら、rustをビルドして、終わったらservoのライブラリを１個ずつビルドして最後にservoのビルドをして完了ってなるんでしょう。たぶん。

## 実行

もうとりあえず、servoの実行をしてみます。

```
./servo ../src/test/html/about-mozilla.html
```

ちゃんと見れますね。他にもテストファイルが沢山あるのである程度描画出来ているっていう段階のようです。

## make check

とりあえず、チェックもしておきましょう。

## Android のビルド

Android用にビルドも出来るみたいです。やってませんけどandroid-sdkとandroid-ndkがあればビルド出来るようです。

```
git clone https://github.com/mozilla/servo.git
cd servo
mkdir -p build && cd build
../configure --target-triples=arm-linux-androideabi --android-cross-path=<Android toolchain path> --android-ndk-path=<Android NDK path> --android-sdk-path=<Android SDK path>
make
```
4.59から導入されたCSRF対策を使ってみる

現時点で最新のMojolicious「 **4.59** 」ではCSRF対策のメソッド諸々がようやく実装されました。以下Changesより引用。

> - Added CSRF protection support.
> - Added csrf_protect method to Mojolicious::Validator::Validation.
> - Added csrf_token attribute to Mojolicious::Validator::Validation.
> - Added csrf_token helper to Mojolicious::Plugin::DefaultHelpers.
> - Added csrf_field helper to Mojolicious::Plugin::TagHelpers.

Mojoliciousデフォルトのセッションを使うのでPlack::Middleware::Sesssionその他を使っている場合は有効にならないケースがありますが、カジュアルにCSRF対策をするにはよいでしょう。また内部のコードを追えば独自のCSRF-Protectionなヘルパーなどを自作するキッカケになるかもしれません。今回はMojolicious::Liteで試せるサンプルをつくってみました。

ポイントは..

- テンプレートの中で `csrf_token` ヘルパーメソッドを呼び出してhidden-typeなフォームに入れる
- ちなみにTagヘルパーを使う場合は `csrf_field` で一発
- Mojolicious::Validator::Validationの `csrf_protect` メソッドでtokenのバリデーションを行う
- セッション `$self->session->{csrf_token}` にtokenが収められているのでそれを参照して独自にチェックもアリ

って感じです。ではサンプルのコードをば。ちょいと冗長に書いてある部分あるっす。

```perl:前半のコード

#!/usr/bin/env perl
use Mojolicious::Lite;
use Mojolicious::Validator;
use Mojolicious::Validator::Validation;

get '/' => sub {
    my $self = shift;
    $self->render('index');
};

post '/post' => sub {
    my $self = shift;
    my $validation = $self->validation;
    my $messages;
    if ($validation->csrf_protect->has_error('csrf_token') ) {
        push @$messages, 'Invalid CSRF Token!';
    }
    if ($validation->required('text')->has_error('text') ) {
        push @$messages, 'Text is required!';
    }
    $self->stash->{messages} = $messages;
    $self->render('result');
};

app->start;

__DATA__
```

```html:後半のコード

@@ index.html.ep
% layout 'default';
<form action="/post" method="post">
  <input type="text" name="text" placeholder="Text" />
  <input type="hidden" name="csrf_token" value="<%= csrf_token %>" />
  <input type="submit" value="Submit" />
</form>

@@ result.html.ep
% layout 'default';
% if ($messages) {
<b>Error!</b>
<ul>
% for my $message (@$messages) {
  <li><%= $message %></li>
% }
</ul>
% }else{
<b>Success!</b>
% }

@@ layouts/default.html.ep
<!DOCTYPE html>
<html>
  <head><title>How about CSRF?</title></head>
  <body><%= content %></body>
</html>

```

テンプレートのCSRF-tokenのinputタグの部分を削除するなどいじってみると挙動が変わって面白いですよ！
git commit時に自動的に行末の空白を修正する

コーディング規約で、行末の空白(trailing whitespace)が禁止されていることがあります。
githubでコードレビューをする場合、diffで行末にスペースがあってもハイライトされたりしないため、これを防ぐのは難しいです。

## pre-commit hook
そこで、以下のスクリプトを[pre-commitフック](http://git-scm.com/book/ja/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF)にすると、コミットする際に変更した行から行末のスペースが自動的に取り除かれるため、行末の空白のある行が新たに追加されるのを防ぐことができます。

そのコミットで変更した行のみに適用されるため、余計な行を修正してdiffが煩雑になることはありません。

```bash
#!/bin/sh

if git-rev-parse --verify HEAD >/dev/null 2>&1
then
  against=HEAD
else
  # Initial commit: diff against an empty tree object
  against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi

for diff in `git diff-index --check --cached $against -- |
  grep 'trailing whitespace' | sed 's/: trailing whitespace.//'`
do
  file=`echo "$diff" | sed 's/:[^:]*$//'`
  line=`echo "$diff" | sed 's/^[^:]*://'`

  sed -i '' -e "$line"'s/ *$//' "$file"
  git add "$file"
done

exit 0
```

## インストール方法
.gitのあるディレクトリで以下のコマンドを実行してください

```bash
curl -o .git/hooks/pre-commit https://gist.github.com/k0kubun/7835814/raw
chmod +x .git/hooks/pre-commit
```
Mac上でRoRのアプリを作ってHerokuにアップするまでのイロイロ（追記しながら進めます）

最近のRoRの事しらない（2.2までしか知らん）人が弄ってみてつまづいた事とか書いていく。


```bash
 $ ruby --version
ruby 2.0.0p247 (2013-06-27 revision 41674) [universal.x86_64-darwin13]
 $ gem install rails
Fetching: i18n-0.6.9.gem (100%)
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory.
```

sudoしていいの？と思ったけど一応調べた。
http://stackoverflow.com/questions/14607193/installing-gem-or-updating-rubygems-fails-with-permissions-error

「rbenvとかRVMとか使うのを強く推すけど？」か。なるほどー。
http://qiita.com/skinoshita/items/2cf0c27a6ff4f0602568
こちらを参考にアクションしてみる。元々入っているRubyさんはどうしたらいいんだろ。

最後、Herokuに上げたいのでHeroku互換のRubyを入れようと思ったら、gemで指定できると知る。
https://blog.heroku.com/archives/2013/6/17/ruby-2-default-new-aps
によると、新しいアプリはバージョン2系で動いている様子。じゃぁ、2で入れようと決めた。

```bash
$ rbenv install 2.0.0-p247
$ which ruby
/Users/xxx/.rbenv/shims/ruby
$ which gem
/Users/xxx/.rbenv/shims/gem
$ gem install rails
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.0.0 directory.
```

あれ。またうまくいかない。別のパスに入るんじゃ無いん？
http://qiita.com/emadurandal/items/a60886152a4c99ce1017
のお世話になる。最近のqiitaの引っかかり率異常。超助かる。
使うバージョンを指定しないといけないんだ。下記のように。

```bash
$ rbenv global 2.0.0-p247
$ rbenv versions
   system (set by /Users/ms2/.rbenv/version)
 * 2.0.0-p247
```

あと、直接インストールしない方法が先のリンクで紹介されていたので、従って入れる。言われた通りにやっているとWebrick起動まではOKなはず！

bundle exec と頭に付けるのを忘れてしまうのでそれだけは慣れが必要かも知らん。

GemFile.lock等の扱いが気になったら下記を見るべし。
http://qiita.com/tnoda_/items/a04e761d595a742fcdca

とりあえずScaffoldは下記なんかをサラッと眺めると出てくるのでやってみる。
http://www.slideshare.net/yizawa/getting-started-with-ror4-bs3

アプリができたら一回デプロイしてみる。
http://qiita.com/tstomoki/items/cd2391e028dc44dd6f40
gemの記述をpostgres用に入れ替えてみるも、途中でエラー。何かコンパイル失敗している模様。
mkmf.log
を見ると、postgresql用のヘッダが見当たらないからエラーの様子。
brew install postgresql
したらオッケ。

あれ？参考にした記事はpostgres用のdatabase.ymlを作っていない。別の情報をあたる。
http://yuriponx.com/2012/05/08/heroku%E3%81%A7rails3-2%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99/
こちらを参考にdatabase.ymlを書く。
herokuの管理画面からpostgresの情報を見に行くのも良いと思う。

でもって改めてpushしたらmigrate！

```bash
$ heroku rake db:migrate
WARNING: `heroku rake` has been deprecated. Please use `heroku run rake` instead.
```

警告出るけどDBは構築してくれる。あとは作ったアプリにアクセスするんだ！！

ちなみにユーザーやパス情報が合っていても権限が無いような下記のエラーが最初の頃出ていたようなので、接続できるようになるまでタイムラグがあるのかも知れない。未確認。

```bash
FATAL:  permission denied for database "postgres"
DETAIL:  User does not have CONNECT privilege.
```
エラトステネスで素因数分解

```ruby:prime.rb
puts "xを素因数分解します。"

while true
  print " x > "
  x = gets.to_i #上限
  if x >= 1
    break
  end
end

a = []
for i in 2..x
a << i
end


k = 0 
while k < Math.sqrt(x) 
  i = 1   
  while i < a.length  
    if a[i] % a[k] == 0 && i != k    
      a.delete_at i
    end
    i += 1
  end
  k += 1
end

print x.to_s + " = 1"
for i in 0..(a.length-1)
  count = 0
  while true
    if (x % a[i]) == 0
      x = x / a[i]
      count += 1
      next
    end
    if count > 1
      print " * " + a[i].to_s + "^" + count.to_s
    elsif count == 1
      print " * " + a[i].to_s
    end
    break
  end
end
```

前回投稿の篩を使っただけ
Emacsが大好きな僕がIntelliJ IDEA導入時に行ったkeymap設定の紹介

emacs大好き！　改め、

emacsの **_keymap(キーバインド)_ が** 大好き！

な僕がIntelliJ IDEA導入後に行ったkeymap設定をご紹介します(*´ڡ`●)

# 僕のエディター遍歴

※2013年12月現在、エンジニア歴（＝社会人歴）は5年です。

||エディター|開発言語|
|:--|:--|:--|
|1年目|emacs|PHP|
|2～3年目|vimとemacsをウロウロ|PHP|
|4年目|Eclipse|Java|
|5年目|IntelliJ IDEA|Java|

プログラミングで初めて使った（※1）エディターがemacsでした。

最初はemacs特有の```Ctrl + xx```、```Alt + xx```系の操作に四苦八苦しながらも、慣れるともう、Ctrlキー（※2）が左手小指の定位置になっていました。

というわけで、根っからのemacs厨（※3）になった僕はJavaを書くことになったときも、Eclipseにemacsの一部のkeymapを移植して使っていました。

PHPの開発ではIDEを使ったことがなかったので、IDEの便利機能に感動しながら、さらにemacsのkeymapでハッピーな日々を送りました。

そして、今春のある日、チームにIntelliJが導入され、これはもうIntelliJでもemacsのkeymapを使うしかないわけで、以下で紹介する設定を行ったわけです。

※1…仕事として本格的に
※2…キーボード左下のCtrlキーではなく、CapsLockキーを[コレ](http://www.forest.impress.co.jp/library/software/changekey/)でCtrlキーに変更
※3…でもこのとき気づいたんです。僕はemacsを愛していたわけではなく、emascのkeymapを愛していたのです∑(ﾟдﾟlll)

# 僕のキラキラkeymap設定

EclipseにもIntelliJにも、もともとemacsやvimのkeymapが同梱されており、設定で切り替えることができるのはご存知かと思います。

なので、最初は、IntelliJに同梱されているemacsのkeymapをカスタマイズしようかと思いました。が、やめました。

**IntelliJはインテリジェンスで素晴らしいエディターなので、デフォルトの機能を最大限に活かしたい** と思ったのです。（これは、IntelliJマスターの同僚の受け売りです。）

※Eclipseでも、Eclipseデフォルトのkeymapにemacsのkeymapを自力で移植して使っていました。
※IntelliJのkeymapをカスタマイズする際は、まず、ベースとなる設定をcopyしてから始めてください。
![a.png](https://qiita-image-store.s3.amazonaws.com/0/3899/86bb075f-8a1b-3931-3148-88296eee9651.png)
![b.png](https://qiita-image-store.s3.amazonaws.com/0/3899/cf02a85b-3471-26ea-6c44-6721a5c67107.png)

## 具体的な設定内容

僕は以下のemacsのkeymapを、IntelliJのデフォルトのkeymapに移植しました。

- ```Ctrl + A```　Move Caret to Line Start
- ```Ctrl + E```　Move Caret to Line End
- ```Ctrl + K```　Cut up to Line End
- ```Ctrl + Y```　Paste
- ```Alt + V```　Page Up
- ```Ctrl + V```　Page Down

あと、Eclipseにはあったけど、IntelliJではキー未割り当てのコマンドも設定しています。

- ```Ctrl + D```　Delete Line
- ```Ctrl + Alt + ↓```　Duplicate Line or Block
- ```Alt + ↑```　Move Line Up
- ```Alt + ↓```　Move Line Down

書き出してみると案外少ないですが、この設定をするしないでは、自分の作業効率が大きく変わってきます。

でもこうやって、IntelliJデフォルトのkeymapをカスタマイズすると **2つの問題** がでてきます。

## keymapのカスタマイズによる問題
### 1つ目：コマンド同士の競合
良い例としては、通常```Ctrl + A```に割り当てられている *"Select All (テキスト全選択)"* です。

この場合は、 *Select All* の定義を```Ctrl + Alt + A```に変更しました。

同様に他にも被るコマンドについては、```Alt```キーまたは```Shift```キーを定義に追加しました。

※キーの割り当て状況はここでわかります。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/3899/5a9b7619-c14c-1fe9-fa78-9d93937001d7.png)
　②の上でキーを押すと、そのコマンドを絞り込んで表示してくれます。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/3899/a1769ee6-234d-a2eb-b941-abe1aeeffabd.png)
（変更済みのコマンドはIntelliJが青色で教えてくれます。）

### 2つ目：他のメンバーのIntelliJが使いにくい
知らんがな

# まとめ

IntelliJ IDEAを導入する大きな目的の１つが、作業効率アップだと思います。
自分好みのkeymapで気持ちよくコーディングできればさらに効率アップ間違いなしです！

ぜひIntelliJをあなた色に染めてあげてください！！

--
P.S. 最近はSublime Text にお熱です。もちろん、[sublemacspro](https://github.com/grundprinzip/sublemacspro) でな( ｰ`дｰ´)ｷﾘｯ
Node.js + Socket.IO + jQuery で最小構成チャット

遅ればせながらNode.js始めまして、チャットアプリを作ってみました。
なるべくソースが短くなるようにしてみました。

server.jsとindex.htmlをWebサーバの同じ場所に置いて
`node server`
で起動します。
ブラウザからサーバの3000番ポートを開いてチャットが出来ます。例`http://example.com:3000`

```js:server.js
var html = require('fs').readFileSync('index.html');
var http = require('http').createServer(function(req, res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.end(html);
});
var io = require('socket.io')(http);
http.listen(3000);
io.on('connection', function(socket) {
  socket.on('msg', function(data) {
    io.emit('msg', data);
  });
});
```

```html:index.html
<!doctype html>
<meta charset="utf-8">
<title>chat</title>
<script src="/socket.io/socket.io.js"></script>
<script src="//code.jquery.com/jquery-2.1.3.min.js"></script>
<form><input></form><div></div>
<script>
var socket = io();
$('form').submit(function() {
  socket.emit('msg', $('input').val());
  $('input').val('');
  return false;
});
socket.on('msg', function(data) {
  $('div').prepend(data + '<br>');
});
</script>
```

##注意点
socket.ioモジュールの読み込みに失敗するときは以下のコマンドでインストールしてください。

```
npm install socket.io
```

外部公開する場合はサニタイズしてください。index.htmlの
`$('div').prepend(data + '<br>');`
の前に
`data = $('<div/>').text(data).html();`
と一行加えるとタグを無効化できます。

（追記2013/12/8 Thanks to @LightSpeedC さん）
`readFileSync` メソッドの代わりに以下の様に `createReadStream` と `stream.Readable.pipe` を使うとブロックされずにパイプで繋いでファイルを流すことができます。
`require('fs').createReadStream('index.html').pipe(res);`
（追記終わり）
RHEL5.10に HP Service Pack for ProLiant (SPP) をインストールするのに苦戦した

はじめに
=======
* [公式ドキュメント](http://h50146.www5.hp.com/products/software/oe/linux/mainstream/support/doc/general/mgmt/spp/spp2013090b.html)
* `ProLiant Support Pack (PSP)` から `HP Service Pack for ProLiant (SPP)` に名称変更になりました。
* SPP公開以降に出たOSに対してOSサプリメントが配布されています。
  * RHEL5.10の差分ファイルが提供されました。(RHEL6.5用はまだ提供されていません)

## HP SPP 2016.10

* [Service Pack for ProLiant version 2016.10.0 Contents](https://h50146.www5.hpe.com/products/software/oe/linux/mainstream/contents_spp2016100.html)
* [HP Software Delivery Repository](https://downloads.linux.hpe.com/SDR/repo/spp/2016.10.0/hp/swpackages/)


準備
========

OSインストール時の注意
--------------
* SPPで開発ツール(development-tools)を求められるのでインストールしておく。
* vnc-serverとfirefox、日本語フォントをインストールしておく。

ファイルのダウンロード
---------------
* [ダウンロードページ](http://h17007.www1.hp.com/jp/ja/enterprise/servers/products/service_pack/spp/index.aspx)
  * [フルISOイメージ](https://h20392.www2.hp.com/portal/swdepot/try.do?productNumber=spp_2013.09.0) (2.93 GB)をダウンロード (ユーザー情報の入力を求められます。)
  * [OSサプリメント](http://h20566.www2.hp.com/portal/site/hpsc/template.PAGE/public/psi/swdDetails/?spf_p.tpst=swdMain&spf_p.prp_swdMain=wsrp-navigationalState=idx=%7cswItem=MTX_e7aea433f403490db5582c0f09%7citemLocale=%7cmode=%7caction=driverDocument&javax.portlet.begCacheTok=com.vignette.cachetoken&javax.portlet.endCacheTok=com.vignette.cachetoken)(292.88 MB)をダウンロード (xmlファイルもダウンロードする。)

失敗例
=======

ISOイメージに差分ファイルを追加
---------------

```bash:
# mkdir ~/iso/
# sudo mount -o loop HP_Service_Pack_for_Proliant_2013.09.0-0_744345-001_spp_2013.09.0-SPP2013090.2013_0830.30.iso ./iso/
# mkdir ~/spp/
# cp -a ~/iso/* ~/spp/
# cd ~/spp/swpackages/
# tar xzf ~/supspp_rhel5.10.en.tar.gz
# mv ~/bp002012.xml .
```

```bash:起動
# vncserver :1
# export DISPLAY=:1
# ./hpsum -s
```

webブラウザで https://localhost:63002/ にアクセス。
root, rootのパスワードでログイン。

* ここから開始 -> 対話式か自動か聞いてくるので、対話式を選択。
![スクリーンショット 2013-12-07 3.46.46.png](https://qiita-image-store.s3.amazonaws.com/0/25728/541aa8a2-4aea-6e04-48b9-fedf3f752ee8.png)
  * ここでセグメンテーションフォルトしました。


成功例
=======
* HP_Service_Pack_for_Proliant_2013.09.0-0_744345-001_spp_2013.09.0-SPP2013090.2013_0830.30.iso をマウント
* supspp_rhel5.10.en.tar.gzを展開
* supspp_rhel5.10.en.tar.gz を展開すると`spp`というフォルダができる。そこに`bp002012.xml`をコピーする。
* hp/swpackages/hpsum をroot権限で実行
* リポジトリの追加で、supspp_rhel5.10.en.tar.gzの展開先を指定
* あとは次へ、次へで成功。

![スクリーンショット 2013-12-07 6.30.49.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a953dc8a-fcad-f0ae-7b81-7c1c243764c8.png)

![スクリーンショット 2013-12-07 8.14.20.png](https://qiita-image-store.s3.amazonaws.com/0/25728/c0be1b5d-d8ec-1089-09e7-2f32b5618e23.png)

* `5.10 サプリメント`が一覧に出てくればOK。チェックしてインストールしましょう。

OS再起動を要求してきますが、ここで再起動してはいけません。
(ここで再起動さてしまうと電源OFF/ONするまで画面が真っ暗、FAN全開でした。)
hpsumを終了させて、手動でrebootしましょう。
grunt-play の終了音に Mac の警告音を使う

 [astronaughts](http://qiita.com/astronaughts "astronaughts") さんの [grunt-play](http://qiita.com/astronaughts/items/32824d021911b370b4f2 "grunt-play") が便利ですね！いっつも grunt の終了はターミナルをチラ見してたので、大変助かっておりますありがとうございます。

さて、終了音に好きな音を鳴らせるのは魅力的なんですが、手頃なものがない場合、Mac の警告音を使うという手もあります。「システム環境設定 -> サウンド」にあるこの子たちです。
![entry20131207_1.png](https://qiita-image-store.s3.amazonaws.com/0/11026/57f95058-183a-78be-0a78-5302a03db6d2.png)

Gruntfile.coffee 内での設定を以下のようにすれば、使えるようになります。その他 grunt-play に関して詳しくは、冒頭のリンクにあるエントリーを参照してください。

```coffeescript::Gruntfile.coffee
play:
	fanfare:
		file: '/System/Library/Sounds/Purr.aiff'
```

ファイル名はシステム環境設定内での文字列「Glass」とか「Hero」とかがそのままなので、「Glass.aiff」「Hero.aiff」などです。
AndroidでiBeacon信号を受信してみよう

この投稿は2013年のiBeacon Advent Calendarの7日目の記事です。

はじめまして、主に、<a href="http://android-akihabara.info/">日本Androidの会 秋葉原支部</a>で活動をしている<a href="https://twitter.com/KazuyukiEguchi">KazuyukiEguchi</a>です。

Advant Calendarに参加するのも初めてでこれで良いのか！？心配ですが。。。

## AndroidでiBeacon信号を受信してみよう

Android 4.3から公式にBluetooth 4.0 LEのAPIがサポートされました。このAPIをうまく利用すると、iBeaconの電波を受信し、UUID,Major,Minorの値を取得することができます。

### Manifestファイルに特権の追加

```xml
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
```

これは、今までのBluetooth APIを利用するときと変わりません。

Android Play にアプリをアップロードする際は、Bluetooth 4.0 LE搭載の機種でしか動作できませんよというおまじないも、Manifestファイルに記述してください。

```xml
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
```

### ソースコード記述編

#### Bluetooth Adapterの取得

```java

final BluetoothManager bluetoothManager =
        (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();

```

### Bluetooth LEデバイスの検索

```java
mBluetoothAdapter.startLeScan(mLeScanCallback);
```

を呼び出すと、Bluetooth LEデバイスの探索を開始します。
コールバック関数の中身ですが、

```java
private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
    @Override
    public void onLeScan(final BluetoothDevice device, int rssi,byte[] scanRecord) {
         // デバイスが検出される度に呼び出されます。
    });
};
```

実は、上記のコードだけで、iBeaconを検出することができているんです。

iBeaconにおけるUUID,Major,Minorの情報がないじゃんと思われますが、iBeaconの仕組みは、Bluetooth LEのAdvertisementパケットに工夫をして、iBeaconとして利用していますので、コールバック関数内のonLeScanの引数であるscanRecordの中に、UUID,Major,Minorの信号が含まれているんです。

####取り出し例

```java
if(scanRecord.length > 30)
{
	if((scanRecord[5] == (byte)0x4c) && (scanRecord[6] == (byte)0x00) &&
	   (scanRecord[7] == (byte)0x02) && (scanRecord[8] == (byte)0x15))
	{
            String uuid = IntToHex2(scanRecord[9] & 0xff) 
			+ IntToHex2(scanRecord[10] & 0xff)
			+ IntToHex2(scanRecord[11] & 0xff)
			+ IntToHex2(scanRecord[12] & 0xff)
			+ "-"
			+ IntToHex2(scanRecord[13] & 0xff)
			+ IntToHex2(scanRecord[14] & 0xff)
			+ "-"
			+ IntToHex2(scanRecord[15] & 0xff)
			+ IntToHex2(scanRecord[16] & 0xff)
			+ "-"
			+ IntToHex2(scanRecord[17] & 0xff)
			+ IntToHex2(scanRecord[18] & 0xff)
			+ "-"
			+ IntToHex2(scanRecord[19] & 0xff)
			+ IntToHex2(scanRecord[20] & 0xff)
			+ IntToHex2(scanRecord[21] & 0xff)
			+ IntToHex2(scanRecord[22] & 0xff)
			+ IntToHex2(scanRecord[23] & 0xff)
			+ IntToHex2(scanRecord[24] & 0xff);
					
			String major = IntToHex2(scanRecord[25] & 0xff) + IntToHex2(scanRecord[26] & 0xff);
			String minor = IntToHex2(scanRecord[27] & 0xff) + IntToHex2(scanRecord[28] & 0xff);
        }
}
```

上記のソースコードで、iOS7端末上で、Beacon送信している状態のパケット、Esitimote Beacon、その他<a href="http://eguchi.jp/blognplus/index.php?e=460">iBeacon互換デバイス</a>の信号の受信が出来ました。

これから、iBeacon Advent Calendar 2013では、Androidベースでの記事が続々と出ると思いますので、私からは、最初の一歩という形の記事にさせていただきました。
ansibleで1ファイルのplaybookからroleに書き換える方法

`ansible` を使い始める時は1個の YAML ファイルから始めるのが手軽で良いのですが、それを [Best Practices](http://www.ansibleworks.com/docs/playbooks_best_practices.html) にあわせて `roles` にしようとしたら、対応がよくわからなくて困ったことがあったので、書き換え方をまとめてみました。

続きは [ansibleで1ファイルのplaybookからroleに書き換える方法](http://blog.n-z.jp/blog/2013-12-07-ansible-split-playbook.html) です。
How to use Rex to manage VirtualBox

Fist of all, I'm Chinese. I found no PerlChina Advent and came here. Can here post some artices without using japanese? Seems no prohibit~OK, let's go!

Rex means Remote EXecute. It's a Deployment & Configuration Management, which works like [ansible](http://ansibleworks.com/), and DSL designed like [puppet](http://www.puppetlabs.com/). Find here: <http://www.rexify.org/>

But today, I will show something different -- use rex to manage a vbox -- yes, just like vagrant do!

First, generate a vbox template:

    $ rexify project-name --template box
    $ cd project-name

Now we get a file called 'Rexfile', just like 'Vagrantfile' after `vagrant init`. An example of `Rexfile` as follow:

```perl:Rexfile
set box => "VBox";
task mytask => sub {
   box {
      my ($box) = @_;
      $box->name("boxname");
      $box->url("http://box.rexify.org/box/base-image.box");
      $box->network(1 => {
        type => "bridged"      # default "nat",
        bridge => "eth0",
      });
      $box->forward_port(ssh => [2222, 22]);
      $box->share_folder(boxhome => "/path/to/myuser");
      $box->auth(
        user => "root",
        password => "box",
      );
      $box->setup(qw/setup_frontend/);
   };
};
```

Then, we can run the box start/stop:

    $ rex init --name=boxname
    $ rex stop --name=boxname

Attention, there is one setup task in the `Rexfile`, we can define our own automatic task to customize this box after it start, a small example as follow:

```perl:Rexfile
task 'setup_frontend', sub {
    install nginx;
    file '/etc/nginx.conf',
        content   => template('template/httpd.conf.tpl'),
        owner     => "root",
        group     => "root",
        on_change => sub { service nginx => "restart"; };
};
```

Vagrant has provision support for puppet/chef, Rex do it all himself.

BTW, Rex support to define these vboxes in YAML:

```yaml:boxes.yml
type: VBox
vms:
   fe01:
      url: http://box.rexify.org/box/ubuntu-server-12.10-amd64.ova
      network:
         1:
            type: bridged
            bridge: eth0
      setup: setup_frontend
   db01:
      url: http://box.rexify.org/box/ubuntu-server-12.10-amd64.ova
      network:
         1:
            type: bridged
            bridge: eth0
      setup: setup_db
```

Only one line was needed if we use YAML:

    use Rex::Commands::Box init_file => "boxes.yml";

Rex support VMware and Amazon vms too
JavaのAbstractとInterface

Abstractは再利用の最小単位としての継承。タイトル画面クラス・ゲーム画面クラスなどのように似たようなクラスを作るときに似たような機能をまとめてまとめて実装しておくことで実装しやすくすると共に、子クラスの同列性を高める。

Interfaceは型 (整数型とか) の挙動を約束するための継承。整数型としてもリストとしても振る舞えるクラスを定義するためだとかに使う (ダックタイピング的な？) 。メソッドとその入出力の型を決めるだけだから多重継承しても問題ない。
C#でpdfを表示（WebBrowser使用　ナビゲーションバー非表示）

【環境】
C#5.0 + Acrobat Reader X

【やりたいこと】
C#のフォームにて、ナビゲーションバー非表示状態で閲覧モードでpdfファイルを表示させたい。

【疑問】
WebBrowser1.Navigate(〜〜〜 + "#toolbar=0&navpanes=0")
をして、pdfファイルを表示しています。
表示後のフォームは、Disposeするときに、
Application.DoEvents()
CoFreeUnusedLibraries()
上記をコールして、Acrobat Readerのゴミメモリを解放してます。

http://social.msdn.microsoft.com/Forums/ja-JP/8e07a225-7d4b-44ab-80cc-3387b46eb435/webbrowserpdf?forum=vbexpressja
http://social.msdn.microsoft.com/Forums/ja-JP/4d268e9e-e123-465e-9816-893022b11d61/webbrowser-pdf-?forum=netfxgeneralja
※上記リンク先２つを参考

普通に動かすと問題ないのですが、開けたり閉じたりを繰り返すと、
時々「Acrobat Readerのオープンに失敗した」ダイアログ出てしまいます。

そもそも、pdfファイルをナビゲーションバー非表示として表示させるのには
この方法がベスト、という情報がなく、どうすればいいのか困ってます。

WebBrowserにこだわる理由はなく、COMコンポーネントのAdobe Readerを使っても構わないのですが、この方法だとナビゲーションバーの非表示のさせ方が不明で候補から取り下げてました。

ご存知の方が入ればご教示ください。
lambda の再帰的定義

あらゆる処理系で可能かは定かではないが、Visual C++ では lambda を再帰的に定義できる。

```cpp
#include <iostream>
#include <functional>

int main() {
    // function<> で受けるのがキモ
    std::function<int(int)> factorial =
        [&](int n) { return n == 0 ? 1 : n * factorial(n-1); };
        // ↑ factorialはlambdaの外なので & capture が必要
    std::cout << factorial(5) << std::endl;
}
```
OpenWeatherMap API v2.5から天気を取得する


OpenWeatherMap APIにアクセスしてみたのでメモ。今のところ安定して動いているし無料サービスにしては内容も精度も必要十分かなと思います。天気予報取れるし。

AFNetworking使ったサンプルですみません。

```objectivec
// OpenWeatherMapの天気出力APIエンドポイント
NSString *kOpenWeatherMap3HoursForecastAPI @"http://api.openweathermap.org/data/2.5/weather?units=metric&lat=%f&lon=%f";

// 適当な緯度経度
CLLocationDegrees latitude = 39.01;
CLLocationDegrees longitude = 141.68;

NSString *urlString = [NSString stringWithFormat:kOpenWeatherMap3HoursForecastAPI, latitude, longitude];

[[AFHTTPRequestOperationManager manager] GET:urlString
                                  parameters:nil
                                     success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
}   
                                     failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];
 ```

OpenWeatherMapで定義された **JSON形式のWeatherオブジェクト**が取得できます。

```javascript
{
    base = "cmc stations";
    clouds =     {
        all = 8;
    };
    cod = 200;
    coord =     {
        lat = "39.01";
        lon = "141.68";
    };
    dt = 1386343001;
    id = 2111530;
    main =     {
        "grnd_level" = "1003.63";
        humidity = 100;
        pressure = "1003.63";
        "sea_level" = "1024.69";
        temp = "-1.631";
        "temp_max" = "-1.631";
        "temp_min" = "-1.631";
    };
    name = Ofunato;
    sys =     {
        country = JP;
        message = "0.0047";
        sunrise = 1386279482;
        sunset = 1386313849;
    };
    weather =     (
                {
            description = "sky is clear";
            icon = 02n;
            id = 800;
            main = Clear;
        }
    );
    wind =     {
        deg = "281.503";
        speed = "2.31";
    };
}
```


# Weatherオブジェクトデータ形式

|キー | 意味 | 出力するかどうか |
|:--:|:--:|:--:|
|id	|街のID	| 常に出力|
|dt	| データの時刻。GMTのunixtime形式（いわゆるEPOCH）| 常に出力|
|coord.lat coord.lng	| 街の緯度経度|常に出力|
|name	| 街名|	常に出力|
|main.temp	| 気温（ケルビン）。摂氏に変換するには273.15を引く。| 常に出力|
|main.humidity	| 湿度（%）| 常に出力|
|main.temp_min main.temp_max	 |最低気温、最高気温| オプション|
|main.pressure	| 気圧（hPa）	| 常に出力|
|wind.speed	| 風速（meter / sec）| 常に出力|
|wind.deg	| 風向き (度。meteorological　時計回り？)	| 常に出力|
|clouds.all	| 雲の割合？（Cloudiness in %）	| 常に出力|
|weather	| 気象状態| オプション|
|rain.3h	| 3時間毎の降水量| オプション|
|snow.3h	| 3時間ごとの降雪量| オプション|

weather.description（天気の概要）、name（土地名）は多言語化されているようなのですが、残念ながら日本語はサポートされていません。


# 単位について

`imperial`, `metric`を選択することが出来ます。先の例では`units=metric`を指定して摂氏で取得しています。



| 項目 | default | imperial | metric |
|:-----------|---------:|------------:|:------------:|
| 温度        | ケルビン | 華氏 | 摂氏     |
| 気圧     | hPa  |  hPa |    hPa    |
| 風速      |  メートル / 秒 | **不明** |     メートル / 秒     |

単位指定が無い場合は気温がケルビンになる点に注意。

単位に`imperial`を指定した際の風速はノットでもないしmile / secでもないしバグってるかも？（[Bug #111 Wrong wind speed value with imperial units](http://bugs.openweathermap.org/issues/111)）

# 参考

* [Weatherデータの構造（OpenWeatherMap API）](http://bugs.openweathermap.org/projects/api/wiki/Weather_Data)
* [天気情報を取得する](http://qiita.com/s0hno/items/b67a24bd3cbeb6e7cdc0)
* [OpenWeatherMap JSON API v2.5(Androidからの利用方法メモ)](http://qiita.com/kubotaku1119/items/7e5eaa30fee0a25f70d0)
TestLink の XML-RPC を拡張する

最新のTestLink は REST API があるらしいですが、今回は XML-RPC の話を。

## 前準備

XML-RPC で外部からアクセスするにはまず、API アクセスキー を取得する必要がありますので
config.inc.php 内の $tlCfg->api->enabled を TRUE にします。

その後で TestLink の アカウント設定 にアクセスすると API アクセスキー を生成するボタンが
表示されているので、押します。すると、API アクセスキーが表示されますので、それをメモっときます。

## ruby で XML-RPC

次に、XML-RPCでアクセスするために、コードを書きます。
ruby だと 以下のような感じでアクセスできます。もし、他言語で書きたい場合、testlink/lib/api/sample_clients 下に java や php のサンプルがありますので、参考にしてもいいかも。

```rb:test.rb
require 'xmlrpc/client'

SERVER_URL = "http://localhost/testlink/lib/api/xmlrpc.php"
# localhost は 自身のサーバーURL
# xmlrpcのURLはTestLinkのバージョンによって異なります。
# 1.9.4 では上記のURLでアクセスできますが
# 1.9.9 では testlink/lib/api/xmlrpc/v1/xmlrpc.php で アクセス可能です。

sever = XMLRPC::Client.new2(SERVER_URL)
server.http_header_extra = { "accept-encoding" => "identity" }
puts server.call("tl.sayHello")
# ここでは使っていませんが、呼び出すAPIによっては、APIキーが必要になります。
# その場合は {"devKey" => メモしたAPIキー} を 第二引数として渡します
# 例) server.call ( "tl.XXXXXXXXX", {"devKey" => "ほげほげ"} )
```

testlink/lib/api/xmlrpc.class.php の内容を見れば、どのようなAPI があるか推測できますので、色々試してみましょう。

## 拡張XML-RPC

testlink/lib/api/sample_extended_server/extended_server.php を参考にXML-RPCを拡張できます。

```php:extended_server.php
require_once('lib/api/xmlrpc.class.php')

class ExtendedXMLRPCServer extends TestlinkXMLRPCServer {
  public function __construct() {
    $callbacks = array(
      'tl.getRecordSet' => 'this:getRecordSet'
    );
  }

  public function getRecordSet($args)
  {
    $rs = $this->dbObj->get_recordset($args['sql']);
    $msg = $this->dbObj->db->ErrorMsg();
    if ($msg)
      return $msg;
    else
      return $rs;
  }
}
```

このファイルをtestlinkのルートディレクトリに置きます。そして外部からXML-RPCでアクセス。

```rb:test.rb
sql = "select * from nodes_hierarchy"
p server.call ( "tl.getRecordSet", { "sql" => sql } )
```

TestLinkのバージョンによって、データの取得方法等が違うかったりするので、
自身が使っているTestLink のバージョンのソースを見て、理解して使っていただくのが
一番かとおもいます。

いつかは、カスタムレポートの話も書けたらいいなぁ。。。

それでは！！
zshでコマンドラインサーバー、zrv.zshのご紹介

極稀に、今入力しているコマンドを、別の端末の上で既に動いている zsh で実際に入力したように実行したいということがあったので作ってみました。

デモ動画はこちらから (<http://www.youtube.com/watch?v=AfPgznZvBr8h>):

![zrv.zsh](https://img.youtube.com/vi/AfPgznZvBr8/mqdefault.jpg)

ソースコードはこちらから (<https://github.com/hchbaw/zrv.zsh.git>)

使い方です。
============

ファイルを `autoload` して `zrv` を呼び出してサーバーをスタートします。

~~~~
% tmux
;# サーバー側はtmux上で動かすのが必須です
% git clone https://github.com/hchbaw/zrv.zsh.git
% fpath+="$(echo ${:-./zrv.zsh}(:A))"
% autoload -Uz zrv
% zrv
~~~~

クライアント側では以下の `zrv-client` のような関数を使って通信します。

~~~~ {zsh}
zrv-client () {
  local -i REPLY;
  setopt localoptions errreturn
  zmodload zsh/net/socket
  zsocket /tmp/zrv-${UID}/default
  print -u $REPLY "$1"
  exec {REPLY}>&- # このファイルディスクリプタ閉じるのを忘れないで！
}
~~~~

関数を定義したら例えば以下のような感じに使うことができます。

~~~~
% zrv-client "echo hi"
⇒ "echo hi" をサーバーに送信、サーバー側で実行、表示します。
% zrv-client "sleep 5
echo hihi"
⇒ サーバーに復数のコマンドを送信、サーバー側では一行すつ実行、表示します。
~~~~

以下雑感です。
==============

プロトコルを考えるのはつらかったので、クライアントから切断された後、送ったコマンドが実行される、ということにしました。

`accept-line` の後に何かキーを押さないと実行されなかったのでこんな感じになっていて、サーバー側は `tmux` 上じゃないと動作しません。

`recursive-edit` 内でないと `$BUFFER` を更新しても実際のコマンドラインに反映されなかったので、やっぱりこんな感じになっています。

といった、強引にねじふせたおもちゃです。正直なんだかなあという感じになっちゃったサーバーですけれども少しは遊べます。

自分では主に、今いるウインドウの横のウインドウで、サーバーが表示されているペインを表示して、今いるウインドウのコマンドラインの内容を `$PWD` への `cd` も伴って送信する、などしています。

なんだろ、このコマンドを実行しちゃうと出力でウインドウ一ぱいになっちゃいそう、とか、コマンドの結果が返ってくるのに微妙に時間経かりそうだ、という時にサーバー側で実行して、その次のコマンドを入力し始める、みたいな使い方です。


ごめんなさい長くなっちゃった。おつかれ様でした！
WebPayをコマンドラインで料理する。jqを使おう。

こんにちは、@sowawaです。まだまだアドベントカレンダーの世界の初心者ですがよろしくお願いします。今日までアドベントカレンダーの話はWebPayを簡単に使うためのCheckoutHelperが中心でした。もうWebPayを簡単にWebページに組み込む方法を皆さんには知ってもらえたでしょうか？今日は、ここまでのアドベントカレンダーとは全く違うは、黒い画面の話をしたいと思います。（コンソールが黒じゃない人はごめんなさい）

# Cooking WebPay in Command line

すでにWebPayではcurlを使ったドキュメントを用意していますので、「コマンドラインからWebPayを使う」とかいわれても「そんなの常識だろ」とおっしゃる人も多いと思いますが、RestやJSONが全盛の現代でいかにCLI厨のおじさんたちがどうやって生き残っていくか、そんな生存戦略を語っていきたいと思います。

## `sed` `awk` `jq`

コマンドラインで様々な操作をするエンジニアの皆さんにとって、`sed`や`awk`はとても身近なツールだと思います。あとは`grep`や`uniq`、`sort`なんていうコマンドもありますね。そこで今回紹介したいのは、コマンドラインツール`jq`です。`jq`を使うことでJSONを柔軟に取り扱うことが出来るようになるため、これらのコマンドと組み合わせることでAPIの出力を自由自在に操れるようになります。

コマンドラインを使ってデータを整形したり、変換したり、集計する作業の最初の一歩として、簡単なプログラムを作ったり、`awk`を使ってCSVを作ったりすることはよくありますよね。様々な形をしたデータを自分がほしい形に整形して利用するために、`jq`を活用して行きましょう。

## 課金の一覧を取得して`jq`を使ってみる

簡単な例として課金の一覧を取得して`charge_id`の一覧表示する例を作ってみました。

```jqの実行例
$ curl "https://api.webpay.jp/v1/charges?count=3" \
-u "test_secret_eHn4TTgsGguBcW764a2KA8Yd": | jq '(.data[].id)'
"ch_aK68QI3xLbnW5Rv"
"ch_aK677mg0QedR0Og"
"ch_aK6fM75s37i3g57"
```

うまく`charge_id`の一覧を作ることが出来ましたね。WebPayのドキュメントで示されているレスポンス例を元に少し解説をしたいと思います。

```chargeの一覧のレスポンス例
{
  "object": "list",
  "url": "/v1/charges",
  "count": 3,
  "data": [
    {
      "id": "ch_7KhaO74sY0MPedM",
      "object": "charge",
      "livemode": false,
      "currency": "jpy",
      "description": "First charge",
      "amount": 1000,
      "amount_refunded": 0,
      "customer": null,
      "created": 1366576035,
      "paid": true,
      "refunded": false,
      "failure_message": null,
      "card": {
        "object": "card",
        "exp_year": 2020,
        "exp_month": 4,
        "fingerprint": "215b5b2fe460809b8bb90bae6eeac0e0e0987bd7",
        "name": "KEISUKE SOGAWA",
        "country": "JP",
        "type": "Visa",
        "cvc_check": "pass",
        "last4": "4242"
      },
      "captured": true,
      "expire_time": null
    },
    {...},
    {...}
  ]
}
```

最初のポイントとしては、jqというのはxmlのxpathやCSS形式のようなイメージを持っていただくのがわかりやすいと思います。jqに渡している`.data[].id`という引数の部分がまさにxpathのような感じですね。最初の`.data[]`という部分は、JSONのルートからみた要素のdataを配列形式で取得します。続く`.id`で配列の各要素のidを取得しています。`.amount`に変更すると金額を取得することができます。

注：詳細な使い方は[jqの公式](http://stedolan.github.io/jq/)を参照してください。

今日は`jq`の導入部分を紹介したかったので詳しい機能の解説はしませんが、`jq`にはまだまだたくさんの機能が用意されています。mapやselectのような関数も用意されていたり、四則演算も行うことができるのでぜひ`jq`の全機能に目を通してみてください。きっとあなたのコマンドラインライフを素晴らしい物に変えてくれるはずです。

それでは今日のアドベントカレンダーはここまでです。See you again. Have a nice weekend.
RubyでURLの結合をするときは`File.join`使うと幸せになった


困ってた時に @udzura さんに教えてもらって助かったネタなんですが、まとまっている記事がなさそうだったので備忘録と同じ轍を踏みそうになった人が解決するようにまとめておきます。


こんな感じの事が起きて困ってました。

URLの"/"ありとなしが混在

```
[1] pry(main)> base1 = "http://www.example.com/"
=> "http://www.example.com/"
[2] pry(main)> base2 = "http://www.example.com/users"
=> "http://www.example.com/users"
```

## path側に'/'を付けない場合

```
[3] pry(main)> path1 = "books"
=> "books"
[5] pry(main)> base1 + path1
=> "http://www.example.com/books" # => 期待する動作
[6] pry(main)> base2 + path1
=> "http://www.example.com/usersbooks" # => ウウッ
```

## path側に"/"を付ける場合
```
[7] pry(main)> path2 = "/books"
=> "/books"
[8] pry(main)> base1 + path2
=> "http://www.example.com//books" # => ウウッ
[9] pry(main)> base2 + path2
=> "http://www.example.com/users/books" # => 期待する動作
```

## URI.join

よしなに結合してくれるものないかなーと思って、URI.joinというのがあったので試してみたところ

```
[12] pry(main)> URI.join(base1, path1)
=> #<URI::HTTP:0x007fa9e2a0f5d0 URL:http://www.example.com/books>
[13] pry(main)> URI.join(base1, path2)
=> #<URI::HTTP:0x007fa9e3082bd8 URL:http://www.example.com/books>
[14] pry(main)> URI.join(base2, path1)
=> #<URI::HTTP:0x007fa9e30d7d18 URL:http://www.example.com/books>
[15] pry(main)> URI.join(base2, path2)
=> #<URI::HTTP:0x007fa9e2b00750 URL:http://www.example.com/books>
```

というふうに、"/users"の方がうまく結合できませんでした。

## File.join

`File.join`を使ったときの動作はこうなります。

```
[17] pry(main)> File.join(base1, path1)
=> "http://www.example.com/books"
[18] pry(main)> File.join(base1, path2)
=> "http://www.example.com/books"
[19] pry(main)> File.join(base2, path1)
=> "http://www.example.com/users/books"
[20] pry(main)> File.join(base2, path2)
=> "http://www.example.com/users/books"
```

どのパターンにおいてもうまく結合してくれていますね。

### 補足

ただし、クエリパラメータは残念な感じになるので注意。

```
[21] pry(main)> File.join(base1, "?name=hoge")
=> "http://www.example.com/?name=hoge"
[22] pry(main)> File.join(base2, "?name=hoge")
=> "http://www.example.com/users/?name=hoge"
```

## 参考リンク
* 元となった @udzura さんの[ツイート](https://twitter.com/udzura/status/405138305177497600)
* <a href="http://qiita.com/torshinor/items/bd6c6c98ade7c942791b" target="_blank">Ruby - URI.joinでちょっと嵌った。 - Qiita [キータ]</a>
外出作業場を確保しよう

初めまして。
この記事は、

- [NEET Advent Calendar 2013 - Qiita [キータ]](http://qiita.com/advent-calendar/2013/neet)

の 7日目の記事です。


今日は自宅でない作業場を確保することについて書きます。
ここでいう作業とはプログラミングなど、自分の頭を使う知的なものを言います。  

自宅でも、読書などのインプットが主の作業や、やることが決まっていたり、大体のビジョンが定まっているコーディングならやることができます。
しかしながら、まだ手探り状態だったり、難しそうでやる気が出ない作業をするために、
あるいは、ニートであるやむにやまれぬ事情で自宅に居づらい（居ても集中できない）状況に陥ったときのために、
自宅の外での作業場は是非とも確保しておくことをお勧めします。  

それに、場所を移すと不思議な効果が発生して、一気に進捗が進むことがあります。
私は行き詰まっているときには迷わず場所を移しますし、ときには24時間営業しているファーストフード店で一人進捗合宿を行って問題を解決してきました。  

#求める環境
しかし、作業場に適した場はそれなりの条件を備えていなければならず、見つけるのが大変です。
私が求める作業場の条件は重要な順に以下の通りです。

- 椅子がある
- 電源が使える（バッテリーが長持ちするマシンならこの優先順位は低くなる）
- 机がある
- インターネット回線が使える（モバイルルータを持っているのならこの項は無になる）
- 空調が効いている
- 安く飲食が出来る

ここでは私が使ってきた作業場を紹介していきます。

##大学
大学構内はとても作業に向いています。学生食堂では安く飲食が出来、座りやすい机や椅子が備えられています。空調も効いていることが多いです。
また、探せば近くに電源の使えるコンセントを簡単に見つけられます。
通常の飲食店や休憩場などではコンセントが使えないようにガードされていたり、使用しているのを見つけられると注意されたりするのに対して、
大学の電源はほとんど無警戒です。私のマシンはバッテリーが1時間程度しか保たないのでこれはとてもありがたいことです。

さらに大学の図書館は一般人でも申請すれば使えるところが多いというのもポイントが高いです。
ニートは本を買う金すらないので積極的に利用していきましょう。  

欠点はインターネット回線が使えないことです。
しかしこれはインターネットを使わない作業に集中することが出来るという点では利点でもあります。疑問が生じたときにはそれをノートに書き留めておいて帰宅してから調べるようにすることで、作業にメリハリを持たせられます。
あるいは、モバイルルータを持っているのならこの欠点は皆無になります。モバイルルータは無収入者にとっては手痛い出費ですが、格安プランだとおよそ2000円／月で運用することが出来ます。

##ファーストフード店
私はマクドナルドを多く利用しています。
流石に何も買わずに利用するのは気が引けるので多くの場合100円ドリンクを買います。
電源を提供している店なら良いのですが、していない店も多くあります。事前に確認しておきましょう。
マクドナルドを利用する場合は事前に腹を満たしておいて空腹でない状態で行った方が良いです。
マクドナルドの商品は高いです。ちょっとだけ利用するつもりが思わぬ出費になることもあります。

マクドナルドの利点は月525円で公衆無線LANスポットが使えることです。
他の公衆無線LANサービスがプロバイダ契約との抱き合わせになっているのに対して、これはプロバイダ問わず単体で契約できるので気兼ねなく利用できます。
ただし、店舗によっては繋がりづらかったりすぐ切断されたりするので過信は禁物。

##図書館・公共施設
地元の図書館は自習や電子機器の利用が禁止されていますが、中央の図書館や公共センターには自習可、電源有りのものがあります。
しかも、場所によってはフレッツの公衆無線LANが通じています。
空調も整えられていて静かで理想的な環境です。

##飲食店
飲食店では大抵は電源が使えません。しかしまれに野良コンセントがあります。
もちろん、貸すことを想定しているわけではないので、見つかったら何か言われたり、次回来たときにロックされているなどの対策が取られているかも知れませんね。
電源泥棒ダメです。

私の最近のお気に入りは近所のパン屋です。
150円ほどの安いパンで何時間も席を使わせていただいています。
空調も効いていて良い感じです。

##電車内
ニートが乗る電車はラッシュ時間ではないので空いているはずです。当然座って作業が出来ます。
電車内は電源が使えません。バッテリーだけの利用になります。
しかし電車内はとても不思議な力が働いているので、通常の1.5倍の効率で作業が出来ます。  


いかがしたでしょうか。
ニートはやらなくてはいけないことが色々溜まる割にそれを効率よくこなすというのが存外難しいものです。
そんなとき、作業場を切り替えることで突破口を開くことが出来、その後のしばらくの作業に弾みが付きます。
作業場を見つけるのは難しいですが、効果は絶大なので、是非探してみましょう。
RubyMotion アプリのメモリ関連の不具合を簡単に探す方法


事前に「[問題：次のRubyMotionアプリにはメモリ関連の不具合があります。5分以内に原因箇所を特定せよ。](http://qiita.com/watson1978/items/03737ebcefa03063e2e2)」という記事を書いておきました。今回はこの問題の解決方法を書きたいと思います。まだ読まれていない方は、まずそちらから読んでみてください。

追記：Instrumentsを使うだけで不具合箇所が分かるようです → [RubyMotion アプリのメモリ関連の不具合を簡単に探す方法(2)](http://qiita.com/watson1978/items/6903258f4b81ada39919)

## 1. Instrumentsを使う

RubyMotion 2.12でInstrumentsを簡単に使えるようになりました。まずは、Instrumentsを使用して不具合があるかどうか確認しておきましょう。今回は"Zombies"というテンプレートを用います。

```
% rake profile template="Zombies"
```

`rake profile:templates`を実行するとほかにどのようなテンプレートがあるか確認できます。

Instrumentsが起動したあと、アプリがクラッシュする手順を実行します。

![131206-0001.png](https://qiita-image-store.s3.amazonaws.com/0/2075/881b9f1b-38b4-e793-3e74-6abb81788bae.png "131206-0001.png")

メモリが解放されてしまったオブジェクトにメッセージを送信してクラッシュしていることがわかります。残念ながら、シンボルが削除されていてなにが原因なのかまではわかりません。

"Zombie Messaged"と表示されない場合には、今回の手順では不具合箇所を探すことができないので、別の方法を模索してください。


## 2. 意図せず解放されているオブジェクトを探す

以下のコードを`app/debug.rb`などの名前で保存してアプリに追加しておきます。

```ruby:debug.rb
class RubyObject
  def dealloc
    puts "-" * 80
    puts "dealloc #{self.inspect}"
    super
  end

  def autorelease
    puts "=" * 80
    puts "autorelease #{self.inspect}"
    p caller
    super
  end
end
```

RubyMotionやObjective-Cでは、オブジェクトが解放されるときに`dealloc`というメソッドが呼ばれます。また解放される前に`autorelease`が呼び出され解放するように指示されます。

意図せず`dealloc`が呼ばれているオブジェクトを探し、`autorelease`が呼ばれる場所がどこなのかを特定します。アプリを実行するとTerminalにログがいろいろ表示されます。

![131206-0002.png](https://qiita-image-store.s3.amazonaws.com/0/2075/ed6fff9d-007d-aadf-449d-6285bc28d95b.png "131206-0002.png")

`MyController`が`dealloc`されていることがわかります。運良く、すぐ上に`autorelease`のログがありますね。`app_delegate.rb`の47行目で`autorelease`が呼ばれていることが分かります。該当する箇所は、以下のコードとなっています。

```ruby:app_delegate.rb
    MyController.new
```

コントローラのオブジェクトが気づかないうちに解放されたためにクラッシュしていました。インスタンス変数に格納して、長期的に保有するようにするとアプリが期待通りに動作するようになります。

```ruby:app_delegate.rb
    @controller = MyController.new
```

運が良いと、このような感じで簡単に原因箇所を割り出すことができます。万能ではないので、運が悪いと原因が見つからないかもしれません。

`dealloc`と`autorelease`を上書きすることでメモリリークが発生したりすることもありますので、使い終わったらすぐに削除してください。

## 3. 余談

`RubyObject`ではなく`NSObject`に対してメソッドをオーバーライドしてみたのですが、うまくいかなかったのでこのようになっています。
`String`クラスが`String`->`NSMutableString`->`NSString`->`NSObject`と継承しているせいなのか`dealloc`で文字列を扱うと、文字列生成->dealloc->文字列生成->dealloc->...と無限に繰り返されてしまい、クラッシュしてしまいます。

組み込みの`String`クラスに影響を与えないために`RubyObject`を使用しています。おおよそ以下の図のような構成になっているはずです。このため、組み込みクラスやiOS SDKのクラスを継承しているものや、それらが影響して解放されてしまっているようなものは、今回の方法では検出できません。

![](https://qiita-image-store.s3.amazonaws.com/0/2075/e94cd17c-361e-7e98-7c3e-eee7ea061f3c.png "Untitled.png")
Test::Without::Module で一時的にモジュールを無効化する

前振り
-------

こんにちは。昨年は初めての Perl Advent Calendar 参加で舞い上がってしまい場違いな投稿をしてしまったと反省していた @yak_ex です。

というわけで、今年はちゃんと TIps の紹介をしたいと思います。ぶっちゃけタイトルだけ見て「あぁそういうモジュールがあるんだ」（もしくは「知ってる」）でほぼ終わってもらっていい気もしますが、[Test::Without::Module](https://metacpan.org/pod/Test::Without::Module) というモジュールの紹介です。

Test::Without::Module
---------------------------

モジュールを書いている場合、広い環境をサポートするためだとか、必須ではなくあくまでも追加機能としてだとかで、たまにオプショナルな依存を持つモジュールを書くことがあります。あるいは Hoge::Any 系を使っている場合なんかも（どのモジュールに依存するかが確定しないという意味で）間接的にオプショナルな依存を持っているとも言えますね。

さて、こうした場合、開発している側の環境は大抵オプショナルな依存モジュールも既にインストールされてしまっています。で、 オプショナルな依存モジュールが利用できない場合のコード/テストも書いたけどどうやってテストしようか、ということになるわけです。[local::lib](http://metacpan.org/pod/local::lib)、[perlbrew](http://perlbrew.pl/)、別ユーザー、別ホストとかで環境作るのもありですが、ちょっと面倒ですよね。そこで Test::Without::Module です。例えば [YAML::Any](http://metacpan.org/pod/YAML::Any) のバックエンドが全てインストールされているとして、

```console
> perl -ML -E 'say YAML::Any->implementation'
YAML::XS
```

となるわけですが（ワンライナーだしってことで横着して use を省略できるモジュール [L](https://metacpan.org/pod/L) を使っちゃってます）、以下のようにすると…

```console
> perl -ML -E 'use Test::Without::Module qw(YAML::XS); say YAML::Any->implementation'
YAML::Syck
> perl -ML -E 'use Test::Without::Module qw(YAML::XS YAML::Syck); say YAML::Any->implementation'
YAML::Old
```

…となります。use のリストのところに無効化したいモジュール名を並べればよいわけです。*.t に入れてしまえばオプショナルな依存モジュールが利用できない場合のテストを書けますが、さらに便利だと思っているのは以下のようにワンライナーで使う形式です。

```console
> perl -MTest::Without::Module=YAML::XS,YAML::Syck -I lib t/hoge.t
```

その場で一時的にモジュールを無効化することができ、開発中のテスト等で大変便利です。

まとめ
------

本稿では、一時的にモジュールを無効化できる Test::Without::Module を紹介しました。ニッチなニーズではありますが、そのニーズに対しては大変便利なモジュールだと思います。

明日は @myfinder さんです。お楽しみに。
ディレクトリ内にある全ファイル/ディレクトリを列挙する

```cpp
#include <iostream>
#include <algorithm>
#include <filesystem> // std::tr2::sys::path etc.

using namespace std;

int main() {
    namespace sys = std::tr2::sys;
    sys::path p("."); // 列挙の起点
    std::for_each(sys::directory_iterator(p), sys::directory_iterator(),
    //  再帰的に走査するならコチラ↓
    //  std::for_each(sys::recursive_directory_iterator(p), sys::recursive_directory_iterator(),
        [](const sys::path& p) {
            if (sys::is_regular_file(p)) { // ファイルなら...
                cout << "file: " << p.filename() << endl;
            } else if (sys::is_directory(p)) { // ディレクトリなら...
                cout << "dir.: " << p.string() << endl;
            }
        });
}
```

実行例:

```
file: ConsoleApplication1.vcxproj
file: ConsoleApplication1.vcxproj.filters
file: ConsoleApplication1.vcxproj.vspscc
dir.: ./Debug
dir.: ./Release
file: Source.cpp
file: trial.txt
```

[追記] ワイド文字版はコチラ

```cpp
int main() {
    namespace sys = std::tr2::sys;
    sys::wpath p(L"."); // 列挙の起点
    std::for_each(sys::wdirectory_iterator(p), sys::wdirectory_iterator(),
    //  再帰的に走査するならコチラ↓
    //  std::for_each(sys::wrecursive_directory_iterator(p), sys::wrecursive_directory_iterator(),
        [](const sys::wpath& p) {
        if (sys::is_regular_file(p)) { // ファイルなら...
            wcout << L"file: " << p.filename() << endl;
        }
        else if (sys::is_directory(p)) { // ディレクトリなら...
            wcout << L"dir.: " << p.string() << endl;
        }
    });
}
```
Mac OS X 10.8以降で一時的にスリープを抑制するコマンド: caffeinate


自分のブログに書いたのでそちらをご覧ください。

[Mac OS X 10.8以降で一時的にスリープを抑制するコマンド: caffeinate | Re: no subject](http://henry.animeo.jp/wp/?p=1910)
D言語の用語の日本語訳について

２日連続申し訳ございません。
この内容は21日にとっておきたかったのですが、なんとしてでもD言語 Advent Calendarを終わらせたくなかったので、頑張って30分以内に書きました。(執筆開始時刻23:31分)


## どう訳せばいいんだ…

私はd-manualというD言語の入門記事を書いていますが、懸念される問題として、たぶん3番目くらいに困ることが、難しい用語の日本語訳です。
例えば、eponymous templateですが、こいつはカタカナで書くことも厳しい用語です。


## 慎重に

「訳す」という行為は、非常に慎重に行わなければいけません。
野球の各用語を日本語に訳した正岡子規は素晴らしいですが、私は素晴らしくないので、D言語ユーザーの皆様も一緒に考えて欲しいのです。


## 分からない用語リスト

とりあえず以下にリストを示しておきますので、どのように訳すかの提案はこの記事へのコメントか、できれば[訳語や語句の統一と訳語一覧表 · Issue #26 · k3kaimu/d-manual](https://github.com/k3kaimu/d-manual/issues/26)までお願いします。
「そもそも訳さなくていいじゃん」というような意見も大歓迎です。
よろしくお願いします。

* eponymous template
* shared function/class
* final switch/function/class