OmniAICreator/Qiita-1.07M huggingface dataset:
Javascriptのテストについて

最近では、フロントサイドのみならず、サーバーサイドでもjavascriptが使用されていたりTitanium Mobile等のフレームワークでもjavascriptが使用されています。
そんな今後ますます使用頻度が高くなるであろうjavascriptのテストを取り組んでいけるようjavascriptのテストについてまとめました。

####Javascriptのテストのフレームワークは大きく分けて2つのパターンが存在する

**ブラウザベースのテスティングフレームワーク**
→テストの実行にWebブラウザ自体を利用する。

■メリット
本番に近い環境でテストを実行できる
テストの実行結果をWebブラウザ上で分かりやすく表示できる

**ヘッドレスな手法／ヘッドレス型のテスティングフレームワーク**
・・・単体で動作するJavaScriptエンジンを利用し、Webブラウザをエミュレートする事でブラウザを利用しない。

■メリット
コマンドラインから実行できるので頻繁に開発/改善を行う場合に適している

###有名なJavascriptのテストのフレームワーク

●JsUnit
Javaのテストフレームワークとして有名な「JUnit」を参考に作られたテストフレームワーク。

●QUnit
もともとjQueryをテストするために開発されたフレームワークだが、現在ではjQueryへの依存が無くなっているためjQuery以外のライブラリを使ったプロジェクトでも使用できまる。

●Jasmine
RubyOnRailsでの開発でよく用いられる「RSpec」というフレームワークを参考に作られたテストフレームワーク。
ビヘイビア駆動開発(BDD)という概念に基づいて設計されており、テストコードそのものが要求仕様書のように見えるという特徴を持つフレームワーク。

●Mocha
Node.jsのフレームワークとして有名な「Express」と同じ作者が制作したテスト用のフレームワーク。
Jasmineと同じようにBDDの概念に基づいて設計されており、Expressとの親和性も高いため、Node.jsでのテストでは最有力のテストフレームワークの一つ。
フロントエンドでの使用も可能ですが、アサーション関数(テスト結果をチェックするための関数）が用意されていないため自前で用意する必要がある。

●Capybara
Capybara は Rack アプリ(Rails, Sinatra, Merb等)の統合テストを簡単にするのが目的。現実のユーザがウェブアプリとやりとりするのをシミュレートする。テスト用のドライバを選択でき、デフォルトでは Rack::Test と Selenium ドライバをビルトインでサポートしています。HtmlUnit, env.js は外部の gem としてサポートしている。

> 「Javascript のテスト手法 抜粋 http://ameblo.jp/ca-1pixel/entry-11279972790.html」

###capybaraを使ってrailsでJavascriptテスト
(参照先：https://github.com/jnicklas/capybara)

####capybaraって？

CapybaraはWebアプリケーションのテストフレームワークとして開発されており、Webブラウザなしでブラウザ上のユーザー操作やJavaScriptの挙動を自動化できるもの。

テストは"Cucumber","Rspec","Test::Unit"で記述する事が可能

1.まずはcapybaraをインストール(ruby 1.9.3より古ければcapybara -v 2.0.0と指定)

```
gem install capybara

```

2.Gemに加えbundle install

```
group :development, :test do
  gem 'rspec-rails'
  gem 'capybara', '2.0.0'    ※ruby 1.9.2を使用しているため
end

```

3.rspecのセットアップ

```
rails generate rspec:install

```

5.spec_helperにcapyparaを追加

```
require 'capybara/rspec'
require 'capybara/rails'

```

これで一旦設定は完了です。
※slenium等を使う場合は別途追加


######capybaraでインターフェーステストをする際のコマンド

■visit　"URL"

■fill_in "name", :with => "記入したいもの"
 
■click_link "clickしたいもののname"

■click_link_or_butto "clickしたいもののname"
Rails 4 で turbolinks をオフにする方法

# turbolinks について
Rails 4 から turbolinks という機能がデフォルトで bundle されるようになった。
http://kray.jp/blog/must-know-about-turbolinks/
ページ遷移をすべて ajax でやってくれるが、割りとおせっかい機能。
しかも jQuery と競合するから jquery-turbolinks を gem で入れることで回避するとかやめてほしい。
こういう機能はぜひともプラグインで提供していただきたい。

# turbolinks を切る
さっそく turbolinks をオフにする。
## Rails project 新規作成
turbolinks が bundler で最初に install されてしまうので、一旦 --skip-bundle をつけて skip

```sh:Zsh
% rails new turbolinks_off --skip-bundle
% cd turbolinks_off
```
## Gemfile から turbolinks を外す
Gemfile の turbolinks 行を comment out する。

```ruby:Gemfile
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
# gem 'turbolinks'
```

## application.html.erb から turbolinks を削除する
### 削除前

```erb:application.html.erb
  <%= stylesheet_link_tag    "application", media: "all", "data-turbolinks-track" => true %>
  <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
```

### 削除後

```erb:application.html.erb
  <%= stylesheet_link_tag    "application", media: "all" %>
  <%= javascript_include_tag "application" %>
```

## application.js から turbolinks を削除する
application.js のみを script タグで読んだはずが、 asset pipeline で turbolinks が呼ばれるようになっているので削除する。

```JavaScript:app/assets/javascripts/application.js
//= require jquery
//= require jquery_ujs
//= require turbolinks <- 削除
//= require_tree .
```

## bundle install
準備が整ったので bundle install

```sh:Zsh
% bundle install
```

## turbolinks 削除完了
これで無事 turbolinks を削除できた :)
既存のプロジェクトでも同じ場所を削除・編集して bundle install すれば削除できるはず。
chefspecで例外をテストする


cookbookを共通化したりlibrariesを使ってコンパクト化をしていますが、その関係でrecipe内で一定のエラー処理を書いてしまいたい事が増えました。

エラーを出力するのであれば、当然ながらそれをテストしたいということで、chefspecでの例外のテスト方法をまとめます。

```ruby:chefspec_raise_error
describe 'chefspec sample' do
  let (:chef_run) do
    chef_run = ChefSpec::ChefRunner.new.converge 'expect::error'
  end
  it 'raise error' do
    stdout_org = $stdout.dup
    $stdout.reopen("/dev/null", "a")
    expect{ chef_run }.to raise_error
    $stdout.reopen stdout_org
  end
end
```

ポイントは`expect{ chef_run }`をして`raise_error`で受けること。
`raise_error`マッチャはProcインスタンスに対して有効なので、()ではなく{}にしなければなりません。

あとは実行したときに`Chef::Runner`がいろいろとメッセージを吐いてしまうので、それを捨てるために標準出力を捨てています。
WindowsでSass環境を構築


Sassでコンパイルできる環境と、生成された CSS をWebブラウザで localhost として参照できるようになるところまで。
サーバサイドのことをよく知らない人用。
scss ファイルはすでにチームメンバーが git にコミットしていて、新たなメンバーが参入し、開発環境を構築する、という状況を想定してます。
インストールするものは3つ。

1. Ruby
1. Sass
1. Nginx（ApacheでもOK）



## Ruby をインストール

Ruby-1.9 から RubyGems（後述）が標準付属となったため、1.9 以上をインストールする。今回は安定版の Ruby 1.9.3-p392 をダウンロード
http://rubyinstaller.org/downloads/

インストーラのオプションが3つあるので、「環境変数のPATHに通す設定」にチェックを入れる。



### コマンドプロンプト起動

Windows のショートカットキー `Windowsキー + R` で、「ファイル名を指定して実行」を開き、`cmd` と入力するとコマンドプロンプトが開く。
下記のように Ruby のバージョンが表示されればインストールOK。

```bat
>ruby -v
ruby 1.9.3p392 (2013-02-22) [i386-mingw32]
```

## Sass インストール
ここから Ruby に付属してるパッケージ管理ソフトの RubyGems を使う。Windows OS は文字コードが Shift_JIS なので、あらかじめ UTF-8 指定しておく（通常、RubyGemsを更新するときだけで良いはず）。

```bat
>set LANG=ja_JP.UTF-8
```

RubyGems を更新。

```bat
>gem update --system
Updating rubygems-update
Fetching: rubygems-update-2.0.3.gem (100%)
Successfully installed rubygems-update-2.0.3
Installing RubyGems 2.0.3
RubyGems 2.0.3 installed
Installing ri documentation for rubygems-2.0.3
```

RubyGems から Sass をインストール。

```bat
>gem install sass
Fetching: sass-3.2.9.gem (100%)
Successfully installed sass-3.2.9
Installing ri documentation for sass-3.2.9
```



## scssファイルのコンパイル
git から clone したコンテンツファイルのプロジェクトが下記ディレクトリにあるとする。
`D:\git\ui-project`

scss ファイルは下記ディレクトリにあるとする。
`D:\git\ui-project\resources\css\scss`

CSS ファイルは下記ディレクトリに生成されるものとする。
`D:\git\ui-project\resources\css`

scss ファイルのディレクトリに移動してコンパイル開始

```bat
>D:
>cd git\ui-project\resources\css\scss
>sass --watch scss:.
```

CSS が生成されていることを確認。



## Nginx をインストール
用途は CSS ファイルをローカル環境上で公開することなので、どのバージョンでも大丈夫。最新の `nginx/Windows-1.5.0` をダウンロード。
http://nginx.org/en/download.html
ZIPを解凍。今回はDドライブ直下に配置する。
コマンドプロンプトから起動する。



##### 起動

```bat
>D:
>cd nginx-1.5.0
>start nginx
```

ブラウザのアドレスバーに `localhost` と入力してアクセスできることを確認。
この HTML は `D:\nginx-1.5.0\html\index.html` にあります。



##### 停止

```bat
>nginx -s stop
```



##### コマンドのヘルプ

```bat
>nginx -h
```



### 設定ファイル編集

`D:\nginx-1.5.0\conf\nginx.conf` をテキストエディタで開く。
下記のように書いてある部分に注目する。
これは `http://localhost` の "/"（ルートディレクトリ）のコンテンツは、ローカルPC上の `<Nginxインストールディレクトリ>/html` ディレクトリ配下にコンテンツがあるよという意味。

```text
location / {
 root html;
 index index.html index.htm
}
```

これと同じ要領で、上記設定の下部に以下を追記する。
`http://localhost/resources` がローカルPC上の `D:\git\ui-project` 配下にあるよという意味。

```text
location /resources {
- root D:\git\ui-project\resources;
+ root D:\git\ui-project;
}
```

Nginx を再起動するか、リロードして設定ファイルを読み込みなおす。

```bat
>nginx -s reload
```

ブラウザのアドレスバーに `http://localhost/resources/xxx.css` を入力。xxx.css の部分は、コンパイルによって生成された CSS ファイルを書く。
アクセスできるようになってることを確認する。
Luaでカレントディレクトリとかファイルシステムの情報を求めたい

#dirnameとかrealpathとかそんなの使いたい。

Luaには標準でPythonのos.path相当のライブラリは用意されていない。
C APIバインドなライブラリである
[luaposix](https://github.com/luaposix/luaposix)を使おう。

##インストール方法

luarocksコマンドでインストールすれば終わり。

```sh
> luarocks install luaposix
> lua
> require ("posix")
```

簡単だ。

# 使い方

ライブラリの[リファレンスはこちら](http://luaposix.github.io/luaposix/docs/index.html)

## カレントディレクトリを確認したい

```lua
> =posix.getcwd()
/Users/matsuzakikeiji/Sandbox/Lua
```

## リアルパスを取得したい

```lua
> =posix.realpath(".")
/Users/matsuzakikeiji/Sandbox/Lua
```

今後はposixライブラリにお世話になろう。便利である。

ちなみにLuaのコードハイライトがQiitaに用意されていないようだ...
追記:コメントにてLuaは候補では出てこないけどハイライトはできるよと教えていただきました。ご迷惑おかけしました。
CocoaPods podspec作成の逆引きいろいろ


当初ドキュメントがあまり網羅されていなかったりしたので今までやろうとしたことの逆引き的なメモ。完成の終わりがわからないので随時更新(予定)。

## 一つのPodをモジュールごとに分割するよ

subspecを使う。

```ruby:podspec
  s.subspec 'ModuleA' do |a|
    a.source_files = 'ModuleA/*.{h,m}'
    a.dependency 'Reachability'
  end
  s.subspec 'ModuleB' do |b|
    b.source_files = 'ModuleB/*.{h,m}'
  end
```

``source_files``の指定上、予めソースファイルをディレクトリごとに分けておくと管理しやすい。

アプリで使ってもらうときはPodの名前とsubspecの名前を``/``で区切り以下のように指定する。

```ruby:podspec
pod 'MyPodName/ModuleA'
```

Pod内でもモジュール間の依存関係を解決できる。

```ruby:podspec
  s.subspec 'Core' do |a|
  end
  s.subspec 'ModuleA' do |b|
	b.dependency 'MyPodName/Core'
  end
```

さらにはmainspecをsubspecに依存させることもできる。

```ruby:podspec
  s.subspec 'ModuleA' do |a|
  end
  s.dependency 'MyPodName/ModuleA'
```


## ARC無効にするよ

``requires_arc``を設定する。CocoaPods 0.17.0からデフォルトが ``true`` (ARC有効) 、それ以前が ``false`` (ARC無効)なので、どちらの設定にせよ明示的に書くべき。

```ruby:podspec
s.requires_arc = false
```

## Pod内の特定のファイルだけARCを無効にするよ

subspecを利用してPodを分割して、設定をわけて、そのsubspecに依存させる。

```ruby:podspec
  s.name         = 'MyPodName'
  s.requires_arc = true
  …
  
  s.subspec 'NoARC' do |sub|
    …
    sub.requires_arc = false
  end

  s.dependency 'MyPodName/NoARC'
```

## libxml2とか使うよ

SDKのスタティックライブラリを使う場合。

```ruby:podspec
s.libraries = 'xml2'
s.xcconfig = { 'HEADER_SEARCH_PATHS' => '$(SDKROOT)/usr/include/libxml2' }
```

## STL使うからリンクするよ

```ruby:podspec
s.libraries = 'stdc++'
```


## プリコンパイルヘッダ使うよ

``prefix_header_contents`` に設定する。以下のようにRubyのヒアドキュメントを使うこともできる。

ただしsubspecを使った場合に親の``prefix_header_contents``が反映されることがあり、何度も``prefix_header_contents``が実行されてしまうことがあるのでsubspecを使っている場合には``Core``subspecみたいなものを別につくってそこに書いた方がいい。


```ruby:podspec
  s.prefix_header_contents = <<EOC
#ifdef __OBJC__
    #import <SystemConfiguration/SystemConfiguration.h>
#endif
EOC
```

## Static Libraryを含めるよ

Static Libraryで配布されている外部のSDKをPodにする場合に有効。

```ruby:podspec
s.preserve_paths = 'lib/libExternal.a'
s.library = 'External'
s.xcconfig = { 'LIBRARY_SEARCH_PATHS' => '"$(PODS_ROOT)/MyPodName/lib"' }
```

## localで使うPodだけどStatic Libraryを含めるよ

**この方法は0.17か0.18あたりで使えなくなった。localのPodが``Pods/Local Podspecs``にコピーされて使われるため。``MYPODNAME_ROOT``が意図通りの値にならない。**

ローカルにあるpodを使う場合、

```ruby:Podfile
pod 'MyPodName', :local => '~/Pods/MyPodName'
```

のようにPodfileがかけるが、アプリプロジェクトからは相対パスで参照される。従って、アプリのプロジェクトから見れば ``$(PODS_ROOT)/MyPodName`` にファイルがないため、``'LIBRARY_SEARCH_PATHS' => '"$(PODS_ROOT)/MyPodName/lib"'`` という指定は使えない。

そのPodをlocalだけで使う前提でいいなら、以下のように設定を絶対パスにすることで強引にいける。

```ruby:podspec
s.xcconfig = { 
    "MYPODNAME_ROOT" => File.dirname(__FILE__),
    'HEADER_SEARCH_PATHS' => '"$(MYPODNAME_ROOT)/include"',
    'LIBRARY_SEARCH_PATHS' => '"$(MYPODNAME_ROOT)/lib"'
  }
```

## LocalとかPrivateカテゴリのヘッダ隠蔽するよ


### 非推奨 Rake::FileList 版

[FileList.exclude](http://rake.rubyforge.org/classes/Rake/FileList.html#M000152)で正規表現つかって除外する。

**CocoaPods 0.17からRake::FileListが非推奨になった**

```ruby:podspec
s.public_header_files = FileList['MyPodName/*.h'].exclude(/\+(:?Local|Private)\.h/)
```

### 正規表現で頑張る

文字列ではなく正規表現のリテラルを使う

```ruby:podspec
s.public_header_files = /MyPodName\/[\w_-]+(?!\+Private|\+Local)\.h/;
```
at_exitの重ねがけ

at_exitって何度も設定できるんだっけ?とふと気になったので、調べてみた。

```ruby:at_exit.rb
at_exit do
  puts :one
end

at_exit do
  puts :two
end

at_exit do
  puts :three
end
```

```
$ ruby at_exit.rb
three
two
one
```

最後に登録された順に実行されるらしい。

http://doc.ruby-lang.org/ja/2.0.0/doc/spec=2fterminate.html

at_exitで補足できないのは
 * Kernel#exit!したとき
 * シグナルハンドラで補足できないシグナル(KILLとか)を受信したとき
 * rubyがSEGVしたとき

とかだろうか。
ruby2.0から、 同Floatが同じobject_idを返す・・・事が多くなった

64bit環境下且つ、あんまでかくない値の時なのかな？

そうすると、equal?がtrueを返します。
個人的に == であっても equal? じゃないみたいなチェックにFloat使ってたので、コケるテストは幾つかありました。

1.9.3まで

```ruby
1.0.equal? 1.0 #=> false
```

2.0だと

```ruby
1.0.equal? 1.0 #=> true
```

[参考](http://blog.marc-andre.ca/2013/02/23/ruby-2-by-example/)
GitLabにPull Requestを送るときの作法

[GitLabのPull Request](https://github.com/gitlabhq/gitlabhq/pulls/hiroponz?direction=desc&page=1&sort=created&state=closed)のコツがつかめてきたので、簡単に説明してみます。
とりあえず[Contributing Guidelines](https://github.com/gitlabhq/gitlabhq/blob/master/CONTRIBUTING.md)をよく読みましょう。決まりを守らない人は嫌われて相手にされません。
あとは、Pull request guidelinesに従いましょう。

1. GitLabプロジェクトをフォーク
2. フィーチャーブランチを作成
3. テストとコードを書く
4. 複数のコミットが含まれる場合はsquashで一つのコミットにまとめる
5. フォークにコミットをpush
6. Pull requestを投稿
7. 投稿したpull requestに関係するissuesを検索しpull requestのコメント欄に記述する

2.について、後日もう再度pull requestを送る場合は、ブランチを切る前に

```
git remote add upstream https://github.com/gitlabhq/gitlabhq.git
git pull upstream master
```

という感じで、最新のmasterに追従するのを忘れないように気をつけましょう。

4.については、分割したままでも適切な粒度であれば、問題なくacceptされるようです。むしろ、分割した方がreviewしやすいので好まれる気がします。ただし、無駄なコミットが含まれていると、ほぼ確実にsquashするように突込みが入ります。
それと、squashしたあとに別のpull requestをopenすると怒られるので、`git -f push origin`で上書きでpushしましょう。

それと、rspecやspinachのテストを追加したり、変更点の箇条書きリストや画面のスクリーンショットを説明欄に載せると、かなりの確率でacceptされるっぽいです。

また、GitLabは新機能の要望を[feedback and suggestions forum](http://feedback.gitlab.com)で受け付けているので、そのステータスが"ACCEPTING MERGE/PULL REQUESTS"ものについてPull requestを投稿すればMergeされる可能性が高いと思います。

余談ですが、GitHubのIssueのcloseを積極的に手伝ったり、何回かpull requestがacceptされるとcontributorのチャットに案内されるようです。午後三時くらいに"good morning"と挨拶されますが、なんと返せばいいのか分からないので、誰か教えてください。

### 関連リンク

- [OSSのContributorとして活動するということ](http://hiroponz.hateblo.jp/entry/20130516/p1)
- [GitHubで最速転職活動](http://qiita.com/items/19813972053cbacf90c1)
- [GitLab導入時の留意点](http://hiroponz.hateblo.jp/entry/2013/06/19/233121)
画像をコンテナに合わせて拡縮させる計算方法

jQueryプラグインなどを作るときや、スクラッチ開発の時によく忘れるのでメモ。

※`margin`や`padding`、`border-width`が0以外のときは計算が狂う可能性があるので注意。

```coffeescript
# 画像の情報
imgWidth = $img.width()
imgHeight = $img.height()
imgAspectRatio = imgWidth / imgHeight
# コンテナの情報
containerWidth = $container.width()
containerHeight = $container.height()
containerAspectRatio = containerWidth / containerHeight
# 画像の拡縮率の算出
# アス比が1以上なら横長/1以下なら縦長
# コンテナが横長
if 1 < containerAspectRatio
	# 画像が横長 もしくは コンテナのアス比の方が大きい
	if 1 < imgWidth and imgAspectRatio < containerAspectRatio
		scale = containerHeight / imgHeight
	# 画像が縦長
	else
		scale = containerWidth / imgWidth
# コンテナが縦長
else
	# 画像が横長 もしくは 画像のアス比の方が大きい
	if 1 < imgHeight and containerAspectRatio < imgAspectRatio
		scale = containerWidth / imgWidth
	else
		scale = containerHeight / imgHeight
# 画像の幅と高さ
newWidth = imgWidth * scale
newHeight = imgHeight * scale
# スタイルの反映
$img.css
	width: newWidth
	height: newHeight

# おまけ コンテナに対してセンタリングをしたい時
$img.css
	top: (containerHeight / 2) - (newHeight / 2)
	left: (containerWidth / 2) - (newWidth / 2)
```
第10回オフラインリアルタイムどう書く。ruby による実装例。

先日行われたオフラインリアルタイムどう書く。

* イベント : http://atnd.org/events/38678
* 問題 : http://nabetani.sakura.ne.jp/hena/ord10haniwa/
* 解答リンク集 : http://qiita.com/items/55641767510c2f9f235f


かなり手直ししているけど、最初に書いた実装。当日発表したもの。


```ruby
def dir( c )
  {
    0=> move( 0, 2 ), 1=> move( 1, 1 ), 2=>move( 1, -1 ),
    3=>move( 0, -2 ), 4=>move( -1, -1), 5=>move( -1, 1 )
  }[ c ]
end

def pos(x,y)
  x*100+y+5050
end

def move( x, y )
  pos(x,y) - pos(0,0)
end

def field
  names=(?A..?Z).to_a + (?a..?z).to_a
  f={ pos(0,0)=>names.shift }

  def fill( f, o, d, names )
    commands=[2,3,4,5,0,1].map{ |i| [i]*d }.flatten
    commands.each do |c|
      f[o]=names.shift
      o+=dir( c )
    end
  end

  1.upto(3) do |r|
    fill( f, pos(0,r*2), r, names )
  end
  f
end

FIELD=field

def solve( src )
  o=pos(0,0)
  "A"+src.chars.map do |c|
    n=o+dir(c.to_i)
    if FIELD[n]
      o=n
      FIELD[n]
    else
      "!"
    end
  end.join
end

DATA.each do |line|
  num, src, expected = line.split( /\s+/ )
  actual = solve( src )
  ok = actual == expected
  puts( "%s : %s->%s ( %s )" % [
    ok ? "ok" : "***NG***",
    src, actual, expected
  ] )
end

__END__
0 135004  ACDABHS 
45  42434302545 AFEOd!!ONOef
```

いつもどおり、テストデータの大半を省略。

私の場合、画像の生成をする必要があるとか、マス目につける記号を変えたくなるかもしれないとか、37マスじゃなくて61マスにしたくなるかもとか、そういう事情もあり、地図を生成するコードを書く必要があった。

で。
地図を`field`というメソッドで生成している。
地図の座標は、座標の足し算のコードをサボるために、100進数の10の位が x座標、1の位が y座標ということにした。中心は(50,50)。

`map`して`join`しているけど、`inject`か`each_with_object`の方が好ましいようにも思う。
xfceのターミナル設定

xubuntu13.04で設定しようとしたら、設定ファイルの場所が以前と変わっているような気がしたのでメモ。

````
$ cat ~/.config/xfce4/terminal/terminalrc
[Configuration]
...   
````
ほとんどGUIで設定できるので変更するのは起動位置と大きさぐらい

````
MiscDefaultGeometry=128x60+600+48
````
AngularJS + Typescript用のyeomanのgenerator


[JakubMrozek/generator-angular-typescript](https://github.com/JakubMrozek/generator-angular-typescript#pkazy)というgeneratorがある。

基本的にreadme.mdに書いてある通りにすれば動く。
「grunt server」を実行した際に、「components/types/angularjs/angular.d.ts:88」でエラーが出る場合は、

	directive(name: string, directiveFactory: (...params)=> IDirective): IModule;

を

	directive(name: string, directiveFactory: (...params: any[])=> IDirective): IModule;

に変更すれば良い。
以下チェコ語か何かで書かれたreadme.mdを頑張って和訳したもの。

##インストール方法

	npm install yo grunt-cli bower testacular -g
	npm install git://github.com/JakubMrozek/generator-angular-typescript.git
	yo angular
	npm install && bower install

##コマンド
* grunt server - 開発を始める
* grunt test - すべてのテストを実行する
* grunt testacular:unit - 自動リフレッシュで単体テストを行なうために、Testacularを開始する
* grunt build - プロジェクトをビルドする（ミニファイや最適化など）

##基本的な使い方

コントローラ、ディレクティブ、フィルターおよびサービスとそのテストの生成方法。

###コントローラ

生成方法：

	yo angular:controller Ctrl

生成される app/scripts/controllers/ctrl.ts:

	/// <reference path="../app.ts" />

	'use strict';

	module app.controller {

	  export class Ctrl implements IController {

    	constructor (private $scope) {

    	}

  	}

	}

	app.registerController('Ctrl', ['$scope']);


###ディレクティブ

生成方法：

	yo angular:directive dir

生成される app/scripts/directives/dir.ts:

	/// <reference path="../app.ts" />

	'use strict';

	module app.directive {

	  export class Dir implements IDirective {

	    template = '<div></div>';

    	restrict = 'E';

	    link (scope, element: JQuery, attrs: ng.IAttributes) {
	      element.text('this is the dir directive');
    	}

  	}

	}

	app.registerDirective('Dir', []);


###フィルター

生成方法：

	yo angular:filter fil

生成される app/scripts/filters/fil.ts:

	/// <reference path="../app.ts" />

	'use strict';

	module app.filter {

	  export class Fil implements IFilter {

	    filter (input: string) {
    	  return 'fil filter: ' + input;
    	}

  	}

	}

	app.registerFilter('Fil', []);


###サービス

生成方法：

	yo angular:service serv

生成される app/scripts/services/serv.ts:

	/// <reference path="../app.ts" />

	'use strict';

	module app.service {

	  export class Serv implements IService {

    	private meaningOfLife = 42;

	    constructor () {

    	}

	    someMethod () {
	      return this.meaningOfLife;
    	}

	  }

	}

	app.registerService('Serv', []);

##詳細はこちらを参照

http://weblog.ronniweb.net

##ライセンス

[BSDライセンス](http://opensource.org/licenses/bsd-license.php)
Debian 7.0, Ubuntu 13.04 に rbenv をインストールする

特に注意しなければならないことはないので、普通に rbenv をインストールすればおわり。

# 1.必要なパッケージをインストール

```
$ su -
# apt-get install build-essential bison libreadline6-dev curl git-core zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev autoconf libncurses5-dev
# exit
```

# 2.git で rbenv, ruby-build をダウンロード (clone)

(9/25 追記）実は Debian 7.0 なら rbenv を apt-get で入れられるらしいです。

```
$ cd
$ git clone git://github.com/sstephenson/rbenv.git .rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

# 3.もろもろの設定

rbenvを使うために必要な設定を ~/.bashrc に書きます。
ここでは vi を使っていますが、テキストエディタならなんでもよいです。

```
$ vi ~/.bashrc
```

以下を書いて保存する。

```
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
```

保存したら反映。

```
$ source ~/.bashrc
```

# 4.Rubyのインストール

以下のようにすると、インストール可能なバージョンの一覧が表示されます。

``` 
$ rbenv install --list
```

たくさん表示されますが、好きなものをダウンロードしましょう。
よくわからない人は、1.9.3-pXXX のXXX部分の数字が一番大きいのがおすすめです（執筆時点では 1.9.3-p392）。

```
$ rbenv install 1.9.3-p392
```

数分〜数十分はかかります。気長に待ちましょう。
終わったら rehash で rbenv を更新します。

```
$ rbenv rehash
```

最後に、今インストールしたバージョンを global に指定して、Ruby のバージョンを確認すれば完了です。

``` 
$ rbenv global 1.9.3-p392
$ ruby --version
ruby 1.9.3p392 (2013-02-22 revision 39386) [i686-linux]
```
CocoaPodsのバージョンが上がらないハマリの解決

FrogApps 技術ブログ始めました！
RailsやiOS、HTML5の情報を発信中!! → http://qiita.com/teams/frogapps

---

CocoaPodsのバージョンあげようとしてハマったのでメモ。

ハマリ
=====

CocoaPodsを使おうとしたら、バージョン上げれとのエラーメッセージ。

``` sh
$ pod install
Setting up CocoaPods master repo
Updating spec repo `master'

[!] The `master' repo requires CocoaPods 0.18.1 -
Update Cocoapods, or checkout the appropriate tag in the repo.
```

cocoapodsをupdate。

```
$ sudo gem install cocoapods
Successfully installed cocoapods-0.19.1
:
```

updateしたのにもかかわらず、podのバージョン見たら古い。バージョン上がってない＞＜

```
$ pod --version
0.16.1
```

解決
===

gemやrubyはhomebrew製が動いてる。

```
$ which gem
/usr/local/bin/gem
$ which ruby
/usr/local/bin/ruby
$ gem which cocoapods
/usr/local/Cellar/ruby/1.9.3-p392/lib/ruby/gems/1.9.1/gems/cocoapods-0.19.1/lib/cocoapods.rb
```

/usr/bin/podの中身を見てみたらOS製のrubyを起動してました。

``` /usr/bin/pod
#!/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby
#
# This file was generated by RubyGems.
:
```

homebrewのrubyから起動するように/usr/bin/podを書き換えちゃいました。

``` /usr/bin/pod
#!/usr/local/bin/ruby
#
:
```
これで、正しいバージョンが動くようになった。

```
$ pod --version
0.19.1
$
```

Twitterで岸川さんに確認方法を教えてもらったり、もっさりさんにつっこまれたりしました。感謝感謝です。
https://twitter.com/hirobe/status/333892818907058176

追記 2013.5.25
Installing Ruby gems not working with Home Brew
http://stackoverflow.com/questions/6482738/installing-ruby-gems-not-working-with-home-brew
android-mode チートシート

# 準備
## インストール
https://github.com/remvee/android-mode

※Android SDKのインストールや、antのインストールは省いてます

## init.el

```lisp:
;; android-mode
(require 'android-mode)

;; Android SDKのパス
(setq android-mode-sdk-dir "~/Development/android-sdk-macosx")

;; コマンド用プレフィックス
;; ここで設定したキーバインド＋android-mode.elで設定された文字、で、各種機能を利用できます
(setq android-mode-key-prefix (kbd "C-c C-c"))

;; デフォルトで起動するエミュレータ名
(setq android-mode-avd "AVD_01")
```

# 使う

## プロジェクトの作成
`M-x android-create-project`

対話式で入力していきます

|    |                   |
|:---|:------------------|
|Path|空のディレクトリを指定|
|Package|パッケージ(jp.co.xxx.abc)|
|Activity|メインのアクティビティ名|
|Target|android list targets の id 指定|

## エミュレータ起動
`M-x android-start-emulator` または `C-c C-c e`

※ android-mode-key-prefix に C-c C-c を設定している場合です

## DDMS起動
`M-x android-start-ddms` または `C-c C-c d`

## ビルド
`M-x android-ant-debug` または `C-c C-c c`

## インストール
`M-x android-ant-installd` または `C-c C-d i`

## アプリ起動
`M-x android-start-app`

init.elでキーバインド設定するなら、

```lisp:init.el
(define-key android-mode-map (kbd "C-c C-c a") 'android-start-app)
```

## Logcat

`M-x android-logcat` または `C-c C-c l`


# その他

## Eclipseなどで作ったプロジェクトを使うとき (build.xmlがないとき)

プロジェクトのディレクトリで、

`$ android update project -p ./`
Composer関連のファイルの役割メモ

宮さんへのメモ

| ファイル | 役割 |
|-----------|------------|
| composer.phar       |composer installやcomposer updateの実行に必要な本体。サーバにインストールされていれば無くても実行できる。 |
| composer.json    |依存関係が書かれた設定ファイル、ここに書かれたライブラリをインストールまたはアップデートして、vendor/ 以下に配置するのがcomposerの役割 |
| composer.lock |インストールされるライブラリのバージョンを固定する為のファイル。存在しない場合は最新版がセットアップされる。 |
| vendor/autoload.php |vendor 以下に配置されたライブラリを自動で読み込む為のファイル。フレームワークなどにPSRに対応したローダがあれば不要。|
| vendor/* |外部からセットアップされたライブラリが配置される。空っぽになっていてもcomposer.jsonから再生可能。 |
Slick の Documentationを翻訳した

#[Slick][16]とは？

Slickは[Typesafe社](http://www.typesafe.com)によって開発が行われている，[Scala][20]のためのモダンなデータベースラッパーである．データベースにアクセスしながらScalaのコレクションを扱うかのようにデータを操作する事が出来る．また，SQLを直接書く事も可能である．

#Slickドキュメント日本語訳

翻訳プロジェクト：[slick-doc-ja][0]
原文：[Slick 1.0.0 documentation][17]

本題に関するものはこちらです
http://krrrr38.github.io/slick-doc-ja/v1.0.out/slick-doc-ja+1.0.html

追記
Slick 2.0.0のドキュメントも翻訳しています
http://krrrr38.github.io/slick-doc-ja/v2.0.out/slick-doc-ja+2.0.html

追記
Slick 3.0.0のドキュメントも
http://krrrr38.github.io/slick-doc-ja/v3.0.out/slick-doc-ja+3.0.html

#他リンク
- [Slickガイド - tototoshiの日記][15]
- [Slick(旧Scala Query)を使ったScalaによるDBアクセス][19]
- [Slick in Play2.1 - krrrr.com][18]
- [色んなSQLをSlickで書くと？ - North Ground][21]

#コメント

非公式．問題等指摘されたら速攻消えます．

だいぶ適当な箇所多いので，気が向いたらpull requestで修正投げてください．
Github分からないので困惑しながら対処したいと思います．

日本語も英語も難しい．

##補足
[今のところ問題は無いらしい](https://twitter.com/StefanZeiger/status/333980509858312192)

[0]: https://github.com/krrrr38/slick-doc-ja
[1]: https://github.com/krrrr38/slick-doc-ja/blob/master/v1.0/01_Introduction.md
[2]: http://slick.typesafe.com/doc/1.0.0/introduction.html
[3]: https://github.com/krrrr38/slick-doc-ja/blob/master/v1.0/02_GettingStarted.md
[4]: http://slick.typesafe.com/doc/1.0.0/gettingstarted.html
[5]: https://github.com/krrrr38/slick-doc-ja/blob/master/v1.0/03_LiftedEmbedding.md
[6]: http://slick.typesafe.com/doc/1.0.0/lifted-embedding.html
[7]: https://github.com/krrrr38/slick-doc-ja/blob/master/v1.0/04_PlainSQLQueries.md
[8]: http://slick.typesafe.com/doc/1.0.0/sql.html
[9]: https://github.com/krrrr38/slick-doc-ja/blob/master/v1.0/05_DirectEmbedding.md
[10]: http://slick.typesafe.com/doc/1.0.0/direct-embedding.html
[11]: https://github.com/krrrr38/slick-doc-ja/blob/master/v1.0/06_SlickTestKit.md
[12]: http://slick.typesafe.com/doc/1.0.0/testkit.html
[13]: https://github.com/krrrr38/slick-doc-ja/blob/master/v1.0/07_SlickExtensions.md
[14]: http://slick.typesafe.com/doc/1.0.0/extensions.html
[15]: http://d.hatena.ne.jp/tototoshi/20121204/1354615421
[16]: http://slick.typesafe.com/
[17]: http://slick.typesafe.com/doc/1.0.0/
[18]: http://d.hatena.ne.jp/krrrr/20130213/1360687102
[19]: http://dev.classmethod.jp/etc/slic/
[20]: http://www.scala-lang.org/
[21]: http://kxbmap.hatenablog.com/entry/2013/05/25/183014
rubyのblock文でのbreak,next

rubyのblock文中で、条件によって処理を飛ばすのにnextが使える。

```ruby
#5を飛ばす
10.times{|v|
  if v==5
    next
  end
  puts v
}
#出力
#0
#1
#2
#3
#4
#6
#7
#8
#9
```

ちなみに、breakだと、ブロック処理全体を終了する。

```ruby
10.times{|v|
  if v==5
    break
  end
  puts v
}

#出力結果
# 0
# 1
# 2
# 3
# 4

```
Unite.vimで結果をソートする。(メモ)

Unite.vimの出力結果をソートする方法をしらなかったのでメモ。
`:Unite directory_mru`の結果をソートしたい場合、vimrcに以下のような感じで設定する。

```vim:
call unite#custom_source('directory_mru', 'sorters', 'sorter_word')
```

`'sorter_word'`の部分には他に

* sorter_default
* sorter_nothing
* sorter_word
* sorter_length
* sorter_rank
* sorter_reverse

が設定できる。(`:h unite-filter-sorter_default`あたりを参照)
Windows ノートPC を無線LAN中継器として使う

出張先などで LAN ポートが足りなくなって困ったことはありませんか?
実は Windows 7/8 は自身を無線アクセスポイントとして動作させることができます。
この Hosted Network Mode とかアドホックモードと呼ばれる機能を利用すると、
LAN ポートが足りなくて・・・という問題の解決になるかもしれません。

このエントリでは Windows 7/8 のノートPCを無線アクセスポイントとして動作させる方法を紹介します。

大まかな流れは下記のとおりです。

1. Hosted Network Mode の有効化
2. SSID の設定
3. 無線アクセスポイント接続用パスワードの設定
4. Hosted Network 機能の起動
5. Hosted Network とインターネットに接続しているアダプタのブリッジ設定

# 1. Hosted Network Mode の有効化

なぜかデフォルトでは無効化されているので、有効化します。

```cmd
netsh wlan set hostednetwork mode=allow
```

# 2. SSID の設定

他のノート PC やスマートフォン、タブレットを接続するには
SSID が必要ですので、SSID を設定します。

```cmd
netsh wlan set hostednetwork ssid="SoftAP"
```

# 3. 無線アクセスポイント接続用パスワードの設定

無線アクセスポイントに接続するためのパスワードを設定します。
なお、ここで設定したパスワードで Windows にログインされることはありません。

```cmd
netsh wlan set hostednetwork key="password_connect_to_hostednetwork"
```

# 4. Hosted Network 機能の起動

機能の有効化、SSID の設定、接続用パスワードの設定が終わったら、
Hosted Network を起動します。

```cmd
netsh wlan start hostednetwork
```

# 5. Hosted Network とインターネットに接続しているアダプタのブリッジ設定

Hosted Network を起動すると、ネットワークアダプタの一覧に新しいアダプタが追加されます。
新しいアダプタと、インターネットに接続されているアダプタのブリッジ設定を行ってください。

注意点として、ネットワークデバイスの省電力機能が有効になっていると設定途中、
または Hosted Network の起動でエラーになることがあります。
ネットワークデバイスの省電力設定は無効にしておきましょう。

2013-05-13 15:50 リファレンス追記
Reference: [About the Wireless Hosted Network](http://msdn.microsoft.com/en-us/library/windows/desktop/dd815243%28v=vs.85%29.aspx "About the Wireless Hosted Network")

それでは良いネットワークライフを!
オートメーターでYouTubeダウンロード

Homebrewでyoutube-dlをインスコ。

```sh:Terminal
brew install youtube-dl
```

オートメーターでコマンド実行のサービスを作成。
URLを引数として受け取るようにし、

```sh:Automator
VID=`echo $1 | sed 's/^.*v=//g'`;
FMT=`youtube-dl -F ${VID} | grep mp4 | sort -r | head -1 | cut -b 1-2`;
cd ~/Downloads;
youtube-dl -o '%(title)s.%(ext)s' -f ${FMT} ${VID};
```

これを実行すると自動的にmp4で可能なサイズの中で最も大きいものをフォーマットとして選び、ダウンロードしてくれる。
好みに合わせてmp4の部分を他のフォーマットにしたり、ソートの-rを取れば最も小さなサイズを選択したり、cdのところで保存フォルダを変えられます。

ちなみにnicovideo-dlなるものもありました。
コマンドの内容は名前から察する通りですが、使える機能がyoutube-dlほど多くないのと、nicovideo-dlのほうは-uでユーザーネーム、-pでパスワードを指定しないと一部の動画しかアクセス出来ないかもしれません。
youtube-dlでも-u,-pでログイン出来ますが、ログインしなくてもダウンロード出来るので必要性が感じられません。
むしろログインに時間を取られてしまうだけです。

```sh:Automator
VID=`echo $1 | sed 's/\(^.*\/watch\/\)//g' | sed 's/?.*$//g'`;
cd ~/Downloads;
nicovideo-dl -u ユーザーネーム -p パスワード -t ${VID};
```

これでいけます。
実行はURL上で右クリックでコンテキストメニュー開いてサービスから選ぶ。
続・Redshiftを試してみる


[前回](http://qiita.com/items/871927e15d0cbe01c5e4)に引き続きredshiftを試したメモです。

1000万行のデータのImportやSelectなど
--------------

以下のようなデータをImportしてみます。
前回との違いは、**response** フィールドに多少大きめのデータを格納して、１レコード当たりのサイズが大きいことです。

* type: varchar(32)
* point: int
* response: varchar(65535)  # 65535 が MAX
* event_datetime: datetime  


DDLは以下のようにしました。

```sql
Create Table sample2 (
  type VARCHAR(32) ENCODE TEXT255,
  point INT,
  response VARCHAR(65535),
  event_datetime TIMESTAMP
)
DISTSTYLE EVEN
SORTKEY (event_datetime);
```

### Importするデータを適当に作ります

```make_data2.rb
# coding: utf-8

num = ARGV.shift.to_i
DELI = "\001"

TYPES = ["cat", "dog", "cow", "horse"]

num.times do |i|
  type = TYPES[i % TYPES.size]
  point = Random.rand(10) + 1
  response = (Random.rand(63)+33).chr * (Random.rand(2000) + 800)
  dt = Time.now.utc
  puts [type, point, response, dt].join(DELI)
end
```


### 1万行のデータを1000個作ってS3にUploadする

```zsh
for i in {000..999};do; ruby make_data2.rb 10000 | gzip > files/sample2.data.${i}.gz;done 
s3cmd put files/sample2.data.* s3://BUCKET/redshift/sample2/   
```

Fileサイズは合計79MB程(gzip後)。

### Import や Select の実行時間
*※ちなみにQueryの実行時間はRedshiftのWeb管理コンソールの*Queries*タブから確認できます。*

```sql
COPY sample2
FROM 's3://BUCKET/redshift/sample2/sample2.data'
GZIP
DELIMITER '\001'
CREDENTIALS 'aws_access_key_id=****;aws_secret_access_key=****'
;
→ 約520秒

mydb=# select count(*) from sample2;
  count   
----------
 10000000
(1 行)
→ 2.34秒

mydb=# select type, count(*) from sample2 group by type;
 type  |  count  
-------+---------
 dog   | 2500000
 cat   | 2500000
 cow   | 2500000
 horse | 2500000
(4 行)
→ 5.54秒
```

### DISK使用量

**Performance**タブで確認すると、*「Percentage of Disk Space Used」* が **0.83%** になっていました。

	2TB × 0.0083 ≒ 16GB

です。

今回の１レコード当たり約2000B弱かな、という感じなので、

	2000B × 1千万レコード(10Mレコード) -> 20GB

となり、説明がつきそうなサイズになっています。


Import速度とファイルサイズや数の関係？
-------

先ほどのファイルは１つ当たり79KBと小さめだったのでまとめた方がImportにかかる実行時間が短くなるかなと思ってもう一度検証。今度は、100万行を10個で試してみる（１ファイル当たり約7.9MB）。

```zsh
for i in {0..9};do; gzip -dc files/sample2.data.${i}* | gzip > files2/sample2b.data.${i}.gz; done
s3cmd put files2/sample2b.data.* s3://BUCKET/redshift/sample2b/   
```

```sql
COPY sample2
FROM 's3://BUCKET/redshift/sample2b/sample2b.data'
GZIP
DELIMITER '\001'
CREDENTIALS 'aws_access_key_id=***********;aws_secret_access_key=***********'
;
-> 458秒
```

この時は62秒程短かくなりました（でも、もう一度実行したら遅かったので誤差の範囲のようです）。


Selectの速度は変わったかな？

```sql
mydb=# select type, count(*) from sample2 group by type;
 type  |  count  
-------+---------
 dog   | 5000000
 cat   | 5000000
 cow   | 5000000
 horse | 5000000
(4 行)
-> 1.62秒
```
この程度では影響ないようです。

* もう一度、1万行×１０００ファイルをImportしてみる。
	* → 474秒 （先程は520秒）

* もう一度、100万行×10FileをImportしてみる。
	* → 521秒 （先程は458秒）
変換先の Encoding に無い文字を任意の文字列に置き換える


Ruby 1.9.3 以降では `String#encode` の `fallback` オプションに Proc が指定できるようになっている。

http://ruby-doc.org/core-2.0/String.html#method-i-encode

未定義文字がある場合、これを引数として、fallback に指定した Proc が呼び出され、返り値の文字列に置き換えられる。

下記では Windows-31J に無い文字を HTML の数値文字参照に置き換える例を示す。

```ruby
replace_with_charref = -> char {
  char.codepoints.map{|cp| "##{cp};"}.join
}

"\u{00ae} is registered sign.".encode("windows-31j", fallback: replace_with_charref)
#=> "#174; is registered sign."
```

1.9.2 では Hash しか指定できず、下記のようにしてみてもうまくいかなかった (同じコードは 1.9.3, 2.0.0 では期待通り動作する)。

```ruby
# キーがない場合、キーに対応する数値文字参照を返す Hash
replace_with_charref = Hash.new {|hash, char|
  char.codepoints.map{|cp| "##{cp};"}.join
}

"\u{00ae} is registered sign.".encode("windows-31j", fallback: replace_with_charref)
#=> Encoding::UndefinedConversionError: U+00AE from UTF-8 to Windows-31J
```

1.9.2 で同等のことを実現するためには `Encoding::Converter#primitive_convert` を用いる必要がある。

http://doc.ruby-lang.org/ja/1.9.3/method/Encoding=3a=3aConverter/i/primitive_convert.html
重複する複数のyamlを一つにマージする

RailsのI18nの辞書ファイルをマージするときにハマったので共有します。

```yaml:sample.ja.yml
ja:
  active_records:
    model:
      model_1:
        name: 名前
```

のような辞書ファイルをモデルやビュー毎に作成していたのですが、これらを一つのファイルにマージしようとして、

```bash:command
cat models.yml views.yml controllers.yml > all.yml
```

ってやってもうまくマージできません。
yamlのノードを再帰的にマージしてあげる必要があります。で、作ったのがこれ。

```ruby:merge-yaml.rb
require 'yaml'

merged_yaml = {}

def merge_yaml(yaml1, yaml2)
  yaml2.each do |key, value|
    if value.class == Hash && yaml1.key?(key)
      yaml1[key] = merge_yaml(yaml1[key], value)
    else
      yaml1[key] = value
    end
  end
  return yaml1
end
    
ARGV.each do |file|
  yaml = YAML.load_file(file)
  merged_yaml = merge_yaml(merged_yaml, yaml)
end

puts merged_yaml.to_yaml
```

コマンドラインにマージしたいyamlファイルを列挙してあげればオッケー。

```bash:command
ruby merge-yaml.rb views/ja.yml controllers/ja.yml models/ja.yml
```
Basic認証下でFacebook等のOGP確認方法

開発中のサイトでOGPの動作確認をしたい時、
Basic認証をかけているとFacebookやmixi等のクローラがOGPタグを取得・解析出来ない。
そこで、それらクローラからのアクセスは以下の様にBasic認証無しにする。

```apache:.htaccess
AuthUserFile /path/to/.htpasswd
AuthGroupFile /dev/null
AuthName "Input ID and Password."
AuthType Basic

BrowserMatchNoCase facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php) is_facebook=1
BrowserMatchNoCase mixi-check/1.0 (http://mixi.jp/) is_mixi=1

Satisfy any
Require valid-user
Order allow,deny

allow from env=is_facebook
allow from env=is_mixi

allow from localhost
allow from 127.0.0.1
allow from 192.168.11.0/24
```
JavaScriptの無名関数

すぐ忘れてしまうのでめも

即時に実行する無名関数の書き方  
関数内で宣言した変数は他のスクリプトに影響を与えない。  
Twitterのボタン、Facebookのfb-rootなどもこの書式になっている

```javascript:function_nameless.js
// 要素#hoge内にp要素を追加して「ほげほげ」とテキストを入れる
(function(d, t) {
	d.prepend('<p></p>');
	$('p', d).text(t);
})($('#hoge'), 'ほげほげ');
```
第10回オフラインリアルタイムどう書くの問題をF#で

番兵 '!' を特別扱いするのは型設計がよろしくないけど、手早く書くならこれでもいいか。

```fsharp:honeycomb.fs
let board =
  [| "!!!!!!!!!".ToCharArray();
     "!!!!TUVW!".ToCharArray();
     "!!!kHIJX!".ToCharArray();
     "!!jSBCKY!".ToCharArray();
     "!iRGADLZ!".ToCharArray();
     "!hQFEMa!!".ToCharArray();
     "!gPONb!!!".ToCharArray();
     "!fedc!!!!".ToCharArray();
     "!!!!!!!!!".ToCharArray() |]

let directions =
  [| (0,-1); (1,-1); (1,0); (0,1); (-1,1); (-1,0) |]

let folder (x,y,_) i =
  let (dx,dy) = directions.[i]
  let (x',y') = (x+dx,y+dy)
  let c' = board.[y'].[x']
  if c' = '!' then (x,y,c') else (x',y',c')

let solve (s:string) =
  let xs =
    s.ToCharArray()
    |> Array.map (fun c -> (int c)-(int '0'))
    |> Array.scan folder (4,4,board.[4].[4])
    |> Array.map (fun (_,_,c) -> c)
  new string(xs)

(* for test *)

type TestResult = Success | Failure

let test target expected =
  let actual = solve target
  printfn "%A" (if expected = actual then Success else Failure)

[<EntryPoint>]
let main args =
  test "135004" "ACDABHS"
  test "1" "AC"
  test "33333120" "AENc!!b!M"
  test "0" "AB"
  test "2" "AD"
  test "3" "AE"
  test "4" "AF"
  test "5" "AG"
  test "4532120" "AFQPOEMD"
  test "051455" "ABSHSj!"
  test "23334551" "ADMb!cdeO"
  test "22033251" "ADLKLa!ML"
  test "50511302122" "AGSjkTHTU!VW"
  test "000051" "ABHT!!!"
  test "1310105" "ACDKJW!V"
  test "50002103140" "AGSk!HU!IVIU"
  test "3112045" "AEDKYXKC"
  test "02021245535" "ABCIJW!JIHBS"
  test "014204" "ABIBCIB"
  test "255230" "ADAGAEA"
  test "443501" "AFPefgQ"
  test "022321" "ABCKLZ!"
  test "554452" "AGRh!!Q"
  test "051024" "ABSHTUH"
  test "524002" "AGAFGSB"
  test "54002441132" "AGQRjSRhRSGA"
  test "11010554312" "ACJV!!UTkSHI"
  test "23405300554" "ADMNEFOFGRi!"
  test "555353201" "AGRih!gPQG"
  test "22424105" "ADLMabaLD"
  test "11340202125" "ACJKDCKJX!!J"
  test "4524451" "AFQFPf!P"
  test "44434234050" "AFPf!!e!!Pgh"
  test "00554040132" "ABHk!j!i!jRG"
  test "3440403" "AEOePfgf"
  test "111130" "ACJW!XW"
  test "21133343125" "ADKXYZ!a!Z!L"
  test "353511" "AEFOPFA"
  test "22204115220" "ADLZYLY!KY!X"
  test "03013541" "ABABICBGB"
  test "101344" "ACIVJCA"
  test "2432541" "ADENbNdN"
  test "45332242015" "AFQPedc!!NME"
  test "215453" "ADKCAGF"
  test "45540523454" "AFQh!i!RQg!!"
  test "42434302545" "AFEOd!!ONOef"
  0
```
Android4.0以降の端末でWebview背景が透過されない場合の対処

# 原因
+ ハードウェアによる描画を行なっている事が原因。と、思われる。

# 対策コード

```java:SampleWebview.java
if (Build.VERSION_CODES.HONEYCOMB <= Build.VERSION.SDK_INT) {
    webView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);
}
```
iOSでAndroidのToastっぽいものを表示する

参考
[DEVCAFEJP - iOSでToast](http://devcafe.jp/blog/2012/12/ios-toast/)

まんまToastってライブラリがあるので、ダウンロードして中にあるソースと、
QuartzCore.frameworkを追加するだけです。

[scalessec / Toast](https://github.com/scalessec/toast)

ARCに対応していないので、プロジェクトがARC対応の場合は、Build PhasesのCompile Sourcesの中にあるToast+UIView.mに「**-fno-objc-arc**」オプションをつける必要があります

```objc
[self.view makeToast:@"メッセージ" duration:3.0 position:@"bottom"];
```

使い方は簡単なので、サンプルをみればすぐ使えるようになります。
Winstone、最近、更新無い・・・

**追記**: 初期開発者さんが開発やめたらしく、正式な後継は https://code.google.com/p/winstone/ になるようです。@Layzie@github さんありがとうございました。

軽量サーブレットコンテナとして有名で、ぐぐると割と検索上位にも来る [Winstone][] ですが、最近更新がありません。（[最新のバージョンのリリースが 2008 年][1]）

これが気になる場合は、普通は代わりの軽量サーブレットコンテナうたうもの（[Jetty][], [tjws][]）などに変えるのも良いですが、もうひとつの選択肢として、jenkins がメンテナンスしている Winstone を使うというものがあります。

* [jenkinsci/winstone · GitHub](https://github.com/jenkinsci/winstone)

この Winstone は、`java -jar jenkins.war` で立ち上げる際に用いられる、war に埋め込まれたサーブレットコンテナになっていますが、単なる Winstone フォークなので、オリジナルと同じ使い方ができます。

[winstone]: http://winstone.sourceforge.net/
[1]: http://sourceforge.net/projects/winstone/files/winstone/ "Winstone Servlet Container - Browse /winstone at SourceForge.net"
[Jetty]: http://www.eclipse.org/jetty/
[tjws]: http://tjws.sourceforge.net/

## jar で欲しい

* Maven リポジトリからダウンロード: http://repo.jenkins-ci.org/public/org/jenkins-ci/winstone/


## Maven で読み込みたい

`pom.xml` にこう書く:

```xml
<project >
  ...
  <repositories>
    ...
    <repository>
      <id>repo.jenkins-ci.org</id>
      <url>http://repo.jenkins-ci.org/public/</url>
    </repository>
    ...
  </repositories>
  ...
  <dependencies>
    ...
    <dependency>
      <groupId>org.jenkins-ci</groupId>
      <artifactId>winstone</artifactId>
      <version>0.9.10-jenkins-43</version>
    </dependency>
    ...
```
最近のRedisめも

だいぶサボっていたが、記憶に残らないので、面白そうと思ったところをまとめておく
unstableブランチ。

4ed2581a9284d..e93857522

336d722

AOFで書くときに、今までは一気に書いていたが、IOがひどくなりがちなので、少しずつ書くことで緩和しようというオプション(aof-rewrite-incremental-fsync)がついた

1965e22aa1

sentinelで、slave昇格の際にmasterへ向いていたsentinelは、常にslaveへリダイレクトされるようにする(?) ← よくわかってない。

要は今までの処理が複雑すぎるので、単純な処理にしよう、という話っぽい。

48ede0d

ちょっと理解できてない。

214adc5051

Luaを5.1.4から5.1.5へupdate

残り

個人的には待望のPSYNCまわりのテストコードが追加される。
HashのKeyにStringを使おうとすると、別のインスタンスが用いられる・・・場合がある

```ruby
str = 'str'
{str => 1}.key(1).eql? str   #=> true
{str => 1}.key(1).equal? str #=> false

str = 'str'.freeze
{str => 1}.key(1).eql? str   #=> true
{str => 1}.key(1).equal? str #=> true
```

https://github.com/rubyspec/rubyspec/blob/5cef74ea771bd733ff1c8d39b22b991c39fcb1d4/core/hash/shared/store.rb#L37-L52
heroku schedulerの使い方(Rails,sinatra)

herokuで定期的な処理を行いたい場合、大体はaddonのheroku Schedulerを使うことになると思うので、簡単にまとめてみる。

## 特徴など 
* タスクは複数登録可能
* タスクの起動間隔は10分おき、1時間おき、1日おきで選べる。
* heroku schedulerはベストエフォート型のサービスなので、実行開始時間は多少の遅延したり、スキップされることがあるので注意する
* 無償でできるのはプロセスの利用時間は1Dynos (= 750時間(/1ヶ月))
* WebのDynosを1つ利用していた場合、（1ヶ月が31日の場合）
24h * 31日 = 744hなので、残りの6h分のプロセスのみスケジュールタスクとしての処理時間として利用できます。
* それ以降は1時間あたり$0.05かかる（1ヶ月フル使用で$37.2)
* 利用状況は https://dashboard.heroku.com/account のBilling のところで確認できる
* herokuのアプリケーションをメンテナンスモードにしている場合、時間になってもタスクは実行
されない（スキップされる）

## 何はともあれaddonを追加
### コンソールから
```shell:
$ heroku addons:add scheduler:standard 
```
またはaddonページから
https://addons.heroku.com/scheduler

※アドオンは無償ですが、オーバーしたプロセスが課金対象になるのでクレジット登録になります。

### スケジュール画面を開く

https://heroku-scheduler.herokuapp.com/dashboard

```shell:
$ heroku addons:open scheduler
```


## タスクの登録
### Railsの場合

`lib/tasks`の下にrakeファイルを作成

```ruby:test.rake
task :test_task => :environment do
	#処理
	puts 'done.'
end
```

スケジュール管理画面で`Add Job...`を選択
TASKに`rake test_task`を設定
FREQUENCYに起動間隔を設定。

### Sinatraの場合
scheduler用の実行ファイルを作成

```ruby:task.rb
# 処理
puts 'done.'
```

スケジュール管理画面で`Add Job...`を選択
TASKに`bundle exec ruby task.rb`を設定

##ログの確認
```
$ heroku logs --ps scheduler.xxxx 
#(xxxxは実行時に割り当てられたプロセス番号)
```

##公式Doc
https://devcenter.heroku.com/articles/scheduler#defining-tasks
jQueryで知るJavaScriptで唯一許される等価演算子の使い方

ご存知の通り、JavaScriptには等価演算子(`==`)と厳密等価演算子(`===`)が存在します。

[JavaScript The Good Parts](http://www.oreilly.co.jp/books/9784873113913/)などで言及されてたり、[JSLint](http://www.jslint.com/)や[JSHint](http://jshint.com/)などの静的コードチェッカーで怒られてしまったりするようにJavaScriptの場合は勝手に型を変換してしまい、意図しない結果が返ってきたり、そもそも型変換のコストがかかるために基本的には厳密等価演算子を使用して比較することが良いとされていますね。

しかし、jQueryの[JavaScript Style Guide](http://contribute.jquery.org/style-guide/js/)というcontributor向けのガイドラインの *Equality* の部分に以下のような記述があります。

> Strict equality checks (===) should be used in favor of ==. The only exception is when checking for undefined and null by way of null.

下のコードのように`undefined`と`null`をどちらもチェックする場合にのみ`==`を使用していいというルールになっています。

```javascript
// Check for both undefined and null values, for some important reason.
undefOrNull == null;
```

実際にjQueryのコードを見ても[こんな感じに使われています](https://github.com/jquery/jquery/blob/master/src/core.js#L189)。

`undefined`と`null`はもちろん別物なのに、何で上記のようなコードでどちらも判別されるの？と思いますがこれは「仕様です」としか言えないシロモノです。

ECMAScriptの[11.9.3](http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3)の項目を見てみると以下のような仕様であることが分かります。

```javascript
// 以下の場合にtrueを返す
null == null
undefined == undefined
null == undefined
undefined == null
```

上記の仕様でいうと比較するものとしては`undefined`でも`null`でもどっちでも良いように思いますが、実際のところ`undefined`というキーワードは[予約語ではない](http://www.ecma-international.org/ecma-262/5.1/#sec-7.6.1)ので、もしかしたらどこかで書き変えられてる可能性もあるので、予約語である`null`を使って比較してる形です。

ということで、`undefined`と`null`どちらでも良いけど、ちゃんと値が入ってるかをチェックしたい場合にのみ等価演算子を使用すると記述が簡単になりますね。

他のケースではCoffeeScriptなどを使うなり、JSLintやJSHintを使うなりして、厳密等価演算子を書くクセを付けたほうが良いと思います。
`git init`直後の`git reset .`


通常、

```
git add .
```

の反対は

```
git reset .
```

で良い。

ただ、それが`git init`の直後で、まだ一つもコミットがない状態だと

```
$ git add .
$ git reset .
fatal: Failed to resolve 'HEAD' as a valid ref.
```

とHEADがないよと怒られてしまう。

そんな時は、

```
git rm --cached -r .
```

とすると解決する。
Githubさん,ごめんなさい！複数リポジトリを一つにまとめる方法


複数のリポジトリがあった時に、それをまとめた親レポジトリを作り、各レポジトリをサブディレクトリとしてまとめてしまう方法。

ファイルとして保存するだけじゃなく、ちゃんとコミットHistoryも保存される。一つにまとめたものを後で切り出すこともできる。

これでリポジトリ数の削減が可能になるので、GithubのPrivateリポジトリ数の上限などにお悩みの人は是非お試しを。現在、頻繁に使っているものをまとめてしまうのはおすすめしないが、古い使われてないものを歴史ごとアーカイブするのには持ってこいだと思う。

以下では、

- $ACCOUNT = githubのアカウント名
- $REPO = サブディレクトリに移したいレポジトリ名
- $ARCHIVE = 複数リポジトリをまとめておくアーカイブ用親リポジトリの名前

とする。

## 複数リポジトリをまとめたアーカイブ用gitリポジトリをローカルに作成

```
mkdir $ARCHIVE
cd $ARCHIVE
git init
touch .gitignore README.md  # 適当に編集
git add .
git commit -m "Add .gitignore and README.md"
```

ここで、とりあえず一つ何かCommitしておくのは、失敗しても`git reset --hard HEAD~`で戻れたりと何かと都合がいいから。

## 既存リポジトリをARCHIVEのサブディレクトリとして保存

```
git remote add $REPO git@github.com:$ACCOUNT/$REPO.git
git fetch $REPO
git checkout -b $REPO $REPO/master
git filter-branch -f --tree-filter "mkdir $REPO && git mv -k {,.[\!.],..[\!.]}* $REPO/"
git checkout master
git merge $REPO
```

うまくいってそうだったら、github上のREPOリポジトリを消す。

これをまとめたい各リポジトリに対して行う。

### 参考

http://stackoverflow.com/questions/13337877/what-is-the-opposite-of-git-filter-branch-subdirectory-filter

## 複数リポジトリをまとめたアーカイブをGithubにPush

Github上にARCHIVEという名前のリポジトリを作成する。

```
git remote add origin git@github.com:$ACCOUNT/$ARCHIVE.git
git push -u origin master
```

この順番でやれば、Githubのprivateリポジトリ数の上限に達していても、ちゃんと複数リポジトリをサブディレクトリとしてまとめたアーカイブを作ることができる。

## おまけ：もう一度切り出したい時

逆にまとめてしまったものをもう一度切り出したいときは以下のようにする。

```
git clone git@github.com:$ACCOUNT/$ARCHIVE.git $REPO
cd $REPO
git filter-branch --subdirectory-filter $REPO
git remote add origin git@github.com:$ACCOUNT/$REPO.git
git push -u origin master
```
自分のGitルール


ローカルリポジトリでの開発
--
1. cloneする
2. 大きな修正になりそうなのはbranchを作成する
3. branchで普通に開発する
 - コミット時は2行書く
4. branchにpushする
5. rebaseする

```
git clone <URL>
git checkout -b <branch_name>
git commit -m 'subject' -m 'body'
git push origin <branch_name>
git rebase master
git checkout master
git rebase <branch_name>
```

他のリポジトリからforkしたときは、masterに取り込む
--

pull オプションに--rebaseをすることで、コミット内容がマスターからの変更分に置き換わるため、プルリクエストの内容が変更した内容だけになる

```bash
git remote add upstream <URL>
git fetch upstream

# mergeではなくてrebase
git rebase upstream/master
```

ただし、一度pushした後にupstream/masterの内容を取り込む際はmergeを使うこと。rebaseは内容は同じだが、1つ前のコミットが異なるためリビジョンは別物になる。

mergeとrebaseの違いは毎回忘れるのでこちらを参考
http://powerful-code.com/blog/2012/11/merge-or-rebase/
http://blog.inouetakuya.info/entry/20130602/1370173582

リモートリポジトリにpushする
--
1. ログをまとめる
2. pushする

pull requestするとゴミログが出てこないはずだからこちらのほうが、ログが綺麗になると思う。
→ fork元が更新されてた時にはどのような挙動になるのか？

```
git rebase -i HEAD~2
git commit --amend
git rebase --continue
git push origin master
```

```
pick 9a54fd4 commitの説明を追加
pick 0d4a808 pullの説明を追加
↓
e 9a54fd4 commitの説明を追加
f 0d4a808 pullの説明を追加

# Rebase 326fc9f..0d4a808 onto d286baa
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
```

p,pick = commitをそのまま使う
r,reword = commit messageだけ編集する
e,edit = commitをまるごと編集する
s,squash = reflogを残したままcommitを直前のcommitに統合し、統合後のメッセージを編集する
f,fixup = reflogを残さず、commitを直前のcommitに統合する
x,exec = shellコマンドを実行する（？）
git rebase -i のための rebase.autosquash オプション

# rebase.autosquash オプションって何？
`git rebase -i hoge` を実行した時に、特定のcommitが指定したcommitの後に移動した状態で編集用テキストを開くオプション
コミットログが`foo foo`のcommitが存在する場合、`squash! foo foo` というコミットログでcommitを行うと、`git rebase -i hoge` を行った時に、下記の状態で編集用テキストが開く

    pick a7f1c68 foo foo
    squash d5be25c squash! foo foo

# わかりにくいかもしれないので実例

### autosquash[1-6].txt を二つづつ順番にgitにcommitしていくときに、autosquash4.txtのcommitをとばしちゃったのを修正したい！

    touch autosquash{1,2}.txt && git add . && git commit -m "test1,2"
    touch autosquash3.txt     && git add . && git commit -m "test3"
    touch autosquash{5,6}.txt && git add . && git commit -m "test5,6"

と実行したところで4がないことに気がついた。

#### autosquashを使わない場合

    touch autosquash4.txt && git add . && git commit -m "test4"
    git rebase -i HEAD~3

を実行。下記の状態で編集用テキストが開く。

    pick 0457afa test3
    pick 001d634 test5,6
    pick 9c3263d test4

下記のように、`"test4"`のcommitを`"test3"`の後ろに持って行って、先頭を`squash` に変更してから編集用テキストを閉じてrebaseを続行。コミットログを適切に入力し完了させる

    pick 0457afa test3
    squash 9c3263d test4
    pick 001d634 test5,6

#### autosquashを使う場合
    #"squash! test3" の部分が重要！
    touch autosquash4.txt && git add . && git commit -m "squash! test3"
    git rebase -i HEAD~3

を実行すると下記の状態で編集用テキストが開くのでそのまま編集用テキストを閉じてrebaseを続行。コミットログを適切に入力し完了させる

    pick 0457afa test3
    squash 73236b3 squash! test3
    pick 001d634 test5,6

# まとめ

## autosquashを使うと後々のrebase操作がちょっと便利になる

# おまけ
+ `squash!`の他に`fixup!`も使えます

+ 1.7以降で使えるらしいです

+ autosquashでどのコミットの後ろにコミットを持っていくかは、`"squash! ..."`のメッセージ部分の前方一致で先頭から順番に検索をかけているようです

極端な話、下記のように1文字でも動作するのでこっちのほうがよく使うかも。

    touch autosquash4.txt && git add . && git commit -m "squash! t"
    git rebase -i HEAD~3

とすると

    pick 0457afa test3
    squash 28a19f0 squash! t
    pick 001d634 test5,6

の状態でrebase編集用テキストが開く

#### 参考

+ [git-rebase](https://www.kernel.org/pub/software/scm/git/docs/git-rebase.html)

+ http://technosorcery.net/blog/2010/02/07/fun-with-the-upcoming-1-7-release-of-git-rebase---interactive---autosquash/
SICPを読むためにやっておくと便利かもしれないこと

SICPこと計算機プログラムの構造と解釈を読むときにやっておくと便利かもしれない設定などのメモ．

## テキストとサンプルコード
http://mitpress.mit.edu/sicp/
英文でよければ，ここで全文読める．
また，本文中のコードも公開されているため，とりあえず動かしたいとか，写経したはずだけど動かなかったみたいなときに使える．

日本語版も公開された．コードは無いので欲しい場合は上の英語版で.
http://sicp.iijlab.net/

## scheme処理系（gauche）
処理系にはgaucheを使うことにする．

	brew install gauche


## エディタの設定
コードを写しながら実行したいので，そのための設定をする．

### vim


http://d.hatena.ne.jp/aharisu/20120430/1335762494
こちらを参考にした．

NeoBundleでインストール

    
	NeoBundle 'git://github.com/aharisu/vim_goshrepl.git'

.vimrcの設定

	let g:neocomplcache_keyword_patterns['gosh-repl'] = "[[:alpha:]+*/@$_=.!?-][[:alnum:]+*/@$_:=.!?-]*"
	vmap <CR> <Plug>(gosh_repl_send_block)

:GoshREPL
でインタプリタを起動
範囲選択してEnterで選択した式が評価される．


###emacs
http://fkmn.exblog.jp/5485192/
emacsでの設定はこちらを参考にした．
.emacs.d/init.elの設定

	(setq scheme-program-name "gosh")
	(require 'cmuscheme)

	(defun scheme-other-window ()
	  	"Run scheme on other window"
  		(interactive)
  		(switch-to-buffer-other-window
   			(get-buffer-create "*scheme*"))
  		(run-scheme scheme-program-name))

	(define-key global-map
  		"\C-cS" 'scheme-other-window)

C-c Sでインタプリタの起動
C-c C-lでファイルのロード
C-x C-eで直前の式を評価

## その他
本文中のコードそのままだとgaucheでは動かないところがある．
例えば，gaucheでは真偽値は#tと#fだが，本文ではtrueとfalseを使っているなど
そのあたりの補間

	(define true #t)
	(define false #f)

	; 1.2節，問題3.5等で乱数を使う．使い方は下記URL参照
	; http://practical-scheme.net/wiliki/schemexref.cgi?SRFI-27
	(use srfi-27) 

	; 問題1.22
 	; http://sicp.g.hatena.ne.jp/n-oohira/?word=*%5Bgauche%5D を参考にした
 	(define (runtime)
 		(use srfi-11)
 		(let-values (((a b) (sys-gettimeofday)))
		(+ (* a 1000000) b)))

	; 2.2.1節
	(define nil '())
	
	; 3.5節 遅延評価で使う
	(define-macro (delay x) `(lambda () ,x))
	
	; 5章 レジスタ計算機で使う
	(define user-initial-environment interaction-environment)

もっとあるような気もする，思い出し次第追記する．

その他，1章で実装する2乗，平方根，最大公約数を求める関数などは後の章でもよく出てくるため，まとめて定義してロードできるようにしておくと良いと思われる．