OmniAICreator/Qiita-1.07M huggingface dataset:
Haskellのライブラリを作ってHackageに公開するまで

# Hackage
Hackage...Haskellのライブラリを集めたアーカイブ.

PerlでいうCPAN、RubyでいうRubygems、Nodeでいうnpm的なやつです.

作って公開するまでを紹介します.

今回は`your-project`という名前のライブラリを作る事とします.

[こんな感じ](https://hackage.haskell.org/package/your-project-0.1.0.0/candidate)

今回使った例は

https://github.com/Azabuhs/your-project

に置いておきました.

```
|-- src/ ...ソースファイル
| 　　|-- YourProject.hs ...モジュール本体
|
|-- Setup.hs ...セットアップ
|-- YourProject.cabal .. ライブラリのメタ情報
```


# Cabal
Cabal...Haskellのパッケージシステム.

`cabal`コマンド（僕のは`v1.20.0.3`でした）を前提に話します.

`cabal` コマンドの入れ方はMac用ですが昔に記事を書いたのでこれを

[【Mac OS X 10.10】Haskell + Yesod + Heroku で webアプリ 1/3](http://qiita.com/gogotanaka/items/a9a2483c37935acf568a)

# 説明開始

### 手順1: プロジェクト作るのフォルダを作る

    $ mkdir your-project
    $ cd your-project

### 手順2: ソースコードを書く.

（`cabal init` の前にソースコードを書いておくととcabalがconfigをこれに色々最適化してくれる）

    $ mkdir src
    $ touch src/YourProject.hs

（名称はハイフン(-) つなぎでファイル名はキャメルケースが慣習ぽい）

今回は例として関数を１つ定義してみましょう.


```YourProject.hs
module YourProject where

yourFunc = "This is your function!" :: String
```


### 手順3: `cabal init` コマンド

    $ cabal init

対話形式で色々聞かれる. 結構頭が良くて色々推論してくれる.（パッケージ名とか）

![Screen Shot 2015-01-01 at 8.59.24 PM.png](https://qiita-image-store.s3.amazonaws.com/0/30440/791975a8-3e6c-c9e5-4820-44f800077487.png)


途中でライブラリ（他のHaskellのコードにインポートして使うもの）なのか実行可能ファイル（コマンド）としてビルドするのか選ぶところがある、今回はライブラリを想定して話を進めるがconfigなどの設定が微妙に違うだけ.

![Screen Shot 2015-01-01 at 8.45.50 PM.png](https://qiita-image-store.s3.amazonaws.com/0/30440/39fbe08f-a952-ce43-03e1-fd2defd41423.png)


### 手順4: `your-project.cabal` を手直し

![Screen Shot 2015-01-01 at 9.00.45 PM.png](https://qiita-image-store.s3.amazonaws.com/0/30440/6c93c311-4091-fbbd-d2cb-940766fa4dc7.png)


ここで自動生成された`your-project.cabal`がライブラリのメタ情報となるので手動で確認してみる.


    $ vim your-project.cabal

![Screen Shot 2015-01-01 at 9.02.47 PM.png](https://qiita-image-store.s3.amazonaws.com/0/30440/b4ac95a1-f5f6-7a83-a04c-ad2698830919.png)

丁寧に説明が書いてあるのでそれに概ね従うと良いです.

他のライブラリを使う場合は`build-depends`にカンマ区切りで書いていく


![Screen Shot 2015-01-01 at 9.08.02 PM.png](https://qiita-image-store.s3.amazonaws.com/0/30440/752c41fd-3b51-ca08-2e1d-ff1dcf1cb551.png)


### 手順5: ビルドして試す


サンドボックス（依存解消のためのスコープを絞ってライブラリをインストールするcabalの機能）を作ってインストール

    $ cabal sandbox init
    $ cabal install --only-dependencies
    $ cabal configure
    $ cabal build
 

`cabal repl` でテスト

    $ cabal repl

![Screen Shot 2015-01-01 at 8.40.51 PM.png](https://qiita-image-store.s3.amazonaws.com/0/30440/d00d45ca-9149-0cab-6562-a41c3c32b32d.png)

### 手順6: Hackage


https://hackage.haskell.org/users/register-request

からアカウントを作ります.

プロジェクトのディレクトリで

    $ cabal sdist --snapshot 

をやると`dist/your-project-0.1.0.0.tar.gz` というのが出来るのでこいつを



https://hackage.haskell.org/packages/candidates/upload

からアップロード. username とpasswordを上記で作ったアカウントのやつ.


### 手順7: 完成！

https://hackage.haskell.org/package/your-project-0.1.0.0/candidate

他にも色々なメタ情報を付加出来るので試すと良いです.

おやすみなさい
「とりあえず相関」を疑ってみる

**はじめに**

こんちには。kumiskyです。

[R Advent Calendar 2014](https://atnd.org/events/58648)の31日目の記事です。

お客様にアンケートを実施している企業は多いですよね。
この記事では、アンケート結果の回答同士の関係を見たい時には、どんな手法が適しているだろうか、というお話をしてみたいと思います。


**動機**

私の勤務先でも顧客満足度調査というアンケートを毎年実施しています。
顧客満足度の目標値があり、それを上げるために行っています。
アンケートでは、総合の満足度と、各要素の満足度をお聞きします。
各要素というのは、機能・デザイン・買いやすさ・窓口の対応などです。

この回答から、製品やサービスのどこに不満を感じると全体の満足度が下がりやすいのか、
今後のお付き合いを止めたいと思うのか、を調べていきます。
顧客に満足してもらうためには何を優先的に改善すると良さそうかを把握したい、というのがモチベーションです。

この時、私がまず総合満足度と各要素の満足度の関係を見るために使ったのは、ピアソンの積率相関係数です。
いわゆる普通の相関です。

**試行錯誤**

そこに、技術者の方から突っ込みが入りました。

「積率相関係数は、値が[正規分布](http://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E5%88%86%E5%B8%83)に従うことを仮定しています。
　満足度という連続尺度で無いものに、積率相関係数を使うのは違和感がありませんか？」

　(尺度のおさらい)────────────────────────────────────────
　連続尺度：数値で測れるデータ(身長や体重)
　　　　　　→体重 80gは 40kgの人の 2倍の重さ。各値の間隔が等しい。

　順序尺度：順序だけに意味がある値(スポーツの1位2位など)
　　　　　　→5段階評価の 「5」は「1」の 5倍という意味ではない。各値の間隔は等しい訳ではない。
　
　名義尺度：名称などの値(男女や都道府県など)
　　　　　　→各値の間に大小関係がない
　───────────────────────────────────────────────────────

アンケート回答などの順序尺度であれば連関係数や順位相関を使うべき、という説もあり、
理解のために、まずは 4種類の回答の組み合わせを作って各種相関を出してみました。(サンプルなので回答は 10件だけです)

![相関と連関.png](https://qiita-image-store.s3.amazonaws.com/0/64566/a69bd07a-dfd4-9fc3-28c3-94adede96167.png)

とても綺麗な線形の関係があるときは、積率相関でも連関係数でも相関が高くなります。(上図の左側)
ただ、例えば点の関係しかない時でも、連関係数だと評価されてしまいます。(上図の右側)

連続尺度でないものに積率相関を使うのはおかしい、という理屈は分かるものの、
こうしてみると、今回のアンケートでは線形の関係を知りたいので、やはり連関係数だと知りたい答えにはたどり着けない気がしてしまいます。


**別の相関が登場**

そこで、先ほど突っ込みをいただいた技術者に相談してみました。
彼の提案は、ポリコリック相関を使うのはどうか、というものでした。

問題は、連続尺度でないものに積率相関を使うことなので、このケースであれば、回答の方を連続量にしてしまおうという方法です。

そう、こんな風に、、

![エイヤ.png](https://qiita-image-store.s3.amazonaws.com/0/64566/2fbaf454-8071-0474-5f52-fb594386dcf9.png)

と、心理尺度から二次元正規分布になるようなもっともらしい連続量を推定しよう！
そして、その推定した連続量同士の相関を見ればいいじゃないか、というもの。

少し強引な気がするでしょうか。

ポリコリック相関では、アンケート回答など表に出てきている値は順序尺度でも、
回答の裏に隠れた心理量は正規分布しているという仮定をおいています。
順序としては、本当の心理量は下図の右で、回答が下図の左として現れているだけだから、元に戻してから考えよう、という訳です。
![ほんとの心.png](https://qiita-image-store.s3.amazonaws.com/0/64566/a8909d00-2517-43be-f571-88924c81acae.png)

例えば 5点満点中 3点を選択した人の中にも、2点寄りの3点、という人もいれば、4点寄りの3点、という人もいそうですよね。
注意点としては、真値が正規分布を仮定できないような値には使えません。

詳しくは、私の下手な説明よりも以下をご覧ください。

　-証明
    カテゴリカルデータの相関係数　
    http://norimune.net/673

　-理論
    順序尺度の相関係数（ポリコリック相関係数）について　(小杉考司)　
    http://kosugitti.sakura.ne.jp/wp/wp-content/uploads/2013/08/polynote.pdf

　私は知りませんでしたが、昔、心理尺度の関係性を見る時にピアソンの相関を使っていたのは妥協の産物だったようで、今はコンピューターの性能が上がり高度な計算もできるようになったので、様々な相関が出てきているようです。


**Rのパッケージ**

Rでパッケージが提供されてますので、使うときは以下の呪文を唱えるだけで大丈夫です。

ポリコリック相関係数(順序尺度×順序尺度の相関)
　install.packages("polycor") # (hなし) 
　library(polycor)して使う。関数名はpolychor(hあり)
　polychor(x,y)

連続尺度×順序尺度の相関を見るポリコリアル相関係数なども提供されています。

polycorパッケージによる順序相関係数の算出
http://www.okada.jp.org/RWiki/?polycor%A5%D1%A5%C3%A5%B1%A1%BC%A5%B8%A4%CB%A4%E8%A4%EB%BD%E7%BD%F8%C1%EA%B4%D8%B7%B8%BF%F4%A4%CE%BB%BB%BD%D0
KVM に virt-install でコマンドラインだけで CentOS 7 を インストール

ホストもゲストも CentOS 7 で試しています。

----

CentOS 7 の ISO を適当なディレクトリにダウンロードします。

```
cd /iso
wget http://ftp.riken.jp/Linux/centos/7.0.1406/isos/x86_64/CentOS-7.0-1406-x86_64-Minimal.iso
```

ネットワークインストールすれば ISO 無しでもインストール可能ですが、かなり時間かかるので LAN 内にミラーを設けているとかでない限りは ISO 使ったほうが良いと思います。

次に KickStart ファイルを作成します。

```
cat <<EOS> /tmp/centos7.ks.cfg
#version=RHEL7

install
cdrom
text
cmdline
skipx

lang en_US.UTF-8
keyboard --vckeymap=jp106 --xlayouts=jp
timezone Asia/Tokyo --isUtc --nontp

network --activate --bootproto=dhcp --noipv6

zerombr
bootloader --location=mbr

clearpart --all --initlabel
part / --fstype=xfs --grow --size=1 --asprimary --label=root

rootpw --plaintext password
auth --enableshadow --passalgo=sha512
selinux --disabled
firewall --disabled
firstboot --disabled

reboot

%packages
%end
EOS
```

virt-install でゲストに CentOS 7 をインストールします。

```
virt-install \
  --name centos7 \
  --hvm \
  --virt-type kvm \
  --ram 1024 \
  --vcpus 1 \
  --arch x86_64 \
  --os-type linux \
  --os-variant rhel7 \
  --boot hd \
  --disk pool=default,size=5,format=qcow2 \
  --network network=default \
  --graphics none \
  --serial pty \
  --console pty \
  --location /iso/CentOS-7.0-1406-x86_64-Minimal.iso \
  --initrd-inject /tmp/centos7.ks.cfg \
  --extra-args "inst.ks=file:/centos7.ks.cfg console=ttyS0"
```

インストールのメッセージがだらーっと流れていきます。

しばらく待って、ログインプロンプトが表示されたらインストール完了です。

----

↑の例ではストレージプールを使っているのでディスクイメージを作成する手順はありません。

ストレージプールを使わないのであれば `qemu-img` でディスクイメージを作成し、

```
qemu-img create -f qcow2 /var/lib/libvirt/images/centos7.img 5G
```

次のようにディスクイメージを指定します。

```
virt-install \
  --name centos7 \
  --hvm \
  --virt-type kvm \
  --ram 1024 \
  --vcpus 1 \
  --arch x86_64 \
  --os-type linux \
  --os-variant rhel7 \
  --boot hd \
  --disk /var/lib/libvirt/images/centos7.img \
  --network network=default \
  --graphics none \
  --serial pty \
  --console pty \
  --location /iso/CentOS-7.0-1406-x86_64-Minimal.iso \
  --initrd-inject /tmp/centos7.ks.cfg \
  --extra-args "inst.ks=file:/centos7.ks.cfg console=ttyS0"
```
Vagrant + Guard 環境でファイル変更が検知されない

## 対象

ローカルのノートPCにWindowsを入れてこれまでRails開発をやってきたけど、Rails4.1 になってspringが標準で取り込まれたことを機にSpringを使ってみたくなった人向け。

## 環境回り
ruby: 2.2.0
rails: 4.1.1
rspec-rails: 3.1.0

Vagrantのboxは[CentOS 6.5 x86_64](https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box)を使用。

ローカルに入れてあるSublime Text3 をそのまま使いたいので、ローカルのフォルダにrailsのプロジェクトを入れ、vagrantで共有フォルダの設定を行っている。

## 何が起きたか？

Sublime Text で編集したファイルを、Guardが検知してくれずに自動テストが実施されない。

## どう対処したか？

[こちら](http://www.softr.li/blog/2012/07/21/running-guard-over-vagrant)を参照し、Guardを起動させるときに強制ポーリングを実施した。さらに、CPUの負荷を下げるため、レイテンシを調整。
`bundle exec guard -p -l 10`

## 備考

Springがそこまで早いとは思えない。実際時間の短縮はされているのだけれど、これはVagrant上の問題っぽいので、追加で調べる。
AnsibleでRailsのApplication Templateを代替する

アイデアとして考えてみた。

Gemの追加、Deviceまわりの設定、dbの設定、RSpecやCapybaraの追加・設定などRailsアプリを作るときに高確率で行う可能性があるタスクを自動的に実行させたい。こういう時はRailsの[Application Template](http://guides.rubyonrails.org/rails_application_templates.html) が標準で用意されていますが、個人的にしっくりきてませんでした。Pureなrubyのスクリプトになっているのが嫌で、DSLでもっとシンプルに記述したいのです。

そこで、Ansibleを使うのはどうかと思いました。こんな感じで。


```yaml:app.yml
- hosts: localhost
  vars:
    apppath: "{{ansible_env.PWD}}/Hoge"
    appname: Hoge
    database: mysql
    ruby_version: 2.1.5
  roles:
    - new
    - gitignore
    - ruby_version
    - gem
    - bundle_install
    - db
    - unicorn
    - capistrano
    - rspec
    - timezone
    - git_commit
```

```yaml:hosts
localhost ansible_connection=local

```

各roleに設定ファイルのコピーや、書き換えを担当させる。設定内容ごとにディレクトリに切られていて修正がやりやすい＆分かりやすいんじゃないのと思いました。

作りかけですが、repoはこちら
[konpyu/ansible-rails-application-template](https://github.com/konpyu/ansible-rails-application-template)
DebugKit関連のCSSやJavaScriptの404の解決


CakePHPの勉強をしようと思い、CookBookに従ってサンプルを作った際、導入当初に表示されるいろいろな警告を解消する過程でDebugKitも導入しました。

しかし一部表示されない画像があったり、CSSやJavaScriptが404エラーで読み込まれていないことに気付きました。

![スクリーンショット 2015-01-02 11.37.55.png](https://qiita-image-store.s3.amazonaws.com/0/56871/0b5e8014-59f8-f6d3-af58-04624a9bb765.png "スクリーンショット 2015-01-02 11.37.55.png")

404エラーを返したファイルはすべて`[ドキュメントルート]/app/Plugin/DebugKit/webroot/`にあったのですが、それを取得しようと`[ドキュメントルート]/debug_kit/`でリクエストを発行しているようです。

そのため、`[ドキュメントルート]/.htaccess`に1行加えました。

```Apache:.htaccess
<IfModule mod_rewrite.c>
   RewriteEngine on
   RewriteRule    ^$ app/webroot/    [L]
   RewriteRule    ^debug_kit/(.*) app/Plugin/DebugKit/webroot/$1 [L] # 新しく加えた行
   RewriteRule    (.*) app/webroot/$1 [L]
</IfModule>
```

これでちゃんと表示されるようになりました。

![スクリーンショット 2015-01-02 11.42.46.png](https://qiita-image-store.s3.amazonaws.com/0/56871/7b182930-af40-e3dc-e8ae-989320154415.png "スクリーンショット 2015-01-02 11.42.46.png")

しかし、DebugKit導入にあたってこんなことするなんて記述が見つからなかったので、どうも腑に落ちませんね…何か根本的に設定を間違えているのでしょうか…。
進捗を評価する関数を作った #進捗を支える技術

**進捗どうですか**。よい言葉ですね。私は、締め切り直前に追いつめられるよりも、くどくどと進捗状況を聞かれるほうが好きです。

さて、@dichika さんが自作の[yeahパッケージ](https://github.com/dichika/yeah)に素敵な関数を追加してくれました。目だけでなく、耳でも進捗を感じたいですよね（*今年は可視化の発展形として、可聴化なる言葉が流行るのでは...?*）。というわけで...

# shinchoku_test 進捗検定関数

**進捗検定ってなんだよ...**、という話ですが、目標のコミット数に応じて現在の進捗状況を判定してくれる関数が`shinchoku_test`です。

```r
shinchoku_test <- function (goal, num = 1) {
  commit <- system("git log --since='$(date +'%Y-%m-%d') 00:00:00' --no-merges --oneline | wc -l", 
              intern = T) %>%
    stringr::str_trim() %<>% as.numeric()
  
  yeah::doudesuka(num = num)
  Sys.sleep(2.0)
  print(paste("今日のコミット数は ", commit, 
              ifelse(commit < goal, 
               c(" 進捗だめです orz"), c(" 進捗あります!!"))))
}
```

実行するには、依存する`magrittr`、`stingr`および`yeah`パッケージをインストールしている必要があります。

では実行してみます。

```r
shinchoku_test(10)
#[1] "今日のコミット数は  6  進捗だめです orz"
```

残念ながら目標の進捗数に達していないみたいです?

### 解説

`goal引数`は目標とするコミット数です。この値よりも一日分のリポジトリへのコミット数が多いか少ないかで結果が異なります。また、`doudesuka関数`内の`num引数`を変えることで、あなたの嗜好に応じた進捗検定（意味深）ができます。

## 参考

* [git "今日のコミット数"が知りたいときのワンライナー - Qiita](http://qiita.com/smd8122/items/2a8cee0516f98bb818f2)
    * `git shortlog`だと上手く行かなかったけど...
* [gitで指定期間のコミット回数や総追加行数などを取得するワンライナー - Qiita](http://qiita.com/takashibagura/items/6d03cdd9ab2f88df828d)

こちらからは以上です。よい進捗を?
Beegoでテンプレート変数のフォーマットを変更する


Beegoに限らないですが、JS側のテンプレート変数のフォーマットとサーバー側のテンプレート変数が一緒だと、問題があります。

しょうがないから、サーバー側のテンプレートには以下のように書いて、レンダリングされると{{ hoge }}みたいになるようなこともしていましたがさすがに面倒くさい。
```
{{`{{ hoge }}`}}
```

最近使っているGoのフレームワークのbeego(実際にはbeeageのほうを使ってますけど)で、このテンプレート変数のフォーマットを変更する方法を残しておきます。main.goのところで、変数の左右に配置するフォーマット文字列を定義してあげるだけです。

```main.go
func init() {
	beego.TemplateLeft = "{{{" #左のフォーマット
	beego.TemplateRight = "}}}" #右のフォーマット
	beego.Router("/", &controllers.MainController{})
	beego.Run()
}
```
Alfred 2からLogophileを検索するworkflow

現時点で最も優れた串刺し辞書検索ソフトウェア[Logophile](http://www.dicwizard.jp/logophile/)をMacのランチャー[Alfred 2](http://www.alfredapp.com/)から検索するworkflowを作成しましたので、Githubで公開しました。

- [workflow_logophile](https://github.com/hachi8833/workflow_logophile)

このworkflowを利用するには、Alfred 2の他に有償の[Powerpack](https://buy.alfredapp.com/)を購入する必要があります。環境はMac OS X Mavericskでのみ確認しています。

# 開発の経緯

いろいろ調べた結果、Logophileは残念ながらAppleScriptのScripting Dictionaryを持っておらず、Alfredからまともにコントロールする方法がないように思えました。

そもそもAppleScriptをいじるのは15年ぶりだったこともあり、それを確認するためにどこを調べればよいのかを調べるのに多大な時間を要してしまいましたが、「AppleScriptエディタ」の`ウィンドウ>ライブラリ`を開き、プラスマークをクリックしてアプリケーションを追加してみれば、Scripting Dictionaryを持っているかどうかがわかります。その結果、LogophileにはScripting Dictionaryがないことをやっとのことで確認できました。

しかしまだ諦めきれません。LogophileはMacの「サービスメニュー」から検索することはできます。もしかしたら、AppleScriptからサービスメニュー経由でLogophileにテキストを送り込むことができないだろうかと思い、一日かかってもこれといった方法がネットで見つからず、もはやだめかと諦めていました。

ところが今日になって以下の記事を見つけ、ようやっとworkflow作成の目処がたちました。ここではAppleScriptからシェル経由でRubyを呼び出し、その中でさらにAppleScriptを呼ぶというややこしい構造になっています。

- [サービスメニューをAppleScriptから利用するAppleScriptハンドラ『doServiceMenu』
](http://veadardiary.blog29.fc2.com/blog-entry-2973.h)

しかし今度は肝心の`do script`行でエラーになってしまいます。困っていたところ、今度は以下の記事を見つけました。

- [Mavericksでrequire ‘osx/cocoa’が出来ない
](http://rcmdnk.github.io/blog/2013/10/23/computer-mac/)

要するに、`require osx/cocoa`を利用するにはシステム付属のRuby 1.8を明示的に呼びださなければならないというのです。rbenvなどでインストールしたRubyからは使えないので、最終的に以下のようなコードになりました。

``` applescript
on alfred_script(q)

set menuTitle to "Logophile"
set theText to q

set theScript to "require 'osx/cocoa'; 
p = OSX::NSPasteboard.pasteboardWithUniqueName;
p.setString_forType(ARGV[1],OSX::NSStringPboardType);
OSX::NSPerformService(ARGV[0], p);"
	
do shell script "/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby -e " & quoted form of theScript & " " & quoted form of menuTitle & " " & quoted form of theText
end alfred_script
```

切り貼りだらけのため、AppleScriptとシェルとRuby 1.8が入れ子になってしまっていますが、そのうちもう少しきれいなものにしたいと思います。

いずれLogophileがAppleScriptに対応してくれれば、リストを取り出してAlfredで表示するということもできるようになるかもしれません。

# 追記

Mac OS X Yosemiteでは[Ruby 1.8自体が削除された](http://rcmdnk.github.io/blog/2014/10/19/computer-mac-ruby/)とのことので、このworkflowはこのままではYosemiteでは動作しないことが確定しました。
zlibをソースコードビルドする


# 概要
## これはなに？
- 圧縮ライブラリ
- http://www.zlib.net/

## 目標
- zlib-1.2.8 の共有オブジェクトがシステムに読み込まれる

## 実行環境
- CentOS-7.0
- [ソースコードビルドするための環境](http://qiita.com/boscoworks/items/0d442d446436f7d72183)

## 依存パッケージ
- なし

# 導入手順
## tar.gz をダウンロードする
```
wget http://zlib.net/zlib-1.2.8.tar.gz -P /usr/local/share/downloaded/
```

## tar.gz を解凍する
```
tar -zxvf /usr/local/share/downloaded/zlib-1.2.8.tar.gz -C /usr/local/src/
```


## configure を実行する
```
cd /usr/local/src/zlib-1.2.8/

./configure --prefix=/usr/local/lib/zlib-1.2.8
```

## make を実行する
```
make
```

## make install する
```
sudo make install
```

## ディレクトリのシンボリックリンクを作成する
```
sudo ln -s /usr/local/lib/zlib-1.2.8 /usr/local/zlib
```


## 共有オブジェクトのパスを登録する
```
echo "/usr/local/lib/zlib-1.2.8/lib" > /usr/local/etc/ld.so.conf.d/zlib-1.2.8.conf

sudo ln -s /usr/local/etc/ld.so.conf.d/zlib-1.2.8.conf /etc/ld.so.conf.d/zlib-1.2.8.conf

sudo ldconfig
```

# 削除手順
## 導入時に生成したファイルを削除する
```
sudo rm -r /usr/local/share/downloaded/zlib-1.2.8.tar.gz
sudo rm -r /usr/local/src/zlib-1.2.8/
sudo rm -r usr/local/lib/zlib-1.2.8/
sudo rm -r /usr/local/zlib
sudo rm -r /usr/local/etc/ld.so.conf.d/zlib-1.2.8.conf
sudo rm -r /etc/ld.so.conf.d/zlib-1.2.8.conf
```

## 共有オブジェクトのパスを更新する
```
sudo ldconfig
```
sar -d、かぁ～らぁ～のぉ～

## `sda -d` で block device の動きを観察

sysstat 使ってますか? 可視化してるから大丈夫? そうですか、うらやましいです >_<。

`sar -d` を使うと各 block device の状況を調べることができます。素敵ですね!

```text
12:00:02 AM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
12:10:01 AM  dev253-0      0.06      0.45      0.00      8.00      0.00      7.88      1.65      0.01
12:20:01 AM  dev253-0      0.01      0.08      0.00      8.00      0.00      6.67      4.67      0.00
12:30:05 AM  dev253-0      0.04      0.17      0.13      8.00      0.00     17.04     13.74      0.05
```

こんな感じで結果が出力されます。でもこの dev253-0 って何でしょう??

## `ls /dev -lR` で device の major/minor number を確認

そんなときは、教えて！goo で検索! [【Redhat Linux】「sar -d」の実行結果について](http://oshiete.goo.ne.jp/qa/4021371.html) という質問があっという間に見つかりました。

>「ls -l /dev」で表示される","の前がメジャー番号、後ろがマイナー番号のはず・・・
>brw-r----- 1 root disk 3, 0 2月 4 21:34 hda

なるほど、`ls -l /dev` で見つかるんですね。

```tex
# ls /dev -lR | grep '253, *0'
brw-rw---- 1 root disk 253,  0 Jul  6  2013 VolGroup0-LogVolume0
```

どうやら、これは LVM の logical volume のようです。むむむん。

## `pvdisplay -c` で volume group と block device の対応を確認

この volume group はどの block device を使っているのか確認したい!!

```text
# pvdisplay -c
  /dev/md0:VolGroup0:54701184:-1:8:8:-1:4096:6677:0:6677:SPXaCV-qohI-zEPV-L64L-G2HY-gstE-juUNuB
```

いた。どうやら `/dev/md0` を使っているようです。

## `cat /proc/mdstat` で multiple devices の状態を確認

しかしこれは、md と書いてあるし RAID のようですね。実体は何なんだろう? そんなときは Yahoo!知恵袋で検索!! [Linuxで、RAIDステータスのCleanとは何のことを指すのでしょうか？](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13121524268)という質問が!!

>とりあえず、
>cat /proc/mdstat
>とやって、何が出ますか？

`/proc/mdstat` というファイルを調べればいいみたいです。やってみよう。

```text
# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 sdb2[1] sda2[0]
      27350592 blocks [2/2] [UU]

unused devices: <none>
```

なるほど、`sda2` と `sdb2` を使っているんですね。

これでもぉ、block device が不安定になってもへっちゃらです! ありがとう goo! ありがとう Yahoo!!
composer install と composer updateの違い

まずは改めて各ファイルの役割から。

>**composer.lock**：現在使用しているバンドルのバージョン等が管理されます。
**composer.json**：必要となるバンドルを記述します。
**composer.phar**で実行。

んで、composer install と composer updateですが、

>**composer install**：**composer.lock**に書かれている各ライブラリをインストールする。
>**composer update**：**composer.json**をもとに各ファイルを最新版にアップデートする。

ということでした。
ユースケースとしては

* 新しい環境ではじめにインストールするとき：**composer install**

* 何か新しいバンドルを追加したい：**composer.json**にかいて**composer update**

* 本番のライブラリを最新版にしたい：開発環境で**composer update**して問題なければ**composer.lock**ファイルを本番にコピーして**composer intall**する

というかんじでしょうか。開発環境ではupdateのほうが頻繁に使うことになるかと思います。
Amazonで一年間に使った金額と、注文履歴のTSVを出力するブックマークレット【2015年版】


# 経緯
2014年一年間で読んだ本の情報をまとめようと思った。とりあえずAmazonから一年分の購入履歴を取得したい。
そういえば去年、[Amazonの購入履歴の合計金額を取得するブックマークレット](http://moroya.hatenablog.jp/entry/2013/06/03/225935)が流行ってたことを思い出した。
そうだ、あれを参考にさせてもらおう。
（ ＾ω＾）

とりあえず上記サイトのブックマークレットを実行！
...あれ、動かない。

デバッガで調べてみたところ、どうやら現在Amazon側の仕様が変わっていて利用できなくなっている。

更に探してみたところ、[Amazonの新しい仕様に沿った修正版](https://gist.github.com/polamjag/866a8af775c44b3c1a6d)をgistで発見。
こちらのコードからforkして、商品情報を取得する実装を追加した。
(またそのうちamazonの仕様変更で使えなくなるかもしれないが。)

# 成果物

## 入力
集計したい年を入力。

![スクリーンショット 2015-01-02 8.50.27.png](https://qiita-image-store.s3.amazonaws.com/0/62874/9bc9660b-b0b2-2386-9317-3d5a8fb291ce.png "スクリーンショット 2015-01-02 8.50.27.png")


## 出力

### 合計金額
集計が終わった後、ダイアログで合計金額を出力。

![スクリーンショット 2015-01-02 8.50.55.png](https://qiita-image-store.s3.amazonaws.com/0/62874/e332d265-ceed-0c70-4ee0-fb4644a1718a.png "スクリーンショット 2015-01-02 8.50.55.png")


### 商品情報

合計金額のダイアログを閉じると、ポップアップで商品情報を表示する。
タブ区切りで下記のようなフォーマットにて出力した。

```
[日付]  [商品名]  [販売元]  [URL]
```

本当は個々の商品の金額も出したかったが断念。
複数商品同時注文については、注文履歴ページに商品ごとの金額の記載がなく取得ができなかった。

出力例は以下。


```
2014/12/19	パターン認識と機械学習 上	C.M. ビショップ	https://www.amazon.co.jp/gp/product/4621061224/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1
2014/12/19	パターン認識と機械学習 下	C.M. ビショップ	https://www.amazon.co.jp/gp/product/4621061240/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1
```

## ソースコード

ソースコードはgistで公開。
[https://gist.github.com/koyopro/a480a45712ccf1bf239c](https://gist.github.com/koyopro/a480a45712ccf1bf239c)

## ブックマークレット

ブックマークレットとして使えるようにもしてみた。
上記gistのコードをminifyし、さらにHTMLエスケープしたもの。

[リンク先](https://gist.github.com/koyopro/3c04e9093ce222b45d27)ページのコードをブラウザのアドレスバーにコピペして実行できる。
(コピペ時に先頭の"javascript:"が消える場合は保管してやる)

Amazonの注文履歴ページ( https://www.amazon.co.jp/gp/css/order-history/ )で利用可能。

本当は外部にjsファイルを置いて実行させたいのだが…。
Chromeだとhttpで取得したjsがhttpsのページ内では実行できず一旦保留に。

# 参考
いままでいくらAmazonで買い物したか合計するブックマークレット書いた - モロ屋
http://moroya.hatenablog.jp/entry/2013/06/03/225935

Amazonの注文履歴をCSV形式にして出力するスクリプト
https://gist.github.com/arcatdmz/8500521

Amazon で使った金額の合計を出す奴 (2014 年バージョン)
https://gist.github.com/polamjag/866a8af775c44b3c1a6d
utf8に一定文字数ごとに行頭に句読点こないように改行コード入れる。

utf8を一定文字数ごとに改行する。
その際、行頭に「、」や「。」がこないように改行をいれる。

バイト数チェックはjanssonライブラリのutf.hを使うべし。
https://github.com/akheron/jansson/blob/master/src/utf.h

```aho.cpp
#include "utf.h"
//descriptionを17文字ずつ改行
//行数を返す
int TextHelper::descriptionR(std::string *description) {
    int lines = 1;
    int cnt = 0;
    const char *c = description->c_str();
    std::stringstream stream;
    int32_t codePoint = 0;
    char buf[4];
    int size;
    const char *next = utf8_iterate(c, &codePoint);
    bool pass = false;
    while (next[0] != '\0') {
        ASSERT(!utf8_encode(codePoint, buf, &size), "not false");
        c+= size;
        for(int i = 0; i<size; i++){
            stream << buf[i];
        }
        if (cnt++ > 16) {
            next = utf8_iterate(c, &codePoint);
            ASSERT(!utf8_encode(codePoint, buf, &size), "not false");
            if(codePoint == 0x3001 || codePoint == 0x3002){
                c+= size;
                for(int i = 0; i<size; i++){
                    stream << buf[i];
                }
            }
            cnt = 0;
            stream << '\n';
            lines++;
            if(next[0]== '\0')goto __skip;
        }
        next = utf8_iterate(c, &codePoint);
    }
    ASSERT(!utf8_encode(codePoint, buf, &size), "not false2");
    for(int i = 0; i<size; i++){
        stream << buf[i];
    }
__skip:
    *description = stream.str();
    return lines;
}
```
「進捗どうですか？」より2015倍捗る「困ってますか？」

## 概要
お願いした作業の進捗を聞くときには「進捗どうですか？」より「困ってますか？」と聞くほうが何倍も捗るよ、というお話。

<small>タイトルの2015倍は冗談です。念のため。</small>

## 「進捗どうですか？」はダメです
あけましておめでとうございます。ところで皆さん***進捗どうですか?***

・・・いやー、流行りましたね。

この「進捗どうですか？」はtwitter上で使うと「最近どうよ、忙しいの？」程度の挨拶で面白みがあるのですが、実際に仕事で使うとなんのいいこともないと思うのです。

### 質問攻め
いいことがないと思う理由は、「進捗どうですか？」は質問攻めになりやすいと思うからです。「進捗どうですか？」の先に待っているやりとりはだいたいこんな感じです。

```
「進捗どうですか？」
「進捗ダメです。」
「どこがダメなの？」
「単体テストが遅れています」
「どれくらい遅れてるの？」
「えーと・・・、0.5日分くらいです」
「項目数でいうと？全部で何件？何件進まないといけないの？なんで遅れたの？対策は？なんで早めにアラート上げてくれなかったの？」
「え、えーっと・・・」
```

こんな感じでリーダー主体の質問攻めになってる場面をよく見ます。もちろん、ほとんどのリーダーとしては現状を良くしようと純粋に質問しているだけだと思います。でもこれを詰問と感じて萎縮してしまう人も結構多いのです。

### 相手が萎縮したら終わり
どちらかが萎縮した瞬間にコミュニケーションの質は一気に下がります。相手を意図的に萎縮させて進める仕事はもちろん論外ですが、意図的じゃなくても相手が「怖い」とか「怒ってる？」と感じさせたらスムーズな意思疎通は難しくなるでしょう。

* 報告したら怒られるかなぁ、嫌だなぁ
* なんかあの人イライラしてるから、報告は後にしよう
* すぐ言うべきだけど、いろいろ聞かれるから、入念に準備してからにしないとなぁ・・・
* あの人面倒くさいから、できればなかったことにしたいな。
* 進捗出てないなぁ・・・でも進捗を報告しないといけないからなぁ・・・

スムーズな意思疎通なしに十分な進捗は望めません。

##「困ってますか？」
そこで個人的におすすめしているのがこの記事のタイトルでも利用している「困ってますか？」です。

とりあえず開口一番で「困ってますか？」と聞くのです。例えばこんな感じで。

```
「あ、山田さんお疲れ様です。」
「お疲れ様です。」
「険しい顔ですね。なにか困ってますか？」
```

別に困ってなければ「困ってない」と答えてくれるだろうし、困ってたら「実はこんなことが・・・」と話してくれるはずです。進捗が気になるのであれば、困ってることを聞いた上で聞けばいいのです。

### 二択
「困ってますか？」はクローズドクエスチョンです。つまり、「はい」か「いいえ」の2択で答えられます。たとえ、聞かれた瞬間に具体的に何に困ってるか整理がついていなかったとしても答えることが可能です。

```
「困ってますか？」
「・・・はい。困ってるといえば確かに困っています。」
もしくは
「いえ、別に困ってないです。順調です。」
```

とてもわかりやすいですね。
これが「進捗どうですか？」だと

```
「進捗どうですか？」
「（えーっと数えるの忘れてたな・・・さっきまで10件で2件進んだから）12件です。」
```

のように答えるまでに考えなければいけないことが多いです。ちょっとしたことがですが、リアルタイムのコミュニケーションでとっさに考えるのは意外と負担です。その後に

```
「分子だけ言われてもわからないですよ。分母は？」
「で、遅れてるの？予定通りなの？」
「遅れてる理由は？いつから遅れてるの？」
「なんでもっと早めにアラート上げてくれなかったの？」
```

などとけしかけられたらげんなりしてしまいますよね。もう考えるのを放棄して「すみません」などと言ってしまいそうです。聞く方は別に謝って欲しいわけではないのに。

### 安心して答えられる
「困ってますか？」と聞かれると安心して答えられます。

進捗が出ていない状況だと人は後ろめたさを感じるものです。後ろめたいことを正直に話すのは勇気がいることです。「進捗どうですか？」の後に質問攻めが待っていると分かっているからなおさらです。

そこで「困っていますか？」と聞いてもらえると

* 困っていることを言っていいんだ
* 自分の声を聞いてくれるんだ

と安心するものです。「困ってます」と答えて。

```
「なんで困ってるんだお前は！」
```

なんて怒り出す人はいないでしょうから。

### 進捗が出ていても困っていることはある
進捗は良くても困っているという事も有り得ます。例えば以下のように。

* 実はテストのオペレーションが本当に正しいか自信がない状態で進めていた
* 今のところ問題はないけど、次のテストからマシンが増えるのにマシンがない

進捗ばかりにこだわると、このような「困った」を見落としがちになります。もしかしたらそのせいで致命的な問題が発生するかもしれません。「困ってますか？」はそのような問題を早期にあぶり出すこともできるのです。

### アラートが上がるようになる
問題は必ず発生するものなので、なにか起きたら早く知らせてほしいとリーダーは常々思っています。問題発覚が遅れて「早めにアラート上げて欲しかったな」「すみません」という会話を何度も見ました。

「困ってますか？」はこれも解消します。「あの人は『困ってますか？』と聞く人だ」というのが浸透すれば、なにか困ったときにメンバー自ら「ちょっと困ってるんです・・・」と話にきてくれるようになるからです。これはチームとしてはとても良い状況でしょう。メンバーが安心して話せるチームは一つの理想です。

## 終わりに
こんな感じで「困ってますか？」には色々なメリットが存在します。進捗を知りたいだけなのに相手の話を聞かなければいけないのは少し面倒かもしれません。でも、早い時点で困ったことに対処できたら、間違いなく結果的に何倍もの進捗を得ることができるでしょう。

2015年からは「何か困ってますか？」でバリバリ進捗を出していきましょう。
今年もよろしくお願いします。
hooktail_docsをMac OS Xで動かす

以下の操作手順は、[ここ](https://github.com/nnabeyang/hooktail_docs/archive/master.zip)からソースコードをhooktail_docs-masterをダウンロードしてから、物理のかぎしっぽにRsTファイルを変換するまでの手順になります。

```bash
$ unzip hooktail_docs-master.zip
$ nkf -w --overwrite *.rst vectoranalysis/*.rst mathInPhys/*.rst algebra/*.rst
$ vi conf.py
## unix, linux, mac os xの人はsource_encodingをutf-8-sigにする
source_encoding = 'utf-8-sig' # for unix, linux, mac
#source_encoding = 'cp932'    # for windows
$ make rst
sphinx-build -b rst -d _build/doctrees   . _build/text
Making output directory...
Running Sphinx v1.2.2
loading pickled environment... not yet created
building [rst]: targets for 20 source files that are out of date
updating environment: 20 added, 0 changed, 0 removed
reading sources... [100%] welcome
looking for now-outdated files... none found
  ckling environment... done
checking consistency... done
preparing documents... done
writing output... [100%] welcome
build succeeded.
```
Javascriptによるゲームパッド情報の取得

現在の主要ブラウザのうち、ChromeとFirefoxでは「GamePadAPI」が実装されており、USBゲームパッドの情報を取得することが出来る。
しかし、各ゲームパッドによってボタンの数や値が違うため、ユーザーの使っているゲームパッド毎に設定を行う必要がある。
それではユーザーが持っているゲームパッドを指してすぐゲームをすることが出来ないので、ほとんどのコントローラーで同じ値が返ってくるボタンに限り共通の値が返ってくるライブラリ「GamePadProcedure」を作ってみた。
このライブラリを使うと、ファミコンコントローラーのようなUSBコントローラーと、XBOX360コントローラーを認識出来ていればアナログスティックの情報も取得出来るようになる。
情報の取り方はgithubに書いてあるのでそちらを参照。

**2015.01.05 追記**
nexus5にUSB変換ケーブルを使いPS3 DUALSHOCK3を有線接続したところ、Chromeでジョイパッドの値が取得出来た。
しかし、AXISがアナログスティックでしか取れなかったので、XBOX360コントローラーのような処理が必要と思われる。

**2015.01.06 追記**
取得出来るボタンの数が6つまでだったのを、8つに変更。ゲームパッドによくある「Select」「Start」を取れるようにした。XBOX360コントローラーではこの2つはボタン8、9になっているが、ライブラリ内でボタン6、7に格納している。

https://github.com/digitarhythm/gamepadprocedure/
cocos2dxを64bitでビルドする

未だに64bitがデフォルトじゃないのもどうかと思うんだけど、せっかく触ったのでメモしておく。


**前提条件**
・windows8.1の64bit環境下でプロジェクトを作成している
・VisualStudio2013をインストールしてある
・cocosの依存関係にある各種OSSの64bitバイナリを揃えている（自前ビルド推奨）


**手順**
1. cocos new でプロジェクトを作成
2. プロジェクトをVisualStudioで開く
3. 作成したプロジェクトを構成マネージャで開き、ターゲットプラットフォームをx64に設定する
4. libcocos2dサブプロジェクトのコンパイルオプションに/bigobjを追加する
5. 出力ディレクトリに64bitバイナリを設置する
6. libcocos2dとスタートアッププロジェクトのリンク前イベントを消してバイナリが上書きされるのを防ぐ
7. ビルド実行


**解説**
依存関係にあるバイナリが自前ビルド推奨なのは、ランタイムライブラリでMTとMDを混用するのを防ぐため。DLL地獄にハマりたくなければ、スタティックライブラリとして全てをビルドしたほうが良いかと。(未検証
img要素をline-heightで縦位置中央揃えしたいとき


何故か親要素に`line-height`指定してもimg要素が中央に寄ってくれなくて、
なんでだろって調べたらimg要素に`vertical-align: top`が指定されていたためだった。

`line-height`でimgを中央揃えしたいときは`vertical-align: middle`でなければならない。
Haskellでレーベンシュタイン距離（文字列編集距離）を求める

初めて関数型言語を学習したので、向いてそうな動的計画法のアルゴリズムを書いてみました。
凝った事をしているわけではないのですが、名前が必殺技みたいでカッコイイですね。

##### levenshtein.hs

```hs

levenshtein :: String -> String -> Int
levenshtein str1 str2 = d !! wl1 !! wl2
    where
        wl1 = length str1
        wl2 = length str2
        d = [[distance m n | n<-[0..wl2]] | m<-[0..wl1]]
        distance i j 
            | i == 0    = i
            | j == 0    = j
            | otherwise = minimum [ d!!(i-1)!!j + 1
                                  , d!!i!!(j-1) + 1
                                  , d!!(i-1)!!(j-1) + cost]
            where
                cost = if str1 !! (i-1) == str2 !! (j-1) then 0 else 1      
```

こんな感じでレーベンシュタイン距離が計算されます。

```hs

*Main> levenshtein "abracadabra" "ababababa"
4
```

##### アルゴリズム

レーベンシュタイン距離を算出するための、動的計画法のアルゴリズムそのものは、wikipediaと下記を参考にさせて頂きました。
[naoyaのはてなダイアリー | 編集距離 (Levenshtein Distance)](http://d.hatena.ne.jp/naoya/20090329/1238307757)

一応超ざっくり説明すると、下記のようなマトリクスを用意して、

|i/j| - | a | p | p | l | e |
|---|---|---|---|---|---|---|
| - | 0 | 1 | 2 | 3 | 4 | 5 |
| p | 1 |   |   |   |   |   |
| l | 2 |   |   |   |   |   |
| a | 3 |   |   |   |   |   |
| y | 4 |   |   |   |   |   |

[i,j]は下記①、②、③の内の最も小さい数
①[i, j-1] + 1
②[i-1, j] + 1
③もし文字列1[i] = 文字列2[j] なら[i-1, j-1], そうでないなら[i-1, j-1] + 1

という漸化式で求まります。

|i/j| - | a | p | p | l | e |
|---|---|---|---|---|---|---|
| - | 0 | 1 | 2 | 3 | 4 | 5 |
| p | 1 | 1 | 1 | 2 | 3 | 4 |
| l | 2 | 2 | 2 | 2 | 2 | 3 |
| a | 3 | 2 | 3 | 3 | 3 | 3 |
| y | 4 | 4 | 3 | 4 | 4 | 4 |
モデルクラスでレコードが格納される場所


```rails
class Event < ActiveRecord::Base
  belongs_to :owner , class_name: 'User'
  has_many :tickets, dependent: :destroy

  validates :name, length: { maximum: 50 }, presence: true
  validates :place, length: { maximum: 100 }, presence: true
  validates :content, length: { maximum: 2000 }, presence: true
  validates :start_time, presence: true
  validates :end_time, presence: true
  validate :start_time_should_be_before_end_time

  def created_by?(user)
    return false unless user
    owner_id == user.id
  end

  private

  def start_time_should_be_before_end_time
    return unless start_time && end_time

    if start_time >= end_time
      errors.add(:start_time, 'は終了時間よりも前に設定してください')
    end
  end

end

```

owner_idはミミックメソッド

```ruby
irb(main):002:0> event = Event.new(name: "test name!")
=> #<Event id: nil, owner_id: nil, name: "test name!", place: nil, start_time: nil, end_time: nil, content: nil, created_at: nil, updated_at: nil>
irb(main):003:0> event.instance_variables
=> [:@attributes, :@column_types_override, :@column_types, :@aggregation_cache, :@association_cache, :@attributes_cache, :@readonly, :@destroyed, :@marked_for_destruction, :@destroyed_by_association, :@new_record, :@txn, :@_start_transaction_state, :@transaction_state, :@reflects_state, :@changed_attributes]
irb(main):004:0> puts event.attributes
{"id"=>nil, "owner_id"=>nil, "name"=>"test name!", "place"=>nil, "start_time"=>nil, "end_time"=>nil, "content"=>nil, "created_at"=>nil, "updated_at"=>nil}
=> nil

````
Celluloidをさわってみる


スレッド管理をするために、少しだけ[Celluloid](https://github.com/celluloid/celluloid)を触ってみた。

IO周りの非同期処理、Fault-toleranceをうまい具合にやってくれる。スレッドが死んでしまった場合でも監視しているので、自動でスレッドを生成してくれる。


```ruby:celluloid.rb
class Supervisor

  def initialize
    @supervisor = Celluloid::SupervisionGroup.run!
    @supervisor.pool(Worker, as: :worker, size: 2)
  end

  def run
    loop do
      @supervisor[:worker].process
    end
  end

end

class Worker
  include Celluloid
  
  def process
    puts "do something!!"
  end
end
```

*SupervisionGroup* でスレッドをグループ化して管理する。グループ化することでスレッドの起動と停止をグループごとに行うことができる。
詳細は[公式ドキュメント](https://github.com/celluloid/celluloid/wiki)を参照。

`@supervisor.pool(Worker, as: :worker, size: 2)`ではグループのPoolにWorkerクラス(実際に処理をさせるクラス)を指定して、`as: :worker`で *worker* という名前で定義する。`size:`で同時に生成するスレッド数を指定する。

あとは`@supervisor[:worker].process`で *Worker#process* を実行する。

Message Queuingで使ってみた感想としては、単純なスレッドの生成(Threadを使った)より並列処理の速度は落ちてしまうようです。
SkinnyFrameworkでControllerの共通処理はtraitにしてmixinする構成がよさそう

SkinnyではControllerを作るにあたって基底として利用できるクラスが多数あります。作成したいControllerの機能に応じて使い分けることになります。

* ScalatraFilter系
  * SkinnyController (基本これを使う)
  * SkinnyApiController (画面を持たないWebAPIを作成する場合に使う)
  * SkinnyResource (モデルに対する定型のCRUDを作る場合に使う)
  * SkinnyApiResource (モデルに対するREST APIを作る場合に使う)
* ScalatraServlet系
  * SkinnyServlet (SkinnyControllerのServlet版)
  * SkinnyApiServlet (SkinnyApiControllerのServlet版)
  * SkinnyResourceServlet (SkinnyResourceのServlet版)
  * SkinnyApiResourceServlet (SkinnyApiResourceのServlet版)

大きくは、ScalatraFilter系とScalatraServlet系があります。
これらは以下のような違いがあります。

* FormからのファイルアップロードはScalatraServlet系のみが受け取れる
* マウント方法が異なる

```scala
object Controllers {
  def mount(ctx: ServletContext): Unit = {
    filter.mount(ctx)

    org.scalatra.servlet.RichServletContext(ctx).mount(servlet, "/servlet")
  }

  // ScalatraFileter系コントローラ
  object filter extends SkinnyFilter with Routes {
    // URLはアプリルートからの絶対パスを指定する
    val hogeUrl = get("/filter/hoge")(hoge).as('hoge)
  }

  // ScalatraServlet系コントローラ
  object servlet extends SkinnyServlet with Routes {
    // mount時のパスからの相対パスを指定する
    val fugaUrl = get("/fuga")(fuga).as('fuga) // 実URLは、"/servlet/hoge"
  }

}
```
* web.xmlにて error-pageタグで指定するURLは、ScalatraServlet系のURLのみ指定できる
* notFoundの動きが異なる (参照:
http://www.scalatra.org/2.3/guides/http/routes.html#toc_267)

Skinnyのブランクアプリではアプリ用のコントローラの基底クラスとしてSkinnyControllerを継承したApplicationControllerと、SkinnyApiControllerを継承したApiControllerが用意されています。
アプリのコントローラで共通の機能が必要なときは、これらのクラスに実装することになります。
しかし、前述のとおり他のコントローラ基底クラスを使いたい場合に、ここで実装した共通機能を使えなくなってしまします。

そこで、Controllerの共通処理はtraitとして実装しておき、必要に応じてそのtraitと上記コントローラ基底クラスとを組み合わせられるようにしておくとよいと思います。
例えば、以下のようにコントローラの種類ごとのFeatureを用意しておくと後々で拡張しやすくなります。

```scala
/** アプリケーションの画面ありControllerの基底クラス */
trait ApplicationControllerFeature extends ApplicationApiControllerFeature
  with ErrorPageFilter {

}

/** アプリ全体のAPI系コントローラ共通機能 */
trait ApplicationApiControllerFeature
    // 基本となるtraitをmixin
    extends SkinnySessionFilter
    with TxPerRequestFilter {

  // すべてのコントローラに対するbefore処理
  before() {
    logger.info("ACCESS_LOG params=" + JSONStringOps.toJSONStringAsIs(params))
  }
}


// ユーザエリア用

trait UserControllerFeature extends ApplicationControllerFeature with UserControllerBaseFeature
trait UserApiControllerFeature extends ApplicationApiControllerFeature with UserControllerBaseFeature


/** ユーザエリア向けControllerの基盤機能 */
sealed trait UserApiControllerBaseFeature
  // ユーザページ固有のフィルタ
  extends UserLoginFilter { self: ApplicationApiControllerFeature =>
}


// 管理画面用

trait AdminControllerFeature extends ApplicationControllerFeature with AdminApiControllerBaseFeature
trait AdminApiControllerFeature extends ApplicationApiControllerFeature with AdminControllerBaseFeature

/** 管理画面向けControllerの基盤機能 */
sealed trait AdminApiControllerBaseFeature
  // 管理ページ固有のフィルタ
  extends AdminLoginFilter { self: ApplicationApiControllerFeature =>
}

```
Nmapでポートスキャン


# PingScanでノードを探す

```
nmap -sP 192.168.1.0/24
```

# 対象のノードのポートが開いているか確認

```
nmap -p 22-1024 192.168.1.100
```

この場合は、192.168.1.100に対して22から1024番までのポートが開いているか確認

# 開いているポートのサービスのバージョンを推測

```
nmap -sV -p 22 192.168.1.100
```

結果
22/tcp open   ssh      OpenSSH 6.4 (protocol 2.0)
ブリッジを併用したIPv6のルータ広告がうまくいかない現象を回避する

## ルータ広告で楽しよう

IPv6には、ステートレスに自動設定を行える手段としてルータ広告を使った自動設定があります。
これは、IPv6のマルチキャストを用いて実装されていて、以下の手順で自動設定が行われます。

1. すべてのルータ(ff02::2)にルータ要請メッセージを送信する
2. 受け取ったルータは、すべてのノード(ff02::1)にルータ広告メッセージを送信する
3. メッセージを受け取ったノードは、それを元に自動設定を行う(アドレスはプレフィックス+EUI-64を使うのが一般的)

(https://www.nic.ad.jp/ja/basics/terms/ra.html より)

## ところが、ブリッジを経由すると動かない…

タイミングによっては、ブリッジ上の目的のルータがある側のインターフェース上のノードがルータ要請メッセージを送信している場合があるので、その際のすべてのノードに送られるルータ広告メッセージを使って設定されることもあります。
しかし、そういうことがなければ当然ルータ広告メッセージは送られてこないので、設定されなかったり妙に時間がかかってしまったりということがあります。

## Linuxのブリッジは不要と思われるマルチキャストを捨ててしまう

Linuxでは、ブリッジ上の目的のルータがない側のインターフェースからルータ要請メッセージを送ったとしても、ブリッジする段階で捨てられてしまうようです。
これを回避するには、以下のコマンドでmulticast snoopingを無効にして無条件にマルチキャストをブリッジするようにするのが良いようです。

```console
# echo 0 > /sys/devices/virtual/net/<インターフェース>/bridge/multicast_snooping
```

## 参考ページ

[Linux, multicast, bridging and IPv6 troubles (i.e. why my IPv6 connectivity goes missing)](https://www.v13.gr/blog/?p=378)

[OpenWRTのマルチキャストフォワードに関するページ](http://wiki.openwrt.org/doc/recipes/dumbap#multicast_forwarding)
AVRWRT のピン配置

　これまた毎度忘れてしまうのでメモ。 文字色 = ケーブル色。 MOSI が読みづらいのは仕様です。

<table>
<tr><td><font color="#f00">2. <strong>VCC</strong></font></td><td><font color="#ff0">4. <strong>MOSI</strong></font></td><td><font color="#00f">6. <strong>GND</strong></font></td></tr>
<tr><td><font color="#960">1. <strong>MISO</strong></font></td><td><font color="#f90">3. <strong>SCK</strong></font></td><td><font color="#0f0">5. <strong>RST</strong></font></td></tr>
</table>
node-configを使ってみた


[node-config](https://github.com/lorenwest/node-config) とは、以下に示すような機能を提供してくれるパッケージ。

* アプリケーションのデプロイに対する、階層的な設定を管理することできる。
* デフォルト設定を定義することができ、developmentやproductionなど、異なるデプロイ環境に拡張することができる。
* 設定は、アプリケーション内に保存され、環境変数やコマンドラインパラメータ、外部ソースにより上書きすることができる。

詳細は、node-configのREADMEにて。

## 準備する

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

	$ npm init
	$ npm install config --save
	$ touch index.js

`index.js` のコードは以下。

	var config = require('config');
	
	console.log("NODE_ENV=%s", process.env.NODE_ENV);
	console.log(JSON.stringify(config));

configファイルを作る。`config`ディレクトリ配下に、`default.json`、`development.json`、`production.json`を作る。各ファイルの内容は、[ここ](https://github.com/toshiyukihina/hello-node-config)から参照可能。

	.
	├── config
	│   ├── default.json
	│   ├── development.json
	│   └── production.json
	├── index.js
	├── node_modules
	│   └── config
	└── package.json

## 試してみる

NODE_ENVをいろいろ変えて、動かしてみる。

### NODE_ENV=development

期待通り、`config/development.json`が読み込まれている。

	$ NODE_ENV=development node index.js 
	NODE_ENV=development
	{"message":"This is a development config"}

### NODE_ENV=production

期待通り、`config/production.json`が読み込まれている。

	$ NODE_ENV=production node index.js 
	NODE_ENV=production
	{"message":"This is a production config"}

### NODE_ENVに指定しない

何も指定しないと、`config/development.json`が読み込まれた。`config/default.json`が読み込まれることを期待していたが、結果は異なった。

	$ node index.js 
	NODE_ENV=undefined
	{"message":"This is a development config"}

NODE_ENVに何も設定しない場合、`config/development.json`というファイルが存在すれば、それを読み込むのかもしれない。

試しに、`config/development.json`を、`config/dev.json`に変更して再度実行してみた。すると、`config/default.json`が読み込まれたので、そういうことなのだろう。

	$ node index.js 
	NODE_ENV=undefined
	{"message":"This is a default config"}

### NODE_ENV=hoge

誤った値が設定されていると、`config/default.json`が読み込まれる。

	$ NODE_ENV=hoge node index.js 
	WARNING: NODE_ENV value of 'hoge' did match any deployment 	config file names.
	WARNING: See https://github.com/lorenwest/node-config/wiki/Strict-Mode
	NODE_ENV=hoge
	{"message":"This is a default config"}
Oracle STATSPACKをHTML形式で出力


## 内容

「set markup html on」を使用し、statspackのレポートをHTML形式で出力


###SQL

```SQL:
-- 1.対象となるsnap_idの取得
col snap_id for 99999
col snap_time for a20
select snap_id, to_char(snap_time, 'yyyy-mm-dd hh24:mi:ss') snap_time
from stats$snapshot order by snap_id;

-- 2.設定
define begin_snap=<開始SNAP_ID>;
define end_snap=<終了SNAP_ID>;
define report_name='sprep_test.html';

-- 3.レポート出力
set markup html on 
@?/rdbms/admin/spreport.sql

exit
```


###結果
見やすい部分と見づらい部分ができる。

----
　　　　　　　　　　…（省略）…

![sprep_test.html.png](https://qiita-image-store.s3.amazonaws.com/0/63331/8ebc73d5-a3e7-f73c-114e-83a8ba386eb7.png "sprep_test.html.png")

　　　　　　　　　　…（省略）…

----
Oracle 11g アラートログ(alert.log)をtail -fで表示するスクリプト

はじめに
===

Oracle 11gサーバ(11.1.0.7)のOracleアラートログ(alert.log)をtail -fで表示するスクリプトについて記載致します。

Oracle 11gサーバの運用管理で、Oracleアラートログを見る事が多いのですが、Oracleのアラートログは深い階層に出力されるので、毎回手打ちでログファイルを開くのが面倒ですので、アラートログをtail -fで表示するスクリプトを利用しております。

tail -fでアラートログを表示すると、アラートログにログが追記された場合、追記されたログの内容が随時表示されます。

Oracle環境変数について
===

Oracle 11gサーバのoracleユーザの.bash_profileで、以下のような環境変数が設定されているとします。例えば以下のような値が設定されているとします。

```
[oracle@example-oracle-11g ~]$ echo $ORACLE_BASE
/oracle_example/opt/oracle/app/oracle
[oracle@example-oracle-11g ~]$

[oracle@example-oracle-11g ~]$ echo $ORACLE_SID
testsid
[oracle@example-oracle-11g ~]$
```

Oracleアラートログをtail -fで表示するスクリプト
===

以下のようなシェルスクリプトをホームディレクトリ等に作成します。

```
[oracle@example-oracle-11g ~]$ vi tail_alert_log.sh
```

```shell-session:tail_alert_log.sh
#!/bin/sh

ALERT_LOG="${ORACLE_BASE}/diag/rdbms/${ORACLE_SID}/${ORACLE_SID}/trace/alert_${ORACLE_SID}.log"

if [ -f ${ALERT_LOG} ] ; then
        tail -f ${ALERT_LOG}
fi
```

```
[oracle@example-oracle-11g ~]$ chmod 755 tail_alert_log.sh
```

Oracleアラートログの表示例
===

先ほど作成したスクリプトを実行しますと、tail -fでOracleアラートログの内容が表示されます。

```
[oracle@example-oracle-11g ~]$ ./tail_alert_log.sh
　　(省略)　
Wed Jan ** **:**:** 2015
Thread 1 advanced to log sequence XXXXXX (LGWR switch)
  Current log# 4 seq# XXXXXX mem# 0: /XXXXXXXXXX/testsid/redogXXm01.log
  Current log# 4 seq# XXXXXX mem# 1: /XXXXXXXXXX/testsid/redogXXm02.log
Wed Jan ** **:**:** 2015
Archived Log entry XXXXXX added for thread 1 sequence XXXXXX ID XXXXXXXXXXXXX dest 1:

```
シェルスクリプトのTips


シェルスクリプトを勉強していて少しややこしいところがあったので、まとめてみました。

##メタキャラクタについて
「"・・・"」で括った文字列の中で「”」や「$」などの特殊記号を使いたい場合はメタキャラクタを使います。


##シェルスクリプト中に文字列を書く場合

①”・・・”
②'・・・'
③括らずに書く
の3種類がある。
①の場合、括られた全体がひとつの文字列として扱われます。括られた文字列の中では変数の展開・コマンド置換・メタキャラクタなどの各種展開が可能！
文字列中に「"」や「＄」を含めたいときは「\"」「\$」のようにする。
②の場合、①と同じように括られた全体がひとつの文字列として扱われます。
但し、変数の展開等が行われません。
③の場合、変数の展開などが行われます。ただし空白などで単語を区切ると単語ごとに扱われます。

##変数の値を書き換えられないようにする
readonlyコマンドを使う。

##$*と$@の違い
\$\*と\$@はどちらも引数全体を表しますが
例えば引数が「a b c」の場合、
\$\*は引数全体をひとつの文字列をして扱うので「a b c」となります。
$@はひとつひとつの引数を括って並べたものになるので「"a" "b" "c"」となります。

##特殊記号$について
\$1~\$9は引数を表す。
\$?は最後のコマンドの終了コードを表す。
\$0はシェルスクリプト自身のファイル名を表す。
\$#は引数の個数を表す。

##「--」について
様々なシェルスクリプトを見ると、
`set -- $i`
のように「--」というのを見ることがある。
なぜ「--」が必要かと言うと、
\$iが「-x 」という文字列で開始された場合にオプション変更だと解釈されてしまいます。これを防ぐために、「--」を入れて「これ以降はオプション設定ではない」と明示します。 

##配列変数を参照する場合、「｛」「｝」を使う
    sample[0]="zero"
    sample[1]="one"
    sample[2]="two"

    for i in 0 1 2;do
	    echo "sample[$i]=${sample[$i]}"
    done


##配列の区切り文字としてシェル変数IFSが使われる
    sample[0]="hello"
    sample[1]="world"
    sample[2]="Hi!!"

    IFS=":"

    echo "${sample[*]}"
結果
`hello:world:Hi!!`

####改行で表示することも出来る

    sample3[0]="hello"
    sample3[1]="world"
    sample3[2]="Hi!!"

    #改行
    IFS=$'\n'

    echo "${sample3[*]}"

結果

    hello
    world
    Hi!!

##標準エラー出力にメッセージを出力する
メッセージを標準出力ではなく、標準エラー出力したい場合には、リダイレクトして「>&2」とする。
エラーメッセージを標準出力に書き込むように設定するとメッセージが混じって不便なので、なるべく分けるようにしたほうが良いと思います。
プロキシ環境下のWin機でreveal.jsのFullSetupを行う

## 概要
社内などのプロキシ環境下においてMarkdownでプレゼン資料がサクッと作れる[reveal.js](https://github.com/hakimel/reveal.js/)のFullSetupをWindowsにて行う。

プロキシ環境下ではFullSetupを行うためのNPMモジュールがそのままではインストール出来ないため、手順をまとめておく。

なお、reveal.jsの紹介記事ではないため、適宜調べてください。

## 環境
* Windows 7
* プロキシ環境下
* Node.js：v0.10.35
* npm：1.4.28

## 手順

### Node.js
まずはNode.jsをインストールする。

[Node.js](http://nodejs.org/)

インストールしたら、Windowsの環境変数PATHにNode.jsをインストールしたフォルダパスを追加する。

コマンドプロンプトなりGitBashなりを起動。

```
> node -v
> npm -v
```

それぞれ、バージョンが表示されたらOK。

### NPM

```
> npm config -g set proxy http://[proxy server address]:[proxy port]
> npm config -g set https-proxy http://[proxy server address]:[proxy port]
```

grunt-cliをインストール。

```
> npm config -g set registry http://registry.npmjs.org/
> npm install -g grunt-cli
```

### reveal.js

[reveal.js](https://github.com/hakimel/reveal.js/)をDLし解凍。

コマンドプロンプトで解凍したフォルダ内に移動。

package.jsonにインストールするモジュールは書かれているので次の1行でインストール完了です。

```
> npm install
```

**これにてFullSetup完了！**

## 実行

```
> grunt serve
```

* スライド：[http://localhost:8000/#/](http://localhost:8000/#/)
* PDF：[http://localhost:8000/?print-pdf#/](http://localhost:8000/?print-pdf#/)

※PDF版はchromeとかで1枚ずつのPDFファイルにして保存できたはずです。

## そういえばなぜFullSetupしたかったのか

FullSetupしてしまえば、index.htmlを以下のように編集するだけで**Markdown形式の外部ファイルが読み込める**！

```html
<div class="slides">
    <section data-markdown="./md/slide.md"
        data-separator="\n---\n$"
        data-vertical="\n--\n">
        <script type="text/template">
        </script>
    </section>
</div>
```

これで外部ファイル（./md/slide.md）をMarkDownエディタで編集して確認できますな。


## まとめ

* 詰め込み過ぎました。
* これでかっこよい社内プレゼンがWin機でできますね。
Haxe 3.2.0で型付きのrequireをする

これまでHaxeからCommonJS `require`を実現するには、haxelibからnodejsライブラリをインストールする必要があった。しかし、nodejsライブラリに定義されている`require`は戻り値の型が`Dynamic`と定義されていたので、存在しないメソッド呼び出しをしてもコンパイル時にエラーが発生しなかった。

```hx
import js.Node;

class Main {
    static public function main() {
        var fileSystem = Node.require('fs');
        fileSystem.thisMethodMustNotExist();
    }
}
```

このことにより型があるというHaxeの強みが失われていたが、3.2.0以降のバージョンでは`@:jsRequire`アノテーションにより`require`したモジュールに型を定義できるようになる。

3.2.0はまだリリースされていないのでリポジトリから取得する。OSX, Homebrewで`--HEAD`オプションつけてインストールしている。

```bash
$ brew install haxe --HEAD
```

`@:jsRequire`は`extern`シンタックスと併用する。試しにインターフェースが簡単な`fs.existsSync`のみを実装してコンパイルしてみる。

```hx
@:jsRequire('fs')
extern class FS {
    static function existsSync(path:String):Bool;
}

class Main {
    static public function main() {
        trace(FS.existsSync('/etc/hosts'));
    }
}
```

コンパイルしたら`@:jsRequire('fs')`アノテーションが`require('fs')`に変換されていることが確認できる。コンパイル成功を確認したら次にわざとメソッド呼び出しをtypoして、コンパイルエラーが発生することを確認しよう。

EventEmitterのように`require('events').EventEmitter`の形で使いたい場合は、`@:jsRequire('events', 'EventEmitter')`とアノテーションに第２引数を設定する。
cheerioで日本語を読み込ませた時にhtml()を使うといい感じに表示出来ない

cheerioとはこちら

https://www.npmjs.com/package/cheerio

htmlを読み込ませると、jQueryっぽく使えるようにしてくれるもの。

そして、`.html()`を使うと日本語がちゃんと出なかった。。。

```javascript
var cheerio = require('cheerio');

var contents = '<div id="hoge">あああ</div>';
var $ = cheerio.load(contents);

// 以下日本語は変換されない
console.log($.html());
console.log($('#hoge').html());

// 以下ちゃんと出る
console.log($('#hoge').text());
```

出力結果

```html
<div id="hoge">&#x3042;&#x3042;&#x3042;</div>
&#x3042;&#x3042;&#x3042;
あああ
```

`.html()`を使うと、日本語にちゃんと変換されてない。。。

`.text()`を使うと、正常に出力される。

とりあえず、表示させよう〜。的なノリで`.html()`を使ったら日本語出ないから、なんでやー！と、無駄にハマってしまった。。。今日この頃です。


cheerioのversionは`0.18.0`だった。
メモ : コマンドライン引数をそのまま受け付けるような GET な http サービスにリクエストを投げつける shell script

いろいろあってコマンドラインから使いたいツールを http で受け付けるように作ってしまったので、普通にコマンドラインから叩くとそれを url encode してスラッシュで連結して url にする shell script を作ってみた。サーバ側は http で受けたのと、コマンドラインから叩かれたのとで、同じ動きになるようにするんだろう。
url encode しているところの awk はこんなもんでいいんだろうか。

```bash:kick.sh
#!/bin/bash

#kicker=wget
kicker=curl
host=localhost
port=19876
path=`for a in "$@"; do echo $a; done | awk -F '' 'BEGIN{OFS=ORS="";for(i=0;i<256;i++)o[sprintf("%c",i)]=i}{for(i=1;i<=NF;i++)$i=($i ~ /[[:alnum:]]/)?$i:"%" sprintf("%02X",o[$i])}{print "/" $0}'`

url=http://${host}:${port}${path}

$kicker $url
```
Firefoxでopacityした要素をhoverすると、1pxずれるバグの対処法


題名のとおりなんですけど、ちょっとハマったのでメモ。

## どういうこと？
a要素で囲んだimg要素を、ロールオーバーをopacityで操作することってあると思うんですが、他のブラウザでは問題ないけど、Firefoxだけhoverすると何故か1pxずれる問題があります。

```css
a:hover {
	opacity: .6; /* これがずれる！！ */
}
```

## 対処法
背景色を指定してやれば治るみたいです。
どの色を指定してもいいみたいですが、色々な場面で使えるRGBAでしてしてあげるのがいいと思います。

```css
a:hover {
	opacity: .6;
}
a img {
	background-color: rgba(255, 255, 255, .01); /* 透明度を低く指定しました。 */
}
```

白のopacityが0.01なんて、ほとんど見えないので、大丈夫だと思います。

同じことで困っている人の助けになれれば幸いです。
Oracle ハイウォータマーク(HWM)の確認

##内容
ハイウォータマーク(HWM)確認用SQL

## 手順

**SQL**

```SQL:
SELECT 
  S.BLOCKS "確保済み", T.BLOCKS "HWM" 
FROM 
  USER_TABLES T JOIN USER_SEGMENTS S 
ON 
  (T.TABLE_NAME=S.SEGMENT_NAME) 
WHERE 
  T.TABLE_NAME='テーブル名';
```

**結果（例）**

```sql:
  確保済み        HWM
---------- ----------
         8          1
```
intの割り算をdoubleで受けると possible loss of fraction やで!!

自分用メモ

intの割り算をdoubleで受けても小数点が入った値は返ってこない

```csharp
void Main()
{
    //LINQPad使ってるよ
	double returnValue = (14 / 5);
	returnValue.Dump();
	//2がかえる
	returnValue = ((double)14 / 5);
	returnValue.Dump();
	//2.8がかえる
	returnValue = (14 / 5.0);
	returnValue.Dump();
	//でも2.8がかえる
}
```
ReSharperを入れてるとこの時possible loss of fractionのメッセージが出ます。
少しなくなるよって意味かな。。。

切り捨てなのが注意！
実際は計算するのが両方変数の場合があるので気付きにくい！

ReSharperではfind all issuesでソリューション全部から検索できるから便利ですね :+1:
WPFアプリケーションでウィンドウプロシージャをフックする


WPFアプリケーションでウィンドウプロシージャをフックしたい場合、`HwndSource.FromHwnd`メソッドを呼び出して、HwndSourceオブジェクトを取得し、そのオブジェクトに対して`HwndSource.AddHook`メソッドを呼び出すことで行います。

> MSDN : [HwndSource クラス (System.Windows.Interop)](https://msdn.microsoft.com/ja-jp/library/System.Windows.Interop.HwndSource(v=vs.110).aspx)

以下のコードは、WPFでは通常取得できない、ALT+F4キーの押下を検知して無効化するサンプルです。
当たり前ですがフックをWindowの生成が終わった後でないとエラーになります。サンプルでは、MainWindowクラスの`Loaded`イベント内でフックを実行しています。

```xml:WindowHookSample.xaml

<Window x:Class="WindowHookSample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Name="CloseButton" Content="Close" VerticalAlignment="Center" HorizontalAlignment="Center" Width="100" Height="40" />
    </Grid>
</Window>

```

```csharp:WindowHookSample.xaml.cs

using System;
using System.Windows;
using System.Windows.Interop;

namespace WindowHookSample
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        private static readonly int WM_SYSKEYDOWN = 0x0104;
        private static readonly int VK_F4 = 0x73;

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public MainWindow()
        {
            InitializeComponent();

            Loaded += (o, e) =>
            {
                var source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
                source.AddHook(new HwndSourceHook(WndProc));
            };

            CloseButton.Click += (o, e) => { Close(); };
        }

        /// <summary>
        /// ウィンドウプロシージャ
        /// </summary>
        /// <param name="hwnd">IntPtr : ウィンドウハンドル</param>
        /// <param name="msg">int : メッセージ</param>
        /// <param name="wParam">IntPtr : パラメータ</param>
        /// <param name="lParam">IntPtr : パラメータ</param>
        /// <param name="handled">ref book : ハンドルフラグ</param>
        /// <returns>IntPtr</returns>
        private static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            // ALT+F4キーを無効化する
            if ((msg == WM_SYSKEYDOWN) && (wParam.ToInt32() == VK_F4))
                handled = true;
            return IntPtr.Zero;
        }
    }
}

```