OmniAICreator/Qiita-1.07M huggingface dataset:
Subline Text2 設定集

##Subline Text2 設定

[Subline Text2公式](http://www.sublimetext.com/2 "Subline Text2公式")

### Install しているプラグイン一覧
SublineText2にインストールしているプラグイン一覧を以下に示す。
```IMESupport```
　Text内で変換をしてくれる。
　ただし、グーグル日本語を使うと、日本語か英語かを示すアイコンが表示されて少々見づらい。
　解決方法
　[Google日本語入力で半角全角を押すと表示される「A」「あ」の消し方](http://matome.naver.jp/odai/2137692256369271101 "Google日本語入力で半角全角を押すと表示される「A」「あ」の消し方")
```Japanize```
 　Textのメニューを一部日本語化してくれる。
 　自分でいじることで、すべて日本語可も可能。
```jQuery```
　 jQueryの保管
```HTML5```
   HTMLの補完
```Twitter Bootstrap Snippets```
   Twitter Bootstrap の補完
```Emmet```
　 htmlの高速コーディングツール
　 htmlファイルの先頭行で html:5 ```ctrl```+```E``` だけでも覚えておくと便利
```Hayaku```
　 CSSを早く記述するツール。覚えると、便利
```BracketHighlighter```
   ソースコード中におけるカーソル位置の括弧の対応表示を追加してくれる。
###忘れやすいコマンド
| やりたいこと         | Windows | Mac |
|:--------------------|---------------------------------------------:|:------------:|
| スクリプトの実行      | ```Control``` + ```B```                      |        |
|画面の分割(左右)       | ```Alt``` + ```Shift``` + ```Number```       | |
|画面の分割(上下)       | ```Alt``` + ```Shift``` + ```8```            | |
|矩形選択              | ```Shift```+```右クリック(マウス)```+```移動``` ||
|行選択                | ```Ctrl``` + ```L```                         ||
|コマンドプロンプトを開く| ```Ctrl``` + ```Shift``` + ```P```           ||
|ブックマーク          | ```Ctrl``` + ```F2```　(F2で移動)             ||
|画面の複数化          | ```Alt``` + ```Shift``` + ```Number```       | |
|画面間の移動          | ```Control``` + ```Number```                 ||
@background { } で、気軽にマルチスレッド処理を行う方法

お目汚し失礼致します。
これは[iOS Second Stage Advent Calendar 2013](http://qiita.com/advent-calendar/2013/ios-2#day-23 "iOS Second Stage Advent Calendar 2013")の12月23日分の記事です。

@synchronizedがあるんだから、@backgroundがあっても良いじゃない。
そんな気持ちで書きました。

### 1. マクロを定義します
下記のようなマクロを定義します。
下記のようなもんをマクロとは言わん、という意見は受け付けません。

```objc:background-Prefix.pch
#define background \
try{}@finally{}\
__block void (^backgroundBlock)();\
[[NSOperationQueue mainQueue] addOperationWithBlock:^{\
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{\
        backgroundBlock();\
    });\
}];\
backgroundBlock = ^
```

プリコンパイルドヘッダ（拡張子が.pchって感じのです）に入れれば、
全てのソースファイルから照会できるので使いやすいかもしれません。

### 2. 使います
下記のような感じで使います。

```objc:AppDelegate.m
for (int i = 0; i < 10; i++)
{
    @background
    {
        NSLog(@"%d", i);
    };
}
```

バックグラウンドで処理が行われているので、
結果は「0 1 2 3 4 6 5 7 9 8」とかそんな感じにバラけると思います。

普通に0から9まで表示されることもあると思いますが、
まあそんな時は10回と言わず100回もループすればバラけると思います。

簡潔ではありましたが、24日のサンタ狩りの準備がありますので、
このあたりで失礼させて頂きます。
iOS向けGoogle Analytics v3の設定についてメモ

間違ってたり足りない部分もあるかも知れないが、忘れると何一つ思い出せないため、覚えている範囲でメモ。
あと、Googleの書いてるドキュメントのとおりだとうまくいかない箇所があったので気をつけてください。
 Google Analytics SDK for iOS v3
 https://developers.google.com/analytics/devguides/collection/ios/v3/
trackedViewNameではなくscreenNameを使います。(v2→v3移行ガイドでは正しく書いてあるのですが。https://developers.google.com/analytics/devguides/collection/ios/v3/migration)
2013/12/10

①Hoge-Prefix.pchに追記 (ここに書いておけばすべてのクラスに書かずに済む)

```objc
#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    ...
    // Google アナリティクス
    #import "GAI.h" //※ここを追記 
#endif
```

②AppDelegateのapplication:didFinishLaunchingWithOptions:に書く

```objc
// オプション: 例外を自動的にGoogle Analyticsに送る.
[GAI sharedInstance].trackUncaughtExceptions = YES;
// オプション: トラッキング間隔　20秒
[GAI sharedInstance].dispatchInterval = 20;
// オプション: よくわかんないからコメントアウトした
//[GAI sharedInstance].debug = YES;
// トラッカーのインスタンス作成
id<GAITracker> tracker = [[GAI sharedInstance] trackerWithTrackingId:@"トラッキングIDを記入"];

```


③ビューコントローラーに書く（自動タイプ）

```objc
// GAITrackedViewController.hをインポート
#import "GAITrackedViewController.h"

//UIViewControllerのサブクラスから、GAITrackedViewControllerに変更する
@interface HogeViewController : GAITrackedViewController

//viewDidAppear:に以下の一文を追加
self.screenName = @"HogeViewController";
```

④テーブルビューコントローラーに書く（手動タイプ）
Use of undeclared identifier 'kGAIScreenName' というエラーが出るときは#import "GAIFields.h"も追記する。

```objc
// インポート
#import "GAIFields.h"
#import "GAIDictionaryBuilder.h"

//viewDidLoad:に以下を追加
[[[GAI sharedInstance] defaultTracker] set:kGAIScreenName value:@"HogeTableViewController"];
[[[GAI sharedInstance] defaultTracker] send:[[GAIDictionaryBuilder createAppView] build]];
```


ライブラリの追加もお忘れなく。
mrubyで時間のかかる処理を中断させる

GUIアプリケーション等にmrubyを組み込む時、スクリプトの実行時間に制限を掛けたい場合が少なからずあると思います。スクリプトが走っているスレッドを外部から強制終了する...わけにもいきませんので、インタプリタ側から処理を中断できるようにする必要があります。

簡易的なものですが、これを書いている時点でのmrubyのHEADは `fa4ae7dd4d` では、mruby本体には手を加えなくてもデバッグ用のVMフックを利用することで、このような制限を実装できます。

## 準備

mrbconf.h を編集して、ENABLE_DEBUGのコメントアウトを外します。
この状態でmrubyをビルドすると、`struct mrb_state`のメンバに`code_fetch_hook` という関数ポインタが追加されます。

```ruby:mrbconf.h
/* -DENABLE_XXXX to enable following features */
#define ENABLE_DEBUG		/* hooks for debugger */
```

## サンプル

mrb->code_fetch_hookにセットした関数が、バイトコードが実行されるごとに呼び出されます。
適当にリミットを設け、`vm_hook`の呼び出しが指定した回数を超えたときに例外を投げて強制的に停止させます。

```c
#include <stdio.h>
#include <mruby.h>
#include <mruby/compile.h>

int vm_step_count = 0;
int vm_step_limit = 0;

void 
vm_hook(struct mrb_state* mrb, struct mrb_irep *irep, mrb_code *pc, mrb_value *regs)
{
  if (vm_step_limit > 0)  {
    if (vm_step_count > vm_step_limit) {
      vm_step_count = vm_step_limit = 0;
      mrb_raise(mrb, E_RUNTIME_ERROR, "step limit exceeded");
    }
    vm_step_count++;
  }
}

mrb_value 
mrb_limited_load_string(mrb_state *mrb, const char *source, int limit)
{
  vm_step_count = 0;
  vm_step_limit = limit;
  return mrb_load_string(mrb, source);
}

int main(void)
{
  mrb_state *mrb = mrb_open();
  mrb->code_fetch_hook = vm_hook;
  mrb_limited_load_string(mrb, "loop do; end", 3000);
  mrb_close(mrb);
}
```

実際には、実時間での実行時間で制限したほうが使い勝手は良いと思います。
当然のことながら、C言語で実装されている関数内で時間がかかっている場合には対処できません。
std::string は文字列中の'\0'を許す

知らない人が少なくないみたいだけど、
std::string/std::wstring 文字列中に '\0' / L'\0' を含んでいてもかまわない。
要は単なるchar/wchar_t列なわけで、バッファとして利用可能。

```cpp
#include <iostream>
#include <string>
#include <cassert>

using namespace std;

int main() {
  string hw = "hello";
  hw += '\0';
  hw += "world";
  // string hw("hello\0world", 11) も可。

  assert( hw.size() == 11 );

  cout << '[';
  for ( char ch : hw ) cout << (ch == '\0' ? '_' : ch);
  cout << "]\n";

  // '\0' を境に切り分ける
  string::size_type nullpos = hw.find('\0');
  cout << '[' << hw.substr(0, nullpos) << ']'
       << '[' << hw.substr(nullpos+1)  << ']'
       << endl;
}
```
C# でユニットテストの書き方を学ぶ本

C# でユニットテストの書き方を学ぶ本というと **THE ART OF UNIT TESTING** を紹介するな。洋書だけど。
テストダブルの考え方とかこれで知った。
ユニットテスト必須と言う割りに周りも依存関係の断ち方とか知らなかったので役に立った。モックフレームワークの利用とかでかなり楽になるし。
しかしもうできちゃった所は直せないとかだったのでレガシーコード相手のテストは作られず終りレガシーコードのままメンテナンスモードになったのであった。

http://artofunittesting.com/
http://www.manning.com/osherove2/
AngularJSとAngularJSモジュールでi18nを実現する(1)

Tutorialの流れから少し離れまして、AngularJSにおいて多言語対応する方法に関してレポートです。

Angularを利用することで、サーバ側で実装していたViewレイヤの仕組みをクライアント側に移行できるようになります。
加えて、I18n(Internatinalization)も含めて実現できるように出来る方法を検討するべく、
2回構成でAngularでI18nを実現することをお題にして取りまとめます。
(もしかしたら、3回構成になる可能性もあります)

* 1回目：AngularJSでI18nを実現するモジュールをリストアップ
（[Angular js support for localization](http://stackoverflow.com/questions/12664823/angular-js-support-for-localization) の記事を参考に)
* 2回目：実際にTutorialのスクリプトに組み込みを行う

という流れで進めていく予定です。

#  1回目：AngularJSでI18nを実現するモジュールをリストアップ

## 多言語化する目的

世界地図上で狭い日本国内だけの発信だけではなく、他の国に発信できるようになりたい。というのもありますが、
世界情勢の変化や経済的な状況のもと、ビジネスを大きくするには日本だけでは難しい状況にあること。
などから、Webアプリを作成して楽しむおよび生計を立てるには、多言語でアプリを組む必要性が十分にあるのではないかと個人的に考えます。
また、どうせアプリケーションを作るなら、より多くの人に使ってもらえる仕組みを作るために、はじめから利用言語のLocalizationを考えて作るに越したことはないと思っています。

上記のように記述しましたが、実際のところ多言語で本格的にアプリケーションを作成した経験がないため、
既存のAngularJSモジュールのLocalizationを紹介されていた下記の記事に沿って利用するモジュールを調べてリストアップします。

[Angular js support for localization](http://stackoverflow.com/questions/12664823/angular-js-support-for-localization)

## 3種類の仕組み

上記の記事では3種類の気鋭のクリエイターがモジュールおよび組み方を紹介しています。

1. AngularJSの組み込みディレクティブとサービスで実現するためページ紹介と簡単なサンプルコード紹介
1. [Localizing Your AngularJS app](http://codingsmackdown.tv/blog/2012/12/14/localizing-your-angularjs-app/)
1. [Angular Translator](http://pascalprecht.github.io/angular-translate/)


## AngularJSの組み込みディレクティブとサービスで実現するためページ紹介と簡単なサンプルコード紹介

AngularJSの公式ページの[I18n and L10n in AngularJS](http://docs.angularjs.org/guide/i18n)に、I18nを実現するための解説ページがあります。

$localeサービスを活用する仕組みとして、[datetime](http://docs.angularjs.org/#!/api/ng.filter:date), [number](http://docs.angularjs.org/#!/api/ng.filter:number) and [currency](http://docs.angularjs.org/#!/api/ng.filter:currency) などのフィルタがサポートされているようです。
加えて、[ngPluralize directive](http://docs.angularjs.org/api/ng.directive:ngPluralize)で、データの数に合わせて表示する文字列切り替える仕組みが利用できるようです。
($localeサービスで取得するlocale IDは、[ICU website](http://userguide.icu-project.org/locale)に則っている）

$localeサービスを利用すれば、自前でlocal IDに合わせて様々な表示切替はできそうですが、自前での実装が多くなりそうです。

## [Localizing Your AngularJS app](http://codingsmackdown.tv/blog/2012/12/14/localizing-your-angularjs-app/)

この仕組みは、静的ファイルでもREST apiでも行けるのですが、Angularの仕組みを使わず自前で処理していて、サンプルコードを見た限りでは、Angularの仕組みを使っても同じくらいのコード量で書けるのではないかと考えます。


## [Angular Translator](http://pascalprecht.github.io/angular-translate/)

このAngular Translatorが投稿された中でサイトのボリューが一番あり、ドキュメントも充実していました。
また、サンプルを見た限りでは、Angularの仕組みを使うより、また、上の仕組みを使うよりも自前で記述するコード量が減りそうです。
簡易なページでは、配列でコード中に埋め込むこともできますし、静的ファイルやREST apiも利用できます。
また、デモコードもドキュメントもたくさんあり悩みながらも何とかできそうです。

bowerで落としてくるとAngularは1.0.8に対応しているよう見えたため少し心配ですが、こちらの仕組みを利用して2回目を取りまとめてみる予定です。

以上、記事中の3種類の組み方の紹介から説明ページを参照して作成したレポートになります。

どの仕組みも直接的に文章を置換してくれるものではないので、テンプレート内で表示に関係ないキーワードを埋め込まなければならない方式なので、キーワードの作成方法を少し工夫が必要だ考えています。
ひとまず、AngularでI18nを実現するとどうなるのかのイメージだけでもレポートできればと考えています。
SublimeText2/3でマクロを作り、キーボードショートカットに登録する


# はじめに

SublimeTextのマクロ機能はとても便利です。例えば、テキストのいくつかの行の先頭に「* 」（アスタリスク + 半角スペース）を追加したいとします。

このとき、以下のようなマクロを作ってショートカットに登録しておくと･･

1. 今いる行の先頭に移動
1. 「* 」を追加
1. 1つ下の行の先頭に移動

ショートカットを連打するだけで「* 」を追加したい行すべてに追加することができます。

> この例に関してはマルチカーソルを使う方法もあるので、どちらを使うかは好みによります :)

# マクロを作る

マクロを作るのはとても簡単です。ここでは、上記の例（行頭に「* 」を追加する）をとって進めていきます。

## キャレットを開始位置に移動する

具体的には、「* 」を追加したい行のどこか適当な位置にキャレットを置きます。

## マクロを記録する

Tools > Record Macro をクリックすると、マクロの記録がはじまります。以下のように1つずつ記録していきます。ゆっくりと1つずつ、確実に入力していきます。

1. 「Command + ←」で行頭に移動
1. 「*」「半角スペース」と続けて打つ
1. 「↓」「Command + ←」と続けて打ち、1つ下の行の行頭に移動

最後に、Tools > Stop Recording Macro をクリックして記録を終了します。

## マクロを保存する

Tools > Save Macro... をクリックしてマクロを保存します。このとき、適当な分かりやすい名前を付けておきます。（後で使います）
例: markdown-list.sublime-macro

# マクロをキーボードショートカットに登録する

SublimeTextのキーバインディングは Sublime Text > Preferences > Key Bindings - User でカスタマイズすることができます。例えば、"command + shift + :"に先ほど作ったマクロを登録したい場合は、Key Bindings - User に以下を追記すればOKです。

```
{"keys": ["command+shift+:"], "command": "run_macro_file", "args": {"file": "Packages/User/markdown-list.sublime-macro"}}
```
Go言語でコマンドが実行可能かチェックする


[`os/exec.LookPath`](http://golang.org/pkg/os/exec/#LookPath)を使うと、コマンドが実行可能かチェックできる。`$PATH` を考慮して探してくれるが、スラッシュが入っていると `$PATH` を考慮しない。

```go
package main

import (
	"log"
	"os/exec"
)

func main() {
	tests := []string{
		"hoge",
		"/bin/hoge",
		"./hoge",
	}
	
	for _, test := range(tests) {
		if _, err := exec.LookPath(test); err != nil {
			log.Print(err)
		}
	}
}
```

実行結果

```
2013/12/10 19:18:34 exec: "hoge": executable file not found in $PATH
2013/12/10 19:18:34 exec: "/bin/hoge": stat /bin/hoge: no such file or directory
2013/12/10 19:18:34 exec: "./hoge": stat ./hoge: no such file or directory
```
npm-cli.jsがShellScriptとしてもJavaScriptとしてもWSHとしても実行できてきもちわるい

共用サーバに置いていた`/usr/local/nodejs/bin/npm`が消失するという奇怪な事件が発生した。この問題の原因はわからないが、とりあえず適当に復旧させようとおもって、npm周りを見ていた。npmというコマンドの実体はnpm-cli.jsへのシンボリックリンクになっている。

で、中身を見ていると次のようになっていた。

```js:npm-cli.js
#!/bin/sh
// 2>/dev/null; exec "`dirname "$0"`/node" "$0" "$@"
;(function () { // wrapper in case we're in module_context mode

// windows: running "npm blah" in this folder will invoke WSH, not node.
if (typeof WScript !== "undefined") {
  WScript.echo("npm does not work when run\n"
              +"with the Windows Scripting Host\n\n"
              +"'cd' to a different directory,\n"
              +"or type 'npm.cmd <args>',\n"
              +"or type 'node npm <args>'.")
  WScript.quit(1)
  return
}

process.title = "npm"

var log = require("npmlog")
log.pause() // will be unpaused when config is loaded.
log.info("it worked if it ends with", "ok")
...
```

## ShellScriptとして実行できる

shebangを見るとどう見ても`/bin/sh`である。それなのに、JavaScriptのコードが続いてるではないか。よくよく見ていると2行目が奇妙なことになっていることに気がつく。

```bash:npm-cli.js
#!/bin/sh
// 2>/dev/null; exec "`dirname "$0"`/node" "$0" "$@"
```

`//`で始まってるので、JavaScriptではコメントとして処理される（shebangはどう扱われるんだろう？）。しかし、ShellScriptは`//`でコメントアウトできないため、コマンドとして実行されてエラーになる。エラーになるけど、出力は/dev/nullに送られて、その後のコマンドが実行される。結果として、自分自身のファイル名がnodeコマンドの引数に渡されて実行される。

## WSHとしても実行できる

続きをみると次のようになっている。

```js:npm-cli.js
// windows: running "npm blah" in this folder will invoke WSH, not node.
if (typeof WScript !== "undefined") {
  WScript.echo("npm does not work when run\n"
              +"with the Windows Scripting Host\n\n"
              +"'cd' to a different directory,\n"
              +"or type 'npm.cmd <args>',\n"
              +"or type 'node npm <args>'.")
  WScript.quit(1)
  return
}
```

WScriptというのはWindowsのWSHでしか定義されていないオブジェクトらしく、WSHとして実行されるとエラーメッセージを表示するようだ。

## まとめ

いろんな環境に対応しててすごい。
コード挿入の言語の候補表示をEscキーでキャンセルしたい

ブラウザで「コードの挿入」をするときに ``` を入れると候補が出てきます。

以下の場合にカーソルが動かなくなって不便です

- 指定したくない場合
- 既に入力済みで変更しない場合

Escキーでキャンセルできるようにはならないでしょうか？
JavaScriptのオブジェクトのkeyにnullが使える話



```js
var hash = {};
hash.null = "123";       // プロパティ名として有効
console.log(hash.null);  // "123"
console.log(hash[null]); // "123"

var nullValue = null;         //変数の値がnullでもOK
console.log(nullValue);       //null
console.log(hash[nullValue]); //"123"
```
GuzzleでPHP式配列じゃないクエリ文字列のPOST

GuzzleはPHPのHTTPライブラリです。何とでもデータのストリーミングが可能だったりと、抽象的な設計でありながらも、簡単なことをしたいときは簡単に見えるインターフェースでもあり、とても使いやすくて便利です。

```php
use Guzzle\Http\Client as GuzzleClient;

$client = new GuzzleClient('http://example.com');
$params = array(
    'p' => '123',
    'ps' => array('abc', 'def', 'ghi')
);
$request = $client->post('/action.php', null, $params);
$response = $request->send();
if ($response->getStatusCode() == 200) {
    // 成功
} else {
    // 失敗
}
```

PHPではクエリ文字列で配列を渡したいとき、配列みたいに書きますね。Guzzleではデフォルトでそれを再現してくれます。パラメータに配列を含んでいる上のコードは、以下のボディをPOSTします。

```
p=123&ps[0]=abc&ps[1]=def&ps[2]=ghi
```

これをPHPで受け取るとこのとおり。

```php
var_dump($_POST['ps']);
/*
array(3) {
  [0] =>
  string(3) "abc"
  [1] =>
  string(3) "def"
  [2] =>
  string(3) "ghi"
}
*/
```

ところが、HTTPの通信相手がPHPとは限りません。PHPでない場合、重複キーありありの場合もあります。

```
p=123&ps=abc&ps=def&ps=ghi
```

この形式でクエリ文字列を作りたい場合、クエリ文字列コレクションオブジェクト `Guzzle\Http\QueryString` のパラメータ収集に、`Guzzle\Http\QueryAggregator\DuplicateAggregator` を使います。実はパラメータ収集の動作は `PhpAggregator` オブジェクトがデフォルトだというだけで、簡単に交換可能になっているのです。

まず、GETパラメータの場合は簡単です。クエリ部が `QueryString` オブジェクトなのでこのとおり。

```php
$request->getQuery()->setAggregator(
    new \Guzzle\Http\QueryAggregator\DuplicateAggregator()
);
```

POSTパラメータの場合が少し厄介で、インターフェースだけ見ていると設定箇所が見えないところに隠れています。`post()` メソッドは `Guzzle\Http\Message\RequestInterface` を返しますが、それはGETと共通のインターフェースであって、ボディを持つPOSTのようなリクエストでは、その正体が `Guzzle\Http\Message\EntityEnclosingRequest` となります。そこに、ボディ用の `QueryString` を得る `getPostFields()` が隠れています。

```php
/* @var $request \Guzzle\Http\Message\EntityEnclosingRequest */
$request = $client->post('/action.php', null, $params);
$request->getPostFields()->setAggregator(
    new \Guzzle\Http\QueryAggregator\DuplicateAggregator()
);
```

はいこれで、リクエストボディを文字列操作で作って渡すなんてする必要ありませんね。

他にも、`CommaAggregator` なんてのもありました。値をカンマでつないでキー重複を避けるみたいです。`QueryAggregatorInterface` はわりと簡単なインターフェースなので、自分用の配列対応を書くこともできます。
requireせずに勝手に読み込まれるとでも思ってるの？


ちょっと挑発的なタイトル使ってみたかっただけです。すみません。

引用するコードなどはRails 4.0.2で。
https://github.com/rails/rails/tree/v4.0.2

ruby2.0.0p247

## なぜ`require`せずにクラスやモジュールが使えるのか？

いや、`require`しているんですけどね。
どこでどのようにやっているかの話。

### どこでしているのか？

またもやAcitveSupportさんです。イケメンですね。

AcitveSupport::Dependencies
https://github.com/rails/rails/blob/v4.0.2/activesupport/lib/active_support/dependencies.rb

詳しい内容は、過去に似たような記事書いてた方がいたので、割愛します。

Rails の自動読み込みの話
http://blog.eiel.info/blog/2013/09/07/autoload-rails/

### どういう仕組みか？

rubyにはみなさんご存知、`method_missing`のほかにも、`const_missing`というmethodがあります。

```ruby:hoge.rb
class Hoge
  def call_const_missing
    Hoge::Moge
  end

  def self.const_missing(const_name)
    p const_name
  end
end

Hoge.new.call_const_missing
#=> :Moge
```

見つからなかったconstがsymbolでもらえます。
これがもらえればなんとか出来そうですね！

実際、そのような仕組みでAS::Dependenciesも`require`をしています。
（もうちょっとゴニョゴニョしてるんですが）

### そういえば、rubyの`autoload`は無くなるのかな?

どうなるのかな。
でも、今のところあんまり使わずに様子見ようって感じかね。

"I strongly discourage the use of autoload in any standard libraries" (Re: autoload will be dead)
https://bugs.ruby-lang.org/issues/5653

ActiveSupport::Autoloadも優秀だと思うけど、path書かないと意図しない読み込みがされたりして怖いんだよね。

## まとめ

* 結局、行き着く先は`require`
* `const_missing`すごいね
* `Kernel.autoload`と`Module.autoload`はなくなるかも？？
XMinDoc: XMindのマインドマップをMarkdownなどに変換できるスクリプトをgem化した


この記事は[ドキュメンテーション Advent Calendar 2013 - Qiita [キータ]](http://qiita.com/advent-calendar/2013/documentation)の9日目の記事・・・でしたが遅刻しましたorz


また、この記事は

[Markdown - マインドマップから全てを紡ぎ出す - XMind+Pandocのドキュメント作成術 - - Qiita [キータ]](http://qiita.com/sky_y/items/b92e9ce4b941545c8af5)

の実質的な続きです。そもそもの背景などはこちらをご覧ください。


## おさらい

マインドマップから様々な文書（Markdownなど）を作成したい。
![XMind to Documents](https://qiita-image-store.s3.amazonaws.com/0/10473/c19666ba-e319-69ee-36e1-b2b09e48c9cb.png "12.11.30_doc_advent.png")


### どうやって？

* Pandocという文書変換ツールをベースに利用する
* それに加えて、XMindファイルをPandocに渡すスクリプトXMinDocを利用する

## インストール

ここが最大の改善点です。だいぶ楽になりました。

### 準備
* [XMind](http://jp.xmind.net/)
	* 最新版(XMind 2013 v3.4.0)では日本語が入力できるようになりました。トピックの日本語入力時に1字だけ変換されないバグも無くなっています。
	* 適当なマインドマップファイルを作ってください。面倒な場合は、[GitHub](https://github.com/sky-y/xmindoc/tree/master/samples)からサンプルファイルをダウンロードしてもOKです。
* Ruby 1.9.3 (2.0は動作未確認です)

### 1. Pandocをインストールする

#### Mac

	brew install haskell-platform
	cabal update
	cabal install pandoc
	
または[パッケージ](https://code.google.com/p/pandoc/downloads/list)をインストール。

#### Linux (Debian/Ubuntu)

	sudo apt-get install pandoc

#### Windows

[パッケージ](https://code.google.com/p/pandoc/downloads/list)をインストール。

インストールの具体的な手順については以下の記事をご覧ください。

* [HTML - 多様なフォーマットに対応！ドキュメント変換ツールPandocを知ろう - Qiita [キータ]](http://qiita.com/sky_y/items/80bcd0f353ef5b8980ee)

### 2. iconvのインストール

#### Mac
	brew tap homebrew/dupes
	brew install libiconv
	brew link --force libiconv 

#### Linux

	wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
	tar zxvf libiconv-1.14.tar.gz
	cd libiconv-1.14
	./configure
	make
	sudo make install


### 3. gemでXMinDocをインストールする

	gem install xmindoc
	
以上です。

## 使い方
	Usage: xmindoc [options] input.xmind
	-o, --output FILE                Output Filename
	-t, --to=FORMAT                  Output formats: markdown, org, html, latex, rst,  ...
	-w, --write=FORMAT               Output formats: markdown, org, html, latex, rst,  ...
	    --pandoc-options=OPTIONS     Pandoc options (Use double quotes like "--atx-headers")
	-h, --help                       Display this screen
	

以下のサンプルファイルは[GitHub](https://github.com/sky-y/xmindoc/tree/master/samples)の `samples/`ディレクトリに置いています。

### 例1 (Japanese: 寿限無) Markdownとして出力
	xmindoc -t markdown -o test1.md samples/test1.xmind --pandoc-options="--atx-headers"

### 例2 (English: Lorem Ipsum) Orgファイルとして出力
	xmindoc -t org -o test2.org samples/test2.xmind

## その他

動いた・動かなかったの報告を歓迎します。

ソースコードは [GitHub](https://github.com/sky-y/xmindoc) に置いています。

質問やPull Request等があればどうぞ。
配列変数の値を見易く表示

Zsh で path (PATH) や fpath などは複数のパスを格納する配列変数です。
配列の内容を確認するときには変数を echo した結果を目で追ったりしますが
要素数が多いと大変です。

そんなときは変数展開フラグの`F`が便利。
配列要素を改行で連結するため、そのまま echo すれば値を行単位で表示できます。
これで要素の抽出や加工がやりやすくなります。

```zsh
% echo $PATH
/usr/local/bin:/bin:/usr/bin:/home/foo/bin:/usr/local/sbin:/usr/sbin:/sbin
% echo $path 
/usr/local/bin /bin /usr/bin /home/foo/bin /usr/local/sbin /usr/sbin /sbin
% echo ${(F)path}
/usr/local/bin
/bin
/usr/bin
/home/foo/bin
/usr/local/sbin
/usr/sbin
/sbin
% echo ${(F)path} | grep local
/usr/local/bin
/usr/local/sbin
```

# 参考
- zshexpn(1) の Parameter Expansion Flags
ラジオボタンのデザインをCSS3の擬似要素で変更する

```css
input[type="radio"] {
    -webkit-appearance: none;
    position: relative;
    margin-right: 5px;
    border-radius: 30px;
    border: 2px solid #736b68;
    -webkit-box-sizing: border-box;
    width: 30px;
    height: 30px;
    background: -webkit-gradient(
        linear,
        left top,
        left bottom,
        from(#fdfdfd),
        to(#d1d1d1)
    );
    vertical-align: middle;
}
input[type="radio"]:disabled {
    border: 2px solid #EEE;
}
/* チェック時は背景色を変更 */
input[type="radio"]:checked {
    background: -webkit-gradient(
        linear,
        left top,
        left bottom,
        from(#aaa),
        to(#ccc)
    );
}

/* チェックの印を:before疑似要素を使って作成 */
input[type="radio"]:checked:before {
    position: absolute;
    left: 50%;
    top: 50%;
    display: block;
    margin: -9px 0 0 -9px;
    -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.5);
    content: "";
    border-radius: 50px;
    width: 18px;
    height: 18px;
    background: -webkit-gradient(
        linear,
        left top,
        left bottom,
        from(#43c915),
        to(#43c915)
    );
}
```
RubyMineを起動したけど、すぐVimに戻ってしまった5つの理由


![32d609bd5db3f5ab22da6087834ff979.png](https://qiita-image-store.s3.amazonaws.com/0/11726/18411c99-be43-c8b2-9145-c27f7e4759fa.png "32d609bd5db3f5ab22da6087834ff979.png")


※AdventCalendar用なので、若干ブログっぽくなりますがお許し下さい。

## はじめに
自分は、以前Vimmerでした。IDEとか正直ちょっと抵抗ある・・・。でもそんな時、同僚がこれでもか！というくらいJetBrainsのIDEをオススメしてきたので試しに、PhpStormとRubyMineをインストールして設定までした上でソッコーでVimに戻ってしまったお話をします。（はい、ほとんどIntellij IDEA関係ないですごめんなさい）

## その１：やっぱり最初はなんでも辛い
「設定とかほとんどいらずに使えるのがJetBraninsのIDEですよ！」という売り文句で営業してきた同僚さん。それならばとインストールして、色々と教えてもらいました。本当に懇切丁寧に教えてくれました。心から感謝したいくらい丁寧でした。

でもね、新しいことはじめるときって結局「最初はなんでも辛い」んですよね。心が折れそうになりました。俺にIDEは使えるのか・・・と。

## その２：「ドラキュラ」っていうスタイルに違和感があった。
これはあれです、「完全に同僚のせい」なんです。なんかだめだった・・・。何故かダメだったんです・・・。※同僚は何も悪いことはしていません。


## その３：同僚のKeybindの設定が神かもしくはカオスだった。
Vimmerの自分としては、Keybindはこだわりたいですね。

「慣れ親しんだKeybindでRubyMineが動くならもしかしたらお互いに幸せなのかもしれない。」とか考えた時期もありました。幻想でしたけどね。

で、聞いてみるとVimmer向けのPluginがあるらしい。さっそくインストール！！が、それだけでは完全なるVimバインドにはならない！カスタマイズが必要だ。

さらにMacを利用している自分としてはEmacsバインドも結構駆使している。いつもの状態にしたいならそこらへんの設定も必要だ。（ちょっと心折れ始めた）

で、その同僚に聞いてみると「自分はVimとEmacのキーバインドを独自にカスタマイズしていますよ？」とのこと。

ほほぅ・・・。

その設定ファイルを見せてもらった。そして心が折れはじめた。

## その４：アップロード同期とか色々事故っていたり、ハマっているのを見ていたらローカル開発の魅力半減した。
自分はいつも開発サーバーにsshログインしてvimで作業しています。
ローカル開発とかいうやつに憧れたりもしましたが、Macvimを使うのは違うし、悶々としておりました。

周りがJetBrainsを使い始めて観察していると、ハマりポイントがJetBrainsにもあることが判明。しかもハマった時に「どこが問題なのかわからない」というオマケ付きらしい。要するに高機能がゆえに場合分けするのが難しいのだ。問題点を特定するのに意外と時間がかかったり、考えなくていいはずの部分まで常に警戒しなければならないのではないかと不安になってしまった。

俺の中で、メリットが薄れてきてしまった・・・。

## その５：急ぎで開発している最中だった。
ほとんどの人が納得してくれるとは思うのですが、エンジニアは常に追われている。ゆったりまったりエディタと遊んでいる時間はあまりない。

さらに自分は余裕を見せれるほど、すごい人間じゃない。いつも精一杯。

するとだ。Vimでやったほうが早いタスクはVimでどうしてもやってしまう。
そこは我慢してIDEを使うべき！という意見ももちろんあるだろうが、ダメだった。俺にはできませんでしたごめんなさい。(´Д⊂ｸﾞｽﾝ

結構な覚悟で挑んだわりには、あっさりVimに戻ってしまった。
完全に心が折れました。ごめんなさい。


## さいごに：本当は「PhpStorm」も「RubyMine」も使いたい
自分のチームというか周りは、最近JetBrains化しはじめており。実際に便利だなー。とかいいなー。と思うことも多いです。それに共通の環境であったほうが会話やコミュニケーションロスが減ってよいと思うので、可能なら俺もJetBrains使いになりたい今日このごろです。

```
誰か、俺にRubyMineかPhpStormを教えて下さい。
```
railsのf.data_selectで誕生日を「◯年◯月◯日生まれ」の形式で表示

```erb
<%== sprintf(
 f.date_select(:birthday, :use_month_numbers=>true, :date_separator => '%s', :start_year=>1930, :end_year => Time.now.year, :default =>'1990-1-1'.to_date), '年','月') + '日生まれ' %>
```
Dockerに対応したCentOS6.4のboxをPackerで作成する


## 前提

packer, vagrantがインストールされていること

## 作成

```
git clone https://github.com/chilicat/packer-tempates.git
cd packer-templates/centos-6.4-docker
packer build template.json
```


## Boxの取り込み

```
vagrant box add centos6.4_docker vagrant_virtualbox_virtualbox.box
```
仕様書リポジトリにデータサンプルを入れたらテストが捗った話

仕様を別途検討する必要があるようなプロジェクト、たとえば別システムとデータをやりとりするようなプロジェクトに使えるかもしれないテクニック

仕様書用のリポジトリを作成する
------------------------------

* API仕様、jsonフォーマット仕様などを検討しそれらをドキュメント化しリポジトリに格納する。
* 仕様変更はプルリクにより提案を行う。
* 定期的(朝会など)に確認してプルリクがたまりすぎないようにする。

データサンプルをリポジトリに格納する
------------------------------------

* jsonのデータなどを実際に格納してみる。
* 格納されたデータを元にテストを作成する。
* 実際のプロダクトから、仕様書リポジトリを git submodule でサブモジュールとして登録しておく。

データ変換なんかが伴うようなケースとかに特に有効だった

モックをリポジトリに格納する
----------------------------

※これは試してない。要検討

* 想定してるシナリオに応じた簡単なモックサーバースクリプトを作成してリポジトリに入れる
* 想定してるシナリオに応じたアクセス用のテストを作成してリポジトリに入れる

生きたシナリオ、生きた仕様書というのが可能かもしれない。
Go言語でオブジェクトを作ってみる: オブジェクト・メソッド・コンストラクタなど


# この記事の目的

* Go言語でオブジェクトを作れるようになる
* Go言語でメソッドを定義できるようになる
* Go言語でコンストラクタを定義できるようになる

# オブジェクトを作る

Go言語ではクラスと呼ばれるものはないらしい。

```go:main.go
package main

import (
	"log"
)

type Money struct {
	amount   uint
	currency string
}

func main() {
	money := &Money{120, "yen"}
	log.Printf("%#v", money)
}
```

実行してみる

```
go run main.go                                                                                                                                     
```

結果

```
2013/12/10 17:28:49 &main.Money{amount:0x78, currency:"yen"}
```


# クエリメソッドを定義してみる

状態を変更しないクエリメソッド `Format` を定義する:

```go:main.go
package main

import (
	"fmt"
	"log"
)

type Money struct {
	amount   uint
	currency string
}

func (this *Money) Format() string {
	return fmt.Sprintf("%d %s", this.amount, this.currency)
}

func main() {
	money := &Money{120, "yen"}
	log.Printf("%#v", money)
	log.Print(money.Format())
}

```

実行しての結果

```
2013/12/10 17:30:41 &main.Money{amount:0x78, currency:"yen"}
2013/12/10 17:30:41 120 yen
```

# コマンドメソッドを定義してみる

状態を変更するコマンドメソッド `Add`  を定義する:

```go:main.go
package main

import (
	"fmt"
	"log"
)

type Money struct {
	amount   uint
	currency string
}

func (this *Money) Format() string {
	return fmt.Sprintf("%d %s", this.amount, this.currency)
}

func (this *Money) Add(that *Money) {
	this.amount += that.amount
}

func main() {
	money := &Money{120, "yen"}
	log.Print(money.Format())
	money.Add(&Money{180, "yen"})
	log.Print(money.Format())
}
```

実行しての結果

```
2013/12/10 17:34:41 120 yen
2013/12/10 17:34:41 300 yen
```

# コンストラクタを作る

Go言語ではJavaのコンストラクタ的なものはないみたい。代わりにファクトリー関数を定義する

```go:main.go
package main

import (
	"fmt"
	"log"
)

type Money struct {
	amount   uint
	currency string
}

func NewMoney(amount uint) *Money {
	return &Money{amount, "yen"}
}

func (this *Money) Format() string {
	return fmt.Sprintf("%d %s", this.amount, this.currency)
}

func (this *Money) Add(that *Money) {
	this.amount += that.amount
}

func main() {
	money := NewMoney(120)
	log.Print(money.Format())
	money.Add(NewMoney(180))
	log.Print(money.Format())
}
```

実行結果:

```
2013/12/10 17:40:33 120 yen
2013/12/10 17:40:33 300 yen
```
OpenStreetMapにおける子育て系タグ


今年、めでたく子供を授かりました。
おかげさまで無事すくすくと育っており、そろそろ一緒に外出したりする機会ができてきています。
ただ、世の中には思ったより、授乳やオムツ替えをできる場所の明示がありません。

子育て系のNPOさんががんばって集めてくださっているようなので、もしかしたら地区センターなどに紙媒体であるのかもしれません。

2014年はそういう組織さんにもOpenDataの考え方が浸透して、一緒にOSM情報を入れてゆく活動に着手できたらいいな、と思っています。
純粋に、僕が情報欲しいので。

と、いうところで、OSMにおける子育て系タグを見てみたのですが、こちらも思った以上にスキーマが無くて吃驚します。
[Alyssaさんではありませんが](http://www.slideshare.net/apw217/sotm-openthreadsfinal)、OSMは男の世界？というのを実感します。

とりあえずここに、子育て系のタグをいくつか書いておきます。

# [childcare 2.0のカバー範囲内](http://wiki.openstreetmap.org/wiki/Proposed_features/childcare2.0)
2013年に`amenity=childcare`タグの提案がされましたが、正式タグへの適用投票で否決され、改訂版として提出された2.0のRFCもまだプロポーザル段階です。

OSM wikiで定義されている内容は以下のとおりです。
現在のOSMでは幼児の受け入れ施設として`amenity=kindergrten`しか定義が無いので、それを拡張しよう、という試みになっています。
基本的に、幼稚園や保育園など、幼児の面倒を見てくれる受け入れ施設のためのタグセットとなっています。

|Key|Value|概要|
|:----------|:-----------:|:-----------|
|after_school:capacity|*|この施設で受け入れ可能な学童保育の最大数
|after_school:opening_hours|*|学童保育を行っている対応時間
|after_school|yes/no |学校が終わった後、親が迎えに来るまでの間、この施設で面倒を見てくれるかどうか。<br>宿題をさせる施設もあるし、遊ばせている施設もある。ドイツでは一般に "Hort"と呼ばれる。(日本だと、いわゆる学童保育) <br>このサービスは主に、小学校の児童を対象に行われている。
|age_group|*|この施設で対応してくれる幼児の年齢。Proposed features/|age groupで提案されている内容
|childcare:capacity|*|この施設で受け入れ可能な幼児の最大数
|denomination|*|宗教(religion)よりも詳しい内容として、宗派についての情報を記入
|name|*|この施設の名称
|opening_hours|*|この施設が幼児の対応を行う時間帯
|operator:type|*|"public" (市や州)</br>"religious"(教会/神社/仏閣)<br> "private"(私企業、法人)
|operator|*|施設を運営する主体の名称 
|orphanage:capacity|*|この施設で受入可能な孤児の最大数
|orphanage|yes/no|孤児を受け入れるための長期的な施設
|pedagogy|*|この施設で採用されている、子供に対する教育方針。<br>"Fröbel", "Montessori", "Freinet", "Waldorf"のいづれかの値が入る
|religion|*|施設がなんらかの宗教主体によって運営されている場合、その宗教を記入
|website|*|この施設のウェブサイト

# [babycareのカバー範囲](http://wiki.openstreetmap.org/wiki/Proposed_features/babycare)

見た限り既存のタグセットが無かったので Tagging MLで相談したところ「イイネ、YOUやっちゃいなYO！」という感じになりました。

と、いうわけで、2013年12月現在、僕が提案して取りまとめ中のタグセットです。
乳幼児と一緒に出かけるときに必要な施設についての定義をスコープにしています。詳しくは上記の提案ページを参照してください。
まさか僕がやることになるとは思いませんでした。。。

|Key|Value|概要|
|:--|:-:|:--|
|changing_table|yes/no|オムツ替えのためのテーブルがあるかどうかを示します|
|baby_feeding|yes/no/room|母乳、あるいは哺乳瓶による授乳が可能な設備があるかどうかを示します。<br>yesだと授乳が可能というだけ、roomだと専用の部屋などがあることを示します<br>電子レンジや温水があるかどうか、というのはあえてスキーマに入れていません
|push chair|yes/no/limited/designated|車椅子と同様のスキーマで、ベビーカーによる通行が可能かどうかを示します

もし他に必要な機能があれば、提案をいただければと思います。

OSMで正式にタグのRFCを通すのはとてもたいへん。。。と思われがちですが、逆に、きちんとドキュメントを作っておくことでタグの表記ゆれが無くなったり、みんなのやり方が統一できたり、メリットは大きいな、と思っています。

来年はこのへんのタグも整理されて、子供と出かけながらマッピングができたらいいなとか思います。(無謀)
[KnockoutJS]フォーム入力中のEnterによるイベントを発生させるには

KnockoutJSの標準のイベントにEnterキー押下のものはありません（今もないはず）。
なので、独自に追加しないといけません。
といってもbindinghandlersから簡単に追加できます。

```js
// knockout初期化前に記述すること
ko.bindingHandlers.executeOnEnter = {
  init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
    var allBindings = allBindingsAccessor();
    // ここではjQueryを使ってますが、イベント拾えれば何でもいいです
    $(element).keypress(function (event) {
      var keyCode = event.which || event.keyCode;
      if (keyCode === 13) { // Enterキーだった場合
        allBindings.executeOnEnter.call(viewModel);
      }
    });
  }
};

var viewModel = {
  search: function () {
    // ここで検索を実行するとする
    alert("けんさく！けんさく！");
  }
}

ko.applyBindings(viewModel);
```

イベントを追加したら、clickなどと同じ感覚でdata-bindに追加してください。

```html
<input data-bind="value: query, valueUpdate: 'afterkeydown', executeOnEnter: search" />
```

これでフォーム入力中のEnterからviewModel.search()が実行されるようになりました。
bindingHandlersはKnockoutJSでゴニョゴニョやろうとすると必ずぶち当たります。
自分もまだよく理解出来ていないので、当面はTipsを載せるだけ・・・。

### jsFiddle

サンプルは以下。
http://jsfiddle.net/nantekkotai/Z5QDf/
pythonのunittestのassertXXX一覧


おぼえ方:勘で書けばだいたいそれらしいものになる

|メソッド|確認事項|初出|
|:--|:-:|--:|
|assertEqual(a, b)|a == b| |
|assertNotEqual(a, b)|a != b| |
|assertTrue(x)|bool(x) is True| |
|assertFalse(x)|bool(x) is False| |
|assertIs(a, b)|a is b|2.7|
|assertIsNot(a, b)|a is not b|2.7|
|assertIsNone(x)|x is None|2.7|
|assertIsNotNone(x)|x is not None|2.7|
|assertIn(a, b)|a in b|2.7|
|assertNotIn(a, b)|a not in b|2.7|
|assertIsInstance(a, b)|isinstance(a, b)|2.7|
|assertNotIsInstance(a, b)|not isinstance(a, b)|2.7|

>参考
http://docs.python.jp/2/library/unittest.html
X11 forwarding

# X11 forwarding

X11 forwarding の記事を書いて KMC Web サイトに掲載したので、宣伝です。記事はこちらです:

* [X11 forwarding ー 京大マイコンクラブ (KMC)](http://www.kmc.gr.jp/advent-calendar/ssh/2013/12/10/X11forwarding.html)

こちらの記事は [KMC アドベントカレンダー 2013](http://www.kmc.gr.jp/advent-calendar/) の 10 日目の記事です。さらにその中の SSH 特集の 3 番目の記事でもあります。一応、専門的な説明は避けて (Open)SSH 初心者向けにカンタンな「X11 forwarding の使い道」を紹介しています。よろしければぜひご覧下さい。
Go言語でファイル操作: ファイルを作って書き込む


# この記事の目的

* Go言語でファイルに書き込めるようになる

# 準備

適当に作業用のディレクトリを作る:

```
mkdir ~/Desktop/gofile
cd ~/Desktop/gofile/
```

処理を書いていくGoのファイルを作ってエディタで開く:

```
touch main.go
```



# ファイルに1行書き込む

[`ioutil.WriteFile`](http://golang.org/pkg/io/ioutil/#WriteFile)を使うと1行でファイルの書き込みができる:

```go:main.go
package main

import (
	"io/ioutil"
	"os"
)

func main() {
	content := []byte("hello world\n")
	ioutil.WriteFile("/tmp/go-file", content, os.ModePerm)
}

```

実行する:

```
go run main.go
```

書き込めているか確認:

```
% cat /tmp/go-file
hello world
```

# ファイルに複数行書き込む

```go:main.go
package main

import (
	"io/ioutil"
	"os"
)

func main() {
	content := []byte(
		"hello world\n" +
			"hello world\n" +
			"hello world\n" +
			"hello world\n",
	)
	ioutil.WriteFile("/tmp/go-file", content, os.ModePerm)
}
```


実行する:

```
go run main.go
```

書き込めているか確認:

```
% cat /tmp/go-file
hello world
hello world
hello world
hello world
```

# Raw string literalを使って複数行書き込む

```go:main.go
package main

import (
	"io/ioutil"
	"os"
)

func main() {
	content := []byte(
		`hello world
hello world
hello world
hello world
`)
	ioutil.WriteFile("/tmp/go-file", content, os.ModePerm)
}

```


実行する:

```
go run main.go
```

書き込めているか確認:

```
% cat /tmp/go-file
hello world
hello world
hello world
hello world
```
[KnockoutJS]キー入力値を即座に取得／反映するには

キー入力と同時に文字数をカウントする仕組みが簡単に作れる。
たとえばツイートときに表示されるカウンタの仕組みとかですね。
KnockoutJSだと簡単にできます。

## ひな形

```html
<p>テキスト: <input data-bind="value: userName" /></p>
<p>カウンタ: <span data-bind="text: userNameCount"></span></p>
```

```js
$(function(){

function viewModel() {
    this.userName = ko.observable("入力内容を変えてみて！");
    // computedを利用して文字数を生成
    this.userNameCount = ko.computed({
        read: function () {
            return this.userName().length;
        },
        owner: this
    });
}
ko.applyBindings(new viewModel()); 

});
```

上記のコードでは、テキスト入力後のフォーカスアウトのタイミングでカウンタに反映されます。
これを即時に反映させる方法もあります。

## valueUpdate

```html
<p>テキスト: <input data-bind="value: userName, valueUpdate: 'afterkeydown'" /></p>
<p>カウンタ: <span data-bind="text: userNameCount"></span></p>
```

inputに`valueUpdate:'afterkeydown'`を追加してください。
この状態でテキスト入力を行うと、keydownの直後に変更が反映されて、カウンタもコロコロと変わるようになります。便利ですね。

ついでに`valueUpdate`には以下の3種類があります。

- keyup
- keypress
- afterkeydown

それぞれイベントの起こるタイミングが違います。
公式では`afterkeydown`を推してるみたいだったので、これを使いました。

## computedについて

何気なく使っているcomputedの機能ですが、これがKnockout便利機能のひとつでもあります。
ここではreadだけを用いていますが、write側も実装できます。

```js
this.userNameTrimed = ko.observable("");
this.userName = ko.computed(function(){
  read: function () {
    return this.userNameTrimed();
  },
  write: function (val) {
    // trim済みとして格納
    this.userNameTrimed($.trim(val));
  },
  owner: this
});
```

computed内で変更された値は、双方向データバインディングによって画面側にも反映されます。
フォーム系の実装時にはvalueUpdateとcomputedにはとても助かりました。

### jsFiddle

サンプルはここで動かせます。
http://jsfiddle.net/nantekkotai/L4gSj/
【JavaScript】配列の書き方

こんにちは。

今日は複数回投稿しています。
その分だけ、力にもなってるんじゃないですかね。
皆さんからのコメント、毎回うれしく思います。

今回はちょっとメモ。
どうしても配列とくると、なんか色んな書き方
(ないのだろうけど、僕の中では()や{}でこんがらがります。)
メモです。
何よりもまずは基礎ですよね。

・[]でまずは配列を。

```js
var array = [,,,,] ;
```

・インスタンスを生成するやりかた。

```js
var array = new Array(,,,,) ;
```

・生成したのち、添字をつけて指定した箇所に値を格納

```js
var array = new Array() ;
array[] = ~ ;
array[] = ~ ;
...
```

・生成したのち、pushで入れていく方法。

```js
var array = new Array() ;
array.push = ~;
```


そう、前回の記事でまだ見たことないようなことを書いてくださったかたもいたので
それについても調べなければ。

それでは、これからもよろしくお願いいたします。
aws s3 cp filename s3://bucket/path/to/filename に必要な IAM Policy

Jenkins からファイルを S3 に投げ込みたいと思ったので、専用の IAM User を作って、権限を設定しようと思いました。とりあえず `PutObject` だけでー

```json
{
  "Version": "2012-10-17",
  "Statement": [
   {
      "Sid": "PutObject",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::bucket/path/to/*"
      ]
    }
  ]
}
```

と思ったら無念の Access Denied。

```text
$ aws s3 cp filename s3://bucket/path/to/filename
A client error (AccessDenied) occurred: Access Denied
```

aws-cli が中でなにかやってるんですかね。こういう時は --debug オプションをつけて実行。

```text
$ aws s3 cp filename s3://bucket/path/to/filename --debug
2013-12-10 16:34:45,638 - botocore.hooks - DEBUG - Event building-parameter-table.s3.cp: calling handler <function add_cmd_params at 0x00000000032CF908>
（…… 中略 ……）
2013-12-10 16:34:45,670 - botocore.operation - DEBUG - Operation:ListObjects called with kwargs: {'max_keys': 0, 'bucket': u'bucket'}
（…… 後略 ……）
```

どうやら ListObject なる操作をしているようです。しかしそんな権限は [S3 の Actions 一覧](http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingIAMPolicies.html)には存在しないので、代わりに [ListBucket](http://docs.aws.amazon.com/AmazonS3/latest/API/SOAPListBucket.html) を許可してみます。

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ListBucket",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::bucket"
      ]
    }, {
      "Sid": "PutObject",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::bucket/path/to/*"
      ]
    }
  ]
}
```

これで試してみると

```
$ aws s3 cp filename s3://bucket/path/to/filename
upload: .\filename to s3://bucket/path/to/filename
```

できた！！
Go言語でファイル操作: ディレクトリの作り方


# この記事の目的

* Go言語でディレクトリを作れるようになる
* Go言語でパーミッションを指定してディレクトリを作れるようになる
* Go言語でツリー構造のディレクトリを作れるようになる

# 準備

適当に作業用のディレクトリを作る:

```
mkdir ~/Desktop/gofile
cd ~/Desktop/gofile/
```

処理を書いていくGoのファイルを作ってエディタで開く:

```
touch main.go
```

# ディレクトリを作る

ディレクトリの作り方を覚える。`os` モジュールの [`Mkdir`] で作れる。

```go:main.go
package main

import "os"

func main() {
	os.Mkdir("/tmp/go-dir1", 0777)
}
```

実行する:

```
go run main.go
```

できたか見てみる:

```
% ls -la /tmp/                                                                                                                                                         
...
drwxr-xr-x   2 suin           wheel    68 Dec 10 16:04 go-dir1
```

できているが、パーミッションが `755` になっている…

# パーミッション777でディレクトリを作る

上での例は、どうやら umask の設定が反映された結果と思われる。

umaskを復習する:

<blockquote>
(エディタでも touch コマンドでも何でもいいから)ファイルを作成すると、そのファイルのパーミッションは、普通 644 (rw-r--r--) となるはずである。これはもっともな話で、新しいファイルを作るたびにパーミッションが 666 (rw-rw-rw-) や 777 (rwxrwxrwx) になっていては誰でも書き込めてしまい、いちいち chmod しなくてはならず不便である。このように、新規作成したファイル・ディレクトリのパーミッションを決めるのが、umask である。<br>
<br>
umask は、新しくファイルを作成する際に、許可*しない*ビットを示すものである。普通、ファイルの新規作成時はファイルの実行ビット (eXecute) は立てないので、umask が 022 ということは、666 から 022 を引いた 644 というパーミッションで新規ファイルが作られることになる。umask が 002 なら 664 、 umask が 000 なら 666 となる。</blockquote>

出典: http://x68000.q-e-d.net/~68user/unix/pickup?umask

デフォルトの umask値 を確認する:

```
% umask
022
```

Go言語では[`syscall.Umask`]でumask値を変更できる。
一旦、umask値を変更して、0777でディレクトリを作り、umask値を元に戻すように変更したコード:

```go:main.go
package main

import (
	"os"
	"syscall"
)

func main() {
	defaultUmask := syscall.Umask(0)
	os.Mkdir("/tmp/go-dir2", 0777)
	syscall.Umask(defaultUmask)
}

```


実行する:

```
go run main.go
```

777でディレクトリが作成された:

```
% ls -la /tmp/ 
...
drwxrwxrwx   2 suin           wheel    68 Dec 10 16:22 go-dir2
```

# chmodでパーミッションを変える別解

umask値を変えてもいいが、chmodで後からパーミッションを変える方法もある:

```go:main.go
package main

import (
	"os"
)

func main() {
	directory := "/tmp/go-dir3"
	os.Mkdir(directory, os.ModePerm)
	os.Chmod(directory, 0777)
}

```


実行する:

```
go run main.go
```

777のディレクトリが作成された:

```
% ls -la /tmp/
…
drwxrwxrwx   2 suin           wheel    68 Dec 10 16:26 go-dir3
```

# ツリー構造のディレクトリを作る

下記の図のように、親ディレクトリ `/tmp/go-dirs/` を作り、その中に小ディレクトリ `01~10` を作るコードを書いてみる

```
/tmp/go-dirs/
├── 01
├── 02
├── 03
├── 04
├── 05
├── 06
├── 07
├── 08
├── 09
└── 10
```

`os.MkdirAll` を使うと、親ディレクトリがなければ親ディレクトリを作ってくるので、今回はそれを使ってコードを書く:

```go:main.go
package main

import (
	"fmt"
	"os"
)

func main() {
	for i := 1; i <= 10; i++ {
		os.MkdirAll(fmt.Sprintf("/tmp/go-dirs/%02d", i), os.ModePerm)
	}
}

```

実行してみる:

```
go run main.go
```

結果:

```
% tree /tmp/
/tmp/
...
├── go-dirs
│   ├── 01
│   ├── 02
│   ├── 03
│   ├── 04
│   ├── 05
│   ├── 06
│   ├── 07
│   ├── 08
│   ├── 09
│   └── 10
...
```




[`Mkdir`]: http://golang.org/pkg/os/#Mkdir
[`syscall.Umask`]: http://golang.org/pkg/syscall/#Umask
StrutsのActionFormでList型を利用

```java:xxxForm.java
    private List<String> tags = new ArrayList<String>();

/** リクエストパラメータから設定 */
    public void setTags(int index, String value) {
        tags.add(index,  value);
    }
/** getter **/
    public List<String> getTags() {
        return tags;
    }
```
xxx.do?tags[0]=aaa&tags[1]=bbb



```java:xxxForm2

    private List<DataBean> dataObjectList = new ArrayList<DataBean>();

/** リクエストパラメータから設定 */
    public DataBean getDataObjects(int index) {
        while (this.dataObjectList.size() <= index) {
            this.dataObjectList.add(new DataBean());
        }
        return this.dataObjectList.get(index);
    }
/** リクエストパラメータから設定 */
    public Object[] getDataObjects() {
        return dataObjectList.toArray();
    }
/** getter **/
    public List<DataBean> getDataObjectList() {
        return dataObjectList;
    }
```
xxx.do?dataObjects[0].methodA=aaa&dataObjects[0].methodB=bbb
Listの中オブジェクトにする場合はこんな感じらしい
変数はnew ArrayList<E>()しとかないとエラーします
Ceylonでカリー化処理

最近流行のカリー化について書いてみます。

とは言えCeylonが特別って感じでもなく
JavaScriptやScalaな人には普通かも知れないですけど、
Javaな人とかはサラッと見てもらえたらなーと。


ということでCeylonもカリー化処理出来るのです。


まずは普通にメソッド定義

```ceylon

shared Integer sum(Integer x, Integer y) {
	return x + y;
}

````

普通こんな感じですね。
早速定義を変えてみます。


```ceylon

shared Integer sum(Integer x) (Integer y) {
	return x + y;
}

````

どこが変わっての？って思うかもしれませんが
引数が２つの状態から引数１つのパラメータが２回定義されています。

これの呼び出し方法は？

```ceylon

int ans = sum(1)(2);

````

こんな感じになります。


```ceylon

void run () {
	
	Integer(Integer)(Integer) method0 = sum;
	
	Integer(Integer) method1 = method0(1);
	
	print(method1); // -> Integer()
	Integer h2 = method1(2);
	print(h2); // -> 3

	print(method1(3)); // -> 4

}

````

こんな感じに１つずつ渡して行くことも出来ます。


じゃ、何が嬉しいか？
って言うと、良くあるのが
１つ目の呼び出しのときにはWriterを渡して、
２つ目の呼び出しの書き出す内容を渡します。

出力ストリームを渡す処理と書き出す処理を別の場所で行うときも
メソッド内で集約された形で書くことが出来たりします。

便利！！


実はこういう話はScalaの本とかに載ってたりします。。
Ceylonの本は今のとこないので、Scalaの本とかを読んでみると良いかも。

Ceylon押してるはずなのにScalaになっちゃいました。。
以上ですー。

カリー化については自分も初心者なので
間違っていたらツッコミ待ってます！
JenkinsでCocoaPodsを使ったプロジェクトのトラブルシュート


Jenkins上でCocoaPodsを使ったプロジェクトのテストを実施しようと思ったらトラブったのでメモ。

# Jenkins

## インストールするプラグイン

CocoaPodsを使うための`CocoaPods Plugin`があるのでインストールする。

* [CocoaPods Plugin](https://wiki.jenkins-ci.org/display/JENKINS/CocoaPods+Plugin)

## プロジェクト設定

ビルドステップにUpdate CocoaPodsを追加して、Jenkins上のビルド環境にCocoaPodsを導入します。ビルドフェイズの最初（少なくとも実際のビルドを行う前）に入れると良いでしょう。

![スクリーンショット 2013-12-10 13.58.06.png](https://qiita-image-store.s3.amazonaws.com/0/29860/f0008a5f-1526-6973-2c4d-943fcdda4ee1.png "スクリーンショット 2013-12-10 13.58.06.png")

必要に応じて`Clean “Pods” folder`のチェックを付けてください。

![スクリーンショット 2013-12-10 14.01.23.png](https://qiita-image-store.s3.amazonaws.com/0/29860/0f47340c-f46a-9025-a321-d481ea60b811.png "スクリーンショット 2013-12-10 14.01.23.png")

-

# Trouble shooting

## Podfile.lock: No such file or directory

Jenkinsのビルド環境にCocoaPodsがセットアップされていないために起こります。Jenkinsの設定を見なおして、 **アプリケーションビルドより前** にUpdate CocoaPodsのフェイズがあることを確認して下さい。


## xcodebuild: error: The workspace ‘hogehoge’ does not contain a scheme named 'test'.

ビルドスクリプトで指定したスキームが無い場合に発生します。`Manage schemes`を開いて…

![スクリーンショット_2013-12-10_14.06.24-4.png](https://qiita-image-store.s3.amazonaws.com/0/29860/fdaaf7ba-a00a-c8ac-ebeb-df37f09c7230.png "スクリーンショット_2013-12-10_14.06.24-4.png")

該当するスキームの`Shared`をチェックします。

![スクリーンショット_2013-12-10_14.06.39-5.png](https://qiita-image-store.s3.amazonaws.com/0/29860/f3fa5aa6-7fce-3b83-1854-13eae4d68d59.png "スクリーンショット_2013-12-10_14.06.39-5.png")


-

参考

* [CocoaPods Errors on Project Build](http://stackoverflow.com/questions/17072396/cocoapods-errors-on-project-build)
* [xcodebuild says does not containe scheme](http://stackoverflow.com/questions/14368938/xcodebuild-says-does-not-containe-scheme)
StrutsのActionFormで配列を扱う

as3からstrutsで作ったAPIに配列を渡すときにハマったのでメモ。

```java:XxxForm.java
private List<String> tags = new ArrayList<String>();

public String getTags(int index){
	return tags.get(index);
}

public void setTags(int index, String value){
	tags.add(index, value);
}
```
xxx.do?tags[0]=aaa&tags[1]=bbb
のようなアクセスをすればフォームに配列がセットされる。
Vimで履歴参照


### コマンド履歴
`:`を打った後`<C-f>`でOK。

`q:`も同様に参照可能。

### (前方、後方)検索履歴
`/`や`?`を打った後`<C-f>`でOK。
`q/`や`q?`も同様に参照可能。
【commons-lang3】 RandomStringUtils のよく利用する（しそう）メソッド 

メモ

```java

import org.apache.commons.lang3.RandomStringUtils;

public class Main {

	public static void main(String[] args) {

		// 10文字のランダムな文字列生成
		System.out.println(RandomStringUtils.random(10));
		// アスキー文字で 10文字のランダムな文字列生成
		System.out.println(RandomStringUtils.randomAscii(10));
		// 英字で 10文字のランダムな文字列生成
		System.out.println(RandomStringUtils.randomAlphabetic(10));
		// 英数字で 10文字のランダムな文字列生成
		System.out.println(RandomStringUtils.randomAlphanumeric(10));
		// 数字で 10文字のランダムな文字列生成
		System.out.println(RandomStringUtils.randomNumeric(10));
		// 任意の文字で 10文字のランダムな文字列生成
		System.out.println(RandomStringUtils.random(10, "01234567".toCharArray()));
	}
}
```
Vimで直近に触ったファイル間を行き来する方法



`<C-^>`でオルタネートファイルの行き来が可能。
何度押しても行ったり来たりの往復が出来る。

`<C-i>`,`<C-o>`との組み合わせでも似た感じで行き来が出来るが、
それをワンキーで出来るのがメリット。


※オルタネートファイルとは直近に触ったファイルのこと

```
:help alternate-file
```
【commons-lang3】 ToStringBuilder / ReflectionToStringBuilder のよく利用する（しそう）メソッド

メモ

```java


import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

public class Main {

	public static void main(String[] args) {

		// 基本
		System.out.println(ToStringBuilder.reflectionToString(new Main()));
		// フォーマット
		System.out.println(ToStringBuilder.reflectionToString(new Main(),
				ToStringStyle.SIMPLE_STYLE));

		// 一部パラメーターを除外する。
		System.out.println(ReflectionToStringBuilder.toStringExclude(new Main(), "id"));
		// 基本と同等
		System.out.println(ReflectionToStringBuilder.toString(new Main()));
		// フォーマットと同等
		System.out.println(ReflectionToStringBuilder.toString(new Main(), ToStringStyle.SIMPLE_STYLE));
	}
}

```
アプリ内課金のレシートは1つのバイナリになる


最近気づいたんだけど、iOSで使われるアプリ内課金（In-App Purchase）では複数の課金をしてもそれぞれにレシートのバイナリができるわけではなく、複数まとめて1つのバイナリになっている。

もしかしたら同じような勘違いをしている人もいるかもしれない。そうするとサンプルコードが全然違って見えるよという話です。


Appleの公式リファレンスである[レシート検証プログラミングガイド PDF](https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Introduction.html#//apple_ref/doc/uid/TP40010573)によるとレシートの構造はこんな感じらしい。

![レシートの構造.jpg](https://qiita-image-store.s3.amazonaws.com/0/16400/dba7ef88-6b07-daeb-9f77-ca7538c9051b.jpeg "レシートの構造.jpg")

（ちなみにこの図のタイトルはレシートの構造のはずなのに後続と訳されていた）

iOS7より前ではtransactionReceiptがNSDataで取得できるので、アイテムごとにレシートが作られているのかと思っていた。コードとしては次のような感じ

```objc
//このメソッドはオリジナルで
- (void)finishTransaction:(SKPaymentTransaction *)transaction
{
    //iOS6など
    //NSData *receiptData = transaction.transactionDate; //非推奨になった

    //iOS7から
    NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
    NSData *receiptData = [NSData dataWithContentsOfURL:receiptURL];
   
   //...ここでレシートの検証やコンテンツの適用などを行う...//
}
```

iOS7のやり方ではローカルの場所をURLとして取得するだけで、その場所はトランザクションごとに変わっているわけでもない。うちの実機だと下記のような場所がURLとなる。

```
file:///var/mobile/Applications/<何かのUUID>/StoreKit/receipt
```

おそらくiOS7からレシートのバイナリが一つになったわけではないんだろうけど、iOS6以前はtransactionに対してレシートデータが取得できるおかげで変な勘違いをしていた。

ただ、iOS7からレシートはappStoreReceiptURLメソッドで取得できるので、ローカル検証したいときなど特にSKPaymentTransaction経由で取得しなくて良くなったよってことなんだろう（おそらくローカル検証自体もiOS7より前でも出来る、はず）。

日本語に訳されたドキュメントを読んでもイマイチぴんとこなかったんだけど、プロパティを非推奨にしてくれたおかげで勘違いから解放された。
Splunk日本語ドキュメント

##公式ドキュメント

ちょっと古いバージョン(5.0.5)の一部が日本語化されている。
http://answers.splunk.com/answers/92972/splunk%E3%81%AE%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB

Splunk Tutorialが含まれているので、最初に繰り返し読むにはいいかもね。
可変長引数のメソッドにリストを渡す


`toArray(T[] arr) `
を使う

Eclipseなら
`toarray`
で入力補完可能


# 参考
* [java - Trying to pass an arraylist to a varargs method - Stack Overflow](http://stackoverflow.com/questions/9863742/trying-to-pass-an-arraylist-to-a-varargs-method)
* [List (Java Platform SE 7 )](http://docs.oracle.com/javase/7/docs/api/java/util/List.html#toArray%28T%5B%5D%29)
最後にinsertしたシリアルを取得


```
SELECT lastval();
```

insert時にRETURNING idを付加する方法でも行ける

```
INSERT INTO foo(id, name) VALUES(DEFAULT, 'bob') RETURNING id;
```

# 参考
[sql - select/display last inserted serial id in postgres - Stack Overflow](http://stackoverflow.com/questions/3687698/select-display-last-inserted-serial-id-in-postgres)
ヒラギノ角ゴ W1/W2とUIFont

iOS 7にはヒラギノ角ゴ W1/W2が隠されており、CSSで表示する事が出来るとのこと。
http://keagelog.blogspot.jp/2013/10/ios-7-w1w2-css.html

同様に UIFont でも PostScript 名を指定してやると出てくる。

```objc
	label1.font = [UIFont fontWithName:@".HiraKakuInterface-W1" size:30];
	label2.font = [UIFont fontWithName:@".HiraKakuInterface-W2" size:30];
	label3.font = [UIFont fontWithName:@"HiraKakuProN-W3" size:30];
	label4.font = [UIFont fontWithName:@"HiraKakuProN-W6" size:30];
```

検索してもCSSの話ばかりなので、「CSSだけじゃないよ」ということで。

**追記**
これらのヒラギノは ProN で、Pro は入っていないようです。

![8af8237a-10f8-d7e8-5d76-101c75eb7473.png](https://qiita-image-store.s3.amazonaws.com/0/3603/8420d102-32d8-3439-d657-8e03094de523.png)
Assertionの有効化


ソース上に書くだけではだめで、実行時のVMの引数に`-ea`を付ける必要あり

# 参考
* [Enabling Java Assertions per default in Eclipse Runtime Configuration | vogella blog](http://blog.vogella.com/2009/02/06/enabling-java-assertions-per-default-in-eclipse-runtime-configuration/)
* [eclipseでのアサーションの有効化: わからんのなら調べんと](http://shiganaiengineer.seesaa.net/article/260068791.html)
* [assert文を有効にする - tetu1984のブログ](http://tetu1984.hateblo.jp/entry/20080828/1219944589)
【commons-lang3】 CharUtilsのよく利用する（しそう）メソッド 

メモ
書いてみたはいいが使うのか？

```java

import org.apache.commons.lang3.CharUtils;

public class Main {

	public static void main(String[] args) {
		//  アスキー文字か（1byte 文字)
		System.out.println(CharUtils.isAscii('a'));
		// 半角英字か ?
		System.out.println(CharUtils.isAsciiAlpha('a'));
		// 半角英小字か ?
		System.out.println(CharUtils.isAsciiAlphaLower('a'));
		// 半角英大字か ?
		System.out.println(CharUtils.isAsciiAlphaUpper('a'));
		// 半角英数字か ?
		System.out.println(CharUtils.isAsciiAlphanumeric('a'));
		// 半角数字か ?
		System.out.println(CharUtils.isAsciiNumeric('a'));
	}
}
```
psql上でSQLをVimにより編集



```
export PSQL_EDITOR='vim +"set syntax=sql" '
```

と環境変数を設定しておけば
`\e`にてSQLをVimで(シンタックスハイライト付きで)編集出来るようになる。


# 参考
[Quick and dirty Postgres query - Vim Tips Wiki](http://vim.wikia.com/wiki/Quick_and_dirty_Postgres_query)