OmniAICreator/Qiita-1.07M huggingface dataset:
Ember.jsで複数種類のポップアップを表示する


明細の中の編集ポップアップのイメージ
１種類のデータだが、データの状態に応じて、テンプレートを変更したい

##ポップアップのテンプレートを複数用意する
```html:popup1.hbs
<div id='editNoNaka'>1</div>
```

```html:popup2.hbs
<div id='editNoNaka'>2</div>
```

##ポップアップ表示元画面にコンテナを用意する
ControllerにContainerViewを用意する

```js:mainController.js
App.MainController = Ember.ArrayController.extend({
    editContainer: Ember.ContainerView.create(),
	...

```

テンプレート内でそのContainerViewをいれておく

```html:main.hbs
    <div class="edit">
        {{view editContainer}}
    </div>
```

##呼び出し処理

アクション（引数付き）を用意し、その中でコンテナに対しViewのCreateを行う
Viewに対して、templateNameにアクション引数を渡すことで、テンプレートを切り替える

```js:mainController.js
App.MainController = Ember.ArrayController.extend({
	...

	actions: {
		openEdit: function(hoge) {
			this.get('editContainer').removeAllChildren();
			this.get('editContainer').pushObject(App.EditPopupView.create({templateName: hoge}));
        },

```

アクションを呼び出すボタンを用意する
その引数としてテンプレート名を渡す

```main.hbs
    <button {{action openEdit 'popup1'}}>green</button>
    <button {{action openEdit 'popup2'}}>red</button>
```

##表示処理

Viewの初期表示、didInsertElementで、jQueryでうまく表示する
View自身は

```js:edit_popup_view.js
App. App.EditPopupView = mber.View.extend({
    templateName: '',
    didInsertElement: function() {
        this.$('#editNoNaka').show();
    },
	...
});
```
OpalからRaphael.jsを使うためのライブラリを作りました

Opalから、2Dグラフィックライブラリの[Raphael.js](http://raphaeljs.com/)を呼び出すためのバインディングを書きました。
前から手元にはあったのですが、githubに置いてgemで入れられるようにしました。

https://github.com/yhara/opal-raphael

OpalはJavaScriptで書かれたRuby処理系です。opal-raphaelを使うと、Ruby(にとても良く似た言語)を使って、ブラウザ上で絵を書いたり動かしたりできます。

## できること

丸と四角が描けます。

```rb:example/app/application.rb
require 'opal'
require 'opal-raphael'

def onload(&block)
  `window.onload = block;`
end

onload do
  paper = Raphael(0, 0, 600, 600)

  background = paper.rect(0, 0, 600, 600)
  background.attr("fill", "#efefef")
  background.attr("stroke", "#efefef")

  circle = paper.circle(100, 100, 30)
  circle.attr("fill", "red")
  rect = paper.rect(200, 100, 50, 50)
  rect.attr("fill", "blue")
end
```

![](https://camo.githubusercontent.com/b29d496c06c220867eccac3f587840b8ccff9d64/687474703a2f2f6779617a6f2e636f6d2f36633939363564313264356164386631303636376538313238313836366635662e706e67)

それ以上の機能はまだちゃんと動かなかったりしますが、とりあえず.attr()が動くのでひと通り遊べるかと(x, yを変えて位置を移動させるとか)。プルリク歓迎です。
あるいはIssuesやtwitterの@yharaにメソッドが欲しい、と言ってもらえれば対応できるかも知れません。

## 使い方

* Gemfileに`gem 'opal-raphael'`を追加
* Ruby側に`require 'opal-raphael'`を追加
* HTMLでraphael.jsをロード
* Opal上で`require 'opal-raphael'`

## サンプル

リポジトリにサンプルが入っているので、とりあえずこれを動かしてみるのがおすすめです。

1. example/というディレクトリがあるので、これを丸ごとコピーする
2. Gemfileを少し修正
  * before: gem 'opal-raphael', path: '../'
  * after: gem 'opal-raphael'
3. `bundle install`
4. `bundle exec rackup`
5. http://localhost:9292/ を開く

これで上のスクリーンショットのような絵が出るはずです。
あとはapp/application.rbを書き換えてブラウザをリロードしてください。
kswapdがCPU99%喰ってるのを解消したメモ

全く何もした覚えのないサーバからある日突然CPUアラートが上がってきた。
みたら kswapd0 ってプロセスがCPU99%喰っている。swap関連ぽいがメモリは超余裕であいててswap自体も殆ど入っていないのになぜ？

とりあえず「kswapd0 cpu」とかでググったところ、以下を実行すれば直るって言う情報がすぐに見つかった。

```
echo 1 > /proc/sys/vm/drop_caches
```

で直った。カーネル関連プロセスだからkillとかしてはいけない。

しかしそもそもこいつがCPU喰いだしたきっかけがまだ分からんくてモヤモヤするなぁ…。
Opalのsprocketsでsouce mapをオフにする方法

[最近のOpalはopal-sprocketsが内蔵されている](http://qiita.com/yhara/items/cdcdf81efeb865dafc88)という記事を書きましたが、Opal 0.6.2ではデフォルトでsource mapが有効になっています。

source mapはJSの自動生成を行う際に、「変換前はこういうコードでしたよ」という情報を残す仕組みです。うまく使うとデバッグに役立つのですが、試してみたところどうも例外の位置がうまく取れない？ようなので、オフにする手段を調べました。

```diff:config.ru
 run Opal::Server.new { |s|
+  s.source_map = false
+
   s.append_path 'app'

   s.main = 'application'
```

上記のようにconfig.ruでs.source_map = falseを指定すれば良いようです。
JavaScriptからOpal側のコードを呼ぶ方法

Opal(JSで書かれたRuby処理系)用のコードをJSから呼ぶ方法です。
http://opalrb.org/docs/using_ruby_from_javascript/

そういう用途がどれくらいあるか分かりませんが、OpalのコードはJSにコンパイルされるので、変換規則を知っていればJavaScriptからOpal側のクラスやメソッドにアクセスすることが可能です。

例えば以下のようなクラスをOpalで定義したとします。

```rb
class Foo
  def bar
    puts "called bar on class Foo defined in ruby code"
  end
end
```

すると、「Fooのオブジェクトを作ってbarを呼ぶ」という操作は

```js
Opal.Foo.$new().$bar();
```

のようにして実行できます。Opalのメソッドは頭に「$」が付いた名前で格納されているので注意してください。
Swift コンビニエンスイニシャライザ


コンビニエンスイニシャライザを使用する事で
クラスの初期化でオーバーロードのような処理ができます

```

class Food {
    var name: String
    var weight:Int
    
    init(name: String,weight: Int) {
        self.name = name
        self.weight = weight
    }
    
    convenience init() {
        self.init(name:"[Unnamed]",weight:0)
    }
    
    convenience init(name:String) {
        self.init(name:name,weight:0)
    }
}

let meat = Food()
let bacon = Food(name:"Bacon")
let baconWithWeight = Food(name:"Bacon",weight:5)
```
Opalの標準添付ライブラリ

Rubyをインストールすると、「[標準添付ライブラリ](http://docs.ruby-lang.org/ja/2.1.0/library/index.html)」としてjsonとかerbとかoptparseとかが付いてきます。

Opalにも同様に標準添付ライブラリがあり、requireすることでいろいろな機能が使えます。
一覧は以下にありますが、簡単に分類してみたので貼っておきます。
https://github.com/opal/opal/tree/master/stdlib

## Rubyにも存在するもの

一部のメソッドのみ移植されていることが多いようです。

* base64.rb
  * `Base64.encode64(str)`など
* date.rb
  * `Date.today`など
* delegate.rb
  * `SimpleDelegator`など
* erb.rb
* forwardable.rb
  * `def_delegators`など
* json.rb
  * `JSON.parse`など
* observer.rb
* ostruct.rb
* pathname.rb
* pp.rb
* racc/parser.rb
* securerandom.rb
  * `SecureRandom.uuid`
  * Math.random()を使ってそれっぽいものを生成する
* set.rb
* singleton.rb
* rbconfig.rb
  * `RbConfig::CONFIG`など
  * ちなみにOpalかどうか検出したいだけなら`RUBY_ENGINE == 'opal'`でいけます
* stringio.rb
* strscan.rb
* thread.rb
  * 未実装？
* time.rb
  * `Time.parse(str)`, `Time#iso8601`

## Rubyでは組み込みクラスであるもの

* encoding.rb
  * UTF-8やUTF-16が扱えるっぽい？
* file.rb
  * `File.join`など
* math.rb
  * `Math.sin`など
* process.rb
  * `Process.pid`, `Signal.trap`のスタブ

## Opal独自のもの

* opal-parser.rb
  * `Kernel#eval` (コンパイル時ではなく、ランタイムにOpalコードを実行する)
* opal-source-maps.rb
* template.rb
* promise.rb
* buffer.rb
  * ArrayBufferへのインターフェイス
* nodejs.rb
  * Node用の関数？(opal-nodeとは違うのかな)
* phantomjs.rb
  * Phantomjsから使う用かな。Kernel.exitが定義してある
* native.rb
  * JSライブラリのバインディングを書くときの補助ライブラリ
capistrano3 タスクにパラメータを渡す方法

capistrano2系で使っていた-s/-Sオプションが使えなくなっていた。
検索すればいくらでも見つかる話ではあるが気にせずメモ。

タスクにパラメータを渡す方法として、実行時に環境変数で渡す方法と、実行中に対話的に渡す方法があるみたい。

# 環境変数でパラメータを渡す
そのままずばり、ENV['NAME']で取ってくる
deploy.rbや deploy/[env].rbに以下のように書く

```config/deploy/staging.rb
set :branch, ENV['BRANCH'] || "master"
```

実行方法は例えばこんな感じ

```
$ BRANCH=develop cap staging deploy
```

# 対話的にパラメータを渡す
2系では`Capistrano::CLI.ui.ask` で対話的にパラメータを入力できた
3系では`Capistrano::CLI`クラスが無くなっているが、askメソッドは使える
askメソッドは第二引数がデフォルト値になる

```config/deploy/staging.rb
ask(:branch, 'develop')
```

テストタスクを書いて挙動を確認してみる

```config/deploy.rb
namespace :mytask do
  task :test do
    puts fetch(:branch)
  end
end
```

実行結果

```
$ cap staging mytask:test
Please enter branch (develop):
develop

$ cap staging mytask:test
Please enter branch (develop): hoge
hoge
```

ちなみに、askは最初に変数をfetchしたタイミングで呼ばれる
以下のようなタスクを書いたとして

```config/deploy.rb
namespace :mytask do
  task :test1 do
    puts '1st fetch'
    puts fetch(:branch)
    puts '2nd fetch'
    puts fetch(:branch)
  end

  task :test2 do
    puts 'not fetch'
  end
end
```

実行してみると、test1では最初に1回askされ、test2ではaskされない

```
$ cap staging mytask:test1
1st fetch
Please enter branch (develop): hoge
hoge
2nd fetch
hoge

$ cap staging mytask:test2
not fetch
```
Sublime Text2&3用のSwift Package


###Swift-Sublime-Package  
Package Controlをインストールしている前提

https://sublime.wbond.net/packages/Swift

1.``⌘+Shift+p``でコマンドパレットを開く。  
2.``install``とタイプし、“Package Control: Install Package”を選択、Enter。  
3.``swift``とタイプし、"Swift"を選択、Enter。  



なんか久しぶりでいろいろ忘れちゃったので、  

使用可能なパッケージの確認は
http://quattro4.hatenablog.com/entry/2012/06/18/212902

>メニュー Sublime Text 2→Preferences ▶ Browse Packages...  

>インストールしたパッケージの確認は
⇧⌘P→Type [pali] → Package Control: List Packages



打ち込んでいって気づいたけど、⌘＋/でのToggle Commentが効かないなあ。

Package Controlのインストール方法はこちら
https://sublime.wbond.net/installation
Ember.jsでリンクに選択状態のクラスを付ける


hoge1を表示するリンク、hoge2を表示するリンクがあり、それを開いているときに、リンクの見た目を変えたい

「activeClass」でできる


```hoge.hbs
{{#link-to "hoge" tagName="li" href=false activeClass="select"}}<a {{bind-attr href="view.href"}}>A</a>{{/link-to}}
{{#link-to "hoge2" tagName="li" href=false activeClass="select"}}<a {{bind-attr href="view.href"}}>B</a>{{/link-to}}

```
Capistranoでのrsyncを利用したアプリケーションのデプロイ

Capistrano 3系でちょうどマッチした利用方法が見つからなかったので、試行錯誤した結果をまとめた。

# Capistranoでのrsyncを利用したRubyアプリケーションのデプロイ

## 使用するライブラリ

* capistrano(3系)
* bundler
* capistrano-rsync
* capistrano-bundler

## デプロイのフローについて

リポジトリがアプリケーションが動作するサーバーのネットワークからアクセスできないという事情があったので、事前に依存ライブラリを取得した上で、リリースできるように、下記のようなデプロイのフローにした。
イメージとしては、JavaでWARとかにパッケージングしたのを配布する感じ。

1. デプロイサーバー上で、リポジトリからソースの取得
2. デプロイサーバー上で、あらかじめ取得したソースが依存しているライブラリを取得
3. 実行サーバーに対して、リソースの展開
4. 実行サーバーでのライブラリのインストール

## デプロイサーバーへのコピー処理

Capistrano3系では、[capistrano-rsync](https://github.com/moll/capistrano-rsync)というgemが、ちょうど上記の動作フローとマッチした実行ステップをもっていたので、このライブラリを使用することにした。

大雑把なステップは下のような感じ。

1. リポジトリからソースの取得　(rsync:stage)
2. 実行サーバーへのリソースのコピー (rsync:release)

### 依存ライブラリの取得処理

依存ライブラリの取得に、`bundle package --all`を利用する。こうすることで、あらかじめ、`vendor/cache`に、依存しているライブラリがダウンロードされる。

実行するステップについては、リポジトリからソースの取得のタイミングで行うことで、実行サーバーへコピーする時に`vendor/cache`も含めて、コピーされるようにする。

また、platformに依存して、インストールするgemが変わるようなもの(libv8とか)については、デプロイ作業を行うサーバーのplatformと実行サーバーのplatformが異なると、インストールが失敗するので、事前に、`gem fetch`等で取得しておく。

```
namespace :package do
  desc 'packaging gems'
  task :gems do
    run_locally do
      Dir.chdir 'tmp/deploy' do
        # bundlerでの環境変数を引き継がない状態で、実行
        Bundler.with_clean_env do
          system 'BUNDLE_GEMFILE=Gemfile bundle package --all --quiet'
          # 環境(platform)に依存しているライブラリがあれば別途、取得
        end
      end
    end
  end
end

after 'rsync:stage', 'package:gems'
```

### rsync処理での設定

```rb
namespace :rsync do
  # 3.2系から、scmのset_current_revisionが呼ばれるようになったことに対応
  # cf. https://github.com/moll/capistrano-rsync/issues/15
  # internally needed by capistrano's "deploy.rake"
  task :set_current_revision do
    run_locally do
      within fetch(:rsync_stage) do
        rev = capture(:git, 'rev-parse', 'HEAD')
        set :current_revision, rev
      end
    end
  end

  # rsyncのコマンドオプションを指定
  task :set_options do
    set :rsync_options, %w(-az --delete --delete-excluded --exclude .git*)
  end

end

before 'rsync', 'rsync:set_options'
```

## デプロイ処理での設定

`rsync`を使う設定と、取得したパッケージを利用するように、`bundler`のオプションを追加する。

```
set :repo_url, '<gitリポジトリのURL>'
# :gitの代わりに、:rsyncを指定
set :scm, :rsync

## Bundler
set :bundle_path, -> { shared_path.join('bundle') }
set :bundle_without, %w(development test).join(' ')
# --localオプションを指定することで、vendor/cache経由でインストール
set :bundle_flags, '--deployment --local'
```

### パッケージングしたライブラリの取り回しの修正

上記の設定だと、毎回のリリースごとに、`bundlr`がパッケージングした`vendor/cache`が丸ごとコピーされてしまい、ディスクスペース的に無駄なので、`deploy.rb`の`:linked_dir`に、`vendor/cache`を追加した上で、シンボリックリンクをはるようにします。

```rb
# deploy.rbでのシンボリックリンクの対象にvendor/cacheを追加
set :linked_dirs, %w(log tmp/pids tmp/cache tmp/sockets vendor/bundle vendor/cache)
```

上記で作成したシンボリックリンクのリンク先を書き換えて、`rsync`しているディレクトリの`vendor/cache`を指すようにします。

```rb
namespace :release do
  desc 'symlink cache dir'
  task :symlink_cache do
    on roles(:app) do
      within release_path do
        execute "cd '#{release_path}'; ln -sfn #{fetch(:deploy_to)}/#{fetch(:shared_path)}#{fetch(:rsync_cache)}/vendor/cache vendor/cache"
      end
    end
  end
end

after 'deploy:symlink:linked_dirs', 'release:symlink_cache'
```
gitで差分の作成

1回目
 - cd そのフォルダ
 - git initでリポジトリ作成
 - touch .gitignore　（ゴミファイル・パスワードが記載されているファイル等を除外するためのファイルを作成）
 - echo 入れたくないファイル名 >> .gitignore
 - echo .gitignore >> .gitignore
 - git add .でインデックスに全ファイルを読み込む
 - git commitでリポジトリに確定する

2回目以降
 - cd そのフォルダ
 - git statusで変更されたファイル・追加ファイルを確認する
 - git add -uでインデックスに変更されたファイルを読み込む
 - （新規追加ファイルがあったら）git add ファイル名でインデックスに追加ファイルを読み込む
 - git statusで確認（ファイルが緑色で表示される）
 - git commit （新規）もしくは　git commit --amend（前回に上書き:1日に何回かやったりする）

その他
 - git logでcommit履歴が出る
 - git diff 前回の5文字 今回の5文字で差分が出る
 - git diff --stat 前回の5文字 今回の5文字で変更したファイル一覧が出る
.exeや.dllがPATH環境変数の中のどのフォルダにあるか探す方法

PATHが通ってはいるが、.exeや.dllが具体的にどのパスにあるか探す方法。
PowerShellを使う。

# .exeの場合
```powershell
PS C:\> Get-Command notepad.exe | % { $_.Definition }
C:\Windows\system32\notepad.exe
```

# .dllの場合
```powershell
PS C:\> $Env:PATH.Split(";") | ? { Test-Path "$_\kernel32.dll" }
C:\Windows\system32
```
実はObjective-Cではアニメーションが動かない事がある

#アニメーションが動かない
##animateWithDuration

Objective-Cでアニメーションを実装する場合、次のようなコードを書く場合があります。（有名な「逆引きObjective-C」のものをつかっています。）
自分の環境の場合、このコードは動くのですが、拡大・縮小だけでなく移動を入れようとするととたんに動かなくなりました。

```objc
- (void)viewDidLoad
{
    [super viewDidLoad];
 
    // 画像を表示する
    UIImage *image = [UIImage imageNamed:@"image01.png"];
    UIImageView *imageView = [[UIImageView alloc]initWithImage:image];
    imageView.center = CGPointMake(160, 240);
    [self.view addSubview:imageView];
 
    // アニメーション
    [UIView animateWithDuration:2.5f // アニメーション速度2.5秒
                          delay:1.0f // 1秒後にアニメーション
                        options:UIViewAnimationOptionCurveEaseIn
                     animations:^{
                         // 画像を2倍に拡大
                         imageView.transform = CGAffineTransformMakeScale(2.0, 2.0);
 
                     } completion:^(BOOL finished) {
                         // アニメーション終了時
                         NSLog(@"アニメーション終了");
                     }];
}
```

コードは完璧なのに・・・。なぜでしょうか？

#原因
AutoLayoutを使用した場合、viewDidLoad,viewWillAppearではframeが決定していないようです（参考： [[iOS6] AutoLayoutを使用すると、viewWillAppear: でframeが決定しないので注意](http://www.zero4racer.com/blog/988 "[iOS6] AutoLayoutを使用すると、viewWillAppear: でframeが決定しないので注意")）そのため、このタイミングでanimationを開始した場合挙動が環境によっては不安定になります。（Xcodeのバージョンによっても変わる模様）

以下のライフサイクルが分かっている人にとってはある当然のことかもしれません。（viewDidLoadのタイミングでは画面はまだ表示されていないから）

|イベント | iOS |
|:------------:|:------------:|
|  クラスが生成されたとき | init |
| 画面がロードされる前|   loadView |
| 画面がロードされた時 |  viewDidLoad|
| UIの配置が行われる前 |  viewWillLayoutSubviews |
| UIの配置が行われた後 | viewDidLayoutSubviews |
| 画面が表示される直前 | viewWillAppear|
| 画面が表示された直後| viewDidAppear |


#解決策
###解決策1:viewDidAppear後にアニメーションを開始する
以下のように書きます

```objc
-(void)viewDidAppear:(BOOL)animated{
    // 画像を表示する
    UIImage *image = [UIImage imageNamed:@"image01.png"];
    UIImageView *imageView = [[UIImageView alloc]initWithImage:image];
    imageView.center = CGPointMake(160, 240);
    [self.view addSubview:imageView];
 
    // アニメーション
    [UIView animateWithDuration:2.5f // アニメーション速度2.5秒
                          delay:1.0f // 1秒後にアニメーション
                        options:UIViewAnimationOptionCurveEaseIn
                     animations:^{
                         // 画像を2倍に拡大
                         imageView.transform = CGAffineTransformMakeScale(2.0, 2.0);
 
                     } completion:^(BOOL finished) {
                         // アニメーション終了時
                         NSLog(@"アニメーション終了");
                     }];
}
```

##解決策２：autolayoutのチェックを外す
autolayoutが悪いならautolayoutしなければよい、ということでautolayoutのチェックを外してやっても解決します

![スクリーンショット 2014-06-10 16.02.21.png](https://qiita-image-store.s3.amazonaws.com/0/32046/ef0f9cfd-5fd4-1acd-645f-a928ec571d0d.png)
ラジオボタンが非選択のときにブラウザが値を送信してくれない事象をsimple_formで何とかする方法


## 困ったこと

ラジオボタンが非選択状態のとき、ブラウザはラジオボタン項目の値を送信してくれないのです（値がないから当然ですよねー）。

「非選択状態」という状態を保存したいとき、これだと保存されなくて困る。詰む。

## 解決方法

### 前提

rails4 + simple_form + twitter bootstrap3のマークアップです。

### simple_form側の実装

こちらの記事で紹介されている方法をsimple_formで実装します。
[radioボタンが非選択時、値を送信しないのに対応する](http://takuya-1st.hatenablog.jp/entry/20110426/1303836544)

```ruby:/app/inputs/collection_radio_buttons_input.rb
class CollectionRadioButtonsInput < SimpleForm::Inputs::CollectionRadioButtonsInput
  # @override
  def collection
    if translate(:options).present?
      translate(:options)
        .to_a
        .map { |elem| [elem.last, elem.first] }
        .push(['未回答', '']) # <= 空の項目を常に追加するようにする
    else
      super
    end
  end

  # @override
  def apply_nested_boolean_collection_options!(options)
    options[:item_wrapper_tag] = nil
  end

  # @override
  def build_nested_boolean_style_item_tag(collection_builder)
    hidden_class = collection_builder.value.blank? ? ' hidden' : ''
    collection_builder.label(class: item_wrapper_class + hidden_class) {
      collection_builder.radio_button + collection_builder.text
    }
  end

  # @override
  def item_wrapper_class
    'radio-inline'
  end
end
```

simple_formは基本的にオーバーライドして振る舞いを変えられるのが便利です。

collectionメソッドは[ラジオボタンの項目数が多すぎてもsimple_formでそこそこすっきり書く方法](http://qiita.com/mah_lab/items/11cf47b030e0f632ac03)で紹介した、選択項目の値を`config/locals/`以下のファイルに書いてしまう方法を取り入れつつ、翻訳が存在する場合のみ空の項目を常に追加するようにしています（booleanのラジオボタンのときに誤判定する可能性もあるので、その辺考慮した方が良いです）。

こうやって空の項目を追加することで、「空白の値を持つラジオボタン」を作り出しているのです。

空白の値を持つラジオボタンは表示されないで欲しいので、build_nested_boolean_style_item_tagメソッドをオーバーライドして、空白の値の場合はhiddenクラスを追加するようにしています。hiddenには`display: none`やらそんな感じのスタイルが定義されているので、表示上見えなくなるという寸法です。

### ビュー側の実装

非選択状態のときは、内部的には空白の値を持つラジオボタンが選択されている状態でなければなりません。

そんな訳で、そういう風になるようにJavaScriptで制御してあげる必要があります。

今回は既に選択してあるラジオボタンをクリックすると、ラジオボタンが非選択状態になる、という振る舞いを実現します。

```coffeescript
beforeRadioValue = null
$('input:radio').on 'mousedown', ->
  beforeRadioValue = $("input:radio[name='#{$(this).attr('name')}']:checked").val()
.on 'click', ->
  if $(this).val() == beforeRadioValue
    # 既に選択してあるラジオボタンをクリックしたときに、空白の値を持つラジオボタンが選択されるようにする
    $(this).closest('.form-group').find("input:radio[value='']").prop('checked', true)
```

これでサーバに空白の値が送信されるようになります。めでたしめでたし。
クラスタリングの結果を再利用する

データマイニングは大量のデータに解析手法を適用することで、それまで未知だったデータの特徴を発見し、新たな知見を獲得することですが、しばしば機械学習と共通の技法が利用されます。

ごく単純な考え方として教師なし学習の結果をもってすれば残りのその他のデータも同様に知識の適用が可能であり、結果を訓練データとして正確性を向上させたりすることができるわけです。

## 学年全体の生徒の成績を分類する

[前回](http://qiita.com/ynakayama/items/1223b6844a1a044e2e3b)は生徒の科目ごとの成績からその傾向ごとに班分けをする例を紹介しました。この生徒たちを受け持っている先生はこの班分け結果をもとに学年全体の生徒も分類できるのではないかと考えました。

識別関数の一種であるサポートベクトルマシンと、確率的分類器であるナイーブベイズは考え方も手法もまったく別のものです。

### scikit-learn を使う

scikit-learn の素晴らしいところはたくさんありますが、その中のひとつとして異なる手法でも[一貫性のある API](http://scikit-learn.org/stable/modules/classes.html) が設計されており、よく似たコードで実装可能なところではないかと筆者は考えています。

```py3
import numpy as np
from sklearn.cluster import KMeans
from sklearn.naive_bayes import GaussianNB
from sklearn import svm

# データの掲載が冗長なのでカンマ区切りの .csv を読み込む形式に
features = np.genfromtxt('data.csv', delimiter=',')

# K-means クラスタリングでラベルを分類する
kmeans_model = KMeans(n_clusters=3, random_state=10).fit(features)
labels = kmeans_model.labels_

clf = GaussianNB() # ガウシアンカーネルによるナイーブベイズ分類器
#clf = svm.SVC(kernel='rbf', C=1) # RBF カーネルによるサポートベクトルマシン

# クラスタリング結果をもとに分類器を鍛える
clf.fit(features, labels)

# テスト対象のデータ (学年の他の生徒たちの成績) を読み込む
test_X = np.genfromtxt('test.csv', delimiter=',')

# 分類器で分類する
results = clf.predict(test_X)

# 結果をソートして表示
ranks = []
for result, feature in zip(results, test_X):
    ranks.append([result, feature, feature.sum()])

ranks.sort(key=lambda x:(-x[2]))

for rank in ranks:
    print(rank)
```

## まとめ

実際にサンプルデータを用意してやってみるとわかりますが、それぞれの手法でクラスごとの境界がどのように変わるか目で見て把握できるかと思います。ここから先はそれぞれの理論の話になってくるわけです。
DjangoページでAjaxしてみる

JavascriptでPOSTしようとするとDjangoのCSRF対策に引っかかり失敗してしまうことがあるのだが、公式ドキュメントにちゃんと対策が書かれている。
http://docs.djangoproject.jp/en/latest/ref/contrib/csrf.html?highlight=csrf#ajax

なお、使い回せるようにコピペしたものをGithubに上げたので使いたい方はどうぞ。
https://github.com/juniskw/django_tools/blob/master/csrf_token_ajax.js

### 例：POSTした文字に「！！！」を付けてアラートするアプリ。

###### surprise.html

```html+django
<head>
    <script type="text/javascript" src="{{STATIC_URL}}js/jquery-1.11.0.min.js"></script>
    <script type="text/javascript" src="https://raw.githubusercontent.com/juniskw/django_tools/master/csrf_token_ajax.js"></script>
</head>
<body>
	<h1>Let's Surprise!</h1>
	<form id="surprise_fm" action="surprise/" method="post">
		<input id="your_txt" type="text" name="your_txt">
		<input id="surprise_btn" type="submit">
	</form>
</body>
<script>
$(document).ready(function() {
	$('#surprise_fm').submit(function() {  // ボタンクリックでAJAX
		$.ajax({
			'url':$('form#surprise_fm').attr('action'),
			'type':'POST',
			'data':{
				'your_txt':$('#your_txt').val(),
			},
			'dataType':'json',
			'success':function(response){  // 通信が成功したら動く処理で、引数には返ってきたレスポンスが入る
				alert(response.your_surprise_txt);  // レスポンスからデータを取り出してアラート
			},
		});
		return false;
	});
});
</script>
```
###### urls.py

```py
#...
url(r'^surprise/', 'views.for_ajax'),
#...
```

###### views.py

```py
def for_view(req):    # ビューを表示する関数
	return render(req,'surprise.html')

def for_ajax(req):    # AJAXに答える関数
	import json
	from django.http import HttpResponse,Http404

	if req.method == 'POST':
		txt = req.POST['your_txt']  # POSTデータを取得して
		surprise_txt = txt + "!!!"  # 加工

		response = json.dumps({'your_surprise_txt':surprise_txt,})  # JSON形式に直して・・

		return HttpResponse(response,mimetype="text/javascript")  # 返す。JSONはjavascript扱いなのか・・
	
    else:
		raise Http404  # GETリクエストを404扱いにしているが、実際は別にしなくてもいいかも
```

なお、jsを以下のように一部書き変えれば普通に **csrf_token** をフォームに入れるだけでも問題ない。

```js
$.ajax({
    // ...
    'data':$('form#surprise_fm').serialize(),
    // ...
});
```

**serialize** はおそらくform内のinput要素を全て **{name:value,...}** の形にまとめてくれるメソッドだと思われる。Djangoの **csrf_token** はタネを明かせば **hiddenタイプのinput要素** みたいなので、この方法なら通常のフォーム処理と同様に機能することができるのだろう。
Rails migrationでカラムを追加する場所を指定する方法


まずはmigrationファイルを作成する。

```
r g migration AddColumnToUsers work_time:time
invoke  active_record
create  db/migrate/20131202155637_add_column_to_users.rb
```

作成されたファイルを開く。
add_columnの行の最後に、`:after => :column_name`を追記。

```db/migrate/20131202155637_add_column_to_users.rb
class AddColumnToUsers < ActiveRecord::Migration
  def change
    add_column :users, :work_time, :time, :after => :necessary_time
  end
end
```

で、

```
rake db:migrate
```
別のブランチとの分岐点を起点に rebase -i する git エイリアス

Pull request を送る前にブランチを整理するとき、「master から枝分かれしたコミットから HEAD までのコミット」を `git rebase --interactive` の対象にしたいことがある。あるのでエイリアスを書いた：

```ini:.gitconfig
[alias]
rebase-from-mb = !sh -c 'git rebase -i $(git merge-base ${1:-master} HEAD)' -
```

`git rebase-from-mb <branch>` を実行すると、指定したブランチと現在のブランチの分岐点となるコミットから HEAD までを対象に interactive rebase を開始する。 `<branch>` を省略した場合のデフォルトは `master`。
エリア外を押したらポップアップダイアログが消えるようにする

モーダルダイアログにしてブロッカーでタップイベントをキャッチ 
```
var popup = new qx.ui.mobile.dialog.Popup(widget);
popup.setModal(true);
var blocker = qx.ui.mobile.core.Blocker.getInstance();                                                                                                                                  
blocker.addListener('tap', function() {
    popup.hide(); 
}, this);
popup.show();
```
Opal処理系のバグの調査方法

Opalのバグっぽいものを[見つけた](https://github.com/opal/opal/issues/547)ので、調査方法など書いておきます。

## 発端

1. opal-jqueryではElement.find(...)とかで要素を検索する
2. しかしfindメソッドが無いと言われる
3. 上でFoo::Elementというクラスを定義しているのが怪しいか…？

## 結論

試行錯誤してみたところ、

```
class A
  class B < `Object`; end
end
p B
```

のようにインナークラスがJSクラスを継承している場合に、クラス定義がトップレベルに漏れてしまうようでした。

Opalはまだこんな感じで処理系自体にバグがあったりするので、取り扱いには注意が必要です(´・ω・`)
以下ではバグっぽいものを見つけたときにやることについてメモしておきます。

## opalrb.org/tryで試す

http://opalrb.org/try/ にWeb版のirbっぽいものがあるので、ここにコードを書いて挙動を試すことができます。

注意点ですが、Runボタンを押しても **環境はリセットされない** ので、トップレベルで定義したクラスとかは残ってしまいます。リセットするにはブラウザをリロードする必要があります。

またRunの隣のLinkというボタンを押すと、そのコードのpermalinkを得ることができます。バグ報告の際にはこのURLを貼ると親切かもしれません。

## opal gemで試す

gem install opalでopal gemを入れておくと、試したいコードをfoo.rbに保存して

```shell-session
$ opal foo.rb
```

で実行することができます。(※たぶんJS実行環境が必要)

`$ opal -c foo.rb` だと実行する代わりにJSが出力されます。

## git masterで試す

念のためmasterでも試したいというときは、opal/opalをcloneして

```shell-session
$ ruby -Ilib bin/opal foo.rb
```

で実行することができます(-Ilibを付けないとgemで入れたopalを読み込もうとするので注意)。
Laravel 4でFacebook SDK 4.0.XのFacebookRedirectLoginHelperを使う

Facebook PHP SDK 4.0.Xの[FacebookRedirectLoginHelper](https://developers.facebook.com/docs/php/FacebookRedirectLoginHelper/4.0.0)は、ネイティブセッションを使っているので、セッションを有効にしないと動かないという罠がある。Laravelだとネイティブセッション使って無くて困る。`storeState`と`loadState`という関数でセッションを使っていて、コメントを読むとネイティブセッションを使いたくないなら継承してオーバーライドしろやと書いてあるので、そうする。

```php
  /**
   * Stores a state string in session storage for CSRF protection.
   * Developers should subclass and override this method if they want to store
   *   this state in a different location.
   *
   * @param string $state
   *
   * @throws FacebookSDKException
   */
```

どっか自作クラスの置き場所を作るなどする場合は(`app/libs`とか)、autoloadのためにcomposer.jsonに追記してdump-autoload。

```json
  :
"autoload": {
  "classmap": [
    "app/commands",
    "app/controllers",
    "app/models",
    "app/database/migrations",
    "app/database/seeds",
    "app/libs",
    "app/tests/TestCase.php"
  ]
  :
```

その中で`storeState`と`loadState`をオーバーライドする。

```php
<?php

use Facebook\FacebookRedirectLoginHelper;

class LaravelFacebookRedirectLoginHelper extends Facebook\FacebookRedirectLoginHelper {
    protected function storeState($state)
    {
        Session::put('FBRLH_state', $state);
    }

    protected function loadState()
    {
        return $this->state =  Session::get('FBRLH_state');
    }
}
```

それでFacebookRedirectLoginHelperの代わりにLaravelFacebookRedirectLoginHelperを使ってログイン処理を書けばよい。

参考: http://stackoverflow.com/questions/23501811/new-facebook-sdk-4-throw-exception-about-php-session-active-in-laravel
ORM + Pagination で、ページネーションする



DBにあるデータを一覧する場合、ページネーションする必要がある。
ORMとPaginationを使用する場合は、以下のような処理の流れになると思う。

1. ORMデータの総数を取得する(Paginationに渡すため)
2. Paginationインスタンスをforge
3. ORMで現在のページを取得する(Paginationのメソッドからlimitとoffsetを設定)

このように、
ORM -> Pagination -> ORM
のようにモジュールを使用するので、
以下のようにORMはメソッドチェーンでやると楽。

```php:fuel/app/classes/controller/user.php
public function action_index()
{
    // カテゴリ1の総数を取得する。
    $query =
       Model_User::query()->where('category_id', 1);
    $total_items = $query->count();

    // Paginationインスタンスを生成
    $pagination = Pagination::forge('users', [
        'total_items' => $total_items,
        'per_page'    => 20,
        'uri_segment' => 'page',
    ]);
    $stash['pagination'] = $pagination;

    // 現在のページのユーザーのリストを取得
    $stash['users'] =
        $query
        ->order_by('created_by', 'desc')
        ->limit($pagination->per_page)
        ->offset($pagination->offset)
        ->get();

    ...
}
```
Golangでクロスコンパイルに失敗した場合のTips

Windows環境でLinux向けにgolangのバイナリをビルドしようとしたときに
<code>&gt; go build src/hogehoge.go
go build runtime: linux/amd64 must be bootstrapped using make.bat
</code>
こんなメッセージが出て悲しい思いをしたときに。

GOARCH=amd64, GOOS=linux になっていることを確認して
<code>&gt; go tool dist install -v pkg/runtime
&gt; go install -v -a std
</code>

これでLinux用のランタイムがGO_ROOT/pkg下にインストールされるのでコンパイルできるようになるようです。

元ネタ：http://stackoverflow.com/questions/20829155/how-to-cross-compile-from-windows-to-linux
RSpec3で特定のディレクトリのspecにメタデータを追加する

前提
===

Sinatra+RSpec3+Capybara で簡単なテストを書いてみた

```rb
describe 'App' do
  before do
    visit '/'
  end
  it do
    expect(page).to have_content 'Hello, world'
  end
end
```

これでrspecを走らせたところ以下のようなエラーが

```
Failure/Error: visit '/'
NoMethodError:
  undefined method `visit' for #<RSpec::ExampleGroups::App::Nested1:0x007fc3f45531f0>
# ./spec/app_spec.rb:3:in `block (2 levels) in <top (required)>'
```

これ自体はmetadateの付け忘れでcapybaraを使う場合は`describe` に `type: :feature `が必要だという話だった

```rb
describe 'App', type: :feature do
  # 中略
end
```

これはこれでいいんだけれど、ファイルが増えたら付け忘れが起きそうだしRailsの時はディレクトリに入れれば `type` 無しでいけた気がする…

RSpec::Core::Configuration#define_derived_metadata
===

みたいなことをツイートをしてたらリプライで教えていただいた

<blockquote class="twitter-tweet" data-cards="hidden" lang="ja"><p><a href="https://twitter.com/chiastolite">@chiastolite</a> RSpec 3 以降であれば Configuration#define_derived_metadata を使って自前で定義できます。rspec-rails 3 も内部的にはこれを使っています。 <a href="https://t.co/QlBBUutRFF">https://t.co/QlBBUutRFF</a></p>&mdash; Yuji Nakayama (@nkym37) <a href="https://twitter.com/nkym37/statuses/475917777903947776">2014, 6月 9</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

というわけで試してみた
今回は spec/features/ 以下のspecファイルに`type: :feature`をつける

```rb
RSpec.configure do |config|
  config.define_derived_metadata(file_path: %r{/spec/features/}) do |metadata|
    metadata[:type] ||= :feature
  end
end
```

そして実行

```bash
$ rspec
.
Finished in 0.02655 seconds (files took 0.45621 seconds to load)
1 example, 0 failures
```

動いたーー


注意
---

このメソッド自体はRSpec3から入ったようなので、RSpec2では多分動きません
raspbian+Bluetooth環境でTX status timeoutのエラーが頻発したのを解決

#問題
Raspberry PiにBluetoothでスピーカを接続したら数十秒ぐらいで切れてしまう現象が発生した。
*OSはRasbian(Debian Wheezy)の2014Decバージョン。
*Bluetoothドングルは[PlanexのBT-Micro4](http://www.amazon.co.jp/gp/product/B0071TE1G2/ref=oh_details_o05_s00_i02?ie=UTF8&psc=1)を使用。でも、[GMYLEのこっち](http://www.amazon.co.jp/gp/product/B007MKMJGO/ref=oh_details_o01_s00_i00?ie=UTF8&psc=1)も結果は同じ。
*エラーメッセージは以下。
```Jun 10 11:50:07 raspberrypi kernel: [ 2738.627575] ieee80211 phy0: rt2800usb_entry_txstatus_timeout: Warning - TX status timeout for entry 13 in queue 2
Jun 10 11:50:07 raspberrypi kernel: [ 2738.627652] ieee80211 phy0: rt2800usb_entry_txstatus_timeout: Warning - TX status timeout for entry 13 in queue 2
Jun 10 11:50:07 raspberrypi kernel: [ 2738.627676] ieee80211 phy0: rt2800usb_entry_txstatus_timeout: Warning - TX status timeout for entry 13 in queue 2
Jun 10 11:50:07 raspberrypi kernel: [ 2738.627726] ieee80211 phy0: rt2800usb_entry_txstatus_timeout: Warning - TX status timeout for entry 14 in queue 2
Jun 10 11:50:07 raspberrypi kernel: [ 2738.627761] ieee80211 phy0: rt2800usb_entry_txstatus_timeout: Warning - TX status timeout for entry 15 in queue 2
Jun 10 11:50:07 raspberrypi kernel: [ 2738.653154] ieee80211 phy0: rt2800usb_txdone: Warning - Got TX status for an empty queue 2, dropping
Jun 10 11:50:07 raspberrypi kernel: [ 2738.659768] ieee80211 phy0: rt2800usb_txdone: Warning - Data pending for entry 5 in queue 2
Jun 10 11:50:07 raspberrypi kernel: [ 2738.660353] ieee80211 phy0: rt2800usb_txdone: Warning - Got TX status for an empty queue 2, dropping
```

#あれこれやってみた
・Bluetooth機器側の問題かと思い、PCに接続したが問題が起きず。．．となれば、ドングルか。
・BluetoothのUSBドングルについては[ここ](http://36yen.blogspot.jp/2013/06/bluetooth-usb.html?showComment=1401081559020#c1206748405614809598)に詳しくてチップメーカ毎に相性があるとのことで、Motorola製チップの[PlanexのBT-Micro4](http://www.amazon.co.jp/gp/product/B0071TE1G2/ref=oh_details_o05_s00_i02?ie=UTF8&psc=1)からBroadcom製チップの[GMYLEのこっち](http://www.amazon.co.jp/gp/product/B007MKMJGO/ref=oh_details_o01_s00_i00?ie=UTF8&psc=1)を入手しても結果は同じ。
######蛇足：GMYLEのやつは安いんだが、香港から送ってくるので入手に２週間かかった。
・RaspbianOSの問題だったら世界中で悩んでいる人がいるはずだが、上記のエラーメッセージからは全然ひっかからない。

#解決
・結局原因はRaspbianの問題でした。本日、**apt-get dist-upgrade**を実行したところめでたく解決。いつ解決したのか不明ですが、少なくとも以下のバージョンでは大丈夫のようです。
```pi@raspberrypi /var/log $ uname -a
Linux raspberrypi 3.12.20+ #687 PREEMPT Fri May 30 16:39:11 BST 2014 armv6l GNU/Linux
```
・いつもapt-get updateしかやっていなかったのですが、apt-get dist-upgradeが大事ですね。
chrootされたsftp専用ユーザを作るメモ

必要になったので実は初めて設定してみた。その際に、やりかたをぐぐりながら参考にしたサイト情報が結構余分な設定があったりなんだりしたので、自分用にまとめ直し。

# sftp専用ユーザはユーザ名のprefixを決めておくと楽
- 設定が以下のように設定一つにまとめられるのと、
- 後で/homeを見たときに一目で __こいつらはsftp専用ユーザだな__ と分かるので。

```text:/etc/ssh/sshd_config
Match User sftp-*
  ChrootDirectory ~
  ForceCommand internal-sftp
```

まぁ、個別指定やGroupによるMatchとかにしときゃいいんだけどね。今回の僕の案件ではこれが楽だったってだけの話です。

# Subsystem sftpについて
ぐぐってるとよく、以下のように設定を書き換えましょう、て説明してるとこがあるけど、どうせMatchの中のForceCommandでinternal-sftpって指定してるので、全体設定側の書き換えは不要。

```text:/etc/ssh/sshd_config
#Subsystem       sftp    /usr/libexec/openssh/sftp-server
Subsystem       sftp    internal-sftp
# ↑この書き換えはsshd_configのMatch内で上書き設定してる限りにおいて不要
```

chrootしたいときにsftp-serverじゃなくinternal-sftpを使う理由は簡単で、chrootした環境ではsftp-serverコマンドが存在しないから。sshdのinternal-sftpはその回避策の為のもの、だと思う。


# ChrootDirectory先のディレクトリ自体はroot所有にしておく
ユーザ所有のディレクトリにChrootさせようとすると以下のようなエラーをみることになるので気をつける。

```text:/var/log/secure
sshd[24348]: fatal: bad ownership or modes for chroot directory "/home/sftp-test"
```

最終的に以下のようなパーミッションとディレクトリ構成が出来ることになる。

```text:
drwxr-xr-x 4 root       root       4096 Jun 10 13:49 /home/sftp-user1/
drwxr-xr-x 2 sftp-user1 sftp-user1 4096 Jun 10 13:06 /home/sftp-user1/upload_here
drwx------ 2 sftp-user1 sftp-user1 4096 Jun 10 12:55 /home/sftp-user1/.ssh
-rw------- 1 sftp-user1 sftp-user1  749 Jun 10 12:50 /home/sftp-user1/.ssh/authorized_keys
```


# Chrootが不要な場合sftp専用ユーザを作りたいときは
単に公開鍵に対して `command=""` を書いておけばよい。

```text:~/.ssh/authorized_keys
command="internal-sftp" ssh-rsa AAAAXXXXX user@example.jp
```

または、

```text:~/.ssh/authorized_keys
command="/usr/libexec/openssh/sftp-server" ssh-rsa AAAAXXXXX user@example.jp
```

これらはどっちでも動くけど個人的には internal-sftp を使う方が好み。
なぜなら internal-sftp は間違えてsshでつないでしまった際に `This service allows sftp connections only.` て教えてくれて接続を切ってくれる親切設計だから。これが sftp-server だと何も言わずに無言でsshコネクションが維持されて感じ悪いので。

ただしコマンド版の方がプロセス分離されてる分セキュリティ的にはより堅牢なのかもしれない。
The Swift Programming Language "Collection Types"〜Dictionary(辞書)〜

The Swift Programming LanguageのLanguage Guideの"Collection Types"よりDictionaryをざっとまとめたものです。

Objective-Cを始め、既に他の言語を習得されてる方向けです。

[前章 Collection Array](http://qiita.com/hmu29/items/1cb7a12c056894925567)
[次章 Control Flow](http://qiita.com/hmu29/items/81b5cf89afc83d2f85c1)

# 辞書

ハッシュテーブル。
そのため値は順序を持たない。

NSDictionaryとは異なり、指定した型のみを格納できる。(C++のテンプレート的)
Dictionary<KeyType, ValueType>

# キーについて

KeyTypeは、ハッシュ可能(hashable)の必要がある。

# 辞書リテラル

[key1: value1, key2: value2, key3: value3]

```Swift
var airports: Dictionary<String,String> = ["TYO": "Tokyo", "DUB":"Dublin"]

// これもOK
var airports2 = ["TYO": "Tokyo", "DUB":"Dublin"]

var key1 = "TYO"
var key2 = "DUB"
// これもOK
var airports3 = [key1: "Tokyo", key2:"Dublin"]
```

# アクセスと変更

## 個数

```Swift
var airports = ["TYO": "Tokyo", "DUB":"Dublin"]
airports.count // 2
```

## 追加、変更

```Swift
var airports = ["TYO": "Tokyo", "DUB":"Dublin"]

// 追加
airports["LHR"] = "London"

// 変更
airports["LHR"] = "London Heathrow"

// 変更して古いキーも取得
if let oldValue = airports.updateValue("London", forKey: "LHR") {
  println("old=\(oldValue)")
}
```

## 参照

キーに対応する値が存在しない場合は、nilを返す。（この場合、nameはString?型)
 [optional(nil許容)参照](http://qiita.com/hmu29/items/ce76da172999165358bc#1-15)

```Swift
var airports = ["TYO": "Tokyo", "DUB":"Dublin"]
if let name = airports["TYO"] {
  // キー"TYO"に対応する値が見つかった場合の処理
} else {
  // 値が見つからなかった場合の処理
}
```

## 削除

値にnilを設定するか、removeValueForKeyで削除できる。

```Swift
var airports = ["TYO": "Tokyo", "DUB":"Dublin"]
airports["TYO"] = nil

if let removedValue = airports.removeValueForKey("DUB") {
}
```

# 探索

## KeyとValueのペア

```Swift
var airports = ["TYO": "Tokyo", "DUB":"Dublin"]
for (code, name) in airports {
  println("\(code)=\(name)")
}
```

# キー配列を取得

ただし順序は保証されない。

```Swift
var airports = ["TYO": "Tokyo", "DUB":"Dublin"]
airports.keys // ["TYO", "DUB"] // キーの配列を取得する。順序は、登録内容による。
```

# 値の配列を取得

ただし順序は保証されない。

```Swift
var airports = ["TYO": "Tokyo", "DUB":"Dublin"]
airports.values // ["Tokyo", "Dublin"] // 値の配列を取得する。順序は、登録内容による。
```

## 空の辞書を生成

```Swift
var dic = Dictionary<Int, String>()

// 一度生成した後なら、これも可能.
dic = [:] 
```

# 辞書もJavaでいう参照型っぽい

# let
配列同様、letに格納すると、要素は変更できるけど、要素数は変更できなくなる。

----

[次章 Control Flow](http://qiita.com/hmu29/items/81b5cf89afc83d2f85c1)
AngularJSで外部APIコールをキャッシュする


- 一番簡単に実現するには、`$http` サービスで外部APIコール時に `cache: ture` オプションを渡します。
	- cacheFactory 内の `$http` という名称の領域にキャッシュされます。

```javascript
'use strict';

angular.module('apiTestApp')
  .factory('JsonData', ['$http', function ($http) {

    return {

      getSampleData: function () {

        return $http.get('data/sample.json', {cache: true})
          .success(function(data, status, headers, config) {

            return data;

        });

      }

    }

  }])
;
```

- きちんとキャッシュされているか否かは、Chrome の Developer Tools で確認できます。
	- 2回目以降はAPIコールがされなければOK（後述しますがキャッシュ先はヒープメモリなので、ブラウザをリロードするとキャッシュは消えてしまうので注意）。

![スクリーンショット 2014-06-10 12.58.18.png](https://qiita-image-store.s3.amazonaws.com/0/35733/ddacef49-a05e-114e-4f0c-209daf9431b2.png "スクリーンショット 2014-06-10 12.58.18.png")

- もしキャッシュの挙動を変えたい場合は、独自の Factory を作成します。
	- 下の例では、独自に `apiCache` という Factory を作成し、cacheFactory 内の `api` という名称の領域にキャッシュさせています。
	- この際、`capacity` オプションを指定し、最も利用されている10件のみキャッシュするようにしています。

```javascript
'use strict';

angular.module('apiTestApp')
  .factory('apiCache', function($cacheFactory) {

    return $cacheFactory('api', {capacity: 10});

  })
  .factory('JsonData', ['$http', 'apiCache', function ($http, apiCache) {

    return {

      getSampleData: function () {

        return $http.get('data/sample.json', {cache: apiCache})
          .success(function(data, status, headers, config) {

            return data;

        });

      }

    }

  }])
;
```


# 補足

- キャッシュ先およびアルゴリズムは [$cacheFactory](https://code.angularjs.org/1.2.16/docs/api/ng/service/$cacheFactory) に準じます。
	- キャッシュ先はヒープメモリです。
		- ブラウザをリロードするとキャッシュは消えます。
	- `capacity` オプションを指定した際、LRUアルゴリズムが適用されます。

# 参考

- 公式ドキュメント（[$http](https://code.angularjs.org/1.2.16/docs/api/ng/service/$http), [$cacheFactory](https://code.angularjs.org/1.2.16/docs/api/ng/service/$cacheFactory)）
- https://www.ng-book.com/p/Caching/
- http://www.phase2technology.com/blog/caching-json-arrays-using-cachefactory-in-angularjs-1-2-x/


# ほか

- angular-cacheというサードパーティのモジュールもあります。
	- http://jmdobry.github.io/angular-cache/
	- GitHub：https://github.com/jmdobry/angular-cache
Cheerioで<div data-hoge="huga">のhugaを得るために

```html 

<div class="cnt cf TS2bh" data-time="1402244500">

```

こんなのがあったとする.その時に

```coffeescript
request options,(error,response,body) ->
        tel = cheerio.load(body)
        time = tel('div','#TSm').data('time')
```

これで`data-time`がとれる
Affixプラグインでスクロール時に横幅が変わってしまう場合


Bootstrap 3.0 で `affix` プラグインを使った場合に、下にスクロールしていくと横幅が急に小さくなってしまう事態に遭遇しました。

親要素に`min-height`を設定してみたものの上手くいかなかったので、jsでモンキーパッチ。

~~~javascript
$(document).ready(function(){
  var $affix = $('*[data-spy="affix"]');
  $affix.width($affix.parent().width());
});
~~~

そのうち本体でfixされるんじゃないかと思うけど。
CloudFormationのStack（templateファイル）を作成する前に知っておくべきこと


# これを読むとわかること

一度作ったことがある人はわかると思いますが、  __「時間が掛かる」__ので少しでも __「技術的ではなく事前知識で」__時間を省略してHappyになりましょうねっ！っていうお話。

## 難しいことは書いていないので・・
### タイトルだけ読むと良いと思います


### 1. Amazonが提供しているテンプレートの再利用は、効率上がるように見えて非効率なこともある
 CloudFormationの文法やお作法は慣れていないと最初はテンプレートに頼りがちになります。確かにすごく役に立つテンプレートがいっぱいありますが、それをそのまま自分のシステムに適用する場合は、当然、どういう設定がされているか内容を把握しておく必要もあります。ファイルを開くと結構なコード量があり、多くの行を読まされてしまいます。また中にはちゃんと動作しないケースもあります。変にそこに悩んで調べてしまうよりは、ダメだったら自分で作るほうが良いこともあります。
つまり、自分が理解している正しいテンプレートに対して、新しくやりたい小さいことを追加するほうが読むべき（理解すべき）量は減ります。   
  

### 2. デバッグの方法は知っておくこと
  デバッグ方法を知らないでコーディングするのは無謀過ぎるでしょ？という当然な話。具体的な方法は知らなくても、「ちゃんとログを吐いてることを知っておくこと」。コンソール上のエラー内容から推測してすぐ直して動けばいいけど、それが何度かうまくいくと癖になってしまうのを恐れましょう。
具体的には、まずエラーが発生するとROLLBACKしてしまうので、AWSコンソールのCloudFormationのStack作成フロー中に、
「Select Template」＞「Specify Parameters」＞「Options」の
OptionsでAdvancedのRollback on failure設定があるのでこれを「No」にする。
エラーになったサーバーの以下のファイルなどに具体的な原因が吐かれていること
/var/log/cfn-init.log
/var/log/cloud-init.log
エラーのケースによっては調べる方法も変わってくるかと思いますが、まだエラーになったケースが少ないので知っているのはこの程度です。

### 3. 小さく作って大きく育てる
  こちらもプログラムの基本っぽいところですが、CloudFormationのテンプレートも小さく少しずつ作って確からしいことの集合体にすべきです。TDDと同じ考え方かな、にしては１サイクルがすごく手間で時間が掛かるのをどうにかして欲しいですね。ネストしたテンプレートにしてしまうのもありだけど、よく考えて作らないと後々汎用が効かず失敗しそう。mavenからgradleへ進化していった経緯を考えると、CloudFormationもいつか進化するか、またはこれに変わる新しいものの登場が待ち遠しいところです。

### 4. テンプレートにする必要があるか？（その目的は何ですか？）
　がんばって作ったけどImuutableな構成にする必要があるのか？目的をちゃんと考えましょう。気づいたら時間の無駄使いしているかもしれませんよ。

### 5. OpsWorks、その他構成管理ツール（Chef、Ansible、等々）と被るところがある
 自分はOpsWorksの存在自体を知らなかったのですが、CloudFormationとOpsWorksがそれぞれ得意とするところを理解しておくべき。

# まとめ
「お！これは！」感の無い記事ですが、StackTemplateを作っていて事前に知っておきたかったことをまとめさせていただきました。
これを使うとできることと、やりたいことの方法はググると出てきますが、そもそもの考え方ってなかなかちゃんと説明してくれないですよね。二の次になってしまいがちですしね。
【Rails4.1】secret.ymlのproductionのkeyを生成する方法


他のサイトでは移行方法はよく書かれてるんだけど、4.1で新規作成した場合のsecret.ymlのproduction-keyの作成方法が書かれてることが少なかったので。。

移行じゃないとsecret_token.rbなんてないー！！と思ってたら
ちゃんと方法がありました。


```console
RAILS_ENV=production rake secret
```

これで各環境のkeyが表示されるので、コピペしてsecret.ymlに書いて再起動すればOKでした。
OpenSSL 対応などの際に古いライブラリを使用したままのサービスを見つける

OpenSSL の脆弱性対応の際に、古いライブラリを使用したままのサービスを見つけて再起動したいとします。
その際に便利なのが [lsof](http://www.netadmintools.com/html/lsof.man.html) コマンドです。
このコマンドを使って、削除済みのライブラリを未だに参照しているサービスを見つけ出したいと思います。

```
$ sudo lsof | grep ssl | grep DEL
```

例えば、私の手元の環境 (Amazon Linux) では、以下の出力結果となりました。

```
qmgr       1349   postfix  DEL       REG              202,1                 5192 /usr/lib64/libssl3.so
qmgr       1349   postfix  DEL       REG              202,1                 4827 /usr/lib64/libssl.so.1.0.1e
```

Postfix がまだ古いライブラリを参照しているようなので、サービスを再起動します。

```
$ sudo service postfix restart
Shutting down postfix:                                     [  OK  ]
Starting postfix:                                          [  OK  ]
```

これで再度 `lsof` で確認しても、出力結果に出てこなくなりました！
✌ ('ω' ✌ )三 ✌ ('ω') ✌ 三( ✌ 'ω') ✌
boot2dockerのメモリを増やす


boot2dockerの初期値の1Gでは心もとなかったので増やしてみました。
参考：[boot2dockerでdockerを試す](http://blog.n-z.jp/blog/2014-02-23-boot2docker.html "boot2dockerでdockerを試す")

$HOME/.boot2docker/profileにVM_MEMを設定してあげる。
(デフォルト:1024)

```手順
$ cd $HOME/.boot2docker
$ boot2docker stop
$ boot2docker delete
$ vi profile
$ cat profile
VM_MEM=2048
$ boot2docker init
$ boot2docker start
```
これでメモリが2048に増える。

```変更前
docker@boot2docker:~$ free -m
             total         used         free       shared      buffers
Mem:          1000          259          741            0            0
-/+ buffers:                258          742
Swap:          180            0          180
```

```変更後
docker@boot2docker:~$ free -m
             total         used         free       shared      buffers
Mem:          2009          265         1743            0            0
-/+ buffers:                264         1744
Swap:          431            0          431
```

ただ、この方法だと一度deleteしているのイメージやコンテナが消えてしまうので注意。
消えるのが嫌ならstopした後にVirtualBoxから変更した方がいいかもしれない。

```VBoxManage
$ boot2docker stop
$ VBoxManage modifyvm boot2docker-vm --memory "1024"
$ boot2docker start
```

これでもメモリが増やすことが出来る。
Opal用のgemを作る

この前の記事では[RubyとOpal両方で動くgemの作り方](http://qiita.com/yhara/items/b8c9b1d96b58f69ee216)を書きましたが、ついでなので「Opal専用gemの作り方」についても書いておきます。

Opal専用gemといっても中身は普通のRubyGemsですが、慣習的に、Opal用のコードはlib/ではなくopal/以下に置くことが多いようです。

## ファイル構成

opal-barというライブラリを作るとします。

* opal-bar.gemspec
  * 普通に書く
* opal/opal-bar.rb
  * Opalのコードを書く
  * Opal上で`require 'opal-bar'`とすると、このファイルが読み込まれる
* lib/opal-bar.rb
  * Ruby用のコードを書く(後述)
  * `Opal.append_path File.expand_path('../opal', File.dirname(__FILE__))`

## 使い方

このopal-barを使うプロジェクトでは、まずGemfileにこのgemを指定します。

```rb:Gemfile
gem 'opal-bar'
```

次に、Opalコード内に`require 'opal-bar'`を書きます。
ただしこれだけだとOpalのロードパスにopal-bar.rbが見つからないため、エラーになります。ここで登場するのが前述のlib/opal-bar.rbです。

opal-barを使うプロジェクトのRuby部分(例えばconfig.ru)に
    require 'opal-bar'
という1行を追加します。これによってopal-bar gemのlib/以下がOpalのロードパスに登録されるので、Opal内で`require 'opal-bar'`できるようになります。

## 余談

ではopal/opal-bar.rbにはどのようなコードを書けばいいのか…という話はまた別途書きます。気になる人は[Qiitaのopalタグ](http://qiita.com/tags/opal)をフォローしておいてください。
opal-rspecでOpalコードのテストを書く

[前回の記事](http://qiita.com/yhara/items/b8c9b1d96b58f69ee216)ではRubyとOpalに両対応したgemを作る話を書きました。
この場合lib/以下のコードを「RubyとOpal、どちらでも動く」ように書く必要があります。Opalはまだたまに抜けてるメソッドがあったりするので、ちゃんとOpalでも動くかコマンドラインでテストできるといいですよね。

そこで使えるのが[opal-rspec](https://github.com/opal/opal-rspec)です。

## インストール

テストの実行にphantomjsが必要なので、例えばMac+Homebrewなら`brew install phantomjs`でインストールします。

## セットアップ

opal-rspecのexample以下にプロジェクトのひな形が置いてあるので、これをまるごとcpするのが簡単です。
https://github.com/opal/opal-rspec/tree/master/example

cpしたら、以下のようにします。

1. Gemfileのopal-rspecの部分を`gem 'opal-rspec', '0.3.0.beta3'`に書き換える
    * Opal 0.6.xに対応したものがbetaしか出ていないため。(RSpec3のリリースを待ってたのかも？)
2. `bundle install`
3. `bundle exec rake`

これで、spec/user_spec.rbが実行されます。

.rbという拡張子になっていますが、これはOpalのコードです。rakeを実行するとopal/user.rbとspec/user_spec.rbとRSpec本体がJSにコンパイルされ、phantomjsで実行されるという寸法です。
tcpdumpでファイルのローテーション

tcpdumpを使って``-w``オプションでキャプチャ結果をファイルに保存する際に，

* 一定のファイルサイズ毎
* 一定時間毎

で，保存先のファイルを変更する方法．

# 一定のファイルサイズ毎
``-C``オプションでファイルサイズ(MByte単位)を指定する．1Mbyte毎にローテーションしたい場合は

```
$ sudo tcpdump -w test.pcap -C 1 -ni eth0
```

とする．1Mbyteを超える毎に，test.pcap, test.pcap1, test.pcap2, test.pcap3, のように保存先のファイルが変更される．

# 一定時間毎
``-G``オプションで秒数を指定し，``-w``で指定する保存先のファイル名にstrftime(3)に準じた時刻情報のフォーマットを含める．60秒ごとにローテーションし，ファイル名に年月日(%F)時分秒(T)を入れたい場合は

```
$ sudo tcpdump -w test-%F-%T.pcap -G 60 -ni eth0
```

とする．60秒経過する毎に，test-2014-06-10-10:49:09.pcap, test-2014-06-10-10:50:09.pcap, というファイルができる．
ファイル名に時刻情報のフォーマットが含まれていない場合(`-w test.pcap`など)には， **ファイルが上書きされる** ので注意が必要．

# ローテーション後にコマンドを実行
``-z``オプションでコマンドを指定すると，ローテーションされたファイルに対してコマンドを実行できる．例えば，ローテーションされたファイルをgzipで圧縮したい場合には

```
$ sudo tcpdump -w test.pcap -C 1 -z gzip -ni eth0
```

とすると，ローテーション直後に自動的に

```
$ gzip test.pcap
```

が実行される．

``-z``オプションで指定するコマンドとして，2つ以上の引数が必要なコマンドや第1引数以外にファイル名を取るコマンドを使いたい場合は，そのコマンドをwrapしたシェルスクリプトなどを作り，そのスクリプトを-zで実行する必要がある．
OpalとRubyに両対応したgemを作る

JavaScriptで書かれたRuby処理系、Opal http://opalrb.org/ の話です。

Node.jsのメリットの一つとして、「ロジック部分のコードをサーバとクライアントで共有できる」という点が挙げられたりします。
Opalを使うとRubyのコードをJSにコンパイルできるので、「Rubyで書かれた1つのコードを、サーバ上でもクライアント上でも動かす」ということができます。

以下は具体的な方法です。

## gemの作り方

fooというgemを作って、RubyとOpalから使いたいとする。

* foo.gemspec
  * 普通に書く。
* lib/foo.rb
  * ここにライブラリ定義を書く。
    これはRubyからもOpalからも読み込まれる可能性があるので、Opalで使えない機能は使ってはいけない(Kernel#systemとか)
* lib/foo/opal.rb
  * 以下のように書く(意味は後述)
    `Opal.append_path File.expand_path('../', File.dirname(__FILE__))`

## Rubyから使う

Rubyから使う場合、Gemfileに`gem "foo"`と書き、コード内では`require "foo"`する。(要するに普通のgemを使う場合と同じですね)

## Opalから使う

Opalから使う場合、Gemfileに`gem "foo"`と書くのは同じだけど、その先がちょっと異なる。

まずOpalコード内には`require "foo"`と書きます。ただこれだけだとOpalのロードパスにfoo.rbがないのでエラーになる。

ここで、先ほど作っておいたlib/foo/opal.rbの出番です。
OpalプロジェクトのRuby側(たとえばconfig.ru)に`require "foo/opal"`と書いてください。

これで、Opalのロードパスにfoo gemのlib/以下が登録されるので、Opalコード内で`require "foo"`と書くことでfoo gemのlib/foo.rbを使うことができます。
最近のOpalはopal-sprocketsが内蔵されている

いつの間にかopal-sprocketsがobsoleteになって、Opal本体に組み込みになったらしい。

OpalはJavaScriptで書かれたRuby処理系である。opal-sprocketsは「とりあえずOpalを使った静的ページを作ってみたい」ときに使うやつ。ソースを保存すると自動で再コンパイルとかしてくれる。

最新のOpal 0.6.2ではこれがopal gemに内蔵されているので、http://opalrb.org/docs/using_sprockets/ に書かれているようにやるとHello Worldまでできる。せっかくなのでここにもメモしておきます。

## 準備

以下のファイルを用意する。

```ruby:Gemfile
source 'https://rubygems.org'

gem 'opal', '>= 0.6.0'
```

```ruby:app/application.rb
require 'opal'

puts "hello world"
```

```index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>opal server example</title>
    <script src="/assets/application.js"></script>
  </head>
  <body>
  </body>
</html>
```

```config.ru
require 'bundler'
Bundler.require

run Opal::Server.new { |s|
  s.append_path 'app'

  s.main = 'application'

  s.index_path = 'index.html'
}
```

用意できたら以下のようにする。

```shell-session
$ bundle install
$ bundle exec rackup
$ open http://localhost:9292/
```

これでページが表示できて、開発者コンソールに「hello world」と出力されるはず。あとはapp/application.rbにOpalのコードを書けば、ブラウザをリロードするだけで自動的にJSにコンパイルされて実行できる。

いまのOpalはRubyのひと通りの機能がだいたいあるので、http://opalrb.org/try/# ここにデモがありますが、クラス作ったりとか普通に動きます。

```rb
class User
  attr_accessor :name

  def initialize(name)
    @name = name
  end

  def admin?
    @name == 'Admin'
  end
end

user = User.new('Bob')
puts user
puts user.admin?
```
[iOS] [Objective-C] S3の動画をカメラロールに保存する

iPhoneシミュレーターだと「The operation could not be completed.」と言われて失敗するが
実機だと保存できている。

```objectivec
NSURL *sourceURL = [NSURL URLWithString:@"https://s3.amazonaws.com/〜動画のpath〜.mp4"];
NSURLSessionTask *download = [[NSURLSession sharedSession] downloadTaskWithURL:sourceURL completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
    NSURL *documentsURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject];
    NSURL *tempURL = [documentsURL URLByAppendingPathComponent:[sourceURL lastPathComponent]];
    [[NSFileManager defaultManager] moveItemAtURL:location toURL:tempURL error:nil];
    UISaveVideoAtPathToSavedPhotosAlbum(tempURL.path, nil, NULL, NULL);
}];
[download resume];
```
[MAMP]SSLの設定


基本的には

http://lab.cosmicguild.net/contents/matomemory/mamp-ssl-setting/

を参照しました。変更点としてはserver.keyやserver.crtの保管場所が記事では

```
apache/keys/
```

となっていましたが、面倒なのでapacheの直下に保存。
さらに追加でhostの設定をします。

##hostファイルの設定

```
$ sudo vim /etc/hosts
```

でhostsファイルを編集します。

```hosts
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1       localhost
255.255.255.255 broadcasthost
::1             localhost
fe80::1%lo0     localhost

127.0.0.1       www.example.com
```

一番最後の1行を追記して保存します。

127.0.0.1というのは、ローカル・ループバック・アドレスと呼ばれるアドレスで、自分自身を指す特別なIPアドレスだそうです。以下を参照。
http://www.adminweb.jp/apache/ini/index8.html

もろもろ完了し、Apacheを再起動したが、Apacheが起動せず。

http://qiita.com/maximum80/items/3ca16b0b41cd5ff11c6c

の手順で、apacheのエラー原因を探ると、httpd-ssl.confにsyntaxエラーを発見。

```httpd-ssl.conf
# General setup for the virtual host
DocumentRoot "/Applications/MAMP/htdocs" #この部分を修正
ServerName www.example.com:443
ServerAdmin you@example.com
ErrorLog　"/Applications/MAMP/Library/logs/error_log"
TransferLog "/Applications/MAMP/Library/logs/access_log"

```

ここの、
「#この部分を修正」
というコメントアウトがコメントアウトされてませんでした。。。

というわけで、その部分を編集して保存。

https://www.example.com/

にアクセスすると、

![Screen Shot 2014-06-10 at 10.01.40 AM.png](https://qiita-image-store.s3.amazonaws.com/0/6702/47cacb7a-34e3-abb8-447b-93205aec40c8.png "Screen Shot 2014-06-10 at 10.01.40 AM.png")

が表示されれば成功！！
バッチプログラムからYConnectによるAPIアクセスについて

YConnectに関するサンプルを見ると、Authorization Endpointにアクセスし、ユーザ認証、同意画面、リダイレクト先からAuthorization Code取得…という流れになっており、「ユーザ認証」「同意画面」のところはブラウザでのユーザ操作が必要の認識です。

Javaで実装したバッチプログラムからYConnect対応APIを利用したいのですが、上記のユーザ操作部分をHTMLパーサなどを使い、ユーザ操作相当の処理を記述してユーザ操作を必要としないAPIコールを実現しようと考えております。

これ以外にもっと簡単な実装方法がございましたら、ご教示いただけないでしょうか。