OmniAICreator/Qiita-1.07M huggingface dataset:
F# Interactive

F# Interactiveは、Xamarin Studioで使えるF#のREPL環境です。

![studyf_-_Program_fs__-_Xamarin_Studio-5.png](https://qiita-image-store.s3.amazonaws.com/0/7946/e95bd4b5-7b28-c167-c30a-bd4720b79328.png "studyf_-_Program_fs__-_Xamarin_Studio-5.png")

F# Interactiveの出し方
----
ビュー → パッド → F# Interactive
![ビュー__V__と_Menubar.png](https://qiita-image-store.s3.amazonaws.com/0/7946/33c9d7ae-2560-8097-89ad-8be54b815953.png "ビュー__V__と_Menubar.png")


教本
----
[tryfsharp.org](http://www.tryfsharp.org)というサイトがあり、その中に[Getting Started in F#](http://www.tryfsharp.org/Learn/getting-started)というコンテンツがあるので、これを読みながら写経したりしてます。
このサイトの中には、Silverlightで動くREPL環境があるのですが、MacのSafariではキー入力が出来ずに断念しました。

F# Interactiveの中でのお約束
----
- 評価するには、末尾に;;を付けてエンター
svg vs canvas @html5

とても基本的なことでありますが
「svg と canvas はどう違うのか？」
について調べたことをまとめておこうと思います。

# ベクター形式とラスター形式
コンピュータ上で「２次元の絵」書こうと思った場合、どのような方法が考えられるでしょうか？

ざっくり言うと、
ラスター形式は（別名ビットマップと言います）、小さな点の集合を集めて絵を描く方法です。
対して、ベクター形式は、図形の集合を集めて絵を描く方法です。

http://www.geocities.jp/para_core/kouza/vrpi.html

# svg vs canvas performance にフォーカスした場合
以下の資料が参考になります。
http://msdn.microsoft.com/ja-jp/library/gg193983(v=vs.85).aspx

# svg
ベクター形式です。

## メリット
図形は dom 要素（div タグみたいなもの）です。従って、図形に対して（div 要素などと同じように）マウスクリックなどのイベントに対するコールバック処理を容易に追加することができます。

「この三角形がクリックされたら」みたいな処理は、「このタグがクリックされたら」という処理と同じような形で作成できます。このような「図形を対象としたイベント駆動型の処理」をしたいなら、svg がいいでしょう。

## デメリット
svg を jpg, png 画像に変換するためには、自分で変換処理を書く、又は、ライブラリを利用しなければなりません。

# canvas
ラスター形式です。

## メリット
図形はビットマップなので、jpg, png 画像に変換することが容易にできます。

「お絵描きアプリ」のようなものの利用者は、作成した絵を png などで保存し、作品を多数の人に見てもらいたいと思うものですので、canvas の利用が適していると言えます。

## デメリット
svg で得意であった、「図形を対象としたイベント駆動型の処理」を容易に作成することができません。
年額3.65ドルでSSL証明書を手に入れる

#SSL証明書

情報を暗号化する SSL の機能を使用する際に必要となるもの。
身元情報や認証局の確認も行える。

##国内の安いプランを探す

まずは国内で探すとなると、RapidSSLが安く販売されている。
以下のサイトであれば年額1000円ほどで発行される。
http://www.ssl-store.jp/rapidssl/

しかしながら、安い証明書は海外で発行されたものが多いので、
わざわざ日本で買う必要はないと感じ海外サイトを探してみる。


##海外の安いプランを探す

いろいろ探してみたが、
Comodo Positive SSLが安いとわかり、尚且つGoGetSSLというサイトが一番安かった。
https://www.gogetssl.com/

時々キャンペーン等で安くなっているサイトもあるので、その時々で探すとよいかも。

##発行する

指定のSSLの項目へ行き、購入。

![Cheap_Comodo_Positive_SSL_starting_at__3_65_year1.jpg](https://qiita-image-store.s3.amazonaws.com/0/49877/7d44ed9e-148c-9bf1-d0d1-ec32154075b8.jpeg)


個人用に

![SSL_Order_System_2_0___GOGETSSL.jpg](https://qiita-image-store.s3.amazonaws.com/0/49877/04126fd9-35f7-0dab-5718-a548beffa7a8.jpeg)

必須項目をすべて埋める

![SSL_Order_System_2_0___GOGETSSL.jpg](https://qiita-image-store.s3.amazonaws.com/0/49877/67db8c4b-2dc7-c5c9-1d84-21cd8417cca9.jpeg)

その後、支払い方法を決めれば一時発行は完了する。

##秘密鍵の作成

先ほど購入した証明書に紐付けるドメインを購入する。

マイページからMyCSRCodesを選択し、新規に作成する。

![SSL_Client_s_Area___GOGETSSL.jpg](https://qiita-image-store.s3.amazonaws.com/0/49877/28011ff7-80db-e0b7-7c3d-82f7084aed9b.jpeg)

必須項目を入力する。

![SSL_Client_s_Area___GOGETSSL１.jpg](https://qiita-image-store.s3.amazonaws.com/0/49877/b2102ac8-eb31-827e-fdf3-a2315f05fc5b.jpeg)

完了すると秘密鍵を貰えるので、控えておく。

##証明書と紐付ける

購入した証明書と秘密鍵を紐付ける。

尚、証明書と紐付けるまでは、注文が完了しないのでこの時点でキャンセルもできる。

マイページから購入したドメインを選択し、キーを入力する。

![SSL_Client_s_Area___GOGETSSL３.jpg](https://qiita-image-store.s3.amazonaws.com/0/49877/3a7bca11-c923-9972-75b6-11b54b8672fe.jpeg)

決済が完了し、SSL証明書がダウンロードできる。

以上

##ETC...

SSLをAWSに組み込む手順は以下を参照

http://comodo.jp/support/crt/dtl_51
お試し VimR (Vim Refined)

[VimR](http://vimr.org/) なるものがあったのでインストールしてみた

![スクリーンショット 0026-08-17 22.45.07.png](https://qiita-image-store.s3.amazonaws.com/0/28573/573113d6-564e-a2d9-2925-c6d2ed726604.png)


## インストール 
* ダウンロードは [ここ](http://vimr.org/) から
* tar.bz2 形式でダウンロードされるので、適当に解凍
* 解凍すると VimR.app というアプリケーションができるので /Applications に置いて完了

* HomeBrew-Caskを利用している人は以下のコマンドでインストールされ、/Applicationsにエイリアスができる

```
$ brew cask install vimr
```

## エイリアス
* 使いやすいように .bashrc とかにエイリアスを定義しておく

```bash:.bashrc
alias vimr='open -a VimR'
```

## 機能
![スクリーンショット 0026-08-17 22.44.06.png](https://qiita-image-store.s3.amazonaws.com/0/28573/529c85e9-38e5-6ed5-e913-9064e977d3da.png)

* 基本機能は Vim と同じ
    * .vimrc も読み込んでいる

* デフォルトでディレクトリツリーが表示される
    * Command + 0 で非表示
    * Command + 1 で表示(表示中はカーソル移動)

* あいまい検索
    * Command + Shift + 0 でカレントディレクトリ以下をあいまい検索できる

## 所感
* MacVim との違いはあいまい検索くらいな気はするけど、しばらく使ってみようと思う

# 参考
* http://vimr.org/
* https://github.com/qvacua/vimr
zshにpeco + ghqを導入したメモ

流行りからだいぶ遅れた感あるが、[peco](https://github.com/peco/peco) + [ghq](https://github.com/motemen/ghq)をMacに導入したのでメモっとく。

# インストール

homebrewでインストール。

```
$ brew tap peco/peco
$ brew install peco

$ brew tap motemen/ghq
$ brew install ghq
```

# 設定

## GOPATH
`$HOME`に設定してある。

```zsh:~/.zshrc
export GOPATH=/User/Yusuke
```

`go get`したら`~/src`以下にライブラリとか入ってく。

## ghqのパス設定
GOPATHと揃える。

```
$ git config --global ghq.root ~/src
```

```~/.gitconfig
[ghq]
  root = /Users/Yusuke/src
```

これで、`ghq get <Githubのレポジトリ>`で、`~/src/github.com/`以下にレポジトリがクローンされる。
例えば、`ghq get https://github.com/rails/rails`をすると、`~/src/github.com/rails/rails/`という感じでディレクトリができる。

## pecoを使ったコマンド
### コマンド履歴を出して検索・絞り込みするやつ

```zsh:~/.oh-my-zsh/custom/my.zsh
setopt hist_ignore_all_dups

function peco_select_history() {
  local tac
  if which tac > /dev/null; then
    tac="tac"
  else
    tac="tail -r"
  fi
  BUFFER=$(fc -l -n 1 | eval $tac | peco --query "$LBUFFER")
  CURSOR=$#BUFFER
  zle clear-screen
}
zle -N peco_select_history
bindkey '^r' peco_select_history
```

これで、`Ctrl + r`でコマンド履歴の補完候補がズラッと出る。インクリメンタルサーチ可能。1行目は同じコマンドを出さない設定。

### ghqでクローンしてきたレポジトリへの移動が捗るやつ

`ghq list`で、ghqでクローンしてきたレポジトリのパスが一覧で出る。これをパイプで`peco`に渡すと、レポジトリ名でインクリメンタルサーチできるので利用。

```zsh:~/.oh-my-zsh/custom/my.zsh
function peco-src () {
  local selected_dir=$(ghq list -p | peco --query "$LBUFFER")
  if [ -n "$selected_dir" ]; then
    BUFFER="cd ${selected_dir}"
    zle accept-line
  fi
  zle clear-screen
}
zle -N peco-src
bindkey '^]' peco-src
```

`Ctrl + ]`でghq管理下のレポジトリの補完候補が出るので、選択すれば一発で飛べる。

設定ファイルが汚くなるので、peco関連の設定はまとめて別ファイルに移すのが良さげ。。

## pecoのキーマップ
`~/.config/peco/config.json`にキーマップやstyleの設定を書いておける。

```json:~/.config/peco/config.json
{
  "Keymap": {
    "M-v": "peco.ScrollPageUp",
    "C-v": "peco.ScrollPageDown"
  },
  "Style": {
    "Selected": ["underline", "on_green", "black"],
    "Query": ["red", "underline"]
  }
}
```

# おわり
そういうわけで、レポジトリの管理は`~/src`以下で行うことにしてみました。
ENUMとINTへの変換(列挙型をうまくつかってインデックスにする)


いわゆるETOI,ITOE系の説明。

ETOIは<font color="red">Enum to Int</font>

ITOEは<font color="red">Int to Enum</font>です。



```cpp:cpp
	// 自分のタイプに合わせてゲームのモードを選択する。
	enum struct type{
		OTTORI,
		SEKKACHI
	}

	const char* gamemodes[]={
		"スコアモード",	
		"タイムトライアルモード"
	}

// ※ enum structはC++11で追加されました。
// enum structはenum classと等価であり、従来の型の内enumとは違って
// 型があるものです。

```
こんな二つの情報があって、関連させたい場合、
enumを綺麗にintにキャストしてあげなければなりません。

★キャストについて★
enumのまま数字にキャストするには、
<font color="blue">static_cast</font>を用います。<font color="blue">static_cast</font>は、その場でキャスト可能かどうかを確認するので
ダメな場合はコンパイルエラーを吐きます。これに対して実行時に確認するものは
<font color="blue">dynamic_cast</font>をもちいます。ダウンキャストに用います。
cocos2d-xでは、<font color="blue">Ref*</font>→<font color="blue">Node*</font>とかに用いるといいです。<font color="blue">(Node*)</font>でのキャストはおすすめせず、

```cpp:
dynamic_cast<Node*>(hoge)

```
にしましょう。

少し話がそれました。enumをIntにキャストするので、

```cpp:
	type t = type::OTTORI;
	int index = static_cast<int>(t);

	const char* gamemode = gamemode[index];
// gamemode = gamemodes[0]
```

のように使います。

逆にindexからenumに戻したい場合は

```cpp:
 type t = static_cast<type>(index);
```

の用に用います。とりあえず頻繁にCの()でのキャストは脱却して、この二つから使ってみましょう。castにはreinterpret_castなど、いくつかありますが、頻用するのはこの2つだと思います。
[RSpec] allow、receive、and_return メソッドを使って特定のメソッドをスタブ化する

RSpec でスタブ化する方法を検索すると、今は推奨されていない stub メソッドを使う方法はよく見つかるのですが、allow メソッドを使う方法を紹介する記事があまり見つからなかったので具体例を投稿しておきます。

テスト対象のクラスです。

```japan.rb
class Japan
  def get_capital
    "Tokyo"
  end
end
```

そしてテストコードです。下記のテストは成功します。

```japan_spec.rb
require_relative "japan.rb"
  
describe "Japan.get_capital" do
  it "returns Saitama" do
    japan = Japan.new 
    allow(japan).to receive(:get_capital).and_return("Saitama") 
    expect(japan.get_capital).to eq("Saitama")
  end
end
```

`allow` メソッドの引数にスタブ化したいメソッドを持つインスタンスを、`receive` メソッドの引数にスタブ化したいメソッド名のシンボルを、`and_return` メソッドにスタブ化されたメソッドに返してほしい返り値を渡します。

`get_capital` メソッドは、本来は `Tokyo` を返しますが、前述のスタブ化によって `Saitama` を返すようになりました。
PostgreSQLのerror FATAL:  Ident authentication failed for user

rake コマンドを実行したら、PostgreSQLでエラーがでました。CentOS環境です。

```bash:rakeコマンドでエラー
bundle exec rake db:create
FATAL:  Ident authentication failed for user "hoge_user"
```

pg_hba.confを修正する必要があるみたいです。

```bash:pg_hba.confを書き換え
sudo vi /var/lib/pgsql/data/pg_hba.conf

# "local" is for Unix domain socket connections only
local   all         all                               ident sameuser
# 上記をtrustに変更
local   all         all                               trust
```
ident sameuserと書いてある箇所をtrustに書き換えるとエラーが出ないようです。
PostgreSQLを再起動します。

```bash:PostgreSQLを再起動
sudo /etc/init.d/postgresql restart
```
rakeコマンドを実行したらエラーが出ませんでした。
Mac + Nexus5 で Android L を最初からインストールしてみる

# 概要
Nexus5 に新 OS の Android L をインストールしてみます。
いろんなサイト読んでみたのですが、
比較的細かいところがわかりにくいのでインストールするとともに、細かい作業ログとして残してみます。

# Nexus5 にて USBデバッグ が出来る状態にする 

## 操作
- `設定 -> 端末情報` の `ビルド番号` を連続で7回タップしまくる
- `設定 -> 開発者向けオプション -> USBデバッグ` を `ON`
- `設定 -> ？ ->` 端末接続時に `MTPモード` にチェック入ってるのをはずしておく 
    - ついでに両方チェックされてない事を確認する

## 参考

- http://androidlover.net/smartphone/nexus-five/nexus5-developer-options-usb-debug-on.html
- http://t-f-android.hatenablog.com/entry/2013/11/16/204711


# Mac にて Android SDK をインストールする
### 以下からダウンロードして解凍しておく
http://developer.android.com/sdk/index.html#download

## ターミナル と ファインダー で SDK インストール作業
```
$ mkdir ~/eclipse/
$ mv ~/Downloads/adt-bundle-mac-x86_64-20140702 ~/eclipse/
```

## 以下のサイトの通りインストールする
http://techfun.cc/android/mac-android-sdk-install.html
`ダウンロードフォルダ -> sdk -> tools -> android` 
で開きますが、この時ダブルクリックしても開かない場合があるので、`右クリック -> 開く` で開くことができます。

## Android SDK Manager が開くので必要そうなの適当にインストール
正直 Android 開発したことないので、どれインストールすべきかハッキリわかってませんが、
以下のものをインストールしておけば十分そうです。

```
- Tools
    - Android SDK Tools (多分これがほしい)
    - Android SDK Platform-tools (多分これがほしい)
    - Android SDK Build-tools Rev.20
- Android L 全部
- Android 4.4W 全部
```
これを `Install packages...` でインストール。
インストール時に規約の同意を求められるので、バージョン選択・同意後、インストール
この作業は5分〜10分くらいで完了します。

## ターミナル
まず SDK ツールのパスを通します

```
$ vi ~/.zshrc 
```

自分のシェルの環境設定ファイルに以下の二行を追記してください
※僕の場合、`zsh` を使ってるので `~/.zshrc` で編集してます。

```
export PATH="$PATH:/SDKのフォルダ/sdk/tools"
export PATH="$PATH:/SDKのフォルダ/sdk/platform-tools"
```

SDK のフォルダは、僕の場合 `/User/ma3tk/eclipse/` になるので、

```
export PATH="$PATH:/User/ma3tk/eclipse/sdk/tools"
export PATH="$PATH:/User/ma3tk/eclipse/sdk/platform-tools"
```

といった形になります。

追記したら、

```
source ~/.zshrc
```

環境再読み込み。
これで SDK のインストールは完了です。

# Nexus5 の ブートローダー アンロック

環境がきちんと設定されてることが前提で、
ブートローダーというものをアンロックします。

## 端末の接続
まず、Nexus5 を USB ケーブルで接続し、
`デバッグモード`で接続ができてることを確認して下さい。

## 再起動
実際にインストールする作業に移っていきます。

```
$ adb reboot bootloader
```

上記コマンドで端末が再起動します。
`adb command not found`等と出る場合は パスが通ってないので、`~/.zshrc` を再確認して下さい。


## ロック解除
再起動が確認できたら、ロックを解除します。
※下記コマンドにより保証が受けられなくなる可能性が非常に高いため、必ず自己責任で実行してください。

```
$ fastboot oem unlock
```

端末(nexus5)で本当にこの処理をやっていいかどうかの選択求められます。
ハードの音量ボタンの上下と電源ボタンで選択(決定)してください。
※ちなみにここでキーボードの上下操作しても何も起こらないので注意。

上記が問題なく終了すれば ブートローダーのアンロック作業は完了です。

# Android L を Nexus5 端末 にインストールする

※Nexus5 内のデータが真っさらになりますので、必要な情報のバックアップ、アカウントの引き継ぎ、写真データ等には十分注意してください。

### 以下をダウンロードして解凍しておく
http://developer.android.com/preview/setup-sdk.html#top

## インストール
ターミナルにて、

```
$ cd ~/Downloads/hammerhead-lpv79
$ ./flash-all.sh
```

でしばらく待つと インストールが完了します。

# あとがき
インストール作業自体は簡単なのですが、 Android 開発環境構築が大変でした。
SDK の環境構築は比較的わかりにくいので、色々なサイトを参考にしながらやってみてください。
Oracle12c　事始め


#1. 目的
11gまでの知識しか持っていない状態で12cを使い始める時の備忘録
代表的な変更点についてまとめておく。

#2. マルチテナント・アーキテクチャ
最も大きな機能追加が、"マルチテナント・アーキテクチャ"と呼ばれる、マルチテナント・コンテナ・データベース(CDB)とプラガブル・データベース(PDB)に分離された点。
CDBには複数のPDBをプラグすることが出来、SGAなどは共有される。


##2-1. マルチテナント・アーキテクチャでのメリット

* データベースの新規作成やコピーといった環境構築の高速化
* アンプラグ&プラグ操作による既存DBから新規プラットフォームへの移行の高速化
* パッチ適用やアップグレード作業コストの削減 (パッチはCDBに適用)
* 高密度のデータベース集約

##2-2. PDBの作成

実際にPDBを作成してみる。

```sql
create pluggable database examplepdb  default tablespace EXAMPLETBS datafile '/opt/oracle/oradata/orcl/example.dbf' size 100M autoextend on  FILE_NAME_CONVERT =('/opt/oracle/oradata/orcl/pdbseed', '/opt/oracle/oradata/orcl/examplepdb') admin user example identified by example;
```

と、実行したところで下記エラーが。。。

ORA-65010: maximum number of pluggable databases created


どうやら、Oracle EEのマルチテナントオプションが無いと1PDBしか
管理できなくて、インストール時にPDBを作成してたから、
これ以上は作れないらしい。

```sql
drop pluggable database pdborcl including datafiles;
```

ということで、インストール時に作成したPDBを削除すると作成が出来た。
けど、Standard Edition以下しか使わないのであれば、CDBとPDBに
分ける必要って無いよね・・・
AppEngineの開発サーバーで静的ファイルが表示されないバグ

Windows8.1かつpython 2.7.7な環境でAppEngineの開発サーバーを動かすと
静的なファイルの表示ができなくなるバグがあるみたいです。
久々に動かしてみたら静的なファイルが出なくなって焦りました。


```TypeError: WSGI response header value u'application/json' is not of type str.```
こんな感じのエラーがでてjsやらcssやら静的にホストしたファイル一切が表示されません。
unicode型とstr型で不整合が起きているみたいですね。


##解決策
Python 2.7.7を2.7.8にする

http://bugs.python.org/issue21652
どうもWindows版Pythonにminetype絡みのバグが有ったみたいです。
アップデートしてあげれば無事解決。

参考:
http://stackoverflow.com/questions/24106776/google-app-engine-wont-serve-static-assets-with-below-error
boot2dockerのディスク容量に空きが無くなってイメージのビルドに失敗する問題


コンテナの作成時にboot2dockerのVM上のディスク容量が無くなってしまい、RUNコマンドが失敗するようになってしまった。
自分の環境ではboot2dockerのVMのディスクサイズは20Gだった。

```
$ boot2docker config
2014/08/17 21:41:07 boot2docker profile filename: /Users/nyamage/.boot2docker/profile
Verbose = false
VBM = "VBoxManage"
SSH = "ssh"
SSHGen = "ssh-keygen"
SSHKey = "/Users/nyamage/.ssh/id_boot2docker"
VM = "boot2docker-vm"
Dir = "/Users/nyamage/.boot2docker"
ISO = "/Users/nyamage/.boot2docker/boot2docker.iso"
VMDK = ""
DiskSize = 20000
Memory = 2048
SSHPort = 2022
DockerPort = 2375
HostIP = "192.168.59.3"
DHCPIP = "192.168.59.99"
NetMask = [255, 255, 255, 0]
LowerIP = "192.168.59.103"
UpperIP = "192.168.59.254"
DHCPEnabled = true
Serial = false
SerialFile = "/Users/nyamage/.boot2docker/boot2docker-vm.sock"

```

不要なDockerのイメージを削除すれば直るかもしれないけど、ディスク容量も少し増やしておきたい。
boot2dockerのイメージ上にあまりデータを保存してなかったので、イメージを作り直すことでディスクサイズの変更した。以下のような手順でいけたはず（うろ覚え）。configの指定かinitのディスクサイズのどちらかは不要だと思うけど、どっちがいらなかったのか不明。

boot2dockerのイメージを一度消すので、この手順を試す際は気をつけて。

```
$ boot2docker config -s 40000 > /Users/nyamage/.boot2docker/profile
$ boot2docker down
$ boot2docker delete
$ boot2docker init -s 40000 
$ boot2docker up
```

boot2dockerのイメージを削除した影響としてはboot2docker上にダウンロードしたイメージが消えてるのでコンテナの最初の作成に少し時間がかかるのと、docker-enterを再インストールしなきゃいけなくなった位。

今後のためにも、イメージ消さなくてもディスク容量増やす方法誰か教えて下さい。
Node.jsから、Googleスプレッドシートに書き込む


Node.jsでやることか、とか思いつつもやりたかったので仕方がない。npmに数多くのGoogleスプレッドシートに関するモジュールがあるけれど、GoogleさんがAPIのバージョンを上げていく一方、それに追従してメンテしてくれる人は、そんなに多くない…。

というわけで、いろいろ試したものの、まともに動くものがなかったので、自分でほんのちょっと改修してみました。

# 使用モジュール

- edit-google-spreadsheet

なかなかイケてるモジュールです。読み書き両方できます。使い方も[サンプルが色々ある](https://github.com/jpillora/node-edit-google-spreadsheet)ので分かりやすいと思います。若干コールバック地獄になりがちですが、node.js v0.12まで我慢…かな。

ただし、読む部分が今のGoogleSpreadsheetAPIだと動きません。昔は、認証さえされていれば非公開なドキュメントであっても、JSON形式でデータにアクセスできたんですが、今は公開状態のものでないと駄目。なぜかXML形式は非公開でも閲覧できる…。

- https://developers.google.com/gdata/samples/spreadsheet_sample?hl=ja

XMLモジュール入れれば解決できるやん！と思ったら、なんと偉人がすでにプルリクを投げていらっしゃる。

- https://github.com/jpillora/node-edit-google-spreadsheet/pull/33

しかし…edit-google-spreadsheet本家の人は、もうメンテできないから、誰かやって状態でプルリクも放置気味…まぁ仕方ないですね。というわけで、自分でフォークして上記プルリクをあてて、さらにちょっとだけ改修したものをアップしました。

- https://github.com/zaru/node-edit-google-spreadsheet

## インストール方法

```package.json
{
  "dependencies": {
    "xml2json": "*",
    "edit-google-spreadsheet": "zaru/node-edit-google-spreadsheet"
  }
}
```

```
$ npm install
```

npmで普通にedit-google-spreadsheetをインストールすると本家のものがダウンロードされるけど、GitHubのパスを指定すれば、僕がアップしたものが適用されます。

# 認証方法

認証方式は3つ。

- IDとパスワード
- OAuth
- Token

正直、最初のIDとパスワード方式しか試してないです。

# 使い方

シートに次々新しい行としてデータを保存していきたいので、receive()を使って、現在の最終行を取得してから、書き込みます。

```hoge.js
var Spreadsheet = require('edit-google-spreadsheet');

Spreadsheet.load({
  debug: true,
  spreadsheetId: 'スプレッドシートID',
  worksheetId: 'ワークシートID', // 1つめだったら、od6
  username: 'example@google.com',
  password: 'password'
  }, function sheetReady(err, spreadsheet) {
  spreadsheet.receive(function(err, rows, info) {
    if(err) throw err;

    // 最後の行数を取得
    var nextRow = info.nextRow;
    var output = {};
    output[nextRow] = {
      1: "hoge",
      2: "piyo",
    };
    spreadsheet.add(output);
    spreadsheet.send(function(err) {
      if(err) throw err;
      console.log("comp");
    });
  });
});
```

これだけでOKです。簡単便利。ただし、これをWebリクエストで処理しようとすると、もちろんロックなんてされてないので、同じようなタイミングでアクセスされると、同じ行に書き込まれ、最初のほうが闇に葬り去られます。気をつけましょう。っても、どうやって気をつけるかは、分からんけど（バッチ処理にするなど？）。

## ワークシートIDの謎

これもまたGoogleスプレッドシートがバージョンアップされ、ワークシートIDが参照しにくくなっていて、謎すぎるんですが、1つ目のワークシートであれば`od6`らしいです。2つ目が`od7`。36進数っぽいんだけど、スプレッドシートURL最後の`#gid=0`の数値はなんか関係なさ気…。謎。

調べると、`worksheetID = (gid xor 31578) encoded in base 36`みたいです。まぁでも今これで計算しても、うまくいかないんですけどね…。誰か教えて欲しい。

- http://stackoverflow.com/questions/11290337/how-to-convert-google-spreadsheets-worksheet-string-id-to-integer-index-gid
【Androidアプリ】開発アプリがエミュレーターで実行できない時の対処方法


#開発したアプリをエミュレーターで実行する方法

##はじめに
開発したアプリ(画面にHello Worldを表示するもの)が、エミュレーターで表示されなかった時の
<br>対処方法を備忘録として記載します。

##問題
エミュレーターでアプリを実行しても下記のような画面になり、動作確認が行えませんでした。
![error.jpg](https://qiita-image-store.s3.amazonaws.com/0/49322/5dfc4982-6719-8a86-3875-470f3e74924f.jpeg)

##原因
インストールしたSDKのバージョンとアプリ(プロジェクト)作成時に選択した<br>「ターゲットSDK」のバージョンが異なっていました。
(「ターゲットSDK」でインストールしていないSDKのバージョンを選択し、<br>アプリの作成を行っていました。)

##対処
SDKを追加でインストールし、アプリ作成時に選択した「ターゲットSDK」と一致させました。<br>※今回は「Android 4.2.2(API17)」で作成することにしました。
![Installed_SDK.jpg](https://qiita-image-store.s3.amazonaws.com/0/49322/95f3f74c-d97c-53d2-7e5d-d35919a3c21b.jpeg)

![TargetSDK.jpg](https://qiita-image-store.s3.amazonaws.com/0/49322/14a2c164-57a2-128f-4c42-2e2f59174323.jpeg)

##結果
SDKのバージョンを一致させ、アプリを作成し直したところ、エミュレーターで<br>開発したアプリが表示されるようになりました。
![success.jpg](https://qiita-image-store.s3.amazonaws.com/0/49322/9230565d-e80c-8dd1-76a1-b7d71135a2a7.jpeg)
Node.js+Express4でMongoDBを使う＆バリデーションする


Express4で、MongoDBを使いつつ、バリデーションしてみます。mongoちゃんは、非常に楽でいいですね。小規模サービスなら、色んな事気にしなくていいし。MySQLをnode.jsで使おうとすると重いし、面動だして良い事ないですね。

# 使用モジュール

- mongoose
- mongoose-unique-validator
- ect（レンダリングエンジン / jadeでもejsでもok）

# モデルファイルの作成

適当にユーザ登録するフォームを作ったとして、名前とメールアドレスを保存するとします。メールアドレスはユニークがいいので、`mongoose-unique-validator`というモジュールを別途インストールしておきます。

`required: true or エラーメッセージ`といったフォーマットで必須かどうかを設定できます。

```model.js
var mongoose = require('mongoose');
var uniqueValidator = require('mongoose-unique-validator');
mongoose.connect('mongodb://localhost/hoge');

var userSchema = mongoose.Schema({
  name: { type: String, required: 'ニックネームを入力してください'},
  email : { type: String, required: 'メールアドレスを入力してください', unique: true }
});
userSchema.plugin(uniqueValidator, { message: 'すでに登録されているメールアドレスです' });
var User = mongoose.model('User', userSchema);

exports.User = User;
```

# コントローラー作成

- /register : 登録フォーム
- /register/confirm : 入力内容チェック＆保存
- /register/complete : 登録完了ページ

```register.js
var model = require('../model.js');
var User  = model.User;

router.get('/', function(req, res) {
  res.render('register/index', {
    title: 'ユーザ登録',
    nickname: "",
    email: "",
    errors: {}
  });
});

// POSTでフォームから飛んできたデータをモデルに保存、失敗したらフォームに戻す
router.post('/confirm', function(req, res) {

  var newUser = new User(req.body);
  newUser.save(function(err){
    if (err) {
      res.render('register/index', {
        title: 'ユーザ登録エラー',
        errors: err.errors
      });
    } else {
      req.session.name = req.body.name;
      req.session.email = req.body.email;
      res.redirect('/register/complete');
    }
  })
});

router.get('/complete', function(req, res) {
  res.render('register/complete', {
    title: 'ユーザ登録完了'
  });
});
```

# ビュー作成

エラーがあれば、エラーメッセージを表示します。

```views/register/index.ect
<% extend 'layout' %>
<form action="/register/confirm" method="post">
    <dl>
        <dt>ニックネーム</dt>
        <dd>
            <input type="text" name="name" value="<%= @name %>" placeholder="ニックネーム" class="input full"/>
            <% if @errors.name : %>
            <div class="error-msg"><%- @errors.name.message %></div>
            <% end %>
        </dd>
        <dt>メールアドレス</dt>
        <dd>
            <input type="email" name="email" value="<%= @email %>" placeholder="info@example.com" class="input full"/>
            <% if @errors.email : %>
            <div class="error-msg"><%- @errors.email.message %></div>
            <% end %>
        </dd>
    </dl>
    <input type="submit" value="登録">
</form>
```
HasKALのインストール

gtk周辺のモジュールをインストールするために、
gtk2hs-buildtoolsのインストールをやっておく必要がある。
依存関係で、alex,happyも入れておく。
gtkモジュールコンパイルに用いられるgtk2hsC2hsが~/.cabal/binなどにインストールされるので、そのパスも通しておく。
Ubuntu 14.04でpptpサーバの構築

Sakura vps上で、pptpサーバを構築する。
目的としては経路を変更してネトゲのラグ回避のためのもの。
以下の設定を行うことで10分程度で使えるようになります。

注意としては、mtuの値によってネトゲの読み込みが失敗することがあります。

##Ubuntuのインストール
Sakura vpsで、カスタムOSインストール機能を利用し、Ubuntu 14.04を選択する。
インストール手順については、以下を参照することで特に問題なくインストールできるはず。

http://support.sakura.ad.jp/manual/vps/cpanel/custom_ubuntu1204.html

インストール後、サーバを起動する。

##pptpdのインストール

```
$ sudo -s
$ apt-get install pptpd
```

pptpdをインストール後、設定ファイルを編集していく。
/etc/pptpd.confに以下の行を追加

```
localip 192.168.2.1
remoteip 192.168.2.32-64
```

/etc/ppp/pptpd-optionsに以下の行を追加

```
ms-dns 8.8.8.8
ms-dns 8.8.4.4

mtu 1492
```

/etc/ppp/chap-secretsに以下の行を追加
usernameおよびpasswordは任意のものを指定する。

```
username pptpd password *
```

pptpdを再起動する

```
# service pptpd restart
```

##IPフォワードを有効にする
/etc/sysctl.confに以下の行を追加

```
net.ipv4.ip_forward=1
```

設定を反映

```
# sysctl -p
```

##iptables
```
$ iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE
```

##クライアント側の設定
Macのシステム環境設定の「ネットワーク」から、VPNを追加する。
VPNタイプはPPTPを選択

アカウント名には、/etc/ppp/chap-secretsで設定したusernameを入力。
暗号化はautomaticを選択。
認証設定で、パスワードを選択し、/etc/ppp/chap-secretsで設定したパスワードを入力する。
詳細のオプションから、Send all traffic over VPN connectionにチェックを付ける
接続をクリックすることでvpnサーバに接続される

##動作確認
http://www.cman.jp/network/support/go_access.cgi
などにアクセスして、あなたの利用しているIPアドレスが、VPNサーバのIPアドレスと一致していたらOK
Sassを使ってCSSを爆速コーディング！Sassの導入方法と使いかた。

巷でとても話題になっているCSSを爆速に書くために生まれたすごいやつ`Sass`の導入方法と使いかたを書いていこうかと。
ちなみに、公式サイトはこちら。
http://sass-lang.com/

# Rubyの導入
MacOSであればすでに入っているので、特にきにすることはありませんが、不安な人はこちらの記事を参考に。
http://blog.livedoor.jp/noanoa07/archives/1897747.html

Windowsの場合は入れる必要があります。
Windowsの方は
http://www.rubylife.jp/install/install/index1.html
こちらを参考にして入れてみてください。

今回はMacでのインストールの方法を記載していきます。
Windowsもほぼ同じなので大丈夫だとは思いますが。


# Sassのインストール
ターミナルを起動して

```bash
$ sudo gem install sass
```
と入力してEnter。
sudoで実行しているので、パスワードを聞かれると思うので、入力。
しばし待つと、インストールが終わるので、これで完了

# 実際に使ってみる
まず知っておくべきことは __拡張子__ です。
Sassを使う場合`.css`ではなくなり
`style.sass`もしくは`style.scss`のどちらかになります。
この２種類の違いは __記法__ にあります。

```sass:style.sass
#wrapper
	width: 1200px
	margin: 0 auto
	div#box
		width: 500px
		background: red

```
```scss:style.scss
#wrapper{
	width: 1200px;
	margin: 0 auto;
	div#box{
		width: 500px;
		background: red;
	}
}
```
`.sass`は`{ }`や`;`がない書き方。インデントで管理をする。
`.scss`は`css`の記法でかけるのが特徴。

次にSassはそのままでは使えず __コンパイル__ が必要です。
実際に書いたSassファイルをコンパイルするには
ターミナルから

```bash
$ cd hoge/sass/
$ sass style.scss:style.css
```
このようにコンパイルしてあげると、CSSファイルとしてそのディレクトリに生成されます。
オプションとして生成するCSSのタイプが４種類選べます。

* Nested		入れ子構造をインデントでうまく表現してくれる
* Expanded		いわゆる普通のCSSとして生成してくれる
* Compact		セレクタの中にあるスタイルの指定を１行で表示してくれる
* Compressed	全てを１行にしてくれる style.min.cssみたいなイメージ

オプションを付ける場合は

```bash
$ sass style.scss:style.css --style expanded
```
このように記述する。

# Sassでできること
SassはCSSを爆速にかけるように、かつ管理しやすいように工夫されています。
代表的な使いかたを見ていきましょう！
記述は`.scss`方式です。

```scss

// スラッシュ２つでのコメントアウト

// $を付けると「変数」として使えます。
$w: 1200px;
$color: #3c3c3c;
$hover: #ff0000;

// mixin(プログラムの関数的なやつ)
@mixin boxStyle($width){
  width: $width;
  border: solid 1px #000000;
  border-radius: 5px;
}

// 入れ子構造
#wrapper{
  width: $w;
  margin: 0 auto;
  div#content{
	@include boxStyle(300px);
	color: $color;
	// 親セレクタを参照して、擬似セレクタを適用
	&:hover{
	  background: $hover;
	}
  }
}

```
これをコンパイルすると


```css
#wrapper{
  width: 1200px;
  margin: 0 auto;
}
#wrapper div#content{
  width: 300px;
  border: solid 1px #000000;
  border-radius: 5px;
  color: #3c3c3c;
}
#wrapper div#content:hover{
  background: #ff0000;
}
```

このように吐き出されます。
入れ子構造や変数、mixinを使うことで、爆速にかけます。
それ以外にも継承や、演算などもできます。
詳しくは以下の参考サイトをみると分かりやすいです！

# 参考サイト
とりあえず、ここをみるとだいたい全部のことがわかる。
http://www.saison-lab.com/web/sass-compass/
PostgreSQLとMySQLの基本的なコマンドを比較

PostgreSQLを使用したところ、MySQLと使い方の違いがわからなかったので比較します。
# PostgreSQLとMySQLの比較表

|  | PostgreSQL | MySQL |
|:-----------|:------------|:-------------|
| ログイン       | su - postgres | mysql -u user_name -p |
| データーベースを作成 | createdb database_name | CREATE DATABASE database_name; |
| データベース一覧を表示       | psql -l <br> \l |     SHOW DATABASES;     |
| データーベースへ接続     | psql database_name |    USE database_name;    |
| テーブル一覧を表示     | \d |   SHOW TABLES;    |
| テーブルカラムの一覧表示     | \d table_name |   DESC table_name;    |
| ユーザーを作成 | createuser user_name | CREATE USER user_name; |
| ユーザー一覧を表示 | \du| SELECT User, Host FROM mysql.user; |
| ログアウト | exit <br> \q | exit; |

データベースやユーザー作成周りを表にしました。

SELECT文やUPDATE文は、PostgreSQLもMySQLとおそらく同じようなのですが試したSQLを書いておきます。

## SELECT文で参照
下記はeventsテーブルを検索するSQLです。

|  | PostgreSQL | MySQL |
|:-----------|:------------|:-------------|
| select + where  | select * from events where id = 112; | SELECT * FROM events WHERE id = 112; |

SELECT文はPostgreSQLとMySQLともに同じ書き方で問題なく動作しました。

## UPDATE文で更新
eventsテーブルのserviceカラムを更新しました。

|  | PostgreSQL | MySQL |
|:-----------|:------------|:-------------|
| UPDATE  | update events set service = 'pugiemonn' where id = 112; | UPDATE events SET service = 'pugiemonn' WHERE id = 112; |
上記のSQLで気づいた点、PostgreSQLのほうは文字列を`'（シングルクオート）`で囲うと動いたものの、`"（ダブルクオート）`で囲うと動きませんでした(^o^;)

# 参考
* [CREATE DATABASE](https://www.postgresql.jp/document/9.2/html/sql-createdatabase.html)
* [createuser](http://www.postgresql.jp/document/9.3/html/app-createuser.html)
Spring Batch 動かしてみた

# 経緯
先日[これ](https://atnd.org/events/53770) に行って楽しかったので、なんとなく前から気になっていた Spring Batch を触ってみた。
Spring Boot がなんなのかはいまだによくわかっていない。

# 手順
基本的には[公式のガイド](http://spring.io/guides/gs/batch-processing/)に従ったけど、以下の点を変えた。コレが原因で若干ハマった。

 - mainクラスとバッチ処理のクラスをは別パッケージにした。

通常 main があるところとバッチ処理をするクラスのパッケージは分けたい気がしたので。

# 問題
最初下記のような構成にした。

```
.
├── batch
│   └── BatchConfiguration.java
└── hello
    ├── Application.java (main)
    ├── Person.java
    └── PersonItemProcessor.java
```

これでなんとかビルドは通ったものの、肝心のバッチ処理がキックされていない様子。
上記ガイドを良く読むと、どうも```@ComponentScan```をつけたクラスと同じパッケージ下に```@Configuration``` をつけたバッチの定義クラスがないと動かないらしかった。```@Comfiguration```は```@Component```の一種らしい。（[参照](http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Configuration.html)）
つまり、Application.java とBatchConfiguration.java は同じパッケージにないとだめっぽい。

以下の構成にしたら、バッチ処理が動いた。

```
.
├── batch
│   ├── Application.java
│   └── BatchConfiguration.java
└── hello
    ├── Person.java
    └── PersonItemProcessor.java
```

# 所感
Application.java のmain関数は以下の通り。
ResultSet の処理はラムダで書き直してみた。

```java
    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(Application.class, args);

        List<Person> results = 
            ctx.getBean(JdbcTemplate.class)
                .query("SELECT first_name, last_name FROM people",
                    (ResultSet rs, int row) -> {
                        return new Person(rs.getString(1), rs.getString(2));
                    }   
                );  

        System.out.println(results.size() + " Persons was found.");
        for (Person person : results) {
            System.out.println("Found <" + person + "> in the database.");
        }   
    }
```

Batch という文字がどこにも出てこないので、全然バッチをキックしてるように見えない。使いこなすまでは自分でもなにやってるかわからなくなりそうだなー。

一応ソースはこちら。
https://github.com/toshi0383/spring-test

おわり
String型からList型への変換

<h3>*このやり方は推奨されていないことがわかりました*</h3>
<h4>コメント欄に正しい書き方が載っています</h4>
javaでプログラムを書いている時にString型からList型に変換する必要がでました。
そのときに調べたらやり方があったので、忘れないためにもここにも書いておきます。

String型→Lits型へ変換してくれるメソッド
	```public List StringToList(String str){
		　　List list = new ArrayList();
		　　StringTokenizer tokenizer = new StringTokenizer(str,"");
	   　 while (tokenizer.hasMoreTokens()) {
	    	　　　list.add(tokenizer.nextToken());
	    　}
	 　   return list;
	　}```


このメソッドを使えばString型→List型へ変換してくれます。
データを格納している変数を引数にすれば、List型へ変換してくれます。
*ちなみに上記のソースコートをコピペすれば問題なく使えますが、WARNが出ます。
![スクリーンショット 2014-08-17 16.45.05.png](https://qiita-image-store.s3.amazonaws.com/0/44144/f2e16837-a905-291d-ce1b-67f1a1f46e5b.png)

これを失くすためには

![スクリーンショット 2014-08-17 19.21.02.png](https://qiita-image-store.s3.amazonaws.com/0/44144/f24aaf5f-daaf-792c-b9fb-c38e5b3a33db.png)

このように```List<String>```や```List<Integer>```などといった引数をとってあげれば、WARNが消えます！
WebStormとさくらレンタルサーバの連携方法

WebStormとレンタルサーバの連携でハマった。

今回は、さくらインターネットのレンタルサーバにWebStorm上からFTPでデプロイする際の設定についてまとめる。

#レンタルサーバの設定確認

##①ログイン
[さくらインターネットコントロールパネル](https://secure.sakura.ad.jp/rscontrol/)にログイン。

##②情報の確認

- サーバ情報とパスワード ＞ サーバ情報の表示 にアクセスし、下記を確認

　　　　- FTPホスト名
　　　　- FTPサーバ
　　　　- FTPアカウント

#WebStormでの設定

##③ConnectionConnectionタブにサーバ情報を追加

- Type : FTP
- FTP Host : ＜FTPホストアドレス＞
- Port : 21
- Root path : /home/＜FTPアカウント名＞/www
- User name : ＜FTPアカウント名＞
- Password : サーバコントロールパネルのログインパスワード

![Deployment_Connection.png](https://qiita-image-store.s3.amazonaws.com/0/31862/626bb4c7-ce37-64ef-da87-24a1a95f6ca3.png)


##④接続確認

FTP Test Connection をクリックし接続を確認。
正しく接続できると下記が表示される。

![Deployment_Test-Connection.png](https://qiita-image-store.s3.amazonaws.com/0/31862/53c0b825-d2db-8c5c-7bc9-2ce3fba9ad49.png)


##⑤Mapping

Mappingsタブを選択し、下記を設定。

- Deployment path : ＜www以下の任意のディレクトリ＞
- www直下にデプロイしたい場合は、Deployment Path に「/」を指定。


#デプロイ

##⑥デプロイ実行
Project Viewerでデプロイしたい対象を右クリック＞Deployment ＞Upload to XXX で、選択した対象をデプロイできる。

##⑦デプロイ確認
デプロイ結果は、ファイルマネージャーから確認できる。
MQTT予備知識

とりあえず、自分用の整理memoです。

# pub/sub server
## 参考
http://www.hitachi.co.jp/Prod/comp/soft1/manual/cosmi/v0900/03Y0701D/EY070387.HTM
http://www.ibm.com/developerworks/jp/websphere/library/wmq/toranomaki/5.html

※ 元はGof本の Observer pattern らしい.

## 用語の説明
publisher: メッセージを作成して送信するクライアント.
subscriber: メッセージを受信する側のクライアント.任意のtopicのmessageのみ受信.
topic:Publisherと Subscriber を結びつけるためのオブジェクト
broker: publisherから送信されたメッセージを,topicオブジェクトを用いてフィルタリングし,適切なsubscriberに送信する

## メッセージ配信の流れ
publisher: messageをbrokerに送信. 
broker: 送られたmessageをtopicに登録.
broker: 各々のtopicに登録していた subscriberに対して、messageの配信を行う.
subscriber: brokerからmessageを受信する.

## Pub/Subメッセージングモデルの特徴
### publisher
* 任意の数のpublisherが、messageにtopicを設定し、送信することが出来る.
* messageはpublisherが登録した順番で、topicに保存される.

### subscriber
* 任意の数のsubscriberが、特定のtopicの messageを受信することが出来る.
* subscriberは登録したtopicに関する全てのmessageを受け取る事が出来る.
* subscriberはmessage selectorを用いて受信するmessageをフィルタリングすることが出来る.
* subscriberは登録したtopicであっても、有効期限をすぎたmessageを受信することは出来ない.

### その他
* publisherとsubscriberは動的に追加・削除される.
* messageには有効期限、優先順位、そしてsubscriberの設定した message selectorによって、処理される順番が変化する.


## 永続化サブスクライバーの利用
チャットとか作ったら必要になるかも.
今回はとりあえずパス.

# MQTT (Message Queuing Telemetry Transport)
## 参考
http://tdoc.info/blog/2014/01/27/mqtt.html
http://ledsun.hatenablog.com/entry/2014/08/13/141908
http://mqtt.org/wiki/#the_mqtt_protocol

## Message Queing
非同期型通信プロトコル.
送信者はmessageを queueに保存.
受信者は任意のタイミングで、queueからmessageを取り出すことにより、
受信者・送信者間のmessageをやりとりする.

## 概要
publish/subscribeモデルに基づく軽量なメッセージプロトコル.
OSI参照モデルの、アプリケーション層(HTTP)で動作する.

## 特徴 (調査中)
* オーバーヘッドが少なく処理も軽い
* 1対多、多対多のメッセージ配布が可能.
* topic wildcardによる柔軟性の高い 
* QoSを選べる.
* Durable subscribe
* Last Will and Testament
* Retain
Swiftで敵クラスと光弾クラスをつくって遊んだのでサンプル。（SpriteKit）

敵は光弾を放つのですが、これを「敵クラス」「光弾クラス」と分けてやってみたかったのです。


![enemyBullet.gif](https://qiita-image-store.s3.amazonaws.com/0/45822/cd24e330-1381-8652-231f-c7c8e2d13dad.gif)



SpriteKit使います。

使うファイルは

* GameScene.swift
* Enemy.swift
* Bullet.swift

です。EnemyとBulletは追加します。それぞれ、`SKSpriteNode`のサブクラスとしてクラスをつくります。

**敵と光弾は適当なタイミング（条件）で削除するようにしています。そうしないと、敵や光弾を大量生成するシューティングゲームなどでは、ノードの大量発生により、カクカク重くなるからです。**


## コード

```swift:GameScene.swift

import SpriteKit

class GameScene: SKScene {

    override func didMoveToView(view: SKView) {
        
        // ユルい重力の設定。
        self.physicsWorld.gravity = CGVectorMake(0, -0.6)
    
    }
    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        
        for touch: AnyObject in touches {
            let location = touch.locationInNode(self)
            
            // 敵の生成。
            let enemy = Enemy()
            enemy.setScene(self)
            self.addChild(enemy)
        }
    }
}
```

とてもすっきり書けました。前は、敵と光弾クラスをつくらずやっていたので、このファイルに全部書いていました。\\(^∆^)/

```swift:Enemy.swift

import SpriteKit

class Enemy: SKSpriteNode {
    
    var gameScene: SKScene!
    func setScene(scene: SKScene) {
        self.gameScene = scene
    }
    
    // タイマーを用意。これで自動で光弾を放つようにする。
    var timer = NSTimer()
    
    init() {
        super.init(texture: nil, color: UIColor.blueColor(), size: CGSizeMake(80, 20))
        
        // 敵の設定を適当に書いておきます。
        self.position = CGPointMake(400, 500)
        self.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(80, 20))
        self.physicsBody.velocity = CGVectorMake(40, 200)
        
        // タイマーを起動します。
        self.timer = NSTimer.scheduledTimerWithTimeInterval(0.6, target: self, selector: "update", userInfo: nil, repeats: true)
    }
    
    
    func update() {
        
        if self.position.y > 400 {

            // 生きている間は、光弾を放つ。
            let bullet = Bullet(node: self)
            gameScene.addChild(bullet)
            
        } else {
            
            // 敵を消してタイマーも止める。
            self.removeFromParent()
            self.timer.invalidate()
        }
    }
}
```

さらに、光弾クラスもつくります。けど、敵クラスとほとんど同じです。

```swift:Bullet.swift
import SpriteKit

class Bullet: SKSpriteNode {
    
    var timer = NSTimer()
    
    init(node: SKSpriteNode) {
        super.init(texture: nil, color: UIColor.yellowColor(), size: CGSizeMake(10, 10))
        self.position = CGPointMake(node.position.x, node.position.y + 10)
        self.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(10, 10))
        self.physicsBody.velocity = CGVectorMake(-10, 120)
        self.timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "update", userInfo: nil, repeats: true)
    }
    
    func update() {
        if self.position.y < 300 {
            self.removeFromParent()
            self.timer.invalidate()
        }
    }
}
```

クラスを分けて書くことで、とてもスッキリ書くことができました\\(˙∆˙)/

前は１つのファイルに書いていたので、どうやっていたかと言うと…。

**enumerateChildNodesWithName**

使っていました！
markdownをvimでプレビューする設定した時にハマったこと


## 追記:2014/9/10

previm作者の方からコメントいただきました。
すでにmkdのファイルタイプでもプレビューが可能になっているとのことで、
下記の内容は不要となります。。。


## 用意するもの

- 適当なファイル
 - README.md
- vimプラグイン
 - kannokanno/previm
 - plasticboy/vim-markdown
 - tyru/open-browser.vim

## 何が起こった？

- :PrevimOpenを実行するとブラウザは開くけどエラーになる
 - ファイルタイプがmkdだと言われた
- 原因
 - [このブログ](http://rcmdnk.github.io/blog/2013/11/17/computer-vim/)に書いてあるとおり、plasticboy/vim-markdownはfiletypeをmkdにしてしまうらしい
 - [issuesの中](https://github.com/plasticboy/vim-markdown/issues/64)に解決方法が書いてあった
 - コピペすると、filetypeがmkd.markdownとなって？？となった
 - filetypeの文字列を連結しているようだったので、そのままmarkdownを設定するように変更した

```
"plasticboy/vim-markdownはfiletypeをmkdにしてしまうらしい
fun! MyAddToFileType(ft)
  if index(split(&ft, '\.'), a:ft) == -1
      let &ft = a:ft
   endif
endfun

au FileType mkd      call MyAddToFileType('markdown')
```

## 参考URL

- http://www.key-p.com/blog/staff/archives/9032
- http://rcmdnk.github.io/blog/2013/11/17/computer-vim/
C++ でクラスの初期化を自動的に実行する

#動機
クラスの初期化を利用側に依存しない形で記述する。

#意図
クラス変数の設定などクラスを初期化する必要がある。単純なクラス変数の代入程度ならば直接に初期化式として書ける。

```c++:
class Foo {
	static double static_variable;
};
```

```c++:
double Foo::static_variable = 1.0;
```

このように単一の式では書くのが困難な程度に複雑な処理が必要な場合では、専用の初期化メソッドとして書き表したい。だが利用者にそれを呼んでもらうことにするのは嫌だ。上記の例のように、クラス提供側だけで解決されるようにしたい。

要するに Java の 静的初期化子（static initializer）のように書きたいのだが。

#解法
初期化をコンストラクタで行うクラスを用意し、そのインスタンスを静的変数として定義する。

```c++:Foo.h
class Foo {
public:
	static void Initialize() {
		puts("initialize something");
	}
};
```

```c++:Foo.cpp
class Initializer {
public:
	Initializer() {
		Foo::Initialize();
	}
};
Initializer instance; // 静的な変数として実体化する
```

#バリエーション
初期化クラスにデストラクタを定義すれば、終了処理を書くことも出来る。

初期化クラスを対象クラスの入れ子として定義することもできる。

異なるアプローチとして、あらかじめ初期化しておくのではなく、初回使用時に初期化するというスタイルも考えられる。[初回使用時生成(Construct On First Use)](http://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E5%88%9D%E5%9B%9E%E4%BD%BF%E7%94%A8%E6%99%82%E7%94%9F%E6%88%90%28Construct_On_First_Use%29)を参照。

#関連
この手法はメンバ変数初期化のパターンではなく、[RII イデオム](http://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E7%8D%B2%E5%BE%97%E3%81%AF%E5%88%9D%E6%9C%9F%E5%8C%96%E3%81%A7%E3%81%82%E3%82%8B%28Resource_Acquisition_Is_Initialization%29)を静的なデータに適用したものとみなせる。（RAII: "リソース獲得は初期化である(Resource Acquisition Is Initialization)"）



#メモ
ふと「C++ static initializer」で検索したら http://okwave.jp/qa/q5788226.html がトップに出てきて、そこに確かに解は書いてあるのだけど、この質問をしている人には分かりにくいだろうなぁと思ったので書いてみた。
Railsでページ遷移時に何故かJavaScriptが起動しない時

# 症状

Rails4でJavaScript書いてる時に「リロードするとJS走るんだけれど、普通のページ遷移（特にgetリクエストの時)にJSが走らない。ベタ書きしただけの`alert("hello")`すら出てこない」という状況に遭遇することがあります。

HTML見てもちゃんとJSファイルがロードされているし、動かない理由が無いしリロードすると走る。でもリンクをクリックして移動してる時には何故かJavaScriptが起動しない。

# 原因

可能性の一つとして`turbolinks`を疑ってみましょう。

`turbolinks`はRails4の高速化の為に導入された機能で、リンクを踏んだ時にページを普通にロードする代わりにJavaScriptでAjaxして何か上手いことしてくれる機能です。
でもコイツが動いてるとデフォルトではjQueryが思い通りに動かなくなる事があります。

# 解決策

そういう時は[ここ](https://github.com/rails/turbolinks/#jqueryturbolinks)に書いてある方法に従って以下の変更を試してみましょう。

### `Gemfile`に以下の行を足す。

```rb:Gemfile
gem 'jquery-turbolinks'
```

### `app/assets/javascripts/application.js`に以下の行を足す

```js:app/assets/javascripts/application.js
//= require jquery.turbolinks
```

ただし、足す場所は`//= require jquery`より **後** で `//= require turbolinks` より **前** です。
なので記述例としてはこんな感じになります。

```js:app/assets/javascripts/application.js(例)
//= require jquery
//= require jquery_ujs
//= require jquery.turbolinks
//= require turbolinks
//= require_tree .
```

### Bundle Updateを実行する

Gemfileを更新した場合もbundleし直さないと反映されません。

### Rails Serverを再起動する

大事です。忘れててハマってました。

以上、詳しい内容は書いてないですが参考になれば幸いです。
（そのうちRailsの標準に入るかturbolinksのアップデートで解決するんじゃないかという気もする）
【Python】unittest2, mockを使ったテストのサンプル


## ディレクトリ構造
```
$ tree -I "*pyc"
.
├── src
│   └── hoge.py
└── test
    └── hoge_test.py
```

## プロダクトコード
```python:hoge.py
1 class Hoge:
2   def moge(self):
3     return True
```

## テストコード
```python:hoge_test.py
 1 try:
 2     import unittest2 as unittest
 3 except (ImportError):
 4     import unittest
 5 from mock import *
 6
 7 import sys, os
 8 dir_path = os.path.dirname(os.path.abspath(__file__))
 9 sys.path.append(dir_path + '/../src')
10 from hoge import Hoge
11
12
13 class TestHoge(unittest.TestCase):
14
15   def setUp(self):
16     self.sut = Hoge()
17
18   def test_hoge_mock(self):
19     self.sut.moge = MagicMock(return_value=False)
20     self.assertFalse(self.sut.moge())
21
22   def test_hoge_raw(self):
23     self.assertTrue(self.sut.moge())
24
25 if __name__ == '__main__':
26   unittest.main()
```

## テスト結果
```
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
```
Bertrand Meyer「オブジェクト指向入門」めも


#ことわり
インターネットで久しぶりに本書を薦める文章をみかけたので、家にあったのを再読してみた。しかしー残念ながら、現在市販されている「オブジェクト指向入門 第2版」が手元になく、こちらの初版です（現在のソフトウェア開発の状況からするとちょっと古いかな？という内容も含まれます）。第2版をお持ちでもう読んでないよ、しばらく読む予定がないよ、という方がいらっしゃったら（貸して）ください〜。
![bertrand_OSC.jpg](https://qiita-image-store.s3.amazonaws.com/0/7046/1c3f18f6-558d-8989-043a-a821b2bb9c2b.jpeg)

# Part 1.オブジェクト指向による設計とプログラミングの技法
##1.ソフトウェアの品質とは
- ソフトウェア工学の目的は、品質の高いソフトウェアを作る方法を探求することだ。
- ソフトウェアにかかる費用のなかでは保守が大きな部分を占めている。保守で発生する問題は、主に変更が難しいこと、プログラムがデータの物理構造に依存しすぎていることである。
- ソフトウェアの「品質」は、ただ１つの基準でなく、互いに矛盾する可能性のあるものも含めた複数の基準によって判断されるべきだ。
- ソフトウェア品質には「外的品質要因」と「内部品質要因」がある。
- 外的品質要因と内的品質要因を同列に議論してはいけない。
- 最終的に問題になるのは外的品質要因である。ただし、内的品質要因なくして、外的品質要因の達成はありえない。

###外的品質要因と内的品質要因
|分類|説明|例|
|:--|:--|:--|
|外的品質要因|ユーザーがその有無を確認できる|要件を満たしているか、スピードは十分か、画面の見やすいか等|
|内的品質要因|開発者にしか有無を確認できない|モジュール性の高さ、ソフトウェアアーキテクチャの理解のし易さ、コードの読み易さ等|

###外的品質要因の分類
|分類|説明|
|:--|:--|
|<b>正確さ（Correctness）</b>|要求および仕様に定義された仕事を確実に行う能力|
|<b>頑丈さ（Robustness）</b>|異常な状態においても機能することができる能力（例外処理の網羅や非常事態のフェールソフト等）|
|<b>拡張性（Extendibility）</b>|仕様の変更に容易に適応できる能力（具体例：アーキテクチャがシンプルな方が変更に強い、モジュールの独立性が高い程、変更の影響を小範囲に留めることができる、等）|
|<b>再利用性（Reusability）</b>|ソフトウェアの全体または一部が、どの程度新しいアプリケーション構築に再利用できるか示すもの|
|<b>互換性（Compatibility）</b>|ソフトウェア相互の組み合わせやすさ|
|効率性（Efficiency）|ハードウェア資源を効率よく活用していること|
|携帯性（Portability）|様々な環境（ハードウェア・ソフトウェア）へのソフトウェアの移植のしやすさ|
|実証性（Velifiability）|御作用やエラーの探索をおこなうための準備・用意ができているか|
|統合性（Integrity）|御作用やエラーの探索をおこなうための準備・用意ができていること|
|使い易さ（Ease of use）|使い方の習得、データの準備、結果の解釈、誤操作によるエラーからの正常な利用へ回復などが簡単であること|
※太字の5個が特に重要

##2.モジュール性
- モジュール性は再利用性と拡張性を高めるための肝。
- モジュール性はプログラムだけでなく、仕様と設計においても考慮すべし。
- モジュール化には複数の視点が必要。そのなかにはトップダウンでソフトウェアを分割していく視点と、ボトムアップで導く視点など相反する視点もある。
- モジュール間の通信量と通信形式を制御することが、モジュール性の高いアーキテクチャを実現する第一歩である。
- 情報隠蔽によってインターフェースと実現方法を明確にわけることで、モジュール性の高いアーキテクチャが作られる。

###モジュール５つの原則
|原則|内容|
|:--|:--|
|言語としてモジュール単位|モジュールは使用するプログラミング言語の構文単位に対応していなければならない。|
|少ないインターフェース|あるモジュールと対話するモジュールの数は少ない方がよい。|
|弱い結びつき|モジュール間で交換する情報量は少ないほうがいい|
|インターフェースの明示|モジュール間での対話の中身は両方のモジュールから明らかであること|
|情報隠蔽|公にすると宣言されていない限り、そのモジュールに関する情報はそのモジュールのなかに属し、非公開であること|

##3.再利用へのアプローチ
- プログラミングには共通のパターンや反復の多い作業だ。パターンの組み合わせは複雑なので、単純にプログラム同士を組み合わせることはできない。
- 再利用にはソフトウェアやエンジニアの界隈だけで解決することのできない経済的、心理的、組織的な問題がある。
- パッケージングはルーチンより優れたカプセル化手法。
- パッケージの柔軟性を拡張する技法が２つあり、「多重定義（overloading）」と「総称性（genericity）」である。「多重定義」は一つ以上の操作を同じ名前で使えるようにすること、「総称性」は型によってパラメタを変えられるようにすること。
- 関連するデータ構造間の共通性を把握する技術とモジュールを分離する技術がいるよ。


##4.オブジェクト指向への道
- システムアーキテクチャは機能からもデータからも構築することが出来る。
- 機能よりデータの方が長期的に変化が少ない。
- なので、機能でトップダウンで作った設計は長期間における連続的な変化には適応させづらい。
- オブジェクト指向設計は、操作するオブジェクト（対象）のくらすに基づいたシステム構造を基本とする。
- オブジェクト指向設計でまず目を向けなければいけないのは、「システムがなにを対象とするか」である。「システムが何をするか」ではない。
- 抽象データ型を利用することで、完全な仕様とそうでない仕様を分離でき、オブジェクト指向的なソフトウェアの土台をつくることができる。
- 抽象データ型を「総称的」にすることが可能。抽象データ型は関数・事前条件・公理によって定義される。
- オブジェクト指向設計でのシステムはクラスの集合で構築される。


#Part 2.問題と原則
tbw
#Part 3.その他の環境におけるオブジェクト指向法の応用
tbw
Cygwinにいつも入れているものと設定メモ

Cygwinの環境を作るときにいつもやっていることのメモ。(Win7 32bit)
※64bitだといろいろ面倒なことがあったような(なかったような)

※以前はcygwinのターミナルが使いにくかったので、putty+cygtermの環境を作っていたが現在はcygwinのターミナルで問題なし。

#入れているもの
##setup.exeで入れているもの(必要に応じて)
* util-linux
* subversion
* git
* mysql(client)
* ssh
* vim
* make
* gcc
* wget
* curl
* tar
* tmux
* unzip

※util-linuxは「more」が欲しかったから

##必要に応じてsetup.exeになければ探して入れているもの
###tree
(最近はあるっぽい)

###nkf
```
ソースをダウンロード。(http://sourceforge.jp/projects/nkf/)
$ make
$ make install
```

###apt-cyg
```
$ wget http://apt-cyg.googlecode.com/svn/trunk/apt-cyg
$ chmod +x apt-cyg
$ mv apt-cyg /usr/local/bin
```

###PHP
```
$ apt-cyg install php -m ftp://ftp.cygwinports.org/pub/cygwinports
#$ apt-cyg -m ftp://ftp.iij.ad.jp/pub/cygwin/ update

Package php requires the following packages, installing:
libgcc1 libopenssl100 libpcre1 libxml2 zlib0
Package libgcc1 is already installed, skipping
Package libopenssl100 is already installed, skipping
Package libpcre1 is already installed, skipping
Working directory is /setup
Mirror is ftp://ftp.cygwinports.org/pub/cygwinports

Installing libxml2
Package libxml2 not found or ambiguous name, exiting
Package zlib0 is already installed, skipping
Warning: some required packages did not install, continuing
Running postinstall scripts
Package php installed
```
```$ apt-cyg -m ftp://ftp.iij.ad.jp/pub/cygwin/ update```
↑は他の上げたくないパッケージのバージョンが上がってしまいそうなので省略。
インストールに失敗したlibxml2はいつも通りのsetupからインストール

参考：[CygwinにPHPをインストールする方法](http://d.hatena.ne.jp/katz_24/20130406/1365256586)

#その他設定

##.vimrcの追記部分
```
" For cygwin xterm
set t_Co=256
hi Comment ctermfg=2
```
Windows PCでもトランクポートで通信できるモン!

誰得感のある記事ですが、あえて載せてみます。
タイトルはこないだ近所にくまモンが来たからです。くまモンかわいいですよね。

#0. 動機

筆者はたまーにC社やA社のネットワーク機器の設定することが有ります。

L2スイッチのセットアップ後、ポートがちゃんと使えるのかを簡易的に確認するために、PCを２台用意して、次のようなことをしています。

1. PC Aを特定のポートに挿しておく。
2. PC BでPC AのIPアドレスへPINGを打ちっぱなしにしておく。
3. PC BをL2SWのポートにさして、PC AからのPING応答があることを確認する。
4. PC Bを別のポートにさして、PC AからのPING応答があるか確認する。
5. 4.をすべてのポートで実施する。

このとき困るのがポートがトランクポートで設定されているケースです。トランクポートはフツーにケーブルを突き刺しただけでは上記の稼働確認ができません。なぜなら、トランクポートはVLAN情報を埋め込んでいないフレームはドロップするからです（※ちなみにトランキングプロトコルは802.11qを想定しています。）。じゃあVLAN情報を埋め込んでやればいいんだろ？ということでやり方を調べました。

[VLANってそもそもなんやねんというひとはこちらがわかりやすいと思います。](http://www.infraexpert.com/study/vlanz1.html)

#1. やってみる

調べた条件は下記のとおりです。

|システム|稼働確認環境|
|:-:|:-:|
|OS|Windows 7(64bit)|
|NIC|Intel(R) 82579LM Gigabit Network Connection|

Windowsは標準ではタグVLANの設定項目がそもそもありません。NICのチップメーカーのサイトでドライバーを落としてきてインストールする必要が有ります。

今回の環境ではIntelさんのNICなので、Intelさんが提供している[ドライバー](https://downloadcenter.intel.com/Detail_Desc.aspx?lang=jpn&DwnldID=18713)であるPROWinx64.exeを落としてきてインストールしました。インストールで色々聞かれますがすべて「はい」でOKです。

あとはデバイスマネージャで対象のNICのプロパティを確認します。下の図がNICのプロパティを開いた状態になります。VLANという標準では出なかったタブが出るようになりました(￣ー￣)ﾆﾔﾘ。

![すくしょ3.png](https://qiita-image-store.s3.amazonaws.com/0/38761/295c6d1d-d50d-6f04-a8ae-916ed107fa04.png)

VLANのタブを開くと『新規作成』という項目があります。ここにトランクポートで通過が許可されているVLAN IDのVLANを作成します。VLANは複数定義可能で、各VLAN毎にIPアドレスを設定できます。

![すくしょ4.png](https://qiita-image-store.s3.amazonaws.com/0/38761/fb2dea75-8833-8d39-d49f-77c14eecd227.png)

これでトランクポートにPCを突き刺しても、フレームにVLANタグが付いているので通信できるようになります。もちろんVLAN IDはトランクポートで通過が許可されているものを指定しましょう！

当然ですが、LinuxとかMac OS XとかFreeBSDでもタグVLANの設定はできます。気が向いたら記事を書こうと思います。
bower-buildでbowerで入れたファイルを一つにconcatする

bower、普通に入れるだけだとbower_components/...に入るんだけど、index.htmlから相対パスで一個一個引いたりするのが面倒なので、だいたいconcatして一つにまとめたりする。

で、gulpやgruntのタスクを書くんだけど、毎回やるの面倒になったので、それだけのタスクをやるライブラリをさっくり作った。

[mizchi/bower-build](https://github.com/mizchi/bower-build "mizchi/bower-build")

いれる。

```
npm install -g bower-build
```

使う

```
$ bower init # なんか色々訊かれる
$ bower install --save jquery codemirror # ライブラリいれる
$ bower-build -o public --debug
write: /Users/mizchi/proj/bower-build/public/vendor.js # include codemirror.js and jquery.js
write: /Users/mizchi/proj/bower-build/public/vendor.css # include codemirror.css
```

細かいオプションはREADMEにて。
public にvendor.jsとvendor.cssを吐き出す。


bowerの仕様の一つにmainプロパティがあって、ここで指定したものが外部に提供するファイルになるんだけど、npmと違って必須ではない。また、配列だったりcssが指定されていることもある。そのため拡張子に応じてvendor.* を吐き出すようにした。

これでbowerの弱点だったcssの扱いもちょっとは克服できる。


Sourcemap対応とかgrunt/gulp対応とかやりたいことはあるんだけど、またあとで。


改善案とかIssueにてお待ちしております。

[mizchi/bower-build](https://github.com/mizchi/bower-build "mizchi/bower-build")
Perlワンライナー覚書


#0.はじめに
ちゃんとスクリプトを書くほどではないけど、ちょっとした表示の整形や集計をしたい、という時にPerlワンライナーが使えると非常に便利です。今回はPerlワンライナーの基本的な使い方についての覚書になります。

今回試した環境は下記のとおりです。

|環境|
|:-:|
|OS X 10.9.4|
|perl 5, version 16|

#1. perlをワンライナーで使う
perlをワンライナーとして利用するためには```-e```オプションを使います。その後ろに実行したいperlスクリプトを''で囲って指定します。つまり、

```bash:基本構文
perl -e '[perl_script]'
```

のように使います。ではHello,Worldしてみましょう。

```bash:Example1
$ perl -e 'print "Hello,World\n";'
Hello,World
```

また、```-le```とすることで```\n```を省略することができます（強制改行）。

```bash:Example2
$ perl -le 'print "Hello,World";'
Hello,World
```

perlスクリプトの部分は当然perlの文法が使えるので、繰返し文や変数定義が利用できます。

```bash:Example3
$ perl -le '$string = "Hello,World";for(1..3){print $string;}'
Hello,World
Hello,World
Hello,World
```
#2. 1行ずつ処理する

インプットを1行ずつ処理するためには```-n```オプションを利用します。次の例は入力したファイルの3の倍数の行の内容に行番号をつけて出力するスクリプトです。

```bash:Example4
##データセット
$ cat hello_test.txt
Hello,World1
Hello,World2
Hello,World3
Hello,World4
Hello,World5
Hello,World6
Hello,World7
Hello,World8
Hello,World9
Hello,World10
##perl one liner
$ cat hello_test.txt | perl -nle '$i++;if($i%3==0){print "$i:$_";}'
3:Hello,World3
6:Hello,World6
9:Hello,World9
```

apacheのアクセスログ(combinedフォーマット)でユーザーエージェント毎の出現回数をカウントすることも可能です。

```bash:Example5
#データセット作成
$ ab -c 10 -n 150 -H "User-Agent: SAKANASAN-USER-TEST" localhost/
〜省略〜
#perl one liner
$ cat /var/log/apache2/access_log | perl -nle '$_=~/".*" (".*")/;$hash{$1}++;END{foreach(keys(%hash)){print "$_:\t $hash{$_}";}}'
#結果
"NEKOSAN-USER-TEST":     100
"SAKANASAN-USER-TEST":   150
"SAKANAKUN-USER-TEST":   100
"INUSAN-USER-TEST":      400
```

perlワンライナーは```-n```をつけると一行ずつ処理をするので、集計結果はENDブロックに入れて結果を出力します。

#3. AWKモード

perlワンライナーは```-a```オプションをつけることで、AWKのように使うことができます。ただし、AWKでいうところのフィールド変数は```$F[0],$F[1],$F[2],...```になります。ここでは具体例として、2.で例示したapacheアクセスログの集計を書きなおしてみます。書きなおすついでにユーザエージェントごとにどれだけ通信量があったのかも集計して3列目に出力します。

```bash:Example6
#perl one liner
cat /var/log/apache2/access_log | perl -anle '$count{$F[11]}++;$data{$F[11]}+=$F[9]; END{foreach(keys{%count}){print "$_: $count{$_}: $data{$_}";}}'
#結果
"AB-USER-TEST": 100: 4400
"NEKOSAN-USER-TEST": 100: 4400
"SAKANASAN-USER-TEST": 150: 6600
"SAKANAKUN-USER-TEST": 100: 4400
"INUSAN-USER-TEST": 400: 17600
````

デフォルトのセパレータはスペースですが、```-F[セパレータにしたい文字]```で変更することが可能です。たとえばCSVファイルを処理したい場合には下記のとおりにします。

```bash:
$ perl -F, -anle 'perl_script' somefile.csv
```

#4. まとめ

ログで必要ところだけを出力したい、簡単な集計をしたいなどの要望はperlワンライナーで簡単に実現できます。ぜひお試しください。

**参考図書**
[【改訂新版】 サーバ／インフラエンジニア養成読本](http://gihyo.jp/book/2014/978-4-7741-6422-9?ard=1408259545)

この本でPerlワンライナーの存在を知りました。サーバエンジニア志望の人にはおすすめの本です。

**参考URL**
http://blog.livedoor.jp/dankogai/archives/51026593.html

小飼弾さんによるPerlワンライナー入門です。とても勉強になりました。