OmniAICreator/Qiita-1.07M huggingface dataset:
数値、アルファベットからランダムなn文字の文字列を生成する


### 0〜9、a〜z、A〜Zの中から5文字ランダムに抽出し、文字列に変換する

```ruby
((0..9).to_a + ("a".."z").to_a + ("A".."Z").to_a).sample(5).join
 # => "Aw5EV" 
```

### その他、文字列配列生成サンプル

```ruby
(0..9).to_a
 # => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 

("a".."z").to_a
 # => ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"] 

("A".."Z").to_a
 # => ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"] 

("A".."z").to_a
 # => ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"] 

(("a".."z").to_a + ("A".."Z").to_a)
 # => ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"] 
```
ずっとスクロール

http://www.razr.com/ でずっとスクロールできたのでどうやってやるのかな、と思って書いてみた。css の -webkit-transform の translate3d を使っているのかな。
こんなのじゃ何にも使えないけど。あと、1周したあと mousemove イベントが呼ばれないのも致命的。

```html:loop_scroll.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>loop scroll</title>
    <style>
      body {
        overflow: hidden;
      }
      .wrapper {
        height: 600px;
      }
      .scroll-wrapper {
        height: 100%;
        width: 4000px;
      }
      .content {
        height: 100%;
        width: 1000px;
        float: left;
      }
      .div0 {
        background-color: red;
      }
      .div1 {
        background-color: green;
      }
      .div2 {
        background-color: blue;
      }
    </style>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js" ></script>
    <script type="text/javascript">
      $(function () {
          var startx = 0;
          var amount = 0;
          var drag = false;
          $('.scroll-wrapper').mousedown(function (ev) {
              console.log('a');
              drag = true;
              startx = ev.pageX;
          });
          $('.scroll-wrapper').mousemove(function (ev) {
              console.log('b');
              if (!drag) {
                  return;
              }
              amount += ev.pageX - startx;
              if (amount < -3000) {
                  amount += 3000;
              }
              console.log('amount: ' + amount);
              $('.scroll-wrapper').css('transform', 'translate3d(' + amount + 'px, 0px, 0px)');
              startx = ev.pageX;
          });
          $('.scroll-wrapper').mouseup(function (ev) {
              drag = false;
          });
      });
    </script>
  </head>
  <body>
    <div class="wrapper">
      <div class="scroll-wrapper">
        <div class="content div0">
        </div>
        <div class="content div1">
        </div>
        <div class="content div2">
        </div>
        <div class="content div0">
        </div>
      </div>
    </div>
  </body>
</html>
```
XOOPS Cube: How to connect the Database

本記事では、XOOPS Cube がウェブサイトにアクセスされた時どのようにしてデータベースサーバに接続しているかを順を追って解説します。

まず、 XOOPS Cube のモジュール等でデータベースを利用する際の標準的なコーディング手法を紹介します。以下の様なデータアクセス用のコードは通常、モジュールの class フォルダに配置され、コントローラから利用されます。

```
$root =& XCube_Root::getSingleton();
$db =& $root->mController->getDB();
$table = $db->prefix('foo');
$sql = "SELECT * FROM ". $table ." WHERE uid=$uid"; 
$result = $db->query($sql);
while ($row = $db->fetchArray($result)) {
    $ret[] = $row;
}
return $ret;
```

なお、ここに掲示されるコードは XOOPS Cube Legacy 2.2.1 のコアソースから解説ポイントだけをピックアップした物ですので予めご了承ください。

最初に、html 直下の index.php が呼び出されます。そしてその中で mainfile.php が読み込まれます。さらに minfile.php の中で common.php を読み込みます。

```mainfile.php
include XOOPS_ROOT_PATH.'/include/common.php';
```
common.php では、コアの各種初期設定である cubecore_init.php を読み込み $root を作るという大事な役割をになっています。 XOOPS Cube では、全て $root からコントロール可能ですが、ここで生成されます。

```common.php
require_once XOOPS_ROOT_PATH . '/include/cubecore_init.php';
$root=&XCube_Root::getSingleton();
$xoopsController=&$root->getController();
$xoopsController->executeCommon();
```

$root が生成された後そこに肉付けしていく作業が続きます。それが executeCommon です。まるで木の幹から枝が生えて行く様をみるかの様に以下のクラスが生成されます。各ライブラリの解説はまたいずれ行いますが、ここで注目して頂きたいのが $this->_setupDB(); です。ここでデータベースサーバへのコネクションが張られてプライマリとして使用するデータベースが決定します。

```html/modules/legacy/kernel/Legacy_Controller.class.php
class Legacy_Controller extends XCube_Controller{
	function executeCommon(){
		$this->_setupEnvironment();
		$this->_setupLogger();
		$this->_setupDB();
		$this->_setupLanguage();
		$this->_setupTextFilter();
		$this->_setupConfig();
		$this->_setupScript();
		$this->_setupDebugger();
		$this->_loadInterfaceFiles();
		$this->_processPreBlockFilter();
		$this->_setupSession();
		$this->_setupUser();
		$this->setupModuleContext();
		$this->_processModule();
		$this->_processPostFilter();
	}
	function _setupDB(){
		$this->mDB =& XoopsDatabaseFactory::getDatabaseConnection();
	}
	function &getDB(){
		return $this->mDB;
	}
}
```

_setupDB() では、getDatabaseConnection をコールして $root->mController->mDB に生成内容を渡します。さて、ではいよいよ MySQL サーバとの接続部分です。

getDatabaseConnection は databasefactory というクラスに用意されています。ここの connect で XOOPS_DB_TYPE に指定した種類のDBサーバ(=MySQL) のクラスライブラリがローディングされます。

```html/class/database/databasefactory.php
public static function &getDatabaseConnection(){
$file = XOOPS_ROOT_PATH.'/class/database/'.XOOPS_DB_TYPE.'database.php';
$instance->connect();
}
```

そして、mysql_connect が実行され mysql_select_db でプライマリのデータベースが設定されます。

```html/class/database/mysqldatabase.php
class XoopsMySQLDatabase extends XoopsDatabase
{
	function connect($selectdb = true){
		$this->conn = @mysql_connect(XOOPS_DB_HOST, XOOPS_DB_USER, XOOPS_DB_PASS, false, MYSQL_CLIENT_FOUND_ROWS);
		mysql_select_db(XOOPS_DB_NAME);
	}
}
```
既にGit管理下のファイルを管理下から外す方法

バージョン管理する必要のないファイル（ex. バイナリファイル等）を既にGitの管理下にしてしまっている時、単純にgitignoreを書いただけではファイル/ディレクトリをGitの管理下から外すことができない。
実現方法は、
1. .gitinogreに `bin/` や `*.class` 等無視する条件を書く
2. `rm [-r] ファイル[ディクレクトリ]` で消す
3. `git rm [-r] ファイル[ディクレクトリ]` でgitの管理下から外す
4. `git add` `git commit` する。
Safari 6で標準フォントを指定する

Safari 6からブラウザ側のフォント指定が環境設定からなくなってしまったが、裏設定は存在する模様。
CSSを使う方法はなぜかうまくいかなかったが、これならうまくいった。

####Safari の標準フォントを Lucida Grande / ヒラギノ角ゴシック Pro W3 にする
```sh
defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2StandardFontFamily "Lucida Grande"
```

####Safari の等幅フォントを Menlo にする
```sh
defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2FixedFontFamily "Menlo"
```

####Safari の標準フォントサイズを指定する
```sh
defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2DefaultFontSize -int 16
```

####Safari の等幅フォントサイズを指定する
```sh
defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2DefaultFixedFontSize -int 12
```

> 引用： https://discussionsjapan.apple.com/thread/10112755?start=15
Sublime Text2にフォーマッタを導入する


## フォーマッタとは
この画像を見てどう思いますか？

!["env04"](http://dl.dropbox.com/u/289852/qiita/03/env04.png)


コードをバージョン管理するにあたって、行末に謎のスペースを含めると蕁麻疹が出るだとか、無駄な改行があると発狂しそうだとか、そういったある種のフェチを持った人におすすめの機能です。
フォーマッタを使えばそんなものは勝手に削除してくれますし、何より綺麗なコードを維持できるのです。

それだけでなく、複数人で開発する場合はコーディングスタイルの差異も吸収してくれるので大きな助けになってくれるでしょう。

## SublimeAStyleFormatterをインストールする
SublimeAStyleFormatterというプラグインがあるのでインストールします。このフォーマッタはとりあえずC/C++/C#/Javaに対応しています。

まず、Cmd+Shift+PでCommand Palleteを出し、Package Control: Install Packageを選択します。(Package Controlが無い場合は[こちら](http://qiita.com/items/22a760a679025166c9f1)を参照)
"SublimeAStyleFormatter"とタイプして、選択すると自動的にインストールされます。

インストールが完了するとCmd+Alt+Fでフォーマットが効くはずなのですが、僕の場合はうまくいかず一度Sublime Text2を再起動しました。


### 実行前
!["env02"](http://dl.dropbox.com/u/289852/qiita/03/env02.png)

### 実行後
!["env03"](http://dl.dropbox.com/u/289852/qiita/03/env03.png)


## 保存時に自動的にフォーマッタをかける
朦朧とした意識の中コードを書くこともあるし、未来のアホな自分がフォーマッタのことをすっかり忘れるかもしれません。
そんなときの為、保存時に自動的にフォーマッタがかかるようにしておきます。

### プラグインを追加する
保存時の処理をフックするためにプラグインを作りました。
メニューからTools->New Plugin…をクリックしてプラグインファイルを新規作成し、以下のコードをコピペして"AutoRunner.py"という名前で保存します。
保存先はデフォルトで開くUserフォルダを指定します。

```Python:AutoRunner.py
import re
import sublime, sublime_plugin

# Plugin of running command when saving file
class AutoRunner(sublime_plugin.EventListener):

	current = None

	# Execute a command
	def execute(self, view, info):
		# Get information of command
		command = info.get('command')
		syntaxes = info.get('syntaxes')
		args = info.get('args')

		# Get name of syntax mode from file path
		# /AAA/BBB/ccc.tmLanguage => ccc.tmLanguage
		filename = re.split('/', self.current)[-1]
		# ccc.tmLanguage => ccc
		current_syntax = re.split('\.', filename)[0]

		# Run command if list of executable syntax mode contains current syntax mode
		if  syntaxes == None or current_syntax in syntaxes:
			print command
			edit = view.begin_edit()
			view.run_command(command, args)
			view.end_edit(edit)

	# Execute when before saving file automatically
	def on_pre_save(self, view):
		# Get current syntax mode
		self.current = view.settings().get('syntax')
		if self.current == None:
			return

		# Execute command from each settings
		commands = view.settings().get('auto_runner')
		if commands != None:
			map(lambda c :self.execute(view, c), commands)
```

プラグインの作り方については[こちら](http://qiita.com/items/9427df9393ec5613c016)にまとめました。
このプラグインはとりあえず[gist](https://gist.github.com/3642209)に置いてあります。


### 設定ファイルを書く
保存時に特定のコマンドを実行させる為、今度は設定ファイルを編集します。
メニューからSublime Text2->Preferences->Settings-Userをクリックして設定ファイルを開きます。
以下のように設定ファイルを編集して保存します。

```Preferences.sublime-setting
{
	…

	"auto_runner":
	[
		{
			"command": "astyleformat",
			"syntaxes":
			[
				"UnityC#",
				"C#"
			]
		}
	]
}
```

"UnityC#","C#"の欄については、コマンドを実行させたい任意のシンタックスモードを指定してください。複数のコマンドの設定や"args" : […]を追加することでコマンドの引数も指定できます。

これで保存時に自動的にファイルが整形されるはずです。
Sublime Text2のプラグイン作成チュートリアル


## 今回やること
Sublime Text2のプラグインはPythonで書きます。
今回は以下の仕様でプラグインを作ってみたいと思います。

 * ファイルを保存したときにコマンドを実行する
 * 特定のSyntaxモードを選択している時にしか実行できない
 * Syntaxモードとコマンドは設定ファイルから読み込む

## プラグインの新規作成
メニューからTools->New Plugin…をクリックすると、新規にファイルが作成されます。
クラス名をAutoRunnerに変更して、とりあえず保存します。保存時に勝手に以下のフォルダを指定してくれているはず。

> /Users/[username]/Library/Application Support/Sublime Text 2/Packages/User

尚、エラーはコンソールに表示されるのでメニューのView->Show Consoleから予め表示しておきます。また、プラグインはPackages直下に置いておけば自動的に読んでくれます。


## 保存時の処理をフックする
[APIリファレンス](http://www.sublimetext.com/docs/2/api_reference.html#sublime.Window)を読むと、EventListenerクラスが「Viewが保存されたときに実行される」、on_pre_save(view)を持っていることが分かります。
他にも、閉じられたとき、新規作成時、保存後…などの処理をフックできるようです。

これらを使う為には、sublime_plugin.EventListenerを継承する必要があるのでそのように修正します。また、元から生成されていたコードを削除してon_pre_save(self, view)関数を追加しておきましょう。

動作確認の為、"Hello World!"を表示させる為のコードを追加して保存し、さらにもう１度保存して実際にHello Worldが表示されるかどうか確認します。

```Python:AutoRunner.py
import sublime, sublime_plugin

class AutoRunner(sublime_plugin.EventListener):
	def on_pre_save(self, view):
		sublime.message_dialog("Hello World!")

```


## 設定ファイルを読み込む
次に、設定ファイルから値を読み込みます(以下設定ファイル例)。


```Javascript:Preferences.sublime-settings
{
	"ignored_packages":
	[
		"Vintage"
	],

	"auto_formatter"
	{
		"command" : "astyleformat",
		"syntax" : "UnityC#"
	}
}

```

[APIリファレンス](http://www.sublimetext.com/docs/2/api_reference.html#sublime.Window)によると、view.settings()を使うことでSettingsクラスを取得できるそうです。
上記の設定ファイルの場合、view.settings().get('auto_formatter').get('syntax')で'UnityC#'が取得できます。

## コマンドの実行
run_command(string, args…)を使ってコマンドを実行できます。
今回の場合は'astyleformat'コマンドを使用し、引数は使用しないのでrun_command('astyleformat')でフォーマットを実行できます。

実行するコマンドの前後にbegin_edit()とend_edit()を入れておくと、コマンドによる変更が1つの変更の単位として認識され、UndoとRedoが出来るので入れておきましょう。

## 完成
とりあえず、これだけで簡単にプラグインが動かせます。
Python分からないので何かおかしなところがあったら教えてください。

```Python:AutoRunner.py
import re
import sublime, sublime_plugin

# 保存時に設定ファイルのコマンドを実行するプラグイン
class AutoRunner(sublime_plugin.EventListener):

	# 保存前のフック処理
	def on_pre_save(self, view):
		# 設定ファイルから実行するシンタックスと実行コマンド情報を取得する
		setting = view.settings().get('auto_formatter')
		syntax = setting.get('syntax')
		command = setting.get('command')

		# 現在設定されているシンタックスモードを取得
		current = view.settings().get('syntax')

		# シンタックスモードはファイルパスが取得されるので、そこから名称だけ取得
		# /AAA/BBB/ccc.tmLanguage => ccc.tmLanguage
		filename = re.split('/', current)[-1]
		# ccc.tmLanguage => ccc
		current_syntax = re.split('\.', filename)[0]

		# 設定ファイルのシンタックス値と現在のシンタックスモードが一致していればコマンドを実行
		if  current_syntax == syntax:
			edit = view.begin_edit()
			view.run_command(command)
			view.end_edit(edit)
```
JSX completionのspec


draft。jsx --complete で返すものは `CompleteCandidate[]` を JSON serializeしたもの。これをエディタが受け取り、補完候補を作る。

```jsx
class CompleteCandidate {
	var word : string;                    // 補完対象ワード
	var partialWord : string              // 補完対象ワードの一部(*)
	var doc : Nullable.<string>;          // jsxdocによる説明文
 	var type : Nullable.<string>;         // 型
	var declare : Nullable.<string>;      // 完全な宣言文
	var definedClass : Nullable.<string>; // 補完候補が定義されているクラス
	var definedFile : Nullable.<string>;  // 定義されたファイル
	var definedLine : Nullable.<int>;     // 定義された行
}
```

(*) partialWord: "JSON.st" に対して "ringify" を補完対象とする

例：

```json
{
	"word" : "stringify",
	"partialWord" : "ringify",
	"doc" : "serialize any type of object as JSON string",
	"type" : "function (value : variant) : string",
	"declare" : "static function stringify (value : variant) : string",
	"definedClass" : "JSON",
	"definedFile" : "lib/built-in/jsx",
	"definedLine" : 903
}
```
fetch と pullの違い

`git fetch`と`git pull`の違いをわかりやすく書いてあるのが見つからなかったので。  


##git fetch
リモートからデータを取ってくる。
ただし取ってくるだけで、それ以外は何もしない。

例えば

    A->B # master
    A->B->C->D # origin/master

だった場合，`git fetch`はCとDをダウンロードしてきて、origin/masterとして保存する。
しかしローカルのmasterには一切手を触れないため、masterとorigin/masterは別のコミットを指す。

この状態で`git checkout master`とかすると、多分こんな感じのメッセージが出る

    Switched to branch 'master'
    Your branch is behind 'origin/master' by 2 commit, and can be fast-forwarded.

これは、このあと2回コミットされてるけど早送り(衝突が無いのでそのまま最新版に)できるよ！
ってことらしく，`git merge origin/master`を実行することで、ローカルのmasterもorigin/masterを指す。

##git pull
`git pull`は、上の`git fetch`と`git merge origin/master`までを
全部まとめてやってくれる。
らくちん。

ただし、mergeしたくない時にやってしまうと大変なことになる。
そんな時は、戻したいコミットのIDを調べて、`git reset --hard ID`で元に戻せる。
Titaniumプロジェクト内のフォルダ名に"iphone"が使えない？・・・事はない

前に"iphone"ってフォルダ名をつけれたら、実機転送時かなにかにエラーが出てた気がした。
…が、いま（SDK 2.1.2)で試したらそんなこと無かった。勘違いだったのか修正されたのか...。
Google Closure Templateのコマンドラインオプション


`--shouldProvideRequireSoyNamespaces`オプションを付けないと、Google Closure Libraryを使わない前提の書き出しになってしまう。Closure Libraryと一緒に使う場合はこのオプションをつける。

```shell
java -jar compiler/SoyToJsSrcCompiler.jar --shouldProvideRequireSoyNamespaces --outputPathFormat hoge.js hoge.soy
```
Railsのcounter_cacheを使ったらdeadlockが頻発した


rails (3.2.3)
activerecord (3.2.3)
mysql2 (0.3.11)

ちょっと遡って話をしたほうがいいのかも。

## 前提：Mysql(InnoDB)でcount(1)はテーブルスキャンが発生して遅い

非力なインスタンスを使っていたので、
数十万件ってレベルからこれがボトルネックになっていた。

そのために、Railsが装備しているcounter_cacheという機能を使う。
ただ、counter_cacheってのは関連するモデルの件数を覚えておくっていう方法で、
テーブルの全レコードの数を保存しておく方法ではない。

それをしたいなら別の実装を。

参考：[A Guide to Active Record Associations](http://guides.rubyonrails.org/association_basics.html)

## counter cahceってなんだ

繰り返しになるけど、関連するモデルの件数を覚えておく。

```ruby
class Order < ActiveRecord::Base
  belongs_to :customer, :counter_cache => true
end
class Customer < ActiveRecord::Base
  has_many :orders
end
```

例えば、以下のようにしたときに、
count(*)なクエリーが発行されず、キャッシュから件数が導かれる。

```ruby
@customer.orders.size
#=> 100
```

設定の書き方が直感的じゃないので違和感を感じるかもしれないです。
上記のような書き方をした時に、
件数を記憶しておくカラムはcustomersテーブルのorders_countというカラムになる。
カラム名を変えたいのならば、:counter_cacheにbool値ではなく、カラム名を渡せばOK

```ruby
class Order < ActiveRecord::Base
  belongs_to :customer, :counter_cache => :count_of_orders
end
class Customer < ActiveRecord::Base
  has_many :orders
end
```

ここまではドキュメントをほぼ和訳しただけ笑

## counter cache早いけど、あれ、deadlock...

"counter cache"を使うと毎回select count(*)が発行されないので早いです。
特にpagingしてるときとか、都度件数とる必要があるので体感出来るほど早くなりました。
（というか、改善前は数十秒かかることもあって使用が困難だった）

この通り、読み込みするときは良かったのですが、
書き込みがちょっと残念でした。

そのモデルの追加はresqueで遅延処理していたのですが、
workerが2-4程度でもdeadlockが発生してしまいました。。

## 解決方法を調べる

Mysql側を深掘りすると泥沼な気がしたので、
railsのcounter cacheを使ってdeadlock発生してる人居ないかなー？って探したら一応いた。

[Rails Counter Cache Updates Leading to MySQL Deadlock](http://marklunds.com/articles/one/419)

[PostgreSQL transactions wrapping child+parent modifications, deadlocks, and ActiveRecord](http://mina.naguib.ca/blog/2010/11/22/postgresql-foreign-key-deadlocks.html)

けど、ちょっと解決策からは遠い気がした。
そしたら素敵なgem発見。

[bestvendor / counter_culture](https://github.com/bestvendor/counter_culture)

これ使ったら治りました。ハイ。

## counter_cultureの仕組み

どうやってdeadlockを起きないようにしているかっていうと、
counter cacheの更新をトランザクションをcommitした後にしているということ。

当然のごとく、そのトランザクション直後になんらかの障害が起きた場合は不整合が発生することは容易に予想がつく。

けど、そこまでの精度を求めない場合や、
都度backgroundでcountしなおしたり（そういう手段をcounter_cultureは提供している）すれば見逃せる場合はこのgemはとてもカッコイイ。

ということで、ひとまずこれで代用することにしました。
今のところdeadlockの再発はないのでいいかな。
EC2サーバー内から、インスタンス情報を参照する


+ ログインしているインスタンスの情報をコマンドで取得する
+ root 不要
+ AWSの管理画面に入れてもらえないIT傭兵のために


○ 公式ドキュメントはこちら。
[AWS documentation | Instance Metadata](http://docs.amazonwebservices.com/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html)

どうやら、AWSのネットワーク内から参照できるAPIがあるようです。
WebAPIになっているので、curlで叩くと結果が帰ってきます。

詳細はドキュメントを参照すれば良いとして、汎用性の高そうな物をメモ。


### インスタンスタイプ、その他

```bash
$ curl http://169.254.169.254/latest/dynamic/instance-identity/document/

{
  "kernelId" : "aki-XXXXXX",
  "ramdiskId" : null,
  "instanceId" : "i-XXXXXX",
  "instanceType" : "t1.micro",
  "billingProducts" : null,
  "architecture" : "x86_64",
  "version" : "2010-08-31",
  "accountId" : "XXXXXXXXXX",
  "imageId" : "ami-XXXXXXX",
  "pendingTime" : "2012-07-03T06:40:56Z",
  "availabilityZone" : "ap-northeast-1a",
  "devpayProductCodes" : null,
  "privateIp" : "xxx.xxx.xxx.xxx",
  "region" : "ap-northeast-1"
}
```

### public-hostname

```bash
$ curl http://169.254.169.254/latest/meta-data/public-hostname
ec2-xxx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com
```

### public-ipv4

```bash
$ curl http://169.254.169.254/latest/meta-data/public-ipv4
xxx.xxx.xxx.xxx
```

### security-groups
```bash
$ curl http://169.254.169.254/latest/meta-data/security-groups
mySecurtyGroups
```

セキュリティグループの細かい設定が見れないのが残念。。。


## ついでに

### AmazonLinuxOS のバージョン
```bash
$ cat /etc/system-release
Amazon Linux AMI release 2012.03
```
Reachabilityを利用するまでの流れ

Reachabilityを利用する時は以下のような雰囲気だった。

http://developer.apple.com/library/ios/#samplecode/Reachability/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007324-Intro-DontLinkElementID_2
よりサンプルコードをダウンロード。

Reachbility.h
Reachbility.m
をコピーしてプロジェクトに追加。

この時点ではARCを利用しているプロジェクトだとエラーが出ているので、
TARGETS→Build Phases→Compile SourcesでReachbility.mに-fno-objc-arcを設定。エラーが無くなる。

このままコンパイルするとリンカエラーなので
TARGETS→Summary→Linked Frameworks and LibrariesにSystemConfiguration.frameworkを追加。
ここは下記のアドバイスに従った。※ただフレームワーク名まではエラーに含まれていなかった。
http://stackoverflow.com/questions/2408388/scnetworkreachability-compiling-error

これでうまくいった。

参考：
http://labs.torques.jp/2012/03/19/2583/
railsのテスト環境のためのGemfileとその他設定


##はじめに

rails new <app-name> -T
にてはじめる。
-TはTEST:Unitを作成しないオプション


## 利用するもの

- rspec
- capybara
- guard
- factory_girl
- jasmine


## 追記事項

```Gemfile.rb
group :development, :test do
  gem "rspec"
  gem "capybara"
  gem "rspec-rails"
  gem "guard-rspec"
  gem "jasmine"
end

group :development do
  gem "rails3-generators"
end

group :test do
  gem "factory_girl_rails"
end
```


## shでの実行事項
```bash.sh
rails g rspec:install
```

## capybaraの設定

spec/spec_helper.rbに下記を記述

```spec/spec_helper.rb
require 'capybara/rails'
```


## factory_girlのメモ

ファイルの形式は
spec/factories/テーブル名.rb


## テスト実行の自動化

guardで監視する

```bash.sh
# 初期化=Guardfileを生成
guard init rspec
# 監視実行コマンド
bundle exec guard
```

保存するたびにテストが実行される


## rspecのコマンドメモ

```rspec.sh
#rspecの全実行
rake spec
#特定のフォルダの実行

#ファイルを指定しての実行
bundle exec rspec <file_path>
#出力フォーマットを読みやすいグループの形式に
bundle exec rspec -f d <file_path>
#上記を常に変更したい場合
#「.rspec」というファイルを作成し、下記内容を追記
--format documentation
```
ruby-debugでつまづいた話


rbenvを使わずに開発していた頃のプロジェクトのソースを使って、rbenv下で開発環境を再構築しようとしたらハマったのでメモ。

普通にbundle installとかしてrailsサーバを起動すると、以下のようなエラーが出力された。

```
$ bundle exec rails server
/path/to/project/vendor/bundler/ruby/1.9.1/gems/activesupport-3.1.0/lib/active_support/dependencies.rb:240:in `require': dlopen(/path/to/project/vendor/bundler/ruby/1.9.1/gems/ruby-debug-base19-0.11.25/lib/ruby_debug.bundle, 9): Symbol not found: _ruby_threadptr_data_type (LoadError)
  Referenced from: /path/to/project/vendor/bundler/ruby/1.9.1/gems/ruby-debug-base19-0.11.25/lib/ruby_debug.bundle
  Expected in: flat namespace
 in /path/to/project/vendor/bundler/ruby/1.9.1/gems/ruby-debug-base19-0.11.25/lib/ruby_debug.bundle - /path/to/project/vendor/bundler/ruby/1.9.1/gems/ruby-debug-base19-0.11.25/lib/ruby_debug.bundle
….
```

ちなみに、プロジェクトでは元々1.9.2-p290を使っていたので、rbenvでも同じバージョンに合わせている。当然以前はこんなエラーは出てなかった。

同じエラーをググってみるが、「ruby-debugが1.9.3で動かなくなった」というもので同じような現象が報告されてはいるが、ピンとくるものがなかった（ruby-debugではなくてdebuggerを使えというようなものばかり… http://bit.ly/Q5HJcD とか）。

もしかしてrbenvを使っているのが原因かもと、頭を切り替えて探すと、こんなのあった: https://gist.github.com/1403066

これを参考に、bundle configしてインストールしなおしてみた。

```
$ rm -rf vendor/bundler
$ export RBENV_INCLUDE="$HOME/.rbenv/versions/1.9.2-p290/include/ruby-1.9.1/ruby"
$ bundle config build.linecache19 --with-ruby-include=/$RBENV_INCLUDE
$ bundle config build.ruby-debug-base19 --with-ruby-include=/$RBENV_INCLUDE
$ bundle config build.ruby-debug19 --with-ruby-include=/$RBENV_INCLUDE
$ bundle install
```

この結果、エラーが出ずに動くようになった。

とここまで、書いてみて気が付いたが、よく考えたら最初、ruby 1.9.3でbundle installして、実行したら冒頭のエラーが出たので、「あ、1.9.3じゃ動かないだ」と思って1.9.2に切り替えたのだった。切り替えて実行してやっぱりエラーになったので、調べ始めたわけで…。

ということは、上記のbundle configがなくても最初からruby 1.9.2でbundle installすれば動くのではと思い試してみた。

```
$ rm -rf vendor/bundler
$ rm $HOME/.bundle/config
$ bundle install
```

やってみたら、何もエラー出ずに動く…。なんだ〜。
ということで、さようなら。
StringからSymbol

`"Book Author Title"` みたいな文字列を
`:book_author_title` みたいなシンボルにしたい時。

`'Book Author Title'.parameterize.underscore.to_sym`

で出来る。

```ruby:sample
  class Person
    def to_param
      "#{id}-#{name.parameterize}"
    end
  end

  @person = Person.find(1)
  # => #<Person id: 1, name: "Donald E. Knuth">

  <%= link_to(@person.name, person_path(@person)) %>
  # => <a href="/person/1-donald-e-knuth">Donald E. Knuth</a>
```

`ActiveSupport::Inflector`モジュールは結構使いそうな感じなのが多いので、ちゃんと読む。
Nginx + Unicorn for Rails on Rackhub

## 概要

RackHub 上で、Rails + Nginx + Unicorn をプロダクション環境で構築する方法を紹介します。

## やり方

Rails アプリの Gemfile 内に Unicorn を追加します。

    gem 'unicorn'

次に、`$RAILS_ROOT` 変数が設定されているかどうかをチェックします。

    echo $RAILS_ROOT

もし設定されていなかったら、次のようにして `$RAILS_ROOT` を設定します。

    export RAILS_ROOT=$HOME/sample_app

なお、上記の `sample_app` には、実際の Rails アプリケーションの名前を代入して下さい。

最後に、次のコマンドを実行します。

    curl -s -L https://gist.github.com/raw/2129714/install.sh | bash

うまく設定が出来ていたら、これで Rails + Nginx + Unicorn のプロダクション環境が構築できているはずです。お手持ちのブラウザでチェックしてみて下さい。

> 本投稿は、次の Gist を fork して日本語訳したものです。
> Gist - [Nginx + Unicorn for Rails on Rackhub](https://gist.github.com/2129714)
> * 作者から許諾も頂きました。
正規分布(標準ガウス分布)のランダム関数 - ボックス=ミューラー法

ゲームのダメージ値とかであるあれです。
ダメージ80だけど、ある程度運の要素で5前後させたい時などに使います。
正規分布で平均値と分散値を与えて、ランダムな値を取得します。

```js
/**
 * 正規分布乱数関数 参考:http://d.hatena.ne.jp/iroiro123/20111210/1323515616
 * @param number m 平均μ
 * @param number s 分散σ^2
 * @return number ランダムに生成された値
 */
var normRand = function (m, s) {
	var a = 1 - Math.random();
	var b = 1 - Math.random();
	var c = Math.sqrt(-2 * Math.log(a));
	if(0.5 - Math.random() > 0) {
		return c * Math.sin(Math.PI * 2 * b) * s + m;
	}else{
		return c * Math.cos(Math.PI * 2 * b) * s + m;
	}
};
```

実際に以下のコードで実験してみると、

```js
for (var i = 0; i < 100; i++) {
	console.log(normRand(80, 5));
};
```

81.39403776531488
77.30179861528501
75.13515899227075
76.47488194059684
83.91200749497585
76.45111222527056
71.65510396401942
75.89597123221556
81.3975834181407
78.35348180588761
73.83973290528844
82.64755277391454
...
のような数値が返ってきます。ダメージの場合はこれをMath.round()してください。
あと分散が大きいと負の値が返ることもあるので要注意。
参考にさせてもらったところがJavascript1.7だったので、1.5に書きなおさせてもらいました。
Rackhub用の公開鍵の登録方法 (一部Mac向け)

公開鍵の登録を行うことで、作成した（もしくは友達に共有された）Rackにセキュアにログインすることができるようになります。これはRackhubを使いこなす上でとても大切な作業です。このページでは、公開鍵の作成からRackhubへの登録までを詳しく説明します。

### 1. まず手元のMacで、おもむろにターミナル(Terminal)を立ち上げます。

![launch terminal](http://dl.dropbox.com/u/964705/images/20120514_235230.png)

すると、こんな感じでターミナルが立ち上がります。

![terminal screen](http://dl.dropbox.com/u/964705/images/20120514_235322.png)

### 2. SSH鍵の表示スクリプトを実行します。

ターミナルに下のコマンドを入力してEnterを押してください。

```
curl -s -L https://gist.github.com/raw/2425005/ssh-keygen.sh | bash
```

このスクリプトは、既に手元の環境に公開鍵(id_rsa.pubもしくはid_dsa.pub)が存在している場合は単にそのファイルの中身を表示します。

もし公開鍵が存在しない場合は、新たにSSH鍵の認証鍵と公開鍵のペアを作成し、その作成した公開鍵を表示します。

### 3. 公開鍵をコピーします。

コマンドを実行すると、下の図のようにあなたの公開鍵が表示されるはずです。

![enter script_url](http://dl.dropbox.com/u/964705/images/20120514_235405.png)

例は[@keikubo](http://twitter.com/keikubo)の公開鍵で、この例の場合、 ssh-rsa … keikubo@debian までが公開鍵となりますので、その範囲を選択してコピーしてください。

もし二つ公開鍵が表示された場合は、別々に登録しますので、片方ずつ作業してください。

### 4. Rackhubに公開鍵を登録します。
	
Rackhubにログイン後、以下のURLにアクセスしてください。

https://rackhub.net/account/pubkeys

その公開鍵の設定ページで、追加する公開鍵のテキスト欄に、コピーしたあなたの公開鍵を貼り付けて「追加」ボタンを押してください。

![add pubkey on rackhub](http://dl.dropbox.com/u/964705/images/20120514_235505.png)

### 5. きちんと登録されていたら、完了です。

下に今回使用した公開鍵の登録スクリプトを置いてますので、興味がある方はぜひご覧ください。
	
それでは、引き続きRackhubをお楽しみください！

> 本投稿は、次の Gist を fork して転載したものです。
> Gist - [Rackhub用の公開鍵の登録方法 (一部Mac向け)](https://gist.github.com/2425005)
> * 作者から許諾も頂きました。
Network.Shpider を使って EUC-JP なサイトをダウンロードする

```haskell:shpidertest.hs
import Network.Shpider
import Network.Curl
import Codec.Text.IConv
import qualified Data.ByteString.Lazy.Char8 as B
import qualified Data.ByteString.Lazy.UTF8 as U
import Foreign.C.String
import Data.IORef

main = runShpider $ do
  htmlRef <- lift $ newIORef ""
  addCurlOpts [CurlWriteFunction $ gatherOutput_ (\s -> peekCAStringLen s >>= \t -> modifyIORef htmlRef (++ t))]
  download "http://www.sampou.org/haskell/a-a-monads/html/hardway.html"
  html <- lift $ readIORef htmlRef
  let u_source = U.toString . convert "EUC-JP" "UTF-8" $ B.pack $ html
  lift $ putStrLn u_source
```
GitLab on RackHub 

## 概要

GitLabをRackHubで試してみるためのインストールスクリプト。

## インストール

``` sh
curl -s -L https://gist.github.com/raw/2698853/install.sh | bash
```

> 本投稿は、次の Gist を fork して転載したものです。
> Gist - [Gitlab on Rackhub](https://gist.github.com/2698853)
> * 作者から許諾も頂きました。
RackHubでのウェブサーバーの起動方法 (Nginx) 

ウェブサーバーの起動方法
=====

RackHubでは現在、デフォルトの状態ではウェブサーバーを特に起動させていません。何も操作をしていない状態だと以下のようなページが表示されます。

![](http://dl.dropbox.com/u/964705/images/20120622_215229.png)

これは、Apache, Nginxなど、ユーザーが好きなウェブサーバーを必要に応じて立ち上げることができるようにするためです。なので、ウェブアクセスが必要な方は、適宜適当なサーバーを立ち上げてお使いください。

Rackhubには、Apache, Nginxなどの主要なサーバーがすぐに使用できる状態で、最初からインストールされています。ここではいくつかの主要なRackにインストール済みのサーバーの起動方法及び簡単な使い方について説明します。

## Nginx

### 起動方法

RackにSSHログイン後、以下のコマンドを叩きます。

```
sudo nginx
```

これで、RackのURLにアクセスすると、Nginxのデフォルトページが以下のように表示されるはずです。

![](http://dl.dropbox.com/u/964705/images/20120622_215922.png)

### 停止方法

逆にnginxを停止するには以下のコマンドを叩いてください。

```
sudo nginx -s stop
```

### コンフィグのカスタマイズ

Nginxをカスタマイズして使用する場合、以下の```conf.d```ディレクトリにカスタマイズしたコンフィグファイルを置いてください。```conf.d```に置かれたファイルは全てnginx起動時に読み込まれます。

```
/usr/local/nginx/conf.d/
```

なので、デフォルトのサンプルページを表示するコンフィグファイルがありますが、必要なければ消してください。

```
sudo rm /usr/local/nginx/conf.d/default
```

ちなみに、```conf.d```ディレクトリ等を読み込む大元のコンフィグファイルは、```/usr/local/nginx/nginx.conf```です。

> 本投稿は、次の Gist を fork して転載したものです。
> Gist - [Rackhubでのウェブサーバーの起動方法 (Nginx)](https://gist.github.com/2976975)
> * 作者から許諾も頂きました。
チケットの利用方法 - Rackhub

## 概要

キャンペーンや友達からのプレゼント等で受け取ったRackhubチケットの利用方法を説明します。

## チケットの概要

* Rackhubのチケットのコードは、以下のような16文字の文字列(4x4)になっています。

    ```
    XXXX-XXXX-XXXX-XXXX
    ```

* 16文字のチケットコードを教えることで、他の方にチケットを譲渡することも可能です。
* 一度お使い頂いたチケットは即失効し、二度とお使い頂くことはできません。

## チケットの使い方

### 1. 『チケットの利用』ボタンの場所
このチケットを利用するには、まずお手持ちのRackの中からチケットを利用したいRackを選択し、そのRackページを表示してください。『チケットの利用』ボタンは、そのRackページの左メイン部分の下のほう（Rack概要の下、ポート情報の上）にあります。

![](https://raw.github.com/gist/2945827/images/use_ticket_button.png)

### 2. チケットの適用

上記の『チケットの利用』ボタンをクリックすると、チケットを適用するためのフォームが表示されます。

![](https://raw.github.com/gist/2945827/images/ticket_form.png)

このフォームのチケットコードの欄にお手持ちのチケットの16文字(XXXX-XXXX-XXXX-XXXX)のコードを貼り付けて送信してください。

### 3. チケットが適用されたことの確認

チケットが正常に適用された場合は、下図のようにRackのアクティビティに、『「xxx」の有効期限をx日間延長しました。』と表示されます。

また、Rackの概要の有効期限の時間を確認すると、先ほどの有効期限からチケットで定められた日数分延長されている；が確認できます。

![](https://raw.github.com/gist/2945827/images/after_ticket_applied.png)

### 4. その他

* もしチケット関連でお困りの方もしくはご質問のある方は、ここのコメント欄かもしくはinfo@rackhub.netまでご連絡ください。

> 本投稿は、次の Gist を fork して転載したものです。
> Gist - [チケットの利用 on Rackhub](https://gist.github.com/2945827)
> * 作者から許諾も頂きました。
node.jsで顔検出してみた

node.jsで顔検出したので、以前記事を書いてました。

期待が大きかったので、あまり検出精度が高くないと感じてしまいましたが、
テーマとしては面白いかと思います。

# node.js向けのモジュール
ccv.jsのサーバサイド版といった感じのモジュールのようです。
[orls/ccv-purejs github](https://github.com/orls/ccv-purejs)

ccv.jsで使えたオプションが一部使えなかったりしました。

# 以前書いたブログ記事
[node.jsで顔検出してみた](http://kjunichi.cocolog-nifty.com/misc/2012/08/nodejs-175a.html)

# 関連するJsdo.itの作品
[プラグインなしでWebカメラの画像から顔検出する](http://jsdo.it/kjunichi/lDQe)
Project Euler/problem 1

[problem 1](http://projecteuler.net/problem=1)

>If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23.

>Find the sum of all the multiples of 3 or 5 below 1000.

---------------

```haskell:problem1.hs
main = print $ sum [x|x<-[1..999], x `mod` 3 == 0 || x `mod` 5 ==0]
```

```text:answer
233168
```
Solaris10 でルーティングテーブルを設定する

なんか「通常は/etc/rc2.d/S72inetsvcを使ってマシンの起動時に自動的に設定するようにする」とかとんでもないことを言われたので・・・

Solaris10 以降は `route` コマンドに `-p` オプションをつけることで、
設定が恒久的に ( 再起動しても ) 反映されるようになります。

デフォルトゲートウェイの設定例

```sh
route -p add default (ゲートウェイのIPアドレス)
```

特定のネットワークだけは特別なゲートウェイを使用したい場合の例

```sh
route -p add -net (宛先ネットワークアドレス) -gateway (ゲートウェイのIPアドレス)
```

実体は /etc/inet/static_routes ファイル(手動編集は NG とされています)。
`route -p ...` を実行するとこのファイルにエントリが追加されていきます。

なお、ルーティングテーブルの表示は `netstat -rn` です :-)
URLEncode的なやつ


##結果
	(hoge)&hoge -> %28hoge%29%26hoge

##コード

**第4引数に指定した奴もエンコードされる**

    NSString *query = @"(hoge)&hoge";
    NSString *result = ((__bridge_transfer NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
    (__bridge CFStringRef)query,
    CFSTR ("-_.!~*'"),
    CFSTR ("$&+,/:;=?()@"),
    kCFStringEncodingUTF8));

##おことわり
なんとなく動いてる感じ
ページナビゲーション

//PHPでページナビゲーションを出力する関数です。

//出力したい場所に

//echo pagelistfunc($maxRows, $totalRows,"",$pageNum,'pageNum');

//のように書くとよいです。
{

<?php
function pagelistfunc($iMax = NULL, $iData = NULL, $sQuery = NULL, $iPresent = NULL, $sNofuture = NULL){

	// iMaxとiDataは必須


	if(($iMax == NULL) || ($iData == NULL)) return 0;

	/* ======== */
	/*  初期化  */
	/* ======== */

	//戻り値クリア
	$html = "";

	//iDataとiMaxの剰余を算出しiCntに格納する
	$iCnt  = $iData % $iMax;

	//iCntとiDataが一致する場合、１ページ目のみなので、「<b>1</b>」を返す
	if($iData == $iCnt){
		$html = "<strong>1</strong>｜";

	//上記以外の場合
	}else{

		//iPresentとiMaxの積をiMaxで割って（切り捨て整数化）iRowに格納する
		$sRow = floor(($iPresent * $iMax) / $iMax);

		//iDataをiMaxで割って（切り上げ整数化）1減算しeTalに格納する
		$eTal = ceil($iData/$iMax)-1;

		//sRowが0の場合
		if($sRow == 0){

			//eTalが４以上のとき４、４未満のときeTalをeRowに格納する
			$eRow = ($eTal >= 4) ? 4 : $eTal;

		//sRowが1でeTalがsRow + 2以上の場合、sRowに0を格納し、eRowに4を格納する
		}elseif($sRow == 1 && ($sRow + 2) <= $eTal){
			$sRow = 0;
			$eRow = 4;

		//eTalがsRow + 2以上でsRow - 2が0以上の場合、sRowにsRow - 2を格納し、eRowにsRow + 2を格納する
		}elseif(($sRow + 2) <= $eTal && ($sRow - 2) >= 0){
			$eRow = $sRow + 2;
			$sRow = $sRow - 2;

		//sRow + 4がeTal以上の場合、sRowにeTal - 4を格納する
		//sRowがマイナスの場合は0、それ以外はeTal - 4を格納する
		//eRowにeTalを格納する
		}elseif(($sRow + 4) >= $eTal){
			$sRow = $eTal - 4;
			$sRow = (($eTal - 4) < 0) ? 0 : $eTal - 4;
			$eRow = $eTal;
		}

		//sRowからeRowまでループ
		for(;$sRow <= $eRow;$sRow++){

			//現在値とsRowが一致する場合
			if($iPresent == $sRow){

				//カレント表示
				$html .= "<strong>".($sRow + 1)."</strong>｜";
			}else{

				//ナビゲーション
				$html .= "<a href=\"?".$sNofuture."=" . $sRow . $sQuery."\">".($sRow + 1)."</a>｜";
			}
		}
	}
	return $html;
}
?>
}
Firefox用Qiita検索プラグイン

Firefoxの右上の検索ボックスでQiita内の検索を行うためのプラグインを作ってみた。vimperatorであれば`qiita [keyword]`で検索できるようになった。

```xml:qiita.xml
<?xml version="1.0" encoding="utf-8"?>
<SearchPlugin xmlns="http://www.mozilla.org/2006/browser/search/">
    <ShortName>Qiita</ShortName>
    <Description>Search by Qiita</Description>
    <InputEncoding>utf-8</InputEncoding>
    <Image width="16" height="16">http://qiita.com/favicon.ico?v=3</Image>
    <Url type="text/html" method="GET" template="http://qiita.com/search">
        <Param name="q" value="{searchTerms}" />
    </Url>
</SearchPlugin>
```

- macの場合は`~/Library/Application Support/Firefox/Profiles/xxxxxxxx.default/searchplugins/`以下に上のファイルを保存し、firefoxを再起動。（xxxxxxxxの部分はランダム）
- githubみたいにQiitaもプラグインをブラウザに認識させるとcoolだと思う。

![github-plugin](https://dl.dropbox.com/u/1235413/add-github-plugin.png)

- これは以下のような感じでできるらしい（未確認）。

```html
<link
    rel="search"
    type="application/opensearchdescription+xml"
    title="Qiita検索プラグインを追加"
    href="http://qiita.com/searchplugins/qiita.xml" />
```

### 追記（9/5）
- githubのソースを確認したら上のような箇所があった。

```html
<link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub" />
```

- xmlも上で紹介した形式とほぼ同じだった。

```xml:opensearch.xml
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/"
                       xmlns:moz="http://www.mozilla.org/2006/browser/search/">
  <ShortName>GitHub</ShortName>
  <Description>Search GitHub</Description>
  <InputEncoding>UTF-8</InputEncoding>
  <Image width="16" height="16">data:image/x-icon;base64,
  iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ
  bWFnZVJlYWR5ccllPAAAAVpJREFUeNqM0s0rRGEUx/F7x0RKxob4A6bZKBYWFkLZqIkkC7FUsrCw
  oCxsZcN/IFmIP4E9ZWnyurBR3krZeH8b1/dMv5vTpDue+szzzL33nJ5znieIoihIGCGmMIt0+ctS
  bIUETbhHEbm/EqSD5PGOC2TwgHo04xaPv9tIHhbUoPUMXjAcx4aln9BKDcYxgRR20IJNDKEO69hC
  Fie2JnYx3sGYJcQ5jrU2PTjEDbpwpeeXWPZN3NOLnLb8hm1UoaBAG3P6btR26pt4rblDDarRs6KO
  Mh7fmr/idZxgAW3Y0H/r/IqCfYKU5o/yB1b7kY5tGp04Uwmh++5Vcx59PoGNWtV3pznQXK2SbLf7
  6s8kVv09yLpGRro0SwoawIgrt1fNzPtT2FVd/WjVCdiL9qQb5k8ho3Ia8eTKea50TeMd2LZOXQmf
  mP9PrL/K3RjURTrAmk4lMcGPAAMAEvmJGW+ZZPAAAAAASUVORK5CYII=</Image>
  <Url type="text/html" method="get" template="https://github.com/search">
    <Param name="q" value="{searchTerms}"/>
  </Url>
  <moz:SearchForm>https://github.com/search</moz:SearchForm>
</OpenSearchDescription>
```

---

### 環境
- osx mountain lion
- firefox 14

---

### 参考
- http://webos-goodies.jp/archives/50835795.html
NeocomplcacheでAutoHotkeyのInclude補完をしようとしたけどできない(できるようになりました)

AutoHotkeyでInclude補完できたらどんなに嬉しいだろうか。
ということで取り組んでいるのだけれども、なかなかうまくいかない。
そんなことをTwitterでつぶやいていたら
Neocomplcacheの作者さんである@ShougoMatsuさんからリプライを頂いたので、
今回このような場所で現状報告させてもらおうという感じです。
解決したらここに追記でもしようと思っています。

#2012/09/05 1:57 追記
**できるようになりました**
遅い時間までわざわざ@ShougoMatsuさんがTwitterでやり取りしてくれて原因が判明しました。
ユーザーの立場としては**Neocomplcacheを最新版(2012/09/05)にする**ことで、
この記事に書いてある問題は**解決**します。
@ShougoMatsuさんありがとうございました。

以下はこんな問題もあったということで**過去の話**です。


***


##本題(解決済み)
Vim標準のInclude補完`<C-x><C-i>`ではちゃんと候補がでるのだが、
Neocomplcacheではでてくれない。
Neocomplcache一本で補完したいものである。

例えば、以下のようなahk(AutoHotkey)ファイルを作成したとき、
`<C-x><C-i>`でVim標準のInclude補完ができる(Libフォルダの中にあるFileClass.ahkの中身に記述した関数等)のだが、
Neocomplcacheでは出てくれないといった感じである。

ちなみに自分のvimrcのNeocomplcacheに関する部分は
[vimrc(github)](https://gist.github.com/3622313)
に置いておきました。

```autohotkey:App_RunGVim.ahk
/*
Autohor TAKE Takashi
URL https://github.com/take-takashi
*/
Main()
return

#include Lib/FileClass.ahk

/*
gvimを起動する
*/
Main()
{
    _gvimPath := "gvim.exe"
    ;_gitPath  := "..\..\Git\PortableGit\bin"
    _file := new FileClass("..\..\Git\PortableGit\bin")
    _gitPath := _file.getFullPath()
    SetWorkingDir, %A_ScriptDir%
    
    ;set HOME=%CDDIR%HOME
    ;set PATH=%PATH%;W:\Software\Git\PortableGit\bin
    EnvSet, HOME, %A_WorkingDir%\HOME
    EnvSet, PATH, %PATH%;
    MsgBox, % HOME "`n" PATH

    ;Run, %_gvimPath%
}
```
プログラム初心者です。

差し支えなければご回答頂きたいです。

・Visual C#を使ってプログラムの勉強とツールの開発を行う予定です
・macbookpro メモリ4GBを使っています。
・Windowsは持っていません。

そこで、macでもC#開発が出来るというMonomacをインストールした後、
VisualC#2010をダウンロードしようと思っても
.exeのファイルが実行出来ません。
やはり、winのosをmacにインストールしてからの方がいいのでしょうか？

ネットを叩いても解答が無かったのでこちらで質問させて頂きました。

また、Windowsを使う際、お名前.comのリモートデスクトップを使っても開発は出来ますでしょうか？

時間等余裕がありましたらご回答お願いしたいです。
rails-shを使って高速railsサブコマンド & rakeタスク実行

https://github.com/jugyo/rails-sh を使うとrakeコマンド実行やrails g XXXが高速に実行できて捗る．

## インストール
```bash
$ gem i rails-sh
```

## 実行
```bash
$ rails-sh
rails-sh(qiita)> rake routes
rails-sh(qiita)> rails g migration xxxx
```

実行してみれば早さがわかると思います．
簡単ですが初めて知ったときライフチェンジングだった&あまり使っている人を見ないので紹介．
文字列をホワイトスペースで分割する


##内容
与えられた文字列を連続する（かもしれない）半角スペースか全角スペースで分割して配列で返してくれる。

##使いどころ
アンド検索でキーワードを取得したいとき

##結果
"堀口　イケメン" ー＞ [堀口,イケメン]

##コード

こちらは、正規表現を利用した方法です。

**下に別アプローチのコードも記載してあります**  
そちらの方がこの場合、スマートかもしれないです。

    - (NSArray *)keywordsFromString:(NSString *)aString
    {
        NSRegularExpression *regexp =
        [NSRegularExpression regularExpressionWithPattern:@"([^ 　]+)"
                                                  options:0
                                                    error:nil];
        
        NSArray *matches = [regexp matchesInString:aString options:0 range:NSMakeRange(0, aString.length)];
        NSMutableArray *searchWords = [NSMutableArray arrayWithCapacity:matches.count];
        for (NSTextCheckingResult *result in matches)
        {
            [searchWords addObject:[aString substringWithRange:[result rangeAtIndex:1]]];
        }
        
        return searchWords;
    }

##おことわり
ちゃんと出来てるかわからん

##追記(2012/09/05)

コメント欄にて他のアプローチを教えて頂きました。
簡単に試しましたが、こちらの方がスマートだと思います。


----
NSString#componentsSeparatedByCharactersInSet: 
NSArray#filteredArrayUsingPredicate:
をつかった方法

    - (NSArray *)keywordsFromString:(NSString *)aString
    {
        NSArray *components = [aString componentsSeparatedByCharactersInSet:
                               [NSCharacterSet characterSetWithCharactersInString:@" 　"]];
        return [components filteredArrayUsingPredicate:
                [NSPredicate predicateWithFormat:@"self != \"\""]];
    }

tanBさん、
uasiさん　有り難うございます！
Rubyの 3.times { puts 'foobar' } みたいなのをJSでも使いたい

Rubyの 3.times { puts 'foobar' } って良いよなぁ、、、じゃ、JavaScriptだと、どんな感じで書けるかなぁ、と思って試してみた。

たとえば、下記のように書くと、times(n)(fn) って書き方ができます。

```
function times(n) {
    return function (fn) {
        for (var i = 0; i < n; i++) {
            fn(i, n, arguments)
        };
    }
}　
```

まぁ、3.times { puts 'foobar' } の簡潔さにはかないませんが、
たとえば、こう書くと、、、

```
times(3)(function(i,n){ console.log(i+'/ '+n) });
```

こうなります。

```
0/ 3
1/ 3
2/ 3
```

#テストと結果

```
ソース
function times(n){return function(fn){for(var i=0;i<n;i++){fn(i,n,arguments)}}}　

==================================================
テスト
times(3)(function(i,n){console.log(i+'/ '+n)});

結果
0/ 3
1/ 3
2/ 3

==================================================
テスト
times(3)(function(i,n){
　　console.log('----------')
　　console.log(i+'/ '+n)
});

結果
----------
0/ 3
----------
1/ 3
----------
2/ 3

==================================================
テスト
times(3)(function(i,n,a){
　　console.log('----------')
　　console.log(i+'/ '+n)
　　console.log('arg: '+a[1])
　　console.log('arg: '+a[2])
  },
  'argA',
  'argB'
);

結果
----------
0/ 3
arg: argA
arg: argB
----------
1/ 3
arg: argA
arg: argB
----------
2/ 3
arg: argA
arg: argB
```

もっと、良い手はないかなぁ。
経緯はここhttps://www.facebook.com/javascripting/posts/361845213890046

----
#追記

2012/09/05 ukyoさんのコメント見てネイティブNumber拡張に手を染める誘惑によろろっと負けてみました。

```
Number.prototype.times = function (fn) {
  var n = this.valueOf();
  if(fn) for(var i = 0; i < n; i++) {
    fn(i, n, arguments)
  };
}　
```

これは、たとえば、こう書くと、、、

```
3..times(function(i,n){ console.log(i+'/ '+n)})
```

こうなります。

```
0/ 3
1/ 3
2/ 3
```

でもまぁ、これはあくまでネイティブいじってることを自覚しつつ、使用する場合はご注意ください。もし、将来のJS仕様/実装などとぶつかればアウトです^^;

ちなみに、、、

```
>"times(n)(fn)".length
12
>"n..times(fn)".length
12
```
Sublime Text2の複数カーソルの使い方


## 複数カーソルとは
Sublime Text2では複数のカーソルを出して複数の箇所を同時に編集できます。
その基本的な使い方をまとめました。

## ソースコード内の複数の単語を変更する
[公式ページ](http://www.sublimetext.com/)の1番目の例です。複数箇所に存在する単語を別の文字列に置き換えてみます。
全てのdouble型の変数をfloat型に変換してみます。

```C#:編集前
public class Test {
	private double aaa;
	private double bbb;
	public double ccc;
}
```

```C#:編集後
public class Test {
	private float aaa;
	private float bbb;
	public float ccc;
}
```

1. 変更したい対象の単語(double)にカーソルを合わせて**Cmd+D**を押す
2. この状態で編集対象の選択モードになる。**Cmd+Ctrl+G**で同じ単語をすべて選択する
3. すべての"double"に入力カーソルが作成されるので"float"を入力する

!["st01"](http://dl.dropbox.com/u/289852/qiita/02/st01.png)

### tips
 * escで単一のカーソルに戻る
 * **Cmd+D**でフォーカスが当たっている要素を選択状態にして次の要素へ(**Cmd+Shift+G**で前の要素へ)
 * **Cmd+L**でカーソルの1行を選択状態にする
 * **Cmd+D**で単語を選択状態にする
 * **Cmd+G**でフォーカスを移動(単一の選択のみ)
 * **Cmd+Ctrl+G**でフォーカスが当たっている単語と同じ単語をすべて選択
 * **Shift+Ctrl+UP**で上の行を選択状態にする
 * **Shift+Ctrl+DOWN**で下の行をを選択状態にする

## 複数行をまとめて編集する+α
[公式ページ](http://www.sublimetext.com/)の2番目の例です。改行されている複数の文字列の前後にダブルクォートを追加し、コンマを追加して、鍵括弧を前後に追加するということをやっていました。同じ操作をやってみます。

```JavaScript:編集前
Mon
Tue
Wed
Thu
Fri
Sat
```

```JavaScript:編集後
date = ["Mon","Tue","Wed","Thu","Fri","Sat"]
```

1. **Cmd+A**ですべて選択
2. **Cmd+Shift+L**で選択中の要素の末尾にカーソルを作る
3. **Ctrl+A**で行頭に戻りダブルクォート(")を入力
4. **Ctrl+E**で行末に移動してダブルクォート(")とカンマ(,)を入力
5. **fn+delete**で改行を削除
6. **Esc**で複数行編集モードを抜ける
7. **Control+E**で末尾に戻り、最後のカンマを消す
8. **Cmd+L**で1行選択し、開きかっこ([)を入力する。同時に閉じ括弧(])も入力される
9. **Ctrl+A**で行頭に戻って変数名とイコールを入力

!["st03"](http://dl.dropbox.com/u/289852/qiita/02/st03.png)

## 検索した結果を使って編集する
カンマ区切りになっているテキストに対して、カンマの後にスペースを挿入したいケースを考えます。
こういう場合は検索した結果から複数のカーソルを作成し、編集すると便利です。


```JavaScript:編集前
date = ["Mon","Tue","Wed","Thu","Fri","Sat"]
```

```JavaScript:編集後
date = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
```

1. **Cmd+F**で検索バーを開く
2. テキストボックスにカンマ(,)を入力する
3. マッチしたもの全てを**Cmd+Ctrl+G**で編集状態にする
4. **Esc**で検索バーを閉じる
5. カンマとスペースを入力する

!["st04"](http://dl.dropbox.com/u/289852/qiita/02/st04.png)

###tips
* 置換と違うのは入力時に補完が効くところ。長いクラス名や型名を置換するときに便利です
* 検索バーを出した状態で**Cmd+Alt+R**を押すと正規表現も使えます

!["st02"](http://dl.dropbox.com/u/289852/qiita/02/st02.png)
良い感じにウィンドウ分割

Vim では，ウィンドウを`:split`で水平分割，`:vsplit`で垂直分割できます．コマンドであれば `<C-w>s` や `<C-w>v` がそれに当たります．
一般的には今カーソルが居るウィンドウを見て水平分割にするか垂直分割にするかを考え，コマンドを使い分けなければいけません．そこで，ウィンドウの縦幅と横幅を見て少し賢く分割するコマンドを作ってみました．

```vim
" 横幅と縦幅を見て縦分割か横分割か決める
command! -nargs=? -complete=command SmartSplit call <SID>smart_split(<q-args>)

function! s:smart_split(cmd)
    if winwidth(0) > winheight(0) * 2
        vsplit
    else
        split
    endif

    if !empty(a:cmd)
        execute a:cmd
    endif
endfunction
```

`:SmartSplit` とすると，現在カーソルが横長のウィンドウにいる場合は垂直分割，縦長のウィンドウにいる場合は水平分割されます．
また，`:SmartSplit {cmd}` とすると分割で新しく作ったウィンドウ内で `{cmd}` を実行します．例えば，`:SmartSplit edit ~/hoge` とすると，分割後に `~/hoge` を開きます．

ウィンドウをどう分割するかはケースバイケースで，細長く分割したほうが良い場合もあるので，この開き方がベストとは限りません．しかし，普段分割するときはそこまで考えなくても良い場合が多いので，何も考えなくても良い感じに分割してくれるコマンドがあったほうが便利です．

`<C-w><Space>` にはデフォルトでは何も割り当てられていないので，

```vim
nnoremap <silent><C-w><Space> :<C-u>SmartSplit<CR>
```

という感じに設定しておくと便利かもしれません．
XOOPS Cube File upload

XOOPSの標準クラスのテーマフォームを使用してフォームの作成を行う場合のサンプルを例示します。主に管理画面等でフォームが必要になった場合に使います。今回はその中でも、ファイルのアップロードが必要になった場合のフォーム作成方法についての解説です。

```
$form = new XoopsThemeForm(_AD_MULTIMENU_EDITIMENU, "editform", "index.php");
$form->setExtra('enctype="multipart/form-data"');
$formFile = new XoopsFormFile(_AD_MULTIMENU_FILE, "uploade_file_name", 500000);
$form->addElement($formFile, false);
$form->addElement($submit_button);
$form->display();
```

1行目：フォームタグの名前とPOST先を設定
2行目：アップロードするのでformタグにマルチパートを指定
3行目：アップロード用のフォームを作成（第２＝タグ名、第３＝ファイル上限サイズ）
4行目：フォームに作成したエレメントを追加
5行目：サブミットボタン追加
6行目：フォーム描画実行

POST先の処理例

```
if ($_FILES) {
	include_once XOOPS_ROOT_PATH . '/class/uploader.php';
	$allowed_mimetypes = array('image/gif', 'image/jpeg', 'image/pjpeg', 'image/x-png', 'image/png');
	$maxfilesize = 500000;
	$maxfilewidth = 120;
	$maxfileheight = 120;
	$uploader = new XoopsMediaUploader(XOOPS_ROOT_PATH . '/modules/multimenu/images', $allowed_mimetypes, $maxfilesize, $maxfilewidth, $maxfileheight);
	if ($uploader->fetchMedia('uploade_file_name')) {
		if (!$uploader->upload()) {
			echo $uploader->getErrors();
		} else {
			$_POST['image'] = $uploader->getSavedFileName();
			echo '<h4>File uploaded successfully!</h4>';
			echo 'Saved as: ' . $uploader->getSavedFileName() . '<br />';
			echo 'Full path: ' . $uploader->getSavedDestination();
		}
	} else {
		echo $uploader->getErrors();
	}
}
```

$_FILES が設定されていればコアの uploader.php を使って処理します。
単純に画像の幅と高さを取得したい時 - MiniMagick

* [probablycorey/mini_magick](https://github.com/probablycorey/mini_magick)

```ruby
image = MiniMagick::Image.open( "input.jpg" )

p image[:width]
 # => 1500
p image[:height]
 # => 993
```
Tclでflymakeを使う

# Tclでflymakeを使う
## 準備
- AcitiveStateからTcl Dev Kitを購入する。ここが一番難易度が高いです。
- tclchecker.exeにPATHを通す

## flymake.elを修正する。
warning の文字列定義を修正。他の言語のWanringを完全に殺してしまうので、思い切りが必要です。

```diff
963c963,964
<         (if (and err-text (string-match "^[wW]arning" err-text))
---
> ;       (if (and err-text (string-match "^[wW]arning" err-text))
>         (if (and err-text (string-match "^(warn" err-text))
```

## .emacsに追加
tclcheckerへのオプションはいろいろ試してみましょう。

```common-lisp:.emacs
(require 'flymake)
(setq flymake-allowed-file-name-masks (cons '(".+\\.tcl$" flymake-simple-make-init) flymake-allowed-file-name-masks))
(defun flymake-get-make-cmdline (source base-dir)
  (list "tclchecker" (list "-quiet" "-W3" "-suppress" "nonPortFile" "-suppress" "nonPortCmd"  (concat base-dir source))))
(setq flymake-err-line-patterns
 (cons
  '("\\(.+\\):\\([0-9]+\\) \\(.+\\)" 1 2 nil 3)
  flymake-err-line-patterns))
```

## 実行の様子
![実行中](https://www.evernote.com/shard/s25/sh/5eabd813-8aee-4c4a-8ed8-05d38327a99f/4d95819026aacaa40e6146faa5592eb0/res/f785dbcc-06d7-4550-954c-455af08da5c2/ScreenClip.png)
Python の Singleton


いつも忘れるので。メモとして。(エキスパート Python から引用）

```python:my_singleton_class.py
class MySingletonClass(object):

    def __new__(clsObj, *args, **kwargs):
        if not hasattr(clsObj, "__instance__"):
            clsObj.__instance__ = super(MySingletonClass,
                                        clsObj).__new__(clsObj,
                                                        *args,
                                                        **kwargs)
        return clsObj.__instance__
```

不思議な呪文だ。
Rubyで外部コマンドを実行して結果を受け取る方法あれこれ


全て Windows でも使えます

```
$ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410)
```

## Kernel.#system
サクッと実行したい場合に便利
実行結果(true, false, nil)が返却される

stdin : 渡せない
stdout : 取れない
stderr : 取れない
status : 取れる($? で参照)

``` ruby
system('mkdir hoge') # => true
```

## バッククォート
サクッと実行して、標準出力の内容だけ取れればOKな場合に便利
標準出力が返却される

stdin : 渡せない
stdout : 取れる
stderr : 取れない
status : 取れる($? で参照)

``` ruby
`date` # => "2012年 9月 3日 月曜日 23時59分17秒 JST\n"
# %x[ date ] でも同じ
```

## IO.popen
標準入力にデータを渡して標準出力から受け取りたい場合に使う
IOオブジェクトが返却される
実行できなかった場合は Errno::EXXX が発生する

stdin : 渡せる
stdout : 取れる
stderr : 取れる(コメント参照)
status : 取れる($? で参照)

``` ruby
p IO.popen("cat", "r+") {|io|
  io.puts "foo"
  io.close_write
  io.gets
}
# => "foo\n"
```

## Open3.capture3
標準入出力を使ったデータのやりとりを簡単に使いたい場合に便利
標準出力, 標準エラー, 終了ステータスが返却される
実行できなかった場合は Errno::EXXX が発生する

stdin : 渡せる
stdout : 取れる
stderr : 取れる
status : 取れる

``` ruby
require "open3"

o, e, s = Open3.capture3("echo a; sort >&2", :stdin_data=>"foo\nbar\nbaz\n")
p o #=> "a\n"
p e #=> "bar\nbaz\nfoo\n"
p s #=> #<Process::Status: pid 32682 exit 0>
```

## Open3.popen3
実行中プロセスの標準出力、標準エラー出力をリアルタイムに扱いたい場合に便利
ブロックを渡すことで、実行中プロセスの標準出力、標準エラー出力を扱える

stdin : 渡せる
stdout : 取れる
stderr : 取れる
status : 取れる

``` ruby
require "open3"

Open3.popen3("echo a; sleep 1; echo b; sort >&2; sleep 3") do |i, o, e, w|
  i.write "foo\nbar\nbaz\n"
  i.close
  o.each do |line| p line end #=> "a\n",  "b\n"
  e.each do |line| p line end #=> "bar\n", "baz\n", "foo\n"
  p w.value #=> #<Process::Status: pid 32682 exit 0>
end
```

## systemu
ブロック渡すとバックグラウンド実行してくれたりして色々便利
終了ステータス, 標準出力, 標準エラーが返却される

stdin : 渡せる
stdout : 取れる
stderr : 取れる
status : 取れる

``` ruby
require 'systemu'
date = %q( ruby -e"  t = Time.now; STDOUT.puts t; STDERR.puts t  " )
status, stdout, stderr = systemu date
p [ status, stdout, stderr ]
# => [#<Process::Status: pid 50931 exit 0>, "2011-12-11 22:07:30 -0700\n", "2011-12-11 22:07:30 -0700\n"]
```


### 参考
http://doc.ruby-lang.org/ja/1.9.3/doc/method/Kernel/m/system
http://doc.ruby-lang.org/ja/1.9.3/doc/spec=2fliteral.html#command
http://doc.ruby-lang.org/ja/1.9.3/method/IO/s/popen.html
http://doc.ruby-lang.org/ja/1.9.3/method/Open3/m/capture3.html
http://doc.ruby-lang.org/ja/1.9.3/method/Open3/m/popen3.html
https://github.com/ahoward/systemu
http://d.hatena.ne.jp/ursm/20090625/1245947107