OmniAICreator/Qiita-1.07M huggingface dataset:
HTTP POSTのRequest BodyにMessagePackのデータを送ったらパースするやつ

必要に迫られて書いた。

* [udzura/rack-post_body_msgpack_parser · GitHub](https://github.com/udzura/rack-post_body_msgpack_parser)

## 使い方

特に工夫もなく、 README の通り。サンプルプログラム添付してるのでよろしく頼みます。

```ruby:app.rb
require 'sinatra'
require 'rack/post_body_msgpack_parser'
use Rack::PostBodyMsgpackParser

post '/' do
  request.env['rack.request.form_hash_msgpack'].inspect
end
```

```ruby:client.rb
require 'faraday'
require 'msgpack'

cli = Faraday.new(url: "http://localhost:4567")
res = cli.post do |req|
  req.url '/'
  req.headers['Content-Type'] = 'application/x-msgpack'
  req.body = MessagePack.pack({foo: 123})
end
p res.body
#=> "{\"foo\"=>123}"
```

オプション無しでuseすると `env['rack.request.form_hash_msgpack']` にパースした結果が入る。`request.params`で使いたい場合は、 `override: true` とオプションを渡す。

最初は [rack-contrib](https://github.com/rack/rack-contrib/blob/master/lib/rack/contrib/post_body_content_type_parser.rb) にプッシュしようか迷ったが、rack-contribがmsgpack gemに依存するとかになるとアレなのでコードをだいぶコピって新規に書いた……。

ということで、RPCじゃなくてもカジュアルにメッセージパックでデータを送りつけよう！
android query

こいつは便利！
Androidの非同期通信のライブラリ
http://code.google.com/p/android-query/

サンプルアプリもあるのね
https://play.google.com/store/apps/details?id=com.androidquery
こういうことできるのがAndroidのいいところなのかもしれない

この使い方資料も分かりやすい！
http://blog.excite.co.jp/spdev/19240632/
RailsでActiveRecordとMongoidの共存のさせ方


## 背景

Herokuで適当にスキーマレスなデータをOutput出来る場所がほしい！でも、Herokuはディスクが自由に使えないので、text書き出しができない！！
こんな要求の解決法としては、textタイプのフィールドを作って`serialize`や`store`を使うのが一つの手。ただ、割と書き込みが多い事が想定され、無駄に大切なPostgreSQLサーバーに負荷をかけてしまう。
そんなこんなでスキーマレスな出力場所としてMongoDBを使うというアイデアが持ち上がった。HerokuではMongoHQなら16M、MongoLabなら0.5Gが無料で使える。
なお、基本的に、MongoDBをサブとして使うので`rails g model`などをした時に`mongoid`がinvokeされるのは避けたい。

## 実践

```Gemfile
gem 'mongoid'
```

して、`bundle install`

```
$ rails generate mongoid:config
```

すると、`config/mongoid.yml`にdevelopmentとtestの設定が生成されるので、ここにconfigurationを書く。基本的には変更する必要がないが、`database`, `username`, `password`あたりの書き換え、書き足しだけチェックしてみればいいのではないだろうか？

`production`の設定はHerokuのAdd-onのドキュメント通りにすれば良いと思う。[MongoHQ](https://devcenter.heroku.com/articles/mongohq)のドキュメントの方が詳しく書かれていたのでこっちを参照した。使ったのは[MongoLab](https://devcenter.heroku.com/articles/mongolab)だけど(笑)

ちゃんと設定したければ、
http://mongoid.org/en/mongoid/docs/installation.html
にそれぞれオプションが詳しく載っている。

mongoidのモデルは`rails generate model`でできるようになっている。

```
$ rails generate model user_mongo name:string
    invoke  mongoid
    create    app/models/user_mongo.rb
```

```ruby:app/models/user_mongo.rb
class UserMongo
  include Mongoid::Document
  field :name, type: String
end
```

ということは、ActiveRecordのmodelを作るとき、`active_record:`とprefixをつける必要がある。

```
$ rails generate acrive_record:model
```

これは`migration`コマンドやgemの`devise`などでも同様。

これが困る場合、`application.rb`に

```ruby:config/application.rb
config.generators do |g|
  g.orm :active_record
end
```

と追加すれば良い。このときmongoidのモデルを作るときは

```
$ rails generate mongoid:model
```

とする。

最後に、Mongoidの使い方は、適当に自分で調べて使ってみれば意外と簡単に使えると思うが、http://mongoid.org/en/mongoid/docs/relations.html は読んでおくと良いと思う。多分ActiveRecordとはちょっと違っていて難しいであろう、Relation/Associationのあたりの話がちゃんと書いてある。


## 参考
- http://stackoverflow.com/questions/6372626/using-active-record-generators-after-mongoid-installation
- http://mongoid.org/en/mongoid/
- https://devcenter.heroku.com/articles/mongohq


## 追記: ロードするclassの設定

mongoidのgemを見ると設定なしでは`apps/model`以下の全てのRubyファイルをロードしてしまう設定になっていた。

これを防ぐためには、`options`の`preload_models`にMongoid::DocumentをIncludeしているクラスを全て指定すれば良い。
例えば、`data_mongo.rb`と`user_monbo.rb`を作った場合は、

```mongoid.yml
production:
  # ...
  options:
    preload_models:
      - data_mongo
      - user_mongo
```

というように設定する。


一応、今後解決する可能性もあるので、mongoidの問題となっている部分のを載せておく

```mongoid3.0.22/lib/rails/mongoid.rb
    def load_models(app)
      app.config.paths["app/models"].each do |path|
        preload = ::Mongoid.preload_models
        if preload.resizable?
          files = preload.map { |model| "#{path}/#{model}.rb" }
        else
            files = Dir.glob("#{path}/**/*.rb")
        end

        files.sort.each do |file|
          load_model(file.gsub("#{path}/" , "").gsub(".rb", ""))
        end
      end
    end
```
git-flow童貞のためのメモ hotfixブランチ編


続編はあった(前編: http://qiita.com/items/d8bc693ff516879b57e4)

緊急のバグ修正をしたいとき
git flow hotfix start pokopoko

修正をほげほげする

git flow hotfix finish pokopoko

これでmasterとdevelopmへmergeされる

masterとdevelopとtagをpushする
git push origin master
git push origin refs/tags/pokopoko
git push origin develop

これでおわり

きっと続く
HerokuのDBプランをあげる流れ


Heroku Postgresの
Plan: Kappa (HEROKU_POSTGRESQL_BRONZE) から
Plan: Ronin (HEROKU_POSTGRESQL_COPPER) に
あげる例で書きます。適宜読み替えて下さい。

## まずは現状の確認

```
$ heroku pg:info
=== HEROKU_POSTGRESQL_BRONZE (DATABASE_URL)
Plan:        Kappa
Status:      available
Data Size:   10.00 GB
Tables:      50
PG Version:  9.1.4
Connections: 10
Fork/Follow: Available
Created:     2013-01-01 12:34 UTC
Maintenance: not required
```

これでデータサイズやテーブル数、コネクション数はわかる。
なお、dbnameやpasswordなども知りたい場合は

```
$ heroku pg:credentials HEROKU_POSTGRESQL_BRONZE
```

を叩けばOK。

ただ、Herokuはプランをあげてもキャッシュ用メモリやCPU性能しか上がらないので、本当に必要な情報はキャッシュヒット率だったりする。

それを調べるには

```
$ heroku pg:psql
```

と打ってから

```
SELECT 
  sum(heap_blks_read) as heap_read,
  sum(heap_blks_hit)  as heap_hit,
  (sum(heap_blks_hit) - sum(heap_blks_read)) / sum(heap_blks_hit) as ratio
FROM 
  pg_statio_user_tables;
```

と打てば、テーブルのキャッシュヒット率

```
SELECT 
  sum(idx_blks_read) as idx_read,
  sum(idx_blks_hit)  as idx_hit,
  (sum(idx_blks_hit) - sum(idx_blks_read)) / sum(idx_blks_hit) as ratio
FROM 
  pg_statio_user_indexes;
```

と打てば、Indexのキャッシュヒット率がわかる。

このことは以下のページに書いてある。
https://devcenter.heroku.com/articles/heroku-postgres-plans#determining-required-cachesize

## DBプランをあげる一連の流れ

DBプランをあげることを決断したら、後は以下の流れでUpgradeできる

```
heroku maintenance:on
heroku pgbackups:capture --expire (最新のDBの状態をバックアップとして取得）
heroku addons:add heroku-postgresql:ronin (新しいDBはHEROKU_POSTGRESQL_COPPERだと取得）
heroku pg:wait (新しいDBができるまで待つ)
heroku pg:info (DBができているか確認）
heroku pgbackups:restore HEROKU_POSTGRESQL_COPPER (バックアップからDB状態をコピー)
heroku pg:promote HEROKU_POSTGRESQL_COPPER (新しいDBに繋ぎ変え)
heroku restart
--- 確認作業 ---
heroku maintenance:off
```

確認作業の部分はStagingを持っている人の場合、

```
heroku config | grep DATABASE_URL (DATABASE_URLをstaging用にコピー)
heroku config:set DATABASE_URL=postgres://xxxxxx --app your-staging-app
heroku restart --app your-staging-app
```

とやって、Staging環境から本番DBにつなぐことで行える。


数日運用してもう問題が無いと自信がついた頃、以下のコマンドで元のDBを削除する。

```
heroku addons:remove HEROKU_POSTGRESQL_BRONZE
```


## 公式ドキュメント
- https://devcenter.heroku.com/articles/heroku-postgresql
- https://addons.heroku.com/heroku-postgresql
- https://postgres.heroku.com/
FireFoxやChromeでのwindow.close()について

FireFoxやChromeではjavascriptによって開かれたウィンドウしかwindow.close()で閉じることが出来ない。つまりURL直うちで開いたページはwindow.close()で閉じることが出来ない。
ちなみにIE（9）では出来てしまう。
ImageMagick + TIFF (Mac OS X 10.8.2)

`brew install imagemagick`でインストールしたImageMagickには`convert -list format`のコンバートフォーマットリストの中にTIFFが無い

* [image - Imagemagick can not find deletegates library for .tiff format on mac os x mountain lion - Stack Overflow](http://stackoverflow.com/questions/12943947/imagemagick-can-not-find-deletegates-library-for-tiff-format-on-mac-os-x-mounta)

※上記のStack Overflowの回答通り`--with-libtiff`オプションを付けてImageMagickをインストールする


## 1. Homebrewアップデート

```
brew update
```

## 2. ImageMagickアンインストール

```
brew uninstall imagemagick
```

## 3. libtiffインストール／ImageMagickオプション指定インストール

```
brew install libtiff
brew install imagemagick --with-libtiff
```

## 4. コンバートフォーマットリスト確認

```
convert -list format | grep TIF
----------
      EPT  EPT       rw-   Encapsulated PostScript with TIFF preview
     EPT2  EPT       rw-   Encapsulated PostScript Level II with TIFF preview
     EPT3  EPT       rw+   Encapsulated PostScript Level III with TIFF preview
   GROUP4* TIFF      rw-   Raw CCITT Group4
     PTIF* TIFF      rw+   Pyramid encoded TIFF
     TIFF* TIFF      rw+   Tagged Image File Format (LIBTIFF, Version 4.0.3)
   TIFF64* TIFF      rw-   Tagged Image File Format (64-bit) (LIBTIFF, Version 4.0.3)
----------
```

### 5. TIFFファイルがMiniMagickで開ける事を確認

```
MiniMagick::Image.open( "image_001.tif" )
----------
=> #<MiniMagick::Image:0x007fc95317a128 @path="/var/folders/8k/_c_m4g3n6n5_jjm1v9st_k340000gn/T/mini_magick20130213-2566-1mp7rdh.tif", @tempfile=#<File:/var/folders/8k/_c_m4g3n6n5_jjm1v9st_k340000gn/T/mini_magick20130213-2566-1mp7rdh.tif (closed)>>
----------
```

----
----

* 上記の対応をしていないと下記のようにMiniMagickでtiff画像を開いた時にエラーになる

```
MiniMagick::Image.open( "image_001.tiff" )
----------
MiniMagick::Invalid: MiniMagick::Invalid
	from /Users/shu/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/mini_magick-3.4/lib/mini_magick.rb:164:in `create'
	from /Users/shu/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/mini_magick-3.4/lib/mini_magick.rb:73:in `read'
	from /Users/shu/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/mini_magick-3.4/lib/mini_magick.rb:134:in `block in open'
	from /Users/shu/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/mini_magick-3.4/lib/mini_magick.rb:133:in `open'
	from /Users/shu/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/mini_magick-3.4/lib/mini_magick.rb:133:in `open'
	from (irb):162
	from /Users/shu/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/railties-3.2.11/lib/rails/commands/console.rb:47:in `start'
	from /Users/shu/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/railties-3.2.11/lib/rails/commands/console.rb:8:in `start'
	from /Users/shu/.rbenv/versions/1.9.3-p327/lib/ruby/gems/1.9.1/gems/railties-3.2.11/lib/rails/commands.rb:41:in `<top (required)>'
	from script/rails:6:in `require'
	from script/rails:6:in `<main>'
----------
```

※Heroku上では上記のエラーは出ない模様
Auto Layoutを利用してキーボードに合わせてビューをリサイズする方法

iOS6から利用できるAuto Layoutを利用して、キーボードが表示・非表示になった時にUITextViewをリサイズしてみます。

## Constraintの設定
UITextViewを貼り付けます。
![UITextView](http://f.cl.ly/items/1A1O2W3n3W1C2l1f3J44/Image%202013.02.13%2014:38:47.png)

UITextViewのConstraintsのBottom Space to: SuperviewをView Controllerのoutletに設定します。

![Vertical Space](http://f.cl.ly/items/0Z2n2d1j1s2M0s3k2b0Z/Image%202013.02.13%2014:50:38.png)
![Outlet](http://f.cl.ly/items/3R053V393R2V413a2n0z/Image%202013.02.13%2015:24:42.png)

```Objective-C:CTViewController.h
@interface CTViewController : UIViewController
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *bottomConstraint;
@end
```

## キーボード開閉を監視して再レイアウト

キーボードの開閉を監視して、constraintに値を設定して再レイアウトを行います。bottomConstraintにはキーボードの高さのマイナス値を設定します。

```Objective-C:CTViewController.m
- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}

- (void)keyboardWillShow:(NSNotification *)notification {
    NSDictionary *info = [notification userInfo];
    CGRect keyboardFrame = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    NSTimeInterval duration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    
    self.bottomConstraint.constant = keyboardFrame.size.height;
    
    [UIView animateWithDuration:duration animations:^{
        [self.view layoutIfNeeded];
    }];
}

- (void)keyboardWillHide:(NSNotification *)notification {
    NSDictionary *info = [notification userInfo];
    NSTimeInterval duration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    
    self.bottomConstraint.constant = 0;
    
    [UIView animateWithDuration:duration animations:^{
        [self.view layoutIfNeeded];
    }];
}
```

これでUITextViewをタッチすると自動的にUITextViewが縮小されてキーボードの高さにフィットするようになりました。
Windows の ping.exe は、なぜか改行の出力が CR + CR + LF になっている

コマンドプロンプト上で実行していると気づかないが、出力をファイルにリダイレクトすると分かる。

このため、PowerShell で次のようにして ping 出力をファイルに残そうとすると、画面出力もファイル出力も、余計な空行が入って残念な感じになる。
（PowerShell の場合、CR + CR + LF を CR + LF + CR + LF に修正するようだが、空行が入るのは同じ）

```
ping -t ＜IPアドレス＞ | tee ping.log
```

これを回避するには、空行を除去してパイプに渡してやればよい。

```
ping -t ＜IPアドレス＞ | Select-String -Pattern "\S" | tee ping.log
```
エディタで半角スペースとタブを相互に変換

エディタで開いているファイルに含まれる半角スペースをタブに変換します。
範囲指定すれば変換対象を一部に限定することができます。
区切り文字にタブしか受け付けない太古の syslog.conf などを編集するときに重宝します。

|           | Space → Tab   | Tab → Space |
|-----------|----------------|--------------|
| **Vim**   | :%!unexpand -a | :%!expand    |
| **Emacs** | M-x tabify     | M-x untabify |

(*) unexpand, expand はコマンドなのでシェルからでも実行できます。
Core Data モデルファイルの名前を変えたくなったら

唐突に xcdatamodeld ファイルの名前を変えたくなったら、Xcode 右ペインの File Name だけでなくもう1カ所書き換える。
xcdatamodeld ファイルのパッケージを開いて、.xccurrentversion ファイル内の _XCCurrentVersionName 記述を新しいファイル名に変更する。
Sublime Text 2 ホットキー


## for windows
key | value
---|---
CTRL + ALT + 1,2,3,4|Multiple Window Panes
F11|Go Full Screen
SHIFT + F11|Distraction Free Mode
CTRL + Click|Multiple Cursors/Selection
CTRL + D|Highlight Closest Matching Word
CTRL + L|Highlight Line
CTRL + SHIFT + SPACE|Highlight Scope (The paragraph/code block)
CTRL + SHIFT + M|Highlight to Brackets (If you are in [] **or** () **or** {})
CTRL + SHIFT + K|Delete Line
CTRL + /|Line Comment
CTRL + SHIFT + /|Multiline Comment
ALT + F3|Selects All Matching Words
CTRL + SHIFT + F |Find in Files 
CTRL + F|Find in This File
CTRL + G|Go to Line
CTRL + H|Find / Replace
CTRL + `|Show Console
CTRL + P|GoTo Anything (Open file,etc)
CTRL + P then file@function|GoTo a Function in a File
TAB|Indent
SHIFT + TAB|Outdent
CTRL + ]|Indent
CTRL + [| Outdent
CTRL + SHIFT + UP|Swap Line up
CTRL + SHIFT + DOWN|Swap Line Down
CTRL + SHIFT + D|Duplicate Line
CTRL + J|Join Lines
CTRL + SHIFT + [|Code Fold
CTRL + SHIFT + ]|Code Unfold
gem install bundleでlibがないってエラーが出たら


rbenvとかで以下の様なエラーが出た場合の対処法

	$ sudo gem install bundle
	Fetching: bundler-1.2.3.gem (100%)
	Fetching: bundle-0.0.1.gem (100%)
	Successfully installed bundler-1.2.3
	Successfully installed bundle-0.0.1
	2 gems installed
	Installing ri documentation for bundler-1.2.3...
	Installing ri documentation for bundle-0.0.1...
	file 'lib' not found
	Installing RDoc documentation for bundler-1.2.3...
	Installing RDoc documentation for bundle-0.0.1...
	file 'lib' not found

先にrdocをインストールするだけでよい

	$ sudo gem install rdoc
Gentoo Portageのprofileがdeprecatedになったときの対処


すぐ忘れるのでメモ程度に。

# profileがdeprecatedになったとき

たとえばこんなこと言われる。

```
ews ~ # emerge -uNDav world

!!! Your current profile is deprecated and not supported anymore.
!!! Use eselect profile to update your profile.
!!! Please upgrade to the following profile if possible:
        default/linux/sparc/13.0


 * IMPORTANT: 1 news items need reading for repository 'gentoo'.
 * Use eselect news to read news items.


These are the packages that would be merged, in order:
```

`eselect profile list` で使えるprofileの一覧を表示して…

```
ews ~ # eselect profile list
Available profile symlink targets:
  [1]   default/linux/sparc/13.0
  [2]   default/linux/sparc/13.0/desktop
  [3]   default/linux/sparc/13.0/desktop/gnome
  [4]   default/linux/sparc/13.0/desktop/kde
  [5]   default/linux/sparc/13.0/developer
```

`eselect profile set` すればいい。

```
ews ~ # eselect profile set 1
```

選択したprofileには`*`が付く。

```
ews ~ # eselect profile list
Available profile symlink targets:
  [1]   default/linux/sparc/13.0 *
  [2]   default/linux/sparc/13.0/desktop
  [3]   default/linux/sparc/13.0/desktop/gnome
  [4]   default/linux/sparc/13.0/desktop/kde
  [5]   default/linux/sparc/13.0/developer
```
プロキシの指定方法

以下、プロキシサーバのURLを`http://proxy.example.com:8080/`とする。

認証が必要な場合はプロキシサーバの設定を下記のように書く。

```
http://username:password@proxy.example.com:8080
```

# Tool

## git

下記のコマンドで追加

```bash
$ git config --global http.proxy http://proxy.example.com:8080/
```

または下記の内容を.gitconfigに追加する。

```
[http]
    proxy=http://proxy.example.com:8080/
```

## subversion

~/.subversion/serversファイルを編集する

```
[global]
http-proxy-host = proxy.example.com
http-proxy-port = 8080
```

## wget

~/.wgetrcに下記を追加

```
http_proxy=http://proxy.example.com:8080/
```

## curl

~/.curlrcに下記を追加

```
proxy=http://proxy.example.com:8080/
```

## Vagrant

環境変数http_proxyを設定

```bash
$ export http_proxy=http://proxy.example.com:8080/
```

# Ruby

## gem

~/.gemrcに下記を追加

```
http_proxy: http://proxy.example.com:8080
```

## bundler

環境変数http_proxyを設定

```bash
$ export http_proxy=http://proxy.example.com:8080/
```

# node

## npm

```bash
$ npm config proxy http://proxy.example.com:8080/
```

また、httpsを越えられない場合は

```bash
$ npm config registry http://registry.npmjs.org/
```

# Application

## Jenkins

プラグインのダウンロードに必要。
Jenkinsの画面から"Jenkinsの管理 → プラグインの管理 → 高度な設定"で設定する。

# OS
## yum

/etc/yum.confに下記を追加する。

```
proxy=http://proxy.example.com:8080/
```

## apt-get

/etc/apt/apt.confに下記を追加する。

```
Acquire::http::proxy "http://proxy.example.com:8080/";
```
Mongoid::Paranoiaで論理削除されたドキュメントを扱う

```ruby:mongoid_paranoia_demo.rb
class User
  include Mongoid::Document
  include Mongoid::Paranoia
end

all_users = User.all
all_users.selector.clear
puts all_users.count

deleted_users = User.deleted
puts deleted_users.count
```

### 参考: 
- http://mongoid.org/en/mongoid/docs/extras.html#paranoia
- https://github.com/simi/mongoid-paranoia/blob/master/lib/mongoid/paranoia.rb
nginx で HTTP → HTTPS へリダイレクトする


http://hoge.example.com/~ へのアクセスを https://hoge.example.com/~ にリダイレクトする。

nginx ではデフォルトで NginxHttpRewriteModule というモジュールが有効になっており、Apache の mod_rewrite のようなことができるらしい。

server ブロックにこのように書くことで設定できる。

```
server {
  listen 80;
  server_name hoge.example.com;
  rewrite ^(.*) https://hoge.example.com$1 permanent;
}
```

参考URL
http://wiki.nginx.org/NginxHttpRewriteModule
IntelliJ IDEAからGAEのデプロイ時に発生するIllegalStateExceptionの回避方法

Google App Engineのデプロイ時に以下のようなエラーが発生する場合があります。

'''java.lang.IllegalStateException: Found a jar file too large to upload: "..Local\Temp\appcfg1234567890.tmp\WEB-INF\lib\appengine-tools-sdk-1.7.x.jar".  Consider using --enable_jar_splitting.
Unable to update app: Found a jar file too large to upload: "..Local\Temp\appcfg1234567890.tmp\WEB-INF\lib\appengine-tools-sdk-1.7.x.jar".  Consider using --enable_jar_splitting.
Please see the logs [..\Local\Temp\appcfg1234567890.log] for further information.
'''
これはlibフォルダに配置したjarファイル等のサイズが1Mを超えたときにサイズオーバーで発生するエラーです。
ログに書いてありますがdeployコマンド発行時に"--enable_jar_splitting"というオプションをつけることで回避できます。

IntelliJ IDEAのGoogle App Engine Pluginではこのオプションを指定することができないため手動でデプロイの設定を行います。

メニューのPreferences > External Tools
＋ボタンをクリックして新規登録

'Name:Deploy（任意）
Group:Google App Engine（任意）
Description:Deploy to Google App Engine（任意）
OptionとShow Inのチェックはデフォルトのまま
Program:/Applications/appengine-java-sdk-1.7.4/bin/appcfg.sh（macの場合の例）
Paramaters:--enable_jar_splitting update $ProjectFileDir$/out/artifacts/$ProjectName$exploded（ここでオプションを指定）
Working directory:/Applications/appengine-java-sdk-1.7.4/bin
'

Paramatersの所に以下のように指定します。
'--enable_jar_splitting update [ビルドの出力先]'
Rails Style Guide by bbatsov

> Prelude<br/>
> Style is what separates the good from the great. <br/>
> -- Bozhidar Batsov

The goal of this guide is to present a set of best practices and style prescriptions for Ruby on Rails 3 development. It's a complementary guide to the already existing community-driven Ruby coding style guide.

While in the guide the section Testing Rails applications is after Developing Rails applications I truly believe that Behaviour-Driven Development (BDD) is the best way to develop software. Keep that in mind.

Rails is an opinionated framework and this is an opinionated guide. In my mind I'm totally certain that RSpec is superior to Test::Unit, Sass is superior to CSS and Haml (Slim) is superior to Erb. So don't expect to find any Test::Unit, CSS or Erb advice in here.

Some of the advice here is applicable only to Rails 3.1+.

[Read More...](https://github.com/bbatsov/rails-style-guide)
Ruby Style Guide by bbatsov

> # Prelude

> Style is what separates the good from the great. <br/>
> -- Bozhidar Batsov

One thing has always bothered me as Ruby developer - Python developers
have a great programming style reference
([PEP-8](http://www.python.org/dev/peps/pep-0008/)) and we never got
an official guide, documenting Ruby coding style and best
practices. And I do believe that style matters. I also believe that
such fine fellows, like us Ruby developers, should be quite capable to
produce this coveted document.

This guide started its life as our internal company Ruby coding guidelines
(written by yours truly). At some point I decided that the work I was
doing might be interesting to members of the Ruby community in general
and that the world had little need for another internal company
guideline. But the world could certainly benefit from a
community-driven and community-sanctioned set of practices, idioms and
style prescriptions for Ruby programming.

Since the inception of the guide I've received a lot of feedback from
members of the exceptional Ruby community around the world. Thanks for
all the suggestions and the support! Together we can make a resource
beneficial to each and every Ruby developer out there.


[Read More...](https://github.com/bbatsov/ruby-style-guide)
iPhone実機(iOS6.x)で通信速度を制限する


iOS6から設定画面にある「デベロッパ」の中の"Network Link Conditioner"から
通信速度を制限できるようになっていました。

これで回線が細い時の実機テストや通信エラー時のテストをやり放題ですね…!!

追記:
設定画面「デベロッパ」項目はXcodeのOrganizerで"Use Development"にしていると
表示されるとコメントで教えて頂きました。

## やり方

まず下の画像のように設定にデベロッパのセルがあると思います

![](http://25.media.tumblr.com/02835e061667f00d52cd0685f44f14d4/tumblr_mi46gt0LXq1qzzao7o1_400.png)

デベロッパをタップするとDeveloper Settingsという
画面が表示されると思います。

![](http://25.media.tumblr.com/56bcd2e3eca5f7dd4a27beb1f7b06b7a/tumblr_mi46gt0LXq1qzzao7o2_400.png)

Network Link ConditionerセクションのStatusをタップすると、
次のような画面になります

![](http://25.media.tumblr.com/9c2f4892607ecd4cb4924d4cc09eff72/tumblr_mi46gt0LXq1qzzao7o3_400.png)

ここで例えばEnabelをオンにして3Gを選ぶと
Wifi接続しているのにDLで1Mbpsも出なくなりました
（実際のWifi接続では20Mbpsくらいの回線）

![](http://25.media.tumblr.com/4fecdbd23f1c3bc9fda80ef0b682121e/tumblr_mi46gt0LXq1qzzao7o4_400.png)

ちなみに私の環境では
"100% Loss"は通信がタイムアウト
"Edge"は0.31Mbpsで3Gより低く、
"DSL"は2.24Mbpsで3Gより高く、
"High Latency DNS"はWifiとほぼ同じ、
"Very Bad Netowrk"は試した限り接続ができない状態になりました。
nextTickで重い処理でもイベントループを止めない

0.9からはsetImmediate()を使うようですが。

```javascript
(function total(i, res) {
  if (i === 0) {
    console.log(res);
  }
  res += i;
  process.nextTick(function () {
    total(--i, res);
  });
})(100000, 0);

# 5000050000
```

nextTick付けないで100000で計算しようとすると
「RangeError: Maximum call stack size exceeded 」
と怒られるけど、nextTick()でやると怒られない。

ただ、こういうやり方はよくなくて、CPUヘビーな処理なら子プロセスとかでやった方がいい？


### おまけ
フィボナッチ数列はこんな感じかな

```javascript
var counter = 0,
  total = 0;
(function fib(n) {
  if (n < 2) {
    total += 1;
    return;
  }
  ++counter;
  process.nextTick(function () {
    fib(n - 2) + fib(n - 1);
    if (!--counter) {
      console.log(total);
    }
  });
})(10);

# 121393
```
Haxeはswitch文が便利

Haxeの通常のswitch文は以下のようになります。

```js
var colorName = "赤";
var num = switch( colorName ) {
	case "red", "赤":		0xFF0000;
	case "green", "緑":	0x00FF00;
	case "blue", "青":		0x0000FF;
	case "うぐいす":		0x928C36;
	default:
		throw "そんな色知らないよ！";
}
```
「break;」がない、caseが複数指定出来る、値を返すというのが特徴です。
これだけでも便利なんですがさらに便利なのはEnum(列挙型)を使った時です。

----

#Enumとは
Enumは、AS3でいうところのイベント定数やキーコード定数のような実装を行うときに使われるデータ型です。

以下のように使います。

```hx:Main.hx
enum Keyboard {
	UP;
	DOWN;
	LEFT;
	RIGHT;
	Number( num:Int );
	Alphabet( charString:String );
}

class Main {
	static function main() {
		getKeyCode( Keyboard.UP );				//38
		getKeyCode( Keyboard.Alphabet( "A" ) );	//65
		getKeyCode( Keyboard.Alphabet( "z" ) );	//90
		getKeyCode( Keyboard.Number( 1 ) );		//49
	}
	
	static function getKeyCode( key:Keyboard ) {
		switch( key ) {
			case LEFT:
				return 37;
				
			case UP:
				return 38;
			
			case RIGHT:
				return 39;
				
			case DOWN:
				return 40;
				
			case Alphabet( char ):
				if ( char.length != 1 ) throw "charStringの長さは1でなければなりません";
				char = char.toUpperCase();
				var code = char.charCodeAt( 0 );
				if ( code < 65 || 90 < code ) throw "文字列がアルファベットじゃありません";
				return code;
				
			case Number( n ):
				if ( n < 0 || 9 < n ) throw "0～9を指定してください";
				return n + 48;
		}
	}
}
```
HaxeのEnumは変数を指定できるのが特徴で、これをswitch文により取りだすことができます。

Enumに複数の変数を指定することも可能です。

```hx
enum Sample {
	TEST( i:Int, s:String );
}
```

追記:
Haxe3になって、switch文はさらに便利になりました。
詳しくは、[パターンマッチング - Haxe](http://haxe.org/manual/pattern_matching)
chefインストールスクリプト

お名前.comで借りたVPS(CentOS6.2)で[joker1007 さんが投稿したスクリプト](http://qiita.com/items/16d2827519a152b514cd )
を動かすと、libyaml-develがインストールされないので、
rubyインストールでエラーとなる。
リポジトリにEPELを追加すれば良いみたいなんだけど、
何となく嫌なので、libyamlをソースからコンパイルするように
スクリプトを修正してみた。

```install-chef.sh
# CentOS 6.3
# root executes this script

# Install Libraries for build
yum -y install gcc-c++ patch readline readline-devel zlib zlib-devel libffi-devel openssl-devel make bzip2 autoconf automake libtool bison wget unzip git

#Install libyaml
wget http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz
tar -zxvf yaml-0.1.4.tar.gz
cd yaml-0.1.4
./configure
make;make install
cd ../
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

# Download Ruby
wget ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p327.tar.gz
tar xvzf ruby-1.9.3-p327.tar.gz

# Create Install Directory
mkdir /opt/ruby

# Configure and Compile
cd ruby-1.9.3-p327
./configure --prefix /opt/ruby
make
make install

cd

# Chef Install
/opt/ruby/bin/gem install chef

# Clone Cookbooks
git clone git://github.com/opscode/cookbooks.git chef-cookbooks

# Create Chef Directories
mkdir /etc/chef
mkdir /var/chef-solo
```
libyamlは/usr/local/lib以下にインストールされるので、
スクリプトの中でLD_LIBRARY_PATHを設定している。
Perlでbignum

Perlで扱える数字には、限界がある。

```perl:a.pl
#!/usr/bin/env perl
use 5.10.0;
use strict;
use warnings;

say 2**1024;
```

```
$ perl a.pl 
inf
```

そんな時には、bignum(http://search.cpan.org/~flora/bignum-0.30/lib/bignum.pm)

```perl:b.pl
#!/usr/bin/env perl
use 5.10.0;
use strict;
use warnings;
use bignum;

say 2**1024;
```
use bignum;の1行を加えるだけで

```
$ perl b.pl
179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216
```

このとおり

```
$ time perl a.pl > /dev/null 
perl a.pl > /dev/null  0.01s user 0.00s system 74% cpu 0.016 total
$ time perl b.pl > /dev/null
perl b.pl > /dev/null  0.05s user 0.00s system 95% cpu 0.058 total
```
（当たり前だけど）計算は遅くなる
rbenvにRubyを強引にインストールする方法。

[Ruby 1.9.3-p385インストール(Mac OS X 10.8.2)](http://qiita.com/items/f20423b5fdaa0d02268d)

上記の方法で rbenv install -l コマンドで1.9.3-p385が表示されなかったので記事を書きます。つまりruby-buildプラグインがインストールされている状態です。

下記コマンドを実行
-------------
```
wget https://raw.github.com/sstephenson/ruby-build/master/share/ruby-build/1.9.3-p385 .rbenv/plugins/ruby-build/share/ruby-build
```

コマンドを実行する事でgithubから強引にdownloadしてきます。

その後rbenv install 1.9.3-p385を行えば強引にRubyをインストールする事が出来ました。
PHPUnitでコンストラクタを呼ばずにテストする

# テスト対象コード
```php:SampleClass.php
<?php

class SampleClass
{
    public function __construct()
    {
        exit;
    }

    public function hoge()
    {
        return TRUE;
    }
}
```
- hoge()がTRUEを返すことを検証したい

# テストコード
```php:SampleClassTest.php
<?php

require_once 'SampleClass.php';

class SampleClassTest extends PHPUnit_Framework_TestCase
{
    public function testHogeReturnTrue()
    {
        $this->class = new SampleClass();
        $this->assertTrue($this->class->hoge());
    }
}
```
# テスト実行結果
```console
$ phpunit SampleClassTest.php 
PHPUnit 3.6.10 by Sebastian Bergmann.
```
- コンストラクタが呼ばれexitが実行されるために検証結果が得られない

# テストコード

```php:SampleClassTest.php
<?php

require_once 'SampleClass.php';

class SampleClassTest extends PHPUnit_Framework_TestCase
{
    public function testHogeReturnTrue()
    {
        $class = $this->getMockBuilder('SampleClass')
                      ->setMethods(NULL)
                      ->disableOriginalConstructor()
                      ->getMock();

        $this->assertTrue($class->hoge());
    }
}
```
# テスト実行結果
```console
$ phpunit SampleClassTest.php
PHPUnit 3.6.10 by Sebastian Bergmann.

.

Time: 0 seconds, Memory: 2.75Mb

OK (1 test, 1 assertion)
```
- MockBuilderを活用しdisableOriginalConstructor()を設定することで検証結果を得ることができた
usingを使ってちょっとシンプルな関数呼び出し

Haxeではusingキーワードを使うことでMixinを行うことができます。

たとえば、二つの文字列の距離を比較するプログラムを書いた場合

```hx:StringUtil.hx
package utils;
class StringUtil {
	static public function distance(str1:String, str2:String) {
		var map:Array<Array<Int>> = [];
		var l1 = str1.length + 1, l2 = str2.length + 1;
		
		for ( i in 0...l1 ) map[i] = [i];
		for ( j in 0...l2 ) map[0][j] = j;
		
		for ( i in 1...l1 )
			for ( j in 1...l2 )
				if ( str1.charAt(i - 1) ==  str2.charAt(j - 1) ) {
					map[i][j] = map[i - 1][j - 1];
				}else{
					var min = map[i - 1][j - 1] + 1;
					var d = map[i][j - 1] + 1;
					if ( d < min ) min = d;
					d = map[i - 1][j] + 1;
					if ( d < min ) min = d;
					map[i][j] = min;
				}
		
		return map[l1 - 1][l2 - 1];
	}
}
```

----

こうやって使うことができます。

```hx:Main.hx
using utils.StringUtil;	//←importではなくusing

class Main {
	static function main() {
		//「そろばん」と「そうこばん」は2文字違い。
		trace( StringUtil.distance( "そろばん", "そうこばん" ) );		//2
		
		//こういう書き方も出来る。
		trace( "そろばん".distance( "そうこばん" ) );					//2
	}
}
```

下の書き方がMixinです。
ちょっとシンプルに書けますね。
tweepy2導入


コレまで使用していたtweepyがapi1.1に対応していないということでコチラの導入を
[https://bitbucket.org/sakito/tweepy](https://bitbucket.org/sakito/tweepy)
おそらく2013/02/12時点ではeasy_installやpipではなく人力でになるような、多分。。。
Downloadsにある最新版を解凍して出来るtweepy2を丸ごとtweepyと同じ階層にcp -Rでコピーしただけで動きました。

```python:hoge.py
#!/usr/bin/env python
# -*- coding:UTF-8 -*-


from oauth2 import Client, Consumer, Token
import tweepy2
consumer_key = ""
consumer_secret = ""
user_key = "-"
user_secret = ""
auth = tweepy2.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(user_key, user_secret)
client = Client(Consumer(consumer_key, consumer_secret),
                Token(user_key, user_secret))
api = tweepy2.API(auth)
```

今までtweepyと書いていた箇所をtweepy2にしただけでOAuthトークンは問題ないようでした。

```python:tweet.py
#!/usr/bin/env python
# -*- coding:UTF-8 -*-

import pywapi
from urllib import urlencode
import datetime
import hoge

result = pywapi.get_weather_from_yahoo('JAXX0043', 'metric')
time = datetime.datetime.now()
ms = time.microsecond

twit = u"@hoge 熊本の現在から今夜くらいの天候は" + result['forecasts'][0]['text'] + u" 気温は最高" \
        + result['forecasts'][0]['high'] \
       + u"で最低が" + result['forecasts'][0]['low'] + u"くらい。" + " #fkdr " + str(ms)

weth = twit.encode("utf-8")
hoge.client.request('https://api.twitter.com/1.1/statuses/update.json', 'POST', urlencode({'status': weth}))
```
こちらは変更は最終行の投稿部分のurlが変わっただけで動きました。

ウチはtweepy2導入と投稿を投げるurl変更でほぼほぼ問題無さそう。
TLやフォロー・フォロワー取得して色々やってる人の場合は何か障害出てくるかもしれませんが。。。。
Node Bootstrap


nodeにはnode.jsというbootstrapがあるが、これはそのまま読み込まれるのだと何となくおもっていたけれど、これはビルドに時点でCのソース(ASCIIコードに変換したint配列)に変換される。

これをnode.ccの中でコンパイルしてnodeのバイナリができあがる。
なのでnode.jsに変更を加えても反映されないのは一度コンパイルする必要があるから。
MD5のハッシュ値を計算する

MD5のハッシュを計算するには、次の名前空間を使用します。

```csharp
using System.Security.Cryptography;
```

計算は`MD5.ComputeHash( )`で行います。オーバーロードは主に`byte[ ]`または`Stream`です。

```csharp
static string Run( string path )
{
	var md5 = MD5.Create( );
	using ( var stream = File.OpenRead( path ) )
	{
		return string.Concat(
			md5.ComputeHash( stream )
			.Select( x => string.Format( "{0:x2}", x ) )
		);
	}
}
```

このサンプルコードの返却値は下記のような感じになります。
`2c99a6cd27f781f6862f98e1841b829c`
Shellでもbase64

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


`GNU coreutils`パッケージに含まれる**base64コマンド**はbase64のエンコード/デコードが出来る。

pemファイルを動的なコンフィグに格納する際などに使える。

## エンコード

```
$ echo -n "giraffi" | base64            
Z2lyYWZmaQ==
```

## デコード

```
$ echo -n "Z2lyYWZmaQo=" | base64 -d
giraffi
```

大概のディストリビューションに入ってるかと思う。
compassとscss(sass)でスタイルシートの軽量化と保守性アップ【半分失敗】


CSSファイルが3000行になっていて辛かったです。
Chrome先生のDeveloperToolでみてみると1ページあたり90％くらいは利用されていませんでした。

###目標

- 不要なスタイルシートをを読み込ませない
- 保守性を上げる

※ビューとコントローラが分割されているフレームワーク限定

---

###利用するもの
- compass
- scss(sass)

compass, sassについては下記を参考にさせていただきました。
CSSの常識が変わる！「Compass」、基礎から応用まで！
http://liginc.co.jp/designer/archives/11623



コントローラで読み込むCSSファイル名を指定しビューに渡す変数に格納する。（ここではデフォルトでコントローラ名と同名のCSSファイルを読み込むよう指定しました）

```terminal
compass create assets
compass watch
```

これでassets/sass内のscss,sassファイルが更新された時自動でコンパイルされ、assets/stylesheets内にcssファイルとして書き出されます。

例ですが、ファイルを下記のような形で配置

```
assets
assets/sass
assets/sass/_base.scss
assets/sass/_common.scss
assets/sass/controller1.scss
assets/sass/controller2.scss
assets/stylesheets/
        …
```

_base.scssには要素リセット等のスタイルシート、
_common.scssには各ページに共通で使用するスタイルシートが入っています。

controller1.scssを指定した時。

```controller1.scss
@import 'base';
@import 'common';

/* controller1で使用するスタイルシート */
```

html内のスタイルシート読み込み

```
<link rel="stylesheet" href="/assets/stylesheets/[コントローラでCSSファイル名を指定した変数].css" type="text/css">
```

これで該当ページに使用していない大量のCSSは排除され、保守性を上げつつ、読み込まれるCSSファイルは1枚にまとまりました。

###デメリット

- 出力される各CSSファイルはbase, commonに記述されている内容も含むため大量にダブります。
特に問題ありませんが、ちょっと気持ち悪いと思いました。
- すべて1枚にまとめていた時はトップページを開いた時にキャッシュされ、以降のページ遷移でもキャッシュが利用されるかと思いますが、この方法だとページを移動した時に読み込まれるファイルが違うのでキャッシュが利用できません。（2度目以降のアクセスなら可能ですが…）

---

###まとめ
自分で作っておいてなんですが後者のデメリットが大きい気がします。
それならいっそimportせずにbaseとcommonは最初の1ページ遅いの覚悟でキャッシュさせて、以降のページはコントローラ毎とかにすればと。
サイト内のユーザーの動きにもよるので万能ではないです。
なので半分どころかかなり失敗です。
これはと思ってメモし始めてみたものの自分で書いていて悲しくなってきました。

何か良い手はないものか…
これってforeachなしで書けるのでしょうか？

```csharp:そのソース
foreach( var item in objItem.GetType().GetProperties().Where( c => c.PropertyType.FullName != "System.Object[]" ) )
	sb_.AppendFormat( "{0}\"{1}\":\"{2}\",\n", new string( '\t', iTab ), item.Name,
	item.GetValue( objItem, null ).ToString().Replace( "\n", "\\\\n" ).Replace( "\r", "" ) );
```
ChefServerからChef-Clientの実行状況をレポートする

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

chef-clientのエラーを逐一拾うのが面倒な時。

`knife status`を実行すれば各クライアントの最終正常終了時間がとれるので、ChefServer上で備え付けのクライアント`chef-webui`を使ってみる。

```shell:Shell-Out
# /usr/bin/knife status -k /etc/chef/webui.pem -u chef-webui
33 minutes ago, mmonit.example.com, mmonit.example.com, xxx.xxx.xxx.xxx, smartos 5.11.
20 minutes ago, mongodb08.example.jp, mongodb08.example.jp, xxx.xxx.xxx.xxx, ubuntu 12.04.
11 minutes ago, mongodb07.example.jp, mongodb07.example.jp, xxx.xxx.xxx.xxx, ubuntu 12.04.
9 minutes ago, rabbitmq01.example.jp, rabbitmq01.example.jp, xxx.xxx.xxx.xxx, smartos 5.11.
9 minutes ago, giraffi-chef.example.jp, giraffi-chef.example.jp, xxx.xxx.xxx.xxx, ubuntu 12.04.
3 minutes ago, mongodb06.example.jp, mongodb06.example.jp, xxx.xxx.xxx.xxx, ubuntu 12.04.
2 minutes ago, rabbitmq03.example.jp, rabbitmq03.example.jp, xxx.xxx.xxx.xxx, smartos 5.11.
1 minute  ago, rabbitmq02.example.jp, rabbitmq02.example.jp, xxx.xxx.xxx.xxx, smartos 5.11.
```

`status`に`-F Format`オプションは利かないので、出力が得られたらメールするなりパースして引っ掛けるなりします。`node attribtes`に対してならQUERYも可。
Mac で ruby-1.9.3-p385 がビルドできない問題を素早く解決する

Mountain Lion あたりだと ruby-1.9.3-p385 のビルド時に以下のようなエラーが出る：

```
BUILD FAILED
（略）
Last 10 log lines:
compiling regenc.c
compiling regerror.c
compiling regexec.c
compiling regparse.c
regparse.c:582:15: error: implicit conversion loses integer precision: 'st_index_t' (aka 'unsigned long') to 'int' [-Werror,-Wshorten-64-to-32]
    return t->num_entries;
    ~~~~~~ ~~~^~~~~~~~~~~
1 error generated.
make: *** [regparse.o] Error 1
```

整数の精度を落とすような暗黙的型変換の警告（`-Wshorten-64-to-32`）と、警告をエラーにするオプション（`-Werror`）によってビルドが失敗している。

これを解決するには `brew install apple-gcc42` して `CC=/usr/local/bin/gcc-4.2` すればいいという情報が[色々](http://act2012bl.wordpress.com/2013/02/10/rbenv%e3%81%a7ruby%e3%81%ae%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3%e5%88%87%e3%82%8a%e6%9b%bf%e3%81%88%e3%81%8c%e3%81%86%e3%81%be%e3%81%8f%e3%81%a7%e3%81%8d%e3%81%aa%e3%81%84mac/)と[見つかる](http://tesiri.hatenablog.com/entry/2013/02/11/homebrew%E3%81%A7ruby%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%99%82%E3%81%AB%E3%82%A8%E3%83%A9%E3%83%BC)が、そんなことをしなくても警告を無視するだけでビルドは通る：

```
export CFLAGS=-Wno-error=shorten-64-to-32
# プリインストールの readline と OpenSSL は壊れているため、別途 Homebrew などでインストールしたものを使う
export CONFIGURE_OPTS="--with-openssl-dir=/path/to/dir --with-readline-dir=/path/to/dir"

rvm install ruby-1.9.3-p385
# or
rbenv install 1.9.3-p385
```

apple-gcc42 を使えば出ないはずの警告を無視することについて不安があるかもしれないが、 apple-gcc42 は警告のチェックが甘いだけである。

**補足：**[homebrew で入れた openssl を使って Ruby をコンパイルすると SSL 利用時に証明書エラーが発生する場合の対応](http://qiita.com/items/12457815d5cee3723b97)
C# JSON風 適当 オブジェクト

```csharp:例
var obj = new object[]{
	new {
		Mst = "Hoge",
		Code = dr["Code"].ToString(),
		Name = dr["Name"].ToString(),
		Shape = dr["Shape"].ToString(),
		Docs = new object[] {
			new { 
				DocType = "Effect",
				Doc = dr["Effect"].ToString(),
				DocCode = dr["EffectCode"].ToString(),
			},
			new { 
				DocType = "Fuga",
				Doc = dr["Fuga"].ToString(),
				DocCode = dr["FugaCode"].ToString(),
			}
		}
	}
};
```
SWF から DoABC を削除する ActionScript

## 2014-03-06追記
この記事、だいぶんほったらかしにしていましたが、Adobe AIR の近頃のバージョンでは AOT 時にリモート用の SWF を指定すると、DoABC タグを自動的にパッケージ側に取り込んでくれる機能が付きました。
こいつがかなりのビルド時間をもたらしてくれる厄介な機能でもあるんですが。。

https://blogs.adobe.com/airodynamics/2012/11/09/packaging-and-loading-multiple-swfs-in-air-apps-on-ios/

# ここからが本文

Apple の意向で、Adobe AIR for iOS は AOT としてビルドしたパッケージしかリリース出来ません。
ですが、AOT ではリモートやローカルストレージから取得した DoABC タグが組み込まれた SWF ファイル（スクリプト付き SWF ファイルやリンケージ付き SWF）を実行出来ません。

なので、DoABC を削除する方法が必要となり AIR で作ってみました。

## swc を取ってくる

https://github.com/claus/as3swf
http://github.com/claus/as3swf/blob/master/bin/as3swf.swc

## コード

as3swf.swc を使って

```as
import com.codeazur.as3swf.SWF

// .....

    var swfBytes:ByteArray = // SWF ファイルのバイト列
    var swf:SWF = new SWF(swfBytes)
    var abctag:TagDoABC = swf.tags.filter(function(item:ITag, index:int, array:*):Boolean {
        return item is TagDoABC;
    })[0]
    var index:int = swf.tags.indexOf(abctag)
    swf.tags.splice(index, 1)
    var published:ByteArray = new ByteArray();
    swf.publish(published);
```

こうして作った published をファイルとして保存すれば DoABC が綺麗になくなります。

## 注意

ただし、この方法で削除した DoABC が削除されることでリンケージはなかったものになってしまいます。
なので、その代わりとなるリンケージ用クラス（名前はリンケージ名と同じもの）を自分で宣言しなおしてあげなければなりませんのでご注意を！

なお、設定したリンケージ一覧は SymbolClass タグに書かれているのでプログラムから取得が可能です。

http://hkpr.info/flash/swf/index.php?%E5%88%B6%E5%BE%A1%E3%82%BF%E3%82%B0%2FSymbolClass
jsonの例

```json:json
{
	"通常":"パターン",
	"配列":["1","2","test"], 
	"配列の中に構造":[
		{
			"項目１":{
				"前菜":"サラダ",
				"メインディッシュ":"肉"
			}
		},
		{
			"項目２":{
				"前菜":"トマト",
				"メインディッシュ":"魚"
			}
		}
	]
}
```
JSライブラリの管理ツールbowerを使ってみた


最近のアップデートでパッケージのインストール先を変えられるようになったので、GAEを使ったプロジェクトでもbowerを適用できるようになりました。

そこで、今回はbowerをインストールしてパッケージを入れるところと設定ファイルを使って挙動を変更するところについて書きます。

## インストール
```Bash:
$ npm --version #=> 1.1.66
$ node --version #=> v0.8.15
```

```Bash:
$ npm install -g bower
```
2013/2/12時点でバージョン0.7.0がインストールされました。

## ライブラリを入れてみる
```Bash:
$ bower install jquery 
bower cloning git://github.com/components/jquery.git
bower cached git://github.com/components/jquery.git
bower fetching jquery
bower checking out jquery#1.9.1
bower copying /Users/grapswiz/.bower/cache/jquery/cf68c4c4e7507c8d20fee7b5f26709d9
bower installing jquery#1.9.1
```

デフォルトではbower実行時のカレントディレクトリのcomponents以下にインストールされます。
インストール場所を変更する場合は後述する設定ファイルで指定します。

### バージョンを指定する場合
```Bash:
$ bower install jquery#1.9.0
bower cloning git://github.com/components/jquery.git
bower cached git://github.com/components/jquery.git
bower fetching jquery
bower checking out jquery#1.9.0
bower copying /Users/grapswiz/.bower/cache/jquery/cf68c4c4e7507c8d20fee7b5f26709d9
bower installing jquery#1.9.0
```
そのライブラリにどんなバージョンがあるかは

```Bash:
$ bower info ライブラリ名
```
で確認できます。

## 設定ファイルから入れる
後述するcomponent.jsonのdependenciesに指定したライブラリを

```Bash:
$ bower install
```

でインストールできます。

## どんなライブラリがbowerにはあるの？
http://sindresorhus.com/bower-components/ を参照。
検索は、

```Bash:
$ bower search ほげほげ
```
でできます。

## 設定ファイルを書く
bowerの設定は2つのファイルで行います。.bowerrcとcomponent.jsonです。

### .bowerrc
```javascript:
{
  "directory" : "components",
  "json"      : "component.json",
  "endpoint"  : "https://bower.herokuapp.com"
}
```
- directory: ライブラリをインストールする場所の指定
- json: 参照する設定ファイルの名前
- endpoint: 参照するレポジトリの場所。記述しない場合は https://bower.herokuapp.com が指定される。

### component.json
```javascript:
{
  "name": "myProject",
  "version": "1.0.0",
  "dependencies": {
    "jquery": "~1.7.2"
  }
}
```
- name: プロジェクト名
- version: バージョン
- dependencies: 依存しているbowerのパッケージ。

```Bash:
$ bower install
```

でdependenciesに指定したパッケージをインストールできる。

## サンプルプロジェクト
https://github.com/grapswiz/bower-sample
bowerを使ってjqueryを読み込むサンプルをgithubに置きました。

## 参考資料
https://github.com/twitter/bower
http://sindresorhus.com/bower-components/
Sinatra routing with parameters


Sinatraは偉大なので別にregexpで拾わなくてもparameters拾ってくれるし舐めてはいけない。

```ruby
get %r{/data/(ID\d{6})\?type=(.+)} do |id, type|
  @id = id
  @type = type
  haml :coolestpageever
end
```

こんな風に書いて `/data/ID000001?type=xml` とかにアクセスしても無視されて404に飛ばされる。

sinatraは偉大であるのでこんな阿呆なことをする必要はない。?以降のパラメータはわざわざルーティングに書かなくてもparams[:sym]で拾ってくれる。

```ruby
get %r{/data/(ID\d{6})} do |id|
  @id = id
  @type = params[:type]
  haml :coolestpageever
end
```

なんでも残らずregexpで拾わなくてもいいのである。Sinatraは偉大なのだ。
fibers on node.js事始め

fiberを使うと、コールバック地獄からいくらか解放されるかもしれない。

```
npm install fibers
```

とした上で、下記のコードを実行してみる

```javascript
// url_fetch_test.js
var Fiber = require("fibers")
  , http  = require('http');

var main = function() {
  console.log("process start");

  var fiber = Fiber.current;

  http.get("http://www.google.com/index.html", function(res) {
    fiber.run(res);
  });

  var res = Fiber.yield();
  console.log("Got response: " + res.statusCode);
};

Fiber(main).run();

console.log("out of Fiber");
```

```
% node url_fetch_test.js
process start
out of Fiber
Got response: 302
```

http.getをしたタイミングで、nodeのメインスレッドはmain関数から外れてしまい、最後の行のconsole.log("out of Fiber");の行を実行する。
main関数の残りの処理は、Filber.yield()関数から値が返ってきてから再開される。
コールバックそのものは減らせないとしても、書き方次第で可読性を増すことはできるかもしれない。
TypeScriptの型定義ファイル管理ツールtsdを使ってみた

この記事はtsdのバージョン0.3系の仕様に基づいて書かれています。最新の0.5系では[仕様が爆裂変わっています。](https://twitter.com/vvakame/status/434334451821060096)

今回はtsdについて、前回の記事 ( http://qiita.com/items/57a626aece11f9714a9b ) と同様にインストールからパッケージの管理までまとめました。

## インストール

```Bash:
$ npm --version #=> 1.1.66
$ node --version #=> v0.8.15
```

```Bash:
$ npm install -g tsd
```
2013/2/12時点でv0.3.1がインストールされました。

```Bash:
$ tsd

Syntax: tsd [command] [args...]

The following TSD commands are included:

  Command           Description
  ----------------  ---------------------------------------------------------
  -h                Print this help message                                  
  all               Show all file definitions from repository                
  search            Search a file definition on repository                   
  install           Intall file definition. Use install* to map dependencies.
  update            Checks if any definition file needs to be updated        
  ncfg              Create a local config file                               
  info              Get lib information                 
```

## 型定義ファイルをインストールしてみる
```Bash:
$ pwd #=> /Users/grapswiz/tmp
$ tsd install jquery
tsd http GET https://github.com/Diullei/tsd/raw/master/deploy/repository.json
tsd http 200 https://github.com/Diullei/tsd/raw/master/deploy/repository.json
tsd http GET https://github.com/borisyankov/DefinitelyTyped/raw/master/jquery/jquery.d.ts
tsd http 200 https://github.com/borisyankov/DefinitelyTyped/raw/master/jquery/jquery.d.ts
\-- jquery@1.8 -> d.ts/DefinitelyTyped/jquery/
     \-- cc353eab-09b0-4d36-8b61-2826d084d612.key
```

デフォルトではカレントディレクトリのd.ts/DefinitelyTyped/に型定義ファイルがインストールされます。（ここでは/Users/grapswiz/tmp/d.ts/DefinitelyTyped/jquery/jquery.d.ts）

複数のファイルを一度にインストールする場合、tsd installに続いてスペース区切りで指定します。

```Bash:
$ tsd install jquery angular Bootstrap
```

## どんな型定義ファイルがあるの？
http://www.tsdpm.com/ を参照するか、

```Bash:
$ tsd all
```

コマンドで一覧が見れます。特定のファイルを探す場合、

```Bash:
$ tsd search ほげほげ
```

が使えます。ただ、この際大文字小文字を区別するので、例えばbootstrapで探しても見つからないことがあります。

## 設定ファイルを書く
設定はtsd-config.jsonに書きます。このファイルがある位置でtsdコマンドを叩くとと設定が反映された状態で実行できます。

```Bash:
$ tsd ncfg #=> [!] Configuration file created successfully.
```

でテンプレートを作成できます。

```javascript:tsd-config.json
{
	"localPath": "ts-definitions",
	"repositoryType": "1",
	"uri": "https://github.com/Diullei/tsd/raw/master/deploy/repository.json"
}
```
- localPath: 型定義ファイルのインストール先ディレクトリ。
- repositoryType: uriがローカルかURLなのか指定する。0ならローカル、1ならURL。
- uri: リポジトリのある場所。

tsdの作者は[DefinitelyTyped](https://github.com/borisyankov/DefinitelyTyped)の作者でもあるのでDefinitelyTypedにあるd.tsはほとんどtsdで取得できます。

また今のところ（v0.3.1）、設定ファイルからdependencyを読み込んでインストールする（npmに対するpackage.jsonみたいな）ことはできないです。 (=>0.4系で対応されます）
なので僕は、複数パッケージをインストールするスクリプトを書いて対応してます。

```Bash:build.sh
tsd install jquery angular Bootstrap
```

## サンプルプロジェクト
設定ファイルまで含めたサンプルのプロジェクトをgithubに置きました。
https://github.com/grapswiz/tsd-sample

## 参考資料
https://github.com/Diullei/tsd
http://www.tsdpm.com/
https://github.com/borisyankov/DefinitelyTyped
pumaでコントロールサーバを使うときはトークンをつけた方が良いよ

Rubyのウェブアプリケーションサーバに[puma](http://puma.io/)というのがあります。

で、そのpumaには[コントロールサーバ](https://github.com/puma/puma#controlstatus-server)という仕組みがあります。その仕組みを使うと、指定したURLにHTTPリクエストを送るだけでpumaの再起動や停止が行えます。使い方は下記の通り。

```
$ puma -S tmp/puma.state --control unix://tmp/pumactl.sock & # 起動
$ pumactl -S tmp/puma.state restart # 再起動
$ pumactl -S tmp/puma.state stop # 停止
```

で、結論から言うと、まあタイトル通りなのですが、コントロールサーバを使うときは、上記だけでは少しおっかなく、トークン（--control-tokenオプション）も使った方が良いよ、ということです。何故か。下記のケースで少し面倒なことになります。

```
$ puma -S tmp/puma.state --control unix://tmp/pumactl.sock &
$ grep token tmp/puma.state
    :control_auth_token: 87475081db4cf2d91e949f846fbcf69
$ puma -S tmp/puma.state --control unix://tmp/pumactl.sock & # ミスでもう一度起動してしまった
/home/takkkun/example/vendor/bundle/ruby/1.9.1/gems/puma-1.6.3/lib/puma/server.rb:117:in `initialize': Address already in use - bind(2) (Errno::EADDRINUSE)
...
$ grep token tmp/puma.state
    :control_auth_token: d327cd9e14391fcee9a9ddc9f749af1
$ pumactl -S tmp/puma.state stop
Unauthorized access to server (wrong auth token)
```

とまあ起動が失敗したにも関わらず、pumaサーバの状態を保持する.stateファイル（中身はただのYAML）に記載されたトークンの値が上書きされてしまい、pumactlのときにトークンが違うよと言われてしまいます。

--control-tokenオプションでトークンを指定しない場合、トークンはランダムで生成されたものが使われます。ランダムになってしまうのがイヤなので、トークンは自身で設定した方が良いよ、というお話でした。
MySQLの複数行INSERTをする

MySQLのbulk insertを手で書くのはまぁまぁめんどくさいなー、と思ったので何かライブラリないかなと思いつつ、[bulky](https://github.com/yuya-takeyama/bulky)というやつを見つけたりしたのですが、ちょっとコネクション周りのハンドリングとかクエリの実行周りは自前で扱いたい、という事情があったりして、bulk insert用のSQLの生成に特化した[SQL_Insert_Multi](https://github.com/walf443/php-sql-maker-insert_multi)を作ってみました。

こんな感じで使えます。

```php:
$builder = new SQL_Maker_InsertMulti("your_table", array('fields' => array(
    'id' => \PDO::PARAM_INT,
    'name' => \PDO::PARAM_STR,
    'created_at' => \PDO::PARAM_STR,
)));
foreach ( $data as $row ) {
    $builder->bindRow(array(
        'id'            => $row['id'],
        'name'          => $row['name'],
        'created_at'    => $row['created_at'],
    );
}
$stmt = $pdo->prepare($builer->toQuery());
$builer->bindValues($stmt);
$stmt->execute();
```

toQueryしたときに呼びだし元のSQLコメントを生成したりしてくれます(オフにすることもできます)。
byte列をstructにする

```csharp:構造体
[StructLayout( LayoutKind.Sequential, Pack = 1 )]
public struct Hoge
{
	/// <summary>	  6:コード</summary>
	[MarshalAs( UnmanagedType.ByValArray, SizeConst = 6 )]
	public byte[]	Code;
}

```

```csharp:変換関数
static public object ToStr( byte[] byteData, Type type )
{
	GCHandle gch = GCHandle.Alloc( byteData, GCHandleType.Pinned );
	object result = Marshal.PtrToStructure( gch.AddrOfPinnedObject(), type );
	gch.Free();
	return result;
}
```

```csharp:使い方
Hoge dataL = (Hoge)ToStr( byData, typeof( Hoge ) );
```
Google App EngineのプロジェクトをIntelliJ IDEAにインポートしたときの注意点

基本はプラグインを入れていればGoogle App Engine（以下GAE）のプロジェクトをそのままインポートするだけで大丈夫ですが、
少し落とし穴があります。
EclipseのGAEプラグインでプロジェクトを新規作成したときにできるサンプルプログラムは

Google Web Toolkit（以下GWT）を使っているんですが、
単純にそのままIntelliへ移行するとこのGWTを使っているプログラムが原因で
コンパイルが通りません。

IntelliJはGWTを標準でサポートしていますのでSDKにパスを通すだけです。

SDKをダウンロードしていない場合はGoogle Developersから[ダウンロード](https://developers.google.com/web-toolkit/download?hl=ja)

対象となるGAEのプロジェクトのProject Structureを開き、
Facetsで+ボタンを押してGWTを追加。
DefaultsタブでSDKのディレクトリを指定。
これでコンパイルが通るようになります。

Eclepseのプロジェクトをそのままインポートすると
Project StructureのModules＞Dependenciesタブで
GWT関連の設定がエラーになりますが、
これはEclipseのプラグインが自身のライブラリを参照しているためで、
GWTのSDKにパスを通せば不要になりますので削除してください。

[IntelliJ IDEAのHelpページ](http://www.jetbrains.com/idea/webhelp/enabling-gwt-support.html)