OmniAICreator/Qiita-1.07M huggingface dataset:
THETAのDualfisheye動画をThree.jsで表示してみた

RICOH THETA SのDualfisheye動画(変換前の動画)をThree.jsで表示してみた。
計算とか教えてもらいながら自分なりに考えて実装したのでおかしいところがあるかもしれないが忘れないようにメモしておく(計算難しい)。

ソースコード：https://gist.github.com/mechamogera/5635338a1075baadba0b
動作サンプル：http://bl.ocks.org/mechamogera/5635338a1075baadba0b
(2016/01/25追記 コミットミスってソースコード & 動作サンプルぶっ壊してました、修復しました)

上のコードだとmp4動画を視聴しているが、WebRTCで取得したTHETAのライブストリーミング画像でもちゃんと表示できた。

----

2016/01/26追記
[THETA S のUSBライブストリーミングをブラウザで球面マップする - 自習室](http://izmiz.hateblo.jp/entry/2016/01/18/221652)でいろいろ改善していただいてました！
コミットミスってて申し訳ないですm(_ _)m

[THETA S で全天球映像を配信するまで(3) 映像を貼り付けて表示してみました](https://lab.infocom.co.jp/2016/01/theta-s-3.html)などの記事も出てきてありがたいですね。

----

# コード解説

## 概要

基本は[初心者でも絶対わかる、WebGLプログラミング＜three.js最初の一歩＞ | HTML5Experts.jp](https://html5experts.jp/yomotsu/5225/)を参照してThree.jsで実装。

構成は以下のようにしている。

* three.min.js：Three.jsのメイン処理を行う取得してきたファイル
* OrbitControls.js：Three.jsでマウスをグリグリするための取得してきたファイル
* index.html：Dualfisheye動画を見るために作成したHTML
* theta-view.js：Dualfisheye動画を見るために作成したJS
* m20.mp4：表示するためのDualfisheyeサンプル動画

球を作成してカメラを内部に配置してvideoタグをソースにした動画テクスチャをごにょごにょして貼り付けて表示している。

## テクスチャを貼る

theta-view.jsで以下の部分がUVを設定している部分。

```js
if (i < faceVertexUvs.length / 2) {
  var correction = (x == 0 && z == 0) ? 1 : (Math.acos(y) / Math.sqrt(x * x + z * z)) * (2 / Math.PI);
  uvs[ j ].x = x * (404 / 1920) * correction + (447 / 1920);
  uvs[ j ].y = z * (404 / 1080) * correction + (582 / 1080);
} else {
  var correction = ( x == 0 && z == 0) ? 1 : (Math.acos(-y) / Math.sqrt(x * x + z * z)) * (2 / Math.PI);
  uvs[ j ].x = -1 * x * (404 / 1920) * correction + (1460 / 1920);
  uvs[ j ].y = z * (404 / 1080) * correction + (582 / 1080);
}
```

404や447のマジックナンバーは以下のサイズに対応する。
ただし、正確に測ったりしていないのでざっくりとした値。

![Dualfisheyeの配置(1).png](https://qiita-image-store.s3.amazonaws.com/0/16768/8f0bba63-8720-3bb2-9825-491963635df3.png)

ベースとなるコードは以下の質問の回答にある[こちら](http://jsfiddle.net/zD2rH/5/)のコードを参考にしている。
[javascript - Mapping image onto a sphere in Three.js - Stack Overflow](http://stackoverflow.com/questions/21663923/mapping-image-onto-a-sphere-in-three-js)

```js
faceVertexUvs[ face ][ j ].x = face.vertexNormals[ j ].x * 0.5 + 0.5;
faceVertexUvs[ face ][ j ].y = face.vertexNormals[ j ].y * 0.5 + 0.5;
```

ただし、上のコードのままだと画像が歪む。

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/16768/01cf6d32-6fe9-ca9c-337f-bbe67cd78947.png)

そのため以下のように計算して補正している。

![補正計算(1).png](https://qiita-image-store.s3.amazonaws.com/0/16768/31336a6a-0544-e561-b445-2d188007ed68.png)
Deviseで招待(DeviseInvitable)

備忘録

## ■
```rb
gem 'devise',           '~> 3.5.2'
gem 'devise_invitable', '~> 1.5.2'
```
```rb
$ bundle install
```
## ■
```rb
$ rails g devise_invitable:install
  insert  config/initializers/devise.rb
  create  config/locales/devise_invitable.en.yml
```
```rb
$ rails g devise_invitable User
  insert  app/models/user.rb
  create  db/migrate/20160113012429_devise_invitable_add_to_users.rb
```
```rb
$ rake db:migrate
```
## ■修正
```rb
#修正
class User < ActiveRecord::Base
  devise :invitable, :invite_for => 2.weeks
end
```
```rb
#追加
class ApplicationController < ActionController::Base
  protected
  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:invite) << :username
    devise_parameter_sanitizer.for(:accept_invitation) << :username
  end
end
```
for(:invite) 招待メールを送る時
for(:accept_invitation) 招待メールからアカウント情報を登録する時

```rb
$ rails g devise_invitable:views
```
```rb
views/devise/invitations
<%= f.text_field :username %>
```
otto-devが失敗したときの対処法

# エラー内容

```
$ otto dev
==> Creating development environment layers...
    Otto uses layers to speed up building development environments.
    Each layer only needs to be built once. We've detected that the
    layers below aren't created yet. These will be built this time.
    Future development envirionments will use the cached versions
    to be much, much faster.
==> Creating layer: consul
Error building dev environment: Error building dev environment layers: Error executing Vagrant: exit status 1

The error messages from Vagrant are usually very informative.
Please read it carefully and fix any issues it mentions. If
the message isn't clear, please report this to the Otto project.

```

# 解決まで

vagrantコマンドを実行してみると、以下のようにエラーになった

```
$ vagrant
Vagrant experienced a version conflict with some installed plugins!
This usually happens if you recently upgraded Vagrant. As part of the
upgrade process, some existing plugins are no longer compatible with
this version of Vagrant. The recommended way to fix this is to remove
your existing plugins and reinstall them one-by-one. To remove all
plugins:

    rm -r ~/.vagrant.d/plugins.json ~/.vagrant.d/gems

Note if you have an alternate VAGRANT_HOME environmental variable
set, the folders above will be in that directory rather than your
user's home directory.

The error message is shown below:

Bundler could not find compatible versions for gem "timers":
  In Gemfile:
    vagrant-chef-zero (>= 0) ruby depends on
      ridley (>= 1.0.0) ruby depends on
        celluloid (~> 0.15) ruby depends on
          timers (~> 4.0.0) ruby
Could not find gem 'timers (~> 4.0.0) ruby', which is required by gem 'celluloid (~> 0.15) ruby', in any of the sources.
```

エラーの指示に従って、vagrantのディレクトリを削除する。

```
$ rm -r ~/.vagrant.d/plugins.json ~/.vagrant.d/gems
```

すると、vagrantが成功するようになった。

```
$ vagrant
Usage: vagrant [options] <command> [<args>]

    -v, --version                    Print the version and exit.
    -h, --help                       Print this help.

Common commands:
     box             manages boxes: installation, removal, etc.
     connect         connect to a remotely shared Vagrant environment
     destroy         stops and deletes all traces of the vagrant machine
     global-status   outputs status Vagrant environments for this user
...
```

最後に`otto dev`の実行

```
$ otto dev
==> Creating development environment layers...
    Otto uses layers to speed up building development environments.
    Each layer only needs to be built once. We've detected that the
    layers below aren't created yet. These will be built this time.
    Future development envirionments will use the cached versions
    to be much, much faster.
==> Creating layer: consul
...

```

OK!

# その他

### ottoコマンドのログを表示する方法

```
OTTO_LOG=1 otto dev
```
日本語データのエクセル から wordpressにインポートする際の留意点


Excel（エクセル）の表データをから wordpress に　インポートのする必要があったたえめ、「Really Simple CSV Importer」プラグインを使った。
https://wordpress.org/plugins/really-simple-csv-importer/


詳細についてもこちら日本語記事あり。
http://notnil-creative.com/blog/archives/3465


##インポートの際の留意点
エクセルから名前をつけて保存すると、文字コードが Shift-JIS、改行コードが CR になっていることがある。

改行コードは LF にしないとインポートができず、
文字コードは、UFT-8 にしないと文字化けする。

CotEditorなどで簡単に変更できる。
https://coteditor.com/
マウスオーバーするとキラーンと光るボタンを実装する


#  <i class="fa fa-pencil" aria-hidden="true"></i> 参考画像（gif）
ぜひ作ってみてください。
![btn.gif](https://qiita-image-store.s3.amazonaws.com/0/96220/a5889aff-4ad2-f8d2-b038-6e162ac34c7f.gif)

### <i class="fa fa-desktop" aria-hidden="true"></i> サンプル
https://jsfiddle.net/9Lof8z3o/1/

### <i class="fa fa-code" aria-hidden="true"></i> html
````
<div class="login_leave">
  <a href="#" class="btnLogin">プレミアム会員登録</a>
</div><!-- /.login_leave -->
````

### <i class="fa fa-code" aria-hidden="true"></i> css
````
/* ログインボタン */
.login_leave {
  // overflow: hidden;
}
.btnLogin {
  font-size: 14.4px;
  font-weight: normal;
  line-height: 36px;
  color: #fff;
  background: #000;
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
  position: relative;
  top: -5px;
  display: block;
  width: 300px;
  margin: auto;
  padding: 4px 10px;
  cursor: pointer;
  text-align: center;
  text-decoration: none;
  text-shadow: none;
  white-space: nowrap;
  border: none;
  border-radius: 3px;
  vertical-align: top;
  outline: none;
  transition: all .3s;

}
.btnLogin:hover {
  overflow: hidden;
  opacity: .8;
}

.btnLogin:after{
  visibility: hidden;
  position: absolute;
  left: -72px;
  top: 0;
  height: 100%;
  content: "";
  -ms-transform: skew(-45deg);
  -webkit-transform: skew(-45deg);
  transform: skew(-45deg);
  border-left: solid 30px rgba(255,255,255,0.2);
}

.btnLogin:hover:after {
  visibility: visible;
  left: 120%;
  -webkit-transition: left 200ms linear;
  transition: left 200ms linear;
}

````
pyramid URLを動的にする


## 1. 概要

* pyramidでurlを動的に作りたい場合の設定の書き方メモ。

参考(http://docs.pylonsproject.jp/projects/pyramid-doc-ja/en/latest/)

```txt
http://localhost/hoge?uid=1
```
みたいにするのがいけてないので

```txt
http://localhost/hoge/1
```
こうしたいときとかに使う。

## 2. 環境

* python 3.4.2
* pyramid 1.5.7

## 3. 実装

pcreateで作成したひな形から作った場合で\_\_init__.pyにルートを追加する際に、

```py
config.add_route('hoge','hoge/{uid}')
```

ってやるとルーティングできる。
view側で値を使いたい場合はリクエストパラメータには入ってこないので、

```py
uid = request.matchdict.get('uid')
```

ってやると使える。
macに余計なことをさせない設定をするコマンド

# 小さな親切 余計なお世話
osxには、普通に使う上では便利でも、場合によっては余計なお世話な機能が結構沢山備わっています。なのでそれらを停止させて、マシンに余計なことをさせたくない場合に重宝するコマンド群をこの記事では紹介していきます。

環境はosx 10.11 あたりを想定しています。

## 設定を閉じる

まずコマンドで設定をあれこれ変更する前には設定アプリを落としたほうが良いです。

```bash

killall System\ Preferences

```

## スクリーンセーバーを開始しないように

```bash

defaults -currentHost write com.apple.screensaver idleTime -int 0

```

## 通知センターを停止

```bash

launchctl unload -w /System/Library/LaunchAgents/com.apple.notificationcenterui.plist

```

## アプリクラッシュ時にレポートダイアログを出さないように

```bash

defaults write com.apple.CrashReporter DialogType none

```

## アプリクラッシュ後に、ウィンドウを復元しないように


```bash

sudo defaults write NSGlobalDomain NSQuitAlwaysKeepsWindows -boolean false

sudo rm -rf ~/Library/Saved\ Application\ State

```


## ソフトウェアアップデートを無効化


```bash

sudo softwareupdate --schedule off

```

## スリープを無効化

```bash

sudo pmset -a displaysleep 0
sudo pmset -a disksleep 0
sudo pmset -a sleep 0

```

## セキュリティとプライバシー > 一般 > ダウンロードしたアプリケーションの実行許可 で起動を妨げないように

```bash

sudo spctl --master-disable

```

## パワーナップを無効化

```bash

sudo pmset -a powernap 0

```

## タイムマシーンバックアップを無効化

```bash

sudo defaults write /Library/Preferences/com.apple.TimeMachine AutoBackup 0

sudo defaults write /Library/Preferences/com.apple.TimeMachine DoNotOfferNewDisksForBackup -bool YES

```

## Bluetoothでマウスとキーボードを自動で探しにいくのを無効化
マウス、キーボードが繋がっていないとダイアログが出てきたりする奴です

```bash

sudo defaults write /Library/Preferences/com.apple.Bluetooth.plist BluetoothAutoSeekKeyboard 0
sudo defaults write /Library/Preferences/com.apple.Bluetooth.plist BluetoothAutoSeekPointingDevice 0

```

## App Nap を無効化

```bash

sudo defaults write NSGlobalDomain NSAppSleepDisabled -bool YES

```

## 位置情報にもとづいてのタイムゾーン設定 を無効化

```bash

sudo defaults write /Library/Preferences/com.apple.timezone.auto Active -bool false

```

## タイムゾーンの設定

```bash

sudo systemsetup -settimezone Asia/Tokyo

```

## 停電後に自動的に再起動を有効化
ずーっと同じシステムを稼働させたい場合に便利です

```bash

sudo pmset autorestart 1

```

## スリープ解除/スクリーンセーバ解除にパスワードを要求 しないようにする

```bash

defaults write com.apple.screensaver askForPassword -bool false

```

## 隠しファイルを表示する

```bash

defaults write com.apple.finder AppleShowAllFiles -boolean true
killall Finder

```

## 音量を0にする

```bash

osascript -e \"set Volume 0\"

```

## plistによる設定を更新する
上のもろもろ変更した後にはやっておいたほうが良いでしょう

```bash

killall cfprefsd

```

# まとめ
こういう設定類はスクリプトなどで自動化して、重要な仕事に集中しましょう。
PythonのFabricで上記のコマンドを運用したりするのもおすすめです。
rubyでselenium-webdriverを使い画面キャプチャしメール送信

## インストール

```bash:
apt-get install -y build-essential ruby-dev
apt-get install -y openbox imagemagick firefox
gem install selenium-webdriver
gem install mail
```

## 要点

```rb:capture.rb
require 'selenium-webdriver'

driver = Selenium::WebDriver.for :firefox
driver.navigate.to 'http://google.co.jp'
driver.save_screenshot("img/google.png")
driver.quit
```

```bash:実行
ruby capture.rb
```

## cronでまわす


### seleniumで画面キャプチャ

```rb:capture.rb
require 'selenium-webdriver'

driver = Selenium::WebDriver.for :firefox

hash = {
  "google" => "http://google.co.jp",
  "yahoo" => "http://yahoo.co.jp",
}
hash.each{|title, url|
  driver.navigate.to url
  driver.save_screenshot("img/"+title+".png")
}

driver.quit
```


### メール送信処理

```rb:mailsend.rb
require "mail"

NOW=Time.now

mail = Mail.new do
  from    "batch@myserver.co.jp"
  to      "toaddr@myserver.co.jp"
  subject "selenium "+NOW.to_s
  #body    File.read("body.txt")
  body    ""
end

Dir.glob("/home/user1/bin/img/s-*.png") do |img|
  mail.add_file img
end

mail.delivery_method :smtp, {
  address:   'localhost',
  port:      587,
  domain:    'myserver.co.jp',
  enable_starttls_auto: false,
}

mail.deliver!
```

### メイン処理

```bash:capture.sh
#!/bin/sh
export DISPLAY=:1

xvfb_start() {
  pgrep Xvfb
  if [ $? -eq 1 ];then
    Xvfb $DISPLAY -screen 0 1280x1280x16 &
    sleep 5
    openbox &
  fi
}

resize() {
  convert -resize 640x -unsharp 2x1.4+0.5+0 -colors 65 -quality 75 -verbose \
     ${i} s-${i} 2>/dev/null
}

## xserver
xvfb_start

## selenium
rm -f img/s-*.png
ruby capture.rb

## resize
cd img
for i in *.png
do
  resize $i
done
cd ..

## mailsend
ruby capture-mailsend.rb
```

----

## 使い方

* `capture.sh`を実行すれば画面キャプチャしてメール送信される。

```bash:cronに登録方法
 4 12 * * * (cd ~/bin && sh capture.sh)
```

また、cronで`DISPLAY=:1`をセットするのも便利
DockerでCentOS上にRailsを立ち上げた時のコマンドメモ


使用するdocker imagesはこちら
https://hub.docker.com/r/takashioshikawa/ruby-native-2.2.4/

これで確認したい場合は
`docker pull takashioshikawa/ruby-native-2.2.4`
で落としておきましょう


<h2>Docker run</h2>

実行

```docker run --rm -it -v /Users/oshikawatakashi/various/ruby_project/:/usr/src/ruby_project/ -p 9000:80 --name testrails takashioshikawa/ruby-native-2.2.4```


ボリューム指定しているのは、コードはGitHubで管理したいので外部の編集を反映させるため
mysqlは外部コンテナにするつもりですが、今回リンク先は指定していません
docker内のrailsアプリは0.0.0.0:80で実行するので80番ポートを指定
Macからは`DockerVMのIP:9000`でアクセスするのを想定


<h2>立ち上げたコンテナ内でRailsアプリ作成</h2>

作業ディレクトリは/usr/src/ruby_project

MySQLを使う場合Railsコンテナにもインストールしておかないとrails newでエラーが出る
`yum install mysql-devel`

`bundle init`


Gemfile編集

```Gemfile
# A sample Gemfile
source "https://rubygems.org"
gem "rails", "4.2.5"
```

`bundle install`

Railsアプリ作成
`bundle exec rails new testrails -d mysql`

`cd testrails`
testrails内のGemfile

```Gemfile
source 'https://rubygems.org'


# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.2.5'
# Use mysql as the database for Active Record
gem 'mysql2', '>= 0.3.13', '< 0.5'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.1.0'
# See https://github.com/rails/execjs#readme for more supported runtimes
gem 'therubyracer', platforms: :ruby

# Use jquery as the JavaScript library
gem 'jquery-rails'
# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
gem 'turbolinks'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.0'
# bundle exec rake doc:rails generates the API under doc/api.
gem 'sdoc', '~> 0.4.0', group: :doc

# Use ActiveModel has_secure_password
# gem 'bcrypt', '~> 3.1.7'

# Use Unicorn as the app server
# gem 'unicorn'

# Use Capistrano for deployment
# gem 'capistrano-rails', group: :development

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug'
end

group :development do
  # Access an IRB console on exception pages or by using <%= console %> in views
  gem 'web-console', '~> 2.0'

  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
end
```

変更した点は
`gem 'therubyracer', platforms: :ruby`
がもともとコメントアウトされているのでコメントを外す

`bundle install`

Rails実行
`bundle exec rails s -b 0.0.0.0 -p 80`


これでMac側のブラウザに
`DockerVMのIP:9000`
を入力すれば入れるはず
MySQLが立ち上がってないのでエラーが出ると思いますが立ち上がったのだけ確認出来ればとりあえず…笑

以上です。
［覚書］Wordpress管理画面にカスタム投稿タイプのターム欄を追加

```functions.php
function add_custom_column($defaults){
	$defaults['makerscat'] = 'カテゴリー';
	return $defaults;
}
add_filter('manage_posts_columns','add_custom_column');

function add_custom_column_id($column_name,$id){
	if($column_name == 'makerscat'){
		echo get_the_term_list($id,'makerscat','',',');
	}
}
add_action('manage_posts_custom_column','add_custom_column_id',10,2);
```

makerscatの部分はカスタムタクソノミー名を入力。
'カテゴリー'が一覧の項目名になる。

>http://techmemo.biz/wordpress/add-custom-column-posts/
bindした関数は別のオブジェクトになる


このコードを見て「そりゃあそうだろ」と思う方は読む価値はございません。

```js
    var func = function(){};
    console.log(func === func);//true
    console.log(func.bind(this) === func.bind(this));//false
```
（とりあえずChromeのみで確認してます）

事の発端はReact+Flux+ES6でとあるアプリを開発中、下記のウォーニングに見舞われデバッグで手間取りました。

```
Warning: setState(...): Can only update a mounted or mounting component. This usually means you called setState() on an unmounted component. This is a no-op. Please check the code for the undefined component.
```

読んだ通りの内容で、マウントされていないComponentに`setState`を呼ぶと出るウォーニングですが、どこをどう見てもマウントしてるんですね。で、デバッガーやら`console.log`なんかを駆使して、やっと気づいたのですが、UnmountしたComponentのイベントが削除されていなかったのが原因でした。

問題のあるComponentのイベント登録部分の実装です。

```js
export default class BaseComponent extends React.Component
{
  constructor(props) {
    super(props);
    this.store = this.initStore();
    this.state = this.store.getInitialState();
  }

  initStore(){
    throw 'You must implements initStore().';
  }

  onStoreChange(callback){
    this.setState(this.store.getUpdatedState(), callback);
  }

  componentWillMount() {
    this.store.addChangeListener(this.onStoreChange.bind(this));
  }

  componentWillUnmount() {
    this.store.removeChangeListener(this.onStoreChange.bind(this));
  }
}
```

`this.store`の各メソッドは下記の通り（一部抜粋）。

```js
export default class BaseStore extends Events.EventEmitter
{
  //...

  addChangeListener(callback) {
    this.on('change', callback);
  }

  removeChangeListener(callback) {
    this.removeListener('change', callback);
  }
}
```

`callback === callback`が`false`なんで破棄されてなかったんですね。いろんな方法があると思いますが、とりあえず下記のようにして対応しました。

```js
export default class BaseComponent extends React.Component
{
  constructor(props) {
    super(props);
    this.store = this.initStore();
    this.state = this.store.getInitialState();

    this.storeChangeCallback = (callback) => {
      this.setState(this.store.getUpdatedState(), callback);
    };
  }

  initStore(){
    throw 'You must implements initStore().';
  }

  componentWillMount() {
    this.store.addChangeListener(this.storeChangeCallback);
  }

  componentWillUnmount() {
    this.store.removeChangeListener(this.storeChangeCallback);
  }
}
```

ちなみにes6の`() => {}`内の`this`は外スコープの`this`になります(Babelを使用してます)。
RubyGemのソースを読む（設定編）

# 前書き

- 結構自分は、オープンソースのプロダクトからRubyの書き方を習得していることが多いです。
- 本とか読むのは三秒で飽きる方でGithubのdefunktも何かのインタビューでそんなこと言ってました。
- ソースを読む手段もまぁまぁ筋が良いやり方があると思っており、そのRubyの設定を解説します（実践編はまた解説します。）
- また DHH もソースをガンガン読めと言っています

![dhh.png](https://qiita-image-store.s3.amazonaws.com/0/46303/53a1c464-cf7f-2674-c890-bb2090eda9f1.png)
- [リンク](https://twitter.com/dhh/status/440843559017906176)

# rbenvとbundlerを入れる

- [rbenvのインストール](http://qiita.com/ringo/items/4351c6aee70ed6f346c8)は、他の記事に譲るとして、重要なのはbundlerです

### ダメな例

- これはシステムの方のbundlerを読みに言ってしまっています。

```
$ gem which bundler
/usr/local/ruby/gems/1.9.1/gems/bundler-1.3.5/lib/bundler.rb
```

### 良い例

- rbenv配下(`/usr/local/rbenv`)にあるので、これはrbenv配下にライブラリがインストールされています。

```
$ gem which bundler
/usr/local/rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/bundler-1.10.6/lib/bundler.rb
```

- また何か変だな、と思ったら、`rbenv versions` で現状使っているrubyのバージョンを読むことが出来ます（以下では、2.2.2を利用しています）

```
$ rbenv versions
  system
  2.2.0
* 2.2.2 (set by /usr/local/rbenv/version)
```

# リポジトリ内に gem を落としてくる

- 以下のコマンドを設定することで、`vendor/bundle` 配下に
- 試しに、自分の[django](https://github.com/r-fujiwara/django) というリポジトリを適当な所にcloneしてきましょう。

```
$ git clone git@github.com:r-fujiwara/django.git
$ cd django
```

- ここまで出来たら以下のコマンドを実行しましょう

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

- 要は `/path/to/django/vendor` 配下に全てのGemを落としてくれるというコマンドです。

### ここまで出来たら

- 以下で `ls` すると、以下のようになっていますが、

```
$ cd /path/to/django
$ ls 

Gemfile  Gemfile.lock  README.md  config  config.ru  log  tmp  views
```

- 次の状態で、`bundle install` を走らせると、`ls` した時に結果が変わっています(`vendor`配下が変わっていますね)。

```
$ cd /path/to/django
$ ls

Gemfile  Gemfile.lock  README.md  config  config.ru  log  tmp  vendor  views
```

# export EDITOR の設定


### 何故これを行うか？

- `bundle open` コマンドでリポジトリ内のgemを探しに言ってくれます（別記事に具体的なやり方を説明します）

## 手順

- bashなりの

```
$ vim $HOME/.bashrc
```

- 以下を追記します。

```:$HOME/.bashrc
export EDITOR='vim'
```

```
$ source $HOME/.bashrc
$ cd /path/to/django
$ bundle open unicorn
```

- すると、以下のようにunicornが開かれるはずです

![unicorn.gif](https://qiita-image-store.s3.amazonaws.com/0/46303/da916fef-a4c1-09ed-93ca-9de37f5ab9a1.gif)

- このようにunicornのソースを見たりすることが出来ます。

# 今回の諸々の設定のメリット

- 何かloggerとか挟んで動かなくなった時にガンガンrm `vendor`して、`bundle install` してガンガンソースを読むことが出来ます。

# See Also

あくまで今回はコードリーディングの手段としてのbundlerの使い方を解説しましたが、正攻法のbundlerは以下のようなものかな、と思っています。

> Ruby書くならBundler使え
http://shokai.org/blog/archives/7262
Rubyをソースからインストール


dockerでRuby使おうと思った時にrbenv要らないよねと思ったのでRubyを直接インストールする時のメモ

OSはCentOS Rubyは2.2.4


```
yum install -y gcc-c++ glibc-headers openssl-devel readline libyaml-devel readline-devel zlib zlib-devel
yum install -y bzip2

wget http://ftp.ruby-lang.org/pub/ruby/2.2/ruby-2.2.4.tar.gz
tar -xzvf ruby-2.2.4.tar.gz
cd ruby-2.2.4
./configure --disable-install-doc
make
make install
gem install bundler
```

以上
Macのジャーンを消す方法

## terminal起動

### ジャーン消す
`sudo nvram SystemAudioVolume=%00`

### ジャーン戻す
`sudo nvram -d SystemAudioVolume`

### あれ？鳴るぞ！？
当方el capitanですが上記設定しても鳴らない時と鳴る時があります!!!
mountain lionでも試しましたが鳴りました!!!!!!なんてこった!!!!

### GitHubで良いの発見
[GitHub](https://github.com/teored90/nobootsound)に上がっていたのでそちらを試したら無事消えました!!!!!!!!!!!ひゃっほーい!!!!!  
以下手順

`git clone https://github.com/teored90/nobootsound.git`
`cd nobootsound`
`sudo sh install.sh`
 



## 学び
きちんと確認した上で投稿する
解像度が足りない画像でもマシに見せるCSS（モダンブラウザ専用）

最近だとPCでもたまにバカみたいに解像度高いディスプレイ使ってるケースとかあったりするので、そんな環境用にメインビジュアルとか背景画像とかでバカでかい画像準備しないでCSSでぼかす方法です。

## 画像ぼかしちゃおう
CSS3のfilterでぼかしてしまいましょう。
ブラウザの対応状況は[コチラ](http://caniuse.com/#feat=css-filters)
IEは基本対応していませんが、[CSS-Filters-Polyfill](https://github.com/Schepp/CSS-Filters-Polyfill/)とか使うと使えるっぽいです。
他にもIE独自のFilterとかありますが、その上に重ねた要素がおかしくなったりするので、あんまり使わない方が良いかも。

### 実装サンプル

```html
<style>
.filterSampleBlur, .filterSampleBlur img{
    width:1200px;
    max-width:1200px;
}
.filterSampleBlur img.blur{
    filter:blur(2px);
    -moz-filter:blur(2px);
    -webkit-filter:blur(2px);
    -ms-filter:blur(2px);
}
</style>
<div class="filterSampleBlur">
<img src="https://drscdn.500px.org/photo/64932615/w%3D440_h%3D440/6406a9c82eae61635f60da28177ecbf7?v=0" />
<img src="https://drscdn.500px.org/photo/64932615/w%3D440_h%3D440/6406a9c82eae61635f60da28177ecbf7?v=0" class="blur" />
</div>
```
HDDの違いについて(memo)

# HGSTにおけるDeskStarとUltraStar
HGSTのHDDで同じ4TBでも二種類あり，
HUS724040ALE640: http://kakaku.com/item/K0000358862/spec/#tab
0s03357: http://kakaku.com/item/K0000336933/spec/#tab
値段が2,3割も違うことがある．
　これは，DeskStar(一般ユーザ向け)かUltraStar(サーバ向け)かの違いによる．上のHUSからはじまるものがUltraStarであり，頭文字のHUSは，H Ultrastar Sasから来ている．
　基本的なスペックは同じだが，耐久性/信頼性が異なり，MTBFとかの数字に差がでる．
　ちなみに，HUSとHUAは，SASかSATA対応かの違いである．
サーバの電源が突然OFFになった後、コンテナが正常に動作しないことを経験した

もしかしたらRails側の問題かも。
`docker logs`見たがぱっと見問題なさそうだった。

## 現象

* サーバの電源が突然OFFになった後、コンテナが正常に動作しないことを経験した
    * docker 1.9.1, host: archlinux
    * GitLabとRedmine3。他は動かしていなかった。

* GitLab 8.3.3
    * webアクセスすると500エラー。sshdは多分動いていた
* Redmine3
    * コンテナ起動後、webアクセスするとコンテナが停止する

## 復旧方法

```bash:
docker-compose stop
docker-compose rm
docker-compose up -d
```

これで治った。
powershell > Link > tailの実装 > Get-Content .\error.log -Wait -Tail 5 > Head


参考1. http://qiita.com/cd01/items/da9a36582372e7d0a7f6

```
Get-Content .\error.log -Wait -Tail 5
```

参考2. http://tech.guitarrapc.com/entry/2013/04/15/220408
> 注意
-Tail は末尾から何行という指示ですが、-Wait で更新を待機しているため、実質全行読み取ります。 そのため、以下としてもほぼ変わりません。

参考3. https://technet.microsoft.com/ja-jp/library/hh849787.aspx

> -Tail<Int32>

一方で、headは

> -TotalCount<Int64>
> Aliases > First, Head
技術英語 > How likely is it that this measure will pass? / Proposition 37 / Decision by majority / Decide by majority vote

@ LOE > September 28, 2012
http://loe.org/shows/shows.html?programID=12-P13-00039
> How likely is it that this measure will pass?

ここでいうmeasureは Proposition 37 (提議 37)のことのようだ。

提議が通る可能性を聞いている。

<hr>
関連して思い出したのは

http://eow.alc.co.jp/search?q=Decision+by+majority
http://eow.alc.co.jp/search?q=decide+by+majority+vote
現在のロケールに合わせて適切な日時の表記を得る

簡単にやるには ``NSDateFormatter`` の ``dateStyle`` に指定するのが一番早い。
しかし年は不要、短い表記で曜日が欲しい等、もう少しカスタマイズして表示したい場合は ``dateFormatFromTemplate:options:locale`` を使用すれば、ロケールと必要なフォーマット文字列を元に適切なフォーマット文字列を返してくれる。

```swift
func printDate( locale: NSLocale){
    if let formatString = NSDateFormatter.dateFormatFromTemplate(
        "MMMddE", 
        options: 0,
        locale: locale    ){
            let dateFormatter = NSDateFormatter()

            dateFormatter.dateFormat = formatString
            dateFormatter.locale = locale
            let formattedDateString = dateFormatter.stringFromDate(NSDate())
            print(formattedDateString)
    }
}
// 日本
let jpLocale = NSLocale.init(localeIdentifier: "ja_JP")
printDate(jpLocale) // -> "1月13日(水)"
// US
let usLocale = NSLocale.init(localeIdentifier: "en_US")
printDate(usLocale) // -> "Wed, Jan 13"
// イギリス
let gbLocale = NSLocale.init(localeIdentifier: "en_GB")
printDate(gbLocale) // -> "Wed 13 Jan"
// カレントのロケール
let currentLocale = NSLocale.currentLocale()
printDate(currentLocale) // -> "Wed, Jan 13"
```
Nginx をソースからインストールする(ngx_mrubyをインストール)

#Nginx をソースからインストールする
##参考URL
http://keikenchi.com/nginx-ngx-cache-purge
http://tapira.hatenablog.com/entry/2015/12/13/124505
https://github.com/matsumoto-r/ngx_mruby/wiki/Install

## 導入するにあたって
一般公開しているサービスがDdos攻撃にあうようになったため
自動検知＆対応できるようにモジュールを追加したくなったため
yumでインストールしたnginxではなく
ソースからインストールしたものに変更しようと考え今に至る
ngx_mrubyをインストール


## 現状のnginx環境をバックアップ
```
sudo mkdir ~/backup
cd ~/backup
sudo cp -r /var/www/html ./
sudo cp -r /etc/nginx ./
sudo cp /etc/init.d/nginx ./nginx.org
```

## 作業用ディレクトリを作成
```
sudo mkdir /usr/local/src/nginx
cd /usr/local/src/nginx
```


## 現状のnginxの環境を確認&コピー
```
nginx -V
```

## PCREライブラリが無いとかエラーが出たのでインストールする

```
sudo yum install pcre pcre-devel gcc bison -y
```


## とりあえず現行の最新版である 1.11.0 の場合(オプションは適当)
```
sudo curl -O http://nginx.org/download/nginx-1.11.0.tar.gz
sudo tar zxvf nginx-1.11.0.tar.gz

sudo git clone git://github.com/matsumoto-r/ngx_mruby.git
cd ngx_mruby
sudo git submodule init
sudo git submodule update
sudo ./configure --with-ngx-src-root=/usr/local/src/nginx/nginx-1.11.0
sudo make build_mruby
sudo make generate_gems_config

cd ../nginx-1.11.0

sudo ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx-1.11.0 --sbin-path=/usr/local/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --with-http_ssl_module --with-mail --with-http_stub_status_module  --with-http_v2_module --with-http_realip_module  --with-http_addition_module --without-http_userid_module --add-module=/usr/local/src/nginx/ngx_mruby --add-module=/usr/local/src/nginx/ngx_mruby/dependence/ngx_devel_kit
sudo make
sudo make install
sudo ln -s /usr/local/nginx-1.11.0 /usr/local/nginx
```



## nginx のテスト
```
sudo /usr/local/sbin/nginx -t
```

## 既存のnginxを止めてapacheを起動
```
sudo /etc/init.d/nginx stop
sudo /etc/init.d/httpd start
```

##nginxの設定ファイルを編集
```
sudo vi /etc/init.d/nginx
```

##下記のように変更
```
#nginx=${NGINX-/usr/sbin/nginx}
nginx=${NGINX-/usr/local/sbin/nginx}
```

## sysconfigを編集
```
sudo vi /etc/sysconfig/nginx
```

##下記の一行をファイルの最後に追加
```
NGINX=/usr/local/sbin/nginx
```

##起動スクリプト等の確認
```
sudo chkconfig --add nginx
sudo chkconfig nginx on
sudo chkconfig --list nginx
sudo /usr/local/sbin/nginx -t
```

## apacheを止めてnginxを起動
```
sudo /etc/init.d/httpd stop
sudo /etc/init.d/nginx start
/usr/local/sbin/nginx -V
```

## テスト用のファイルの記述
```
cd /etc/nginx/conf.d
sudo vim default.conf
```

```
location /hello {
  mruby_content_handler_code '
    Server = Nginx
    Server.echo "WORLD"
';
```

```
sudo service nginx reload
```

http://localhost/hello へアクセスしてみる

「WORLD」が表示されれば成功


とりあえず、以上
VagrantでNFSで同期した時のsudoパスワードがある時期からなぜか省略されなかった話

# 最初は上手く行っていたが…

デフォルトであるVirtualBoxの共有システムだと色々と不具合があったので、フォルダの共有方式をNFSにしました。ただし、その場合`vagrant up`や`vagrant reload`などをした時毎度毎度sudoがパスワードを聞いてきます。

それを回避するための`/etc/sudoers`に追記する内容が公式ドキュメントに記述されています。

[NFS - Synced Folders - Vagrant Documentation](https://docs.vagrantup.com/v2/synced-folders/nfs.html)

注: `/etc/sudoers`は`visudo`コマンドで編集してください。保存する前にシンタックスをチェックし、エラーがあれば教えてくれます。直接編集して、万一記述ミスがある状態で保存されてしまうと、**sudoが使用不能になり手も足も出なくなる可能性があります。**

私はホストマシンがOS Xなので、以下を追記しました。

```
Cmnd_Alias VAGRANT_EXPORTS_ADD = /usr/bin/tee -a /etc/exports
Cmnd_Alias VAGRANT_NFSD = /sbin/nfsd restart
Cmnd_Alias VAGRANT_EXPORTS_REMOVE = /usr/bin/sed -E -e /*/ d -ibak /etc/exports
%admin ALL=(root) NOPASSWD: VAGRANT_EXPORTS_ADD, VAGRANT_NFSD, VAGRANT_EXPORTS_REMOVE
```

当初、この内容を追記したらパスワードを聞かれなくなっていました。

# 何故かまた聞いてくる

しかし、しばらくすると何故かまたパスワードを聞いてくるようになりました。何度調べても記述は間違っていないのに何故…

# 犯人確保

sudoで実行されたコマンドのログは`/var/log/system.log`に吐き出されているようなので、そこを調べてみます。

```bash
user@host:~$ tail /var/log/system.log | grep sudo
Jan 13 03:11:11 host sudo[5071]: user : TTY=ttys001 ; PWD=/path/to/vagrant/dir ; USER=root ; COMMAND=/usr/bin/sed -E -e /^# VAGRANT-BEGIN:( 501)? 01234567-89ab-cdef-0123-456789abcdef/,/^# VAGRANT-END:( 501)? 01234567-89ab-cdef-0123-456789abcdef/ d -ibak /etc/exports
Jan 13 03:11:11 host sudo[5075]: user : TTY=ttys001 ; PWD=/path/to/vagrant/dir ; USER=root ; COMMAND=/usr/local/opt/coreutils/libexec/gnubin/tee -a /etc/exports
Jan 13 03:11:11 host sudo[5079]: user : TTY=ttys001 ; PWD=/path/to/vagrant/dir ; USER=root ; COMMAND=/usr/local/opt/coreutils/libexec/gnubin/tee -a /etc/exports
Jan 13 03:11:11 host sudo[5083]: user : TTY=ttys001 ; PWD=/path/to/vagrant/dir ; USER=root ; COMMAND=/usr/local/opt/coreutils/libexec/gnubin/tee -a /etc/exports
Jan 13 03:11:11 host sudo[5085]: user : TTY=ttys001 ; PWD=/path/to/vagrant/dir ; USER=root ; COMMAND=/sbin/nfsd restart
```

犯人はteeコマンドでした。sudoersでは**/usr/bin/tee**にNOPASSWDが設定されていて、しかし実際に実行されているのは**/usr/local/opt/coreutils/libexec/gnubin/tee**だったためにNOPASSWDの対象になっていなかった、ということです。

そういえばちょっと前にHomebrewでcoreutils入れました……(笑)

### 2017/02/10 追記

`coreutils`を入れただけではコマンドが`coreutils`のものには変わりません。私は`coreutils`を入れたのに加え、`.bash_profile`で`PATH`の先頭に、プレフィックス(先頭のg)がついていない実行ファイルのディレクトリ(`/usr/local/opt/coreutils/libexec/gnubin/`)を追記していたため、システムのコマンド(今回の場合`tee`)が上書きされてこちらが実行されていました。

つまり、この問題の原因は`coreutils`を入れていたことそのものというよりは、プレフィックスなしの実行ファイルのあるパスを`PATH`の先頭に追加していたこと、ということになります。

# 対処

というわけで、coreutilsのteeコマンドでもパスワードを省略できるよう、sudoersにまた少し追記します。

```
Cmnd_Alias VAGRANT_EXPORTS_ADD = /usr/bin/tee -a /etc/exports
# ↓この行追記
Cmnd_Alias VAGRANT_EXPORTS_ADD_CU = /usr/local/opt/coreutils/libexec/gnubin/tee -a /etc/exports
Cmnd_Alias VAGRANT_NFSD = /sbin/nfsd restart
Cmnd_Alias VAGRANT_EXPORTS_REMOVE = /usr/bin/sed -E -e /*/ d -ibak /etc/exports
# ↓この行中に、上に追記したCmnd_Aliasを追記
%admin ALL=(root) NOPASSWD: VAGRANT_EXPORTS_ADD, VAGRANT_EXPORTS_ADD_CU, VAGRANT_NFSD, VAGRANT_EXPORTS_REMOVE
```

これにて一件落着。
簡単にpython3系列とOpenCV3を導入する

#今回の目的
1.pythonの3系列をインストールする。
2.そのpython環境を用いてOpenCV3.1を使えるようにする。

#環境
- ubuntu 15.04 ~
- windows 8.1 ~ 

#作業手順
1.pythonをインストールする

公式からダウンロードをしインストール、依存ライブラリなどをその都度導入するのは非常に大変なのであらかじめパッケージされたものを使う。
今回はubuntu、windowsともに[Anaconda](https://www.continuum.io)というディストリビューションを使う。

DOWNLOAD FOR FREE のところに行き、対応するOSの使いたいpythonのバージョンを選ぶ。(今回ではpython3を使うことが目的なので、3.Xの方を選ぶ。)

ダウンロードが済んだら、インストールをする。
windowsはインストーラ形式なので実行し、すべてに対し肯定の選択肢を取るとインストールが終わる。
ubuntuは端末から
`$bash Anaconda3-2.4.1-Linux-x86_64.sh`
みたいに打ち込み、肯定のの選択肢を取り続けるとインストールが終わる。

これが終わると取りあえずpythonが使えるようになる。

2.仮想環境を作成する
そのままライブラリを入れたのでは例えば他のpythonのバージョンだったり、
別のバージョンのライブラリを使いたいときにこまります。
そこで仮想環境を作成しそこにライブラリを入れます。
以下のコマンドで作成しましょう

`$conda create -n 環境の名前 python=3.5 anaconda`
python=の部分には使いたいpythonのバージョンを入れましょう。

作成した仮想環境を使用するときは
`$source activate 環境の名前`
と打ち込んでください(windowsの場合は`source`を書かない)

3.OpenCV3.1をインストールする

~~windowsの場合~~
~~[ここ](http://www.lfd.uci.edu/~gohlke/pythonlibs/)に行き、自分のバージョンにあったOpenCVのwhlファイルを探しダウンロードする。~~
~~コマンドプロンプトを開き、~~
~~pip install ダウンロードしたファイル~~
~~と打ち込む。~~

~~ubuntuの場合~~
以下を打ち込めば良くなったそうです。
ターミナルを開き、次を打ち込む。
`$conda install --channel https://conda.anaconda.org/menpo opencv3`


おしまい
#追記(2017/01/17)

~~この手法でインストールした場合は顔認識に使うカスケードファイル(xxxxx.xml)などががついてきません。~~
~~インターネットで探すなどの対応をお願いします。~~

以下のディレクトリにありました
C:\Users\[username]\Anaconda3\envs\[envname]\Library\etc

#終わりに

この記事を書くにあたっていくつかのサイト様を参考にしました。ありがとうございます。
以下そのサイトのリンクになります。
[python:install [近大CVLAB公開ノウハウ集]](http://www.habe-lab.org/public_wiki/doku.php/python:install)
[Python Extension Packages for Windows - Christoph Gohlke](http://www.lfd.uci.edu/~gohlke/pythonlibs/)
[WIP] cocos2d-xとC++の便利Tips

# `PhysicsShape` を線分で作成する

`PhysicsShapeEdgeBox` の辺だけを作りたいときとかに使える

## 使用例

http://qiita.com/senchan05/items/947358a7ad0c4a2b8d50#3-11

## ドキュメント

http://www.cocos2d-x.org/reference/native-cpp/V3.9/d8/d85/classcocos2d_1_1_physics_shape_edge_segment.html 

# すべての例外をキャッチする

行儀が悪いのは承知

```cpp
try {
    // 例外が発生しそうなコード
} catch (...) {
    // 例外発生時に実行するコード
}
```
Pythonでpitを使う時の注意点

# pitを使ってみてプチハマり
ソースにアカウントIDやパスワードを書かず、実行時に入力を求められるpit。
セキュリティ上とても優れたライブラリなのですが、Pythonでの使用時にプチハマりしたのでメモしておきます。

試したpytonとpitのバージョンはこちら。

```bash
$ python -V
Python 2.7.9

$ pip freeze | grep pit
pit==0.3
```

## 実行時にエディタが起動しない
最低限の記述はこちら。

```py3
import pit

opts = {
    'require': {
        'id': 'your id',
        'password': 'your password',
    }
}
account = pit.Pit.get('test.account', opts)

print account['id']
print account['password']
```

でも、実際に実行してみるとエラー。
なぜか初回実行時にエディタが起動しません。
id、password共入力していないので当然、値取得時にKeyErrorになります。

```py3
>>> import pit
>>>
>>> opts = {
...     'require': {
...         'id': 'your id',
...         'password': 'your password',
...     }
... }
>>> account = pit.Pit.get('test.account', opts)
>>> print account['id']

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'id'
```

デフォルトの状態ではエディタが指定されていないので、viを指定する必要がありました。

```py3
if not os.environ.get('EDITOR'):
    os.environ['EDITOR'] = 'vi'
```

修正して実行。
viが起動され、入力可能になって正常終了しました。

```py3
>>> import pit
>>> import os
>>>
>>> if not os.environ.get('EDITOR'):
...     os.environ['EDITOR'] = 'vi'
...
>>> opts = {
...     'require': {
...         'id': 'your id',
...         'password': 'your password',
...     }
... }
>>> account = pit.Pit.get('test.account', opts)
>>> print account['id']
hoge
>>> print account['password']
hogehoge
```

## エディタに謎の文字（!!python/unicode）が表示される

これを実行すると・・・

```py3
from __future__ import absolute_import
from __future__ import unicode_literals

import pit
import os

if not os.environ.get('EDITOR'):
    os.environ['EDITOR'] = 'vi'

opts = {
    'require': {
        'id': 'your id',
        'password': 'your password',
    }
}
account = pit.Pit.get('test.account', opts)

print account['id']
print account['password']
```

```bash
!!python/unicode 'id': !!python/unicode 'your id'
!!python/unicode 'password': !!python/unicode 'your password'
```

viでのid、password入力時に謎の文字が付きます。
結論から言うと、この行があることが問題でしたので、消すことにより解消します。

```py3
from __future__ import unicode_literals
```

unicode文字を引数で渡してしまうと「!!python/unicode」という文字が表示されてしまいます。
なので、unicode_literalsを指定していないとしても、こう記述しても同じ現象になります。

```py3
opts = {
    u'require': {
        u'id': u'your id',
        u'password': u'your password',
    }
}
account = pit.Pit.get('test.account', opts)
```
Eloquent\Modelのidはintにキャストされるようになった

Laravel 5.2から、Modelのidは自動的にintにキャストされるようになったようです。

https://github.com/laravel/framework/commit/56af6f972cc186e8e667a40d628c5c5426a7069d

このため、`$user->id === $task->user_id` のような比較を行っている場合は注意が必要です(`$task->user_id`側はデフォルトでは文字列となるため)。
明示的に `(int) $user->id === (int) $task->user_id` としてもよいですが、
Taskモデル側で `$this->casts` を指定しても良いでしょう。

```php

class Task extends Model
{
    protected $casts = [
        'user_id' => 'int'
    ];
```
ActiveRecord::QueryMethods#extendingはscopeじゃなかった


勝手に期待して勝手に失望した備忘録。

### いきさつ
仕事上、Railsで扱うモデルがファットになっていたのでやれConcernだのServiceだのDecoratorだのを使ってドメインごとの切り出しをやっている最中なんだけれども、根本的に単一のモデルで扱っているメソッドが多いよねという問題は大して変わっていない。
特にあるモデルについていくつかのクエリは管理機能でしか出番がないから普段はincludeしなければいいのではと思い、特定の条件でのみモジュールをextendする方法を模索していた。

### ActiveRecord::QueryMethods#extendingとの出会い
上記の方法を実現するために悪戦苦闘中していたら件名にもあるextendingに出会った。
Rails4.0から追加されたメソッドで、Railsドキュメント[^1]やAPIdockによれば、「scopeのように使える」という書かれ方をしている。

>Used to extend a scope with additional methods, either through a module or through a block provided.
http://apidock.com/rails/ActiveRecord/QueryMethods/extending

>モジュールやブロックメソッドを引数に与えて、モデルをscopeで拡張する。
返されたオブジェクトをさらに拡張することもできる。
http://railsdoc.com/references/extending

そうであれば願ったり叶ったりなのだが、この記事の結論としては、これらの記述は誤りですよという主張になる。
なぜか。extendingで追加されるメソッドはscopeで定義した場合と挙動が違うからだ。

### そもそもscopeとは
scopeは内部的にはクラスメソッドである。が、厳密にはちょっと違う。

この記事はRails3ベースなので少し古いが、概略をさっと抑えるのに役立つ[^2]
http://kotatu.org/blog/2014/10/11/why-should-use-scopes-over-class-methods/


差異になる部分はこないだストックして大変参考になった記事を参照のこと。scopeはブロック内のがnilになった場合には裏側でallに置き換わっている。
http://qiita.com/hamajyotan/items/3b3ddd022694c6a22a41

[APIdockにも同様のことが書いてある。](http://apidock.com/rails/ActiveRecord/Scoping/Named/ClassMethods/scope)[^3]


つまり、scopeという言葉を使うからには筆者としては「ブロックがnilだったらall返ってくるんだよね？」という挙動を期待したいのである。

### が、違ったんだな、これが。
extendingは内部的にはextending!を呼んでいるので該当するソースを[APIdock経由で引用](http://apidock.com/rails/v4.2.1/ActiveRecord/QueryMethods/extending%21)する。[^4]


```.rb
# File activerecord/lib/active_record/relation/query_methods.rb, line 832
    def extending!(*modules, &block) # :nodoc:
      modules << Module.new(&block) if block
      modules.flatten!

      self.extending_values += modules
      extend(*extending_values) if extending_values.any?

      self
    end
```

ソースを読むとなんてことはない、ただモジュールをまるっとextendして特異メソッド定義しているだけでしたというお話である。つまり、extendingで追加したメソッドがnilになったからallになってくれるかというとそんなことはありませんでしたというわけである。

### RailsGuidesの記述
RailsGuidesではどのように書かれているかというと、全く違った文脈で使用されている。
[説明とサンプルコードを引用する。](http://railsguides.jp/association_basics.html#%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91%E3%81%AE%E6%8B%A1%E5%BC%B5)


>Railsは自動的に関連付けのプロキシオブジェクトをビルドしますが、開発者はこれをカスタマイズすることができます。(中略)拡張を多くの関連付けで共有したい場合は、名前付きの拡張モジュールを使用することもできます。

```.rb
module FindRecentExtension
  def find_recent
    where("created_at > ?", 5.days.ago)
  end
end
 
class Customer < ActiveRecord::Base
  has_many :orders, -> { extending FindRecentExtension }
end
 
class Supplier < ActiveRecord::Base
  has_many :deliveries, -> { extending FindRecentExtension }
end
```

ここでは、関連付けを別クラスに分割するための表記としてextendingが使用されており、他の記述は見当たらない。現状ではscopeの代わりとして使うのはちょっと違うのではないかと思う。

### いきさつに戻る
extendingするときにメソッドがscopeとして解釈ができるようになると自分としては嬉しい。
そこでどう変更したら実現できるかについて手元でトライしているが、苦戦しているので多分すぐには解決しない。
取りあえずこの記事では現状でわかっていることについて記述した次第である。

### 脚注
[^1]: そもそもrailsdoc.comは間違いや適当な記述が多いので陳腐化したjQueryの日本語ドキュメント同様「ああアレアレ解消サービス」くらいの位置づけとみなしている
[^2]: 参照ブログのさらに原文は http://blog.plataformatec.com.br/2013/02/active-record-scopes-vs-class-methods/
[^3]: この箇所についてはソース追いかけたので今回の内容に関しては合っているはず
[^4]: ここもソース読んで裏を取った
CentOS 6.7にBitNami Redmineを導入する際のGit連携


CentOS67にBitNami Redmineを導入する際の備忘録
OS: CentOS 6.7 x64
Redmine: BitNami Redmine 3.2.0

## Redmineのインストール
基本的に[こちら](http://aimless.jp/blog/archives/2243/)の方の方法で問題無くインストールまではOK


## Gitとの連携
1.	Remote repositoryをRedmineと共用にする為のユーザー作成

	``` useradd
	useradd git
	```

2.	redmineのサービスをgitグループへ追加
	
	```usermod
	usermod -G git daemon
	```
	
3.	共用ディレクトリを作成して，所有者を上記で作成したユーザーへ変更

	``` chwon
	chown -R /var/git
	[git@centos67 opt]$ ls -l
	total 12
	drwxr-xr-x   3 git  git  4096 Jan 12 23:56 git-repo
	drwxr-xr-x  17 root root 4096 Jan 12 22:34 	redmine-3.2.0-0
	drwxr-xr-x.  2 root root 4096 Mar 26  2015 rh
	```

上記までを実施してRedmine上でリポジトリパスを登録すれば見えるようになるはず．

## 参考
http://qiita.com/isaac-otao/items/1e6b57809e3841d600c2
http://easyramble.com/create-user-group.html
http://d.hatena.ne.jp/thegoodbadugly/20130116/1358316032
MacからリモートサーバのXアプリケーションの起動

自分用備忘録

# 1.Xサーバ(XQuartz)のインストール/起動
1.1 Xquartzのダウンロード
   [Xquartz](http://www.xquartz.org/ "Xquartz")
1.2 dmgを展開しインストール
1.3 ユーティリティからXquartzを起動
# 2.Mac上の設定
xhostコマンドでACLを解除

```
xhost +
　access control disabled, clients can connect from any host
```

どうでもいいですけど、disableって接続できなさそうな感じがする。。。
can connectもなんとなく流すとcannotって読んでしまうし。

# 3.Linux上の設定
viコマンドにてsshd_configのX11forwardとX11DisplayOffsetのコメントを外す。
X11forwardがnoになっていればyesに変更。

```
ssh -X <Remote_IP>

vi /etc/ssh/sshd_config
  X11forward yes
  X11DisplayOffset 10

export DISPLAY=<Local_IP>:0.0
```

# 4.Xアプリケーションの起動
なんでも良いのでLinux内のXアプリケーションを起動
`xterm`
日本語入力のための設定 part1

### 日本語入力のための設定 part1 (2016.01.12, Raspbian from NOOBS LITE v1.5)
以下のよりも良さそうな方法がありました -> [日本語入力のための設定 part2](http://qiita.com/NariseT/items/b97910c8cbb110e0010d)

___jfbterm, uim, uim-anthy, fonts-vlgothic をインストール___

[日本語を使えるようにする](http://marupeke296.com/IKDADV_PI_Japanese.html) と「実例で学ぶ Raspberry Pi 電子工作」などを参考にさせていただきました

ターミナルを起動して、`sudo apt-get update` をして、以下を入力

```
sudo apt-get install jfbterm uim uim-anthy fonts-vlgothic
sudo reboot
```

再起動後に、右上の王冠マークをクリック -> Anthy (UTF-8) を選択

___Local, Timezone, Keyboard の設定___

ターミナルを起動
-> `sudo raspi-config`
-> Innternnatiolisation Options（上下矢印キーで選択。Select, Finish への移動は、左右矢印キー）
-> 以下のように、Local, Timezone, Keyboard Layout を変更

- Change Locale

   -> ja_JP.UTF-8 を選択（選択・非選択の切り替えは、スペースキー。了解への移動は、Tab キー） 

- Change Time Zone

   -> アジア -> Tokyo （下への移動は、左右矢印キー）

- Change Keyboard Layout

   -> 日本語106キーボードを選択（Sun Type 7 USB （日本語レイアウト）/日本語 106 キー）
   -> 日本語 - 日本語 （OADG 109A）を選択
   -> その後に色々選択させられるが、全てデフォルトを選択

___チェック___

Menu -> アクセサリ -> テキストエディタ -> 半角/全角キーを押して、何か日本語を入力
NSURLSessionで同期通信


同期通信のNSURLConnection.sendSynchronousRequestメソッドがiOS9.0にて非推奨で、"Use [NSURLSession dataTaskWithRequest:completionHandler:] (see NSURLSession.h"になっていた。
なので、NSURLSession.dataTaskWithRequestメソッドを利用した同期通信の実装を行うことにした。

##実装方法
以下はplaygroundで記載。

```SyncPlaygound.playground
func sendSynchronize(urlPath:String, completion: (NSData?, NSURLResponse?, NSError?) -> Void) {
	let semaphore = dispatch_semaphore_create(0)
	let url: NSURL = NSURL(string: urlPath)!
	let request: NSURLRequest = NSURLRequest(URL: url)
	let subtask = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { data, res, error in
		completion(data, res, error)
		dispatch_semaphore_signal(semaphore)
	})
	subtask.resume()
	dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
}

let urlPath: String = "http://(テスト用のURL)"
for i in 0...1000 {
	print("\(i)Start")
	sendSynchronize(urlPath, completion:{ data, res, error in
		print("\(i)completion")
	})
	print("\(i)end")
}

/*実行結果
0Start
0completion
0end
1Start
1completion
1end
2Start
2completion
2end
・
・
・
999Start
999completion
999end
1000Start
1000completion
1000end
*/
```

###参考
https://github.com/floschliep/NSURLSession-SynchronousTask/blob/master/NSURLSession%2BSynchronousTask/NSURLSession%2BSynchronousTask.m
pandas でソート

#はじめに
　DataFrame のソートに関する内容が日本語では簡単なものしかなかったのでまとめました。あまり需要のないところに触れていきます。

　pandas 0.17.1 で動作確認済み。

今回使用するデータはこれです。

```py:sort.py

import numpy as np
import pandas as pd

if __name__ == "__main__":

	df = pd.DataFrame([[1, 3, "北海道"], [4, 5, "東京都"], [3, 5, "埼玉県"], [6, 9, "大阪府"], [1, 1, "青森県"]])
	df.index = ["鈴木", "田中", "木村", "遠藤", "吉田"]
	df.columns = ["項目1", "項目2", "項目3"]

```

|  | 項目1|  項目2|  項目3|
|---|---:|---:|---:|
|鈴木 |   1|    3|  北海道|
|田中 |   4|    5|  東京都|
|木村 |   3|    5|  埼玉県|
|遠藤 |   6|    9|  大阪府|
|吉田 |   1|    1|  青森県|

#数値でのソート
この表を項目1で並べようとすると
`df.sort_values(by=["項目1"], ascending=True)`
とすることで

|   | 項目1|  項目2|  項目3|
|---|---:|---:|---:|
|鈴木 |   1|    3|  北海道|
|吉田 |   1|    1|  青森県|
|木村 |   3|    5|  埼玉県|
|田中 |   4|    5|  東京都|
|遠藤 |   6|    9|  大阪府|

のように項目1の昇順（値が小さい順）に並びます。項目1の値が同じときは元の表での順番に依存して並びます。このとき`ascending=True`を`ascending=False`に変更すると降順（値が大きい順）に並びます。

元の順ではなく項目2に依存させたいときは
`df.sort_values(by=["項目1", "項目2"], ascending=True)`
とすることで

|   | 項目1|  項目2|  項目3|
|---|---:|---:|---:|
|吉田 |   1|    1|  青森県|
|鈴木 |   1|    3|  北海道|
|木村 |   3|    5|  埼玉県|
|田中 |   4|    5|  東京都|
|遠藤 |   6|    9|  大阪府|

となります。
　多少変則的ですが、項目1を昇順、項目2を降順にしてソートしたいときは
`df.sort_values(by=["項目1", "項目2"], ascending=[True,False])`
とすることでソートできます。

#文字でのソート
　続いて項目3についてのソートをします。先ほどと同様に
`df.sort_values(by=["項目3"], ascending=True)`
とすると

|   | 項目1|  項目2|  項目3|
|---|---:|---:|---:|
|鈴木 |   1|    3|  北海道|
|木村 |   3|    5|  埼玉県|
|遠藤 |   6|    9|  大阪府|
|田中 |   4|    5|  東京都|
|吉田 |   1|    1|  青森県|

となり、ソートはされるけどもおそらく目的のものとは違ったものになります。ここで揃えたい順のリストを例えば
`tdhk = ["北海道", "青森県", "埼玉県", "東京都", "大阪府"]`
として
`df["項目3"] = pd.Categorical(df["項目3"],tdhk)`
を挿入するとリストの順にソートされます。

|   | 項目1|  項目2|  項目3|
|---|---:|---:|---:|
|鈴木 |   1|    3|  北海道|
|吉田 |   1|    1|  青森県|
|木村 |   3|    5|  埼玉県|
|田中 |   4|    5|  東京都|
|遠藤 |   6|    9|  大阪府|
Spyder統合環境の動作に失敗するとき

OpenCV-Pythonの利用のためにPython(x,y)のインストールをしたもののSpyderの起動に失敗する場合、以下の対策を検討してください。

症状：[Python(x,y)][Spyder][Spyder]を実行したとき、一瞬だけ黒のコマンドプロンプトが表示されて、すぐに終了してしまう。
そこで、コマンドプロンプトを開いて、> spyder と打ち込む。
そうしたときに、ライブラリがない旨のエラーメッセージがでるときがあった。

解決方法：
\> pip install (該当のモジュール名)
とすると、
そのモジュールがインストールされる。

インストール後に
\> spyder
とすると、spyder統合環境が起動した。


付記：Spyder統合環境については 以下の記事がとても有用です。
[【シリーズ】「python,OpenCVを用いたCVプログラミング」 第3回：科学技術計算むけマルチプラットフィームpython IDE『Spyder』の紹介](http://derivecv.tumblr.com/post/37223771650)
端末からapkを引っこ抜きたいけど、それどこにあるん？

雑にいきます。

**特定アプリのapkを端末から引っこ抜きたいんだけど(引っこ抜いた後何するかは内緒だぞ)、それどこにあるん？**って場合の対処方法。

以下をadb shellで実行すれば、まあ大体どこにapkがあるかわかる。

**※apkを引っこ抜きたいアプリを起動させておく(バックグラウンドでもOK)ことが前提条件**

```
adb shell dumpsys activity activities | grep apk
```

Android MのNexus5で実行した結果がこんな感じ。

![スクリーンショット 2016-01-13 0.08.27.png](https://qiita-image-store.s3.amazonaws.com/0/43637/8d49c593-935d-29ab-2f8c-0e4d042ceb8c.png)

うん！わかりやすい！

あとはbaseDirに書いてある内容をコピって、adb pullするだけでいいね。

簡単だね！やったね！！
Swiftはじめたい...その７ if , switch


# 今回はifとswitch文です。
## ifは、わざわざ書く必要ないくらいふつーかも...

```swift:if
let a = true
// ふつーのif
if ( a ) {
    print(a)
}
// これもカッコがなくてもOK
if a {
    print(a)
}
```

+ forと同様でカッコがなくてもOKなことぐらいですね。

## switch

+ これもふつーです。

```swift:switch
// 数値
let a = (0..<5)
for v in a {
    switch v {
    case 1:
        print("a")
    case 2:
        print("b")
    case 3:
        print("c")
    default:
        print("other")
    }
}

// 文字列
let b = ["z" , "a" , "b" , "c" , "d"]
for v in b {
    switch v {
    case "a":
        print("a")
    case "b":
        print("b")
    case "c":
        print("c")
    default:
        print("other")
    }
}

// 複数指定
let c = ["z" , "a" , "b" , "c" , "d"]
for v in c {
    switch v {
    case "a","c":
        print("a or c")
    case "b":
        print("b")
    default:
        print("other")
    }
}
```

+ 範囲指定できるのは便利かも！

```swift:範囲指定
// 範囲指定もできる
let d = (0..<100)
for v in d {
    switch v {
    case 1...10:
        print("1〜10")
    case 11...50:
        print("11〜50")
    case 51...100:
        print("51〜100")
    default:
        print("other")
    }
}
```

## まとめ

+ そんな変な構文になるわけないですよね。
+ switchの範囲指定は便利かもしれません。

# 今日はここまで

+ 次回はなにを試そうか？宿題にしてたLazyMapCollectionか？正規表現か？文字列操作か？
ruby on railsでscaffoldを作成する

ちょっとしたアプリのAPIが欲しい時に
管理画面付きのAPIが数行でできる。

ものすごく重宝する

DB名とカラムは要調整

```
# プロジェクトを作成する
rails new myapp

# プロジェクトディレクトリに移動
cd myapp/

# DB作成
rails g scaffold User name:string score:integer

# DB繁栄（マイグレーション） 
rake db:migrate

# サーバー立ち上げ
rails s

# ポートフォワーディングしている状態でホストOSのブラウザで表示する時
# bundle exec rails server -b 0.0.0.0
```

一発で作成したい時

```
rails new myapp; cd myapp/; rails g scaffold User name:string score:integer; rake db:migrate; rails s
```

```
rails new myapp; cd myapp/; rails g scaffold User name:string score:integer; rake db:migrate; bundle exec rails server -b 0.0.0.0
```

下記で管理画面にアクセスできる
http://localhost:3000/users
ラズベリーパイに OS をインストール

### ラズベリーパイに OS をインストール
(2016.01.11 El Capitan, Raspbian)

___ケース付きのラズベリーパイ２(Raspberry Pi2 Model B ボード＆ケースセット)を購入___

他に必要なものの例：
モニター（HDMI 対応）、HDMI--HDMI ケーブル、有線マウス、有線キボード、LANケーブル、インターネット環境、5V, 2A の電源アダプター、micro USB--USBケーブル

___Micro SD カードを Mac に挿入(Transcend microSDHCカード 16GB Class10 を使用)___

-> Application -> Utility -> Disk Utility -> Erase
-> 挿入した Micro SD カード を選択
-> MS-DOS(FAT) にフォーマット

___ラズベリーパイOS の[ダウンロードサイト](https://www.raspberrypi.org/downloads/noobs/) から、NOOBS LITE の ZIP をダウンロード___

-> 解凍 -> フォルダの中身を全て Micro SD カードにコピー（トップのフォルダをコピーするのでなく、中にある様々なファイル類をコピーする）

___ラズベリーパイの用意___

1. HDMI ケーブルでモニターと接続 （HDMI--HDMI）
1. マウス、キーボードと有線接続 (USB--マウス、キーボード)
1. LAN ケーブルを使用して、有線LAN でインターネットに接続する (LANポート--LANポート)
1. 最後に、5V, 2A 電源アダプターと接続する（micro USB--USB）

電源と接続すると自動で起動する

___インストール、pi ユーザーのパスワード変更、シャットダウン___

Raspbian を選択してインストール（日本語にする場合は、画面下部の言語を日本語、キーボード設定を日本語に）
-> インストールが終わったら O.K. ボタンを押す

ターミナルを起動して、`sudo raspi-config` と入力
-> 上から２つ目の Change User Password を選択し、新しいパスワードを２回入力
-> 右矢印を押して、"Finish" を選択

"Menu" からシャットダウンすることができる

___参考サイト___

[MacでRaspberry Piセットアップ(2/2)](https://tool-lab.com/2013/11/mac-raspberrypi-setup-2/) など