OmniAICreator/Qiita-1.07M huggingface dataset:
UIButton NormalとSelectedを交互に切り替えるボタン


一回のタップごとに、選択状態と非選択状態を交互に切り替えるボタンです。

## [追記] サブクラスでやらなくてもよかったんです。恥ずかしい

```objectivec:
- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.button addTarget:self action:@selector(buttonDidPush:) forControlEvents:UIControlEventTouchUpInside];
}

- (void)buttonDidPush:(UIButton*)btn
{
    btn.selected = !btn.selected;
}
```
後はnormal, highlighted, selectedの各画像やタイトルを設定すれば、スイッチ風ボタンの完成です。

コメント欄にて[nisin@githubさん](http://qiita.com/users/nisin@github)にアドバイス頂きました。ありがとうございました！

***

## 実装
UIButtonを継承し、UIButtonのselectedとは別に独自に選択と非選択状態を保持します。
`- touchesBegan:withEvent:`で状態を一時的に変え、UpInsideの場合はその状態を決定させ、UpOutsideやキャンセルの場合は状態を元に戻します。

```objectivec:YSKeepingButton.h
#import <UIKit/UIKit.h>

@interface YSKeepingButton : UIButton

@end
```

```objectivec:YSKeepingButton.m
#import "YSKeepingButton.h"

@interface YSKeepingButton ()

@property (nonatomic) BOOL keepingButtonSelected;

@end

@implementation YSKeepingButton

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    self.selected = !self.keepingButtonSelected;
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Cancel");
    self.selected = self.keepingButtonSelected;
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:self];
    if (CGRectContainsPoint(self.bounds, touchPoint)) {
        // UIControlEventTouchUpInside
        NSLog(@"UpInside");
        self.keepingButtonSelected = !self.keepingButtonSelected;
    } else {
        // UIControlEventTouchUpOutside
        NSLog(@"Cancel UpOutside");
        self.selected = self.keepingButtonSelected;
    }
}

@end
```

あとは、NormalとSelected状態のイメージやタイトルを設定したり、NormalからSelectedに変わる時だけ`- touchesBegan:withEvent:`で状態が変化するようにすれば、簡易的ですが押しボタンスイッチの様に動作するボタンが出来ます。
Quicksort in Rust

**注釈：以下のコードはRust 0.5で書かれたもので、最新のバージョン（1.3）では全くコンパイルできない**

Rustでクイックソート。Genericsを使っていて、配列の要素がOrdトレイトのインスタンスならば何でもソートできる。

```rust:quicksort.rs
use cmp::Ord;

fn partition<T: Ord>(ns: &mut [T], l: uint, r: uint) -> uint {
  let p = &mut ns[l];
  let mut i = l + 1;
  for uint::range(l+1,r) |j| {
    if ns[j] < *p {
      ns[i] <-> ns[j];
      i += 1;
    }
  }
  ns[l] <-> ns[i-1];
  i - 1
}

fn quicksort<T: Ord>(ns: &mut [T], l: uint, r: uint) -> uint {
  if r-l <= 1{
    0
  }else{
    let p = partition(ns,l,r);
    let a = quicksort(ns,l,p);
    let b = quicksort(ns,p+1,r);
    a + b + (r-l-1)
  }
}

fn main(){
  let nums: ~mut [int] = vec::to_mut(~[1,3,2,5,10,4,6,7,8,9]);
  print_vector(nums);
  io::println("");
  quicksort(nums,0,vec::len(nums));
  print_vector(nums);
}

fn print_vector(ns: &[int]) {
  for ns.each |&n| {
    io::print(fmt!("%d ",n));
  }
  io::println("");
}

```

スワップの演算子 <-> は言語のプリミティブとして用意されている。最初コンパイルを通すまで、Mutable/immutableの配列の受け渡しやポインタの種類の不一致でコンパイラに結構怒られ、いろいろいじくって合わせたが結構難しい。Haskeller的メンタリティーから言えば、コンパイルが厳しいということはそれだけ実行時に安全だと期待できる。
coffee-scriptコードリーディングメモ

半分ぐらい読んだ https://github.com/jashkenas/coffee-script
mizchi/coffee-scriptはコメントを日本語訳しつつ注釈つけたもの

$ cake build:jison で grammer.coffeeをjisonでコンパイルしてparser.jsを生成
https://github.com/mizchi/coffee-script/blob/master/src/grammar.coffee

jisonはbisonのJS実装。改良BNF。

以下coffee -c hello.coffeeしたときの挙動

`commands.coffee`
ソース文字列とオプション貰ってコンパイルにかける

`CoffeeScript#compile`
文字列をjsに変換する。具体的には以下の操作を行う

`Lexer#tokenize`
https://github.com/mizchi/coffee-script/blob/master/src/lexer.coffee
ソース文字列からトークン列を生成。
正規表現にかけて、トークンを一個ずつ取り出しながら現在の読み込みモード(forの中か、式か、リテラルか)を変更しつつトークン列にpushする

`Rewriter#rewrite`
https://github.com/mizchi/coffee-script/blob/master/src/rewriter.coffee
トークン列を修正して補完(暗黙の関数適用とか不要な改行の除去とか)
addImplicit~が怖くて全然読めなかった

`Parser#parse`
で加工されたトークン列からJisonParserを通してJS生成
Jisonのドキュメントを読め


全体的にSourcemapサポートがとってつけた感がある。目玉の新規機能だから仕方ないのか…

なお他のCoffeeScript実装ではJisonを使っていない模様
coffeeでのJison実装は正直ださいので、弄りたいなら他の実装読んだほうがいい気がした
Dartで第3回オフラインリアルタイムどう書く

第3回オフラインリアルタイムどう書くの問題をDartで解いてみました。

```dart
import "dart:collection";

main() {
  test("b", "AB");
  test("l", "AD");
  test("r", "AC");
  test("bbb", "ABAB");
  test("rrr", "ACBA");
  test("blll", "ABCAB");
  test("llll", "ADEBA");
  test("rbrl", "ACADE");
  test("brrrr", "ABEDAB");
  test("llrrr", "ADEFDE");
  test("lrlll", "ADFEDF");
  test("lrrrr", "ADFCAD");
  test("rllll", "ACFDAC");
  test("blrrrr", "ABCFEBC");
  test("brllll", "ABEFCBE");
  test("bbrllrrr", "ABACFDEFD");
  test("rrrrblll", "ACBACABCA");
  test("llrlrrbrb", "ADEFCADABA");
  test("rrrbrllrr", "ACBABEFCAD");
  test("llrllblrll", "ADEFCBCADEB");
  test("lrrlllrbrl", "ADFCBEFDFCB");
  test("lllrbrrlbrl", "ADEBCBACFCAB");
  test("rrrrrrlrbrl", "ACBACBADFDEB");
  test("lbrbbrbrbbrr", "ADABABEBCBCFE");
  test("rrrrlbrblllr", "ACBACFCACFDAB");
  test("lbbrblrlrlbll", "ADADFDABCFDFED");
  test("rrbbrlrlrblrl", "ACBCBADFEBEFDA");
  test("blrllblbrrrrll", "ABCFDADEDABEDFE");
  test("blrllrlbllrrbr", "ABCFDABCBEFDEDA");
  test("lbrbbrllllrblrr", "ADABABEFCBEDEBCF");
  test("rrrrbllrlrbrbrr", "ACBACABCFDEDADFC");
  print("ok");
}

test(String input, String expect) {
  var q = new ListQueue.from(input.split(""));
  assert(walk(q, "B", "A") == expect);
}

final graph = {
  "A": "BCD",
  "B": "CAE",
  "C": "ABF",
  "D": "EAF",
  "E": "FBD",
  "F": "CED",
};

String walk(Queue input, String from, String to) {
  if(input.isEmpty) return to;

  String direction = input.removeFirst();
  if(direction == "b") return to.concat(walk(input, to, from));

  String nexts = graph[to].concat(graph[to]);
  int i = nexts.indexOf(from);
  String lr = nexts.slice(i + 1, i + 3);
  return to.concat(walk(input, to, lr[direction == "l" ? 1 : 0]));
}
```
メモリリークチェッカー

c で daemon 動作するサーバを作っていると *malloc*(3) などで動的に確保したメモリの *free*(3) 忘れによる、いわゆるメモリリークを防ぐ事が非常に重要になってきます。
その様なメモリリークを防止するために役立つ様々なツールが世の中には沢山存在していて、それぞれ非常に有用ではあるのですが、いざ利用しようと思うと割と面倒な作業が発生したり、自分の求めている機能に対して明らかにオーバースペックだったりするので、自分の用途に合わせて簡単に使える『俺様ツール』を作ってみました。

動作原理は簡単で *malloc*(3) や *free*(3) したアドレスをログに出力して、後からログを解析してメモリの確保と解放が対になっていない部分を抽出するだけです。

そのためにまずは元となるソースコードを修正して、*malloc*(3) や *free*(3) を独自に作成した wrapper 関数に置換えて確保、解放したメモリのアドレスをログに出力する機能を組込む必要があるのですが、*malloc*(3) や *free*(3) などはエラー処理を共通化するため等の理由であらかじめ wrapper 関数化されている場合が多いと思うので、この部分は出力するログのフォーマットを決めるだけで割りと簡単に追加できると思います。

今回は *syslog*(3) を利用して *malloc*(3)、*strdup*(3)、 *free*(3) で確保/解放するメモリのアドレスを出力しました。

## wrapper の作成

```c:wrapper.c
/*
 * malloc() の wrapper
 */
void    *mymalloc(size_t size)
{

	void    *p;

	if(!(p = malloc(size)))
		/* エラー処理 */
		exit(255);
	syslog(LOG_DEBUG, "malloc %p\n", p);

	return(p);

}

/*
* strdup() の wrapper
*/
char    *mystrdup(const char *s)
{

	char    *p = NULL;

	if(s){
		if((p = strdup(s)))
			syslog(LOG_DEBUG, "strdup %p\n", p);
		else
			/* エラー処理 */
			exit(255);
	}

	return(p);

}

/*
* free() の wrapper
*/
void    myfree(void *p)
{

	if(p){
		free(p);
		syslog(LOG_DEBUG, "free: %p\n", p);
	}

}

```
  
## 検出ツールの作成

次に出力されたログの解析処理ですが、入力行の解析やハッシュテーブルが簡単に利用できる言語として今回は *awk*(1) を利用して実装しました。

```sh:checker.sh
#!/bin/sh
#
# -v: 冗長モード
#

if [ "${1}" = "-v" ]
then
	verbose=true
	shift
fi

awk '
	# syslog の出力は Month Day hh:mm:dd server process[PID]: … 型式と仮定
	# ユーザデータは $6 から始まっている筈なので $6 が関数で $7 がアドレス

	# malloc/strdup されたアドレスをキーとしたハッシュに行番号を格納
	/(malloc|strdup)/{
		alloc[$7] = NR;
	}

	# free されたアドレスをキーとしてハッシュを検索
	# 見付かれば alloc された領域の free なのでハッシュをクリア
	/^free/{
		if(alloc[$7]){
			if("'${verbose:-false}'" == "true")
				printf("% 5d %s: % 5d\n", NR, $7, $alloc[$7]);
				alloc[$7] = 0;
		}
		else
			printf("% 5d %s: unknown free.\n", NR, $7);
	}
	# クリアされていないハッシュ (=開放されていないメモリ) を表示
	END{
		for(i in alloc)
			if(alloc[i])
				printf("% 5d %s: NOT free.\n", alloc[i], i);
	}
' ${1}

```

このスクリプトを実行する事により *malloc*(3) もしくは *strdup*(3) で確保したメモリが解放されていない場合、もしくは確保していないメモリを解放した場合が簡単に発見可能です。
同様に *open*(2) / *fopen*(3) や、*close*(2) / *fclose*(3) などの wrapper 関数を作成すれば FD リークの発見も簡単に可能になります。

これらは自分が必要とする機能のみを簡単に実装したもので、汎用的に使える事を目指したツールではありません。ただ、日頃発生しうる面倒な作業がちょっとの工夫で多少なりとも楽になる一つの例として公開してみました。
Dartで第二回オフラインリアルタイムどう書く

第二回 オフラインリアルタイムどう書くの問題をDartで解いてみました。
問題はこちら http://nabetani.sakura.ne.jp/hena/ord2/

```dart
import "dart:math" show pow, log;

main () {
  test("ff-2f-23-f3-77-7f-3b", "1f-03-00-1c-0d-0f-06");
  test("01", "00");
  test("00", "00");
  test("7a-4e", "0c-02");
  test("56-b6", "08-14");
  test("12-12-12", "00-00-00");
  test("de-ff-7b", "0a-0f-05");
  test("95-be-d0", "05-1e-20");
  test("7c-b0-bb", "1c-20-2b");
  test("7a-b6-31-6a", "3a-56-11-2a");
  test("32-0e-23-82", "18-06-11-40");
  test("ff-7f-bf-df-ef", "0f-07-0b-0d-0e");
  test("75-df-dc-6e-42", "35-5f-5c-2e-02");
  test("62-51-ef-c7-f8", "22-11-6f-47-78");
  test("0c-47-8e-dd-5d-17", "04-23-46-6d-2d-0b");
  test("aa-58-5b-6d-9f-1f", "52-28-2b-35-4f-0f");
  test("ff-55-d5-75-5d-57", "0f-00-08-04-02-01");
  test("fe-fd-fb-f7-ef-df-bf", "7e-7d-7b-77-6f-5f-3f");
  test("fd-fb-f7-ef-df-bf-7f", "7e-7d-7b-77-6f-5f-3f");
  test("d9-15-b5-d7-1b-9f-de", "69-05-55-67-0b-4f-6e");
  test("38-15-fd-50-10-96-ba", "18-05-7d-20-00-46-5a");
  test("fe-fd-fb-f7-ef-df-bf-7f", "fe-fd-fb-f7-ef-df-bf-7f");
  print("ok");
}

test(String input, String expect) {
  assert(tetris(input) == expect);
}

String tetris(String input) {
  Iterable<int> fields = input.split("-")
    .map((hex) => int.parse(hex, radix: 16));

  List<int> deleteLine = new Iterable.generate(8, (x) => pow(2, 7 - x))
    .where((x) => fields.every((f) => (f & x) != 0)).toList();

  return fields.map((int field) {
    for(int line in deleteLine) {
      int lowmask = line - 1;
      int highmask = (~lowmask) - line;
      field = (field & lowmask) + ((field & highmask) >> 1);
    }
    return "0${field.toRadixString(16)}".slice(-2);
  }).join("-");
}
```

文字列のpadding用のメソッドがほしいなぁ。
UIViewController iOS6での画面回転への対応


iOS6での画面の回転は、TARGETSのSupported Interface Orientationsでの設定に加えて、各ViewControllerでの設定も必要になります。
![SS](http://f.cl.ly/items/2j0n3c0o0K2W0T151X2u/スクリーンショット_2013_03_10_23_29-2.png)

UIKitのUINavigationControllerやビューコントローラをモーダルで表示したいときなど、わざわざ回転のためだけに継承するのも煩雑ですので、カテゴリでオーバーライドして対応するのが簡単そうです。

## UINavigationController

viewControllersの末尾の要素(現在表示されているビューコントローラ)と同じ画面の回転をサポートするようにする。

```objectivec:UINavigationController+Rotation.m
@implementation UINavigationController (Rotation)

- (NSUInteger)supportedInterfaceOrientations
{
    return [self.viewControllers.lastObject supportedInterfaceOrientations];
}

- (BOOL)shouldAutorotate
{
    return [self.viewControllers.lastObject shouldAutorotate];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [self.viewControllers.lastObject preferredInterfaceOrientationForPresentation];
}

@end
```
http://stackoverflow.com/questions/12526410/ios-6-viewcontroller-is-rotating-but-shouldnt

## UIActivityViewController

例はUIActivityViewControllerですが、ビューコントローラをモーダルで表示する場合は以下で対応出来ます。
UIActivityViewControllerをモーダル表示しているビューコントローラと同じ画面の回転をサポートするようにする。

```objectivec:UIActivityViewController+Rotation.m
@implementation UIActivityViewController (Rotation)

- (NSUInteger)supportedInterfaceOrientations
{
    return [self.presentingViewController supportedInterfaceOrientations];
}

- (BOOL)shouldAutorotate
{
    return [self.presentingViewController shouldAutorotate];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [self.presentingViewController preferredInterfaceOrientationForPresentation];
}
```

## 補足
class-dumpして確認しましたが、3つのメソッドは

	@interface UIViewController : UIResponder <NSCoding, UIAppearanceContainer>

で宣言されており、カテゴリでオーバーライドしても問題なさそうです。(カテゴリでの宣言をカテゴリでオーバーライドしているわけではないので)
Macにgccをインストールする


Macにgccをインストールするには、

1.まずXcodeをインストールし、
2.そのあとCommand Line Toolsをインストール

します。

##1.Xcodeのインストール

Xcodeは、App Storeからダウンロードできます。開発ツールカテゴリを開けば、すぐに見つかると思います。
現時点で、Xcodeのバージョンは4.6でした。


##2.Command Line Toolsのインストール

次にCommand Line Toolsをインストールします。
Command Line Toolsは、Xcodeのメニューからダウンロードを実行します。Xcodeを起動して、メニュー「Xcode」からPreferences…を選ぶと画面が開くので、上部のDownloadを選びます。
一覧の中からCommand Line Toolsを選択してインストールを行ってください。

インストールが終わったら動作確認してみます。

```
$ gcc --version
i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$
```

これで、インストールができました。

##実は初ポスト
つい先日Qiitaを知り、kobitoを使い、今日初めてポストしてみました。よろしくおねがいします。
すごいHaskellたのしく学ぼう！ イントロダクション  読書メモ


##Haskellとは？

純粋関数型言語。

##純粋関数型言語とは？

コンピュータに**何をするかは**伝えず、**何であるか**を伝える。

##参照透明性

関数が同じ引数で複数回呼ばれたら、これらは同じ値を返すことが保証される性質。

##遅延評価

結果が必要になるまで関数を実行しないこと。
無限の大きさのデータを扱うことが出来る。

##実行環境のインストール

[Download Haskell](http://www.haskell.org/platform/) からHaskell Platformなるコンパイラ、ライブラリなどがセットになったものをダウンロード。
インストーラ形式なのでそのまま実行してインストール完了。
Dartでオフラインリアルタイムどう書く#3参考問題

第三回 オフラインリアルタイムどう書くの参考問題をDartで解いてみました。
http://qiita.com/items/ebd8a56b41711ba459f9

```dart
main() {
  print(play("ssffpffssp"));
}

final BALL = 4;
final STRIKE = 3;
final OUT = 3;

class State {
  int ball, strike, out;
  State(this.ball, this.strike, this.out);
}

String play(String input) {
  var state = new State(0, 0, 0);

  String update({int strike: 0, int ball: 0, int out: 0}) {
    state.ball += ball;
    if(BALL <= state.ball) {
      state.ball = state.strike = 0;
    }

    state.strike += strike;
    if(STRIKE <= state.strike) {
      out = 1;
      state.ball = state.strike = 0;
    }

    state.out += out;
    if(out != 0) {
      state.strike = state.ball = 0;
      if(OUT <= state.out) state.out = 0;
    }

    return "${state.out}${state.strike}${state.ball}";
  }

  return input.split("").map((s) {
    switch(s) {
      case "s": return update(strike: 1);
      case "b": return update(ball: 1);
      case "h": return update(ball: BALL);
      case "f": return update(strike: (state.strike < 2 ? 1 : 0));
      case "p": return update(out: 1);
    }
  }).join(",");
}
```
Dartで第二回オフラインリアルタイムどう書く参考問題

第二回 オフラインリアルタイムどう書くの参考問題をDartで解いてみました。
http://qiita.com/items/9d80de41903775296ca6
もう少しシンプルに書きたいなぁ。

```dart
String rotate(String input) {
  int s = int.parse(input.split(":")[0]);
  String d = input.split(":")[1];

  List<String> bits = d.split("")
    .map((ch) => int.parse(ch, radix: 16).toRadixString(2))
    .map((bin) => "000$bin".slice(-4))
    .join("").split("").toList();

  String rotated = new Iterable.generate(s * s, (int i) {
    int index = i ~/ s + (s - i % s - 1) * s;
    return bits[index];
  }).join("");

  var res = rotated.replaceAllMapped(new RegExp(r".{0,4}"), (Match m) {
    var hex = "${m.group(0)}000".slice(0, 4);
    return int.parse(hex, radix: 2).toRadixString(16);
  });
  return "$s:$res";
}

main() {
  print(rotate("7:123456789abcd"));
}
```
モジュールディレクトリ名と同じテーマがあれば、そのテーマで表示するプリロード

XOOPS（XCL2.2,XoopsX）のプリロードとして書いてみた。
Suinさん作の簡易型テーマチェンジャーを応用、自分用に改造したもので、モジュールディレクトリと同名のテーマがあれば、そのモジュールでは当該テーマで表示するというものです。

まあ、何がしたいかというと、例えば、モジュール pico だけ違うテーマにしたい場合、利用するテーマのディレクトリを /themes/pico/ として、manifesto.ini.php のテーマ名記述部分を pico にすることで、「pico」というテーマが出来上がり、モジュール pico の場合、そのテーマで表示されるので、簡易型のテーマチェンジャーとして使えるかなぁ〜というものです。

もちろん、テーマディレクトリと同じテーマがなければ、通常のテーマで表示します。


```php:ChangeThemeByModuleName.class.php
<?php
/**
 * @file ChangeThemeByModuleName.class.php
 * @package For legacy Cube Legacy 2.2
 * @version $Id: ChangeThemeByModuleName.class.php ver0.03 2013/2/6  00:00:00 marine  $
 */
class ChangeThemeByModuleName extends XCube_ActionFilter
{
	public function postFilter()
	{
		$dirname = null;
		$themePath = null;

		if ( isset($this->mRoot->mContext->mModule->mXoopsModule) and  is_object($this->mRoot->mContext->mModule->mXoopsModule) ) {

			$dirname = $this->mRoot->mContext->mModule->mXoopsModule->get('dirname');
			$themePath = XOOPS_THEME_PATH."/".$dirname;

		}
		// モジュールのディレクトリ名 dirname と 同じテーマがある場合、それを適用する
		if (is_dir($themePath)) {
				$themeName = $dirname;
		}

		if(isset($themeName)){
			$this->mRoot->mContext->setThemeName($themeName);
		}

	}
}
```
遊んでいるMacBook(Leopard)にLinuxサーバーを入れる


自分ではもうやることはないだろうし、同じ状況の人がどれだけいるのかもわからないけれどとりあえず。

#環境

* MacBook (13-inch, Aluminum, Late 2008)
 * リソースは余っているしまだまだ動く
 * が、(重量的な意味で)重い & キーボード壊れたのでがっつり触るつもりはない
 * ので検証サーバーとして使うことにした

* MacBookAir (11-inch, Late 2010)
 * リモート作業用

#メモ

1. Mountain Lionにしておいた方が何かとよさそうだが、Leopardだと古すぎて直接アップグレードはできないのでSnow Leopardを購入(¥1,700)しインストール
1. App StoreでMountain Lionにアップグレード(Snow Leopardを購入しているのでこれは無料)。
1. `システム環境設定` で画面共有を許可する。この後はMacBook Airからでもvnc接続して作業可能。
1. [InsomniaX](http://www.macupdate.com/app/mac/22211/insomniax)
をインストールしディスプレイを閉じてもスリープしないようにする。この後MacBookは適当に収納して作業可能。
1. [VirtualBox](https://www.virtualbox.org/wiki/Downloads)をインストールし `環境設定 > ネットワーク` でホストオンリーネットワークを追加。
1. VirtualBoxでLinuxイメージを追加(ひとまずUbuntuを入れた)。ネットワークアダプタをブリッジにしてLinux起動。
1. Linuxにsshdをインストール `# apt-get install openssh-server``
1. Linuxからssh接続確認 `ssh localhost`
1. MacBookAirからssh接続確認。

これでひとまず自宅サーバーとして使えるようになった。
Scala勉強会 インストール編

# JDK(or JRE)をインストール

ScalaはJavaVM上で動作するため、JavaVMが動作する環境(`java`コマンドが使える環境)が必要です。
JRE(実行用環境)でも大丈夫だと思いますが、JDK(開発用環境)をインストールしたほうがいいと思います。バージョンは1.6以上です。
Windows, Linuxの方は以下のページからインストーラを取得してください。
MacOSXの場合は、最初から入っていると思います。（セキュリティ対策もあるので最新版に更新してください）

http://www.oracle.com/technetwork/java/javase/downloads/index.html

# Typesafe Stackを使う

Typesafe StackはScalaのコンパイラ `scalac` やビルドツール `sbt` (antやmavenのようなもの)を入れてくれます。

http://typesafe.com/stack から Download Stack >> をクリックし、条件に同意してダウンロードページへ進んでください。

各OSのインストール方法が用意されています。

## Windows

インストーラ(exe形式)があります。実行していくと`PATH`の設定なども自動で行なってくれるため、インストール後はコマンドプロンプトから`scala`コマンドが実行できるようになります。

## Mac OS X

homebrewでインストールします。

```
$ brew install scala sbt maven giter8
```

## その他

説明に従ってインストールすればきっと大丈夫。(投げやり)

# 動作確認

コンソールから `scala` コマンドを実行して以下のプロンプトが出ることを確認してください。
(Windows版は Scala version 2.9.2 が入るかもしれません。)

```
Welcome to Scala version 2.10.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_43).
Type in expressions to have them evaluated.
Type :help for more information.

scala>
```

`:quit` または `Ctrl+D` を入力して終了します。

# 各種コマンド

| コマンド名 | 内容 |
|:-------|:-------|
| `scala`  | コンパイル済みclassを実行したり、インタプリタを起動します。 |
| `scalac` | Scalaコンパイラ |
| `sbt` | simple build tool. 対話型のビルドツール。`compile`, `test`, `run` などのサブコマンドがあります。 |
| `g8` | giter8のコマンド。github上のテンプレートをプロジェクト名などを差し替えてローカルに配置してくれます。 |
Perl で robots.txt チェック

robots.txt である URL へのロボットアクセスが認められているかどうかチェックしたいときは、自分で robots.txt を解釈するコードを書いてもいいんですが、 [WWW::RobotRules::Extended](http://search.cpan.org/~ysimonx/WWW-RobotRules-Extended-0.02/lib/WWW/RobotRules/Extended.pm) を使うと便利です。

```perl
use WWW::RobotRules::Extended;

sub check ($$) {
  my ($ua, $url) = @_;
  my $rules = WWW::RobotRules::Extended->new ($ua);
  my $robots_txt = url_to_canon_url q</robots.txt>, $url;
  my (undef, $res) = http_get url => $robots_txt;
  return 1 unless $res->is_success;
  $rules->parse ($robots_txt, $res->content);
  return $rules->allowed ($url);
}
```

[WWW::RobotRules](http://search.cpan.org/~gaas/WWW-RobotRules-6.02/lib/WWW/RobotRules.pm) というのもありますが robots.txt の[1996年版仕様](http://www.robotstxt.org/norobots-rfc.txt)にある `Allow:` に対応していないなど古くて実用的ではありません。
Dartで第一回 オフラインリアルタイムどう書く

第一回 オフラインリアルタイムどう書くの問題をDartで解いてみました。
[http://nabetani.sakura.ne.jp/hena/1/]
結構手こずって、2時間以上かかりました。

```dart
import "dart:io";
import "dart:math";

final List<int> clearFlags = [7, 56, 448, 73, 146, 292, 273, 84];

int nthBit(n) => 1 << (n - 1);

bool isClear(int state) => clearFlags.any((int flag) => (flag & state) == flag);

String solve_tic_tack_toe(String input) {
  int playerO = 0;
  int playerX = 0;
  int common = 0;

  for(var i = 0; i < 9; i++) {
    int bit = nthBit(int.parse(input[i]));

    if(i % 2 == 0) {
      if((bit & common) != 0) return "Foul : x won.";
      playerO |= bit;
      if(isClear(playerO)) return "o won.";
    } else {
      if((bit & common) != 0) return "Foul : o won.";
      playerX |= bit;
      if(isClear(playerX)) return "x won.";
    }
    common |= bit;
  }
  return "Draw game.";
}

test(input, expect) {
  assert(solve_tic_tack_toe(input) == expect);
}

main() {
  test("79538246"    , "x won.");
  test("35497162193" , "x won.");
  test("61978543"    , "x won.");
  test("254961323121", "x won.");
  test("6134278187"  , "x won.");
  test("4319581"     , "Foul : x won.");
  test("9625663381"  , "Foul : x won.");
  test("7975662"     , "Foul : x won.");
  test("2368799597"  , "Foul : x won.");
  test("18652368566" , "Foul : x won.");
  test("965715"      , "o won.");
  test("38745796"    , "o won.");
  test("371929"      , "o won.");
  test("758698769"   , "o won.");
  test("42683953"    , "o won.");
  test("618843927"   , "Foul : o won.");
  test("36535224"    , "Foul : o won.");
  test("882973"      , "Foul : o won.");
  test("653675681"   , "Foul : o won.");
  test("9729934662"  , "Foul : o won.");
  test("972651483927", "Draw game.");
  test("5439126787"  , "Draw game.");
  test("142583697"   , "Draw game.");
  test("42198637563" , "Draw game.");
  test("657391482"   , "Draw game.");
  print("ok");
}
```
ファイルの置換や削除をできるコマンド sed の使い方メモ

サンプルテキスト

```
$ cat sample.log
1 2013-03-10 10:00:00
2 2013-03-10 15:00:00
3 2013-03-10 20:00:00
4 2013-03-11 11:00:00
5 2013-03-11 16:00:00
6 2013-03-11 21:00:00
7 2013-03-12 12:00:00
8 2013-03-12 17:00:00
9 2013-03-12 22:00:00
10 2013-03-13 15:00:00
```

指定した行数文削除(１行目から５行目削除)

```
$ cat sample.log | sed -e '1,5d'
6 2013-03-11 21:00:00
7 2013-03-12 12:00:00
8 2013-03-12 17:00:00
9 2013-03-12 22:00:00
10 2013-03-13 15:00:00
```

該当する行の最初に現れるものだけ置換

```
$ cat sample.log | sed -e "s/00/XX/"
1 2013-03-10 10:XX:00
2 2013-03-10 15:XX:00
3 2013-03-10 20:XX:00
4 2013-03-11 11:XX:00
5 2013-03-11 16:XX:00
6 2013-03-11 21:XX:00
7 2013-03-12 12:XX:00
8 2013-03-12 17:XX:00
9 2013-03-12 22:XX:00
10 2013-03-13 15:XX:00
```

該当する行の全てを対象に置換

```
$ cat sample.log | sed -e "s/00/XX/g"
1 2013-03-10 10:XX:XX
2 2013-03-10 15:XX:XX
3 2013-03-10 20:XX:XX
4 2013-03-11 11:XX:XX
5 2013-03-11 16:XX:XX
6 2013-03-11 21:XX:XX
7 2013-03-12 12:XX:XX
8 2013-03-12 17:XX:XX
9 2013-03-12 22:XX:XX
10 2013-03-13 15:XX:XX
```

最初のスペースをカンマに変換

```
$ cat sample.log | sed -e "s/  \?/,/1"
1,2013-03-10 10:00:00
2,2013-03-10 15:00:00
3,2013-03-10 20:00:00
4,2013-03-11 11:00:00
5,2013-03-11 16:00:00
6,2013-03-11 21:00:00
7,2013-03-12 12:00:00
8,2013-03-12 17:00:00
9,2013-03-12 22:00:00
10,2013-03-13 15:00:00
```

先頭に文字をつける

```
cat sample.log | sed -e 's/^/id:/g'
id:1 2013-03-10 10:00:00
id:2 2013-03-10 15:00:00
id:3 2013-03-10 20:00:00
id:4 2013-03-11 11:00:00
id:5 2013-03-11 16:00:00
id:6 2013-03-11 21:00:00
id:7 2013-03-12 12:00:00
id:8 2013-03-12 17:00:00
id:9 2013-03-12 22:00:00
id:10 2013-03-13 15:00:00
```

ここからは別のサンプルログ
 
```
$ head -n 3 sample2.log 
127.0.0.1 - - [21/Feb/2013:00:06:20 +0900] "GET /feed/ HTTP/1.0" 304 - "-" "livedoor FeedFetcher/0.01 (http://reader.livedoor.com/; 1 subscriber)"
127.0.0.1 - - [21/Feb/2013:00:06:26 +0900] "GET / HTTP/1.0" 200 17702 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"
127.0.0.1 - - [21/Feb/2013:00:07:29 +0900] "GET / HTTP/1.0" 200 17702 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"
```

特定の文字列を頑張って抜き出す
(他に良い感じのやり方あったら知りたい…)
やっていることは、特定の文字が出てきたら、改行して先頭が該当する文字だったら出力するということをやっている。
これはHTTPのステータスにしてるけど、普段のWebサービスのアプリログを調べるときはこんな感じで

```
$ cat sample2.log | sed -e "s/HTTP\/1.0/\n\HTTP\/1.0/g" | awk '$1=="HTTP/1.0\"" {print $2}'
304
200
200
200
200
302
200
200
301
200
301
200
200
200
200
301
404
```

データベースから抜き出して、カンマ区切りで保存

```
$ echo 'select * from test1;' | mysql -uroot -ppassword test_db | sed -e "s/\t/,/g" > a.tsv
```
Basic authentication with express	


nodeのexpressフレームワークでBasic認証を実現した場合。

## 認証関数を作成

```app.js
var auth = express.basicAuth(function(user,pass){
	return user === myuser && pass === mypasswd;
});
```

## routingのミドルウェアとして使用
```
app.get("/admin", auth, function(req, res){
	res.render("admin", { title : "This is admin" });
});
```

expressが使っているミドルウェア、Connectはroutingの際に、関数を何個も通ってレスポンスを行うという作りになっている。このときにfalsyな値を返すと次にいかないので、間にauth関数を挟んでやるとBasic認証の仕組みが実現できる。
RubyでIntegerと文字を相互変換する


古くは[弾さんのエントリ](http://blog.livedoor.jp/dankogai/archives/50696206.html)にもあるchrとordのお話。
なお、Ruby1.9以降を前提にしています。1.8は多分挙動がだいぶ違うはず。

RubyとUnicodeのCodepointの話は、下記の記事がわかりやすくよくまとまっていています。

- [Ruby にて文字と Unicode コードポイントの相互変換を行う - vivid memo](http://d.hatena.ne.jp/vividcode/20110120/1295542000)


## ポイント

- ASCIIにない範囲の文字をchrするときは、encodingを指定すること
- UnicodeのRangeは、0x0〜0x10FFFF (1114111)まで


## サンプルコード

```ruby:sample.rb
# ASCIIの変換
p "A".ord # => 65
p 65.chr  # => "A"
p "A".ord.chr # => "A"

# UTF-8の変換
p "文".ord # => 25991
# encodingを指定しないとUS-ASCIIの範囲で文字を返そうとする
p 25991.chr # RangeError: 25991 out of char range
p 25991.chr("UTF-8") # => "文"
p 25991.chr(Encoding::UTF_8) # => "文"

p 1114112.chr(Encoding::UTF_8) # RangeError: invalid codepoint 0x110000 in UTF-8
```


ちなみに、``"\u{16進数}"``でコードポイントに対応する文字が出せるんですね。

```ruby
p 25991.to_s(16) # => "6587"
p "\u{6587}" # => "文"
```

文字列を取得したら``.each_codepoint``を使うと数値列に変換するのが良いでしょう。

```ruby
"あいうえお".each_codepoint.to_a #=> [12354, 12356, 12358, 12360, 12362]
```

## 参考

- [class Integer - Ruby 1.9.3 リファレンスマニュアル](http://doc.ruby-lang.org/ja/1.9.3/class/Integer.html)
- [Code point - Wikipedia](http://en.wikipedia.org/wiki/Code_point)
- [Ruby にて文字と Unicode コードポイントの相互変換を行う - vivid memo](http://d.hatena.ne.jp/vividcode/20110120/1295542000)
第8回オフラインリアルタイムどう書く解答例(Ruby)

NさんとMさんから「Rubyは便利だよ」と言われ続け、Rubyを勉強することにしました。
方針は以前投稿したC++のものと同じです。
コードを少し修正しました。

```rb
def hex2bin(s)
  s.chars.map{|m| sprintf("%04b", m.to_i(16))}.join.slice(0, 30)
end

def bin2hex(s)
  s.chars.each_slice(4).map{|m| sprintf("%x", (m.inject{|x, y| x + y}).to_i(2))}.join
end

def update_fire_impl(w, f, i, inc, proc)
  while proc.call(i)
    if w[i] == "1"
      f[i] = "0"
      break
    else
      f[i] = "1"
      i += inc
    end
  end
end

def update_fire(w, f, i)
  f[i] = "1"
  width = 6
  update_fire_impl(w, f, i + width, width, Proc.new{|x| x < f.length})
  update_fire_impl(w, f, i - width, -width, Proc.new{|x| 0 <= x})
  update_fire_impl(w, f, i + 1, 1, Proc.new{|x| x % width != 0})
  update_fire_impl(w, f, i - 1, -1, Proc.new{|x| x % width != width - 1 && 0 <= x})
end

def solve(w, b, f)
  b.enum_for(:each_char).each_with_index do |c, i|
    update_fire(w, f, i) if c == "1"
  end
  bin2hex(f + "00")
end

DATA.each do |line|
  no, s, expected = line.split
  actual = solve(hex2bin(s.split(/\//)[0]), hex2bin(s.split(/\//)[1]), sprintf("%030b", 0))
  result = actual == expected ? "ok" : "ng (" + actual + ")";
  puts "#{no}, #{result}"
end

__END__
0   802b1200/01400c20    53c40cfc
1   28301068/84080504    d64fef94
2   100a4010/80010004    e241850c
```
acceptableRegex.py を使ってファジングぽいことをする

acceptableRegex.py というライブラリを利用すると、正規表現にマッチする文字列を返してもらえます。
結果を利用するとファジングぽいことができます。

### インストール

ファイルは、githubから取得します。

```sh
$ git clone https://github.com/tokoroten/acceptableRegex.git
```

### 利用方法

取得した acceptableRegex.py を PYTHONPATH が通っている箇所におくか、
作成するスクリプトと同一ディレクトリに置きます。

使い方は、 acceptableRegex.py の main() にありますが、
getAcceptableRegex に正規表現を渡すと、マッチする結果を返されます。

```python
from acceptableRegex import getAcceptableRegex

if __name__ == '__main__':
    print getAcceptableRegex('[0-9]{9}')
```

このサンプルだと、 9桁の0から9の数値が返されます。

### てきとうなCSVを作る

acceptableRegex.py の結果を利用すると、
CSV を読み込んでなにかをするプログラムなどのテストで利用するなどできそうです。

```python:sample.py
# -*- coding: utf-8 -*-

import csv

from acceptableRegex import getAcceptableRegex

if __name__ == '__main__':
    with open('eggs.csv', 'wb') as f:
        csvfile = csv.writer(f)
        for x in range(1, 100):
            syouhin = getAcceptableRegex('[a-zA-Z]{10}')
            price = getAcceptableRegex('[01]{1}[0-9]{3}')
            category = getAcceptableRegex('(aaa|bbb|ccc|fff)')
            csvfile.writerow([syouhin, price, category])
```
ニコニ広告のptを取得するAPI

こんな感じで、動画IDをカンマ区切りで与えてあげれば、一気に取得できます。

http://api.uad.nicovideo.jp/UadsVideoService/getAdvertisingJsonp?callback=__jsonp_1&videoid=sm9,sm20177135

最大600件まで同時に取得できるようです。


```:レスポンスのJSONP
__jsonp_1(
[
{
idvideo: "sm20177135",
comments: null,
total: 7900,
level: 5,
adflg: 0
},
{
idvideo: "sm9",
comments: null,
total: 383400,
level: 10,
adflg: 0
}
]
)
```

レスポンスがJSONP形式なので、サーバサイドで利用したい場合はJSON形式に変換してやる必要がありそうです。

callbackパラメータで関数名を指定できます。

パラメータで渡した動画の順番通りには返ってこないようなので注意が必要です。

## レスポンスの要素
- idvideo : 動画ID
- comments : 提供コメント
- total : 宣伝pt
- level : ニコニ広告のレベル（よく知りませんが）
- adflg : 有効かどうか？
PHP入門 配列(array) 基本編


今回は配列の学習。配列とは、複数の変数（要素）を持っているもの。

> array：配列

配列の宣言はarray()関数を用いて、以下のように記述する。

	$array = array(1, 2, 3, 4, 5);

配列$arrayの中身を表示するには、print_r()関数を用いて、以下のように記述する。

	print_r($array);

実行結果：

	Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )

さきほどの実行結果は横一列に表示されているのが、わかりやすく記述すると以下のようになる。

	Array (
		[0] => 1
		[1] => 2
		[2] => 3
		[3] => 4
		[4] => 5
	)

これ以降の説明では、わかりやすく記述する。

次に、配列の要素を取得する方法を説明する。
**インデックス番号**という配列の要素の位置を示す番号を用いて、

	$array[インデックス番号]

という書式で表せる。例えば、配列$arrayの最初の要素1を取得するには、$array[0]、要素5を取得するには、$array[4]を用いる。もうすでにわかっているかもしれないが、インデックス番号は0から始まっているので、十分注意しよう。

> インデックス番号は0から始まる、2番目の要素は$array[1]、3番目の要素は$array[2]、4番目の要素は$array[3]。

配列には、通常の配列とは別に**連想配列**という特殊な配列があります。連想配列の宣言もarray()関数を用いて、以下のように記述する。

	$array = array('first' => 1, 2, 3, 4, 'final' => 5);

$arrayの中身は以下のようになっている。

	Array (
		[first] => 1
		[0] => 2
		[1] => 3
		[2] => 4
		[final] => 5
	)

連想配列の要素の取得方法を説明する。
さきほどはインデックス番号という配列の要素の位置を示す番号を用いたが、連想配列では、要素に**キー**（意味のある文字列や番号）を割り当てる。連想配列の要素の取得は配列と同じように[]内にキーを記述する。

	$array[キー]

配列$arrayの要素1を取得する場合、$array['first']と記述する。実際には、''で囲まなくても問題は起こらないが、''で囲むようにした方がいいようだ。
Microsoft.Office.Interop.Excelのあれこれ

VB.NETもしくはC#でExcelを扱う際に、気を付けた方がいいことを適当にまとめます。

* `Microsoft.Office.Interop.Excel.Workbook`をNewしてはいけません。

```:vb.net
Dim xls As New Microsoft.Office.Interop.Excel.Application()
Dim book As Microsoft.Office.Interop.Excel.Workbook  ' <- New してはいけない！
```

ちょっと考えればわかることですが、もし誤るとなかなか気が付きません。下記のエラーメッセージからではなかなか原因を見つけることは困難です。(参考：[Visual StudioでExcelが扱えない](http://social.msdn.microsoft.com/Forums/ja-JP/csharpgeneralja/thread/ed4b841c-a04d-4e2b-8324-a2b6c6f34584/))

```
CLSID {00020819-0000-0000-C000-000000000046}
を含むコンポーネントのCOM クラス ファクトリを収得中に、次の
エラーが発生しました：80040154 クラスが登録されていません
(HRESULT からの例外：0x80040154 (REGDB_E_CLASSNOTREG))
```      

* Microsoft Visual Studio上で`Microsoft.Office.Interop`を扱いたい場合には、
メニューの「プロジェクト > 参照の追加 > COM > Microsoft Excel 14.0 Object Library 」で加えられます。                          
                   
* Microsoft Visual Studioを使えば、アセンブリの参照の追加は簡単ですが、シェルからコマンドで追加する場合にMicrosoft.Office.Interop.Excel.dllが見つからない場合とかあります。色々と調べてみると、[Download Office XP Primary Interop Assemblies (PIAs) from Official Microsoft Download Center](http://www.microsoft.com/en-us/download/details.aspx?id=227)からソフトウェアをインストールすると

```
    * adodb.dll
    * dao.dll
    * Microsoft.Office.Interop.Access.dll
    * Microsoft.Office.Interop.Excel.dll
    * Microsoft.Office.Interop.FrontPage.dll
    * Microsoft.Office.Interop.FrontPageEditor.dll
    * Microsoft.Office.Interop.Graph.dll
    * Microsoft.Office.Interop.Outlook.dll
    * Microsoft.Office.Interop.OutlookViewCtl.dll
    * Microsoft.Office.Interop.Owc.dll
    * Microsoft.Office.Interop.PowerPoint.dll
    * Microsoft.Office.Interop.Publisher.dll
    * Microsoft.Office.Interop.SmartTag.dll
    * Microsoft.Office.Interop.Visio.dll
    * Microsoft.Office.Interop.Word.dll
    * Microsoft.Vbe.Interop.dll
    * mscomctl.dll
    * msdatasrc.dll
    * office.dll
    * stdole.dll
```

を手に入れることができます。


* 実際にC#コードをシェルからコンパイルするには以下のようにします。

```:shell
vimshell% ls
Microsoft.Office.Interop.Excel.dll*
office.dll*
a.cs
vimshell% csc /R:Microsoft.Office.Interop.Excel.dll ./a.cs
Microsoft (R) Visual C# Compiler Version 4.0.30319.17929
for Microsoft (R) .NET Framework 4.5
Copyright (C) Microsoft Corporation. All rights reserved.

vimshell% ./a.exe
vimshell% 
```

a.csは下記にURLのコードを使っています。また、実行時には`Microsoft.Office.Interop.Excel.dll`と`office.dll`を参照できるようにしとかないといけません。

> http://msdn.microsoft.com/ja-jp/library/ms173186(v=vs.80).aspx
git logのフォーマットを指定する

# git logのフォーマットを指定したい

指定したい。

```
$ git log --pretty=format:"[%ad] %h %an : %s"
```

以下のオプションが使える。

|オプション|内容|
|--------:|:------------|
|%H           |コミットのハッシュ|
|%h           |コミットのハッシュ (短縮版) |
|%T           | ツリーのハッシュ |
|%t           | ツリーのハッシュ (短縮版) |
|%P           | 親のハッシュ |
|%p           | 親のハッシュ (短縮版) |
|%an         | Author の名前 |
|%ae         | Author のメールアドレス |
|%ad         | Author の日付 (-date= オプションに従った形式) |
|%ar          | Author の相対日付 |
|%cn          | Committer の名前 |
|%ce         | Committer のメールアドレス |
|%cd       | Committer の日付 |
|%cr         | Committer の相対日付 |
|%s          |  件名 |

## 日付も指定したい

指定したい。

```
$ git log --date=iso --pretty=format:"[%ad] %h %an : %s"
```

以下のオプションが使える

|オプション|内容|
|--------:|:------------|
|relative | 相対時間 (3 days ago) |
| local  | ローカルタイムゾーン |
| iso | ISO 8601 フォーマット |
| rfc | RFC 2822 フォーマット |
| short | YYYY-MM-DD |
| raw | %s %z |
| default | 標準 |

## 参考
- http://stackoverflow.com/questions/7853332/git-log-date-formats
- http://git-scm.com/book/ja/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E5%B1%A5%E6%AD%B4%E3%81%AE%E9%96%B2%E8%A6%A7
オフラインリアルタイムどう書く第8回の問題をScalaで解こうとして色々ハマった話

Scala勉強のために「オフラインリアルタイムどう書く」の問題はScalaでも解こうと思っているのですが新しい解法が思い浮かばなかったので、「どう書く」主催者の鍋谷さんのエレガントな解法http://qiita.com/items/0a9fbd1d33ccfd533dc6 をscalaに移植しようとして色々ハマりました。

[ハマりその１]16進文字列Int変換
お題が16進文字列なのでIntに変換したい。基数指定できる変換メソッド。
Integer.parseInt(文字列,基数)
文字列に[0-9]以外があると例外を吐く。16進変換には使えない・・。
Integer.valueOf(文字列,基数)
普通に変換してくれる、が"80000000"のように符号bitが立っていると例外に・・。
Long.valueOf(文字列,基数)
そんなメソッド無いといわれる。
scalaのLongもjavaのLongの機能を、そのまま使えればいいのに・・。
で、

```scala
def toInt(base:Int):Int = java.lang.Long.valueOf(self, base).intValue
```

こんなになりました。

[ハマりその2]ビット演算
上記で問題解決と思って実行すると解ける問題もあるが、その後停止。明らかにループ。
ループしそうな箇所を追ったらビットシフトが怪しい。
REPLで実行してみる。

```
scala> "%x".format(0x80000000>>1)
res1: String = c0000000
```

期待した結果は

```
res1: String = 40000000
```
だったのですが、符号ビットオンのままシフトしてくるようです。

回避コード書いたのですが、シフト演算子を>>>にするだけで、いいようで・・。
で、以下ソースです。

```scala
implicit class NumString(self:String) {
  def toInt(base:Int):Int = java.lang.Long.valueOf(self, base).intValue
}
implicit class FormatInt(self:Int) {
  def toString(format:String):String = format.format(self)
}

def solve(src:String):String = {
  val divSrc = src.split("/").toList.map{_.toInt(16)}
  val w = divSrc.head
  val b = divSrc.last
  val field = ((0xffffffff) & ~3) & ~w

  List(
    (1, ("111110"*5+"00").toInt(2)),
    (-1, ("011111"*5+"00").toInt(2)),
    (6, -1),
    (-6, -1)
  ).map{sm =>
    sm match {
      case (shift:Int, mask:Int) => {
        var r, fire = b;
        while(fire != 0) {
          r |= fire
          if (shift > 0)
            fire = ((fire&mask) >>> shift) & field
          else
            fire = ((fire&mask) << (-shift)) & field
        }
        r
      }
    }
  }.foldLeft(0){_|_}.toString("%08x")
}

probs.split("\n").foreach(line => line.split(",").toList match {
  case List(no,q,a) => {
    var ans = solve(q)
    println(no + "\t" + ans + "\t" + (if (ans==a) "o" else "x"))
  }
  case _ =>
})

def probs =
"""
0,802b1200/01400c20,53c40cfc
1,28301068/84080504,d64fef94
2,100a4010/80010004,e241850c
3,81020400/000000fc,0e3cfbfc
4,80225020/7e082080,7fdd24d0
5,01201200/40102008,fe1861fc
6,00201000/01000200,43c48f08
7,00891220/81020408,ff060c1c
8,410033c0/0c300000,3cf0c000
9,00000000/01400a00,7bf7bf78
10,00000000/20000a00,fca2bf28
11,00000000/00000000,00000000
12,00cafe00/00000000,00000000
13,aaabaaaa/50000000,51441040
14,a95a95a8/56a56a54,56a56a54
15,104fc820/80201010,ea30345c
16,4a940214/05000008,05000008
17,00908000/05000200,ff043f48
18,00c48c00/fe1861fc,ff3873fc
19,00000004/81020400,fffffff0
20,111028b0/40021100,e08fd744
21,6808490c/01959000,17f7b650
22,30821004/81014040,c75de5f8
23,0004c810/10003100,fe4937c4
24,12022020/88200000,edf08208
25,2aa92098/01160000,45165964
26,00242940/10010004,fc43c43c
27,483c2120/11004c00,33c3de10
28,10140140/44004a04,eda3fe3c
29,0c901d38/72602200,f36da280
"""
```
Rails 4 - Active Record Associations


## has_one

一对一关系：有 A 和 B，A 拥有且仅拥有一个 B

![has_one](http://edgeguides.rubyonrails.org/images/has_one.png)

## belongs_to

一对一关系：有 A 和 B，A 属于且仅属于一个 B

![belongs_to](http://edgeguides.rubyonrails.org/images/belongs_to.png)

## has_one :through

嵌套式一对一关系：A 拥有一个 B，B 拥有一个 C，那么 A 通过 B 拥有一个 C

![has_one_through](http://edgeguides.rubyonrails.org/images/has_one_through.png)

## 在 has_one 和 belongs_to 之间进行选择

当你要在两个模型之间建立一对一关系时，你需要为其中一个模型添加 `has_one`，而为另一个添加 `belongs_to`，那么如何做出正确的选择呢？

关键之处就在于你把主键安排给哪个模型（拥有主键的模型应该添加 `belongs_to`），不过在此之前还应该认真考虑一下在现实中的合理性。

`has_one` 关系意味着某样东西（实例化的对象）是你的。比如，我们会说“一个用户拥有一个账号”，而不是“一个账号拥有一个用户”。那么在这里，主键应该安排在账号模型内，也就是说“账号属于（`belongs_to`）模型”：

```ruby
class User < ActiveRecord::Base
  has_one :account
end

class Account < ActiveRecord::Base
  belongs_to :user
end
```

与之对应的 migration 即是：

```ruby
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      t.string :name
      t.timestamps
    end
    
    create_table :accounts do |t|
      t.integer :user_id
      # t.references :user_id 是一样的
      t.string  :account_name
      t.timestamps
    end
  end
end
```


## has_many

一对多关系：有 A 和 B，A 拥有零个或多个 B

![has_many](http://edgeguides.rubyonrails.org/images/has_many.png)

## has_many :through

多对多关系：有 A 和 C，（通过 B）产生多个 A 与 多个 C 之间的两两关系

![has_many_through](http://edgeguides.rubyonrails.org/images/has_many_through.png)

### 嵌套式多对多关系
还有一种多对多关系：A 拥有多个 B，B 拥有多个 C，那么 A 通过 B 拥有多个 C

```ruby
class Article < ActiveRecord::Base
  has_many :sections
  has_many :paragraphs, through: :sections
end

class Section < ActiveRecord::Base
  belongs_to :article
  has_many :paragraphs
end

class Paragraph < ActiveRecord::Base
  belongs_to :section
end
```

此时，Rails 可以明白这样的关系：

```ruby
@article.paragraphs
```

## has_and_belongs_to_many

直接多对多关系：每一个 A 拥有或属于多个 B，每一个 B 属于或拥有 多个 A

![has_and_belongs_to_many](http://edgeguides.rubyonrails.org/images/habtm.png)

## 在 has_and_belongs_to_many 和 has_many :through 之间进行选择

Rails 为我们提供了两种多对多的模型关系，它们的区别在于其中间关系是隐性的还是显性的。

`has_and_belongs_to_many` 是一种直接化的多对多关系，不需要单独建立中间关系的模型（但是中间关系表需要人工创建），所以是隐性的。而 `has_many :through` 则需要创建中间关系的模型。

所以，选择哪一种的关键之处就在于你是否需要对中间关系进行进一步的控制，比如说添加额外属性和模型验证，或者添加回调方法等等；换句话说就是要看中间关系是否是业务逻辑里需要出现的实体。

## polymorphic

多态关系：有 A, B 和 C，为 A 定义一个接口，于是 B 可以拥有 多个 A，C 也可以拥有多个 A

![polymorphic](http://edgeguides.rubyonrails.org/images/polymorphic.png)

此时，Rails 将理解以下关系：

```ruby
@employee.pictures
# or
@product.pictures
```

并且可以通过 `@picture.imageable` 访问 `Picture` 实例的父级关系，当然你需要指明数据库里的类型字段：

```ruby
class CreatePictures < ActiveRecord::Migration
  def change
    create_table :pictures do |t|
      t.string  :name
      t.integer :imageable_id
      t.string  :imageable_type
      # 以上两句可以简化为：t.references :imageable, polymorphic: true
      t.timestamps
    end
  end
end
```

## Self Joins

有时候你会发现一个模型需要拥有针对自身的关系，比如说你想要把所有的员工保存在一张表里，并且能够跟踪他们之间的相互关系（经理、下属），此时你可以使用 self-joining：

```ruby
class Employee < ActiveRecord::Base
  has_many :subordinates, class_name: 'Employee', foreign_key: 'manager_id'
  belongs_to :manager, class_name: 'Employee'
end
```
静的ページを作るときにもjadeを使うと便利


[jade]といえばnode.jsのテンプレートエンジンで[express]などのフレームワークと組み合わせて使うことが多いと思うが、単に静的ページを作るときにも使うことができる。jadeを使えば、HTMLを素でコーディングする場合と比べて次のような利点がある。なお、jadeと似たようなもので[Haml]や[zen coding]がある。

* `<div>` のとじ忘れによるレイアウト崩れで悩まない
* 変数が使えるので、文言の置き換えが簡単
* ループができるので、HTMLが繰り返しになる部分が簡単

jadeコマンドをインストールしておく:

```
npm install -g jade
```

jadeでページを作る:

```jade:src/index.jade
//- 変数定義
title = "ぺーじのたいとる"
//- 以下HTML
doctype 5
html
	head
		meta(charset="utf-8")
		title= title
	body
		h1= title
		p コンテンツ
```

あとはコマンド叩くだけ:

```
jade -P src/*.jade -O public/
```

できあがり:

```html:public/index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>ぺーじのたいとる</title>
  </head>
  <body>
    <h1>ぺーじのたいとる</h1>
    <p>コンテンツ</p>
  </body>
</html>
```

[jade]: http://jade-lang.com/
[express]: http://expressjs.com/
[Haml]: http://haml.info/
[zen coding]: https://code.google.com/p/zen-coding/
expressのreq.format()を、urlの拡張子で判別してくれるようにする

expressのres.format()メソッドを使うと、railsのrespond_toみたいに、レスポンスのContent-Typeごとに実行する処理を分けることがきる。
(コンテントネゴシエーターとか呼ばれる機能らしい。)

```javascript
  app.get('/hoge.:format', function(req, res) {
    res.format({
      json: function(req, res) {
        res.send({a: 1});
      },
      html: function(req, res) {
        // ブラウザから /index.json にアクセスしてもこっちが実行される
        res.render('index');
      },
      default: function(req, res) {
        res.send(406);
      }
    });
  });
```

上記のように書けば良いのだけど、このタイプの判定は、リクエストのAcceptヘッダを元に判定しているらしく、ヘッダがついていないと、たとえURLが `/hoge.json` だったとしても、jsonの処理が実行されない。

良いやりかたかどうかさだかではないけど、下記の容量で、expressのレスポンスタイプ判定メソッドを拡張すると、:formatという名前のパラメーターがついていた場合は考慮されるようになる。

```javascript
  var __accepts = express.request.accepts;
  express.request.accepts = function(type) {
    var format = this.params.format
      , i;

    if (util.isArray(type)) {
      for (i = 0; i < type.length; i++) {
        t = type[i];
        if (type[i] === format) {
          return type[i];
        }
      }
    } else if (type === this.params.format) {
      return type;
    }
    return __accepts.call(this, type);
  };

  var __is = express.request.is;
  express.request.is = function(type) {
    return this.params.format === type || __is.call(this, type);
  };
```

app.param() とかの便利機能もあるけど、ヘッダを書き換えずにやるにはこういう方法しか思いつかなかった。
Rails 4 - Active Record Query Interface


## 批量查询记录

我们时常会碰到需要一次性处理大量记录的要求，比如说为所有的用户发送电子邮件：

```ruby
User.all.each do |user|
  NewsLetter.weekly_deliver(user)
end
```

这样的做法虽然能完成工作，但是却很没效率，特别是当数据库里的记录数量非常大的时候，`User.all` 会把所有的记录一次性获取，然后逐条实例化，并把最终的结果数组保存在内存当中，这种消耗是非常巨大的。

Rails 提供了两个用于批量查询记录的方法，`find_each` 和 `find_in_batches`。

### find_each

`find_each` 方法查询一批记录并逐条提取至 block 中执行，一批次的数量默认是 1000 条，这个缺省值是和 `find_in_batches` 相同的。

```ruby
User.find_each do |user|
  NewsLetter.weekly_deliver(user)
end
```

当然，我们可以手动指定一批次的数量：

```ruby
User.find_each(batch_size: 5000) do |user|
  NewsLetter.weekly_deliver(user)
end
```

另外，默认的查询是以主键按升序来完成的，这就要求主键必须得是数字；我们还可以指定查询的起始位置：

```ruby
User.find_each(start: 2000, batch_size: 2000) do |user|
  NwesLetter.weekly_deliver(user)
end
```

假设你想要同时使用多个代工（workers）来帮助你处理批量工作，就可以用这两个选项来为每一个代工指定目标区间了。

### find_in_batches

和 `find_each` 相比，`find_in_batches` 方法在获得一批记录之后，并不是逐条提取而是把这一批记录作为一个数组全部提取至 block 中执行。

```ruby
Invoice.find_in_batches(include: :invoice_lines) do |invoices|
  export.add_invoices(invoices)
end
```

`include` 选项允许你指明需要和模型一起加载的关联关系*，其他的选项和 `find_each` 方法相同。
.zshenvの実行時間を調査する

vimの起動が最近どうも、もっさりとしていて気になっていたのだけど、てっきりvimのプラグインか何かが悪さしていたのかなと思っていたが、どうやら原因が~/.zshenvが重いことであった

~/.zshenvを読みこむときにかかる時間を測定するには、以下のようにすればよい。

```
$ time ( source ~/.zshenv )
( source ~/.zshenv; )  0.63s user 0.41s system 96% cpu 1.080 total
```

timeとsourceはどちらもシェル関数でコマンドではないので、サブシェルにする必要がある。

あとは実行しつつ、一部をコメントアウトしたりすればよい。

なお調査したところ、私の設定の場合は、perlbrewとrbenvの初期化が8割ぐらいの時間を占めていて、perlbrewは良いアイディアはなかったが、rbenvは

```
eval (rbenv init -)
```

をやめ、rbenv init -の結果出てくるシェルスクリプトをファイルから読むようにし、

```
# rbenv rehash 2>/dev/null
```

をコメントアウトしたところ、

```
( source ~/.zshenv; )  0.29s user 0.12s system 96% cpu 0.429 total
```

ぐらいにはなった。perlbrewを外せば、totalが0.2 secぐらいになるが、vimからperlを実行できないとさすがに困るので、とりあえずこれで我慢する。

今のところ特に不都合が出ていないようだけど、頻繁にrubyのバージョンを切り替えたりするときは問題があるかもしれない。(たぶん切り替えたあとにrehashすればよいはず)
1.8.7 では some_method(a, b, c,) と書けない


メソッドの仮引数のリストの最後に `,` を付けることができるのは 1.9.x からです。
1.8.7 と 1.9.x を行ったり来たりしているとたまに引っかかりますね。

```ruby:1.8.7
[1] pry(main)> p RUBY_VERSION
"1.8.7"
=> nil
[2] pry(main)> p(1, 2, 3,)
SyntaxError: unexpected ')'
```

```ruby:1.9.3
[1] pry(main)> p RUBY_VERSION
"1.9.3"
=> "1.9.3"
[2] pry(main)> p(1, 2, 3,)
1
2
3
=> [1, 2, 3]
```

ちなみに、Hash の最後の要素の後ろの `,` は 1.8.7 でも付けられます。

```ruby:1.8.7
[3] pry(main)> { :foo => 42, :bar => 3, }
=> {:bar=>3, :foo=>42}
```


(あまり関係ないけど、この記事書いてて 1.9.3 では `Kernel.#p` の返り値が `nil` じゃないのを初めて知った……)
CoffeeScript 1.4.0, 1.5.0, 1.6.1 の差異

1.4.0, 1.5.0 ではコンパイルが通るコード．

```CoffeeScript:a.coffee
f = (obj1, obj2) ->
  console.log obj1.x
  console.log obj2.y

f {x: 1}
  y: 2
```

引数として Object を 2 つ受け取る関数を呼び出す際のコードです．これコンパイルが通るんですよね．よく考えてみると変な気がしますけど．

最後の引数が Object の場合は `{}` を外せる，インデントによって Object の内容を記載していける，関数呼び出しに `()` が必要ない，という仕様が交じり合ったときの不整合というか何と言うか．

ちなみにコンパイルは通るんですけど，コンパイル結果が，1.4.0 と 1.5.0 とでは違います．

コンパイルは最も単純に `coffee -c a.coffee` で行います．

```JavaScript:1.4.0でコンパイル
// Generated by CoffeeScript 1.4.0
(function() {
  var f;

  f = function(obj1, obj2) {
    console.log(obj1.x);
    return console.log(obj2.y);
  };

  f({
    x: 1
  }, {
    y: 2
  });

}).call(this);
```

```JavaScript:1.5.0でコンパイル
// Generated by CoffeeScript 1.5.0
(function() {
  var f;

  f = function(obj1, obj2) {
    console.log(obj1.x);
    return console.log(obj2.y);
  };

  f({
    x: 1
  })({       // ← ここが違います　このまま実行するとエラーですね
    y: 2
  });

}).call(this);
```

このコードが，1.6.1 ではコンパイルエラーを起こすように変わったようです．

以下のように修正しましょう．

```CoffeeScript:b.coffee
f = (obj1, obj2) ->
  console.log obj1.x
  console.log obj2.y

f {x: 1},
  y: 2
```

`{x: 1}` の後にきちんとコンマをつけましょう．これで 1.4.0 でコンパイルした結果と同じコードが得られます．

```JavaScript:1.6.1でコンパイル
// Generated by CoffeeScript 1.6.1
(function() {
  var f;

  f = function(obj1, obj2) {
    console.log(obj1.x);
    return console.log(obj2.y);
  };

  f({
    x: 1
  }, {
    y: 2
  });

}).call(this);
```
RubyMineでRailsプロジェクトを作り、Rspecで自動テストをかける方法

1. 最初にプロジェクトを作るときに「Skip Test:Unit files」をチェックする。
1. 追記：

```ruby:Gemfile
...
gem "rspec-rails", :group => [:development, :test]
```

1. bundle install
1. Tools > Run Rails Script > rails generate rspec:install
1. Tools > Run Rails Generator > scaffold > post title:string body:text
1. Tools > Run Rake Task > db:migrate
1. Run > Run > spec
1. Toggle auto-test
1. コードを編集

```ruby:spec/model/post_spec.rb
# encoding: utf-8
require 'spec_helper'
 
describe Post, "#title が設定されていない場合:"  do
  # pending "add some examples to (or delete) #{__FILE__}"
  before(:each) do
    @post = Post.new
  end
 
  it "バリデーションに失敗すること" do
    @post.should_not be_valid
  end
end
```

1. 保存すると自動でテストが走り、こける
1. バリデーションを追記

```ruby:app/models/post.rb
validates :title, presence: true
```

1. 保存すると自動でテストが走り、合格する

-----
ブログやってます：[PAPA-tronix !](http://weed.cocolog-nifty.com/wzero3es/)
変則的なCSVを処理する


* 1~2行目がCSV
* 3行目以降がただのテキスト

のような不規則なCSVを手っ取り早く処理する方法。

```csv:data.csv
foo,bar,baz
foo,bar,baz
comment1
comment2
comment3
```

```php:php.php
<?php
$csv = new SplFileObject('data.csv');
$line1 = $csv->fgetcsv();
$line2 = $csv->fgetcsv();
$line3 = $csv->fgets();
$line4 = $csv->fgets();
$line5 = $csv->fgets();

var_dump($line1, $line2, $line3, $line4, $line5);
```

上記のように書くと

* 1~2行目は配列になる。
* 3~5行目は文字列になる。

```text:output
array(3) {
  [0] =>
  string(3) "foo"
  [1] =>
  string(3) "bar"
  [2] =>
  string(3) "baz"
}
array(3) {
  [0] =>
  string(3) "foo"
  [1] =>
  string(3) "bar"
  [2] =>
  string(3) "baz"
}
string(9) "comment1\n"
string(9) "comment2\n"
string(9) "comment3\n"
```
xpathで正規表現を使う (registerXpathPhpFunctionsの使い方)

``` php
<?php
use Zend\Dom\Query;

$query = new Query();
$query->registerXpathPhpFunctions();
$query->setDocument(file_get_contents('http://ugnews.net/'));
$result = $query->queryXpath('//title[php:functionString("preg_match", "/ugnews/i", node()) = 1]');
var_dump($result->current()->nodeValue);
```
サロゲートペアの取り扱い(rubyとmacrubyの違い)

サロゲートペアを含む文字列に対して、バックシュラッシュ記法で特定のサロゲートペアを検出しようとしたときの挙動が、rubyとmacrubyで異なる。

macrubyの場合

>$ macirb
>irb(main):001:0> "\xF4\x8F\xB5\x88-hydroxy alkylthiols".include?("\xF4")
>=> true
>irb(main):002:0> i = "\xF4\x8F\xB5\x88-hy".ord
>=> 56319
>irb(main):003:0> i.chr("UTF-8")
>RangeError: 56319 out of char range

rubyの場合

>$ irb
>1.9.3-p327 :001 > "\xF4\x8F\xB5\x88-hydroxy alkylthiols".include?("\xF4")
> => false
>1.9.3-p327 :001 > i = "\xF4\x8F\xB5\x88-hy".ord
> => 1113416
>1.9.3-p327 :002 > i.chr("UTF-8")
> => "

サロゲートペアを含む文字列をHTMLに埋め込んでWebViewに表示しようとしても、なにも表示されないので注意が必要。