OmniAICreator/Qiita-1.07M huggingface dataset:
楽しく入力 Razer Nostromo & Wireless Trackball M570(t)のススメ！

みんな！入力してるかい！？

今日は楽しく入力するためのナウなマシンを紹介するぜ！
まずはこれ、Razer Nostromo だ！

Nostromo は左手用16ボタンのゲーミングキーパッドだ！
![images.jpg](https://qiita-image-store.s3.amazonaws.com/0/26030/19fd0757-b0f9-e454-a6e0-ae8d4141e93a.jpeg)

こいつは各ボタンに容易にマクロを割り振ることが出来る。
実験に実験を重ね、自分だけのマクロを編み出そう！

いかした形状通り、標準でカーソルキー、マウススクロールが当たっているので、
袋を開けてすぐ、右手のトラックボールを動かしながらの謎の動きが楽しめるぞ！

左手親指の下方にある15番ボタンを使うことで
キーマップを8種類まで切り替えることが可能だ！

感の良い諸君ならもうお分かりだと思う…そう
Nostromo は、16ボタン×8キーマップ…
すなわち 128ものマクロを左手で操ることが可能になるデバイスなのだ！！

君が今、左手で入力しているマクロの数と比較してほしい…。
これはもう…入手するよりないだろう…。


そして、右手のトラックボールはもちろん、
Logicool Wireless Trackball M570(t)だ！
![logicool-wireless-trackball-m570.png](https://qiita-image-store.s3.amazonaws.com/0/26030/702939bf-9bc4-ac8c-e81f-2202df221dfb.png)
ボタンが少ないのが 玉に瑕だが、
それでも自由度の高い"親指"でのカーソル移動は圧倒的に楽だ！

まだトラックボールを使ったことがないというディスプレイの前の君！
君は幸運だ…。
なにせ今、今ここ、ここでこうしてトラックボールに触る理由を得たのだから！
一度で良い…近所の電気屋さんで触ってみてほしい！

![fad65cec.jpg](https://qiita-image-store.s3.amazonaws.com/0/26030/0949685b-1561-b637-2c9f-4ad41db10c14.jpeg)

大事なことなのでもう一度言う、
”自由度の高い親指でのカーソル移動は圧倒的に楽だ！！”

親指でボールをまわすタイプ以外にも
色々な種類があるぞ！トラックボールは！
どうだい、欲しくなってきただろう？トラックボールが！

それじゃあ、今日はここまで！
トラックボーラーになった君と
また出会えるのを楽しみにしてるぜ！！


またね！
2/18日のJavaScript学習内容

本日は残りの制御文について学習しました。
セクションで言うと、3.3~3.10です。

3.3  for文→繰り返し回数が予め決められている時に便利なループ文。
3.4  for/in文→配列に含まれる各プロパティをそれぞれ変数に入れて繰り返しループを行う。
3.5  while文→繰り返し回数が特に決まっていない時に用い、ループさせる。真偽を行い真ならばループを行う。
3.6  do/while文→while文との相違点はこちらはまずループ処理を行ってからその値の真偽を行う。
3.7  switch文→同じ変数内で多分岐を用いるときに便利な制御文。
3.8  break文→分岐の途中でループを終了させたい時に用いるとそこでループを終了させられる。
3.9  continue文→continue文以下の処理をスキップしてその次のループに飛ばすことができる。
3.10 try/catch/finally文→エラー処理

whileを使っている文でも、forを使って書き換える事が出来るので、
一度に初期化値；条件式；更新式を述べられるfor文のほうが書くには便利だと思いました。

次回はP96 4.1 ビルトインオブジェクトから学習していきたいと思います。
コマンドラインから自分のグローバルIPアドレスを取得する

[IP Address Details - ipinfo.io](http://ipinfo.io) というサイトが便利。

```shell-session
$ curl -s ipinfo.io | jq -r '.ip'
xxx.xxx.xxx.xxx

$ curl -s ipinfo.io
{
  "ip": "xxx.xxx.xxx.xxx",
  "hostname": "xxxxxxxxxxxxxxxxxxxxxx.xxxxxxx.xxx.xx.xx",
  "city": "xxxxx",
  "region": "xxxxx",
  "country": "XX",
  "loc": "xx.xxxx,xxx.xxxx",
  "org": "xxxxxx xxx xxxxxxxxxxxxxx xxxxxxxxxxx"
}
SafariでもエラーにならないJavascriptのヒアドキュメントの書き方

# Safariの荒ぶり

こちら（ http://qiita.com/_shimizu/items/837b529de9f3302e315c ）で見かけたヒアドキュメントの記述トリック、この方法だとSafariで期待した結果が得られずエラーになってしまう。
なお、元ネタについてはこちら( http://tomasz.janczuk.org/2013/05/multi-line-strings-in-javascript-and.html )

```js
var html = (function () {/*
  <!DOCTYPE html>
  <html>
    <body>
      <h1>Hello, world!</h1>
    </body>
  </html>        
*/}).toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1];
```

（この部分は修正の追記により削除しました。）

# 修正 Safariでエラーになる原因
@uasiさんにコメントをいただいて判明しました。
SafariでtoString()すると、勝手にセミコロンが入ってきてしまうという挙動が・・・！

```js
"function () {/*
  <!DOCTYPE html>
  <html>
    <body>
      <h1>Hello, world!</h1>
    </body>
  </html>        
*/;}" // ←うわああああ勝手にセミコロンはいってるううう
```

こいつが勝手に差し込まれるせいで、正規表現に引っかからなかったということだったようです。

なお、元の方法の形で実現する方法についても@uasiさんがコメントに記載してくださっています。
本当に有難うございます！！！(´；ω；｀)

# Safariでエラーの出ないヒアドキュメントの書き方

※@uasiさんがコメントしてくれた内容で実現可能なので、以下の投稿内容については元投稿を残してある蛇足的なもんだと思ってください。

ヒアドキュメント使いたかったので、以下の様な方法で書いてみた。
Windows環境で、IEエミュレータとChrome、FF、Safariのそれぞれ最新ブラウザでテストしてみた結果、どれも問題なく動いた。

```html
<!DOCTYPE html>
<html>
<head>
	<title>ヒアドキュメントのテスト</title>
</head>
<body id="body">
	<script type="text/javascript" src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
	<script type="text/javascript">
		var _html = (function () {/*
			<h1>Hello, world!</h1>
			<span>テスト</span>
			<img src="https://www.google.co.jp/images/srpr/logo11w.png">
		*/}).toString().replace(/(\n)/g, '').split('*')[1];
		$('#body').append(_html);
	</script>
</body>
</html>
```

Safariではエラーでなくなったけども、ほかのブラウザではわからないので、利用するときは必ずテスト出来る環境がある範囲を対象にすべきだと思う。

# 追記
@nakajmgさんにWinのSafari5はもうサポートされていないと教えていただきました。
ヤバメな脆弱性を放置してるらしい。ひぃ！＼(^o^)／　WinのSafariは無視でよさげ！
端末の設定画面(Twitter)へ飛ばしたい


iPhoneにTwitterアカウントを紐付けてない場合に、
どうしても、飛ばしたくて強引にやった。（iOS7で検証）

なんか超黒魔術ぽいんですけど。
もっと標準的なやつあったら、教えてください m(__)m

```objectivec:OpenSettingForTwitter.m
- (void)viewDidLoad
{
    SLComposeViewController *tweetSheet = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];
    tweetSheet.view.hidden = YES;
    [self presentViewController:tweetSheet animated:NO completion:^{
        [self dismissViewControllerAnimated:NO completion:nil];
    }];
}
```
log4js-node で行番号の付いたログを出力したい！

Node.js でアプリケーションを開発している時、簡単なログは

```js
var util = require("util");
console.log(util.inspect(val, {showHidden: true, colors: true, depth: null}));
```

このように書くか、単純に `console.log(val)` で出力すると思います。

※ `util.log` を使うとタイムスタンプを付けられます。

しかし、アプリケーションの開発が進むと `console.log` では不便な点が出てきます。

1. ログレベルを指定したい
1. 標準出力/標準エラー出力ではなくファイルに出力したい
1. クリティカルなものはメールで通知したい
1. ログローテーションしたい
1. ログを出力している箇所 (ファイル名と行番号) が知りたい

実は、 1~4 までは [log4js-node](https://github.com/nomiddlename/log4js-node) を導入することで可能です。
しかし、単体ではファイル名と行番号を出力することはできません。

そこで、 [log4js-node-extend](https://github.com/ww24/log4js-node-extend) を導入します。
log4js-node を拡張して関数名、ファイル名、行番号、列番号をログに付加することができます。

# 仕組み
log4js-node-extend でファイル名や行数を取得しているのはこの部分です。

```js
function prepareStackTrace(error, structuredStackTrace) {
  var trace = structuredStackTrace[0];
  return {
    // method name
    name: trace.getMethodName() || trace.getFunctionName() || "<anonymous>",
    // file name
    file: trace.getFileName(),
    // line number
    line: trace.getLineNumber(),
    // column number
    column: trace.getColumnNumber()
  };
}

function getTrace(caller) {
  var original = Error.prepareStackTrace,
      error = {};
  Error.captureStackTrace(error, caller || getTrace);
  Error.prepareStackTrace = prepareStackTrace;
  var stack = error.stack;
  Error.prepareStackTrace = original;
  return stack;
}
```

getTrace を呼ぶと、 getTrace を呼んだ箇所の関数名、ファイル名、行番号、列番号が得られます。
V8 の JavaScriptStackTraceApi を使うと、例外を throw することも、文字列をパースすることなく、任意の書式でスタックトレースの一部分を得る事ができるんですね。

あとは、 log4js-node のインスタンスメソッドを上書きして、指定された書式でログに付加しています。

# 参考
* [Node.jsでカレント実行行を取得する - y-kawazの日記](http://d.hatena.ne.jp/y-kawaz/20110415/1302846675)
* [JavaScriptStackTraceApi - v8 - Overview of the V8 JavaScript stack trace API.](https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi)
StoryBoardを使ったiOSアプリをGHUnitでテストするには

![貼り付けた画像_2014_02_18_13_26.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/e7bb820e-9c65-01c6-11c6-e16f593e321c.jpeg)

先にテスト結果をお見せします。1つのテストに7秒もかかっているのは本当はかなりまずいんでしょうな・・・

やり方ですが、あらかじめViewControllerのStoryboard IDを設定しておきます。
（下の「use Storyboard ID」はUIの状態復元を行うとき必要な Restoration ID を Storyboard ID と同一にするものなので、状態復元を実装しないのなら意味を持たないそうです。[uasi](http://qiita.com/uasi)さんに教えてもらいました。ありがとうございました。）

![measure-power-p140204_xcworkspace_—_Main_iPhone_storyboard_と_下書きを作成・編集_-_Qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/6d339794-d839-ecd6-beae-e36140fdadf5.jpeg)

以下はそのまま動作するコード。基本的な考え方としては、Storyboardクラスのインスタンスを作り、該当のViewControllerクラスのインスタンスを作ってから、テストを実施する。

テストの内容は、ViewControllerインスタンスに対して`reloadWebView`メッセージを送った後、20秒以内にそのViewController上のWebViewからロード完了のメッセージがきちんと返ってきたらグリーン。

```objc:ViewControllerAsyncTest.m

#import <GHUnit/GHUnit.h>
#import "ViewController.h"

@interface ViewControllerAsyncTest : GHAsyncTestCase <UIWebViewDelegate>
@property ViewController *vc;
@end

@implementation ViewControllerAsyncTest

/*
 下記メソッドを追加しないとView関連の処理がメインスレッドでおこなわれず、エラーとなる
 */
- (BOOL)shouldRunOnMainThread
{
    return YES;
}

// 各々のテストが実行される前に呼ばれる
- (void)setUp
{
    /*
     ストーリーボードの初期化
     
     ビューのオブジェクトを作るので、メインループで実行しなければならない
     -(BOOL)shouldRunOnMainThreadでYESを返しておくこと
     */
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
    GHAssertNotNil(storyboard, @"ストーリーボードが存在しない");
    self.vc = [storyboard instantiateViewControllerWithIdentifier:@"hoge"]; // Storyboard ID
    GHAssertNotNil(self.vc, @"ビューコントローラが存在しない");
    [self.vc loadView];
    /*
     メインループで実行する別のやり方
     */
    //[self.vc performSelectorOnMainThread:@selector(loadView) withObject:nil waitUntilDone:YES];
}

/*
 「計測開始」ボタンを押す
 */
- (void)testReloadWebView {
    [self prepare];
    self.vc.webView.delegate = self;
    GHAssertNotNil(self.vc.webView, @"ウェブビューが存在しない");
    [self.vc reloadWebView];
    
    /*
     成功の通知が来るまで待つ
     タイムアウトは20秒
     ストーリーボードを初期化するところから始めるので、けっこう時間がかかる
     */
    [self waitForStatus:kGHUnitWaitStatusSuccess timeout:20.0/*sec*/];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    [self notify:kGHUnitWaitStatusSuccess forSelector:@selector(testReloadWebView)];
}

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
{
    [self notify:kGHUnitWaitStatusFailure forSelector:@selector(testReloadWebView)];
}

@end
```

-----
ブログやってます：[weed software 開発者ブログ](http://weed.cocolog-nifty.com/wzero3es/)
作業ディレクトリを指定してプログラムを実行

exeをおいているディレクトリにてexeを実行することを想定されているプログラムの場合、
カレントディレクトリを指定しないと正しく実行できない事があります。

```vbnet:workingdir.vbs
Option Explicit
Dim wShell
Set wShell = CreateObject("WScript.Shell")
wShell.CurrentDirectory = "c:\Program Files\sample"
' 実行プログラムの指定はダブルクォーテーションでくくること。
wShell.Run """c:\Program Files\sample\program.exe""",1,TRUE
```
UIViewControllerのview.windowがロードされるタイミング


UIViewController - viewDidLoadでself.view.windowを参照しようとしてハマったのでメモ。iOSは基本的に単一のUIWindowしか持っていないのだけど、UIView.windowで自身が所属するwindowを特定する場合、タイミングが重要な場合がある。例えば以下。

```objectivec

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    UIWindow *vw = self.view.window;
    UIWindow *aw = [[[UIApplication sharedApplication] delegate] window];
    NSLog(@"view has window? : %@", (vw)); // ない
    NSLog(@"app has window? : %@", (aw)); // ある
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    UIWindow *vw = self.view.window;
    UIWindow *aw = [[[UIApplication sharedApplication] delegate] window];
    NSLog(@"view has window? : %@", vw); //ない
    NSLog(@"app has window? : %@",aw); //ある
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    UIWindow *vw = self.view.window;
    UIWindow *aw = [[[UIApplication sharedApplication] delegate] window];
    NSLog(@"view has window? : %@", vw); //ある
    NSLog(@"app has window? : %@",aw); //ある
}

```

UIViewControllerのviewがwindowに所属するのはviewWillApperar:とviewDidAppearの間らしい。ちなみにその時のvwとawは同じオブジェクト。なので、何らかの理由でviewDidLoadでwindowの情報が欲しかったらapplicationDelegate.windowを使いましょう。
特殊フォルダの開き方(shell:xxx)

ファイル名を指定して実行 -> `Shell:::{3080F90D-D7AD-11D9-BD98-0000947B0257}`

でデスクトップの表示ができる。

```vbnet:showdesktop.vbs
Option Explicit
Dim wShell
Set wShell = CreateObject("WScript.Shell")
wShell.Run "Shell:::{3080F90D-D7AD-11D9-BD98-0000947B0257}"
```

windows xpには対応していませんでした。


ほかはこちらにまとまっています。

* [PowerShell: ◆デスクトップの表示およびコントロールパネル項目の表示](http://mtgpowershell.blogspot.jp/2012/04/blog-post.html)
sshで公開鍵認証を使ってアクセスする


あまりに基本的すぎるけど、基本的過ぎて、ときどき大事な設定を忘れている解説がある。念のため、備忘録としてまとめておく。なお、Linux, Mac OS XなどのUnix系統のパソコンじゃないとこの解説は意味がないので、windowsの人は無視すること

## 自分のパソコンですること

公開鍵と秘密鍵を作ろう。どのディレクトリでもかまわないが、結局、.sshのディレクトリに移すことになるので、.sshの下でやるのが効率的だ。

```
$ cd ~/.ssh
$ ssh-keygen -t rsa -f <filename>
```

上記のコマンドが実行されると、\<filename\>というファイルと、\<filename\>.pubというファイルができる（<filename>は適宜、自分で指定しよう）。前者が秘密鍵、後者が公開鍵。この後、公開鍵\<filename\>.pubを公開鍵認証でアクセスしたいサーバにコピーする

```
$ scp <filename>.pub <hostname>:.ssh/.
```

その後、.sshにid_rsaがない場合は、秘密鍵をid_rsaという名前に変更する

```
$ mv <filename> id_rsa
$ chmod 600 id_rsa
```

最後のパーミッションの設定を忘れると動かないので注意

## ホスト側

アクセスしたいホストコンピュータでも、.sshにコピーしたファイルを操作する。

```
$ ssh <hostname>
<パスワードによるログイン>
$ cd .ssh
$ cat <filename>.pub >> authorized_keys
$ chmod 600 authorized_keys
$ exit

```

## 確認

ふたたび、ホストコンピュータにアクセスして、パスワードなしで入れれば、成功。

```
$ ssh <hostname>
$
```

## トラブルシューティング

### .sshディレクトリがない

つくりましょう。

```
$ mkdir .ssh
$ chmod 700 .ssh
```

### 全部言われた通りに設定したのに動かない

大抵の場合、パーミッションの設定が間違っています。

```
$ ls -al .ssh
```

でアクセス権を確認して、クライアント、ホストコンピュータのid_rsa, authorized_keysのアクセス権が600になっているか確認しましょう。なっていなかったら、

```
$ chmod 600 <target>
```

として変更しましょう。ごくまれに、authorized_keysと命名するべきなのに、authorized_keyと単数系にしたり、スペルミスでうまくいかないこともあります。

### 既にid_rsa, authorized_keysがある

authorized_keysファイルが既に存在しても、そのファイルの続きに今回、作成した公開鍵を足せば動きます。id_rsaがある場合は、秘密鍵を別の名前で保持して、

```
$ ssh -i ~/.ssh/<privatekey> <hostname>
```

とアクセス時に明示的に指定するか、.ssh/configファイルを作成し、その中で、どのホストにどの秘密鍵を使うのかを記述すると良いと思われます。以下、記述例です。

```
Host <hostname or nickname>
  HostName <hostname or ip address>
  User <username>
  Port <port number>
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile ~/.ssh/<privatekey>
  IdentitiesOnly yes
  LogLevel FATAL
```

<>の中身は、各設定に応じて変えてください。
カレントファイルにインクルードガードを書き込むvimスクリプト


#概要
C言語の場合，ヘッダーファイルにインクルードガードを書くと思います．

```hoge.h
#ifndef HOGE_H_INCLUDED_
#define HOGE_H_INCLUDED_

void hoge(void);


#endif  //HOGE_H_INCLUDED_
```

いちいち書くのが面倒なのでカレントファイルに書き込んでくれるスクリプトを書きました．


#スクリプト
.vimrcに追記．特に説明はいらないと思います．

```vim:.vimrc
"----------------------------------------------------
" Insert include guard to the current file
"----------------------------------------------------
command!  -nargs=0 IncGuard call IncludeGuard()
function! IncludeGuard()
    "カレントファイル名を取得
    let name = fnamemodify(expand('%'),':t')

    "大文字にする
    let name = toupper(name)

    "がーど
    let included = substitute(name,'\.','_','g').'_INCLUDED__'

    "書き込み
    let res_head = '#ifndef '.included."\n#define ".included."\n\n"
    let res_foot = "\n".'#endif //'.included."\n"
    silent! execute '1s/^/\=res_head'
    silent! execute '$s/$/\=res_foot'
endfunction
```

#最後に
> 本当はファイルの先頭，末尾に書きたかったけどやり方がわからなかったです．
> gg,Gで移動してから書けばいいのかもしれないけどあんまり美しくないし．

↑修正しました．

> Qiitaってvimスクリプトはsyntax ハイライトしてくれないんですね・・・

↑修正しました．

ご指摘いただいた @uasi さん，ありがとうございました．
Test::MoreでWide character in print

```pl
use Test::More;

my $builder = Test::More->builder;
binmode $builder->output,         ":utf8";
binmode $builder->failure_output, ":utf8";
binmode $builder->todo_output,    ":utf8";

ok(1,"日本語");
```

でも

```pl
subtest "日本語" => sub {
  #こいつは出るな…。
}
```

検索したら一発で出てきた…。

[http://blog.64p.org/entry/20081026/1224990236]
[https://gist.github.com/lestrrat/723051]

```pl
{
    # utf8 hack.
    binmode Test::More->builder->$_, ":utf8" for qw/output failure_output todo_output/;                       
    no warnings 'redefine';
    my $code = \&Test::Builder::child;
    *Test::Builder::child = sub {
        my $builder = $code->(@_);
        binmode $builder->output,         ":utf8";
        binmode $builder->failure_output, ":utf8";
        binmode $builder->todo_output,    ":utf8";
        return $builder;
    };
}
```
iOSでお手軽に標準の動き以外のアニメーションを実現できるライブラリ

iOSでは比較的簡単にアニメーション処理を行うことができますが、標準だとまったく動きの種類が少ないため物足りないです。

そこで標準以外のアニメーションさせたいときは以下のライブラリを使っています。

MTAnimation
https://github.com/mysterioustrousers/MTAnimation

UIViewのカテゴリになっていて、標準の記述と近い形で、簡単な記述で拡張されたアニメーション実装ができ、扱いもしやすくなっています。

```objc
[UIView mt_animateViews:@[_logoImageView]
           duration:0.25
     timingFunction:kMTEaseOutBack
         animations:^{
             // animation logic
         }
         completion:^{
             // complation logic
}];
```

このようにアニメーションの実行と実行後の処理もUiViewのメソッドと同じようにblocksで簡単に記述可能です。

timingFunctionは標準に25以上追加されています

http://easings.net/ja
Selenium 入門

# これはなに？
Seleniumの使い方の初歩を解説したページです。
あまりプログラミングに明るくない人でも、コマンドラインからブラウザ操作できる感覚を掴んでもらうことが目標です。

元は社内向けの教育資料だったため、情報の古い箇所があるかもしれません。
また、解説資料としては画像が少なめとなっていますが、これは実際にPCを操作させながら教えていたためです

Windows+Rubyで動作させています。

# Seleniumって何？
ググってみた。

> Webアプリケーション用テストツール。
> ブラウザの操作をシミュレート(自動化)して、Webアプリケーションの画面周りの再帰試験(リグレッションテスト)を実施することができる。
> Selenium2.0以降より、WebDriverというAPI、実装を使った実装に変わった。
> WebDriver API を使うようになったので、テストのスクリプトコードも大きく変更された。

だそうです

# 準備
Rubyを使います。

http://rubyinstaller.org/downloads/

* Rubyのインストール
 * インストーラ使って、一撃でインストールしちゃおう(とりあえずrubyinstaller-2.3.3を使っておきましょう)
 * Add Ruby executables to your PATH ←チェック入れておけ(環境変数にパスを通すヤツ)

* Developmentkit
 * 適当な場所に解凍(フォルダを作ってから解凍しよう)
 * 解凍して出てきた中身を全部 C:\Ruby23 の中に上書き保存
 * コマンドプロンプトでRubyのフォルダまで移動して、以下のコマンドを打つ

> cd C:\Ruby23
> ruby dk.rb init
> ruby dk.rb install

※Rubyインストールの参考: http://www.kkaneko.com/rinkou/ruby/rubyinstaller.html
※コマンドプロンプトの参考: http://ykr414.com/dos/

* これだけ覚えれば何とかなるコマンドプロンプト
 * cd "dir" #指定のディレクトリに移動
 * cd .. #1つ上の階層に移動
 * dir #ディレクトリの中身を表示
 * exit #コマンドプロンプト終了

selenium-webdriver ってのをインストール

> gem install selenium-webdriver

geckodriver ってのをインストール

https://github.com/mozilla/geckodriver/releases

* 上記URLにアクセスして必要なファイルをダウンロードして解凍→geckodriver.exe が出て来る
* C:\geckodriver ←こんなフォルダを作ってgeckodriver.exeを配置
* システム環境変数にてパスを通す

準備は以上です。

# チュートリアル
Seleniumを使ってFirefoxを操作してGoogleで「selenium」という文字列を検索してみましょう。

以降、操作は基本コマンドプロンプトで行います。

まずirb(インタラクティブRuby)ってのを立ち上げます。

> irb

すると

> irb(main):001:0>

↑こんな感じになります。
こうすれば1行毎に出力結果が返ってくるので、わかりやすいです。
では、まず、selenium-webdriverを呼び出しましょう。

> require "selenium-webdriver"

次は、Firefoxを起動します

> driver = Selenium::WebDriver.for :firefox

※大文字、小文字も正確に！

Googleにアクセスします

> driver.get "https://www.google.co.jp/"

これでGoogleにアクセスできたはず。
検索窓にseleniumと入力してみましょう

> driver.find_element(:class,"gsfi").send_key "selenium"

「Google 検索」ボタンをサブミットします(エンターキーを"ッターン"ってする操作)

> driver.find_element(:name,"btnK").submit

これで検索結果画面が表示されたはず。
Firefoxを閉じましょう

> driver.quit

ついでにirbからも抜けておきましょう

> irb(main):xxx:x>exit

いかがでしょう、マウスを使わずにブラウザを操作することができましたね。

しかし、毎度irbでSeleniumをいじっていたら、
マウス操作と手間が変わらないので、自動スクリプトとして実行してみましょう。

テキストファイルで今までの内容を入力して、
ファイル名を"selenium.rb"として保存します。

```ruby:selenium.rb
require "selenium-webdriver"
driver = Selenium::WebDriver.for :firefox
driver.get "https://www.google.co.jp/"
driver.find_element(:class,"gsfi").send_key "Selenium"
driver.find_element(:name,"btnK").submit
driver.quit
```

コマンドラインで

> ruby selenium.rb

と入力するか、ファイルをダブルクリックして開けば、スクリプトが実行されます。

スクリプトを実行した場合でも、irbで入力した時と変わらない挙動になります。
これでSeleniumを利用してブラウザの自動操縦ができるようになりました。

# この後の展開
とりあえずの入門編は以上です。
この後はUI要素の見つけ方や、テストモジュールとの組み合わせ方等を学んで行くことになります。
Objective-Cをコマンドラインでコンパイルするメモ


Objective-Cを勉強中ですが、まだまだ基礎的なところが欠けてます。
んで、色々書いて動作テストしてみようと思ったときに、本当に1行程度テストしたい場合にも毎回プロジェクト作るのはめんどくさいし、ファイルもたくさんできてしまうので、さくっとコマンドラインで簡単なテストを書けるようにしてます。

色々忘れやすいのでメモ。基本的には`gcc`コマンドに適切に引数を渡すだけでコンパイルできるようです。
以下、忘れないためのメモ。

##gccオプション

とりあえず↓みたいにしてコンパイルすればOK。

```shell
gcc -o proguramName main.m anyClass.m otherClass.m -framework Foundation
```

と入力してッターンとエンターキー押せばコンパイルされます。
`proguramName`はコンパイル後に生成されるファイル名、`main.m`やその他`.m`ファイルは、main.mで利用しているファイルを一式。そして最後に`-framework`オプションに、内部で使用しているfreamworkを渡してやればOK。

##最低限動く構成

```anyClass.h
#import <Foundation/Foundation.h>
#import <stdio.h>

@interface anyClass : NSObject

@end
```

```anyClass.m
#import "anyClass.h"

@implementation anyClass

@end
```

```main.m
#import "anyClass.h"

int main(void) {
	NSString *hoge = @"test";
	printf("String is %s", [hoge UTF8String]);
	return 0;
}
```

あとはこれに実際に動作確認してみたいことを追記したりして動作確認する感じで。
Vagrantでexportした環境(box)を取り込む方法

Vagrantの設定ってChefとか構成するけど時間がかかるし、非エンジニア以外のメンバにやって貰う場合、うまく行かなかった場合はハードルが高いよね

そんなわけで、作成済みのBoxを配布する手順を公開するよ。
※Virtual Boxで実施しているのでVMwareは未確認

**追記** コピーしたBoxがネットワークにつながらない時はこちらを参考されるとよい[Vagrantのネットワークが起動しないときは](http://blog.monochromegane.com/blog/2013/04/06/vagrant-network-error/)

#### 前提条件
* mac OSX10.9
* virtual box 4.3.6
* Vagrant 1.3.5

#### vagrnt のVagrantfileのあるディレクトリに移動し、boxをエクスポートする

```
> vagrant package
Exporting VM... (結構時間がかかる)
```

基本的にはVagrantfileのあるディレクトリにpackage.boxが出力される
数GBあるのでディスク容量に注意が必要

#### vagrantにboxを追加する

```
# box に追加
> vagrant box add BOX_NAME ./package.box
#　boxが追加されたことを確認
> vagrant box list
BOX_NAME (virtualbox)
```

#### vmをvirtualbox(VMWARE)に追加する

起動用の設定ファイルVagrantfileを新規作成する場合と、  
ネットワーク設定などを配布元のPCと同じにしたい場合の二通りある

共有フォルダの設定や、ネットワークの設定などまるまるコピーしたい場合は後者を選択したほうが良い

##### Vagrantfileを新規作成する場合

```
> mkdir VM_HOME
> cd VM_HOME
> vagrant init VM_NAME
```

##### Vagrantfileを元のVMのをコピーする場合

```
> mkdir VM_HOME
> cd VM_HOME
> cp ORIGINAL_PATH/Vagrantfile ./
> vi Vagrantfile
```

Vagrantfileの下記の値を追加したBox名(BOX_NAME)に変更する

 config.vm.box = "BOX_NAME"

#### vagrant を起動し、ssh接続する

```
> vagrant up
> vagrant ssh
```
整数を指定桁数にするだけのgemを作ってみました

```rb
#{year}-#{month}-#{day}
```
が「2014-02-18」になって欲しいのに「2014-2-18」なってしまう件への対応だとか

hoge_23.zipというファイル名がhoge_9.zipよりも先に並んでしまう問題を解決するために
「hoge_23.zip」ではなくて「hoge_0023.zip」というように頭に0を付けて桁数を合わせるようにしたい
というケースが度々あったのでgemにしてみました。

```
$ bundle gem zerostr
```

してから編集したのは下記の17行。
https://github.com/pandeiro245/zerostr/commit/03365eeaebbd6ede18a7845b0629ccecb605f4c9

「to_zerostr」とか名前の付け方超適当なのでオススメがあれば教えてください…。

もちろんテストとか例外処理とかやっていかないといけないけど
めっちゃ簡単にできたのでこれからも
ちょこちょこgem化していきたいと思いました。

```
 gem 'zerostr', :path => '../zerostr'
```
公開しなくても上記のようにRailsのGemfileに書けば
下記のように動きます。

```
> 2.to_zerostr
=> "02"
> 18.to_zerostr
=> "18"
> 23.to_zerostr(4)
=> "0023"
```

参考にさせて頂いた記事：
http://soplana.hateblo.jp/entry/2012/06/01/234259
Sencha Touchでvimのタグジャンプを対応させる

# やりたいこと

Sencha Touchプロジェクトでvimのタグジャンプを利用した際、関数などに飛んでくれて便利。
でも、当然Sencha Touchの定義には飛んでくれない。

なのでもちろん自作のクラス定義に飛ばないのも辛いが、
Sencha Touchのソースを見ることが多いのでこれはなんとかしたい。

* Sencha Touch のclass定義にもタグジャンプしてほしい
* ライブラリのtagsは同じなので共有したい
* 自分のアプリのtagsは個別に管理したい
* Sencha Touchの定義へ飛ぶ場合は各ワークスペース内の定義へ飛びたい

最終的には以下のような構成になる予定。

```
~
├─.vim
│  └─tags
│     └─touch.tags       ← Sencha Touch のtags(共有)
│
├─Workspace
│  ├─MyApp1              ← 自分のアプリケーション
│  │  ├─app
│  │  ├─resources
│  │  └─.tags            ← MyApp1のtags
│  └─touch               ← Sencha Touch ライブラリ
│
└─Workspace2
   ├─MyApp2              ← 自分のアプリケーション
   │  ├─app
   │  ├─resources
   │  └─.tags            ← MyApp2のtags
   └─touch               ← Sencha Touch ライブラリ
```

# Sencha Touch に対応したtagsの作成

tagsファイルの作成にはctags(Exuberant Ctags)を用いたが、
`.ctags`設定ファイルにより生成されるタグをカスタマイズできる。

とりあえずSencha Touchのクラス名とxtypeのタグを生成するようにしてみた。
実際には関数や変数の定義、`storeId`なども記述している。

```.ctags
--recurse=yes

--langmap=JavaScript:.js
--regex-JavaScript=/Ext.define\(['"]([^"']+)/\1/c,classes/
--regex-JavaScript=/^\s{4}xtype: ?['"]([^"']+)/\1/c,classes/
```

## xtypeの判定

`xtype`は定義部分以外にも使用されるため、定義部分のみを判定する必要がある。
ただ、どうやら複数行の正規表現に対応して **いない** らしく、
結局`xtype`の判定は空白の数(タブ1つ分の空白)で行った。悲しい…

ところがこんなふざけた書き方でも、今のところうまく判定できている。

```touch/src/Button.js
Ext.define('Ext.Button', {
    extend: 'Ext.Component',

    xtype: 'button',

```

## tagsの生成

`.ctags`の設定を行ったうえで、SecchaTouchのtagsファイルを出力する。

```bash
cd ~/Workspace/MyApp1
ctags -f .tags --format=2 --language-force=javascript --tag-relative=no --exclude=resources .
ctags -f sencha.tags --format=2 --language-force=javascript --tag-relative=yes ../touch/src
```

* 名称を`tags`ではなく`.tags`にするしているのは好みの問題(非表示扱いになって便利)
* excludeにワイルドカードは使用できない(後述)
* `-R`オプションは`.ctags`に`recurse`を定義しているので不要
* `sencha.tags`に`--tag-relative=yes`を指定して相対参照にしている点がポイント

実際には`touch.tags`の中で、明らかに不要そうな定義は適当に削除して使用している。

# vimからtagsの参照設定

```vim
" tags定義
set tags+=.tags
set tags+=~/.vim/tags/touch.tags
set notagrelative
```

* `notagrelative`によりカレントディレクトリからの相対パスとみなされる
* `.ctags`を追加
* Sencha Touch の定義`touch.ctags`を追加

## Senchaプロジェクトの判定

上記設定の問題点として

* すべての場合に上記設定が適用されてしまう
* カレントディレクトリをSencha Touchのワークスペースにする必要がある

これには`.sencha`フォルダの有無を判定することで、
Sencah Touchプロジェクトを判定し、同時にルートディレクトリを設定することができる。
詳細は省くが、よくある`.git`フォルダを判定するロジックをまねれば良い。

# vimからtagsを生成できるようにする

```vim
" 半自動生成
function! CreateTags()
    execute ':silent !find '.getcwd().' -name ''*.js''|grep -v ''/\.''|ctags -L - -f .tags --format=2 --language-force='.&filetype.' --tag-relative=yes'
endfunction
nnoremap <Space>tags :call CreateTags()<CR>

```

* `find`と`grep`を組み合わせれば有効なJavascriptファイルのみを対象にできる

実際にはvimからの生成は、有志による便利なプラグインを使えば良いと思う。

## 【おまけ】[tagbar](https://github.com/majutsushi/tagbar)で表示

少なくとも`.ctags`で定義した`c`を定義してやればクラス定義が見えました。

```vim
let g:tagbar_type_javascript = {
    \ 'ctagstype' : 'javascript',
    \ 'kinds'     : [
        \ 'c:classes:0:1',
        \ 'o:object:0:0',
        \ 'f:functions:0:1',
        \ 'm:methods:0:1',
        \ 'p:properties:0:0',
        \ 'v:global variables:0:0',
        \ 'r:variables:0:0',
    \ ],
\ }
```

# まとめ

私の場合、アプリ内で飛ぶことよりSencha Touchソースへ飛ぶことが多いためか、
Senchat Touchの設定だけでも十分便利になりました。
HTML中に埋め込まれたSVGをファイル／データとして抽出する

Google Docや独自実装したGoogle Chartのグラフなど、SVGをHTML中で使うことが多くなっています。しかし、imgタグで外部にリンクしたSVGファイルはコピー、保存、画像として開く・・・等の処理ができますが、svgタグで直接埋め込まれたsvgはこうした処理ができません。そこで、svgタグをHTML5のData URI Schemeの仕様に基づいた形に変換するスクリプトを書きました。

```js
(function($){
    $.fn.extend({
	    svgToData : function(){
			var svg = this.filter('svg') || this.find('svg');
			svg.attr({
				"xmlns" : "http://www.w3.org/2000/svg",
			});
			return 'data:image/svg+xml;base64,'  + 
				btoa(svg.parent().html().replace(/[^\x00-\x7f]/g, function(x){
						return "&#" + x.charCodeAt(0) + ";"
				}), true);
		},
	});
})(jQuery);

$('svg').each(function(){window.open($(this).svgToData())});
$('img#imagedSvg').attr('src', $('svg#bareSvg').svgToData());
```

処理的には、
1. xmlns属性を追加
2. 日本語の文字化け対策のため、非ASCII文字を数値参照に変換。
3. btoaでbase64エンコーディング
という流れで大したことをやってないのですが、試行錯誤に時間がかかりました。

実運用でデータを取得したいときは、上のサンプルスクリプトのように、いったんimgタグに変換するか、別ウィンドウで画像表示してから、「画像のURLをコピー」とすると楽です。「画像を保存」すればファイルにも保存できます。また、Google Docsを含めた対応ソフトウェアでは、画像をコピーしたものをはりつけることで、そのままSVG画像としてペースト可能です。

余談ですが、Redmineのコメント欄は、!URL!で任意のURLの画像を表示できます。なので、「画像のURLをコピー」して取得したSVGデータを!!で囲んでコメントに貼り付けるということをよくやっています。これを使って、独自に作ったシステムや、Google Docsのグラフをチーム内で共有しています。

最後に、jQueryを使うメリットはあまりないと思いますが、習慣なのでjQueryを使っています。嫌いな人すいません。
xcodeで文字列以外に画像ファイルもローカライズする方法

xcodeでの文字列リソースのローカライズ方法は紹介しました

xcode上でのStoryboardのローカライズ対応のベストな方法
http://qiita.com/appwatcher/items/041d1bfbea4395a68fc0

Storyboardのローカライズファイルを自動更新する設定を追加して管理を完璧にする
http://qiita.com/appwatcher/items/403b39823a15687de338

それ以外にもローカライズ対象として画像リソースも言語ごとに切り替えたい場合があります。

xcodeでは画像リソースもきちんとローカライズする方法が用意されています


画像ファイルもstoryboardなどと同じようにlocalizeボタンがあります。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/37731/388d69d0-3f3d-5945-00b5-f94720df5b11.png)

ここはbaseファイルを利用しているので同じようにbaseを選択します。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/37731/9609e0c5-3748-27da-b21f-ce2cca0e09a7.png)

おなじみのローカライズチェックボックスが現れます。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/37731/f509a477-9de2-3a46-8499-489f3f5355e5.png)

日本語向けにリソースを追加してみましょう。画像ファイルも同じく言語ごとにファイルが分かれました。
たまにここでエラーが出るので、その場合はおなじみのxcode再起動をかましてください。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/37731/df149309-5154-c8ea-3cdc-db90eacddc8a.png)

ここからの画像の差し替えですがxcode上での入れ替えがわからなかったので実態のファイルを差し替えましょう
finderから画像ファイルのフォルダを開きます。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/37731/eaa9d6aa-39ed-f83c-1410-6640a7e1a38c.png)

あとはこのファイルをローカライズ後の画像に差し替えます。
![6.png](https://qiita-image-store.s3.amazonaws.com/0/37731/724ddebd-53ab-c063-869b-37ad0c7fca9b.png)

すると、日本語向けに別の画像に差し代わりました！
![7.png](https://qiita-image-store.s3.amazonaws.com/0/37731/b2542f32-1e12-5b48-8f6f-fa32973bab0f.png)

このようにxcode上でのローカライズは様々な機能により簡単に作業することができます。
Storyboardのローカライズファイルを自動更新する設定を追加して管理を完璧にする

Storyboardのローカライズ方法としてBaseファイルを作りlocalizable.stringsで各言語のローカライズを管理する方法を紹介しました。

http://qiita.com/appwatcher/items/041d1bfbea4395a68fc0

ただし、初回は自動でstringsファイルを生成してくれるのですが、そのままではUIの変更時に追随してくれません。

ではどうするかというと、自動で更新してくれるscriptファイルが存在するため、それをRun Scriptsで灯籠しておけば自動で更新することが可能です。

更新スクリプトは以下になります。

https://gist.github.com/ole/5007019

このファイルをプロジェクトのどこかに配置しましょう。
今回はプロジェクト配下にscriptsというディレクトリを作りそこに入れます。

```bash
mkdir scripts
 curl https://gist.github.com/ole/5007019/raw/ffea5ca7b341ec2ed0f61dc863541d39422aaa23/update_storyboard_strings.sh  scripts/update_storyboard_strings.sh
chmod 755 scripts/update_storyboard_strings.sh
```

その後メニューから
Editor→Add Build Phase→Add Run Script Build Phase
を選択し、スクリプト実行の設定を追加します。
![スクリーンショット 2014-02-18 8.57.54.png](https://qiita-image-store.s3.amazonaws.com/0/37731/0b3d9252-bd3e-d9df-5bb2-251350acefbb.png)

そこに先ほど設置したスクリプトのパスを記載します。
![スクリーンショット 2014-02-18 8.58.05.png](https://qiita-image-store.s3.amazonaws.com/0/37731/62f23903-aeb5-6e2a-a1f3-96abc77f3bbf.png)

今回は
```text
${PROJECT_DIR}/scripts/update_storyboard_strings.sh
```
といった設定になるかと思います。

追加後の挙動は以下の通りです。

追加前
![スクリーンショット 2014-02-18 9.02.01.png](https://qiita-image-store.s3.amazonaws.com/0/37731/8ecfbeba-efb3-eac4-b8c3-062366d889d2.png)

UILabelを追加
![スクリーンショット 2014-02-18 9.02.20.png](https://qiita-image-store.s3.amazonaws.com/0/37731/38273e97-3f13-7996-3de1-a81ad5015c54.png)

ビルド実行
![スクリーンショット 2014-02-18 9.02.49.png](https://qiita-image-store.s3.amazonaws.com/0/37731/b611c435-edc5-b82b-9887-93a29337e715.png)

無事に追加したObjectが追加されています！
![スクリーンショット 2014-02-18 9.02.40.png](https://qiita-image-store.s3.amazonaws.com/0/37731/86d5e8b0-3e4c-ff47-a926-c39d6d8381f4.png)

ここまで設定しておくと大分ローカライズが簡単に管理できるようになったはずです！
mafを使った計算時間測定

新しいプログラムを作ったとき、いろいろなパラメータで実験してどのようなパラメータのときどれくらいの計算時間がかかっているのか計測することがよくある。

これを測定するのに一つ一つ結果の出力から時間を取り出して集める必要がある。この処理をするのに数個なら手動でやることもできるが、パラメータの組み合わせが大量ある場合は、とても手でできないのでスクリプトで処理する。このような処理をやるのにパラメータの生成や結果のパース、結果の収集などのスクリプトを書かないといけない。このような処理は共通して使いまわせることが多い気がするのでライブラリを作ることができないかなぁと思っているところにmafというものがあるのを見つけて使ってみた。

現状のmafのサンプルで計算時間の測定のサンプルがまだなかったので作ってみた。 

#mafについて
詳しくはここ（ http://research.preferred.jp/2013/12/maf/ ) を読んでもらうことが一番だが、簡単にいうとwafというpythonで書かれたビルドシステムを拡張して作られた実験支援のツールである。

これを使うとパラメータの組み合わせを簡単に列挙できたり、実験結果を簡単にまとめられたりできる。
ステキ！

#wscriptと実験結果
mafはwafと同様にwscriptというmakeコマンドでいうところのMakefileを書く必要がある。
wscript等は以下のところにある。
https://github.com/shu65/maf_measure_computing_time

このwscriptでは"sleep 0", "sleep 1", "sleep 2"を3回ずつ実行して、timeコマンドを使って時間計測し、それぞれのパラメータで平均計算時間を計算するというとっても簡単なサンプルになっている。

git cloneをした後の実行方法は以下の通り。

```bash:
cd maf_measure_computing_time
./waf configure
./waf experiment -j 1 
```

最後の"-j 1"がないと複数の組み合わせのパラメータの実験を同時に実行して正確な計算時間の測定ができなくなってしまうので注意。

#最後に
現状、時間計測するところだけ並列実行したくないのだが、それがwscriptで指定できないので、今後はこのあたりを改良してPull Request送りたいなぁ・・・
gemを依存関係を解決しつつfetchする

セキュリティの関係上、オフライン環境での作業を強いられる方は少なからずいらっしゃると思う。
私もその一人。

一方、RubyGems のように、依存するパッケージをネットから自動でダウンロードしてくれるようなシステムの場合、使いたい gem をオフライン環境に持っていくためには、手動で依存関係を解決しなければならず、非常に手間である。

`gem fetch` では、指定した gem しかダウンロードしてくれない。

依存関係を解決しつつ、必要な gem を一括でダウンロードする方法を探していたところ、以下のような方法があった。

http://stackoverflow.com/questions/4402819/download-all-gems-dependencies

ちょっと書き換えてみた。

```shell-session:gem-fetch-dep.sh
: ${TMPENV:=./tmp}
: ${FETCHDIR:=.}

if [ ! -d $TMPENV ] ; then mkdir -p $TMPENV ; fi
if [ ! -d $FETCHDIR ] ; then mkdir -p $FETCHDIR ; fi

GEM_HOME=$TMPENV GEM_PATH=$TMPENV gem install --no-ri --no-rdoc --install-dir $TMPENV $*
mv $TMPENV/cache/*.gem $FETCHDIR
rm -rf $TMPENV
```

fetch 先ディレクトリを変えたりしたいときは、下記のように切り替えてください。
`FETCHDIR=./hoge/ bash gem-fetch-dep.sh <gem>`

最低限、オンライン側にもgemコマンドを打てる環境が必要、という制限があるのが課題。
Storyboardのローカライズのkeyはどこの値をさしているのか？

Storyboardでローカライズをした場合,key = "翻訳リソース"の形で出力してくれますが、

keyの部分が

"XTv-Vz-5OK.text"

といった風にユニークなIDが振られて生成されます。

自動で出力してくれるのでよいのですが、ちょっとした追加をした場合、自分で手動で追加をしようと思うと,このkeyをどうすればいいかぱっと見わかりません。

その確認方法ですが、

![スクリーンショット 2014-02-18 4.54.14.png](https://qiita-image-store.s3.amazonaws.com/0/37731/2bed4469-4af5-23e2-aeb2-01df7be665ce.png)

こちらの右ペインの真ん中のやつを選ぶとDocumentという箇所があり、そこにObject IDという記述があり、それが、このkey名の部分に対応しているようです。

手動で追加したい場合はこのIDを見て追加すると良さそうです。
Nodejsで自前のwatchを作る


ファイルの監視

```javascript:sample1.js
var fs = require('fs'); // ファイル操作


// ウォッチするファイルの指定と保存時に実行される処理の記述
createWatcher('path/to/hoge.txt', function() {
    console.log("Callback");
});

// ウォッチのテンプレ。100msなので、監視対象が増えると辛いかもしれない。
function createWatcher(aTargetPath, aCallback) {

    fs.watchFile(aTargetPath, { persistent: true, interval: 100 }, function(curr, prev) {

        console.log("\n// ----------------- Saved ");

        // 保存時にやりたい処理
        aCallback();
    });
}
```
xcode上でのStoryboardのローカライズ対応のベストな方法

Storyboardを使用したプロジェクトでローカライズを行いたい場合、いくらか方法があるのですが、xcodeの機能を用いてローカライズする場合に一番ベストと思われる方法を紹介します。

プロジェクトによってはコード側で書く方が最適な場合もありますが、ひとまずxcodeの機能を用いて行う方法を紹介します

Project→Info→LocalizationsのUse Base Internationalizationにチェックを入れる

![1.png](https://qiita-image-store.s3.amazonaws.com/0/37731/5d876114-5dd4-62c1-03f9-ae522418b8c8.png)

Baseファイルの追加
ここでローカライズしたいファイルが出てこない場合は、ファイル毎のLocationzationの所を確認しましょう
![2.png](https://qiita-image-store.s3.amazonaws.com/0/37731/87d035be-40a8-dca5-b550-9dce1c943053.png)

ここまでの作業でBaseのLocationzationができていると思います。
ちなみにこの作業をやっておくと次回から自動でbaseファイルができるようになるようです。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/37731/d799be60-d827-b90d-5a64-548403326fa8.png)

ローカライズしたい言語を追加しましょう。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/37731/3d1b5f31-9dc1-9864-5472-d7c0f1d09f5d.png)

追加したいstoryboardがbase 、 localizable Stringsになっていればokです
![5.png](https://qiita-image-store.s3.amazonaws.com/0/37731/5015140c-a531-d690-8abb-7d8c9a36aae1.png)

finishを押すとstringsファイルができており ,key = "翻訳string"の形で記述がされているはずです。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/37731/cd05a16c-9ff8-cb0f-285c-1229509139bd.png)

あとはこのファイルを翻訳すれば完了です。

昔のやり方だとローカライズ毎にstoryboardが作成されて、メンテナンス性が0だったのですがこの方法ならbaseのstoryboardでUI全体の修正をおこない、ローカライズリソースのみ翻訳すればよくなりました。

storyboardでもガシガシローカライズして全世界へ向けて、アプリを送り出しましょう！
Project Sienaで階層構造のあるデータを扱う

まだProject Sienaにハマっております。とりあえず、RDFやJSONなど、階層構造のあるデータをProject Sienaから扱う方法にハマっていたので、メモ。

Project Sienaでは、何か外部データを扱う場合、データソースとしてデータを指定します。RSSの場合は、「RSS Feed」でもいいのですが、それ以外のRDFやJSONなどのデータ構造の場合、「REST」を使います。

![スクリーンショット 2014-02-18 03.06.53.png](https://qiita-image-store.s3.amazonaws.com/0/14499/2a616f9b-c5fc-0c0c-2af6-45f65f693002.png)

で、RDFやJSONのデータは、ほとんどの場合階層構造となっています。
![スクリーンショット 2014-02-18 03.07.12.png](https://qiita-image-store.s3.amazonaws.com/0/14499/f7d9adc6-413d-e6f5-725e-f236d6b16264.png)

階層構造のあるデータをGalleryなどで扱う場合、データソースの名前を直接指定せずに、First()というメソッドを使ってやる必要があります。

具体的には、表示したいGalleryのItemsに、`First(データソース名)!データソースの最初のノード名を指定してやる。
![スクリーンショット 2014-02-18 03.19.25.png](https://qiita-image-store.s3.amazonaws.com/0/14499/34c91ac1-a4f8-7895-5f9e-d762844a4f66.png)

今回の写真の場合は、データソース名が「shelter_xml」、使いたいデータが格納されているノードが「Shelter」なので、`First(shelter_xml)!Shelter`です。

Galleryの中で実際にデータを使う場合は、配置したいコントロールを指定して、ThisItem!からはじめて設定したいデータノードの名前を指定します。こちら、ノードの階層構造がよくわからない場合は、データソースの設定画面を見て、そこから目的のノードを探してください。
![スクリーンショット 2014-02-18 03.26.36.png](https://qiita-image-store.s3.amazonaws.com/0/14499/0276a41f-9540-c2c7-6284-46286e4a0316.png)

ここでは、Shelterノードの下のNameノードの下の$textと言うノードに目的の値があったので、`ThisItem!Name!'$text'`としています。なお、ここでシングルクオーテーションがつく項目の基準は不明ですが、必要に応じてProject Sienaが勝手に着けてくれますので、あまり気にする必要はないでしょう。

#参照元
* [Accessing data nested inside a JSON data source in Project Siena](http://social.technet.microsoft.com/Forums/en-US/8b48267f-f01d-46e3-9b84-31fbacb562e6/accessing-data-nested-inside-a-json-data-source-in-project-siena?forum=projectsiena)
bashing: サブコマンドを持つ bash スクリプトをビルドするツール

[tumblr-gif](https://github.com/kui/tumblr-gif) を作るのに使ってみたビルドツール [bashing][] の紹介。

* [xsc/bashing][bashing]

[bashing]: https://github.com/xsc/bashing

`$ foo bar`, `$ foo baz` のようなサブコマンドを持つ bash スクリプトをビルドしたり、複数ファイルに分けて管理を簡潔にするツール。

こんな感じで、サブコマンドをもつシェルスクリプトを作れる。

```bash
$ bashing new foo
# foo プロジェクト作成

$ cd foo

$ cat > src/tasks/echo_args.sh
# <help>与えられた引数を出力するだけ</help>
echo "$@"
# Ctrl+D 押す

# ビルド
$ bashing deploy

# 実行
$ bin/foo
Usage: foo <task> [...]

    echo_args  :  与えられた引数を出力するだけ
    hello      :  (no help available)
    help       :  display this help message
    version    :  display version

# サブコマンドとその引数を与えて実行
$ bin/foo echo_args nyan nyan wan
nyan nyan wan
```

と割とお手軽にできる。

他にも、タスク間で共用する関数を置く場所や、毎回実行される処理もかける場所がある。

```bash
# lib には共通モジュール置く
$ cat > src/lib/greet.sh
function greet_ja() {
    echo 'こんにちは bashing'
}
# Ctrl + D
$ echo 'greet_ja' > src/tasks/helloja.sh

# 毎回実行される処理を書く
$ echo 'echo init' > src/init.sh
$ echo 'echo before-task' > src/before-task.sh
$ echo 'echo after-task' > src/after-task.sh
$ echo 'echo cleanup' > src/cleanup.sh

# ビルド
$ bashing deploy

# 実行
$ bin/foo
init
before-task
before-task
Usage: foo <task> [...]

    echo_args  :  与えられた引数を出力するだけ
    hello      :  (no help available)
    helloja    :  (no help available)
    help       :  display this help message
    version    :  display version

after-task
cleanup

# サブコマンド与えて実行
$ bin/foo helloja
init
before-task
こんにちは bashing
after-task
cleanup
```

before-task が二回実行されてるっぽいのはバグかな？
UbuntuユーザがMacBookを手にしたら

## はじめに

とりあえず、UbuntuでやってたみたいにターミナルからSWをインストール(`apt-get`)できるようにしたいということで備忘録。

## インストール

### iTerm2
  
http://iterm2.com/ から`zip`ファイルをダウンロード、解凍してインストール。

### Java

ターミナルから下記のようにJavaのバージョンを聞くコマンドを投げるとインストーラのウィンドウが立ち上がりますのでポチポチ。

```bash
$ java -v
```

### Command Line Tool for Xcode

Mavericksなら

```bash
$ xcode-select --install
```
で出来るらしいのですが、OSバージョンによっては`.dmg`ファイルを https://developer.apple.com/downloads/ からダウンロード・インストールする必要があるそうです。このとき、Apple IDが要るので、持っていない人は要登録です。OSのバージョンは画面左上のリンゴのマーク/ ***このMacについて*** で見れます。これもインストーラがやってくれるのでポチポチ。

### Homebrew

Rubyはデフォで入っているみたいなので、下記のコマンドでO.K.です。

```bash
$ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"
```

### git & dotfiles

後はターミナルからSWのインストールができます。最後に設定ファイルをGitHubとかに上げている人は持ってきてセットアップ、お疲れ様でした。

```bash
$ brew install git

$ git clone https://github.com/アカウント名/dotfiles.git

$ cd dotfiles; ./setup.sh

```

それでは、良いMac生活を
Backbone.js 1.1.1がBrowserifyでバグった件


Backbone.js 1.1.1で[jQuery依存の件](http://qiita.com/hokaccha/items/a99f9d39b8c18e77fefc)が直ったと思ったけど戻された。

* https://github.com/jashkenas/backbone/issues/2997
* https://github.com/jashkenas/backbone/commit/f1479e62eb74a2dd85fdf2e20d9c907c5757313e

どいうことかというと、`$`を解決するために、jQueryがあったらjQuery使って、ない場合は何もしない（使う人にお任せ）っていう感じで次のように書かれてた。

```javascript
try { $ = require('jquery'); } catch(e) {}
```

ただ、Node.jsの場合はrequireで解決できなかったときに例外を投げるんでこれで問題ないんだけど、Browserifyはrequireで解決できないと、コンパイルするときにエラーになってコンパイルできない（try catchで捕まえられない）ので、jqueryが解決できないとコンパイルできなくてダメじゃんってことで元に戻されたみたい。

つらい。
gitでリモートリポジトリを同期する

リモートリポジトリの設定を勝手にいじれないけど、同期しないといけないときの方法。

ポイントは`git clone --mirror`。
`git clone --init`だと`git fetch --all`でローカルのHEADは更新されない（→pushできない）が、`git clone --mirror`だとtracking属性が付与されるのでローカルのHEADも更新され、二回目以降が楽。

* 初回

```shell-session
    git clone --mirror /homge/GIT/sample-repo1.git
    cd mirror-repo1
    git remote add origin2 /home/GIT/sample-repo2.git
    git push origin2 --mirror
```

* ２回目以降

```shell-session
    git fetch --all
    git push origin2 --mirror
```

上記の問題は片方向の同期しかできていないこと。
逆方向の同期も合わせて行う方法もあるけど、余計なトラブルを避けるなら運用でカバー（sample-repo1にしかコミットしない）かな。

ちなみに、`git push origin2 --mirror`でタグもブランチも同期。`git push origin2 --all`でブランチだけ同期。ちょっと直感に反するので注意。
awesome(window manager)のwidgetでテキストをマークアップする

awesome3.5では`wibox.widget.textbox`を用いたテキストでPangoのマークアップ記法が使えるようになった. つまりwidgetでのテキストを色付けにとどまらずそれなりに装飾できるようになったわけだ. 
今回はCPUやメモリの使用率などをwidgetに置くことができる[Vicious](http://awesome.naquadah.org/wiki/Vicious)を用いて紹介していく.
## タグの使い方
Viciousの詳しい使い方は上記のリンク先に譲るとして, ここではCPU使用率を例にとる.
まず, widgetは

```lua:rc.lua
cpuwidget = wibox.widget.textbox()
vicious.register(cpuwidget, vicious.widgets.cpu, "CPU:$1%")
```

で作成できるが, この第３引数のstring部分にマークアップを使用できる. 
例えば,

```lua:rc.lua
cpuwidget = wibox.widget.textbox()
vicious.register(cpuwidget, vicious.widgets.cpu, "CPU:<span color='#EE0000' style='italic'>$1</span>%")
```

で数字が赤色イタリックに. 
このように`span`タグで様々な装飾が可能になる.
使用可能な属性はPangoの[ドキュメント](https://developer.gnome.org/pango/stable/PangoMarkupFormat.html)を参照.
ちなみにBoldや取り消し線などいくつかの属性は以下のような簡易タグが用意されている.

```
<b>Bold text</b>

取り消し線

```

さらに`vicious.register`の第３引数ではstringを返す関数を入れることができるため, 夢が発散することだろう.
## 使用例
最後に参考程度に私のViciousのバッテリー残量のテキスト部分の設定でも載せておく.
残量やったり充電中かどうかでなんやかんや変わる.

```lua:rc.lua
battext = wibox.widget.textbox()
vicious.register(
    battext, vicious.widgets.bat,
    function(widget, args)
        local status = args[1]
        local percent = args[2]
        local str =
            "<span weight='bold' size='xx-large' color='%s'>" ..
            "%s</span>%d "
        if status == "+" then
            status = "☺"
        elseif status == "-" then
            status = "⍨"
        end
        if percent > 75 then
            return string.format(str, "#00CC00", status, percent)
        elseif percent > 50 then
            return string.format(str, "#66CC00", status, percent)
        elseif percent > 25 then
            return string.format(str, "#CCCC00", status, percent)
        elseif percent > 10 then
            return string.format(str, "#CC6600", status, percent)
        else
            return string.format(str, "#CC0000", status, percent)
        end
    end,
    61, "BAT1")
end
```
setTouchEnabledがDeprecatedって言われたけどんじゃどうするんじゃい


正解:イベントリスナーを設定してあげる。
\パパーン／

```cpp:TouchLayer.cpp
bool TouchLayer::init(){
//TouchOneByOneの他にTouchAllAtOne(複数タッチ)もあるお！
auto listener = EventListenerTouchOneByOne::create();
//でもAllAtOnceならonTouch"es"Beganになる。
 listener->onTouchBegan = CC_CALLBACK_2(TouchLayer::onTouchBegan, this);
 listener->onTouchMoved = CC_CALLBACK_2(TouchLayer::onTouchMoved, this);
 listener->onTouchEnded = CC_CALLBACK_2(TouchLayer::onTouchEnded, this);
 

//cocos2d-x3.0からは見たまんまのタッチの優先度とかに設定できるから便利だよね。
this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);
}
```

なんかObjectiveCのprotocol作ってDelegate設定し直してるみたいな感じよね。ラムダ式とか
簡単な処理なら突っ込んでもできそうだけども。
VagrantでDigitalOceanのCent OS 6.5を使う

前から気になっていた [DigitalOcean](https://www.digitalocean.com/) を試しに使ってみたら、Cent OS 6.5のイメージが起動しなくてハマったのでメモ。

## インスタンス作成

まずは『[MacからVagrantコマンド一発でSSDなVPS(DigitalOcean)上にCentOS6.5+Docker環境を構築する](http://blog.glidenote.com/blog/2013/12/20/vagrant-docker-digitalocean/)』を参考に適当なVagrantfileを作成。

image には `Cent OS 6.5 x64` を、リージョンは `Singapore 1` をそれぞれ指定した。

```console
$ vagrant up
Bringing machine 'default' up with 'digital_ocean' provider...
[default] Using existing SSH key: foobar
[default] Creating a new droplet...
[default] Assigned IP address: XXX.XXX.XXX.XXX
[default] Modifying sudoers file to remove tty requirement...
[default] Rsyncing folder: /tmp/hoge/ => /vagrant...
There was an error when attemping to rsync a share folder.
Please inspect the error message below for more info.

Host path: /tmp/hoge/
Guest path: /vagrant
Error: bash: rsync: コマンドが見つかりません
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: remote command not found (code 127) at io.c(226) [sender=3.1.0]

```

失敗…。
どうやらゲストのイメージに rsync(1) が入っていないようだ。プロビジョニングも行われない。

## 対策

状態を確認する。

```console
$ vagrant status
Current machine states:

default                   active (digital_ocean)

active
```

インスタンスの起動はできているようなので、sshでリモートに入り、rsyncをインストールした。

```console
$ vagrant ssh
[root@hoge ~]# yum -y install rsync
[root@hoge ~]# rsync --version
rsync  version 3.0.6  protocol version 30
(...)
```

パスが通っていることを確認して、インスタンスをリロードする。

```console
$ vagrant reload
[default] Rebooting the droplet...
[default] Rsyncing folder: /tmp/hoge/ => /vagrant...
[default] Running provisioner: shell...
[default] Running: inline script
(...)
```

無事に `/vagrant` 以下が同期され、プロビジョニングも行われた。

## まとめ

- Cent OS 6.5のイメージにrsyncが含まれていないため、Vagrant経由でインスタンス生成すると失敗する。（2014/2/16現在）
- インスタンスにrsyncをインストールし、再起動させれば解決した。
FTSを用いたファイルの高速一括処理

[ディレクトリ配下の総ファイルサイズを計算する 〜 BSDのftsを使う](http://cocoadays.blogspot.jp/2011/03/ios-bsdfts.html)を参考にしながら、ftsを用いて大量のファイルを一気に処理するロジックを作成します。ftsの構造体をそのまま使った方がパフォーマンスが出るので、シンプルに処理をブロックとして切り出すインタフェイスにしてみました。

```objc
#include <sys/types.h>
#include <sys/stat.h>
#include <fts.h>

- (void)traverseURL : (NSURL*) url
          fileBlock : (void (^)(FTSENT *entry))fileBlock
           dirBlock : (void (^)(FTSENT *entry))dirBlock
{
    const char *cPath = [url.path cStringUsingEncoding:NSUTF8StringEncoding];
    int l = strlen(cPath);
    char *path = calloc(l, sizeof(char));
    strncpy(path, cPath, l);
    
    char * const paths[] = {
        path, NULL
    };
    
    FTS* fts = fts_open(paths, 0, NULL);
    FTSENT *entry;
    while ((entry = fts_read(fts))) {
        if (entry->fts_info & FTS_D) {
            // Directory in Pre-Order
            if(dirBlock){
                dirBlock(entry);
            }
        }
        else if (entry->fts_info & FTS_F) {
            // Regular File
            if(fileBlock){
                fileBlock(entry);
            }
        }
    }
    fts_close(fts);
    free(path);
}
```

たとえば、ファイルサイズの合計を取得したい場合には下記のようになります。シンプル！

```objc
__block off_t totalSize = 0;
[self traverseURL:url
        fileBlock:^(FTSENT *entry) {
                  totalSize += entry->fts_statp->st_size;
        } dirBlock:nil];
```
インストールされているgemを一括で削除する


`bundle install`するときに`--path vendor/bundle`を付け忘れてRailsアプリケーションのgemがrubyのディレクトリにごっそりインストールされてしまうというのはよくある操作ミス。

そのたびに http://qiita.com/yuki24/items/2e6258b7c6a5b13b7d16 などを参考に削除していたのだけど、デフォルトで削除できないgemがいくつかあってエラーで止まってしまう。それにbundlerやpryのように残しておきたいgemもある。

そこで上の削除方法を少しだけ改良して、削除できない/削除したくないgemを除外できるようにした。

```sh
gem uninstall $(gem list --no-versions|ruby -pe 'gsub(/bundler|bigdecimal|io-console|json|minitest|pry|psych|rake|rdoc|test-unit/,"")')
```

普通はsedを使うところなのだろうけど、せっかくなのでrubyで文字列処理を行った。

## 追記

`-aIx`付けたほうがいい。実はどこかからコピーしたコードだけど引用元が思い出せない。

```shell-session
gem uni -aIx $(gem li --no-versions | grep -v -E "rdoc|psych|io-console|bigdecimal|rake|json|openssl")
```
シンボリックリンク・ハードリンク


**シンボリックリンク**は、別の扉を使ってくださいと書いた張り紙を扉の上に残しておく。  
**ハードリンク**は、同じ部屋にさらに別の扉をもう1つ直接取り付けてしまうようなもの。

## シンボリックリンク `ln -s`
```Bash
$ ln -s fig0403.pdf fig0403_copy2.pdf
```
- 張り紙をして「必要な情報はここではなく、ファイルXXX内にある」と書いておくようなもの

- 指し示している対象を移動しようが、名称変更しようが、削除しようが、リンクの方はそのまま残る。

- 注意しなければならないのは、参照されなくなったシンボリックリンクをシステムが自動的に消してくれるわけではないこと。無駄なシンボリックリンクが残ってしまわないよう注意しなければならない

## ハードリンク `ln`
```Bash
$ ln fig0403.pdf fig0403_copy2.pdf
```
- 実質、同一のファイル内容に対して、別のファイル名を作成してしまう。

- 「fig0403.pdf」ファイルに対してハードリンクを作成しておけば、元のファイル名を削除してしまっても、ハードリンクの方は残るので、新たにハードリンクで付けた別名の方を使って、消したはずの内容を利用し続けることができる。

- ハードリンクは同一ボリューム内でしか使えない。

## 例

```Bash
$ cd tmp/
$ ln 0596009151.gif 0596009151_copy.gif
$ ls -l
total 1056
-rw-r--r--@ 2 oreilly  staff  267646  2 17 23:42 0596009151.gif
-rw-r--r--@ 2 oreilly  staff  267646  2 17 23:42 0596009151_copy.gif

$ ln -s 0596009151.gif 0596009151_copy_s.gif
$ ls -l
total 1064
-rw-r--r--@ 2 oreilly  staff  267646  2 17 23:42 0596009151.gif
-rw-r--r--@ 2 oreilly  staff  267646  2 17 23:42 0596009151_copy.gif
lrwxr-xr-x  1 oreilly  staff      14  2 17 23:44 0596009151_copy_s.gif -> 0596009151.gif

$ rm 0596009151.gif
$ ls -l
total 536
-rw-r--r--@ 1 oreilly  staff  267646  2 17 23:42 0596009151_copy.gif
lrwxr-xr-x  1 oreilly  staff      14  2 17 23:44 0596009151_copy_s.gif -> 0596009151.gif
```

- ハードリンクの場合、元ファイルもハードリンクも、まったく同じ容量が表示される
- 元になっているデータに対して複数の名前をつけているだけなので、実体が完全に同一のものだから。
- ハードリンクの場合、元ファイルを削除してしまっても、ハードリンクで付けた名前だけを使ってデータを管理することができる
- ハードリンクを作成した後、以前と異なっているのは2番目の列に示されている値だけ。2列目はリンク数を示していて、ハードリンク作成直後は2つのファイル名が同一のデータを指し示しているため、[2]となっている
- しかし、元ファイルを削除すると、ハードリンクによって作成した新しいファイル名である0596009151_copy.gifのリンク数が[1]となる

## 参考
[入門 Unix for OS X](http://www.oreilly.co.jp/books/9784873116440/) 4.5.5
Kobitoをちょっぴり便利にするかも知れないCLIツールを作った


![](https://raw.githubusercontent.com/suin/kobito-cli/master/image.png)


* Markdownをパイプでつないで処理したい
* 勉強会用のネタや仕事上の報告書をKobitoで書いて印刷したい (Kobito v1.8.7では長い記事の印刷がうまくできない)
* Kobito連携をコマンドラインからやりたい

というふうな経緯があって、Kobitoをちょっと便利にするかもしれないCLIツールを作りました。

## インストール

### Homebrewで入れる方法

```
brew tap suin/suin
brew install kobito-cli
```

Homebrewで入れるとzsh用の補完関数も入ります。

### wgetで入れる方法

```
wget -O /usr/local/bin/kobito https://github.com/suin/kobito-cli/raw/master/bin/kobito
chmod +x /usr/local/bin/kobito
```


## 使い方

<usage>

```

Usage: 
  kobito [command]

Available Commands: 
  ls                                            :: List all items
  show [item id]                                :: Show item
  html [item id]                                :: Show item as HTML
  print [item id]                               :: Print out item
  link [markdown file]                          :: Link markdown file to Kobito
  version                                       :: Print kobito cli tools version
  pdf [item id] | pdf [item id] [pdf file name] :: Save item as PDF
  password                                      :: Show Kobito password
  sticker                                       :: Do you want Kobito sticker?
  help [command]                                :: Help about any command


Use "kobito help [command]" for more information about that command.
```

</usage>


### Kobito へ文字列を送信する

パイプやリダイレクトなどで入力を渡すとKobitoのエントリーになります

historyの5件からKobitoのエントリーを作る

```
history | tail -n 5 | kobito
```

main.goのソースコードでKobitoのエントリーを作る

```
kobito < main.go
```

「[Ruby - ターミナルから Kobito へ文字列を送信する - Qiita](http://qiita.com/watson1978/items/c6ad9417298367aa9b9b)」を参考にしました。


## ソースコード

[github.com/suin/kobito-cli]で公開してます。PRあると嬉しいな(あるか?)

[github.com/suin/kobito-cli]:https://github.com/suin/kobito-cli
Browserify を試した。

Browserifyが気になってた。

node.jsスタイルで書いたコードをブラウザで動かせるらしい。
http://browserify.org/

というわけで前書いた[node.jsのコード](http://qiita.com/seiketkm@github/items/7fddd2445b58d1b6dc4c) を　http://browserify.org/articles のIntroduction記事を参考にbrowserifyで以下の手順で変換。
browserifyはv3.3.0を利用中。

```
browserify md5.js > bundle.js
```

bundle.jsを読み込むだけのHTMLを記述してChromeから読み込んだ結果、開発者ツールのほうに以下の出力。

```
inited:0msec bundle.js:1796
created data:667msec bundle.js:1796
hashed alldata:29845msec bundle.js:1796
dicted, pass is 567890:1991msec bundle.js:1796
```

node.jsのコードをbrowserifyで変換するだけで動きました。

md5の計算はかなり遅くなったけど、md5の計算がpureなJavaScriptによる実装になったからだと思われる。仕方ない。
大事なのは変換だけでnode.jsのコードがクライアントサイドで動いてなんか怖い。ってとこだと思います。
rails4アプリをherokuにアップする

```rb:Gemfile
group :production do
  gem 'pg'
  gem 'rails_12factor'
end
```

```
bundle install
```

```
heroku create
```

```
git push heroku master
```

```
heroku run rake db:migrate
```

seedを流す場合

```
heroku run rake db:seed
```

閲覧

```
heroku open
```

ログを確認

```
heroku logs
```

再起動

```
heroku restart
```

名称変更

```
heroku rename [app-name]
```