OmniAICreator/Qiita-1.07M huggingface dataset:
WicketでファイルのMIME TypeをチェックするValidator

[ファイル送信時のContentTypeをチェックするValidator](https://code.google.com/p/cast-wicket-modules/source/browse/trunk/cwm-data/src/main/java/org/cast/cwm/data/validator/MultipleFileTypeValidator.java?r=132)ではなくて、送信したファイルのMIME TypeをチェックするValidatorが欲しかったので作ってみました。

[Apache Wicket](http://wicket.apache.org) 1.5.10 と [Mime Type Detection Utility](http://sourceforge.net/projects/mime-util/) 2.1.3 にて作成。

```java:MimeTypeValidator.java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.apache.wicket.markup.html.form.upload.FileUpload;
import org.apache.wicket.util.string.Strings;
import org.apache.wicket.validation.IValidatable;
import org.apache.wicket.validation.validator.AbstractValidator;

import eu.medsea.mimeutil.MimeType;
import eu.medsea.mimeutil.MimeUtil2;
import eu.medsea.mimeutil.detector.MagicMimeMimeDetector;

/**
 * Validate for file MIME-type.
 *
 * @author gishi_yama
 */
public class MimeTypeValidator extends AbstractValidator<Collection<FileUpload>> {
	private static final long serialVersionUID = 1L;

	private List<String> passingTypeList;
	private List<String> errorFileNameList;

	/**
	 * Construct.
	 *
	 * @param mimeTypes
	 *          アップロードを許可するファイルのMIME-type.可変長引数.
	 */
	public MimeTypeValidator(String... mimeTypes) {
		super();
		this.passingTypeList = Arrays.asList(mimeTypes);
		this.errorFileNameList = new ArrayList<>(mimeTypes.length);
	}

	@Override
	protected void onValidate(IValidatable<Collection<FileUpload>> validatable) {
		//	Formで繰り返しファイル送信された時のために、エラー時のファイル名Listをclearしておく。
		errorFileNameList.clear();
		MimeUtil2 mu2 = new MimeUtil2();
		mu2.registerMimeDetector(MagicMimeMimeDetector.class.getName());
		for (FileUpload fu : validatable.getValue()) {
			Collection<?> uploadingTypeCollection = mu2.getMimeTypes(fu.getBytes());
			for(Object mt : uploadingTypeCollection) {
				if (!passingTypeList.contains(((MimeType)mt).toString())) {
					errorFileNameList.add(fu.getClientFileName());
					error(validatable);
				}
			}
		}
	}

	@Override
	protected Map<String, Object> variablesMap(IValidatable<Collection<FileUpload>> validatable) {
		Map<String, Object> map = super.variablesMap(validatable);
		map.put("fileNames", Strings.join(",", errorFileNameList));
		map.put("types", Strings.join(",", passingTypeList));
		return map;
	}

}
```

+ （2013-03-07 22:44 追記）メッセージ用のファイル名がクリアされていない不具合があったので、コードを修正しました...
brew版git 1.8.1.5 を入れると bash で __git_ps1 が見つからないと云われる件

brew 版 git 1.8.1.5 を入れると同じくbrewで入れたBashで`-bash: __git_ps1: コマンドが見つかりません` と云われるようになるのだけど、これは以下のコマンドで修正出来ます。

```
$ brew link git
```

参考：
[\`brew install\` should tell which files couldn't be linked #18303](https://github.com/Homebrew/legacy-homebrew/issues/18303)
LWP::UserAgentでHTTPSプロキシ越しに通信する

# 概要

LWP::UserAgent(__バージョン6.06未満__)でプロキシ越しにHTTPS通信をやろうとすると、何も考えずに設定すると

```
GET https://example.com/index.html
```

のように、CONNECTメソッドを使わずhttpsスキームのリクエストURLをそのままプロキシに投げてしまう。
このようなリクエストはSquidなどのプロキシではサポートされておらず、エラーになってしまう。
(Apache mod_proxyならイケるっぽい？)

CONNECTメソッドによる通信をやらせるには、いろいろと環境変数を設定する必要がある。

# 参考

- http://stackoverflow.com/questions/12116244/https-proxy-and-lwpuseragent
- http://d.hatena.ne.jp/ragtarou/20070302
- http://perl-users.jp/articles/advent-calendar/2009/casual/17.html
- https://metacpan.org/module/Net::HTTPS
- https://metacpan.org/module/Crypt::SSLeay#ENVIRONMENT-VARIABLES
- https://metacpan.org/module/LWP#ENVIRONMENT

割と以前から認識されている問題なのになぜかドハマりしてしまったのでここに書き留めておきます。

`LWP::Protocol::connect`を使う解決策はこちら → [LWP::UserAgentでHTTPSプロキシ越しに通信する (LWP::Protocol::connect編)](http://qiita.com/debug-ito@github/items/c621aecca275b241053f)

# 検証バージョン

- Ubuntu  12.04.1
- perl  5.14.2
- LWP::UserAgent  6.04
- Crypt::SSLeay  0.64
- Net::SSL  2.85
- Net::Twitter  4.00003


# サンプルコード

```perl:lwp_https_proxy_sample.pl
use strict;
use warnings;
use LWP::UserAgent;
use HTTP::Request;

## ** See https://metacpan.org/module/Net::HTTPS
## Force use of Net::SSL instead of IO::Socket::SSL
$ENV{PERL_NET_HTTPS_SSL_SOCKET_CLASS} = 'Net::SSL';

## ** See https://metacpan.org/module/Crypt::SSLeay#ENVIRONMENT-VARIABLES
$ENV{HTTPS_PROXY} = 'http://your-https-proxy:8080';
$ENV{HTTPS_CA_DIR} = '/etc/ssl/certs';
## $ENV{HTTPS_DEBUG} = 1; ## ** Uncomment this for debug output


## ** See https://metacpan.org/module/LWP#ENVIRONMENT
## ** Uncomment this to disable server verification.
## ** You usually shouldn't do this, though.
## $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0;

my $ua = LWP::UserAgent->new;

## ** This lets LWP::UserAgent to handle HTTPS proxying, but that's wrong.
$ua->env_proxy;

## ** Explicitly disables HTTPS proxy by LWP::UserAgent.
## ** Just let Crypt::SSLeay do the job.
$ua->proxy(https => undef);

my $req = HTTP::Request->new('GET', 'https://metacpan.org/module/LWP::UserAgent');
my $res = $ua->request($req);

print $res->as_string, "\n";
```

- CONNECTメソッドを使うためには、プロキシ処理をLWP::UserAgentではなくCrypt::SSLeayに任せる必要がある。
- そのために、LWP::UserAgentではプロキシ設定を**行わない**。
- `env_proxy()`メソッドを呼んでもいいが、その後に必ず`$ua->proxy(https => undef)`としてプロキシ設定を消す。
- Crypt::SSLeayにプロキシ設定を伝えるには環境変数を使う。
- その際、環境変数`HTTPS_CA_DIR`で認証局証明書ディレクトリを指定しないとサーバ証明書の検証でエラーになる。
- さらに、環境変数`PERL_NET_HTTPS_SSL_SOCKET_CLASS`を`Net::SSL`に設定しないと、そもそもCrypt::SSLeayが使われないようだ。
  - `LWP::Protocol::https`が`Net::HTTPS`を使っており、`Net::HTTPS`は`IO::Socket::SSL`を優先的に使い、環境変数などで指定された場合に`Net::SSL`を使うから。

# LWP::UserAgentを使う別のモジュールを使う場合

例えば、Net::TwitterなんかはLWP::UserAgentを内製して内部で`env_proxy()`を呼んでしまう。

Net::Twitterの場合は幸い、使用するUserAgentクラスをカスタマイズできるので、以下のように`env_proxy()`を無力化するクラスを作って与えればいいと思う。

```perl:lwp_useragent_noenv.pl
package LWP::UserAgent::NoEnv;
use strict;
use warnings;
use base ('LWP::UserAgent');

sub env_proxy {
    print STDERR "Fake env_proxy called.\n";
}
1;
```

そういうカスタマイズのポイントがないモジュールの場合は・・・、LWP::UserAgent自体を外から上書きするのかなあ・・・。うーむ。
popwinの出現位置をフレームサイズに応じて切り替える


popwinの出現位置がフレームのサイズに応じて下になったり右になったり (上や左でもいいけど) したらいいなと思いました。フレームが縦長の時は下に、横長の時は右側に出るようにしてみました。

下に出るか横に出るかの正確な条件はコードを読んでくださいw


```~/.emacs.d/init.el
;; フレームのサイズに応じてpopwinの出現位置を決める
(defun popwin-auto-set-popup-window-position ()
  (interactive)
  (let ((w (frame-width))
        (h (frame-height)))
    (setq popwin:popup-window-position
          (if (and (< 200 w)         ; フレームの幅が200桁より大きくて
                   (< h w))          ; 横長の時に
              'right                 ; 右へ出す
            'bottom))))              ; そうじゃないときは下へ出す
;; popwin表示時にフレームサイズに応じた表示位置にする
(defadvice  popwin:display-buffer (before popwin-auto-window-position activate)
  (popwin-auto-set-popup-window-position))
```
PECL memcached + Couchbase Server via SASL authentication

# Couchbase Server 

は省きます...

# install dependency

PECL の memcached は libmemcached に依存しているため、インストールが必要です。また PECL の memcached 2.1.0 から libmemcached 0.x 系はサポートしてないので libmemcached 1.0.x 以上が必要になります。

* http://rpm.pbone.net/index.php3/stat/4/idpl/20117453/dir/redhat_el_6/com/libmemcached-1.0.16-1.el6.remi.x86_64.rpm.html

ここに現在 (2013/03/07) の最新の libmecached 1.0.16 の rpm があるので、remi を有効にしてインストールします。

```
$ yum install libmemcached --enablerepo=remi
```

また SASL 認証経由になるため依存するライブラリをインストールします。

```
$ sudo yum install cyrus-sasl-sql cyrus-sasl-plain cyrus-sasl-lib # この cyrus-sasl-plain がないと SASL 認証できない
```

# build PECL memcached by phpize

* http://php.net/manual/ja/book.memcached.php
* download from [PECL](http://pecl.php.net/package/memcached)

SASL 認証を有効にするためには --enable-memcached-sasl を configure オプションに渡す必要があります。ここでは phpize を使ってビルドします。

```
$ wget http://pecl.php.net/get/memcached-2.1.0.tgz
$ tar xof memcached-2.1.0.tgz
$ cd memcached-2.1.0
$ phpize
$ ./configure  --enable-memcached-sasl --with-php-config=/path/to/php-config
$ make
$ make install
```

# configure php.ini

またデフォルトでは SASL は有効にならないため、use_sasl を On にする必要があります。

```
extension="memcached.so"
memcached.use_sasl = 1
```

# hello hell

```php
<?php
$m = new Memcached();
$m->setOption(Memcached::OPT_BINARY_PROTOCOL, true); // See: http://gihyo.jp/dev/feature/01/memcached-1.4/0002
$m->addServer(COUCHBASE_SERVER_HOST, 11211);
$m->setSaslAuthData(USERNAME, PASSWORD); 
$m->set("hello", "hell");
var_dump($m->get("hello")); // => "hell"	
$m->quit();
```

# Any Debug?

```php
<?php
var_dump(Memcached::HAVE_SASL); // => shoule be 1
var_dump(ini_get("memcached.use_sasl")); // => shoule be 1
var_dump($m->getResultMessage()); // 直前の実行したメソッドの結果を確認できる
```
TideSDK 1.3.1-betaのインストール[Memo]

みなさん、TideSDKをご存じでしょうか？
TideSDKとは旧名をTitanium Desktopといい、HTML5 + CSS3 + JavaScript or Ruby or Python or PHPでクロスプラットフォームなデスクトップアプリケーションを開発することができる中々面白そうな開発環境です。前々から気になっていて、いつかインストールしてみようと思っていたのですが、いざ入れてみると結構ややこしかった and 日本語の情報が無かったのでメモしておきます。

なお、環境は64bitのWindows7、Tide SDKのバージョンは1.3.1-betaとします。

1.  まず [TideSDK] のサイトからSDKをダウンロードします。
    Download v1.3.1betaというところをクリックして、

    ![TideSDK_Install1](http://img.f.hatena.ne.jp/images/fotolife/a/alucky0707/20130307/20130307211515.png)

    Download TideSDK 1.3.1 betaというところの下から選択してください。

    ![TideSDK_Install2](http://img.f.hatena.ne.jp/images/fotolife/a/alucky0707/20130307/20130307211904.png)

    なおWindowsは64bit版は無いようなので、普通に32bit版を落としてきました。

2.  ダウンロードしたSDKを解凍します。
    そして出てきたファイルを、

        C:\ProgramData\TideSDK

    に配置してください。（`C:\ProgramData`は隠しフォルダ（？Windowsに明るくないので違う可能性あり）なので、エクスプローラーでは表示されません。上部のアドレスバーに直接パスを打ち込むなどして入ってください）
   正確にここじゃなくてはいけません。僕はここではまりました。
    ちなみにWindows XPの場合は、

        C:\Documents and Settings\All Users\Application Data\TideSDK

    に置く模様です。

3.  TideSDK Developerをインストールします。
    SDK同様 [TideSDK] のサイトへ行って、今度はインストーラーが配布されているので、落としてきて実行してください。

    ![TideSDK_Install3](http://img.f.hatena.ne.jp/images/fotolife/a/alucky0707/20130307/20130307212152.png)

4.  TideSDK Developerを起動します。
    スタートメニューを探るなり、インストールしたフォルダからTideSDK_Developer.exeを実行するなりしてください。
    ここまでうまくいっていれば、次のような窓が現れるはずです。

    ![TideSDK_Developer1](http://img.f.hatena.ne.jp/images/fotolife/a/alucky0707/20130307/20130307211032.png)

    Titanium SDK versionのところに1.3.1-betaと入っていることがポイントです。
    これがない場合、SDKが正しく読み込まれていません。SDKが正しい場所にあるか確認してみてください。

5.  最後に動作確認します。
    New Projectの項目に適当に値を入れて、Create Project。上のタブをTest & Packageにして、Launch Appをクリックします。

    ![TideSDK_Developer2](http://img.f.hatena.ne.jp/images/fotolife/a/alucky0707/20130307/20130307212833.png)

    するとこのようになります。

    ![TideSDK_Developer3](http://img.f.hatena.ne.jp/images/fotolife/a/alucky0707/20130307/20130307213223.png)

ひとまずインストールここまでです。

まだインストールしただけで何も作れていないのですが、HTML5を利用してデスクトップアプリケーションを開発できるのはとても魅力です。
とりあえずメモ帳でも作ってみるかな。

（日本語の情報が皆無で死ぬかと思ったぜ）
[TideSDK]:http://www.tidesdk.org/
inotifyを使ってみた。


inotifyというディレクトリやファイルを監視する仕組みがあるらしい。そこで使ってみた。下記は、引数でファイルを与え、そのファイルへの変更を監視するサンプルです。
inotify_init()でfdを取得して、inotify_add_watch()で監視するイベント、ファイル(ディレクトリ)を設定し、read()を使って、発生したイベントを取得する仕組みです。
tail -fとかもこんな感じで処理している気がします。

```c:inotify_sample.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/inotify.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/inotify.h>

#define EVENT_SIZE  ( sizeof (struct inotify_event) )
#define BUF_LEN     ( 1024 * ( EVENT_SIZE + 16 ) )

void inotify_events_loop( int fd );
int inotify_read_events( int fd );

int main( int argc, char **argv ) 
{
    int fd = -1;
    int wd = -1;
    char *filename = NULL;

    if  ( argc != 2 ) {
        fprintf( stderr, "Usage:%s filepath\n", argv[0]);
        goto ERROR;
    } 

    filename = argv[1];

    if( (fd = inotify_init()) == -1 ) {
        perror( "inotify_init" );
        goto ERROR;
    }

    wd = inotify_add_watch( fd, argv[1], 
            IN_MODIFY | IN_CREATE | IN_DELETE );

    inotify_events_loop( fd );

    inotify_rm_watch( fd, wd );
    close( fd );

    return 0;
ERROR:
    return 1;
}

void inotify_events_loop( int fd )
{
    int count = -1;
    while(1) {
        count = inotify_read_events( fd );
        fprintf( stdout, "events count[%d]\n", count);
    }
}

int inotify_read_events( int fd )
{
    int count = 0;
    int i = 0;
    char buffer[BUF_LEN];
    int length = 0;
    if( (length = read( fd, buffer, BUF_LEN ) ) < 0 ) return count;

    while ( i < length ) {
        struct inotify_event *event = ( struct inotify_event * ) &buffer[ i ];
        /* 必要なイベントの処理 */
        if ( event->mask & IN_MODIFY ) {
            printf("%s file is modify\n",  event->name);
        }
        i += EVENT_SIZE + event->len;
        count++;
    }
    return count;
}
```
npm install したら "Error: EMFILE, too many open files"

# エラー

    npm ERR! Error: EMFILE, too many open files
    npm ERR!     at new Glob (/Users/ore/.nodebrew/node/v0.8.12/lib/node_modules/npm/node_modules/glob/glob.js:105:21)
    npm ERR!     at glob (/Users/ore/.nodebrew/node/v0.8.12/lib/node_modules/npm/node_modules/glob/glob.js:57:11)
    npm ERR!     at gypfile (/Users/ore/.nodebrew/node/v0.8.12/lib/node_modules/npm/node_modules/read-package-json/read-json.js:129:17)
    npm ERR!     at /Users/ore/.nodebrew/node/v0.8.12/lib/node_modules/npm/node_modules/read-package-json/read-json.js:116:40
    npm ERR!     at /Users/ore/.nodebrew/node/v0.8.12/lib/node_modules/npm/node_modules/slide/lib/async-map.js:54:35
    npm ERR!     at Array.forEach (native)
    npm ERR!     at /Users/ore/.nodebrew/node/v0.8.12/lib/node_modules/npm/node_modules/slide/lib/async-map.js:54:11
    npm ERR!     at Array.forEach (native)
    npm ERR!     at asyncMap (/Users/ore/.nodebrew/node/v0.8.12/lib/node_modules/npm/node_modules/slide/lib/async-map.js:53:8)
    npm ERR!     at extras (/Users/ore/.nodebrew/node/v0.8.12/lib/node_modules/npm/node_modules/read-package-json/read-json.js:115:17)
    npm ERR! If you need help, you may report this log at:
    npm ERR!     <http://github.com/isaacs/npm/issues>
    npm ERR! or email it to:
    npm ERR!     <npm-@googlegroups.com>

    npm ERR! System Darwin 12.2.0
    npm ERR! command "/Users/ore/.nodebrew/node/v0.8.12/bin/node" "/Users/ore/.nodebrew/current/bin/npm" "install"

    /Users/ore/.nodebrew/node/v0.8.12/lib/node_modules/npm/lib/utils/error-handler.js:235
      log.error("cwd", process.cwd())
                               ^
    Error: EMFILE, too many open files
        at process.errorHandler (/Users/ore/.nodebrew/node/v0.8.12/lib/node_modules/npm/lib/utils/error-handler.js:235:28)
        at process.EventEmitter.emit (events.js:123:20)

依存モジュールが多いのでファイルディスクリプタの制限を越えたようす

```bash
    # 確認
    limit
    # ...
    # > descriptors     256

    # ふやす
    ulimit -n 1024
```

512にしてもだめで、1024までしたらインストールできるようになった

# OSの設定で増やしておく

これだとこのログインセッションでしか有効じゃないみたいなので、OS X なら<a href="https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.conf.5.html">launchd.conf</a>で指定しておけばいいらしい

```bash:$HOME/.launchd.conf
limit descriptors 1024
```

と書いておいた。
+演算子を用いてNSStringを文字列連結する方法

「@"hogehoge" + @"piyopiyo"」する方法です。
Objective-C++使っているので、拡張子をmain.mmみたいな感じにしてあげて下さい。
intとfloatにも対応しているので、「@"fugafuga" + 1 + 2 + 3.14f」で@"fugafuga123.14"になります。
MRCなので、ARCで使う場合はretainとかreleaseとかを適宜端折っちゃって下さい。

おかしいトコの指摘や、intやfloat以外に対応したコードとかを、
gistにpull request頂けたりすると、泣いて喜びますお(*´∀｀)

```objc:main.mm
//
//  main.mm
//  ObjCOperatorSample
//
//  Created by oden on 13/03/07.
//  Copyright (c) 2013年 JITAKUKEIBI INC. All rights reserved.
//

#import <Foundation/Foundation.h>

class ID
{
private:
    id object = nil;
    
public:
    ID(const id object = [[[NSObject alloc] init] autorelease])
    {
        this->object = [object retain];
    }
    
    ~ID()
    {
        [this->object release];
        this->object = nil;
    }
    
    operator id()
    {
        return this->object;
    }
    
    ID operator+(const id object)
    {
        return [[this->object description] stringByAppendingFormat:@"%@", object];
    }
    
    ID operator+(const int i)
    {
        return [[this->object description] stringByAppendingFormat:@"%@", @(i)];
    }
    
    ID operator+(const float f)
    {
        return [[this->object description] stringByAppendingFormat:@"%@", @(f)];
    }
    
    ID& operator+=(ID source)
    {
        [this->object autorelease];
        this->object = [[*this stringByAppendingFormat:@"%@", (id)source] retain];
        return *this;
    }
};

int main(int argc, const char * argv[])
{
    @autoreleasepool
    {
        // コピーコンストラクタ
        ID hoge = @"a";

        // operator+
        hoge = hoge + @"b";

        // operator+=
        hoge += @"c";

        // 複数のオブジェクトを連結する場合は、最初のオブジェクトをID型にキャストする
        hoge += (ID)@"d" + @"efg";

        // NSNumberやプリミティブ型にも対応可能
        hoge += (ID)@(1) + 2 + 3.14f;

        // 暗黙の型変換
        id piyo = hoge;

        // 明示的型変換
        NSLog(@"%@", (id)hoge);
        // 結果：abcdef123.14

        // 普通に出力
        NSLog(@"%@", piyo);
        // 結果：abcdef123.14
    }
    
    return 0;
}
```
SWF から全てのフィルターを削除する ActionScript

# 無力なマクロ
コレは幻想です→「Adobe Flash の JSFL マクロを使えば、手作業が自動化できる！」

実際は、いくつかの操作は有効なマクロが存在せず、有効なはずのマクロですら実行したとたん頻繁に Adobe Flash がアドビクラッシュになり、その直後クラッシュデーモンが出現するのです。

# Adobe 製品における正しい SWF の編集方法

Adobe Frustrator をはじめ、様々な Adobe 製品のクラッシュに悩まされ続ける皆さん。
もしあなたが .fla ファイルをマクロで操作している時にクラッシュしているのであれば朗報かもしれません。

出力される SWF ファイルのバイナリ編集方法は [SWF から DoABC を削除する ActionScript](http://qiita.com/items/0b2972ef699b1b179a57) で少し紹介しています。
今回は全てのフィルターを除去するツールを ActionScript で書く方法を紹介します。

## swc を取ってくる

前回と同じく

https://github.com/claus/as3swf
http://github.com/claus/as3swf/blob/master/bin/as3swf.swc


# コード

as3swf.swc を使って次のように書く

```as
	import com.codeazur.as3swf.SWF;
	import com.codeazur.as3swf.data.SWFSymbol;
	import com.codeazur.as3swf.data.filters.IFilter;
	import com.codeazur.as3swf.tags.ITag;
	import com.codeazur.as3swf.tags.TagDoABC;
	import com.codeazur.as3swf.tags.TagPlaceObject3;

	// ...

		private function getAllTags(swf:SWF):Vector.<ITag>
		{
			var tags:Vector.<ITag> = swf.tags

			for each (var tag:ITag in swf.tags)
			{
				tags = tags.concat(getAllTagsFromTag(tag))
			}
			
			return tags
		}

		private function getAllTagsFromTag(parentTag:ITag):Vector.<ITag>
		{
			var tags:Vector.<ITag> = new Vector.<ITag>()

			if ((parentTag as Object).hasOwnProperty("tags"))
			{
				tags = parentTag["tags"]
				for each (var tag:ITag in parentTag["tags"])
				{
					tags = tags.concat(getAllTagsFromTag(tag))
				}
			}
			
			return tags
		}

		public function removeFilters():void
		{
			var swfBytes:ByteArray = // SWF ファイルのバイト列
			var swf:SWF = new SWF(swfBytes)
			var filteredItems:Vector.<ITag> = getAllTags(swf).filter(
				function (item:ITag, index:int, array:*):Boolean
				{
					return ((item as Object).hasOwnProperty("hasFilterList") && item["hasFilterList"] && item["surfaceFilterList"].length > 0)
				}
			)

			for each (var item:ITag in filteredItems)
			{
				while(Vector.<IFilter>(item['surfaceFilterList']).length != 0)
					Vector.<IFilter>(item['surfaceFilterList']).pop()
			}

			var published:ByteArray = new ByteArray();
			swf.publish(published);
			// published をファイルに書きだしてね
		}
```

# 解説

* getAllTags(swf) は SWF の内部に書かれたすべてのタグを取得
  * タグとはこういうもの→ [制御タグ](http://hkpr.info/flash/swf/index.php?%E5%88%B6%E5%BE%A1%E3%82%BF%E3%82%B0)
  * タグはツリー上のデータ構造になっている
* removeFilters() では
  * as3swf を用いて全てのタグから hasFilterList を持つタグだけを抽出
  * それらのタグのフィルタ設定である surfaceFilterList の中身を空っぽに
  * 最後の publish はバイナリデータに書き戻したもの
  * ByteArray のpublished をファイルに書き出せば、そのファイルが「フィルタが全て削除された SWF」となる
PhoneGap2.4でHTML内に書いたアルファベットが大文字になってしまう件

PhoneGapを使って簡単なメモアプリを作った時に、
HTML内に書いたアルファベットがすべて大文字(uppercase)で表示されてしまったので、あれれと思っていたら、バッチで生成したHTML(index.html)が参照しているCSSファイル(index.css)の中(44行目)にこんなのが。

```css:index.css
text-transform:uppercase;
```

これがbodyタグに適用されているので、全部大文字になってしまう。
なんでこんなことになってるんだろうか。index.cssは他にも色々書かれているので、開発時はあらかじめ確認しておいたほうがよさそうだ。
CoronaSDK、楽にメモリ解放

coronaSDKでstoryboardを使ったとき、楽にメモリ解放できないもんか…、と
思ってたんですけど、
Facebookでアドバイスいただき、

```
local scene = storyboard.newScene()
function scene: destroyScene(event)
 local i
 for i=1,self.view.numChildren do
 self.view:remove(1)
 end
 display.remove(self.view)
 self.view = nil
end
scene:addEventListener( 'destroyScene', scene )
```

こんな感じだと、
display.remove(scene.view)だけより全然メモリ減りますね。
とりあえずコレが一番楽っぽい。
でももうちょい減らせそう…。
Ruby + ctags ~せっせとctagsで生成なんて間違ってたZの巻~

gem用のtags生成にて、
こんなことをやっていた時期が僕にもありました。

```sh
ctags -R -a --sort=yes --exclude=*.js --exclude=*.h --exclude=log --exclude=*.yml --exclude=.git --langmap=RUBY:.rb ~/.rbenv/versions/1.9.3-p125/lib/ruby/1.9.1 -f ~/rubyTags
```

はい、ださいねー。
バージョンやGemfile変わったらいちいち実行しなきゃいけないねー。

いま？

`:AlpacaTagsBundle`

簡単ね。

https://github.com/alpaca-tc/alpaca_tags
groongaで特定のカラムを更新するには

groongaやmroongaを実際に使っていて、記事を書いてもいいよ、という人を募集しています。
すでに数名の方からご応募いただいていますが、まだまだ募集中です。
詳細は[groonga普及のための協力のお願い](http://sourceforge.jp/projects/groonga/lists/archive/dev/2013-February/001186.html)を参照してください。

# はじめに

オープンソースの[カラムストア機能付き全文検索エンジンgroonga](http://groonga.org/ja/)を公開しています。
この記事を書いた時の最新のバージョンは2013年2月28日にリリースした3.0.1です。

groongaの話題を扱うメーリングリストは[コミュニティ](http://groonga.org/ja/docs/community.html)のページで紹介していますが、以下の2つがあります。

* [groonga-dev@lists.sourceforge.net](http://lists.sourceforge.jp/mailman/listinfo/groonga-dev)
* [groonga-talk@lists.sourceforge.net](http://lists.sourceforge.net/mailman/listinfo/groonga-talk)

groonga-devは日本語でやりとりするためのメーリングリストで、groonga-talkは英語でやりとりするためのメーリングリストです。

最近、groonga-talkに、どうやってカラムの値を更新したら良いのか?という質問がありました。

リレーショナルデータベースとカラムストアとではちょっと使い勝手が異なる点に戸惑いがあったようです。
(質問があった時点では英語のドキュメントが準備できていなかったというのもあるかも知れません。)

そこで、実際にどのようにカラムの値を更新すれば良いかというのを紹介します。

# loadコマンドについて

groongaでは、カラムの値を追加、更新するのにいずれも[loadコマンド](http://groonga.org/ja/docs/reference/commands/load.html)を使います。

実際の使用例はチュートリアルの[データのロード](http://groonga.org/ja/docs/tutorial/introduction.html#load-records)という項目で紹介していますが、簡単に紹介します。


# サンプルのスキーマとデータ

以下はサンプルとして使うテーブルのスキーマです。

```
table_remove Books
table_remove Bools

table_create Bools TABLE_HASH_KEY Bool

table_create Books TABLE_HASH_KEY UInt32
column_create Books title COLUMN_SCALAR ShortText
column_create Books price COLUMN_SCALAR Int32
column_create Books purchased COLUMN_SCALAR Bools
```

本のテーブルには、書名と価格、購入済みかどうかのフラグを保持するようになっています。

# データの登録と更新

では実際にデータを登録してみましょう。
データの登録には、以下のようにloadコマンドを使います。

```
load --table Books
[
{"_key":1, "title":"Head First Groonga", "price": 3400},
{"_key":2, "title":"Head First Mroonga", "price": 2800}
]
```

きちんと登録できたかをクエリを投げて確認してみます。
*--output_columns _key,title,price,purchased* というのは表示するカラムの指定です。


```
select Books --output_columns _key,title,price,purchased
```

実行結果を抜粋すると以下のようになります。(実行結果については見易いように適宜整形しています。)

```
[
  [
    [2],
    [["_key","UInt32"],["title","ShortText"],["price","Int32"],["purchased","Bools"]],
    [1,"Head First Groonga",3400,false],
    [2,"Head First Mroonga",2800,false]
  ]
]
```

では、次にカラムを更新してみましょう。
更新するのは書名が"Head First Groonga"で、価格を3,000、購入済みフラグ(true)にします。

更新するときには、対象となるカラムの *_key* を明示的に指定するのがポイントです。

```
load --table Books
[
{"_key":1,"price": 3000,"purchased":true}
]
```

今度は、更新したカラムを `--query _key:1` で抽出します。


```
select Books --query _key:1 --output_columns _key,title,price,purchased
```

以下のように、価格(price)と購入済フラグ(purchased)が更新できていることがわかります。

```
[
  [
    [1],
    [["_key","UInt32"],["title","ShortText"],["price","Int32"],["purchased","Bools"]],
    [1,"Head First Groonga",3000,true]
  ]
]
```

テーブルの購入済フラグに使っているのは[参照型](http://groonga.org/ja/docs/tutorial/data.html#reference-types)というものです。
3.0.1からは参照型カラムでBoolを使っていても、カラムを更新できるようになりました。

# まとめ

groongaを使い始めた当初に、アレっと思うかも知れないカラムの更新について簡単に紹介しました。

groongaに興味を持ったなら、まずは[インストール](http://groonga.org/ja/docs/install.html)して試してみてください。

[チュートリアル](http://groonga.org/ja/docs/tutorial.html)も用意しています。
EclipseにSLF4Jのテンプレートを追加

「Preferences > Java > Editor > Templates」に
Name: logger
Context: Java
Pattern: 以下の内容

    ${:import(org.slf4j.Logger, org.slf4j.LoggerFactory)}
    private static final Logger LOG = LoggerFactory.getLogger(${enclosing_type}.class);

で

    private static final Logger LOG = LoggerFactory.getLogger(現在のクラス.class);

というコードが生成されるように。
sshのhost名を自動補完させる

社内のサーバーを使っていたらsshのhost名が自動補完されていて「なにこれ超便利」という事で調べてみたら`bash-completion`を使っているようだったので導入方法のメモ。

```sh
# mac
brew install bash-completion
# redhat
yum install bash-completion
# debian
apt-get install bash-completion
```

debianはたいがい標準で入ってるようだけど。
入ったら`.bashrc`に読み込むように設定してしまえば完了。redhat系やdebian系では`/etc/profile.d/`に置いたりとかでも良い。

```sh
# mac
if [ -f `brew --prefix`/etc/bash_completion ]; then
    . `brew --prefix`/etc/bash_completion
fi
```

ちなみに`.bashrc`等でファイルを読み込む時は`.`や`source`でもどちらでも良いが、過去にcentosのminimalインストールをした時に`source`コマンドが無かったので`.`の方がどの環境でも使用できそうだ。

```
ssh <TAB>
```
で補完一覧が表示されれば完了。
`/etc/hosts``~.ssh/config``~/.ssh/known_hosts`からリストを引っ張ってきているみたい。
他にもgitの補完もしてくれるかわいいやつ。

こんな便利な物あったなんてなー
端末に意図しないコントロールキャラクタを漏らしてはならない


このポストでは、端末にコントロールキャラクタ・エスケープシーケンスが意図せず漏れてしまうことがどんな作用を引き起こしうるか、という話と、すでに各端末最新版でほぼ対応が完了している（任意のコードが最新版端末のデフォルト設定で確実に実行されてしまうような状況はもう確認されなくなった）と思われるタイトルレポーティング等にまつわる問題について書いてみます。
特に端末で動作するアプリケーションを書く人にとって、留意しておいた方が良い事案だとは思います。

結論
----
- アプリケーションが外部から受け取ったデータを端末に流す（表示する）ときは、C0/C1の範囲の文字が含まれていないかチェックしましょう。
- 端末エミュレータのアップデートには脆弱性の修正が含まれることがあるので、常に最新版にしておくのがおすすめです。

アプリケーションはコントロールキャラクタを漏らさないようにする
--------------------------------------------------

通常コントロールキャラクタというと、C0(\x00-\x1f,\x7f)、C1(\x80-\x9f,\xff)の範囲の文字を指します。アプリケーションの出力からはこの範囲の文字をきちんと意図して出す必要があります。
たとえば外部からもらってきた文字列を端末に表示するときは、この範囲の文字を潰したり代替文字で起き替えたりするようにアプリケーションを設計するべきです。
しかし現実にはそうは言っていられない場合(cygwinでWin32 Consoleアプリケーションを動かしたときなど)も多く、こういった状況下では端末サイドで大変なことにならないように対応を入れている、というのが実情です。

例を挙げてみます。
pythonのSimpleHTTPServerは端末上で

```
python -m SimpleHTTPServer
```

のように起動した場合、簡易Webサーバーが立ち上がり、アクセス状況を端末にロギングします。

SimpleHTTPServerがそのまま実運用されることはほぼ無いのでさしたる問題では無いはずなのですが、これは特殊なHTTPリクエストを送ってやることで外部から容易にエスケープシーケンスを紛れ込ませることができ、意図しない挙動を引き起こすことが可能です。

またいわゆる「冗長なUTF-8シーケンス」を使用することでコントロールキャラクタと同等の作用が引き起こされる、という抜け道を持つ端末もありました。もちろん私の知る限りでは最新版ですでに修正されていますが、アプリケーション側でも留意しておくにこしたことはありません。

一方アプリケーション側の対応はというとcursesを使用したものはほとんど大丈夫、と言ってよいと思います。しかしそうではないものは、C0レンジのサニタイズしか考慮されていなかったり、ちょっとしたいたずらを仕掛けることで容易に任意のエスケープシーケンスを漏らすことができたりするものが多く、いたずらする気が無くても勝手に漏れて変なことになっている状況もあったりします。

エスケープシーケンスが紛れ込んでも、表示が崩れるだけ？
---------------------------------------------
シンプルな機能しか提供しない端末や安全に留意して実装されたものであれば、表示が崩れるだけです。たいした問題ありません。

しかしタイトルレポーティング等、応答報告を利用する一部の端末機能を絡めた場合、被害が拡大します。以下の報告が参考になると思います。

['Terminal Emulator Security Issues' - MARC](http://marc.info/?l=bugtraq&m=104612710031920)

この問題に、さらにいくつかの端末の特性を組み合わせることによって、最悪任意のコードをユーザーに気づかれずに実行してしまうこともできます。（私の知る範囲の端末ではこの問題は最新版では修正されています）

アプリケーションサイドでは、こういった点を十分に留意しておく必要があります。

C1コントロールの扱い
-------------------
盲点となっている事案として、8bit系におけるC1コントロールの扱いがあります。
普段あまり意識されることは無いと思いますが、端末には7bitモード（7bit符号系、7単位符号系）の端末と、8bitモード（8bit符号系、8単位符号系）のものがあります。
7bit端末におけるコントロールキャラクタの範囲は、\x00-\x1f,\x7f（C0）なのですが、ISO-2022 8bit端末ではこれに加え、\x80-\x9f,\xff（C1）もコントロールとして意味を持ちます。さらに、UTF-8モードの8bit端末では2バイトで1文字となる、\u0080-\u009f,\u00ffもC1コントロールとして扱われることがありますが（[Markus Kuhnによる主張](http://www.cl.cam.ac.uk/~mgk25/unicode.html#term)）、このあたりの方針は端末によって混乱しているというのが実情で、サニタイズの仕方が難しいのです。
これについては、[DECSCL](http://www.vt100.net/docs/vt510-rm/DECSCL)などを出して8ビットコントロールを使えないようにする、という対策が考えられますが、個人的にはもうデフォルトで8ビットコントロール無効化でよいのでは、と感じています（ただエミュレータという側面があるソフトウェアなので話がややこしいです）。

まとめ
------
今回のタイトルレポーティングなどの問題は既知の話であるため書きましたが、個人的にこれからもっとセキュリティ上の検討をしなければいけないなと感じている領域に貼り付け周りの問題があります。
端末エミュレータは主として開発者が使用するツールであったりするのでこのあたりのチェックが甘いのが現状ですが、攻撃者が特定の開発組織をターゲットにする、という状況も考えられなくもないと思います。
いずれにしろこういったことに留意して端末アプリケーションを書く、ということを作法として定着させた方が健全なのではないでしょうか。
シェルスクリプトを書く時に気をつけている事など

あくまでも個人的な意見であって、自分がシェルスクリプトを書く時に気をつけている事を備忘録的に列挙しているだけです。
「こうするべきだ」と押しつけている訳ではありません。
勿論「私はこうしている」とか「こうすると良いよ」という意見や議論は大歓迎です。

## *export* (1) しないシェル変数は全て小文字で書く。

`PATH` や `HOME` などは**環境変数**なので大文字で。
スクリプト内で使っているのは単なる**シェル変数**なので小文字で。
使い方をちゃんと区別する事は重要だと思う。

## シェルの変数展開を活用しよう

```sh:
[ -z "${foo}" ] && foo="FOO"
```
という書き方でも問題ないけど、

```sh:
${foo:-FOO}
```
と記述した方がすっきり記述できるし意味が判りやすいと思う。

## *trap* (1) を活用しよう

*trap* (1) で 0 を指定するとスクリプトが正常終了した時にも指定した処理が実行されるので、プログラム中で作成した一時ファイルの削除などにはもってこい。
スクリプトの先頭で

```sh:
tmpdir="${TMP:-/tmp}/`basename ${0}`.$$"
mkdir -p ${tmpdir}
trap 'rm -r ${tmpdir}' 0
```
こんな処理をしてスクリプト中で使う一時ファイルなどは全て `${tmpdir}` 以下に作成する様にすると後始末も楽で便利。 

## コマンドを使う場合はコマンドの持つ機能を活用しよう

*grep* (1) や *cut* (1) と *awk* (1) や *sed* (1) を組み合わせて使うのは、殆どの場合において CPU とプロセスと時間の無駄遣い。
勿論あまりにも複雑な正規表現が必要な場合や処理が煩雑になる場合は勿論この限りではないです。

```sh:
grep "^HOGEHOGE" file | awk 'BEGIN { FS = "="}; { print $2 }'

```
というコード。一見何も問題ない様に見えるし確かに動作はするが、 *awk* (1) には拡張正規表現が実装されているで、

```sh:
awk 'BEGIN{FS="="}/^HOGEHOGE/{ print $2 }' file

```
とすれば記述が簡潔になるし *grep* (1) の分だけ CPU やプロセス、時間が節約できる。

```sh:
sed -n '/^HOGEHOGE/s/^.*=//p' file
```

としても等価なのでどちらを使うかは個人の好みで。

## エラーメッセージは標準エラー出力に出そう。

unix を使う上では基本中の基本です。

## インデント幅はスクリプト内で統一しましょう。

Tab でも スペース何個でも OK ですが、 1ファイルの中のインデント位は合わせないと恥ずかしいです。

## ${PATH} は信用せずにフルパスをシェル変数に代入して使う様にしましょう。

たまに ${PATH} に "." を含めるセキュリティ意識の低い困ったちゃんがいるので、スクリプト中で使用するコマンドは

```sh:
foo="/path/to/foo"
  :
${foo}
```

な感じで使うが良いと思います。
スクリプトの開発中は

```sh:
foo="echo /path/to/foo"
```
こんな感じに変更しとくと *mv* (1) や *rm* (1) の様なコマンドの実行を抑止できるので初期段階では特に重宝すると思います。

```sh:
logger="/usr/bin/logger -p daemon.err -t ${myname}"
```
なんて設定しとくと共通のロギング処理にもなるので安全便利。
一部の linux ディストリビューションの場合 /bin/sh が bash だったりするので、設定によっては *cp* (1) や *rm* (1) などが、 cp -i とか rm -i などの様な迷惑千万な alias に設定されていてもスクリプトの動作に支障をきたさなくなります。
シェルの内部コマンドも含め全てのコマンドは *execv* (2) 可能でなければならないと POSIX で定義されているので、 POSIX 準拠を詠っている OS であれば全てのコマンドが揃ってる(筈)。

## 複数行に渡る長いメッセージや固定データは *echo* (1) ではなくてヒアドキュメントを。

```sh:
echo "………" > ${output}
echo "………" >> ${output}
echo "………" >> ${output}

```

などと書いていると途中行を修正する時に ">>" をついうっかり ">" にしてしまったりする間違いをする危険性が高いし、それぞれの *echo* (1) の実行ごとにファイルのオープンクローズが繰り返されてしまい非常に効率が悪いので、

```sh:
cat << EOF> ${output}
………
………
………
EOF

```

と記述する様にすれば安心確実だしシステムにも優しいです。

## スペースで区切られたデータの構文解析は *set* (1) を活用しよう。

年、月、日 をそれぞれ `$year`、`$month`、`$date` に代入する処理を素直に書けば

```sh:
date="`date '+%Y %m %d'`"
year="`echo $date | awk '{ print $1 }'`"
month="`echo $date | awk '{ print $2 }'`"
day="`echo $date | awk '{ print $3 }'`"

```

な感じになるが *date* (1)、*echo* (1)、*awk* (1) の呼び出しが煩雑になる。それならば

```sh:
set -- `date '+%Y %m %d'`
year="$1"
month="$2"
day="$3"

```

の方が CPU やプロセス、時間の節約になるし、見た目もすっきりすると思う。勿論位置パラメタは上書きされるので必要な値は事前にシェル変数に保存する。

## bash や zsh に依存した処理は絶対使わない
    
折角移植性が優れているシェルスクリプトなので、なるべく posix に準拠した機能だけでスクリプトを作る様に心がけたいと思う。
Module#prepend

## Module#include

クラスAがモジュールMをincludeすると、メソッドの探索順は `A → M → …`のようになる。
つまり、モジュールMはクラスAの親クラス側に差し込まれる。

```ruby
module M
  def hello
    puts "M hello"
  end
end

class A
  include M

  def hello
    super
    puts "A hello"
  end
end

A.new.hello
# => M hello
# => A hello

p A.ancestors  # 自身と親クラスの配列を返す
# => [A, M, Object, Kernel, BasicObject]
```

## Module#prepend

Module#prependはクラスの子側(?)にモジュールを差し込む。
したがって、モジュールのメソッドで、インスタンスのメソッドをラッピングできる。

```ruby
module M
  def hello
    puts "before"
    super
    puts "after"
  end
end

class A
  prepend M

  def hello
    puts "hello"
  end
end

A.new.hello
# => before
# => hello
# => after

p A.ancestors  # 自身と親クラスの配列を返す
# => [M, A, Object, Kernel, BasicObject]
```

差し込まれる順番は自然。
`Module#include`はクラスのすぐ後ろ(親側)に追加していく。
`Module#prepend`は先頭(子側)に追加していく。

```ruby
module M1; end
module M2; end

class A
  include M1  # A -> M1
  include M2  # A -> M2 -> M1 (Aのすぐ後ろに追加していく)
end

class B
  prepend M1  # M1 -> B
  prepend M2  # M2 -> M1 -> B (先頭に追加していく)
end

p A.ancestors  # 自身と親クラスの配列を返す
# => [A, M2, M1, Object, Kernel, BasicObject]

p B.ancestors  # 自身と親クラスの配列を返す
# => [M2, M1, B, Object, Kernel, BasicObject]
```

## 参考リンク
[Module#prepend - alias_method_chainが滅ぶ日 - I am Cruby!](http://d.hatena.ne.jp/authorNari/20101204/1291210556)

[Ruby 2.0 : Module#prepend]
(http://dev.af83.com/2012/10/19/ruby-2-0-module-prepend.html)
rvmからrbenvへ移行したらbundle installに失敗した。


エラーログを残し忘れました Orz
とあるgemのインストールで失敗していたのですが。

```bash
$ which bundle
/usr/bin/bundle
```

使っていたbundleコマンドが、Macに残っていた古いものを参照していたのが原因。
こういうのちゃんと消しておいた方がいいね（反省

```bash
$ gem install bundler
$ which bundle
/Users/hiroyou/.rbenv/shims/bundle
```

rbenvの環境でbundlerをインストールしたらちゃんと動きましたよ。

ググっても出て来なかったのでメモ。

##参考

rbenvのインストールに関してはこの辺を参考にしました。

[Homebrew+rbenvでRuby 2.0.0-p0インストール](http://d.hatena.ne.jp/deeeki/20130225/brew_rbenv_ruby2)
[モテカワるびいすとのための rbenv 入門](http://blog.happyelements.co.jp/2012/10/rbenv.html)
bit列の取得

プログラムをしていると2進数のビット列を確認したい場合がある。
そんな時には *bc* (1) が便利。ビット列以外にも基底数の変換も簡単です。
よく利用するならスクリプトか alias に設定しておくと楽かな。

```sh:sample
$ echo "ibase=10; obase=2; 10" | bc     ← 10進数の10のビット表示
1010
$ echo "ibase=16; obase=2; 20" | bc     ← 16進数の20のビット表示
100000
$ echo "ibase=10; obase=16; 30" | bc    ← 10進数の30の16進数表示
1E

```

基底数の変換は *gdb* (1) でも可能だけどビットまでは表示できない。

```sh:sample
(gdb) p/x 10                             ← 10進数の10を16進数で表示
$1 = 0xa
(gdb) p/x 20                             ← 10進数の20を16進数で表示
$2 = 0x14
(gdb) p/x $1 + $2                        ← 10進数の10+20を16進数で表示
$3 = 0x1e
(gdb) p $2 - $1 / 3                      ← 10進数の20 - (10 / 3)を10進数で表示
$4 = 17
(gdb) p ($2 - $1) / 3                    ← 10進数の(20 - 10) / 3を10進数で表示
$5 = 3
(gdb) q

```
iOS 様々な比較パターンまとめ


UIKit.framework, Foundation.frameworkなどiOSには様々な比較のメソッドや関数があります。
だいたい下記の3つのパターンに当てはまると思います。

## 1. 構造体 (CGRect, CGPoint, CGRange …)
Equal系の関数がある。

	/* CGRect */
	bool CGRectEqualToRect (
	      CGRect rect1,
	      CGRect rect2
	);
	
	/* CGPoint */
	bool CGPointEqualToPoint (
   		  CGPoint point1,
	      CGPoint point2
	);

## 2. クラス (NSString, UIColor …)
Equal系のメソッドがあったり、他のfameworkの関数を利用したり。

	/* NSString */
	- (BOOL)isEqualToString:(NSString *)aString


	/* UIColor */
	- bool CGColorEqualToColor (
			  CGColorRef color1,
			  CGColorRef color2
	);
	// 使用例
	CGColorEqualToColor(color1.CGColor, color2.CGColor);

## 3. クラス (NSIndexPath, NSNumber …)
数値を扱ったり大小が比較出来るクラスの場合、NSComparisonResultを使用する比較メソッドがあります。(※ 更にoptionやrangeを指定出来るものもあります)

	/* NSIndexPath */
	- (NSComparisonResult)compare:(NSIndexPath *)indexPath
	// 使用例    
    NSComparisonResult result = [indexPath1 compare:indexPath2];
    if (result == NSOrderedAscending) {
        NSLog(@"indexPath1はindexPath2より小さい");
    } else if (result == NSOrderedDescending) {
        NSLog(@"indexPath1はindexPath2より大きい");
    } else { // result == NSOrderedSame
        NSLog(@"indexPath1といndexPath2は等しい");
    }
compoundでテーブル名を独自に定義したい時

例えばusersという名前でテーブルを作っていて、それをcompoundで使いたい場合の対処。
そのままcompound g model とかでモデルを作るとUserテーブルを読もうとする。
その場合は作ったプロジェクトの中のschema.jsで以下のようにsetTableNameで定義してあげたら良い。

```text:db/schema.js
var User = describe('User', function(){
  property('id',Number);
  property('name',String);
  setTableName('users');
  set('restPath', pathTo.users)
});
```
【メモ】compoundの導入

rootで以下実行

```text:
npm install compound -g
```
この時以下のようなエラーが出たらrailwayあたりが入っている可能性があるため/usr/bin/rwのシンボリックリンクを削除する

```text:
npm ERR! error rolling back Error: Refusing to delete: /usr/bin/rw not in /usr/lib/node_modules/compound
npm ERR! error rolling back     at clobberFail (/usr/lib/node_modules/npm/lib/utils/gently-rm.js:41:12)
npm ERR! error rolling back     at next (/usr/lib/node_modules/npm/lib/utils/gently-rm.js:27:14)
npm ERR! error rolling back     at /usr/lib/node_modules/npm/lib/utils/gently-rm.js:36:12
npm ERR! error rolling back     at Object.oncomplete (fs.js:297:15)
npm ERR! error rolling back  compound@1.1.5-11 { [Error: Refusing to delete: /usr/bin/rw not in /usr/lib/node_modules/compound] code: 'EEXIST', path: '/usr/bin/rw' }
npm ERR! Refusing to delete: /usr/bin/rw not in /usr/lib/node_modules/compound
File exists: /usr/bin/rw
Move it away, and try again. 
```

困った点。
何故か作ったプロジェクトを動かそうとすると以下エラーが表示された。

```text:
  app.use(compound.assetsCompiler.init());
TypeError: Cannot call method 'init' of undefined
```

対処として、全然関係ない場所にディレクトリを作り直してもう一度プロジェクトを作り直したら出来た。
このあたりは未だ理解出来てない。。。
jQueryでcheckboxでval()したい

以下のようにして`true`か`false`でチェック状態を取得したい。

```javascript
$('#checkbox').val();
```

`$.valHooks[type].get`を設定すればよさそう。
https://github.com/jquery/jquery/blob/2.0.0b2/src/attributes.js#L171

そういうわけで、jQueryを読み込んだ後のソース中のどこかに以下のパッチを置けばおｋ。

```javascript
$.valHooks.checkbox || $.valHooks.checkbox = {};
$.valHooks.checkbox.get = function(elem) {
  return $(elem).is(':checked');
};
```

ただ、jQuery本体でもそれっぽい動きをさせようとしている部分があったり(なんか動かん)。
https://github.com/jquery/jquery/blob/2.0.0b2/src/attributes.js#L466

---

追記：

単純にこれでいいのかも。

```javascript
$.valHooks.checkbox.get = function(elem) { return !!elem.checked; };
$.valHooks.checkbox.set = function(elem, value) { elem.checked = !!value; };
```
一定時間、処理を非同期で待つメソッド


通信処理など時間が掛かる処理を行いたいが、一瞬で完了してはUI的に困る。最低xx秒は処理の完了を待ってほしいときに以下のように呼び出す。
下の場合、A点の処理が一瞬で完了したとしても、最低0.8秒はB点の処理の実行は待機される。

```利用例
sender.enabled = NO;
[NSObject perform:^(NSNotifyHandler done) {
	//A 通信などの処理
	[self hogeWithCompletion:^{
		done(^{
			//B 完了した時に行う動作
			NSLog(@"done");
			sender.enabled = YES;
		});
	}];
} waitUntil:0.8];
```


実装
---
実装には以前こちらで紹介されていた[STDeferred](http://qiita.com/items/c2ac4df40ad001179afa)ライブラリを利用させて頂きました。


``` NSObject+AsyncWaitUntil.h
typedef void(^NSNotifyHandler)(void (^completion)());

@interface NSObject (AsyncWaitUntil)
+ (void)perform:(void (^)(NSNotifyHandler done))task waitUntil:(NSTimeInterval)timeInterval;
@end
```

```NSObject+AsyncWaitUntil.m

#import "NSObject+AsyncWaitUntil.h"

#import <STDeferred/STDeferred.h>

@implementation NSObject (AsyncWaitUntil)

+ (void)perform:(void (^)(NSNotifyHandler))task waitUntil:(NSTimeInterval)timeInterval
{
	NSAssert(task, @"NSNotifyHandler must be non-nil.");
	STDeferredBlock runTask = ^{
		STDeferred *deferred = [STDeferred deferred];
		NSNotifyHandler notify = ^(void (^completion)()) {
			[deferred resolve:completion];
		};
		task(notify);
		return deferred;
	};
	
	STDeferredBlock waitUntil = ^{
		STDeferred *deferred = [STDeferred deferred];
		int64_t delayInMilliSeconds = timeInterval * 1000;
		dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInMilliSeconds * NSEC_PER_MSEC);
		dispatch_after(popTime, dispatch_get_current_queue(), ^(void){
			[deferred resolve:nil];
		});
		return deferred;
	};
	
	[[STDeferred when:runTask, waitUntil, nil] then:^(id resultObject) {
		id block = [resultObject objectAtIndex:0];
		if (![block isKindOfClass:[NSNull class]]) {
			void (^completion)() = block;
			completion();
		}
	}];
}
```
mongolabにJSONデータをインポートする


まったくもって簡単だけど（mongolabにちゃんと書いてある）けど、引っかかったので他の人が躓かないよう。

例えば、DB名がtestdbでその中にあるコレクションがtestの場合には以下のようにmongoimportを呼ぶようにしろとmongolabのインポート方法に書かれている。

```Bash
mongoimport -h (mongolabで指定されるURL) -d testdb -c test -u (ユーザ名) -p (パスワード) --file (インポートするJSONファイル)
```

このように至極簡単ではあるけど、ユーザとパスワードはDB作成時に設定したユーザ・パスワードが優先されているようです。設定していない場合はログインユーザで問題ないと思われます。
CentOSでFuelPHPをnginxで動かしてみたときのメモ


FuelPHPを触ることになったのでnginxで動作させてみた時のメモ

## 環境

* centos6.3（ゲストOS）
* macosx10.8(ホストOS)

## 事前準備に必要なもの
* php5.3以上
* php-fpm

## 参考にしたサイト
* [日本語版ドキュメント](http://press.nekoget.com/fuelphp_doc/installation/instructions.html#manual)


## 公式サイトからFuelPHPを取得する

[公式サイト](http://fuelphp.com/)にいってDownloadボタンをポチッと押して自分のドキュメントルートに持っていく

構成はこんな感じ

```shell
unzip fuelphp-1.5.2.zip
```

## oilでインストールする

展開したディレクトリにoilというファイルがあるのでそこで下記のコマンドを実行する。
日本語版公式どおりです

```shell
sudo php oil refine install
```

## nginxの設定

```shell:/usr/local/nginx/conf/nginx.conf
http {
    .
    .
    .
    server {
        listen       80; #ポート番号
        server_name  lo.fuel.master.org; #バーチャルホスト名
        root   /home/web/lo.fuel.master.org/public; #FuelPHPのデフォルトのpublicディレクトリ
        index  index.php index.html index.htm;
        access_log  /usr/local/nginx/logs/access.log;

        # Rewrite FuelPHP
        location / {
            if (-f $request_filename) {
                expires 30d;
                break;
            }
            if (!-e $request_filename) {
                rewrite ^(.*)$ /index.php?q=$1 last;
            }
        }
     
        location ~ \.php$ {
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
}

```

## nginxの再起動

いつもどおり

```shell
/etc/init.d/nginx stop
/etc/init.d/nginx start
```

## ブラウザで確認する

今回なら[http://lo.fuel.master.org](http://lo.fuel.master.org)にアクセスしてFuelのwelcomeページが表示されればOK
NSPredicateフィルタリング

例えば下記のようなMealMenu型要素を複数もつNSArray *todaysMenuがいるとしましょう。

```objectivec:todaysMenu
// recipeName, calory, dishes
(
    "sandwitch, 500, (\n    BLT,\n    \"lemon soda\"\n)",
    "curry, 1800, (\n    \"beaf curry\",\n    salad,\n    \"lemon soda\"\n)",
    "ramen, 1100, (\n    \"miso ramen\",\n    water\n)"
)
```
**todaysMenuを1000kCalオーバーのメニューのみで構成された配列としなさい**
* * *
通常、

```objectivec:forLoop
NSMutableArray *dishes = [NSMutableArray array];    
for (MealMenu *menu in todaysMenu) {
    if (menu.calory > 1000) {
        [dishes addObject:menu];
    }
}
todaysMenu = dishes;
```
とか

```objectivec:enumeration
__block NSMutableArray *weakDishes = [NSMutableArray array];
[todaysMenu enumerateObjectsUsingBlock:^(MealMenu *menu, NSUInteger idx, BOOL *stop) {
    if (menu.calory > 1000) {
        [weakDishes addObject:menu];
    }
}];
todaysMenu = weakDishes;
```
など、一旦NSMutableArrayのインスタンスを新規に追加して対応することが考えられます。
(NSArrayは直接removeできないし)

**NSPredicate**を利用すると、

```objectivec:filterUsingPredicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"calory > 1000"];
[todaysMenu filterUsingPredicate:predicate];
```
楽です。
しかも無駄なインスタンスも生成しなくてすむ。

…しかしこれじゃあまりにもハードコーディング。
そこで、

```objectivec:filterUsingPredicateTemplate
NSDictionary *evaluationDic = @{@"THRESHOLD": @1000};
NSPredicate *predicateTemplate = [NSPredicate predicateWithFormat:@"%K > $THRESHOLD", @"calory"];

NSPredicate *predicate = [predicateTemplate predicateWithSubstitutionVariables:evaluationDic];
[todaysMenu filterUsingPredicate:predicate];
```
こうすると外部制御の検討もできて良い感じになります。
HomebrewでPostgresqlをインストール(MacOS 10.8)

## インストール
* `brew install postgresql`を実行。ちょっと時間がかかる
* いろいろメッセージが出ています。うっかり消してしまっても、`brew info postgresql`を実行すれば、表示出来るので、ご安心

## 初期化
* `initdb /usr/local/var/postgres`を実行し、DB初期化する

## ログイン時自動起動するように設定
* `ln -sfv /usr/local/opt/postgresql/*.plist ~/Library/LaunchAgents`
* すぐ起動したい場合は、下記コマンドで起動

    `launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist`

## 確認
* `psql -l`でデータベース情報が表示されればOK

```
                              List of databases
   Name    | Owner | Encoding |   Collate   |    Ctype    | Access privileges
-----------+-------+----------+-------------+-------------+-------------------
 postgres  | ***   | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 |
 template0 | ***   | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/***           +
           |       |          |             |             | ***=CTc/***
 template1 | ***   | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/***           +
           |       |          |             |             | **8=CTc/***
(3 rows)

補足：***はユーザ名です。
```
rvm上のrubygemsのバージョンを変更する

rvm上のrubygemsのバージョンを変更する

```sh:
$ rvm rubygems 1.3.7 --force
```

Rails2系などの古いプロジェクトを使っていると、rubygemsが新しすぎてエラーが起きたり、おかしなことになったりすることがある。
(uninitialized constant ActiveSupport::Dependencies::Mutex とか)

上記のコマンドで結構簡単に変更できた。

問題のプロジェクトは互いに関係ないプロジェクトがいろいろなバージョンで動いているサーバーだった。

クラウドの良い点の一つは、環境ごと隔離できることだと実感した。

- アップグレードもその検証も簡単
- 引っ越しも楽
- セキュリティも保証される
- プロジェクト自体を保守しやすいレベルで長生きさせられる
ビルド番号自動更新


ビルド番号自動更新

バージョン番号の付番については以下に記載の通り。
http://www.awaresoft.jp/ios-dev/item/113-xcode-increment-build-num.html

多くのサイトで記載した方法だと、ピリオドに対応していなかったりします。

http://blog.dealforest.net/2012/06/auto_increment_cfbundleversion/
このページのようにbcを使えば、小数点として扱うことができます。

```
/bin/sh
InfoPlist="${SRCROOT}/${PROJECT_NAME}/${PRODUCT_NAME}-Info.plist"
bn=`/usr/libexec/PlistBuddy -c "Print CFBundleVersion" ${InfoPlist}`
bn=`echo ${buildNumber}+0.1| bc -l`
/usr/libexec/PlistBuddy -c "Set CFBundleVersion $bn" ${InfoPlist}
```

小数点でビルド番号を管理する必要がどこまであるかというのはありますが、デフォルトで1.0と記載されているので、それを手動で変更せずにすみますねw

これを、ビルド前に実行しないと、モジュールとplistの値が食い違います。
そこで、以下のページのようにSchemaの設定で実行されるようにします。
http://program.station.ez-net.jp/special/handbook/objective-c/iphone/build/inclement-build.asp

Product -> Schema -> Edit Schema
Build -> Pre-actions -> New Run Script Action

※とはいえ、ビルドに失敗しただけで、カウントアップされるので、注意が必要

さて、バージョンについてですが、ピリオドが２つあるので、小数演算では対応できません。
もちろん自動でカウントアップするものではないという性質のものではありますが、とあるルールをベースに自動でやっちゃった方がらくちんだったりします。

例えば、Archiveを実行する時だけ、リビジョンアップしましょうとすれば、先ほどのSchemaのArchiveでPreかPostのactionsに以下のスクリプトを記載します。

```
/bin/sh
InfoPlist="${SRCROOT}/${PROJECT_NAME}/${PRODUCT_NAME}-Info.plist"
vvv=`/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" ${InfoPlist}`
mm=`echo $vvv | cut -d . -f 1,2`
last=0`echo $vvv | cut -d . -f 3`
last=$(($last+1))
ver=$mm.$last
/usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString $ver" ${InfoPlist}
```

ちなみに、last=0`echo、、、の0はわざとです。デフォルトで1.0という設定値ですので、その場合でも、1.0.1と設定してくれるはずです

sed/awk/perlなどスクリプトでやっちゃえばもっとシンプルにできますが、割愛します。
RapidMiner on Ubuntu 12.10

GUIで操作できるデータマイニングツール[Rapid Miner](http://rapid-i.com/content/view/181/190/) をUbuntuに導入するためのメモ．

## Oracle JDK 7 をインストール

open-jdk でもいいけど、本家を入れておく

``` install_oracle_java.sh
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-jdk7-installer libha-jdbc-java
```

## RapidMiner 5.3 をダウンロード

Sourceforge からダウンロード．
http://sourceforge.net/projects/rapidminer/

/usr/local 以下に展開して使う．

``` download_and_reconfig_rapidminer.sh
$ sudo mv ~/Download/rapidminer-5.3.005.zip /usr/local
$ cd /usr/local
$ sudo unzip rapidminer-5.3.0005.zip
$ sudo chmod +x rapidminer/scripts/RapidMinerGUI
$ vi rapidminer/scripts/RapidMinerGUI
```

起動スクリプトにパスを書いておく（JAVA_HOMEは他でも使うなら~/.bashrc に書く）
RAPIDMINER_HOMEはコメントアウトしてある行を利用．

Rとの連携を予定している場合は下記の３行目も忘れずに．

``` RapidMinerGUI
export JAVA_HOME=/usr/lib/jvm/java-7-oracle/jre
export RAPIDMINER_HOME=/usr/local/rapidminer
export R_HOME=/usr/lib/R
```

## R との連携のためにはrJavaをインストールする．

``` rJava_install.sh
sudo apt-get install r-cran-rjava
```
R 自体のインストールは[Rjp wiki](http://www.okada.jp.org/RWiki/?R%20%A4%CE%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB#pbac840c) を参照．

## Unity ランチャーへの登録

~/.local/share/applications/ に **RapidMiner.desktop**
というファイルを用意し，実行権限を付与する．
（パスが間違っていなければファイルがアイコン表示される）
同フォルダからUnity ランチャーへドラックして登録．

``` RapidMiner.desktop
[Desktop Entry]
Version=1.0
Type=Application
Terminal=false
StartupNotify=true
Icon=/usr/local/rapidminer/resources/com/rapidminer/resources/rapidminer_frame_icon_128.png
Name=RapidMiner
Comment=Rapid miner
Exec=/usr/local/rapidminer/scripts/RapidMinerGUI
Categories=Development;IDE;
```

## 参考
- [朱鷺の杜Wiki RapidMiner](http://ibisforest.org/index.php?RapidMiner)
- [Install R Extension for RapidMiner on Ubuntu Linux](http://activeintelligence.org/blog/archive/install-r-extension-for-rapidminer-on-ubuntu-linux/)
linuxのc言語でgettextを使う

コマンドなどでLANG=Cとした場合とLANG=ja_JP.UTF-8とした場合に実行結果の出力が日本語になったりします。そのような国際化したプログラムを書く方法の一つにgettextを使う方法があるようです。サンプルコードは、簡易cpコマンドです。
gettextに対応するための処理で必要なのは、
(1)setlocale()では環境変数からロカール名を取得するようにする。(2)bindtextdomain()
(3)textdomain()でドメイン名とメッセージカタログディレクトリ(今回は'.')を設定。
※ドメインとは、gettext()の翻訳するmsgidのセットのことらしいです。

```c:sample.c
#include <stdio.h>
#include <locale.h>
#include <libintl.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#define BUFFERSIZE 4096
#define COPYMODE   0644

#define _(str) gettext(str)

void oops(char *s1, char *s2);

int main(int argc, char *argv[])
{
    int in_fd, out_fd, n_chars;
    char buf[BUFFERSIZE];
    struct stat src_stat;
    struct stat dest_stat;

    if( argc != 3 ) {
        fprintf(stderr, "usage: %s source destination\n", argv[0]);
        exit(1);
    }

    /* ロカール名を環境変数から取得 */
    setlocale(LC_ALL, "");
    /* ドメイン名"test"のメッセージカタログディレクトリをカレントディレクトリに設定 */
    bindtextdomain("test", ".");
    /* ドメイン名を"test"に設定 */
    textdomain("test");

    if( stat(argv[1], &src_stat) == -1 )
        oops("stat", argv[1]);

    if( stat(argv[2], &dest_stat) == -1 )
        oops("stat", argv[2]);

    if( src_stat.st_dev == dest_stat.st_dev ) {
        if( src_stat.st_ino == dest_stat.st_ino ) {
            fprintf(stderr, _("%s and %s are the same file\n"), argv[1], argv[2]);
            exit(1);
        }
    }

    if( (in_fd = open(argv[1], O_RDONLY)) == -1 )
        oops("Cannot open ", argv[1]);

    if( (out_fd = creat(argv[2], COPYMODE)) == -1 )
        oops("Cannot create", argv[2]);

    while( (n_chars = read(in_fd, buf, BUFFERSIZE)) > 0 )
        if( write(out_fd, buf, n_chars) < n_chars)
            oops("Write error to ", argv[2]);

    if( n_chars == -1 ) 
        oops("Readerror to ", argv[1]);

    if( close(in_fd) == -1 || close(out_fd) == -1 )
        oops("Error closing files", "");

    return 0;
}

void oops(char *s1, char *s2)
{
    fprintf(stderr, "Error: %s\n", s1);
    perror(s2);
    exit(1);
}
```
まず、このファイルをコンパイルして普通に動くことを確認する。
次に.potファイルを作る。

```
xgettext -k"_" -o test.pot cp1.c
```

test.potファイルの"Content-Type"に文字コードを設定し、他、空になっているmsgstrに日本語翻訳文字列を埋め込む。

```
"Content-Type: text/plain; charset=UTF-8\n" ←ここをUTF-8に変更
"Content-Transfer-Encoding: 8bit\n"

#: cp1.c:44
#, c-format
msgid "%s and %s are the same file\n"
msgstr "%s と %s は同じファイルです\n"　←ここに日本語を追加
```

次にmsgfmtでコンパイル → "*.mo"ファイルを配置・動作確認

今回は以下のようにコンパイルした。

```
msgfmt -o test.mo test.po
```

ディレクトリを作成して作成したmoファイルを配置する。

```
mkdir -p ja/LC_MESSAGES
cp test.mo ja/LC_MESSAGES/test.mo
```

これで、LANG=ja_JP.UTF-8で同じファイルをコピーする場合には、
file1とfile1は同じファイルです
と出力されます。