OmniAICreator/Qiita-1.07M huggingface dataset:
Incanterで3D円グラフを描く & マルチメソッドの拡張

3D円グラフは、使うと死が待っています。

![範囲を選択_015.png](https://qiita-image-store.s3.amazonaws.com/0/8475/76ccacae-bf8f-2b8c-589d-9c104dbeb1e0.png)

その錯視が、どんなものか分からないと殺せるものも殺せないので、3D円グラフを描いてみることにします。

[Incanter](https://github.com/liebke/incanter)はClojureの統計解析ライブラリですが、肝心の3D円グラフは描けません。
ですが、中で使われている[JFreeChart](http://www.jfree.org/jfreechart/)は、3D円グラフReadyです。(サイトのロゴが3D円グラフなのは皮肉なものです)

これを拡張します。通常の円グラフは以下のように書けます。

```clj
(view (pie-chart ["a" "b" "c"] [10 20 30]))
```

なので同じ感じで、`pie-chart-3d`関数を追加します。

ソースはpie-chartをまるっとコピーし、ChartFactoryでChartオブジェクトを作るところだけ、`createPieChart`から`createPieChart3D`に書き換えます。

```clj:https://github.com/kawasima/incanter-charts-3d/blob/v1.5.4/src/incanter/charts_3d.clj#L66
(ChartFactory/createPieChart3D
                  title
                  dataset
                  legend?
                  false
                  false)
```

これで3D円グラフのチャートが生成されます。

```clj
(view (pie-chart-3d ["a" "b" "c"] [10 20 30]))
```

IncanterではSwingを使ってグラフを表示するのに`view`関数を、画像ファイルに出力するのに`save`関数をそれぞれ使います。せっかくの3D円グラフなので、錯視が如何ほどのものか、その3Dの視点をグリグリ動かしてみたいですよね！
そこで、`view`関数を再定義してみます。

```clj:https://github.com/liebke/incanter/blob/master/modules/incanter-charts/src/incanter/charts.clj#L3349
(defmethod view org.jfree.chart.JFreeChart
  ([chart & options]
    (let [opts (when options (apply assoc {} options))
          window-title (or (:window-title opts) "Incanter Plot")
          width (or (:width opts) 500)
          height (or (:height opts) 400)
          frame (ChartFrame. window-title chart)]
      (doto frame
        (.setSize width height)
        (.setVisible true))
      frame)))
```

viewの定義はマルチメソッドになっていて、JFreeChartクラスのインスタンスだったらこのview関数で処理されます。JFreeChartのオブジェクト構成は、グラフの種類はJFreeChartのオブジェクトがもつPlotで区別されます。グラフの種類によらずChartFactoryで生成されるオブジェクトは、すべてJFreeChartクラスのインスタンスになります。したがって、このようにJFreeChartクラスでディスパッチされると"3D円グラフだけ特別な処理をする"ということができないのです。

この挙動を変えるには、次のようにします。

```clj:https://github.com/kawasima/incanter-charts-3d/blob/v1.5.4/src/incanter/charts_3d.clj#L136
(when-let [original-view-fn (get-method view org.jfree.chart.JFreeChart)]
  (defmethod view org.jfree.chart.JFreeChart [chart & options]
    (let [view (apply original-view-fn chart options)]
      (when (= (type (.getPlot chart)) org.jfree.chart.plot.PiePlot3D)
        (pie-slider view))
      view)))
```

基本的には`defmethod`で再定義するのですが、元のメソッドを`get-method`関数で取り出しておくのがポイントです。そしてPlotがPiePlot3Dのときだけ、右側にスライダーをつけるようにしています。

![スライダー付き3D円グラフ](https://github-camo.global.ssl.fastly.net/4c59f3db501441bbeee0782bc64faa96abb79bf9/687474703a2f2f6661726d332e737461746963666c69636b722e636f6d2f323834392f31323830383630323034355f383637636166346366662e6a7067)

同様に`save`も再定義して、3D円グラフでファイル拡張子がGIFのときだけ、アニメーションGIFを出力するようにしました。ぜひお使いください。

![3D円グラフアニメ](http://farm4.staticflickr.com/3680/12811515954_be2ded5a65_o.gif)

----
incanter-charts-3d
https://github.com/kawasima/incanter-charts-3d
Twitterアカウントを消したい、けど使ってたIDは誰にも使われたくない

やんごとなき事情があるときや、酒を飲んでメンがヘラった時にご利用いただけます。
もしくは、Twitter アカウントをイチからやり直したい（でも ID は同じの使いたい）という用途にも使えます。
あ、ID = screen_name です。念のため。

## 手順
1. Chrome の Incognito で新しい Twitter アカウントをとり、アカウントログイン状態にします。メインのウインドウでは旧来のアカウントがログイン状態です。
1. 消したいアカウントの ID を適当なものに変更します。
1. 新しいアカウントの ID を古いアカウントで使っていた ID に変更します。急いでください。この間は今まで使っていた愛着のある ID が誰かにとられてしまう可能性があります。
1. 今までの ID での新しいアカウントを良きに計らいます。

## 良きに計らい方
- Twitterを退会したいけど今まで使っていた素敵な ID は誰にも使われたくない場合は、新しいアカウントをドメインお姉さんにでもしとくといいんじゃないでしょうかね。

Qiita 初投稿こんなんしか思いつきませんでした。多分あってる。エンジニアリング？なにそれおいしいの？よろしくどうぞ。
Cordova(PhoneGap)でiOSアプリを作るための環境構築


とりあえず、Crodovaをインストールする前段階まで。
続きは、[Cordova(PhoneGap)でのアプリ開発のはじめ方](http://qiita.com/inoccu/items/2e07b550c3ab1e24b7b0)で。

## Xcodeのインストール

AppStoreからXcodeをインストールします。
2.09GBあるので、とりあえず待つしかありません。

![Xcodeのインストール](https://dl.dropboxusercontent.com/u/876984/AppStore_Xcode.png)

## iOSシミュレータの動作確認

Xcodeを起動し、iOSシミュレータを開きます。

![XcodeからのiOSシミュレータの起動](https://dl.dropboxusercontent.com/u/876984/Xcode_iOS_Simulator.png)

起動しました。
RetinaのiPhone/iPadは画面が非常に大きいので、ウィンドウ＞表示サイズ＞50％とかを選んで、縮小表示すると良いでしょう。

![iOS Simulator](https://dl.dropboxusercontent.com/u/876984/iOS_Simulator.png)

## iOS Developer Programの登録（任意）

作ったアプリを実機で動作させたい場合は、[iOS Developer Program](https://developer.apple.com/jp/programs/ios/)への登録が必要です。
年間8,400円がかかるので、とりあえずCordovaの動作を試したいというだけなら、任意です。

## Command Line Toolsのインストール

Command Line Toolsは、Xcodeのオプションのような存在なのですが、Macにgcc（Cコンパイラ）などの開発環境を導入できます。
この後でインストールするHomebrewで必要となります。

ターミナルを開き、下記のコマンドを実行します。

```
xcode-select --install
```

## Homebrewのインストール

Homebrewは、主に開発系のツールをストレスフリーに導入できるパッケージマネージャです。今回はCordovaのインストールに必要なNode.jsをHomebrewからインストールしようと思います。

こちらもターミナルから。

```
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
```

## Node.jsのインストール

HomebrewからNode.jsをインストールすると、Node.jsのパッケージマネージャであるnpmも一緒に導入されます。

またしてもターミナルから。

```
brew install node
```
CasbahでJodaTimeをMongoDBに保存する

Mongoでの日時はUTCで扱われる。

```scala:以下の2つを呼んでおく
import com.mongodb.casbah.commons.conversions.scala._
RegisterJodaTimeConversionHelpers()
```

```json:保存されたドキュメントはこんな感じ
{
    "date": "20140227",
    "date_time": ISODate("2014-02-26T15: 00: 05Z"),
    "time": "00:00:05"
}
```

```scala:問い合わせ
val dtf = DateTimeFormat.forPattern("yyyyMMdd hh:mm:ss").withZone(DateTimeZone.forID("Asia/Tokyo"))
val fromTime = DateTime.parse("20140226 090000", dtf)
val toTime = DateTime.parse("20140228 0900000", dtf)
val query = $and("date_time" $gte fromTime, "date_time" $lte toTime))
```

```json:クエリ
{
    "$and": [
        {
            "date_time": {
                "$gte": {
                    "$date": "2014-02-26T00:00:00.000Z"
                }
            }
        },
        {
            "date_time": {
                "$lte": {
                    "$date": "2014-02-28T00:00:00.000Z"
                }
            }
        }
    ]
}
```
scikit-learn によるクラスタリング (2)

## クラスタリングの意義と目的

昨日はクラスタリングの概要と scikit-learn を使って実際にクラスタリングをする流れを説明しました。

[scikit-learn によるクラスタリング (1)](http://qiita.com/ynakayama/items/8bc9f3c7639f7251858a)

ここで基本に立ち返りそもそもクラスタリングとは何なのかを探っていきます。

多くの機械学習のアルゴリズムでは、特徴量 (素性) をベクトルで表現します。
線形代数では和とスカラー積が内部で定義されている集合をベクトル空間、その要素をベクトルと言います。

クラスタリングとはすごくざっくり言うと、特徴量同士がどれくらい似ているかを計算、似たものをグルーピングしようという方法です。

元データが文字だろうが画像だろうが、パターンを認識して特徴量に落とした時点で、教師となるデータを与えることなく、グルーピングができるようになるわけですね。

たとえば不特定多数のアンケート回答を似た者同士で寄せ集めたり、画像の肌色部分を抽出したり、などなど様々な技術に応用ができます。

### 類似度の算出

ここまで読んで、集合の類似度をいかに求めるかがクラスタリングの鍵であることがおわかりになったかと思います。

scikit-learn のチュートリアルに沿ってコードで説明してきます。
[Clustering](http://scikit-learn.org/stable/modules/clustering.html#mini-batch-k-means)

```py3

labels_true = [0, 0, 0, 1, 1, 1]
labels_pred = [0, 0, 1, 1, 2, 2]
print ( metrics.adjusted_mutual_info_score(labels_true, labels_pred) )
# => 0.225042310598

labels_true = [0, 1, 2, 0, 3, 4, 5, 1]
labels_pred = [1, 1, 0, 0, 2, 2, 2, 2]
print ( metrics.adjusted_mutual_info_score(labels_true, labels_pred) )
# => -0.105263430575

labels_true = [0, 0, 0, 1, 1, 1]
labels_pred = [0, 0, 1, 1, 2, 2]

print ( metrics.homogeneity_score(labels_true, labels_pred) )
# => 0.666666666667

print ( metrics.completeness_score(labels_true, labels_pred) )
# => 0.420619835714

```

このように scikit-learn ではさまざまな類似度を求めることができることがわかります。


### クラスタリング

では昨日のコードを利用して実際にクラスタリングを試してみます。
scikit-learn にはデータセットが用意されているのでこれをそのまま使います。
まずはデータセットの用意をします。

```py3

from sklearn import metrics
from sklearn.metrics import pairwise_distances
from sklearn import datasets

dataset = datasets.load_iris()
X = dataset.data
y = dataset.target

# 内容をちょっと覗き見してみる
print (X)
print (y)

```

昨日のコードでクラスタリングしてみましょう。

```py3

import numpy as np
from sklearn.cluster import KMeans

kmeans_model = KMeans(n_clusters=3, random_state=1).fit(X)
labels = kmeans_model.labels_

# ユークリッド距離を算出してみる
print ( metrics.silhouette_score(X, labels, metric='euclidean') )

# 昨日のコードを利用してクラスタリングをおこなう
clusters = make_cluster(X)

# 結果をファイルに出力する
write_cluster(clusters, 'out.txt')

# 生成したクラスタリングの内容を覗き見する
print ( clusters )

```

### 考察

強力なクラスタリングライブラリを利用することで、パターン認識により対象の素性さえ抽出してしまえば、簡単にグルーピングができ、それを様々な分野に応用できるということが言えます。
Ono '斧' を触ってみた

先日、[AFNetworking](http://afnetworking.com/ "AFNetworking - a delightful networking framework for iOS and OSX") や [NSHipster](http://nshipster.com/ "NSHipster") で有名な Mattt が Ruby の [Nokogiri](http://nokogiri.org/) 風の XML & HTML パーサー [Ono 斧](https://github.com/mattt/Ono) を公開しています。

## 早速少しだけ触ってみた

### CSS Selector でのパースをサポート

XPath での指定なら今もいくつかライブラリがありますが CSS Selector をサポートしたものは私は知りませんでした。個人的には Nokogiri を連想させる最大のポイントです。

### Subscripting 対応

エレメントのアトリビュートへのアクセスは Subscripting 対応になっています。

```
element[@"href"];
```
という書き方で href アトリビュートの値が取得出来ます。

### NSDate のサポート

XML が対象になるかと思いますが dateValue メソッドで NSDate 型を返してくれます。
"yyyy-MM-dd'T'HH:mm:ssZ" のみのサポートですがお手軽ですね。

### Block を使った列挙が可能

```objc
- (void)enumerateElementsWithXPath:(NSString *)XPath
                             block:(void (^)(ONOXMLElement *element))block;

- (void)enumerateElementsWithCSS:(NSString *)CSS
                           block:(void (^)(ONOXMLElement *element))block;
```

このような列挙もサポートされています。また NSFastEnumeration に対応させた実装のサンプルにもなっているので勉強になります。

### シンプルな実装

ファイルとしては実質1組の .h .m ファイルでクラスの数はそれ以上ありますが規模の小さいコードなので先に挙げたように Subscripting サポートや NSFastEnumeration 対応などなど実装の参考になりそうなちょうど良いサンプルです。


## まだまだこれから

できたばかりということもあるのか CSS での id 指定が以下のようなエラーを吐いてしまってだめでした。

```objc
XPath error : Invalid expression
//[@id = 'header-container']
```

Nokogiri と同じ指定をしても他にもページによってはエレメントが見つからないこともありました。Mattt は Nokogiri と同等のものを目指しているのか名称だけリスペクトしてるのかわかりませんが個人的には Nokogiri と同等の動きをするライブラリになってくれることを期待しています。

今週末に CocoaPods 対応やドキュメント等が揃ってくるようなのでこれからも楽しみにしたいと思います。

簡単な動作確認ができるサンプルを置いておくので気になる方は試してみてください。

[OnoScrapingSample](https://github.com/griffin-stewie/OnoScrapingSample)
haxelibに.currentが無いよ！って言われた時の対処方法


githubからとあるライブラリをインストールしたのですが、インストール確認のためにリストを出そうとしたところで、

```bash
/usr/lib/haxe/lib/foobar/.current: No such file or directory
```

とか言われて途方に暮れました。

##そもそもなんで？

* haxelib.jsonが無いから？
 * 確かにhaxelib.jsonは無かったけど、haxelib.xmlはある。
* フォルダ構造の問題？
 * そのライブラリはsrcの下に配置
 * オプション指定で
   ```haxelib git foobar https://github.com/foo/foobar master src/     
   ```としても効いてない？

##調べた結果

1.haxelibをアップデートする

```bash
haxelib selfupdate
```

単純にhaxelibのバージョンが古いだけでした。罠ですね。

2.自力で作る

アップデート出来る環境じゃねーよ！って場合は、作ってしまえばおk。

```bash:.current
dev
```

```bash:.dev
/usr/lib/haxe/lib/foobar/git/src
```
jQuery: フォームを送信する前に確認ダイアログを出す


Imageボタンで送信するフォーム:

```html
    <div>
    <form id="main-form" method="get">
       <input type="image" src="harajuku_st.jpg" name="harajuku" />
       <input type="image" src="prince.jpg" name="prince" />
    </form>
    </div>
```

クリックしたら同意を促すダイアログ:

```html
    <div class="modal-dialog" id="modal-for-form">
      <span class="button cancel">取消</span>
      <span class="button ok" >送信</span>
    </div>
```

jqueryでフォームのイメージボタンがクリックした時にダイアログを表示して同意したらサブミットするようにする。:

```js
        // 最初はダイアログを表示しない
        $("div.modal-dialog")
            .dialog({autoOpen:false}); 
        
        // ボタン表示    
        $("div.modal-dialog .button").button();
            
        // キャンセルボタンでダイアログを閉じる
        $("div.modal-dialog .cancel").click(function(e){
            e.preventDefault();
            $(this).parents(".modal-dialog").dialog("close");
        });

        // OKボタンで、イメージボタンのgateをopenにする
        // modal-for に イメージボタンのセレクタが入っている
        $("div.modal-dialog .ok").click(function(e){
            e.preventDefault();
            dlg = $(this).parents(".modal-dialog");
            dlg.dialog("close");
            $(dlg.attr("modal-for"))
				.attr("gate","open")
				.click();
             
        });

        // フォームのイメージボタンが押されたら
        $("form input[type='image']").click(function(e){
            // gateが開いていたらフォームをサブミットする
            if ($(this).attr('gate') == 'open'){
                $(this).attr('gate','close');
                return true;
            }
            
            // 開いていないので、確認ダイアログをモーダルで表示
            // イメージボタンのセレクタをmodal-for にセット
            $("div#modal-for-form")
                .attr("modal-for", 
                    "form input[name='"+ $(this).attr("name") +"']")
                .dialog("open");

			// 今はフォーム送信しない
            return false;
        });
```
OS XでSigilをビルドする

Elixirとかのsigilじゃなくて、EPUBエディタの方のSigilをOS Xでビルドする方法です。

まあ下記を読めばいいだけですが、実際に試してみたということで。

* Sigil: RunningFromSource (https://code.google.com/p/sigil/wiki/RunningFromSource)

# CMakeの準備

Sigilはマルチプラットフォーム対応のため、ビルドもマルチプラットフォームになっているわけですが、そのためにCMakeを使っています。

OS XでCMakeをインストールするにはHomebrewかMacPortsを使うのが早そうです。お使いの方を使ってインストールしてください。

```sh
# Homebrewの場合はこちら
$ brew install cmake

# MacPortsの場合はこちら
$ sudo port install cmake
```

# Qtの準備

SigilにはQt5.xが必要です。インストールしていない場合、まずはQtをインストールします。

QtのインストールはHomebrewとかを使ってもいいのですが、本家のサイトからダウンロードしてもOKです。ダウンロードページは以下。

* Download Qt (http://qt-project.org/downloads)

OS Xの場合、このページにある「Qt 5.2.1 for Mac (378 MB) (Info)」というリンクからインストーラをダウンロードします。ダウンロード後、実行するとインストールできます。インストールするパスは適当に選べるので、あとでそれを指定できるよう記録しておきます。ここではとりあえず``/Users/foo/Qt5.2.1``ということにしておきます（/Users以下に入るのは微妙かもと思ったけどデフォルトがこうなっていて、試したところ特にこれで困らなかったのでこのままにしておきます）。

# Sigilのソースの入手とビルド

ソースはgithubにあるので、そこからgit cloneして持ってきます。

```shell-session
$ git clone https://github.com/user-none/Sigil.git
```

あとは、INSTALL.txtにしたがって実行します。

```shell-session
$ mkdir build
$ cd build
$ cmake -DFORCE_BUNDLED_COPIES=1 -DCMAKE_BUILD_TYPE=Release -DCMAKE_PREFIX_PATH=/Users/foo/Qt5.2.1/5.2.1/clang_64/lib/cmake .. 
$ make
```

気をつけるところは上記のQtのパスを指定する所くらいですね。

makeが終わると、build/bin/Sigil.app ができるので、これを実行するとビルドしたSigilが起動します。

# 余談

以下余談なので読まなくていいです。

これを書いた動機はもちろん下記の件にあります。

* http://sigildev.blogspot.jp/2014/02/sigils-spiritual-successor.html
* http://densho.hatenablog.com/entry/inactive-sigil

朝から世の中はクローズドなエディタ(念のため書いておくとAtomのことです)で盛り上がってるのを微妙な気持ちで横目にしつつ、それなりに知名度の高いFLOSSなEPUBエディタが活発じゃないからということでフェードアウトしていくニュースを読むのはとても悲しいわけです。いやまあEPUB3はまともに作れないので日本語環境では難があるので素人にも玄人にもお勧めできないというのは分かりますが（とはいえ日本語でも技術書とかは横書き一択なので別にEPUB2でも困らないという話もありますが）、だからといってそこで直接の代替アプリがあるわけでもないのに「使わない」という選択肢しか選べないのなら、いったいぜんたい何のために私たちはオープンソースソフトウェアを使っているのかという話になるわけですよ。なんていうか、私たちがこんなんだから自由じゃないエディタに一喜一憂しないといけないわけですよ。だめじゃん。だめだめじゃん。

というわけで、せめてビルドくらいはしてみようということで試してみた結果がこの記事です。別にビルドしたくらいで何かが変わるわけでもないのですが、一歩一歩の積み重ねによってしか大きな成果が生まれないというのも、特にFLOSS界隈ではごく日常的に見かける風景です。ただでさえ電子出版界隈はごく一部しかオープンにならない気がして仕方ないので、そんな息苦しい風土をちょっとずつでも変えていければ、という願いを込めて、この記事を書きました。
Scalaでjava.util.Listをforeachする


JavaのライブラリをScalaで使っていると `java.lang` の型が返ってくることがある。

たとえば、`java.util.List`。

`java.util.List` には `foreach` メソッドがない。

Scalaのリストだったら便利なのに!

そんなときは、

```scala
import scala.collection.JavaConversions._
```

インポートするといい。

と思ったら、これは Scala 2.8 までの作法らしい。

ソースコードを見たら非推奨となっていた。

Scala 2.9 からは

```scala
import scala.collection.convert.WrapAsScala._
```

とする。

どうしてインポートするだけでScalaのListのように振る舞えるか疑問だったが、ソースコードを読んでみたら「暗黙の型変換(implicit conversion)」を行っていた。
MercurialプロジェクトをGithubにフォークする

プロジェクトをフォークしよう！→Mercurialだった
====
Google codeなんかの古いプロジェクトだとMercurialだったりして、Githubにフォークするのが面倒なんですよね。

MercurialはGitと並んで人気の高いバージョン管理システムで、Gitと同じく分散型リポジトリであることや、SVNからリポジトリをチェックアウト出来たりと、ライバル同士のような関係ですね。

そんなMercurialはGithubではサポートされていないのですが、hg-gitというMercurialのプラグインを使うと、MercurialプロジェクトをGithubにpush出来ました。

手順
====
1. hg-gitの環境を用意する
2. リポジトリからMercurialでプロジェクトをcloneする
3. hg-gitを使ってGithubの空プロジェクトにpushする

MercurialプロジェクトをGitにpushしてしまうのがポイントですね。

環境構築
====

環境を用意するのが面倒なんですが、構築の手順は以下などで解説されています。

- [hg push git+ssh://git@github.com/cubicdaiya/dtl.git](http://bokko.hatenablog.com/entry/20091103/1257206790 "hg push git+ssh://git@github.com/cubicdaiya/dtl.git")
- [GitHubをMercurialで使う - Qiita](http://qiita.com/g_maeda/items/8be8a36edb58d77f78dd "GitHubをMercurialで使う - Qiita")

Ansibleに定義したものがこちらになります。

[progre/template-vagrant at hg-git](https://github.com/progre/template-vagrant/tree/hg-git "progre/template-vagrant at hg-git")

後、push先のGithubのプロジェクトを用意しておきましょう。

[Create a New Repository - Github](https://github.com/new)

実行
====

環境が整えば、後は簡単です。

```shell-session
$ hg clone 【MercurialのリポジトリURL】
$ cd 【リポジトリのディレクトリ名】
$ hg push git+ssh://【空のGithubプロジェクト】
```

後はお好きな作業空間でGithubのプロジェクトをCloneするだけです。

実際にフォークしてみた例がこちらになります。

[ adblock-plus-japanese-filter - Google Project Hosting](https://code.google.com/p/adblock-plus-japanese-filter/)
↓
[progre/adblock-plus-japanese-filter - Github](https://github.com/progre/adblock-plus-japanese-filter)
iOS6以前でラベルが真っ白になるトラブル

iOS7で問題なく表示されていたUILabelが
iOS6以前の端末でテストしたら真っ白で何も表示されない（消えてしまった！？）
というトラブルに見舞われました。

解決には手こずりましたが、答えが分かってしまえば
「そんなことか」という感想です。

文字（.textColor）が白だったのですが
背景色と同化しており、ラベル自体が消えたように見えていました。

iOS7だとデフォルトの背景色(.backgroundColor）は透明(clearColor)なのですが
iOS6以前だとこれが白になります。

[http://wazanova.jp/post/66835821354/ios7-ios6](http://wazanova.jp/post/66835821354/ios7-ios6)

上記リンクの　4) UILabel background inconsistency
にある通り、

```objc
label.backgroundColor = [UIColor clearColor];
```

と指定してやれば、iOS6でも同じように表示できます。


＜2014/3/24　追記＞

UILabelだけでなく、UIButtonでも同様の問題が発生します。

UIButtonTypeCustomに設定した上で

```objc
    button.backgroundColor=[UIColor clearColor];
```
とすれば大丈夫です。
Capistranoでタスク実行対象のホストを制限する

Capistranoにはroleという概念があって、基本的にはroleに属するホスト全てでタスクが実行されますが、場合によってはそのroleの中からさらに絞り込んでタスクを実行したいということもありますよね。そんな場合は以下のようにホストを制限します。

```bash
$ bundle exec cap prod deploy:start HOSTS="hostname1,hostname3"
```

タスク指定の後にHOSTSという環境変数を指定し、カンマ区切りでホスト名を設定すればOKです。
これはhostfilterという機能で、3.1から導入されました。仕組みはソースを見ればわかります。

https://github.com/capistrano/capistrano/blob/v3.1.0/lib/capistrano/configuration/servers/host_filter.rb


ちなみにこの環境変数指定での値の受け渡しはCapistrano3からでので2系を使ってる場合は注意してくださいね。
PhoneGapのiOSでSplash画像とiconを変えたい


以下のiconsフォルダ/splashフォルダの画像を変更する必要がある。
それさえ変更すれば反映される。

![スクリーンショット 2014-02-28 0.34.03.png](https://qiita-image-store.s3.amazonaws.com/0/4044/2a53e90e-898d-99a4-5344-904f76e6e38a.png "スクリーンショット 2014-02-28 0.34.03.png")
PHP で外部サーバーの SSL サーバー証明書の有効期限を取得する

下記のコードを実行すると qiita.com の SSL サーバー証明書の有効期限を取得することができます。

```php
<?php
$domain_name = 'qiita.com';

$stream_context = stream_context_create(array(
  'ssl' => array('capture_peer_cert' => true)
));
$resource = stream_socket_client(
  'ssl://' . $domain_name . ':443',
  $errno,
  $errstr,
  30,
  STREAM_CLIENT_CONNECT,
  $stream_context
);
$cont = stream_context_get_params($resource);
$parsed = openssl_x509_parse($cont['options']['ssl']['peer_certificate']);

if(strpos($parsed['subject']['CN'], $domain_name) !== false){
  echo date('Y/m/d', $parsed['validTo_time_t']);
}else{
  echo 'not contract.';	
}
```

実行結果です。

```
2014/03/21
```

これを PHPUnit などでテストにして Jenkins で定期実行すれば SSL サーバー証明書の有効期限を監視できますね。

下記を参考にしました。ありがとうございます。
http://stackoverflow.com/questions/3081042/how-to-get-ssl-certificate-info-with-curl-in-php
MacOSX 10.9にHbaseインストール


## 前提条件
Hadoopはインストール済みとします。
Hadoop構築:http://qiita.com/ma2k8/items/0cd34987211f5fe9ec2c

## Formula書き換え
Hadoopの2系を利用していますが、現在brewで入るのは1系用の0.94系なのでformulaを書き換え
※Hbaseのライブラリも0.96系を利用しているのでついでに合わせとく

+ ソースファイルのハッシュ確認

```
$ wget http://ftp.meisei-u.ac.jp/mirror/apache/dist/hbase/hbase-0.96.1.1/hbase-0.96.1.1-hadoop2-bin.tar.gz
openssl sha1 hbase-0.96.1.1-hadoop2-bin.tar.gz
```

+ ソースファイルのハッシュ確認

```
$ brew edit hbase

# 5,6行目を書き換え
+ url 'http://ftp.meisei-u.ac.jp/mirror/apache/dist/hbase/hbase-0.96.1.1/hbase-0.96.1.1-hadoop2-bin.tar.gz'
+ sha1 '330b1dcac3a43e18e1036ab90315246df95632ca'

```


## インストール
```
$ brew install hbase
$ cd /usr/local/opt/hbase/libexec/conf/
```

## 設定
```sh:hbase-env.sh
export HBASE_CLASSPATH=/usr/local/opt/hadoop/libexec/etc/hadoop
```

```xml:hbase-site.xml
<configuration>
<property>
<name>hbase.rootdir</name>
<value>hdfs://localhost:9000/hbase</value>
<description>The directory shared by region servers.
</description>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/usr/local/opt/hbase/user_name/zookeeper</value>
</property>
</configuration>
```
※${user_name}は適宜書き換え

```sh:.zsh.rc
export HBASE_HOME=/usr/local/opt/hbase/libexec
```


## 起動
```
$ start-all.sh
$ start-hbase.sh
```

## 動作確認
```
$ hbase shell

> create "testtable", "testcolumn"
> describe "testtable"
> put "testtable", "testrow", "testcolumn:x","y"
> get "testtable", "testrow"
> scan "testtable"
> quit
```
http://localhost:60010/master-status
Macでの.bash_profileの作成方法


プライベートでMacBookProを使用している。
最近はGUIでなく、コンソールからの操作が多くなったために
よく使用するコマンドを **alias** 登録しようと思った。

がしかし、```/User/ユーザ名``` 配下に ```.bash_profile``` が
ないことに気づいた。

いろいろ検索し、今回は下記の方法で ```.bash_profile``` を
作成したのでまとめておきます。

## 手順
1. GUI画面で、任意のエディタでテキストファイルを作成し、<br>デスクトップに```bash_profile.test```というファイル名で保存する
※ちなみに今回は下記のコマンドを記載してファイルを作成した

   `alias ll='ls -a'`
   `alias lla='ls -al'`
   `alias son='source ~/.bash_profile'`

1. コンソールを開く

1. 先ほど作成したテキストファイルをリネームする
`cd ~`
`ls -al`
`mv -f ./bash_profile.test ./.bash_profile`
`source ~/.bash_profile`

1. **alias**が有効になったか確認する

----

※とりあえずQiita初投稿してみました。<br>  自分の勉強だとか気づきメモ的な感じで使用していきたいと思います。
スマホ用コードエディタ

スマホとかブラウザでコーディングするためのエディタでいい感じのを見つけたので、私のブログにまとめてみました↓

http://infotech776.blog.fc2.com/blog-entry-45.html

御存知の方もいるかと思いますが、便利そうだと思ったので共有いたします！
AWS上に構築したprivate dockerリポジトリでHTTP 504 Errorが出た→ELB外したら直った


原因は単純だったのですが、判明するまでに時間がかかったのでメモ。

状況
====

http://qiita.com/mokemokechicken/items/a048c427a0706e3857f2
のような感じで、AWS上にDockerのリポジトリを作っていて、
そこに少し大きめのimage(700MBくらい)を push しようとすると、

```
2014/02/27 13:18:10 push: Received HTTP code 504 while uploading layer: 
```

というエラーが出ます。何度やっても同じでした。

原因と解決法
=========

実は私のDockerのリポジトリはELBを使っていたのですが、
このELBが長い時間の接続を打ち切るようです。

ELB経由でなく直接EC2にアクセスするようにしたら発生しなくなりました。


関連
====

http://stackoverflow.com/questions/3234529/http-504-timeout-after-exactly-120-seconds
この内容が結構近いのかなぁと思っていました。
Emacsでバージョン管理下のコードの変更点を視覚化(diff-hl.el)


Git管理下のコードなら、git-gutter.elやgit-gutter-fringe.elを使って変更点を視覚化できるが、Subversion, CVSなどには対応していない。

# diff-hl.el

https://github.com/dgutov/diff-hl
diff-hl.elは、GitやSubversionなどのVCバックエンドに対応しているバージョン管理下のコードの変更点を視覚化することができる。

## 設定

```cl:.emacs
; diff-hl.el
; バージョン管理下のコードをハイライト
(global-diff-hl-mode)
(add-hook 'dired-mode-hook 'diff-hl-dired-mode)
(unless (window-system) (diff-hl-margin-mode))
```


## スクリーンショット

![diff-hl.el.png](https://qiita-image-store.s3.amazonaws.com/0/37982/42ecb491-4877-2d2a-1453-d693fbac5f75.png "diff-hl.el.png")

## 問題点(1)

行番号表示(linum)モードと併用できない。

## 問題点(2)

Emacsのモードラインに一文字空白が余計に入ってしまう。

![diff-hl.el問題点.png](https://qiita-image-store.s3.amazonaws.com/0/37982/8df13af5-69ea-738b-9c80-ee975526b08e.png "diff-hl.el問題点.png")
GoogleChartsのゲージでサーバーのCPU使用率を表示。ヌルヌル動くよ！

## どんな人向けの記事なの？

- html読み書きok
- JavaScript初心者
- JQueryっていうのが便利っぽい
- PHPがちょっとわかるかも

程度の理解がある方（＝僕）

## 投稿のきっかけ

[Google Charts](https://developers.google.com/chart/?hl=ja)のグラフ表示APIは本当に便利ですよね。英語の公式ドキュメントが充実していて分かりやすいのですが、僕のような初心者にとっては少々情報が足りません。「動的なグラフを作成するのはどうすればいいの？」という疑問に対して"最初から最後まで"全部コードを紹介しているドキュメントを見つける事が出来ませんでした。なんとか動くコードを書く事が出来たので、（ググって切り貼りした情報なのですが）投稿してみる事にしました。※難しい事はわからない初心者なのでいじめないでください。

## つくるもの

[GoogleChartsのメーターゲージ](https://developers.google.com/chart/interactive/docs/gallery/gauge?hl=ja)でサーバーのCPU使用率を表示するよ。その際、ページのリロードがないようにJQueryのAjaxを使うよ。

## 部品は3つ

1. シェルスクリプトで現在のCPU使用率を取得する
2. シェルスクリプトを呼び出すphp
3. ゲージを表示して定期的に更新するhtml（本体）

全部同じ階層に置いてある想定で進めます。

## ①シェルスクリプトで現在のCPU使用率を取得する（cpu.sh）

僕のMacOSXだとこんな感じのワンライナーです。topコマンドの必要なところだけ改行なしで切り出してます。Unix、Linuxだと-bオプション使ったりするのでしょうか。サーバー環境に合わせて書いてください。

```shell-session:cpu.sh
#!/bin/sh
top -l1|grep usage|cut -d' ' -f3|tr -d '%'|tr -d '\n'
```

実行結果はこんな感じなん

```:output例
4.16
```

## ②シェルスクリプトを呼び出すphp（cpu.php）

上のシェルスクリプトを呼ぶだけの能無しphpファイルです。

```php:cpu.php
<?php echo `./cpu.sh`;?>
```

## ③ゲージを表示して定期的に更新する（index.html）

上のphpファイルを定期的に読み出すhtmlファイルです。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<script type='text/javascript' src='https://www.google.com/jsapi'></script>
<script type='text/javascript'>
google.load('visualization', '1', {packages:['gauge']});
google.setOnLoadCallback(drawChart);
function drawChart() {
	var data;
	var options = {
		width: 400, height: 400,
		redFrom: 90, redTo: 100,
		yellowFrom:75, yellowTo: 90,
		minorTicks: 5
	};
	var chart = new google.visualization.Gauge(document.getElementById('chart_div'));
	function reloadData(){
		$.ajax({
		type:'GET',
		url:'./cpu.php',
		dataType:'json',
		success:function(text){
			var response = [['Label','Value'],['CPU',text]];
//		console.log(response);	
			data = google.visualization.arrayToDataTable(response);
			chart.draw(data, options);
			}
		});
	}
	reloadData();
	setInterval(reloadData,2000);
}
</script>
</head>
<body>
<div id='chart_div'></div>
</body>
</html>

```
## できた

![スクリーンショット 2014-02-27 22.35.25.png](https://qiita-image-store.s3.amazonaws.com/0/34609/f97484e1-ab5b-e997-bf9b-d56f30d4139d.png)

画像ではわからないけど2秒に1回更新されて針がヌルヌル動きます。

## TODOとか雑記

- 書きっぱなしなので、後でもうちょっと解説追加する予定です。

※ドットインストールのJavaScript入門を視聴中の身なので、本当に拙い実装なのは自覚しております…。もっとこうしたらいいよとかありましたらコメントでおしえて頂けましたら嬉しいです。

中間にphpファイル挟むのは本当に必要なんだろうか…。phpの扱いがあまりにもアレなのでphpタグは入れない事としました。
ファイルの中身の一部を置換して書き換える


以下のような内容のファイルがあるとします。

```Bash
$ cat file
Hello!!
This is original text.
```

`sed`コマンドでファイルの中身を書き換えることができます。

```Bash
$ sed -i -e "s/original/replaced/" file

$ cat file
Hello!!
This is replaced text.
```

置き換わりました。
[CRuby] Ruby VM 周辺(Kernel.#set_trace_func)

Sasadaさんが2012年に行っていた[Ruby VM アドベントカレンダー](http://www.atdot.net/~ko1/diary/201212.html#d12)を読んで、

+ Kernel.#set_trace_func
+ TracePoint
+ TracePoint API
+ Debug Inspector API
+ RubyVM::InstructionSequence

このあたりの内容に興味を持ったので、少し手を動かしてみよう。
バージョンは`2.0.0p195 (2013-05-14) [i386-mingw32]`

## Kernel.#set_trace_func

とりあえずは`set_trace_func`。

参考にしたのは
[リファレンスマニュアル](http://docs.ruby-lang.org/ja/2.0.0/class/Kernel.html#M_SET_TRACE_FUNC)
[Sasadaさんの2012/12/12の記事](http://www.atdot.net/~ko1/diary/201212.html#d12)
[takihiroさんの記事](http://d.hatena.ne.jp/takihiro/20100402/1270338598)
[README.EXT.ja](https://github.com/ruby/ruby/blob/v2_0_0_353/README.EXT.ja#L1411-L1440)
[Code Reading Wiki](http://www.dzeta.jp/~junjis/code_reading/index.php?Ruby1.9%A4%F2%C6%C9%A4%E0)
[ひとり勉強会](http://d.hatena.ne.jp/hzkr/19000101)

### set_trace_funcの簡単な使い方

```rb:trace.rb
1 : set_trace_func lambda { |*args| 
2 :   p args
3 : }
4 :
5 : class Foo
6 :   def bar
7 :     p "Hello"
8 :   end
9 : end
10:
11: foo = Foo.new
12: foo.bar

# =>
["c-return", "trace.rb", 1, :set_trace_func, #<Binding:0xf6c540>, Kernel]
["line", "trace.rb", 5, nil, #<Binding:0x10cba80>, nil]
["c-call", "trace.rb", 5, :inherited, #<Binding:0x10cb840>, Class]
["c-return", "trace.rb", 5, :inherited, #<Binding:0x10cb600>, Class]
["class", "trace.rb", 5, nil, #<Binding:0x10cb3a8>, nil]
["line", "trace.rb", 6, nil, #<Binding:0x10cb198>, nil]
["c-call", "trace.rb", 6, :method_added, #<Binding:0x10caf88>, Module]
["c-return", "trace.rb", 6, :method_added, #<Binding:0x10cad48>, Module]
["end", "trace.rb", 9, nil, #<Binding:0x10cab20>, nil]
["line", "trace.rb", 11, nil, #<Binding:0x10ca910>, nil]
["c-call", "trace.rb", 11, :new, #<Binding:0x10ca700>, Class]
["c-call", "trace.rb", 11, :initialize, #<Binding:0x10ca4c0>, BasicObject]
["c-return", "trace.rb", 11, :initialize, #<Binding:0x10ca280>, BasicObject]
["c-return", "trace.rb", 11, :new, #<Binding:0x10ca058>, Class]
["line", "trace.rb", 12, nil, #<Binding:0x10c9e30>, nil]
["call", "trace.rb", 6, :bar, #<Binding:0x10c9c08>, Foo]
["line", "trace.rb", 7, :bar, #<Binding:0x10c99e0>, Foo]
["c-call", "trace.rb", 7, :p, #<Binding:0x10c97a0>, Kernel]
["c-call", "trace.rb", 7, :hash, #<Binding:0x10c9560>, Kernel]
["c-return", "trace.rb", 7, :hash, #<Binding:0x10c9338>, Kernel]
["c-call", "trace.rb", 7, :inspect, #<Binding:0x10c9110>, String]
["c-return", "trace.rb", 7, :inspect, #<Binding:0x10c8eb8>, String]
"Hello"
["c-return", "trace.rb", 7, :p, #<Binding:0x10c8bb8>, Kernel]
["return", "trace.rb", 8, :bar, #<Binding:0x10c8990>, Foo]
```

イベントは

+ "line":      式の評価。
+ "call":      メソッドの呼び出し。
+ "return":    メソッド呼び出しからのリターン。
+ "c-call":    Cで記述されたメソッドの呼び出し。
+ "c-return":  Cで記述されたメソッド呼び出しからのリターン。
+ "class":     クラス定義、特異クラス定義、モジュール定義への突入。
+ "end":       クラス定義、特異クラス定義、モジュール定義の終了。
+ "raise":     例外の発生。

があり、それぞれが実行される度に設定した`proc`が呼ばれます。

`args`はそれぞれ`event, file, line, id, binding, klass`になっています。
先頭で`Kernel.#set_trace_func`を呼び出しておけば、それ以降のイベントをフック出来ます。

### Ruby標準ライブラリ

リファレンスマニュアルにも書いてあるとおり、

+ debug
+ tracer
+ profile

は`set_trace_func`を利用しているそうです。
Excel VBAで複数項目でvlookupする的なもの

前提
====

単純なものに関しては当然vlookupなどで対応できますが、複雑なものは色々頭をひねる必要が出てきます。
それはそれで楽しいのですが、VBAで検索するならループ回すだけなので簡単です。

ちなみにあんまりVBA書いたことありません。
DB関数でできるんじゃないかという説もありますけどどうするんでしょうか。

vlookupとは
===========

一応、説明します。下記のようなワークシートがあるとして

| - |  A          |   B   |
|---|-------------|-------|
| 1 | 緑のたぬき   | 東洋水産 |
| 2 | 赤いきつね   | 東洋水産 |
| 3 | 緑のどん兵衛 | 日清食品 |
| 4 | 赤いどん兵衛 | 日清食品 |
| 5 | 力うどん    | 東洋水産 |

```
=VLOOKUP(B9,A1:B5,2)
```
 
と書いて、B9に「緑のたぬき」と書くと「東洋水産」が返ってくるような関数です。

* 引数1、検索したい文字列（SQLでいうとWHILEの col = ?の?の部分）
* 引数2、検索対象の範囲。左端のカラムから引数1を検索する。
* 引数3、表示したいデータのカラム位置。引数2の範囲の中で、左端から始まります。数字は1から始まります。

何が問題か
==========

まず検索条件が1つしか設定できません。なので下記のようなテーブルから、商品名とサイズを指定して値段を得るのができません。

| - |  A          |   B   | C      | D   |
|---|-------------|-------|--------|-----|
| 1 | 商品名       | メーカ | 内容量 | 値段 |
| 2 | 緑のたぬき   | 東洋水産 | 50 | 100 |
| 3 | 緑のたぬき   | 東洋水産 | 100 | 200 |
| 4 | 赤いきつね   | 東洋水産 | 50 | 100 |
| 5 | 赤いきつね   | 東洋水産 | 100 | 200 |
| 6 | 緑のどん兵衛 | 日清食品 | 100 | 200 |
| 7 | 赤いどん兵衛 | 日清食品 | 100 | 200 |
| 8 | 力うどん    | 東洋水産 | 100 | 200 |

次に、検索対象が左端のカラム固定になるので、検索対象より左側のカラム値は検索できません。

VBA例
=====

表A（マスタ）と表B（コピー先）を比較して、値段が違っていたら表Bのカラム色を変える、ということをやっています。DB設計書と詳細設計書の突合（もしくは自動的に穴埋め）するために作りました。SIバンザイ。


### 表A(Sheet2)

| - |  A          |   B   | C      | D   |
|---|-------------|-------|--------|-----|
| 1 | 商品名       | メーカ | 内容量 | 値段 |
| 2 | 緑のたぬき   | 東洋水産 | 50 | 100 |
| 3 | 緑のたぬき   | 東洋水産 | 100 | 200 |
| 4 | 赤いきつね   | 東洋水産 | 50 | 100 |
| 5 | 赤いきつね   | 東洋水産 | 100 | 200 |
| 6 | 緑のどん兵衛 | 日清食品 | 100 | 200 |
| 7 | 赤いどん兵衛 | 日清食品 | 100 | 200 |
| 5 | 力うどん    | 東洋水産 | 100 | 200 |

### 表B(Sheet1)

| - |  A          | B      | C   |
|---|-------------|--------|-----|
| 1 | 商品名       | 内容量 | 値段 |
| 2 | 緑のたぬき   | 100 | 200 |
| 3 | 赤いきつね   | 50 | 100 |
| 4 | 赤いきつね   | 100 | 200 |
| 5 | 力うどん    | 100 | 200 |

```vbnet
Sub CheckButton_Click()
  For Each v In Sheet1.Range("C1:C8")
    name = v.Offset(0, -2).Text
    contents = v.Offset(0, -1).Text
    
    '先に背景色をリセット
    v.Interior.ColorIndex = 0
    
    If Len(contents) <> 0 Then
        '一致判定用フラグ
        found = False
        
        '値段が一致しなかったら色を変える
        For Each t In Sheet2.Range("A2:A8")
          If t.Text = name And t.Offset(0, 2).Text = contents Then
          
            found = True
            If t.Offset(0, 3).Text <> v.Text Then
              v.Interior.ColorIndex = 8

            End If
            
          End If
        Next
        
        '商品が見つからなかったら色を変える
        If found = False Then
          v.Interior.ColorIndex = 9
        End If
        
    End If
  Next
End Sub
```

感想
====

補完効くので意外と楽。ヘルプは充実しているけど、オブジェクトの扱いが特殊だしユースケースがないのでAPI調べるのがめんどくさい。Google頼み。
Windbg上でPython


windbgを使ってダンプの解析したり、ライブデバッグするときにこの作業自動化できたら楽なのになーと思うときないですか？
私はあります。けどwindbgのスクリプト機能を覚えるのもなんかなーと思ってたらpythonをwindbg上で使える拡張を見つけたので紹介しておきます。

Python extension for WinDbg
https://pykd.codeplex.com/

以下にインストールからhello worldの流れを適当に書いておきます。

### 1. 自分の環境にあったインストーラを下記からダウンロードして実行

https://pykd.codeplex.com/releases/view/116361


- 私はなんちゃらsetup.exeを使いました

- windbgのインストールフォルダにあるwindbg拡張のフォルダ？のパスをインストール途中に聞かれます 
- pythonが入ってない環境の場合、ネットからpythonのmsiをダウンロードして実行してくれます

### 2. windbgを起動

### 3. windbgをとりあえず適当なプロセスにアタッチしてみる

- notepad.exeとかでいいです

### 4. python拡張を読み込む

```
0:001>.load pykd.pyd
```

### 5. python インタプリタを起動

```
0:001>!pycmd
```

### 6. hello worldを出力してみる

```
>>>print "hello world"
```

でも私あんまりpythonしらないんですよね。まぁ適当にググりながら弄ってみます。
Xamarin によるクロスプラットフォームモバイルアプリ開発、資料と補足


2/26 の [うずらインキュベータ](http://atnd.org/events/47898) という勉強会で、Xamarin の話をしました。

[![](http://blog.amay077.net/assets/images/posts/slides_from_my_xamarin_introduction_01.png)](http://www.slideshare.net/amay077/xamarin-31674661)

<iframe src="http://www.slideshare.net/slideshow/embed_code/31674661" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px 1px 0; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="https://www.slideshare.net/amay077/xamarin-31674661" title="Xamarin によるクロスプラットフォームモバイルアプリ開発" target="_blank">Xamarin によるクロスプラットフォームモバイルアプリ開発</a> </strong> from <strong><a href="http://www.slideshare.net/amay077" target="_blank">amay 077</a></strong> </div>

45分という長い時間話すのは勉強会では初めてだったのですが、なんとか説明し切ることができました。（ちょっとデモが中途半端になってしまいましたが）

資料は [Qiita に書いてきた](http://qiita.com/tags/xamarin) 内容のまとめみたいなものですが、少し補足します。

## Xamarin で作った経験あるの？

仕事では、まだ無いです（^_^;）
個人アプリでは「[富士フォト](https://itunes.apple.com/us/app/fu-shifoto/id806913229)」というのを iOS 用は Xamarin.iOS で作りました。[Android](https://play.google.com/store/apps/details?id=com.amay077.android.fujiphoto) は Java ですが Xamarin 化したいな。

## Win+Visual Studio ではダメなの？

個人の見解ですから（^_^;）
私も元々は Windowsの開発がメインで Visual Studio の強力さは知っていますが、iOS やるならどういう形にせよ Mac+Xcode を扱わないといけないので、慣れておいた方がよいかなと。

また、Microsoft との提携以降、Microsoft のエバンジェリストさんや MVP の方々が Visual Studio + Xamarin の話をものすごく展開されているので、そちらにお任せした次第です。

## 実行モデルのとこ

JavaSE が .NET に置き換わる図になっていますが、実際には少し違っていて、JavaSE のラッパもあります。例えば文字列型には、``System.String`` と ``Java.Lang.String`` があります。当然、理由がなければ前者を使った方がよいわけですが。

iOS のスタックに関しては、実はどこからどこまでが「CocoaTouch」なのかよく分かってません。

## 他のクロスプラットフォーム開発ツールとの比較

Titanium, AIR については2年くらい前に少し触ったことがあります。PhoneGap と DelphiXE についてはスペックを見て＆詳しい方からの情報を元にしてます。

Titanium は次期 [Ti.Next](http://titanium-mobile.jp/38) では JavaScriptCore を使ってすんごく速くなるそうですし、AIR も当時よりだいぶ [高速になったらしい](http://www.slideshare.net/pik256/dev-sumi2014-13c4rev) です。

## C# のとこ

https://xamarin.com/csharp よりは悪意のないコードかとｗ
（Objective-C と比較しようとすると Obj-C の方が画面に入らないので Java との比較にしました。）



こんなところで。
何かおかしなところがあったらコメント頂けるとありがたいです。
FacebookのPaperのUIを実装したオープンソースを読んでみた


### 対象
* Facebook Pager 動画 http://vimeo.com/85421325
* 読んだソースはこちら
* -> https://github.com/hebertialmeida/HAPaperViewController/commit/8b0fefcc76d2c6acf134316f5587533db98a59ca

![スクリーンショット 2014-02-27 8.18.35.png](https://raw.github.com/hebertialmeida/HAPaperViewController/master/Paper/Images.xcassets/paper.gif "スクリーンショット 2014-02-27 8.18.35.png")


### 全体像
* navigationControllerにcollectionViewControllerを配置
* collectionViewControllerのcollectionViewを拡大縮小すると、navigationが遷移
* navigationControllerが遷移するとcustom animationが実行されて、拡大縮小のanimationを手でコントロールできる
* navigationControllerの遷移中にのanimation
* 背景の画像は定期的に切り替わるようになっている
* 横の動きはCollectionViewControllerの動き

### 詳細
* HASmallCollectionViewControllerとHATransitionControllerの二つで構成されている。
* HASmallCollectionViewController
    * 背景画像のセット、背景画像の切り替え、collectionViewの横のスクロール
    * 背景画像のセットと切り替え https://github.com/hebertialmeida/HAPaperViewController/blob/8b0fefcc76d2c6acf134316f5587533db98a59ca/Paper/HASmallCollectionViewController.m#L40-L162

* HATransitionController
    * navigationControllerのdelegateをappDelegateにセット。
    * ``navigationController:animationControllerForOperation:fromViewController:toViewController:``は、transition中にnoninteractiveなanimatorを返す
    * ``navigationController:interactionControllerForAnimationController:``は、transition中に使われるインタラクティブなanimator objectを返す。
    * animator objectとは、``NSObject<UIViewControllerAnimatedTransitioning, UIViewControllerInteractiveTransitioning>``のこと
    * animationControllerForOperation -> interactionControllerForAnimationController -> willShowViewController -> didShowViewControllerが呼ばれる
    * interactionControllerForAnimationControllerの返り値のobjectで以下のmethodが呼ばれる。 https://github.com/hebertialmeida/HAPaperViewController/blob/8b0fefcc76d2c6acf134316f5587533db98a59ca/Paper/HATransitionController.m#L66-L87

### 一緒にコードリーディングしたメンバー
* http://qiita.com/morizotter
* http://qiita.com/south37
* wantedlyのもくもく会で、今回のコードリーディングしてみました
* 毎週木曜日にやってるので、ふらっと寄ってみてください
* -> https://www.wantedly.com/projects/5106

### メモ
* main storyboardは使われてない
* HAViewControllerも使われていない
* UIPanGestureRecognizerも使われてない
* HATransitionControllerでpitchイベントとnavigationControllerのanimatorの両方のmethodが定義されていて少し混乱した
* 全体的にcollectionViewControllerとnavigationControllerのcustom animationを組み合わせると簡単に実装できそう

### 参考URL
* https://developer.apple.com/library/ios/documentation/uikit/reference/UINavigationControllerDelegate_Protocol/Reference/Reference.html
* https://developer.apple.com/videos/wwdc/2012/?id=205
* http://labs.techfirm.co.jp/ipad/cho/466
Dockerのネットワーク周りの備忘

boot2dockerのネットワーク周りでちょっとハマったので書いた。間違いがあったら突っ込みお願いします。

Dockerの構造
============

## フロントエンドとデーモン

dockerフロントエンドと、実際にコンテナを操作するデーモンは、go言語で書かれた同一バイナリだが別物だ。フロントエンドは、MacなどLinux以外の環境でも動作する。デーモンは現状ではDebian/CentOSでしか動作しない。通常はフロントエンドとデーモンはUNIXソケットで通信を行う。

### デーモンを外部接続を許可させる起動方法

``` sh
$ docker -d -H tcp://0.0.0.0:4243/ -H unix:///var/run/docker.socket
```

Debian/CentOSにどういう方法でインストールしたかによるかもしれないが、通常は外部接続を許してないので、起動スクリプトを上記のように変更する。

### リモート接続する方法

``` sh
$ export DOCKER_HOST="tcp://192.168.1.2:4243"
```

フロントエンド側も通常はUNIXソケットを見に行くので、リモート接続する場合DOCKER_HOSTの環境変数の設定が必要となる。

## boot2docker

Linux以外の環境でお手軽にdockerを試すことのできるboot2dockerイメージは、dockerに最小限必要なものだけがインストールされたものだ。Macのbrewで一発インストールできるようになったboot2dockerフロントエンドは、VirtualBoxでboot2dockerイメージを操作するvagrantのようなラッパーだ。

boot2dockerをはじめとした仮想マシン上でデーモンが動作している場合は、コンテナ内部で立ち上げたサーバー類のポートフォワードなどを考えないといけない。方法としてはVirtualBoxのCLIであるVBoxManageを使う方法は[http://qiita.com/ikuyamada/items/3f12de859a87d51fdd79](http://qiita.com/ikuyamada/items/3f12de859a87d51fdd79)に書かれている。別の方法としてはsshで接続してsshのポートフォワード機能を使うなどがある。

httpdを起動して、ネットワーク周りを探る
=======================================

```
$ cat > Dockerfile
FROM centos
RUN yum install -y httpd
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

$ docker build -t httpd .
$ docker run -d httpd
```

この状態でhttpdを起動した場合、httpdにアクセスするためには、対象のコンテナのIPを調べて直接アクセスする必要がある

```
$ docker inspect `docker ps -l -q` | grep IPAddress | cut -d '"' -f 4
$ curl http://出てきたIP/
```

起動方法を変えることでポートマッピングをすることもできる

```
$ docker run -d -p 80:80 httpd
$ curl http://localhost/
```

※この時boot2dockerとかを使ってる場合は、さらにもう一段ポートフォワードする必要があることを忘れないように。
gulp入門

# gulp入門

![gulp_logo.jpg](https://qiita-image-store.s3.amazonaws.com/0/3613/5bb9f76c-927f-c9f6-c92d-139e28affb35.jpeg)

## アジェンダ

* なぜなにgulp
* 実際に使ってみる
* おまけ
* 参考

## なぜなにgulp

### gulpとは

* [gulp公式](http://gulpjs.com/)
* Gruntと同じ自動化ツールです（参考：[Grunt入門](http://qiita.com/svartalfheim/items/3968fd94da05f565d18f)）

### Gruntと何が違うの？

* （個人的主観ですが）Gruntよりも書きやすい
* まだ対応パッケージが少ない

### gulpの特徴

* The streaming build system
* どういうイメージかというと以下のように入力から出力までを数珠つなぎに処理していきます。

```
入力 >>> 処理1 >>> ... >>> 処理N >>> 出力
```

## 実際に使ってみる

### 事前準備

* Githubの[Getting Start](https://github.com/gulpjs/gulp/blob/master/docs/getting-started.md)を参考にします
* どこか適当な場所にフォルダを作ってcdコマンドでそのフォルダに移動しておきます。

#### gulpをグローバルにインストール

-gオプションでグローバルになるのでインストール後はどこからでもgulpコマンドを呼べるようになります。

```
npm install -g gulp
```

#### プロジェクトにgulpをインストール

グローバルと両方必要なようです

```
npm install --save-dev gulp
```

ちなみに```npm i -D gulp```でショートカットできます

#### package.json の作成

Getting Startだと記載されてないけど必要（のはず）

```
npm init
```

package.jsonの内容については[Grunt入門](http://qiita.com/svartalfheim/items/3968fd94da05f565d18f)を参考にしてもらえればと思います

これでひとまずgulpを使う環境ができました。

### gulpfile.jsの作成

* GruntでいうGruntfile.jsと同じでここにタスクを記述していきます。
* ファイルを作成、編集していきます

```
vi gulpfile.js
```

```
//gulpのインポート
var gulp = require('gulp');

//この記述でタスクを登録していきます
gulp.task('default',function(){

});
```

### タスクの登録

モジュール名は「gulp-なんとか」になるようなので「gulp connect」みたいに欲しいパッケージをググるとでてくるので

```
npm i -D gulp-connect
```

とパッケージを追加していけば大丈夫です。ここはGruntと同じですね。

jshint,uglify,connectのタスクを登録した例

```js
//パッケージのインポート
var gulp    = require('gulp');
var connect = require('gulp-connect');
var jshint  = require('gulp-jshint');
var uglify  = require('gulp-uglify');

//connectの登録
gulp.task('server',connect.server({
    root:['dst'],
    port:8080,
    livereload:true,
    open:{
        browser:'Google Chrome'
    }
}));

//jshintとcompressのタスクをまとめて登録
gulp.task('hint&compress',function(){
    gulp.src('./src/**/*.js')
    .pipe(jshint())
    .pipe(uglify())
    .pipe(gulp.dest('dst'));
});

//タスクを全部まとめてdefaultで実行できるようにする
gulp.task('default',['hint','compress','server']);
```

jshintとcompressの処理が数珠つなぎで行うようになっています。

```
入力(gulp.src()) >>> 処理1(pipe()) >>> ... >>> 処理N(pipe()) >>> 出力(gulp.dest())
```

ファイルに対してタスクを振り分けることができるのでとてもわかりやすいと思います。

あとは```gulp```コマンドだけで実行できます

```
$ gulp
[gulp] Using file /Users/niko/workspace/gulp/gulp_test/gulpfile.js
[gulp] Working directory changed to /Users/niko/workspace/gulp/gulp_test
[gulp] Running 'hint&compress'...
[gulp] Finished 'hint&compress' in 6.21 ms
[gulp] Running 'server'...
[gulp] Connect LiveReload on 35729 port
[gulp] Finished 'server' in 520 ms
[gulp] Running 'default'...
[gulp] Finished 'default' in 24 μs
[gulp] Server started on 8080 port
[gulp] Opened http://localhost:8080/ in Google Chrome
```

以上になりますが、いかがだったでしょうか。
個人的にはnode.jsっぽく書ける上に記述量も減って好きです。

## おまけ

* [gulpfile.jsをGUIで記述できるサイト](http://gulpfiction.divshot.io/)

## 参考
* https://github.com/gulpjs/gulp
* http://jaysoo.ca/2014/01/27/gruntjs-vs-gulpjs/

なにか気づいた点などあればコメントの方に書いてもらえればと思います。
redmine wiki のページ内リンク

```redmine
h1. ページ内のタイトル
```

この、｢ページ内のタイトル｣ってとこに飛ばしたい。

\#の後ろにリンク先のタイトルを指定する。

```redmine
[[wikiですよ#ページ内のタイトル]]
```
XPath1.0の文字列をエスケープする


`"` が含まれていない → `"` で囲む
`'` が含まれていない → `'` で囲む
それ以外 → contat() する

```scala
def escapeXpathString(raw:String):String = {
	if (raw.contains("\"") == false) {
		return "\"" + raw + "\""
	}

	if (raw.contains("\'") == false) {
		return "'" + raw + "'"
	}
	
	return "concat('" + raw.split("'").mkString("', \"'\", '") + "')"
}

// 見やすくするためのヘルパー
implicit class MyString(str: String) {
	def pad() = " " + str + " "
}

assert(escapeXpathString("foo").pad == """ "foo" """)
assert(escapeXpathString("O'Reilly").pad == """ "O'Reilly" """)
assert(escapeXpathString("\"Hello\"").pad == """ '"Hello"' """)
assert(escapeXpathString("O'Reilly \"Hello\"").pad == """ concat('O', "'", 'Reilly "Hello"') """)

```

XPath2.0からはエスケープの仕様が追加されているので、concatする必要がない。
簡単！Cocos2d-x + Eclipse でビルド時間を4分の1に短縮


Eclipse 上で Cocos2d-x アプリケーションを開発するときにネックとなるのがビルド時間の長さではないでしょうか。デフォルトの設定ではコンパイル処理が並行化されておらず、マルチコアのCPUを使っている場合、その性能を活かしきれていません。以下の簡単な設定（2種類）でパラレルにコンパイルする事が可能になりビルド時間を大幅に短縮できます。

追記：この記事は Cocos2d-x の2系に対応しています。3系の場合については
こちらに改めて書きましたのでご参照ください。
http://qiita.com/d_nishiyama85/items/5e95ce048e5ee60bfa72

## 方法その1

プロジェクトのプロパティー
→ C/C++ ビルド
→ 振る舞い
→ ビルド設定
→ Enable parallel build にチェック
→ Use optimal jobs を選択

![cocos_test_のプロパティー.png](https://qiita-image-store.s3.amazonaws.com/0/28313/e57ef867-4e47-e89f-2cb8-91e1725226cd.png "cocos_test_のプロパティー.png")

## 方法その2
プロジェクトのルート直下にある build_native.sh で、
ndk-build を呼んでいる部分にパラレルコンパイルのオプションを追加します。

![build_native.sh-12.png](https://qiita-image-store.s3.amazonaws.com/0/28313/5ae93a3a-7974-00d7-ee5d-ab08a729bbff.png "build_native.sh-12.png")


```
--jobs=7
```

"7"の部分の値は環境に合わせて適当に変えてください。

わたしの環境（core i7）では設定前にはクリーンしてからのビルド時間が2分3秒かかっていたのが32秒に短縮し、約4倍のスピードになりました。



簡単に設定できて効果は大なのでぜひお試しを。
objdump -x でバイナリ等がクロスビルドされているのか確認する

クロスビルドの甲斐あって、ライブラリやら実行バイナリやらが生成されたものの、
本当にこれってクロスビルドされたのかしら？もしかして普通にビルドしただけちゃうん、と思ったときに、
objdump -xコマンドでそれとなくクロスコンパイルができてるかどうかの確認ができるという小技。

まず、Linux PC（i386）でもって、その環境向けのバイナリに対してobjdumpをした場合。
ずらずらっと情報が出力されるが、頭の部分は以下のようになっていると思われる。

```
$ objdump -x ./libxxx.a | more

In archive ./libxxx.a:

s2_meth.o:     file format elf32-i386
rw-rw-r-- 1000/1000   2152 Feb 27 11:42 2014 s2_meth.o
architecture: i386, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x00000000
```

以下は Android向けにクロスビルドしたライブラリに対して、同じくobjdumpしてみたときの例。

```
$ objdump -x ./libxxx.a | more

In archive libxxx.a:

s2_meth.o:     file format elf32-little
rw-rw-r-- 1000/1000   2200 Feb 25 20:02 2014 s2_meth.o
architecture: UNKNOWN!, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x00000000

```

おわかりいただけただろうか。
Android向けにクロスビルドしたライブラリは、

```
architecture: UNKNOWN!
```

になっているのである。これ、UNKNOWNになってれば少なくともLinux PC（i386）向け以外のバイナリであるってことがわかり、つまり少なくとも何らかのクロスコンパイルされてるってことがわかるのである。
とりえあず、簡単なやり方なので、クロスビルドできてるか確かめたくなる機会があったらぜひお試しあれ。
Integral挑戦ログ


[Integral](https://github.com/fukamachi/integral)
がかっこいい、と思ったのでチャレンジ中。途中まで動作確認した。
ちょっと様子がつかめてきたー。

```
; SLIME 2013-11-17
CL-USER> (ql:quickload :integral)
To load "integral":
  Load 1 ASDF system:
    integral
; Loading "integral"

(:INTEGRAL)
CL-USER> (import 'integral:connect-toplevel)
T
CL-USER> (connect-toplevel :sqlite3
                           :database-name "c:/home/ken/lisp/testdb.db")
To load "dbd-sqlite3":
  Load 1 ASDF system:
    dbd-sqlite3
; Loading "dbd-sqlite3"

#<DBD.SQLITE3:<DBD-SQLITE3-CONNECTION> #xD0F3BFE>
CL-USER> (import 'integral:<dao-table-class>)
T
CL-USER> (defclass user ()
           ((name :col-type text
                  :initarg :name))
           (:metaclass <dao-table-class>))
#<<DAO-TABLE-CLASS> USER>
CL-USER> (import '(integral:table-definition integral:execute-sql))
T
CL-USER> (table-definition 'user)
"CREATE TABLE \"user\" (\"%oid\" SERIAL NOT NULL PRIMARY KEY, \"name\" TEXT)"
NIL
CL-USER> (execute-sql (table-definition 'user))
; Evaluation aborted on #<DBI.ERROR:<DBI-PROGRAMMING-ERROR> #xD090EC6>.
CL-USER> (integral:ensure-table-exists 'user)
CREATE TABLE IF NOT EXISTS "user" ("%oid" SERIAL NOT NULL PRIMARY KEY, "name" TEXT);
NIL
CL-USER> (make-instance 'user :name "Ken-Coba")
#<USER %oid: <unbound>>
CL-USER> (import 'integral:save-dao)
T
CL-USER> (save-dao (make-instance 'user :name "Ken-Coba"))
```
css transform で scale や rotate を使用した時に 画像やフォントのエッジを綺麗にする。


画像はchromeの場合、backface-visibility の指定で綺麗になる。

```
-webkit-backface-visibility: hidden
```

font には font-smoothing の指定でアンチエイリアスがきく

```
-webkit-font-smoothing: antialiased
```
Mongooseでaggregateしている時に$groupはネストしている値を読まない（リンクのみ）

http://www.mikitamanko.com/blog/2013/08/25/mongoose-aggregate-with-group-by-nested-field/
ネストしている所は$projectで逃げるように書かれている…が、自分の所ではうまくいかなんだ。バージョンとかによるのかもしれない。
UbuntuのGUIを再起動する(X)

いきなりディスプレイがフリーズしてアクセスできなくなって焦ったので手順をメモ

```shell-session
sudo service lightdm restart
```

以上。

私の環境ではXがゾンビ化したのか、↑を行ってもlightdmが再起動しなかったので、
pkill(もしくはxkill -a)でプロセスを殺してからstartを実行した。
RedShiftでテーブルに未ソート行があるか確認する


```sql:やりかた
SELECT slice,id,db_id,name,rows,sorted_rows,(rows-sorted_rows) as row_diff FROM stv_tbl_perm ORDER BY db_id, name, slice;
```

- row_diffが1以上なら未ソート行がある
- VACCUM SORT ONLY tablename; でソートを指示できる
- VACUUMしてもソートされない: sortkey設定してるか？
scikit-learn によるクラスタリング (1)

## クラスタリングの概要

実装根拠は以下を参照してください。
[K-means++](http://en.wikipedia.org/wiki/K-means%2B%2B)
[K-means](http://en.wikipedia.org/wiki/K-means_clustering)
英語ですけど日本語のページより情報量が多くまた厳密性があると思います。

### scikit-learn の概要

Python で機械学習のあれこれをできる超便利なライブラリです。この辺を読んでください。

[scikit-learn](http://scikit-learn.org)
[scikit-learn の紹介](http://sucrose.hatenablog.com/entry/2013/05/25/133021)

### 前提

入力ファイルとして文字列ごとに改行で区切られたテキストファイルを想定します。
使い方としては python clustering.py input.txt output.txt のように引数に入出力ファイルを指定します。
途中 print() で途中結果を表示しています。
出力ファイルにクラスタリング後のデータが出力されます。
ぜひ適当なテキストファイルを用意して実際に動かしてみてください。

### 実装

コード全体は以下の通りです。

[clustering.py](https://github.com/ynakayama/sandbox/blob/master/python/sklearn/clustering.py)

クラスタを生成するメソッドのみを引用します。

```python:clustering.py

def make_cluster(self):
    """ クラスタを生成して返す
    """

    # 処理対象の文字列によるリストを生成する
    texts = self._read_from_file()
    print("texts are %(texts)s" %locals() )

    # TF-IDF ベクトルを生成する
    vectorizer = TfidfVectorizer(
        max_df=self.max_df,
        max_features=self.max_features,
        stop_words='english'
        )
    X = vectorizer.fit_transform(texts)
    print("X values are %(X)s" %locals() )

    # KMeans インスタンスを生成しクラスタリングする
    # パラメータはデータの量や特性に応じて適切なものを与えるようにする
    km = MiniBatchKMeans(
        n_clusters=self.num_clusters,
        init='k-means++', batch_size=1000,
        n_init=10, max_no_improvement=10,
        verbose=True
        )
    km.fit(X)
    labels = km.labels_

    # 属するクラスタとその距離を計算する
    transformed = km.transform(X)
    dists = np.zeros(labels.shape)
    for i in range(len(labels)):
        dists[i] = transformed[i, labels[i]]

    clusters = []
    for i in range(self.num_clusters):
        cluster = []
        ii = np.where(labels==i)[0]
        dd = dists[ii]
        di = np.vstack([dd,ii]).transpose().tolist()
        di.sort()
        for d, j in di:
            cluster.append(texts[int(j)])
        clusters.append(cluster)

    # 生成したクラスタを返す
    return clusters
```

### 考察

scikit-learn を利用することにより、きわめて簡素なコードでクラスタリングができることがわかりますね。
多種多様なパラメータが随所で利用されます。
実アプリケーションの利用ではデータの特性にあわせてこれらをチューニングしていくことが求められます。
Tab文字（0x09, HT）をgrepしたい

```sample.txt
string=AAA[Tab文字]AAA
```

みたいなファイルがあって、Tab文字をgrepしたいときのメモ。
そのまま Tab を押すと、
カレントディレクトリのファイルがぴろぴろーっと表示されるだけだもんね。


■手順
CTRL+V → Tabキー で、sh へTab文字を渡せる。

■結果

<pre>
[docokano@unbabafedora html]$ echo 'AAA        AAA' | grep '   ' --colour=auto
AAA     AAA
[docokano@unbabafedora html]$ echo 'AAA        AAA' | od -xc
0000000    4141    0941    4141    0a41
          A   A   A  \t   A   A   A  \n
0000010
</pre>


できた。やったね！
node.js + passenger キャッシュを無効化

passengerで動かすとキャッシュが効くため、ソースを変更しても反映されない。
開発中は、アプリケーションに ``tmp/always_restart.txt`` を作成しておくことでリクエストごとにアプリケーションが再起動され、ソースの更新が反映される。

## 参考
* [Phusion Passenger: Node.js tutorial · phusion/passenger Wiki](https://github.com/phusion/passenger/wiki/Phusion-Passenger%3A-Node.js-tutorial#wiki-5-using-passenger-in-development)