OmniAICreator/Qiita-1.07M huggingface dataset:
SSL証明書の有効期限を確認するシェルスクリプトワンライナー

## 経緯

[こちらの投稿](/miriorg/items/ead54100bc145008e031 "シェルでSSL証明書の有効期限を確認する") から派生。

## 変更点

- 一時ファイルを経由しないワンライナー化。
- タイムゾーン変更に対応。
- opensslのクライアントアクセスコマンドオプションに `-servername` を追加してSNI対応。
    - 後述のMuninプラグインでやってた変更を参考にした。

## 内容

### 有効期限を確認する

```sh:タイムゾーンを変えたい場合は環境変数TZを変更
DOMAIN='example.com'; TZ=JST-9 date +"%Y-%m-%d %H:%M:%S" --date="`openssl s_client -connect ${DOMAIN}:443 -servername ${DOMAIN} </dev/null 2>/dev/null | openssl x509 -enddate -noout | cut -d'=' -f2`"
```

### 残り日数を表示するなら…

```sh:
DOMAIN='example.com'; date +"%s" --date="`openssl s_client -connect ${DOMAIN}:443 -servername ${DOMAIN} </dev/null 2>/dev/null | openssl x509 -enddate -noout | cut -d'=' -f2`" | gawk '{printf("%d\n",($0-systime())/86400-1/86400+1)}'
```

### Muninで記録しておけばいいんじゃね？

上記コマンドをもとに自作しようとも考えたが、探すと既に存在した。
https://github.com/munin-monitoring/contrib/blob/master/plugins/ssl/ssl_

----

## 余談

今回、派生ネタを投稿して感じたことだけど、QiitaにはPull-Reqっぽい「編集リクエスト」機能はあるけど、それって当該情報の改訂提案だから、今回のようなものだとちょっと違うかと思って使えなかった。

どうせならFork機能か、あるいは関連付けができる機能が欲しいところ。
[Rails][Route] Creating Paths and URLs From Objects

http://guides.rubyonrails.org/routing.html#controller-namespaces-and-routing


```
2.9 Creating Paths and URLs From Objects
In addition to using the routing helpers, Rails can also create paths and URLs from an array of parameters. For example, suppose you have this set of routes:
```

```rb
resources :magazines do
  resources :ads
end
```

```
When using magazine_ad_path, you can pass in instances of Magazine and Ad instead of the numeric IDs:
```

```html+erb
<%= link_to 'Ad details', magazine_ad_path(@magazine, @ad) %>
```

magazine_ad_pathに対して、IDを表す数値ではなく、オブジェクトを渡すことができる。

```
You can also use url_for with a set of objects, and Rails will automatically determine which route you want:
```

```html+erb
<%= link_to 'Ad details', url_for([@magazine, @ad]) %>
```

Magazine ModelとAd Modelと見なして、magazine_ad_pathを使用してくれる。

```
In this case, Rails will see that @magazine is a Magazine and @ad is an Ad and will therefore use the magazine_ad_path helper. In helpers like link_to, you can specify just the object in place of the full url_for call:
```

link_toメソッドなどのヘルパーでは、名前付きパスの部分にModelを渡してもいい。

```html+erb
<%= link_to 'Ad details', [@magazine, @ad] %>
```

```
If you wanted to link to just a magazine:
```


```html+erb
<%= link_to 'Magazine details', @magazine %>
```

```
For other actions, you just need to insert the action name as the first element of the array:
```

```html+erb
<%= link_to 'Edit Ad', [:edit, @magazine, @ad] %>
```

アクションを指定したいときは、配列の先頭要素として、アクション名を渡す。

```
This allows you to treat instances of your models as URLs, and is a key advantage to using the resourceful style.
```
Gitの勉強メモ

**公式サイト**
http://git-scm.com/

バージョン確認

```
git --version
```

##初期設定
作業者の情報セット

```
// 必須
$ git config --global user.name="User Name"
$ git config --global user.email="sample@emal.com"
// 便利
$ git config --global color.ui true
$ git config --global core.quotepath false
// 設定内容確認
$ git config -l
```

ヘルプ呼び出し

```
$ git config --help
```

##コミット手順
ディレクトリ確認

```
$ pwd
```

cdコマンドで作業フォルダのディレクトリへ移動

Gitで使用する宣言

```
$ git init
```

正常に実行されると下記メッセージが表示される

```
Initialized empty Git repository xxx/.git/
```

gitにファイル追加

```
git add index.html
```

gitにコミット

```
$ git commit initial commit
```

テキストエディタが立ち上がるのでメッセージを記載して保存

ログの確認

```
// 通常ログ
$ git log
// 1行表示
$ git log --oneline
// 変更箇所の確認
$ git log -p
// 変更ファイルの確認
$ git log --start
```

※ログモードは q で終了できる。

##状況確認
ステータス確認

```
$ git status
```

差分確認

```
$ git diff
```

##ファイルの操作

今のディレクトリ内のファイルを一度にAddする

```
$ git add .
```

Gitで管理しているファイルの削除

```
$ git rm XXXX
```

ファイルの確認

```
$ ls -la
```

Git管理に含めない設定
下記コマンドでSublimeTextを起動してファイルを作成
そのファイルに「*.log」などを指定する

```
$ subl .gitignore
```

##メッセージをつけてコミット

```
$ git commit -m "Message"
```

##一つまえのコミットにもどる

```
$ git commit --amend
```

##過去のバージョンに戻る

```
// 一つ前
$ git reset --hard HEAD
// 2つ前
$ git reset --hard HEAD^
// ID指定(最低7桁)
$ git rest --hard b8xxxxx
// リセットしたコミットを戻す
$ git reset --hard ORIG_HEAD
```

##ブランチ
ブランチの一覧表示

```
$ git branch
```

新しいブランチ作成

```
$ git branch (branch name)
```

※()は不要

ブランチの移動

```
$ git checkout (branch name)
```

ブランチのマージ

```
$ git merge (branch name)
```

ブランチの削除

```
$ git branch -d (branch name)
```

ブランジのマージでお互いのブランチで同時に修正されてときは次のようなメッセージが表示されるのでファイルを開いて変更箇所を確認し、正しい形に修正する。修正後はコミットして完了。

```
Automatic marge failed; fix onflicts and then commit the result 
```

##Tagをつける
コミットのIDは長くてわかりづらいので、git tagで別名をつけることができる

新しいタグの作成(直近のコミット)

```
$ git tag v1.0
```

タグの一覧表示

```
$ git tag
```

過去のコミットにタグ付け

```
$ git tag (commit ID)
```

タグの削除

```
$ git tag -d (tagname)
```

##Gitコメンドの別名
次のような感じとのことです。

```
git config --global alias.co checkout
git config --global alias.st status
git config --global alias.br branch
git config --global alias.ci commit
git config -l
```

##共有リポジトリ(GitHubとか)の宣言

```
$ git init --bare
```

##共有リポジトリの操作

```
// add
$ git remote add origin (repos location)
// push
$ git push origin master
// リポジトリコピー
$ git clone ~/xxx.git/ name
// 最新情報を取得
$ git pull origin master
```

repos locacionは~/xxx.gitのような感じ
TitaniumのAndroidアプリにRubyのコードからPush通知


細かいところあってるかわからないけど、だいたいこんな感じで行けました。

# 1. サーバ側の実装というか準備(Ruby)

[1] プロジェクトの作成

https://console.developers.google.com/project
- CREATE PROJECT をクリック
- 必要な情報は適宜埋める

[2] プロジェクトの設定変更

- 作成したプロジェクトのリンクをクリック
- APIs & auth -> APIsを選択
  - Google Cloud Messaging for Android の設定をONにする
- Credentials -> Public API access -> Create New Keys -> Server Key
  - IPアドレスの制限はテスト目的なのでとりあえず空欄
  - API Keyは後で使うのでメモっておく

[3] Rubyのgcmライブラリを使ってAndroidアプリにPush通知

https://github.com/spacialdb/gcm

以下に書かれているサンプルコードをそのまま使った（APIキーとかは適宜変えました）。
http://qiita.com/ma2saka/items/5852308b7c2855eef552


# 2. Titaniumクライアントの準備

[1] gcm.js モジュールをダウンロード

https://marketplace.appcelerator.com/apps/5165?restoreSearch=true#!overview

[2] zipファイルをモジュールファイルをTitaniumプロジェクトのディレクトリに展開

[3] tiapp.xmlファイルに以下を追加

```xml
<property name="GCM_sender_id" type="string">Sender Id(プロジェクトID)をここに書く</property>
<modules>
    <module platform="android" version="0.2">net.iamyellow.gcmjs</module>
</modules>
```

[4] 以下のコードをTitaniumのコードの適当なところに追加

```javascript
		var gcm = require('net.iamyellow.gcmjs');
		gcm.registerForPushNotifications({
			success: function (ev) {
				// on successful registration
				Ti.API.info('******* success, ' + ev.deviceToken);
			},
			error: function (ev) {
				// when an error occurs
				Ti.API.info('******* error, ' + ev.error);
			},
			callback: function () {
				// when a gcm notification is received WHEN the app IS IN FOREGROUND
				alert('hellow yellow!');
			},
			unregister: function (ev) {
				// on unregister 
				Ti.API.info('******* unregister, ' + ev.deviceToken);
			},
			data: function (data) {
				// if we're here is because user has clicked on the notification
				// and we set extras in the intent 
				// and the app WAS RUNNING (=> RESUMED)
				// (again don't worry, we'll see more of this later)
				Ti.API.info('******* data (resumed) ' + JSON.stringify(data));
			}
		});

```

[5] Titaniumアプリを起動してdeviceTokenの出力を記録しておく

- 私の場合はここでsender keyが無効というエラーメッセージが出て、Google Cloud Messaging for Android の設定がONになっていないことに気がつきました。

# 3. 再びサーバー側の作業

[1] Rubyのサンプルコードの変更
- サンプルコードのregistration_idに2.でメモったdeviceTokenの値を入れる
- サンプルコードのAPI KYEに1.でメモった値を入れる

[2] Rubyのサンプルコードの実行
- Tiアプリの画面にAlert画面が表示されたら成功
- Unauthrizeのエラーが返ってきたら以下に従ってトラブルシューティング
http://developer.android.com/google/gcm/http.html#auth_error
[Rails][Model] validate :if options

http://guides.rubyonrails.org/active_record_validations.html#conditional-validation

```
5 Conditional Validation
Sometimes it will make sense to validate an object only when a given predicate is satisfied. You can do that by using the :if and :unless options, which can take a symbol, a string, a Proc or an Array. You may use the :if option when you want to specify when the validation should happen. If you want to specify when the validation should not happen, then you may use the :unless option.
```

validateを条件付きで行うには`:if`や`:unless`オプションを使う。
引数は、シンボル、文字列、Proc、配列のいずれかである。

```
5.1 Using a Symbol with :if and :unless
You can associate the :if and :unless options with a symbol corresponding to the name of a method that will get called right before validation happens. This is the most commonly used option.
```

```rb
class Order < ActiveRecord::Base
  validates :card_number, presence: true, if: :paid_with_card?
 
  def paid_with_card?
    payment_type == "card"
  end
end
```

シンボルを渡すときは、そのシンボル名のメソッドが呼ばれて、判定する。

```
5.2 Using a String with :if and :unless
You can also use a string that will be evaluated using eval and needs to contain valid Ruby code. You should use this option only when the string represents a really short condition.
```

```rb
class Person < ActiveRecord::Base
  validates :surname, presence: true, if: "name.nil?"
end
```

文字列を渡すときは、その文字列がevalで評価され、その結果で判定する。

```
5.3 Using a Proc with :if and :unless
Finally, it's possible to associate :if and :unless with a Proc object which will be called. Using a Proc object gives you the ability to write an inline condition instead of a separate method. This option is best suited for one-liners.
```

```rb
class Account < ActiveRecord::Base
  validates :password, confirmation: true,
    unless: Proc.new { |a| a.password.blank? }
end
```

Procを渡すと、Procが評価され、その結果で判定する。

```
5.4 Grouping Conditional validations
Sometimes it is useful to have multiple validations use one condition, it can be easily achieved using with_options.
```

```rb
class User < ActiveRecord::Base
  with_options if: :is_admin? do |admin|
    admin.validates :password, length: { minimum: 10 }
    admin.validates :email, presence: true
  end
end
```

```
All validations inside of with_options block will have automatically passed the condition if: :is_admin?
```

ひとつの条件判定で複数のvalidateをするときはwith_optionsでまとめることができる。

```
5.5 Combining Validation Conditions
On the other hand, when multiple conditions define whether or not a validation should happen, an Array can be used. Moreover, you can apply both :if and :unless to the same validation.
```

```rb
class Computer < ActiveRecord::Base
  validates :mouse, presence: true,
                    if: ["market.retail?", :desktop?]
                    unless: Proc.new { |c| c.trackpad.present? }
end
```

```
The validation only runs when all the :if conditions and none of the :unless conditions are evaluated to true.
```

逆に、複数の条件で判定して、一つのvalidationを実行するときは、`if:`に配列を渡すことができる。
変数をコマンド実行する

# 用途

## Invoke-Expression

スクリプト内で変数組み立てをした時など。

```
PS D:\temp> $test1="get"
PS D:\temp> $test1+="`-childitem"
PS D:\temp> $test1
get-childitem

PS D:\temp> invoke-expression $test1


    ディレクトリ: D:\temp


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2014/03/27     23:22         16 test1.txt


PS D:\temp>
```
CreateJSとfastclickを一緒に使うときの注意点

[fastclick](https://github.com/ftlabs/fastclick)を有効にしたDOMの中で
CreateJSのオブジェクトに`click`で登録したイベントが
呼ばれないという現象が起きます。(iOS/Android実機)

```coffeescript
shape = new cjs.Shape()
shape.graphics
  .f '#f00'
  .r 10, 10, 100, 100
  .ef()
shape.addEventListener 'click', ->
  console.log 'shape clicked'
stage.addChild shape
stage.update()
```

## 原因
### EaselJS

`mouseup`と直前の`mousedown`がヒットエリア内にあれば
`click`で登録したイベントを呼ぶ。
Canvasが直接`click`を拾っている訳ではない模様。
https://github.com/CreateJS/EaselJS/blob/release_v0.7.1/src/easeljs/display/Stage.js#L701

### fastclick

`touchend`のタイミングで強制的に`click`を発火させる
https://github.com/ftlabs/fastclick/blob/v1.0.0/lib/fastclick.js#L573

という仕組みになっているため相性が悪いようです。

## 対策

- ターゲットがCanvasの場合は`mouseup`, `mousedown`も発火させるようにする

https://github.com/t93/fastclick/commit/b74983f99f5dbaac14bf76bdc4827b0471a86d1a

だいぶ雑な感じですが一応これで動きました。

もっと良い方法あったら教えてもらえると嬉しいです。
QiitaAPIのTOKENをかんたんに取得する


QiitaAPIのTOKENを取得するのに、いちいちサーバーサイドを構築するのは面倒だったので、jQueryを使って1ファイルだけでTOKENを取得できるようにしてみました。

```html:auth.html
<!DOCTYPE html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Qiita TOKEN</title>
        <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
        <script type="text/javascript">
$(function() {
    $("#send").click(function() {
        $.ajax({
            type: "POST",
            url: "https://qiita.com/api/v1/auth/",
            async: true,
            cache: false,
            json: true,
            data: {url_name: $("#url_name").val(), password: $("#pass").val()},
            success: function(data) {
                alert(data.token);
            },
            error: function(xhr, status, error) {
                if (error === "Unauthorized") {
                    alert("パスワードが違います");
                } else {
                    alert(error);
                }
            }
        });
        return false;
    });
});
        </script>
    </head>
    <body>
        <form>
            <input id="url_name" pattern="^\w[\w\-]{1,30}\w$" placeholder="ユーザ名" type="text" />
            <input id="password" pattern="^\S{8,32}$" placeholder="パスワード" type="password" />
            <button id="send">送信</button>
        </form>
    </body>
</html>
```

このファイルをローカルに保存して実行するだけでOKです。
Paperclipで写真も動画も同じカラムを使いアップロードとサムネイルの作成をする


[Paperclip](https://github.com/thoughtbot/paperclip)と[Paperclip FFMPEG](https://github.com/owahab/paperclip-ffmpeg)を使って写真も動画も同じカラムでアップロードとサムネイルの作成を行いたい場合の書き方です。

```has_attached_file``` の ```styles``` と ```processors``` を以下のような感じで書く。

```ruby
has_attached_file :attachment,
  styles: lambda { |file|
    if file.instance.is_video?
	  {
        medium:    { geometry: '240x240#', format: 'jpg', time: 0, auto_rotate: true },
        thumbnail: { geometry: '64x64#', format: 'jpg', time: 0, auto_rotate: true },
      }
    else
      { medium: '240x240#', thumbnail: '64x64#' }
    end
  },
  storage: :filesystem,
  path: ":attachment/:id/:style/:filename",
  processors: lambda { |file| file.is_video? ? [ :ffmpeg ] : [ :thumbnail ] }

def is_video?
  attachment.instance.attachment_content_type =~ %r(video) ? true : false
end
```
HipChat の Topic に emoticon が設定できる


    /topic (jobs)(heart)(gates)

などとタイプすると、

![kobito.1395928770.254803.png](https://qiita-image-store.s3.amazonaws.com/0/1053/f26f1fe0-dab1-552a-bde6-4865ce7e46e2.png "kobito.1395928770.254803.png")

世界平和な感じに。

[custom emoticon](http://help.hipchat.com/knowledgebase/articles/276750-how-to-create-custom-emoticons) もいけました。ネタ系 Tip でした。
[Rails][Model] default_scope / scope

http://guides.rubyonrails.org/active_record_querying.html#scopes

```
14 Scopes
Scoping allows you to specify commonly-used queries which can be referenced as method calls on the association objects or models. 
```

```rb
class User < ActiveRecord::Base
  scope :active, -> { where(status: 'active') }
end
```

```rb
class User < ActiveRecord::Base
  def self.active
    where(status: 'active')
  end
end
```

どちらの定義も同様のもの。
scopeはおおよそクラスメソッドのように利用する。

```
User.active
# => SELECT "users".* FROM "users" WHERE "users"."state" = 'active'
```

```
One important caveat is that default_scope will be overridden by scope and where conditions.
```

```
class User < ActiveRecord::Base
  default_scope  { where state: 'pending' }
  scope :active, -> { where state: 'active' }
  scope :inactive, -> { where state: 'inactive' }
end
 
User.all
# => SELECT "users".* FROM "users" WHERE "users"."state" = 'pending'
 
User.active
# => SELECT "users".* FROM "users" WHERE "users"."state" = 'active'
 
User.where(state: 'inactive')
# => SELECT "users".* FROM "users" WHERE "users"."state" = 'inactive'
```

```
As you can see above the default_scope is being overridden by both scope and where conditions.
```

default_scopeはscopeにも、whereによっても無効になる。


```

14.3 Applying a default scope
If we wish for a scope to be applied across all queries to the model we can use the default_scope method within the model itself.
```

```rb
class Client < ActiveRecord::Base
  default_scope { where("removed_at IS NULL") }
end
```

```
When queries are executed on this model, the SQL query will now look something like this:

SELECT * FROM clients WHERE removed_at IS NULL
If you need to do more complex things with a default scope, you can alternatively define it as a class method:
```

```rb
class Client < ActiveRecord::Base
  def self.default_scope
    # Should return an ActiveRecord::Relation.
  end
end
```

モデルのすべてのクエリに対してscopeを適用したいときは`default_scope`を定義する。
`self.default_scope`でも同様の効果。
IntelliJIDEAでKarmaでJasmineのテスト走らせました。


##前提

1.nodebrewにてnode&npmインストール済みです。
↓こちらを参考にさせていただきました。
[node.jsのversionを管理するためにnodebrewを利用する](http://qiita.com/sinmetal/items/154e81823f386279b33c)


2.npmでYeoman&generator-angularインストール済みです。
↓こちらを参考にさせていただきました。
[AngularJS 入門](http://qiita.com/lga0503/items/d8efddcad2574e1938f1)


##プロジェクト作成

```
mkdir angularYeoman
cd angularYeoman
yo angular
```
でAngularプロジェクトを作成。
##File > OpenからangularYeomanを開く
こんな感じです。

![オープン](http://f.cl.ly/items/2G243c0I2W3S0R1C0O2J/2014-03-27%2021.23.10.png)

karma.conf.jsもyo angularコマンドによって生成されています。


##Karmaの実行環境設定
Run/Debug Configurationから以下の様に設定

![オープン](http://f.cl.ly/items/341f2C0x0a3F1A2n3H1N/2014-03-27%2022.09.01.png)

Run/Debug ConfigurationにKarmaが登場しない場合はPluginが入っていませんのでPluginを入れてください。


##実行する


落ちる

```
Error: No provider for "framework:jasmine"! (Resolving: framework:jasmine)
```

##karma-jasmineインストール
**angularYeomanディレクトリに移動してnpmでインストールします。**

さっきの実行環境設定でangularYeomanプロジェクトにインストールされたkarmaを指定しているので、ここにkarma-jasmineをインストールしています。もしグローバル環境にkarmaをインストールしていて、そちらを実行環境設定でも使っているのであれば、グローバルでインストールしてあげればいいのではないかと思います。

```
npm install karma-jasmine
npm http GET https://registry.npmjs.org/karma-jasmine
npm http 200 https://registry.npmjs.org/karma-jasmine
karma-jasmine@0.1.5 node_modules/karma-jasmine
```
karma-jasmineがangularYeoman/node_modules配下にインストールできました。

##再実行
![オープン](http://f.cl.ly/items/1U2z073v2S0I2m0X2g3r/2014-03-27%2022.32.57.png)

```
To capture a browser open http://localhost:8080/
```
とか言ってます。

```karma.conf.js
browsers: ['Chrome'],
```
となっているので、とりあえずChromeひらいてみます。
↓ちなみに8080もこのファイルに指定してありますね。

```karma.conf.js
// web server port
port: 8080,
```

##Chromeでlocalhost:8080にアクセス
![オープン](http://f.cl.ly/items/3g2v0b2A0p47303T1444/2014-03-27%2022.38.19.png)

connectedしましたです。

これで、IntelliJに戻ってみて、もう一度Runしたりするのだけれど、一向にうまく動きません。

```
To capture a browser open http://localhost:8080/
```
が出たまま。いろいろ迷いました。あっちいったりこっちいったり。


##よくわからない解決策（腑に落ちない）
```karma.conf.js
//browsers: ['Chrome'],
```
ブラウザのところをコメントにして、再実行したら動きました。よくわかりません。
ブラウザはFireFoxとかSafariとかをConnectした状態であれば、すべてテストできました。

**実行されたところ**
![オープン](http://f.cl.ly/items/332L3X363c2t2g3u3U3y/2014-03-27_22_44_58.png)


**実行されたmain.js(Yeomanが自動生成したやつ）**

```main.js
'use strict';

describe('Controller: MainCtrl', function () {

  // load the controller's module
  beforeEach(module('angularYeomanApp'));

  var MainCtrl,
    scope;

  // Initialize the controller and a mock scope
  beforeEach(inject(function ($controller, $rootScope) {
    scope = $rootScope.$new();
    MainCtrl = $controller('MainCtrl', {
      $scope: scope
    });
  }));

  it('should attach a list of awesomeThings to the scope', function () {
    expect(scope.awesomeThings.length).toBe(3);
  });
});
```

##結論
解決策が腑に落ちませんが動きましたので、とりあえずよいです。分かる方おりましたらご教授いただければ幸いです。
[Rails] params

http://guides.rubyonrails.org/action_controller_overview.html#parameters

```
You will probably want to access data sent in by the user or other parameters in your controller actions. 
...
Rails does not make any distinction between query string parameters and POST parameters, and both are available in the params hash in your controller:
```

paramsはhashににており、controllerで使用する。

```
To send a hash you include the key name inside the brackets:
```

```html
<form accept-charset="UTF-8" action="/clients" method="post">
  <input type="text" name="client[name]" value="Acme" />
  <input type="text" name="client[phone]" value="12345" />
  <input type="text" name="client[address][postcode]" value="12345" />
  <input type="text" name="client[address][city]" value="Carrot City" />
</form>
```

```
When this form is submitted, the value of params[:client] will be { "name" => "Acme", "phone" => "12345", "address" => { "postcode" => "12345", "city" => "Carrot City" } }. Note the nested hash in params[:client][:address].

Note that the params hash is actually an instance of ActiveSupport::HashWithIndifferentAccess, which acts like a hash but lets you use symbols and strings interchangeably as keys.
```

このようにnestしたhashをつくれる。また実態は`ActiveSupport::HashWithIndifferentAccess`。

```
4.3 Routing Parameters
The params hash will always contain the :controller and :action keys, but you should use the methods controller_name and action_name instead to access these values. Any other parameters defined by the routing, such as :id will also be available. As an example, consider a listing of clients where the list can show either active or inactive clients. We can add a route which captures the :status parameter in a "pretty" URL:
```

```
get '/clients/:status' => 'clients#index', foo: 'bar'
```

```
In this case, when a user opens the URL /clients/active, params[:status] will be set to "active". When this route is used, params[:foo] will also be set to "bar" just like it was passed in the query string. In the same way params[:action] will contain "index".
```

`params[:controller]`と`params[:action]`が利用できるけど、`controller_name`と`action_name`を使用するほうがよい。

また`:status`のように`route`でparamsを設定することもできる。
Eclipseのプロパティエディタの設定ファイルの場所

Eclipse4.3でダーク系のテーマを使ってるとプロパティエディタのシンタックスハイライトが見辛くなりがち。
一回設定しても、ワークスペースが新しくなるとプロパティエディタの設定もイチから。
そんなのが嫌なので探しました。
設定を使いまわしたい場合は、以下のファイル移動してあげれば元のシンタックスハイライトの設定が使えるようになる。

* "ワークスペースの場所"/.metadata/.plugins/org.eclipse.core.runtime/.setting/jp.gr.java_conf.ussiy.app.propedit.prefs
【Unity】MMDモデルを使ってボールを蹴って物体を壊すゲームを作ろう！その２【基礎】

## 目次
【Unity】MMDモデルを使ってボールを蹴って物体を壊すゲームを作ろう！
[その１](http://qiita.com/kuuki_yomenaio/items/07a3214eb518c21a10b1)
[その２](http://qiita.com/kuuki_yomenaio/items/0b0cac2846a4ffef514d)
[その３](http://qiita.com/kuuki_yomenaio/items/f9be3083afc19fb0f86c)
[その４](http://qiita.com/kuuki_yomenaio/items/33cc2d234f3394bd0eab)
[その５](http://qiita.com/kuuki_yomenaio/items/95f54a7404d71c80cbaf)
[その６(完結)](http://qiita.com/kuuki_yomenaio/items/03ed5212de0a93f0de13)

## MMDモデルにモーションを付けよう
###モーションのインストール
[その２](http://qiita.com/kuuki_yomenaio/items/0b0cac2846a4ffef514d)の続きになります。
モーションはAssetStoreにあるUnity製のものをお借りしようと思います。
Window→Asset Storeを開きます。左上の検索窓にLocomotionを入力します。
Mechanim Locomotion Start Kitをimportします。

![スクリーンショット 2014-03-27 21.29.35.png](https://qiita-image-store.s3.amazonaws.com/0/26453/6b8a49b2-ac99-6704-c541-b5497082e658.png)


importが完了するとAssets内にlocomotionフォルダが出来ています。

![スクリーンショット 2014-03-27 21.30.29.png](https://qiita-image-store.s3.amazonaws.com/0/26453/5a10e1f3-8c1a-f25c-b702-2d4bfc1a16c5.png)

### Animatorの作成
こっからがややこしく、つまづきやすい所だと思います。
ゲームのキャラでしたら、立ち止まっている時は足を止め、
動く時は歩き出し、さらに速度を上げると走りだすというのが自然だと思います。

3Dモデルにそのようなアニメーションを付けるためにanimatorを作成します。
create→Animator Controllerを選択しanimatorファイルを作成します。
名前はAnimatorSetupとしました。

![スクリーンショット 2014-03-27 21.34.48.png](https://qiita-image-store.s3.amazonaws.com/0/26453/fb64598f-e959-e47f-5e18-b82ceca0ef31.png)
![スクリーンショット 2014-03-27 21.34.59.png](https://qiita-image-store.s3.amazonaws.com/0/26453/67ab4d05-401e-af6f-6c4d-6af693e9045a.png)

#### 待機アニメーションを作成

ダブルクリックしてAnimatorSetupを開きます。

![スクリーンショット 2014-03-27 21.36.17.png](https://qiita-image-store.s3.amazonaws.com/0/26453/2839acd7-4917-4b93-915f-4537767bde9e.png)

Any Stateというものが鎮座していますが、それはほっておいて、
右クリック→create state→emptyを選択し、New stateを作成します。

![スクリーンショット 2014-03-27 21.36.45.png](https://qiita-image-store.s3.amazonaws.com/0/26453/06c4c136-839a-b114-1a03-ba9792944ea0.png)

new stateを選択し、名前をIdleにし、Motionにもidleを選択しましょう。
（ここで選択したMotionのidleはLocomotionで用意されたidleです。)

![スクリーンショット 2014-03-27 21.37.34.png](https://qiita-image-store.s3.amazonaws.com/0/26453/a315333a-d8f4-4e50-7c86-b9a80f3cc6c1.png)
![スクリーンショット 2014-03-27 21.37.46.png](https://qiita-image-store.s3.amazonaws.com/0/26453/3d641b4a-ba51-c202-3ded-619b9ef5ab60.png)


stateのidleをダブルクリックしましょう。するとpreview画面を含んだ画面が表示されます。
再生ボタンを押下するとidleアニメーションをするキャラクターを見ることが出来ます。
そこにその１で作成した権太君をD&Dしてみましょう。
キャラクターが謎のオッサンから権太に変わり、再生ボタンを押すと権太君がアニメーションするのが見れると思います。

![スクリーンショット 2014-03-27 21.39.08.png](https://qiita-image-store.s3.amazonaws.com/0/26453/f738eebc-4547-4e3c-0e5f-e6df7d8da77a.png)

これで待機アニメーションが完成です。

## その３につづく
キリが少し悪いのですが、またここで分割させてください。
[その３](http://qiita.com/kuuki_yomenaio/items/f9be3083afc19fb0f86c)では行動アニメーションを作っていきます。
【Unity】MMDモデルを使ってボールを蹴って物体を壊すゲームを作ろう！その１【基礎】

## 目次
【Unity】MMDモデルを使ってボールを蹴って物体を壊すゲームを作ろう！
[その１](http://qiita.com/kuuki_yomenaio/items/07a3214eb518c21a10b1)
[その２](http://qiita.com/kuuki_yomenaio/items/0b0cac2846a4ffef514d)
[その３](http://qiita.com/kuuki_yomenaio/items/f9be3083afc19fb0f86c)
[その４](http://qiita.com/kuuki_yomenaio/items/33cc2d234f3394bd0eab)
[その５](http://qiita.com/kuuki_yomenaio/items/95f54a7404d71c80cbaf)
[その６(完結)](http://qiita.com/kuuki_yomenaio/items/03ed5212de0a93f0de13)

## はじめに

[Unity](http://japan.unity3d.com/)は楽しいですね！
自分の投稿はcocos2dxが多いですが、
実は最近もっぱらunityです。
この投稿ではunityを利用して以下のような簡単なゲームを作りたいと思います。
「MMDの3Dモデルを利用して、ボールを飛ばし、物体を破壊するゲーム」
書くことより画面を実際に画像で見せながら説明しないと分かりにくいので、
長く見えますが、実際に手を動かすのはかなり少ないです。
余りに長くなりそうでしたらいくつかに分割します。

今回使用したものは
Unity 4.3.4f1
MMD4Mecanim_Alpha_20140227
になります。

では、早速やっていきましょう。

## MMDモデルをunity上に追加する
MMDモデルをunityに追加するためには
[MMD4Mechanim](http://stereoarts.jp/)を使うのがとっても便利で簡単ですので、こちらを利用します。
新規プロジェクトを作成し、MMD4Mecanim.unitypackageを実行します。

![スクリーンショット 2014-03-27 20.54.36.png](https://qiita-image-store.s3.amazonaws.com/0/26453/1e1efb70-e0ce-4c82-583c-2f1aa40dc530.png)

するとimport画面が出ますので、importを行います。

![screentshot2.png](https://qiita-image-store.s3.amazonaws.com/0/26453/8bdbd7ee-7223-5416-cad4-ff2d6282ecb6.png)

しばらく時間がかかりますので、ちょっと待機です。
インストールが完了しますと、MMD4Mecanimフォルダとpluginフォルダがunityプロジェクト内に生成されます。

![スクリーンショット 2014-03-27 20.59.33.png](https://qiita-image-store.s3.amazonaws.com/0/26453/4ea325be-1665-ee41-8d3b-e32276377c09.png)

## MMDモデルをunityに追加
今回はVPVP wikiにありました、[権太君](http://www6.atwiki.jp/vpvpwiki/pages/372.html#id_a4ed47ec)を利用します。
（このように配布されているMMDモデルを利用する際は必ずreadme.txtを一読するようにしましょう）
解凍後、名前をgontaに変えていますが、必須ではありません。
フォルダごとprojectビュー内に入れるとgonta.MMD4Mecanimが自動的に出来上がります。

![screentshot3.png](https://qiita-image-store.s3.amazonaws.com/0/26453/171df21b-7fcc-4557-4fbc-2728d90a2f12.png)

それを選択して、InstpectorからProcessを押下します。

![screenshot5.png](https://qiita-image-store.s3.amazonaws.com/0/26453/5caaf4d6-b292-56ac-1db2-e03705d94553.png)

すると3Dモデルが変換され、Unity上に表示されます。

![スクリーンショット 2014-03-27 21.00.33.png](https://qiita-image-store.s3.amazonaws.com/0/26453/448772f4-0683-50c9-b9d1-5f3e6160ff15.png)

## 取り込んだUnityモデルにMecanimを設定する
モデルによっては取り込んだ状態そのままでも使用出来るかもしれませんが、ちゃんとUnityのAnimationを設定出来るようにモデルを調整します。

生成したgontaファイルを選択し、Inspectorにある、rigタブを押下し、Animation TypeをHumanoidにした後、Configureを押下します。

![スクリーンショット 2014-03-27 21.01.54.png](https://qiita-image-store.s3.amazonaws.com/0/26453/976af455-951b-b2b0-49aa-e43b667dffd6.png)

するとここでSceneの保存を聞かれますが、そのまま名前を付けて保存します。
その後、Applyを押下。すると、

![スクリーンショット 2014-03-27 21.04.40.png](https://qiita-image-store.s3.amazonaws.com/0/26453/a61cd3ac-5b5b-76fa-6d0d-ac86bf7f2249.png)

このようなボーン情報が表示されます。ここで細かい設定なども可能なのですが、今回はそのままInspectorにあるDoneボタンを押下してください。

これで、MMDをUnity上で使用する準備完了です。

## その２に続く

長くなってしまったので、その２に続きます！
[その２](http://qiita.com/kuuki_yomenaio/items/0b0cac2846a4ffef514d)では取り込んだMMDモデルにモーションを付けます。
コードレビューしようぜ


###前提
* ある特定のソースコードに、責任がある、もしくは楽しみながらコミットできる状態
* それがgitで管理されていて、できればリモートリポジトリにプッシュ、メンバーが自由にプルできる
* __プルリクも良いけど、隣の席で働いているんだし、もっと手軽に声かければ良いんじゃない？ ペアプロっぽくコミュニケーションした方が、実は捗るよね、という方へ__

###手順
* レビューしてもらいたい状態にしたブランチをプッシュ
* コミュニケーションに使っているメッセージに「一緒にレビューおねがいしまつ」と書いて、反応を待つ
* レビューお願いしている人から返信が来たら、その人のマシンでブランチをチェックアウト/プルしてもらい、
__おもむろに下記をタイプ!__

```
git diff origin/master..HEAD
```

###解説
* git diff の後に 差分を知りたいコミット状態のものを二つ `..`でつなげてタイプすると、差分が表示されます。
* origin/masterが作業ブランチで無い場合は、適宜比較したい（まっとうな）ブランチを指定してあげてください。
bashで複数行コメントアウトする方法


# 概要

bashで複数行コメントアウトするときに
全部の行の頭に「#」を入力してたのは…私です。

bashで複数行コメントアウトするにはどうしたらいいの？

# `:` と `<<` を組み合わせればできる！ 

```tex:bash
: <<'#__CO__'
aaa
bbb
ccc
ddd
#__CO__
```


## `:` (何もしない、戻り値も0)
while true 
も以下のように表せる

```tex:bash
while :
do
  echo "何かしらの処理"
done
```


## `<<` （ヒアドキュメント）

`<<` の後に続く文字列が入力されるまでの入力を
まとめて標準入力としてコマンドに渡すことができる

```
$ cat << __EOF__
> aaa
> bbb
> ccc
> ddd
> __EOF
> ___
> __EOF__
```

と入力すると

```
aaa
bbb
ccc
ddd
__EOF
___
```

と返って来る。

//20140328追記

# `:`  なしでもコメントアウトできる！

```tex:
<< "#__CO__"
aaa
bbb
ccc
ddd
#__CO__

```


# `:` あり？なし？ `<< "#__CO__"`？ `<< "__CO__"`？

サンプル作ってbash -x してみる

## サンプル

### `:`あり、`#`あり
```tex:colon_on_sharp_on.sh
#!/bin/bash
# : あり
# #__CO__

: << "#__CO__"
date
DATE=`date +%Y%m%da && date`
echo $DATE
aaa
#__CO__
```

### `:`あり、`#`なし

```tex:
#!/bin/bash
# : あり
# __CO__

: << __CO__
date
DATE=`date +%Y%m%d && date`
echo $DATE
aaa
__CO__
```

### `:`なし、`#`あり

```tex:colon_off_sharp_on.sh
#!/bin/bash
# : なし
# #__CO__

<< "#__CO__"
date
DATE=`date +%Y%m%d && date`
echo $DATE
aaa
#__CO__

```

### `:`なし、`#`なし

```tex:
#!/bin/bash
# : なし
# __CO__

<< __CO__
date
DATE=`date +%Y%m%d && date`
echo $DATE
aaa
__CO__
```


# 結果

## `:`あり、`#`あり

```tex:「何もしない」を『実行』する
$ $ bash -x colon_on_sharp_on.sh 
+ :
$
```

## `:`あり、`#`なし

```tex:「何もしない」を『実行』するうえ、コメントアウトしたはずの行もデバッグに表示される
$ bash -x colon_on_sharp_off.sh 
+ :
++ date +%Y%m%d
++ date
$
```

## `:`なし、`#`あり

```tex:全く何も出ない！
$ bash -x colon_off_sharp_on.sh 
$
```

## `:`なし、`#`なし

```tex:コメントアウトしたはずの行もデバッグに表示される
$ bash -x colon_off_sharp_off.sh 
++ date +%Y%m%d
++ date
$
```


# まとめ

* `:`
	* （デバッグ時も含めて）明示的に「何もしない」を通った確認をするなら 「: 有り」
	* 本当になにもしないで！ってひとは 「:無し」
* `#`
	* 必要。
	* 付けないと、コメントアウトしたつもりがシェルは中身を解析（？）している



コメントアウト、って意味では、`:`無し、でいいかも。
standardControllerとrecordSetVar

standardControllerで指定したオブジェクトのリストを表示したいときはrecordSetVarで指定すればOK。
デモページとか作るときに便利。

```Visualforce:AccountList.page
<apex:page standardController="Account" recordSetVar="accounts" id="page">
    
    <div id="vf-page">
        <apex:form id="form">
            <apex:pageBlock id="block">
                <apex:pageBlockSection columns="1" id="blockSection">
                    <apex:pageBlockTable value="{!accounts}" var="item" id="blockTable">
                        <apex:column headerValue="{!$ObjectType.Account.Fields.Name.Label}">
                            <apex:outputField value="{!item.Name}" />
                        </apex:column>
                    </apex:pageBlockTable>
                </apex:pageBlockSection>
            </apex:pageBlock>
        </apex:form>
    </div>
</apex:page>
```
フラットデザインのアプリアイコンをさくっと作る方法

## 答え
<img src="https://qiita-image-store.s3.amazonaws.com/0/25168/d0f52513-9d92-6faa-463e-ecdf3e5243c6.jpeg" width=400>

http://iconion.com/
を使う。




このアプリケーション(Win/Mac対応)を使うだけで簡単にフラットなアプリアイコンが作れちゃいます。
色や影、形のカスタマイズも簡単でサクッと自分好みのものが作れます。

説明は英語で書かれてますが、直感的に扱えるので特に困ることはないと思います。
 * http://websae.net/iconicon-20140319/
 * http://www.moongift.jp/2014/03/iconion-素敵なアイコン画像が簡単に作れちゃう！/
どうしても日本語で使い方を知りたいという方はこの辺りを参考に。

## カスタムの画像を使う
このツールの紹介だけだとつまらないのでちょっとしたHackを。
アイコンの画像として利用できるのは、左側にある画像リストにあるのが全てで、
他から画像をインポートしたりすることが出来ないようになってます。
(試しに画像をドロップしてみたら変なことになりました。)

でもどうせなら自分で作った画像を使えたら便利ですよね。
デフォルトの画像だと、他人のものと似通ってしまう可能性もありますし、
なによりアプリの雰囲気にピッタリ合う画像がある保証もありません。

そこで
｢白黒の画像を用意して、それをこのiconionでアイコンっぽくする｣
ことができれば納得のいくアイコンが自分で作れるようになりそうです。
白黒の画像くらいならデザイナさんじゃなくても頑張って用意できそうですし。

### iconionに画像を取り込む
公式ドキュメントには記載されてませんでしたが(多分)
いろいろいじってみた所任意の画像を取り込む方法を見つけました。
手順としては
1. 画像をフォントにする
2. フォントを設置する
3. 設定ファイルを作る
4. iconionを開く
5. 左側に取り込まれてるのでこれを使ってアイコンを作る
といった感じです。

#### 1.画像をフォントにする 
iconionに取り込む一番の肝がこの画像をフォントにする作業です。
iconionの画面の左に並んでいる画像の一覧は全部フリーフォントからできています。
なので、自作の画像を入れるにはまず自作のフォントを作る必要があります。

http://www.egashira.jp/2013/05/generate-font-from-image
画像からttfの作り方はこちらを参照。
(フォントについて詳しくないのでもっと便利なやり方があれば教えて下さい。)
面倒だったらフリーのttfフォントを探して使ったりとか。

#### 2.フォントを設置する
ここからiconionで使えるようHackしていきます。
まずiconionのインストールフォルダに移動します。
(Windowsなら```C:\Program Files (x86)\Iconion```)
ここに```fonts```といういかにもなフォルダが存在します。
作ったフォントをここにコピーすれば完了です。

#### 3.設定ファイルを作る
フォントを入れただけでは上手く動作してくれないので、
次にこのフォント用の設定ファイルを作成します。
```config/icons```というフォルダを開いてみると、
jsonファイルがいくつか入っているのが分かります。
実はこれがフォントを制御するための設定ファイルです。
適当に既存のjsonをコピーして、新規に別名でファイルを作ります。
(ファイル名はなんでも良さそうです)
そして使いたいフォント向けに設定ファイルを書き換えてあげます。

```
{
  "author"  : "by Stephen Hutchings",   
  "link"  : "http://typicons.com/",
  "font"  : "StampFont.ttf",
  "name"  : "Stamp",
  "templates" : "0x61-0x7a"
}
```
みたいになっているので、

```
  "author"  → てきとうに,
  "link"  → てきとうに,
  "font"  → fontsにいれたフォント名,
  "name"  → てきとうに,
  "templates" → 自作文字の入っている文字コードの範囲
```
利用したいように書き換えてあげます。
注意が必要なのはtemplatesくらいですね。
｢a｣｢b｣｢c｣の文字に自作フォントを割り当てた場合は
｢0x61-0x63｣のように指定してあげます。

#### 4. iconionを開く
以上で準備が完了したので、iconionを起動してみましょう。
設定が上手く行ってれば左側のメニューの枠が増えて、
自作の画像が表示されているはずです。

これで心置きなく自分好みのアイコンが作れますね。
俺がLaravel 4でユニットテストするときのTestCaseクラス

自分がLaravel 4でユニットテストするときのTestCaseクラス。

## ソースコード

```php:app/tests/TestCase.php
namespace App\Tests;

use Artisan;
use DB;
use Mockery as m;

class TestCase extends \Illuminate\Foundation\Testing\TestCase
{
    /**
     * データベースの利用フラグ
     */
    protected $useDatabase = true;

    /**
     * Creates the application.
     *
     * @return Symfony\Component\HttpKernel\HttpKernelInterface
     */
    public function createApplication()
    {
        $unitTesting = true;

        $testEnvironment = 'testing';

        return require __DIR__.'/../../bootstrap/start.php';
    }

    public function setUp()
    {
        parent::setUp();

        // データベースの初期処理
        if ($this->useDatabase) {
            $this->setUpDb();
        }
    }

    public function tearDown()
    {
        parent::tearDown();

        // Mockeryコンテナのクリーンアップ
        m::close();

        // データベースの終期処理
        if ($this->useDatabase) {
            $this->tearDownDb();
        }
    }

    protected function setUpDb()
    {
        // テーブル作成、テストデータ登録
        Artisan::call('migrate');
        Artisan::call('db:seed');
    }

    protected function tearDownDb()
    {
        // テーブル削除
        Artisan::call('migrate:reset');

        // データベースから切断
        DB::disconnect();
    }
}
```

## 説明

+ [このサイト](http://kore1server.com/202/Mockery+0.8.0+%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88)を参考にMockeryを統合。
+ テストコードにも名前空間を切る。
+ `setUp()`でマイグレーションとシードを実行してテストデータをデータベースに投入する。
+ `tearDown()`で全部のテーブルを削除してデータベースから切断する。`DB::disconnect()`しないと「Too many connections」エラーで怒られる（MySQL + Eloquentの場合。他は不明）。
+ テスト時間を少しでも短縮したいので、データベースを使わないテストでは`$useDatabase`を`false`にしてマイグレーションとシードの実行をスキップする。
SSL契約いらず iOS7.1 AdHoc Dropboxからインストール

iOS7.1からAdHocでアプリを端末にインストールしたい場合、httpsが使えるサーバが必要になってしまいました。
このためにお金を払って証明書を取得するのもいやなので、方法を考えてみたところ、Dropboxに置いてインストールが出来ました。

Dropboxに最初からある（とおもわれる）フォルダ「Public」に下記を保存します。

・xxx.ipa
・xxx.plist
・index.html


index.htmlの中身はこちら
https:〜のところは、Publicフォルダのxxx.plistを選択すると、
「公開リンクのコピー」というボタンが出るので、そこからコピー。
htmlタグは適当です。
```lang:filename
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <center>
            <a href="itms-services://?action=download-manifest&url=https://dl.dropboxusercontent.com/u/xxx/xxx.plist">ダウンロード</a>
        </center>
    </body>
</html>
```

index.htmlの公開リンクにiOS端末からアクセスして、「インストール」リンクをクリックすればインストールできるはずです。


※追記
現在は新規でアカウントを開設すると、「Public」フォルダが無くなっているようです。
下記のサイトに復活させる方法がありましたので、お試しください。
http://www.jagaimopotato.com/blog/webservice/dropbox-publicfolder-recover-102.html
WebでOculus Riftを使用するためのライブラリやツール

Oculus RiftをWebでも使えるようにしたライブラリやツールなどがいくつか作成されていますので紹介及び問題点をあげます。

トラッキング情報を取得するプラグインやツール
===

[vr.js](https://github.com/benvanik/vr.js/tree/master)
---
多分、一番有名だと思います。
このライブラリはWindowsではChromeとFirefox、Macの場合はChromeとFirefoxに加えSafariの拡張機能またはプラグインで提供されています。
####問題点
vr.jsの拡張機能はNPAPIを使用して作成されており、ChromeやFirefoxはNPAPIの拡張機能のサポートを段階的に廃止し始めています(PPAPIを使用したプラグインのみサポートされます)。
また、Chromeはデベロッパーモードでのインストールも事実上廃止されます。一応、デベロッパーモードでインストールして実行することはできますが、Chromeを起動するたびに警告のポップアップが表示されます。
(個人的に)一番理想的な実装方法なのですが、使用できなくなるのが悔やまれます。

[oculus-bridge](https://github.com/Instrument/oculus-bridge)
---
ローカルでWebSocketサーバーを起動して、WebSocket経由でトラッキング情報を取得するツールです。
データはクォータニオン(傾き)とアクセラレーション(加速度)情報がJSON形式で送られてきます。
####問題点
vr.jsのようなブラウザーの拡張機能として提供されていないため、ブラウザーの拡張機能にかかわる問題にあたることはないですが、実行ファイルを実行するという手間が加わります。
また、私の環境だけかもしれませんが、メインディスプレイの解像度でOculus Riftの接続を判断しているのかディスプレイを拡張表示で行っている場合うまくOculus Riftを認識してくれませんでした。

[Webrift](http://wwwtyro.github.io/webrift/)
---
これも、oculus-bridgeと同様に、WebSocketでトラッキング情報を取得するツールです。oculus-bridgeの場合はOculus Rift(ディスプレイ)の接続もチェックしていますが、WebriftはOculus Rift(ディスプレイ)の接続はチェックしていません。データはクォータニオンのx,y,z,wの値が","区切りで文字列化したものが送られてきます。(例："1.0,1.0,1.0,1.0")
####問題点
oculus-bridgeと同じく実行ファイルの実行する手間が加わります。

[oculus-rest](https://github.com/possan/oculus-rest)
---
oculus-bridgeやWebriftはWebSocketでトラッキング情報を取得するのに対し、oculus-restはREST(xhr)でトラッキング情報を取得します。
WebSocketを実装していないブラウザーでも使用することができます。データはJSON形式で、クォータニオンとオイラー角のデータが送信されます。
####問題点
oculus-bridgeやWebriftと同じく実行ファイルの実行する手間が加わります。
HTTPプロトコルなのでリクエストが必要となり、さらにWebSocketよりデータ量が多くなります。
##トラッキング情報の使用方法
トラッキング情報はどのツールにおいてもクォータニオンで情報が送られてきますので
(送られてくるクォータニオンデータをtrackとし、three.jsで説明すると)
カメラを動かす場合は

```js
camera.quaternion.set(track.x, track.y, track.z, track.w);// またはx,y,z,wそれぞれ符号反転したもの
```

カメラを動かさずメッシュを動かす場合は、

```js
camera.quaternion.set(track.x, track.y, track.z, -track.w);// 同上
```

などの実装をすればOculus Riftの動きに合わせて動くようになります。
なお、three.jsには[OculusControls.js](https://github.com/mrdoob/three.js/blob/b7279adc60d366ff33a3e662576f349720139820/examples/js/controls/OculusControls.js)というコントロールも実装されており、ソースを見るとoculus-restを使用したものとなっています。


エフェクトライブラリ
===
[OculusRiftEffect.js](https://github.com/mrdoob/three.js/blob/b7279adc60d366ff33a3e662576f349720139820/examples/js/effects/OculusRiftEffect.js) (これしか知らない)
---
three.jsに含まれている樽型歪み(Barrel Distortion)エフェクトをかけてくれるライブラリです。歪みをフラグメントシェーダーで行っています。

[RiftThree](https://github.com/carstenschwede/RiftThree)
---
サイドバイサイドやトップアンドボトム等の3DメディアソースにOculusRiftEffect.jsを使ってエフェクトをかけてくれるライブラリです。奥行(Deps Map)も使用することができます。
また、メディアをテクスチャーとして貼り付けるのですが、貼り付けるジオメトリの形状をPlane(板)とShere(球)から選ぶこともできます。
##OculusRiftEffect.jsの使用方法
シンプルな使用方法として、OculusRiftEffect.jsをロードすると、THREE名前空間にOculusRiftEffectが追加されますので、

```js
var effect;
effect = new THREE.OculusRiftEffect(renderer, {scale:1.0});
--
function animate(){
  requestAnimationFrame(animate);
  --
  effect.render(renderer,camera);
}
```

といった実装をすれば歪みエフェクトがかかった描画が行えます。
ブログにキャプチャを載せるのっていいんだっけ？

スマホアプリ作りながら技術ブログとか持っていると、
スクリーンショットを取って説明したほうが分かりやすいことがおおいのですが、
スクリーンショットをブログに載せるのって著作権的にどうなんだろうと確認してみました。

結論：開発者に対しては優しい。スクリーンショットの利用はOKっぽい。

## Googleの場合

https://www.google.co.jp/permissions/

スクリーンショットの欄

## Appleの場合

https://www.apple.com/jp/legal/trademark/guidelinesfor3rdparties.html

上のページの最後の方に、Apple製品の描画って項目がある。
gemをupdateする時に確かめるべきこと


`bundle update`とかしてgemのバージョンが上がっていると、特にメジャーバージョンとか上がっちゃったりしてた場合、自分たちのテストが通ったとしてもちょっと大丈夫か不安ですよね？
そういう時により安心感を増すために必要なテクニックです。

## アップデートしたgemのGithubページに行く

基本的にはこれだけです。
`github <gem名>`や`gem <gem名>`でググってgemのGithubページに行きましょう。
rubygems.orgのページが先に見つかったらLinksのHomepageやSourceCodeをクリックすると、たどり着けるはずです。

ここですることは以下の3つです。

### 1. READMEの部分にUpdateに関しての記述がないか見てみる

GithubではREADME系のファイルがドキュメントとして表示されるようになっているので、そこでUpdateなどについての記述がないか探してみましょう。

例：

- https://github.com/sferik/twitter#whats-new-in-version-5
- https://github.com/mbleigh/acts-as-taggable-on#compatibility

### 2. Releasesを確認してどのくらい上がっているのかなどを見る

バージョンが少し上がってるのか大きく上がっているのかでもだいぶ安心感が違います。どのくらい上がったのかを確認しましょう。

githubページのサブヘッダーの右から3個目にrelesesというのがあるのでそこをクリックします。

![subheader-github.png](https://qiita-image-store.s3.amazonaws.com/0/6664/efdc3f37-46f9-c6c2-7f23-7212bde09b8f.png "subheader-github.png")


たまに、どういうふうに上がったかの詳細まで書いてあることがある

例：https://github.com/lostisland/faraday/releases


### 3. バージョンが上がる前と後とのコードの変更を確認

エンジニアだったら最後はコードで確認したいですよね。
そういう場合は2.のreleasesのページで見たタグを以下のフォーマットで入れてURLを叩けばdiffが見れます。

```
https://github.com/<username>/<gemname>/compare/<tagname1>...<tagname2>
```


例：https://github.com/arsduo/koala/compare/v1.6.0...v1.9.0


見るべきポイントとしては、 README や CHANGELOG の変更を中心にファイルの変更をざっと見る他、もしテストが壊れたりしていてエラーがgem内部だった場合、このViewの中から検索すると原因がわかりやすいかと思います。
mb_convert_variables() が再帰参照を検知してくれない

# **概要**

間違いなくバグとすべき内容なので、 **[バグレポート](https://bugs.php.net/bug.php?id=66964)** 出しておきました。そのうち修正されると思います。

```php:再現可能なコード
<?php
$a[] = &$a;
mb_convert_variables('utf-8', 'auto', $a);
```

```text:実行結果の例
Fatal error:  Out of memory (allocated 542113792) (tried to allocate 541851648 bytes) in ... on line 3
```

# **なぜ気づいたか**

**[まとめて例外をスローする小技](http://qiita.com/mpyw/items/6bd99ff62571c02feaa1)** にて、毎回例外用の変数をNULL初期化するのが面倒なので、引数を参照渡しで受け取って自動的に初期化するようにしたコード。

```php

<?php
function e($msg, Exception &$previous = null) {
    return new Exception($msg, 0, $previous);
}
 
try {
    $e = e('A', $e);
    $e = e('B', $e);
    throw $e;
} catch (Exception $e) {
    mb_convert_variables('UTF-8', 'auto', $e);
    echo $e;
}
```

WindowsでMySQLなんかを動かしてるとこういったメッセージが `CP932` で返ってくるので、さすがにこれは `UTF-8` に変換する必要があると感じ、このコードを書いて気づいたところです。とりあえず **[mb_convert_variables](http://www.php.net/manual/ja/function.mb-convert-variables.php)** の代わりに **[mb_convert_encoding](http://www.php.net/manual/ja/function.mb-convert-encoding.php)** を使うようにして解決しました。
shell小ネタ集

これは同僚との会話をメモしたものです。

## Bashはどこでも使えるのか

ほとんど全てのUnix系にbashは入っているらしい。
スクリプトはとりあえずbashで書いておけばよさそう

## 補完はshellの仕様にあるのか

ない

## ファイル終端の改行

POSIX的にはテキストファイルの最後は改行コードが必須。
vimとかだと行末には必ず改行がはいるけどEclipseとかだと最後に空行を入れないといけなかったりする。

## 実行フラグ

実行フラグをつけておくと、ターミナルのコマンドとして実行でき、またPATHの中から探してくれる。
もし `$ bash my_script.sh` と実行してよいのであれば実行フラグを立てておく必要はない。 `. my_script.sh` の場合もフラグは不要

## bashrcが会社の設定と家の設定がごっちゃになって困る

bashrcから bashrc_localをロードすればいいよ

## Mac のPATHの設定

PATH の初期値は /etc/paths にある

## bashrcにinputrc的なことを書きたい

```text
"\C-P": history-search-backward
"\C-N": history-search-forward
```

は

```bash
bind '"\C-P": history-search-backward'
bind '"\C-N": history-search-forward'
```

のようだ

## Ctrl+Cした時にfinallyが動かない

Javaはそうらしい。
Rubyは動く
PowerShellはfinallyは動くけど、echoできなくなる

## SIGTERMとSIGINTはなぜ分けたのか、使い分けることはあるのか

「less で F を押すと tail -f っぽい動作になるんだが、 ^C (sigint) で中断できる」とのこと

## set -x した時のコマンドがわかりにくい

`PS4`変数を書き換える

## set -x を取り消す

```bash
set +x
```

なおバッチファイルで言う `@echo off` の`@`は無いらしい。

## zipコマンドでそのままのパスで圧縮されるのを避けたい

```bash
(cd target_dir && zip target_file)
```
子プロセスにすることで`cd`で戻ってこなくて良い

## ワイルドカードが展開されない

ワイルドカードは見つかれば展開されるけど、見つからないとそのまま

```bash
cp *.html *.js *css target_dir
```

ってやると .js がひとつもないときに "*.js"という名前が渡されるのが困る。
コピーに失敗するとリターンコードが0ではなくなるので。

findを使えばよい

```bash
find . -name '*.html' -o -name '*.js' -exec cp {} target_dir \;
```

## スクリプトのディレクトリがほしい

```bash
script_root=$(cd `dirname $0` && pwd)
```

## パラメタをファイルに書いておく

args.txtはスペース区切りではなく、改行区切りでも普通にうまくいく

```bash
$ cmd $(cat args.txt)
```
github素人が「GitHub実践入門」を読んでみた

# 概要
* 仕事でgithubを使うことになったので、「GitHub実践入門」を片手に勉強。
* SVNの使用経験はある

# GitHubの世界へ

* タコと猫みたいなマスコットの名前は「octocat」
* GitHubの最大の目玉はpull request
* タスク管理やバグ報告はIssueを使ってやりとりできる
* ユーザが文字入力するすべての機能はGitHub Flavored Markdown(GFM)で記述可能
* WatchするとNews Feedに情報が流れてくる
* リポジトリは無料で何個でも作成可能。しかしプライベートリポジトリは有料

## Pull Requestとは
* 自分のリポジトリにpushした変更や機能追加を他の人のリポジトリに取り込んでもらうための要求を出す機能
* 要求を受けた人は、変更内容を確認して取り込むか決める
* ソースの行単位でコメントを付けられる

## Organization
* 会社用アカウント
* アカウントや権限の管理を一括でできる

## Issue
* チケット的なもの
* バグや議論などをトラッキングして管理する
* ラベルを付けて整理できる
* 使い方の例
 * バグのレポート
 * 作者に質問
 * 今後のタスクを書き出す

# Gitについて
## 集中型(SVN)と分散型(Git)の違い

|項目|集中型|分散型|
|-----|-----|------|
|リポジトリ|サーバに一つ|ユーザのローカル＆サーバ|
|コミット|サーバが止まるとコミットできない|ローカルでコミット可能|
|メリット|シンプルな作り|いつでも好きに作業可能|
|デメリット|サーバに依存|どこが最新か分からなくなる|

* これからは圧倒的に分散型が流行るでしょ
* リポジトリが分散しているという考え方を身につければ難しくない
* ただ分散型は運用ルールを事前に決めておく必要がある

# インストール

* Macは最初からgitをサポートしている
* Windowsは[msysGit](http://msysgit.github.io/)を使うのが手軽

### 改行コードの扱い
* GitHubで公開されている大半はLF(Mac,Linux)
* WindowsはCRLFなので、Gitで自動変換してくれるようにすること
 * 「Checkout Windows-style Unix-style line endings」をチェック

# GitHub導入

## GitHubアカウント作成
https://github.com/join
 
## リポジトリの作成

## 基本的な使い方
* プロジェクトのリポジトリをcloneでローカルPCに持ってくる
* 編集してコミット(この段階ではまだローカルだけに反映)
* 問題なければpushで、githubへ反映される
* 他の人が編集したらpullで変更をローカルに反映

## branch
* カレントbranch確認

```
$ git branch
* master
```

* branch作成

```
$ git chekout -b test_branch
$ git branch
  master
* test_branch 
```
```
// checkout -bは↓のコマンドと同じ
$ git branch test
$ git checkout test
```

* branch移動

```
$ git checkout test
```

## remoteリポジトリ
* remoteリポジトリ追加

```
$git remote add origin git@github.com:name/repo.git
```

* originがわからなくなった場合

```
$ git remote -v
```

今日はここまで
IEの互換モードを無視して標準モードで動かす

普段IE使わないから互換モードの設定によってCORSなAJAXが出来ない問題とかでハマった、のでメモ。


## 互換モードを無視して常に標準モードで表示されるようにする
```html:
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
```

このmetaタグを書いておけば互換モードで表示されるのを防げる。

## jQueryでクロスドメインなAJAXする場合の互換性対策
```html:
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.1/jquery.xdomainrequest.min.js"></script>
```

とかも入れておくとよい。

## あとスキーマ問題も

`$.getJSON("https://〜")` とかじゃなく `$.getJSON("//〜")` に変えておくとスキーマが違うエラーを回避できる。
FreeBSDにOh-my-zshを導入

FreeBSDでoh-my-zshを使う。

```
pkg install zsh curl
```

手動で構築してもいいが，構築スクリプトを使ったほうが手早い
```
curl -L http://install.ohmyz.sh | sh
```
コマンド実行後にインストール完了！みたいなメッセージが出る。


幾つか設定をしておく。

経験上rootのデフォルトシェルは変更しないほうがいい気がする。
すこし気持ち悪いけどデフォルトシェルのtcshを経由してzshを起動させた方がいい。.cshrcのファイル先頭に次を書き加える
```
exec zsh
```
他のユーザはchshでOK

標準インストールだとgrepのバージョンがoh-my-zshが要求するバージョンと適合しないのでgrepが使えない。それを変更する
~/.oh-my-zsh/lib/grep.zshの9行目にある
```
GREP_OPTIONS+="--exclude-dir=$PATTERN "
```
をコメントアウトする。

これで一応導入はできたはず。
Homebrewでパッケージ管理:Homebrewのインストール

#1.準備
####1)Javaのインストール確認
http://qiita.com/b4b4r07/items/6efebc2f3d1cbbd393fc#2-1

####2)Xcode:Command Line Tools のインストール確認
http://qiita.com/b4b4r07/items/6efebc2f3d1cbbd393fc#2-2



#2.Homebrewインストール

```
ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"
```


#3.インストール

```
ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"
```

#4.動作チェック
```
brew doctor
```

#5.問題１　
Warning: Unbrewed dylibs were found in /usr/local/lib.
Warning: Unbrewed .pc files were found in /usr/local/lib/pkgconfig.


```解決法_削除する
sudo rm /usr/local/lib/libmacfuse_i32.2.dylib
sudo rm /usr/local/lib/libmacfuse_i64.2.dylib
sudo rm /usr/local/lib/libosxfuse_i32.2.dylib
sudo rm /usr/local/lib/libosxfuse_i64.2.dylib
sudo rm /usr/local/lib/libosxfuse_i32.la
sudo rm /usr/local/lib/libosxfuse_i64.la
sudo rm /usr/local/lib/pkgconfig/osxfuse.pc
```

#6.問題2　
Warning: Broken symlinks were found. Remove them with `brew prune`:

```解決法_シンボリックリンクを貼り直す
brew prune
```

#7.Command Line Toolのエラー対応
ライセンス同意

```
sudo xcodebuild -license
```

#8.Homebrewのアップデート

```
brew update
```


#9.Homebrewのパッケージアップグレード

```
brew upgrade
```

######参考
http://qiita.com/b4b4r07/items/6efebc2f3d1cbbd393fc#1-1
ffmpeg を使って mp3tube みたいな動画を作る

手順

- 音声なしの静止画だけの動画（empty.avi）を作る
- 音源ファイルと empty.avi をくっつけて out.avi を作成
- empty.avi を削除

```text:
ffmpeg -f image2 -r 1 -loop_input -t 【音源ファイル再生時間】 -i 【画像ファイル】 empty.avi
ffmpeg -i empty.avi -i 【音源ファイル】 out.avi
rm empty.avi
```
実行例

```text:
ffmpeg -f image2 -r 1 -loop_input -t 00:04:35 -i img.png empty.avi
ffmpeg -i empty.avi -i sound.mp3 out.avi
rm empty.avi
```

【音源ファイル再生時間】は実際の再生時間+1秒しとくと尻切れがなくて吉。
静的配列の要素数を求めるマクロ


って標準（？）でどこかで定義されていないのでしょうかね？？
Windowsだと`stdlib.h`あたりに居た気がするのですが。

```objectivec:マクロ
#define _countof(a) (sizeof(a) / sizeof(a[0]))
```

↓こういう時に使いたくなりますよ・・・ね？

```objectivec:サンプル
	CGPoint points[] = {
        CGPointMake(1, 1),
        CGPointMake(2, 2),
        CGPointMake(3, 3),
        CGPointMake(4, 4),
        CGPointMake(5, 5),
    };
    CGContextAddLines(c, points, _countof(points));
```
Xcode, Android Studio の .gitignore

Xcode
```
*.xcodeproj/*
!*.xcodeproj/project.pbxproj
!*.xcworkspace/contents.xcworkspacedata
.DS_Store
```

Android Studio
```
*.apk
*.ap_
*.dex
*.class
bin/
gen/
local.properties
.classpath
.project
proguard/
*.iml
*.ipr
*.iws
.idea/workspace.xml
.idea/tasks.xml
.idea/libraries/
.gradle
app/build/
.DS_Store
```