OmniAICreator/Qiita-1.07M huggingface dataset:
shared_ptrを用いた永続データ構造(配列)

## プログラム

```C++

#include <boost/shared_ptr.hpp>
#include <stdio.h>
using namespace std;
using boost::shared_ptr;

template<class T>
struct PersistentArray {
	static const int kShiftSize = 4;
	int shift_, size_;
	shared_ptr<PersistentArray> data_[1 << kShiftSize];
	shared_ptr<T> leaf_;
	
	PersistentArray(): size_() {}
	PersistentArray(const long size): size_(size) {
		if (!size) return;
		for (shift_ = 0; (1 << (shift_ * kShiftSize)) < size; shift_++);
		if (shift_ == 0) {
			leaf_.reset(new T());
			return;
		}
		long child_size = 1 << ((shift_ - 1) * kShiftSize);
		for (long start = 0; start < size; start += child_size) {
			data_[start / child_size].reset(new PersistentArray(
			    (start + child_size < size) ? child_size : (size - start)));
		}
	}
	
	const T &Get(const long index) const {
		if (shift_ == 0) {
			assert(index == 0);
			return *leaf_;
		}
		int shift = (shift_ - 1) * kShiftSize;
		return data_[index >> shift]->Get(index & ~-(1 << shift));
	}
	
	void Set(const long index, const T &value) {
		if (shift_ == 0) {
			assert(index == 0);
			leaf_.reset(new T(value));
			return;
		}
		int shift = (shift_ - 1) * kShiftSize;
		PersistentArray *pa = new PersistentArray();
		*pa = *(data_[index >> shift]);
		data_[index >> shift].reset(pa);
		data_[index >> shift]->Set(index & ~-(1 << shift), value);
	}
};

int main() {
	PersistentArray<int> a(100000), b(100000), c(100000);
	a.Set(7000, 100);
	printf("% 6d % 6d % 6d\n", a.Get(7000), b.Get(7000), c.Get(7000));
	b.Set(7000, 200);
	printf("% 6d % 6d % 6d\n", a.Get(7000), b.Get(7000), c.Get(7000));
	c = b;
	printf("% 6d % 6d % 6d\n", a.Get(7000), b.Get(7000), c.Get(7000));
	b = a;
	printf("% 6d % 6d % 6d\n", a.Get(7000), b.Get(7000), c.Get(7000));
	a.Set(7000, 300);
	printf("% 6d % 6d % 6d\n", a.Get(7000), b.Get(7000), c.Get(7000));
	b.Set(7000, 400);
	printf("% 6d % 6d % 6d\n", a.Get(7000), b.Get(7000), c.Get(7000));
	for (int i = 0; i < 10000; i++) {
		a.Set(8000, 300);
		b.Set(8000, 400);
		assert(a.Get(8000) == 300);
		assert(b.Get(8000) == 400);
		a = b;
		assert(a.Get(8000) == 400);
		assert(b.Get(8000) == 400);
	}
}
```

## 出力結果

```sh
% time ./PersistentArray
   100      0      0
   100    200      0
   100    200    200
   100    100    200
   300    100    200
   300    400    200
./PersistentArray  0.36s user 0.17s system 55% cpu 0.966 total
```
Levenshtein Automata VS 距離関数 のベンチマーク

[Levenshtein Automata ってずいぶん簡単に作れる](http://blog.notdot.net/2010/07/Damn-Cool-Algorithms-Levenshtein-Automata)んだなあと思ったので、ついでにベンチマークもとってみた。

以下のgistは、ランダムな文字列を100個生成して、"levenshtein"という文字との編集距離が2個以下か否かを、オートマトンを使う方法と距離関数を真面目に使う方法でそれぞれ判定させたもの。距離関数は[はてなおやさんとこの](http://d.hatena.ne.jp/naoya/20090329/1238307757)コピペした。

https://gist.github.com/3122254

動かした結果。

```
0.131075143814
1.49535894394
```

距離関数の方は枝刈りしてないってのもあると思うけど、オートマトンの方が11倍ほど速い。

ちなみに元のブログエントリで本当に面白いのはLevenshtein Automataの構築法ではなくてその後の話なので、興味がある方は読んでみるといいと思う。
cocos2DでTwitter処理


## ライブラリ追加
 * Twitter.framework

## 実装

```objective-c:Hoge.h
#import <Foundation/Foundation.h>
#import "cocos2d.h"
#import <Twitter/Twitter.h>

@interface Hoge : CCLayer {
    UIViewController* viewController;
}
@property(nonatomic,retain) UIViewController* viewController;
@end
```

```objective-c:Hoge.m
@synthesize viewController;

-(id) init
{
    self = [super init];
    if (self) {
        CGSize screenSize = [[CCDirector sharedDirector] 
        
        // uiview for twitter
        viewController = [[UIViewController alloc] init];
        
        // メニュー
        CCMenuItemFont *menuTwitter = [CCMenuItemFont itemFromString:@"つぶやく" target:self selector: @selector(onTwitter:)];

        CCMenu *menu = [CCMenu menuWithItems:menuTwitter, nil];
        menu.position = ccp(160, screenSize.height - 200);
        [menu alignItemsVerticallyWithPadding: 20.0f];
        [self addChild:menu z:1];

        self.isTouchEnabled = YES;
    }
    
    return self;
}


- (void) onTwitter:(id)sender
{
    if ([TWTweetComposeViewController canSendTweet]) // Check if twitter is setup and reachable
    {
        TWTweetComposeViewController *tweetViewController = [[TWTweetComposeViewController alloc] init];
        
        // set initial text
        [tweetViewController setInitialText:@"Greetings Twitterverse!"];
        
        // setup completion handler
        tweetViewController.completionHandler = ^(TWTweetComposeViewControllerResult result) {
            if(result == TWTweetComposeViewControllerResultDone) {
                // the user finished composing a tweet
            } else if(result == TWTweetComposeViewControllerResultCancelled) {
                // the user cancelled composing a tweet
            }
            [viewController dismissViewControllerAnimated:YES completion:nil];
        };
        
        // present view controller
        [[[CCDirector sharedDirector] openGLView] addSubview:viewController.view];
        [viewController presentViewController:tweetViewController animated:YES completion:nil];
        
    }
    else
    {
        // Twitter account not configured, inform the user
        NSLog(@"NO TWITTER ACCOUNT CONFIGURED. DO SOMETHING");
        UIAlertView* alertView = 
        [[[UIAlertView alloc] initWithTitle: @"未登録" 
                                    message: @"ついったーにあかうんと登録してください?" 
                                   delegate: self 
                          cancelButtonTitle: nil
                          otherButtonTitles: @"OK", nil] autorelease];
        [alertView show];
    }
}
```


## Reference
 * [Adding iOS5 native Twitter support to your cocos2d app](http://www.reigndesign.com/blog/adding-ios5-native-twitter-support-to-your-cocos2d-app/)
shared_ptrを使ったツリー構造

ポインタを使ったツリーデータ構造は自動的に解放されないがshared_ptrを使って自動的に不要となった部分を解放させることができる

```c++

#include <boost/shared_ptr.hpp>
#include <stdio.h>
using namespace std;
using boost::shared_ptr;

struct CharTree {
	shared_ptr<CharTree> parent;
	char c;
	
	CharTree(shared_ptr<CharTree> parent, char c):
	    parent(parent), c(c) {
		printf("Construct %c\n", c);
	}
	CharTree(CharTree *parent, char c):
	    parent(parent), c(c) {
		printf("Construct %c\n", c);
	}
	
	~CharTree() {
		printf("Destruct %c\n", c);
	}
};

int main() {
	/*
	[作るツリー]
	
	  A-B-G-H-I
	   \
	    C-D-E-F-J-K
	           \
	            L-M
	*/
	shared_ptr<CharTree> root(new CharTree(NULL, 'A'));
	shared_ptr<CharTree> leaf1(new CharTree(root, 'B'));
	shared_ptr<CharTree> leaf2(new CharTree(root, 'C'));
	leaf2 = shared_ptr<CharTree>(new CharTree(leaf2, 'D'));
	leaf2 = shared_ptr<CharTree>(new CharTree(leaf2, 'E'));
	leaf2 = shared_ptr<CharTree>(new CharTree(leaf2, 'F'));
	leaf1 = shared_ptr<CharTree>(new CharTree(leaf1, 'G'));
	leaf1 = shared_ptr<CharTree>(new CharTree(leaf1, 'H'));
	leaf1 = shared_ptr<CharTree>(new CharTree(leaf1, 'I'));
	leaf1 = shared_ptr<CharTree>(new CharTree(leaf2, 'J'));
	leaf1 = shared_ptr<CharTree>(new CharTree(leaf1, 'K'));
	leaf1 = shared_ptr<CharTree>(new CharTree(leaf2, 'L'));
	leaf1 = shared_ptr<CharTree>(new CharTree(leaf1, 'M'));
}
```

## 出力結果

```
Construct A
Construct B
Construct C
Construct D
Construct E
Construct F
Construct G
Construct H
Construct I
Construct J
Destruct I
Destruct H
Destruct G
Destruct B
Construct K
Construct L
Destruct K
Destruct J
Construct M
Destruct M
Destruct L
Destruct F
Destruct E
Destruct D
Destruct C
Destruct A
```
Flask on dotCloud でハマったところ

Flask で作ったアプリをどこにデプロイするかなーと思って[公式のデプロイドキュメント](http://flask.pocoo.org/docs/quickstart/#deploying-to-a-web-server)に書いてある Heroku と dotCloud で試そうと思ったわけです。で、Heroku は[ドキュメント](https://devcenter.heroku.com/articles/python)がもろに Flask であんまりハマリが無かったんですが、dotCloud でハマったのでメモ。あ、Heroku が良くて dotCloud が悪いってわけじゃないですよ！むしろ dotCloud で運用したいぐらい。

Flask 側のドキュメントには

> [Deploying WSGI on dotCloud](http://docs.dotcloud.com/services/python/) with [Flask-specific notes](http://flask.pocoo.org/snippets/48/)

と書かれてるので、基本 WSGI で、Flask を WSGI 向けにアレンジするわけです。前者に目を通しつつ、実際の作業は後者な感じです。

が、Heroku を先にやったので、パッケージの `__init__.py` に書く構成ではなかったのでした。パッケージのディレクトリ作ってあげて、`app.py` 的なものを `__init__.py` に移します。そして `wsgi.py` を書きます。`dotcloud.yml` で approot を指定しなかった場合、`wsgi.py` をルートに置きます。このあたり、前者のドキュメントと違うので要注意です。まぁ前者でも冒頭に

> Your WSGI callable should be named “application”, be located in a “wsgi.py” file, itself located at the top directory of the service.

書かれてはいるわけですが、その後の手順説明で approot 指定してるので。

で、動くようになるんですが、これだとサンプル止まり。デプロイしようとしてたアプリでは twitter API 使ってたので、鍵置かないとですね。鍵は絶対に SCM に入れたくないです。Heroku では [config:add](https://devcenter.heroku.com/articles/config-vars) で設定しました。これで os.environ から読めるようになります。

dotCloud では [var set](http://docs.dotcloud.com/guides/environment/#adding-environment-variables) します。指定の仕方は Heroku とほぼ同じだったのでコードもそのままで……と思ったら全然動かない！よくよくドキュメント読んでみたら [environment.json](http://docs.dotcloud.com/guides/environment/#reading-the-environment) を読む必要があるんですね。ここから読み込むようにコードを書き直しました。

これでとりあえずは動くところまで持っていけました。まだデータベース絡みのところは手を付けてないです。

ハマったところそんなにないじゃんという感じですが、ハマりを解決してくれた

```sh
dotcloud logs appname.www
```

を最初知らなくて大変だったというのが一番のポイントですね。[Heroku の Python チュートリアル](https://devcenter.heroku.com/articles/python) には heroku logs があったから分かったものの、dotCloud のほうにはそれがなかったようで、自分で探してくる必要がありました。Documentation の左の Platform Guides の [Consulting Logs](http://docs.dotcloud.com/guides/logs/) がそれです。これを見つけてからだいぶ捗りましたね。実際、環境変数を設定せずに実行してエラーが出た時に、原因分からずしばらく時間かかってしまいました。ログ見たら、あぁそれねって感じで。詰まったらログを見ましょう！
MercurialのStatusとかLogを微妙に色付けする

色付けすると見やすい！設定は~/.hgrcに次のように書いておく．

```text:.hgrc
[extensions]
color =

[color]
mode = ansi
```

全然関係ない話ですが，**hg serve -v**というコマンドを使えば，別にターミナルからログ等を見なくても，ブラウザ上で見ることが出来る機能が使えるようになっています．
Iterator と IteratorAggregate の違いに注意すべし

タイトルで結論を言い切った感もありますが、さておき。

## Iterator / IteratorAggregate

といった interface を実装することで、PHP ではそのインスタンスを foreach で回せるようになります。が、これには一点見落としがちな挙動があります。

以下のようなクラスを用意して実例を見てみましょう。

```iterator.php
<?
class HogeList implements Iterator {

    private $position = 0;
    private $array;

    public function __construct($array){
        $this->array = $array;
        $this->position = 0;
    }
    public function rewind() {
        $this->position = 0;
    }
    public function current() {
        return $this->array[$this->position];
    }
    public function key() {
        return $this->position;
    }
    public function next() {
        ++$this->position;
    }       
    public function valid() {  
        return array_key_exists($this->position, $this->array);
    }                                 
}
```

簡単なテストでは何も問題なさそうに見えますが…

```PHP
<?
$list = new HogeList([1, 2]);
foreach($list as $i){
    echo $i;
}
// 1 2
```

以下のように、同一のイテレータを利用して foreach を入れ子にすると挙動が怪しくなります。

```PHP
<?
$list = new HogeList([1, 2]);
foreach($list as $i){// A
    foreach($list as $i)// B
        echo $i;
}
// 1 2
```
要素 2 個の配列を回しているのだから "1 2 1 2" が出力されるかと思いきや、"1 2" しか出力されていません。このように動くのは、B を抜けたときにすでに $list 内のカーソルは最後を指していて、そのまま A のループまで抜けてしまうためです。仕様と言えば仕様ですが、しかしこの HogeList の使い勝手はあまり良さそうではありません。

参考として array をそのままループさせた場合も試してみます。

```PHP
<?
$list = [1, 2];
foreach($list as $i){
    foreach($list as $i)
        echo $i;
}
// 1 2 1 2
```

やはりこの挙動のほうがクラスを利用する側としては安心できますね。
ということで HogeList は IteratorAggregate を実装する形に変更してしまいましょう。

```aggregate.php
<?
class HogeList implements IteratorAggregate{
    private $array;
    public function __construct($array){
        $this->array = $array;
    }
    public function getIterator(){
        return new HogeIterator($this->array);
    }   
}   
```

この形であれば foreach を実行するたびに getIterator が呼ばれるので、先のような挙動の心配はありません。よくあるボイラープレートが隠れるためにコードの見通しがよくなるという意味でも、こちらの実装に分がありそうです。( HogeIterator は上記 iterator.php の HogeList と同じなのでコードは省略 )

実際に動かしてみると

```PHP
<?
$list = new HogeList([1, 2]);
foreach($list as $i){
    foreach($list as $i)
        echo $i;
}
// 1 2 1 2
```

期待する出力が得られることを確認できます。めでたし。

## まとめ

* IteratorAggregate と Iterator は "単なる foreach で回すための interface であってどちらも動作に大差ない" という認識は誤り。
* ライブラリとしてクラスを公開する際には、Iterator は委譲のために利用しておき、表には  IteratorAggregate として提供するといった設計のほうが無難。
* ここで毎回同じ Iterator を返したりすると元の木阿弥となるのでご注意を。
君ならどう書く Online 問題文、の回答例


[問題](http://ll.jus.or.jp/2012/doukaku-online-main.html)。勉強がてらStateモナドでパーサー作ってやってみた。相変わらず色々ひどいので、まだまだかなりの修行が必要。

https://gist.github.com/3258073
カスタムクラスローダを作ってみる 

ホットデプロイとかそういうのに興味が湧いたのでクラスローダとか触ってみます。

## MyClassLoader.java
    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream;
            
    public class MyClassLoader extends ClassLoader {
            
        public static void main(String[] args) {
            for (String arg : args) {
                File classFile = new File(arg);
                String className = classFile.getName().replace(".class", "");
                MyClassLoader loader = new MyClassLoader(classFile, className);
                try {
                    Class<?> clazz = Class.forName(className, true, loader);
                    System.out.printf("load class: %s\n", clazz.getName());
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
            }
        }

        private final File file;
        private final String name;

        public MyClassLoader(File file, String name) {
            super();
            this.file = file;
            this.name = name;
        }

        @Override
        protected Class<?> findClass(String name) throws ClassNotFoundException {
            if (!name.equals(this.name)) {
                return super.findClass(name);
            }
            byte[] data = loadClassData();
            return defineClass(name, data, 0, data.length);
        }

        private byte[] loadClassData() {
            byte[] data = new byte[(int) file.length()];
            try {
                InputStream input = new BufferedInputStream(new FileInputStream(file));
                try {
                    input.read(data);
                } finally {
                    input.close();
                }
            } catch (FileNotFoundException e) {
                throw new IllegalArgumentException(e);
            } catch (IOException e) {
                throw new IllegalArgumentException(e);
            }
            return data;
        }
    }
とりあえずclassファイルのFileオブジェクトとクラス名を与えると、そのクラス名でクラスを読み込めるようになるクラスローダを作成。
## MyClass.java
    public class MyClass {
        static {
            System.out.println("loaded MyClass");
        }
    }
ロードされると標準出力に文字を出力するだけのクラスを用意。
## 実行結果
    $ javac *.java
両方ともコンパイルだけして

    $ mkdir myclasses
    $ mv MyClass.class myclasses
MyClass.classはクラスパスには入っていないディレクトリに移動。

    $ java MyClassLoader myclasses/MyClass.class
    loaded MyClass
    load class: MyClass
引数で与えると、クラスパスには入っていないMyClass.classが読み込めている。

## 参考サイト
- [Java プログラミングのダイナミックス: 第 1 回 クラスとクラスのロード処理](http://www.ibm.com/developerworks/jp/java/library/j-dyn0429/)
Mountain Lion での ImageMagick トラブル


Mountain Lionにアップデート後、ImageMagickがうごかくなった。
convert v とかで
こんなメッセージがでます。

	dyld: Library not loaded: /opt/local/lib/libltdl.
	7.dylib
  	Referenced from: /usr/local/bin/convert
  	Reason: Incompatible library version: convert 	requires version 11.0.0 or later, but libltdl.	7.dylib provides version 10.0.0
	Trace/BPT trap: 5

## 解決策
	brew install libtool
	brew link libtool

ただし、10.7以降 X11は自分で用意する必要があるらしいので、
http://xquartz.macosforge.org/landing/

ここからダウンロードしてインストールしておきましょう。
Mountain Lion にupdateしたらbundle installでエラー


Mountain Lion に update したら bundle install で
make: /usr/bin/gcc-4.2: No such file or directory

となってハマったので回避方法模索したところ…。

http://loveless-ainakimono.seesaa.net/article/232323709.html
の記事が。

この記事を参考にして

	$ sudo ln -s /usr/bin/gcc /usr/bin/gcc-4.2

	$ sudo ln -s /usr/bin/g++ /usr/bin/g++-4.2

のようにシンボリックリンクをはって対応することで、
bundle install できるようになりました。
LL Decade　君ならどう書く Online　をrubyで解く

LL Decade 残念ながら参加できなかったけれど、君ならどう書くだけでも解いてみる。
問題は以下に。
http://ll.jus.or.jp/2012/doukaku-online-main.html
実際の問題文にはアクセスできなかったので、例文を解きました。

```ruby
def judge(s)
  ipv4 = s.split('.')
  return (ipv4.all?{|e| e=~/\A\d+\Z/ and e.to_i < 256} ? '01' : '11') if ipv4.length == 4

  ipv6 = s.split(':')
  return (ipv6.all?{|e| e.size <= 4 and e.to_i(16).to_s(16) == e.downcase} ? '10' : '11') if ipv6.length == 8

  mac = s.split(':')
  mac = s.split('-') unless mac.size == 6
  return (mac.all?{|e| e=~/\A[\da-zA-Z].\Z/} ? '00' : '11') if mac.length == 6
  '11'
end

bytes = []
DATA.readlines.map{|e| judge(e.chop)}.each_slice(4){|e| bytes << e.join.to_i(2)}
puts bytes.map(&:chr).join

__END__
192.168.0.23
00:00:01:22:23:34
FF:DD:BB:AA:CC:EE
2001:db8:bd05:1d2:288a:1fc0:1:10ee
123.45.67.89
12:34:56:78:9a:bc
1A-2B:2E-09:12:22
300.100.200.10
10.232.33.44
90-12-03-92-00-01
01234:22:4444:34:5555:5:f
0.100.32.10
100.200.100.200
10:20:30:01:02:03
11-22-33-44-55-66
9f34:234:1:123:45:6:FFFF:FFF
```
Rails 3.2 のプロジェクトに jasmine 導入して CoffeeScript でテスト書くまで - evergreen 編


先日 "Rails 3.2 のプロジェクトに jasmine 導入して CoffeeScript でテスト書くまで (http://qiita.com/items/ace811bf00d6d201635d)" という記事を書いたが、evergreen gem を使えばもっと簡単にできた。

# evergreen gem の導入

https://github.com/jnicklas/evergreen/

```ruby
# Gemfile
group :development, :test do
  gem "evergreen", require: "evergreen/rails"
end
```

```bash
bundle
rails s
# テストは /evergreen にブラウザでアクセスすることで実行
open http://localhost:3000/evergreen
```

# テストを書く

`spec/javascripts/**/*_spec.(js|coffee)` にテストを書く。特に設定などなしに CoffeeScript で書ける。

テスト中ではテストに必要なスクリプトを `require` で指定する。

```js
require "/assets/application.js"
```

毎回書くのも面倒なので、`spec/javascripts/spec_helper.(js|coffee)` を作って書いておく。

# テンプレート

DOM を扱うスクリプトのテストのために HTML 断片を読み込む仕組みが用意されている。

`spec/javascripts/templates/*.html` に HTML を置き、describe 内で template("foo.html") のようにロードする。

```coffee
describe "dom", ->
  template "foo.html"
  it "should find foo", ->
    expect(document.getElementById("foo")).not.toBeNull()
```

matcher は特に追加されないので、必要なら jasmine-jquery などを別途導入する。

# livereload

guard-livereload による自動ブラウザリロードを導入。これは evergreen 使わない場合とほとんど変わらない。

```ruby
# Gemfile
gem "guard-livereload"
```

```bash
bundle
guard init livereload
```

```ruby
# Guardfile
guard 'livereload' do
  # 下記の 1 行を追加
  watch(%r{spec/javascripts/.+\.(js|coffee)})
end
```

ブラウザの extension は https://github.com/mockko/livereload/blob/master/README-old.md から。
iOSアプリ開発を捗らせるツールのまとめ


iOSアプリ開発で自分がよく使うツールとサービスについてまとめてみました。

## BaaS: [Parse.com](http://parse.com)

ソーシャルな機能は持たせたいけどサーバ作るのだるい、そんなアプリ開発者の味方がBaaS(Backend as a Service)です。最近熱いですね。[Kinvey](http://kinvey.com), [StackMob](http://stackmob.com)なども試してみましたが、機能的にも料金的にも一番おすすめなのがParse.comです。100万APIまで無料、100万〜1500万APIまで$199という価格設定です。サーバは書くのが嫌というよりデプロイがめんどいくさいんですよね。BaaSなら一瞬でアクティブになりますので捗ります。

## リファレンス: [Dash](http://kapeli.com/dash/)

高速にリファレンスを検索したい時、Dashが使えます。
iOS以外にもjQuery,Android,Rails等ひと通り揃っています。

## リポジトリ: [github](http://github.com)

リポジトリは何でも言いっちゃ何でもいいんですが、githubはUIがかっこいい（重要）ので使ってます。個人開発だとブランチ切る必要もあんまりないんですね。Issueはチケット管理として使ってます。

## クラッシュレポート: [Crashlytics](http://beta.crashlytics.com/)

Crashlyticsを使うと、コードに1行追加するだけで、クラッシュレポートがバンバン飛んでくるようになります。レポートにはスタックトレースが付いてくるのでわかる時はすぐ直せますね。現在はまだベータ中なので無料です。

## AppStore分析: [AppAnnie](http://www.appannie.com/)
AppAnnieはアプリのAppStore順位変動、ダウンロード数変動などを見るのに使っています。
最近ちょっとやらかして問題になっていますが、とてもシンプルでわかりやすいです。
同様のサービスに[Distimo](http://www.distimo.com/)というのもあります。

## 多言語化: [Linguan](http://www.cocoanetics.com/apps/linguan/)
多言語化は初回はいいけど、メンテが大変。ちょっと油断するとすぐ翻訳漏れが出てきてしまいます。Linguanを使えば翻訳漏れを一発で検出してくれます。文言の入力もすぐに言語ファイルに反映してくれます。自分の場合はアップデート申請する直前にLinguanでチェックしてまとめて英語化しています。

## アクセス解析: [Google Analytics](http://www.google.com/intl/ja/analytics/)

動線の最適化、無断な通信の検出、そして何より本当にユーザが使っているという実感を得るために、アクセス解析ツールは重要です。
Google AnalyticsはWebだけじゃなくてiOS/Android等のモバイルアプリにも対応しています。
自分の場合は基本的にビューコントローラーのviewWillAppearでPVカウント、通信リクエスト時にイベントカウントとして計測対象としています。

## 実機ファイラ: [iExplorer](http://www.macroplant.com/iexplorer/)

iExplorerを使うとUSB接続したiPhoneやiPadのフォルダ/ファイルをMacから操作できるようになります。
ローカルにファイルを保存するタイプのアプリでは実機のファイル構造を覗けるツールがあるととても捗ります。
またセキュリティ的に危ないファイルが見える状態になっていないか、情報漏洩のチェックツールとしても使えます。

## メモリリーク検査: Istruments/Leaks

InstrumentsはXCodeインストールすると一緒に入ってくるプロファイラツールです。
いろいろ見れるんですが、メモリリークを教えてくれるLeaksが一番使えます。ただ検知されるとどうしても気になってしまいますが、実害がない場合も多いので対応はほどほどにした方が良さそうです。
あとLeaksでチェックする前にXCodeのAnalyzeを先にかけておきましょう。

## まとめ
 ざっと自分がiOSアプリ開発時に使っているツールを上げてみました。
どれもこれも、あるとないとでは大分捗りが変わってくると思います。

他にもこんなツールもあるぜって情報お待ちしています！
ニフティクラウドC4SAをBitbucketと連携させる


[ニフティクラウドC4SA](http://c4sa.nifty.com)が正式リリースとなりました。
2012年9月末までキャンバスの作成が無料のようです。この機会に試そうと思い、まずは基本的なところとしてgitとの連携を試してみました。

git連携ができるそうなので、githubではなく無料でプライベートリポジトリが持てるBitbucketと連携させてみようと思います。

なお、今回はSourcetreeというソフトを使ってgitが苦手な人でも試せるように配慮しましたので、MacOSX向けとなってます。

# 流れ

- Bitbucketでリポジトリ作成
- Sourcetreeでローカル側を作成
- index.htmlを作ってコミット＆プッシュ
- ニフティクラウドC4SAのSSHキーをBitbucketに登録
- ファイルキャンバスのgit登録にURLを設定
- Nginxのconfを調整し、index.htmlへアクセスできるようにする
- サーバのリロード

# 詳細

## Bitbucketでのリポジトリ作成

事前にBitbacketのアカウントを作成し、ログインしておいてください。

リポジトリを上部のメニュー「Repositories」から「Create repository」を行う。入力は画面にしたがって行ってください。

リポジトリが完成すると、以下のようが画面になると思います。

![Bitbucketでリポジトリ作成](https://d3jpl91pxevbkh.cloudfront.net/co-meeting-inc/image/upload/v1344034131/xz4jkf5nycajur0ulqkmgq.png)

ニフティクラウドC4SAからBitbucketへのアクセスはSSHになるので、「Clone this repository」のSSHをクリックする。
そうすると、コマンド例が図のようになるのでgit clone以下をコピーしておく。（この部分がニフティクラウドC4SAの「リポジトリURL」になる）

## Sourcetreeでローカル側を作成

Bitbucketの嬉しいところが、[Sourcetree](http://www.sourcetreeapp.com/)というアプリを利用できるところ。
このアプリは無料で使えるSVNとGitのクライアントなので、別のサービスなどでリポジトリを持っていたり、独自に運営している方も使えるはず。お勧めです。

Sourcetreeをインストールしたら、Bitbucketのアカウントを設定しておく。

次に、画面左上の「Add repository」を押し、設定画面になったら地球マークのボタンをクリック。そうすると、以下のようなリポジトリ選択画面になるので、今回の対象を選ぶ。
保存先のパスについてはお好きなところへ。

![SourcetreeにてBitbucketのリポジトリを選択する](https://d3jpl91pxevbkh.cloudfront.net/co-meeting-inc/image/upload/v1344034702/q1fr2ov0ioa3b6ryefccq.png)

## index.htmlを作成しコミット＆プッシュ

前の手順で作ったパスにてindex.htmlを作成し適当はHTMLを書き込む。

Sourcetreeに戻り、リポジトリの名前をダブルクリックすると以下のようになっている。（以下は既存ファイルを更新した結果なので、多少違うと思います）

![Sourcetreeにてコミット](https://d3jpl91pxevbkh.cloudfront.net/co-meeting-inc/image/upload/v1344035062/ynjjmhp9ueowuu1f7ynw.png)

「作業ツリーのファイル」に追加されたファイルがあるので、クリックすると右側に変更内容が表示される。問題なければ、「ファイルをステージへ移動」をクリックする。（これで「ファイルがindexにステージしたファイル」という名前のペインに移動する）
最後に、画面上部のコミットを押す。

このとき、「コミットを直ちにプッシュする」にチェックを入れておくと、一気にBitbucketへのプッシュも行われる。

## ニフティクラウドC4SAのSSHキーをBitbucketに登録

受け取り側のニフティクラウドC4SAの準備を行う。今回はRubyのキャンバスを使っているが、ここではNginxしか使わないのでたぶんどのキャンバスでも問題ないはず。

キャンバスの作成を行ったら「ファイル」と書かれたキャンバスを開き、右上のボタンにある「git登録」を押す。

![C4SAにてファイルカンバスにGitの設定](https://d3jpl91pxevbkh.cloudfront.net/co-meeting-inc/image/upload/v1344035486/5rqlkwa96jvtspqfdiq30a.png)

リポジトリ登録画面がでるので、最初の手順でコピーしておいたURLを登録する。さらに、何というディレクトリに保存して欲しいかをディレクトリ名に入力する。（ファイルの「home」以下に、この名前でディレクトリが作成され、リポジトリから取得されたファイルが保存されることになる。）

次に、ダイアログにある「SSH Key表示切替はこちら」をクリックする。そうすると公開キーが表示されるのでコピーする。

Bitbucketに戻り、自分のユーザー名からプルダウンで表示される「Account」というメニューをクリックする。

![SSHキーを登録する](https://d3jpl91pxevbkh.cloudfront.net/co-meeting-inc/image/upload/v1344035748/9y4rzlbljvzl376krkz2q.png)

SSH Keyに先ほどコピーした文字列をペーストして保存する。

C4SAの画面に戻り「実行する」をクリックすると、pullしてくれる。

**注意**
ニフティクラウドのファイルキャンバスにあるSSH Key表示は、キャンバスの作成直後はnoneになっていて、しばらく待つと生成されるようです。

## Nginxのconfを書き換える

Nginxのキャンバスを表示し、confを書き換えます。
今回は、あくまでindex.htmlが表示されれば良いとします。

まずrootの位置をpublicから、git登録したディレクトリにします。

```
 # root ${canvas_home}/data/${disk_id}/project/public;
   root ${canvas_home}/data/${disk_id}/bitbucket;
```


次に、Rubyの場合はUnicornに処理が飛んでしまうので、Proxyとしての処理させないようにしてしまいます。

```
    location / {
        # try_files $uri @rack_backend;
    }
```

locationの中をコメントアウトすると静的なファイルを探してくれます。

最後に、デーモン管理キャンバスでNginxをリスタートしてください。
ファイルまたはディレクトリのみへの chmod コマンド

```bash
find . -type f -print0 | xargs -0 chmod 644
find . -type d -print0 | xargs -0 chmod 775
```

参考にしたページ
[ファイルまたはディレクトリのみへの chmod コマンド](http://www.tec-q.com/note/2007/11/_chmod.html)
[find|xargsでスペース込みのパスが有る場合](http://www.jp-z.jp/changelog/2011-02-17-1.html)
テキストベースでグラフを書く（Octopress/Jekyll 向け）

![this is non-directed graph](http://25.media.tumblr.com/tumblr_m7p27myHck1qz64n4o1_250.png)

↓って書くと↑こうなる。[ってやつを作った。](https://github.com/kui/octopress-graphviz)

```text
{% graph %}
a -- b
b -- c
c -- a
{% endgraph %}
```

有向グラフの時は、`{% digraph %}` を使う。

```text
{% digraph %}
a -> b
b -> c
c -> a
{% enddigraph %}
```

インストール方法
------------------------------

Graphviz と Octopress プラグインをインストール

```installation.sh
sudo apt-get install graphviz
cd <your_octopress_dir>/plugins
wget https://raw.github.com/kui/octopress-graphviz/master/graphviz_block.rb
```

もう少し複雑な図を書く
------------------------

[Graphviz の公式サイト](http://www.graphviz.org/) を参照してください。

Graphviz のソースコードを書きたい
------------------------------------------

`{% graphviz %}` ブロックを使う。

```text
{% graphviz %}
digraph g {
 a -> b
 b -> c
 c -> a
}
{% endgraphviz %}
```

おわり
--------------------------------

HTML 内に SVG 要素を埋め込んでるので、HTML5 前提になってる。一応 altnative text みたいなのには簡単に対応しているので、ひょっとしたらちゃんと表示されるかも。確認していない。

確認していないけど Jekyll でも動くそうな。
Mac OSX の x86-64 のアセンブリ言語で，libc の puts 関数を呼び出すプログラム


http://qiita.com/items/b7ed1c9feef1b570a6b9 の続き。x86-64では引数を渡す際に，可能な限りレジスタを用いる。

```gas:hello2.s
        .text
        .globl  _main

msg:    .asciz "hello, world."

_main:
        # スタックポインタを16バイト境界に合わせる (ABIの規約)
        subq    $8, %rsp
        
        # 第1引数 (%rdi) に文字列のポインタを指定
        leaq    msg(%rip), %rdi
        
        # ベクタレジスタ数 (%rax) を0に設定
        movq    $0, %rax
        
        # putsを呼ぶ
        callq   _puts
        
        # スタックポインタを_mainの呼び出し前の状態に戻す
        addq    $8, %rsp
        
        # 戻り値として0を返す
        movq    $0, %rax
        ret
```

実行方法:

```console
$ gcc -o hello2 hello2.s
$ ./hello2
hello, world.
```

gcc を使わずに，ld コマンドだけで libc とリンクする方法は，よく分からない。

参考: x86-64 (amd64) の ABI (Application Binary Interface)
http://www.x86-64.org/documentation.html

## 追記 (8/5)
正しいやり方か確信がもてないが，以下の方法で ld コマンドでアセンブルできる。

```console
$ as -o hello2.o hello2.s
$ ld -o hello2 -macosx_version_min 10.7 -lSystem /usr/lib/crt1.o hello2.o
$ ./hello2
hello, world.
```
Qiitaの投稿をGitHubにバックアップ


最近、何か思いつくとQiitaに書いてばかりいます。やっぱり、KobitoのMarkdown + ローカル編集は楽ちんですね。

Qiita + Kobito への依存度が上がるにつれて、気になるのがバックアップ。そこで、Qiitaへの投稿をサクッとGitHubにバックアップするスクリプトを作りました。(for Mac)

* 例: [cognitom/Qiita](https://github.com/cognitom/Qiita) *←こんな感じにGitHubにコミットされます。*

##はじめに (前提条件)

* Kobitoを利用して投稿していること。
* PHPのコマンドライン版が使えること。(シェル版もそのうち公開されるかも)
* 例外処理とか書いてません。;-)

##使い方

0. まず、自分のGitHubに新規にリポジトリを作成します。
	* "Repository Name"を「Qiita」に。(別の名称でも構わないですが、以降適宜読み替えて下さい)
	* "Initialize this repository with a README"のオプションをチェック。
	* "Create Repository"をクリック。
0. Macにクローン。
	* "Clone in Mac"ボタンをクリック。
	* ~/github/Qiita にクローン。
0. 次のコマンドを実行。

```bash
$ cd ~/github/Qiita
$ curl -s https://raw.github.com/cognitom/Qiita/tool/update.php | php
```

※実行そのものも自動化したい場合は、dailyとかでcronを回して下さい。

##注意
コマンドを実行すると、カレントディレクトリの内容を一旦削除して、KobitoのデータベースからMarkdownファイルを再構築します。なので、必ずリポジトリのディレクトリに移動してから、実行すること。

##スクリプト解説

コードは、[GitHub](https://github.com/cognitom/Qiita/tree/tool)にも置いてあります。処理の流れはこんな感じ。

0. KobitoのデータはSQLiteに保存されているので、その内容をSQLで取得。
0. 1レコードずつ、ファイルに保存
0. 目次ファイルを保存 (README.md)
0. GitHubに自動コミット

なお、ここではQiitaに公開済みの投稿だけをバックアップするようにしました。(「限定共有」も除く)

下記ソースのコメントも参照。

```update.php
<?php
//各種設定
$dir = getcwd();
$dbfile = getenv('HOME') . '/Library/Kobito/Kobito.db';
$message = 'Automatic Update';

//ファイル名のサニタイズ関数
function sanitize($string) {
	return trim(str_replace(str_split("~`!@#$%^&*=+{}\\|;:\"',<.>/?"), '', strip_tags($string)));
}

//ローカルリポジトリのファイルを一度クリア
$files = glob("$dir/*");
foreach ($files as $file)
	if (is_file($file) && 'README.md' != basename($file))
		unlink($file);

//Kobitoからデータを取得 (SQLite)
$db = new SQLite3($dbfile);
$query = "select ZUID, ZTITLE, ZRAW_BODY, ZURL from ZITEM where ZUID is not null and ZPRIVATE = 0 ORDER BY ZPOSTED_AT DESC";
$results = $db->query($query);

//1レコードずつファイルに保存
$md = "Posts on Qiita\n=====\n\n";
echo "Collecting your posts from Kobito...\n";
while ($row = $results->fetchArray()){
	$title = sanitize($row['ZTITLE']);
	echo "* $title\n";
	$md .= "* [{$row['ZTITLE']}]({$row['ZURL']} \"see on Qiita\")\n";
	file_put_contents("$dir/$title.md", $row['ZRAW_BODY']);
}

//目次がわりのREADME.mdを作成
file_put_contents("$dir/README.md", $md);

//GitHubにコミット
echo "\nConnecting to GitHub...\n";
chdir($dir);
exec("git add -A");
exec("git commit -a -m '$message'");
exec("git push origin master");
```

##Appendix

### Q. Gitでユーザ名・パスワードを聞かれてめんどくさい
A. GitのモードがHTTPになっているのかも。次のコマンドでSSHに切り替えると、いちいち聞かれなくなるはず。

```bash
git config remote.origin.url git@github.com:your_user_name/repository_name.git
```

###Q. 毎回curlでダウンロードするのもどうかと...
A. 適当なところに[ダウンロード](https://raw.github.com/cognitom/Qiita/tool/update.php)して使って下さい。ダウンロードしたら、↓こんな感じで。

```bash
$ cd ~/github/Qiita
$ php ./update.php
```

###Q. Gist連携でいいじゃん
A. オンラインからの編集だと、その機能があるんですよね。最近気付きました。Kobitoからはその機能使えないのと、文章のバックアップも必要なので。GitHubのリポジトリの方がまとまってる感もありますし。

###Q. 投稿数が増えて来るとちょっとつらい?
A. 差分をとるような方向にプログラム修正した方が良いかも。コメント、フォーク歓迎です。
Mac OSX Mountain Lion で 64bit(x86-64) アセンブリ言語の HelloWorld プログラム


XCode 4.4 と Command Line Tools をインストールしている前提。GNU Assemblar で 64bit (x86-64) の Hello World プログラムを書いてみた。Lion でも同じ方法で動く。

```gas:hello.s
        # textセクション(書き込み不可領域)を指定
        .text
        
        # startを外部から参照可能にする (linux では _start)
        .globl start
        
        # 表示する文字列のデータ
msg:    .ascii      "hello, world.\n"
        
start:  
        # まず，write システムコールで文字列を表示する。
        
        # システムコール番号 (write=0x2000004) を %rax レジスタにセット
        # (linux では 0x01)
        movq    $0x2000004, %rax
        
        # ファイルディスクリプタ (標準出力=1) を %rdi レジスタにセット
        movq    $1, %rdi
        
        # 文字列のメモリアドレスを %rsi レジスタにセット
        # x86-64 では直接メモリアドレスを代入できないらしいので rip アドレッシングを使って，
        # プログラムの位置からの相対値でメモリを指定する。
        leaq    msg(%rip), %rsi
        
        # 文字列の長さ(14バイト)を %rdx レジスタにセット
        movq    $14, %rdx
        
        # write システムコールを呼び出す。
        syscall

        # 次に，exit システムコールでプロセスを終了する。
        
        # exit のシステムコール番号は 0x2000001 (linux では 0x3c)
        movq    $0x2000001, %rax
        
        # プロセスの終了状態を指定 (正常終了=0)
        movq    $0, %rdi
        
        # exit システムコールを呼び出す。
        syscall

```

以下のコマンドでアセンブル，リンク，実行。

```console
$ as -o hello.o hello.s
$ ld -o hello -macosx_version_min 10.7 hello.o
$ ./hello
hello, world.
```

参考にしたブログ記事:
http://thexploit.com/secdev/mac-os-x-64-bit-assembly-system-calls/
AppCodeについて色々


***AppCodeはMacOSXで動作する、iOS用の開発環境です。実機でバッグやシミュレーターでのデバッグもAppCode上から行うことが出来ます。***

このTipsはAppCode1.6 EAPを元に書いています。

AppCodeの良いところ：http://d.hatena.ne.jp/happy_ryo/20111211
このエントリの元：http://d.hatena.ne.jp/happy_ryo/20111222


以前ちょろっとブログに書いたのを加筆修正しつつ。


##1.行番号を表示する方法
設定画面を開いて「show line number」で検索してから、Editor→Appearanceと選択すれば、設定項目がハイライトされています。

##2.インクリメンタルサーチにショートカットを割り当てる方法
一部の方には必要ない設定ですが。
設定画面で「Incremental search」で検索して、Keymapを選択すると最初からインクリメンタルサーチのショートカットの設定項目だけが絞り込まれて表示されます。後は、煮るなり焼くなりお好きなように。

##3.エディタのタブに関していくつか
エディタを大量に開くと、タブが勝手に隠されてしまって割と困る。そんなときのいくつかの対処法。
###タブの表示を1行で行う設定を解除する。
「Show tabs single row」で検索すると該当の設定がハイライトされているので、チェックを外すとタブの表示が複数行になります。

###タブの表示位置を上じゃ無くて右か左にする。
タブを複数行表示して、エディタの上下幅が狭くなるなんてありえない、そんな人にはタブの表示位置をエディタの右か左に移動することを勧めます。
「Placement」で検索してEditor→Editor Tabsと選択すると、設定項目がハイライトされています。
「エディタのタブ表示など邪道」という方は、ここで「none」を選択するとタブを消し去ることが出来ます。
また、この設定画面ではタブを規定数以上開いたら、特定の条件に従ってタブを自動で閉じる設定なんかも出来ます。

##4.スペースを表示する
世の中には半角スペースが可視化されて居ないと生きるのが辛い人が居ると聞きました。
「show whitespace」で検索してから、Editor→Appearanceと選択すれば、設定項目がハイライトされています。

##5.前回のコミットメッセージを自動で入力しない
毎回消すの面倒ですよね、手抜きして同じメッセージでコミットするのも良くないので、毎回空になるようにしちゃいましょう。
「clear initial commit」で検索してから、Version Control→Confirmationと選択すれば、設定項目がハイライトされています。

##6.意外とBTSとの連携が良い
標準で、JIRA/YouTrac/Lighthouse/PivotalTracker/GitHub/Readmine/Tracとの連携機能を備えている。コミットメッセージのテンプレートを設定することも出来ます。

##7.Vim使いの人にも安心
設定画面のPlugins→Browse repositoriesからプラグインの検索・インストール用の画面を立ち上げて「vim」で検索すると「IdeaVIM」というプラグインが見つかります。インストールしたあと、再起動しないと反映されません。
自分で個別に設定したショートカットと（衝突しない限り）共存可能なので、ぼくみたいにいくつか自分でショートカットを自分で割り当てる人にも安心。
主な機能はこちらで確認出来ます。
https://github.com/JetBrains/ideavim


##8.Bitbucket派のあなたにも安心
Bitbucketチームの作ってくれているプラグインが公開されています。インストール方法は上のVim~と同じです。
VCSの中にBitbucketが追加されたり、設定画面にBitbucketの項目が追加されてアカウントの設定やSSHの鍵の設定が出来るようになります。
###これでプライベートなGitリポジトリが使い放題の[Bitbucket](https://bitbucket.org/)を気兼ねなく使えますね！

##9.もう23時57分なのでずるいけど一度公開して後で追記する
---ここから---
##10.それってこういうこと？こうしとく？という機能が便利
AppCodeではエラーの解決や、その他諸々の解決にalt+Enterを押しまくる事になるので、いつかは気づくと思うのですが「ここ、こうできるけどこうする？」的な項目がたまに出てきます。

例えばこんな感じのif文を

``` objectivec:before
if (a) {
  return 3;
}
return 4;
```

alt+Enterで開いたメニューから「Replace If Else with '?:'」を選択すると

``` objectivec:after
return a ? 3 : 4;
```

勝手にこうしてくれます。

他にも

``` objectivec:before
@"The number is %d"
```

↓

``` objectivec:after

[[NSString alloc] initWithFormat: @"The number is %d"]

```

とか

``` objectivec:before

if (!a) {
  if (b) {
    return true;
  }
}

```

↓

``` objectivec:after

if (!a && b) {
  return true;
}

```

なんかもあります。
設定画面の「Intentions」の中で、他にどんなケースが登録されているのかを確認することが出来ます。

##11.起動時のアップデートの確認について
設定画面の「Update」から、アップデートの確認を自動でするかどうかの設定や、アップデートを確認するチャンネルの設定を行うことが出来ます。
選択できるチャンネルは「メジャーバージョンアップ」「ベータリリース、またはパブリックプレビュー」「マイルストーンリリース」「アーリーアクセスプログラム（EAP）」の4つから選択する事が出来ます。

##12.使われているフォントを一括で変える
（オススメしないよって書かれてます）
設定画面のAppearanceにOverride default fonts byという項目があるのでチェックを入れて、ドロップダウンリストから好みのフォントを選択して、フォントサイズを設定するだけです。

##13.書き忘れましたがEmacsの方にも安心です
Keymapの設定にEmacsというのがあります。　
でも、[KeyRemap4MacBook](http://pqrs.org/macosx/keyremap4macbook/index.html.ja)を使った方が良いと思います。
第二回オフラインリアルタイムどう書く Haskellでやってみた

あまりにひねりが無いので練習も兼ねてhspec使って見ました。
というのは嘘で、慣れないfoldrにハマってデバッグに間取っただけです。すんません。

```haskell:bitris.hs
{-# LANGUAGE ViewPatterns, OverloadedStrings #-}

import Control.Monad
import Control.Applicative
import Data.Word
import Data.Bits
import Data.Either
import Data.List
import Data.Attoparsec.Char8
import Test.Hspec
import Test.Hspec.QuickCheck
import qualified Data.ByteString.Char8 as B8

bitrisParser :: Parser [Word8]
bitrisParser = hexadecimal `sepBy` (char '-')

showBitris :: [Word8] -> B8.ByteString
showBitris = B8.pack . concat . intersperse "-" . map tohex
  where
    tohex :: Word8 -> String
    tohex x = let hexs = "0123456789abcdef" :: [Char]
                  (d, m) = (fromIntegral x) `divMod` 16
               in [hexs!!d, hexs!!m]

remains :: [Word8] -> [Int]
remains xs = filter (not . testBit (foldr (.&.) 0xff xs)) [0..7]

folldown :: [Int] -> Word8 -> Word8
--folldown xs b = foldr (\n (flip shiftL 1 -> x) -> if testBit b n then x .|. 1 else x) 0 xs
--状態付き計算はキモイのでこっち使う
folldown xs b = foldr (\(n,m) x -> if testBit b n then setBit x m else x) 0 $ zip xs [0..]

bitris :: B8.ByteString -> B8.ByteString
bitris (either error id . parseOnly bitrisParser -> xs) = showBitris $ map (folldown $ remains xs) xs



main :: IO ()
main = hspec $ do
  describe "Parser" $ do
    it "normal case" $ parseOnly bitrisParser "ff-01-00-3b-a9" `shouldBe` Right [0xff,0x01,0x00,0x3b,0xa9]
  describe "Printer" $ do
    it "normal case" $ showBitris [0x7a,0x4e,0x0c,0x56] `shouldBe` "7a-4e-0c-56"
    it "show and parse" $ property $ \xs -> parseOnly bitrisParser (showBitris xs) == Right xs
  describe "Judge" $ do
    it "normal case" $ sort (remains [0x7a,0x4e]) `shouldBe` [0,2,4,5,7]
  describe "Folldown" $ do
    it "normal case" $ folldown [0,4,5] 0xff `shouldBe` 0x07
  describe "Play" $ do
    it "same length" $ property $
      \xs -> (either error length $ parseOnly bitrisParser $ bitris $ showBitris xs) == length xs
    forM_ tests $ (\(x,y) -> it (B8.unpack x) $  bitris x `shouldBe` y )
  where
    tests =[ ("ff-2f-23-f3-77-7f-3b", "1f-03-00-1c-0d-0f-06")
           , ("01", "00")
           , ("00", "00")
           , ("7a-4e", "0c-02")
           , ("56-b6", "08-14")
           , ("12-12-12", "00-00-00")
           , ("de-ff-7b", "0a-0f-05")
           , ("95-be-d0", "05-1e-20")
           , ("7c-b0-bb", "1c-20-2b")
           , ("7a-b6-31-6a", "3a-56-11-2a")
           , ("32-0e-23-82", "18-06-11-40")
           , ("ff-7f-bf-df-ef", "0f-07-0b-0d-0e")
           , ("75-df-dc-6e-42", "35-5f-5c-2e-02")
           , ("62-51-ef-c7-f8", "22-11-6f-47-78")
           , ("0c-47-8e-dd-5d-17", "04-23-46-6d-2d-0b")
           , ("aa-58-5b-6d-9f-1f", "52-28-2b-35-4f-0f")
           , ("ff-55-d5-75-5d-57", "0f-00-08-04-02-01")
           , ("fe-fd-fb-f7-ef-df-bf", "7e-7d-7b-77-6f-5f-3f")
           , ("fd-fb-f7-ef-df-bf-7f", "7e-7d-7b-77-6f-5f-3f")
           , ("d9-15-b5-d7-1b-9f-de", "69-05-55-67-0b-4f-6e")
           , ("38-15-fd-50-10-96-ba", "18-05-7d-20-00-46-5a")
           , ("fe-fd-fb-f7-ef-df-bf-7f", "fe-fd-fb-f7-ef-df-bf-7f")
	   ]
```
論理パズルを解いてみた

twitterでRTされてきた論理パズルをrubyで解いてみた。
問題は以下
https://twitter.com/puzzlegiver_bot/status/220508689981902849/photo/1
解答が２つ出たのだけれど何か見落としが？

```ruby
class Person
  def initialize(desc)
    @desc = desc
    @group = nil
  end
  attr_accessor :group
  attr_reader :desc
end
all = {}
all[:RED]   = Person.new('all[:RED].group != all[:PURPLE].group')
all[:BLUE]  = Person.new('all[:YELLOW].group != all[:GREEN].group')
all[:YELLOW] = Person.new('all[:YELLOW].group == all[:GREEN].group')
all[:GREEN] = Person.new('all.to_a.count{|k,v| v.group} == 3')
all[:PURPLE] = Person.new('all[:PURPLE].group == :TRUE')
all[:BROWN] = Person.new('all[:BROWN].group == all[:YELLOW].group')
all[:GRAY] = Person.new('all[:PURPLE].group == all[:BROWN].group')
all_a = all.to_a.map(&:last)
(0...2**all.size).each do |pat|
  all_a.each_with_index do |e, i|
    e.group = pat & (1 << i) == 0
  end
  if all_a.inject(true){|s,e| s and (e.group ? eval(e.desc) : (not eval(e.desc)))}
    true_g = []
    false_g = []
    all.each do |k, v|
      if v.group
        true_g << k
      else
        false_g << k
      end
    end
    puts "TRUE=>#{true_g.join(',')}  FALSE=>#{false_g.join(',')}"
  end
end
```
WIndows7 で コンテンツに集中する方法

Windows8 の Metro style app で重視されているコンセプト、

それは、__コンテンツに没入させる__こと


Windows7 の頃からあったコンセプトなんですねぇ。

ということで、シェイクという操作です。

_ウィンドウのタイトルバーをドラッグし、左右に振る_

これだけ！

詳細はこちら↓

* [シェイクを使用してデスクトップ上のウィンドウを最小化する](http://windows.microsoft.com/ja-JP/windows7/Minimize-windows-on-the-desktop-using-Shake)
Mountain Lion にアップグレードしたら homebrew が動かなくなった場合の対処


Mountain Lion にアップグレード後、homebrew でインストールしたツールが動かなくなっていた。そもそも gcc が入っていなかったので、

1. App Store から XCode の最新版をインストール
2. XCodeを開き、Preferences から "Downloads" メニューを開き、Command Line Tools をインストールする
![command line tool](http://gyazo.com/2d4dfb171f6f8c798e5a9bed6c201e93.png?1343979671)
3. sudo brew update

この時点でいくつかのツールは動くようになった。しかし、ImageMagic を使おうとすると、

```
~/Downloads% convert --resize 32x32 Icon.png icon2.png
dyld: Library not loaded: /usr/lib/libltdl.7.dylib
  Referenced from: /usr/local/bin/convert
  Reason: image not found
```

というエラーメッセージが出る。
http://stackoverflow.com/questions/7412208/imagemagick-and-os-x-lion-trouble
を見ると libtool を入れろとあるので、

`sudo brew install libtool`

を実行。インストール後再度convertコマンドを叩くと、今度は

![error](http://gyazo.com/96a3f6a84309959bacfced79f110c2da.png)

というメッセージが。「続ける」を選ぶとブラウザを開きXQuartzのページへ行くので、XQuartz-2.7.2.dmg をダウンロード、インストール。

再起動後、ようやく ImageMagick も動くようになった。
ADT r20でNDKビルド＆デバッグまとめ

リンクメモ。

ADTr20ではNDKなプロジェクトが簡単に作れるようになってた
http://blog.cnu.jp/2012/07/01/create-ndk-project/

EclipseでNDKアプリケーションを開発する
https://sites.google.com/site/sustainpace1/android/development-environment/eclipse/using-the-ndk-plugin

> これは助かる～

NDKなコードでデバッガが使えるように
http://blog.cnu.jp/2012/06/29/ndk-debugger/

> NativeActivity使ってれば簡単ぽいが、JNIからだと微妙っぽい？
> レイアウトはxmlとか使えないぽい。
> ボタンとかはxmlで作ったほうが綺麗だし、JNIも捨てられないねえ・・・
Facebook Graph APIで親しい友だち一覧を取得する


https://developers.facebook.com/docs/reference/api/FriendList/

## 必要なparmission

```read_friendlists``` を指定する

## 親しい友達リストを取得

```
https://graph.facebook.com/me/friendlists?list_type=close_friends
```

他にも色々指定できる。

* close_friends
* acquaintances
* restricted
* user_created
* education
* work
* current_city
* family

## メンバーの取得

上記で取得した親しい友だちリストの ```id``` が ```12345``` の場合、

```
https://graph.facebook.com/12345/members
```

で取得する。
Blobで遊んでみるテスト


Blobを使ってただのテキストをJSファイルにして読み込ませるテスト。

```javascript
var namespace = 'hoge';
var srcText = document.getElementById('srcText').innerHTML;
var blob = new Blob([srcText]);
var url = webkitURL.createObjectURL(blob) + '#' + namespace;

var s = document.createElement('script');
s.async = true;
s.src = url;

document.body.appendChild(s);
```
Apache ログ解析 analog の導入

## analog とは
Apache のアクセスログを手軽に集計してくれるツール

## インストール
CentOS の場合

	$ wget http://www.iddl.vt.edu/~jackie/analog/analog-6.0.4-1.el5.i386.rpm
	$ sudo rpm -ivh analog-6.0.4-1.el5.i386.rpm

## 使い方
インストールしたので analog というコマンドが使えるようになっている。
analog に Apache の access_log を食わせるだけでログを解析して、最終的な結果をHTMLとして出力してくれる。

	$  analog access_log  > report.html

## 環境設定
/etc/analog.cfg をエディタで開き編集を行う

設定内容の詳細は
http://www.miloweb.net/analog.html
を参考にする。
PhoneGap準備



## PhoneGap
phonegap-phonegap-2.0.0-0-g2dbbdab.zip

## Android SDK Managerインストール
下記ページからダウンロード
(AndroidSDK)[http://developer.android.com/sdk/index.html]
android-sdk_r20.0.1-linux.tgz

## 

## Android SDK Managerを起動
  /home/fukajun/android-sdk-linux/tools/android

## 次をチェック
 
 *Android 2.2(API8)
 　
 * click "install"

## Android つなぐ

### 接続確認
  ~/android-sdk-linux/platform-tools $ ./adb devices
  List of devices attached 
  3XYXYXYXYYXXYX5 device
  
  失敗パターン
  List of devices attached 
  ????????????    no permissions

### できない場合

### USB接続設定をする
/etc/udev/rules.d/51-android.rules
[実デバイスに接続できるようにする。](http://kitbc.s41.xrea.com/main/?cmd=view&p=cmd_build_titanium)

### adbサーバー起動
  cd [path to andorid-sdk]/platform-tools/
  ~/android-sdk-linux/platform-tools $% sudo ./adb kill-server
  ~/android-sdk-linux/platform-tools $% sudo ./adb start-server
 
## Run Command

とりあえず次のサンプルで試してみた。
 ~/phonegap-phonegap-2dbbdab/lib/android/example

 * 参考
 http://qiita.com/items/733b81a39adc4a464570

```
   ~/android-sdk-linux/tools/android list targets
  
   ~/android-sdk-linux/tools/android  update project -p . -t 1

   ant debug install
```
  
## コマンドラインからプロジェクトテンプレート作成

   http://docs.phonegap.com/en/2.0.0/guide_command-line_index.md.html#Command-Line%20Usage
   $  bash ./bin/create ~/SmartphoneWebApp com.example.smartphone-web-app smartphone
au Experia acro HD adb ドライバーインストール方法(win7)

色々と面倒だったので自分用の覚え書き。

(1) PC Comapanionは不要。

> auのadbドライバページからリンクが貼られているが、PC CompanionのDLページでしかない。
> まったくもって不親切なリンク。文句言いたいがauの窓口がわからない。

> とりあえず騙されないように。

(2) ここからドライバーをDLして解凍しておく。

http://developer.sonymobile.com/wportal/devworld/search-downloads/driver

> 本体をICSにアップデートしてたらこれ。

http://dl-developer.sonymobile.com/drivers/Xperia_acro_HD_driver.zip

(3) 一旦デバッグモードをオフにして実機をPCにつなぐ

> なにか自動的にインストールされる

(4) デバッグモードをオンにする

(5) デバイスマネージャを開く

(6) ポータブルデバイス＞Xperia acro HD IS12Sを右クリック＞ドライバーソフトウェアの更新

(7) 「コンピューターを参照して・・・」を選択

(8) (2)で展開しておいたフォルダを選択

(9) USB composite ～を選択

(10) コマンドプロンプト＞adb driversでリストに出れば成功。

とりあえず、めんどいorz
getID3()を使った音楽ファイルの情報取得

## インストール
http://en.sourceforge.jp/projects/freshmeat_getid3/ から手に入れるか Ubuntu であれば

```sh
$ sudo apt-get install php-getid3
```

とすれば /usr/share/php-getid3 にインストールされる．

## 使い方

```php
<?php
$filename = '/path/to/music.m4a';
require('/usr/share/php-getid3/getid3.php');
$getID3 = new getID3();
$info = $getID3->analyze($filename);
getid3_lib::CopyTagsToComments($info);
```

そのままだとタイトルがどこにあるかはファイル（を作ったエンコーダー）によって異なるので，CopyTagsToComments を使うことによって comments 要素にまとめる．

### 構造
$info として返ってくる構造は非常に複雑であるが概ね以下さえ扱えれば十分である．

```js
{
  "comments": {
    "picture": [
      {
        "data": '画像データ (バイナリ)',
        "image_mime": '画像のMIME (e.g. "image/jpeg")'
        }
      ],
    "title": ['タイトル'],
    "artist": ['アーティスト'],
    "album": ['アルバム'],
    "genre": ['ジャンル'],
    "track_number": ['トラック番号 (e.g. "1/4")'],
    "creation_date": ['発売年']
    },
  "playtime_seconds": '曲の長さ (e.g. 123.4567)',
  "bitrate": 'ビットレート (e.g. 192847.4498)',
  "playtime_string": '曲の長さ (e.g. "4:32")'
  }
```

comments_html 要素も存在する．これは comments を HTML として出力できるようにエスケープしたものである．
複数のgrepバッファを使えるようにする: grep-a-lot.el

標準のgrepだと、繰り返してgrepコマンドをすると前回の結果が上書きされてしまいます。バッファの名前を変えればいいのですがいちいち面倒です。自動でバッファー名がかぶらないようにするためにgrep-a-lotをいれました。

インストールは、[こちら](http://qiita.com/items/e81fca7a9797fe203e9f)の設定がしてあれば、`M-x package-list-packages`の一覧から`grep-a-lot`をインストールします。

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

```common-lisp:.emacs.d/init.el
;;; grep-a-lot
(require 'grep-a-lot)
(grep-a-lot-setup-keys)
(grep-a-lot-advise igrep)
```

これで、`M-x igrep`を複数回繰り返しても、複数の検索結果のバッファが保持されるようになります。
grep検索を使いやすくする: igrep.el

Emacsから`M-x grep`だとコマンドラインを打つだけなので、パターンをクオートしたり大変です。igrepをいれて対話的なインターフェースにします。

インストールは、[こちら](http://qiita.com/items/e81fca7a9797fe203e9f)の設定がしてあれば、`M-x package-list-packages`の一覧から`igrep`をインストールします。

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

```common-lisp:.emacs.d/init.el
;;; igrep.el
(require 'igrep)
; lgrepの出力をUTF-8にする
(igrep-define lgrep (igrep-use-zgrep nil)(igre-regex-option "-n -Ou8"))
(igrep-find-define lgrep (igrep-use-zgrep nil)(igrep-regex-option "-n -Ou8"))
```

`M-x igrep`をします。そうすると、正規表現と検索対象のファイルの入力がうながされるので、それぞれ入力します。
Apache の LogFormat の変更

## LogFormat の変更
``` httpd.conf
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" common
(中略)
CustomLog "logs/access_log" combined
```
のように記述されている箇所に

``` httpd.conf
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h\t%l\t%u\t%t\t\"%r\"\t%>s\t%b\t\"%{Referer}i\"\t\"%{User-Agent}i\"\t%D" combined_tsv
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" common
(中略)
CustomLog "logs/access_log" combined_tsv
```

combined_tsvを追記する。
こうすると今までスペースだったdelimiterがタブになるので解析が容易になる。

変更後のログは

``` logs/access_log
127.0.0.1 -       -       [03/Aug/2012:13:01:15 +0900]    "POST /search/? HTTP/1.1"       200     172     "-"     "Python-urllib/2.6"     627276
127.0.0.1 -       -       [03/Aug/2012:13:01:14 +0900]    "POST /demo HTTP/1.1"   200     29802   "http://xxxx/demo"     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25"     1570131
```
の形式で出力されるようになる。

CustomLog書式は
http://httpd.apache.org/docs/2.2/ja/mod/mod_log_config.html#formats
にまとまっている。
## log の読み方
出力されたログを便宜上9つの部分に分割する

1. 127.0.0.1
2. - -
3. [03/Aug/2012:11:28:21 +0900]
4. POST /search/? HTTP/1.1
5. 200
6. 47912
7. "-"
8. Python-urllib/2.6
9. 0

この出力された9つの部分は次のような意味を表している。

--
### ログの内容
1.IPアドレスまたはリモートホスト名

> 125.100.190.246


2.identによるリモートユーザー名と認証時のユーザー名。

> \- -


3.アクセス日時

> [03/Aug/2012:11:28:21 +0900]


4.リクエストヘッダー・ファイル名・プロトコルバージョン。GETはGET方式での呼び出し、POSTはPOST方式の呼び出しになる。

> POST /search/? HTTP/1.1

5.ステータスコード

> 200
	
6.転送されたバイト数。これにはヘッダ行は含まれていない。

> 47912

7.呼び出し元のURL

> "-"

8.ユーザーエージェント

> Python-urllib/2.6

9.リクエストを処理するのにかかった時間(マイクロ秒単位)

> 0
JavaScript の数値変換あれこれ

```JavaScript:console
010 + 1
// => 9

"010" + 1
// => "0101"

eval(010) + 1
// => 9

eval("010") + 1
// => 9

Number(010) + 1
// => 9

Number("010") + 1
// => 11

parseInt(010) + 1
// => 9

parseInt("010") + 1
// => 11

parseInt(010, 10) + 1
// => 9

parseInt("010", 10) + 1
// => 11
```

ぐぬぬ。
実行環境はSafari6.0ですよ。
WordPress FTPなしでプラグインダウンロードできる設定

この設定を忘れてプラグインをインストールしようとすると、FTPのアカウントの入力がどうのこうのと言われて「FTPなんか使うかアホ！」とWordPressを罵るハメになるので、そうならないためにこれを書きます。

**wp-config.php に書きます**

```php:wp-config.php
<?php
define('FS_METHOD', 'direct');
```

**下のコードよりも上に書かないと効かないので気をつけてください。**

```php:wp-config.php
<?php
/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
	define('ABSPATH', dirname(__FILE__) . '/');

/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');
```