OmniAICreator/Qiita-1.07M huggingface dataset:
PHPで使うGoFパターン ひとり Advent Calendar - ファサード


ファサードって?
--
要するに「一箇所に全部書くようなヤツはGoFの手によって地獄の業火に投げ込まれるべき」パターンとか「リファクタリングは良いことだ」パターンと呼べそうなパターンです。教訓的意味合いの強いパターンかも知れません。

ファサードは「窓口」という意味です。例えば、MVCフレームワークで作っている時に、やたらめったらコントローラに書いてしまったりすることは無いでしょうか?本来、WebMVCにおけるコントローラはWebシステムに対する依存と業務ロジックを切り離すことを目的として設けられるものです。つまり、大まかに言うとコントローラの役割は以下になりますね。

* Webからの入力の妥当性検証(単純なvalidate)をする
* Webからの入力を業務ロジックに渡す
* 業務ロジックから受け取ったデータを元に業務ロジックを走らせ「HTMLを返す」、「リダイレクトする」、「404、403」などの判断をする

となるはずなのに、はじめはちょっとモデルを叩くだけだったはずが、あーだこーだと改修しているうちにやたら巨大なコントローラが出来上がったりします。単に実行タイミングが一緒であるというだけで意味合い的にも相互関係性が薄い処理を同じところ、あろうことかコントローラに直接追記していったりするから救いようが無かったりしますね。こういう時にファサードパターンを適用します。

ファサードの構造
--
ファサードには使う側と使われる側という構造しかありません。

* ワーカー - ファサードから使われる側
* ファサード - ワーカーを使う側

大きなシステムになるとファサードのファサード、ファサードのファサードのファサードのファサードみたいなものも出来たりするかも知れません。

```
<?php
class Facade {
  public function run () {
    $obj1 = new Worker1();
    $obj2 = new Worker2();
    $obj3 = new Worker3();
    
    if ( $obj1->doMethod() ) return $obj2->doMethod();
    else                     return $obj3->doMethod();
  }
}

class Worker1 {
  public function doMethod () {
    return true;
  }
}

class Worker2 {
  public function doMethod () {
    return 'worker2';
  }

}
class Worker3 {
  public function doMethod () {
    return 'worker3';
  }
}

$obj = new Facade();
print $obj->run ();
```

「ほげ?」と思った方へ
---
コード例だけを見てもイマイチよく分からないですね。普通過ぎるコードです。そこで役割について補足することにします。

端的に言うと「より小さい単位の処理を繋ぎ合わせるのがFacadeです」ということなのです。「OOPなら当たり前じゃボケぇ」というのはごもっとも。では、言い方を変えましょう。「FacadeはWorkerの処理する順番を知っているというだけなのだ」と言うとどうでしょう?そうすると、上の例で言えば、Worker1->doMethod() は Worker2->doMethod() との 関係性を気にせずに実装することが出来ます。Worker1とWorker2の結合度を下げることが出来ますね。Facadeのrunの中ではあまり一時的な変数は置かないようにして順番に従ってメソッドを実行するだけが理想的です。


newしてるけど良いの?
___
「メソッド内でnewして、そのままメソッド呼んでるけど良いの?」と単体テスト書きたい人は思ったことでしょう。実際問題としてはケースバイケースです。「newして実行する」という「最終的な依存を押し付ける役」としてFacadeを利用するというのは良いことにしてあげたいです。なので、そのFacadeについては極力複雑性を排した形で実装してあげたいですね。このnewする問題を受け入れた上で単体テストをする際のコツは以下です。

* 対象のメソッドで new しない代わりに new するメソッドを自身に実装する
* テスト時にinclude_pathの優先度を入れ変える

前者については Facade->run のテストをする時、Facadeを継承してサブクラスを作って行うということです。継承した先で、newするメソッドをオーバーライドしモックに差し替えてやれば良いです。後者については元コードを弄らない代りにinclude_pathの優先順を変えて、同じ名前のファイルでダミークラスを記述しているファイルを先に読ませるということです。

もういっちょ補足
--
Facadeは生成に関するパターンの各種とTemplateメソッドと組み合わせて作ることにより結合度を下げたり重複処理を排除したりすることが出来ます。(ここでやっとクラス設計の妙味が出てきます)
method_exchangeImplementationsでクラスメソッドを置換する

Objective-Cでクラスメソッドを置換するやり方について忘れがちなのでメモ
テストコードを書いてるときなどに、テスト対象のコードの中で呼んでいるクラスメソッドをモックに差し替えたい場合があります。
本来であればその手の依存性はうまい事排除してあげるのが良いのですが、いかんともしがたい場合ですね。

Objective-Cはruntimeに触る事が出来るので割りとサクッとできます。
以下のクラスのメソッドを入れ替えてみましょう。

```Objective-C

@interface GlobalClass : NSObject

+ (BOOL)classMethod;

@end

```

適当なカテゴリで入れ替えたいメソッドと同じ定義のクラスメソッドをそのクラスに生やします。

```Objective-C

#import <objc/runtime.h>

@interface SomelClass(TestCode)

+ (BOOL)replacing_classMethod;

@end

@implementation SomeClass(TestCode)

+ (BOOL)replacing_classMethod {
    // iroiro suruyo
}

@end

```

method_exchangeImplementationsで実装を入れ替えてあげます。
メソッドを入れ替えるコードはこちら

```Objective-C

@interface SomeTestClass : GHTestCase {
    Method oldMethod;
    Method newMethod;
}

@end

@implementation SomeTestClass

- (void)setUp {
    oldMethod = class_getClassMethod([SomeClass class], @selector(classMethod));
    newMethod = class_getClassMethod([SomeClass class], @selector(replacing_classMethod));
    method_exchangeImplementations(oldMethod, newMethod);
}

@end

```

これで入れ替え完了です。

method_exchangeImplementationsで何が起こっているか、前後で値を見てみると、implementationの指す先が変わっているのがわかります。

```Objective-C
Method oldMethod = class_getClassMethod([SomeClass class], @selector(classMethod));
Method newMethod = class_getClassMethod([SomeClass class], @selector(replacing_classMethod));
NSLog(@"oldMethod name is %@, imp is %x", NSStringFromSelector(method_getName(oldMethod)), (NSInteger)method_getImplementation(oldMethod));
NSLog(@"newMethod name is %@, imp is %x", NSStringFromSelector(method_getName(newMethod)), (NSInteger)method_getImplementation(newMethod));

method_exchangeImplementations(oldMethod, newMethod);

NSLog(@"oldMethod name is %@, imp is %x", NSStringFromSelector(method_getName(oldMethod)), (NSInteger)method_getImplementation(oldMethod));
NSLog(@"newMethod name is %@, imp is %x", NSStringFromSelector(method_getName(newMethod)), (NSInteger)method_getImplementation(newMethod)); 

```

```
oldMethod name is classMethod, imp is 375d9
newMethod name is replacing_classMethod, imp is 375f5
oldMethod name is classMethod, imp is 375f5
newMethod name is replacing_classMethod, imp is 375d9
```

以上です。
黒魔法は用法用量を守って楽しく使おう
NavigationBarとStatusBarを半透明にして全画面表示にする

```objectivec
- (void)loadView
{
  [super loadView];
  
  // loadViewで設定しないとviewDidLoadでサイズが全画面仕様にならない
  [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleBlackTranslucent;
  self.navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;
  self.navigationController.navigationBar.translucent = YES;
  self.wantsFullScreenLayout = YES;
}

- (void)viewWillAppear:(BOOL)animated
{
  [super viewWillAppear:animated];
  
  // navigationがpopされて戻ってきた時用
  [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleBlackTranslucent;
  self.navigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;
  self.navigationController.navigationBar.translucent = YES;
  self.wantsFullScreenLayout = YES;
}

- (void)viewWillDisappear:(BOOL)animated
{
  [super viewWillDisappear:animated];
  
  // 全画面表示を戻す
  [UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleDefault;
  self.navigationController.navigationBar.barStyle = UIBarStyleDefault;
  self.navigationController.navigationBar.translucent = NO;
  self.wantsFullScreenLayout = NO;
}
```
NavigationBarとStatusBarを同時に消す

```objectivec
- (void)setBarHidden:(BOOL)hidden animated:(BOOL)animated
{
  NSTimeInterval duration = 0.0;
  if (animated) {
    duration = 0.3;
  }
 
  // 先にStatusBarの表示を始める
  [[UIApplication sharedApplication] setStatusBarHidden:hidden withAnimation:UIStatusBarAnimationFade];
  
  // 表示する場合、実際は先に表示設定にする
  if (!hidden) {
    [self.navigationController setNavigationBarHidden:NO];
  }
  
  [UIView animateWithDuration:duration animations:^{
    self.navigationController.navigationBar.alpha = hidden ? 0 : 1;
  } completion:^(BOOL finished) {
    // 非表示にする場合、アニメーション終了後、非表示設定にする
    if (hidden) {
      [self.navigationController setNavigationBarHidden:YES];
    }
  }];
}
```
追記：StatusBarが既に消えている場合、NavigationBarの位置がずれる問題に対処
WinJS.xhrではURL埋め込みのBASIC認証がエラーになる


(windows8 RTM)

```Javascript:winjs-xhr-basic-error.js
WinJS.xhr(
	type: 'get',
	url: "https://username:password@example.com"
)
```

とURLにBASIC認証の情報を埋め込んでリクエストを送ろうとすると
*0x800c000e - JavaScript 実行時エラー: セキュリティの問題が発生しました。*
と怒られます。

```Javascript:winjs-xhr-basic-error.js
WinJS.xhr(
	type: 'get',
	url: 'https://example.com',
	user: "username",
	password: "password"
)
```

素直にuserとpasswordオプションを使いましょう。
13行のシンプルなPSR-0準拠APCクラスローダー


Symfonyの[ApcUniversalClassLoader](http://docs.symfony.gr.jp/symfony2/book/performance.html)のシンプル版です。

標準的なクラスローダーは、ファイルの存在チェックのために `file_exists()` を使っています。なので、そこそこの規模のアプリケーションは、アクセス毎に数百のファイル情報をチェックしているということになります。カーネルがメモリ上にバッファすることもあるので一概には言えませんが、標準的なクラスローダーはI/Oオーバヘッドが潜在的にあるのです。

`ApcUniversalClassLoader` は「じゃあクラス=>パスのマップをメモリ上にもってそれを手がかりに一発でファイル引き抜けばI/O減るんじゃない？」という発想から来ています。一度読み込まれたクラスは、APCのキャッシュとして保存されます。二回目以降は、キャッシュ上のマップを手がかりにファイルを探します。デプロイなどで、キャッシュ上のファイルパスと実際のファイルパスが乖離する場合がありますが、それは上記のSymfonyのサイトにも注意書きがあります。

今回作ったのは、`ApcUniversalClassLoader`の13行版です。また、以前に書いた[ワンラインPSR-0準拠クラスオートローダー](http://qiita.com/items/5fdbc2681b778a9cd24f)の発展系でもあります。実装は次のようになります。

```php
<?php
$prefix = 'foo.example.com.';

spl_autoload_register(function($class) use ($prefix) {
	if ( false === $path = apc_fetch($prefix.$class) ) {
		$nsEnd = strrpos($class, '\\');
		$file  = strtr(substr($class, 0, $nsEnd), '\\', '/');
		$file .= strtr(substr($class, $nsEnd), '\\_', '//');
		if ( false !== $path = stream_resolve_include_path($file.'.php') ) {
			apc_store($prefix.$class, $path);
		}
	}
	$path and include $path;
});
```

パスの追加は `set_include_path()` を通してやります。

```php
<?php
set_include_path(get_include_path() . PATH_SEPARATOR . __DIR__.'/vendor/twig/twig/lib');
```

## 解説

```
<?php
$prefix = 'foo.example.com.';
// APCはグローバル空間です。
// プロセスごとやアプリごとのスコープはありません。
// なので、キー名にprefixをつけるのが安全です。
// 他のアプリケーションや、プロダクション環境とステージング環境が共存するサーバで、
// キーがバッティングすることを防ぎます。


// とにかく短くしたかったので Closure をそのまま `spl_autoload_register` に渡しています。
spl_autoload_register(function($class) use ($prefix) {

	// APC上にキーがクラス名のデータがあるかチェックします。
	if ( false === $path = apc_fetch($prefix.$class) ) {
		// なければファイルを探しに行きます

		// PSR-0の規定で名前空間のアンダースコアはそのままにするという
		// 決まりがあるので、名前空間とそれ以下は別々に処理しています。
		$nsEnd = strrpos($class, '\\');
		$file  = strtr(substr($class, 0, $nsEnd), '\\', '/');
		$file .= strtr(substr($class, $nsEnd), '\\_', '//');

		// ファイルがあるかチェックします。
		if ( false !== $path = stream_resolve_include_path($file.'.php') ) {
			// あれば、APCに登録します
			apc_store($prefix.$class, $path);
		}
	}

	// $path が false でなければ include します。
	$path and include $path;
});
```

最後の行ですが、`include_once` ではなく `include` にしているのはAPCの性能を最大限に活かすためです。php.iniで `apc.stat = 0` にしておく(デフォルトは1)と、APCはキャッシュされたファイルに更新があるか見に行かなくなります。つまり、APC上でクラス名:ファイルパスのマップがあって、そのファイル自体がAPCにキャッシュされているとハードディスクへの問い合わせは0になるということです。したがって、最大限にオーバヘッドを抑えることができます。言い換えると、このクラスローダーは `file_exists()` のオーバヘッドと、`include` のオーバヘッドを削減できるということです。

ちなみに、APC上のユーザキャッシュを確認するのは `APCIterator` が便利です。[`apc.php`](http://svn.php.net/repository/pecl/apc/trunk/apc.php)があるならそちらでもいいですね。

```
<?php
foreach (new APCIterator('user') as $counter) {
	var_dump("$counter[key]: $counter[value]");
}
```
エラトステネスの篩

書いてた人がいたので…

```scheme:prime.scm
(use srfi-1)
(define (prime n)
  (let loop ((lst (iota (- n 1) 2))(result '()))
	(let ((solve (cons (car lst) result)))
	  (if (< (last lst) (* (car solve) (car solve)))
		(append (reverse result) lst)
		(loop (remove (^(x)(zero? (remainder x (car lst)))) lst) solve)))))
```
```
;(time (prime 10000))
; real   0.011
; user   0.010
; sys    0.000
```
X-update release note(草案)

Ver 1.0 正式リリース版リリースノート

# X-update とは

Apple Store や Google Play (旧Android Market) の様にアプリケーション・ストアから簡単にセットアップできる仕組みを提供する Xoops X ディストリビューションのパッケージ・マネージャです。

X-update を介してアプリケーション・ストアに登録されている様々なアプリケーションをインストールしたりアップデートしたりする事ができます。また、X-update 単体を XOOPS Cube Legacy 2.2 以降のコアに単独でインストールすることも可能です。

## 接続方法

基本的には貴方が管理するウェブサイトのサーバ(以後サーバ)からアプリケーション・ストアへHTTP(S)接続してアーカイブをダウンロードします。その後サーバ上でアーカイブを展開し、適切な場所へ配置します。サーバ上での配置には、PHPで直接(ダイレクト)、FTP、又は SSH2 で行なうことができ、様々なサーバ環境に対応しています。

## 動作用件

+ PHP 5.2.0以上 (必須) / cURLエクステンション (必須)
+ MySQL 5.0 以上 (必須)
+ XOOPS Cube Legacy 2.2.0 以上

## ストア一覧
ストアについては、現在は xopscube.net のストアマスターから取得するようになっていて、今後も拡充予定です。現在の一覧は、X-update の「ストア一覧」をご覧になってください。

また、以下のiniファイルに登録する事で自前のストア開設も可能です。
xoops_trust_path/modules/xupdate/include/modules.ini
xoops_trust_path/modules/xupdate/include/theme.ini

## 詳しい説明

詳しい説明については XUGJ にマニュアルが掲載されています。
http://www.xugj.org/modules/xpwiki/?ModuleManuals%2FX-update
MATCH() 関数で、指定範囲内の文字列を検索する

指定範囲内の文字列を検索するには、MATCH() 関数を使います。

```vb
MATCH(A2,$D$2:$D$5,0) 
```

* 第1引数： 検索したい値
* 第2引数： 検索する範囲($は絶対指定)
* 第3引数： 検索方法。0を指定すると、完全一致するもののみ検索します。
* 返り値： 見つかった場合はインデックスを、見つからなかった場合は #N/A(エラー値)

![](https://lh5.googleusercontent.com/-FGXEkHsjmbo/UDzSKhdKANI/AAAAAAAAElA/0H4ANHid4uw/s800/2012-08-28_23h13_58.png)

今までHLOOKUP,VLOOKUPしか知らなかった。

# 参考

* [ExcelのMATCH関数の使い方](http://www.excel-list.com/match.html)
不変なコレクションクラス(NSSet,NSArray,NSDictionary)で値が空の時の、retainCountの謎


retain/releaseしたときのretainCountについて実験していました。

```objectivec:main.m

#import <Foundation/Foundation.h>

void retainCountLog(NSString *name, id target)
{
    NSLog(@"----");
    NSLog(@"%@ retainCount=%ld",name,[target retainCount]);
    [target retain];
    NSLog(@"%@ retainCount=%ld",name,[target retainCount]);
    [target release];
    NSLog(@"%@ retainCount=%ld",name,[target retainCount]);
}


int main(int argc, const char * argv[])
{

    @autoreleasepool {
        // 通常のオブジェクト
        NSString *str1 = [NSString stringWithFormat:@"hogehoge"];
        retainCountLog(@"str1",str1);    // 1->2->1と変化する。普通のパターン
        
        // 固定文字列の場合は、リリースする必要が無い為か、retainCountは固定となる
        NSString *str2 = @"固定文字列";
        retainCountLog(@"str2",str2);   // -1 → -1 → -1 変化しない。
		// 文字列だけでなく「固定値」は、retainCountが-1となっている。
        retainCountLog(@"[Null null]",[NSNull null]); // -1 -> -1 -> -1 固定文字列と同じ

        
        // 値の入ったコレクション 普通
        NSArray *array1 = [NSArray arrayWithObjects:@"aaa",@"bbb",@"ccc",nil];
        retainCountLog(@"array1",array1); // 1 -> 2 ->1

        // 値の入っていないコレクション （＝普通作らないパターン）
        NSArray *array2 = [NSArray arrayWithObjects:nil];
        retainCountLog(@"array2", array2); // 2->3->2   なぜか2始まり
        NSArray *array3 = [[[NSArray alloc]init]autorelease];
        retainCountLog(@"array3", array3); // 3->4->3   なぜか3始まり
        // この時点で、array2とarray3は同じアドレスを参照している
        
        NSSet   *set1 = [[[NSSet alloc]init]autorelease];
        retainCountLog(@"set1", set1);    // 2->3->2 コンビニコンストラクタと入れ替えても同じ
        NSSet   *set2 = [NSSet setWithObjects:nil];
        retainCountLog(@"set2", set2);    // 3->4->3   なぜか3始まりは変わらず
        // この時点で、set1とset2は同じアドレスを参照している。
        
        NSDictionary *dic1 = [NSDictionary dictionaryWithObjectsAndKeys:nil];
        retainCountLog(@"dic1", dic1);    // 2->3->2   なぜか2始まり
        NSDictionary *dic2 = [[NSDictionary alloc]init];
        retainCountLog(@"dic2", dic2);    // 3->4->3   autoreleaseを外しても変わらず
        // この時点で、dic1とdic2は同じアドレスを参照している。

        retainCountLog(@"nil",nil);  // 0->0->0 nilはretainしてもreleaseしてもnilのまま
    }
    return 0;
}

```

分かりやすい挙動としては、以下があります。

* オブジェクト生成時にはretainCountは1からスタートし、retain/releaseで増減する。
* 固定値のretainCountは-1のままで、retain/releaseしても増減しない。そのため実際にメモリが解放されない(固定文字列や[NSNull null]等)
* nilはどんなメッセージを送ってもnil（=0）
* 値の含まれたコレクションは、通常のオブジェクト同様にretainCountは1からスタートする

しかしながら、

* 値の含まれない、不変の空コレクションは、retainCountが2から始まる
* さらに同種の空コレクションを作ると、retainCountが3から、、と増える
という不思議に思える挙動をしていました。

デバッガで追っかけると、空のコレクションはその種類毎に同じアドレスを参照しているようです。
![デバッガ画面](https://img.skitch.com/20120828-dinsch7mmim2sss6xxaa5rmeh3.jpg)

----
ここから想像ですが、
NSArray,NSSet,NSDictionaryは、「空のコレクション」を表すオブジェクトをどこかに保持していて、それを使い回しているような感じがします。しかし「固定値」とは別に、空のコレクションが生成される都度retainしているものだから、空のコレクションのretainCountは2から始まっているようです。
Macで非HTML5の検証用ブラウザ

非HTML5ブラウザでの動作を検証しようとしたとき、WindowsだとIEという素晴らしいブラウザがあるのですが、Macにはそんなもんねぇ！なのでどうすればいいかとググったら昔のFirefox落とせました。

/pub/firefox/releases/ のインデックス ftp://ftp.mozilla.org/pub/firefox/releases/

3.5とか3.6が落とせたので非HTML5テストできました。
CSSの古いバージョンの確認もできるかと。
twigが部分的にPHP拡張になり15%高速化してた


気がついたら twig がボトルネックのロジックを部分的にC言語で再実装し、PHP拡張にすることで15％のスピードアップを実現してた→[Twig extension](http://derickrethans.nl/twig-extension.html)


複雑な処理を行なっていた `TwigTemplate::getAttribute()` を `twig_template_get_attributes()` としてPHP拡張に実装したようで、`twig_template_get_attributes()` 関数が存在するならこちらを優先して呼ぶ実装になっていた。


とりあえず、今のところはコンパイルして入れればいいみたい:

```
$ php -v
PHP 5.4.5 (cli) (built: Aug 12 2012 18:49:16) 
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
    with Xdebug v2.2.0, Copyright (c) 2002-2012, by Derick Rethans
```


```
git clone https://github.com/fabpot/Twig.git
cd Twig/ext/twig
phpize
./configure
make
make install
```

php.iniに追記:

```
extension=twig.so
```

入った:

```
$ php -m | grep twig
twig
```

関数もある:

```
$ php -a
Interactive shell

php > var_dump(function_exists('twig_template_get_attributes'));
bool(true)
php > exit
```
GitHub の Issue をあとから Pull Request にする (あとからコードを添付する)

[hub(1)](https://github.com/defunkt/hub) を使うと簡単にできる。

__追記1__: コメント欄より。

* Issue を Pull Request にすると label が外れる（Pull Request には label がつけられないので）
* Asssign 状態は変化しない

__追記2__: この機能は hub コマンドの master ブランチでは削除されている（おそらく次期リリースで無くなる） GitHub も将来 API (v4) からこの機能を無くすつもりのようだ。[参考](https://github.com/github/hub/commit/4f70dd126f46dec14fc341c97c18efae417743c7)

例: pullreq ブランチから master ブランチに対して Pull Request を送りたいが、その際に既存の Issue#123 にコードを添付したい

```
$ git checkout -b pullreq
$ commit; commit; commit;
$ hub pull-request -i 123
https://github.com/kyanny/test/pull/123

```

## Organization アカウントの中のリモートブランチ同士で上記の操作を行いたいとき

Organization アカウントを使っていると remote URL が自分自身のアカウントと違うものになる。このとき hub(1) は me:branch から organization:master へ Pull Request しようとする (自分のアカウントに fork してきたリモートブランチが存在しないといけない)

```
$ hub pull-request -i 123
Error creating pull request: Unprocessable Entity (HTTP 422)
field 'head_sha' is missing
field 'base_sha' is missing
No commits between our-company-organization:master and kyanny:my-ultra-super-excellent-feature-branch

```

これを回避するには `-h` オプションを利用する (organization:branch という表記に注意) 下の例は our-company-organization:master から our-company-organization:my-ultra-super-excellent-feature-branch への差分を Pull Request として Issue#177 に添付する。

```
$ hub pull-request -i 177 -h our-company-organization:my-ultra-super-excellent-feature-branch
https://github.com/our-company-organization/very-very-cool-project/pull/123

```

これで fork いらずでさくさくと Issue にコードを添付できる。

参考

defunkt/hub
https://github.com/defunkt/hub

git - How do you attach a new pull request to an existing issue on github? - Stack Overflow
http://stackoverflow.com/questions/4528869/how-do-you-attach-a-new-pull-request-to-an-existing-issue-on-github
指定時間内に関数が終了しなかったらAWS-SNSで通知するデコレータ

初めてデコレータおよびsignalを使用して書いてみました。指定時間内に関数が終了しなかったら通知してくれるデコレータです。AWSで夜間バッチを動かした時に時間がかかりすぎているバッチを通知してくれる、なんていう使い方ができそうです。

``` python:pytimekeeper.py
# -*- coding: utf-8 -*-                                                                                                                           
import signal
import boto.sns

def timeout(limit, topic, subject='Execution Timeout.', body='Please check program.', region='us-east-1'):
    '''                                                                                                                                           
    使い方:指定した実行時間に終了しなかった場合、awsのsnsで通知するデコレータです。                                                                      
    @timeout(limit=3600, topic='arn:aws:sns:xxxxxxxx:yyyyyyy')                                                                                    
    def long_time_function():
        very_very_long_calc()                                                                                                               
    '''
    def notify_aws_sns(signum, frame):
        conn = boto.sns.connect_to_region(region)
        conn.publish(topic, body, subject)

    def __decorator(function):
        def __wrapper(*args, **kwargs):
            signal.signal(signal.SIGALRM, notify_aws_sns)
            signal.alarm(limit)
            result = function(*args, **kwargs)
            signal.alarm(0)
            return result
        return __wrapper

    return __decorator
```
KMZDrawViewでかんたんお絵描きビュー


こんにちは。29日担当のkenmazです。

ところで皆さんお絵描き好きですよね。僕も好きです。ということで、iOSアプリに簡単にお絵描き機能を埋め込むことができるKMZDrawViewというライブラリを作ったので、簡単に紹介します。

#KMZDrawViewについて
KMZDrawViewは以下で公開しています。

**[KMZDrawView](https://github.com/kenmaz/KMZDrawView "KMZDrawView")**

KMZDrawViewが提供するビューをアプリに組み込むことで以下のような機能が使えるようになります。

* タッチ操作による線の描画
* 消しゴム機能
* 色、線幅の指定
* アンドゥ・リドゥ
* 描画した画像をUIImageオブジェクトに変換

# 簡単な使い方

## インストール
### CocoaPodsでインストール
**【CocoaPodsでインストール可能になりました。】**

```
pod "KMZDrawView"
```

KMZDrawViewをaddSubViewするだけでお絵描きできるビューが表示されます。
 [Get Started](https://github.com/kenmaz/KMZDrawView#install) で簡単に紹介しています。

### ~~libフォルダをプロジェクトに取り込み~~
~~githubからソースコードをcloneできたら、KMZDrawView/KMZDraw /libフォルダを自分のプロジェクトに取り込みます。~~

### ~~CoreGraphics.frameworkの追加~~
~~CoreGraphics.frameworkがリンクされていない場合は、プロジェクト設定の、Build Phases > Link Binary With Librariesの項目に「CoreGraphics.framework」を追加しておきます。~~

## KMZDrawViewの組み込み
ライブラリが提供するKMZDrawViewはUIView (UIImageView)の単純なサブクラスなので、通常のビューと同じようにアプリのビュー階層に追加します。IBを使わない場合であれば、例えば以下の様なコードになります。

```objective-c:ViewController.m
@implementation ViewController

- (void)loadView {
    CGRect rect = [[UIScreen mainScreen] applicationFrame];
    KMZDrawView* drawView = [[KMZDrawView alloc] initWithFrame:rect];
    self.view = drawView;
}
```

とりあえずこれだけで、超単純なお絵描きアプリが完成です。アプリを起動すると真っ白なスクリーンが表示され、自由にお絵描きができるようになります。

![image](http://dl.dropbox.com/u/6024578/qiita_kmzdrawview_imgs/qiita_kmzdrawview_1.png "addSubViewしただけ")

## 線幅と色の指定
penColorとpenWidthプロパティを指定すれば、線の色と幅を指定できます。

```objective-c
    drawView.penColor = [UIColor redColor];
    drawView.penWidth = 20;
```

![image](http://dl.dropbox.com/u/6024578/qiita_kmzdrawview_imgs/qiita_kmzdrawview_2.png "ペン幅と色の指定")

## 消しゴムモード
penModeプロパティにKMZLinePenModeEraserを指定すれば、消しゴムモードになります（これは実質的にペン色を背景色＝白にしているだけです）。

```objective-c
    drawView.penMode = KMZLinePenModeEraser;
```

penModeにKMZLinePenModePencilをセットして鉛筆モードにすれば、元通りお絵描きをできます。KMZLinePenModeの定義は以下のとおりです。

```objective-c
enum {
    KMZLinePenModePencil,
    KMZLinePenModeEraser
};
typedef NSUInteger KMZLinePenMode;
```

## アンドゥ・リドゥ
KMZDrawView#undo、KMZDrawView#redoメソッドを使えばアンドゥ・リドゥを実現できます。KMZDrawView#isUndoable, KMZDrawView#isRedoableメソッドを使えばアンドゥ・リドゥ可能かどうかをチェックできるので、例えばアンドゥボタンを押した時に以下のようなアクションが実行されるようにしておけばよいでしょう。

```objective-c
- (IBAction)touchUndoButton:(id)sender {
    if ([self.drawView isUndoable]) {
        [self.drawView undo];
    }
}
```

このあたりはKMZDrawView付属のサンプルコードを参考にしてください。
[サンプルコード](https://github.com/kenmaz/KMZDrawView/blob/master/KMZDraw/SampleViewController.m)

![image](http://dl.dropbox.com/u/6024578/qiita_kmzdrawview_imgs/qiita_kmzdrawview_3.png "付属のサンプルアプリ")

※著作権保護の観点からボカシを入れています

##UIImageとして取得
KMZDrawViewで描画した内容はimageプロパティを参照することで、UIImageオブジェクトとして取得できます。UIImagePNGRepresentation関数などを使ってNSData化して、ローカルに保存したりネットにアップするなどすれば便利でしょう。

```objective-c
    UIImage* image = drawView.image;
    NSData *data = UIImagePNGRepresentation(image);  
    //dataを保存する処理など・・・
```

##まとめ
簡単でしたがKMZDrawViewをご紹介しました。必要最小限の機能しかありませんが、自分のアプリにお絵描き機能を組み込みたいな、と思ったらサクっと使えるようになっていると思うので、皆さんぜひ使ってみてください。
Xcode はファイルを自動保存する

Xcode 4.4 は **Xcode のウィンドウがアクティブでなくなった瞬間** に編集中のファイルを自動保存する。ツールバーなどに表示されているファイルのアイコンは自動保存されても未保存を示すグレー表示のままなので気づきにくい。

コマンドラインからバージョン管理システムを使うとき、 Xcode のエディタからは未保存に見える書きかけのコードまでコミットしてしまう危険性があるので注意。
あのGem達、元気にしているかな？ | 2012/08/28時点


最近試していないけど、かつて利用した事のあるGem達、元気にしているかな？
と、思ったので、軽くメモっておこう。

* [josevalim/rails-footnotes](https://github.com/josevalim/rails-footnotes)
    * ビューのフッターにデバッグ情報を自動的に付与して表示出来るようになる。
    * 確か、TextMateで即座に開けるリンクとかも用意出来た気がする。
* [ctran/annotate_models](https://github.com/ctran/annotate_models)
    * ActiveRecordのモデルファイルのヘッダーに、スキーマ情報を自動的に挿入してくれる。
    * マジックコメント無視して挿入してくれるのには発狂したね。
* [thoughtbot/paul_revere](https://github.com/thoughtbot/paul_revere)
    * 確か、通知をサポートしてくれるGemだった気がする。
    * 以前に試した時は、何らかの問題で正常に動作していなかった記憶がある。
* [fesplugas/typus](https://github.com/fesplugas/typus)
    * 提供されているコマンドを実行する事で、管理画面を自動的に生成してくれる。
    * 関連しているモデルのデータを1画面で俯瞰出来るのが便利。
    * 最近は、RailsAdminを利用するようになったのでご無沙汰。
* [filtersquad/rocket_pants](https://github.com/filtersquad/rocket_pants)
    * APIを簡単に記述出来るようになる。
    * 同様のGemとしては、[Grape](https://github.com/intridea/grape)の方がメジャーだが、後発としてどう異なるか気になる所ではある。
    * 以前に試した時は、何らかの問題で正常に動作していなかった記憶がある。
* [rhomobile/rhodes](https://github.com/rhomobile/rhodes)
    * RubyでiOS/Androidのアプリが作れるようになる。
    * ファイル構造などはRailsに似ていて、WEBアプリを作っているような感覚でアプリが作れる。
    * 日本語ソースも少ないので、余り人気は無いと思われる。
    * でも、何気にHerokuの[アドオン](https://addons.heroku.com/rhoconnect)として提供されていたりもする。
* [thoughtbot/high_voltage](https://github.com/thoughtbot/high_voltage)
    * 静的なページを簡単に組み込めるようになる。
    * 静的なページとは、例えば、Aboutページとかね。
    * thoughtbot社のGemという事で一度試したけど、余り嬉しいと感じなかった記憶がある。
* [copycopter/copycopter-server](https://github.com/copycopter/copycopter-server)
    * テキストをアプリケーション外部から変更出来るようになる。
    * いつの間にか、[オープンソース](http://robots.thoughtbot.com/post/19388751626/copycopter-is-now-open-source)になったようですね。

以上、なんとなく、パッと思い付いたGem達でした。
もし、気になったら試してみて下さい。
Redmine2.xで環境ごとのgemを追加する

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

Redmineを好みのRackupを使いたい、プラグインで使うgemを追加したい。

Gemfileに直接書いたらマージが発生するので、ローカル用・プラグイン用のGemfileをインクルード出来るようにしてくれている。


```Ruby:Gemfile(redmine)
-- snip --
local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local")
if File.exists?(local_gemfile)
  puts "Loading Gemfile.local ..." if $DEBUG # `ruby -d` or `bundle -v`
  instance_eval File.read(local_gemfile)
end

# Load plugins' Gemfiles
Dir.glob File.expand_path("../plugins/*/Gemfile", __FILE__) do |file|
  puts "Loading #{file} ..." if $DEBUG # `ruby -d` or `bundle -v`
  instance_eval File.read(file)
end
```

rack関係や、適当に追加したいユーティリティは`Gemfile.local`に記述。
プラグイン独自のgemは`plugins/{pluginname}/Gemfile`に記述。

という管理をしてbundle。
PHPで使うGoFパターン ひとり Advent Calendar - イテレータ


イテレータってなに?
--
要するに反復子ですね。PHPでプログラムする時に自前でこのパターンを用意することはあまりないと思いますが、一応基礎ということで。ちなむと、PHPでは、iterator インターフェースが用意されていて、それを実装すると foreach で 普通に回せます。あーだこーだ自前のイテレータについて考えるよりは、標準イテレータ実装した方が分かり易いかも知れないですね。

イテレータの構造
--

* イテレータ - 反復子
* アグリゲータ - 多分、データ詰める役(今回だとarray関数ですかね)

構造どうこうより実際に見てもらいましょう。

```
<?php
// 標準イテレータと互換のインターフェースにしています
interface Iteratable {
  public function rewind();
  public function valid();
  public function current();
  public function next();
}

class IteratorUser {
  private $_Object = null;
  public function __construct ( $obj ) {
    if ( !( $obj instanceof Iteratable ) )
      throw new Exception ( 'むりっす' );
    $this->_Object = $obj;
  }

  public function run ( $fnc ) {
    for ( $this->_Object->rewind(); $current = $this->_Object->current(); $current = $this->_Object->next() ) {
      $result = $fnc ( $current );
    }
  }
}

class ArrayList implements Iteratable{
  private $_InnerList = array ();
  private $_Index     = 0;

  public function __construct ( $arr ) {
    if ( !is_array ( $arr ) )
      throw new Exception ( '無理っす' );
    $this->_InnerList = $arr;
  }

  public function valid () {
    return count ( $this->_InnerList ) > $this->_Index;
  }

  public function rewind () {
    $this->_Index = 0;
  }

  public function current () {
    return $this->_InnerList[$this->_Index];
  }

  public function setToCurrent ( $obj ) {
    $this->_InnerList[$this->_Index] = $obj;
  }

  public function next () {
    return $this->_Index++;
  }
  public function key () {
    return array_keys ( $this->_InnerList );
  }
}
class ArrayList2 extends ArrayList implements Iterator { }

print 'こっちは自前イテレータ' . "\n";
$obj = new IteratorUser (  new ArrayList ( array ( 1, 2, 3, 4, 5 ) ) );
$obj->run ( function ( $i ) {
  var_dump( $i );
});

print '普通に標準イテレータ' . "\n";
foreach ( new ArrayList2 ( array ( 1, 2, 3, 4, 5 ) ) as $elm ) {
  var_dump ( $elm );
}
```

コメント
---
イテレータは要するに、PHPで言うとforeachして走査するための実装ですね。でもforeachがどうのっていうより、このパターンの本質は走査と操作を分けましょうっていうことだと思うのです。イテレータがどうのっていうのはともかく、その走査と操作は分けましょうという考え方は大事だと思います。
iOSシミュレータをショートカットで直接起動する

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

通常Xcodeのメニューから呼び出すiOSシミュレータを、Automaterワークフローを使って直接起動のショートカットを作成する。

Automater > ワークフロー作成 からシェルスクリプトの実行を追加して中身を下記にする。
OSXやXcodeの環境でパスが違うのでどちらにあるかは要確認。

Xcode4.4 (mountain lion用?)

```シェル：bin/bash
"/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone Simulator.app/Contents/MacOS/iPhone Simulator"
```

Xcode4.3以前？

```シェル：bin/bash
"/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone Simulator.app/Contents/MacOS/iPhone Simulator"
```


アイコンもショートカット先の`Resources`の下から取ってくればOK。
Google I/O 2012 slide template


[HTML5 slide template for Google I/O 2012](http://code.google.com/p/io-2012-slides/)はWebブラウザでプレゼンテーションができます。
（`hgroup`, `article`, `aside`などのHTML5のタグが使われています。）

シンプルな構成で覚えることが少なく、見栄えのよいスライドを作ることができます。
スマートフォンやタブレットにも対応していてスワイプでスライドするのは素敵です。

## Installation

```Bash
$ git clone https://code.google.com/p/io-2012-slides/
```

## Usage

`template.html`を編集してプレゼンテーションのスライドを作成します。

### Tags

スライドはタイトルとコンテンツで構成されています。
（PowerPointやKeynoteでよく使われる標準のレイアウトですね。）

| Tag     | 説明                 |
|:-------:|:---------------------|
| slide   | スライドの区切り     |
| hgroup  | タイトル             |
| article | コンテンツ           |
| aside   | プレゼンターのノート |

```HTML
<slide>
  <hgroup>
    タイトル
  </hgroup>

  <article>
    コンテンツ
  </article>

  <aside class="note">
    ノート
  </aside>
</slide>
```

### Keys

よく使うキーの割当を紹介します。

| Key | 説明           |
|:---:|:---------------|
| f   | フルスクリーン |
| w   | ワイドサイズ   |
| o   | スライド一覧   |

### Presenter Mode

クエリーに`?presentme=true`を付けて起動するとWebブラウザーのウインドウが[２つ表示](http://ogom.github.com/python-mcider/examples/presenter/slide.html?presentme=true)されます。
（モニターが２つある場合に有効です。）

### Customize
#### Title slide

タイトルスライドに表示される項目はコンフィグファイル(`slide_config.js`)を編集します。
汎用的に使うなら`title`をイントロダクションとして、`subtitle`には自己紹介など利用するとよいです。

タイトルスライドに表示される４つの項目は

```Javascript:slide_config.js
var SLIDE_CONFIG = {
  // Slide settings
  settings: {
    title: 'Introduction',
    subtitle: '自己紹介...'
  },

  // Author information
  presenters: [{
    name: '氏名',
    company: '社名'
  }]
};
```

#### Logo and Icon

Google I/Oのロゴやアイコンがスライドにあると発表の場所によって使いにくいこともあるので
ログやアイコンを差し替えたり、非表示にします。

##### Example

最初のスライドのロゴとタイトルスライドのバーをコメントアウトします。

```HTML:template.html
<!--
<slide class="logoslide nobackground">
  <article class="flexbox vcenter">
    <span><img src="images/google_developers_logo.png"></span>
  </article>
</slide>
-->

<slide class="title-slide segue nobackground">
  <!-- <aside class="gdbar"><img src="images/google_developers_icon_128.png"></aside> -->
  <!-- The content of this hgroup is replaced programmatically through the slide_config.json. -->
  <hgroup class="auto-fadein">
    <h1 data-config-title><!-- populated from slide_config.json --></h1>
    <h2 data-config-subtitle><!-- populated from slide_config.json --></h2>
    <p data-config-presenter><!-- populated from slide_config.json --></p>
  </hgroup>
</slide>
```


スタイルシートからロゴとアイコンと`#io12`をコメントアウトします。

```CSS:default.css
slides > slide:not(.nobackground):before {
  font-size: 12pt;
  /* content: "#io12"; */
  position: absolute;
  bottom: 20px;
  left: 60px;
  /* background: url(../../images/google_developers_icon_128.png) no-repeat 0 50%; */
  -webkit-background-size: 30px 30px;


slides > slide.title-slide:after {
  content: '';
  /* background: url(../../images/io2012_logo.png) no-repeat 100% 50%; */
  -webkit-background-size: contain;
```

[こんな感じ](http://ogom.github.com/python-mcider/examples/presenter/slide.html?presentme=false)になりました。すっきりとして使い勝手がよいです。


# Tips
## mCider

HTMLを編集してスライドを作るのは簡単ですが、`Markdown`から`Google I/O 2012`のスライドにコンバートする[mCider](http://ogom.github.io/python-mcider/)を作りました。
（`Google I/O 2011`のテンプレートにも対応しています。）
stunnelを使ってiOSシミュレータでルート未信頼の外部SSL/TLS通信をする

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

iOSで外部APIとSSL/TLS通信をするアプリを開発する場合、相手方がルートの信頼が無い証明書を使っていると何らかの方法でVerifyを回避する必要がある。

iPhone実機でテストするには適当なCA証明書を入れ、サーバ側にはそれで署名したサーバ証明書を使えばいい。

iOSシミュレータで未信頼CAの証明書を使うのは手間らしいのでSSL/TLSのレイヤを`stunnel`を使って下記のような設定をする。
シミュレータから見ればただの平文通信ということになる。

```stunnel.conf
-- snip --
[remote_https]
client = yes
accept = 127.0.0.1:10443
connect = your_domain:443
-- snip --
```

これで`localhost:10443`がListenされ、通信の転送先がリモートHTTPSサーバ宛になる。


ちなみに

```
"~/Library/Application Support/iPhone Simulator/5.0/Library/Keychains/TrustStore.sqlite3"
```

がiOSシミュレータの証明書ストアのようなので、ここにCA証明を入れれば良いのかもしれないがうまくいかない。
VPC with a Single Public Subnet Only を boto で自作

Amazon VPC の Management Console で VPC 作ると、

 * VPC with a Single Public Subnet Only
 * VPC with Public and Private Subnets
 * VPC with Public and Private Subnets and Hardware VPN Access
 * VPC with a Private Subnet Only and Hardware VPN Access

の四つのテンプレートから選ぶことができますが（2012年8月時点）、そいつらをどうやって API 叩いて自作するのよ？って話です。コンソールぽちぽちして作るよりも、コマンド一発のほうがカッコいいし再現性あるじゃないですか。

とりあえず、1つ目の「VPC with a Single Public Subnet Only」を作ってみます。言語は Python、ライブラリはもちろん boto です。boto の VPC リファレンスは[こちら](http://docs.pythonboto.org/en/latest/ref/vpc.html)。


```python
import boto.ec2
from boto.vpc import VPCConnection

# リージョンは ap-northeast-1
ec2region = boto.ec2.get_region("ap-northeast-1")

def launch_vpc():
    conn = VPCConnection(region=ec2region)

    # VPC を作成
    vpc = conn.create_vpc('10.0.0.0/16')

    # インターネットゲートウェイを設定
    igw = conn.create_internet_gateway()
    conn.attach_internet_gateway(igw.id, vpc.id)

    # サブネットを作成
    subnet = conn.create_subnet(vpc.id, "10.0.0.0/24")

    # ルーティングを設定
    # filters については下記を参照
    # http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeRouteTables.html
    route_table = conn.get_all_route_tables(filters=(("vpc-id", vpc.id),))[0]
    conn.create_route(route_table.id, "0.0.0.0/0", gateway_id=igw.id)
    print "Created VPC %s" % vpc.id
```

だいたいこんな感じですが、厳密にはテンプレとちょっと違ってます。

テンプレではメインのルーティングテーブルが外に出られない状態で、外に出るためのルーティングテーブルを別途作る形になっていますが、上のコードでは、メインのルーティングテーブルに対して外に出る口を設けています。作られるルーティングテーブルはひとつだけです。全部のサーバが外に出たいならこのほうが使いやすいと思います。

苦労したのは、作成した VPC に割り当てられてるルーティングテーブルを引き当てるところ。get_all_route_tables の filter を設定してやれば実現できますが、なかなかそこにたどり着けませんでした。filter の種類は [DescribeRouteTable のリファレンス](http://docs.amazonwebservices.com/AWSEC2/latest/APIReference/ApiReference-query-DescribeRouteTables.html)にたくさん書いてあります。boto 使うときには AWS 側の API リファレンスもチェックしたほうがいいですねー。

```python
conn.get_all_route_tables(filters=(("vpc-id", vpc.id),))[0]
```

これで、VPC の id が vpc.id に一致するルーティングテーブルを引っ張ることができるわけです。

ちなみに、当初は Ruby で書こうと思ってたんですが、AWS SDK for Ruby は VPC のサポート無し。やっぱり AWS 使うなら Python だな！
数値文字列を指定桁で0埋めするにはString.PadLeft(桁,'0');

# 参考

例えば数値文字列を4桁0埋めに変換したい場合、

```csharp
String.PadLeft(桁数, '0');
```

でOK。
昔だったら、指定桁数の0を左側にくっつけて、指定桁数だけ右から取り出す、とかやってたんですけど、そんなこといちいちやらなくていいんだ！

# 例

```csharp
"1".PadLeft(4, '0'); // -> "0001"
"20".PadLeft(4, '0'); // -> "0020"
"300".PadLeft(4, '0'); // -> "0300"
```

ちなみに、少ない桁を指定しても、切り落とされません。安心。

```csharp
"4000".PadLeft(3, '0'); // -> "4000"
```

* [C# - 指定の文字数になるまで先頭を文字で埋める](http://jeanne.wankuma.com/tips/csharp/string/padleft.html)
Paver を使ったスクリプティング - 外部コマンド編

Python の一番スクリプト言語っぽくない部分が、外部コマンドを実行するのに ``import subprocess; subprocess.call("ls -l")`` しないといけなくて面倒な点ですね。

Paver は外部コマンド実行を楽にする ``sh()`` 関数を定義しています。これも ``from paver.easy import *`` するとインポートできます。

## 使い方

``sh("ls -l /")`` のように書くと、そのコマンドがシェル経由で実行されます。

## キャプチャ
デフォルトでは実行したコマンドの出力はそのまま標準出力に表示されますが、 ``capture=True`` を指定すると

```python:pavement.py
from paver.easy import *
import os

@task
def list():
    ret = sh("ls -l /", capture=True)
    print(len(ret.splitlines()))
```

```
$ paver list
---> pavement.list
ls -l /
22
```


## dryrun
``path`` クラスのメソッドと同じく、 ``sh()`` 関数も paver を dryrun モードで実行した場合は、コマンドを表示するだけで実際には実行しません。

```python:pavement.py
from paver.easy import *

@task
def barusu():
    sh("rm -rf /")
```

```
$ paver -n barusu
---> pavement.barusu
rm -rf /
```
Paver を使ったスクリプティング - ファイル操作編

Python の標準ライブラリのファイル操作、 ``os`` にあるのか ``os.path`` にあるのか、 ``shutil`` にあるのかで悩むことないですか？

``paver.path`` モジュールにある ``path`` クラスを使うと、ファイル操作が Python の標準ライブラリよりも簡単になります。

## 使い方

``path`` クラスも ``paver.easy`` に入っているので、 ``from paver.easy import *`` してあると ``path`` だけで利用できます。

この ``path`` クラスは文字列を継承して、その文字列を引数に取るような操作をするメソッドを定義しています。また ``/`` 演算子にパスの結合操作をオーバーライドしていたり、その他さまざまな便利メソッドを定義してあります。

```python
>>> from paver.easy import *
>>> root = path('/')
>>> root
path(u'/')
>>> root.isdir()
True
>>> root.listdir()
[path(u'/.dbfseventsd'), path(u'/.DocumentRevisions-V100'), path(u'/.DS_Store'), path(u'/.file'), path(u'/.fseventsd'), path(u'/.Spotlight-V100'), path(u'/.SymAVx86QSFile'), path(u'/.Trashes'), path(u'/.vol'), path(u'/Applications'), path(u'/asix_temp'), path(u'/bin'), path(u'/cores'), path(u'/dev'), path(u'/etc'), path(u'/home'), path(u'/Library'), path(u'/mach_kernel'), path(u'/net'), path(u'/Network'), path(u'/opt'), path(u'/private'), path(u'/sbin'), path(u'/System'), path(u'/tmp'), path(u'/Users'), path(u'/usr'), path(u'/var'), path(u'/Volumes'), path(u'/\u30e6\u30fc\u30b5\u3099\u60c5\u5831')]
>>> root / 'usr'
path(u'/usr')
```

``os``, ``os.path``, ``shutil`` にあるパス操作以外の便利メソッドには、パスで指定されたファイル内のバイト列を読み込んで返す ``.bytes()`` メソッドや、 ``glob()`` メソッド、  ``.remove()`` と違ってファイルが存在しなくてもエラーにならない ``.remove_p()`` メソッドなどがあります。

## dryrun

paver コマンドは ``-n`` オプションを指定すると dryrun モードになっており、 ``path`` クラスの操作メソッドは実際には何もしなくなります。

```python:pavement.py
from paver.easy import *

@task
def hello():
    path('/').rmtree()
```

```
$ paver -n hello
---> pavement.hello
rmtree / () {}
```

## pushd
これはもともと Python の ``contextlib`` にある機能なのですが、 ``with`` 文と組み合わせて使うと便利な ``pushd`` というコンテキストマネージャがあり、 ``paver.easy`` に入っているのですぐに使えます。

```python:pavement.py
from paver.easy import *
import os

@task
def chdir():
    print "cwd: ", os.getcwd()
    with pushd('/'):
        print "cwd: ", os.getcwd()
    print "cwd: ", os.getcwd()
```

```
$ paver chdir
---> pavement.chdir
cwd:  /Users/inada-n/paver
cd /
cwd:  /
cd /Users/inada-n/paver
cwd:  /Users/inada-n/paver
```
Paver 応用編 - プロジェクトに組み込む

順番としては前後してしまうのですが、応用編です。

Paver 本体に組み込まれている ``minilib`` というコマンドを利用すると、 Paver のよく使う部分を zip にまとめたライブラリを作成することができます。これは30KB以下なので、プロジェクトにこのまま置いてしまえば、 Paver をインストールしていなくても Python がインストールされていれば使えるスクリプトにすることができます。
これはビルド・デプロイスクリプトなんかに便利ですね。

## minilib を作る

```
$ paver minilib
---> paver.misctasks.minilib
Generate paver-minilib.zip
$ ls -lh
total 56
-rw-r--r--  1 inada-n  staff    26K  8 27 21:15 paver-minilib.zip
```

これでできた ``paver-minilib.zip`` をソース配布物に組み込むか、バージョン管理に入れてしまえば、 Paver をインストールしていない人でも利用できるようになります。

## minilib を使ったスクリプトを書く

Paver をインストールしていない場合、 paver コマンドが利用できないので、 ``pavement.py`` を自力で実行できるようにしてやる必要があります。どうせなのでもっと短い名前もつけてしまいましょう。今回は ``pave`` という名前にしてみます。

```python:pave
#!/usr/bin/env python
# coding: utf-8
import sys
import os

# minilib にパスを通す.
sys.path.append(os.path.join(os.path.dirname(__file__), 'paver-minilib.zip'))

from paver.easy import *

@task
def hello():
    print "hello"

if __name__ == '__main__':
    # -f filename で pavement.py 以外のファイルを指定できる事と、
    # sys.argv[0] が実行したスクリプトファイル名である事を利用する.
    tasks.main(['-f'] + sys.argv)
```

```
$ chmod +x pave
$ ./pave hello
---> pavement.hello
hello
```
Paver を使ったスクリプティング - コマンド定義編

[Paver](http://paver.github.com/paver/index.html) は Python でコマンドラインツールを手軽に作るためのライブラリです。

Python の標準ライブラリの ``argparse`` などを使ってもある程度コマンドラインツールを簡単に作ることができますが、 Paver を使うと特にサブコマンドを持ったスクリプトを作るのが圧倒的に楽になります。

Paver 本家のドキュメントでは Python のパッケージングを自動化することに主眼をおいて解説されているので、タスク定義＆実行ツールとして解説してみたいと思います。

## セットアップ
```bash
$ easy_install paver
```

## タスクを作る
``pavement.py`` というファイルを作成し、そこで ``@task`` というデコレータをつけた関数を作ると、それがタスクとなります。

```python:pavement.py
from paver.easy import *

@task
def hello():
    """My first task."""
    print 'hello'
```

タスクを実行するには、 ``paver タスク名`` を実行します。

```bash
$ paver hello
---> pavement.hello
hello
```

``paver -h`` にも、定義したタスクが表示されます。 docstrin がそのコマンドの説明になります。

```bash
$ paver -h
---> paver.tasks.help
Usage: paver [global options] taskname [task options] [taskname [taskoptions]]

Options:
  --version             show program's version number and exit
  -n, --dry-run         don't actually do anything
…
Tasks from pavement:
  hello          - My first task.
```

## 引数を取る
引数を取るには、タスクを定義している関数に ``@consume_args`` というデコレータをつけて ``args`` という引数を書きます。

```python:pavement.py
from paver.easy import *

@task
@consume_args
def hello(args):
    """My first task."""
    print 'hello', args
```

```bash
$ paver hello foo bar
---> pavement.hello
hello ['foo', 'bar']
```

## オプションを定義する
オプションを定義するには ``@cmdopts`` デコレータを利用し、それを受け取るには ``options`` という引数を利用します。 ``@cmdopts`` デコレータには、オプションを ``(長い名前, 一文字, ヘルプ)`` の形のタプルで定義したリストを引数として渡します。長い名前の最後に ``=`` をつけると引数を取るオプションになります。

```python:pavement.py
from paver.easy import *

@task
@cmdopts([
    ('foo', 'f', "The foo"), # -f あるいは --foo
    ('bar=', 'b', "Bar bar bar"), # -b xxxあるいは --bar=xxx
    ])
def hello(options):
    """My first task."""
    print 'hello', options.foo, options.bar
```

```bash
$ paver hello --foo -b 3
---> pavement.hello
hello True 3
```

実は、 ``options`` は引数に取らなくても ``paver.easy`` のグローバル変数として定義してあるので、 ``from paver.easy import *`` してあれば引数を取らなくても利用することができます。 

```python:pavement.py
from paver.easy import *

@task
@cmdopts([
    ('foo', 'f', "The foo"),
    ('bar=', 'b', "Bar bar bar"),
    ])
def hello():
    """My first task."""
    print 'hello', options.foo, options.bar
```
Coronaと比較したquicktigame2dについて

## [quicktigame2d](http://code.google.com/p/quicktigame2d/)

* [API](http://code.google.com/p/quicktigame2d/wiki/Transform)

メリット

* Particle Designer使える
* Tiのnative遷移利用可能
* ライセンス不要

デメリット

* 物理エンジンBox2Dがiphoneでしか使えない
* Objectのタップイベントはない。自前で計算する
* 個人がサポートしているので不安
大事なサービスがOOM Killerに殺されないようにする

`$ sudo vim /etc/init.d/monit`

~~~~~~diff:/etc/init.d/monit
  start() {
          echo -n $"Starting $prog: "
          daemon $prog
          RETVAL=$?
          echo
          [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
+         PID=`cat /var/run/monit.pid`
+         echo -17 > /proc/$PID/oom_adj
          return $RETVAL
  }
~~~~~~

プロセスを再起動し、反映されていることを確認

~~~~~~bash
$ sudo systemctl --system daemon-reload
$ sudo /etc/init.d/monit restart
Restarting monit (via systemctl):                          [  OK  ]

$ cat /proc/`cat /var/run/monit.pid`/oom_adj
-17
~~~~~~
PowerShellやバッチファイルで管理者特権をチェック

PowerShellやバッチファイルで,
「__管理者として実行__」したかどうかを判定する例文は下記の通り.

# PowerShell

```powershell
if (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(`
        [Security.Principal.WindowsBuiltInRole] "Administrator")) {
    Write-Output "管理者として実行しました. シンボリック・リンクの作成を試みます. "
    CMD /C MKLINK /D "$Env:HOME\.emacs.d" "$Env:USERPROFILE\Dropbox\.emacs.d"
}

else {
    Write-Warning "管理者として実行していません. シンボリック・リンクの作成はできません. "
    exit 1
}
```

:::note
ifの条件式が長いので, 文末の`(バッククォート)により,
条件式を複数行に分けて書いていることに注意. 
:::

### 参考

https://devblogs.microsoft.com/scripting/check-for-admin-credentials-in-a-powershell-script/


# バッチファイル

```powershell
NET SESSION > NUL 2>&1
IF %ERRORLEVEL% == 0 (
    ECHO 管理者として実行しました. シンボリック・リンクの作成を試みます.
    MKLINK /D %HOME%\.emacs.d %USERPROFILE%\Dropbox\.emacs.d
) ELSE (
    ECHO 管理者として実行していません. シンボリック・リンクの作成はできません. >&2
    EXIT /B 1
)
```

:::note
NET SESSIONは本来の用途ではなく, 単に管理者特権の有無の判定に使用されている.
よって, NET SESSIONでなくとも, 管理者特権が必要なコマンドであれば良いようだ.
:::

### 参考

http://stackoverflow.com/questions/4051883/batch-script-how-to-check-for-admin-rights/11995662
（最新版では解消済）絵文字が入った文字列に対してString#stripするとクラッシュする


2012.9.6 追記
---
RubyMotion1.23でこの不具合は解消したようです！（WatsonさんのPatchのおかげです。ありがとうございますー！）

（RubyMotion1.23以前の場合）
---

どうしても空白と改行を取り除かなくてはいけない場合は、下記のようにNSString#stringByTrimmingCharactersInSetを使用する。

```ruby
target_text.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet)
```
エラトステネスの篩


乗っかる。


```scheme
(use srfi-1)
(use srfi-26)

(define (sieve n)
  (let ((max (floor (sqrt n))))
    (let itr ((xs (iota (- n 1) 2)) (rs '()))
      (if (< max (car xs)) (append (reverse rs) xs)
        (itr (remove (cut (compose zero? remainder) <> (car xs)) (cdr xs))
             (cons (car xs) rs))))))
```
AdaでHello world

私「そういえばAdaやってるって聞いたけどどんな感じなの？」
後輩「うーん、軍事用に開発された言語なので、信頼性が非常に重要視されているんですよね。だから型とかすごく厳しいし、まぁ書いてみると色々と面倒です。」
私「何それかわいい」

そういうわけで、プログラム言語Adaを触ってみることにした。
本も読んでないし本当に遊び半分で昨夜手を出しただけなので、動作報告程度に捉えてほしい。申し訳ない。
とりあえず目の前にあったのがWindowsなので[MinGW](http://www.mingw.org/)をダウンロード、インストール時にオプションで必要なコンパイラとしてAda Compilerにチェックを入れた。

とりあえずhello world。

```ada:hello.adb

with Ada.Text_IO; --文字列の入出力のために必要なライブラリ
procedure Hello is --プロシージャ。名前はファイル名と一致させる。ただし大文字開始
begin --Helloプロシージャ開始
  Ada.Text_IO.Put("Hello, world!"); --文字列出力
end Hello; --Helloプロシージャ終了

```

なお、use節でいちいちライブラリを指定しなくてもプロシージャ（Putとか）を呼べるようだ。

```ada:hello.adb

with Ada.Text_IO; --文字列の入出力のために必要なライブラリ
use Ada.Text_IO; --Putを直接呼べる
procedure Hello is --プロシージャ。名前はファイル名と一致させる。ただし大文字開始
begin --Helloプロシージャ開始
  Put("Hello, world!"); --文字列出力
end Hello; --Helloプロシージャ終了

```

で、MinGWなら~/内にパスが通ってくれてるので

```
$ gnatmake hello.adb
gcc -c hello.adb
gnatbind -x hello.ali
gnatlink hello.ali

```

で実行ファイルhogehoge.exeが生成される。

```
$ hello.exe
Hello, world!
```


Qiitaでの投稿のテストという意味もあるが、Adaタグを作りたかったという意味もある。
Mountain Lion の Sharing Service

[第45回Cocoa勉強会関西](http://atnd.org/events/30192) で発表しました。

発表時のスライドはこちら。
http://www.slideshare.net/kosukeusami/mountain-lion-sharing-service

また、発表時に使ったサンプルコードはこちら。これはAppleが提供しているものです。
http://developer.apple.com/library/Mac/#samplecode/SharingServices/Introduction/Intro.html

OS X 10.8 Mountain Lion の新機能では通知センターが人気があるような気がしていますが、この Sharing Service もお手軽に使えて良いと思います。
端末がない状態で sudo を使う


cron など端末がない状態で sudo を使うと、例えば ssh では次のようになる

> $ ssh some_host sudo ls
> sudo: sorry, you must have a tty to run sudo

端末が無いとプログラムは echo back を止めることができないので、sudo のパスワードが丸見えになってしまう。
なので端末の有無を sudo は見ているのだけど、NOPASSWD を指定しているユーザではこの制限はいらない。

> %wheel  ALL=(ALL)       NOPASSWD: ALL
> Defaults:%wheel !requiretty

としておいた。
WPFに外部アプリ（Window）を埋め込む

```c#:MainWindow.xaml.cs
var psi = new ProcessStartInfo(@"program_path");

var process = Process.Start(psi);
process.WaitForInputIdle();

System.Threading.Thread.Sleep(3000);
SetParent(process.MainWindowHandle, _panel.Handle);
```

```wpf:MainWindow.xaml
<WindowsFormsHost>
    <forms:Panel x:Name="_panel" />
</WindowsFormsHost>
```
稼働中のEC2のインスタンスの容量をリサイズする

1.対象のインスタンスのamiをつくる
2.amiからlaunchする
3.そのときにStorage Device Configuration->Root Volume>Volume Sizeを適当な値に設定する
4.sshでlaunchしたインスタンスに入ってファイルシステムを増量する

```sh:resize
resize2fs /dev/sda1 
```
5.elastic ipを切り替える
特定のバケットだけ見せる

Amazon S3 の特定バケットだけ見せるための IAM 設定。CloudBerry Explorer を使ってアクセスするユーザを想定してます。ROOT を開いた時にバケット一覧が出てないとさすがに使いにくいだろうなと思って、バケットのリスティングだけ許可してます。

```json
{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*",
        "s3:List*"
      ],
      "Resource": "arn:aws:s3:::BUCKET-NAME"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:ListAllMyBuckets"
      ],
      "Resource": "*"
    }
  ]
}
```
PHPのX-Powered-Byヘッダを送らないようにする方法


PHPはデフォルトで稼働しているPHPのバージョンをHTTPヘッダに乗せてレスポンスを返しているって知っていました？意外と知らない人多いんじゃないかと思います。PHPスクリプトにHTTP Requestすると、このような詳細なバージョンがヘッダが帰ってきます。

```
X-Powered-By:PHP/5.4.0
```

バージョンがわかったところですぐに問題になるかと言えば微妙ですが、攻撃者がヘッダを解析するだけでPHPのバージョンを特定できるので、攻撃の事前調査などに悪用されることが考えられます。

X-Powered-Byヘッダを送らないようにする方法としては、3種類あります。1つ目は、php.iniで`expose_php = Off`をセットする方法です。これで、X-Powered-Byヘッダは送信されなくなります。ただし、`expose_php`を変更可能なのはphp.ini のみなので、`.htaccess`に書いたり、`set_ini()`でセットしたりするのは効果がありません。


```ini:php.ini
expose_php = Off
```

2つ目は、X-Powered-Byを置き換える方法です。`header()`で無理やりX-Powered-Byを送信すれば、PHPのバージョンは露出しなくなります。結局はX-Powered-Byを送信しているので、「PHPで動いているな」というのはだいたい予想がついてしまいます。できれば、X-Powered-Byヘッダ自体を送らないようにしたいですね。

```php
<?php
header('X-Powered-By: Secret');
```

3つ目は、`header_register_callback()`を利用する方法です。この関数はPHP5.4で追加されたようで、ヘッダを送信する直前にコールされる関数を指定することができます。この関数を使うと、なんとヘッダを除去したり、追加したりできるのです。下の例は、X-Powered-Byヘッダを除去するものです。これでX-Powered-Byが送信されなくなります。

```php
<?php

header_register_callback(function(){
	header_remove('X-Powered-By');
});
```

php.iniが編集できる環境であれば、`expose_php = Off`をセットするのが一番いいですが、例えば共有レンタルサーバでは3つ目の方法が有効に思えます。また、オープンソースとして配布するようなユーザの環境を特定できない場合も、3つ目の方法が役にたつと思います。

## 番外編: Nginx + PHP-FPM構成でNginx側で消す方法

Nginx + PHP-FPM構成でphp.iniがどうしても編集できない場合は、Nginx側(リバースプロキシ側)で`X-Powered-By`ヘッダを隠蔽することができます。`fastcgi_hide_header X-Powered-By;`をnginxの設定に追加します。

```
  location ~ \.php$ {
    fastcgi_pass  localhost:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_hide_header X-Powered-By;
    include       fastcgi_params;
  }
```
Rxを使って位置情報を得る #もう泣かないC#

酢酸先生が教えてくれたよ！！ありがとう、酢酸先生！！

現在位置が欲しいので、更新が行われたらその時点で`geowatcher`を眠らせます。

Android2.3以降のAPIで、一回だけ位置情報の更新を行うってのがあったと思うけど、そんなイメージ。だって、追跡とか必要ないもんね！！

ただ、屋内なんかで利用した時に取得がうまくいかなかったなーなんて場合は、ユーザが任意で再取得できるようにするんだろうね、多分。

んで、コード。

```c#:positionchangerxc

            var geoWatcher = new GeoCoordinateWatcher();
            Observable.FromEvent<GeoPositionChangedEventArgs<GeoCoordinate>>(geoWatcher, "PositionChanged").ObserveOnDispatcher()
                //位置情報だけクレ
                .Select(ev => ev.EventArgs.Position.Location)
                //場所が変わると呼ばれる
                .Subscribe(location => {
                    //位置情報を使って何かやる
                    onLocationChanged(location);
                    //一回だけで良いわ
                    geoWatcher.Stop(); });
            geoWatcher.Start();
```

`Subscribe`が、何回も呼ばれるなんて知らなかった。

一回呼ばれたら、`onCompleted`が発動するものと思ってた。

なんだかよくわかんないね！！

Rxに関して詳しく書いてる本があるなら教えて欲しいや・・・