OmniAICreator/Qiita-1.07M huggingface dataset:
ハイフンなしの電話番号からハイフン付き電話番号を復元する。

時として荒れた作業が必要になることもありますw

一般的な法則（アルゴリズム）があるのかと思ったらどうもないようだ。
という訳で[総務省のデータ](http://www.soumu.go.jp/main_sosiki/joho_tsusin/top/tel_number/number_shitei.html)を活用すればそれっぽく動くものは出来た。

漏れがあると思うので気づいた方は教えて下さいm(_ _)m

```ruby
require 'pp'
require 'tel_splitter'

pp TelSplitter.split("0688889999")

> ["06", "8888", "9999"]
```

※2013/02/16時点の情報を元にしています。

```ruby:tel_splitter.rb
# encoding: utf-8

module TelSplitter
  MAP = {
  # 市外局番 , 市内局番の桁数のマップ
  # http://www.soumu.go.jp/main_sosiki/joho_tsusin/top/tel_number/number_shitei.html のデータを利用
  # 固定電話以外の桁数は適当です...
  '050' => 4, # IP電話
  '070' => 4, # 携帯電話/PHS
  '080' => 4, # 携帯電話
  '090' => 4, # 携帯電話
  '020' => 3,  # その他
  '0120' => 3, # その他
  '0800' => 3, # その他
  '0570' => 3, # その他
  '0990' => 3, # その他
  # 固定電話
  '011' => 3, '0123' => 2, '0123' => 2,
  '0123' => 2, '0124' => 2, '0125' => 2,
  '0126' => 2, '01267' => 1, '0133' => 2,

  # 長すぎるので中略
  # https://gist.github.com/kennyj/4966002
  # に全部のっけました。

  '0987' => 2, '09912' => 1, '09913' => 1,
  '099' => 3, '0993' => 2, '0993' => 2,
  '099' => 3, '0994' => 2, '0994' => 2,
  '0995' => 2, '0995' => 2, '0996' => 2,
  '0996' => 2, '09969' => 1, '0997' => 2,
  '0997' => 2, '0997' => 2, '0997' => 2,
  '0997' => 2
  }

  # 市外局番長毎のマップを作成する
  5.downto(2) do |i|
    const_set("MAP_#{i}", MAP.reject { |k, v| k.length != i })
  end

  def self.split(tel)
    # 市外局番の長いものから探していく
    [MAP_5, MAP_4, MAP_3, MAP_2].each do |map|
      len = map.first[0].length
      if map.has_key?(tel[0, len])
        len_2 = map[tel[0, len]] # 市内局番の長さ
        return [tel[0, len], tel[len, len_2], tel[(len + len_2)..-1]]
      end
    end
    # 見つからなかった(もしくは強制的に区切る)
    return [tel, "", ""]
  end
end
```
Update your tweet archive with grailbird_updater

As we all know, we can download our tweets from twitter.com. Info about it could be found [here](http://blog.twitter.com/2012/12/your-twitter-archive.html).

We can trace back more then 3000tweets by dling the archive :)

But when we tweet, the tweet archive won't be updated :(. Of course because it's just a file.

By using the [grailbird_updater](https://rubygems.org/gems/grailbird_updater) gem, we can update the archive by simply one command :)

## Install

`$ gem install grailbird_updater`

## Updating tweet archive

`$ grailbird_updater /path/to/tweet`

That's it ! :)
LiveReloadが便利すぎる


[LiveReload](http://livereload.com)というツールがとても便利。

一言で言うと、ファイルの変更を監視して、**変更があったらブラウザーをリロードしてくれる**、ものです。
Web系の開発やっているとブラウザーのリロードは年中やってます。
だけど、これをしなくていいというのがこんなにも幸せなこととは知りませんでした。

LiveReloadの使い方は簡単です。

1. LiveReloadを起動する
2. 開発中のプロジェクトのフォルダを監視対象に追加する
3. 開発中のプロジェクトにコードスニペットを忍ばす（あるいはブラウザーエクステンションをインストールする）

こうすると、監視対象のファイルが更新された時にブラウザーがリロードされるようになります。

2の監視対象の追加は、ディレクトリをドラッグアンドドロップすれば巻単位追加できます。

3のスニペットはLiveReloadの画面に表示されているものをコピペするだけです。
次のようなスニペットです。

    <script>
        document.write(
            '<script src="http://' + 
            (location.host || 'localhost').split(':')[0] + 
            ':35729/livereload.js?snipver=1"></' + 
            'script>'
        )
    </script>

ブラウザーエクステンションを使うのではなく、コードスニペットを使った場合は、
別なマシンから接続していても自動的にリロードがかかります。
別なマシンは、iPadでもiPhoneでもAndroidでも大丈夫です。
対象のサイトを表示しているすべてのブラウザーが同時にリロードされます。

テストの効率が上がること請け合いです。

ただね、Sencha Touchのプロジェクトで使っていて、SASSのコンパイルも有効（Compassも有効）にしているとCompassのコンパイルがうまく動かないようで、エラーを吐きます。
それの直し方がいまはちょっとわかりません。
わかる方、教えてください。

結局、いまは、compass watchを動かしておいて、LiveReloadはSASSコンパイルをオフにして使っています。
そうすれば、compass watchが動いてコンパイルしてくれ、それが終わったらLiveReloadがブラウザーをリロードしてくれますので実質困りません。
数当てゲーム Linq練習のために

自分が知っている数当てゲームのルールは次の通り。
1.答えは1-9までの数字から4桁選ぶ。桁同士は重複してはいけない。
2.予想する答えを聞き、数字と位置が全て合えば終わり。桁は重複してもいい。

```csharp
using System;
using System.Collections.Generic;
using System.Linq;

namespace HitAndBlow
{
	class HitAndBlowResult
	{
		/// <summary>質問</summary>
		readonly int[ ] Challenge;
		/// <summary>答え</summary>
		readonly int[ ] Answer;
		/// <summary>位置と数字が合っている数を取得します</summary>
		public int Hit
		{
			get
			{
				return Enumerable.Range( 0, 4 )
					.Count( x => Challenge[ x ] == Answer[ x ] );
			}
		}
		/// <summary>数字だけが合っている数を取得します</summary>
		public int Blow
		{
			get
			{
				return Challenge.Count( x => Answer.Contains( x ) ) - Hit;
			}
		}

		public HitAndBlowResult( int[ ] challenge, int[ ] answer )
		{
			Challenge = challenge;
			Answer = answer;
		}
	}

	class HitAndBlow
	{
		/// <summary>答え</summary>
		readonly int[ ] Answer;

		public HitAndBlow( )
		{
			// 答えは4桁。それぞれの桁の数字は重複してはいけない。
			Answer = GetRandomValues( 0, 9 )
				.Distinct( ).Take( 4 ).ToArray( );
		}

		public HitAndBlowResult Challenge( string challenge )
		{
			return Challenge( challenge.Select( x => x - '0' ).ToArray( ) );
		}

		public HitAndBlowResult Challenge( int[ ] challenge )
		{
			if ( 4 != challenge.Count( x => 9 >= x || x >= 0 ) )
				throw new ArgumentException( "4桁の数字を指定して下さい" );
			else
				return new HitAndBlowResult( challenge, Answer );
		}

		static IEnumerable<int> GetRandomValues( int minValue, int maxValue )
		{
			for ( var random = new Random( ); ; )
				yield return random.Next( minValue, maxValue );
		}
	}

	class Program
	{
		static void Main( string[ ] args )
		{
			Run( );
			Console.WriteLine( "終了するには何かキーを押して下さい..." );
			Console.ReadKey( );
		}

		static void Run( )
		{
			Console.WriteLine( "4桁の数字を指定して下さい" );
			var hab = new HitAndBlow( );
			for ( var cnt = 1; ; ++cnt )
			{
				Console.Write( cnt + " -> " );
				try
				{
					var challenge = Console.ReadLine( );
					var result = hab.Challenge( challenge );
					Console.WriteLine(
						"{0} Hit, {1} Blow",
						result.Hit, result.Blow );
					if ( 4 == result.Hit )
						break;
				}
				catch ( ArgumentException ex )
				{
					--cnt;
					Console.WriteLine( ex.Message );
				}
			}
		}
	}
}
```

このサンプルコードの実行結果

```
4桁の数字を指定して下さい
1 -> 1234
0 Hit, 1 Blow
2 -> 5678
0 Hit, 2 Blow
3 -> 9000
1 Hit, 2 Blow
4 -> 3760
4 Hit, 0 Blow
終了するには何かキーを押して下さい...
```
jqueryでGoogle Formに入力のメモ


var ken = new Array(
'北海道地方 北海道',
'東北地方 青森県',
'東北地方 岩手県',
'東北地方 宮城県',
'東北地方 秋田県',
'東北地方 山形県',
'東北地方 福島県',
'関東地方 茨城県',
'関東地方 栃木県',
'関東地方 群馬県',
'関東地方 埼玉県',
'関東地方 千葉県',
'関東地方 東京都',
'関東地方 神奈川県',
'中部地方 新潟県',
'中部地方 富山県',
'中部地方 石川県',
'中部地方 福井県',
'中部地方 山梨県',
'中部地方 長野県',
'中部地方 岐阜県',
'中部地方 静岡県',
'中部地方 愛知県',
'近畿地方 三重県',
'近畿地方 滋賀県',
'近畿地方 京都府',
'近畿地方 大阪府',
'近畿地方 兵庫県',
'近畿地方 奈良県',
'近畿地方 和歌山県',
'中国地方 鳥取県',
'中国地方 島根県',
'中国地方 岡山県',
'中国地方 広島県',
'中国地方 山口県',
'四国地方 徳島県',
'四国地方 香川県',
'四国地方 愛媛県',
'四国地方 高知県',
'九州地方 福岡県',
'九州地方 佐賀県',
'九州地方 長崎県',
'九州地方 熊本県',
'九州地方 大分県',
'九州地方 宮崎県',
'九州地方 鹿児島県',
'沖縄地方 沖縄県'
);
$.each(ken ,function(k,v){
	jQuery("textarea.jfk-textinput.magic-list-item-input").eq(k).val(v);jQuery("textarea.jfk-textinput.magic-list-item-input:last").click();
}
);
SublimeText2のPluginをPackageControlに登録する

## 1.GithubかBitBucketに作成したpluginをアップロードする。
複数のpluginを登録しない、pluginファイルはルートに置く。
`package-metadata.json`(バージョン情報を追跡する為に各PC上に作成されるファイル)をリポジトリに含めないように注意してください。  
あとは、gitignoreに最低限これだけ書いておけばとりあえずはOKだと思います。

```text:.gitignore
.git
.hg

*.pyc
*.pyo

.DS_Store
```

## 2.package_control_channelをフォークする
GitHub:
    https://github.com/wbond/package_control_channel
BitBucket:
    https://bitbucket.org/wbond/package_control_channel

## 3.repositories.jsonにpluginのURLを追加する
フォークしたpackage_control_channelの`repositories.json`の`repositories`に追加。
追加形式：


		https://github.com/user/repo
		例）https://github.com/shibainurou/mysublimeplugin

		https://github.com/user/repo/tree/branch
		例）https://github.com/shibainurou/mysublimeplugin/master/packages.json

		https://bitbucket.org/user/repo
		例）https://bitbucket.org/shibainurou/mysublimeplugin


## 4.mappingを追加する
フォークしたpackage_control_channelの`repositories.json`の`package_name_map`に追加。BitBucketはリポジトリ名を使用するので設定しなくてもOK。Githubの場合でも、リポジトリ名と同じ名称にするなら設定しなくてもOK。

PackageControlのリストに表示される名称とリポジトリ名をmapping させる。
追加形式：

		"mysublimeplugin": "My Plugin"

**ノイズを軽減するためプラグイン名にSublimeはつけないほうがいい。**

## 5.package_control_channelの変更をコミットする
忘れずに

## 6.package_control_channelへpull requestを出す
pull requestのコメントでどんなプラグインを作ったのか英語でザックリと説明しましょう。
英語かよ！とびびって敬遠せず勇気を出してやってみると吉。google翻訳使いながらなんとなーく英語に翻訳してコメントしても大丈夫でした。


順番待ちが結構長いのでpackage_controlに含まれるまで普通でも１～２週間はかかります。何かミスがあるとさらに１～２週間プラスされるみたいなのでpackage_control_channelの修正は慎重に。当然のことながらpull requestを出した後でも自分のプラグインは修正可能です。


**その他細かいことは本家のみんな大好き英語ドキュメントを参照**
[Submitting a Package](http://wbond.net/sublime_packages/package_control/package_developers)  
特にmac, windows, linuxの３つに対応しないプラグインはpackages.jsonを変更しないといけないので、
[IMESupport](https://github.com/chikatoike/IMESupport)を参考にしたり、[Custom packages.json on GitHub](http://wbond.net/sublime_packages/package_control/package_developers#Custom_packages_json_on_GitHub)を読んだりしてみてください
動的にJSを実行する方法

## jsファイルを指定したscriptタグを動的にDOMに追加する

```js
var script = document.createElement('script');
script.src = 'http://example.com/hoge.js';
document.body.appendChild(script);
```

上記のように、src属性を指定してscriptタグをDOMに追加すれば、jsが実行される。

しかし、この方法でDOMに追加した場合、src属性に書かれているURLに非同期的に通信が発生し、読み込みが完了したものから実行されるため、実行の順番を確保しないといけない場合は、ただ追加すればよいわけではない。

```console1.js
console.log(1);
```
```console2.js
console.log(2);
```
```console3.js
console.log(3);
```

例えば、上記のようなjsファイルを用意し、「1, 2, 3」と順番にconsoleに表示されるように実行したい場合。

```js

var scripts = ['console1,js', 'console2.js', 'console3.js'];
var len = scripts.length;
var i = 0;

(function appendScript() {
    var script = document.createElement('script');
    script.src = scripts[i];
    document.body.appendChild(script);

    if (i++ < len) {
        script.onload = appendScript;
    }
})();

```

上記のように、scriptElementのonloadイベントに次のscriptを追加する処理をセットすることで、順番を確保したまま実行することが可能になる。

## scriptタグにjsの文字列を書き込んでDOMに追加する

```js
var script = document.createElement('script');
script.innerHTML = 'console.log("オラオラ")';
document.body.appendChild(script);
```

jsの文字列を何かしらの方法でキャッシュ等をしておけば、無駄なリクエストを減らすことも可能に。
C#でRubyっぽいデバッグ表示(Dictionary編)


[前回](http://qiita.com/items/5c67c6a9766712851fcc)からの続き。

## Dictionary (Rubyでいう所のHash)
Rubyだとこう

```ruby:hash.rb
dict = {aaa:1, bbb:2, ccc:3}
p dict
```

C#だとこんな感じになる

```csharp:Dict.cs
using System;
using System.Collections.Generic;
using System.Linq;

var dict = new Dictionary<string, int>() {
    {"aaa", 1},
    {"bbb", 2},
    {"ccc", 3},
};
Console.WriteLine("{" + String.Join(", ", from v in dict select v.Key + "=>" + v.Value) + "}");
```

シンボルが文字列になっている以外はほぼ同じ。

```
{:aaa=>1, :bbb=>2, :ccc=>3}    (Ruby)
{aaa=>1, bbb=>2, ccc=>3}       (C#)
```

## おまけ: Rubyで`p`や`inspect`を使わずに自力で書く場合
```ruby:jiriki.rb
puts "{" + dict.map{|key,value| "#{key}=>#{value}"}.join(", ") + "}"```
```

## C#でRubyっぽいデバッグ表示一覧
* [List(Array)](http://qiita.com/items/5c67c6a9766712851fcc)
* [Dictionary(Hash)](http://qiita.com/items/b7f0765537c8f0212f78)
第8回オフラインリアルタイムどう書く参考問題解答

16進数を2進数へ変換する処理を修正した。

```cpp
#define BOOST_TEST_MAIN
#include "boost/test/included/unit_test.hpp"
#include "boost/assign.hpp"
#include <bitset>

namespace {
    typedef std::pair<std::string, std::string> pair_t;

    template<typename Type, size_t n>
    size_t count_of(const Type(&)[n]) {
        return n;
    }

    std::string convert_hex_to_binary_number(const std::string& hex) {
        std::bitset<4> bits(strtol(hex.c_str(), NULL, 16));
        std::string tmp(boost::lexical_cast<std::string>(bits));
        return std::string(tmp.rbegin(), tmp.rend());
    }

    std::string get_binary_number(const std::string& input) {
        std::string binary_number = "";
        for(size_t i=0; i<input.length(); ++i) {
            binary_number += convert_hex_to_binary_number(input.substr(i, 1));
        }
        return binary_number;
    }

    std::vector<pair_t> get_code() {
        using namespace boost::assign;
        std::vector<pair_t> codes;
        codes += pair_t("000", "t"), pair_t("0010", "s"), pair_t("0011", "n"), pair_t("0100", "i"),
        pair_t("01010", "d"), pair_t("0101101", "c"), pair_t("010111", "l"), pair_t("0110", "o"),
        pair_t("0111", "a"), pair_t("10", "e"), pair_t("1100", "r"), pair_t("1101", "h"), pair_t("111", "");
        return codes;
    }

    std::string get_formatted_data(const std::string& str, size_t bits) {
        std::stringstream ss;
        ss << str << ":" << bits;
        return ss.str();
    }

    std::string solve(const std::string& input) {
        std::string binary_number = get_binary_number(input);
        std::vector<pair_t> codes = get_code();
        std::string ret = "";
        size_t bit_count = 0;
        bool is_termination = false;
        while(!is_termination) {
            for(size_t i=0; i<codes.size(); ++i) {
                if(binary_number.substr(bit_count, codes[i].first.length()) == codes[i].first) {
                    ret += codes[i].second;
                    bit_count += codes[i].first.length();
                    is_termination = codes[i].first == "111";
                    break;
                } else if(i == codes.size()-1) {
                    return "*invalid*";
                }
            }
        }
        return get_formatted_data(ret, bit_count);
    }
}

BOOST_AUTO_TEST_CASE( ord_8_prac ) {
    const pair_t data[] = {
        /*0*/ pair_t("16d9d4fbd", "ethanol:30"),
        /*1*/ pair_t("df", "e:5"),
        //以下略
    };
    for (size_t i=0; i<count_of(data); ++i) {
        BOOST_CHECK_EQUAL(solve(data[i].first), data[i].second);
    }
}
```
chrome-extensionのChromePHPを使用してchromeからログを見る


chromePHPはPHPのログをコンソールに吐き出せるようにするツールです。

* [Console logging extension for Google Chrome](http://www.chromephp.com/)

## chrome-extensionをインストールする

[ChromePHP](https://chrome.google.com/webstore/detail/chromephp/noaneddfkdjfnfdakjjmocngnfkfehhd)

インストールするだけ

## 使い方

公式ドキュメントのまんまでOK
include_pathをとおして置くと何かと楽

```php
include 'ChromePhp.php';
ChromePhp::log('hello world');
ChromePhp::log($_SERVER);

// using labels
foreach ($_SERVER as $key => $value) {
    ChromePhp::log($key, $value);
}

// warnings and errors
ChromePhp::warn('this is a warning');
ChromePhp::error('this is an error');
```

でもこのままだとどこでログが出力されたかわからないのでちょっとカスタマイズする

```php:My_Log.php
class My_Log {
	/**
	 * クロムのコンソールログに出力するようのログ　※要chrome extension chromePHP
	 * @link http://www.chromephp.com/
	 * @param $message mixed 表示したいログの内容
	 * @param $ident string ログの先頭に出力するプレフィックス文字列
	 * @param $level int ChromePHPのログ出力フォーマットレベル
	 * @return void
	 **/
	public static function console($message, $key = null, $level = 'info') {

		$targetBackTrace = array();

		foreach (debug_backtrace() as $i => $val) {
			// 対象クラスと一致するので対象のバックトレース情報を付与する
			if ($i == $val['class']) {
				$targetBackTrace = $val;
				$filePath  = explode(DIRECTORY_SEPARATOR, $val['file']);
				$fileShort = array_slice($filePath, (count($filePath) - 3));
				$file      = implode(DIRECTORY_SEPARATOR, $fileShort);
				$key       = sprintf('trace [%s:%s]', $file, $val['line']);
				break;
			}
		}

		require_once 'ChromePhp.php';
		switch ($level) {
			case 'info':
				if (is_null($key)) {
					return ChromePhp::log($message);
				}
				ChromePhp::log($key, $message);
				break;
			case 'warm':
				if (is_null($key)) {
					return ChromePhp::warn($message);
				}
				ChromePhp::warn($key, $message);
				break;
			case 'error':
				if (is_null($key)) {
					return ChromePhp::error($message);
				}
				ChromePhp::error($key, $message);
				break;
		}
	}

}

```

大体今時はMVCなのでbacktraceから同一のクラスを見つけた場合の情報を取得している。
使い方はシンプル

```php:hoge.php
My_Log::console($_SERVER);
```

以上
UINibのキャッシュで動作改善

//追記 2015/03/24 
こちらの記事は`iPhone3GS`時代に効果があったものになります。
たぶん今では気にしなくても問題ないと思われます。
//追記終わり

カスタムビューをIBで作成した場合、以下のようなコードでビューのインスタンス化を行うと思います。

```
//xibファイルからのインスタンス化
UINib *nib = [UINib nibWithNibName:@"hoge" bundle:nil];
UIView *hogeView = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0];

```

[UINib Class Reference](http://developer.apple.com/library/ios/#documentation/uikit/reference/UINib_Ref/Reference/Reference.html)によるとメモリにキャッシュされるとあるが、プロファイラで見ると結構処理に時間が掛かっている場合があります。

なので以下のように明示的にキャッシュすることで、自分の場合体感で分かるほど動作が改善しました。

```
//キャッシュにある場合はそれを利用
UINib *nib = [[Huga sharedNSCache] objectForKey:@"hoge"];
if (nib == nil) {
    nib = [UINib nibWithNibName:@"hoge" bundle:nil];
    [[Huga sharedNSCache] setObject:nib forKey:@"hoge"];
}

```

実際にはnibのロード処理をUIViewのカテゴリとして実装すると使い勝手がいいと思います。
箱ヒゲ図のラベルにサンプル数を併記する

Rで箱ヒゲ図 (boxplot) のラベルにサンプル数を併記したいとき。

```r
bp <- boxplot(data)
mtext(paste("(n=", bp$n, ")", sep=""), side=1, line=2.1, at=seq(along=bp$n))
```

こんな感じになる。

![boxplot.png](https://qiita-image-store.s3.amazonaws.com/0/6520/a4259df6-5996-c615-44f2-9e95a6c99e17.png)
PyramidのテンプレートをMakoに切り替える


以下の情報は当時最新バージョンだった1.4の場合です。
1.5以降の場合は[Python_Pyramid: Pyramid 1.5 mako -> jinja2](http://pythonpyramid.blogspot.jp/2014/04/pyramid-15.html)を参照してください。

---

[Pyramid Documentation 日本語版](http://docs.pylonsproject.jp/projects/pyramid-doc-ja/en/latest/narr/templates.html#templating-with-mako-templates)には書いてあるのですが、すぐに見つからなかったので忘備録的に書いておく。

---


##設定方法
設定としては、development.iniもしくはproduction.iniの[app:main]に以下を追加します。

```
mako.directories = mypackage:templates
```

それに加えて、テンプレートの拡張子がデフォルトは~.ptになっているため、~.makに変更します。
##例

例えば、

```shell
pcreate -s starter ajax_test
```
というようにscaffoldで作成した場合、作成されたdevelopment.iniに対して、以下のように設定します。


```:development.ini
###
# app configuration
# http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/environment.html
###

[app:main]
use = egg:ajax_test

pyramid.reload_templates = true
pyramid.debug_authorization = false
pyramid.debug_notfound = false
pyramid.debug_routematch = false
pyramid.default_locale_name = jp
pyramid.includes = pyramid_debugtoolbar

# この部分！
mako.directories = ajax_test:templates


# By default, the toolbar only appears for clients from IP addresses
# '127.0.0.1' and '::1'.
# debugtoolbar.hosts = 127.0.0.1 ::1

###
# wsgi server configuration
###

[server:main]
use = egg:waitress#main
host = 0.0.0.0
port = 6543

###
# logging configuration
# http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/logging.html
###

[loggers]
keys = root, ajax_test

[handlers]
keys = console

[formatters]
keys = generic

[logger_root]
level = INFO
handlers = console

[logger_ajax_test]
level = DEBUG
handlers =
qualname = ajax_test

[handler_console]
class = StreamHandler
args = (sys.stderr,)
level = NOTSET
formatter = generic

[formatter_generic]
format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s

```

mypackage:templatesがajax_test:templatesと自分のプロジェクト名に置き換わる感じ。
Prodaution.iniも同様に追加しておけばOK。後は必要に応じて~.makのファイルを作成し、プログラム中に指定しておけば読み込まれます。

設定する値は書かれていても、どのファイルにどの位置に設定すればいいかとか細かいところが書かれていないので、戸惑う人は多いんじゃないかなぁ。
DreamweaverCS5.5　RDS接続で設定が反映されない場合

DreamweaverCS5.5でRDS接続している場合、サーバへの接続設定をいくら変えても反映されなことがあります。

下記はWindows Vistaでの例ですが、ここにRDS.XMLというファイルが有り、
RDS接続の情報が管理されています。
　C:\Users\{ユーザ名}\AppData\Roaming\Adobe\Common\11.5\SourceControl\RDSINFO

このファイルの更新、および、検索に不具合があるようで、ゴミ設定が多く残っていることがあります。それらをすべて除去すれば設定が正しく反映されるようになります。お試しあれ。
WebStormでtestacularを動かしてデバッグもする


http://efcl.info/2012/1028/res3154/ を見ると全て分かりますが、あえて説明します。

また、以下で使用しているソースコードは https://github.com/grapswiz/testacular-webstorm-sample で公開しています。ダウンロードして実際に使ってみてください。

## WebStormのRun Configurationを作成する

WebStormでtestacularを実行する場合、コマンドラインから実行する場合と同じように

```Bash:
$ testacular start
```

```Bash:
$ testacular run
```

の2つに対応したRun Configurationを作成します。

### testacular start用のタスク

![server](http://farm9.staticflickr.com/8507/8475816122_823f9b9cf9_c.jpg)

### tetacular run用のタスク

![run](http://farm9.staticflickr.com/8085/8475816080_225e081437_c.jpg)

### デバッグ用のタスク
ポートとして指定している9876はtestacular startで立ち上がるサーバのポート番号です。
![debug](http://farm9.staticflickr.com/8515/8474727587_ab42a17997_c.jpg)

## 実行する！
testacular serverタスクを実行します。このタスクは常に実行しておきましょう。次に起動するものは用途によって変わります。

テストを走らせたい場合は都度testacular runタスクを実行します。
デバッグする場合は都度testacular debugタスクをデバッグ実行します。

## デバッガでできること
Chrome Developer Toolsで出来そうなことは結構できます。

* ステップ実行
* Watch Expressions
* Scope Variables
* Call Stack
* Breakpoints

Chrome基準で考えるとブレークポイント管理が別窓なのがちょっと気になります。その他はUIの差異が気にならなくなれば普通に使えそう。

以下デバッガ画面。
![debugger](http://farm9.staticflickr.com/8506/8475837628_9d7a15bd2c_c.jpg)

![breakpoint](http://farm9.staticflickr.com/8086/8475837474_f9c7a9d464_c.jpg)

![mouse](http://farm9.staticflickr.com/8520/8474748981_77eddcc023_z.jpg)
redis童貞のためのメモ 素人童貞編

## サーバでredisを動かすぞ

`/usr/local/bin/`の下に入れたいときは`/usr/local/src`に移動。

```sh
wget http://redis.googlecode.com/files/redis-2.6.10.tar.gz
tar xzf redis-2.6.10.tar.gz
cd redis-2.6.10
make
```

で`redis-2.6.10/src/`の下にredis-serverとredis-cliのバイナリができるので`/usr/local/bin`の下にシンボリックリンクを作る。

 ```sh
ln -s /usr/local/src/redis-2.6.10/src/redis-server /usr/local/bin/redis-server
ln -s /usr/local/src/redis-2.6.10/src/redis-cli /usr/local/bin/redis-cli
```

redis-serverで起動
redis-cliで対話モード -> 童貞編で覚えたことを使える

## 起動するための準備

```sh:ディレクトリ
sudo mkdir /etc/redis
sudo mkdir /var/redis
sudo mkdir /var/redis/6397
```

```sh:起動script
sudo cp redis-2.6.10/utils/redis_init_script /etc/init.d/redis
```

```sh:設定ファイル
sudo cp redis-2.6.10/redis.conf /etc/redis/6379.conf
```

`/etc/init.d/redis start`で起動

## 自動起動設定
`/etc/rc.d/rc[0-6].d/`のしたに`/etc/`シンボリックリンクを置く(`/etc/init.d`以下のシステムサービスの起動のランレべルはここで定義される。Sではじまるシンボリックリンクは起動。Kではじめるシンボリックリンクは停止)

`0:off `、`1:off`、`3:on`、`4:on`、`5:on`、`6:off`にしたい

`rc[0-1]|6.d`　以下で `ln -s ../init.d/redis K15redis`
`rc[2-4].d` 以下で `ln -s ../init.d/redis S15redis`

を行う。

設定のdemonize `yes`に

これでOK

たぶんつづく
Redis使おうとしていろいろやったメモ

環境：

* Ubuntu server 12.04.2 on VirtualBox で、メモリ512MBの1コア。
* OpenSSHをインストール時に選択。
* 2013/2/15現在で最新の以下のパッケージをインストール済。それ以外はまっさら。
 * zsh
 * make
 * gcc
 * vim
 * tcl

tar玉取得からmake失敗まで。一部加工してます。

```bash
$ wget http://redis.googlecode.com/files/redis-2.6.10.tar.gz
$ tar zxvf redis-2.6.10.tar.gz
$ cd redis-2.6.10/
$ make
cd src && make all
make[1]: Entering directory `redis-2.6.10/src'
    CC adlist.o
In file included from adlist.c:34:0:
zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory
compilation terminated.
make[1]: *** [adlist.o] Error 1
make[1]: Leaving directory `redis-2.6.10/src'
make: *** [all] Error 2
```

なんでmake失敗したのかは知らないですけど、`distclean`すれば直るそうなので、そうします。

```bash
$ make distclean
$ make
--- 省略 ---
Hint: To run 'make test' is a good idea ;)

make[1]: Leaving directory `redis-2.6.10/src'
```

結構時間かかったんですけど、まあ無事いけたっぽいです。
で、`make test`してみろって言うんで、してみました。

```bash
$ make test
=== 省略 ===
!!! WARNING The following tests failed:

*** [err]: After CLIENT SETNAME, connection can still be closed in tests/unit/introspection.tcl
Expected '0' to equal or match '1'
Cleanup: may take some time... OK
make[1]: *** [test] Error 1
make[1]: Leaving directory `redis-2.6.10/src'
make: *** [test] Error 2
```

めちゃくちゃ時間かかった割りにテストこけてるしorz
これ調べてもぜんぜんヒットしないんで、環境的な何かですか？

まあ気を取り直して、とりあえず動くか確認。

```bash
$ cd src
$ ./redis-server
```

なんかアスキーアート出てきました。
別ターミナル立ち上げて

```bash
$ cd redis-2.6.10/src
$ ./redis-cli
> SET hoge:fuga "bazz"
"OK"
> GET hoge:fuga
"bazz"
```

うーん。他のは試してないんですけど（テストこけたわけですし）、なんとなく動いてる？っぽいような。
Stage3D の ATF について


昨日ちょっと試してみたんだけどよく分からなかったので誰か知ってたら教えてください。

# 疑問
`png2atf -c -i texture.png -o texture.atf` を実行した際にできる ATF ファイルはどうやって使うのか？

# やったこと
`png2atf -c -i texture.png -o texture.atf` で ATF ファイルを作る。
URLLoader でバイナリファイルとして読み込む。

```AS3
var data: ByteArray = urlLoader.data;
data.position = 7;
var w: int = 1 << data.readByte();
var h: int = 1 << data.readByte();
var texture: Texture = context3D.createTexture(w, h, Context3DTextureFormat.COMPRESSED, false);
texture.uploadCompressedTextureFromByteArray(data, 0);
```

エラーは出ないけど表示されない。
※ `-c` オプションをつけなかった場合は `Context3DTextureFormat.COMPRESSED` を `
Context3DTextureFormat.BGRA` に変更して表示できた。
FlashPlayer 11.5、11.6 で試した。

# 調べてみると
どうやら `-c` オプションをつけると ATF ファイルタイプ(バイトインデックス：6)が、`3` になっているっぽい。
※ atftools にある ATF のファイルフォーマットのドキュメントには `0,1,2` までしかかいていない。

atfinfo で 見てみると `ATF File Type` が
`-c` をつけたときは `RAW Compressed (DXT1+ETC1+PVRTV4bpp)`
`-c` をつけなかったときは `PRGB 888`
と表示されていた。
その他の違いは `AS3 TextureFormat` が `Context3DTextureFormat.COMPRESSED` か `Context3DTextureFormat.BGRA` の違いくらい。

# 表示させるには
フラグメントシェーダーの AGAL の一部を書き換える。

``` AGAL
tex ft3, v2, fs0<2d,linear>
```

↓

``` AGAL
tex ft3, v2, fs0<2d,linear,dxt1>
```

※ サンプラビットの 9番目に 1 を立てる。
これで表示はされた。

# この使い方であってるの？
知ってる人がいたらおせーてください。

# もしかしたら
まだ対応してなくてもう少ししたら `Context3DTextureFormat` に `RAW_COMPRESSED` 見たいなのが追加されるのかなぁ？
ちなみに rowCompressed とかを色々入力してみたがエラーがでてダメだった。

# 追記
[Starling - QuadBatch](https://github.com/PrimaryFeather/Starling-Framework/blob/7739a9e002e04659f7a5517f6093e0e77ccf430c/starling/src/starling/display/QuadBatch.as)
ここを見るとこれでよかったみたいだ。
ちなみに `Compressed Alpha` の場合は `dxt5` を指定する。
Objective-CでWiFiのSSIDを取得する


※下記のフレームワークが必要
SystemConfiguration.framework

````objc
    // 3G接続の場合はnilが戻されるので、以降のコードで注意する。
	CFArrayRef interfaces
        = CNCopySupportedInterfaces();

	CFDictionaryRef dicRef
        = CNCopyCurrentNetworkInfo(CFArrayGetValueAtIndex(interfaces, 0));

    if (dicRef) {
        ssid = CFDictionaryGetValue(dicRef, kCNNetworkInfoKeySSID);
		// Macアドレスを取得
        //macAddress = CFDictionaryGetValue(dicRef, kCNNetworkInfoKeyBSSID);

		NSLog(@"%@", ssid);
    }

````
Uncrustifyのセッティング (9) ラインスプリット編

かなり少ない
------------
Uncrustifyのオプション説明してたら、ここまで来ました。今回は、行の途中に改行を入れて、行分割してきれいなコードにしましょうというオプションについての解説です。

これらのオプションは、たった４つしかありません。

ラインスプリットオプション一覧
------------------------------

| 項目               | 説明                                                                                          |
|:-------------------|:----------------------------------------------------------------------------------------------|
| code_width         | コード幅の制限桁数 { number }                                                                 |
| ls_for_split_full  | 長い'for'文を';'の位置でスプリットするかどうか { false, true }                                |
| ls_func_split_full | 長い関数のプロトタイプ宣言/呼び出しを','の位置でスプリットするかどうか { false, true }        |
| ls_code_width      | code_widthでスプリットするかどうか (だいたいcode_widthで少しはみ出す場合あり) { false, true } |

僕の設定
--------

```bash:line_split.cfg
code_width                               = 96
ls_for_split_full                        = true
ls_func_split_full                       = true
ls_code_width                            = true
```

CODE_WIDTH
----------
コードのカラム数は僕は96桁ですね。
学生の頃は、BSD KernelのTCP/IPのプロトコルスタックとWi-Fiドライバを開発してたので、80カラムが基本だと思っていたのですが。
最近は、ウィンドウシステム上でエディタ使って開発するのが当たり前となりました。
今では「カラム制限なんていらないんじゃない？」って思うようなことも。
それでも、やはり多数のファイルを横に並べて見比べたりしたいと思うと、96桁とか120桁ぐらいがいいのではないかと思うようになりました。

LS_FOR_SPLIT_FULL
-----------------
```cpp:ls_for_split_full.cpp
// ls_for_split_full = true
// 必ずしも、このような整形とはならない。
// ただし、他の改行/空行オプションを追加すると、別の改行ルールが適用される。
    for (std::list<int>::iterator* it = my_long_long_list.begin();
         it != my_long_long_list.end();
         ++it)
    {
    }
```

LS_FUNC_SPLIT_FULL
------------------
```cpp:ls_func_split_full.cpp
// ls_func_split_full = true
// 長いプロトタイプ宣言があったりすと:
void my_long_long_long_function(MyClass& param1, MyClass& param2, MyClass& param3);

// このようにすべての関数宣言内の','の位置で改行を挿入する。
void my_long_long_long_function(MyClass& param1,
                                MyClass& param2,
                                MyClass& param3);
```

LS_CODE_WIDTH
-------------
```cpp:ls_code_width.cpp
// 行送りがされるらしいが、ルールが適用されているのかどうかよくわからん。
{
    {
        {
            MyClass long_long_variable =
                    long_namespace::
                    so_long_name_class::
                    so_long_name_method(
                        so_long_name_param);
        }
    }
}
```
[Scala] 中括弧でオブジェクトの初期化

ScalaでJavaFXを使おうとしたときに、Javaとの互換性問題にあたりました。
builderパターンを使ったNodeオブジェクトの生成がScalaではコンパイルエラーになるのです。調べたところ、JIRAにはすでに報告されていてScala 2.11-M3が修正のターゲットになっているようでした。
https://issues.scala-lang.org/browse/SI-6169

ちなみに、builderパターンを使わずに、中括弧を用いてオブジェクトを初期化することができます。

```scala
new Rectangle {
  setWidth(100d)
  setHeight(200d)
  setFill(Color.RED)
  setStroke(Color.GOLD)
}
```

C#のオブジェクト初期化子に似ていますが、もっと柔軟性が高いです。
この中括弧の中で変数を定義することもメソッドの呼び出しもできます。
もっといえばメソッドの定義すらできます。

```scala
new Rectangle {
  val w = 100d
  val h = 200d
  def getColor(n: Int): Color = n match {
    case n if n > 0 => Color.RED
    case _ => Color.GOLD
  }
  setWidth(w)
  setHeight(h)
  setFill(getColor(0))
  setStroke(getColor(1))
}
```

ただし、これらには注意点もあって、型としてはRectangleではなくてRectangleを継承した匿名クラスを生成しています。
URLRequest のURLに"?x=ほげ"のようにパラメタを埋め込むとSJISでエンコードされる問題は URLVariables を使うことで解決する


例えば

```
var req:URLRequest = new URLRequest("http://www.example.com/entries?tag=ほげ");
var loader:URLLoader = new URLLoader();
loader.load();
```

とすると、日本語の値（”ほげ”）が SJIS としてサーバ側に渡されてしまう。（環境による？）

パラメタの値をちゃんと UTF-8 でエンコードするには、以下のようにURLVariables のインスタンスのプロパティに値をセットし、URLRequest の data プロパティにセットして load() を行う。

```
var req:URLRequest = new URLRequest("http://www.example.com/entries");
var vars:URLVariables = new URLVariables();
vars.tags = "ほげ";
req.data = vars;
var loader:URLLoader = new URLLoader();
loader.load();

```
JavaScrpit イベントドリブン処理の制御


# 概要 


JavaScriptでは _addEventListener_ を使ってイベントを登録出来るが、現在イベントをしている時は、同じイベントを発生させないで欲しい時がある。そういう時のやり方が、Webにはあまり書いてなかったのでやってみた。

# やり方


このようにやる。

```javascript
var time = 1000;

document.addEventListener("keydown", function f (e) {
    //　何かの処理

    document.removeEventListener("keydown", f, true);

    setTimeout( function () {
        document.addEventListener("keydown", f, true);
    }, time);
}, true)
```


という感じにすると出来る。

# 何に使ったのか


CSSのアニメーションを処理する間、イベントドリブンで発火する処理を止めておきたかったのでやってみた。

# まとめ


もっといい方法があれば教えてください
Parsecのソースちら見(3)

> 結局まだパーサー1個も出てきてないので、後一回必要。
> http://www.facebook.com/hiratara/posts/539308276101182

プリミティブのパーサとしては`tokenPrimEx `が用意されてる。パーサの材料は原始的な感じで、エラー時の文字列生成に使う`showToken`、エラー時に表示する(他にも使える)ソースのポジションを適切に更新する`nextpos`、ユーザが定義した状態を更新する`Just nextState`、そして実際にトークンの是非を判断する`test`の4つとなる。これらを矛盾しないように適切に定義して渡せばOK。ソースは長く見えるけど当たり前のことしかやってない。ユーザ状態の更新の有無で定義を2つに分けてるけど、これはなぜ必要なんだろう。インライン展開する際のパフォーマンスの都合？

```haskell:Text-Parsec-Prim.html
tokenPrimEx :: (Stream s m t)
            => (t -> String)      
            -> (SourcePos -> t -> s -> SourcePos)
            -> Maybe (SourcePos -> t -> s -> u -> u)
            -> (t -> Maybe a)     
            -> ParsecT s u m a
{-# INLINE tokenPrimEx #-}
tokenPrimEx showToken nextpos Nothing test
  = ParsecT $ \(State input pos user) cok cerr eok eerr -> do
      r <- uncons input
      case r of
        Nothing -> eerr $ unexpectError "" pos
        Just (c,cs)
         -> case test c of
              Just x -> let newpos = nextpos pos c cs
                            newstate = State cs newpos user
                        in seq newpos $ seq newstate $
                           cok x newstate (newErrorUnknown newpos)
              Nothing -> eerr $ unexpectError (showToken c) pos
tokenPrimEx showToken nextpos (Just nextState) test
  = ParsecT $ \(State input pos user) cok cerr eok eerr -> do
      r <- uncons input
      case r of
        Nothing -> eerr $ unexpectError "" pos
        Just (c,cs)
         -> case test c of
              Just x -> let newpos = nextpos pos c cs
                            newUser = nextState pos c cs user
                            newstate = State cs newpos newUser
                        in seq newpos $ seq newstate $
                           cok x newstate $ newErrorUnknown newpos
              Nothing -> eerr $ unexpectError (showToken c) pos
```

後必要なのはKleene closure(任意個の繰り返し)を作るための`manyAccum`。入力を消費して成功した場合、`walk`関数で繰り返しパーサを適用し、ユーザが定義した`acc`を使って結果を集める。繰り返しの停止に使えるのは入力を消費せずに失敗した場合なので、`try`ともうまく組み合わせる必要がある。入力を消費して失敗した場合には元々のエラー報告用の継続に処理を進めて素直にエラーを発生させる。

ミソは入力を消費せずに成功した場合で、この時は無限ループになる可能性があるのでエラーに落とし込んでいる。後、一度も`walk`せずに繰り返しが終了した場合は、結局入力を消費しなかったことになるので`cok`ではなく`eok`の継続で処理を続けなければいけないことにも注意。

```haskell:Text-Parsec-Prim.html
manyAccum :: (a -> [a] -> [a])
          -> ParsecT s u m a
          -> ParsecT s u m [a]
manyAccum acc p =
    ParsecT $ \s cok cerr eok eerr ->
    let walk xs x s' err =
            unParser p s'
              (seq xs $ walk $ acc x xs)  -- consumed-ok
              cerr                        -- consumed-err
              manyErr                     -- empty-ok
              (\e -> cok (acc x xs) s' e) -- empty-err
    in unParser p s (walk []) cerr manyErr (\e -> eok [] s e)
```

この辺まで事前知識を持ってから`satisfy`のコードを読むと、すんなり読めるだろう。

```haskell:Text-Parsec-Char.html
satisfy :: (Stream s m Char) => (Char -> Bool) -> ParsecT s u m Char
satisfy f           = tokenPrim (\c -> show [c])
                                (\pos c _cs -> updatePosChar pos c)
                                (\c -> if f c then Just c else Nothing)
```

Parsecのコード読むのはこの程度にしようかなと思うのだけど、最後に解せないとこが1つ。`tokens`だけは`tokenPrimEx`も`manyAccum`も使ってない。歴史的経緯なのか、理由があるのか・・・。
Railsで作ったJSONをRackでHTMLにする

FrogApps 技術ブログ始めました！
RailsやiOS、HTML5の情報を発信中!! → http://qiita.com/teams/frogapps

----

RailsでiOSなどのアプリ用のサーバを作ると、JSONを出力するAPIを作ることになると思います。

そのJSON APIを使って、HTMLをレンダリングするRackモジュールを作ってみました。

これを使うことで、Railsがモデルとコントローラ層、Rackでビュー層という風に別れます。
Railsのビューより機能は劣りますが、A/Bテストを仕込むなど、なにか手を加えたいときには全体が把握しやすく、Railsのバージョンにも依存しなくなるというメリットがあります。


```ruby:json_render.rb
=begin
# This file is used by Rack-based servers to start the application.

require ::File.expand_path('../config/environment',  __FILE__)
require './lib/json_render'
use JSONRender,
  :routes => {
    %r|/test/(\w+)$| => {
      :json => "/home/\\1.json",
      :erb => Proc.new do
        ['erb/home.1.html.erb', 'erb/home.2.html.erb'][rand(2)]
      end
    },
    %r|^/$| => {
      :json => "/home.json",
      :erb => 'erb/index.html.erb'
    }
  }

run JsonRenderTest::Application
=end

require 'erubis'
require 'net/http'

class JSONRender
  def initialize(app, options)
    @app, @routes = app, options[:routes]
    @templates = {}
  end

  def call(env)
    path_info = env['PATH_INFO']
    key, settings = @routes.find do |path, settings|
      path_info.match(path)
    end.to_a
    return @app.call(env) unless key
    
    # get json data from specific path
    settings_json = settings[:json]
    settings_json = settings_json.call(env) if settings_json.is_a?(Proc)
    json_path = path_info.gsub(key, settings_json)
    status, headers, response = @app.call(env.update('PATH_INFO' => json_path))
    return [status, headers, response] if [Net::HTTPNotModified].include?(status)
    response.close if response.respond_to?(:close)

    if status / 100 == 2
      # render data
      erb_path = settings[:erb]
      erb_path = erb_path.call(env) if erb_path.is_a?(Proc)
      response = render(erb_path, JSON.parse(response.is_a?(Hash) ? response.first : response.body))
      
      # Set new Content-Length, if it was set before we mutated the response body
      if headers['Content-Length']
        length = response.to_ary.inject(0) { |len, part| len + Rack::Utils::bytesize(part) }
        headers['Content-Length'] = length.to_s
      end

      headers['Content-Type'] = 'text/html'
    end
    [status, headers, response]
  end

  def render(erb_file, params)
    erb_file = File.expand_path(erb_file)
    template = @templates[erb_file]
    if !template || template[:timestamp] != File.mtime(erb_file)
      erb = Erubis::Eruby.new(File.read(erb_file))
      template = {:erb => erb, :timestamp => File.mtime(erb_file)}
      @templates[erb_file] = template
    end
    [template[:erb].evaluate(params)]
  end
end
```
a01.txt a02.txt ... のようなファイルを a/01.txt a/02.txt ... として移動したい

最近 sed の真価にやっと気付いてきたのでどうせならそれでやってみたい．

```sh
mkdir a
ls a*.txt | sed -e "a\([0-9]\+\)\.txt/\1/" | xargs -i mv a{}.txt a/{}.txt
```

sed で数字を抜き取って，その数字を用いて mv コマンドを行う．

ちなみに xargs で引数の位置を調整するには `-i` オプションを使い，引数の来るべき位置に `{}` を入れ込めば大丈夫だそうです．

昔懐かしの `find . -name '*' -exec cat {} \;` 式の書き方でも `{}` を使いましたね．

`a` の部分が固定長だったのでぶっちゃけ cut コマンドでも事足りた感がパナいです．

あとファイル数も 100 以下だったので明らかに

```a.sh
mv a01.txt a/01.txt
mv a02.txt a/02.txt
...
```

的なスクリプトを自分で書いて `bash a.sh` した方が早かったです ( 'x')

# 参考

* http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231161/
* http://d.hatena.ne.jp/ksmemo/20101215/p1
* http://www.coins.tsukuba.ac.jp/~yas/coins/syspro-2001/2001-06-25/
~/.ssh/ 以下に書き込めない環境で ssh したとき known_hosts に書き込めないエラーを抑制する

ssh_config(5) の `UserKnownHostsFile` で書き込み可能なファイルを指定すれば良い。

`ssh -o UserKnownHostsFile=$HOME/known_hosts` のようにする。

`-o StrictHostKeyChecking=no` も組み合わせると初回の (yes/no) を尋ねられなくなるのでバッチ処理などを書くときに便利 (DNS spoofing に気づけなくなるなどのリスクはありえる)

```
$ ssh -i ~/id_rsa \
  -o UserKnownHostsFile=~/known_hosts \
  -o StrictHostKeyChecking=no \
  git@github.com
```
プライベートリポジトリを激安にCI出来るCircle CIが凄い。

@takehiro に教えて貰ったCircle CIを使ってみるともの凄く良くて、とてもお勧めなので記事を書きました！

Circle CIって何？
---

Travis CIと同機能でWebでのUIが若干違うサービスです。
CIとしての仕事はきちんと行えます。


Circle CIの使い方
---

https://circleci.com/ 
にアクセスします。
![Circle CI](http://cdn-ak.f.st-hatena.com/images/fotolife/c/camelmasa/20130215/20130215010301.jpg?1360857792 "Circle CI")

Githubアカウントでサインアップを行います。
画面に従って進むとプロジェクトをfollowする画面が表示されます。
![Circle CI](http://cdn-ak.f.st-hatena.com/images/fotolife/c/camelmasa/20130215/20130215010302.png?1360857908 "Circle CI")
CIしたいプロジェクトをfollow後、"Done Managing Repos"をクリックします。
ここでは"camelmasa/spree"を選択します。

するとfollowしたプロジェクト一覧のテスト結果の画面が表示される様になります。
![Circle CI](http://cdn-ak.f.st-hatena.com/images/fotolife/c/camelmasa/20130215/20130215010303.png?1360857932 "Circle CI")

これでCIが出来る環境が整いました！
後はgithubにpushする毎にCIが実行される様になります！簡単！

Circle CIのお勧めポイント
--
princingがとにかく安い！
https://circleci.com/pricing
private repositoryでも最安19ドルから！

それでいてTravisと遜色無い機能を持っている。


Circle CIの細かいTips
---
ドキュメントのURLはこちら。
https://circleci.com/docs


環境が整ったは良いが、テストが失敗する…。

そうです、プロジェクト直下にcircle.ymlを置かない限り、恐らくテストは失敗すると思います。(一応Webからもテストコマンドの設定も可能)

circle.ymlのsampleはこちらのURLにあります。
https://circleci.com/docs/configuration


また細かいところなのですが、Travisと同じでgithubのcommitページにテスト結果が表示されます。
![Circle CI](http://cdn-ak.f.st-hatena.com/images/fotolife/c/camelmasa/20130215/20130215010921.png?1360858170 "Circle CI")


まとめ
---
超おすすめ！！！
virtualbox(centos)でのhttpdインストールメモ


環境 centos6.3（ゲストOS）macosx10.8(ホストOS)
※virtualboxのguest addisionalが入ってるものとする

httpのインストールからvirtualhostの設定までを記載する
※あくまで開発環境化においてのインストール手順で本番用とかは別途探してきてください。

全てrootユーザー権限で実行しています。

## install編

yumでサクッと入れる

```
yum -y install httpd
```

## httpd.confの設定

まずは設定ファイルのバックアップ

```
cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.default
```

続いて設定ファイルを編集

```/etc/httpd/conf/httpd.conf
vim /etc/httpd/conf/httpd.conf

ServerTokens Prod　#　エラーページ等でOS名を表示しないようにする
.
.
.
<Directory />
    Options FollowSymLinks
    AllowOverride All #.htaccessの許可
</Directory>

#AddDefaultCharset UTF-8　#コメントアウト(文字化け対応)
```

## virtualhostの設定

virtualhostの設定を新規で作成する

```/etc/httpd/conf.d/virtualhost.conf 
vim /etc/httpd/conf.d/virtualhost.conf

<VirtualHost *:80>
    DocumentRoot "/home/ユーザーディレクトリ/バーチャルホスト名/www"
    ServerName バーチャルホスト名
    <Directory "/home/ユーザーディレクトリ/バーチャルホスト名/www">
        order deny,allow
        allow from All
    </Directory>
</VirtualHost>

#編集用にユーザーを作成しておくと何かと便利です自分の場合は
# ユーザーディレクトリ = web
#ユーザーの作り方
#
#useradd web
#passwd web
#パスワードを入力する
#ドメインでディレクトリを切っておくとわかりやすいです。自分の場合は
# バーチャルホスト名 = lo.test.org
```

##port(80番)の開放

apacheのデフォルトのポート８０番が開いていないはずなのでポートを開放する

```shell:/etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
#追加
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

```


## ドキュメントルートのディレクトリを作成

virtualhostの設定内容のディレクトリを作成する

```shell
mkdir /home/ユーザーディレクトリ/www
#apacheがアクセスできるようにパーミッションを変更する
chmod -R 775 /home/ユーザーディレクトリ/
#テストファイルを作成
vim index.html

<html>
<body>
hello.world
</body>
</html>
```

## apacheの起動
```
/etc/init.d/httpd start
chkconfig httpd on
```

##ipアドレスの確認

ホストOSの設定に必要なのでメモしておく

```
$ifconfig

#下記の項目(inet)がどこかにあるのでメモしておく（デフォルトだと192.168.xx.xxx）なはず
inet addr:192.168.56.101

```

ここまでcentos(ゲストOS)側の設定

##ホストOS側（MAC）の設定
```/etc/hosts
sudo vim /etc/hosts
#追加(ifconfigのinetの値)
192.168.56.101  lo.test.org
```

##ホストOSのブラウザで確認

ブラウザでhttp://lo.test.orgにアクセスでhello worldが表示されたら完了
コマンドを実行する前に確認メッセージを出力する


PowrShellでなんかのコマンドを実行する際に、事前に確認をしたい時があります。
git (svn) rebaseとか、git push -fとか。

そんな時、コマンド実行前に簡単に確認出来るような関数を作成してみました。

以下のPowerShellコードを$Profileとかに書いたりしておく。

```PowerShell:コマンド実行前に確認メッセージを行う
#コマンド実行前確認メッセージ
function  DoCommand-WithConfirm([string]$command, [string]$addMessage = "", [bool]$isDefaultYes=$false)
{
    #選択肢の作成
    $CollectionType = [System.Management.Automation.Host.ChoiceDescription]
    $ChoiceType = "System.Collections.ObjectModel.Collection"

    #選択肢コレクションの作成
    $descriptions = New-Object "$ChoiceType``1[$CollectionType]"
    $questions = (("&Yes","実行します"), ("&No","実行しない"))
    $questions | %{$descriptions.Add((New-Object $CollectionType $_))} 

    #確認メッセージ作成
    $message = "「" + $command + "」" + "を実行しますか？"
    if( -not [string]::IsNullOrEmpty($addMessage))
    {
        $message += [System.Environment]::NewLine + $addMessage
    }
    
    #規定値の設定
    $defoltType = 1;
    if($isDefaultYes -eq $true)
    {
        $defoltType = 0;
    }

    #確認メッセージの表示とコマンドの実行
    $answer = $host.ui.PromptForChoice("<実行確認>",$message ,$descriptions,$defoltType)
    if($answer -eq 0)
    {
        Invoke-Expression $command
    }
}
```	

参考：[ここらへん](http://mtgpowershell.blogspot.jp/2011/10/hostui_31.html)

引数は`$command`が実行するコマンド(を文字列にして渡す)、`$addMessage`が確認メッセージの後に追加するメッセージ内容(改行された後表示される)、`$isDefaultYes`がYesを規定値にするかどうかのbool値(何も入れないと`$false`)。

使い方はこんな感じ

```PowerShell:DoCommand-WithConfirmの使い方
> DoCommand-WithConfirm "Write-Host `"Hello World`""

<実行確認>
「Write-Host "Hello World"」を実行しますか？
[Y] Yes  [N] No  [?] ヘルプ (既定値は "N"): y
Hello World


> DoCommand-WithConfirm "Write-Host `"Hello World`"" "ええんか？　ほんまにええのんか？"

<実行確認>
「Write-Host "Hello World"」を実行しますか？
ええんか？　ほんまにええのんか？
[Y] Yes  [N] No  [?] ヘルプ (既定値は "N"):

> DoCommand-WithConfirm "Write-Host `"Hello World`"" "ええんか？　ほんまにええのんか？" $true

<実行確認>
「Write-Host "Hello World"」を実行しますか？
ええんか？　ほんまにええのんか？
[Y] Yes  [N] No  [?] ヘルプ (既定値は "Y"):
Hello World
```

これでうっかりミスを回避していきたいものですね。
GNOMEバージョンを取得する

```python
#!/usr/bin/env python

import os.path
import subprocess
import re

def _splitLines(string):
    ptn = re.compile('\n')
    return ptn.split(string)

def _ptnextract(string):
	ptn = re.compile('^.+(\d+).(\d+).(\d+).*$')
	(ver, rev1, rev2) = ptn.split(string)[1:4]
	return ver

gnomesessions='/usr/bin/gnome-session'
if os.path.exists(gnomesessions):
    print _ptnextract(subprocess.Popen([gnomesessions,'--version'], stdout=subprocess.PIPE).communicate()[0])

gnomeabout='/usr/bin/gnome-about'
if os.path.exists(gnomeabout):
    print _ptnextract(_splitLines(subprocess.Popen([gnomeabout,'--gnome-version'], stdout=subprocess.PIPE).communicate()[0])[0])
```
vimでカッコの内側を選択する

iをつかう

以下はカッコ内にカーソルがあるとします

```
(Hello Qiita)
```
なら、`vi)`
かっこの内側を選択じゃなくて削除したいときは`di)`
かっこの内側を削除したうえにインサートモードにしたいときは`ci)`

```
"Hello Qiita"
```
なら、`vi"`

```
<h1>Hello Qiita</h1>
```
なら、`vit` (タグって意味)



ちなみに、カッコもふくめて選択したいときはaをつかう

ちなみに、ちなみに、単語だけ選択したいときはiwをつかう(awだとスペースもふくむ)

くわしくは、`:h text-object` 日本語ヘルプは`:h text-object@ja`
HistoricalCollection: An array remembers added and dropped items


This is an example of usage:

```coffeescript
collection = new HistoricalCollection(1, 2, 3)

console.log collection.history.additions
# -> [ 1, 2, 3 ]

# forget history
collection.forgetHistory()
console.log collection.history.additions
# -> [ ]

# then let's start manipulation
collection.push(4, 5, 6)
collection.remove(1)

console.log collection.history.additions
# -> [ 4, 5, 6 ]

console.log collection.history.removals 
# -> [ 1 ]

console.log collection
# -> [ 2, 3, 4, 5, 6 ]
```

HistoricalCollection module for node.js:

```coffeescript:HistoricalCollection.coffee
###
History
###
class History
    constructor: ()->
        @additions = []
        @removals  = []
    add: (items...)->
        for item in items
            if item in @removals
                @removals.splice(@removals.indexOf(item), 1)
            else
                @additions.push(item)
    remove: (items...)->
        for item in items
            if item in @additions
                @additions.splice(@additions.indexOf(item), 1)
            else
                @removals.push(item)
    export: ()->
        return additions: @additions, removals: @removals

###
Historical Collection
###
class HistoricalCollection extends Array
    constructor: ()->
        Object.defineProperty(@, 'history', writable: true, value: new History())
        @push(arguments...)
    forgetHistory: ()->
        @history = new History()
        return this
    push: ()->
        Array::push.call(@, arguments...)
        @history.add(arguments...)
    pop: ()->
        poped = Array::pop.call(@, arguments...)
        @history.remove(poped)
    shift: ()->
        shifted = Array::shift.call(@, arguments...)
        @history.remove(shifted)
    splice: ()->
        spliced = Array::splice.call(@, arguments...)
        @history.remove(spliced...)
    unshift: ()->
        Array::unshift.call(@, arguments...)
        @history.add(arguments...)
    remove: (target)->
        while target in @
            @splice(@indexOf(target), 1)

module.exports =
    HistoricalCollection: HistoricalCollection
```
zshでN個前のコマンドをほにゃららして実行

- 直前のコマンドを置換して実行 `!:s/ls/vim`
- 直前のコマンドの引数とかを取得して実行 `ls !:^`

  他の単語指示子とか

|||
|:--|:--|
|`!:0`|コマンド自体|
|`!1` or `!:^`|1個目の引数|
|`!:n`|n個目の引数|
|`!:*`|引数全部|
|`!:x-y`|xからyのやつ|

## 参考
- [ZshExpn](http://wiki.fdiary.net/zsh/?ZshExpn)
リストモナドとLogicモナド

http://hackage.haskell.org/packages/archive/logict/latest/doc/html/Control-Monad-Logic.html
リストモナドの一般化としてLogicTというものがあり、バックトラックを表現できるらしい。

いくつかの自明な例を作ってみた。

```haskell
import Control.Monad
import Control.Monad.Logic

fromList :: [a] -> Logic a
fromList xs = logic $ \f x -> foldr f x xs

toList :: Logic a -> [a]
toList = observeAll

main = do
    print $ toList $ return 42 -- [42]
    print $ toList $ fromList [0,1,2] >>= \x -> [x + 1, x + 2, x + 3] -- [1,2,3,2,3,4,3,4,5]
    print $ toList $ mzero -- []
    print $ toList $ fromList [0,1,2] `mplus` fromList [7,8,9] -- [0,1,2,7,8,9]
アプリケーションが「開発元が未確認のため開けません。」「Mac App Store からダウンロードされたものでないため開けません。」と言われたときの対処法

====

Moutain Lionでは[Gatekeeper]( http://support.apple.com/kb/HT5290?viewlocale=ja_JP )が手厚くMacを守ってくれるようになったので「開発元が未確認のため開けません。」あるいは「Mac App Store からダウンロードされたものでないため開けません。」と言われてアプリを実行できないことがあります。

# 追記

Finder上でアプリケーションアイコンを右クリックしてOpenを選択した方が手っ取り早いですね。
コメントで[fmhr@github]( http://qiita.com/users/fmhr@github )さんに教えていただきました。ありがとうございます！
![]( https://dl.dropbox.com/u/32205774/20130214_how_to_change_gatekeeper_options/00020.png )
![]( https://dl.dropbox.com/u/32205774/20130214_how_to_change_gatekeeper_options/00019.png )

----

# 手順

たとえば[eclipse]( http://www.eclipse.org/downloads/ )の初回起動時には↓のようなダイアログが表示され、起動することができません。
![]( https://dl.dropbox.com/u/32205774/20130214_how_to_change_gatekeeper_options/00013.png )

そのためシステム環境設定からGatekeeperのオプションを一時的に変更してあげます。
![]( https://dl.dropbox.com/u/32205774/20130214_how_to_change_gatekeeper_options/00014.png )
![]( https://dl.dropbox.com/u/32205774/20130214_how_to_change_gatekeeper_options/00015.png )
![]( https://dl.dropbox.com/u/32205774/20130214_how_to_change_gatekeeper_options/00016.png )
![]( https://dl.dropbox.com/u/32205774/20130214_how_to_change_gatekeeper_options/00018.png )

これでアプリケーションを実行できるようになりました。
![]( https://dl.dropbox.com/u/32205774/20130214_how_to_change_gatekeeper_options/00019.png )

アプリケーション起動後はGetekeeperのオプションをデフォルトに戻しておくことをおすすめします。
※一度実行したアプリケーションは次回からブロックされません。
contentコマンドでContentProviderを呼び出す

コンテンツへのCRUD操作をContentProvider経由で実行するコマンド。

詳細：http://yuki312.blogspot.jp/2013/02/androidcontentcontentproviderdb.html

・query
$ adb shell content query --uri &lt;URI&gt; [--projection &lt;PROJECTION&gt;] [--where &lt;WHERE&gt;] [--sort &lt;SORT_ORDER&gt;]

・insert
$ adb shell content insert --uri &lt;URI&gt; --bind &lt;BINDING&gt; [--bind &lt;BINDING&gt;...]

・update
$ adb shell content update --uri &lt;URI&gt; [--where &lt;WHERE&gt;]

・delete
$ adb shell content delete --uri &lt;URI&gt; --bind &lt;BINDING&gt; [--bind &lt;BINDING&gt;...] [--where &lt;WHERE&gt;]

・&lt;URI&gt;
　　コンテンツプロバイダのURI
　　(例)--uri content://hoge.authority

・&lt;PROJECTION&gt;
　　検索対象のカラム名を指定します。指定方法は &lt;COLUMN_NAME&gt;[:&lt;COLUMN_NAME&gt;...]
　　(例)column1:column2:column3

・&lt;WHERE&gt;
　　SQLのWHERE句を指定します。
　　(例)--where "column1='where_string'"

・&lt;SORT_OREDER&gt;
　　ソート対象の列を指定します。
　　(例)--sort "column1 DESC"

・&lt;BINDING&gt;
　　次のフォーマットに従い、カラムにバインドする情報を指定します。
　　&lt;COLUMN_NAME&gt;:&lt;TYPE&gt;:&lt;COLUMN_VALUE&gt;
　　&lt;TYPE&gt;にはb - boolean, s - string, i - integer, l - long, f - float, d - doubleが指定可能です。
　　(例)column:s:new_string