OmniAICreator/Qiita-1.07M huggingface dataset:
巨大なデータを扱う場合のRedisの運用戦略

# はじめに

Read/Writeともに高速で，様々なデータの持ち方が可能なことでキャッシュDBとして人気のあるRedisですが，何も考えずに実運用システムで使用しているとデータが肥大化してしまい非常に扱いにくくなることがあります．
今回は，データの肥大化とともに顕在化する問題と，データの肥大化に対する戦略についてまとめたいと思います．

# データの肥大化時に顕在化する問題

## 何のキーが入っているか分からなくなる
Redisはオンメモリ型のKVSであるため，データがある程度増えてくるとサーバのメモリ容量を圧迫し始めます．
このような状態で，プロダクション環境に対して <i>keys *</i> などをやってしまうと，一時的にメモリ使用量が跳ね上がり，メモリ使用量を抑えるためにRedisがキーを削除したり，OOM KILLERにRedis Serverごと殺されてしまう可能性があるため，そういったコマンドはうてなくなってしまいます．
つまり，Redisの中に何のキーが入っているか確認できなくなり，謎のデータが増えていくことになります．

## 気軽にslaveノードを追加できなくなる
データ量が少ない状態においては，slaveノードを追加することはコマンド一発で簡単に行うことができます．
しかし，データ量が多くなると突然非常に神経を使う必要が出てきます．
Redisは，slaveノードを追加するときに，master側で一度DB内のデータをファイルとして保存し，それをslaveに送信して読み込むような流れになっています．このときに，master側でメモリが足りないと，ファイルとして保存する処理がメモリ不足で失敗してしまい，slaveノードの追加ができなくなってしまうことがあります．


# データの肥大化に対する戦略

## maxmemoryを余裕を持って設定する

redisではredis.conf内でmaxmemory（redisが使用する最大のメモリ量）を設定することができます．設定したメモリを超えた場合には，redis側がキーの削除戦略（allkey-lruなど）に従って自動で削除していきます．
大体maxmemoryの設定は，サーバの使用可能なメモリの半分程度が望ましいです（=必要なメモリの２倍程度のメモリをサーバに積むのがよい）．

## vm.overcommit_memoryを設定する

ある程度使用メモリが大きくなるとBGSAVEがメモリ不足で失敗したり，最悪の場合OOM KILLERによってRedisのプロセスを殺される可能性があります．対処方法としては，overcommit_memory = 1を設定してスワップ可能にしておきます．

設定には，以下のコマンドを実行してください．

```
# sysctl vm.overcommit_memory=1
```

/etc/sysctl.conf に以下の行を追加してください．

```
vm.overcommit_memory = 1
```

## 巨大なデータを持つキーを作らないようにする

Redisは，一般的なKeyValueの形式だけでなく，Hash型などの様々なデータ型でデータを保持することができるため，複雑なデータ構造のデータを持つことができます．
これらのデータ型はメモリ使用効率が良いため，一つのキーに複数のデータを持つことは一般的に行われています．
しかし1つのキーに割り当てるデータがあまりにも大きくなる（1GBを超えるなど）と，そのキーが削除されたときに，masterとslaveの保持するデータの差分が大きくなってしまい，通常のsyncではなくbgsaveが走ってしまい，Redisに負荷がかかってしまったり，bgsaveが失敗しデータのsyncが止まってしまう危険性があります．
こういった場合は，LTRIMなどのコマンドでデータのトリミングをしたり，キーを複数に分けるなどして，一つのキーが巨大なデータを持たないように管理する必要があります．

例えば，ユーザのページごとのアクセス時間を管理した場合を考えます．

```
user_page_access_time:
    "user_id:{page_id}": last_access_datetime
```

このような持ち方をしてしまうと，

ユーザ数 x ページ数

のデータが一つのキーに保存されることになり，ユーザとページ数が増えるごとに指数的にデータ量が増えてしまいます．

こういった場合は，以下のようにユーザidごとにキーを分けることで，一つのキーで持つデータサイズを削減することができます．

```
user_page_access_time:{user_id}:
     "{page_id}": last_access_datetime
```

## キーにExpireを設定する

実運用システムでは，放っておくとどんどんキー数は増加していきます．
そのため，データのライフサイクルを考え，可能な限りExpireを設定するようにします．
Expireを設定したキーはその時間がくると自動的に削除されるため，データ量の増加を防ぐことができます．
既にデータがある場合には，一度キー名を取得してから一括でExpireを付けるようなスクリプトを書いたので参考にしていただけたらと思います．

[Redisのキーに一括でexpireを付与する](http://qiita.com/satoshi03/items/ff459461ab4b9c53a157)

また，このときにExpireを付けられないキー（=永続的に持っておく必要があるキー）が多く存在する場合は，キャッシュとしてRedisを適切に使用できているか検討する必要があるかと思います．



# おわりに

コストもかからない上に非常に高速でかつデータの持ち方も豊富で，扱いやすいオンメモリ型のDBとして人気のあるRedisですが，利便性が高い故にキャッシュDBに枠を超えて大量のデータを持ってしまいがちです．
データのライフサイクルを考えて，必要以上にRedisにデータを持たないように運用することが肝かと思います．


## 参考

[Redis Documentation](http://redis.io/documentation)
[Redisを使う時は見積の二倍の容量必要だよね、という話](http://qiita.com/y_matsuwitter/items/4fc43a53d2ac24f7783e)
case文と===


俺の名はケンヤ。難事件をいくつも迷宮入りさせたニート。しかし ある時謎の組織に入社し薬を飲まされ身体が縮んで Braian になっちゃった。

##case文

case文はwhenで指定した値に一致するかどうかで判断します。
*「then」は省略することができますが一応つけておきます。

```rb
value = "C"

case value
when "A" then
  puts "Aです"
when "B" then
  puts "Bです"
when "C" then
  puts "Cです"
end

# Cです
```

case文は「 `===` 」を使用することでif文に置き換えることが出来ます。

```rb
value = "C"

if "A" === value
  puts "Aです"
elsif "B" === value
  puts "Bです"
elsif "C" === value
  puts "Cです"
end
```


###===とはつまり？

「 `===` 」を使用すると左辺が数値や文字列の場合は「 `==` 」と同じ意味をもつ。左辺が正規表現の場合は「 `=~` 」とと同じようにマッチしているかどうかで判断してくれ、クラスの場合は右辺が左辺クラスのインスタンスかどうかで判断してくれる。
【Unity】float値がinspectorとconsole出力が違う？！

#はじめに
パズルゲーム開発中にinspectorに表示されるPosition(Vector2)とConsoleで出力したfloat値が違うことに気付きました。何でなんだろう？

#問題
例)
Vector2 pos = new Vector3(-2.46, -4.46f);
Debug.log("pos : " + pos);

出力)
pos : (-2.5, -4.5)
勝手に小数第1位を切り上げされた?!

#結論
float値をConsoleに出力するときはVectorのToStringメソッドが勝手に小数点1まで切り上げしてるらしいです。

#解決
##float値のみ出力する
例)
Debug.Log(pos.x);
Debug.Log(pos.y);

出力)
-2.46
-4.46

##桁数を指定する
例)
Debug.Log("pos : " + pos.ToString("F2"));

出力)
pos : (-2.46, -4.46)

#Reference
http://answers.unity3d.com/questions/173094/show-vector3-full-float-value.html
WatchKitExtension付きアプリの実機ビルドを通す


WatchKitExtensionをTargetに加えた状態でArchiveしようとすると、署名が上手く行かずハマったのでメモ。
要するに、WatchKitExtension/WatchAppも、署名上はメインのTargetと同じように一つのアプリとして扱う必要があるということ。

アプリのBundle Identifierを、com.appnameとして書く。

- Bundle Identifier
	- WatchKit ExtensionのBundle Identifierはcom.appname.watchkitextensionにする。
	- Watch AppのBundle Identifierはcom.appname.watchappにする。
- Certificates, Identifiers & Profiles
	- Identifierにcom.appname.watchkitextensionを追加する。
	- com.appname.watchkitextension用のProvisioning Profileも作成する。
	- com.appname.watchapp用に*のProvisioning Profileも作成しておく。
- Provisioning Profile
	- それぞれのTARGETSのBuild Settings内、Code SigningのProvisioning Profileにそれぞれ指定する。
- 注意点
	- com.appname/com.appname.watchkitextension/* は全て同じアカウントで作成・署名する。
	- ごちゃごちゃになるので、Xcodeで出るFix Issuesはクリックしない。

NDAに抵触しないようになったら、画面とか交えてもう少しちゃんと書く。
[Devise] Omniauth を利用して、Facebook,Twitterなどでログインするとき、parameterを渡す方法

# はじめに

Deviseを使ってFacebookやTwitter, Linkedinなどでログインしたいとき、適当な引数を渡したい場合の対処法メモです。

# 書き方

## 渡し方

結構シンプルで :params に入れるといいだけです。

```rb
omniauth_authorize_path(:user, :facebook, var1: 'value1', var2: 'value2' )
```

```rb
/users/auth/facebook?var1=value1&var2=value2
```

```rb:example
/users/auth/facebook?name=hoge
```

## 受け取り方

```rb
request.env['omniauth.params']
---

{"var1"=>"value1"}
```

```rb:example_callback_controller
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def facebook
    @user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user, request.env["omniauth.params"])
　・
　・
  end
end
```

```rb:example_model
class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :lockable, :timeoutable
  devise :database_authenticatable, :registerable, :confirmable, :omniauthable,
         :recoverable, :rememberable, :trackable, :validatable

  def self.find_for_facebook_oauth(auth, signed_in_resource=nil, params_hash)
　・
　・
　・
  end
end
```

# References


- http://stackoverflow.com/questions/6657727/devise-omniauth-how-to-pass-extra-parameters-along
- http://stackoverflow.com/questions/5773557/how-can-i-pass-parameters-through-an-oauth-authentication-so-that-my-callback-or
[Devise] Rails4 の StrongParameter をDeviseのControllerにも適応させる方法

# はじめに

基本的に大体のことは [本家のDocument(wiki)](https://github.com/plataformatec/devise) をみれば書いてあるので、まずはそちらに目を通すといい。

# Defaultでの設定

documentを見ると、それぞれのControllerで違いますが、概ねauthentication keysが設定されていて、passwordとpassword_confirmation、current_passwordも対象になっている様です。

```rb
sign_in:  (Devise::SessionsController#create)
Permits only the authentication keys (like email)
```

```rb
sign_up:  (Devise::RegistrationsController#create)
Permits authentication keys plus password and password_confirmation
```

```rb
account_update:  (Devise::RegistrationsController#update)
Permits authentication keys plus password, password_confirmation and current_password
```

# ApplicationControllerで一気に追加

sign_up(Devise::RegistrationsController)に対して、usernameをStrongParameterに追加するメソッドを追加。
ApplicationControllerが読み込まれる際に、controllerを見て、devise_controllerであれば、strongParameterの追加を実行。

```rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << :username
  end
end
```

# 書き換える場合

こんな感じです。

```rb
def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:username, :email) }
end
```

# 複数のDeviseモデルを使う場合

## Sanitizerを使う場合

とりあえず対象のクラスにSanitizerを書いておきます。

```rb
class User::ParameterSanitizer < Devise::ParameterSanitizer
  def sign_in
    default_params.permit(:username, :email)
  end
end
```

あとはそれを必要なところに読み込ませたらいい感じです。

applicationcontrollerなら

```rb
class ApplicationController < ActionController::Base
  protected

  def devise_parameter_sanitizer
    if resource_class == User
      User::ParameterSanitizer.new(User, :user, params)
    else
      super # Use the default one
    end
  end
end
```

## 対象のControllerに処理をまとめたい場合


```rb
class Users::RegistrationsController < Devise::RegistrationsController
  def sign_up_params
     devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :name, :password, :password_confirmation) }
     super
  end
end
```

# validation

モデルにちゃんとvalidationを記述するのを忘れずに。

# References

- https://github.com/plataformatec/devise
- http://easyramble.com/add-field-devise-signup-form.html
- http://qiita.com/azusanakano/items/f46f713cad136bbd2254
VimでHaskellするときのsyntax/indentプラグイン比較

## kana/vim-filetype-haskell

indentのみ。なので下のSSの色は初期のままです。

![image](https://qiita-image-store.s3.amazonaws.com/0/25051/5f36bb26-1fea-237f-4e3e-fe73af21088d.png)

前半のコードは http://www.yesodweb.com/book/basics から引用しました。SSはインデント済みの元ソースを再度整形したものですが、全くインデントしてない状態からだとほとんどインデントされません。自分で改行するときは問題ないんですが。

プラグイン側でexpandtabとshiftwidth/softtabstop=2が設定されています。

## dag/vim2hs

これ一つでsyntax、indent、compiler、折りたたみなどが一気に入ります。

![image](https://qiita-image-store.s3.amazonaws.com/0/25051/ebb1978c-7be0-cb30-bbb4-2b6a72c030f4.png)

\と.が記号で表示されていますが、背景色がおかしいですね。QuasiQuoteの中もハイライトされていて・・・カラフルです。

インデントは一度全部外した状態から一括整形させてもこうなります。ここではexpandtab, shiftwidth=2を別途指定しています。

## raicho/haskell-vim

syntaxとindent。

![image](https://qiita-image-store.s3.amazonaws.com/0/25051/a2211a07-6fb4-702e-39c2-3c92506a414b.png)

型名に色がついているのが特徴的ですね。これもゼロから一括インデントすることができます。そしてet,sw=2。

## travitch/hasksyn

syntaxとindent。

![image](https://qiita-image-store.s3.amazonaws.com/0/25051/94b81b6f-9241-1096-5df1-28da6df69e5e.png)

QuasiQuoteの中もHaskellコードとしてハイライトされてますね。

## で、どれにしたのか

haskell-vimをベースに、型名をPreProcからTypeに変えて、caseの下は普通に1インデントにして・・・もうvim2hsでもいいかなという気も。

Haskell環境構築にあたってはそのほか

* Syntasticからwatchdogs.vimに乗り換え
* ghcmod-vim
* neco-ghc
* ref-hoogle
* unite-haskellimport

あたりを入れました（もしくは入れる予定）。
プロセスのCPU使用率を制限できるcpulimit


バッチ処理にCPU100%使われると困るときとか使えそう
OSXにはないみたい。残念

## Install
@ Amazon Linux

```
$ sudo yum --enablerepo=epel -y install cpulimit
```

## Example

```ruby:loop.rb
loop{ rand(100) }
```

loopスクリプトをCPU使用率5%で回す。

```
$ cpulimit -l 5 ruby /home/ec2-user/bin/loop.rb
```

バックグラウンドで動いて欲しいし、出力しないで欲しいなら

```
$ nohup cpulimit -l 5 ruby /home/ec2-user/bin/loop.rb  > /dev/null &
メモ：Service Worker について

http://jxck.hatenablog.com/entry/extendthewebforward から Service Worker に関する記述を抜き書き

- Application Cache （=AppCache）は失敗した。
- Service Worker は offlice 対応に必要な API を細かく分けている（開発者には、ユースケースではなくて可能性とその道具を提供する）
- 別スレッドで処理を実行し、適切にアップデートする。
- キャッシュの管理を開発者側が完全にコントロールできるようにする（Cache API）。
- 「別のスレッドから HTTP リクエストに介入する」モデル。
- ブラウザが発行するリクエストを必要十分にコントロール（Fetch API）
- URLを扱うまともなAPI（URL API）
- その他にも低レベルAPIを個々に提供。
- Service Worker は HTTPS オンリー。

実装状況
=======
https://jakearchibald.github.io/isserviceworkerready/
→ Chrome 40でのみ、という感じがする。
GitBucketのServiceHooksでPOSTされる情報

GitBucketだけじゃなくてBitBucketとかGitHubが元の仕様なんでしょうが。

Githubだと仕様はこれ

Webhooks | GitHub API
https://developer.github.com/webhooks/

```txt
payload={"pusher":{"name":"ymko","email":"ymko@xxxxxxx"},"ref":"refs/heads/dev","commits":[{"id":"f4c3e82e39ab5252422368c26a2876957469b6cf","message":"aaa\n","timestamp":"Sun Jan 11 20:27:36 GMT 2015","url":"http://xxxxxxxx:xxx/pigs/suzaki-nishi/commit/f4c3e82e39ab5252422368c26a2876957469b6cf","added":[],"removed":[],"modified":["20150106.txt"],"author":{"name":"ymko","email":"ymko@xxxxxxxx"}}],"repository":{"name":"suzaki-nishi","url":"http://xxxxxxxxxxxxxxx:xxx/git/pigs/suzaki-nishi.git","description":"洲崎西","watchers":0,"forks":0,"private":false,"owner":{"name":"pigs","email":"pigs@devnull"}}}
```

見てる人がいた。

Bitbucket の service hook で POST されてくるパラメータ例 - メモ
http://elm-arata.hatenablog.com/entry/2013/05/23/190945
Qiita:Team用のChrome拡張を作りました（非公式）

目的
----

Qiita:Teamで書いた投稿を任意のエイリアスにメールしたり、個人のQiitaにコピーし投稿するChrome拡張を作りました。非公式です。もし問題があれば教えて下さい。

背景
----

* Qiita:Teamに書いた日報をメールで社内に共有したいが、自動でメールするのにあまり有効な手段がなさそう（メンションで飛ばす場合にうまくいかない時がある模様）。
* 投稿内容によってはQiita:Teamだけでなく社外へ公開したいが、手動で写すのが面倒に感じられる（結果どちらかにしか投稿しなくなる）。

使い方
----

Chrome拡張をインストールするとこのChrome拡張のアイコンがChromeの右上に表示されます。設定を行った後に下記のように、メール共有とQiita投稿が行えるようになります。

![image](https://qiita-image-store.s3.amazonaws.com/939/39813/3b719c37-440b-63a7-e54d-a6e568057e18.png)

#### インストール

下記からインストールします。
https://chrome.google.com/webstore/detail/qiita-team-extended/oommfohdakaaifcnmddhlcdpjfpibigb?authuser=1

#### 設定

Chrome拡張のオプションを開きます。アイコンを右クリックしオプションを選択します。

![image](https://qiita-image-store.s3.amazonaws.com/939/39813/60e3fa76-a28c-548a-f72f-676a0032a0dd.png)

オプションページでは下記のような情報を設定する必要があります。

![image](https://qiita-image-store.s3.amazonaws.com/939/39813/344a2f77-9d12-2dee-401e-516ebbd5cc6e.png)


Mandrillはこちらからサインアップします。
https://mandrill.com/

SettingsにAPI Keyを生成する箇所がありますので、そこでKeyを生成してください。
![image](https://qiita-image-store.s3.amazonaws.com/0/39813/fd797467-41c2-0ae3-53cd-4d107df3115c.png)


#### 注意

Qiita投稿も拡張から行いたい場合は、投稿権限付きのトークンを自分で取得し設定します。下記のページで「個人用アクセストークン」を生成します。read_qiita_teamとwrite_qiitaのスコープが必要です。

https://qiita.com/settings/applications

開発者向け情報
----

技術的には、Vue.js + bower + browserifyを利用しています。
https://github.com/takayukii/QiitaTeamExtended
Jekinsからgit cloneできないエラーでハマった件

ウンウン悩んで30分ほどかかったのでメモ

# 状態

```txt:コンソール出力
Started by user anonymous
Building in workspace /data/data_dir/jobs/suzaki-nishi/workspace
Cloning the remote Git repository
Cloning repository http://xxxxxx:xxx/git/pigs/suzaki-nishi.git
 > git init /data/data_dir/jobs/suzaki-nishi/workspace # timeout=10
ERROR: Error cloning remote repo 'origin'
ERROR: Error cloning remote repo 'origin'
Finished: FAILURE
```

```txt
ソースコード管理
● Git
Repository URL　：　http://xxxxxx:xxx/git/pigs/suzaki-nishi.git

Failed to connect to repository : Error performing command: git ls-remote -h http://xxxxxx:xxx/git/pigs/suzaki-nishi.git HEAD
```

なおgit ls-remote -hは通るのに。

```bash
$ git ls-remote -h http://xxxxxx:xxx/git/pigs/suzaki-nishi.git HEAD
072598b8427648397c511964c4945d6510f37294        refs/heads/dev
ab00b192d5bf7c257aa676214600b2709b7ec083        refs/heads/master
```

# 答え

gitが入っていなかった。
別dockerコンテナでやるとたしかにそうなるよね。。

```txt:gitパス通ってないって出てるし
Jenkinsの管理 => システムの設定 

Git
Name Default
Path to Git executable git

There's no such executable git in PATH: /usr/local/sbin, /usr/local/bin, /usr/sbin, /usr/bin, /sbin, /bin.
```

GitプロジェクトをコミットしたタイミングでJenkinsにビルドをしてもらいたい！ - kk_Atakaの日記
http://d.hatena.ne.jp/kk_Ataka/20120223/1330001338

# 構築までの道のり（未検証）
CentOS 7 で GitHubクローンの GitBucket を動かして、Jenkins で自動デプロイ - BLACKND
http://blacknd.com/linux-server/centos7-gitbucket-jenkins-auto-deploy/

CentOSにyumでjenkinsをインストールする - 文系プログラマによるTIPSブログ
http://treeapps.hatenablog.com/entry/2014/06/11/233027

Jenkins
ジェンキンス、ジェンキンズ

CIツールのHudson，Oracleと交渉決裂しJenkinsに改名へ：濃縮還元オレンジニュース｜gihyo.jp … 技術評論社
http://gihyo.jp/dev/clip/01/orangenews/vol61/0004

継続的インテグレーションとは 【 CI 】 【 Continuous Integration 】 - 意味/解説/説明/定義 ： IT用語辞典
http://e-words.jp/w/E7B699E7B69AE79A84E382A4E383B3E38386E382B0E383ACE383BCE382B7E383A7E383B3.html

DockerコンテナでJenkinsを動かす - Qiita
http://qiita.com/sokutou-metsu/items/4a2c9636c9e6974e2919

jonhadfield/docker-jenkins
https://github.com/jonhadfield/docker-jenkins


$ docker run -p 8081:8081 -v `pwd`/jenkins/:/data -i -t centos:centos7 /bin/bash
bash-4.2# yum install java-1.7.0-openjdk git

curl -O http://mirrors.jenkins-ci.org/war/latest/jenkins.war

bash-4.2# java -DJENKINS_HOME=/data/data_dir/ -jar jenkins.war --webroot=/data/webroot/ --httpPort=8081
EmacsLispでURLの画像を取得

# 概要

Emacsで画像を使うときにwgetしてローカルに保存せずに、
そのまま画像を見たかったので画像をバッファに表示する関数を作りました。

# 定義

+ 処理 image-urlの画像を展開してバッファを返す
+ 引数 image-url：画像のURL
+ 返値 buffer 画像が展開されたバッファ

```el
(defun get-image-from-url (image-url)
  "Get image data from url, and return image buffer"
  (let ((start-buffer (current-buffer))
        (image-data 
         (url-http-get image-url nil))
        (created-buffer (generate-new-buffer "*image*")))
    (set-buffer created-buffer)
    (insert image-data)
    (image-mode)
    (set-buffer start-buffer)
    created-buffer))

(defun url-http-get (url args)
  "Send ARGS to URL as a GET request."
  (let (
        (response-string nil)
        (url-request-method "GET")
        (url-request-data
         (mapconcat (lambda (arg)
                      (concat (url-hexify-string (car arg))
                              "="
                              (url-hexify-string (cdr arg))))
                    args
                    "&")))
    (set-buffer
     (url-retrieve-synchronously
      (concat url "?" url-request-data)))
    (goto-char (point-min))
    (re-search-forward "\n\n")
    (setq response-string
          (buffer-substring-no-properties
           (point) (point-max)))
    (kill-buffer (current-buffer))
    response-string))
```

# 使い方
```el
(switch-to-buffer
 (get-image-from-url "http://upload.wikimedia.org/wikipedia/commons/thumb/0/08/EmacsIcon.svg/48px-EmacsIcon.svg.png"))
```
Androidスマートフォンにゲームパッドを繋いでJavascriptからデータを取得する

USB A-Typeコネクタを、マイクロUSBに変換するホストケーブルというものが売っています。

![IMG_2895.jpg](https://qiita-image-store.s3.amazonaws.com/0/53543/1cbb4a4f-5fbd-40cd-de07-dc1ecd8bb98d.jpeg)

こういうのです。
これを、マイクロUSB端子があるAndroidスマートフォンに接続します。

![IMG_2896.jpg](https://qiita-image-store.s3.amazonaws.com/0/53543/a5ebe5b3-b5a7-81d1-e05f-7ef22725bb01.jpeg)

こんな感じになります。
ここで注意するのは、「ホストケーブル」じゃないとダメだということです。
そして、この変換ケーブルにUSBゲームパッドを接続します。

![IMG_2897.jpg](https://qiita-image-store.s3.amazonaws.com/0/53543/a6287e59-afa7-c8de-ad56-5a4e2aec06d8.jpeg)

こうなります。
この状態で[enforce](https://github.com/digitarhythm/enforce)のゲームパッドライブラリ、もしくは[gamepadprocedureライブラリ](https://github.com/digitarhythm/gamepadprocedure)でデータを取得すると、これがなんとパソコンのWebブラウザと、全然違う結果が返ってきます。
要約すると、
<dl>
<dt>ファミコンコントローラー</dt>
<dd>方向キーしかデータが取得出来ません。</dd>
<dt>USBアナログコントローラー</dt>
<dd>アナログスティックが片方しか取得出来ません。0〜3のボタンのうちデータが取得出来ないボタンがあり、パッドに書いてある番号と配列の番号が合いません。</dd>
<dt>XBOX360コントローラー</dt>
<dd>「Back」「Start」が「LT」「RT」になっているが全ての値が返ってくる。しかし、「Back」「Start」がAndroidの「Back」「Home」になっているので、押すとChromeが終了しホームに戻ってしまう。</dd>
</dl>
~~これはもう、共通で使えるのはファミコンコントローラーしか無いと考えたほうがいいのかも。~~
ファミコンコントローラーは方向キーしか取れないので、XBOX360コントローラーしか選択肢は無いですね。
仮面ライダードライブベルトの赤外線信号解析



チビが毎日遊んでいる仮面ライダードライブのベルト。腕のブレスと腰ベルト間で赤外線通信をしているようなので、チビが寝静まった夜中に信号を解析してみました。音量の調節機能が無いので深夜に鳴り響くのが微妙に辛かったです（笑。

Arduinoでやろうかと思ったのですが、手元に赤外線の送受信モジュールがなかったので、今回は[IRKIT](http://getirkit.com)を利用しました。

# 使用したもの

* [IRKIT](http://getirkit.com)
* [仮面ライダードライブベルト](http://www.b-boys.jp/drive/products/cat1_1/)
* [シフトカー数台](http://www.b-boys.jp/drive/shiftcar/)

# プログラム

ヘッダー ON(10T)->OFF(1T)に続いて「0」の場合はON(3T)->OFF(1T), 「1」の場合はON(1T)->OFF(3T)という感じの12bitのコマンド。必殺ボタン？を押した場合は、コマンドにつづいて装着されているシフトカーコードを送っていました。

最初は11bit+ストップビット1bitで網羅できたようなの気がしていたのですが、手元の「タイプスピードのてれびくん版」は最終bitがON(3T)で、ON(1T)の場合は別のものが発動するためよくよく調べてみると12bitのようでした。

どちらかというと最終bitが「1」の場合は一般的のもの、「0」の場合は「ウルトラ〜」のようなレアバージョンのコードが多いようですので、試してみると良いかと。

[IRKIT](http://getirkit.com)ではon/off切り替え時間を送る方式なので取得したデータを元に調整してあります。おもちゃなのでそれほど厳密では無いとは思います。

さくっとcurlを呼んでいるので、コマンドラインを使いたく無い場合はnet/httpとかで書き換えると良いかと思います。

```ruby
def makeIRData(code)
  bit0 = "3013,1073"
  bit1 = "1073,3013"
  bit_start = "11529,1111"
  data = bit_start
  code.chars{|ch|
    data += "," + bit0 if ch == '0'
    data += "," + bit1 if ch == '1'
  }
  data
end

def sendIRData(ip, code, hissatsu = false)
  if hissatsu
    # 必殺！
    data = makeIRData("001111111111")
    cmd = "curl -s \"http://#{ip}/messages\" -d '{\"format\":\"raw\",\"freq\":38,\"data\":[#{data}]}'"
    `#{cmd}`
    sleep(5)
  end
  data = makeIRData(code)
  cmd = "curl -s \"http://#{ip}/messages\" -d '{\"format\":\"raw\",\"freq\":38,\"data\":[#{data}]}'"
  `#{cmd}`
end
```

## 使用例

```
# IRKITが192.168.1.107にあり、タイプスピードの信号を出す場合
sendIRData("192.168.1.107","001000001011",false)

# IRKITが192.168.1.107にあり、タイプスピードの必殺！信号を出す場合
sendIRData("192.168.1.107","001000001011",true)

```

#送出コード一覧

12bitです。思ったより反響が大きく、ネタバレに関する懸念もあるため公開コードを少なくしました。ヒントとして最後は1の場合は標準のもの、0はバリエーションをつけた特別バージョンが多いようです。(1/13更新)

## 特殊コード
| コード | 種類 |
|:--|:--|
000000000001|シフトカー脱着
000111111111|シフトカー挿入
001111111111|ボタン押し下げ（シフトカー有）→この後シフトカーコードを送出
001100000000|ボタン押し下げ（シフトカー無）

#連動
| コード | 種類 |
|:--|:--|
000000000011|ハンドル剣
000000000100|ドア銃

##シフトカー

| コード | 種類 |
|:--|:--|
001000001011|タイプスピード
001000001101|タイプワイルド
001000001111|タイプテクニック
001000011011|タイプフルーツ
001000011101|タイプスペシャル

##タイヤ交換

| コード | 種類 |
|:--|:--|
001000101001|マックスフレア
001000101011|ファンキースパイク
001000101101|ミッドナイトシャドー
001000101111|ジャスティスハンター
001000110001|ドリームベガス
001000110011|ディメンションキャブ
001000110101|マシンモンスター
001000110111|ダンブルダンプ
001000111001|マッドドクター
001000111011|バーニングソーラー
001000111101|カラフルコマーシャル
001000111111|フッキングレッカー
001001000001|ファイヤーブレイバー
001001000011|ローリンググラビティ
001001000101|スピンミキサー
001001000111|デコトラベラー
001001001001|ロードウィンター
001001001011|アメージングサーカス

##その他？

| コード | 種類 |
|:--|:--|
001001110011|タイプスピード - テレマーカー
001001110101|メガマックスフレア - ようちえん
001001110100|ハイスピード - てれびくん　
001001110111|スペシャルカー

##謎？

| コード | 種類 |
|:--|:--|
001110001011|ライダー
001110110111|クウガ―

#ごにょごにょ

子供がシフトカーを集めるのも楽しみかと思うので、飽き始めた頃にこれで親の技術力をみせつけてあげると良いかと思います。「カラフルコマーシャル出して！」とか言われると結構めんどくさいので要注意です（笑。

あと、手元に無いので挙動がわからないのですがハンドル剣とかからも信号受け取るようなので、まだまだコマンドはあるかと思います。→追記しました(1/17)
Registering an App IDでLoading...が終わらない場合。

![スクリーンショット 2015-01-12 1.55.14.png](https://qiita-image-store.s3.amazonaws.com/0/38442/ba61c09d-1d42-790e-134c-479406e8abb8.png)
　
　
chromeじゃなくてsafariを使ってみます。
　
　
![スクリーンショット 2015-01-12 2.03.55.png](https://qiita-image-store.s3.amazonaws.com/0/38442/cfef78e2-55c9-feb7-df64-a8fb8509ac69.png)
　
　
できました。:tada:
TesselでLチカ

目的
----

Maker FaireでSwitch Scienceのブースを見ていたら惹かれて買ってしまいました。700円くらい割引でメインボード9000円でした。鼻血が出るくらい簡単です。

前提
----

* Tesselのボードを持っている事
* Node.jsがインストール済である事

手順
----

#### tesselモジュールをインストールする

```bash
$ npm install -g tessel
```

#### TesselをUSBで接続する

TesselをUSBコードで接続します。それからターミナルでアップデートします。

```bash
$ tessel update
TESSEL! Connected to TM-00-04-f000da30-00544f4a-62782586.
INFO Checking for latest firmware... 
INFO Tessel is already on the latest firmware build. You can force an update with "tessel update --force"
```

#### JSを書く

blinky.jsというファイル名で下記をソースコードを作成します。

```js:blinky.js
var tessel = require('tessel');

var led1 = tessel.led[0].output(1);
var led2 = tessel.led[1].output(0);

setInterval(function () {
    led1.toggle();
}, 200);

setInterval(function () {
    led2.toggle();
}, 1000);
```

#### 実行する

こんなんでLチカ完了です。簡単すぎます。

```bash
$ tessel run blinky.js
TESSEL! Connected to TM-00-04-f000da30-00544f4a-62782586.
WARN No package.json or node_modules found. Deploying just this file.
INFO Bundling directory /Users/takayukii/GoogleDrive/workspaces/tessel/Lchika1
INFO Deploying bundle (3.50 KB)...
INFO Running script...
```

#### プログラムをフラッシュに保存する

下記で電源入れた時に自動でプログラムが走るようになります。

```bash
$ tessel push blinky.js
```

参考
----

http://tips.hecomi.com/entry/2014/07/06/235056
RefTeXで自前のfigure環境を参照する

YaTeX+RefTeXで文章を書いていて、自前の`figure`環境や`table`環境は、RefTeXで読み込めないことに気がつきました。Google先生に聞いてみたところ、[自前の命令を読み込む方法](https://www.gnu.org/software/emacs/manual/html_node/reftex/Figure-Wrapper.html)は見つかりましたが、環境に関する記述を見つけることが出来ませんでした。

[マニュアル](http://www.gnu.org/software/auctex/manual/reftex.index.html)をきちんと読むのは面倒だったので、ソースをコピペして少し変えたところ、動いてくれたのでメモ。

# 設定
以下のコードを.emacsに記述すれば、RefTeXは、`myfigure`環境を`figure`環境と同等に扱ってくれます。

```el
(setq reftex-label-alist
      '(("myfigure" ?f "mfig:" "~\\ref{%s}" caption)))
```

`table`環境も追加したい場合は以下のとおりです。

```el
(setq reftex-label-alist
      '(("myfigure" ?f "mfig:" "~\\ref{%s}" caption)
        ("mytable" ?t "mtab:" "~\\ref{%s}" caption)))
```

# 環境にこだわった理由
`includegraphix`で効くYaTeXの補完が便利だったこと。
YaTeX使いでなければ `newcommand` した方がいい気がします。
Macで　GLUT + OpenGL のんびりいこう#4 Draw Square

#前提
Mac OSX 10.12.1
Developer Tool

#目標
四角形の描画

#Square.cpp
```cpp:Square.cpp
#include <GLUT/glut.h>

#define WIDTH 640
#define HEIGHT 480

//描画関数：始点x,y、終点x,y,サイズ
void Square2D(int x1,int y1,int x2, int y2,float size){
	glLineWidth(size);
	glBegin(GL_LINE_LOOP);
	glVertex2i(x1,y1);
	glVertex2i(x2,y1);
	glVertex2i(x2,y2);
	glVertex2i(x1,y2);
	glEnd();
}
//描画関数：各点を指定、サイズ
void Square2D(int x1,int y1,int x2, int y2,int x3,int y3,int x4,int y4,float size){
	glLineWidth(size);
	glBegin(GL_LINE_LOOP);
	glVertex2i(x1,y1);
	glVertex2i(x2,y2);
	glVertex2i(x3,y3);
	glVertex2i(x4,y4);
	glEnd();
}
//描画関数：塗りつぶし、始点x,y、終点x,y,サイズ
void SquareFill2D(int x1,int y1,int x2, int y2){
	glBegin(GL_QUADS);
	glVertex2i(x1,y1);
	glVertex2i(x2,y1);
	glVertex2i(x2,y2);
	glVertex2i(x1,y2);
	glEnd();
}
//描画関数：塗りつぶし、各点を指定、サイズ
void SquareFill2D(int x1,int y1,int x2, int y2,int x3,int y3,int x4,int y4){
	glBegin(GL_QUADS);
	glVertex2i(x1,y1);
	glVertex2i(x2,y2);
	glVertex2i(x3,y3);
	glVertex2i(x4,y4);
	glEnd();
}

void display(void){
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	//1
	glColor4f(1.0f,0.0f,1.0f,1.0f);
	Square2D(30,20,200,120,1.0f);
	//2
	glColor4f(0.0f,0.0f,1.0f,1.0f);
	Square2D(300,20,400,60,500,120,250,100,3.0f);
	//3
	glColor4f(0.0f,0.5f,0.0f,1.0f);
	SquareFill2D(30,250,500,400);
	//4
	glColor4f(1.0f,0.5f,0.0f,1.0f);
	SquareFill2D(350,170,500,150,480,200,370,220);
	glFlush();
}

void Init(){
	//背景色を黒に設定
	//glClearColor(1.0, 1.0, 1.0, 1.0);
	glClearColor(0.0, 0.0, 0.0, 1.0);	
	glOrtho(0, WIDTH, HEIGHT, 0, -1, 1);
}

int main(int argc, char *argv[])
{
	glutInitWindowPosition(100, 100);
	glutInitWindowSize(WIDTH, HEIGHT);
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_RGBA);
	glutCreateWindow("四角形を描画");
	glutDisplayFunc(display);
	Init();
	glutMainLoop();
	return 0;
}
```

#コンパイル
framework指定が要点です。
g++ -o Square Square.cpp -framework GLUT -framework OpenGL
osのバージョンによってはワーニングがうるさいので。-w
g++ -o Square Square.cpp -framework GLUT -framework OpenGL -w


#Result
![スクリーンショット 2015-01-12 1.34.39.png](https://qiita-image-store.s3.amazonaws.com/0/33317/24a91034-beb5-60e1-3c73-0eec0e5a41be.png "スクリーンショット 2015-01-12 1.34.39.png")
C++でC#のreadonlyを実装できなかった話

#Readonly

*この記事は私以外にはReadonlyです。*

C#には`readonly`という修飾子がありまして…

```csharp:readonly.cs
class Test
{
    public const    int value_c = 10;
    public readonly int value_r = 20;

    public Test(){
        value_r = 10;
    }
    public Test(int v)
    {
        value_r = v;
    }
}

```
このように、`readonly`は`const`の機能である**宣言時に初期化**に加え、**コンストラクタ内での初期化**も許可されています。その他の点はconstと同様です。

#C++での実装

というわけでゴリゴリ書きました。
C++には`friend`というアクセスを許可する修飾子がありまして…
それで、パパパっと親クラスのコンストラクタのみ許可して、終わりっ！

```cpp:Readonly.cpp

template <class Parent,class T>
class ReadOnly {
public:
	typedef T value_type;
	friend Parent::Parent();

private:	
	T instance;
	
	value_type& operator=(const value_type& v) {
		instance = v;
		return instance;
	}

public:
	//constructor
	ReadOnly() {}
	ReadOnly(const T& v) : instance(v){}
};

```
**「このコードは実行できませんのでご注意を」**
まずは代入ができるか確認して、できたら暗黙キャストでも入れよう。
テストクラスはこんな感じ

```cpp

class test{
public:
	ReadOnly<test,int> read;
	test(){
		read = 10;
	}
};

```

##問題
`friend Parent::Parent();`にて
`error: C++ requires a type specifier for all declarations`

前方宣言によって使用できるのは型の宣言のみで**内部実装は見えない。**
コンストラクタを実装していない可能性もあり得る。**よってtestクラスを先に書く必要がある。**

他にもいろいろと問題点はあるが、実装依存のデータ構造はいろいろと破綻しているので、実装しない。別にファイル分割が面倒くさいとか、Macにしてからvimrcの調子が悪いとか、そういうことではない。

##まとめ
この問題を解決するのはわりと難しそうだ。
SFINAEでなんとかと思ったが、そもそも#include前に定義しないと全部スコープ外になるし、今回はそういう問題じゃない。

今日はもう無理…

####メモ
・friendは、定義されてない型や関数にすることは可能
・スコープ解決演算子(::)の左辺は必ず存在しないとダメ
・前方宣言は、メンバの定義は参照できない
・コンストラクタのオーバーロード全てに対応できるのか？

・よってコンストラクタのfriendは、Readonlyクラスより先に定義されている必要がある。
・このままではデータ構造としては非常に使い難いものになってしまう。
JabbRのソースコード確認 (サーバーサイドでのMEF利用したコマンド実行)

ASP.NET + SignalRで作成されているチャットアプリであるJabbR( https://jabbr.net/ )のソースコードを確認した。

メッセージテキストボックスにコマンド入力し、それを実行する機能があるようだ。

その機能のうち、サーバー側でのコマンド発行周りのソースコードを確認・要約したものを以下リポジトリに配置した。

https://github.com/ken200/MEFCommandPatternSample

リポジトリ名にもある通り、MEFを使ってアセンブリ内のコマンドクラスを読み込み・実行している。

処理速度的にどうだとかは調べてはいないが、クラスのロードコードがお手軽に書けるのでなかなか良いと思う。
pluckよりもmapのほうが高速なケース


ActiveRecord Relationから特定のカラムの配列を取得したいとき、基本的にはmapではなくpluckを使うべきです。

#### References

* http://blog.mitchcrowe.com/blog/2012/04/14/10-most-underused-activerecord-relation-methods/
* http://blog.livedoor.jp/sasata299/archives/51847390.html
* http://blog.mitchcrowe.com/blog/2012/04/14/10-most-underused-activerecord-relation-methods/

ただし、pluckはインスタンス化されたオブジェクトに対しても毎回SELECT文を投げてしまうようなので注意です。

## pluckを使うべきケース

pluckは必要なカラムのみのSELECTに絞られているため、DB-アプリ間の消費帯域節約やカバリングインデックスが使えた場合などの観点でSQLパフォーマンスが有利です。
また、activerecordオブジェクトを生成せずに値を返すためインスタンス生成オーバーヘッドやメモリ消費の観点でも有利です。
DBから値をとってくる必要があるケースではpluckを使うべきです。

```rb
Profile.all.pluck(:id)
  # => SELECT "profiles"."id" FROM "profiles"
Profile.all.map(&:id)
  # => SELECT "profiles".* FROM "profiles"
```

#### Benchmark

```rb
n = 2000
Benchmark.bm do |x|
  x.report { n.times { Profile.all.pluck(:id) } }
  x.report { n.times { Profile.all.map(&:id) } }
end
```

|           |user       |system     |total      |real         |
|:----------|----------:|----------:|----------:|------------:|
|pluck(:id) |  2.030000 |  2.580000 |  4.610000 | (  7.576141)|
|map(&:id)  |  4.420000 |  2.850000 |  7.270000 | (  10.10201)|

## mapを使うべきケース

以下のように既にインスタンス化されたオブジェクトから値をぬきとりたい場合は、pluckだとかなり問題があります。
pluckの場合、毎回SELECT文が発行されてしまうので、ループで実行したりするとN+1問題みたいになります。
（ちなみに、eager_loadやincludeなどをかませてpluckでもSQL発行されない方法を探ってみましたがだめでした。ご存知のかたがいれば教えてください！）

一方mapの場合はメモリ内で計算するだけになりコストはほぼゼロです。

```rb
profiles = Profile.all
n = 2000
Benchmark.bm do |x|
  x.report { n.times { profiles.pluck(:id) } }
  x.report { n.times { profiles.map(&:id) } }
end
```

|           |user       |system     |total      |real         |
|:----------|----------:|----------:|----------:|------------:|
|pluck(:id) |  2.020000 |  2.400000 |  4.420000 | (  7.245241)|
|map(&:id)  |  0.000000 |  0.000000 |  0.000000 | (  0.007601)|

# Environment

※ HostOSはMac OSXで、virtualboxのvagrant NFSモードでCentOS 6.5を起動してます
※ virtualboxだからかGuestOSでのディスクIOがかなり遅いのでたった2000件のテストですごい差が出ています
※ ベンチマークテストでのDBはsqlite3を使ってますが、mysqlでもほぼ同じ結果が出ることを確認しました

```
pry(main)> Rails.version
=> "4.1.6"
```

```
% uname -a
Linux *** 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
% cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m
```
Windows環境においてBitbucketへのSSH接続方法

Windowsのコマンドプロンプトでは、Bitbucketへの接続の際に怒られるため、ちょっと工夫が必要です。

----
1. 下記を行う。
 https://confluence.atlassian.co.jp/pages/viewpage.action?pageId=34439475#

2. Git Bashアプリのショートカットを作り、そのプロパティに下記をセットする
 
    ```
[作業フォルダ]  対象のgitディレクトリへのパス
```

----
以上。
指定した日付は第何週なのか調べてみる

指定した日付が第何週目にあたるのか調べてみました。  
用途としては「2015-02-02T00:00:00+00:00」とJSONで複数日付が渡され、  
それぞれが第何週目のグループに分けられればよいのかを調べるために使います。

まずString型で日付が渡ってくるのでNSDate型にする必要があります。  
Objective-cやり始めたころに作ったメソッドがあったのでそれを流用します。  


```objective-c:NSString→NSDate
-(NSDate*)remakeDate:(NSString*)day{
    day = [day stringByReplacingOccurrencesOfString:@"\n" withString:@""];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setTimeStyle:NSDateFormatterFullStyle];
    [dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]];
    [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZ"];
    NSDate *remakeDay = [dateFormatter dateFromString:day];
    if(!remakeDay){
        [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mmZZZZ"];
        remakeDay = [dateFormatter dateFromString:day];
    }
    if(!remakeDay){
        [dateFormatter setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss Z"];
        remakeDay = [dateFormatter dateFromString:day];
    }
    return remakeDay;
}
```

第何週目か確認したい日付のリストはテスト用に以下のように準備しておきます。

```objective-c
NSArray *dayList = [NSArray arrayWithObjects:
                    [self remakeDate:@"2015-02-02T00:00:00+00:00"],
                    [self remakeDate:@"2015-02-05T00:00:00+00:00"],
                    [self remakeDate:@"2015-02-12T00:00:00+00:00"],
                    [self remakeDate:@"2015-02-14T00:00:00+00:00"],
                    [self remakeDate:@"2015-02-16T00:00:00+00:00"],
                    [self remakeDate:@"2015-02-17T00:00:00+00:00"],
                    [self remakeDate:@"2015-02-18T00:00:00+00:00"],
                    [self remakeDate:@"2015-02-20T00:00:00+00:00"],
                    [self remakeDate:@"2015-02-21T00:00:00+00:00"],
                    [self remakeDate:@"2015-02-22T00:00:00+00:00"],
                    [self remakeDate:@"2015-02-26T00:00:00+00:00"],
                    [self remakeDate:@"2015-02-27T00:00:00+00:00"],
                    [self remakeDate:@"2015-02-28T00:00:00+00:00"],
                    nil];
```

上記のリストをログに出力しながら確認してみます。

```objective-c

NSDateComponents* components = [[NSDateComponents alloc] init];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSUInteger flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekOfMonthCalendarUnit;
for (int i = 0; i<[dayList count]; i++) {
    components = [calendar components:flags fromDate:[dayList objectAtIndex:i]];
    NSLog(@"%ld年%ld月%ld日は第%ld週目です。"   ,(long)[components year]
                                            ,(long)[components month]
                                            ,(long)[components day]
                                            ,(long)[components weekOfMonth]);
}
```

出力した結果は以下のようになりました。

```NSLog
2015年2月2日は第1週目です。
2015年2月5日は第1週目です。
2015年2月12日は第2週目です。
2015年2月14日は第2週目です。
2015年2月16日は第3週目です。
2015年2月17日は第3週目です。
2015年2月18日は第3週目です。
2015年2月20日は第3週目です。
2015年2月21日は第3週目です。
2015年2月22日は第4週目です。
2015年2月26日は第4週目です。
2015年2月27日は第4週目です。
2015年2月28日は第4週目です。
```
いじょーです！
CLLocationの2地点間の中間地点の座標を求める

Swiftでアプリを作り始めて一ヶ月ほど経ちました。

CoreLocationを使っていて、CLLocationの2地点の中間地点の座標を求めるのにハマったのでメモ。

最初、2地点の中間座標を下記のように平均値を使って求めようとしましたが、エラーが出てうまくいきませんでした。
（西経と東経をまたがる計算がうまくいかないのは承知の上です）

```swift:location.swift
pointA = CLLocation()
pointB = CLLocation()

// いろいろな処理で座標を取り込んで・・・

centerLatitude: CLLocationDegrees = (pointA.coordinate.latitude + pointB.coordinate.latitude) / 2.0
centerLongitude: CLLocationDegrees = (pointA.coordinate.longitude + pointB.coordinate.longitude) / 2.0

center = CLLocationCoordinate2DMake(centerLatitude, centerLongitude)
```


CLLocation()でもうまくいかない・・・

2時間ほど悩んで、ようやくたどり着きました。
勘違いしてました。CLLocationのインスタンス生成時に引数のラベルを忘れていたという・・・

```lang:location.swift
pointA = CLLocation()
pointB = CLLocation()

// いろいろな処理で座標を取り込んで・・・

centerLatitude: CLLocationDegrees = (pointA.coordinate.latitude + pointB.coordinate.latitude) / 2.0
centerLongitude: CLLocationDegrees = (pointA.coordinate.longitude + pointB.coordinate.longitude) / 2.0

center = CLLocation(latitude: centerLatitude, longitude: centerLongitude)
```

西経180度と東経180度をまたがるとうまくいかない気がします。まあ、地上でそんな地点は少ないのでしょうが、他に良い方法あるんでしょうか。
Railsで条件検索

Railsで条件を指定した検索をするには、`where`メソッドを使います。

```rb:rails_console
Soldier.where(name: 'Eren Yeager')
# => [#<Soldier id: 1, name: "Eren Yeager", age: 15, height: 170, weight: 63, sex: "M">]
```

`where`メソッドには文字列や配列を渡すこともできますが、ハッシュで渡すのが読みやすさ的にも安全性にも良さそうです。比較を条件にするときは文字列で指定しないといけません。（範囲条件はハッシュでできるのに…）

```rb:rails_console
Soldier.where("height > 165 and sex = 'F'")
Soldier.where(["height > ? and sex = ?", 165, 'F'])
Soldier.where(["height > :height and sex = :sex", {height: 165, sex: 'F'}])
Soldier.where(height: 165..200, sex: 'F')
# => [#<Soldier id: 2, name: "Mikasa Ackerman", height: 170, sex: "F">, #<Soldier id: 10, name: "Sasha Blouse", height: 168, sex: "F">]
```

続けて書くこともできます。これは条件が指定されたりされなかったりを実装するときに役立ちそう。

```rb:rails_console
Soldier.where(height: 165..200).where(sex: 'F')
# => [#<Soldier id: 2, name: "Mikasa Ackerman", height: 170, sex: "F">, #<Soldier id: 10, name: "Sasha Blouse", height: 168, sex: "F">]
```

上で述べた比較条件や、その他のハッシュで指定できない条件は`Arel`というライブラリでハッシュ指定できるようになるみたいです。
以下のページに詳しく詳細があります。
[ActiveRecord4でこんなSQLクエリどう書くの? Arel編](http://labs.timedia.co.jp/2013/10/activerecord4sql-arel.html)
プロビジョニングツールにおける設定ファイルの管理方法について

プロビジョニングツールでミドルウェアの設定ファイルを管理する時の方式について論じる。

例えば nginx の conf を管理するとして、管理しているアプリが10個ほどあり、それぞれのアプリで微妙に conf が異なるとする。

# １. テンプレート方式

その場合、典型的には nginx.conf を erb などでテンプレート化すると思う。そして、異なるパラメータを erb 内の変数で埋めたり、場合によっては、パラメータで分岐させたりする。

まぁ、普通かな、という気はするがこの方式を取ると、ロジックが入り込んで複雑怪奇、完成系が erb を見ただけで予測できない、複雑なので単体テストが必要、などの問題が生じてくる。規模が大きくなるほど複雑さが増して来る。

# ２. ファイル分離方式

そこで、提案したい設定ファイルの管理方法がファイル分離方式である。アプリごとに conf が異なるならば、ファイルをわけてしまってテンプレートは使わない。

* nginx_app1.conf
* nginx_app2.conf
* nginx_app3.conf
* nginx_common_xxx1.conf

ようなイメージ。テンプレートを使わないので、複雑なロジックが入り込まずにすむ。DRY にしたい場合は、common ファイルを作って include する。

# プロビジョニングツールで扱う場合

chef などのプロビジョニングツールで扱う場合、この方式に対してなんらかのサポートがあるわけではないが、ちょっとしたヘルパー関数を作って、conf へのパスをルールに則って生成できるようにしておくぐらいで十分賄える。
PerlでSQLiteのUTF8を自動的に扱う

タイトルの日本語に違和感があるが、気にしない方向で。

sqlite_unicode を指定するだけ。

DBD::SQLite - Self-contained RDBMS in a DBI Driver - metacpan.org
https://metacpan.org/pod/DBD::SQLite


```pl:sample.pl
use strict;
use warnings;
use DBI;
use utf8;
use open IO => qw/ :encoding(utf8) :std /;

my $dbh = DBI->connect("dbi:SQLite:dbname=test.db");
$dbh->{sqlite_unicode} = 1; # important!
$dbh->{AutoCommit}     = 0;
#initdb($dbh);
$dbh->do(q{CREATE TABLE IF NOT EXISTS user (id INTEGER PRIMARY KEY, name TEXT)});

$dbh->do(q{INSERT INTO user (name) values ('洲崎西')});
$dbh->commit;

my $sth = $dbh->prepare(q{SELECT * FROM user});
$sth->execute;
while (my $row = $sth->fetch) {
  print "$row->[0] $row->[1]\n";
}
$sth->finish;
$dbh->disconnect;

sub initdb
{
  my ($dbh) = @_;

  my %tbl;
  my $sth = $dbh->prepare(q{SELECT name FROM sqlite_master WHERE type='table'});
  $sth->execute();
  while (my $row = $sth->fetch ) {
    $tbl{$row->[0]} = 1;
  }
  $sth->finish;

  unless (exists $tbl{user}) {
    $dbh->do(q{
      CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT)
    });
  }
  return 1;
}
__END__

# sqlite_unicode無しでそのまま動かすと化けます。
$ perl test.pl
1 a´2a´?e\?
2 a´2a´?e\?
3 a´2a´?e\?

# sqlite_unicodeを定義してあげるとOK
$ perl test.pl
1 洲崎西
2 洲崎西
3 洲崎西
```
[Apache][小ネタ] 特定のURLのみ、Basic認証を外す 

今回はApacheの小ネタを紹介します。

## 特定のURLのみ、認証なしでアクセスを許可したい
### httpd.confを編集する

``` httpd.conf
# サイト全体にベーシック認証を設定
# ユーザーやパスワードは適宜変更
<Location />
  AuthType Basic
  AuthName "hogehoge"
  AuthName "id and password?"
  AuthUserFile /etc/httpd/.htpasswd
  Require valid-user
</Location>

# jpeg、pngとgif画像については、認証なしでアクセスを許可する
<LocationMatch /.+\.(jpe?g|png|gif)$> 
  Order allow,deny
  Allow from all
  Satisfy Any
</LocationMatch>
```

### ちょっと解説
「Satisfy Any」を設定すると、認証されたユーザーもしくは、
IPのどちらかで許可されれば、アクセスが可能になります。
今回は、画像系の拡張子がついたURLを全て許可するようにしました。

「Satisfy All」だと、両方の許可が必要なようです。
dockerのメトリクスをfluentdで収集してみる


## 概要

dd-agentのようにコンテナ動かしたら、ホストのメトリクス収集してくれる感じのものが欲しかったので、fluentdのプラグインを使って専用コンテナのイメージを作った。コンテナを動かすだけでホスト上のDockerコンテナのメトリクスを収集してfluentdのサーバに送ってくれる。これができるとkibanaやその他のツールを使ってdockerのメトリクスが簡単に見れて嬉しいはず。

## 使い方 (同一ホスト上にfluentdのサーバが動いている場合)

Step 1. クローンして頂いて

```bash:
$git clone https://github.com/nyamage/docker-metrics-agent.git
```

Step 2. イメージ作って頂いて

```bash:
$cd docker-metrics-agent
$docker build -t <お好きなタグ名>
```

Step 3. コンテナ起動!!

```bash:
$docker run -it --link=<fluentdのサーバが動いているコンテナの名前>:log_server --rm --name=docker_agent -v /sys/fs/cgroup:/mysys/fs/cgroup -v /var/run/docker.sock:/var/run/docker.sock <上で付けたタグ名>
```

これで定期的にDockerのメトリクスがfluentdサーバに送られるはず。

## 別ホスト上にあるfluentdサーバに送る場合

fluentd/fluent.confファイル内のserverディレクティブを編集して頂いて、
hostの先に送る先のfulentdのホスト名なりIPかけばいけるはず。
その際はdokcer run時にlinkオプションいらないです。

```
<match docker.**>
  type forward
  <server>
    host log_server
  </server>
</match>
```

## 参考URL

docker-metrics-agent
https://github.com/nyamage/docker-metrics-agent

fluent-plugin-docker-metrics
https://github.com/kiyoto/fluent-plugin-docker-metrics

Runtime Metrics
https://docs.docker.com/articles/runmetrics/
64ビットモードで32ビットDLLを呼び出せない

64 ビット プロセスは 32 ビット DLL を読み込めず、32 ビット プロセスは 64 ビット DLL を読み込めません。

いまのところプロセス間通信をすることで解決しようとしているのでメモ。

この辺りの記事が参考になった。
[MSDN]ゲーム開発者のための 64 ビット プログラミング
https://msdn.microsoft.com/ja-jp/library/ee418798(v=vs.85).aspx
Youtube用のChrome拡張機能を作る際の注意点(備忘録)

ChromeでYoutube動画ページ用の拡張機能を作る場合、manifest.jsonでcontent_scriptsのmatchesに
"https://www.youtube.com/watch*"
と動画ページのURLを設定したら拡張機能が呼び出されない場面が出てくる。
それが、Youtubeのトップページから動画ページへの遷移。
トップページにアクセスした時点では当然ながら拡張機能が呼び出されないが、トップページ内のリンクから動画ページに遷移すると、YoutubeはHistory APIを使用してページ遷移を行うためか、拡張機能が呼び出されないままとなる。
なので、ちょっと範囲外となってしまうが、matchesには
"https://www.youtube.com/*"
と設定しなければならない。
cdコマンドに"戻る"機能を追加する

※コメントでいただいたのですが、cdには-オプションがデフォで組み込まれているようです。知らなかった。。。

Gistから拾ってきただけだけど、`~/.bashrc`にこれを書けば、`cd -`で、`cd`する1個前のディレクトリに戻れる。

[replace cd in bash to (silent) pushd](https://gist.github.com/mbadran/130469)

```sh
function cd {
    if (("$#" > 0)); then
        if [ "$1" == "-" ]; then
            popd > /dev/null
        else
            pushd "$@" > /dev/null
        fi
    else
        cd $HOME
    fi
}
```

ポイントは以前、[dankogai先生の記事](http://blog.livedoor.jp/dankogai/archives/51527066.html)で、`alias cd="pushd"`しちゃえって書いてあったんだけど、そうするとプロンプトにスタックされたディレクトリが延々並んで見にくいので、`/dev/null`に捨てようという発想ですね。

あと、`-`っていうディレクトリがあると困る気がするけど、作らないと思うので利便性を優先。
Web開発時のスクリーンショット証跡取得に「Chrome+Google Drive拡張機能」が便利

ワンクリックで縦長ページも1つのPNGファイルとして保存してくれる。

![1ページ目 - タグ一覧 - Qiita.png](https://qiita-image-store.s3.amazonaws.com/0/67318/1a2c9cba-20a7-8b39-2fc7-18b3d032a555.png)

COOL.
指定した日付が何曜日か取得してみた

Objective-cで指定した日付が何曜日か取得する方法を調べたのでメモです。

初投稿ですのでお手柔らかに・・・

```objective-c:曜日取得
NSCalendar *calendar = [NSCalendar currentCalendar];
//2015年2月1日を指定
NSDateComponents* components = [[NSDateComponents alloc] init];
components.year = 2015;
components.month = 2;
components.day = 1;
//Date型で日付を取得
NSDate* date = [calendar dateFromComponents:components];

//指定した日付が何曜日か取得（1=日曜日〜7=土曜日）
components = [calendar components:NSWeekdayCalendarUnit fromDate:date];
//配列で曜日の名称をセット
NSArray *weekList = @[@"日曜",@"月曜",@"火曜",@"水曜",@"木曜",@"金曜",@"土曜"];
//配列から曜日番号を使って曜日名称を取得
NSLog(@"%@",[weekList objectAtIndex:[components weekday]-1]);
```

取得した曜日番号は日曜始まりになってるので、1=日曜日〜7=土曜日となります。  
※曜日番号が１始まりなので−１しています。

いじょーです！
Serverspec でコマンド実行のエビデンスを取得

Serverspecでインフラテストを自動化したのは良いんだけど、 RSpecのテスト結果でOKと出ただけで本当に信用して良いのか……？ という心配性の人のために、Serverspecが内部でどんなコマンドを打って、どんな出力を見て結果を判定したかを記録に残してみます。

SSHバックエンドかつ`command`,`file`,`service`リソースでしか試していません。SSHバックエンドなら大体大丈夫だと思いますが……

## 手順

普通に

```
serverspec-init
```

でSSHを選んでサンプルを作成した後、以下のファイルを作成し、

```rb:./formatters/serverspec_audit_formatter.rb
require 'rspec/core/formatters/documentation_formatter'
require 'specinfra'
require 'serverspec/version'
require 'serverspec/type/base'
require 'serverspec/type/command'
require 'fileutils'

class ServerspecAuditFormatter < RSpec::Core::Formatters::DocumentationFormatter
  RSpec::Core::Formatters.register self, :example_group_started,
                                   :example_passed, :example_pending, :example_failed

  def initialize(output)
    super
    @seq = 0
  end

  def example_group_started(notification)
    @seq = 0 if @group_level == 0
    super
  end

  def example_passed(notification)
    save_evidence(notification.example)
    super
  end

  def example_pending(notification)
    save_evidence(notification.example)
    super
  end

  def example_failed(notification)
    save_evidence(notification.example, notification.exception)
    super
  end

  def save_evidence(example, exception=nil)
    # 以下のように、トップレベルに結果ディレクトリ名として使う名称を指定する前提
    # describe "テストケース1" do
    #   describe command('hostname') do
    #     its(:stdout) { should ... }
    #   end
    # end
    name = example.example_group.top_level_description

    # 出力先ディレクトリを {ホスト名}/{テスト名}/{連番} で作成
    host = ENV['TARGET_HOST'] || Specinfra.configuration.host
    @seq += 1
    d = "audit/#{host}/#{name}/#{@seq}"
    FileUtils.mkdir_p(d)

    # 実行内容をファイル出力
    Dir.chdir(d) do
      # 実行コマンド
      File.write('command.txt', example.metadata[:command])
      # 標準出力
      File.write('stdout.txt', example.metadata[:stdout]) if example.metadata[:stdout]
      # RSpecのエラーメッセージ
      File.open('exception.txt', 'w') {|f| f.puts exception.message } if exception
      # 標準エラー出力と終了ステータス（commandリソースのみ）
      resource = example.metadata[:described_class]
      if resource.kind_of? Serverspec::Type::Command
        File.write('stderr.txt', resource.stderr) unless resource.stderr.to_s.empty?
        File.write('exit_status.txt', resource.exit_status)
      end
    end
  end
end
```

.rspec ファイルも以下のように変更します。

```:.rspec
--color
--format ServerspecAuditFormatter
--require ./formatters/serverspec_audit_formatter.rb
```

## 出力結果

この状態で以下のようなテストを流すと……

```rb:./spec/host1/sample_spec.rb
require 'spec_helper'

describe 'テストケース1' do
  describe command('hostname') do
    its(:stdout) { should match /^host1$/ }
  end
end
```

./audit/host1/テストケース1/1/ ディレクトリに、

```text:command.txt
sudo -p 'Password: ' /bin/sh -c hostname
```

```text:stdout.txt
host1<改行>
```

のような結果が保存されます。
Winshot紹介

# Winshotとは

私がよく使うツールとして、Winshotがあります。
Winshotって何者なのか…。知らない方へのご紹介です。

まず、何をするツールかというと、
Windowsでスクリーンショットを取得する為のツールです。
エビデンスを撮るのにすごく便利です。
ただ一面撮るだけでなく、自分が選択した箇所だけのスクショを撮ることが出来ます。

# 使い方

まず、ダウンロード。
[こちら](http://www.forest.impress.co.jp/library/software/winshot/)からツールのダウンロードを行います。

インストールが完了したら、exeファイルを実行し起動させます。
すると、常駐アプリケーションとして起動しますのでショートカットキーを打つだけで使用することが出来るようになります。

自分が選択した箇所だけのスクショを取得したい場合、「矩形範囲選択」！
その中でも私がよく使用するのは「Ctrl + Alt + F5」。
キーを押した後にマウスで範囲を選択するだけで、クリップボードに画像データをコピーしてくれます。
そのまま、ペイント等に貼り付け加工したり、エビデンスとして記録したりしています。

他にも様々な保存方法が用意されていて、ショートカットキーが割り当てられていますので
環境設定で確認して、自分の好みの使い方をしていただければ良いと思います。


近いうちに使用する際の画像などをUP出来たらと思います。
自分用EC2向けコマンドライン

自分が良く使うものメモ

# EC2インスタンスを作成する
```$ ec2-run-instances {ami_id} -g {security_group} -k {keypair} -t {instance_type} -z {availability_zone} --instance-initiated-shutdown-behavior {behavior}```

# EC2インスタンスの状態確認
```$ ec2-describe-instances {instance_id}```

# EC2インスタンスの停止
```$ ec2-stop-instances {instance_id}```

# EC2インスタンスの削除
```$ ec2-terminate-instances {instance_id}```

# EC2インスタンスのAMIを作成
```$ TODO```

# ELBの作成
```$ TODO```

# ELBにEC2インスタンスを紐付ける
```$ elb-register-instances-with-lb {elb_name} --instances {instance_id}```

# ELBからEC2インスタンスの紐付けを外す
```$ elb-deregister-instances-from-lb {elb_name} --instances {instance_id}```

# ELBに紐付いているEC2インスタンスの状態確認
```$ elb-describe-instance-health {elb_name}```

# EIPの取得
```$ ec2-allocate-address --region {region}```

# EIPをEC2インスタンスに割り当てる
```$ ec2-associate-address -i {instance_id} {eip}```

# EC2インスタンスからEIPの割り当てを解除する
```$ ec2-disassociate-address {eip}```

# EIPを解放する
```$ec2-release-address {eip}```
Mock化したクラスのブレークポイントが機能しない場合の対応策

# 概要
テストを書く際に、テスト対象クラスのメソッドをモック化したテストを
作成することがあるかと思います。

その際にテスト対象クラスにブレークポイントを貼っても、
そこで止まってくれないことに悩んでいたのですが、
対応策が判明したのでこちらに書いてみます。

# 環境
testng 6.8.8
jmockit 1.7

# 手順
## 止まらない場合
下記のようにテスト対象クラスにブレークポイントを貼ってデバッグ実行しても、ブレークポイントで止まりません。
![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/53590/e9282d5f-e2a5-7a1b-2e23-a42886f0344c.jpeg)

## 対応手順
1. ブレークポイントを貼りたい部分を呼び出す前の個所にブレークポイントを貼ります。
![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/53590/d77299c4-7c7b-5a56-31ae-327bbb270d25.jpeg)
2. デバッグ実行してブレークポイントを貼った個所で止めます。
![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/53590/aeaa8e13-a320-7a30-a3fe-e4e52896086d.jpeg)
3. ブレークポイントで止まった状態で、テスト対象クラスにブレークポイントを貼ります。
![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/53590/d957469b-5518-e536-b08e-174236a41611.jpeg)
4. 処理を再開すると、テスト対象クラスのブレークポイントで止まります。
![WS000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/53590/23afb952-50d4-7f69-26c4-e437884db941.jpeg)
Redisデータバックアップ方法

最近Redisのデータバックアップをしたのでメモ。

### :new_moon_with_face:バックアップ
1.データバックアップ('OK'と帰ってきたら完了)
`redis-cli save`
※saveコマンド実行中は他の処理が行われなくなるので、bgsaveを使う方が良さそう。
　1.`redis-cli bgsave`
　　※終了したかどうかはlastsaveを使って確認する。
　2.`redis-cli lastsave`
　　※値が代わったかどうかを確認する。

2.バックアップファイル名をリネーム(わかりやすいように)
`mv dump.rdb backup.rdb`

3.作成したファイルを安全な場所に退避して終了(リブートやクラッシュしても消えない場所に)
***
### :full_moon_with_face: バックアップデータからの復旧
1.Redisを停止する
`/etc/init.d/redis stop`

2.バックアップしたファイルに差し替える
`mv backup.rdb dump.rdb`

3.Redisを起動する
`/etc/init.d/redis start`
英語圏での入力チェックのエラーメッセージについて

英語圏向けの人に向けてのサイト作っている時に入力チェックの英語表記がわからなく調べた時のメモです。
英語圏のメジャーなサイトの表記で確認しました。
誤りなどある時はご連絡いただけると幸いです
(1)必須チェック
yahoo.com →　This information is required
twiiter.com　→　An email is required!
(2)メールアドレスチェック(yahooは@の前のみ)
yahoo.com →　Only letters, numbers, underscores, and one dot (.) are allowed
facebook.com　→　Please enter a valid email address.
twiiter.com　→　Doesn’t look like a valid email.
(3)電話番号チェック
yahoo.com →　This is not a valid mobile number
(4)パスワード不一致
yahoo.com →　The passwords you entered do not match. Please try again.
(5)パスワードは○文字以上●文字以下チェック
yahoo.com →　Your password must be 6 to 32 characters long
twiiter.com　→　Password must be at least 6 characters.
※Twitterはパスワードの上限がないと思われます
(6)メールアドレス既登録
facebook.com　→　xxxxx@xxxxx belongs to an existing account.
twiiter.com　→　This email is already registered.
(7)ID既登録
yahoo.com →　This ID is not available
twiiter.com →　This username is already taken!
(8)日付不正
yahoo.com →　This is an invalid date
(9)すべての項目が必須
facebook.com　→　You must fill in all of the fields.
SAStruts + S2JDBC + SQLServerで指定テーブルのIDENTITYを取得する

`public abstract class BaseService<T> extends S2AbstractService<T> {
    /**
     * 与えられたテーブルのIDENTITYを取得する。
    *
    * @return
    */
   public Integer getLastId(String tableName) {
       Integer lastId=
               jdbcManager
                   .selectBySql(
                       Integer.class,
                       "SELECT IDENT_CURRENT('"+tableName+"');")
                   .getSingleResult();
       return lastId;
   }
}`