OmniAICreator/Qiita-1.07M huggingface dataset:
写真を共有するとき

**2014/01/04 1:47追記**
全然違いました。PicPlayなど確かにWRITE権限/READ権限の有無で挙動が違うアプリもあるようなので、Intentの指定部分はこれだけでもいいですが、Seesmicは以下のコードだけではダメなようです(なぜか以前は上手くいったと思っていた)。

実際はというと、SeesmicはIntent.EXTRA_STREAMで「file://」なURLを送ることには対応していないようです。必ず「content://」なURLで渡す必要があります(この動作は望ましいものなのかどうかはわかりませんが。脆弱性対策的な意味でもあるのかな？)。

そんなわけで、MediaStoreに登録済みの画像であれば、その「content://」なURLを取得して渡すようにしましょう というのが正解です(Android標準のGalleryアプリもこのような挙動なので、さすがにこれで不具合を起こすようなアプリはないものと思われます というか、思いたい)。

Fileから、「content://」のURIを取得するには、以下のようにします。

```java:MediaStoreに登録されていない画像である場合
  File file = /* 適当なFile(外部ストレージ上に保存している画像であること) */
  ContentResolver cr = context.getContentResolver();
  ContentValues cv = new ContentValues();
  cv.put(MediaStore.Images.Media.TITLE, file.getName());
  cv.put(MediaStore.Images.Media.DISPLAY_NAME, file.getName());
  cv.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());
  cv.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
  cv.put(MediaStore.Images.Media.DATA, file.getAbsolutePath());
  Uri uri = cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, cv);
```

```java:MediaStoreに登録済みの画像である場合
  File file = /* 適当なFile(外部ストレージ上に保存している画像であること) */
  ContentResolver cr = context.getContentResolver();

  Cursor c = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
      new String[] { BaseColumns._ID },
      MediaStore.Images.ImageColumns.DATA + " LIKE ?",
      new String[] { Uri.fromFile(file).getPath() }, null);
  c.moveToFirst();
  long id = c.getLong(c.getColumnIndex(BaseColumns._ID));
  c.close();
  Uri uri = Uri.withAppendedPath(
      MediaStore.Images.Media.EXTERNAL_CONTENT_URI, Long.toString(id));
```
ここで取得したuriをIntent.EXTRA_STREAMの値に設定することで、Seesmicでも読み取れる方法で写真を共有することが出来ます。

# 以下、原文
Androidで写真を別アプリに共有させたいときは、大体の場合次のように書くと思います

```java:通常の場合
  File file = /* 送信したいファイルを指定 */
  Intent intent = new Intent(Intent.ACTION_SEND);
  intent.setType("image/jpeg");
  intent.setClassName(/*起動したいアプリのパッケージ名*/, /*起動したいアクティビティのクラス名*/);
  intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
  try {
    startActivityForResult(intent, REQUEST_SEND);
  } catch (ActivityNotFoundException e) {
    Toast.makeText(getActivity(), ”アプリケーションの起動に失敗しました”, Toast.LENGTH_SHORT).show();
  }
```

こんな感じでも大体大丈夫なのですが、一部のアプリはこのインテントでは画像を処理してくれなかったり、共有先のアプリが正常に動作しないことがあるようです(Seesmic Ver1.8.13、PicPlay Pro Ver3.5.1で確認)。

結論から言うと、FLAG_GRANT_READ_URI_PERMISSIONやFLAG_GRANT_WRITE_URI_PERMISSIONが設定された画像でないと、上手く動作しないアプリがあるようです。
なので、とりあえずこういう風に指定したら良い。

```java:改善案
  File file = /* 送信したいファイルを指定 */
  Intent intent = new Intent(Intent.ACTION_SEND);
  intent.setType("image/jpeg");
  intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); /* 追加 */
  intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); /* 追加 */
  intent.setClassName(/*起動したいアプリのパッケージ名*/, /*起動したいアクティビティのクラス名*/);
  intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
  try {
    startActivityForResult(intent, REQUEST_SEND);
  } catch (ActivityNotFoundException e) {
    Toast.makeText(getActivity(), ”アプリケーションの起動に失敗しました”, Toast.LENGTH_SHORT).show();
  }
```

本当はIntent#setClipData()も使うといいらしいのですが、そのへんはよくわからなかったのでひとまずこのまま。
インテントについてはまだよく理解できてないところもありそうですが、ひとまずこれでちゃんとアプリが起動できます。
Unity(C#)で回転を制御する


Unity(C#)で回転を制御するには、Quaternion（クォータニオン）を使います。
（いくつかのメソッドなどでオイラー角とかも使えますが、内部的には全部クォータニオンで制御しているようです）

UnityのGameObjectにはtransformプロパティがあり、positionやrotationなどいわゆる姿勢制御を司るプロパティです。

そのため、いくつかの便利メソッドが生えていて、それを経由して回転を制御することもできます。

##transformが持つメソッド
* Rotate … オブジェクトを現在の姿勢から相対的に回転させる。
* RotateAround … とある点を中心に、与えられた軸の方向へ回転するメソッド。引数はそれぞれ、[中心点]、[回転軸]、[回転角度]を与える。


##transformが持つプロパティ
* eulerAngles … オイラー角としての回転角。
* rotation … ローカル座標の回転。クォータニオン。
git push heroku masterがPermission deniedした際のメモ

herokuで`git push heroku master`する際に

>Permission denied (publickey).

が発生した。

sshの設定ファイルとして[1]が存在していたので、[2]が存在しなくても大丈夫だと思い、[1]を色々修正してみたものの改善せず。

結局、[2]のファイルを新規作成したらうまくいった。

[1] `...\AppData\Local\GitHub\PortableGit_...\etc\ssh\ssh_config`
[2] `~\.ssh\config`
VolleyのNetworkImageViewでNullPointerExceptionがthrowされてる件

エラーレポート見たらNetworkImageViewでぬるぽ（NullPointerException）がthrowされてる。

```java
java.lang.NullPointerException
       at com.android.volley.Request.(ProGuard:129)
       at com.android.volley.toolbox.ImageRequest.(ProGuard:71)
       at com.android.volley.toolbox.ImageLoader.get(ProGuard:220)
       at com.android.volley.toolbox.ImageLoader.get(ProGuard:171)
       at com.android.volley.toolbox.NetworkImageView.loadImageIfNecessary(ProGuard:150)
       at com.android.volley.toolbox.NetworkImageView.onLayout(ProGuard:193)
       at android.view.View.layout(View.java: …
```
アプリ側はアップデートしてないのにどういうことなの…

## 状況
・VolleyのNetworkImageViewを使用してサムネイルを表示してる
・異常に気づく前まで正常に動いていた
・アプリ側はアップデートとかしていない

## 原因
スタックトレース見てみるとVolleyのRequest.javaの129行目でエラーでてるみたい

```java
mDefaultTrafficStatsTag = TextUtils.isEmpty(url) ? 0: Uri.parse(url).getHost().hashCode();
```
あ。。。。。 Uri.parse(url)でnullが返ってきているから落ちてるのか。

### 原因はサーバ側で返しているURLがURI形式でない変な文字列を返していたことだった。

以下の場合ぬるぽがthrowされる

```java
String url = "hoge";
NetworkImageView networkImageView = new NetworkImageView(context);
networkImageView.setImageUrl(url); // ぬるぽで落ちる
```

とりあえずの回避方法としては、

```java
NetworkImageView networkImageView = new NetworkImageView(context);
if (TextUtils.isEmpty(url) || Uri.parse(url).getHost() == null) {
    // エラー情報をAnalyticsのイベントとかで送信してあげるといいかも
} else {
    networkImageView.setImageUrl(url);
}
```
Conventionプラグイン利用時の<s:include>の違い

## &lt;s:include&gt;の概要

JSPのインクルードと同様、JSPから別のJSPや静的リソースを読み込みます。
ただしConventionプラグインを導入していると、サーブレットコンテナで管理するWebコンテンツ：WEB-INF以下の構成も、Conventionプラグインの設定に従います。

具体的には、JSPファイルは /WEB-INF/content 以下に配置します(Conventionプラグインの設定で変更可能です）
content以下は、ActionクラスのNamespace設定と同じになります。

## インクルード先のURLの指定方法

パス設定は、/WEB-INF からのパス指定ないしは相対パスです。

ただしディレクトリ構成やNamespaceの構成が必ずしも一定ではないので、例えばとあるActionからは../../include/sample.jsp、もう一方は ../include/sample.jspと、不定になるので良くありません。
このため、次のように/WEB-INF/contentからのファイルパスと同じ設定します。

```jsp
<s:include value="/WEB-INF/content/includes/sample.jsp"/>
```
なでしこでメール送信

Qiita初投稿。
毎年、年賀状はメールで送っています。
今年はなでしこでメールを送ってみました。リファレンスみて10分かからなかった。超簡単。

```サンプルコード
#-------------------------------------
# メールの送信処理
#-------------------------------------
# メールの設定(以下を書き換えます)
メールホストは、「mail.hoge.co.jp」

# 以下は,GMailなど SSL認証が必要なサーバーで設定します
#--ここから
#メールIDは、「xxx」
#メールパスワードは、「xxx」
#メールオプションは、「SSL」# 認証方式「LOGIN/PLAIN/SSL」を。
#メールポートは、465
#--ここまで
メールIDは、「dharry」
メールパスワードは、「pass...」
メールオプションは、「LOGIN」# 認証方式「LOGIN/PLAIN/SSL」を。
メールポートは、587

ぼでぃ = 「
あけましておめでとうございます！
今年もよろしくお願いします。
--
dharry <dharry@example.co.jp>
」

# 宛先の一覧
「foo@gmail.com
hoge@gmail.com
bar@gmail.com」を反復
	# メールの内容について
	メール宛先は「{それ}」
	メール差出人は「dharry@example.co.jp」
	メール件名は「I wish you a Happy new year 2014!」
	メール本文は「{ぼでぃ}

	# 実際の送信処理
	メール送信。

「送信が終わりました」と表示。
```
NHK紅白の Android/iPhone アプリが .NET/Xamarin 製だったということ


新年あけましておめでとうございます。
今年も Xamarin 推しで参ります、よろしくお願いします。

2013年大晦日の紅白歌合戦、NHK が iPhone/Android 用のアプリを配信していました。

* [紅白アプリ｜第64回NHK紅白歌合戦](https://play.google.com/store/apps/details?id=jp.or.nhk.kouhaku.android&hl=ja)
* [紅白で「イェーガー！」と叫ぶために曲を見逃さないiPhoneアプリ、NHK紅白](http://weekly.ascii.jp/elem/000/000/192/192769/)

なんとこのアプリ、Xamarin 製だったとのこと。
紅白あんまり興味なかったのでノーチェックでしたわー。

<blockquote class="twitter-tweet" lang="ja"><p>紅白アプリXamarinなんか</p>&mdash; ゆたか (@tmyt) <a href="https://twitter.com/tmyt/statuses/413092620567470080">2013, 12月 17</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" lang="ja"><p>iPhoneの紅白アプリ、MvvmCross使ってるってことは、Xamarinで作ってるってこと？！ <a href="http://t.co/cTWPz2cp9E">pic.twitter.com/cTWPz2cp9E</a></p>&mdash; 菊池紘 (@kikuchy) <a href="https://twitter.com/kikuchy/statuses/417977438597959680">2013, 12月 31</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

このツイートを RT した後、ソッコーで Android 版を入れてみましたら、確かにクレジットに MvvmCross やら ActionBarSherlock for Xamarin やらならんでいました。

## 開発してるのは…

開発は、[スレイプニル](http://www.fenrir-inc.com/) で有名なフェンリルさんのようですね。

* [フェンリル株式会社 | スマートフォンアプリ開発 実績 NHK 紅白](http://biz.fenrir-inc.com/application_development/casestudy_app/nhk_kouhaku.html)

2年連続で作っておられるようですが、おととしから Mono(MonoTouch/Mono for Android) 製だったのかな？いやスゴいです！

## 使われているライブラリ

せっかくなので、Android/iOSアプリ両方の著作権表示から、使われている OSS ライブラリを列挙してみます。([こちらのエントリ](http://nkzn.hatenablog.jp/entry/2013/12/30/010956)にインスパイアされました)
当然ですが、すべて .NET/Mono で動作するライブラリばかりです。(ActionBar と Nimbus を除く)

### MvvmCross

* https://github.com/MvvmCross/MvvmCross
* クロスプラットフォームMVVMフレームワーク。[こちらでも](http://qiita.com/amay077/items/c4227663b5a5e540dc13) 紹介しました

### Json.NET

* http://james.newtonking.com/json
* .NET/Mono で JSON を扱うための事実上標準ライブラリ

### SocketIO4Net.Client

* http://socketio4net.codeplex.com/
* WebSocket4Net と組み合わせて使うっぽい？ライブラリ

### WebSocket4Net

* http://websocket4net.codeplex.com/
* .NET で WebSocket 使うためのライブラリ。

### SuperSocket.ClientEngine

* http://clientengine.codeplex.com/
* ソケット通信用ライブラリっぽい。

### MvxSettings

* https://github.com/jamesmontemagno/Mvx.Plugins.Settings かな？
* 設定情報をストアするための、MvvmCross のプラグイン

### ActionBarSherlock for Xamarin

* http://components.xamarin.com/view/XamarinActionBarSherlock
* スライドメニュー(NavigationDrawer) を実現するライブラリ。そういえばちょっと変わったスライドメニューでしたね。

### AsyncOAuth

* http://neue.cc/2013/02/27_398.html
* C#/LINQ の神であらせられる [@neuecc](http://neue.cc/2013/02/27_398.html) さん作の 非同期OAuthライブラリ

### Nimbus

* http://nimbuskit.info/
* iOS の UIパーツがいろいろ拡張されてる的なライブラリ？Xamarin.iOS で Binding して使ってるのかなあ？

### Html Agility Pack

* http://htmlagilitypack.codeplex.com/
* HTMLパーサライブラリ

生放送のテレビ番組向けアプリということで、リアルタイム通信に注力された様子が、使用されたと思われるライブラリからも伺えます。

## これは強力すぎる Xamarin 導入事例ですね

日本の最も有名なテレビ番組のスマホアプリに Xamarin が使われていたというのは大きな導入事例になること必至です。
アプリの性質上、期間限定となる可能性もあります。できればこのまま公開しつづけて欲しいですが、Xamarin を上司や提案先に紹介されたい場合は、お早めに、またキャプチャを多く撮っておかれる事をおすすめします。

最後に、今年が Xamarin 普及元年とならん事を近くの神社にお祈りして、新年最初のエントリの締めとします。
WindowsではじめるScala

基本的にはここに書かれている。  そしてまとめてみたら意外と分量があった。
http://www.scala-lang.org/download/

## 1.Java 1.6以上のインストール
ScalaはJVM上で動くので、Javaの環境が必要。そんなわけで、java と打って返事がないただの屍のようだ、となるか1.6未満の場合Javaをインストールする(※前提JREは今後変わる可能性もあるので、この辺りはインストール前によく確認)。
こちらからJava Platform (JDK) をダウンロード。
http://www.oracle.com/technetwork/java/javase/downloads/index.html

余談だが、Java、ダウンロードサイズ120MBというのはいかがなものか。開発環境じゃあるまいに・・・
Scalaも60MBあるので、こやつらを合計するとEclipse Standardとほぼ同じ重さになる。

## 2.Scalaのインストール
JDKのインストールが終わったら、念願のscalaをインストールする。
http://www.scala-lang.org/download/
バイナリ版があるので、普通にインストールすればOK。

## 3.環境変数の設定
コマンドから使えるよう、JDKとScalaの環境変数設定を行う。コントロールパネル＞システム　の、「システムの詳細設定」から設定可能。
ユーザー定義環境変数に新規追加で、名前：PATH、値：JDKをインストールしたフォルダにあるbinフォルダまでのパス＋Scalaをインストールした以下同文の値を設定(値は`;`で区切る)。
（システム環境変数でもＯＫだが、自分で設定したものとあらかじめ設定してあるものがごっちゃになるのでユーザー側を使用することを推奨）。
コマンドプロンプトから javac、scalaを打って何かしら反応があれば設定は完了。

## 4.開発環境のインストール
俺はメモ帳でいくぜ！という場合はスルーしても可だが、開発環境を入れる。  
環境はEclipseかIntelliJがお勧めで、どちらを使っても構わない。以前はEclipseだったが、IntelliJは最近Android Studioのベースに使われたりPython開発をサポートするPyCharmがあったりと勢いがかなりあるので、流れはIntelliJという気がしないでもない。ただ、これは宗教論争に発展するのでこれ以上の言及は避ける。

Eclipseを初めて入れる場合は、今時Webアプリケーション一つも作らんということもない気がするので、「Eclipse IDE for Java EE Developers」がよいと思う。

## 5.Scala開発用プラグインの設定
この辺りは開発環境に依存するので、それぞれ設定を行う。
Eclipseの場合は、こちらをご参考。
http://scala-ide.org/download/current.html
メモリが足りないかも、といわれるのでこちらを参考にeclipse.iniの設定を変更。
http://wiki.eclipse.org/FAQ_How_do_I_increase_the_heap_size_available_to_Eclipse%3F

## a.sbtのインストール
現段階で十分開発可能だが、Webアプリケーションなど色々依存関係がある複雑なアプリケーションを作成するにはプラグインは力不足なので、sbtというビルドツールの出番になる。
これはJavaで言うところのMavenにあたり、プロジェクトに必要なパッケージやライブラリの依存関係、またパッケージング処理などを行ってくれる。
現時点(2014/1)では、MavenのようにEclipseからGUIベースで操作できる環境はないので、sbtコマンドで処理->eclipseに反映、というのが基本スタイルになる。
そのため、まずコアとなるsbtをダウンロード、そのあとにsbt上の設定をeclipseに反映するsbteclipseを導入する。

sbtのインストール。WindowsならMSIインストーラーが断然楽。
http://www.scala-sbt.org/release/docs/Getting-Started/Setup.html#
そして例のごとく環境変数を設定。設定が終わったら、コマンドプロンプトからsbtを実行。これで必要モジュールがダウンロードされる。

sbtpluginの設定を追加する。以下のGithubに設定方法が記載されている(pluginのフォルダの中にplugin.sbtを作成、記載を追加)。
https://github.com/typesafehub/sbteclipse
再度sbtを実行すると、プラグインのセットアップが行われる。なお、ファイルのエンコードがUTF-8でなくUTF-8Nでないとエラーになった。うまくいかない場合はここを疑ってみるといいかも。

いったんsbt側でプロジェクトを作成したら、こいつでeclipseコマンドを実行し、eclipseのプロジェクト用ファイルを作成する。
コマンドプロンプトとEclipse、2つ立ち上げるのかよという場合は[こちら](http://sctfarch.blogspot.jp/2012/12/eclipse.html)を参考にして、Eclipseから打てるようにするとよい。ただ、なんかうまく動かないこともあるような・・・

以上で環境設定は終了。お疲れ様でした。
[自分用メモ]Capistrano3のlinked_filesって自分でuploadしなきゃダメですか？

RailsアプリをCapistrano3でデプロイするときの話。
config/deploy.rbに

```ruby:config/deploy.rb
set :linked_files, %w{config/database.yml}
```

という設定があり、
ここに指定したファイルはsharedディレクトリ配下にシンボリックリンクを作ってくれる。
なのでgitで管理したくないファイルを指定すると良い。
例のようにconfig/database.ymlといったgithubなどで公開したくないファイルを指定する。

しかしシンボリックリンクは貼ってくれるが、ファイルのアップロードは自前でやる模様。
まず、「ほんとに自前でアップロードしなくちゃいけないのか？」というのが疑問。
勝手にローカルからuploadしてほしいんだけど、linked_filesに指定しただけだとダメだった。

というわけでconifg/database.ymlをデプロイ時にアップロードするようにしてみた。

```ruby:config/deploy.rb
namespace :deploy do
  desc 'Restart application'
  task :restart do
    invoke 'unicorn:start'
  end

  desc 'Upload database.yml'
  task :upload do
    on roles(:app) do |host|
      if test "[ ! -d #{shared_path}/config ]"
        execute "mkdir -p #{shared_path}/config"
      end
      upload!('config/database.yml', "#{shared_path}/config/database.yml")
    end
  end

  before :starting, 'deploy:upload'
  after :finishing, 'deploy:cleanup'
end
```

deploy:uploadタスクはlinked_filesすべてをアップロードするようにしたほうが使い勝手が良いんだろうけど今回はとりあえずこれで良いと思う。
これでconfig/database.ymlをgit管理下から外した状態でデプロイはできた。

しかしもっと楽な方法がある気がするんだけどよくわからなかった。
cap installしてできたconfig/deploy.rbには

```ruby:config/deploy.rb
#set :linked_files, %w{config/database.yml}
```

こんな感じでコメントアウトされた状態で記述されていて、Capistrano3的にも「config/database.ymlはgit管理下から外してね」という意図を感じるのにアップロードは自前でやるというのが腑に落ちない。
「続柄」をErlangで(横へな6)

「[続柄](http://nabetani.sakura.ne.jp/hena/ord6kinship/)」をErlangでやってみました。他の皆様による実装は [第6回オフラインリアルタイムどう書くの問題](http://qiita.com/Nabetani/items/5e1c944541f09f0f9711) から辿れます。

```erlang:zokugara.erl
-module(zokugara).
-compile(export_all).

solve(Data) -> relation(
  [moms(list_to_integer(X)) || X <- string:tokens(Data, "->")]).

relation([X, Y | _]) -> relation(X, Y).
relation({X, _, _}, {X, _, _}) -> "me";
relation({_, X, _}, {X, _, _}) -> "mo";
relation({X, _, _}, {_, X, _}) -> "da";
relation({_, X, _}, {_, X, _}) -> "si";
relation({_, _, X}, {_, X, _}) -> "au";
relation({_, X, _}, {_, _, X}) -> "ni";
relation({_, _, X}, {_, _, X}) -> "co";
relation(_, _) -> "-".

moms(X) -> {X, mom(X), mom(mom(X))}.

mom(X) when X =< 1 -> 0;
mom(X) -> (X - 2) div 3 + 1.

test(Data, Expected) -> test(Data, solve(Data), Expected).
test(Data, Result, Expected) -> io:fwrite("~s: ~s -> ~s~n",
  [case Result =:= Expected of true -> ok; false -> ng end,
    Data, Result]).

tests() ->
  test("5->2", "mo"), %0
  test("28->10", "au"), %1
  test("1->1", "me"), %2
  test("40->40", "me"), %3
  test("27->27", "me"), %4
  test("7->2", "mo"), %5
  test("40->13", "mo"), %6
  test("9->3", "mo"), %7
  test("4->1", "mo"), %8
  test("1->3", "da"), %9
  test("12->35", "da"), %10
  test("3->8", "da"), %11
  test("6->19", "da"), %12
  test("38->40", "si"), %13
  test("9->8", "si"), %14
  test("4->2", "si"), %15
  test("15->16", "si"), %16
  test("40->12", "au"), %17
  test("10->4", "au"), %18
  test("21->5", "au"), %19
  test("8->2", "au"), %20
  test("3->5", "ni"), %21
  test("11->39", "ni"), %22
  test("2->13", "ni"), %23
  test("13->32", "ni"), %24
  test("14->22", "co"), %25
  test("40->34", "co"), %26
  test("5->8", "co"), %27
  test("12->10", "co"), %28
  test("1->27", "-"), %29
  test("8->1", "-"), %30
  test("12->22", "-"), %31
  test("2->40", "-"), %32
  test("32->31", "-"), %33
  test("13->14", "-"). %34
```

relation関数の引数には「{A本人, Aの母, Aの祖母}, {B本人, Bの母, Bの祖母}」が渡されます。引数パターンマッチングによって、これらのうちどの値が同じかを判定しています。Erlangの(パターンマッチングが使える言語の)本領発揮です。
C#にluaを組み込む方法

C#でLua: LuaInterfaceの後継NLua
http://riosu.hateblo.jp/entry/2013/09/06/143848

上記サイトを参考に、C#からluaファイルを読み出し、
luaファイルで定義した変数にC#側からアクセスする
ということをやってみました。

- https://github.com/NLua/NLua にアクセス
- Readme にある Win32:Download のアイコンから dll をダウンロードする
- VS2013でC#のプロジェクトを作成(今回は Windows フォームアプリを選択)
- ダウンロードしたファイルを解凍し、その中の3つのDLLをプロジェクトのbin/Debug or bin/Release にコピーする
- NLua.dll を プロジェクトの参照に追加する
- 以下のlua スクリプトを作成し、プロジェクトのbin/Debug or bin/Release に配置

```lua:test.lua
x = "lua:string test..."
```

- フォームにボタンを追加し、ボタンのClick イベントとして以下をコードする

```csharp:test.cs
NLua.Lua lua = new NLua.Lua();
lua.DoFile("./test.lua");
var x = lua["x"];
MessageBox.Show(x.ToString());
lua.Close();
```

- プロジェクトをビルドし、フォームのボタンを押すと、luaファイルに記述した文字列がメッセージボックスに表示される
DropwizardのAssets

Environmentsを確認。
Assetsを試す。
動作確認用に作ったのでResource、Health Checkは適当。

Dropwizardのバージョンは0.6.2。

# AssetsBundle

Service#initializeでBootstrap#addBundleを使ってAssetsBundleを追加する。
src/main/resources/assetsのファイルを/に割り当てる。

```java:AssetsService.java
package example.core.assets;

import com.yammer.dropwizard.Service;
import com.yammer.dropwizard.assets.AssetsBundle;
import com.yammer.dropwizard.config.Bootstrap;
import com.yammer.dropwizard.config.Environment;

public class AssetsService extends Service<AssetsConfiguration> {
    @Override
    public void initialize(Bootstrap<AssetsConfiguration> bootstrap) {
        bootstrap.setName("assets");

        bootstrap.addBundle(new AssetsBundle("/assets/", "/"));
    }

    @Override
    public void run(AssetsConfiguration configuration, Environment environment) throws Exception {
        environment.addResource(new AssetsResource());
        environment.addHealthCheck(new AssetsHealthCheck());
    }

    public static void main(String[] args) throws Exception {
        new AssetsService().run(args);
    }
}
```

# index.html

src/main/resources/assetsに以下のindex.htmlを作成。
jquery-2.0.3.min.jsも同じディレクトリに配置する。

```html:index.html
<html>
<head>
    <script src="jquery-2.0.3.min.js"></script>
    <script>
        $(function(){
            $.ajax({
                url: '/service/hello',
                success: function(data) {
                    $('#hello').text(data.content);
                }
            });
        });
    </script>
</head>
<body>
    <span id="hello"></span>
</body>
</html>
```

# 設定ファイル

JAX-RSのルートを変更する。
Assetsを使用する場合は必須。

```yaml:assets.yml
http:
  rootPath: /service/*
```


以上の実装、設定で http://localhost:8080/index.html を表示すると`hello`と表示される。


その他今回書いたもの

```java:AssetsConfiguration.java
package example.core.assets;

import com.yammer.dropwizard.config.Configuration;

public class AssetsConfiguration extends Configuration {
}
```

```java:AssetsResource.java
package example.core.assets;

import com.yammer.metrics.annotation.Timed;
import example.gettingstarted.Saying;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("hello")
@Produces(MediaType.APPLICATION_JSON)
public class AssetsResource {

    @GET
    @Timed
    public Saying hello() {
        return new Saying(1, "hello");
    }
}
```

```java:AssetsHealthCheck.java
package example.core.assets;

import com.yammer.metrics.core.HealthCheck;

public class AssetsHealthCheck extends HealthCheck {

    public AssetsHealthCheck() {
        super("assets");
    }

    @Override
    protected Result check() throws Exception {
        return Result.healthy();
    }
}
```
chefでcronを設定するときの注意点


結論を先に書くと、「cron resourceのcommandの中身には改行をいれてはだめ」

これではまってしまう原因は、chefのreferenceに載っているexampleのせい

```recipe.rb
cron "cookbooks_report" do
  action node.tags.include?('cookbooks-report') ? :create : :delete
  minute "0"
  hour "0"
  weekday "1"
  user "opscode"
  mailto "nharvey@opscode.com"
  home "/srv/opscode-community-site/shared/system"
  command %Q{
    cd /srv/opscode-community-site/current &&
    env RUBYLIB="/srv/opscode-community-site/current/lib"
    RAILS_ASSET_ID=`git rev-parse HEAD` RAILS_ENV="#{rails_env}"
    bundle exec rake cookbooks_report
  }
end
```

http://docs.opscode.com/resource_cron.html


あんまり深く考えずにこれだけみると、commandの値を内容をcookbooks_reportという名前のスクリプトにしてどこかに保存してくれるのかと思ってそのままつかおうとしてみたが以下のようなエラーでうまくうごかない

```
Chef::Exceptions::Cron: cron[crontest] (crontest::default line 98) had an error: Chef::Exceptions::Cron: Error updating state of crontest, exit: 1
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.8.2/lib/chef/provider/cron.rb:210:in `write_crontab'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.8.2/lib/chef/provider/cron.rb:140:in `block in action_create'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.8.2/lib/chef/mixin/why_run.rb:52:in `call'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.8.2/lib/chef/mixin/why_run.rb:52:in `add_action'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.8.2/lib/chef/provider.rb:149:in `converge_by'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.8.2/lib/chef/provider/cron.rb:139:in `action_create'
/opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.8.2/lib/chef/provider.rb:114:in `run_action'
:
:
```

以下によるとcommandの中に改行をいれてはだめらしい。

http://stackoverflow.com/questions/16662065/chef-cant-create-cron

改行をなくせば回避できる
[Ruby] Google Nexus7 CM の「1158で10を作る」を ruby で解く


最近「1,1,5,8。4つの数字を+-×÷で10にする。」が CM で流れています。

この手の問題では、「1 1 9 9  で 10 にする」というのも有名ですね。

汎用的に この問題を ruby で説いてみました。
 
https://gist.github.com/katoy/8080249

このプログラムを  run させると、
全ての４つの数字の組み合わに対して、１０になる計算式を列挙します。
(コマンドラインで、計算結果の数字を指定することができます。指定省略すると 10 になる計算式を列挙します。)

1 1 5 8 で 10 にするという問題は、計算式の形、計算式が１通リしかないこと　の点で なかなか良い問題であることがわかります。
Codeforces Beta Round #13

はい。
###A. Numbers
implementation,math

#####ざっくりと大意
・2進数からA-1進数までの書くdigitの合計の平均？？
#####方針のようなもの
・n進数の式をおこす。
#####Note(最初のサンプルケースの説明)
・5を2進数から4進数で表す。
・2進数:101 3進数:12 4進数:11それぞれのdigitの合計は2,3,2

```python:a.py
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import time
import sys, io
import re, math
start = time.clock()
a=int(raw_input())
s=0
for n in range(2,a):
    c=a
#sには余りを加算しづける。(和が知りたいので順番は保存する必要なし)
#cは商を代入し続ける。
    while c:s+=c%n;c/=n
x,y=s,a-2
while y:x,y=y,x%y
print str(s/x) +'/'+ str((a-2)/x)
```

10進数で与えられた数値をn進数に変換する方法は
こんな感じです。
![http://www.nowshika.com/joso/img01010112.png](http://www.nowshika.com/joso/img01010112.png)
returnでキーボードを非表示にする


1.delegateプロトコルの指定

```objectivec:ViewController.h
@interface ViewController : UIViewController <UITextFieldDelegate>
```

2.ViewControllerをdelegate先にする

```objectivec:ViewController.m
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *myTextField;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    _myTextField.delegate = self;
}
```

3.キーボードを非表示にする処理の実装

```objectivec:ViewController.m
- (BOOL) textFieldShouldReturn:(UITextField *)textField
{
    // キーボードの非表示.
    [self.view endEditing:YES];
    // 改行しない.
    return NO;
}
```
Asterisk入門してみた

* IP電話加入してなくても使えます。(今まで必須かと思っていた。)
* 050plusを使って外線発信ができる。
* Asteriskサーバが自分の携帯に電話をかけてくれるように出来る。
  * 障害通知に最適かと思う。
* インストールはasteriskパッケージを入れるか、ソースからビルド。
  * 日本語パッチやルーターの機種用にパッチがある様子。


参考サイト
----------
* [Asterisk基本設定ガイド！](http://www.st-asterisk.com/)
* [050plusを発信番号として使う](http://takuya-1st.hatenablog.jp/entry/2013/09/24/033704)
* [日本voip](http://www.voip-info.jp/)
* [sip client](http://www32.atwiki.jp/ipsmart/pages/15.html)
* [PR-400MIの例](http://www.ckenko25.jp/asterisk.html)

SIPサーバ(Asterisk)
==================

* 設定ファイル
  * /etc/asterisk/sip.conf
  * /etc/asterisk/extensions.conf
  * /etc/asterisk/rtp.conf

* log
  * /var/log/asterisk/messages

* port
  * UDP: 5060 (Asteriskの認証用)
  * UDP: 10010～10020 (Asteriskでの通話用)

sip.conf
-----------
* Asteriskサーバの設定 (bindaddress,port)
* SIPクライアント認証設定

```diff:
 [general]
+bindport=5060
+externhost=自宅サーバーのドメインを記述
+localnet=192.168.1.0/255.255.255.0
+
+[201]
+type=friend
+defaultuser=201
+secret=passw0rd1ffewf
+canreinvite=no
+host=dynamic
+
+[202]
+type=friend
+defaultuser=202
+secret=passw0rdzpiojdf
+canreinvite=no
+host=dynamic
```

extensions.conf
-----------
* 発信元、発信先のルールを記述。

```diff:
 [default]
+exten => 201,1,Dial(SIP/201,30,r)
+exten => 201,2,Hangup()
+
+exten => 202,1,Dial(SIP/202,30,r)
+exten => 202,2,Hangup()
```

rtp.conf
-----------
* UDP。通話用のportかと思います。SIPクライアント数を超えない程度でいいんじゃないかと。

```diff:
+rtpstart=10010
+rtpend=10020
```

SIPクライアント
=============

* iphone: PUSH通知がいくアプリを選択しましょう。
* android: 設定 -> 通話 -> SIPの設定でOK。

CLI
=============
* /usr/sbin/asterisk -r

UDPではなくTCP通信に切り替える
=============

```diff:sip.conf
 [general]
 context=default
-port=5090
-bindaddr=0.0.0.0
+tcpenable=yes
+udpbindaddr=0.0.0.0:5090
+tcpbindaddr=0.0.0.0:5090
```
fatal error: 'php.h' file not found


phalconをインストールし直そうとした際に、下記のエラーが出力されました。

```console
cphalcon/build/64bits/phalcon.c:163:10: fatal error: 'php.h' file
      not found
#include "php.h"
         ^
1 error generated.
make: *** [phalcon.lo] Error 1
```


僕の環境では、brewのupdateとupgradeでエラーが修正されました。


```console
$ brew update

$ brew upgrade
```
Debian 上で XMonad を利用。 Terminal は urxvt

## 前提
* Debian 7.3 ( wheezly )
* XMonad は apt でインストール
* ターミナルは urxvt を利用
* ターミナルの色は vim の desert color-scheme ライクに設定
* Font は inconsolata を利用 ( http://levien.com/type/myfonts/inconsolata.html )
* Mod キーは Windows キー

## xmonad のインストール
```shell-session
$ sudo aptitude install xmonad
$ sudo aptitude install rxvt-unicode-256color
$ sudo aptitude install inconsolata
```

## xmonad.hs の設定
```shell-session
$ mkdir -p $HOME/.xmonad
$ vim $HOME/.xmonad/xmonad.hs
```

```hs
import System.Posix.Env (getEnv)
import Data.Maybe (maybe)

import XMonad
import XMonad.Config.Desktop
import XMonad.Config.Gnome
import XMonad.Config.Kde
import XMonad.Config.Xfce

main = do
  session <- getEnv "DESKTOP_SESSION"
  let config = maybe desktopConfig desktop session
  xmonad $ config {
    modMask = mod4Mask,
    terminal = "urxvt"
  }

desktop "gnome" = gnomeConfig
desktop "kde" = kde4Config
desktop "xfce" = xfceConfig
desktop "xmonad-mate" = gnomeConfig
desktop _ = desktopConfig
```

## .Xdefaults の設定

```shell-session
$ vim $HOME/.Xdefaults
```

```:.Xdefaults
!
!urxvt*underLine: on
urxvt*colorMode: on
urxvt*colorBD: lightyellow
!urxvt*colorBDMode: off
urxvt*colorUL: yellow
urxvt*colorULMode: on
urxvt*dynamicColors: off
urxvt*highlightSelection: true

!———————————————————-
! Colorscheme based on the gvim colorscheme desert
! http://ggellner.wordpress.com/2006/08/12/desert-xterm/
!———————————————————-
urxvt*background: #313031
urxvt*foreground: White

!colors
!(unknown)
urxvt*color0: #000000
urxvt*color7: #bebebe
urxvt*color8: #666666
urxvt*color9: #cf6171
urxvt*color10: #c5f779
urxvt*color11: #fff796
urxvt*color12: #4186be
urxvt*color13: #cf9ebe
urxvt*color14: #71bebe
urxvt*color15: #ffffff

!(1 is an option color in .Xdefaults)
urxvt*color1: #ffa2a5

!(2 is a resource color in .Xdefaults)
urxvt*color2: #bdb66b

!(3 is for def/return color in python)
urxvt*color3: #f7e78c

!(4 is for comments color in python)
urxvt*color4: #84cfef

!(5 is for import/from color in python)
urxvt*color5: #ce5d5a

!(6 is for function color in python)
urxvt*color6: #87ff87

!set the window geometry
urxvt*geometry: 110×40

urxvt*font: xft:Inconsolata:pixelsize=16:antialias=true:hinting=true
urxvt*boldFont: xft:Inconsolata:pixelsize=16:antialias=true:bold:hinting=true
urxvt*italicFont: xft:Inconsolata:pixelsize=16:antialias=true:italic:autohint=true:hinting=true
urxvt*bolditalicFont: xft:Inconsolata:pixelsize=16:antialias=true:bold:italic:autohint=true:hinting=true

URxvt*preeditType: OnTheSpot,None
URxvt*perl-ext-common: default,matcher
URxvt*perl-ext: xim-onthespot
urxvt*urlLauncher: /usr/bin/firefox
urxvt*matcher.button: 1

Xcursor.theme: Vanilla-DMZ-AA
Xcursor.size: 16

urxvt*scrollBar: true
urxvt*scrollBar_right: true
urxvt*scrollColor: #323232
urxvt*cursorColor: #eeeeee
```
シングルタップとダブルタップを振り分ける


```objectivec:
    UITapGestureRecognizer *singleTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)];
    singleTapGesture.numberOfTapsRequired = 1;
    [image addGestureRecognizer:singleTapGesture];
    UITapGestureRecognizer *doubleTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(doubleTap:)];
    doubleTapGesture.numberOfTapsRequired = 2;
    [image addGestureRecognizer:doubleTapGesture];
    [singleTapGesture requireGestureRecognizerToFail:doubleTapGesture];
```
Deian 7.3 (wheezy) で Ruby 2.1 と Rails 4 をインストールする手順

## 前提
* ホストOS は Windows。
* VirtualBox に Debian 7.3 を ISO イメージからインストールした直後の状態。
* sudo 時にパスワード入力は不要とする
* bash の個別の設定は .bash_aliases に記載。
* rbenv、ruby-build は apt で提供されるものを利用
* Ruby のバージョン間で同一の gems を共有するため、 $HOME/gems を GEM_HOME に設定
* 

## sudo を利用可能とする。
```shell-session:cuzic
$ su - 
```
```shell-session:root
# aptitude install sudo
# EDITOR=vi visudo -f /etc/sudoers.d/cuzic
```

```:/etc/sudoers.d/cuzic
cuzic   ALL=(ALL:ALL) NOPASSWD:ALL
```
を追記

## VirtualBox と、Windows の間でクリップボードを共有する。
VirtualBox 側で、Guest Additions をマウント

```shell-session:cuzic
$ sudo sh /media/cdrom0/autorun.sh 
```

## vim のインストール
とにかく vim がないと、不便。

```shell-session
$ sudo aptitude install vim
$ echo "export EDITOR=vim" >> .bash_aliases
```

## ruby のインストールに必要なライブラリ、git のインストール
```shell-session
$ sudo apt-get build-dep ruby1.9.1-dev
$ sudo aptitude install git-all # maybe git-core is better
```
## ruby のインストール
```shell-session
$ sudo aptitude install rbenv
$ sudo aptitude install ruby-build
```

## rbenv を利用するための設定
```shell-session
$ cat >> $HOME/.bash_aliases
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
export GEM_HOME=$HOME/gems
export GEM_PATH=$GEM_HOME
export PATH="$GEM_HOME/bin:$PATH"
^D
```

## ruby 2.1.0 のインストール
```shell-session
$ cat > 2.1.0
install_package "yaml-0.1.4" "http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz"
install_package "ruby-2.1.0" "http://ftp.ruby-lang.org/pub/ruby/2.1/ruby-2.1.0.tar.gz"
^D
$ rbenv install ./2.1.0
```
## Ruby on Rails をインストール
```shell-session
$ rbenv global 2.1.0
$ gem install rails
```

## Node.JS をインストール
CoffeeScript のために必要。
Node.JS の tarball は http://nodejs.org/download/ から最新版を選択。

```shell-session
$ mkdir $HOME/src
$ cd $HOME/src
$ wget -nd http://nodejs.org/dist/v0.10.24/node-v0.10.24-linux-x64.tar.gz
$ tar zxvf node-v0.10.24-linux-x64.tar.gz
$ mv node-v0.10.24-linux-x64 $HOME/node
```

### Node.JS を PATH に追加
```shell-session
$ vim $HOME/.bash_aliases
```

```shell-session:.bash_aliases
export PATH=$HOME/bin:$PATH
```

## Ruby on Rails プロジェクトを開始
```shell-session
$ rails new test
```
Chefでbuild-essential cookbookを使った時にkernel-develが存在しないエラーが発生するときの対処


Chef経由でCentOS6.5にredmine入れようとした時にopscodeのbuild-essential cookbookで
yumリポジトリに「kernel-devel」がないおエラーが発生してハマったので、その対処法覚書

## 結論

`/etc/yum.conf`に`exclude=kernel*`が書かれてたのでそれを消す or コメントアウト

## 環境

* Chef 11.8.2
* CentOS 6.5(vagrantのbox [CentOS 6.5 x86_64](https://github.com/2creatives/vagrant-centos/releases/download/v6.5.1/centos65-x86_64-20131205.box))
* [build-essential 1.4.2](https://github.com/opscode-cookbooks/build-essential)

## 対処前に出たエラー

```bash:chef.log
================================================================================
Recipe Compile Error in /tmp/vagrant-chef-1/chef-solo-1/cookbooks/redmine/recipes/default.rb
================================================================================


Chef::Exceptions::Package
-------------------------
package[kernel-devel] (build-essential::rhel line 38) had an error: Chef::Exceptions::Package: No version specified, and no candidate version available for kernel-devel


Cookbook Trace:
---------------
  /tmp/vagrant-chef-1/chef-solo-1/cookbooks/build-essential/recipes/rhel.rb:41:in `block in from_file'
  /tmp/vagrant-chef-1/chef-solo-1/cookbooks/build-essential/recipes/rhel.rb:36:in `each'
  /tmp/vagrant-chef-1/chef-solo-1/cookbooks/build-essential/recipes/rhel.rb:36:in `from_file'
  /tmp/vagrant-chef-1/chef-solo-1/cookbooks/build-essential/recipes/default.rb:21:in `from_file'
  /tmp/vagrant-chef-1/chef-solo-1/cookbooks/mysql/recipes/ruby.rb:24:in `from_file'
  /tmp/vagrant-chef-1/chef-solo-1/cookbooks/database/recipes/mysql.rb:20:in `from_file'
  /tmp/vagrant-chef-1/chef-solo-1/cookbooks/redmine/recipes/source.rb:56:in `from_file'
  /tmp/vagrant-chef-1/chef-solo-1/cookbooks/redmine/recipes/default.rb:23:in `from_file'


Relevant File Content:
----------------------
/tmp/vagrant-chef-1/chef-solo-1/cookbooks/build-essential/recipes/rhel.rb:

 34:  end
 35:
 36:  pkgs.flatten.each do |pkg|
 37:
 38:    r = package pkg do
 39:      action( node['build_essential']['compiletime'] ? :nothing : :install )
 40:    end
 41>>   r.run_action(:install) if node['build_essential']['compiletime']
 42:
 43:  end
 44:


[2013-12-31T10:08:26+00:00] INFO: Forking chef instance to converge...
[2013-12-31T10:09:17+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)
Chef never successfully completed! Any errors should be visible in the
output above. Please fix your recipes so that they properly complete.
```


## 作ったrecipe

`/ect/yum.conf`の`exclude=kernel*`をコメントアウトするだけ

```ruby:commentout_yumconfg_exclude_kernel.rb
file '/etc/yum.conf' do 
  _file = Chef::Util::FileEdit.new(path)
  _file.search_file_replace_line('exclude=kernel', "#exclude=kernel\n")
  content _file.send(:contents).join
  action :create
end.run_action(:create)
```

このレシピが`build-essential`のレシピを呼び出すより先に動くようにしておく

run_actionしているのはbuild-essentialがinclude_recipeされて先に動くっぽかったので、それより前に来れを動かしたかったのでそうしました。

また最新版のyum cookbookではyum_globalconfig resourceがあるので、そっちでちゃんと設定したほうが良いかも。


## その他

opscodeのmysql cookbookあたりとか他にも色んなcookbookでbuild-essentialが`include_recipe`されているっぽいので
なんか同じエラーがあったら試してみてください

## p.s.

細かいところは間違っているかもなのでお気をつけて
Bundler::GemNotFound: Could not find minitest-4.7.5.gem for installation

タイトルのエラーでいきなり嵌った・・・

原因はbundlerのバージョンが古かったせいなので、

```
$ gem update bundler
$ bundle -v
Bundler version 1.5.1
```

これでbundlerを上げて無事にbundle install出来ました。
Platform::String^ を unordered_set の要素にする  

unordered_set, unordered_multiset,unordered_map, unordered_multimap の
要素Tには、std::hash<T> が定義されていることが求められるため、そのままでは
Platform::String^ は unordered_XXX の要素になれない。

```cpp
#include <unordered_set>

/*
 * std::hash<Platoform::String^> を定義する。
 * ハッシュ値は Platoform::String::GetHashCode() をそのまま利用できる。
 */
template<> struct std::hash<Platform::String^> {
    size_t operator()(Platform::String^ pstr) const {
        return static_cast<size_t>(pstr->GetHashCode());
    }
};

/* おためし */

#include <iostream>
#include <locale>
#include <string>

using namespace std;
using namespace Platform;

wostream& operator<<(wostream& stream, String^ str) {
    return stream << wstring(begin(str), end(str));
}

int main(Array<String^>^ ) {

    vector<String^> vps = 
      { L"れい", L"いち", L"に", L"さん", L"し", 
        L"ご", L"ろく", L"しち", L"はち", L"きゅう" };
    unordered_set<String^> uss(begin(vps), end(vps));

    wcout.imbue(locale("japanese"));
    for ( auto item : uss ) {
        wcout << item << endl;
    }
}
```
unixtimeをiOSでNSDateにするときの注意点

##はじめに

これも第14回 yidevでお話させていただいた小ネタです。

システム間で時刻のやりとりをするとき色々なやり方をすることがありますが、その一つに「unixtimeでやりとりする」ことがあります。
> ※unixtime とは 1970/1/1 00:00:00 からの秒数表現

unixtime を使う理由としては、文字列表現でやりとりすると日時の区切り記号やらロケールやらでパースが面倒になったりするとかまぁ色々です。

今回はサーバから取得した unixtime を Objective-C で NSDate に復元したときに数秒〜数十秒のズレが起きたことがあるので、その時の対処について忘備録も兼ねてエントリを投稿してみました。

##NSDateへの復元（間違い編）
早速 unixtime で 1388477900 という値 （日時表記は 2013-12-31 08:18:20 +0000）を NSDate に復元してみます。

```objc
    // サーバからの返り値をエミュレート
    NSDictionary *dataDictionary = @{@"unixtime" : @"1388477900"};
    NSString *time = [dataDictionary objectForKey:@"unixtime"];

    NSLog(@"NSDate:%@", [NSDate dateWithTimeIntervalSince1970:[time floatValue]]);
```

すると出力はこのようになります。

> 2013-12-31 17:24:05.197 TimeIntervalSample[16040:70b] NSDate:2013-12-31 08:19:12 +0000

どうでしょう。
本当は __2013-12-31 08:18:20 +0000__ という結果を期待したはずが __2013-12-31 08:19:12 +0000__ という結果になりました。


##NSDateへの復元（正解編）
感の良い方ならばもうお気づきでしょうが（むしろツッコミ入れたい気分でいっぱいだと思いますが）、floatValueを使っているのが問題でした。

> + (instancetype)dateWithTimeIntervalSince1970:(NSTimeInterval)secs;

もともとのメソッドシグニチャを見て NSTimeInterval だから浮動小数点型にしなきゃね！と思ってやった変換がいけなかったわけですが、 unixtime の意味合いを考えて intValue を使ったらうまくいきました。
ちなみに doubleValue を使ってもうまくいきます。

```objc
    NSDictionary *dataDictionary = @{@"unixtime" : @"1388477900"};
    NSString *time = [dataDictionary objectForKey:@"unixtime"];
    NSLog(@"double NSDate:%@", [NSDate dateWithTimeIntervalSince1970:[time doubleValue]]);
    NSLog(@"float NSDate:%@", [NSDate dateWithTimeIntervalSince1970:[time floatValue]]);
    NSLog(@"int NSDate:%@", [NSDate dateWithTimeIntervalSince1970:[time intValue]]);
```

出力結果
> 2013-12-31 17:24:05.197 TimeIntervalSample[16040:70b] double NSDate:2013-12-31 08:18:20 +0000
> 2013-12-31 17:24:05.197 TimeIntervalSample[16040:70b] float NSDate:2013-12-31 08:19:12 +0000
> 2013-12-31 17:24:05.198 TimeIntervalSample[16040:70b] int NSDate:2013-12-31 08:18:20 +0000

この結果を見てかなりゾワッときたのですが、どうも文字列における数値変換で想像以上に変なことが起きている様子。
なのでこんなコードも実行してみました。

```objc
    NSDictionary *dataDictionary = @{@"unixtime" : @"1388477900"};
    NSString *time = [dataDictionary objectForKey:@"unixtime"];
    NSLog(@"double value:%lf", [time doubleValue]);
    NSLog(@"float value:%f", [time floatValue]);
    NSLog(@"int value:%d", [time intValue]);
```

出力結果
> 2013-12-31 17:24:05.197 TimeIntervalSample[16040:70b] double value:1388477900.000000
> 2013-12-31 17:24:05.198 TimeIntervalSample[16040:70b] float value:1388477952.000000
> 2013-12-31 17:24:05.198 TimeIntervalSample[16040:70b] int value:1388477900

float だけズレとる。。。
かなり gkbr する結果ですね。52もズレております。
floatValue、恐ろしい子！

##終わりに
今回の例でいえば floatValue だけがおかしかったわけですが、小数点の演算精度問題にかかわるこういった話は昔からあるわけでちゃんと使うときに気をつけないと痛い目を見るよ！という良い教訓になりました。
ショウスウテンコワイデス。
Vagrant・Berkshelf・chrubyでVMにRuby2.1.0-p0を入れる

# sandbox cookbook
chef歴１週間ほどですが、
[Ruby2.1(と2.0と1.9)が動くVMを作るVagrantfileとcookbook](https://github.com/hoshinotsuyoshi/sandbox)作ってみました。

# これを利用すると何が出来るか

Ruby2.1(と2.0と1.9)が動くVMが手に入ります。

Berkshelfとchrubyを利用してruby2.1(と2.0と1.9)をVMにインストールします。
chrubyのコマンドで簡単にrubyバージョンを切り替えることが出来ます。

host側でknifeは(とりあえず)使わず、
Vagrantfile内のchaf_soloブロック内の記述でがんばります。

このcookbookはBerkshelfのコマンド"berks cookbook sandbox"で生成されるcookbookを少し編集したものです



## Requirements
hostはMacOSXで動いています。
VirtualBoxとVagrantをインストールする必要があります。

1. [Virtual Box 4.3.6](https://www.virtualbox.org/wiki/Downloads "Virtual Box 4.3.6")
2. [Vagrant 1.4.1](http://www.vagrantup.com/downloads.html "Vagrant 1.4.1")

```
  % vagrant -v
  Vagrant 1.4.1
  % VirtualBox --help
  Oracle VM VirtualBox Manager 4.3.6
  (C) 2005-2013 Oracle Corporation
  All rights reserved.
```
    
## Usage

1. このcookbookをクローンします
  ```
  % git clone https://github.com/hoshinotsuyoshi/sandbox.git
  ```

2. Gemのインストール 

  ```
  % bundle --path vendor/bundle
  ```

3. 3rdパーティーCookbooksのインストール

  ```
  % bundle exec berks
  ```

4. Vagrantfileの編集
  hostnameとかipaddressを適宜編集します

5. VMの起動

  ```
  % vagrant up
  ```

  boxが元々ある状態で、約２０分かかります。
  boxが元々ない状態だと結構（プラス１時間くらい?）かかります

## vm側でのrubyの切り替え方
  まずログイン

```
% vagrant ssh
```

  chrubyでインストール済みのrubyを確認できます

```
[vagrant@vm ~]$ chruby
  1.9.3-p484
  2.0.0-p353
  2.1.0
* embedded
```

  chruby [version]で利用するrubyをchangeできます

```
[vagrant@vm ~]$ chruby 2.1
[vagrant@vm ~]$ ruby -v
ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-linux]
```

もっと良いやり方はいっぱいある気がしますが、よろしくお願いいたします。乞うご指摘

## 追記
出来上がったVM上でのbundle installが遅いという問題があった。
結論、VM上の/etc/resolv.confに
```
'options single-request-reopen'
```
と追記すれば良い
(参考)
https://github.com/mitchellh/vagrant/issues/1172#issuecomment-21083596
(メモ)
https://github.com/hoshinotsuyoshi/sandbox/issues/1
MavericksでのMySQLの運用


# はじめに

Mavericksに限ってはいないけど、Mac OS Xで開発しているときに、自分のマシンローカルにmysqlサーバをたててテストしたくなるときがある。homebrewで割と簡単にインストール・運用できるのだけど、開発するプロジェクトが変わると、初期化・再インストールしたくなることがある。ところが、インストール方法は結構書いてあるけど、アンインストールする方法は探さないとでてこないので、ここに備忘録として残しておく。

なお、インストールにはhomebrewを使う。

# インストール方法

インストール方法はいたって標準。brew installの後も、インストール時にでてくるインストラクションメッセージに従うだけ。

```
$ brew install mysql
$ unset TMPDIR
$ mysql_install_db --verbose --user=`whoami` --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/mysql --tmpdir=/tmp
$ mysql.server start
$ /usr/local/Cellar/mysql/5.5.10/bin/mysql_secure_installation
```

# インストール後の設定

## my.cnfの場所

デフォルトのmy.cnfの場所は変更されない限りは以下の通り

```
/usr/local/opt/mysql/my.cnf
```

## リモートからのアクセス方法

ローカルの検証をして、サーバを閉じようとすると、他の人から使わせてくれと言われ、なし崩し的にテストSQLサーバになることも結構、多いのではないだろうか。ここではリモートからのアクセスを許可する設定の備忘録を残しておく。大抵のサイトでは、以下のうちひとつしか解説していないことが多く、意外とはまるのだ・・

### MySQL内の設定

他のサイトからのアクセス(privilege)を許可する必要がある。

```mysql
$ mysql -u root -p
mysql> grant all privileges on <database name>.* to root@"%" identified by ‘<password>’ with grant option;
Query OK, 0 rows affected (0.04 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> quit
```

database name, passwordにはそれぞれ、許可したいデータベース名、パスワードが入る。

### my.cnfの設定

以外と忘れがちなのが、my.cnfの設定で、以下の行をmysqldの設定の下に追加する必要がある。

```my.cnf
[mysqld]
bind-address=<your server ip>
```

your server ipには、ホストマシンのIPアドレスが入る。

その後、mysqlサーバを再起動すること。

```
$ mysql.server resart
```

# アンインストール方法

アンインストール方法は以下の通り。この作業を行った後、インストール作業を再度実行することで再インストールすることができる。

```
brew remove mysql
brew cleanup
launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
rm ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
sudo rm -rf /usr/local/var/mysql
```
C++11: state-lessな(一切のキャプチャをしない)ラムダ式は関数ポインタに暗黙変換できる

```cpp
#include <iostream>
#include <vector>
#include <cstdlib> // qsort

using namespace std;

int main() {
  vector<int> v { 8, 6, 4 ,2 ,0, 9, 7, 5, 3, 1 };
  // qsortの第４引数(比較関数へのポインタ)に state-less lambda を与える
  qsort(&v[0], v.size(), sizeof(int),
        [](const void* x, const void* y) {
          return *static_cast<const int*>(x) - *static_cast<const int*>(y);
        });
  for ( int item : v ) { cout << item << ' '; }
  cout << endl;
}
```
java7でeclipseを動かす


Javaに関しては、Win機に構築したVM環境の `Ubuntu` でやろうかと思ったのだが、容量に空きがあるため、 `eclipse` を入れてみる事にした。
以下、参考サイト。

> [MacOSX MavericksにおいてJDK7でEclipseを動かす方法](http://yotama.hatenablog.com/entry/2013/11/04/014451)

自分の場合、Marvericksを入れてもJDKは６のままだったらしく、エラーは出なかった。
それどころか、JDK7をインストールしても文句を言われなかった。
Javaのバージョンを確認すると1.7と返ってくる。
じゃあeclipseだけ６観てるんかな、と確認してみたが、`Installed JREs` はきちんと `Java SE 7` にチェックが入っていた。

KEPLERは優秀だなあ、ということにしておこう。

一応、複数バージョンのJDKが存在するので、管理する方法も調べてみた。

> [Macで複数のバージョンのJDKを管理する](http://blog.olivinecafe.info/post/59358925622/mac-java-mac-jdk)
Parameterized Test


# はじめに
プログラミングの勉強のため、鍋谷さん主催の [オフラインリアルタイムどう書く](http://atnd.org/events/46348 “オフラインリアルタイムどう書く”) の問題を解いている (あまり参加はできていませんが)。問題を解く際はテストも書くのだが、私のテストの書き方がイマイチなため、テストコードの書き方を勉強しようと思い、学習内容をまとめることにした。

今回は未回答だった [Tick-Tack-Toe 〜 横へな 2012.7.6](http://nabetani.sakura.ne.jp/hena/1/) を題材にテストの書き方について勉強した。私の書いたコードは [ここ](https://gist.github.com/mizuhara/8165347) から閲覧可。

# 従来のテストコード
従来は下記の様なコードを書いていたが、失敗するテストケースがあった場合、どのテストで失敗したのかがわかりにくいという問題点がある。

```tick_tack_toe_spec.js

var tick_tack_toe = require('./tick_tack_toe');

describe("tick_tack_toe.solve", function() {
    
    var inputs = [ 
        ['79538246', 'x won.'],
        // 以下略
    ];  

    it("should return expected msg.", function() {
        for(var i = 0; i < inputs.length; ++i) {
            expect( tick_tack_toe.solve(inputs[i][0]) ).toBe(inputs[i][1]);
        }   
    }); 

});

```

以下の様に書くと、どのテストで失敗したかがわかるが、無様すぎる。

```tick_tack_toe_spec.js

var tick_tack_toe = require('./tick_tack_toe');

describe("tick_tack_toe.solve", function() {
    
    it("should return 'x won.' (1).", function() {
        expect( tick_tack_toe.solve('79538246') ).toBe('x won.');
    });

    it("should return 'x won.' (2).", function() {
        expect( tick_tack_toe.solve('35497162193') ).toBe('x won.');
    });

    // 以下略

});

```


もうちょっと良い書き方はないかと調べていたところ、 Parameterized Test という手法を知ったので、 Parameterized Test についてまとめることにした。

# Parameterized Test とは
似たようなテストメソッドをテストデータだけ変えて複数件実行するための手段。今回やりたいことは「solve 関数のテストを、 solve に渡す引数だけを変えて複数件実行すること」なので、本手法により目的を達成することができる。

# 上記テストコードに Parameterized Test を適用する
テストフレームワークの機能として提供されているのかと思ったが、今回使用した Jasmine-node には無さそう。仕方ないので、下記の様なコードで対応することにした。

```tick_tack_toe_spec.js

var tick_tack_toe = require('./tick_tack_toe');

describe("tick_tack_toe.solve", function() {

    var inputs = [
        ['79538246', 'x won.'],
        // 以下略
    ];

    for(var i = 0; i < inputs.length; ++i) {
        (function(src, expected) {
            it("should return " + expected + " (" + i + ").", function() {
                var actual = tick_tack_toe.solve(src);
                expect(actual).toBe(expected);
            });
        })(inputs[i][0], inputs[i][1]);
    }

});

```

どのテストデータで失敗したかがわかる分、一番初めに載せたテストコードよりはマシと思うことにする。

# 補足
Jasmine / QUnit では、 Parameterized Test を行うためのプラグインが提供されている。
 
* [jasmine-parameterize](“https://github.com/kannokanno/jasmine-parameterize”) 
* [qunit-parameterize](https://github.com/AStepaniuk/qunit-parameterize)

# 参考 URL

* [これであなたもテスト駆動開発マスター！？和田卓人さんがテスト駆動開発問題を解答コード使いながら解説します～現在時刻が関わるテストから、テスト容易性設計を学ぶ #tdd](https://codeiq.jp/magazine/2013/11/1475/)
Rubyで雪を表現する

Rubyで雪みたい感じの様子を再現する。自分では降らすつもりのものを書いた。

人によってはそんなように見えないかも、、、、、、、、、


```rb:snow.rb
def snow_drop_1 # 降り始め
  loop do
    sleep(0.25)
    blank_snow = " " * rand(100) + "*" + " " * rand(100)
    print blank_snow
  end
end

def snow_drop_2 # コンスタントにしとしと
  loop do
    sleep(0.05)
    blank_snow = " " * rand(100) + "*" + " " * rand(100)
    print blank_snow
  end
end

def snow_drop_3 # 猛吹雪
  loop do
    blank_snow = " " * rand(10) + "*" + " " * rand(10)
    print blank_snow
  end
end

#  降り始めて、徐々に強くなって最後に猛吹雪

def snow(num=100000)
  (num - 99900).times do |num|
    sleep(0.25)
    blank_snow = " " * rand(100) + "*" + " " * rand(100)
    print blank_snow
  end
  (num - 99500).times do |num|
    sleep(0.05)
    blank_snow = " " * rand(100) + "*" + " " * rand(100)
    print blank_snow
  end
  loop do
    blank_snow = " " * rand(10) + "*" + " " * rand(10)
    print blank_snow
  end

end

snow
```
SSD 容量の少ない MacBook Air でデカいファイルを microSD に追いだして Vagrant + Chef solo しまくる

環境変数と VirtualBox の設定でシステムの SSD から(ほぼ？) microSD 上に追い出せる。

    「空き容量が増えるよ！」
    「やったねたえちゃん！」

+ 環境変数 ```VAGRANT_HOME``` : box ファイルなどを保存する場所。デフォルトでは ```~/.vagrant.d```. box をいろいろ追加してると育つ
+ VirtualBox の設定→一般→デフォルトの仮想マシンフォルダー: 仮想マシンの実体ファイルを保存する場所。試行錯誤してるとこれが一番デカく育つよね
+ 環境変数 ```BERKSHELF_PATH``` : plugin ```berkshelf``` で管理するシステム全体の？ cookbook を保存する場所。デフォルトでは ```~/.berkshelf``` バイナリ入りの cookbook を使うと育つのかもしれないが私はまだあまり試してないのでそんなに育っていない

各種 ```Gem``` も ```bundler``` で作業ディレクトリの ```vendor/bundle``` に install できるよね。

私の現在の構成はこのような感じ

```
/Volumes/vms/
|-- berkshelf    # BERKSHELF_PATH
|-- vagrant_home # VAGRANT_HOME
|-- vagrant_vms  # VirtualBox で設定
|   |-- my-server-01
|   |-- my-server-02
|   `-- chef-solo-tutorial
`-- vagrants # この下の subdirectory に Vagrantfile を用意して試行錯誤
    |-- my-server-01
    |-- my-server-02
    `-- chef-solo-tutorial
```

なお、こうしているとたまに ```vagrant up``` で timeout することがあって、ググると共有フォルダのアクセス権とかの問題らしいのだがまだよくわかっていない。
そうなったときはログを見ると原因わかることもあるそうだが、私のケースではよくわからなかったので ```vagrant halt``` してから(ただし gracefull shutdown できなかった) VirtualBox の GUI 表示を on にして ```vagrant up``` してみた。

```rb
  config.vm.provider :virtualbox do |vb|
    vb.gui = true # 大抵なにも書いていないか明示的に false にしていると思うここ
  end
```

そうすると VM が (たぶんこの直前に gracefull shutdown できなかったせいで) 通常起動するかセーフモード起動するかの選択で止まっていた。通常起動するように VirtualBox GUI で選択してやると正常に戻った。
Rubyで階段

```

def kaidan(dansa)
    (0..dansa).each do |dansa|
      sleep(0.1)
      yoko = ("a" * 5)
      blank = (" " * 5) * dansa
      tate = "a"

      print blank + yoko + "\n"
      print " " * 5 + blank + tate + "\n"
      print " " * 5 + blank + tate + "\n"
      print " " * 5 + blank + tate + "\n"

    end
end

kaidan(50)

```
【Android】特定の辺だけにstrokeをつけたい


CSSでいうところの`border-left`や`border-top`のようなもの．
Androidでやるには一筋縄ではいかなかった．

# やりかた
## 方針

1. `GradientDrawable`に`stroke`をつける
2. `LayerDrawable`に前項の`GradientDrawable`をセットする
3. `stroke`が **不要な辺** に **ネガティブオフセット** をつけて`stroke`を描画領域から追い出す

このとき，オフセットの値は`stroke`の太さより大きくする必要がある．

## 実装

CSSでいうとこんな感じのやつをつくる．

```css
border-top: 2px solid #ffffff;
border-bottom: 2px solid #ffffff;
```

### Java

```java
private int BORDER_WEIGHT = 2;

/* 中略 */

// 白（半透明），太さ2pxのボーダーをつける
GradientDrawable borderDrawable = new GradientDrawable();
borderDrawable.setStroke(BORDER_WEIGHT, 0x55ffffff);

// LayerDrawableにボーダーを付けたDrawableをセット
LayerDrawable layerDrawable = new LayerDrawable(new Drawable[]{borderDrawable});
// ボーダーがいらない辺にオフセット（負値）をつける
layerDrawable.setLayerInset(0, 0, -BORDER_WEIGHT, 0, -BORDER_WEIGHT);

// ボーダーを付けたいViewにセットする
view.setBackground(layerDrawable);
```

### XML

```xml
<?xml version="1.0" encoding="utf-8"?>

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:left="-1dp" android:right="-1dp">
      <shape>
            <solid android:color="@android:color/transparent" />
            <stroke android:width="1dp" android:color="#55ffffff" />
      </shape>
    </item>

</layer-list>
```

# 参考URL
- [Open-sided Android stroke? - Stack Overflow](http://stackoverflow.com/questions/2422120/open-sided-android-stroke)