OmniAICreator/Qiita-1.07M huggingface dataset:
Git自体のバージョンをあげる


## やりたいこと

```bash:
$ git --version
git version 1.8.5.2 (Apple Git-48)
```

だったので、gitのバージョンをあげたいと思った時の作業メモ。

Mac OS X 10.9.4

oh-my-zsh を使っています。

## やったこと

### brew で gitをインストール

```bash:
$ brew install git
```

### .zshrc でPATHを設定

```bash:.zshrc
export PATH="/usr/local/bin:$PATH"
```

の後に、

```source ~/.zshrc```をすると起動する。


## 参考

- [Homebrewで入れたgit,zshを優先的に利用する - Glide Note - グライドノート](http://blog.glidenote.com/blog/2014/04/20/change-command-path-priority/)
	
	- このやり方だと、bash側ではうまくいったんだけど、zsh側ではなんか反映されませんでした…。なんでだろう。


- [Macのgitをhomebrewでインストールしたものに変更する - Rock'n'Hack ブログ](http://rock-and-hack.blogspot.jp/2012/12/macgithomebrew.html)
VDD(Vagrant Drupal Development)でDrupalの環境構築

ローカルにDrupalの開発環境を構築するやり方を紹介します。
英語版の記事はこちらです。今回はDrupal7をインストールします。
https://www.drupal.org/node/2008792

### Vagrantが入っているか確認する。

```bash
vagrant --version
```

### VirtualBoxが入っているか確認する

```bash
vboxmanage --version
```
無い場合は、それぞれインストールしてください。

### VDDをダウンロードする。

こちらからダウンロードしてください。
https://www.drupal.org/project/vdd

ダウンロードできたら解凍して、適当なディレクトリに移動します。
「vdd」というファイル名をプロジェクト名などに変更してください。

### Vagrantを実行

下記コマンドでインストール作業を実行します。

```bash
vagrant up
```

しばらく待ちます。。。

以下のテキストが表示されれば完了です。

![スクリーンショット 2015-03-27 17.18.44.png](https://qiita-image-store.s3.amazonaws.com/822/15535/ff89c39b-b2f9-684b-003a-49546d7c4f39.png "スクリーンショット 2015-03-27 17.18.44.png")


### ブラウザで確認
すでにVirtualBoxが起動しているので下記URLにアクセスする。
http://192.168.44.44


### SSHでアクセス
SSHでVirtualBoxにアクセスします。vagrantコマンドでアクセスできます。

```bash
$ vagrant ssh
```

### Drupalをインストール

```bash
vagrant guest$ rm -rf ~/sites/drupal7
vagrant guest$ cd ~/sites
vagrant guest$ drush dl drupal-7 --drupal-project-rename="drupal7"
vagrant guest$ drush @drupal7 si standard -y
```

これでDrupalのインストールが完了しました。
以下のURLにアクセスしてください。ページが表示されればOKです。

http://192.168.44.44/drupal7/


### VDDの高速化

このままでは動きが遅いので、高速化します。これはMacしかできません。
config.jsonを開き、以下の記述を探します。

![スクリーンショット 2015-03-27 17.58.48.png](https://qiita-image-store.s3.amazonaws.com/822/15535/5ee77c00-74d6-47f2-1edd-3fc2cddfdaea.png "スクリーンショット 2015-03-27 17.58.48.png")

typeの箇所を変更します。
![スクリーンショット 2015-03-27 17.59.52.png](https://qiita-image-store.s3.amazonaws.com/822/15535/f95875fe-23a4-44c6-3024-1df486a61dc2.png "スクリーンショット 2015-03-27 17.59.52.png")

最後にvagrantをリロードします。

```bash
$ vagrant reload
```

これで高速が完了です。


### 仮想環境と同期するディレクトリを設定する。

今のままでは、
http://192.168.44.44/drupal7/
がindexになるため、変更します。

config.jsonファイルを開き

```json
{
  "vm": {
    "ip": "192.168.44.44",
    "memory": "1024",
    "synced_folders": [
      {
        "host_path": "data/drupal7/", /* drupal7/ を追加 */
        "guest_path": "/var/www",
        "type": "default"
      }
    ],
    "forwarded_ports": []

```

のように変更します。

最後に下記コマンドを実行します。

まずは、一度vagrantを落とします。既に停止してる場合は必要ありません。

```bash
vagrant halt
```

Provisionを実行

```bash
vagrant provision
```

再度起動します。

```bash
vagrant up
```

http://192.168.44.44/
にアクセスして表示されれば完了です。

これで開発環境が整いました！
ファイル名が-(ハイフン）から始まる場合のコマンド操作　忘備録


AWS上でHadoopを使いデータを集計して、S3に結果のファイルを保存する場合、
ファイル名が自動保存されるため、時よりファイル名が-（ハイフン）で始まる場合があります。
こうなるとlzo形式などで圧縮している場合、解凍をしようにも解凍ができません。

なので、ファイル名を変更してから保存する必要があります。
ハイフンが付いている場合は、mvコマンドにオプションを指定しなければなりません。

```shell
mv -- -hogehoge.txt
```

ちなみに、rmコマンドも

```shell
rm -- -hogehoge.txt
```

などにしないとコマンドが効かないです。
Google App EngineのDatastoreとSearch APIの連携

## Google App EngineのDatastoreとSearch APIの連携

Datastoreにデータを保存しつつ、Search APIのIndexに登録したいというシチュエーションはかなりあると思われる。しかし、トランザクションに注意しなければ、Datastoreに保存されているにも関わらず、Search APIのIndex（以下、IndexといえばSearch APIのIndexを指すこととする）に登録されていないということが起こりえてしまう。

そこで、DatastoreとIndexに（ほぼ）同時にデータを登録する方法について考える。

1. _post_put_hookを使う方法（一貫性が保証されない）
2. シンプルに@ndb.transacationalを使う方法（一貫性が保証）
3. Task Queueを使う方法（一貫性が保証）
4. 結論

**1の方法はおすすめしない**。ただ、1の方法を使っている例が見受けられる（Stack Overflowで回答として提出されていたのが１つ。そして、Ferris2.2が1の方法使っている。）ため、一応紹介している。



### <a id='_post_put_hook'></a>1. _post_put_hookを使う方法

特に理由がない限り、**おすすめしない**。

    class User(ndb.Model):
        name = ndb.StringProperty()
        
        def _post_put_hook(self, future):
            result = future.get_result()
            # Search APIのIndexに登録
            ...

post_put_hookは、Userがputされた後に呼び出される。もし、putが失敗していたら、future.get_result()の部分でエラーが送出されるため、Indexに登録されることはない。しかし、Userの登録が成功したのに、Indexへの登録が失敗する可能性はある。

つまり、この方法ではDatastoreとIndexの一貫性が保証されていない。一貫性が保証されなくてもよいなら問題はないが、そうでないなら避けるべきだ。



### 2. シンプルに@ndb.transacationalを使う方法

    user = User(name='Yohei')
    
    @ndb.transactional
    def put():
        user.put()
        doc = search.Document(
            doc_id = person.key.urlsafe(),
            fields=[
                search.TextField(name='name', value=user.name),
            ],)
        index.put(doc)
        
    put()

これならば一貫性は保証される。しかし、次のような例では気をつけなければいけない。

    user = User(name='Yohei')
    
    @ndb.transactional
    def put():
        user.put()
        doc = search.Document(
            doc_id = person.key.urlsafe(),
            fields=[
                search.TextField(name='name', value=user.name),
            ],)
        index.put(doc)
        # do something
        ...
        
    put()
    
ここでdo somethingの部分でエラーが起こると、Datastoreに登録されないが、Indexには登録されるということが起こりえる。




### 3. Task Queueを使う方法

**Task Queueはtransactionalに処理することができる。[^2-1]**よってTask Queueに「Search APIのIndexへの登録」というタスクを積めば、一貫性が保証できる。

    user = User(name='Yohei')
    user2 = User(name='Yohei2')
    
    @ndb.transactional(xg=True)
    def put():
        user.put()
        user2.put()
        taskqueue.add(
            url='/put_to_index',
            params={
                'key': user.key.urlsafe(),
                'name': user.name},
            transactional=True,)
        taskqueue.add(
            url='/put_to_index',
            params={
                'key': user2.key.urlsafe(),
                'name': user2.name},
            transactional=True,)
        # do something
        ...
        
    put()

これならばたとえdo somethingでエラーが発生したとしても、一貫性が保証される。例のように、同時に2つのIndexへの登録も可能だ。注意するのはtransactionalなTask Queueは5つまでしか積めないということ。同時に書き込みが多数あるシチュエーションでは避けるべきだろう。



### 4. 結論

2か3の方法を使う。シチュエーションに応じて使い分ける。


[^2-1]: https://developers.google.com/appengine/docs/python/taskqueue/#Python_Tasks_within_transactions
dockerのお勉強備忘録

すっかりdockerが記憶から消えたので、参考サイトの通りに
コマンドを打ってdockerを再勉強してみようと思う。

入力したコマンドは記録しておく。

随分前にインストールしたのでいきなりhello worldを出力して終了するコマンド。
```sudo docker run centos /bin/echo "Hello World"
Hello World
```

docker上のシェルにログインしたい場合は -i -hオプションをつけてdocker起動

```sudo docker run -i -t centos /bin/bash
cat /etc/redhat-release
CentOS Linux release 7.0.1406 (Core)
bash-4.2# exit
```
立ち上げたコンテナ内のシェルに入るには
```sudo docker run -i -t centos /bin/bash
bash-4.2#
```

バックグラウンドコンテナを起動するには
```
sudo docker run -d　centos /bin/bash
```

現在稼働中のコンテナを調べるコマンド
```sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
2bccf43d9d91        centos:centos7      /bin/bash           23 seconds ago      Up 23 seconds
```

ctl+p、ctl+qで抜けたコンテナに戻る場合(attach)
```
sudo docker attach 2bccf43d9d91
bash-4.2#
```

終了したコンテナも含めて表示
```sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                                               NAMES
eebbc62fd3f5        centos:centos7      /bin/bash              3 minutes ago       Exit 0                                                                  naughty_feynman
49e832500481        centos:centos7      /bin/bash              9 minutes ago       Up 9 minutes                                                            silly_wright
a53fc1da43d2        centos:centos7      /bin/echo Hello Worl   10 minutes ago      Exit 0                                                                  furious_pasteur
```

意外に簡単だ。

[参考　CentOS 6.5 で Docker を使ってみる](http://momijiame.tumblr.com/post/70679588212/centos-6-5-docker)
[参考　Dockerに入門してみた](http://qiita.com/zembutsu/items/3a396dd1e9d16193b0ba)
RubyでCron処理みたいな事をしたい


公開しているサーバーの負荷状況を仕事してる時にも知りたいと
思って[Notificationの出し方](http://qiita.com/manuluu/items/cfba3e7734036e389768)なんかを調べてたら何かが降りてきて数分毎にNotificationだそうとか考えた。

## 使ったGemとか
* Nokogiri
	- スクレイピングの大御所
* Menchanize
	- Nokogiriを使いやすくしてくれる
* Clockwork
	- Cronの代替。時間が来ると実行してくれる。

## コード

```ruby
require 'clockwork'
require 'mechanize'

module Clockwork
  handler do |job|
    job.call
  end
  every(
    1.minutes,
    lambda do
      url = 'http://path/to/site'

      items = []
      agent = Mechanize.new
      page = agent.get(url)
      node = page.search('node')
      node.search('item').each do |item|
        value = []
        item.search('hoge').each do |hoge|
			# 何かしらのデータの取得
        end
        items.push(value)
      end
      message = ""
      items.each do |item|
		# 何かしら通知文作成
      end
      `osascript -e 'display notification "#{message}" with title "#{page.title}"'`
    end
  )
end
```

Clockworkのモジュールの中でJobをコールして1分おきに`lambda do`の中身を実行する。
`lambda do`の中ではMenchanizeでスクレイピングをして結果を`osascript -e ....`でNotificatioに流す仕組み

後はAutomatorとかで起動時に実行すればいいんじゃないかなぁって。

## 参考にしたサイトとか
http://qiita.com/manuluu/items/cfba3e7734036e389768
http://www.xmisao.com/2013/10/05/ruby-www-mechanize.html
http://www.ownway.info/Ruby/index.php?clockwork%2Fabout
http://xoyip.hatenablog.com/entry/2014/02/17/222721
最近知ったGitHub Pagesの機能など

## Jekyll無効化

`gh-pages`ブランチ直下に`.nojekyll`という名前の空のファイルを置いておくとJekyllが無効化できる。

## SassとCoffeeScriptの自動コンパイル

`.sass`や`.scss`や`.coffee`のファイルを置いておくと自動でコンパイルしてくれる。

`index.scss`を置いておくと、プッシュしたあとにコンパイルされて`index.css`が生成される。

（`index.html`に`<link rel="stylesheet" href="index.css">`と書いて`index.scss`を置いて`gh-pages`にプッシュすると、`gh-pages`にプッシュされているのは当然`index.scss`だけど、ページにアクセスする際には`index.scss`から生成された`index.css`が読み込まれるということです）

注意点としては以下のように`---`を先頭に書いておかないとコンパイルされないみたい。

```scss:index.scss
---
---

body {
  background-color: white;
  color: black;
}
```

https://github.com/blog/1867-github-pages-now-runs-jekyll-2-2-0

## CDNを使ってるので速い

元々の`username.github.io`や、`CNAME`にサブドメインを書いている場合はCDNからファイルが配信されて表示が速くなるみたい。

Apex(Naked)ドメイン（`example.com`みたいなやつってこういう風に呼ぶのか）の場合はDNSが`ALIAS`や`ANAME`を使えればCDNを使えるみたい。

https://github.com/blog/1715-faster-more-awesome-github-pages
http://mojavy.com/blog/2014/02/13/faster-github-pages/

## sitemap.xmlの自動生成

```yaml:_config.yml
gems:
  - jekyll-sitemap
```

と書いておくと`sitemap.xml`が自動で生成される。たぶん検索に引っかかりやすくなる。

これはGitHub Pagesの機能でなくてJekyllのプラグインの機能かな。

## github-pages gem

GitHub Pagesのgemというのが存在するらしい。ローカルにGitHub Pagesの機能と同じものを構築できる？

```shell-session:Terminal
$ gem install github-pages
```

https://github.com/blog/1581-cutting-the-github-pages-gem
SwiftでNSDateを直感的に扱う

[Timepiece](https://github.com/naoty/Timepiece)というライブラリを使うとNSDateを直感的に扱うことができる。

```swift
import Timepiece

// 3時間前
var date = 3.hours.ago

// 4年後
date = 4.years.later

// 今日（0:00）
date = NSDate.today()

// 明日（0:00）
date = NSDate.tomorrow()

// 昨日（0:00）
date = NSDate.yesterday()

// 足し算・引き算
date = NSDate() + 1.month
date = NSDate() - 5.minutes

// 正月
date = NSDate().beginningOfYear

// 特定の日時
date = NSDate.date(year: 2014, month: 8, day: 15, hour: 15, minute: 1, second: 43)
date = date.change(month: 2, day: 10)
```

以上、自分で作ったライブラリの宣伝でした。issueやPull requestお待ちしてます。
mysqldumpで「SET OPTION SQL_QUOTE_SHOW_CREATE=1」なエラーが出た

最新のデータベース定義を取得しようとして、mysqldumpを実行しました。
普段なら下記のコマンドでdumpできるのですが…

実行したコマンド

```
mysqldump -h HOGEDB --databases MASTER -u admin -p > /tmp/MASTER.sql
```

エラーが出た。

```
mysqldump: Couldn't execute 'SET OPTION SQL_QUOTE_SHOW_CREATE=1': Unknown system variable 'OPTION' (1193)
```

調べてみたところ、サーバとクライアントのバージョン差異から起きる可能性があるらしい。

対象のDB

```
mysqldump -V
Ver 10.15 Distrib 10.0.11-MariaDB, for Linux (x86_64)
```

クライアントのドライバ

```
mysqldump -V
Ver 10.13 Distrib 5.1.37, for pc-linux-gnu (i686)
```

Maria10系は、MySQLでいうと5.5以上になるから、ドライバのほうが確かに（相当）古い。
ただしドライバの更新を気軽に行えない共同サーバなので、
今回は後発で構築していた別のサーバからmysqldumpを実行しました。
（バージョンは、サーバと同じもの）

今度は無事に成功！
PEARなどでstrict standards non-static method pearとでるときの対処方法

PEARをPHP5.3などで動かすとして、
``strict standards non-static method pear``
とでるときがあるが、
それの対処方法は、対象の関数の前にstaticを宣言するといいそうだ。

``$pager  = Pager::factory($params);``

``static function &factory($options = array())
{
``
Project Eulerをhaskellで練習していく日記: Problem 10

#問題
10未満の素数の和は、2 + 3 + 5 + 7 = 17　である。
同様に2000000未満の素数の和を求めよ。
#回答
```hs
-- Atkinの篩
-- http://en.wikipedia.org/wiki/Sieve_of_Atkin
-- を参考に実装しました

import qualified List as L
import qualified Data.Set as S

limit=2000000::Integer --ふるいにかける上限
slimit = (truncate $ sqrt $ fromIntegral limit)::Integer -- 上限の平方

-- 条件のテンプレート
gcond f g x y stack
  | x>slimit = stack
  | y>slimit = gcond f g (x+1) 1 stack
  | otherwise = if n<=limit && m
                       then gcond f g x (y+1) (n:stack)
                       else gcond f g x (y+1) stack
                       where n = f x y 
                             m = g n x y

-- 上記テンプレートを使って、個別の条件を実装
cond1 = gcond (\x y -> 4*x^2+y^2) (\n x y -> n `mod` 12==1 || n `mod` 12==5) 1 1 []
cond2 = gcond (\x y -> 3*x^2+y^2) (\n x y -> n `mod` 12==7) 1 1 []
cond3 = gcond (\x y -> 3*x^2-y^2) (\n x y -> x>y && n `mod` 12==11) 1 1 []

-- 上記３条件で奇数個の解を持つものだけを取り出し、候補とする
cond = map head $ 
       filter (\x->length x `mod` 2==1) $ 
       L.group $ L.sort (cond1++cond2++cond3)

-- 素数の平方の倍数の一覧を作る
elim = S.fromList $ concat [[x^2,2*x^2..limit] |x<-cond, x<=slimit]

-- 候補から平方倍数一覧を除外して5以上の素数一覧を作成
prims = S.difference (S.fromList cond) elim

main = do  --以下の5+というのは最初の二つの素数2,3の和の部分
     print $ 5+(foldl1 (+) $ S.toList prims)
```
#感想
エラストテネスの篩は遅いだろうと想像がついたので、wikipediaを参考に、[Atkinの篩](http://en.wikipedia.org/wiki/Sieve_of_Atkin)というのを実装してみた。
まあまあ速いのではないだろうか。

おもいっきり手続き型のシュードコードを参考にしたので、あまりhaskell的ではないかもしれません。

初めてData.Setというものを使ってみた。便利。（集合の差分を計算するため）
Android に学ぶ SQL Injection

Android のデータベースといえば、SQLite ですが、大抵の場合、ContentProvider によって CRUD がラップされ、ContentResolver 経由でデータソースにアクセスすることになります。
この設計によって、モデル内のデータソースが何であれ、CRUD のインタフェースが統合されるので、データソースのレイヤがどうなっているかをデータ利用者側が意識する必要がないようになっています。

が、そのインタフェースはシンプル故に、凝ったことをしようとすると、ContentProvider が頑張るか、利用者が頑張るかしないといけなくなります。

特に、データソースが SQLite の場合、SQL なら便利に出来ていたことが途端に難しくなります。例えば、行データの重複を消したり、グループ化したり、など。
Cursor からデータを取り出して、自分たちで同じような機能を実現することもできますが、できることなら SQL で実現したほうがいいですよね。

さてここで、`ContentResolver#query()`の`projection`や`selection`が文字列配列や文字列で渡せることを思い出してください。
文字列で渡せるということは、好きな SQL をそこに書くこともできる、ということです。実際、システムでは、以下のテンプレート文字列に合わせて SQL が構築されるため、比較的容易に好きな SQL を注入することができます。まさに SQL Injection そのものですね。

`SELECT %s FROM %s WHERE (%s)`

例えば、`GROUP BY`を使いたければ、以下のように問い合わせることで実現できる可能性があります。

```

Cursor c = resolver.query(CONTENT_URI, null, "1) GROUP BY (some_column", null, null);
```

こうすると、例えば、以下のように SQL が構築されれば成功ですね。

`SELECT * FROM some_table WHERE (1) GROUP BY (some_column)`

WHERE 句は常に TRUE です。そこに閉じカッコからの GROUP BY 句を挟むことで、GROUP BY が実現できます。

実際、このテクニックは、ギャラリーアプリで使われていて、[このコード](https://android.googlesource.com/platform/packages/apps/Gallery2/+/android-4.4.2_r2/src/com/android/gallery3d/data/BucketHelper.java)のL64あたりに書いてあります。

Sms も同様に、`Telephony.Sms`の CONTENT_URI に対して、上記のような SQL を発行することができます。

ただし、ContentProvider の実装によっては、うまくいかないものもあります。
たとえば、CallLog.Calls、これは、VoiceMail に関連するデータも含まれており、パーミッションなしにそのデータへのアクセスを許可しないようにしているため、パーミッションが無い場合は自動で WHERE 句に絞込の条件文が付与されるようになっています。そのような ContentProvider に対して、先のような SQL Injection を試すと、見事に文法が崩れてエラーとなります。

まあ、SQL Injection ですしおすし…

もし、DISTINCT したいのであれば、projection の配列を以下のようにすれば DISTINCT できますね。

```java

final String[] projection = new String[] { "DISTINCT hoge" };
```

ただし、selectionArgs に SQL を埋め込んでもシステム側でよしなに対策されて無害化されるので、こちらはハックできないようですね。

まさかそんな実装にすることは無いと思いますが、以下のようにしてしまうとガバガバになってしまうので気をつけましょう。

```java

void someQuery(String arg1) {
    Cursor c = resolver.query(CONTENT_URI, null, "some_column=" + arg1);
}
```

プレースホルダを使いましょう。
throbberをPNG画像とCSS3 Animationで作る

不勉強なことにCSS3 Animationはなめらかにスーッと滑らかに動くアニメーションしか出来ないと思っていたのですが、timing-functionにstepsというものがあってこれを使うとパラパラ漫画のようなアニメーションが出来ると知ったので、それを使ってthrobberを作ったメモです。

## throbberの画像を用意する

PNGでドットが8つ円形に並んでいる画像を1つ用意しました。

## HTMLを書く

```html
<img class="throbber" src="throbber.png" width="適当なwidth" height="適当なheight">
```

## CSSを書く

```css
.throbber {
	/* steps(1, start) は step-start でも良いみたい */
	animation: rotate-throbber 1.1s steps(1, start) 0s infinite;
	-webkit-animation: rotate-throbber 1.1s steps(1, start) 0s infinite;
	position: absolute;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	margin: auto;
}

@keyframes rotate-throbber {
	12.5% { transform: rotate( 45deg); }
	25%   { transform: rotate( 90deg); }
	37.5% { transform: rotate(135deg); }
	50%   { transform: rotate(180deg); }
	62.5% { transform: rotate(225deg); }
	75%   { transform: rotate(270deg); }
	87.5% { transform: rotate(315deg); }
	100%  { transform: rotate(360deg); }
}

@-webkit-keyframes rotate-throbber {
	12.5% { transform: rotate( 45deg); }
	25%   { transform: rotate( 90deg); }
	37.5% { transform: rotate(135deg); }
	50%   { transform: rotate(180deg); }
	62.5% { transform: rotate(225deg); }
	75%   { transform: rotate(270deg); }
	87.5% { transform: rotate(315deg); }
	100%  { transform: rotate(360deg); }
}
```

でいい感じにくるくる回ってくれました。
Rails 4 へ Rspec と factory_girl を導入する手順メモ


## 前提：今回の環境

- ローカルの Mac に 構築した Rails 環境に導入しました。
	- OS： `Mac OS X 10.9.4 (Mavericks)`
	- Ruby： `2.1.2`
	- Rails： `4.1.1`

## まず、デフォルトでインストールされた minitest を無効にする

`rails new` する際に `-T` オプションをつけておけば minitest は除外されているのですが、もし後から外したい場合は、`application.rb` を編集します。

```ruby:config/application.rb（変更前）
require File.expand_path('../boot', __FILE__)

require 'rails/all'

〜
```

```ruby:config/application.rb（変更前）
require File.expand_path('../boot', __FILE__)

require "active_model/railtie"
require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "action_view/railtie"
require "sprockets/railtie"
# require "rails/test_unit/railtie"

〜
```

この状態で `rails g` すると、minitest 用のファイルが生成されないのが確認できます。

## RSpec の導入

### `Gemfile` へ追記

```ruby:Gemfile
gem 'rspec-rails', group: [:development, :test]
```

### bundle install する

```shell
$ bundle install --path vendor/bundle
```

※ 私の場合は、`vendor/bundle` に gem を配置しています。適宜、読み替えてください。

次のよう(緑字)にインストールされます。

![スクリーンショット 2014-08-20 15.47.20.png](https://qiita-image-store.s3.amazonaws.com/0/35733/41e66c78-47eb-9f37-1fae-728b798f8885.png "スクリーンショット 2014-08-20 15.47.20.png")

### RSpec のインストール(一度のみ)

```shell
$ ./bin/rails g rspec:install
```

次のようにファイルが生成される。

![スクリーンショット 2014-08-20 15.50.47.png](https://qiita-image-store.s3.amazonaws.com/0/35733/f857783d-6f03-5227-b1ff-26f5fd1553f6.png "スクリーンショット 2014-08-20 15.50.47.png")

あとは、今後 `rails g` した際に、勝手に RSpec 用のファイルが作成されます。

![スクリーンショット 2014-08-20 15.56.40.png](https://qiita-image-store.s3.amazonaws.com/0/35733/86700fa6-cc06-3da0-53d6-ff1922861ed2.png "スクリーンショット 2014-08-20 15.56.40.png")

## factory_girl の導入

これをいれると、テストデータが作れるようになります。

### `Gemfile` へ追記

```ruby:Gemfile
gem 'factory_girl_rails', group: [:development, :test]
```

### bundle install する

```shell
$ bundle install --path vendor/bundle
```

次のよう(緑字)にインストールされます。

![スクリーンショット 2014-08-20 16.18.24.png](https://qiita-image-store.s3.amazonaws.com/0/35733/c0791704-5ea1-5388-34cb-fc6150121a66.png "スクリーンショット 2014-08-20 16.18.24.png")

あとは、今後 `rails g` した際に、factory_girlc 用のファイルが作成されます。

![スクリーンショット 2014-08-20 16.20.55.png](https://qiita-image-store.s3.amazonaws.com/0/35733/c56cefda-b29c-cf2f-bc7b-e1caded8745b.png "スクリーンショット 2014-08-20 16.20.55.png")
[MariaDB10.0] マルチソースレプリケーション環境下のmy.cnf(server.cnf)の設定について

マルチソースレプリケーションに関しては、以前、[これはすごい！mariadb10.0 でマルチソースレプリケーションが可能に](http://qiita.com/hit/items/515b033874757b18323e)にて紹介いたしました。マルチソースレプリケーション環境下での、my.cnf (mariadbでは、server.cnf）のちょっと変わったケースでのレプリケーション設定について今回は触れて見ようと思います。


## 下図のようなケースの場合、server.cnf にはどのような設定を加えれば良いでしょうか？

![multi_slave.jpg](https://qiita-image-store.s3.amazonaws.com/0/37544/a8c51917-205b-4932-0f91-27d8b9524231.jpeg)

### 要件
* SERVERXは、SERVER1,SERVER2からのレプリケーションを受ける 
* SERVER1の中には、schema1というデータベースが存在し、数あるテーブルの中からtable1のみSERVERXにレプリケーションする
* 上記SERVER1内の、schema1のtable1は、SERVERX内では、schemaXのtable1としてレプリケーションする
* SERVER2の中には、schema2というデータベースが存在し、数あるテーブルの中からtable1のみSERVERXにレプリケーションする
* 上記SERVER2内の、schema1のtable1は、SERVERX内では、schemaYのtable1としてレプリケーションする
* 上記図の通り、各schema内に存在するtable1以外のテーブルはすべてレプリケーションしない

といった感じでしょうか？

### 実装方法
マルチソースレプリケーション設定方法は割愛いたします。（前に書いたからｗ）以下では上記のような構成を実現するために、どのように、server.cnf にレプリケーション設定を入れるかをメインに説明いたします

で早速なのですが・・

* こんなかんじで、server.cnfに記載します

```
[mysqld]
・
・
# SERVERXのスキーマに合わせて、server1,server2のスキーマを、rewriteする
conn1.replicate-rewrite-db="schema1->schemaX"
conn2.replicate-rewrite-db="schema2->schemaY"

# 上記で名前を変更したスキーマをレプリケートする
conn1.replicate-do-db="schemaX"
conn2.replicate-do-db="schemaY"

# table1 限定でレプリケーションする
conn1.replicate-do-table=schemaX.table1
conn2.replicate-do-table=schemaY.table1

```
 
とこんな感じになると思います。
基本構文は、MySQL5.X系とか、Maria5.5系と同じです。マルチソースの環境では、コネクションの名前（ここでは、conn1,2）という接頭子をつけてね！という話でした。接頭子については、[さきほどのページ](http://qiita.com/hit/items/515b033874757b18323e)に説明しております
UnityでLeap Motionを扱う為の最低限のスクリプト

Leap Motionの最低限スクリプトになります。
指が有効であればInteractionBoxオブジェクトを使ってLeapMotionの座標系をディスプレイ座標系に変換して球体にマッチングさせています。

```csharp
using UnityEngine;
using System.Collections;
using Leap;

public class LeapSample : MonoBehaviour {
	Controller controller = new Controller(); 
	//指の数をカウント
	public int FingerCount;
	public GameObject[] FingerObjects;

	// Use this for initialization
	void Start () {
	}
	
	// Update is called once per frame
	void Update()
	{
		Frame frame = controller.Frame();
		FingerCount = frame.Fingers.Count;
		//指が有効であればInteractionBoxオブジェクトを使ってLeapMotionの座標系をディスプレイ座標系に変換する
		InteractionBox interactionBox = frame.InteractionBox;

		Hand hand = frame.Hands.Rightmost;
		float strength = hand.GrabStrength;
		Debug.Log (strength);

		for ( int i = 0; i < FingerObjects.Length; i++ ) {
			var leapFinger = frame.Fingers[i];
			var unityFinger = FingerObjects[i];
			SetVisible( unityFinger, leapFinger.IsValid );
			if ( leapFinger.IsValid ) {
				Vector normalizedPosition = interactionBox.NormalizePoint(leapFinger.TipPosition );
				normalizedPosition *= 10;
				normalizedPosition.z = -normalizedPosition.z;
				unityFinger.transform.localPosition = ToVector3( normalizedPosition );
				
			}
		}
	}

	//検出した指の有効/無効状態いよって、Sphereの表示と非表示をする。
	void SetVisible( GameObject obj, bool visible )
	{
		foreach( Renderer component in obj.GetComponents<Renderer>() ) {
			component.enabled = visible;
		}
	}

	Vector3 ToVector3( Vector v )
	{
		return new UnityEngine.Vector3( v.x, v.y, v.z );
	}
}

```
Inspectorの設定は以下のような感じ
![スクリーンショット 2014-08-20 16.16.33.png](https://qiita-image-store.s3.amazonaws.com/0/38279/02e4653c-249d-7148-9844-1ed706a2de56.png)

実行すると球体が座標とマッチします。
![スクリーンショット 2014-08-20 16.19.38.png](https://qiita-image-store.s3.amazonaws.com/0/38279/77157219-84ea-82c0-4f80-01707954b8f0.png)
【レスポンシブ対応できる】高さを揃えられる「jquery-match-height」が使えそう

[jquery-match-height](https://github.com/liabru/jquery-match-height)が大変便利そう。

#メリット
- レスポンシブで列の数が変わっても、その列で自動に高さを揃えてくれる
- padding,margin,border,box-sizingに対応
- 非表示の要素は無視してくれる
- IE8+に対応
- 削除できる
- 正しいスクロール位置を維持する
- 必要なときに高さを更新することもできる

#デメリット
- ディスプレイのフォントサイズ拡大縮小には対応していないので、必要ならば[jQuery exResize](http://d.hatena.ne.jp/cyokodog/20101101/exresize01)などを使う必要がある

デモ（フォントサイズ拡大縮小対応版）：http://jsrun.it/Ituki/2NLm
Rで超幾何分布を用いてp-valueを計算する

overrepresentationを計算するときに、p(X>=x)を計算したい。
しかし、Rの`phyper`では`p(X<=x)`を計算するため、工夫が必要。

```r
x # white balls drawn
m # nunmber of white balls in bag
n # number of black balls in bag
k # number of balls drawn
 
p <- 1 - phyper(x-1, m, n, k) # P[X >= x] = 1 - P[X <= x-1]
```
Cordova(PhoneGap)を使ったネイティブアプリ事例

# 前書き

[smartFX](http://smartfx.minkabu.jp)というモバイル向けFXの情報サイトを運営しています。
この度(2014/8/15)、smartFXの[バーチャルトレード機能](http://smartfx.minkabu.jp/demos)を
Apache Cordova(PhoneGap)を使って、ネイティブアプリとしてリリースしました。[smartFX Virtural Trade](http://smartfx.minkabu.jp/s/virtual-trade.html)

おかげ様で、リリース直後に[マイナビニュース](http://news.mynavi.jp/news/2014/08/15/306/)にとりあげていただき、そこから派生してYahooやGunosyにも掲載され、いきなりWebアプリ利用者を越えるぐらいの多くの人に使ってもらえるようになりました。

ここでは、Webアプリに対するネイティブアプリの利点やCordovaによるアプリ作成ってどうなのよ？というところを述べたいと思います。

# Webアプリに対するネイティブアプリの利点

smartFXは、2014年2月28日にWebアプリとしてリリースして約半年になります。
スマホ向けのFXは、アプリはあってもWebサイトとしてはほとんどありませんでした。
Backbone.jsとSocket.IOを使ったSinglePageApplication(以降SPA)により、ネイティブと変わらないリアルタイムな応答性をもつsmartFXのWebサイトは、注目されるのではと思っていました。
ソーシャルボタンも各ページに配置し、リンクで簡単に共有できるというWebサイトの利点によりSNSによる拡散を期待していました。
が、残念ながらSNSでの広がりはほとんどありませんでした。
Web技術者の間で拡散していただけましたが、FXに興味があるという訳ではないのでその日のうちに収束しました。

また、残念ながらスマホ向けのSPAは、検索エンジンに対して非常に弱いです。
このあたりは[SinglePageApplicationにおける問題点と対応](http://qiita.com/takeshy/items/b7e1b6bd30d12ecb02c6)に記載しています。


やはり現状スマホは、ネイティブアプリ有利のようです。

* スマホの利用時間のほとんどがネイティブアプリの利用に費やされている
* 検索エンジンで"FX バーチャル"で検索すると204000件、AppleStoreで検索するとわずか十数件。
* プレスリリースがWebと比較して記事やSNSに取り上げてもらいやすい
* ホーム画面にアイコン登録されることで、常に意識してもらえる
* 人気が出るとランキングに表示されることで導線ができる
* Push通知が使える

そして、ネイティブ化って簡単にできるの？という点について、もしWebサイトがSPAで作成されていればApach Corodvaというツールを使って、簡単にネイティブ化できます。

#Apache Cordova(PhoneGap)によるアプリ作成について

[Apache Cordova](http://cordova.apache.org/)とは予めWebViewのみで構成されたネイティブアプリの骨組が用意されており、HTMLとJSを記述するだけでネイティブアプリが作れるというものです。
さらにJSからpluginとして用意されているネイティブの機能を呼び出すことができます。
ただ、ネイティブの機能を自在にあやつれるという訳ではなく、あくまでpluginとして用意されているAPIに制限されます。
言うなれば、Webアプリ+αの感覚です。
smartFXでネイティブの機能としてPush通知を使っています。
(厳密に言えばInAppBrowserと呼ばれるアプリ内ブラウザも)

CordovaとWebアプリの開発の違いは、HTMLファイルはWebサーバではなくアプリ内に置いておくということです。
Cordovaのアプリは、HTML内からアプリ内のCordova.jsというjsを読み込む必要があります。
アプリ内のHTML内からリンクを経由してWebサイトのHTMLを開くことも可能ですが、アプリ内に戻れなくなるため、リンク先をアプリ内に留めておく必要があります。

そのため、複数画面で構成されるWebアプリの場合は、下記のどちらかを選択します。
1.必要となる画面のHTMLをアプリに置いておく
2.SPAにする

1.はSPAに慣れていない人にとっては楽な方法かもしれませんが、結局データのやり取りはAjaxで行う必要があるため簡単という訳でもなく、また、WebViewの利点であるAppleに申請なしに更新するといったことができないため、基本は2.のSPAが選択されることになると思います。

2.のSPAは、もととなるWebアプリがSPAで構成されていれば移行はすぐです。
smartFXでは、移行+Push機能の追加を開発者１人で1週間足らずでできました。
アプリ自体はWebサイトと共通のSPA用のJS + ネイティブ用のjs(Push通知、JSの動的ロード)で構成されています。

注意点としては、見た目もネイティブっぽくしないとAppleからRejectされてしまうということです。
smartFXでは、はじめからネイティブ化も想定していたため、テキストリンクを廃止して、画像やアイコンを使って見た目をできるだけネイティブっぽくしていました。ネイティブ特有機能はpush通知だけでしたが、問題なく審査が通りました。

ObjectCを1行も書いたことがなく、書くこともないままiOSアプリが作れたことを考えると、Cordovaはすごいツールだと思います。

# まとめ

現状スマホのSPAサイトの実装はまだ簡単ではないです。
[スマホ用のSingle Page Applicationサイトを作る上での問題点と対応](http://qiita.com/takeshy/items/892c0b0c5b5dc3885570)
この辺が素直に実装できるようになって、さらにiOS8から導入されるJITつきのWKWebViewにCordovaが対応してくれるようになり、パフォーマンスが上がってくると、Cordovaが俄然注目されるはずです。
HTML5とネイティブアプリは対立軸で語られることが多かったですが、今後は変わっていくかもしれません。

**追記**
実装についても書きました。
[Apache Cordova(PhoneGap)開発におけるTips](http://qiita.com/takeshy/items/e35595fa65ec7d8d3b99)
authenticator.xml の accountType の文字列を strings.xml に入れてはいけない

### authenticator.xml の account type について

`authenticator.xml`に、`AccountManager`に登録されるアカウント認証にまつわるメタデータを記述しますよね。
このとき、`android:accountType`という文字列属性の値に、以下のように書いたことはありませんか？

```xml

<authenticator
  android:accountType="@string/account_type"/>
```

Build Variant ごとにリソースが別れてくれれば、リリース版とデバッグ版で Account Type が切り替わってくれるのでそれぞれにアカウントが分けられて便利！というノリで、このように書きたくなりますが、実は罠があります。

### 突然の bind failure

デバッグをしていると、アプリを何度もインストールしなおしたりすることがあります。そんな時、アカウントの作成を実行していると、唐突に見慣れない例外が飛んでくることがあります。

```

android.accounts.AuthenticatorException: bind failure
at android.accounts.AccountManager.convertErrorToException(AccountManager.java:1437)
at android.accounts.AccountManager.access$400(AccountManager.java:138)
at android.accounts.AccountManager$BaseFutureTask$Response.onError(AccountManager.java:1342)
at android.accounts.IAccountManagerResponse$Stub.onTransact(IAccountManagerResponse.java:69)
at android.os.Binder.execTransact(Binder.java:320)
at dalvik.system.NativeStart.run(Native Method)
```

しかも、再現性があるわけではなく、例外が飛ぶ時と飛ばない時があります。
例外のメッセージも、bind failure としか出ないので、なんのこっちゃい、という感じです。

### authenticator のメタデータがうまく登録されていない

この例外が起きる時、システムで何が起こっているかと言うと、authenticator.xml に書いたメタデータがうまく登録できていない状態にあります。
Android の場合、Account は Account Type に紐付けられて管理されますので、先述の例外の"bind failure"とはまさに、紐付ができないことを示していることになります。
つまり、`authenticator.xml`の`android:accountType`が正常に登録されていない、ということです。

実際、dumpsys コマンドでアカウントに関する情報を表示すると、期待したとおりに account type が設定されていないものが確認できます(上記例外が発生している状況の場合のみ)。

なぜこれが起こるのか、定かな情報はまだありませんが、`android:accountType`に文字列の参照を渡した場合に、その参照がうまく解決されず、リソース ID がそのまま文字列として使われてしまうことがあるようです。

http://stackoverflow.com/questions/3774282/securityexception-caller-uid-xxxx-is-different-than-the-authenticators-uid

再現性のない問題ですので、もし`authenticator.xml`を準備することがあるのであれば、文字列リソースではなく、Build Variant ごとに`authenticator.xml`を用意するのが得策です。
Gitの基本ブランチモデル2つ - Git Flow / GitHub Flow -

Gitは、分散型バージョン管理システムで、そのブランチモデルには大きく2つのモデルがあります。
Git FlowとGitHub Flowです。

#Git Flow
しっかりしたモデルなため、少々、複雑。
git-flowを利用。
http://keijinsonyaban.blogspot.jp/2010/10/successful-git-branching-model.html

#GitHub Flow
シンプルなモデルでリリース間隔が短いものに対応。
Pull Requestが特徴。
https://gist.github.com/Gab-km/3705015

ということで、いわゆるDevOpsと言われるスタイルを目指すのならGitHub Flowか。
エンタープライズスタイルならGit Flow？

--
20140820 initial
[GAS]Script Editorにヒント機能が追加されました。

全国の100人ぐらいいたらいいなGASユーザの皆さんこんにちは サントリー事大橋です。
個々最近1日で人間とリアルに話す文字数が100文字ぐらいでしんどいですね★
※理由は置いておいて

さてGoogle Apps ScriptのScript Editorに新しいボタンが追加されたので紹介します。



## ヒント機能

実行ボタンの横にボタンが追加されています。

![hint.png](https://qiita-image-store.s3.amazonaws.com/0/2965/4c28a75e-72fd-88b1-9e9b-0858afd1a8fb.png)

## 使い方

単純にScript Editor上でコードを実行すれば実行した関数に対する「ヒント」が表示されるようです。
パフォーマンスの悪いコードや、非推奨になっているコードを指摘してくれるようです。
※今他に何が有るか調べています。

ちなみに一つも指摘がないとボタンが活性化されないのでわかりづらいです。

 ![m1.png](https://qiita-image-store.s3.amazonaws.com/0/2965/e97e837a-c165-522b-c7a3-9243ce06a35f.png)
※myFunctionを実行した場合

![m2.png](https://qiita-image-store.s3.amazonaws.com/0/2965/7f2bbf1a-5bcf-a5fd-fe49-cb88f6bd4df9.png)
※deprecatedを実行した場合

## 所感

少し前にAtmosphere Tokyoで「[パフォーマンスの良いGASの書き方](http://www.slideshare.net/soundTricker/gas-best-practice)」の話をしたのですが、
その辺のTipsはだいたい入っているっぽくて非常に良いですね。
世の中に散在しているパフォーマンスの悪いGASが無くなってくれるとよいですね。
Vagrantのchef-soloで暗号化Data Bagを使用する

knife-soloではなくchef-soloオンリーで暗号化Data Bagを使用する。

参考サイト
http://nmbr8.com/blog/2014/06/24/chef-solo-encrypted-data-bags/
http://kataring.hatenablog.com/entry/2013/05/15/193430
http://blog.kenjiskywalker.org/blog/2013/05/20/chef-databag/

chefの作業ディレクトリはできてるという前提で。

##data_bag用の秘密鍵を作成

```
rand -base64 512 > .chef/encrypted_data_bag_secret
```

##暗号化したいファイルを作成する

```bash
export EDITOR=vim
knife data bag create hoge fuga --secret-file .chef/encrypted_data_bag_secret --local
```

エディタが開くので暗号化したいデータをjsonで書く。

```json
{
  "id": "fuga",
  "password": "secret_password"
}
```

以下のようにディレクトリとファイルができる

```
data_bags
  |-hoge
      |-fuga.json
```

##Vagrantfileでencrypted_data_bagの設定をする

設定例です

```
  config.vm.provision "chef_solo" do |chef|
     chef.cookbooks_path = ["../../cookbooks", "../../site-cookbooks"]
     chef.roles_path = "../../roles"
     chef.data_bags_path = "../../data_bags"
     chef.encrypted_data_bag_secret_key_path = "../../.chef/encrypted_data_bag_secret"
     chef.run_list = ["role[hoge]"]
  end
```

以下がdata bagの設定

```
chef.data_bags_path 暗号化済のdata bagのディレクトリのパス
chef.encrypted_data_bag_secret_key_path　作成した鍵ファイルのパス
```

これでvagrant provision時に鍵が転送され作成されたサーバーでchef-soloを実行できる

ちなみに単純にchef-soloで実行する際のsolo.rbのファイルは以下のような設定で大丈夫でした

```
file_cache_path "/tmp/chef-solo"
cookbook_path ["/root/chef/cookbooks", "/root/chef/site-cookbooks"]
role_path "/root/chef/roles"
data_bag_path   '/root/chef/data_bags'
encrypted_data_bag_secret '/root/chef/.chef/encrypted_data_bag_secret'
```

##レシピ内で暗号化されたデータをデコードして使用

```rb
data_bag = Chef::EncryptedDataBagItem.load('hoge','fuga')
p "#{data_bag['password']}"
```

chef-solo実行で「secret_password」とログにできたらデコードできている

## 暗号化されたjsonファイルを編集したり閲覧したり

編集

```
knife data bag edit hoge fuga --secret-file .chef/encrypted_data_bag_secret --local
```

保存時にjsonのsyntaxエラーとかがあった場合は編集作業は消え去るのでこまめに保存しながら作業するといいと思います。


閲覧

```
knife data bag show hoge fuga --secret-file .chef/encrypted_data_bag_secret --local
```


## (使用例) 鍵ファイルを暗号化してdata bagにつっこむ

data bagにファイルも含めれたら便利なんだけど現状ではjsonでないとできない様子です。
鍵ファイルを含めたかったのですが、以下のように設定すれば正常動作できました。

jsonファイルには鍵ファイルの改行を\nと記述して入力する

こんな感じで

```json
{
  "id": "fuga",
  "secret_key": "-----BEGIN DSA PRIVATE KEY-----\nMIIBvAIBAAKBgQD0ZfP4CvTUwN77RPXcMeINO7rtJYuxg7fyEUlcOSTnpECOfImF\nMANsY/HTVLWXa8at7zeZ8cBYMCKsWnzAZZLZfC1id+G ...(以下略)"
}
```

data bagにある文字列を任意の場所に鍵ファイルとして設置するレシピ例

```rb
data_bag = Chef::EncryptedDataBagItem.load('hoge','fuga')

execute "create_key" do
  command "echo \"#{data_bag['secret_key']}\" > /root/.ssh/secret_key ; chmod 600 /root/.ssh/secret_key"
  user "root"
  group "root"
  action :run
end
```

/root/.ssh/secret_key ができる

## はまった所

Chef::EncryptedDataBagItem.loadで以下のエラーが出た

```
FATAL: Chef::EncryptedDataBagItem::DecryptionFailure: Error decrypting data bag value: 'wrong final block length'. Most likely the provided key is incorrect
```

鍵ファイルがおかしいかも、というエラー。
調べるとdata bagの秘密鍵(encrypted_data_bag_secret)の改行コードがテスト環境はwindowsだったので\r\nになっていたのが原因でした。
改行コードを\nにすると解決しました。
Railsのタスクから rake test* を消す

RSpecの場合は出ていても要らないので。

もし、 `require 'rails/all'` となっていたなら、

```rb:config/application.rb
# This skip loading rails/test_unit/railtie
%w(
  active_record
  action_controller
  action_mailer
  active_resource
  sprockets
).each do |framework|
  begin
    require "#{framework}/railtie"
  rescue LoadError
  end
end
```

のように書き換える。 [参考。](https://github.com/rails/rails/blob/4-1-stable/railties/lib/rails/all.rb) これは4.2だと必要な読み込み対象railtieが変わるっぽい。
Unityで音を再生する

GameObjectにサウンドファイルをドラック&ドロップして
audio Sourceを作った後で以下のスクリプトを使って音声を再生させる事ができます。
また、AudioClipを複数作る事でサウンドの切り替えも可能です。


```csharp
using UnityEngine;
using System.Collections;

public class SoundTest : MonoBehaviour {
	public AudioClip audioClip1;
	public AudioClip audioClip2;
	public AudioClip audioClip3;
	private AudioSource audioSource;

	void Start () {
		audioSource = gameObject.GetComponent<AudioSource>();
		audioSource.clip = audioClip1;
		audioSource.Play ();
	}

}

```

Insectorは以下のようになります。
![スクリーンショット 2014-08-20 14.59.28.png](https://qiita-image-store.s3.amazonaws.com/0/38279/5c211a94-274a-7820-9501-f2273861c439.png)

Audio Listenerも追加する。
![スクリーンショット 2014-10-03 10.52.08.png](https://qiita-image-store.s3.amazonaws.com/0/38279/b3802347-b3bc-1d6e-cb41-5a8552031445.png)

音声を同時に再生させる場合は、以下のように
AudioSourceを２つ以上にして操作するようにすれば良いです。

```csharp
using UnityEngine;
using System.Collections;

public class PlaySound : MonoBehaviour {
	private AudioSource[] sources;
	void Start () {
		sources = gameObject.GetComponents<AudioSource>();
	}

	
	void Update () {
		if(Input.GetKeyDown(KeyCode.K)) {
			sources[0].Play();
		}
		if(Input.GetKeyDown(KeyCode.L)) {
			sources[1].Play ();
		}
	}
}
```

Inspectorは、AudioSourceを複数にしています。
![スクリーンショット 2015-04-20 20.27.01.png](https://qiita-image-store.s3.amazonaws.com/0/38279/436f8783-772d-015a-6a65-5e6362840dc9.png)

再生時に音を鳴らしたくない場合は
Play On Awakeにチェックを入れなければなりません！
ログインしていない状態で訪れたURLをログイン後も継続する

ログインしていない状態であるURLをクリックする
　↓
ログインしていないのでログイン画面に行く
　↓
ログイン後、クリックしたURLではないページ（ログイン後のトップページ的なページ）に遷移してしまう
　↓
どのページに行きたかったんだっけ？シクシク

という状況を改善するため、ログインした後にクリックしたURLを継続して見られるようにするための方法を調べたので書いておきます。

# ログインしていない状態で訪れたURLをログイン後も継続する

## やりたいこと
あるURLに飛ぶ
　↓
ログインしている　→　あるURLに遷移
ログインしていない
　↓
ログイン画面に遷移してログイン
　↓
あるURLに遷移

## 仕組み
あるURLに飛ぶ
　↓
(logincheck.php)
ログインしている　→　あるURLに遷移
ログインしていない
　↓
ログイン画面に遷移するが、その際
あるURLのパスを取得してログイン画面のURLにパラメータとして付けておく
　↓
(login.php)
ログイン画面でパラメータのパスがついていたら
ログイン後のURLにパラメータのパスを付ける

## コード
```logincheck.php
$_SESSION["requesturl"] = htmlspecialchars($_SERVER["REQUEST_URI"]);
$loginngurl .= "?url=".$_SESSION["requesturl"];

ログインチェックOK　→　そのまま
ログインチェックNG　→　header("Location: ".$loginngurl);
```

```login.php
if ($_GET['url']) {
	$requesturl = $_GET['url'];
}
ログインできたら↓
if ($requesturl) {
	$loginokurl = $requesturl;
	header("Location: ".$loginokurl);
}
```
そのto_a、必要?

割とどうでもいい話。

数字を文字列化した配列が欲しいとき…

```rb
number_strings = (1..10).to_a.map{|n| n.to_s }
p number_strings
#=>  ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]


number_strings = []
[*1..10].each{|n| number_strings << n }
p number_strings
#=>  ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
```

とかやってませんか?

配列を作ってすぐに`map`とか`each`とか`select`するような場合、同じメソッドが`Range`にもあるので、`to_a`は要らない。

「`Array`と`Range`の両方にあるメソッド」は次のような式を実行することで列挙できる。

```ruby
p ((1..10).to_a.methods & (1..10).methods) - Object.new.methods
#=> [:to_a, :first, :last, :each, :reverse_each, :size, :find_index, :sort, :collect, :map, :select, :reject, :zip, :include?, :count, :cycle, :take, :take_while, :drop, :drop_while, :bsearch, :entries, :sort_by, :grep, :find, :detect, :find_all, :flat_map, :collect_concat, :inject, :reduce, :partition, :group_by, :all?, :any?, :one?, :none?, :min, :max, :minmax, :min_by, :max_by, :minmax_by, :member?, :each_with_index, :each_entry, :each_slice, :each_cons, :each_with_object, :chunk, :slice_before, :lazy]
```

逆に、`Range`のままでは不都合で、一度`Array`にしなければならないメソッドを調べるには、以下のようにする。

```ruby
p (1..10).to_a.methods - (1..10).methods
#=> [:to_ary, :[], :[]=, :at, :fetch, :concat, :<<, :push, :pop, :shift, :unshift, :insert, :each_index, :length, :empty?, :index, :rindex, :join, :reverse, :reverse!, :rotate, :rotate!, :sort!, :sort_by!, :collect!, :map!, :select!, :keep_if, :values_at, :delete, :delete_at, :delete_if, :reject!, :transpose, :replace, :clear, :fill, :slice, :slice!, :assoc, :rassoc, :+, :*, :-, :&, :|, :uniq, :uniq!, :compact, :compact!, :flatten, :flatten!, :shuffle!, :shuffle, :sample, :permutation, :combination, :repeated_permutation, :repeated_combination, :product, :pack]
```

「`Array`にあって`Range`にない」メソッドは配列を結合するメソッドとか破壊的な変更するメソッドが多いので、比較的どうでもいい。

最初の例はここまで縮められる。

```ruby
p (1..10).map(&:to_s)
#=> ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]
```

こんなこともできる。

```ruby
p (1..10).select(&:odd?)
#=> [1, 3, 5, 7, 9]

require 'prime'
p (2..100).select(&:prime?)
#=> [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
```

どの例でも返り値は`Array`である。

もちろん`inject`もある。

```ruby
p (1..10).inject{|acc, n| acc * n }
#=> 3628800
```

## あとがき

一文につきたかだか5Byteとメソッドコールを一回減らせてもたいしてうれしくないひとが多いらしいので、書くひとがめんどくさくないのならば、結構どうでもいい。僕は1Byteでも減るとうれしい。

## 追伸

コスト? もちろん余計な変換はしない方が早いし、メモリの使用も少く済むに決まってるじゃないですか。ただし、そこまでけちるようならばそもそもRubyを選択する意義に乏しいので、ユーザーは表面的に見えるコードの簡潔さと、小手先の倹約ではないアルゴリズムそのものに集中するべきである、といふのが私の認識です。といふわけで、(要素数にもよるけど)私は`to_a`するな！ なんて主張をする気は一切ないのです。読みやすいコードが正義。

## 追伸 2

忘れてたけど`[*1..10]`みたいに配列リテラルのオペランドにリテラルで作った範囲オブジェクトを展開するのってあまり欲しい機会なくね? ってことを書きたかったんだった。
Compass 1.0リリースノート 和訳



※こちらの記事は、[Compass 1.0リリースノート](http://compass-style.org/blog/2014/08/15/omg-compass-1-0/)の意訳です。詳しくは原文を参照してください。
※また、「日本語おかしいよ」「訳へんじゃない？」の場合、ヘコまない程度にやさしくコメントいただけるととても嬉しいです。

# Compass 1.0 is now available!

まずは前置きから：このリリースはとても長い道のりだった。その理由と言い訳をリストにしてみんなに渡すこともできるのだが、それっていうのは本当の問題じゃない。もしあなたがcompassのように１年以上メンテナンスされていないオープンソースに再度関わることになるオーナーだったとしたら、最も慎重な判断をする場合、その結果としての行動はそれを打ち切ることだったと思う。だが、私はそれを打ち切ることができないほどには頑固だったのだ。

## 今後の課題・・・どうやって発展させていくかということ。

- 定期的なのバグフィックスのリリース。Compass 1.0は完璧ではない。今となってはリリースされたが、私たちはこれから定期的なバグフィックスと、使用されるプリフィックスのためにブラウザの統計をアップデートしていく。最低でも１ヶ月に２〜3回のリリースは求められる。
- 新機能について。0.12以降、1.0では多大な書き換えとリファクタリングを行っているが、私が考えていた多くの機能をいまだ備えてはいない。1.0がメジャーバージョンとしてリリースされたので、これからは新しい機能をセマンティックバージョニングに基づいて自由にリリースしていくことになるだろう。

## Compass 1.0には何が含まれる？

- ベンダープリフィクスに関しては新たに[caniuse.com](http://compass-style.org/help/documentation/tuning-vendor-prefixes/)のデータに基づいて運用していく。どのくらいの割合のユーザーをサポートしたいかをcompassに指定し、compassは[caniuse.com](http://compass-style.org/help/documentation/tuning-vendor-prefixes/)から使用するベンダープリフィクスを呼び出すことになる。
- Compass coreライブラリはcompassコマンドラインツールなしで使用が可能になっている。
- Compassは`import-once`を使用したインポートを可能にしたことで、あなたのプロジェクトのコンパイル時間をスピードアップできる。既存のプロジェクトには`require "compass/import-once/activate"`を設定に足すことでそれが可能になる。[こちらのドキュメンテーションを参照](https://github.com/Compass/compass/blob/master/import-once/README.md)
- Sassのsoucemapをサポート。`sourcemap = true`を設定ファイルに追記すると有効になる。
- watcher/compilerを書き直した。これで、compassはSassのビルトインコンパイラを使用することになった。これによりプロジェクト間でより密接な統合と一貫性を保証するようになった。
- blueprintの対応を削除した。たとえそれを使っていたとしても、[分離したプラグイン](http://compass-blueprint.org/)を使用することでそれを補うことができる。
- CSS3Pieの統合を削除した。
- 最新のCSS対応、[Animation](http://compass-style.org/reference/compass/css3/animation/)、[Flexbox](http://compass-style.org/reference/compass/css3/flexbox/)、公式のグラデーションシンタックス、[InputのPlaceholder属性](http://compass-blueprint.org/)といったものをサポートした。
- partialではないsass拡張子ファイルがある場合、cssの出力フォルダのサブディレクトリにコンパイル済みのcssファイルを配置するようになった。
- その他、[たくさんの反映](http://compass-style.org/CHANGELOG/)。

compassの更新内容は数週間の間リリース候補の状態だった。私たちは多くのバグをフィックスしているが、しかし本当に多大な変更をここで行っているため、もっとバグが残っているだろうと思っている。もしなにかおかしいことをみつけたら、[bug報告してください](https://github.com/Compass/compass/issues)！それよりは可能なら、パッチを送ってください :)
UITextViewでURLや電話番号をリンク化しつつ編集可能にする方法

UITextViewにはURL、日付、電話番号、住所を自動的に検出してリンクにする機能がありますが、これを有効にするにはeditableプロパティをNOにして編集不可にしなければなりません。編集が不可だと文字通り編集できず、画面をタップしてもキーボードが出てきません。しかし、アップル製メモアプリでは閲覧時にはリンクを有効にしつつも、画面をタップすると編集できます。これと同じことを実現する方法を開示します。

```objc:Objective-C

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.textView.delegate = self;
    self.textView.dataDetectorTypes = UIDataDetectorTypeAll;
    self.textView.editable = NO;
    [self.textView addGestureRecognizer:[[UITapGestureRecognizer alloc]
                                         initWithTarget:self
                                                 action:@selector(handleGesture:)]];
}

- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer
{
    self.textView.editable = YES;
    CGPoint touchPoint = [gestureRecognizer locationInView:self.textView];
    UITextPosition *position = [self.textView closestPositionToPoint:touchPoint];
    self.textView.selectedTextRange = [self.textView textRangeFromPosition:position
                                                                toPosition:position];
    [self.textView becomeFirstResponder];
}

- (void)textViewDidEndEditing:(UITextView *)textView
{
    self.textView.editable = NO;
}

```
humanjavascript読書中。

まだ読みはじめたところだけど、面白そうなので、共有。

## なにそれ？おいしいの？

いろんな意味で人に優しいjavascriptってどういうことだろうっていう思想本。

ざっくりとまとめると

- jsはコンピュータ上で動くものだけど、作るのは人間だし、フロントエンド動くからユーザ(つまり人間ですが)が実際に目にするところだからわかりやすくしたほうがいいよね。じゃあ、どうしたらいいか？っていう話をまとめてる
- Ampersand.jsっていうhumanjavascriptの思想を基にしたフレームワークを作ったよっていう宣伝

## どうしたら手に入るの？

**ここから読めます。英語です。**
http://read.humanjavascript.com/


**ここから買えます。英語です。**
http://humanjavascript.com/

## 備考：Ampersand.jsって？

backbone.jsをベースにしていて、実際使ってこれないわぁってところをどんどんリファクタリングしたりして作ったやつっぽい。
(説明みただけでまだソースもドキュメントも読み込んでないけど)
installしたはずなのにコマンドが見つからない時の対処法φ(・・*)


chefとknifeをつかえるようにしようとしたらつまづいたのでメモ。
先輩に教えて頂きました。

まずは、chefをgemでinstall

```
% gem i chef --no-ri --no-rdoc
```

よしこれで、と思いきや、、

```
% knife configure
zsh: command not found: knife
% gem list | grep chef
chef (11.14.6)
chef-zero (2.2)
```

あれれ、、
先輩がおっしゃるには、Rubyのバージョンとかによって、インストールされる場所が異なることが原因とのこと。その場合は、下記で探して環境変数に入れて、そのコマンドを登録しておくと良いとのこと。

```
% locate knife

WARNING: The locate database (/var/db/locate.database) does not exist.
To create the database, run the following command:

  sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist

Please be aware that the database can take some time to generate; once
the database has been created, this message will no longer appear.
```

教えてくれたコマンドをそのまま打つ

```
% sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist
```


```
% locate knife

WARNING: The locate database (/var/db/locate.database) does not exist.
To create the database, run the following command:

  sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist

Please be aware that the database can take some time to generate; once
the database has been created, this message will no longer appear.
```
また怒られたので、

```
% sudo /usr/libexec/locate.updatedb
```

これで、`locate`が使えるようになる。


```
% locate knife | grep bin
/Users/username/.rbenv/versions/2.1.2/bin/knife
```
でパスを探して、binまでを下記のようにセット

```
% setenv PATH /Users/username/.rbenv/versions/2.1.2/bin:$PATH
```

これをコピって、zshやbashのprofileに登録する

```
% vi .zsh_profile
```

これで、無事、`knife`コマンドがつかえるようにヾ(´∀`o)+。

## 追記
rbenvで管理してる場合、`rbenv rehash`を忘れていることが原因だったり、、、orz

rbenv rehashは何をやっているのか？ - DQNEO起業日記 
 http://dqn.sakusakutto.jp/2014/02/rbenv_rehash_what_it_does.html

（環境構築ってやる回数少ないから、忘れる。。。）

そして、↓これ便利そう
Ruby - rbenv を使っているなら rbenv-gem-rehash を使おう - Qiita 
 http://qiita.com/riocampos/items/f0fe7217972b312c4f3a
AngularJSのng-repeatでプリミティブ値（文字列、数値）を扱う

fng-repeatはデフォルトでは繰り返すオブジェクトのIDで同一性を判定しているので、同じプリミティブ値が繰り返し出現するとエラーになります。これは、track by $indexをつけることで解決します。

ただ、これだけだと、配列の順番が動的に(ui.sortableなどによって）変更されると、おかしな動作をします。これは、以下のようなパターンを使うと解決します。これなら変数arrayに対して、slice, push等の操作をしても問題なく動作します。自分はこれを基本パターンとして常に使うようにしているのですが、デメリットとかあるなら教えてほしいです。

```html
<div ng-repeat="element in array track by $index">
   <input ng-model="array[$index]">
</div>
```
Rubyで作った俺指向言語Qのv0.0.14142135がリリース

#バグ報告を頂ければ24時間以内に修正致します.

カモン-> [@gogo_tanaka](https://twitter.com/gogo_tanaka)

## 俺指向言語Q
fooo↑↑

詳しくはこの辺り参照

http://q-language.org/ja/

http://qiita.com/gogotanaka/items/ee008480dccd2064a4e6

まだまだ色々至らないですが、コミュニティ作りのためとリーンに（今流行の）フィードバックを頂きながら育てて行きたいと考えていますので

ちょくちょく今回の様に露出していきます.

コミッター絶賛募集中です.

ワイワイ楽しくやりたいです. アメちゃん差し上げるのでお願いします. 

まだまだ生まれたての言語＋仕様の変更にアグレッシブなので思いつきのfeatureなど容易に採択されうります.

## v0.0.14142135

（；゜０゜）「バージョン長くね！？」

こんな感じで（rubygems.orgより）Versioning は無理数に漸近させるようにしてます.

![Screenshot 2014-08-17 22.44.31.png](https://qiita-image-store.s3.amazonaws.com/0/30440/61e08b44-3b71-319d-df56-1987986ee332.png)


√2系の次はe系(0.0.2718..）を考えています.


## Features

`v0.0.14142135` に加わったFeaturesです.

（多くの修正はバクfixのためfeatureは３つほどです.）

### 冪法の演算子に`^`を可能に
地味に嬉しい.

```
2^3
=> 8
```

### 文字式の乗法演算子（*）の省略
これは嬉しい.

```
f(x, y) = xy
f(3, 9)
=> 27.0

d/dx(xy)
=> y
```

### 微分演算の`(...)`をスペースで代用可能に

うんうん.

```
d/dx xy
=> y

d/dx e^x
=> e^x
```


## 使い方
ドキュメントの整理が至ってないので

（やらないといけない...）

対話モードでサクっと試す方法を紹介します.

`qlang` gemを入れます. 

`gem install qlang`

gem の管理は各自の環境に合わせてよしなにやって下さいませ.

既にインストール済みの場合は

`gem update qlang`


オプションに`-i`を与えると対話モードに入ります.

`qlang -i`

`bundler` で入れた場合は

`bundle exec qlang -i`

ふぅ

お後がよろしいようで.
文字列をタブ区切りで分割するけど、スペース分割はしたくないとき

シェルでファイルから読み込んだ文字列をタブ区切りのみで分割したいときに、IFSの指定でハマったのでメモ。



```sh:tabSample.sh
#!/bin/sh

#お試し文字列
tData="tab1	tab2	tab3 space1
return"
echo $tData

#IFSのデフォルトは、スペース、タブ、改行。

#IFSへタブのみ設定する。
#タブを打ち込めばOK。
#スペース、改行でも区切られないようになる。
IFS='	'
#\t指定だとNGだった。
#IFS=$'\t'

#IFS確認用
echo -n "$IFS" | od -b

set -- $tData
echo $1
echo $2
echo $3

#処理が終わったらIFS設定をデフォルトへ戻しておく。
IFS=$' \t\n'
#IFS確認用
echo -n "$IFS" | od -b





```



```sh:result.txt

tab1 tab2 tab3 space1
0000000 011
0000001
tab1
tab2
tab3 space1
return
0000000 044 040 011 012
0000004

```
centos6.5のgitを2.0にmake installしたんだけど

インストールされたけどパスが通らない。
意味不明

/etc/bashrcに

/usr/local/git/binと設定して
source /etc/bashrcしてるのに

git --versionしても
1.8のまま。っていうかyum remove gitできえたはずなのにな。

しょうがないから

ln -s /usr/local/git/bin/git /usr/local/bin/git

して

git --version したら
2.00になった。

意味不明
[AWS 1]AWSアカウント取得後にする大切なこと！先ずIAMへ行け！

とにかく先ずIAMへ行け！

#IAM設定
##AWSマネージメントコンソールに入りIAMを選択する
マネージメントコンソールからIAMを選択する

![IAM.PNG](https://qiita-image-store.s3.amazonaws.com/0/26668/22a00bf2-cfa4-25fc-fc04-c064da88edaf.png)

##Security Statusをクリアする
順番は気にせずSecurity Statusの項目をクリアしていく

![SecurityStatus.PNG](https://qiita-image-store.s3.amazonaws.com/0/26668/f1fcfdec-489e-8d1d-e2d8-ea89e47e13a6.png)


###MFAの設定方法に関する記事
MFA設定については、[clouldpackエバンジェリスト 吉田さん](http://qiita.com/yoshidashingo)の[記事](http://bit.ly/1tmSgoX)に良く書かれています。

###多要素認証用アプリAuthy
Authy は、前述のMFA設定に出てくるアプリで、2段階認証のコードを確認できます。
また、アプリ情報は暗号化した上でサーバに保存されますので、万が一の時にも対応できます。
Chrome用にExtensionがあったり、クライアント側のコードが提供されていたりとマルチデバイス対応なので嬉しい限りです。

https://www.authy.com/

###Admin権限のユーザー、グループを作成
AWSアカウントではないIAMユーザーを作成する必要があります。
先ずAdmin権限を持つユーザーを作成します。
Admin権限のフループを作成する際に、Administorator Accessのテンプレートを適用したグループを作成します。
適用するテンプレートは↓↓↓↓↓↓
![grouptemplate.PNG](https://qiita-image-store.s3.amazonaws.com/0/26668/688e9fb5-4dc3-c446-c754-3ac240dc8d91.png)
Admin権限用ユーザーを作成し、グループに所属させます。

これ以降の作業は、ここで作成したユーザーにて作業します。

以上で、AWSアカウント取得後、すぐ行う作業は終了です。

ーー
20140822 IAMユーザ作成追加
20140820 initial