OmniAICreator/Qiita-1.07M huggingface dataset:
RubyからSkypeのAPIを叩くメモ(Mac限定)

**rb-skypemacをインストール**
gem installで入るのは古いので
https://github.com/r7kamura/rb-skypemac
こちらをcloneして
% gem build rb-skypemac.gemspec
% gem install rb-skypemac-0.3.2.gem
でインストール

**とりあえず試す**
http://d.hatena.ne.jp/koseki2/20090405/skypesh
こちらのskypeshをそのまま使ってみた

**ステータス取得**
> GET USERSTATUS

**退席中にする**
> SET USERSTATUS AWAY

**入っているチャットのリストを取得**
> SEARCH RECENT CHATS

**最近のチャットメッセージIDを取得**
> GET CHAT #chat_owner/$chat_member;xxxxxxxxxxxxxxx RECENTCHATMESSAGES

**チャットの発言内容を取得**
> GET CHATMESSAGE 1234567 BODY

**チャットに発言する**
>> CHATMESSAGE #chat_owner/$chat_member;xxxxxxxxxxxxxxx このメッセージはrubyから送信しました

何がしたいかと言うとiPhoneのスカイプが重いので、jsonかなんかにしてhttpで取得したい・・・
SPIRE.IOのQuick Start

[SPIRE.IO]( http://www.spire.io/)というチャットのサービスをクライアントサイドを記述するだけで実現できるというサービスを試してみたのでその内容をまとめておきます。

基本的には[Quick Start](http://www.spire.io/docs/quick-start.html)の内容になります。

下記のHTMLを用意します。ファイル名を`index.html`とします。

```html:index.html
<html>
  <head>
    <script type='text/javascript' lang='javascript' src='http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js'></script>
    <script type='text/javascript' lang='javascript' src='./javascript/spire.io.bundle.min.js'></script>
    <script type='text/javascript' lang='javascript' src='./javascript/application.js'></script>
  </head>
  <body>
  </body>
</html>
```

必要なライブラリをダウンロードします。

```
$ curl https://raw.github.com/spire-io/spire.io.js/master/browser/spire.io.bundle.min.js > javascript/spire.io.bundle.min.js
```

`javascript/application.js`を下記の内容にします。

```javascript:application.js
$(document).ready(function() {
  var Spire = require('./spire.io.js');
  var spire = new Spire();
  spire.start("ACCOUNT_SECRET_GOES_HERE", function (error) {
    if (!error) {
      spire.subscribe(["test"], {min_timestamp:'now'}, function(messages) {
        $(messages).each(function(i,message) {
          $('body').append("<p>" + message.content + "</p>");
        });
      });
      spire.publish("test","Greetings Earthling!");
    }
  });
});
```

試すためにSPIRE.IOに[サインアップ](http://www.spire.io/register.html)が必要です。サインアップしたら[Account]から[API Screts]をコピーします。`application.js`の[ACCOUNT_SECRET_GOES_HERE]にペーストとします。

`index.html`をブラウザで表示して、"Greetings Earthling!"という文字が表示されます。これはこの文字列をサーバに送信してその内容を受け取って表示している状態になります。
画像の大きさを取得したい（んだけど、うまくいかない）

これだとコンソールには0,0てでて、width/heightが取得できない。
.height(100)とかすると大きさは変わる。

```javascript
$('.hoge').each(function (i) {
    var image = $(this).find('img');
    var w = image.width();
    var h = image.height();
    console.log(w,h);
  });
});
```
cd コマンドで、別ドライブのディレクトリに一発で移動する (cd /d)

Windowsのコマンドプロンプトで、現在のディレクトリだけでなく、現在のドライブも変更するには /d オプションを使用します。

```bat
D:\>cd /d C:\GnuWin32\GetGnuWin32\bin

C:\GnuWin32\GetGnuWin32\bin>
```

地味に便利。
typeofを改善したtypeOf()関数

undefinedやnullもちゃんと判別できる、よくあるやつ。

```javascript:typeof演算子の改良版
function typeOf(x) {
    if (x === null) return 'null';
    if (x == null) return 'undefined';
    var type = typeof x, c = x.constructor;
    if (type === 'number') {
        if (isNaN(x)) return 'NaN';
        if (!isFinite(x))
            return x === Infinity ? 'Infinity' : '-Infinity';
    }
    if (type === 'object') {
        return c && c.name ? c.name :
            Object.prototype.toString.call(x).slice(8, -1);
    }
    return type;
}
```

```javascript:typeOfの戻り値
console.log(typeOf(undefined));         //'undefined'
console.log(typeOf(null));              //'null'
console.log(typeOf("str"));             //'string'
console.log(typeOf(new String("str"))); //'String'
console.log(typeOf(true));              //'boolean'
console.log(typeOf(new Boolean(true))); //'Boolean'
console.log(typeOf(1));                 //'number'
console.log(typeOf(NaN));               //'NaN'
console.log(typeOf(Infinity));          //'Infinity'
console.log(typeOf(-Infinity));         //'-Infinity'
console.log(typeOf(new Number(1)));     //'Number'
console.log(typeOf(function(){}));      //'function'
console.log(typeOf([]));                //'Array'
console.log(typeOf(/aaa/));             //'RegExp'
console.log(typeOf(new Date));          //'Date'
console.log(typeOf(document));          //'Document'
console.log(typeOf({}));                //'Object'
console.log(typeOf(Object.create(null)));   //'Object'
console.log(typeOf(new function Hoge(){})); //'Hoge' IEでは'Object'
```

細かいことを言えばNaNやInfinityはnumber扱いでいいのかみたいな話もあるし、1とnew Number(1)が違う扱いになっているのは逆に不便だったりするかも。
実務で使ったことがないので、間違ってたら教えてください。
Inverse FizzBuzz in Ruby

エレガンスからは程遠いですが..

``` ruby
# Inverse FizzBuzz
def fizzbuzz(n)
  x = ""
  x << "Fizz" if n%3 == 0
  x << "Buzz" if n%5 == 0
  x.empty? ? n : x
end

def map_upto(max, f)
  (1..max).map { |n| f[n] }
end

def be_short(item)
  case item
  when 'Fizz', 'Buzz'; item.chr
  when Integer; 0
  else 'z'
  end
end

def fizzbuzz_string(max)
  map_upto(max, method(:fizzbuzz)).map { |item| be_short item }.join
end

def find_seq(*sequence)
  short_seq = sequence.map { |item| be_short item }
  str = fizzbuzz_string(100)
  min = Float::INFINITY
  pos = 0
  while pos = str.index(/#{short_seq.join('\d*')}/, pos)
    m = $&
    if m.size < min
      res = [*pos+1..pos+m.size]
      min = m.size
    end
    pos += 1
  end
  res
end

find_seq('Fizz') # => [3]
find_seq('Buzz') # => [5]
find_seq('Fizz', 'Buzz') # => [9, 10]
find_seq('Buzz', 'Fizz') # => [5, 6]
find_seq('Fizz', 'Buzz', 'Fizz') # => [3, 4, 5, 6]
find_seq('Fizz', 'Fizz') # => [6, 7, 8, 9]
find_seq('Fizz', 'Fizz', 'Buzz') # => [6, 7, 8, 9, 10]
find_seq('Buzz', 'Fizz', 'Buzz') # => nil
```
Git で複数のリポジトリをまとめたり、逆に切り出したりする

## ~/repo1 と ~/repo2 をまとめる
2つのリポジトリをまとめて1つのリポジトリにしたいとき。

~~~
cd ~/repo1
git remote add repo2 ~/repo2
git fetch repo2

git merge repo2/master
~~~

## ~/repo1/subdir に ~/repo2 を入れる
あるリポジトリのサブディレクトリに別のリポジトリの中身を入れたいとき。たとえば、あるリポジトリのサブディレクトリを切り出して別のリポジトリとして管理しているものを、元のリポジトリに合流させたいとき。

~~~
cd ~/repo1
git remote add repo2 ~/repo2
git fetch repo2

# サブディレクトリの内容に repo2 の内容をマージする
# （repo2 と内容が似ているサブディレクトリを自動で判別）
git merge -s subtree repo2/master

# ↑でうまくいかないときにはパスを指定する↓
git merge -X subtree=subdir repo2/master

# そもそも ~/repo1/subdir が存在しないときには↓
git read-tree --prefix=subdir/ repo2/master
git checkout -- .
~~~

## ~/repo1/dir1 と ~/repo1/dir2 をマージする
（タイトルからは外れるが）同一リポジトリ内の2つのサブディレクトリをマージしたいとき：http://qiita.com/uasi/items/545665066619d8cb8dbe

## ~/repo1/subdir を ~/repo2 として切り出す
あるリポジトリのサブディレクトリを別のリポジトリとして管理したいとき。

~~~
git clone ~/repo1 ~/repo2
cd ~/repo2
git filter-branch --subdirectory-filter subdir HEAD
~~~

余談：ここで `git clone` の代わりに `git-new-workdir` を使ってはいけない（[コメント参照](http://qiita.com/uasi/items/77d41698630fef012f82#comment-441deaa42dc8087ca414)）

参考にしたページ：

- [git、複数のリポジトリをまとめる - &lt;s&gt;gnarl,&lt;/s&gt;技術メモ”’&lt;marquee&gt;&lt;textarea&gt;￥](http://d.hatena.ne.jp/gnarl/20120111/1326270674)
- [gitリポジトリのサブディレクトリを別のリポジトリとして抽出する方法 – 拡張現実ライフ](http://akio0911.net/archives/3421)
`rbenv: rails: command not found`の対処方法

## 状況

* rbenvを使ってる
* いつのまにか古いRails（rails-0.9.5）がインストールされてた
* `$ gem uninstall rails -v 0.9.5`で古い方を削除
* 念のため`$ gem install rails && rbenv rehash`
* なのに`rails`コマンドでタイトルのエラーが発生

## 対処方法

railtiesをインストールすれば良い。

	$ gem install railties && rbenv rehash

（参照）[sstephenson / rbenv - rbenv: rails: command not found](https://github.com/sstephenson/rbenv/issues/73#issuecomment-4104683)


## ちなみに

`$ which rails`すると`~/.rbenv/shims/rails`を向いていると思う。
これはrbenvがrailsコマンドをラップしたもので、実体がどこにあるかは`$ rbenv which rails`で調べることがでる。
で、それは`~/.rbenv/versions/1.9.2-p290/lib/ruby/gems/1.9.1/gems/railties-3.2.3/bin/rails`あたりを向いている。

今回`$ gem install rails && rbenv rehash`をしても効果がなかったのは、

* rails gem は railties gem とか activerecord gem とかをまとめてインストールするためのgemであって`rails`コマンドの配置はしない
* 一方`rails`コマンドを配置する railties gem はインストール済みであったために再度配置することはなく、`rails`コマンドはuninstallで消されっぱなし

ってことじゃないかなぁ。たぶん。
git pullしてきたら自動的にbundle install


~~~~
$ cd PROJECT_ROOT
$ vim .git/hooks/post-merge
~~~~

~~~~bash:.git/hooks/post-merge
#!/bin/sh

cd PROJECT_ROOT && bundle install
~~~~

一回bundle実行して.bundle/configが生成されている前提。あとはこれに実行権限を付けてやる

~~~~
$ chmod +x .git/hooks/post-merge
~~~~
Macアプリでホットキー設定機能を作る

Evernoteなどで使われている[ShortcutRecorder](http://shortcutrecorder.googlecode.com/)を使うのが良さそう．

## バージョン
```bash
$ svn log -l 1
------------------------------------------------------------------------
r80 | chris@growl.info | 2012-04-24 03:42:21 +0900 (火, 24  4 2012) | 2 lines

Updating Greek and French

------------------------------------------------------------------------
```


## ダウンロード
`svn checkout http://shortcutrecorder.googlecode.com/svn/trunk/ shortcutrecorder-read-only
`

## ビルド
`ShortcutRecorder.xcodeproj`を開きArchiveする．
アーカイブ後になぜかOrganizerが立ち上がらないので，ビルドメッセージを頼りに`~/Library/Developer/Xcode/DerivedData/ShortcutRecorder-XXXXXXX/ArchiveIntermediates/ShortcutRecorder.framework - with embedded ibplugin/Frameworks`とかにあるやつをコピーした．なぜだ…

## ドキュメント
ない．`ShortcutRecorder.h`を見ればだいたいわかるはず．

## 使い方
### インターフェースビルダー
[GettingStartedInSVNTrunk](http://code.google.com/p/shortcutrecorder/wiki/GettingStartedInSVNTrunk)を参考にする．Xcode 4用のIB pluginはなさそう．
UIView(高さ22，幅は150以上ぐらいがよい)を適当な場所に置き，クラス名を`SRRecorderControll`とする．適当にdelegateを設定する．

### コード
変更を設定に保存するには以下のような感じ．実際にホットキーで何か処理するには，
[アクティブでないアプリの特定アクションをホットキーで実行する - Qiita](http://qiita.com/items/b461cee7a69c2aca8ae4)で説明しているDDHotKeyCenterを使えばよい．

```objectivec
- (void)shortcutRecorder:(SRRecorderControl *)aRecorder keyComboDidChange:(KeyCombo)newKeyCombo {
  unsigned short keyCode = newKeyCombo.code;
  NSUInteger flags = newKeyCombo.flags;
  // Register a hotkey
  SEL selector = @selector(newItem:);
  DDHotKeyCenter *ddhkc = [[DDHotKeyCenter alloc] init];
  [ddhkc unregisterHotKeysWithTarget:[NSApp delegate] action:selector];
  if (![ddhkc registerHotKeyWithKeyCode:keyCode modifierFlags:flags target:[NSApp delegate] action:selector object:nil]) {
    NSLog(@"Failed to register the hotkey for new items");
  }
  // Save the keycombo to user settings
  NSDictionary *keyComboDict = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithUnsignedShort:keyCode], @"keyCode", [NSNumber numberWithUnsignedInteger:flags], @"flags", nil];
  NSString *key = @"KeyCombo";
  [[NSUserDefaults standardUserDefaults] setObject:keyComboDict forKey:key];
}
```
ViewFlipperとViewAnimationが干渉する

親View
+-ViewFlipper

なとき、親ViewのViewAnimationが再生された後、ViewFlipperのアニメーションの描画が変になる。
ただしViewAnimation#setFillAfter(true)したとき。

多分setFillAfter(true)していると親Viewの座標計算などが毎フレームされているか何かで、毎フレームキャッシュか何かを再描画しているためではと考えられる。

対応策：まだわかっていません。
配列からランダムにn個の値を取得

array_rand($array, n);

```php
$myArr = array('A', 'B', 'C', 'D');
$num = array_rand($myArr, 1);
$numArr = array_rand($myArr, 2);

echo $num; // 3
echo $numArr[0]; // 2
echo $numArr[1]; // 3

echo $myArr[num]; // D
echo $myArr[numArr[0]]; // A
```
実行時に"Could not find class 'xxx.xxx', referenced from method"というエラーが出るとき

コンパイルは問題なく通るのに実行時にこのエラーが出るときの話。
プロジェクトのプロパティ -> Java のビルド・パス -> 順序およびエクスポート
と辿ると該当するJARのチェックが外れているはず。
チェックを入れて設定を保存すればOK。
チェックを入れてもダメな場合は「順序およびエクスポート」で順序を上にすればOK。
mixi の日記を全消去する

黒歴史をなかったことにしたかった。一度消すと復旧できないので注意。

使い方
---

`delete_mixi_diary.pl [--email=your-account@example.com] [--password=your-mixi-password]`

オプションで指定する代わりに `~/.delete_mixi_diary` という設定ファイルを書いても OK:

```perl
+{
  email => 'your-account@example.com',
  password => 'your-mixi-password',
}
```

コード
---

```perl:delete_mixi_diary.pl
#!/usr/bin/env perl

use 5.014;
use strict;
use warnings;
use opts;
use File::HomeDir;
use Path::Class;
use WWW::Mixi::Scraper;

opts my $email => +{ isa => 'Str' },
  my $password => +{ isa => 'Str' };

my $home = dir(File::HomeDir->my_home);
my $config_file = $home->file('.delete_mixi_diary');
my %config = %{ -e $config_file ? eval($config_file->slurp) : +{} };

# Command line option takes precedence over config file.
$config{email} = $email if defined $email;
$config{password} = $password if defined $password;

for my $param (qw/email password/) {
  die qq/Specify mandatory parameter "$param"/ unless $config{$param};
}

my $mixi = WWW::Mixi::Scraper->new(mode => 'TEXT', %config);

sub diary_id_for {
  my $diary_meta = shift;
  $diary_meta->query =~ /id=(\d+)/;
  $1
}

my $num_deleted = 0;
my $num_failed = 0;
while (my @diaries = $mixi->list_diary->parse(page => 0)) {
  die 'Server returned an error status' if $num_failed > 3;

  my @diary_ids = map { diary_id_for $_->{link} } @diaries;
  my $mech = $mixi->{mech}{mech};
  $mech->tick(diary_id => $_) for @diary_ids;
  $mech->submit;  # on list_diary.pl
  unless ($mech->success) {
    ++$num_failed;
    next;
  }
  $mech->submit;  # on delete_diary.pl
  unless ($mech->success) {
    ++$num_failed;
    next;
  }
  $num_deleted += @diary_ids;
}

warn "$num_deleted diaries have been deleted.\n";
```
任意のディレクトリの下で rpmbuild する

一般ユーザで `rpmbuild` するときにはホームディレクトリの `.rpmmacro` ファイルで 

```.rpmmacro
%define _topdir ~/rpm
```

などとして自分のホームディレクトリ下でビルドするのがお作法だけれども、ビルドサーバなど、共有環境でパッケージングしようと思うとちょいと不便。チェックアウトしたディレクトリの下でビルドを完結させたい！

`man` には `--rcfiles` 位しか使えそうなオプションが無くて絶望し、それでも諦めきれずに `rpmbuild --help`  の方を見ていたら

```
  -D, --define='MACRO EXPR'     define MACRO with value EXPR
```

 と言うマクロを定義するオプションを発見。

こんな感じでやってみたら動いた。よしよし。

```sh
mkdir -p build/{SOURCES,BUILD,SPECS,RPMS,SRPMS}
cp $SRC.tar.gz build/SOURCES
rpmbuild -D "_topdir ${PWD}/build" -bb $SRC.spec
```
MacPortsのsubversionを1.6に戻した

MacPortsで管理しているsubversionが1.7だったので以前にcheckoutした作業コピーに対してsvn upgradeしてくださいと言われた。
サーバーのリポジトリは作業コピーをsvn upgradeしても影響ないのかな？
upgradeした作業コピーが1.6のクライアントで使えないだけで。
今回はインストールしているsubversionを1.6に戻すことに。

```
svn co http://svn.macports.org/repository/macports/trunk/dports/devel/subversion --revision r80777 svn
cd svn
sudo port install
```

どうやらrevision r80777が1.6の最後のようです。
1.7のdeactivateと1.6のactivateもしてくれた。
RSpec without Railsなspec_helper


rspec-railsに頼りっきりで素RSpecの仕組みが理解不足だったためメモ。

最低限必要なrequireは以下の通り

1. require 'rubygems' => 'bundler/setup'
2. require 'rspec'
3. require programs should be tested.

~~~~~ruby:spec/spec_helper.rb
require "rubygems"
require "bundler/setup"
require 'rspec'
Dir[File.join(File.dirname(__FILE__), "..", "app", "**/*.rb")].each{|f| require f }

RSpec.configure do
  # ...
end
~~~~~~

* spec/というディレクトリ名はrspecが決め打ちしているため従った方が無難。
* `app/hoge/fuga.rb`や`app/nyarla/thotep.rb`がある想定。
    * `app/**/*.rb` を一気にrequireしている

ここで設定した`spec_helper.rb`も別に自動に読み込まれるわけではなく、

~~~~ruby:spec/nyarla/thotep_spec.rb
require 'spec_helper'
~~~~

としてやる必要がある。
cURL でレスポンスヘッダを表示する

-Iオプションまたは--dump-header(-D) オプションを使用する．--dumper-headerオプションは出力先ファイルをパラメータで指定するので，- を指定することで標準出力に表示させる．

```
$ curl --dump-header - http://www.w3c.org/
HTTP/1.1 301 Moved Permanently
Cache-Control: no-cache
Content-length: 0
Location: http://www.w3.org/
Connection: close

```
ddコマンドの完了状況、コピー速度を知りたい

``````````bash
root:# dd if=/dev/sdf of=/dev/null
```````````

バックグラウンドに回す(ctrl+Z -> bg) などして、USR1シグナルを送ればいい。

``````````bash
root:# killall -USR1 dd
791338977+0 records in
791338976+0 records out
405165555712 bytes (405 GB) copied, 5084.63 s, 79.7 MB/s
``````````
emacsのプラグイン置き場、MELPAに自作の.elを登録する


[duplicate-thing.el](http://d.hatena.ne.jp/tuto0621/20120321/1332329935) というプラグインをMELPA経由でインストール出来るようにするまでのメモ

MELPAに上げるとバージョンアップ時の更新がとても簡単になります。(githubのmasterにコミットするだけでバージョンアップ完了) Emacs24ではpackage.elが標準搭載されるようですし、手持ちの.elがあればアップロードしておくとたくさんの人に使ってもらえる確率が上がりそうです。

# melpaをforkしてcloneする
* [milkypostman/melpa](https://github.com/milkypostman/melpa) を fork
* fork したものを git clone 

# recipes/duplicate-thing を追加
* dulicate-thing.elの場合、こんな感じ - [6878e9c](https://github.com/ongaeshi/melpa/commit/6878e9cfc903567d4a812451b674ce89e5703d48)
* 詳しくはこちらを参照 - [melpa/README.md](https://github.com/milkypostman/melpa/blob/master/README.md)

# 動作確認
README.md にある

```
$ ./buildpkg 
```
が失敗したので、以下の方法で確認。

1. M-x load-file package-build.el
2. M-x pacage-build-archive duplicate-thihng

要はスクリプト内の処理を直接Emacsで行っているだけです。

# ソースコードを整える
- 先頭にコメント追加- [42b8010fc](https://github.com/ongaeshi/duplicate-thing/commit/42b8010fc6cc3a333a5bc6328020d30d3239e57d)
- autoloadマクロの挿入- [f6ed0232](https://github.com/ongaeshi/duplicate-thing/commit/f6ed0232fd0653621afe450d53775a32a9d0e328) 

# コミットしてpull request
一時間位でpullしてもらえました。

[Pull Request #118: duplicate-thing by ongaeshi · milkypostman/melpa](https://github.com/milkypostman/melpa/pull/118)
LINQを使って、指定個数ランダムで取り出すには

配列からランダムに指定個数選択するには、

* .OrderBy()にGUIDを与えてランダムソートし、
* .Take() で指定個数取得すれば良い

```csharp:RandomTake.cs
using System;
using System.Collections.Generic;
using System.Linq;

IEnumerable<string> lines = new string[] {"1","2","3","4","5","6","7","8","9","10"};
IEnumerable<string> newLines;

newLines = lines.OrderBy(i => Guid.NewGuid()).Take(3);

foreach(var line in newLines)
{
  Console.WriteLine(line);
}
```
Emacs の dired でファイルを拡張子に適したアプリケーションで開く(Ubuntu)

以下のコードを .emacs に記述すれば、dired で o を入力したときに、カーソル位置のファイルを Nautilus でダブルクリックしたときと同じアプリケーションで開ける。

```cl
(defun dired-open-file ()
  "In dired, open the file named on this line."
  (interactive)
  (let* ((file (dired-get-filename)))
    (message "Opening %s..." file)
    (call-process "gnome-open" nil 0 nil file)
    (message "Opening %s done" file)))

(define-key dired-mode-map "o" 'dired-open-file)
```
anything 導入時の describe-bindings で全てのキーバインドを表示する

Emacs 使いにはお馴染みの anything を導入すると、describe-bindings が descbinds-anything.el に置き換えられ、キーバインド一覧を anything インターフェイスで利用できる。

この describe-bindings、各モードにつきキーバインド最大表示数が 50 に制限されているため、一度に全てのキーを一覧表示することができない。その挙動に納得がいかなければ以下のコードを .emacs に記述すればよい。

```cl
(add-to-list 'descbinds-anything-source-template '(candidate-number-limit . 9999))
```

9999 は各モードの最大表示数なので、好みやスペックに合わせて好きな数に設定するのがいいだろう。
Listの要素をある条件で絞り込む

あるListから、その中の特定の条件を満たす要素だけを含んだListを作りたいという場合はGuavaライブラリのIterables.filterを使うと幸せになれる。

```java
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;

...
List<SomeObject> original = ...;
List<SomeObject> filteredList = ImmutableList.copyOf(Iterables.filter(
    original, new Predicate<SomeObject>() {
        @Override
        public boolean apply(SomeObject input) {
            // ここで返り値がtrueになる要素だけが結果に含まれるようになる。
            ...
        }
    }));
```
vimでペーストするときインデントさせない

vimでプログラムをペーストするときにそのままだと自動的にインデントがかかって、
下に行くほどコードが右に寄ってしまう。

そんな時、自動的にインデントせずにペーストするには、

1. ":a!"
2. ペースト
3. エスケープキー

でペーストできるみたい。

ちなみに":i!"だとインサートモードでペーストになります。
ファイルの中の文字列を再帰的に一発置換

```
find . -type f -print0|xargs -0 perl -i.org -ple 's/foo/bar/g'
```

ぐぐれどぐぐれどうまくいくやつがなかった(エスケープ文字かなんかでひっかかってた?)けど、これだとうまくいった。
What return height size by IE, backCompat IE?


```javascript
var body = document.body,
	html = document.documentElement;


//document.compatMode === backCompat
body.clientHeight //=> viewport size.
body.scrollHeight //=> contents size.
body.offsetHeight //=> viewport size.

html.clientHeight //=> 0;
html.scrollHeight //=> viewport size.
html.offsetHeight //=> viewport size.

//document.compatMode === CSS1compat
body.clientHeight //=> contents size.
body.scrollHeight //=> contents size.
body.offsetHeight //=> contents size.

html.clientHeight //=> viewport size.
html.scrollHeight //=> contents size.(larger)
html.offsetHeight //=> viewport size.
```
バッファの切替

バッファの切替を便利にするために、設定ファイルに下記を追加します。

```common-lisp:.emacs.d/init.el
(ido-mode 1)
(ido-everywhere 1)
```

`C-x b`でデフォルトだと前方一致で補完だったのが、部分文字列に一致する候補を並べてくれます。文字列を入力して、`C-s`で次候補、`C-r`で前候補を選択してくれます。
ショートカットファイルを作成する

FileCreateShortcutコマンドで、ショートカットファイルを作成する

## 例：スタートアップフォルダに、start.ahk ファイルのショートカットを作成する

```ahk:make_shortcut_to_startup.ahk
FileCreateShortcut startup.ahk, %A_Startup%\startup.ahk.lnk
```
buffered_job

いくつかのジョブを一定期間バッファリングしておき、実行時に同じようなメソッドがあったら、別のメソッドをよびだす、という処理をするgemを書きました。

https://github.com/sawamur/buffered_job

## 想定シナリオ

たとえばブログ的なサービスを運営していたとして、各記事にコメントがついたときにメール通知をしたいとします。コメント毎にメール通知していると人気のあるユーザーには毎回大量の同じようなメールがとんでしまいます。一定時間(例えば２〜３分)バッファリングしておき、同じような内容が複数存在する時には別のメソッドで受け取って本文中に展開して一通で送る、といった処理を実現するためのモジュールです

例えば下記のような処理があった場合

```ruby
@article = Article.create(:user => @user,:text => "my blog article here")
c = @article.comments.create(:user => @jon, :text => "i love this article!")
@user.notify(c)
```

メソッドの実行をバッファしておくことにより、一定時間後に別のmerge_を頭につけたメソッドが配列になった対象オブジェクトとともに該当レシーバに送られます


```ruby
c1 = @article.comments.create(:user => @jon, :text => "i love this article!")
c2 = @article.comments.create(:user => @ken, :text => "i hate this article!")

@user.buffer.notify(c1)
@user.buffer.notify(c2)
 # ここで一定期間がたつと、notifyメソッドの変わりにmerge_notifyメソッドがよばれる。
@user.merge_notify([c1,c2])  # <- これと同等の処理が実行される
```

## インストール

```ruby:Gemfile
gem 'buffered_job'
```

そして`bundle install`。または

```
$ gem install buffered_job
```


### 前準備　


テーブルの作成をします

```
$ (bundle exec) rails generate buffered_job
$ (bundle exec) rake db:migrate
```

### 依存関係

[delayed_job_active_record](https://github.com/collectiveidea/delayed_job_active_record)


## ジョブの実行

delayed_job経由で行います。 [delayed_job_active_record](https://github.com/collectiveidea/delayed_job_active_record)を参考に必要なテーブルなどセットアップしたのちにワーカーを動かしてください

```
$ (bundle exec) rake jobs:work
```


## 使い方

全てのActiveRecordオブジェクトは`buffer`メソッドを持ちます。bufferをレシーバーとメソッドの間に置いてください。

```ruby
@user.buffer.post_to_twitter(@article1)
@user.buffer.post_to_twitter(@aritcle2)
``` 

もしバッファリング期間後に同じレーシーバに対して、同じメソッドが複数回よばれていたら、引数を配列にまとめた上でmerge_をメソッド名の頭につけたメソッドがよびだされます。なので、この例では下記のメソッドをUserモデルに実装しておくひつようがあります

```ruby:app/modesl/User.rb
def merge_post_to_twitter(articles)
   #  ..
end
```

## 現在の制限

バッファするメソッドに渡す引数オブジェクトは一つに限定してます

## Configuration 

デフォルトのバッファ時間は3分です。変更するには下記

```
BufferedJob.delay_time = 30.seconds
```
Emacs のキーに一連の処理を割り当てる方法(及び便利なマクロ)

Emacs のキーには

```cl
(global-set-key (kbd "C-c r") 'query-replace)
```

のように既存関数を割り当てることができるが、引数が必要な関数や一連の処理を割り当てたい場合は以下のように lambda を使用することで割り当て可能(interactive も必要)。

```cl
(global-set-key (kbd "C-M-Z") (lambda () (interactive) (message "hoge")))
```

これを頻繁に記述するなら以下のようなマクロを定義するといいかもしれない。

```cl
(defmacro global-set-key-fn (key args &rest body)
  `(global-set-key ,key (lambda ,args (interactive) ,@body)))
```

これで先ほどのキー割り当てを以下のように書ける。

```cl
(global-set-key-fn (kbd "C-M-Z") nil (message "hoge"))
```
SQLをPHPの文字リテラルに変換するVimスクリプト


``` vim
"SQLのPHP文字リテラルへの整形
function! SQLToPHP()
  %s/^\(.\+\)$/"\1 " \./g
  normal G$
  execute "normal ?.<CR>"
  normal xxggVG
  echo "Convert to PHP String is finished."
endfunction
command! Sqltop :call SQLToPHP()

function! SQLFromPHP()
  %s/^"\(.\+\) " *\.*$/\1/g
  normal ggVG
  echo "Convert from PHP String is finished."
endfunction
command! Sqlfromp :call SQLFromPHP()

```

http://www.vim.org/scripts/script.php?script_id=294
https://github.com/vim-scripts/SQLUtilities

以上2つのプラグインを入れて、選択後。
:SQLUFormatter
をしたりするのと組み合わせるととても便利。
ORMを使おうという話はとりあえずおいておいて...。
モジュールをuseする前の処理を書く


```perl
use Test::More;
```

と

```perl
BEGIN {
  require Test::More;
  Test::More->import;
}
```

は等価である。

ところでBEGINブロックはコンパイル時に実行されるのでシーケンシャルに実行されない。

しかし、それぞれのBEGINブロックはコンパイル時にシーケンシャルに実行される。

つまり、`use Test::More` する前にコードを実行したい場合は **`use Test::More` の前に BEGIN ブロックを書く** 必要がある。
RubyMotion用の各種ライブラリ

ちょっと試した。

BubbleWrapは欠かせない。
UIの構築はTeacupとFormotionが良い感じ。
nitronはすごいけどテストが1行もないとの話を聞いたので使うのが怖い。

##[BubbleWrap](https://github.com/mattetti/BubbleWrap)

HTTP通信、ジェスチャ、通知センタなどなどを簡単に扱えるようにする。

##[nitron](https://github.com/mattgreen/nitron)

UITableViewControllerを簡単に作ることができる。

##[motion-live](https://github.com/irrationalfab/motion-live)

特定のファイルの変更をインタラクティブに反映できる。

##[motion-layouts](https://github.com/malkomalko/motion-layouts)
##[teacup](https://github.com/rubymotion/teacup)
##[SimpleView](https://github.com/seanho/SimpleView)
##[rubymotion_autolayout](https://github.com/jfahrenkrug/rubymotion_autolayout)
##[formotion](https://github.com/clayallsopp/formotion)

レイアウトを記述するDSLを提供。
Formotionが面白い。

##[rm-redgreen](https://github.com/mdks/rm-redgreen)

テスト結果に色を付ける。

##[hpple-motion](https://github.com/siuying/hpple-motion)

インターフェイスがnokogiriライクなXMLパーサ。

##[CoolButton](https://github.com/seanlilmateus/CoolButton)

コードだけでカッコいいボタンを作ることができる。

##[MotionModel](https://github.com/sxross/MotionModel)

Railsのモデルみたいなの。

##[NanoStoreInMotion](https://github.com/siuying/NanoStoreInMotion)

スキーマレスなKey-Valueストアを実現。
Google検索の鉄道運行情報をスクレイピングする

電車がちゃんと動いてるかをコードでチェックしたい時用
Google検索で「路線名　運行情報」と検索したときの結果をスクレイピングするテスト

```ruby:google-train.rb
# -*- encoding: UTF-8 -*-
require 'cgi'
require 'open-uri'
require 'nokogiri'
require 'date'
require 'json'

def get(word)
  base = "http://www.google.co.jp/search?num=1&lr=lang_ja&oe=utf-8&q="
  url = "#{base}#{CGI.escape(word+" 運行情報")}"
  html = open(url, 'User-Agent' => 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.52 Safari/536.5').read
  doc = Nokogiri(html)
  # 運行情報はtableになっている
  table_data = doc.css('.obcontainer').css('table td')
  # table tdを一行ごとに配列にする
  info_a = table_data.to_a.map!{|data| data.text}
  # 最後の一行は最終更新時刻である
  begin
    unixtime = DateTime.strptime(info_a[-1], "%m月%d日%H時%M分更新").to_time.to_i
  rescue
    # Googleで運行情報が出てこない路線名だとここでエラーになる
    p word+" はGoogleで調べられません"
  end 
  text = info_a[0..-2].join("")

  normal = false
  type = nil 
  if info_a.size === 2 and info_a[0].sub(word, "") === "に遅れの情報はありません。"
    # 問題のないときは一行目に「（路線名）に遅れの情報はありません。」と表示される
    normal = true
  else
    # 問題のあるときは一行目の【】に運行障害の種類が格納されている
    info_a[0] =~ /^【(.*)】/u
    type = $1
  end 
  info = {unixtime:unixtime, text:text, is_normal:normal, type:type}
end

lines = JSON.parse(open("lines.json").read)["response"]["line"]
lines.each do |word|
  result = get(word)
  p result if result[:is_normal] == false
  sleep 1
end
```

http://express.heartrails.com/api.html#line
のデータをもとに、Google検索で運行情報が出てこない路線名を修正した東京都内の路線名一覧

```javascript:lines.json
{"response":{"line":["JR中央線","JR中央本線","JR五日市線","JR京浜東北線","JR京葉線","JR八高線","JR南武線","JR埼京線","JR宇都宮線","JR山手線","JR常磐線","JR東海道本線","JR横浜線","JR横須賀線","JR武蔵野線","JR湘南新宿ライン","JR総武線","JR青梅線","JR高崎線","つくばエクスプレス","上越新幹線","京成押上線","京成本線","京成金町線","京急空港線","京急本線","京王線","京王新線","京王井の頭線","京王相模原線","京王高尾線","京王動物園線","京王競馬場線","北総線","小田急多
摩線","小田急小田原線","ゆりかもめ線","りんかい線","東京メトロ丸ノ内線","東京メトロ千代田線","東京メトロ半蔵門線","東京メトロ南北線","東京メトロ日比谷線","東京メトロ有楽町線","東京メトロ東西線","東京メトロ銀座線","東京メトロ副都心線","東京モノレール線","東北新幹線","東急世田谷線","東急多摩川線","東急大井町>線","東急東横線","東急池上線","東急田園都市線","東急目黒線","東武亀戸線","東武伊勢崎線","東武大師線","東武東上線","東海道新幹線","西武国分寺線","西武多摩>川線","西武多摩湖線","西武山口線","西武拝島線","西武新宿線","西武有楽町線","西武池袋線","西武西武園線","西武豊島線","都営三田線","都営大江戸線","都営新宿>線","都営浅草線","都電荒川線","長野新幹線","日暮里・舎人ライナー"]}}
```
Rails製CMS「Locomotive CMS」をHerokuで動かす

Locomotiveを[こちらの文書](http://doc.locomotivecms.com/installation/heroku)を参照にHerokuで動かしたのでその内容をまとめます。

Gemfielに下記の内容を追加します。

```ruby:Gemfile
gem 'locomotive-heroku', :require => 'locomotive/heroku'
gem 'thin', :group => 'production'
```

関連するgemをインストールします。

```
$ bundle install
```

gitリポジトリを初期化してherokuにアプリを作成します。

```
$ git init .
$ heroku create --stack cedar
$ heroku config:add BUNDLE_WITHOUT=development:test
$ heroku plugins:install https://github.com/heroku/heroku-labs.git
$ heroku labs:enable user_env_compile -a <YOUR APP NAME>
$ heroku config:add RUBY_VERSION=ruby-1.9.3-p125
$ heroku config:add PATH=bin:vendor/bundle/ruby/1.9.1/bin:/usr/local/bin:/usr/bin:/bin
```

ここでは自動でアプリ名を振っているので、`<YOUR APP NAME>`にはその自動で振られた名前をいれます。

MongoDBのアドオンを追加します。

```
$ heroku addons:add mongohq:free
```

`config/mongoid.yml`を編集します。

```ruby:config/mongoid.yml
production:
  uri: <%= ENV['MONGOHQ_URL'] %>
```

次に、メール配信の設定をします。メール配信用のアドオンを追加します。

```
$ heroku addons:add sendgrid:starter
```

`config/environments/production.rb`ファイルに下記を追加します。

```ruby:config/environments/production.rb
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
  :address        => 'smtp.sendgrid.net',
  :port           => 25,
  :authentication => :plain,
  :user_name      => ENV['SENDGRID_USERNAME'],
  :password       => ENV['SENDGRID_PASSWORD'],
  :domain         => ENV['SENDGRID_DOMAIN']
}
```

Locomotiveの設定ファイル`config/initializers/locomotive.rb`に下記を追加します。

```ruby:config/initializers/locomotive.rb
config.hosting = {
  :target     => :heroku,
  :api_key    => '<YOUR HEROKU API KEY>',
  :app_name   => '<YOUR HEROKU APP NAME>'
}
```

初期化時にassetsをプレコンパイルしないように`config/application.rb`に下記を追加します。

```ruby:config/application.rb
module YourApplication
  class Application < Rails::Application
    ...
    config.assets.initialize_on_precompile = false
    ...
  end
end
```

ローカルでassetsをプレコンパイルします。

```
$ bundle exec rake assets:precompile
```

リポジトリにソース類をコミットしてherokuにpushします。

```
$ git add .
$ git commit -am "launch it"
$ git push heroku master
```

ブラウザでサイトを開きます。

```
$ heroku open
```
Sublime Text2


# links
* [Sublime Text2 公式](http://www.sublimetext.com/2)
* [Public Draft - Sublime Text 2](http://publicdraft.studiomohawk.com/research/2012/04/14/01-02-sublimetext2/)
	* [Sublime Package Control](http://wbond.net/sublime_packages/package_control/installation)
* [Vintage Mode](http://www.sublimetext.com/docs/2/vintage.html)
* [Sublime Text 2 のススメ](http://blog.agektmr.com/2012/05/sublime-text-2.html)


# Command line
```
ln -s "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" ~/bin/subl
```

# Dropbox

```
mkdir -p ~/Dropbox/applications/SublimeText2
cd ~/Library/Application\ Support/Sublime\ Text\ 2 
mv * ~/Dropbox/applications/SublimeText2/
ln -s ~/Dropbox/applications/SublimeText2/Installed\ Packages ~/Library/Application\ Support/Sublime\ Text\ 2/Installed\ Packages
ln -s ~/Dropbox/applications/SublimeText2/Packages ~/Library/Application\ Support/Sublime\ Text\ 2/Packages
ln -s ~/Dropbox/applications/SublimeText2/Pristine\ Packages ~/Library/Application\ Support/Sublime\ Text\ 2/Pristine\ Packages
ln -s ~/Dropbox/applications/SublimeText2/Settings ~/Library/Application\ Support/Sublime\ Text\ 2/Settings
```

# Settings - User

```
{
    "color_scheme": "Packages/User/Railscasts.tmTheme",
    "font_face": "Bitstream Vera Sans Mono",
    "font_size": 14.0,
    "ignored_packages": [""],
    "vintage_start_in_command_mode": true,
    "translate_tabs_to_spaces": true,
    "vintage_ctrl_keys": true
}
```

# Key bind

* http://sublimetext.info/docs/en/reference/key_bindings.html
Emacs で作成した使い捨てファイルを簡単に開く

http://qiita.com/items/1d143b0b69e9aaf252ca で説明した open-junk-file.el だが、作成してバッファを閉じた後に再度開きたい時、ファイルパスをたどるのが面倒だったりする。

以下のコードを .emacs に書いておけば、`M-x open-last-junk-file` で最後に作成した使い捨てファイルを一発で開ける。

```cl
(require 'em-glob)
(defvar junk-file-dir "~/program/junk/")
(defun open-last-junk-file ()
  (interactive)
  (find-file (car
              (last (eshell-extended-glob (concat
                                           (file-name-as-directory junk-file-dir)
                                           "*/*/????-??-??-??????.*"))))))
```

(設定は上記 URL の設定に合わせているので、`"~/program/junk/"` や `"*/*/????-??-??-??????.*"` の部分は設定に合わせて書き換える必要がある。)

また、anything を導入しているなら、以下のコードで使い捨てファイルを一覧表示するという方法もある。

```cl
(require 'em-glob)
(defvar junk-file-dir "~/program/junk/")
(defvar junk-file-list
  (reverse (eshell-extended-glob (concat
                                  (file-name-as-directory junk-file-dir)
                                  "*/*/????-??-??-??????.*"))))
(defvar anything-c-source-junk-files
  '((name . "Junk Files")
    (candidates . junk-file-list)
    (type . file)))
(defun anything-open-junk-file ()
  (interactive)
  (anything-other-buffer 'anything-c-source-junk-files "*anything for junk file"))
(global-set-key (kbd "C-x M-j") 'anything-open-junk-file)
```

これで C-x M-j を入力すると使い捨てファイル一覧が anything で表示される。このコードでは新しいファイルを開きやすいように、リストに reverse をかけてから一覧表示している。
Emacs で使い捨てファイルを開く

Emacs には使い捨て用の *scratch* バッファがあるが、せっかく書いたコードが Emacs 終了と同時に消えてしまうのはもったいないし、不意に Emacs が落ちると面倒だ。

そこで open-junk-file.el を使用すれば、使い捨て用のファイルをすぐに開くことができる。インストール方法は以下の通り。

1. http://www.emacswiki.org/emacs/open-junk-file.el から open-junk-file.el を入手し、パスの通ったところに置く (auto-install を導入していれば `M-x install-elisp-from-emacswiki open-junk-file.el` などでもインストール可)。
2. .emacs に以下のような設定を記述。

```cl
(setq open-junk-file-format "~/program/junk/%Y/%m/%Y-%m-%d-%H%M%S.")
(global-set-key (kbd "C-x j") 'open-junk-file)
```

この設定を行えば、Emacs で C-x j を入力すると `Junk Code (Enter extension): ~/program/junk/2012/06/2012-06-04-152242.` のように表示され、拡張子を入力して RET を入力するだけで使い捨て用コードを開くことができる。
TortoiseSVNの差分viewerをでっち上げる

TortoiseSVNで管理しているバイナリファイルの差分を取るために差分viewerを適当に書いてみたのでメモを残しておきます。

## 概要

- TortoiseSVNの差分viewerをRubyで書いて、Exerbで実行ファイル化した。
- バイナリファイルを一旦テキストにしてから比較する。
- 差分の表示自体はWinMergeに丸投げ。

## スクリプト

Rubyで以下のようなスクリプトを書きました。以下のスクリプトは実際に動かしたものではありませんので、うまく動かなかったらごめんなさい。

```ruby:xxx_diff.rb
def xxx_to_str(file)
  # バイナリファイル file の内容を文字列にして返すようなことを書く。
end

require 'tempfile'
a = Tempfile.new("a_")
b = Tempfile.new("b_")
begin
  a.write(xxx_to_str(ARGV[0]))
  b.write(xxx_to_str(ARGV[1]))
  a.close
  b.close
  system "C:/Program Files/WinMerge/WinMergeU.exe", a.path, b.path
ensure
  a.close!
  b.close!
end
```

## スクリプトの実行ファイル化

幾つか方法があると思いますが、私はExerbを使いました。

```
> ruby -rexerb/mkexy xxx_diff.rb
(エラーが出るが省略)
> exerb xxx_diff.exy
```

これで ```xxx_diff.exe``` が出来上がります。

## TortoiseSVNの設定

TortoiseSVNの設定ダイアログから「外部プログラム > 差分ビューアー」の「高度な設定」ボタンを押して、差分の高度な設定ダイアログにて拡張子と先ほどの ```xxx_diff.exe``` を設定します。引数は不要です。

## 試す

あとはExplorer上のバイナリファイルのアイコンから差分表示を呼び出したり、ログから差分を表示したりすればいいと思います。
ドラッグ＆ドロップされた複数のファイルのパスを得るカスタムView


``` objectivec:DropView.h

#import <Cocoa/Cocoa.h>

@interface DropView : NSView

@end

``` 

``` objectivec:DropView.m

#import "DropView.h"

@implementation DropView

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
       
		[self registerForDraggedTypes:[NSArray arrayWithObjects:
									   NSColorPboardType, NSFilenamesPboardType, nil]];
    }
    
    return self;
}

- (void)drawRect:(NSRect)dirtyRect
{
    // Drawing code here.
}

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender {
    NSPasteboard *pboard;
    NSDragOperation sourceDragMask;
	
    sourceDragMask = [sender draggingSourceOperationMask];
    pboard = [sender draggingPasteboard];
	
    if ( [[pboard types] containsObject:NSColorPboardType] ) {
        if (sourceDragMask & NSDragOperationGeneric) {
            return NSDragOperationGeneric;
        }
    }
    if ( [[pboard types] containsObject:NSFilenamesPboardType] ) {
        if (sourceDragMask & NSDragOperationLink) {
            return NSDragOperationLink;
        } else if (sourceDragMask & NSDragOperationCopy) {
            return NSDragOperationCopy;
        }
    }
    return NSDragOperationNone;
}

- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender {
    NSPasteboard *pboard;
    NSDragOperation sourceDragMask;
	
    sourceDragMask = [sender draggingSourceOperationMask];
    pboard = [sender draggingPasteboard];
	
    if ( [[pboard types] containsObject:NSFilenamesPboardType] ) {
        NSArray *files = [pboard propertyListForType:NSFilenamesPboardType];
		NSLog(@"%@", files);
    }
    return YES;
}

@end

```
Emacs のミニバッファで C-w を入力したときに区切りまでの語を削除する

zsh では C-w を入力すると区切りまでの文字を削除することができる。Emacs のミニバッファで同じ事をやりたい場合は、以下のコードを .emacs に記述すればよい。これを書いてると C-x C-f などで非常に便利。

```cl
(define-key minibuffer-local-completion-map (kbd "C-w") 'backward-kill-word)
```
Ruby で $stdin を変更しても ARGF が変更されない？

\$stdin を StringIO にすると ARGF の対象 IO が変更されますが、ARGF.each_line を使用後は $stdin を変更しても ARGF の対象 IO が変更されなくて困っています。

```ruby
require 'stringio'

ARGF.file                       # => #<IO:<STDIN>>

$stdin = StringIO.new("hoge")
ARGF.file                       # => #<StringIO:0x82da3cc>

$stdin = StringIO.new("piyo")
ARGF.file                       # => #<StringIO:0x82da214>
ARGF.each_line do |l|
  l                             # => "piyo"
end

$stdin = StringIO.new("hogepiyo")
ARGF.file                       # => #<StringIO:0x82da214>
ARGF.each_line do |l|
  l                             # => 
end
```

上のコードだと、\$stdin を StringIO.new("piyo") にして ARGF.each_line を使用すると、$stdin を StringIO.new("hogepiyo") に変更しても ARGF.file が変わらない (ARGF.each_line で "hogepiyo" を読むことができない) という問題です。

each_line で ARGF を読み込んだ後、$stdin を変更することで ARGF を変更する方法について、わかる方がいれば教えていただけると幸いです。

ちなみに、上記コードの実行環境は `ruby 1.9.3p0 (2011-10-30 revision 33570) [i686-linux]` です。
iphoneで今見ているページをLINEで共有するブックマークレット

LINEの中の人に嫌がられるかどうかは不明

```javascript
javascript:var%20w=window.open('http://line.naver.jp/msg/text/?'+location.href);
```

空ウィンドウが残っちゃうので、そのうち消したい
Androidでも動くかも
Railsにて、複数あるチェックボックスが1つも選択されていなければエラーになるバリデーションを作る

##環境

* Ruby 1.9.2p320
* Ruby on Rails 3.2.3

##要件

例えばウェブサイトに以下のような入力フォームがあるとします。

* あなたの好みを教えてください。(必須項目)
  * ゾンビ
  * 幽霊
  * ナイアーラトテップ

この3つの選択肢はチェックボックスで複数選択できるようにします。また、1つも選択されなかったときはエラーになるようにします。

##方法

以下のようなテーブルを定義します。

```ruby
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.boolean :like_ghost
      t.boolean :like_nyarlathotep
      t.boolean :like_zombie
      t.timestamps
    end
  end
end
```

次に以下のようなビューを用意します。

```
p あなたの好みを教えてください。(必須項目)
= form_for(@user) do |f|
  = hidden_field_tag 'user[like]'
  = f.check_box :like_zombie
  | ゾンビ
  = f.check_box :like_ghost
  | 幽霊
  = f.check_box :like_nyarlathotep
  | ナイアーラトテップ
  = f.submit '保存'
```

バリデーションをするために `hidden_field_tag` メソッドを使用して `like` というフィールドを用意しています。

次に以下のようなモデルを用意します。

```ruby
# coding: utf-8

class User < ActiveRecord::Base
  attr_accessor :like
  attr_accessible :like, :like_ghost, :like_nyarlathotep, :like_zombie

  validates :like, present_like: true
end
```

`like` はデータベースのフィールドとして存在していないため、`attr_accessor` メソッドで読み書きできるようにする必要があります。そして、`like_*` が1つも選択されなかったときにバリデーションエラーにするため、 `present_like` という独自のバリデーションを作成します。

```ruby
# coding: utf-8

class PresentLikeValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    like_name = ['ghost', 'nyarlathotep', 'zombie']
    like_values = like_name.map { |name| record.__send__("like_#{name}") }

    unless like_values.include?(true)
      record.errors[attribute] << (options[:message] || 'を選択してください。')
    end
  end
end
```

`validate_each` メソッドに渡される3つの引数にはそれぞれ以下のようなデータが渡されます。

* **record:** #\<User id: nil, like_ghost: false, like_nyarlathotep: false, like_zombie: false, created_at: nil, updated_at: nil>
* **attribute:** :like
* **value:** ""

`like_name.map { |name| record.__send__("like_#{name}") }` でレコードに入っている各 `like_*` の値が入った配列を生成し、`include?` メソッドを使用して1つでも `true` が入っているか (チェックボックスが選択されているか) どうかを判別しています。

`record.errors[attribute] << (options[:message] || 'を選択してください。')` の `options` には、モデル内で

```ruby
validates :like, present_like: { message: 'を選択してね' }
```

などとしたときに、`{ message: 'を選択してね' }` が格納されます。ちなみに前の例では `:present_like` に `true` を指定していましたが、 `false` などを指定しても問題なく動作します。

この独自バリデーションのコードを `present_like_validator.rb` という名前で保存します。`_validator` をファイル名の最後に付けないといけないようです。

以上です。もっと良い方法があったら教えてもらえると嬉しいです。
Emacs の コピー/ペースト をクリップボードで行う

Emacs では コピー/ペースト を独自バッファで行っているため、OSのクリップボードと文字列を共有しない。以下のコードを .emacs に記述することで、Emacs でもクリップボードを使用できる。

```cl
(setq x-select-enable-clipboard t)
```

参考: http://www.emacswiki.org/emacs/CopyAndPaste
文字列をRubyプログラムで変換するRubyプログラム

標準入力を変換して標準出力する Ruby プログラムがある。あなたは Ruby プログラムを記述中に、ある変数の文字列をその既存 Ruby プログラムで変換したいと思った。

そのような場合は StringIO を使えばいい。

```ruby
ARGV.shift until ARGV.empty?
$stdin = StringIO.new(input)
output = String.new
$stdout = StringIO.new(output)
load("script.rb", true)
$stdin = STDIN
$stdout = STDOUT
```

これで文字列 input を script.rb で変換して output に格納できる。

注意すべきは1行目。script.rb で ARGF を使用している場合、ARGV の内容をファイルとみなして、そのファイルの中身を script.rb で変換してしまう。そのため、変換プログラムで ARGF を使用しているなら ARGV を空にするのを忘れてはいけない。
Gitブランチ関連コマンド

[Git Advent Calendar / Jun.](http://qiita.com/advent-calendar/git)  **３日目**です。

ここでは、Gitのブランチ操作関連のコマンドをまとめたいと思います。

**現在のブランチから派生ブランチを作成する**
`git branch BN`

**作業ブランチを変更する**
`git checkout BN`

**上記２つを一度に行う**
`git checkout -b BN`
***
**ローカルブランチを確認する**
`git branch`

**リモートブランチを確認する**
`git branch -r`

**上記２つを一度に行う**
`git branch -a`
***
**現在の作業ブランチに指定ブランチをマージする**
`git merge BN`

**マージ後でも、元に戻せるようにする**
`git merge --no-ff BN`
***
**ブランチの削除**
`git branch -d BN`

**ブランチの削除(強制的)**
`git branch -D BN`
***
**リモート・リポジトリにブランチをプッシュする**
`git push origin BN`

**リモートブランチからローカルブランチを作成する**
`git checkout -b BN origin/BN`

**リモートリポジトリのブランチを取得して、ローカルブランチとする**
`git fetch origin RemoteBN:LocalBN`

**リモートブランチを削除する**
`git push origin :BN`
***
**ブランチの派生元ブランチを変更する**
`git rebase BN`

**ブランチを比較する**
`git diff BN1 BN2`
VimFiler で Git のルートディレクトリを一発で開く

カレントディレクトリが Git リポジトリ内にある場合，そのリポジトリのルートを VimFiler で開くコマンドを `<Leader>fg` に割り当てます．
.vimrc に次のように書けば OK です．

```vim
function! s:git_root_dir()
    if(system('git rev-parse --is-inside-work-tree') == "true\n")
        return ':VimFiler ' . system('git rev-parse --show-cdup') . '\<CR>'
    else
        echoerr '!!!current directory is outside git working tree!!!'
    endif
endfunction
nnoremap <expr><Leader>fg <SID>git_root_dir()
```
指定されたフォルダ内にあるファイルのサイズ一覧を返す（ディレクトリは内部のファイルサイズ合計）

タイトルの通り。
あるディレクトリ配下にディレクトリがいくつかあって、
その中で一番サイズが大きいディレクトリを知りたかったりしたい時とか。

``` groovy

def fileSize = { size, file -> 
  if (file.isDirectory()) {
    file.eachFile {
      size += owner.call(0, it)
    }
  } else {
    size += file.size()
  }
  size
}

def fileListSize = { path ->
  assert path != null
  assert path.class != String.getClass()
  
  def file = new File(path)
  
  assert file.exists()
  
  def map = [:]
  if (file.isDirectory()) {
    file.eachFile {
      map.put(it.name, fileSize(0,it))
    }
  } else {
    map.put(file.name, file.size())
  }
  map
}

/*
テスト用ディレクトリ構成
test
├a
│└aa.txt // 5byte
├b
│├ba.txt // 5byte
│└bb.txt // 6byte
├c
│├ca
││└caa.txt // 5yte
│├cb
││├cca.txt // 5byte
││└ccb.txt // 6byte
│├cc.txt // 5byte
│├cd.txt // 6byte
│└ce.txt // 7byte
└text.txt // 5byte
*/
assert fileSize(0, new File(/C:\work\filesize\test\text.txt/)) == 5
assert fileSize(0, new File(/C:\work\filesize\test\a/)) == 5 
assert fileSize(0, new File(/C:\work\filesize\test\b/)) == 11
assert fileSize(0, new File(/C:\work\filesize\test\c/)) == 34

assert fileListSize(/C:\work\filesize\test\text.txt/) == ["text.txt":5]
assert fileListSize(/C:\work\filesize\test/) == ["a":5, "b":11, "c":34, "text.txt":5]
```

もっといい書き方ありそうだけど、いい案が浮かばず。。。

---

## 追記（2018/04/23）
サイズ順に並べて出力する。

```groovy
fileListSize($/C:\work/$).sort{left, right -> left.value <=> right.value}.each {
  println "${it.key} : ${String.format('%.2f', it.value/1024/1024)}MB"
}
```
Use WinMerge inside of Git (git-difftool, git-mergetool)

## ~/.gitconfig
c.f. http://ptech.g.hatena.ne.jp/noromanba/20120602/1338633091 (written in Japanese)

```conf:~/.gitconfig
[merge]
	tool = WinMerge
[mergetool "WinMerge"]
	path = C:/Program Files/WinMerge/WinMergeU.exe
	cmd = \"C:/Program Files/WinMerge/WinMergeU.exe\" /m /r=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"
[diff]
	tool = WinMerge
	guitool = WinMerge
[difftool "WinMerge"]
	path = C:/Program Files/WinMerge/WinMergeU.exe
	cmd = \"C:/Program Files/WinMerge/WinMergeU.exe\" -e -ub -dl \"Base\" -dr \"Mine\" \"$LOCAL\" \"$REMOTE\"
```

## How To Use
```sh:GitBash
$ git difftool [-y]
```
```sh:GitBash
$ git mergetool [-y]
```
## Environment
    OS       | Windows XP SP3
    MinGW    | MINGW32_NT-5.1 %COMPUTERNAME% 1.0.12(0.46/3/2) 2011-07-20 17:52 i686 unknown
    Git      | git version 1.7.8.msysgit.1
    WinMerge | Version 2.13.20.12+-jp-12 - Japanese Unicode x86
## :-p
selfish [Git Advent Calendar / Jun.](http://qiita.com/advent-calendar/git)
Git習得のためのGithub入門


※ この記事は[Git Advent Calendar / Jun.](http://qiita.com/advent-calendar/git) 二日目の記事です。前日は [yaotti](http://qiita.com/users/yaotti)さんの[GitHubユーザーのためのhubコマンド](http://qiita.com/items/a4a7f3f9a38d7d3415e3)でした！

## Githubを始めてみよう

ある事柄を覚えるために「それを使う環境に身を置く」のはとてもいい方法だと思う。Gitを習得するためには「Githubで自身のソースコードを管理したり人のコードにパッチを送ったりする」のがよい。

最短で 

1. Githubにユーザー登録 
2. 自身のコードを登録 
3. 人のソースをチェックアウト
3. forkしたコードにパッチを送る 

までの手順をまとめてみた。

## ユーザー登録
![start](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20120601/20120601000538_original.jpg?1338477400)
[GitHub](https://github.com/)

メールアドレスが必要。

## 新規レポジトリの作成
`New Repository`ボタンを押す。

![new repository](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20120601/20120601000533.jpg?1338476879)

レポジトリ名や簡単な説明を入力して``Creating Repository…``ボタンを押す。

![create repository](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20120601/20120601000532.jpg?1338476975)

Githubのヘルプは良く出来ていてWebページの内容に従ってコマンドを入力していくだけでよい。
``Global Setup:``, ``Next steps:`` の項目を実行すれば新規レポジトリを登録することが出来る。

![setup](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20120601/20120601000534_original.jpg?1338476911)

[ssh鍵の登録](https://www.google.co.jp/search?q=github+ssh+設定&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja-JP-mac:official&hl=ja&client=firefox-a)が若干厄介だがインターネット上にはたくさん情報があるので頑張って乗り越えてほしい。

## 既存のプロジェクトをGithubに置く
新規作成と同じように`New Repository`ボタンを押してプロジェクトを作成し、`Existing Git Repo?`の指示に従う。

これで自分が書いたコードをGithubに置くことが出来るようになった。

## 有名なプロジェクトをチェックアウトしてみる
![clone](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20120601/20120601000536_original.jpg?1338477240)

[Popular Watched Repositories](https://github.com/popular/watched) 等を見て自分の気になるレポジトリをチェックアウトしてみよう。

1. [twitter/bootstrap](https://github.com/twitter/bootstrap)
2. [node.js](https://github.com/joyent/node)
3. [rails](https://github.com/rails/rails)
4. [jquery](https://github.com/jquery/jquery)
5. [html5-boilerplate](https://github.com/h5bp/html5-boilerplate)

他には [mruby](https://github.com/mruby/mruby) や [linux](https://github.com/torvalds/linux) 等もある。

twitter/bootstrap だったら、

```bash:
$ git clone git://github.com/twitter/bootstrap.git
```

でチェックアウト出来る。

## forkしてpull requestしてみる
![fork](http://cdn-ak.f.st-hatena.com/images/fotolife/t/tuto0621/20120601/20120601003657_original.jpg?1338478618)

最後に他の人が書いたコードに対してパッチを送ってみよう。練習用のレポジトリを用意してみた。

[ongaeshi/fork_practice](https://github.com/ongaeshi/fork_practice)

送ってくれたパッチは README.markdown に書いた簡単なルールに沿ってくれていれば取り込むようにするので、forkの練習にどうぞ。
第1回みなとruby会議に参加しました #minatork01


「はじめの一歩」というテーマにふさわしい素晴らしいイベントだと思いました。

以下、感想

* ソーシャルコーディング with @june29
 * 「あみだくじ」か「English Numerals」がお題だけど、あみだくじに専念
 * ice break にもなったしすごいよかった。楽しい。
 * https://gist.github.com/2856957
* Yokohama.rb と Minato.rb のおいしい関係 @satomicchy 
 * これから Ruby/Rails をはじめる人に勇気をつけるいい発表でした
* はじめての Rails by @nay3
 * これから Ruby/Rails にどういうことを意識していけばいいか
* Enumerator::Lazy @nagachika
 * Enumerable
     * each 実装すれば map とか select とか使えるようになるよ
 * Enumerator
     * 外部イテレータ化 to_enu, enum_for
     * メソッドチェイン map.with_index
 * Enumerator::Lazy
     * (0..5).lazy.map {|i| i * 2 } #=> Enumerator::Lazy
     * force
          * 結果を最終的に取り出すことができる
     * 中間データの抑制ができる
     * IOが捗るよ
* Ruby Kaja @tyabe
 * ShyなRubyistがお互いに褒めあえる文化を形成したい

最初のソーシャルコーディングで周囲のテーブルと打ち解けて、
そこから、少しずつレベルをあがっていく感じで、初心者からモヒカンまでいい構成だったので素晴らしかったです。

楽しかったです。どうもありがとうございました。
Mongooseでmap-reduceしている時に嵌ったこと。

例えば以下のような雰囲気で書いた。

```javascript
        var command = {
            mapreduce:"communications",
            query:query,
            map:communicationCountMapFunc,
            reduce:communicationCountReduceFunc,
            out:'communications_mr_buf'
        };

        var dbh = new DPH(Promise); //これはPromiseをDB対応させるラッパ
        mongoose.connection.db.executeDbCommand(command, dbh.handler(function (ret) {
            return ret.documents[0];
        }));
        return dbh.promise;
```

後でcommunications_mr_bufテーブルから結果を引っ張って来ることになる。下記のように（ここをクールに書く方法は知りたい。モデルとして定義しないでも良い処理なので）。

```js
                var dbh = new DPH(Promise);
                var CommunicationBufEntity = mongoose.model('communications_mr_buf', CommunicationBufSchema);//スキーマは別途定義しておいて。

                CommunicationBufEntity.find(query, {}, options, dbh.handler());
                return dbh.promise;
```

ただ、Mongooseのモデルの基本的なルールが、mongoose.modelの第一引数のオブジェクト名には's'が自動的に付与される動きだったので、communications_mr_bufsを検索してしまい、上記のままでは一件も引っかからない。

と言うわけで最初に出力するテーブルに's'を付けて回避した。おかげで数時間無駄にしてしまったのであった。クールな方法があったら知りたいです。
Macの終了時ポップアップでのショートカット

![](http://uploda.cc/img/img1442.png) 

エディタをメモ帳がわりにして、いくつか文字列を保持しておくことがある。
`Command+q`で終了しようとした時、保存するかどうかを聞かれるんだけど、保存せずに終了したい。
しかし、ここで選択中のボタンをカーソルキー←→で変更することが出来ない。
Don't Saveはショートカットキー`Command+d`により、選択できる。

`Enter→Save`
`Esc→Cancel`
`Command+d→Don't Save`