OmniAICreator/Qiita-1.07M huggingface dataset:
空白をタブに変換

```coffeescript
# 空白をタブに変換(タブ文字は入っていない前提)
space2tab = (str,tabWidth=4) ->
	# tabWidth文字ずつ分解するための正規表現
	rePtn = new RegExp("(.{#{tabWidth}})")
	# 結果格納先
	ret = ""
	# tabWidthずつ区切って、右側の空白をタブ１文字に変換
	str.split(rePtn).forEach( (w) -> 
		ret += w.replace(/(\S*)\s+/,"$1\t") if w != ""
	)
	ret

console.log space2tab("abc def ghi",4)          == "abc\tdef\tghi"
console.log space2tab("abc     def     ghi",8)  == "abc\tdef\tghi"
console.log tab2space(space2tab("abc      def     ghi        jkl",8),8) == tab2space("abc\t def\t ghi\t    jkl",8)
console.log space2tab("    ") == "\t"
console.log space2tab("ab  cd") == "ab\tcd"
console.log space2tab("ab  cd      ef") == "ab\tcd\t\tef"


```
Ubuntuに最新のNode.jsをインストールする

nvmを使えばいいっていうウワサもあるけど、あえてapt-getでやってみる方法。

```bash
sudo add-apt-repository ppa:chris-lea/node.js  
sudo apt-get update  
sudo apt-get install nodejs
```

参考：[How to keep up with the latest versions of NodeJS in Ubuntu ? PPA ? Compiling?](http://stackoverflow.com/questions/7214474/how-to-keep-up-with-the-latest-versions-of-nodejs-in-ubuntu-ppa-compiling)
[ReactiveCocoa] RACCommand の挙動の確認

## RACCommand は エラー時も正常終了時も Completed が呼ばれる

```swift
class API {
  class func rac_login() -> RACSignal {
    return RACSignal.createSignal({ (subscriber) in
        // API call
        if error != nil {
          subscriber.sendError(error)
        } else {
          subscriber.sendCompleted()
        }
        return nil
    })
  }
}

let command = RACCommand(signalBlock: { _ in API.rac_login() })
command.executionSignals.subscribeNext({
  let signal = $0 as RACSignal
  signal.subscribeCompleted({  println("Error時もCompleted時もよばれちゃう。。") })
})
command.errors.subscribeNext({ println("こっちは Error時だけ呼ばれる \($0)") })

```

RACCommand の signal が sendError の時も sendCompleted も subscribeCompleted に入ってきてしまうことを確認するコードです。

エラーが起こった時には、`subscribeCompleted` と `errors.subscribeNext` の両方が呼ばれてしまい、エラーの時と正常終了時とで、処理をきっちり分けたいときとかに困っちゃいました。。

## エラー時と正常終了時で処理を分けたいときは

しかたがないので、API の結果を送るところで

```swift
  class func rac_login() -> RACSignal {
    return RACSignal.createSignal({ (subscriber) in
        // API call
        if error != nil {
          subscriber.sendError(error)
        } else {
          subscriber.sendNext(true)
          subscriber.sendCompleted()
        }
        return nil
    })
  }
```

ってして、`executionSignals.flatten()` で対応しました。。

```swift
command.executionSignals.flatten().subscribeNext({ println("こっちは正常終了の時だけ呼ばれる \($0)") })
command.errors.subscribeNext({ println("こっちはエラーの時だけ呼ばれる \($0)") })
```
git周り設定いろいろメモ

自分で何を設定したか忘れかけてたのでメモ


* .gitconfigの内容

```
vi ~/.gitconfig

#ログをグラフィカルに
[alias]
  graph = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
  graphall = log --graph --all --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative

#色はいい感じに
[color]
        ui = auto
```

* コマンドで今いるブランチを表示させる

```
vi ~/.bash_profile

# git settings
source ~/local/etc/bash_completion.d/git-prompt.sh
source ~/.git-completion.bash
GIT_PS1_SHOWDIRTYSTATE=true
PS1='\[\033[40;1;32m\]\u\[\033[2;32m\]@\[\033[0m\]\[\033[40;32m\]\h \[\033[1;36m\]\w \[\033[31m\]$(__git_ps1 "[%s]")\[\033[00m\] \[\033[0m\]\[\033[40;2;37m\]`date +"%Y/%m/%d %p %H:%M:%S"` \[\033[0m\]\n\\$ '
export PS1=$PS1
```

* sublime text2で、左下に今いるブランチを表示させる

たしか、gitパッケージを入れたら自然と表示されるようになった気がする・・・
tmuxで快適なターミナル生活を送ろう

# tmuxで快適なターミナル生活を送ろう

## tmuxとは

仮想の中で仮想端末を管理するもの。
GNUScreenをより強化したイメージ。

- 起動

```bash
tmux
```

- tmuxのセッション一覧

```bash
tmux list-session
```

- セッション番号を指定して起動していたtmuxを再起動

```bash
tmux attach -t セッション番号
```

## コマンド一覧

※Ctrl-b はデフォルト設定なので、.tmux.conf等でPrefixを変更した場合はそちらの方をお使いください。

| コマンド                    | 説明 |
|:----------------------------|:-----|
|Ctrl-b ?                     | ショートカット一覧 |
|Ctrl-b d                     | デタッチ |
|Ctrl-b w                     | ウィンドウ一覧 |
|Ctrl-b c                     | ウィンドウ生成 |
|Ctrl-b n                     | 次のウィンドウへ |
|Ctrl-b p                     | 前のウィンドウへ |
|Ctrl-b :                     | コマンドモードへ |
|Ctrl-b [                     | コピーモード開始 |
|Ctrl-b Ctrl-Space            | コピーモードでのコピー開始 |
|Ctrl-b ESC-w                 |コピーモードでのコピー終了 |
|Ctrl-b ]                     | コピーデータの貼付け |
|Ctrl-b q                     | ペインのインジケータを表示 |
|Ctrl-b t                     | 時計表示 |
|Ctrl-b %                     | ウインドウを左右ペインへ分割 |
|Ctrl-b "                     | ウインドウを上下ペインへ分割 |
|Ctrl-b o                     | アクティブなペインの移動（次のペインへ移動） |
|Ctrl-b x                     | ペインの破棄 |
|Ctrl-b Space                 |ペインレイアウトの変更（左右、上下） |
|Ctrl-b : resize-pane -U 数字 | 上部ペインのサイズ変更 |
|Ctrl-b : resize-pane -D 数字 | 下部ペインのサイズ変更 |
|Ctrl-b : resize-pane -L 数字 | 左ペインのサイズ変更 |
|Ctrl-b : resize-pane -R 数字 | 右ペインのサイズ変更 |

## .tmux.conf

.tmux.confとは、tmux起動時に呼び出される設定ファイルです。
~/.tmux.confに記述します。

### .tmux.confの例

```.tmux.conf
# prefixキーをC-qに変更
set -g prefix C-q

# C-bのキーバインドを解除
unbind C-b

# vimのキーバインドでペインを移動する
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# vimのキーバインドでペインをリサイズする
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5

# | でペインを縦分割する
bind | split-window -h

# | でペインを縦分割する
bind - split-window -v

# 番号基準値を変更
set-option -g base-index 1

# マウス操作を有効にする
setw -g mode-mouse on
set -g mouse-select-pane on
set -g mouse-resize-pane on
set -g mouse-select-window on

# ステータスバーの色を設定する
set -g status-fg white
set -g status-bg black

# コピーモードを設定する
## viのキーバインドを使用
setw -g mode-keys vi
```
IE8対策

IE8に対応するプロジェクトで、色々と面倒だったことをメモ。
はまった時はここにメモしていく予定。

・console.log残しておくとエラー
・jQueryでタイトル属性を変えるとエラー
```
$('title').text('hoge');
```
・appendChildで、子要素持てない要素にappendChildするとエラー
（そもそもそのロジックに問題があるというツッコミ…）
canhaveChildで事前にチェックする。
http://shim0mura.hatenadiary.jp/entry/20120202/1329438704
Backbone.jsで、送信時のパラメータを取得するには

# fetch()した時のパラメータを保持したい

### 実装方法
やりかたは下記を参考にしました。
http://d.hatena.ne.jp/heavenshell/20120929/1348885017

```
    model.fetch({
      // これらはデフォルトパラメータ
      success: _.bind(success, this),
      error: _.bind(failure, this),
      complete: _.bind(complete, this),

      // 受信時に見たいパラメータ
      hoge: hoge_id

    });
```

ってしとくと、

```
  // success時の引数optionに設定したパラメータが入る
  success: function(model, resp, option) {

    // 結果表示
    console.log(option.hoge_id, resp);

  },
```

ということができる。

### シチュエーション

送信時の状態と送信結果を対比させたい時や、
同じAPIに対して複数の通信が走る場合等に使えると思います。
タブ文字をスペースに変換する

```coffeescript
# タブをスペースに変換
tab2space = (str,tabWidth) ->
	return str if str.indexOf("\t") == -1
	str = str.replace(/([^\t]*?)\t(.*)/,(g0,l,r) ->
		amari = tabWidth - l.length % tabWidth 
		space = (" " for x in [1..amari]).join("")
		"#{l}#{space}#{r}"
	)
	tab2space(str,tabWidth) 

str = "abc\tdef\tghi"

# タブを４文字
console.log tab2space(str,4) == "abc def ghi"
# タブを８文字
console.log tab2space(str,8) == "abc     def     ghi"

str = "abcd\tdef\tghi"
console.log tab2space(str,4) == "abcd    def ghi"

```
最近のASP.NET周りのことについてまとめた (One ASP.NET, OWIN, ASP.NET vNext)

最近ではないかもしれませんがまとめました。

大雑把且つ正確では無い部分があるとは思いますが、なんとなく雰囲気は伝わると思います。

※ASP.NET vNext以降のことについては、以下のリンク先をご参照ください。わかりやすさ・正確さともに抜群です。(色々なことが変わりすぎて追い切れてません。。)

+ http://blog.shibayan.jp/entry/20141116/1416067227
+ https://ufcpp.wordpress.com/2014/11/13/net-for-every-developers-every-devices/


One ASP.NET
===

http://blogs.msdn.com/b/chack/archive/2013/12/02/one-asp.net-vision-visual-studio-2013-nuget-owin-and-future.aspx

みんな一つ！VS2013から。


OWIN
===

http://owin.org/ 

IISに依存しない.net webアプリ環境構築についての仕様。

非マイクロソフト発？


Katana Project
===

http://msdn.microsoft.com/ja-jp/magazine/dn451439.aspx

### 概要

マイクロソフトによるOWINの実装。

下記4つの領域で構成される。このうち、2と3について実装したものが提供されている。

1. Application → "HelloWorldWebApplication"アプリなどの開発者が作成するWebアプリケーション

2. Middleware → アプリに依存しないインフラストラクチャー層。クッキー機能やASP.NET MVCやWebApiなどのWebアプリケーションフレームワークが該当する。

3. Server → リクエストとMiddleware～Applicationの橋渡し役。IIS上で動くものや、セルフホスト方式で動くものあり。

4. Host → IISまたは各種アプリケーション


### 提供物

2. Middleware → Microsoft.Owin.Security.Cookies.dll(クッキー機能),  Microsoft.AspNet.WebApi.Owin.dll(WebApiフレームワーク) など...

3. Server → Microsoft.Owin.Host.SystemWeb.dll(Host=IIS用), Microsoft.Owin.Host.HttpListener(Host=セルフホスト用)


Helios
===

http://blog.shibayan.jp/entry/20131129/1385697458

http://www.infoq.com/jp/news/2014/03/helios

### 概要

OWINをIIS上で動かすためのライブラリ。

KaranaProjectのMicrosoft.Owin.Host.SystemWeb.dllはASP.NET上で動いていたが、Heliosは直接IISとやり取りするため、超高速。

その代わり、ASP.NET機能であるセッションやフォーム認証は別途用意する必要あり。(これらはMiddlewareとして公開されている。)

※2014/11/10時点で、アルファバージョンなので実務で使うのはまだ控えた方がよさそう。

### 提供物

1. Server → Microsoft.Owin.Host.IIS.dll


ASP.NET vNext
===

次世代のASP.NET。といってもVS2014なので割と近い将来。


ASP.NET 5
===

ASP.NET vNEXT が ASP.NET 5 に名称変更

VS2014もVS2015に名称変更

先日開かれた[Connect();](http://www.visualstudio.com/en-us/connect-event-live-vs.aspx)というMSのイベントで発表された。
Heroku に Rails 4.1.7 アプリをデプロイする


**環境**

- Ruby 2.1.4p265
- Rails 4.1.7

**サンプル**

- https://github.com/usutani/blog_heroku

**参照**

[Rails 4 on Heroku | Heroku Dev Center](https://devcenter.heroku.com/articles/rails4)
[Getting Started with Rails 4.x on Heroku | Heroku Dev Center](https://devcenter.heroku.com/articles/getting-started-with-rails4)
[Creating a 'Deploy to Heroku' Button | Heroku Dev Center](https://devcenter.heroku.com/articles/heroku-button)

# 仕込み
## アプリの作成

サンプルのRailsアプリを作成します。

```bash
rails _4.1.7_ new blog_heroku -B # bundle install しない
cd blog_heroku
```

Heroku(production)環境用にGemfileの「sqlite3」行を書き換えます。

```Gemfile
group :development do
  gem 'sqlite3'
end
group :production do
  gem 'pg'
  gem 'rails_12factor'
end
```

```bash
bundle install --without production
bundle exec rails g scaffold Post title body:text
```

```ruby:db/seeds.rb
1.upto(5) do |i|
  Post.create(title: "title #{i}", body: "body #{i}")
end
```

```bash
bundle exec rake db:migrate db:seed
```

```ruby:config/routes.rb
Rails.application.routes.draw do
  resources :posts
  root 'posts#index'
end
```

```bash
bundle exec rails s # ローカル環境で動作確認
```

## Herokuへデプロイ

```bash
git init
git add .
git commit -m 'Initial commit'
```

```bash
heroku create
heroku config:add SECRET_TOKEN="$(bundle exec rake secret)"
heroku config # コンフィグの確認
git push heroku master
heroku run rake db:migrate db:seed
heroku open
heroku logs -t # ログの確認
```

```bash
heroku run rails c
irb(main):002:0> Post.count
=> 5
irb(main):002:0> Post.first
=> #<Post id: 1, title: "title 1", ...
```

## Herokuアプリの削除

```bash
heroku info # アプリ名の確認
heroku destroy -a APP
```

# Herokuボタン

```bash
mv README.rdoc README.md
```

```README.md
[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy)
```

```app.json
{
  "scripts": {
    "postdeploy": "bundle exec rake db:migrate db:seed"
  },
  "env": {
    "RAILS_ENV": "production",
    "SECRET_TOKEN": {
      "description": "A secret key for verifying the integrity of signed cookies.",
      "generator": "secret"
    }
  },
  "addons": ["heroku-postgresql"]
}
```

```bash
git add .
git commit -m 'Heroku button'
git push origin master
```
## このページにボタンを置く

GitHub外にボタンを配置するのでtemplateでリポジトリを明示的に指定します。

```
[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy?template=https://github.com/usutani/blog_heroku)
```

[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy?template=https://github.com/usutani/blog_heroku)
pt-table-syncでmysqlのmasterとslaveの差分を吸収する

### 序
運用しているサーバ群でslave１号とslave２号に差分があることがわかった。
App側でカウントするとその数がたまに異なることがあることがあって発覚。

普通の運用上は起こりえないことだとは思いますが、Slave側で書き込める別権限でデータベースの操作を直接していたことで発生。

差分を埋めるために、percona-toolkitのpt-table-syncを使用したが、日本語のリファレンスがなくて結構苦戦したので、忘備録的に使用方法を記録する
なお、インストールはpecona-toolkitの本家でrpmをダウンロードしてインストールしてください。

**注意点**
全てのサーバにある程度の権限を持つ同名のユーザが必要。
pt-online-schema-changeを使うためにも割り切ってユーザを作ってしまいましょう。

### 整合性の検証 - pt-table-checksum
Masterに打つことでスレーブとの差分を確認できる
` pt-table-checksum (DSN)`
DSNにはサーバ情報への接続情報。カンマ区切りで記述する
> h=*** ホスト名
 u=*** ユーザ名
 p=*** パスワード
 D=*** データベース名
 t=*** テーブル名

データベースを指定して確認したい場合は、Dを設定していてもdatabasesオプションを入れる(DB分だけカンマ区切り)
`pt-table-checksum h=chksv.com,u=myiser,p=mypass,D=myDB,t=mytable --databases myDB`

うまくイケばめでたしだが、レプリケーションをするDBを指定していたり、レプリケーションをしないDB設定があると怒られる
(省略)
Please read the --check-replication-filters documentation to learn how to solve this problem.

--no-check-replication-filtersオプションを付ける
`pt-table-checksum --no-check-replication-filters h=chksv.com,u=myiser,p=mypass,D=myDB,t=mytable --databases myDB`


開発ではうまく動いたが、本番ではログフォーマットがMIXEDになってて、オプションつけて無理やりやると壊れるかもなんて脅されました。怖くてやっていません。
(追記2014/11/11:当社環境ではmasterがmysql5.1系でslaveが5.6系を使っていて、slaveの方で5.6オススメ設定になってるbinlog-formatがMIXEDなことがこの警告文の原因でした。
この設定の場合レプリケーションを破壊することはないと判断し、後日本番でも実行しました)

### 差分吸収ツール - pt-table-sync
うちでの用途はスレーブとの差分を吸収すること。
このツールの注意点として、マスターを更新することでスレーブに反映させること。
スレーブを一台ずつ運用を止めてやんわりと差分を吸収したかったのにできないっぽい



--sync-to-masterオプションと--replicaのオプションやらで色々な書き方ができるのだが、うちでの用途を満たす設定は２つ。
運用中のサーバに打つつもりなので後者を選択。

① マスターに命令を出して全サーバとの差分を潰す
`pt-table-sync --dry-run --replicate myDB.mytable h=master.chksv.com,u=myiser,p=mypass,D=myDB,t=mytable`

② １台のスレーブとの差分を潰す
`pt-table-sync --dry-run --replicate myDB.mytable --sync-to-master h=slave.chksv.com,u=myiser,p=mypass,D=myDB,t=mytable `

**ドハマりした点:**
DB名とテーブル名の指定を--replicateの後にも、DSN内にも両方記述しないと動かない。
なぜかはよくわからないけど、両方にかけば動く。書かないと動かない。

#### 実際に実行する
``` 
[接続確認］
pt-table-sync --dry-run --replicate myDB.mytable --sync-to-master h=slave.chksv.com,u=myiser,p=mypass,D=myDB,t=mytable

[差分の件数確認（大量のAlter文も生成されます）］
pt-table-sync --print --verbose --replicate myDB.mytable --sync-to-master h=slave.chksv.com,u=myiser,p=mypass,D=myDB,t=mytable

[実行］
pt-table-sync --execute --verbose --replicate myDB.mytable --sync-to-master h=slave.chksv.com,u=myiser,p=mypass,D=myDB,t=mytable
```

本来は件数の確認はpt-table-checksumでするべき。だけど、一応"--print --verbose"でも出力できる。
１台のスレーブとの差分を確認したいときはこれしかないのではないでしょうか。

また、実行前にはバックアップをきっちりと取ってから実行しましょう。マニュアルもなるべく目を通しましょう。
とはいえ、日本語資料がほぼなかったので、使ってみた事例として参考になれば。
[windows7+vagrant+chef+serverspec]環境構築で躓いた点

いくつかつまづいた点を記載

##ssh, rsyncがない
対策
MinGWを使う

![image](https://qiita-image-store.s3.amazonaws.com/0/20721/fd8303b5-f1da-48a0-b9c1-514a5160b04e.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/20721/646c57c3-2f8f-e6a0-2f70-9e605ad6fe98.png)

##serverspec実行時、ssh config情報をうまくよみとらない
対策
spec_helper.rbを変更する

```language:sh
$vagrant ssh-config >> ssh-config
```

```file:spec_helper.rb

- options = Net::SSH::Config.for(host)
+ options = Net::SSH::Config.for(host, files=["ssh-config"])
```

##serverspecの初期化時、Auto-configure from Vagrantfile　はno　にする
defaultだと、エラーになる。
http://qiita.com/a_ishidaaa/items/1f802fa7bb571bdb00ea
ターミナルからgyazoに画像をアップロードする

ドキュメントが間違っていたみたいで地味にハマって別のAPI使って解決していましたが、この度お問い合わせの返信が来て解決しました（2014/11/10時点）。

https://gyazo.com/api?lang=ja

## ユーザー登録

https://gyazo.com/signup

## アプリケーションを登録

https://gyazo.com/oauth/applications

`New Application`から

![new app](http://i.gyazo.com/350b8bd0457ca840419a4debd4aa2111.png)

NameとCallback URLは適当に

![create app](http://i.gyazo.com/c3308e0658eaa12a7bd766535fe1d5b6.png)


あとは作成したアプリケーションの詳細に飛んで、Access TokenをgenerateすればOKです。

## APIを叩く

[ドキュメント](https://gyazo.com/api/docs)にあるようにクエリとしてAccess Tokenをつけると失敗します。

```
$ curl -i https://upload.gyazo.com/api/upload?access_token=YOUR_ACCESS_TOKEN \
          -F "imagedata=@/home/gyazo/greaetpicture.png"
{"message":"You are not authorized."}
```

問い合わせたらAccess tokenはクエリに含めても認識しないとのこと。
以下のようにしたら成功しました。

```
$ curl -i https://upload.gyazo.com/api/upload -F access_token=YOUR_ACCESS_TOKEN \
          -F "imagedata=@/home/gyazo/greaetpicture.png"
```

今後どちらかが修正されるといいですね。
json を返すくせに CORS や jsonp 対応してない APIのための簡単 node.js proxy

ある API を使って js で single page app を実装しようかなと思ったら、 CORS や jsonp に対応していなくて残念だったので、 node.js で proxy っぽいものを実装してみました。

クライアント js から外部の API へアクセスするときはこんな感じ。

```js
$.get("/proxy?url=" + encodeURIComponent(apiUrl), function(result) {
    // Do somthing with the result.
});
```

アプリケーション本体の html, js など静的リソースは `/app` 以下に配置です。

```js:proxy.js
var http = require('http');
var request = require('request');
var express = require('express');
var app = express();

app.get('/proxy', function(req, res) {
  var url = req.query.url;
  var x = request(url);
  req.pipe(x);
  x.pipe(res);
});
app.use('/', express.static('app'));

var server = app.listen(8000, function(a) {
  console.log(a);
  console.log(server.address());
});
```
Herokuステージング環境作成


### 参考

* [Herokuのforkコマンドで簡単に既存の本番環境からステージング環境を作る。 - Qiita](http://qiita.com/kimihito_/items/97b8cb482e39cc348afc)
* [Heroku で既存の本番環境をコピーしてステージング環境を作る - Qiita](http://qiita.com/ken_c_lo/items/32998d9dd79a15b75c14)

----

### Herokuアプリフォーク

```
heroku fork -a APPNAME APPNAME-staging
```

※アドオンも全てコピーされるため有料プランを使っている場合などは注意

### git remote追加

```
git remote add staging git@heroku.com:APPNAME-staging.git
```

### ステージングへ環境変更

```
heroku config:set RACK_ENV=staging RAILS_ENV=staging --remote staging
```

### 設定ファイルコピー

```
cp config/environments/production.rb config/environments/staging.rb
```

### 設定追加


* シークレットキー設定

config/secrets.yml

```yaml
staging:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
```

* シークレットキーHeroku登録

キー作成

```
rake secret
----------
0304acfda4a421d8bc9761d691bf2c27ae4629d144f5eb78a228488c22d8dae737f945ac6c8f55beb563dbcf53c1a02eaedcb6b36cf7d0c5d80dce883231a5eb
----------
```

キー登録

```
heroku config:set SECRET_KEY_BASE='0304acfda4a421d8bc9761d691bf2c27ae4629d144f5eb78a228488c22d8dae737f945ac6c8f55beb563dbcf53c1a02eaedcb6b36cf7d0c5d80dce883231a5eb' --remote staging
```

### ステージングデプロイ

* stagingブランチをリモートのmasterブランチにpush

```
git push staging staging:master && heroku run rake db:migrate --remote staging
```

### ステージングサイト確認

```
heroku open --remote staging
```
(覚え書き) col redmine 1.4 → redmine 2.3

2013/04/01 ごろの作業
右往左往しました。

# redmine2.3へ


既に準備はおわっているので1.4へのアップデートと同じ事をやります。

まずは本サーバにredmine1.4.7を持ってきて展開。さらにファイルをコピー

```bash
$ sudo cp /var/www/redmine-1.4.7/db/redmine.db /var/www/redmine-2.3.0/db/
$ sudo cp /var/www/redmine-1.4.7/config/database.yml /var/www/redmine-2.3.0/config
$ sudo cp /var/www/redmine-1.4.7/config/configuration.yml /var/www/redmine-2.3.0/config
$ sudo cp -arf /var/www/redmine-1.4.7/files/ /var/www/redmine-2.3.0
$ sudo cp -arf /var/www/redmine-1.4.7/public/themes /var/www/redmine-2.3.0/public
```

# redmine2.3.0にアップデート

これで運が良ければ動くはず・・・ですがまたも無理でした。また面倒なので全部 root で作業します。

```bash
# cd /var/www/redmine-2.3.0
# rake generate_secret_token
```

またも同じくbuldle install を実行しなさい、とエラーが出ます。

```bash
# bundle install --without development test
```

こんどはすんなりいきました（うろ覚え。たぶん・・・）。

```bash
# rake generate_session_store
# rake db:migrate RAILS_ENV="production"
```

結構rootでよごしたのでお掃除。

```bash
# chown -R redmine:redmine /var/www/redmine-2.3.0
# ln -s /var/www/html/redmine /var/www/redmine-2.3.0/public
# service httpd restart
```

log にエラーが。sqlite3のデータベースファイルの設定名称が dbfile から database に変わったようだ。
config/database.yml を修正して起動。
これでとりあえず動いた(ような気がする config.ru のコピーもやったような気もする）

# MySQL 5.6を使う

sqlite3 はパフォーマンス的につらくなってきた気がするので(60MB程度）、将来のためにもmysqlに変えておきたい。
yaml_db のプラグインを使うしかない、という説明ばかりだが redmine2 からはscript/plugin はなくなっている模様なので(ruby?rails?の流儀?)githubから直接zipでもってきて pluginフォルダに展開。

普通はgemfileに必要なプラグインを記述してbundle install するというのが流儀だそうだ。

でどこのWebページにも書いてあるように実行

```bash
# rake db:dump RAILS_ENV=production
```

速攻でエラー。意気消沈。今思えば何とかできたような気もするがこのときは諦めてしまった。

# 1.4系で yaml_db

2.3系でだめなら1.4系で（Webでも1.x系のサンプルばかりなので）やってみる。

```bash
# cd /var/www/redmine-1.4.7
# script/plugin install git://github.com/adamwiggins/yaml_db.git
# rake db:dump RAILS_ENV=production
（database.yml を MySQLのものに修正)
# rake db:load RAILS_ENV=production
```

ここからが時間がかかるが結局２度コード修正をした。

* (dump) UTF-8で扱えない文字が入っていた
→ 例外をキャッチして空文字列として扱うようにした
* (restore) DBに入りきらないほど長いデータが入っていた
→ 例外をキャッチするのは面倒だったので元データから削除
* (restore) 上記対応のせいか何らかのループに空要素を渡したようで nil アクセスで落ちる
→ nil チェックをするようにコード修正

エラーが発生すると全部やり直しなので２～３時間ほど費やしてしました。
なんとかMySQLに移行完了。

# 再び redmine 2.3.0 にアップデート

再び2.3系で database.yml をMySQLに変更してmigration実行

```bash
# rake generate_session_store
# rake db:migrate RAILS_ENV="production"
# service httpd restart
```

これでMySQLベースになりました。
で、この後 お世話になっているwork_timeのプラグインを入れて使えるのかどうか試してみました。

```bash
# rake db:migrate:plugins RAILS_ENV=production
```

migration失敗します ＞＜
DBのアップデートにことごとく失敗するようですので結局work_timeに関連するDBを全部dropしました。
これでもう一度migrationしてようやく正常動作。
CSSだけでふきだしを出す

##CSS3でふきだし##

下記サイトを参考に、上からふわっと表示させる吹き出しを作成。

●参考サイト
http://js.crap.jp/book/chapter2/icon-effect.html


```lang:HTML
<div class="container">
  <!-- CSSだけでふき出し -->
  <section class="section-deco">
    <ul><!--
   --><li>
         <a class="icon-a"><span class="span-balloon">ペコッ</span></a>
      </li><!--
   --><li>
         <a class="icon-b"><span class="span-balloon">ポコッ</span></a>
      </li><!--
  --></ul>
  </section>
  <!-- //CSSだけでふき出し -->
</div>
```

```lang:CSS
@charset "UTF-8";


/*====================================
    Reset
====================================*/

*{  margin:0;
    padding:0;
    border:none;
}

/*====================================
    装飾
====================================*/

.container { width: 720px; margin: 40px auto;}

section {
  width: 480px;
  margin: 0 auto;
  background: #fff;
  -webkit-box-shadow: 0px -1px 3px rgba(100, 100, 100, .4);
  box-shadow: 0px 1px 3px rgba(100, 100, 100, .4);
}
p {
  float: left;
  display: block;
  text-align: left;
  font-size: 16px;
  margin: 0 auto;
  color: #838694;
  padding: 20px 20px 10px 30px;
}

/* icon */
ul { padding: 20px 30px 10px;}
ul li {
  display: inline-block;
  width: 30px;
  margin-right: 20px;
}

/* =========================================
  icon
========================================= */

a.icon-a,
a.icon-b {
  display: block;
  width: 26px;
  height: 26px;
  padding: 0 2px;
}
/* 通常のicon画像 */
a.icon-a {
  background: url(デフォルトのimg.png) no-repeat;
}
a.icon-b {
  background: url(デフォルトのimg.png) no-repeat;
}
/* hoverのアニメーション */
a.icon-a:hover,
a.icon-b:hover {
  -webkit-box-sizing: border-box;
  box-sizing: border-box;
  -webkit-transition: all .25s;
  transition: all .25s;
}
/* hoverした時のicon画像 */
a.icon-a:hover {
  background: url(hover時のimg.png) no-repeat;
}
a.icon-b:hover {
  background: url(hover時のimg.png) no-repeat;
}


/* =========================================
  ふきだしの四角ボックスの設定
========================================= */

ul a{
  position: relative;/* aタグを起点に各ふきだしの位置を設定*/
  text-align: center;
}

ul a span{
  position: absolute;
  letter-spacing: .1rem;
  top: -38px;/* 上からふわっとさせる為に */
  left: -25px;
  width: 60px;/*吹き出しの四角の幅*/
  padding: 6px 10px;
  background: #fff;
  /* アニメーション用の設定 */
  transition: .3s;
  opacity: 0;
  /* 装飾 */
  -webkit-box-shadow: 0px 1px 3px rgba(100,100,100, .5);
  -mz-box-shadow: 0px 1px 3px rgba(100,100,100, .5);
  -moz-box-shadow: 0px 1px 3px rgba(100,100,100, .5);
  box-shadow:0px 1px 3px rgba(100,100,100, .5);
  color: #666;
  font-size: 14px;
  line-height: 1;
}


/* =========================================
  吹き出しのやじるしの設定
========================================= */

ul a span:before{
  position: absolute;
  top: 100%;
  left: 30px;/*中央にarrowがきてほしかったので、吹き出しの四角の幅/2 ぶん*/
  height: 0;
  width: 0;
  border: 6px solid transparent;
  border-top: 8px solid rgba(100,100,100, .3);
  content: "";
}
ul a span:after{
  position: absolute;
  top: 100%;
  left: 30px;/*中央にarrowがきてほしかったので、吹き出しの四角の幅/2 ぶん*/
  height: 0;
  width: 0;
  border: 6px solid transparent;
  border-top: 6px solid #fff;
  content: "";
}
ul a:hover span{
  opacity: 1;
  top: -35px;
}
```
TypeScriptのオーバーロードしたメソッドにJSDocコメントを書く時の注意点

TypeScriptでJSDoc（実際はYUIDoc）のドキュメント生成を試してたら、ちょっと面白い現象が起こったので記事にしてみました。

<br>

## メソッドのオーバーロードの書き方

TypeScriptにおけるメソッドのオーバーロードの書き方は以下の通りですが、

```ts:HogeClass.ts
// オーバーロード定義
public prop(key:string, value:string):void;
public prop(object:Object):void;

// メソッド本体
public prop(key:string, value?:string):void {
	...
}
```

これにJSDocコメントを追加してみます。

<br>

## JSファイルにコンパイル

最初は以下の感じで書いてみたんですが、

```ts:HogeClass.ts
/**
 * ここにJSDocコメント
 */
public prop(key:string, value:string):void;
public prop(object:Object):void;
public prop(key:string, value?:string):void {
	...
}
```

これをJSファイルにコンパイルすると、

```js:HogeClass.js
// JSDocコメントが無い！
HogeClass.prototype.prop= function (key, value) {
	...
}
```

JSDocコメントがすっぽり抜けちゃいます。

**メソッドのオーバロード定義はコンパイルするとJSファイルからは取り除かれるので、どうやら直前に書いていたコメントも一緒に消えてしまうみたいです。**

<br>

代わりにメソッド本体の直前にJSDocコメントを書いてから

```ts:HogeClass.ts
public prop(key:string, value:string):void;
public prop(object:Object):void;
/**
 * ここにJSDocコメント
 */
public prop(key:string, value?:string):void {
	...
}
```

コンパイルしてみます。


```js:HogeClass.js
/**
 * ここにJSDocコメント
 */
HogeClass.prototype.prop= function (key, value) {
	...
}
```

今度は上手くいきました。

<br>

## d.tsファイルを生成

さて、このままd.tsファイルも作ってみましたが、


```ts:HogeClass.d.ts
// ここにJSDocコメントが無い！
public prop(key:string, value:string):void;
public prop(object:Object):void;
```

またJSDocコメントがすっぽり抜けちゃいます。

**今度はメソッド本体の方が取り除かれるので、その直前に書いたコメントも一緒に削除されてしまうようです。**

<br>

また最初に戻って、オーバーロード定義の直前にJSDocコメントを書いてから、

```ts:HogeClass.ts
/**
 * ここにJSDocコメント
 */
public prop(key:string, value:string):void;
public prop(object:Object):void;
public prop(key:string, value?:string):void {
	...
}
```

d.tsファイルを生成すると、

```ts:HogeClass.d.ts
/**
 * ここにJSDocコメント
 */
public prop(key:string, value:string):void;
public prop(object:Object):void;
```

今度は上手くいきました。

<br>

完全に間逆ですね。

<br>

## 正解

てことで、JSファイルとd.tsファイルの両方にJSDocコメントを残すやり方は、


```ts:HogeClass.ts
/**
 * ここにJSDocコメント
 */
public prop(key:string, value:string):void;
public prop(object:Object):void;
/**
 * ここにJSDocコメント
 */
public prop(key:string, value?:string):void {
	...
}
```

**オーバーロード定義とメソッド本体の両方に書くでした。**

```js:HogeClass.js
/**
 * ここにJSDocコメント
 */
HogeClass.prototype.prop= function (key, value) {
	...
}
```

```ts:HogeClass.d.ts
/**
 * ここにJSDocコメント
 */
public prop(key:string, value:string):void;
public prop(object:Object):void;
```

<br>

なにこれ、面倒。。。
【Swift3系を追記】Swiftで開発している人必見！ターミナルでSwiftのバージョンを確認する方法


Swiftを触り始めてる方が段々、増えてきた様に感じますが、Swiftのバージョンを
把握していない方は多いのではないかと思います。。。
(僕もXcodeのバージョンは追うので精一杯でした。。。)

<b>コマンド(ターミナルで実行)</b>

```
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -v
```

<b>結果</b>

```

Swift version 1.1 (swift-600.0.54.20)
Target: x86_64-apple-darwin13.4.0

```
最新バージョンになっていたのでとりあえず一安心。

その後にコマンドラインに移動したので、
最初に「:」
次に「q」
でターミナルに戻れました。

### 追記
2017/2/18時点での結果は以下の通り
(コマンド内容は上記のままで問題ありませんでした。)

![スクリーンショット 2017-02-18 11.16.25.png](https://qiita-image-store.s3.amazonaws.com/0/15812/3b59363f-9cac-842e-b200-6262f69b4849.png "スクリーンショット 2017-02-18 11.16.25.png")


```

Apple Swift version 3.0.2 (swiftlang-800.0.63 clang-800.0.42.1)

```
続・ホストを汚したくないので開発環境としてDocker使ってるけど何とかテストしたい話

# 結論
ShellScriptを用意しなくても`docker exec`で十分。
`Dockerfile`で`USER`と`WORKDIR`指定すれば、`docker exec container phpunit`でテスト可能。

# 前置き
以前、[ホストを汚したくないので開発環境としてDocker使ってるけど何とかテストしたい話](http://qiita.com/A-gen/items/5f6b1523fd88a47b7350)なんて記事を書きました。
当時は、多分この方法が一番楽と思ってたんですけど、Docker1.3になってから、[execというコマンドが追加](http://blog.docker.com/2014/10/docker-1-3-signed-images-process-injection-security-options-mac-shared-directories/)されました。
これめちゃくちゃ便利ですね。便利な上に楽。なので、これ使って書き直してみます。

# さっそくはまった
実はこれ書きながら試行錯誤してるんですけど、SSH接続してコマンド投げる部分を`exec`に置き換えりゃいいと思ってたんですね。
無理でしたけど。`cd`さえ許してくれませんでした；
そもそも、`nsinit`とか`nsenter`なんてものを後から知ったもので、何が出来るのか全然把握してないんですよね。

# いろいろ検証
`docker exec container env`してみると、どうも`$HOME`さえ設定されてない模様。そもそもユーザーがroot？
なので、ちょっと確かめてみました。

```:Dockerfile
FROM ubuntu:14.04

RUN adduser --disabled-password --gecos "Webapp" webapp

RUN mkdir /home/webapp/app

USER webapp
WORKDIR /home/webapp/app
```

```shell-session
$ docker build -t agen/exectest .
$ docker run -i -t agen/exectest --name exectest /bin/bash
$ docker exec exectest whoami
webapp
$ docker exec exectest pwd
/home/webapp/app
```

ちうわけで、`Dockerfile`に`USER`として明記してやれば、それでちゃんと思った通りのユーザー切替ができます。
\# `$HOME`はありませんでした。。。
\# まあ必要かって言われると必要じゃないので、別にいいんですけど。

ところで、じゃあSupervisorとか使ってるとどうなるかというと、ルート権限がないって怒られるわけです。
じゃあどうすればいいかっていうと、`CMD ["sudo", "supervisord"]`とかしてやればいいです。
`sudoer`に追加してあげないと、たぶんパスワード入力しろって怒られるような気もしてます。

# 以上を踏まえて
新生・コンテナの中のPHPUnitを叩く君は以下のようになります。

```bash:command.sh
#!/bin/bash

CONTAINER_NAME=exectest

docker exec $CONTAINER_NAME $@
```

・・・これ別にShellScriptにしなくていいですよね？　というわけで結論。

# 追記
こんなことのためにDockerfile弄るのも悔しいというか、何とかできないと思ってたところ、よくよく考えると↓でいいんじゃないかと思い始めた。

```bash:command.sh
#!/bin/bash

CONTAINER_NAME=exectest

docker exec $CONTAINER_NAME su -l webapp -c "cd /home/webapp/app; $*"
```

盲点。。。
北大の wifi への login を自動化

#本文
北大の圖書館等では wifi (elms-g) を利用できる．しかし，

![login](http://s30.postimg.org/vb7qgj5ap/elm2.png)
のやうな login 作業が必要になり，少し手間である．そこでこれを自動化してみた．

次のやうに ruby script を書いた：

```elms-g_login.rb
require 'mechanize'

username = '*****' # your id
password = '*****' # your password

agent = Mechanize.new
agent.get('https://webauth.ec.hokudai.ac.jp:8888/login-page1.html') do |page|
  page.forms[0].tap do |form|
    form.field_with(:name => 'name').value = username
    form.field_with(:name => 'pass').value = password
  end.click_button
end
```

これを實行すれば，問題なく wifi に login できる．

なほ，私の使つてゐる ruby の version は， 1.9.3p194 (2012-04-20 revision 35410) である．他の version では不工合が出るかもしれない．

#謝辭
北大の學内 wifi への login を自動化するといふ發想は， [mole-studio](http://d.hatena.ne.jp/mole-studio/20130614) からいただきました．ありがたうございます．

riocampos さんのご指摘により

```elms-g_login.rb
require 'rubygems'
```

を削除しました．ありがたうございます．
NetBeansでJavaEE7が選択項目にでないときの解決策


以前にNetBeansをインストールしている場合、最新のNetBeansをインストールしても、最新のJavaEEを選択できないことがあるみたいです。

## 解決策：Apache Tomcatの場合

NetBeans（プロジェクト）に関連付けられているTomcatのバージョンが7になっていると思います。Tomcat7はJavaEE6をサポートし、Tomcat8はJavaEE8をサポートしています。JavaEE7の対応をさせたい場合、Tomcat8のサーバをNetBeansに追加しましょう。

下のURLから最新のTomcat8をダウンロードし、適当な場所に展開する
http://tomcat.apache.org/download-80.cgi
(迷ったらBinary Distributions Coreのzip)

複数サーバを運用する場合、sever.xmlを編集しポート番号を調整する必要が有ります。展開したtomcatフォルダのconfディレクトリにあるserver.xmlを編集してください。そのほか必要に応じてファイルの編集をおこなってください。

1. サービスタブをクリック
1. ツーリー上の[サーバー]を右クリックしサーバを追加
1. サーバの追加で先ほど展開したtomcat8のフォルダを選択
1. 区別しやすいように名前をつける

以上の手順で、次回からJava EE7を利用できるようになります。

### 追記：「catalina.shが実行できない」という趣旨のエラーがでたときの対処方法

1. ターミナルで先ほどの「tomcatフォルダ/bin/」に移動する
1. ```chmod 755 catalina.sh```を実行する。

### その他起動できないとき

1. 他におなじポート番号で起動しているサーバがないか確認。起動しているサーバがあれば、該当サーバを停止してから、NetBeansのサーバを起動する

## 解決策：GlassFish Serverの場合

### NetBeanのIDE

1. サービスタブをクリック
1. ツーリー上の[サーバー]を展開し、GlassFishをダブクリック
1. GlassFishを右クリックし、[ドメイン・アップデート・センター]の表示を選択

### ドメイン・アップデート・センター

1. JavaEE7Tutorialにチェックを入れて「↓（install marked components）」のボタンをクリック
1. Installed Componentsで Java EE7 Tutorialがあれば大丈夫です

![macPng 2014-11-10 15.01.21.png](https://qiita-image-store.s3.amazonaws.com/0/49263/d633a8f3-b374-7f66-f074-8dccaf9258b2.png "macPng 2014-11-10 15.01.21.png")

# 　終わりに

## 参考

https://docs.oracle.com/javaee/7/tutorial/doc/usingexamples008.htm#GIQWR

Unable to create Java Web EE 7 project in Netbeans7.3.1
http://stackoverflow.com/questions/19509724/unable-to-create-java-web-ee-7-project-in-netbeans7-3-1
Amazon Linuxにjdk1.7 or 1.8インストール

## ダウンロード＆インストール

### jdk8

```bash
$ wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u25-b17/jdk-8u25-linux-x64.rpm"
$ sudo rpm -ivh jdk-8u25-linux-x64.rpm
```

### jdk7

```bash
$ wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/7u72-b14/jdk-7u72-linux-x64.rpm"
$ sudo rpm -ivh jdk-7u72-linux-x64.rpm
```

### ここからもダウンロードできます

#### jdk8

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

#### jdk7
http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

## インストール先

```bash
$ ll /usr/java/
total 4
lrwxrwxrwx 1 root root   16 Nov 10 15:40 default -> /usr/java/latest
drwxr-xr-x 9 root root 4096 Nov 10 15:40 jdk1.8.0_25
lrwxrwxrwx 1 root root   21 Nov 10 15:40 latest -> /usr/java/jdk1.8.0_25
```

## バージョン指定実行コマンド作成

### java8

```bash
$ sudo ln -s /usr/java/jdk1.8.0_25/bin/java /usr/bin/java8
```

### java7

```bash
$ sudo ln -s /usr/java/jdk1.7.0_72/bin/java /usr/bin/java7
```

## javaコマンドのリンクを変更

```bash
$ sudo rm /usr/bin/java
$ sudo ln -s /usr/bin/java8 /usr/bin/java
```

alternativesというのを使うといいみたいですが調べきれていません。

## 確認

```bash
$ java -version
java version "1.8.0_25"
```
React.js で twemoji を使う



この前 Twitter から公開された絵文字ライブラリ [twemoji](http://twitter.github.io/twemoji/) を React.js でレンダリングされる DOM 内で使いたい場合。


```
var TwemojiedComponent = React.createClass({
    render: function () {
        var text = 'I \u2764\uFE0F emoji!';

        return (
          <span>{text}</span>
        );
    },

    componentDidMount: function () {
        twemoji.parse(this.getDOMNode(), { size: 72 });
    }
});
```

上記例だと `render()` 時点で text に対して twemoji.parse() すると JSX に埋め込む際にタグがエスケープされるというありがちな結果になってしまうので、mount 後にやる。

一応他の方法 (dangerouslySetInnerHTML) もあるものの、個人的には上のコードの方が分かりやすいと思う。なんかネーミングも危うさを強調している感じがするし。
http://facebook.github.io/react/docs/jsx-gotchas.html
Xcodeをvimキーバインドで使う

[XVim](https://github.com/XVimProject/XVim)を使う。

```bash
cd ~/Library/Application\ Support/Xcode/
mkdir plugins
git clone https://github.com/XVimProject/XVim
cd XVim
make
```

あとはXcodeを再起動するだけ。

2016/12/09 追記
※Xcode8からは、事前に以下の手順が必要になりました。
https://github.com/XVimProject/XVim/blob/master/INSTALL_Xcode8.md

2017/05/12 追記
Xcode 8.3.2ではコンパイルが通らなくなっています。
以下に記載の手順で解決しました。ありがとうございます。
http://snoopopo.hatenablog.com/entry/2017/05/06/032411

2017/10/24 追記
現時点で、XVimはXcode9以上には対応していません。
ですが、[XVim2](https://github.com/XVimProject/XVim2)が対応しています。
Mac と RubyMine で RubyMotion を始める


RubyMotion を利用すると、iOS/Android アプリを Ruby で書け、また Ruby 周辺のエコシステムを利用することが出来るみたいです。
(ただ iOS/Android それぞれのネィティブを作る知識は必要で、またコードの共通化を目的とするものでは無いみたい。）

> Android のサポートについては、現時点ではまだ パブリックベータ です。

会社で RubyMotion のライセンスを買ってもらったので始めてみました。まだ初心者ですが、Hello World を表示するまでのメモをここに残します。

## 前提

- 手元の OS：`Mac OS X 10.9.5 (Mavericks)`
- Ruby：`2.1.2p95`
	- 私は rbenv でバージョンを管理しています。
- あらかじめ Xcode のインストールが必要です。
- IDE は [RubyMine](https://www.jetbrains.com/ruby/) を使います。
	- ただ、なくても手持ちのエディタで大丈夫だと思います。RubyMine は有償ですし。
	- RubyMine は RubyMotion をサポートしているのですが、今回は何もその機能は利用しません..

ちなみに RubyMotion の公式ページは http://www.rubymotion.com です。ライセンスは現時点(2014/11/05)で ＄199.99 です。お試しが出来ないので、何をするにしても、まずは購入する必要があります（一ヶ月以内？の返金制度はあるみたい）。

## 始める手順

### ① RubyMoiton のインストール

公式サイトにてライセンスを購入すると、メールでインストーラーのURLと、ライセンスキーが送られてきます。インストーラーを解凍して起動します。

![screen2.jpg](https://qiita-image-store.s3.amazonaws.com/0/35733/292ec3fc-e365-d2b4-8c29-5e13237ad9a8.jpeg "screen2.jpg")

ライセンスキーを入力して、しばらく待ちます。

![screen6.jpg](https://qiita-image-store.s3.amazonaws.com/0/35733/0add0339-489c-b183-c726-26e2bb5f772d.jpeg "screen6.jpg")

インストールが終わると、パスが通ってるはずなので、確認してみます。

```shell:
$ motion --version

2.37
```

### ② Hello World してみる

ほぼ [こちら](http://rubymotion.jp/RubyMotionDocumentation/guides/getting-started/index.html) の手順のまんまですが、やってみます。

- プロジェクトを作成します。

	```shell:
	$ motion create HelloMotion
	```

	次のようにファイルが展開されます。

	![スクリーンショット 2014-11-07 18.05.23.png](https://qiita-image-store.s3.amazonaws.com/0/35733/49a1c990-696d-520b-68e9-d4d843c2d222.png "スクリーンショット 2014-11-07 18.05.23.png")

	`Gemfile` と `Rakefile` の中身はこんな感じ。

	```ruby:Gemfile
	source 'https://rubygems.org'
	
	gem 'rake'
	# Add your dependencies here:
	```
	
	```ruby:Rakefile
	# -*- coding: utf-8 -*-
	$:.unshift("/Library/RubyMotion/lib")
	require 'motion/project/template/ios'
	
	begin
	  require 'bundler'
	  Bundler.require
	rescue LoadError
	end
	
	Motion::Project::App.setup do |app|
	  # Use `rake config' to see complete project settings.
	  app.name = 'HelloMotion'
	end
	```

- この状態でビルドしてみます。

	```shell:
	$ rake
	```

	iOS Simulator が自動で起動して、真っ黒な画面が表示されました。

	![スクリーンショット 2014-11-07 18.20.05 copy.png](https://qiita-image-store.s3.amazonaws.com/0/35733/256de16c-0cf0-f641-1d52-8b18d4f1ac95.png "スクリーンショット 2014-11-07 18.20.05 copy.png")


- `app_delegate.rb` を次のように修正して、Hello World を表示してみます。

	```ruby:app_delegate.rb
	class AppDelegate
	  def application(application, didFinishLaunchingWithOptions:launchOptions)
	    alert = UIAlertView.new
	    alert.message = "Hello World!"
	    alert.show
	    true
	  end
	end
	```

	再びビルドします。

	```shell:
	$ rake
	```

	表示されました^^

	![スクリーンショット 2014-11-07 18.25.40 copy.png](https://qiita-image-store.s3.amazonaws.com/0/35733/807e309a-7cdd-328a-34e4-50cec3fc3568.png "スクリーンショット 2014-11-07 18.25.40 copy.png")

## おわりに

下記は、RubyMotion で参考になるサイトです。

- 公式の Developer Center
	- http://www.rubymotion.com/developer-center/
	- 日本語訳されたもの
		- http://rubymotion.jp/

次のステップとしては、上記の日本語訳の中にあるチュートリアルをやってみようと思います。
Homebrew Cask で Atom を、apm で Atom のパッケージを導入したメモ


きっかけは [RubyMotion](http://www.rubymotion.com/) の IDE として [Atom](https://atom.io/) を使ってみようと思い。
（なぜか RubyMine だと RubyMotion のコード補完が効かなかった為..）

Atom はインストーラでいれても良かったのですが、前から気になってた [Homebrew Cask](http://caskroom.io/)（本来は GUI のインストーラでインストールするタイプのソフトウェアを、Homebrew で導入できるやつ）を使ってみました。

> ちなみに RubyMotion は Ruby でスマホのネィティブアプリが作れるやつ(有償)です。Atom は GitHub 製のエディタです。
> 

### 前提

- OS：`Mac OS X 10.9.5 (Mavericks)`

## Homebrew Cask の導入

- そもそも Homebrew が入ってなければ導入します。
	- Homebrew の [公式ページ](http://brew.sh/index_ja.html) どおり、次のように。

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

		> 執筆時とコマンド内容が変わってるかもしれないので、公式ページを確認ください。また事前に [Xcode](https://developer.apple.com/xcode/downloads/) の導入も必要です。

- brew コマンドで Homebrew Cask を導入します。

	```shell:
	$ brew install caskroom/cask/brew-cask
	```

Homebrew Cask でインストールできるソフトウェアはこちらで確認できます。
⇒ https://github.com/caskroom/homebrew-cask/tree/master/Casks

## Atom の導入

- バッケージが存在するか確認

	```shell:
	$ brew cask search atom
	```

- Atom を導入

	```shell:
	$ brew cask install atom
	```

簡単でした^^ インストールが終わると、ちゃんと Mac のソフトウェア一覧にも表示されます。

![スクリーンショット 2014-11-10 14.26.37.png](https://qiita-image-store.s3.amazonaws.com/0/35733/0e577447-2f52-859d-3831-fceedb572651.png "スクリーンショット 2014-11-10 14.26.37.png")

同時に、Atom のパッケージ（プラグイン）を管理するための `apm` コマンドも使えるようになっています。

## Atom のパッケージ（プラグイン）を導入

そもそもの目的であった [RubyMotion support in Atom](https://atom.io/packages/rubymotion) と、あと RubyMotion をコマンドでいろいろ操作すると思うので [Atom Term 2](https://atom.io/packages/term2) を導入してみます。

```shell:
$ apm install RubyMotion
```

```shell:
$ apm install term2
```

こんな感じで使えます。

![screen3.png](https://qiita-image-store.s3.amazonaws.com/0/35733/b87b9123-4826-13a3-cb9e-e49cf8d490f3.png "screen3.png")

![screen2.png](https://qiita-image-store.s3.amazonaws.com/0/35733/71912eba-a64e-3236-cb7f-430221661c2c.png "screen2.png")

![screen1.png](https://qiita-image-store.s3.amazonaws.com/0/35733/107597d0-69e4-30fd-17b1-506fd893cfb4.png "screen1.png")

おわり。
AppleScript から Perl のワンライナーをしばく

　おはこんばんちわ。お久しぶりでございます。今回は自分が使う時にいつも忘れててスポットライトで強引に検索しているソースを少々。

　何をやるかと言えば、AppleScript の do shell script を使って Perl のワンライナーを動かそうというものです。

　まあ何に使うかと言えば、ちょっとしたテキスト処理で「あー、正規表現使いたいなぁ」というその場しのぎ感満載な欲求を満たす為であります。さあそれではレッツゴー。

　ソースを見てもらえればわかりますが、特に何も難しいことはしておりません。ポイントはワンライナーと AppleScript との間で文字化けせずにどうやってテキストをやりとりするか、といった程度です。

```applescript:Applescript
set sampleString to "明日天気になーれ" as «class utf8»
set regex to "s/明日/明後日/g" as «class utf8»
display alert regReplace(sampleString, regex)

on regReplace(myString, myRegex)
	try
		set result to do shell script ¬
			"perl  -Mutf8  -e 'binmode STDOUT, 'utf8';utf8::decode($ARGV[0]);$ARGV[0] =~" & ¬
			myRegex & ";print $ARGV[0]', " & quoted form of myString as «class utf8»
		return result
	on error errMsg number errNum
		display alert (errMsg & return & errNum)
	end try
end regReplace
```

　うーん、このソース作ったのは 10.4 時代なのでおそらく今時の AppleScript だともうちょっと違った書き方になっているかもしれません。とりあえず手元の 10.6.8 では動いているので良しとします。

※追記：動作確認報告をいただきました。10.7 10.9 ともに動作OKとのこと
@monokano さん、@MD5500 さん、ご協力ありがとうございます
git 小ネタ: HEAD の省略や TILDE, CARET の使い分け


![2014-11-10_10_36_38.png](https://qiita-image-store.s3.amazonaws.com/195/29618/0466edaf-08b3-3f81-6953-6b5479a839b3.png "2014-11-10_10_36_38.png")

## HEAD の省略形 @

`git reset HEAD^` は `git reset @^` と書ける (git 1.8.5 より)

https://raw.githubusercontent.com/git/git/master/Documentation/RelNotes/1.8.5.txt

## HEAD^ や HEAD~ を使いこなす

HEAD から `~`, `^` のみでこのツリー上の任意の commit を指定したいときがあるかもしれない (ない).
そんなとき, 以下のように tilde と caret を使って指定することが出来る.

### TILDE `~`

`~` は同一ブランチの前の世代を指定する.
`~{数字}` (`~3` など) は n 世代前を指す.

### CARET `^`

 `^` は親を指定する.

#### 親

commit には最大で二人親がおり, 一人は同一ブランチの前 commit (== 一世代前, `~`).
もう一人は Merge 元のブランチの最終 commit である.
後者の親は Merge commit でしか発生しない.

#### 指定方法

- 同一ブランチの親: `^1` (`^` と同値)
- Merge 元ブランチの親: `^2`

#### 注意

`^^` は `^2` と同値ではなく, `^` の `^` である. 同じブランチの親のさらに同じブランチの親なので, 二世代前となり, `~2` と同値.

## 練習

![ 2014-11-10 10.36.38.png](https://qiita-image-store.s3.amazonaws.com/195/29618/e08e0a0b-ef42-0434-22f2-98648e4578c5.png " 2014-11-10 10.36.38.png")


(github.com/sqrtxx/Kurobako より)

### HEAD

```
git show @
```

### 世代の指定

以下の Merge commit を指定する.

`b23ab6c Merge pull request #8 from sqrtxx/add-test-group`

指定方法は以下のようなものがある.

- `git show @^^`
- `git show @~2`

### 親の指定

以下の commit を指定する.

`83d520b Add badge of Travis CI`

Merge commit は上より, `@~2` で指定できる.
ここから親をたどる. 指定方法は以下のようなものがある.

- `git show @~2^2`
- `git show @^^^2`


### 親の世代の指定

以下の commit を指定する.

`0b9073b Add gems for test`

上の commit の九世代前となる.
`@~2^2` からたどれば良いので,

- `git show @~2^2~~~~~~~~~`
- `git show @~2^2~9`
- `git show @~2^2^^^^^^^^^`

などのように書ける.

## Reference

[PaulBoxley.com – Git caret and tilde](http://www.paulboxley.com/blog/2011/06/git-caret-and-tilde)
git の監視から逃れる方法


![135661733965913209789.png](https://qiita-image-store.s3.amazonaws.com/195/29618/210ed1f3-123f-aeb7-1059-fada2fad2c6c.png "135661733965913209789.png")

## 既に追跡されている

### 追跡の必要性がなくなった場合

ファイルを削除 & インデックスから削除して commit

```bash
git rm path/to/file
git commit -m 'Good-bye file'
```

なお, ファイルを残したまま追跡から逃れたいときは `git rm --cached path/to/file` でインデックスのみ削除し, `.gitignore` などで指定する. また, 誤って `git rm` してしまったときは `git reset @~ path/to/file`, `git checkout path/to/file` で回復する.

### ローカルでのみ追跡してほしくない場合

二つ方法がある. これらの違いは[既に git 管理しているファイルをあえて無視したい - Qiita](http://qiita.com/usamik26/items/56d0d3ba7a1300625f92)に詳しい.
用途に依るが, `assume-unchanged` の変更は `git reset --hard` で死ぬので, 基本的には `skip-worktree` を使う.

#### assume-unchanged

除外するとき

```bash
git update-index --assume-unchanged path/to/file
```

除外から戻すとき

```bash
git update-index --no-assume-unchanged path/to/file
```

確認するとき

```bash
git ls-files -v | grep ^h
```

#### skip-worktree

除外するとき

```bash
git update-index --skip-worktree path/to/file
```

除外から戻すとき

```bash
git update-index --no-skip-worktree path/to/file
```

確認するとき

```bash
git ls-files -v | grep ^S
```

## まだ追跡されていない

### プロジェクト単位で追跡してほしくない場合

`.gitignore` に記述する.

### ローカルでのみ追跡してほしくない

#### 対象リポジトリのみで追跡から逃れる場合

`.git/info/exclude` に記述する.

#### ローカルの全リポジトリで追跡から逃れる場合

ホームディレクトリに `.gitignore` を用意する (今回は区別のため `.gitignore_global` とした.)

```~/.gitignore_global
*~
*.swp
*.swo
.DS_Store
*~
*#
.#*
```

git の global 設定に保存する

```bash
git config --global core.excludesfile $HOME/.gitignore_global
```

上のコマンドにより, 以下のように設定が `~/.gitconfig` に反映される.

```~/.gitconfig
[core]
    excludesfile = /home/{ユーザー名}/.gitignore_global
```


## References

- [[プログラミング] [git] git rmの取り消し - それっぽい駄文](http://d.hatena.ne.jp/kori_hatonosuke/20110419/1303204292)
- [既に git 管理しているファイルをあえて無視したい - Qiita](http://qiita.com/usamik26/items/56d0d3ba7a1300625f92)
[go] cgoは使いたくないけど、C.GoBytes() は使いたいみたいなー [追記あり]

cgo は結構万能だけど、これを使うと、Windows の場合、ビルドの際、MinGW gcc が必要になりそうな雰囲気である。これでは多くの pull request が期待できないッ。でも、C.GoBytes() とか、C.GoStringN() を使いたいッ。この気持ちッ、天に届け！

# <del>でけた！</del> <ins>できてへん</ins>

```go
var msvcrt = syscall.NewLazyDLL("msvcrt")
var memcpy = msvcrt.NewProc("memcpy")

func CGoBytes(p, length uintptr) []byte {
	buffer := make([]byte, length)
	memcpy.Call(uintptr(unsafe.Pointer(&buffer[0])), p, length)
	return buffer
}

func CGoStringN(p, length uintptr) string {
	return string(CGoBytes(p, length))
}
```

# これではうまくいかない

* length が 0 の時に panic を起こす
    * これについては `if length <= 0 { return []byte{} }` すれば Ok
* Ctrl-C ハンドラがうまく動作しなくなる
    * `import "C"` を入れるだけで動作するようになる、なぜ？

ということで、C.GoBytes は不要にはなりましたが、import "C" だけは必要という、あまり意味のない状態で、現在に至ります。わからんなー

# import "C" せずに Ctrl-C ハンドラを正常動作させる回避策

`kernel32.dll` の `SetConsoleCtrlHandler` を使わないようにしたら、Ctrl-C がキャッチできるようになった。理由はよくわからないが、シグナル関係が Windows 版 Go ではまだきちんと実装されていないことが関係しているのだろうか…

## 関係URL
* [@zetamatta 気になったので調べてみたんですが、conio.OnClose が呼ばれると ENABLE_PROCESSED_INPUT が無効になってしまうみたいです](https://twitter.com/hattya/status/533981437255380992)
* [@zetamatta nyagos.go の conio.OnClose をコメントアウト、conio/import_c.go を削除して試してみると Ctrl+C で入力がキャンセルされました](https://twitter.com/hattya/status/533984715804389377)
* [zetamatta / nyagos / Save history at each input and remove cgo](https://github.com/zetamatta/nyagos/commit/087e2104bfe8c338e1ff66b01cf8b4d2bdce20e8)
Dockerでホストと同じタイムゾーンをコンテナ起動時に設定する

イメージのタイムゾーンは基本的にUTCになっています。

    $ docker run --rm -ti ubuntu date
    Mon Nov 10 05:16:46 UTC 2014

`/etc/localtime`を`--volume`オプションでバインドすることで、ホストとタイムゾーンを合わせることができます。
コンテナ側から書き換えられないよう、`ro`も付けて読み取り専用にしています。

    $ docker run --rm -ti -v /etc/localtime:/etc/localtime:ro ubuntu date
    Mon Nov 10 14:16:49 JST 2014

Dockerfile内でタイムゾーンを設定することも可能ですが、イメージのポータビリティーを考えると起動時に指定するのがよいでしょう。

## 参考

* [timezone - Will docker container auto sync time with the host machine? - Stack Overflow](http://stackoverflow.com/a/22820278)
Capstarano3でデプロイ時にUnicornが再起動しているようで失敗している時の対処法


Capstarano3 + Unicornでデプロイしている時、`cap`コマンドで実行するとUnicornの再起動ログがSuccessになっているのにもかかわらず、サーバのUnicornプロセスを確認すると、どうも再起動されていない…。という現象にぶち当たり、色々調べると成功しているように見せかけて、実は失敗していたっていうお話。

# Unicornが再起動されたかの確認

## paコマンドでいつ起動されたかの確認

```bash:command
$ ps -eo lstart,pid,args | grep uni

Mon Nov 10 13:48:14 2014 17039 unicorn master -c /var/www/app/current/config/unicorn/staging.rb -E staging -D
Mon Nov 10 13:48:18 2014 17083 unicorn worker[0] -c /var/www/app/current/config/unicorn/staging.rb -E staging -D
Mon Nov 10 13:52:22 2014 17087 grep uni
```

psコマンドでいつ起動されたかを確認。この時点で、過去の日付だと明らかに再起動されていない。

## Unicornのエラーログで確認

```bash:command
$ tail -f /var/www/app/log/unicorn.stderr.log

I, [2014-11-10T13:39:28.817252 #14552]  INFO -- : executing ["/var/www/app/shared/bundle/ruby/2.1.0/bin/unicorn", "-c", "/var/www/app/current/config/unicorn/staging.rb", "-E", "staging", "-D", {11=>#<Kgio::UNIXServer:fd 11>}] (in /var/www/app/releases/20141110043913)
I, [2014-11-10T13:39:28.817497 #14552]  INFO -- : forked child re-executing...
/home/ec2-user/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/bundler-1.7.3/lib/bundler/definition.rb:22:in `build': /var/www/app/releases/20141107020905/Gemfile not found (Bundler::GemfileNotFound)
        from /home/ec2-user/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/bundler-1.7.3/lib/bundler.rb:154:in `definition'
        from /home/ec2-user/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/bundler-1.7.3/lib/bundler.rb:117:in `setup'
        from /home/ec2-user/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/bundler-1.7.3/lib/bundler/setup.rb:17:in `<top (required)>'
        from /home/ec2-user/.rbenv/versions/2.1.2/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from /home/ec2-user/.rbenv/versions/2.1.2/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb:55:in `require'
E, [2014-11-10T13:39:28.995313 #3233] ERROR -- : reaped #<Process::Status: pid 14552 exit 1> exec()-ed
```

`Gemfile not found (Bundler::GemfileNotFound)`というエラーが出ている。

# Gemfileの場所を明示して対応する

```ruby:config/unicorn/staging.rb
before_exec do |server|
  ENV['BUNDLE_GEMFILE'] = @app_path + "/current/Gemfile"
end
```

unicorn.rbなどの設定ファイルで、環境変数`ENV['BUNDLE_GEMFILE']`にGemfileの場所を明示してあげることで解消する。

## すでに上記問題でデプロイ失敗している場合は注意！

すでにデプロイ失敗している環境の場合は、`ENV['BUNDLE_GEMFILE']`を明示して再度デプロイしても失敗してしまう。ここは、一度手動でUnicornを停止もしくは再起動させることで、問題が解消される。