OmniAICreator/Qiita-1.07M huggingface dataset:
Rで等価カーネル線形平滑器

まず、この線形基底関数モデルで用いるガウス基底関数を図示します。
次に、PRML図3.10の右図と同様に、このモデルにおける等価カーネルを図示します。ただし、サンプルは[-1,1]の区間の等間隔の6点から取得します。
さらに、サンプル点xnごとの等価カーネルk(x,xn)の値を図示します。
最後に、サンプル値tn、およびそのサンプルに対応する、等価カーネルとサンプル目標値との積k(x,xn)tnを図示し、それらの和によって線形平滑器による予測が得られていることを示します。

![](https://dl.dropbox.com/sh/cwfemibvr7gk4cy/_ti9_Mf_Ui/13.EquivalentKernel.png)

```r
frame()
set.seed(0)
par(mfrow=c(2, 2))
par(mar=c(2, 2, 1, 0.1))
par(mgp=c(1, 0.2, 0))
xrange <- c(-1.0, 1.0)
yrange <- c(-1.5, 1.5)
x1 <- seq(xrange[1], xrange[2], .02)
x2 <- seq(yrange[1], yrange[2], .02)
colors <- rainbow(450)[256:1]
M <- 10
N <- 6

base <- function(m, x) {
#	r <- x^m										#多項式基底の場合
	r <- exp(-(x-(2*(m-1)/(M-2)-1))^2/(2*0.2^2))	#ガウス基底の場合
	r[m == 0]<-1									# w0をバイアス項とするためφ0=1
	r
}
for (m in (1:M)) {
	basem <- function(x) { base(m, x) }
	par(new=(m>1))
	curve(basem, xlim=xrange, ylim=yrange, ylab="phi(x)")
}
title("basis func.")
 
makePhi<-function(M, x) {
	A <- matrix(nrow=length(x), ncol=M)
	for (i in 1:length(x)) {
		for (j in 0:(M-1)) {
			A[i, 1+j] <- base(j, x[i])
		}
	}
	A
}
x <- seq(-1, 1, 2 / (N - 1))
y <- rnorm(length(x), sin(2 * pi * x), 0.2)

alpha <- 0.1
beta <- (1 / 0.2) ^ 2

# prior probability distribution
s0inv <- alpha * diag(1, M)
m0 <- rep(0, M)
cat("s0");print(solve(s0inv))
cat("m0");print(m0)

# derive the posterior
phi <- makePhi(M, x)
sninv <- s0inv + beta * t(phi) %*% phi
sn <- solve(sninv)
mn <- sn %*% (s0inv %*% m0 + beta * t(phi) %*% y)
cat("sn");print(sn)
cat("mn");print(mn)

kernel <- function(x, xd) {
	phix <- t(makePhi(M, x))
	phixd <- t(makePhi(M, xd))
	beta * t(phix) %*% sn %*% phixd
}
image(x1, x2, outer(x1, x2, Vectorize(kernel)), xlim=xrange, ylim=xrange, col=colors, xlab="x", ylab="x'")
title("k(x,x')")

plot(x, y, type="n", xlim=xrange, ylim=yrange)
for (n in 1:N) {
	col = rainbow(N)[n]
	kernelN <- function(xx) {
		kernel(xx, x[n])
	}
	par(new=T)
	curve(kernelN, xlim=xrange, ylim=yrange, xlab="", ylab="", axes=F, col=col)
}
legend("bottomright", legend=paste("x'=", round(x,1)), col=rainbow(N), lty=1, cex=1, y.intersp=1)
title("k(x,x')")

plot(x, y, type="n", xlim=xrange, ylim=yrange)
estimate <- function(xx) {
	kernel(xx, x) %*% y
}
par(new=T)
curve(estimate, xlim=xrange, ylim=yrange, xlab="", ylab="", axes=F, col=gray(0.5))
for (n in 1:N) {
	col = rainbow(N)[n]
	par(new=T)
	plot(x[n], y[n], pch=16, xlim=xrange, ylim=yrange, xlab="", ylab="", axes=F, col=col)
	kernelT <- function(xx) {
		kernel(xx, x[n]) * y[n]
	}
	par(new=T)
	curve(kernelT, xlim=xrange, ylim=yrange, xlab="", ylab="", axes=F, col=col)
}
title("tn, k(x,xn)tn, y(x)")
```
iPadで音がでない

メディアの音（スピーカーの音量表示）と、
アラーム、通知音、サウンドエフェクトはデフォルトで設定が別になっている。

* 前者は端末右のボタンで上下できる。
* 後者は端末右のスイッチでON/OFを設定できる。
* 後者の音は、標準では設定＞サウンドで音量を設定する。
* 設定サウンドにあるスイッチをONにすると、  
後者の音量を前者同様に上下できる。（連動する）
hello, world in iPhone APP


Storyboardsなしで、プロジェクト作成後、

````objc:ViewController.m
- (void)viewDidLoad
{
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor whiteColor];

    UILabel *lbl;
    lbl = [[UILabel alloc] init];
    lbl.text = @"hello, world";
    [lbl sizeToFit];

    [self.view addSubview:lbl];
}
````
TypeScriptをWebStormでデバッグする


TypeScriptのデバッグについてはJetBrains TVに上がってる動画 ( http://tv.jetbrains.net/videocontent/webstorm-6-sneak-peek-typescript-background-tasks-and-sourcemaps )がとても参考になります。ここではこの動画を文字に書き起こして、環境設定でハマった点を追加した内容を書きます。WebStormはEAPの126.124で動作確認しています。

また、上記の動画のプロジェクトを再現したものを https://github.com/grapswiz/typescript-webstorm に置きました。

## 環境構築
下記の手順1-3はWebStorm上でTypeScriptのコンパイルを行う設定で、4以降は実際にデバッガを使うまでの手順です。

1.  git cloneかdownloadで https://github.com/grapswiz/typescript-webstorm を取得してWebStormで開く
2.  [Preferences] - [File Watches]でTypeScriptをAddする。表示されたウィンドウで Programにtsコンパイラのパス、Environment variablesに環境変数を指定する（nodebrewを使用している場合、環境変数PATHにnodebrewのパスを指定する必要があります） ![watcher](http://farm9.staticflickr.com/8528/8481597921_57909f20f6_z.jpg)
3. cars.tsを編集してみてコンパイルが成功してるか確認する（env: node: No such file or directory'というエラーが出力される場合は何らかの環境変数が足りてないです）
4.  [Run] - [Edit Configurations]で[JavaScript Debug] - [Local]をAddする。表示されたウィンドウでPathにindex.htmlのパスを指定してOKを押す（Nameはなんでもいいです）
5.  [Run] - [Debug '7でつけたName']でブラウザが立ち上がってindex.htmlが表示されることを確認する
6. WebStormに戻ってcars.tsのconsole.log(event.data.sound);にブレークポイントを置く（行番号8の右あたりを押す）
7.  ブラウザに戻って表示された画像をクリックする。WebStormのデバッガが起動して、指定したブレークポイントで止まってればOKです。 ![debugger](http://farm9.staticflickr.com/8248/8482841366_f7acdfbb53_z.jpg)

おつかれさまでした。

## サンプルプロジェクト
 https://github.com/grapswiz/typescript-webstorm

## 参考資料
http://tv.jetbrains.net/videocontent/webstorm-6-sneak-peek-typescript-background-tasks-and-sourcemaps
Perlでカリー化する関数を書いてみた

タイトルのまま
書いてみた

```pl
#!/usr/bin/env perl
use 5.10.0;
use strict;
use warnings;

sub curry {
    my $func = shift;
    my $argc = shift;
    my @arg1 = @_;

    return sub {
        my @arg2 = @_;
        if(scalar(@arg1) + scalar(@arg2) >= $argc){
            return &$func(@arg1, @arg2);
        }
        return curry($func, $argc, @arg1, @arg2);
    }
}
```

カリー化させたいサブルーチンと、必要な引数の数を渡す。

```pl
sub add2 {
    my ($a,$b) = @_;
    return $a + $b;
}

my $ca = curry(\&add2, 2);
say &$ca(1,2);

my $ca2 = curry(\&add2, 2, 1);
say &$ca2(2);

say "=============";

sub mul3 {
    my ($a,$b,$c) = @_;
    return $a * $b * $c;
}

my $cm = curry(\&mul3, 3);
say &$cm(2,3,4);

my $cm2 = &$cm(2);
say &$cm2(3,4);

my $cm3 = curry(\&mul3, 3, 2, 3);
say &$cm3(4);

my $cm4 = curry(\&mul3, 3, 2);
my $cm5 = &$cm4(3);
say &$cm5(4);
```

@_のおかげか、書きやすかった。
その分、最初に必要な引数の数を教えてあげる必要があるのが残念だが。
redis-pyの使い方 辞書とか


```sh
pip install redis
```

pythonでは以下のように

```python
import redis
r = redis.Redis(host='localhost', port=6379, db=0)

#全て消す
r.flushall()

#hashを保存
#key_nameにdictをsetできる
r.hmset(key_name, dict)

#1個ずつ保存の場合
r.hset(key_name, field_name, val)

#hashを取得
r.hgetall(key_name)

#hashのkeyのみ
r.hkeys(key_name)

#hashのvalueのみ
r.hvals(key_name)

#指定したfieldのみ
r.hget(key_name, field_name)

#指定したkeyとfieldをインクリメント
r.hincrby(key_name, field_name, value)

#fieldの存在チェック
r.hexists(key_name,field_name)

#keyの一覧
r.keys()
```

対話型とほぼ同じインターフェースで使えるのが良いですね。
listとかもドキュメントみながらさわればすぐ覚えられそう
ワンライナーで sinatra static file サーバーを起動

~~~:sh
$ ruby -rsinatra -e 'set :public_folder, "."; set :static_cache_control, "no-store"' -- -p 3000 -o 0.0.0.0
~~~

同じディレクトリに `index.html` があれば、`http://localhost:3000/index.html` で開けます。

サーバー無しの HTML5 web アプリのプロトタイプみたいなのつくるときに便利。

EDIT: 2013-04-27: 他のホストや your-mac.local のようなホスト名でアクセスできるようにするために -o 0.0.0.0 オプション追加
EDIT: 2013-09-14: 開発中はブラウザにキャッシュされると困るので Cache-Control: no-store
Mac でファイル名に使えない文字

Mac でファイル名に使えない文字はたったひとつだけ、 `/` である。そんなはずはないぞ、と思う人もいるかもしれない。たとえば、 web ページのリンクを保存するとファイル名にスラッシュが入っていることがある：

![](https://bitbucket.org/uasi/p/raw/master/11/110aae8caf9964716ac8decb2566df9ee144468f.png)

実は、このファイル名を `ls` コマンドなどで表示すると `http-::`… となっていることがわかる。ファイル名に含まれる**コロンは Finder からはスラッシュに見える**のである（`touch foo:bar.txt; open .` などと実行して確かめてみてほしい）。では Finder からファイル名にコロンを入力すればどうなるかというと、そのようなファイル名では保存できないようになっている。

この理由は、 OS X 以前の Mac OS ではコロンがパスの区切り文字として使われていたことによる。古い Mac ではスラッシュに特別な意味がなかったのでファイル名に含めることができたが、 Unix ベースとなった OS X ではスラッシュがパスの区切り文字になったため、ファイル名にスラッシュを使えなくなってしまった。そこで、表示上の互換性を取るために、 OS X では特別な意味がなくなったコロンをスラッシュの代用文字としたのである。

Cocoa や CoreFoundation のメソッド/関数でファイルにデータを書き込む場合、ファイル名にスラッシュを含めないようにすることと、コロンは Finder からスラッシュに見えることに気をつける必要がある。

**補足：**より正確にいうと、ファイルシステムのレイヤーでは依然**コロンがパス区切り文字**として使われている。ファイルシステムにおけるコロンは Unix レイヤーではスラッシュに（そしてスラッシュはコロンに）変換される。変換の図式を以下に示す：

```
Layer       | Path
=====================================================
Finder      | path folder -> to folder -> foo/bar.txt
------------+----------------------------------------
Unix        | /path/to/foo:bar.txt
------------+----------------------------------------
Filesystem  | :path:to:foo/bar.txt
```

参考にしたページ：[When a Colon's a Slash and a Slash's a Colon](http://www.macgeekery.com/gspot/2006-09/when_a_colons_a_slash_and_a_slashs_a_colon)
[DELL][unetbootin]Windows環境なしでのBIOSアップデート

#DELLPCのBIOSアップデートをしたいが、Windows環境がない。。。そんな時の手順。

##環境
* PC: Dell XPS 13(L321X)
* BIOS: A08 
* OS:Ubuntu12.10 

##手順
（※手順通り行わないと、データが飛ぶおそれがあるのでご注意ください）
0. 準備
　UNetbootin:synaptics等からインストール
　usbメモリ:FreeDosのBoot用
　BIOSモジュール：該当するBIOSモジュールをメーカーサイト（DELL）からダウンロードしておく。
　電源確保：ノートPCの場合は、必ずACアダプタ繋いで下さい。

1. UNetbootinでUSBメモリにFreeDOSをインストール。
　UNetbootinディストリビューションでFreeDOSを選択し、インストール。
　FreeDOSをUSBブートできるようにする。

2. BIOSモジュール(今回はLX321A08.EXE)をUSBメモリにコピー。

3. 再起動。DELLのロゴ画面でF8かF12でブートオプションへ。

4. そこでUSBから起動するように選択

5. FreeDOSをブートする
  **必ずboot FreeDOS with no extrasを選んでブートして下さい。** 
  **Install FreeDOSとか選ぶと、OSと共にデータがお亡くなりになります。**


6. ディレクトリ変更
   プロンプトがA:\の場合はC:\に変更します。
  （変更方法は、C:と打ち込んでエンター。）

7. USBメモリ内のBIOSモジュールを実行。
モジュール名確認（Dirと打ち込んでエンター）し、
モジュール名を入力してエンター。
これでBIOSアップデートされます。
しばらく待ちましょう。電源は落とさないように。

8.再起動時にBIOS設定画面に入って、バージョン確認し、該当Verに上がっているのを確認。　

　お疲れ様でした。
Cobertura & Java 7 support

#CoberturaをJava7で利用する方法
以下の対応をしないと、コンパイルエラーが発生する。

Java起動時にオプション指定を追加する
`-XX:-UseSplitVerifier`

##AntのBuild.xmlに追加する
`<jvmarg value="-XX:-UseSplitVerifier" /> `

```xml:Build.xml
<!-- ユニットテストの実行 -->
<property name="report.junit.dir" location="${report.dir}/junit" />
<target name="test" depends="instrument" description="ユニットテストの実行">
	<mkdir dir="${report.junit.dir}" />
	<junit fork="yes" printsummary="yes" haltonfailure="no">
		<jvmarg value="-XX:-UseSplitVerifier" /> 
		<sysproperty key="net.sourceforge.cobertura.datafile" file="cobertura.ser" />
		<classpath>
			<pathelement location="${convert.dir}" />
			<pathelement location="${java.class.dir}" />
			<pathelement location="${test.class.dir}" />
			<fileset dir="${lib.servlet.dir}">
				<include name="*.jar" />
			</fileset>
			<fileset dir="${lib.junit.dir}">
				<include name="*.jar" />
			</fileset>
			<fileset dir="${lib.mock.dir}">
				<include name="*.jar" />
			</fileset>
			<path refid="cobertura.lib" />
		</classpath>
		<formatter type="xml" />
		<batchtest fork="yes" todir="${report.junit.dir}">
			<fileset dir="${test.src.dir}">
				<include name="**/*Test.java" />
			</fileset>
		</batchtest>
	</junit>
</target>
```

##mavenのpom.xml に追加する
`<argLine>-XX:-UseSplitVerifier</argLine>`

```xml:pom.xml
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.12</version>
    <configuration>
        <argLine>-XX:-UseSplitVerifier</argLine>
    </configuration>
</plugin>
```
出典：[Jenkins実践入門](http://www.amazon.co.jp/Jenkins%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%EF%BD%9E%E3%83%93%E3%83%AB%E3%83%89%E3%83%BB%E3%83%86%E3%82%B9%E3%83%88%E3%83%BB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%82%92%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B%E6%8A%80%E8%A1%93-WEB-DB-PRESS-plus/dp/4774148911)
Rで線形基底関数モデルの予測分布

PRML図3.8と同様に、ガウス基底を基底関数とする線形基底関数モデルにおいて、サンプルから求めた重みの事後分布から、予測値の予測分布を求め、サンプル点とともに図示します。また、図3.9と同様に、重みの事後分布から生成した関数の例を図示します。

![](https://dl.dropbox.com/sh/cwfemibvr7gk4cy/jQRTwHQ9Ao/12.LinearRegressionPredictiveDistribution.png)

```r
library(mvtnorm)
frame()
set.seed(0)
par(mfrow=c(2, 2))
par(mar=c(2, 2, 1, 0.1))
par(mgp=c(1, 0.2, 0))
xrange <- c(-0.5, 1.5)
yrange <- c(-1.5, 1.5)
x1 <- seq(xrange[1], xrange[2], .01)
x2 <- seq(yrange[1], yrange[2], .01)
colors <- rainbow(450)[256:1]
M <- 10
N <- 25

base <- function(m, x) {
#	r <- x^m						#多項式基底の場合
	r <- exp(-(x-(m-1)/(M-2))^2/(2*0.2^2))	#ガウス基底の場合
	r[m == 0]<-1					# w0をバイアス項とするためφ0=1
	r
}
makePhi<-function(M, x) {
	A <- matrix(nrow=length(x), ncol=M)
	for (i in 1:length(x)) {
		for (j in 0:(M-1)) {
			A[i, 1+j] <- base(j, x[i])
		}
	}
	A
}
x <- runif(N, 0, 1)
y <- rnorm(N, sin(2 * pi * x), 0.2)

alpha <- 0.1
beta <- (1 / 0.2) ^ 2

# prior probability distribution
s0inv <- alpha * diag(1, M)
m0 <- rep(0, M)
cat("s0");print(solve(s0inv))
cat("m0");print(m0)
 
for (n in c(1, 2, 4, 25)) {
	# derive the posterior
	phi <- makePhi(M, x[1:n])
	sninv <- s0inv + beta * t(phi) %*% phi
	sn <- solve(sninv)
	mn <- sn %*% (s0inv %*% m0 + beta * t(phi) %*% y[1:n])
	cat("sn");print(sn)
	cat("mn");print(mn)
	
	plot(x[1:n], y[1:n], xlim=xrange, ylim=yrange, xlab="x", ylab="y")
	title(paste("N=", n))
	
	# derive the predictive distribution
	phin <- t(makePhi(M, x1))
	u <- t(mn) %*% phin
	s <- 1 / beta + diag(t(phin) %*% sn %*% phin)
	predictive <- function(x, y) {
			dnorm(y, u[x], s[x])
	}
	image(x1, x2, outer(1:length(x1), x2, predictive), xlim=xrange, ylim=yrange, col=colors, xlab="", ylab="", axes=F, add=T)
	
	# plot example regressions
	for (i in 1:5) {
			w <- rmvnorm(1, mn, sn)
			estimate<-function(x){
					(w %*% t(makePhi(M, x)))  # (w[1]+w[2]*base(1,x)+w[3]*base(2,x)...)
			}
			par(new=T)
			curve(estimate, type="l", xlim=xrange, ylim=yrange, col=gray(i/10), xlab="", ylab="", axes=F)
	}
	
	# plot the samples
	par(new=T)
	plot(x[1:n], y[1:n], xlim=xrange, ylim=yrange, xlab="", ylab="", axes=F)
}
```
WebページからRSSのURLを取得する。

headタグ内に以下のタグが存在していれば、RSSフィードがあるってことになるので、
Webページをパースすれば検出可能。

``` html:rssfeed.html
<link rel="alternate" type="application/rss+xml" title="RSSのタイトル" href="RSSフィードのIRL"> 
```

以下、適当に作ったパース処理とか。
Android用にTagSoupを使用しているので、そのままではたぶん動きません。
ちなみに、RSSのフィードは複数ある可能性があるので、リストで取得しています。
実際に使用する際は、バックグラウンドで行うことを推奨。

```java:FeedEntity.java
public class FeedEntity {
	public String Title;
	public String feedUrl;
}
```

```java:GetFeedUrlService.java

	//コンストラクタとかは省略。

	/**
	 * 指定されたURLのフィードを取得する。
	 * @param url
	 * @return
	 */
	public ArrayList<FeedEntity> GetFeedUrl(String feedUrl){
		ArrayList<FeedEntity> feedList = new ArrayList<FeedEntity>();
		try {
			//指定されたURLに接続する。
			URL url = new URL(feedUrl);
			HttpURLConnection connection = (HttpURLConnection) url.openConnection();
			connection.setConnectTimeout(10 * 000); //10秒でタイムアウトにしておく
			InputStream ul = connection.getInputStream();

			//接続したサイトのソースを取得し、パースする。
			InputSource source = new InputSource(new InputStreamReader(ul,"utf-8"));
			Transformer transformer = TransformerFactory.newInstance().newTransformer();
			DOMResult result = new DOMResult();
			XMLReader reader = new Parser();
			transformer.transform(new SAXSource(reader, source), result);

			//linkタグを取得する。
			Document doc = (Document) result.getNode();
			NodeList childs = doc.getElementsByTagName("link");

			for (int i = 0; i < childs.getLength(); i++) {
				Element element = (Element) childs.item(i);
				String rel = element.getAttribute("rel");
				String type = element.getAttribute("type");

				if("alternate".equals(rel) &&
						"application/rss+xml".equals(type)){

					FeedEntity entity = new FeedEntity();
					entity.Title = element.getAttribute("title");
					entity.feedUrl = element.getAttribute("href");
					feedList.add(entity);
				}
			}

		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (TransformerConfigurationException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (TransformerFactoryConfigurationError e) {
			e.printStackTrace();
		} catch (TransformerException e) {
			e.printStackTrace();
		}
		return feedList;
	}
```
OUYAのサンプルをEclipseで動かすまで。

### 初めに

公式のドキュメントの__Setup__の__Eclipse__の指示通りにやれば良いです！
https://devs.ouya.tv/developers/docs/setup

自分が躓いた部分を一応書いてみました。

- - -

### 環境

+ Windows7 64bit
+ Eclipse4.2.1
+ Android4.1.2(API16)
+ OUYA SDK(odk-0.0.6.zip) https://devs.ouya.tv/developers/odk

※OUYA Development KitでODKと公式では略しています。

- - -

### ココに躓いた

- 躓く前まで

OUYA仮想デバイスの設定(Android Virtual Device Managerでの設定)
__Setup__ページ中段下辺りの__Emulator__に合わせます。

- CPU/ABIの変更が出来ない(Intel Atom (x86)に出来ない)

→__Intel x86 Atom System Image__をAndroidSDKManagerでインストールすると選択出来るようになります。Android4.1.2のパッケージの中に入ってます。(低レベルのコード書くならARMにしてねと書いてあります）

- RAMを1024にすると警告が出るしメモリ割り当てに失敗する。

> On Windows, emulating RAM greater than 768MB may fail...

768MBでも一応動きました。遅い。。。

- 遅い。イライラする。

Intel HAXMというものを使うとちょー速くなりました。

設定方法はこちらを参考にさせて頂きました。↓↓

[噂の爆速エミュレーター(android)を試してみたがマジで早かった件。](http://xn--gckc5l536jj8c412bo76c.com/%E5%99%82%E3%81%AE%E7%88%86%E9%80%9F%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%BF%E3%83%BCandroid/)


- - -

###もろもろの設定後

![Device: WXGA Target: Android4.1.2 CPU/ABI: Intel Atom (x86) MemoryOptions: RAM: 512 SD Card: 512 UseHostGPUにチェック](https://raw.github.com/imoti/image/master/ram1024.png)



以上です。間違いなど何かあればご指摘頂ければ幸いです。
「Vimの正規表現`\%`は結構便利だよ」という話


この記事は[Vim Advent Calendar 2012](http://atnd.org/events/33746) : ATND 79日目の記事になります。
78日目は[@raa0121](http://twitter.com/raa0121)の[LingrのBot「VimAdv」を作った](http://wp.raa0121.info/archives/13)でした。

- - - - - - - - - - - - - - - - - - - - - - - -

今回は、Vimの意外と知られていない正規表現`\%`を紹介したいと思います。


## 任意にマッチするアトム列 `\%[]`

Vimの各コマンドは省略名をもっているので、これは必須の正規表現かなっと思います。

```vim:
echo matchstr("fun", 'fu\%[nction]') 
" 'fun'

" `\%[]`を使わないとこう書かなければいけない！！
echo matchstr("fun", 'fu\(n\(c\(t\(i\(o\(n\?\)\?\)\?\)\?\)\?\)\?\)\?') 
" 'fun'
```


## 部分正規表現としてカウントされないグループ化 `\%(\)`

これはmatchlist()には結構必須で、matchlist()は10個以上のグループ化をしている
パターンを渡すとエラーになってしまいます。

```vim:
echo matchlist("function", 'fu\(nc\)t\(io\)n')
" ['function','nc','io','','','','','','',''] 

echo matchlist("function", 'fu\%(nc\)t\(io\)n') 
" ['function','io','','','','','','','']
```

- - - - - - - - - - - - - - - - - - - - - - - -

以上、「\%...は結構便利だよ」という話でしたw。
実はこれは[ujihisa.vim#3](http://vim-jp.org/ujihisa.vim-3/)で話そうかと思ったやつですw。
スライドにしたら4,5枚になったのに記事にすると少なすぎる...(すみません)
  


<!--  vim: set ft=markdown fdm=marker ff=unix : -->
tiapp.xml <activities>は<android>直下に記載する

公式ドキュメント(*1)には「\<android:application>」タグ配下に記載する説明となっているが、その場合直接AndroidManifest.xmlに転写される。これは素のAndroidManifest.xml用の書き方となる。
tiapp.xmlに記載できるJavascriptを使用したアクティビティの作成の場合、\<android>タグの下に記載する必要がある。

```xml:tiapp.xml
    <android xmlns:android="http://schemas.android.com/apk/res/android">
		<activities>
			<activity url="MainWindow.js"
				android:label="@string/appname"
				android:name=".MyAppMainActivity"
				android:screenOrientation="portrait">
			</activity>
		</activities>
    	<tool-api-level>10</tool-api-level>
        <manifest android:versionCode="2" android:versionName="1.1.0">
            <application android:label="@string/appname"
            	android:debuggable="true">
			</application>
            <supports-screens
            	android:smallScreens="false"
            	android:normalScreens="true"
            	android:largeScreens="true"
            	android:xlargeScreens="false"
            	android:anyDensity="true"/>
        </manifest>
    </android>
```

(*1) http://docs.appcelerator.com/titanium/2.1/#!/guide/tiapp.xml_and_timodule.xml_Reference-section-29004921_tiapp.xmlandtimodule.xmlReference-Applicationproperties
OpenSSLでcertificate verify failedが出た場合

ハマったのでメモ

## 環境

```
OS X 10.8.2
rbenv + ruby-build
openssl 1.0.1e(brew)
```

rubyインストールの仕方は http://qiita.com/items/e7c4374d25ba2056a7b7 と同じ

## エラー

```ruby
require 'net/https'
https = Net::HTTP.new('github.com', 443)
https.use_ssl = true
https.verify_mode = OpenSSL::SSL::VERIFY_PEER
https.request_get('/')
# => OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
# ... 略 ...
```

## CA_FILEの場所の確認

```
> require 'openssl'
=> true
> p OpenSSL::X509::DEFAULT_CERT_FILE
"/usr/local/etc/openssl/cert.pem"
```

指定されたディレクトリへ移動すると、cert.pemがない

```
$ cd /usr/local/etc/openssl
$ ll
total 24
drwxr-xr-x   4 kengos  admin    136  2 17 16:32 ./
drwxr-xr-x  14 kengos  admin    476  2 17 16:11 ../
drwxr-xr-x   9 kengos  admin    306  2 17 16:22 misc/
-rw-r--r--   1 kengos  admin  10835  2 17 16:22 openssl.cnf
```

## 適当にダウンロードして、設置したら解決

```
curl -o cert.pem http://curl.haxx.se/ca/cacert.pem
mv cert.pem /usr/local/etc/openssl
```
Rails 3.2.12 + friendly_id


* 参考
  * [norman/friendly_id · GitHub](https://github.com/norman/friendly_id)
  * [#314 Pretty URLs with FriendlyId - RailsCasts](http://railscasts.com/episodes/314-pretty-urls-with-friendlyid?language=ja&view=asciicast)

----

Gemfile

```rb
# Friendly ID
gem "friendly_id"
```

マイグレーション

```
rails g migration add_slug_to_users
```

db/migrate/20130217075243_add_slug_to_users.rb

```
class AddSlugToUsers < ActiveRecord::Migration
  def change
    add_column :users, :slug, :string
    add_index :users, :slug, unique: true
  end
end
```

```
rake db:migrate
```

app/models/user.rb

```rb
  attr_accessible :slug

  # Friendly ID
  extend FriendlyId
  friendly_id :nickname, use: :slugged

  # バリデーション
  validate :slug, uniqueness: { case_sensitive: false }
```

slug更新

```
User.find_each(&:save)
```

app/controllers/users\_controller.rb

```rb
# coding: utf-8
class UsersController < ApplicationController
  def show( id )
#    @user = User.where( id: id ).first
    @user = User.where( slug: id ).first
  end
end
```

http://0.0.0.0:3000/users/shu0115

```
Started GET "/users/shu0115" for 127.0.0.1 at 2013-02-17 17:37:45 +0900
Processing by UsersController#show as HTML
  Parameters: {"id"=>"shu0115"}
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."slug" = 'shu0115' LIMIT 1
```

----

* find

```rb
User.find( "shu0115" )
 # => SELECT "users".* FROM "users" WHERE "users"."slug" = 'shu0115' LIMIT 1
```

* where

```rb
User.where( id: "shu0115" ).first
 # => SELECT "users".* FROM "users" WHERE "users"."id" = 0 LIMIT 1
```

```rb
User.where( slug: "shu0115" ).first
 # => SELECT "users".* FROM "users" WHERE "users"."slug" = 'shu0115' LIMIT 1
```

* update

```rb
User.where( slug: "shu0115" ).first.update_attributes( nickname: "shu.0115" )
 # => SELECT "users".* FROM "users" WHERE "users"."slug" = 'shu0115' LIMIT 1
 # => SELECT "users".* FROM "users" WHERE ("slug" = 'shu-0115' OR "slug" LIKE 'shu-0115--%'ESCAPE '\') AND (id <> 1) ORDER BY LENGTH("slug") DESC, "slug" DESC LIMIT 1
 # => UPDATE "users" SET "nickname" = 'shu.0115', "slug" = 'shu-0115', "updated_at" = '2013-02-17 08:24:49.192265' WHERE "users"."id" = 1
```
PerlでBase64エンコードされたmodulus, exponentお値からRSA署名検証に使われる公開鍵を取り出す方法

OpenID ConnectではRSA関連アルゴリズムで生成された署名検証のために、OPは以下の2つの方法で公開鍵を提示する。 

1. PEM形式のX.509証明書を提供
2. JSON Web Key(JWK)形式でmodulusとexponentの値を提供

今回はRP側が(2)の形式で与えられた情報から署名検証のための公開鍵を取得するまでの手順をまとめる。

## 必要なモジュール

* [Crypt::OpenSSL::RSA](https://metacpan.org/module/Crypt::OpenSSL::RSA)
* [Crypt::OpenSSL::Bignum](https://metacpan.org/module/Crypt::OpenSSL::Bignum)
* [MIME::Base64](https://metacpan.org/module/MIME::Base64)

## 手順

次のような形式でModulusとExponentを取得する。

    {"keys":
        [
            {
                "kty":"RSA",
                "n": "0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx
    4cbbfAAtVT86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMs
    tn64tZ_2W-5JsGY4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2
    QvzqY368QQMicAtaSqzs8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbI
    SD08qNLyrdkt-bFTWhAI4vMQFh6WeZu0fM4lFd2NcRwr3XPksINHaQ-G_xBniIqb
    w0Ls1jF44-csFCur-kEgU8awapJzKnqDKgw",
                "e":"AQAB",
                "alg":"RS256",
                "kid":"2011-04-29"
            }
        ]
    }

1. modulus(n), exponent(e)をそれぞれBase64 decodeする
2. Crypt::OpenSSL::Bignum->new_from_binによりBignumを生成
3. Crypt::OpenSSL::RSA->new_key_from_parametersにnとeの値を指定
4. Crypt::OpenSSL::RSA->get_public_key_x509_stringにより公開鍵を取得

Crypt::OpenSSL::RSAを利用するモジュールであればこの公開鍵を署名検証メソッドに利用できる

## 詳細

gistを参照 [openssl-rsa-pubkey-handling.pl](https://gist.github.com/ritou/4968015)

コメントアウトされているがCrypt::OpenSSL::Bignum->new_from_binを使っている部分に注目。
PerlでPEM形式のX.509証明書からRSA署名検証に使われる公開鍵を取り出す方法

OpenID ConnectではRSA関連アルゴリズムで生成された署名検証のために、OPは以下の2つの方法で公開鍵を提示する。 

1. PEM形式のX.509証明書を提供
2. JSON Web Key(JWK)形式でModulusとExponentの値を提供

今回はRP側が(1)の形式で与えられた情報から署名検証のための公開鍵を取得するまでの手順をまとめる。

## 必要なモジュール

* [Crypt::OpenSSL::CA](https://metacpan.org/release/Crypt-OpenSSL-CA)

## 手順

1. Crypt::OpenSSL::CA::X509->parseによりX.509証明書を読み込む
2. Crypt::OpenSSL::CA::X509->get_public_key->to_PEM により公開鍵を取り出す

Crypt::OpenSSL::RSAを利用するモジュールであればこの公開鍵を署名検証メソッドに利用できる

## 詳細

gistを参照 [openssl-rsa-pubkey-handling.pl](https://gist.github.com/ritou/4968015)
GREEのSocial FeedBackのブックマークレットを作ってみました。

https://gist.github.com/sassy/4039442

```js
javascript:(function(){
var f = document.createElement('iframe');
f.src='http://share.gree.jp/share?url=' + encodeURIComponent(location.href) + '&type=0&height=20';
f.width=100;
f.height=100;
f.frameBorder=0;
f.marginWidth=0;
f.marginHeight=0;
f.setAttribute('scrolling','no');
f.setAttribute('allowTransparency','true');
f.style.border='none';
f.style.overflow='hidden';
f.style.width='100px';
f.style.height='20px';
document.body.insertBefore(f, document.body.firstChild);
})();
```

ページの上部にソーシャルフィードバックボタンが出てきて、
GREE内でページの共有ができます。
Androidでfacebook型メニューを実装するためのリファレンス実装

AndroidでFacebook型メニューを実装するためにリファレンスとなりそうな実装

* https://github.com/gitgrimbo/android-sliding-menu-demo/tree/master/SlidingMenuDemo

こちらはいくつか実装例がありますが、
SlideAnimationThenCallLayoutをみる限り、
アニメーションとlayoutメソッドで実現しているようです。

* https://github.com/walkingice/gui-sliding-sidebar
こちらはサイドバーとメインのコンテンツにたいしてそれぞれlayoutメソッドを
onLayoutで行っているようです。
デモと実装がわかれているので、そのままつかえそうです。
chefspecチートシート

公私共にchefを使っていて、テストにchefspecを使っていますが、RSpec系になじみがないからか、なかなか覚えられないのでチートシートにまとめます。
詳細や正確な情報は本家で確認してください。

本家：https://github.com/acrmp/chefspec

## specを書く上での準備
### nodeの設定
cookbook, role, node等でattributesを定義していて、レシピの動作結果がこれに依存している場合は、convergeより先にnodeに値をセットする必要があります。

```ruby:prepare1
let( :chef_run ) do
  chef_run = ChefSpec::ChefRunner.new do |node|
    node.set['my_attribute'] = 'bar'
    node.set['my_other_attribute'] = {'hoge' => 'bar2'}
  end.converge 'example::default'
end
```

### chef_environmentの設定
chef-soloではサポートしていなかったりで、個人的にはあまり使いたくないところですが。Environmentはインスタンスなのでnodeと比べると面倒です。

```ruby:prepare2
let( :chef_run ) do
  ChefSpec::ChefRunner.new do |node|
    env = Chef::Environment.new
    env.name 'staging'
    node.stub(:chef_environment).and_return env.name
    Chef::Environment.stub(:load).and_return env
  end.converge 'example::default'
end
```

### cookbook_pathの追加
site-cookbookを使っていたりでcookbookpathが複数ある場合は、パスを追加する必要があります。

```ruby:prepare3
let (:chef_run) { ChefSpec::ChefRunner.new(:cookbook_path => ['cookbooks', 'site-cookbooks']).converge 'example::default' }
```

## specの書き方
### パッケージ、サービス関連
```ruby:package_and_service
# package
expect(chef_run).to install_package 'foo'
expect(chef_run).to install_package_at_version 'foo', '1.2.3'
expect(chef_run).to upgrade_package 'foo'
expect(chef_run).to install_yum_package 'yum-foo'

# service
expect(chef_run).to set_service_to_start_on_boot 'food'
expect(chef_run).to restart_service 'food'
```

### ファイル、ディレクトリ操作関連
> 執筆時点(2013/02)の現行バージョンでは、cookbook_fileがcreate_fileで認識されないのでご注意を。（pullreqは承認されているので、じきに反映されると思いますが）

私の勘違いでした。0.9.0でもcookbook_fileはサポートされています。

```ruby:file_and_directory
# directory
expect(chef_run).to create_directory '/var/lib/foo'
dir = chef_run.directory('/var/lib/foo')
expect(dir.mode).to eq "0700"
expect(dir).to be_owned_by('user', 'group')

# cookbook_file
expect(chef_run).to create_cookbook_file '/var/lib/hoge.txt'
file = chef_run.cookbook_file('/var/lib/hoge.txt')
expect(file.mode).to eq "0700"
expect(file).to be_owned_by('user', 'group')

# file (template)
expect(chef_run).to create_file '/var/log/bar.log'
file = chef_run.template('/var/log/bar.log')
expect(file.mode).to eq "0600"
expect(file).to be_owned_by('user', 'group')

# remote_file
expect(chef_run).to create_remote_file 'http://path/to/file'
file = chef_run.remote_file('/var/lib/hoge.txt')
expect(file.mode).to eq "0700"
expect(file).to be_owned_by('user', 'group')

# symlink
expect(chef_run).to create_link "/path/to/link"
chef_run.link("/path/to/link").to.should == "/path/from/link"
```

### その他
```ruby:others
# cron
expect(chef_run.cron('daily_job')).to be

# include recipe
expect(chef_run).to include_recipe 'foo::bar'

# if you want check xxx not, use shoud_not
expect(chef_run).not_to create_directory '/no/such/directory'
```

## あとがき
テストの書き方やその度合いは、統一的な見解はないので人それぞれです。私の場合は、**仕様として明らかにしたいもの、後続処理などに影響を与える重要なもの**に絞ってテストを書くようにしています。特に**設計がまとまらない時はテストファーストをする**ことで、設計とテスト準備を同時にやっつけます。
Rで線形基底関数モデルの逐次ベイズ学習

PRML図3.7と同様に、線形基底関数モデルにおいて、1点ずつサンプルを観測して重みwの事後確率を逐次更新し、新たなwの事前確率とします。wの事前確率、観測したサンプルと新しいwの事後確率で生成した関数の例、観測したサンプルに対するwの尤度を、サンプルの観測ごとに描画します。

![](https://dl.dropbox.com/sh/cwfemibvr7gk4cy/MgV-Lj4rdE/11.LinearRegressionSequentialBayesLearning.png)

```r
library(mvtnorm)
frame()
set.seed(0)
par(mfcol=c(3, 6))
par(mar=c(2, 2, 1, 0.1))
par(mgp=c(1, 0.2, 0))
xrange <- c(-1, 1)
yrange <- c(-1, 1)
x1 <- seq(xrange[1], xrange[2], .05)
x2 <- seq(yrange[1], yrange[2], .05)
colors <- rainbow(450)[256:1]
M <- 2
N <- 6
 
base <- function(m, x) {
	r <- x^m						#多項式基底の場合
#	r <- exp(-(x-(m-1)/(M-2))^2/(2*0.2^2))	#ガウス基底の場合
	r[m == 0]<-1					# w0をバイアス項とするためφ0=1
	r
}
makePhi<-function(M, x) {
	A <- matrix(nrow=length(x), ncol=M)
	for (i in 1:length(x)) {
		for (j in 0:(M-1)) {
			A[i, 1+j] <- base(j, x[i])
		}
	}
	A
}
x <- runif(N, -1, 1)
phi <- makePhi(M, x)
wTrue <- c(-0.3, 0.5)
y <- rnorm(N, t(wTrue) %*% t(phi), 0.2)

alpha <- 0.1
beta <- (1 / 0.2) ^ 2
s0inv <- alpha * diag(1, M)
m0 <- rep(0, M)
for (n in 1:nrow(phi)) {
	# current prior probability distribution
	cat("s");print(solve(s0inv))
	cat("m");print(m0)
	prior <- function(x1, x2) {
		dmvnorm(c(x1, x2), m0, solve(s0inv))
	}
	par(cex=0.5)
	image(x1, x2, outer(x1,x2,Vectorize(prior)), xlim=xrange, ylim=yrange, col=colors, xlab="w0", ylab="w1")
	title("prior")

	# take nth sample
	phin <- t(phi[n,])
	yn <- y[n]

	# derive the posterior
	sninv <- s0inv + beta * t(phin) %*% phin
	mn <- solve(sninv) %*% (s0inv %*% m0 + beta * t(phin) %*% yn)

	# use the posterior as the next prior
	s0inv <- sninv
	m0 <- mn

	# plot the sample, bayes regression, and the likelihood on its sample
	plot(phi[1:n,2], y[1:n], xlim=xrange, ylim=yrange, xlab="x", ylab="y")
	title("sample")
	for (j in 1:100) {
		w <- rmvnorm(1, m0, solve(s0inv))
		estimate<-function(x){
			(w %*% t(makePhi(M, x)))  # (w[1]+w[2]*base(1,x)+w[3]*base(2,x)...)
		}
		par(new=T)
		curve(estimate, type="l", xlim=xrange, ylim=yrange, col=rgb(1, 0, 0, alpha=0.1), xlab="", ylab="", axes=F)
	}
	par(new=T)
	plot(phi[1:n,2], y[1:n], xlim=xrange, ylim=yrange, xlab="", ylab="", axes=F)
	likelihood <- function(x1, x2) {
		dnorm(yn, phin %*% c(x1, x2), sqrt(1 / beta))
	}
	image(x1, x2, outer(x1,x2,Vectorize(likelihood)), xlim=xrange, ylim=yrange, col=colors, xlab="w0", ylab="w1")
	title("likelihood")
}
```
propertyを使うときはobjectを継承したクラス (new-style class) を使う


##new-style classじゃない場合##

```python
class Hoge:
    def __init__(self):
        self._x = 1

    @property
    def x(self):
        print 'property', self._x
        return self._x

    @x.setter
    def x(self, x):
        print 'setter'
        self._x = x

a = Hoge()
print a.x

a.x = 2
print a.x
```

##結果##
```
property 1
1
2
```

<br>

##new-style classの場合##
```python
class Hoge(object):
    def __init__(self):
        self._x = 1

    @property
    def x(self):
        print 'property', self._x
        return self._x

    @x.setter
    def x(self, x):
        print 'setter'
        self._x = x

a = Hoge()
print a.x

a.x = 2
print a.x
```


##結果##
```
property 1
1
setter
property 2
2
```

##参考##

* http://www.gesource.jp/weblog/?p=643
画像を明るくする

ImageMagickのconvertコマンドのオプション。

```bash
convert -brightness-contrast 10 akubi.jpg akubi2-10.jpg
```

```bash
for br in 10 25 35 50; do convert -brightness-contrast $br akubi.jpg akubi-$br.jpg; done
```

![](http://gyazo.udzura.jp/fefb6d319025533e643428f42e55e4fc.png)

`-brightness-contrast 35` ぐらいなら上に文字乗っけても読める感じだと思う。画像によるか。
re.MULTILINE 使用例


この間これと同じ正規表現を書いてなぜ動かなかったのかわからない。

```python:remultiline.py
# -*- coding:utf-8 -*-
import re


text = """
[id][integer] PRIMARY KEY,
[column1][varchar](10) NOT NULL UNIQUE,
[column2][datetime] NULL,
[column3][decimal](10, 2) NOT NULL
"""


pattern = r'^\[([^\]]+)\]\[([^\]]+)\](\([^\)]+\))?\s.+$'
# MULTILINEフラグがないと正しく処理されない。
print "with re.M", re.findall(pattern, text, re.M)
#=> [('id', 'integer', ''),
#    ('column1', 'varchar', '(10)'),
#    ('column2', 'datetime', ''),
#    ('column3', 'decimal', '(10, 2)')]

print "without re.M", re.findall(pattern, text)
# => []
```
Sublime TextでC++の開発環境を作る


Ubuntu 12.10をベースに、Sublime Text 2でC++の開発環境を整えてみました。

# sublime textのインストール

[公式サイト](http://www.sublimetext.com/)にはtar ballがありますが、PPAがあるのでそちらを利用してインストールします。

```sh:
sudo add-apt-repository ppa:webupd8team/sublime-text-2
sudo apt-get update
sudo apt-get install sublime-text
```

# Sublime Package Control のインストール
パッケージの管理のために[Package Control](http://wbond.net/sublime_packages/package_control)をインストールします。

1. ctrl + shift + @ でプロンプト表示します。
2. 以下のコマンドを実行します。

```python:
import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print 'Please restart Sublime Text to finish installation'
```

3. Sublime Text を再起動します。

# SublimeClang のインストール
[SublimeClang](https://github.com/quarnster/SublimeClang)をインストールします。
SublimeClangをインストールすると以下のことができるようになります。

- C/C++のコード補完
- ヘッダーファイルへの移動
- 構文エラーなどのチェック

SublimeClangはPackage Controlを使ってインストールします。

1. ctrl + shift + p でプロンプト表示
2. 「install」と入力し候補の「Package Control: Install Package」を選択
3. 「clang」と入力し候補の「SublimeClang」を選択。しばらく待つとインストールされる

## エラー対応
起動すると「Unfortunately ctypes can't be imported, so SublimeClang will not work.」とダイアログが出てSublimeClangが使えません。
Linux特有の問題なようなので次の手順でPythonとclangの設定をします。

### python 2.6のインストール

```sh:
sudo apt-get install curl
curl -kL http://xrl.us/pythonbrewinstall | bash
source "$HOME/.pythonbrew/etc/bashrc"
pythonbrew install --configure="--enable-unicode=ucs4" 2.6
sudo ln -s $HOME/.pythonbrew/pythons/Python-2.6/lib/python2.6 /usr/lib/sublime-text-2/lib/
```

### ライブラリの作成

```sh:
sudo apt-get install cmake clang    
wget wget http://llvm.org/releases/3.2/clang+llvm-3.2-x86_64-linux-ubuntu-12.04.tar.gz
tar xvf clang+llvm-3.2-x86_64-linux-ubuntu-12.04.tar.gz
cp clang+llvm-3.2-x86_64-linux-ubuntu-12.04/lib/libclang.so ~/.config/sublime-text-2/Packages/SublimeClang/
cd ~/.config/sublime-text-2/Packages/SublimeClang/src
mkdir build
cd build
cmake ..
make
```

## 参照するヘッダファイルの追加

開発で作成した独自のヘッダファイルは、同じフォルダにない限りSublimeClangからは参照されず、includeを書いてもエラーとなります。
解決するには、Sublime Textのプロジェクトの設定ファイルにヘッダファイルがあるディレクトリのパスを追記します。これでinclude文がエラーにならず、補完も効くようになります。

1. [Project] - [Save Project As…]メニューでプロジェクトを作成する。ファイル名がプロジェクト名になるので、任意の名前を付ける。
2. [Project] - [Edit Project]メニューよりプロジェクトの設定ファイルを開く。
3. 設定ファイルにヘッダファイルへのパスを追加する。

```json:
{
	"settings": {
		"sublimeclang_options": [
			"-I/path/to/foo/include",
			"-I/path/to/bar/include"
		]
    }
}
```

これでSublime Text上でのC/C++開発環境が整いました。重いIDEを立ち上げなくてもSublime Text上でほぼ開発が完結するので非常に開発が楽になりました。
第8回オフラインリアルタイムどう書くの参考問題の回答例。C言語 で。

イベントページは http://atnd.org/events/36783 。
問題は http://nabetani.sakura.ne.jp/hena/ord8entco/ 。
解答リンク集は http://qiita.com/items/24b9be4ee3bae4c89a95 。

で。

C言語で書いてみた。

```c:entco.c
// compiled with "clang -std=c11"
#include <stdio.h>
#include <string.h>

struct read_state
{
    char const * src;
    int pos;
    _Bool ok;
};

int char_to_num( char c )
{
    return ( '0'<=c && c<='9' )
        ? c-'0'
        : c-'a'+10;
}

_Bool read( struct read_state * rs )
{
    if ( ! rs->ok ){
        return 0;
    }
    int pos = rs->pos;
    ++rs->pos;
    char c = rs->src[ pos/4 ];
    if ( ! c ){
        rs->ok=0;
        return 0;
    }
    return !( char_to_num(c) & (1 << ( pos%4 ) ) );
}

#define M( proc, zero, one )\
char proc( struct read_state * rs ){  return read(rs) ? (zero) : (one);  }

char read_010110( struct read_state * rs )
{
    if ( read(rs) ){
        rs->ok=0;
        return 0;
    } else {
        return 'c';
    }
}

M( read_01011, read_010110(rs), 'l' );
M( read_0101, 'd', read_01011(rs));
M( read_001, 's', 'n' );
M( read_010, 'i', read_0101(rs) );
M( read_011, 'o', 'a' );
M( read_110, 'r', 'h' );
M( read_00, 't', read_001(rs) );
M( read_01, read_010(rs), read_011(rs) );
M( read_11, read_110(rs), 0 );
M( read_0, read_00(rs), read_01(rs) );
M( read_1, 'e', read_11(rs) );
M( read_char, read_0(rs), read_1(rs) );
#undef M

void solve( char const * src, char * actual )
{
    struct read_state rs={ src, 0, 1 };
    for( int pos=0 ; ; ++pos ){
        char c=read_char( &rs );
        if ( ! rs.ok ){
            strcpy( actual, "*invalid*" );
            return;
        }
        if ( c==0 ){
            char numtext[13]={0};
            sprintf( numtext, ":%d", rs.pos );
            strcpy( actual+pos, numtext );
            return;
        }
        actual[ pos ] = c;
    }
}

void test( char const * src, char const * expected )
{
    int read=0;
    char actual[ strlen( src )*2+13 ];
    solve( src, actual );
    printf( "%s -> %s ( %s ) %s\n", 
        src, actual, expected, 
        strcmp( actual, expected ) ? "***NG***" : "ok" );
}

int main()
{
    /*0*/ test( "16d9d4fbd", "ethanol:30" );
	// 中略
    /*36*/ test( "6822dcb", "*invalid*" );
}
```

エントロピー符号なので、ビットがツリー構造をなしている。
ツリー構造をそのまま関数呼び出しのツリーにしてみた。
そのまま書くと膨大な量になるのでいんちき臭いマクロで行数を減らしてみた。

当初は膨大な if 文を書いてやろうかと思って途中まで書いたんだけど、膨大になりすぎるのでやめた。自動生成という案もあったけど、今回は関数呼び出し＋マクロで我慢。

C11 特有の機能は使ってないと思うけど、C99 は利用している。可変長配列とか。
2013/02/16(土)の今川義元


1. ODBC, unixODBC, FreeTDSの位置づけ
2. cursesって何だっけ？ -> 端末操作ライブラリ。vi->curses

	http://docs.python.jp/3.3/library/curses.html

3. UNIX -> curses, Windows -> Console
4. Neo4j, グラフデータベース

	http://www.slideshare.net/thobe/django-and-neo4j-domain-modeling-that-kicks-ass
5. "Django How to separate domain model" でぐぐって碌なヒットなし。
ODBC, unixODBC, FreeTDS


1. ODBC インターフェース API --> 仕様/規格
2. unixODBC ODBCドライバマネージャ --> 実装
3. FreeTDS SQL Server/SyBase のデータベースドライバ --> 実装

TDSとはなぬものだ？

Tabular DataStream プロトコル

FreeTDSはTDSプロトコルを実装したライブラリ。


PythonからSQL Serverを利用する場合


1. pymssql

	pymssql -> FreeTDS -> SQL Server DataBase
2. pyodbc

	pyodbc -> unixODBC -> FreeTDS -> SQL Server DataBase

FreeTDSはコネクションプールできる。
/etc/pool.conf を置いておく。


参考リンク

ばぁばのＯＤＢＣ実験室 UNIX での ODBC 活用
http://www.amy.hi-ho.ne.jp/jbaba/unix/unixodbc.htm

FreeTDS User Guide
http://freetds.schemamania.org/userguide/
Apache2.4+PHP-FPMのhttpd.confの個人的メモ

丁寧な解説を書くのが面倒なので個人的メモ。

Apache2.4と言えばevent-mpmが目玉。しかしPHPを素直にmod_phpとして使おうとするとprefork-mpmになってしまい、event-mpmが使えず何だかもったいない。

Apache自体はeventで、PHPはPHP-FPMによるFastCGIで、と組み合わせる場合、mod_proxy_fcgiを使うと楽らしい。2.4から標準装備になっており、設定を有効にするだけで使える。

このページが詳しい。

PHP-FPM - Httpd Wiki http://wiki.apache.org/httpd/PHP-FPM

インストール手順は省略。
httpd.confでは、この2行のコメントアウトを外しておく。

```apache
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
```

PHP-FPMはポート9000で起動しているものとすると、個別のサイト設定は↓こんな感じ。

```apache
<Macro VhostPHP $domain $droot>
<VirtualHost $domain:80>
  ServerName $domain
  DocumentRoot $droot
  ProxyPassMatch \.(?:ico|png|gif|jpeg|jpg|css|js|html|php|json|xml)$ !
  ProxyPassMatch ^(.*)$ fcgi://127.0.0.1:9000$droot/index.php$1

  <Directory $droot>
    Require all granted
  </Directory>
</VirtualHost>
</Macro>
```

Macroはmod_macroをインストールしないと動かない部分なので、VirtualHostの中身をコピペして$XXXXを書き換える感じでも動く。

ProxyPassMatchで簡単な置き換えができるので、SymfonyやZend Frameworkのようなよくあるフロントコントローラーに直接リクエストを投げることができる。（上記の例ならmod_rewrite不要）

nginxを使う場合とそっくり？
Objective-C で、クラスのプロパティ一覧を取得する


クラスのプロパティ一覧が欲しくなりましたので、以下のカテゴリ拡張を作りました。

```objective-c:MMPropertyUtil.h
//
//  MMPropertyUtil.h
//  MoyaMap
//
//  Created by Haruyuki Seki on 2/16/13.
//  Copyright (c) 2013 Hacker's Cafe. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface NSObject (MMPropertyUtil)

+ (NSDictionary *)properties;

@end
```

```objective-c:MMPropertyUtil.m
//
//  MMPropertyUtil.m
//  MoyaMap
//
//  http://stackoverflow.com/questions/754824/get-an-object-attributes-list-in-objective-c
//
//  Created by Haruyuki Seki on 2/16/13.
//  Copyright (c) 2013 Hacker's Cafe. All rights reserved.
//

#import "MMPropertyUtil.h"
#import "objc/runtime.h"

@implementation NSObject (MMPropertyUtil)

static const char * getPropertyType(objc_property_t property) {
    const char *attributes = property_getAttributes(property);
    printf("attributes=%s\n", attributes);
    char buffer[1 + strlen(attributes)];
    strcpy(buffer, attributes);
    char *state = buffer, *attribute;
    while ((attribute = strsep(&state, ",")) != NULL) {
        if (attribute[0] == 'T' && attribute[1] != '@') {
            // it's a C primitive type:
            /*
             if you want a list of what will be returned for these primitives, search online for
             "objective-c" "Property Attribute Description Examples"
             apple docs list plenty of examples of what you get for int "i", long "l", unsigned "I", struct, etc.
             */
            return (const char *)[[NSData dataWithBytes:(attribute + 1) length:strlen(attribute) - 1] bytes];
        }
        else if (attribute[0] == 'T' && attribute[1] == '@' && strlen(attribute) == 2) {
            // it's an ObjC id type:
            return "id";
        }
        else if (attribute[0] == 'T' && attribute[1] == '@') {
            // it's another ObjC object type:
            return (const char *)[[NSData dataWithBytes:(attribute + 3) length:strlen(attribute) - 4] bytes];
        }
    }
    return "";
}


+ (NSDictionary *)properties
{
    NSMutableDictionary *results = [[NSMutableDictionary alloc] init];
    
    unsigned int outCount, i;
    objc_property_t *properties = class_copyPropertyList(self, &outCount);
    for (i = 0; i < outCount; i++) {
        objc_property_t property = properties[i];
        const char *propName = property_getName(property);
        if(propName) {
            const char *propType = getPropertyType(property);
            NSString *propertyName = [NSString stringWithUTF8String:propName];
            NSString *propertyType = [NSString stringWithUTF8String:propType];
            [results setObject:propertyType forKey:propertyName];
        }
    }
    free(properties);
    
    // returning a copy here to make sure the dictionary is immutable
    return [NSDictionary dictionaryWithDictionary:results];
}


@end
```

作ったと言っても、
http://stackoverflow.com/questions/754824/get-an-object-attributes-list-in-objective-c
で見つけたのをそのまま使っただけですが・・・

`[MyClass properties]` で、MyClass のプロパティ一覧を NSDictionary で取得できます。
vim　自分用コマンド覚え書き


## 起動
| command | 説明 |
|:--|:--|
|$ vim|vimを開く
|$ vim -p file1 file2|起動時にタブで開く
|$ vimtutor|vimチュートリアルを開く

## モード選択
| command | 説明 |
|:--|:--|
|ESC|通常モード
|i|挿入モード
|v|ヴィジュアルモード（通常選択）

## 基本コマンド
| command | 説明 |
|:--|:--|
|:q|終了
|:q!|保存せずに終了 
|u|戻る（undo）
|ctrl+r|やり直し（redo）
|.|直前の操作を繰り返す
|=|インデントを揃える（１行）


## 保存、読み込み
| command | 説明 |
|:--|:--|
|:w|保存
|:w filename|名前を付けて保存
|:wq|保存して終了
|:e filename|ファイル読み込み


## 移動
| command | 説明 |
|:--|:--|
|hjkl|カーソル移動
|gg|先頭へ
|100gg|100行目へ
|G|末尾へ
|w|次の単語へ
|b|前の単語へ
|2w|2つ次の単語へ
|2b|2つ前の単語へ
|^|行頭へ
|$|行末へ
|%|対応する括弧へ


## 選択
| command | 説明 |
|:--|:--|
|v|ヴィジュアルモード（通常選択）
|V|ヴィジュアルモード（行選択）
|ctrl+v|ヴィジュアルモード（矩形選択）

>ヴィジュアルモード中のコマンド
>
|command|説明|
|:--|:--|
|I|挿入
|p|貼付け
|y|コピー（ヤンク）

>応用コマンド
>
|command|説明|
|:--|:--|
|gg V G|全選択


## コピー、カット、ペースト
| command | 説明 |
|:--|:--|
|yy|コピー（ヤンク）
|2yy|２行コピー
|x|切り取り（文字単位）
|dd|切り取り（行単位）
|2dd|2行切り取る
|p|貼付け


## 検索（ノーマルモード）
| command | 説明 |
|:--|:--|
|/word|wordを検索
|n|下方向に検索
|N|上方向に検索
|*|現在の単語を検索（下方向）
|#|現在の単語を検索（上方向）


## 置換
| command | 説明 |
|:--|:--|
|:s/i/I/g|カーソル行に存在する i を I に置換する
|:%s/i/I/g|ファイル内の i を I に置換する
|:%s/i/I/gc|ファイル内の i を I に置換する（確認あり）


## ウィンドウ操作
| command | 説明 |
|:--|:--|
|ctrl+w s|上下に分割する
|ctrl+w v|左右に分割する
|ctrl+w n|新しいウィンドウに新規ファイルを開く
|ctrl+w h|左のウィンドウへ
|ctrl+w j|下のウィンドウへ
|ctrl+w k|上のウィンドウへ
|ctrl+w l|右のウィンドウへ
|ctrl+w ctrl+w|次のウィンドウへ
|ctrl+w p|前のウィンドウへ
|ctrl+w +|ウィンドウを大きくする
|ctrl+w -|ウィンドウを小さくする


## タブ操作
| command | 説明 |
|:--|:--|
|:tabnew|新しいタブを開く
|:tabe filename|ファイルを新しいタブで開く
|:tabclose|タブを閉じる
|gt|次のタブへ

>応用コマンド
>
|command|説明|
|:--|:--|
|:tabdo %s/i/I/g|すべてのタブで i を I に置換


## テキストオブジェクト
アクション、範囲、区切りを組み合わせて使う

>
|||
|:--|:--|
|例）cit|タグ内のテキストを変更する

|command|説明|
|:--|:--|
|アクション
|c|変更
|d|削除
|y|ヤンク
|
|範囲
|i|区切り内
|a|すべて
|
|区切り
|t|tag
|"|"
|'|'
|]|]
|)|)


## 設定
|command|説明|
|:--|:--|
|:set number|行番号を表示
|:set nonumber|行番号を非表示
|:syntax on|コードの色分けをオンにする
|:set ignorecase|検索時に大文字小文字の区別をしない
|:set noignorecase|検索時に大文字小文字の区別をする
UbuntuでHaskellでmongoDB


[~ Haskellで￼￼JSON Web APIを作ると幸せになれるかもよ ~](http://blog.fujimuradaisuke.com/post/26887032662/haskell-de-json-web-api)を見て scotty + aeson + persistent 環境を作りたくなって勉強してます。なんとなくわかってきたのと、kobitoを使ってみようと思ったのでメモ。

###### 注) Haskell初心者で、H本読み終えたぐらいの知識しかありませんので、そのつもりで読んでいただけると助かります。

## 環境
* Ubuntu 12.10 on VMWare Fusion (Mac)

## インストールライブラリ
* haskell-platform
* [persistent (1.1.4)](http://hackage.haskell.org/package/persistent)
* [persistent-mongodb (1.1.5.1)](http://hackage.haskell.org/packages/archive/persistent-mongoDB/1.1.5.1/doc/html/Database-Persist-MongoDB.html)
* [persistent-template (1.1.2.1)](http://hackage.haskell.org/package/persistent-template-1.1.2.1)
* [aeson (0.6.1.0)](http://hackage.haskell.org/package/aeson-0.6.1.0) *今回は必要なし
* [scotty (0.4.6)](http://hackage.haskell.org/package/scotty) ※今回は必要なし

`import Database.Persist.TH`するのにpersistent-templateインストールしなきゃいけなく、だいぶ時間ロスりました。。。

## モデル定義

``` Haskell:Model.hs
{-# LANGUAGE QuasiQuotes, OverloadedStrings, TypeFamilies #-}
{-# LANGUAGE TemplateHaskell, FlexibleContexts, GADTs #-}

module Model where

import Database.Persist.MongoDB
import Database.Persist.TH
import Database.Persist.Quasi

mkPersist sqlSettings [persist|
User
    name String
    password String
    deriving Show 
|]
```

とりあえずUserの定義はこんな感じでいけました。

## データ生成 (insert)

``` Haskell:Main.hs
{-# LANGUAGE OverloadedStrings #-}

import Model
import Database.Persist.MongoDB
import Data.Time.Clock
import Network
import qualified Data.Text as T

main = withMongoDBConn dbname hostname port' Nothing time $ runMongoDBPoolDef $ do
    insert $ User { userName     = "hogehoge"
                  , userPassword = "hogepass" }
    return ()
    where
        dbname = T.pack "dbname" :: Database
        hostname = "ubuntu" :: HostName
        port' = PortNumber 27017 :: PortID
        time = 3600 :: NominalDiffTime

```
よくわからないのは`withMongoDBConn`と`runMongoDBPoolDef`でしょうか。
定義を見ると、

`withMongoDBConn :: (MonadIO m, Applicative m) => Database -> HostName -> PortID -> Maybe MongoAuth -> NominalDiffTime -> (ConnectionPool -> m b) -> m b`

`runMongoDBPoolDef :: (MonadIO m, MonadBaseControl IO m) => Action m a -> ConnectionPool -> m a`

となってます。`withMongoDBConn`の`ConnectionPool -> m b`のとこに`runMongoDBPoolDef`を差し込みました。(型合わせると動いてしまったって感じですが良いんでしょうかw)

## 参考
* [Persistent - Yesod](http://www.yesodweb.com/book/persistent)
本家persistent解説 - 英語苦手ってのとSQLiteの記述が主なので避けてましたが、結局ここ見ないとわからないですねw
CentOSにEPELリポジトリを追加する


CentOSのパッケージは枯れたものが多いので、外部リポジトリを追加することで新しいパッケージを利用できるようにします。
よく使うEPELリポジトリの追加方法を備忘録として記録します。

## yumプラグインのインストール
どのリポジトリを優先的に利用するか設定するためのパッケージをインストールします。

```bash:Bash
$ sudo yum -y install yum-priorities
```

## 優先度の設定
各リポジトリにpriorityを設定し、Baseリポジトリの優先度を上げます。
数値が小さいほど優先的が高く、優先的に利用されます。

```bash:Bash
$ sudo vim /etc/yum.repos.d/CentOS-Base.repo
```

```conf:CentOS-Base.repo
[base]
…
priority=1

[updates]
…
priority=2

[extra]
…
priority=2

[centosplus]
…
priority=2

[contrib]
…
priotiry=2
```

## リポジトリの追加
EPELリポジトリを追加します。ここでは64bit版CentOS 6の場合を想定します。

32bit版CentOS 6の場合は
http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/i386/
64bit版CentOS 6の場合は
http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/
32bit版CentOS 5の場合は
http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/5/i386/
64bit版CentOS 5の場合は
http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/5/x86_64/
で、ページ内を`epel-release`で検索し、最新のバージョンを確認することをおすすめします。

```bash:Bash
$ wget http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ rpm -ivh epel-release-6-8.noarch.rpm
```

## 追加したリポジトリの設定
追加したリポジトリを常時利用するかどうか、どの優先度で利用するかを設定します。

```bash:Bash
$ sudo vim /etc/yum.repos.d/epel.repo
```

```conf:epel.repo
[epel]
…
# 常時利用、基本リポジトリと同様に利用
enabled=1
priority=1

# 常時利用、基本リポジトリになければ利用
enabled=1
priority=2

# 一時利用
enabled=0
```

一時利用の設定にした場合は、以下のコマンドで一時的に有効にしてインストールします。
オプションが必要になりますが、基本リポジトリのパッケージか追加リポジトリのパッケージかが明確にわかります。

```bash:Bash
$ sudo yum install <package-name> --enablerepo=epel
```

## 参考
- [CentOS 外部レポジトリの追加(EPEL)](http://www.tooyama.org/yum-addrepo-epel.html)
- [CentOS に EPEL リポジトリを追加する - xykの日記](http://d.hatena.ne.jp/xyk/20120711/1341993199)
Herokuでomniauth-facebookを使う時の注意

Herokuでomniauth-facebookを使用したときに、ハマったところがあったので、メモ。

問題はローカル環境では、Facebookアカウントでログインできるのに、Herokuでは、`We're sorry, but something went wrong.`が表示させるというものでした。

原因はデータベースの違いで、ローカル環境ではSQLiteをHerokuではPostgreSQLを使用していました。

omniauth-facebookを使うときに必要なUsersテーブルのカラムの一つのuidを

```
add_column :users, :uid, :integer

```

のように設定してました。

ローカル環境のSQLiteでは、これでいけましたが、

HerokuのPostgreSQLでは、

```
ActiveRecord::StatementInvalid (PGError: ERROR:  integer out of range ) 
```

とエラーが出ました。

そこで、

```
add_column :users, :uid, :integer, :limit => 8

```

とすることで解決しました。

参考

[How do we define large integers? [duplicate]](http://stackoverflow.com/questions/6352471/how-do-we-define-large-integers#comment7435694_6352471)