OmniAICreator/Qiita-1.07M huggingface dataset:
TextMate 2 のインストール

* 覚書なのであとでちゃんと書く

## ダウンロード
```
$ git clone https://github.com/textmate/textmate.git
```

## 必要なライブラリのインストール
```
$ brew install --HEAD https://raw.github.com/adamv/ homebrew-alt/master/head-only/ninja.rb
$ brew install ragel boost multimarkdown hg
```
## Build 

```
$ ./configure && ninja
```

## エラー発生
```
Shared/PCH/prelude.cc:30:10: fatal error: 'boost/optional.hpp' file not found
#include <boost/optional.hpp>
```

ヘッダが見つからないと言われたので

```textmate/target
diff --git a/target b/target
index 1c418e9..e1c0d9c 100644
--- a/target
+++ b/target
@@ -7,6 +7,7 @@ FLAGS += -DNS_BUILD_32_LIKE_64 -D'NULL_STR="\uFFFF"'
 FLAGS += -Wall -Wwrite-strings -Wformat -Winit-self -Wmissing-include-dirs -Wno-parentheses -Wno-sign-compare -Wno-switch
 FLAGS += -Wno-address-of-temporary
 FLAGS += -IShared/include
+FLAGS += -I/usr/local/Cellar/boost/1.49.0/include
 
 # FLAGS += -D_GLIBCXX_DEBUG
 FLAGS += -DNDEBUG -Os
```

brew でインストールした boost の path を追加

## もう1回Build 

```
$ ./configure && ninja
```

## Application にコピー
```
$ cp -r ~/build/TextMate/Applications/TextMate/TextMate.app /Applications/
```

# TextMateの起動
```
$ open /Applications/TextMate.app/
```
PHPで使うGoFパターン ひとり Advent Calendar - メメント


#メメントってなに?
要するにロールバックですね。日常の業務では適用範囲があまり思いつかないパターンです。「memento」は英語として和訳すると「形見の品」とでもなるのでしょうか。なんだかメランコリックな名前ですね。余談ですが、ラテン語の有名な成句で「memento mori」がありますね。「人は死ぬものだということを忘れるな」というやつです。ここでは「忘れるな = 思い出せ」という使い方、ラテン語では「memento」「思い出せ」という動詞の命令形なんですかね。日本人にとっては「memento」というとパッと思い付く「memento mori」という死生観がどうのという成句に対して、ロールバックに使うパターンが紐付くのは、なかなかドラマチックですね。

#メメントの構造
* オリジネイター - 操作対象オブジェクト
* ケアテイカー - メメントを記憶するオブジェクト
* メメント - 状態オブジェクト

```
<?php
//
// Originator
//
class Article {
  private $_Subject = null;
  private $_Body = null;
  private $_DateTime = null;

  public function setSubject ( $s ) {
    $this->_Subject = $s;
  }

  public function getSubject () {
    return $this->_Subject;
  }

  public function setBody ( $s ) {
    $this->_Body = $s;
  }

  public function getBody () {
    return $this->_Body;
  }

  public function setDateTime ( $d ) {
    $this->_DateTime = $d;
  }

  public function getDateTime () {
    return $this->_DateTime;
  }

  public function createMemento () {
    $obj = new ArticleMemento ();
    $obj->setSubject ( $this->getSubject() );
    $obj->setBody ( $this->getBody() );
    $obj->setDateTime ( $this->getDateTime() );
    return $obj;
  }

  public function setMemento ( $obj ) {
    $this->setSubject ( $obj->getSubject() );
    $this->setBody ( $obj->getBody() );
    $this->setDateTime ( $obj->getDateTime() );
  }
}

//
// Memento
//
class ArticleMemento {
  private $_Subject = null;
  private $_Body = null;
  private $_DateTime = null;

  public function setSubject ( $s ) {
    $this->_Subject = $s;
  }

  public function getSubject () {
    return $this->_Subject;
  }

  public function setBody ( $s ) {
    $this->_Body = $s;
  }

  public function getBody () {
    return $this->_Body;
  }

  public function setDateTime ( $d ) {
    $this->_DateTime = $d;
  }

  public function getDateTime () {
    return $this->_DateTime;
  }
}

//
// CareTaker
//
class ArticleCaretaker {
  private $_Memento = null;

  public function getMemento () {
    return $this->_Memento;
  }

  public function setMemento ( $memento ) {
    $this->_Memento = $memento;
  }
}


//
// コントローラ
//
date_default_timezone_set ( 'Asia/Tokyo' );
function say ( $s ) {  print "$s\n"; }

say ( '<< 初期状態 >>' );
$article = new Article();
$article->setSubject  ( '変更前の記事の件名' );
$article->setBody     ( '変更前の記事の本文' );
$article->setDateTime ( date ( 'Y/m/d H:i:s' ) );

say ( $article->getSubject () );
say ( $article->getBody () );
say ( $article->getDateTime () );

$ac = new ArticleCareTaker ();
$ac->setMemento ( $article->createMemento() );

say ( '<< 変更 >>' );
$article->setSubject  ( '変更後の記事の件名' );
$article->setBody     ( '変更後の記事の本文' );
$article->setDateTime ( date ( 'Y/m/d H:i:s', strtotime ( '+1hour' ) ) );
say ( $article->getSubject () );
say ( $article->getBody () );
say ( $article->getDateTime () );


say ( '<< 復元 >>' );
$article->setMemento ( $ac->getMemento() );
say ( $article->getSubject () );
say ( $article->getBody () );
say ( $article->getDateTime () );
```
ある文字列がマルチバイト文字を含んでいるか


String#bytesでとりだして上位ビットが1であるかどうかを見る

```ruby
# -*- coding:utf-8 -*-

def has_mb?(str)
  str.bytes do |b|
    return true if  (b & 0b10000000) != 0
  end
  false
end

p has_mb?("this is 日本語") # => true
p has_mb?("this isn't nihongo!") # => false
```
Objective-C で二項演算子 ?: を使う

GCC や LLVM の C コンパイラには三項演算子 `?:` を独自に拡張した **二項** 演算子 `?:` がある。 `x ?: y` のように使い、 `x ? x : y` とほぼ同様に動作する（ただし前者は `x` を1回しか評価しないので、 `x` に副作用がある場合は動作が異なる）。

```objc
42 ?: 0; // => 42
0 ?: 42; // => 42
0 ?: 0 ?: 42; // => 42
```

失敗すると `nil` を返すメソッドのフォールバック処理が簡単に書ける。

```objc
NSString *str = [obj parsedString] ?: defaultStr;
```

Objective-C で開発する限り LLVM からは離れないのだから積極的に使っている。
プロジェクトで統一した方が良い設定（空白の扱い）


gitなどでソース管理をする上で、空白のルールが統一されていないと空白に関するdiffが増えて、ソース管理の邪魔になりやすいので、以下の設定は必要に応じてチームで決めた方が良い。（マージ時にCONFLICTしにくい）

```js:Preferences.sublime-settings
{
	"draw_white_space": "all",
	"ensure_newline_at_eof_on_save": true,
	"tab_size": 2,
	"translate_tabs_to_spaces": true,
	"trim_trailing_white_space_on_save": true,
	...
}

```

* draw_white_space 空白（タブ、スペース）を可視化
* ensure_newline_at_eof_on_save 最後の行を空白行にして保存
* tab_size 空白サイズ
* translate_tabs_to_spaces タブをスペースに変換
* trim_trailing_white_space_on_save 行末の空白を保存時に削除

その他

* チーム外で作られたファイルを改変する場合は、空白の扱いルールが違う場合があるので、必要に応じて設定を変更する
* "folder_exclude_patterns", "file_exclude_patterns"も統一してもいい
* .gitignore, .gitignore_globalなども共通ルールが推奨される
Rapahel の枠のサイズを変更


外枠だけの変更でよければ、

```js
var paper = Rapahel('container', 300, 300);
```

な場合、以下のようにすればいいようです。SVG の時と VML の時で処理を分けます。

```js
var w = 500
  , h = 500
  , $paperChild = $('#container').children().attr({ width: w, height: h })
;

if (Raphael.type === 'SVG') {
  $paperChild.attr('viewBox', [0, 0, w, h].join(' '));
} else {
  $paperChild.css('overflow', 'visible');
}
```

内容も一緒にスケールする方法は、以下のリンクで議論されています。

[javascript - Scaling SVG (Raphael.js) like an SWF - Stack Overflow](https://stackoverflow.com/questions/4322660/scaling-svg-raphael-js-like-an-swf)
jQuery.Deferred で並列と直列を混ぜる


foo -> [bar, baz] -> foo -> [bar, baz] -> foo の順で実行します。[bar, baz] は並列に実行。

なお、説明のため `jQuery.animate()` の `queue` は無効にしておきます。

```coffee
$el = $('body')
foo = ->
  $el.animate { marginTop: 100, marginLeft: 0 }, { duration: 1000, queue: false }
bar = ->
  $el.animate { marginLeft: 100 }, { duration: 1000, queue: false }
baz = ->
  $el.animate { marginTop: 0 }, { duration: 1000, queue: false }

$.Deferred( (dfd) ->
  dfd
    .pipe(foo)
    .pipe( -> $.when bar(), baz() )
    .pipe(foo)
    .pipe( -> $.when bar(), baz() )
    .done(foo)
).resolve()
```

```js
var $el = $('body');

function foo() {
  return $el.animate({ marginTop: 100, marginLeft: 0 }, { duration: 1000, queue: false });
}
function bar() {
  return $el.animate({ marginLeft: 100 }, { duration: 1000, queue: false });
}
function baz() {
  return $el.animate({ marginTop: 0 }, { duration: 1000, queue: false });
}

$.Deferred(function (dfd) {
  dfd
    .pipe(foo)
    .pipe(function() {
      return $.when(bar(), baz());
    })
    .pipe(foo)
    .pipe(function() {
      return $.when(bar(), baz());
    })
    .done(foo)
}).resolve();

```
Logback の設定サンプル

```logback.xml
<configuration>

  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <!-- deny all events with a level below INFO, that is TRACE and DEBUG -->
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>INFO</level>
    </filter>

    <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] (%logger{0}:%L\) %msg%n</pattern>
    </encoder>
  </appender>

  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>/foo/bar/xxx.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>/foo/bar/xxx.log.%d{yyyyMMdd}</fileNamePattern>
      <maxHistory>14</maxHistory>
    </rollingPolicy>

    <encoder>
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] (%logger{0}:%L\) %msg%n</pattern>
    </encoder>
  </appender>

  <logger name="logger.name" level="info" additivity="false">
    <appender-ref ref="CONSOLE" />
  </logger>

  <root level="warn">
    <appender-ref ref="CONSOLE" />
    <appender-ref ref="FILE" />
  </root>

</configuration>
```
PhoneGapメモ(1)

PhoneGapHome
http://phonegap.com/

PhoneGap デベロッパーセンター
http://www.adobe.com/jp/devnet/phonegap.html

PhoneGapで手軽にiPhone/Androidアプリを作ろう(初回2011年8月31日)
http://gihyo.jp/dev/serial/01/phonegap

もっと使おうPhoneGap／Cordova 2.0.0
http://gihyo.jp/dev/serial/01/phonegap2(初回2012年8月7日)

Appceleratorの開発者が語るTitaniumとPhoneGapの比較
http://tech.a-listers.jp/2012/05/17/comparing-titanium-and-phonegap/

PhoneGapで始めるWeb→スマホアプリ制作入門(初回2011年7月26日)
http://www.atmarkit.co.jp/fsmart/index/phonegap.html

PhoneGapで作るハイブリッドアプリケーション(スライド)
http://www.slideshare.net/mshk/phonegap-12958144

PhoneGapを使ったモバイルアプリのネイティブ化は、銀の弾丸ではない
http://www.publickey1.jp/blog/12/phonegap_1.html

PhoneGap、Titanium、Sencha--それぞれ異なるモバイルアプリ開発のアプローチ
http://builder.japan.zdnet.com/script/35013212/

PhoneGapによるAndroid/iPhoneアプリ開発入門
http://libro.tuyano.com/index2?id=818001
Espressoで秘密鍵を使ってSFTP接続する方法


Mac環境で動作するテキストエディタ「[Espresso](http://macrabbit.com/espresso/)」では秘密鍵を使ってのサーバへのSFTP接続が可能です。その方法をご紹介します。

### 秘密鍵/公開鍵の生成
これは省略します。適当にググってみてください。

### 秘密鍵の登録
ターミナル上で以下のコマンドを打ちます。

```shell
ssh-add -K /path/to/your/key/file
```

/path/to/your/key/file には秘密鍵へのパスを書いてください。

### Espressoの設定
下のように設定します。サーバ名とユーザ名を指定します。パスワードは必要ありません。

![EspressoのSFTP設定](http://f.cl.ly/items/20361R0C2F2G2Z1t1A0K/Project Settings — sample-1.jpg)

### これだけです
設定はこれで終わりです！早速接続してみましょう。
あとはEspressoが接続時に適した秘密鍵をきちんと判断してくれます。パスフレーズが必要な場合はダイアログが出てくるかもしれません。
cacti を CentOS 6.2 へインストールする


cacti-0.8.8a を CentOS 6.2 へインストールしたときのメモ。

### 下準備
> sudo yum install php php-xml php-mbstring php-gd php-bcmath php-pdo php-mysql
> sudo yum install php-snmp net-snmp net-snmp-devel
> sudo yum install rrdtool

tar ball の取得

> wget get http://www.cacti.net/downloads/cacti-0.8.8a.tar.gz
> tar zxvf cacti-0.8.8a.tar.gz
> cd cacti-0.8.8a

### DB のセットアップ
> mysqladmin -u root create cacti
> mysql -u root

> mysql> grant all on cacti.* to 'cactiuser'@'localhost' identified by 'cactiuser';
> mysql> flush privileges;
> mysql> quit;

> mysql -ucactiuser -pcactiuser cacti <  cacti.sql

### cacti 本体のインストール
> sudo groupadd cacti
> sudo useradd -g cacti -d /var/www/html/cacti -s /sbin/nologin -M cacti
> sudo cp -Ri . /var/www/html/cacti
> sudo chown -R cacti:cacti /var/www/html/cacti/{rra,log}

ブラウザで http://"address"/cacti/ にアクセス。
表示に従って設定。
初期パスワードは admin/admin。

/etc/cron.d/cacti を以下のように登録。

> */5 * * * * cacti php /var/www/html/cacti/poller.php > /dev/null 2>&1
godのevent監視：monitがやらないけどGodがすること

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


プロセスの死活監視は多くがpollingベースで動作する、monitのように○分おきにチェックとか。

rubygemsのプロセス監視デーモン、[god](http://godrb.com/)は対象プロセスの状態変化をイベントシステムで追うやり方を提供している。

## godがイベントシステム対応でインストールされているか確認する

```
$ god check
using event system: netlink
-- snip --
```

`event system`が`none`でなければ使える。


## サンプルの監視対象プロセスを用意する

単純に終わらないスクリプトを用意。

```ruby:sample.rb 
#!/usr/bin/env ruby
loop do
  puts 'Hello'
  sleep 10
end
```


## godのコンフィグ

監視対象を起動しつつ、`process_exits`を検知したらstartを実行してup状態を保てという設定。

```ruby:god.conf 
God.watch do |w|
  w.name = "sample"
  w.start = "/root/sandbox/god/sample.rb"
  w.keepalive

  # 状態監視のジョブ
  w.transition(:up, :start) do |on|
    on.condition(:process_exits)
  end
end
```



## godが検知する様子

眺めるためにフォアグラウンドで起動。

```
# god -D -c god.conf
I [2012-08-09 20:03:36]  INFO: Loading god.conf
I [2012-08-09 20:03:36]  INFO: Syslog enabled.
I [2012-08-09 20:03:36]  INFO: Using pid file directory: /var/run/god
I [2012-08-09 20:03:36]  INFO: Started on drbunix:///tmp/god.17165.sock
I [2012-08-09 20:03:36]  INFO: sample move 'unmonitored' to 'init'
I [2012-08-09 20:03:36]  INFO: sample moved 'unmonitored' to 'init'
I [2012-08-09 20:03:36]  INFO: sample [trigger] process is running (ProcessRunning)
I [2012-08-09 20:03:36]  INFO: sample move 'init' to 'up'
I [2012-08-09 20:03:36]  INFO: sample registered 'proc_exit' event for pid 21539
I [2012-08-09 20:03:36]  INFO: sample registered 'proc_exit' event for pid 21539
I [2012-08-09 20:03:36]  INFO: sample moved 'init' to 'up'
```

先ほどのプロセスをkill。

```
# date && kill 21539
Wed Aug  9 20:05:21 PDT 2012
```

godはprocessのexitを検知して、コンディションをstartに変更する。

```
[2012-08-09 20:05:21]  INFO: sample [trigger] process 21539 exited {:pid=>21539, :exit_code=>15, :exit_signal=>17, :thread_group_id=>21539} (ProcessExits)
I [2012-08-09 20:05:21]  INFO: sample move 'up' to 'start'
I [2012-08-09 20:05:21]  INFO: sample deregistered 'proc_exit' event for pid 21539
I [2012-08-09 20:05:21]  INFO: sample deregistered 'proc_exit' event for pid 21539
I [2012-08-09 20:05:21]  INFO: sample start: /root/sandbox/god/sample.rb
I [2012-08-09 20:05:21]  INFO: sample moved 'up' to 'start'
I [2012-08-09 20:05:21]  INFO: sample [trigger] process is running (ProcessRunning)
I [2012-08-09 20:05:21]  INFO: sample move 'start' to 'up'
I [2012-08-09 20:05:21]  INFO: sample registered 'proc_exit' event for pid 22979
I [2012-08-09 20:05:21]  INFO: sample registered 'proc_exit' event for pid 22979
I [2012-08-09 20:05:21]  INFO: sample moved 'start' to 'up'
```


プロセスの終了から再開までは一秒未満、pollingではインターバル分のリードタイムがあるので、状況によって使い分けができる。
PHPのFizzBuzz

## コマンドライン版

コマンドラインで以下を実行すればFizzBuzzの結果が得られます

```
php -r 'echo "1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
16
17
fizz
19
buzz
fizz
22
23
fizz
buzz
26
fizz
28
29
fizzbuzz
31
32
fizz
34
buzz
fizz
37
38
fizz
buzz
41
fizz
43
44
fizzbuzz
46
47
fizz
49
buzz
fizz
52
53
fizz
buzz
56
fizz
58
59
fizzbuzz
61
62
fizz
64
buzz
fizz
67
68
fizz
buzz
71
fizz
73
74
fizzbuzz
76
77
fizz
79
buzz
fizz
82
83
fizz
buzz
86
fizz
88
89
fizzbuzz
91
92
fizz
94
buzz
fizz
97
98
fizz";'
```
## スクリプトファイル版
ファイルに貼り付けて実行すれば、FizzBuzzの結果が得られます。

```PHP
1
2
fizz
4
buzz
fizz
7
8
fizz
buzz
11
fizz
13
14
fizzbuzz
16
17
fizz
19
buzz
fizz
22
23
fizz
buzz
26
fizz
28
29
fizzbuzz
31
32
fizz
34
buzz
fizz
37
38
fizz
buzz
41
fizz
43
44
fizzbuzz
46
47
fizz
49
buzz
fizz
52
53
fizz
buzz
56
fizz
58
59
fizzbuzz
61
62
fizz
64
buzz
fizz
67
68
fizz
buzz
71
fizz
73
74
fizzbuzz
76
77
fizz
79
buzz
fizz
82
83
fizz
buzz
86
fizz
88
89
fizzbuzz
91
92
fizz
94
buzz
fizz
97
98
fizz
```
NSUserDefaultsを使うときはWrapして使うと便利

皆さんObjective-Cを楽しんでますか？
巷ではObjective-Cの事を「変態言語」なんて呼ばれたりしているそうですが、Modern Objective-Cなんかも出てきて、すっかり「大衆的」な言語に近づいて来ました。

さてそんな訳で今回はiOS開発でよく使うNSUserDefaultsの話。
NSUserDefaultsはアプリ固有の設定情報を永続化する時などによく使われる便利なクラスです。
普通に使うとこんな感じ。

```objective-c
// 設定情報を保存
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:@"hoge" forKey:@"Name"];
[userDefaults setBool:YES forKey:@"Setting"];
[userDefaults synchronize];

// 設定情報の読み込み
NSString *name = [userDefaults objectForKey:@"Name"];
BOOL setting = [userDefaults boolForKey:@"Setting"];;
```

これでも問題は無いのですが、自分で使っている時に困ることがあります。

1.Keyのタイプミス
2.Key値の忘却
3.保存値の型の忘却

**人は間違える生き物です。**
各画面で文字列リテラルを使ってKeyを書いていればタイプミスだってあります。
ビルドの時にコンパイラが「Key値が間違ってるよ！」っと教えてはくれません。
全て開発者の責任です。

**人は忘れる生き物です。**
開発が進むにつれて設定情報が増えてきます。
設定情報が増えるのと比例してKeyも増え開発は混沌としてきます。

そこでNSUserDefaultsをWrapしてあげます。

```Configuration.h
@interface Configuration : NSObject
+ (NSString *)name;
+ (void)setName:(NSString *)value;
+ (BOOL)setting;
+ (void)setSetting:(BOOL)value;
+ (void)synchronize;
@end
```

```Configuration.m
@implementation Configuration
static NSString *CONFIGURATION_NAME = @"Configuration.Name";
+ (NSString *)name {
  NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
  [userDefaults registerDefaults:@{CONFIGURATION_NAME : @"No Name"}];
  return [userDefaults objectForKey:CONFIGURATION_NAME];
}
+ (void)setName:(NSString *)value {
  NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
  [userDefaults setObject:value forKey:CONFIGURATION_NAME];
}
static NSString *CONFIGURATION_SETTING = @"Configuration.Setting";
+ (BOOL)setting {
  NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
  [userDefaults registerDefaults:@{CONFIGURATION_SETTING : @(YES)}];
  return [userDefaults boolForKey:CONFIGURATION_SETTING];
}
+ (void)setSetting:(BOOL)value {
  NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
  [userDefaults setBool:value forKey:CONFIGURATION_SETTING];
}
+ (void)synchronize {
  [[NSUserDefaults standardUserDefaults] synchronize];
}
@end
```

こんな感じで、Wrapしてあげます。
使う側では下記の様にしてあげます。

```objective-c
// 設定情報を保存
[Configuration setName:@"Hoge"];
[Configuration setSetting:YES];
[Configuration synchronize];

// 設定情報の読み込み
NSString *name = [Configuration name];
BOOL setting = [Configuration setting];
```

呼び出し側のコード量はそれほど変わらないのですが、

1.Xcodeのインテリセンスが効くのでタイプミスを防げる。
2.Xcodeのインテリセンスが効くのでKey値を覚えていなくても選ぶだけ。
3.型は戻り値や引数で決まっているので間違った型を渡す心配はなし。

また設定情報の呼び出しで`[userDefaults registerDefaults:@{CONFIGURATION_NAME : @"No Name"}];`と書いておくことで設定情報の初期値を設定できるので呼び出し側で初期値を意識する必要がありません。

今回の記事を書くにあたって作ったサンプルソースをgithubにあげておきます。
[ConfigurationSample](https://github.com/tochi/ConfigurationSample "ConfigurationSample")

Pl**e**ase e**n**joy the **d**evelopment.
Async.js は自動的に非同期処理や並列処理にしてくれるライブラリじゃないよ

誤解されてそうなので注意書き。
## 検証例
``` {async-test.coffee}
require "async"

bigArray = (() ->
  arr = []
  i = 0
  while(i < 1e+6)
    arr[i] = i + 1
    i = i + 1
  arr
)()

async.parallel
  task1: (callback) ->
    console.log "task1: start" 
    async.map bigArray
      , (v, next) ->
        next null, v * 2
      , (error, result) ->
        console.log "task1: done"
        callback error, result
  task2: (callback) ->
    console.log "task2: start"
    async.map bigArray
      , (v, next) ->
         next null, v * v
      , (error, result) ->
         console.log "task2: done"
         callback error, result
, (error, result) ->
   console.log "=== async test done ==="

console.log "=== async test start ==="
```

### ライブラリが非同期処理や並列処理をやってくれてるならこういう出力のはず

``` {expect-log.txt}
$ coffee async-test.coffee
=== async test start === # すぐに出るはず
task1: start # すぐに出るはず
task2: start # すぐに出るはず
task1: done # やや遅れて出るはず
task2: done # ほぼ task1 の終了と同時にでるはず
=== async test done === # すべて終わってから出るはず
```

### 実際の実行後の出力

``` {log.txt}
$ coffee async-test.coffee
task1: start # あれ、テスト開始の出力より先に出た…
task1: done # けっこう待たされた
task2: start # task1 が終わってから出力された？ parallel って API なのに…
task2: done # やっぱり待たされた
=== async test done === # これはまあよし
=== async test start === # えっ今ごろ
```

##  解説
ソース読めばわかりますが、`async.nextTick` と、内部でそれを利用している

* `async.waterfall`
* `async.queue`

以外の API は process も Timer オブジェクトも使用していません。
なので、普通に

* `setTimeout`
* `process.nextTick`
* node.js の非同期API
* XHR はじめとした Ajax API

これらを使わない限り、一つ一つの処理を順番に処理しますし、`async.*` の呼び出した処理が終わるまで次の処理に進みません。

## 「えっじゃあなんで Async だとか言ってるの」
Async.js は別に渡した関数を非同期、並列処理化するものではなく、単純に継続渡し形式(CPS) でリストイテレータや処理のワークフローの為のユーティリティを提供しているだけです。
node.js の非同期API群（あれも実際はノンブロッキングでも非同期なんかでもない）を利用する際に「CPS なユーティリティ API を使えたらラクができるよね、非同期プログラミングのスタイルでやれるよね」といったモノであると考えた方がよく、
ユーザー側が `setTimeout` や `process.nextTick` 等々で処理をラップしたら、そこで「非同期処理や並列処理っぽい」振る舞いをしてくれるライブラリです。

また、並列処理のように見えるだけで "並列処理" ではありません。

名前に偽りありだと思うけどね…
URLのリストからコンテンツをGETしてローカルに保存する

URLの一覧からそれぞれのコンテンツを取ってくるだけの簡単なお仕事系スクリプトです。

ホスト毎にディレクトリを作成してディレクトリ構成も保ったまま保存してくれるのがちょっと便利です。mkpath()を使うだけなので、簡単なのですが。

あと、なんとなく、ランダムな秒数でsleep()をかましてます。無くてもいいかもしれません。通常のsleep()ですと秒単位になるので、 use Time::HiRes 'sleep' で小数点以下の秒数に対応しています。

あまり有用ではないというか何処にでもあるスクリプトだと思いますが、書いたので上げておきます。

```get_content.pl
#!/usr/bin/perl

use strict;
use warnings;

use File::Path;
use Time::HiRes 'sleep';
use LWP::UserAgent;

my $startcount = 1;
$startcount = $ARGV[0] if($ARGV[0]);

my $filename = 'urls.txt';

open(FILE, $filename);
my @paths = <FILE>;
close(FILE);

my $count = 0;
my $sleeptime = 1;


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

$ua->agent('Mozilla/5.0');
$ua->timeout(10);


foreach (@paths){
  $count++;
  
  next if($count < $startcount);
  
  $sleeptime = rand(3);
  sleep( $sleeptime );
  
  chomp;
  my $url = $_;
  /http:\/\/(.+)\/(.+?)$/;
  
  my $path = $1; 
  my $file = $2;
  
  unlink "$path/$file" if(-f "$path/$file");
  
  mkpath($path) if(!-d $path);
  
  my $req = HTTP::Request->new(GET => trim($url));
    
  my $res = $ua->request($req);
  
  if($res->is_success){
    open(FILE, ">$path/$file");
    print FILE $res->content;
    close(FILE);
    print "$count:success\t", $url, "\t", $res->status_line, "\n";
  } else {
    print "$count:error\t", $url, "\t", $res->status_line, "\n";
  }
  
}

sub trim {
	my $val = shift;
	$val =~ s/^\s*(.*?)\s*$/$1/;
	return $val;
}

```
MySQLデフォルトUTF-8で例外的にEUC-JPのXOOPSを動かす


環境はちょっとレガシーなかんじです

* MySQL 4.1.22
* PHP 4.4.7


`my.cnf`の設定はutf8に統一する

```txt:/etc/my.cnf
[mysqld]
default-character-set=utf8
character-set-server = utf8 
collation-server = utf8_general_ci 
skip-character-set-client-handshake

[mysqldump]
default-character-set = utf8 

[mysql]
default-character-set = utf8 
```

設定して mysqld 再起動する。

確認する。`character_set_server` が latin1 だが、データベースを作るときに文字コードを指定すれば問題ないので、とりあえず進む。

```
mysql> show variables like 'char%';
+--------------------------+----------------------------------------+
| Variable_name            | Value                                  |
+--------------------------+----------------------------------------+
| character_set_client     | utf8                                   |
| character_set_connection | utf8                                   |
| character_set_database   | latin1                                 |
| character_set_results    | utf8                                   |
| character_set_server     | latin1                                 |
| character_set_system     | utf8                                   |
| character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ |
+--------------------------+----------------------------------------+
7 rows in set (0.00 sec)
```

EUC-JPで動かすXOOPSはujis文字コードでデータベースを作る

```
CREATE DATABASE xoops DEFAULT CHARACTER SET ujis;
```

```
mysql> show variables like 'char%';
+--------------------------+----------------------------------------+
| Variable_name            | Value                                  |
+--------------------------+----------------------------------------+
| character_set_client     | utf8                                   |
| character_set_connection | utf8                                   |
| character_set_database   | ujis                                   |
| character_set_results    | utf8                                   |
| character_set_server     | latin1                                 |
| character_set_system     | utf8                                   |
| character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ |
+--------------------------+----------------------------------------+
7 rows in set (0.00 sec)
```

以上でEUC-JPのXOOPS環境できあがり。
git rebase -i "HEAD~N"を打ちやすくする

今のブランチの頭から、N個のコミットを圧縮したり改変したり、ということを多様するので、
zshで簡単に打てるように関数化した。

```sh
function grbi() {
  if [ "$1" -gt 0 ]; then
    git rebase -i "HEAD~${1}"
  else
    echo "Using: grbi n\n  (n is number greater then 0)"
  fi
}
```

`grbi 3`で現在のブランチの最新コミットから3つ過去までのコミットを改変する。
RVM経由でJRubyのデフォルト処理系バージョンを指定する方法


RVMでインストールするJRubyが1.8互換モードだったので、標準で1.9が使いたい。

ので、インストール時にパラメータを指定してあげる。

```
$ rvm install jruby --1.9
```

で、こんな感じ。

```
$ jruby -v
jruby 1.6.7.2 (ruby-1.9.2-p312) (2012-08-06 26e08ba) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_33) [darwin-x86_64-java]
```

1.8系が使いたい時は JRUBY_OPT で指定できる。

```
$ export JRUBY_OPTS=--1.8
$ jruby -v
$ jruby 1.6.7.2 (ruby-1.8.7-p357) (2012-08-06 26e08ba) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_33) [darwin-x86_64-java]
```
redis.confの設定をしてみる


当方環境

* MacOSX 10.8

```
$ redis-server --version
Redis server version 2.4.11 (00000000:0)
```
----


まずサービスとして起動したいのでデーモン化をyesにする

```
daemonize yes
```

デーモン化するのでプロセスIDを記録するファイルを指定する（デフォルトのままにした）

```
pidfile /usr/local/var/run/redis.pid
```

ポートもデフォルト

```
port 6379
```

インターフェイスもローカルでしか使わないのでデフォルト

```
bind 127.0.0.1
```

タイムアウトは30秒くらいにセット

```
timeout 30
```

ログレベルはデフォルト

```
loglevel verbose
```

ログファイル

```
logfile /usr/local/var/log/redis.log
```

スナップショット間隔は特に基準がないけれど、10分間に1度でもキー変更があったら保存するようにしてみる

```
save 600 1
# save 900 1
# save 300 10
# save 60 10000
```

CPUを節約する必要もないけど、容量もそんなでないからどちらでもいいんだけどとりあえず、DBファイルは圧縮有効

```
rdbcompression yes
```

ファイル名もデフォルト

```
dbfilename dump.rdb
```

ワーキングディレクトリ

```
dir /usr/local/var/db/redis/
```

開発環境なのでレプリケーションとセキュリティは飛ばす。

基本的に消えると困るデータなので `maxmemory` はセットしない。

-----

Macでデーモン化するには更に、plistを作らないといけない

```
$ cp /usr/local/Cellar/redis/2.4.8/homebrew.mxcl.redis.plist ~/Library/LaunchAgents/
$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
$ launchctl start homebrew.mxcl.redis
$ ps aux | grep redis
jacknagel 85683   1.3  0.0   608696    856   ??  S     3:09PM   0:00.01 /usr/local/bin/redis-server /usr/local/etc/redis.conf
jacknagel 85685   0.0  0.0   614936      0 s000  R+    3:09PM   0:00.00 grep redis
$ launchctl stop homebrew.mxcl.redis
$ ps aux | grep redis
jacknagel 85735   0.0  0.0   590604      4 s000  S+    3:09PM   0:00.00 grep redis
```
phpredisをMacにインストールする


当方の環境:

```
$ php --version
PHP 5.4.4 (cli) (built: Jul 11 2012 13:58:42) 
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
    with Xdebug v2.2.0, Copyright (c) 2002-2012, by Derick Rethans
```

## phpredisをインストールしてみる

ソースをチェックアウト:

```
$ git clone git://github.com/nicolasff/phpredis.git
$ cd phpredis
```

インストール:

```
$ phpize
$ ./configure
$ make && make install
```

インストールできたら、 `extension=redis.so` を `php.ini` に追記する。

確認:

```
$ php -m | grep redis
redis
```


## 試してみる

redisサーバを起動する:

```
$ redis-server 
```

別プロンプトを開いてphpredisを試す:

```
$ php -a
Interactive shell

php > $redis = new Redis();
php > $redis->connect('127.0.0.1');
php > $redis->set('foo', 'bar');
php > var_dump($redis->get('foo'));
string(3) "bar"
php > quit
```
正規表現にマッチした部分を自動ハイライトする: highlight-regexp

highlight-regexpを使えば、ソースを読んでいるときなど特定のキーワードに注目したいときに色をつけることができます。

標準の機能なので特にインストールは不要です。下記で実行します。

```
M-x highlight-regexp
```

キーワードの入力が求められるので、色をつけたいキーワードを正規表現で入力します。次に背景色を指定することができます。`hl-色`もしくは`hl-色-b`という形式で指定します。
ローカルIPアドレスをtmuxのステータスラインに表示する

xip.ioを使うときにいちいち`ifconfig`打つのが面倒くさくなってきたので表示してみました。

![tmux_statusline](http://gyazo.com/0508093e26dcd9bc69ed2721f179b0ce.png?1344392749)

```sh:localip
#!/bin/sh

ifconfig en0 inet | sed -e '1d' -e 's/^.*inet //' -e 's/ netmask.*$//'
```

```sh:.tmux.conf
set-option -g status-right '[#(loadavg)][#(localip)][%Y/%m/%d %H:%M]'
set-option -g status-right-length 60
```
Media Templeで環境変数を使う


先日書いた「[SAKURAの共有サーバで環境変数を使う](http://qiita.com/items/e74cfee1af8ef16278a5)」のMedia Temple (mt) 版です。といっても、Media Templeの場合は.htaccess内で設定できるのであまり面倒はありません。下記のように、書けば良いだけ。(変数名は任意です)

```.htaccess
SetEnv HTTP_DB_NAME "db000000_your_db_name"
SetEnv HTTP_DB_USER "db000000_yourname"
SetEnv HTTP_DB_PASS "*********"
```

ただし、変数名を`HTTP_`で始めていることに注目して下さい。セキュリティ上の理由から、`HTTP_`のつかない変数は受け付けないとのこと。

##置き場所には注意

ただ、htmlディレクトリ内に含めてしまうと、Gitリポジトリに入ってしまうため、ひとつ上位のディレクトリに入れます。

* /home/000000/domains/
	* yourdomain.com/
		* html
			* .htaccess : *ここはGitのリポジトリ内*
		* cgi
		* .htaccess : *ここならOK*

##変数の呼出し方

通常通りこんな感じで。(PHPの場合)

```php
<?php
$dbname = $_ENV['HTTP_DB_NAME'];//db000000_your_db_name
$dbuser = $_ENV['HTTP_DB_USER'];//db000000_yourname
$dbpass = $_ENV['HTTP_DB_PASS'];//*********
```

なお、データベースサーバのURIはMedia Temple側で環境変数として用意してくれています。`DATABASE_SERVER`を使いましょう。

```php
<?php
$dbhost = $_ENV['DATABASE_SERVER'];//internal-db.s000000.gridserver.com
```
before_filterに引数を渡す

基本的にfilterで呼び出すメソッドに引数は渡せません。
しかし、ちょっと工夫することでそれに相当するものを作ることはできます。

```ruby
class FooController < ApplicationController
  before_filter(:only => [ :show ]), lambda {|controller|
    controller.foo_filter(true, false)
  }

  def foo_filter(a, b)
    head :not_found unless a && b
  end
  private :foo_filter
end
```

ちょっと見栄えは良くないですね。
NSBlockOperationで手軽にキャンセル処理


GCD便利ですね。手軽にネストした非同期処理を書けるので、使いまくっています。しかし一直線にコードを書いていると見過ごしがちなのが、キャンセル処理です。時間のかかる処理を途中で止める場合や、別のUIViewControllerに遷移するから処理そのものが必要なくなった場合に、処理を止めたい場合があります。具体的には以下の様なケースがあると思います。

* 大きなファイルのアップロード中にキャンセルボタンを出したい
* 画面遷移をしたら、前の画面で進行中の画像ダウンロードはキャンセルしたい

このような場合にGCDライクに使えて、しかもキャンセル処理ができのが組み込みクラスのNSBlockOperationです。早速使い方を見て行きましょう。weakのおかげでややこしいメモリ管理を考えなくて楽です。

```objc:
-(void)heavyTask {
    if (!_queue)
        _queue = [[NSOperationQueue alloc] init];
    
    NSBlockOperation *operation = [[NSBlockOperation alloc] init];
    __weak NSBlockOperation *weakOperation = operation; // 循環参照を避ける
    [operation addExecutionBlock:^{
        for (int i = 0; i < 10; i++) {
            if (weakOperation.isCancelled) return;  // これを至る所に挟む
            [NSThread sleepForTimeInterval:1]; // 何か重い処理
        }
        NSLog(@"complete");
    }];
    
    [_queue addOperation:operation];
}

-(void)cancel {
    [_queue cancelAllOperations];
}
```

ではネストした処理のキャンセルを考えましょう。全く同じように直感的に書けます。NSOprationQueueがキャンセルの面倒を見てくれるので楽ですね。

```objc:

-(void)heavyTask {
    if (!_queue)
        _queue = [[NSOperationQueue alloc] init];
    
    __weak NSOperationQueue *weakQueue = _queue;
    
    NSBlockOperation *firstOperation = [[NSBlockOperation alloc] init];
    __weak NSBlockOperation *weakFirstOperation = firstOperation; // 循環参照を避ける
    
    [firstOperation addExecutionBlock:^{
        for (int i = 0; i < 10; i++) {
            if (weakFirstOperation.isCancelled) return;  // これを至る所に挟む
            [NSThread sleepForTimeInterval:1]; // 何か重い処理
        }
        NSLog(@"next");
        NSBlockOperation *secondOperation = [[NSBlockOperation alloc] init];
        __weak NSBlockOperation *weakSecondOperation = secondOperation; // 循環参照を避ける
        [secondOperation addExecutionBlock:^{
            for (int i = 0; i < 10; i++) {
                if (weakSecondOperation.isCancelled) return;
                [NSThread sleepForTimeInterval:1]; // 何か重い処理
            }
            NSLog(@"complete");
        }];
        [weakQueue addOperation:secondOperation];
    }];
            
    [_queue addOperation:firstOperation];
}

-(void)cancel {
    [_queue cancelAllOperations];
}
```
ここまでやるとだいぶコードが見づらいですね…。しかしDelegate等で書くと、（設計的には綺麗ですが）後から追いづらくなるので、こっちの方がましではないかと思ってます。

以上NSBlockOperationでキャンセル処理を行う方法の紹介でした。NSOperationQueueは裏側でGCDを使っているので、GCD+キャンセル機能が欲しいという用途には最適だと思います。
RedisのsrandmemberがどのくらいRandomか調べた

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

Redisのsetというデータタイプは、メンバーからランダムに値を抽出可能ということだ。

適当に4つのメンバを入れます。

```
$ redis-cli sadd daizi:sore makenai
$ redis-cli sadd daizi:sore nagedasanai
$ redis-cli sadd daizi:sore nigedasanai
$ redis-cli sadd daizi:sore sinzinuku

$ redis-cli smembers daizi:sore
1) "sinzinuku"
2) "nigedasanai"
3) "nagedasanai"
4) "makenai"

```

`srandmember x 10,000回の試行`で結果を表示する。


```
$ redis-server -v
Redis server version 2.4.15 (00000000:0)
$ for x in {1..10000}; do redis-cli srandmember daizi:sore; done | sort | uniq -c
4975 makenai
1697 nagedasanai
1681 nigedasanai
1647 sinzinuku
```

結構偏ってんな！？ どゆこと。。

----
追記：特定のケースで偏る模様？
GitHub か BitBucket に画像を保存して Qiita に貼る

適当なリポジトリを作って画像を入れ push するだけ。 GitHub なら `https://raw.github.com/USER/REPO/master/PATH/TO/IMAGE.jpg` 、 BitBucket なら `https://bitbucket.org/USER/REPO/raw/master/PATH/TO/IMAGE.jpg` が画像の URL。

Qiita に貼るには `![Alt text](URL)` 記法。画像から画像ファイルにリンクを張るなら `[ ![Alt title](URL) ](URL)` とする。ややこしい。

## 追記
拙作 [Gyazit](http://d.hatena.ne.jp/uasi/20120825/1345892743) を使うとスクリーンショットを撮った後の commit & push から URL のコピーまで自動化できる。任意の画像を Gyazit のアイコンにドラッグ＆ドロップしてもよい。
Xcode 4.4へのアップグレード

※ コメントの方でおねがいします。これはよろしくないです。

homebrewを使ってると、Xcode 4.2は期限切れなのでバージョンアップしてと言われる。
ただ、インストールしただけだとメッセージは消えてくれない。

仕方ないので、無理やり新しいものを見るように変更。

```
ln -sF /Applications/Xcode.app/Contents/Developer/usr/bin/* /usr/bin/
```

みたいな感じで。

複数バージョンのXcodeを使う場合はやっちゃダメ。
Xcode のスキームでビルド設定を切り替える

アプリのビルド設定をいくつか用意して簡単に切り替えたい、という状況がときどきあります。たとえば、開発用サーバに接続するデバッグアプリと本番サーバに接続するデバッグアプリを使い分けたい場合です。

そんなときは Xcode のスキームを使うと便利です。今回は Sample.app を作成し、普通のデバッグビルドに加えて、コンパイル時に `MY_DEBUG` マクロが定義されるデバッグビルドを実行できるようにしてみます。

## 1. プロジェクトのコンフィグを作る

コンフィグは、ビルドに関する様々な設定（ターゲット OS や使用するコンパイラ、リンカオプションなど）をまとめたものです。既存のデバッグ用コンフィグを複製して新しいコンフィグを用意してみましょう。

Project Navigator （Xcode の左ペインのファイルツリー）からプロジェクトを選択します。 Info タブを開くとプロジェクトの情報が表示されます。 Configurations の "Debug" を複製して名前を "Debug (MY_DEBUG)" とします。

[![Xcode](https://bitbucket.org/uasi/img/raw/master/xcode-scheme/xcode-1.png)](https://bitbucket.org/uasi/img/raw/master/xcode-scheme/xcode-1.png)

## 2. ビルド設定にマクロの定義を追加する

Build Settings タブを開き、 Preprocessor Macros の設定を探します。先ほど作った "Debug (MY_DEBUG)" に `MY_DEBUG` マクロを追加します。

[![Xcode](https://bitbucket.org/uasi/img/raw/master/xcode-scheme/xcode-2.png)](https://bitbucket.org/uasi/img/raw/master/xcode-scheme/xcode-2.png)

## 3. 新しいスキームを作りビルド設定を変える

新しいスキームを作り、デバッグビルドに "Debug (MY_DEBUG)" コンフィグを使うように設定してみましょう。

ツールバーの Scheme ボタンをクリックして New Scheme... を選びます。名前を "Sample (MY_DEBUG)" とします（補足：スキーム名にカンマなどを含めるとビルドに失敗することがあります。カッコ以外の記号は使わないほうが無難です）。

Scheme ボタンから Edit Scheme… を選び、 "Sample (MY_DEBUG)" を編集します。左のリストから Run Sample.app を選び、 Info タブの Build Configuration を "Debug (MY_DEBUG)" に変更します。

[![Xcode](https://bitbucket.org/uasi/img/raw/master/xcode-scheme/xcode-3.png)](https://bitbucket.org/uasi/img/raw/master/xcode-scheme/xcode-3.png)

## 4. スキームを共有する

Scheme ボタンから Manage Schemes… を選び、共有したいスキームの Shared チェックボックスをオンにします。チェックボックスがオンのスキームはファイルに書き出され、他の開発者と共有できるようになります。ファイルは `Sample.xcodeproj/xcshareddata/xcschemes/${スキーム名}.xcscheme` にあるので、バージョン管理システムに追加しておきましょう。

[![Xcode](https://bitbucket.org/uasi/img/raw/master/xcode-scheme/xcode-4.png)](https://bitbucket.org/uasi/img/raw/master/xcode-scheme/xcode-4.png)

## 5. できあがり

Scheme ボタンから "Sample" か "Sample (MY_DEBUG)" を選ぶと `MY_DEBUG` マクロの有無が切り替わります。

コンフィグを変えるだけでなく、デバッガを使い分けたりビルドの前処理スクリプトを走らせたりと、色々なスキームを作ってみると便利かもしれません。
動的なscript要素

script要素をJSから動的生成する方法。
HTMLページのどの箇所に記述しても、scriptファイルが読み込まれている間、他のページの処理をブロックしない。

```javascript:javascript
var script = document.createElement("script");
script.type = "text/javascript";
script.src = "file1.js"; document.getElementsByTagName("head")[0].appendChild(script);
```

- 動的読み込みの場合、body要素ではなくhead要素に追加するほうが良い。※body要素が正しく読み込まれない場合IEでエラーが発生する。
- 動的に読み込まれたscriptは、取得後即座に実行されるので、ページ内の他のスクリプトで読み込まれたscriptのデータを使用する場合は、読み込みが完了したかをチェックする必要がある。
tm が ™ になったり ... が … になったりするのを防ぐ


Kobito やテキストエディットなどで tm (t と m) と入力すると、™ (U+2122 TRADE MARK SIGN) になったり、... (ピリオド 3 個) と入力すると … (U+2026 HORIZONTAL ELLIPSIS) になったりする。

command+z で元に戻せはするものの、かなりうっとうしい。

[システム環境設定]-[言語とテキスト]-[テキスト] で [記号とテキストの置換を使用] のチェックをはずせば無効にできる。
セルの値をマクロで Timevalue と変換した時にエラーが出る


シリアル値になってるので、文字列に変換してやる必要がある

```VB
time = TimeValue(Format(Cell(1,1).Value, "h:mm:ss"))
```

via; [vba セルに入力した時間をマクロで受け取るには？ - オフィス系ソフト 解決済み| 【OKWAVE】](https://okwave.jp/qa/q2150197.html)
「rails g devise admin_user」実行時に「Could not find "fixtures.3.rb" in any of your source paths.」エラー


・Gemfileのrails3-generatorsをGithubからインストールするよう指定

```
#gem "rails3-generators"
gem "rails3-generators", :git => "https://github.com/neocoin/rails3-generators.git", :group => :development
```
現在桁をハイライトする: col-highlight.el

Emacsではインデントが分かりづらいことがあるので、現在桁をハイライトしてくれるcol-highlight.elをいれました。

```
M-x auto-install-batch column-marker
```

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

```common-lisp:~/.emacs.d/init.el
;;; col-highlight.el
(require 'col-highlight)
```

必要な時に`M-x column-highlight-mode`をします。

常にハイライトしたい場合は下記を設定ファイルに追加するとできます。

```common-lisp:~/.emacs.d/init.el
(column-highlight-mode 1)
````

また、下記の様にすると5秒間何もしないでいるとハイライトするようにすることもできます。

```common-lisp:~/.emacs.d/init.el
(toggle-highlight-column-when-idle 1)
(col-highlight-set-interval 6)
```

よくHTMLを編集していて<div>の閉じ忘れで体裁が崩れたり苦労することがよくあるのですがそのような時に重宝しそうです。
複数ファイルの置換: grep-edit.el

複数ファイルの置換ができるようにgrep-edit.elをいれます。

```
M-x install-elisp-from-emacswiki grep-edit.el
```

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

```common-lisp:~.emacs.d/init.el
;;; grep-edit.el
(require 'grep-edit)
```

`M-x grep`でテキストを検索します。検索結果の`*grep*`バッファを編集します。`C-c C-e`をすると、編集を該当ファイルに反映します。この状態ではまだ変更が保存されていないので、`C-x s`をすると変更されたファイルが保存されます。
URLエンコード/デコード

rubyメモ

```ruby
require 'uri'

url = 'http://hogehoge.com/hogahoga.cgi?test=日本語テスト'
url_escape = URI.escape(url)

puts url_escape
  #=> http://hogehoge.com/hogahoga.cgi?test=%e6%97%a5%e6%9c%ac%e8%aa%9e%e3%83%86%e3%82%b9%e3%83%88


puts URI.unescape(url_escape)
  #=>http://hogehoge.com/hogahoga.cgi?test=日本語テスト

```
objective-cで文字コードを自動判別する

```objective-c:NSData+detectEncode.h

#import <Foundation/Foundation.h>

@interface NSData (DetectEncoding)
+(NSStringEncoding) detectEncoding:(NSData *)data;
@end

```

```objective-c:NSData+detectEncode.m
#import "NSData+DetectEncoding.h"

@implementation NSData (DetectEncoding)

+(NSStringEncoding) detectEncoding:(NSData *)data
{
    NSStringEncoding encoding;
    NSStringEncoding encodings[] = {
        NSUTF8StringEncoding,
        NSNonLossyASCIIStringEncoding,
        NSShiftJISStringEncoding,
        NSJapaneseEUCStringEncoding,
        NSMacOSRomanStringEncoding,
        NSWindowsCP1251StringEncoding,
        NSWindowsCP1252StringEncoding,
        NSWindowsCP1253StringEncoding,
        NSWindowsCP1254StringEncoding,
        NSWindowsCP1250StringEncoding,
        NSISOLatin1StringEncoding,
        NSUnicodeStringEncoding,
        0
    };
    
    int i = 0;
    NSString *try_str;
    
    if (memchr([data bytes], 0x1b, [data length]) != NULL) {
        try_str = [[NSString alloc] initWithData:data encoding:NSISO2022JPStringEncoding];
        if (try_str != nil)
            return NSISO2022JPStringEncoding;
    }
    
    while(encodings[i] != 0){
        try_str = [[NSString alloc] initWithData:data encoding:encodings[i]];
        if (try_str != nil) {
            encoding = encodings[i];
            break;
        }
        i++;
    }
    return encoding;
}

@end
```
Redis 2.6.0-rc5をインストール

## 環境
Mac OSX 10.8
homebrew 0.9.2

## 目的
- 2.6から追加された`bitcount`や`bitop`を試したい
- [releasenote](https://github.com/antirez/redis/blob/unstable/00-RELEASENOTES)によると，`UPGRADE URGENCY: We suggest new users to start with 2.6.0, and old users to upgrade after some testing of the application with the new Redis version.`とのことなので2.4ユーザーはupgrade準備しておいたほうがよさそう
- luaコードが実行できる([ドキュメント](http://redis.io/commands/eval))
 - どういうケースで使うんだこれ…

## インストール
```bash
$ brew install redis --devel
$ redis-cli --version
redis-cli 2.5.12 # 2.5.12 == 2.6rc5らしい
$ redis-server /usr/local/etc/redis.conf
```

## 設定変更
2.4 -> 2.6 upgradeにあたって何点か設定ファイルを変更．
### vm機能が削除
実行時に以下のようなエラーが出る

```text:エラーログ
*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 375
>>> 'vm-enabled no'
Bad directive or wrong number of arguments
```

`/usr/local/etc/redis.conf/`該当行の少し上に`WARNING! Virtual Memory is deprecated in Redis 2.4`と書いてあるので素直に消す

### hash-max-zipmap-XXX -> hash-max-ziplist-XXX
[releasenote](https://github.com/antirez/redis/blob/unstable/00-RELEASENOTES#L25)にある通りconfigのキーが変わっているので対応する
プログラミング情報の探し方と要望？


ふつふつ書きます。

プログラミングの情報を見つけようとしたときにまずすることといえば

- とりあえず検索する
- ブログとかの記事を見つけてそこに書かれている通りに試してみる

→結果、なぜか動かない

みたいなことが多々。

原因として、情報自体が間違っているということもあるけど、その場合、Qiitaは別ユーザーから指摘をもらえる仕組みになっているからいいなぁと思ってます。

ほかの原因として、バージョンが違うor情報が古い
というのがあげられると思います。

勉強したての頃はとにかく何が新しくて何が古いのかわからないということが多かったり、教科書通りにやってもバージョンが少し違う故にエラーが出て、初めてのプログラミングでエラーの解決方法もわからず、挫折。
という経験したことある人もいるんじゃないかなぁ？なんて。

私がまさにそれですorz

プログラミング言語やフレームワークの使い方等を勉強する上でバージョンの確認は必須だと思いますが、せっかくTipsが集まっているサイトということで、現行バージョンなのか、古いバージョンなのか？が確認できる仕組みがあればなぁ、なんて思います。

ブログ記事を１年以内等で探してみても、記事は新しくても内容が古いなんてこともあったりするし・・・。
丁寧にこのバージョンで確認済み！なんて書いてくれているサイトはいいんですが。


タグにバージョン番号入れるなんて嫌だしなぁ。
かといって具体的な解決方法が思い浮かばないですΣ

みなさんは目的の情報が古いか新しいかをどのように判断していますか？

------------------------
<<追記>>
必ずしも最新バージョンで開発しているわけではない、は確かにその通りですね。
また、バージョンが合っていても、開発環境によって、動く・動かないなども影響してきますね。

とにかく試してみるのが一番ですが、情報を探すにあたって、試してみないとバージョンが違うことに気づかない、試してみてバージョンが違うのでまた別の方法を探しにいく、という手間が少しでも減らせるしくみが欲しいですね。

投稿時に自分の環境を必ず詳細に書かないといけないといった形は避けたいですが、コメントなどで、確認したバージョン情報や開発環境を手軽にぽちっとできるような仕組みといいますか。

でも結局はTryしてみるしかないんでしょうか＞＜？
シンプルなデリゲートの実装


C#ライクなデリゲートの実装

```php
<?php

class Delegate
{
	/** @var callable[] */
	protected $callbacks = [];

	/**
	 * Add callback function
	 * @param callable $callback
	 * @return $this
	 */
	public function add(callable $callback)
	{
		$this->callbacks[] = $callback;
		return $this;
	}

	/**
	 * Remove callback function
	 * @param callable $callback
	 * @return $this
	 */
	public function remove(callable $callback)
	{
		foreach ( $this->callbacks as $key => $_callback )
		{
			if ( $callback == $_callback )
			{
				unset($this->callbacks[$key]);
				return $this;
			}
		}
		return $this;
	}

	/**
	 * Invoke callback functions
	 * @return mixed
	 */
	public function __invoke()
	{
		$result = null;

		foreach ( $this->callbacks as $callback )
		{
			$result = call_user_func_array($callback, func_get_args());
		}

		return $result;
	}
}

$callback = function($name) {
	echo "Hello $name", PHP_EOL;
};

$delegate = new Delegate();
$delegate
	->add($callback)
	->add($callback)
	->remove($callback);

$delegate("World");
```
Prototype.js の reduce メソッドを使ってはいけない


##対象
1.6.0.3 以前のバージョンの Prototype.js を対象とする。
1.6.1 以降では取り除かれている。

##理由
+ 標準の Array.prototype.reduce と互換性が無いため
+ そもそもメソッドの仕様が邪悪なため

##reduce について
Array.prototype.reduce は ECMAScript 5 あるいは JavaScript 1.8 から利用可能なメソッドで、配列（など）を簡約するためのもの。2012 年の現在では各種モダンブラウザや node.js などでも利用することができる。

```

[1, 2, 3].reduce(function(a, b){ return a + b });// 6

```

## 古い Prototype.js の reduce

ソースコードを抜粋する。

```

reduce: function() {
  return this.length > 1 ? this : this[0];
},
```

見てのとおり要素の個数によって戻り値の型が変わる。

```

[1, 2, 3].reduce();// [1, 2, 3]
[1].reduce();// 1

```

つまり Array[A] なのか A なのかが定まらない。
この二つの型を同一視したい場合としては、たとえば Array[Array[Array[...]]] のように「要素の個数が 1 で且つ多重にネストされた」配列などが考えられるが、通常まずそんな状況はない。

##まとめ

1) Prototype.js 利用環境で

- reduce を「配列から最初の要素を取得する」ために呼ぶのは誤り。
 - 要素が二個以上に増えた場合に動作が壊れる。
 - その場合は first という素直な名前のメソッドで事は足りる。

2) グローバル汚染のひどいライブラリを選ぶのは極力避けるべき。

- 特に組み込みオブジェクトを拡張するようなものには細心の注意を。
GoogleChartで世界地図を色分け表示してみた


![海外渡航情報 危険度マップ](http://f.cl.ly/items/3O3P1M0I343w0n2V2d0T/スクリーンショット 0024-08-06 23.59.54.png)

Google Chart Toolsの[GeoChart](https://developers.google.com/chart/interactive/docs/gallery/geochart)でJavaScriptでサクッと世界地図グラフを描画できます。

まずは地図を描画するエリアをHTMLで定義します。

```HTML:body
<div id="visualization" style="width:1000px; height:700px"></div>
```

headに以下を追加します。

```HTML:head
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
```

onloadあたりに初期化コードを書きます。

```Javascript:
google.load('visualization', '1', {packages: ['geochart']});
google.setOnLoadCallback(draw);
```

国ごとの色分けの元データを定義。これもonloadあたりで。

```JavaScript:
var records = [
    {name: 'JP', score: 100},
    ...
];
```

そしてグラフ描画関数を定義。

```Javascript:draw
function draw() {
    // テーブルの定義
    var dataTable = new google.visualization.DataTable();
    dataTable.addColumn('string', '国');
    dataTable.addColumn('number', 'なにかの値');
    // データをテーブルに追加
    for (var i = 0; i < records.length; i++) {
        var rec = records[i];
        dataTable.addRow([rec.name, rec.score]);
    }
    // チャートの定義
    var map = new google.visualization.GeoChart(document.getElementById('visualization'));
    // チャートにテーブルのデータを描画！
    map.draw(dataTable, {
      width: 1200,
      height: 700,
      colorAxis: {colors: ['white', 'blue']}
    });
}
```

とっても簡単！

GeoChartを使って作ってみました。
[海外渡航情報 危険度マップ](http://yuch.github.com/danger/)
ObjectALを使う

# ObjectALについて
iOSには音を鳴らすAPIが色々あるけど、
 - AVFondation : 再生開始時に遅延が発生、大量再生すると重い。
 - AudioToolbox : 30秒以下の音しか鳴らせない。
 - OpenAL : デコード機能がなくてだるい。
など、一長一短あって使いづらい。

ObjectALは、そのへんの違いをうまく覆い隠してくれるサウンドライブラリである。

# 使い方

1. [公式サイト](http://kstenerud.github.com/ObjectAL-for-iPhone/) からソースコードをダウンロード
2. 中身のObjectAL/ObjectALディレクトリを自分のプロジェクトに放り込む。このとき、「Copy items into destination group's folder」、「Create groups for any added folders」にチェックをいれる（Xcode 4.3）
3. プロジェクトで使用するフレームワークにAVFoundation、OpenAL、AudioToolboxを追加。
4. 適当なViewControllerを作って、以下のようなコードを記述する。

```objc
#import "ViewController.h"
#import "ObjectAL.h"

@implementation ViewController
- (void)viewDidLoad
{
	[[OALSimpleAudio sharedInstance] playEffect:@"sound.mp3"];
}
@end
```
おとが！なりました！

# その他の機能
OALSimpleAudioは使うのが一番簡単なクラス。playEffectでSEが、playBgでBGMが鳴らせる。preloadEffect/preloadBgで音声をあらかじめ読み込んでおくこともできる。

より細かく挙動を制御したければ、OpenALをラップしてデコード機能を付けたOpenALManagerクラスと、ストリーミング再生に特化したOALAudioTrackクラスにアクセスすればいい。
botoでのリージョン指定


コネクション張る時のリージョン指定の方法が良くわからなかったのでメモ。
というか、調べて出てきたのが上手く動かなかったので。。。

+ AWS APIへ[boto](https://github.com/boto/boto)からアクセスするよ。
+ boto のインストール方法は Google さんへ。

```python:connection.py
#!/usr/bin/python 
# coding: utf8

from boto.ec2 import EC2Connection

# defaults region
EC2Connection.DefaultRegionName		= 'ap-northeast-1'
EC2Connection.DefaultRegionEndpoint	= 'ec2.ap-northeast-1.amazonaws.com'

conn = EC2Connection(
	aws_access_key_id		= 'XXXXXXXXXXXX',
	aws_secret_access_key	= 'YYYYYYYYYYY')

print conn.get_all_instances()
```

リージョンとエンドポイントは[こちら](http://docs.amazonwebservices.com/general/latest/gr/rande.html)

これだけでのようで御座います。
8/6 Sendagaya.rb


# fukajun さんの party tools の shuffleをどうするか考えた

* https://github.com/fukajun/party_tools/blob/master/config/routes.rb

```routes.rb
  resources :events do
    resources :attendances do
      collection do
        post :shuffled, :action => :shuffle
        get  :shuffled
      end
    end
  end
  resources :users
```

`events <--(n:n)--> users`

↓

`events <--(1:n)--> attendances <--(n:1)--> users`

```schema.rb
  create_table "attendances", :force => true do |t|
    t.string   "comment"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
    t.integer  "user_id"
    t.integer  "event_id"
    t.integer  "position"
  end
```

ここまでが既存の設計。

*ポイント：結局、RDBの設計をちゃんとすれば答えは見えてくる！*

## shuffleの入れ方 その1

attendancesのpositionを生成するという考え方。(Filtered Subresource パターン)
`/events/1/attendances/position`とか?
部分集合として、レコードを抽出するというよりも、縦にカラムを抽出するようなイメージ。

ただし、positionを自分で決定してGET, PUTするならこれでよいが、shuffleの場合システム側で決定してほしい。
アルゴリズムリソース（何らかの計算結果のリソース）に近いが、ランダム要素があるためGETするたびに結果が変わってしまうのはまずい。やはりPOST(or PUT)でなければならない。
（これは、たまたま難しい例。GET, PUTだけでうまくいく場合が多い）

この場合、`shuffled`というフラグの形で考えるとよい。
`/events/1/attendances/shuffled` もしくは
`/events/1/shuffled`
シャッフルされていないときは、GETすると`false`が返ってくる。
`true`をPUTすることで、シャッフル処理が行われ、positionがセットされる。


## shuffleの入れ方 その2

今までは、シャッフルは1回のみという前提。
シャッフルが複数回できて、過去の順番も保存されていて見られるとするならどうするか。
（実際には複数必要なくても、リソース設計する際に考え方として有用）

### A. イベントにラウンドが複数あると考える

1つのイベントの中に第1ラウンド、第2ラウンド、…とあるイメージ。それぞれに参加者がいる。
（なので、それぞれに参加者が異なる可能性もある）

```
events
   ^
   |
 (1:n)
   |
   v
rounds <--(1:n)--> attendances <--(n:1)--> users
```

`/events/1/rounds/2/attendances/shuffled` もしくは
`/events/1/rounds/2/shuffled`

### B. あくまで、positionが複数あると考える

イベントごとの参加者は絶対に同じにしたい場合。

```
events <--(1:n)--> attendances <--(n:1)--> users
                        ^
                        |
                      (1:n)
                        |
                        v
                     orders
```

この場合 `/events/1/attendances/2/orders` などとはできないことに注意。
なぜなら、attendancesは粒度が細かすぎて、その子のordersはほとんど意味を持たない。

`/events/1/users` も妥当なので、テーブルは直接つながっていなくてもよい。

`/events/1/shuffles/2`?

このURLをどうやって導出するか。
PHPで使うGoFパターン ひとり Advent Calendar - フライウェイト


## フライウェイトってなに?

ちょっとクレバーなシングルトンです。シングルトン的なやつに引数を渡して状況に応じてキャッシュからインスタンスを返したり、キャッシュしながらインスタンスを返したりします。

## フライウェイトの構造

* FlyweightFactory - フライウェイトなファクトリ
* Flyweight - 生成される側

この例ではとりあえずファクトリをシングルトンで実装していますが、ここはお好みでどうぞ。フライウェイトファクトリはアブストラクトファクトリと組み合わせたり、ファクトリメソッドと組み合わせたりするのも良いと思います。




```PHP
<?php
class FlyWeight {
  private $_Key = null;
  private $_ID  = null;
  private static $_ObjectID = 1;
  public function __construct ( $key ) { 
    $this->_Key = $key;
    $this->_ID = self::$_ObjectID++;
  }
}
class FlyWeightFactory {
  private $_Objects = array (); 
  private static $_Self = null;

  private function __construct () {
  }

  public static function getInstance () {
    if ( !self::$_Self ) self::$_Self = new FlyWeightFactory();
    return self::$_Self;
  }

  public function get ( $key ) { 
    if ( !$this->_Objects[$key] ) $this->_Objects[$key] = new FlyWeight ( $key );
    return $this->_Objects[$key];
  }
}

$factory = FlyWeightFactory::getInstance();
var_dump ( $factory->get ( 'fizz' ) );
var_dump ( $factory->get ( 'buzz' ) );
var_dump ( $factory->get ( 'fizz' ) );
var_dump ( $factory->get ( 'fizz' ) );
var_dump ( $factory->get ( 'fizz' ) );
var_dump ( $factory->get ( 'buzz' ) );
var_dump ( $factory->get ( 'piyo' ) );
var_dump ( $factory->get ( 'piyo' ) );
```