OmniAICreator/Qiita-1.07M huggingface dataset:
sendagaya.rbを立ち上げてました #sendagayarb

3ヶ月ほど前、2012年5月2日(水)にsendagaya.rbというコミュニティを立ちあげてました。[@fukajun](http://twitter.com/fukajun)さんと一緒にやってます。第1回以外は毎週月曜日に開催してます。

# drinkupの話

普段あまり懇親会を開けていないので、先日2012年7月27日(金)には[Drinkup](http://sendagayarb.doorkeeper.jp/events/1314)を開催しました。Pizzaと寿司をつまみながらのLT大会盛り上がりました。皆さんの協力のおかげで[盛り上がりました(リンク先は当日のtogetter)](http://togetter.com/li/345930)。

<iframe align="center" src="http://www.flickr.com/slideShow/index.gne?group_id=&user_id=&set_id=72157630782742872&text=" frameBorder="0" width="500" height="500" scrolling="no"></iframe><br/><small>Created with <a href="http://www.admarket.se" title="Admarket.se">Admarket's</a> <a href="http://flickrslidr.com" title="flickrSLiDR">flickrSLiDR</a>.</small>

LTは[@fukajun](http://twitter.com/fukajun)さんのWebアプリで順序を決めて行いました。皆さんのLT資料は分かる範囲で載せておくと以下の感じです。

* [Sendagaya.rb Drinkup](https://docs.google.com/presentation/d/1c1qBU1ux2tgpx_kNo_omlH6YwxygzZ78T9yclkMGV3s/edit)
* [RailsでPaypal](http://www.slideshare.net/hirotakamizutani/drinkup-lt) by [@icb54615](http://twitter.com/icb54615)
* [Web制作者のミカタRuby](http://nameless-inlet-9563.herokuapp.com/) by [@kozo002](http://twitter.com/kozo002)

* [omniauth-scaffoldによるチートTwitterログイン実装](https://rublio.herokuapp.com/pages/show/20) by [@shu_0115](http://twitter.com/https://twitter.com/shu_0115)

* [Rails Apps Composer](http://www.mindmeister.com/ja/189281903/railsappscomposer) by [@quattro_4](http://twitter.com/quattro_4)


# これまでの活動

毎週開催していたので、次回で[13回目](http://www.zusaar.com/event/347006)です。今までのsendagaya.rbのまとめは、[githubのmokmok repository](http://github.com/sendagayarb/mokmok)にもありますが改めて資料を作成しました。今回、私がLTで話したのはこれ。

<iframe src="http://www.slideshare.net/slideshow/embed_code/13772288" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="http://www.slideshare.net/naotokoshikawa/sendagayarrb" title="Sendagayar.rb これまでを振り返ってみる" target="_blank">Sendagayar.rb これまでを振り返ってみる</a> </strong> from <strong><a href="http://www.slideshare.net/naotokoshikawa" target="_blank">Naoto Koshikawa</a></strong> </div>

# 今後

当初は、みんなで集まってモクモク作業をすることでモチベーションを高めていたのですが、最近せっかく人が集まっているんだしもう少し話してみようか、ということで気軽に相談出来る居心地の良いコミュニティにしていこうかなと思っています。今までにも相談会のような会はありました。

* [OAuthのクライアント実装の相談](https://github.com/sendagayarb/mokmok/tree/master/2012-05-21)
* [RESTfulなURL設計相談](https://github.com/sendagayarb/mokmok/tree/master/2012-06-25)
* [backbone.js雑感](https://github.com/sendagayarb/mokmok/tree/master/2012-07-09)

また、先日は相談会から発展させた、[Railsにおける RESTfulなURL設計 勉強会](https://github.com/sendagayarb/mokmok/tree/master/2012-07-23)を開催しました。こちらは好評だったのと後半の相談会が出来なかったので第二回を考えてます。

気軽にmokmokしたり相談してみたり、みんなの前でLTしてみたりしたい方は是非参加して下さい。普段の連絡はFacebookの[Sendagaya.rb](https://www.facebook.com/groups/132324356892674)というグループで行なっています。
PHPスクリプトを直接起動しないための.htaccess


シナリオとしては、拡張子がjsonのリクエストがあった場合に、一度index.phpを通す、という想定。index.phpはコントローラではなく、変換スクリプトなので直接アクセスを避けたいとします。(コントローラであっても、URLを統一するために隠蔽したいケースもありますね)

よく使われるのは、PHPで特定の定数定義がないと、受け付けない形。ただ、アクセスを制限すべき全ファイルに必要になり、あまりキレイに書けません。

ここでは、それは避けて.htaccessでなんとかしてみたいと思います。もっとスマートな書き方があれば、ぜひコメント下さい。

##方法A: FilesMatchを使う

多分、これがオススメ。ちょっと長いけど。

```.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule \.json$ index.php [QSA,L]

<FilesMatch "index.php">
Order Deny,Allow
Deny from All
Allow from env=REDIRECT_STATUS
</FilesMatch>
```

##方法B: RewriteCondでREDIRECT_STATUSをチェック

ときどき見かける方法。ただ、環境によって「200」じゃないことがあり、その場合動かず。

```.htaccess
RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} !=200
RewriteRule index.php - [F]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule \.json$ index.php [QSA,L]
```

##方法C: RewriteCondでREQUEST_URIをチェック

こちらも、サーバ次第。REQUEST_URIが途中のルール適用で書き変わるケースがあり、そうするとNG。(Apacheのドキュメントサイトによれば、SCRIPT_URIを使えば途中で書き変わらないよ、とあるのだけれどそちらも動かない?)

```.htaccess
RewriteEngine On
RewriteCond %{REQUEST_URI} index.php
RewriteRule ^ - [F]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule \.json$ index.php [QSA,L]
```

## 結論

nginxな昨今、Apacheで頑張るのもどうかと思いつつ、Herokuで動く方法を探しました。動いたのは、方法Aのみ。Aを使います。
小数を整数に変換

```js
console.log(Math.trunc(12.05)) //12
console.log(Math.trunc(-12.95)) //-12
console.log(Math.trunc(5000000000.1)) //5000000000
```


以下のようなビット演算子を使う方法は大きい値ではうまくいかない。
（@fujitanozomuさんからご指摘頂きました。）

```js
console.log(12.05>>0) //12　OK
console.log(-12.95>>0) //-12 OK
console.log(5000000000.1>>0) //705032704 NG
```
UIImageを任意の大きさにリサイズする


指定された大きさにできるだけ入るように、リサイズと切り出しを行う

```objectivec
+(UIImage *) clipImage:(UIImage *)original resize:(CGSize)resize
{

    // リサイズ画像のx,y,width,heightを算出
    float resized_x = 0.0;
    float resized_y = 0.0;
    float resized_width = resize.width;
    float resized_height = resize.height;

    // 縦横それぞれの「倍率」を算出し、より大きな倍率（＝大きな画像）を採用する。
    float ratio_width = resize.width/original.size.width;
    float ratio_height = resize.height/original.size.height;
    if( ratio_width < ratio_height ){
        // 縦の倍率採用
        resized_width = original.size.width*ratio_height;
        resized_x = (resize.width-resized_width)/2; // 横ははみ出る
    }else{
        // 横の倍率採用
        resized_height = original.size.height*ratio_width;
        resized_y = (resize.height-resized_height)/2; // 縦ははみ出る
    }
    
    // リサイズとクリップ処理
    CGSize resized_size = CGSizeMake(resize.width ,resize.height);
    UIGraphicsBeginImageContext(resized_size);
    // はみ出してる部分を切り落とす
    [original drawInRect:CGRectMake(resized_x, resized_y, resized_width, resized_height)];
    UIImage* resized_image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return resized_image;
}


```
シミュレータ上で表示している任意のビューをRubyMotion REPLでのselfにする


RubyMotionのREPL（rake後に表示されるコンソール）を起動した状態で、シミュレータに表示されているビューを`Command`キーを押しながら選択すると、REPLでのselfがそのビューになります。

```ruby
(main)> self
#=> main
(main)> self.class
#=> TopLevel

# シミュレータ上でCommandキーを押しながらselfにしたいビューをクリック

(<UIView:0x8e362f0>)> self
#=> <UIView:0x8e362f0>
(<UIView:0x8e362f0>)> self.class
#=> UIView
```

こういうのはどこでまとめてあるのだろうか。。
MacRuby で OSX 10.8 の NSSharingService を使う


NSSharingService を使用すると、簡単に Twitter にツイートを投稿できるようです。


# MacRuby Nightly をインストール
Xcode 4.3.3 から Xcode の Framework のサーチパスが変わったらしく、MacRuby アプリケーションを作成しようとするとビルドエラーになります。
https://github.com/MacRuby/MacRuby/issues/107

そこで、最新の MacRuby Nightly インストールします。
https://macruby.macosforge.org/files/nightlies/

# Xcode で NSSharingService を使用するアプリケーションを作成
MacRuby Applications というXcode のテンプレートを用いて、アプリケーションのプロジェクトを作成します。

その後、以下のようなコードを `AppDelegate.rb` に記述すると簡単な通知が行えます

```ruby:AppDelegate.rb
class AppDelegate
  attr_accessor :window
  def applicationDidFinishLaunching(a_notification)
    # Insert code here to initialize your application
    serv = NSSharingService.sharingServiceNamed(NSSharingServiceNamePostOnTwitter)
    serv.performWithItems(["test tweet"])
  end
end
```

アプリケーションを実行すると、以下のようにメッセージが埋め込まれた状態でツイートするためのウィンドウがポップアップします。

![Tweet](http://s1-05.twitpicproxy.com/photos/full/625054371.png)
MacRuby で OSX 10.8 の NSUserNotificationCenter を使う


# MacRuby Nightly をインストール
Xcode 4.3.3 から Xcode の Framework のサーチパスが変わったらしく、MacRuby アプリケーションを作成しようとするとビルドエラーになります。
https://github.com/MacRuby/MacRuby/issues/107

そこで、最新の MacRuby Nightly インストールします。
https://macruby.macosforge.org/files/nightlies/

# Xcode で通知を行うアプリケーションを作成
MacRuby Applications というXcode のテンプレートを用いて、アプリケーションのプロジェクトを作成します。

その後、以下のようなコードを `AppDelegate.rb` に記述すると簡単な通知が行えます

```ruby:AppDelegate.rb
module Notification
  module_function
  def send(title, text)
    notification = NSUserNotification.alloc.init
    notification.title = title
    notification.informativeText = text

    center = NSUserNotificationCenter.defaultUserNotificationCenter
    center.scheduleNotification(notification)
  end
end

class AppDelegate
  attr_accessor :window

  def applicationDidFinishLaunching(a_notification)
    Notification.send("title", "text")
  end
end
```
システム環境で設定されたプロキシーをwget, curlで使う

Mac OSXではコマンドライン上からシステムで使用されているプロキシーの設定を見ることが難しい．そこで，システムのプロキシー設定を取得してexportを出力するプログラムを書いてみた．

```php

#!/usr/bin/env php
<?php

function MacNetworkGetServiceName($interface = NULL) {
	if (!is_string($interface)) $interface = MacNetworkGetInterface();
	exec('networksetup -listnetworkserviceorder', $output);
	$network = FALSE;
	foreach ($output as $line) {
		if (preg_match('%^\(\d+\) (.+)$%m', $line, $match)) {
			$network = $match[1];
			continue;
		}
		if (preg_match('%Device: ([^, \)]+)%', $line, $match)) {
			$device = $match[1];
			if ($interface === $device) return $network;
		}
	}
	return NULL;
}

function MacNetworkGetInterface($ip_address = '0.0.0.0') {
	if (ip2long($ip_address) === FALSE) return NULL;
	exec("route -n get $ip_address", $output);
	foreach ($output as $line) {
		$line = array_map('trim', explode(':', trim($line), 2));
		if (count($line) != 2) continue;
		if (strtolower($line[0]) == 'interface') return $line[1];
	}
	return NULL;
}

function MacNetworkGetProxy($type = 'web', $service_name = NULL) {
	if (!is_string($service_name)) $service_name = MacNetworkGetServiceName();
	$type = strtolower($type);
	if (!in_array($type, array(
	    'ftp', 'web', 'secureweb', 'streaming', 'gopher', 'socksfirewall'))) {
		return NULL;
	}
	exec("networksetup -get{$type}proxy $service_name", $output);
	$server = ''; $port = 0;
	foreach ($output as $line) {
		$line = array_map('trim', explode(':', trim($line), 2));
		if (count($line) != 2) continue;
		$key = strtolower($line[0]);
		if ($key == 'enabled') {
			if (in_array(strtolower($line[1]), array('no', 'false')) || !$line[1]) {
				return FALSE;
			}
		}
		if ($key == 'server') $server = $line[1];
		if ($key == 'port') $port = $line[1];
	}
	if ($server && $port) return "$server:$port";
	return FALSE;
}

$http_proxy = MacNetworkGetProxy('web');
$https_proxy = MacNetworkGetProxy('secureweb');
$socks_proxy = MacNetworkGetProxy('socksfirewall');


if ($http_proxy) {
	echo "export http_proxy='$http_proxy';";
	echo "export HTTP_PROXY='$http_proxy';";
	echo "export FTP_PROXY='http://$http_proxy/';";
	echo "export RSYNC_PROXY='$http_proxy';";
} else {
	echo "unset FTP_PROXY;unset RSYNC_PROXY;";
	echo "unset http_proxy;unset HTTP_PROXY;";
}
if ($https_proxy) {
	echo "export https_proxy='$https_proxy';";
	echo "export HTTPS_PROXY='$https_proxy';";
} else {
	echo "unset https_proxy;unset HTTPS_PROXY;";
}
if ($socks_proxy) {
	echo "export SOCKS_PROXY='$socks_proxy';";
} else {
	echo "unset SOCKS_PROXY;";
}
echo "\n";
```

上記プログラムを proxy_export という名前でパスを通し，

```sh
eval `proxy_export`
```

という感じで実行すると簡単に設定できる(かも)．
LESS記述

##ミックスイン

```css:パラメータなしの場合
.size(){
	height: 200px;
	width: 200px;
}
div{
	.size;
}
```

```css:パラメータありの場合
.size(@h, @w){
	height: @h;
	width: @w;
}
div{
	.size(200px, 200px);
}
```

```css:パラメータあり・デフォルト値を設定する場合
.size(@h:200px, @w:200px){
	height: @h;
	width: @w;
}
div{
	.size; //or .size(200px, 200px);
}
```
コマンドラインからの VPN 接続

Mac OS X でコマンドラインから VPN の接続ができないものかと長らく探していたが，ふとした拍子に networksetup という怪しいコマンドを見つけ，それを使うと実現できることがわかったのでメモ．

```sh
$ networksetup -listallnetworkservices
KUINS PPTP
Bluetooth DUN
USB Gigabit Ethernet
Wi-Fi
Bluetooth PAN
```
で VPN のサービス名を確認する．自分の環境だと KUINS PPTP という VPN が確認できる．

```sh
$ networksetup -connectpppoeservice "KUINS PPTP"
```
とすれば，めでたく KUINS PPTP に接続できます．
in と hasOwnProperty() の違い


基本的なことですが `in` を知らなかったので。両方ともオブジェクトのプロパティの有無を返しますが、`in` は prototype チェーンをさかのぼる一方、`hasOwnProperty()` はさかのぼりません。

```js
function Foo() {
  this.foo = 'Foo!';
}
function Bar() {
  this.bar = 'Bar!';
}
Foo.prototype = new Bar();
Bar.prototype.baz = 'Baz!';

var obj = new Foo();

console.log('foo' in obj); // true
console.log('bar' in obj); // true
console.log('baz' in obj); // true

console.log(obj.hasOwnProperty('foo')); // true
console.log(obj.hasOwnProperty('bar')); // false
console.log(obj.hasOwnProperty('baz')); // false
```
for if のイディオム


RaphaelJS のソースを見ていると、for と if を続けた見慣れないイディオムが使われています。

```js
for (var i = 0; i < 10; i++) if (i % 3 === 0) {
  console.log(i);
}
// 0
// 3
// 6
// 9
```

ループのフィルタリングとして機能します。特別な文法というだけではなく、`for` の `{}` を省略しているだけです。

```js
for (var i = 0; i < 10; i++) {
  if (i % 3 === 0) {
    console.log(i);
  }
}
```

ちなみに `{}` の省略は JSLint を通りません。

RaphaelJS では、オブジェクトの直接のプロパティだけをループしたい時などによく使われています。

```js
function Foo() {
  this.foo = 'Foo!';
}
Foo.prototype.bar = 'Bar!';

var obj = new Foo();

for (var key in obj) {
  console.log(key + ': ' + obj[key] + ' is obj\'s property.');
}
// foo: Foo! is obj's property.
// bar: Bar! is obj's property.

var has = 'hasOwnProperty';
for (var key in obj) if (obj[has](key)) {
  console.log(key + ': ' + obj[key] + ' is obj\'s own property.');
}
// foo: Foo! is obj's own property.
```
Excelマクロで暗号を解読

[君ならどう書く Online 問題文](http://ll.jus.or.jp/2012/doukaku-online-main.html)。

標準モジュールに以下のコードを追加する。
シートのとある列に入力文字列を張り付け、先頭セルを選択してマクロからDecryptプロシージャを実行する。
その結果、入力セルの右隣のセルに(4つおきに)解読された文字が現れる。

コード自体はまっとうですよ。面白みといえば、セル参照を埋め込んでいるので、Excelのワークシート上で入力文字列を変更したらそれに追従することぐらいか。リアクティブプログラミング！

```vbnet:Module1.BAS
Sub Decrypt()
    Set rAll = Range(ActiveCell, ActiveCell.End(xlDown))
    For i = 1 To rAll.Count Step 4
        rAll.Item(i).Offset(0, 1).FormulaR1C1 = "=GetChar(RC[-1]:R[3]C[-1])"
    Next
End Sub

Function GetChar(ByVal r As Range) As String
    If r.Count <> 4 Then
        Exit Function
    End If
    For i = 1 To 4
        a = (a * 4) + Encode(r.Item(i).Value)
    Next
    GetChar = ChrW(a)
End Function

Function Encode(ByVal str As String) As Integer
    Set regex = CreateObject("VBScript.RegExp")
    If IsMAC(str, regex) Then
        Encode = 0
    ElseIf IsIPv4(str, regex) Then
        Encode = 1
    ElseIf IsIPv6(str, regex) Then
        Encode = 2
    Else
        Encode = 3
    End If
End Function

Function IsMAC(ByVal str As String, ByVal regex As Object) As Boolean
    pt = "^[0-9a-f]{2}([:-])[0-9a-f]{2}\1[0-9a-f]{2}\1[0-9a-f]{2}\1[0-9a-f]{2}\1[0-9a-f]{2}$"
    regex.Pattern = pt
    regex.IgnoreCase = True
    IsMAC = regex.Test(str)
End Function

Function IsIPv4(ByVal str As String, ByVal regex As Object) As Boolean
    str = "." & str
    regex.Pattern = "\.(0|[1-9]\d{0,2})"
    regex.Global = True
    Set mc = regex.Execute(str)
    If mc.Count <> 4 Then
        Exit Function
    End If
    If (mc(0).Value & mc(1).Value & mc(2).Value & mc(3).Value) <> str Then
        Exit Function
    End If
    For Each m In mc
        d = CInt(Mid(m.Value, 2))
        If d < 0 Or d > 255 Then
            Exit Function
        End If
    Next
    IsIPv4 = True
End Function

Function IsIPv6(ByVal str As String, ByVal regex As Object) As Boolean
    w = "[1-9a-f][0-9a-f]{0,3}"
    cw = ":" & w
    pt = "^" & w & cw & cw & cw & cw & cw & cw & cw & "$"
    regex.Pattern = pt
    regex.IgnoreCase = True
    IsIPV6 = regex.Test(str)
End Function
```
Certificateが復活する際の対応

説明が大変ややこしいですが、Certificate ErrorでCertificateが重複してるよ、と言われることがある。Keychainから古いCertificateを消すと大抵直るけど、消しても消してもCertificateが復活する場合がある。そんなときは以下をお試しあれ。
http://tapadoo.com/2012/certificates-magically-re-appearing-in-your-keychain-try-this/
バッファ内で正規表現にマッチする行を出力する: color-moccur.el

バッファ内で正規表現にマッチする行を出力するには`occur`というのがデフォルトではいっているのですが、より操作性が優れている`color-moccur`をいれます。

インストールは下記を実行します。

```
M-x install-elisp-from-emacswiki color-moccur.el
```

設定ファイルに下記を追加します。

```common-lisp:~/.emacs.d/init.el
;;; color-occur.el
(require 'color-moccur)
(setq moccur-split-word t) ;スペースで区切られた複数の単語にマッチさせる
```

`M-x occur-by-moccur`で起動します。検索したい単語を入力します。複数の単語の入力もできます。単語を入力したらマッチした行の一覧が表示されるので、`n`や`p`でマッチした箇所をいきいきできます。

また、isearch実行時に`M-o`を押すと、`M-x occur-by-moccur`に切り替えてくれます。

`color-moccur`の特徴として、Migemoをいれていればローマ字でも検索してくれるそうなのですが、残念ながら私の環境ではできませんでした。cmigemoだとだめなのかな。
Sublime Text 2 Macのまとめ

##基本設定
**スキンの変更**

>メニューバー【Sublime Text 2】-【Preferences】-【Color Scheme】

##ショートカット一覧
**コマンドパレットを開く**

>command + shift + P
>またはメニューバー【Tools】-【Command Palette...】

**横分割**

>option + command + [1-4]
>またはメニューバー【View】-【Layout】-【Columns: 2】


##パッケージ
**パッケージの追加**

1. コマンドパレットを起動後、テキストフィールドに`Package Control: Install Package`を入力し実行する。
2. パッケージの一覧が表示されるので追加したいパッケージの名前を入力または選択してインストールする。
3. インストール後は必ずSublime Text 2を再起動する。

**パッケージの停止**

1. コマンドパレットを起動後、テキストフィールドに`Package Control: Disable Package`を入力し実行する。
2. 追加されたパッケージの一覧が表示されるので停止したいパッケージを選択して実行する。

**おすすめパッケージ**

+ **ZenCoding**（マークアップの効率化）
+ **BracketHighlighter**（タグの強調表示）

##設定ファイル
メニューバー【Sublime Text 2】-【Preferences】-【Settings User】の設定ファイルにコードを追加する。

**選択している行をハイライト表示にする**

>"highlight_line": true

**行末の空白を削除する**（ファイル保存時に行末の空白が自動で削除される）

>"trim_trailing_white_space_on_save": true
Gitをソースからコンパイルしてインストールする 


リポジトリが腐っているディストリビューションがある（例えば、CentOS）
自力で入れられないことがある（例えば、さくらのレンタルサーバ・研究室・仕事のサーバ）
なんかリポジトリを整理してyumコマンドとかportコマンドでインストールするのも
面倒っていうときにソースからインストールしちまおうってたまに思うから書こうと思った。

ちなみに僕のだとこんな環境。さくらのレンタルサーバ。

```
$ uname -a
FreeBSD www280.sakura.ne.jp 7.1-RELEASE-p16 FreeBSD 7.1-RELEASE-p16 #0: Fri May  4 06:01:53 JST 2012     root@www280sub.sakura.ne.jp:/usr/obj/usr/src/sys/SAKURA11S  i386
$ which git
/home/zange-box/local/bin/git
$ git --version
git version 1.7.2.1
```

gitは自分でいれたっぽいけど古いし入れなおす。

http://git-scm.com/ から
http://code.google.com/p/git-core/downloads/list に行き
http://code.google.com/p/git-core/downloads/detail?name=git-1.7.11.3.tar.gz&can=2&q= ここまでたどり着く

```
$ wget http://git-core.googlecode.com/files/git-1.7.11.3.tar.gz
$ tar xf git-1.7.11.3.tar.gz
$ cd git-1.7.11.3
```

INSTALLのなかをみる

```
$ less INSTALL
```

```
                Git installation

Normally you can just do "make" followed by "make install", and that
will install the git programs in your own ~/bin/ directory.  If you want
to do a global install, you can do

        $ make prefix=/usr all doc info ;# as yourself
        # make prefix=/usr install install-doc install-html install-info ;# as root
```

こんなの書いてある。なるほど英語よくわからん。
とりあえずいつもの。

```
$ ./configure --prefix=~/local # ~/以下にlocalディレクトリつくってね
$ gmake # CentOSならmakeかな?
$ gmake install # make install
```

正常にインストールできたぽかったら、PATHを確認する

```
$ echo $PATH
/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/home/zange-box/bin:/home/zange-box/local/bin:/home/zange-box/bin:/home/zange-box/pear/bin:/home/zange-box/pear/pear
```

長いけど `/home/zange-box/local/bin` がある
大丈夫そう。
`$ ./configure --prefix=`で指定したディレクトリがなかったら

```
$ emacs ~/.bashrc
```
に `export PATH=$HOME/local/bin:$PATH` を追加してあげる

```
$ git --version
git version 1.7.11.3
```

最新のgitになった。心が安らぐ。


## まとめ

* gitは常に最新版を使う
  * 最新版のほうが親切
* アレなOSはリポジトリをいじいじするよりもソースからインストールするほうが早い

### ちなみに
``` mac
$ git --version
git version 1.7.7.5 (Apple Git-26)
$ brew update
$ brew install git
$ git --version
git version 1.7.11.3
```
複数のログの行数をカウントするスクリプト

ログファイルの行数をそれぞれカウントさせたかったので
awkでスクリプト作ってみた

```bash:count.awk
#/usr/bin/gawk -f
BEGIN {
  FS = ":";
  for (i = 1;i < ARGC;i ++) {
    cnt = 0;
    while(getline < ARGV[i] > 0) {
      cnt ++;
    }
    print ARGV[i]":"cnt
  }
}
```

#使い方
```bash
awk -f count.awk /var/log/httpd/access_log*

/var/log/httpd/access_log:28
/var/log/httpd/access_log.1:141
/var/log/httpd/access_log.2:131
/var/log/httpd/access_log.3:185
/var/log/httpd/access_log.4:153
```

こんな感じで出力されます
PHPで使うGoFパターン ひとり Advent Calendar - アダプター


## アダプターってなに?

要するに無関係な二つの概念を結合させるためのパターンです。

* 継承とインターフェースの実装を利用する
* 継承と移譲を利用する

オブジェクト指向を普段利用している人にとっては、知らず知らずのうちに利用しているパターンではないでしょうか。今更、ふんぞり返ってデザインパターンと呼ぶほどのことではないじゃないか?なんて思ったりしているのではないでしょうか。しかし、このパターンを意識して考えてみると、これを適用することによって複雑度を減らすことが出来た箇所が多いことに気付くと思います。むしろ、継承という概念は、このパターンのために存在しているのではないだろうか? なんて思ったり。むしろ、そういう設計こそ良い設計でありデザインパターンと名前を付けて頭の念頭に置いておく意味のあるものではないかと思います。


## アダプターの構造

* クライアント - 利用者
* Target - 適合する側
* Adaptee - 適合させる側
* Adapter - 実装部分

実際は何も難しい話ではないのですが、これ構造の項目名だけで見ても、よく分からないですし、
また、サンプルソースらしいサンプルソースだと見ても分かり辛いパターンです。
なので、今回はサンプルソースをそれなりに頑張ってみます。

例えば、既存システムに以下の機能が有るとします。

* ECの決済機能
* システムの利用に応じてスコアが貯まっていくゲーミフィケーション機能

これが営業側からの要請によりスコアに応じてEC機能で利用出来るポイントを実装することになりました。アダプタパターン(移譲)を使って実装してみようと思います。

```PHP
<?php
/* Client */
class Register {
    public static function pay (Payment $payment) {
        $payment->pay (new Cart());
    }
}


interface Payment {
    public function pay ($cart);
}

/* Adaptee */
class PaymentImpl implements Payment {
    private $member = null;
    public function __construct($member) {
        $this->member = $member;
    }

    // 決済処理
    public function pay ( $cart ) {
        $subtotal = $cart->getSubTotal();
        print $this->member->getId() . 'さんに' . $subtotal . 'の決済したっす' . "\n";
    }
}



/* Target */
class Score {
    // 加算レコードの追加
    // 既存であったもの
    public function add ( $point ) {
    }


    // 加算レコードのみサマる
    // 既存であったもの
    public function getSum () {
    }

    // 減算レコードの追加
    // 今回追加したもの
    public function minus ( $point ) {
    }

    // 加算・減算をサマって現在の総ポイントを取得
    // 今回追加したの
    public function getSumWithMinu () {
    }

}

/* Adapter */
class PaymentWithScore extends Score implements Payment {
    private $member = null;
    private $scoreRate = 0.1;
    public function __construct ( $member ) {
        $this->member = $member;
    }

    public function pay ($cart) {
        // サンプルなので自動で全ポイントを使用する
        // パターンしか考慮しません
        $cart->addDiscount ($this->member->getScore());
        $subtotal = $cart->getSubTotal();
        print $this->member->getId() . 'さんに' . $subtotal . 'の決済したっす' . "\n";
    }
}

class Cart {
    private $discount = null;
    // 小計を取得
    public function getSubTotal () {
        return 5000 - $this->discount;
    }

    // 割引を設定
    public function addDiscount ( $point ) {
        $this->discount = $point;
    }

    // カートに商品を追加
    public function addProduct ( $prod, $amount ) {
    }
}

class Member {
    public function getId() {
        return 1234;
    }
    public function getScore() {
        return 500;
    }
}
$member = new Member();

Register::pay(new PaymentImpl($member));
// 関係の無いScoreクラスのインターフェースPaymentに適合してる
Register::pay(new PaymentWithScore($member));
```
## アダプターの問題点

素晴しい設計手法ではりますが、多用すると構造を追いづらくなり易いパターンですので、ご利用は計画的に。このパターンは、むしろ既存システムを改修する時に、無関係な構造同士を結ぶ時にクイックハック的に使うものであり、初期からこれが登場するような設計はしてはいけません。また、これを適用する時には「アダプターパターンでっせ」と明示的にするように「HogeWithFuga」のようなクラス名を付けておくのが好みです
MacRuby/RubymotionでObjective-Cのblocksにメソッドを渡す方法


以下のようなコードをMacRuby/MotionRubyで呼び出す方法についてのメモです。

```obj-c
- void hoge(int num, void (^block)(char *str))
{
  /* blocksを利用した何らかの処理 */
}
```

一つはProc.newを利用した呼び出しです。

```ruby
hoge(1, Proc.new{|str| ... })
```

ただProcオブジェクトが長くなるとしつこい書き方になってしまうので、メソッドに切り分けることもできます。Methodオブジェクトからto_procでProcオブジェクトに変換するやり方です。

```ruby
def foo
  hoge(1, method(:bar).to_proc)
end

def bar(str)
  # ...
end
```

大体は素直にProc.newで書くのが良いと思いますが、通信に成功した場合と失敗した場合とでそれぞれクロージャを書くときはコードが長くなりがちなので、メソッド化するなどして、できるだけリーダブルに保ちたいものです。
Mountain Lionの通知センターに通知する

こういう言い方であってるのかわかんないけど
とりあえず

```
NSUserNotification *notify = [[NSUserNotification alloc] init];
[notify setTitle:@"タイトル"];
[notify setInformativeText:@"内容"];
[[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:notify];
```

こんな感じ？
SharpDevelopでターゲットディレクトリをエクスプローラで開く

[前の記事](http://qiita.com/items/b248f6497dd145bcce43)と同様、SharpDevelopでターゲットディレクトリ（.exe出力先）をエクスプローラで開く設定をメモ。

![](https://lh3.googleusercontent.com/-cAfYiiHB19M/UBFsgyXe_QI/AAAAAAAAEW8/nl7sdLvAnlo/s640/2012-07-27_01h06_15.png)

# 設定

[ツール]→[オプション]→[ツール]→[外部ツール]で設定画面を開き、ツールを`追加`して以下のように設定します。

![設定画面](https://lh4.googleusercontent.com/-kHjduONzNzQ/UBFxCV65uSI/AAAAAAAAEXk/-24uw-v1wzM/s800/2012-07-27_01h31_34.png)

タイトル＝`ターゲットディレクトリを開く`
コマンド＝`explorer.exe`
引数＝`/select,${TargetPath}`

# 使い方

ソースコードを編集中に、[ツール]→[ターゲットディレクトリを開く] を実行すればエクスプローラが起動してターゲットディレクトリが開きます。

![](https://lh3.googleusercontent.com/-lrrWjBZtdyc/UBFy374i3DI/AAAAAAAAEXs/VcRijHEZerc/s800/2012-07-27_01h38_59.png)
SharpDevelopで編集中のファイルをVimで開く

自宅では、フリーの開発環境「SharpDevelop」を使って C# での開発を行なっておりますが、
コードスニペットはVimに登録してあるので、デバッグ中以外の編集はVim上で行うことが多いです。

SharpDevelopで編集中のファイルをすぐVimで編集できるようにする設定を備忘録代わりにメモ。

![](https://lh3.googleusercontent.com/-cAfYiiHB19M/UBFsgyXe_QI/AAAAAAAAEW8/nl7sdLvAnlo/s640/2012-07-27_01h06_15.png)

# 設定

[ツール]→[オプション]→[ツール]→[外部ツール]で設定画面を開き、ツールを`追加`して以下のように設定します。

![設定画面](https://lh4.googleusercontent.com/-37qAntgLKlI/UBFuOl30YyI/AAAAAAAAEXQ/fOhbdAWqgU0/s800/2012-07-27_01h19_51.png)

タイトル＝`VIMで編集`
コマンド＝`(gvim.exe のパス)`
引数＝`--remote-silent +${CurLine} ${ItemPath}`

`--remote-silent` は、Vimを多重起動しないためのオプション。

# 使い方

ソースコードを編集中に、[ツール]→[VIMで編集] を実行すればVimで開きます。

![](https://lh3.googleusercontent.com/-rq27WE_Nk9Y/UBFwQlhb47I/AAAAAAAAEXY/-Ak3xtXdPdI/s800/2012-07-27_01h27_29.png)
Mountain Lion を入れた後のApache, PHP, MySQLの設定


勢いでMountain Lion インストールしたら案の定CakePHPとか動かなかったので、必要最低限動作させるために行った設定です。

細かい突っ込みは無しの方向で。

# Apache

- httpd.confが上書きインストールされるので設定を追加する

## .htaccessの設置を許可する設定

- CakePHPなどで.htaccessを使用する事が多いので、設置を許可するようにしておく。

```apache:/etc/apache2/httpd.conf
# 実際には好きなレベルで適用して下さい。

<Directory />
	AllowOverride All
</Directory>
```


## バーチャルホストの設定

- バーチャルホストの数だけ以下の設定を追加しておく
- vhosts.confを読み込ませたりするのも面倒臭かったのでhttpd.conf内に記述


```apache:/etc/apache2/httpd.conf
##########################################################################################################
#
#      dev.webservice.com
#
##########################################################################################################
<VirtualHost *:80>
       ServerAdmin webmaster@localhost
       DocumentRoot "/Users/username/sitename/htdocs/"
       ServerName dev.webservice.com
</VirtualHost>

<directory "/Users/username/sitename/htdocs/">
       order deny,allow
       deny from ALL
       allow from ALL
</directory>
```

## phpライブラリのインクルード

- phpモジュールの読み込みが行われるようにコメントアウトを外しておく

```apache:/etc/apache2/httpd.conf
LoadModule php5_module libexec/apache2/libphp5.so
```

# PHP

- php.iniも上書きされるので、適宜書き換えを行う
- /etc/php.ini.defaultをコピーしてphp.iniを作成し、追加設定を行う

## Timezoneの設定
- Asia/Tokyoに設定する

```php:/etc/php.ini
date.timezone = 'Asia/Tokyo'
```

## MySQLの使用設定追加
- コメントアウトされているので解除しておく

```php:/etc/php.ini
extension=php_mysql.dll
```

## pearのライブラリ追加(使ってる人のみ)

- pearライブラリは/usr/lib/php/pearにあるので、この場所をinclude_pathに追記しておく

```php:/etc/php.ini
include_path = '/usr/lib/php/pear'
```

## mysql.sockの場所の変更

- 全て/tmp/mysql.sockに変更する

```php:/etc/php.ini
...
pdo_mysql.default_socket=/tmp/mysql.sock

...
mysql.default_socket = /tmp/mysql.sock

...
mysqli.default_socket = /tmp/mysql.sock
```

# MySQL

## ソケットファイル
/tmp/mysql.sockを作成しておく。

```bash:

# 念のためmysql.sockの場所を確認
$ mysql_config --socket

# mysql.sockの作成

$ sudo touch /var/mysql/mysql.sock
$ sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock

```

# Apacheの再起動

```bash:
$ sudo /usr/sbin/apachectrl configtest
$ sudo /usr/sbin/apachectrl restart
```


以上
サイトにfacebookのいいねボタンを正しく設置する

Facebook公式のデベロッパーガイドに設置方法が載っております。
http://developers.facebook.com/docs/reference/plugins/like/

正しくいいねボタンを設置するには、
サイトオーナーがデベロッパー登録してAppIDを取得する必要があります。
以下参考になるかとおもいます。
http://blog.communes.jp/honoka/wp/archives/919
http://www.promeshi.com/archives/1042
RaphaelJS の Element.glow() をドロップシャドウに使う


RaphaelJS の `Element.glow()` は、同じ外形を持った半透明の `path`/`shape` を、異なった `storke-width` で多数作成して `set` で包んで返すという実装です。SVG と VML 両方で同じような効果を得るために、このような実装になっているようです。

ドロップシャドウだと大概の場合 offset が必要ですが、offset を設定すると、塗りがないので中の何もない部分が見えてしまいます。`fill: true` とすることで塗りが設定できます。

さらに、同じ `paper` 上の Element に glow を複数設定していると、別の要素の上に影が乗ってしまうことがあります。そういう場合は要素を `toFront()` すると影の上に持っていくことができます。

以上のことをまとめると、以下のようなコードになります。

```js
window.onload = function() {
  var paper = Raphael('paper', 500, 500),
      rects = paper.set(),
      shadows = paper.set();

  // Create rects
  rects.push(paper.rect(201, 175, 50, 50));
  rects.push(paper.rect(100, 150, 100, 100));
  rects.attr({
    'fill': '#1481e3',
    'stroke-width': 0
  });

  // Create shadows
  for (var i = 0; i < rects.length; i++) {
    var rect = rects[i],
        shadow = rect.glow({ offsetx: 20, offsety: 20, fill: true });
    shadows.push(shadow);
  }

  // Bring rects to the front
  rects.toFront();
};
```

しかし IE で VML の表示を見ると、影の中が影の淵の方よりも色が薄いという変なことになってしまいます。このあたり、何とかならないんでしょうか。
RaphaelJS の animate() を jQuery Deferred と一緒に使う


jQuery の `animate()` は Deferred オブジェクトを返すので、[jQuery Deferred を使って対象の違うアニメーションを順番に実行](http://qiita.com/items/c7de4f0aca773cd5225c) のように `pipe()` を使って順番に実行したり、`when()` で複数のアニメーションが終わるまで待ったり、柔軟なフロー制御ができます。一方、RaphaelJS の `animate()` は `Element`/`Set` を返すので、そのままだと同様に扱うことができません。

そこで RaphaelJS の `Element`/`Set` に、jQuery の `Deferred` オブジェクトを返す `animate()` 的なものを追加してみました。`Element`/`Set` の `prototype` は、それぞれ `Raphael.el` と `Raphael.st` から参照できます。

```js
Raphael.el.animateWithDeferred = Raphael.st.animateWithDeferred = function(params, ms, easing, callback) {
  var dfd = $.Deferred();
  this.animate(params, ms, easing, function() {
  	if (typeof callback === 'function') {
		  callback.apply(this, arguments);
    }
    dfd.resolve();
  });
  return dfd;
};
```

単純に callback をラップして `Deferred#resolve()` を呼ぶ実装です。これですと、もともとの `animate()` と違い、`Animation` オブジェクトを引数にとることができません。`Animation` オブジェクトにも対応したい場合は、以下のような感じにすると良いでしょう。

```js
Raphael.el.animateWithDeferred = Raphael.st.animateWithDeferred = function(params, ms, easing, callback) {
  var dfd = $.Deferred(),
      isAnim = typeof params.anim === 'object',
      originalCallback = isAnim ? params.anim[100].callback : callback,
      callbackWithDeferred = function() {
        if (typeof originalCallback === 'function') {
          originalCallback.apply(this, arguments);
        }
        dfd.resolve();
      };
  if (isAnim) {
    params.anim[100].callback = callbackWithDeferred;
    this.animate(params);
  } else {
    this.animate(params, ms, easing, callbackWithDeferred);
  }
  return dfd;
};
```

ちなみに `Animation` オブジェクトを `Set#animate()` に渡すと、全ての子要素でアニメーションが終わるたびに callback が呼ばれてしまうのでので注意が必要です。
CPU使用率が何パーセント以上のプロセスをkillするみたいなの


CPU使用率が何パーセント以上のプロセスをkillするみたいなの

```bash
ps auxwww | sort -k3 | grep '[PROCESSNAME]' | tail -n3 | awk '{if($3>[何パーセント]) print $2}'
```
これで抽出される。

例)

```bash
ps auxwww | sort -k3 | grep -w '^hogeuser' | tail -n3 | awk '{if($3>30) print $2}' | xargs kill
```
hogeuserがオーナーの上位3つのCPU使用率が30％以上のプロセスをkill。
凶暴なコマンドなので常用はおすすめしません。
Rails::Koala  mobileのDialogを利用する


MobileのDialogを利用したい場合は、parameterに下記を加える。
:display => "touch" 

###

 redirect_to Koala::Facebook::OAuth.new.url_for_oauth_code(   :permissions=>"email,publish_actions,friends_about_me,user_about_me,user_birthday,user_likes", :callback => "http://#{Rails.application.config.host}/oauth/redirect",:display => "touch" ) and return

###
CentOS 5.4 に Python 2.7.3 を install


## ダウンロード
```
$ wget http://www.python.org/ftp/python/2.7.3/Python-2.7.3.tgz
$ tar xvzf Python-2.7.3.tgz
```

## コンパイル & インストール
```
$ cd Python-2.7.3
$ ./configure --enable-shared --prefix=/usr/local/python2.7.3
$ make
$ make install
```

## 動作確認
```
$ /usr/local/python2.7.3/bin/python -V
Python 2.7.3
```

## 動作確認で下記のエラーが発生したら
```
$ /usr/local/python2.7.3/bin/python -V
/usr/local/python2.7.3/bin/python: error while loading shared libraries: libpython2.7.so.1.0: cannot open shared object file: No such file or directory
```

### 共有ライブラリの確認
```
$ ldd /usr/local/python2.7.3/bin/python
        libpython2.7.so.1.0 => not found
        libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003eaa000000)
        libdl.so.2 => /lib64/libdl.so.2 (0x0000003ea9c00000)
        libutil.so.1 => /lib64/libutil.so.1 (0x0000003eb6a00000)
        libm.so.6 => /lib64/libm.so.6 (0x0000003ea9800000)
        libc.so.6 => /lib64/libc.so.6 (0x0000003ea9400000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003ea9000000)
```

	libpython2.7.so.1.0 => not found

上記の状態の場合、ライブラリへのシンボリックリンクを/lib64配下に作成。

```
ln -s /usr/local/python2.7.3/lib/libpython2.7.so.1.0 /lib64/
```
jQueryで実装しているXML,JSON parserを覗いてみる


```javascript

parseJSON: function( data ) {
    if ( typeof data !== "string" || !data ) {
        return null;
    }

    // Make sure leading/trailing whitespace is removed (IE can't handle it)
    data = jQuery.trim( data );

    // Attempt to parse using the native JSON parser first
    if ( window.JSON && window.JSON.parse ) {
        return window.JSON.parse( data );
    }

    // Make sure the incoming data is actual JSON
    // Logic borrowed from http://json.org/json2.js
    if ( rvalidchars.test( data.replace( rvalidescape, "@" )
        .replace( rvalidtokens, "]" )
        .replace( rvalidbraces, "")) ) {

        return ( new Function( "return " + data ) )();

    }
    jQuery.error( "Invalid JSON: " + data );
},

// Cross-browser xml parsing
parseXML: function( data ) {
    if ( typeof data !== "string" || !data ) {
        return null;
    }
    var xml, tmp;
    try {
        if ( window.DOMParser ) { // Standard
            tmp = new DOMParser();
            xml = tmp.parseFromString( data , "text/xml" );
        } else { // IE
            xml = new ActiveXObject( "Microsoft.XMLDOM" );
            xml.async = "false";
            xml.loadXML( data );
        }
    } catch( e ) {
        xml = undefined;
    }
    if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
        jQuery.error( "Invalid XML: " + data );
    }
    return xml;
},

```
AppCodeにスニペットの登録


* AppCodeを開いて `Settings` => `Live Templates` から編集可

* `Abbreviation : 登録名`

* `Description : 説明`

* ステークホルダーにしたい値は`$`で囲む => `$hoge$`

* `Edit valiables`ボタンを押すと`$`で囲んだ値の設定ができる

  * Name => `$`で囲まれた値
  * Expression => スニペット呼んだときに補完リスト？が開かれる。詳細はよくわかってない。。。
  * Default Value => デフォルト値

--

例). UIViewのframeのログを吐き出す

Abbreviation => `logf`
Description => `log frame value`



```Objective-C
CGRect frame = $frame$
NSLog(@"frame => ((%f, %f), (%f, %f))", frame.origin.x, frame.origin.y, frame.size.width, frame.size.height);
```

Settingは以上。

あとはコード書く際に、
`logf`とタイプしてから`Tab`キーを押すと補完できます。

--

Xcodeに登録しているスニペットも呼べたら良いんですけど、そんな機能はないんですかねー。
ただしい文字コードを送っても化けてしまうとき

* mbstring.http_input
* mbstring.http_output
* mbstring.internal_encoding
* mbstring.detect_order

のどれにも同じ文字コードを入れて、そのコードで送っても文字化けしてしまうとき、
.htaccessに書くと文字化けが解消されたもの。
（php.iniを書き変えられない場合。）

```
  php_value output_handler                none 
  php_flag  mbstring.encoding_translation Off 
```
railsのValidationで<div>がぶっ込まれてスタイルが崩れたら

ActionView::Base.field_error_procをオーバーライドする

rails2系なら
config/environment.rbに追加

```
ActionView::Base.field_error_proc = Proc.new {|html_tag, instance|  %(<span class="fieldWithErrors">#{html_tag}</span>)} 
```

rails3系なら
config/application.rbに追加

```
config.action_view.field_error_proc = Proc.new { |html_tag, instance| "<span class='field_with_errors'>#{html_tag}</span>".html_safe }
```
3系はhtml_safe指定しないとタグがescapeされるので
RubyMotionからCocoaPodsを使う


GemfileとRakefileにそれぞれ以下のように設定して、`rake`を叩くだけで使えるようになる（一緒にコンパイルしてくれる）。

```ruby:Gemfile
source :rubygems
gem 'motion-cocoapods'
```

```ruby:Rakefile
# -*- coding: utf-8 -*-
$:.unshift("/Library/RubyMotion/lib")
require 'motion/project'
require 'motion-cocoapods'

require 'rubygems'
require 'bundler'
Bundler.require

Motion::Project::App.setup do |app|
  # Use `rake config' to see complete project settings.
  app.name = 'hogehoge'
  app.pods do
    pod 'STLOAuth'
  end
end

```

cocoapodsを追加する場合は、まず`/vendor/Pods`ディレクトリを削除してから、再度`rake`コマンドを走らせる必要がある。
迷路の自動生成


(main 大きさ) で迷路を自動生成してsvgをプリントする。

```$ arc < maze.arc > maze.svg```

のようにしてファイルに書き出せばブラウザで生成した迷路を見ることが出来る。

```arc:maze.arc
(def get-pos ((y . x)) (and (<= 0 y) (< y h) (<= 0 x) (< x w) ((maze y) x)))
(def dig-pos ((y . x)) (sref (maze y) nil x) (cons y x))

(def get-dir-pos ((y . x) d n)
  (case d
    a (cons (- y n) x) b (cons (+ y n) x)
    l (cons y (- x n)) r (cons y (+ x n))))

(def can-dig? (pos d) (get-pos (get-dir-pos pos d 2)))
(def dig (pos d) (dig-pos (get-dir-pos pos d 1)) (dig-pos (get-dir-pos pos d 2)))
(def rget (g) (let x (rand-elt g) (cons x (rem x g))))
(def cdir (d) (case d a 'b b 'a l 'r r 'l))
(def ndir (d) (rem (cdir d) all-dirs))

(= all-dirs '(a b l r))
(def iter (pos d digd)
  (if digd
      (if d
          (let d (rget d)
            (if (can-dig? pos (car d))
                (let np (dig pos (car d))
                  (iter np (ndir (car d)) (cons np digd)))
                (iter pos (cdr d) digd)))
          (let pg (rget digd)
            (iter (car pg) all-dirs (cdr pg))))))

(= box-size 5)
(def print-maze (x y)
  (each line maze
    (= x 0)
    (each itm line
      (if itm (pr "<svg:rect x=\"" (* x box-size) "px\" y=\"" (* y box-size)
                  "px\" width=\"" box-size "px\" height=\"" box-size
                  "px\" fill=\"black\" stroke=\"none\" />\n"))
      (= x (inc x)))
    (pr "\n")
    (= y (inc y))))

(def main (size)
  (= h size) (= w size)
  (= maze (n-of h (n-of w t)))
  (dig-pos '(1 . 1))
  (iter '(1 . 1) all-dirs '((1 . 1)))

  (pr "<?xml version=\"1.0\" encoding=\"utf-8\"?>")
  (pr "<svg:svg xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:si=\"http://xmlns.ticketstar.jp/2012/site-info\" version=\"1.1\" viewBox=\"0 0 "
      (* box-size w) " "
      (* box-size h) "\" preserveAspectRatio=\"xMinYMin meet\" si:version=\"0.0\">\n")
  (print-maze 0 0)
  (pr "</svg:svg>\n"))

(main 35)
```
PHPで使うGoFパターン ひとり Advent Calendar - ストラテジー


## ストラテジーってなに?
戦略って意味ですね。実行時の状況ごとにアルゴリズムを切り替える…… というデザインパターンです。この記事の想定読者であるPHPプログラマが主に使うPHPやJavaScriptではクロージャなんかも有るのでオブジェクト指向のこのパターンを大真面目に適用することも少いかも知れませんが一応基礎ということで。
JDKや.NETFrameworkの中だと、ソートする時のComparatorとかもこのパターンだと思います。


```PHP
<?php
function buildEscaper ( $type ) {
  $type = strtolower ( $type );
  if     ( $type == 'html'  ) return function ( $s ) { return htmlspecialchars ( $s, ENT_QUOTES ); }
  elseif ( $type == 'url'   ) return function ( $s ) { return urlencode ( $s ); }
  elseif ( $type == 'regex' ) return function ( $s ) { return preg_quote ( $s ); }
  elseif ( $type == 'sql'   ) return function ( $s ) { return mysql_real_escape_string ( $s ); }
  else   throw new Exception ( 'そんなの有りません|' . $type );
}

$h = buildEscaper ( 'html' );
print $h ( '<html>' );
```

## ストラテジーの構造

* コンテキスト - 使用者
* ストラテジーインターフェース - インターフェースね
* 実ストラテジー - 実際のアルゴリズム

## それぞれのクラス構造
```PHP
<?php
/* Context */
class TemplateEngine {
  private $_Escaper = null;
  private $_TemplatePath = null;
  private $_Params = array ();

  public function __construct ( $escaper ) {
    if ( !( $escaper instanceof IEscaper ) )
      throw new Exception ( 'Escaperじゃないもん' );
    $this->_Escaper = $escaper;
  }

  public function setTemplatePath ( $path ) {
    if ( !is_file ( $path ) )
      throw new Exception ( 'そんなファイル無いもん' );
  }

  public function assign ( $s ) {
    print $this->_Escaper->escape ( $s ); 
  }

  public function parse () { 
    ob_start ();
    include $this->_TemplatePath;
    return ob_get_clean();
  }

  public function setParam ( $key, $val ) {
    $this->_Params[$key] = $val;
  }

  public function getParam ( $key ) {
    return $this->_Params[$key];
  }
}

/* Strategy Interface */
interface IEscaper {
  public function escape();
}

/* Strategy */
class HTMLEscaper implements IEscaper {
  public function escape ( $s ) { return htmlspecialchars ( $s, ENT_QUOTES ); }
}

class URLscaper implements IEscaper {
  public function escape ( $s ) { return urlencode ( $s ) ; }
}

class RegExpEscaper implements IEscaper {
  public function escape ( $s ) { return preg_quote ( $s ) ; }
}

class SQLEscaper implements IEscaper {
  public function escape ( $s ) { return mysql_real_escape_string ( $s ) ; }
}

```

## HTMLテンプレート
```PHP 
<html>
<body>
<table>
<?php foreach ( $this->getParam ( 'arr' ) as $row ): ?>
<tr>
  <td><?php $this->assign ( $row->id ) )?></td>
  <td><?php $this->assign ( $row->name ) )?></td>
</tr>
<?php endforeach; ?>
</table>
</body>
</html>
```
## SQLテンプレート
```SQL
SELECT * FROM tbl WHERE name = '<?php $this->assign ( $this->getParam('name') ) ?>'
```

## 実際に使うところ
```PHP 
<?php
$html = new TemplateEngine ( new HTMLEscaper() );
$html->setTemplatePath ( '/path/to/html_template' );
$html->setParam ( array (
  'arr' => array ( 
    (object)array ('id' => 1, 'name' => '<script>alert("name1");</script>' ) ,
    (object)array ('id' => 2, 'name' => 'name2' ) ,
    (object)array ('id' => 3, 'name' => 'name3' ) ,
  ),
));
print $html->parse();

$sql = new TemplateEngine ( new SQLEscaper () );
$sql->setTemplatePath ( '/path/to/sql_template' );
$sql->setParam ( array ( 'name' => "n'am'e" ) );
print $sql->parse();
.emacs.d/init.el を複数のプラットフォームで安定して動かすためのplatform-p

platform-p.el というライブラリをGithubに置きました。

EmacsにはOS固有の機能が実装されていることがありますが、それらの関数を呼び出す時に``platform-darwin-p``等で囲んでおくと``.emacs.d/init.el``を他プラットフォームに移植した時に変なエラーに悩まされずに済みます。

[.emacs.d/init.el を複数のプラットフォームで安定して動かすためのplatform-p - おんがえしの日記](http://d.hatena.ne.jp/tuto0621/20120725/1343232098)
Xcode デバッガで break した瞬間の UIView の構成

EDIT: 2014-09-26: video フルスクリーン再生中など復数 window がある場合に対応できるように更新

~~~
(lldb) expr -- for(UIWindow *w in [(UIApplication *)[UIApplication sharedApplication] windows]) { (int)printf("%s\n\n", [(NSString *)[w recursiveDescription] UTF8String]); }
<UIWindow: 0xbb25ae0; frame = (0 0; 768 1024); layer = <UIWindowLayer: 0xbb25a30>>
   | <UIView: 0xbb431a0; frame = (20 0; 748 1024); transform = [0, -1, 1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0xbb43250>>
   |    | <UIView: 0xbb43ea0; frame = (0 0; 276 0); autoresize = W+H; layer = <CALayer: 0xbb43f00>>
   |    |    | <UIScrollView: 0xbb441f0; frame = (0 0; 276 0); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0xbb44b70>; layer = <CALayer: 0xbb44410>; contentOffset: {0, 0}>
   |    |    |    | <UILabel: 0xbb47cf0; frame = (70 90; 200 30); text = 'Stream 3 of 3 ...'; clipsToBounds = YES; 
~~~

EDIT: 2013-11-04: このコマンドを憶えられないで毎回このページを参照してるのがイヤになったので、~/.lldbinit に alias を作って `view` で同じことができるようにした。

~~~:~/.lldbinit
command alias view expr -- for(UIWindow *w in [(UIApplication *)[UIApplication sharedApplication] windows]) { (int)printf("%s\n\n", [(NSString *)[w recursiveDescription] UTF8String]); }
~~~
ArgumentError (dump format error for symbol(0x46)):

Rails 3.1.5
Ruby 1.9.3-p194

``` log/development.log
ArgumentError (dump format error for symbol(0x46)):
  app/controllers/application_controller.rb:41:in `authorize'

Rendered /home/www/.rvm/gems/ruby-1.9.2-p318@dm/gems/actionpack-3.1.5/lib/action_dispatch/middleware/templates/rescues/_trace.erb (3.3ms)
Rendered /home/www/.rvm/gems/ruby-1.9.2-p318@dm/gems/actionpack-3.1.5/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.1ms)
Rendered /home/www/.rvm/gems/ruby-1.9.2-p318@dm/gems/actionpack-3.1.5/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (6.7ms)
```

``` app/controllers/application_controller.rb
 40   def authorize                                                                                                                                                                                                                                                             
 41     if session[:user].nil? then                                                                                                                                                                                                                                             

```

よくわからない。。。
素直にRails3.2.xにあげたらなおるのかな。
行カウント

http://www.usptomonokai.jp/PAGE=20120814HASKELL
助けを聞いて。

こういう問題にはLazy ByteStringが楽です。
Lazy ByteStringは、4KB位ごとのチャンクになってるので、
Strict ByteStringとほぼ同じぐらいの速度が出ます。

~~~ {haskell}
import Control.Monad
import qualified Data.ByteString.Lazy.Char8 as L
import System.Environment

main :: IO ()
main = go False =<< getArgs where
  go _ ("-f": rest) = go True rest
  go _ []    = print . gyo =<< L.getContents
  go _ ["-"] = print . gyo =<< L.getContents
  go f files = forM_ files $ \file -> do
    ln <- return . gyo =<<  L.readFile file
    if f
      then putStrLn $ file ++ " " ++ show ln
      else putStrLn $ show ln ++ " " ++ file

gyo :: L.ByteString -> Int
gyo = length . L.lines
~~~
ノイズツイートを除去する「Filtter」をリリースしました

http://filtter.herokuapp.com/
##裏コンセプト
ログインログアウトをかっこよく
##コンセプト
timelineからノイズを除去して質の高いツイートだけを抽出するtwitterクライアント
##フィルタリングのルール
###RTされるつぶやきは良いつぶやき
つぶやきの基本的な評価は、log(公式RT数)でしている。
###人気者とぼっちのリツイられ格差を是正する
きゃりーぱみゅぱみゅが200RTされるのと、ぼっちが200RTされるのは、重みが違う。上記のlogによる評価もその一環。
###多弁な人よりも、寡黙な人のつぶやきの方が価値が高い
多弁な人の一言よりも、寡黙な人が発した人の一言は、相対的に重い。

##使った技術
###基本は、html+css+coffeescript(js)
heroku
sinatra
html
css
coffescript
twitter anywhere

##ポイント
herokuに静的なファイルだけの構成でデプロイしたい場合は、下記を使うといい。
https://github.com/machida/kuroigamen-sandbox
cloneして、一階層したののpublicにファイルをつっこんで、herokuにpushすれば動く。

##苦戦したところ
パラメータいじり。おもしろいツイートだけに絞られているかどうかを手作業で確認しながらつくった。

##他に検討した技術
###jTweetsAnywhere
ブログパーツ的なサイトのプラグインをつくるためのもので、hometimelineの取得などができなかったので、断念した。
Teacupを使えるようにする


まずは本体をインストール。

```sh
gem install teacup
```

プロジェクトに``bundler``を使ってインストールする。
まずは初期化。

```sh
bundle init
```

生成された``Gemfile``に``gem "teacup"``を追記。

```ruby:Gemfile
source "https://rubygems.org"
gem "teacup"
```

インストール。

```sh
bundle install
```

``Rakefile``を編集。
これで完了。

```ruby:Rakefile
$:.unshift("/Library/RubyMotion/lib")
require 'motion/project'
# 以下の2行を追加
require 'bundler'
Bundler.require
```

##参考
https://github.com/rubymotion/teacup/wiki/Installation
Ruby Steady 1 変数と代入


## ローカル変数
* 小文字
* アンダースコア(_)で始まる
* 初期化されていない場合は **nil** が返る
* ブロックの外側で宣言されたローカル変数はブロック内でも有効
* ブロックの内側で宣言された場合はエラー(NameError)となる

```ruby:local.rb
greeting = "Hello"
p greeting + " Ruby!" #Hello Ruby!

def foo
  p greeting #有効
  bar = "test"
end
p bar #これは無効(エラー)
```

## グローバル変数
* 先頭を$にする
* 予約されたグローバル変数がある、例えば$0は実行ファイル名を表示する
* 他に\$LOAD_PATH, \$&, \$*などがある

```ruby:global.rb
def foo
 $greeting = "Hello"
end
p $greeting #Hello"

p $0 #/foo/bar/global.rb
```

## 定数
* 先頭がアルファベットの大文字
* 再代入すると警告が発生
* ただし、変数への参照先のオブジェクト自体に変化があった場合は警告とならない

```ruby:const.rb
Const = "Hello Ruby!"
p Const #Hello Ruby!
Const = "Hello Java!" 
# warning: already initialized constant Const
p Const #Hello Java!
Const.sub!("Java", "Perl")
p Const #Hello Perl!
```

## クラス変数
* クラス変数はクラスが持つ変数、複数のインスタンスからアクセス可能
* 先頭にアットマーク2つ(@@)
* クラス内からのみ参照可能

``` ruby:classValue.rb
class Foo
  @@foo = "first"
  def bar 
    p @@foo
  end
  def change
    @@foo = "second"
  end
end

f1 = Foo.new()
f1.bar #first

f2 = Foo.new()
f2.bar #first
f2.change
f1.bar #second
f2.bar #second
#f1.foo や f1.@@fooはエラー
```

## インスタンス変数
* インスタンスが持つ変数
* 先頭にアットマーク(@)
* インスタンス間で共有されることはない
* 外部からのアクセスは不可、アクセサメソッドを利用する

``` ruby:instanceValue.rb
class Foo
  def initialize
    @foo = "first"
  end
  def getFoo 
    @foo
  end
  
  def setFoo(val)
    @foo = val
  end
  
end

f1 = Foo.new()
p f1.getFoo

f2 = Foo.new()
p f2.getFoo #first
f2.setFoo('second')
p f2.getFoo #second
p f1.getFoo #first
```
## 擬似変数
真・・・true、falseとnil以外の値
偽・・・false, nil


`__FILE__`
現在実行されているプログラムのファイル名
`__LINE__`
現在実行されているプログラムのファイル内の行番号
`false`
偽を表すオブジェクト
`true`
真を表すオブジェクト
`self`
インスタンス自体への参照
`nil`
変数の参照先のオブジェクトがないことをあらわす。偽としても使用可能

## 自己代入
2項演算子のうち、下記のものは自己代入が可能

`+` `-` `*` `/` `%` `**` `&` `|` `^` `>>` `<<` `&&` `||`

``` ruby:self.rb
num = 10
num += 10
p num #20

num >>= 2
p num #5
```

##多重代入
* 複数の変数に対し、一度の代入操作で値を代入することができる
* 変数と代入する値をそれぞれカンマ(,)で区切る

``` ruby:multipleassignment.rb
var1 , var2 = "val1", "val2"
var1 , var2 = var2, var1
lang1, lang2 = ["Ruby","Perl"]
```
Sublime Text 2で全角スペースをハイライト表示するプラグインを作る


pythonわかんないしpluginも作ったことないしtextmateの拡張かなんかが使えるらしいとかあったのけど、
とりあえずやってみた

参考サイト：
http://dev.ariel-networks.com/wp/archives/2419
https://gist.github.com/3338888

```python:FullPitchWhiteSpaceHighlight.py
#!/usr/bin/python
# -*- coding: utf8 -*-
import sublime
import sublime_plugin

class FullPitchWhiteSpaceHighlightListener(sublime_plugin.EventListener):
    # highlight full-pitch white spaces
    def highlight_fullpitch_spaces(self, view):
        view.add_regions('FullPitchWhiteSpaceHighlight',
                         view.find_all(u'　+'),
                         "invalid",
                         sublime.DRAW_EMPTY_AS_OVERWRITE)
    # Called after changes have been made to a view.
    # @override
    def on_modified(self, view):
        self.highlight_fullpitch_spaces(view)

    # Called when a view gains input focus.
    # @override
    def on_activated(self, view):
        self.highlight_fullpitch_spaces(view)

    # Called when the file is finished loading.
    # @override
    def on_load(self, view):
        self.highlight_fullpitch_spaces(view)
```

コメントの中でもチェックしちゃうけど、まぁ、習作ということでご勘弁下さい(；´Д｀)
sublime text2でas3ビルド(mac)


Tools->BuildSystem->New BuildSystem

```as3.sublime-build
{
	"cmd": [
		"(FLEX_SDK_PATH)/bin/mxmlc",
		"${file}"
	],
	"selector": "source.actionscript",
	"encoding": "shift-jis",
	"variants":
	[
		{
			"name": "Run",
			"cmd": [ "open", "${file_base_name}.swf"]
		}
	]
}
```

上記を /Sublime Text2/Packages内に配置

*.asを開いてCmd+B
Kobitoのデータを新しい環境に手動で移行する



**注意：この記述内容は古く，現時点でのKobito.app仕様を反映していません．**


古い環境で作成したQiitaにアップロードしていないKobitoのドキュメントを新しい環境に引き継ぐ方法です．OSXをクリーンインストールし，移行アシスタント等によって環境の移行を行わない場合の対処の仕方です．

## 手順

1. Kobitoのデータ本体は~/Library/Kobito/Kobito.dbです．ですのであらかじめこれを保存しておきます．
2. 新規インストールした際にでKobitoを１度起動してから一旦終了します．
3. 作成されている新規の~/Library/Kobito/Kobito.dbに上書きするだけです．

```bash:console
$ cp old/Library/Kobito/Kobito.db ~/Library/Kobito/Kobito.db
```

簡単ですね．

*****

追記（2015/10/26）

コメントより，[naoyanakazawa](http://qiita.com/naoyanakazawa "naoyanakazawa")さまからご指摘を頂きましたが，上記記載は現時点でのKobito.app仕様を反映していません．データの保存先は"~/Library//Containers/com.qiita.Kobito/"に変更されています．現在のKobito.appでは，app内課金（Kobitoプレミアム）により「複数の Mac の間で Kobito のデータベースを同期できます」が用意されていますので，これを利用するのが望ましいようです．