OmniAICreator/Qiita-1.07M huggingface dataset:
[Semantic File System]ファイルをタグで管理

# やりたいこと
1. ファイルをタグで管理

2. ファイルシステムとしてマウント可能
→タグ名によって階層付けられたディレクトリ構成の自動構築、タグ名によるファイルの検索を行った場合、結果ファイルリストが1つのディレクトリに配置されるようにディレクトリ構成を再構築する。
![TagBasedhierarchicalDirectory](https://qiita-image-store.s3.amazonaws.com/0/64292/46cf7c82-8dd7-0523-6a27-bbd23b3be1bc.png)

# 想定している利用例
音楽or動画ファイルを保存しているメディアサーバに、外部再生機器（PS4等）がアクセスしファイルを探す際にタグベースのファイルシステムを参照したい。

タグで整理されたディレクトリを作成
↓
タグによる検索結果集合のディレクトリ作成
↓
再生機器から、少ないディレクトリ移動でファイルにアクセス可能

# 補足：ファイルシステムが嬉しい理由
タグ情報があっても、タグによる検索を行う機能がなければ意味が無い。
ディレクトリ構成としてタグ検索結果を受け取れるなら、（手間は増えるが）外部機器に追加機能が不要となる。
![TBFSUsecase](https://qiita-image-store.s3.amazonaws.com/0/64292/68d01ae4-d25d-c977-6aa7-d888e17650fb.png)
# Semantic File Systemの実装例
タグベースのファイルシステムはSemantic File Systemと呼ぶようだ。
Tagsistant、dantalianが実装例として有名？

実装例一覧はこの辺りを参照のこと。
http://en.wikipedia.org/wiki/Semantic_file_system
https://inconsolation.wordpress.com/2014/12/10/tagfs-xtagfs-dhtfs-and-more-tag-youre-it/

# TMSU
ドキュメントがわりかし分かりやすかったので、実装例の中からTMSUを選んだ。
http://tmsu.org/
https://github.com/oniony/TMSU

以下に導入、使用方法をまとめる(2015/01/03)。

## 導入
配布されているバイナリファイルだとglibc2.14を要求されるため、手動でコンパイル(CentOS6)。
導入手順は以下の流れ。

<strong>1. fuse, sqlite3のインストール
2. golangのインストール
3. GOPATHの設定
4. go-sqlite3とgo-fuseのインストール
5. TMSUのgit repositoryをクローン
6. TMSUのMake</strong>

詳細はREADME.mdとCOMPILING.mdに記載の通りだが、fuse利用の際、パーミッションの設定が必要。
http://l-w-i.net/t/fedora/sshfs_001.txt
> \# chmod o+rw /dev/fuse
> これを実行しないとsshfs実行時に「fuse: failed to open /dev/fuse: Permission denied」というエラーになる。

> \# chmod 4755 /bin/fusermount
> これを実行しないとsshfs実行時に「fuse: failed to exec fusermount: Permission denied」というエラーになる。

## 使用法
http://tmsu.org/
Quick tourより必要最低限の使用法のみ挙げる。
その他タグ一覧の出力や、タグの一括リネーム、複数ファイルに一括タグ追加等の機能もある。
<dl>
  <dt>タグ追加</dt>
  <dd>

``` 
$ tmsu tag summer.mp3 music big-jazz mp3
tmsu: New tag 'music'
tmsu: New tag 'big-jazz'
tmsu: New tag 'mp3'
$ tmsu tag spring.mp3 music mp3 folk
tmsu: New tag 'folk'
```

　</dd>
  <dt>ディレクトリのマウント</dt>
  <dd>

```
$ mkdir mp
$ tmsu mount mp
```

　</dd>
  <dt>タグ検索</dt>
  <dd>
mkdirでタグ検索と検索結果ディレクトリの作成を行う。
summer.1.mp3のように、ファイル名が変わっているが気にしない（TMSUで管理しているファイルID情報が付記されている）。

```
$ ls mp/queries
README.md
$ mkdir "mp/queries/mp3 and not folk"
$ ls "mp/queries/mp3 and not folk"
summer.1.mp3
```

　</dd>
</dl>
## 問題点
タグ付きのファイルが移動しても、TMSUは自動で追わない。
https://github.com/oniony/TMSU/issues/11

>```
>mv $1 $2 && tmsu repair --manual $1 $2
>```

>Since tmsu doesn't explicitly monitor filesystem changes, it'd be nice if
there were an analogue of git mv - a move command that also adds the move
to the staging area - for tmsu, that would move the file while updating the
database so that no tag info is lost.


# つぶやき
## タグベースのファイル管理が流行するには
タグ情報は構造化しない方がスマートな気がする。

## ファイルシステムを自作するなら
DBに直接バイナリデータとタグ情報を保存したい。
Fess ファイルサーバ全文検索機能を利用する必要最低限の手順

Apache SolrをベースとしたOSS検索システムFessで、ファイルをクローリングし全文検索を行えるまでの必要最低限の手順を以下に記述します
「ファイルサーバがゴミゴミして何がどこにあるかわからない・・・」なんて時に参考にして、この手軽さを体感してみてください

# ダウンロード

以下のURLにアクセスしてfess-serverの最新版(現時点ではfess-server-9.3.1.zip)をダウンロードしてください

http://sourceforge.jp/projects/fess/releases/

# 起動

ダウンロード、解凍したフォルダの配下の./bin/startup.sh(Windowsの場合はstartup.bat)を実行してください
これでWebサーバが立ち上がりFessの操作ができるようになります

なお停止したい場合はshutdown.shを実行すれば停止します

# クローラ設定

まず http://localhost:8080/fess/admin にアクセスして管理画面にログインしてください
User/Passはadmin/adminです

![スクリーンショット 2015-01-04 3.15.02.png](https://qiita-image-store.s3.amazonaws.com/0/62468/ed200358-402c-9282-7455-bf22117c0312.png)

ログイン後はクロール対象のファイルサーバを指定します
左メニューの「ファイルシステム」→「新規作成」を選択すると入力画面が出るので以下の通り入力し、画面下部の「作成」ボタンを押下してください

設定名: (任意)
パス: file:(フルパス)
※Windowsの場合、ディレクトリのデリミタを「¥」から「/」に置換してください

![スクリーンショット 2015-01-04 3.26.33.png](https://qiita-image-store.s3.amazonaws.com/0/62468/59c48a69-aadb-a31e-19c0-e239e080a9db.png)

設定自体は以上で終了ですが、設定後はすぐにクローラを動かしたいかと思います

その場合は左メニューの「クロール全般」を選択、一覧内の「Crawler」の詳細ボタンを押下すると下記画面が表示されるので、ここの「開始」ボタンを押下してください

![スクリーンショット 2015-01-04 3.42.31.png](https://qiita-image-store.s3.amazonaws.com/0/62468/840da47c-aaa9-112c-20b7-0ac1f7c22035.png)

クローラが完了するまでの時間はファイルサーバや通信状態にもよります
大きなファイルサーバだと1日掛かりなんてこともあるので気長に待ってください

なお実行状態は左メニューの「セッション情報」から確認できます
もし2,3日経っても終わらない場合はクローラがスタックしている可能性もあるので再実行や原因追求することをおすすめします（意外と再実行するだけで動くこともありますので・・・）

# 検索

クローラが完了すると全文検索が利用可能になっています
ここではSparkの論文（PDF）を検索し、それがHITすることが確認できています

![スクリーンショット 2015-01-04 3.27.51.png](https://qiita-image-store.s3.amazonaws.com/0/62468/ec07a3d8-2cf1-6ccd-3b09-96bcce9f038f.png)

たった以上の手順で全文検索が簡単に導入できます
もちろんエンタープライズで運用するにはもっと詳細な設定や運用が必要です

しかしこれだけ簡単な手順で導入できるので「全文検索エンジンって使えるのかな？」「とりあえず簡易ツールとして入れてみたい」なんて思ってみたらまずは入れてみることをお勧めします
セキュリティ技術についてまとめ


単に私による私のための私のまとめである。脳に入らなくてピンとこないので、自分で書いて覚えようとしてみただけである。気まぐれで更新する。

## 改訂履歴

2015/01/04 - sharowさんのツッコミに対応して「公開鍵暗号方式」を修正。「公開鍵暗号とデジタル署名の違い」を追加。

## 公開鍵暗号方式

1. 受信者は、秘密鍵SKと公開鍵PKのペアを作成する。
  1. SKは誰にも送信しない
  1. PKは公開し、みんなに持ってもらう
1. 送信者はデータを、PKで暗号化する。
1. 受信者は受け取ったデータをSKで複合する。
  1. ここで鍵があわなければ複合できないので安全

### メリット

- PKがバレてもSKがバレなければよいので、安全に暗号できる

## デジタル署名

1. 署名する人は、秘密鍵SKと検証鍵PKのペアを作成する。
  1. SKは誰にも送信しない
  1. PKは公開し、みんなに持ってもらう
1. メッセージをSKにかけると、署名ができる。
  1. (ここでメッセージとは本文ではなくハッシュを使う？)
1. メッセージと署名とPKを送る。
1. 受信者は、メッセージ・署名をPKで確認する。
  1. メッセージが違っていた場合、署名確認がエラーになるので改ざんを防げる

## 公開鍵暗号とデジタル署名の違い

PKとSKの向きが違うだけで違う用途に使えるのが公開鍵方式。

### 暗号化用途
送信者が文章を公開鍵PKで暗号化し、受信者が秘密鍵SKで復号

### 署名用途
送信者がハッシュを秘密鍵SKで署名し、受信者が公開鍵PKで検証


## 公開鍵証明書

例えば、「ふぁらおの公開鍵→PK」として公開しているが、誰かが乗っ取りを行い偽ふぁらおが「ふぁらおの公開鍵→PK偽」を提示した
場合、お客さんは、PKが本物のふぁらおものかわからないと実質、乗っ取られてしまう。

なので、この公開鍵は確実にふぁらおのものである、と第三者（認証局:CA)が証明書を作成し、 
**「その公開鍵の正当な持ち主はふぁらおである。」**
と確認できるようにすること。

1. ふぁらお、は、公開鍵ふぁらお:PKをCAに提出
2. CAはその秘密鍵CA:SK と ふぁらお:PK を署名し、 ふぁらお証明書を作成
3. ふぁらお証明をを受け取った人は、CA検証鍵CA:PKで、ふぁらおのものか確認できる。
4. このCA検証鍵CA:PKも果たして本物のCAかどうか検証するために、さらに確認される。

### オレオレ証明書

1. 最終的に信頼されるCAかどうかは、ブラウザにプレインストールされている。
1. が、プレインストールされていない証明書の場合、検証できないためブラウザから問い合わせがでる。
2. 第三者のCAが作った証明書ではなく、CAも証明書も自前で用意してしまうのが俗にいうオレオレ証明書である。
	2. つまり、ふぁらおサーバのサーバ証明書を提示してくるが、その証明書が正しいかどうかのCAが、ふぁらお、なためである。
Perlの関数名をPowerLine上に表示する

# VimScript本を買っていた

[これ](http://www.amazon.co.jp/dp/4774166340/)
買って詰んでいたので、正月休みがてら(といっても2時間程度)で読んでいました。

せっかくなので習作がてら、Perlで今いる場所の関数名とパッケージ名を表示するコードを書こうかと思い立ち書いてみた。

```
let g:getFunctionName = {}

function! g:getFunctionName.getFileFunctionRows() dict
    let filename = expand("%")
    let self[filename] = []
    let lines = readfile(filename)
    let maxline = len(lines)

    let status = ''
    let statusStack = []
    for rowcount in range(1 , maxline)
        let line = getline(rowcount)
        if line =~ '\vpackage\s*(.*);'
            let matchlist = matchlist(line , '\vpackage\s*(.*);')
            let packageName = matchlist[1]
            let status = packageName

            " package ~~;の記法は上書きなので
            if len(statusStack) && statusStack[-1] != "package"
                call add(statusStack , "package")
            end
        elseif line =~ '\vpackage\s*(.*)\{'
            let matchlist = matchlist(line , '\vpackage\s*(.*)\{')
            let packageName = matchlist[1]
            let status = packageName
            call add(statusStack , 'package')
        elseif line =~ '\vsub \s*(.*)\{'
            let matchlist = matchlist(line , '\vsub \s*(.*)\{')
            let subName = matchlist[1]
            if status == '' 
                let status = subName
            else
                let status = status . '->' . subName
            endif
            call add(statusStack , 'sub')
        elseif line =~ '\v\{.*\}'
        elseif line =~ '\v\{'
            call add(statusStack , 'other')
        elseif line =~ '\v\}'
            let removed = remove(statusStack , -1)
            if removed == "sub"
                if status =~ '->' 
                    let status = substitute(status , '->.*$' , '' , '')
                else
                    let status = ''
                endif
            elseif removed == "package" 
                let status = ''
            endif
        endif
        call add(self[filename] , status)
    endfor
endfunction

function! g:getFunctionName.getFunctionName() dict 
    let filename = expand("%")
    let linenumber = line('.')
    return self[filename][linenumber - 1]
endfunction

function! s:newGetFunctionName()
    return copy(g:getFunctionName)
endfunction

let obj = s:newGetFunctionName()

autocmd CursorMoved *.pl,*.pm set statusline=%{obj.getFunctionName()}
autocmd BufRead     *.pl,*.pm call obj.getFileFunctionRows()
```

# 要件
* 現在の行がパッケージの中の場合にはパッケージ名を表示
* Perlのpackage宣言、package Hoge;とpackage Hoge{}の両方の記法に対応する
* 関数内の場合には関数名を表示
* PowerLine上に表示

# 作ってみて問題があって解決された点
* スコープとか詳細に書いてあってよかった
* autocmdとかなんとなく使ってたものが詳しくわかった
```
autocmd {event} {pattern} {command}
```
* OOPな書き方、dictの使い方等は本を読まないと投げていたかなと思う

# まだ問題がある点
* PowerLineの他の全ての項目を削除して関数名だけ出しているので使い物にならない
* 57行目の全行数取得、他にコストの安い方法がありそう
    * 正規表現周りが微妙。.*?に相当するらしい.{-}が動かなかったりで多分関数が入れ子になっているとうまく機能しない
* プラグイン形式になっていない  

まあぼちぼち使いつつ直して行こうかな
NginxでサブディレクトリのPhalconを動かす


`http://localhost/webapp1`と`http://localhost/webapp2`などのアクセスで、サブディレクトリのPhalconを動かす設定例です。

/vagrant/webapp1と/vagrant/webapp2_serverにphalconのプロジェクトがあることを前提。

```
/vagrant/webapp1
          ├── app
          └── public
              └── index.php

/vagrant/webapp2_server
          ├── app
          └── public
              └── index.php
```

`http://localhost/webapp1`なら/vagrant/webapp1/public/index.phpを、
`http://localhost/webapp2`なら/vagrant/webapp2_server/public/index.phpを実行させます。


```phalcon_subdirectory.conf
    # URL1つ目のセグメントとディレクトリ名が一致している場合(汎用)
    if ($request_uri ~ /(?<phalcon_subdirectory>\w+)) {
        set $root_path /vagrant/$phalcon_subdirectory/public;
    }
    # URL1つ目のセグメントとディレクトリ名が一致していない場合(/webapp2をwebapp2_serverに対応)
    if ($request_uri ~ /webapp2) {
        set $root_path /vagrant/webapp2_server/public;
    }

    location ~ ^/(?<phalcon_subdirectory>\w+)/(.+\.php)$ {
        include        fastcgi_params;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;

        # http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_split_path_info
        # 1つ目は$fastcgi_script_name、2つ目は$fastcgi_path_infoにセットされる
        fastcgi_split_path_info ^/\w+(/.+\.php)(.*)$;

        fastcgi_param  SCRIPT_FILENAME  $root_path$fastcgi_script_name;

        # アプリ任意のSERVER変数
        fastcgi_param  PHALCON_SUBDIRECTORY $phalcon_subdirectory;
        fastcgi_param  APP_ENV local;
    }


    location ~ ^/\w+(.+)? {

        location ~ ^/\w+/\.ht {
            deny  all;
        }

        alias $root_path$1;

        if (!-f $request_filename) {
            rewrite ^/(\w+)/?(.+)?$ /$1/index.php?_url=/$2 last;
        }
    }
```
【iOS】【swift】SpriteKitにおける横向き対応(landScape)

Xcode5においては、以下のように実現していた横向き対応ですが、

http://blog.oneworld-inc.com/entry/2014/01/03/023701


Xcode6において、SpriteKitで作成したプロジェクトが
Xcode5環境に作成した初期状態が違うため、横向き対応も違うのかなということで、
現在は以下のような方法で横対応をしております。


##Xcode設定において、縦を無効にする。

これは前回と同様です。
![スクリーンショット_2015-01-04_2_33_31.jpg](https://qiita-image-store.s3.amazonaws.com/0/35343/5be566b0-e20d-7158-4cc3-938c82d5d9ec.jpeg)


##GameViewControllerの編集


```swift

class GameViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene {
            // Configure the view.
            let skView = self.view as SKView
            skView.showsFPS = true
            skView.showsNodeCount = true
            
            /* Sprite Kit applies additional optimizations to improve rendering performance */
            skView.ignoresSiblingOrder = true
            
            /* Set the scale mode to scale to fit the window */
            //scene.scaleMode = .AspectFill
            scene.scaleMode = .ResizeFill
            
            skView.presentScene(scene)
        }
    }

```

scene.scaleModeを、ResizeFillに変更。


以上です。

ひとまずこちらの調整を行うことで、横対応はできているのではないかと考えております。
(前回と同様の動きが実現できている)


参考URL:
http://www.raywenderlich.com/84434/sprite-kit-swift-tutorial-beginners
dockerコンテナでcronを動かす


## 1. dockerコンテナを起動
```
$ sudo docker -it centos:centos6 bash
```

## 2. cronをインストール
```
# yum update -y
# yum install -y cronie
```

## 3. cronを起動
```
# /etc/init.d/crond start
# /etc/init.d/crond status
crond (pid  160) is running...
```
ちゃんと起動できている

## 4. cronの設定
```
# crontab -e
* * * * * date >> /cron-test
```

正常に起動できていれば、/cron-testに
時刻が書き込まれるはずだが、いっこうにファイルができない・・

## 現在調査中・・
まだdockerについてよくわかってないが、
なにか特殊な設定が必要なのだろうか・・。

解決法をご存じの方がいらっしゃれば、
コメントください。お願いします。


### 以下、2015.1.4追記
別の環境（ホストOS）で試したら、できました。

#### 成功した環境
ホストOS：Mac OS 10.10.1
Docker version 1.4.1, build 5bc2ff8

#### はじめにできなった環境（今もできない）
ホストOS：CentOS release 6.6
Docker version 1.3.2, build 39fa2fa/1.3.2

コンテナはともにcentos6（image idもともに7bba7709bd7e）を
使用しているから、ホストOS側の問題だろうか。

[CentOSのDocker Hub](https://registry.hub.docker.com/_/centos/)には、Docker version 1.4.1しかサポートしないと書かれているから、これが原因かもしれない。

`yum upgrade docker`だと今、最新の入ってるよって言われるので、他の方法でversion upできるか調べてみます・・。
poltergeistを使ったログインのテストが失敗するとき



### 注意
- 別にpoltergeistを使った場合に限った話ではない
- 別にログインのテストに限った話ではない

### 概要
- Capybara、turnipを使ってdeviseのログインテストを書いた
- なぜかconfig.default_driverを:poltergeistに変えたら通らなくなった
- テストユーザのデータは、FactoryGirlでテストごとに作成していた

### 原因と解決策
- http://o.inchiki.jp/obbr/253#toc_7
- http://ruby-rails.hatenadiary.com/entry/20150101/1420093487#rspec-prepare-capybara-webkit
- http://stackoverflow.com/questions/22304371/why-do-rspec-feature-specs-using-capybara-poltergeist-and-javascript-fail-incon
- http://devblog.avdi.org/2012/08/31/configuring-database_cleaner-with-rails-rspec-capybara-and-selenium/

以下のような理解

- rspecのプロセスとテスト用ブラウザプロセスは別
- poltergeistを使わずcapybaraでテストしていたときは、実際のブラウザプロセスが動いていなかった（たぶん）からテストが通っていた
- rspecプロセス側のトランザクション内で作成したテストデータが、ブラウザプロセス側には反映されていなかった（トランザクションなので）
- rspecが管理するトランザクションをやめて、テストごとにテストデータ作成＋削除をする必要がある



以下、実際の解決方法

- database_cleanerというgemを導入

- rspec側のfixturesのトランザクションを無効化

```ruby
RSpec.configure do |config|
  ...
  config.use_transactional_fixtures = false
end
```

- テストデータの削除タイミングを設定（jsを使う場合のみtruncationにするなど、この通りでなくてもいい）

```ruby
RSpec.configure do |config|

  config.before(:suite) do
    DatabaseCleaner.strategy = :truncation
  end

  config.before(:each) do
    DatabaseCleaner.start
  end

  config.after(:each) do
    DatabaseCleaner.clean
  end

end
```

### まとめ
- いまさら感あるっぽいけど、rails初心者は確実にハマる
    - そもそも、テストデータが毎回勝手に消えてるな−、程度にしか考えてなかった
        - よく思い返せば、ログには「ROLLBACK」とかいう文字が出てました
- rails奥が深い
docker remote APIの有効化

色んな所で色んな方法が書かれていたが以下の方法で成功した。

<環境>
Ubuntu 14.04
docker
　Server version: 1.2.0
　Server API version: 1.14

以下を追記

```bash
vi /etc/default/docker
+ DOCKER_OPTS='-H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock -d'
```

docker再起動

```bash
/etc/init.d/docker restart
```

API確認(image一覧取得)

```bash
curl -X GET http://127.0.0.1:4243/v1.14/images/json
```


ホストがCentOS7の場合は
[ココ](http://knowledge.sakura.ad.jp/tech/2401/)の言うことをちゃんと聞けばうまくいきました。
Rubyのsub,gsubでマッチした部分を取り出す


今更ながら地味にはまってしまったのでメモ
ちなみに`$1,$2...`って組み込み変数って言うんですね

##間違った方法

```ruby
p 'aiueo'.gsub(/(e)/, "#{$1}")
```
とした時に`$1`に`e`が入ってると思ったら間違いで

>この文字列が評価される時点ではまだ正規表現マッチが行われておらず、 $1 がセットされていない

だそうです

##正しい方法
**その1**
文字列で処理する方法

```ruby
p 'aiueo'.gsub(/(e)/, "\\1")
p 'aiueo'.gsub(/(e)/, '\1')
p 'aiueo'.gsub(/(e)/, '\\1')
```

**その2**
ブロックを渡す方法

```ruby
p 'aiueo'.gsub(/(e)/) { $1 }
```
こちらの場合は`$1,$2...`が使えるみたいです

##参考
リファレンスにも書いてあることだったので、詳しくは以下　
[instance method String#gsub](http://docs.ruby-lang.org/ja/2.0.0/method/String/i/gsub.html)
負数の剰余の対策をより短く書いてみる

[こちらのサイト](http://0xcc.net/blog/archives/000083.html)にあるように、剰余演算に負数が入っていたときの結果は言語によって異なるらしいです。
JavaScriptの場合は`-3 % 5 = -3`, `3 % -5 = 3`なので、これを`-3 % 5 = 2`, `3 % -5 = -2`にするための処理をどれだけ短く書けるか考えてみました。引数が整数と決めてやっているので、動作は保証できません。

##第一案（15文字）

```js:
function mod1(a, b) {
  return a * b < 0 ? a % b + b : a % b;
}
```

`a`と`b`が異符号のときは`b`を足せばいいんじゃないかという考えで、このようにしました。縮めると`a*b<0?a%b+b:a%b`なので15文字です。

##第二案（15文字）

```js:
function mod2(a, b) {
  return a % b + ( a * b < 0 ? b : 0 );
}
```

`b`を足すかどうかなのでまとめたら、縮めても`a%b+(a*b<0?b:0)`の15文字で変わりませんでした。

##第三案（14文字）

```js:
function mod3(a, b) {
  return a % b + ( a * b < 0 && b );
}
```

JavaScriptだと`false`は`0`扱いなので、`a`と`b`が同符号だったときにそのまま`0`を返すようにしました。縮めると`a%b+(a*b<0&&b)`で14文字です。

##第四案（13文字）

```js:
function mod4(a, b) {
  return a % b + ( a * b < 0 ) * b;
}
```

`true`も`1`扱いになるので、`b`とそのまま掛けました。縮めると`a%b+(a*b<0)*b`で13文字です。

##最終結果（第四案修正案）

```js:
function mod(a,b){return(a*b<0)*b+a%b}
```

`()`を先に持ってくることで、`return`との間の空白をなくすことができました。
自分だとここまでが限界でした。もっといい方法や、上記の方法の不具合があれば教えていただけると嬉しいです。
AWS Lambdaの開発サイクルを作ろう！

先月末にようやくAWS Lambdaの承認されて遊べるようになりました！

さっそくAWS Lambdaを堪能しているのですが

![AWS_Lambda_and_Kinzal_—_Kinzal_MacBook-Air___Volumes_DISK_Dropbox_Projects_lambda-template_—_zsh_—_95×24_and_README_md_—_lambda-template_and_Main_Window.png](https://qiita-image-store.s3.amazonaws.com/0/5522/dad86d89-5b17-2596-236d-4014ae614946.png)

なんだこのGUIは・・・。
これでコードを書けなくはないのですが、正直言ってこれでコードを管理できる気が全くしません・・・。（Google App Scriptの悪夢の再来
プロジェクトをzipにしてアップロードするにしてもデバッグが死ねるのが目に見えています。

という訳で本気で遊ぶためにGitHub+TravisCI環境に合わせたプロジェクトテンプレートを作りました。

* [k-kinzal/lambda-template](https://github.com/k-kinzal/lambda-template)

## 開発サイクル

開発サイクルは2つのサイクルを回しながら進めていくことを想定しています。
1つ目はローカル単独でユニットテストを実行しながらビジネスロジックを作成していくサイクル。
2つ目はAWS Lambdaで実際に動かしながらAWSに依存した処理を作成していくサイクル。

それぞれについて解説していきます。

### ローカル実行

ローカルでユニットテストを実行するのは他の方も書いている通り、requireをするだけでhandlerを実行することができます。（handlerの名称は変更可能なのでexportsでも良い気はしますが）

* [AWS Lambdaのための関数のローカル開発とテスト](http://qiita.com/imaifactory/items/092e32b4fc0f69a94061)
* [AWS Lambdaの関数をnpmでパッケージ管理](http://qiita.com/imaifactory/items/ac81b4a3ff4a5f5dec85)

lambda-templateでは```npm run test```で同様の処理を実行します。
ソースを変更する度にコマンドを実行するのも面倒臭いので、```npm run debug```でソースの変更を監視しながら実行することができます。

AWS Lambdaに依存する処理には向かない方法ですが、素早く実行を行えるため全体をざっくり組んだり、ビジネスロジックを書くときに重宝します。

### AWS Lambdaの実行

AWS Lambdaでの実行を行う場合は以下の処理をタスク化する必要があります。

1. プロジェクトをzip形式にアーカイブ
2. アーカイブしたファイルをAWS Lambdaにアップロード
3. AWS Lambdaを実行
4. CloudWatchLogsから実行結果のログを取得
5. （アップロードしたAWS Lambdaを削除）

それぞれをどうやっているのかはlambda-templateの```/tasks/plugins/grunt-lambda-runner```のコードでも見てください。（面倒臭くてプラグインをまだ切り出してないです）
この一連の処理を実行するとAWS Lambdaで定期実行を行えるようになります。

![Kinzal_—_Kinzal_MacBook-Air___Volumes_DISK_Dropbox_Projects_lambda-template_—_zsh_—_95×31.png](https://qiita-image-store.s3.amazonaws.com/0/5522/81464598-d43a-3b72-60ec-1389df97cf92.png)

lambda-templateでは```npm run run```で実行できます。
ソースの変更を監視しながら実行は```npm run launch```で実行することができます。

実行速度がかなり遅いのでこれをメインに開発を進めるのはツラいのですが、本番環境と同じ環境でデバッグを行えるので、細かい処理の動作確認をしたり、AWS Lambdaに依存するところを確認するのに良い感じです。

余談ですが、実行後に数秒またないとログをCloudWatchLogsから取得することができないため、どうしてもwaitを挟まないといけないのがツラいです。
AWS Lambdaで実行後に素早くログを取得する手段が欲しいですね。
ついでに```console.error```でも普通のログが出るとか止めて欲しい・・・。

## リリースサイクル

開発サイクルの定義が出来たので、ついでにTravisCIを使ってCI、CDを環境を作ってリリースサイクルを回せるようにします。
とはいえ開発サイクルを作るさいに作った

> 1. プロジェクトをzip形式にアーカイブ
> 2. アーカイブしたファイルをAWS Lambdaにアップロード

上記のタスクでCDを定義すればリリースサイクルに必要なタスクを出来上がります。
lambda-templateでは```npm run publish```で実行できます。

あとは```.travis.yml```にテストタスクを実行し、成功したらデプロイするように記述するだけです。

ちなみに今回はmasternのみのブランチ戦略を取ってます。
Git FlowやGitHub Flowを行うときはbranchesの指定を増やして、デプロイをmasterブランチでのみ行うようにすれば済みます。
TravisCIはAWS CodeDeployにも対応してたりするので、AWS Lambdaにも対応してくれればこのあたりの記述がもっと簡素に出来るんですけどね。

## 課題

* AWS Lambdaの実行が遅い
* 実行時間の長い処理のログを全て取得できない（StartからEndまでを取るようにする？）
* ソース変更の監視をしながらAWS Lambdaの実行を何度もおこなうとエラーが発生する

正直言ってAWS Lambda localが欲しいです。

## おわりに

いかがでしたでしょうか。Google App Scriptのあの地獄を思えばGitHub+TravisCIな構成を作りやすいAWS Lambdaは優秀ですね。
もう少し作り込んだら、gruntプラグインを切り出したり、Yeomanのジェネレーターを作ったり、Scala.jsに対応しようかなと思います。

正直、まだイケてるサイクルに成りきれてないので、もっとこうした方がとかあればぜひご意見ください。
Google カスタム検索API で画像検索するための設定でつまづいた

頭にきたのでメモ

カスタム検索を作成したら**画像検索**項目をオンに
![bl.png](https://qiita-image-store.s3.amazonaws.com/0/40717/cadcd30a-0dbc-c1d0-e1b3-7968d125a715.png)


```php
<?php

require_once("./vendor/autoload.php");

$api_key = '********';
$app_name = '********';
$cx = '********';

$client = new Google_Client();
$client->setApplicationName($app_name);
$client->setDeveloperKey($api_key);

$service = new Google_Service_Customsearch($client);
$query = "歳納京子";
$param = array(
    'searchType' => 'image',
    'cx'         => $cx,
    'num'        => '10',
);

$results = $service->cse->listCse($query, $param);
var_dump($results->getItems());
```

PHPなら
https://github.com/google/google-api-php-client を使えば
こんな感じで書けば結果を取ってこれるはず、「だが」

設定がさっきの画像の状態だと画像検索できない！



![bl2.png](https://qiita-image-store.s3.amazonaws.com/0/40717/ffffc9f9-adbe-1b2c-0e78-0293908fae58.png)

上画像の状態が**ON**だったようだ
ちょっと考えればわかったはずなのに無駄に時間を費やしてしまったので反省
CentOS 6.5 + pyenv + pytest + git + jenkinsでCI環境を作成するまで

# 概要
自宅開発用にCentOS上にCI環境を構築した際のはまりどころを自分メモ．
あくまでもその場対応が多々あるため，最終的にはどこかで修正することになりそう…

# やりたかったこと
今回やりたかったことは以下の通り
1. pyenvで環境構築したい
2. pytestでテストを実行してカバレッジも計測したい

# 最終的な構成
これを実現するために以下のように構築しました．

* CentOS 6.5
* git(ソースからmake install，/usr/binにシンボリックリンク)
* jenkins(公式にあるyumレポジトリからインストール)
    * pyenv plugin
    * GIT plugin
    * Cobertura Plugin

注: git，jenkinsのインストール方法については割愛

# pyenv pluginの設定
1. 各プロジェクトの設定画面 > ビルド環境で「pyenv build wrapper」にチェックを入れる
2. 「The Python version」に利用するpythonのバージョン(ex 2.7.3)を設定
3. 「Preinstall pip list」にはrequirements以外にインストールしたいパッケージ(pytest等)を設定します．但し，ここに登録した項目を1つのテキストと見なしてpip installを実行しているらしく，スペース区切りで複数指定するとエラーになったため，「ビルド > シェルの実行」で別途インストールする方が楽かもしれません．

# カバレッジ，テスト結果関連の設定
### カバレッジ，テスト結果の取得
各プロジェクトの設定画面 > ビルド > シェルの実行でテストを実行する際に，以下のコマンドを実行する．なお，runtest.pyは後述するpy.testのテスト実行用スクリプトです．(ケースによってはpy.testコマンドで十分です)

```shell-session
python runtest.py --junitxml=<テスト結果を出力するファイル名> --cov-report xml --cov <テスト対象>
```

参考までに今回私の設定だと以下のようになります．

```shell-session
python runtest.py --junitxml=pytest.xml --cov-report xml --cov .
```

この場合，テスト結果は「pytest.xml」に，カバレッジは「coverage.xml」に出力され，カバレッジの評価対象はテスト実行したディレクトリに含まれる全ファイルとなります．

### カバレッジレポートの集計
各プロジェクトの設定画面 > ビルド後の処理 > Cobertura カバレッジ・レポートの集計で「Cobertura XMLレポート パターン」に「coverage.xml」と設定する．

### テスト結果の集計
各プロジェクトの設定画面 > ビルド後の処理 > JUnitテスト結果の集計で「テスト結果XML」にテスト実行時のオプション「--junitxml」で指定したファイル名を設定する．

# ハマった箇所
基本的には参考リンクの内容を粛々と進めるだけですが，
数カ所ハマる箇所がありました．
0. (番外)anyenv(pyenv)で入れたpythonが見つからない
    →当初はanyenvで入れたpyenvで環境構築する予定でしたが，PATHの問題等で面倒だったため，これに関してはpyenv pluginで対応することにした
1. yumでインストールできるgitのバージョンが古く，jenkinsで使用するオプションが動かない
2. py.testをローカルの実行時と同じコマンドで実行すると，テスト対象のプログラムのImportErrorとなる．

# 問題の解決方法
##1. yumでインストールできるgitが古い
yumでインストール可能なgitはバージョンが1.7.1と古く，最新版のjenkinsでは「-c」オプションが無いことでエラーになりました．
何らかのオプションや設定によっては「-c」オプションを回避できるかもしれませんが，そもそも古いバージョンを使う理由も無いので，yumでインストールしたgitを削除し，バージョン2.2.1をソースからビルドしました．
詳細は参考リンクを参照してください．
なお，参考リンクの記事では，gitを/usr/local/bin以下に置いていますが，そのままだとpyenv pluginがgitを見つけられずにエラーとなるため，/usr/bin以下にインストールする，もしくはシンボリックリンクを配置しておいてください．(jenkinsの設定でPATHを追加してもpyenv pluginでは参照してくれませんでした…)

##2. py.testをローカルの実行時と同じコマンドで実行すると，テスト対象のプログラムのImportErrorとなる
原因について詳細に調査していませんが，ローカルだと特にPYTHONPATHを弄っていない状態で実行できていた物が，jenkins上だとImport Errorになるケースがありました．
これについては「py.test --genscript=runtests.py」を実行して生成された「runtests.py」を実行するように変更することで回避できました．

# 参考リンク
**jenkinsのインストール**
http://pkg.jenkins-ci.org/redhat/

**gitのインストール**
http://tabunmuri.hatenablog.com/entry/2014/01/06/CentOS%E3%81%AB%E6%A8%99%E6%BA%96%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E5%8F%A4%E3%81%84git%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7

**jenkinsでgitが「Unknown option: -c」と言うメッセージが出る**
https://answers.atlassian.com/questions/11079588/git-status-failed-with-code-129-unknown-option--c-

**pytest + coverage**
http://d.hatena.ne.jp/kuma8/20121124/1353723982

**pytest runscript**
http://pytest.org/latest/goodpractises.html#create-a-pytest-standalone-script
gemのGitHubリポジトリへ簡単にアクセスできるChromeエクステンションを作りました（英語）

I created a chrome extension for easy navigating to gem pages in Github.

Wherever you browse 'Gemfile' or '.gemspec' file on Github, clicking on gem name takes you to it's Github repository page.

![Demo.gif](https://raw.githubusercontent.com/NARKOZ/crank-for-rubygems/gh-pages/demo.gif)

Uses [destino](https://github.com/NARKOZ/destino) (written in Elixir) under-hood.

@ma2ge gets repository name from GitHub url:

```elixir
repo = Regex.scan(~r/\Ahttps?:\/\/github.com\/(.+\/.+)/, url)
       |> List.flatten
       |> List.last
```

Deployed on heroku: http://sla.herokuapp.com

Examples:

```
http://sla.herokuapp.com/rails
http://sla.herokuapp.com/rspec
```

Source code: https://github.com/narkoz/destino
Source code of extension: https://github.com/narkoz/crank-for-rubygems

I hope you find it useful!
Swiftのジェネリクス型を継承したときの挙動


ジェネリクス型を継承ときに、継承したクラスで親のジェネリクス型を記述できないかと思ったのですが、以下のように記述してもコンパイルエラーになってしまいました。

```Swift
class Foo<T> {

}

class Bar : Foo<Int> {

}
```

以下コンパイルエラー文です。

```Swift
Classes derived from generic classes must also be generic
```

継承したクラスでもジェネリクスを定義する必要があります。

```Swift
class Foo<T> {

}

class Bar<T>: Foo<T> {

}
```

毎回ジェネリクス型を明示するのが面倒な場合は`typealias`で定義してエイリアスで記述することもできます。

```Swift
typealias BarClass = Bar<Int>
```
さくらVPSのサイトをローカルgitリポジトリからプッシュして更新。

さくらVPSにローカルからプッシュしてサイト更新するようにしたメモ。

## VPSサーバー

<pre>
home
    ├──abc
        ├── www             ← 公開ディレクトリ
        │   ├── .git        ← 本番用リポジトリ
        │   ├── index.html
        └── site.git        ← 更新用リポジトリ
            ├── hooks
                ├── post-receive ← 自動更新設定
</pre>

###非公開ディレクトリに更新用リポジトリ作成
<pre>
$ cd /home/abc
$ git init --bare site.git
</pre>

### 本番用リポジトリ（公開ディレクトリ）を更新用ジポジトリをクローンして作成
<pre>
$ git clone site.git www
</pre>

### 更新用リポジトリにPushしたら本番用リポジトリに反映する設定
<pre>
$ vi site.git/hooks/post-receive
</pre>

```lang:site.git/hooks/post-receive
#!/bin/sh

cd /home/abc/www
git --git-dir=.git pull origin master
```

## ローカルMac
SourceTreeでローカルリポジトリ作成
リモートリポジトリに更新用リポジトリを設定してプッシュすれば反映できる。
<pre>ssh://tetsuya@aaaaaa.com:55555/home/abc/site.git</pre>

## SSH
公開鍵をVPSサーバーに設置

```lang:/home/abc/.ssh/authorized_keys
ssh-rsa
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXX tetsuya@macbookpro.local
```

秘密鍵をローカルに設置

```lang:/Users/tetsuya/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,XXXXXXXXXXXXXXXXXXXXXXXXXXXXX

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

-----END RSA PRIVATE KEY-----
```
弾幕の初歩（距離系と角度系）

ゲームといえば弾撃ちかな！ってことで、
UnityとかCCActionとかいろんな便利なAPIに頼り切りな昨今、あらためて低レイヤーで汎用的な弾幕の打ち方を学んでいきます。
最後にvxとvyを各々エンジンのupdate関数に組み込めば動きます。

##距離系
2点間の距離の差をもとにした弾撃ちです。
2点間の距離は、平方根を利用して出します。
具体的には「(AX - BX)の2乗  + (AY - BY)の2乗」の平方根が距離

もっと知るなら「2点間の距離の公式」
三平方の定理はどうしても避けられなさそうです
http://www.geisya.or.jp/~mwm48961/math/distance1j.htm


```js:ex1.js

//targetX,Yがターゲットの座標、bulletX,Yが弾の座標
var targetX = 680;
var targetY = 1200;
var bulletX = 10;
var bulletY = 10;

//弾とターゲットの距離（平方根で求める）
var distance = Math.sqrt((targetX-bulletX)*(targetX-bulletX)+(targetY-bulletY)*(targetY-bulletY));

//弾速
var speed = 30;

//加速度(X,Yそれぞれ)
var vx = (targetX-bulletX) / distance * speed;
var vy = (targetY-bulletY) / distance * speed;

//アップデート内で座標を更新すると動く
function update(){
  x += vx;
  y += vy;
}

```


##角度系
角度をもとにした弾撃ち。
三角関数が深くわからなくても使えます。（自分も怪しい・・）
あと角度は大体ラジアンに変換するので慣れましょう。

```js:ex2.js
//初期座標(bulletX,bulletY)からangleの角度へ移動
var bulletX = 0;
var bulletY = 0; 

//弾速
var speed = 30;

//30度の方向に撃つ
var angle = 30;

//加速度(途中で角度→ラジアンに変換)
var vx = Math.cos(Math.PI / 180 * angle) * speed;
var vy = Math.sin(Math.PI / 180 * angle) * speed;

//アップデート内で座標を更新すると動く
function update(){
  x += vx;
  y += vy;
}

```


##もっと深く学べる書籍
今回のコードは下の書籍から着想を得ました。C++系のコードですがおすすめです。
シューティングゲームアルゴリズムマニアックス
http://www.amazon.co.jp/%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%83%9E%E3%83%8B%E3%82%A2%E3%83%83%E3%82%AF%E3%82%B9-C-magazine-%E6%9D%BE%E6%B5%A6-%E5%81%A5%E4%B8%80%E9%83%8E/dp/4797327316
Faraday middlewareの作り方

Faraday middlewareの要件としては、Rack middleware同様に

* `#initialize(app)`で他のmiddlewareを引数にとる
* `#call(env)`でリクエストの前処理を実装する。

の2点だけを満たせばいい。ただし、レスポンスを処理する場合は`#on_complete`内のブロックで実装する必要がある。

```rb
def call(request_env)
  @app.call(request_env).on_complete do |response_env|
    # パースなどレスポンスの処理
  end
end
```

ここまではREADME.mdにも書いてあるのだけど、レスポンスの処理を効率的に実装するための方法が用意されている。それは`Faraday::Response::Middleware`だ。使い方は以下の通り。

```rb
require "faraday"

module Faraday
  class Response
    class JSON < Middleware
      def parse(body)
        body.to_json
      end
    end

    register_middleware json: JSON
  end
end
```

* `#initialize(app)`で`@app = app`のようなことをしているため、特に書く必要はない。特別になにか必要であればoverrideする。
* `#parse(body)`でレスポンスをパースの処理を書くと、上述した`#on_complete`のブロックの中でこのメソッドが呼ばれ、`env.body`を`#parse(body)`の結果によって更新する。
* パース以外にレスポンス時の処理を記述したい場合、`#on_complete`を実装する。このメソッドは上述の`#on_complete`のブロック内で呼ばれるのだけど、これを実装すると`#parse`が呼ばれないので注意。
* `Faraday::Response.register_middleware`でキーとミドルウェアを登録できる。このキーを使って以下のように`:json`とミドルウェアを指定できる。

```rb
connection = Faraday.new do |connection|
  connection.response :json
  connection.adapter Faraday.default_adapter
end
```

---

簡単なので`Faraday::Response::Middleware`のソースコードを見てみる。

```rb
module Faraday
  class Response
    class Middleware < Faraday::Middleware
      def call(env)
        @app.call(env).on_complete do |environment|
          on_complete(enrivonment)
        end
      end

      def on_complete(env)
        env.body = parse(env.body) if respond_to?(:parse) && env.parse_body?
      end
    end
  end
end
```

* `#on_complete`ブロック内で`Middleware#on_complete`が呼ばれていることがわかる。
* さらにその中で`#parse`が実装されていれば呼ぶようになっている。

```rb
module Faraday
  class Middleware
    extend MiddlwareRegistry

    # ...

    def initialize(app = nil)
      @app = app
    end
  end
end
```

* `#initialize`であとに続くmiddlewareを取り込んでいる。
* `Faraday::MiddlewareRegistry`というモジュールで`.register_middleware`が定義されており、このメソッドでFaraday middlewareを指定する際のキーを登録できる。
HerokuでRailsアプリをデプロイする際にbowerを使わずRailsAssetsを使ってassets:precompileを通す

HerokuでRailsアプリをデプロイしようとしていたのですが、gemの`bower-rails`使ってJSライブラリを管理していました。いざHerokuにpushしようとしたら、bower周りがうまくいかずいろいろ調べながらやってたのですが`rake aborted`してしまいうまく行かずそこで辿り着いたのが `Rails Assets` を使ってbowerパッケージを扱う方法です。

[こちらのブログ](http://tnakamura.hatenablog.com/entry/2014/06/19/113000)を参考にしました。

## Rails Assetsについて

[Rails Assets](https://rails-assets.org/)

どうやらbowerパッケージをgemにコンバートしてホスティングしてるサービスなようです。
これを使えばbowerもnodeも不要なのでらくちんです。

## 実際に使ってみる

`Gemfile` に下記を追記します。

```
source 'https://rails-assets.org'
```

bowerで提供されているパッケージ名を下記のような形でGemfileに追記します。

```
gem 'rails-assets-BOWER_PACKAGE_NAME'
```

例えば`jquery`と`underscore`と`bootstrap`を足したい場合はさらに下記を追加します。

```
gem 'rails-assets-jquery'
gem 'rails-assets-underscore'
gem 'rails-assets-bootstrap'
```

そしたら`application.js`に下記を追記します。

```
//= require jquery
//= require underscore
//= require bootstrap
```

`bootstrap`はCSSにも必要なので`application.css`に`bootstrap`を追記します。

```
*= require bootstrap
```

あとは`bundle install`すればgemとしてインストールされます。

```
% bundle install
```

これで`node`と`bower`がなくてもHerokuで`assets:precompile`を通すことができました！

便利だわー。
Python基礎講座(はじめに)


**この記事を書いた動機**
僕の住む静岡県では、2010年から「静岡Developers勉強会」という
ITエンジニアを対象とした勉強会が開催されています。
2010年：「Programming in Haskell」
2011年：「JavaScript: The Good Parts」
2012年：「HTML5＆CSS3実践入門」
2013年：「入門 機械学習」
2014年：「実践 コンピュータビジョン」

昨年の「実践　コンピュータビジョン」ではPythonを使用したため、
多くの人に勉強会に参加してもらうために、Pythonの基本を学べる
スライドを作成しました。
その後、勉強会に参加したメンバーから、「自分もそのスライドの発表を聞きたい」と
要望があり、せっかく初心者用の資料を作成したのならば、Webで公開したほうが
多くの人が見ることが出来て良いのではないかと考え、今回Qiitaを利用して
スライドの内容を公開することにしました。

僕自身Pythonを日常生活や業務では使用していないため、このページで説明している内容は
本当に基礎的なものですが、これまでPythonを、さらにはプログラミング言語を勉強した
経験がない方にも分かりやすいよう意識したので、学習の参考になれば幸いです。

次: [Python基礎講座(1 Pythonとは)](http://qiita.com/Usek/items/ff4d87745dfc5d9b85a4)
cocos2d-x 3.3の大規模アプリのデータ設計構想

年末年始でcocos2d-xの勉強の一環でポーカーを作り、一通りの流れは把握しました。
実際の大規模ゲームを開発する上で、データの持ち方を突き詰める必要があると考えました。
##必要な項目
■テクスチャーのAtlas化
■圧縮テクスチャーの使用
■テクスチャーファイルの圧縮
■Cocos Studioに対応
■DLC対応
■分割DLC対応


##テクスチャーのAtlas化
複数の画像を一つのテクスチャーにまとめて扱う「Atlas化」を行いましょう。
Atlasにする理由は以下となります。
・テクスチャーの消費メモリ削減
・描画速度の向上


###テクスチャーの消費メモリ削減
テクスチャーの幅と高さは2の乗数(2,4,8,16,32,64,128,256,512,1024,2048)で持つ必要があります。
2の乗数でないテクスチャーも使えるように見えますが、大半のビデオカードは
2の乗数でないテクスチャーを指定されたときそのサイズが収まる2の乗数のテクスチャーを作成し、コピーを行います。
このコピーコストはかなり高く、これもまたビデオカードにもよりますが2の乗数のテクスチャー転送に比べて
**数十倍の作成時間**がかかります。
(これはGeForceのビデオカードの測定結果ですので、スマホのビデオカードがどのくらい遅いかはわかりません)
もし、40x40の画像が3枚あった場合、個別のファイルで扱うとビデオカードは
64x64のテクスチャーを3枚作ることになりますが、予め128x64の画像を作り
40x40の画像3枚をその画像の中に収めれば、容量が2/3となるため消費メモリを抑えることができます。


###描画速度の向上
描画コストがかかる理由のひとつにDraw Callというものがあります。
これは描画命令を1回呼ぶ＝1Callとなります。
しかし、100個のオブジェクトを表示すると100コールするかといわれるとそうではありません。
OpenGLやDirectXやその他多くのゲーム機には、描画物をまとめて表示する機能があり
こちらを使うことで、描画速度を向上することが可能です。
ただし、まとめて表示するオブジェクトに条件をつける必要があります。
・同一のテクスチャーであること
・同一のレンダリング設定であること
・同一の描画優先度であること(まとめるオブジェクト内では優先度を変更できる)

「同一のレンダリング設定であること」がわかりづらいと思いますが
これはブレンディング設定（アルファ、加算など）やテクスチャーフィルターなどが該当します。
逆にまとめるオブジェクトの中で個別に設定できることは以下となります。
・表示の有無(setVisible)
・座標移動(setPosition)
・拡大縮小(setScale)
・回転(setRotation)
・カラー値(setColor)
・不透明度(setOpacity)
・テクスチャー切り取り座標の変更(setTextureRect)
・まとめるオブジェクトの中の表示優先度(setLocalZOrder)
など


##圧縮テクスチャーの使用
スマホは画面サイズが大きく、またパレット(インデックスカラー)が使えないため
1枚のテクスチャーのサイズが非常に大きくなります。
例えばiPhone5(640x1136)に背景を1枚出そうとすると、テクスチャーのサイズは1024x2048で
更にフルカラーは1ピクセルに4byte(ARGB)消費するので
1024 x 2048 x 4 = 8388608
と、**背景1枚表示するのにメモリを8MBも消費**してしまいます。

この問題を解決する手法の一つに圧縮テクスチャーがあります。
圧縮テクスチャーは非可逆形式で、アルファありで1/4、アルファなしで1/8のサイズでメモリに乗るため
容量削減に大いに役立ちます。
当然デメリットもあります。

まず、**画質が荒く**なります。
これは仕様ですので諦めて下さい。
何かを得るためには何かを失うのが世の中です。

次の**環境ごとにフォーマットが違い**ます。
これがかなり曲者です。
WindowsではDXT、iOSではPVRTC、AndroidではETC1となります。
各環境ごとに画像を用意しなくてはいけないのも面倒ですが、何よりも問題なのが
**AndroidのETC1で、この形式はアルファを扱うことができません。**
正確にはAndroidはアルファ付き圧縮テクスチャーを使うことが不可能ではないのですが
使える機種と使えない機種が存在します。
全ての機種で確実に使えるのはこのETC1しか存在しません。
ETC1でアルファを扱う場合、通常の画像とは別にアルファマスクのグレースケール画像を用意し
シェーダを使用して、合成して描画する必要があります。


##テクスチャーファイルの圧縮
上記の圧縮テクスチャーはメモリ展開時のお話でしたが
こちらはストレージに置くときのテクスチャーの圧縮となります。
テクスチャーをgzipで圧縮し、ゲーム内で解凍して使用します。
画像にもよりますが、**40～90%くらいの圧縮**が見込め、多くのリソースを入れやすくなります。
なお、pngの場合は元々圧縮がかかっているので、ほとんどサイズは変わりません。


##Cocos Studioに対応
UIの配置やアニメーション作成に、Cocos Studioという便利なツールが公式から無料で提供されております。
このツールをデザイナさんに使ってもらって画面を構成し、それをそのまま表示することで開発効率が向上します。
ただし、実機のリソース配置がCocos Studioと同じでなくてはいけないため
**Atlas化、圧縮テクスチャー、テクスチャーファイルの圧縮、DLCと組み合わせるためにはテクニックが必要**となります。


##DLCの対応
Storeへのアップは~~**iPhoneは50MB、Androidは100MB**~~(逆でした)**iPhoneは100MB、Androidは50MB**までしか許可されていないため
昨今のゲームは起動後にリソースをダウンロードするものが多くなってきています。
開発中にリソースダウンロードを行うのは効率が悪いので、開発中はResourceフォルダにリソースをおいてアクセスし
本番環境ではユーザーキャッシュフォルダにリソースをダウンロードし、アクセスする作りにしなくてはいけません。


##分割DLC対応
必要なデータを必要なときにダウンロードする機能です。
基本的には、サーバからファイルリストを取得してまだ落とし終わっていないファイルが存在したら
ダウンロードを行うというものですが、どのデータがいつ必要であるかを
ヒューマンエラーを出さないように設計するのが大変だと思います。



##最後に
以上のことを踏まえ、今後の開発を進めていきます。
現時点ではAtlas化と圧縮テクスチャーは検証済みとなっていますが
ETCのシェーダ描画を行った際に、DrawCallが増えてしまっているので
こちらをどのように解消するかが、今後の課題です。
検証が済んだものから順次記事にアップしていく予定です。
メモ：ResponseのDefalut CharsetをUTF-8に切り替える(Spring Boot)

Spring Boot 1.2で ISO-8859-1をUTF-8に上書きしたらしいので、1.2以前の場合は1.2にアップグレードすれば良いらしい。

## 参考文献1
- [Spring Boot 1.2 リリースノート](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.2-Release-Notes)
- [gh-1800 - Issue](https://github.com/spring-projects/spring-boot/issues/1800)
- [Override StringHttpMessageConverter with UTF-8 - Commit](https://github.com/spring-projects/spring-boot/commit/cbd3c39640a201fb816b035537432ec4eaacbda1)

## 参考文献2
関係ありそうなやつ
- [RFC 的には text/* のデフォルトエンコーディングは ISO-8859-1 - tototoshi の日記](http://tototoshi.hatenablog.com/entry/2014/10/19/002158)
- http://stackoverflow.com/questions/20168563/spring-boot-utf-8-resources
- http://stackoverflow.com/questions/20935969/make-responsebody-annotated-spring-boot-mvc-controller-methods-return-utf-8

## 参考文献3
関係ありそうでなかったやつ
- http://stackoverflow.com/questions/24670446/utf-8-encoding-with-spring-boot-1-1-1
- http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#common-application-properties
Enable to control LCD backlight on Ubuntu installed on Toshiba MX/33

Toshiba MX/33にUbuntuをインストールすると、LCDの輝度コントロールができない。<br/>
LCDの輝度は、バッテリの持続時間に直接響く。そこで、LCDの輝度コントロールについて、Googleを検索していたところ、個人的に最適な解を見つけることができたので、備忘録として記しておく。

# 手順 #

1. root権限になる

	$ sudo -s
	
2. X11のコンフィグレーション作成

	viコマンドで、/usr/share/X11/xorg.conf.d/20-intel.confに以下の内容を記載する。

		# vi /usr/share/X11/xorg.conf.d/20-intel.conf

		Section "Device"
			Identifier  "card0"
			Driver      "intel"
			Option      "Backlight"  "intel_backlight"
			BusID       "PCI:0:2:0"
		EndSection

3. logout, loginを実行

以後、Fn+F6とFn+F7で輝度のコントロールが可能となる。

# 参考 #

今回の記事作成にあたり、[Fix Brightness Control Not Working for Ubuntu 14.04 & Linux Mint 17](http://itsfoss.com/fix-brightness-ubuntu-1310/)が非常に参考となった。<br/>
Jenkinsで条件分岐できるプラグイン

Jenkinsで、ある条件の時に何かさせたいということがあります。
そういうときはまず以下のプラグインを試しましょう。

* Conditional Build Step
* Flexible Publish

##提供されている条件分岐の方法

* ファイルの有無
* 環境変数
* スクリプトの戻り値

など10種類ぐらいあります。複数条件の組み合わせも可能です。

## プラグイン2つの違い

|プラグイン|対象|
|:--|:--|
|Conditional Build Step|ビルド処理欄|
|Flexible Publish|ビルド後の処理欄|

## 便利な使い方

下流のビルドを呼び出す部分にAlways/Neverを設定し、
次のビルド実行をON/OFFできるようにしておくと、ビルド自体のテストが楽になります。

また条件分岐は実行スクリプトよりもJenkinsに集約したほうが見やすくなると思います。
Ginqで2つの連想配列をJoinする例

```json
{
    "require": {
        "ginq/ginq": "dev-master"
    }
}
```

```php
<?php
require_once 'vendor/autoload.php';

// 商品カテゴリ
$categories = array(
    array('id' => 1, 'name' => '果物'),
    array('id' => 2, 'name' => '魚'),
);
// 商品データ
$items = array(
    array('id' => 1, 'name' => 'りんご', 'price' => 100, 'category' => 1),
    array('id' => 2, 'name' => 'みかん', 'price' =>  80, 'category' => 1),
    array('id' => 3, 'name' => 'さんま', 'price' => 180, 'category' => 2),
    array('id' => 4, 'name' => 'マグロ', 'price' => 300, 'category' => 2),
);

$results = Ginq::from($items)  // 元になる配列
    ->join(
        $categories,            // 結合する配列
        '[category]',           // 元になる配列側の結合フィールド
        '[id]',                 // 結合する配列側の結合フィールド
        function($item, $category, $itemKey, $categoryKey) {
            // 元になる配列にあった行が $item、結合する配列にあった行が $category として渡される
            // 結合後の1行ごとにここが呼ばれるので、結合結果として採用する行（1行分）を返す(SELECTにあたる）
            return array('id' => $item['id'], 'name' => $item['name'], 'price' => $item['price'], 'category_name' => $category['name']);
        }
    );
?>
<table>
<?php foreach ($results as $result): ?>
<tr>
    <td><?php echo $result['id'] ?></td>
    <td><?php echo $result['name'] ?></td>
    <td><?php echo $result['price'] ?></td>
    <td><?php echo $result['category_name'] ?></td>
</tr>
<?php endforeach; ?>
</table>
```
AWS Route53 各レコードの登録方法

Value Domainなどから、Route53へ移行する際に、レコードの書き方が若干違うので、整理しておく。

## IP指定

これは簡単。IPを書くだけ。

![debff731-5f96-131e-342a-d0a33bdf1227.png](https://qiita-image-store.s3.amazonaws.com/0/30521/d52dd702-0be9-799c-5a2e-6e22c011d739.png)

nameには、*を使用したワイルドカード指定も可能。

## ELB指定

ELBのドメインを指定する場合、CNAMEを利用するのが一般的であるが、Route53の場合は、AレコードのAliasを使ったほうがパフォーマンスが良いらしい。

[Amazon Route 53のALIASレコード利用のススメ](http://dev.classmethod.jp/cloud/aws/amazon-route-53-alias-records/)

TypeにAレコードを選択して、AliasにYesを指定する。
Alias Targetに、指定可能なELBがリスト表示されるので、それを選択するだけ。

![f85aaa1e-c20d-b92b-e8bf-799bb94b9545.png](https://qiita-image-store.s3.amazonaws.com/0/30521/ef689d0f-fc28-b9e2-a03a-0986d26d2d50.png)

## 別名

サブドメインであれば、ELBと同じく、Aliasを使うのがよい。
ELBと同じくAliasに登録されているレコードがリスト表示されるので、それを選択するだけ。

## MXレコード

[優先順位] [メールサーバ]の形式で登録。

![スクリーンショット 0027-01-03 20.33.57.png](https://qiita-image-store.s3.amazonaws.com/0/30521/68bee0d2-429a-9138-861c-6fe6914413c8.png)


## TXTレコード

""で囲んで登録する。

![スクリーンショット 0027-01-03 20.47.49.png](https://qiita-image-store.s3.amazonaws.com/0/30521/370045da-7226-adeb-564b-768d37bcdaa3.png)
今年の素数日を求める

私も、[『今年の素数日を計算してみる』](http://qiita.com/hamukazu/items/6d9d98f82a73f5875250)に倣って「素数日」を調べるコードを書いてみました。

改変した点は "**isPrimeDay**" 関数と "**primeDaysIn**" 関数を独立させたことと、コマンドライン引数がない場合は今年の素数日を表示することです。

"**isPrimeDay**" 関数を独立させたので、特定の日が素数日かを調べたり、いろいろな範囲で素数日を探すことができるようになりました。

```Haskell:primeDaysIn.hs
import System.Environment
import Data.Time.Calendar
import Data.Time.LocalTime
import Data.Char


-- 素数か？
isPrime :: Integral a => a -> Bool
isPrime n = n > 1 && foldr f True ps
  where
    ps = (2 : 3 : concat [[6 * x - 1, 6 * x + 1] | x <- [1 ..]])
    f p r = (p * p > n) || (rem n p /= 0 && r)

-- 素数日か？
isPrimeDay :: Day -> Bool
isPrimeDay = isPrime . read . filter (/= '-') . show

-- 引数の年の素数日のリストを返す
primeDaysIn :: Integer -> [Day]
primeDaysIn y = filter isPrimeDay [fromGregorian y 1 1 .. fromGregorian y 12 31]


--
-- + コマンドライン引数で年を指定する。
-- + 引数がなければ今年の素数日を調べる。
--
main :: IO ()
main = do args <- getArgs
          let putUseage = putStrLn "Usage : primeDaysIn <year>"
          case args of
            y : _ -> if all isDigit y
                       then mapM_ print $ primeDaysIn $ read y
                       else putUseage
            _     -> do y <- getZonedTime
                        mapM_ print $ primeDaysIn $ read $ takeWhile (/= '-') $ show y
```


```
>runghc primeDaysIn.hs 2015
runghc primeDaysIn.hs 2015
2015-01-11
2015-01-31
2015-02-27
2015-03-03
2015-03-27
2015-04-11
2015-05-13
2015-08-21
2015-10-11
2015-10-31
2015-11-27
2015-12-21
2015-12-27
```
STM32F4DISCOVERYで.NET 4.3 Micro Frameworkを取りあえず動かしてみた

# はじめに
試行錯誤中なので、とりあえずのメモ書きです。
これにしたがってポチポチとやってみました。
http://bonebyte.com/?p=151

作業時間は2時間程度です。

# ビルドとボードへの書き込み
Windows 8 64Bit + Visual Studio Express 2012 for Windows Desktop + .NET Micro Framework は、V4.3 RTMを使います。

2015年1月現在の最新f版は Visual Studio Community 2013 + .NET Micro Framework V4.3 SDK-R2-Beta ですがこの組み合わせでは動きません。

## 必要なファイル
以下のファイルをダウンロードしておきます。
 
* [.NET 4.3 Micro Framework](http://netmf.codeplex.com/releases/view/81000)
* [STM32 ST Link](http://www.st.com/web/en/catalog/tools/PF258168)
* [GHI Gadgeteer package]( https://www.ghielectronics.com/support/netmf/sdk/24/netmf-and-gadgeteer-package-2014-r5)
* [GCC 4.6](https://launchpad.net/gcc-arm-embedded/4.6)
* [Community ports and libraries for .NET Micro Framework](https://github.com/funkathustra/netmf-community-ports)

## 環境設定
ダウンロードしたファイルを使って、環境を整えていきます。

1. Visual Studio Community 2013 をインストール
2. GCC 4.6 を "C:\GCC_ARM_4_6" にインストール
3. .net microframework 4.3 をインストール
4. Community ports and libraries を "C:\MicroframeWorkPK_4_3" に解凍
5. GHI Gadgeteer package をインストール
6. STM32 ST Link をインストール
7. msbuild が使えるか、確認
    * コマンドプロンプトを起動し、msbuild.exe を実行
    * 見つからない場合、環境変数のPathにC:\Windows\Microsoft.NET\Framework64\v4.0.30319 を追加
8. コマンドプロンプトで、C:\MicroframeWorkPK_4_3 に移動し、以下のコマンドを実行

> setenv_gcc.cmd 4.6.2 C:\GCC_ARM_4_6

## ファームウェアの修正
これからビルドするのは、Cerberus と呼ばれるボードのファームウェアになります。
Cerberus では12MHzクリスタルが使われていますが、STM32F4DISCOVERYは8MHzクリスタルが使われているため、ソースの一部の修正が必要になります。

```lang:MicroframeWorkPK_4_3\Solutions\FEZCerberus\platform_selector.h
#define SYSTEM_CRYSTAL_CLOCK_HZ         12000000   // 12MHz external clock
```
この値を 8000000 に書き換えて保存します。

## ビルド
C:\MicroframeWorkPK_4_3 の中で、以下のコマンドを実行します。
> msbuild.exe build.dirproj

C:\MicroframeWorkPK_4_3\Solutions\FEZCerberus の中で、以下のコマンドを実行します。

> msbuild.exe dotNetMF.proj /t:build /p:flavor=release;memory=flash

ビルドが終わると、"ビルドに成功しました。"と出ます。
警告がいろいろと出ましたが、気にせずに次に進みます。

以下のフォルダの中から、ファイルを取り出して適当なフォルダの中にまとめて入れておきます。
C:\MicroframeWorkPK_4_3\BuildOutput\THUMB2\GCC4.6\le\FLASH\release\FEZCerberus\bin

* tinybooter.hex
* tinyclr.hex フォルダ内 の ER_CONFIG
* tinyclr.hex フォルダ内 の ER_FLASH

## ボードへの書き込み
ビルドしたファイルを書き込みます。

1. STM32F4 Discoveryをmini usbで繋ぎ、電源を入れる
2. ST-Link Utilityを起動し、"Connect to the target." ボタンを押す
3. Target メニュー > Erase Chip を選択 
4. Target メニュー > Erase Sectorを選択、Select All を選択後に、Apply
5. Target メニュー > Programを選択、ファイル選択ダイアログで、ビルド後に取り出しておいたtinybooter.hex を選択し、start
6. STM32F4 Discoveryのmini usbを抜き差しし、STM32F4 Discoveryを再起動
7. STM32F4 Discoveryをmicro usbで繋ぐ
8. デバイスマネージャーを開き、ユニバーサルシリアルバスデバイスの中にCerb-Familyがあり、正常に動作していることを確認
9. .Net Micro framework Deployment tool を起動
10. DeviceのドロップダウンからUSBを選択し、"Ping" ボタンを押す
   * Cerb-Family Gadgeteerが選択済になる
11. Image fileの "Browse"ボタンを押す
12. ビルド後に取り出しておいた "ER_FLASH" "ER_CONFIG" を選択する
13. Image fileの "Deploy"ボタンを押す

# 動作確認
Visual Studioを起動し、新しいプロジェクト > Visual C# > Micro Framework > Console Applicationを選択します。

プロジェクトが開いたら、プロジェクト > プロパティを開き、".NET Micro Framework"タブを選択します。

Deploymentの中のTransportドロップダウンを"USB"に変更し、Deviceが"Cerb-Family_Gadgeteer"に変わったことを確認してプロパティを閉じます。

あとは、いつも通り、ビルドして実行するだけ。
デバッグ出力にHello World!と出ているはずです。
PreferenceFragment表示時に規定値をSummaryに表示し、また動的に更新する。

以下の通りです。

```java:ConfigFragment.java

public class ConfigFragment extends PreferenceFragment{
    //private ListView lv;

    public static ConfigFragment newInstance() {
        return new ConfigFragment();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.pref);
    }

    @Override
    public void onResume() {
        super.onResume();
        reloadSummary();
        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(listener);
    }

    @Override
    public void onPause() {
        super.onPause();
        getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(listener);
    }

    private void reloadSummary(){
        ListAdapter adapter = getPreferenceScreen().getRootAdapter();
        for (int i=0;i<adapter.getCount();i++){
            Object item = adapter.getItem(i);
            if (item instanceof ListPreference){
                ListPreference preference = (ListPreference) item;
                preference.setSummary(preference.getEntry() == null ? "" : preference.getEntry());
            }
        }
    }

    private SharedPreferences.OnSharedPreferenceChangeListener listener =
            new SharedPreferences.OnSharedPreferenceChangeListener() {
                public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
                    reloadSummary();
                }
            };
}

```

重要なのは`reloadSummary()`となります。
ここでPreferenceFragmentのアダプターを引っ張ってきてSummaryに反映しています。
Today Extension (Widget)から設定アプリを起動する

#概要

iOS8からは、iOSアプリ本体から設定アプリを再び開けるようになりました。
詳しくは、[iOS8で復活した設定画面へのURLスキーム](http://qiita.com/Night___/items/3d689d657ee691d2cabe "iOS8で復活した設定画面へのURLスキーム")こちらの記事で詳細に記載されていましたので、そちらを参照いただければ

ただアプリ本体からは、そのアプリの設定ファイルしか開けません。(開く方法があればご教授ください)

ただ、iOS8から追加されました、TodayExtention(Widget)を利用すれば、Widget側から設定アプリを開くことが出来ます。

#やり方
widget側で、設定アプリのURLスキームをコールするだけです。

```objc
NSURL *url = [NSURL URLWithString:@"pref:root"];
[self.extensionContext openURL:url completionHandler:nil];
```

色々やってみたのですが、昔あったURLスキームはある程度開くことが出来ました。
(例えば、&pathでつないで、設定アプリの下層の設定も開けたり)

# 最後に

なんで開けるようになったのかは調べて無いので不明です。
(そもそもセキュリティの問題等があり、アプリ側から開けなくしたような背景を聞いた気が…となるといずれできなくなるかも。)
RailsでページのタイトルをI18nを使って変更する方法

## 1. 概要

Railsでページのタイトルを変更する方法としては、独自にヘルパーメソッドを追加する方法などがあるが、ここでは`titleizer`というGemを使った方法を示す。

- [kami30k/titleizer](https://github.com/kami30k/titleizer)

## 2. インストール

`Gemfile`に以下を追加し、`bundle install`する。

```rb:Gemfile
gem 'titleizer'
```

## 3. 使い方

### 基本的な使い方

#### 1) タイトルを設定する

`config/locales/*.yml`に、以下のようにタイトルを設定する（例えば`title.ja.yml`）。

```yaml:config/locales/title.ja.yml
ja:
  title:
    application: サンプルブログ
    description: これはサンプルブログです
    posts:
      index: 記事一覧
      show: "%{subject}"
      new: 記事投稿
      edit: 記事編集
          :
```

#### 2) タイトルタグを編集する

`app/views/layouts/application.html.erb`のタイトルタグを次のように編集する。

```erb:app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title><%= title(yield :title) %></title>
        :
  </head>
```

以上で、コントローラとアクションに応じたタイトルが自動でタイトルタグに設定される。
例えば、上記設定ではタイトルは以下のようになる。

| パス | タイトル |
| --- | --- |
| root_path | これはサンプルブログです &#124; サンプルブログ |
| posts_path | 記事一覧 &#124; サンプルブログ |

### オプション

#### 変数を使用する

例えば`title.ja.yml`内の`%{subject}`など、タイトルに変数を使用したい場合がある。
この場合、コントローラのアクション内で`@title_params`に変数をセットできる。

```rb:app/controllers/posts_controller.rb
class PostsController < ApplicationController
  def show
    @post = Post.find(params[:id])

    @title_params = { subject: @post.subject }
  end
end
```

#### タイトルを上書きする

例えばエラーページなど、`title.ja.yml`内で設定したタイトルとは違うタイトルを設定したい場合がある。
この場合、ビューで`provide :title`により上書きできる。

```erb:app/views/shared/_render_404.html.erb
<% provide :title, '404 Not Found' %>
```

## 4. 参考

- [Abusing Rails I18N to Set Page Titles](http://opensoul.org/2012/11/05/abusing-rails-i18n-to-set-page-titles/)
- [Railsでタイトル/metaタグを動的に設定する方法](http://post.simplie.jp/posts/17)
MacにおけるXBOX360コントローラーの備忘録

MacでXBOX360コントローラーを使おうとすうとなかなかにハマることが多いので、自分のためにここにメモを残すことにする。

# XBOX360コントローラー用ドライバーは「0.11」を使え
最新の0.12を使うとXBOX360コントローラーを認識しない。
なぜ同じXBOX360コントローラー用のドライバーなのに認識しないのかは不明。

# もし0.12を入れてしまった時に削除するファイル
/System/Library/Extensions/360Controller.kext
/System/Library/Extensions/Wireless360Controller.kext
/System/Library/Extensions/WirelessGamingReceiver.kext
/Library/PreferencesPanes/Pref360Control.prefPane
/Library/StartupItems/360ControlDaemon
/var/db/receipts/com.mice.pkg.Xbox360controller.bom
/var/db/receipts/com.mice.pkg.Xbox360controller.plist

# 最後の2つが出ていない時
$ defaults write com.apple.finder AppleShowAllFiles 1

# ドライバーの在り処
http://tattiebogle.net/index.php/ProjectRoot/Xbox360Controller/OsxDriver/
iOS/swiftで緯度・経度から2点間の距離を算出する


```
let 現在地の緯度: Double = 135.5258549
let 現在地の経度: Double = 34.6873527
let 行き先の緯度: Double = 139.75313186645508
let 行き先の経度: Double = 35.68525668970075
let 現在地の位置情報: CLLocation = CLLocation(latitude: 現在地の緯度, longitude: 現在地の経度)
let 行き先の位置情報: CLLocation = CLLocation(latitude: 行き先の緯度, longitude: 行き先の経度)
距離 = 行き先の位置情報.distanceFromLocation(現在地の位置情報)
```

参考にさせていただきました
[Objective-Cで経緯・緯度から２点間の距離を出す](http://wizard.st/blog/archives/52)