OmniAICreator/Qiita-1.07M huggingface dataset:
Ruboty | qiita 戦闘力を測定する ruboty-qiita_scouter を作成しました #ruboty

# Ruboty | qiita 戦闘力を測定する ruboty-qiita_scouter を作成しました #ruboty
## 概要
qiita 戦闘力を測定する ruboty-qiita_scouter を作成しました。

## 仕様
|key|value|
|:--|:--|
|pattern|/qiita scouter (?&lt;id&gt;.+?)\z/|
|description|user &lt;id&gt; のQiita戦闘力を測定|
|name|analyze|

## 利用法

* Gemfile

~~~ruby
source 'https://rubygems.org'

gem 'ruboty-qiita_scouter'
~~~

* 実行

※Qiita API からのデータ取得に結構時間がかかります

~~~
$ bundle install
$ bundle exec ruboty
> ruboty help
ruboty /qiita scouter (?<id>.+?)\z/ - analyze qiita power
ruboty /help( me)?\z/i              - Show this help message
ruboty /ping\z/i                    - Return PONG to PING
ruboty /who am i\?/i                - Answer who you are
> ruboty qiita scouter tbpgr
ユーザー名: tbpgr 戦闘力: 218544 攻撃力: 27840 知力: 183860 すばやさ: 6844
> ruboty qiita scouter invalid_user
Failed by OpenURI::HTTPError
~~~

## 補足
* 実装時に Ruboty のテンプレートジェネレータ [ruboty-gen](https://github.com/blockgiven/ruboty-gen) を利用しています。
* テストコードのひな形生成に [rspec_piccolo](https://github.com/tbpgr/rspec_piccolo) を利用しています。

## 参照
[ruboty-qiita_scouter GitHub](https://github.com/tbpgr/ruboty-qiita_scouter)
[ruboty-qiita_scouter RubyGems](http://rubygems.org/gems/ruboty-qiita_scouter)
[qiita_scouter GitHub](https://github.com/tbpgr/qiita_scouter)
[qiita_scouter RubyGems](http://rubygems.org/gems/qiita_scouter)
[rspec_piccolo GitHub](https://github.com/tbpgr/rspec_piccolo)
[rspec_piccolo RubyGems](http://rubygems.org/gems/rspec_piccolo)
[Ruboty GitHub](https://github.com/r7kamura/ruboty)
[Ruboty RubyGems](https://github.com/r7kamura/ruboty)
[ruboty-gen GitHub](https://github.com/blockgiven/ruboty-gen)
[ruboty-gen RubyGems](http://rubygems.org/gems/ruboty-gen)
[Ruboty | 自作 Handler gem の作成](http://qiita.com/tbpgr/items/a7ac8aaec55ee1bf79f0)
クラスメソッドに alias を付ける


いい例を思いつかなかったので適当なサンプルだが、例えば以下のように alias を使ってメソッドに別名を付けたい場合、クラスメソッドだと上手く行かない。

```ruby
class Status
  STATUS = {
    0 => "open",
    1 => "close",
    2 => "suspend",
    9 => "error",
  }
  def self.name(code)
    STATUS[code]
  end
  alias :[] :name
end
#=> undefined method `name' for class `Status' (NameError)
```
alias_method でも駄目。

```ruby
class Status
  STATUS = {
    0 => "open",
    1 => "close",
    2 => "suspend",
    9 => "error",
  }
  def self.name(code)
    STATUS[code]
  end
  alias_method :[], :name
end
#=> `alias_method': undefined method `name' for class `Status' (NameError)
```

結局以下のようにしたら出来た。

```ruby
class Status
  STATUS = {
    0 => "open",
    1 => "close",
    2 => "suspend",
    9 => "error",
  }
  def self.name(code)
    STATUS[code]
  end

  class << self
    alias :[] :name
  end
end

puts Status.name(0) #=> open
puts Status[9]      #=> error
```

alias_method でも同じようにやれば出来る。

```ruby
  class << self
    alias_method :[], :name
  end
```

### 参考

alias
http://docs.ruby-lang.org/ja/2.1.0/doc/spec=2fdef.html#alias

instance method Module#alias_method
http://docs.ruby-lang.org/ja/2.1.0/method/Module/i/alias_method.html

How to alias a class method - Ruby
http://www.justskins.com/forums/how-to-alias-a-102105.html

alias_method for static method - Ruby Forum
https://www.ruby-forum.com/topic/112031
お名前.comで取得したドメインのネームサーバーをRoute53に変更しELB配下のWebページをドメインで引けるようにする


# 前提条件

既にELB配下にWebページが動作している状態で、ELBのDNS NameでWebページが表示される事。
ELB-Webサーバー構成の一例については[こちら](http://qiita.com/ausuited/items/09b626fa5264f0c650fd)も参照の事。

# AWS側の手順（その1）

1. Servicesから"Route 53"を選択
1. [Get Started Now]ボタンを押下
1. [Create Hosted Zone]ボタンを押下
  1. Domain Nameにお名前.comで取得したドメインを指定
  1. Commentはお好みで
  1. [Create]ボタンを押下
1. Hosted Zone Detailsの中にDelegation Setというエントリーがあり、ネームサーバーが4つほど列挙されているはず。これがネームサーバーなので、情報を控える。

# お名前.comでネームサーバーを変更する手順

1. ドメインNaviにログイン
1. Navi Topに移動
1. ドメインが表形式で表示されているはずなので、ネームサーバー変更対象のドメインのネームサーバー列の[変更する]ボタンを押下
1. "他のネームサーバーを利用"を選択
1. ネームサーバーの情報を入力に、先程控えたネームサーバーを入力
1. [確認画面へ進む]ボタンを押下
1. [設定する]ボタンを押下

# AWS側の手順（その2）

1. Route 53 Dashboardの"Hosted Zone"を選択
1. 設定するドメインの左端のチェックボックスをチェック
1. [Go to Record Sets]ボタンを押下
1. [Create Record Set]ボタンを押下
  1. Nameはブランク
  1. TypeはA - IPv4 address
  1. AliasはYesを選択
  1. Alias Targetで対象のELBを選択
  1. [Create]ボタンを押下
ActiveRecordでincludesとwhereを同時に使う時はJOINするテーブル名の指定に気をつける

```ruby
Post.includes(:comments).where("comments.content like '%いいね%'")
```

というようにincludesとwhereを合わせて使うと「文字列中のテーブル名を自動認識しなくする予定だから`comments.content`のテーブル名は`references(:comments)`で指定してね」というDEPRECATION WARNINGが出ます。

とはいえ文字列で条件を指定しているのが良くないので

```ruby
Post.includes(:comments).where(Comment.arel_table[:content].matches('%いいね%'))
```

という感じでArelを使った方が良いです。ちょっとハマった。

元記事：[ActiveRecordでincludesとwhereを同時に使う時はJOINするテーブル名の指定に気をつける | 江の島CodeStyle](http://blog.enogineer.com/2014/10/28/active-record-implicit-join/)
Elixir Anonymouse Functions

# Elixir Anonymouse Functions

## 概要
Elixir の Anonymouse Functions について。

Anonymouse Functions の基本的な記述方法は以下です。

~~~
double = fn (x) -> x * 2 end
double.(2)
# => 4

# 括弧は省略可能
double = fn x -> x * 2 end
double.(2)
# => 4

# 複数行で記述
double_plus_one = fn (x) ->
  double = x * 2
  double + 1
end
double_plus_one.(2)
# => 5
~~~
vim 文字列置換 基本的な事

vimを利用している際の文字列置換の方法についてまずはいちばん簡単な答えを

``:%s/hoge/fuga/g``
これだけでファイル内のすべての``hoge``を``fuga``に置換できます。

***

以下に少し説明を書いていきます。

vimでの置換は``:s``を使用します。

``:%s``とすることで現在開いているファイル内で置換を実行するという意味になります。

まず1番簡単な方法

``:%s/hoge/fuga/``

でもこれだと

```
hogefuga
hogehoge
```
というファイルだと…

```
fugafuga
fugahoge
```
というように1行内に複数マッチする場合でも最初にマッチした文字列しか置換されません。

1行内でマッチした文字列すべてを置換したい場合は

``:%s/hoge/fuga/g``

と最後に`g`を入れれば解決です。

更にマッチした文字列を1つずつ確認しながら置換する場合は

``:%s/hoge/fuga/c``

と最後に`c`を入れればいいだけです。

なので

``:%s/hoge/fuga/gc``

とすればファイル内すべてのマッチした文字列を確認しながら置換できます。

また置換を行う行の範囲を指定したい場合は

``:10,20s/hoge/fuga/gc``

といったように指定すれば10-20行の間に存在するマッチした文字列のみを置換することができます。


**こちらもどうぞ**

[vimで一気にコメントアウトする方法(複数行の先頭に文字を追加する方法)](http://qiita.com/shirochan/items/174c3169344043449339)

[vimで任意の文字列が含まれる行を一括で削除する方法](http://qiita.com/shirochan/items/aa3efbe85fdaf852c2e1)

#### 参考書籍
[入門 Vim: 1時間で学ぶ最強コード編集技術のエッセンス](https://amzn.to/3T2ksBB)
[Vimテクニックバイブル～作業効率をカイゼンする150の技](https://amzn.to/3bCGcf5)
[マスタリングVim](https://amzn.to/2LEC9V1)
YosemiteにしたらIntelliJが立ち上がらなくなった件

タイトルの通りです。jdk1.6.0_65-b14-462.jdkを使用していたことが原因のようです。過去に、[ここ](http://qiita.com/m_mysht/items/a5e60d260c7078331d66)のやり方でjdk1.6をインストールした人は、該当するかもしれません。

##対処方法
jdk1.6を更新するだけでOKです。http://support.apple.com/kb/DL1572 からインストーラをダウンロードし、インストールしてください。

##結果・確認
/System/Library/Java/JavaVirtualMachines/1.6.0.jdkというディレクトリが生成されます。

バージョンが1.6.0_65-b14-466.1...であれば動くようです。

```
$/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home/bin/java -version
java version "1.6.0_65"
Java(TM) SE Runtime Environment (build 1.6.0_65-b14-466.1-11M4716)
Java HotSpot(TM) 64-Bit Server VM (build 20.65-b04-466.1, mixed mode)
```

##注意
[Info.plistを編集して使用するjdkバージョンを1.6から1.7に変更する](http://stackoverflow.com/questions/26438628/crash-jetbrains-ide-with-yosemite-mac-osx-webstorm-intellij)方法も出回っていますが、公式(JetBrains)は[推奨していません](https://intellij-support.jetbrains.com/entries/27854363-IDE-doesn-t-start-after-updating-to-Mac-OS-Yosemite-or-Mavericks)。ひとまず、上記のjdk1.6の更新がよさそうです。

##参考
http://stackoverflow.com/questions/26450420/osx-10-10-and-eclipse-luna-own-app-crashes-when-started-from-inside-eclipse
http://stackoverflow.com/questions/26438628/crash-jetbrains-ide-with-yosemite-mac-osx-webstorm-intellij
https://intellij-support.jetbrains.com/entries/27854363-IDE-doesn-t-start-after-updating-to-Mac-OS-Yosemite-or-Mavericks
WindowsにRubyをインストールする(初心者向け)


[Downloads - RubyInstaller](http://rubyinstaller.org/downloads/)から、一番上にある最新版(2014年10月現在では「Ruby 2.1.3」)をダウンロードしてください。

ダウンロードしたファイルをダブルクリックして実行し、指示に従ってインストールを進めます。現在ではインストール手順は日本語化されています。

「インストール先とオプションの指定」では、「Rubyの実行ファイルへ環境変数PATHを設定する」と「.rbと.rbwファイルをRubyに関連づける」にチェックします。
![rubyinstaller_option.png](https://qiita-image-store.s3.amazonaws.com/0/26124/b8435c6f-955d-cf1f-6d05-edd2930726d8.png "rubyinstaller_option.png")

インストールが終わったら、スタート→すべてのプログラム→アクセサリ(Windows 8ならスタートボタンを右クリック)から「コマンド プロンプト」を開いて、

```
ruby -v
```

と入力してEnterを押し、`ruby 2.1.3p242`と出ればOKです。
出ないようであれば「Rubyの実行ファイルへ環境変数PATHを設定する」のチェックを付け忘れているので、再度Rubyをインストールしてください。


続いてDevelopment Kitのインストールを行います。
同じく[Downloads - RubyInstaller](http://rubyinstaller.org/downloads/)から、「DEVELOPMENT KIT」欄の、「For use with Ruby 2.0 and 2.1 (32bits version only):」と書いてあるファイルをクリックし、ダウンロードします。

ダウンロードしたファイルを実行すると、展開する場所を聞かれるので、`C:\devkit\`と指定し「Extract」を押してください。

次に「コマンド プロンプト」を開き、

```
cd C:\devkit\
ruby dk.rb init
ruby dk.rb install
```

と入力します。

```
[INFO] Updating convenience notice gem override for 'C:/Ruby21'
[INFO] Installing 'C:/Ruby21/lib/ruby/site_ruby/devkit.rb'
```

と表示されればインストール完了です。
SwiftでAlamofireとAFNetworkingの使い方を比較してみる



Mattt Thompsonさんが開発した、Swift用の[AFNetworking](https://github.com/AFNetworking/AFNetworking)と、[Alamofire](https://github.com/Alamofire/Alamofire)をそれぞれ使ってみました。
それぞ、https://itunes.apple.com/search?term=apple&media=software に対してGETしてアプリのタイトルを表示するというようなコードになっています。

### Alamofireを使う

AlamofireをSwiftのプロジェクトに導入する方法は[HTTP通信OSS Alamofire 導入編](http://dev.classmethod.jp/references/swift-oss-alamofire-1/)が参考になります。    

コードは下記のようになります。
レスポンスはresponseJSONメソッドを利用した後に、[SwiftyJSON](https://github.com/SwiftyJSON/SwiftyJSON)を利用して処理しています。
responseの内容（responseData）はoptional型で定義されているので、Optional Bindingしています。

```swift
import Foundation
import Alamofire
import SwiftyJSON

let urlPath = "https://itunes.apple.com/search?term=apple&media=software"
  
Alamofire.request(.GET, urlPath).responseJSON { (request, response, responseData, error) -> Void in
	// titleを表示
	if let data: AnyObject = responseData {
		println("Success")
		let results = JSON(data)
		let count: Int? = results["results"].array?.count
		if let num = count {
			for index in 0..<num {
				let title = results["results"][index]["trackName"].string!
				println("tilte is {\(title)}")
			}
		}
	}

	// Error処理
	if let resError = error {
        println("Connection failed.\(resError.localizedDescription)")
        println("Failure:\(urlPath)")
    }
}
```



### AFNetworkingを使う

SwiftプロジェクトへのCocoaPodsの導入方法については、[SwiftとAFNetworkingの簡単サンプル](http://qiita.com/tajihiro/items/ad8606f61f3273423ea8)が参考になります。
AFNetworkingの利用方法は[ド定番OSS！AFNetworking 2.xの使い方](http://dev.classmethod.jp/smartphone/iphone/ios-afnetworking2/)が参考になります。

コードは下記のようになります。
AFNetworkingを利用する場合は、Alamofireのようにoptional型は出てきません。
Blocksの代わりにクロージャーを利用します。

```swift
let urlPath: NSString = "https://itunes.apple.com/search?term=apple&media=software"

let manager :AFHTTPSessionManager = AFHTTPSessionManager()
manager.GET(urlPath, parameters:nil,
	success: { (task, responseObject) -> Void in
		// titleを表示
       println("Success")
		if responseObject.count > 0 {
            
			for results in responseObject["results"] as NSArray {
				let title = results["trackName"].string!
				println("tilte is {\(title)}")
			}
		}

    },
    failure:{ (task, error) -> Void in
    	println("Connection failed.\(error.localizedDescription)")
        println("Failure:\(urlPath)")
})
```

###感想

Swiftで書かれたAlamofireを使用したが方がSwiftっぽいコードになった気がします。
ただしAlamofireにはAFNetworkingのようなUIKit Extensionは提供されていないので、UIKit Extension相当の機能を使いたい場合は、他のライブラリと組み合わせて実現するか、AFNetworkingを利用したほうがよさそうです。
クロノスグループが、コンピュータビジョンアクセラレーション向けOpenVX 1.0仕様を 完成させリリース

見ての通り適当な訳です。正確には原文を。
https://www.khronos.org/news/press/khronos-finalizes-and-releases-openvx-1.0-specification-for-computer-vision

----

クロノスグループが、コンピュータビジョンアクセラレーション向けOpenVX 1.0仕様を
完成させリリース

* 高速、軽量、低消費電力の視覚処理を多様なハードウエアアーキテクチャに提供
* フルレベルの適合テストプログラムがすぐに利用可能
* クロノスによるOpenVX実装をオープンソースで2014年末までに提供

2014/10/20 クロノスグループはOpenVX1.0仕様を公開しました。
この仕様は、クロスプラットフォームなコンピュータビジョン・アプリケーションを
アクセラレートするために無料で提供されます。

OpenVXは、特にリアルタイム組み込みシステムの用途で必要となるような性能とローパワーに
最適化されたコンピュータビジョン処理を可能にします。

顔認識、ボディ・ゼスチャー追跡、スマート動画認識、高度運転支援システム、
物体・シーン再構成、ＡＲ（拡張現実）、外観検査、ロボティクスなどなど。

OpenVX仕様に加えて、クロノスはフルレベルの適合テストプログラムを開発しました。
これは、OpenVXの実装者に、実装テストとOpenVXの適合マークを使えるかの判断を可能にします。

クロノスは、２０１４年末までにオープンソースのCPU向けフル適合実装をリリースする計画です。
OpenVX1.0仕様書と適合プログラムは、www.khronos.org/openvx から入手できます。

OpenVXは、OpenCLのような計算フレームワークに比べて、より高度な実行とメモリに関する
抽象化レイヤを定義します。これは一貫したAPIを維持しつつ、多様なアーキテクチャで効率的に
実行できる点において、重要な実装革命をもたらします。

OpenVX開発者は、インプリメンタが多様なテクニックを通して最適化と実行を可能にすることを、
視覚ノードの連結グラフを用いて表現します。
たとえば、CPU, GPU, DSP, 専用ハードウエアでのアクセラレーション、コンパイラ最適化、
ノード融合、処理イメージの一部をローカルメモリに保つためのタイリングなど。


極めて省電力でかつ、視覚機能を持つウエアラブルディスプレイ
なども含む、多様なシステムで動作するOpenVXアプリケーションに対して、
この敏捷性を備えたアーキテクチャは、それぞれ異なるレベルの電力と性能に最適化することを可能にします。

「凄まじくパワフルで効率的なプロセッサやイメージセンサは、様々なシステムやアプリケーションで
賢い視覚処理を取り込むことを可能にしています。」
「複雑なアルゴリズムをアプリケーションに最適な形で、効率的にプロセッサへマッピングすることが
エンジニアの挑戦の鍵となる」
と、エンベデッドビジョンアライアンスの創始者であるジェフ・バイアーは考えています。
OpenVXはこの挑戦を容易にする重要なステップとなります。

精密なOpenVX仕様と適合テストは、ベンダを超えた一貫性や信頼性が必須となる製品システムの開発に
理想的です。

OpenVXは、オープンソースのビジョンライブラリである有名なOpenCV
（アプリケーションのプロトタイプに使われる）に対して、緊密に結びついた
グラフ最適化機能を補完するものです。

クロノスは、VXUユーティリティライブラリを定義しました。これは、例えばOpenCVなどレガシーな
視覚化ライブラリからの効率的な移植に向けたもので、開発者が
個別のOpenVXノードをスタンドアロンの関数として呼び出せるようになります。

最後に、これまでのクロノスによる仕様策定と同じく、OpenVXは将来においてコア仕様に統合される前に、
カスタマの要求に合うようノードの定義を拡張することができるようになっています。

---
MacのTerminalで動画をテキスト(AA)で再生

<blockquote class="twitter-tweet" lang="en-gb"><p>CUIの動画変換ツールffmpegに、動画を再生できるffplayというツールが付属されてることに気付いて「コンソールだから動画の情報出るくらいだろうな」と気軽に実行したら…まさかの文字で動画を再生して爆笑した。結構なめらかだし <a href="http://t.co/JgQreyn0MT">pic.twitter.com/JgQreyn0MT</a></p>&mdash; ながㄘん (@naga3) <a href="https://twitter.com/naga3/status/526944989352165376">October 28, 2014</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

に影響を受けた。

ffplayだけではなく動画プレイヤーのmplayerでも同じようなことができるので、ここではmplayerを用いる。

まず、AA用のライブラリ aa, libcaca が必要なので、それを入れてからmplayerをインストール。いずれもhomebrewにある。

```
brew install aa
brew install libcaca
brew install mplayer --with-libcaca
```

を実行すればよい。（ここでは必須ではないが、mplayerのオプションに--with-x11を入れると普通の動画もGUIで再生できるようになる）

あとは動画を再生するために、

```
mplayer -vo caca aiueo.avi
```
と実行すればよいのだが、これだと正しく表示されない場合がある。
そこで、

```
mplayer -vo caca -msglevel all=0 hogehoge.avi
```
とメッセージ出力を抑えるオプションを追加する。これで快適に動くようになるはずである。

## 追記(10/29)
```
-vf framestep=[数字]
```
というオプションを付けると、毎[数字]フレームのうち1枚だけ表示するようになる。解像度が動画やコンソール文字数が多い時に、「音ズレ」が発生する場合は指定してみると良い。（[数字]は元ソースでは10を指定していた）

## 環境
* OS X Yosemite 
* iTerm2, Terminal.app

## 参考
* http://blog.yjl.im/2013/11/using-mplayer-aalib-or-libcaca-to-play.html
* http://qiita.com/asakasa/items/5fea615837191ab03cd8
* http://me.dt.in.th/page/caca/
PerlでConfig::Simpleを使って~/.aws/configファイルの設定値を取得する

~/.aws/configは、一般的には"ini形式"と呼ばれる設定ファイルフォーマットのようです。

Config::Simpleモジュールを使うと値を取得することができます。

http://perldoc.jp/docs/modules/Config-Simple-4.55/Simple.pod

# ~/.aws/config
```ini
[default]
output = json
aws_access_key_id=foo
aws_secret_access_key=hogehoge
region = ap-northeast-1

[profile bar]
output = json
aws_access_key_id=bar
aws_secret_access_key=fugafuga
region = ap-northeast-1
```

# config値を取得する


```pl:config_simple.pl
#!/usr/bin/env perl
use strict;
use warnings;
use Config::Simple;
use Data::Dumper;

my $file = $ENV{'HOME'} . '/.aws/config';
my $cfg = new Config::Simple($file) or die "cannot parse config";

# ブロックにアクセスする
print Dumper $cfg->param(-block => 'default');
print Dumper $cfg->param(-block => 'profile bar');
```

# 出力
```
$ ./use_config_any.pl
$VAR1 = {
          'region' => 'ap-northeast-1',
          'aws_secret_access_key' => 'hogehoge',
          'output' => 'json',
          'aws_access_key_id' => 'foo'
        };
$VAR1 = {
          'output' => 'json',
          'aws_access_key_id' => 'bar',
          'region' => 'ap-northeast-1',
          'aws_secret_access_key' => 'fugafuga'
        };
```

~/.aws/config内では複数アカウントを設定できますが、Config::Simpleの用語ではこれを「ブロック」と呼ぶみたいです。
R の NSE を駆使して pipeR ワールドを作る #rstatsj

R 界隈で NSE の話題が持ち上がっているようで。

- [NSEとは何か](http://qiita.com/kohske/items/7dbef6ae3ff34c093ce4)
- [NSE（Non-Standard Evaluation）について](http://d.hatena.ne.jp/dichika/20141028/p1)

このタイミングで、NSE を使って pipeR ワールドを作るという超どうでもいい話をします。

pipeR を知らないという方はこちらをご一読ください。

- [【超訳】pipeR の使い方](http://qiita.com/hoxo_m/items/b80778d46684b818abd2)

さて、pipeR でフツーにコードを書くと、こんなコードが出来上がりますね。

```r:R
library(pipeR)

cars %>>%
  (~ plot(dist ~ speed, data=.)) %>>%
  (lm(dist ~ speed, data=.)) %>>%
  abline(col="red")
```

pipeR の最大の弱点とは何でしょうか？ 
そう、それは~~可読せ~~ `%>>%` 演算子を書くのが面倒くさいということですね。

そこで、NSE を使って次のような関数を用意します。

```r:R
pipeR_world <- function(expr) {
  require(pipeR)
  expr <- substitute(expr)
  n <- length(expr)
  pipeExpr <- ""
  for(i in seq_len(n)) {
    e <- deparse(expr[i])
    if(length(e) == 1) {
      str <- substr(e, 1, nchar(e)-2)
      pipeExpr <- paste(pipeExpr, str)
      if(i != n) {
        pipeExpr <- paste(pipeExpr, "%>>%")
      }
    }
  }
  eval(parse(text=pipeExpr), envir = parent.frame())
}
```

この関数を使えば、先ほどのコードは次のように書くことができます。

```r:R
pipeR_world({

  cars
  (~ plot(dist ~ speed, data=.))
  (lm(dist ~ speed, data=.))
  abline(col="red")

})
```

なんと、パイプ `%>>%` を全く書かなくても済むようになりました！
`pipeR_world()` 関数によって、pipeR の世界が作られたのです。

この世界では、人々はパイプから解放されます。
pipeR には、本当はパイプなんて必要なかったんやー。

この世界でプログラミングすると、普通の R プログラミングと全く異なる次元の体験ができるのでお勧めです。
みなさんもぜひ pipeR_world の一員になりましょう！

enjoy!

### 追記

本家へ取り込まれました

- https://github.com/renkun-ken/pipeR#pipeline
LLVMエラー対処例

一般的に有名（？）な方法でLLVMエラーを駆逐できなかったけど、
とりあえず対処することができたので共有

## ビルド時のLLVMエラー対処（一般的）

* Product>Clean
* optionキーを押しながら Product>Clean Build Folder
* Window>Organizer>DerivedData削除
* Xcode再起動
* Mac本体ごと再起動
* 念じる

## DerivedDataフォルダを参照して直接削除

以下のパスに行って、そこにあるフォルダをすべて削除
これでLLVMエラーが解消されました

`~/Library/Developer/Xcode/DerivedData/`

## 参考URL

Fixing file 'project.pch' has been modified since the precompiled header was built error in Xcode - Stack Overflow
http://stackoverflow.com/questions/14793329/fixing-file-project-pch-has-been-modified-since-the-precompiled-header-was-bui
i386 CPU な Windows で boot2docker

# はじめに

Windows の boot2docker はオフィシャルからは amd64 しか提供されていませんが、i386 でも動作します。以下その手順を説明します。なお、VirtualBox は最新版が既にインストールされている物とします。また boot2docker コマンドを作るのに必要な golang もインストール済みとします。なお、起動した boot2docker に ssh したいなら putty 等も用意する必要があります。msysgit があるとさらに良いです。
amd64 なんだけど VirtualBox や msysgit をオールインワンインストーラで汚されたくないよ！って人にも使える手順だと思います。

# boot2docket-cli をビルド

まずは boot2docker コマンドを作ります。

```
git clone https://github.com/boot2docker/boot2docker-cli
```
git clone してフォルダに移動したら

```
go build
```

します。必要なパッケージが無い場合は `go get` しましょう。`go build ` で `boot2docker-cli.exe` というファイルが出来るので `boot2docker.exe` というファイル名にリネームしてパスが通った場所にコピーしておきます(`go build -o boot2docker.exe` でもOK。)

# boot2docker.iso をダウンロード

boot2docker.iso の最新イメージは以下のURLにあるのでダウンロードして `%USERPROFILE%\.boot2docker` というディレクトリ配下(作成します)に `boot2docker.iso` というファイル名で格納しておきます。

```
https://github.com/boot2docker/boot2docker/releases/tag/v1.3.0
```

iso のファイル名を変えたり細かく設定したい人は

```
boot2docker config
```

で出力される内容を `%USERPROFILE%\.boot2docker\profile` に保存し、そのファイルの内容を弄ると良いです。(参照: [boot2docker configuration](https://github.com/boot2docker/boot2docker-cli#configuration))

# 起動しよう

さて、起動の準備が出来たのでおもむろに初期化しましょう。

```
boot2docker init
```

これで VirtualBox に boot2docker-vm という VM が登録されます。以後この作業は必要ありません。続けざまに以下を実行します。

```
boot2docker up
```

これで VM が起動します。その他 boot2docker コマンドの使い方は[boot2docker-cli](https://github.com/boot2docker/boot2docker-cl) の README を参照下さい。

# ssh で入ろう

```
boot2docker ssh
```

でログイン出来ます。尚パスワードが無いとは言え初めてログインするので「おじゃまします」と言っておいた方が無難です。

```
docker@boot2docker:~$ docker run -i -t ubuntu /bin/cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.1 LTS"
docker@boot2docker:~$
```

「えっ ubuntu なんて入ってないよ！」と言われますが数十秒後には ubuntu がダウンロードされ bash が起動します。便利ですね。
ちなみに boot2docker の ssh コマンドは引数が VM に渡るので例え Windows から

```
C:\>boot2docker ssh docker run -i -t ubuntu /bin/cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.1 LTS"
```

みたいな事も出来ます。

# 最後に

boot2docker の Windows installer がやってるのは msysgit や VirtualBox のインストール、そして boot2docker のダウンロードになります。オフィシャルでは amd64 しかサポートしていませんが、i386 でも動く事が分かりました。

ぜひ皆さんはこのようなメンドクサイことをせずに 64bit Windows で試して下さい。
CakePHP3でエンティティクラスを任意のクラスにする


予約語と被ってしまった場合など。

listsというテーブルがありモデルをbakeした。

```php
<?php
namespace App\Model\Table;

use Cake\ORM\Query;
use Cake\ORM\Table;
use Cake\Validation\Validator;

/**
 * Lists Model
 */
class ListsTable extends Table {

/**
 * Initialize method
 *
 * @param array $config The configuration for the Table.
 * @return void
 */
	public function initialize(array $config) {
		$this->table('lists');
		$this->displayField('name');
		$this->primaryKey('id');

		$this->hasMany('Tasks', [
			'foreignKey' => 'list_id',
		]);
	}

/**
 * Default validation rules.
 *
 * @param \Cake\Validation\Validator $validator
 * @return \Cake\Validation\Validator
 */
	public function validationDefault(Validator $validator) {
		$validator
			->add('id', 'valid', ['rule' => 'numeric'])
			->allowEmpty('id', 'create')
			->allowEmpty('name')
			->add('created_at', 'valid', ['rule' => 'datetime'])
			->validatePresence('created_at', 'create')
			->notEmpty('created_at')
			->add('updated_at', 'valid', ['rule' => 'datetime'])
			->validatePresence('updated_at', 'create')
			->notEmpty('updated_at');

		return $validator;
	}

}

```


問題はエンティティクラス

```php
<?php
namespace App\Model\Entity;

use Cake\ORM\Entity;

/**
 * List Entity.
 */
class List extends Entity {

/**
 * Fields that can be mass assigned using newEntity() or patchEntity().
 *
 * @var array
 */
	protected $_accessible = [
		'name' => true,
		'created_at' => true,
		'updated_at' => true,
		'tasks' => true,
	];

}

```

ListだとどうにもならないのでListObjectと改名する。

```php
<?php
namespace App\Model\Entity;

use Cake\ORM\Entity;

/**
 * ListObject Entity.
 */
class ListObject extends Entity {

/**
 * Fields that can be mass assigned using newEntity() or patchEntity().
 *
 * @var array
 */
	protected $_accessible = [
		'name' => true,
		'created_at' => true,
		'updated_at' => true,
		'tasks' => true,
	];

}
```

ListTableクラスが使うエンティティを切り替える。

http://book.cakephp.org/3.0/en/orm/table-objects.html#customizing-the-entity-class-a-table-uses

具体的にはinitilizeに1行追加する。

```php
	public function initialize(array $config) {
		$this->table('lists');
		$this->displayField('name');
		$this->primaryKey('id');

		$this->hasMany('Tasks', [
			'foreignKey' => 'list_id',
		]);

        $this->entityClass('App\Model\Entity\ListObject');
	}
```
HTML5のscript読み込みでハマった

#問題の概要

* jQueryでDOMを操作するプログラムを書いていたが、jQueryが全く効かない状況になった。
* 外部スクリプトファイルの読み込みが効かなくなった。
* 筆者はHTML4.0, XHTMLを趣味程度で触っていた。

#問題点と原因(1)

* XHTMLでは、どのタグにも終了タグをつけなければならない点を筆者は記憶していた。
* `<br></br>`を`<br />`と書くことができるのと同様に、`<script src="hoge.js"></script>`を`<script src="hoge.js" />`とすることができると思い込んでいた。
* `<br>`は空要素タグであるが、`<script>`は空要素タグでないのが、挙動に差が出た原因だった。
* なお、終了タグを必ずつけなければならないのはXHTML独自の文法であり、HTMLは空要素タグには終了タグをつけてはいけないことになっている。

以下のウェブページが参考になった。
[scriptタグを<script src="～" />って書くと、なんで上手くいかないかまとめてみたAdd Starkisato_mii
](http://d.hatena.ne.jp/kasei_san/20090616/p1)

#問題点と原因(2) jQueryとAngularJSの同時読み込み

##ざっとした流れ

* 上記の修正だけでは、期待するDOMの操作を行えなかった。
* jQueryとAngularJSが共存していたのがよくなかったようである。
* AngularJSの読み込みを停止することでDOM操作を行えるようになった。

##具体例

jQueryとAngularJSの両方を読み込んでいるとドキュメントに**Hellow World!が表示されない。**
jQueryが動作していないようである。

```html:index.html
<html ng-app="formApp">
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<script>
$(function(){
  $("#test").html("Hello World!")
});
</script>
<head>
<body>
<div id="test"></div>
</body>
</html>
```

AngularJSの読み込みを停止すると、ドキュメントにHello World!が表示される。
jQueryを読み込むことができていることがわかる。

```html:index.html
<html ng-app="formApp">
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<!--<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>-->
<script>
$(function(){
  $("#test").html("Hello World!")
});
</script>
<head>
<body>
<div id="test"></div>
</body>
</html>
```

## 筆者のメモ

* AngularJSは筆者の管理外で追加されたものだった（筆者はAngularJSに関しては未習熟である）。
* jQueryとAngularJSの相性に関しては、AngularJSを習熟した上で検討したい。
ミニバードでPHP5.4,PHP5.5を利用する


## 追記

<ins>2014年12月16日より、<a href="http://www.minibird.jp/news_detail.php?view_id=1070">PHP5.4,PHP5.5に正式対応</a>されました。</ins>

以下の記事はそれ以前のミニバードにおいてPHP5.4,PHP5.5を利用するための、一種の裏ワザです。

---

## 注意

この方法は将来的に利用できなくなる可能性があります。
利用する場合は自己責任でお願いします。

## ミニバードとは

[格安・大容量レンタルサーバー 名前はミニでも、ビッグなミニバード](http://www.minibird.jp)

* 月額250円(税抜)で50GBの大容量(金額は6ヶ月以上の契約の場合)
* .htaccessが使える
* Perl,PHP,Ruby,Pythonが利用可能
* 独自ドメイン及びサブドメインが利用可能(独自ドメインの契約そのものはしていない。[スタードメイン](http://www.star-domain.jp)で契約可)
* データベースとしてMySQLが利用可能
* 回線速度が早い

以上の特徴を持つレンタルサーバです。

料金に対して使用可能な容量が多いため現在愛用していますが、
ミニバードが公式に対応しているPHPのバージョンは5.1.6と5.3.3であり、
既にサポートの終了したバージョンを未だに採用していることになります。

この件について問い合わせた所、

> PHP5.3についての脆弱性につきましては
> RedHatなどが提供の修正パッチプログラムを適用したりと
> 随時対応しておりますのでご安心ください。

とのことです。

## ミニバードのPHPバージョン設定

ミニバードには、サーバー管理ツールからPHPの使用バージョンを設定できるPHPバージョン設定という機能が存在します。
これでドメインごとに利用するPHPのバージョンを指定できます。

PHP5.3.3を設定すると、ルートフォルダの.htaccessファイルに以下が追記され、これでバージョンを切り替えているようです。

```text
#####phpversion#####
AddHandler x-httpd-php5.3 .php .phps
#####end:phpversion#####
```

なお、PHP5.1.6の場合は上記の記述が削除されます。

## 本題

上記の.htaccessファイルの記述を以下のように改変すると、それぞれバージョンが切り替わります。

```text:PHP&nbsp;5.4.26
AddHandler x-httpd-php5.4 .php .phps
```

```text:PHP&nbsp;5.5.10
AddHandler x-httpd-php5.5 .php .phps
```

これについてミニバードに問い合わせた所、

> PHP5.5や5.4についてはお客様のご指摘の通り
> [.htaccess]の記述を変更していただくことでご利用可能です。
>
> 公式的な案内はいたしておらず、
> 将来的に利用ができなくなる可能性もございますことについては
> ご理解の上でご利用いただければと存じます。

とのことで、
冒頭にも書きましたが利用時は自己責任でお願いします。
yumのデバッグ出力な奴


最近のyumレポジトリとかSSLのとこが多いのでProxyのログ見てもわからん。
ということで、

    # URLGRABBER_DEBUG=1,debug.log yum list

を使うと、debug.logファイルにデバッグログが出力される。


	2014-10-28 17:17:12,860 attempt 1/None: file:///etc/yum.repos.d/epel.repo
	2014-10-28 17:17:12,861 success
	2014-10-28 17:17:12,862 combined options: {
	  'delegate'     : {
	    'bandwidth'    : 0,
	    'cache_openers': True,
	    'checkfunc'    : None,
	    'close_connection': 0,
	    'copy_local'   : 0,
	    'data'         : None,
	    'delegate'     : None,
	    'failure_callback': None,
	    'ftp_headers'  : None,
	    'http_headers' : None,
	    'interrupt_callback': None,
	    'keepalive'    : 1,
	    'max_header_size': 2097152,
	    'opener'       : None,
	    'prefix'       : None,
	    'progress_obj' : None,
	    'proxies'      : None,
	    'quote'        : None,
	    'range'        : None,
	    'reget'        : None,
	    'retry'        : None,
	    'retrycodes'   : [-1, 2, 4, 5, 6, 7],
	    'size'         : None,
	    'ssl_ca_cert'  : None,
	    'ssl_cert'     : None,
	    'ssl_cert_type': 'PEM',
	    'ssl_context'  : None,
	    'ssl_key'      : None,
	    'ssl_key_pass' : None,
	    'ssl_key_type' : 'PEM',
	    'ssl_verify_host': True,
	    'ssl_verify_peer': True,
	    'text'         : None,
	    'throttle'     : 1.0,
	    'timeout'      : 300,
	    'urlparser'    : <urlgrabber.grabber.URLParser instance at 0x7fc1871f74d0>,
	    'user_agent'   : 'urlgrabber/3.9.1 yum/3.2.29',
	    }
	  }
	2014-10-28 17:17:12,863 attempt 1/None: file:///etc/yum.repos.d/sensu.repo
	2014-10-28 17:17:12,863 success
	
便利。
[JavaScript] aタグにonClickをつける方法

# これだけ

```html
<a href="#" onclick="alert('done!');return false;">GoGo!</a>
```

でもこれめんどくさいから、aタグを覆ってるdivにonclickつけた方が簡単。

あとまぁ、onClickってどうなのって話もあるけど。。。
Amazon Linuxにmysql2を入れようとしたらエラーがでる

急いでいる人のために、先に解決方法を書いておくと
```$ sudo yum install mysql-devel```
をしてから
```$ gem install mysql2```
をすれば良い。

* * *


EC2でAmazon Linuxを借りて、
```gem install mysql2```
をしたら、以下の様に怒られたので対処法を書いておく。

```
Building native extensions.  This could take a while...
ERROR:  Error installing mysql2:
	ERROR: Failed to build gem native extension.

    /home/ec2-user/.rbenv/versions/2.1.2/bin/ruby extconf.rb
checking for ruby/thread.h... yes
checking for rb_thread_call_without_gvl() in ruby/thread.h... yes
checking for rb_thread_blocking_region()... yes
checking for rb_wait_for_single_fd()... yes
checking for rb_hash_dup()... yes
checking for rb_intern3()... yes
-----
Using mysql_config at /usr/bin/mysql_config
-----
checking for mysql.h... no
checking for mysql/mysql.h... no
-----
mysql.h is missing.  please check your installation of mysql and try again.
-----
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/home/ec2-user/.rbenv/versions/2.1.2/bin/ruby
	--with-mysql-dir
	--without-mysql-dir
	--with-mysql-include
	--without-mysql-include=${mysql-dir}/include
	--with-mysql-lib
	--without-mysql-lib=${mysql-dir}/lib
	--with-mysql-config
	--without-mysql-config

extconf failed, exit code 1

Gem files will remain installed in /home/ec2-user/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/mysql2-0.3.16 for inspection.
Results logged to /home/ec2-user/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/extensions/x86_64-linux/2.1.0-static/mysql2-0.3.16/gem_make.out
```
原因は`mysql.h `がないことらしいので、
```$ sudo yum install mysql-devel```
とすれば良かった。  

その後に、もう一度
```$ gem install mysql2```
をすれば成功する。
各ページのユーザー認証設定


複数のUserがいて、Roleによってはページにアクセス制限をかけたいときがあります。
やり方はいろいろありますが、今回は特定のページにアクセス制限を掛ける方法です。

### パーミッションのプログラムを書く。

例えば sampleモジュールを作った場合、まずhook_menu()を設置します。

```php
function sample_menu(){
  $items['admin/sample/'] = array(
    'title'            => t('sample page'),
    'page callback'    => 'drupal_get_form',
    'access callback'  => array('アクセスコールバック名'),
    'access arguments' => array('アクセス権名')  
  );
}
```

「アクセスコールバック名」の箇所に、認証処理のコールバックメソッド名を記述します。
「アクセス権名」の箇所にも名前を付けます。ここには既に使っている名前や、独自に定義することができます。

例えば、全てのユーザーがアクセスできる名前は

```php
'access arguments' => array('access content')  
```

adminのみは

```php
'access arguments' => array('administer users') // 
```

です。

次に
アクセスコールバック関数を実装します。

```php
function sample_user_access(){
    foreach( func_get_args() as $permission){
        if(!user_access($permission)){
            return false;
        }
    }
    return true;
}
```

あわせて、hook_permission()も実装します。

```php
function sample_permission(){
    return array(
        'access argumentを入れてください' => array(
            'title' => t('管理画面のpermissionで表示されるテキストです。任意のテキストをいれてください'), 
        )
    );
}
```

これで、コードは完成です。以下のような形になると思います。


```php
function sample_menu(){
  $items['admin/sample/'] = array(
    'title'            => t('sample page'),
    'page callback'    => 'drupal_get_form',
    'access callback'  => array('sample_user_access'),
    'access arguments' => array('access sample page')  
  );
}

function sample_user_access(){
    foreach( func_get_args() as $permission){
        if(!user_access($permission)){
            return false;
        }
    }
    return true;
}

function sample_permission(){
    return array(
        'access sample page' => array(
            'title' => t('Use the administration sample page.'), 
        )
    );
}
```


### 管理画面で、パーミッション設定。

管理画面の「/admin/people/permissions/」に移動します。
大見出しでSampleができています。指定した文言が表示され、チェックボックスがあります。
あとは、指定のRoleにチェックを入れるだけで完了です
複数値のI/Oを非同期処理して待機する

ネイティブ非同期APIが用意されていないI/O処理を非同期処理して待機したい。
やり方、これで合ってるのかなぁ……？

単一値の場合は `Task` で包んで「はいどーぞ」なのだけど、複数値となるとこれは `IObservable<T>` の出番？
提供されているのは `IEnumerable<T>` を返すメソッドとする。

```csharp:同期バージョン
public void DoSomething()
{
    // Workspace.GetPendingChangesEnumerable は各要素を取得するのに時間がかかるため同期処理すると画面がフリーズする
    IEnumerable<PendingChange> pendingChanges = workspace.GetPendingChangesEnumerable();
    
    foreach (var pendingChange in pendingChanges)
    {
        _files.Add(pendingChanges);
    }
    
    // なんか取得後に処理したいことがあるとする（ここではフィールドの書き換え）
    _completed = true;
}
```

これを処理するために `ToObservable` で非同期シーケンスにして、`await` で待機する。

```csharp:拡張メソッドを用意する
public static class WorkspaceExtensions
{
    public static IObservable<PendingChange> GetPendingChangesObservable(this Workspace workspace)
    {
        return workspace.GetPendingChangesEnumerable().ToObservable(Scheduler.Default);
    }
}

```

```csharp:非同期バージョン
public async Task DoSomething()
{
    // IObservable<T> にすれば各要素を非同期に取得できる
    // ※ Task<IEnumerable<T>> とは根本的に違う点に注意
    IObservable<PendingChange> pendingChanges = workspace.GetPendingChangesObservable();
    
    // IObservable<T> は awaitable （ToTask して await するのと同じ。Last が待機される）
    // await によって購読が始まるため Do メソッドでよい
    await pendingChanges.Do(pendingChange =>
    {
        _files.Add(pendingChanges);

    // 空の場合を考慮して DefaultIfEmpty しないと例外になる（await は Last を取るため）
    }).DefaultIfEmpty();
    
    // 全要素の処理が完了後にここが呼ばれる
    _completed = true;
}
```

呼び出し元を考えなければ `Subscribe` の `onCompleted` で処理すればいいんだけど、呼び出し元には `Task` で返したかったのでこうなりました。

うーん、不安……
EC2からS3をマウントする

# はじめに
ここではEC2からS3をマウントする手順を紹介します。
が、、これは本来のオブジェクトストレージの使い方とはずれた使い方なのであんまりおすすめしません。

# 設定手順

1.download
> wget https://code.google.com/p/s3fs/downloads/list

2.足りないものをインストールする(READMEに書いてあります）
<pre>
gcc
libstdc++-devel
gcc-c++
fuse
fuse-devel
curl-devel
libxml2-devel
openssl-devel
</pre>
3. configure,make,make install
4. s3fs --helpでヘルプが出てくることを確認する。
5. s3fsはroot以外では利用できないので他のユーザで利用できるように変更する。
<pre>
sudo vi /etc/fuse.conf
user_allow_otherのコメントアウトを解除する。
</pre>
6. ManagementConsole - ユーザ名 - SecurityConfidentialsを開く
7. AccessKeys - [Create new Access Keys]でAccessKeyとSecretAccessKeyを控えておく。
8. /etc/passwd-s3fsに下記の形式で記載し、Permissionを640へ。
<pre>
AccessKey:SecretAccessKey
</pre>
9. マウントする
<pre>
sudo /usr/local/bin/s3fs [backet name] /var/www/html -o allow_other
</pre>
10. 確認する。
<pre>
[ec2-user@ip-172-31-11-90 html]$ ls -lrt /var/www/html
total 1
d--------- 1 root root  0 Jan  1  1970 test
---------- 1 root root 14 Oct 28 01:03 error.html
---------- 1 root root 10 Oct 28 01:53 hoge.html
</pre>

---

# 気になる点/追加確認点
1. curlでアクセスしてるだけでプロトコル的にはhttp。同一リージョン/AZであっても速くはない。
2. 自動マウント設定
Treasure Agent(td-agent)の1と2の今後


Treasure Dataが提供しているFluentdの配布パッケージであるtd-agentの今後について書く．この記事は

- http://docs.fluentd.org/articles/td-agent-v1-vs-v2
- http://docs.treasure-data.com/articles/td-agent2

とかMLでのアナウンスを日本語でまとめたような感じの記事です．

現在は1と2の二つのバージョンが並行してリリースされているので，まずそれぞれの違いについて書きます．

## td-agent 1

今までのメインバージョンであり，現在はold stable．同梱ライブラリの大きなバージョンアップはありません．最新版の1.1.21では以下のものが同梱されています

- Ruby 1.9.3
- jemallocやmsgpackなど，コアライブラリ群
- Fluentdとよく使われるプラグイン群

サポート環境は以下．これらが増えることはないです

- CentOS 5, 6
- Ubuntu 10.04, 12.04

td-agent 1の懸念点は，同梱しているRuby 1.9.3が[2015年2月にサポートが終了した](https://www.ruby-lang.org/ja/news/2014/01/10/ruby-1-9-3-will-end-on-2015/)ところです．もちろんこれ以降もtd-agent 1のリリースは続きますが，クリティカルなバグが1.9.3に見つかった場合の対応は，その時のコミュニティの判断によります．現状td-agent 1でそのような事例は聞いたことがないので，可能性は低いとは思っていますが…

## td-agent 2

現在リリースされているstable版．同梱されているコアライブラリがアップデートされることもあります．最新版の2.1.2では以下のものが同梱されています

- Ruby 2.1.3
- jemallocやmsgpackなど，コアライブラリ群の最新版
- Fluentdとよく使われるプラグイン群の最新版
- Fluentd UI

サポート環境は以下．今後も要望によって増える可能性があります

- CentOS 5, 6, 7
- Ubuntu 10.04, 12.04, 14.04 (14.04は64bitのみ)
- Debian 6.0.10, 7.5 (どちらも64bitのみ．Treasure Dataで検証はしていない)
- Mac OS X 10.9.x or later

Rubyのバージョンが上がっているので，プラグインの再インストールが必要です．が，必要な人は独自にパッケージをビルドしているし，Chefなどのツールを使っていればこの辺は勝手にやってくれるので，今まで大きな問題を聞いたことはありません．

### td-agent 1からの更新

td-agent 2の問題点として，パッケージスクリプトやインストール先をガラッと変えたので，td-agent 1からそのままアップデート出来ないという点があります．もしtd-agent 1から更新する時には，unisntall -> installという手順が必要です．他の有名なパッケージ群に倣ってメジャーバージョン毎にURLを分けているので，リポジトリのパスも修正が必要です．

#### rpm

`baseurl`: `http://packages.treasuredata.com/2/redhat/$releasever/$basearch`

#### deb

apt-line:

- trusty: `deb [arch=amd64] http://packages.treasuredata.com/2/ubuntu/trusty/ trusty contrib`
- precise: `deb http://packages.treasuredata.com/2/ubuntu/precise/ precise contrib`
- lucid: `deb http://packages.treasuredata.com/2/ubuntu/lucid/ lucid contrib`

それぞれのパッケージマネージャがキャッシュを持っている場合には，installの前にキャッシュを削除して，リポジトリ情報を更新してください．

### td-agent 1との運用上の違い

- インストール先が`/opt/td-agent`に統一された
- v1の設定がデフォルトで利用される．`include`周りなどで警告が出る可能性がある
  - http://docs.fluentd.org/articles/config-file#v1-format を参照してください
- gemのインストールは`/usr/sbin/td-agent-gem`コマンドを使う(rvmがGEM関係のパスを書き換える問題を回避)

2.1.1からはtd-agent 1と設定ファイルの互換性が保たれるようになったので，よほど怪しい設定ファイルを書いてない限りは，既存の設定ファイルを使い回せるはずです．

## どちらを使うべきか

Rubyやコアライブラリのバージョンアップによりパフォーマンスの改善が見込めるtd-agent 2を，新しい環境ではオススメします．実際td-agent 1だとRuby本体の問題で上手く行かなかったがtd-agent 2で解決した，というユーザもいます．td-agent 1は最新のOS向けのパッケージを提供する予定はないので，今後はtd-agent 2への移行が進むでしょう．

Fluentdの公式ドキュメントでは，すでにインストール対象がtd-agent 2になっているので，初めての方は意識しなくてもtd-agent 2になっています．

td-agent 2のパッケージングで問題があったら，[td-agent 2のリポジトリ](https://github.com/treasure-data/omnibus-td-agent)にissueを投げてもらえれば対処します．疑問などがあれば[@repeatedly](https://twitter.com/repeatedly)にでもmentionを飛ばすか，英語になりますが[FluentdのML](https://groups.google.com/forum/#!forum/fluentd)で聞いて貰えればと思います！
【onclick】GoogleAnalyticsメモ

# 【Google Analyticsメモ】
リンクをユーザーがクリックするとイベントとして計測する
onclick="_gaq.push(['_trackEvent', 'linkclick', 'click', 'qiita_link_menu']);"

## onclick
「このリンクがクリックされたら、後に続く処理を実行せよ」という意味のHTMLのイベント指定で、処理内用はJavaScriptで記述。

## _trackEvent
ブラウザでの行為がイベントとしてGoogleアナリティクスのサーバーに記録される。

## linkclick
名前は自由。トラッキングするオブジェクトのグループに付ける名前。
ad（広告）、movie（動画）など行為（action）に対する対象物を割り当てる。

## click
名前は自由。各カテゴリとペアになる固有の文字列。
イベントハンドラ（＝ブラウザ上で行われた動作や操作に対して、処理を実行させるための命令。今回の場合はonclick）に対応した名前を付けておくとよい。

## qiita_link_menu
名前は自由。イベントデータにディメンションを追加するための文字列。


参考：http://web-tan.forum.impressrd.jp/e/2013/08/22/15856
サブクラスごとに個別の値を持てる（クラス）変数

```objc
#import <objc/runtime.h>
@implementation Hoge
+ (void)setName:(NSString *)name
{
    objc_setAssociatedObject(self, "name", name, OBJC_ASSOCIATION_COPY);
}

+ (NSString *)name
{
    id name = objc_getAssociatedObject(self, "name");
    return [name copy];
}
@end
```

selfはクラスオブジェクトなのでクラスごとに違う値がもてます。
Office文書を読み取り専用で開くにはShift右クリック

共有ドライブ上のOffice文書をその場で開いてしまうと、閲覧したいだけなのに自分が編集者になってファイルをロックしてしまい、同僚に迷惑をかけかねないということがあります。
誰かが編集中だったら読み取り専用で開いてくれるからむしろ気が楽なんですが。

誰も掴んでいないファイルを最初から読み取り専用で開きたいですか？ そういうときは **Shift右クリック** することで隠しメニューを出します。
![shift-right.png](https://qiita-image-store.s3.amazonaws.com/0/2852/ae711842-9649-d5f0-7d2b-c1148af52f2b.png)
ほら出てきた。
JQuery id名でふり分けて処理

1)サイドメニューのlistタグ内をeachで回して処理
2)サイドメニューのlistタグのidを取得
3)取得したid名(文字列)が「undefined」の場合、return false; でブレイク
4)それ以外の場合、console.log('bbbb'); を返す
※typeof演算子について
・javascriptの演算子
・値には数値や文字列、オブジェクトなどの値を指定します。
・参考URL：http://www.ajaxtower.jp/js/ope/index15.html

```lang:JQuery
$(function(){

    /*======== 繰り返し処理 ========*/
    $('#sidr ul li').each(function(){
        /*#sidr ul li のid名を取得*/
        var menuName = $(this).attr('id');
        /*#取得したid名の型が「undefined」の時*/
        if(typeof menuName == 'undefined'){
            // return false;
            console.log('aaaa');
        }else {
            console.log('bbbb');
        }

    });
    /*======== //繰り返し処理 ========*/

});
```
64bitで起動しているかを調査する

## 64bitで起動しているかを調査する

起動時、コンパイル時での方法があります。
AppDelegateなどに記載すればよいかと。

```lang:Objective-C
    // 32bit or 64bit
    if (sizeof(void*) == 4) {
        NSLog(@"You're running in 32 bit");
    } else if (sizeof(void*) == 8) {
        NSLog(@"You're running in 64 bit");
    }
```
```lang:Objective-C
#if __LP64__
    NSLog(@"You're running in 64 bit");
#else
    NSLog(@"You're running in 32 bit");
#endif
```

## 参考URL
How to check if your app is running in 64bit | iOS Dev Diary
http://pinkstone.co.uk/how-to-check-if-your-app-is-running-in-64bit/
Webページ上の画像を守る不完全な方法

#はじめに
とある開発中の教育関係システムに対する「ページに載せている学生の顔写真をユーザが保存できないようにしたい」という要望に対応した時に使った方法を紹介。

HTMLに張られているIMGタグの画像に対して、以下の動作が出来なくなります。

* 右クリック
* ドラッグアンドドロップ

一般的なレベル（？）のユーザが画像の保存をできなければOKということで、要望元には納得して頂けました。


#ソース

```html:index.html
一部抜粋

  <img class="undraggable" src="./images/fig1.png" alt="undraggable image"  ondragstart="return false;"  oncontextmenu="return false;"/>

```

```css:hoge.css

/* 学生の顔写真を保存不可にする*/
.undraggable {
    /* For Opera and <= IE9, we need to add unselectable="on" attribute onto each element */
    /* Check this site for more details: http://help.dottoro.com/lhwdpnva.php */
    -moz-user-select: none; /* These user-select properties are inheritable, used to prevent text selection */
    -webkit-user-select: none;
    -ms-user-select: none; /* From IE10 only */
    user-select: none; /* Not valid CSS yet, as of July 2012 */

    -webkit-user-drag: none; /* Prevents dragging of images/divs etc */
    user-drag: none;
}
```


```js:hoge.js
window.onload = init;
 
function init() {

  var elements = document.getElementsByClassName("undraggable"); 
  
  for (var i = elements.length; i--; ) {
    disableDraggingFor(elements[i]);
  }  

}
 
function disableDraggingFor(element) {
  // this works for FireFox and WebKit in future according to  http://help.dottoro.com/lhqsqbtn.php
  element.draggable = false;
  // this works for older web layout engines
  element.onmousedown = function(event) {
    event.preventDefault();
    return false;
  };
}
```

#終わりに
上記のように設定したところで、ページ全体を保存したりスクリーンショットを撮ったりと、
画像を保存するやり方は色々あるので、”画像を保存できないようにしてるよ！”というポーズにしかなっていないのが悲しいですね。

電子書籍の分野では画像にユーザを特定可能な"すかし"をいれたり、スクリーンショットのキーを押された時に画像を閉じるようにしたりしているそうです。

#参考
[How to disable dragging of images and text selection in web pages](http://developer.nokia.com/community/wiki/How_to_disable_dragging_of_images_and_text_selection_in_web_pages)
[電子透かし wiki](http://ja.wikipedia.org/wiki/%E9%9B%BB%E5%AD%90%E9%80%8F%E3%81%8B%E3%81%97)
[draggable attribute](http://help.dottoro.com/lhqsqbtn.php)
[Rails 4.x] Simple_form で、複数モデルを使って、複数のテーブルに複数のレコードを挿入する方法

# 前置き

備忘録的なメモです。ミスもあるかと思います。
また、小汚いコードになってしまった上に、あんまりきれいなやり方には思えないので、別の方法があったらそちらを優先した方がいいと思います。



# 概要

friendフォームから、friend_controller.rbを伝って、FriendsテーブルとFriendMemosテーブルにデータを入れたい。
friendフォームでは、友達の基本情報と友達の紹介や説明などの情報を入力してもらう。

（1つのフォームでいっぺんにデータをやりとりするより、複数に分けた方が、ユーザーからしても、システム的にも好ましいんじゃないかとも思うが、とりあえず。）


# form

```erb:form
<%= simple_form_for([@user,@friend] :url => user_friend_path,:html => {:id => 'user_form', :multiport => true}) do |f| %>
  <%= f.error_notification %>
　・
　・
  <!-- jsかなんかで以下のフォームの表示非表示制御などを入れた方がいい -->
  <% @friends_memos.each do |fms| %>
    <div class="friend-memos-form">
      <%= simple_fields_for "friend_memos[]", fms do |fm|  %>
        <%= fm.association :certainty, required: false, input_html: { class: "form-control" }, label: "hoge" %>
        <%= fm.input :kind, collection: [['好きなもの','likes'],['好きな映画','movie']・・・・]]required: false, input_html: { class: "form-control" }, label: "fuga" %>
        <%= fm.input :memo %>
      <% end %>
    </div>
  <% end %>
　・
　・
<% end %>

```

# controller

```controller
def new
  @friend = Friend.new
  @friend_memos = Array.new(5) { @friend.friend_memos.build }
end

def create
  @friend = Friend.create(friend_params)
  for f in params[:friend]
    # 書き込みがなかった場合にはどうするかなどの制御を入れて
      @friend_memos = FriendMemos.create(
                                friend_id: @friend.id,
                                certainty: f["certainty"],
                                progress: f["progress"],
                                memo: f["memo"]
                                )
  end

  private
  def friend_params
    params.require(:friend).permit(・・・・)
  end
  def friend_memos_params
    params.require(:friend_memos).permit(・・・・)
  end
end


```

# 参考

http://stackoverflow.com/questions/15991243/simple-form-label-to-be-column-value
http://stackoverflow.com/questions/4383391/rails-3-edit-multiple-records-in-a-single-form
http://npb.somewhatgood.com/blog/archives/901
最速F5アタック研究会

===

本研究は並行・並列処理の学びを第一の目的とし、
一定時間内にできるだけ大量のHTTPリクエストを送る方法を模索するものです。

並行・並列処理についてはひよっこなので、上級者の方々から見れば「なにアホなことやってんの？」と思われる可能性があります。(いい方法を教えて下さい！)

# ゆるいルール

- プロトコルはHTTPとする。
- 任意のホスト・パスに任意のリクエストを送ることができる。
  - POST -> GET -> PUTなど
- あくまで目的は学びであり、インターネット社会を攻撃してはならない。

## more

- 速いほうがなお良い
- リクエスト順は保証されている方がなお良い
- 言語的な特性よりも、アルゴリズム的な特性に注目したい
- 標準ライブラリーのみで実装するとなお良い
- 言語・ライブラリ等はできるだけ最新のものを使用する

# 実装

CRubyで実装してみました。全コードはこちら。

https://github.com/ksss/net-http-multi

## 検証用server

検証用のサーバーは約10msでレスポンスを返す想定とする。

```ruby
require 'sinatra'
post '/' do
  sleep 0.01
  'CREATED'
end
```

## Sync

単純にループさせる方法。

実装は簡単だが、この実装だとTCPSocketについて、writeした後readできるようになるまでじっとCPUは待ち続ける。

よって、どんなにがんばっても検証用サーバーの処理時間0.01sの場合、1秒間に100回しかリクエストを飛ばせない。

## Thread

CRubyのThreadはVMにGILがかかっているためCPU的な並列動作は難しい(やり方を知らない)。
だが、IO的な並行動作はOSに任せることができる。

よって、socketがreadで待っている間も他のThreadを動作させることができるので、高速化が期待できる。

そこで、共通のQueueを用意していくつかのThreadで手の空いたものから次々に処理していく実装にしてみた。

## Select

同時に多数のTCPSocketを繋げ、read可能になったsocketから順に処理していくことにより、read時間の無駄を減らすことによって高速化を期待する実装。
IO.selectを用いて、シングルスレッド・多重IOな擬似イベント駆動処理としている。

CRuby標準のNet::HTTPライブラリーではwrite/readを分けて実行できるようにはなっていないので、既存クラスを拡張・privateメソッドの呼び出しなど大分無理をしている。

## Epoll

select(2)と似ているが、より大量のファイルディスクリプタ監視に向いたAPI。

epollでの性能が知りたかったので、gem [io-epoll](https://rubygems.org/gems/io-epoll)を自作。

Selectのほぼ置き換えとして、ループ毎にepoll_wait(2)を呼び読み込み可能になったものから読み込んで直後書き込みを行うようにした。

# 検証

```
$ ruby --version
ruby 2.2.0preview1 (2014-09-17 trunk 47616) [x86_64-darwin13]
$ uname -a
Darwin ***.local 13.4.0 Darwin Kernel Version 13.4.0: Sun Aug 17 19:50:11 PDT 2014; root:xnu-2422.115.4~1/RELEASE_X86_64 x86_64
```

検証用サーバーに対して一秒間に何リクエスト帰ってきたかを計測。

[検証用スクリプト](https://github.com/ksss/net-http-multi/blob/master/benchmark.rb)

## serverの処理時間(sleep時間) = 0.01sの場合

req/sec: 1秒間にリクエストを送った数
res/sec: 1秒間にレスポンスを受けた数

```
Sync 63req/sec
Sync 63res/sec

Thread 333req/sec
Thread 317res/sec

Select 437req/sec
Select 309res/sec

Epoll 447req/sec
Epoll 319res/sec
```

## serverの処理時間 = 0.3sの場合

```
Sync 4req/sec
Sync 3res/sec

Thread 64req/sec
Thread 48res/sec

Select 319req/sec
Select 191res/sec

Epoll 345req/sec
Epoll 217res/sec
```

計測の結果、多重I/Oを用いた実装(Select)とepoll APIを用いた実装(Epoll)が優秀という結果となった。

2つは均衡しているが、同時に監視するファイルディスクリプタの数によって差が出てくる可能性はある。

# 考察

Threadの弱点は送信順が不確定なことなのでなんとか克服したいが、より実行速度が遅くなるものと思われる。
Thread数をIOの多重数に同じにすることでそこそこのパフォーマンスを発揮するが、それでもI/O多重化以上になることはなかった。(Thread 64個とかどうよ……。)

Selectでは俗に言われるI/O多重化は速いという現象が確認できた。
I/O多重化で問題なのは同時に開くSocketの数で、あまり多く開き過ぎると極端に動作が遅くなるかOSから`Errno::ETIMEDOUT`が発生するため、同時に開くSocket数を制限する必要がある。
この制限値は実行環境に依存するものと思われる。
IO多重化は線形走査な実装なのでまだまだ早くなる余地がある。

またEpollではSelectと同等かそれ以上の性能を期待できることがわかった。


# 今後の課題

- [ ] 並行・並列処理の学び
- [ ] 多重プロセス法の実装
- [x] epollの利用(eventmachine or 自作)
- [ ] hping砲とは？
- [ ] golangで書いてみる
- **速さが足りないッ！！**
- もっと速い方法をお待ちしております
Rubyでコマンドの存在をチェックする

参考 : [Bash - コマンドの存在チェックはwhichよりhashの方が良いかも→いやtypeが最強 - Qiita](http://qiita.com/kawaz/items/1b61ee2dd4d1acc7cc94)

なるほどう。

# TL;DR

```ruby
def exists?(command)
  !`type #{command}`.empty?
end
```

ユーザ入力を直接渡すとかしないように。

# 検証

```irb
[1] pry(main)> `type wget`
=> "wget is /usr/local/bin/wget\n"
[2] pry(main)> `type hoge`
/usr/bin/type: line 4: type: hoge: not found
=> ""
[3] pry(main)> `type wget`.empty?
=> false
[4] pry(main)> `type hoge`.empty?
/usr/bin/type: line 4: type: hoge: not found
=> true
```
[Rails 4.x] FormのSelect プルダウンメニューの項目をDBから引っ張ってくる方法

# 前置き

select_tagによる決め打ちの選択肢でなく、DBのテーブルから項目を引っ張ってきます。

# 例

```rb
User
|id  |name     |origin |
|   1|やまだ    |1      |
|   2|かわだ    |2      |
|   3|やまだ    |3      |

belongs_to origin
```

```rb
Origin
|id  |name   |
|   1|水星    |
|   2|金星    |
|   3|地球    |

has_many users
```

# collection_selectを使う

```erb
<%= form_for @user do |f| %>
  <%= f.label :origin_id %>
  <%= f.collection_select :origin_id, Origin.all, :id, :name %>
<% end %>
```

## collection_selectの文法

```rb
<%= f.collection_select <属性名>, <プルダウンメニュー表示用の配列データ>, <valueとして扱うカラム名>,  <表示用のカラム名>, <オプション> %>
```

# selectを使う

```rb
<%= f.select :origin_id, Origin.all.map{|o| [o.name, o.id]} %>
```

# オプション
## :include_blank

- プルダウンメニューの先頭に空白行を追加する。空白行の value は空文字列が指定されます
- include_blank オプションの値を true/false ではなく文字列にすると、その文字列が使用されます。

```erb
<%= f.collection_select :origin_id, Origin.all, :id, :name, :include_blank => true %>
```


## :prompt

- prompt オプションを使うと、プルダウンメニューが選択されていない時（＝初期値が設定されなかったとき）に「選択して下さい」といった文字列の行が先頭に追加される。

```erb
<%= f.collection_select
      :prefecture_id, Prefecture.all, :id, :name,
      :prompt => true %>
```

- 表示される文字列は I18n を使っている場合、ロケ―ルファイルで指定された文字列が使用されます。

```yaml
ja:
  helpers:
    select:
      prompt: "なんにも入力されていません。"
```

- promptオプションの値を true/false ではなく文字列にすると、それがプロンプトとして使用されます。


```erb
<%= f.collection_select
      :origin_id, Origin.all, :id, :name,
      :prompt => "なんか選んでよ" %>
```

## 補足：既存の値を設定する場合

- コントローラーのnewメソッド内で指定します。

```rb
classUserController < ApplicationController
  def new
    @user = User.new(:origin_id => 1)
  end
end
```