OmniAICreator/Qiita-1.07M huggingface dataset:
Android でオーディオファイルの再生時間（長さ）を取得する方法

# 遅いけど MediaPlayer を使いましょう

:notes:  Android で mp3 やらの再生時間が欲しいときにどうやったらスマートに再生時間（長さ）を取得できるのか？という疑問はときどき出てくるんだけど、車輪の再発明的なアプローチは大変だから、遅いけどMediaPlayer使いましょうという話。

## ぜんてい

- オーディオファイルの再生時間を知りたい
- MediaStore が効いていない場合（ダウンロード直後等）

## サンプル

```java
public static int getDuration(File audioFile) {
  MediaPlayer mp = new MediaPlayer();
  FileInputStream fs;
  FileDescriptor fd;
  fs = new FileIputStream(audioFile);
  fd = fs.getFD();
  mp.setDataSource(fd);
  mp.prepare(); 
  int length = mp.getDuration()
  mp.release();
  return length;
}
``` 

このコードは MediaPlayer#prepare() しているので遅い。でもこれが確実でいいよ♪

## FileDescriptor について

FileDescriptor って、Javaのずっと昔からあるクラスなんだけど、知られていないクラス。良くある初心者向けの解説書なんかには絶対出てこないレベル。で、MediaPlayer#setDataSource が引数に File を取らないのは何故だろう？FileDescriptor なのは何故？という話。

MediaPlayer#setDataSource(String path) というのもあって、path はファイルのパスもOKだし、http, rtsp といったプロトコルのURLでもOK。Android なんかはネットに接続されたデバイスで、ローカルのファイルもネット上の何かも同じように扱うという思想が反映された実装。FileDescriptor 自体は実行環境のInputもOutputも扱うより抽象的な概念で、それがローカルファイルであろうと、インターネット上のものであろうと抽象的に取り扱う。だから、 MediaPlayer#setDataSource(File file) はあるだけできもい。

## さんこう

- android - Determining the duration and format of an audio file - Stack Overflow - http://goo.gl/sDjn7X
- FileDescriptor について丁寧に解説したURLが・・・消えた

## あとがき

- グロースハッカーはいなくなっていいよ
[個人的メモ]警告とか、いろいろ

##Deprecations

###Deprecationsとして表示されるUIButtonのfont

```objc:内容
UIButton *MusicPick = [UIButton buttonWithType:UIButtonTypeRoundedRect];
MusicPick.font = [UIFont fontWithName:@"AppleGothic" size:15];
```
と記述するとこのエラー。

>'font'is deprecated: first deprecated in iOS 3.0

この詳細は下記。

```objc:詳細
@interface UIButton(UIButtonDeprecated)
@property(nonatomic,retain) UIFont         *font              NS_DEPRECATED_IOS(2_0, 3_0);
```

そして、iOS3.0以降は下記のようにフォント設定すれば良い。

```objc:解決
UIButton *MusicPick = [UIButton buttonWithType:UIButtonTypeRoundedRect];
MusicPick.titleLabel.font = [UIFont fontWithName:@"AppleGothic" size:15];
```
SSL証明書の情報を確認するワンライナー

```bash
$ openssl s_client -connect example.com:443 < /dev/null | openssl x509 -text -noout | less
```

これでいいらしい。

![スクリーンショット 2014-04-28 15.19.37.png](https://qiita-image-store.s3.amazonaws.com/0/569/be30077d-5bd2-0f40-aa46-23ceaddc0ba3.png)

google.com さんのを表示した例
妄想:JavaScriptを日本語にしてみた

英語ネイティブな人には、こんな風に見えてるのかなって。

## ボタンクリックでメッセージ

```js
$('#the-button').on('click', function(event) {
  alert('OK');
});
```

```
※（「#the-button」）・操作（「クリック」、関数（イベント）『
　警告（「よろし」）。
』）。
```

## 入力欄からコレクションに新規作成

```js
var $form = $('.js-form');
$form.on('submit', function(event) {
  event.preventDefault();

  var title = $form.find('.js-title').val();

  var task = new Task({ title:title });
  tasks.add(task);
});
```

```
変数 ※フォーム ＝ ※（「.js-form」）。
※フォーム・操作（「送信」、関数（イベント）『
　イベント・初期処理中止（）。

　変数 見出し ＝ ※フォーム・検索（「.js-title」）・値（）。

　変数 業務 = 新規 業務（『　見出し：見出し　』）。
　業務集・追加（業務）。
』）。
```

## expressで簡易サーバー

```js
var express = require('express');
var app = express();

app.get('/', function(req, res, next) {
	res.send('Hello world!');
});

app.listen(3000, function() {
	console.log('started at 3000');
});
```

```
変数 速達 ＝ 要求（「速達」）。
変数 アプリ ＝ 速達（）。

アプリ・取得（「/」、関数（要求、応答、次）『
　応答・送信（「初めまして」）。
』）。

アプリ・聴取（3000、関数（）『
　コンソール・記録（「3000で開始」）。
』）。
```
UnityのMonoやC#のバージョン



|Unity |Mono    |MonoDevelop |C#     |
|-----:|-------:|-----------:|------:|
|4.3.4 |2.10.2? |4.0.1       |4.0相当?|


# 確認方法

## Unity

メニューバー[Unity]-[About Unity…]

## Mono

以下、Mac OS X の場合

```
$ /Applications/Unity/Unity.app/Contents/Frameworks/MonoBleedingEdge/bin/mono -V
Mono JIT compiler version 2.10.2 (tarball Fri Nov  2 22:02:08 CET 2012)
Copyright (C) 2002-2011 Novell, Inc and Contributors. www.mono-project.com
        TLS:           normal
        SIGSEGV:       normal
        Notification:  kqueue
        Architecture:  x86
        Disabled:      none
        Misc:          softdebug
        LLVM:          supported, not enabled.
        GC:            Included Boehm (with typed GC)
```

## MonoDevelop 

メニューバー[MonoDevelo-Unity]-[About MonoDevelop-Unity…]

## C＃

以下、Wikipedia のページに記載されている Release History から

[Mono (software) - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/Mono_%28software%29)

Monoのバージョンが 2.10 系なので C#4.0 と思われる。

# 参考

* [Mono (software) - Wikipedia, the free encyclopedia](http://en.wikipedia.org/wiki/Mono_%28software%29)
* [What .Net version is Unity 4.1 using? - Unity Answers](http://answers.unity3d.com/questions/472726/what-net-version-is-unity-41-using.html)
Vue.js v0.10.4の変更点まとめ

https://github.com/yyx990803/vue/releases

# New

* templateから生成されるDocumentFragmentをDOMとして扱えるようになったので、tableやoptionのpropertyを扱えるようになった

```javascript
vm = new Vue({
	el: "#main",
    template: "<tr><td>xxxx</td></tr>" 
});
console.log(vm.$el.firstChild.tagName);

// v0.10.3
// undefined

// v0.10.4
// TR
```

* SVG要素をtemplateに指定したときに proper namespaceが設定されるようになった

```javascript
vm = new Vue({
	el: "#main",
    template: '<circle fill="red" cx="30" cy="30" r="20"/>'
});
console.log(vm.$el.firstChild.namespaceURI);

// jsfiddle

// v0.10.3
// http://www.w3.org/1999/xhtml 

// v0.10.4
// http://www.w3.org/2000/svg 

```

# Changed

* v-repeatで配列の中がpremitiveな値の時に、$valueの値を変更しても元の配列には反映されなくなった
	* Angular.jsもそうらしい
	* http://jsfiddle.net/koba04/yjU7C/





# Fixed

## [#213](https://github.com/yyx990803/vue/issues/213)

* v-repeatで使っている配列をspliceで全部要素削除したときに、配列とのバインディングが解除されてるみたいなissueぽいけど、そんなことはなくて保持されてる。
	* fiddleの意味がちょっとわからなかった

## [#234](https://github.com/yyx990803/vue/issues/234)

* Changedにあるpremitiveな値の時の挙動について

## [#239](https://github.com/yyx990803/vue/issues/239)

* vue.jsが$dispatchなどのイベント系の処理で、パフォーマンス上の理由からapplyでなくてcallで引数の数を3つで固定していたのをapplyでやるようになった。(applyEmit)

```javascript
callbacks[i].call(this._ctx, a, b, c)
```

* https://github.com/yyx990803/vue/commit/81ae36c

## [#242](https://github.com/yyx990803/vue/issues/242)

* directive内で使うメソッドの引数でオブジェクト形式のparamをサポートしてないことに対するissue

```javascript
<a v-on='click: sortRows({ column: "name" })'>Name</a>
```
* 代わりにmethods使えと答えつつ、対応されてv0.10.4では使えるようになっている
* https://github.com/yyx990803/vue/commit/e422d959452332862a3ea9d70c58bccc475daccb

## [#247](https://github.com/yyx990803/vue/issues/247)

* componentsと一緒に使った時にkey filterがおかしいというissue
* ネストしたViewModelでの継承関係にバグがあったぽいけど理解出来ていない。
  * https://github.com/yyx990803/vue/commit/489ded41b39a96d517f70525940a313b1bbd6dca
自由度と検定


今日は検定の中に出てくる **自由度 (degree of freedom)** について補足します。

## 自由度の定義

自由度とは自由に設定できる余地のある値の数を指します。

```
ある政策について市民の過半数が賛成しているかどうかを調査するために 500 人をサンプルとして抽出、調査をおこなった。その結果、賛成率は 53% (265 人) であった。この結果をもとに市民全体の過半数が賛成しているかどうか検定をしたい。
```

平均値の検定の場合、標本サイズ -1 がそれに相当します。たとえば標本が 4 ケースでその平均が 5 だったとき、 4 ケースのうち 3 つまでの値は任意に決定することができますが、最後の 4 ケース目の値は平均が 5 になるよう選択の余地なく決定してしまうことになります。たとえば他の 3 つが 2, 6, 8 で全体の平均が 5 だとしたら (2 + 6 + 8 + X) / 4 = 5 ですから X = 4 です。このとき、自由度は 3 になります。

サンプルサイズが ∞ に近づくほど t 分布が正規分布に近づきます。 t 検定は大規模データを扱う場合は Z 検定とほぼ等価となります。

上の例題を解くと

|仮説|説明|
|:--|:--|
|帰無仮説|母集団における賛成率が 50% である (π = 0.5)|
|対立仮説|母集団における賛成率は 50% を超える (π > 0.5)|

有意水準 α = 0.05 としたとき限界値は 1.645 となります。

```math
z = \frac {\sqrt{(0.5 × 0.5) / 500}} {0.53-0.5} = 1.34
```

1.34 < 1.645 なので帰無仮説が棄却されず、市民の過半数が賛成しているとは言えません。

## 検定への応用例

```
国民の 1 日あたり睡眠時間平均は 7 時間 33 分、その標準偏差は 1 時間 41 分であるというデータがあります。調査対象の人数は 15121 人です。(国民生活時間調査 2005) 果たしてこれは日本人の平均睡眠時間は 8 時間より少ないと言える調査結果でしょうか。
```

このサンプルのサイズは N = 15121 です。時間を分に直すと平均 453 、標準偏差は 101 です。

|仮説|説明|
|:--|:--|
|帰無仮説|母集団 (日本人全体) における平均睡眠時間は 8 時間 (480 分) である|
|対立仮説|母集団 (日本人全体) における平均睡眠時間は 8 時間 (480 分) ではない|

先程は **片側検定 (one-tailed test)** であったのに対し、今度は **両側検定 (two-tailed test)** となります。

有意水準 α = 0.05 、さらに標本平均の分布は自由度は 15121 - 1 = 15120 の t 分布に従います。自由度が 120 を超える場合は ∞ として扱いそれと有意水準 α = 0.05 と交差する 1.960 が限界値になります。

実際のデータに基づく検定統計量 t を求めるために必要な標準誤差を求める母分散が不明なので、その推定値として標本における不偏分散 s^2 (標準偏差 101^2) を利用し次式で求めます。

```math
t_{(N-1)} = \frac {\overline{x} - \mu_{[H_0]}} {\sqrt{s^2/N}} = \\
\frac {453 - 480} {\sqrt{101^2 / 15121}} = \\
-32.87
```

絶対値が 1.960 を超えているので、帰無仮説が棄却され、日本人の平均睡眠時間は 8 時間では無いと言えます。

## 参考

社会統計学入門 (放送大学教材)
http://www.amazon.co.jp/dp/4595313705
動画拡張子確認

ちょっと必要になって動画のファイル形式を調べました。
まだ不完全。修正は随時していきます。


| 拡張子      |ファイル形式  |YouTube| 解説 |
|:-----------|:-------------|:----|:-------------|
| .wmv       | WMV形式      |○|Windows Media VideoというWindows標準の高圧縮動画形式。ストリーミング再生（ダウンロードしながら再生）可能。|
| .avi       | AVI形式      |○|マイクロソフトがアップル社のQuick Timeに対抗するために開発。再生するには適切なコーデック（データを小さく圧縮し、元に戻すソフト）が必要。|
| .mpeg/.mpg | MPEG1形式    |×|MPEGには、「MPEG1」「MPEG2」「MPEG4」の3つの規格がある。MPEG1は、ビデオCD用の基準で低容量、MPEG2は、ハイビジョン放送やDVDビデオなどの基準で高画質、MPEG4は、ストリーミングビデオ（インターネット配信）や携帯電話などで使われている規格。 |
| .vob       | MPEG2形式    |×|MPEG2形式で圧縮された動画ファイル。DVDビデオなど高画質の映像ファイルに使われる。|
| .ogm       | Ogg Media    |×|Oggの仕様を元に開発された動画形式。Ogg VorbisやAACを動画の音声部分に使える。|
| .mov       | MOV形式      |○|アップル社によって開発された動画や音声の記録、再生ソフトであるQuick Timeのビデオファイル形式。|
| .rm        | Real Video   |×|Real Networks社の開発したReal Mediaで圧縮された動画。主にストリーミングビデオなどの目的で使われる。|
| .divx      | DIVX形式     |×|DivXというコーデックを用いて圧縮された動画ファイル。|
|---       | MPEG4形式     |○|---|
|---       | MPEGPS形式     |○|---|
|.flv       | FLV形式     |○|Flash Player 6以降を利用してインターネット上で動画を配信するために利用するコンテナファイルフォーマット|
|.3gp       | 3GPP形式     |○|主にMMS（日本でいう写メールやiショットに相当）で動画や音声をメールで送信するために利用されるファイル形式。MPEG-4のMP4ファイルフォーマットがベース|
|.webm       | WebM形式     |○|Googleが開発しているオープン・ロイヤルフリーな動画コンテナフォーマット|

YouTubeの対応は、○が対応あり、×が対応なし。
YouTubeサポートについては下記を参照しました
https://support.google.com/youtube/troubleshooter/2888402?hl=ja
RubyMineでdebbugできない

#はじめに
RubyMineを使っててbreakpointをセットしようとしたら以下のエラーが出てdebbugができず、解決方法を調べましたのでメモ。

```error.log
1711: Exception in DebugThread loop: wrong number of arguments (0 for 1)
Backtrace:
/home/.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/debugger-1.6.6/lib/ruby-debug/interface.rb:175:in `read_command'
  from: /home/.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/ruby-debug-ide-0.4.22/lib/ruby-debug-ide/ide_processor.rb:84:in `process_commands'
  from: /home/.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/ruby-debug-ide-0.4.22/lib/ruby-debug-ide.rb:122:in `block in start_control'
[2014-04-28 13:59:31] ERROR SystemExit: exit
	/home/.rbenv/versions/1.9.3-p545/lib/ruby/gems/1.9.1/gems/ruby-debug-ide-0.4.22/lib/ruby-debug-ide.rb:126:in `exit'
```

#回避策
参考:https://gist.github.com/jmandala/1960973
> I made sure that my Gemfile didn't have any debug references.

訳（適当）
> Gemfileにdebugのreferencesを持っていないことを確認しました

とのこと。Gemfileを確認したらバッチリpry-debuggerの記述が。
こちらをコメントアウトしたら動くようになりました。
RubyMineマジ便利。

```rb:Gemfile
group :test, :development do
	gem 'rack-mini-profiler'

	gem 'pry-rails'
	gem 'pry-stack_explorer'

	if RUBY_VERSION >= '2.0.0'
		gem 'pry-byebug'
	else
		# 以下はRuby1.9の時のみ使う(pry-byebugの代わりに)
		# debuggerは1.9以下でしか動作しない, remote は byebug で使えないようになった
		gem 'pry-debugger' #ここをコメントアウトしたよ。
		gem 'pry-remote'
	end

	gem 'better_errors'
	gem 'binding_of_caller'

	gem 'awesome_print'
end
```
このGemfileは[Rails4 今のところ最強なデバッグツール達](http://qiita.com/yusabana/items/8ce54577d959bb085b37)を参考にさせていただきました。
zshでPATH環境変数の重複エントリを排除



```
typeset -U path PATH
```
でOK。

```
-> % echo $PATH | tr : '\n' | sort | uniq -d | wc -l
       6
-> % echo 'typeset -U path PATH' >> ~/.zshrc
-> % zsh
-> % echo $PATH | tr : '\n' | sort | uniq -d | wc -l
       0
```
6個重複していたのが１個もなくなった。

### 参考
[zshのPATHの自動重複削除や余計なPATHの削除 - @znz blog](http://blog.n-z.jp/blog/2013-12-12-zsh-cleanup-path.html)
jQueryプラグインを作成

##概要
汎用的に使いまわしたい処理があったので、jQueryプラグインとして作成しました。
実装方法はjQuery uiを参考にしています（パクってます）

##実装
↓プラグイン部分

```sample.js
(function($) {
    var Sample = function() {
        //ここではパラメータ等
        this._param = 'オラオラ！！';
    };

    $.extend(Sample.prototype, {

        //通常のGET/SET
        getParam: function() {
            return this._param;
        },
        setParam: function(param) {
            this._set(param);
        },

        //protected的に使いたいfunctionはわかりやすく先頭にアンダースコア
        //付けているが、厳密なアクセス制限はできない。ただの命名ルールとして。
        _set: function(param) {
            this._param = param;
        },

        //Ajaxから取得したデータをパラメータにセットしたい時
        setFromAjax: function() {
            this._getAjax(this._response());
        },

        _response: function() {
            //ajaxのsuccess内でthisをコントロールするためproxyを利用
            return $.proxy(function(data) {
                this._set(data);
            }, this);
        },

        _getAjax: function(response) {
            $.ajax({
                type: "GET",
                url: "test.json",
                dataType:"json",
                success:function(data) {
                    response(data);
                }
            });
        }
    });

    //$.sampleで利用できるようになる
    $.extend({
        sample: new Sample()
    });
})(jQuery);

```

↓確認用js

```test.js
console.log($.sample.getParam());

$.sample.setParam('無駄無駄！！');
console.log($.sample.getParam());

$.sample.setFromAjax();
setTimeout(function() {
    console.log($.sample.getParam());
}, 1000);
```
Railsでacts_as_paranoidを使った時のuniquenessをmysqlでも保証する

`Mysql2::Error: Duplicate entry`に悩まされたので、解決方法を共有します。


```none:Gemfile
require 'rails4_acts_as_paranoid'
```

```app/models/user.rb
act_as_paranoid
validate_uniqueness_of :email, scope: :deleted_at
```

```db/migrate/add_deleted_at_to_users.rb
add_column :users, :deleted_at, :datetime
add_index :users, [:email, :deleted_at], unique: true

# 必要であれば
remove_index :users, :email
```

以上です。
間違いがありましたら指摘してください。

参考
http://stackoverflow.com/questions/16641030/validates-name-uniqueness-scope-user-id
Android で Runtime.getRuntime().exec(command) するときの注意点：クォーテーションは駄目

# Android アプリ内で直接コマンド実行するときに、コマンドラインにクォーテーション入ってるのは困るという話

## :notes: ぜんてい

- Android でアプリ内で直接コマンド実行したい
- 引数が複雑でコンソールで使うときにクォーテーション入れるようなケース

## :notes: れい

例えば hoge というコマンドがあって、-v "Hoge saves the world" と言う感じで引数を渡して実行するとき

```java
String command = "hoge -v \"Hoge saves the world\"";
Runtime.getRuntime().exec(command);
```

というのは駄目で、Stringの配列で渡そう

```java
Runtime.getRuntime().exec(new String[] {"hoge","-v","Hoge saves the world"});
```

■以上

## :notes: あとがき

- 絵文字を入れられるのはいいね :smile:
- グロースハッカーは消えてください
iOSの言語環境を取得する


    NSArray *langs = [NSLocale preferredLanguages];
    NSString *langID = [langs objectAtIndex:0];

とするのがよい。
別の方法として、

    NSString *localeIdentifier = [[NSLocale currentLocale] localeIdentifier];

としてしまうと、言語環境を英語にしてても、初期のほうが日本のままだと取得されるのも"ja_JP"になってしまうので要注意。

英語圏の人は、言語を英語にしたら書式も英語にしてると思われるので問題はないと思いますが、preferredLanguagesをみたほうが無難そう。

    NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:langID];

取得された文字列からNSLocaleを作成。
Windows で phantomjs が終了しないときの対処

phantomjs のプログラムを終了させるときには `phantom.exit()` を使います。しかし、Windows では終了しないことがあります。この現象については GitHub でも Issue として上がっています。

- [PhantomJS 1.7.0 hangs on Windows 8 · Issue #10845 · ariya/phantomjs](https://github.com/ariya/phantomjs/issues/10845)

どうやらグラフィックスボードが複数ある場合に発生してしまうようです。ここでは Windows 8 の現象として報告されていますが、Windows 7 でも発生することを確認しました。

NVIDIA コントロールパネルがインストールされている場合には、設定を変更することで対処できます。

まず、スタートメニューから NVIDIA コントロールパネルを探し出します。

![nvidia01.png](https://qiita-image-store.s3.amazonaws.com/0/6870/55623a65-e51b-3682-62ca-df4ccbb7ee36.png)

これを起動して [3D設定] の [3D 設定の管理] にある、[グローバル設定] タブの [優先するグラフィックス プロセッサ] を自動選択以外にしてやれば大丈夫です。

![nvidia02.png](https://qiita-image-store.s3.amazonaws.com/0/6870/f3b3c40b-08eb-01c0-1d68-c2d5e72d0817.png)
.NET: カスタムスキーマでデスクトップアプリを起動させる



```csharp


        /// <summary>
        /// URI Schemeのシェルハンドラを登録する
        /// </summary>
        /// <param name="proto">URI Scheme</param>
        /// <param name="path_exe">アプリケーションのパス</param>
        /// <param name="path_icon">アイコンのパス</param>
        public static void RegisterUriSchemeShellHandler(string scheme, string proto, string path_exe = null, string path_icon = null)
        {
            path_exe = path_exe ?? System.Reflection.Assembly.GetExecutingAssembly().Location;
            path_icon = path_icon ?? path_exe;

            var key_proto = Microsoft.Win32.Registry.CurrentUser
                            .CreateSubKey("Software").CreateSubKey("Classes").CreateSubKey(scheme);

            // Protocol Handler
            key_proto.SetValue("", string.Format("URL:{0} Protocol",proto));
            key_proto.SetValue("URL Protocol", "");

            // Icon
            var key_deficon = key_proto.CreateSubKey("DefaultIcon");
            key_deficon.SetValue("", string.Format(@"""{0}""", path_icon));

            // Executable Path
            var key_command = key_proto.CreateSubKey("shell").CreateSubKey("open").CreateSubKey("command");
            key_command.SetValue("",
                string.Format(@"""{0}"" ""%1"" ""%2"" ""%3"" ""%4"" ""%5"" ""%6"" ""%7"" ""%8"" ""%9""", path_exe)
                );

        }

```


メインのWindowsFormで:

```csharp

        public FormMain()
        {
            InitializeComponent();

            RegisterUriSchemeShellHandler("openid","OpenID");       // "openid://?...." でこのプログラムが呼ばれる
        }    

```
アルゴリズムパズル

アルゴリズムパズル

---

買った。
驚いたのが、索引が二つある。
通常の索引に対して、「設計戦略、分析タイプ」毎の索引がある所。
本の触り程度を紹介

アルゴリズムパズル

## 全数探索
* 解説
 * 解がみつかるまで可能性のある候補をしらみつぶしに調べる戦略
 * [Wikipediaのリンク](http://ja.wikipedia.org/wiki/%E5%8A%9B%E3%81%BE%E3%81%8B%E3%81%9B%E6%8E%A2%E7%B4%A2)

* 練習問題
 * [魔方陣(3×3)](http://ja.wikipedia.org/wiki/%E9%AD%94%E6%96%B9%E9%99%A3)

* ミニマックス法
 * 想定される最大の損害が最小になるように決断を行う戦略
* マクシミン法
 * 想定される最小の利益が最大になるように決断を行う戦略

## 縮小統治法
* 解説
 * オリジナルの問題の解と、それより大きさを小さくしたインスタンスの解との関係を見つける
 * [Wikipediaのリンク](http://ja.wikipedia.org/wiki/%E5%88%86%E5%89%B2%E7%B5%B1%E6%B2%BB%E6%B3%95)
* 練習問題
 * [有名人の問題](http://ja.wikipedia.org/wiki/%E5%88%86%E5%89%B2%E7%B5%B1%E6%B2%BB%E6%B3%95)

## 分割統治法
* 解説
 * 問題を分割し、それぞれ解を解き、組み合わせて、最後に結合して、最初の問題を解く
 * 再帰アルゴリズム。ソートの考え方。
* 練習問題
 * [トロミノパズル]()

---

そういえば、NHKのピタゴラススイッチ、アルゴリズム体操を思い出した。
https://www.youtube.com/watch?v=Z32ft4IuVSk
mecabをRubyで使う


前に書いた、[Macにmecabインストール](http://qiita.com/ysk_1031/items/7f0cfb7e9e4c4b9129c9)の続きのメモ。

* 辞書にはてなキーワード追加
* mecabをRubyで使う

こちらをやる。

## 辞書にはてなキーワード追加

まえにwikipediaのタイトルを辞書に追加したが、同じ要領で。

### はてなキーワードのリスト取得

```
$ wget http://d.hatena.ne.jp/images/keyword/keywordlist_furigana.csv
```

`hatena_keywordlist_furigana.csv`とかにリネームしとく。

### 辞書用のCSVにフォーマットを変更

```ruby:store_wikipedia_and_hatena_to_csv
require 'kconv'

origin =
  if $*[0] =~ /wiki/
    "wikipedia"
  elsif $*[0] =~ /hatena/
    "hatena"
  else
    "unknown"
  end

open($*[0]).each do |title|
  if origin == "wikipedia"
    title.strip!
  elsif origin == "hatena"
    title = title.toutf8
    title = title.split("\t")[1].strip
  end

  next if title =~ /^\./
  next if title =~ /,/
  next if title =~ /[0-9]{4}/
  next if title =~ /^[-.0-9]+$/

  title_length = title.split(//u).length
  score = [-36000.0, -400 * (title_length ** 1.5)].max.to_i

  if title_length > 3
    print "#{title},0,0,#{score},名詞,固有名詞,*,*,*,*,#{title},*,*,#{origin},\n"
  end
end
```

こんな感じのスクリプトを利用し、辞書用CSVを生成。

```
$ ruby store_wikipedia_and_hatena_to_csv hatena_keywordlist_furigana.csv | nkf -e > hatena_keyword.csv
```

### 辞書構築
`/usr/local/Cellar/mecab/0.996/lib/mecab/dic/ipadic/`下に`hatena_keyword.csv`を移し、

```
$ cd /usr/local/Cellar/mecab/0.996/lib/mecab/dic/ipadic/
$ /usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index -f euc-jp -t utf-8
```

※mecabはMacにhomebrewで入れたやつ

これで、wikipediaタイトル＋はてなキーワードを辞書として利用できる。

## Rubyから利用
`natto`というgemを使ってRuby(Rails)からmecab利用。

```ruby:Gemfile
gem 'natto'
```

```
$ bundle
```

適当なメソッドを書く。

文章の配列を引数にとり、それらを形態素解析。wikipediaタイトル or はてなキーワードに合致した単語とその出現頻度を計算し、ハッシュで表示するようなロジック。

```ruby:keyword_analysis.rb
class KeywordAnalysis
  def self.morphological_analysis(words)
    result = {}
    natto_mecab = Natto::MeCab.new

    words.each do |word|
      natto_mecab.parse(word) do |n|
        next if n.feature.split(",")[-1] !~ /wikipedia|hatena/

        if result["#{n.surface}"]
          result["#{n.surface}"] += 1
        else
          result["#{n.surface}"] = 1
        end
      end
    end

    return result
  end
end
```

コンソールで実行

```
> texts = ["泣いてもいいんだよ／ももいろクローバーZ（NAITEMO IINDAYO）", "ももいろクローバーZ「GOUNN」MV", "ももいろクローバーZ「サラバ、愛しき悲しみたちよ」MV"]
> KeywordAnalysis.morphological_analysis(texts)
=> {"ももいろクローバーZ"=>3, "GOUNN"=>1, "サラバ、愛しき悲しみたちよ"=>1}
```

こんな感じで、Rubyから簡単にmecabを利用することができた。
twitterの全ツイートとかはてブしたリンクとかをこれで解析したら、自分の嗜好とかが単語から読み取れるかもしれない。
DB　テーブル　カラムデフォルト値の変更(DEFAULT)SQL

列の値が設定されない時に入るデフォルト値の変更命令です。
構文

```sql
ALTER TABLE テーブル名 ALTER COLUMN 列名 SET DEFAULT デフォルト値;
```

使用例
テーブルuserのgenderのデフォルト値を1に設定

```sql
ALTER TABLE user ALTER COLUMN gender SET DEFAULT 1;
```
ffmpeg でオーディオファイルに無音部分をたす

# mp3 とか m4a に無音部分を足す方法です

## :notes: ぜんてい

- 特定部分にサウンドをたしたい
- amerge で音声ファイルのmixingしたい
- "-itsoffset" オプションが使えないように感じる
- "-itsoffset" のかわりに無音部分を前後につける
- Audacity とか SOX 使うべきだが、いろんな事情で ffmpeg を使わざるを得ないとき

## :notes: コマンド

hoge.mp3 の前5秒と後52秒の無音部分を足す。コーデックを aac にしているのは趣味ですので、mp3 等に変更。

```
ffmpeg -f lavfi -i aevalsrc=0:0:0:0:0:0::d=5 -i hoge.mp3 -f lavfi -i aevalsrc=0:0:0:0:0:0::d=52 -filter_complex "[0:0] [1:0] [2:0] concat=n=3:v=0:a=1 [a]" -map [a] -c:a aac -q:a 4 -strict -2 hoge_60.m4a
```

↓の部分で5秒の無音を作成してffmpegに入力として渡す。d=5を変更することで長さは変えられる。

```
-f lavfi -i aevalsrc=0:0:0:0:0:0::d=5
```
## :notes: あとがき

- グロースハッカーはもういらない子
yungsang/coreos Vagrant box v0.9.1 for VirtualBox and Parallels

# yungsang/coreos Vagrant box v0.9.1 for VirtualBox and Parallels

https://vagrantcloud.com/yungsang/coreos

- Based on CoreOS ***beta*** 310.1.0
    - ***Still Fleet v0.2.0***
    - ***Still Docker v0.10.0***
- Add OEM files for Vagrant and patch them
    - Cf.) https://github.com/coreos/coreos-overlay/pull/568
    - Cf.) https://github.com/YungSang/coreos-packer/tree/overlay-568
- Enable the Docker daemon and open the port 4243

Cf.) https://github.com/YungSang/coreos-packer  
Cf.) https://github.com/YungSang/coreos-cluster  

## For VirtualBox
```
$ vagrant init yungsang/coreos
$ vagrant up
```

## For Parallels
```
$ vagrant plugin install vagrant-parallels
$ vagrant init yungsang/coreos
$ vagrant up --provider parallels
```
配列とポインタ

# 配列とポインタ

配列とポインタはほぼイコールです。

```c
int x[] = { 1, 2, 3};
int *ptr = x;
```

このとき、 `ptr` は `x[0]` のアドレスを指しています。アドレスの中身を見てみると `x[0]` の値が表示されます。

```c:
printf("%d\n", *ptr);

// => 1
```

`x[1]` は `ptr` の次のアドレスになります。

```c:
printf("%d\n", *(ptr + 1));

// => 2
```

そのため、この様な処理は

```c:
for (ix = 0; ix < sizeof x / sizeof x[0]; ix++) {
    printf("%d\n", x[ix]);
}
```


このように書き換えることができます。
配列表現はポインタのシンタックスシュガーと言えます。

```c:
for (ix = 0; ix < sizeof x / sizeof x[0]; ix++) {
    /* printf("%d\n", x[ix]); */
    printf("%d\n", *(x + ix));
}
```

昔の処理系は配列表現をポインタで置き換えていたものがあるらしく、

```c:
for (ix = 0; ix < sizeof x / sizeof x[0]; ix++) {
    /* ixは配列でない! */
    printf("%d\n", ix[x]);
    /* -> printf("%d\n", *(ix+x)); */
}
```

こう書いてもコンパイルが通るものがありました。昔はあったよなーと思っていたら、今もありました。手元のgcc 4.7.2で-Wallをつけても何も言われずにコンパイルが通りました。

```c:
#include <stdio.h>

int main(int argc, char** argv) {

    int x[] = {1, 2, 3};
    int ix;
    int *ptr = x;

    printf("%d\n", *ptr);
    printf("%d\n", *(ptr+1));

    for (ix = 0; ix < sizeof x/sizeof x[0]; ix++) {
        printf("%d\n", ix[x]);
    }

    return 0;
}
```
JavaScriptのモダンな日付ライブラリらしいXDateで月初、月末を計算する

# 本家
[XDate](http://arshaw.com/xdate/)

# 月初
```js
var xd = new XDate();
alert(xd.toString("yyyy-MM-01"));
```

# 月末
```js
var xd = new XDate();
xd.addMonths(1);
xd.setDate(0);
alert(xd.toString("yyyy-MM-dd"));
```
※javascriptのDate関数に翌月の日付を0で渡すと、今月の月末日が取得できるという技がXDateでも利用できました。
ただ、XDateのページには、setDateのパラメーターは、1-31とあるのでバグなのかもしれません。
AngularJSのリクエストをPHPで処理するときのメモ


**2014/05/13追記**

# AngularJSのリクエスト判定

ブラウザのアドレス入力によるリクエストなのか、AngularJSのHTTPリクエストなのか判定したい場合、
$_SERVER['HTTP_ACCEPT']に「application/json」が含まれるかで判断すると良いです。

```isAngular.php
function isAngular()
{
    if (false !== strpos($_SERVER['HTTP_ACCEPT'], 'application/json')) {
        return true;
    }
    return false;
}
```

PhalconではRequestのインターフェイスにisAjaxというメソッドがあります。

```ide/1.3.1/Phalcon/Http/RequestInterface.php
/**
 * Checks whether request has been made using ajax. Checks if $_SERVER['HTTP_X_REQUESTED_WITH']=='XMLHttpRequest'
 *
 * @return boolean
 */
public function isAjax();
```

XMLHttpRequestで判定しているのでAngularのリクエストではtrueになってくれません。
他のWebフレームワークで同様のメソッドがあったとして、期待通りに動作してくれなければ$_SERVER['HTTP_ACCEPT']を使いましょう。

# POSTのbody取得

AngularJSのPOSTリクエストは$_POSTに値が入ってくれません。
``php://input``から読み込みます。

```request.php
$request = json_decode(file_get_contents("php://input"))
```

**2014/05/13追記** コメント欄より、PhalconではPhalcon\Http\RequestクラスのgetJsonRawBodyメソッドで取得できることを教えていただきました。

```
$json = $this->request->getJsonRawBody();
```
Apple ID が認証されない問題

#しばらく前から 
App Store にて下記のメッセージが表示されて、認証が通らず Marvericks にアップデートできない状態でした。

"your device or computer could not be verified. contact support for assistance."

先日 Kobito に興味を持ったところ、 OSX 10.7 以上でないと動かないそうなので少し真面目に解決方法を探してみました。

#解決方法

下記のファイルを削除して再起動するだけのようです。

HD/Library/Preferences/SystemConfiguration/NetworkInterfaces.plist

Marvericks は OSX 10.9 らしいので Kobito もインストールできると思います。
【初心者です】教えて下さい!!【javascript】

javascriptで
こういう条件式の結果が作りたいのですが、どういった文なら可能でしょうか？

（条件）

４月２７日の時点で７７．４kgの体重が
６５kgになるまでの毎日の体重変化の推移結果を全て表示したい。
１日０．３kg（３００g）減ると仮定づけ

4/27 77.4kg
4/28 77.1kg
・
・
・

という風に表示したいと思っています。
while文だと思うのですが、詳しい書き方がわかりません。
<script>

var taizyuu = 77.4
while (taizyuu > 65){
???

</script>
お願いします。
F#である範囲の特定行を範囲ごとにグルーピングする

ログやソースコードのようなテキストファイルから、ある特定の形式の行を開始行、別の特定の形式行を終了行としてその間の範囲で特定の形式の行（複数行）を範囲ごとにグルーピングして取得したいことがたまにあります。たとえば

[START] ... ←開始行
... [ERROR] #1 ...  ← 必要な行
... [INFO] ...  ← 不要な行
... [ERROR] #2 ...  ← 必要な行
[END] ... ←終了行
... ← 無関係な行
[START] ... ←開始行
... [ERROR] #3 ...  ← 必要な行
... [INFO] ...  ← 不要な行
[END] ... ←終了行

となっていたとして、必要な行(複数行)を次のようにグルーピングした（ものを他の処理で使いた）いのです。
[グループ1]
... [ERROR] #1 ...  ← 必要な行
... [ERROR] #2 ...  ← 必要な行
[グループ2]
... [ERROR] #3 ...  ← 必要な行
...

この処理が必要になるたびに忘れてしまっていて毎回考え直しているのでメモっておこうと思ったわけで。

```fsharp
let re0 = new Regex(@"...") // 範囲開始行にマッチ
let re1 = new Regex(@"...") // 範囲終了行にマッチ
let re2 = new Regex(@"...") // 範囲中で取得したい行にマッチ

let trd (x, y, z) = z

use r = new StreamReader(filename, Encoding.UTF8)
seq {
    while r.Peek() >= 0 do
        yield r.ReadLine()
}
|> Seq.fold
    (fun (isInRange, currentLines, linesList) line ->
        if isInRange then
            if re1.IsMatch(line) then (false, [], linesList @ [currentLines])
            else if re2.IsMatch(line) then (true, currentLines @ [line], linesList)
            else (true, currentLines, linesList)
        else
            if re0.IsMatch(line) then (true, [], linesList)
            else (false, [], linesList))
    (false, [], [])
|> trd
```
ReactJS Component Lifecycle as logged


Yet another terrible title by me, but one that should answer the basic question of "what is the order in which component lifecycle methods get fired off?" or ["What is workflow of the React"](http://stackoverflow.com/questions/18680213/what-is-workflow-of-the-react/18749697#18749697)?

The original docs for Component Specs and Lifecycle are here: http://facebook.github.io/react/docs/component-specs.html

But this documentation doesn't necessarily put things in chronological ordering. I made a very basic "test" for demonstrating the lifecycle of components using console.log()'s.

Results first! (that's what people care about, anyway)

# Results

[Console screenshot here](https://qiita-image-store.s3.amazonaws.com/0/42481/82011634-ea35-e718-0b76-66d4e0c32f3c.png "Screen Shot 2014-04-27 at 11.00.56 AM.png")

-----

React.renderComponent

1. getDefaultProps
2. getInitialState
3. componentWillMount
4. render
5. componentDidMount

-----


MyComponent.setProps

1. componentWillReceiveProps
2. shouldComponentUpdate
3. componentWillUpdate
4. render
5. componentDidUpdate

-----

React.unmountComponentAtNode

1. componentWillUnmount

-----

# Methods

Not much to be said here, the component lifecycle methods were just crammed with console.log()'s.

You can review this code on [JSFiddle](http://jsfiddle.net/kimagure/S9fUn/1/) or [Github](https://github.com/kimagure/component-lifecycle-demo)

# Conclusion

ReactJS Component Lifecycle is really cool, but people can't be bothered to read documentation sometimes -- and who can blame them? The docs force you to slow down and think about your lifecycle when all you want to do is write some chronological code. At least this will be yet another source of information about this issue.

I hope this reduces the number of people asking about this on IRC and elsewhere on the internet.
Ubuntu 14.04 LTS (Trusty Tahr)でハイバーネートを有効にする方法

## Ubuntu 14.04 LTS (Trusty Tahr)でハイバーネートを有効にする方法

Ubuntu 13.10から14.04にアップグレードしたら、ハイバーネートが使えなくなっていたので、調査。

### 方法
まずエディタで以下のファイルを新しく作成・編集する。

```
$ sudo vim /var/lib/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla
```

以下のように入力して保存。

```
Re-enable hibernate by default in upower]
Identity=unix-user:*
Action=org.freedesktop.upower.hibernate
ResultActive=yes

[Re-enable hibernate by default in logind]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate
ResultActive=yes
```

再起動すれば、右上メニューでサスペンド、シャットダウンの間にハイバーネートが追加される。
ターミナルにイカロス

　こんにちは。初投稿です、どもも。

　自宅のサーバにターミナルでsshログインしたときに、「ようこそー」みたいなことを言ってほしいなあというのがあって、AAを表示させるのは以前からしてたんです。（寂しい人間とか言わない）
/etc/motdにAAをコピるって方法で。
でもAAだとフォントによって盛大にずれて残念なきもちになったりします。


　でまあ多少ずれてもいいかってしばらく妥協してたんですけど、そういやドット絵だったらいい感じに表示できるんじゃないかと最近思って。調べてみたら、あったあった。

* [ターミナルに黒魔道士](http://valvallow.blogspot.jp/2013/03/blog-post.html)
* [terminalで画像をcatできるようにした](http://blog.geta6.net/post/53187725909/terminal-cat)

　ANSI escape codeという見えない文字で文字色とか背景色とか変えれるんですね。それで半角スペースに色をつけてやると。
コードとして定義されてるのは16色までっぽいですが、xterm-256などターミナルの設定を256色向けにしてれば`\033[48;5;{num}m`みたいな形で表示もできるとのこと。
>http://en.wikipedia.org/wiki/ANSI_escape_code

　ということで、プログラムを作ってみました。画像を読み込んで、その画素のRGBデータをANSI escape codeに変換して表示します。言語はRuby。覚えたてなので変な書き方してるところがあるかもですがご容赦を。

* [termdots](https://github.com/tota66/termdots)

　画像読み込みにRMagickを使ってます。ほんとは使わずに画像形式判断して画素データとってくることを考えていたけど、楽だしとりあえずこれで。

![ikaros.png](https://qiita-image-store.s3.amazonaws.com/0/38732/7534b574-7c6f-1184-053a-9ab06faa3ab8.png) ←読み込む画像はこちら。システムカラーだけ使って無理やり作ったからちょっと色が変ですが。


　あとは実行コマンドを.bash_profileなり.zprofileなりに埋め込んで起動させてやれば、わーい
![sc_140427_01.png](https://qiita-image-store.s3.amazonaws.com/0/38732/b376c433-4ada-260c-cc60-d6c12a008bc0.png)
　「そらのおとしもの」のイカロスとスイカがこんにちはしてくれました！これでGWも寂しくないね！？


　256色もいけた
![sc_140427_02.png](https://qiita-image-store.s3.amazonaws.com/0/38732/b5148e10-c59f-d134-6898-f0e7328b3223.png)

そらのおとしもの、好きなんですがついこの間[劇場版が公開](http://kadokawa-anime.jp/soraoto/index.html)されたので、楽しみです。胸のベルが鳴るー
SublimeText＋phpenv/rbenv環境でビルドする

SublimeText3でPHPやRubyをビルドしようと思ったのですが、phpenvやrbenvを使っていて少しハマったのでメモ。
使用OSはLinuxMint15です。Macの方は専門外ですので頑張って探してみたりしてください……。

#何が問題なのか？
rbenvやphpenvでRubyやPHPをインストールしている場合、普通にRubyやPHPをビルドしようとすると、（apt-getやyumの）パッケージでインストールした方でビルドされてしまいます。
もちろん、パッケージでRubyやPHPをインストールしていない場合エラーが出ます。

というわけで、ビルドするためには通常と異なる設定をする必要があります。

 
##phpenvの設定

```PHP.sublime-build
{
  "cmd": ["/home/username/.phpenv/shims/php", "$file"],
  "selector": "source.php",
}
```
上記のパスはユーザーのホームディレクトリに.phpenvを置いている場合です。
usernameは自身のユーザ名に変更してください。

ちなみに、以下のコマンドでphpコマンドのパスが通っている場所が確認できます。

```bash
$ which php 
```

パスにはこのコマンドで表示されたパスをコピペすればOKです。

上記のファイルをSublimeTestのPackagesフォルダに保存。
私はPackagesの中のUserディレクトリに保存しました。

これでCtrl+bでphpenvでインストールしたPHPでビルドができるようになります！


##rbenvの設定
```rbenv.sublime-build
{
  "cmd": ["/home/username/.rbenv/bin/rbenv", "exec", "ruby", "$file"],
  "selector": "source.ruby"
}
```
rbenvの場合はオプションが2つ必要になります。
ファイル名はrbenvになってますが、Build Systemのところに表示される名前が変わるだけですので好きに変更してください。

パスの確認はphpenvと同じように`$ which ruby`でOKです。
このファイルを、先ほどと同じようにPackagesフォルダに保存します。

システム側とrbenv側どちらが優先されているのか確認したい方は、適当なrbファイルを作り「puts system("ruby -v")」と書いてCtrl+bでビルドして確認してみましょう。
rbenv側のRubyのバージョンが表示されれば成功です。
一度rbenv側でビルドすると（最初から？　確認し忘れました）、そのあとはAutomaticにしておいてもrbenv側でビルドしてくれるようになります。
即売会サービスを作ろう７


今回はサークル作成機能を作ります。

## 画像のアップロードについて

このファイルはxxx形式だよーと伝えるのに使うmine typeですが、
Androidは MimeTypeMap#getMimeTypeFromExtension(http://developer.android.com/reference/android/webkit/MimeTypeMap.html#getMimeTypeFromExtension(java.lang.String) )
というapiがあって、こちらを使うと一発でした。ファイルの拡張子に紐付いているので偽装ファイルだと難しそうです。


## Google Cloud Storage
CloudPlatform がバージョンアップしてAppEngineの１アプリごとに専用のCloudStorageバケットができるようになったようです(正確にはproductid単位かな？)。バケット名がドメイン名になっているのでproductとdevでいちいち処理を分ける必要がなくなって便利ですね。 Pythonだと `os.environ['DEFAULT_VERSION_HOSTNAME']` で一発



## 通信とコンテキスト
サーバに通信している時に、その旨が書いてあるウィンドウを出そうと
ProgressDialog を使ったのですが、これの生成時に使うパラメータに ApplicationContext を使うと、アプリがクラッシュします。なにがなんでも Activity.getContext() を入れましょう

## まとめ
ということで 本日の進捗は https://github.com/nagai/freemarket/tree/20140426 こちらです
次回はアイテム登録機能を作ります。
Sinon.JSのFakeServerでAjaxをテストする

今更感漂うのだけど……　FakeServerを使ってAjax関連のテストを書く機会があまりないので、書いておかないと忘れてしまうのでメモを。

```js
// jQuery + Mocha + expect.js + Sinon.JS

suite('API', function() {

  var server;

  beforeEach(function() {
    // 疑似サーバの生成
    server = sinon.fakeServer.create();
  });

  afterEach(function() {
    // スタブのXHRとかを戻す
    server.restore();
    server = null;
  });

  it('データが返ってくること', function(done) {
    var res = 200,
        head = {'Content-Type': 'application/json'},
        body = JSON.stringify({
          data: 'data'
        });

    // レスポンスの指定
    server.respondWith('POST', '/path/to/api', [
      res, head, body
    ]);

    // リクエスト
    $.post('/path/to/api', function(data, textStatus, jqXHR) {
      expect(JSON.parse(data).data).to.be('data');
      done();
    });

    // 疑似サーバからレスポンスを返す
    server.respond();
  });

});
```

確かこんな感じ。
【PHP】IEでセッション保存されない問題

cakephpでIEでだけセッションが保存されない問題発生。原因は単純でした。
ローカル環境で開発をしていて「bonkun_love.com」のようにドメイン名にアンダーバーは使用していたのですが、これがいけなかったようです。アンダーバーを使うとIEではセッションを保存してくれません。
セッションやIE云々以前にドメイン名にアンダーバーを使ってはいけないのですよね。他のブラウザだとアンダーバーがあっても空気を読んでうまいことやってくれますが、IEは駄目なようです。
herokuでThe page you were looking for doesn't exist.

##追記
時間おいてもう一度プッシュしたら、なぜか普通にデプロイできるようになりました。

##もともとの内容

ついこないだまでなんともなかったのに、
新しくrailsアプリを作成してgit push heroku master してheroku側のページを表示したら、下記のようなメッセージのページがでるようになった。

```
#http://hogehoge.herokuapp.com/
The page you were looking for doesn't exist.
You may have mistyped the address or the page may have moved.
If you are the application owner check the logs for more information.
```


stackoverflowで
http://stackoverflow.com/questions/23180650/how-to-solve-error-missing-secret-key-base-for-production-environment-on-h

```
Add config/secrets.yml to version control and deploy again. You might need to remove a line from .gitignore so that you can commit the file.

I had this exact same issue and it just turned out the the boilerplate Github .gitignore included config/secrets.yml even tho rails new generates a file that is safe for version control.
```

いや、secrets.ymlに、secret_key_baseをリポジトリにいれんなって書いてあるやん。

```yaml:secrets.yml
# Do not keep production secrets in the repository,
# instead read values from the environment.
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

```

heroku側で SECRET_KEY_BASE を設定する必要があるということか。


開発環境側からherokuの環境変数を確認してみたけど、設定されてるぞ？

```shell-session
$ heroku config                                                                                                                       
=== herokunoappname Config Vars                                                                                                                                                    
DATABASE_URL:                 postgres://xxxxxxxxxxxxxxxxxxxxxxx                                    
HEROKU_POSTGRESQL_HOGE_URL: postgres://xxxxxxxxxxxxxxxxxxxxxxx                                     
LANG:                         en_US.UTF-8                                                                                                                                             
RACK_ENV:                     production                                                                                                                                              
RAILS_ENV:                    production                                                                                                                                              
SECRET_KEY_BASE:              xxxxxxxxxxxxxxxxxxxxxxx

```

他のページで同事象への対応として挙げられていた、アセットのプリコンパイルやDBのproduction環境でのmigrateも行っている。
よくわからん。
Quick Helpを活用する

xcodeで開発していて右側のユーティリティパネルにある Quick Helpって何の役に立つの、という話。
![スクリーンショット 2014-04-27 20.46.26.png](https://qiita-image-store.s3.amazonaws.com/0/3847/4efd364f-7525-f837-f809-458adc48665f.png)


簡単な結論としては、公開メソッドのヘッダファイルに javadoc 形式で説明を書いておくと、そのメソッドを呼び出しているコードの編集中に Quick Helpに表示されますよ、ということ。

たとえば AppControllerクラスに helloメソッドを用意しているとき、 AppController.hのメソッド宣言部にこんな風に書く
![スクリーンショット 2014-04-27 21.08.34.png](https://qiita-image-store.s3.amazonaws.com/0/3847/b0c2fc70-23ff-cee1-165c-657fd53541fe.png)

で、このメソッドを他のところから呼ぼうとする
![スクリーンショット 2014-04-27 20.46.17.png](https://qiita-image-store.s3.amazonaws.com/0/3847/9aa1bb01-026d-6588-1f13-9f74a72deb42.png)

すると Quick Helpにさっき書いた内容が表示されるようになる。

![スクリーンショット 2014-04-27 21.08.18.png](https://qiita-image-store.s3.amazonaws.com/0/3847/5ce8d675-179e-2187-013d-2ed85a68db96.png)

参考: http://stackoverflow.com/questions/4286728/create-quick-help-entry-in-xcode

stackoverflowにかかれているように Code Snippetとして貼り付けできるようにしておくと便利。
Prologは定理証明系として、健全だが完全ではない

Prologは定理証明系として、健全だが完全ではない
==============
2013/08/15      @suharahiromichi

2014/04/19      @suharahiromichi、追記

2014/04/27      @suharahiromichi、Qiitaに投稿、後半を削除。

# Prologの健全性と完全性
## 健全性と完全性
第一階述語論理（Horn節に限定）の定理証明系として、Prologは健全だが、完全ではない。

* 健全性：××が健全とは、全ての、××で証明できる論理式は、充足可能な論理式である。
* 完全性：××が完全とは、全ての、充足可能な論理式は、××で証明できる論理式である。

 + 「全ての」は論理式にかかる。
 + 「充足可能」とは、変数に具体的な値を当てはめて、と言い換えてよい。ただし述語論理なので、一般に変数のとりうる範囲は無限である。
 + 「証明できる」とは、**有限**の証明がある、と言い換えてよい。
 + 健全性と完全性は、「逆」の関係にある。


## 導出原理(Resolution)
Resolutionは、健全かつ完全である。

コワルスキの「論理による問題の解決」([文献1.])には、
>証明手続の完全性を保証するためには、
>探索空間が完全であるばかりでなく、
>探索戦略もすべての場合を尽くさなければならない。

と書いてある。この本はPrologについて述べてはい**ない**ことに注意。
もう少し厳密にいうと、ResolutionにおけるSLD反駁そのものは計算規則について独立、つまり、導出のステップにおいて次にゴールのどの述語を展開するかを規定しない。
つまり、コワルスキは計算規則が適切であるならば完全だ、と言っているわけだ。

## Prolog
Prologは、深さ優先探索をするので、**完全性**が保証されない。

Prologは、Resolutionにおける節の選択を、最左から深さ優先で探索することで実行するものである。SLD反駁の計算規則を厳密に定めたものがPrologであるといえる。

健全性はResolutionの場合と同様に成立する。ひとたび証明できてしまえば同じであるため。

### 例1
ゴールの最左の論理式が無限に展開できてしまう場合は証明が終わらず、その論理式は証明できないことになる。これは完全性に対する反例になっている。

「論理プログラミングの基礎」にある例 ([文献2.]p.59、表記は改めた)：

    p(X, Z) :- q(X, Y), p(Y, Z).
    p(X, X).
    q(a, b).

    ?- p(X, b).

これは、X=aの解があるが、第一節を

    p(X, Z) :- p(Y, Z), q(X, Y). 

とするか、または、最**右**から深さ優先で探索すると、探索木の展開が無限になり、証明できない。

### 例2
Prologのようなシーケンシャルな探索をおこなう限り、証明できないプログラムが存在する。

「論理プログラミングの基礎」にある例 ([文献2.]p.62、表記は改めた)：

    p(a, b).                            % 1.
    p(c, b).                            % 2.
    p(X, Z) :- p(X, Y), p(Y, Z).        % 3.
    p(X, Y) :- p(Y, X).                 % 4.

    ?- p(a, c).                         % goal

これは、

            p(a, c)
    p(a, Y)     ,    p(Y, c)
    p(a, b)     ,    p(c, Y)
    (成功)           p(c, b)
                    (成功)

と探索木が展開でき成功する。
これは人間が介入して恣意的に解いた場合であり、[文献2.]では「探索規則がフェアである」という（可能性を見過ごさないということ）。
しかし、シーケンシャルな探索はフェアではないので、3.を繰り返すか、4.を繰り替えしてしまい、終了しない。これも完全性に対する反例になっている。


## 出現チェック(Occurs Check)
ResolutionにおいてOccurs Checkを省くと**健全性**が失われる。

「論理プログラミングの基礎」にある例 ([文献2.]p.49、表記は改めた)：

    test :- p(X, X).
    p(X, f(X)).

    ?- test.

Occurs Checkをしない場合、p(X, X)とp(X, f(X))が一致してしまい、結果はyesとなる。これは、健全性に対する反例になっている。

Occurs Checkを省いても証明できる論理式が減ることはないので、完全性が失われることはない。


## 失敗による否定
失敗を否定とみなす規則とは、論理式Aの否定(~A)が証明できることを、Aがシーケンシャルな検索で失敗する（有限失敗）と定めることである。

有限失敗と否定の関係について、エルブラン・ベースを使った説明は以下を参照のこと。
http://qiita.com/suharahiromichi/items/eb619df5ffecadc1d763


# 参考文献

1. R.コワルスキ、浦 監訳「論理による問題の解決」培風館
2. J.W.ロイド、佐藤 他訳「論理プログラミングの基礎」産業図書

**以上**
UILabelの文字に枠をつけ、袋文字（縁取り文字）を作る

UILabelのサブクラスを用いて、下図のような袋文字（縁取り文字）を描画します。

![スクリーンショット 2014-04-27 20.59.47.png](https://qiita-image-store.s3.amazonaws.com/0/42150/04d3d416-7ed3-79a9-bfa4-81ae39fe87fc.png)


まず、UILabelを継承したサブクラスを作ります。

```objectivec:UIOutlineLabel.h
@import UIKit;

@interface UIOutlineLabel : UILabel

@property(nonatomic) UIColor *outlineColor;
@property(nonatomic) NSInteger outlineSize;

@end
```

```objectivec:UIOutlineLabel.m
#import "UIOutlineLabel.h"

@implementation UIOutlineLabel

- (id)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        // デフォルト値
        _outlineColor = [UIColor whiteColor];
        _outlineSize = 2;
    }
    return self;
}

- (void)drawTextInRect:(CGRect)rect
{
    CGContextRef cr = UIGraphicsGetCurrentContext();
    UIColor *textColor = self.textColor;

    CGContextSetLineWidth(cr, _outlineSize);
    CGContextSetLineJoin(cr, kCGLineJoinRound);
    CGContextSetTextDrawingMode(cr, kCGTextStroke);
    self.textColor = _outlineColor;
    [super drawTextInRect:rect];

    CGContextSetTextDrawingMode(cr, kCGTextFill);
    self.textColor = textColor;
    [super drawTextInRect:rect];
}

@end
```

以下のように利用します。

```objectivec:
    UIOutlineLabel *label = [[UIOutlineLabel alloc] init];

    // 通常の設定
    label.frame = CGRectMake(0, 0, 100, 50);
    label.textColor = [UIColor whiteColor];
    label.font = [UIFont boldSystemFontOfSize:30];
    label.text = @"Hello world";

    // 袋文字用の設定
    label.outlineColor = [UIColor blackColor]; // 縁取りの色
    label.outlineSize = 3; // 縁取りの太さ

    [self.view addSubview:label];
```

Interface Builderを用いる場合はIdentity InspectorのCustom ClassにUIOutlineLabelを設定します。

![スクリーンショット 2014-04-27 20.33.53.png](https://qiita-image-store.s3.amazonaws.com/0/42150/63a98fb8-8ba3-fbde-aaa7-218aa6e376fd.png "スクリーンショット 2014-04-27 20.33.53.png")
LinuxでのSublimeTextの日本語入力

SublimeText3のLinux版は、Windows環境と同じく日本語入力に対応していません。
Windows環境ではIMEsupportパッケージをインストールすれば終了ですが、Linux環境での日本語入力についてはなかなか良い環境が見つけられなかったのでメモ。
（※ちなみに私はLinux初心者です）

結論から言うと、見つかったのは3つあるのですがその中で一番おすすめなのはSublimeMozcInputです。

#その1：InputHelper
>参考：http://d.hatena.ne.jp/dai_yamashita/20121004/1349354987

記事を読んでもらえばわかりますが、ダイアログが開いてそこに入力するというもの。
しかし、プログラミングするには効率が悪そうにしか見えない……。
ということで別のものを探すことに。

#その2：SublimeIbus
>参考：http://tigawa.github.io/blog/2013/06/07/sublimeibus/

これはｷﾀ━(ﾟ∀ﾟ)━!と思い、インストールしてみました。
が、小さいとはいえダイアログ（？）が開いたり不安定だったり（何故かDelete出来ない、切り替えれなくなる、など）とメインエディタとして使っていくには不安が残る挙動。

#その3：SublimeMozcInput
>参考：http://yasuyuky.github.io/SublimeMozcInput/

上記URLの画像を見て「これだ！！」となったので、インストール。
インストール方法は上記URLページのInstallation見てもらえればわかると思いますが、一応書いておきます。

##インストール方法
1. Mozcとemacs-mozcをインストール
2. SublimeTextにPackageControlをインストール
3. Ctril+Shift+Pでコマンドパレットを開いて「Package Control:Add Repository」を選択し、「https://github.com/yasuyuky/SublimeMozcInput」と入力してリポジトリを追加
4. コマンドパレットから「Package Control:Install Package」で「SublimeMozcInput」を選択してインストール

これだけで完了です！
私はSublimeText3ですが、公式ページには2と3両方対応と書いて有りますね。

##キーバインド
なお、デフォルトのキーバインドは「ctrl+¥」です。
私はキーが遠いと使いにくく感じるので「ctrl+space」に変更しています（方法は公式ページに書いてあります）。
全角/半角キーにキーバインド出来ればよかったんですが、全角/半角キーにキーバインドは出来ないみたいです……残念！

これでLinuxでも快適な日本語入力環境が！
ということで、作者の方にこの場を借りてお礼申し上げます。


###2013/05/02　追記
[Ubuntu12.04にSublimeText2のインストールと日本語入力設定](http://qiita.com/kanpou_/items/bc739c1215fc222f17c8)
こちらの記事で、本記事を参考にSublimeText2でのSublimeMozcInputの導入を行なって頂いたそうです。
その結果SublimeText2でも出来たとのことなので、SublimeText2でも同様の手順で導入可能のようですので追記しておきます。

ちなみに本記事よりインストールの手順など詳細に説明されておられるので、これからインストールされる方はこちらの記事の方が参考になるかと思いますｗ
libGDXでアルファ（半透明）が効かないときのチェックポイント

libGDXのShapeRendererで描画する際にアルファブレンディングが効かなくてハマりました。
![2014-04-27 20.46.06.png](https://qiita-image-store.s3.amazonaws.com/0/42140/4e782d25-3969-7596-c7c3-0847eac539df.png)
　マゼンタの四角形を描画していますが、左側の四角形はアルファが効いていません。
　右は意図通り５０％アルファが効いています。


# ソース
ソースは以下のとおりです。

## 左側（アルファ効いてない）

```java:left
        Gdx.gl.glEnable(GL20.GL_BLEND);
        Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
        renderer.begin(ShapeType.Filled);
        renderer.setColor(1, 0, 1, 0.5f);
        renderer.rect(50, 50, 300, 300);
        Gdx.gl.glDisable(GL20.GL_BLEND);
        renderer.end();
```

## 右側（アルファ効いてる）

```java:right
        Gdx.gl.glEnable(GL20.GL_BLEND);
        Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
        renderer.begin(ShapeType.Filled);
        renderer.setColor(1, 0, 1, 0.5f);
        renderer.rect(450, 50, 300, 300);
        renderer.end();
        Gdx.gl.glDisable(GL20.GL_BLEND);
```

# 原因

　アルファが効いていないほうは、 `game_.renderer.end();` を呼ぶ前に、`Gdx.gl.glDisable(GL20.GL_BLEND);` でアルファブレンディングを無効にしてしまっていました。
　
 間抜けすぎるー

　`game_.renderer.end();`が呼ばれた時点で実際に描画がまとめて実行されるので、その前にアルファ無効化しちゃダメってことですね。
　OpenGLの気持ちになって考えればすぐわかることだった…。

　そういう理屈なので以下のように書いてもアルファは効きます。
　※解りづらいのでオススメはしない。

```java:AlphaOk
        renderer.begin(ShapeType.Filled);
        renderer.setColor(1, 0, 1, 0.5f);
        renderer.rect(450, 50, 300, 300);
        Gdx.gl.glEnable(GL20.GL_BLEND);
        Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
        renderer.end();
        Gdx.gl.glDisable(GL20.GL_BLEND);
```
Rails4+MongoDB+Herokuでサイトのサムネイル画像を保存・参照する方法


# 概要

画像を生成するライブラリはいくつかありますが、調べた中で一番簡単に実装できた方法を紹介します。

前提として無料でサービスを公開できることを目指した結果、PaasはHeroku、画像はHerokuのMongoDB（最大50MB）にBinaryデータとして画像を保存することにしました。

他に候補としてAmazonS3などがありますが、アクセス数（転送データ量）に応じて従量課金されるので外しました。本格的にサービスを作るならS3やレンタルサーバなどを借りた方がいいかと思います。

## 構成

- Ruby2.1.1
- Rails4.0.4
- MongoDB


# Railsの実装
railsの基本的なアプリの作り方は省きます。Mongoidを使う上での注意点として、rails newするときにActiveRecordを含めないよう、-Oオプションを指定します。

## Mongoid

Gemfileに以下を追加します。Rails4.xを使う場合、Mongoidも4.xを使う必要があります。現時点では4.0.0.beta1が最新なので、バージョンを指定します。また、Binaryオブジェクトを使うため、bsonとmopedも追加します。

```
gem 'mongoid', '4.0.0.beta1'
gem "bson"
gem "moped", github: "mongoid/moped"
```

参考：http://rubygems.org/gems/mongoid

Mongoidの4.xでMoped::BSONを使うために、config/application.rb に以下の記述を追加する必要があります。

```
require "bson"
require "moped"

Moped::BSON = BSON
```

参考：https://github.com/mongoid/mongoid/issues/3455

## IMGKit

スクリーンショットを作成するためのライブラリはいくつかありますが、導入が簡単そうで、Herokuでも使用できることからIMGKitを使うことにします。

Mac上で使う場合は、wkhtmltoimageをダウンローとして/usr/local/binに置きます。（パスが通ればどこでもいいです。）

参考：http://weble.org/2012/06/01/mac-wkhtmltoimage
参考：https://github.com/csquared/IMGKit

## 画像の保存と参照

Modelのfieldには、type: Moped::BSON::Binary を指定します。これでBinaryデータが保存できます。

```
class Site
  include Mongoid::Document
  field :thumb, type: Moped::BSON::Binary
  ...
end
```

保存するためのControllerの処理は、以下のようにします。

```
def create
  img = IMGKit.new("http://example.com", quality: 50)
  site = Site.new
  site = Moped::BSON::Binary.new(img.to_img)
  site.save
  ...
end
```

参照は /img/(:id) のURLで取得したいので、以下のようにします。保存するfieldはthumbですが、取得するときはthumb.dataになることに注意してください。また、アクセスのたびにDBにアクセスするのは効率が悪いので、2回目以降はキャッシュを使うようにするといいと思います。

```
def img
  site = Site.find(params[:id])
  img = site.thumb.data if site.try(:thumb)
  send_data(img, filename: "#{site._id}.jpg", type: "image/jpeg", disposition: "inline")
end
```
参考：http://mongoid.org/en/mongoid/docs/documents.html
参考：https://github.com/csquared/IMGKit
参考：http://railsdoc.com/references/send_data

# Herokuにデプロイする際の設定
## Rails4

Rails3までと4では、設定が少し変わっていましたので、公式のドキュメントを参照しました。Gemfileに以下が必要となります。

```
ruby "2.1.1" # 使用するRubyのバージョン
gem 'rails_12factor', group: :production
```

参考：https://devcenter.heroku.com/articles/getting-started-with-rails4

## Mongoid

config/mongoid.yml にproductionの設定を追加します。書き方はMongoid 3.xと同様で動きました。

```
production:
  sessions:
    default:
      uri: <%= ENV['MONGOHQ_URL'] %>
```

参考：https://devcenter.heroku.com/articles/mongohq#mongohq-replica-sets

## IMGKit

./bin に wkhtmltoimage-amd64 を配置し、gitのリポジトリに追加します。

```
IMGKit.configure do |config|
  config.wkhtmltoimage = Rails.root.join('bin', 'wkhtmltoimage-amd64').to_s if ENV['RACK_ENV'] == 'production'
end
```


参考：https://github.com/csquared/IMGKit
参考：http://log.miraoto.com/2012/07/632/

## 日本語が化ける

heroku上でスクリーンショットを取ると、日本語の文字が正しく表示されません。これを防ぐには、fontファイルを/.fontsに配置してgitリポジトリに追加すればOKです。fontファイルはAPIフォントを利用しました。

参考：http://qiita.com/ssuzuki@github/items/58be855f909f29c05ae6
参考：http://d.hatena.ne.jp/shinichitomita/20120519/1337479457
参考：http://ipafont.ipa.go.jp/
aar and apklib format

Androidのライブラリプロジェクトのパッケージングには`apklib`と`aar`という二種類の規格が存在する｡大きく分けるとこんな感じ｡

- `apklib`: maven-android-pluginでサポートしている規格｡Google公式のものではなくサードパーティ製｡
- `aar`: GradleのAndroid Pluginと共に登場した規格｡今ではこちらが主流｡

Androidを始めたのがつい半年程前なので､その頃には既にaarがメインストリームになっていて､apklibって何ですか？という状態だった｡ネットを調べてもapklibの情報が載っているページはあんまり無くて､しばらく理解できてなかった｡

apklibの場合はMavenのビルド用にapklibを用意しつつ､Eclipseのローカルビルドの為にライブラリプロジェクトをcloneしてきて開発をしないといけない､つまりダブルメンテが発生するので割と最悪だと思う｡一方でaarはそういう必要がないけど､Eclipseで取り扱う事ができないので個人で開発するにはいいけど会社でこれからaar一本で行きますみたいなのはまだ厳しかったりする｡

ちなみに､Android Studio(IntelliJ)はapklibをいい感じに解凍してローカルでの依存関係を解決してくれるので便利｡EclipseとAndroid Studioを併存させたいのであればapklibをしばらく使わざるを得ない｡

内部構造がどうなってるのか気になったので調べてみた｡両者とも実体はzipなのだが､微妙に内容が違った｡

### apklib format

```
+ AndroidGridViewCompatLib.apklib
  + src
  + res
  + AndroidManifest.xml
  + project.properties
```

### aar format

```
+ AndroidGridViewCompatLib.aar
  + /AndroidManifest.xml (mandatory)
  + /classes.jar (mandatory)
  + /res/ (mandatory)
  + /R.txt (mandatory)
  + /assets/ (optional)
  + /libs/*.jar (optional)
  + /jni/<abi>/*.so (optional)
  + /proguard.txt (optional)
  + /lint.jar (optional)
```

apklibにはsrc/main/javaのソースディレクトリが含有されるけど､aarにはclasses.jarという形式で含まれるらしい｡相互を一発変換できると便利なのだけど､formatをみる限り厳しそうだ｡知見を持ってる方がいたらシェアして頂きたい｡

## 参考
- [apklib format](https://code.google.com/p/maven-android-plugin/wiki/ApkLib)
- [aar format](http://tools.android.com/tech-docs/new-build-system/aar-format)