OmniAICreator/Qiita-1.07M huggingface dataset:
ゲーム制作計画5日目！

#たいへんなことを思い出しました。
よく考えたらUnityはウェブブラウザ用の出力はできるけれども、
ブラウザのほうにプレイヤーを入れないといけませんでした。
これはよくない(;^ω^)
ということで、今日一日回避手段を探してダメならバッサリ諦めようと思います。
ちなみにリアルタイムで探しながらこの文章を書いています。
せっかくコメントももらったのにだめだったら残念。

#現在選択しうる回避手段
##その1 FrostHTML5 GDKというのを使わせてもらう
-以下のページから発見された手法です。
-FROST.IO http://www.frost.io/fwt
-[Unity][Unity3d]UnityのプロジェクトからHTML5環境向けアプリをエクポートするSDK「Frost Discovery SDK for Unity 3D」　http://d.hatena.ne.jp/nakamura001/20130401/1364839758
-これらのページをとりあえず一通り読んでみたのですが、
-紹介のみで具体的なやり方が見つかりませんでした。。。
-のでとりあえずダウンロードしてみたのですが、
-そちらにもReadMe的なものは見つかりませんでした。
-見落としてるだけかもなのですが…
-
-そしてもう一つ問題がありまして、現時点でサンプルが動かない…
-
-翻訳ソフトと低い英語力を駆使して読む限りだと、サーバーも使用するようです。
-サーバーはvps借りただけでほぼ知識がないので、
-難易度高そう&サンプルが動かないので将来の展望低め
-ということでこの方法は諦めようと思います。
-
##その2 J3Dというのを使わせてもらう
-こちらのページより
-Unity exporter tutorial (https://github.com/drojdjou/J3D/wiki/Unity-exporter-tutorial)
-
-こちらの方法では、プロジェクトを.jsonに保存してあげることで、
-プレイヤーを使用せずに動作させることができる？みたいです。
-こちらの方法については、丁寧な説明が書いてあったのですが、
-途中で説明と一致しないところが出てしまい、こぼれ落ちました。
-2年前の更新なのでUnityのバージョンあげたのが問題かも。。。
-サンプルについては動くものと動かないものがありました。
-肝心のチュートリアルに使用されていたものは動かないのですが…
-サンプルのうちの動くいくつかのものは、
-もういやいやになって寝ようと思った直後に見つけたものです。
-ので、予定を変更して明日もう少し調べてみようと思います。
-
-だめそうであれば、今日授業中に別のゲームを妄想していたのでそちらに方針転換しようと思います。
-サンプルすら動かないと、調べながらやってみるにしてもやはりモチベーションの維持が難しいですねー＞＜
-なにはともあれ急がねば

なんだか投稿に失敗して文章のほとんどが消えてしまい、
編集履歴から無理やり引っ張り出してきたらいろいろ変になってしまいました。
お許しを…。
array_unique_callback 的な何か

# `array_unique`

http://us2.php.net/manual/ja/function.array-unique.php

配列を渡すだけで重複している要素を削除してくれるとっても便利な関数です。しかし、値が文字列にキャスト可能な1次元の配列にしか適用できないという制約があります。これをカスタムするための関数を作ってみましょう。

# `array_unique_callback`

`array_filter` を **static変数** と絡めて使用するのがネックです。

```php
function array_unique_callback(array $array, callable $callback, $strict = false) {
    return array_filter(
        $array,
        function ($item) use ($callback, $strict) {
            static $h = array();
            $r = !in_array($n = $callback($item), $h, $strict) and $h[] = $n;
            return $r;
        }
    );
}
```

- PHPにありそうな感じの名前にしました。
- PHP5.3では **callable** タイプヒンティングを外してください。
- `isset` を用いて $O(1)$ の探索時間を実現しても良かったのですが、今回はスカラー値以外も比較に使用できるように `in_array` を使う実装にしました。

下に使用例を示します。

```php:PHPコード
<?php

$companies = array(
    0 => array(
        'name' => 'やずや',
        'phone' => '0120-828-828',
        'category' => 'サプリメント',
    ),
    1 => array(
        'name' => 'DHC',
        'phone' => '0120-575-3709',
        'category' => 'サプリメント',
    ),
    2 => array(
        'name' => 'KIRIN',
        'phone' => '0120-111-560',
        'category' => 'お酒',
    ),
);
 
$companies = array_unique_callback(
    $companies,
    function ($company) {
        return $company['category'];
    }
);
 
print_r($companies);
```

```text:実行結果
Array
(
    [0] => Array
        (
            [name] => やずや
            [phone] => 0120-828-828
            [category] => サプリメント
        )

    [2] => Array
        (
            [name] => KIRIN
            [phone] => 0120-111-560
            [category] => お酒
        )

)
```

# 作ってみたものの・・・

ぶっちゃけこれぐらい関数化しなくても普通にシンプルに書けるからいらないかも・・・ｗ
連想配列のキーに格納する方法だと、代入式

```php
$h[$c['category']] = true
```

が必ず **TRUE** と評価されるのでここまで短く書ける。

```php
$companies = array_filter(
    $companies,
    function ($c) {
        static $h;
        return !isset($h[$c['category']]) and $h[$c['category']] = true;
    }
);
```
MySQLメモ：ドットインストールの復習

###### ドットインストール：http://dotinstall.com/lessons/basic_mysql_v2 ######

#### 起動 ####
```mysql
mysql -u root -pパスワードがある場合
```

#### パスワード設定 ####
```mysql
set password for root@localhost=password('設定したいパスワード');
```

rootはいいが、@localhostを付ける意味がよく分からない・・・
ターミナル画面で出る[root@localhost]と関連性があるのだろうか？

#### データベース作成 ####
```mysql
create database データベース名;
```
rootユーザーにしか作れない？
#### 確認 ####
```mysql
show databases;
```
#### データベースに移動 ####
```mysql
use データベース名;
```


#### 削除 ####
```mysql
drop database データベース名;
```

#### ユーザーの追加 ####
```mysql
grant all on データベース名.* to ユーザー名@localhost identified by '設定したいパスワード';
```

#### テーブルの作成 ####
```mysql
create table users (
  フィールド名 型,
  intdata int,
  vchdata varchar(数値),
  chdata char(数値)
);
```
varcharとcharの違いが謎だったのでググりました。
###### 参考：http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1113850201 ######
simplenote.elの設定でsimplenote-emailとsimplenote-passwordをべた書きせずに済むようにする

[simplenote.el](https://github.com/cefstat/simplenote.el)を使うようになりました。

[simplenote.elのREADME](https://github.com/cefstat/simplenote.el/blob/master/README.markdown)によるとsimplenote-emailとsimplenote-passwordを生で指定するように書かれているのですが、[Githubに自分の.emacs.dをうっかり公開している](https://github.com/h12o/.emacs.d)人がそのままREADMEの通りにしてしまうと自分のSimplenoteがすべて見られてしまいます（苦笑）。

そこで、Emacsのnetrcライブラリを使い、Simplenoteのsimplenote-emailとsimplenote-passwordをなんとか隠蔽してみました。netrcライブラリがない場合は何もしません（といってもnetrcライブラリはEmacs19で取り込まれたようなのでいまどきの環境で「ない場合」はそうそうないでしょうけれど）。

```el:~/.emacs.d/user-start.d/simplenote.el
;;; -*- mode: emacs-lisp; coding: utf-8-emacs; -*-

(if (locate-library "simplenote")
    (progn
      (require 'simplenote)
      (if (locate-library "netrc")
          (progn
            (require 'netrc)
            (let* ((credentials (netrc-credentials "app.simplenote.com"))
                   (login (nth 0 credentials))
                   (password (nth 1 credentials)))
              (setq simplenote-email login)
              (setq simplenote-password password))
            (simplenote-setup)
            (setq simplenote-notes-mode 'markdown-mode)))))
```

なお、Emacsのnetrcライブラリはデフォルトで~/.authinfoを使うようになっていますので、必要であれば`netrc-file`を~/.netrcに設定しなおします。

また、~/.authinfo・~/.netrcは1行1エントリで書かないと、Emacsのnetrcライブラリはきちんと認識できないようですので、気をつける必要があります（余談ですが、Pythonのnetrcモジュールはmachineエントリが複数行にまたがっていてもきちんと認識します）。

```~/.authinfo
machine app.simplenote.com login h12o@example.com password Th!s1sMyPassw0rd
```
Rでdensity mapをプロットしたい


もう何度挫折したか分かりませんが、懲りずにRに再挑戦。

こういう関数があって、

```R
# 二次元正規分布の密度関数
multivariate_normal_distribution_2 <- function(x, mu, Sigma) {
  return ((1/2/pi) / sqrt(det(Sigma)) * exp(-1/2 * t(x - mu) %*% solve(Sigma) %*% (x - mu)))
}

# パラメータ
alpha <- 2.0
mu <- c(0,0)
Sigma <- rbind(
  c(alpha, 0),
  c(0, alpha)
)
```

density mapをプロットしたい。

定義域を決めて、

```R
M <- 100
w0 <- seq(-1,1,length=M)
w1 <- seq(-1,1,length=M)
```

この範囲で値を求めておいて、

```
density <- matrix(1:(M*M), nrow=M)
for (i in 1:M) {
  for (j in 1:M) {
    density[j,i] <- multivariate_normal_distribution_2( c(w0[i], w1[j]), mu, Sigma )    
  }
}
```

filled.contourを使えば良いらしい。

```
filled.contour(w0, w1, density)
```

![kobito.1385725081.921758.png](https://qiita-image-store.s3.amazonaws.com/0/5978/be076ea0-77b2-da63-40dc-f6def6de09b3.png "kobito.1385725081.921758.png")


## ベクトル化

二重for文を書くなんてRっぽくないと思ったら、outerというのがあった。2つのベクトルの交点で任意の関数を評価する外積を作れる。

ただし、マニュアルを見ると、

> X and Y must be suitable arguments for FUN. Each will be extended by rep to length the products of the lengths of X and Y before FUN is called.
>
> FUN is called with these two extended vectors as arguments. Therefore, it must be a vectorized function (or the name of one), expecting at least two arguments.

XとYはそれぞれのデータ点座標に対応するベクトルとして渡されるので、関数をベクトル化しないといけないよ、と書いてある。

```R
multivariate_normal_distribution_2_vector <- function(x, y, mu, Sigma) {
  xx <- cbind(x,y) - matrix( rep(mu, times=length(x)), ncol=2 )
  return (
    (1/2/pi) / sqrt(det(Sigma)) *
      exp(-1/2 * rowSums((xx %*% solve(Sigma)) * xx))
  )
}

density <- outer(w0, w1, multivariate_normal_distribution_2_vector, mu, Sigma)
```

これで二重forループが無くなった。が、ベクトル化すると元の数式が想像できなくなるほど違った式になってしまうのが辛い。

調べたところ、これをやってくれるdmvnormという関数があるらしい。

```R
library(mvtnorm)

density <- outer(w0, w1, function(x, y) dmvnorm(cbind(x,y), mean=mu, sigma=Sigma))
```

outerには無名関数を渡すこともできるので、これでだいぶコードが減った。

## filled.contourではなくggplotを使う

ググって最初に出てきたのがfilled.contourを使う方法だったので上のようにしたが、ggplotを勉強中なのでggplotでもできないか調べた。

geom_tileというのを使えばいいらしい。ggplotを使うにはmatrixではなくdata.frameにしないといけないので、outerの代わりにexpand.gridを使うことにした。

```R
grid <- expand.grid(w0=w0, w1=w1)
grid$density <- dmvnorm(grid, mean=mu, sigma=Sigma)
p3 <- ggplot(grid, aes(x=w0, y=w1, fill=density)) + geom_tile()
print(p3)
```

![kobito.1385724488.011567.png](https://qiita-image-store.s3.amazonaws.com/0/5978/f1100aa6-d923-6a57-eae8-6357b0697804.png "kobito.1385724488.011567.png")

## 参考サイト

 * http://entertainment-lab.blogspot.jp/2011/05/router3plot.html
 * http://blog.livedoor.jp/green_idea/archives/1477686.html
 * http://cse.niaes.affrc.go.jp/minaka/R/R-binormal.html
 * http://siguniang.wordpress.com/2011/04/17/mandelbrot-set-in-r/

## （追記）imageを使う

imageという関数を使うこともできるらしい。

```
density <- outer(w0, w1, function(x, y) dmvnorm(cbind(x,y), mean=mu, sigma=Sigma))

image(w0, w1, density)
```

![kobito.1385757148.889115.png](https://qiita-image-store.s3.amazonaws.com/0/5978/89f3a167-526f-af36-8e60-bb742b6d5e84.png "kobito.1385757148.889115.png")

まさにPRMLの同じ箇所を演習してる人の記事がQiitaのサイドバーに出てきて知った。Qiitaすばらしい。

 * http://qiita.com/data9824/items/6ecf729f719ac799f194
vimで検索してから行削除する(globalコマンドを覚える)

いつも忘れたころに必要になるのでメモしておく。

## 通常通り検索をする。

```vim
/hoge
```

→ `hoge`がハイライトされる（削除される行をあらかじめ確認）

### 検索に一致した行を削除する

```vim
:g//d
```

→ `hoge`を含む行が削除される

### もちろん1行で書けるが

```vim
:g/hoge/d
```
→ いきなり削除されるので確認できない

### 確認するなら置換コマンドでも良いが

```vim
:%s/.*hoge.*\n//c
```
→ やはり、やや入力が手間


# グローバルコマンド

調べたら組み合わせによりもっといろいろできる。

### ヤンクする場合

```vim
qqq:g//y Q
```

→ `q`レジスタにヤンクした結果が格納される

* `:g//y`だけだと最後にヒットした行しか`"0`に格納されない
* 末尾`Q`をつけると大文字レジスタなので`"q`に追記されていく
* `qqq`であらかじめ`"q`レジスタの内容を消去している（空のマクロを書き込んでいる）

### ファイル末尾に移動する場合

```vim
:g//m$
```

→ ヒットした行がファイル末尾に移動する

* `$`の部分を`0`にすると先頭に移動する
* `$`の部分を`+3`とかにすると各行を3行下に移動する
* `m`を`co`や`t`にすると移動ではなくコピーになる

### ヒットする行の前後を確認する場合

```vim
:g//z#.5|echo '----'
```

→ ヒット行を中心に前後2行ずつ、`----`区切りで表示される

* `|echo '----'`はなくても良いがつけた方が見やすい

### 結合する場合

```vim
:g//,/<C-r>//j 
```

→ ヒットした2つの行を1行に結合する

* `<C-r>/`は最後の検索パターン(この場合はhoge)を挿入している
* `j`で与えられた範囲`,/<C-r>//`、つまり`,/hoge/`を結合(join)している
* `,/hoge/`は「現在行からhogeを含む直近の行」の範囲を示している
* ちなみにhogeを含む行が奇数だと怒られる（最後の行が不正な範囲を示すため）


### もはやなんでもできる気がしてくる

```vim
:g//norm!yyp
```

→ ヒット行の直後に複製する（ヤンクしてペースト）

* `norm`でノーマルモードのコマンドを実行できる
* `yyp`を`@q`とかにすればマクロも実行できる

## 参考

Power of g
http://vim.wikia.com/wiki/Power_of_g
Wicket-Stuff Annotation の使い方

Wicketでは、CleanURLのマウント設定をWebApplicationのサブクラスに書くのだけど、Wicket-Stuff Annotationを使うと、各WebPageにAnnotationで定義できるようになって素敵。ただし要Spring。

```xml:pom.xml

  <dependency>
    <groupId>org.wicketstuff</groupId>
    <artifactId>wicketstuff-annotation</artifactId>
    <version>6.12.0</version>
    <!-- 6.12.0だとspring-core, spring-asmの 3.0.6.RELEASE が入るので、
      既存のSpringのバージョンと異なる場合はexclusionsなどで調整 -->
  </dependency>

```

```java:WicketApplication.java
public class WicketApplication extends WebApplication {

  /*中略*/

  @Override
  public void init() {
    super.init();
    // com.example.page パッケージ以下のクラスのAnnotationでマウントパスを設定
    new AnnotatedMountScanner().scanPackage("com.example.page").mount(this);
  }

}
```

```java:FooPage.java
package com.example.page;

import org.apache.wicket.markup.html.WebPage;
import org.wicketstuff.annotation.mount.MountPath;

// このページを /path/to にマウント.
@MountPath("/path/to")
public class FooPage extends WebPage {
  /* 中略 */
}
```
パラメータ付きの時は、@MountPath("/path/to/param1/") の様に指定する。
また複数のパスを指定したいときは、valueとaltに分ける。実例としては以下の様な感じ。
> **注意**
> [Wiki](https://github.com/wicketstuff/core/wiki/Annotation) には@MountMixedParamが使えるように書いてあるけど、現在は消滅している。Wicket 1.5のMountedMapperの仕様変更時に変わったのかなー。

```java:TestPage.java
package com.example.page;

import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.wicketstuff.annotation.mount.MountPath;

@MountPath(value="/test", alt={"/test/${param1}", "/test/${param1}/${param2}"})
public class TestPage extends WebPage {

  public TestPage(PageParameters params) {
    this.add(new Label("param1", params.get("param1").toString("unKnown.")));
    this.add(new Label("param2", params.get("param2").toString("unKnown.")));
  }

}
```

```html:TestPage.html
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org">
<head>
<meta charset="utf-8" />
</head>
<body>
	<p>param1 : <span wicket:id="param1"></span></p>
	<p>param2 : <span wicket:id="param2"></span></p>
</body>
</html>
```

なお従来通り、WebApplicationのサブクラスで設定されたCryptoMapperなどとの共存も可能。
2つのsliceがすべて同じ要素をもっているかどうかを比較するショートカット


Goでは同じサイズの配列同士の比較には`==`演算子が使えるが、サイズが違う配列やslice同士の比較には`==`が使えない。

手っ取り早く比較したいときは`reflect.DeepEqual`をつかうとタイプ数が少なくて便利。


```
package main

import (
        "fmt"
        "reflect"
)

func main() {
        a := []byte{1, 2, 3}
        b := []byte{1, 2, 3, 4}
        c := [3]byte{1, 2, 3}

        // これはコンパイルエラー
        // fmt.Println(a == b)
        // fmt.Println(a == c)

        // reflect.DeepEqual をつかうと何でも比較できる
        fmt.Println(reflect.DeepEqual(a, b))      // => false
        fmt.Println(reflect.DeepEqual(a, b[0:3])) // => true
        fmt.Println(reflect.DeepEqual(a, c))      // => false
        fmt.Println(reflect.DeepEqual(a, c[:]))   // => true
}
```

http://golang.org/pkg/reflect/#DeepEqual


`gomega`のmatcherが使ってたのを見て知った。
PythonでCSVの読み書き

PythonによるCSVファイルの読み書きメモ．
[**3. pandasによる方法**](http://qiita.com/okadate/items/c36f4eb9506b358fb608#3-pandas%E3%82%92%E4%BD%BF%E3%81%86%E5%A0%B4%E5%90%88%E3%81%8A%E3%81%99%E3%81%99%E3%82%81) がおすすめです．

- Change log

```
2014/07/28  読み込み（Pandas）の追加．
2014/11/28  pandasを使う場合をまとめ．
```

## **1. 読み込み**

[Python documentation](http://docs.python.jp/2/library/csv.html) を参考に`with`文を使う．

```py
import csv

with open('some.csv', 'r') as f:
    reader = csv.reader(f)
    header = next(reader)  # ヘッダーを読み飛ばしたい時

    for row in reader:
        print row          # 1行づつ取得できる
```

`with`文を使わなくても，以下のように読み込める．

```py
import csv

f = open('some.csv', 'r')

reader = csv.reader(f)
header = next(reader)
for row in reader:
    print row

f.close()
```

この場合は`close`文をつける．

## **2. 書き込み**

書き込みでも`with`文を使う．

```python
import csv

with open('some.csv', 'w') as f:
    writer = csv.writer(f, lineterminator='\n') # 改行コード（\n）を指定しておく
    writer.writerow(list)     # list（1次元配列）の場合
    writer.writerows(array2d) # 2次元配列も書き込める
```

読み込みと同様に`with`なしでもOK．

```python
import csv

f = open('some.csv', 'w')

writer = csv.writer(f, lineterminator='\n')
writer.writerow(list)
writer.writerows(array2d)

f.close()
```

## **3. pandasを使う方法**（おすすめ）

pandasで読み込むとすっきりするし，便利な場合も多い．

```py
import pandas as pd

df = pd.read_csv('some.csv')

print df       # show all column
print df['A']  # show 'A' column
```

読み込んだDataFrameは書き込みも簡単．

```py
df.to_csv('some2.csv')
```

使い方は [**pandasでよく使う文法まとめ**@okadate - Qiita](http://qiita.com/okadate/items/7b9620a5e64b4e906c42) などを参考に．
Generic なメソッドを override できないときの回避方法


まぁ、そもそもンなことすんな！って話なのかもですが、必要に駆られたので調査した。

## NG例 其の壱

```csharp:NG_01.cs
class Hoge {
	public virtual void Test<T>() where T : AnyClass {
		// 何か処理
	}
}

class Fuga : Hoge {
	public override void Test<T>() where T : AnyClass {
		// 何か処理
	}
}
```

親に `virtual` 付けて、子に `override` 付ければ行けるだろ！とか思ってたら…

> \`Fuga.Test\<T>()': cannot override inherited member \`Hoge.Test\<T>()' because it is not marked virtual, abstract or override


激おこぷんぷん丸です。

端的に言うと、「ジェネリック制約付けてるメソッドは override でき NE-YO！」ってコトらしいです。

## NG例 其の弐

```csharp:NG_02.cs
class Hoge {
	public void Test<T>() where T : AnyClass {
		// 何か処理
	}
}

class Fuga : Hoge {
	public void Test<T>() where T : SomeClass {
		// 何か処理
	}
}
```
じゃあ T の制約変えて override 外したら行けるだろ！！とか思ってたら…

> The constraints for type parameter \`T' of method \`Fuga.Test\<T>()' must match the constraints for type parameter \`T' of interface method \`Hoge.Test\<T>()'. Consider using an explicit interface implementation instead

ムカ着火ファイヤーでした。

## NG例 其の参

```csharp:NG_03.cs
class Hoge {
	public void Test<T>() where T : AnyClass {
		// 何か処理
	}
}

class Fuga : Hoge {
	public new void Test<T>() where T : SomeClass {
		// 何か処理
	}
}
```

そーいえば、 `new` とかあったなぁとか思ってやってみると…

> The constraints for type parameter \`T' of method \`Fuga.Test\<T>()' must match the constraints for type parameter \`T' of interface method \`Hoge.Test\<T>()'. Consider using an explicit interface implementation instead

カム着火インフェルノォォォォオオウ！！！

## OK例

ってコトで、こうします。

```csharp:OK.cs
class Hoge {
	public void Test<T>() where T : AnyClass {
		// 何か処理
	}
}

class Fuga : Hoge {
	public new void Test<T>() where T : AnyClass {
		// 何か処理
	}
}
```

詳しく MSDN 読んだわけじゃないんだけど、どうやら **`where` による型制約を設けていて、継承先クラスで引数が一緒のメソッドを定義する** 場合は、 **戻り値や制約の型が完全に同一じゃなきゃダメ** で、 `new` を付けねばならんらしい。

なるほど、勉強になった。
sshfsで他のサーバをマウントする

## sshfsのインストール
CentOSを想定(実際に試したのはCentOS6.3)

1. yum-prioritiesプラグイン導入
> $ sudo yum -y install yum-plugin-priorities
> $ sudo vi /etc/yum.repos.d/CentOS-Base.repo
>
> \# base,updates,extrasディレクディブで priority=1

1. RPMforgeリポジトリ導入
>$ wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.i686.rpm
$ sudo rpm -ivh rpmforge-release-0.5.2-2.el6.rf.i686.rpm
$ sudo yum -y update rpmforge-release

1. sshfsインストール
> $ sudo yum install fuse-sshfs --enablerepo=extras
$ sudo modprobe fuse

## マウントする
* 詳しくはヘルプを

> $ sshfs [user@]host:[dir] mountpoint [options]

 * 例： $ sshfs hoge@example.com:/tmp/hogehoge /hogehoge

## 他のユーザと共有する
http://stuons.blogspot.jp/2010/04/sshfs.html

 * ディフォルトでは、他のユーザがマウントしたディレクトリはアクセスできないのでオプションを用いる
  * -o allow_root : rootのアクセスを許可する
  * -o allow_other : (rootを含む)他のユーザのアクセスを許可する
savon ver1 と ver2 のmethodの違い

>#290 SOAP with Savon - RailsCasts
>http://railscasts.com/episodes/290-soap-with-savon

の解説がsavonのver1でバージョンが古かったので新しいバージョンならどうするかのメモ。

ver1 `client = Savon::Client.new("http://www.webservicex.net/uszip.asmx?WSDL")`
ver2 `client = Savon::Client.new(wsdl: "http://www.webservicex.net/uszip.asmx?WSDL")`

ver1 `client.wsdl.soap_actions`
ver2 `client.operations`

ver1 `client.request :web, :get_info_by_zip, body: { us_zip: "90210" }`
ver2 `client.call(:get_info_by_zip, message: { "USZip" => "90210" })`

"USZip" の所を ”USZIP”にしててしばらくハマったので大文字小文字に気をつけましょう。

## 参考
Savon (Heavy metal SOAP client) - Version 2: Client
http://savonrb.com/version2/client.html
Capybara使うときに横に置いておくと有用なリンク集


* 公式サイト
https://github.com/jnicklas/capybara


* 日本語翻訳版
https://github.com/willnet/capybara-readme-ja


* matcherを調べるときに見ると良い
http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Matchers#has_selector%3F-instance_method


* よく使いそうなリファレンス一覧
http://qiita.com/ToruFukui/items/130eeb61d8ab2883466e


* xpathでの指定もできるのでxpathのリファレンス？的な
http://itref.fc2web.com/xml/xpath.html


* こう書くのがいいよ！の例
http://robots.thoughtbot.com/better-acceptance-tests-with-page-objects

* これいいかも！（まだ試せてない、、）
https://github.com/natritmeyer/site_prism 

　
他にあればぜひ教えて下さい！！m(_ _)m
GitHubにある自身のすべてのリポジトリの設定ページを開くのようなこと

[GitHubの自分のリポジトリ一覧](https://github.com/sasaplus1?tab=repositories)を見ていて、全部のリポジトリの設定ページを開きたくなったときにやったこと。

1. `Option + ⌘ + I`でとりあえずDOMを見る
1. `.repolist-name`とればいいっぽい
1. `Option + ⌘ + J`でとりあえずコンソールを開く

```js:GoogleChrome-DevTools-Console
Array.prototype.slice.call(document.querySelectorAll('.repolist-name a')).forEach(function(elm){console.log(elm.href + '/settings');});
```

ちゃんと出力された。

---

1. 出力された文字列をいい感じに選択してクリップボードにコピーする
1. とりあえずVimに貼付ける

```bash:Vim-Scratch
https://github.com/sasaplus1/sasaplus1.github.io/settings VM479:2
https://github.com/sasaplus1/stylesheetselector.js/settings VM479:2
https://github.com/sasaplus1/dotfiles/settings VM479:2
https://github.com/sasaplus1/ltsv-web/settings VM479:2
https://github.com/sasaplus1/slide-first-time-node.js/settings VM479:2
https://github.com/sasaplus1/http-router/settings VM479:2
https://github.com/sasaplus1/ltsv.js/settings VM479:2
https://github.com/sasaplus1/base62.js/settings VM479:2
https://github.com/sasaplus1/rumia/settings VM479:2
https://github.com/sasaplus1/pfmclock/settings VM479:2
https://github.com/sasaplus1/mktemp/settings VM479:2
https://github.com/sasaplus1/pfmloop/settings VM479:2
https://github.com/sasaplus1/generator-prototyping/settings VM479:2
https://github.com/sasaplus1/generator-flowtime/settings VM479:2
https://github.com/sasaplus1/dtree/settings VM479:2
https://github.com/sasaplus1/ltsview/settings VM479:2
https://github.com/sasaplus1/deepcopy.js/settings VM479:2
https://github.com/sasaplus1/split-stream/settings VM479:2
```

---

いい感じにカーソルを移動しつつ、以下のようなことをする。

- `"+P`
- `:%S/ .+$//`
  - eregex.vim使用
- `gg^vGI` + "open "
- `ggO` + "#!/bin/bash"

```bash:Vim-Scratch
#!/bin/bash

open https://github.com/sasaplus1/sasaplus1.github.io/settings
open https://github.com/sasaplus1/stylesheetselector.js/settings
open https://github.com/sasaplus1/dotfiles/settings
open https://github.com/sasaplus1/ltsv-web/settings
open https://github.com/sasaplus1/slide-first-time-node.js/settings
open https://github.com/sasaplus1/http-router/settings
open https://github.com/sasaplus1/ltsv.js/settings
open https://github.com/sasaplus1/base62.js/settings
open https://github.com/sasaplus1/rumia/settings
open https://github.com/sasaplus1/pfmclock/settings
open https://github.com/sasaplus1/mktemp/settings
open https://github.com/sasaplus1/pfmloop/settings
open https://github.com/sasaplus1/generator-prototyping/settings
open https://github.com/sasaplus1/generator-flowtime/settings
open https://github.com/sasaplus1/dtree/settings
open https://github.com/sasaplus1/ltsview/settings
open https://github.com/sasaplus1/deepcopy.js/settings
open https://github.com/sasaplus1/split-stream/settings
```

- `\r`
  - vim-quickrun使用

---

Google Chromeにずばばばーっとタブが表示されました。WikiとかIssueのon/offしたかっただけです。
2013年度版 5分で始めるWebアプリケーション(Google Apps Script)

今年も始まりました。
Google Apps Script Advent Calendar 2013 の一日目です。

去年書いた「[5分で始めるGoogle Apps Script](http://qiita.com/soundTricker/items/cb12c14a937f67632c68)」がなんだかんだでよくストックされるので、
今年も同じような釣りネタでGoogle Apps ScriptのAdvent Calendarを書いていこうと思います。


>なお、本当にプログラミング初心者の方や、Google Apps Scriptとはなんぞやという方は、
去年書いた、「[5分で始めるGoogle Apps Script](http://qiita.com/soundTricker/items/cb12c14a937f67632c68)」を一読してからこちらの記事をやってみてください。

# 今年のネタ

今年は
___5分で始めるWebアプリケーション___
をGoogle Apps Scriptで作ってみたいと思います。

ではスタート

## 0分目 準備

三分クッキングでも材料の用意の時間はクッキング内に含まれないのでここでも準備の時間は含みません。
用意するものは以下です。(去年と同じ

### 用意するもの
* Goolgeアカウント（GoogleAppsアカウントでも可能）
* ブラウザ（ChromeやFirefox等のモダンブラウザをお勧めします。）
* ネットワーク環境


## 1分目 開発環境の起動

Google Apps Scriptのプログラムを開発するための開発環境を起動します。
去年は3つあると書きましたが時間がないので、もう一つのやり方でやります。
以下にアクセスしてください。

https://script.google.com/intro

もし、`http://www.google.com/script/start`に遷移してしまった方は、
ページ内にある、「`Start Scripting`」ボタンをクリックしてください。
そうすればGASの開発環境が起動します。

※ちなみに感覚的にこの方法が最も早くScript Editorにアクセスできます。

## 2分目 コード書く

起動したGASのエディタに以下を記述します。時間がないのでコピペしてください。

```javascript:コード.gs
function doGet(e) {
  MailApp.sendEmail(Session.getEffectiveUser().getEmail(), "Hallo", "アプリにアクセスが有ったよ");
  
  return HtmlService.createHtmlOutput("メールを送りました");
}
```

![スクリーンショット 2013-12-01 23.04.36.png](https://qiita-image-store.s3.amazonaws.com/0/2965/0673fb05-9b8a-1a8a-626d-928f5e3038d1.png)


## 3分目 コードとプロジェクトの保存と、認可(メール送るための許可)

`Ctrl+S`でコードとプロジェクトを保存（プロジェクトの名前は任意)
保存後に`Ctrl+r`を押下して、一度アプリケーションを起動、なんか色々聞かれますが
全部Yesしていきます。

## 4分目 デプロイ

GASのエディタのメニューから「公開」→「Webアプリケーションとして導入」をクリック
「新しいバージョンを保存」ボタンをクリック後、「導入」ボタンをクリックしてください。

![Deploy.png](https://qiita-image-store.s3.amazonaws.com/0/2965/5820aec8-f6a1-068c-e132-2da319abe43f.png)


## 5分目 確認

上記で「導入」ボタンクリック後URLが表示されるので、そのURLへアクセス。

![スクリーンショット 2013-12-01 23.11.33.png](https://qiita-image-store.s3.amazonaws.com/0/2965/08c509f2-d972-2e96-fab9-282bfd5c89fc.png)

多分メールが送られてくるはずです。( ｰ`дｰ´)ｷﾘｯ

# どうでしたか？

今回は最も手順数を少なくGASのWebアプリケーションを作る方法を書いてみました。
GASの強力な部分の一つに、メールが簡単に送れるという点も、大事な特徴の一つです。
AndroidでDebugBuildしたアプリとGooglePlayにあるアプリで連携

証明書を一緒にし、かつユーザIDをShareした状態でのみ動作するアプリにおいて
他方はGoogplePlayに、他方はDebugBuildした状態だと、
証明書の問題で動作しない。

これを解消するには、DebugBuildする場合にも本番と同じ証明書をつけてAPKを生成する必要がある。

DebugBuildしたAPKに本番と同じ証明書をつけると、課金テストなども可能となる。

■以下手順

# 1.ストアパスワード変更（「android」へ変更）

```
keytool -storepasswd -keystore XX.keystore
```

# 2.エイリアスの変更（「androiddebugkey」へ変更）

```
keytool -changealias -alias YY -destalias androiddebugkey -keystore XX.keystore -storepass android
```
# 3.キーパスワードの変更（androidへ変更debug.keystoreへ変更）

```
keytool -keypasswd -alias androiddebugkey -keystore XX.keystore
```

intelliJのProjectstructure->Facets->CompilerのCustom debug keystoreに上記で生成しなおしたKeyファイルパスを指定し、ビルドすると変更された署名でデバッグモードでビルドされる

# 補足：IntelliJで署名付きAPKを生成
File->Build->Signed Generate APKでウィザードに従うとリリースビルドが実行される
MavericksでSpyderのエディタが非常に重いときの改善法

以前からSpyderでPythonコードを書いていたのですが，Ubuntu13.04からMavericksに移行した時にエディタが重すぎてカーソル移動にもストレスが溜まるという状況に陥ってしまいました。

いろいろ検索してみたところ，どうやらMavericksのAppNapが悪影響を及ぼしているとのこと。
[spyderlib issue1623](https://code.google.com/p/spyderlib/issues/detail?id=1623, 'spyderlib issue1623')

##解決法
Spyderのインストール方法によって解決法が違うようです。

###パッケージインストールした場合

AppNapを無効化します。

####「情報を見る」から無効化
![spyder.gif](https://qiita-image-store.s3.amazonaws.com/0/21852/1cfa0a23-5c18-6e40-3841-e9d0de7b966d.gif)

####ターミナルから無効化

```
cd /Application/Utilities
defaults write org.spyder-ide NSAppSleepDisabled -bool YES
```

###ソースコードからインストールした場合
まずappnopeというモジュールを取ってきます

```
pip install appnope
```

次に，spyderlib/start_app.pyを編集し，import文の最初に次の1行を追加します

```
import appnope
```

うちのSpyderはこれで軽くなってくれました。もし重くて困ってる人がいたら試してみる価値ありかも。
iTermでdeleteキーを入力する


OS X MavericksにしたらiTermやTerminal.appでdelキーを入力できなくなったような気がする

iTermなら以下の方法で回避できる

Preference > Keys > Global Shortcut Keys を開いて、
deleteキー用のActionに `Send Hex Codes: 4` を設定



http://www.daveperrett.com/articles/2008/10/24/iterm-delete-key-config/
クラス名から Prefab を類推して GameObject を Instantiate

Unity でクラス名から Resources 配下の Prefab を特定して `Instantiate` するというトリッキー？なコトしたかったので、書いてみた。

## 前提

```csharp:sample.cs
using UnityEngine;

namespace Hoge {
	public class Fuga : MonoBehavior {
		// 何か処理
	}
}
```

ってなクラスを *Assets/Resources/Prefabs/Hoge/Fuga.prefab* に Add Component してあるとする。

## Instantiate 処理

```csharp:instantiate.cs
using UnityEngine;
using System.Text.RegularExpressions;

class Instantiator {
	public static GameObject Instantiate<T>() where T : MonoBehavior {
		string path = Regex.Replace(typeof(T).FullName, "\\.", "/");
		return Resources.Load("Resources/Prefabs/" + path) as GameObject;
	}
}
```

ポイントは **`typeof(T)`** で `System.Type` を取得して、 **`.FullName`** で完全修飾名を拾うトコ。
んで、 `namespace` デリミタ (ピリオド) をディレクトリセパレータ (面倒なのでスラッシュベタ書きｗ) に変換して、 `Resources.Load()` したげる感じ。
<span style="color: #999999;">// 「いやいや、そんなの基本だろ」とか言わない。</span>

## 呼び出し

```csharp
GameObject go = Instantiator.Instantiate<Hoge.Fuga>();
```

って感じに呼び出してあげると、(ディレクトリ構造に気を付ければ) 楽に掛けるんじゃないかな。
独習C++メモ : 第1章


## ポリモーフィズム
共通のインターフェイスを持ちながらも、メッセージを受け取ったインスタンスがそのクラスによって違う振る舞いをすること。

## カプセル化
データとそれを操作する手続きを一体化して「オブジェクト」として定義し、オブジェクト内の細かい仕様や構造を外部から隠蔽する仕組み。

## 継承
既に定義されているクラスの性質を引き継いで、拡張や変更を加えた新しいクラスを定義すること。

## 関数や変数の記法について
関数はパスカルケース、変数はローワーキャメルケースまたはスネークケースがよさそう。

参考: http://qiita.com/yimajo/items/a3fac0026c07ec538fc2

## プロトタイプ宣言とは
要するに関数の前方宣言のことらしい。

参考: http://d.hatena.ne.jp/unageanu/20070825

## 出力演算子と入力演算子
出力演算子 `<<` を使ってコンソールに文字列を出力する。

    std::cout << "Hello, world!";

1つの式で複数の項目を出力することもできる。

    std::cout << "Hoge" << "Piyo";

入力演算子 `>>` を使うと標準入力から入力を受け取れる。

    int n;
    std::cin >> n;

1つの式で複数の項目を入力することもできる。

    int a, b, c;
    std::cin >> a >> b >> c;

## コメント
`/* */` の書き方のコメントはネストできない。  
これは例えば Objective-C なんかも同じで、いつも不便に思う。

## クラスの定義
    class MyObject {
        // 非公開関数と変数
        int num;

    public:
        // 公開関数と変数
        void setNum(int num);
        int getNum();
    };

クラス定義のブロックの最後にセミコロン `;` を忘れがちなので注意。

## 関数の定義
関数をクラスにリンクするために `::` という虫のようなものを付けて定義しなければならない。

    void MyObject::setNum(int num)
    {
        this->num = num;
    }

## 関数のオーバーロード
例えば、Cで絶対値を得るための関数というと `abs` `labs` `fabs` のように型ごとに名前の異なる関数が定義されているけど、こんなの人間が覚えられるわけないので、共通のインターフェイスを持たせておいて型ごとに別の関数を呼び出すようにすればいいのではないかという考え方。

    int myabs(int n);
    long myabs(long n);
    double myabs(double n);

オーバーロードをするためには**関数の引数の型や個数が異なっている必要がある**。  
なので戻り値だけが異なる関数のオーバーロードはできない。

## CとC++の違い
* Cでは引数を取らない関数は `f(void)` のように定義しなければならないが、C++では `f()` のように空のリストで引数がないことを表現できる
* C++には `bool` 型が定義されており、`true` と `false` を利用できる

## 疑問など
* クラス定義時における関数の定義を完全に非公開にはできないのか。例えば、ヘッダーファイルのクラス定義には公開関数だけを書いておいて、実装ファイルの方で非公開な関数を追加で定義するなど。
  * pimplイディオムを使うことで非公開にできるが、カッコ悪い
    * http://pokotsun.mydns.jp/?p=4054
    * http://tercel-tech.hatenablog.com/entry/2012/11/02/122344
メモリリークのデバッグ


##VCランタイムの機能を使ったメモリリークの調査

###メモリリーク時にCRTにダンプさせるようにする

```C
_CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
```

###プログラムをデバッガで実行し、ダンプを確認

```
Detected memory leaks!
Dumping objects ->
{52992} normal block at 0x000000001E27F290, 72 bytes long.
 Data: <                > 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
Object dump complete.
```

52992回目に確保した72バイトのメモリが漏れたようです。
もし毎回、52992回目に確保したメモリが漏れるようであればその回のメモリ確保時にデバッグブレイクさせることで漏れている犯人を突き止められます。

###指定した回のメモリ確保時にデバッグブレイクさせる

```C
_CrtSetBreakAlloc(52992);
```

##UMDHを使ったメモリリークの調査

UMDHとはMicrosoft Debugging Tools for Windowsに含まれているコマンドラインツールの名前です。OSと結託して動くので非常に強力です。

* [[HOWTO] UMDH を用いたメモリリーク調査技法](http://blogs.msdn.com/b/japan_platform_sdkwindows_sdk_support_team_blog/archive/2013/08/19/howto-umdh.aspx)
* [Umdhtools.exe: Umdh.exe を使用してメモリ リークを検索する方法](http://support.microsoft.com/kb/268343/ja)
シリアルクロスケーブルでhello world

シリアルクロスケーブルで２つのサーバーをケーブル接続。

```bash:受信側
# cat < /dev/ttyS0
```

送信側から送られてきたメッセージが表示される状態になる。

```bash:送信側
# echo "hello world" > /dev/ttyS0
```

受信側でメッセージが表示されることを確認。

備考
-------

USB-RS232C変換アダプターを使う場合、`/dev/ttyS0`ではなく`/dev/ttyUSB0`になります。
送信は何でも出来、/etc/fstabとか/var/log/messagesとかcatで送ることができます。
ある処理を逐次一定期間ごとに繰り返す

ある処理が終わったら、同じような処理をパラメータだけ変えてもう1回後（たとえば1秒後）にやりたいなという場合
setInterval()だと処理が終わったか終わってないかに関わらず一定期間経過で処理が走ってしまうので今回の要件としてはNG
Chrome拡張作ってて、ページングされてるHTMLをクロールしたい、けど田代砲もどきは作りたくない、という需要のもと、色々調べたんです

で、[Alarm API](http://developer.chrome.com/extensions/alarms.html)使えば？というツッコミもあると思うところだけど

「繰り返しの最低周期が分単位でしか指定できないじゃん、さすがに1ページ2分とかは無理がある」

という事実に気づいてガッカリ
逆に言えば、分単位でいいものはAlarm APIのほうがすっきりしてると思うのでお勧め

```js
var repeat = function(){
	console.log('repeatFunc() started.');
	/*
		実際の処理などに使う変数などの初期化
	*/
	var repeatProcess = function(){
		/*
			実際に処理を行う内容
			終了条件を満たさない場合（まだ続けるよって場合）は
			setTimeout(repeatProcess, 1000);
			などと次回の実行をセットする
		*/
	}
	//	初回の実行
	setTimeout(repeatProcess, 1000);
};
repeat();

```
repeat()に初期変数を渡してあげて、repeat()で参照してみたり、繰り返しの周期を初期変数に突っ込んだり、repeat()の第二引数にしてもいいかもしれない
OpenGL を使った動画のリアルタイム処理を記述する Video Shader Script

技術イベントの告知です。

OpenGL を使った動画のリアルタイム処理を記述するためのスクリプト言語 「Video Shader Script」とその実行環境「Video Shader」の開発が一段落したので、１２月８日に正式発表することにしました。発表イベントに関しては、下のリンクを参照してくださ。

http://coedo-dev.doorkeeper.jp/events/6971

どんな目的で作った言語かという話は、ブログに簡単な解説記事を書いたのでそちらを参照してください。

http://satoshi.blogs.com/life/2013/11/vsscript.html

ブログの記事でも書きましたが、「食べ物を美味しく見せるビデオ・フィルター」を Video Shader Script で記述すると以下のようになります。

```javascript:delicious.vsscript
{
    "title":"Delicious",
    "pipeline":[
        { "filter":"lighter", "attr":{ "ratio":1.1 } },
        { "filter":"enhancer", "attr":{ "red":[0.0, 0.9] } },
        { "filter":"saturate", "attr":{ "ratio":0.15 } },
        { "control":"fork" },
        { "filter":"gaussianblur", "attr":{ "radius":2.0 } },
        { "blender":"differentiate", "attr":{ "ratio":2.0 } },
    ]
}
```

実際の開発環境の配布は、１２月後半〜１月前半に iPhone アプリとして配布する予定です。
ruby-dmmを使ってDMMのAPIを用いてアイテム検索を簡単にしよう


登録を行うことでDMMのAPIを使うことができます。
https://affiliate.dmm.com/api/

Rubyには https://rubygems.org/gems/ruby-dmm というライブラリがあり、これを用いるとDMMのAPIを簡単に叩くことができます。

まずはrequireした後、クライアントのインスタンスを作りましょう。

```ruby
require 'ruby-dmm'
client = DMM.new(:api_id => [APIID], :affiliate_id => [アフィリエイトID], :result_only => true)
```

この後、一番シンプルなかたちとしては下記キーワードだけ指定すれば何らかの結果がでてきます。

```ruby
result = client.item_list('BiS')
```

とはいえ、普段使う上ではおそらく特定のサービスや種別に絞って検索をしたいことでしょう。

```ruby
result = client.item_list('BiS', site: 'DMM.com', service: 'digital', floor: 'idol')
```

- siteには、一般向けのDMM.com、表現の自由度の高いコンテンツのDMM.co.jpのいずれを対象にするかを指定します。
- serviceには、DMMのサービスごとに定められた名前を指定します。
 - 例えば、DMM.comの動画サービスの場合、https://affiliate.dmm.com/api/reference/com/digital/all/ のserviceにかかれているdigital指定します。
- floorには、DMMのサービスを細分化したフロアごとに定められた名前を指定します。
 - 例えば、DMM.comの動画サービスのアイドルフロアの場合、https://affiliate.dmm.com/api/reference/com/digital/all/ のfloorにかかれているidol指定します。

その他、様々なオプションがあるので、APIリファレンスを読みながら、ご所望のコンテンツに最短でたどり着く術を見出してみてください。
ChocolateyでCygwin（C:¥に）インストール・設定する


普通にインストールするとProgram Filesにインストールされてしまうので、それを変更する

#Cygwinのインストール

```C:¥> cinst cygwin -o -ia "-q -N -R C:\ -l C:\Cygwin\packages --packages wget, tar, gawk, xz, bzip2, gcc-core -s http://ftp.iij.ad.jp/pub/cygwin/"
```
-oでオプションを上書きすることを示す（OverrideArguments flag）
-iaでオプションを上書きするインストールオプションを指定する（InstallArguments）
シングルクオーテーションに囲まれた部分がCygwinに関連する部分で、例えば、
--packagesでパッケージも一緒に指定できる。

ちなみに ```%USERPROFILE%\AppData\Local\Temp\chocolatey\Cygwin```　にCygwinInstall.exeがインストールされるので、以下のように打ち込めばパッケージをインストールできます。(このやり方は通常せずに後述するapt-cygを使います。)

```
C:¥> %USERPROFILE%\AppData\Local\Temp\chocolatey\Cygwin\CygwinInstall.exe with -q -N -R C:\ -l C:\Cygwin\packages gcc-core
```

以上で C:¥ 直下にCygwinができました。例えば、Cygwin上の```/bin```はWindows上のC:¥binになります。


# Cygwinパッケージをコマンド上でインストールできるようにする

以下のようにapt-cygファイルを```/bin```に入れて、```chmod 755 /bin/apt-cyg```をする

```
$ wget https://raw.githubusercontent.com/transcode-open/apt-cyg/master/apt-cyg -P /bin
$ cd /bin
$ chmod 755 /bin/apt-cyg
```

その後は以下のように普通にCygwin上でapt-cygを利用する
```
$ apt-cyg install git
```

#Cygwin上でchocolateyを利用する設定

Cygwin上でChocolateyコマンドを利用したいが、   
1.$tempという環境変数がwindows形式のパスでCygwinでは利用できないし、必要ないので、Cygwin上では削除する
2.Cygwin上では、```$ cmd /c choco```と入力するのが面倒なので、aliasを設定する
なので以下のように.bashrcに記述します。

```.bashrc
if [[ "$OSTYPE" == "cygwin" ]];then
  unset tmp temp
  alias choco='cmd /c choco'
  alias cinst='cmd /c cinst'
  alias cup='cmd /c cup'
  alias cuninst='cmd /c cuninst'
fi
```
　
上記の設定後、管理者権限でcygwinを動かし、以下のようなことがcygwin上でできるようになります。

```
$ cinst jdk8
```

# コマンドプロンプト上でCygwinコマンドを動かす

以下に記述されていることをします。
http://news.mynavi.jp/articles/2013/11/25/zerokaracygwin/

* ```C:\bin\cygwin1.dll``` を ```C:\Windows\System32``` にコピーする
* windowsの環境変数PATHに次を通す ```C:\bin;C:\usr\bin;C:\usr\local\bin;```
* windowsの環境変数LD_LIBRARY_PATHを作成する```C:\lib;C:\lib\w32api;C:\usr\local\lib;```

（この記事の場合は、C:¥直下にCgywinをインストール指定しています。通常はC:¥cygwin¥binになります）

これでコマンドプロンプト上で```ls```などのコマンドも利用できます。
(```.exe```で提供されているコマンドだけです。apt-cygなどはシェルスクリプトなので利用できません)

# Cygwin上でコマンドを動かす

普通に```~/.bash_profile```にPATHを設定する。
例えば、```$ cinst jdk8```をしていたら、以下のように記述する

```.bash_profile
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
PATH=$HOME/.nodebrew/current/bin:$PATH
JAVA_HOME=/cygdrive/c/Program Files/Java/jdk1.8.0_25
export JAVA_HOME
export _JAVA_OPTIONS="-Dfile.encoding=UTF-8"
PATH=${JAVA_HOME}/bin:$PATH
```

#参考
https://github.com/chocolatey/chocolatey/wiki/CommandsInstall
はじめてのPython 素数に0, 1をくっつけて返すスクリプト


素数を返すスクリプトは世の中にたくさんありますが、
0と1が含まれていないのが、ネックでした。
そこで、素数の配列に、0と1を加えて返すスクリプトを作ってみました。

```py:Test.py

>>> def Test(a):
...     for i in range(a):
...             if i >= 2 and a%i == 0 :
...                     return False
...     return True
...
>>> [i for i in range(10) if Test(i)]
[0, 1, 2, 3, 5, 7]


```
静的解析に引っかからなかったメモリ破壊の話


業務で出会ったバグの話です。

## 現象
+ どういう訳かグローバルなカウンタ変数がリセットされる
+ メモリブレイクを仕掛けても、リセットされる瞬間が引っかからない

## 解析結果
```cpp:typede.h
#define true   1u
#define false  0u
```

```cpp:hogehoge.c
/* グローバル変数 */
unsigned char g_is_error_flg;
```

```cpp:mogemoge.c
extern unsigned int g_is_error_flg;

void func1( void )
{
    g_is_error_flg = false;
    return;
}
```

```cpp:choco.c
/* グローバル変数 */
unsigned char g_loop_counter;

void func2( void )
{
    if( priority ) {
        g_loop_counter++;
    }
}
```
リセットされるカウンタは `g_loop_counter` です。
いったい何がいけないのか、わかりますか？
mapファイルで確認すると、`g_loop_counter` は `g_is_error_flg ` の次のアドレスでした。

ステップ実行して `g_is_error_flg = false;` で `g_loop_counter` に `0` が書き込まれるのを確認できました。
ただ、`g_is_error_flg = false;` の何がいけないのか、しばらくは分かりませんでした。

`mogemoge.c` から見ると、`g_is_error_flg` の宣言はどっか別の所にあって、`mogemoge.c` 内では `unsigned int` として扱うしかない訳です。
ところが、アドレスの割り付けとしては`g_is_error_flg` と `g_loop_counter` で１バイトずつでしか割り当てられていない訳で。

困った事に、他のいくつかのファイルでも `g_is_error_flg` は使われていたんですが、`mogemoge.c` 以外のファイルでは正しく `extern` 宣言されていたんですよねー。

今は、他に同様のケースがないかどうか、どうやって確認しようかをプロジェクト内で相談中です。
grepによる力技は避けたいよなあ、と誰もが口に出して言ってます。
どなたか、いい知恵ありませんか？

IARっていう統合開発環境を使ってたんですが、
静的解析では引っかかりませんでした。
ただ、メモリブレイクでも引っかからなかったのは、なんか納得いかなかったですね。

## 教訓
**extern 宣言は変数宣言のコピペで作ろう！**
GoogleAppsScriptメモ：doPostでポストデータを取得〜カレンダー登録へ

### カレンダーに予定を登録する方法が分かったので、外部HTMLのセレクトメニューから予定を追加できるようなテストアプリ制作に挑戦 ###

目標としているイメージは、開催日時が複数あるイベントの申し込み画面。セレクトメニューから時間帯を選んで、「登録」ボタンを押したらカレンダー登録の処理に進むような流れを想定している。

さて、まずはこんな感じでHTMLを作成

##### post.html #####

```html
<form action="https://script.google.com/macros/s/[ID]/exec" method="post" target="_blank">   <!-- methodはpostで -->

   <label>Let`s study GoogleAppsScript!
      <input type="hidden" name="event_title" value="Let`s study GoogleAppsScript!">
   </label><br/>   <!-- nameはこれにしないといけないルール -->

   <label>Study GAS,only this.
      <input type="hidden" name="event_description" value="Study GAS,only this.">
   </label><br/>   <!-- nameはこれにしないといけないルール -->

   <select name="event_schedule">   <!-- nameはこれにしないといけないルール -->
      <option value="2013/12/01/09:00,2013/12/01/12:00">9:00~12:00</option>
      <option value="2013/12/01/13:00,2013/12/01/16:00">13:00~16:00</option>
      <option value="2013/12/01/16:30,2013/12/01/19:30">16:30~19:30</option>
      <!-- valueは予定の開始日時、終了日時という順序で入力。new Dateできる書き方で -->
   </select>

   <input type="submit" value="予定を作成！">

</form>
```

ここでは選択肢の違いは時間だけだが、書き方のルールさえ守れば日付などを変えてもOK。input形式も何でもいい（今回はセレクトメニューから選べるようにしたが、イベントの申し込みを想定するなら申し込みが完了して日時が確定した後にカレンダーに登録する流れになりそう）。

これができたらいよいよスクリプトを書いていきたい。
##### insertEvent.gs #####
POSTデータを受け取るdoPost関数に処理を書いていく。内容を取り出すこと自体は簡単。
長くなってしまっているのはカレンダー登録用に情報を加工しているため（開始日時と終了日時を一つのnameに入れてしまっている都合上分解が必要）。

```js
function doPost(e){  //このeの中にPOSTされてきた情報が入っている（オブジェクト形式）

//// 今回はe.parameterから各データを取り出している ////
  var event_title = e.parameter.event_title;
  var event_description = e.parameter.event_description;
  
  var event_schedule = e.parameter.event_schedule;  

//// ここからはevent_scheduleを","の前後で分割する処理 ////

  // 元の文字列から開始日時の部分だけを取り出す関数
  function getStart_point(){
    
    var start_point = new String();  // 空の文字列として宣言し・・・・
    
    for(var i=0;event_schedule[i]!=",";i++){
      start_point += event_schedule[i];  // ","まで一文字ずつ足していく
    }
    return start_point;  // 完成した文字列を返す
  }
  // 同じく終了日時の部分を取り出す関数
  function getEnd_point(){
    
    var end_point = new String();
    
    for(var i=getStart_point().length+1;i<event_schedule.length;i++){
    // iの初期値は上で取り出した文字数+1（この+1は","があるため）。
      end_point += event_schedule[i];
    }
    return end_point;  // 上に同じ
  }
  // 使いやすいようにそれぞれ変数にしてしまう  
  var start_point = getStart_point();
  var end_point = getEnd_point();

//// 出来上がった材料を使って予定登録の処理を行う（詳細は後述） ////  
  createSchedule(start_point,end_point,event_title,event_description);

}

```

HTML側で一つのnameに二つのvalueを入れられたら楽なのだが・・・・そんなことできるのだろうか？

ともあれ、これでいよいよ予定登録の処理に進める

```js
function createSchedule(start,end,title,description){  // doPost内で作った材料が引数

//// 開始日時、終了日時をDateに変換 ////
var schedule_start = new Date(start);
var schedule_end = new Date(end);
  
//// 前の投稿を参考にして予定を登録する処理を書く・・・・２行だけだが ////  
  var cal = CalendarApp.getDefaultCalendar(); 
  
  cal.createEvent(title,schedule_start,schedule_end,{'description':description,'location':null});
  
}
```

できた。

あとは登録後のリダイレクトをどうにかしたい。
現時点ではHTMLのフォームで送信ボタンをしたら新規のウィンドウが開くようになっていて処理が終わったらもうそのウィンドウは自動的に閉じたいのだけれど、テンプレートを使ってもwindow.close()ができないみたいでちょっと困っている。
祝日判定

日本の祝日判定を行うためのTips

現行の国民の祝日(2003年以降)は、大きく分けて3種類あって、
1:毎年同じ日付のもの
2:何月の第○☓曜日(ハッピーマンデー型)
3:春分の日、秋分の日

1の判定は自明なので割愛。

2は日付がdayが年月日の日とすると、(day-1)/7 +1で何回目の曜日かわかる。
曜日は各言語の標準(定番)ライブラリでわかるはず。

3は、前年の官庁発表で正式決定なので実は2年後以降は決まっていない。
でも、春分日と秋分日ではあるはずなので
天文台予測が予測している春分日・秋分日が国立天文台のページ2030年まである。
これを使えば2030年までの春分の日と秋分の日の判定が可能。

さらに、
祝日でない当日から1日ずつ前の日を見ていき、
前日が国民の祝日で、かつ、
その1日以上の連続する国民の祝日の日曜日が含まれていれば
振替休日となる。

さらにさらに、
当日が国民の祝日でなく、前日と翌日がともに国民の祝日なら
「国民の休日」となる。
Rails でファイルをアップロードしてDBに登録する


## はじめに
gem を使わずに Rails の機能だけで、ファイルのアップロードを試してみます。

バージョン 

+ ruby 2.0.0p247
+ Rails 4.0.0

今回は、アップロード可能な形式やファイルサイズの制限はしてません。

## Model
``` ruby
class CreateContents < ActiveRecord::Migration
  def change
    create_table :contents do |t|
      t.string :upload_file_name
      t.binary :upload_file

      t.timestamps
    end
  end
end
```
モデル名は Content  としています。
アップロードされたファイルを保存する upload_file をbinary、ファイル名を保存する upload_file_name を string で定義しています。

## View

``` index.html.erb
<%= form_for(@content) do |f| %>
  <div class="field">
    <%= f.file_field :upload_file %>
  </div>
  <div class="actions">
    <%= f.submit "Upload" %>
  </div>
<% end %>
```
file_field を配置して、アップロードする form を作成する。

## Controller
``` ruby:contents_controller.rb
  def create
    upload_file = content_params[:upload_file]
    content = {}
    if upload_file != nil
      content[:upload_file] = upload_file.read
      content[:upload_file_name] = upload_file.original_filename
    end
    content[:password] = content_params[:password]
    @content = Content.new(content)
    respond_to do |format|
      if @content.save
        format.html { redirect_to @content, notice: 'Upload success' }
        format.json { render action: 'show', status: :created, location: @content }
      else
        @contents = Content.all
        format.html { render action: 'index' }
        format.json { render json: @content.errors, status: :unprocessable_entity }
      end
    end
  end
```
create アクションに処理を書いていきます。
アップロードされたファイルの取得方法については、[railsdoc](http://railsdoc.com/controller) の「アップロードされたファイルを取得」に詳しく載ってます。
content_params は strong_parameter です。

注意しなければいけないのは、アップロードされたファイルを直接DBに保存しようとするとエラーになります。
アップロードされたファイルは、 ActionDispatch::Http::UploadedFile クラスのオブジェクトであ
り、以下のようなインスタンスになっています。

```  ruby
#<ActionDispatch::Http::UploadedFile:0x007fe7ad501990
 @content_type="text/plain",
 @headers=
  "Content-Disposition: form-data; name=\"content[upload_file]\"; filename=\"test.txt\"\r\nContent-Type: text/plain\r\nContent-Length: 15\r\n",
 @original_filename="test.txt",
 @tempfile=
#<File:/var/folders/bg/3rk9r1y94_126k3231h0hvn40000gn/T/RackMultipart20131129-17450-zqlkd1>>
```

ファイル本体を取得するためには、@tempfile を read する必要があるんですが、UploadedFile クラスの read メソッドを利用することでことで出来ます。

``` ruby:ActionDispatch::Http::UploadedFile
def read(length=nil, buffer=nil)
  @tempfile.read(length, buffer)
end
```

そして、取得したバイナリデータを保存します。
ファイル名は @original_filename から取得しています。
以上で、ファイルのアップロードが出来るようになりました。

ActionDispatch::Http::UploadedFile クラスについては、以下の記事を参考にさせていただきました。ありがとうございました。
[ActionDispatch::Http::UploadedFileを読む (デバックメモ)](http://qiita.com/selmertsx@github/items/2beb0d7ec0774cbbf050)
Deferred化された関数を定義するイディオム

```coffeescript
class DummyRequest
  fetch: (url) -> $.Deferred (d) =>
    setTimeout =>
      d.resolve error: null
    , 1000
```

## Pros

* 関数定義を見た瞬間Deferred化された関数であることがわかる。
* 無駄な変数定義がなく綺麗で短い

## Cons

* d.promise() してない。外部からresolveやrejectを叩かれる可能性がある。
L○監視

ネットワーク監視の用語。L4とかL7とか。
OSI参照モデルのレイヤに基づいて決まる。

L3ならネットワーク層なので、IPでの確認になりpingコマンドを使う。
L4はトランスポート層でTCPでリクエストを送って確認する。
L7はアプリケーション層なのでHTTPリクエストになる。
普通のキーボードだけど親指シフトがしたい！


色々試したけど以下の二つがおすすめ。

## OSX
[KeyRemap4MacBook](https://pqrs.org/macosx/keyremap4macbook/index.html.ja)

- Change Key -> `oya`とか入力すると項目出てくる
  - <ローマ字モード> 左シフト=英数、右シフト=かな をチェック
  - 人によっては 左シフト=スペース、右シフト=かな の方がいいかも
- Key Repeat -> Double Press Modifier -> Recognition Threshold: 500ms -> 1000ms

## Windows
[DvorakJ](http://blechmusik.xii.jp/dvorakj/)
githubでhttpsのURLを指定してもgitプロトコルやssh経由にする方法

# 設定例

例えば github への push は常に ssh で fetch や pull は https の代わりに git プロトコルを使うなら以下のように設定します。

```ini
[url "git@github.com:"]
  pushInsteadOf = git://github.com/
  pushInsteadOf = https://github.com/
[url "git://github.com/"]
  insteadOf = https://github.com/
```

詳細は http://blog.n-z.jp/blog/2013-11-28-git-insteadof.html で。
コマンドラインでsudoしたときとしていないときでinclude_passが違う？

ふと疑問に思ったのでメモ

```
php -i | grep include_path
```
を実行してパスを確認すると

```
include_path => .:/usr/local/lib/php => .:/usr/local/lib/php
```
となる。次に

```
sudo php -i | grep include_path
```
を実行してみると

```
include_path => .:/usr/share/pear:/usr/share/php => .:/usr/share/pear:/usr/share/php
```
どうやら（どう見ても？）違うっぽい。デフォルトは違うものなんだろうか？
最新になっていない Gem を洗い出す


* [Bundler: The best way to manage a Ruby applications gems](http://bundler.io/v1.5/bundle_outdated.html)

```bash:console
$ bundle outdated
Updating git://github.com/byroot/rails3_acts_as_paranoid
Fetching gem metadata from https://rubygems.org/.......
Resolving dependencies...

Outdated gems included in the bundle:
  * acts_as_paranoid (0.4.2 > 0.4.1 4265d9f)
  * aws-sdk (1.29.0 > 1.11.1)
  * devise (3.2.2 > 3.2.0)
  * geokit (1.7.1 > 1.6.7)
  * geokit-rails (2.0.1 > 2.0.0)
  * honeybadger (1.9.4 > 1.9.3)
  * kaminari (0.15.0 > 0.14.1)
  * spring (1.0.0 > 0.9.2)
```
表の xpath

表の1 行目にある文字を指定して、マッチした列の別の行の要素を取得する。

具体的には、下のような表の場合に `a` を指定して `c` を取得したい場合。

| a | b |c|
|:-----------:|:------------:|:------------:|
| d | e | a |
| f | a | g |

```
//table//tr[td[1][text()="a"]]/td[3]
```

```js
$x('//table//tr[td[1][text()="a"]]/td[3]')
```
LAMP 環境作る時の yum コマンドメモ

```bash
sudo yum install -y zsh screen
sudo yum install -y httpd mod_ssl php php-mbstring php-mcrypt php-pdo php-pear php-pecl-xdebug
sudo yum install -y mysql mysql-server php-mysql
sudo yum install -y git
```

ワンライナーで書いても良いかも。
一部報道による「Ruby on Railsにcookie保存関連の脆弱性」について


ITmediaの記事が微妙だったので調べて見たのん。(面倒なので箇条書き)

元ネタ
====

- [Ruby on Railsにcookie保存関連の脆弱性、2000サイトで放置状態](http://www.itmedia.co.jp/enterprise/articles/1311/27/news041.html) (ITmedia)
- [Ruby on Rails CookieStore Vulnerability Plagues Prominent Websites](http://threatpost.com/ruby-on-rails-cookiestore-vulnerability-plagues-prominent-websites/103038) (原文)

何が問題とされているか (記事の主張)
==============================

- デフォルトでは、cookieにセッションのハッシュ (データ) を保持している。(CookieStore)
  - Rails 2-3の場合は秘密鍵で署名されている = 書き換え不可
  - Rails 4の場合は暗号化されている  = 書き換え・内容の読み取り不可
- Cookieを読み取られる可能性がある。
  - XSS
  - セッションサイドジャッキング: うっかりSSLではない通信をさせると、Rails3以前では機密情報が漏洩する可能性がある。(Kickstarter など)
- Cookieに保持されたセッション情報を破棄する手段が無い。
  - サーバ側で無効にしたつもりでも、悪意あるクライアントが古いcookieをセットした場合には (デフォルトだと) 有効なものとして扱ってしまう。
  - 暗号化された状態のcookieをそのまま送るだけで良い (復号する必要は無い)

CookieStoreが問題なのか?
===================

- XSSやセッションサイドジャッキングは、そもそもCookieStoreの問題では無い。
  - 暗号化されていたとしても、cookieに直接機密情報を保存すること自体はあまり良くない。
  - ちなみに、Rails 3以降でHttpOnlyがデフォルトのため、XSSでセッション情報を読み取ることはできない。
- 他のsession_storeを使用した場合でも、サーバ側でセッションを無効化する仕組みは用意されているわけでは無い。
  - サーバが破棄したつもりのcookieを送信して、セッションを続けることができる
  - 期限切れの仕組みは自前で処理する必要がある (多分)
- session_store に設定する :expire_after オプションは、cookie の有効期限を設定するだけで、session_store内のデータを**無効化しない**。

CookieStoreの問題ではなく、無効化するべきセッションを正しく破棄していないという問題。

結論
===

- session_store として何を使うかにかかわらず、クライアントがcookieを保持し続ける可能性を考慮してセッション処理を行う必要がある。
- 適切にセッションを破棄する必要がある。
  - 最終アクセスから一定期間経過していた場合 (期限切れ処理)
     - 定期的に掃除ジョブを流す (cf. [Session Expiry, Ruby on Rails Security Guide](http://guides.rubyonrails.org/security.html#session-expiry))
     - セッション取得時に期限切れのチェックをする
         - active_record_storeを使う場合は、[ActionDispatch::Session::ActiveRecordStore](https://github.com/rails/activerecord-session_store/blob/master/lib/action_dispatch/session/active_record_store.rb) を継承して、get_session 内に updated_at をチェックする処理を入れるなど。(他に良い方法があるかも?)
     - memcached で有効期限を設定する ([Passengerを利用する場合は注意](http://www.modrails.com/documentation/Users%20guide%20Nginx.html#_smart_spawning_gotcha_1_unintentional_file_descriptor_sharing))
     - セッションのハッシュ内に最終アクセス日時や期限切れ日時を入れて、アクセスごとにチェックする e.g. `session[:last_access] = DateTime.now` (メタ情報を入れるのはスマートさに欠けるかも)
  - ログアウトした場合
  - パスワードを再設定した場合 (同一ユーザの全セッションを破棄)

デフォルト設定に難があるので、これは脆弱性と言われても仕方ないかもしれない。

CookieStoreを使っていてもセッションを破棄することはできるが、かなり面倒な処理になる。(多分) その際サーバにデータを保存することは必要なので、最初からactive_record_storeやmemcached_storeなどを使った方が良いと思う。

まとめ
====

- CookieStoreちゃんのファンやめます
- このあたり簡単に処理してくれるgem無いかなー (他力本願)
  - Rails側に破棄の仕組みが入るのが筋なんだろうけど。
16回オフラインリアルタイムどう書くの参考問題 ruby による実装


オフラインリアルタイムどう書く
第16回(12月7日)  http://atnd.org/events/45016
の、参考問題「L被覆」
http://nabetani.sakura.ne.jp/hena/ord16lcove/
の実装例。

rubyで。

他の言語などの解答例は
http://qiita.com/Nabetani/items/7be4bc2a3514bbfbfc15
から辿れます。

で。

```ruby
# tested with ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.4.0]

def product( a, b )
  a.to_a.product( b.to_a )
end

def solve_core( points )
  s=( product 0..9, 0..9 ).map{ |cx, cy|
      ( product 0..cx, 0...cy ).map{ | ax, ay |
        ( product 0...ax, (ay+1)..cy ).map{ | bx, by |
          points.all?{ |x,y|
            ( (ax..cx)===x && (ay..cy)===y ) || ( (bx..cx)===x && (by..cy)===y )
          } ? (cx-ax+1)*(cy-ay+1) + (ax-bx)*(cy-by+1) : nil
        }.compact.min
      }.compact.min
  }.compact.min
end

def solve(src)
  points = src.split(",").map{ |xy| xy.to_i.divmod(10) }
  ( 4.times.map{
    points.map!{ |x,y| [y,9-x] }
    solve_core( points )
  }.compact.min || "-" ).to_s
end

$stdout.sync=true

DATA.map do |line|
  num, src, expected = line.split( /\s+/ )
  next true unless expected
  actual = solve( src )
  ok = actual==expected;
  puts "%s %s->%s ( %s )" % [ ok ? "ok" : "***NG***", src, actual, expected ]
  ok
end.all?.tap{ |ok| p ok }

__END__
0 41,33,26,55,74,58,68  39  
1 00,99,09,90 - 
2 09  3 
```

いつもどおり、テストデータの大半は省略。

最初に書いたのは nidouchi さんの http://qiita.com/nidouchi/items/b8552133e5f5d636368a と同じ流れだったので、違うのを書いたほうが面白いと思って書きなおした。

したかったことは『「ひとマスしか塗ってない時には3」を特別扱いしない』ということ。

なお。
実行速度は絶望的に遅く、50件のテストを実施するのに 10秒以上かかる。

実装戦略は
「全部のL字を列挙する」
というもので、ざっと100万回ぐらい回っている。枝は一切刈ってない。

`compact.min` 三連発がみっともない感じ。