OmniAICreator/Qiita-1.07M huggingface dataset:
port 8006へのアクセスを制限

ネットワーク機器でファイアウォール設定しているため
iptablesを使ったことがなかったのでメモ。

# iptablesコマンドで実施

```bash:/root/iptables/main.sh 
#!/bin/sh
export PATH=$PATH:/sbin

clear() {
    iptables -F -t filter
    iptables -F -t nat
    iptables -F -t mangle
}

limit() {
    PORT=$1
    iptables -A INPUT -p tcp --dport $PORT -s 192.168.0.0/24 -j ACCEPT
    iptables -A INPUT -p tcp --dport $PORT -s localhost -j ACCEPT
    iptables -A INPUT -p tcp --dport $PORT -j DROP
}
accept() {
    PORT=$1
    iptables -A INPUT -p tcp --dport $PORT -j ACCEPT
}

clear
iptables -P INPUT DROP
limit 8006
accept 22
```

```bash:ルールを手動で削除する方法
# iptables -L --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     tcp  --  192.168.0.0/24      anywhere             tcp dpt:8006
..
# iptables -t filter -D INPUT 1
```

```bash:crontab
@reboot /root/iptables/main.sh
```

## ufwの場合

```
ufw default deny
ufw allow from 192.168.0.0/24
ufw allow 22
ufw enable
```

----

# iptables定義ファイル作成

```bash:現在の設定を出力
# iptables-save > ~/iptables.8006
```

```diff:~/iptables.8006
  # Generated by iptables-save v1.4.14 on Thu Apr 17 06:23:06 2014
  *mangle
  :PREROUTING ACCEPT [15654:17658617]
  :INPUT ACCEPT [15654:17658617]
  :FORWARD ACCEPT [0:0]
  :OUTPUT ACCEPT [9166:1523820]
  :POSTROUTING ACCEPT [9166:1523820]
  COMMIT
  # Completed on Thu Apr 17 06:23:06 2014
  # Generated by iptables-save v1.4.14 on Thu Apr 17 06:23:06 2014
  *filter
  :INPUT ACCEPT [15654:17658617]
  :FORWARD ACCEPT [0:0]
  :OUTPUT ACCEPT [9166:1523820]
+ -A INPUT -p tcp --dport 8006 -s 11.22.33.44/32 -j ACCEPT
+ -A INPUT -p tcp --dport 8006 -s 192.168.0.0/16 -j ACCEPT
+ -A INPUT -p tcp --dport 8006 -s localhost -j ACCEPT
+ -A INPUT -p tcp --dport 8006 -j DROP
+ -A INPUT -j ACCEPT
  COMMIT
  # Completed on Thu Apr 17 06:23:06 2014
```

`11.22.33.44/32`は自分の信頼するグローバルIPに置き換えてください。

動作確認
==============================

```bash:動作確認
# iptables-save < ~/iptables.8006
# telnet localhost 8006
```

接続ができることを確認。


再起動後もiptables設定を有効にする
==============================

```bash:起動時にiptablesが読み込まれるようにするパッケージインストール
# apt-get install -y iptables-persistent
```

```bash:iptables-persistentに登録
# /etc/init.d/iptables-persistent save
Saving rules... IPv4... IPv6...done.
```

```bash:再起動後も設定が有効であることを確認。
# reboot
待つ。。。
# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  11.22.33.44/32       0.0.0.0/0            tcp dpt:8006
ACCEPT     tcp  --  192.168.0.0/16       0.0.0.0/0            tcp dpt:8006
ACCEPT     tcp  --  127.0.0.1            0.0.0.0/0            tcp dpt:8006
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8006
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
```

設定ファイル

* /etc/iptables/rules.v4
jadeのフィルター内に変数を渡す

```jade:hello.jade
doctype html
head
    title
    - var hoge = 'Hello World!'
    script
        :js
            alert('#{hoge}');
body
    h1 Hello World!
```

## コンパイル

```
jade hello.jade
```

## 整形してコンパイル

```
jade hello.jade -P
```
Android開発で使うコマンド

##エミュレーターの起動

```
emulator -avd エミュレータ名
```

##アプリのインストール

```
adb install ファイル名.apk
```

##アプリのアンインストール

```
adb uninstall アプリのパッケージ名
```

## 署名の生成

```
keytool -genkey -v -keyalg ＜鍵生成の暗号化方式＞ -keystore ＜証明書ファイル名＞ -alias ＜証明書別名＞ -validity ＜有効期限の日数＞
keytool -genkey -v -keyalg RSA -keystore d:\tempandroid\techmaru.keystore -alias techkey -validity 10000
```

## 署名の確認

```
keytool -list -keystore ＜証明書ファイル名＞
keytool -list -keystore d:\tempandroid\techmaru.keystore
アプリに署名を設定する
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore ＜証明書ファイル名＞ -storepass ＜パスワード＞ -keypass ＜パスワード＞ ＜apkファイル名＞ プロジェクト名
```
Storyboard上のUITextViewを.stringsでローカライズしたときにテキストが反映されない

仕様なのかバグなのかわからないけど

> "VR6-6g-rqx.text" = "翻訳";

みたいなのを頑張って書いても、UITextViewのテキストの値はうまく翻訳されてくれないようだ。
[StackOverflow](http://stackoverflow.com/questions/20038048/localization-for-storyboard-items) でいくつかワークアラウンドが紹介されている。

以下に自分のとった方法を紹介する。

例えばMain.storyboard上にあるHogeViewController上のFugaTextViewを日本語に翻訳したいとする

#### 1. Main.Storyboard用の翻訳ファイルであるMain.stringsに翻訳を指定

```text:Main.strings(Japanese)
"FUGA_TEXT" = "日本語翻訳";
```

#### 2. 翻訳が存在すれば読み込むようなユーティリティメソッドを準備

```objc:QIUtils.m
+ (UITextView *)applyTranslationToUITextView:(UITextView *)target withKey:(NSString *)key andStoryBoardName:(NSString *)storyBoardName
{
    NSString *translation = NSLocalizedStringFromTable(key, storyBoardName, @"");
    if (![translation isEqualToString:key]) {
        target.text = translation;
    }
    return target;
}
```

#### 3. HogeViewControllerのviewDidLoadで翻訳を読み込む
```objc:HogeViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    [QIUtils applyTranslationToUITextView:self.fugaTextView           
                                  withKey:@"FUGA_TEXT" 
                        andStoryBoardName:@"Main"];
}
```
ネットワーク接続されたプリンタの名前をmrubyで取得するプログラム


[島ぶくろ ネットワーク接続されたプリンタのステータスを取得するプログラム](http://saltheads.blog134.fc2.com/blog-entry-146.html)を受けて、mrubyで簡単に実装してみました。

実用性ゼロの動作確認レベルです。

# 1. mrubyをダウンロードする

` $ git clone https://github.com/mruby/mruby.git`


# 2. ビルド設定を編集する

```rb:build_config.rb
MRuby::Build.new do |conf|
  toolchain :clang # :gcc, :visualcpp 

  conf.bins = %w(mrbc)

  # mruby's Core GEMs
  conf.gem 'mrbgems/mruby-bin-mirb'
  conf.gem 'mrbgems/mruby-bin-mruby'
  conf.gem 'mrbgems/mruby-print'

  # user-defined GEMs
  conf.gem :git => 'https://github.com/iij/mruby-io.git'
  conf.gem :git => 'https://github.com/iij/mruby-mtest.git'
  conf.gem :git => 'https://github.com/iij/mruby-socket.git'
  conf.gem :git => 'https://github.com/iij/mruby-pack.git'
end
```

# 3. ビルドする

```
$ rake
CC    tools/mrbc/mrbc.c -> build/host/tools/mrbc/mrbc.o
CC    src/array.c -> build/host/src/array.o
CC    src/backtrace.c -> build/host/src/backtrace.o
... 中略 ...
Build summary:

================================================
      Config Name: host
 Output Directory: build/host
         Binaries: mrbc
    Included Gems:
             mruby-bin-mirb - mirb command
               - Binaries: mirb
             mruby-bin-mruby - mruby command
               - Binaries: mruby
             mruby-io
             mruby-socket
             mruby-pack
================================================
```


# 4. mrubyのスクリプトを作成する

```rb:sysDescr.rb
sendMsg = [0x30,0x2C,0x02,0x01,0x00,0x04,0x06,0x70,0x75,0x62,0x6C,0x69,0x63,0xA0,0x1F,0x02,
           0x04,0x30,0xB1,0xF0,0x32,0x02,0x01,0x00,0x02,0x01,0x00,0x30,0x11,0x30,0x0F,0x06,
           0x0B,0x2B,0x06,0x01,0x02,0x01,0x19,0x03,0x02,0x01,0x03,0x01,0x05,0x00].pack("c*")

sock = UDPSocket.open

sock.send(sendMsg, 0, "192.168.0.xx", 161) # set the IP address of your printer

recvMsg = sock.recv(65535)

p recvMsg

sock.close
```

# 5. 上記のスクリプトを実行する。

```
$ cd bin
$ ./mruby sysDescr.rb
"0@\002\001\000\004\006public\2423\002\0040\261\3602\002\001\000\002\001\0000%0#\006\v+\006\001\002\001\031\003\002\001\003\001\004\024EPSON EP-806A Series"
```

バイナリの解析を省略しているので読みにくいですが、バイト列の最後にプリンター名 "EPSON EP-806A Series" を取得できていることがわかります。
paiza POH paizen #paizahack_02 (Perl/PHP/Python)

|問題|https://paiza.jp/poh/paizen|
|:--|:--|
|タイム一覧/Ruby/C/C++/C#/Java|http://qiita.com/cielavenir/items/17f66daa2be639fd74f3|
|Perl/PHP/Python|http://qiita.com/cielavenir/items/5b57808a28a8b4c5c7b2|
|JavaScript|http://qiita.com/cielavenir/items/9dab2bfbcfa0047b345f|
|CoffeeScript/Go/Scala/VB/F#|http://qiita.com/cielavenir/items/32591dd03376ba534d1e|

Perl (0.27/0.44)
accumをちゃんと初期化しないと死ぬ模様。面倒くさい。

```pl
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
my @a=();
my @accum=();
my($h,$w)=split(/ /,<>);
for(my $i=0;$i<$h;$i++){
	my $line=<>;
	for(my $j=0;$j<$w;$j++){
		$a[$i][$j][0]=substr($line,$j,1)^1;
	}
}
for(my $i=0;$i<$h;$i++){for(my $j=0;$j<=$w;$j++){$accum[$i][$j]=0;}}
for(my $i=0;$i<$h;$i++){
	$accum[0][$a[$i][0][0]]++;
	for(my $j=1;$j<$w;$j++){
		if($a[$i][$j][0]){
			$a[$i][$j][0]+=$a[$i][$j-1][0];
			$accum[0][$a[$i][$j][0]]++;
		}
	}
}
for(my $i=1;$i<$h;$i++){for(my $j=0;$j<$w;$j++){for(my $k=1;$k<=$i;$k++){
	$a[$i][$j][$k]=$a[$i-1][$j][$k-1];
	if($a[$i][$j][$k]>$a[$i][$j][$k-1]){$a[$i][$j][$k]=$a[$i][$j][$k-1];}
	if(!$a[$i][$j][$k]){last;}
	$accum[$k][$a[$i][$j][$k]]++;
}}}
for(my $i=0;$i<$h;$i++){for(my $j=$w-1;$j>=0;$j--){$accum[$i][$j]+=$accum[$i][$j+1];}}
for(my $k=<>;$k--;){
	my($s,$t)=split(/ /,<>);
	say ($s<=$h&&$t<=$w?$accum[$s-1][$t^0]:0);
}
```

PHP (0.51/0.67)
splitしたのをintvalにarray_mapしないと、最後の範囲チェックで文字列同士の比較になって死にます。

```php
#!/usr/bin/php
<?php
$a=array();
$accum=array();
list($h,$w)=array_map(intval,split(" ",fgets(STDIN)));
for($i=0;$i<$h;$i++){
	$line=fgets(STDIN);
	for($j=0;$j<$w;$j++){
		$a[$i][$j][0]=intval($line[$j])^1;
	}
}
for($i=0;$i<$h;$i++)for($j=0;$j<=$w;$j++)$accum[$i][$j]=0;
for($i=0;$i<$h;$i++){
	$accum[0][$a[$i][0][0]]++;
	for($j=1;$j<$w;$j++){
		if($a[$i][$j][0]){
			$a[$i][$j][0]+=$a[$i][$j-1][0];
			$accum[0][$a[$i][$j][0]]++;
		}
	}
}
for($i=1;$i<$h;$i++)for($j=0;$j<$w;$j++)for($k=1;$k<=$i;$k++){
	$a[$i][$j][$k]=min($a[$i-1][$j][$k-1],$a[$i][$j][$k-1]);
	if(!$a[$i][$j][$k])break;
	$accum[$k][$a[$i][$j][$k]]++;
}
for($i=0;$i<$h;$i++)for($j=$w-1;$j>=0;$j--)$accum[$i][$j]+=$accum[$i][$j+1];
for($k=intval(fgets(STDIN));$k--;){
	list($s,$t)=array_map(intval,split(" ",fgets(STDIN)));
	echo ($s<=$h&&$t<=$w?$accum[$s-1][$t]:0).PHP_EOL;
}
?>
```

Python (0.39/0.56)
Pythonっぽくはないが、Perl/PHPと比較すればきれいな方かと。

```py
#!/usr/bin/python
import sys
if sys.version_info[0]>=3:
	raw_input=input
	xrange=range

h,w=[int(e) for e in raw_input().split()]
a=[[[0 if c=='1' else 1]+[0]*(h-1) for c in raw_input().rstrip()] for i in xrange(h)]
accum=[[0]*(w+1) for i in xrange(h)]
for i in xrange(h):
	accum[0][a[i][0][0]]+=1
	for j in xrange(1,w):
		if a[i][j][0]>0:
			a[i][j][0]+=a[i][j-1][0]
			accum[0][a[i][j][0]]+=1
for i in xrange(1,h):
	for j in xrange(w):
		for k in xrange(1,i+1):
			a[i][j][k]=min(a[i-1][j][k-1],a[i][j][k-1])
			if a[i][j][k]==0: break
			accum[k][a[i][j][k]]+=1
for i in xrange(h):
	for j in reversed(xrange(0,w)):
		accum[i][j]+=accum[i][j+1]
for i in xrange(int(raw_input())):
	s,t=[int(e) for e in raw_input().split()]
	print(accum[s-1][t] if s<=h and t<=w else 0)
```
キーの入力だけで目的のタブに素早く切り替えられる Google Chrome 拡張つくりました


開いているタブの数が増えてくると切り替えたいタブを認識するのが面倒になります。タブを切り替えるショートカットはデフォルトで用意されていますが、目的のタブにピンポイントにジャンプすることができなかったので、ピンポイントなタブの切り替えをキーの入力だけでできる拡張機能を作りました。目的の位置にキーで移動する手法は vim-easymotion で体験して感動したのでそれを真似ました。

![quicktabswitch.gif](http://t-szk.com/images/quicktabswitch.gif)

## ソースコード

- https://github.com/suzuki86/QuickTabSwitch

## Chrome ウェブストア

- https://chrome.google.com/webstore/detail/quicktabswitch/pnelkdgjfmmkcogamkjkcajgdkomjgco?hl=ja

## 操作方法

インストール後、右上にアイコンが表示されるようになります。`Ctrl`+`Shift`+`x`でタブ一覧が表示されるので、対応するキーを押すと該当のタブにジャンプします。

## 作ったうえで得られた知識

### ブラウザの右上にアイコンをさせて、それをクリックしたらポップアップを表示させる

- `manifest.json` に下記を書くと、`images/16.png` がアイコンとして表示され、それをクリックすると `browser_action.html` の内容が表示される。

```
  ...
  "browser_action": {
    "default_icon": "images/16.png",
    "default_popup": "browser_action.html"
  },
  ...
```

### ショートカットキーで拡張機能を実行できるようにする

- `manifest.json` に下記のように書く。この場合は `Ctrl` と `Shift` と `X` のキーを同時に押されたときに、拡張機能のポップアップが表示される。

```
  ...
  "commands": {
    "_execute_browser_action": {
      "suggested_key": {
        "default": "Ctrl+Shift+X",
        "windows": "Ctrl+Shift+X",
        "mac": "Ctrl+Shift+X",
        "linux": "Ctrl+Shift+X"
      },
      "description": "Trigger",
      "global": true
    }
  }
  ...
```

### 開いているタブの一覧を取得する

- `chrome.tabs.query` メソッドの第 2 引数にコールバック関数を渡すと、そのコールバック関数にタブの情報が格納されたオブジェクトが渡される。例えば `tabs[i].title` で i 番目のタブのタイトルを取得できるし、`tabs[i].favIconUrl` で i 番目のタブのファビコンの URL を取得できる。

```
chrome.tabs.query({}, function(tabs){
    ...
});
```

### アクティブなタブを切り替える

- 下記のようにすると、タブID (tabId) で指定したタブがアクティブになる。(そのタブに切り替える。)

```
chrome.tabs.update(tabId, {selected: true});
```
XCTest + XCTestAsyncで非同期処理のテストをする


**ご注意!!!この記事の情報は古くなっています。XCode6以降では [XCTestExpectationを使う](https://developer.apple.com/library/prerelease/ios/documentation/DeveloperTools/Conceptual/testing_with_xcode/testing_3_writing_test_classes/testing_3_writing_test_classes.html#//apple_ref/doc/uid/TP40014132-CH4-SW6) のが良いでしょう。**

XCTestを用いて非同期処理のテストを書く場合、完了フラグを操作してwhile loopで回す方法がよく紹介されています。

[XCTestで非同期ブロックのテストを書く](http://qiita.com/kazukomati/items/df465f8fb8d713223e3d)より引用:

```objc
// テスト実行完了フラグ
__block BOOL isFinished = NO;

[SNSUser loginWithBlock^(SNSUser* user, NSError* error) {
    XCTAssertNotNil(user, @"hoge");
    XCTAssertNil(error, @"fuga");
    // Blocksの中のテストが終わったら完了フラグをYESに
    isFinished = YES;
}];

// 完了フラグがYESになるまで待機
while (!isFinished) {
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
}
XCTAssertTrue(isFinished, @"");
```

これはこれで便利なのですが、[XCTestAsync](https://github.com/touchableideas/XCTestAsync)という便利そうなユーティリティを見つけたので紹介。

# インストール

CocoaPodsから行うのが簡単です。

```ruby:Podfile
pod "XCTestAsync"
```

# テストクラスへの導入

ヘッダファイルをインポート。

```objc
#import <XCTestAsync/XCTestAsync.h>
```

テストメソッドのsuffixをAsyncとして記述します。こちらはとあるプロジェクトのログイン認証処理のテストで、スタブサーバに対してリクエストを投げて成功することを期待しています。

```objc
// suffixにAsyncをつける
- (void)testLoginSuccessAsync
{
    Auth *auth = [Auth sharedInstance];
    [auth loginWithEmail:@"user@example.com"
                password:@"password"
            successBlock:^(AuthCredential *credential) {
                // successBlock内で結果の確認
                XCTAssertTrue([credential.accessToken isEqualToString:@"foobar"], @"Check access token");
                XCTAssertTrue([credential.refreshToken isEqualToString:@"barbar"], @"Check refresh token");
                XCTAssertEqualObjects(credential.expiresIn, @123, @"Check expires");

                // 非同期処理のテストが完了したいことを通知する
                XCAsyncSuccess();
            } failureBlock:^(NSError *error) {
    }];

    // テストメソッド全体のタイムアウト設定
    XCAsyncFailAfter(10, @"");
}
```

このテストを実行すると`XCAyncFailAfter()`まで一気に実行されますが、引数で指定された秒数待機します。大気中に`XCAsyncSuccess()`が呼ばれるとテストは成功とみなされて完了します。

このフレームワークの良いと感じたところは、特別な書き方が不要でXCTest風にテストを呼び出すことができる事と、Xcodeからも通常通りテストを走らせられる点（当たり前っちゃ当たり前）です。

[NLTHTTPStubServer](https://github.com/yaakaito/NLTHTTPStubServer)と組み合わせてテストを書いているのですが、良い感触なのでしばらく使ってみようと思います。
[一日一Vim](その4)大文字小文字変換

# 小文字を大文字に変換する
Wireshark で HEX String を見ると小文字だったりします。
私は HEX は大文字で書きたい派なので、大文字変換はよくします。

`v` で ヴィジュアルモードに移行して任意の範囲を選択します。
その後、`U`すると選択範囲が大文字になります。

# 大文字を小文字に変換する
小文字は`U`の替わりに`u`を使います。さっき知りました。
`u`はアンドゥのイメージが強く、ヴィジュアルモードとノーマルモードがごっちゃになってました。

ノーマルモードの`u`はアンドゥ
ヴィジュアルモードの`u`は小文字変換
覚えときましょう。(言い聞かせ)

ちなみにリドゥはノーマルモードで`<C-r>`ですね。
ノーマルモードの`U`は「行に対して行った変更の全てを取り消す」らしいです。

参考サイト：
http://advweb.seesaa.net/article/286507.html
http://archiva.jp/web/tool/vim_basic.html
テストデータジェネレータに Fabrication-gem を使う


Mongoid で、embeded_many を使っている時の FactoryGirl を使ったテストデータ作成の方法を調べていたのですが、うまく見つからない・・代わりに [Fabrication](http://www.fabricationgem.org/) という物を見つけたので、試してみました。

```Gemfile
group :test do
  gem 'fabrication' #追加
end
```

`bundle update` した後、/spec/fabricators/{model_name}_fabricator.rb を作る

以下の様な User クラスと UserAccount というクラスがあったとする。

```ruby:app/models/user.rb
class User
  include Mongoid::Document
  validates_presence_of :name

  field :name,               :type => String
  field :email,              :type => String, :default => ""
  field :password, :type => String, :default => ""

  embeds_many :user_accounts
end
```

```ruby:app/models/user_account.rb
class UserAccount
  include Mongoid::Document
  field :provider,            :type => String
  field :uid,                 :type => String
  field :token,               :type => String
  field :auth_response,       :type => String
  FACEBOOK = 'facebook'.freeze
  TWITTER = 'twitter'.freeze

  embeded_in :user, :class_name => "User"
end
```

これに対して、Userレコードを1つ作るコードはこちら。

```ruby:spec/fabricators/user_fabricator.rb
Fabricator(:user) do
  id 1
  name 'user'
  email 'hal@test.co.jp'
  password 'password'
  user_accounts(count:1){|attr, i| Fabricate(:user_account) }
end
```

user_accounts の行で、embeds_many の子どもレコードを作成しています。

spec ファイルから上記データを呼び出す場合はこのようにします。


```ruby:spec/models/user_account_spec.rb
require 'spec_helper'

describe UserAccount do
  describe '.all' do
    before do
      Fabricate(:user)
      #FactoryGirl.create(:user_account, user: user)
    end
    subject { User.find(1) }
    it { should have(1).user_accounts }
  end

end
```
変数宣言の!defaultは「既に定義されている場合は上書きしない」という意味

Sassで変数を定義するときに `!default` がついていることがありますが、これは「あとから上書きされます」という意味ではなく「既に定義されている場合は上書きしません」という意味らしい。

例えばこんな感じの変数ばかりが定義されたファイルがあるとします。

```sass:variables.sass
$a: #777 !default
$b: $a !default
```

で、このファイルがgemでインストールしていて直接編集できないので、ローカルで上書きしたいとします。（例えばBootstrapのSassファイルを使いたいような場面を想像してみて欲しい）

その時に `$a` と `$b` を同時に変更するためにこういう風に書くのは **間違い** です。

```sass
@import "variables"
$a: #555
```

なぜダメなのかというと、理屈が分かれば当たり前なんだけど、この上記のコードは内部的には下記の様に展開されるからです。 `$b` の値が決まる時点で `$a` は `#777` なので、最終的に `$a` は `#555` になるけど `$b` は `#777` のままになってしまうわけです。

```sass
$a: #777 !default
$b: $a !default  // この時点で $a は #777
$a: #555
```

正しくはこの順番じゃないといけない。

```sass
$a: #555
@import "variables"
```

これは内部的にはこのように展開されます。

```sass
$a: #555
$a: #777 !default // !default は既に定義されている場合は上書きしないという意味
$b: $a !default   // なのでこの時点で $a は #555
```

ということなのです。
独自の Transform を追加する


[Transform](http://emberjs.com/api/data/classes/DS.Transform.html) は、Ember Data の model の属性と Adapter から取得・保存するデータを相互変換するための仕組みです。

Ember Data で以下のような記述するとします。

```javascript
App.Post = DS.Model.extend({
  title: DS.attr('string'),
  body: DS.attr('string'),
  createdAt: DS.attr('date')
});
```

この `DS.attr()` の引数になっている `string` や `date` が Transform です。それぞれデフォルトで提供されている [DS.StringTransform](http://emberjs.com/api/data/classes/DS.StringTransform.html) と [DS.DateTransform](http://emberjs.com/api/data/classes/DS.DateTransform.html) に対応しています。

さて、ここで独自の Transform を追加したいとします。例として、`DS.DateTransform` は JS の Date に対応しているため時刻付きですが、Rails の Date に対応した、時刻のない日付を扱う Transform を作ってみましょう。

```javascript
App.DateWithoutTimeTransform = DS.Transform.extend({
  deserialize: function(serialized) {
    if (!serialized) {
      return null;
    }

    var date = new Date(serialized);
    var offset = date.getTimezoneOffset();
    return new Date(date.getTime() + offset * 60 * 1000);
  },

  serialize: function(date) {
    if (!date) {
      return null;
    }

    return moment(date).format('YYYY-MM-DD');
  }
});
```

`DS.Transform` を継承して `deserialize` と `serialize` を定義します。`deserialize` が Adapter から取得したものから model の属性への変換、`serialize` はその逆です。

名前は route や controller と同様の規約で解決されるので、使う場合は以下のようになります。

```javascript
App.Post = DS.Model.extend({
  // ...
  createdOn: DS.attr('dateWithoutTime')
});
```

## 参考

Stackoverflow の [What is the best way to modify the date format when ember-data does serialization?](http://stackoverflow.com/questions/15695809/what-is-the-best-way-to-modify-the-date-format-when-ember-data-does-serializatio) を参考にしました。ただ、Transform を登録する方法が変わっているようで、[公式 API リファレンス](http://emberjs.com/api/data/classes/DS.Transform.html) も参照。
Bitbucket REST APIでターミナルから新規リポジトリ作成

[公式リファレンス](https://confluence.atlassian.com/display/BITBUCKET/Use+the+Bitbucket+REST+APIs)や[こちらの記事](http://b.fly1tkg.com/2013/12/bitbucket-private/)を参考に。

.bashrcや.zshrcに以下を記述します。

```zsh:.zshrc
# 新規リポジトリを作成するコマンド
# createRepoは好きな関数名で
function createRepo() { \
	curl -v -X POST -u [ユーザ名]:[パスワード] \
	-H "Content-type: application/json" \
	https://api.bitbucket.org/2.0/repositories/[ユーザ名]/$1 \
	-d '{"scm":"git", "is_private":true, "fork_policy":"no_forks" }' \
};
```
-vオプションは好みで。
また、jsonで渡しているパラメータについてはそれぞれ以下の通り。

|パラメータ|意味|
|:--------|----|
|scm|"git"または"hg"|
|is_private|trueならプライベートリポジトリ|
|fork_policy|allow_forks : フォークを許可<br>no_public_forks : プライベートフォークのみ許可<br>no_forks : フォーク不可|
`source .zshrc`した後

```zsh
createRepo [作成したいリポジトリ名]
```

でリポジトリ作成。

これで、Bitbucketをブラウザで開くことなく開発を始めることができます。
TypeScript: コンストラクタのオーバーロード

TypeScript でのコンストラクタのオーバーロードのサンプルです。

* constructor キーワードが3回でてきてますが、最後の3つ目がコンストラクタの実体(定義)です。
* 最初の2つ(セミコロンで終了している部分)がシグナチャとなります。
* コンストラクタの実体(定義)では型の曖昧性がある引数については any で受けて instanceof などで実際の型を判別した上で処理を分岐させます。

```ts:app.ts
function writeln(msg: any) {
    console.log(msg);
    alert(msg);
}

class Vector2 {
    x: number;
    y: number;
    constructor(x: number, y: number);
    constructor(v: Vector2);
    constructor(a: any, b?: number) {
        // null, undefined が渡された場合
        if (a == null) {
            this.x = 0;
            this.y = 0;
            return;
        }
        // instanceof でどちらが呼ばれたのか判断
        if (a instanceof Vector2) {
            this.x = a.x;
            this.y = a.y;
        } else {
            this.x = a;
            this.y = b;
        }
    }
}

var v1 = new Vector2(0, 20);
var v2 = new Vector2(v1);
var v3 = new Vector2(null);
var v4 = new Vector2(undefined);

writeln(v1.x + ":" + v1.y);
writeln(v2.x + ":" + v2.y);
writeln(v3.x + ":" + v3.y);
writeln(v4.x + ":" + v4.y);
```

念のため、生成された JavaScript のコードを掲載します。

* シグナチャは消えてなくなっています。
* JavaScript ではもともと引数が省略可能なので、コンストラクタの実体(定義)は2引数を取る関数として記述されています。

```js:app.js
function writeln(msg) {
    console.log(msg);
    alert(msg);
}

var Vector2 = (function () {
    function Vector2(a, b) {
        // null, undefined が渡された場合
        if (a == null) {
            this.x = 0;
            this.y = 0;
            return;
        }
        // instanceof でどちらが呼ばれたのか判断
        if (a instanceof Vector2) {
            this.x = a.x;
            this.y = a.y;
        } else {
            this.x = a;
            this.y = b;
        }
    }
    return Vector2;
})();

var v1 = new Vector2(0, 20);
var v2 = new Vector2(v1);
var v3 = new Vector2(null);
var v4 = new Vector2(undefined);

writeln(v1.x + ":" + v1.y);
writeln(v2.x + ":" + v2.y);
writeln(v3.x + ":" + v3.y);
writeln(v4.x + ":" + v4.y);
//# sourceMappingURL=app.js.map
```

## 参考

* [JavaScriptのクラス定義を簡単にする](http://qiita.com/akmiyoshi/items/5fde6be4a9191221eaea)
* [CoffeeScript と TypeScript の開発環境](http://qiita.com/akmiyoshi/items/6b8cd9680d611cde6251)
シェル変数や環境変数を削除するコマンド

自分用のメモです。MacとかUbuntuで使えます。

環境変数(またはシェル変数)を削除するときは、"unset"コマンドを使用しましょう。
例えば、$http_proxyを削除するなら、

```bash
$ unset http_proxy
```
です。変数名の前に"$"をつけないことに注意。

ちなみに、

```bash
$ export http_proxy=""
```
としても **環境変数は削除されません**。これは要注意。
unsetコマンドは変数を未使用の状態にします。
違いを確認したいときは、

```bash
$ export hogehoge=""
$ env | grep hogehoge
$ unset hogehoge
$ env | grep hogehoge
```

をお試しください。
(envは環境変数の一覧を表示してくれます。)
***
補足ですが、
シェル変数が未使用かどうかは、以下のようにして確認できます。
(UNIXではまだ確認してません。すみません。)

```bash
$ unset test
$ echo ${test="hogehoge"}
$ test=""
$ echo ${test="hogehoge"}
```
\$testが未使用なら、hogehogeを代入して出力します。
未使用でないなら、そのまま$testの内容を出力します。
参考にさせていただいたサイト: [ほぷぅ（。・ω・） ノ　PCまとめ Linux,Win,自宅サーバー ～](http://pcmemorin.blog.fc2.com/blog-entry-270.html)
プレゼンもmarkdownでね！showoffを使ってみた


# 概要

社内のLTで、発表まで時間あるし
パワポの資料作るの面倒だし
っていうか、MacにしたからOfficeないし
Google Appsでプレゼン資料作るのもいいけど
なんか他の方法で準備したいなー
的な話。



# 参考URL

* [プログラマ向けプレゼン・ツールまとめ](http://matome.naver.jp/odai/2133017481093611101 "naverまとめ")
* [ひげろぐ - ShowOffでプレゼンテーション作成をためした](http://higelog.brassworks.jp/?p=1674 "ひげろぐ")
* [Github - showoff](https://github.com/puppetlabs/showoff "puppetlabs")



# インストール

```Bash:command
gem install showoff
```
地味に時間がかかります

# サンプル実行

```
$ git clone https://github.com/puppetlabs/showoff.git
$ cd showoff/example
$ showoff serve
```


http://localhost:9090

にアクセス

![0001.png](https://qiita-image-store.s3.amazonaws.com/0/17518/6ac471b7-28b8-d3a4-fbd1-5d624322c817.png "0001.png")


# スライドを作成する

## 作成

```
$ showoff create LT-test
$ cd LT-test/
```

## ディレクトリ構成

`01_slide.md`を編集していく。

```
$ tree
.
├── one
│   └── 01_slide.md
└── showoff.json

1 directory, 2 files
$ 
```
SML#のプロジェクトをWerckerでCIする

[SML#](http://www.pllab.riec.tohoku.ac.jp/smlsharp/ja/)で書かれたプロジェクトを[Werkecr](http://wercker.com/)でCIできるようにする方法を書きます。

## 前提

 * 対象のプロジェクトがGithub/Bitbucketにあること(プライベートレポジトリ可)。
 * `make check`等で単体テストが走るようになっていること。単体テストを書く際は[SMLUnit](http://www.pllab.riec.tohoku.ac.jp/smlsharp/ja/?SMLUnit)がオオススメです。(というか他に選択肢がない)

## 設定方法
### Werckerの設定
Werckerのアカウント取得やプロジェクトの作成等が必要ですが、そのあたりについては[Githubのプライベートリポジトリでも無料で使えるCI、Werckerを使ってrails newからHerokuのデプロイまでやってみる](http://blog.mah-lab.com/2014/01/08/rails-wercker-heroku-deploy/)の「Werckerを設定する」が分かりやすいです。

### wercker.ymlの作成
SML#インストール済のOS(werckerではboxと呼ばれる)はすでに[mzp/smlsharp-box](https://t.co/wGHYw0S2kQ)として用意してありあす。

そのため、`wercker.yml`には以下のように書けばOKです。(`make check`で単体テストが走る場合)

```yaml
box: mzp/smlsharp-box@1.0.0
build:
    steps:
      - script:
          name: Run unit tests
          code: make check
```

ビルド結果の通知等を行ないたい場合は、[werkecr step](https://app.wercker.com/#explore/steps/search/)から`notify`を含むstepを探してみるといいと思います。個人的には[wercker-step-http-notify](https://app.wercker.com/#applications/52d7f369374ece620d041d19/tab/details)がオススメです:D。

## おまけ: カスタムboxの作り方
werckerは非常に自由度が高いので、今回のように独自の処理系をインストールした環境をあらかじめ作っておくことができます。
これは[Creating your own boxes with Bash](http://devcenter.wercker.com/articles/boxes/bash.html)にあるように`werkecr-box.yml`を書くことで実現できます。

今回は、以下のようにUbuntu 12.04の上に依存パッケージ(libc6とgmp)を導入し、SML#のサイトで配布しているdebからSML#コンパイラのインストールを行なっています。

```yaml
name: smlsharp-box
version: 1.0.0
inherits: wercker/ubuntu12.04-webessentials@1.0.2
type: service
platform: ubuntu@12.04
description: wercker box for SML# a new programming language in the Standard ML family
keywords:
  - sml
  - smlsharp
packages:
  - smlsharp@2.0.0
script: |
  sudo apt-get update -y
  sudo apt-get install -y libc6-dev-i386 lib32gmp-dev
  sudo wget http://www.pllab.riec.tohoku.ac.jp/smlsharp/download/smlsharp-2.0.0-2_ubuntu-amd64.deb
  sudo dpkg -i smlsharp-2.0.0-2_ubuntu-amd64.deb
```

## 関連リンク
 * [mzp/box-smlsharp - Github](https://github.com/mzp/box-smlsharp)
 * [mzp/tab_space_bot - Github](https://github.com/mzp/tab_space_bot) - 実際に使っている例
Titanium Studio にEclipse Market Placeプラグインを導入する。

Titanium Studio にEclipse Market Placeプラグインを導入する。するとほしいものが見つかるようになる。ただし入れてはいけないものも(場合によっては自動で)入るようになるので注意して使う。プラグインを入れる前になにかしらバックアックを取っておくと安心と思われる。

## Eclipse.org のバージョンを確認する。
Help - About Titanium Studio から。通常のEclipseのアイコンがあるのでクリックして詳細を見ることができる。今回は4.3.2 = Kepler 。

## インストールリンクをAddする
Help - Install New Software へ通常のEclipseと同様にインストールリンクをAddする。今回は http://download.eclipse.org/releases/kepler 。(これまでのEclipseだとkeplerの部分が確認したEclipse.orgのコード名になる)

AddするとEclipseで利用可能なプラグインの一覧をダウンロードしはじめる。数分かかるので気長に待つ。

## Marketplace client を追加する。
General Purpose Tools に Marketplace client があるので追加する。

## なにか試しに入れてみる
Help - Eclipse Marketplace が追加されている。
今回はWord highlightingの Glance とGenymotionの操作プラグインを試すことにした。

* Glanceは単語上でCtrl+Alt+F。Titanium Studioのdark colorでは色が見づらい。Window - Preferences からGeneral - Grance search で変更できる。動作しているようだ。
* Genymotionのプラグインは……動かないな。標準のEclipse+ADTではないのでしかたがないか。深追いはせずにおこう。
Android開発環境設定メモ

Android開発環境構築手順メモ。

1. JDKのダウンロード＆インストール

      http://www.oracle.com/technetwork/java/javase/downloads/index.html?ssSourceSiteId=otnjp
2. Android SDKのダウンロード＆適当なフォルダに解凍

      http://developer.android.com/sdk/index.html?hl=sk
3. IntelliJ IDEAインストール

      http://www.jetbrains.com/idea/download/
        ※ 他のIDEとしてはEclipseのADTプラグインやAndroid Studioなどあるらしい。ちゃんと評価はしてないが、Eclipseは重い印象が有り、Android StudioについてはIntelliJに対する利点がよく分からなかったため、今回はIntelliJで。

4. Androidアプリケーション作成

      File -> New Project > Android > Application Module
        ※「Gradle: Android Module」を選択すると作成直後にエラーがでる。調査中。
        プロジェクト作成ダイアログの「Project SDK」にAndroid SDKのパス入力。
5. IdeaVimの設定　(Vimmer以外はスルー）
      インストール：
      Preferences -> Plugins > Browse Repositories から「IdeaVim」で検索。

      キーマップ設定：
      Preferences -> Keymap > Plug-ins > IdeaVim でキーマッピング設定。

      ・BackspaceにCtrl-Hをバインド。
        ... デフォルトのClass Hierarchyオープンとコンフリクトするので、Preferences -> Vim Emulatorでコンフリクト解決。

      ・Exit Insert Mode に Ctrl-[とEscapeを両方バインド。
        ... Ctrl-[だけだとなぜか効かない・・・
6. Genymotionの設定
 
      Android SDK標準のエミュレータは遅いので、高速なエミュレータとして利用。

      インストール：
      ・Virtual Boxダウンロード＆インストール
https://www.virtualbox.org/wiki/Downloads

      ・Genymotionダウンロード＆インストール
http://www.genymotion.com/

      ・Genymotion起動、Connectボタンから仮想デバイスをインストール
      参考) http://dev.classmethod.jp/smartphone/android/genymotion-install/

7. Genymotion Pluginインストール
Preferences -> Plugins > Browse Repository -> 「Genymortion」で検索
インストール後、Preferences -> GenymotionでGenymotion.appのパスを設定

8. アプリケーションのデプロイ

     ・ターゲットとするAndroidバージョンに応じてAndroidManifest.xmlのandroid:minSdkVersionを設定。
        ... sdkバージョンとosバージョンの対応はwikipediaに載っている。
     http://ja.wikipedia.org/wiki/Android
      ・Genymotionを起動し、仮想デバイスを選択して「Play」
      ・IntelliJからRunコマンド実行し、ダイアログ中でGenymotionでPlay中の仮想デバイスをターゲットに選択
      ・エミュレータウインドウ上で「Hellow World」画面が出力されることを確認

###追記
  Gradleプロジェクトのエラーを解決するには、下記の通りにすれば良いらしい。

  ・「Tools -> Android > SDK Manager」でSDK Manager起動
      Extras > Android Support Repository をインストール

参考)http://qiita.com/radiocatz/items/91066c6fb72ca677f2e8
javascriptからファイル保存ダイアログを出す

jsでファイルを保存するための方法.
html5をサポートしたブラウザなら動くはず.
投稿してから気がつきましたがほとんど同じ内容の投稿がありました.
[javascriptで生成したファイルをローカルに保存する - Qiita](http://qiita.com/ukyo/items/d623209655a003b13add)

しかし,少しだけ記事の趣旨が違うのでこの記事も残しておきます.

# 手順
a要素を作成する.
a要素のhrefにダウンロードしたいリンクを代入する.
a要素にdownload属性に値をつける.
download属性にセットした値がファイル名となる.(拡張子はつけない方がよい)
a要素にクリックイベントを発生させる.

# 実際のコード

```js:download.js
function download(url, name){
    var a = document.createElement('a');
    a.href = url;
    a.setAttribute('download', name || 'noname');
    a.dispatchEvent(new CustomEvent('click'));
}
```

上記の関数のurlにダウンロードしたいリンク,nameにファイル名を入れればよい.
safariやieでは動かない.
`createObjectURL`を組み合わせれば`ArrayBuffer`などを保存することもできる.
Rの2系をbrew installする


Rのパッケージは、今のところ2系にしか対応していないものも多いため、3系だけだと困ることがある。
Rを`brew install`すると3系がインストールされる。

```
$ brew update
$ brew install gfortran
$ brew tap homebrew/science
$ brew info R
R: stable 3.1.0, HEAD
http://www.r-project.org/
Not installed
From: https://github.com/homebrew/homebrew-science/commits/master/r.rb
(省略)
```

バージョンを変更してインストールするには`brew versions`を使う。
インストール可能なバージョンを確認したら、対象のものをcheckoutする。

```
$ brew versions R
3.1.0    git checkout b81a08f r.rb
(省略)
2.15.3   git checkout 064c0db r.rb
(省略)
$ cd /usr/local/Library/Taps/homebrew/homebrew-science
$ git checkout 064c0db r.rb
```

```
$ brew info R
R: stable 2.15.3, HEAD
http://www.r-project.org
Not installed
From: https://github.com/homebrew/homebrew-science/commits/master/r.rb
```

これで2系のRをインストールできると思いきや、makeでエラーとなる。
[R depends on gettext to fix build issue. #18198](https://github.com/Homebrew/homebrew/pull/18198)に書いてあるが、依存ライブラリのcairoがpkgconfigで指定されていないため。

[これ](https://github.com/Homebrew/homebrew/pull/18198/files)を参考に、23行目に`depends_on 'cairo'`を追加する。

```
$ brew install R
$ sudo ln -s "/usr/local/opt/r/R.framework" /Library/Frameworks
```



OSXをLionやMountain LionからMarvericksにアップグレードしている場合、Rをインストールしようとするとエラーになる。
その場合は、一度gfortranと関連するライブラリを`brew uninstall`してから再インストールすると良い。

```
$ brew uninstall gmp mpfr libmpc cloog gfortran
$ brew install gfortran
$ brew install R
$ R

R version 2.15.3 (2013-03-01) -- "Security Blanket"
(省略)
```

インストールがうまく行ってもパッケージのインストールで失敗する場合もある。
自分の場合は、`install.packages("knitr")`で失敗した。
[stackoverflow](http://stackoverflow.com/questions/21370363/link-error-installing-rcpp-library-not-found-for-lintl)でも質問している人がいて、`gettext`をインストールすれば良いとのこと。
`brew link`したらWarningでたので、`--force`つけて実行したらエラーが解消された。

```
$ brew install gettext
$ brew link gettext
Warning: gettext is keg-only and must be linked with --force
Note that doing so can interfere with building software.
$ brew link --force gettext
```


---

参考ページ

[MacOSX に homebrew で R をインストール](http://qiita.com/dkkoma/items/8b45ce94c2c5d89d567f)
[Homebrew でバージョンを指定してインストールする](http://qiita.com/tamasally/items/a7bc7eca85bbc70dda49)
[MacOSX に homebrew で R をインストール](http://qiita.com/dkkoma/items/8b45ce94c2c5d89d567f)
underscore.jsを読む#3 any,find,filter,reject

第三回。

```any.js
var any = _.some = _.any = function(obj, predicate, context) {
  predicate || (predicate = _.identity);
  var result = false;
  if (obj == null) return result;
  if (nativeSome && obj.some === nativeSome) return obj.some(predicate, context);
  each(obj, function(value, index, list) {
    if (result || (result = predicate.call(context, value, index, list))) return breaker;
  });
  return !!result;
};
```
ネイティブでは[some関数](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/some)になります。基本的にはeachで順番にテストしていき、predicateがtrueになる要素が見つかったらbreakします。breakはbreakerを返すことで実現しています。

breakerはunderscore内でのみ参照可能な変数で空のオブジェクトが代入されています。したがって、eachに渡す関数が空のオブジェクトを返したとしてもbreakは起こらず、underscore内の関数のみが安全にbreakできます。

最後の「!!」はresultにboolean以外のものが代入された場合に、booleanを返せるようにするイディオムです(たぶん、、、)。

 

```find.js
_.find = _.detect = function(obj, predicate, context) {
  var result;
  any(obj, function(value, index, list) {
    if (predicate.call(context, value, index, list)) {
      result = value;
      return true;
    }
  });
  return result;
};
```
anyで順番にテストしていって見つかったら早期終了して返すだけですね。見つからなかったらundefinedにするのは仕様のようです。


```filter.js
_.filter = _.select = function(obj, predicate, context) {
  var results = [];
  if (obj == null) return results;
  if (nativeFilter && obj.filter === nativeFilter) return obj.filter(predicate, context);
  each(obj, function(value, index, list) {
    if (predicate.call(context, value, index, list)) results.push(value);
  });
  return results;
};
```
これもeachで回してテストをパスするやつをpushしていくだけです。ちなみにリーダブルコードではfilterという名前は曖昧だから使うなとありました。まぁネイティブの実装がfilterという名前だから合わせたのでしょうけど。

```reject.js
_.reject = function(obj, predicate, context) {
  return _.filter(obj, function(value, index, list) {
    return !predicate.call(context, value, index, list);
  }, context);
};
```
filterを使うとrejectは論理を反転させるだけで作れます。

[Annotated Sourceにも書いています](http://takushi-m.github.io/underscore/docs/underscore.html#section-19)
Rails4上でRailsチュートリアルの「簡単な検索フォーム」を実装する


1. RailsってCRUD自動生成してくれるけど検索は作ってくれない。
2. Railsチュートリアルに「検索機能」について解説が…！
3. これでコピペ実装できるよー＼(^o^)／
3. って、このサンプルコードってRails3用だからコピペできないじゃないですかー()

ということでチュートリアルからリンクで紹介されている「簡単な検索フォーム（Simple searh form）」のサンプルコードを改良します。

**Ruby on Rails チュートリアル**
http://railstutorial.jp/chapters/following-users?version=4.0#sec-search


**RAILSCAST.COM - #37 Simple Search Form**
http://railscasts.com/episodes/37-simple-search-form

※通常の検索フォームを実装したい方はRansack Gemを使えば簡単に実装可能です。

**activerecord-hackery/ransack · GitHub**
https://github.com/activerecord-hackery/ransack
**Ransackのススメ**
http://qiita.com/nysalor/items/9a95d91f2b97a08b96b0


---

##Precondition

|Productなど|Versionなど|
|---|---|
|Rails | 4.1.0|
|Model | `project`|
|Modelのカラム | `name`カラムが存在|
|route.rb| Scaffolding、`resources :projects`状態|


##Procedure
[#37 Simple Search Form](http://railscasts.com/episodes/37-simple-search-form)のコメント欄でも既にRails4の場合を議論済みですが、(Ruby、Rails歴１週間程度の)自分の実装とは異なりました。
詳細は上記サイトのコメント欄を参照してください。
http://railscasts.com/episodes/37-simple-search-form?view=comments

### Rails4用コード

**Model**

````Ruby:models/project.rb
class Project < ActiveRecord::Base
  def self.search(search) #self.でクラスメソッドとしている
    if search # Controllerから渡されたパラメータが!= nilの場合は、titleカラムを部分一致検索
      Project.where(['name LIKE ?', "%#{search}%"])
    else
      Project.all #全て表示。
    end
  end
end
````

**View**

````ERB:project/index.html.erb
<%#　以下をScaffoldingしたindex.html.erbに追記する %>
<%= form_tag projects_path, :method => 'get' do %> <%#　projects_pathはモデル名で読みかえること %>
  <p>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag "Search", :name => nil %>
  </p>
<% end %>
````

**Controller**

````ruby:projects_controller.rb
class ProjectsController < ApplicationController
  def index
    #ViewのFormで取得したパラメータをモデルに渡す
    @projects = Project.search(params[:search])
  end
end
````

---

###サンプルコードとの差分概要


実際に変更が必要だった部分の概要です。

````ruby:models/project.rb
def self.search(search)
  if search
    find(:all, :conditions => ['name LIKE ?', "%#{search}%"])
  else
    find(:all)
  end
end
````

Rails4では`Model.find`の仕様が大きく変更されているので、`:all`や`:conditions`は使えません。
それぞれ、`Model.all`、`Model.where`に置き換えました。
`self.search`はRubyの仕様でクラスメソッド（JavaやC/C++でいうstaticメソッドみたいなもの）を宣言しています。
`form_tag`からメソッドを呼ぶので、インスタンスを渡さずとも検索ができるようにしています。

````eb:projects/index.rhtml
<% form_tag projects_path, :method => 'get' do %>
  <p>
    <%= text_field_tag :search, params[:search] %>
    <%= submit_tag "Search", :name => nil %>
  </p>
<% end %>
````

`projects_path`はルート定義によって生成される自動ヘルパーなので、実際に利用するときはモデル名で置き換えてください。(例：モデル名`Book`のときは`books_path`）
その他、`@project`なども同様です。

##Note

Rails4上で動くことが確認できただけなので最適解ではないと思われます。
フォーム内の複数のビューヘルパーから引数を受けて、複数条件で検索する拡張は近日更新します。

## Appendix

冒頭で記載済みですが、もう一度
今回は以下のサイトを参考にさせていただきました！！

**Ruby on Rails チュートリアル**
http://railstutorial.jp/chapters/following-users?version=4.0#sec-search


**RAILSCAST.COM - #37 Simple Search Form**
http://railscasts.com/episodes/37-simple-search-form

### ※通常の検索フォームを実装したい方はRansack Gemを使えば簡単に実装可能です。

**activerecord-hackery/ransack · GitHub**
https://github.com/activerecord-hackery/ransack
**Ransackのススメ**
http://qiita.com/nysalor/items/9a95d91f2b97a08b96b0
gmaps.jsの細かいノウハウ

gmaps.js という、GoogleMapsAPIを使うのがちょっと楽になるライブラリがある。

http://hpneo.github.io/gmaps/

シンプルな使い方の場合は悩むこともなく使えるんだけど、
ちょっと凝ったことをやろうとしたらサンプルを見るだけではわからない事が多々あったので色々使い方を紹介。


## マップの初期化

・マップのタイプをHybridに変更する
・マップのコントロールを非表示にする（ただしズームだけは表示する）

```coffeescript
map = new GMaps
    div: '#beacons-map'
    lat: 35.672370
    lng: 139.736538
    zoom: 13
    mapType: "HYBRID"
    disableDefaultUI: true
    zoomControl: true
```

map.map というのがGoogleMapsのオブジェクトになる。

## スタイル付き地図（Styled Maps）をHybrid地図に適用してPOIを消す
ふつうにGoogleMapsを表示すると、お店とか学校とか病院のアイコンが表示されてしまって、誤クリックして開いてしまうことがあるので消したい場合に必要。

Hybrid地図じゃない場合は、初期化するときにいきなりオプションを渡せば適用できるんだけど、Hybridの場合は生成後にsetOptionsしないとだめだった。

```coffeescript
google.maps.event.addListener map.map, 'maptypeid_changed', ->
    @setOptions
        styles:[{
            featureType: "poi",
            elementType: "all",
            stylers: [{visibility:"off"}]
        }]
google.maps.event.trigger(map.map,'maptypeid_changed')
```

## 静止画を地図として重ねて表示する
すごいめんどくさかった…。

まず、こういうクラスが必要らしいので用意しておく。
なんかもうちょっと短くかける気もするんだけど、
これはGoogleMapsのドキュメントにあったやつをCoffeescriptで書きなおしただけのもの。

```coffeescript
class MyMapOverlay extends google.maps.OverlayView
    constructor: (bounds, image, map)->
        @bounds_ = bounds
        @image_ = image
        @map_ = map
        @div_ = null
        @setMap(map)
    onAdd: ->
        div = document.createElement('div')
        div.style.border = "none"
        div.style.borderWidth = "0px"
        div.style.position = "absolute"
        img = document.createElement("img")
        img.src = @image_
        img.style.width = "100%"
        img.style.height = "100%"
        img.style.opacity = "0.5"
        div.appendChild(img)
        @div_ = div
        panes = @getPanes()
        panes.overlayLayer.appendChild(div)
    onRemove: ->
        @div_.parentNode.removeChild(@div_)
        @div_ = null
    draw: ->
        overlayProjection = @getProjection()
        sw = overlayProjection.fromLatLngToDivPixel(@bounds_.getSouthWest())
        ne = overlayProjection.fromLatLngToDivPixel(@bounds_.getNorthEast())
        div = @div_
        div.style.left = sw.x + 'px'
        div.style.top = ne.y + 'px'
        div.style.width = (ne.x - sw.x) + 'px'
        div.style.height = (sw.y - ne.y) + 'px'
```

そしてこのクラスを使う

```coffeescript
swBound = new google.maps.LatLng(35.603426, 139.632645)
neBound = new google.maps.LatLng(35.727523, 139.864241)
bounds = new google.maps.LatLngBounds(swBound, neBound)
map_img = "/my_map.png"
overlay = new MyMapOverlay(bounds, map_img, map.map)
```
複数のUITextFieldに同じプロパティを設定する

UITextField (に限らずUIView全般に言えますが) が画面にいくつかある場合、それら全てに共通の設定をしたいときがあります。

Xib/Storyboard で個別に設定していく場合は別ですが、コードで設定する場合、つい下記のような感じにやってしまいがちです。

```objc
self.firstField.delegate = self;
self.firstField.layer.borderWidth = 2;
self.firstField.layer.borderColor:[UIColor redColor].CGColor;

self.secondField.delegate = self;
self.secondField.layer.borderWidth = 2;
self.secondField.layer.borderColor:[UIColor redColor].CGColor;

// 以降続く...

```

ここで、各UITextFieldを一時的に配列にして、enumerateObjectsUsingBlock: メソッドを使って一気に同じ設定を施せば、見通しもよくなって良い感じです。

```objc
[@[self.firstField, self.secondField, self.thirdField, self.fourthField] enumerateObjectsUsingBlock:^(UITextField* obj, NSUInteger idx, BOOL *stop) {
		obj.layer.borderWidth = 2;
		obj.layer.borderColor:[UIColor redColor].CGColor;
		obj.delegate = self;
	}];
```

[andreamazz/UITextField-Shake](https://github.com/andreamazz/UITextField-Shake) の実装を参考にさせて頂きました。
オンラインアルゴリズムで平均値の逐次計算


オンラインアルゴリズムとは、データが逐次的に入ってきた時にも計算できるアルゴリズムのことである。
データを全て見た上で計算するバッチ(オフライン)アルゴリズムと対比してこう呼ばれる。

オンラインアルゴリズムは、すべてのデータをメモリ上に保持しておくのが厳しいような大規模データを扱う場合などによく使われる。機械学習の文脈でよく見かけるかもしれない。機械学習の文脈だと割と理論的に難しい物が多いが、平均、分散、サンプリングなどは簡単なシステムを作るときにも割とよく使うので、データが逐次的に来ても処理が書けるようになっておくと幸せになれることもあるはず。

今回は、平均値の逐次計算についてだけやり方を書いておく。


## 平均値の逐次計算

`average`を求めたい平均値、`total`を今までに処理したデータの個数として、
以下の形で記述できるようにすることを目標とする。

```ruby:ruby/python
average += x
total += y
```

もちろん、オンラインアルゴリズムとして成り立つためには`average *= z`という形を目標にしても良いが、(相加)平均値の場合は上記の形ならば解が求まる。

まず、`total`は回数を表すので、`y = 1`である。

次に`average`の方は自明ではないので、以下のように式展開して求める。
なお、ここでvalueは、新規の平均を求めたいデータの値である。

```ruby:math
average[new] = (average[old] * total[old] + value) / (total[old] + 1)
average[new] = average[old] + x

より

average[old] + x = (average[old] * total[old] + value) / (total[old] + 1)

これを解くと

average[old] + average[old] * total[old] + x * (total[old]+1) = average[old] * total[old] + value
average[old] + x * (total[old]+1) = value

結果として

x = (value - average[old]) / (total[old] + 1)

を得る
```

プログラムに書く際の結果としては、

```ruby:ruby/python
average += (value - average) / (total + 1)
total += 1
```

となる。ここで、

```ruby:math
total[new] = total[old] + 1
```

を考慮すると、プログラム的には

```ruby:ruby/python
total += 1
average += (value - average) / total
```

の方がかっこいいかもしれない。


## 具体例で検算

データが３つで、その値は

```
20 -> 30 -> 40 
```

となっていたとする。

この時、最終的な平均は

```
30
```

であり、その時々の平均は

```
20 -> 25 -> 30
```

と推移していれば良い。

実際にやってみる。

### １回目

```ruby:math
x = (20 - ?) / 1 = 20 - ?
average = ? + 20 - ? = 20
```

### ２回目

```ruby:math
x = (30 - 20) / 2 = 5
average = 20 + 5 = 25
```

### ３回目

```ruby:math
x = (40 - 25) / 3 = 5
average = 25 + 5 = 30
```

となり、うまくいっていることがわかる。

ちなみに、１回目の`?`はaverageの初期値で、どんな値が入っていても良い。
実際には`0`か、事前に平均値が推定できる場合はその推定値を入れておくと良い。


## おまけ

### 分散をオンラインアルゴリズムにする際のヒント

```ruby:math
V(X) = E(X*X) - E(X)*E(X)
```

を使う。ここで`V`は分散、`E`は平均を表す。
つまり、データの2乗値の平均値を保持するようにすれば計算できる。

### サンプリングをオンラインアルゴリズムにする際のヒント

例えば大量のデータから、1つだけ値をサンプリングしたいとき、
そのデータを`sampled`、これまでに見たデータの個数を`total`とする。

このとき、

- 新しいデータ`d`を`sampled`にする確率を`1 / (total+1)`
- これまでの`sampled`をそのまま使う確率を`total / (total+1)`

とすると均等な確率でサンプリングされた結果が求まる。

これを応用すれば、3つだけサンプルするといったことももちろん可能。
atom-cheat-sheet

# atom-cheat-sheet(for Mac)

GitHub製エディタ[Atom](https://atom.io/)のチートシートです。  
招待制だったのがいつのまにか一般公開されてるみたいですね。  




## アプリケーション

||ショートカットキー|
|:---:|:-------------|
|隠す|**cmd** + h|
|他を隠す|**cmd** + opt + h|
|最小化|**cmd** + m|
|補完|*ctrl* + space|


## 移動
|移動|ショートカットキー|
|:---:|:-------------|
|単語の先頭へ|opt + b|
|単語の末尾へ|opt + f|
|括弧の先頭へ|*ctrl* + m|
|行の先頭へ|*ctrl* + a|
|行の末尾へ|*ctrl* + e|
|現在行全体を上へ|**cmd** + *ctrl* + ↑|
|現在行全体を下へ|**cmd** + *ctrl* + ↓|
|ファイルの先頭へ|**cmd** + ↑|
|ファイルの末尾へ|**cmd** + ↓|
|行の最初の文字へ|**cmd** + ←|
|行の最後の文字へ|**cmd** + →|
|行を指定して移動|*ctrl* + g|

## 削除
|削除|ショートカットキー|
|:-------------:|:-------------|
|行末までを削除|*ctrl* - *k*|
|単語の先頭まで|opt - delete|
|単語の末尾まで|opt - d|
|現在の行|*ctrl* + **K**|
|現在行の改行|**cmd** + j|
- [cmd +K]の様に大文字の場合は同時にshiftキーも押すことを表しています  


## 選択
|選択|ショートカットキー|
|:---:|:-------------|
|単語の先頭まで|opt + B|
|単語の末尾まで|opt + F|
|単語全体|*ctrl* + W|
|行の先頭まで|*ctrl* + A|
|行の末尾まで|*ctrl* + E|
|次行の同じ位置まで|*ctrl* + N|
|前行の同じ位置まで|*ctrl* + P|
|ファイルの先頭まで|**cmd** + shift + ↑|
|ファイルの末尾まで|**cmd** + shift + ↓|
|全て選択|**cmd** + a|
|次の単語を選択 *1|**cmd** + d|
|同じ単語を選択 |**cmd** + *ctrl*+ g|
*1 選択中の単語と同じ単語を探して、次にマッチした場所を選択範囲に追加する

## その他
|その他編集|ショートカットキー|
|:-------------:|:----------------|
|行を複製|**cmd** + shift + D|
|インデント追加|**cmd** + ]|
|インデント解除|**cmd** + [|
|コメントアウト/解除|**cmd** + /|
SpriteKit入門 -15-


[ぴぽや](http://piposozai.blog76.fc2.com/ "ぴぽや")さんがスプライトアニメーション用の素材を提供していましたので、試しに爆弾が爆発するアニメーションを作ってみます。

テクスチャにはこちらの画像を使用します。

![bomb.png](https://qiita-image-store.s3.amazonaws.com/0/30731/2156270c-3853-541a-55b6-5705cc7e95fa.png "bomb.png")

タップした場所に爆弾を置いて、時間経過とともに爆発するアニメーションはこのような感じで実装できます。

```objectivec:HelloScene.m
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
	UITouch *touch = [touches anyObject];
	CGPoint location = [touch locationInNode:self];
	int type = rand() % 5;
	SKTexture *texture = [SKTexture textureWithImageNamed:@"bomb.png"];
	SKSpriteNode *sprite = [SKSpriteNode spriteNodeWithTexture:[self newBomTexture:texture x:0 y:type]];
	sprite.position = location;
	[self addChild:sprite];
	SKAction *action = [self newBomAction:type texture:texture];
	[sprite runAction:action completion:^{
		[sprite removeFromParent];
	}];
}

- (SKAction *) newBomAction:(int)type texture:(SKTexture *)texture
{
	SKAction *action = nil;
	NSMutableArray *array = [NSMutableArray array];
	for (int x=0; x < 6; x++) {
		[array addObject:[self newBomTexture:texture x:x y:9-type]];
	}
	for (int x=0; x < 6; x++) {
		[array addObject:[self newBomTexture:texture x:x y:9-(type+5)]];
	}
	action = [SKAction animateWithTextures:[array copy] timePerFrame:0.2];
	return action;
}

- (SKTexture *) newBomTexture:(SKTexture *)texture x:(int)x y:(int)y
{
	CGFloat pngWidth = 192.0;
	CGFloat pngHeight = 320.0;
	CGFloat rectWidth = pngWidth / 6.0;
	CGFloat rectHeight = pngHeight / 10.0;
	return [SKTexture textureWithRect:CGRectMake(x*rectWidth/pngWidth, y*rectHeight/pngHeight, rectWidth/pngWidth, rectHeight/pngHeight) inTexture:texture];
}
```

実行結果はこのようになります。

![spritekit_15_01.png](https://qiita-image-store.s3.amazonaws.com/0/30731/35d753b5-0b11-b9a2-f6d2-385215f0708b.png "spritekit_15_01.png")

今回はここまで。
[NSNull null]か確認するなら[obj isNull]だと思うんだ

昔々読んだ本(リファクタリング)にNullObjectパターンなるものが紹介されていて、その中でのオブジェクトがnullオブジェクトかの確認方法はisNullだった。rubyでもnilかどうかの判定はobj.nil?、ものすごく分かりやすい。

Objective-CでのNSNullオブジェクトかの比較方法は下記の通り。ちょっとだけだけど冗長な感じがする。

```objc
-(BOOL)test:(NSNumber*)value {
  if( value == nil || [value isEqual:[NSNull null]] ) {
    return NO;
  }
  return YES;
}
```

nilの比較は100歩譲るとして、[value isNull]くらいできても良いと思うんだ.
という訳で実現してみた。

※　職場では、環境の根底を勝手に変更すると混乱すること必至なので、関係者からの同意を得てからにしましょう。

# NSObjectにisNullを追加する

NSObjectにカテゴリを追加してisNullメソッドを追加します。

NSObject+isNull.h

```objc
@interface NSObject (isNull)
-(BOOL)isNull;
@end
```

NSObject+isNull.m

```objc
#import "NSObject+isNull.h"

@implementation NSObject (isNull)
-(BOOL)isNull {
    return [[NSNull null] isEqual:self];
}
@end
```

# プリコンパイルヘッダにNSObject+isNull.hを追加する.

デフォルトではプリコンパイルヘッダが有効になっていると思うので、pchファイルにNSObject+isNull.hを追加します。これでプロジェクト内の全てのソースファイルから、NSObject+isNull.hがインクルードされます。ソースファイル毎に#import "NSObject+isNull.h"する必要がなくなります。

 プロジェクト名-Prefix.pch

```objc
#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    #import "NSObject+isNull.h"
#endif
```

# 動作確認

これで次のようにかけるようになりました。

```objc
-(BOOL)test:(NSNumber*)value {
  if( value == nil || [value isNull] ) {
    return NO;
  }
  return YES;
}
```

…value == nil、邪魔だなー。
ここまで書いてだけど、[NSNull isNull:value]の方が良い気がしてきた.
書き直します。

# [NSNull isNull]

```objc
// NSNull+isNull.h
#import <Foundation/Foundation.h>

@interface NSNull (isNull)
+(BOOL)isNull:(id)obj;
@end
```

```objc
// NSNull+isNull.m
import "NSNull+isNull.h"

@implementation NSNull (isNull)
+(BOOL)isNull:(id)obj {
    return obj == nil || [[NSNull null] isEqual:obj];
}
@end 
```

```objc
// プロジェクト名.pch
#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    #import "NSNull+isNull.h"
#endif
```

# 動作確認

```objc
-(BOOL)test:(NSNumber*)value {
  if([NSNull isNull:value]) {
    return NO;
  }
  return YES;
}
```

# 余談

あまり意味がない、言葉遊びのように感じられるかもしれませんが、
この変更により以下のようなメリットがあると思います。

- コードの意図が明確になった
- value = nilのようなミスをしなくてすむ
- 「nilでない場合」が書きやすくなった(![NSNull isNull:value]ですむ。)
- nilか[NSNull null]か気にしなくてよくなった
次の一歩，ConTeXt で日本語をとりあえず印字

>「[はじめての ConTeXt](http://qiita.com/kuroky_plus/items/eddee9a8cd4a68379884)」に続く一連のポストです．

ConTeXt MkIV が動作する，新しめ（2012年半ば以降）の環境であれば，日本語がとりあえず印字できる．たとえば以下のようなファイルを作る． 

```tex:test2.tex
\definefont[testfont][ipaexm][script=kana,language=jan]

\starttext
\startscript[nihongo]
\testfont
ひらがな，カタカナ，および漢字。
\stopscript
\stoptext
```

そしてコマンドラインで `context test2` とすると，test2.pdf が得られる．スクリーンショットを撮ってみた結果は以下の通り：

![test2.png](https://qiita-image-store.s3.amazonaws.com/0/35379/a15b4de2-84d8-2fb3-149b-eff6fb02c99c.png)

とにかく，日本語が問題なく通ることは確認できる．

日本語に関する実装は発展途上であり，以下に *emph* （初期設定では斜体表示）で示した部分は今後変更されることもあり得る．
* script= *kana*
* language= *jan*
* \startscript[ *nihongo* ]

特に， *kana* については Hans から私が相談を受けたまま，代替案が見つからずこのまま進行している．ただ，kana など，かなを中心とした筆記法は，幼児・小学校低学年向けの分かち書きのためにとっておきたいとは思っている．

韓国語に対しては hangul，中国語に対しては hanji なので，対応するのは「漢字かな交じり」だろう．しかし，「漢字かな交じり」を表現する，よく知られた短い言葉がなくて困っているわけである．インターネット番号管理機関（Internet Assigned Numbers Authority, IANA）で登録されているのは Jpan だそうだが，読者の皆さんはいかがお考えだろうか？