OmniAICreator/Qiita-1.07M huggingface dataset:
bottlejsでDIを試す

http://dev.jgs.me/posts/dependency-injection-in-node-js/ のミラーです。

https://github.com/young-steveo/bottlejs

# tl;dr

* `bottlejs` を使うと最小構成ぐらいの DI ができる
* 依存しているモジュールやライブラリをきれいにまとめて扱えるようになるので便利
* 記述量が増えたり、呼び出し元で呼び出すモジュールの依存関係を把握してないといけなくなったりするデメリットもある

# BottleJS について

BottleJS は Javascript/Node.js の DI の micro container だ。

```js
var Barley = function() {};
var Hops = function() {};
var Water = function() {};
var Beer = function(barley, hops, water) { /* A beer service, :yum: */ };
```

これで

```js
var bottle = new Bottle();
bottle.service('Barley', Barley);
bottle.service('Hops', Hops);
bottle.service('Water', Water);
bottle.service('Beer', Beer, 'Barley', 'Hops', 'Water');
```

こういうことができるようになるらしい。サンプルコードがモジュールの名前ともマッチしていてすげーよかったので試してみることにした。

試してみると、Node.js で抱えるいくつかの問題を解決できることに気付いたので試しにこれに乗っかってコードを書いてみている。

# いいところ

## テストでモックを作るのが楽になる

例えば、`request` とかを使って外部と通信するようなモジュールをテストする場合、`sinon` とかで `fakeserver` を作ったりして試すことになるとおもうんだけど、そもそも `request` 自体を差し替え可能にしておくことでこれをしなくてよくなる。

```coffee
module.exports = class Some
  constructor: (@request)->

  get: (url)->
    @request url, (err, res, body)-> # ...
```

というような `lib/some.coffee` を用意して

```coffee
bottle = new Bottle()
bottle.service 'request', -> require 'request'
bottle.service 'Some', require('./lib/some'), 'request'

bottle.container.Some.get url
```

とすることで `request` を注入することができる。テストでは

```coffee

describe 'Some', ->
  it 'blah blah', ->
    bottle = new Bottle()
    bottle.service 'request', -> (str, callback)-> callback null, null, 'fake response'
    bottle.service 'Some', require('./lib/some'), 'request'
    bottle.container.Some.get # ...
```

みたいな感じでテストを書けるようになる。`request` がエラったときを試したいときは

```coffee
bottle.service 'request', -> (str, callback)-> callback new Error('blah')
```

というようにしてやれば強制的にエラーを発生させて挙動を確認することができる。

## `require` が相対パスで解決されるのが困る問題をちょっと緩和できる

node.js の `require` はモジュール名でない場合相対パスで解決されるので「あれ？あのモジュールってこのファイルからだとどうなるんだっけ...」みたいなのが発生する。これが `bottlejs` だと依存モジュールをその場で呼び出すことになるのでちょっと緩和できる(とおもう)。

```
|--- index.coffee
|--- client
     |--- model
          |--- some.coffee
     |--- controller
          |--- some.coffee
|--- util
     |--- some.coffee
```

というような構成だったときに

```coffee
module.exports = class SomeController
  constructor: ->
    @model = require '../model/some'
    @someutil  = require '../../util/some'
```

みたいな感じだったやつが、`SomeController` 側では

```coffee
module.exports = class SomeController
  constructor: (@model, @someutil)->
```

でよくなって、これを使うコード中で

```coffee
bottle = new Bottle()
bottle.service 'SomeUtil', require './util/some'
bottle.service 'SomeModel', require './client/model/some'
bottle.service 'SomeController', require './client/controller/some', 'SomeModel', 'SomeUtil'
```

としてやればよくなる。

## CoffeeScript の class 構文と相性がよさそう

上にも書いてきた通り、`constructor` に依存の解決系を書いて各メソッドでそれらを使ったコードを書くみたいな感じで書けるのでスッキリしていい。

# よくないところ

## 記述することは増える

`bottle =...` みたいな依存管理系のコードが増えるので記述量自体は増えるとおもう。

## いちいちモジュールの依存まわりを呼び出し元が知ってないといけなくなる

モジュールで `require` していれば、呼び出し元がそのモジュールがどんなモジュールに依存してるかを知らなくても呼び出すことができるが、上のようなコードスタイルにすると呼び出す前に依存を解決しないといけなくなるので呼び出すモジュールがなにに依存してるか確認してそれを注入してやらないといけなくなる手間が発生する。

もうしばらく使ってみたいとおもいます。
Ubuntuでのresolv.confの扱い


ubuntu 12.04 からは、`/etc/resolv.conf`で直接編集は行なわない。

`/etc/network/interfaces`で以下のように設定する。

```text:/etc/network/interfaces
dns-nameservers 8.8.8.8
```

再起動で設定が反映される。

```bash:shell
sudo service networking restart
```

`dns-nameservers`の設定は不要だろうと思って消してしまい、
しばらく経って設定が更新されたタイミングで、名前解決ができなくなってしまってハマった。


# 参考

ubuntu での /etc/resolv.conf の設定
http://d.hatena.ne.jp/yamionp/20131231/1388510334
Scalaのリフレクションでメソッド一覧をテキスト出力


# 目的

Scala 2.10から、メタプログラミングの一種であるリフレクション機能が入っています。
[Reflection - 概要 - Scala Documentation](http://docs.scala-lang.org/ja/overviews/reflection/overview.html)

```scala
import scala.reflect.runtime.universe._
```

宇宙をインポートとか熱いですね……！

遊んでみたかったので、型を与えると簡易ScalaDocを出力するようなもの、つまり、

```scala
printMethods[List[Int]]
```

とすると、[Scala Standard Library 2.11.2 - List](http://www.scala-lang.org/api/2.11.2/#scala.collection.immutable.List) のメソッド抜粋のような感じで、

```scala
...
addString(b: StringBuilder): StringBuilder
addString(b: StringBuilder, sep: String): StringBuilder
addString(b: StringBuilder, start: String, sep: String, end: String): StringBuilder
aggregate[B](z: => B)(seqop: (B, A) => B, combop: (B, B) => B): B
andThen[C](k: B => C): PartialFunction[A,C]
apply(n: Int): A
applyOrElse[A1][B1](x: A1, default: A1 => B1): B1
asInstanceOf[T0]: T0
...
```

を出力するものを、Scala2.11で書いてみました。
ただし、型パラメータのlower/upper boundの取得方法が分からずじまい……。

# コード

リフレクションはまだEXPERIMENTALな機能なので、Scala 2.12以上では動かなくなるかも。
2.10で書いたコードを2.11に上げたら、deprecatedになっているものが幾つかありました。

```scala:HelloUniverse.scala
object HelloUniverse extends App {

  implicit class RichList[T](self: List[T]) {
    def mkStringIfNonEmpty[T](start: String,
                              seq: String,
                              end: String): String =
      if (self.nonEmpty) self.mkString(start, seq, end)
      else ""
  }

  import scala.reflect.runtime.universe._

  def paramToString(param: Symbol): String =
    (if (param.isImplicit) "implicit " else "") +
      param.name +
      ": " +
      param.typeSignature

  def methodToString(method: MethodSymbol): String =
    method.name.decodedName +
      method.typeParams.map(
        _.name
      ).mkStringIfNonEmpty("[", "][", "]") +
      method.paramLists.map(
        _.map(paramToString).mkString(", ")
      ).mkStringIfNonEmpty("(", ")(", ")") +
      ": " +
      method.returnType

  def printMethods[T: TypeTag] =
    typeOf[T].
      members.
      filter(_.isMethod).
      map(_.asMethod).
      map(methodToString).
      toArray.
      sorted.
      foreach(println)

  printMethods[List[Int]]
}
```

```scala:build.properties
sbt.version=0.13.6
```

```scala:build.sbt
name := "hello_universe"

version := "1.0"

scalaVersion := "2.11.2"

libraryDependencies += "org.scala-lang" % "scala-reflect" % scalaVersion.value
```
ember.js 参考サイト

http://blog.lingualbox.jp/resources-for-starting-emberjs/


## rails + ember.js
http://kbarrett.com/blog/2014/03/24/authentication-with-ember-rails.html

http://hashrocket.com/blog/posts/setting-up-an-ember-app-with-a-rails-backend

## ember.js infinite-scroll
https://github.com/bantic/ember-infinite-scroll

## チュートリアル
http://www.embercasts.com/

## 参考コード
https://github.com/balanced/balanced-dashboard

## ブログ
https://emberflare.com/entries
sublime text 3 + kotlin で Hello World

最近、恋するエディタとして知った*Sublime Text*と、
Java仮想マシン上で動作する *Kotlin* というの知り。
なら、Sublime Text で Kotlin をコンパイル→実行出来たら便利だよな？
それじゃ、定番の Hello World でも。とやってみました。

###前提条件
　対象：Windows
　Java 導入済み
　Sublime Text 3 導入済み

###Kotlin コンパイラの導入

　※ 導入済みの方は、無視して次へ進んで下さい。

　[GitHub - JetBrains/Kotlin](https://github.com/JetBrains/kotlin/releases/tag/build-0.8.11) に kotlin-compiler-バージョン.zip がありますので、ダウンロードします。
(これを書いてる時点で、バージョンは0.8.11)

　ダウンロードしたzipファイルを、ここでは、Cドライブのルートに解凍します。
(解凍すると、kotlincフォルダがあり、その先に複数のフォルダとファイルがあります)

> コンパイルに kotlinc\bin\kotlinc-jvm.bat を使用します。
> 環境変数 PATH に追加する必要はありません。
> 説明における便宜上、Cドライブのルートとしましたが。どこでも構わないみたいです。


###Sublime Text のビルドシステムに追加する

　Sublime Text を起動し、メニュー「Tools」→「Build System」→「New Build System･･･」をクリックします。

　すると、新規で untitled.sublime-build が開きますので、以下のコードを入力します。

```json

{
	"shell_cmd": "C:\\kotlinc\\bin\\kotlinc-jvm.bat $file -jar $file_path\\\\$file_base_name.jar",
	"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
	"working_dir": "$file_path",
	"selector": "source.Kotlin",
	"windows":{
		// [Decode error - output not utf-8] ←への対処
		"encoding": "cp932",		
	},

	"variants": [
		{
			"name":"Run",
			"shell_cmd": "java -classpath $file_path\\\\$file_base_name.jar;C:\\kotlinc\\lib\\kotlin-runtime.jar _DefaultPackage"
		}
	]

}
```
> 出力に日本語を使用してると、コンパイル時に [Decode error - output not utf-8] と表示される事があります。
> そこで、encodingを指定し、エンコードしてやります。


　これを **Kotlin.sublime-build** というファイル名で保存します。
※ 保存場所は ～\package\user の下で構いません。

　メニュー「Tools」→「Build System」に **Kotlin** が追加されてるので、これをクリックします(チェックが付きます)。
(もし、無ければ。Sublime Text を再起動してみて下さい)

> ファイルに保存されたKotlinソース(.kt)なら、Automaticでも構いません。
> selectorに設定する形式ですが、[ALT]+[SHIFT]+[CTRL]+P にて、ステータスバーに表示されます。


###Hello World を作成 → コンパイル → 実行まで
　早速 Kotlin で Hello World を作成し、コンパイル→実行してみましょう。

　新規にファイルを作成（ [CTRL]+N ）し、

```kotlin


fun main(args : Array<String>) {
  println("Hello World!")
}
```
　これを適当なファイル名(ex:kotlinHelloWorld.kt)で保存します。

　では、コンパイルしてみましょう。
　・メニュー「Tools」→「Build」（ [CTRL]+B ）
　(正常にコンパイルが終わると、ファイルを保存したフォルダに ～.jar が作成されます)

　コンパイルが終われば、実行してみましょう
　・メニュー「Tools」→「Run」（ [SHIFT]+[CTRL]+B ）


　ビルド結果に Hello World! と表示されたら完了です(お疲れ様でした)。
　

###参考
[Project Kotlin - Working with the Command Line Compiler](http://kotlinlang.org/docs/tutorials/command-line.html)

[Sublime Text - Build Systems](http://sublime-text-unofficial-documentation.readthedocs.org/en/latest/reference/build_systems.html)


* * *
###あとがき ．．．みたいなもの

　初めて投稿してみましたが。分かり易く＋簡潔に書くって難しいですね。
　もっとフランクに書いても良かったのかなー。

　ネットで見る限りでは、Macで使ってる方が多い印象ですね。
　「それが知りたい」→Macでは～。Windowsでは、どーすんだ？
　が結構あった気がします。

　最後に。他にも、もっと良い方法は色々とあるかと思います。
　その一案として見て頂ければなぁ、、、と。
ユーザ情報更新時のhas_secure_passwordによるパスワードチェックの回避

## ユーザ情報更新時にpasswordチェックを回避したい
非常に便利なhas_secure_password。
でもupdate時に必ずパスワード確認するっぽく、パスワード情報をいれないと他のデータの更新ができないっぽい。
管理者権限でユーザ情報の更新をしたいので、create時のみパスワードを設定するよう変更したい。


``` app/model/user.rb
has_secure_password
validates :password, length:{minimum:6}, confirmation: true, on: :create
```

## 参考
http://stackoverflow.com/questions/20475333/rails-update-attributes-using-has-secure-password
RailsでPunditとshoulda-matchersを併用して、Rspecのcustom matchersが被った


Punditとshoulda-matchersにはpermitという同名のカスタムマッチャーがあって、衝突してしまう。

ので、punditのpermitは、spec_helper.rbでのrequire "pundit/rspec"をやめて、punditのカスタムマッチャーのpermitを使いたい個別のspecファイル、例えばuser_policy_spec.rbで、require "pundit/rspec"して解決した。
アニメーションするAndroidアプリを開発する時に気をつける3つの端末設定

開発者向けオプションの

* ウィンドウアニメスケール
* トランジションアニメスケール
* Animator再生時間スケール

が「アニメーションオフ」になっていると超ハマるので、全部「アニメーションスケール1x」にしましょう。
Nibファイルなどのプレビュー機能


地味なところにあってやり方を忘れそうなのでメモ

1. 任意のnib や storyboard ファイルを開き、Assistant Editor 状態にし、右のViewのナビゲーションからPreview を選び、表示したい nib や storyboard を選択する。

![スクリーンショット 2014-10-08 17.46.50（2）.png](https://qiita-image-store.s3.amazonaws.com/0/1054/b0f5045b-2b9a-282a-2e69-a4f53ff015a3.png "スクリーンショット 2014-10-08 17.46.50（2）.png")

2. 表示すれば、デフォルト状態が 4-inch iPhone なので、下の「＋」から任意のウィンドウサイズを選んで表示すれば、プレビューが増える

![スクリーンショット 2014-10-08 17.46.58（2）.png](https://qiita-image-store.s3.amazonaws.com/0/1054/df88c270-8711-e28e-a631-f2d384d41795.png "スクリーンショット 2014-10-08 17.46.58（2）.png")


![スクリーンショット 2014-10-08 17.47.50（2）.png](https://qiita-image-store.s3.amazonaws.com/0/1054/6acc6eab-a712-b366-8b07-9dc5c066a176.png "スクリーンショット 2014-10-08 17.47.50（2）.png")

編集などは即時受けつけるので、その状態のままで位置ずれなどを直していく気配。


## 参考

https://developer.apple.com/swift/blog/?id=16
ArelでLEFT JOIN + SELECT句


includesを使ってleft joinした時にselect句がうまく動かずpostgresqlで
group byが使えなかったので、arelでやってみる。

親クラス

```ruby:group.rb
class Group < ActiveRecord::Base
  self.primary_key = :code
  has_many :users, primary_key: :code, foreign_key: :group_code
end
```

子クラス

```ruby:user.rb
class User < ActiveRecord::Base
  belongs_to :group, primary_key: :code, foreign_key: :group_code
end
```


###includesとreferencesで取得してみた結果

```ruby
Group.includes(:users).references(:users).
	select("groups.code , groups.name , avg(age) as avg_age").group("groups.code , groups.name")

=> SQL (0.7ms)  SELECT groups.code , groups.name , avg(age) as avg_age, "groups"."code" AS t0_r0, "groups"."name" AS t0_r1, "groups"."created_at" AS t0_r2, "groups"."updated_at" AS t0_r3, "users"."id" AS t1_r0, "users"."name" AS t1_r1, "users"."age" AS t1_r2, "users"."prefecture" AS t1_r3, "users"."created_at" AS t1_r4, "users"."updated_at" AS t1_r5, "users"."group_code" AS t1_r6 FROM "groups" LEFT OUTER JOIN "users" ON "users"."group_code" = "groups"."code" GROUP BY code

PG::GroupingError: ERROR:  column "users.id" must appear in the GROUP BY clause or be used in an aggregate function
```

全カラムがselectされ、グルーピングできないと怒られる。


### arelを使って取得した結果

```ruby
group = Group.arel_table
user = User.arel_table

# Arelでjoinの条件を設定
join_condition = group.join(user, Arel::Nodes::OuterJoin).
              on(group[:code].eq(user[:group_code])).join_sources

test = Group.joins(join_condition).group(:prefecture, :code).
            select(group[:code], group[:name], user[:age].average.as('avg_age'))

  Group Load (0.8ms)  SELECT "groups"."code", "groups"."name", AVG("users"."age") AS avg_age FROM "groups" LEFT OUTER JOIN "users" ON "groups"."code" = "users"."group_code" GROUP BY prefecture, code
=> #<ActiveRecord::Relation [#<Group code: "A3", name: "グループ3">, #<Group code: "A1", name: "グループ1">, #<Group code: "A2", name: "グループ2">]>

test[1].avg_age.to_i
=> 21

```

ややこしいけどなんとか取得できた。
Android で VPN 接続する

Android で VPN に接続するには、2 つの方法があります。

## 1. Android の設定で VPN に接続する

PPTP、L2TP/IPSec(PSK or RSA)、IPSec Xauth(PSK or RSA)、IPSec Hybrid RSA のいずれかのタイプであれば、こちらで設定するほうが、高速かつ簡単に VPN へ接続できます。

設定アプリから、"無線とネットワーク"カテゴリ内の"その他…"を選び、"VPN"を選択すると、設定した VPN サーバの一覧が表示されます。もし、デバイスのセキュリティの設定を何もしていない場合、パターンロック、PIN ロック、パスワードロックのいずれかを設定するように促されますので、指示通り設定を済ませます。

VPN サーバは[こちら](http://www.vpngate.net/ja/)などを参考に設定しましょう。

ただし、一部のネットワークではこのプロトコルで接続できない場合があります。その場合は、以下の OpenVPN を用いた接続方法を試すことになります。

## 2. アプリを使用して VPN に接続する

アプリを使用して接続する方法もあり、こちらは OpenVPN プロトコルを用いた VPN 接続になります。前述の方法に比べ低速にはなりますが、アプリが設定ファイルを読み込むようにしている場合、比較的簡単に設定をすることができます。

OpenVPN プロトコルに対応した VPN 接続のアプリには、「[OpenVPN Connect](https://play.google.com/store/apps/details?id=net.openvpn.openvpn&hl=ja)」や「[OpenVPN for Android](https://play.google.com/store/apps/details?id=de.blinkt.openvpn&hl=ja)」などがあります。

これらのアプリをインストールした後、[こちら](http://www.vpngate.net/ja/)にあるような OpenVPN 設定ファイルをダウンロードし、ファイルを開くと、アプリが立ち上がるはずです。その後はアプリの指示にしたがって接続するだけです。
diff コマンド見辛かった


ある日突然「diffってみづらい！」と思ったので調べてdiff力アップ入門してみました。初歩的な内容です。

## 標準のまま

![97a384b2e99d90139cbf07291055941a.png](https://qiita-image-store.s3.amazonaws.com/0/29871/425a8bb8-a954-8244-7333-304575d8cc75.png "97a384b2e99d90139cbf07291055941a.png")




## colordiff入れる


![8a8d5426e86715b7795fc924ff97ce4f.png](https://qiita-image-store.s3.amazonaws.com/0/29871/2f9efc7f-9dc8-e86b-ffb3-7fbb9ccafb58.png "8a8d5426e86715b7795fc924ff97ce4f.png")

これだけでもずいぶん変わりました。とりあえずcolordiff採用。
diff にaliasを貼ります。

```.zshrc
if [[ -x `which colordiff` ]]; then
  alias diff='colordiff'
fi
```

## -u オプションをつける

diffに-uオプションをつけるとgitで見覚えるのある感じになりました。unified形式っていうらしいです。

```
diff -u file1 file2
```

![851e836aa0b7f9d4806830ffb7f056c5.png](https://qiita-image-store.s3.amazonaws.com/0/29871/3634910d-d912-b15b-e66f-afe1fbf0e1f9.png "851e836aa0b7f9d4806830ffb7f056c5.png")


## -y オプションをつける

diffに-yオプションをつけるとファイル内容を左右に並べて比較表示してくれました。
差分のある部分は|や\>などで目印つきつつ、colordiffなら色がつきます。

![ec155a9e29bcc963a0cf50a17e11b4d9.png](https://qiita-image-store.s3.amazonaws.com/0/29871/a3235ba0-de1b-2512-d168-c3595b00dc98.png "ec155a9e29bcc963a0cf50a17e11b4d9.png")

ちなみにこの出力をlessに渡すと盛大に文字化けしました。`colordiff -y file1 file2 | less -R`とすればよいらしいです。

.colordiffrcで色設定も変更できます。

```.colordiffrc
banner=no
color_patches=no

plain=off
newtext=green
oldtext=cyan
diffstuff=yellow
cvsstuff=white
```

## -y --suppress-common-lines をつける

`-y`オプションにさらに`--suppress-common-lines`オプションをつけると変更のある行だけを表示してくれます。
思い切りばっさりと関係ない行を消してくれるのですが、こんどは情報が少なすぎる感が・・・。
これに行番号表示できないですかね。

![b46b234278548202e42b4a9fd59039d4.png](https://qiita-image-store.s3.amazonaws.com/0/29871/cd869024-a439-605d-270c-2ca3495321c3.png "b46b234278548202e42b4a9fd59039d4.png")

--suppress-common-linesオプションを覚えるのは厳しいので
`alias diff='diff -y --suppress-common-lines'` とalias設定したらオプションの競合で`diff -u`が使えなくなってしまったので
`alias diffy='diff -y --suppress-common-lines'` とalias設定しました。

## 番外 vimdiffを使う

vimに標準でvimdiffというものがついてるのを知りませんでした。
見た目も使い勝手も良い感じだと思います。

```
% vimdiff file1 file2
# もしくは
% vim -d file1 file2
```



![ed29bc92e73df3235cb04ab1369b3784.png](https://qiita-image-store.s3.amazonaws.com/0/29871/c466a231-6a5b-4f2a-562f-7bcf132a0b6a.png "ed29bc92e73df3235cb04ab1369b3784.png")


|キー | 操作 |
|--------|--------|
|dp|左の差分を右へマージ|
|do|右の差分を左へマージ|
|]-c|次の差分へジャンプ|
|[-c|前の差分へジャンプ|
MAMPのMySQLにターミナルで接続する方法



MAMPのコマンド群は

Library/bin/

に格納されている

つまりそこでMySQLのコマンドを打てばよい

```
$ cd /Applications/MAMP/Library/bin/
```

```
$ ./mysql -u root -p
```

と打ち込んでパスワードを打つ

これでオッケー
Laravelにおける認証パッケージ Sentry2 まわりの情報を Linkedin のフォーラムで調べていた

========

[Sentry 2 or Confide + Entrust for User Management and protection? | LinkedIn](http://www.linkedin.com/groups/Sentry-2-Confide-Entrust-User-4419933.S.5914084885521248260?trk=groups_search_item_list-0-b-ttl&goback=%2Egna_4419933)
--------

> Enrique Becerra
> Web Applications Developer - Coordinación de Gobierno Electrónico - Secretaría de la Gestión Pública
> 
> Hi people. Did anyone try the following? https://github.com/intrip/laravel-authentication-acl

で見つけたのが、

[intrip/laravel-authentication-acl](https://github.com/intrip/laravel-authentication-acl)
> Laravel authentication and ACL admin panel package based on sentry

Sentryを元にしたパッケージみたい。

[ドキュメント](https://github.com/intrip/laravel-authentication-acl/blob/1.1/docs/index.md) によると、 **Dashboard** 付きとのこと。


[I wrote a Multiple Authentication package for Laravel | LinkedIn](http://www.linkedin.com/groups/I-wrote-Multiple-Authentication-package-4419933.S.5817655979646414850?trk=groups_search_item_list-0-b-ttl&goback=%2Egna_4419933)
--------
で見つけたのが、

- [ollieread/multiauth](https://github.com/ollieread/multiauth)

ユーザータイプごとにテーブルを分ける用途向けなのかな。

> Ariel Dorol
> Concepteur / Développeur Web Freelance
> 
> you could have used Sentry Package for Laravel 4 it already does it and has a lot of more features.

というコメントに対して、

> Ollie Read
> Web Developer at Ollie's Lab
> 
> To my knowledge, Sentry doesn't do this. In fact, I just checked the documentation and there is absolutely no mention of allowing multiple user types, each with their own table. It also doesn't allow you to authenticate each user type using a different driver.

と返答している。

あと、認証に関係ないけど
--------
[Laravel News - News and information about Laravel](http://laravel-news.com/) ニュースで見つけたのが、

- [BioDesignRealWorld/LaravelDatabaseDesigner](https://github.com/BioDesignRealWorld/LaravelDatabaseDesigner)

ER図とか描けるデータベースデザイナーなのかな。
こんなときにはansible


## そもそも

そういえばたくさんサーバをお守りしてる！
お守りしているサーバのbashの状況をいっぺんに確認したい！

こんなとき、さくっと出来るのはansible。

### bashバージョンの確認：

CentOSの場合ですが...

```
% ansible  SERVER_GROUP -a "rpm -qa bash"
```


### 脆弱性の確認：

```
% ansible SERVER_GROUP -a "env x='() { :;}; echo vulnerable' bash -c \"echo this is a test\""
```
- SERVER_GROUP には、インベントリファイルに設定したホストを指定。
- もしくは、個別のサーバ名を指定。

### ダメな場合：

```
% ansible MY_SERVERS -a "env x='() { :;}; echo vulnerable' bash -c \"echo this is a test\""
my-server1.com | success | rc=0 >>
vulnerable
this is a test

my-server2.com | success | rc=0 >>
vulnerable
this is a test

# ... こういうのが続きます...

```

可能なら、これも -a "yum update -y bash" しましょう。
cocoapodsのインストールの仕方

iOS開発では外部のモジュールを利用するときにCocoaPodsを利用する

###１.ターミナルを開きます


###2.以下のコマンドを打って、Cocoapodsを導入する
```
$ sudo gem install cocoapods
$pod setup
```

これでCocoapodsが利用可能となる

###3.導入したいアプリのxcodeprojectがあるディレクトリに移動する
例)
```
$ cd /Xcode/sample
```


###4.Podfileというファイルを作る
```
$vi Podfile
```

###5.ファイルの中身は以下のように書く

```Podfile
platform :ios, '5.0'

pod 'AFNetworking', '~> 1.0'

```

**platform:(OSのバージョン、iosとosxが指定可能)**

**pod '導入したいライブラリ名','バージョンなど'**

とする

ちなみに

ローカルのライブラリを使うとき

```PodFile
pod 'MyLibrary', :local => 'path/to/libary'
```

githubのライブラリを使うとき

```PodFile
pod 'AFNetworking', :git => 'https://github.com/gowalla/AFNetworking.git'
```

らしい

###6.同じディレクトリで以下のコマンド

```
$ pod install
```

とするとインストールされる。
そしてsample.xcodeproj から sample.xcworkspace に変更される。

sample.xcworkspaceを開くとライブラリが使えるようになっています。

###7.ソースコードの中へライブラリをインポート

最後にインポートするのも忘れずに

```sample.xcworkspace
#import <AFNetworking.h>
```
<br>
以上。
<br>

***
<br>
参照先はここらへんです。

mixi-iOStraining
https://github.com/mixi-inc/iOSTraining/wiki/10.2-CocoaPods
<br>
hatena text
https://github.com/hatena/Hatena-Textbook/blob/master/ios-app-development-with-web-api.md
Jacksonでインタフェースと実装クラスがわかれているときにデシリアライズする方法


インタフェースクラス(`Child.class`)と、実装クラス(`ChildImpl.class`)がわかれているとき、そのままデシリアライズしようとすると、


```java
public class DeserTest {

  static interface Child {
    public String getMemo();
    public void setMemo(String memo);
  }

  static class ChildImpl implements Child {
    private String memo;

    public String getMemo() {  return memo;  }
    public void setMemo(String memo) {  this.memo = memo;  }
  }

  static class HogeBean {
    private int id;
    private String name;
    private URL url;
    private List<Child> list;
    private Map<Integer, Child> map;

    public List<Child> getList() {  return list;  }
    public void setList(List<Child> list) {  this.list = list;  }
    public Map<Integer, Child> getMap() {  return map;  }
    public void setMap(Map<Integer, Child> map) {  this.map = map;  }
    public int getId() {  return id;  }
    private void setId(int id) {  this.id = id;  }
    public String getName() {  return name;  }
    public void setName(String name) {  this.name = name;  }
    public URL getUrl() {  return url;  }
    public void setUrl(URL url) {  this.url = url;  }
  }
  public static void main(String[] args) throws Exception {
    String text =
      "{\"list\":[{\"memo\":\"めもですが\"},{\"memo\":\"めもですが22\"},{\"memo\":123}],"
          + "\"id\":-773504340,"
          + "\"name\":\"あい　うえ男\","
          + "\"url\":\"http://www.hoge.co.jp\","
          + "\"map\":{\"999\":{\"memo\":\"map-999\"},\"222\":{\"memo\":\"map-222\"}}"
          + "}";

    ObjectMapper mapper = new ObjectMapper();
    HogeBean obj = mapper.readValue(text, HogeBean.class);
  }
}
```

インタフェースクラスをインスタンス化しようとするので、例外がスローされる。

```
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: 
 Can not construct instance of DeserTest$Child, problem: abstract types either 
 need to be mapped to concrete types, have custom deserializer,
 or be instantiated with additional type information
```

このようなときは、[Java Bean がインターフェースと実装に分離している場合](http://qiita.com/sunny4381/items/4f95e7443bea0716d135)にあるように、`@JsonTypeInfo`アノテーションを使って対応できる。

けれど、ソースに手を入れてアノテーションを設定することができないこともある。`@JsonTypeInfo`アノテーションを使わずに、Childインタフェースの実装クラスはChildImplクラスであることをObjectMapperに伝えるには`SimpleModule#addAbstractTypeMapping()`を使うといいようだ。

```java
import com.fasterxml.jackson.databind.module.SimpleModule;
...
    SimpleModule module = new SimpleModule();
    module.addAbstractTypeMapping(Child.class, ChildImpl.class);
    mapper.registerModule(module);

    HogeBean obj = mapper.readValue(text, HogeBean.class);
    System.out.println(obj.getMap());
    System.out.println(obj.getMap().getClass());
```

結果
 {999=DeserTest\$ChildImpl@35af4d51, 222=DeserTest$ChildImpl@7fd1c60}
 class java.util.LinkedHashMap

Mapインタフェースの実装をHashMapクラスに設定すると、当然そうなる。

```java
    SimpleModule module = new SimpleModule();
    module.addAbstractTypeMapping(Child.class, ChildImpl.class);
    module.addAbstractTypeMapping(Map.class, HashMap.class);
    mapper.registerModule(module);
    ...
```

結果
 {222=DeserTest\$ChildImpl@1f78a4e8, 999=DeserTest$ChildImpl@29928b7c}
 class java.util.HashMap
Circular dependency detected while autoloading constant を防止する 

Capybara で Integration test を行う際にフロントエンド側で複数の Ajax リクエストが発行されるとテスト用に起動された Webrick がマルチスレッドで動いてしまい 同時に autolad_path にあるクラスやモジュール (e.g. concerns/*) の解決が行われてしまいエラーとなる場合がある

上記事象を避けるには以下の設定を追加する必要がある

``` ruby:config/environments/test.rb
  config.allow_concurrency = false
```

参考:
https://github.com/rails/rails/issues/15089#issuecomment-56104328
http://y-yagi.hatenablog.com/entry/2014/09/20/073819
reloadable html5Mode with yeoman/generator-angular

# Goal

html5Mode時に、`/`以外のパスでリロードしてもページが正しく表示される。

# 問題点

* パスが`/`ではないので、リロードで404
* jsファイルなどは相対パスで書かれているので404

# 解決策

#### html5Modeを有効化

```js:app.config.js
angular
  .module('angularApp')
  .config(['$locationProvider', function($locationProvider) {
    $locationProvider.html5Mode(true);
  }]);
```

#### index.htmlへrewrite
[stereokaiのsnippet](https://github.com/yeoman/generator-angular/issues/433#issuecomment-49456692)をGruntfile.jsへ追加。

#### install connect-modrewrite
```
$ npm install --save-dev connect-modrewrite
```

#### base hrefを設定
```html:index.html
<!doctype html>
<html class="no-js">
  <head>
    <base href="/">
```
CentOS6にEPELリポジトリを追加する

## 今はこのコマンドで行けるはず。

いつからだっけな。

```
yum install epel-release
```

## 次の内容はもう古いです。（これはもう使わない）

毎回ググってるのでメモ的に。

```bash:EPELリポジトリを追加
sudo rpm -ivh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
```
CentOS6でJava7のalternativesの設定


```bash:Java7のalternativesの設定
sudo rpm -ivh jdk-7u67-linux-x64.rpm
sudo alternatives --install /usr/bin/java java /usr/java/default/bin/java 17067 \
  --slave /usr/bin/javac javac /usr/java/default/bin/javac \
  --slave /usr/bin/javadoc javadoc /usr/java/default/bin/javadoc \
  --slave /usr/bin/keytool keytool /usr/java/default/bin/keytool \
  --slave /usr/bin/orbd orbd /usr/java/default/bin/orbd \
  --slave /usr/bin/pack200 pack200 /usr/java/default/bin/pack200 \
  --slave /usr/bin/rmid rmid /usr/java/default/bin/rmid \
  --slave /usr/bin/rmiregistry rmiregistry /usr/java/default/bin/rmiregistry \
  --slave /usr/bin/servertool servertool /usr/java/default/bin/servertool \
  --slave /usr/bin/tnameserv tnameserv /usr/java/default/bin/tnameserv \
  --slave /usr/bin/unpack200 unpack200 /usr/java/default/bin/unpack200

sudo update-alternatives --set java /usr/java/default/bin/java
```
RubyMineからforemanでアプリケーションサーバーを起動する


"Gem Command" を使う

![スクリーンショット 2014-10-08 4.20.22 PM.png](https://qiita-image-store.s3.amazonaws.com/0/229/7799a6ed-6a3d-600d-6099-fa06e4e53b6b.png "スクリーンショット 2014-10-08 4.20.22 PM.png")

![スクリーンショット 2014-10-08 4.27.21 PM.png](https://qiita-image-store.s3.amazonaws.com/0/229/e368e4b4-2de3-6787-f7ba-c99bcd0c93fc.png "スクリーンショット 2014-10-08 4.27.21 PM.png")
広告配信事業者のためのスマートデバイスデータまとめ

スマートデバイスデータについてまとめてみました。
間違っている部分は、逐次修正いたします。

#データ分類
##Webデータ
スマートデバイス上のブラウザでWebサイトに訪れた際に取得できるデータ
データ取得のために、javascriptタグを導入する必要がある
ユーザー識別子: **Cookie**

####取得可能な情報
* ユーザー情報 : IP / UA / リファラ / Cookie
* ページ情報 : metaタグ / ページURL
* 広告配信情報 : キャンペーンID / クリエイティブID / プレイスメントID
* 端末情報 : センサー系（位置, 端末加速度, ジャイロ）

参考：http://www.tagindex.com/javascript/user/browser.html

####iOS
* 主要ブラウザ - safari, Chrome
* 3rdPartyCookieの書き込みができない（safari）

####Android
* 主要ブラウザ - Chrome, デフォルトブラウザ
* 3rdPartyCookieの書き込みができる
* PCとほとんど同じ

##Appデータ
スマートデバイス上にインストールされているアプリから取得できるデータ
データ取得のために、SDKを導入する必要がある
ユーザー識別子: **IDFA(iOS)/AdvertisingId(Android)**

####ネイティブアプリ
アプリ内のコンテンツをネイティブコードを用いて開発しているアプリ

#####取得可能な情報
* ユーザー情報 : IP / UA(Locale,device,OS,OS version) / timezone / 画面サイズ（縦,横）/
                ~~リファラ~~ / ~~Cookie~~ / ADID(IDFA,AdvertisingId) / NW情報
* アプリ情報 : アプリ名 / アプリバージョン / BundleID / URLスキーム 
* 広告配信情報 : キャンペーンID / クリエイティブID / プレイスメントID
* 端末情報 : センサー系情報（位置, 端末加速度, ジャイロ, 音, 光量など）

※端末情報は、取得する場合に、ユーザーのPermissionが必要になるため、アプリ内でセンサー系情報を取得している場合に限る。

####WebViewアプリ（ハイブリットアプリ/アプリ内ブラウザ）
アプリ内のコンテンツにWebサイトを流用しているアプリ
アプリのがわだけ、ネイティブコードで実装し、WebView領域内にWebサイトを表示させる

#####取得可能な情報
* Webで取得可能なデータ + Appで取得可能なデータ

**※safariやChromeなどデバイスにインストールされているブラウザとWebViewアプリのCookieデータは、保存領域が異なるため共有することはできない。**

サイトAにWebブラウザで訪れた場合と、WebViewアプリからサイトAに訪れた場合は、別ユーザーとして扱われる。

#SDK(Software Development Kit)
Wikipediaより引用
>ソフトウェア開発キット（ソフトウェアかいはつキット、英語: Software Development Kit、SDK）は一般に、特定のソフトウェアパッケージ、ソフトウェアフレームワーク、ハードウェアプラットフォーム、コンピュータシステム、ゲーム機、オペレーティングシステムなどのためのアプリケーションを作成するためにソフトウェア技術者が使用する開発ツールのセットを意味する。

###SDK for Publisher
広告配信用SDK
アプリ内計測用SDK
Push通知用SDK

###SDK for Advertiser
広告効果測定用SDK

#WebとAppのデータを紐づけるには？

* Appに配信した広告のクリックURLにADIDを付けて、遷移先としてブラウザを起動
http://demo.adserver.jp/CLICKURL?adid=XXXXXXXX-XXXX-XXXX-XXXXXXXXXXX
※アプリ内ブラウザで起動した場合、CookieとADIDは取得紐づかない

* WebとAppで取得したIPアドレスや端末情報を元に名寄せ

* 事業者IDを利用（Gアカウント, Yアカウントなど）
tmux1.9aで新しいウィンドウ作成時に、HOMEディレクトリになってしまう現象


##はじめに
`tmux`を`1.9a`に`update`しました。
すると、新しいウィンドウ作成時にHOMEディレクトリに戻ってしまう仕様になっていました。
新しいウインドウ作成時や分割時にカレントディレクトリのパスを引き継ぐ仕様のほうが個人的に好きなので`1.9a`でも実現できるよう設定しました。

##原因
そもそも、なぜこういう現象になったかというと`default-path`という機能が廃止になってしまったからのようです。
新しいウィンドウは全てホームディレクトリから始まるようになったってことですね。
詳細はこちらを参照 → [CHANGES FROM 1.9 to 1.9a 22 February 2014](http://sourceforge.net/p/tmux/tmux-code/ci/master/tree/CHANGES)
該当箇所を抜粋するとこんな感じです。

```
Incompatible Changes
====================

* 88 colour support has been removed.
* 'default-path' has been removed.  The new-window command accepts '-c' to
  cater for this.  The previous value of "." can be replaced with: 'neww -c
  $PWD', the previous value of '' which meant current path of the pane can
  be specified as:  'neww -c "#{pane_current_path}"'
```


##対処方法
新しいウィンドウ作成時（`new-window`）と分割時（`split-windw`）にカレントディレクトリのパスを引き継ぐようにしたい場合は、`new-window`と`split-windw`のオプションに`-c "#{pane_current_path}"`をつけると実現できます。
では.tmux.confを編集します。自分はこんな感じに。

```.tmux.conf
 bind c new-window -c "#{pane_current_path}"
 bind % split-window -hc "#{pane_current_path}"
 bind '"' split-window -vc "#{pane_current_path}"
```

##おわりに
これで`1.9a`でもカレントディレクトリのパスの引き継ぎが実現されました。
もしカレントディレクトリパスを引き継ぐ仕様が好きだった人はやってみてください。
でも`default-path`が廃止になったってことはこの仕様嫌いな人そんなに多かったのだろうか...個人的には好きでしたが。
ちなみに今回は以下のサイトを参考にさせて頂きました。ありがとうございます。

>tmuxを1.9aにしたら新しいwindow/paneのパスが$HOMEになった件
>http://qiita.com/geta6/items/e9e3122c4e7a602ade77

>Tmux 1.9でウィンドウ分割後もカレントディレクトリに留まる
>http://qiita.com/okuramasafumi/items/72f61ec0af56b7b9b292
Vagrantへのログイン方法


忘れるからきちんとメモ

vagrantの該当ディレクトリまでいく
つまり、vagrantFileが入ってるディレクトリ。

ちなみにドットインストールでは
(Users/ユーザー名/Vagrant/localdev)
だったはず。

起動

```
$ vagrant up
```

ログイン

```
$ vagrant ssh
```


でおっけー！

ちなみにログアウトは

```
logout
```
iOS開発デバッグツールchiselについてメモ


ちょくちょく忘れるのでメモ。

ちなみにインストールなど詳細については「[iOS開発のデバッグツールchiselの紹介](http://qiita.com/kenhama/items/15c51bce515d84882885)」を参照ください。

| Command | Description |
|:--------|:-------------|
| pvc | 引数に渡したViewControllerの階層構造を表示 |
| pviews | 引数に渡したUIViewの階層を表示 |
| pcells | tableViewで表示されているセルの一覧を表示 |
| presponder | 指定したクラスのレスポンダチェーンを表示 |
| taplog | アプリ側でタップした位置のviewを表示（自分の環境だと動かず・・） |
| vs | インタラクティブにviewの選択／サーチができるコマンド |
| pclass | 指定したクラスの継承を表示 |
| fv | viewクラス名の正規表現を渡すと、該当するviewを表示 |
| fvc | fvのviewController版 |
Intel GPU搭載Macbook ProでDK2をミラーリングする方法(Oct.8.2014)

#はじめに
DK1でOculusRiftの開発をする場合、UnityプロジェクトだとそのままOculusのSDK用unityパッケージをインストールし、D&D数回でOculusRift対応コンテンツが出来、モニターにもミラーリングされ非常に簡単な作業でFesなどの出品できたのですが、DK2にアップグレードした場合、デバイスの仕様上どうしてもいろいろと工夫が必要になってきました。

`この記事は2014.10.8現在の情報で、以後、SDKやハードのアップデートにより内容が変わる可能性がございます。`

#とりあえずMacでやる
わたしはMac信者なので開発環境もMacだったりします。ただし、DirectX関係なのか詳しく調べていないですが、遅いです。世間的な印象だとMacってお遊びマシーンみたいな印象がありますが、実はゲームすら入っていない、バリバリのお仕事マシンだったりします。Windowsの方がゲーム向きです。
今回は、Macで出来たのでそのやり方に限定します。

#事前準備
`OSXは10.9.5`
`UnityProは4.5.2f1`
`ovr_unityは0.4.2`
の環境でMac用の実行ファイルを作成しました。

##DK2をつなげたMacのシステム環境設定 -> ディスプレイ -> 配置 ディスプレイをミラリングにチェックを入れる
![スクリーンショット 2014-10-08 13.32.18.png](https://qiita-image-store.s3.amazonaws.com/0/25895/9f11b0bd-102b-47ea-bff3-0efb2fe02f5a.png)

このとき選択するディスプレイはRift DK2にする。

##実行したいファイルを実行する。Unityのアプリ起動メニューが出るようにしておく。
![スクリーンショット 2014-10-08 12.55.42.png](https://qiita-image-store.s3.amazonaws.com/0/25895/490de20d-86aa-ef8c-b199-df0bbb070938.png)

##DK2の解像度なのかなー。1920x1080でフルスクリーン実行するとミラーリングがでけた。
![スクリーンショット 2014-10-08 12.56.04.png](https://qiita-image-store.s3.amazonaws.com/0/25895/7f84fb7e-c686-3f84-ec8e-79e82b69221f.png)

##念願のDK2でミラーリングが出来るが、拡張モードのミラーリングの為、34fps位で描画遅延でまくり、首を振りすぎると気持ち悪くなります。
![IMG_0667.JPG](https://qiita-image-store.s3.amazonaws.com/0/25895/4dca84a4-3447-72b1-58e2-c906cca606e4.jpeg)
安ハードRAIDを試したら整合性チェック機能がなかった話

ちょっといいマザーボードに搭載されてたり、あるいは安いカードに載ってるようなRAIDチップを使ったことがなかったんですが、今回 Marvell 9128 を試してみました。\2000ちょいのボードです。


管理ユーリティティ
![443ac2222c0368008c002cfdfbff3f2d.png](https://qiita-image-store.s3.amazonaws.com/0/47014/eda36d33-6403-a97d-daac-bce68fb3fa2e.png)

をセットアップすると、Windows上から操作できるし、メールでログも飛ばせるし、いちおう使えそうな感じだったんですが、残念ながら整合性チェック機能がありませんでした。なんのチェックもせずにRAIDディスクを運用するのは自殺行為なので、とりあえず簡単に、ディスクの全領域にアクセスするだけのスクリプトを書いて試してみることにしました。

```diskcheck.vbs
Option Explicit

Const vbHide = 0
Dim ws

Set ws = CreateObject("Wscript.Shell") 
ws.Run "cmd /c C:\diskcheck\diskcheck.bat", vbHide, True
```

```diskcheck.bat
@echo off
cat /dev/sda | pv -q --rate-limit 40m > nul
```

ある領域へのアクセスをこの安RAIDチップがどう処理してるのかは不明ですが、仮に物理ディスクに問題が生じた場合、毎週チェックしていればそのうちエラーに遭遇してくれるだろうということを期待しています。

注1: スクリプトの実行には管理者権限が必要です

注2: catとpvはCygwinのものです。以下のファイルがあれば動きます
cat.exe
cygiconv-2.dll
cygintl-8.dll
cygwin1.dll
pv.exe

注3: Cygwinの/dev/sdXは、WindowsのディスクNと同一の順序に並んでいるらしいです
複数モニタ環境で Androidエミュレータがクラッシュ

# 問題
* OS XでAndroidを開発
* HAXMを導入
* 複数モニタ環境

のときに Androidエミュレータがクラッシュする

![scr.png](https://qiita-image-store.s3.amazonaws.com/0/3847/d3c27ff5-87b7-3fb1-9c95-6ad71d40e48f.png)

#解決方法

サブモニタ上にエミュレータを移動して、そこでエミュレータを終了すると起きる現象らしい。不正なウィンドウ位置を記録してしまい、それが次回起動時の妨げとなっている模様。

http://stackoverflow.com/questions/13654656/android-vm-crashes-on-launch-mac

emulator-user.ini を編集してウィンドウ位置を適当な値に変更する (0,0とか)。

![スクリーンショット 2014-10-08 15.29.22.png](https://qiita-image-store.s3.amazonaws.com/0/3847/17431728-6460-ad6b-7c99-706186c79445.png)

これを

![スクリーンショット 2014-10-08 15.31.04.png](https://qiita-image-store.s3.amazonaws.com/0/3847/aeeb9954-bab6-28b6-d825-c6c05c96b76f.png)

こう
PerlユーザーがPythonで忘れがちな構文

## 文字コード指定で開く、正規表現でSplit
```python
import codecs
for line in codecs.open(file, 'r', 'utf8'):
  arr = re.compile(r' ?= ?').split(line)
```

## Chomp
```python
str.rstrip()
```

## Dict(ハッシュ)をキーでソート
```python
for k, v in sorted(dic.items()):
  print(k + ' = ' + v.rstrip())
```
slack の api token


node-slack を使って domain,token をどれ使えばいいかわからなかったのでメモ。
https://github.com/xoxco/node-slack


domain はチーム名のサブドメイン。
hogehoge.slack.com の `slack` 

token　は
サービス追加ページ（https://ndinc.slack.com/services/new）の下方にある
Incoming WebHooks を作成してこの api token を使えばいいみたい。
RubyMine7のデバッガが神がかっている件

![](http://gifzo.net/BWBJNyFCioG.gif)

デバッガで停めた状態で、変数にカーソル合わせたり、コード選択するだけで、その変数/配列の中身とか表示してくれたり、メソッドを内部実行した結果出してくれる。

いちいちEvaluate Expressionしなくてもメソッドの結果ざっくり確認できるのですごい捗る。
Javascript で形態素解析

Javascript で形態素解析できるライブラリを
発見したので使ってみました。

下記リンクから試せます。
http://js.romareas.net/analyze/

下記が簡単な導入手順。
http://azumaxlife.smile-systems.com/archives/1055

Node.jsで動かしてますがまずまずですね。

いろんな場面で使えそう。
クライアントで動かしたい場合は
辞書が重いので注意しないと。
スクリーンショットの撮り方とアルファチャンネルの有無について

アルファチャンネルがあると、iTunes へアップロードに失敗するとのことなのでメモ。

## シミュレータ
⌘S でスクリーンショットを撮る。
アルファチャンネルなし。

## 実機
電源＋ホームボタンでスクリーンショットを撮る。
アルファチャンネルなし。

## 実機（Xcode）
Window > Devices > Take Screenshot でスクリーンショットを撮る。
アルファチャンネルあり。
leiningenでjarファイル作成のメモ

```bash
$ lein new sample
```

```clj:src/sample/core.clj
(ns sample.core
  (:gen-class))  ;追加
```

```clj:project.clj
(defproject sample "0.1.0-SNAPSHOT"
  :profiles {:uberjar {:main sample.core, :aot :all}}  ;追加
  )
```
leingen1.3.0から、「:main sample.core」と指定するだけでは警告がでるようになった。

```bash
$ lein uberjar  #target/にjarファイルが作成される
$ java -jar target/sample-0.1.0-SNAPSHOT-standalone.jar  #実行
```
上記のスタンドアロンファイルには依存ファイルが全て含まれているので、JVM環境下ならどこでも実行可能。
[Rails 4.x] エラーページの作り方

# エラーページを作ります

オシャレなエラーページがあるととても素敵だなぁと思います。

## 何がほしい

* メンテナンス中 
    * Maintainance
* 貴方はこのページを見る権限ないよー
    * Forbidden
* IP制限引っかかってるよー
    * IpAddressRejected
* そんなURL無いよー
    * RoutingError
* URLの:idのトコとか勝手にいじっても、レコードないもんはないよー
    * ActiveRecord::RecordNotFound

# 仕組み

各処理の中で、エラーをraiseさせて、それをapplication_controllerで拾ってエラーページを出力させてあげる感じ。

# とりあえずview

app/views/errors ディレクトリを作成し、その中に

* forbidden.html.erb
* not_found.html.erb
* internal_server_error.html.erb

を作成。
中身は後からでもいつでもいい。

# app/controller/concerns/error_handlers.rb

ここに処理を書きます。
raiseされたエラーをrescue_fromで拾っています。

```rb
module ErrorHandlers
  extend ActiveSupport::Concern

  included do
    rescue_from Exception, with: :rescue500
    rescue_from ApplicationController::Forbidden, with: :rescue403
    rescue_from ApplicationController::IpAddressRejected, with: :rescue403
    rescue_from ActionController::RoutingError, with: :rescue404
    rescue_from ActiveRecord::RecordNotFound, with: :rescue404
  end

  private
  def rescue403(e)
    @exception = e
    render 'errors/forbidden', status: 403
  end

  def rescue404(e)
    @exception = e
    render 'errors/not_found', status: 404
  end

  def rescue500(e)
    @exception = e
    render '/errors/internal_server_error', status: 500
  end
end
```

# app/controllers/application_controller.rb

以下を追記。

```rb
class Forbidden < ActionController::ActionControllerError; end
class IpAddressRejected < ActionController::ActionControllerError; end

include ErrorHandlers if Rails.env.production? or Rails.env.staging?
```

ErrorHandlersをincludeするのは、一応dev環境では避けます。開発の妨げになりそうなので。

# RoutingError

## config/routes.rb

一番下に追記。

```rb
get '*anything' => 'errors#routing_error'
```

routes.rb内は、上から順に優先度高いので、一番下にこの様に書くことで、指定されていない残りのurlを全て処理できます。
つまり、適当なurl入力への対応が出来ます。

## app/controllers/errors_controller.rb

routingエラー用のコントローラーを設置します。

```rb
class ErrorsController < ApplicationController
  def routing_error
    raise ActionController::RoutingError, "No route matches #{request.path.inspect}"
  end
end
```

# 最後にview

viewを書き込みます。

# テスト

## 事前準備

環境を選択して、整えます。

* application_controllerのerror_handlersのincludeの環境制限をコメントアウトして、devでも読み込むようにして、devでテスト
* rails s -e productionとして本番環境でテスト
    * 本番とdevでdb環境が違うと、database.ymlで引っかかることもあるかも

## キャッシュ設定

選択した環境のconfigでcache_classesをfalseにします。
config/environments/*.rb

## やりかた

* 指定外のURLに飛ぶ
* 各処理中の良きところで、raiseさせます。
    * raise
    * raise IpAddressRejected
    * raise Forbidden
    * など

# 参考

[実践 Ruby on Rails 4](http://www.amazon.co.jp/%E5%AE%9F%E8%B7%B5Ruby-Rails-4-%E7%8F%BE%E5%A0%B4%E3%81%AE%E3%83%97%E3%83%AD%E3%81%8B%E3%82%89%E5%AD%A6%E3%81%B6%E6%9C%AC%E6%A0%BCWeb%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E9%BB%92%E7%94%B0/dp/4844335928)
【プログラミング48(/2 -1)手】Interpreter


## ポイント
構文解析の構文木を表現したパターン。
構文を解析、結果に基づいて実行する。

## サンプルコード
以下参照。
http://morizyun.github.io/blog/ruby-design-pattern-13-interpreter/

## 所感
* 構文解析機能をオブジェクト化して拡張可能にしておくということ。cliのツールを作成するときとかに使いそう。

## 参考にしたサイト
http://morizyun.github.io/blog/ruby-design-pattern-13-interpreter/
http://www.ie.u-ryukyu.ac.jp/~e085739/java.it.13.html
Modelや素のクラスでViewのhtmlを生成したい場合は「render_anywhere」が便利


## ユースケース

DBのデータを元にHTMLを動的に生成して画面に表示したいけど、その元データとしてerbやhamlを使いたくて、更に`render 'application/tags'`みたいな形で、Rails上のコードも呼び出したい！

## render_anywhereを使えばいいよ

[yappbox/render_anywhere](https://github.com/yappbox/render_anywhere)

Gemfileに追加して、

```ruby
gem 'render_anywhere', require: false
```

利用したいクラスにincludeしてあげれば使えます。以下が利用例です。

```ruby
class Blog
  include RenderAnywhere

  def build_html
    render inline: self.content, type: :erb
  end
end
```

`render`メソッドの使い方は[ActionView::Helpers::RenderingHelper#render](http://apidock.com/rails/ActionView/Helpers/RenderingHelper/render)のドキュメントをご覧ください。

Gemの実装内容ですが、レンダリング用のコントローラを作成して、そのコントローラでhtmlを生成した結果を返してくる仕組みのようです（[rendering_controller.rb](https://github.com/yappbox/render_anywhere/blob/master/lib/render_anywhere/rendering_controller.rb)）。若干力技な感じもあるので、ご利用は計画的に。
RubyCocoa 1.2.0を使ってみる

# MavericksにはRubyCocoaが入っている

10.10からはAppleからの提供がなくなる予定だが
MavericksにはRuby1.8向けのRubyCocoaがAppleより提供されている。

Ruby2.0に対応した1.2.0をインストールした場合、Xcodeでのフレームワークの指定を間違える可能性がある。

## 正解は

/Library/Frameworks/RubyCocoa.framework

# rbenv環境下での動かすには

とりあえず、/usr/bin/rubyをフルパス指定で使ってるｗ


# Link

- [RubyCocoa 1.2.0 リリース！ - きりかノート 2冊め](http://d.hatena.ne.jp/kimuraw/20140727/p1)
vCenter Server Appliance 5.5でのキーボードレイアウトの変更

## 概要

vCenter Server Applianceのシェルでキーボードレイアウトを日本語に変更する方法。

## 詳細

vCenter Server Appliance 5.5のシェルでは、初期状態ではキーボードレイアウトが英語の扱いになっているようだった。これを日本語レイアウトの扱いに変更することができたので、手順を共有する。

### YaSTを使用した変更方法

vCenter Server Appliance 5.5は、OSとしてSUSE Linux Enterprise 11を組み込んでいる。SUSE Linuxのシステム管理ツールでもある[YaST](https://ja.opensuse.org/YaST/About)が利用可能なので、これを使用して変更する。

1. vCenter Appliance Serverのコンソールにアクセスする。
2. [Login]を選択する。<br/>![099-101_日本語キーボード化.png](https://qiita-image-store.s3.amazonaws.com/0/55718/07250be1-8efb-05de-a2ef-ce7fe78b515d.png)
3. rootでログインする。
4. 「yast」コマンドを実行する。<br/>![099-102_日本語キーボード化.png](https://qiita-image-store.s3.amazonaws.com/0/55718/04563e69-d77c-f20f-0244-a6273050d1d7.png)
5. 「YaST2 Control Center」が表示される。[System]-[Language]メニューを選択する。<br/>![099-103_日本語キーボード化.png](https://qiita-image-store.s3.amazonaws.com/0/55718/1df51b7a-c78f-be9e-9f20-adb8f145431a.png)
6. 「Languages」ページが表示される。[Primary Languages]を「Japanese - Japanese」に変更し、[Adapt Keyboard Layout to Japanese]にチェックを入れ、[OK]を選択する。<br/>![099-104_日本語キーボード化.png](https://qiita-image-store.s3.amazonaws.com/0/55718/6cc37367-f5eb-c5a9-bc72-cd85029ca8a4.png)
7. 「YaST2 Control Center」のトップ画面に戻る。[Quit]を選択して、yastを終了させる。
8. 「exit」コマンドを実行して、シェルを終了させる。

以上。

## 注意

本投稿の内容は、ベンダの公式情報（マニュアルやナレッジベースでの記載）に基づくものではなく、投稿者の知識範囲内での試行錯誤成果にとどまる。公式情報があればそちらをご参照のこと。また、できればその所在、内容などご教示いただければありがたい。
Xcode6にOS X 10.8SDKを追加する

Xcode6にはOS X 10.9とiOS8.0向けのSDKしか入っておらず、古いプロジェクトのコンパイルが通らないので、10.8向けのSDKを追加する方法。

###Xcode5をダウンロード
すでにインストールずみならここはスルーで。

[Appleのダウンロードサイト](https://developer.apple.com/downloads/index.action)から10.8SDKを含むXcode(5.1.1とか5.1)をダウンロード

###Xcode6にSDKをコピー
1. ダウンロードしたXcode.appを右クリック>パッケージの内容を表示
2. Xcode5.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs以下にあるMacOSX10.8.sdkをコピー
3. 同様にXcode.app(6)を右クリック>パッケージの内容を表示から、/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKsを開く。
4. 2でコピーしたMacOSX10.8.sdkをペースト

###Xcode6を再起動
Xcode6を再起動し、Build SettingからOS X 10.8が選択でき、コンパイルが通ることを確認。

たいしたことじゃないけど、SDKがあるパスを忘れたりするので備忘として。
他のSDKもこの方法で追加できるはず。
符号あり数値の直感的な考え方

符号あり数値をなるべく直感的に説明します。

※ 意図的に「最上位ビットが符号を表す」ことから話を始めませんので、ご了承ください。

# 暗算の工夫

$12+99$ を暗算で計算するとき、どのように計算するでしょうか。計算の得意な方なら特に工夫しなくてもそのまま計算できるかもしれませんが、そうでない場合には少し工夫すると計算が簡単になります。

$99$ が $100$ の1つ前であることを利用して $12+100-1$ と読み替えます。そうすれば繰上りに煩わされることなく $111$ とすぐに計算できます。

# 2桁に制限された世界

もし計算結果を2桁に制限するという条件が付いていたら、結果はどうなるでしょうか。

$12+99=12+100-1=111⇒11$

2桁に制限された時点で $100$ が $0$ になって消えていると見なせます。

$12+99=12+100-1 ⇒ 12-1=11$

つまり $+99$ と $-1$ が同一視できる結果となります。

このことから次のことが推測できます。

* 桁数が制限された計算では、大きな数の足し算が実質的に引き算となる。

※ この $0$ ～ $99$ のように制限された数の集合を[有限体](http://ja.wikipedia.org/wiki/%E6%9C%89%E9%99%90%E4%BD%93)と呼びます。

## 補数

$99$ は $100-1$ から求めていますが、同様の関係を任意の数に適用する方法を考えます。

引く数と答えを逆にします。

$100-1=99 ⇒ 100-99=1$

このように $100$ から引くことでお互いを変換できます。

$100-a=b ⇔ 100-b=a$

※ この $a$ と $b$ のような関係を[補数](http://ja.wikipedia.org/wiki/%E8%A3%9C%E6%95%B0)と呼びます。

## 符号の線引き

足し算と引き算の対応関係を見ていきます。

* $x+1 ⇔ x-99$
* $x+2 ⇔ x-98$
* （略）
* $x+49 ⇔ x-51$
* $x+50 ⇔ x-50$
* $x+51 ⇔ x-49$
* （略）
* $x+98 ⇔ x-2$
* $x+99 ⇔ x-1$

第2項のみを取り出して、計算だけでなく数としても対応していると見なします。

* $+1 ⇔ -99$
* $+2 ⇔ -98$
* （略）
* $+49 ⇔ -51$
* $+50 ⇔ -50$
* $+51 ⇔ -49$
* （略）
* $+98 ⇔ -2$
* $+99 ⇔ -1$

中央の $50$ を境に絶対値の大小関係が逆転します。大きな数は符号反転して考えることにより、絶対値が小さい方で解釈するように決めます。

その際に中央値がどちらに属するか決める必要があります。個数を基準に考えれば中央値をマイナスに割り振れば均等となります。つまり絶対値の最大（この場合は $50$）はマイナス側に含まれます。

符号なし|符号あり|個数
--------|--------|----
0～49   |+0～+49 | 50
50～99  |-50～-1 | 50

このようにして符号あり数値が得られました。

## 視覚化

2桁に制限された世界では $+1$ を繰り返すと桁があふれて $0$ に戻ります。つまり数が循環します。このことを数直線で表現すると、符号の有無によって別々の箇所で不連続となる2つの循環する数の重なりが見えて来ます。

![signed.png](https://qiita-image-store.s3.amazonaws.com/0/32057/06763c50-6395-4192-c473-8823a176bce6.png)

※ 循環していることから円による描き方もできます。

符号なしと符号ありに対応関係があり相互に変換できるのがポイントです。

# 16進数

同じ理屈を16進数に適用すると、いわゆる整数型が作れます。

サイズ|符号なし|符号あり
------|--------|--------
1バイト|0～0xFF|-0x80～0x7F
2バイト|0～0xFFFF|-0x8000～0x7FFF
4バイト|0～0xFFFFFFFF|-0x80000000～0x7FFFFFFF

符号なしで表現できる数値の上半分が、符号ありでのマイナスとなります。これをビットで見ると、最上位ビットが符号を表すことになります。

# 参考

符号ビットによる通常の説明はWikipediaを参照してください。

* [符号付数値表現](http://ja.wikipedia.org/wiki/%E7%AC%A6%E5%8F%B7%E4%BB%98%E6%95%B0%E5%80%A4%E8%A1%A8%E7%8F%BE)
svnで git stash と同じことをしたい


参考: [svn - Temporarily put away uncommited changes in Subversion (a la "git-stash") - Stack Overflow](http://stackoverflow.com/questions/1554278/temporarily-put-away-uncommited-changes-in-subversion-a-la-git-stash)

※ただし、svn add していないファイルや、バイナリファイルについては stash.patch に出力されないので注意


### git stash 相当

```
$ svn diff > stash.patch
$ svn revert -R .
```

### git stash pop 相当

```
$ patch -p0 < stash.patch
```
S3の制限


## bucket

* 1アカウントで作れるbucketは100個まで
* バケット名は 3-63バイト内
* 記号は - と . が使用可能だが、 .. のような連続、 .から始まる、終わるはダメ
* DNS名準拠のバケット名つかっておくのが良い。
空き領域がないと怒られるけどディスク容量が足りてる場合はiノード数かも


````
$ touch /mnt/storage/hoge.txt
touch: `/mnt/storage/hoge.txt' に touch できません: デバイスに空き領域がありません
``````

調べてみると

``````
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.9G  6.6G  905M  89% /
/dev/xvdf        20G  9.2G  9.6G  49% /mnt/storage
``````

空き領域あるやん? と思いきや`df -i`で見ると

````
$ df -i
Filesystem      Inodes   IUsed  IFree IUse% Mounted on
/dev/xvda1      524288  288302 235986   55% /
/dev/xvdf      1310720 1310720      0  100% /mnt/storage
`````

`/dev/xvdf      1310720 1310720      0  100% /mnt/storage` のように, i-node数が一杯になっていた. ファイル"数"を減らすとよい.
Android Studioの日本語化+アンチエイリアシング

## Android Studioの日本語化

参考リンクから。Macの環境での説明だったけど、Windows環境でも同様にできた。.jarファイルを入れるだけなので、MacのEclipseの日本語化や、[この記事](http://d.hatena.ne.jp/kkz_tech/20140710/1404976740)の手順より楽な感じ。

#### 参考

[Android Studioを日本語化する方法 - Android Studioでアプリ開発！](http://androidstudio.hatenablog.com/entry/2014/07/20/170308)

## Android Studioのアンチエイリアシング

Android Studioのプログラム実行ファイルのディレクトリにあるvmoptionsファイル（[Android Studio をインストールしたディレクトリ]/bin/studio.exe.vmoptions or studio64.exe.vmoptions）をテキストエディタで開いて、下記の行を末尾に追加して起動。

```:studio.exe.vmoptions
-Dawt.useSystemAAFontSettings=on
-Dswing.aatext=true
-Dsun.java2d.xrender=true
```

#### 参考

* [Android Studio の見た目に関する設定 | イントフロート スタッフブログ](http://maruta.be/intfloat_staff/162)

* [How to fix font anti-aliasing in IntelliJ IDEA when using high DPI? - Super User](http://superuser.com/questions/614960/how-to-fix-font-anti-aliasing-in-intellij-idea-when-using-high-dpi)
Android4.4のWebViewでgoback()した時にページタイトルを表示する

Android4.4以降ではWebViewの仕様が色々変わっています。(https://developer.android.com/guide/webapps/migrating.html)
例えばWebView#goback()したときに、4.4以前ではWebChromeClient#onReceivedTitle()が自動的に呼ばれて、戻ったページのタイトルが自動的にアクションバーに読み込まれるようになっていますが、4.4以降では戻る前のページタイトルのままとなります。

goBack()した時に戻ったページのタイトルを表示するためには一工夫必要です。

##やり方
WebViewClient#onPageFinished()で、読み込み終わったWebViewからタイトルを取得し、アクティビティにsetTitleしてあげます。

```java

    private static class CustomWebViewClient extends WebViewClient{
        Activity mActivity;

        CustomWebViewClient(Activity activity) {
            super();
            mActivity = activity;

        }
        @Override
        public void onPageFinished(WebView view, String url) {
            if(Build.VERSION.SDK_INT >= 19){
                 mActivity.setTitle(view.getTitle());
            }
        }
}

```
RSpec: CapybaraでBootstrapのモーダルを動作させる

## 目的

Capybaraを用いたRSpecのfeature specで、bootstrap3を使って実装したモーダルを動作させた振る舞いをテストする

## 問題

もともとのテストは以下。リソース作成のあと、編集ボタンをクリックするとモーダルが表示される仕様なのだが、アプリケーション上では正しく動作するものの、Capybara DSLでフローを記述しても、出てくるべきモーダルが表示されずに困った。

```rb
# encoding: UTF-8
require 'spec_helper'

describe 'CreditCard', type: :feature, js: true do
  def create_credit_card(
    name: nil, number: nil, pin: nil)

	visit new_credit_card_path
    find_link('クレジットカードを登録する').click

    fill_in 'credit_card_name', with: name
    fill_in 'credit_card_number', with: number
    fill_in 'credit_card_pin', with: pin
    sleep 0.5
    click_button '登録'
  end

  it 'クレジットカードを登録したあと、登録情報を編集する' do
    create_credit_card(
      card: 'VISA',
      number: '1234-5678-9012-3456',
      pin: '000')
     
    expect(page).to have_content 'クレジットカードを登録しました'
    
    within '#credit-card__info' do
      find_button('カード情報を編集する').click
    end
    
    => #credit-card__info下にある「カード情報を編集する」ボタンをクリックすると、通常はモーダルが表示されるはずが、表示されず、ここでテストが落ちる
	
	fill_in 'credit_card_name', with: 'Master'
	click_button '保存'
	
	expect(page).to have_content 'クレジットカードを編集しました'
	expect(page).to have_content 'Master'
	expect(page).to have_content '1234-5678-9012-3456'
  end
```

DOM上はモーダル部分にあたるHTMLが生成されているので、`save_and_open_page`で見るとモーダル要素は描画されている。が、JavaScriptを使ってドライバのスクリーンショットを撮影する`save_screenshot`を使ってみると、いっこうにモーダルは表示されていない。

## 対処

これは実はbootstrapのモーダル表示時に実行されるCSS animationの表示が正しく動いていないためであり、モーダルを表示させるときに該当するクラスを削除することで正しく動いた。


以下の1行を、モーダル表示するアクションの前に入れてあげることで、fadeクラスによって発火していたアニメーションが実行されず、モーダルが正しく表示されるようになった。

```rb
# fadeクラスを削除
page.evaluate_script('$(".fade").removeClass("fade")')

# ボタンをクリックするとモーダルが表示されるので、先に進むことができる
within '#credit-card__info' do
  find_button('カード情報を編集する').click
end
...
```

Capybaraを使ったfeature specは使っているjavascipt driverに依存する部分が多いので、色々なワークアラウンドが存在しているけど、たいていはjavascriptによる問題なので、こういったスクリプトを直接実行することで避けられることもしばしばある。


## ところで

[Repro株式会社](https://repro.io/)では一緒に切磋琢磨できる仲間を募集しています。 ぜひ[こちら](https://www.wantedly.com/companies/repro/projects)をごらんください！