OmniAICreator/Qiita-1.07M huggingface dataset:
DataMapperのSetupをしてみる。


RubyのORMライブラリであるDataMapperをSetupしてみる。

[公式ページ](http://datamapper.org/)

### Getting started
とりあえず公式ページのGetting startedに従って見る。Postgresは[Postgres.app](http://postgresapp.com/)で入れてる状態。

postgresql用のadapterを入れる。その次に、data_mapperもinstall。

```ruby
 gem install dm-postgres-adapter
 gem install data_mapper
```

使い始める前に、まずsetup。

```ruby
 # If you want the logs displayed you have to do this before the call to setup
 DataMapper::Logger.new($stdout, :debug)

 # A Postgres connection:
 DataMapper.setup(:default, 'postgres://user:password@hostname/database')
```

[Postgres.appのドキュメント](http://postgresapp.com/documentation/)を参考に、`postgres://YOURUSERNAME@localhost/YOURUSERNAME`でDBに接続する。

(この時、元のドキュメントのまま`postgresql://~`で接続しようとすると、`dm-postgresql-adapter`をrequireしようとしてErrorが出る。コードを見てみると、`dm-core/adapters.rb`の162,163行目に

```ruby
162       def load_adapter(name)
163         require "dm-#{name}-adapter"
```

という記述がある。動的にrequireするgemを切り替えてるのが原因っぽい。)

### Modelの定義について

[このブログ](http://krdlab.hatenablog.com/entry/20090917/1253124422)によると、indexはれるっぽい。

Stringタイプのカラムは、lengthオプションで最大長を指定出来る(デフォルトは50)。あと、lengthとして`length: 1..200`のようにRangeを渡せば、最大、最小を指定してvalidationが出来る。

idは通常Serialタイプにする。これは、IntegerかつPrimary Keyのショートカット。別のカラムにも`key: true`オプションをつけると、そのカラムもPRIMARY KEYになる。(PostgresqlではPRIMARY KEY制約は一つのテーブルに一つしかつけられ無い為、DataMapperで複数の属性にkey制約を付けると、複数列としてのPRIMARY KEY制約がつけられる。つまり、NOT-NULL制約やUNIQE制約が複数列としてつけられ、indexも複数列インデックスと呼ばれるモノになる。複数列インデックスは(a, b, c)という組み合わせのときc単独でのindexを用いた検索が出来なくなるため、使い勝手が悪く使わない方が良い。)

間違って

```ruby
  4 class Page
  5   include DataMapper::Resource
  6
  7   property :id,         Serial
  8   property :url,        String, key: true, length: 1..200
  9   property :created_at, DateTime
 10 end
```

の様にSerialタイプの`id`と`key: true`オプションを付けた`url`を定義してしまった。複数列インデックスを用いるのは嫌だったので、変わりに`required: true`と`unique_index: true`をオプションとしてつけた。

```ruby
  4 class Page
  5   include DataMapper::Resource
  6
  7   property :id,         Serial
  8   property :url,        String, required: true, unique_index: true length: 1..200
  9   property :created_at, DateTime
 10 end
```

参考
http://rubydoc.info/github/datamapper/dm-core/master/DataMapper/Property

`DataMapper.finalize`でテーブル定義を確定して、`DataMapper.auto_upgrade!`でmigration走らす。(`DataMapper.migrate!`すると初期化&migrationで、テーブル定義をちょいちょい変更しつつデータ初期化したく無い場合は`DataMapper.auto_upgrade!`すると良いっぽい)

finalizeしないと、DBとの接続を毎回行う為に効率が悪いらしい。
参考
http://datamapper.org/getting-started.html

確かにmodel定義だけでmigration走った。すごい。個人用で適当にやるならとりあえず`DataMapper.auto_upgrade!`しとけば楽。(Loggerもあるのでどの時点でどういった変更をしたかはログに残せる)

KrdLab's blog
http://krdlab.hatenablog.com/entry/20090913/1252806702
http://krdlab.hatenablog.com/entry/20090517/1242564102
ってのにめっちゃ詳しく載ってる。

[これも参考](http://d.hatena.ne.jp/m-kawato/20130303/1362323500)
[アインシュタインの電話番号](http://blog.ruedap.com/2011/02/12/ruby-sinatra-datamapper-1-orm-sqlite)

ファイル分割の仕方
http://blog.ruedap.com/2011/02/13/ruby-sinatra-datamapper-2-migrate-model
Ruby ( Rails ) で 文字を追加した QR コードを簡単に生成する方法

# Ruby で QR コードを生成

## gem をインストール  

```
$ gem install rmagick
$ gem install rqrcode_png
```

## サンプルコード
QRコードに「hoge」という情報を埋め込み、生成された QR コードの下部の中心に「id: hoge」を表示して、PNGファイルで保存します。

```ruby
    require 'fileutils'
    require 'RMagick'
    require 'rqrcode'
    require 'rqrcode_png'
    require 'chunky_png'

    text = 'hoge'
    qrimage = "tmp.png"
    width = 150
    height = 150
    qr = RQRCode::QRCode.new(text, :size => 10, :level => :h)
    qr.to_img.resize(width, height).save(qrimage) # tmp.png のファイル名で一旦 png ファイルを保存

    image = Magick::Image.read(qrimage).first
    # x は 150 の半分の 75 とし、y は 150 だと下に表示がかぶってしまうので、2px 上げておく
    draw.annotate(image, 0, 0, width / 2, height - 2, "id: #{text}") do
      self.fill = '#000000'
      self.align = Magick::CenterAlign
      self.stroke = 'transparent'
      self.pointsize = 8
      self.text_antialias = true
      self.kerning = 1
    end
    
    image.write("qr.png")
    FileUtils.rm(qrimage, {:force => true}) # tmp ファイルを削除
```

# Rails で QR コードを生成

## gem をインストール  
下記を Gemfile に追加して、`bundle install`  

```ruby:Gemfile
gem 'rmagick', :require => 'RMagick'
gem 'rqrcode_png'
```

## サンプルコード
QRコードに「hoge」という情報を埋め込み、生成された QR コードの下部の中心に「id: hoge」を表示する  
ファイルには保存せず、data_url に変換して View で表示する  

### Controller
```ruby
    require 'chunky_png/rmagick' # Magick::Image、ChunkyPNG::Image 間の変換に使用

    text = 'hoge'
    width = 150
    height = 150

    qr = RQRCode::QRCode.new(text, :size => 10, :level => :h)
    # ChunkyPNG::Image を Magick::Image に変換
    image = ChunkyPNG::RMagick.export(qr.to_img.resize(width, height))
    
    draw = Magick::Draw.new
    draw.annotate(image, 0, 0, width / 2, height - 2, "id: #{shop.id}") do
      self.fill = '#000000'
      self.align = Magick::LeftAlign
      self.stroke = 'transparent'
      self.pointsize = 8
      self.text_antialias = true
      self.kerning = 1
    end
    
    # Magick::Image を ChunkyPNG::Image に変換して、DetaUrl に
    @qrpng = ChunkyPNG::RMagick.import(image).to_data_url
```

### View ( haml )
```haml
%img { src: "#{qrpng}" }
```

# 参考URL

http://dharry.hatenablog.com/entry/2013/09/08/164335
http://qiita.com/ryosy383/items/c753103c93fa177e4466
[Swift] UIImageを自前で生成し，UIImageViewで表示する方法

リリースしている以下のアプリで，必要となったことから派生して書いた記事になります．
i切り絵メーカー for iPad 〜iKirie Maker for iPad〜
https://itunes.apple.com/us/app/i-qieri-huimeka-for-ipad-ikirie/id955247230?mt=8

やりたいこと

**UIImageViewに表示するimageは，あらかじめ用意されたimageではなく，動的に生成したUIImageにしたい**

このことを実現するための方法です．

# 自前でUIImageを生成し，UIImageViewで表示する

UIImageは，一般的にあらかじめプロジェクトに導入しているimageファイル(pngやjpgなど)を用いることが多いようです．

例えば，[Fusapiensさんの記事](http://qiita.com/Fusapiens/items/180268c384fd6b274ee5)から引用すれば，

```swift
let myImage = UIImage(named: "logo.png")
```

などという風に．
これをObjective-Cで同様の内容を書き直すと，以下のようになります．

```objc
UIImage *myImage = [UIImage imageNamed:@"logo.png"];
```

ここまでは普通の話です．
では，目的である，自前でUIImageを生成する方法はどのようにすればよいのでしょうか．

ここでは例として，RGBAで指定した色で四角形のUIImageを生成するとします．
なお，実際にはUIViewを継承したクラスで実装しましたが，UIViewControllerを継承したクラスで例を作成しています．
適時読み替えていただくようお願い致します．

```swift
var imgView:UIImageView! = nil
var img:UIImage! = nil
// ここでRGBAの値を指定(今回は適当に青色にしています)
var r:Int = 0
var g:Int = 0
var b:Int = 255
var alphaValue:Float = 1.0

// UIImageViewを準備(iPadの横向きにフルで取ったとした場合．ご自身の要件に合わせて下さい．)
imgView = UIImageView(frame:CGRectMake(0,0,1024,768)
// imgViewを画面に貼り付け
self.view.addSubview(imgView)

// UIImageを自前で準備
UIGraphicsBeginImageContextWithOptions(imgView.frame.size, false, 0)
// context生成
var contextImg:CGContextRef = UIGraphicsGetCurrentContext()
// この塗りつぶす領域の大きさを指定
let rect:CGRect = CGRectMake(0, 0, 1024, 768)
//　色をRGBAで指定
CGContextSetRGBFillColor(contextImg,CGFloat(r) / 255,CGFloat(g) / 255,CGFloat(b) / 255,alphaValue)
// 指定された領域を塗りつぶす
CGContextFillRect(contextImg, rect)
//　現在のcontextの情報取得
img = UIGraphicsGetImageFromCurrentImageContext()
//　contextを終了
UIGraphicsEndImageContext()

// imgをUIImageViewで表示
imgView.image = img
imgView.image?.drawInRect(CGRectMake(0, 0, imgView.frame.size.width, imgView.frame.size.height))
```

このように準備して，そのimageViewの上にやりたい処理(線をdrawするなど)を実現できました．
参考になれば幸いです．
Heroku buildpack: linuxbrew

[Heroku buildpack: linuxbrew](https://github.com/sunny4381/heroku-buildpack-linuxbrew)を作りました。

[linuxbrew](https://github.com/Homebrew/linuxbrew)を使って任意のパッケージを [Heroku](https://www.heroku.com/) にデプロイできます。

## 使い方

`.cellar` ファイルに linuxbrew でインストールするパッケージのリストを設定します。

```.cellar
mecab
mecab-ipadic
```

`.buildpacks` ファイルに次の 1 行を追加します。

```.buildpacks
https://github.com/sunny4381/heroku-buildpack-linuxbrew.git
```

次のように buildpack `https://github.com/heroku/heroku-buildpack-multi` を使って、Heroku 上にアプリケーションを作成し、`LD_LIBRARY_PATH` を設定します。

```
$ heroku create --buildpack https://github.com/heroku/heroku-buildpack-multi
$ heroku config:add LD_LIBRARY_PATH=/app/.linuxbrew/lib
```

Heroku の `$HOME` は `/app` に設定されており、linuxbrew は、`/app/.linuxbrew` にインストールされます。
`LD_LIBRARY_PATH` に `/app/.linuxbrew/lib` を設定すると、linuxbrew でインストールした so を検索できるようになります。

最後に heroku に push します。

```
$ git push heroku master
```

## linuxbrew でインストールできるパッケージ

[braumeister.org](http://braumeister.org)で探してください。

## サンプルプロジェクト

[open_jtalk-server](https://github.com/sunny4381/open_jtalk-server) を clone して試すことができます。

```
$ git clone https://github.com/sunny4381/open_jtalk-server.git
$ cd open_jtalk-server.git
$ heroku create --buildpack https://github.com/heroku/heroku-buildpack-multi
$ heroku config:add LD_LIBRARY_PATH=/app/.linuxbrew/lib
$ git push heroku master
$ heroku run bash
```

なお、サンプルを試すには、事前に Heroku にアカウントを作成する必要があり、ローカルに [Heroku Toolbelt](https://toolbelt.heroku.com) をインストールしている必要があります。

"Deploy to Heroku" ボタンも付いています。
ドリコム・リブセンス・イプロスで行うインフラ向け勉強会のメモ

http://drecom-study.doorkeeper.jp/events/11137

## Winning the metrics battle

Cactiから自作の監視ツールを作った。

## Fluentd プラグイン開発講座

http://fluentd.org/
https://github.com/fluent/fluentd/

Fluentd プラグインの作り方

簡単に作れる、rubyで書ける

プラグインを作ってデータを操作することで、企画の無茶ぶりにも耐えられるようになりました。

例外処理とかどうしてますか？
フォーマットのエラーとかはスルー,やってない


## MySQLと組み合わせて始める全文検索エンジン「elasticsearch」

ファセット検索
位置情報検索
kuromoji

elasticsearchはv1.0になった

メインDBはMySQLであるが、検索だけelasticsearch使いたい

Yamabiko

MySQLからELへ非同期に反映

差分更新が遅い

https://github.com/y-ken/elasticsearch_mysql_importer

blue-green-deployment 手法

elasticsearchの日本語トレーニングがある
elasticsearch server

http://www.amazon.co.jp/%E9%AB%98%E9%80%9F%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%A9%E3%83%96%E3%83%AB%E6%A4%9C%E7%B4%A2%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%B3-ElasticSearch-Server-Rafal-Kuc/dp/4048662023
rspecのstubとmockについて

## モックとスタブの使い分け

### モック

「オブジェクトのメソッドがどう呼ばれて何を返すか」というインタフェースも含めたテストのために使う


### スタブ

テストをスムーズに行うために「あるオブジェクトのメソッドが呼ばれたら、ある戻り値を返す」ために使う


```rb
# object.stub(:is_dummy?).and_return(true)
User.stub(:is_dummy?).and_return(true)


```

この書き方から

```rb
# allow(object).to receive(method).and_return(return value)
allow(User).to receive(:is_dummy?).and_return(true)
```

に書き換える


#### こっちのがいいのかな

```rb
allow_any_instance_of(Widget).to receive(:name).and_return("Wibble")
expect_any_instance_of(Widget).to receive(:name).and_return("Wobble")
```


### 参考

https://github.com/rspec/rspec-mocks
http://stackoverflow.com/questions/17566690/object-any-instance-should-receive-vs-expect-to-receive
http://nabewata07.hatenablog.com/entry/ruby/rspec/mocks2-14/syntax-and-spy
http://morizyun.github.io/blog/rspec-model-controller-ruby-rails/
zsh + peco + anyframe 試した

# はよ

* [anyframeを使おう](http://www.slideshare.net/mollifier/anyframe-42170860 "anyframeを使おう")
* [zsh + peco + anyframeの導入(For Mac) - Qiita](http://qiita.com/r82/items/3b0318bab1a583bc0f20 "zsh + peco + anyframeの導入(For Mac) - Qiita")
* [peco/peco](https://github.com/peco/peco "peco/peco")

# 流れ

1. zsh でインクリメンタルでべんりなやつたくさんあるけど他のやつ試したい
1. peco 人気あるぽい
1. peco と zsh 組み合わせたい
1. zsh でみんな関数書いてキーバインディングつけてるぽい
1. なんかそこつないでくれるいい感じのやつあるのでは
1. [mollifier](http://qiita.com/mollifier "mollifier - Qiita") さんが [mollifier/anyframe](https://github.com/mollifier/anyframe "mollifier/anyframe") というの作ってくれてた
1. 良さそう

# anyframe でできること

[anyframeを使おう](http://www.slideshare.net/mollifier/anyframe-42170860 "anyframeを使おう") から抜粋したり補足したりする。

ぜんぶインクリメンタルなかんじの操作でできる。


## コマンドライン履歴

ないと困るやつ。

* 履歴一覧 ⇒ 選択 ⇒ 実行
** `anyframe-widget-execute-history`
* 履歴一覧 ⇒ 選択 ⇒ コマンドラインに挿入
** `anyframe-widget-put-history`

ただ今回試したとき、選択後に

```
      1    vim ~/.zshrc                                                                                                                               
cd:cd:13: too many arguments
```
みたいに選択した履歴が渡されてきて、エラーになってて、原因どこだろうと思って探してみてる途中


## Git ブランチ

git のブランチがずらーっと増えてきたとき助かる。
issue 番号なんとなくしか覚えてないときあるし。

### ブランチ一覧 ⇒ 選択 ⇒ checkout

* `anyframe-widget-checkout-git-branch`



### ブランチ一覧 ⇒ 選択 ⇒ コマンドラインに挿入

* `anyframe-widget-insert-git-branch`



## 過去に移動したことのあるディレクトリ一覧 ⇒ 選択 ⇒ 移動

* `anyframe-widget-cdr`
* required `cdr`

## プロセス一覧 ⇒ 選択 ⇒ kill

* `anyframe-widget-kill`

## `ghq` で管理してるリポジトリ一覧 ⇒ 選択 ⇒ 移動

* `anyframe-widget-cd-ghq-repository`
* require [motemen/ghq](https://github.com/motemen/ghq "motemen/ghq")

## ファイル名一覧 ⇒ 選択 ⇒ コマンドラインに挿入

* `anyframe-widget-insert-filename`


## 自分で関数を追加する

べんりに追加しやすいとのこと。


# インストールと設定

ここは端折って書くのでちゃんとこれ読むといいです。
[mollifier/anyframe](https://github.com/mollifier/anyframe "mollifier/anyframe")

zsh のプラグイン管理に antigen 使ってるならこれだけで導入終わる。

```zsh:~/.zshrc
autoload -Uz chpwd_recent_dirs cdr add-zsh-hook
add-zsh-hook chpwd chpwd_recent_dirs

     :

antigen bundle mollifier/anyframe
```

あとキーバインド設定。

```zsh:~/.zshrc
bindkey '^xb' anyframe-widget-cdr
bindkey '^x^b' anyframe-widget-checkout-git-branch

bindkey '^xr' anyframe-widget-execute-history
bindkey '^x^r' anyframe-widget-execute-history

bindkey '^xi' anyframe-widget-put-history
bindkey '^x^i' anyframe-widget-put-history

bindkey '^xg' anyframe-widget-cd-ghq-repository
bindkey '^x^g' anyframe-widget-cd-ghq-repository

bindkey '^xk' anyframe-widget-kill
bindkey '^x^k' anyframe-widget-kill

bindkey '^xe' anyframe-widget-insert-git-branch
bindkey '^x^e' anyframe-widget-insert-git-branch
```
enchant.jsとtmlib.jsを使ったゲーム作成フレームワーク「enforce」キャラクターの重ね合わせ処理

ここでは、「game01」というディレクトリ内で作業しているという前提で説明しています。

# キャラクターの重ね合わせ
enchant.jsとtmlib.jsではスプライトの上下関係は、シーンにaddChildした順に上へ上へと重ねられていきます（最後に追加したものが一番上）。
しかし、enforceではスプライトを非表示にした場合はremoveChildしているので、一旦非表示にしたスプライトを再び表示した場合はaddChildされ最上位に来てしまい、addChildされた順だけでは重なり順序を維持出来ません。
そこで、enchant.jsでは「シーン」、tmlib.jsでは「キャンバスエレメント」を使い、

「**シーンやキャンバスエレメント自体の重なり順（addChildされた順）が、シーンやキャンバスエレメントへaddChildされたスプライトの重なり順よりも優先される**」

という特性を利用し、それをレイヤーのように使えるようにしています。
一般的なキャラクタの生成は、

```coffeescript
obj = addObject
  image: 'bear'
  x: SCREEN_WIDTH / 2
  y: SCREEN_HEIGHT / 2
  width: 32
  height: 32
  animlist: [
    [100, [0, 1, 0, 2]]
  ]
```
ですが、ここに、

```coffeescript
  scene: GAMESCENE_SUB2
```
を追加すると、「**scene**」パラメータを省略したスプライトよりも、常に重なり順で上になります。
図にすると下図のようになります。

![scene_layer.png](https://qiita-image-store.s3.amazonaws.com/0/53543/449cc5dd-e2c8-0532-65a7-cd20cadb10a5.png)

「**scene**」パラメータを省略すると「**GAMESCENE_SUB1**」になります。
例を挙げると、

「**GAMESCENE_SUB1**にaddChildされたスプライトは、それより下（**GAMESCENE**、**BGSCENE_SUB2**、**BGSCENE_SUB1**、**BGSCENE**）のシーンにaddChildされたスプライトよりも、絶対に下になることは無く、それよりも上（**GAMESCENE_SUB2**、 **TOPSCENE**）のシーンにaddChildされたスプライトよりも、絶対に上になることは無い」

という事になります。
同じシーンにaddChildされたスプライトの重なり順は、addChildされた順（上へ上へと重なっていく）になります。

---

[enforceチュートリアル一覧](http://qiita.com/digitarhythm/items/9e75c871f5ce582a4d01)
rails g model Modelみたいなコマンドをmatlabのために自作する

shell scriptの勉強がてら書いてみました。
コードが全てを語っています。。。\_(┐「ε:)\_

```
#!/bin/bash
split(){
	# split TEXT DELIMITER
	# ex) split "2015-01-18" "-"
	# -> returns array "2015", "01", "18"
	# use ${arr[0]} and so on.
	TEXT=$1
	arr=( `echo $TEXT | tr -s $2 ' '`)
}



if [ "$1" == "lib" ] ; then
	mkdir -p $PWD/libs/+$2
	echo $PWD/libs/+$2 is generated!
elif [ "$1" == "script" ] ; then
	# define file path first
	fp=$PWD/scripts/$2.m
	echo %%% SCRIPT %%% >> $fp
	date +"% %Y/%m/%d" >> $fp
elif [ "$1" == "exp" ] ; then
	# define file path first
	fp=$(date +"$PWD/experiments/exp%Y_%m_%d_$2.m")
	echo %%% EXPERIMENT %%% >> $fp
	date +"% %Y/%m/%d" >> $fp
elif [ "$1" == "model" ] ; then
	split $2 "/"
	if [ "" == "${arr[1]}" ] ; then
		echo "type the package name!"
		echo "ex) Test/LinearIOT"
	else
		fp=$PWD/libs/+${arr[0]}/${arr[1]}.m
		mkdir -p $PWD/libs/+${arr[0]}
		echo classdef ${arr[1]} >> $fp
		echo end >> $fp
		echo "Successfully generated!"
	fi

else
	echo !!! say sth as arguments !!!
	echo \ \ \ \ The syntax is...
	echo \ \ \ \ \ \ \ \ g lib DIRECTORY_NAME
	echo \ \ \ \ \ \ \ \ g script SCRIPT_NAME
	echo \ \ \ \ \ \ \ \ g exp EXPERIMENT_NAME
	echo \ \ \ \ \ \ \ \ g model MODEL_NAME
	echo \ \ \ \ \ \ \ \ g commands are available in $HOME
fi
```

## 使い方

下記のようになります。
ただ、作成先のpathとかは、調整して作ってください。

`$ ./g.sh model Model IHM/Spectrum`

↓

`./+IHM/Spectrum.m`が作成されます。

## 解説を試みる

`$ ./g.sh model Model IHM/Spectrum`において、
./g.sh => $0
model  => $1
Model  => $2
IHM/Spectrum => $3
などと、shell script内で呼び出すことができます。

また、shell scriptでは代入文が
`a="$1"`
のように、スペース無しで書かないと行けません。
~/.bashrcなどで
`alias ll="ls -la"`
などとやる時と一緒っすね。

それで、自分で定義した変数は
`$ echo $a`
などとすると呼び出せます。
`$ echo $PWD`
もありっすよ。お試しあれ。

if syntaxは、fiで終わります。あとはコード読めば分かるかなと。
不明点あればご質問ください。

## 考えてること

<TEMPLATE AREA> >> $fp
のように書いてテンプレートをファイルに
書き込んでいましたが、もっとスマートな方法があると思います。

これ使って一気に

```
classdef TestClass < handle
  properties(Constant)
  end
end
```

などと一気に生成してくれたら嬉しいですね&ヘルシーですね。

これからも駆け出しシェル芸人として頑張っていこうと思います。
Vagrant使用手順メモ（AWS EC2使用）

<h2>Vagrantセットアップ</h2>
<ol>
<li>Vagrant本体インストール</li>
（<a href="https://www.vagrantup.com/" target="_blank">Vagrant公式サイト</a>を参照）
<br /><br />
<li>プラグインインストール</li>
<pre>$ vagrant plugin install vagrant-aws</pre>
<li>EC2用Box追加</li>
<pre>
$ vagrant box add dummy https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box
</pre>
<li>Vagrantfile作成</li>
<pre>
$ mkdir vagrant-sample
$ cd vagrant-sample
$ vagrant init
</pre>
<li>Vagrantfile編集</li>
以下、Vagrantfileの設定例
<pre>
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "dummy"

  config.vm.provider :aws do |aws, override|
    # AWS Access
    aws.access_key_id = ENV['AWS_ACCESS_KEY_ID']
    aws.secret_access_key = ENV['AWS_SECRET_ACCESS_KEY']
    aws.keypair_name = "KEYPAIR NAME"

    # Instance config
    aws.instance_type = "t2.micro"
    aws.region = "ap-northeast-1"
    aws.availability_zone =  "ap-northeast-1a"
    aws.ami = "ami-xxxxxxxx"
    aws.security_groups = ['SECURITY GROUP']
    aws.tags = {
      'Name' => 'Instance Name',
      'Description' => 'Instance Description'
    }

    # VPC config
    aws.subnet_id = "subnet-xxxxxxxx"

    # for Amazon Linux
    aws.user_data = "#!/bin/sh\nsed -i 's/^.*requiretty/#Defaults requiretty/' /etc/sudoers\n"

    # SSH
    override.ssh.username = "ec2-user"
    override.ssh.private_key_path = "private-key.pem"
    override.ssh.pty = true
  end
end
</pre>
（その他設定内容参考：<a href="https://github.com/mitchellh/vagrant-aws" target="_blank">mitchellh/vagrant-aws</a>）
<br /><br />
<li>AWSアクセスキー設定</li>
事前に取得したアクセスキーを環境変数に設定
<pre>
$ export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXX
$ export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
</pre>
</ol>

<h2>EC2インスタンス起動・終了</h2>
<ol>
<li>仮想マシン起動（EC2インスタンス生成）</li>
<pre>
$ vagrant up --provider=aws --no-provision
</pre>
<li>Provisioning実行</li>
<pre>
$ vagrant provision
</pre>
<li>終了（EC2インスタンス破棄）</li>
<pre>
$ vagrant destroy
</pre>
</ol>

<h2>仮想マシンその他操作一覧</h2>
<ul>
<li>SSH接続
<pre>
$ vagrant ssh
</pre></li>
<li>再起動
<pre>
$ vagrant reload
</pre></li>
<li>停止
<pre>
$ vagrant halt
</pre></li>
<li>状態確認
<pre>
$ vagrant status
</pre></li>
<li>SSH接続情報確認
<pre>
$ vagrant ssh-config
</pre></li>
</ul>

<h2>Vagrantその他プラグイン</h2>
<ul>
<li>AWS SDK
<pre>$ vagrant plugin install aws-sdk</pre></li>
<li>仮想マシンのProxy設定
<pre>$ vagrant plugin install vagrant-proxyconf</pre></li>
<li>仮想マシンにChef-Soloインストール
<pre>$ vagrant plugin install vagrant-omnibus</pre></li>
<li>サーバ構成テスト
<pre>$ vagrant plugin install vagrant-serverspec</pre></li>
<li>作成したインスタンスをAMI化
<pre>$ vagrant plugin install vagrant-ami</pre></li>
<li>仮想マシンの状態管理
<pre>$ vagrant plugin install sahara</pre></li>
</ul>
手軽な HTTP/HTTPS サーバコマンド

http や https サーバをローカルにサクッと立てたい時の便利コマンド。


## Local Server

local に HTTP サーバを立てたい場合、よくこんなのが使われている。

```sh
$ python2 -m SimpleHTTPServer
$ python3 -m http.server
```

ただ、あまり気に入ってなかった。

- 長い
- python のバージョンで変わる
- コマンドを https に変えても https サーバにはならない
- content-type を変えたい

特に HTTPS サーバは、 ServiceWorker 周りをいじる時に確認とかで便利なんだけど、証明書を作ったりが面倒。

ということで作り始めたコマンドが落ち着いて来たので載せておく。

## http/https コマンド

http か https と叩くだけでカレントにサーバが上がる。
デフォルトポートは 3000 で第一引数で指定もできる。
https は証明書の準備もいらない。

```sh
$ http
$ https 8443
```

https の証明書はコマンドがその都度、自己証明書を内部で生成するので、openssl コマンドとか使わないで済むので楽。(ただし、ブラウザでは毎回あのエラー画面を経由する必要がある、用意すれば一回で済むので自分は用意している)

また、例えば `.log` とか `.md` などのファイルがバイナリ扱いされて、ブラウザで開くとダウンロードされてしまうのを防ぐために、 content-type を設定できるようにしている。


## ソース

http, https でコマンド自体を分けたかったので、ほとんど重複するが 2 つのファイルにしてる。
色々やった結果、目的達成には Webrick が一番手軽だったのでそこに落ち着いた。

### http

```rb
#!/usr/bin/env ruby

require 'webrick'


# ここで自由に MIME を設定できるのが便利
mime = WEBrick::HTTPUtils::DefaultMimeTypes.merge({
  "js"       => "text/javascript",
  "json"     => "text/json",
  "log"      => "text/plain",
  "md"       => "text/plain",
  "markdown" => "text/plain",
})

port = ARGV.shift || 3000
config = {
  :Port         => port,
  :DocumentRoot => '.',
  :MimeTypes    => mime
}

server = WEBrick::HTTPServer.new(config)
Signal.trap('INT') { server.shutdown }
server.start
```

最新版はこちら。

https://github.com/Jxck/dotfiles/blob/master/bin/http

### https

証明書を自動生成してる以外ほぼ同じ。
コマンド自体を分けたいから内容はほぼ重複している。

```rb
#!/usr/bin/env ruby

require 'webrick'
require 'webrick/https'

port = ARGV.shift || 3000

# ここで自由に MIME を設定できるのが便利
mime = WEBrick::HTTPUtils::DefaultMimeTypes.merge({
  "js"       => "text/javascript",
  "json"     => "text/json",
  "log"      => "text/plain",
  "md"       => "text/plain",
  "markdown" => "text/plain",
})

config = {
  :Port         => port,
  :DocumentRoot => '.',
  :MimeTypes    => mime,
  :SSLEnable    => true,
  :SSLCertName  => [["CN", "devserver"]], # 証明書を自動で生成してくれる
}

server = WEBrick::HTTPServer.new(config)
Signal.trap('INT') { server.shutdown }
server.start
```

最新版はこちら

https://github.com/Jxck/dotfiles/blob/master/bin/https

## バックグラウンドで起動

簡単にログを抑制したり、バックグラウンドで起動しっぱなしにしたい場合のオプションを、以前はコマンドに含めていたが、最近は zsh でやっている。
どういうことかというと、 zsh はコマンドの途中にエイリアスを貼れるのでそれを使っている。

```sh
alias -g N="1>/dev/null 2>/dev/null"
alias -g B="1>/dev/null 2>/dev/null &"
```

これを使うと、コマンド自体にオプションを追加しないでも、汎用的なオプションみたいに定義できて、すべてコマンドで使えるので便利。

```sh
# N をつけるとログの抑制
$ http 1>/dev/null 2>/dev/null
$ http N

# B をつけるとさらにバックグラウンド化
$ http 1>/dev/null 2>/dev/null &
$ http B
```


## 停止

このコマンドに限らず、バックグラウンドプロセスは peco で探して kill するコマンドを作ってて、これでさくっと探して落とすようにしている。

```sh
alias killp="ps aux | peco | awk '{print \$2}' | xargs kill -9"

$ killp # これで http を探してエンター押すだけ
```

## 配置

こういうのも dotfiles に入れてパスを通してる。

[https://github.com/Jxck/dotfiles/blob/master/bin/http]
Webアプリケーションのデータ更新で楽観ロックを使う理由について

Javaプログラミング初心者です。 
排他的制御について質問させてください。 

私の使っているWebアプリケーションでは 
Webオンライン上で複数のユーザが同じデータを更新することが出来るシステムで、排他制御の仕組みを使っています。 
それが、まさしく楽観ロックなのですが、 
なぜ悲観ロックではなく、楽観ロックを使っているのでしょうか？ 

このようなWebアプリにおいて、 
悲観より楽観の方が適している理由やメリットなどを教えていただけると嬉しいです。
functions.phpに記述したショートコードを記事内に埋め込むと、記事よりも前に出力される件

#あらまし

記事内に記述したショートコード[pripara]を仕込むと、
wp_contentが読まれる直前に出力されてしまう問題が発生した。

```php

function shortcode_pripara($atts) {
  echo "サイリウムチェンジ！ぷりっ<br>";
  return;
}
add_shortcode('pripara', 'shortcode_pripara');
```

####2015-02-03追記
特に凝った事をしていなければ、returnで返せばOK。そうすべき。

```php
function shortcode_pripara($atts) {
  return "サイリウムチェンジ！ぷりっ<br>";
}
add_shortcode('pripara', 'shortcode_pripara');
```

しかし、出力が存在する外部のphpファイルを
（仕方なく）読み込まなくてはならない場合、wp_contentの直前に出力される。

```php

function shortcode_require_pri_ticket($atts) {
  require_once(dirname(__FILE__) . '/ticket/chanko.php');
  return;
}
add_shortcode('require_pri_ticket', 'shortcode_require_pri_ticket');
```


#どうしたか

phpの標準出力のバッファを利用する。

```php

function shortcode_require_pri_ticket($atts) {
  ob_start();

  require_once(dirname(__FILE__) . '/ticket/chanko.php');

  $output_string = ob_get_contents();
  ob_end_clean();
  return $output_string;
}
add_shortcode('require_pri_ticket', 'shortcode_require_pri_ticket');
```

##参考
[resolved] Plugin called via shortcode appears at the wrong place on post
https://wordpress.org/support/topic/plugin-called-via-shortcode-appears-at-the-wrong-place-on-post?replies=5
ZFS Install on CentOS


# Goal

* CentOSにZFSをインストールする
* zfs, zpoolコマンドを使えるようにする

# Manual

以下のインストラクションを参考
* http://zfsonlinux.org/epel.html

### yum install

```yum.conf
# exclude=kernel*
  # 上記行をコメントアウトする
```

```
sudo su -
cd /usr/local/src
yum localinstall --nogpgcheck https://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum localinstall --nogpgcheck http://archive.zfsonlinux.org/epel/zfs-release.el6.noarch.rpm
yum install kernel-devel zfs

## 
## 確認
## 
which zpool
```

### zpoolコマンドでinsmodエラーが発生する場合

zpoolコマンドが以下のエラーで動かない場合は、後述1, 2の手順でkernel-develとzfs, splをインストールし直す

```
zpool list
  # Failed to load ZFS module stack.
  # Load the module manually by running 'insmod <location>/zfs.ko' as root.
```

#### 1. kernel-develのバージョンをあわせる

kernel-develとkernelのバージョンがあわない場合は、以下のURLを参考にして、kernelバージョンをそろえる
* http://qiita.com/metheglin/items/60261f474ccdfb467574

```
rpm -qa | grep kernel-devel
  # kernel-develのバージョン確認
uname -r
  # kernelのバージョン確認
```

#### 2. 正しいkernel-develをもとに、dkmsコマンドでzfs, splビルドしなおす

```
## 
## dkms(Dynamic Kernel Module Support)
## http://en.wikipedia.org/wiki/Dynamic_Kernel_Module_Support
## linux kernel moduleを生成するコマンド
##
## ちなみにSPL(Solaris Porting Layer)はZFSに対応するためのSolaris APIを実装するLinuxカーネルモジュールらしい
## 

dkms status
  # spl, 0.6.3: added
  # zfs, 0.6.3: added

SPL_VERSION=0.6.3
ZFS_VERSION=0.6.3

dkms remove -m zfs -v ${ZFS_VERSION} --all
dkms remove -m spl -v ${SPL_VERSION} --all
dkms add -m spl -v ${SPL_VERSION}
dkms add -m zfs -v ${ZFS_VERSION}
dkms install -m spl -v ${SPL_VERSION}
dkms install -m zfs -v ${ZFS_VERSION}

## 
## 確認
## 

zpool list
  # no pools available
  # コマンドが正常に動くようになった！

```

# Environment

```
uname -a
  # Linux *** 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

cat /etc/issue
  # CentOS release 6.5 (Final)
  # Kernel \r on an \m
```

# References

* http://zfsonlinux.org/epel.html
* https://github.com/zfsonlinux/zfs/issues/1155
jpegをRGBに伸張

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <string.h>


//#include <B_Camera.h>

#define SCREENWIDTH 800
#define SCREENHEIGHT 480
#define	CAMERA_DEV	"/dev/video1"
#define DEVFILE "/dev/input/event0"
#define	SCREENSIZE			(SCREENWIDTH * SCREENHEIGHT * BYTES_PER_PIXCEL)
#define	RGB888(r, g, b) 	(((r) & 0xff) << 16 | \
							 ((g) & 0xff) <<  8 | \
							 ((b) & 0xff))


pthread_mutex_t mutex;
	extern char *jpeg_data;
	extern int fd_LCD;
	extern unsigned char *rgbdata;
	extern unsigned char *pfb;

int main(void)
{
	int index;
	int x0, y0;
	extern int x;
	extern int y;
	extern struct jpeg_decompress_struct cinfo;
	extern struct jpeg_error_mgr jerr;

	//FILE *infile;

	int img;
	extern int i, j;
	int image;
	int datasize,p;
	extern int width;
	extern int height;

	//ミューテックス取得
	pthread_mutex_lock(&mutex);

	//jpegをRGBに伸長
	// JPEGオブジェクトの初期化
	cinfo.err = jpeg_std_error( &jerr );
	jpeg_create_decompress( &cinfo );

	// ファイルを開く
	infile = fopen( "a.jpg", "rb" );
	jpeg_stdio_src( &cinfo, infile );

	// ヘッダの読み込み
	jpeg_read_header( &cinfo, TRUE );

	// 展開の開始
	jpeg_start_decompress( &cinfo );

	// 幅と高さの取得
	width = cinfo.output_width;
	height = cinfo.output_height;

	// イメージを保持するメモリ領域の確保と初期化
	img = (JSAMPARRAY)malloc( sizeof( JSAMPROW ) * height );
	for ( i = 0; i < height; i++ ) {
		img[i] = (JSAMPROW)calloc( sizeof( JSAMPLE ), 3 * width );
	}

	// 全イメージデータを取得	
	while( cinfo.output_scanline < cinfo.output_height ) {
		jpeg_read_scanlines( &cinfo,
			img + cinfo.output_scanline,
			cinfo.output_height - cinfo.output_scanline
		);
	}

	// JPEGオブジェクトの破棄
	jpeg_destroy_decompress( &cinfo );

	// RGB化して出力



	//ミューテックス開放
	pthread_mutex_unlock(&mutex);

	//エラー判別
	if(!(*jpeg_data = malloc(datasize))){

	perror("read(file)");

	return -1;
}

	//LCDに画像表示
	pfb[(y0 + y) * SCREENWIDTH + (x0 + x)] = *p++;
	

	//エラー判別




	return -1;
}
SpriteKitを試してみる1 炎とライト


タイトル通りなんですが、試しに炎、そしてそれが光源になるようにライト処理を足してみました。

![iphonePlay_2015011801.gif](https://qiita-image-store.s3.amazonaws.com/0/40693/fcf756c5-a518-fae1-ed2f-5372fb25b930.gif "iphonePlay_2015011801.gif")

1.Xcodeで新しいプロジェクトを作る際に、Gameを選択し、更にGame Technologyで「SpriteKit」を選択。

![スクリーンショット 2015-01-18 17.19.36.png](https://qiita-image-store.s3.amazonaws.com/0/40693/7cb7642a-707d-fec3-5713-808fc281b991.png "スクリーンショット 2015-01-18 17.19.36.png")

2.プロジェクトにファイル追加で「SpriteKit Particle File」を選択。

![スクリーンショット 2015-01-18 17.21.56.png](https://qiita-image-store.s3.amazonaws.com/0/40693/78042384-f803-cf63-af0e-ef40b063dbb1.png "スクリーンショット 2015-01-18 17.21.56.png")

3.火は色を好きに変えられるので、青にしてみました。

![スクリーンショット 2015-01-18 17.50.38.png](https://qiita-image-store.s3.amazonaws.com/0/40693/38af576b-d773-f841-7040-92b96d261eac.png "スクリーンショット 2015-01-18 17.50.38.png")

4.サンプルのタップイベントを上書きしてタップした場所に炎を出すようにする。炎を出してもそれは光源ではない。よって光源とするべく、炎を出した場所にライトを追加。光の色を炎と同じにしておく。


```GameScene.swift
 override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        /* Called when a touch begins */
        
        for touch: AnyObject in touches {
            let location = touch.locationInNode(self)
            
            
            let firePath = NSBundle.mainBundle().pathForResource("MyParticle", ofType: "sks")
            
            var fire = SKEmitterNode()
            fire = NSKeyedUnarchiver.unarchiveObjectWithFile(firePath!) as SKEmitterNode
            
            fire.xScale = CGFloat(0.5)
            fire.yScale = CGFloat(0.5)
            fire.position = location
            
            self.addChild(fire)
            
            let lightSprite = SKLightNode()
            lightSprite.position = location
            lightSprite.name = "lightSprite"
            lightSprite.categoryBitMask = 1
            lightSprite.lightColor = UIColor.blueColor()
            self.addChild(lightSprite)
            
            
        }
    }
   
```

5.光源があることによる影が出来るのはSKSpriteNodeだけなので、背景に追加。

```GameScene.swift
    override func didMoveToView(view: SKView) {
        /* Setup your scene here */
        let myLabel = SKLabelNode(fontNamed:"Chalkduster")
        myLabel.text = "Hello, World!";
        myLabel.fontSize = 65;
        myLabel.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame));
        self.addChild(myLabel)
        
        let sprite = SKSpriteNode(color: UIColor.grayColor(), size: CGSizeMake(300, 300))
        
        sprite.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame))
        sprite.lightingBitMask = 1
        
        self.addChild(sprite)
    }
```

以上、簡単におもしろい演出が出来ていいですね。どこかで利用出来たらいいなあ。
[CocoaPod] インストールした Pod の削除の仕方


#手順
1. 「Podfile」「Podfile.lock」 を削除
2. 「xcworkspace」 を削除
3. xcodeproj を開き、Frameworks グループ内の、「Pods.xcconfig」「libPods.a」 への参照を削除
4. Build Phases 内の「Copy Pods Resources」「Check Pods Manifest.lock」

#参考
* [How to remove CocoaPods from a project?](http://stackoverflow.com/questions/16427421/how-to-remove-cocoapods-from-a-project)
[CocoaPod] podspec がないプロジェクトを Pod で管理する


#やりたいこと
Dropbox SDK など、.podspec がないプロジェクトを Pod で管理したい

#前提
* 該当プロジェクトは、CocoaPod で管理されていない
* 該当プロジェクト内に、podspec がない

#解決方法
1. [tcurdt/cocoapods-specs](https://github.com/tcurdt/cocoapods-specs) からプロジェクトを探し、必要な .podspec のパスを得る
2. Podfile に記述する

```
pod 'Dropbox-iOS-SDK', :podspec => "https://raw.githubusercontent.com/tcurdt/cocoapods-specs/master/Dropbox-iOS-SDK/1.3.9/Dropbox-iOS-SDK.podspec"
```

#注意点
* github などにある podspec ファイルを参照する場合、パスには Raw ファイルを用いること

#参考
* [tcurdt/cocoapods-specs](https://github.com/tcurdt/cocoapods-specs)
* [CocoaPodsのライブラリを編集して使いたいとき](http://xoyip.hatenablog.com/entry/2014/03/07/194911)
Swift Mailerで本文の末尾が文字化けする現象について

### 追記

なにやらOSと異なる改行コードにすると、そもそもSMTP上にLFとかが出てしまうようで、SMTPサーバーによってはエラー応答で切断されたり、エラーにはならなくても変な文字化けになったりするようだ。

結論としては、文字列中の改行コードは、`PHP_EOL`に統一しなければならないと言うことのようだ。

---

PHPのメール送信ライブラリ、Swift Mailerでメール本文の末尾に謎の2文字（化けた感じの）が混入する現象に遭遇した。
詳しくは検証していないが、発生する条件に以下のようなものがあった。

* メールがISO-2022-JP、7bit、プレーンテキスト（日本語JISテキストメール）。
* `Swift_SmtpTransport`を使用している。
* PHPをWindows環境で実行している。（`PHP_EOL`がCR+LF）
* メール本文文字列の改行コードがLF。
* 発生していない状態でメール本文を1行増減すると発生する。（逆だと発生しなくなる。）
* 発生していない状態でメールヘッダのFrom、To、Subjectで折り返し行数が1行増減すると発生する。（逆だと発生しなくなる。）

解決方法としては、メール本文文字列の改行コードを`PHP_EOL`と一致させると言うものになる。
どのOSでも問題ないようにするには、改行コードを`PHP_EOL`に統一する置換処理が必要と思われる。
内部処理に`PHP_EOL`に依存する置換処理がある模様。
具体的に何が混入しているのかは検証していないが、JISの切り替えコードとか、SMTPに乗せるとき特有の問題かも知れない。

うっかりメール本文をヒアドキュメントで書いて、さらにソースコードを改行コードLFで保存してしまったために、この現象に遭遇した。

同じような文字化けをどこかのサービスでも見かけた気がするので、同じような問題があるのかも知れない。
世界の国とその地域名を入手する方法

世界の国とその地域名を入手する方法

Userモデルを使ってユーザーの出身国と州を入れてみる。

１. carmen-railsのgemを加える

```ruby:Gemfile
gem 'carmen-rails'
```

保存したらbundle installする。


２.country_codeとstate_codeのカラムをUserに作成する
`rails g migration AddCountryStateToUser`

```rb:db/migration/2015xxxxxxxxx_add_country_state_to_user.rb
class AddCountryStateToUser < ActiveRecord::Migration
  def change
    add_column :users, :country_code, :string
    add_column :users, :state_code, :string
  end
end
```

3.入力フォームを作っていく

```erb:users/_form.html.erb
<div class="field">
  <%= f.label :country_code %><br />
  <%= f.country_select :country_code, prompt: 'Please select a country' %>
</div>
<div class="field">
  <%= f.label :state_code %><br />
  <%= render partial: 'subregion_select', locals: {parent_region: f.object.country_code} %>
</div>
```

4.ビューにpartialの行き先を作成してあげる

```erb:users/_subregion_select.html.erb
<div id="user_state_code_wrapper">
  <% parent_region ||= params[:parent_region] %>
  <% country = Carmen::Country.coded(parent_region)  unless parent_region.nil? %>

  <% if country.nil? %>
    <em>Please select a country above</em>
  <% elsif country.subregions? %>
    <%= subregion_select(:user, :state_code, parent_region) %>
  <% else %>
    <%= text_field(:user, :state_code) %>
  <% end %>
</div>
```

5.javascriptに国名を入力した後に州を選択できるようコードを書いてあげる

```js:assets/javascripts/users.js.coffee
$ ->
  $('select#user_country_code').change (event) ->
    select_wrapper = $('#user_state_code_wrapper')

    $('select', select_wrapper).attr('disabled', true)

    country_code = $(this).val()

    url = "/users/subregion_options?parent_region=#{country_code}"
    select_wrapper.load(url)
```

6.ルートにユーザーの下にsubregionを加えてあげる

```rb:config/routes
resources :users do
    collection do
      get :subregion_options
    end
end
```

7.ユーザーコントローラーにsubregionを加えてあげる

```rb:controllers/users_controller.rb
  def subregion_options
    render partial: 'subregion_select'
  end
```

完成！！！！

参考サイト
https://github.com/jim/carmen-demo-app/
rubyで文字列 -> Timeをして、現在日時から7日以内かどうか確かめる


~~~
$ pry
[1] pry(main)> require 'active_support'
=> true
[2] pry(main)> require 'active_support/core_ext'
=> true
[3] pry(main)> str = '2015-01-01 00:00:00 +0900'
=> "2015-01-01 00:00:00 +0900"
[4] pry(main)> now = Time.now.in_time_zone('Asia/Tokyo')
=> Sun, 18 Jan 2015 17:13:35 JST +09:00
[5] pry(main)> (now - Time.parse(str)) <= 7.days
~~~

## 参考
- [ActiveSupportのCore Extensionだけを使いたい時のrequireの仕方に注意](http://qiita.com/seri_k/items/4818af527bd0e94cc860)
- [任意のタイムゾーンで出力する方法](http://qiita.com/semind/items/9614ded891d6154e9a06)
[自分用] rubyなメモ


#gemについて
	sudo gem install rubocop --no-rdoc --no-ri
	sudo gem install bundler --no-rdoc --no-ri
		
##全gem削除
	gem list | awk '{print "sudo gem uninstall " $1}' | sh -xiav
		
		

#bundlerについて
http://bundler.io/

##最初

対象のディレクトリで

	bundle init

`Gemfile`にgemを追記

##gemインストール
	bundle install --path vendor/bundle

pathを指定するとシステムに入らず、プロジェクト毎に管理できる
	
##tips
requireする時の名称とgemの名称が一致しない場合には、

	gem 'toml-rb', :require => 'toml'
	
- - -
不要なの削除

	bundle clean


##ruby
bundleで入れたやつ全てrequire

	require 'bundler'
	Bundler.require
iOSで何か作ってみる。その２

アプリを作っていて、
アプリのアイコンの設定ってどうやるんだろうと思い備忘録がてら書いておきます。
Sampleとかをネット上から持ってくると、
実行した際にアイコンの設定がされていなくて、
こんな感じに表示されていました。
![iOS Simulator Screen Shot 2015.01.18 14.47.49.png](https://qiita-image-store.s3.amazonaws.com/0/63125/b5cf9cfc-09f7-bd36-2229-6ac63367c6b6.png)

プロジェクトを作成すると、Images.xcassetsなるものがあり、
ここでアイコンの設定をやるらしい。

1.Images.xcassetsをクリックする。
![スクリーンショット 2015-01-18 14.38.48.png](https://qiita-image-store.s3.amazonaws.com/0/63125/772aff1f-ed83-a12c-e081-00ca2726e3b3.png)


2.AppIconをクリック。
![スクリーンショット 2015-01-18 14.43.02.png](https://qiita-image-store.s3.amazonaws.com/0/63125/49818699-5ac4-8182-694c-80657f78b332.png)

3.下みたいな画面が表示されるので、後はここにドラッグアンドドロップでいいみたい。
![スクリーンショット 2015-01-18 15.03.54.png](https://qiita-image-store.s3.amazonaws.com/0/63125/4c309e37-b29b-3f06-2822-f8e06b3acc70.png)

4.こんな感じ
![スクリーンショット 2015-01-18 16.31.39.png](https://qiita-image-store.s3.amazonaws.com/0/63125/f31d1013-d367-bbb6-2001-0ed0136e7a0c.png)

以外とサクッと行けちゃうのですね。
アイコンがくっつくだけで、なんかモチベーションがあがりました。
今度から、最初にアイコンを記載しようと思います。
![iOS Simulator Screen Shot 2015.01.18 16.37.28.png](https://qiita-image-store.s3.amazonaws.com/0/63125/1a4df03a-4344-9749-c87a-94b96671b31d.png)

きっと、起動画面もこんな感じなんでしょうね！

必要なサイズがいろいろあるみたいなので、
以下のサイト様を参考にして、バッチを利用させていただきました。
ありがとうございました。
http://www.lancork.net/2014/07/generate-ios-app-size-icons/

アイコンの作成ツールがわからなかったので
Keynoteで作成したのですが、いい方法ないですかね〜。
Entityに設定したValidationを直接使う


# CSVファイルもバリデーションしたい

通常のformからの入力だけではなく、CSVで一括入力などを実装する場合、Entityに設定したAnnotationなどで記載したValidationを流用したい場合があると思います。

# 実装例

controllerで、以下の通りに書くことができます。

```php:controller
$user = new user(); // Entity
$user->setName($row[0]); // $rowは、csvの値が詰まった配列

$validator = $this->get('validator');
$error = $validator->validate($user);
if ($error->count()) {
    // error発生
}
```

## ちょっと解説

ちょっと解説すると、一旦、userというEntityに、対象のCSVの値を詰めます。
そのご、validatorサービスを呼び出して、validateメソッドにCSVの値を詰めたEntityを渡すと、validationが実行され、結果が返されます。

その結果を、ユーザーに通知してあげれば、いいのです。
UE4でCドライブの容量を、復活させる方法

#【前提】
__・Unreal Engineのバージョンは特に限定しません。__
__・Windows版を前提に説明しています。__
__・記述手順の使用は自己責任でお願いします。ファイル削除が手順のメインであるため必要なファイルを削除してしまう可能性があります。__
__・用心のため、キャッシュフォルダを、他の大規模な別ドライブにバックアップをお勧めします。何かあったときに戻せるかもしれません。__

#【はじめに】
Unreal Engine4を使用していると、UE4本体、プロジェクトファイルもそうですが。
ハードディスクの容量不足に悩まされることが多いです。
UE4本体や、プロジェクトファイルはCドライブ以外に持っていくことは可能ですが。
それでも、エディタで使用しているキャッシュ、ログなどはCドライブに書きこまれてしまいます。
そういった、キャッシュのなかで、もう必要のないファイルを削除して、Cドライブの空きを確保します。

#【不要なキャッシュファイル】
まず、必ずUnrealEngineの__エディタ__及び__ランチャー__を停止（落とした）状態で作業してください。

__"C:\Users\あなたのアカウント\AppData\Local\UnrealEngine\"__
に以下のようにUEのバージョンごとにフォルダがあります。
__4.0__、__4.1__などがUE4のバージョンを表すようです。

基本は、使用していないバージョンのフォルダは、フォルダごと削除しても問題ないようです。
（ただし、バージョンのフォルダの容量が少ない場合は放置でも良いかも知れません。フォルダの容量がGB［ギガバイト］を超えるような場合は削除すると良いと思います）

![file2_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/314be783-3924-5b58-afd0-8c75aa4f6ba6.jpeg)

#【Commonキャッシュファイル】
ちょっと、リスクはありますが。多分、容量を復活させるのに一番効果が高いのがここのフォルダの削除です。

__"C:\Users\あなたのアカウント\AppData\Local\UnrealEngine\Common\DerivedDataCache"__
に以下のようにファイルがあります。
ここは、使用中、過去のゴミを含め、さまざまなキャッシュファイルが存在するため
削除すると、Cドライブの容量を増やす効果は高いですが。
現在、プロジェクトで使用中のシェーダのコンパイル結果なども保存されているようなので。
ここを数字のフォルダすべてを削除しますと、フォルダ削除後の最初に１回のみプロジェクトを開いたときに
再度、シェーダのコンパイル等が入り、削除後のエディタの初回の起動が遅くなります。
ただし、過去の不要なプルジェクトの、__ごみ__も溜まっているので、一度削除して、綺麗にしておくのも良いかもしれません。
![file1_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/f326a2bf-6078-94e7-0265-7fe1e780f64a.jpeg)

#【バージョンごとのファイル】
以下のように、使用していない過去のバージョンのファイルを削除するのが一番安全です。
__DerivedDataCache__内が大きくなっている可能性がありますので、ここを削除するのが一番効安全で効果的です。
![file3_3.jpg](https://qiita-image-store.s3.amazonaws.com/0/59114/497c1439-c6b9-0ee6-0bba-eabf21e9e2ea.jpeg)

#【まとめ】
__"C:\Users\あなたのアカウント\AppData\Local\UnrealEngine\Common\DerivedDataCache"__の配下を全て削除するのが一番効果的だがリスクがある。
__"C:\Users\あなたのアカウント\AppData\Local\UnrealEngine\"__の配下の使用していないバージョンのUEのフォルダの、フォルダ配下を削除する方法が今のところ安全。

以上です。

最後まで読んでいただきありがとうございます。
Rubyのloop文の使いドコロ


いまいちわかっていなかったが理解。

```Ruby
e = [1,2,3,4].to_enum

loop do
  p e.next
end

#1
#2
#3
#4
```

``` .to_enum ``` で Enumerator オブジェクトが取得できる。
Enumerator#next を使うことによって要素を1つ進める事ができる。

最後の要素の場合は、StopIteration という例外を発生させる。
loop は StopIteration をキャッチしてループを終了する。

### 使いドコロ

2つの配列を同時に進めたりする場合

```Ruby
a = [1,2,3,4]
b = ['a','b','c','d']

a.each_with_index do |v,i|
  p v
  p v[i]
end
```

とかやってた。
loop を使って以下のようにできる。

```Ruby
a = [1,2,3,4].to_enum
b = ['a','b','c','d'].to_enum

loop do
  p a.next
  p b.next
end
```
デスクトップの解像度を取得するワンライナー

```shell-session
xdpyinfo | grep dimensions | perl -pe 's|.*?(\d*x\d*).*|\1|'
1920x1200
```

最初上記の方法でやったけれど下でも可能

```shell-session
xdpyinfo | grep 'dimensions' | egrep -o '[0-9]+x[0-9]+' | head -1
1920x1200

```

まだまだ遠回りしている気がする
Express4 で、テンプレートファイルの拡張子を変更するには

#課題
MEAN スタックを試してみようと、express-generator でプロジェクト(EJS)を作成しました。
生成された views ファイルを、Bracket で編集し、ライブプレビューで見てみようとすると、

>ライブプレビューのエラーが発生しました。

拡張子が、ejs となっているため Bracket のライブプレビューで、表示できませんでした。


#どうする?

*Bracket のライブプレビューで、html 以外の拡張子を表示できるのか調べる
*Expressのテンプレートの拡張子を変更できるか調べる

#対処

Bracket の設定など調べてみたのですが....  分かりませんでした。

Express の拡張子を変更する方法を調べてみる

単純に、routes の view ファイルの指定と views ファイルの拡張子を変えてみる。

render のパラメーターを、index から index.html に変更

```lang:routes/index.js
var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index.html', { title: 'Express' });
});

module.exports = router;
```
views　のファイル名を変更

`index.ejs -> index.html`

ブラウザで確認すると、下記のエラーになりました。

```lang:http://localhost:3000/
Cannot find module 'html'

undefined

Error: Cannot find module 'html'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at Layer.handle [as handle_request] 
```

まずは、基本に返って express のページを見ると、変更方法が載っていました。

app.js に、拡張子と対応するテンプレートエンジンを、app.engine で指定

```lang:app.js
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

var routes = require('./routes/index');
var users = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

//  拡張子 htm,htmlのテンプレートエンジンを指定
app.engine('htm', require('ejs').renderFile);  　//  <--追加
app.engine('html', require('ejs').renderFile);   //　<--追加

// uncomment after placing your favicon in /public
//app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);
app.use('/users', users);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
    app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: err
        });
    });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
        message: err.message,
        error: {}
    });
});

module.exports = app;
```

無事、表示する事が出来ました。
デザイナと協業する時などに必要になるかな?

[参考URL](http://expressjs.com/api.html#app.engine)
coderunnerにswift追加


# メモ
- `CodeRunner > Preference > Languages`を開いて
- ＋押してSwift追加
- RunCommandにこれ書いて

```
xcrun swift -sdk $(xcrun --show-sdk-path --sdk /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk) $filename
```

- CodeTemplateにこれ書いて

```
import Foundation
    
%@
```

* FileExtensionにこれ入れる

```
swift
```
![Preferences.jpg](https://qiita-image-store.s3.amazonaws.com/0/47288/144ea7eb-f53c-696a-68a9-527e6743cc79.jpeg "Preferences.jpg")

# 参考
* [Swift Support in CodeRunner](http://oleb.net/blog/2014/06/swift-in-coderunner/)
DB(psql)をクリアする時に、 PKもリセットする。



DB(psql)で、サンプルデータを再生成時、`db:reset`せずに、
テーブルのすべてのデータをクリアして、サンプルデータを入れ直したら、
テーブルの **PK** がどんどんインクリメントされます。

その時に、**PK** をリセットする必要があります。
当方は `psql` を使用していますので、 `plsql` の **PK** のリセット方法のみメモします。

その他のdbに関してはインターネットにものっていると思いますので、
調べてみてください。

```rb

namespace :db do
  desc "Erase db and Fill db with sample data"

  task populate: :environment do
 
    # clear the table
    [Product, User].each(&:delete_all)

    ActiveRecord::Base.connection.tables.each do |table|
      puts("resetting #{table} pk sequence")
     
      # only effective when PostgreSQL
      ActiveRecord::Base.connection.reset_pk_sequence!(table)
    end

    # new data for user
    User.populate 20 do
    end  

    # new data for product
    Product.populate 20 do
    end

  end
end


```
nokogiriを調べてscrapeしてみた

bundle installする時に、たまに、nokogiriがinstallできませんというerrorがでるので、存在だけ存知上げていたnokogiri

web解析できるgemみたい。
[酒と泪とRubyとRails]を参考しました。
http://morizyun.github.io/blog/ruby-nokogiri-scraping-tutorial/

その他参考:
RubyではOpenURIを使うとウェブページを開くことができる。
OpenURIでは引数に与えたURIのプロトコルがHTTPリダイレクト先がHTTPSの場合、エラーが発生するという作りになっている。
http://xoyip.hatenablog.com/entry/2014/05/27/203000

使いたい言語によって、scrapingできるライブラリあるみたい。
http://cashew.hatenablog.com/entry/2014/03/21/183610
tap のブロックの中で break すると戻り値を返せる

つまり、こう。

```ruby
hoge.a=nil

hoge.a.tap{|x| break "nil !" unless x }

#=> "nil !"
```

知らなかった。

たとえば Ruby on Rails などを利用する場合、

```ruby
if @session.current_user.profile 
  "#{@session.current_user.profile.name} さん"
else
  "ログインしていません"
end
```
的なことをよくやることになりがち。

そんなイライラが貯まっているあなたには、もしかしたら使い道があるかも…　いや、読みづらいかな。ナシかな。

（例が rails 前提ではないのかというご指摘をいただき、それもそうかと修正しました。 @riocampos さん、ありがとうございます）
遠い世界の数式をRubyで解く

神奈川Ruby会議01のペアプロ大会のお題を解いてみました。
問題はこちら
http://nabetani.sakura.ne.jp/kanagawa.rb/evalex/

この解き方をする人は少ないと思ったけれど、出題者の鍋谷さんが、もっとエレガントに解いていました。
http://nabetani.sakura.ne.jp/kanagawa.rb/evalex/a2.html

```rb
class Fixnum
  def **(other)
    self|other
  end
  def /(other)
    self&other
  end
  def -(other)
    self+other
  end
  def ^(other)
    self*other
  end
end
class Bignum
  def **(other)
    self|other
  end
  def /(other)
    self&other
  end
  def -(other)
    self+other
  end
  def ^(other)
    self*other
  end
end

def solve(q)
  eval(q.tr('&+*','/\-\^').gsub('|','**'))
end

DATA.readlines.each do |line|
  no,q,a = line.strip.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans.to_s
  puts ans.to_s == a ? ' o' : ' x'
end
__END__
0	4*5+6&7|8	44
1	15*5	75
2	15+5	20
3	15&5	5
4	15|5	15
5	30*15*5	2250
6	30*15+5	600
7	30*15&5	150
8	30*15|5	450
9	30+15*5	225
10	30+15+5	50
11	30+15&5	35
12	30+15|5	45
13	30&15*5	70
14	30&15+5	19
15	30&15&5	4
16	30&15|5	14
17	30|15*5	155
18	30|15+5	36
19	30|15&5	5
20	30|15|5	31
21	1+2+3+4+5+6+7+8+9+10	55
22	1*2*3*4*5*6*7*8*9*10	3628800
23	1+2+3+4+5*6+7+8+9+10	600
24	1*2*3*4*5+6*7*8*9*10	1330560
25	1|2|4|8|16|32|64|128|256|512	1023
26	2046&2045&2043&2039&2031&2015&1983&1919&1791&1535	1024
27	0+1|7*6	42
28	6|4+2&9+4	10
29	0&6+1&6|4*2	0
30	4|4*7+7+4&9	56
31	9&8*2+3*1|2|7	280
32	230+83*751&176	50080
33	89+62465*94&84	5254536
34	668&925+398*562	599092
35	15|9+348*302&23&77	1452
36	3&3&6|7+3|5*3|2&4*4	0
37	7*6|7|7*1&7|7&3&8*3	0
38	896+316*209*264&728	2026464
39	1844+41*64|7906|66842	138965970
40	2&41&6884*69857+68083	0
41	2+3*9*3|6|7&0+3+3*6&8	0
42	895+400*988|549&237+488	938875
43	30*48&99036+140&33+75|645	22050
44	278+2033+53*96*56|3303|3&14	3177216
45	5380&27|643*2+1888&74+30|16	0
46	0&3845+6645*4293+78&78*3102|9|3	90127550385
47	78&44956&67*974|413+13237*5588|54*668	0
48	500*206+145|167|163|465&668+662+806*681&458	123896000
49	82+14&0*344+34+542916&18*11|844|64*873223|840993	23813260003764
50	374958|6727+53965&53*954&29|6*138572+59|547783&43*8998	12178274756590800
```
GitのHEAD, ORIG_HEAD, FETCH_HEAD, MERGE_HEADとは？

## はじめに

『Gitによるバージョン管理』を再読しています。昨日読んだところをざっくりと復習してみたいと思います。

主な内容はタイトルのとおりです。HEAD, ORIG_HEAD, FETCH_HEAD, MERGE_HEADについて書きたいと思います。

## 前準備

前準備として、Gitの概念を紹介します。しかし、詳しい説明ではありませんので、必要に応じて公式のドキュメントを参照していただければと思います。

まず知って欲しいことは、リポジトリとブランチです。リポジトリにはローカルリポジトリとリモートリポジトリがあります。ブランチにはローカルブランチとリモートブランチとリモートトラッキングブランチがあります。リモートトラッキングブランチ以外は特に難しいことはありません。そして、リモートトラッキングブランチも見た目ほど難しいことはありません。多分。

リモートトラッキングブランチだけ少し補足します。これはどこのリポジトリの何のブランチと関連しているかを記録したものだと思います。

例えば、あるローカルリポジトリで`$ git remote add <repo-name> <repo-url>`というコマンドを実行したときに、リモートトラッキングブランチは`repo-name/master`のように表されます。`repo-name`はリモートリポジトリの名前で、ユーザーが指定できます。`master`はリモートリポジトリのブランチ名です。

多分、もしローカルリポジトリのブランチが`test`であれば、リモートリポジトリのブランチも`test`になると思います。

ここではそういう概念があると知っているだけでよいです。この記事ではそれ以上のことを要求しません。もし興味があればこれらの単語で検索すれば、数分で理解できると思います。

次に知ってほしいことは、ワーキングツリーとインデックスです。ワーキングツリーとインデックスとリポジトリ。これら三つは兄弟のような関係です。ここでもそういう概念があると知っているだけでよいです。

感じとしては、ワーキングツリーで作業して、コミットしたい変更だけインデックスに登録して、コミットする。コミットすると、インデックスに登録した変更だけがリポジトリに記録される。そんな感じだと思います。

さて、本題です。Gitではリビジョン番号に連番を使いません。代わりに、ハッシュ値を使います。これは、大勢で開発するために発明されたアイデアです。

例えば、15番のリビジョン番号をAさんとBさんがチェックアウトしたとします。Aさんが作業して、コミットすると、リビジョン番号は16番になります。Bさんも同じです。つまり、リビジョン番号に連番を使うと、コミットをリビジョン番号で特定できないことがあります。この問題を回避するためにハッシュ値を使っているとのことです。

ちょっと複雑かもしれませんが、ここまでで三つの視点がありました。

- リポジトリとブランチ
- ワーキングツリーとインデックスとリポジトリ
- ハッシュ値

そして、今回この記事で紹介するHEAD, ORIG_HEAD, FETCH_HEAD, MERGE_HEADはハッシュ値の別名です。

## HEAD

最新のコミットに対するハッシュ値の別名です。

## ORIG_HEAD

最新の一つ手前のコミットに対するハッシュ値の別名です。

## FETCH_HEAD

`$ git clone ...`したときのリモートブランチの最新のコミットに対するハッシュ値の別名です。

## MERGE_HEAD

```
$ git checkout master
$ git merge <branch-name>
```

このようなコマンドを実行して、ローカルブランチ`<branch-name>`の変更をmasterブランチにマージしたとします。

このときのローカルブランチ`<branch-name>`の最新のコミットに対するハッシュ値の別名です。

## あとがき

私自身Gitの経験が浅いので、誤りに気付きましたら、お手数ですが、編集リクエストやコメントで教えていただけるとありがたいです。