OmniAICreator/Qiita-1.07M huggingface dataset:
C++でWebSocketハンドシェイク


ハンドシェイクのだいたいの流れ。


リクエストヘッダ`SEC-WEBSOCKET-KEY`に設定された文字列に`"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"`という固定文字列を連結したものをSHA-1エンコードしてからBASE64したものを101レスポンスで返します。

処理自体は難しくないけど、主にCryptoPPの使い方のためにメモ。

あと、地味にboost::base64_from_binaryがパディングの=をくっつけてくれないのも罠でした。


```websocket_hanshake.cpp

#include <boost/archive/iterators/base64_from_binary.hpp>
#include <boost/archive/iterators/transform_width.hpp>
#include <cryptopp/sha.h>

using namespace std;
using namespace boost::archive::iterators;

#define HANDSHAKE_MAGIC_STRING "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"

// 中略

    // Upgrade処理
    void HttpHeaderPacketParser::upgrade()
    {
        string encoded_text =
            toBase64( toSHA1( http_request_header_["SEC-WEBSOCKET-KEY"]+HANDSHAKE_MAGIC_STRING ) );

        string http_response_header;

        http_response_header += "HTTP/1.1 101 Switching Protocols\r\n";
        http_response_header += "Upgrade: websocket\r\n";
        http_response_header += "Connection: Upgrade\r\n";
        http_response_header += "Sec-WebSocket-Accept: "+encoded_text+"\r\n";
        http_response_header += "\r\n";

        connection_.write(http_response_header.c_str(), http_response_header.length());

        connection_.switch_packet_parser(boost::shared_ptr<PacketParser>(new WebSocketParser(this)));

        cout << http_response_header << endl;
    }

    // バイナリ配列をBase64エンコードした文字列に変換する
    string HttpHeaderPacketParser::toBase64(const vector<byte>& source)
    {
        typedef base64_from_binary<transform_width<vector<byte>::const_iterator,6,8> > base64;

        string encoded_text(
                base64(source.begin()),
                base64(source.end())
                );
        int padding_count = 4-encoded_text.length()%4;
        for (int i=0; i<padding_count; i++) {
            encoded_text += '=';
        }

        return encoded_text;
    }

    // 文字列をSHA1変換する
    vector<byte> HttpHeaderPacketParser::toSHA1(const string& source)
    {
        byte buf[CryptoPP::SHA1::DIGESTSIZE];

        CryptoPP::SHA1().CalculateDigest( buf, reinterpret_cast<const byte*>(source.c_str()), source.length());

        vector<byte> encoded_bytes;
        encoded_bytes.assign(buf, buf+sizeof(buf));

        return encoded_bytes;
    }
```
ruby-debug19のインストールに失敗する


Ruby1.9.3-p194と、Rails3.2.3でのデバッグについて。

[Ruby on Railsでruby-debugを使ってデバッグしよう](http://doruby.kbmj.com/nakahira_on_rails/20090323/ruby_on_rails__debug_)

##デバッグモードの開始
```
$ rails s --debugger
```
デバッグモードには、ruby-debugが必須となります。

## ruby-debugのインストール
Ruby 1.9.xでは、ruby-debug19の方を使うので、ruby-debug19をインストールしてください。

```
$ gem install ruby-debug19
```

Gemfileには以下のように追記します。

```ruby:Gemfile
gem 'ruby-debug19', :require => 'ruby-debug'
```

## Ruby1.9.3-p194ではエラーになる
```
$ rails s --debugger

/home/is0me/.rvm/gems/ruby-1.9.3-p194/gems/ruby-debug-base19-0.11.25/lib/ruby-debug-base.rb:1:in `require': /home/is0me/.rvm/gems/ruby-1.9.3-p194/gems/ruby-debug-base19-0.11.25/lib/ruby_debug.so: undefined symbol: ruby_threadptr_data_type - /home/is0me/.rvm/gems/ruby-1.9.3-p194/gems/ruby-debug-base19-0.11.25/lib/ruby_debug.so (LoadError)
```

2012年8月22日時点で、ruby-debug19がまだ1.9.3-p194に対応していませんでした。

[Can't install ruby-debug-base19x gem](http://stackoverflow.com/questions/11074794/cant-install-ruby-debug-base19x-gem)

RubyForgeから最新版のlinecache19と、ruby-debug-base19をダウンロードしてきます。
インストール後はダウンロードしたファイルを消してOK。

http://rubyforge.org/projects/ruby-debug19/

```
curl -OL http://rubyforge.org/frs/download.php/75414/linecache19-0.5.13.gem
curl -OL http://rubyforge.org/frs/download.php/75415/ruby-debug-base19-0.11.26.gem
```

インストール時は、Rubyのビルドソースを指定します。

### rvmの場合
```
gem install linecache19-0.5.13.gem ruby-debug-base19-0.11.26.gem -- --with-ruby-include=$rvm_path/src/ruby-1.9.3-p194/
```

### rbenvの場合
```
gem install linecache19-0.5.13.gem ruby-debug-base19-0.11.26.gem -- --with-ruby-include=$HOME/.rbenv/versions/1.9.3-p194/include/ruby-1.9.1/ruby-1.9.3-p194
```

## ruby-debugが通るか確認
```
$ irb
1.9.3p194 :001 > require 'ruby-debug'
 => true
```
UIPageControl + UIScrollViewでスライドショー的な画面をつくる

Storyboard上でUIPageControlとUIScrollViewを配置してIBOutletとしてPageViewControl.hファイルに接続しておく
また、UIScrollViewのdelegateを配置したUIViewControlに向けておく

```objective-c:PageViewControl.m
// ページ数は最大で11までらしい
#define kNumberOfPages 11

// pageControlの左右がタップされたときに呼ばれる
// scrollViewのスクロール位置をズラして表示を変える
- (void)pageControlDidChange:(UIPageControl *)sender
{
    CGRect frame = scrollView.frame;
    frame.origin.x = frame.size.width * sender.currentPage;
    frame.origin.y = 0;
    [scrollView scrollRectToVisible:frame animated:YES];
    NSLog(@"pageControlDidChange, %d", sender.currentPage);
}

// scrollViewが指で左右にスワイプされたときに呼ばれる
// pageControlの現在ページの表示位置を変更する
- (void)scrollViewDidScroll:(UIScrollView *)sender
{
    CGFloat pageWidth = scrollView.frame.size.width;
    if (fmod(scrollView.contentOffset.x, pageWidth) == 0.0) {
        int pageNum = scrollView.contentOffset.x / pageWidth;
        pageControl.currentPage = pageNum;
    }
    NSLog(@"scrollViewDidScroll %d", pageControl.currentPage);
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // UIPageControlをセットアップする
    // storyboardで配置していても、これをやらないと表示されない。。
    [self.view addSubview:pageControl];
    [pageControl addTarget:self action:@selector(pageControlDidChange:) forControlEvents:UIControlEventValueChanged];

    // UIScrollViewをセットアップする
    scrollView.contentSize = CGSizeMake(scrollView.frame.size.width*kNumberOfPages, scrollView.frame.size.height);
    // ページごとにUIViewControllerを生成し、view.frameをズラしながらaddSubviewする
    CGSize size = scrollView.frame.size;
    for (int i=0; i<kNumberOfPages; i++) {
        // TODO ここでは適当にページ番号のラベルを表示させている
        // 実際はページ数ごとに辞書の配列でも作って持っておいて、ここでそのデータを元に生成する
        UIViewController *pageSubView = [[UIViewController alloc] init];
        pageSubView.view.frame = CGRectMake(size.width*i, 0, size.width, size.height);
        
        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake((size.width-200)/2, 100, 200, 200)];
        [label setTextAlignment:UITextAlignmentCenter];
        UIFont *font = [UIFont systemFontOfSize:40.0f];
        [label setFont:font];
        label.text = [[NSString alloc] initWithFormat:@"%d", i+1];
        
        [[pageSubView view] addSubview:label];
        [scrollView addSubview:pageSubView.view];
    }
}

```
Sublime Text 2 使用パッケージ

# Package

### TrailingSpaces

行末半角スペース削除／ハイライト(削除は半角スペースのみ、全角スペースは削除されない)

[SublimeText/TrailingSpaces](https://github.com/SublimeText/TrailingSpaces)

[ Package Control ] - [ Install Package ] - [ TrailingSpaces ]

設定

[ Preferences] - [ Settings - User ]

```
{
  "trim_trailing_white_space_on_save": true,
  "trailing_spaces_highlight_color": "invalid",
}
```

### CoffeeScript

[ Package Control ] - [ Install Package ] - [ CoffeeScript ]

### SCSS

[ Package Control ] - [ Install Package ] - [ SCSS ]
[ Package Control ] - [ Install Package ] - [ SCSS Snippets ]

### SideBarEnhancements

[ Package Control ] - [ Install Package ] - [ SideBarEnhancements ]

### All Autocomplete

開いているすべてのファイルから補完

[ Package Control ] - [ Install Package ] - [ All Autocomplete ]

### Simple Rails Navigator

[noklesta/SublimeRailsNav](https://github.com/noklesta/SublimeRailsNav)

[ Key Bindings] - [ User ]

```
[
  { "keys": ["super+ctrl+m"], "command": "list_rails_models" },
  { "keys": ["super+ctrl+c"], "command": "list_rails_controllers" },
  { "keys": ["super+ctrl+v"], "command": "list_rails_views" },
  { "keys": ["super+ctrl+h"], "command": "list_rails_helpers" },
  { "keys": ["super+ctrl+x"], "command": "list_rails_fixtures" },
  { "keys": ["super+ctrl+t"], "command": "list_rails_tests" },
  { "keys": ["super+ctrl+i"], "command": "list_rails_javascripts" },
  { "keys": ["super+ctrl+y"], "command": "list_rails_stylesheets" }
]
```

### CaseConversion

[jdc0589/CaseConversion](https://github.com/jdc0589/CaseConversion/)

[Aries - CaseConversion](https://aries-sky.heroku.com/memos/show?category=Sublime&id=1399)

Keybindings

```
To snake_case: "ctrl+alt+c", "ctrl+alt+s"
to camelCase: "ctrl+alt+c", "ctrl+alt+c"
to PascalCase: "ctrl+alt+c", "ctrl+alt+p"
```

↓

```
To snake_case: "ctrl+alt+c+s"
to camelCase: "ctrl+alt+c+c"
to PascalCase: "ctrl+alt+c+p"
```
Sencha Touch2.0でPanelのtapイベントをcontrollerでListenする方法


PanelのinitializeでrelayEventsと使ってtapイベントをrelayさせる。その後、controller側ではDataViewなどと同じようにtapイベントをトラップさせればOK。

```javascript
//Panel
Ext.create('Ext.Panel', {
	initialize: function() {
		this.relayEvents(this.element, ['tap']);
	}
});

//Controller
Ext.create('Ext.app.Controller', {
	control: {
		'panel': {
			tap: 'onTap'
		}
	}
});
```
Javaの文法メモ

###文字列操作
```java:
// 結合
str = str1 + str2;

// 配列を結合
public static String implode(String[] ary, String delim) {
    String out = "";
    for(int i=0; i<ary.length; i++) {
        if(i!=0) { out += delim; }
        out += ary[i];
    }
    return out;
}

//配列に分割
String[] words = "The Web Systems Engineering Blog".split( " " );

// 長さ
int len = str.length();

//切り出し
str = "Hello!".substring(2, 5);  // llo

//検索
if (s1.indexOf(s2) != -1) {
    // 部分一致です
} else {
    // 部分一致ではありません
}
```

###配列
```java:
// 作成
int[] intArray = new int[10];
String[] stringArray = new String[10];
String[] stringArray = {"Sunday", "Monday", "Tuesday"};

// 設定
for (int i = 0; i < intArray.length; i++) {
    intArray[i] = i;
}

// 取得
for (int i = 0; i < intArray.length; i++) {
    System.out.println(intArray[i]);
}
```

###ArrayList
```java:
// 作成
ArrayList al = new ArrayList();

// 追加
al.add("apple");

// 取得
str = al.get(2);
for(int i=0; i<al.size(); i++){            
    System.out.println( (String)al.get(i) );
}

// 削除
al.remove(2);
al.clear(); //全削除

// 要素があるか判定する
al.isEmpty(); //全要素
al.contains(hoge); //ある要素

```

###辞書
```java:
// 作成
HashMap map = new HashMap();

// 追加
map.put("name", "Alice");

// 取得
map.get("name")
Iterator it = map.keySet().iterator();
while (it.hasNext()) {
    Object o = it.next();
    System.out.println(o + " = " + map.get(o));
}

// 削除
al.remove("name");
al.clear(); //全削除

// 要素があるか判定する
al.isEmpty(); //全要素
al.containsKey("name"); //ある要素
```

###データ型変換
```java:
// int - string
int intval = Integer.parseInt(str);
String str = String.valueOf(intval);

// double - string
double dblval = Double.parseDouble(str);
String str = String.valueOf(dblval);

// float - string
float floatval = Float.parseFloat(str);
String str = String.valueOf(floatval);

// double - int (数値型-数値型)
double dblval = (double)intval;
int intval = (int)dblval;
```


###ログ
```java:
// android
import android.util.Log;
Log.d("mylog", String.valueOf(intval));
```
git でいじってたものを途中から svn に push する

はまったのでメモ
svn と git の repository を graft してあげないといけない
具体的な手順としては
 % git svn init -s SVNレポジトリ
 % git svn fetch
 % git show-ref remotes/trunk  # svn でとってきたところ hash値を取得
 % git log --pretty=oneline  # git 側のつなぎめのhash値を取得。普通は一番昔のもの
 % echo "SVNのハッシュ値 gitでつなぐところのハッシュ値" > .git/info/grafts
 % git svn dcommit

はまったのは、svn の repository が svn mkdir trunk branches tags したてのものでは駄目で、何か commit しとかないとうまくいかない。理由は不明
RubyMotion でグラデーション


RubyMotion で [CGGradient](https://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CGGradient/Reference/reference.html) を使ってグラデーションを作る際に 2 点ほどポイントがありそうです。

## 1. Pointer クラスを使用する
CGGradient オブジェクトを作成する際に使用する関数 `CGGradientCreateWithColorComponents` は `CGFloat` 型の配列を受け取ります(変数 `components`, `locations` に注目してください)。

```c
CGGradientRef CGGradientCreateWithColorComponents(
   CGColorSpaceRef space,
   const CGFloat components[],
   const CGFloat locations[],
   size_t count
);
```

Ruby の Array クラスを使った配列は簡単に用意できますが、ここでは `CGFloat` 型の配列なので、RubyMotion で用意されている Pointer クラスを使い `CGFloat` 型の配列と同等のものを作ります。以下のようなコードになります。

```ruby
float_array = Pointer.new(:float, size)
``` 

## 2. kCGGradientDrawsXXXX 定数
CGGradient では `kCGGradientDrawsBeforeStartLocation` と `kCGGradientDrawsAfterEndLocation` という定数が用意されています。どちらも小文字から始まる定数です。

RubyMotion では英小文字から始まる定数は、一文字目を大文字に書き換えて利用してあげる必要があります。

`kCGGradientDrawsAfterEndLocation` は `KCGGradientDrawsAfterEndLocation` になります。

## いざ動かしてみる

```ruby:app_delegate.rb
class Array
  def to_pointer(type)
    # Ruby の Array オブジェクトを Pointer クラスを使ったものに変換
    pointer = Pointer.new(type, self.size)
    self.each_with_index do |v, i|
      pointer[i] = v
    end
    pointer
  end
end

class GradientView < UIView
  def drawRect(rect)
    super

    context = UIGraphicsGetCurrentContext()
    CGContextSaveGState(context)

    CGContextAddRect(context, self.frame)
    space = CGColorSpaceCreateDeviceRGB()

    comp = [
        0.0, 0.0, 1.0, 1.0, # Blue
        1.0, 0.0, 0.0, 1.0, # Red
        0.0, 1.0, 0.0, 1.0  # Green
    ]
    components = comp.to_pointer(:float)

    loc = [0.0, 0.5, 1.0]
    locations = loc.to_pointer(:float)

    count = loc.size
    frame = self.bounds
    start_point = frame.origin
    end_point = CGPointMake(frame.origin.x + frame.size.width, frame.origin.y)
    gradient = CGGradientCreateWithColorComponents(space, components, locations, count)

    CGContextDrawLinearGradient(context,
                                gradient,
                                start_point,
                                end_point,
                                KCGGradientDrawsAfterEndLocation) # 定数を英大文字で始める
    CGContextRestoreGState(context)
  end

end

class AppDelegate
  def application(application, didFinishLaunchingWithOptions:launchOptions)
    @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
    @window.rootViewController = UIViewController.alloc.initWithNibName(nil, bundle: nil)

    @view = GradientView.alloc.initWithFrame(CGRectMake(10, 10, 100, 100))
    @window.rootViewController.view.addSubview(@view)
    @window.makeKeyAndVisible

    true
  end
end
```
Debianに最新のstableなgitをインストールする

Debian系のOSでgitのパッケージをインストールすると最新のstableなgitではないことが多いので、次の方法でリポジトリを追加してインストールします。

````
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git
````
逆FizzBuzz

だいぶ前に（以下略

```scheme:invfizzbuzz.scm
(use srfi-42)

(define strl '(fizz buzz fizz fizz buzz fizz fizzbuzz))
(define intl '(3 5 6 9 10 12 15))

(define (min-list lst)
  (let loop ((ls (map (lambda(x)(length x)) lst))
			 (n 0))
	(if (eq? (car ls) (apply min ls))
	  n
	  (loop (cdr ls) (+ n 1)))))

(define (fizzbuzz lst)
  (let loop ((n 1)
			 (ls lst)
			 (str strl)
			 (int intl))
	(cond
	  ((null? (cdr ls))(solve lst str int))
	  ((eq? (car ls) 'fizzbuzz)
	   (loop (+ n 1) (cdr ls) (append str strl) (append int (map (lambda(x)(* (+ 15 x) n)) intl))))
	  (else (loop n (cdr ls) str int)))))

(define (solve lst str int)
  (let loop ((str str)
			 (int int)
			 (result '()))
	(cond ((> (length lst) (length str))
		   (reverse (map (lambda(x)(list-ec (:range v (car x) (+ (last x) 1)) v)) result)))
		  ((equal? lst (take str (length lst)))
		   (loop (cdr str) (cdr int) (cons (take int (length lst)) result)))
		  (else (loop (cdr str) (cdr int) result)))))

(define (invfizzbuzz lst)
  (let ((result (fizzbuzz lst)))
	(if (null? result)
	  '()
	  (print (list-ref result (min-list result))))))
```
周期性を利用したFizzBuzz

だいぶ前に書いたけど最近Qiitaが熱いらしいので（以下略

```scheme:fizzbuzz.scm
(define fizzbuzz '(1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 Fizzbuzz))

(define (solve n)
  (let loop ((num 1)(lst fizzbuzz)(m 1))
	(cond 
	  ((null? lst)
	   (loop num (map (lambda(x)(if (number? x)(+ x (* 15 m)) x)) fizzbuzz) (+ m 1)))
	  ((>= n num)
	   (print (car lst))
	   (loop (+ num 1) (cdr lst) m)))))
```
Jettyでカレントディレクトリをwarアプリケーションとして実行するワンライナー

展開されたwarアプリケーションのルートがカレントディレクトリの状態で以下のコマンドを打つとmaven経由でJettyを起動し、warアプリケーションとして実行してくれます。

```bash:launchwar.sh
curl -s https://raw.github.com/gist/3401651/dd1dbb40ed8c0adcc324fb6d2e56aca3c22d9766/launch_war.sh | bash
```
Railsで、indexアクションがshowアクションと認識される

http://example.com/pages
というURLへのアクセスは、indexアクションとなるのに、

http://example.com/pages/index
というURLへのアクセスは、showアクションに振り分けられてしまう。

>Unknown action The action 'show' could not be found for 〜

>The action 'show' could not be found for 〜

これはscaffoldによって書かれる、routes.rbのresourcesが原因だったりする。

```ruby:config/routes.rb
resources :pages
```

これをコメントアウトすればOK。
connect関数のループ内における不具合

作成中のプログラムは大学での課題「1対1のチャットプログラム」名づけて”Talk”
マルチスレッドでクライアントとサーバーを同時に動かす方法で実現を試みる。

目的：
対話相手がいつもオンラインである保証がないので、クライアント側はconnectを繰り返し試行する。

症状：
ループ2回目以降、毎回connect関数が（Invalid argument)エラーを吐いて無限ループ。
接続できるときは一回目のconnectで成功する。このときはループを抜けるのでOK
接続失敗するときは一回目に限り ”Connection refused”エラーを吐く。
2回目以降は前述の通り。

試行した解決策：
①2回目以降、アドレス構造体sinが全てクリアされているのが確認できたため、ループする度に構造体の変数に値を入れなおした　
→　2回目以降のconnect実行時におけるアドレス構造体の値は適切になったが、エラーは消えず。

②5秒間スリープさせてから相手へのconnectを開始する。（2台の端末上で、同タイミングでプログラムを実行しておけば5秒の間に両者ともサーバー側スレッドはaccept体制に入っているハズ）
→うまくいった。ただし5秒過ぎても相手のサーバーが死んでいれば、やっぱり症状が発症。

③エラーがInvalid argumentなので、1回目と2回目のconnect実行前にアドレス構造体の値を出力させて変化がないかチェック。
→変化なし。

オチ：
　...結果、色々ググッていると、こういう記事が・・・↓
　http://d.hatena.ne.jp/n_a_u/20091221/1261360709
　この記事のコメントに、
　「connect(2)のmanで見る限りconnectはストリームでは１回限りしか成功しない。」
　とある。
　Manのページ↓見てみたら、確かに書いてあった。
　http://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/connect.2.html

　コメント通りならアドレス構造体をリセットすればうまくいくはずだが、それも失敗済み。
　目的通りの処理をするためにはどうすればいいか、近いうちに大学の先輩方にお聞きする。
   →お聞きしたところ、ソケットを作り直さないといけなかったらしい。
　　プログラムのソケット作成からやり直して実行した途端にうまくいくようになった。
　　
'''
//メッセージを受信する。（クライアント）
void *receiveMessage(void *para){
	struct sockaddr_in sin;
	int socketID = 0;
	int recvSize = 0;
	
	pthread_mutex_lock(&mutex);
	printf("(i) Preparing for receiver.\n");

	//ソケット作成
	printf("Building socket...");
	if((socketID = socket(PF_INET, SOCK_STREAM,0))< 0){
		printf("\n(!)Failed to building socket for receiver.\n");
		pthread_exit(0);
	}
	printf("OK\n");
	
	//sock_addr_in構造体を初期化
	printf("Initializing sender...");
	if(init_sockaddr_in(hostName, &sin)<0){
		perror("Failed.\n");
		goto close_socket;
	}
	printf("OK\n");
	
	//アドレス構造体情報を出力（デバッグ用）
	printf("Addr_inStructure(Socket:%d Family:%d IP-Address:%s Port:No.%d　len:%d) size:%lu on %p \n",socketID,sin.sin_family,inet_ntoa(sin.sin_addr),sin.sin_port,sin.sin_len,sizeof(sin),&sin);    //接続状況出力

	//コネクションを張る
	printf("Sending request to connect....\n");
	sleep(5);
	while(connect(socketID,(struct sockaddr *)&sin, sizeof(sin))== -1){
		printf("(!)Failed to connect with errno:%d(%s)\n",errno,strerror(errno));
		sleep(1);
		if(init_sockaddr_in(hostName, &sin)<0){
			perror("(!)Failed to initialize addr_in\n");
			goto close_socket;
		}
		printf("Addr_inStructure(Socket:%d Family:%d IP-Address:%s Port:No.%d　len:%d) size:%lu on %p \n",socketID,sin.sin_family,inet_ntoa(sin.sin_addr),sin.sin_port,sin.sin_len,sizeof(sin),&sin);    //接続状況出力
	}
	printf("Request was accepted.\n");
	
	//この段階まできたら受信準備は整ったことになる。
	printf("(◯) Ready to receive message completed.\n");
	pthread_mutex_unlock(&mutex);

	//メッセージ受信
	while(1){
		//メッセージを受信
		if ((recvSize=recv(socketID,&buffer, sizeof(buffer),0))<=0) {
			perror("(!)Failed to receive messages");
			clean(buffer);
			goto close_socket;
		}
		receivedMessage = malloc(sizeof(buffer));
		strcpy(receivedMessage, buffer);
		clean(buffer);
		printf("%s>%s (%d bytes)",inet_ntoa(sin.sin_addr),receivedMessage,recvSize);
		free(receivedMessage);
	}
	
	//ソケットを閉じる。
close_socket:
	printf("Closing socket.\n");
	pthread_mutex_unlock(&mutex);
	if(close(socketID)!=0) perror("Failed to close");
	pthread_exit(0);
}

'''
Processing.jsでドメイン外の画像をPImageとして扱う

最近投稿してないので、忘れないようにjsdo.itのものを挙げてみます。

Processing.jsで画像を扱えるのですが、クロスドメインの制限もありますが、
コメント形式でプリロードの指定が必要？であったり、動的に扱うことをあまり
考えられていないようで、自力でやってみました。

[Jsdo.itの動作例はこちら](http://jsdo.it/kjunichi/cGJT "PImageを動的に生成するテストその1")

# 自ドメイン外の任意のURLの画像を取得するには
ドメイン外の画像ファイルをDataURL形式でもらうJSONPを利用します。
そのため、Processing.js側のプログラム中からJavaScriptの関数を
呼び出します。

# いったんCanvasに描画して、イメージデータを取得
JSONPで取得たDataURL形式のイメージをCanvasに描画します。
その後、Context#getImageDataで、画像データを取得します。

# Processing.js側での処理
Processing側のメソッド？の引数に取得した画像データを指定して呼び出し、
Processing側のコード内で、頑張ってPImageのpixelsを構成します。

``` sample.js
// Processing.jsから呼ばれる関数
function getCsImage(url) {
    var s = document.createElement('script');
    s.charset = 'utf-8';
    s.type = "text/javascript";
    url.match(/http:\/\/(.*?)\/([\s\S]*)/i);
    var host = RegExp.$1;
    var path = RegExp.$2;
    s.src = "http://kjunurl.appspot.com/imgview?callback=myHandler&host="
	+host+"&path=/"+escape(path);
    document.body.appendChild(s);
}

function myHandler(response) {
    var cs = document.createElement('canvas');
    cs.width = 64;
    cs.height = 64;
    var ctx = cs.getContext('2d');
    var img = new Image();
    img.src = response.image;
    img.onload = function() {
        ctx.drawImage(img, 0, 0, img.width, img.height, 0, 0, cs.width, cs.height);
        var imgData = ctx.getImageData(0,0,64,64);
        var processingInstance = Processing.getInstanceById('processing-canvas');
        
        processingInstance.psCbGetCsImage(imgData);
    };
}
```

``` sample.html
<meta name = "viewport" content = "width=device-width">
<script src="http://jsrun.it/lib/Processing.js-1.4.0/js"></script>
<script type="application/processing" target="processing-canvas">
    void setup(){
        size(document.documentElement.clientWidth*0.9, document.documentElement.clientHeight*0.9);
        getCsImage("http://jsdo-it-static-contents.s3.amazonaws.com/images/icon/a/1/b/7/a1b7607006af8a32668e3de4e0627e644e4a1002_100.jpg");
    }
    
    void psCbGetCsImage(imgData) {
        PImage pimg = createImage(64,64,RGB);
        //console.log(imgData.data.length);
        int pcount = 0;
        for(int i = 0; i < imgData.data.length; i++) {
            pimg.pixels[pcount++] = color(imgData.data[i],imgData.data[i+1],imgData.data[i+2]);
            i = i+3;
            
        }
        // ここまででpimgにPImage型で画像データが格納されます。
        image(pimg,pimg.width,pimg.height);

        // 以降はProcessing.jsのフィルタ処理
        pimg.filter(BLUR,.9);
        pimg.filter(BLUR,.9);
        pimg.filter(POSTERIZE,3);
    	image(pimg,0,0);
    }
    
void draw(){
    //fill((int)(random(256)));    
}
</script>
<canvas id='processing-canvas'></canvas>
<canvas id="test"></canvas>
```

# この記事が役にたったら、このブログ記事もお勧めです！
- [Processing.jsでCaptureを使えるようにしてみた](https://abrakatabura.hatenablog.com/entry/2013/01/14/145925)
rbenvで1.8.7系を入れるときにBUILD FAILEDする問題の解決方法

##結論
オプション指定して実行しよう。

```
%CONFIGURE_OPTS="--with-readline-dir=/usr/local" rbenv install 1.8.7-p358
```
##参考
http://nabetama.com/blog/?p=967
scss-mode.elを使う


compassを使ってsass(scss)を書くようことにしたので設定

scss-mode.elを取得
https://github.com/antonj/scss-mode

emacs-lispファイル用のパスの通ったところに置く

下記を.emacsに加える

```emacs-lisp:.emacs
;; パスを指定
(add-to-list 'load-path "~/.emacs.d/vendor")

(require 'scss-mode)
(add-to-list 'auto-mode-alist '("\\.scss$" . scss-mode))

;; インデント幅を2にする
;; コンパイルは compass watchで行うので自動コンパイルをオフ
(defun scss-custom ()
  "scss-mode-hook"
  (and
   (set (make-local-variable 'css-indent-offset) 2)
   (set (make-local-variable 'scss-compile-at-save) nil)
   )
  )
(add-hook 'scss-mode-hook
  '(lambda() (scss-custom)))
```

そのうちscss-modeを改造して保存時に`compass watch`が走るcompass-modeを作りたい
ローカルでredis.ioを起動

=====================

[redis.io](http://redis.io/)のドキュメントをじっくり読みたい場合はローカル環境で起動します。
（WebフレームワークにCubaが利用されています。）

## インストール

rvmのインストールは別を参照してください。

```bash
$ rvm use 1.9.2
$ rvm gemset create redis-io
$ git clone https://github.com/antirez/redis-io.git
$ cd redis-io/
$ gem install dep
$ dep install
$ rake update
$ REDIS_DOC=./redis-doc rackup
```

## ブラウザで確認

```bash
$ open http://localhost:9292
```

---

redisのサーバーもローカルなので`redis-cli`で`MONITOR`と入力しておくと、redis.ioのExamplesのコマンドがトレースできます。
ローカルでdeveloper.github.comを起動

=================================

[developer.github.com](http://developer.github.com/)のAPIドキュメントをじっくり読みたい場合はローカル環境で起動します。
（ドキュメントの生成にはnanocが利用されています。）

## インストール

rvmのインストールは別を参照してください。

```bash
$ rvm use 1.9.3
$ git clone https://github.com/github/developer.github.com.git
$ cd developer.github.com/
$ bundle install --path vendor/bundle
$ bundle exec nanoc compile
$ bundle exec nanoc view
```

## ブラウザで確認

```bash
$ open http://localhost:3000
```

---

ローカルなのでサクサクとドキュメントが読めます。
UkigumoでゆるふわCI始めた

[サーバの動かし方](http://hirobanex.net/article/2011/10/1319278337)も[クライアントの書き方](http://blog.64p.org/entry/20110909/1315566798)も既出なので特にコメントはないヨ。

概要を説明すれば、クライアントでテスト回して、サーバへ結果を投げるとテスト結果を保存して見やすくしてくれる、と。[Ukigumo::Server](https://github.com/ukigumo/Ukigumo-Server)はテストの実行については何もお手伝いしてくれない。その辺のサポートが必要なら、(使ってないから予想だけど)[Ukigumo::Client](http://search.cpan.org/~tokuhirom/Ukigumo-Client-0.12/)を使えばテストの実行部分を楽に書けるんじゃないかなーと思った。

今回はUkigumo::Client使わなかったので、テストの実行は自前のスクリプトでprove呼んで結果をパース、定期実行はcronに任せる形にした。じゃあ何がよくなったのかと言えば、今まで結果をメールで投げてた部分をUkigumo::Serverに投げるように変えたことで、**結果の収集と閲覧がしやすくなった**ということに尽きる。
特定のプロセスでパケットの受信はするが送信はブロックする方法

`iptables` にプロセス ID を指定してパケットを破棄させます。

```sh
iptables -A OUTPUT -p tcp -m owner --pid-owner PROCESS_ID -j DROP
```

PROCESS_ID には `pgrep hoge` とかで取得したプロセス ID を指定。
オフラインリアルタイムどう書く＃３の参考問題 C99 で

オフラインでリアルタイムに「どう書く」をやるイベント。
http://atnd.org/events/31590
の参考問題
http://qiita.com/items/ebd8a56b41711ba459f9
を、今度は C言語で解いてみた。
C99。

```c:baseball.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct test_data
{
  char const * input;
  char const * expected;
} test_data;

#define ENDOF(x) ((x)+sizeof(x)/sizeof(*(x)))

char const *
solv( char const * input )
{
  char * result = calloc(1, strlen( input ) * 4 );
  char * dest = result;
  char c[4]={ '0', '0', '0', 0 };
  for( char const * it = input ; *it ; ++it ){
    switch( *it ){
      case 'f': if ('2'<=c[1] ){  break;  }
        /* FALLTHRU */
      case 's': ++c[1]; break;
      case 'b': ++c[2]; break;
      case 'p': ++c[0];
        /* FALLTHRU */
      case 'h': c[1]=c[2]='0'; break;
    }
    if ( '3'<c[2] ){
      c[1]=c[2]='0';
    }
    if ( '2'<c[1] ){
      c[0]++;
      c[1]='0';
    }
    if ( '2'<c[0] ){
      memset( c, '0', 3 );
    }
    if ( it != input ){
      *(dest++) = ',';
    }
    strcat( dest, c );
    dest += 3;
  }
  *dest=0;
  return result;
}

int main()
{
  test_data t[] = {
    {"s", "010"},
    /* 略 */
    {"ssffpffssp", "010,020,020,020,100,110,120,200,210,000"},
  };
  for( test_data * it = t ; it != ENDOF(t) ; ++it ){
    char const * actual = solv( it->input );
    if ( 0 == strcmp( actual, it->expected ) ){
      printf( "%s -> %s\n", it->input, actual );
    } else {
      printf( "%s -> %s ( expected : %s)\n", it->input, actual, it->expected );
    }
    free( actual );
  }
}
```

だらだら長い関数を書いてしまった。
C言語らしさを適当にはき違えて、case ラベルの fall through を活用してみた。

それと、文字コードの順序を生かし、全部文字で回した。
オフラインリアルタイムどう書く第三回の参考問題解答(Lua)

オフラインリアルタイムどう書く第三回の参考問題
http://qiita.com/items/ebd8a56b41711ba459f9

…のgroovyでの回答例
https://gist.github.com/3381668

…をLuaに翻訳してみました。

```lua:
Baseball = 
{
    s = function(self)
        self.strike = self.strike + 1
        if 2 < self.strike then
            self.strike = 0
            self:o()
        end
    end,

    b = function(self)
        self.ball = self.ball + 1
        if 3 < self.ball then
            self:h()
        end
    end,

    o = function(self)
        self.out = self.out + 1
        if 2 < self.out then
            self.strike = 0
            self.ball   = 0
            self.out    = 0
        end
    end,

    f = function(self)
        if self.strike < 2 then
            self:s()
        end
    end,

    h = function(self)
        self.strike = 0
        self.ball   = 0
    end,

    p = function(self)
        self:h()
        self:o()
    end,

    resolve = function(self, it)
        self.strike = 0
        self.ball   = 0
        self.out    = 0
        local result = ""
        for i = 1, #it do
            self[it:sub(i, i)](self)
            result = result .. "," .. self.out .. self.strike .. self.ball
        end
        return result:sub(2)
    end
}

test =
{
    ["sss"] = "010,020,100",
    ["bbbb"] = "001,002,003,000",
    ["ssbbbb"] = "010,020,021,022,023,000",
    ["hsbhfhbh"] = "000,010,011,000,010,000,001,000",
    ["psbpfpbp"] = "100,110,111,200,210,000,001,100",
    ["ppp"] = "100,200,000",
    ["ffffs"] = "010,020,020,020,100",
    ["ssspfffs"] = "010,020,100,200,210,220,220,000",
    ["bbbsfbppp"] = "001,002,003,013,023,000,100,200,000",
    ["sssbbbbsbhsbppp"] = "010,020,100,101,102,103,100,110,111,100,110,111,200,000,100",
    ["ssffpffssp"] = "010,020,020,020,100,110,120,200,210,000"
}

for k, v in pairs(test) do
  local r = Baseball:resolve(k)
  print("source   = " .. k)
  print("expected = " .. v)
  print("actual   = " .. r)
  print(r == v)
  print()
end
```
Adobe Edge preview 7 メモ


API DocumentとかEdgeを起動したときに確認。後で調査する

##Release Date
2012/8/20

##参考
- http://tv.adobe.com/watch/adobe-edge-preview/introducing-edge-animate-preview-7/
- http://www.adobe.com/devnet-docs/edge/api/current/EdgeAPI.0.1.7.html

日本語のまとめ
- http://cuaoar.jp/2012/08/adobe-edge-animate-7.html

##Preview 6との差分
- 可変レイアウトできるようになった?
- ステージパネルにルーラーが追加された
- テキストシャドウ/ボックスシャドウが使えるようになった
- 未サポートCSSプロパティの警告とコードのシンタックスエラーの警告表示が出るようになった
- エレメントに対して、class名を追加できるようになった
- モバイル系[resize/orientationChange]/jQueryイベントとonErrorが追加された
- redoが追加された?

###ツールバー
- 楕円ツール追加

###エレメントプロパティ
- CSSプロパティが増えた(テキストのプロパティは特に)

####shadow
テキストシャドウ、ボックスシャドウが追加されている

####アクセシビリティ
キーボードアクセスを設定できるようになった

####位置とサイズ
- ステージの幅を%指定にすると可変レイアウト確認用のヘッドが出現してそれを左右に動かすことで、幅を上下させた場合の各エレメントの位置をステージパネル上で確認することができる
- 基準位置を変更できるようになった
	- Stage基準/親DIVからの相対位置 + 左上/左下/右上/右下
- 可変レイアウトできるようになった?
	- min-width, max-widthを指定できるようになった
	- px指定だけではなく、%指定も可能になった
- レイアウトプリセットでエレメントの配置/サイズを様々なタイプに変更できる
- ___要検証___ Preview 6.1で作成したコンポジションのエレメント位置がずれてるのはなんでだろ?

####class
エレメント、シンボルにclassを設定できるようになった
静的HTMLとしてpublishしてみたら、確かにエレメントにclassが追加されていた。

___要検証___ 
同じclassのエレメントをまとめて操作、もしくは自前で書いたCSSを適用するときに、今までcreatationComplete/compostionReadyのイベントハンドラで、addClass()していたようなことをしなくてよくなる?

###ステージパネル
####ルーラー表示
####警告メッセージ表示
- あるプロパティを追加したときに、ステージパネルの右下に特定のブラウザで使用できない旨の警告がでるようになった
	- 例: _テキストシャドウはIE9ではサポートされていません_
- コードのシンタックスエラーの警告も出る

###タイムラインエディタ
- fpsでグリッド表示できるようになった
- ___要検証___ Playheadのキーフレーム間移動操作って前からできてたっけ?

###コードウインドウ
- コードのシンタックスエラーもチェックしてくれるようになった
	- コードウインドウの下に表示
	- ステージパネルの右下にも表示される(未サポートCSSプロパティの警告と一緒の場所)
- 日本語うてるようになった!!
- コードハイライトのカラーが変わった
- フルコードボタンをクリックすると、xxx_edgeActions.jsの全体コードが確認できるようになった(前はアクション関数部分のみだけだった)

## Edge API
###Events
####Page-level DOM Events
モバイル関連のイベントが追加された
#####resize
#####orientationChange

####Compostion-level DOM Events
エラーハンドリングのためのイベント追加
#####onError
- `e.compId`でどのCompositionで発生したエラーが区別できる
- `e.originalEvent`で取得?(jQueryでバインドしたモバイル系のイベントと一緒?)

####jQueryEvents
- mouseenter
- mouseleave
- focus

jQueryイベントが使えるようになった。
下記のマウスイベントにおいて、他エレメントの同一イベントを拾わない様にする
`mouseover` -> `mouseenter`
`mouseout` -> `mouseleave`
原因不明のImageIO　png_malloc　メモリリーク

ただUIImageをimageWithContentsOfFileで読んで、UIImageViewにぶちこんだだけなのに、Instrumentsに注意されている。「リークしてるぞゴルァ！」と。
どうも１枚ロードするごとに、
Malloc 7.00 KB  imageIO png_malloc
と出てくる。

調べてみるとどうやら特定pngファイルの時だけ発生するようだ。リークが起きるpngをツールで出力しなおすとどうやら大丈夫なようだ。
おそらくリークは内部フレームワークのもので、意図しないデータやヘッダ等のせいでpngのロード時に解放漏れがあったのだろう。
リソースを疑ってみるのも必要なのだと痛感いたしました。
SQLAlchemy ORM でクエリ生成の高速化

次のようなテーブルがあったとします。

```python
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base

base = declarative_base()

class Xyz(base):
    __tablename__ = 'xyz'
    id = sa.Column(sa.INTEGER, primary_key=True)
    c1 = sa.Column(sa.INTEGER)
    c2 = sa.Column(sa.INTEGER)
    c3 = sa.Column(sa.INTEGER)
    c4 = sa.Column(sa.INTEGER)
    c5 = sa.Column(sa.INTEGER)
    c6 = sa.Column(sa.INTEGER)
    c7 = sa.Column(sa.INTEGER)
    c8 = sa.Column(sa.INTEGER)
    c9 = sa.Column(sa.INTEGER)

	@classmethod
	def from_c3(cls, n):
		return session.query(cls).filter_by(c3=n).one()
```

この ``from_c3()`` が時間がかかっている場合、ORMがSQLを生成するのにかかっている時間は次のようにして調べられます。

```python
from sqlalchemy.orm import Query
from timeit import timeit

f1 = lambda: str(Query(Xyz).filter_by(c3=123))
print f1()
print timeit(f1, number=10000)

'''結果
SELECT xyz.id AS xyz_id, xyz.c1 AS xyz_c1, xyz.c2 AS xyz_c2, xyz.c3 AS xyz_c3, xyz.c4 AS xyz_c4, xyz.c5 AS xyz_c5, xyz.c6 AS xyz_c6, xyz.c7 AS xyz_c7, xyz.c8 AS xyz_c8, xyz.c9 AS xyz_c9 
FROM xyz 
WHERE xyz.c3 = :c3_1
4.91327404976
'''
```

これに時間がかかっている場合は、生成したSQLをキャッシュすることでクエリを高速化することができます。

```python
compiled = str(Query(Xyz).filter_by(c3=sa.bindparam('c3')))
f2 = lambda: str(Query(Xyz).from_statement(compiled).params(c3=123))
print f2()
print timeit(f2, number=10000)

'''結果
SELECT xyz.id AS xyz_id, xyz.c1 AS xyz_c1, xyz.c2 AS xyz_c2, xyz.c3 AS xyz_c3, xyz.c4 AS xyz_c4, xyz.c5 AS xyz_c5, xyz.c6 AS xyz_c6, xyz.c7 AS xyz_c7, xyz.c8 AS xyz_c8, xyz.c9 AS xyz_c9 
FROM xyz 
WHERE xyz.c3 = :c3
1.09750509262
'''
```

このSQL生成時間はスキーマの複雑さに依存するので、もっとカラム数が多いテーブルではもっと時間を節約できます。

## 追記
`filter_by(c3=sa.bindparam('c3')` よりも `filter('c3=:c3')` の方がお手軽ですね。
document.implementation & Range


document.implementation と document.createRange、
range.selectNodeContentsなどを組み合わせて
テキストからDOMを抽出する方法。


```javascript
var xhr = new XMLHttpRequest();
xhr.open('GET', 'test.html');
xhr.onreadystatechange = function () {
    if (xhr.readyState === 4) {
        hoge(xhr.responseText);
    }
};
xhr.send(null);

function hoge(txt) {
    var doc = document.implementation.createHTMLDocument('');
    var range = doc.createRange();

    range.selectNodeContents(doc.documentElement);
    range.deleteContents();
    doc.documentElement.appendChild(range.createContextualFragment(txt));

    range.selectNodeContents(doc.documentElement);
    var cont = range.extractContents();
    console.log(cont);
    document.body.appendChild(cont);
}
}());
```
HTML5, JavascriptでGame開発の参考になるのを挙げてく自分メモ


##Engine/Framework

- [enchant.js](http://enchantjs.com/ja/?s=ja)
- [LimeJS](http://www.limejs.com/)


##参考サイト

- [HTML5 Game Development](http://www.html5gamedevelopment.org/)


##Development
###Game Loop/Main Loop(javascript)
mainloop, runloop, eventloopとかってやつ

- [JavaScript でゲームループを作る (The Game Loop)](http://t100life.blog121.fc2.com/blog-entry-209.html)
- [Javascript Game Development - The Game Loop](http://nokarma.org/2011/02/02/javascript-game-development-the-game-loop/index.html)
- [JavaScriptでゲームループ](http://qiita.com/items/845e3f0c89acccdd312a)
- [Building a Game Mainloop in JavaScript](http://www.playmycode.com/blog/2011/08/building-a-game-mainloop-in-javascript/)
- [JavaScript : HTML5でのゲームループ実装](http://blog.livedoor.jp/aki_mana/archives/4186025.html)
Rails3でログの色分けを止める

Jenkinsや本番環境などで、ログに含まれるエスケープシーケンスが不要な場合には、以下のように設定することで色分けを止めることができる。

特定の環境のみ止めるのであれば、 config/environments/(環境名).rb に以下のように設定する。
> ExampleApp::Application.configure do
>   # その他の設定
> 
>   config.colorize_logging = false
> end

もしくは全ての環境のデフォルトを変えるには、config/application.rb で設定する。
> module ExampleApp
>   class Application < Rails::Application
>     # その他の設定
> 
>     config.colorize_logging = false
>   end
> end

これを組み合わせることで、例えば、config/environments/development.rb で config.colorize_logging = true と設定することで、開発環境でのみ色分けを有効にすることができる。

なお、Rails3から設定方法が変更になった。
[Ruby on Rails 3.0 Release Notes](http://guides.rubyonrails.org/3_0_release_notes.html)
> ActiveRecord::Base.colorize_logging and config.active_record.colorize_logging are deprecated in favor of Rails::LogSubscriber.colorize_logging or config.colorize_logging
Rails3のルーティングメモ

Rails2とルーティングの仕方が変わっているようなのでメモ。

## 1. public/index.htmlを消しておく
```
mv ./app/public/index.html ./app/public/index.html.backup
```

## 2.ルーティングの設定
./config/routes.rbを編集する。
上に書くほど優先順位が高くなる。

### ルートコントローラの設定
以下のように設定すると、labelsコントローラのnewアクション画面がデフォルトページとなる。

```ruby:config/routes.rb
root :to => 'labels#index'
```

### Scaffoldを利用した場合
resourcesが追記される。
Rails2のmap.resourcesであり、自動でCRUDに沿ったルーティングルールを作成してくれるので便利。
これの下にmatchルールを書いても、こちらが優先されるので注意。

```ruby:config/routes.rb
resources :labels
```


## matchを使った設定
matchルールで様々なパターンのルーティングができる。
例えば以下のように書くと、http://〜/feedbackというURLでは、feedbacksコントローラのnewアクションを表示する。
それ以外はpagesコントローラを参照する。

```ruby:config/routes.rb
match "feedback" => 'feedbacks#new'
match "pages(/:action)" => 'pages#:action'
match "(:action)" => 'pages#:action'
```
Could not find a JavaScript runtime


Rails3にて、以下のエラーが出た場合、JavaScript Runtimeをインストールする必要がある。

>Could not find a JavaScript runtime

方法としては、Node.jsをインストールするか、Gemfileでtherubyracerのインストールを有効にするのが楽と思う。

## Node.jsを利用する場合
[Node.js公式サイト](http://nodejs.jp)

```
cd
wget http://nodejs.org/dist/v0.8.7/node-v0.8.7.tar.gz
tar zxvf node-v0.8.7.tar.gz
cd node-v0.8.7
./configure
make
sudo make install
make clean
```

## therubyracerを利用する場合
Rails3プロジェクトにあるGemfileに、以下のような記述があるので、コメントアウトを外す。

>   # See https://github.com/sstephenson/execjs#readme for more supported runtimes
 # gem 'therubyracer', :platforms => :ruby

↓

>   # See https://github.com/sstephenson/execjs#readme for more supported runtimes
 gem 'therubyracer', :platforms => :ruby
heroku で利用中の DB データサイズ


を取得する方法が知りたいのだけれど、`heroku info` コマンドでは欲しい値が得られない。heroku が提供するデータベースの無料領域は &lt;del&gt; 5MB というあまりにも貧弱な容量なので、このままでは安心して遊べない。&lt;/del&gt; 現在の PostgreSQL : Dev Plan では "10,000 row limit" とのこと。

そこで見つけたエントリ [herokuでのWebアプリ開発と運用（その4：データサイズ肥大化の対処）](http://blog.livedoor.jp/hide212131/archives/1770653.html)

`heroku run console` 後に下記を実行して ( 実際には一行 )

```ruby
ActiveRecord::Base.connection.select_all(
  "SELECT relname, relkind, to_char(reltuples, '999,999,999') as rows,
   to_char(pg_relation_size(relname), '999,999,999,999')
   as bytes FROM pg_class 
   WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname='public');"
).each{|i|
  puts "#{i['relname'].ljust(30)}#{i['bytes'].rjust(15)}bytes#{i['rows'].rjust(10)}rows"
}
```

試してみるものの

```
PG::Error: ERROR:  function pg_relation_size(name) does not exist
LINE 1: ...o_char(reltuples, '999,999,999') as rows, to_char(pg_relatio...                                                             ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
```

叱られる。
どうやら PostgreSQL ではバージョンによってキャストまわりの仕様が異なるらしい。
[8.3 以降では明示的なキャストが必要](http://www.sraoss.co.jp/technology/postgresql/8.3/) とのこと。

ということで先ほどの `relname` という引数は `relname::text` に変えてやれば大丈夫。

```ruby
ActiveRecord::Base.connection.select_all(
  "SELECT relname, relkind, to_char(reltuples, '999,999,999') as rows,
   to_char(pg_relation_size(relname::text), '999,999,999,999')
   as bytes FROM pg_class 
   WHERE relnamespace = (SELECT oid FROM pg_namespace WHERE nspname='public');"
).each{|i|
  puts "#{i['relname'].ljust(30)}#{i['bytes'].rjust(15)}bytes#{i['rows'].rjust(10)}rows"
}
```

これで無事に必要な値が得られた。

```
schema_migrations          8,192bytes           0rows
unique_schema_migrations   16,384bytes          0rows
hoges_id_seq               8,192bytes           1rows
hoges                      8,192bytes           2rows
hoges_pkey                 16,384bytes          2rows
```

めでたし。
ActiveAdmin で /admin/login に before_filter をかける

ActiveAdmin の初期化ファイルでは `config.before_filter` で before_filter をセットできる。

```ruby:config/initializers/active_admin.rb
ActiveAdmin.setup do |config|
  ...
  config.before_filter :some_filter
  ...
end
```

ただしこのフィルタはリソースにしか効かない。つまり `/admin/dogs/index` や `/admin/cats/show` にアクセスしたときはフィルタがかかるが、 `/admin/login` や `/admin/logout`にアクセスしたときはかからない。

`/admin/login` にフィルタをかけるには以下のようにする。

```ruby:config/initializers/active_admin.rb
ActiveAdmin.setup do |config|
  ...
  ActiveAdmin::Devise::SessionsController.before_filter :some_filter
  ...
end
```
オフラインリアルタイムどう書く第三回の参考問題をC#で

[オフラインリアルタイムどう書く第三回の参考問題](http://qiita.com/items/ebd8a56b41711ba459f9)

GenerateメソッドがC#っぽいところかな。

```c#:Program.cs
using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Calculate("s"));
        Console.WriteLine(Calculate("sss"));
        Console.WriteLine(Calculate("bbbb"));
        Console.WriteLine(Calculate("ssbbbb"));
        Console.WriteLine(Calculate("hsbhfhbh"));
        Console.WriteLine(Calculate("psbpfpbp"));
        Console.WriteLine(Calculate("ppp"));
        Console.WriteLine(Calculate("ffffs"));
        Console.WriteLine(Calculate("ssspfffs"));
        Console.WriteLine(Calculate("bbbsfbppp"));
        Console.WriteLine(Calculate("sssbbbbsbhsbppp"));
        Console.WriteLine(Calculate("ssffpffssp"));
    }

    static string Calculate(string input)
    {
        return string.Join(",", Count.Generate(input));
    }
}

struct Count
{
    public int Outs;
    public int Strikes;
    public int Balls;

    public void Take(char action)
    {
        switch (action)
        {
            case 's':
                this.IncreaseStrikes();
                break;
            case 'f':
                if (this.Strikes < 2) this.IncreaseStrikes();
                break;
            case 'b':
                this.IncreaseBalls();
                break;
            case 'h':
                this.Advance();
                break;
            case 'p':
                this.IncreaseOuts();
                break;
            default:
                break;
        }
    }

    private void IncreaseStrikes()
    {
        this.Strikes++;
        if (this.Strikes == 3) this.IncreaseOuts();
    }

    private void IncreaseOuts()
    {
        this.Strikes = 0;
        this.Balls = 0;
        this.Outs++;
        if (this.Outs == 3) this.Outs = 0;
    }

    private void IncreaseBalls()
    {
        this.Balls++;
        if (this.Balls == 4) this.Advance();
    }

    private void Advance()
    {
        this.Strikes = 0;
        this.Balls = 0;
    }

    public override string ToString()
    {
        return string.Concat(this.Outs, this.Strikes, this.Balls);
    }

    public static IEnumerable<Count> Generate(string input)
    {
        var current = new Count();
        foreach (var action in input)
        {
            current.Take(action);
            yield return current;
        }
    }
}
```
OmniAuthにnamed routesを設定する

RailsでOmniAuthを導入すると自動的に`GET /auth/:provider`がマウントされるけども、これにはルーティング名が設定されていないので`redirect_to hoge_url`みたいなことができない。

[Creating authentication named routes](https://github.com/intridea/omniauth/issues/484)によると、次のように`config/routes.rb`にすれば名前を設定できる。

```ruby
match '/auth/:provider', to: lambda{|env| [404, {}, ["Not Found"]]}, as: 'auth'
```

こうすることで`auth_url(provider: "twitter")`というような使い方ができるようになる。

ちなみにOmniAuthとRails間のリクエストの流れは、Railsのルーティングにマッチしなければ（404ならば）OmniAuthにお任せするというものになっている。これはRackミドルウェア間の流れそのもの（だと思う）。

それを利用して、上記コードでは意図的に404を返すルーティングを作り、そこに名前を設定している。
8/20 RESTful勉強会 の議論ネタと予習


# t_wada さんの議論のポイント

http://www.slideshare.net/t_wada/restful-web-design-review より。

* やりたいこと vs. (Rails的な)作りやすさ

* 確認画面、プレビュー画面、完了画面…

* リソースの移動、コピー

* トランザクションの表現

* 複数レコードを選択して更新する UI
 - 207 Multi-Status の誘惑

* URLに機械採番の id が含まれる
 - セキュアじゃ無い
 - 永続的でない（かも）

* APIのバージョニング
 - 自前でやっていた
 - https://github.com/bploetz/versionist 良さそう

* rails4 の PATCH メソッドどうよ？

* あまり非同期処理に頼らない
 - DOM Scripting の原則に従う

* RESTfulなサーバとリッチjsという設計に倒しすぎるとUXや保守性が低下する可能性があるので注意
 - REST厨がみんな通る道
 - 一方Twitterはリッチjsから戻した

* 制約をバランスすることこそが設計


# みんなの routes.rb
* https://gist.github.com/3109082
routes for current_user (ppworks)

* https://gist.github.com/3116400 routes for users (ppworks)

* https://gist.github.com/3127838 基本的なルーティング設定 (shu_0115)
    基本的なルーティング設定。
    omniauth用のルーティングとroot以外は全て「match ':controller(/:action(/:id))(.:format)'」で受け取る。
    RESTは不採用。

* https://gist.github.com/3182589 URLパラメータを使ったルーティング (kozo002)

* https://gist.github.com/3162077 http://proofoflife.me のroutes.rb (takuyan)

* https://gist.github.com/3224707 confirmationを使う場合にRESTfulっぽくなるようにしてみた (kozo002)


# みんなの質問

## 確認画面、完了画面、ステップ（ウィザード）型入力フォーム

* https://gist.github.com/3159770 (deeeki)

* (fukajun)

### confirm, finish(complete) アクションを追加すべきか？
アクションは場合によって追加してもよいが、URLに出してはダメ。なぜなら、GETする意味のないリソースだから。
（他サーバからのリダイレクトで、トークン付きGETならギリギリセーフ。その場合名詞形confirmationを使う）

validationを利用する方法 http://beyond.cocolog-nifty.com/akutoku/2011/05/rails-a0d6.html
<del>今気づいたけど、Railsでバリデーションエラーになったときのステータスコードがおかしい？ 200 OK を返してしまっている。400 Bad Request を返すべきでは？</del>
ちゃんと422が返ってました。

### ウィザード型

アトミック性がほしいのかどうか？アトミックならトランザクションリソース。いらないなら普通のリソースにPUT連続でいい。

* トランザクションリソースを使う
    実際のデータはセッション or DB。DBの場合定期的に削除

データがどこに保存されるかは実装の都合の話で、あまりリソース設計の話じゃない感じも。リソース設計としては同じでは。
複数作れる場合、POST→PUT→PUT→…
1つしか作れない場合、 PUT→PUT→PUT→…

## マイページ

* https://gist.github.com/3159770 (deeeki)

* (ppworks)

もしつくるなら、「自分自身」に紐付くものだけ、URL名前空間を分けるのがよい。（Private Namespace パターン）


## RESTfulにする事によってユーザにはどんなメリットがあるのか (shu_0115)

* https://gist.github.com/3162352

* 『routes.rbの「match ':controller(/:action(/:id))(.:format)'」はなぜ使わない方が良いのでしょうか？』 http://qa.atmarkit.co.jp/q/2331


### Cool URI（URLを変えるべきではない）の観点と、実装依存の観点

Webを支える技術 p.55

> ### メソッド名やセッションIDを含めない
> 
> `http://example.jp/Login.do?action=showPage`
> 
> もっと問題なのはshowPageというメソッド名がURIに入っていることです。なぜこれが問題かと言うと、たとえ同じStrutsフレームワークを使っていても、システムをリファクタリングしてメソッド名を変更したとたんにURIが変更になってしまうからです。

### DRYの観点

http://web.archive.org/web/20081020154812/http://techno.hippy.jp/rorwiki/?RubyKaigi2006

> `GET /people/show/1`
> 
> こんな風に呼ぶのは無駄、 **DRY** じゃない。 だって、GETってことは、つまりshowしたいんだから
> 
> `GET /people/1`
> 
> こうできないと駄目だ。

### Railsのurl_for, form_forなどの利便性の観点

RESTfulが前提でできてる。


結局、URLの重要度をどれくらい評価するか、かなぁ。


# その他ネタ

## routes.rbの簡単なチェックポイント

* resources (resource) を使っているか* get ’名詞(形容詞)’ はOKだけど動詞はダメ* post, put, delete はあやしい
 - GETできないURLは不自然だから* match は問題外
 - あらゆるメソッド通しちゃう

## shuffleのはなし
エクセル形式の日本語CSVをどうにかする


fgetcsv()だと色々問題が起きたり起きなかったりです。
なので、こちらに書いてあるスクリプトを利用させていただくことが多いです。
http://yossy.iimp.jp/wp/?p=56

なくなると困るのでここにも転載しておきます。

```fgetcsv_reg.php
<?php
    /**
     * ファイルポインタから行を取得し、CSVフィールドを処理する
     * @param resource handle
     * @param int length
     * @param string delimiter
     * @param string enclosure
     * @return ファイルの終端に達した場合を含み、エラー時にFALSEを返します。
     */
    function fgetcsv_reg (&$handle, $length = null, $d = ',', $e = '"') {
        $eof = false;
        $d = preg_quote($d);
        $e = preg_quote($e);
        $_line = "";
        while (($eof != true)and(!feof($handle))) {
            $_line .= (empty($length) ? fgets($handle) : fgets($handle, $length));
            $itemcnt = preg_match_all('/'.$e.'/', $_line, $dummy);
            if ($itemcnt % 2 == 0) $eof = true;
        }
        $_csv_line = preg_replace('/(?:\\r\\n|[\\r\\n])?$/', $d, trim($_line));
        $_csv_pattern = '/('.$e.'[^'.$e.']*(?:'.$e.$e.'[^'.$e.']*)*'.$e.'|[^'.$d.']*)'.$d.'/';
        preg_match_all($_csv_pattern, $_csv_line, $_csv_matches);
        $_csv_data = $_csv_matches[1];
        for($_csv_i=0;$_csv_i<count($_csv_data);$_csv_i++){
            $_csv_data[$_csv_i]=preg_replace('/^'.$e.'(.*)'.$e.'$/s','$1',$_csv_data[$_csv_i]);
            $_csv_data[$_csv_i]=str_replace($e.$e, $e, $_csv_data[$_csv_i]);
        }
        return empty($_line) ? false : $_csv_data;
    }
?>
```
Sublime Text で Slideshow

=========================

Qiitaのkobitoもそうですが、Markdown記法がとても便利で普段のドキュメントもMarkdown記法で作成することが多いです。

作成したドキュメントでレビューやプレゼンテーションをすることがありますが、PowerPointやKeynoteにわざわざ作り直すのが手間です。

MarkdownはHTMLに変換できるのでWebブラウザのスライドテンプレートと組み合わせてSublime TextのPluginの[Markdown Slideshow](http://ogom.github.com/sublimetext-markdown-slideshow/)を作りました。

**スライドテンプレートには[Google I/O 2012](http://code.google.com/p/io-2012-slides/)と[Google I/O 2011](http://code.google.com/p/html5slides/)が使えます。**


## 使い方

Package ControlでPluginをインストールして、Key Bindingsを設定します。

スライドテンプレートはカスタマイズしないとまんま`Google I/O`になるので用途に応じてテンプレートをカスタマイズして利用して下さい。

### 設定

`Key Bindings`のサンプルです。
`Browse Packages`で`Markdown Slideshow`のthemesを任意のディレクトリにコピーします。
（サンプルではthemesを/opt/mcider/themesにコピーしています。）

```json:Default.sublime-keymap
[
  {
    "keys": ["alt+s"],
    "command": "markdown_slideshow",
    "args":
    {
      "themes": "/opt/mcider/themes",
      "theme": "io2011",
      "extensions": ["tables"],
      "browser": true,
      "clean": false,
      "output_file": "/opt/mcider/tmp/slide.html"
    }
  }
]
```


**Sublime TextはPythonでPluginが書けるので、便利な機能をどんどん追加できます。**
mavenでプロジェクトのバージョンを表示する

mavenを使用しているプロジェクトで、そのプロジェクト自体のバージョンを取得したいことがあります。
pom.xmlの中から抜き出しても良いのですが、ここではmavenを使って表示するやり方の紹介です。

## やり方

```bash
$ mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate \
  -Dexpression=project.version
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
...
0.0.1
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: < 1 second
[INFO] Finished at: Mon Aug 20 08:51:40 JST 2012
[INFO] Final Memory: 7M/240M
[INFO] ------------------------------------------------------------------------
```

ただ確認するだけであれば、これで良いですがこの値をスクリプト内で使ったりする時は[INFO]の行が邪魔です。

これは`grep -v`で消しちゃいます。

```bash
$ mvn org.apache.maven.plugins:maven-help-plugin:2.1.1:evaluate \
  -Dexpression=project.version | grep -v '^\[INFO\]'
0.0.1
```

これで、扱いやすい形でプロジェクトのバージョン番号を取得することが出来ました。
[INFO]の行の消し方がいまいちなので、もし他に良い方法知っている方いたら教えてください！
iOSシミュレータでスクリーンショットが撮れないバグを回避するには「言語とテキスト」でオランダ語などを選んでみる


iOSシミュレータでスクリーンショットを撮ろうとしてもコンソールにエラーが出るだけというバグは、日時に基づくユニークなファイル名の命名の処理に問題があるようだ。

回避するにはOS Xの「システム環境設定」の「言語とテキスト」で、たとえばオランダ語などを選ぶ。要するに日時を表す文字列に「/」（スラッシュ）を含まない言語を選べば回避できるらしい。

```sh:コンソールに出るエラーの例
21/06/12 21:04:19,789 iPhone Simulator: Failed to write screenshot (The file “2012 21.04.19.png” doesn’t exist.)
```

出典: [Simulator doesn't save screenshots when the user's date format contains path sep](http://openradar.appspot.com/11723743)