OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyでサブコマンド付きのコマンドを簡単に書けるThor


gitやsvnのようなサブコマンド付きのコマンドが・・


```sh
$ demo 
Tasks:
  demo abc           # print 'abc'
  demo efg [option]  # print 'efg'
  demo help [TASK]   # Describe available tasks or one specific task

$ demo abc
abc!

$ demo zzz
Could not find task "zzz".

$ demo efg
efg!

$ demo efg -u
EFG!

$ demo help efg
Usage:
  demo efg [option]

Options:
  -u, [--upcase]  # disp upcase

print 'efg'
```

これ位の記述量で書けるようになります。

```ruby:demo
#! /usr/bin/env ruby

require 'rubygems'
require 'thor'

class Demo < Thor
  desc "abc", "print 'abc'"
  def abc
    puts 'abc!'
  end

  desc "efg [option]", "print 'efg'"
  option :upcase, :type => :boolean, :aliases => '-u', :desc => "disp upcase"
  def efg
    if options[:upcase]
      puts 'EFG!'
    else
      puts 'efg!'
    end
  end
end

Demo.start
```

[Milkode 0.7](http://milkode.ongaeshi.me/wiki/Main_Page)の [milkコマンド](https://github.com/ongaeshi/milkode/blob/master/lib/milkode/cli.rb)の内部で利用しました。

## インストール
```sh
$ gem install thor
```

## リンク
- [mitukiii.jp | Rubyでコマンドラインスクリプト書くならThorが便利そう](http://mitukiii.jp/2011/06/01/thor/)
- [milkode/lib/milkode/cli.rb - Kodeworld](http://kodeworld.ongaeshi.me/home/milkode/lib/milkode/cli.rb)

## 続き
- [その(2) : -hオプションを有効にする](http://qiita.com/items/7829764009b444998b56)
UIATarget でキーボード入力


日本語入力の時、変換候補を選ぶけどそれを選ぶ方法

```javascript
target.frontMostApp().mainWindow().searchBars()[0].tap();
target.frontMostApp().keyboard().typeString("tennnouji");
target.frontMostApp().keyboard().scrollViews()[0].buttons()["天王寺"].tap();
target.frontMostApp().keyboard().typeString("\n");
```
cucumber + spork + guard + factory_girl

## 1 Gemfile

### macの場合

```ruby:Gemfile
group :test do
  gem 'rspec-rails'
  gem "cucumber-rails", "~> 1.0", require: false
  gem 'database_cleaner'
  gem 'spork'
  gem 'capybara'
  gem 'guard'
  gem 'guard-spork'
  gem 'guard-rspec'
  gem 'guard-cucumber'
  gem 'factory_girl_rails'
  gem 'rb-fsevent'
  gem 'growl'
end
```

* cucumber-railsのオプションをつけないとspork+cucumberでうまく動かない
* growlnotifyのインストールが必要
* growl 1.3以上が必要（無料の1.2では動かなかった）

### ubuntu desktopの場合

```ruby:Gemfile
group :test do
  gem 'rspec-rails'
  gem "cucumber-rails", "~> 1.0", require: false
  gem 'database_cleaner'
  gem 'spork'
  gem 'capybara'
  gem 'guard'
  gem 'guard-spork'
  gem 'guard-rspec'
  gem 'guard-cucumber'
  gem 'factory_girl_rails'
  gem 'libnotify'
  gem 'rb-inotify'
end
```

## 2 install

```bash
rails g rspec:install
rspec
rails g cucumber:install --spork
cucumber
spork --bootstrap
guard init spork
guard init cucumber
guard init rspec
```

## 3 Guardfile
`notification :growl`を先頭に追加　#ubuntuの場合追加する必要なし
`guard :spork` のグループを先頭に移動
`:test_unit => false` を念のため追加
sporkの使用を明示
```ruby
guard 'cucumber',:cli => '--drb' do

guard 'rspec', :version => 2, :cli => '--drb' do
```

* `guard init` をするたびにGuardfileの後ろに設定が追記されていくので、設定がかぶっているとsporkサーバの再起動に失敗するエラーが出たりしやすくなる

## 4 FactoryGirl

```bash
rails g factory_girl:model Name [field:type field:type] [options] --dir=spec/factories
````

```ruby:features/support/env.rb
Spork.prefork do
  require 'cucumber/rails'
  require 'factory_girl_rails'
```

`require 'factory_girl_rails'`を適切なところに追加


## 4 start guard

```bash
guard start
````

## 5 サンプル

```ruby:features/blog.feature
#language: ja
機能:Post投稿

    背景:
        前提 次の"post"レコードがある
            |title|content|
            |hello|world|
            |こんにちは|世界!!!!!|

    シナリオ:一覧表示
        もし "/posts"ページを表示する
        ならば "Hello"と表示されていること
        かつ "こんにちは"と表示されていること
        かつ "Edit"と表示されていること
        かつ "Delete"と表示されていること

    シナリオ:詳細表示
        前提 "/posts"ページを表示している
        もし "hello"リンクをクリックする
        ならば "world"と表示されていること
        かつ "世界!!!!!"と表示されていないこと

    シナリオ:新規投稿する
        前提 "/posts"ページを表示している
        もし "New"リンクをクリックする
        かつ "Title"に"ようこそ"と入力する
        かつ "Content"に"Cucumber!"と入力する
        かつ "登録する"ボタンをクリックする
        ならば "/posts"ページを表示していること
        かつ "記事を投稿しました"と表示されていること
        かつ "ようこそ"と表示されていること
```

```ruby:features/step_definitions/blog_steps.rb
#encoding: utf-8
前提 /^次の"(.*?)"レコードがある$/ do |factory, table|
  table.hashes.each do |hash|
    FactoryGirl.create(factory, hash)
  end 
end

前提 /^"(.*?)"ページを表示している$/ do |addr|
  visit addr
end

もし /^"(.*?)"ページを表示する$/ do |addr|
  visit addr
end

もし /^"(.*?)"に"(.*?)"と入力する$/ do |lbl, description|
  fill_in lbl, with: description
end

もし /^"(.*?)"リンクをクリックする$/ do |link|
  click_link link
end

もし /^"(.*?)"ボタンをクリックする$/ do |link|
  click_button link
end
ならば /^"(.*?)"ページを表示していること$/ do |path|
  current_path.should == path
end

ならば /^"(.*?)"と表示されていること$/ do |content|
  page.has_content? content
end

ならば /^"(.*?)"と表示されていないこと$/ do |content|
  page.has_no_content? content
end

````

*先頭の大文字・小文字、複数形でマッチせずはまりやすい
*stepファイルは https://github.com/jnicklas/capybara を参照して作った
cucumber + spork


## 1 Gemfile + bundle

```ruby:Gemfile
group :test do
  gem 'rspec-rails'
  gem "cucumber-rails", "~> 1.0", require: false
  gem 'database_cleaner'
  gem 'spork'
  gem 'capybara'
end
```

*cucumber-rails のオプション指定をしないとsporkでcapybaraなどを認識できないエラーが出る

## 2 install

```bash
 rails g rspec:install
 rails g cucumber:install 
 spork --bootstrap
```

## 3 start server

``` bash
spork cucumber
```

## 4 cucumber

```bash
cucumber [-drb]
```

## 5 tips

```bash
cucumber --i18n ja
```

使える日本語の一覧を表示
ただし、featureファイルの先頭に`#language: ja`を追加する

```ruby:Gemfile
gem 'pickle'
``````bash
bundle
rails g pickle
```便利なstep集
join用の配列を作らずに文字列をjoinする

joinを直書きすれば変数は戻り値だけになる

```javasript:
data=["あ","い","う"];
res="";join=" ";
for(i=0;i<data.length;i++){
	res+=(res!="")?join:"";
	res+=data[i];
}
res;
RubyMotionでHello World!


http://www.rubymotion.com/developer-center/guides/getting-started/
に従って試してみる。

Xcodeの最新版、シミュレータ、Command Line Toolsはインストール済み。

##インストール方法

購入するとZipファイルがダウンロードできる。中身はインストーラなので実行するだけ。途中、ライセンスキーを求められるので、購入時のページ、または購入後に届くメールにあるライセンスキーを入力する。

##インストールの確認

```sh
which motion 
#/usr/bin/motion
motion -v
#1.0
```

##Motionのアップデート

現時点では必要なさそうだけど手順にあるのでやってみる。

```sh
sudo motion update
#Password:
#Connecting to the server...
#Software is up to date```
```

##サポートへの連絡

下記コマンドを実行するとWebブラウザが起動し、フォームにライセンスキー、開発環境などが記入された状態でサポートにチケットを送るページが開く。

```sh
motion support
```

##プロジェクト作成

プロジェクトを作成するにはRailsチックに```motion create```コマンドを使用する。

```sh
motion create Hello
#    Create Hello
#    Create Hello/.gitignore
#    Create Hello/Rakefile
#    Create Hello/app
#    Create Hello/app/app_delegate.rb
#    Create Hello/resources
#    Create Hello/spec
#    Create Hello/spec/main_spec.rb
```

specでテストが書けるようでありがたい。

##アプリの作成

実際にコードを書いてみる。
下記のコマンドを実行してみろとあるのでしてみたらエラー。

```sh
cd Hello
rake
#   ERROR! RubyMotion doesn't support any of these SDK versions: 4.3
```

5.1のSDKを入れているはずなのに。
調べてみたら場所がダメっぽかったのでシンボリックリンクを貼ってみた。

```sh
sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk /Developer/Platforms/iPhoneOS.platform/Developer/SDKs
```

再度実行。今度はシミュレータがダメっぽかったので再びシンボリックリンクを貼る。

```sh
rake
#ERROR! Can't locate iPhoneSimulator SDK 5.1 at `/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk'
```

```sh
sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs
```

今度こそはと実行。

```sh
rake
#     Build ./build/iPhoneSimulator-5.1-Development
#   Compile ./app/app_delegate.rb
#    Create ./build/iPhoneSimulator-5.1-Development/Hello.app
#      Link ./build/iPhoneSimulator-5.1-Development/Hello.app/Hello
#    Create ./build/iPhoneSimulator-5.1-Development/Hello.app/Info.plist
#    Create ./build/iPhoneSimulator-5.1-Development/Hello.app/PkgInfo
#    Create ./build/iPhoneSimulator-5.1-Development/Hello.dSYM
#  Simulate ./build/iPhoneSimulator-5.1-Development/Hello.app
```

無事に処理が終了した模様。```rake```を実行するとビルドされシミュレータが起動するようだ。

http://gyazo.com/09f3230d5b7d9bfcb29891d3fc445aff

またターミナルで入力を受け付けているのであれやこれや実行できるみたい。

これでやっとコードが書けそうなのでサンプルにあるコードを書いて実行。

```ruby:app/app_delegate.rb
class AppDelegate
  def application(application, didFinishLaunchingWithOptions:launchOptions)
    alert = UIAlertView.new
    alert.message = "Hello World!"
    alert.show
    true
  end
end
```

```sh
rake
#     Build ./build/iPhoneSimulator-5.1-Development
#   Compile ./app/app_delegate.rb
#      Link ./build/iPhoneSimulator-5.1-Development/Hello.app/Hello
#    Create ./build/iPhoneSimulator-5.1-Development/Hello.dSYM
#  Simulate ./build/iPhoneSimulator-5.1-Development/Hello.app
```

無事に動いた。
http://gyazo.com/d12200f7a4f9e0bd0c18d0d3d4061593
Rails3.2系にアップデート後、Deviseのフォームでclient_side_validationsが動かなかったけど…


Rails 3.1系から3.2系にアップデート後、DeviseのViewで使用してるフォーム上でclient_side_validationsが動かなくなってしまってはまっていた。

	:html => {:id => 'hoge'}

と、form_forにidを指定してあげたらなぜか動いた。

なぜだ。

わからないけど動いた。

気持ち悪いけど動いたからとりあえずよしとする。
Rubyで無名再帰(Zコンビネータ)

無名再帰を使ってフィボナッチ数の計算をしてみた。
イマイチ理屈はわかってないけど…

```ruby:z-combinator.rb
# Zコンビネータ
def Z(func)
  lambda do |f|
    lambda{|x|lambda{|y| f[x[x]] [y]}}[
      lambda{|x|lambda{|y| f[x[x]] [y]}}]
  end[func]
# .callメソッドで書くとこう
#  lambda do |f|
#    lambda{|x|lambda{|y| f.call(x.call(x)).call(y)}}.call(
#      lambda{|x|lambda{|y| f.call(x.call(x)).call(y)}})
#  end.call(func)
end

# フィボナッチ数
fib = Z(lambda{|f|lambda{|n| n < 2 ? n : f[n - 2] + f[n - 1]}})
p fib.call(7) # 1, 1, 2, 3, 5, 8, 13, ...
```

とりあえず今はおまじない的に覚えておこうと記録
Viewに合わせた辞書ファイルの書き方

viewから簡単に翻訳

```config/locale/ja.yml
model:
	view_name:
		hoge: '日本語テキスト'
		foo: '日本語テキストだって'
```

```app/views/view_name.htm.erb
<%= t '.hoge' %>
<%= t '.foo' %>
Bundlerでgithubから直接ソースを取得してgemを構築する


*tilt-1.3.3ではTwitter Bootstrapのbootstrap.lessはコンパイルできないが、最新版ではできる。*

Sinatraから以下のようなパスで、Twitter Bootstrapのbootstrap.lessを実行時コンパイルしようとしたが出来なかった。

```ruby:web.rb
get '/css/bootstrap.css' do
  less :bootstrap, :views => ["bootstrap/less"], :paths => ["bootstrap/less"]
end
```

調べたところ、指定したpathsオプションがless.rbまで渡っていないもよう。これは、tilt-1.3.3の以下の実装の問題。

```ruby:lib/tilt/css.rb
parser  = ::Less::Parser.new(:filename => eval_file, :line => line)
```

これは以下のコミットで修正されている。

https://github.com/rtomayko/tilt/commit/70465f9bb6ff191abcd71b9c5156dc5639c446e1

```ruby:lib/tilt/css.rb
parser  = ::Less::Parser.new(options.merge :filename => eval_file, :line => line)
```

と言うことで、最新版では起きないはず。
こういう場合、Gemfileでgitオプションを使えばよい。

```ruby:Gemfile
source :rubygems
gem 'tilt', :git => "git://github.com/rtomayko/tilt.git"
gem 'sinatra'
gem 'thin'
gem 'less'
gem 'therubyracer'
```

bundle listすると、gitのコミットがちゃんと明記されている。

```
$ bundle list
…
tilt (1.3.3 10a8ffa)
…
```

このtiltを使うと、bootstrap.cssが生成されることを確認できた。
globalオブジェクトを取得する

JavaScriptでスコープの一番外側であるグローバルオブジェクトの取得方法について。ブラウザではwindowオブジェクトのことだが、サーバーサイドでは名前が異なるので環境に依存しないやり方をまとめる。

# globalスコープ上でthis

```javascript
var global = this;
```

しかしこれ、node.jsでは使えない。node.jsではスクリプトごとにスコープが切り離されており、thisはglobalでなく専用のmoduleオブジェクトを指しているため。

# 無名関数で取得する

```javascript
var global = (function(){return this})();
```

無名関数にするとスコープに依存しなくなる(どんな関数やメソッド内に記載しても動く)のでよりベター。
しかし、strict modeでは動かない。strict modeでは関数内の暗黙のthisがglobalでなくundefinedにされてしまう。

```javascript:strictでは使えない
"use strict";
var global = (function(){return this})();
console.log(global); //undefined
```

# indirect eval call

ECMAScript 5ではindirect eval callなんていう技が存在する。evalに別名をつけて呼ぶとglobalスコープで実行されることを利用する。スコープ非依存でstrict modeの影響も受けない。

```javascript
var e = eval, global = e("this");
//↓余計な変数を増やさない書き方
var global = ("global",eval)("this");
```

evalを間接的に呼べばいいので色々な書き方が存在するが、慣例としてカンマ演算子を使い、"global"などのダミー文字列をくっつける書き方がある。
完璧だがECMAScript5に準拠している環境でないと実行できない。例えばIE6などで動作しない。

# Functionコンストラクタ

strict modeはFunctionコンストラクタまで伝搬しない。

```javascript
var global = new Function("return this")();

//newは省略可
var global = Function("return this")();
```

Functionコンストラクタは現在使われている主要なすべての環境で使えるし、スコープ非依存でstrict modeの影響も受けない。というわけで、個人的に`Function("return this")()`をよく使っている。

参考：
http://togetter.com/li/59797
jQuery の data() と data- attributes

say foo ボタンを押すと例外をアラートで表示、
say bar ボタンを押すとセットした関数が実行されます。

```html:data-attributes.html
<!DOCTYPE html>
<html>
    <head>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
    </head>
    <body>
        <input type="button" id="button0" value="say foo" />
        <input type="button" id="button1" value="say bar" />
        <script type="text/javascript">
            var elm = document.querySelector('#button0');
            elm.dataset.foo = function () {
                alert('foo');
            };
            elm.addEventListener('click', function () {
                try {
                    elm.dataset.foo();
                } catch (e) {
                    alert(e.toString());
                }
            }, false);

            $('#button1').data('bar', function () {
                alert('bar');
            });
            $('#button1').click(function () {
                $(this).data('bar')();
            });

        </script>
    </body>
</html>
```
foremanでthinを起動しても何も表示されない件の解決策

```ruby:Procfile
web: rails s thin -p $PORT -e $RACK_ENV
```

こんなProcfileでforemanを起動すると、下記のように`Ctrl-c`押すまで何も表示されない。実際には動いてるので問題はないっちゃないけど。

```
$ foreman start
12:06:59 web.1     | started with pid 1683
^CSIGINT received
12:07:23 system    | sending SIGTERM to all processes
12:07:23 system    | sending SIGTERM to pid 1683
12:07:23 web.1     | => Booting Thin
12:07:23 web.1     | => Rails 3.2.3 application starting in development on http://0.0.0.0:5000
12:07:23 web.1     | => Call with -d to detach
12:07:23 web.1     | => Ctrl-C to shutdown server
12:07:23 web.1     | >> Thin web server (v1.3.1 codename Triple Espresso)
12:07:23 web.1     | >> Maximum connections set to 1024
12:07:23 web.1     | >> Listening on 0.0.0.0:5000, CTRL+C to stop
12:07:23 web.1     | >> Stopping ...
12:07:23 web.1     | >> Stopping ...
12:07:23 web.1     | Exiting
12:07:23 web.1     | process terminated
```

ただ、気持ち悪いので修正する方法を探したところ、foremanの開発者がgithubのissuesで答えてたのでメモ。config.ruに追記すればいい。

```ruby:config.ru
# This file is used by Rack-based servers to start the application.

require ::File.expand_path('../config/environment',  __FILE__)
run OGiri::Application

# ここ追記
$stdout.sync = true
```

```
$ foreman start
12:06:43 web.1     | started with pid 1669
12:06:48 web.1     | => Booting Thin
12:06:48 web.1     | => Rails 3.2.3 application starting in development on http://0.0.0.0:5000
12:06:48 web.1     | => Call with -d to detach
12:06:48 web.1     | => Ctrl-C to shutdown server
12:06:48 web.1     | >> Thin web server (v1.3.1 codename Triple Espresso)
12:06:48 web.1     | >> Maximum connections set to 1024
12:06:48 web.1     | >> Listening on 0.0.0.0:5000, CTRL+C to stop
```

無事解決！
MacBook Air(OS X Lion)のシステム環境設定

私が設定変更したところだけ記述します。何かの参考になれば。

# Dock

* Dock を右に配置
* 起動済みのアプリケーションにインジケータ・ランプを表示

# Mission Control

* ダッシュボードは使わないので無効にする。
* `F11`キーと`F12`キーは別の用途で使いたいので、キー割り当てを外す

![Mission Control](https://lh5.googleusercontent.com/--BEePU4NBII/T6MxKizvZLI/AAAAAAAAD_U/NPMX2pjagF8/s400/Mission%20Control.png)

## ホットコーナー

全てオフにします

![ホットコーナー](https://lh5.googleusercontent.com/-aP51T2H0MkQ/T6MxNxkeCyI/AAAAAAAAEAA/3Foi1vA-i5Q/s400/%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E7%92%B0%E5%A2%83%E8%A8%AD%E5%AE%9A.png)

# ユニバーサルアクセス

## 聴覚

* 警告音がなる時に画面を点滅させる

# 省エネルギー

* メニューバーにバッテリーの状況を表示

# キーボードショートカット

* `command`+`space` で出てくる入力ソース選択は使わないのでオフにする
* `control`+`1`〜`4` でデスクトップを切り替えできるようにする

他の気になる項目があれば、オン／オフするなり、キーを変更するなりお好みでどうぞ。

![キーボード1](https://lh3.googleusercontent.com/-5h8XSQG6PA4/T6MxMfGKupI/AAAAAAAAD_0/fwgqBJ15P-c/s400/%E3%82%AD%E3%83%BC%E3%83%9B%E3%82%99%E3%83%BC%E3%83%88%E3%82%99.png)

![キーボード２](https://lh3.googleusercontent.com/-ylKHCJyZL3g/T6MxNTQ6RsI/AAAAAAAAEAE/fFVDT3GQ2wI/s400/%E3%82%AD%E3%83%BC%E3%83%9B%E3%82%99%E3%83%BC%E3%83%88%E3%82%99-1.png)

# トラックパッド

* すべてオンにする ことで、以下のようなジェスチャーが使えるようになります。

* 二本指でスワイプ →スクロール
* 三本指でスワイプ →ファイルのドラッグもしくは選択
* 四本指で左右にスワイプ→:デスクトップを切り替え
* 四本指で上にスワイプ → mission control(起動している画面一覧をサムネイルから選んで切り替え)
* 四本指で下にスワイプ → Expose(アクティブなアプリの画面一覧ををサムネイルから選んで切り替え)
* 親指と3本指でピンチ → LaunchPadの表示(iPhoneのホーム画面風にアプリケーションを一覧から選んで起動)
* 親指と3本指で広げる → デスクトップを表示(デスクトップのアイテムにすぐアクセスできる)

# メール/連絡先/カレンダー

* iCloud のアカウントを追加するのみ

# ネットワーク

* IPアドレスをDHCPではなく、手入力で固定にする

# Bluetooth

* 今のところ使っていないので、オフにしておく

# 共有

* ファイル共有のみオンにする

# ユーザとグループ

* ログイン項目の必要な物だけオンにする

# 日付と時刻

* デジタルで、日付と曜日まで表示にする
perl な variable check and print


# SYNOPSIS
変数の存在チェックと出力を 1line で行う書き方.
丁寧な？書き方と比較して書きました.

# CODE
下のコードと同様のを Gist にも置いておきます.
[variable_check.pl](https://gist.github.com/2626813)

```perl:variable_check.pl
#!/usr/bin/env perl
use strict;
use warnings;

# こんな変数がありましたとさ
my $data = { param => "foo\n" };

for (0..1) {
    # 丁寧に？書くとこうなる
#   if ($data->{param}) {
    if (defined($data->{param})) {
        print $data->{param};
    } else {
        print '$data->{param}' . " is nothing.\n";
    }

    $data->{param} = undef;
}

$data->{param} = "baz\n";
for (0..1) {
    # 1 line な感じで書くとこうなる
#   if ($_ = $data->{param}) {} else { $_ = '$data->{param}' . " is nothing.\n"; } print;
    if (defined($_ = $data->{param})) {} else { $_ = '$data->{param}' . " is nothing.\n"; } print;

    $data->{param} = undef;
}

$data->{param} = "bar\n";
for (0..1) {
    # さらに, 存在しない時に出力しなくていいならば
#   print if $_ = $data->{param};
    print if defined($_ = $data->{param});

    $data->{param} = undef;
}
```

# EDIT:
`$data->{param} = 0;`
`$data->{param} = '';`
の時に, 挙動が想定してるのと違うことになるので修正しました.
上記の条件の時に, nothing の方に入りたい場合は, defined を外してあるコメントアウトのような書き方でOK.
JavaScriptコンソールを使うときのバッドノウハウ


Firefox と Opera、node のコンソールではオブジェクトの中身をダンプしようとする。
以下、10の要素をもつ Float32Array を変数aに代入した様子。これがもし、100万要素の Float32Array だったら表示に時間がかかる。鬱陶しい。最悪クラッシュする。ちなみに 100万要素は 44.1kHz のモノラルで 23秒 くらいのデータ量。配列でなくても、複雑な木構造のデータとかでも危険なときがある。

``` chrome-or-safari.js
a = new Float32Array(10)
// > Float32Array
```

```firefox.js
a = new Float32Array(10)
// > ({0:0, 1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0})
```

```opera.js
a = new Float32Array(10)
// + Float32Array [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
```

```node.js
> a = new Float32Array(10)
{ '0': 0,
  '1': 0,
// ...
  '8': 0,
  '9': 0,
  buffer: 
   { '0': 0,
     '1': 0,
// ...
     '38': 0,
     '39': 0,
     byteLength: 40 },
  BYTES_PER_ELEMENT: 4,
  set: [Function: set],
  length: 10,
  slice: [Function: slice],
  byteOffset: 0,
  byteLength: 40,
  subarray: [Function: subarray] }
```


## 回避策
最後に評価されたものをダンプしようとするので、`, 0` をつけてあげる。

```badknowhow.js
a = new Float32Array(1000000), 0
// > 0
a.length
// > 1000000
```
SJIS(CP932)とCRLFのCSVファイルをUTF8のテーブルにドン


##概要
Windowsとかで作ったCSVをUTF8のスキーマにドンする

##書き方

```
set character_set_database=cp932;

create table hoge( fuga varchar(128) )
default charset=cp932;

load data local infile 'load_csv/hoge.csv'
into table hoge
fields terminated by ','
lines terminated by '\r\n'
ignore 1 lines;

-- 入れてからのぉUTF8
set names utf8;

-- で、つくり直す
drop table if exists hoge_utf8;
create table hoge_utf8 as select * from hoge;

```

ドン
postfix でメール受信時にプログラムを起動する 

postfix で @example.com ドメイン宛メール受信時にPHPプログラムを起動する

postfix の設定

```/etc/postfix/main.cf
mydomain = example.com
myorigin = $myhostname
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
virtual_alias_maps = regexp:/etc/postfix/virtual.myrequest
```

起動条件（正規表現）

```/etc/postfix/virtual.myrequest
/^(.*)@example\.com/ kilica-request
```

起動するPHPの指定

```/etc/aliases
kilica-request: "| /usr/bin/php /path/to/file/myprocess.php"
```
レコードをグルーピングする


##概要

グルーピングするカラムに値を入れるとき、1行フェッチして前のレコードと比較で云々とかやりがちだけど、mysqlはリファレンスにも書いてあるこのやり方で、超簡単に採番できる。

##やり方
まず、MyISAMでグルーピングするカラムをAUTO_INCREMENTで作る。その時のPKは複合キーにしてやる。

```
create table seq_gid
    ( gid_val char(3)
     ,gid     int auto_increment
     ,id      int
     ,primary key(gid_val,gid) )
    engine=myisam;
```

あとは、以下のようにインサートすればいい。

```
insert into seq_gid(gid_val,id) values('AAA',1);
insert into seq_gid(gid_val,id) values('AAA',2);
insert into seq_gid(gid_val,id) values('BBB',3);
insert into seq_gid(gid_val,id) values('BBB',4);
insert into seq_gid(gid_val,id) values('BBB',5);
insert into seq_gid(gid_val,id) values('CCC',6);
```

すると、こうなる。

```
mysql> select * from seq_gid;
+---------+-----+------+
| gid_val | gid | id   |
+---------+-----+------+
| AAA     |   1 |    1 |
| AAA     |   2 |    2 |
| BBB     |   1 |    3 |
| BBB     |   2 |    4 |
| BBB     |   3 |    5 |
| CCC     |   1 |    6 |
+---------+-----+------+
6 rows in set (0.00 sec)
```

簡単すぎて、鼻水出る。
名前空間用のオブジェクトを作る関数

com.example.foo.baaのような入れ子のオブジェクトを作って名前空間として活用することはよく行われるが、そのような多段入れ子のオブジェクトを一発で作る関数。これがないと面倒くさい。大抵のライブラリには入っているかもしれない。

```javascript
function namespace(str) {
  var names=str.split(".")
    , i, l, cur = Function("return this")()
    ;
  for (i=0,l=names.length; i<l; i++) {
    cur[names[i]] = cur[names[i]] || {};
    cur = cur[names[i]];
  }
  return cur;
}
```

```javascript
//使い方
namespace("com.example.foo.baa");
console.log(com); // {example: {foo: {baa: {} } } }
```
HTMLやCSSの変更を自動でブラウザに反映させる

## 概要
- LiveReloadをguardで起動する。
- すると、guardがHTMLやCSSの変更をキャッチしてLiveReloadでブラウザが自動でリロードされる。
- [これ](http://youtu.be/EZ8vy_cNMVQ)を見た方がはやい。
- サブディスプレイに複数のブラウザを立ちあげてLiveReloadをオンにして、ファイルの変更がいっぺんにそれらのブラウザに反映されるのが感動。鳥肌もの。

## 手順
1. `guard-livereload`をbundleでいれる
2. `guard init livereload`で`Guardfile`を設定する。
3. `guard`でファイルの変更のウォッチをスタート。
4. ブラウザのアドオンでLiveReloadをオンにする

## Rails
```ruby:Gemfile
group :development, :test do
  gem 'rb-fsevent' if RUBY_PLATFORM =~ /darwin/i
  gem 'guard-livereload'
end
```

```
$ bundle install
$ guard init livereload
$ guard
```

## アドオンたち
- Firefox：[https://addons.mozilla.org/ja/firefox/addon/livereload/](https://addons.mozilla.org/ja/firefox/addon/livereload/)、最新版（v12）ではうまく動かなかったので、これのためだけにv5までダウングレードしてる。
- Chrome：[https://chrome.google.com/webstore/detail/jnihajbhpnppcggbcgedagnkighmdlei](https://chrome.google.com/webstore/detail/jnihajbhpnppcggbcgedagnkighmdlei)
- Safariもあるらしい。
- IEにもほしいけど、どうなんだろう。
set_error_handler と ErrorException を組み合わせると幸せになるかも


```set_error_handler()``` のコールバック関数でエラー情報を一旦 ```ErrorException``` にしておくと、いろいろ恩恵が得られるというお話。

```php
<?php

// ErrorExceptionをもう少し便利にしたクラス
class MyErrorException extends ErrorException
{
	protected static $severities = [
		E_ERROR             => 'ERROR',
		E_WARNING           => 'WARNING',
		E_PARSE             => 'PARSING ERROR',
		E_NOTICE            => 'NOTICE',
		E_CORE_ERROR        => 'CORE ERROR',
		E_CORE_WARNING      => 'CORE WARNING',
		E_COMPILE_ERROR     => 'COMPILE ERROR',
		E_COMPILE_WARNING   => 'COMPILE WARNING',
		E_USER_ERROR        => 'USER ERROR',
		E_USER_WARNING      => 'USER WARNING',
		E_USER_NOTICE       => 'USER NOTICE',
		E_STRICT            => 'STRICT NOTICE',
		E_RECOVERABLE_ERROR => 'RECOVERABLE ERROR',
		E_DEPRECATED        => 'DEPRECATED',
		E_USER_DEPRECATED   => 'USER DEPRECATED',
	];

	/**
	 * return full exception message
	 * @return string
	 */
	public function getFullMessage()
	{
		return sprintf('%s: %s in %s on line %u', $this->getSeverityString(), $this->getMessage(), $this->getFile(), $this->getLine());
	}

	/**
	 * return the exception severity as string
	 * @return string
	 */
	public function getSeverityString()
	{
		return $this->_severityToString($this->getSeverity());
	}

	/**
	 * return severity as string
	 * @param int $severity
	 * @return string
	 */
	protected function _severityToString($severity)
	{
		if ( array_key_exists($severity, static::$severities) === true )
		{
			return static::$severities[$severity];
		}

		return 'UNKNOWN ERROR('.$severity.')';
	}
}

// エラーハンドラーの登録
set_error_handler(function($severity, $message, $file, $line) {

	// 一度例外オブジェクトにすると、エラーをオブジェクト指向的に扱えます。
	// 例外オブジェクトですが必ずしも throw する必要はないです。
	$errorException = new MyErrorException($message, 0, $severity, $file, $line);
	
	// ErrorExceptionを継承したクラスを使うこともできます。
	echo $errorException->getFullMessage(), PHP_EOL;
	
	// オブジェクトを文字列にキャストすると、バックトレースもできます。
	echo $errorException;
	
	// 任意のファイルに書き込んだりとか。
	error_log($errorException, 3, '/tmp/error_log');
	
	// オブザーバパターンを使って、オブザーバに知らせるとか。
	observe_error($errorException);
	
	// 例外を投げて処理を中断したり。
	throw $errorException;
});

// オブザーバ
function observe_error(ErrorException $errorException) {
	// ErrorException を使えば、コールバック関数側で、引数に型を指定できるので、契約プログラミング(Programming By Contract)的な安心感があります。
	// function($severity, $message, $file, $line) {} のような引数いっぱいのコールバックを書かなくてよくなります。

	// ErrorExceptionの処理が続く...
}


// エラーを起こす
trigger_error('エラーだよ!');
```
buildUriPath

```d
@safe
string buildUriPath(Paths...)(Paths paths)
{
    @safe
    static typeof(return) joinPaths(in string lhs, in string rhs) pure nothrow
    {
        return lhs ~ "/" ~ rhs;
    }

    @trusted
    string[] pathsToStringArray() // TODO: pure nothrow (because of to!string)
    {
        auto result = new string[](paths.length);
        foreach (i, path; paths)
            result[i] = path.to!string;
        return result;
    }

    return reduce!joinPaths(pathsToStringArray());
}
```

I want to know a better way…
ZSHのPROMPTの先頭にホスト名を追加する


oh-my-zshで、PROMPTに追記する必要があったのでメモ。

```zsh
export PROMPT="%{$fg_bold[blue]%}${HOST} $PROMPT"
```
と .zshrc 等に設定すると

![ss 2014-06-12 15.30.32.png](https://qiita-image-store.s3.amazonaws.com/0/2908/8867ffed-4b1c-04cf-9598-cd789ae943e9.png)

という感じで $HOST が頭につく。

画面の右端に表示するならこうかな？

```zsh
export RPROMPT="%{$fg_bold[blue]%}${HOST}"
```
CSSのパースにはJSCSSP

* 多少invalidでもパースしきってくれる
* background: #000 というCSSも background-color: #000 のように統一してくれる

nodeモジュールやCPANモジュールも漁ったがこれが一番だった。

```javascript
var cssText = 'body {background: #000 url(image/hoge.gif) no-repeat fixed right bottom;}';

var parser = new CSSParser();
var parsed = parser.parse(cssText, false, false);

JSON.stringify( parsed.cssRules[0].declarations[0], null, "  " );

/*
  "{
    "type": 1000,
    "property": "background-color",
    "values": [
      {
        "value": "#000",
        "type": 1,
        "name": null,
        "parentRule": null,
        "parentStyleSheet": null
      }
    ],
    "valueText": "#000",
    "priority": false,
    "parsedCssText": "background-color: #000;",
    "parentStyleSheet": null,
    "parentRule": null
  }"
*/
```

公式：[JSCSSP, a CSS parser in JavaScript](http://www.glazman.org/JSCSSP/)
Ext.Listで矢印アイコン付きのリストを表示する。


Ext.Listで矢印アイコン付きのリストを表示したい場合は、"onItemDisclosure"プロパティで矢印をタップした際のイベントハンドラを設定すると、自動で表示される。

```javascript
Ext.create('Ext.List', {

	onItemDisclosure: function(record, item, index, e) {
		console.log('disclosure');
});
```
sencha app buildコマンドのメモ


Sencha SDK Toolsでは、以下のコマンドでSencha Touch2のアプリケーションのJSファイルを圧縮できる。

```sh
$ sencha app build testing/production
```

buildコマンドでは、各クラスのrequireプロパティから、アプリケーションのクラスとSDKのクラスを必要なクラスだけ結合して、一つのファイル（app.js）にまとめる。

## testing

* app.jsは圧縮されない

## production

* app.jsは圧縮される（一行になる）

## \<debug>〜\</debug>タグ

コメントで、\<debug>と\</debug>タグで囲むと、囲まれたJSコードはapp.jsに含まれなくなる。

```javascript
function getPanel(html) {
	// <debug>
	if (!Ext.isDefined(html)) {
		throw new Error('html is required.');
	}
	// </debug>

	var panel = Ext.create('Ext.Panel');
   		 ・
	   	 ・
	   	 ・
}
```

上記の様なコードだと、引数チェックのJSコードはapp.jsに含まれない。
PivotalTrackerのTIMEについて

PivotalTrackerで一見TIMEの使い方がわからなかったのでそのあたりをまとめておきます。

アカウントの設定で「Time Tracking」を有効にすれば、てっきりストーリーをスタート/ストップしたタイミングで時間を記録してくれるものだ勘違いしていました。

下記該当する[FAQ](https://www.pivotaltracker.com/help#timekeeping)の訳より、

Q: トラッカーは、自分がどれくらいストーリーやプロジェクトに費やしているかどうかを追跡できるのでしょうか？
A: いいえ、時間の保管は手動でします。トラッカーは、プロジェクトのレベルをベロシティで追跡します。Pivotal Labsでは、通常一日の終わりに、請求用に数分程度かけて、各クライアントのプロジェクトにどれくらい時間を費やしたかを記録します。

ということで、自動では記録してくれないようです。

グローバルナビゲーションの[TIME]をクリックし、[TIME TRACKER]画面が開くので、[New Shift]というリンクがあるのでそのリンクを押します。[NEW TIME SHIFT]画面が開くので該当するプロジェクトに費やした日と時間を手動で入力します。
ZNC で SockError が出たとき


ZNC で以下のようなエラーが出たときの対処法です。

```
SockError(99 Cannot assign requested address (Is your IRC server's host name valid?))
```

以下のようにして解決しました。

```
/znc setvhost 0.0.0.0
```

IPv6 のアドレスを IPv4 のアドレスへ強制的にバインドするようです。

[SourceForge.net: ZNC - Advanced IRC Bouncer: CSocket - error](http://sourceforge.net/projects/znc/forums/forum/396039/topic/3800906 "SourceForge.net: ZNC - Advanced IRC Bouncer: CSocket - error")

[Issue 39 - znc-msvc - Can't connect to IRC server - ZNC (an advanced IRC bouncer), now available for Microsoft Windows! - Google Project Hosting](http://code.google.com/p/znc-msvc/issues/detail?id=39 "Issue 39 - znc-msvc - Can't connect to IRC server - ZNC (an advanced IRC bouncer), now available for Microsoft Windows! - Google Project Hosting")
オーバーレイなどの枠外をクリックされたときに閉じる動作


`event.stopPropagation()` を使うと簡単なようです。

```javascript
$('html').click(function() {
  //Hide the menus if visible
});

$('#menucontainer').click(function(event){
  event.stopPropagation();
});
```

### 参考
[javascript - How to detect a click outside an element? - Stack Overflow](http://stackoverflow.com/questions/152975/how-to-detect-a-click-outside-an-element "javascript - How to detect a click outside an element? - Stack Overflow")
複雑な namespace を持つ Rails アプリケーションで new と edit で form を共有したいとき


通常、以下のように書きますけど、

```ruby
<%= form_for @hoge do |f| %>
  …
<% end %>
```

たとえば @hoge が `Fuga::Hoge` なクラスのインスタンスだったとしたら、 Rails が自動で form に設定するURLは `hoge_path` になるので、そんな URL ないよと Route Error が表示されます。

このようなときには以下のようにします。

```ruby
<%= form_for [:fuga, @hoge] do |f| %>
  …
<% end %>
```

### 参考
[ActionView::Helpers::FormHelper](http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-form_for "ActionView::Helpers::FormHelper")
anythingから、ローカルにあるrubygemsのソースを開く

すでに誰か作ってるかもしれんけど、

```cl
(defvar anything-c-sources-local-gem-file
  '((name . "gems (local)")
    (candidates-in-buffer)
    (init . (lambda ()
              (unless (anything-candidate-buffer)
                (call-process-shell-command
                 "gem list" nil (anything-candidate-buffer 'global)
                 ))))
    (action . (lambda (gem-name)
                (setq gem-name (replace-regexp-in-string "\s+(.+)$" "" gem-name))
                (with-temp-buffer
                  (call-process "gem" nil t nil "which" gem-name)
                  (let ((path (buffer-substring-no-properties (point-min)
                                                              (- (point-max) 1))))
                    (if (file-exists-p path)
                        (find-file path)
                      (message "no such file or directory:\"%s\"" path))))
                ))))

(defun anything-local-gems ()
  (interactive)
  (anything-other-buffer
   '(anything-c-sources-local-gem-file)
   "*anything local gems*"
  ))
```

M-x anything-local-gems で、インストールされているgemの一覧が出るので、選ぶと、それのソース開きます。

ffap + devel-whichあればそんなに必要ないか…
ログインシェルはデフォルトのまま、あたかもzshがログインシェルのようにする

NFSでホームディレクトリが共有されているサーバ群の中で、いくつかはzshが使えないマシンがある場合にこのようなことをしています。

例えばbashなら.bashrcの先頭に下記のコードを追加するだけ。

```.bashrc
if which zsh 1> /dev/null 2> /dev/null; then
    export SHELL=`which zsh`
    exec $(which zsh)
fi
```
Node 0.7.x で Express をインストールしないこと

Node 0.7.x において npm install -g express すると Express 1.0.7 がインストールされてしまう．

現在 (2012-05-03)，Express は 2.5.9 が最新版として出ていて，3.0.0 も alpha が出ている (参考 : http://search.npmjs.org/#/express) ．そんな中で 1.0.7 がインストールされるというのはあまりにアレである．そしてそれがエラー無く動くのならともかくすぐにコケる．

express コマンドで何をやっても

```
node.js:256
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: The "sys" module is now called "util".
    at sys.js:1:69
    at NativeModule.compile (node.js:583:5)
    at Function.require (node.js:551:18)
    at Function._load (module.js:297:25)
    at Module.require (module.js:357:17)
    at require (module.js:373:17)
    at Object.<anonymous> (/****/node_modules/express/bin/express:8:11)
    at Module._compile (module.js:444:26)
    at Object..js (module.js:462:10)
    at Module.load (module.js:351:32)
```

とエラーが出る．

このエラー自体は Express 2.x で修正されている (参考 : https://github.com/visionmedia/express/issues/1025) らしい．

しかし，Express 2.x では Node 0.8.x に対応しない (参考 : https://github.com/visionmedia/express/issues/1004#issuecomment-3922956) らしい．

また，このエラー自体の原因は

> Express.jsに対応したConnect.jsのバージョンがどうやらインストールされていないらしい。インストールしているExpress.jsのバージョンは1.0.7で、そのバージョンのExpress.jsが対応しているConnect.jsは0.5.10らしい。しかしnpmからインストールするとConnect.jsは1.0.1がインストールされてしまうためにエラーとなっている

(引用元 : http://my-clip-devdiary.blogspot.jp/2012_02_01_archive.html)

らしい．

しかし，そもそもなんで Node 0.7.x で Express 1.0.7 がインストールされることになるのかよく分かりません．(どなたか知っていればご教授下さい)

まぁ，なので Express をひとまず使ってみるなら今のところは Node 0.6.x を使いましょう．というか不必要に開発版を使うなってことですかね．Node 0.6.15 を使えば Express 2.5.8 が入って普通に使えました．

Node + Express の練習には http://qiita.com/items/ff21dfc0e53f52107b1a をどうぞ．
CSSで三角を作る方法

BootStrapのdropdownで使用してた。
色々使えそう。というかこんなの当たり前なのだろうか。。

```html
<div id="Result"></div>
```

```css
#Result{
border-bottom: 60px solid #FF0000;
border-left: 60px solid transparent;
border-right: 60px solid transparent;
display: inline-block;
}
```
NginxでPC,スマートフォンごとにrootディレクトリを変更する方法


ユーザエージェントを判別してPC,スマートフォンそれぞれ専用のrootディレクトリを見るようにする。setディレクティブでスマートフォンかどうかのフラグを定義して最後にフラグを用いて処理を振り分けるのがコツ。この方法はアクセス制御とかでもかなり使える。

```Nginx:
set $is_sphone 0;
if ($http_user_agent ~ Android) {
  set $is_sphone 1;
}

if ($http_user_agent ~ iPhone) {
  set $is_sphone 1;
}

if ($http_user_agent ~ iPod) {
  set $is_sphone 1;
}

# iPadも切り替えたい場合
#if ($http_user_agent ~ iPad) {
#   set $is_sphone 1;
#}

location / {
  if ($is_sphone = 1) {
    root /var/www/smart_phone;
  }

  if ($is_sphone != 1) {
    root /var/www/pc;
  }
}
```
jquery-rails で確認プロンプトを Bootstrap のモーダルとして表示する

```erb:link.html.erb
<%= link_to "Delete", delete_post_path(post), :confirm => "Are you sure?", :method=>:delete %>
```
みたいにすると、デフォルトでは JavaScript の `confirm` で確認され、格好悪いので、`$.rails.fire` メソッドを上書きして Bootstrap のモーダルを出します。

```coffeescript:confirm.js.coffee
rails = $.rails
_fire = rails.fire
modal = null

createModal = () ->
  $("body").append('<div class="modal hide fade" id="confirm-modal">
    <div class="modal-header">
      <a class="close" data-dismiss="modal">&times;</a>
      <h3>Confirmation</h3>
    </div>
    <div class="modal-body">
      <p class="modal-message"></p>
    </div>
    <div class="modal-footer">
      <a href="#" class="btn" data-dismiss="modal">Cancel</a>
      <a href="#" class="btn btn-danger" data-submit-modal="modal">OK</a>
    </div>
  </div>')
  modal = $("#confirm-modal")
  
rails.fire = fire = (obj, name, data) ->
  if name == 'confirm'
    message = obj.data 'confirm'
    (modal||createModal())
      .modal({ backdrop: true, keyboard: true, show: true })
      .one "hide", () ->
        btnSubmit.unbind "click"
        false
    btnSubmit = modal
      .find("a[data-submit-modal]")
      .one "click", () ->
        if obj.is rails.linkDisableSelector
          rails.disableElement obj
        if obj.data('remote') != undefined && rails.handleRemote(obj) == false
          rails.enableElement obj
        else if obj.data 'method'
          rails.handleMethod obj
        modal.unbind("hide").modal("hide")
        false
    modal
      .find(".modal-message")
      .html(obj.data("confirm"))
    false
  else
    _fire.apply this, [obj, name, data]
```
eg で Git のコマンド体系を改善する

Git は強力な VCS だけど，コマンド体系が不必要に複雑で使いにくかったりする．そこで，Git を wrap してコマンドを使いやすくした [eg](http://people.gnome.org/~newren/eg/) というツールがある．特徴は以下の通り．

* 基本的に，Git にできることは eg でもできる．(eg はほとんどのフラグをそのまま Git に渡すので，大体 Git と同じ使い方ができる．)
* いくつかのコマンドが使いやすくなっている．特に `revert` が Subversion や Mercurial と同じように使えるようになっていたり，`commit` が `-a` を付けなくても空気を読んでくれたりするのが便利．
* 用語の統一が図られている．"index" や "cached" を使わず "staged" を使うなど．
* eg は単なる wrapper なので，Git と混ぜて使うことができる．

## インストール

1. Git がインストールしてあることが前提なので，インストールされてない場合はインストールする．

2. eg は単一の Perl スクリプトなので，単純にダウンロードしてきて PATH の通った場所に置けば良い．例えば，以下のようにする．

```sh
$ mkdir ~/bin
$ echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
$ curl -o ~/bin/eg http://people.gnome.org/~newren/eg/download/latest/eg
$ chmod +x ~/bin/eg
```

## 参考文献

* [Easy Git](http://people.gnome.org/~newren/eg/): 本家
* [(Easy) GIT for SVN users](http://people.gnome.org/~newren/eg/git-for-svn-users.html): Subversion のコマンドと eg のコマンドの対応表．
* [Differences between eg and git](http://people.gnome.org/~newren/eg/git-eg-differences.html): eg と Git の違いの説明．単にどう違うかだけでなく，どうしてこのような変更を加えたのかについても詳細に述べていて面白い．
node.js+expressをherokuで公開するところまでcodeste.amで配信した


####動画
http://codestre.am/65fe5a1a017efd54699775049

他のところで何か書いたり調べながらやっているので遅いです

####参考資料
http://www.eiplab.com/2011/06/heroku-node-js-express-helloworld/

####感想
双方向のやりとりがないのはきつい
node.jsとexpressは簡単だった
withによるブロックスコープ構文

JavaScriptでブロックスコープと言えば即時関数`(function(){ ... })()`ですが、もう一つwithを使った構文があります。しかし動作がすさまじく遅いので使いどころは微妙です。

```javascript:withスコープ（あらかじめローカル変数をすべて宣言）
var a = "global";
with ({a:"local"}) {
  console.log(a); //"local"
  with ({a:"local2"}) {  /* 入れ子にできる */
    console.log(a); //"local2"
  }
  console.log(a); //"local"
}
console.log(a); //"global"
```

動的にローカル変数を追加したい場合はこんな書き方でいけます。varではなくmy.～でローカル変数を宣言します。

```javascript:無名コンストラクタを併用して動的にローカル変数を追加できるようにした
var a = "global";
with (new function(){this.my=this}) {
  console.log(a); //"global"
  my.a = "local"; //ローカル変数を追加した
  console.log(a); //"local"
}

console.log(a); //"global" ブロックを抜けたのでグローバル変数に戻る
```
sum from 1 to 100

```java:FoldLeftArray.java
package com.example;

import static fj.data.Array.range;
import static fj.function.Integers.add;

public class FoldLeftArray {

    /**
     * sum from 1 to 100
     * 
     * @param args
     *            not use
     */
    public static void main(String[] args) {
        System.out.println(range(1, 101).<Integer> foldLeft(add, 0));
    }
}
```
settingslogicで定数を管理する


[settingslogic](https://github.com/binarylogic/settingslogic)はymlで定義した値をモデル経由で読み込む。
DBで管理するほどではないデータの管理に使おうかと。

##インストール

```ruby:Gemfile
gem 'settingslogic'
```

```sh
bundle install
```

##使用方法

```ruby:app/models/constants.rb
class Constants < Settingslogic
  source "#{Rails.root}/config/constants.yml"
  # こうすることで環境ごとに定数を切り分けられる
  namespace Rails.env
end
```

```yaml:config/constants.yml
defaults: &defaults
  hoge_number:
    min: 1
    max: 99

development:
  <<: *defaults

test:
  <<: *defaults

production:
  <<: *defaults
```

読み込み方。

```ruby
Constants.hoge_number.min
```

##環境を考慮しない場合の使い方

```ruby:app/models/constants.rb
class Constants < Settingslogic
  source "#{Rails.root}/config/constants.yml"
end
```

```yaml:config/constants.yml
hoge_number:
  min: 1
  max: 99
```

##erbを使う

Railsのyaml内でerbが使えるのでこんなこともできる。

```yaml:config/constants.yml
downloaded_files_root: <%= "#{Rails.root}/tmp/downloaded/" %>
```
##参考
Railsで定数を別ファイルで管理したい？ よろしい、ならば Settingslogic だ。 - @sugamasao.blog.title # =&gt; ”コードで世界を変えたい”
http://d.hatena.ne.jp/seiunsky/20100912/1284299997
JavaScriptでコールバック関数にあらかじめ引数を渡したい！

JavaScriptではイベント処理などで何かとコールバックを使います。でもコールバックが受け取る引数は普通はコールバックを呼び出す側が決めてしまうので自前の引数を渡したいと思うと少し工夫しないといけません。
このサイトを参考にいたしました。
[Javascriptでイベントハンドラのコールバック関数に引数を渡す](http://d.hatena.ne.jp/uriyuri/20081014/1223974862 "CallBack")

```callback1.js
var action = function(evt){
    alert(evt);
}
var button = document.getElementById("button");
button.addEventListener("click",action,true);
```

これではactionに渡されるものはevtだけです。
１、二回呼んでみる。関数の中でactionを呼んでみるパターンです。

```callback_rap.js
var action = function(evt,arg1,arg2){
    alert(arg1+evt+arg2);
}
var button = document.getElementById("button");
button.addEventListener("click",function(evt){ action(evt,"foo","bar")},true);
```

２、関数を返す方法

```callback_callObj.js
var action = function(arg1,arg2){
    return function(evt){
        alert(arg1+evt+arg2);
    }
}
var button = document.getElementById("button");
button.addEventListener("click", action("foo","bar"),true);
```

二個目の方法は確かサイ本でプライベート変数の作成をエミュレートする方法として書いてあった気がします。JavaScriptの変数はコールオブジェクトのプロパティとなるので関数が作成された時のarg1とarg2はactionが受け取っていた値で決まってしまうのです。
今回、僕はイベント処理として使ったわけではないですが、コールバック処理には何かと使えるのではないかと思います。
ローカルストレージとクッキー

ローカルストレージとクッキーに値を書き込んだり読み取ったり。
度々使う機会があるので、こうやってまとめておくと便利だと思ったので・・・。
クッキーの方は簡易的な物というか、圧倒的手抜き。

```javascript:JavaScript
// ローカルストレージに値をセット
var setLocalStrage = (function(){
	return function(key, data) { localStorage[key] = data };
})();

// ローカルストレージから値を取得
var getLocalStrage = (function(){
	return function(key) { return localStorage[key] };
})();

// クッキーに値をセット
var setCookie = (function(){
	return function(data) { document.cookie = data };
})();

// クッキーから値を取得
var getCookie = (function(){
	return document.cookie;
})();

// ローカルストレージの処理実行
setLocalStrage('test','hoge');
console.log(getLocalStrage('test'));

// クッキーの処理実行
setCookie('cookie!!!');
console.log(getCookie);
```
console.log を直書きしない

console.logはソースに直接書き込むのではなく、Web Inspectorのエディットブレークポイントを使うと良い感じ。

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/2832/90acda4c-9ddb-9cbd-6a4a-2c877b919132.jpeg)


左クリックでブレークポイントを設定→右クリック「Edit breakpoint…」を選択

![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/2832/430be483-154e-0188-9b3e-d3ff20078da5.jpeg)

入力欄にconsole.logを書くだけ

![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/2832/8567581f-153c-b8a6-109f-cacd306dc937.jpeg)


条件を指定しての出力などもできる。
git-svn で途中のリビジョンから clone する

git-svn clone したいけれど，数十万のリビジョンが存在するSubversionリポジトリの履歴を取得していたらリリースに間に合わないときに．

    git svn clone -s --prefix=svn/ -r655989:HEAD http://svn.example.com/foo_repo foo_repo

revision 655989 以降の履歴を取得する．

（--prefix=svn/ はこのtipsと関係ない）
groongaをUbuntu11.10にいれる

全文検索エンジンのgroongaをUbuntu11.10にいれた時の作業メモです。groongaのサイトにある[ドキュメント](http://groonga.org/ja/docs/install.html#ubuntu-11-10-oneiric-ocelot)のまんまです。

## 設定ファイルの編集

以下のファイルにURLを追加します。

/etc/apt/sources.list.d/groonga.list:

```
deb http://packages.groonga.org/ubuntu/ oneiric universe
deb-src http://packages.groonga.org/ubuntu/ oneiric universe
```

## インストール

```
% sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 1C837F31
% sudo apt-get update
% sudo apt-get -y install groonga
```

MeCab をトークナイザとして使う場合は、groonga-tokenizer-mecabパッケージをインストールします。

```
% sudo apt-get -y install groonga-tokenizer-mecab
```
mongoid で　acts-as-taggable-on


mongoid_taggable という plugin がある。

https://github.com/wilkerlucio/mongoid_taggable


##インストール
Gemfileに

```Gemfile
gem 'mongoid_taggable'
```
##使い方

```ruby:model/post.rb
class Post
  include Mongoid::Document
  include Mongoid::Taggable

  field :title
  field :content
end
```

これだけ。
post.rb に配列で embed される模様。

```erb:view/post/show.html.erb
<%= @post.tags %>
```
Rails3.2.2でjQueryUIを使う


[jquery-ui-rails](https://github.com/joliss/jquery-ui-rails)なるgemがあったのでそれを使う。
```twitter-bootstrap-rails```が適用済みの状態。

##インストール

```ruby:Gemfile
group :assets do
  gem 'jquery-ui-rails'
end
```

```sh
bundle install
```

##設定

```js:app/assets/javascripts/application.js
//= require jquery.ui.all
```

```css:app/assets/stylesheets/application.css
*= require jquery.ui.all
```

とりあえず全てのウィジェットを使えるようにする。
使用するウィジェットのみ読み込むことも可能。

##使い方

datepickerを使ってみる。
アプリケーション全体で使用したいので```bootstrap.js.coffee```にdatepickerを追記。

```app/assets/javascripts/bootstrap.js.coffee
jQuery ->
  $("a[rel=popover]").popover()
  $(".tooltip").tooltip()
  $("a[rel=tooltip]").tooltip()
  $('#datepicker').datepicker()
```

viewを修正。

```app/views/products/_form.html.erb
<%= f.text_field :name, :class => 'text_field', id: 'datepicker' %>
```

これで完了。以下のように表示される。

http://gyazo.com/ba3fddccbfd10ad19f6a2b577363aab7
EC2インスタンスにtagで付けた名前をサーバー内から取得する


EC2起動時にName=my-web-serverというtagを付けたとき、
立ち上げたサーバー内からこのタグを取得する方法。

~~~~bash
[ec2-user@ip-10-150-000-00 ~]$ ec2-describe-instances | grep `/usr/bin/curl -s http://169.254.169.254/latest/meta-data/instance-id` | grep TAG | grep Name | cu
t -f5
my-web-server
~~~~

EC2インスタンスから169.254.169.254（全region共通らしい）にHTTPリクエストを送ることで、自身のメタデータをREST的に取得することが出来る。

自身のinstance-id, TAG行, keyがNameのもの、とgrep絞り込んでcutする。
grepの積集合マッチ、正規表現でもっと簡単に書けそう...。
CoreDataのMigrationめっちゃ遅い

データが溜まってくるとかなり遅くなる。頻繁にスキーマを変更する可能性があるなら、設計を考え直した方がいいかもしれない。
考え得る対策は以下のような感じでしょうか。設計の根幹に係わる問題ですね。

-Migration時に待たせるUIを入れる
--http://cocoadays.blogspot.jp/2011/02/coredata-coredatamanager.html
-テーブルを正規化
--Migration時にコピーするデータを極力減らすような設計に…
--事前にこの辺を見切るのは難しそう
-別のデータの持ち方を検討
--Web側に持たせる
---手元にあるのはスナップショットだけにして、何時でもゼロから再ロード可能に
--NSUserDefaults
--シリアライズしてファイルにダンプ
Mac で自動で作成される「.DS_Store」「._」ファイルを削除する.

Shell で好きなディレクトリへ行って,

```ShellScript
$ find . -name ".DS_Store" -delete; find . -name "._*" -delete
```

削除したファイル名の出力が欲しい場合は, -print オプションをつける.
※ -print オプション付けないほうが若干早いです.

```ShellScript
$ find . -name ".DS_Store" -print -delete; find . -name "._*" -print -delete
```
Component 内の HTML Dom 要素にタップイベントを設定する


HTML要素それぞれにonClickなどの実装をすることはせず、 上位の Component のイベントから delegate してもらう。
element オブジェクトのイベントのリスナーを登録、delegate オプションに、イベントの発生を拾いたい対象のリファレンスを記述する。

例：

```coffeescript:controller/Maincoffee
# create instance
Ezuko.myView = new Ext.Container
  layout: 'card'
  items: [
    xtype:'panel'
    id: 'mypanel'
    html:'<div class="hoge"><img src="tapme.png" id="tappable"/></div>'
  ]
# add tap event listener on the img tag
Ext.getCmp('mypanel').element.on
  tap: (e)->
    alert 'tapped!'
  delegate: '#tappable'

# show view
MyApp.Viewport.push MyApp.myView
```
XTemplate で、長い文字を途中で切って表示する


テンプレート内では ellipsis メソッドが使える
例えば表示用データの description 項目を20文字で削って…をつける場合

```coffeescript:view/HogeView.coffee
###
List view of some content
###
Ext.define "MyApp.view.HogeView",
  extend: "Ext.List"
  config:
    itemTpl:['ユーザ名：{login_id}さん:',
              '{description:ellipsis(20,false)}'].join('')
```
名前空間の汚染を極力避けつつエイリアスとして取り回しの良さは保持しつつ二回実行を避ける

複数人数での開発や、プラグインなどで開発者の意図しない場所やタイミングで実行させられる可能性がある場合、考えないといけないことを次の3つに絞ってみました。

1. 二回実行させられることを極力避ける
2. グローバルの名前空間を出来る限り汚染しない
3. かといってスペルミスなどを防ぐために名前空間を使いやすい形にする。出来るだけIDEの補完がきくようにする

1は自分のファイル名をどこか変数に入れておいたあとにDOMのscriptタグを調べて、src属性にファイル名が複数回存在しないかチェックしてもいいですが（むしろそのほうが複数回存在したらその都度実行する場合に柔軟に対応出来るため使い勝手が良いのですが）、今回はドキュメントクラスのインスタンスを一つだけ保持するという形で対応してみました。

2と3はまあ普通にfunction内に名前空間を閉じ込めてエイリアスを作成する形で対応しています。
グローバルにprojectInit()を作成してしまうので、まだ気に入ってないですが複数ファイルにまたがって（出来るだけ1ファイル1クラスにまとめたい）名前空間をやりとりするのがいいのか、今回みたいに出来るだけ単純な関数名用意して内部で複雑な名前空間を扱ったらいいのかはまだ試行錯誤の段階です。

```javascript:project.js
/**
 * @fileoverview プロジェクトの一番最初に読み込まれるファイルです。
 * 名前空間を作成して返す関数を作ります。
 */
function projectInit(){
    /**
     * @const
     * @type {String}
     */
    var NAMESPACE = "jp_utweb_sample_ideTest";
    if(!document[NAMESPACE]){
        document[NAMESPACE] = {};
    }
    return document[NAMESPACE];
}
```

```javascript:main.js
/**
 * @fileoverview Mainクラス
 */
;(function(ns){
    /**
     * ドキュメントが最初に実行するMainクラスです。
     * @constructor
     */
    ns.Main = function(){};
})(projectInit());
```

```javascript:run.js
/**
 * @fileoverview Mainクラスがまだ存在しなければインスタンス化し、実行するクラスです。
 */
;(function(ns){
    /**
     * ドキュメントクラスMainが存在しなければ実行します。
     */
    if(!ns.run){
        var main = new ns.Main();
        ns.run = main;
    }
})(projectInit());
```
async#forEach の最も簡単な例

```javascript:
var async   = require('async');
/**
 * output:
 *    1
 *    2
 *    3
 *    undefined
 *    end
 */
async.forEach([1, 2, 3], function(data, cb) { // iteration で呼ばれる
  console.log(data);
  cb();
}, function (err) { // 全部おわったら or error があると呼ばれる
  console.log(err);
  console.log("end");
});
```

インストールは `npm install async`。 (current version: 0.1.18)
Inkscape で Tex の数式を描画できるようにする eqtexsvg を問題なく使う方法

Inkscape のエクステンションに Tex 式からパスを生成してドキュメントに追加してくれる eqtexsvg というエクステンションがあります。

http://www.julienvitard.eu/en/eqtexsvg_en.html

Inkscape 0.48.2 r9819 (windows binary version) 時点では本体に標準添付されてはいるのですが、[エクステンション] > [レンダリング] と辿ってもそこにあるべき [Latex 数式] 項目が表示されません。
この場合 eqtexsvg の公式ページで配布されているファイル eqtexsvg.py, eqtexsvg.inx を [inkscape.exeのあるディレクトリ]/share/extensions ディレクトリに上書きすると問題が解決します。
vimで.coffeeファイルを保存するたびに自動でコンパイルさせる


```sh:pathogen.vimをインストール
mkdir -p ~/.vim/autoload ~/.vim/bundle; \
curl -so ~/.vim/autoload/pathogen.vim \
    https://raw.github.com/tpope/vim-pathogen/HEAD/autoload/pathogen.vim
```
これで~/.vim/bundleにプラグインを入れるだけでよくなるらしい
早速本題のプラグインをダウンロード

```sh:vim-coffee-scriptを入れる
cd ~/.vim/bundle
git clone https://github.com/kchmck/vim-coffee-script.git
```

```vimrc:vimrcに下記を追加
call pathogen#infect()
autocmd BufWritePost *.coffee silent CoffeeMake! -cb | cwindow | redraw!
```

これで.coffeeのファイルを保存すると自動でコンパイルされるようになる。

\#春のshをmarkdownするときはコピペしやすいように冒頭の$やら%を取り除こうキャンペーン実施中
jQueryでタッチを取得

タッチパネルなデバイスで利用可能。
jquery.timer.jsと組み合わせると、画面を最後にタッチされてからn秒後に何かアクションを起こすといった事が可能。(例えば自動的にトップに戻る等)
キオスク端末みたいな感じで使われるWebアプリケーションで使えるんじゃないかなと・・・。
そんな事滅多に無いだろうけど。

```javascript:jQuery
$('body').bind('touchend', function() {
	// タッチされた時に実行
});
```
Companion.JSが入っていないIEで、console.logのエラーを出さない

Companion.JSがインストールされていないIEにおいてconsole.logでエラーを吐いて、
処理が止まってしまうのを回避する方法。
console.logが実行される前に書いておくだけ。

```javascript:JavaScript
// windoオブジェクトにconsoleオブジェクトが無い場合
if (!('console' in window)) {
	
	// windowオブジェクトにconsoleオブジェクトを作成
	window.console = {};
	  
	// 作ったconsoleオブジェクトに更に引数をそのまま返すlogオブジェクトを作成
	window.console.log = function(str){return str};
}
```
エラーメッセージのスタイルにBootstrapを適用


部分テンプレートを作って共有する形にする。

##部分テンプレート

```erb:app/shared/_errors.html.erb
<% if errors.any? %>
  <div class="alert alert-error">
    <a class="close" data-dismiss="alert" href="#">×</a>
    <h4 class="alert-heading"><%= pluralize(errors.count, "error") %> prohibited this customer from being saved:</h4>

    <ul>
      <% errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
    </ul>
  </div>
<% end %>
```

##使い方

```erb:app/views/products/_form.html.erb
<%= render partial: 'shared/errors', object: @product.errors %>
```