OmniAICreator/Qiita-1.07M huggingface dataset:
debugger gemをインストールできないときの対処


debugger gemをインストールしようとしたら、こんなエラーメッセージが出てしまいました。

```
$ gem install debugger -v '1.6.1'
ERROR:  Error installing debugger:
	ERROR: Failed to build gem native extension.

        /Users/myname/.rbenv/versions/1.9.3-p545/bin/ruby extconf.rb --ruby=/Users/myname/.rbenv/versions/1.9.3-p545/bin/ruby --with-ruby-include=~/.rbenv/versions/1.9.3-p545/include
checking for rb_method_entry_t.called_id in method.h... no
checking for rb_control_frame_t.method_id in method.h... no
checking for rb_method_entry_t.called_id in method.h... no
checking for rb_control_frame_t.method_id in method.h... no
Makefile creation failed
**************************************************************************
No source for ruby-1.9.3-p545 provided with debugger-ruby_core_source gem.
**************************************************************************
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/Users/myname/.rbenv/versions/1.9.3-p545/bin/ruby
	--with-ruby-dir
	--without-ruby-dir
	--with-ruby-include=${ruby-dir}/include
	--with-ruby-lib
	--without-ruby-lib=${ruby-dir}/lib


Gem files will remain installed in /Users/myname/.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/debugger-1.6.1 for inspection.
Results logged to /Users/myname/.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/debugger-1.6.1/ext/ruby_debug/gem_make.out

```


# 原因
debuggerと依存関係のあるdebugger-ruby_core_sourceがサポートしているrubyバージョンよりも、インストール済のrubyバージョンのほうが新しい、というのが原因でした。

# 対処

対処方法は以下のうちどちらかをすればOKです。

* インストール対象のdebugger gemのバージョンを新しくする。
  * 上記の例では `-v '1.6.1'` を指定していましたが、何も指定しなければ、通常は最新バージョンがインストールされるはず。
  * Bundlerでインストールする時は、`bundle update`しておく。
* rubyのバージョンを古くする。
  * 上記の例ではrubyのバージョンが`1.9.3-p545`でしたが、試しに`1.9.3-p0`を使うようにしたらインストールできました。
和田卓人さん講演会「この先生きのこるために」メモ張り付け

#和田卓人さん講演会「この先生きのこるために」メモ張り付け
##第一部 講演

###t_wada3つの時代


read時代
　コンピュータと出会う
　無限１アップ　目の前でやってみせるのが人を一番動かせる
　OO厨　構造ばかり考える　完璧主義の呪い
　まさーるさん　自動テスト　JUnit
　　写経：プログラムを移しながら読む
　　技術書の「写経」の方法。　ググるとツイッターでる
　ひたすら読む
-------2004/7/1-------
write時代
　チームかくたに
　アジャイルプロセス
　理想のコーチをRPG
　　ペアプログラミング
　　テストのない　ありえない
-------2005/4/25-------
talk時代

動画で解説］和田卓人の“テスト駆動開発”講座
http://gihyo.jp/dev/serial/01/tdd/

-------2008/2/14-------
渦を作る時期
　登壇
　　ライブコーディング
　　やってみせるに帰ってきた
　　java-jaと遭遇
　Twitter　一番大きい
　ペアプログラミングは楽しい
　TDDBC 東京　テスト駆動開発の１日体験　ブートキャンプ
----------未来-----------
一生開発者
　1. 身の回りをプログラミングの対象にする
　　手段の目的化
　　　プログラマの三大美徳：怠惰傲慢短気
　　　プレーンテキストを好む　markdown形式　原文はスクレイピング
　　　すべてのバージョン管理　git利用
　　　すべて自動化　harokuにpush
　　　変化を抱擁
　　書籍の編集を自動化してみたかった
　2. 年下から学ぶ
　　→年下から学べるか否か
　3. 過去から未来を知る
　　技術は振り子
　　→技術が螺旋　なぜなら我々は成長している
　　　振り子だと思って戻ってきたとき「それはもう知ってる」では差分を見逃す
　　　「なぜ似たものが戻ってきたのか」を考えなければならない
　4. 人と流れを見る
　　組織から個人へ
　　　例、オープンソースの開発が組織から個人へ
　　　githubによって重心があっという間に変わった
　　　便利なものに集まる→集合化していく
　　　　個が多く集まると何かが起こる
　　　偉い人標準作る→実装がなくなる
　　　　実装→標準が出来る
　　　　評価によって磨かれて標準が出来ていく
　自分の得意分野を作る
　　セルフブランディング　≠実力を虚飾する事
　　　＝実力を価値ある状態にする事
　学ぶ事を学ぶ
　　技術の学び方を学ぶ
　　手を動かす
　　技術者と英語
　　好きこそものの上手なれ
　　毎年必ず新しい言語を学ぶ
なぜTDDにこだわるか
　ひとりから始められる
　テストやTDDはスキルである
　　才能ではなく習得可能
　　量は質に転化する
　　写経　　　　　　　テスト駆動開発入門　Clean Code　　リファクタリング プログラミング 駆動開発sfsdsっf　２冊絶版

定番書を買って手を動かす

##第二部　ディスカッション

テスト書くのがだるい
　誰にでもかけといっている訳ではない
　不安に対して書くもの
　　または後から入ってくる人の為に

テストとドキュメントの違い
　動くか動かないかがまず決定的な違い
　意図はコメントに書く以外に手段が無い→ドキュメントにする

オープンソース　すばらしいプロジェクト
　多くが使うフレームワークはドキュメントが増えていく
　コードが増えてくるとドキュメントでも説明しなければならない
　テストコードとのバランスが重要

コード化はドキュメントを生成
　ドキュしジェンでいいのが無いんじゃないのか説
　リファレンスしか役に立たないのはよくある
　設計の視点には向いていない

何がそれを分ける？
　生き残れる人の話か？　よく聞こえん
　環境
　　技術者として一生いけるキャリアパスが整ってない　日本では
　　管理職→復帰する能力が退化→フェードアウト
　　好転はしてきてる
　　社会人としての人生よりも開発者としての人生の方が長い

銀の弾丸は出ない
　それさえあればうまくいくなんて事は無い
　対象は常に変わる　狼男限定の弱点は通用しない
　絶対的なものは出ない
　TDDが銀の弾丸といった事は無い
ビジュアルプログラミング
　プログラミングだと思わずに興味を持ってもらうにはいい
　入り口に入らないと始まらない
　びじゅ詳しくないがjavascriptは分かりやすい結果が見やすい点が大きい
コンピュータサイエンス
　理論
　エッセイを読む　技術は理屈だけで生き残る訳でもない
　diffの実装読むとおもろい
　システム開発の会社はそれほど潰れなかった？
　技術者の転職事情
　　やりたい事が出来るか一択
　　誰とやりたい
いいテストとは
　バグを見つける　一般
　いいテストコードとは
　　読みやすいテストコード
　　何をやっていることか分かる
　　なにysってルカ分からんけど　動いてるからおっけ　だめ
　　ピントがしぼれてる
　　１個の事は１個の事をテストが理想　何やってるかはっきり分かる
　　asert一個縛りするといい
　　良いテストは繰り返し可能
　　　途中で止めて書き換えてまた動かし始めるとかだめ
　　　自動化
　　独立している
　　　ABCなら動くけどACBなら動かないとかよくある
　　　順番に依存しない方が優れている
パラダイムの違う言語を学ぶのがおすすめ
　risp
　githubの言語利用状況
　仕事につなげるとかではない
ie6
 再現性がない
 時々動かない
 再現しないと言い切れる
 オープンでないと困る
 １週間手強い
食い扶持としてと本能として　両立できるか？
　意思との食い違いが生まれたら
　　プライベートをエゴで満たす
　言語と会社の関係が鮮明になってきてる
電子書籍
　技術書有利
　読んだ事のある本を検索に向いてる
　読んだ事の無い本をじっくり読むのには向いてる
　初見の本をざっと読むのには向かない
　検索される事が前提の本（リファレンスとか前から読む事が前提になってない）
　O'Reillyは必ず電子書籍を出してくれる
UIのTDD
　UIとTDDは相性が悪い
　フラジャイルなテスト
　　項目が一個増えたら落ちるテストとか
画面上に表示されている範囲内のマーカーだけ表示する

よく使うわりに忘れるのでメモ

画面上に表示されている範囲内のマーカーだけ表示する。
範囲外のマーカーは非表示にする。

```js
// map		 -> google Maps obj
// markers	 -> marker Array


google.maps.event.addListener(mapObj, 'idle', function(){
	markers.forEach(function(mk){
		if(map.getBounds().contains(mk.getPosition())){
			mk.setVisible(true);
		}else{
			mk.setVisible(false);
		}
	});
});  
```
OS XでMemcachedインストール

```shell-session
% brew install libevent
% brew install memcached
```

サービスの登録のために /Library/LaunchDaemons/homebrew.memcached.plist というファイルを作る

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Label</key>
        <string>memcached</string>
		<key>ProgramArguments</key>
        <array>
                <string>/usr/local/bin/memcached</string>
                <string>-d</string>
		<string>-u</string>
                <string>takaaki</string>
                <string>-m</string>
                <string>64</string>
       </array>
</dict>
</plist>
```

サービスの登録と起動

```shell-session
% sudo launchctl load /Library/LaunchDaemons/homebrew.memcached.plist
% sudo launchctl start memcached
```
[MacOSX] Mac(Mavericks)のFinderで不可視ファイルを表示させる方法・非表示にする方法

# 表示

## ターミナル起動
```
アプリケーション＞ユーティリティ＞ターミナル.app
```

## 次のコマンドを入力します

```shell-session
$ defaults write com.apple.finder AppleShowAllFiles true
$ killall Finder
```

![Screen Shot 2014-05-01 at 14.18.33.png](https://qiita-image-store.s3.amazonaws.com/0/18705/2dc9b3d5-cf49-5fbf-a46b-2552c4b55cff.png)


↑見えた！

表示終わり


# 非表示

## ターミナル起動

同上

## 次のコマンドを入力します（↑とほぼ一緒）

```shell-session
$ defaults write com.apple.finder AppleShowAllFiles false
$ killall Finder
```

![Screen Shot 2014-05-01 at 14.21.30.png](https://qiita-image-store.s3.amazonaws.com/0/18705/543e785a-47cd-0dac-3e14-8cb0c001d50a.png)

↑見えなくなった！！

終わり。
NSStringリテラルのあれやこれ

##NSStringリテラルのあれやこれ

NSStringリテラルってのは

```objc
NSString *string = @"hoge";
```
これのことです。
これについてのアレな機能とバグのご紹介。

アレな機能とは、C言語の文字列のように、文字列連結ができること。
つまりこう書けます。

```objc
NSString *string = @"hoge" @"huga";
```
これは、こう書くのと同じです。

```objc
NSString *string = @"hogehuga";
```

なにが便利なのか。
ついこの間JavaScriptCoreでJavaScript書きました。こんな感じ。

```objc
NSString *script =
@"var iframe = document.getElementById('game_frame');"
@"var validIframe = 0;"
@"if(iframe) {"
@"    validIframe = 1;"
@"    var rect = iframe.getBoundingClientRect();"
@"    var atop = rect.top;"
@"    var aleft = rect.left;"
@"}";
```
便利。（内容は気にしないでね）

####ちょっとしたバグ。
NSStringリテラルの連結はNSStringリテラルを空白文字区切りで並べて書きます。
が、なぜかこれでもエラーが出ずに連結できます。

```objc
NSString *string = @"hoge" "huga";
```
hugaの方はNSStringリテラルではなくC言語の文字列です。

```objc
NSString *string = @"hoge" "huga" @"foo" "bar" "hoge";
```
でも連結できます。
最初の文字列がNSStringリテラルなら後ろの並びには関係なく連結可能です。


***

追記：
バグを紹介したのはコンパイラのバージョンアップでいきなりコンパイル不能になる時限爆弾を仕込んでしまわないための注意喚起です。
このバグで遊んでみよう！とかではありません。
IIS で PHP の ob_* 関数が効かない場合の対処法

[Microsoft Azure WebサイトにおけるEC-CUBEの最適化](http://gihyo.jp/design/serial/01/azure_eccube/0005) でも取り上げた内容ですが、 IIS では FastCGI を実行する場合、標準で出力バッファリングが有効になっています。

> ResponseBufferLimit - FastCGI プロセスによって処理されたデータは、応答としてクライアントに返されるまでバッファーに格納されます。このプロパティでは、このアプリケーションへの要求をバッファーに格納する応答データの量をバイト単位で指定します。バッファーがいっぱいになるか、応答が完了するかのどちらかが最初に起こったとき、このバッファーはクライアントにフラッシュされます。

> [IIS 6 用 FastCGI 拡張機能の構成](http://technet.microsoft.com/ja-jp/library/ff454029.aspx)

このため、PHP側で ob_flush() などをコールして出力をフラッシュしたり、 ob_end_clean() などで出力バッファリングを無効にしてもIIS側でのバッファリングがフラッシュされません。

[flush() 関数のコメント](http://www.php.net/manual/ja/function.flush.php#113360) にも記載されていますが、 IIS 側の設定で出力バッファリングを無効にしてやる必要があります。

以下のように web.config に記載し responseBufferLimit=0 をハンドラーマッピングに設定します。
Windows Azure Websites での設定例です。 ローカルマシンの場合は scriptProcessor のパスなどを適宜修正してください。

```xml
<configuration>
  <system.webServer>
    .....
    <handlers>
     <remove name="PHP53_via_FastCGI" />
     <add name="PHP53_via_FastCGI" path="*.php" verb="GET,HEAD,POST" modules="FastCgiModule" scriptProcessor="D:\Program Files (x86)\PHP\v5.3\php-cgi.exe" resourceType="Either" requireAccess="Script" responseBufferLimit="0"/>
    </handlers>
  </system.webServer>
</configuration>
```
BSDでumount時「device is busy」したときに誰がアクセスしているか調べるために

BSDでumountしようとしたとき、`umount: /mnt Device busy`と言われることがあります。
そのときにどのプロセスが該当マウントポイントにアクセスしているかを調べるにはfstatを使えば良いです。

`# fstat /mnt
USER     CMD        PID ... (以下略)
root     fstat     1182 ... (以下略)
root     csh        628 ... (以下略)`

fstat自身以外にアクセスしている人が分かるので、killするなどの対処をすれば良くなります。
iOSの画面回転について

意外なところでハマったんですけど、iOSの指南書で大体はiOS5.0あたりのものが多いのでしょうか。
画面回転における制御がiOS6.0以降に変わっている事に気づかないのですよ…。
あと、DeviceOrientationで制御してるつもりでも上手くいかなかったり…。
というわけで、以下は前後比較。

```objc:iOS6.0より前
//画面回転に関する制御
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;    //全方位回転

//    if(interfaceOrientation == UIInterfaceOrientationPortrait){
//        // 通常
//        return YES;
//    }else if(interfaceOrientation == UIInterfaceOrientationLandscapeLeft){
//        // 左に倒した状態
//        return YES;
//    }else if(interfaceOrientation == UIInterfaceOrientationLandscapeRight){
//        // 右に倒した状態
//        return YES;
//    }else if(interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown){
//        // 逆さまの状態
//        return NO;
//    }

}
```

```objc:iOS6.0以降
//回転処理が存在し、可能かどうか
- (BOOL)shouldAutorotate;
{
	return YES;                                           //回転許可
}

//回転する方向の指定
- (NSUInteger)supportedInterfaceOrientations;
{
//全方位回転
    return UIInterfaceOrientationMaskAll;
////Portrait(HomeButtonが下)のみ
//      return UIInterfaceOrientationMaskPortrait;
////LandscapeLeft(HomeButtonが右)のみ
//      return UIInterfaceOrientationMaskLandscapeLeft;
////LandscapeRight(HomeButtonが左)のみ
//      return UIInterfaceOrientationMaskLandscapeRight;
////PortraitUpsideDown(HomeButtonが上)のみ
//      return UIInterfaceOrientationMaskPortraitUpsideDown;
////UpsideDown(HomeButtonが上)以外回転
//  return UIInterfaceOrientationMaskAllButUpsideDown;
////横のみ回転
//      return UIInterfaceOrientationMaskLandscape;
}
```
JavaScriptで配列を値渡しをする


JavaScirptでは、オブジェクトや配列は参照渡し。
※厳密には参照渡しでもないっぽい？

jQueryを使って配列をコピーすれば、値渡しになる。

```
hoge = ["bar", "fuga"];
hoge2 = $.extend(true, [], hoge);
```

### 追記
jQueryを使わなくもコピーできます。

```
var hoge = ['bar', 'fuga'];
var hoge2 = hoge.slice();
```
Android+mockitoが動かなかった

Android で mockito を使う場合は、mockito と dexmaker の jar を libs フォルダに入れるだけで良いのですが、それだけだとどうも DI に失敗するパターンがあるようです。詳細までは追えていませんが、下記のパターンそれぞれに対処が必要でした（私の場合は両者の同時対処が必要でした…）

# パターン１

```
Caused by: java.lang.VerifyError: org/mockito/cglib/core/ReflectUtils
at org.mockito.cglib.core.KeyFactory$Generator.generateClass(KeyFactory.java:167)
at org.mockito.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at org.mockito.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:217)
at org.mockito.cglib.core.KeyFactory$Generator.create(KeyFactory.java:145)
at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:117)
at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:109)
at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:105)
at org.mockito.cglib.proxy.Enhancer.<clinit>(Enhancer.java:70)
```

## 対処

```java:HogeTest.java
@Override
protected void setUp() throws Exception {
    super.setUp();
    Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
}
```

元ネタ -> http://www.jjask.com/243076/verifyerror-using-mockito-1-9-5-and-dexmaker-mockito-1-0

# パターン２

```
java.lang.IllegalArgumentException: dexcache == null (and no default could be found; consider setting the 'dexmaker.dexcache' system property)
at com.google.dexmaker.DexMaker.generateAndLoad(DexMaker.java:359)
at com.google.dexmaker.stock.ProxyBuilder.buildProxyClass(ProxyBuilder.java:252)
at com.google.dexmaker.mockito.DexmakerMockMaker.createMock(DexmakerMockMaker.java:54)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:26)
```

## 対処

```java:HogeTest.java
@Override
protected void setUp() throws Exception {
    super.setUp();
    System.setProperty(
        "dexmaker.dexcache",
        getInstrumentation().getTargetContext().getCacheDir().getPath());
        // Instrumentation が取れないときは以下
        // getContext().getCacheDir().getPath());
```

元ネタ -> http://stackoverflow.com/questions/12267572/mockito-dexmaker-on-android
Railsでメタプロ的にクラスマクロを作成する


別にRailsではなくても純粋なRubyでも基本的には同じ。

```
module Fuga
  def self.included base
    base.extend ClassMethods
  end
 
  module ClassMethods
    def hello
      puts 'Hello!'
    end
  end
end
```

`Fuga`moduleがインクルードされた時に`ClassMethods`で定義さていているメソッドが使えるようになる。

下記のようにすれば、インスタンスメソッドも追加出来ます。

```
module Fuga
  def self.included base
    base.extend ClassMethods
  end
 
  module ClassMethods
    def hello
      puts 'Hello!'
    end
  end

  #以下追加
  def bar
   puts "bar"
  end
end
```

この`Fuga`moduleを任意のClassにincludeすれば、`hello`がクラスマクロとして使用できるようになります。

```
class Bar
  include Fuga
  hello
end
```

これはextendを使って書き換えることができます。

```
module Fuga
  def hello
    puts 'Hello!'
  end
end

class Bar
  extend Fuga
  hello
end
```

`extend`で呼ぶ出すとクラスメソッドとして定義されます。

`ActiveSupport::Concern`をextendしてくると、`def self.included end`の部分を省略できます。

```
module Fuga
  extend ActiveSupport::Concern
 
  module ClassMethods
    def hello
      puts 'Hello!'
    end
  end
end
```

これで任意のクラスで`Fuga`をincludeすれば、`hello`がクラスマクロとして使えるようになります。

ここからがRailsの話し。

```
module AddDeleted
  extend ActiveSupport::Concern
 
  module ClassMethods
    def add_deleted
      attr_accessor: :deleted
    end
  end
end

class ActiveRecord::Base
  include AddDeleted
end

class Book < ActiveRecord::Base
 add_deleted
end
```

上記のように、`AddDelated`moduleを作成して、`ActiveRecord::Base`を再オープンして`AddDelated`をincludeすると`ActiveRecord::Base`を継承するクラスで`add_deleted`が使えるようになります。

`add_deleted`が呼ばれたクラスでは、`attr_accessor`に`deleted`が追加されます。

### 参考
* [ActiveSupport::Concern でハッピーなモジュールライフを送る](http://www.techscore.com/blog/2013/03/22/activesupportconcern-%E3%81%A7%E3%83%8F%E3%83%83%E3%83%94%E3%83%BC%E3%81%AA%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%83%A9%E3%82%A4%E3%83%95%E3%82%92%E9%80%81%E3%82%8B/)
* [Rubyでクラスマクロを書くまとめ](http://o.inchiki.jp/obbr/121)
Androidアプリでよく使われているライブラリを調べる方法

AppBrainがGooglePlayに登録されているアプリのライブラリ使用状況を集計しています。
[AppBrain stats](http://www.appbrain.com/stats/libraries/dev)
![スクリーンショット 2014-05-01 12.28.22trim1.png](https://qiita-image-store.s3.amazonaws.com/0/42140/0c6762d8-b574-d2fe-8b49-38c05da04584.png)


　各ライブラリやフレームワークの

* 全アプリに占める割合(青)
* 全インストール数に占める割合(オレンジ)
* （アイコンのリンク先で）詳細や利用アプリのトップテン

を確認できます。

## スクリーンショット
![スクリーンショット 2014-05-01 12.28.22trim2.png](https://qiita-image-store.s3.amazonaws.com/0/42140/9c477b6a-2b61-7f62-e6b2-a46f41ac82fa.png)
※ 2014/5/1現在

## 広告SDK
タブの切替で広告SDKやソーシャルSDKのシェアもわかります。
![スクリーンショット 2014-05-01 12.52.15.png](https://qiita-image-store.s3.amazonaws.com/0/42140/9a2aa13d-e2a0-15b7-04f1-c11edb66c79e.png)
広告SDKは「admob」が強い。
国内企業だと「nend」や「Adlantis」が下位の方に…。

## ソーシャルSDK
![スクリーンショット 2014-05-01 12.52.31.png](https://qiita-image-store.s3.amazonaws.com/0/42140/f634b091-ab96-bc84-b0ae-5554d2b86bba.png)
ソーシャル系はfacebookのSDKがダントツですね。
４位に「Twitter4j」があります。
他に上位を占めているのはゲームにランキングやマッチングを搭載する系のSDKですね。
このへんは国内ゲームで使われているSDKとは結構様相違うかな。


# 活用法など
　使用するライブラリの選定で迷ったらここを参考にシェアの高いものを優先にしてみてはどうでしょうか。
　また、いままで知らなかった（がよく使われている）ライブラリを知ることも出来ます。
※ モバイルアプリ用トラッキングライブラリ「Flurry Analytics」はこれで初めて知りました。→参考：[モバイルアプリのユーザー行動解析サービスのFlurry Analyticsについて調べてみた](http://qiita.com/p_chin/items/34ea38c41d7fb220883a)
　C2DMは想像以上に活用されていて驚きました。

　私見ですが、アプリ数のグラフよりインストール数のグラフの割合が高いライブラリは、（１アプリあたりのインストール数の多い）人気のアプリでよく使われているライブラリと考えることも出来るかもしれません。（なんとなくですが）
　そういったライブラリを活用していくとイケてるアプリを作れるかも？

　「Google Play In-app Billing」のパーセンテージからアプリ内課金を実装しているアプリの割合もわかりますね。
　

# ゲーム系ライブラリのシェア

個人的にはlibGDXを推しているのでこちらも気になります。
![スクリーンショット 2014-05-01 12.30.05trim2.png](https://qiita-image-store.s3.amazonaws.com/0/42140/7c23146c-2fab-f73a-a63e-c6b246f61350.png)

　現時点ではlibGDXのほうがCocos2D-Xより若干シェアが高いでしょうか(アプリ数の1.42%、インストール数の3.52%)。だいたい横並びです。
　日本ではあまり馴染みないですが世界的にはメジャーなライブラリです。

　Unity3Dはこの２つを合わせたくらいのシェアですね。
![スクリーンショット 2014-05-01 12.30.05trim1.png](https://qiita-image-store.s3.amazonaws.com/0/42140/3d8badda-5c53-582e-6c64-ba42c599a10d.png)
　強い。
node-webkit をインストールして、サンプルアプリを動かすまで


OSX に node-webkit をインストールして使ってみたのでメモ。

## インストール

[公式サイト](https://github.com/rogerwang/node-webkit#downloads)から、パッケージをダウンロード。

2014/05/01 だと v0.9.2 が最新。

展開して、node-webkit.app を`/Application`にコピー。

## Hello World

手始めに Hello World を書いて、動かす。ファイルの内容は、[Quick Start](https://github.com/rogerwang/node-webkit#quick-start)のまま。

```bash
$ mkdir hello-nw
$ cd hello-nw

$ vim index.html
<!DOCTYPE html>
<html>
  <head>
    <title>Hello World!!!!</title>
  </head>
  <body>
    <h1>Hello World!</h1>
    We are using node.js <script>document.write(process.version)</script>.
  </body>
</html>

$ vim package.json
{
  "name": "nw-demo",
  "main": "index.html"
}
```

ただ動かすだけなら、zip でパッケージにする必要が無い。

[How to run apps](https://github.com/rogerwang/node-webkit/wiki/How-to-run-apps)を参考に実行してみる。

```bash
$ /Applications/node-webkit.app/Contents/MacOS/node-webkit .
```

こんにちは！

![Hello World!.jpg](https://qiita-image-store.s3.amazonaws.com/0/12272/0e35a399-b3a8-85e8-dbc3-ed5f067a8760.jpeg "Hello World!.jpg")

## サンプルアプリを動かす

node-webkit を使ったサンプルアプリが下記で公開されているので、これを動かしてみる。

https://github.com/zcbenz/nw-sample-apps

まずは git clone する。このリポジトリには、6 つのサンプルアプリが含まれていて、それぞれディレクトリが分かれている。

```bash
$ git clone https://github.com/zcbenz/nw-sample-apps
$ cd nw-sample-apps
$ tree -L 1
.
├── README.md
├── file-explorer
├── frameless-window
├── menus
├── mini-code-edit
├── mp3-encoder
└── webgl
```

あとは起動したいアプリのディレクトリを指定して、node-webkit を起動するだけ。

```bash
$ /Applications/node-webkit.app/Contents/MacOS/node-webkit file-exploer
```

ファイルエクスプローラーが起動。動きがおかしいけど、ディレクトリ移動とかはできる。

![File Explorer.jpg](https://qiita-image-store.s3.amazonaws.com/0/12272/1f926798-3944-f3d3-e685-db3e1308d6a6.jpeg "File Explorer.jpg")

## まとめ

Web の技術を使って、Win / Mac 両対応の GUI アプリが書けるのでこれは良さそう。
Rの中で環境を使い分ける

　RStudioでガリガリプログラミングしてると自作の関数やオブジェクトが増えすぎて、せっかくEnvironmentウィンドウがあるのに見通しが非常に悪くなることが有ります。
　一時変数を環境に残したくない、といった場合は無名関数内で処理してみます。

```r:sample1.R
(function(){
    a <- 1:3
    b <- 4:6
    ans <<- a*b
})()
cat(ans)
# 4 10 18
ls()
# "ans"
```

　オブジェクトは作成したいけど、`.GlobalEnv`に表示させたくない場合。

```r:sample2.R
myEnv <- new.env()
assign("myFunc",
       function(x){
           x^2 + 2*x + 2
       },
       myEnv)
attach(myEnv)
rm(myEnv)
ls()
# character(0)
myFunc(1:5)
# [1]  5 10 17 26 37
find("myFunc")
# [1] "myEnv"
```

　オブジェクトの環境を独立させたいけど、パッケージ化するほどではないといった場合におすすめ。
$_GETで取ってきた値について

php初心者なので、試行錯誤するなかで知ったことなのですが、、、

```
$_GET
```

```
$_POST
```

で取得する値は、それ自体が関数で取得したあたいなので、一度なにか自分で変数を定義して、そこに格納して初めて使うことができるわけですね。
Cakeやっていて、

```
$this->redirect("./(dir)/?(name) = $_GET[~]);
```

っていうことやろうとして、全然アクセスされないのでなぜだろうと考えていたら、
```
$ ~ = $_GET[];
```

で変数に格納して、その後にredirectに繋げたらうまくいきました。

$_GETや$_POSTでどうデータを取得して、いつまで保持するのかという点は難しいです…

参考
http://www.phpbook.jp/appli/form/index2.html
でも概要だけで実際使うときはどう使うのか悩むこと多いです。
Rubyの情報源

# チュートリアル

## tryruby
http://tryruby.org/levels/1/challenges/0

## rubymonk
https://rubymonk.com/

## codeschool
https://www.codeschool.com/courses/try-ruby

## codecademy
http://www.codecademy.com/ja/tracks/ruby/

## Ruby入門
http://www.lab.ime.cmc.osaka-u.ac.jp/~kiyo/pub/lecture/unixpro/ruby/

# 読み物
## Why's (Poignant) Guide to Ruby 
http://www.aoky.net/articles/why_poignant_guide_to_ruby/

## どうしてそんなに Love Ruby ？
http://i.loveruby.net/ja/ruby/why.html

# 動画
## ドットインストール
http://dotinstall.com/lessons/basic_ruby_v2
http://dotinstall.com/lessons/basic_rails_v2

# 書籍
## たのしいRuby
http://www.notwork.org/tanoshiiruby4/

## Rubyレシピブック
http://www.notwork.org/rubyrecipebook3/

## RailsによるアジャイルWebアプリケーション開発
http://shop.ohmsha.co.jp/shopdetail/000000001910/02-06-B2-08/page1/order/
Postgres で group by + array_to_stringをする。


以下のtableを

| ID | NAME | 
|---|---|
|1|AAA|
|1|BBB|
|2|CCC|
|2|DDD|
|2|AAA|
|3|EEE|

以下のようにするには。

| ID | NAME | 
|---|---|
|1|AAA,BBB,CCC |
|2|CCC,DDD,AAA|
|3|EEE|



``` sql
SELECT ID, string_agg(NAME, ',')
FROM table
GROUP BY ID;
```


* Postgresのバージョンは9.0
Mavericks にしたらターミナルが開かなくなった件


MavericksにしたらHomebrewで入れてた/usr/local/binのコマンドがバッサリなくなってた。
そのためターミナルも起動しなくなったので以下のように対処。

## ログインシェルを変更

[システム環境設定]-[ユーザとグループ]を開き、該当アカウントを右クリック[詳細オプション]を開く。

![スクリーンショット 2014-05-01 11.11.36.png](https://qiita-image-store.s3.amazonaws.com/0/8219/2ed2690f-dc74-c8dd-6ea8-184114e04284.png "スクリーンショット 2014-05-01 11.11.36.png")

ログインシェルが /usr/local/bin/bash とかになってるのを、/bin/bash とかに変更。

これでターミナルが開ける。
rails better_errors が動作しない場合

# 環境
- rails 4.0.0
- better_errors 1.1.0

# 内容

デフォルトではlocalhost接続のみbetter_errorsが有効になっているようです。

サーバーとクライアントのIPアドレスが異なる場合は、クライアント側のIPを登録すると動作するようになりました。

下記は[charliesome/better_errors](https://github.com/charliesome/better_errors)のREADME.mdからの引用です。

```rb
# config/environments/development.rb
BetterErrors::Middleware.allow_ip! ENV['TRUSTED_IP'] if ENV['TRUSTED_IP']
```
```bash
TRUSTED_IP=66.68.96.220 rails s
```

# 参考
https://github.com/charliesome/better_errors/issues/210
CollectionViewの勉強


githubでやれ案件。kobitoからの投稿テスト、twitterとの連携確認も兼ねて。

[Collection View Programming Guide](URL [https://developer.apple.com/library/mac/documentation/cocoa/Conceptual/CollectionViews/CollectionViews.pdf) の実習メモ。サンプル通りだと思ったとおりの事ができないので、理解を深める意味も兼ねて3種類書いてみた。

 1. サンプル通りの実装
 1. 1を元にして、Interface Builderで定義していた Array Controllerをコードに移動し、bindもコードで書く
 1. さらに2を元にして、Collection Item Viewも Interface Builderから分離、コード上で CollectionViewと関連付ける。
 1. 3にアイテムの選択機能を追加。選択すると色が変わる。

ソース → https://github.com/Nunocky/CollectionViewStudy04


##スクリーンショット
![スクリーンショット 2014-05-01 10.58.09.png](https://qiita-image-store.s3.amazonaws.com/0/3847/5df26722-f163-9683-0640-7a0c0113e2f8.png "スクリーンショット 2014-05-01 10.58.09.png")

## オブジェクトの関連

どのサンプルもInterface Builderでどこまでやるかの違いだけで、使用するオブジェクトやその関連は一緒。サンプル2ではNSArrayControllerを、サンプル3では Collection View Itemを Interface Builderから切り離している。Interface Builder上で行っていたbindや itemPrototypeの関連付けは AppDelegateの applicationDidFinishedLaunchingで行っている。

Collection Viewの selectionIndexes, Collection View Itemの selectedプロパティへのbindはサンプル4のみ使っている。これは選択状態を取得・表示するためのもの。


![CollectionViewStudyMemo.png](https://qiita-image-store.s3.amazonaws.com/0/3847/0e276bec-6721-2bb0-598a-6cc128e5ab80.png "CollectionViewStudyMemo.png")


#課題・TODO
この例ではアイテムの追加・削除・更新はサポートしていない。
interfacesのovs

Ubuntu(debian) の `/etc/network/interfaces` で openvswitch の bridge や port も設定できるらしいことが `/usr/share/doc/openvswitch-switch/README.Debian` に書いてある。

```bash:/etc/network/interfaces
allow-ovs br1
iface br1 inet manual
  ovs_type OVSBridge
  ovs_ports p5p1
```

しかし動かない！何が起こっているのか？

まず allow-ovs というのは、openvswitch の daemon 類が起動した後に `ifup --allow ovs br1` と呼び出してもらうために書いてある。openvswitch の daemon 類が起動するためには、ovsdb が利用可能にならないといけない。つまりファイルシステムが用意できた後でないといけない。というわけで auto でなく allow-ovs となっているのは、起動順をそこまで遅延させるためのようだ。

`ifup --allow ovs br1` を呼ぶのは、openvswitch の起動スクリプトであるはずだった。

ところが Upstart への移行の混乱に紛れて、現在 openvswitch の起動スクリプトは二種類インストールされる。ひとつは `/etc/init/openvswitch-switch.conf` で、もう一つは `/etc/init.d/openvswitch-switch` になっている。後者は有効になっていない（/etc/rc.N から symlink が張られていない）。有効なほうの `/etc/init/openvswitch-switch.conf` を使って openvswitch daemon は起動する。ややこしいことに、`/etc/init.d/openvswitch-switch` は ifup --allow ovs {bridges} を呼び出すが、`/etc/init/openvswitch-switch.conf` ではその部分が抜け落ちている。

つまり ifup --allow ovs br1 は結局呼び出されない。よって動かない！というわけだった。やるやる詐欺状態。

Workaround 1
------------
`/etc/init.d/openvswitch-switch` を使い、`/etc/init/openvswitch-switch.conf` を無効化する。せっかく Upstart に移行したのに…という感を拭えない。

Workaround 2
------------
`/etc/init/openvswitch-switch.conf` を修正する。設定ファイルとマークされていないファイルを書き換えるのが難点。

```diff
--- /etc/init/openvswitch-switch.conf   2014-01-20 21:30:49.000000000 +0900
+++ /tmp/openvswitch-switch.conf        2014-05-01 10:21:39.249793837 +0900
@@ -32,11 +32,13 @@
   fi
   set "$@" $OVS_CTL_OPTS
   "$@"
+  ifup --allow ovs `ifquery --allow ovs --list`
 end script

 post-stop script
   . /usr/share/openvswitch/scripts/ovs-lib
   test -e /etc/default/openvswitch-switch && . /etc/default/openvswitch-switch

+  ifdown --allow ovs `ifquery --allow ovs --list`
   ovs_ctl stop
 end script
```

Workaround 3
------------
`/etc/network/interfaces` に書くのを諦める。`/etc/rc.local` にやりたいことを書く。workaround としては最も筋が良いが、こちらも非 Upstart 的な流儀なのがイマイチ。

Workaround 4
------------
`/etc/network/interfaces` に書くのを諦める。openvswitch 起動時に Upstart のイベントを投げるようにする。

```diff
--- /etc/init/openvswitch-switch.conf   2014-05-01 10:42:27.055806142 +0900
+++ /tmp/openvswitch-switch.conf        2014-05-01 10:41:31.499597240 +0900
@@ -2,6 +2,9 @@
 description "Open vSwitch switch"
 author "James Page <james.page@ubuntu.com"

+emits ovs-up
+emits ovs-pre-down
+
 start on (local-filesystems and net-device-up IFACE=lo)
 stop on runlevel [!2345]

@@ -32,11 +35,13 @@
   fi
   set "$@" $OVS_CTL_OPTS
   "$@"
+  initctl emit ovs-up
 end script

 post-stop script
   . /usr/share/openvswitch/scripts/ovs-lib
   test -e /etc/default/openvswitch-switch && . /etc/default/openvswitch-switch

+  initctl emit ovs-pre-down
   ovs_ctl stop
 end script
```

やりたいことを Upstart 流に書く。最も起動順序を柔軟に制御できる。

```bash:/etc/init/local.conf
description "custom network settings"

start on (ovs-up and net-device-up IFACE=p5p1)

pre-start script
  ovs-vsctl add-br br1
  ovs-vsctl add-port br1 p5p1
end script
```
AndroidのHttpURLConnectionでPOSTするとき


##オンメモリで十分にPOST可能な場合
URLConnectionのOutputStreamはByteArrayOutputStreamが内部で使用されているため、メモリの使用量には注意が必要である。(OutOfMemoryErrorの原因)

内部ではOutputStreamに書き込みが終わったら、そのサイズだけContent-Lengthが設定されてリモートに送信される。


##オンメモリでPOSTするには不十分、かつサイズが分からない場合
HttpURLConnection#setChunkedStreamingMode(int)を使用して、チャンク形式でPOSTする。チャンク形式のContent-Lengthは不要なので、ファイルを圧縮しながら直接URLConnectionのOutputStreamに書き込める。

このモードの場合、書き込むと逐一リモートに送信されるため、メモリの使用量はあまり考慮しなくてもよい。

##チャンクに対応していないプロキシ下でPOSTする場合
HttpURLConnection#setFixedLengthStreamingMode(int)を使用して、Content-Lengthを設定する。事前に送信サイズを知っている必要が有るため、圧縮しながら送信というのは不可能である。

このモードの場合、書き込むと逐一リモートに送信されるため、メモリの使用量はあまり考慮しなくてもよい。設定したサイズと書き込んだサイズが一致しない場合IOExceptionがスローされる。

チャンク形式のPOSTをサポートしていないプロキシが結構あるので、特定のWIFI環境でのみPOSTが出来ない場合は、これを疑うのも1つの手である。
Railsinstallerのインストール方法(Windows編)


1. ダウンロード
1. インストール
1. 初期設定

# ダウンロード
.1 以下のURLにアクセス

http://railsinstaller.org

.2 Railsinstallerをダウンロード

![Railsinstallerをダウンロード](https://qiita-image-store.s3.amazonaws.com/0/5085/90af01b3-bdcc-a0d1-d19c-7fe6c495b100.png)

# インストール
.1 Railsinstallerを実行

![Railsinstallerを実行](https://qiita-image-store.s3.amazonaws.com/0/5085/f44b8ef6-a6d8-0015-4533-23a1caadbfad.png)

.2 [Next]を選択

![Nextを選択](https://qiita-image-store.s3.amazonaws.com/0/5085/fbf0cefd-6ef3-accf-d638-bbefebe342b6.png)

.3 同意して[Next]を選択

![同意してNextを選択](https://qiita-image-store.s3.amazonaws.com/0/5085/b690aade-2c18-dd82-d259-6e3b3acc1ca9.png)

.4 何も変更せずに[Install]を選択

![何も変更せずにInstallを選択](https://qiita-image-store.s3.amazonaws.com/0/5085/c0737568-712d-5901-21e3-6fdff9a3204b.png)

.5 インストール中...

![インストール中](https://qiita-image-store.s3.amazonaws.com/0/5085/8290178f-8e16-ce12-cf38-b805117a6ecd.png)

.6 インストール完了!

![インストール完了](https://qiita-image-store.s3.amazonaws.com/0/5085/831dd802-6296-4c4a-5333-9659d5276350.png)


# 初期設定

.1 名前の入力

![名前の入力](https://qiita-image-store.s3.amazonaws.com/0/5085/f8b12622-c936-4179-5363-783240f2a603.png)

.2 メールアドレスの入力

![メールアドレスの入力](https://qiita-image-store.s3.amazonaws.com/0/5085/462575f9-035e-698d-6918-d4c9f47779b4.png)

.3 初期設定完了

![初期設定完了](https://qiita-image-store.s3.amazonaws.com/0/5085/2bb668a3-10c3-7391-27fe-30b124d54187.png)
FlashのColorMatrixFilterをImageMagickで再現する


FlashにはColorMatrixFilterがあり、4x5の色変換行列でDisplayObjectにフィルタをかけることが出来ます。

ImageMagickにも同様に-color-matrixオプションで行列を指定して、色の置き換えができ、Flashと同じように変換することが出来ます。

#Flashの行列

Flash側の行列は20個の要素の配列で表現され、次のように計算され新しい色が計算されます。

```
destR = (m[ 0] * srcR) + (m[ 1] * srcG) + (m[ 2] * srcB) + (m[ 3] * srcA) + m[ 4];
destG = (m[ 5] * srcR) + (m[ 6] * srcG) + (m[ 7] * srcB) + (m[ 8] * srcA) + m[ 9];
destB = (m[10] * srcR) + (m[11] * srcG) + (m[12] * srcB) + (m[13] * srcA) + m[14];
destA = (m[15] * srcR) + (m[16] * srcG) + (m[17] * srcB) + (m[18] * srcA) + m[19];
```

#Flashの行列をImageMagickに移植する場合

ImageMagickではCYMKAも扱えるように6x6の行列に拡張されていますが、0と1で埋める、オフセットは255で割る、を行えばFlash同様の定義ができます。

<table>
	<tr>
		<td>m[0]</td>
		<td>m[1]</td>
		<td>m[2]</td>
		<td>m[3]</td>
		<td>0</td>
		<td>m[4] / 255</td>
	</tr>
	<tr>
		<td>m[5]</td>
		<td>m[6]</td>
		<td>m[7]</td>
		<td>m[8]</td>
		<td>0</td>
		<td>m[9] / 255</td>
	</tr>
	<tr>
		<td>m[10]</td>
		<td>m[11]</td>
		<td>m[12]</td>
		<td>m[13]</td>
		<td>0</td>
		<td>m[14] / 255</td>
	</tr>
	<tr>
		<td>m[15]</td>
		<td>m[16]</td>
		<td>m[17]</td>
		<td>m[18]</td>
		<td>0</td>
		<td>m[19] / 255</td>
	</tr>
	<tr>
		<td>0</td>
		<td>0</td>
		<td>0</td>
		<td>0</td>
		<td>1</td>
		<td>0</td>
	</tr>
	<tr>
		<td>0</td>
		<td>0</td>
		<td>0</td>
		<td>0</td>
		<td>0</td>
		<td>1</td>
	</tr>
</table>

##例

コントラストを上げる場合、Flashでは以下のようになります。

```
var matrix:Array = [	2, 0, 0, 0, -128	,
						0, 2, 0, 0, -128	,
						0, 0, 2, 0, -128	,
						0, 0, 0, 1, 0		];
image.filters = [new ColorMatrixFilter(matrix)];
```

これをImageMagickで再現するには、Flashの行列を以下のように変換します。

```
2,	0,	0,	0,	0,	-0.502,
0,	2,	0,	0,	0,	-0.502,
0,	0,	2,	0,	0,	-0.502,
0,	0,	0,	1,	0,		 0,
0,	0,	0,	0,	1,		 0,
0,	0,	0,	0,	0,		 1,
```

そして以下のようなコマンドになります。

```
convert src.jpg -color-matrix "2 0 0 0 0 -0.502 0 2 0 0 0 -0.502 0 0 2 0 0 -0.502 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1" out.jpg
```
QCon2014 に参加してきました

[QCon Tokyo 2014](http://www.qcontokyo.com/program.html)

おすそわけのおすそわけで、有料コンファレンスに参加できることになりましたのでメモを公開します。私自身 QConって何？という感じだったので簡単にQConの今までの歴史もまとめました。

# 以下　参加した各セッションの詳細レポートです。
* [Keynote#1 早く進む重要性 Google & eBay](http://qiita.com/kozayupapa/items/0ed516e4b8b6aaa6cd20)　(好循環とは何かの例が豊富です目指せA Player!)
* [Keynote#2 ロボットは東大にはいれるか] (http://qiita.com/kozayupapa/items/081132896fb9d0624201) (人工知能の先端紹介　含意関係で東大合格！)
* [FacebookにおけるHadoop 利用の実態] (http://qiita.com/kozayupapa/items/b9eddbc7069f4b634ec1) 
(これからHadoopを使いまわしてみんなが運用時に感じるだろう課題がリストアップされています。この人のHadoopサービスも一考の価値あり。)
* [So-net Logicad, Gree Glossom](http://qiita.com/kozayupapa/items/cee269d70d7c89db7e19)
(クラウドでリアルタイム処理するための工夫と、LUAを使った個別最適化の紹介。)
* [異常検知　機械学習] (http://qiita.com/kozayupapa/items/fec359f3fd59664a62f0)
(機械学習の学習に異常検知は最適。)
* [リーン開発の現場 ～塹壕よりアジャイルなプロジェクト運営～](http://qiita.com/kozayupapa/items/fb9408260c2f39c66235)(プロジェクトが仮説検証と最短距離型どちらのフェーズ化見極めるのが重要)
* [Cloud Design Pattern Azure 版](http://qiita.com/kozayupapa/items/c9850e0e5a4779c51edc)(無料DLできるデザインパターン集がおすすめです。)

# 所感
## 
* 初めての参加でどんなギークの人がいるのか、かなりワクワクしていたのですが疲れたサラリーマン（自分も含め）ぽい人が多くて技術者っぽい雰囲気の人は1/3くらいでした
* Beer Partyで毎回Qconに参加しているいかにもGeekという雰囲気の方が、最近背広が増えたという感想をもらしてました。
* 撮影は禁止ということをだいぶたってから知りました。　しらなくて途中まで真ん前でとりまくってしまいましたが、、。
* 幅広いテーマを扱っているので始まったっ当初（2009年-）はよかったんだと思いますが、対象がややぼやけてみんなにとって今一つになっているのではという危惧が。来年以降どこかにエッジを立てるかエンタープライズ向けと大きく舵をきることが必要かと思いました。（私見です。）



# QCon History
## QCon とは？
主催者説明：
「最先端のITとその関連技術の動向をエンジニアの視点で深く掘り下げこれからの未来を展望する。」

セッションのテーマ年表事例を確認してみると、2012 までプログラムや設計技術そのものをテーマにしたものが多かったですが、最近はサービス紹介的な要素も多くなってきています。クラウドというものが本格的な検証期から、普及期にはいったのが2012年ごろを境にしていることがテーマからも感じられます。その分技術者にとってはちょっと物足りなくなってきた感じがします。

## 2014(今年)
[Qcon2014](http://www.qcontokyo.com/program.html)
* 組込み系/モノづくり
* クラウド
* ビッグデータ/分散技術
* モバイル/HTML5
* アジャイル/モデリング

## 2013
[Qcon2013](http://qcontokyo.com/tokyo-2013/program.html)
* クラウド
* モバイル/HTML
* 組込み x 2 
* アジャイル・モデリング
* ビッグデータ・分散技術

## 2012
[Qcon2012](http://qcontokyo.com/tokyo-2012/program.html)
* 設計/プログラム言語 x 2 
* モバイル/組込み x 2
* ビジネス　テクニカルケーススタディ(クラウドアーキテクチャー)　x 2


## 2011
[Qcon2011](http://qcontokyo.com/tokyo-2011/program.html)
* クラウド
* Design & Patterns
* Quality & Test
* 技術(mobile & クラウドアーキ)
* ケーススタディ(クラウドアーキ＆先行研究)
* アジャイル


## 2010
[Qcon2010](http://qcontokyo.com/tokyo-2010/program.html)
* アジャイル
* クラウドアーキ
* クラウド導入
* ユーザーインターフェース
* プログラミング言語
* 設計技法
* Test技法

## 2009
[Qcon2009](http://qcontokyo.com/tokyo-2009/session.html)
* アーキテクチャ
* RIA
* Ruby
* Cloud Computing SOA
* アジャイル
* ウェブベストプラクティス
[修正版]和田卓人さんの講演 (@ACCESS幕張オフィス)

**前回投稿したものを修正したものになるので、内容はほぼ変わりません**

　ACCESS幕張オフィスにて、テスト駆動開発(TDD)で有名な和田卓人さんによる講演が行われました。講演の内容やそのとき学んだことを書きたいと思います。

#「この先生きのこるために」
　いきなり余談ですが、和田さんは「このせんせいきのこるために」とおっしゃっていました。
　まず、和田さんが提示した本は「プログラマが知るべき97のこと」(通称:きのこ本)でした。そして、97の項目のうち、プログラマとして生き残っていくために最も重要な一つを挙げるとしたら、
> きのこ本の18: 学び続ける姿勢

であるとおっしゃいました。
　では、学び続けるためには何をしていけば良いのか？和田さんは、学び方のコツを5つのポイントに絞ってお話されました。
> 
1. 身の周りをプログラミング対象にする。例えば「生活費の計算」などのように、仕事ではないところでどんどん学びたい言語やフレームワークを用いることでそれに慣れていく。和田さんは、原稿の執筆時にgitを用いたバージョン管理をしたようで、その実際の画面なども見せていただきました。
2. 年下から学ぶ。自分よりも能力のある年下のプログラマがどんどん出てくることに対して、意地を張らずに、謙虚に、誠実に年下からもどんどん学べることを学んでいくべきである。
3. 過去から未来を知る。技術変化の推移はまるで「振り子」のような動きをしているように思われる。例えば、「分散システムと集中システム」や「サーバ処理とクライアント処理」などの注目技術の推移などがそれにあたる。しかし、これらは「振り子」のようにただの行き来を繰り返すのではなく、進化を伴った行き来である。和田さんはこれを「らせん」と表現していました。過去からどのような進化をして現在に至るのかを学ぶことが大事。
4. 人の流れを見る。現在、オープンソース開発はコミュニティから個人へと遷移している。個が多く集まると渦が起こる。この流れは、githubなどによって作られたものであり、railsやnode.jsは委員会の設計に終焉をもたらしつつある。こういった渦の中で学べることは非常に多い。
5. アウトプットをする。自分の学んだことを外に発信することが大事。発信すると、それに対するフィードバックがあり、それが自分に対する更なるインプットとなる。すなわち、学びを促進する。

　最後にまとめると、5つのポイントから、最終的には自分の得意分野を作り上げ、実力を価値ある状態にすることが、「生き残る」ために必要なことではないかとおっしゃっていました。
　「技術の学び方を学び、あとはとにかく手を動かす。やってるうちに、できるようになる。」は、自分の学生時代（特に大学の研究室）でも経験があり、とても共感しました。
　講演自体も非常に密な内容でしたが、和田さんは、こちらの質問に対しても、とても密な返答をしていらっしゃいました。内容が多くなってしまいますので、すべては書けませんが、衝撃的だったことが1点あります。

* 質問時間中、新入社員の我々に対して、和田さんが「こんなこと言ったらいけないが、転職をしてみるのも良い」と2〜3回程奨める。

　学ぶことが多すぎる、非常に内容の濃い講演でした。和田さん、そして招待してくださった松木さん、この度は本当にありがとうございました。

# 自分がこれからチャレンジしたいこと
　講演での学びすべてを実行することは、とてもできそうにないので、まずやってみようと思うものを3つ挙げます。

1. 自分の身の周りをプログラミング対象にする。とにかく手を動かすということを実践したいからです。
2. アウトプットをする。「アウトプットが非常に簡単にできる現在において、それをしないのは損である」と、松木さんも常々おっしゃていて、自分はそういったことを全然しないので、少しづつでも挑戦していけたらと思います。
3. TDDをとにかく試す。松木さんが技術研修中に行った実演も影響しているのですが、その有用性というものがよくわかりました。とにかく意識して、使える場面では使っていくということをしたいと思います。（ただ、現在進行中の3日間のrails実習においていきなりrspecを使うことを断念してしまいましたが。）


以上、和田さんの講演に関する簡単な内容紹介と個人的な学び・感想でした。
Herokuの公式PHPビルドパックが5.5に対応してた

長らく公式メンテが無いと思ってたら先日いきなり『そろそろバージョンアップしよーよ』って話が出てた(?)Herokuの公式ビルドパックがなんと更新されたみたい。
https://github.com/heroku/heroku-buildpack-php/commit/ae5f2a48dfd1c0ffa7a3519d04a987e6aa577d64

なお、5.3.27→5.5.11RC1になった模様。

既に公式ビルドパックを使用してるアプリはコミットしたら、新規PHPアプリは自動的に、このビルドパックが適用されるはず。(試してません。)
GradleからOSX notification centerに通知をするスニペット

`osascript(1)` で AppleScript を実行すればできる。

```groovy
void growl(String title, String message) {
    def proc = ["osascript", "-e", "display notification \"${message}\" with title \"${title}\""].execute()
    if (proc.waitFor() != 0) {
        throw new GradleException(proc.err.text.trim());
    }
}
```

他のオプションは [display notificationのマニュアル](https://developer.apple.com/library/mac/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_cmds.html#//apple_ref/doc/uid/TP40000983-CH216-SW224) にあるとおり、 `subtitle` と `sound name` がある。
GAE for GOの環境を構築する


Mac(10.9.2)にGAE(Google App Engine)の環境構築したときの手順をまとめました。
内容は、[本家サイト](https://developers.google.com/appengine/docs/go/gettingstarted/introduction?hl=ja)の情報を日本語に置き換えただけなので、英語が読める方はそちらを参照したほうが詳細な情報を得ることができます。
また、自分が環境構築した際、特に問題が起きなかったのでトラブルシュートは載っていません。

# 前提条件
1. Go 1.2 がインストールされている
1. python 2.7 がインストールされている

# 手順の流れ
1. Google App Engine fo GO SDKのダウンロードと展開
1. Pythonのバージョン確認
1. 展開したフォルダのパスを環境変数に登録
1. ファイルを作成して Hello, World を表示

## GAE for Go SDKのダウンロードと展開
1. [ここ][sdk]をクリックして、GAEのサイトからSDKをダウンロード
1. ダウンロードしたSDKのzipファイルを任意のフォルダに展開  
自分の環境では、$HOMEの配下に展開

## Pythonのバージョン確認
1. 下記のコマンドを実行して python 2.7 がインストールされているか確認  
2.7がインストールされていないときは、[Python][python]のサイトを参考にセットップが必要

```sh:手順
$ env python -V
Python 2.7.5
```

## 展開したフォルダのパスを環境変数に登録
1. .bash_profile か .bashrc にGAE for Go SDKのパスを登録  
自分の環境では、$HOMEの配下に展開したので、読み替えてください。

```sh:手順
$ cd
$ vi .bash_profile
PATH=$PATH:$HOME/go_appengine # ← 追加した行
```

## ファイルを作成して Hello, World を表示
1. ディレクトリを作成(パスは任意)
1. Hello, World ファイルを作成
1. yamlファイルを作成
1. サーバーを実行
1. http://localhost:8080 にアクセス

```sh:手順
$ mkdir -p ~/helloworld/hello
$ cd ~/helloworld/hello
$ vi hello.go
$ vi app.yaml
$ goapp serve
```

```go:hello.go
package hello

import (
    "fmt"
    "net/http"
)

func init() {
    http.HandleFunc("/", handler)
}

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Hello, world!")
}
```

```yaml:app.yaml
application: helloworld
version: 1
runtime: go
api_version: go1

handlers:
- url: /.*
  script: _go_app
```


[sdk]: http://developers.google.com/appengine/downloads?hl=ja#Google_App_Engine_SDK_for_Go
[python]: https://www.python.org
gorpでサーバー起動時に自動でCREATE DADABASEする

[gorp](https://github.com/coopernurse/gorp)を使ってて、typeで各テーブルの定義をしておくと、こちらでCREATE TABLEしなくても、自動でやってくれる仕組みがあって感動していたのですが、どうやらDBはつくってくれない感じだったので、何も考えなくていいように最初にDBもつくるようにしました。

```go:main.go
package main

func main() {
	// initialize the DbMap
	dbmap := initDb()
	defer dbmap.Db.Close()
	
	// なにかしらの処理…
```

次に`initDb`を定義してるスクリプト。

自分はめんどくさいので`main.go`の隣に置いてます。

`sql.Open`の部分でまずはDB名を指定せずに接続し、クリエイトのためのSQLを流し、そのあとDB名を指定して接続しにいってます。あとは標準的なgorpの使い方になっているかと思います。

```go:db.go
package main

import (
	"database/sql"
	"github.com/coopernurse/gorp"
	_ "github.com/go-sql-driver/mysql"
	"log"
)

type PostInfo struct {
	Title       string
	Body        string
}

type Post struct {
	Id int64
	PostInfo
	CreatedAt int64
	UpdatedAt int64
}

func checkErr(err error, msg string) {
	if err != nil {
		log.Fatalln(msg, err)
	}
}

func initDb() *gorp.DbMap {
	// connect mysql
	db, err := sql.Open("mysql", "user_name:pass_word@/")
	checkErr(err, "sql.Open failed")
	dbmap := &gorp.DbMap{Db: db, Dialect: gorp.MySQLDialect{"InnoDB", "UTF8"}}

	// create db if not exists
	_, err = dbmap.Exec("CREATE DATABASE IF NOT EXISTS your_project_name DEFAULT CHARACTER SET utf8;")
	checkErr(err, "create db failed")

	// connect db
	db, err = sql.Open("mysql", "user_name:pass_word@/your_project_name")
	checkErr(err, "sql.Open failed")
	dbmap = &gorp.DbMap{Db: db, Dialect: gorp.MySQLDialect{"InnoDB", "UTF8"}}

	// add table
	dbmap.AddTableWithName(Post{}, "posts").SetKeys(true, "Id")
	
	// create the table
	err = dbmap.CreateTablesIfNotExists()
	checkErr(err, "Create tables failed")

	return dbmap
}
```

## 余談

最近ずっとRailsでActiverecord使っていたので、gorpの中途半端なORM感がちょっと微妙だなぁって思ってました。

探したら[gorm](https://github.com/jinzhu/gorm)が使いやすそうです。

乗り換えようかな。。。
みんな大好き parse.com が値下げだよ♪非同期処理がクソとか、セキュリティが甘いとか、Cloud Codeいらないことか言わないで

# みんな大好き parse.com が値下げをアナウンスしたよ

まだまだ実装自体は改善の余地ありだけど、お金の無いスタートアップには助かる値下げ

## 値下げの内容

既存ユーザーの方はログインした状態で↓の新価格体系のページで申し込み！

https://www.parse.com/plans


### Parse Core について

- 秒間30APIまでOKになったよ
- ファイルストレージは 20GB になったよ
- データストレージは 20GB になったよ
- ファイル転送容量は 2TB になったよ

月間のAPIアクセス数による価格体系じゃなくなったということかな

### Push について

- 月に100万人（ユニークな受信者でカウント）に送れるよ（一人に何通も送っていいんだ）
- これまで有料だったセグメントやらスケジューリングも無料になったよ ← **これ本当か？**:smile:

```
Advanced push targeting, push scheduling, and multiple push certificates available to everyone for free!
```
Parse Pricing: Now Cheaper and Simpler! | Parse Blog - http://goo.gl/5o2ck7

でも、価格のページは有料版からターゲティングできるとなっている。

Parse Push | Increase user engagement - http://goo.gl/LsWGxn

どっちが正しいかわからないのが Parse.com クオリティ

### Parse Analytics について

- これまで有料だったけど、無料にしたよ

## けつろん

- APIの呼びすぎに注意すればいいかな
- リクエストが集中するピークタイムで絞るとか
- グロースハッカーはいなくなってください

## さんこう

Parse.com と悪戦苦闘している人たちの記事

- ParseのCloudCodeのクソみたいな非同期処理をシンプルに書く方法 - Qiita - http://goo.gl/XBfX2v
- ParseQuery の取扱説明書 - Qiita - http://goo.gl/KSnnNt
- Parse.com を導入する際に気を付けること：セキュリティの甘さについて - Qiita - http://goo.gl/YI6eJy

## ついで

せっかくだから今回のノリノリのアナウンスを西海岸的なフランクな感じで日本語に訳してみた（意訳有）

```
超興奮してやばいんだけど、新しいニュースを発表しちゃうぜ！っていうのは、価格体系が新しくなるっていう重大発表だ。しばらくがんばってやってたから発表できてまじうれしい。

前の価格体系は2011年終わりにベータ版を公開したときからだったんだ。懐かしす！で、ずっと、「おいおい、Parseっていいんだけど、実際いくらかかるんだよ？」って問い合わせがまじ多くて。んで、さっと何か組み合わせてつくって、でも、ベータ終わる前に変えたいなーってずっと思ってたんだよ。で、結果、デベロッパーが気に入ってくれたし、僕らもそれでやってきた。

自慢じゃないけど、僕らはこの3年、超やばいぐらいに成長してきて、んで、そろそろ価格変更する時期にきたんだ。この価格変更で次の3つのことが良くなったぜ：

- デベロッパーが簡単にコストの見積もりできるようにすること
- 急成長してもデベロッパーが自分でいろいろできるようにすること
- 無料を増やす！

```

以下原文：

```
I’m really excited to announce a major update to our pricing model that we’ve been working on for some time.

The old model dates back to late 2011 when we first opened up our beta to the world. The overwhelming majority of feedback we got was, “Parse is great but how much is it actually going to cost?” So, we scrambled to put something together quickly, fully expecting to change it before coming out of beta. It turns out that developers loved it and we stuck with it.

We’ve grown an incredible amount over these past three years and it came time to revisit our pricing. We set out to improve it in three ways:

- Make it easier for developers to predict and estimate their costs when using Parse.
- Make our product more self-serve for developers who grow very quickly on our platform.
- Offer more for free!
```
非ジェネリック型で渡されたリスト等の要素型を取得する

非ジェネリック型の IEnumerable を引数として受けざるを得ない時、でも要素の型が何であるか知りたい場合に使う方法です。
（IEnumerable<> を実装していることが前提ですが。）

下のような方法では本当にシーケンス全体の要素がその型である保証がありませんよね。

```csharp
seq.First().GetType()
```

そこで、Type クラスの GetGenericTypeDefinition メソッドと GetGenericArguments メソッドを使って以下のようなメソッドを作成します。

```csharp
public static Type GetElementType(this IEnumerable seq)
{
    var typeOfSeq = seq
        .GetType()
        .GetInterfaces()
        .FirstOrDefault(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof(IEnumerable<>));

    return (typeOfSeq != null)
        ? typeOfSeq.GetGenericArguments()[0]
        : null;
}
```

これによって、IEnumerable<> の型引数を取得することが出来ました。
使いどころがどれだけあるかはさておき（笑）
ゆの in Ruby をやってみた

どうも、最近「ひだまりスケッチ」に超絶ハマっています。
そしてたまたま [ゆの in language](http://d.hatena.ne.jp/keyword/%A4%E6%A4%CE%20in%20language) というものを発見したのでやってみました。

```ruby:yuno_in_ruby.rb
class X
  def self./(object)

    case
    when object == X
      print "x365"
    when object == Object
      print "ひだまりスケッチ"
    end

    self
  end

  def self.<(object)
    print " #{object}"
  end
end

class Object
  def _
    self.class
  end

  def 来週も見てくださいね!
    __method__
  end
end

X / _ / X < 来週も見てくださいね!
```

うーん、文字の出力に `print` を使うと
> ひだまりスケッチx365 来週も見てくださいね!%

と、末尾に % が付いちゃうなぁ…。


[元ネタ](http://subtech.g.hatena.ne.jp/cho45/20080708/1215450151) も拝見しました。
こんな風にうまくオブジェクト化してやればいいのか。

Ruby だと演算子のオーバーロードが楽なのですごくやりやすいですが、
他の色んな言語でもチャレンジされている方がいてすごいですね。


X / _ / X < よかったら、あなたのゆのっちも見せてくださいね！ひだまり荘で待ってます♪
ParseのCloudCodeのクソみたいな非同期処理をシンプルに書く方法

# JavaScriptの非同期処理はうんこ(確認)
ParseみたいなmBaaSでサーバー側のコードを書くのはナンセンスですが、それでも書かなければ処理できない部分がでてきます。
CloudCodeではPromiseを使用して非同期処理を書くことが推奨されているようで、以下のようになります。

```js:Parseドキュメントより引用
Parse.Cloud.define("test", function(request, response){
	var query = new Parse.Query("Student");
	query.descending("gpa");
	query.find().then(function(students) {
		students[0].set("valedictorian", true);
		return students[0].save();
	}).then(function(valedictorian) {
		return query.find();
	}).then(function(students) {
		students[1].set("salutatorian", true);
		return students[1].save();
	}).then(function(salutatorian) {
		response.success("ok");
	});
});
```
見て分かる通り、積み上がったクソみたいなコードです。

# 救世主 facebook regenerator & co
そこで、[facebook regenerator](https://github.com/facebook/regenerator)と[co](https://github.com/visionmedia/co)の出番です。
もともとcoはnodejs用のライブラリのようですが、regeneratorと組み合わせることで、`yield`が使えないCloudCode上で、`yield`を使った非同期処理が書けるようになります。

これらを使うと、上記のコードがこんなにスッキリします。

```js:es6.js
var co = require('cloud/node_modules/co/index');
Parse.Cloud.define("test", function(request, response){
	co(function *(){
		var query = new Parse.Query("Student");
		query.descending("gpa");
		var students = yield query.find();
		students[0].set("valedictorian", true);
		yield students[0].save();
		students[1].set("salutatorian", true);
		yield students[1].save();
		response.success("ok");
	})();
});
```

エラー処理を書く場合、標準的なやり方だとさらに訳の分からないコードになりますが、この方法だと、`try catch`でエラーを拾うこともできます。

# 使い方
使い方は
`$ regenerator -r es6.js > es5.js`
して、できあがったes5.jsをCloudCodeにアップするだけです。
自動化したいなら、[grunt-regenerator](https://www.npmjs.org/package/grunt-regenerator)を使うとよいでしょう。


# その他

以上の方法はブラウザのJavaScriptでも有効だと思うので、気になる方はお試しください。
Clojureで挿入順を維持するマップは？

ClojureでJavaのLinkedHashMapのように挿入順を維持するマップはないようです。まあ厳密にはイミュータブルだからそんなのないでしょうが。

array-map関数を使えば、マップ構築時に引数の順番は維持してくれますが、assoc等で変更したマップまで順番が維持される保証はありません。


```clj
(type {})
(type {1 1})
(type {1 1 2 2 3 3 4 4 5 5 6 6 7 7})
(type {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8})
(type {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9})

(type (assoc {1 1 2 2 3 3 4 4 5 5 6 6 7 7} 8 8))
(type (assoc {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8} 9 9))
(type (assoc {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9} 10 10))


{1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11}
(array-map 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11)
(assoc {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8} 9 9)
(assoc {1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9} 10 10)
```

![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/40558/c9ceb673-e3a9-0813-0b0a-3a34061c5d45.jpeg)


[つづき](http://qiita.com/kurogelee/items/02fdd51c88dc8f2d2be0)
文字エンコーディング


```php:文字エンコーディング
// SJIS-winのチェック.
if (! mb_check_encoding($name, 'SJIS-win')) {
	// エラー.
}

// SJIS-win -> UTF-8の変換
$name = mb_convert_encoding($name, 'UTF-8', 'SJIS-win');
```
DynamoDBについて調べた



http://aws.amazon.com/jp/dynamodb/faqs/
上記faqに載っていたものから以下をピックアップ

## bulk insert的なものはあるのか？

```
[BatchWriteItem] – 1 回のトランザクションとしてではなく、1回のリクエストで、複数のテーブル間で複数の項目を挿入、置換、削除します。Put または Delete で最大 25 項目のバッチをサポートし、合計リクエストサイズは最大 1 MB です。
```

## 一度に取得できるレコードの上限はあるのか?

```
[Query] – テーブルのプライマリキーを使用して、または、セカンダリインデックスからセカンダリインデックスキーを使用して、1 つ以上の項目を取得します。範囲キー値またはセカンダリインデックスキーに対して比較演算子を使用することで、クエリの範囲を絞り込むことができます。強い整合性と結果整合性の両方をサポートします。1 応答あたりのサイズ上限は 1 MB です。

[BatchGetItems] – BatchGetItems 演算は、複数の項目の属性を複数のテーブルから、それぞれのプライマリキーを使用して返します。1 回の応答のサイズ制限は 1 MB で、最大 100 個の項目を返します。強い整合性と結果整合性の両方をサポートします。
```
知ってるようで知らないPythonの特殊コーデック

Pythonの文字列オブジェクトには、文字列を特定のコーデックでエンコード/デコード操作が可能ですが、その中で今まであまり知らなかったコーデックを紹介します。

### base64

これはご存知の方が多いかと思いますが、文字列を **Base64** 文字列にエンコード/デコードします。

```py
>>> "hello".encode("base64")
'aGVsbG8=\n'
```

### zip

このコーデックは、文字列を **Zlib** モジュールでCompressした場合と同じバイト列を返します。

```py
>>> "hello".encode("zip")
'x\x9c\xcbH\xcd\xc9\xc9\x07\x00\x06,\x02\x15'
>>> import zlib
>>> zlib.compress("hello")
'x\x9c\xcbH\xcd\xc9\xc9\x07\x00\x06,\x02\x15' #同じ
```

### hex

このコーデックは、文字列をバイトあたり2桁の16進数に変換します。

```py
>>> "hello".encode("hex")
'68656c6c6f'
```

### bz2

このコーデックは、文字列をbz2を使って圧縮します。

```py
>>> "hello".encode("bz2")
'BZh91AY&SY\x191e=\x00\x00\x00\x81\x00\x02D\xa0\x00!\x9ah3M\x073\x8b\xb9"\x9c(H\x0c\x98\xb2\x9e\x80'
```

### rot13

このコーデックは、[シーザー暗号](http://ja.wikipedia.org/wiki/%E3%82%B7%E3%83%BC%E3%82%B6%E3%83%BC%E6%9A%97%E5%8F%B7)を使って文字列を暗号化します。

```py
>>> "hello".encode("rot_13")
'uryyb'
```

### uu

このコーデックは、[uuencode](http://ja.wikipedia.org/wiki/Uuencode)を使って文字列を変換します。

```py
>>> print "hello".encode("uu")
begin 666 <data>
%:&5L;&\ 
 
end

```

### idna

このコーデックは、 **Unicode文字列** を、RFC3490で規定している、漢字などで入力されたドメイン名を、アプリケーション上でASCII形式で記述した文字列に変換するコーデックです。

```py
>>> u"ハロー".encode("idna")
'xn--mdk0c0b'
```

Pythonには、これ以上の特殊コーデックがありますが、あまり日常的には使用しないものなので、これらのコーデックのみ紹介しました。 `zip` とか `bz2` とかは、モジュールを使用しなくても文字列を圧縮することができるので、大変便利ですよね。
サービスやアプリの計測について（Google Analytics, Mixpanel, KISSMetrics）

# けいそく無くして良策無し、とかそんな話

## いろんなツールあるけど何がいいの？

みんな何を使っているのだろうか？良いものがあったら教えてください。アプリの場合に絞って使ったことのあるものの特徴をまとめた。

## けつろん

- Google Analytics がいいけど、データ信頼できないし
- Mixpanel がいいけど、レポートがしょぼいし
- 誰が良いものつくって

## 海外製の3つのサービスを比べる

### Google Analytics (GA)

- Googleが提供するサービス
- 無料！
- iPhone, Android にも対応したライブラリがあり導入は簡単
- 数字に信憑性があるか疑問
- 集計の遅延が気になる Event系は24時間待ってから数字を見て判断すべき
- レポートのグラフ類が優秀なのでざっくりした方向性の判断に重宝する
- ついこの前まで日本時間の夜9時―12時にレポート見ると数字が倍になっているという致命的な問題がずっと起きていた、ぬか喜びさせることもある
- サービス全体が受け取るデータ量が増えると、欠落するデータが多くなる気が・・・（あくまで気がする）
- Google Play 連携があるのは素敵

### MixPanel

- シリコンバレーの会社が提供するサービス
- フリーミアムモデルでAPIリクエスト数で有料
- iPhone, Android にも対応したライブラリがあり導入は簡単
- GAに比べて数字の信ぴょう性が高い
- ファネルを簡単に作れるのが良い！細かいUX/UI変更の施策決定に重宝する
- メールレポートがしょぼい

### KISSMetrics

- 有料！すごく高かったイメージ
- Androidに対応したSDKが無い（確か）
- アプリには向かないかな

## けつろん

- レポート用APIが提供されているので必要があれば自分で作ろう
- この手の質問はグロースハッカー？にきこう、超詳しいはずだから