OmniAICreator/Qiita-1.07M huggingface dataset:
Dart で 正規表現 Engine を作成する (2) Parserの作成


前回の続きです。(http://qiita.com/kyorohiro/items/cbd2617a979a31efb3ba)

# 前回のおさらい
## VM部分を作成した
前回はVM部分を作成しました。今回は、Parser部分を作成します。

### 対象は最小限の正規表現
対象の演算子は以下の通り

``` text:今回対象としている演算子は以下の通り
ab|xy abまたはxyにマッチする。 
(ab) abをひとつのパターンとする。
a* aを0回以上繰り返す。 
```
### 対象はOPコードに落とすVM型エンジン
以下ようなOPコードに落とす事ができる

```test:regexopcode
char C 文字がCでなければ、タスクを終了する
match パターンマッチに成功した。
jmp x 次に実行する命令の位置を、x番目に移動する。
split x,y 次に実行する位置を、x番目に移動する。y番目から始まるタスクを生成する。
```

# Parseして、ソースをOPコードへ落とそう

少しずつ、正規表現をOPコードへ変換していきます。難解な作業に思えますが、ソースから一気にOPコードに変換するのではなくて、段階を踏むことで簡単にOPコードへ落とすことができます。

### Tokenに分割する
まずは、演算子とそれ以外の文字に分割しましょう。Tokenに分割するといいます。
Token とは、ソースコードを構成する最小単位の事です。今回の場合だと、"(", ")" "|" "*" それ以外の文字列に分割します。
ref(http://ja.wikipedia.org/wiki/字句解析)

今回作成したものでは、5種類の単位に分割しています。

```text:token
RParanToken "("の場合
LParanToken ")"の場合
UnionToken "|"の場合
StarToken "*"の場合
CharToken それ以外の文字
```

例えば、"ab*"の場合、[CharToken(a) CharToken(b) StarToken]と変換します。


### 木構造にしてから、OPコードに落とす
生成したTokenからOPコードを直接生成する事もできます。しかし、そのまま変換するとちょっとだけコード複雑になる場合があります。
そこで、伝統的テクニックとして、木構造に落とす方法がとられます。今回作成したパーサーでも、一度木構造に落とす形式にしています。

##### [具体的に見る] 変換が簡単な例
"ab"は、とそのまま変換するだけです。木構造に落とす必要はなさそうです。

```text:xx
1:CharOp(a) 
2:CharOp(b)
3:Match
```

##### [具体的に見る] 変換が困難な例
"ab*"は、どうでしょうか?そのまま変換するだけでは上手く生成できません。"*" 指定された場合、ひとつ前のCharOp(b)の前に、Sprit(3,5)を挿入する必要があります。でも、まだ大丈夫そう。

```test:xx
1: CharOp(a)
2: Sprit(3,5)　<-- 　ここ
3: Char(b)
4: Jump(2)
5: Match
```

"(ab)*"、"(ab|xy)*"　はどうでしょうか?ちょっと面倒ですね。


#### [木構造にする。]
"(ab)*"は以下のような構造と見なしてから展開すると簡単に描けます。
[star [Char(a), Char(b)]]

```test:xx
1: Sprit(2,5)
2: Char(a)
3: Char(b)
4: Jump(1)
5: Match
```

左から順番にOPコードに展開しただけです。このように、一度、木構造に通すと事で、OPコードへの展開が楽になるわけです。

例えば、"(ab|xy)*"は､[star　[ Union [[Char(a)Char(b)] [[Char(x)Char(y)]]]] といった感じに書けます。


### 実装
以下に私が実装したものおきました。
https://github.com/kyorohiro/dart_hetimaregex/tree/master/lib/src/parser

## 次回
当初の目的であった、正規表現の枠を超えて、色々なパターンマッチをしてみます。
正規表現(文字列)からパターンマッチするのは止めて、直接、木構造を生成するなどして、より柔軟にパターンマッチをしていきます。
where(nil) で scoped (rails4 なら all) が得られる

# 条件を指定せずに、 `ActiveRecord::Relation` が欲しいとき

条件なし、つまりすべての ActiveRecord インスタンスを得るリレーションを得たい場合に Rails3 自体は `scoped` を使っていましたが Rails4 ではそのかわりに `all` を使うことになります。

```rb
Foo.scoped # for rails3
Foo.all    # for rails4
```

なお、 Rails4 では `scoped` がなくなったために、 Rails3 から Rails4 へバージョン更新する場合はひたすら `scoped` を `all` に変えることになります。
しかし、 Rails3 の環境で `scoped` を `all` に変えるとちょっと意味が変わってくる（返り値が `ActiveRecord::Relation` or `Array`）ので、移行途中のフェーズで全置換するのはちょっとマズイことになります。

# Rails のバージョンで分岐させて両対応

```rb
(Rails::VERSION::MAJOR <= 3 ? Foo.scoped : Foo.all)
```

Rails のバージョンによって `scoped` を使うのか `all` を使うのかを切り替えています。
移行し終わったら、該当箇所を全て `Foo.all` に変えれば良いです。

# もっと短く両対応

```rb
Foo.where(nil)
```

`where` に対して `nil` あるいは `false` を与えれば同じことになります。 `where(nil)` は Rails3 でも Rails4 でも先の意図通りの挙動をするので便利です。

なお

```rb
Foo.where("1 = 1")
```

と、常に真となる条件を与えても効果としては同じですが、
この場合はもちろん実際に DB に投げる SQL にも `"1 = 1"` がのっかってくることになります。
Pythonで単精度浮動小数点を読み書きする

Pythonは言語仕様として単精度浮動小数点をサポートしていないようですが、スクリプトの連携先となるハードウェアの設定値を単精度不動小数点で入出力しなければならなかったので、 NumPy を通してコンバートすることにしました。

とりあえず自分が忘れないようにメモ。

# おまじない

NumPy を使うので

`import numpy`

# float32 の値を入力する

文字列 s に入っている各4バイトのfloat32値（合計12バイト）を変数に代入する

`nums = numpy.fromstring(s, dtype=float32, count=3)
self.param1 = nums[0]
self.param2 = nums[1]
self.param3 = nums[2]`

# float32 の値を出力する

変数に入っている値を float32 値（各4バイト） 3から、合計12バイトのバイト列を出力する

`params = numpy.array([self.param1, self.param2, self.param3], dtype=float32)
return params.tostring()`
Sublime Text - Font Awesome（ version 4.3 版 ） のタグを snippet 化して楽に入力する

## <i class="fa fa-cubes" style="font-size:1em;"></i> 概要
Sublime Text で **Font Awesome（ version 4.3 版 ） のタグを楽に入力する**ために、 **snippet を作成** します。
以前、Font Awesome（ version 4.2 版 ）として公開した情報をベースに説明します。

<i class="fa fa-external-link" style="font-size:1em;"></i> [Sublime Text | Font Awesome のタグを snippet 化して楽に入力する](http://qiita.com/tbpgr/items/24dae69a1884d1a54daa)
## <i class="fa fa-terminal" style="font-size:1em;"></i> Snippet 生成スクリプト
version 4.2 用に作成したスクリプトをそのまま利用できます。

<i class="fa fa-external-link-square" style="font-size:1em;"></i> [Snippet 生成スクリプト](http://qiita.com/tbpgr/items/24dae69a1884d1a54daa#-snippet-%E7%94%9F%E6%88%90%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88)

ただし、サンプル確認用の HTML 出力処理については、 FontAwesome の stylesheet 用の URL
を `4.2` から `4.3` に変更する必要があります。
### <i class="fa fa-phone" style="font-size:1em;"></i> 修正前
~~~ruby
# 略
<link href="http://maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">
# 略
~~~

### <i class="fa fa-mobile-phone" style="font-size:1em;"></i> 修正後
~~~ruby
# 略
<link href="http://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css" rel="stylesheet">
# 略
~~~

### <i class="fa fa-file-text" style="font-size:1em;"></i> 出力結果の Snippet
* 出力結果は下記の GitHub リポジトリにあります
    * <i class="fa fa-github-square" style="font-size:1em;"></i> [Subilme Text Font Awesome Snippets - 4.3.0 branch - GitHub](https://github.com/tbpgr/fontawesome_snippets/tree/4.3.0)

* Font Awesome Samples
    * [FontAwesome Icons demo](http://bl.ocks.org/tbpgr/2168c192563f81f8d33f)

## <i class="fa fa-rocket" style="font-size:1em;"></i> Snippet を使ってみる
### デモ
![snippet_demo.gif](https://qiita-image-store.s3.amazonaws.com/0/43480/0863ae2a-9694-b474-57dd-240afbbdcca0.gif)

### デモで作成した Markdown をプレビュー
![snippet_capture.png](https://qiita-image-store.s3.amazonaws.com/0/43480/c980cd88-0bc6-1eb0-b3be-a2180781ed8c.png)

## :memo: 備考
* 公式ドキュメントをスクレイピングして Snippet を生成しているため、公式ドキュメントの HTML の構造が変わると動作しなくなります

## <i class="fa fa-arrow-circle-right" style="font-size:1em;"></i> 参照
* <i class="fa fa-external-link-square" style="font-size:1em;"></i> [Sublime Text | Font Awesome のタグを snippet 化して楽に入力する](http://qiita.com/tbpgr/items/24dae69a1884d1a54daa#-snippet-%E7%94%9F%E6%88%90%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88)
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Font-Awesome の Web サイト](http://fortawesome.github.io/Font-Awesome/icons/)
* <i class="fa fa-github-square" style="font-size:1em;"></i> [Subilme Text Font Awesome Snippets GitHub](https://github.com/tbpgr/fontawesome_snippets)
TypeScript on VisualStudio Code

Buildで発表されたVisualStudio Codeがにわかに盛り上がっているみたいなので、自分のMacbookにインストールしてTypeScriptを試してみた.

## Install

[ここ](https://code.visualstudio.com/Download)から自分のプラットフォームに合わせて選択すべし.

## 使ってみる

### .tsファイルのコード補完
適当にTypeScriptのプロジェクトを"Open"でフォルダとして開く.

おお、ちゃんと [DefinitelyTyped](http://definitelytyped.org/) からとってきた.d.ts使って補完が有効化されている。
![vsc_tscode01.png](https://qiita-image-store.s3.amazonaws.com/0/8808/a36d012d-6901-f927-4c71-b086bfe0144b.png)

### tsconfig.json
tsconfig.jsonに関しても, キーやvalue(`module` の `commonjs` 等)が補完されます。これは便利ですねー。
![vsc_tsconfig01.png](https://qiita-image-store.s3.amazonaws.com/0/8808/8a21c82e-bfc6-8a06-1ebf-24a7e246c87c.png)

この挙動については, VSCの設定ファイルを開くと, 下記の部分にぶつかる. 

```js:DefaultSettings
"json.schema": [
  // 中略
  {
    "fileMatch": [
      "/tsconfig.json"
    ],
    "url": "http://json.schemastore.org/tsconfig"
  }
```

[JSON Schema Store](http://schemastore.org/json/) からSchemaを持ってきて, JSON Schemaを使って補完してるようですね。

`json.schema` には, tsconfig以外にもpackage.jsonやbower.jsonについてのエントリも記載されていたため, これらのファイルでもJSON補完が使えると思われる

## 変数名の置換
VSなので, 適当に変数名選択してF2を押すと, renameされる。
![vsc_tscode02.png](https://qiita-image-store.s3.amazonaws.com/0/8808/b9f631ad-4f5a-7f11-b879-da159a255eab.png)

## 裏の仕組み
VSCにおけるTypeScript関連の機能(補完やジャンプ)はVSCにバンドルされたTSServerが動作していることを`ps`コマンドにて確認.
(TSServerについては, [この記事](http://qiita.com/Quramy/items/c2835bc380c3e822d479)読んでね)

注意として, 現状のTSServerは、tsファイルの編集を開始してから, tsconfigを更新しても、その変更が反映されない。
VSCでもこの現象に引っ掛かることがあって、ソース中でDecoratorsのような機能を使ってから, 「あ、`"target": "es5"` 書かなきゃ」としても、エラーが残り続けた。
VSC自体を再起動したらちゃんと反映される。

## その他
ちなみに, [https://code.visualstudio.com/Docs/nodejs](https://code.visualstudio.com/Docs/nodejs) 等にある通り, TypeScriptでなくても, 通常のNode.jsのコードであっても, `/// <reference path="... />` を使ってTypeScriptライクなcode補完がJavaScript上で出来たりします.
 

## 所感
MSがTypeScriptにTSServer突っ込んできたり, tsconfigのschemaをSchema Storeにcommitしてた辺りから, 相当エディタのマルチプラットフォーム化を見越してる感があったので、今回のbuildで何かくるかな、と思ってたけど、やっぱり完成度高いなー。

TypeScript or JavaScriptのコーディングツールとしては結構好いかも。
rails 一度gitHubにあげたID・パスワード等を履歴から消し、環境ごとに管理する

あまり考えずに作業してgitHubにあげると見られたくない情報まで載せてしまうことになります（公開レポジトリ）。このとき、単にファイルを変更してpushしてもgitHub上の履歴で情報は漏れてしまいます。
ここでは、履歴も含め完全にgitHubから消し去ります。
また、今後は環境ごとに情報を管理し外部から見えないようにします。
＊まだgitHubにあげていない場合は、gitHubから履歴を消去する手間な手順は必要ありません。下記手順1のconfigを導入しgitHubにpushしちゃいましょう。

手順
1. configを導入し、定数を環境ごとに管理出来るようにする。
2. 該当ファイルのバックアップをとり、git管理下から履歴も含め全消去。
3.バックアップファイルも戻し、gitHubにpushする。

#1. configを導入し、定数を環境ごとに管理出来るようにする。
##configをインストール
```:Gemfile
gem 'config'
```
を追加

```
$ bundle install
$ bundle exec rails g config:install
```
でインストール完了！

```:config/settings.local.yml
gmail:
     user_name: 'hogehoge@gmail.com'
     password: 'hogehoge'
```

使い方

```
Settings.gmail[:user_name]
Settings.gmail["user_name"]
Settings[:gmail]["user_name"]
```

config/settings.local.yml は自動的に.gitignoreに設定されるので、pushしてもgitHubには転送されない。そのため外部から情報は見られない。

環境ごとの設定法等詳しくは下記ページを参照
[Railsで定数を環境ごとに管理するrails_config](http://qiita.com/yumiyon/items/32c6afb5e2e5b7ff369e)

##例えば、下記のようなファイルのIDやパスワードを管理したい
```
config/secrets.yml　#secret_key_base
config/initializers/devise.rb　#facebook・twitterログインで使用したApp_key等
config/database.yml　#databaseのuser_name・password
config/environments/development.rb     #deviseメール送信で使用したgmailのID・password
```

#2. 該当ファイルのバックアップをとり、git管理下から履歴も含め全消去。

まず、該当ファイルをバックアップ。

そして、消去。
＊履歴まで全消去なので、一度ブランチをきって試したほうがいいと思います。失敗しても自己責任ですので慎重に。

```
$ git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch 
config/secrets.yml' HEAD
```
のようにすれば
config/secrets.ymlは履歴も含め全消去される。
同様に全てのファイルの履歴を消去。

#3.バックアップファイルも戻し、gitHubにpushする。

あとはバックアップしておいたファイルを戻してきて、addしてcommmitしてpush。
ただし、pushする際、gitHubにも履歴の変更の影響を与えるため

```
$ git push --force origin master(ブランチ名)
```
でpushする。

これで完了。

#参考URL
[Railsで定数を環境ごとに管理するrails_config]
(http://qiita.com/yumiyon/items/32c6afb5e2e5b7ff369e)
[Git の履歴からファイルを完全に削除する – git filter-branch]
(http://easyramble.com/git-filter-branch.html)
SSLの設定について覚書

忘れがちなSSLの設定についてまとめているページをまとめる。

Mozilla SSL Configuration Generator – 各種HTTPサーバでのSSL設定を表示
https://mozilla.github.io/server-side-tls/ssl-config-generator/?1

NginxでSSLの評価をA+にする手順
http://blog.kksg.net/posts/nginx-secure-ssl

Nginx SSL設定
【翻訳】NginxでHTTPS : ゼロから始めてSSLの評価をA+にするまで（Part 1）
http://postd.cc/https-on-nginx-from-zero-to-a-plus-part-1/
【翻訳】NginxでHTTPS : ゼロから始めてSSLの評価をA+にするまで（Part 2）
http://postd.cc/https-on-nginx-from-zero-to-a-plus-part-2-configuration-ciphersuites-and-performance/
Android Studio でaarをローカルから読み込む方法

プロジェクトのライブラリファイル：aarをローカルで読み込む方法
ググって、最初の方に出てくる情報が対象バージョンが古かったのか、誤っていて変にハマってしまったので。

#**うまくいった方法**
1. aarファイルをライブラリを利用するモジュールのlibsディレクトリ配下におく。（ディレクトリは任意ですが、下記の設定はlibsを探す設定）


1. 下記を追記

```groovy:build.gradle
dependencies {
  compile(name:'aarファイル名（拡張子を除く）', ext:'aar')
}
repositories{
  flatDir{
    dirs 'libs'
  }
}
```

#**うまくいかなかった方法**
1. File→New→New Module→import .JAR or .AARで対象ファイルを読み込む

1. モジュールのbundle.gradleに追記

```groovy:build.gradle
dependencies {
  compile project(':aarファイル名')
}
```

クラスは呼び出せないのですが、ディレクトリまでは見られるような変な状態になりました。
変にうまくいったのでライブラリ側が悪いのかとか考えてはまりました。
↓事象はこれと同じ状態。
http://stackoverflow.com/questions/29081429/android-studio-cannot-resolve-symbols-from-imported-aar-module

こちらの原因がわかる方がいれば教えて下さい。
pythonパッケージからdebファイルを作成する


Pythonパッケージからdebファイルを作成する必要があったのでその手順をメモ

### pythonパッケージからdebファイルを作成するツールをインストール

```
#apt-get install python-stdeb
```

　
### debファイル化したい、pythonパッケージのDL

今回は、oslo.db-1.0.2というOpenStackのDB周りの共通コンポーネントをdeb化する

```
$wget https://pypi.python.org/packages/source/o/oslo.db/oslo.db-1.0.2.tar.gz
```

### py2dscの実行

DLしたファイルを引数に py2dsc を実行

```
$py2dsc oslo.db-1.0.2.tar.gz
```

deb_destというフォルダが作成されます

```
$ls
deb_dist  oslo.db-1.0.2.tar.gz
```

deb_dest/oslo.db-1.0.2の下で dpkg-buildpackage を実行

```
$cd deb_dist/oslo-db-1.0.2
$dpkg-buildpackage -rfakeroot -uc -us
$cd ..
$ls
oslo-db-1.0.2  oslo-db_1.0.2-1_amd64.changes  oslo-db_1.0.2-1.debian.tar.gz  oslo-db_1.0.2-1.dsc  oslo-db-1.0.2.orig  oslo-db_1.0.2.orig.tar.gz  python-oslo.db_1.0.2-1_all.deb
```

するとdebファイルが追加されています。

あとは `dpkg -i` でインストールしたりいろいろとご自由に
最近の wiki エンジン事情メモ


Wiki の需要は高いと思うんだけど、セルフホスティング用の wiki エンジンでコレだっていうのが、見つけられない現状。とりあえず、気になったやつだけでもメモしとこう。


# Crowi

* [Crowi](http://site.crowi.wiki/)
* [weseek/crowi-plus: crowi-plus - Enhanced Crowi](https://github.com/weseek/crowi-plus)
* [GROWI\.org \- Markdown で書けるオープンソースの Wiki システム](https://growi.org/)


# Matterwiki

* [Matterwiki - A simple and beautiful wiki for teams](http://matterwiki.com/)


# MDwiki

* [MDwiki - Markdown based wiki done 100% on the client via javascript](http://dynalon.github.io/mdwiki/)

Markdown 形式をファイルをフロントエンドで HTML に変換して wiki 化してくれる wiki エンジン。GitHub Wiki 的な感じの機能はそろってて、結構良いかも。


# Gollum

* [gollum/gollum](https://github.com/gollum/gollum)

元々 GitHub でメンテされた? Git 上に作られた wiki エンジン。Ruby 製。


# Realms

* [scragg0x/realms-wiki](https://github.com/scragg0x/realms-wiki)

Gollum に影響を受けた Python 製 wiki エンジン。テンプレートエンジンが Handlebars だったり、リアルタイムコラボレーション機能あったり、割と先進的。


# JINGO

* [http://jingo.cica.li:6067/wiki/home](https://github.com/claudioc/jingo)
* [デモ](http://jingo.cica.li:6067/wiki/home)

Gollum 互換の Node.js 製 wiki エンジン。


# melkor

* [hiddentao/melkor](https://github.com/hiddentao/melkor)
* [デモ](http://melkor-demo.hiddentao.com/)

Gollum に影響を受けた Node.js 製 wiki エンジン。


# ikiwiki

* [ikiwiki](https://ikiwiki.info/)

Perl 製の wiki エンジン。シンプルかつ Markdown を標準記法として採用しつつ、プラグインも豊富。
ItamaeでGithubからSSH公開鍵を取得する


# はじめに
新しくサーバにユーザを作るとき、メールで公開鍵送ってくれ、なんてことせずGithubからさくっと持ってこれると便利ですよね。

ItamaeでSSH公開鍵をセットするプラグインを公開したので、GithubからSSH公開鍵を持ってくる方法を紹介します。

# Gemfile
SSHの取得には[itamae-plugin-resource-ssh_key](https://github.com/nownabe/itamae-plugin-resource-ssh_key)を使います。

```ruby:Gemfile
source "https://rubygems.org"
gem "itamae-plugin-resource-ssh_key"
```

# レシピ
nownabeというユーザを作って、Githubのnownabeユーザから公開鍵をもってくるにはこんな感じのレシピを作ります。

```ruby:recipe.rb
require "itamae/plugin/resource/ssh_key"

user "nownabe"

ssh_key "nownabe" do
  github_user "nownabe"
end
```
PHP関数：配列内に文字列の重複があるかどうか調べる関数

配列内に重複する値があるかどうか調べる関数が無さそうだったので、作ってみました。

```php
<?php

/**
 * 配列内に重複する値があるかどうか調べる（文字列、数値のみ対応）
 *
 * @param array $array 配列（配列のKeyはチェックされない）
 * @return bool true：重複あり、false：重複なし
 */
function array_same_values($array) {
	foreach (array_count_values($array) as $count) {
		if ($count > 1) {
			return true;
		}
	}
	return false;
}

/* テスト - 重複なし */
$array1 = array('foo', 'bar', 'baz', 'qux');
var_dump(array_same_values($array1)); //false

/* テスト - 重複あり */
$array2 = array('foo', 'bar', 'baz', 'foo');
var_dump(array_same_values($array2)); // true

/* テスト - 重複あり（'123'と123は重複とみなされる) */
$array3 = array('foo', 'bar', 'baz', 'qux', '123', 123);
var_dump(array_same_values($array3)); // true

```

こんな感じですかね。
関数名は、PHPの関数一覧を見ながら似たような感じの名前にしてみました。

## 改良版（2015/05/01 コメントより）
コメントでいただいたコードです。これでもいけるそうです！

```php
/**
 * 配列内に重複する値があるかどうか調べる（文字列、数値のみ対応）
 *
 * @param array $array 配列（配列のKeyはチェックされない）
 * @return bool true：重複あり、false：重複なし
 */
function array_same_values($array) {
    return array_unique($array) !== $array;
}
```

PHPなので当然かもしれませんが、例えば数字の`"1"`と数値の`1`は基本的に同じとみなされるようなので注意です。

## 関数リンク
* [array_count_values()](http://www.php.net/manual/ja/function.array-count-values.php)：配列の要素の出現回数を値とした配列を生成して返します。（文字列、数値のみ）
* [array_unique()](http://php.net/manual/ja/function.array-unique.php)：配列から重複した値を削除する
wkhtmltopdfに感動した

http://wkhtmltopdf.org/

コマンドラインでURLを指定するとPDF化し保存。
pdfをメールで送りつけるとか便利そう

# pdf化

```bash:
wkhtmltopdf http://yahoo.co.jp yahoo.pdf
```

## インストール

```bash:
sudo apt install wkhtmltopdf
```

# 画像化もできる


```bash:
wkhtmltoimage http://yahoo.co.jp yahoo.jpg
```


## docker image (PDF)

https://github.com/michaelperrin/docker-wkhtmltopdf/blob/master/Dockerfile

```Dockerfile:Dockerfile
FROM debian:buster

RUN apt-get update \
    && apt-get install -y \
        curl \
        libxrender1 \
        libjpeg62-turbo \
        fontconfig \
        libxtst6 \
        xfonts-75dpi \
        xfonts-base \
        xz-utils

RUN curl "https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.buster_amd64.deb" -L -o "wkhtmltopdf.deb"
RUN dpkg -i wkhtmltopdf.deb

RUN apt-get install -y \
        fonts-ipafont

ENTRYPOINT ["wkhtmltopdf"]
```


```sh:動作確認(PDF)
docker run --rm -v `pwd`:/data michaelperrin/wkhtmltopdf \
    --viewport-size 1024x2048 \
    --page-size A4 \
    https://yahoo.co.jp \
    /data/test.pdf
```

## docker image (png)

```Dockerfile:Dockerfile
FROM debian:buster

RUN apt-get update \
    && apt-get install -y \
        curl \
        libxrender1 \
        libjpeg62-turbo \
        fontconfig \
        libxtst6 \
        xfonts-75dpi \
        xfonts-base \
        xz-utils

RUN curl "https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.buster_amd64.deb" -L -o "wkhtmltopdf.deb"
RUN dpkg -i wkhtmltopdf.deb

RUN apt-get install -y \
        fonts-ipafont

CMD ["wkhtmltoimage"]
```

```sh
docker build . -t local/wkhtmltoimage
```

```sh:動作確認(png)
docker run --rm -v `pwd`:/data local/wkhtmltoimage \
    wkhtmltoimage \
    -f png \
    https://yahoo.co.jp \
    /data/test.png
```

横幅 1240px で生成される。
Responsive Web Designメモ（移行、数値の計算方法など）

半年以上前にアメリカのe-learningで学習しながら作成した「Responsive Web Design」の学習メモです。この記事もやや古くなったので、最後に補足事項を記載しました。

従来のデザインからレスポンシブ・ウェブデザインへ移行するための参考資料として作成しました。若干殴り書きもありますが、公開しちゃいます。

# Responsive Web Designとは - 従来のデザインと比較する

下へ行くほど柔軟に変化するレイアウトとなる。

Grid layout : どのデバイスでも同じようなデザインにする
→ Fluid layout : デバイス(ウィンドウ)の幅に合わせて伸縮するデザイン
→ → Adaptive layout : media queryを使い、ターゲットデバイスに合わせてデザインする
→ → → Responsive layout : media queryを使い、ターゲットデバイスを決めるのではなく、様々な環境に適用させる)

# 関連するリンク集＆テクニック
## 画像サイズを可変にする(Fluid layout)

```css
img {
  /* ボックス幅に合わせて拡大される。ただしIE6以下には非対応 */
  max-width: 100%;
}
```

```css
/* IE6以下専用のCSSで以下のようにボックスとwidthを指定する */
.main img {
  width: 100%;
}
```

```html:IE専用CSSの定義
<!--[if IE]>
  <link href="{{ asset_url }}" media="screen, projection" rel="stylesheet" type="text/css" />
<![endif]-->
```

## 幅をパーセントで指定する

### ピクセルをパーセントに書き換える方程式

```
target ÷ context ＝ result
```

### 書き換える例
親ブロック width: 1000px
子ブロック width: 400px
↓↓↓
方程式に当てはめる
400 ÷ 1000 = 0.4 = 40%
↓↓↓
親ブロック width: 1000px
子ブロック width: 40%

親ブロックのwidthを変更すれば、子ブロックの幅も同じ割合で変化するようになる

## 幅固定のレイアウトからFluid layoutへCSSを書き換える

### 変更前の幅固定の状態

```css:変更前
.container {
  width: 1000px;
}
```

### 幅を％指定に変更し、最大幅に元の値を入れる。外の余白をautoにする

```css:変更後
.container {
  width: 90%;
  max-width: 1000px;
  margin: auto;
}

/* 子のボックスもem指定にする */
.container .box1 {
  /*  width: 300px;   ← 修正前 */
  width: 30%;     /* ← 修正後 */

  /* 300 ÷ 1000 ＝ 0.3 ＝ 30% */
}

.container .box1 .box1-1 {
  /* width 120px;    ← 修正前 */
  width: 40%;    /* ← 修正後 */

  /* 120 ÷ 300 ＝ 0.4 ＝ 40% */
  /* 直近の親のボックスに対する割合である点に注意する */
}
```

### フォントサイズもpxからemに書き換える

```css
/* 修正前 */
/*
body { font-size: 16px; }
h1   { font-size: 24px; }
p    { font-size: 12px; }
*/

/* 修正後 */
body { font-size: 16px; }
h1   { font-size: 1.5em; } /* 24px ÷ 16px ＝ 1.5em */
p    { font-size: 0.75em; } /* 12px ÷ 16px ＝ 0.75em */

```

※remという単位について、最後に追記しました

## iPhoneなどのデバイスにおける自動的な縮小を避ける

```
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
```

## リンク集（ほぼ英語、未整理）

30 Useful Responsive Web Design Tutorials
http://www.hongkiat.com/blog/responsive-web-tutorials/

Quirktools | Screenfly - デザイン確認ツール。
http://quirktools.com/screenfly/

Adobe Inspect - デザイン確認ツール。 元はAdobe Shadowという名前だったらしい。
http://html.adobe.com/edge/inspect/

brad frost web
http://bradfrostweb.com/

picturefill - 複数サイズの画像を提供する
http://scottjehl.github.io/picturefill/
https://github.com/scottjehl/picturefill

Adaptive Images - 複数サイズの画像を提供する
http://adaptive-images.com/

FitText.js - 文字サイズをウィンドウ幅に応じてフィットさせる
http://fittextjs.com/

FitVid.js - ビデオをウィンドウ幅に応じてフィットさせる
http://fitvidsjs.com/

# 2015/04/30追記
半年ぶりに振り返ってみました。デザイン確認ツールなど変わってきているような気がします。

## 今風のデザイン確認ツール
 * Google Chromeのデバッグ機能から確認デバイスを選択
 * [Googleモバイルフレンドリーテスト](https://www.google.com/webmasters/tools/mobile-friendly/?hl=ja)

## タッチ可能な領域のサイズを約44ｘ44ポイント以上にする
[モバイルアプリの最小タップサイズを考える](http://www.dotproof.jp/2013/08/06/minimum-tap-size/)
> iOSの「ヒューマンユーザーインターフェースガイドライン」では「タッチ可能な領域のサイズを約44ｘ44ポイントにしなさい」
とのこと。

## emの代わりにremを使う
レガシーブラウザのサポートなど課題があるようですが、remという単位を使うという選択もあるようです。

* [あなたが知らないかもしれないCSSの7つの単位について](http://moonglows76.tumblr.com/post/103016608753/css-7)
CentOS 7のネットワーク名「enp1s0」という文字列の謎に迫る

CentOS 7をインストールして謎だったことの一つとして、ネットワーク名が今までの「eth0」みたいなやつから、「enp1s0」みたいな謎の文字列に変わった事がある。

気になったので調べてみた。

## ネットワーク名は新しい命名規則に沿って自動的に作られる

調べていると、以下のブログに丁寧に説明が書いてあった。

[Predictable Network Interface Names](http://www.freedesktop.org/wiki/Software/systemd/PredictableNetworkInterfaceNames/)

ざっくり訳すと以下の通り

v197のsystemd/udevでは自動的に安定的なネットワークインターフェース名を割り当てる。
ローカルエリアネットワークに限らず、WLANやWWANに対しても割り当てる。
伝統的な ("eth0", "eth1", "wlan0", ...)といった命名規則はもうしない。

新しい命名規則では以下の嬉しい事がある。

* OSが再起動してもインターフェース名が変わらない
* ハードウェアを追加したり外したりしてもインターフェース名が変わらない
* カーネルやドライバをアップデートしても変わらない
* NICが壊れて取り変えてもインターフェース名は変わらない
* インターフェース名は自動的に付けられてそのまま動く
* インターフェース名は命名規則に沿っているので完全に予測できる
* などなど

## では「enp1s0」は何を意味するのか？

これはsystemdの中にネットワーク名を命名するソースコードがあり、そこを見ればわかる。
ソースコードは[ココ](http://cgit.freedesktop.org/systemd/systemd/tree/src/udev/udev-builtin-net_id.c#n20)

この中に以下のコメントがある

```
 * Two character prefixes based on the type of interface:
 *   en -- ethernet
 *   sl -- serial line IP (slip)
 *   wl -- wlan
 *   ww -- wwan
 *
 * Type of names:
 *   b<number>                             -- BCMA bus core number
 *   ccw<name>                             -- CCW bus group name
 *   o<index>[d<dev_port>]                 -- on-board device index number
 *   s<slot>[f<function>][d<dev_port>]     -- hotplug slot index number
 *   x<MAC>                                -- MAC address
 *   [P<domain>]p<bus>s<slot>[f<function>][d<dev_port>]
 *                                         -- PCI geographical location
 *   [P<domain>]p<bus>s<slot>[f<function>][u<port>][..][c<config>][i<interface>]
 *                                         -- USB port number chain
 
```

これに従うと、「enp1s0」は以下の意味であるとよみとれる。

* 「en」は「イーサーネット」
* 「p1」は「1番目のバス」
* 「s0」は「0番目のスロット」


なーるほど。

そもそも、切れ目すら知らずに「enp」ってなんだろうって思ってたよｗ

すっきり！
PayPalの定期支払いの失敗理由について

自分が把握している限りの定期支払いが失敗する理由は以下ですが、
ほかに考えられる理由はありますか？

1.利用限度額等による残高不足の場合
2.クレジットカードの有効期限切れの場合
3.クレジットカードの利用停止が行われた場合
4.何らかの理由によりクレジットカードの失効が行われた場合

また実際にどのような理由により継続課金に失敗したかを調べることって出来るのですかね？
[Ruby基礎学習] モードの検索

# はじめに
次章1つ目。

# 問題

```
ある値の集合のなかで、最も頻繁に登場する値のことを統計では「モード」と呼ぶ。
調査データの配列を処理するコードを書いてみよう。
調査対象が質問に1〜10のいずれかの数値でこたえているので、そこからモードを求めたい。
モードが複数存在する場合は、いずれかの値を選択する。
```

# 解答

テストデータ。

```rb
array1 = [1,2,1,1,1,3,5,7,9,10,1,1,4,5,2,2,2,3,2,4,2,7,2]
array2 = [2,5,4,3,2,1,6,8]
array3 = [7,5,7,7,8,9,1,1,3,10,2,6,8]
```



```rb
def check_mode(array)
	sorted_array = array.sort
	current_num = nil
	mode = nil
	max_count = 0
	count = 1 

	sorted_array.each do |i|
		if current_num != i
			if max_count < count
				max_count = count
				mode = current_num
			end
			current_num = i
			count = 1
		else
			count += 1
		end
	end

	mode
end
```

答えは合ってる。

```rb
puts check_mode(array1)
=> 2

puts check_mode(array2)
=> 2

puts check_mode(array3)
=> 7
```

でももっとシンプルにする方法はあるんだろうな、いくらなんでもこれは無いな…と思った。
なので調べた。
調べてみたらこんなやり方もあるって書いてあった。

```rb
array1.group_by {  |e| e }.sort_by {  |e, v| -v.size }.map(&:first).first
```

```rb
array1.max_by{ |a| array1.count(a) }
```

なんだかよくわからなかったので調べる。
1個ずつバラバラに動かしてみる。
バラすとどうなってるのかよく分かる。
なるほどー。


```rb
p array1.group_by{ |e| e }
=> {1=>[1, 1, 1, 1, 1, 1], 2=>[2, 2, 2, 2, 2, 2, 2], 3=>[3, 3], 5=>[5, 5], 7=>[7, 7], 9=>[9], 10=>[10], 4=>[4, 4]}
```

```rb
p array1.group_by{ |e| e }.sort_by{ |e, v| -v.size }
=> [[2, [2, 2, 2, 2, 2, 2, 2]], [1, [1, 1, 1, 1, 1, 1]], [7, [7, 7]], [5, [5, 5]], [3, [3, 3]], [4, [4, 4]], [10, [10]], [9, [9]]]
```

```rb
p array1.group_by{ |e| e }.sort_by{ |e, v| -v.size }.map(&:first)
=> [2, 1, 7, 5, 3, 4, 10, 9]
```

```rb
p array1.group_by{ |e| e }.sort_by{ |e, v| -v.size }.map(&:first).first
=> 2
```

2つ目の方も。
`array1.count(e)`の結果が最大のものが返ってくる。
シンプル。とてもシンプル。

```rb
p array1.max_by{ |e| e }
=> 10
```

```rb
p array1.count(1)
=> 6
```

```rb
p array1.max_by{ |e| array1.count(e) }
=> 2
```

便利なのいっぱい。
パッと使えるようになれるようがんばろう。

# 問題の出典

* プログラマの考え方がおもしろいほど身につく本　問題解決能力を鍛えよう！

# 参考サイト

* [*Ruby - 配列内で要素数が最多のものを求める！*](http://www.mk-mode.com/nanoc/2014/11/17/ruby-select-most-item-from-array/)
* [*rubyで配列の要素の最大値と最小値を取得*](http://simanman.hatenablog.com/entry/2013/03/17/165042)
一般ユーザでsudoが実行できない場合

##CentOS6.6で確認済み

VirtualBoxにCentOS6.6を入れてsudoしたときの話。いつものようにsudo yumでパッケージをインストールしようとしたら、エラーが出た。

$ sudo hoge
$ sudoers ファイル内にありません。この事象は記録・報告されます。

このようなエラーが表示されたら以下の手順を実行。

1. $ su (管理者権限に切り替え)
2. # visudo (sudo設定ファイルの記述を書き換え)
3. visudoの中身

```visudo
Allows people in group wheel to run all commands 
%wheel  ALL=(ALL)  ALL (ここの行頭のコメントをはずす)
```

4. # usermod -G wheel username (ユーザをwheelグループに追加)
5. # su username (ユーザ切り替え)
6. $ sudo huga (確認する)

以上。
(※：Debian系のapt-getと記載していましたが、RedHat系のyumの間違えです)
FFmpegことはじめ

# FFmpegとは
すっげぇ統合的でクラスプラットフォームで動作する動画・音声を扱うツール
動画からサムネイルを作成するときにも使える
動画や音声を切り分けたり、逆に結合してやったりできる。

# こんな人向け
* FFmpeg使いたいけどよく分からない人(全部読んで)
* 動画を撮影したもののサイズが大きいのでアップロードできない！！品質をある程度確保しつつ、ファイルサイズをなるべく抑えたい人(映像オプションへGO)
* インターネット上のファイルをインプットにできることを知らない人(httpインプットへGO)

# インストール
とりあえずMacのhomebrewでのインストール方法、個人的にはlibfaacとlibx264が入っていれば最低限の動作はすると思っている。
実際には他にもオプション付けまくってインストールしているから下記のサンプルで動かなかったらごめんなさい

```bash
$ brew install ffmpeg --with-faac --with-fdk-aac --enable-libx264 --enable-libxvid
```

他の環境の人はビルドするのが吉だと思いますが、下記２点をインストールした状態で--enable-faacと--enable-libx264オプションを付けてビルドするのかな。

* x264
* faac

# 基本

```bash
$ ffmpeg -y -i input.mov -f mp4 output.mp4
```

基本形、mp4にフォーマットしてエンコードする
原則いろいろなオプションを組み合わせる事ができるのでいろいろ例とともにいろいろ試してみて
ただし、後述のビデオビットレートと映像品質など併用できないオプションも存在する

* i - インプットファイル
* f - フォーマット、mp4とかflvとか
* y - 強制上書きオプション

# 映像オプション

```bash
$ ffmpeg -i  input.mp4 -vcodec libx264 -b:v 5000k -r 24 output.mp4 
```

ビデオコーデックやビットレートを決めています

* vcodec - ビデオコーデック
* b:v - ビデオビットレート、ケツに単位を付与できるようです
* r - fps、１秒間のフレーム数

# 音声オプション

```bash
$ ffmpeg -i input.mp4 -acodec libfaac -b:a 256k -ar 44100 output.mp4
```

* acodec - オーディオコーデック
* b:a - オーディオビットレート、同じくケツに単位を付与できるようです
* ar - サンプリングレート・サンプル周波数、44100か48000が一般的

# 品質オプション

```bash
$ ffmpeg -i input.mp4 -crf 20 output.mp4
```

* crf - 映像品質、20前後を境に明らかな劣化が分かる。**値が低いほど品質が高い**ので注意

# サムネイル切り抜き

```bash
$ ffmpeg -ss 20.5 -i input.mp4 -vframes 1 -vf select='eq(pict_type\,I)' -s 320x180 out.jpg
```

* ss - 開始時間、iオプションの前に指定しないと全編エンコード後に開始時間を探しにいくのでほとんどの場合はiオプションの前に置くものと考えて良い。単位は秒
* vframes - 何フレーム分か
* s - サイズ指定、[幅]x[高さ]とスペースを入れずに指定する。xは小文字のエックス
* vf - ビデオフィルター、使い道はいろいろありますが上述での使い方ではキーフレームを切り出すことになる

キーフレームとは連続するフレームの中で、ガバッと画面が変わっているフレームのこと。動画ファイルはあまり映像に動きの無いところは直前のキーフレームとの差分を記録することで容量を圧縮しているとかしていないとか。

```bash
$ ffmpeg -ss 10 -i input.mp4 -r 8 -vframes 20 %02d.jpg
```

開始時間10秒から20フレーム切り取る、なお１秒間に８フレームとして切り抜くのでちょうど2.5秒分のサムネイルとなると思う。outputでは連番フォーマットを指定し、01~20.jpgが作成される。

# http[s]インプット

```bash
$ ffmpeg -ss 20 -i http://anyfile.com/sample.mp4 -vframes 1 out.jpg
```

> httpのパスは架空です


インターネット上のファイルを直接インプットに指定出来る。しかもファイルはすべてダウンロードされずに高速。指定秒数でエンコードや画像切り取りを行う場合はcurlでダウンロードしてFFmpegをパイプするより明らかに高速。
1GBとかのファイルでも目的の箇所のみをダウンロードしているようでサムネイル切り取りなら1秒もかからない。
以前httpsは扱えないようなことを書いていましたが、SSLを扱えるようにFFmpegをビルドすれば扱えました。申し訳ないです。

# 2pass

```bash
$ ffmpeg -i input.mp4 -pass 1 -an output.mp4 && \
  ffmpeg -i input.mp4 -pass 2 -b:a 256k -y output.mp4
```

* an - 音声なし、2passの一回めでは解析を行うだけなので音声情報は圧倒的に不要のため
* pass - 2を指定した場合、1回めの解析情報を元にエンコードを行う。動きの少ない部分のビットレートを落とすなどしているのかと思う。1pass(通常のエンコード)に比べてファイルサイズを落としつつ、品質を保つ事ができる。ただし**エンコード時間が２倍とまでいかないものの増える**
「DevLOVE甲子園勝手にプレイバックver.西 + α」参加したよ

https://devlove-hiroshima.doorkeeper.jp/events/23225?utm_campaign=event_23225&utm_medium=email&utm_source=ticket

主催の石崎さんが、新人時代の同い年のプロパーさん。
昔から積極的な人だったなーっと。石崎さんの影響を受けて今の自分があるのかもねー。

遅刻したので、２番からの参加。

## ２番打者　技術的負債返しますか？それとも開発辞めますか？

参加しているチームを冷静に観察する必要があるなっと思った。
打ち合わせ／議論が多いのは、確かに未成熟なチームだね。自信がないと意見がまとまらないしね。

業務知識不足でデータ変換が多いっというのは、作業するときに設計者と実装者に上下関係があると、発生しやすいのではないかと思った。気づいても直さない（直せない）っという感じかな。
実装者からの Feedback をうまく受け取りたいし、設計者、実装者という切り分けも不要なのかも。

議論する時間を設ける。っという案は真似したい。
「１H、担当持ち回りで、１つことのみにたいして議論する。」
そうやって、一歩ずつ前に進むのが近道なのかもね。

「技術的負債は、技術の問題ではなく状況の問題。」だったかな。良い言葉だな。


## ３番打者 もしも中堅SEがスクラムをやってみたら

実際のプロジェクトでの感想が聞けてたのが良かった。

残業なく、降ってくる案件をこなしても、目的違ってたら意味がないよね。
ずっと同じメンバーでやってたら、そうなっちゃいそう。

外から見ると気付きやすくなるのかな。

自立と自律。うーん、、、難しいね。


## ４番打者 エンジニアコミュニティに関する何か

「石のスープを作ろう」知らなかった。面白い。実践したい！！

http://ja.wikipedia.org/wiki/%E7%9F%B3%E3%81%AE%E3%82%B9%E3%83%BC%E3%83%97

* 吹いた
* さくっと最初のスープを作った
* スープを少しずつ美味しくする方法を知ってた
* 結果的にみんなに分け与えた。

アプリを少しずつ美味しくする方法を考えて、少しずつ協力してもらえるようにしたい！！
今、一番自分が悩んでいることにマッチしている内容だったと思った！！


## ５番打者 オープンセミナー

広島３大イベント

* DevLOVE xの陣
* オープンソースカンファレンス
* オープンセミナー広島

広島もたくさんのイベントがあるから、今後も参加して、盛り上がりに貢献したい。


## ６番打者 コミュニティからwhileを回そう

こんな感じだったかな。応用が効きそうな感じ。真似しようかな。

```js
while (engineer.motivation() > 0) {
   feedback = action();
   engineer.improve(feedback);
}
```

続ける難しさっというを理解しているつもりです（なにやっても続かないので）。
モチベーションを維持することの大切さもわかってるつもりです。
あまり、自分を追い詰めずに負担かけずにしないとねー。
【Android】アスペクト比を指定するとViewのサイズを自動調整してくれるImageViewを作ってみた - AspectRatioImageView

# 概要
アスペクト比を指定しておくと、ImageViewの高さをアスペクト比の値に応じて自動的にリサイズしてくれるViewを作ってみた。

![demo gif](http://i.imgur.com/9jbyzyU.gif)

- Github
 - https://github.com/chuross/AspectRatioImageView
- Youtube
 - https://www.youtube.com/watch?v=Mzf7YqLeWEQ


# 経緯
このライブラリを作るに至った経緯はこんな感じ

- Picassoを使っていて、`fit`を利用して画像をロードしたい
- GridViewにnumColumnsを指定し、ImageViewは縦横比固定で幅・高さを可変させたい。

この状況の時に僕が困っていた事が以下の二点

- 幅はMATCH_PARENTで指定するんだけど、高さはWRAP_CONTENTで指定する必要がある(ImageViewの下に他のViewを置きたい)
- 高さをWRAP_CONTENTで指定した後、Picassoに`fit`で画像読み込みさせた時に高さが0の状態で処理されて画像が表示されないので何とかする必要があった
- アスペクト比が決まっているのなら、それベースでViewの領域を自動調整させれば良いのでは！という感じで作ることにした


# 使い方
## Gradleの依存関係にAspectRatioImageViewを追加

```groovy
repositories {
    maven { url 'https://jitpack.io' }
}

dependencies {
    compile 'com.github.chuross:aspect-ratio-imageview:v1.0.2'
}
```

GithubPageの個人maven-repositoryに上げてあるので、repositoriesへの追加も忘れずに

## XMLのレイアウトに記述する

```xml
<dev.chuross.library.AspectRatioImageView
    android:id="@+id/img_aspect_image_8"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:ariv_widthRatio="16"
    app:ariv_heightRatio="9" />
``` 

この例の場合はImageViewを16:9で高さを自動リサイズする

# ライセンス
Apache License 2.0

# その他色々
- 中身はonMeasureで色々計算させてるだけなのでImageView意外にも使えそう
- 似たようなコンセプトのライブラリは既にあったが、こちらはオリジナルサイズによる調整をしてくれるっぽい
 - https://github.com/jwkelso/AspectRatioImageView
- プレースホルダ使うとか他にもやり方はありそう
さんじゃらっと mac のコンソールからクリップボードにコピー

macでコンソールから大きなファイルをコピペしたい時ありますよね。

ドラッグして反転するのも大変

そんなときは

`cat ****.txt | pbcopy`

これで解決

`ls | pbcopy`

とかもできるよ
WPFアプリ、テキストボックスの右クリックを断つ


リソースに以下を追加する。
※多分App.xamlでも良い。

```MainWindow.xaml
<Window.Resources>
    <ResourceDictionary>
        <Style TargetType="ContextMenu">
            <Setter Property="ContextMenu.Visibility" Value="Hidden" />
        </Style>
    </ResourceDictionary>
</Window.Resources>
```

解説すると、コンテキストメニューはデフォでは”Hideen”だよ！
ってしてる。タイトル詐欺で、他のとこも多分消える。
テキストボックスに絞るならTargetTypeをTextBoxにしすればええんでね？

本件とずれるけど、スタイルを複数持ちたい場合は以下のような記述になる。

```MainWindow.xaml
<Window.Resources>
    <ResourceDictionary >
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Dictionary1.xaml" />
            <ResourceDictionary>
                <Style TargetType="ContextMenu">
                    <Setter Property="ContextMenu.Visibility" Value="Hidden" />
                </Style>
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>
```

WPFで作ってて、かゆいところに手を出そうとすると結構しんどい。
今回の場合\<ResourceDictionary.MergedDictionaries\>について、どうやって調べたら効率的に見つけられるのかが分からない。
個人的にはインテリセンスが出てきてくれるとうれしいけど
表記の性質からどのタイミングでその予測プロパティを出すのかってな問題になりそう。
MSDNとにらめっこしかないのかなー？

その辺はRoRとかも一緒か・・・・・・
Dockerで作った開発環境で開発する

# 動機

ghcmod-vimが普通にインストールするとなぜかエラーが出て動かなかった。
Dockerできれいな環境を用意してあげると動いたので、Dockerで作った環境の中で開発してる。
cabalで間違えてグローバルにインストールしてもすぐに戻せるし、可搬性も上がるので良いかもしれない。

GUIなエディタを使っている場合はコンテナ内で使えない(?)ので、外でコード書いて中で動かすことになる。

以下、Haskellについて知らなくても問題ないです。

# 準備

```docker exec```を使うのでdocker1.3以上を使ってください。
「apt-getで入れたいけど、バージョンが古い」という方は[Ubuntu 14.04 へ Docker のインストール - 作業ノート]( http://yo1000.hateblo.jp/entry/2015/03/07/230124)を見てください。

# Dockerfile

ベースとなるUbuntuのイメージと、それに載せる言語のイメージを作る。

```Dockerfile
FROM ubuntu:14.04

RUN \
  sed -i 's/# \(.*multiverse$\)/\1/g' /etc/apt/sources.list && \
  apt-get update && \
  apt-get -y upgrade && \
  apt-get install -y build-essential && \
  apt-get install -y software-properties-common && \
#使うものを入れる
  apt-get install -y byobu curl git tig htop man unzip vim wget && \
  rm -rf /var/lib/apt/lists/* && \
# 今回はpiyoというユーザにする
  useradd -m piyo

WORKDIR /home/piyo

ENV HOME /home/piyo
ENV LANG C.UTF-8

USER piyo

CMD ["bash"]
```

やっていることは

* apt-getで普段使うようなもののインストール
* ユーザの作成
* WORKDIRとHOMEの指定
* USERの指定

USERを指定しないとrootでログインすることになるため、書いたコードの所有者がrootになってしまいホストから触るのが面倒になります。

LANGを指定しているのはvimのNERDTree文字化けが起きたため。

ubuntuの上に載せる言語用のDockerfile

```Dockerfile
FROM your_ubuntu

USER root

#RUN \
#  echo 'deb http://ppa.launchpad.net/hvr/ghc/ubuntu trusty main' > /etc/apt/sources.list.d/ghc.list && \
#  apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F6F88286 && \
#  apt-get update && \
#  apt-get install -y --no-install-recommends cabal-install-1.20 ghc-7.8.4 happy-1.19.4 alex-3.1.3 \
#          zlib1g-dev libtinfo-dev libsqlite3-0 libsqlite3-dev && \
#  rm -rf /var/lib/apt/lists/*

USER piyo

#ENV PATH $HOME/.cabal/bin:/opt/cabal/1.20/bin:/opt/ghc/7.8.4/bin:/opt/happy/1.19.4/bin:/opt/alex/3.1.3/bin:$PATH

#RUN \
#  cabal update && \
#  cabal install ghc-mod
```

Haskell用のコマンドはコメントアウトしています。代わりに使う言語のインストールなどを行ってください。

要するにUSERを変えてapt-getしてその後USERを戻してるだけ。

# 使う

長ったらしいコマンドを打って開発環境に入るのはいやなのでbashのfunctionを書いた。
変数は自分の環境に合わせてください。VIMとかVIMRCとかBASHとかBASHRCとかGITとか

function内のHASKELLが書いたソースの置場。

```sh
HOME="/home/piyo"
DOCKER_HOME="/home/piyo"
VIM="-v ${HOME}/.vim:${DOCKER_HOME}/.vim"
VIMRC="-v ${HOME}/.vimrc:${DOCKER_HOME}/.vimrc"
BASH="-v ${HOME}/.bash:${DOCKER_HOME}/.bash"
BASHRC="-v ${HOME}/.bash_profile:${DOCKER_HOME}/.bashrc"
GIT="-v ${HOME}/.gitconfig:${DOCKER_HOME}/.gitconfig"
SET="$VIM $VIMRC $BASH $BASHRC $GIT"

DOCKER="docker run -it --rm"
DOCKER_BACK="docker run -itd"
DOCKER_EXEC="docker exec -it"

function haskell() {
  NAME="piyo/haskell"
  CONTAINER="haskell"
  HASKELL="-v ${HOME}/haskell:${DOCKER_HOME}/haskell"
  if [ $# -eq 0 ]; then
    $DOCKER_EXEC $CONTAINER bash
  elif [ $# -eq 1 ]; then
    case $1 in
      "run" ) $DOCKER $SET $HASKELL --name $CONTAINER $NAME ;;
      "back" ) $DOCKER_BACK $SET $HASKELL --name $CONTAINER $NAME ;;
      "exec" ) $DOCKER_EXEC $CONTAINER bash ;;
    esac
  fi
}
```


```haskell back```でバックグラウンドでコンテナを動かして```haskell exec```でコンテナに入ります。
VBAHaskellの紹介 その10 （ループの性能が上がらない）

（この記事ははてなブログ　http://mmyymmdd.hatenablog.com/ の再掲です）
2015-04-26

[前回](http://qiita.com/mmYYmmdd/items/43cb43b1af4519bc0ea3)書いたループ性能を改善するためにAPIにそのための関数を追加し、ついでにリファクタリングしてみた。

終了判定されるまで変換関数を繰り返し適用する次のような関数をAPIに追加して、250msかかったものが140msになったが、10倍以上のスピードアップを期待していたので満足できない結果となった。

```cpp
// 単純なループ（終了判定されるまで変換関数を適用）
VARIANT __stdcall  repeat_imple( VARIANT*  init           ,  //初期値
                                 VARIANT*  pred           ,  //終了判定関数
                                 VARIANT*  trans          ,  //変換関数
                                 __int32   maxN           ,  //回数上限
                                 __int32   scan           ,  //履歴 or 結果
                                 __int32   stopCondition);   //終了条件
```
API側に個別目的の関数を追加するのは抵抗があったので他の方法を検討していたが、いい方法が思いつかなかったのでこうした。少し残念である。

C++側でループすることでファンクタの生成コストはほとんどなくなったはずなのに性能が伸びないのは、合成した関数の呼び出し方法そのものが悪いのだろうか。

[VBAHaskellの紹介 その9 （明示的なループの性能がいまいち）](http://qiita.com/mmYYmmdd/items/43cb43b1af4519bc0ea3)
[VBAHaskellの紹介　その1　（最初はmapF）](http://qiita.com/mmYYmmdd/items/c731edf943acc0a0ebe9)

ソースコード：
https://github.com/mYmd/VBA
dllバイナリ：
https://github.com/mYmd/VBA/blob/master/bin/mapM (32bit-Office用)
https://github.com/mYmd/VBA/blob/master/bin/mapM64 (64bit-Officey用)
VBAHaskellの紹介 その9 （明示的なループの性能がいまいち）

（この記事ははてなブログ　http://mmyymmdd.hatenablog.com/ の再掲です）
2015-04-23

ここでの「明示的なループ」とはVBAコード中のループのことで、VBAHaskellの関数適用関数である **applyFun** 等を繰り返し呼び出したときの性能が良くない。**mapF** や **foldl**などのリスト処理関数でもループ処理はしているが、それは[dll](https://github.com/mYmd/VBA/blob/master/mapM.cpp)の中で行われているのでこの話とは関係ない。

原因は **applyFun** の毎回の呼び出しの中で、VBA配列の中にネストされている関数をC++側の構造に展開する過程で最低でも2回は new が走るためである。

典型的に現われるのが、繰り返し処理そのものと言える **repeat_while** 関数で、サンプルの中では、以下のように円周率を確率的に求めている。

```vbnet
4 * repeat_while (0, _
                  p_equal(0, 0), _
                  p_plus(p_less(p_distance( _
                  p_makePair(p_rnd(0, 1), p_rnd(0, 1)), _
                  Array(0, 0)), 1.0)), _
                  N) _
          / N 
```
**repeat_while** を使って以下のことをやっている。

1. 「区間 [0,1] の一様変数のペアを作り、原点からの距離が1.0未満であれば1を、そうでなければ0を加える」関数をファンクタとして作り、
2. 0を初期値として、述語 p_equal(0, 0) が満たされている間、
3. 最大N回繰り返す
4. 結果を4倍してNで割る

述語 **p_equal(0, 0)** は要するに **0 = 0** なので恒真式となり、とにかくN回繰り返すわけだが、これが遅い。Core i5マシンでN=10000だと250msくらいかかるのだ。ファンクタは比較的複雑だし、述語の分もある。

lower_bound や upper_bound の中でも同様のことが起きているはずだが、述語の呼出し回数はデータ長の対数比例なので問題ないだろう。

これを改善する方法はいくつかあるはずだが、思いついたものはどれも冴えない感じなので止まっている。

[VBAHaskellの紹介　その8　（ソート関連）](http://qiita.com/mmYYmmdd/items/dd047d6af8e486465840)
[VBAHaskellの紹介　その1　（最初はmapF）](http://qiita.com/mmYYmmdd/items/c731edf943acc0a0ebe9)
Haskell+OpenGLでロトカ＝ヴォルテラ方程式を描画してみた

先日「ロトカ＝ヴォルテラ方程式知ってる？」と聞かれて人工生命などに熱中していた懐かしい記憶が蘇りました。そう言えば昔はPythonで相図を書いた記憶があったのですが今だったらとHaskellを使ってロトカ＝ヴォルテラ方程式の時間発展を描画してみました。描画にはOpenGLを使いました。

![](http://i.gyazo.com/5095d0a1b2e6a73925272fe3944650a4.png)

OpenGLを使ってゴニョゴニョするのに[GLUT](https://hackage.haskell.org/package/GLUT)を使っています。OpenGL Utility ToolkitのHaskellバインディングです。予めインストールしておきましょう。

```bash
$ cabal install GLUT
```

ロトカ＝ヴォルテラ方程式は[wiki](https://www.wikiwand.com/ja/%E3%83%AD%E3%83%88%E3%82%AB%EF%BC%9D%E3%83%B4%E3%82%A9%E3%83%AB%E3%83%86%E3%83%A9%E3%81%AE%E6%96%B9%E7%A8%8B%E5%BC%8F)のものをそのまま使用しました。あとHaskellでOpenGLを使うときは`runhaskell`ではなく`ghc`でちゃんとコンパイルしてから実行しないので気をつけてください。これなんで何でしょう。以下のコードは完全なコードなのでコピペして試すことができます。

```haskell
import Data.IORef
import Graphics.UI.GLUT

type Line = [(GLfloat, GLfloat)]

-- 計算用パラメータ
dt    = 0.01
alpha = 5.0
beta  = 3.0
gamma = 2.0
delta = 2.0

start = (1.0, 1.0)

main :: IO ()
main = do
    (_progName, _args) <- getArgsAndInitialize
    initialDisplayMode $= [DoubleBuffered]
    _window <- createWindow "Lotka-Volterra Equation"
    orbit <- newIORef [start]
    idleCallback $= Just (idle orbit)
    displayCallback $= display orbit
    mainLoop

idle :: IORef Line -> IdleCallback
idle orbit = do
    ps <- get orbit
    let (x, y) = head ps
    let nx = (\x' -> x + x' * dt) $ x * (alpha - beta * y)
    let ny = (\y' -> y + y' * dt) $ (negate y) * (gamma - delta * x)
    orbit $= ((nx, ny) : take 500 ps)
    postRedisplay Nothing

display :: IORef Line -> DisplayCallback
display orbit = do 
    clear [ColorBuffer]
    ps <- get orbit
    let scale = 0.5
    let (ox, oy) = (1.2, 2.1)
    renderPrimitive Lines $
        mapM_ (\(x, y) -> vertex $ Vertex3 ((x - ox) * scale) ((y - oy) * scale) 0) ps
    swapBuffers
```

簡単に解説していきます。

```haskell
main :: IO ()
main = do
    (_progName, _args) <- getArgsAndInitialize
    initialDisplayMode $= [DoubleBuffered]
    _window <- createWindow "Lotka-Volterra Equation"
    orbit <- newIORef [start]
    idleCallback $= Just (idle orbit)
    displayCallback $= display orbit
    mainLoop
```

最初の方はほとんどお決まりの処理です。大事なのは`idleCallback`と`displayCallback`でそれぞれ待機時、描画時に呼ばれる関数を指定します。まず待機時に呼ばれる関数を見て行きましょう。

```haskell
idle :: IORef Line -> IdleCallback
idle orbit = do
    ps <- get orbit
    let (x, y) = head ps
    let nx = (\x' -> x + x' * dt) $ x * (alpha - beta * y)
    let ny = (\y' -> y + y' * dt) $ (negate y) * (gamma - delta * x)
    orbit $= ((nx, ny) : take 500 ps)
    postRedisplay Nothing
```

この関数は毎フレーム呼ばれるのでここでロトカ＝ヴォルテラ方程式の計算をしています。orbitというIORefを用意してここに計算した軌道を貯めていっています。`postRedisplay`を呼ぶと`displayCallback`が実行されます。

```haskell
display :: IORef Line -> DisplayCallback
display orbit = do 
    clear [ColorBuffer]
    ps <- get orbit
    let scale = 0.5
    let (ox, oy) = (1.2, 2.1)
    renderPrimitive Lines $
        mapM_ (\(x, y) -> vertex $ Vertex3 ((x - ox) * scale) ((y - oy) * scale) 0) ps
    swapBuffers
```

ここではorbitの軌道を実際に描画しています。実は`main`でDisplayModeにDoubleBufferedを指定していたのでダブルバッファリングを使うことができます。この場合`swapBuffers`を呼べばバッファの内容が描画されます。

だいたいこんな感じです。何も難しいことはしていません。実際に実行すると軌道がぐるぐる動くのが見れて楽しいと思います。発散するのは計算誤差からでしょうか・・・
CreateJSの基本メモ3　四角を描く

#準備

下記を参考にしてください。
[CreateJSの基本メモ1　線を描く]
http://qiita.com/PianoScoreJP/items/09b6d9cf4e17549704c6#%E6%BA%96%E5%82%99

#1.四角を描く
rect(x,y,w,h)

     //ElementIDを指定して、ステージを作成する
        var mystage=new createjs.Stage("mycanvas");

    //Graphicsオブジェクトを作成する
        var g = new createjs.Graphics();

    //線の色を指定
        g.beginStroke("#000");

    //塗りつぶしの色を作成
         g.beginFill("#000");

     //四角を描く(x:0,y:0を左上角とした幅100px,高さ100pxの四角)
         g.rect(0,0,100,100);

     //Displayオブジェクトを作成
         var shape=new createjs.Shape(g);

     //シェイプオブジェクトをステージに追加する
         mystage.addChild(shape);

     //ステージを更新して描画を完了
        mystage.update();

短縮したメソッド名でチェーンして記述すると以下のようになります。

#実行結果
     g.s("#000").f("#000").r(0,0,100,100);
![実行結果](https://qiita-image-store.s3.amazonaws.com/0/75209/02a58f81-a7e4-d07e-4957-6a7317b6d73d.png)

[サンプル http://jsfiddle.net/pianoscorejp/qqeo61aq/1/](http://jsfiddle.net/pianoscorejp/qqeo61aq/1/)

#2.角丸の四角を描く
drawRoundRect(x,y,w,h,radius)

     //ElementIDを指定して、ステージを作成する
        var mystage=new createjs.Stage("mycanvas");

    //Graphicsオブジェクトを作成する
        var g = new createjs.Graphics();

    //線の色を指定
        g.beginStroke("#000");

    //塗りつぶしの色を作成
         g.beginFill("#000");

     //角丸の四角を描く(x:0,y:0を左上角とした幅100px,高さ100pxの四角,半径10の角丸)
         g.rect(0,0,100,100,10);

     //Displayオブジェクトを作成
         var shape=new createjs.Shape(g);

     //シェイプオブジェクトをステージに追加する
         mystage.addChild(shape);

     //ステージを更新して描画を完了
        mystage.update();




#実行結果
![実行結果!
](https://qiita-image-store.s3.amazonaws.com/0/75209/45ae0c59-5246-514e-3c39-132c6062ca25.png)

[サンプル http://jsfiddle.net/pianoscorejp/xbhqvura/] (http://jsfiddle.net/pianoscorejp/xbhqvura/)
Spring MVCの分かり難いエラー（はまりました）

以下のエラーが画面に表示された場合

```text
Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Wed Apr 22 00:33:24 JST 2015
There was an unexpected error (type=Bad Request, status=400).
Validation failed for object='userForm'. Error count: 1

```

これは、画像にも記載しましたが、
引数のvalidation対象のオブジェクト直後にBindingResultが無い場合に起こるエラーです。
エラーからはそれが判断できないので、悩んでしまいます。 

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/58199/75ce9b29-2532-5188-cb0b-a07f269006c9.png)
Spring static DI実装方法 と 自作Exception + MessageSourceAccessor

環境はSpring boot 1.2.3のJava8です。

今回は、自作のBussinessException（業務例外クラス）を各業務ロジックでthrowする際、呼び元でMessageSourceAccessorを使用し、メッセージを取得するのではなく、BussinessException内でメッセージキーのみ受け取り、MessageSourceAccessorでエラーメッセージを取得してエラーメッセージとして返す処理をする為に **static DI** が必要になりました。
その際に書いたコードを元に以下、記載していきたいと思います。

前置きが長くなりましたが、実装は以下です。 

```java:code

package jp.co.skill.spider.exception;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.support.MessageSourceAccessor;
import org.springframework.stereotype.Component;

@Component
public class BussinessException extends Exception {

	private static MessageSourceAccessor messageSourceAccessor;


	@Autowired
	public void setMessageSourceAccessor(MessageSourceAccessor messageSourceAccessor) {
		BussinessException.messageSourceAccessor = messageSourceAccessor;
	}

	public BussinessException() {
		super();
	}

	public BussinessException(String message_key) {

		super(messageSourceAccessor.getMessage(message_key));
	}
}
```
***
## 実装の説明
１．setterを作成し、自クラスのMessageSourceAccessorに設定する。
サーバー起動時にsetMessageSourceAccessorが呼ばれ、
Bean定義で設定されたMessageSourceAccessorが引数に入ってくるので、
自クラスのMessageSourceAccessorにインスタンスが設定されます。
２．クラスに@Componentを付ける。
起動時に呼ばれる為。
３．@Autowiredはsetterに付ける。

### MessageSourceAccessorのBean定義（参考までに）
Spring BootなのでConfigクラスに記載。

```java:MessageConfig
	   @Bean
	    ReloadableResourceBundleMessageSource messageSource() {
	        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
	        messageSource.setBasenames("classpath:i18n/messages",
	        		"classpath:i18n/validation_messages");	//（※２）
	        messageSource.setCacheSeconds(0);
	        messageSource.setDefaultEncoding("UTF-8");
	        return messageSource;
	    }

	    @Bean
	    public MessageSourceAccessor messageSourceAccessor() {
	        return new MessageSourceAccessor(messageSource());
	    }
テキストに書いてあるURLを次々とgit cloneするBATファイル

テキストファイルに書かれているURLを次々とgit cloneします。

### 使い方
以下に記述している「テキストファイル(list.txt)」と「次々とgit cloneするBATファイル(setup.bat)」を同一フォルダに格納し、「次々とgit cloneするBATファイル(setup.bat)」を実行します。

D:\Git-reposへ、次々にgit cloneされます。


### テキストファイル(記述例)

[list.txt]

```
git@github.com:kunst1080/AnubisGG.git
https://github.com/freebsd/freebsd.git
```


### 次々とgit cloneするBATファイル

[setup.bat]

```dosbatch
@echo off

set LIST=%~dp0list.txt
set DESTDIR=D:\Git-repos
set GIT="C:\Program Files (x86)\Git\bin\git.exe"

REM make directory
if not exist %DESTDIR% mkdir %DESTDIR%

REM Git clone
cd /d %DESTDIR%
for /f "usebackq tokens=1,2" %%a in (`type "%LIST%"`) do (
	echo git clone %%a %%b
	%GIT% clone %%a %%b
	echo.
)
```


※環境に応じて、環境変数「DESTDIR」と「GIT」の値は書き換えて下さい。
Visual Studio CodeでNode.js触ってみた

ちまたで話題になっているようなので早速いれて手持ちの適当なコードを開いてみました。

### 画面はこんな感じ

![スクリーンショット 2015-04-30 21.24.06.png](https://qiita-image-store.s3.amazonaws.com/0/25841/d9d3d42d-c2af-c3ef-893f-daa8907ecfcb.png)

### デバッグしてみる
![スクリーンショット 2015-04-30 21.26.56.png](https://qiita-image-store.s3.amazonaws.com/0/25841/dcf067bc-9e91-35a8-3672-7f9004281286.png)

- 起動したら自動でデバッグの実行設定用のJsonが作成されました。
- configurationsの中に複数のDebug設定を書き込めて、起動時に選べます。

```
{
	"version": "0.1.0",
	// List of configurations. Add new configurations or edit existing ones.  
	// ONLY "node" and "mono" are supported, change "type" to switch.
	"configurations": [
		{
			// Name of configuration; appears in the launch configuration drop down menu.
			"name": "Launch app.js",
			// Type of configuration. Possible values: "node", "mono".
			"type": "node",
			// Workspace relative or absolute path to the program.
			"program": "app.js",
			// Automatically stop program after launch.
			"stopOnEntry": true,
			// Command line arguments passed to the program.
			"args": [],
			// Workspace relative or absolute path to the working directory of the program being debugged. Default is the current workspace.
			"cwd": ".",
			// Workspace relative or absolute path to the runtime executable to be used. Default is the runtime executable on the PATH.
			"runtimeExecutable": null,
			// Environment variables passed to the program.
			"env": { }
		}
	]
}

```
- listen開始したら問題無くNodeのサーバーが立ち上がりました。

![スクリーンショット 2015-04-30 21.31.23.png](https://qiita-image-store.s3.amazonaws.com/0/25841/0d480832-df52-c059-bb05-3f38c6ce131d.png)

- しかし、MacでVisual Studioというのは不思議な感じ・・・
VBAHaskellの紹介　その5　（関数のシグネチャ）

（この記事ははてなブログ　http://mmyymmdd.hatenablog.com/ の再掲です）
2015-04-12
VBAHaskellはVBAの関数を合成して独立したオブジェクトにしたり、Haskell的なリスト処理をするライブラリだが、それが可能なVBA関数のシグネチャは実質的に1種類しかない。

```vbnet
Function myFunction(ByRef a As Variant, ByRef b As Variant) As Variant
'または
Function myFunction(ByRef a As Variant, Optional ByRef b As Variant) As Variant 
```
 この関数をそのまま使うのではなく、一種の関数ポインタ的なものにして渡す必要があって、それをやるヘルパ関数が
**`make_funPointer`** と **`make_funPointer_with_2nd_Default`** だ。

たとえば Haskell_2_stdFunモジュールで最初に定義されている **`firstArg `** 関数はこうなっている。

```vbnet
Function firstArg(ByRef a As Variant, ByRef b As Variant) As Variant
    firstArg = a
End Function
    Function p_firstArg(Optional ByRef firstParam As Variant, _
                                  Optional ByRef secondParam As Variant) As Variant
        p_firstArg = make_funPointer(AddressOf firstArg, firstParam, secondParam)
    End Function
```

 **`firstArg`** 関数に付属する **`p_firstArg`** が関数ポインタを作っており、その中で**`make_funPointer`**を呼んでいる。関数名は何でもよいが、**`p_関数名`** にだいたい統一している。新たに関数を定義したら、この **`p_firstArg`** のコードをコピペして関数名のところだけ対象関数に合わせて修正すれば使えるようになる。[^1]

**`make_funPointer`** は4要素の配列を作っているだけで、その配列は（関数ポインタ、引数1、引数2、xxx）という構成になっている。2つある引数には他の関数をネストすることもできて、これによって関数合成が実現される。

C++API側ではこのネストした配列を受け取って頻繁に呼び出すことになるが、VBAのsafearray構造体の中身に毎回アクセスするのは効率が悪いと思われるので、再帰的なリンク構造を再構成してから呼び出すようにしている。具体的には VBA_NestFunc.hpp と VBA_NestFunc.cpp にある **`funcExpr_i::eval()`** の再帰的な呼び出しがそれにあたる。

残念ながらここにはコンパイル時処理はない。

[VBAHaskellの紹介　その6　（foldl）](http://qiita.com/mmYYmmdd/items/e0269141f637f80258d8)
[VBAHaskellの紹介　その4　（Find）](http://qiita.com/mmYYmmdd/items/9299e7cf862b4c8db29e)
[VBAHaskellの紹介　その3　（FizzBuzz）](http://qiita.com/mmYYmmdd/items/93040f07121d95898161)
[VBAHaskellの紹介　その2　（合成関数）](http://qiita.com/mmYYmmdd/items/1e528ad68ad2c4e3de29)
[VBAHaskellの紹介　その1　（最初はmapF）](http://qiita.com/mmYYmmdd/items/c731edf943acc0a0ebe9)

ソースコード：https://github.com/mYmd/VBA
dllバイナリ：http://home.b07.itscom.net/m-yamada/VBA/mapM.dll

[^1]: ただし元の関数の第2引数がOptional宣言されていて、省略時の動作が定義されている場合は make_funPointer_with_2nd_Default の方を使う方がいい。その例は Haskell_2_stdFun にある対数関数 "logN" で、第2引数が対数の底を表しているが、省略時は自然対数になる。