OmniAICreator/Qiita-1.07M huggingface dataset:
ResqueからSidekiqに移行するときにつまずいたところ


Ruby 1.9.3p125
Rails 3.2.8
sidekiq 1.2.1

--

## Sidekiqって?

ひとことで言ってしまうと、Resqueのマルチスレッド版。
Resqueはマルチプロセスで動くけど、
Sidekiqはシングルプロセスでマルチスレッド。

Sidekiq
http://mperham.github.com/sidekiq/

## Sidekiqの特徴って?

* Resqueに比べてリソースの節約が出来る。
* Redis上のスキーマがRedisと同じなので移行が楽
* Jobの再試行がわりときれいに実装されてると思う。（個人の感想）
* お金払えば、[Sidekiq Pro](http://mperham.github.com/sidekiq/pro/)なんていう高機能なのが使える。（知らなかったｗ）

## Sidekiqの大変なところは?

Resqueに比べると、

* スレッドセーフなコードを書かないといけないのが少し手間かも。

くらいだろうか？

## Sidekiqの導入につまづいたところ

### Railsのautoloadはスレッドセーフじゃない

autoload_pathsに追加されているPathでSidekiqで使うところは、
eager_load_pathsに書き換え（or併記）しないといけない。

最初に全部読み込まないといけない。

### Resqueでよく使うActiveRecord::Base.verify_active_connections!もだめ

```ruby
ActiveRecord::Base.verify_active_connections!
```

上記のコードは除去する。
これ、ただ消すだけでいいのかねえ。

thread unsafeだって言われたから消したけど、
実際SidekiqにしてからMysql gone away!みたいに怒られたりはしていない。

## 感想

浅い記事で申し訳ないのだけど、眠いのでここまで。
Sidekiqのパフォーマンスにはとても満足してます。

今も開発が活発で、[関連プロジェクト](https://github.com/mperham/sidekiq/wiki/Related-Projects)なども出てきているのでチェックするといいかも！
Ember.js テンプレートの中で、thisが使える

> 2013/1/14 最近の変更で、{{view XxxView content="this"}} ではなく {{view XxxView contentBinding="this"}} と書かないと通らなくなってたのでその点修正しました。

これまでのサンプルで、テンプレートも書いてきてたのですが、eachを使った時に各オブジェクトを取得する方法がわかってませんでした。

どうやるのか調べてみたところ、テンプレートの中で this でコンテキストオブジェクトを参照できることがわかりました。これを使えば、各アイテムに対してactionを仕掛けることもできます。

```coffeescript
App = Ember.Application.create()

# Controllers
App.entries = Ember.ArrayController.create
  content: [
    Ember.Object.create(id: 1, body: 'hoge'),
    Ember.Object.create(id: 2, body: 'moge'),
    Ember.Object.create(id: 3, body: 'koge'),
  ]

# Views
App.ApplicationView = Ember.View.extend()

App.EntriesView = Ember.View.extend
  templateName: 'entries',
  entriesBinding: 'App.entries.content'

App.EntryView = Ember.View.extend
  templateName: 'entry',
  alert: (->
    alert(this.get('content').get('body'))
  ),
  content: null # 初期化時にセット
```

ArrayControllerのインスタンスと、それを表示するためのviewを定義しています。EntryViewはApp.entriesの各アイテムごとに生成され、アイテムはcontentメンバにセットされる想定です。

```html
  <script type="text/x-handlebars">
    {{view App.EntriesView}}
  </script>

  <script type="text/x-handlebars" data-template-name="entries">
    {{#each view.entries}}
      {{view App.EntryView contentBinding="this"}}
    {{/each}}
  </script>

  <script type="text/x-handlebars" data-template-name="entry">
    <div>
      {{id}}
      {{body}}
      <button {{action "alert"}}>alert</button>
    </div>
  </script>
```

App.EntryViewのインスタンスを挿入している箇所で、viewのcontentメンバにthisをセットしています。これにより、viewに各アイテムを割り当てることができます。あとはApp.EntryViewの中で、セットされたアイテムを参照できます。alertボタンを押すと、アイテムの内容を表示します。

以下のページでプログラムの動作を確認できます。

デモ
http://kmdsbng.github.com/emberjs_each_action/

ソース
https://github.com/kmdsbng/emberjs_each_action/blob/master/index.html
https://github.com/kmdsbng/emberjs_each_action/blob/master/js/app.coffee
Express で twitter OAuthで認証してmongoにほりこむとこまで


## Twitterアプリ登録
ここで https://dev.twitter.com/


## expressをグローバルにインスールしてアプリの雛形を作る
Generator使いたいだけなので任意

```bash:
npm install express -g
express oauth_test
```

## 必要なnpmを導入
package.jsonに追加して…

```javascript:/package.json
{
  "name": "application-name",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node app"
  },
  "dependencies": {
    "express": "3.0.3",
    "jade": "*",
    "passport": "*", // <= 追加
    "passport-twitter": "*", // <= 追加
    "mongoose": "*" // <= 追加
  }
}
```

インストール

```bash:
npm install
```
## Mongo関連を準備
mongooseいらなかったかもしれない

```js:/app.js
var mongoose = require('mongoose')

mongoose.connect("mongodb://localhost/oauth_test");

var userSchema = new mongoose.Schema({
  uid: Number
});

// mogooseからfindAndModifyがみれないので追加
userSchema.statics.findAndModify = function(query, sort, doc, options, callback) {
  return this.collection.findAndModify(query, sort, doc, options, callback);
};

var User = mongoose.model('User', userSchema);
```

## passportを使用する準備
```/app.js
var   passport = require('passport')
    , TwitterStrategy = require('passport-twitter').Strategy;

// セッションに入れるときのシリアライザ？と
// デシリアライザ？。必要だったので追加。
passport.serializeUser(function(user, done) {
  done(null, user);
});

passport.deserializeUser(function(obj, done) {
  done(null, obj);
});

// expressを設定
app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  // -- 追加しところ --
  app.use(express.cookieParser()); // session使うためにパーサーを有効に
  app.use(express.session({secret: "hogesecret"})); // session有効
  app.use(passport.initialize()); // passportの初期化処理
  app.use(passport.session()); // passportのsessionを設定(中身はしらぬ)
  // -- 追加ココまで --
  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'public')));
});
```

## passport-twitterの設定
```/app.js
passport.use(new TwitterStrategy({
  consumerKey: "<YOUR KEY>",
  consumerSecret: "<YOUR SECRET>",
  callbackURL: "http://localhost:3000/auth/twitter/callback"
}, function(token, tokenSecret, profile, done) {
  User.findAndModify({
    // Query
    uid: profile.id
  },
    // sort
    []
  ,{
    // Object
    $set: {
      uid: profile.id
    }
  }, {
    // Option
    upsert: true
  }, function(err, user) {
    if (err) {
      return done(err);
    }

    done(null, user._id);
  });
}));

// -- 追加したルート --
// ユーザーからリクエストをもらうルート
app.get("/auth/twitter", passport.authenticate('twitter'));

// Twitterからcallbackうけるルート
app.get("/auth/twitter/callback", passport.authenticate('twitter', {
  successRedirect: '/',
  failureRedirect: '/login'
}));

```

## 適当なviewを用意して完了
```/app.js
app.get('/login', routes.login);
```

```/routes/index.js
/*
 * GET login
 */

exports.login = function(req, res){
  res.render('login', { title: 'Express' });
};
```

```/views/login.jade
extend layout

block content
  a(href="/auth/twitter") login
```

## 完成サンプル
つたない説明なので動くサンプルをアップ。。。
https://github.com/sutetotanuki/node_oauth_sample
PHPでのログ出力　まとめ

フレームワークのロガーを追っていたら
基本的なPHPのログ出力方法についてわからなくなったので
基本に戻ろうと自分なりにまとめてみました。


# 環境

CentOS release 6.3 (Final)
Apache/2.2
PHP 5.3
 

# php.iniの設定

webにHTMLとして表示する場合は
ログ出力レベルを指定し、ログ表示設定をONにします。

```php.ini
error_reporting = E_ALL | E_STRICT
display_errors on
```

※商用などでは必ずOFF
ファイルに残すために、log_errorsを設定します。

```
log_errors = On
```

# httpd.confの確認

php側で設定しない場合、phpのエラーログはサーバの設定に依存します。

httpd.confのErrorLogにて設定されています。

```httpd.conf
ErrorLog logs/error_log
```

ServerRootの設定　＋　ErrorLogの設定　＝　ログ置き場ってことですね。
## 吐き出すファイルの設定

php.iniのerror_logにログの出力先を設定します。
ファイル名を記述する場合は、絶対パスで記載し、
webサーバのユーザが書き込める必要があります。
※相対パスでも書き込めますが、ドキュメントルートからになります。

```
error_log = /var/log/php/error.log

```
syslogを通して吐き出すこともできます

```
error_log = syslog
```

syslogを使用しているなら/etc/syslog.confの設定値にもよりますが、
デフォルトでは/var/log/messages　に吐かれます。
 
※syslogを使用して、phpのエラーログを別ファイルで保存するためには
ファシリティuser、レベルinfoを指定します。
例

```/etc/rsyslog.conf
user.info /var/log/php/error.log
```

設定適用のためリスタート

```
/etc/rc.d/init.d/rsyslog restart
 ```

syslogでやると結構楽ですね。
ただphp以外にuser.infoで吐かれるsyslogがあると混乱しそう。
Backlog API Scala ラッパーライブラリを作りました！

https://github.com/zaneli/escalade-backlog

# escalade-backlog

[Backlog](http://www.backlog.jp/ "Backlog") API を叩くための Scala ラッパーライブラリを作成しました。
2012/12/19 時点で [API ドキュメント](http://www.backlog.jp/api/ "Backlog API ドキュメント")に記載されている全 API に対応しています。

# 使い方
## 一般APIの使用
```
val client = BacklogClientFactory(<スペースID>, <ユーザーID>, <パスワード>).createClient
client.getProjects
client.getUser(<ユーザID or ログインID>)
client.findIssue(FindIssueParamBuilder(<プロジェクトID>).build)
client.findIssue(
    FindIssueParamBuilder(<プロジェクトID>).componentId(<カテゴリID>).milestoneId(<マイルストーンID1>, <マイルストーンID2>).build)
```

## 管理者向けAPIの使用
```
val client = BacklogClientFactory(<スペースID>, <ユーザーID>, <パスワード>).createAdminClient
client.getProjects
```
統計学における平均場近似

当初、カーネル法を行うと宣言していたのですが、心変わりして平均場近似について書いてみました。ただの勉強記録で非常に恥ずかしいのですが、よろしければご覧ください。

以下がアドレスになります。
http://d.hatena.ne.jp/det/20121218
Unity4のProjectビューを微妙に見やすく

Unity4でプロジェクトビューが新しくなったが、これが微妙に使いにくい。
内容をGUIで表示してくれてるのは嬉しいが、一発表示出来る範囲が狭くなったので一々スクロールするハメになったし、まあその他色々。
デザイナーが物を配置したり設定するのには便利な気がするが正直プログラマから見ると微妙だ。

ということで、まずは旧式のビューに治す方法
one column layoutを選択する。
![Qiita](http://blog-imgs-55.fc2.com/t/e/r/terasur/201212190026580d6s.png "Qiita")
これで旧式の1カラムに戻る。

次、カラムを「一覧表示」にする。
![Qiita](http://blog-imgs-55.fc2.com/t/e/r/terasur/20121219002705ae5s.png "Qiita")
右下のバーを左に持っていく。
すると、こうなる。
![Qiita](http://blog-imgs-55.fc2.com/t/e/r/terasur/2012121900305446a.png "Qiita")
加速度センサー、磁気センサーにかけるフィルタクラスのメモ

加速度センサーと磁気センサーの値にはノイズが入っているのでフィルタをかけるとよいとあった。
http://d.hatena.ne.jp/inutch/20120320/1332253025
ここのサイトによると、メディアンフィルタとローパスフィルタをかけるとよいとのことなので、自分なりに考えてみた。

```
import java.util.ArrayList;
import java.util.Collections;

public class SensorFilter {
	
	private ArrayList<Float> mFirst 	= new ArrayList<Float>();
	private ArrayList<Float> mSecond	= new ArrayList<Float>();
	private ArrayList<Float> mThrad		= new ArrayList<Float>();
	
	public int sampleCount=9;//サンプリング数
	public int sampleNum = 5;//サンプリングした値の使用値のインデックス
	
	private float[] mParam = new float[3];//フィルタをかけた後の値
	
	private boolean mSampleEnable=false;//規定のサンプリング数に達したか
	
	/**
	 * フィルタをかけた値を返す
	 * @return
	 */
	public float[] getParam()
	{
		return mParam;
	}
	
	/**
	 * サンプリングする値を追加
	 * @param sample 要素３のfloatの配列オブジェクト
	 */
	void addSample(float[] sample)
	{
		//サンプリング数の追加
		mFirst.add(sample[0]);
		mSecond.add(sample[1]);
		mThrad.add(sample[2]);
		
		//必要なサンプリング数に達したら
		if(mFirst.size() == sampleCount)
		{
			//メディアンフィルタ(サンプリング数をソートして中央値を使用)かけて値を取得
			//その値にさらにローパスフィルタをかける
			
			ArrayList<Float> lst = (ArrayList<Float>) mFirst.clone();
			Collections.sort(lst);
			mParam[0] =(mParam[0]*0.9f) + lst.get(sampleNum)*0.1f;
			
			lst = (ArrayList<Float>) mSecond.clone();
			Collections.sort(lst);
			mParam[1] = (mParam[1]*0.9f) +lst.get(sampleNum)*0.1f;
			
			lst = (ArrayList<Float>) mThrad.clone();
			Collections.sort(lst);
			mParam[2] = (mParam[2]*0.9f) +lst.get(sampleNum)*0.1f;
		
			mSampleEnable = true;
			
			//一番最初の値を削除
			mFirst.remove(0);
			mSecond.remove(0);
			mThrad.remove(0);
		}
	}
	
	/**
	 * 規定のサンプリング数に達したか
	 * @return
	 */
	public boolean isSampleEnable()
	{
		return mSampleEnable;
	}
	
}
```
svnの属性にめげない


svn ignoreの設定を解除する時に苦労したので
調べたsvnの属性についてのメモ
理解は浅いので間違っているところあったらどんどこ突っ込んできてください。

# 属性の概念

svnには「属性」という渦巻く概念がある。渦巻いているかはわからないが。
`svn help`コマンドで表示される利用可能なサブコマンド一覧の

```
   propdel (pdel, pd)
   propedit (pedit, pe)
   propget (pget, pg)
   proplist (plist, pl)
   propset (pset, ps)
```

prop系が主に「属性」に関係がある。

以下のドキュメント、前半部分を見ると主にcopyrightやlicense表示の時に使えるらしい。
http://discypus.jp/svnbook/svnbook_ja_html/ch07s02.html

いろいろな事に使えるsvnのメモ書き機能といったところか。

他にも、svnの機能として`svn:`の名前空間を保持していて特殊な操作を行う事が出来る。
その中に`svn:ignore`等が存在し、バージョン管理から除外する設定に使うことができる。


## svn:ignore属性の削除

`svn:ignore`の設定を削除する目的のもと調べていたので`svn:ignore`設定削除だけでも先に記しておく

```
# 設定されている属性と個数を表示
svn pl -R ./ | grep "svn:" | sort | uniq -c

# 設定ディレクトリを確認
svn pg -R svn:ignore ./

# ignore削除
svn pd svn:ignore 対象のディレクトリ
```

これでignore属性の削除が出来る


`svn proplist (plist, pl)` コマンドとedit以外は属性値を引数として与える事がほとんど必須なので、一旦設定されている属性を表示させて属性値のつづり等を確認している。
標準ままだと出力がえらい事になるのでパイプを使って重複を削除している。

属性値を確認するコマンドは忘れそうなので自分は`.bashrc`にエイリアスを張っておいた。

ちなみに追加は

```
svn ps svn:ignore 対象のディレクトリ
```

## 属性一覧

他にもある属性をかいつまんでまとめておく


### svn:ignore

svnのバージョン管理から除外したいときに設定する。
`svn st`でも表示されなくなるが
`svn st --no-ignore` で表示される。

### svn:mime-type

バイナリファイルに設定される属性。
通常svnは行単位で変更点をマージしようとするが、それを行わないようにする。
これをバイナリファイルにちゃんと設定してやるとsvnのマージやアップデートが早くなる？ってことかも？

### svn:keywords

svnの情報をファイル内に記述する事が出来る。
キーワードを設定してファイル名に`$キーワード名$`を記述しておくと展開される。
キーワードは`Date` `Revision` `Author` `HeadURL` `Id` が使用可能


### svn:eol-style

OS毎の改行コードの設定をよしなにやってくれる
賢いやつ


## config設定

毎回、属性を設定するのは面倒なので
設定ファイルに記述して自動で設定を付与する事も出来る。

```
vi ~/.subversion/config
```

ここら辺に設定例が乗っているので真似してみるのも良いかもしれない
http://trac.symfony-project.org/wiki/SymfonyRepositoryTips
Windowsでpwdコマンド

現在のパスの表示(UNIXのpwdコマンド)は、
Windowsでは引数なしのcdなので

```bat:pwd.bat
@cd
```

というバッチファイルをPathの通っている場所に置くと、pwdコマンドとして使える
（コマンドで.batは省略可能）
いといろふ #irof_history

これは、[いろふ Advent Calendar](http://atnd.org/events/34079)の19日目のエントリーです。

前日は、[@datsuns](https://twitter.com/datsuns) さんの「[いろふさんと遊びたいん？ほれだったらvimでしたらええでよ！ #irof_history](http://datsuns.hatenablog.com/entry/2012/12/18/000753)」でした。

### はじめに

前日までのCalendarを振り返ってみると、二次元から三次元まで様々な事象に存在するいろふさんですが、偶然にもとあるの事象にはまだおられないということに気づきました。
ちょっと具現化してみようと思いました。

### アスキーアート

利用したライブラリはこちら→ http://www.roqe.org/jitac/
mavenレポジトリにはありませんでした。
ので、jarをダウンロードする必要があります。

ライブラリを利用して、jpegからhtmlに変換してみます。
下のシェルスクリプトを実行すると、jpegから変換してくれます。
利用するファイルは、こちら

![いろふ](https://si0.twimg.com/profile_images/2795155199/a3ba6e45fec2eea4edb9c7d688c7c7e3.jpeg)

先ほどダウンロードしたライブラリのjarと同じ場所に設置して、ファイル名を「irof.jpeg」に変更してください。

```convert.sh
#!/bin/bash 

echo 'convert start.'

noise_option="$1"

if [ -z $noise_option ]; then
  noise_option=0
fi

echo "noise_option: [$noise_option]"

if [ -e irof.html ]; then
	rm irof.html
fi

java -jar jitac-0.2.0.jar -H -o irof.html -n $noise_option irof.jpeg

if [ -e irof.html ]; then
	echo "convert success!"
fi

exit 0

```

htmlにしてみたので、HTTPサーバーで表示してみます。
せっかくなのでGroovyでHTTPサーバーを立ち上げてみます。
参考にさせて頂いたのはこちら→ [Groovyで簡易HTTPサーバー](https://gist.github.com/1795988)

単純に表示するだけでは面白くないので、ライブラリについているノイズ機能を利用してみます。

```irof_to_ascii.groovy

import com.sun.net.httpserver.HttpExchange
import com.sun.net.httpserver.HttpHandler
import com.sun.net.httpserver.HttpServer

class Converter {

  void convert(int parcent = 0) {
		def process = "./convert.sh ${parcent/100}".execute()
		println "${process.text}"
	}

}

def PORT = 9000
HttpServer server = HttpServer.create(new InetSocketAddress(PORT), 0)

server.createContext('/', new HttpHandler() {

	@Override
    public void handle(HttpExchange exchange) throws IOException {
				        
    	def noise = [ 0, 10, 20]

    	def random = new Random().nextInt(noise.size)

		new Converter().convert(noise[random])

		def file = new File('irof.html')

		assert file.canRead()

        def bytes = file.text.bytes

        exchange.getResponseHeaders().add("Content-Type", "text/html")
        exchange.sendResponseHeaders(200, bytes.length)
		exchange.getResponseBody().write(bytes)
        exchange.close()
    }

})
server.start()

```

```server.sh
#!/bin/bash 

groovy irof_to_ascii.groovy

```

これで、[http://localhost:9000/](http://localhost:9000/) にアクセスするたびに、表情が変わった？ように見えます。

### おわりに

このように[@irof](https://twitter.com/irof)さんはアスキーアートになってしまいました。
様々な形態に変幻自在な[@irof](https://twitter.com/irof)さんは、次にどんな風に我々を驚かしてくれるのでしょうか。

明日は、[@tan_go238](https://twitter.com/tan_go238)さんの[irofコマンドをbrewでインストールしてみる](http://tango.hatenablog.com/entry/2012/12/21/025014)です。
よろしくお願いします。
AndroidでURLの画像を読み込む

AndroidでURLの画像を読み込んでDrawableに表示する方法のメモ

```
public Object fetch(String address) throws MalformedURLException,IOException {
		URL url = new URL(address);
		Object content = url.openConnection().getInputStream();
		return content;
	}
public Drawable createDrawable(String uri)
	{
		try {
			InputStream  is = (InputStream) fetch(uri);
			Drawable img = Drawable.createFromStream(is, "");
			is.close();
                        return img
		} catch (MalformedURLException e) {
			e.printStackTrace();
			Log.e("createDrawable","error:"+uri);
			return null;
		} catch (IOException e) {
			e.printStackTrace();
			Log.e("createDrawable","error:"+uri);
			return null;
		}
	}
```

通常は`url.openStream()`を使うが、回線が細いスマートフォンで実行した場合、タイムアウトが発生してしまうことがある。
そういう場合`url.openConnection().getInputStream();`を使うことでタイムアウトを任意に決めることができる。
タイムアウト時間を設定するには`url.openConnection().setConnectTimeout(XXX)`を使うらしい
http://stackoverflow.com/questions/3906372/java-openstream-error
fluentdでログに出力があった時にMD5のチェックサムの値を利用して違いがあった時に通知するためのスクリプト

エラーログとかにファイルが出力された時に
IRCとかでその更新された内容を通知するトリガーになるスクリプトをカジュアルに書きました。

cronで動かす前提で、ログファイルのチェックサムを
 ***/tmp/app-error-check.log*** に突っ込んで
現在のログファイルのチェックサム値と比較して
差があればIRCにログファイルの内容を通知するものを書きました。

通知自体は社内ツールを利用しているので
ここでは側だけを書いておきます。

````fluent-log-check.sh
#!/bin/sh

DATE=`date +%Y%m%d-%H`
FILE="FILE PATH"

##### 古いchecksum情報の取得
if [ ! -f /tmp/app-error-check.log ] ; then
     ### 古いchecksumを格納してるファイルがないよの通知処理 ###
    echo ${CHECK_SUM} > /tmp/app-error-check.log
    exit
fi

OLD_SUM=`cat /tmp/app-error-check.log`


##### 既存のログファイルのchecksumを取得
CHECK_SUM=`md5sum ${FILE}| cut -d " " -f 1`


##### デバッグ用
# echo "${CHECK_SUM}"
# echo "${OLD_SUM}"


##### checksumの差分を確認 ###
if [ "$OLD_SUM" != "$CHECK_SUM" ] ; then
    # ログが更新されてるよという通知処理 #
    echo ${CHECK_SUM} > /tmp/app-error-check.log
fi
````
shellscriptで外部コマンドに変数を渡す時はevalを使う

````eval.sh
#!/bin/bash

URL="https://www.google.co.jp/"

eval curl -o /dev/null --silent --head --write-out \
    '"STATUS CODE : %{http_code}\n"' ${URL}
````
evalは変数を展開してくれる。

````text
$ sh eval.sh
STATUS CODE : 200
````

ど、どうやるんだっけ...となったので忘れないようにメモ
OmniAuthでログイン後に呼び出されるコールバックにパラメータを渡す方法


ログインの仕方によってコールバックで呼び出すメソッドを切り替えたいもののOmniAuthで上手くやる方法がパッ見つからなかったので利用した方法。ログイン前の画面からパラメータをコールバックに渡してパラメータの値で処理を分岐させる。が、これまたコールバックに渡すパラメータの保持されているところがわかりにくかったのでメモ。

例えば「flag=1」という値をtwitterでOAuth認証した後に呼び出されるコールバックに渡したい場合

twitterの認証画面に移るリンクにクエリストリングとして「flag=1」を追加

```ruby:ログイン画面.html.erb
<%= link_to, 'twitterでログイン', '/auth/twitter?flag=1' %>
```

クエリストリングとして与えたパラメータはrequest.env['omniauth.params']にハッシュ値として保持されているのでこれを取り出す。

```ruby:認証後に呼び出されるコールバック内
flag = request.env['omniauth.params']['flag']
```
javascript object 操作メモ

```javascript:appendHasAry
var tempObj = {Area:["tiyodaku","minatoku","tyuuouku"], range: "0km-10km"};
// 配列だった場合の追加の作法
if(tempObj.Area instanceof Array) {
  console.log( tempObj.Area.length + 'array' );
  tempObj.Area[tempObj.Area.length] = "add area";
  console.log( tempObj );
} else {
  console.log('tempObj.Area not array');
}

// 配列じゃなかった場合の追加の作法
if(tempObj.range instanceof Array) {
  console.log( tempObj.range.length + 'array' );
} else {
  console.log( tempObj.range + 'array' );
  tempObj.range = [tempObj.range,"add range"];
  console.log( tempObj );
}
```
その数字より以上の、最小の２のべき乗数を求める


```

#import <stdio.h>
#import <math.h>

int pow2(int n)
{
    if(n < 0)
        return 0;
	if(n == 1)
		return 1;

    return (int)pow(2.0, (floor(log2(n - 1)) + 1.0));
}
int main(int argc, char *argv[]) {
    for(int i = 0 ; i < 1025 ; ++i)
    {
        printf("%d -> %d\n", i, pow2(i));
    }
}
```

GL等のテクスチャのためのリサイズの際などの用途用です
※n=1のとき0と出ていた間違いを修正しました
endifでもジャンプしたい 

vimの`%`で対応した括弧に飛べるのですがendifでは飛べない現状

```
<?php if ($enkannokotowari): ?>
HomuHomu
<?php else: ?>
MadoMado
<?php endif ?>
```

しかしvimの標準配布物に含まれている`matchit.vim`を使用すれば飛べるようになる
vimrcに以下を記述


``` .vimrc
source $VIMRUNTIME/macros/matchit.vim
```
UITableView.tableHeaderView の高さを変更する

UITableView.tableHeaderView の高さを変更するには、tableHeaderView を再設定する必要がある。

```objc
self.tableView.tableHeaderView.frame = rect;
self.tableView.tableHeaderView = self.tableView.tableHeaderView; // ★コレ
```

UITableView.tableHeaderView の高さをアニメーションつきで変更するには以下のようにする：

```objc
[UIView animateWithDuration:0.3
						 animations:^{
							 self.tableView.tableHeaderView.frame = newFrame;
							 self.tableView.tableHeaderView.frame = self.tableView.tableHeaderView.frame; // ★コレ
						 }
						 completion:^(BOOL finished) {}];
```

たぶん tableFooterView も同様のやり方で対応できる。
homebrewのImageMagickでRMagickがビルドできない件

(can't build RMagick with ImageMagick 6.8.0-10 installed by homebrew)

2012-12-17頃からhomebrew上でリリースされたと思しきImageMagickを用いるとRMagickがビルドできません。詰みかけたとおもいきや勘でsymlink作ったらうまくいきました。まるっ。

デフォルトのインスコ先ここだと思います。

	$ cd /usr/local/Cellar/imagemagick/6.8.0-10/lib

そうでなくても

	$ brew info imagemagick

で教えてもらえます。

	$ ls -l
	ImageMagick
	libMagick++-Q16.7.dylib
	libMagick++-Q16.dylib
	libMagick++-Q16.la
	libMagickCore-Q16.7.dylib
	libMagickCore-Q16.dylib
	libMagickCore-Q16.la
	libMagickWand-Q16.7.dylib
	libMagickWand-Q16.dylib
	libMagickWand-Q16.la
	pkgconfig

このような感じかと思われ。そしてsymlinkをつくる。

	$ ln -s libMagick++-Q16.7.dylib   libMagick++.dylib
	$ ln -s libMagickCore-Q16.7.dylib libMagickCore.dylib
	$ ln -s libMagickWand-Q16.7.dylib libMagickWand.dylib

これでRMagickはビルド時にこいつら読み込んでくれます。

	$ gem i rmagick

他にいい解決策があるかもね。でもlsした画面見るとわかるけど、-Q16なファイル名接尾辞なやつはsymlinkなんだから、-Q16なしのsymlinkもbrewが提供するべきでは。
[ネタ] C# でDictionary生成リテラル


ごめんなさいネタです。

C#でも各種LLやF#﻿にあるみたいな辞書リテラルがほしい！
ってことで、リテラルじゃないけどこんなのはどうか。

```csharp

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;

class Make
{
    public static Dictionary<string, T> Dict<T>(params Expression<Func<string, T>> []items)
    {
        return items.ToDictionary(
                    e => e.Parameters[0].Name, 
                    e => e.Compile()(null));
    }
}
```

## メリット

* 超自然に書ける。 `var dict = Make.Dict(a => 1, b => 2);`

## デメリット

* キーは文字列固定。かつ変数名として有効な文字列しか使えない
* (多分)とても遅い

まあたかが辞書の生成でこんなことしてたら見あわないですよね。
もしかすると Pythonの**kwargs 的な用途で使えるシチュエーションはあるかもだけど。
[vim][quickrun]Markdown Extraのプレビュー

[Markdown Extra](http://michelf.ca/projects/php-markdown/extra/)のHTML変換として、[BlueFeather](http://ruby.morphball.net/bluefeather) を使用する場合のQuickrunの設定。 <br>

```vim
let g:quickrun_config['markdown'] = {
    \ 'command'  : 'bluefeather',
    \ 'exec'     : 'cat %s | %c -',
    \ }
```
#parameters 情報です

いまいです。

こんにちわ。突然ですが、キーワード引数って使ってますか？

```ruby
->(k: :v, **h){[k, h]}[]      #=> [:v, {}]
->(k: :v, **h){[k, h]}[k: :V] #=> [:V, {}]
->(k: :v, **h){[k, h]}[K: :V] #=> [:v, {:K=>:V}]
```

仮引数にハッシュを書くと、キーが変数名に、値はそのデフォルト値になるって感じでしょうか。** は、仮引数で指定しなかったペアをまとめてハッシュで受け取れます。

それはそれとして、Proc#parameters という、メタプログラミング好きな人の心を微妙につかむ、面白いメソッドがあります。

```ruby
->(k: :v, **h){}.parameters #=> [[:key, :k], [:keyrest, :h]]
```

仮引数の種類と名前を要素とした配列の配列を返してくれます。Method や UnboundMethod のインスタンスにも parameters メソッドが定義されていますが、組み込みのメソッドでは引数の種類しか取得できないという制約があります。また、Proc も *Method も、仮引数名を省略した :rest 引数では当然ながら名前は取得できません。

```ruby
define_singleton_method(:hi){|a|}.parameters #=> [[:req, :a]]
method(:method).parameters                   #=> [[:req]]
->(*){}.parameters                           #=> [[:rest]]
```

つい先日までは、以下のように :opt/:rest/:key を組み合わせると、:opt 引数の情報が返ってこないというバグがありましたが、

```ruby
->(o = :d, *r, k: :v){}.parameters #=> [[:rest, :r], [:key, :k]]
```

[Bug #7540](https://bugs.ruby-lang.org/issues/7540) として登録したところ、[すっきりと修正されました](https://bugs.ruby-lang.org/projects/ruby-trunk/repository/revisions/38333/diff/iseq.c "iseq.c r38333")。今みなさんのお手元では、以下のように正しい結果が返ると思います。こうならない人は、早速 trunk をコンパイルしないと、ですね。

```ruby
->(o = :d, *r, k: :v){}.parameters #=> [[:opt, :o], [:rest, :r], [:key, :k]]
```

なにか気づいたことがあればバグ報告しましょう。今ならきっと間に合います。

- - -
I wish you Merry Christmas & Happy New Year!
Macアプリの更新をユーザーに通知する

Mac App Storeを通さず自前でアプリアップデートをしたい場合，[Sparkle](http://sparkle.andymatuschak.org/) という更新通知用ライブラリがよく使われている，[MarkdownエディタアプリのKobito](http://kobitoapp.com/)でも利用している．

## アプリ更新手順
Sparkleの初期設定はドキュメント通りにすればOK．以下はそれ以降何度もやるであろうアプリ更新の手順．

1. privateキーとアプリのzipファイルからシグネチャ作る(注意: アプリ名はバージョン名など余計な文字を含めると駄目．zipファイルにした後ならばrename OK)
2. `appcast.xml`を編集して，appcast.xmlとアプリのzipファイルをサーバーに上げる．

xcodeのafter-archive hookを使って出来る限り自動化するとよい．
自動化する際参考になるページ http://www.entropy.ch/blog/Developer/2008/09/22/Sparkle-Appcast-Automation-in-Xcode.html


詳細な手順は以下を参照
[Home · andymatuschak/Sparkle Wiki](https://github.com/andymatuschak/Sparkle/wiki)
Xcodeでよく使うショートカット

## cmd + ctrl + Up/Down
ヘッダファイルとソースファイルの切り替え．
(普段はEmacsで書いているけどブレークポイント設定などで使う)

## cmd + shift + o
`open quickly`
プロジェクトからファイルやシンボル名でインクリメンタル検索し，マッチしたものを即座に開ける

## cmd + click
クリックしたシンボルの定義場所にジャンプする

## cmd + 数字(0~7)
1~7の場合は左メニューのタブ切り替え．cmd+1(ファイルツリー表示)とcmd+4(エラー/ワーニング表示)はよく使う．
cmd+0は左メニューを隠す．ちなみに右メニューを隠すにはopt+cmd+shift

## cmd + b/r
b: ビルド
r: 実行

## cmd + shift + k (+ option)
Clean
optionも指定するとClean Build Folder

## cmd + ctrl + Left/Right
開いているコードの切り替え．Go back/Go forward

他にも便利なものがあれば追記するので教えてください！
AppCodeで知っていると便利なショートカット12選


#遅れてごめんなさいOTZ

Ctrl+Spaceだけで戦う漢らしさも時には必要ですが、「最低限これくらいは覚えておくと余計な作業が減るよ」というショートカットを12個選んでみました。一度に覚えるのは無理かも知れませんが、どれか一つでも気に入ったショートカットがあれば習慣化してみてください。

###1.Cmd+O （指定したクラスへ移動する）
入力すると、クラス名を入力するためのテキストフィールドがポップアップします。キャメルケース補完にも対応しているので、朧気にでも覚えていれば目視でファイルを探すよりも大分早く目的地に到達できます。

###2.Cmd+B　（選択した部分の定義位置へ移動する）
キャレット位置の関数やクラスの定義位置へ移動します。もう、コマンドキーを押しながらクリックする必要はありません。

###3.Cmd+E　（最近使ったファイル一覧をポップアップ表示する）
入力すると、最近使ったファイルの一覧とツールウィンドウが表示されているウィンドウがポップアップします。カーソルを移動してエンターを入力することで該当のファイル、又はウィンドウへ移動することが出来ます。ツールウィンドウへの移動は```Cmd+0~9```という専用の物もあるので好みで使い分けてください。

###4.Ctrl+R　（実行）
入力すると、指定されたターゲットでプログラムを実行します。マウスで実行ボタンをクリックするのは総合するとかなりの時間を無駄にしています。

###5.Ctrl+D　（デバッグ実行）
入力すると、指定されたターゲットでプログラムをデバッグ実行します。マウスでデバッグ（ry

###6.Cmd+F8　（ブレークポイントの切り替え）
入力すると、ブレークポイントを設置したり撤去したり出来ます。マウスでクリックしてブレークポイントを設置するのが許されるのはxxまでだよねー。

###7.Cmd+P　（メソッドの引数の情報を表示する）
入力すると、キャレット位置のメソッドの引数に関する情報がポップアップ表示されます。「あれ？このメソッドに渡す引数（型）なんだっけ？」というときに、スマートに問題を解決できます。

###8.Ctrl+V　（連携しているVCSを利用するメニューを表示する）
入力すると、連携しているVCSを利用するためのメニューがポップアップします。コミットやアップデート、ブランチの切り替え等大抵の操作をここから行うことができます。慣れてくると、一々マウスで階層を掘ってコミットするのがバカらしくなります。

###9.Ctrl+T　（リファクタリングのメニュー一覧を表示する）
入力すると、提供されているリファクタリングのメニュー一覧がポップアップします。リファクタリングの各機能毎に割り振られたショートカットもありますが最初は一覧から選ぶ方法で良いんじゃ無いかと思います。提供されてる一覧を頻繁に見ることで、何が出来るかすり込まれる（気がする）ので。

###10.Cmd+N　（コード生成のメニュー一覧を表示する）
入力すると、提供されているコード生成のメニュー一覧がポップアップします。複数のフィールドを一括してプロパティにしてみたり、メソッドをあれしたりこれしたり。プログラマを堕落させるショートカット1。

###11.Ctrl+shift+Enter　（引数入力時や代入時に、補完候補にフィルターをかけて表示する）
引数入力時や、変数への代入時にCtrl+shiftの代わりに入力すると、引数の要求する型や代入先の型から推論して通常の補完候補にフィルター+何となくオススメのメソッドを提示してくれる。プログラマを堕落させるショートカット2。

###12.alt+Enter　（Quick-fix）
問題が起きていたり、キャレットを止めた時に電球のマークが出たときに入力すると、IDEが提供できる問題解決方法や良い感じの記述への変更などをポップアップ表示で提示してくれる、プログラマを堕落させるショートカット3。



AppCodeにはこの他にも便利なショートカットが山ほどありますし、ショートカットの割り当てられていない便利な機能も沢山あるので、ショートカットの一覧を眺めてみたり``` Cmd+, ```で設定画面を開いてKeymapの欄を眺めてみると幸せになれるかも知れません。

例えば：[インクリメンタルサーチにショートカットを割り振る場合。]("http://qiita.com/items/111ca1d08f54bd7d1f7d","")
環境依存なzshの設定ファイルの管理の仕方

# 概要
zshのアドベントカレンダー眺めたたら[.zshrc.localのススメ](http://qiita.com/items/1d5cd440ce58ef4fb8ae)というのを見つけて、似たようなもんだけどここに書けるネタを思い出したので書いてみます。

# 内容
環境依存なファイルも一括？で管理したいなー、と思ったりします。どうやるかと言うと、hostnameを使って読み込むファイルを変えます。具体的にはzshrcに以下のような記述をします。

```
[ -f ~/.zsh.`hostname -s` ] && source ~/.zsh.`hostname -s` 
```

あとは環境ごとに

```
.zsh.`hostname -s`
```

なファイルを作るだけです。例えばMacBook Airで`hostname -s`したら多分デフォルトだと`takc923-no-MacBook-Air`とか出るので、`.zsh.takc923-no-MacBook-Air`というファイルを作ってそこに設定を書き込むわけです。
僕はこういう`.zsh.***`なファイル達をリモートリポジトリに全部ぶち込んでます。そんで新しい環境に自分のdotfilesを反映させたい時は`git clone`して新しい`.zsh.***`なファイルを作る、ということをしています。

# 補足
* dotfilesをgithubとかで一括管理する方法はぐぐればいっぱい出てくる気がする
* `hostname`の`-s`オプションはhostnameを短くして出すオプション。先の例だと`-s`をつけなければ`takc923-no-MacBook-Air.local`が表示される。
* `[ -f hoge ] && source hoge` はhogeが存在したらhogeを読み込む的な意味。詳しくは「シェルスクリプト　条件」とかでぐぐれば出てくるんじゃまいか。
* バッククォートでくくるとシェルの実行結果が展開される。
* 要は環境によって条件分岐させられたらいいので、`$HOST`だろうが`uname -n`だろうが、何かしら環境によって違う何かで読み込む設定を制御出来たら目的は達成出来る。

# ちなみに
これは会社の先輩がやってたことです。まるごとパクりました。ありがとうございます。
SublimeTextで突然の死

http://qiita.com/items/b10d5659cb1f1a168758
を見て。
pythonもplugin作るのも初めてなんで不具合とかあるかもです(>_<)
何かあったら誰か直してください(>_<)

#ソース

```python:SuddenDeath.py
# -*- coding: utf-8 -*-

import sublime, sublime_plugin

class SuddenDeathCommand(sublime_plugin.TextCommand):
	def width_kana(self,str):
		all = len(str)              # 全文字数
		zenkaku = self.count_zen(str)    # 全角文字数
		hankaku = all - zenkaku     # 半角文字数
		return zenkaku * 2 + hankaku
	def count_zen(self,str):
		from unicodedata import east_asian_width
		n = 0
		for c in str:
			wide_chars = u"WFA"
			eaw = east_asian_width(c)
			if wide_chars.find(eaw) > -1:
				n += 1
		return n
	def run(self, edit):
		for region in self.view.sel():
			if not region.empty():
				strs=self.view.substr(region).splitlines()
				max_width=max(map(self.width_kana,strs))
				head=u"＿人"+u"人"*(max_width/2)+u"人＿\n"
				tail=u"￣Ｙ"+u"Ｙ"*(max_width/2)+u"Ｙ￣\n"
				death_str=head
				for str in strs:
					death_str+=u'＞　%s　＜\n' % (str+" "*(max_width - self.width_kana(str)))
				death_str+=tail
				self.view.replace(edit, region, death_str)
```

#使い方
~/.config/sublime-text-2/Packages/Userに保存。
適当にキーバインドして囲みたい文字を選択して実行。

```
＿人人人人人人＿
＞　突然の死　＜
￣ＹＹＹＹＹＹ￣

＿人人人人人人人人人人＿
＞　＿人人人人人人＿　＜
＞　＞　突然の死　＜　＜
＞　￣ＹＹＹＹＹＹ￣　＜
￣ＹＹＹＹＹＹＹＹＹＹ￣

＿人人人人人人人人人人人人人人＿
＞　＿人人人人人人人人人人＿　＜
＞　＞　＿人人人人人人＿　＜　＜
＞　＞　＞　ちょっと　＜　＜　＜
＞　＞　＞　ずれる  　＜　＜　＜
＞　＞　＞　かも    　＜　＜　＜
＞　＞　￣ＹＹＹＹＹＹ￣　＜　＜
＞　￣ＹＹＹＹＹＹＹＹＹＹ￣　＜
￣ＹＹＹＹＹＹＹＹＹＹＹＹＹＹ￣
```

#参考文献
* http://qiita.com/items/b10d5659cb1f1a168758
* http://pythonlife.seesaa.net/article/133360506.html
初めてのUnity (裏) 第一回 世界の骨格を作ろう

#第一回 世界の骨格を作ろう
**Unityは現代的なゲーム制作のために作られた統合開発環境です。**
**その背景にあるエディター拡張はまさに哲学。そしてシンプル。**
**ゲームの世界を構成するオブジェクトを自由に支配し、**
**適切な属性やスクリプトを設定して命を吹き込むこと。**
**ここでは「ウィンドウ」の制作を題材として、Unityの基本をご紹介していきます。**


#ウィンドウを手に入れる
早速Unityを支配するために、エディタのウィンドウを生成しましょう。

##エディタースクリプト
エディタースクリプトとは、Unityエディタを拡張するためのスクリプトです。スクリプトはC#で書かれており、普段Unityでスクリプトを書いている開発者の皆さんなら容易に修得することが可能です。

##エディタースクリプトの配置場所
エディタースクリプトの配置場所は決まっています。必ず**Editorディレクトリ配下**に配置するようにして下さい。スクリプトがEditorディレクトリ配下にあるのであれば、Editorディレクトリはどの場所にあっても良いです。

#初めてのエディタスクリプトの作成

それでは早速「ウィンドウ」を作成して行きましょう。プロジェクトウィンドウで右クリックをし、`Create` => `Folder`を選択し名前を`Editor`にします。
次にEditorフォルダの中で右クリックをし、`Create` => `C# Script`を選択し、名前を`HelloWindow`とします。

これでエディタスクリプトの土台が出来上がりました。

##using UnityEditor;

早速スクリプトを記述して行きましょう。エディタスクリプトを利用するには`using UnityEngine;`の他に`using UnityEditor;`が必要になります。UnityEditorの中にエディタを制御する様々なクラスがあるわけです。

##EditorWindow

次に普段のスクリプトであれば`MonoBehaviour`を継承していますね。ここを`EditorWindow`に変更します。こうすることでExampleスクリプト自体がウィンドウとなります。

```cs:Example.cs
using UnityEngine;
using System.Collections;
using UnityEditor;

public class Example : EditorWindow {

}
```

そしてウィンドウを表示するためのスクリプトは以下のようになります。

```cs:Example.cs
using UnityEngine;
using System.Collections;
using UnityEditor;

public class Example : EditorWindow
{
	static Example example;
	
	static void Hoge ()
	{
		example = GetWindow<Example> ();
		
		example.Show ();
	}
}
```
GetWindowでExampleウィンドウを取得し表示するという仕組みのスクリプトです。しかしこのままではHogeメソッドを呼び出す手段がありません。

###MenuItem
Unityには自由にメニューバーの項目を追加できる機能があります、それがMenuItemです。今回はこれを使用して、Menuを作成し、そこからHogeメソッドを呼び出します。

```cs:Example.cs
using UnityEngine;
using System.Collections;
using UnityEditor;

public class Example : EditorWindow
{
	static Example example;
	
	[MenuItem("Window/OpenWindow")]
	static void Hoge ()
	{
		example = GetWindow<Example> ();
		
		example.Show ();
	}
}
```

##ウィンドウを開く
さぁこれでエディタウィンドウを開く準備ができました。早速開いてみましょう。`Window`=>`Open Window`をクリックして下さい。
おめでとうございます。無事Unityを支配する第一歩を踏み出しました。



#次回

#つづかない



以上ネタでしたー
UIViewをUIImageに変換する


UIViewに複雑なアニメーションをさせたい時など、普通にUIViewのままいじるとパフォーマンスが悪くなるため、UIImage化していじることが多い。

http://markpospesel.com/2012/05/07/mpfoldtransition/
このフレームワークとかでも、この手法を使っている。

その変換方法。

	- (UIImage *)imageFromView:(UIView *)view
	{
		// 必要なUIImageサイズ分のコンテキスト確保
		UIGraphicsBeginImageContextWithOptions(view.frame.size, YES, 0);
		CGContextRef context = UIGraphicsGetCurrentContext();
    
		// 画像化する部分の位置を調整
		CGContextTranslateCTM(context, -view.frame.origin.x, -view.frame.origin.y);
    
	    // 画像出力
    	[view.layer renderInContext:context];
    
	    // uiimage化
    	UIImage *renderedImage = UIGraphicsGetImageFromCurrentImageContext();
    
	    // コンテキスト破棄
    	UIGraphicsEndImageContext();
	
		return renderedImage;
	}
zshのchpwd_recent_dirsでよく行くディレクトリに移動する

`AUTO_PUSHD` によって自動的に積まれたディレクトリスタックの移動はカレントのシェルにおいて有用ですが、ログアウト後、あるいは別のセッションでは利用できません。

そのためよく移動するディレクトリについては `$cdpath` やディレクトリのエイリアスに設定、あるいは移動するための関数を定義することも多いと思います。

ここでは zsh バージョン 4.3.11 から標準モジュールとして使えるようになった `chpwd_recent_dirs` について紹介します。

以下の設定を例に説明します。カレントディレクトリを変更したときに呼ばれる特殊関数 `chpwd_functions` に `chpwd_recent_dirs` を呼ぶようにしています。詳しい使い方は `zshcontrib(1)` の `REMEMBERING RECENT DIRECTORIES` を参照してください。

```.zshrc
autoload -Uz compinit && compinit

zstyle ':completion:*' menu select
zstyle ':completion:*:cd:*' ignore-parents parent pwd
zstyle ':completion:*:descriptions' format '%BCompleting%b %U%d%u'

typeset -ga chpwd_functions

if is-at-least 4.3.11; then
  autoload -U chpwd_recent_dirs cdr
  chpwd_functions+=chpwd_recent_dirs
  zstyle ":chpwd:*" recent-dirs-max 500
  zstyle ":chpwd:*" recent-dirs-default true
  zstyle ":completion:*" recent-dirs-insert always
fi
```

このように設定した状態でいくつかのディレクトリを渡り歩いたあとに `cdr <TAB>` すると、

```bash:zsh
% cdr <TAB>
% cdr /usr/ports ←ここまで補完されるので続けて<TAB>
% cdr /usr/ports<TAB>
Completing recent directory
/usr/ports/sysutils/byobu   /usr/ports/sysutils/screen  /usr/ports/editors/vim
/usr/ports/sysutils/tmux    /usr/ports/editors/emacs    /usr/ports

% cdr /usr/ports/sysutils/<TAB>
Completing recent directory
/usr/ports/sysutils/byobu   /usr/ports/sysutils/tmux    /usr/ports/sysutils/screen
```

こんな感じにディレクトリの移動履歴が補完候補として出てきます。続けて `<TAB>` を押せばメニュー補完として動作します。

ディレクトリの移動履歴は `${ZDOTDIR:-$HOME}/.chpwd-recent-dirs` に保存されます。これは `recent-dirs-file` で変更できます。

この例では `.chpwd-recent-dirs` に `/usr/ports` 以下のディレクトリしか履歴として記録されていないため、最初の `<TAB>` で `/usr/ports` まで仮入力されましたが、使っていくうちに補完候補が一画面では表示しきれなくなります。実際には移動したい先の文字列をいくつか入力して `cdr ~/work/201212<TAB>` などとして使っています。

ファイルに移動履歴が保存されますので、GNU Screen などで開いている別の zsh セッションからも参照できます。

日々の作業に欠かせません。

参考までに、手元にあるいくつかの OS で `chpwd_recent_dirs` がすぐに使えるかどうか調べてみました。

|   |OS                     |version       |
|:--|-----------------------|--------------|
|○ |Ubuntu 12.10           |5.0.0-2ubuntu1|
|○ |Fedora 17              |5.0.0-1.fc17  |
|○ |FreeBSD                |5.0.0_1       |
|○ |Oracle Solaris 11 11/11|4.3.12        |
|○ |OS X Mountain Lion     |4.3.11        |
|× |Debian squeeze         |4.3.10-14     |
|× |Oracle Linux 6.3       |4.3.10-5.el6  |
|× |CentOS 5.8             |4.2.6-6.el5   |

比較的新しめのパッケージを採用する OS だと使えるようですね。

単なる関数なのでソースだけ取得してローカルに展開して読み込むのもアリかも知れません。
Ember.jsでライフゲーム

データバインディング機能を使って、ライフゲームを実装してみました。
勝手に画面を再描画してくれるところは面白いですが、プロパティの依存が大量なためか、結構重いです。

デモ
http://kmdsbng.github.com/emberjs_life_game/

ソースコード
https://github.com/kmdsbng/emberjs_life_game/blob/master/js/app.coffee
突然の死に備えて sudden-death.el を導入しよう

# はじめに

```
＿人人人人人人人人人人人人人人人人人人人人人人人人人人＿
＞　全国 1000 万人の Emacs ユーザのみなさんこんにちは　＜
￣ＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹＹ￣
```

さて、業務内外を問わず、ふいに「[突然の死](http://dic.nicovideo.jp/a/%E7%AA%81%E7%84%B6%E3%81%AE%E6%AD%BB "突然の死とは (トツゼンノシとは) [単語記事] - ニコニコ大百科")」ネタを貼りたくなる場面というのは少なくないと思います。
[突然の死ジェネレータ](http://starwing.net/suddenly_death.html "突然の死ジェネレータ")というものもありますが、やはり Emacs 内で完結させたいところです。

そういった需要にお答えするために、拙作の elisp を紹介させていただきます。

# sudden-death.el

## インストール
auto-install が導入済みであれば以下のコマンドを実行していただければ簡単にインストール出来ます。

`M-x auto-install-from-url https://raw.github.com/yewton/sudden-death.el/master/sudden-death.el`

## 使い方
「突然の死」風にしたい部分をリージョンに指定し、`M-x sudden-death`を実行するだけです。

```
＿人人人人人人＿
＞　突然の死　＜
￣ＹＹＹＹＹＹ￣
```

生成された文字列全体に対してさらに `M-x sudden-death` を実行すると以下のようになります。

```
＿人人人人人人人人人人＿
＞　＿人人人人人人＿　＜
＞　＞　突然の死　＜　＜
＞　￣ＹＹＹＹＹＹ￣　＜
￣ＹＹＹＹＹＹＹＹＹＹ￣
```

このように好きなだけ強調することができます。


## リポジトリ
GitHub においてあります。

https://github.com/yewton/sudden-death.el

# おわりに
前回に引き続き雑なネタで申し訳ありませんでした。

ちなみに、[Marmalade: Spreadable Elisp](http://marmalade-repo.org/ "Marmalade: Spreadable Elisp")に登録して、
package-install でインストールできるようにしようかと思っていたのですが、マルチバイト文字は文字化けしてしまいました。

```
＿人人人人人人人人人人＿
＞　明日だれか書いて　＜
￣ＹＹＹＹＹＹＹＹＹＹ￣
```
ChromeExtensionでUnderscoreのtemplateを使う

Chormeのmanifest version2から `eval` が禁止になった。
使おうとすると `Uncaught Error: Code generation from strings disallowed for this context` とエラーが出る。
`eval` なんか使わないという人が大多数だと思うが、実はほとんどのテンプレートエンジンが内部で `eval` ないし `new Function()` を使っているので、意外とこの制限にひっかかる場合が多い。

もともと[Underscore.js](http://underscorejs.org/)のテンプレートエンジンを使っていたのを、version2でも動くようにした時の方法を紹介する。

ちなみにGoogle謹製の[Angular.js	](http://angularjs.org/)には `eval` も `new Function()` も使わないテンプレートエンジンがあるそうだが、Angular.jsは巨大過ぎて使う気がしない。

##_.template source

Underscore.js version 1.3.3からコンパイルしたテンプレートオブジェクトに `source` プロパティが追加された。
これを使うと `new Function()` に渡される文字列を参照できる。
例えば

```js
console.log(_.template("<b><%= name %></b>").source);
```

を実行すると

```js
function(obj){
var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};
with(obj||{}){
__p+='<b>'+
((__t=( name ))==null?'':__t)+
'</b>';
}
return __p;
}
```

となる。仮にこれを `JST` という名前の変数に代入したとすると

```js
console.log(JST({name: 'hello'}));
```

は `<b>hello</b>` になる。ようするにこいつを予め開発環境で作ってやり、extension ではこの関数を使えばいいわけだ。

##変換する

だんだん書くのが面倒になってきたので詳細は省くが、要約すれば次のようなスクリプトを用意する。

```js
var _ = require('underscore');
var fs = require('fs');

// テンプレート
var templates = {
  foo: "<b><%= name %></b>"
}

var data = "var JST = {};\n";
for (var name in templates) {
  data += "JST['" + name + "'] = " + _.template(templates[name]).source + ";\n";
}
fs.writeSync("path/to/jst.js", data);
```

これを実行すると `path/to/jst.js` というファイルが生成される。extension でそれを読み込む。
使い方は

```js
JST.foo({ name: 'hello' });  //=> <b>hello</b>
```

みたいな感じ。 `path/to/jst.js` の中身は

```js
var JST = {};
JST['foo'] = function(obj){
var __t,__p='',__j=Array.prototype.join,print=function(){__p+=__j.call(arguments,'');};
with(obj||{}){
__p+='<b>'+
((__t=( name ))==null?'':__t)+
'</b>';
}
return __p;
};
```

になる。これを応用すれば通常のWebサイトでも Underscore.js のテンプレートエンジンをコンパイル時間の分だけ高速化させることができるが、それは過剰な気がするのでそこまでやる必要はないと思う。
Git リポジトリ内で cp(1) でコピーしたファイルに対して、コピー前の変更履歴を見る

`git log --follow` オプションで、コピー前にファイルのコンテンツがどのように変更されたかの履歴が見える。

```
$ git add 1.txt; git commit (a)
$ edit 1.txt; git add 1.txt; git commit (b)
$ cp 1.txt 2.txt
$ git add 2.txt; git commit (c)
$ edit 2.txt; git add 2.txt; (d)
$ git log 2.txt (c 移行の履歴しか見えない)
$ git log --follow 2.txt (a, b の履歴も見える)
```

- 検証用 gist (clone 用) https://gist.github.com/4318172

----

参考 URL

- http://stackoverflow.com/a/1043566/374851
- http://www.kernel.org/pub/software/scm/git/docs/git-log.html

> --follow
>     Continue listing the history of a file beyond renames (works only for a single file).
"-"（ハイフン）や"="（イコール）から始まるPlain Textを出力する


`-`, `=`から始まるPlain Textを出力したい場合、それらの文字を`\`でエスケープする。

そうしないと、`-`や`=`のあとに続く文字列がRubyのコードとして評価されてしまうので、思った通りの出力にならない。

こんな感じ。

```
%p
  \-20

%p
  \=20
```

参考：
[File: REFERENCE — Haml Documentation](http://haml.info/docs/yardoc/file.REFERENCE.html#escaping_ "File: REFERENCE — Haml Documentation")
プログラムを学び始めたい方に、Google Apps Scriptをお勧めする７つの理由

今回は、プログラミングの初心者およびプログラミングしてみたい人向けのエントリーを書いてみます。Qiitaのコンセプトにはあわないかもしれませんが、おつきあいください。
※我が家ごとですが、うちの子どもたちが中学に入ったら、プログラミングと論理的考え方を、教えようと思っています。そのテキストの骨子作成という意味もあります。

本論に入る前に、そもそも、プログラミングができるとどんないいことがあるのか、書いてみます。

#もはや、世の中の仕事や勉強が、ITを使うことなく進められなくなっている。
全員がプログラミングを仕事にすることはない、と思いますが、そもそもどう行く仕組みで、コンピュータシステムが動くか、概要はしっておいたほうがよい時代に入っていると思います。
仕事でシステム開発やウェブサイト制作を、発注する場合などもで、どのようにプログラムは動くのか、作るのか、などを、ある程度知っていると、イケてる発注者になれますし。
昔の”ヨミ・カキ・ソロバン”のソロバンがプログラミングに置き換わるイメージですね。

#コンピュータは、自分の想い通りに動いてくれる”相棒”になる。
うちの奥さん、子どもたち、会社の部下などで、自分の想い通りに動いてくれる人、なかなかいないものです。はい。
しかし、コンピュータは違います。正しいプログラムを書いて、実行をお願いすると、そのとおりに、瞬時に処理してくれます。文句も言わず。
これは、なかなかの快感です！いやされます！

#繰り返し発生する業務や仕事はできるだけコンピュータにお願いして時間を創出
一度作ったプログラムは、何度も実行できます。これは、とても重要なことで、なれてくると、時間を作り出せるようになります。
「会社で会議報告用の資料をEXCELで集計するのに残業した（徹夜した）」というシーンは、いたるところで見受けられます。
少し勉強は必要ですが、プログラミングを習得することで、繰り返し発生する作業、仕事は、コンピュータという相棒に任せることができます。

#プログラミングができるとすごいと思われる
私は、プログラミングを専門としているのではないですが、チョロっと処理を自動化するプログラムを作ることがあります。
プログラムを作らない人たちからは、すごいとほめていただだけます。特に、年配の方からは、魔法使いを見るような目で見られます。
私がすごいというのではなく、プログラミングを習得すると、あなたのウリが一つ増えるかも、ということをお伝えしたいです。

#アイディアを実現できるスピードが早くなる
多くの物がどんどんデジタル化し、誰でもそのデータが使えるように公開される社会に進化することで、加速度的に世の中が進んでいくようです。
これまで、アイディアを現実の世界に出現させることは大変でした。
しかし、これからは、アイディアを実現するスピードは早まり、その容易性も高まります。その際に、重要になってくるのは、ITへの理解であり、もっと言うと、プログラミングスキルとなりそうです。

どうでしょう。
少しでも、プログラミングをしてみたい気持ちがわいてきたらうれしいです。

##そして、ここからが本題です。
いろいろなプログラミング言語がありますが、現代のプログラミング初心者には、プログラミングを学ぶ環境・言語として、Google Apps Scriptを強くお勧めします。
７つの理由にまとめてみました。

#1.無料で始められる。
パソコンとインターネットがあれば、無料ではじめられます。

#2.どのパソコン(デバイス)からでも、プログラミングできる。
GASは、サーバーサイドのプログラミング環境です。Googleアカウント(Gmailアカウント)で、ログインすれば、いつでもどこでも、続きのプログラム作成ができます。
仕事の昼休みにネットカフェで、30分のプログラミング、なども可能です。

#3.初心者のうちから、あなたの身の回りの役立つツールを作れる。
GASはGoolge SpreadsheetやGmailの利用の可能性を、強力に拡張します。
あなたのToDoの期日管理（期日の1日前にメールでメッセージ通知、とか）、秘密のメッセージ送信（想いを寄せている人に、10秒後に消える告白メッセージを送信、とか）、なんていうサービスは、15分もあれば、作れるようになります。

#4.GASはますます重要性・将来性の高まっているJavascriptベースのプログラミング言語
Javascriptという言語は、ウェブサイト開発において、無くてはならない物になっています。
ウェブサイト開発のみにとどまること無く、ゲーム開発やスマホアプリ開発にも、採用されています。今後、ますます、利用されるシーンは増えていくと思いますし、将来、仕事としてプログラミングやシステム開発を選択する場合、活躍する領域は今よりも広くなっているはずです。
また、Javascriptを学習していると、他の言語(JavaやRubyなど)の習得も早くなっていると思います。

#5.すぐにプログラムの動作を確認できる
GASは、すぐに作成したプログラムが期待通りに動くかを確認できます。当たり前のように思えるかもしれませんが、他の多数の言語は、プログラムの動きを確認するための事前の準備が必要だったり（サーバー側ではなく、パソコン側で確認できる仕組みを用意、など）、コンパイルやビルドという、コンピュータがわかるように翻訳する処理が必要だったりします。
時間がかかるとともに、思考がとぎれるので、生産性に違いを生じさせます。

#6.わからないときネットで調べられる。
ネット上には、GASはもちろん、Javascriptに関する無料の情報がたくさん存在します。
また、わからないことを、質問できるコミュニティサイトもあります。

#7.Googleの豊富なサービスのAPI利用のコツが理解できる
Goolgeは無料で、いろいろなサービスを提供しています。
これらは、API(Application Protocol Interface)という、コンピュータ向けの情報を提供する仕組みも併せ持っています。
身の回りや仕事、学校、地域を、ちょっと便利にするツールの作成は、あなたのアイディア次第です。

今回は以上です。

#告知させてください。
Tokyo GAS 〜東京でのGoogle Apps Script勉強会・交流会〜を2012年1月18日(金)に開催します！
詳しくは、こちらをご覧いただき、お気軽にご参加ください！
http://atnd.org/event/TokyoGAS
vimでgrepする時の.vimrc 




vimさんgrep使えたんですね。人生の半分ぐらい損してました。
もう同じ損はしないようにvimrcに設定加えておきましょうね。

vimのgrepはここ見たらわかるよ
https://sites.google.com/site/fudist/Home/vim-nihongo-ban/vim-grep

加えた設定は以下

```
set grepprg=grep\ -rnIH\ --exclude-dir=.svn\ --exclude-dir=.git
autocmd QuickfixCmdPost vimgrep copen
autocmd QuickfixCmdPost grep copen

" grep の書式を挿入
nnoremap <expr> <Space>g ':vimgrep /\<' . expand('<cword>') . '\>/j **/*.' . expand('%:e')
nnoremap <expr> <Space>G ':sil grep! ' . expand('<cword>') . ' *'
```

これで検索したいワードにカーソル置いて`<Space>g`で内部grep、`<Space>G`で外部grepの書式が挿入されるようになるね。


内部grep、vimgrepは遅いらしいけどバイナリファイルも検索対象として探してくれているので対象をしぼってやれば結構早くなる。`expand('%:e')`で現在開いているファイルの拡張子を取得してくれるのでよしなに書いてやる。

外部grepは`set grepprg=`にgrep用の設定を書き込んでやれば大体オッケー、`.svn`や`.git`ディレクトリは除外、引数`-rnIH`は再起的に行数追加してバイナリファイルは除いてファイル名を表示かな。Hはいらないかもね。好みだね。ackも使えるみたいだよ。
RSpecで普段は実行したくないテストをスキップする方法


例えばツイートする機能のテストなど、stub化しちゃうとそもそも意味がなくなるけど、かといって毎回実行されるのがいやなテストをスキップする方法

specヘルパーに以下を追記。

```ruby:spec/spec_helper.rb
RSpec.configure do |c|
  c.filter_run_excluding :skip => true
end
```

スキップしたいテストに :skip => true を追加。

```ruby:spec/hoge_spec.rb
describe Hoge do
  it 'test', :skip => true do
	hoge.should eq(fuga)
  end
end
```

もしも普段スキップしているテストを実行した場合は--tagオプションを指定して実行する

```sh:
rspec spec --tag skip

# => include {:skip=>true}
# => exclude {:exclude=>true}
```
.bashrc内で宣言するaliasで引数を使った物を宣言する場合 


ダメな例

```
alias php_grep='grep -rnIH --color=auto --include=*.php $@ *'
```

良い例

```
function php_grep () { grep -rnIH --color=auto --include=*.php $@ *; }
```

functionを使います
NimbusKitの導入


新しいGoogle Mapsアプリでも導入されているNimbusKitをプロジェクト途中から導入したのでメモ。

導入は簡単。
	
	cd <Project Directory>
	git submodule add git://github.com/jverkoey/nimbus.git
	cd nimbus
	git submodule init
	git submodule update

次に、ProjectをXcodeで開いて、NimbusKit中の必要なモジュールだけプロジェクトへ追加しましょう。
モジュールは以下。
ちなみに各モジュールに依存関係があるようなのでドキュメントを読むこと。

* attributedlabel
* badge
* css
* core
* interapp
* launcher
* models
* networkcontrollers
* networkimage
* overview
* pagingscrollview
* photos
* webcontroller

あとは{Project名}-Prefix.pchを編集してそれぞれのモジュールのヘッダーを読み込むこと。

	#ifdef __OBJC__
   		#import <Foundation/Foundation.h>
   		#import <UIKit/UIKit.h>
   		#import <QuartzCore/QuartzCore.h>
                // 導入したモジュールに関して追加すること
   		#import "NimbusCore.h"
   		#import "NimbusWebController.h"
	#endif

今後それぞれのモジュールについて色々見てみる。

参考：
http://wiki.nimbuskit.info/Add-Nimbus-to-your-project
Lost connection to MySQL server during query が出たときの対処


http://dev.mysql.com/doc/refman/4.1/ja/packet-too-large.html

```引用
 MySQL クライアントまたは mysqld サーバが max_allowed_packet バイトより大きいパケットを受け取った場合、Packet too large エラーが発生し、接続がクローズされます。
```

サーバ側の設定したのだけど、効いてないなと思ったら、

```引用
 クライアントとサーバには、共に独自の max_allowed_packet 変数があります。大きなパケットを扱う場合は、クライアントとサーバ両方の変数を増やす必要があります。
```

Clientも必要だということで…。

オプション指定ファイルに指定可能な項目は、次のURLに記載されています。
http://dev.mysql.com/doc/refman/4.1/ja/mysql-options.html


```mysql
mysql>show variables like '%timeout%'
```
を実行し、次の値を確認します。

connect_timeout
interactive_timeout
net_read_timeout
wait_timeout

これらは秒数で指定されます。Lost connection エラーが出なくなるように調整します。

【追記：2013年1月8日】
なかなか、エラーがでなくなりません。
バックグランドジョブで実行すると出る可能性が低くなるような感じです。気のせいかも。

http://d.hatena.ne.jp/hagaeru3sei/20100422

上URLを参考にしたが、発生しました。

```python
con.ping(True)
```

今は、
net_read_timeout
net_write_timeout
を、600秒から3600秒に変更して様子を見ています。
Rails3で、bitly.comを利用した短縮URLを作成する


パラメータがつきまくって長いURLが、twitterやfacebookでのシェア時に邪魔くさかった際に、短縮URLサービスを使った。

## gemがあった

'bitly'というgemを利用するとカンタンだった。
https://github.com/philnash/bitly

## 1. bitlyのAPI利用

1. bitlyのアカウント作成

2. bitlyのUsernameとAPI Keyを取得
（http://bitly.com/a/your_api_key）

## 2. gemfileに書いてbundle install

```ruby:Gemfile
gem 'bitly'
```

```bash:
$ bundle install
```

## 3. コードをちょっとだけ書く

今回はhelperに書いたので、その例を。

```ruby:app/helpers/hoge_helper.rb
module HogeHelper
  require 'bitly'
    
  def get_share_url(page_url) # あるページの短縮URLを生成するヘルパー
    Bitly.use_api_version_3 # この行はほんとに必要なのかよく分からない
    bitly = Bitly.new('bitly Username', 'bitly API Key')
    bitly.shorten(page_url).short_url
  end 
end
```

これでview側で呼び出したりして使ったらよい。

## 参考

* http://blog.andolasoft.com/2012/11/how-to-shorten-url-using-bitlycom-in.html
* http://danielkunnath.com/post/4296878752/using-bit-ly-url-shortening-on-rails-3
* http://dev.bitly.com/api.html （bitlyのAPIドキュメント）
Rails3 Engineのroutes.rbでの注意


少しだけハマったのでメモ

Rails3のEngineでルーティングを設定すると、engineを利用する側のアプリケーションへ自動的にそのルーティングが設定されます。

その際、Engine側のroutes.rbで、

	MyEngine::Engine.routes.draw do
  		get "hoge/index"
	end

と設定し、以下のように利用する側のアプリケーションでマウントしたとします。

	Rails.application.routes.draw do
	  mount MyEngine::Engine => "/my_engine"
	end

こうすると、`/my_engine/hoge/index`でアクセスできるのだろうと思っていましたが、実際のところは、

	Routing Error
	uninitialized constant HogeController

が発生してしまいました。

解決策としては、明示的にcontroller, actionを指定すること。

	MyEngine::Engine.routes.draw do
  		get "hoge/index" => "hoge#index"
	end

解決したけれどもなんとなく腑に落ちない。
もう少し調べる。
PointSpriteで表示できる点の大きさには限界がある

粒子を表示するのにOpenGLでPointSpriteをしている（[参考](http://marina.sys.wakayama-u.ac.jp/~tokoi/?date=20060227)）のですが、ある一定以上の大きさには表示されませんでした。

ので、色々調べてみたところ、どうやら`GL_POINT_SIZE_MAX`という制限があって、これより大きな点は表示できないようです。
調べるにはglGetで取得できますが、手元の環境(GTX 690)だと、このサイズ、64でした。
[glPointParameter](http://www.khronos.org/opengles/sdk/1.1/docs/man/glPointParameter.xml)で設定できるかなと思ったのですが、元のサイズより大きくしても変わりませんでしたので、デバイス側の限界っぽいです。

回避策はそのうち考えます（続報があればいいな）。
herokuでwordpress-herokuを動かすテスト（WP3.5 日本語）

herokuでwordpressを動かすwordpress-herokuを実際にやってみましたので
備忘、参考までにアップします。

手順の参考サイト：[happtechさん、日本語環境のwordpressをherokuで動かす方法](http://happtech.blogspot.jp/2012/04/wordpressheroku.html)

1.[https://github.com/mhoofman/wordpress-heroku](https://github.com/mhoofman/wordpress-heroku)
からgit clone

2.自分のherokuにて`heroku apps:create [NAME]`

3.自分のherokuにHeroku Postgresをアドオン`heroku addons:add heroku-postgresql:dev`

4.wp-config.phpを複製して編集`cp wp-config-sample.php wp-config.php`

5.wp-config.phpで`define('AUTH_KEY'`以降のunique phrasesを入れる

6.まず一回git pushして、アップしたwordpress-herokuのインストールセットアップを完了する

7.mbstring関数でWP Mutibyte Patch pluginがエラーになるようなので、[candycane development blog](http://blog.candycane.jp/archives/1375)さんのphpinfo-herokuをwordpress-herokuに加える

8.wp-config.phpで`define('WPLANG', 'ja');`のみ書き換え

9.[日本語リソースのインストール（http://ja.wordpress.org）](http://ja.wordpress.org/install-ja/)から wp-content/languagesに入れる用の日本語リソースを取得か、もしくは自分のWPサイトのwp-content/languages日本語リソースを一式をwordpress-herokuにコピー

10.WP Mutibyte Patch pluginをwordpress-herokuにコピーしてgit push

以上でまずは日本語環境でベーシックの稼働させることができました。
以降自分のthemesなどが適用できるかや、管理画面やfunctions.phpごにょごにょして、テストしていこうかな...

実際のサイトはこちらです→[http://sw-wordpress.herokuapp.com/](http://sw-wordpress.herokuapp.com/)
ディレクトリの中のファイルだけを取得する

```
$file_arr = scandir($filepath);
$file = array();
foreach ($file_arr as $file) {
	// . ..の場合はスキップ
	if (in_array($file, array('.', '..')))
		continue;
	// ディレクトリの場合もスキップ
	if (is_dir(($filepath . $file)))
		continue;
	// ここまで来たら対象ファイル
	$file[] = $file;
}
```

説明はありません。
コマンドラインでJSONを扱う際ユーティリティ、yajl-toolsとjson_pp(jsonpp)

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。

Chefなどを使ってインフラ構築がメタデータ編集で済ませるようになると、jsonフォーマットとの付き合いが多くなる。




## CLIでjsonを扱うケース

例えばバックアップからChefのRoleを流用しようとすると、くたびれた状態のjsonテキストになっており面倒。

```shell::cli_stdout
$ cat server_backup/roles/base.json 
{"name":"base","description":"","json_class":"Chef::Role","default_attributes":{},"override_attributes":{},"chef_type":"role","run_list":["recipe[ntp]"],"env_run_lists":{}}
```

※ 補足：knifeの出力はppなjsonにも出来る。

同様にchef-soloでもattributeのためにjsonを使うため、書式等チェックが出来たほうがよい。

## ツールを導入する

インストールしやすいものから、下記を入れておく。

- json_reformat
- json_verify
- json_pp(jsonpp)

ppはいつもの通りpretty_print、STDINなどを整形してくれる。
他も大体名前の通り。


### ubuntuでインストール

```
apt-get install libjson-pp-perl
apt-get install yajl-tools
```

libjson-pp-perlはいつの間にか入ってることも多い。

### macOSのHomebrewでインストール

```
brew install yaji
brew install jsonpp
```

こちらのjsonppはubuntuのperl版とは違うが役割は一緒。



## 使用例

### jsonpp(json_pp)

先ほどの平べったいJsonファイルをppする。

```shell::cli_stdout
$ cat server_backup/roles/base.json | jsonpp 
{
  "name": "base",
  "description": "",
  "json_class": "Chef::Role",
  "default_attributes": {},
  "override_attributes": {},
  "chef_type": "role",
  "run_list": [
    "recipe[ntp]"
  ],
  "env_run_lists": {}
}
```

見やすい。

### json_verify

閉じ忘れたJsonを渡してみる。

```shell::cli_stdout
$ cat roles/base.json | json_verify 
lexical error: invalid character inside string.
                                        {   "name": "base,   "descript

                     (right here) ------^
JSON is invalid
```

invalidはexit_codeも1になる。

該当箇所を直してみる。

```shell::cli_stdout
$ cat roles/base.json | json_verify 
JSON is valid
```

validになった。