OmniAICreator/Qiita-1.07M huggingface dataset:
Hash の第一引数でのデフォルト値設定は、基本的にすべきではない


Ruby の Hash の第一引数のデフォルト値の設定では、破壊的操作をよく行うクラスをセットすると罠にはまります。みんな一度ははまります。

```
$ pry
[1] pry(main)> h = Hash.new([])
=> {}
[2] pry(main)> h[:a] << 1
=> [1]
[3] pry(main)> h[:b] += [1]
=> [1, 1]
[4] pry(main)> h.keys
=> [:b]
[5] pry(main)> h[:a]
=> [1]

```

この挙動に何故なるか、理解できる人は手を上げてください！はいあまりいませんね。

なぜこんな挙動になるか、詳しくは以下。

- http://www.ruby-lang.org/ja/old-man/html/trap_Hash.html

というわけで、デフォルト値の挙動をしっかりと把握してないとはまる人が出てくるので、しっかりと

```ruby
Hash.new {|h, k| h[k] = [] }
```

と書くようにしましょう。なお破壊的操作が行われない、例えば Fixnum などは

```ruby
Hash.new(0)
```

で問題ないですが、複数人の開発で上記コードが何故問題無いか、を理解してない人が居る可能性がある場合(ほとんどの場合居ます)、へ〜 ```Hash.new(object)``` って書けるんだ便利、と理解され、破壊的操作が可能なオブジェクトを突っ込んで問題が起きる(複数回経験アリ)ので、

```ruby
Hash.new {|h, k| h[k] = 0 }
```

と冗長でも心がけた方が良いです。
Macのファイル選択で隠し(ドット)ファイルを表示する

Macのファイル名ニューからファイルを開く等でファイル一覧を表示しているときに \<Command\>+\<Shift\>+"." で隠し(ドット)ファイルの表示/非表示を切り替えられるようです。
zipファイルを展開する


事前に`gem install rubyzip`でgemをインストールしておく。

以下のようなコードでzipファイルからファイルを展開することができる。

```ruby:unzip.rb
require 'zip/zip'

Zip::ZipFile.open("hoge.zip") do |zip|
  zip.each do |entry|
    puts "entry #{entry.to_s}"
    # { true } は展開先に同名ファイルが存在する場合に上書きする指定
    zip.extract(entry, entry.to_s) { true }
  end
end
```

## 参考

- [File: README — Documentation for rubyzip (0.9.9)](http://rubydoc.info/gems/rubyzip/frames)
- [Download a zip file and extract using RubyZip | mike.williamson](http://mikewilliamson.wordpress.com/2010/07/13/download-a-zip-file-and-extract-using-rubyzip/)
- [Ruby/rubyでzip圧縮・解凍 - 俺の基地](http://yakinikunotare.boo.jp/orebase/index.php?Ruby%2Fruby%A4%C7zip%B0%B5%BD%CC%A1%A6%B2%F2%C5%E0)
- [ruby - How to overwrite existing files using Rubyzip lib - Stack Overflow](http://stackoverflow.com/questions/966054/how-to-overwrite-existing-files-using-rubyzip-lib)
Rake Task の中で ActiveRecord 使いたい場合


```
task :hoge => :environment do
  # モデルを使った処理など…
end
```

という感じで、依存タスクとして`:environment`を追加すると良い。

## 補足
単純に`require '../../config/environment'`としても一応可能だけど、テーブルが無かったりした場合に require に失敗してしまうのでよろしくない。


## 参考

[Do rails rake tasks provide access to ActiveRecord models? - Stack Overflow](http://stackoverflow.com/questions/876396/do-rails-rake-tasks-provide-access-to-activerecord-models)
jasmine+testling-ciでブラウザテストを自動化する

jsdomやphantomjs(headless webkit)ではなくリアルブラウザでのテストが出来ます。結果的にはこの様なバッジが出来て、githubにpushする度更新されるので便利。

[![browser support](http://ci.testling.com/hden/jasmine-testling-ci.png)](http://ci.testling.com/hden/jasmine-testling-ci)

jasmineでテスト環境を整えてる方もいらっしゃると思いますが、公式[アダプター/ハーネス](https://github.com/substack/testling-jasmine)が無くてtestling-ciとの相性が良く無い。

ですので[書いてみまして](https://github.com/hden/jasmine-testling-ci)、testling-ci用のハーネス。

環境を整える
------
まずはwebhook
![webhook](https://raw.github.com/hden/jasmine-testling-ci/master/img/webhook.png)

次に[jasmine](https://github.com/pivotal/jasmine/downloads)を入手。testling-ciではrequireされたスクリプトは全て[browserify](https://github.com/substack/node-browserify)されますのでjasmine本体に少し[工夫](https://github.com/hden/testling-ci-playground/commit/15e414f68bdf2132aafbc4b967c8617d2e368fe3)が必要。加工済みバージョンは[ココ](https://github.com/hden/jasmine-testling-ci/blob/master/lib/jasmine/jasmine.js)。

以下このの様な環境を想定します。

> |-package.json
  |-[jasmine-harness.coffee](https://github.com/hden/jasmine-testling-ci/blob/master/jasmine-harness.coffee)
  |-lib
  |  |---[jasmine](https://github.com/pivotal/jasmine/downloads)
  |  |---[jasmine-reporters](https://github.com/larrymyers/jasmine-reporters/tree/master/src)
  |-spec
  |  |---テストファイル等…
詳細は[こちら](https://github.com/hden/jasmine-testling-ci)をどうぞ。

アダプターの設定
------

```coffee-script:jasmine-harness.coffee
expose = (obj) -> window[key] = obj[key] for key of obj

# attach jasmine to window
expose require('./lib/jasmine/jasmine.js')

# attach tap reporter to jasmine
# this is essential for running tests on ci.testling.com
require './lib/jasmine-reporters/jasmine.tap_reporter.js'

# expose helpers
# ここでexpose関数によりnode用のヘルパーモジュールを導入します。
expose require('./spec/SpecHelper')

# insert test files here
# 各テストファイルはだたrequireするだけで動きます。
require('./spec/SimpleSpec')

# or write browser specific test here
# ブラウザ専用のテストケースはここに書くか、jasmine-nodeで
# 誤作動しない様に別フォルダーに置くと良いかもしれません。
describe 'Browser Suite', ->
  it 'Should pass a basic truthiness test.', ->
    expect(true).toEqual(true)
    expect(false).toEqual(false)

startJasmine = ->
  jasmine.getEnv().addReporter new jasmine.TapReporter()
  jasmine.getEnv().execute()

currentWindowOnload = window.onload

window.onload = ->
  currentWindowOnload() if currentWindowOnload?
  setTimeout startJasmine, 1
```

package.jsonにtestling設定を追加。
------
全てのブラウザリストは[ココ](http://testling.com/browsers.json)、全部で48種類。iOS系は書かれているが実行されないのが玉に瑕。
欲張りすると無駄に重なるので要注意。

```package.json
{
  "testling": {
    "browsers": {
      "ie": [ 6, 7, 8, 9, 10 ],
      "ff": [ 12, 13, 14, 15, 16, 17 ],
      "chrome": [ 20, 21, 22, 23 ],
      "opera": [ 10, 11, 12 ],
      "safari": [ 5.1 ]
    },
    "files": "jasmine-harness.coffee"
  }
}

```

完成
-----
他は前回の[mocha+testling-ci](http://qiita.com/items/4c36d745515d82c05eb1)と同様です。

メモ
-----
* testling-ciは現在master brench以外のpushには反応しない様子。
* 作者によるこの[リポ](https://github.com/substack/testling-jasmine)、参考になります。
CloudWatchにEC2のディスク使用率を登録してみる

## タグ以外の環境
 * aws-sdk 1.8.2-1.0

## カスタムメトリックスの登録ツールについて
 * **追記：[Linux用CloudWatch監視スクリプト](http://aws.typepad.com/aws_japan/2013/02/cloudwatch-monitoring-scripts-updated.html)を使う方が良さそう**

 * 既に世の中にありそうだがrubyで自作した
  * [CloudWatchにカスタムメトリックスを登録するRubyスクリプト](https://gist.github.com/mechamogera/5003334)
  * AWS提供のコマンドラインツールは認証proxyが通らない、EC2のroleで実行出来ないので自作（最新版とか対応してるのかな？)

## 登録手順

 * EC2起動
  * CloudWatchにカスタムメトリックスを登録できる権限を持つroleを割り当て
 * 必要パッケージインストール

```bash
 $ sudo yum update -y
 $ sudo yum install -y git rubygem-aws-sdk
```

 * スクリプト準備

```bash
 $ mkdir ~/script
 $ git clone https://gist.github.com/5003334.git ~/script/mon-put-data
```

* スクリプト実行確認
 * InstanceIdの取得は[Instance Metadata - Amazon Elastic Compute Cloud](http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html)を参照
 * /dev/xvda1のDiskUsageを取得するように設定

```bash
 $ ruby /home/ec2-user/script/mon-put-data/mon-put-data.rb \
--namespace AWS/EC2 \
--metric-name DiskUsage \
--dimensions InstanceId="`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`" \
--unit Percent \
--value `df | grep /dev/xvda1 | sed -e 's/\s\{1,\}/ /g' | cut -d' ' -f5 | sed -e 's/\%//'` \
--endpoint ap-northeast-1
```

* crontabへの登録

```bash
$ crontab -e
*/5 * * * * ruby /home/ec2-user/script/mon-put-data/mon-put-data.rb --namespace AWS/EC2 --metric-name DiskUsage --dimensions "InstanceId=`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`" --unit Percent --value `df | grep /dev/xvda1 | sed -e 's/\s\{1,\}/ /g' | cut -d' ' -f5 | sed -e 's/\%//'` --endpoint ap-northeast-1 ap-northeast-1
```

 * ManagementConsoleでCloudWatch確認
  * 反映されるまでタイムラグがある
  * 巨大なファイルを作ってディスク使用率を変更させると追随している

## はまった

 * crotabで%を\でエスケープしていなかったためにコマンドの終わりと認識されエラーになった
投稿日時をTwitterのように「X分前」「X時間前」という文字列に変換するPHP関数

最近のSNSは投稿日時を「**X分前**」「**X日前**」といった表記にしていることが多いですね。こういった表記がPHPで必要になったので関数作りました。  
[fuzzy_time.php (Gist)](https://gist.github.com/wgkoro/4985763)

# 関数概要

strtotime()で変換できる文字列<small>(例：2013/2/19 22:28:03)</small>を引数に与えると、「X日前」といった表記にして返します。返す文字列は下記の通り。

- 1分未満は**X秒前**
- 1時間未満は**X分前**
- 1日未満は**X時間前**
- 31日以内は**X日前**
- 32日以上前の場合は**X月X日**といった文字列を返す。
- 32日以上前で、現在と年が違う場合は**yyyy年m月d日**というように、「年」も含めて返す

```php:fuzzy_time.php
<?php
/**
 * X秒前、X分前、X時間前、X日前などといった表示に変換する。
 * 一分未満は秒、一時間未満は分、一日未満は時間、
 * 31日以内はX日前、それ以上はX月X日と返す。
 * X月X日表記の時、年が異なる場合はyyyy年m月d日と、年も表示する
 *
 * @param	<String> $time_db		strtotime()で変換できる時間文字列 (例：yyyy/mm/dd H:i:s)
 * @return	<String>				X日前,などといった文字列
 **/
function convert_to_fuzzy_time($time_db){
	$unix	= strtotime($time_db);
	$now	= time();
	$diff_sec	= $now - $unix;

	if($diff_sec < 60){
		$time	= $diff_sec;
		$unit	= "秒前";
	}
	elseif($diff_sec < 3600){
		$time	= $diff_sec/60;
		$unit	= "分前";
	}
	elseif($diff_sec < 86400){
		$time	= $diff_sec/3600;
		$unit	= "時間前";
	}
	elseif($diff_sec < 2764800){
		$time	= $diff_sec/86400;
		$unit	= "日前";
	}
	else{
		if(date("Y") != date("Y", $unix)){
			$time	= date("Y年n月j日", $unix);
		}
		else{
			$time	= date("n月j日", $unix);
		}

		return $time;
	}

	return (int)$time .$unit;
}
```

ご自由にアレンジしてお使い下さいませ。
第8回オフラインリアルタイムどう書くの参考問題をRubyで解きました

イベントページは http://atnd.org/events/36783 。
問題は http://nabetani.sakura.ne.jp/hena/ord8entco/ 。
解答リンク集は http://qiita.com/items/24b9be4ee3bae4c89a95 。


Nさんから問題解けとせかされたのでやりました。
２度目の投稿です。

今回はRubyを使いました。
普段はC++やJavaを使っていますが、開発効率はRubyのほうが断然高そうです。

```ruby:offline8.rb
#coding:utf-8

def calc s
  s = s.split(//).map{|m| sprintf("%04b", m.to_i(16)).reverse}.join
  t =""
  c = 0
  loop do
    pre = c
    %w(
    000 文字 t
    0010  文字 s
    0011  文字 n
    0100  文字 i
    01010 文字 d
    0101101 文字 c
    010111  文字 l
    0110  文字 o
    0111  文字 a
    10  文字 e
    1100  文字 r
    1101  文字 h
    111 終端
    ).each_slice(3) do |p|
      if s[c..-1].start_with? p[0]
        c+=p[0].size
        return "#{t}:#{c}" if p[1]=="終端"
        t+=p[2]
      end
    end
    return "*invalid*" if pre==c
  end
end

def test d
  res = calc d[1]
  puts "#{res}!=#{d[2]}" unless res==d[2]
end

DATA.each{|d| test d.split}

__END__
0 16d9d4fbd ethanol:30
1 df  e:5
2 ad7 c:10
3 870dcb  t:6
4 880f63d test:15
5 a57cbe56  cat:17
6 36abef2 roll:23
7 ad576cd8  chant:25
8 3e2a3db4fb9 rails:25
9 51aa3b4c2 eeeteee:18
10  ad5f1a07affe  charset:31
11  4ab8a86d7afb0f  slideshare:42
12  ac4b0b9faef doctor:30
13  cafebabe  nlh:17
14  43e7  sra:15
15  53e7  eera:15
16  86cf  tera:16
17  b6cf  hon:15
18  0 *invalid*
19  c *invalid*
20  d *invalid*
21  e *invalid*
22  babecafe  *invalid*
23  8d  *invalid*
24  ad  *invalid*
25  af  *invalid*
26  ab6e0 *invalid*
27  a4371 *invalid*
28  a4371 *invalid*
29  96e3  *invalid*
30  0dc71 *invalid*
31  2a9f51  *invalid*
32  a43fb2  *invalid*
33  ab6e75  *invalid*
34  a5dcfa  *invalid*
35  ca97  *invalid*
36  6822dcb *invalid*
```
Mysqlよ、入れ！


すげえ詰まってたはずなんだが

```sh
brew uninstall mysql
brew install mysql
mysql_install_db --verbose --user=`whoami` --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp
mysql.server start
```

でいけたわ
タッチタイピング練習中につき、文章の確度にリソースが割きにくいためご無礼


http://howtohp.com/tools/homebrew-mysql.html
JavaScript でシングルトン

タイムラインに流れてきたツイートを見て興味がわいたので頼まれてもいないのに勝手に挑戦してみる。

要件は

* シングルトンである
* privateメンバが定義できる
* prototype拡張できる
* コンストラクタ関数の中でif文で分岐してインスタンス生成拒否は美しくない

```javascript:singleton.js
(function (global) {

    // こいつがコンストラクタということにする
    global.Hoge = Hoge;
    // インスタンスを作る本当のコンストラクタはこっち
    var ctor = function () { };
    // prototype を共有
    ctor.prototype = Hoge.prototype;

    // シングルトンインスタンス
    global.hoge = new ctor();

    // private properties
    var privateProperty = "private property";

    // public members
    global.hoge.publicProperty = 'public property';
    global.hoge.publicMethod = publicMethod;

    // constructor
    function Hoge() {
        throw new Error('シングルトンだから new しちゃダメよ');
    };

    // public methods
    function publicMethod() {
        console.log('public method called.');
        // privateMethod.call で呼ぶのもいいかも
        privateMethod();
        console.log(privateProperty);
    }

    // private methods
    function privateMethod() {
        console.log('private method called.');
    }

}(this));

// public プロパティにアクセス
console.log(hoge.publicProperty);
// public メソッドにアクセス
hoge.publicMethod();

// Hoge のインスタンスとして判断できる
console.log(hoge instanceof Hoge);

// new Hoge は例外
try {
    var fuga = new Hoge();
} catch (ex) {
    console.log(ex.message);
}

// prototype に拡張（でも hoge 自体に拡張しても問題ないのでは？）
Hoge.prototype.doSomething = function () {
    console.log('extended!!');
};

// 拡張したメソッドを呼べる
hoge.doSomething();
```
UNIXコマンドを実行する(非同期)

アプリからUNIXコマンドを実行する。
非同期にバックグラウンドで実行する例として、topコマンドを実行してみる。
-stopProcess:で停止するまで、ターミナルでの実行と同様にシステムの情報を更新し続けます。

```objectivec:Objective-C
// タスクの開始
- (IBAction)startProcess:(id)sender
{
    // _taskはメンバ変数 
    _task = [[NSTask alloc] init];
    
    // 標準出力
    NSPipe *outPipe = [NSPipe pipe];
    [_task setStandardOutput:outPipe];
    
    // 標準エラー
    NSPipe *errPipe = [NSPipe pipe];
    [_task setStandardError:errPipe];
    
    [_task setLaunchPath:@"/usr/bin/top"];
    [_task setArguments:[NSArray arrayWithObjects: @"-s", @"1", @"-l", @"3600", @"-stats", @"pid,cpu,time,command", nil]];
    
    // 標準出力のデータが準備できたことを通知
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(getData:)
                                                 name:NSFileHandleReadCompletionNotification
                                               object:[outPipe fileHandleForReading]];
    [[outPipe fileHandleForReading] readInBackgroundAndNotify];
    
    // タスクの終了が完了したことを通知
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(taskExited:)
                                                 name:NSTaskDidTerminateNotification
                                               object:_task];
    
    // タスクの実行開始
    [_task launch];
}
```

```objectivec:Objective-C
// タスクの停止
- (IBAction)stopProcess:(id)sender
{
    // Notificationの削除
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:NSFileHandleReadCompletionNotification
                                                  object:[[_task standardOutput] fileHandleForReading]];
    // タスクの停止
    // 停止の完了を待たずに、すぐに処理が戻ってくる。
    [_task terminate];

    // タスクが完全に終了するのを待つ場合は以下を実行。
    // NSTaskDidTerminateNotification の通知を待って非同期で終了処理をする事も可。
    [_task waitUntilExit];
}
```

```objectivec:Objective-C
// 標準出力の読み出し
- (void)getData:(NSNotification *)aNotification
{
    NSData *data = [[aNotification userInfo] objectForKey:NSFileHandleNotificationDataItem];
    if (data != nil && [data length])
    {
        // 例:NSTextViewに表示してみる
        [_textView setString:[[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]];
        
        // we need to schedule the file handle go read more data in the background again.
        [[aNotification object] readInBackgroundAndNotify];
    }
    else
    {
        [self stopProcess:nil];
    }
}
```

```objectivec:Objective-C
// タスクが完了した場合の後処理
- (void)taskExited:(NSNotification *)aNotification
{
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:NSTaskDidTerminateNotification
                                                  object:_task];
    [_task release];
    _task = nil;
}

```
UNIXコマンドを実行する(同期)

アプリからUNIXコマンドを実行する。
同期処理で実行する場合。

```objectivec:Objective-C
- (IBAction)doAction:(id)sender
{
	NSTask *task = [[[NSTask alloc] init] autorelease];

	// 標準出力用
	NSPipe *outPipe = [NSPipe pipe];
	[task setStandardOutput:outPipe];

	// 標準エラー用
	// 標準出力用と同じNSPipeをsetしても良いけど、分けておくと結果がエラーになったかどうかが分かる。
	NSPipe *errPipe = [NSPipe pipe];
	[task setStandardError:errPipe];

	// user$ man ls を実行してみる
	[task setLaunchPath:@"/usr/bin/man"];
	[task setArguments:[NSArray arrayWithObjects:@"ls", nil]];

	// user$ ls -la でDesktopのファイルを一覧する場合はこんな感じ
//	[task setCurrentDirectoryPath:[NSHomeDirectory() stringByAppendingPathComponent:@"Desktop"]];
//	[task setLaunchPath:@"/bin/ls"];
//	[task setArguments:[NSArray arrayWithObjects:@"-la", nil]];

	// ここでコマンドの実行
	// コマンドが終了するのを待たずに、すぐに処理が返ってくる
	[task launch];

	// コマンドの結果を取得
	// readDataToEndOfFile によって、実行が終了するまで待ってくれる。
	// コマンドの実行結果に応じて、標準出力と標準エラーのどちらかにデータが入っている。
	NSData *data = [[outPipe fileHandleForReading] readDataToEndOfFile];
	if (data != nil && [data length])
	{
		NSString *strOut = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
		NSLog(@"%@", strOut);
	}

	data = [[errPipe fileHandleForReading] readDataToEndOfFile];
	if (data != nil && [data length])
	{
		NSString *strErr = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease];
		NSLog(@"ERROR:%@", strErr);
	}
}
```
顔文字を正規表現で消す

顔文字をびしっと消せる正規表現ってないもんですかねー

```perl:aaa.pl
$str =~ s/(ﾉ|ノ|v|U|o|O|q|p|T|x|X|ｰ|ﾟ|｡|、|。|，|．|･|・|：|；|？|！|゛|゜|｀|´|¨|＾|>丶|＿|￣|ヽ|ヾ|ゝ|ゞ|〃|仝|々|〆|〇|ー|―|‐|／|＼|～|∥|｜|…|‥|‘|’|“|”|（|）|〔|〕|［|］|｛|｝|〈
|〉|《|》|「|」|『|』|【|】|＋|－|±|×|÷|＝|≠|＜|＞|≦|≧|∞|∴|♂|♀|°|′|″|℃|￥|＄|￠|￡|％|＃|>＆|＊|＠|§|☆|★|○|●|◎|◇|◆|□|■|△|▲|▽|▼|※|〒|→|←|↑|↓|〓|∈|∋|⊆|⊇|⊂|⊃|∪|∩|∧|∨|￢
|⇒|⇔|∀|∃|∠|⊥|⌒|∂|∇|≡|≒|≪|≫|√|∽|∝|∵|∫|∬|Å|‰|♯|♭|♪|†|‡|¶|Γ|Δ|Θ|Λ|Ξ|Π|Σ|>Φ|Χ|Ψ|Ω|α|β|γ|δ|ε|ζ|η|θ|ι|κ|λ|μ|ν|ξ|ο|π|ρ|σ|τ|υ|φ|χ|ψ|ω|Б|Г|Д|Ё|Ж|З|И
|Й|К|Л|П|Ф|Ц|Ч|Ш|Щ|Ъ|Ы|Э|Ю|Я|б|в|г|д|е|ё|ж|з|и|й|к|л|м|н|п|т|ф|ц|ч|ш|>щ|ъ|ы|ь|э|ю|я|q|x|l|k|j|m|t|w|u|v|n|q|x|l|k|j|m|t|w|u|v|n|t|w|u|v|n|t
|w|u|v|n|丶|丿|亅|人|丁|二|入|八|卜|又|厂|匸|匚|勹|凵|几|冫|冖|冂|儿|亠|厶|乂|了|丁|卩|巾|山|士|己|>>
凡|彳|彡|川|廾|广|巛|介|屮|尸|宀|口|囗|兀|于|个|干|爻|殳|戈|弖|夭|夬|卞|卅|从|廿|凸|凹|卍|豸|囲|因|囚|!|#|\$|%|&|\(|\)|=|\||\+|\*|\{|\}|<|>|\[|\]|\?|_|\/|\.|,|:|;|"|'|`|~|\^|\@|\-|\\|\s){3,}/ /mg;
```


参考：http://plaza.rakuten.co.jp/risuzu777/2014/
Rails with Compass で Twitter Bootstrap をつまみ食い

Rails で Asset Pipeline を有効にした状態で、Compass を使いつつ Twitter Bootstrap を部分的に使う方法です。

Twitter Bootstrap を使えるようにする gem はいろいろありますが、twitter-bootstrap-rails は LESS のままなので NG。sass-twitter-bootstrap-rails は、Compass と @mixin がかぶるため NG。そこで compass_twitter_bootstrap の出番になります。

```ruby:Gemfile
gem 'compass_twitter_bootstrap'
gem 'compass-rails'
```

javascript は、vendor/assets/javascript 以下にあるので、個別に使うのも、全部取り込むのも簡単ですが、stylesheet はちょっとやっかい。github をみると、

```ruby:applicaion.scss
@import "compass_twitter_bootstrap"
```

しかのってませんが、これだと根こそぎ適用され、部分的に使いたい場合、スタイルの調整が大変です。

たとえば、Popover のみを使う場合は、以下のようにします。

```ruby:applicaion.scss
@import "compass_twitter_bootstrap/mixins.scss";
@import "compass_twitter_bootstrap/variables.scss";
@import "compass_twitter_bootstrap/popovers.scss";
```

mixins.scss と variables.scss は、共通定義なものが入っているので、これを含めて import してから、調整していく感じがよさそうです。javascript 側は、

```ruby:application.js
//= require bootstrap-tooltip
//= require bootstrap-popover
```

こんな感じです。たまたま、Popover には依存関係がありましたが、Twitter Bootstrap のサイトに書いてあるので、問題ないでしょう。

## 参考資料

<https://github.com/vwall/compass-twitter-bootstrap>

### 余談

[ここ](http://twitter.github.com/bootstrap/customize.html) でカスタマイズした CSS 使った方がはやいかも。。。
Ruby 1.9 on Debian

# Update, upgrade and install development tools:
apt-get update
apt-get -y upgrade
apt-get -y install build-essential git-core curl libssl-dev \
                   libreadline5 libreadline5-dev \
                   zlib1g zlib1g-dev \
                   libmysqlclient-dev \
                   libcurl4-openssl-dev \
                   libxslt-dev libxml2-dev
 
# Install rbenv
git clone git://github.com/sstephenson/rbenv.git /usr/local/rbenv
 
# Add rbenv to the path:
echo '# rbenv setup' > /etc/profile.d/rbenv.sh
echo 'export RBENV_ROOT=/usr/local/rbenv' >> /etc/profile.d/rbenv.sh
echo 'export PATH="$RBENV_ROOT/bin:$PATH"' >> /etc/profile.d/rbenv.sh
echo 'eval "$(rbenv init -)"' >> /etc/profile.d/rbenv.sh
 
chmod +x /etc/profile.d/rbenv.sh
source /etc/profile.d/rbenv.sh
 
# Install ruby-build:
pushd /tmp
  git clone git://github.com/sstephenson/ruby-build.git
  cd ruby-build
  ./install.sh
popd
 
# Install Ruby 1.9.3-p194:
rbenv install 1.9.3-p194
rbenv global 1.9.3-p194
 
# Rehash:
rbenv rehash
 
# Production installing gems skipping ri and rdoc
cat << EOF > /root/.gemrc
---
:sources:
- http://gems.rubyforge.org
- http://gems.github.com
gem: --no-ri --no-rdoc
EOF
 
# Restart shell or exit re-login
#exec $SHELL
EC-CUBEのインストール

# 環境
* CentOS 6.3
* PHP 5.3.3
* MySQL 5.5.29
* EC-Cube 正式版（Ver2.12.3） (最終更新日:2013年2月8日)

# 事前作業
* インストールパッケージの取得に登録が必要。（無料）

# インストール作業

* パッケージの取得

````
# cd /tmp
# wget http://downloads.ec-cube.net/src/eccube-2.12.3.zip
````

* 解凍

````
# unzip eccube-2.12.3.zip
````

* ソースの配置とパーミッション変更

````
# cp -pr eccube-2.12.3/html /var/www/html/eccube
# cp -pr eccube-2.12.3/data /var/www/html/data
# chown -R apache:apache /var/www/html/eccube
# chown -R apache:apache /var/www/html/data
````

～ 下記、ブラウザよりインストール作業

* ブラウザで下記のアドレスを開く
　http://yourwebsite/eccube/install/
　→インストール開始画面が開くので「次へ」

* チェック結果表示画面
　→エラーがないことを確認して「次へ」

* 必要なファイルのコピー
　→コピーが成功したことを確認して「次へ」

* ECサイトの設定
　→情報を設定して「次へ」
　　※必要であればメールサーバの設定を行う。

* データベースの設定
　※あらかじめDBを作成しておく

````
　mysql> create database eccube_db character set utf8;
　mysql> grant all privileges on eccube_db.* to eccube_db_user@localhost identified by 'eccube_db_user';
　mysql> flush privileges;
````

　　DBの種類：MySQL
　　DBサーバ：localhost
　　ポート：3310
　　DB名：eccube_db　※デフォルト
　　DBユーザ：eccube_db_user　※デフォルト

* DBの初期化
　→「次へ」　※DBの初期化処理がはじまる。
　　成功したことを確認して、

* サイト情報について
　内容を確認して「次へ」　※デバッグのための情報は「いいえ」
　　→「次へ」

* インストール完了
　→「管理画面へログインする」
　　管理画面アドレス：http://yourwebsite/eccube/admin/

※下記のファイルを削除 or リネームしておく。
/var/www/html/eccube/install/inde.php
※最初に取得したアーカイブ、及び、解凍ディレクトリは削除。
ConduitでTwitterのAPIを叩く

まさかの[conduit-1.0.0](http://hackage.haskell.org/package/conduit-1.0.0)がリリースされどうなることかと思ったが、意外と簡単に実装できた。

```haskell
{-# LANGUAGE OverloadedStrings #-}
import Web.Authenticate.OAuth as OAuth -- authenticate-oauth-1.4.0.4
import qualified Data.Aeson as JSON    -- aeson-0.6.1.0
import Data.Conduit                    -- conduit-1.0.0
import Network.HTTP.Conduit            -- http-conduit-1.9.0
import Network.HTTP.Types              -- http-types-0.8.0
import Network (withSocketsDo)

oauth :: OAuth.OAuth
oauth = OAuth.newOAuth
    { OAuth.oauthServerName = "twitter"
    , OAuth.oauthRequestUri = "https://twitter.com/oauth/request_token"
    , OAuth.oauthAccessTokenUri = "https://api.twitter.com/oauth/access_token"
    , OAuth.oauthAuthorizeUri = "https://api.twitter.com/oauth/authorize"
    , OAuth.oauthSignatureMethod = OAuth.HMACSHA1
    , OAuth.oauthConsumerKey = error "Consumer key"
    , OAuth.oauthConsumerSecret = error "Consumer secret"
    , OAuth.oauthVersion         = OAuth.OAuth10a
    }

endpoint x = "https://api.twitter.com/1.1/" ++ x ++ ".json"

fetch :: Method -> Credential -> String -> SimpleQuery -> IO JSON.Value
fetch mth cred p q = withManager $ \man -> do
    req <- parseUrl (endpoint p)
    req' <- signOAuth oauth cred (req {method=mth,queryString = renderSimpleQuery True q})
    res <- httpLbs req' man
    maybe (fail "JSON decoding error") return $ JSON.decode (responseBody res)

fetchGET = fetch methodGet
fetchPOST = fetch methodPost

main = withSocketsDo $ do
    let cred = newCredential (error "Access token") (error "Access token secret")
    result <- fetchGET cred "users/show" [("screen_name", "fumieval")]
    print result
```
autossh で ssh 切断時に自動で再接続する

ノートPCで作業してると、移動時ネットワークが切れて ssh セッションが切れ、仮想端末は screen/tmux で状態復元が可能ですが、port forwarding なんかを活用してる場合再接続がめんどくさかったりしますよね。あれ、切れてるジャン…みたいな。

そんな場面が多い場合、 autossh を使うと便利です。

- http://www.harding.motd.ca/autossh/

```
brew install autossh
```

でインストールして

```
autossh -M 空きポート -f -C 接続先 ping -i 30 localhost
```

しておくとあら便利！自動で再接続してくれます。

なお、~/.ssh/config に

```
Host hostname.proxy
  HostName hostname
  DynamicForward 10023
  LocalForward localhost:6667 localhost:6667
```

とか、通常接続とは違う port forwarding 専用の設定を作っておくとわりと便利です。社内で定期的に出る話題なのでシェア！


あと Mosh の話しはきいてません!
Ruby 2.0.0 で gem でインストールした拡張ライブラリの require に失敗する

## 注意、この問題は修正されました

追記：Ruby 側で修正されたので、2.0.0 リリースでは問題なくなります
- https://bugs.ruby-lang.org/projects/ruby-trunk/repository/revisions/39366

コンパイル通って出来るファイル実体を直接 require するとちゃんと使えてるんだけど、gem でインストールと require できず、何かおかしい。

近くの席に Ruby コミッターが偶然座ってた(べんりな会社だ〜)ので尋ねてみたら、拡張ライブラリ gem の lib ディレクトリ以下に何らかのファイルが存在しないと、何故か "lib" という名前で gem install 時に拡張ライブラリの実体がコピーされてしまう、バグだと思うので issue に上がってるはず(ググったけどぱっと見つけられなかった)、とのこと。

対策は lib ディレクトリ作って適当にファイル置いておけばおｋ、とのことで( mkrn が)対策した。

例えば MessagePack での対策はこんな感じ

- https://github.com/msgpack/msgpack-ruby/pull/5/files

他にも同様の対策が必要な拡張ライブラリがいくつかありそうなふいんき。
SublimeText2 の RubyMotionBuilder で Build が失敗する場合の対処法


SublimeText2 Plugin の RubyMotionBuilder で 次のようなメッセージとともに Build があぼんする場合

    rake aborted!
    no such file to load -- bundler/setup

メッセージ通りなのですが bundler への Path が通っていないのが原因です。

## 対処法
    ~/Library/Application\ Support/Sublime\ Text\ 2/Packages/User/RubyMotion.sublime-settings
を開いて ( なければ作成 )

    {
        "rubymotion_build_env_file": "$HOME/.bash_profile"
    }

と記載してあげればOK。要 絶対Path。

## 補足
rubymotion_build_env_file は Plugin 内での Rake コマンド実行時に読み込ませる env_file を指定するオプションです。
budler への Path 設定を ~/.bash_profile 以外で実行している場合は適宜自分の環境に合わせてしてください。
WEB+DB PRESS vol.73のRefinementのコードについてのサポートページ

Ruby 2.0 のRefinementについて、以下の仕様(Refinementのモジュール/クラス内部スコープ) は 2.0 では入りません。

* Refinementの有効範囲について、「`Module#refine`が宣言されたModuleでは有効」である
* `Class#using` により、当該クラス内部でのみRefinementを有効化できる

また、

* `require "refinement"` 

は必要ありません。

以下の仕様は正しいものとなります。

* トップレベルに定義された `using` を利用することでRefinementは有効になる
* Refinementの変更のスコープはファイル内のみとなる

よって、

* 本誌 128 ページの左段と右段一番上のコードはそのままでは動作しないものとなっています。
* 本誌 128 ページの右段中部、「特定の範囲で外部コマンド実行を禁止する」のコードは`require "refinement"`の箇所以外そのまま利用できます（トップレベルの関数的メソッドを Object のrefineで上書きすることが可能です）。

代替コードを以下に示します。

```ruby:main.rb
def assert_equal(a, b)
  puts "#{a} should be #{b}"
end
 
module InchAvailable
 refine Fixnum do
    def inch
      self * 2.54
    end
    alias inches inch
  end
end
 
require './sample_class'
 
begin
  p 3.inches
rescue => e
  puts "*** should raise error outside", e.class, e
end
 
puts "*** ok if defined inside, but used outside"
assert_equal SampleClass.get_price_from_inch(10), 254.0
 
using InchAvailable
puts "*** ok after main.using"
assert_equal 3.inches, 7.62
```

```ruby:sample_class.rb
using InchAvailable
puts "*** inside sample_class.rb"
class SampleClass
 
  assert_equal 3.inches,  7.62
 
  def self.get_price_from_inch(size)
    10 * size.inch
  end
end
```

[RefinementsSpec](http://bugs.ruby-lang.org/projects/ruby-trunk/wiki/RefinementsSpec) というwikiの記事も併せてご参照ください。
FlashBuilder4.7でAIR SDKを3.4から上げる方法はSDKフォルダを上書きしないといけない


#デフォルトのAIR SDKが3.4で、SDKを追加しても無意味！SDKフォルダ上書きしないといけない！

(ActionScriptプロジェクトの場合。Flex系は普通にSDK追加→選択ができる)

##現象
- FlashBuilder4.6のときみたいにSDKの追加はできる。が、
- ActionScriptモバイルプロジェクトなどのAS系プロジェクトでは、デフォルトSDKしか選択できない

↓こんな感じ。
http://gyazo.com/5f9b44cdab9f9cddeba2647d0d754655

「アップデートを確認」をしても、なにも起きない


このへんで指摘されてる
http://forum.starling-framework.org/topic/flash-builder-47-update-tips

Adobeのひとは「いい感じにするよ！」との言葉を放ち、2ヶ月がすぎている。

##やり方
公式に書いてあるが、AIR3.6をこのままやると動かなくなる
http://helpx.adobe.com/flash-builder/kb/overlay-air-sdk-flash-builder.html

### 1.ここのAIR SDKを新しいのに上書きする
- Windows 7: 
 - C:\Program Files (x86)\Adobe\Adobe Flash Builder 4.7\eclipse\plugins\com.adobe.flash.compiler_4.7.0.349722
- Mac OS: 
 - /Applications/Adobe Flash Builder 4.7/eclipse/plugins/com.adobe.flash.compiler_4.7.0.349722

### 2.stripフォルダを作成
AIRSDK\lib\aot\bin

にstripフォルダを作成

### 3.FlashBuilderを再起動
これで新しいSDKが設定されてるはず。


### 以下公式の方法をやると失敗する、というログ。

### (失敗するやりかた) 2.aotフォルダをごにょる
デフォルトのSDKのlib/aotフォルダをコピーして新しいところに持っていく
Copy the contents from the aot folder (AIRSDK_back_up\lib\aot) of the AIR SDK backup to the aot folder of the newly created AIR SDK (AIRSDK\lib\aot).

### (失敗するやりかた) 3. AIR 3.6以上の場合はstripフォルダを作成(さっきコピーしたaot/binの中になければ) 
Note: If you update Flash Builder 4.7 with AIR SDK 3.6 or later, create an empty folder named strip. Put it in the following location of the newly extracted folder if it doesn't exist: AIRSDK\lib\aot\bin


### (失敗するやりかた) 4.と思ったら、エラー

http://forums.adobe.com/message/5085920?tstart=0

``` text
SDK is missing GPL component /Applications/Adobe Flash Builder 4.7/eclipse/plugins/com.adobe.flash.compiler_4.7.0.349722/AIRSDK/lib/aot/bin/as/as-arm
```

なので、
新しいSDKのaot/binの中にあった

- as-arm
- as-386

を追加してみた

するとまたエラー

``` text
/var/folders/r9/hn2_9_l908l2ttgqsbqp1vxc0000gn/T/cmd497154224586632122.tmp: line 2: /Applications/Adobe Flash Builder 4.7/eclipse/plugins/com.adobe.flash.compiler_4.7.0.349722/AIRSDK/lib/aot/bin/ld64/ld64: No such file or directory
Compilation failed while executing : ld64
```

aot/bin/ld64/ld64

-ld64をコピー

エラーは消えたが、アプリを開くと真っ黒画面になって、ちゃんと起動しないという恐ろしい結果に…。
FactoryGirlでファイルアップロードを偽装する

```ruby:spec/factories/users.rb
# coding: utf-8
include ActionDispatch::TestProcess

FactoryGirl.define do
  factory :user do
    name { Faker::Name.name }
    avatar { fixture_file_upload Rails.root.join('path', 'to', 'avatar.png'), 'image/png' }
  end
end
```
っていう風にすると良い。

こうすることで、avatar.pngをアップロードした状態のUserを生成できる。

最初`ActionDispatch::TestProcess`をincludeし忘れてて、「なんで動かないんじゃこいつ」ってなってたので、多分他にも困ってる人いるんじゃないかなぁ。

と思ってたら↓こういうやり方もあるらしい。

[How to: Use test fixtures](https://github.com/jnicklas/carrierwave/wiki/How-to%3A-Use-test-fixtures)

便利だなぁ。やり方を公式が載せてくれてるのは大変ありがたいことです。
JS-CLOSで多重ディスパッチと多重継承

Common Lisp Object System(CLOS)に似たオブジェクトシステムをJavaScriptで使える[JS-CLOS](https://github.com/ympbyc/js-clos)の紹介です。
多重継承、多重ディスパッチ(総称関数)、インスタンス作成時の簡単な型チェックなどができます。

CLOSではオブジェクトは単なるスロットの集合で、メソッドはオブジェクトに属しません。メソッドに相当するのは総称関数です。
CLOSについての詳しい説明は[wikipedia](http://ja.wikipedia.org/wiki/Common_Lisp_Object_System)等を参照してください。

まずは小手調べ。MLやHaskellのパターンマッチみたいなことをしてみます。

```fib.coffee
fib = define_generic()
 
define_method fib, [0], -> 0
define_method fib, [1], -> 1
define_method fib, ["number"], (n) ->
  fib(n - 1) + fib(n - 2)
 
fib 20
#=> 6765
```

+ `define_generic()`　は総称関数を作ります。
+ `define_method 総称関数, [パターン], メソッド`　は *総称関数* が適用される際に *パターン* に適合する実引数が与えられたら *メソッド* を呼ぶよう設定します。複数のパターンにマッチする時は、一番特殊なパターンが選択されます。

パターンは、

+ 具体値として === で比較されるオブジェクト
+ `undefined` --ワイルドカード
+ typeof で返される文字列 ("string", "function", など)
+ instanceofで比較されるクラス (コンストラクタ関数)
のどれかです。

次に多重ディスパッチの例です。

```bump.coffee
floor  = define_class []
carpet = define_class []
ball   = define_class []
glass  = define_class []
 
bump = define_generic()
 
define_method bump, [ball, floor],        -> 'bounce'
define_method bump, [glass, floor],       -> 'crash'
define_method bump, [undefined, carpet],  -> 'silence'
 
bump new ball, new floor                 #bounce
bump (make ball), (make floor)   #bounce
 
bump new glass, new floor                #crash
 
bump new ball, new carpet                #silence
bump new glass, new carpet               #silence
```

+ `define_class [親], バリデータ` はクラスを作ります。これはnew演算子、またはmake関数を適用するとインスタンスを生成する関数です。

最後に多重継承の例。

```lion.coffee
# domain
animal = define_class [], (x) ->
  slot_exists x, 'voice', 'string'
 
cat = define_class [animal]     #猫は動物のスロットを継承
 
osx = define_class [], (x) -> 
  slot_exists x, 'hostname', 'string'
 
lion = define_class [cat, osx]       #ライオンは猫とOSX両方のスロットを継承
 
# definitions
 
say = define_generic()
define_method say, [animal], (a) -> a.voice 
define_method say, [cat], (c) -> c.voice + ' meow'
 
hostname = define_generic()
define_method hostname, [osx], (o) -> o.hostname
 
# main
 
alice = make lion,
             voice: 'roar'
             hostname: 'example.com'
 
say alice
#=> 'roar meow'
 
hostname alice
#=> 'example.com'
```

+ `slot_exists オブジェクト, キー, パターン` は、*オブジェクト に  _キー_  が存在し、かつ _パターン_ にマッチする値が格納されている場合にtrueを返します。
+ `define_class`に第2引数として与えられた関数は、インスタンス生成時のスロット初期化の際に呼ばれます。falseを返すと初期化を失敗させることができます。

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

菱形継承問題などのコーナーケースはだいたい考慮されていません。

よかったら遊んでみてください。プルリクエストお待ちしています。
画面デザインに関するメモ

デザイナー不在のプロジェクトに関わってる人も多いと思うのでシェアします。
何年か前、ユニバーサルデザインを考慮しないといけなかったときに調べたやつです。

## 色弱対応
 * ブルー系＋イエロー系は安全圏。
 * 赤と緑はとにかく避ける。どうしても使いたい場合は明度で見分けがつくようにする。
 * 「楽しさ」を配色だけで表現するのは難しい。レイアウトやイラストで工夫する。
 * パステルカラーは避ける。

## その他の注意
 * 色による意味づけをする。意味のない配色は見づらい。
 * ただし、色だけによる情報伝達は避ける。
 * 文字、絵、背景を分ける。
 * 説明が必要なアイコンは好ましくない。
 * 〒など、日本人にしか通じない記号を使ってはいけない。
 * エフェクトにも意味づけが必要。
 * エフェクトの多用は禁物。
 * 視線の流れを意識してレイアウトする。
1. 画面全体
2. 四隅
3. 左上→右上→左下→右下（Z型の視線）

あとは、AndroidとかiOSのアプリであれば画面デザインのガイドラインに従う、という感じ。
NSLogマクロ

他の方が、NSLogマクロを投稿してらしたので便乗して、
自分が使用してるマクロも公開


    //	Objective-C
    #ifdef __OBJC__

    //	debugでしかログを出さない
    #ifdef DEBUG 
    #define __DISPLAY_LOGS__
    #endif

    #ifdef __DISPLAY_LOGS__
	#define NSLogCGAffineTransform(x) NSLog(@"CGAffineTransform : %@", NSStringFromCGAffineTransform(x))
	#define NSLogCGPoint(x) NSLog(@"CGPoint : %@", NSStringFromCGPoint(x))
	#define NSLogCGRect(x) NSLog(@"CGRect : %@", NSStringFromCGRect(x))
	#define NSLogCGSize(x) NSLog(@"CGSize : %@", NSStringFromCGSize(x))
	#define NSLogClass(x) NSLog(@"Class : %@", NSStringFromClass(x))
	#define NSLogProtocol(x) NSLog(@"Protocol : %@", NSStringFromProtocol(x))
	#define NSLogRange(x) NSLog(@"Range : %@", NSStringFromRange(x))
	#define NSLogSelector(x) NSLog(@"Selector : %@", NSStringFromSelector(x))
	#define NSLogUIEdgeInsets(x) NSLog(@"UIEdgeInsets : %@", NSStringFromUIEdgeInsets(x))

    #else
	#define NSLogCGAffineTransform(x) ;
	#define NSLogCGPoint(x) ;
	#define NSLogCGRect(x) ;
	#define NSLogCGSize(x) ;
	#define NSLogClass(x) ;
	#define NSLogProtocol(x) ;
	#define NSLogRange(x) ;
	#define NSLogSelector(x) ;
	#define NSLogUIEdgeInsets(x) ;
	#define NSLog(m, args...) ;
    #endif

    #endif


こんな感じのを、ヘッダーに纏めて
そのヘッダーファイルを、prefixで読み込ませて使用してます。
AppKitとOpenGL 3.0

NSOpenGLViewは、NSOpenGLPixelFormatをいじってやることでOpenGL 3.2 Core Profileを使うことが出来る。
しかし、そこでgl3.hをインクルードすると、「gl.hとgl3.hは同時にインクルードできないよ」とコンパイラに言われてしまう。

ビルド設定のプリプロセッサマクロに```GL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED```を定義すれば警告は消せるのだが、なぜこんな事態になっているのか。

実は、```gl.h ⊂ CoreVideo/CVOpenGLBuffer.h ⊂ QuarzCore/CIImage.h ⊂ AppKit/NSCIImageRep.h```という風にインクルードされていて、Cocoaをプレフィックスヘッダでインクルードすると自動的にgl.hもインクルードされるらしい。
別にヘッダファイルでgl.hをインクルードする必要はないんじゃないか？

何か腑に落ちないのでどうにかしてほしい。
StrongParametersとnested_attributesではまった件

どうもどうも。

自分Rails3.2.xにStrongParametersとActionArgsをbundleして使ってるんですが、昨日たまたまそれで予期しない挙動にはまって、

＼( ‘ω’)／ウオオオオオオアアアアーーーーッッッ！！！！

ってなったので、備忘録として残しておこうと思います。

## こういうRailsアプリを書きました

モデルとコントローラーは↓みたいな感じで。

```ruby:user.rb
class User < ActiveRecord::Base
  has_many :global_names
  accepts_nested_attributes_for :global_names
end
```
```ruby:global_name.rb
class GlobalName < ActiveRecord::Base
  belongs_to :user
end
```
```ruby:users_controller.rb
class UsersController < ApplicationController
  permits :username, :first_name, :last_name, global_names: [:first_name, :last_name]

  def edit id
    @user = User.find id
  end

  def update id, user
    @user = User.find id

    if @user.update_attributes user
      redirect_to @user, notice: 'User was successfully updated!'
    else
      render 'edit'
    end
  end
end
```
```haml:edit.html.haml
%h1 Edit User

= form_for @user do |f|
  .field
    = f.label :username
    = f.text_field :username
  .field
    = f.label :first_name
    = f.text_field :first_name
  .field
    = f.label :last_name
    = f.text_field :last_name
  .field
    = f.fields_for :global_names do |gn_field|
      .field
        = gn_field.label :first_name
        = gn_field.text_field :first_name
      .field
        = gn_field.label :last_name
        = gn_field.text_field :last_name
      = gn_field.hidden_field :id
  
  .actions
    = f.submit
```

## ところがどっこい問題発生だよ

さて、こいつの問題点はどこなのか。とりあえずおもむろにGlobalNameを突っ込んで更新しましょう……あれ？

＼(^o^)／＜フォームが増えたよ！！

ちょっと訳がわからないですね…気のせいかもしれないのでそのまま更新しましょう……えっ？

＼(^o^)／＜フォームが2倍になったよ！！

## どういうことなの……

debuggerとかで調べても何も出て来ませんし、もちろんエラーは吐いてません。500になってないしeditがrenderされてるわけでもない。ワケがわからない！

で、ここで思い出してみましょう。これまでのRailsアプリとの違いを。そう、StrongParametersという存在を！

```ruby:users_controller.rb
class UsersController < ApplicationController
  permits :username, :first_name, :last_name, global_names: [:first_name, :last_name]
end
```

よく見てみるんだ。global_namesの中にidがない！！

## というわけで

今回はまった件はただの凡ミスでした／(^o^)＼ﾅﾝﾃｺｯﾀｲ

でもこれはまる人多そうなので気をつけてくださいね。
Re: Perlでカリー化する関数を書いてみた


http://qiita.com/items/dcf066ed37f18d10414e

なんか面白そうだったので自分でもやってみた。

カリー化ってA×B×C×...→Z の関数を A→B×C×...→Z にできれば十分だと思ったので、変換後の引数の数は1つと決めてしまった。そういう意味では再帰的に変換する必要もなかったのだけど、元ネタに揃えて A×B×C×...→Z を A→B→C→...→Zにまで変換するようにした。なので、引数が1個になるまでカリー化を続ける必要があるので、やっぱり引数の数は必要なのだった。

```perl:
sub curry ($$); sub curry ($$) {
    my ($argc, $f) = @_;
    $argc <= 1
        ? sub ($) { goto &$f } # wrap for the right prototype
        : sub ($) {
            my $arg = shift;
            curry ($argc - 1, sub { $f->($arg, @_) });
        };
}
sub curried_curry ($); *curried_curry = curry 2 => \&curry;
sub curry2 ($); *curry2 = curried_curry 2;
sub curry3 ($); *curry3 = curried_curry 3;

sub mul3 ($$$) {
    my ($a,$b,$c) = @_;
    return $a * $b * $c;
}

my $c = curry2 \&mul3;
print $c->(2)(3, 4), "\n";

my $cm = curry3 \&mul3;
my $x = $cm->(2)(3);
print $x->(4), "\n";
```

curried_curry 辺りが一番書いてて脳汁が出る楽しい部分ｗ プロトタイプは趣味で入れてあるけど、そもそも推奨されてないしやり過ぎ感。と思いつつも、プロトタイプをパースすれば引数の数を渡す必要はないかも？

ちなみにA×B×C×...→Z の関数を(A×B×C×...)×(L×M×...)→Z みたいに見なして A×B×C×...→L×M×...→Z のように処理する機能が元のコードでもあったけど、それは再現していない(型が静的に決められないのでこの実装方針だと難しい)。
標準入力の受け取りのその１

はい。 なんでこの記事は今でもたまにストックされるんだろうか。。。。
最終更新日 2017/03/03  
Python3対応版で新記事起こしました。 2とか古いのでこれからの人は使うのは絶対にやめましょう。2は絶対に使わないでください。
[http://qiita.com/clarinet758/items/33bed8bb2907c68b5242](http://qiita.com/clarinet758/items/33bed8bb2907c68b5242)  

未だに2系の記事がストックされる意味がわからないし、どうせ読んでないでしょ？と思います。
どうしてもという方は編集履歴からお願いします。
Tools > Run Command… で困らないために


IntelliJ IDEA シリーズはコマンドラインシェルをウィンドウの中で起動できて、IDEの機能にまだないちょっとしたコマンドを実行することができる。...はずなんだけど、環境変数が足りなかったり、欲しいコマンドにパスが通っていなかったりする。おもむろに `npm install …` とかやって実行できなくて焦る。

落ち着いて、 Tools > Run Command… で `env` と打つと、`PATH` が `/usr/local/bin` 等の便利なところに通っていないのがわかる。これでは使いたいコマンドをすぐに使うことができない。

 **どうやら .launchd.conf ではダメっぽいので訂正です。このtipsは間違いでした。正しくは…**

Launchpadからいきなりアプリケーションを起動するんじゃなくて、自分の環境が整ったシェルから起動すれば、その環境を引き継いでくれます。

Tools > Create Command-line Launcher…

を使うと、`/usr/local/bin/pstorm` というコマンド(PhpStormの場合)を作ることができます。これの正体は、`open -a インストールパス 引数いろいろ` を最終的に実行するPythonスクリプト。

で、作ったらあとは、いちどアプリを終了させ、改めてシェルから `pstorm` として起動します。これで Tools > Run Command がシェルの環境を引き継いでくれるようになります。普通に起動しちゃダメというのは厄介ですが、開発環境によってはrvmでRubyのバージョンを指定してから始める必要があるなんてこともありえるので、つねにシェルから起動する癖をつけておくといいかもしれませんね。

ちなみに、プロジェクトのあるディレクトリを引数に指定するといきなりプロジェクトを開いてくれます。あと、すでに起動中でもコマンドは受け付けてもらえて、起動中のIDEに対して、ファイルを行指定で開けとかできるリモコンにもなります。

```
pstorm -l 10 path/to/myfile.txt
```

PyCharmの人とRubyMineの人はタグなしでごめんなさいですが、5こ以上タグ付けるとダメらしいので。
Railsで2つ以上の値の組み合わせに対するユニーク制約をかける

例えばLikeの実装で例えば1つの記事に対しては1ユーザー当たり1回しかLikeできないとします。
つまり、(article_id, user_id)の組み合わせはユニークでなくてはなりません。
そういったときのvalidationの書き方は以下のようにかなりシンプルに書くことができます。

```ruby:like.rb
class Like < ActiveRecord::Base
  belongs_to :user
  belongs_to :article

  validates :user_id, :uniqueness => {:scope => :article_id}
end
```
awk内でシングルコーテーションを使いたい

# 結論 
\047で囲ってあげる

## 使用例

```
mysql> desc user_data;
+---------+-----------+------+-----+---------+----------------+
| Field   | Type      | Null | Key | Default | Extra          |
+---------+-----------+------+-----+---------+----------------+
| id      | int(11)   | NO   | PRI | NULL    | auto_increment |
| user_id | int(11)   | YES  |     | NULL    |                |
| data    | int(11)   | YES  |     | NULL    |                |
| detail  | char(255) | YES  |     | NULL    |                |
+---------+-----------+------+-----+---------+----------------+
4 rows in set (0.01 sec)

$ cat sample.list
3 300
4 400

# awkの特性上、どうしてもシングルコーテーションで囲わないとだめ。
# で、MySQLのinsert文を吐き出す場合にダブルコーテーションで囲う必要があるため、insert文中に文字列を含める場合にシングルコーテーションが使えない時がある

$ awk '{printf("INSERT INTO user_data (user_id, data, detail) VALUES (%d,%d,\047テストデータ\047);\n"),$1,$2;}' sample.list > sample.sql

# テストデータという文字列がシングルコーテーションで囲われていることがわかる
$ cat sample.sql
INSERT INTO user_data (user_id, data, detail) VALUES (3,300,'テストデータ');
INSERT INTO user_data (user_id, data, detail) VALUES (4,400,'テストデータ');
```
Linuxでrenameコマンドを使おう

ファイル名をリネームするのにはmvでできますが、カレントディレクトリから深いところにあるファイルとかをリネームするとき

```
mv ./hara/horo/hire/hare/foo.txt ./hara/horo/hire/hare/bar.txt
```

とかちょっとアレです
そんなときはrenameコマンド
https://wiki.ubuntulinux.jp/UbuntuTips/FileHandling/RenameCommand
UNIXにこのコマンドがないこともあって余り知られていませんが、どのLinuxにも含まれています。・・・とのことです。

```
rename s/foo/bar/ ./hara/horo/hire/hare/foo.txt
```

でリネームできます.
なんかmanに書いてあるとおりでは動かなくて、`rename perl正規表現 対象ファイル`で動きます

このコマンド、perlのスクリプトなんで開いてみると

```
whereis rename
```


```
die "Usage: rename [-v] [-n] [-f] perlexpr [filenames]\n"
    unless GetOptions(
  'v|verbose' => \$verbose,
  'n|no-act'  => \$no_act,
  'f|force'   => \$force,
    ) and $op = shift;
```
-vオプションが指定できます

じぶんは.bash_profileや.bashrcに書いておきました

```
alias 'rename'='rename -v'
```

```
$ rename s/foo/bar/ foo.txt 
foo.txt renamed as bar.txt
```
と出力結果を教えてくれます
もちろん本領は正規表現で指定できることでソースのサンプルなんかが参考になります

例えば、.bakという拡張子を全部とるとか
For example, to rename all files matching C<*.bak> to strip the extension,
you might say

```
  rename 's/\.bak$//' *.bak
```

大文字を小文字に変えるとか
To translate uppercase names to lower, you'd use

```
  rename 'y/A-Z/a-z/' *
```
UIImageを少し暗くしたUIImageを生成する


FrogApps 技術ブログ始めました！
RailsやiOS、HTML5の情報を発信中!! → http://qiita.com/teams/frogapps

---

ボタンやセルを押した時の画像として、元のUIImageを少し暗くしたUIImageが欲しいことがあります。
それ用にPNGファイルを用意するのはアプリのサイズが増えてしまうので、暗くしたUIImageを生成するメソッドを作成しました。

```objectivec:darken.m
- (UIImage *)darken:(UIImage*)image {
    CGRect rect = CGRectMake(0.0f,0.0f,image.size.width,image.size.height);
    
    UIGraphicsBeginImageContextWithOptions(image.size,NO,0);
    [image drawInRect:rect];
    [image drawInRect:rect blendMode:kCGBlendModeDifference alpha:0.3f];
    UIImage* blendedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return blendedImage;
}
```

元画像にkCGBlendModeDifferenceで同じ画像をブレンドしています。ポイントは元画像を２回使っていることで、透過部分は透過のままになってくれます。

これでお手軽に暗い画像を生成できます。細かい制御はできないけど、アルファ値でおおざっぱに暗さを指定できます。
Kiwi + AFNetworking で Undefined symbols for architecture  エラーが出た場合の対処


Kiwi については以下のインストール手順通り。

https://github.com/allending/Kiwi/wiki/Getting-Started-with-Kiwi-2.0

で、AFNetworking を使うので Podfile を以下のように変更。

```
platform :ios, '5.1'

pod 'AFNetworking', '1.1.0'

target :NSRemoteJsonObjectTests, :exclusive => true do
   pod 'Kiwi'
end
```

Test 時に以下のエラーが。

```
Undefined symbols for architecture i386:
  "_SCNetworkReachabilityCreateWithName", referenced from:
      -[AFHTTPClient startMonitoringNetworkReachability] in libNSRemoteJsonObject.a(AFHTTPClient.o)
  "_SCNetworkReachabilityGetFlags", referenced from:
      -[AFHTTPClient startMonitoringNetworkReachability] in libNSRemoteJsonObject.a(AFHTTPClient.o)
  "_SCNetworkReachabilityScheduleWithRunLoop", referenced from:
      -[AFHTTPClient startMonitoringNetworkReachability] in libNSRemoteJsonObject.a(AFHTTPClient.o)
  "_SCNetworkReachabilitySetCallback", referenced from:
      -[AFHTTPClient startMonitoringNetworkReachability] in libNSRemoteJsonObject.a(AFHTTPClient.o)
  "_SCNetworkReachabilityUnscheduleFromRunLoop", referenced from:
      -[AFHTTPClient stopMonitoringNetworkReachability] in libNSRemoteJsonObject.a(AFHTTPClient.o)
  "_UTTypeCopyPreferredTagWithClass", referenced from:
      _AFContentTypeForPathExtension in libNSRemoteJsonObject.a(AFHTTPClient.o)
  "_UTTypeCreatePreferredIdentifierForTag", referenced from:
      _AFContentTypeForPathExtension in libNSRemoteJsonObject.a(AFHTTPClient.o)
  "_kUTTagClassFilenameExtension", referenced from:
      _AFContentTypeForPathExtension in libNSRemoteJsonObject.a(AFHTTPClient.o)
  "_kUTTagClassMIMEType", referenced from:
      _AFContentTypeForPathExtension in libNSRemoteJsonObject.a(AFHTTPClient.o)
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

解決策としては、Test 用のターゲットの Build Phases -> Link Binary With Libraries に、MobileCoreServices.framework と SystemConfiguration.framework を追加することでエラーが回避できました。
iノードとリンク

会社の同僚と話題になったハードリンクとシンボリックリンクについてです。linux上ではディレクトリ、ファイルはiノード番号として管理しています。このiノード番号は、重複しないようにカーネルが割り当てます。基本的にlinux内でファイルを扱う場合、ファイル名という概念ではなく、iノード番号でファイルを認識しています。
linuxには、ハードリンクとシンボリックリンクという二つのリンク機能があります。

ハードリンクの挙動をみる。下記のようにtest.txtファイルがあるとします。
lsコマンドの出力の左端にある10889210がiノード番号、ユーザ(hoge)の前に1と表示されているものがリンク数です。

```:sh
$ ls -il
10889210 -rw-rw-r--. 1 hoge hoge 24  3月 12 20:51 test.txt
```

ハードリンクを作成する。

```:sh
$ ln test.txt test1.txt
$ ls -il
10889210 -rw-rw-r--. 2 hoge hoge 24  3月 12 20:51 test.txt
10889210 -rw-rw-r--. 2 hoge hoge 24  3月 12 20:51 test1.txt
```

↑の出力を見ると、どちらのファイルも同じiノード番号を持っています。またリンク数も2に増えています。

test1.txtに適当に文字を追加して保存してdiffで二つのファイルの差分を見るが差分なし。また、同様にして、test.txtに対して同じことをやっても同じ結果となる。

```:sh
$diff test.txt test1.txt 
```

↑から分かることは、test.txtとtest1.txtは同じファイルであるということ。どちらか一方がマスターという感覚がないということ。

test1.txtを削除したらどうなるのか?
→test.txtは存在し、リンク数が1になった。

```:sh
$ rm test1.txt 
$ ll
10889210 -rw-rw-r--. 1 hoge hoge 30  3月 12 21:18 test.txt
```

シンボリックリンクの挙動ををみる。

```:sh
$ln -s test.txt test1.txt
```

lsでファイルの詳細情報を見ると、iノード番号が異なることが分かる。また、test1.txtの横に→　test.txtと表示されていることが分かる。

```:sh
$ ls -il
10889210 -rw-rw-r--. 1 hoge hoge 30  3月 12 21:18 test.txt
10889047 lrwxrwxrwx. 1 hoge hoge  8  3月 12 21:25 test1.txt -> test.txt
```

シンボリックリンクファイル(test1.txt)を編集して、diffで比較すると差分なし。
マスターファイル(test.txt)を編集して、diffで比較すると差分なし。

マスターファイルを削除した際のシンボリックリンクファイルは？
→アクセスに失敗（新しいファイルとして表示される）

以上より、シンボリックリンクは、マスターのファイル名を利用していることが分かる。

これだけを見るとシンボリックリンクよりハードリンクの方がよい感じがしますが、
ハードリンクがiノード番号を利用していることから、異なるデバイス上では動作しません。一方、シンボリックリンクは、ファイル名を利用しているため、異なるデバイス上でも関係なく動作します。結論としては、用途に合わせて使い分けましょうってことですかね。
delegateするまでもない場合のBlocksの利用

モーダルで表示した画面とのやり取りで、一個の値だけ取り出してDismissするだけのために独自にDelegate作成するの嫌だよなーというときにBlocksというか関数ポインタというか的な感じで手抜きをしちゃう場合です。

どこかのタイミングで、
	[self performSegueWithIdentifier:@"SegueName" sender:self];
あるいは、単純にInterfaceBuilder上からボタンなどに連携させても良い

```モーダル画面の親側（実装：.m）
    if([segId isEqualToString:@"SegueName"]) {
		[[segue destinationViewController] setFunc:^(NSString * n) {
			NSLog(@"%s nickname=%@",__FUNCTION__,n);
                       // nを煮るなり焼くなりしてください。
			[self dismissModalViewControllerAnimated:YES];
		}];

    }
```

表示する側の実装もしたくなけど、これは手を抜けないっぽい。
例えば、テキストに文字を入力してもらうだけとかの場合、UIViewControllerにTextFieldを一つ貼付ける。

```モーダル画面（定義：.h）側
 typedef void (^SetTextFunc) (NSString *);
 @interface MyViewContoller : UIViewController
 @property (nonatomic, copy) SetTextFunc func;
 @end
```

funcがポイントですかね。ちなみに、ARC前提です。

```モーダル画面（実装：.m）側
@interface MyViewContoller()
{
	__weak IBOutlet UITextField *txt;     // 貼付けたTextField
}
@end
@implementation MyViewContoller
- (IBAction)onClose:(id)sender                 // 確定ボタンとかが押された時に呼ぶ
{
	if (_func==nil) return;
	_func(txt.text);
}

@end
```

もう少しスッキリさせたいところですが。。。
画像リソースを軽量化する

開発TIPSでもなんでもないと怒られそうですが。

通常Retina画像と通常サイズの画像を用意すると思いますが、Retina画像だけでリソースを準備します。ファイル名は＠2とか付けないでそのままです。

で、使う画像リソースをそのまま使えば、非Retina機で縮小された形で普通に表示されます。

画像リソースが多くてファイル容量削りたいってプロジェクトもあると思います。こんなことで実はファイル容量減らせます。

動画は無理ですが、画像ファイルならこのやり方で、通常サイズの物を全てなくす事ができます。

NTTのロケーション使ったゲームでこんな作り方してます。実際大分減ってます。はい。
perltidy - Perlソースコード整形ツール

# About
Perlのソースコードを統一したルールで整形してくれる。
チームでコーディングするとき、特に有用。
[CPAN Perltidy](http://search.cpan.org/~shancock/Perl-Tidy-20121207/)

# How to install.
`$ cpanm Perl::Tidy`
`which perltidy`でInstall成功を確認

# Setting
$HOME/.perltidyrcに以下のように書く(Perl best practicesより)

```csh:.perltidyrc
-l=78   # Max line width is 78 cols
-i=4    # Indent level is 4 cols
-ci=4   # Continuation indent is 4 cols
#-st     # Output to STDOUT
-se     # Errors to STDERR
-vt=2   # Maximal vertical tightness
-cti=0  # No extra indentation for closing brackets
-pt=1   # Medium parenthesis tightness
-bt=1   # Medium brace tightness
-sbt=1  # Medium square brace tightness
-bbt=1  # Medium block brace tightness
-nsfs   # No space before semicolons
-nolq   # Don't outdent long quoted strings
-wbb="% + - * / x != == >= <= =~ !~ < > | & >= < = **= += *= &= <<= &&= -= /= |= >>= ||= .= %= ^= x="
        # Break before all operators
```

# How to use.
`$ perltidy target.pl`
target.plが整形される。

# How to use. (emacs)
$HOME/.emacsに以下を追加。

```common-lisp:.emacs
(defun perltidy-region ()               ;選択regionをperltidy
   "Run perltidy on the current region."
   (interactive)
   (save-excursion
     (shell-command-on-region (point) (mark) "perltidy -q" nil t)))
(defun perltidy-defun ()                ;開いているソースをperltidy
  "Run perltidy on the current defun."
  (interactive)
  (save-excursion (mark-defun)
                  (perltidy-region)))
```

使用方法
* リージョン選択後、M-x perltidy-region → 選択範囲を整形
* Perlのソース上で、M-x perltidy-defun → ソース全体を整形(__**__以降は除外される)
[2013/3/12] herokuのbundle時にthor(1.7.0)とかで [ArgumentError: invalid byte sequence in US-ASCII]とかが出る場合はGemfileにrubyのバージョンを指定しましょう

今日

とあるRailsプロジェクトをbundle updateしてherokuへ上げたら、herokuのbundle中にthorでエラーが履かれてデプロイに失敗しました。

以下herokuでのbundle時のエラー

```ruby
ArgumentError: invalid byte sequence in US-ASCII
An error occurred while installing thor (0.17.0), and Bundler cannot continue.
    Make sure that `gem install thor -v '0.17.0'` succeeds before bundling.
!
!     Failed to install gems via Bundler.
!
!     Heroku push rejected, failed to compile Ruby/rails app
```

修正方法を結論からいうと、 Gemfile に rubyのバージョンを指定することで治りました。

```ruby:Gemfile
source 'http://rubygems.org'

ruby '1.9.3'

gem 'rails', '3.2.12'
# 以下省略
```

どうもherokuのrubyのデフォルトバージョンは1.9.2のようなので、それが問題？

```
$ heroku run sh -a hogehoge
# 以下herokuのシェル
$ ruby -v
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]
```

とりあえずこれで治った!!
原因追求は、そのうちやる、、かも。

ローカルではruby 2.0系で作業してたのでバージョン指定は入れたくなかったんですが、まあしかたがないのかなー。。
node.jsでBuffer経由でArrayBufferを使う

ブラウザ向けに書いていたコードをどうしてもサーバサイドでも使いたいと思い調べた結果以下のコードで使えることがわかった。

```javascript
var fs = require('fs');

function toArrayBuffer(buffer) {
    var ab = new ArrayBuffer(buffer.length);
    var view = new Uint8Array(ab);
    for (var i = 0; i < buffer.length; ++i) {
        view[i] = buffer[i];
    }
    return ab;
}

var buf = fs.readFileSync('./hoge.bin');
var arrayBuf = toArrayBuffer(buf);
```

これで[DataStream.js](https://github.com/kig/DataStream.js)をちょこっと変更するだけでnode.jsでも手軽にバイナリをいじれるようになった。

node向けに変更した[DataStream.js](https://gist.github.com/PyYoshi/5141607)