OmniAICreator/Qiita-1.07M huggingface dataset:
フォントからUnicode符号の一覧をコマンドラインで取得する


## 概要

ttfファイルから利用可能な文字とそのUnicode符号の一覧を抽出します。

## ユースケース

- ImageMagickなどでアイコンフォントから画像を生成したいが、アイコンに対応するUnicode符号がわからない。
- OSXのFontbookなどで各文字のUnicode符号は閲覧できるが、一覧が取得できずに困っている。

## インストール

	pip install fonttools

## 使い方

	ttx -t cmap [フォント名.ttf]

フォント名.ttxが出力されます。

### 例

GitHubのアイコンフォント[Octicons](https://github.com/github/octicons)で使ってみます。


実行

	ttx -t cmap octicons.ttf

出力例


`code`の`0x`の後ろがUnicode符号の`U+`の後ろの部分です。`name`がどのアイコンに対応するかはWebで`octicons.css`使う際の説明を見るとわかります。

```xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="2.4">

  <cmap>
    <tableVersion version="0"/>
    <cmap_format_4 platformID="0" platEncID="3" language="0">
      <map code="0x0" name=".notdef"/><!-- &lt;control> -->
      <map code="0x2665" name="heart"/><!-- BLACK HEART SUIT -->
      <map code="0x26a1" name="zap"/><!-- HIGH VOLTAGE SIGN -->
      <map code="0xf000" name="light-bulb"/><!-- Private Use -->
      <map code="0xf001" name="repo"/><!-- Private Use -->
      <map code="0xf002" name="repo-forked"/><!-- Private Use -->
      <map code="0xf005" name="repo-push"/><!-- Private Use -->
      <map code="0xf006" name="repo-pull"/><!-- Private Use -->
				略
      <map code="0xf0d4" name="plug"/><!-- Private Use -->
      <map code="0xf0d6" name="circuit-board"/><!-- Private Use -->
      <map code="0xf0d7" name="mortar-board"/><!-- Private Use -->
      <map code="0xf0d8" name="law"/><!-- Private Use -->
      <map code="0xf27c" name="device-desktop"/><!-- Private Use -->
    </cmap_format_4>
  </cmap>

</ttFont>
```

- FontTools(ttx)はフォントテーブルの置き換えもできます。Octiconsはアイコンが普段使わない文字にマップされているのでアルファベットなど入力しやすい文字に置き換えるとImageMagickでの取り扱いが楽かもしれません。


## その他

PythonやRubyでも取得できるようです。

- [Finding out what characters a font supports](http://stackoverflow.com/questions/4458696/finding-out-what-characters-a-font-supports):Pythonで使う。
- [Programmatically get a list of characters a certain .ttf font file supports](http://stackoverflow.com/questions/11895641/programmatically-get-a-list-of-characters-a-certain-ttf-font-file-supports):Ruby用のライブラリ。
Heroku に Goji/PostgreSQL で作った Web アプリをデプロイ

[Goji](https://github.com/zenazn/goji) というのは Go の Web アプリケーションフレームワークです。
機能的には薄めですが、標準の `net/http` と違ってメソッドベースでのルーティングもでき、Ruby の Sinatra みたいなノリで使えると思います。

この記事では Goji で PostgreSQL にアクセスする Web API を作って、Heroku にデプロイします。

## 構成

* Go v1.4
    * WAF: Goji v0.8.1
    * ORM: Gorp v1.7
* PostgreSQL v9.4.0

## 作るもの

持ち物リストアプリのための RESTful な JSON Web API
(アプリの方も Swift で作って正月休み中に動かしたい)

## できたもの

[yuya-takeyama/bali-api](https://github.com/yuya-takeyama/bali-api)

記事執筆時点でのコミットは[こちら](https://github.com/yuya-takeyama/bali-api/tree/b567ccbce3d8b0e3f62ead5a8465189e9d0cf91a)から

とりあえず自分の環境で動かしたい、という方のために Heroku Button も用意しています。

## PostgreSQL への接続

Gorp の使い方それ自体への説明は省略します。
Heroku で `heroku-postgresql` のアドオンを使用する場合は、環境変数 `DATABASE_URL` にデータベースへの URL がセットされるので、それをそのまま利用するようにします。

```go
db, err := sql.Open("postgres", os.Getenv("DATABASE_URL"))
```

今回 Gorp という ORM を使っていますが、Gorp は標準の `database/sql` をラップしたものなので、`sql.Open()` で環境変数 `DATABASE_URL` を使うことだけ気をつければ、その他の ORM でも同じやり方でできると思います。

この場合、ローカルでの接続は以下のようになります。

```
$ DATABASE_URL=postgres://yuya@localhost/bali_api_development?sslmode=disable go run main.go
```

ユーザ名やデータベース名等についてはそれぞれの環境のものを指定してください。
私の場合は Homebrew でインストールしたものを使っており、以下の記事を参考にしました。

`sslmode` については、ローカルで使っているものは SSL が有効でなかったので disable としましたが、`heroku-postgres` においては `sslmode=require` となっているようです。

* [Homebrewを使ったPostgreSQLのインストール(Mac OS Lion)](http://qiita.com/tstomoki/items/0f1a930bd42a8e1fdaac)

## Heroku へのデプロイ

### Buildpack を使ったデプロイ

Go 用の Buildpack を使った一般的なデプロイの手順については以下の記事を参考にしました。

* [Goで作ったアプリをherokuに上げるときのメモ](http://yosuke-furukawa.hatenablog.com/entry/2014/02/13/015751)

### Goji の場合

Goji 特有の事情としては、ポート番号の指定をどうするか調べる必要がありましが、結論から言うと何も気にせずとも問題ありませんでした。

Goji はデフォルトでは 8000 版のポートでリッスンしますが、環境変数 `PORT` がセットされていればそちらを使うようになります。
Heroku においては環境変数 `PORT` がセットされるようになっているので、勝手に正しいポートが選択されるようになります。

# まとめ

Goji と Gorp (というか `github.com/lib/pq`) は Heroku フレンドリーな作りとなっており、簡単に Heroku にデプロイできました。
go langでjpgからwebpに変換する


# 概要
go langでjpg形式のファイルをwebpに変換する。
 
# 前準備
 
> go get  github.com/chai2010/image

# 調査内容
[サンプル](https://github.com/chai2010/image)だと、jpgファイルからwebpファイルに変換しているのだが、ファイルを経由して処理したくはないので、go lang が提供するインタフェースで使えるかを調査した。

# 内容
``` jpgを読み込んでwebpに出力する部分

package webp

import (
	"image"
	"io"

	ImageExt "github.com/chai2010/image"
	_ "github.com/chai2010/image/jpeg"
	_ "github.com/chai2010/image/webp"
)

type Options struct {
	Lossless bool
	Quality  float32
}

func Decode(r io.Reader) (image.Image, error) {
	m, _, err := ImageExt.Decode(r)

	if err != nil {
		return nil, err
	}

	return m, err

}

func Encode(w io.Writer, i image.Image, options *Options) error {
	return ImageExt.Encode("webp", w, i, ImageExt.NewOptions(options.Lossless, options.Quality))
}

```

``` こんな感じで使う

import (
	"github.com/masayukioguni/go-webp-sample/webp"
	"os"
	"path/filepath"
)

func main() {
	f, _ := os.Open("sample.jpg")
	defer f.Close()

	m, _ := webp.Decode(f)

	toimg, _ := os.Create("new.webp")
	defer toimg.Close()

	_ = webp.Encode(toimg, m, &webp.Options{false, 50})

}

```

# まとめ
+ LosslessやQualityには別途調べる必要がある
+ いつかgo langに実装されそうな機能なので、go langにはいったらそっちを使いたい。
+ go langは楽しい

# 資料
[変換ライブラリ](https://github.com/chai2010/image)
[サンプルソース](https://github.com/masayukioguni/go-webp-sample)
Arrow を理解する (まとめ)

頭が悪くてずっと理解できなかった `Haskell` の `Arrow` をこのたびやっと理解し始めたので，その過程をまとめました．
`Arrow` について勉強したい人の理解の一助になればと思います．

1. [多価関数と Category](http://qiita.com/CyLomw/items/a618b7c7326d9abede63 "多価関数と Category")
1. [綱渡りと Category (と，Kleisli)](http://qiita.com/CyLomw/items/ff1e5d1600291c952c5e "綱渡りと Category (と，Kleisli)")
1. [(>>=) を (>=>) に書き換える](http://qiita.com/CyLomw/items/a874cee33c69653f53c6 "(>>=) を (>=>) に書き換える")
1. [Category から Arrow へ](http://qiita.com/CyLomw/items/688942f19a5bc3a25037 "Category から Arrow へ") (未完)

間違いの指摘，疑問やツッコミなどあればコメントでお願いします．
カラーパレットをプロジェクトメンバーで簡単に共有する方法

# 目的
アプリ開発時に色の定義をしてメンバー間で共有したい場合の解決方法

# カラーパレットてどこに作られるの？

Macのカラーパレットを作成すると、

> ~/Library/Colors/
の下にclrという拡張子のファイルが作られます。
ここでは、Paletteの名前がCustomなのでCustom.clrというファイルが作られます。
※ちなみにカスタムのカラーパレットは下図の設定アイコンから追加可能です。

カラーパレット

![customPalette.png](https://qiita-image-store.s3.amazonaws.com/0/25951/256f5e7a-f488-8792-c144-657ed8f4f4b5.png)



# 背景

開発メンバーのPCの
~/Library/Colors/
にコピーしてね。という運用でも良いのですが、それだと更新が面倒です。

今回は、開発中のProjectの中にclrを追加してそのファイルをMacのColor paletteが参照させる方法をご紹介します。

# 手順

1 color paletteをコピーする
> cp ~/Library/Colors/Custom.clr ~/(任意のパス※)/

※今回はシェルとclrファイルは、Test3.xcodeprojフィルと同階層Toolsという物理フォルダを作成してそちらに配置しております。

プロジェクトの設定は下図のようにしてます。
![Screen Shot 2015-01-03 at 0.18.15.png](https://qiita-image-store.s3.amazonaws.com/0/25951/13ab8bc8-1fa5-c2c8-bb18-246eccab11cc.png)

2 パレットコピーするシェルスクリプトを作成

palette.shの中身

```bash
#!/bin/bash

current_path=$(cd $(dirname $0); pwd)
ln -fs ${current_path}/Custom.clr ~/Library/Colors/
```

3 ビルド時にシェルスクリプトを実行するための設定

![Test3_xcodeproj.png](https://qiita-image-store.s3.amazonaws.com/0/25951/c543d689-e61b-034f-32ec-eb386a4b6b16.png)

4 バージョン管理に、clrとシェルスクリプトを追加

# まとめ

ビルドすることでプロジェクトファイルに追加されたカラーパレットがメンバー間で共有できることにより、色の微妙なズレも防げつと思います。

今回やったことは、ビルドする毎にプロジェクトのTools配下のclrファイルが開発者のpalette配置場所にリンク（シンボリックリンク）が貼られて利用可能になります。

誰か一人がこの手順をプロジェクトの設定ファイルにしておけば、他の人は意識しないで自由にカラーパレットが利用できるのでお試し下さい。

少しの工夫で手間が軽減しますね〜
.bash_history のように、 OS X のアプリケーションの使用履歴を記録するスクリプト

.bash_history のように、アプリケーションの使用履歴をファイルに記録するスクリプトを書きました。


https://gist.github.com/kitsuyui/b779ba7ec4a47088ffe8

# 目的

自分のアプリケーションの使用履歴を記録して、利用頻度や傾向を調べたいと思ったからです。
充分に記録が集まったら、曜日や時間帯の違いを比較してみたいです。


# 使い方

1 ファイルだけなので wget して executable なパーミッションにするだけです。
~/.bin あたりに保存してパスを通すと良いと思います。

```console
$ wget https://gist.githubusercontent.com/kitsuyui/b779ba7ec4a47088ffe8/raw/a7a3c68b823f5b82b7ecdd47b2a730f39522eb51/apphistory.sh
$ chmod +x apphistory.sh
$ ./apphistory.sh
```

& を付けなくとも、 tty がなければ勝手に nohup して立ち上げます。

# 記録する内容

日時とアプリケーションのフルパスを、 ~/.app_history に記録します。
デフォルトでは 1 秒おきに記録し、同じアプリケーションは連続して記録されません。

また、 5 分以上連続してユーザの操作がない場合は #Idle というアプリケーション名として記録します。
席を外している間はアプリケーションの利用とは違うものとみなす意図です。

行のフォーマットは

```
{ISO 8601 の日時}{TAB文字}{アプリケーションのフルパス}{LF}
```

になっています。

## 記録例

```text
2015-01-02T21:01:23	#Idle
2015-01-02T23:01:03	/Applications/iTunes.app/
2015-01-02T23:01:04	/Users/yui/Applications/iTerm.app/
2015-01-02T23:01:14	/opt/homebrew-cask/Caskroom/sublime-text3/Build 3065/Sublime Text.app/
2015-01-02T23:01:18	/opt/homebrew-cask/Caskroom/google-chrome/latest/Google Chrome.app/
2015-01-02T23:01:22	/Applications/Tweetbot.app/
2015-01-02T23:06:25	#Idle
```

# 中身

設定は begin settings から end settings の間に書けるようにしています。

```bash
#!/usr/bin/env bash

#### begin settings ####
log_to=~/.app_history
idle_min_seconds=300
duration=1
idling_app_name='#Idle'
#### end settings ####


osascript=/usr/bin/osascript
sleep=/bin/sleep
nohup=/usr/bin/nohup
date=/bin/date
ioreg=/usr/sbin/ioreg
awk=/usr/bin/awk


selfname="${0##*/}"
selfpath="$(cd $(dirname $0) && pwd)/$selfname"


idle_time (){
    $ioreg -c IOHIDSystem \
    | $awk '/HIDIdleTime/ {OFMT = "%0.f"; print $NF/1000000000; exit}'
}

front_app_path (){
    $osascript -e "(path to frontmost application)'s POSIX path"
}

idle_message (){
    echo $idling_app_name
}

current_date (){
    $date +'%Y-%m-%dT%H:%m:%S'
}

main (){
    while true
    do
        local current_idle_seconds=$(idle_time)
        if (( current_idle_seconds < idle_min_seconds )) ; then
            local current_app=$(front_app_path)
        else
            local current_app=$(idle_message)
        fi

        if [ "$current_app" != "$previous_app" ] ; then
            echo "$(current_date)\t$current_app"
        fi

        local previous_app="$current_app"
        $sleep $duration
    done
}


start_background (){
    $nohup "$selfpath" &> /dev/null &
}

if [ ! -t 0 ] && [ ! -t 1 ] ; then
    exec >> $log_to
    main
else
    start_background
fi
```
Yコンビネータについて調べた


年始なのであたらしいことでもやるかと思い、[Haskellの入門](http://qiita.com/7shi/items/145f1234f8ec2af923ef)を見ていると


- Yコンビネータ

なんていうものが目についた。他の概念もよく分かってない(Monadとか...)けど、これがとりあえず気になったので調べてみる


読んでいると

> 自己参照のできない無名のラムダ式で再帰を実現するテクニックとして、不動点コンビネータを利用する方法があります。

とのこと。

[Haskellでのサンプル](http://qiita.com/7shi/items/1345bf32003faff435cb#y%E3%82%B3%E3%83%B3%E3%83%93%E3%83%8D%E3%83%BC%E3%82%BF)を見ると

Yコンビネータの定義

```haskell
y x = x (y x)
```

sumのインライン実装

```haskell
main = do
	print $ flip y [1..100] $ \f (x:xs) -> case xs of
		[] -> x
		_ -> x + f xs
```


全く分からないのでYコンビネータとは？というところから考えていく

[ここ](http://d.hatena.ne.jp/r-west/20090417/1239972722)と[ここ](http://d.hatena.ne.jp/r-west/20090422/1240400570)が分かりやすい

その他

http://d.hatena.ne.jp/kazu-yamamoto/20100601/1275367421


これを参考にすると、Yコンビネータとは

> 不動点演算子の一つ

であると言えます



まず

"ある関数を入力として受け取り、その関数を使う新しい関数を作って出力する関数"

があったとき、その関数を

```math
\begin{aligned} F\end{aligned}
```
とします

そして、ある関数fをFに入力したときに

```math
\begin{aligned} f = F(f) \end{aligned}
```

が成り立つとき、"fはFの不動点である" といいます。	


> つまり、どういう事かというと、

>「fはFの不動点である」という事が、
>「fは再帰する関数である」という事と同じ！！
> http://d.hatena.ne.jp/r-west/20090417/1239972722


この、Fにおけるf(不動点)を求める関数Yがあった時、その関数Yを、Yコンビネータ(不動点演算子)という。


どのような関数でも、Yコンビネータを通して、不動点を得られれば、再帰の計算ができるということだろうか


Yコンビネータを使った再帰に必要なのは

- Yコンビネータ
- 関数を引数にとって、その関数を関数を使った新しい関数を返す関数 



これを踏まえてもう一度最初の定義を見る

```haskell
y x = x (y x)
```

関数yが不動点を求めるYコンビネータ

```haskell
main = do
	print $ flip y [1..100] $ \f (x:xs) -> case xs of
		[] -> x
		_ -> x + f xs
```

これを分解して考えると

```haskell
\f (x:xs) -> case xs of
		[] -> x
		_ -> x + f xs
```

これが "関数を引数にとって、その関数を関数を使った新しい関数を返す関数"

flipは引数の順番を変えるものなので今回は別によいとしてつまり


```haskell

y x = x(y x) -- Yコンビネータ

x = \f (x:xs) -> case xs of
  [] -> x
  _ -> x + f xs

f = y(x) -- 不動点を求める

main =
  print $ f [1..100] -- 5050

```


? なぜこれが必要なのか？

http://d.hatena.ne.jp/nowokay/20090413#1239617061

> つまり、今プログラムを書くときに、「プログラムの書き方」といって「スコープはせまく」とか「型あり言語は実行時エラーがでにくい」とかいう話をしてるのは、その背景にはラムダ計算があるわけだ。

> ラムダ計算を基礎としてプログラムを考えていくことで、確実に動くプログラムを書くということを考えれるようになる。このようなことから、並列計算でのプログラム記述などに関数型言語が使われるようになっている。

> 並列計算では、プログラムを動かして検証するということは非常に難しい。ラムダ計算など、検証能力を持った計算モデルで、動かさなくても検証を行えるようにするわけだ。


あとは、メモ化と組み合わせてパフォーマンスを上げることもできる。



初めてHaskell触った。僕自身がまだまだですが素晴らしそうな言語です。

あとQiitaで数式書けるの感動した
「さがスタ」から登録スタジオ件数を獲得するスクリプト

1. http://studio-navi.jp/pc.html にアクセス
2. コンソールを開く
3. 下記のスクリプトを流す

```js
document.body.appendChild(function(){
	src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js";
	sc = document.createElement("script");
	sc.type="text/javascript";
	sc.src=src;
	sc.onload = function() {
		/*window.jQuery.noConflict();*/
	};
	return sc;
	}()
);

var total = 0;
$('div.station-area').find('a').each(function(){
	var re = /\d/
	var hittedNum = re.exec($(this).text())
	total += +hittedNum;
});

console.log(total);
```
Mac でアクティブなアプリケーションを Python で追いかける

わざわざ Objective-C 覚えるの辛いので、まだちょっとかじった程度だけど Python （と PyObjC）使って書いてみた:

```active_app_logger.py
from AppKit import *
from PyObjCTools import AppHelper

def main():
    nc = NSWorkspace.sharedWorkspace().notificationCenter()
    nc.addObserver_selector_name_object_(
        Observer.new(),
        "handle:",
        NSWorkspaceDidActivateApplicationNotification,
        None
    )
    AppHelper.runConsoleEventLoop(installInterrupt=True)

class Observer(NSObject):
    def handle_(self, noti):
        """アクティブなアプリケーションが切り替わった時に呼ばれる処理"""
        info = noti.userInfo().objectForKey_(NSWorkspaceApplicationKey)
        for n in ["bundleIdentifier", "localizedName", "bundleURL",
                  "executableURL", "launchDate"]:
            v = info.valueForKey_(n)
            print("%s (%s):\t%s" % (n, v.className(), v))
        print("--")

main()
```

端末で実行して、Google Chrome → iTerm の順にアプリケーションを切り替えてみる:

```bash
$ python cocoa_active_window.py
bundleIdentifier (__NSCFString):        com.google.Chrome
localizedName (__NSCFString):   Google Chrome
bundleURL (NSURL):      file:///Applications/Google%20Chrome.app
executableURL (NSURL):  file:///Applications/Google%20Chrome.app/Contents/MacOS/Google%20Chrome
launchDate (__NSDate):  2015-01-02 05:09:26 +0000
--
bundleIdentifier (__NSCFString):        com.googlecode.iterm2
localizedName (NSTaggedPointerString):  iTerm
bundleURL (NSURL):      file:///Applications/iTerm.app
executableURL (NSURL):  file:///Applications/iTerm.app/Contents/MacOS/iTerm
launchDate (__NSTaggedDate):    2015-01-02 05:59:29 +0000
--
```

このスクリプトを実行する場合は、PyObjC のインストールが必要:

```bash
$ sudo pip install pyobjc
```

スクリプトの動作環境は:

```bash
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.10.1
BuildVersion:   14B25
$ xcodebuild -version
Xcode 6.1.1
Build version 6A2008a
$ python --version
Python 2.7.6
$ pip show 'pyobjc' | grep Version
Version: 3.0.4
```

多少使い慣れている Ruby(RubyCocoa) より資料も多そうだったので PyObjC を選んだけれど、Python も PyObjC も Objective-C もろくに使えず、Mac OS X アプリケーションも作ったことないなら素直に Objective-C から覚えたほうが楽だったかも。つらかった。

アクティブなウィンドウの情報を取るには `NSAccessibility` を触る必要があるっぽいので諦め。`NSAccessibility` はクリティカルな情報にアクセスできるポリシーが固めな API？また、PyObjC に見当たらなかったんだけどバインディングされてない？
RabbitMQ v3.3以降でguestユーザのリモートログインを許可する

RabbitMQ v3.3からはguestユーザのリモートからの接続ができなくなっている。
http://www.rabbitmq.com/blog/2014/04/02/breaking-things-with-rabbitmq-3-3/

このことはOpenStackの文脈で発見したのだが、devstackなんかがguestを使ったり、巷のドキュメントがguestを使ってたりするので、意味不明なエラーに悩まされている人が多かった。

公式にworkaroundが記載済み。loopback_usersを空にする。
http://www.rabbitmq.com/access-control.html

```erlang
[{rabbit, [{loopback_users, []}]}].
```

コメントアウトするだけだとシンタックスエラーになるので注意。最後のカンマをちゃんと削除すること。

まぁ、guestなんか使うなよってことなんだろうなぁ。
ユーザーをdockerグループに入れる時にgpasswdを使った話

`docker`するのにいちいち`sudo`していたのだが、dockerグループに入れば`sudo`いらないと聞いたのであった。そこで、すかさずその場で：

```bash
usermod -g docker makisyu
```

……はい間違えました。正解は：

```bash
id makisyu
usermod -g makisyu -G makisyu,wheel,docker makisyu
```

素人でした。こういう輩がたくさんいるせいか：

```bash
gpasswd -a docker makisyu
```

でもいいらしい。こっちの方が直感的な気がするけど、基本コマンドに含まれているのかは未確認。Fedora21bには最初からあった。
ISO-2022-JPなチャンネルでもZNCを使う

あるいはUpstreamのZNCをコンパイル&&インストールする方法について。

zncには以前charsetというモジュールがあったのだが、チャンネル名の変換はできなかったため、設定ファイル内で文字化けが起きたり、ログファイル名が文字化けたりと、いまいちイケてない感があった。そこでTiarraですよ、というわけで、長いことTiarraを使っていた。そうこうしているうちに、UTF-8以外のチャンネル名には無力なcharsetモジュールは廃止になり、代わりにlibicuを使ったソケットレイヤーでの文字コード変換が導入された。
https://github.com/znc/znc/commit/6012cdee77c4e11879537c973177d138b9e66006

このFixにより、UTF-8以外のチャンネル名でも期待した通りの動作をするようになった。設定ファイル内での文字化けしなくなり、logモジュールで取得したログの内容やファイル名もUTF-8になる。
http://trapezoid.hatenablog.com/entry/2014/02/21/124314

v1.3辺りから使えるようなのだが、周辺でちょこちょこ更新が来るので、ソースをコンパイルして使用することにする。すべて/usr/local下に配置されるようなので、まぁあまり細かいことは気にしない。とか言ってたら、この前Webコンソールからユーザー追加したらsegfaultしたけど、`git pull`したら直ってたし、やっぱり細かいことは気にしない。

文字コード変換を有効化するには、libicu-develを入れてconfigureする。リポジトリにあるパッケージで問題ない。今回はあまり関係無いけれど、PerlやPythonのモジュールが必要な場合にはswig, libperl-devel, libpython-devel等も必要になる。SSLを使いたい場合にはOpenSSLも必要。全機能をリンクしようとすると結構依存が多い。また、configureに`--systemdsystemunitdir`オプションでUnitファイルの置き場所を指定しておくと、`make install`でsystemdのUnitファイルを作成&配置してくれる。

```bash
sudo LANG=C yum group install 'Development tools'
sudo yum install libicu-devel
./configure --systemdsystemunitdir=/etc/systemd/system
make
sudo make install
```

Unitは作ってくれるのだが、プロセス起動用にzncユーザーが必要だったりちょっとめんどくさい：

```bash
getent group znc >/dev/null || groupadd -r znc
getent passwd znc >/dev/null || useradd -r -g znc -d /var/lib/znc -s /sbin/nologin -c "Account for ZNC to run as" znc
mkdir -p /var/lib/znc
chown znc:znc /var/lib/znc
```

主要ディストリビューションにはZNCがパッケージで用意されているので、この辺はパッケージに任せてしまうのもアリな気はする…。上述のユーザー追加スクリプトも、Fedora21のリポジトリのSRPMを展開して、それを拝借したもの。

配置されたsystemdのユニットファイルを編集して/usr/local下のzncを起動するように設定：

```bash
% diff znc.service /etc/systemd/system/znc.service 
6c6
< ExecStart=/usr/bin/znc -f
---
> ExecStart=/usr/local/bin/znc -f
```

このまますぐに起動しても設定ファイルが無いと起動に失敗するため:

```
sudo -u znc /usr/local/bin/znc --makeconf
```

で設定ファイルを作成する必要がある。初期設定ではNickや接続先の設定を対話形式で行う。Encoding設定にはControlPanelモジュールを使用するため、これを有効にしておくこと。また、起動はsystemd経由で行いたいので、`--makeconf`の最後に起動するか聞いてきた時にはNoを選択する。設定が終わったらsystemd経由で起動：

```bash
sudo systemctl enable znc
sudo systemctl start znc
```

エンコード設定はIRCクライアントでZNCに接続後、*controlpanelに話しかけることで行う。例えばIRCNetJPでISO-2022-jpを使いたいという場合は：

```
/msg *controlpanel SetNetwork encoding makisyu IRCNetJP JIS8
/msg *controlpanel Reconnect makisyu IRCNetJP
```

IRCクライアント側はUTF-8に設定しておく。これでログファイルも文字化けしない。
bacon.jsで関数型プログラミングをやってみる(1)


#関数型プログラミング脳になる
関数型プログラミング(FRP:Functional reactive programming)を考えるためには以下の原則を意識することが大事です。

【原則1】不変性(Immutability)
【原則2】参照透過性(Referential transparency)
【原則3】遅延評価(Lazy evaluation)

他にもありますが、この３点を重点的に意識することで、関数型プログラミングの考え方に慣れていけることでしょう。
ここではjavascriptでFRPを実現するライブラリとして、bacon.js(https://baconjs.github.io/) を利用して関数型プログラミングをやっていきたいと思います。
まずは説明のため、なかなかコードはでてきません。

##【原則1】不変性(Immutability)
変数について。
変数を不変、つまりは変更しないようにする、というものです。
基本的に変数はconstである、と思っておいてよいでしょう。
ただし、全てを不変とするとそのプログラムは意味のないものになってしまいそうなので、「基本的に」ということになります。

##【原則2】参照透過性(Referential transparency)
関数について。
同じ入力に対して、出力が毎回同じ値になるようにする、というものです。
つまり、関数が独立して処理でき、その結果は処理順や状態によらない、ということになります。

##【原則3】遅延評価(Lazy evaluation)
処理について。
一般的にプログラム式は上から順に処理されていきますが、関数型プログラミングではその限りではありません。
1.まず準備や定義し
2.必要に応じて処理する
という流れになります。この部分がなかなか感覚的に分かりづらいのではないかと思います。

#データのフロー(流れ)を意識する
手続き型のプログラミングにおいては、フローチャートというものがあり、処理の流れを考えてプログラミングしていました。関数型プログラミングではフロー（流れ）は「処理」ではなく、「データ」だと意識すると理解がし易いのではないでしょうか。
その際、流れていくデータは集合（数学的な意味で）だととらえると関数型プログラミングっぽいプログラムが書ける気がします。

#bacon.jsでやってみる
まずは準備から。bacon.jsは https://github.com/baconjs/bacon.js#compatibility-with-browsers によると、
>Bacon.js is not browser dependent, because it is not a UI library.
>
>I have personally used it Bacon.js with Chrome, Firefox, Safari, IE 6+, iPhone, iPad.
>
>Automatically tested on each commit on modern browsers and IE6+.

ほとんどのブラウザで問題なく動くようです。ブラウザだけでなく、node.jsでも、もちろん動きます。
ここではhtmlファイルに書いてブラウザで試してみます。
以下のファイルを用意しました。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>bacon.jsのテスト</title>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/bacon.js/0.7.41/Bacon.min.js"></script>
  <script>
  //1から9までの数値が入った配列を用意
  var arr = [1,2,3,4,5,6,7,8,9];

  //二倍して返す関数を用意
  var twice = function(n){
    return n*2;
  }

  //baconjsの出番
  var stream = Bacon.fromArray(arr);//配列からストリームを用意
  stream          //データのフロー（流れ）の源流
    .map(twice)   //twice関数をマッピング
    .log();       //ログとして出力
  </script>
</head>
<body>
  (出力はコンソールで確認)
</body>
</html>
```

デベロッパーツール、Firebug、エラーコンソールなどブラウザによって呼び名は違いますが、コンソールと統一して説明します。
このファイルでは1から9の数字の集合体を二倍にして返す関数で処理したのちにコンソールへログ出力させています。
上記のhtmlファイルをchromeで開いてみた実行結果です。

![スクリーンショット 2015-01-02 21.08.59.png](https://qiita-image-store.s3.amazonaws.com/0/37255/2b5d26f3-0d89-99e4-f024-a24be1fd7209.png "スクリーンショット 2015-01-02 21.08.59.png")
(bacon.jsをcdn経由で読み込ませていますので、ネットワーク環境が必要です。)

たしかに、1から9がそれぞれ二倍されているようです。

と、ここまではよくあるチュートリアル的なもので、なんとなくわかったようなわからないような、微妙な感想しか残らないでしょう。自分もそうでした。。
配列の中身を二倍するだけで何の役に立つの、実際のところどうやってつかえばいいの、となっちゃうかと思います。

[bacon.jsで関数型プログラミングをやってみる(2)](http://qiita.com/m4fg/items/9b0d5261909224fd45d0)

ではもう少し実践的な処理や他の既存ライブラリとの両立のさせ方の説明として、urlのリストから中身をパースして情報を取り出す、いわゆるスクレイピングの処理をbacon.jsで書くとどうなるか、を書いていきます。
ソフトウェアテスト

#ソフトウェアテスト

ソフトウェアテストについて調べたので、そのまとめ。

##1.ソフトウェアテストとは
・プログラムを実行し、正しく動作するか、目標品質に到達しているか、
　意図しない動作をしないかどうかを確認する作業のこと。
・プログラム中の仕様にない振舞又は欠陥（バグ）をできる限り多く発見することを目標する場合がある。
・ソフトウェアテストの成功するとは、規定した試験項目にすべて合格するか、
　規定した品質目標に到達するか、欠陥を発見すること。
・ソフトウェアテストでは、バグが存在することを示すことはできるが、バグが存在しないことは証明できない。

##2.テストプロセス

ソフトウェアテストにどのような作業があり、どういう順番で実施するかは以下の通り。

1. テスト作業全体をどのような方針で実施していくかを計画する。
2. その方針に基づいてテストの分析、設計、実装、実行を進める。
3. これらの作業が最初に立てた計画通りに進んでいるかどうかを管理する。
4. テスト実行が完了したら、結果を確認しテスト作業を終了してよいかどうかの判定を行う。
5. 最後に終了作業を実施する。

###2.1.テスト計画
・テストのスコープや目的を明確にする。
・テストの全体計画(方針、体制、スケジュール等)を策定する。
・テストの終了基準を策定する。
　　終了基準の例：
　　- 必要なテスト項目が全て実施確認されていること。
　　- 検出された不具合が全て対応されていること。
　　- テスト実施期間の終了80％以降に、重要度の高い不具合が検出されていないこと。
　　- 検出された不具合の改修に対して、回帰テストが実施されていること。

###2.2.テスト管理
・テスト分析～テスト実行の作業について進捗を確認し、問題があればその状況に対するアクションを行う。
・バグの発見状況を監視し、それに対するアクション(品質管理)を行う。

###2.3.テスト分析
・テストベース(テストケースを作るためのインプットとなる成果物)を整理する。
・テストすべき条件や要件、テストケースの作成方針(どのテスト技法を使うか、など)を決定する。

###2.4.テスト設計
・テスト分析で洗い出した条件や要件を満たし、抜け漏れや重複の無いテストケースを作成する。
・テストケースは環境、前提条件、操作、期待結果を明記する。

###2.5.テスト実装
・テスト設計で作成したテストケースをもとに、実際に実行するための具体的な手順を作成する。
・テストデータや自動化用のスクリプトを作成する。

###2.6.テスト実行
・テスト実装で作成した手順どおりにシステムを操作し、期待した結果となるかを確認する。
・期待結果がNGの場合、キャプチャやログ等の証跡(エビデンス)を取得して、バグの報告をする。
・バグの原因分析、修正をする。
・バグ修正の影響範囲を分析したうえで、NGとなったテストケースだけでなく、すでに消化済みの関連するテストケースも再試験する。

###2.7.テスト終了判定
・テスト計画で作成した終了基準に従い、テストプロセスを終了するかを判定する。
・テストの実行結果やバグの検出状況などを分析する。
・終了基準を満たさず、妥当な理由がない場合、必要に応じてテストの追加などのアクションを行う

###2.8.テスト終了作業
・これまでのテストプロセスについて最終確認し、最終レポートを作成する。
・テスト資材を整理し、今後の活動のためのフィードバックを行う。
* * *

テストの種類や手法については、いずれまた。
Xcode6でPCHファイルを追加する方法


Xcode6の時代に入り、Objective-Cでプロジェクトを新規するとき、PCHファイルは自動的に生成しないようになりました。従来の習慣はプロジェクトの共通の機能と定義などは普段PCHファイルに書き込みます。今もその便利さを利用したい。

 直接にPCHファイルを新規するだけは足りません。プロジェクトの設定にも書き込むが必要です。以下の通り、方法は簡単です。

1.  そのプロジェクトに、PCHファイルを新規して添付します。
2. ターゲットの設定に、言語のカテゴリを見つけよう。`Target` -> `Build Settings` -> `Apple LLVM 6.0 - Language`。
3. そこで、`Precompile Prefix Header` を `YES`　に変えよう。
4. またその下の `Prefix Header` を `$(SRCROOT)/FILENAME.pch`のようにしましょう。

設定は終了で、プロジェクトを保存して、クリーンします。今なら、PCHファイルは稼働できますようになります。

さて、PCHファイルを使ってみて。

例えば、私の愛用の日誌関数の再定義コード。

	#ifdef DEBUG
	#define _Log(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
	#else
	#define _Log(...)
	#endif

	// ALog always displays output regardless of the DEBUG alarm
	#define ALog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);

その後はそれを使うことです。

------
20150328の追加です。

iOSでzipファイルを用いる場合、ZipArchiveなどを引用し、プロジェクトにc言語のコードを含むことがあります。その時にそのままのPCHファイルは、NSObjCRuntimeなどのクラスでよく分からないエーラーが出てきます。それは多分、cファイルの前に`Foundation/Foundation.h`などを導入したせいかもしれません。その解決策として、`Foundation/Foundation.h`などを含むクラスをPCHファイルにインポートするには、直接にインポートすることではなく、必ず`#ifdef __OBJC__`と`#endif`の中に入れます。
QEMUのユーザーモードをDockerコンテナ上で使う


QEMUのユーザーモードをDockerコンテナ上で使おうとした際に発生した問題のメモ。

## 環境

- Debian wheezy on Docker

## QEMUインストール時に発生するエラー

バイナリで提供されているユーザーモードQEMUをインストールする。このパッケージは、インストール時に`binfmt`(ネイティブとは異なるアーキテクチャ向けのバイナリをQEMU経由で実行するために必要)の設定を行ってくれる。しかしDockerコンテナ上では、その際に行われる`mount`コマンドの実行がエラー終了する。

```bash
(docker host)$ docker run -it <image> /bin/bash
(docker container)$ apt-get install -y qemu-user-static
...
mount: permission denied
update-binfmts: warning: Couldn't mount the binfmt_misc filesystem on /proc/sys/fs/binfmt_misc.

# 手動で実行しようとしてもダメ
(docker container)$ mount -t binfmt_misc binfmt_misc /proc/sys/fs/binfmt_misc
mount: permission denied
```

(ref.) `binfmt`について

- http://d.hatena.ne.jp/kakurasan/20070714/p1
- http://kakurasan.ehoh.net/summary/manualconfig.binfmt_misc.os.html


この後、[Debianの公式ドキュメント](https://wiki.debian.org/EmDebian/CrossDebootstrap#QEMU.2Fdebootstrap_approach)に書いてある手順でarmの実行環境を作ろうとした際、`binfmt`の設定が行われていないことが原因でエラーが発生した。

## `docker run`時に特権を与える

`docker run`時に`--privileged`オプションを与えることで、通常は禁止されている操作を実行する権限が得られる。

```bash
(docker host)$ docker run -it --privileged <image> /bin/bash
(docker container)$ apt-get install -y qemu-user-static
...
# binfmtの設定に必要なmountが既に実行されている。
(docker container)$ mount -t binfmt_misc binfmt_misc /proc/sys/fs/binfmt_misc
mount: binfmt_misc already mounted or /proc/sys/fs/binfmt_misc busy
mount: according to mtab, binfmt_misc is already mounted on /proc/sys/fs/binfmt_misc
```

(ref.) http://www.tsugihagi.net/entry/2014/10/05/083120

## (おまけ)

元々armの実行環境としてQEMUを使いたかったため、それが問題なく動作することを確認する。
実行環境の作成は[Debianの公式ドキュメント](https://wiki.debian.org/EmDebian/CrossDebootstrap#QEMU.2Fdebootstrap_approach)の手順に従った。

```bash
(docker container)$ debootstrap --foreign --no-check-gpg --arch=armel wheezy /root/workspace/arm_env
# staticリンク済みのqemuコマンドをarm実行環境にコピー
(docker container)$ cp /usr/bin/qemu-arm-static /root/workspace/arm_env/usr/bin/

# armバイナリであることを確認
(docker container)$ file /root/workspace/arm_env/bin/ls
/root/workspace/arm_env/bin/ls: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 2.6.26, BuildID[sha1]=bc7dc95b8916aca9a598d8328ef6eae2165ede8f, stripped

# amd64バイナリはこんな感じ
(docker container)$ file /bin/bash
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.26, BuildID[sha1]=05e0f155082725dfdc56c4d4cedcc7c2536500a1, stripped

# chrootが問題なく成功する
(docker container)$ DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true LC_ALL=C LANGUAGE=C LANG=C chroot /root/workspace/arm_env /bin/ls .
bin   dev  home  media  opt   root  sbin     srv  tmp  var
boot  etc  lib   mnt    proc  run   selinux  sys  usr
```
gitのトップレベルディレクトリに移動する


深い階層からトップレベルディレクトリに戻るのが面倒だったので一気にジャンプする方法を考えてみた。
zshのマークとか使うと簡単かもしれないけど、それはそれ。


## git rev-parseを活用する
git rev-paserでリポジトリのトップディレクトリを確認したりカレントディレクトリがワークツリーの中かどうかを判定できるみたいなのでこれを使う。

### git rev-parse --is-inside-work-tree
ワークツリーの中であればtrueが返ってくる。

```
% git rev-parse --is-inside-work-tree
true
%
```

ワークツリーの外だとエラーが返ってくるんだけど

```
% git rev-parse --is-inside-work-tree
fatal: Not a git repository (or any of the parent directories): .git
% 
```

と長ったらしいエラーメッセージが返ってくる。
これを判別するのも面倒なのでシェルの$?の方を見てあげる。
そうすると

```
% git rev-parse --is-inside-wokr-tree
true
% echo $?
0
%
```

となる。エラーの場合は

```
% git rev-parse --is-inside-work-tree
fatal: Not a git repository (or any of the parent directories): .git
% echo $?
128
%
```

ってことになる。これでワークツリーの中にいるかどうかが判定できる。で、ワークツリーの中にいるってことはトップレベルディレクトリがどこかにあるはずなので、そこに移動する。

### git rev-parse --show-toplevel
リポジトリのトップレベルディレクトリを表示する。

```
% git rev-parse --show-toplevel
/User/hinagishi/prog/hoge/
%
```
みたいな感じになるので、ここに移動してあげる。
シェルで展開してあげると簡単なので

```
% cd `git rev-parse --show-toplevel`
```
としてあげるといいかな。

## シェル関数を定義する
シェルスクリプト内でcdコマンドを実行しても、端末のワーキングディレクトリは移動しないのでシェル関数を使って移動できるようにする。

```
cdgitroot () {
    git rev-parse --is-inside-work-tree > /dev/null
    if [ $? = 0 ];
    then
        cd `git rev-parse --show-toplevel`
    fi
}
```

自分はzshを使ってるけど、bashも同じ書き方でよかったはず。
自分の使ってるシェルに合わせて書いてあげればOK。
あとは端末上で関数名を入力してあげると、ワークツリー内部であればそのトップレベルディレクトリへ移動するし、そうでなければさっきのエラーメッセージが表示される。


## 追記
--show-toplevelが失敗すればエラーが出るので単にaliasにするんでもいいかも？

```
alias cdgitroot='cd `git rev-parse --show-toplevel`
```

またはコメントで教えてもらった方法を使えば

```
alias cdgitroot='git rev-parse --is-inside-work-tree && cd `git rev-parse --show-toplevel`'
```

なんて書き方でもよさそうですね。
【CakePHP2.3】画像付リンクの指定方法(Htmlヘルパー)

#画像リンクをHTMLヘルパーで生成

つまり、以下のようなHTMLをHTMLヘルパーで
出力したい場合、どう記述するか？

```sample.html
<a href="/user/regist">
<img src="/img/user/button01.png" alt="">
</a>
```

2パターンでやってみた。

##①linkベース

```sample.ctp
<?php echo $this->Html->link($this->Html->image('user/button01.png'),array('controller'=>'user','action'=>'regist'),array('escape'=>false));?>
```

##②imageベース

```sample.ctp
<?php echo $this->Html->image('user/button01.png',array('url'=>array('controller'=>'user','action'=>'regist')));?>
```

##結論
ヘルパー使わきゃよくね？
【vim】行番号の表示・非表示

#vimでの行番号の表示・非表示の方法

##【行番号の表示】

カーソルモード(ESCを押したあとの状態)で
以下のコマンド

` :set number`


##【行番号の非表示】

カーソルモード(ESCを押したあとの状態)で
以下のコマンド

` :set nonumber`

##その他
デフォルトで行番号表示させたい場合は、.vimrcを
設定しておく。

` $ vi ~/.vimrc`

` " 行番号を表示`
` set number`
プルリクを複数のブランチに対して送る方法

GitHubのレポジトリに

master
stable
hotfix

と３つのブランチがあったとする。

hotfixのブランチの更新反映をmasterとstableにプルリクで行う方法を、
GitHubのUI上で探したがなかなか見つからない。

とりあえずの解決策としてhubコマンドを使えば出来るとわかった。

```
hub pull-request -b master -h hotfix
hub pull-request -b stable -h hotfix
```

GitHubのUI上でプルリクを複数のブランチに対して行う方法があれば教えてください。
Chocolatey + Atom で超簡単セットアップ（Windows）

## 10分でセットアップできる簡単手順
### Atomとは
あのGitHubが提供する[公式エディタ](https://atom.io/)です。見た目は「Sublime Text」そっくりそのままなのでまあアレですが、後発ということもあり色々と便利になってます。インストールしたばかりでは最低限の機能しかないのでpackageをインストールすることで機能を拡張することができます。

### Chocolateyの導入
[Chocolatey](https://chocolatey.org/)は、Windows版 yum っていう感じのコマンドラインからアプリをインストールできるパッケージ管理システムです。これを導入しておくといちいちアプリをぐぐったりしなくていいのとバージョンアップも簡単ですのでまずはインストールします。

1. [https://chocolatey.org/](https://chocolatey.org/)サイトに行き、dos窓用(C:\> のやつ)をコピーする。
2. dos窓を表示する。
3. ペーストしてコマンドを実行する。

### Atomの導入
Chocolateyのインストールコマンドを実行するだけ（管理者権限にて）。

```
C:\> choco install atom
```

### パッケージの導入
file - Settings を選択しInstall Packagesの欄にパッケージ名を入れenterを押すとパッケージの一覧が表示されます。このとき一覧表示されるパッケージは、Featuredパッケージもあるので興味があればいれて見るのも面白いかもしれません。
あとパッケージ名が判らない場合、たとえば "a" を含むパッケージ名を検索したいとき Install Packagesの入力欄に "a"+enter としてみると下記の様になります。

![atom-1.png](https://qiita-image-store.s3.amazonaws.com/0/44540/2b576be5-14c2-64a5-432e-7c0fb4829894.png)

### Atom VS Sublime
これは個人的な感想。コードの開発はSublime。MarkDown を編集する場合は、Atom を使用してます。
個人的な勝敗として、まだまだ Sublime がお勧めというのはある。

| 用途 | 勝敗 |
|:-----------|:------------|
|起動の軽さ|Atom重すぎ…|
|日本語対応|Sublimeちょとだめです|
|メニュー日本語対応|Atom英語か…|
|ファイルの保存|Atomは基本保存だよねダメダｗ|
|パッケージ|Sublimeのパッケージ管理は…|
|MarkDownパッケージ|Sublimeはパッケージいれないとダメよね|
|先進的|イーブンかな？|
|IDEとして|Atomはパッケージまだまだよね|
|無料？|Sublimeは有料だよね|

### お勧めパッケージ

```
file-icons
japanese-wrap
Regex Railroad Diagram
minimap
Atom Beautify
Script
linter
Merge Conflicts
Autoclose Html
Git Log
Git Plus
Web View
Ask Stack
```

### メニューバーが隠れちゃったとき
Toggle Menu Bar を選択してメニューバーが隠れちゃったときの復活は「alt」キーを押すだけですｗ
> [toggle menu bar #4289](https://github.com/atom/atom/issues/4289)

### 参考サイト

> [Atomとapmを本腰入れて使い始める](http://qiita.com/gogotanaka/items/63b5cf173feb7bc8f160#regex-railroad-diagram)
> [Atomチートシート](http://qiita.com/fujimohige/items/f3b4cce60b4196b285cc)
> [［捗］Markdownに便利！～GitHub謹製のテキストエディタAtomはWindows、Mac、Linuxで利用可能](http://hakadorian.com/archives/2116)
> [WindowsでAtomをインストールして使ってみる](http://qiita.com/purini-to/items/caca2a0c56e984b2f9d8)
> [イマドキのIDE事情](http://news.mynavi.jp/column/ide/170/)
wxWidgets-3.0.2をwindowsでnmakeを用いでビルドしたら詰まったのでメモ

# 症状
wxWidgets-3.0.2をビルドしたら

```:error
fatal error C1083: Cannot open include file: 'stdio.h': No such file or directory
```

となってしまった

# 対処法
google先生に聞いたら、どうやらパスが通ってないらしい．．．
とりあえず、載っていた方法で試してみた

事前に Visual Stadio 2013 をインストール

参考サイト
https://ask.wireshark.org/questions/34755/compilation-error-cannot-open-include-file-stdioh-no-such-file-or-directory

環境変数に

```
Include=C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include\gl
```

を追加した

次に、

```
cd wxWidgets/build/msw
nmake /f makefile.vc
```
これで動いた！
Docker を何も知らない状況からとりあえず触ってみるまで

Docker を触ってみたメモ．

# Reference
* Official: https://www.docker.com/
* First Tutorial: https://www.docker.com/tryit/#  
    * 仮想環境だけど感じは掴める．
    * 個人的には，後述する Vagrant + CoreOS をこのチュートリアルと一緒に動かしてやってみてわかりやすかった．
* User Guide: https://docs.docker.com/userguide/
    * とりあえず Getting started with DockerHub から順番に読みながら動かしてみる

# お試し環境づくり
前提は OS X (Yosemite) with Vagrant  
docker host として Core OS を使ってみる．  
1. `vagrant init yungsang/coreos`
2. `vagrant up`
3. `vagrant ssh`
4. `docker` ですでに docker が入ってるのが分かる．
Python でビンゴゲーム の確率シミュレーションしてみた


いきなりコード

```py3:Bingo.py
# -*- coding: utf-8 -*-

u"""BINGO の確率をシミュレーションするスクリプト
input:
    times = 抽選機を回す回数, card_num = カードの数
outpu:
    1本でも揃う確率

"""
import sys
from random import sample

# 穴
HIT = True
NOHIT = False


def generate_card():
    u"""カードを生成
    5x5で中心(3行3列)に穴が空いたカード
    B(1列目) 1 - 15
    I(2列目) 16 - 30
    N(3列目) 31 - 45
    G(4列目) 46 - 60
    O(5列目) 61 - 75
    :returns: array card, length=25

    """
    cards = []
    for i in range(5):
        cards.extend(sample(range(15 * i + 1, 15 * (i + 1)), 5))
    cards[12] = HIT
    return cards


def check_bingo(card):
    u"""BINGOしているかどうか
    判定のみかえす
    param: array
    :returns: boolean
    """
    if card.count(HIT) < 5:
        return False
    for i in range(5):
        if NOHIT not in card[i * 5: (i + 1) * 5]:
            return True
    for i in range(5):
        if NOHIT not in card[i: i + 21: 5]:
            return True
    if NOHIT not in card[0: 24: 6]:
        return True
    if NOHIT not in card[4: 21: 4]:
        return True
    return False


def print_card(card):
    for i, v in enumerate(card):
        if v == HIT:
            v = "o"
        elif v == NOHIT:
            v = "x"
        sys.stdout.write("%3s" % str(v))
        if (i % 5 == 4):
            print()
    print()


try:
    times = int(sys.argv[1])
except IndexError:
    times = 5
try:
    card_num = int(sys.argv[2])
except IndexError:
    card_num = 10000

hit_count = 0
for i in range(card_num):
    card = generate_card()
    lots = sample(range(1, 76), times)
    card_hole = [(HIT if (x == HIT or x in lots) else NOHIT) for x in card]
#    print_card(card)
#    print_card(card_hole)
    if check_bingo(card_hole):
        hit_count += 1

print(str(times) + u"回目で1本でもBINGOしてる確率:")
p = hit_count / card_num
print("%s (%.1f %%)" % (str(p), p * 100))

```

Gist: https://gist.github.com/0c11f757334ba9ef7b1f

入力:
抽選機を回す回数
カードの数(シミュレーション回数)
output:
一本でもBINGOする確率

それぞれの関数の説明はコメントで大方わかるはず
1. カードの生成
2. 引かれたくじの一括生成
3. カードに穴を開ける
4. BINGO判定
のループ

Pythonらしい書き方が出来た部分
card(BINGOカード) について当たりが出ているかどうかを判定する部分がPythonらしい書き方が出来たと思う(ぶっちゃけここの処理を作ってみたかっただけ)

```py3
# 4列目の判定
NOHIT not in card[3:3 + 21:5]
# 左上から右下斜めの判定
NOHIT not in card[0:24:6]
```

Pythonの配列は array[start :end :step] で取り出せるのでスマートに判定が書ける

実行出力例

```shell-session
>> python3 bingo.py 5 10000
5回目で1本でもBINGOしてる確率:
0.0003 (0.0 %)
```


関係ないけど今回Pythonのコーディング規約として今回Flake8で覚えたこと
関数同士の間は2行開けないといけない
配列コロンの**右側**にスペースを入れてはいけない(引数のカンマと同じ)

docブロックの書き方がいまいちまだわからないので勉強していこうと思う
Windows 使いの Mac 初導入 | 仮想デスクトップ #win2mac

# <i class="fa fa-windows" style="font-size:1em;"></i> Windows 使いの <i class="fa fa-apple" style="font-size:1em;"></i> Mac 初導入 | :computer: 仮想デスクトップ
## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
:computer: 仮想デスクトップ
## <i class="fa fa-desktop" style="font-size:1em;"></i> 仮想デスクトップとは？
デスクトップの作業環境を複数切り替えることができるアプリケーションです。

## <i class="fa fa-flag-checkered" style="font-size:1em;"></i> 仮想デスクトップを導入する目的
下記の記事にまとめてあります。

<i class="fa fa-external-link" style="font-size:1em;"></i> [Tbpgr Blog | TbpgrKnowledge | 仮想デスクトップで集中する](http://tbpgr.hatenablog.com/entry/20140210/1392039280)

## <i class="fa fa-windows" style="font-size:1em;"></i> Windows では
Windows では, WindDeskWide というソフトを利用していました。
WindDeskWide については下記の記事にまとめてあります。

<i class="fa fa-external-link" style="font-size:1em;"></i> [Tbpgr Blog | 仮想デスクトップ WinDeskWide](http://tbpgr.hatenablog.com/entry/20111127/1322397088)

## <i class="fa fa-apple" style="font-size:1em;"></i> Mac では
Mission Control で複数のデスクトップを管理できます。

### <i class="fa fa-cube" style="font-size:1em;"></i> 基本操作
こちらを参照

<i class="fa fa-external-link" style="font-size:1em;"></i><i class="fa fa-apple" style="font-size:1em;"></i> [Mac ハンドブック：Mission Control](http://support.apple.com/ja-jp/HT4689)

頻繁に利用しそうな操作としては

* 指三本で上にスワイプ（ or control + 上） : Dashboard, App, デスクトップなど全体を表示
* Fn + F3 : 同上
* 指三本で上にスワイプ後、右端の＋を選択 : 新規デスクトップの追加
* 指三本で上にスワイプ後、指三本で左右にスワイプ（ or control + 左右） : 対象デスクトップ、 Dashboard などの選択
* 指三本で下にスワイプ（ or control + 下） : 上にスワイプした状態から戻る
Linux TCP/IP parameter note


簡単なメモ

## net.core.(r|w)mem_max

setsockopt(2) の SO_RCVBUF, SO_SNDBUF で指定できる値の最大値。
SO_RCVBUF, SO_SNDBUF はそれぞれソケットの受信・送信バッファのサイズ。
rmem_max は初期 window サイズの上限値にもなる。

## net.ipv4.tcp_mem

システム全体で TCP が消費できるメモリの最大値。単位はページ。
左から順に min/pressure/max.

```bash
# CentOS 7.0.1406 での例
# この場合は 135MB, 181MB, 271MB になる
$ cat /proc/sys/net/ipv4/tcp_mem 
33972   45296   67944
```

デフォルト値は起動時の空きメモリをベースに計算される。
min は使えることが保証される値。
TCP 全体の消費量が pressure を超えるとメモリ消費が抑制されはじめる。
具体的には windows サイズを大きくすることをやめたり送信バッファの拡張を控えて最小限のメモリ確保で動作するようになる。
このモードになった回数は /proc/net/netstat の TCPMemoryPressures で確認できる。
これは min を下回るまで続く。（下回ると解除される）
max を超えることは無く、仮に超えるようなメモリ確保が走ると失敗する。

## net.ipv4.tcp_(r|w)mem

ソケット1つ1つが使うバッファのサイズ。
左から順に min, deault, max.

```bash
$ cat /proc/sys/net/ipv4/tcp_rmem
4096    87380   6291456

$ cat /proc/sys/net/ipv4/tcp_wmem
4096    16384   4194304
```

ソケットが作られると送受信バッファはデフォルトが割り当てられ、必要に応じて最大値まで大きくなる。
メモリに余裕があるならば最大値の設定を変えることで性能を向上させられる。
ただしこれはソケットごとの設定のため、ソケット数の最大値や運用状況に応じて計算する必要がある。
2014年のふり返り・書籍編

2014年に読み終えた本のリストです。

# 技術書（2冊）

| 著者 | タイトル |
|-----|---------|
| 相澤 歩 他 | [プロフェッショナルのための 実践Heroku入門](http://www.amazon.co.jp/exec/obidos/ASIN/4048915134/x7edimv35x-22/) |
| 角 征典 他 | [Ruby徹底攻略 (WEB+DB PRESS plus)](http://www.amazon.co.jp/exec/obidos/ASIN/4774165344/x7edimv35x-22/) |

# 実用書（3冊）

| 著者 | タイトル |
|-----|---------|
| 藤原 和博 | [藤原和博の必ず食える1%の人になる方法](http://www.amazon.co.jp/exec/obidos/ASIN/4492045082/x7edimv35x-22/) |
| 中村 信仁 | [営業の魔法—この魔法を手にした者は必ず成功する](http://www.amazon.co.jp/exec/obidos/ASIN/4902969513/x7edimv35x-22/) |
| フランクリン・コヴィー・ジャパン (監修) | [まんがでわかる7つの習慣](http://www.amazon.co.jp/exec/obidos/ASIN/4800215315/x7edimv35x-22/) |

# ライトノベル（18冊）

| 著者 | タイトル |
|-----|---------|
| 夏海 公司 | [なれる！SE 1—2週間でわかる？SE入門](http://www.amazon.co.jp/exec/obidos/ASIN/4048686054/x7edimv35x-22/) |
| 夏海 公司 | [なれる！SE 2—基礎から学ぶ？運用構築](http://www.amazon.co.jp/exec/obidos/ASIN/4048689371/x7edimv35x-22/) |
| 夏海 公司 | [なれる！SE 3—失敗しない？提案活動](http://www.amazon.co.jp/exec/obidos/ASIN/4048701819/x7edimv35x-22/) |
| 夏海 公司 | [なれる！SE 4—誰でもできる？プロジェクト管理](http://www.amazon.co.jp/exec/obidos/ASIN/4048705288/x7edimv35x-22/) |
| 夏海 公司 | [なれる！SE 5—ステップ・バイ・ステップ？カスタマーエンジニア](http://www.amazon.co.jp/exec/obidos/ASIN/4048708090/x7edimv35x-22/) |
| 夏海 公司 | [なれる！SE 6—楽々実践？サイドビジネス](http://www.amazon.co.jp/exec/obidos/ASIN/4048863509/x7edimv35x-22/) |
| 夏海 公司 | [なれる！SE 7—目からうろこの？客先常駐術](http://www.amazon.co.jp/exec/obidos/ASIN/4048868535/x7edimv35x-22/) |
| 夏海 公司 | [なれる！SE 8—案件防衛？ハンドブック](http://www.amazon.co.jp/exec/obidos/ASIN/4048911678/x7edimv35x-22/) |
| 夏海 公司 | [なれる！SE 9—ラクして儲かる？サービス開発](http://www.amazon.co.jp/exec/obidos/ASIN/4048916211/x7edimv35x-22/) |
| 夏海 公司 | [なれる！SE 10—闘う？社員旅行](http://www.amazon.co.jp/exec/obidos/ASIN/4048918591/x7edimv35x-22/) |
| 夏海 公司 | [なれる！SE 11—絶対？管理職宣言](http://www.amazon.co.jp/exec/obidos/ASIN/4048662902/x7edimv35x-22/) |
| 川原 礫 | [ソードアート・オンライン 1—アインクラッド](http://www.amazon.co.jp/exec/obidos/ASIN/4048677608/x7edimv35x-22/) |
| 高畑 京一郎 | [タイム・リープ—あしたはきのう (上)](http://www.amazon.co.jp/exec/obidos/ASIN/4073055801/x7edimv35x-22/) |
| 高畑 京一郎 | [タイム・リープ—あしたはきのう (下)](http://www.amazon.co.jp/exec/obidos/ASIN/4840205590/x7edimv35x-22/) |
| 秋山 瑞人 | [イリヤの空、UFOの夏 (その1)](http://www.amazon.co.jp/exec/obidos/ASIN/4840219443/x7edimv35x-22/) |
| 秋山 瑞人 | [イリヤの空、UFOの夏 (その2)](http://www.amazon.co.jp/exec/obidos/ASIN/4840219737/x7edimv35x-22/) |
| 秋山 瑞人 | [イリヤの空、UFOの夏 (その3)](http://www.amazon.co.jp/exec/obidos/ASIN/4840221731/x7edimv35x-22/) |
| 秋山 瑞人 | [イリヤの空、UFOの夏 (その4)](http://www.amazon.co.jp/exec/obidos/ASIN/4840224315/x7edimv35x-22/) |

# コミック（6冊）

| 著者 | タイトル |
|-----|---------|
| 西餅 | [ハルロック (1)](http://www.amazon.co.jp/exec/obidos/ASIN/4063883590/x7edimv35x-22/) |
| 西餅 | [ハルロック (2)](http://www.amazon.co.jp/exec/obidos/ASIN/406388385X/x7edimv35x-22/) |
| 大友 克洋 | [AKIRA (1)](http://www.amazon.co.jp/exec/obidos/ASIN/4061037110/x7edimv35x-22/) |
| 大友 克洋 | [AKIRA (2)](http://www.amazon.co.jp/exec/obidos/ASIN/4061037129/x7edimv35x-22/) |
| 大友 克洋 | [AKIRA (3)](http://www.amazon.co.jp/exec/obidos/ASIN/4061037137/x7edimv35x-22/) |
| 宮崎 駿 | [シュナの旅](http://www.amazon.co.jp/exec/obidos/ASIN/4196695108/x7edimv35x-22/) |
Yosemiteアップデート後に一からPlay2を始めるまでのあれこれ

色々ゆるゆるですが、環境構築で投げた人の参考にでもなればと。。

# Activatorコマンドの実行方法

最初、こちらの記事を参考にさせて頂きました。

> Typesafe ActivatorでEclipse＋Scalaの開発を行う準備をする
> http://www.mwsoft.jp/programming/scala/typesafe_activator_eclipse.html

が、いきなりactivatorコマンドを打っても、当然動かない訳です。

## 対策

Activatorのminimal版をダウンロードして来たので、jarとexecファイルがあるだけ。
activatorコマンドを実行するには、Windowsでいうところの環境変数を通す必要があります。

# Activatorのパスをどうやって通すか

( ˘ω˘ )｡oO(ここは苦労すべき所なのか…？) 

## 対策
minimalは忘れてbrewで持ってこよう…。

# brewが動かない！

brewが動きません。1.8のRubyを見に行ってﾅｲﾖｰと言われますが、インストール済みのRubyは最新版のはず…

## 原因と対策

こちらの記事を参考にさせて頂きました。

> Yosemiteでbrewが壊れた
> http://qiita.com/sue738/items/7ab03ecc9f6fcf37408d

![スクリーンショット 2015-01-02 14.59.54.png](https://qiita-image-store.s3.amazonaws.com/0/39099/0a32d5be-17ef-5a38-312e-251005ec1aef.png)

brew.rbファイルがバージョン1.8のrubyを参照しているので、そこを修正です。

brewが動いたのを確認したら、改めてActivatorをインストールします。
EclipseにはScalaプラグインをインストールしておいてください。

# play!プロジェクトのeclipse取り込み

cdコマンドで、Activatorが作成したplay!プロジェクトまで移動し、

> $activator eclipse

コマンドを実行すればplay!プロジェクトがEclipse取り込み可能となります。

**お疲れ様でした！**
Rails4のdeviseでユーザ登録→確認→完了画面を作成する

Rails認証エンジンDeviseでユーザー登録→確認→完了画面を作成する

:octocat: https://github.com/plataformatec/devise


## 前提
- Deviseがインストールされていること
- DeviseのView/Controllerカスタマイズ済み（※1）

※1
DeviseのViewカスタマイズ
[Rails4でdeviseのViewをカスタマイズする](http://qiita.com/akasakas/items/a06a0389d3c5da879ba7)
</br>
DeviseのControllerカスタマイズ
[Rails4でdeviseのControllerをカスタマイズする](http://qiita.com/akasakas/items/138c29fa2cecd271cfe4)
## ルーティング

```rb:routes.rb
devise_for :users, :controllers => {
 :registrations => 'users/registrations'
}

devise_scope :user do 
 post 'users/sign_up/confirm' => 'users/registrations#confirm'
 post 'users/sign_up/complete' => 'users/registrations#complete' 
end
```

細かいルーティングを設定したい場合はdevise_scope内に記述する必要があるようです。

## Controller

```rb:app/controllers/users/registrations_controller.rb
class Users::RegistrationsController < Devise::RegistrationsController
 before_action :create, only: [:complete]

  def confirm 
    @user = User.new(sign_up_params)
    if @user.valid?
      render :action => 'confirm'
    else
     render :action => 'new'
    end
  end
 
  def complete
    render :action => 'complete'
  end
end
```

## View

- ユーザ登録入力画面

post先を下記に変更

```html:app/views/devise/registrations/new.html.erb
<%= form_for @user, url: {action: "confirm"} do |f| %>
```

- 確認画面

```html:app/views/devise/registrations/confirm.html.erb
<%= form_for @user, url: {action: "complete"} do |f| %>
  <%= devise_error_messages! %>
  <div class="field">
    <%= f.label :email %>
    <%= f.hidden_field :email %>
    <%= @user.email %>
  </div>

  <div class="field">
    <%= f.label :password %>
    <%= f.hidden_field :password %>
    <%= @user.password %>
  </div>
 
  <div class="actions">
    <%= f.submit "Sign up" %>
  </div>

<% end %>

<%= render "devise/shared/links" %>

```

- 完了画面

```html:app/views/devise/registrations/complete.html.erb
  <div class="field">
    登録完了！！おつかれした。
  </div>
```

## 所感
RESTを考慮したフレームワークのためか、確認・完了画面を追加するとroutes.rbが汚くなった印象。
もう少し何かイケテル方法はないのだろうか。。。


## 参考
[Ruby on Rails 4 でお問い合わせフォーム（確認画面つき）を作成する](https://www.imd-net.com/column/1731/)
Rails4でdeviseのControllerをカスタマイズする

Rails認証エンジンDeviseのControllerをカスタマイズする方法について説明します。

:octocat: https://github.com/plataformatec/devise

## Devise導入方法
Gemfileにdeviseを追加

```rb:Gemfile
gem 'devise'
```
deviseインストール&Userモデルを生成

```
bundle Install
rails g devise:install
rails g devise User
```

## DeviseControllerのカスタマイズ方法

認証ユーザーのモデルが User であれば、app/controllers/users ディレクトリ以下にファイル作成

```
rails g devise:controllers users
```

```
rails g devise:controllers [scope]
```
で app/controllers/[scope]以下に以下のControllerが生成される

- confirmations_controller.rb
- omniauth_callbacks_controller.rb
- passwords_controller.rb
- registrations_controller.rb
- sessions_controller.rb
- unlocks_controller.rb

## ルーティング設定
生成したDeviseControllerのルーティングを設定します。

```rb:routes.rb
devise_for :users, :controllers => {
 :registrations => 'users/registrations'
}
```

上記はregistrations_controller.rbのルーティング設定で、sessions_controller.rbなどのルーティングも設定したい場合はroutes.rbに下記を追加

```rb:routes.rb
devise_for :users, :controllers => {
 :registrations => 'users/registrations',
 :sessions => 'users/sessions'
}
```

## 参考
[Rails で Devise のコントローラーをカスタマイズ](http://easyramble.com/cutomize-controllers-on-rails-devise.html)
[Rails – Deviseのコントローラをカスタマイズする方法](http://www.tamurasouko.com/?p=929)
[Devise で devise_for メソッドによるルーティングを確認](http://easyramble.com/routing-by-devise-for.html)
Rails4でdeviseのViewをカスタマイズする

Rails認証エンジンDeviseのControllerをカスタマイズする方法について説明します。

:octocat: https://github.com/plataformatec/devise

## Devise導入方法
Gemfileにdeviseを追加

```rb:Gemfile
gem 'devise'
```
deviseインストール&Userモデルを生成

```
bundle Install
rails g devise:install
rails g devise User
```

## DeviseViewのカスタマイズ方法

```
rails g devise:views users
```

```
rails g devise:views [scope]
```
で app/views/[scope] 以下に以下のviewsが生成される

- confirmations/
- mailer/
- passwords/
- registrations/
- sessions/
- shared/
- unlocks/

## 参考

[Railsの一番人気のログイン認証gemのDeviseのカスタマイズ方法](http://ruby-rails.hatenadiary.com/entry/20140804/1407168000)
[DeviseでViewをカスタマイズする](http://qiita.com/lassy423/items/c364e3746975c83189aa)
[Rails で Devise のビューを作成してカスタマイズ](http://easyramble.com/create-views-on-rails-devise.html)
"B"の出力が"#"よりもめちゃくちゃ遅いんだけどなんで？

Stack Overflowで見かけた質問とエスパー回答。

質問：[Why is printing "B" dramatically slower than printing "#"?](http://stackoverflow.com/questions/21947452/why-is-printing-b-dramatically-slower-than-printing/)

回答：[Word-warp機能のせいじゃない？](http://stackoverflow.com/questions/21947452/why-is-printing-b-dramatically-slower-than-printing/21947627/#21947627)
log4js-nodeを使ってみた


[log4js-node](https://github.com/nomiddlename/log4js-node)とは、node上で動作するようにしたlog4js。log4js-nodeは、log4jsとは異なるライブラリみたいだ。

## 準備する

適当にプロジェクトを作り、log4js-nodeをインストールする。

	$ mkdir hello-log4js-node
	$ cd hello-log4js-node
	$ npm init
	$ npm install log4js --save
	$ touch index.js

## Hello log4js

最小のコードを実行してみる。

```javascript:index.js
var log4js = require('log4js');
var logger = log4js.getLogger();

logger.debug('Hello log4js');
```

デフォルトでは、標準出力に出力される。

```
$ node index.js
[2015-01-02 00:27:45.956] [DEBUG] [default] - Hello log4js
```

## 	ログをファイルに出力する - その1

```javascript:index.js
var log4js = require('log4js');
// (*1) コンソール出力しない場合は、Appenderをクリアする必要がある。
//log4js.clearAppenders(); 
log4js.loadAppender('file'); // (*2)
log4js.addAppender(log4js.appenders.file('./debug.log'), 'hello-log4js');

var logger = log4js.getLogger('hello-log4js');
logger.setLevel('WARN'); // (*3)

logger.trace('Hello log4js');
logger.debug('Hello log4js');
logger.info('Hello log4js');
logger.warn('Hello log4js');
logger.error('Hello log4js');
logger.fatal('Hello log4js');
```

* `file` appenderをLoadし(*2)、出力先のファイルとcategory `hello-log4js`を指定して、Appenderを追加する。
* デフォルトでは、コンソールにも出力するので、ファイルのみに出力したい場合は、`log4js.clearAppenders`する。(*1)

出力結果は、以下のような感じ。ログレベルを`WARN`に設定しているので、TRACE/DEBUG/INFOは出力されない。

```bash
$ node index.js 
[2015-01-02 01:25:21.151] [WARN] hello-log4js - Hello log4js
[2015-01-02 01:25:21.153] [ERROR] hello-log4js - Hello log4js
[2015-01-02 01:25:21.153] [FATAL] hello-log4js - Hello log4js
```

## ログをファイルに出力する - その2

ファイル出力するための設定は、以下のようにも書くことができる。

```javascript:index.js
var log4js = require('log4js');
log4js.configure({
  appenders: [
    { type: 'console' },
    { type: 'file', filename: 'debug.log', category: 'hello-log4js' }
  ]
});

var logger = log4js.getLogger('hello-log4js');
logger.setLevel('WARN');

logger.trace('Hello log4js');
logger.debug('Hello log4js');
logger.info('Hello log4js');
logger.warn('Hello log4js');
logger.error('Hello log4js');
logger.fatal('Hello log4js');
```

## より実践的な設定

log4js-nodeの`README`にもリンクされているが、express+log4jsの[サンプルアプリケーション](https://github.com/nomiddlename/log4js-example)がある。

このサンプルが非常に参考になった。