OmniAICreator/Qiita-1.07M huggingface dataset:
ICML 2014 Best Paper斜め読み

# LDA (Latent Dirichlet Allocation) ?

とても分かりやすいLDAの紹介
[Latent Dirichlet Allocation(LDA)を用いたニュース記事の分類](http://developer.smartnews.be/blog/2013/08/19/lda-based-channel-categorization-in-smartnews/)

ICML 2014 Best PaperなLDAの論文
Understanding the Limiting Factors of Topic Modeling via Posterior Contraction Analysis
[ICML 2014 Awards Sponsored by Baidu](http://icml.cc/2014/index/article/26.htm)

# 斜め読みした適当な意訳

## Abstract

LDAはよく知られた機械学習のtopic modelで、成功した応用例も沢山あるけれど、LDAの振る舞いを説明するきちんとした理論というものはほとんど無かったから、何がLDAの精度を左右するのかよく分からなかった。
そこで、この論文ではデータ増加に伴う収束性を示す定理を証明したのち、実際のWebデータ使って確かめることで、そこらへんの問題にアプローチするよ。

## Posterior Contraction Analysis of Topic Polytope in the LDA

変数名はこんな感じ。

* V：vocabulary：wordの集合
* φ：topic：wordの出現確率ベクトル（独立同分布）
* η：document：topicが重み付きで足しあわされたもの
* N：document数
* D：documentに含まれるword数
* α：ベイズ推定のハイパーパラメータ
* β：ベイズ推定のハイパーパラメータ
* K：topic数
* G：topicの集合の凸包

NやDを増やしたときに、推定されたtopicの集合がどうなるかについて議論したい。
Gにmetricを入れる。

### Euclidean distance metric
d_M(G, G') = max(d(G, G'), d(G', G))
ここで、
d(G, G') = max[φ∈extr(G)] min[φ'∈extr(G')] ||φ - φ'||
ここで、
extr(G)はGのextreme pointの集合。

## Contraction of the Posterior of Topic Polytope

*が付いているものは理想的な変数、それ以外は推定された変数、を表す。

### Theorem 1

K* = K であった場合、
log(log(D)) <= log(N) ∈ o(D)であるようにNとDを∞に飛ばすと、
d_M(G, G*)は(log(D)/D + log(N)/D + log(N)/N)^(1/2)の定数倍で抑えられる。

### Theorem 2

K* < K < |V| であった場合、
log(log(D)) <= log(N) ∈ o(D)であるようにNとDを∞に飛ばすと、
d_M(G, G*)は(log(D)/D + log(N)/D + log(N)/N)^(1/2(K - 1))の定数倍で抑えられる。

## Experiments on Synthetic Data

人工的なデータで色々試してみた。

1. N固定でD増やす
2. D固定でN増やす
3. N=DでN,D増やす

## Experiments on Real Data Sets

WikipediaとNewYorkTimesとTwitterの実データで試してみた。
それぞれtrainingに使ったdocument数は10000、documentの平均word数は300~400くらい。
twitterはword数が少なすぎるから同じユーザのtweetくっつけた。それから、Wikipediaの記事のうちword数が50に満たないものは取り除いた。
metricは、実データなので理想的なtopicなんて分からないから、Point-wise Mutual Informationというものを使ったよ。

## Implications and guidelines for lay users of the LDA

1. document数
 * document数はある程度必要だが、多すぎてもそんなに精度上がらない。
 * 経験的には数千もあれば充分。
2. documentのword数
 * documentのword数もある程度必要だが、多すぎてもそんなに精度上がらない。
 * documentのword数がかなり多いときは、適当にサンプリングして構わない。
3. topic数
 * 理想的なtopic数よりも多すぎると精度落ちるので、topic数の推測は頑張って！
4. topicの性質
 * 各topicにあまりwordが含まれてない時、精度出るよ。
5. hyperparameter
 * 各documentが少ないtopicから構成されていそうなら、αは小さくしよう。（0.1とか）
 * 各topicにあまりwordが含まれてなさそうなら、βは小さくしよう。（0.01とか）
boost::optionalにモナドのbindを

C++のboost::optionalを、HaskellのMaybeモナドみたいに使い隊。

```cpp
#include <iostream>
#include <type_traits>
#include <boost/optional.hpp> 

template <
  typename Input,
  typename Functor,
  typename OptionalOutput = typename std::result_of<Functor(Input)>::type
>
OptionalOutput operator >>= (
  const boost::optional<Input>& a,
  Functor f
) {
  if (a) return f(*a);
  return boost::none;
} 

template<typename T>
std::ostream& operator<<(std::ostream& os, const boost::optional<T>& a) {
  if (a) return os << *a;
  else   return os << "none";
}

int main() {
  auto f = [](bool b){ return b ? boost::optional<int>(42) : boost::none; };;
  std::cout << (boost::optional<bool>(true)  >>= f) << std::endl; // 42
  std::cout << (boost::optional<bool>(false) >>= f) << std::endl; // none
  std::cout << (boost::optional<bool>()      >>= f) << std::endl; // none
//std::cout << (boost::none                  >>= f) << std::endl; // boost::none使うと型推論できなくて残念
    
  return 0;
}
```
実行結果：[[Wandbox]三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ](http://melpon.org/wandbox/permlink/FMCze1oJU2PXQjOf)
変換先のstd::vectorを作って返すstd::transform

C++のstd::transformは、変換先のコンテナを呼び出し側で確保してイテレータ書く必要があるので、たいがいの場合に冗長。
関数型のmap関数のように、自動で変換先のstd::vectorを作って返すstd::transformが欲しかったので、下記のようなものを書いてみた。

```cpp
#include <algorithm>
#include <iostream>
#include <type_traits>
#include <vector>

template <
  typename Input,   // 引数から推論されるので省略可
  typename Functor, // 引数から推論されるので省略可
  typename Output = typename std::result_of<Functor(Input)>::type
>
std::vector<Output> transform_copy(
  const std::vector<Input>& inputs,
  Functor func
) {
  std::vector<Output> outputs(inputs.size());
  std::transform(inputs.cbegin(), inputs.cend(), outputs.begin(), func);
  return outputs; // NRVOが効いてmoveされるはず
}

int main() {
  std::vector<int> vec = {1, 2, 3, 4, 5};
  for (auto element : transform_copy(vec, [](int i){ return i * i; })) {
    std::cout << element << ", "; // 1, 4, 9, 16, 25,
  }
  std::cout << std::endl;

  return 0;
}
```
実行結果：[[Wandbox]三へ( へ՞ਊ ՞)へ ﾊｯﾊｯ](http://melpon.org/wandbox/permlink/5TPZh28Xw44POvEm)

std::result_ofのおかげで、テンプレート引数書かなくて済むのがポイント。
C++11で導入された型操作ライブラリ<type_traits>に入っている。
[Standard library header <type_traits> - cppreference.com](http://en.cppreference.com/w/cpp/header/type_traits)
ファイルサーバーだけど、色々させていきたい。（ffmpeg編）


この上なく適当なメモ書き。
詳細はちょいとググればわかるはず。

自宅のNAS(Rockdisk...)がおぼつかない & 1TBのUSB HDDが空いた & Thinkpad X200が遊んでる状態だったので、NAS化。
そのついでに、形式もバラバラでMacからだと見づらい動画ファイルに焦点をあてて対応策を考えてみた。

簡単に言うと変換させるだけですがね！

ローカルでやると、シャットダウンできなかったりするので、OpenMediaVault(以下OMV)上で処理させる。
OMVのインストールについては、ググると色々出てくるので割愛。
ってか、そんなに難しいことはない… GUIだし(´・ω・`)

##1.ffmpegをインストール

まず、動画変換をするためにffmpegをインストールする。
OMVはdebianなので、色々障壁があります。

とりあえず、何も考えずに以下の様にしてみた。

```
# apt-get install ffmpeg
```


・・・インストールはできた？っぽい。

```
# ffmpeg -i hogehoge.flv hogehoge.mp4
```

・・・なんかエラーでた！！
どうやら、普通にインストールしてもうまくいかない様だ。
aacのライセンス等々の問題もあり、それなりの手順を踏まなければダメらしい。(Ubuntuとかであれば大丈夫らしい？深くは調べていない)

以下にご丁寧にインストール用のシェルスクリプトを上げている方が居たので拝借。

https://gist.github.com/holms/7009218

GitHubだけど、このスクリプトだけで動く様なので、コピペで。
cloneとかしない。
適当に適当なところに作って実行〜

```
# vim /tmp/full-ffmpeg.sh
# chmod +x /tmp/full-ffmpeg.sh
# /tmp/full-ffmpeg.sh
```

エラーやらなんやら出るけど、とりあえず無視。
自分の望む結果が得られればOK。

とりあえず試してみる。
さっきのコマンドを再度実行。

```
# ffmpeg -i hogehoge.flv hogehoge.mp4
```

・・・なんかエラーでた！！
エラー内容でググったりすると、オプションをつければOKらしい。

```
# ffmpeg -i hogehoge.flv -strict -2 hogehoge.mp4
```

・・・でけた！なんかでけた！！

と言うことで、あとは１ファイルずつちまちまやるのは現実的じゃ無いので、簡単なスクリプトを書く。

##2.複数ファイルを処理させるシェルスクリプト(糞)を作る

```bash:encode.sh
DIRPATH=$1

mkdir /tmp/encode_bk

for FILE in ${DIRPATH}*.flv
do
    ffmpeg -i "${FILE}" -strict -2  "${FILE%}.mp4"
    mv "${FILE}" /tmp/encode_bk
done
```

説明の必要もない感じ。
パラメータのパス配下の.flvの拡張子が付いているファイルを.mp4に変換かけて、終わった元のファイルを別のディレクトリに移動させているだけ。（目的を達成するためだけなので若干、出来たファイル名が変だったりするけど問題なし。趣味だしどうせ。）

移動させているのは、同じファイル名で拡張子の違うファイルがごちゃごちゃできて、より一層うざい感じになるのを避けるため。
あとで消すなり、元に戻すなりできるので退避。

##3.実行！放置！

放置する為に、tmuxで実行する。


```
# tmux
# /tmp/encode.sh
```

そしておもむろにセッションを切り放置。
寝てる間に完了しているはず？

以上、まだ完了していないので結果はわからない（笑）
[Clang,libClang] exercise2 : SourceManager

#概要
[前回](http://qiita.com/kktk-KO/items/e6cd78d112604cd07df8)はFileManagerを紹介しました。
今回はSourceManagerを紹介したいと思います。

SourceManagerの基本的な動作はFileManagerと似ています。
ファイルを表すFileEntryはFileManagerを通して本当のファイルの情報にアクセスできます。
同じ様に、ソース上の位置を表すSourceLocationというクラスがあり、SourceManagerを通してソース上の情報にアクセスします。

#SourceManager
さっそく、SourceManagerを作ってみましょう。
コンストラクタは

```cpp
SourceManager (DiagnosticsEngine &Diag, FileManager &FileMgr, bool UserFilesAreVolatile=false)
```

です。
FileManagerはもう作れますが、DiagnosticsEngineという新顔がいます。
今回はSourceManagerの紹介がメインなので、DiagnosticsEngineの作り方は特に紹介しません。

```cpp
  1 #include <iostream>
  2 #include "clang/Basic/FileManager.h"
  3 #include "clang/Basic/FileSystemOptions.h"
  4 #include "clang/Basic/SourceManager.h"
  5 #include "clang/Basic/Diagnostic.h"
  6 #include "clang/Basic/DiagnosticIDs.h"
  7 int main()
  8 {
  9   clang::FileSystemOptions fso;
 10   fso.WorkingDir = "./";
 11   clang::FileManager fm(fso);
 12
 13   clang::IntrusiveRefCntPtr<clang::DiagnosticIDs> DiagID(new clang::DiagnosticIDs());
 14   clang::IntrusiveRefCntPtr<clang::DiagnosticOptions> DiagOpts(new clang::DiagnosticOptions());
 15   clang::DiagnosticsEngine Diags(DiagID,DiagOpts.get());
 16
 17   clang::SourceManager sm(Diags,fm);
 18   return 0;
 19 }
```

13-15が最も簡単なDiagnosticsEngineの作り方です。

これでSourceManagerができました。

早速ファイルを読み込ませてみましょう。

```cpp
 18   clang::FileID fid = sm.createFileID(sm.getFileManager().getFile("hello1.txt"),
 19                                       clang::SourceLocation(),clang::SrcMgr::C_User);
 20   sm.setMainFileID(fid);
 21   clang::SourceLocation sl = sm.getLocForStartOfFile(fid);
 22   std::cout << sl.printToString(sm) << std::endl;
 23   std::cout << *sm.getCharacterData(sl) << std::endl;
 24   return 0;
```

まず、SourceManagerにファイルを読み込ませるのに、FileIDを作る必要があります。
FileIDはSourceManagerがキャッシュの管理に使います。
また、SourceManagerはひとつだけ、特別なFileID、MainFileIDを持つ事ができます。
SourceManagerはMainFileIDに対して特別なアクセサを持つので便利です。(それだけではないですが）

ここでは18行目でSourceManagerにFileIDの作成を依頼しています。
createFileIDメンバ関数のシグネチャは

```cpp
FileID createFileID (const FileEntry *SourceFile, SourceLocation IncludePos, SrcMgr::CharacteristicKind FileCharacter, int LoadedID=0, unsigned LoadedOffset=0)
```

です。

20行目で受け取ったFileIDをSourceManagerのMainFileIDに設定しています。
21行目でhello.txtの最初の文字を指すSourceLocationを取得します。
22行目でSourceLocationの情報をプリントしていますが、SourceLocationはあくまでソース上の位置情報だけで、指している文字の情報はSourceManagerを通さないと得られません。22行目ではSourceLocationが指しているファイル名・行・カラム番号が表示されます。
23行目でSourceLocationが指している文字が取得できます。

後はこのSourceLocationから文字を読み取ったり、SourceLocationの位置を動かして全体のコードを解析します。

SourceManagerの簡単な説明は以上です。
SourceManagerはプリプロセッサーによる文字列の展開を認識するためのヘルパー関数をたくさん持ちますが、それらもdoxygenを一つずつ読めばわかります。

次回はPreprocess周りを触っていきます。
ここでいうPreprocessとは、CPPの処理だけでなく、文字の連なりをTokenとしてパースする処理も含みます。
それではまた。
java.lang.reflect.Proxyの使い方（１）

# はじめに
java.lang.reflect.Proxyを利用して、指定したインターフェイスを実装したクラスに対し、そのメソッド呼び出し前後に任意の処理を追加します。こういう場面で使えるんじゃないかな？ってのがありますが、まずは簡単なサンプルを使って実際に動かしてみたいと思います。

# まずはProxyを使わないで..

```ISome.java
public interface ISome {
    public void doSomething(int val);
}
```

```Some.java
public class Some implements ISome {
    @Override
    public void doSomething(int val) {
        System.out.println(val);
    }
}
```

```Main.java
public class Main {
    public static void main(String[] args) {
        System.out.println("start");

        ISome some = new Some();
        some.doSomething(1000);

        System.out.println("end");
    }
}
```

敢えて示すまでもないですが、実行結果は以下のようになります。

```
start
1000
end
```

# Proxyを使ってみる..
SomeProxyクラスを追加します。

```SomeProxy.java
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class SomeProxy {
    private ISome some;
    private Object proxy;

    private SomeProxy(ISome some) {
        this.some = some;
        this.proxy = Proxy.newProxyInstance(
            ISome.class.getClassLoader(),
            new Class[]{ ISome.class },
            new SomeHandler());
    }

    /**
     * 外部からはこのメソッドを通じてProxyを取得します.
     */
    public static ISome createProxy(ISome some) {
        SomeProxy obj = new SomeProxy(some);
        return ISome.class.cast(obj.proxy);
    }

    /**
     * Proxyのメソッド呼び出しハンドラ.
     */
    private class SomeHandler implements InvocationHandler {
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("before: invoke method called..");
            Object o = method.invoke(some, args);
            System.out.println("after: invoke method called..");
            return o;
        }
    }
}
```

ISomeインターフェイスとその実装のSomeクラスに変更はありません。
呼び出し元のMainクラスを以下のように変更します。

```Main.java
public class Main {
    public static void main(String[] args) {
        System.out.println("start");

        ISome some = new Some();
        some.doSomething(1000);

        //Proxyを利用した呼び出しを行います
        ISome proxy = SomeProxy.createProxy(some);
        proxy.doSomething(2000);

        System.out.println("end");
    }
}
```

実行結果は以下のようになります。
既存のSomeクラスには全く手を加えていないのに処理が追加されました。

```
start
1000
before: invoke method called..
2000
after: invoke method called..
end
```

# 次回
「こういう場面で使えるんじゃないかな？」を具体的に書こうかなと思っています。
javaコマンドでjava.dllがどうこうってエラーが出た

おそらく、色々ある事象のうちの一つです。

# 前提
OSはwindows8.1。
jreインストールしてある。

# 事象
コマンドラインからjavaコマンドを叩くと、下記エラーが出る。

> Error opening registry key 'Software\JavaSoft\Java Runtime Environment'
> Error: could not find java.dll
> Error: could not find Java SE Runtime ENvironment.

# 原因
何故かC:\Windows\System32にjava.exeが入っており、
PATHのjava設定よりSystem32設定のほうが前に来ていたため、
javaコマンドはSystem32フォルダのjavaを実行しに行っていた。

そして、そこにjava.dllはなかった。

なんでSystem32に入っていたかは謎です。。
【iOS】【Swift】UIAlertControllerの基本的動作のまとめ

iOS8環境から、UIAlertView/UIActionSheetが非推奨になりまして、
UIAlertControllerを利用する事に。

個人的には、delegateではなくblock(クロージャ)にて処理を指定出来るのが
一番ありがたい所ですが、そのあたりを含めて基本的な動きの整理を


まず基本的な考え方として、
UIAlertView/UIActionSheetのようなUIが利用できなくなったわけではなく
それらを、UIAlertController一つで実現する事ができるようになったので、
そのあたりは引数で指定する事になります。


```swift
//UIAlertView
let alert:UIAlertController = UIAlertController(title:"alert", 
            message: "alertView",
            preferredStyle: UIAlertControllerStyle.Alert)

//UIActionSheet
let actionSheet:UIAlertController = UIAlertController(title:"sheet",
            message: "actinSheet",
            preferredStyle: UIAlertControllerStyle.ActionSheet)

```

第三引数であるpreferredStyleで指定。


次に、ボタン及びそれにひもづく処理の指定の仕方についてですが、
それはUIAlertActionを利用する事になります。

こちらも、3種類存在します。
default/cancel/destructive
通常追加した順番にボタンが表示されますが、cancelにおいては
追加した場合、固定で一番下になります。(このあたり仕様も変わらずかと。)

そのため、Cancelのアクションを二つ以上指定すると、落ちます。


```swift


//Cancel 一つだけしか指定できない
let cancelAction:UIAlertAction = UIAlertAction(title: "Cancel",
            style: UIAlertActionStyle.Cancel,
            handler:{
            (action:UIAlertAction!) -> Void in
                println("Cancel")
})

//Default 複数指定可
let defaultAction:UIAlertAction = UIAlertAction(title: "Default",
            style: UIAlertActionStyle.Default,
            handler:{
            (action:UIAlertAction!) -> Void in
                println("Default")
})


//Destructive 複数指定可
let destructiveAction:UIAlertAction = UIAlertAction(title: "Destructive",
            style: UIAlertActionStyle.Destructive,
            handler:{
            (action:UIAlertAction!) -> Void in
                println("Destructive")
})

//AlertもActionSheetも同じ
alert.addAction(cancelAction)
alert.addAction(defaultAction)
alert.addAction(destructiveAction)


//表示。UIAlertControllerはUIViewControllerを継承している。
presentViewController(alert, animated: true, completion: nil)

```

実行例：alert
![スクリーンショット 2014-09-28 1.47.25.png](https://qiita-image-store.s3.amazonaws.com/0/35343/b0ea5bf4-cfb2-f922-5c78-73738a309c16.png)


実行例：actionSheet
![スクリーンショット 2014-09-28 1.48.43.png](https://qiita-image-store.s3.amazonaws.com/0/35343/20690449-2aa4-94fe-8815-fe1f39439fa4.png)
AppVeyorでsubmoduleを使う

リポジトリ内でsubmoduleを使っている場合、AppVeyorの初期設定ではサブモジュールを取得しないためエラーになります。

プロジェクトの設定で`Before build scripts`に次のコマンドを実行するように記述します。

<pre>
git submodule init
git submodule update
</pre>


## submodule と nugetの併用
submoduleがnugetを使って依存関係ライブラリを取得するようなプロジェクトの場合、そのプロジェクトでも`nuget restore`を使って明示的にnugetからライブラリを取得するようにします。

たとえば、CherrySubというディレクトリにsubmoduleがあり、それがVisualStudioのソリューションの場合は、次のようなコマンドを`Before build scripts`に記述します。

<pre>nuget restore ./CherrySub/CherrySub.sln</pre>

nugetはソリューションファイルを指定するとソリューションファイルを解析してくれます。
VisualStudioのソリューションでない場合でも、packages.configを指定すればそのパッケージをnugetリポジトリから取得します。

詳しくは、nugetのマニュアルを参照。

[nuget Command Line Reference](http://docs.nuget.org/docs/reference/command-line-reference)

----
Bootstrap, Foundation, INK, Gumbyの比較


Bootstrap系のCSSフレームワークを使いたくていくつか調べてみました。

# 比較表

|                                                               |  Bootstrap 3.2.0  |  Foundation 5  |  INK 3.1.0  |  Gumby 2.6 |
|---------------------------------------------------------------|:-----------------:|:--------------:|:-----------:|:----------:|
| Sassが使えるか                                                  |         ◯         |        ◎       |      ◎      |      ◎      |
| IE対応バージョン                                                |         9+        |       9+       |     10+     |      8+     |
| 画面サイズ毎にスタイルを指定出来るか                                |         ◯         |        ◯       |      ◯      |      ×      |
| viewportの設定がzoom出来る設定か                                 |         ◯         |        ◯       |      ×      |      ×      |
| スタイルを上書きするのではなく変数を変えることでカスタマイズが出来るか    |         ◯         |        ◎       |      ◯      |      ◯      |
| テーマファイル                                                  |         ◎         |        △       |      ×      |      ×      |
| 何もしなくてもデザインが整うか                                     |         ◯         |        △       |      ×     |      ×      |
| モバイルファーストか                                             |         ◯         |        ◎       |      ◯      |      ×      |
| ハンバーガーメニューのサポート                                     |         △         |        ◎       |      ◎      |      △      |
| スマホの時にPagenationが崩れないか                                |         △         |        △       |      △      |      ×      |
| スマホの時にfloatが勝手にキャンセルされないか                        |         ◯         |        ◯       |      ◯      |      ×     |
| フラッシュメッセージ用のUIが用意されてるか                           |         ◯         |        ◯       |      ◯      |      △     |
| jQuery UIと併用可能か                                           |         ◯         |        ◯       |      ◯      |      ◯      |
| Rails用のgemがあるか                                            |         ◯         |        ◎       |      ◯      |      △      |
| simple_form gemで使えるか                                       |         ◎         |        ◯       |      △      |      ◯      |
| 今後発展の見込みがあるか                                          |         ◯         |        ◯       |      △      |      △      |

Railsで使用するのでGemのサポート状況も確認しています。

# それぞれの雑感
## Bootstrap

http://getbootstrap.com/

カスタマイズしづらいという声も聞こえるが今はそんなことないかも。

## Foundation

http://foundation.zurb.com/

全体的なバランスはGood!

## INK

http://ink.sapo.pt/

全体的には良さそうだがFoundationと比べると見劣りする感じ。

## Gumby

http://gumbyframework.com/

細かいところには手が届かないのでカスタマイズも辛い予感。
比較した中では唯一IE8を標準サポート。
ｎ進数の表現

10進数以外で表示したいときのまとめです。

### Integer.toXxxx()
数値を変換します
##### 10進数を2進数
```lang:コード
System.out.println(Integer.toBinaryString(100));
```
```lang:出力
1100100
```

##### 10進数を8進数
```lang:コード
System.out.println(Integer.toOctalString(100));
```
```lang:出力
144
```

##### 10進数を16進数
```lang:コード
System.out.println(Integer.toHexString(100));
```
```lang:出力
64
```

### Integer.parseInt(nnn,xxx)
文字列を数値に変換します

##### 10進数
```lang:コード
System.out.println(Integer.parseInt("100"));
System.out.println(Integer.parseInt("100",10));
```
```lang:出力
100
100
```

##### 2進数
```lang:コード
System.out.println(Integer.parseInt("1100100",2));
```
```lang:出力
100
```

##### 8進数
```lang:コード
System.out.println(Integer.parseInt("144",8));
```
```lang:出力
100
```

##### 16進数
```lang:コード
System.out.println(Integer.parseInt("64",16));
```
```lang:出力
100
```

### Integer.decode(xxx)
文字列を数値に変換します
2進数には変換できません
##### 10進数
```lang:コード
System.out.println(Integer.decode("100"));
```
```lang:出力
100
```

##### 8進数
```lang:コード
System.out.println(Integer.decode("0144"));
// 指定する引数の先頭に"0"をつけます
```
```lang:出力
100
```

##### 16進数
```lang:コード
System.out.println(Integer.decode("0x64"));
// 指定する引数の先頭に"0x"または"0X"または"#"をつけます
```
```lang:出力
100
```
Elixir Binaries / Strings / Char lists

# Elixir Binaries / Strings / Char lists

## 概要
Elixir の Binaries / Strings / Char lists について

## UTF8
Elixirの文字列は UTF-8 Encoding です。

~~~
iex> ?a
97
iex> ?あ
12354
iex> String.codepoints("aあ")
["a","あ"]
~~~

## Binaries

Elixir は `<<>>` で binary を定義出来ます。
また、文字列に `nil` を表す `<<0>>` を結合すると
バイナリ表現を確認できます。

~~~
iex> "aあ" <> <<0>>
<<97,227,129,130,0>>
iex> <<97,227,129,130>>
"aあ"
~~~

for n <- [65..152], do: n

### Char lists

シングルクォートで Char lists を返却します。

~~~
iex> 'aB'
'aB'
iex> 'aあ'
[97,12354]
iex> to_char_list "aあ"
[97,227,129,130]
~~~

## 参照
http://elixir-lang.org/getting_started/6.html
Swiftでラベルのタッチを検知する方法


Objective-Cの例をSwiftで書く時に、downcastの所でしばらく悩んだので。

```Swift
class ViewController: UIViewController {

    let TAG_LABEL1 = 1
    
    var label1: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        self.label1 = UILabel(frame: CGRectMake(0, 0, 100, 100))
        self.label1.text = "Foo"
        self.label1.layer.position = CGPoint(x: 100, y: 100)
        self.label1.userInteractionEnabled = true
        self.label1.tag = self.TAG_LABEL1
        self.view.addSubview(self.label1);

    }
    
    override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
        super.touchesEnded(touches, withEvent: event)
        
        for touch: AnyObject in touches {
            var t: UITouch = touch as UITouch
            if t.view.tag == self.label1.tag {
                NSLog("Label touched")
            }
        }
    }

}
```
Bash更新メモ（CVE-2014-6271 Bash脆弱性対応）


OS Xでbash更新メモ（CVE-2014-6271のbashの脆弱性対応）


# Update

アップルから最新(09/29)のセキュリティパッチがリリースしました：
http://support.apple.com/kb/DL1769
※このパッチは `CVE-2014-6271` と `CVE-2014-7169` のみ対応、
その他 http://en.wikipedia.org/wiki/Shellshock_(software_bug) は未対応らしい。

今回の問題は、アップルも結構重視していますね、パッチを適用するのは一番お勧めです。


#０、経緯
最近人気のbashの脆弱性です。http://seclists.org/oss-sec/2014/q3/649

まず、簡単に脆弱性を確認してみます。

	$ x='() { :;}; echo 攻撃されやすい' bash -c 'echo hello'
	攻撃されやすい
	hello

文字列として定義してる「echo 攻撃されやすい」がシェルプログラムとして実行されるので、危険です。
世界中の開発者のおかげで、新しいbashバージョンがリリースされたので、早速更新しましょう。	


#１、bashを更新するために、Homebrewがおすすめ

Homebrewが初めての方、まずインストール：	

	$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
	$ echo $PATH
	/usr/local/bin:・・・最初になっていることを確認

すでにHomebrewがインストールされている方、まずセルフ更新を行う必要があります：

	$ brew update


#２，bash本体をインストール・更新*1

初めての方、最新のbashをインストール

	$ brew install bash

すでにHomebrew経由でbashがインストールされている方、bashを更新

	$ brew upgrade bash

#３，bashのリンクを確認する

	$ which bash
	/usr/local/bin/bash
	$ ls -l /usr/local/bin/bash
	lrwxr-xr-x  1 xx  admin  38  9 27 22:08 /usr/local/bin/bash -> /usr/local/Cellar/bash/4.3.26/bin/bash

#４，shも新しいbashへリンクする

	$ which sh
	/bin/sh　★古いバージョンのまま、危険です。

	$ ln -s /usr/local/bin/bash /usr/local/bin/sh
	$ ls -l /usr/local/bin/sh
	lrwxr-xr-x  1 xx  admin  19  9 27 22:24 /usr/local/bin/sh -> /usr/local/bin/bash


#５、ターミナルを再起動し、脆弱性が消えたことを確認する

	$ x='() { :;}; echo 攻撃されやすい' bash -c 'echo hello' 
	bash: warning: x: ignoring function definition attempt
	bash: error importing function definition for `x'
	hello

#以上。


##エラーシューティング
*1 多分新しいOS X 10.9のせいで、ステップ２で失敗になりました。

エラー：

	You have not agreed to the Xcode license agreements, please run 'xcodebuild -license' 
	(for user-level acceptance) or 'sudo xcodebuild -license' (for system-wide acceptance) 
	from within a Terminal window to review and agree to the Xcode license agreements.

	Warning: You have not agreed to the Xcode license.
	Builds will fail! Agree to the license by opening Xcode.app or running:
	    xcodebuild -license

対策：

	$ sudo xcodebuild -license
	・・・スペースキーで最後まで移動し、「agree」を入力する必要があります・・・
	By typing 'agree' you are agreeing to the terms of the software license agreements. Type 'print' to print them or anything else to cancel, [agree, print, cancel
	] agree
Swiftでの@UIApplicationMainとクラス継承

6.1で修正されたようです。
継承側で<b>UIApplicationDelegate</b>を書かなくてもエラーにならなくなっているようです




AppDelegateようの基本クラスを自作フレームワークで
public class HogeAppDelegate : UIResponder , <b>UIApplicationDelegate</b>
{
}
のように作っておいて

@ApplicationMain
class AppDelegate : HogeAppDelegate 
{
}
のように使おうとすると、コンパイラの解釈の問題か
@ApplicationMainには<b>UIApplicationDelegate</b>プロトコルが必要だというエラーになってしまう
ここは、気持ち悪くても

@ApplicationMain
class AppDelegate : HogeAppDelegate , <b>UIApplicationDelegate</b>
{
}

のように両方に<b>UIApplicationDelegate</b>プロトコルを指定して回避する
[Clang,libClang] exercise1 : FileManager

怒涛の勢いで開発が進むclangですが、c++だけでなく、コンパイラとして必要な汎用的な機能を提供しています。
これらの機能はc++APIとして公開されていて、Pythonインターフェース等もあります。

なので、clangを使えば「ぼくのかんがえたさいきょうのぷろぐらみんぐげんご」を少ないコストで作ることができます。

今回はこのclangのc++APIの使い方を学んでいきたいと思います。

最初の一回はファイルIO周りです。
続くかは分かりません。

#概要
clangはファイルIOを管理するクラスとしてFileManagerクラスとSourceManagerクラスを提供しています。
FileManagerは基本的なファイルIOやファイル名のキャッシング機能等を提供しています。
SourceManagerはさらにFileManagerに加えてCプリプロセッサーとコンパチなソースロケーション機能を備えています。
またSourceManagerはファイルそのもののキャッシング機能も持っています。

初回はFileManagerから見ていきましょう。

#FileManager
FileManagerクラスは
$CLANG_ROOT/include/clang/Basics/FileManager.h
に宣言してあります。

早速FileManagerを作ってみましょう。
コンストラクタをみると

```cpp
FileManager (const FileSystemOptions &FileSystemOpts, IntrusiveRefCntPtr< vfs::FileSystem > FS=nullptr)
```
となっています。
FileSystemOptionsは今の所、作業ディレクトリの情報のみを格納します。($CLANG_ROOT/include/clang/Basics/FileSystemOptions.h)
IntrusiveRefCntPtr< vfs::FileSystem >は気にしなくて良いです。
気になる人のために少しだけ補足しておくと、IntrusiveRefCntPtrはクラステンプレートでstd::shared_ptr等の参照カウント方式のスマートポインタをラップします。
vfs::FileSystemは基本的なファイルIOのヘルパー関数を備えた抽象クラスです。
FileManagerはデフォルトでRealFileSystemを選択します。
これはOSが提供するファイルシステムを使います。
もちろんその気になればメモリ上にファイルシステムを展開して、物理デバイスをシミュレートする事もできます。
もっともこういう使い方はOSのファイルシステム側でも簡単にできるので(少なくともLinuxは)、使うことはあまりないでしょう。

ではFileManagerを作ります。

```cpp
#include <string>
#include "clang/Basic/FileManager.h"
#include "clang/Basic/FileSystemOptions.h"

int main()
{
  clang::FileSystemOptions fso;
  fso.WorkingDir = "./";
  clang::FileManager fm(fso);
  return 0;
}
```

ちゃんとコンパイルできましたか？
リンクエラーがでている様なら以前に、[リンクオプションの見分け方のページ](http://qiita.com/kktk-KO/items/1ca16b5ae63a35c8a648)を書きましたので、参考にしてください。

FileSystemOptionsのWorkingDirを設定しなくても上手く行きますが、FileManagerが相対パスを解決できなくなります。

それではFileManagerを使ってみましょう。
まず良くつかうのが

```cpp
const DirectoryEntry* getDirectory (StringRef DirName, bool CacheFailure=true)
const FileEntry* getFile (StringRef Filename, bool OpenFile=false, bool CacheFailure=true)
```
の２つです。
DirectoryEntryやFileEntryはディレクトリやファイルを表すクラスで、ファイル名、サイズ、アクセス可能かどうかを取得できるハンドラーを提供します。
getDirectory(DiraName)やgetFile(FileName)で、DirectoryEntryやFileEntryを取得します。
また、FileManagerはファイルパスのキャッシング機能を持っていて、一度参照したパスは次回から高速に検索できます。
ファイルの中身をキャッシュする訳ではありません。
ディレクトリやファイルの検索に失敗するとnullを返します。

それではFileManagerからFileEntryを受け取り、ファイルの情報を参照してみましょう。

```cpp
1  clang::FileSystemOptions fso;
2  fso.WorkingDir = "./";
3  clang::FileManager fm(fso);
4  auto fe_ptr = fm.getFile("test.cpp");
5  std::cout << fe_ptr << std::endl;
6  if(fe_ptr != nullptr){
7      std::cout << fe_ptr->getName() << std::endl;
8      std::cout << fe_ptr->getSize() << std::endl;
9      std::cout << fe_ptr->isValid() << std::endl;
10     std::cout << fe_ptr->getDir()->getName() << std::endl;
11     std::cout << fm.getCanonicalName(fe_ptr->getDir()).str() << std::endl;
12 }
```
意味は見ての通りです。
4行目で $WorkingDir/test.cppのFileEntryを受け取り、成功していれば、
ファイル名(7行目)
ファイルサイズ(8行目)
ファイルが存在するかどうか(9行目)
相対ディレクトリ名(10行目)
絶対ディレクトリ名(11行目)
を出力します。

FileEntryのgetDirメンバ関数はDirEntryへのポインタを返します。(10行目)
FileSystemのgetCanonicalName(DirEntry*)メンバ関数はllvm::StringRefという文字列参照のラッパクラスを返しますが、.str()でstd::stringを返します。(11行目)

以上がFileManagerの使い方です。
Swiftの比較演算子を使うとき，変数は自動でアンラップされる。


ちょっと驚いたのですが，何気なく以下のコードを書いたら普通に動きます(Xcode 6.1 Beta)。

```swift
var a: Int? = 1
a == 1    // true
a < 2     // true

a = nil
a == 1    // false
a < 2     // true
```
Optionalを陽にアンラップする必要はないようです。コンパイラが左辺をアンラップ，または右辺をオプショナル化のどちらかを自動でやってくれるようです。
(`nil`との比較では，`nil`はどんな値よりも小さい値として扱われるようです。[参考](http://qiita.com/satoshia/items/ed6fe951503538d2f56b))

定義したタイプでも可能なのか確かめてみます。

```swift
struct A: Equatable, Comparable {
    var v: Int
}

func ==(lhs: A, rhs: A) -> Bool {
    return lhs.v == rhs.v
}

func <(lhs: A, rhs: A) -> Bool {
    return lhs.v < rhs.v
}


let c: A  = A(v: 1)
var d: A? = A(v: 1)

c == d    // true
c < d     // false

d = nil
c == d    // false
c > d     // true
```
独自定義タイプも大丈夫なようですね。

そのほか組み込みの`String`などでもO.K.でしたが，__配列__に対してはエラーが出るので手前でアンラップする必要があります。

`if let`や`!`を書かないで済むので，コードが少しはスッキリしますね。
Ubuntu 14.04 インストール後の設定メモ


##設定メモ
### ログイン直後のパスワード要求を無効化する
引用元：[ログイン直後にパスワード聞かれるけど何なの？](http://exlight.net/linux/passwords_and_keys/index.html)

キーリング（パスワードマネージャー）のマスターパスワードを解除することで、ログイン後にパスワードを聞かれなくなる。（セキュリティレベルを下げることになる）
1. [Special]キーでDashを起動する。
2. "pas"と入力すると「パスワードと鍵」が表示されるので、これを起動する。
3. 「パスワードと鍵」ウインドウの左側ペインの「パスワード」＞「ログイン」を右クリックし、「パスワードの変更」を選択する。
4. 変更前のパスワードを入力し、変更後のパスワードは空欄で登録する。


### ワークスペースを有効にする
引用元：[ワークスペースを有効にする](http://sicklylife.at-ninja.jp/memo/ubuntu1404/settings.html#disable_lens_net_access)
Ubuntu 13.04から、ワークスペースが無効化されたので、利用したい場合は有効にする必要がある。
1. [システム設定]>[外観]>[挙動]>[ワークスペースを有効にする]


### マルチモニタ画面間移動時のひっかかりを解除する
1.[システム設定]>[ディスプレイ]>[ディスプレイを隣接する]を[オフ]に設定する。

###物理電源ボタンを押しただけで、シャットダウンする
/etc/acpi/event/powerbtn を下記のように編集する。
```
 #action=/etc/acpi/powerbtn.sh
 action=shutdown -h now
```

### 画面を暗くする設定を解除する
デフォルト設定だと、5分間入力がない場合に画面が暗くなるため、解除する。
1.[システム設定]>[画面の明るさとロック]>[次の時間アイドルが続けば画面をオフにする]を[しない]に設定する

### DashのAmazon広告などを無効化する
引用元：[Dashのオンライン検索機能を無効化する](http://sicklylife.at-ninja.jp/memo/ubuntu1404/settings.html#disable_lens_net_access)
引用元：[Ubuntu 12.10にAmazonレンズを無効にする設定項目が加わったらしい](http://cpplover.blogspot.jp/2012/10/ubuntu-1210amazon.html)
1. terminalを起動し、下記のコマンドを実行する。

```console
$ gsettings set com.canonical.Unity.Lenses disabled-scopes "['more_suggestions-amazon.scope', 'more_suggestions-u1ms.scope', 'more_suggestions-populartracks.scope', 'music-musicstore.scope', 'more_suggestions-ebay.scope', 'more_suggestions-ubuntushop.scope', 'more_suggestions-skimlinks.scope']"

$ sudo apt-get remove unity-lens-video unity-scope-video-remote unity-lens-shopping unity-lens-music unity-lens-photos unity-lens-radios
```
### GyaO!を視聴する。
ブラウザにプラグインを入れてユーザーエージェントを偽装することでGyaO!を視聴できます。

プラグイン：User-Agent Switcher
- [Firefox用](https://addons.mozilla.org/ja/firefox/addon/user-agent-switcher/)
- [Chrome用](https://chrome.google.com/webstore/detail/user-agent-switcher-for-c/djflhoibgkdhkhhcedjiklpkjnoahfmg)
- Oparaは特にプラグインを導入しなくてもGyaO!を視聴できるようです。

1. User Agent Switcherのアイコンを右クリックし、[setting]-[Permanent Spoof list]を開く。
2. [domein]に "gyao.yahoo.co.jp"と入力する。
3. [User-Agent String]に "Windows Firefox 15" を選択する。
4. [add]ボタンをクリックする。


###Virtual Box にインストールした Windows 10 の解像度を調整する
Windows 10 の最新テクニカルプレビューは「Guest Additons」に対応していない（※2015年2月時点で対応していることを確認）ため、高解像度で表示するためには手動での設定が必要になります。
1920 x 1200のモニターでUbuntsuを標準インストールした場合、下記のコマンドを実行した上で、Windows 10の解像度を指定すれば最適な解像度になります。

```console
$ vboxmanage setextradata Windows10 CustomVideoMode1 1855x1034x32
```

###Virtual Box をアンインストールする
```console
sudo apt-get remove virtualbox-4.3
```

###ランチャー「DockbarX」のインストール
```console
$ sudo add-apt-repository ppa:dockbar-main/ppa
$ sudo apt-get update
$ sudo apt-get install dockbarx dockbarx-themes-extra
```

##参考サイト
* [Ubuntu 14.04 LTSをインストールした直後に行う設定 & インストールするソフト](http://sicklylife.at-ninja.jp/memo/ubuntu1404/settings.html)
* [Ubuntu kledgeb](http://kledgeb.blogspot.jp/p/ubuntu.html)
* [動作が軽いドックランチャー「DockbarX」をインストールして外観を好みにカスタマイズ](http://ubuntuapps.blog67.fc2.com/blog-entry-728.html)
MonologのSlackHandlerでSlackに通知する


## SlackHandlerが追加

2014/9/30に、Monologの1.11.0がリリースされました。
https://packagist.org/packages/monolog/monolog#1.11.0

新たにSlackHandlerが追加されていたので、早速試してみました。
https://github.com/Seldaek/monolog/pull/377

## SlackHandlerの導入

packagistにあるように、monologの1.11.0をrequireします。

```bash
$ php composer.phar require monolog/monolog: ~1.11.0
```

composer.jsonは以下のようになります。

![monolog_composer.png](https://qiita-image-store.s3.amazonaws.com/0/26422/d17e196e-a9cb-498d-9f6d-e7a7696d8f8f.png "monolog_composer.png")


導入方法としては、Monolog/LoggerにSlackHandlerをpushHandlerするだけです。
https://github.com/Seldaek/monolog/pull/377#issuecomment-52928937

Silexだと、以下のようになります。
ちなみに「channel」は「#」付きで指定します。

```php
$app['monolog']->pushHandler(
    new Monolog\Handler\SlackHandler(
        $slackOption['token'], $slackOption['channel'], $slackOption['username']
        true, null, Monolog\Logger::NOTICE, true
    )
);
```

※1.11.dev-masterから1.11.0の間に、コンストラクターの引数が変更になっているので注意してください。
[Move iconEmoji param upfront since Slack was never in a stable release](https://github.com/Seldaek/monolog/commit/d2ec7648d0f5c5b1acee721af9bc097c58e5e13f)


### Slack APIトークンの生成
（2015/09/26更新）
https://api.slack.com/web#authentication
にて、APIトークンを生成します。
詳しくは、こちらを参考に
http://qiita.com/ogawatachi/items/c89b1e92e877ef6b0698

## Slackへの通知
あとはloggerにて、メッセージを出力するだけです。
Silexだと、以下のようになるかと。


```php
$app->log('test', [], Monolog\Logger::CRITICAL);
```

期待通り動作すれば、下記のように指定したチャンネルに通知が届きます。

![slack.png](https://qiita-image-store.s3.amazonaws.com/0/26422/bb4a6a53-4fda-d9cc-d4b2-c2325f59660a.png "slack.png")


## 雑感
仕事で、Hipchatを使っていますが、エンジニアだけだったら何の躊躇もなく、Slackに移行できると思います。
Slackを使い始めたばかりではありますが、Hipchatとくらべて気に入っている点は以下のとおりです。

- 発言者にアイコンがでる
- 外部連携が豊富で、導入が簡単
- コードスニペット

大量に通知されるとタイムラインを占領してしまいそうなので、チャンネルを分けたり、通知するログレベルを適切に設定したりするなど、運用上は工夫が必要そうです。
~~あと、monologの1.11が正式リリースされたら、composerの設定直さないといけないですね。~~（1.11にあわせて変更しました）
hmatrixのSTVectorとVectorとの部分更新速度比較

ノイズの中に信号を埋め込んで、その信号が検出できるかどうかのテストを行うことを考える。その場合、データに信号を埋め込むことを行うので、データ列の一部分に変更することになる。そこで、データ列の一部分の変更を行う関数を書くために、データ型の更新速度を調べてみた。今回は
hmatrixのデータ型[STVector](https://hackage.haskell.org/package/hmatrix-0.15.2.1/docs/Data-Packed-ST.html)と[Vector](https://hackage.haskell.org/package/hmatrix-0.15.2.1/docs/Data-Packed-Vector.html)との比較をした。
方法としては、Vectorの方は、subVectorを用いて更新する部分としない部分に分けて、更新後にjoinするという方法

```haskell
injectedV = join [subVector 0 n v
                       , add (subVector n nw v) w
                       , subVector (n+nw-1) (nv -nw -n) v]
```
をとり、STVectorの方は、Vector型のデータ列をunsafeThawVectorでSTVector型に変換して、in-placeの更新を行う方法

```haskell
addInjsig n v w = runSTVector $ do
  v' <- unsafeThawVector v
  mapM_ (\i -> addInjsigCore v' w (n+i) i) [0 .. nw-1]
  return v'
  where
    nw = dim w
```

をとった。

テストコードは以下である。

```haskell
--- testbench_STVector.hs
import Control.DeepSeq (deepseq)
import Control.Monad.ST (ST)
import Data.Packed.ST
import Numeric.LinearAlgebra
import System.Random
import Data.Time


main = do
  let v = fromList $ take 100000 $ randomRs (-10, 10) $mkStdGen 1 :: Vector Double
      w = fromList $ take 1000   $ randomRs (-10, 10) $mkStdGen 2 :: Vector Double
      n = 5000
      nw = dim w
      nv = dim v

  v `deepseq` return ()
  w `deepseq` return ()
  nw `deepseq` return ()
  nv `deepseq` return ()


  t1 <- getCurrentTime
  let injectedV = join [subVector 0 n v
                       , add (subVector n nw v) w
                       , subVector (n+nw-1) (nv -nw -n) v]
  print $ injectedV @> 5500
  t2 <- getCurrentTime
  print $ diffUTCTime t2 t1

  t3 <- getCurrentTime
  let injectedST = addInjsig n v w
  print $ injectedST @> 5500
  t4 <- getCurrentTime
  print $ diffUTCTime t4 t3



addInjsig n v w = runSTVector $ do
  v' <- unsafeThawVector v
  mapM_ (\i -> addInjsigCore v' w (n+i) i) [0 .. nw-1]
  return v'
  where
    nw = dim w

addInjsigCore :: STVector s Double -> Vector Double -> Int -> Int -> ST s ()
addInjsigCore v w i j = modifyVector v i (+w@>j)
```

結果は以下のようになった。

![スクリーンショット 2014-09-28 8.27.36.png](https://qiita-image-store.s3.amazonaws.com/0/38648/54bdab1f-3c69-b543-b5f1-d6db5da75a4a.png "スクリーンショット 2014-09-28 8.27.36.png")



Vectorの方のコードは改善の余地がありそうだが、STVectorを用いたものはかなり速いという結果だった。

他の良いやり方のアイディアなどがあれば教えていただければありがたいです！
numpyのmatrixとmatは違うものなんですね

この間numpyを使っていてハマったのですが、numpyの`matrix`と`mat`は違うものみたいです。[本家のドキュメント](http://docs.scipy.org/doc/numpy/reference/generated/numpy.mat.html)を見てみると`mat`は`matrix(data, copy=False)`と等価というふうに書いていて、コピーされないようになっているみたいです。これはどういうことかというと、

```pycon
>>> import numpy as np
>>> m = np.matrix([[1.0, 2.0],[3.0, 4.0]])
>>> m
matrix([[ 1.,  2.],
        [ 3.,  4.]])
>>> a = np.matrix(m)
>>> a[0, 0] = 5.0
>>> a
matrix([[ 5.,  2.],
        [ 3.,  4.]])
>>> m
matrix([[ 1.,  2.],
        [ 3.,  4.]])
>>> #aを変更してもmは変わらない
>>> 
>>> b = np.mat(m)
>>> b[0, 0] = 6.0
>>> b
matrix([[ 6.,  2.],
        [ 3.,  4.]])
>>> m
matrix([[ 6.,  2.],
        [ 3.,  4.]])
>>> #bを変更するとmも変わる
```

ちょっとハマったので、書いてみました。
pure Swiftで型安全なJSON parser / serializerを書いてみた感想

```shell-session
$ xcrun swift --version
Swift version 1.0 (swift-600.0.51.4)
Target: x86_64-apple-darwin13.4.0
```

型安全なJSON処理系 [Swift-JsonSerializer](https://github.com/gfx/Swift-JsonSerializer) をほぼpure Swift書いてみました。

型安全というのは、JSONに適合する値しか扱わずAnyObjectなどでごまかしていないという意味です。このため、うっかりJSONで扱えない型の値を入れてしまって予想外の結果になることがありません。pure Swiftというのは、FoundationやCocoaに依存しないという意味で、ほぼというのはNSDataを受け取るためにFoundationを使わなければならなかったためです。

なお、Swift-Serializer自体はSwiftコンパイラのバグを引いてしまっていて最適化オプションをつけると動かなくなる箇所があり実用的ではありません。

以下、感想をランダムに書きます。

## コレクション型の抽象化が不十分

JavaやC++との比較になりますが、ArrayやDictionaryなどのコレクション型が具体的な型、しかも値型なので実装を変えられません。たとえば「組み込みのDictionaryより空間効率はkeyの並び順が保存されるDictionary型」を定義したとしても、 `[KeyT:ValueT]` 型として使えません。C++だとイテレータによって、Javaだとインターフェイスによってこのあたりの抽象化がされているのですが。

自分で定義するコードに関して言えば、たとえば以下のように総称関数でもって「任意のコレクション型」を表現することはできますが、長すぎて `[T]` の代わりに使うのは厳しいでしょう。

```swift
func f<Collection: CollectionType where Collection._Element == String>(c: Collection) {
    for item in c {
        println(item)
    }
}
```

また、Swift-JsonSerializerではNSDataからバイナリデータを取り出すために `UnsafePointer<Byte>` を使っており、せっかくSwift使ってるのに生ポインタか〜というがっかり感が。そしてStringについては  `String.UTF8View` というデータ型でUInt8のストリームあるものの `UnsafePointer<UInt8>` とインターフェイスが違うのでまったく総称的に使えません。

このあたりの抽象化はこれからの改善に期待します。

## Enumによる状態の表現（直和型）は非常に便利

Swift-JsonSerializerの `JsonParser.parse(NSData) -> JsonParser.Result` のResult型は以下のような定義になっています。

```swift
// type Json
// type ParseError
public enum Result {
    case Success(Json)
    case Error(ParseError)
}
```

これがまあ便利で、何が便利かというと **エラー処理を省略できない** のがいいんです。switchで分岐すると、enumの全ケースを網羅していないとコンパイルできませんからね。

Swiftは例外ではなく戻り値でエラーを通知する言語なのですが、そうなるとエラー処理がいちいち面倒で忘れがちになります。だからエラー処理を強制的に書かなければならないenumは、戻り値で `(Json, ParseError)` のタプルを返すよりも優れた方法だと思います。

## 暗黙の型変換がなくて安心

Swiftには暗黙の型変換がありません。これはいいことです。実際にはリテラルからの変換はみとめられていて、[JsonSerializer](https://github.com/gfx/Swift-JsonSerializer/blob/master/JsonSerializer%2FJson.swift#L198-L2460)でも使っています。リテラルからの暗黙の型変換がまったくないと、数値の扱いがかなりダルくなるのでこれは必要な仕様といえます。

暗黙の型変換がないことでいたるところに明示的な型変換を書かなければならず煩雑ではありますが、暗黙の型変換による不具合に悩まされるよりはマシでしょう。

## 整数のオーバーフローに対して非常に厳しい

Swiftは整数型に対して非常に厳格な態度をとっていて、型変換や演算の際にオーバーフローが起こるとランタイムエラー、つまり強制終了になります。Swiftにはキャッチ可能な例外はないので、強制終了は文字通りでSEGVにも等しいクラッシュなのです。

例えば以下のコードはクラッシュします。

```swift
var x = -1
UInt32(x)
```

加算(+)も同じ理由で、事前にチェックしないとクラッシュします。たとえば、以下のコードはオーバーフローを起こしたときにクラッシュします。

```swift
var x: Int8 = 0

while true {
    x++
}
```

ただ数値演算の場合は、オーバーフローを起こした時にCと同じように動作する `&+` などの演算子があります。

<del>ビットパターンが同じで符号の有無だけを変える整数キャストをどうしたらいいかがまだよくわかりません。</del>

<ins>UInt32(bitPattern: Int32)などがあると @satoshia さんに教えていただきました。ありがとうございます。</ins>

状態が不正なまま実行を続けるよりはクラッシュしたほうがまだましというシチュエーションも多いでしょうから、これは慣れれば改善といえるかもしれません。

## まとめ

Swiftが正規リリースされましたが、全体的に期待感はあるもののまだまだ未熟という印象です。言語仕様とは別にXcodeのSwiftエディタがまだまだ不安定ですし、最適化オプションによるバグがすでに確認されているこの状況では、まだ本格的に使うレベルではないと感じました。しかしすでに1.1のβ版も公開されており、まだまだ改良は続くようで期待は高まります。
Ruby 2.1.2 + Rails 4.0.2 開発メモ

# Rspec 3.1
## have(n) 利用時には rspec-collection_matchers が必用

* [rspec/rspec-collection_matchers](https://github.com/rspec/rspec-collection_matchers)
* [Notable Changes in RSpec 3](http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3)

```Gemfile
group :test do
	gem "rspec"
	gem "rspec-rails"
	gem 'rspec-collection_matchers'
end
```

```
$ rails g rspec:model model_name
```

```customer_spec.rb
# coding: utf-8
require 'rails_helper'

RSpec.describe Customer, :type => :model do
	it "is invalid without password" do
		expect(Customer.new(email: nil)).to have(1).errors_on(:email)
	end
end
```

## テスト用DBの準備

* developmentの内容をtestに移す

```
$ rake db:migrate
$ rake db:test:prepare
```

## Factoryを利用する

```spec/models/model_spec.rb
RSpec.describe Model, :type => :model do
	it "is invalid without email" do
		expect(build(:invalid_attr)).to have(1).errors_on(:email)
	end

end
```

## guard-spec によるテスト自動化

* [Guardによるテストの自動化](http://railstutorial.jp/chapters/static-pages?version=4.0#sec-guard)

```Gemfile
group :test do
	...
	gem 'guard-rspec'
end
```

```
$ guard init rspec
$ guard
```

## Spork によるテスト高速化

* [Spork を使ったテストの高速化](http://railstutorial.jp/chapters/static-pages?version=4.0#sec-spork)

## annotate_models によるスキーマ可視化

* [ctran/annotate_models](https://github.com/ctran/annotate_models)

```Gemfile
group :development do
	...
	gem 'annotate'
end
```

```
$ cd /path/to/app
$ annotate
```

* スキーマの情報がモデルに追加される

```app/models/model.rb
# == Schema Information
#
# Table name: members
#
#  id         :integer          not null, primary key
...
```

# FactoryGirl

## 導入

```Gemfile
group :test do
	...
	gem 'factory_girl_rails'
end
```

* [Factory Girl: uninitialized constant](http://stackoverflow.com/questions/14390345/factory-girl-uninitialized-constant)

```spec/spec_helper.rb
# これがないとrspec実行時にuninitialized constant FactoryGirlのエラー
require 'factory_girl_rails'

RSpec.configure do |config|
	...
	config.include FactoryGirl::Syntax::Methods
end
```

## Factoryを定義

```spec/factories/model.rb
# coding: utf-8
FactoryGirl.define do
	factory :invalid_email, class: Model do
		email nil
	end
end
``` 

# i18nのdeprecated警告を解消


* Rails 4.0.2から以下の警告が発生
* rspec実行時でも発生

```
[deprecated] I18n.enforce_available_locales will default to true in the future. If you really want to skip validation of your locale you can set I18n.enforce_available_locales = false to avoid this message.
```

* [Rails 4.0.2のi18nで出るようになったdeprecated警告の対策方法](http://blog.n-z.jp/blog/2013-12-04-rails-i18n-deprecated-warning.html)

```config/application.rb
module YourApplication
	class Application < Rails::Application
		...
		I18n.enforce_available_locales = false
	end
end
```
alloc_size属性と*_chk関数

systemdのコードには`alloc_size`属性を使う`_alloc_`マクロがある。

```c:src/shared/macro.h
#define _alloc_(...) __attribute__ ((alloc_size(__VA_ARGS__)))
```

`alloc_size`属性は、[GCCのドキュメント](https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html)によると、`__builtin_object_size`の精度を上げるためものとある。

`__builtin_object_size`は[Object Size Checking - Using the GNU Compiler Collection (GCC)](https://gcc.gnu.org/onlinedocs/gcc/Object-Size-Checking.html)に詳しい説明がある。ポインタが指すオブジェクトのサイズを返すビルドイン関数らしい。このオブジェクトサイズの情報は、memcpy(3)などの標準ライブラリ関数の特殊なバージョン(`__builtin___memcpy_chk`という名前)で使われる。memcpy(3)の場合だと、コンパイル時にバッファオーバーフローを検出してくれるらしい。

この*_chk関数は様々なものがあるらしいく、手元のFedora 19で調べてみると以下のようなものがあった。バッファを操作する関数が多いが、longjmp(3)やpoll(2)向けのものもある。

```
$ strings /usr/lib/* |grep _chk |sort -u
__asprintf_chk
__chk_fail
__confstr_chk
__dprintf_chk
__fdelt_chk
__fgets_chk
__fgets_unlocked_chk
__fgetws_chk
__fgetws_unlocked_chk
__fprintf_chk
__fread_chk
__fread_unlocked_chk
__fwprintf_chk
__getcwd_chk
__getdomainname_chk
__getgroups_chk
__gethostname_chk
__getlogin_r_chk
__gets_chk
__getwd_chk
__longjmp_chk
__mbsnrtowcs_chk
__mbsrtowcs_chk
__mbstowcs_chk
__memcpy_chk
__memcpy_chk_ia32
__memcpy_chk_ssse3
__memcpy_chk_ssse3_rep
__memmove_chk
__memmove_chk_ia32
__memmove_chk_ssse3
__memmove_chk_ssse3_rep
__mempcpy_chk
__mempcpy_chk_ia32
__mempcpy_chk_ssse3
__mempcpy_chk_ssse3_rep
__memset_chk
__memset_chk_ia32
__memset_chk_sse2
__memset_chk_sse2_rep
__obstack_printf_chk
__obstack_vprintf_chk
__poll_chk
__ppoll_chk
__pread64_chk
__pread_chk
__printf_chk
__ptsname_r_chk
__read_chk
__readlinkat_chk
__readlink_chk
__realpath_chk
__recv_chk
__recvfrom_chk
__snprintf_chk
__sprintf_chk
__stack_chk_fail
__stack_chk_fail_local
stack_chk_fail_local.oS/
__stpcpy_chk
__stpncpy_chk
__strcat_chk
__strcpy_chk
__strncat_chk
__strncpy_chk
__swprintf_chk
__syslog_chk
__ttyname_r_chk
__vasprintf_chk
__vdprintf_chk
__vfprintf_chk
__vfwprintf_chk
__vprintf_chk
__vsnprintf_chk
__vsprintf_chk
__vswprintf_chk
__vsyslog_chk
__vwprintf_chk
__wcpcpy_chk
__wcpncpy_chk
__wcrtomb_chk
__wcscat_chk
__wcscpy_chk
__wcsncat_chk
__wcsncpy_chk
__wcsnrtombs_chk
__wcsrtombs_chk
__wcstombs_chk
__wctomb_chk
__wmemcpy_chk
__wmemmove_chk
__wmempcpy_chk
__wmemset_chk
__wprintf_chk
```
Sphinxについてのメモ　その2（rst2pdf拡張を使ったPDF出力）

rst2pdfを使って、作成したドキュメントをpdfで出力する方法

# 環境
OS:Mac OS X 10.9.5
Python:Ver.2.7.7

## rst2pdfのインストール
```
$ sudo easy_install rst2pdf
```
```text
・・・
Finished processing dependencies for rst2pdf
```
この結果が出れば完了。

## 設定ファイルの編集
### conf.py
conf.pyに以下を追加

```text
extensions = ['rst2pdf.pdfbuilder']
```
```text
# -- Options for PDF output --------------------------------------------------
pdf_documents = [
    ('index', u'MyProject', u'My Project', u'Author Name'),
]
pdf_stylesheets = ['sphinx','kerning','a4','ja']
pdf_language = "ja"
```

### Makefile
Makefileに以下を追加

```text
pdf:
	$(SPHINXBUILD) -b pdf $(ALLSPHINXOPTS) $(BUILDDIR)/pdf
	@echo
	@echo "Build finished. The PDF files are in _build/pdf."
```

### ja.json
ja.jsonを追加する

```text
{
    "embeddedFonts" : [
        "VL-Gothic-Regular.ttf",
        "VL-PGothic-Regular.ttf",
        "ipam.otf",
        "ipag.otf",
        "ipagp.otf",
        "ipamp.otf"
    ],
    "fontsAlias" : {
        "stdFont": "VL-PGothic-Regular",
        "stdBold": "VL-PGothic-Regular",
        "stdItalic": "VL-PGothic-Regular",
        "stdBoldItalic": "VL-PGothic-Regular",
        "stdMono": "VL-Gothic-Regular",
        "stdMonoBold": "VL-Gothic-Regular",
        "stdMonoItalic": "VL-Gothic-Regular",
        "stdMonoBoldItalic": "VL-Gothic-Regular",
        "stdSans": "VL-Gothic-Regular",
        "stdSansBold": "VL-Gothic-Regular",
        "stdSansItalic": "VL-Gothic-Regular",
        "stdSansBoldItalic": "VL-Gothic-Regular"
    },
    "styles" : [
        ["base" , {
            "wordWrap": "CJK"
        }],
        ["literal" , {
            "wordWrap": "None"
        }]
     ]
 }
```

## ビルド
```console
$ make pdf
```
_build/pdfフォルダ内に生成される。

## エラーが出た場合
rst2pdfのインストール時に以下のようなエラーが出た場合

```text
error: Setup script exited with error: command 'cc' failed with exit status 1
```
xcode-selectのインストールを行う

```console
$ xcode-select --install
```
Fulcrumの送信メールサーバーにGMailを使う

Fulcrumのconfig/environments/production.rbに下記のaction_mailer設定を追加する。

```rb:config/environments/production.rb
  # SMTP setup
  config.action_mailer.smtp_settings = {
    enable_starttls_auto: true,
    address: "smtp.gmail.com",
    port: 587,
    domain: "smtp.gmail.com",
    authentication: :plain,
    user_name: "xxxxxx@gmail.com",
    password: "xxxxxxxx"
  }
```

注意点として、同じくaction_mailerのdelivery_errorsよりも前に書いておくと吉
※後に書いたらエラーになったので・・・。
od出力結果のバイトオーダー

##od出力結果のバイトオーダー
odの出力結果には実行してる実行環境のバイトオーダーが利用される。

x86_64のマシンなどはリトルエンディアンなので、たとえばELFのマジックナンバーである0x7f、0x45、0x4c、0x46は下記のような順序でodでは出力される。

```od
$ od -t x -A x /bin/ls | head -5
000000 464c457f 00010102 00000000 00000000
000010 003e0002 00000001 00404e3c 00000000
000020 00000040 00000000 0001d808 00000000
000030 00000000 00380040 0040000a 00200021
000040 00000006 00000005 00000040 00000000
```

そのためodコマンドを利用して、実行環境のエンディアン確認することができる。
xmlからjsonに変換するスクリプト


```bash:
$ npm install xml2json
```

```bash:
$ curl -sO https://gist.githubusercontent.com/syui/3dbce2177fe17e8df9b2/raw/xml-json.js

$ chmod +x !$:t

$ system_profiler SPFirewallDataType -xml > test.xml

$ ./xml-json.js test.xml
```


元のデータ`xml`の出力が必要なら`console.log(xml)`のコメントアウトを外してください。

参考:
http://syui.github.io/blog/2014/09/27/node-js-helloworld/

https://gist.githubusercontent.com/syui/3dbce2177fe17e8df9b2/raw/xml-json.js
ArchLinuxでNFSサーバを建ててMacでマウント

# ArchLinux側の準備

```bash:
pacman -Sy nfs-utils
systemctl start rpcbind
systemctl start nfs-server
```

```bash:/etc/exports
/mnt 192.168.0.6(rw,sync,no_subtree_check)
```

```bash:
exportfs -rav
```


# macから利用

* Finderから`nfs://192.168.75.130/mnt`と指定すればマウントできる。
Ansibleでローカルのディレクトリをリモートにコピーする


# まとめ

Ansibleでローカルのファイル/ディレクトリをリモートに持っていくためには
`synchronize`ではなく`copy`モジュールを使えば良い

# `synchronize`と`copy`

[ansible directory copy - Google 検索](https://www.google.co.jp/search?q=ansible+directory+copy)すると、`copy`と`synchronize`の2つのコマンドが出てくる![kobito.1411812903.512220.png](https://qiita-image-store.s3.amazonaws.com/0/280/9594974e-2e1e-fef9-b2d7-f17f097ddd29.png "kobito.1411812903.512220.png")

## copy

ファイルをコピーするためのコマンドっぽい
documentのサンプルでも

```sh:sample
# Example from Ansible Playbooks
- copy: src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode=0644

# The same example as above, but using a symbolic mode equivalent to 0644
- copy: src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode="u=rw,g=r,o=r"

# Another symbolic mode example, adding some permissions and removing others
- copy: src=/srv/myfiles/foo.conf dest=/etc/foo.conf owner=foo group=foo mode="u+rw,g-wx,o-rwx"

# Copy a new "ntp.conf file into place, backing up the original if it differs from the copied version
- copy: src=/mine/ntp.conf dest=/etc/ntp.conf owner=root group=root mode=644 backup=yes

# Copy a new "sudoers" file into place, after passing validation with visudo
- copy: src=/mine/sudoers dest=/etc/sudoers validate='visudo -cf %s'
```

全てファイルのコピーを行っている

## synchronize

`rsync`コマンドを実行するモジュールっぽい

```sh:sample
# Synchronization of src on the control machine to dest on the remote hosts
synchronize: src=some/relative/path dest=/some/absolute/path

# Synchronization without any --archive options enabled
synchronize: src=some/relative/path dest=/some/absolute/path archive=no

# Synchronization with --archive options enabled except for --recursive
synchronize: src=some/relative/path dest=/some/absolute/path recursive=no
```

`recursive`とかあるし、ディレクトリを持って行くには`synchronize`モジュールが適切っぽく思われる

しかし、`synchronize`で実行すると、

```sh:Error
msg: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(226) [sender=3.1.1]
```

と出てしまってコピー出来なかった。
sshを使った`rsync`のはずが、何故かパスワードを求められていて、Permission deniedとなってしまっている。

# ディレクトリのコピー

最初のまとめにも書いた通り、

```
copy: src={{ src_dir }} dest={{ dest_dir }}
```

だけで良かった。

なお、ディレクトリを丸ごとコピーするには

```vars/main.yml
src_dir: /src/path/local_dir
dest_dir: /dest/path/remot_dir
```

とする。
これでローカルの`/src/path/`の`local_dir`というディレクトリが、リモートの`/dest/path/`の`remote_dir`という名前でコピーされる

```vars/main.yml
src_dir: /src/path/local_dir/
dest_dir: /dest/path/remot_dir/
```

とすると、
`/src/path/local_dir/*`が`/dest/path/remote_dir/`にコピーされる