OmniAICreator/Qiita-1.07M huggingface dataset:
webのセキュリティ対策まとめver1.0

##**セキュリティ対策一覧**

######SQLインジェクション
　　　1.バインド機構（prepare()とexecute()）
　　　2.エラーメッセージ非表示

######OSコマンドインジェクション
　　　1.exec()やsystem()など外部コマンドを使っていなければ、phpの場合は大丈夫

######ディレクトリトラバーサル
　　　1.ファイルへの直接書き込みはさせない
　　　2.外部パラメータからの指定をさせない

######セッションハイジャック
　　　1.セッションIDの保存はクッキーのみ、URL埋め込みによるセッション管理を禁止
　　　2.XSS対策=セッションハイジャック対策
　　　3.COOKIE送信はhttpsの時のみ　　

######XSS
　　　1.HTTP レスポンスヘッダーに文字コードを指定する
　　　2.HTML 要素の属性は""(ダブルクオーテーション)で囲む
　　　3.出力する全ての要素に対してエスケープ処理を行う
　　　4.URL は「http://」か「https://」で始まるもののみ出力する
　　　5.<script></script> 要素の内容を動的に生成しない

######CSRF
　　　1.DB登録時はpostメソッドでhiddenパラメータを使う（確認画面経由する時）
　　　2.クレカ利用の時は再度パスワード入力を促す
　　　3.リファラーの確認（どうやってする？）

######HTTPヘッダインジェクション
　　　1.htmlspecialchars（って大体デフォルトで入ってる）

######メールヘッダインジェクション
　　　1.メールヘッダを固定
　　　2.htmlで宛先を指定しない
　　　3.外部からの入力に対して改行コードを全て削除する

######その他対策
　　　・暗号化
　　　　ーemailアドレスとパスワードの暗号化
　　　　ー口座番号の暗号化
　　　　ーmcript。sha-256
　　　・データベース、コードの定期的バックアップ

####**第三者のチェックフローもできれば導入**
　・外部委託
　・セキュリティ部門による内製

####**IPAのセキュリティ関連ツール**

　　- ウェブサイトの攻撃兆候検出ツール iLogScanner
　　- 脆弱性体験学習ツール AppGoat
　　- Androidアプリの脆弱性の学習・点検ツール AnCoLe
　　- セキュリティ要件確認支援ツール
　　- 学習コンテンツ
　　-「安全なウェブサイト運営入門」で体験する7つの事件
　　- セキュア・プログラミング講座 （WEB編・C++編）
####**参考書、参考サイト**
[1.体系的に学ぶ 安全なWebアプリケーションの作り方
〜脆弱性が生まれる原理と対策の実践〜](http://www.amazon.co.jp/gp/product/4797361190/ref=pd_lpo_sbs_dp_ss_1?pf_rd_p=466449256&pf_rd_s=lpo-top-stripe&pf_rd_t=201&pf_rd_i=4822229718&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=1A889CJ08Z2VKTKD1QME)

[2.安全なウェブサイトの作り方 by IPA](http://www.ipa.go.jp/files/000017316.pdf)
Ubuntuの公式Docker ImageがKernel 3.18を使ってくれるのを首を長くして待つために調べたこと


Overlayfsが入っているUbuntuを使いたいがために、Ubuntuの14.04LTSがKernel 3.18を使ってくれると嬉しい。
Dockerfileでカーネルを置き換える処理を書こうと思ったが、再起動をする方法が分からなかったので諦めて、待ちに入っている僕。

現状(2015/2/12現在)、Ubuntu14.04はLinux Kernel`3.16`を使用している模様

```bash
$ docker pull ubuntu:14.04
$ docker run -it --rm ubuntu:14.04 uname -r
3.16.4-tinycore64
```


## まず、UbuntuのDockerfileはどこからイメージを取ってきているか

Docker公式のUbuntuイメージ
https://registry.hub.docker.com/u/library/ubuntu/

のDockerfile
https://github.com/tianon/docker-brew-ubuntu-core/blob/a9da4b3cd8977c2aacafe5d9d0056cbb360f2d1c/trusty/Dockerfile

は、

```Dockerfile
FROM scratch
ADD ubuntu-trusty-core-cloudimg-amd64-root.tar.gz /
```

となっている。

これは、ubuntuのcloud-imageから取ってきていると思われる。

http://cloud-images.ubuntu.com/releases/14.04/release/

## Ubuntu Cloud ImageはどのKernelを使っているか

現在のUbuntu14.04は正確には14.04.1らしい。
https://wiki.ubuntu.com/TrustyTahr/ReleaseNotes

14.04.1の変更概要を見る
https://wiki.ubuntu.com/TrustyTahr/ReleaseNotes/ChangeSummary/14.04.1


なるほど。結構頑張っているのね。

```
July 22, 2014
```

という文字が見えるので、ここらへんにリリースされた感じ。

このリリースを管理しているとこがあると思ったら、やっぱりありました。Launchpad。
https://launchpad.net/ubuntu/+milestone/ubuntu-14.04.1

```
Expected:
2014-07-24
```

となっている。

14.04.2はいつだと思って、一覧に行って
https://launchpad.net/ubuntu/+series

14.04.2を見て
https://launchpad.net/ubuntu/+milestone/ubuntu-14.04.2

ありました。

```
Expected:
2015-02-19
```

一週間後！

カーネルのバージョンはよくわからないけれどoverlayfsの文字は数カ所に見える！！

楽しみ。
URIの?以降に&でつなげたクエリー文字列を生成する


[How to build a query string for a URL in C#?](http://stackoverflow.com/questions/829080/how-to-build-a-query-string-for-a-url-in-c)から

### LINQを使う

```csharp
private string ToQueryString(NameValueCollection nvc)
{
  return "?" + string.Join("&", Array.ConvertAll(nvc.AllKeys, key => string.Format("{0}={1}", HttpUtility.UrlEncode(key), HttpUtility.UrlEncode(nvc[key]))));
}
```

### HttpUtility.ParseQueryStringを使う

UTF-8エンコードまでしてくれるらしい
https://msdn.microsoft.com/ja-jp/library/ms150046(v=vs.110).aspx

```csharp
NameValueCollection queryString = System.Web.HttpUtility.ParseQueryString(string.Empty);

queryString["key1"] = "value1";
queryString["key2"] = "value2";

return queryString.ToString(); // URLエンコードされた "key1=value1&key2=value2"が返る
```
git管理している途中から.gitignoreを追加して、その設定を反映させる方法

## .gitignoreとは
Gitのバージョン管理対象から外すファイルを指定できる設定ファイルのこと

## 本題
Git管理をしている状態で、
途中から「.gitignore」に除きたいファイルを追加しても
既に管理対象に追加されているためそのままだと.gitignoreされない

そこでする作業は以下
git rm -r --cached .

あとはいつも通りgit add、git commit、git pushをすればok

※参考URL
http://qiita.com/Potof_/items/c75eba9cfa72819506de
R データフレーム データ削除

行列で指定、マイナスをつける

&gt; d0
  Age BW Sex a
1  60 66   M 1
2  70 57   F 2
3  65 78   F 3
4  23 88   M 4
5  66 90   M 5
6  77 57   M 6

4行目のデータを削除
&gt; d1<-d0[-4,]
&gt; d1
  Age BW Sex a
1  60 66   M 1
2  70 57   F 2
3  65 78   F 3
5  66 90   M 5
6  77 57   M 

さらに、1,3,6行目のデータ削除
&gt;d2<-d1[c(-1,-3,-6),]
&gt; d2
  Age BW Sex a
2  70 57   F 2
5  66 90   M 5
6  77 57   M 6

4列目のaを削除
&gt; d3<-d2[,-4]
&gt; d3
  Age BW Sex
2  70 57   F
5  66 90   M
6  77 57   M
digest認証の設定方法

cd /etc/httpd/conf
htdigest -c ファイル名 "認証id" ユーザー名
cd /var/www/html/認証かけたいディレクトリ
vim .htaccess

------- .htaccessの中身 -------
AuthType Digest
AuthName "認証id"
AuthUserFile /etc/httpd/conf/digest
Require valid-user
------------------------------
Objective-Cをやりはじめの人向けのメモ

さらにプログラミングが初めてに近い人向けに

+ メソッドの使い方はヘッダーを読むのが早い時がある。
+ 覚えたテクニックはスニペットやブログなどにメモしておいて使いまわす。
+ 参照できる本が初心者向けしかないので他のオブジェクト指向の本(Ruby,Java)での実装テクニックも参考にする。
+ 最終的にはCも理解しないといけなくなるが最初はそこまでいらない(Java, Ruby程度の知識でいける)。
+ 検索する際はObjective-Cとつけとくと情報がヒットしやすい。
+ UITableViewの動きを最初に理解するとわかりやすい。
+ nibを使わないでコードで書いてみると何が起きているのかわかりやすい(最終的にはnibを使う)
+ シミュレータで試験できると楽。実機でしか試験できない部分をなるべく減らす。
+ NSAssertをガード条件の手前においておくと間違いに気づく。(リリース時に無効化しておく)
+ NSError, NSNotificationをうまく使う。
+ 定期的にプロファイルを取る。
+ とりあえず０からプロジェクトを作っていると何が無駄な作業で何が本質的な作業かがわかってくる。
迷惑メール対策 (Sender address reject)

## 参考

* [Postfixの迷惑メール対策 ブラックリストを設定するための3ステップ - 第2.5地区](http://d.hatena.ne.jp/taramonera/20100506/1273147439)
* [Postfix](http://www.asi.co.jp/techinfo/unix/postfix.html)

## 現在の設定確認

```bash:未設定の場合
# main.cfで追加設定したもの
$ postconf -n | grep smtpd_sender_restrictions
smtpd_sender_restrictions =

# 初期値 (postconf -n で出力がなかった場合こちらでも確認)
$ postconf -d | grep smtpd_sender_restrictions
smtpd_sender_restrictions =
```

## 設定を行う(hash:を使う場合)

```bash:/etc/postfix/main.cf
smtpd_sender_restrictions = 
    check_sender_access hash:/etc/postfix/access
```

```bash:/etc/postfix/access
bma.rec.mpse.jp	REJECT
vp.pl	REJECT
bxz.jp	REJECT
bis-news.com	REJECT
nextsb19.org	REJECT
omence.asia	REJECT
jp365.asia	REJECT
japan-onlline-shop.mobi	REJECT
blue	REJECT
academy-sophrology.biz	REJECT
seikotuin88.org REJECT
```

受信を拒否したいドメイン名を列挙。
ここのものはメールアドレスの末尾に該当する。(/blue$/)

* 試しに blue@myaddress.com 宛にメール送ってみたところ、これまで通り送信できた。
* 試しに blue@myaddress.com からメールを受信してみたところ、これまで通り送信できた。

```bash:/etc/postfix/access.dbを更新
sudo /usr/sbin/postmap access
```

```bash:リスタート
sudo /etc/init.d/postfix restart
```

### 運用

追加をしたい場合、`/etc/postfix/access`に追記し同様に`postmap access`する。
(その際`/etc/init.d/postfix restart`は不要)


## 正規表現での指定(regexp:を使う場合)

* [regex - Custom wildcard configuration in postfix - Stack Overflow](http://stackoverflow.com/questions/23767350/custom-wildcard-configuration-in-postfix)
* [Ubuntu Manpage: regexp_table - format of Postfix regular expression tables](http://manpages.ubuntu.com/manpages/hardy/man5/regexp_table.5.html)

```bash:/etc/postfix/access
/41news23.org$/    REJECT
/blue$/ REJECT
/red$/  REJECT
/pink$/ REJECT
/mobi$/ REJECT
```

```bash:/etc/postfix/main.cf
smtpd_sender_restrictions = 
    check_sender_access regexp:/etc/postfix/access
```

## ログ

smtpd_helo_restrictions でブロックした場合 (今回の設定例には載せていないが)

> Nov 13 05:53:02 mail01 postfix/smtpd[21883]: NOQUEUE: reject: RCPT from unknown[122.231.33.216]: 554 5.7.1 <qq.com>: Helo command rejected: Access denied; from=<1741873947@qq.com> to=<root@sample.com> proto=SMTP helo=<qq.com>

smtpd_sender_restrictions でブロックした場合

> Nov 13 05:53:05 mail01 postfix/smtpd[21786]: NOQUEUE: reject: RCPT from unknown[121.234.230.209]: 554 5.7.1 <386909471@qq.com>: Sender address rejected: Access denied; from=<386909471@qq.com> to=<root@sample.com> proto=SMTP helo=<srninfo.com>
manページ > xxx型構造体のmanページを探す > man -K "struct xxx {"

動作確認

    CentOS 6.5
    man, version 1.6f

コーディングをしている中で、xxx型構造体のメンバ変数を知りたい時がある。例えば、hostent型構造体、pollfd型構造体、epoll_event型構造体それぞれのメンバ変数は何か、など。

ネットがつながっている環境ではgoogle検索する方が早い。

ネットがつながっていない環境では、以下のようにしてmanページを検索することができる。2つのスペースと`{`があることで、定義を絞り込める。

    $ man -K "struct pollfd {"
こうするとしばらくした後

    /usr/share/man/man2/poll.2.gz? [ynq]
と表示されるので`y`を入力してmanページを開き、

`/struct pollfd {`
を入力して、メンバ変数の定義に飛ぶことができる。

確認したら`q`でmanページを抜ける。

その後、再度
    /usr/share/man/man2/xxx.xxx.gz? [ynq]
のように聞かれた時は`q`で中止すればいい。
動的に生成したDOM要素に対してjQueryでイベントを設定する場合

参考：
[jQueryで動的に生成される要素に対するイベントの設定方法 | klog](http://keito7.com/blog/2012/11/21/jquery-dynamic-event/)
[.on() | jQuery 1.9 日本語リファレンス | js STUDIO](http://js.studio-kingdom.com/jquery/events/on)

よく忘れるので備忘録。

jQueryで動的にDOMを生成すると、その要素に対してイベントを生成するには通常の方法ではイベントが効かなくなる。

例：（一部参考サイトより抜粋）

```html
<div id="1">1つめの要素</div>

<script type="text/javascript">
  $("#1").click(function(){
    $("#1").after("<div id=\"2\">２つ目の要素追加</div>");
  });

  $("#1").click(function(){
    alert("1つ目の要素クリック");
  });

  $("#2").click(function(){
    alert("2つ目の要素クリック");
  });
</script>
```

これだと1つ目の要素をクリックしたときには、`$("#1").click(function(){};`が実行されますが、後から追加された2つ目の要素のclickイベントは反応しません。

`$("#2").click(function(){};`の部分を以下の様に変更します。

```js
$("#1").click(function(){
  $("#1").after("<div id=\"2\">２つ目の要素</div>");
});

$("#1").click(function(){
    alert("1つ目の要素クリック");
});

$(document).on("click", "#2", function(){
    alert("2つ目の要素クリック");
});
```

`.on()`メソッドの第一引数にイベント名、第二引数にセレクタを記述します。
上記の`$(document)`にセレクタを指定して、第二引数を省略することも可能ですが、動作しないこともある（原因は不明、タイミングの問題？）ので、どちらでも書けることを念頭に入れておこうと思います。
[JavaScript]CryptoJSでAES暗号のsaltとパスフレーズからkeyを求める

[CryptoJS](https://code.google.com/p/crypto-js/)はクライアントサイドで暗号化や復号化ができる。
AESの鍵長は128bit以上だが、128bitより短いパスフレーズでもCryptoJSなら暗号化できる。
正確にはパスフレーズとsaltから鍵を内部で生成している。

```js
var encrypted = CryptoJS.AES.encrypt('message', 'pass');
console.log(encrypted.salt.toString());  // 467c08b2364309e8
console.log(encrypted.key.toString());   // 6e475a9672994638c4231bd750ab7aceeb9004229f0a26c3622a2045deb789e9
```

上記のスクリプトの`encrypted.key`が実際に使用される鍵である。

AESで暗号化したデータを復号化するときに進捗状況を確認したいので`CryptoJS.algo.AES.createDecryptor`を使用しようとしたときに問題がおこった。
サンプルは以下のように書いてあったが、`salt`と`pass`しかわからない状況では使用することができない。(`key`には実際の鍵を入れる必要がある)

```js
var aesDecryptor = CryptoJS.algo.AES.createDecryptor(key, { iv: iv });

var plaintextPart1 = aesDecryptor.process(ciphertextPart1);
var plaintextPart2 = aesDecryptor.process(ciphertextPart2);
var plaintextPart3 = aesDecryptor.process(ciphertextPart3);
var plaintextPart4 = aesDecryptor.process(ciphertextPart4);
var plaintextPart5 = aesDecryptor.finalize();
```

公式のトップを見ても解決方法がわからなかったのでソースをのぞいてみると以下の式で鍵を生成できることがわかった。

```js
var key = CryptoJS.kdf.OpenSSL.execute(pass, 8, 4, salt).key;
```

もっといい方法があるかもしれない。
s3cmd put するために必要最小限の IAM Policy


夜な夜なバックアップを取って s3cmd put しようと思い、専用の IAM ユーザを作成しました。万一のことがあってもデータを削除されたりすることのないよう、バックアップファイルを put するだけに必要な最小の IAM Policy は下記です。

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetBucketLocation",
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::{{ bucket-name }}",
        "arn:aws:s3:::{{ bucket-name }}/*"
      ]
    }
  ]
}
```

`s3:GetBucketLocation` が必要なところでひとしきりハマってました……。

この記事の本題ではありませんが、上記の Policy だと、 `s3cmd --configure` で最後に接続確認テストで失敗になります（ `s3cmd put` でアップロードできることは確認しています）。もしここで接続確認テストを通過させたいのであれば `s3:ListAllMyBuckets` が必要なので下記のようになるでしょう。

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:ListAllMyBuckets",
      "Resource": "arn:aws:s3:::*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetBucketLocation",
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::youcube-backups",
        "arn:aws:s3:::youcube-backups/*"
      ]
    }
  ]
}
```
便利そうなshellの書き方、linuxコマンドのメモ

### プロセス名を指定して、プロセスID確認とかkillとか

```
pgrep -f '<プロセス名>'
```
```
pkill -f '<プロセス名>'
```

参照
http://d.hatena.ne.jp/lurker/20061102/1162427170

### 文字列の正規表現比較
正規表現は"や'で囲まない！

```lang:bash
if [[ $var =~ ^hogehoge$ ]]; then
  ...
fi
```

参照
http://d.hatena.ne.jp/adsaria/20100107/1262842850

### 使用しているポートの確認

```
sudo lsof -i:<port番号>
```
```
netstat -anp | grep <port番号>
```

参照
http://d.hatena.ne.jp/stakizawa/20080324/t1


### 実行しているシェルファイルが置かれているディレクトリパスを取得

```language:bash
script_dir_path=$(dirname $(readlink -f $0))
```

参照
http://qiita.com/m-yamashita/items/889c116b92dc0bf4ea7d
SQLで各カテゴリごとに上限数を変えてselectするには

自分へのメモ書き。あるカラムの値でグループに分類して、それぞれのグループから最大何個かずつ取得するのは`ROW_NUMBER()`を使えば可能。これと`CASE`を使うことで、グループごとに取り出す数を変えることができる。

テーブル例:

```sql
create table Employee
(
	ID int NOT NULL primary key clustered,
	Name nvarchar(255) not null,
	OfficeId int not null
)
```

サンプルデータ:

```sql
insert into Employee (ID, Name, OfficeId) values
    (1, 'Mike', 0),
    (2, 'Andy', 1),
    (3, 'Nancy', 1),
    (4, 'Mary', 2),
    (5, 'John', 0),
    (6, 'Alice', 2),
    (7, 'Scott', 2)
```

ここから各`OfficeId`毎に1つずつエントリを取り出すには

```sql
SELECT e.* FROM (
	SELECT *, ROW_NUMBER() OVER(PARTITION BY OfficeId ORDER BY OfficeId) RN
	FROM Employee
) e
where RN < 2
```

こんな感じ。さらに`OfficeId`毎に取り出す上限数を変えるにはWHERE句にCASEを組み合わせればよい。

```sql
SELECT e.* FROM (
	select *, ROW_NUMBER() OVER(PARTITION BY OfficeId ORDER BY OfficeId) RN
	from Employee
) e
WHERE RN <= CASE OfficeId
    WHEN 0 THEN 3
    WHEN 1 THEN 2
    ELSE 1 END
```

これで`OfficeId`が`0`のときは最大3件、`1`の時は最大2件、それ以外なら1件だけ取り出せる。`if`とか変数とかは一切不要。
HomeBrew でインストールした discount で GFM スタイルの `Fenced code blocks` を有効にする

# 概要

Markdown の実装である [discount](http://www.pell.portland.or.us/~orc/Code/markdown/) は [GFM](https://help.github.com/articles/github-flavored-markdown/) ではおなじみの <code>```</code> でコードを囲う書き方をサポートしています。
しかしながら、HomeBrew でインストールした場合はこの機能が有効になっていません。

```shell-session
$ brew install discount
$ echo "\`\`\`ruby\nputs 'hello'\n\`\`\`" | markdown
<p><code>ruby
puts 'hello'
</code></p>
```

残念なことに執筆時点ではオプションでの指定できません。

```shell-session
$ brew options discount
$
```

# 解決策

HomeBrew ではコンパイル時のオプションを渡す方法がないので、以下のように Formula ファイルを書き換えてオプションを追加してやる必要があります。

```diff
diff --git Library/Formula/discount.rb Library/Formula/discount.rb
index de15dcd..1d77a15 100644
--- Library/Formula/discount.rb
+++ Library/Formula/discount.rb
@@ -12,6 +12,7 @@ class Discount < Formula
     system "./configure.sh", "--prefix=#{prefix}",
                              "--mandir=#{man}",
                              "--with-dl=Both",
+                             "--with-fenced-code",
                              "--enable-all-features"
     bin.mkpath
     lib.mkpath
```

これでインストールすると問題なく変換出来ました。

```shell-session
$ brew install discount
$ echo "\`\`\`ruby\nputs 'hello'\n\`\`\`" | markdown
<pre><code class="ruby">puts 'hello'
</code></pre>
```

# 補足

オプションを指定出来るようにプルリクエストを作成済なのでそのうち取り込まれるかもしれません。

```shell-session
$ brew options discount
--with-fenced-code
	Enable Pandoc-style fenced code blocks.

$ brew install discount --with-fenced-code
```

https://github.com/Homebrew/homebrew/pull/36746
型コンストラクタの意味

学習の素材は、
[関数プログラミング実践入門](http://www.amazon.co.jp/%E9%96%A2%E6%95%B0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E2%94%80%E2%94%80%E7%B0%A1%E6%BD%94%E3%81%A7%E3%80%81%E6%AD%A3%E3%81%97%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AB-WEB-PRESS-plus/dp/4774169269)

> この表記は、私見・感想です。

# 型コンストラクタ
モナドを学習している最中だが、どうもこのキーワードの意味をしっかりと理解していないと、コードを読み辛いことに気づいた。

## 言葉の理解
型コンストラクタとは、 **それ自体が型であるが、別の型をくっつけて新たな型を作るもの**である。
型 `[]` は、型一つを包んでリストになる **リストの型コンストラクタ** であり、型 `(,)` は型二つを包んでタプルになる **タプルの型コンストラクタ** である。
同じように、 型 `Either` は型二つを包んで `Either a b` を作る **`Either` の型コンストラクタ** である。

一方、値としての `[]` は空リスト、値としての `(,)` はタプルのコンストラクタであることに注意する。

> OOPのコーディング形式が頭から離れず、例えば `State state a` と書いてあっても **型`State state a`である** とすぐに脳内変換できない。なんとなく`state` や `a` には`State` の実体が参照されるような気がしてしまい、ノイズになる。

## 型クラス モナドのインスタンスになる条件
型クラス モナドのインスタンスは、（あと一つ、型をくっつければ有効な型となる）型コンストラクタである。

```hs:モナドの定義とインスタンスの例
-- モナド型クラスの定義
class Monad (m :: * -> *) where
  (>>=) :: m a -> (a -> m b) -> m b
  (>>) :: m a -> m b -> m b
  return :: a -> m a
  fail :: String -> m a

-- []（リスト[a]の型コンストラクタ）
instance Monad [] -- あと一つ、型をくっつければ有効な型となる

-- State state (型State state a の型コンストラクタ）
instance Monad (State state) -- あと一つ、型をくっつければ有効な型となる
```

>多分、  `* -> *` という表記の意味するところが、**型引数を一つ持つ型コンストラクタ** ということなのだろう。また、結果的に当たり前なのだが、モナドのアクションは、**この型コンストラクタ + 一つの型** が返り値の型となりそうだ。
WordPressのユーザに管理者からの通知を行うプラグインを作った

[WP Admin Notification](https://wordpress.org/plugins/wp-admin-notification/)
WordPressのユーザへ通知メッセージを表示するプラグインをつくりました。


![screenshot-2.png](https://qiita-image-store.s3.amazonaws.com/0/65478/cfafae39-68aa-a3f7-d241-71d3ad45c72f.png)
こんな感じでWordPressの管理画面にメッセージが表示されます。。
[Media Assembly Kit](http://media-assembly-kit.com/ja/)っていう今、公開中のサービスで使ってる機能なのですが、そのままプラグインとして公開してます。


![screenshot-1.png](https://qiita-image-store.s3.amazonaws.com/0/65478/8961a481-74e5-f72b-5849-ea649b9d9d94.png)
こんな感じで、通知メッセージとメッセージ表示期間、メッセージを通知したい権限グループを指定します。


![screenshot-3.png](https://qiita-image-store.s3.amazonaws.com/0/65478/383fdfd2-73b5-b272-117a-f5b1829fbf4f.png)
ユーザーがメッセージを確認して「checked」をクリックするとユーザ一覧で確認しましたってチェックが入ります。


ユースケースとしては会員サイトで会員全員にメッセージを通知したり、複数人のライターさんにまとめて連絡をしたりってことを考えています。
それでは良いノーティフィケーションライフを！
「Rails + Heroku + Bootstrap」でassetsにサブディレクトリを使用する際の注意点

bootstrapのstylesheetを
pc/mobileのサブディレクトリで振り分けた際に問題発生。
localでは正常に動くのに、
staging（とproduction）環境でglyphiconsが☓印になる。なんでだ。

（正確には、モバイル表示にはbootstrapで対応していたものの、
iosアプリ判定のためにディレクトリを振り分けた時点で問題発生。）

precompileの理解を後回しにしてたので、しばらく躓きました。
[これ](http://qiita.com/metheglin/items/c5c756246b7afbd34ae2)や[これ](http://stackoverflow.com/questions/12475253/twitter-bootstrap-rails-on-heroku-glyphicons-displayed-as-squares)を読んでも上手くいかず。

日本語の情報が引っかからず、
Rails初学者の穴の一つだと感じたので、以下メモ。
stack overflowの[これ](http://stackoverflow.com/questions/15134504/rails-assets-pipeline-not-precompiling-subdirectory)をヒントにしました。

# 原因
asset pipelineがトップディレクトリ内の
application.cssのみを読み込み、
それに応じた挙動をするのを理解していなかったこと。

**また、bootstrap.css（or bootstrap.min.css）は
application.html.erb内で指定したcssファイルと
同じ階層に置かなければ読み込まれません。**


# 解決策
### ファイル構成

```lang:/app/assets/stylesheets/
|             |-- pc
|             |  |
|             |  --- custom.css
|             |  --- custom2.css
|             |  --- .....
|             |
|             -- mobile
|                |
|                --- cunstom.css
|                --- cunstom2.css
|                --- ..... 
application.css
mobileapplication.css
bootstrap.min.css
```

### stylesheet切り替え

```lang:views/layouts/application.html.erb
<% if mobileapps? == true %> # application
  <%= stylesheet_link_tag    'mobileapplication', media: 'all', 'data-turbolinks-track' => true %>
<% else %>
  <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
<% end %>
```

### 切り替えメソッド

[jpmobile](https://github.com/jpmobile/jpmobile)を導入していれば、
request.mobile? または request.smartphone? 等のメソッドで。

今回はモバイル判定ではなく、
iosアプリ判定だったので、[こちら](http://codenote.net/ruby/908.html)を参考に、メソッド作成。
メソッド内では判定だけを行い、上記でstylesheetを切り替えてます。

```lang:application_controller.rb
  before_filter :mobileapps?
  helper_method :mobileapps?
　（中略）
  def mobileapps?
    ua = request.env["HTTP_USER_AGENT"]
    if ua.include?('iosapp')　＃iosアプリ側でUserAgent内に立てたフラグの受け取り
        return true
      # print "iosapp Access"
    else
      # print "PC Access"
    end
  end
```

### 読み込むcssの指定

```lang:application.css
 *= require bootstrap
 *= require_directory ./pc
```

```lang:mobileapplication.css
 *= require bootstrap
 *= require_directory ./mobile
```


もっといい方法あると思いますが、
ひとまずこれで動いて☓印を退けられたので、一安心。
JenkinsジョブをAPI経由でパラメータ付きビルドする


JenkinsのジョブをAPI経由で呼び出すことは多々あると思いますが、ジョブにパラメータがセットされている場合の呼び出し方法をメモ。

## 環境情報(仮)

仮に環境は以下だったとします。

- Jenkinsホスト名
	- jenkins-host
- job名
	- job-test
- jobの実行ユーザとAPIトークン
	- testuser
	- api_token

## パラメータなしでのビルド

パラメータが不要なジョブを実行する場合は

```sh:non_parameter_job
$ curl -X POST --user testuser:api_token http://jenkins-host/job/job-test/build
```

で実行できます

## パラメータ付きでのビルド

一方、パラメータが必要なジョブを実行する場合ですが、QueryStringとして付与するほかに、URLの 'build' の部分を **buildWithParameters** に変更する必要があります。

- パラメータ名
	- no

だとすると

```sh:with_parameter_job
$ curl -X POST --user testuser:api_token http://jenkins-host/job/job-test/buildWithParameters?no=1
```

で 'no' に 1 を設定してジョブを実行できます。

:warning: パラメータをURLエンコードするのを忘れずに
Ansibleが複数ホストに対して並列に走らない


最近の Ansible は複数のホストに対してタスクを実行する際に並列で実行するようになっていて、並列数は `forks` で指定することができる。
しかし、並列に実行するよう設定しているにも関わらず、並列に動作しない場合があるので注意。

→ [How do I drive Ansible programmatically and concurrently?](http://stackoverflow.com/questions/17958949/how-do-i-drive-ansible-programmatically-and-concurrently)

Ansibleが `~/.ssh/known_hosts` にホストを見つけられない場合に、各タスクの実行毎にグローバルロックを取るようになっているため、このような現象が起こるらしい。
とりあえずの解決策としては、`~/.ansible.cfg` 等にknown hostsのチェックを無効化する設定を書いておけば良い。

~~~
host_key_checking = False
~~~
find_each にソートが効かない理由

## ActiveRecordで大量レコードを処理するとき
ActiveRecordで、複数レコードを処理するときには、allを使うと厳しい。

```rb
Employee.all.each {|row|
  p row #このあたりで何か処理をする
}
```

これだと、一度すべて配列に入って処理が行われる。データベースなんだから大量にレコードがあるかもしれない。あっという間にメモリを消費しちゃう。

## find_eachを使うといいと言う

そういう時のために、find_eachがある。

```rb
Employee.find_each(:batch_size=>2){|row|
  p row
}
```
バッチサイズはデフォルト1000で1000レコードずつ処理をする。1000レコードでもカラムの内容によっては重すぎるだろうから、適宜バッチサイズを小さくすると良い。サンプルではテストしやすいようにバッチサイズを2にしている。

## ところが、find_eachはソートが効かないという
ソートが効かないというが、なぜか。SQLをダンプをするとわかる。find_each(:batch_size=>2)　を流すとこういうSQLが流れている。

```sql
SELECT  `employees`.* FROM `employees` WHERE (`employees`.`id` > 22)  ORDER BY `employees`.`id` ASC LIMIT 2
```
つまりIDのカラムを使って、ページングっぽい動きをしている。IDでソートをして、最後に取得したIDよりも大きなレコードを、バッチサイズ分もらってきているというわけです。ソートが効かないけど、ID順であることは分かる。
【岩井さん勉強会#1】PC超初心者のための仕事効率化ツールやあれこれ

#0. Qiitaを始めることになった経緯
はじめての投稿になります。
僕の経歴とかはさておき、
Qiitaを始めることになった経緯を簡単に書きます。

僕は現在大学生の傍ら、株式会社CloudPaymentのインターン生として活動しています。
CloudPayment社では
新サービスのシステム結合テストやヘルプサイト作成を
主に担当させてもらっています。



システム関連企業にインターンに来てみたものはいいものの、
全くのweb・PC初心者。（エクセル、ワード、パワポが少しできるくらい）

それを見かねた隣の席の岩井さんが勉強会やろう！と言ってくれたのがきっかけです。
（詳しく書くと、稼げるアプリとか作りたいなーなんてネットサーフィンしてたら、
あれ？もしかしてアプリって作れるんじゃね？
岩井さんアプリってどうやって作るんですかーー！？ってなったのがきっかけ笑）

んで、「超初心者がアプリをつくる道のり」を記録に残そうということで、
Qiitaを活用することになりました。
（もちろんそれまでQiita自体の存在は知りませんでした（汗））

勉強会で得たこと感じたこと、
ソースコードやテスト結果など書き記していきたいと思います。

#1. 用語、コードなど改めておさらい
####1.1 そもそもHTMLってなに？
`HyperText Markup Language（ハイパーテキスト マークアップ ランゲージ）の略でウェブ上の文書を記述するためのマークアップ言語である。(wikipedia参照）`
らしいんですけど、最初はなにそれ？って感じでした（笑）

web上で文字とか飾りとか枠とか線とかありますよね。HTMLとは簡単にいうとそれです。
マークアップ言語とはコンピュータ言語の一種で（他にも言語がたくさんある）
マークアップ言語の中にもまたたくさん種類があるそうです。

HTMLの例だと、
`<h1>HTMLだよ</h1>
 <p>これが<em>HTML</em>というやつだよ。</p>`
こんな感じで <山カッコ>で囲ってある部分がタグと呼ばれるマークアップ命令で、
その間に挟まれている部分が実際の文書として表示されます。

####1.2 HTMLのコードを少し

<pre><pre>箱枠ができる</pre>
→`<pre>aaaaaa</pre>`</pre>

<em>斜め</em>になる
→`<em>aaaa</em>`
<b>太字</b>になる
→`<b>aaaa</b>`

など。

他にもツールによってそれぞれMarkdownがあることを教わりました。



#2.仕事効率化について
これからアプリ開発を進めるにあたって、スピードが速いにこしたことはない。
仕事も同じですよね。
同じことをやるにもやり方によって早く出来た方がそりゃいい。

まずは仕事を効率的に行おうということでツールやアドオンを教わりました。

###2.1 firefoxアドオン
#####2.1.1 ツリー型タブ
https://addons.mozilla.org/ja/firefox/addon/tree-style-tab/
#####2.1.2 Vimperator
https://addons.mozilla.org/ja/firefox/addon/vimperator/
#####2/1.3 Firebug
https://addons.mozilla.org/ja/firefox/addon/firebug/

###2.2 ツール
#####2.2.1 Pushbullet
https://itunes.apple.com/jp/app/pushbullet/id810352052?mt=8
#####2.2.2 Pocket
https://itunes.apple.com/jp/app/pocket/id309601447?mt=8
#####2.2.3 Skitch
https://itunes.apple.com/jp/app/skitch-cuoru-miaoki-rumu-gong/id490505997?mt=8
#####2.2.4 SublimeText
http://www.sublimetext.com/
#####2.2.5 iterm
http://iterm2.com/
#####2.2.6 The hit list
https://itunes.apple.com/jp/app/the-hit-list/id432764806?mt=12
#####2.2.7 Clear
https://itunes.apple.com/jp/app/clear-tasuku-todorisuto/id493136154?mt=8
#####2.2.8 GoogleKeep
https://chrome.google.com/webstore/detail/google-keep-notes-and-lis/hmjkmjkepdijhoojdojkdfohbdgmmhki?hl=ja
#####2.2.9 Gmail Labs
https://support.google.com/a/answer/117099?hl=ja

<hr>
ぐあーーーと羅列しましたが、一回で教わることが多くて
使いこなすのにちょっと時間が必要です(笑)

仕事効率化はもうほんと必須で、
例えばショートカットキーを全部覚えてしまう！とか。
ツールを使いこなせるように時間をかける、とか。

これは僕も本当に重要なことだと思っています。
慣れちゃってるからこれがいいやとか、マウスでカリカリとかより
導入に時間をかけて→それからの作業が早くできるの方が
長期的にみると時間短縮になるなと感じます。

ツールやアドオンは使ってみていいなと思ったら
また記事にUPしますね(^^)

#3. まとめ
初回の勉強会は
0. 「目的」と「経緯」と「記録の大切さ」の再確認
1. 「HTML」とツールによって違うMarkdownについて
2. 仕事効率化ツールの紹介

が主な内容でしたー！

あとは宿題で
・Xcodeのインストール
・Apple Developerに登録
・Xcode Command Line Toolsのインストール
を頂きましたが、Apple DeveloperのUnivercity登録の審査待ちの状態です(；´∀｀)やばい


初回はこのへんで。
ありがとうございます。
Androidのテストについて考える　AsyncTaskLoader編



備忘録的にAndroidの機能毎にオーソドックスなテストを書いていくシリーズです。
もっと効率的な方法ありましたら教えて下さい。


```AsyncTaskLoader.java
public class MyAsyncTaskLoader
        extends AsyncTaskLoader<List<MyAsyncTaskLoader.Model>>
{
	/**
	 * 便宜上Modelもクラス内クラスとする
	 */
    static public class Model
    {
        public int id;
        public String name;
        public String date;

        public int getId()
        {
            return id;
        }

        public String getName()
        {
            return name;
        }

        public String getDate()
        {
            return date;
        }
    }

    public MyAsyncTaskLoader(Context context)
    {
        super(context);
    }

    // 非同期処理の中身
    @Override
    public List<Model> loadInBackground()
    {
        ArrayList<Model> models = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            Model model = new Model();
            model.id = i;
            model.name = "Sato " + i;
            model.date = "2014-02-04 01:00:00";
            models.add(model);
        }
        return models;
    }
}

```

このAsyncTaskLoaderのユニットテストを書いてみる。


```AsyncTaskLoaderTest.java
public class MyAsyncTaskLoaderTest
    extends ActivityInstrumentationTestCase2<AsyncTaskLoaderActivity> {
  private AsyncTaskLoaderActivity mActivity;

  public MyAsyncTaskLoaderTest() {
    super(AsyncTaskLoaderActivity.class);
  }

  public void setUp() throws Exception {
    super.setUp();
    setActivityInitialTouchMode(false);
    mActivity = getActivity();
  }

  @Test
  public void testAsyncTaskLoader_GetItem() throws Exception {
    mActivity.runOnUiThread(new Runnable() {
      @Override
      public void run() {
        final CountDownLatch latch = new CountDownLatch(1);
        Loader loader = mActivity.getLoaderManager()
            .initLoader(0, null,
                new LoaderManager.LoaderCallbacks<List<MyAsyncTaskLoader.Model>>() {
                  @Override
                  public Loader<List<MyAsyncTaskLoader.Model>> onCreateLoader(int id, Bundle args) {
                    return null;
                  }

                  @Override
                  public void onLoadFinished(Loader<List<MyAsyncTaskLoader.Model>> loader,
                      List<MyAsyncTaskLoader.Model> data) {
                    MyAsyncTaskLoader.Model model = data.get(0);
                    assertEquals(0, model.getId());
                    assertEquals("Sato 0", model.getName());

                    latch.countDown();
                  }

                  @Override
                  public void onLoaderReset(Loader<List<MyAsyncTaskLoader.Model>> loader) {

                  }
                });

        loader.forceLoad();
        boolean res = false;
        try {
          res = latch.await(10, TimeUnit.SECONDS);
        } catch (Exception e) {
          throw new RuntimeException(e);
        }
        assertTrue(res);
      }
    });
  }
}
```

ポイントは `CountDownLatch.await`で非同期処理が終わるのを待つこと。
`getInstrumentation().waitForIdleSync();`だとダメでした。
格子状の動く背景を作ってみる



## 概要

同じ画像を格子状でリピート表示され、それが斜め上とかに永遠に動いている。
そんな背景を作ってみる。


## 環境

- cocos2d-x v3.3


## 格子状の動く背景を作る

### 画像を用意する

2の階乗のサイズで用意する。

### GL_REPEATを使ってしきつめる

```cpp
auto director = Director::getInstance();
const auto vs = director->getVisibleSize();
const auto vo = director->getVisibleOrigin();

// テクスチャを生成
Texture2D *texture = Director::getInstance()->getTextureCache()->addImage("bg.png");

// テクスチャのパラメータを生成
const Texture2D::TexParams tp = {GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_REPEAT};

// テクスチャのサイズ設定用のRectを生成
// - 画面サイズに画像サイズを縦横に1個分ずつ追加する（アニメーションさせるため）
auto rect = Rect(0.0f, 0.0f, vs.width, vs.height);
rect.size.width += texture->getContentSize().width;
rect.size.height += texture->getContentSize().height;

// Spriteを生成
// - 画面の下と右に画像1個分はみ出すように配置する
_bg = Sprite::createWithTexture(texture, rect);
_bg->setAnchorPoint(Vec2::ANCHOR_BOTTOM_LEFT);
_bg->getTexture()->setTexParameters(tp);
_bg->setPosition(Vec2(vo.x, vo.y - texture->getContentSize().height));
addChild(_bg, 0);
```

### updateで動かす

```cpp
auto director = Director::getInstance();
const auto vs = director->getVisibleSize();
const auto vo = director->getVisibleOrigin();

// 位置を左上に動かす
// 画像1個分以上移動していたら最初の位置に戻す
{
    auto pos = _bg->getPosition();
    pos += Vec2(-0.5f, 0.5f);
    
    auto diff = pos - vo;

    if (fabsf(diff.x) >= _bg->getTexture()->getContentSize().width) {
        pos = Vec2(vo.x, vo.y - _bg->getTexture()->getContentSize().height);
    }
    
    _bg->setPosition(pos);
}
```


## 参考

- [cocos2d-xで画像をシーンの背景にリピート表示](http://qiita.com/_rdtr/items/f3e4cd50bc78d21efc05)
Arduinoはじめるにあたって見たサイト

Amazon「Arduinoをはじめようキット」
http://www.amazon.co.jp/dp/B0025Y6C5G

Arduino vs. Raspberry Pi：あなたにぴったりのDIYプラットフォームはどっち?
http://readwrite.jp/archives/7827

初心者でもわかる・できる！Arduinoを使った初めての電子工作実践
http://html5experts.jp/youtoy/12029/

JavaScriptでも制御できる！ Arduinoの基礎知識
http://www.atmarkit.co.jp/ait/articles/1405/21/news033.html
Doctrine DBALの基本的な使い方


公式ドキュメントを参考に基本的な使い方をまとめる。

http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/index.html

## 接続

```php
$conn = \Doctrine\DBAL\DriverManager::getConnection([
    'path'   => './dbal-demo.sqlite',
    'driver' => 'pdo_sqlite',
]);
```

各DBごとにパラメータが違う。詳しくはドキュメントを参照:
http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connection-details

## SQL実行

参考:
http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/data-retrieval-and-manipulation.html

### 直SQL

#### 基本

```php
$statement = $conn->executeQuery('SELECT * FROM users WHERE id = ?', [1]);
$user = $statement->fetch();
/*
[
    "id"   => "1",
    "name" => "bob"
]
*/
```

第三引数でパラメータの型を「配列」と指定してあげれば、IN句に配列を渡すことが出来る。
（他のメソッドでもだいたい最後の引数で指定できるみたい）

```php
$conn->fetchAll(
    'select * from users WHERE id IN (?)',
    [[1, 2]],
    [\Doctrine\DBAL\Connection::PARAM_INT_ARRAY]
);
```

#### update

```php
$count = $conn->executeUpdate('UPDATE users SET name = ? WHERE id = ?', ['smith', 1]);
echo $count; // 1
```

### insert

```php
$conn->insert('users', ['id' => 2, 'name' => 'mike']);
```

### update

```php
$conn->update('users', ['name' => 'smith'], ['id' => 1]);
```

### delete

```php
$conn->delete('users', ['id' => 1]);
```

### select

#### 複数

```php
$conn->fetchAll('SELECT * FROM users');
/*
[
    [
        "id"   => "1",
        "name" => "bob"
    ],
    [
        "id"   => "2",
        "name" => "mike"
    ]
]
*/
```

#### 一件

```php
$user = $conn->fetchAssoc('SELECT * FROM users WHERE id = ?', [1]);
/*
[
    "id"   => "1",
    "name" => "bob"
]
*/
```

#### カラム指定

```php
$name = $conn->fetchColumn('SELECT name FROM users WHERE id = ?', [1]);
echo $name; // "bob"
```

## クエリログ

DB接続時にConfiguration経由でSQLLoggerのインスタンスを渡す。

```php
$logger = new \Doctrine\DBAL\Logging\DebugStack();
$config = new \Doctrine\DBAL\Configuration();
$config->setSQLLogger($logger);
$conn = \Doctrine\DBAL\DriverManager::getConnection([
    'path'   => './dbal-demo.sqlite',
    'driver' => 'pdo_sqlite',
], $config);
```

もしくはあとから設定。

```php
$logger = new \Doctrine\DBAL\Logging\DebugStack();
$conn->getConfiguration()->setSQLLogger($logger);
```

クエリを実行したあと、queriesプロパティにログがたまっている。

```php
$conn->fetchAll(
    'select * from users WHERE id IN (?)',
    [[1, 2]],
    [\Doctrine\DBAL\Connection::PARAM_INT_ARRAY]
);

$conn->getConfiguration()->getSQLLogger()->queries;
/*
[
  1 => [
    "sql"         => "select * from users WHERE id IN (?)",
    "params"      => [
      [
        1,
        2
      ]
    ],
    "types"       => [
      101
    ],
    "executionMS" => 0.0022280216217041
  ]
]
*/
```


## まとめ

- "便利なPDO"として使えそう
- ややこしい機能は省略した
  - 型のバインディング
  - スキーマ管理
  - シャーディング
  - など
SHOW CREATE TABLE したら panic: sql: expected 4 destination arguments in Scan, not 2 と言われる

データベース上の全てのテーブルの `CREATE TABLE` 文を取得するようなコードを書いていました。
`CREATE TABLE` の取得は以下のような感じ。

```go
var tbl string
var ddl string

err := conn.QueryRow(fmt.Sprintf("SHOW CREATE TABLE `%s`", tableName)).Scan(&tbl, &ddl)
```

`SHOW CREATE TABLE` は 2 列の結果を返すので、こんな感じの実装になりました。

ところがこれを実行してみると、データベースによっては以下のようなエラーが出ることがわかりました。

```
panic: sql: expected 4 destination arguments in Scan, not 2
```

エラーメッセージ的には、引数は 2 つじゃなくて 4 つ必要だよ、というものです。
どういうことだろうと調べてみたところ、エラーが出るのは [ビュー](http://dev.mysql.com/doc/refman/5.7/en/create-view.html) を対象にしたときであることがわかりました。
ビューは `SHOW CREATE TABLE` に対して 4 列の結果を返すようです。

今回はビューを無視することで対処しましたが、`SHOW CREATE TABLE` を実行するときはテーブルとビューを区別して行う必要があるようです。
BitSetを用いて、累乗計算をする

# <i class="fa fa-barcode" style="font-size:1em;"></i> BitSetとは
手前味噌ですが。以下の記事参照
[ISO8583で定義されたビットマップの生成](http://qiita.com/FScoward/items/07c6bce83f4ef8678d4b)

# <i class="fa fa-circle-o" style="font-size:1em;"></i> 再帰で計算
ByteBufferを
```
val bitSet = util.BitSet.valueOf(buffer3)
```
でBitSetに置き換えて、ビットの立っているものだけ演算します。

```scala
/**
     * @param base 基数
     * @param bitSet ビットセット
     * @param count 冪数
     * @param total 合計
     * */
    @tailrec
    def calc(base: Double, bitSet: util.BitSet, count: Int, total: Double = 0): Double = {
      if(count != 0) {
        val ret = bitSet.get(bitSet.length() - count) match {
          case true => Math.pow(base, count) // 累乗
          case false => 0
        }
        
        println(s"base: $base, count: $count, total: ${total + ret}")

        calc(base, bitSet, count - 1, total = total + ret)
      } else {
        total
      }
    }
```

# <i class="fa fa-child" style="font-size:1em;"></i> 使ってみる

## <i class="fa fa-file-code-o" style="font-size:1em;"></i> BitSetの値
```
00000000000000000100010
```

```scala
calc(2, bitSet, bitSet.length())
```

## <i class="fa fa-history" style="font-size:1em;"></i> 実行結果
```
base: 2.0, count: 22, total: 0.0
base: 2.0, count: 21, total: 0.0
base: 2.0, count: 20, total: 0.0
base: 2.0, count: 19, total: 0.0
base: 2.0, count: 18, total: 0.0
base: 2.0, count: 17, total: 0.0
base: 2.0, count: 16, total: 0.0
base: 2.0, count: 15, total: 0.0
base: 2.0, count: 14, total: 0.0
base: 2.0, count: 13, total: 0.0
base: 2.0, count: 12, total: 0.0
base: 2.0, count: 11, total: 0.0
base: 2.0, count: 10, total: 0.0
base: 2.0, count: 9, total: 0.0
base: 2.0, count: 8, total: 0.0
base: 2.0, count: 7, total: 0.0
base: 2.0, count: 6, total: 0.0
base: 2.0, count: 5, total: 32.0
base: 2.0, count: 4, total: 32.0
base: 2.0, count: 3, total: 32.0
base: 2.0, count: 2, total: 32.0
base: 2.0, count: 1, total: 34.0
34.0
```

# <i class="fa fa-paw" style="font-size:1em;"></i> 終わりに
適当に書いたのでもっと良く出来そうだとは思う。 _(┐「ε:)_
「俺ならこう書くぜ！」ってのがあれば教えて下さい。•ू(ᵒ̴̶̷ωᵒ̴̶̷*•ू) ​ )੭ु⁾
docker runの--rmオプション(コンテナ終了時にコンテナ自動的に削除)べんりです

`sudo docker run -i -t ubuntu /bin/bash`
みたいなコマンドで遊ぶと思いますが、何度もやると、終了したコンテナがいっぱい溜まってしまうので、（いっぺんに消す方法はググればいっぱい出てきます。）毎度コンテナが消えてもいいという人は、rmオプション(コンテナ終了時にコンテナ自動的に削除)というのがあるので、遊ぶ際はこれと併用するといいと思います
``sudo docker run -it --rm ubuntu /bin/bash``
Qiita のストック一覧RSSを作成し、さらに全文RSSを作成する

## Qiita のストック一覧RSSを作成

[Qiitaのストック一覧をRSS化する方法 - Qiita](http://qiita.com/typista/items/35ddedc4c8cdec989857)

ストック一覧URLは `http://qiita.com/[username]/stock` です。これを [RSS Creater](http://rssc.dokoda.jp/) に入力します。上の記事の方法は古いようで、[RSS Creater](http://rssc.dokoda.jp/) での、XPath の指定を変える必要がありました。

```
//div[@class='publicItem_body']/h1/a
```

## 全文RSS
上で作ったRSSは、「タイトル」と「URL」だけなので、URLから全文化してくれるサービスを使います。
全文化は、[Full Text RSS Feed](http://fulltextrssfeed.com/) というサービスを使います。上で作ったRSSのURLを入れるだけ。簡単です。

## 今後の変更については
- Qiita のストック一覧ページのHTML構成に依存してます。
- [RSS Creater](http://rssc.dokoda.jp/), [Full Text RSS Feed](http://fulltextrssfeed.com/) についても依存中。
- API か何かで出来ないものか…
reapp = React + Webpack + ES6


CLIから、さくさくモバイルWebアプリケーションが作れる[reapp](http://reapp.io/)かっこいいなー、と思って眺めていたら、Reactのお手本集みたいな感じなので、メモ。

- https://github.com/reapp/reapp-ui/tree/master/components

ここに、UIコンポーネントがまとまっています。


![Reapp - Hybrid apps, fast.png](https://qiita-image-store.s3.amazonaws.com/0/1858/f57efe9e-1937-d3e1-24e6-f385e7417aee.png "Reapp - Hybrid apps, fast.png")

そのうち、これをRiot.jsにポートすれば良いんだろうか...
Raspberry PIでFeliCaモジュールからidmを読む

## はじめに

Raspberry PiでFeliCaのidmを読みたかったのですが、
手元のPaSoRiはlibpafeの未対応のRC-S380でした。
なのでFelicaモジュールからidmを読み込むようにしました。

この記事では次のようなことをしています。

- Raspberry Piを使います
- OSはRaspbianを使います
- FelicaモジュールはRC-S620Sを使用します
- Arduino UnoをRC-S620Sのドライバ代わりに使用します
- Raspberry Piでidmを読めるようにすることが目標です
- 値の読み出しのみでWebに連携するなどは行なっていません

![image](https://qiita-image-store.s3.amazonaws.com/0/55138/d9568202-7f10-ed64-2d47-9dd6e1aa307e.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/55138/65f9e77b-c05a-23c6-2af4-1d3bc1989290.png)


## FeliCa リーダー・ライター RC-S620S
ArduinoでFeliCaを読めるようになるモジュールです。
サンプルコードは何故かArduinoのD0(RX)とD1(TX)に接続していて、UARTが塞がってしまっています。
また接続先をSoftwareSerialに書き換えると動かなかったのでハードウェア的に罠が多そうです。
さらにArduino Leonardoではサンプルコードは動作しませんでした。
かなり癖のあるモジュールのようです。

サンプルコードを書き換えれば直接Raspberry Piからでも動かせそうですが、
Arduino Unoを間に挟んだほうが無難そうです。
（サンプルコードを書き換えたものはライセンス的に引っかかって公開できなさそう）


### 参考サイト
- [FeliCa リーダー・ライター RC-S620S](https://www.switch-science.com/catalog/353/)
- [「Arduino向けRC-S620/S制御ライブラリ」　ダウンロードページ](http://blog.felicalauncher.com/sdk_for_air/?page_id=2699)
- [RC-S620/S 技術資料](http://www.sony.co.jp/Products/felica/business/tech-support/index.html#Port)


## アプローチと配線

RC-S620SとArduino Unoはサンプルコードで指定されている通りに接続します。
Arduino UnoとRaspberry PiはSoftwareSerialで接続します。
Arduino Unoには弄ったサンプルコードを入れます。Push処理を消して、読み取ったidmをSoftwareSerialに出力させるように変えます。
Raspberry PiのGPIOのUARTにArduino UnoのSoftwareSerialに指定したピンを接続します。

![image](https://qiita-image-store.s3.amazonaws.com/0/55138/e65ae14f-cd6f-7f17-35d0-9916f255e48f.png)


## Raspberry Piの設定
RaspbianのUARTは標準でシリアルコンソールに設定されているため、そのままでは普通のUARTとして使用できません。
設定を書き換える必要があります。

### /boot/cmdline.txtの修正
次のコマンドで

```bash
$ sudo vi /boot/cmdline.txt
```
次のように書き換えます。

```bash
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait
```

↓

```bash
dwc_otg.lpm_enable=0 rpitestmode=1 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 rootwait
```

### /etc/inittabの修正
次のコマンドで

```bash
$ sudo nano /etc/inittab
```

次の行をコメントアウトします。

```bash
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
```


### 参考サイト
- [Raspberry PiでUART、シリアル通信](http://nanicananica.blog.fc2.com/blog-entry-14.html)
- [Using the Raspberry Pi’s serial port](http://www.irrational.net/2012/04/19/using-the-raspberry-pis-serial-port/)


## 動作確認
```bash
$ cu -s 9600 -l /dev/ttyAMA0 
Connected.
01290001xxxxxxxx   ←タッチすると読み込まれたカードのidmが表示される
01120212xxxxxxxx
01160500xxxxxxxx
01100A10xxxxxxxx
```

## おわりに
できたといっていいのか怪しいですが、Raspberry Piでidmが読めました。
正直libpafeに対応したPaSoRiを買ってきたほうが早いような気がします。
間にArduinoを挟まずにできたらもう少しスッキリするので、その辺りは今後の課題ということにします。
Bootstrap3 のレイアウト周りで大切なところメモ


http://getbootstrap.com/css/

## グリッドシステム

12カラムのグリッドレイアウトを使用していて、`.col-xs-12 .col-md-8`, `.col-xs-12 .col-md-4`などと使う。
基本的に小さい方の設定が大きい方に伝搬していく設計になっており、`col-md-*`は`col-lg-*`が指定されてない限り`lg`に当たるような大きいデバイスでも適用される。

<table class="table table-bordered table-striped">
      <thead>
        <tr>
          <th></th>
          <th>
            Extra small devices
            <small>Phones (&lt;768px)</small>
          </th>
          <th>
            Small devices
            <small>Tablets (≥768px)</small>
          </th>
          <th>
            Medium devices
            <small>Desktops (≥992px)</small>
          </th>
          <th>
            Large devices
            <small>Desktops (≥1200px)</small>
          </th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <th class="text-nowrap" scope="row">Grid behavior</th>
          <td>Horizontal at all times</td>
          <td colspan="3">Collapsed to start, horizontal above breakpoints</td>
        </tr>
        <tr>
          <th class="text-nowrap" scope="row">Container width</th>
          <td>None (auto)</td>
          <td>750px</td>
          <td>970px</td>
          <td>1170px</td>
        </tr>
        <tr>
          <th class="text-nowrap" scope="row">Class prefix</th>
          <td><code>.col-xs-</code></td>
          <td><code>.col-sm-</code></td>
          <td><code>.col-md-</code></td>
          <td><code>.col-lg-</code></td>
        </tr>
        <tr>
          <th class="text-nowrap" scope="row"># of columns</th>
          <td colspan="4">12</td>
        </tr>
        <tr>
          <th class="text-nowrap" scope="row">Column width</th>
          <td class="text-muted">Auto</td>
          <td>~62px</td>
          <td>~81px</td>
          <td>~97px</td>
        </tr>
        <tr>
          <th class="text-nowrap" scope="row">Gutter width</th>
          <td colspan="4">30px (15px on each side of a column)</td>
        </tr>
        <tr>
          <th class="text-nowrap" scope="row">Nestable</th>
          <td colspan="4">Yes</td>
        </tr>
        <tr>
          <th class="text-nowrap" scope="row">Offsets</th>
          <td colspan="4">Yes</td>
        </tr>
        <tr>
          <th class="text-nowrap" scope="row">Column ordering</th>
          <td colspan="4">Yes</td>
        </tr>
      </tbody>
    </table>

この中で、実は大事なのが`Column width`の値。

レイアウトをする時、1:2 で分けたいみたいなときは`col-md-4`, `col-md-8`の様に1:2で分ければいいだけだが、
実際にあるのは、左側に160pxのものを配置して、後の右側は自由に使えば良いみたいときは、`160< 81*2`なので、`col-md-2`を左に確保すれば良い。後は右は合わせて10になるようにうまく確保するということになる。

以下のように、`.row`を使うとNestすることが出来る

```
<div class="row">
  <div class="col-sm-9">
    Level 1: .col-sm-9
    <div class="row">
      <div class="col-xs-8 col-sm-6">
        Level 2: .col-xs-8 .col-sm-6
      </div>
      <div class="col-xs-4 col-sm-6">
        Level 2: .col-xs-4 .col-sm-6
      </div>
    </div>
  </div>
</div>
```
Merakiハンズオンセミナー知らなかった事メモ


## もしも、Merakiクラウドに障害があった場合

### できる

- ネットワークアクセス
- ネットワークポリシー

### できない

- APの設定変更
- 最新の利用情報などの統計情報参照
- スプラッシュページなどMerakiでの認証関係

## アクセス可能なアプリケーションの制御

L3(IPで指定)とL7(アプリケーションやカテゴリを指定)がある。

- メール、ゲームなどの接続を制限
- 独自にカスタマイズ可能

カテゴリを選ぶ。Youtubeと言った選択もできる。
ただし、Denyを選んでいく感じ。デフォルトDenyでAllowを選ぶのはできない。

## エアマーシャル
 - アクセスポイントへの攻撃を検知、遮断
 - 不正アクセスポイントの追加を検出・排除

## メール配信

- アクセスポイントが応答しなくなって10分 など障害時にメールを飛ばすことが出来る
- Weekly/Monthlyレポートを飛ばすことも出来る

## LED表示

オレンジ点灯: 起動中 (オレンジ点灯が続く場合はハードウェアに問題あり）
レインボー: スキャンして初期化中
ブルー点滅: ファームウェアのアップグレード中
グリーン点灯: Gateway mode で動作しており、クライアントの接続がない
ブルー点灯: Gateway mode で動作しており、クライアントが接続している
オレンジ点灯: エラー (Gatewayが間違っている。もしくはRoutingに問題がある可能性がある)

## メッシュについて

- 近くにあるMerakiを同じ電波帯域で設定するとメッシュを組める
- 干渉はもちろんするが、同じ電波帯で応答しないといけないのでしかたない

## DFS Detectedについて

DFSとは、気象レーダーとかが出している電波で、それを受信したら指定された周波数の電波は発してはいけないとなっている。5GHz帯の数字が上の方の4個はこれを受ける可能性があるらしい。

ネットワークが切れていたのはMerakiは律儀にこの電波法に従っていたので受信のたびにネットワークが切れていた。

DFSについての詳細はここ
http://www.cisco.com/c/en/us/td/docs/routers/access/3200/software/wireless/3200WirelessConfigGuide/RadioChannelDFS.html
最少のタイピングで部分適用を書く

scala学習中です。こちらだと部分適用が非常に簡単に書けますね。

```scala
def sum(a: Int, b: Int, c: Int) = a + b + c

val a = sum(1, _: Int, 3)
println( a(2) )
```

swiftでもこのくらい簡単に書けたらいいのに…

と思った瞬間、ふと気が付きました。
よく考えてみるとswiftでも同じくらい簡単に部分適用が書けます。

```swift
func sum(a: Int, b: Int, c: Int) -> Int {
    return a + b + c
}

let a = { sum(1, $0, 3) }
println( a(2) )
```


なぜかswiftリリース以来ずっと気がつかなかったのでメモしておきます。
WindowsでChromiumをビルドしてみる


## 背景

Chromeのバグを踏んだので、デバッガで見てみたくなった。
具体的には、marqueeタグのDOMのパースに失敗する不具合があり、Railsでturbolink経由でmarqueeタグを含むページに遷移すると表示が停止した。今日(2015/02/11)時点でChromiumでも発生するのでChromiumをビルドしてみた。

## 環境構築

基本的には公式サイトの手順をなぞるだけ。追加でWDKを入れる等の作業は不要。
http://www.chromium.org/developers/how-tos/build-instructions-windows
https://code.google.com/p/chromium/wiki/NinjaBuild
https://code.google.com/p/chromium/wiki/CommonBuildTasks

1. Visual Studio 2013 Community Update 4をインストールする(MFCありにすること)
2. depot_toolsを展開する(エクスプローラで展開する場合は右クリックメニューの「全て展開」を使うこと)
2. depot_toolsのパスをPATHに追加する
3. コマンドプロンプトを開く
3. 環境変数を設定する(以下参照。set DEPOT_TOOLS_WIN_TOOLCHAIN=0 ...)
4. 作業ディレクトリに移動
5. fetch chromium
6. (Still working onが表示されるので1時間くらい待つ)

(途中「git.batは内部コマンド〜」みたいなのが表示される)
以上でsrcディレクトリができているはず。

## 環境変数

日本語環境だとVC++(cl.exe)のcodepageが932固定で、BOMのないUTF-8のファイルをCP932としてコンパイルしようとしてwarningになるが、warningをエラーにするオプション(/WX)が指定されているためビルドに失敗する。そのため/WX-を追加した。

* DEPOT_TOOLS_WIN_TOOLCHAIN=0
* GYP_DEFINES=component=shared_library
* CPPFLAGS=/WX-
* GYP_GENERATORS=ninja,msvs-ninja

## 追加

Pythonが正しく動作しないので、以下のファイルを追加する。

```python:depot_tools\python276_bin\Lib\site-packages\sitecustomize.py
import sys
sys.setdefaultencoding("cp437")
```

## 修正

一カ所、UTF-8文字でコメントが終わっている部分を削除する。
src\third_party\pdfium\fpdfsdk\include\fxedit\fxet_list.hの177行目から3行。

## ビルド

* cd src
* ninja -C out\Debug chrome.exe

成功するとsrc/out/Debug/chrome.exeが生成される。
ビルドエラーが出るときはninja -v -C out\Debug chrome.exeで実行しているコマンドを見る。

## 実行

以下参照。
http://www.chromium.org/developers/how-tos/debugging-on-windows
chromeは複数のプロセスを起動するが、どこで止めるかわからないので、
chrome.exe --single-process
で起動する。現在は非推奨のオプションらしいが、これにより単体のプロセスで起動する。
適当なプロジェクト、または、src/chrome/chrome.slnを開く。
デバッグメニューからプロセスへアタッチを選び、x86のchrome.exeにアタッチする。
chrome.slnを開いたときには5分くらい待たされるので注意。

以下のページを開き、リンクを踏むとv8の中のASSERTで停止する(かもしれない)
https://hello-marquee.herokuapp.com/debug

## 参考

* ChromiumのWindowsビルドがいつの間にか超絶簡単になっていた件
http://cygx.mydns.jp/blog/?arti=477

* Depot tools fails to download Win8 SDK when user name contains non-ASCII characters.
https://code.google.com/p/chromium/issues/detail?id=391544
ECTテンプレート

# ECTとは？
テンプレートエンジンです．

公式サイト
[ECT - Fastest JavaScript template engine with CoffeeScript syntax](http://ectjs.com/)

ECTの凄さは他の方が書かれた記事が優れているのでそちらをご覧になったほうがいいかと．
[ectの検索結果 - Qiita](http://qiita.com/search?utf8=%E2%9C%93&sort=rel&q=ect&sort=rel)

# テンプレート
```html:layout.ect
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <meta name="keywords" content="<%- @keywords %>">
  <meta name="description" content="<%- @description %>">
  <meta property="og:type" content="<%- @og_type %>">
  <meta property="og:title" content="<%- @title %>">
  <meta property="og:image" content="<%- @og_image %>">
  <meta property="og:url" content="<%- @og_url %>">
  <meta property="og:description" content="<%- @description %>">
  <meta property="og:site_name" content="<%- @og_site %>">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
  <link rel="shortcut icon" href="/favicon.ico">
  <link rel="apple-touch-icon" href="/apple-touch-icon.png">
  <% include 'style' %>
  <title><%- @title %></title>
</head>
<body>
  <% content %>
  <% include 'script' %>
</body>
</html>
```
```html:style.ect
<link rel="stylesheet" href="stylesheets/normalize.css">
<link rel="stylesheet" href="stylesheets/style.css">
<% content 'style' %>
```
```html:script.ect
<script src="javascripts/main.js"></script>
<% content 'script' %>
```

# 使用例
例えばindex.ectで使用する場合は

```html:index.ect
<% extend 'layout' %>
  <div class="wrapper">
    <header role="banner">
      <h1></h1>
    </header>
    <main role="main">
    </main>
    <footer role="contentinfo">
    </footer>
  </div>
```
Go言語のプログラムをgitで管理する時に便利なこと


## Go言語のプログラムをgithubなどにpushする前に必要なことは？
Go言語のプログラムを編集した後、git pushする前にやっておかないといけないのが、go fmtとgo vetですね。正直、私も毎回忘れてしまうんですね。ということで、gitのpre-commitフックを使って、commit前に自動的にやってくれるようにしてみました。

## 今回のコード

```bash:.git/hooks/pre-commit
#!/bin/sh
DIR="<your golang project path>"
PKG=("controller" "model" "body")
ret=0

for name in ${PKG[@]}
do
	goapp fmt ${DIR}/${name}
	ret=$?
	if [ $ret != 0 ]
	then
		exit $ret
	fi

	goapp vet ${DIR}/${name}
	ret=$?
	if [ $ret != 0 ]
	then
		exit $ret
	fi
done

exit $ret
```

ソースコードは、goappコマンドを使っていますので、GAE/Goのプロジェクトで利用していますが、goのプロジェクトの時は、goコマンドに変更すれば問題なく利用できます。

## 忘れないように！

私はずっと忘れていました。実行権限をつけることを…。

```bash:コマンド
chmod +x .git/hooks/pre-commit
```

実行権限がないと実行しないようなので、ちょっと残念でした。
（権限チェックとかしてくれないんだろうか…）

## 導入後
かなり便利になりました。見落としていた所をWarningをだしてくれるので、全て修正してからcommitをすることができるようになりました。
これで、コードの書き方とかで問題が出ることは無くなりそうです（？）

## 問題点
* 毎回、.git/hooks/pre-commitを作らないといけないこと。これはしかたがないかな…？
* go fmtもgo vetもビルド可能なgoファイルがないと実行できないので、パッケージ（ディレクトリ名）を列挙しないといけない。ちょっと面倒かも？
* チーム開発になったら、全員に配布されるんだろうか…？

## Disclaimer
* この記事は個人的なものです｡私の雇用者とは全く関係はありません｡（一応つけておきます）