OmniAICreator/Qiita-1.07M huggingface dataset:
gojiのMiddlewareの使い方

[goji](https://goji.io/)はgolangのWebApplicationFrameworkです。

gojiにはMiddlewareという仕組みがあり、これを使うことで、リクエストごとに共通して必要な処理を集約することができます。

[gojiはリクエストのロギングを行うMiddlewareが用意されている](https://github.com/zenazn/goji/blob/master/web/middleware/logger.go#L26-L46)ので、それを参考に見ていきます。

```go
func Logger(c *web.C, h http.Handler) http.Handler {
	fn := func(w http.ResponseWriter, r *http.Request) {
		reqID := GetReqID(*c)

		printStart(reqID, r)

		lw := mutil.WrapWriter(w)

		t1 := time.Now()
		h.ServeHTTP(lw, r)

		if lw.Status() == 0 {
			lw.WriteHeader(http.StatusOK)
		}
		t2 := time.Now()

		printEnd(reqID, lw, t2.Sub(t1))
	}

	return http.HandlerFunc(fn)
}
```

上記のLoggerでは、簡単にいうと、以下を行っています。

- リクエストIDのログ出力（リクエストIDの生成は別のmiddlewareで行われています。）
- リクエスト自体の処理
- リクエストIDとともに、処理にかかった時間や返却したHTTPステータスをログ出力

Middlewareはこのように、リクエストを処理する前後に処理を挟み込むことができます。

## 作り方

Middlewareとして、任意の名称の関数を作ります。`func Logger(c *web.C, h http.Handler) http.Handler`
[middlewareの関数定義はこちら(Mux -> mStack -> mLayer)](https://github.com/zenazn/goji/blob/dcb7f7169428645921b9914bdd4f61f1b1936564/web/middleware.go#L13)

その中で、golangでの標準のhttp.HandlerFunc`func(w http.ResponseWriter, r *http.Request)`を実装している関数を返しています。

`h.ServeHTTP(r,w)`が、リクエスト自体の処理になるので、その前に時間を記録して、その後の時間との差分で処理時間を出しています。

## Middlewareは複数登録可能

また、Middlewareは、複数登録が可能です。
[gojiでも、DefaultMuxには、以下が登録されています。](https://github.com/zenazn/goji/blob/17b9035bcd162f59e1a1247d4a755124c37052c5/default.go#L9-L18)

- リクエストIDの生成
- リクエストログの記録
- panicリカバリ
- URL内の文字列をパラメータとして扱う処理

Middlewareは登録順に処理されます。そのため、他のMiddlewareが入っていること前提で処理を作る場合は、順番に気をつけましょう。

## 特定のパスだけに適用したいMiddlewareがある場合

認証処理をMiddlewareで作った際に、特定のパスには、必要としない場合は、Muxを分離します。例えば、ログインページは、そもそも認証するところなので、認証処理が入っていると、誰もログインできなくなります。

```go
    loginMux := web.New()
    loginMux.Hundle("/login", func(...))
    
    resourceMux := web.New()
    resourceMux.Hundle("/resource/users", func(...))
    resourceMux.Use(AuthCheck) // AuthCheckは自分で作る認証Middleware
    
    rootMux := web.DefaultMux
    rootMux.Handle("/login", loginMux)
    rootMux.Handle("/resource/*", resourceMux)
```

こんな感じで、rootを作って、パスごとにmuxを登録します。（ここはrootの代わりにgoji.Handle()などで登録してもOKです）

この場合、rootに登録されているMiddlewareが実行され、その後それぞれのMuxのMiddlewareの順番に実行されます。そのため、認証処理はresouceのmuxにだけ登録するようにすればOKです。

他にも監視用のエンドポイントだけ特定処理をする/しないといった使い方が出来そうです。


## 補足

他にも、共通のレスポンスヘッダ挿入や、プロキシ下にいる場合のx-forwarded-forヘッダへの切り替えなど、[参考になるMiddlewareがgojiにはあります。](https://github.com/zenazn/goji/tree/master/web/middleware)


### Logger内のmutil.WrapWriter(w)

これは何をしているかというと、通常のhttp.ResponseWriterでは、出力処理を行うところでしか、httpステータスを知ることができません。セットするだけで、後から見る機能がないためです。gojiでは、[WrapWriter](https://github.com/zenazn/goji/blob/master/web/mutil/writer_proxy.go)で、処理をフックして、httpステータスを後から参照できるようにしています。

こういったテクニックは、ソースを読んでみると勉強になります。
heroku で DB(postgresql)を利用するときのメモ


## add Postgresql on heroku

```
# mysql はクレカの登録が必要らしい
$ heroku addons:add cleardb:ignite
Adding cleardb:ignite on gentle-reaches-3456... failed
 !    Please verify your account to install this add-on plan (please enter a credit card)
 !    For more information, see https://devcenter.heroku.com/categories/billing
 !    Verify now at https://heroku.com/verify
heroku で DB (PostgreSQL) を利用するときのメモ

# PostgreSQL ならクレカ登録不要
$ heroku addons:add heroku-postgresql:dev
※ 右記エラーになる場合は……「Couldn't find either the add-on service or the add-on plan of "heroku-postgresql:dev".」
　　以下でOK。
$ heroku addons:add heroku-postgresql

Adding heroku-postgresql:dev on gentle-reaches-3456... done, v16 (free)
Attached as HEROKU_POSTGRESQL_PINK_URL
Database has been created and is available
 ! This database is empty. If upgrading, you can transfer
 ! data from another database with pgbackups:restore.
Use `heroku addons:docs heroku-postgresql` to view documentation.

# addon で登録されているのを確認.
$ heroku addons
=== gentle-reaches-3456 Configured Add-ons
heroku-postgresql:dev  HEROKU_POSTGRESQL_PINK

# config にも追加されている
 heroku config
=== gentle-reaches-3456 Config Vars
DATABASE_URL:               postgres://ecnlppyfsbaacr:Fl9OQOTtNMDhJmkIgToK6i569p@ec...
HEROKU_POSTGRESQL_PINK_URL: postgres://ecnlppyfsbaacr:Fl9OQOTtNMDhJmkIgToK6i569p@ec...

# heroku のpostgresqlに接続する
$ heroku pg:psql
---> Connecting to HEROKU_POSTGRESQL_PINK_URL (DATABASE_URL)
psql (9.3.5, server 9.3.3)
SSL connection (cipher: DHE-RSA-AES256-SHA, bits: 256)
Type "help" for help.

gentle-reaches-3456::PINK=>
```

## local環境にPostgreSQL

```bash
$ brew install postgresql
$ initdb /usr/local/var/postgres -E utf8
$ pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start

# heroku上のpostgresのdbをlocalのpostgresqlにpull
$ heroku pg:pull HEROKU_POSTGRESQL_PINK_URL mylocaldb
$ psql -l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 mylocaldb | hiyuzawa | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 |
 postgres  | hiyuzawa | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 |
 template0 | hiyuzawa | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/hiyuzawa          +
           |          |          |             |             | hiyuzawa=CTc/hiyuzawa
 template1 | hiyuzawa | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 | =c/hiyuzawa          +
           |          |          |             |             | hiyuzawa=CTc/hiyuzawa
(4 rows)
```

## node での接続例

```javascript
app.get('/db', function (request, response) {
  pg.connect(process.env.DATABASE_URL || "tcp://localhost:5432/mylocaldb", function(err, client, done) {
  
  });
})
```
こうしておくとlocalでの動作時はlocalのPostgresqlにデプロイ後はherokuのPostgresqlに接続する。
ELB配下のEC2でBasic認証をかける（特定IPを除く）

```
###LBのヘルスチェックを許可
###ロードバランサからのアクセスはX-Forwarded-Forは空
SetEnvIf X-Forwarded-For "^$" empty_ok
Order Deny,Allow
Deny from all
Allow from env=empty_ok

###LBのヘルスチェック以外の特定IPを許可
###グローバルIPでもOK
SetEnvIf X-Forwarded-For "192.168.0." ip_ok
Order Deny,Allow
Deny from all
Allow from env=ip_ok

###上記以外のベーシック認証
AuthType Basic
AuthDBUserFile /var/www/.htpasswd
AuthName "Please input your Password"
Require valid-user

###LB・IP・BASIC認証いずれかOKなら
Satisfy Any
```

Webで拾ってきた情報を自分用にメモ
godnsでお気楽DNS管理

[Kazoo04 Advent Calendar 2014 - Qiita](http://qiita.com/advent-calendar/2014/kazoo04)の14日目の記事です。

kazoo04クラスタの皆さんならBIND等を使ってオレオレDNSを立てることも朝飯前だと思うのですが、僕のような不心得者にとってはBINDをインストールして設定ファイルを書く、といった作業はそこそこに面倒なものであったりします。

そういう僕でもDNSが簡単に立てられるお手軽ソリューションは無いかなと探していましたところ、こういうものを見つけました。

[kenshinx/godns](https://github.com/kenshinx/godns)

これは名前の通りGo言語で書かれたDNSなのですが、以下のような機能があります。

+ resolv.confに記述されたDNSに問い合わせる機能
+ 問い合わせ結果のメモリ上キャッシュ
+ ローカルのhostsファイルのインポート機能
+ Redisに記述されたhosts情報を参照する機能

これらの機能をTOML形式で記述されたコンフィグファイル一つ置けば使えるようになるという優れものです。（詳しくはリンク先をどうぞ）

特筆すべき機能としてはRedisに記述されたhosts情報を参照する機能です。Redisサーバーを一つ立ち上げておけば、DNSを立ち上げたまま新しくレコードを登録したり変更したり削除したりすることができます。ローカルネットワークのサーバ群を管理したりするにはとてもちょうど良い機能でしょう。

godns、Go言語で書かれていると言うこともあり非常に取り回しも楽ちんな素敵なアプリなのですが、一つだけ欠点があり、現状はドメイン名からの正引きでしかhostsの参照をしてくれません。ローカルネットワークのサーバのドメインを逆引きしたいということもあるので、このままではいささか不便です。

というわけでこちらにPTRレコードの問い合わせに対応したものをフォークして用意しました。

[kr9ly/godns](https://github.com/kr9ly/godns)

こちらの修正を入れたものを使えば、例えば 10.0.0.11 から kazoo04.localdomain を逆引きさせたい場合、Redisに 11.0.0.10.in-addr.arpa というキーで kazoo04.localdomain をHSETしておけば逆引きされるようになります。

少し機能を付け足したい場合に簡単に手を入れられるというのも小さなアプリのいいところですね。

他の機能を付け足したい場合もこちら [miekg/dns](https://github.com/miekg/dns)（godnsはこちらのライブラリを利用して作られている） とかこちら [skynetservices/skydns](https://github.com/skynetservices/skydns)（同じDNSライブラリを利用したリッチなDNSサーバ、PTRレコードに対するレスポンスはこちらを参考にした）が大いに参考になるでしょう。

godnsをハックして皆さんも楽しいDNSライフを！
requestAnimationFrame内でthisが変わるの知らないよぉ



本日ハマったこと。


```CoffeeScript
class World
	update:->
		requestAnimationFrame @update
		@render
	
	render:->
		# hoge
```

これで動くと思ったけど、全然動かない。

CoffeeScript内の＠もといthisの扱いにはマジで注意が必要ですね。


```CoffeeScript
class World
	update:->
		requestAnimationFrame arguments.callee
		@render
	
	render:->
		# hoge
```

こうしてみた。
うごかない。

ちなみに、arguments.callee で呼び出している関数は、グローバルオブジェクトになるのかな。怖い怖い。一回目は通るけど、二回目は通らないってそういうことなのか？。

でも、一個目のやつが動かないのは説明がつかない。

うーむおかしい。


## ->と=>の違い

```CoffeeScript
class World
	update:=>
		requestAnimationFrame @update
		@render
	
	render:=>
		# hoge
```

結果的に、こうすることで解決しました。

どうやら、requestAnimationFrameはグローバルオブジェクトなので、引数の関数を呼ばれると、内部のthisはwindowを指すことになってしまう模様。

つまりは、Worldクラスのthisをbindしてあげないと、ちゃんと動かないっぽいです。

coffeeScriptの`=>`はthisを関数にBindしてくれて、ちゃんとしたWorldのthisを使えるようにしてくれるやつです。

これで、`->`と`=>`の使い分けられる人類に一歩近づきました。


ちかれた。
読書まとめ/無料でできる！世界一やさしいGoogle  Analyticsアクセス解析入門 - 丸山 耕二

# 本書について
- [Amazonで本を購入する](http://amzn.to/28cMQCL)
- [著者twitter](https://twitter.com/koji_maruyama)

# 本書のまとめ

## 第2章 ボトルネックを解消せよ！

### 問い合わせ数
- 問い合わせ数＝集客数ｘ成約率（コンバージョン率）
- 問い合わせ数＝新規集客数ｘ新規成約率＋リピーター集客数ｘリピーター成約率

### AIDMA
- Attention（注意を引かれて）
- Interest（興味を持ち）
- Desire（欲望をかきたて）
- Memory（記憶して）
- Action（購買する）

### Ri-Turban's
- Recognized（認識し）
- Interest（興味を持ち）
- Trust（信頼し）
- Usability & User Experience（サイトが使いやすく、快適で）
- Risk Hedges（リスクを避け）
- Benefit（メリットを考慮し）
- Affirmative（購買を肯定し）
- Needs & Wants（必要、もしくは欲しいので申し込む）
- Surprise（驚くような結果で満足度を得る）

### キーワードを詮索している人数を調べる
- ~~Google キーワードツール~~ → [Google キーワードプランナー](https://adwords.google.co.jp/KeywordPlanner)

### 直帰率
- ユーザが直帰する理由
    - 怪しい、見づらい、事前予想と違うサイト
    - 最初に記事で満足してしまったサイト
    - 重いサイト
- 「ランディングページレポート」
    - 並び替え「加重」
    - セカンダリディメンション「キーワード」 
        - (not set) [キーワードがセットされていない](https://www.google.co.jp/search?q=(not+set))
        - (not provided) [キーワードが提供されないアクセス](https://www.google.co.jp/search?q=(not+provided))
- 「ページ速度」
    - セカンダリディメンション「オペレーティング・システム」
    - [PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/)

### 目標
- サンキューページをゴールにする

## 第3章 ボトルネックが解消できない！

### ヒューリスティック分析

### ユーザビリティを改善しよう

### 比較
- その数値は前年と比べてどうなのか？
- 他の媒体と比べて、どうなのか？
- 前月と比べてどうなのか？

### ユーザ視点でサイトを見れば改善点が浮かんでくる

### アドバンスセグメントで「モバイルトラフィック」

## 第4章 伸び悩みを突破しろ！

### すべてのトラフィックの参照元メディア
- 目標セット、コンバージョン率

### オーガニック検索

## 第5章 さらに一歩、上へ

### A/Bテスト

### リピーター分析

### 最低限見張っておくべき3つの値（KPI）
- 申し込みフォーム到達率
- コンバージョン率
- 顧客1人あたりの獲得にかかった広告費（CPA）

## 第6章

### 良い驚きを顧客に

### インテリジェンス イベント
- カスタムアラート

## 資料
- [Web Master Tool](https://www.google.com/webmasters/tools/)
- [URL生成ツール](https://support.google.com/analytics/answer/1033867)
Rails + Bootstrap + Bootswatch の設定方法メモ


# 1. Gemfile 編集

```ruby:Gemfile
.
.
.
gem 'twitter-bootswatch-rails'
gem 'twitter-bootswatch-rails-helpers'
```

```bash
$ bundle install
```

# 2. Bootswatch インストール

```bash
$ rails g bootswatch:install lumen
$ rails g bootswatch:import lumen
$ rails g bootswatch:layout lumen
```

# 3. Asset Pipeline の設定

```css:app/assets/stylesheets/application.css
.
.
.
 *= require_self
 *= require lumen/lodader
 *= require lumen/bootswatch
 */
```

```javascript:app/assets/javascript/application.js
.
.
.
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require lumen/loader
//= require lumen/bootswatch
```

```ruby:config/initializers/assets.rb
.
.
.
Rails.application.config.assets.precompile += %w( lumen.css )
Rails.application.config.assets.precompile += %w( lumen.js )
```

# 4. Bootswatch のファイル修正

変数 `@zindex-modal-background` が定義されていないとエラーが出る場合があるので変数の定義を追加。
この手順は飛ばしてエラーが出た時に作業してもOK。

```less:app/assets/stylesheets/lumen/variables.less
.
.
.
@dl-horizontal-offset:        @component-offset-horizontal;
//** Horizontal line color.
@hr-border:                   @gray-lighter;

@zindex-modal-background: 0;
```

# 動作確認

Bootswatchをインストールした時に作られたテンプレートで `application.html.erb` を上書きする。

```bash
$ mv app/views/layouts/lumen.html.erb app/views/layouts/application.html.erb 
```

コントローラー作って

```bash
$ rails g controller StaticPage
```

ルーティングの設定をして

```ruby:app/controllers/static_page_controller.rb 
class StaticPageController < ApplicationController
  def index
  end
end
```

```bash
$ touch app/views/static_page/index.html.erb
```

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

Webサーバー起動。

```bash
$ rails s
```

`http://192.168.33.10/` を開くとこんな感じでBootswatchが有効になっていること確認。

![2014-12-14 13.05.33.png](https://qiita-image-store.s3.amazonaws.com/0/44184/db27f4a5-70a7-8bc6-eeb2-3958bb738895.png "2014-12-14 13.05.33.png")


[今回編集したファイルのGist](https://gist.github.com/yamagh/721f493a2571fe5701d0)

# 参考

- [[Rails 4.x][Bootstrap] Rails 4.x で Bootswatch を使う方法 - Qiita](http://qiita.com/tsumekoara/items/1055879e1fb9d54b3059)
- [variable @zindex-modal-background is undefined | DENPA GROOVE](http://denpa.mydns.jp/2014/11/14/variable-zindex-modal-background-is-undefined/)
React.jsのチュートリアルを触る

#React.jsのチュートリアルを触る

[VirtualDOM Advent Calendar 2014 - Qiita](http://qiita.com/advent-calendar/2014/virtual-dom "VirtualDOM Advent Calendar 2014 - Qiita")の14日目です。

##まえがき

最近はやりのVirtualDOMというのに触れてみるためにReact.jsのチュートリアルを一通り試してみた。

http://facebook.github.io/react/docs/tutorial.html

ここのチュートリアルやるだけで一通り動かすことができるようになる。なんとなく初めて見るにはチュートリアルをやるのが一番。
実際に動くものをJS Binにあげたので詳しくは以下で。

http://jsbin.com/xixolu/1/edit?js,output

この先は少し細かく見ていく。自分用のメモに近いのでちょっとよみずらいかもしれない。
ちなみにDOMのあたりはJSXの構文を使ってる。JSXはよくわかってないがJS
でそのまま書くとえらい面倒なので採用する方が無難だと思う。

##コンポーネントの作成

```js
var CommentBox = React.createClass({
  handleCommentSubmit: function(comment) {

    var comments = this.state.data;
    var newComments = comments.concat([comment]);
    this.setState({data: newComments});

  },
  getInitialState: function() {
    return {data: []};
  },
  loadCommentsFromServer: function() {
    var data = [
      {"author": "Pete Hunt", "text": "This is one comment"}
    ];
    this.setState({data: data});
  },
  componentDidMount : function() {
    this.loadCommentsFromServer();
  },
  render: function() {
    return (
      <div className="commentBox">
        <h1>CommentForm</h1>
        <CommentList data={this.state.data} />
        <CommentForm onCommentSubmit={this.handleCommentSubmit} />
      </div>
    );
  }
});

```

まず``` React.createClass({}) ``` でコンポーネントを作成する。なにをおいてもそこからはじまる。
createClassの引数にオブジェクトを与える。オブジェクトのキーの```getInitialState``` ```componentDidMount``` ```render```はReactの機能として必要なところ。それ以外は自由に書いている。
```getInitialState```はコンポーネントの持っているStateを初期化する。
Stateについては詳しくは@koba04さんの

[React.jsのState](http://qiita.com/koba04/items/63267bcc918d76ac8767)

が詳しいのでそこを参照のこと。
ここではdataという配列を入れている。

　```componentDidMount```　はコンポーネントがレンダリングされた後に実行される。ここでは　```loadCommentFromServer```　を呼び出している。ここで呼び出している関数は　```createClass```　に入れたオブジェクトの中に定義してある。処理はできるだけ小分けにするのが良さそう。

ちなみに　```loadCommentFromServer```　はチュートリアルではajaxを用いてデータを所得する処理がかかれている。

 ```render``` はレンダリングするコンポーネントのDOMを返している。ここでJSXの構文を使う。
ここではCommentListとかCommentFormとか見慣れないDOMがかかれているが、これはReact.jsで作ったコンポーネント。

```js
var CommentList = React.createClass({});
var CommentForm = React.createClass({});
```

のようにReact.jsでコンポーネントを作成すれば ```render``` の中で呼び出すことができる。こうやってVirtualDOMのツリーを作っていく。

##レンダリング

コンポーネントを作成したら ```React.render``` でレンダリングを実行する。

```js
React.render(
  <CommentBox />,
  document.getElementById('content')
);
```

第一引数にコンポーネントの名前。第二引数にコンポーネントをレンダリングする場所を指定する。

##おわりに

とりあえずチュートリアルに従って書いてみた。基本的にコンポーネントを作成してそれを組み合わせて最後にレンダリングするという処理の流れになっている。
HTMLを直接編集しないでJavaScriptだけでできるというのがちょっと慣れないけどちょっと新鮮だった。
実際に仕事で採用するにはデザイナーとフロントエンドエンジニアの作業フローを工夫する必要があるかもしれない。デザイナーがDOMの構造を変えたいと思ったらJSを触らなくてはならないので少しハードルが高いかも？（そんなことはないか

VirtualDOMが早いとか効率がいいとかそういうことはまだ実感として感じられていないので、もう少し勉強する必要がある。
diffで「予期しないトークン (' 周辺に構文エラーがあります」

たとえばこんな感じで2つのシェルスクリプトの実行結果をdiffで比較するシェルスクリプトがあったとして、これを実行すると、タイトルのようなエラーが出ます。

```sh:compare.sh
#!/bin/sh
diff <(ndisasm hogehoge.out) <(ndisasm fugafuga.out)
```

シバンをbashに変えると、エラーはなくなりました。

```sh:compare.sh
#!/bin/bash
diff <(ndisasm hogehoge.out) <(ndisasm fugafuga.out)
```

なんでなんでしょうね。
がんばってEMRからSqoopつかってRDS(Mysql)へエクスポート

かなり疲れた...

# sqoopって

sqoopってのはHDFS....まぁこちらを読んでもらうのが一番良い
http://www.ne.jp/asahi/hishidama/home/tech/apache/sqoop/

# さて早速インストール。

ここを参考にね。
http://blog.kylemulka.com/2012/04/how-to-install-sqoop-on-amazon-elastic-map-reduce-emr/

bootstrapとしてやるんじゃなくとりあえず試したいのでガスガスやってみる.
注意としては、Sqoopダウンロードしたものに`sqoop-1.4.5.jar`が含まれてないのもあるので
ダウンロードするときは`sqoop-x.x.x.bin__hadoop-xxx-yyy.tar.gz`こっちをダウンロードする、

```shell-session
$ cd

# sqoopのダウンロード
$ wget http://ftp.jaist.ac.jp/pub/apache/sqoop/1.4.5/sqoop-1.4.5.bin__hadoop-2.0.4-alpha.tar.gz
$ tar -xzf sqoop-1.4.5.bin__hadoop-2.0.4-alpha.tar.gz

# mysql-connector-javaだけど
# EMR+Hive環境なら、すでにあるからコピーしちゃう
$ cp ~/hive/lib/mysql-connector-java-5.1.30.jar sqoop-1.4.5.bin__hadoop-2.0.4-alpha/lib/

```

これでセットアップ自体はOK
ここからが疲れた

## sqoop実行できない！

これは`sqoop-1.4.5.jar`が含まれていなかったから。
ダウンロードしたものが悪かった。
さっき書いたけど`sqoop-x.x.x.bin__hadoop-xxx-yyy.tar.gz`こっち！

## HDFSを指定してORC形式のファイルはエクスポートできない！

どうも、区切り文字付きのtext形式、Avro、SequenceFilesこいつらに対応していて、
それ以外は対応していない...

ここでHCatalogの出番。
http://docs.hortonworks.com/HDPDocuments/HDP2/HDP-2.1.3-Win/bk_dataintegration/content/ch_using-sqoop-hcat-integration.html

```
$ export HCAT_HOME=/home/hadoop/hive/hcatalog 
```

こいつを実行してから

```
$ ./sqoop-1.4.5.bin__hadoop-2.0.4-alpha/bin/sqoop export --connect jdbc:mysql://mysql-host:3306/test --username admin --password admin --table mysql_table --hcatalog-table hive_table 
```

## partitionはStringだけ

INT型でpartitionしてたのでStringに変更。。。


これで、やっとexportが成功する。
Avro、SequenceFilesとかはデリミタの設定とかしなくていいからとっても助かる。
実行前に特定のレコードのdeleteとかはsqoopではできないのかな？


このあとは、これをbootstrap化してあげる。
TextFieldからフォーカスを外したい

http://qiita.com/yasunori/items/b990d206eaac0c351a19 +先輩のコードを参考にやってみたんですが挙動が少しおかしかったのでちょいと手を加えてみました

* ソースコード

```xml:view
<Alloy>
  <Window onClick="blurKeyboard">
    <View id="container" layout="vertical">
      <TextField id="address"  onFocus="setKeyboardOwner" />
      <TextField id="password" onFocus="setKeyboardOwner" />
      <Button id="btn" />
    </View>
  </Window>
</Alloy>
```

```javascript:controller
function setKeyboardOwner(e) {
  Ti.API.debug("setKeyboardOwner");
  currentKeyboardOwner = e.source;
  e.cancelBubble = true;
}

//キーボードを閉じる
function blurKeyboard(e) {
  Ti.API.debug("blurKeyboard");
  if(typeof(currentKeyboardOwner) !== 'undefined') {
    currentKeyboardOwner.blur();
  }
}

$.index.open();
```

```css:tss
"TextField": {
  bubbleParent: false,
}
```

重要なのはtssの`bubbleParent: false`です(これを追加する前と後で動作が変わっていたのでおそらくbubbleParentです)
親のviewにclickイベントを伝播させないのが重要だと思いました．はい．

ちなみにAndroid, iOSどちらも動きます．
Bundlerを使ってRailsバージョンを上げる


Railsバージョンを上げる場合は、rails_root直下のGemfileを更新したあとのコマンドが通常のGemとは異なる。

## 通常のGem追加・更新

```sh
$ cd rails_root
$ bundle install
```

## Railsバージョンの更新

```sh
$ cd rails_root
$ bundle update rails
```

これで、Gemfileに記述したRailsバージョンに変更される。
EMRのHiveServer2にpythonで接続したメモ

# 試した環境
* EMR AMI Version 3.3.1 
  * Hive + Pig + Impala + Hue 

# hiveServe2
AMI3.3.1だと、クラスタの準備完了と同時に起動されている。

```shell-session
$ ps -ef | grep hiveserver2
hadoop   27009   539  0 02:03 pts/9    00:00:00 grep hiveserver2
root     31866     1  0 Dec08 pts/1    00:00:00 su - hadoop -c bash -c /home/hadoop/hive/bin/hive --service hiveserver2
````

ということでなんか起動している。

起動と終了方法は、スクリプトが用意されているので簡単に可能。

```shell-session
# 起動
$ sudo /etc/init.d/hive-serverd start
# 終了
$ sudo /etc/init.d/hive-serverd stop
````

ログは***/mnt/var/log/hive-serve***にあるので、一応確認する。


# pyhs2のインストールと接続
python用のHiveServer2クライアントは[pyhs2](https://github.com/BradRuderman/pyhs2)がある、
pipで簡単にインストール可能なんで早速やってみる。

```shell-session
$ sudo pip install pyhs2
```

がこける、のでこいつをインストールしてから実行する。

```shell-session
$ sudo yum install cyrus-sasl-devel.x86_64
```

これで無事入るはず。

ではいるんだけど、このpipは
`/usr/bin/python2.7`こっちで利用されていて
`/usr/bin/python`こっちじゃない。
これ、Hueインストール時にで追加されているんかもしれない。

あとは[sample](https://github.com/BradRuderman/pyhs2/blob/master/example.py)を拝借して
user,passwordを**hive**に書き換えてあげれば接続できる。
VagrantにCentOS6.5 64bitのboxを追加するメモ

[Windows7 64 に VirtualBox4.3.20 と Vagrant1.7.0 をインストールしようとしたメモ](http://qiita.com/miyamoto_ta/items/b5e81491cdef849af4c1)の続きです。



#CentOS6.5 64bitのboxを取得する#
https://atlas.hashicorp.com/puppetlabs/boxes/centos-6.5-64-puppet/versions/1.0.0
今回は↑にしてみます。
理由は特にないです。。。

## boxをaddする
`vagrant box add puppetlabs/centos-6.5-64-puppet`

↑をていっとやる。

```
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) virtualbox
2) vmware_desktop
3) vmware_fusion

Enter your choice:
```

するとproviderを聞かれたので、選択。
自分の場合はvirtualboxを入れているので1を選択。

```
Enter your choice: virtualbox
Invalid choice. Try again: 1
==> box: Adding box 'puppetlabs/centos-6.5-64-puppet' (v1.0.0) for provider: virtualbox
    box: Downloading: https://vagrantcloud.com/puppetlabs/boxes/centos-6.5-64-puppet/versions/1.0.0/providers/virtualbox
.box
    box: Progress: 100% (Rate: 951k/s, Estimated time remaining: --:--:--)
==> box: Successfully added box 'puppetlabs/centos-6.5-64-puppet' (v1.0.0) for 'virtualbox'!
```
まあ、virtualboxって打っちゃったんですけどね。


念のためboxが追加されたか確認。

```
vagrant box list
puppetlabs/centos-6.5-64-puppet (virtualbox, 1.0.0)
```

OKですね。

#初期化#
ここまででboxの準備ができたので作業ディレクトリを適当に作って、そこに移動。

初期化コマンドは`vagrant init box名`

なので先ほど確認したbox名をコピってinit。

```
vagrant init puppetlabs/centos-6.5-64-puppet
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
```
このようになればOK。

#起動から接続、停止まで#
##起動##
起動コマンドは`vagrant up`

##接続##
接続コマンドは`vagrant ssh`


wとか適当に確認してみた↓
```
[vagrant@localhost ~]$ w
 02:37:21 up 2 min,  1 user,  load average: 0.01, 0.02, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
vagrant  pts/0    10.0.2.2         02:35    0.00s  0.00s  0.00s w
```

##終了##
exitしたら`vagrant halt`で終了。
SASSよりもStylusが優れている6つのポイント

この記事は [CSS Advent Calender 2014](http://qiita.com/advent-calendar/2014/css) の14日目です。[BYODKM](https://github.com/BYODKM) が書きました。

## 1）生のCSSファイルが読み込める・書ける
```stylus:Stylus
@import "../../bower_components/normalize.css/normalize.css"

.foo {
  color: red;
}
```

## 2）SASS のコードが流用できる

```sass:SASS
p
    margin: 1em 0
    line-height: 1.5
```

上のコードはそのままStylusにコピペできます。さらに短く書きたければ、コロンを省略することも。

```stylus:Stylus
p
    margin 1em 0
    line-height 1.5
```

100行書くと100タイプも省エネできるので、「コロンなし」は結構ヤミつきになります。

## 3）&が使いやすい

SASS（SCSS）の場合...

```scss
.block {
  foo: value
  @at-root {
    #{&}__element {
      bar: value
      @at-root {
        #{&}--modifier {
          baz: value
        }
      }
    }
  }
}
```

Stylusだと、

```stylus
.block
  foo value

  &__element
    bar value

    &--modifier
      baz value
```

で、出力される内容はどっちも同じ。[^1]

```
.block                    { foo: value; }
.block__element           { bar: value; }
.block__element--modifier { baz: value; }
```

[^1]: `.scss`ではなく`.sass`の方なら、v3.3からStylusと同じ記法が使えるようになりました。

## 4）透過的にMixinが使える

SASSの場合...

```sass
@import "bourbon"

.box
    +size(100px)
    +clearfix()
```

Stylusだと、

```Stylus
@import "kouto-swiss"

.box
    size 100px
    clear fix
```

StylusならネイティブのプロパティかのようにMixinを扱えます。

## 5）変数が透過的にも使える

SASSの場合...

```sass
$red: #ff00c6

.foo
    color: $red
```

Stylusだと、

```
red = #ff00c6

.foo
    color red
```

一体これの何が大きく違うのかというと、まず以下のような生CSSのコードがあるとします。

```css
body {
    color: gray;
    font-size: medium;
    font-family: sans-serif;
}
```

SCSSやStylusならこのままコンパイルすることができますが、Stylusではさらに変数を加えることができます。

```Stylus
gray       = #333
medium     = 14px
sans-serif = unquote('Arial, sans-serif')

body {
    color: gray;
    font-size: medium;
    font-family: sans-serif;
}
```

既存のコードには一切手を加えず、コンパイル後の内容を変更することができます。

## 6）環境構築が楽

Stylusの利用にはNode.jsのインストールだけでOK。Rubyの環境構築は不要です。
Stylusの作者がNode界の[巨匠](https://medium.com/@tjholowaychuk)なだけに、そこは必然的に。

## まとめ

実務でもバリバリ使っていますが、[Stylus](http://learnboost.github.io/stylus/)（[日本語訳](http://kyosuke.tumblr.com/post/14003234226/stylus)）オススメですよ！
コンフリクトの解決を記録して再適用する git rerere

# はじめに

Git を使う場合、ブランチの作成とマージを頻繁に行うような運用が多いと思います。例えば、機能追加やバグ修正を行う場合には本流ブランチからトピックブランチを作成して、作業はトピックブランチにコミット、作業が終わったらトピックブランチを本流ブランチにマージ、といった運用です。

この場合、トピックブランチは細かい単位で作成して、作業が終わったらすぐマージする、というのが良いプラクティスであろうと思います。すぐマージすると、コンフリクトは起こらない場合が多いです。とはいえ、やはりコンフリクトが起こる場合はあります。

コンフリクトが起こる場合とは、`feature/12345` ブランチを作成して作業して `master` ブランチにマージしようとしたところ、別の誰かによる変更が既に `master` ブランチに取り込まれており、しかもその変更箇所が `feature/12345` ブランチでの変更箇所と重なっている、といった場合です。個人的には、何らかの IDE のプロジェクトファイルを共有している場合に、プロジェクトファイルの変更はコンフリクトしやすいと思います。

マージでコンフリクトが起こった場合は、それを解決します。どのように解決するかは、コミットしたい人が実際にコンフリクトしている部分を見て判断するしかないので、少々面倒な作業です・・・。それでも、大抵は一度だけの作業で、同じコンフリクトに何度も出会うことはなさそうです。

ところが、マージして `git push` する前に、`feature/12345` ブランチの内容の間違いに気づいてマージ作業をいったん取り消したとしましょう。そして、修正後に再びマージしようとして、同様のコンフリクトに遭遇・・・。一度だけのはずの作業をもう一度する羽目に・・・。

面倒ですよね。そこで登場するのが `git rerere` です。

# git rerere とは

Git には、[git rerere](http://git-scm.com/docs/git-rerere) という仕組みがあります。

これは、コンフリクトを解決してコミットした際に、どのように解決したかを自動的に記録してくれます。そして、同様のコンフリクトが発生した場合に、自動的に同じ解決を適用してくれます。

この機能は、マージやリベースのコンフリクトに対して働きます。

なお、rerere は "Reuse recorded resolution of conflicted merges" の略です。

# 使い方

## 事前設定

デフォルトでは無効になっています。使いたいリポジトリで以下を実行すると有効になります。

```
git config rerere.enabled true
```

または、`.git` ディレクトリ以下に `rr-cache` ディレクトリが存在していれば有効になります。

また、以下を実行するとすべてのリポジトリで有効になります（[Pro Git Book : 7-9 Rerere](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-Rerere)）。

```
git config --global rerere.enabled true
```

## rerere の発動

設定が有効になっていれば、通常の Git 操作のタイミングで自動的に rerere の機能が発動します。

`git merge` でコンフリクトが発生した場合には、以下のように出力されます。"Recorded preimage for ..." のメッセージが出ています。

```
% git merge hoge
Auto-merging hoge.txt
CONFLICT (content): Merge conflict in hoge.txt
Recorded preimage for 'hoge.txt'
Automatic merge failed; fix conflicts and then commit the result.
```

コンフリクトを解決して `git commit` すると、以下のように出力されます。"Recorded resolution for ..." のメッセージが出ています。ここで、どのように解決したかを自動的に記録しています。

```
% git commit
Recorded resolution for 'hoge.txt'.
```

その後、`git merge` で同様のコンフリクトが発生した場合には、以下のように出力されます。"Resolved ... using previous resolution." のメッセージが出ています。ここで、自動的に同じ解決を適用しています。

```
% git merge hoge
Auto-merging hoge.txt
CONFLICT (content): Merge conflict in hoge.txt
Resolved 'hoge.txt' using previous resolution.
Automatic merge failed; fix conflicts and then commit the result.
```

この時点ではコミットまではされません。内容に問題がなければ `git commit` を行えばマージ完了です。

上記では `git merge` の場合を例に挙げましたが、`git rebase` の場合も同じように働きます。

## git rerere コマンド

`git rerere` というコマンドもあるのですが、このコマンドを直接使うことはほとんどありません。一応、ざっとサブコマンドを挙げておきます。

* `git rerere forget <pathspec>` : 指定した記録を削除します。
* `git rerere gc` : 古い記録を削除します。
* `git rerere clear` : rerere 処理が中断してしまったときに残るメタデータを削除します。
* `git rerere status` : rerere 処理中、記録しようとしているファイルパスを表示します。
* `git rerere remaining` : rerere 処理中、記録されないファイルパスを表示します。
* `git rerere diff` : rerere 処理中、差分を表示します。
OpenVNetのcookbook

Wakame-VDC/OpenVnet AdventCalender 2014の記事を書くにあたり、とりあえずOpenVNetをインストール。
その際、せっかくなのでchefで構築することにした。
OpenVNetは簡単にインストールできることもあってか、あるいは探し方が悪かったのか、cookbookが見当たらなかったので、[作成してみた](https://github.com/qb0C80aE/openvnet-cookbook/tree/develop)。

概要
----

* これは、Wakame-VDC / OpenVNet AdventCalendar 2014 12/12(金)の記事。
* chefでCentOS6.5 minimalにOpenVNetをインストールしてみる。

そもそもOpenVNetとは
-------------------

OpenVNetは、オープンソースのエッジオーバーレイネットワーク仮想化プロダクトで、[githubで公開されている](https://github.com/axsh/openvnet)。
同じような位置付けのプロダクトとしてはOpenDaylightのOpenDOVE、OpenContrail、MidoNetなどがある。

インストール
-----------

公式ではCentOS6.4とされているが、6.5、6.6でも動作する。
[CentOS7で動作させた方もいる模様。](http://qiita.com/nmatsui/items/4dffe37922ebdf1375cd)

流れは以下のようになる。

* CentOS6.5 minimalをインストール
* chefdkをインストール
* chefでcookbookを実行

今回はchef-client --local-mode（chef-solo相当）でインストールする。

### CentOS6.5 minimalのインストール

メディアからインストールする。

### git、chefdkのインストール

yumでインストールできる。

```bash
$ yum -y install git https://opscode-omnibus-packages.s3.amazonaws.com/el/6/x86_64/chefdk-0.3.5-1.x86_64.rpm
```

### chefでcookbookを実行

Berksfile等が入ったプロジェクトをダウンロードし、chef-clientを実行する。
デフォルトでは1boxのall-in-one構成（vnmgr、vna、webapi）でインストールされる。

```bash
$ git clone https://github.com/qb0C80aE/openvnet-chef_repo.git
$ cd openvnet-chef_repo
$ berks vendor ./cookbooks
$ chef-client --local-mode -c ./config/config.rb -j ./nodes/localhost.json
```

### インストールのパターン

roleにはall_in_one、manager、agent、webapiの4つが存在する。

|role      |インストールされるもの|
|:---------|:-------------------|
|all_in_one|vnmgr, vna, webapi  |
|manager   |vnmgr               |
|agent     |vna                 |
|webapi    |webapi              |

all_in_one以外でインストールしたい場合、roleを変更する。

vnaだけインストールしたい場合などは、run_listを修正する。

その他
------

* OpenVNetのインストールは元々が親切かつ簡単であり、少数のサーバに試験的に入れるだけであれば、手動インストールしても掛かる時間に大して差がない。
* しかしエッジオーバーレイという特性上、将来的には多くのノードに展開して運用するものであり、cookbookがあったほうが後々の為にはなる、かも、しれない。
Blenderのショートカット（エディットモード編）

# Blenderのショートカット（エディットモード）

間違いや、良く使うもので漏れているものがあればコメントお願いします。

<dl>
<dt>TAB</dt><dd>オブジェクトモードへ</dd>
<dt>E</dt><dd>押し出し（Extrude）</dd>
<dt>Alt+E</dt><dd>押し出しメニューをポップアップ</dd>
<dt>F</dt><dd>面/線を作成</dd>
<dt>GG</dt><dd>エッジスライド（点/線を線/面に沿って移動）</dd>
<dt>Shift+V</dt><dd>エッジスライド（点/線を線/面に沿って移動）</dd>
<dt>I</dt><dd>面インセット（Inset faces）</dd>
<dt>J</dt><dd>面上で点と点をつなぐ</dd>
<dt>K</dt><dd>ナイフツール</dd>
<dt>V</dt><dd>点/線を切り開く（Rip）</dd>
<dt>Y</dt><dd>点・線のコピー</dd>
<dt>W</dt><dd>スペシャルメニューをポップアップ</dd>
<dt>Ctrl+V</dt><dd>点メニューをポップアップ</dd>
<dt>Ctrl+E</dt><dd>線メニューをポップアップ</dd>
<dt>Ctrl+F</dt><dd>面メニューをポップアップ</dd>
<dt>Ctrl+TAB</dt><dd>選択モード（点/線/面）メニューをポップアップ</dd>
<dt>Alt+M</dt><dd>マージメニューをポップアップ</dd>
<dt>Alt+RMB</dt><dd>ループ選択</dd>
<dt>Ctrl+Alt+RMB</dt><dd>リング選択</dd>
<dt>Ctrl+L</dt><dd>つながっているものを全選択</dd>
<dt>Ctrl+RMB</dt><dd>最短距離を全選択</dd>
<dt>Shift+G</dt><dd>長さ/角度などが同じものを一括選択するメニューをポップアップ（Select Similar）</dd>
<dt>Ctrl+LMB</dt><dd>点を作成（ドラッグすると投げ縄選択）</dd>
<dt>Ctrl+B</dt><dd>ベベル（Bevel）</dd>
<dt>Ctrl+R</dt><dd>ループカット</dd>
<dt>Ctrl+T</dt><dd>四角形を三角形に分割</dd>
<dt>Shift+W</dt><dd>ピボットポイントを中心に回転（Warp tool）</dd>
<dt>Alt+S</dt><dd>パイプ状のものを太さだけ拡大/縮小</dd>
</dl>
古いCentOSリポジトリのミラーサイト

http://mirror.centos.org/centos/6.4/
readme だけが置いてある。。

これは
http://vault.centos.org/
にミラーがあります。

## CentOS 5.11用

```rb:/etc/yum.repos.d/CentOS-Base.repo
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the 
# remarked out baseurl= line instead.
#
#

[base]
name=CentOS-$releasever - Base
baseurl=http://vault.centos.org/5.11/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

#released updates 
[updates]
name=CentOS-$releasever - Updates
baseurl=http://vault.centos.org/5.11/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
baseurl=http://vault.centos.org/5.11/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
baseurl=http://vault.centos.org/5.11/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib
baseurl=http://vault.centos.org/5.11/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5
```
Raspberry PiにRuby 2.1.5を入れてみた

Raspberry Pi+Raspbianの環境に、新しいRubyを入れています。

```
$ cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 7 (wheezy)"

$ uname -a
Linux raspberrypi 3.12.28+ #709 PREEMPT Mon Sep 8 15:28:00 BST 2014 armv6l GNU/Linux

$ ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [arm-linux-eabihf]
```



## 準備

Rubyのバージョンを切り替える``rbenv``を入れます。

```
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
```

インストールできるバージョンを調べる。

```
$ rbenv install --list
Available versions:
  1.8.6-p383
  1.8.6-p420
(略)
  2.1.3
  2.1.4
  2.1.5
(略)
```

## Ruby 2.1.5のインストール

頭に``time``がついているのは処理時間を計測するためです。本来は不要。

```
$ time rbenv install 2.1.5
Downloading ruby-2.1.5.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/4305cc6ceb094df55210d83548dcbeb5117d74eea25196a9b14fa268d354b100
Installing ruby-2.1.5...
Installed ruby-2.1.5 to /home/pi/.rbenv/versions/2.1.5


real	137m34.468s
user	128m43.180s
sys	4m34.110s
```

2時間強かかりました。

## バージョン切替

```
$ rbenv versions
* system (set by /home/pi/.rbenv/version)
  2.1.5
```

ちゃんと2.1.5が入ってますね。

```
$ rbenv global 2.1.5
$ rbenv rehash
$ ruby -v
ruby 2.1.5p273 (2014-11-13 revision 48405) [armv6l-linux-eabihf]
```

でけた！
vim-jsonのダブルクォート非表示機能を無効化する


vim-jsonは、JSONのシンタックスハイライトやインデントをいい感じにしてくれるVimプラグインです。

https://github.com/elzr/vim-json

vim-jsonでデフォルトで有効になっている機能の一つに、JSONのKey/Valueを囲んでいる「ダブルクォート」を隠して表示してくれる、というものがあります。

下のキャプチャのように、現在のカーソル行のダブルクォートのみが表示され、それ以外の行にはダブルクォートは表示されません。

![vim-json](http://i.gyazo.com/af0e3d998371a82ad45dddb585f841ed.gif "vim-json")

個人的にはこの機能は不要、というかJSONの編集時にはかえって邪魔になってしまうので、無効化したいと思っていました。

無効化するには、`.vimrc`に以下の設定を記述すればよいです。

```.vimrc
let g:vim_json_syntax_conceal = 0
```

これで、下のキャプチャのようにダブルクォートが常に表示されるようになります。編集しやすくなりました。

![vim-json](http://i.gyazo.com/c8afcbbf85838fb980c3bdb458739cb9.gif "vim-json")
[iOS] MPMusicPlayerController を利用する際の注意点

# MPMusicPlayerController を使って iPod の音楽を再生
MPMusicPlayerController を利用すると、簡単に iPod の音楽を再生できる。例えば、以下のようなコードを記述すれば、iPod 内の全ての音楽を読み込んで再生できる。

```objectivec
self.musicPlayer = [MPMusicPlayerController applicationMusicPlayer];
[self.musicPlayer setQueueWithQuery:[MPMediaQuery songsQuery]];
[self.musicPlayer play];
```

また、前の曲への移動、あるいは次の曲への移動もできる。前の曲に移動するには、

```objectivec
[self.musicPlayer skipToPreviousItem];
```

とするだけである。同様に次の曲に移動するには、

```objectivec
[self.musicPlayer skipToNextItem];
```

である。

ここで注意しないといけないのは、上記の **skipToPreviousItem** と **skipToNextItem** は、**play** を実行しないと機能しない点である。つまり、`[self.musicPlayer setQueueWithQuery:[MPMediaQuery songsQuery]];` の実行後に、`[self.musicPlayer skipToNextItem];` を実行しても次の曲を選択できない。

理由は、**self.musicPlayer.nowPlayingItem** の値が **nil** だから。これは通常、**play** を実行することで設定される。

## MPMusicPlayerController 使用時の基本形

MPMusicPlayerController を利用する際に、とりあえず次のようなコードを実装すれば、上記のような問題に遭遇し、解決まで半日も費さずに済む。

```objectivec
self.musicPlayer = [MPMusicPlayerController applicationMusicPlayer];
MPMediaQuery * query = [MPMediaQuery songsQuery];
[self.musicPlayer setQueueWithQuery:query];
self.musicPlayer.nowPlayingItem = query.items[0]; // ここで初期設定を実施！
```

解決方法を見れば、すごく当然のことだ。しかしながら、GUI 経由の簡易音楽プレイヤーを実装して、起動後に再生せずに次の曲を選択して期待通りに機能しない場合、原因究明までかなりの時間を浪費する。

実際は、nowPlayingItem を readonly プロパティと勘違いしていたのが、なかなか解決できなかった原因なんだけどね。
exited with status 7でvzctl stop が効かない

```bash:
# vzctl stop 102
Stopping container ...
Child 793701 exited with status 7
Killing container ...
Child 793717 exited with status 7
Unable to stop container
```

コンテナを停止できない現象に遭遇。
WebUIから停止もできなかった。

* [Problems with shutting down container](http://forum.proxmox.com/threads/12587-Problems-with-shutting-down-container)
* [OpenVZ Forum: Support » Child * exited with status 7](http://forum.openvz.org/index.php?t=msg&goto=51370&)

ホストOSを再起動するしかない。
VimでEmacsのFind Alternate fileを実現

# これは何か？

開くファイルを間違えた時に、正しいファイルで開き直すための機能が、どうやら Vim には無いようです。

Emacs から Vimに乗り換えて一週間、Vim script を勉強しつつ書いてみました。


## ソース

    command! -nargs=1 -complete=file FindAlternateFile call <sid>Hykw_findAlternateFile(<q-args>)
    
    function! Hykw_findAlternateFile(file)
      let current_bufferNumber = bufnr('%')
      execute "edit " . a:file
      execute "bdelete " . current_bufferNumber
    endfunction

## 使い方

.vim の適当な所にソースを貼り付ければOKです。あとはファイルを間違えて開いた時に

    :FindAlternateFile 開き直すファイル名

で呼び出します。ちなみにTabでディレクトリ/ファイル名の補完も効きます。
CakePHP3でSmartyを使う

In :[English](http://qiita.com/yukikikuchi/items/f8d7ab3eb068e17b6b67)
In :[español](http://qiita.com/yukikikuchi/items/4c7904ff196e2811a5ca)


[菊池 祐騎](https://www.trace-japan.co.jp)です。
CakePHP3.0にSmartyを入れる手順です。

------------------

2014/12/14現在最新版である
CakePHP 3.0.0-beta2
を前提とした記事です。

------------------

#CakePHPをインストール

割愛

:new: インストール方法を加筆した最新記事はこちら :point_right: http://qiita.com/yukikikuchi/items/3c0c19d17c62bdd56c8c

#SmartyViewクラスをダウンロード

https://github.com/yukikikuchi/cakephp3-smartyview
をダウンロード

#Smarty本体の設置
Smarty本家サイト
http://www.smarty.net/
からstableをとってくる
2014/12/14現在の最新版は3.1.21です。

app/vendor/smarty
にlib配下のファイルを配置

#SmartyViewを使用できるようにする

app/src/View/
にSmartyView.php
を配置

AppControllerを修正

``` php:AppController.php
class AppController extends Controller {
	public $viewClass = 'App\View\SmartyView';
// 中略
}
```

#レイアウトの修正

src/Template/Layout/default.tplを作成

``` tpl:default.tpl
{$this->fetch('content')}
```

完了
RubyMineでi18nの文字が自動展開させないようにしたい

# RubyMineでi18nの文字が自動展開させないようにしたい

## はじめに

初めてRubyMineを使ってみたときに、最初に気になったことがあります。

i18n対応でconfig/locales/application.ja.ymlに書いてたはずの日本語文字が、コード上に表示されていました。
（次の画面でのerrorに渡す文字列）

![page1.png](https://qiita-image-store.s3.amazonaws.com/0/38173/45074c48-b47a-c595-4d80-e947cd72f60d.png)

あれ？直接日本語書いてたかな？と疑問に思って文字列の上にカーソルを持っていくと、ちゃんと書いてたコードが表示されました。

![page2.png](https://qiita-image-store.s3.amazonaws.com/0/38173/5a926bdc-34bb-55f0-f800-fd4c101bb3f5.png)

そうか！RubyMineが自動展開しているんだな！とようやく気づきました。

個人的にはデフォルトはコードがそのまま表示されてて、必要に応じて日本語で見れればうれしいと思っています。

きっと設定があるはず、ということで探してみました。

## デフォルトではi18n文字が自動展開される

インストールした状態では自動展開されています。

![page13.png](https://qiita-image-store.s3.amazonaws.com/0/38173/f33a124a-0710-389e-0852-0cb6132002d2.png)

この状態で本来のコードを表示するには、いくつかやり方がありました。

- 日本語文字部分をクリックする
- キャレットを日本語文字部分に移動させる
- 日本語文字部分に移動し、メニューから Code > Folding > Expand を実行する
- 日本語文字部分に移動し、ショートカットでExpandを実行する
- メニューから Code > Folding > Expand All を実行する

![page12.png](https://qiita-image-store.s3.amazonaws.com/0/38173/9ca3747e-c1d0-4ee5-0f39-cd213da7a6b8.png)

本来のコードが表示されます。

![page3.png](https://qiita-image-store.s3.amazonaws.com/0/38173/35477a02-5194-c521-4b9c-71a7740635d5.png)

## デフォルトで自動展開されないようにする

本来のコードをそのまま表示させたいので設定を変更します。

まずメニューからPreferencesを選択します。
さらに、Editor > General > Code Foldingを選択すると、`Ruby i18n strings`という設定が見つかります。

![page7.png](https://qiita-image-store.s3.amazonaws.com/0/38173/e84dbbc5-8281-f522-019d-97580ab43367.png)

この`Ruby i18n strings`のチェックを外します。

![page8.png](https://qiita-image-store.s3.amazonaws.com/0/38173/97b9ac7e-c8e8-bf1e-dc23-b69e7a1a27fe.png)

画面右下の`OK`ボタンを押下すると設定完了です。
ただし、現在開いているファイルにはまだ反映されないので、**開いているプロジェクトを一度閉じて開き直す**と設定された内容で表示される事になります。

![page9.png](https://qiita-image-store.s3.amazonaws.com/0/38173/316bab98-a05f-1923-bb63-3d1889f01500.png)

`Apply`ボタンで反映されると思いましたが、プロジェクトを閉じてもう一度開き直すことが必要でした。（このことを知らなかったのではまっていました。@spring_akiさんありがとう！）

プロジェクトを開き直すと、この通り本来のコードが表示されるようになりました。

![page10.png](https://qiita-image-store.s3.amazonaws.com/0/38173/6136e4b2-7d59-3237-1b6a-5fab41c9d678.png)

## localesに設定した日本語文字列を確認したいとき

メニューかショートカットでCollapseを実行すると日本語文字に切り替わります。
(Expand <-> Collapseで相互に切替)

Collapse

![page13.png](https://qiita-image-store.s3.amazonaws.com/0/38173/f33a124a-0710-389e-0852-0cb6132002d2.png)

Expand

![page4.png](https://qiita-image-store.s3.amazonaws.com/0/38173/2f74a7ab-d637-e234-6468-ac7b85539480.png)

もしくは、Command+Bで定義位置にジャンプさせます。

[RubyMineのコードジャンプ機能は本当にすごい！！困ったときはCommand+Bを押すべし！](http://qiita.com/jnchito/items/bcb2bb5311a44113fdd9)

![page14.png](https://qiita-image-store.s3.amazonaws.com/0/38173/96f57a5a-3039-d764-a486-80356ab4f915.png)

ということで、自分の使いやすい設定にできました。
文字列がオブジェクトであるとは、こういうことだーッ！（ぼかーん

プロローグ
---
ランバラルはアムロに戦場の厳しさを教えた。では文字列は我々にオブジェクトとは何かを教えてくれるだろうか。君はオブジェクトの涙を見る。

Smalltalkでの文字列
---
Smalltalkでは文字列もオブジェクトです。i番目の文字を取り出したり、あるいは書き換えたりすることができます。これは大概の言語でもそうだと思います。

残念なお知らせがあります。Smalltalkの文字列には文字を「追加」することができません。追加できないというのは、連結できないという意味ではありません。'abc'という文字列オブジェクトがあった時、'xyz'と連結すると'abcxyz'という新しい文字列オブジェクトが作られます。しかしOrderedCollection(JavaでいうArrayListみたいなもの)に要素を追加するのと同じように、文字列にもその文字列オブジェクト自体に要素を追加できるようにしたい。

テスト
---
つまり、このようなコードを書けるようにしたい。今回は処理系は [Pharo 3.0](http://pharo.org/) を使います。

```smalltalk:workspace
| hello world |
hello := 'Hello'.
world := 'World'.
hello add: Character space.
hello addAll: world.
hello "==> 'Hello World'"
```

Pharo 3.0の標準のライブラリでは以下のようになります。

![スクリーンショット 2014-12-14 7.27.14.png](https://qiita-image-store.s3.amazonaws.com/0/59918/0b7163bc-c346-22d1-a970-4740552bdb51.png)

叱られちゃった。てへ。

でもね、Smalltalkではエラーメッセージは異常終了ではないのですよ。まさにこれからプログラミングが始まりますよという、オープニングファンファーレなのです。（キリリ

Stringクラスを書き換える
---
文字列はオブジェクトです。オブジェクトというのは、ユーザー（プログラマ）が中の構造やコードを見ることができ、また、自由に書き換えることができるものを指します。さあ、文字列オブジェクトに「要素の追加の仕方」を教えてあげましょう。

#### Symbolを守ってあげる

SmalltalkではSymbol（書き換えができない文字列）は文字列の一種になっています。文字列が要素の追加ができるようになると、Symbolも要素を追加できてしまうので、Symbolには影響が及ばないように守ってあげましょう。

```smalltalk:Symbol
add: aCharacter
    ^ self shouldNotImplement
```

### Stringにadd:を教える

さあ、安心して文字列に要素の追加の仕方を教えましょう。とても簡単です。

```smalltalk:String
add: aCharacter
	| expanded |
	expanded := self copyWith: aCharacter.
	self become: expanded.
	^ aCharacter
```

`copyWith:`というのは、引数`aCharacter`で与えた文字を末尾に追加した「新しい文字列」を生成するためのメッセージです。次に、`self become: expanded`で、自分自身がその「新しい文字列」に成り代ります。内容をコピーするのではなく、オブジェクトとしてのアイデンティティを交換します。すると、新しい「自分自身」は、`aCharacter`を追加された状態になっています。

### テスト

さあ、試してみましょう。

![スクリーンショット 2014-12-14 7.25.10.png](https://qiita-image-store.s3.amazonaws.com/0/59918/4e511fce-b9ea-6cf0-749d-0bcb6955be7b.png)

バッチリですね。変数`hello`を書き換えたのではなく、`'Hello'`という文字列自体がどんどん伸張していきます。

ええい、要素の削除はできんのか！
---
はい、同じやり方でできます。例えばこんな感じ。

```smalltalk:Symbol
remove: aCharacter ifAbsent: errorBlock
    ^ self shouldNotImplement
```
```smalltalk:String
remove: aCharacter ifAbsent: errorBlock
	| index shrinked |
	index := self indexOf: aCharacter ifAbsent: [ ^ errorBlock value ].
	shrinked := (self copyFrom: 1 to: index - 1) , (self copyFrom: index + 1 to: self size).
	self become: shrinked.
	^ aCharacter
```
![スクリーンショット 2014-12-14 7.34.10.png](https://qiita-image-store.s3.amazonaws.com/0/59918/23a6cb0f-c3a8-4119-6384-10581e6946f2.png)

落とし穴に落ちるとは、こういうことだー！（ぼかーん
---
調子に乗ってリテラル文字列を書き換えるとひどい目に合います。例えばコンパイラがリテラルの生成をケチると、こういう目にあいます。

![スクリーンショット 2014-12-14 7.36.03.png](https://qiita-image-store.s3.amazonaws.com/0/59918/76eed477-a7a0-8020-b264-0cf4da71b54a.png)

最後、`'Hello'`という文字列リテラルを返しているので、結果は`'Hello'`になるはずです。しかし何故か`'Hello World'`が。これは2箇所の同じ字面の文字列リテラルを1つのオブジェクトで使いまわしているからですね。**要素の追加に限らず** リテラル文字列は書き換える前にコピーして使いましょう。

![スクリーンショット 2014-12-14 7.37.49.png](https://qiita-image-store.s3.amazonaws.com/0/59918/9a675b35-4174-e4d5-f00d-81585636fd75.png)

おわりに
---
標準ライブラリであろうが、文字列のような基本的なオブジェクトであろうが、欲しいと思った機能は実現する。実現できる。それがオブジェクト指向プログラミングの楽しさだと思います。鳴かぬなら鳴き方を教えてやろうホトトギス。
watchmedoを使ってファイルの変更を監視して、テスト実行する


http://qiita.com/hagino3000/items/916bf61a0639b46ccffd

phpunitのテストをいちいちコマンド実行して確認するのめんどくさいなぁ。。。と思ってググったら
`watchmedo`なるものが出てきたので使ってみた。

```
$ pip install watchdog
$ watchmedo shell-command --interval=5 --patterns="*.php" -R -D --command='clear; phpunit' .
```

こんな感じで動いたー。

しかし、vimでautosave使っていると、ちょっと変更する度に視界の一部がチカチカ動いているのをみると、気になって仕方がないw

ので使わないであろう。
gpart で GPT パーティションに BIOS boot 領域を作成する

https://wiki.archlinux.org/index.php/GRUB_(%E6%97%A5%E6%9C%AC%E8%AA%9E)#GUID_Partition_Table_.28GPT.29_.E7.89.B9.E6.9C.89.E3.81.AE.E6.89.8B.E9.A0.86

より試行錯誤した雑記で、気が向いたら清書する。

Arch wiki に記載のある方法で、何も考えずに gpart で 1007 KiB の boot 領域を作成すると
先頭領域 17 KiB を含む領域は 2048 KiB バウンダリに喰われて割り振れず、意図したところと違う
割り振りとなる。

一旦 gpart のメインメニューから x で expert 的なメニューに入り、l でアライメントを 1 とかに
して m でメインメニューに戻り boot パーティションを作成してからアライメントを戻して対応した。
Rubotyでwandboxの採点を行う


##URL
http://rubygems.org/gems/ruboty-wandbox

##Config
- WANDBOX_BASE: Wandboxのベース。
  - 指定がなければ`http://melpon.org/wandbox/`
  - 最初のhttp://は必要。最後のスラッシュはあってもなくても良い。

##Usage
- `/wandbox list/`

コンパイラ一覧を返す。

```
gcc-head: warning,optimize,cpp-verbose,boost-nothing,boost-1.47,boost-1.48,boost-1.49,boost-1.50,boost-1.51,boost-1.52,boost-1.53,boost-1.54,boost-1.55,boost-1.56,sprout,c++98,gnu++98,c++11,gnu++11,c++1y,gnu++1y
(snip)
```

- `/wandbox setinput ?(?<input_uri>\S*)/`

stdinを保存する。
input_uri: 入力ファイル(空文字列ならクリア)
open-uriなKernel.openを使うので、入力ファイルはhttp://も指定できる。以下同様。

- `/wandbox submit (?<language>\S+) (?<source_uri>\S+) ?(?<input_uri>\S*)/`

language: コンパイラID,オプションID(カンマ区切り)。それぞれ完全一致でなければならない。
source_uri: ソースファイル
input_uri: 入力ファイル(空文字列ならsetinputの内容を使用)

- `/wandbox view ?(?<id>\w*)/`

id: wandbox ID(空文字列なら直前のsubmitで返されたIDを使用 ※現在permlinkを保存しない設定なので特に意味は無い)

##Example

- First

```
$ ruboty
> ruboty wandbox view geELii9xq6Tpxqit
GNU C Library (Ubuntu EGLIBC 2.15-0ubuntu10.9) stable release version 2.15, by Roland McGrath et al.
(snip)
> ruboty wandbox list
gcc-head: warning,optimize,cpp-verbose,boost-nothing,boost-1.47,boost-1.48,boost-1.49,boost-1.50,boost-1.51,boost-1.52,boost-1.53,boost-1.54,boost-1.55,boost-1.56,sprout,c++98,gnu++98,c++11,gnu++11,c++1y,gnu++1y
(snip)
elixir-head: 
(snip)
groovy-2.2.1: 
```

- LazyK Test

```
> ruboty wandbox submit lazyk https://raw.githubusercontent.com/cielavenir/codeiq_solutions/master/q801/girl.lazy
ガールフレンドめっちゃほしい！
```

- Elixir Test

```
> ruboty wandbox setinput https://raw.githubusercontent.com/cielavenir/procon/master/A
Input set.
> ruboty wandbox submit elixir-head https://raw.githubusercontent.com/cielavenir/procon/master/tyama_icpc2007dA.ex
504
473
518
638
507
538
> exit
```

- C++ Test

```
> ruboty wandbox setinput https://raw.githubusercontent.com/cielavenir/procon/master/rosalind_io/rosalind_gaff.txt
Input set.
> ruboty wandbox submit gcc-head https://raw.githubusercontent.com/cielavenir/procon/7c42add113c3bdbd276c00916ca309987e173cca/rosalind/tyama_rosalindGLOB-rosalindGCON-rosalindGAFF-rosalindLOCA.cpp

(NOTE: possibly compiler error because of C++11 code)
> ruboty wandbox submit gcc-head,c++11 https://raw.githubusercontent.com/cielavenir/procon/7c42add113c3bdbd276c00916ca309987e173cca/rosalind/tyama_rosalindGLOB-rosalindGCON-rosalindGAFF-rosalindLOCA.cpp
303
LQPEMRYYPWTWRDLRCTRFQEVQCKG---------LRQQDVRFTVLKTTGSCNQFVEQREGNSLTNA-------HRFERESCVNWETEHVFFMTHWENMGNEF
LQPEMRYYPWTWSDLRCTRFQEVQIRSQAKGRMRKLFRQQDVRFTV--------QFV-------LTNAIPKEPGQFRFERESCVNWETEHVFFMTHWCNMGNEF
```

- stakemura氏サーバーテスト

```
$ WANDBOX_BASE=http://apex.cloudapp.net/wandbox ruboty
> ruboty wandbox list
gcc-head: c++98,gnu++98,c++11,gnu++11,c++1y,gnu++1y
gcc-4.8.2-c: c89,c99,c11
(snip)
> exit
$
```
Javaプロセスの解析


**JavaのプロセスIDを表示する**
`jps`

**スレッドダンプを取得する**
`kill -quit [pid]`
or
`jstack [pid]`

スレッドダンプを取得することで、 Java のプロセス内部で動作している各スレッドの挙動を確認できる。
Javaのプログラムがフリーズした場合や、パフォーマンス低下が見られる場合などに取得すると、
どのスレッドが停滞しているのか、プログラム中具体的にどこで止まっているのかを解析可能。

スレッドダンプは、こんな感じで出力されていく。

*スレッド名 prio=優先度 tid=スレッドID nid=管理ID 状態 スタックアドレス*
*java.lang.Thread.State: 状態*
*スタックトレース1*
*スタックトレース2*
*...*

**ヒープダンプを取得**
jmap -dump:format=b,file=heapdump.out {pid}

解析ツールは後日調べるぞい。
Android端末におけるメニュー表示について

さて。とあるML(思いっきり日本Androidの会ですが)で、こんな記事を見つけました。

* [日本Androidの会 - 一部端末でメニューが表示されない](https://groups.google.com/forum/#!topic/android-group-japan/F1A3rfBjCqA)

内容としては、LG G Flexでメニューがアプリによってはメニューが表示されないことがあるというもの。
自分が先日購入したisai FLで、アクションバーに対応していない(Android2.x以前用の)アプリでは、メニューが表示されず、メニューを示す三点リーダがナビゲーションバー(画面下のソフトキー領域)に出ることもないという挙動を知っていたので、もしかしたらそれかも？と自分が返信をしたものです(isai FLでは、マルチタスクキー長押しでメニューを表示させることができるようでした)

* [参考映像](https://vine.co/v/O6jbtIF5T1m)

# てなわけで、あちこち調査してみた
え、もしかしてこの辺の挙動って、メーカーごとに違うの？と思って、アクションバー非対応アプリを起動したときの挙動を調査してきました。なお、タブレットしか出してないメーカーは未調査です。

## 三点リーダがナビゲーションバーに出てくるメーカー(Nexusシリーズと同じ挙動)
* SONY
* HTC
* HUAWEI(ハードキーのない端末)
* ASUS(ハードキーのない端末)
* 京セラ(京セラはハードウェアキー実装端末しかありませんが、アクションバー非対応のアプリを表示中のみナビゲーションバーっぽいものが表示されます→[参考映像](https://vine.co/v/Or9F2AIu6p2))

## メニューキーが端末自体にあるため挙動に変更がないメーカー
* freetel(ハードウェアキーがある)
* covia(ハードウェアキーがある)
* POLAROID(ハードウェアキーがある)
* HUAWEI(ハードキーのある端末)
* SHARP(ナビゲーションバーにメニューキーがある)
* 富士通(ナビゲーションバーにメニューキーがある)

## 上記LGと同じ挙動
* ASUS(ハードキーが存在する端末)
* LG
* Samsung
* TJC

見た感じ、この辺の挙動は機種ごとにかなり大きな違いがある模様です。京セラについてはDIGNO、URBANO、TORQUEなど、いろんなブランド名(?)で端末を出していますが、挙動は同じのようです。もしホームアプリでナビゲーションバーが出たりすると使う意欲がなくなりますね・・・。

また、ここまで挙動が変わると、使いたいアプリが必ずしもアクションバーに対応しているとは限らない現状、あまり勝手を知らない人にマルチタスクボタン長押し系の端末(LGやSamsungと同じ挙動の端末)をお勧めするのは気が引けるなあ・・・。

##結論
とりあえず、開発者の皆様は(今更ですが)アクションバーに対応しましょう。

旧来の方法でメニューを表示させるアプリはなくなってしまえばいいと思うよ(といっても、Android2.xから活用されてて以後メンテされてないアプリって結構あるんですよね…)。