OmniAICreator/Qiita-1.07M huggingface dataset:
たった5分でDjangoアプリをherokuにデプロイする方法

以下の公式ドキュメントを参照し、記事を書きました。
https://devcenter.heroku.com/articles/getting-started-with-django#declare-process-types-with-procfile

## 作業環境
* Mac OS X 10.10.3
* python 2.7.6

## 前提条件
1. heroku アカウントを持っていること
2. [heroku toolbelt](https://toolbelt.heroku.com/) がインストールされていること
3. virtualenvがインストールされていること


## PostgreSQL導入
インストール

```
$ brew install postgresql
```
パスを通す(~/.bash_profile)

```bash
export PATH=/usr/local/Cellar/postgresql/9.4.1/bin:"$PATH"
```

ターミナルを再起動

## Django環境を構築

**アプリケーション管理用ディレクトリを作成し、移動**

```
$ mkdir hellodjango && cd hellodjango
```

**venvといる仮想環境を構築し、起動**

```
$ virtualenv venv
$ source venv/bin/activate
```

**Django関連ライブラリ一式をダウンロードする**

```
$ pip install django-toolbelt
```

※ django-toolbeltに含まれているライブラリ

+ Django (the web framework)
+ Gunicorn (WSGI server)
+ dj-database-url (a Django configuration helper)
+ dj-static (a Django static file server)

**Djangoプロジェクト作成**

```
$ django-admin.py startproject hellodjango .
```

**Procfile作成し、以下の内容を記述**

```
web: gunicorn hellodjango.wsgi --log-file -
```

※ Procfileとは、Herokuのプラットフォーム上にあるアプリケーションのdynosにより実行されるコマンドが何であるかを宣言するためのメカニズムです。

**ローカルサーバーを起動**

```bash
$ foreman start
21:21:26 web.1  | started with pid 5513
21:21:26 web.1  | [2015-05-10 21:21:26 +0900] [5513] [INFO] Starting gunicorn 19.3.0
21:21:26 web.1  | [2015-05-10 21:21:26 +0900] [5513] [INFO] Listening at: http://0.0.0.0:5000 (5513)
21:21:26 web.1  | [2015-05-10 21:21:26 +0900] [5513] [INFO] Using worker: sync
21:21:26 web.1  | [2015-05-10 21:21:26 +0900] [5516] [INFO] Booting worker with pid: 5516
```

http://0.0.0.0:5000 でアクセスできればOK

## pipの依存関係を表すrequirements.txtファイルを作成

```
$ pip freeze > requirements.txt
```

## Django設定

**settings.pyの最後尾に以下の内容を追加**

```py
# Parse database configuration from $DATABASE_URL
import dj_database_url
DATABASES['default'] =  dj_database_url.config()

# Honor the 'X-Forwarded-Proto' header for request.is_secure()
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

# Allow all host headers
ALLOWED_HOSTS = ['*']

# Static asset configuration
import os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = 'staticfiles'
STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)
```

**wsgi.pyを以下の内容で書き換える**

```py
import os
from django.core.wsgi import get_wsgi_application
from dj_static import Cling

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "hellodjango.settings")

application = Cling(get_wsgi_application())
```

## gitバージョン管理を行う

**.gitignoreファイルを作成し、以下の内容を追加**

```
venv
*.pyc
staticfiles
```

**レポジトリに追加**

```bash
$ git init
$ git add .
$ git commit -m "my django app"
```

## herokuへデプロイ
**herokuにリポジトリを作成**

```bash
$ heroku create
```

**herokuへアプリケーションをデプロイ**

```bash
$ git push heroku master
```

**dynoの数を設定**

```bash
$ heroku ps:scale web=1
```

**ブラウザから確認**

```bash
$ heroku open
```

以下の画面が出ればOK！

![Welcome_to_Django.png](https://qiita-image-store.s3.amazonaws.com/0/46268/06a3d36d-3031-68a3-197b-7a069c00c0b1.png)
Raspberry Piでdockerを使う(HypriotOS)

# 準備

http://blog.hypriot.com/downloads/
から `hypriot-rpi-20150416-201537.img.zip`をダウンロードしSDにdd。

## ssh

* pi / raspberry

## hostnameを変更

/boot/occidentalis.txt

## ip固定

```bash:/etc/network/interfaces
allow-hotplug eth0
iface eth0 inet static
        address 192.168.11.5
        netmask 255.255.255.0
        gateway 192.168.11.1
```

## / のパーティションを拡大する

* [minibianに感動した](http://qiita.com/tukiyo3/items/bbff53fa1aad15cb0d5c)の記事を参考にパーティションサイズを拡張する。

## メモリの空きを増やす

* /boot/config.txt を作成し、`gpu_mem=16`を記述し再起動。

## usbメモリを docker のイメージ格納ディレクトリにする

* usbメモリを`/media/usb`にマウント

```bash:
mkdir -p /media/usb/docker /media/usb/docker-tmp
chown pi:docker /media/usb/docker /media/usb/docker-tmp
```

```diff:/etc/default/docker
- DOCKER_OPTS="--storage-driver=overlay -D"
+ DOCKER_OPTS="--storage-driver=overlay -D -g /media/usb/docker/"
- #export TMPDIR="/mnt/bigdrive/docker-tmp"
+ export TMPDIR="/media/usb/docker-tmp"
```

```bash:
sudo /etc/init.d/docker restart
ls /media/usb/docker
```

# dockerイメージ

`resin/rpi-raspbian`が主に使われている様子。

## せっかくなので自分仕様作った

```bash:Dockerfile
FROM resin/rpi-raspbian:jessie

RUN \
  set -eux ;\
  unlink /etc/localtime ;\
  ln -s /usr/share/zoneinfo/Japan /etc/localtime ;\
  sed -i -e "s@archive.raspbian.org@ftp.jaist.ac.jp@" /etc/apt/sources.list ;\
  apt-get update -qq ;\
  apt-get install -y vim-tiny dialog locales ;\
  sed -i -e "s@# ja_JP.UTF-8 UTF-8@ja_JP.UTF-8 UTF-8@" /etc/locale.gen ;\
  locale-gen ja_JP.UTF-8 ;\
  apt-get clean ;\
  echo "done"
```

* `console-setup`がdialogで聞いてくる。これだとdocker buildが止まるので以下も実施

```bash:
docker run -it tukiyo3/rpi-ja /bin/bash

apt-get install -y \
  apt-utils console-setup xrdp ttf-mona fontconfig

docker commit ContainerID tukiyo3/rpi-ja-xrdp
```



* 特徴
  * 日本のミラーサイトに変更
  * `apt-get update`がとても遅いので済ませておいた
  * ja_JP.UTF-8を作成済み
  * timezoneを日本
  * vim-tinyとdialogを最初から入れておいた。

## 使い方

```bash:
docker run -it tukiyo3/rpi-ja /bin/bash
```
rails sしたら[deprecated] I18n.enforce_available_locales・・・・って出てくる

ターミナル上で```rails s```したら
```[deprecated] I18n.enforce_available_locales will default to true in the future. If you really want to skip validation of your locale you can set I18n.enforce_available_locales = false to avoid this message.
```
って出てくる問題に対応したのでまとめてみます。といっても英語を翻訳すれば良いだけなのだが...

そもそもこのエラーというか警告というのは以下のURLによるとRails 4 (>= 4.0.2) と Rails 3.2 (>= 3.2.14)の間で出るらしい。
参考URL    http://stackoverflow.com/questions/20361428/rails-i18n-validation-deprecation-warning

で、まあ対応方法として2通りあります。
存在しないロケールを書いたときエラー発生させるときは

```config/application.rb
I18n.enforce_available_locales = true
```
存在しないロケールを書いてもエラーにさせないときは

```config/application.rb
I18n.enforce_available_locales = false
```
としたらOK!書く場所はどこでもいいが

```config/application.rb
config.i18n.default_locale = :ja
```

と日本語設定をしていると思うのでこんな感じだと見やすいですかね。

```config/application.rb
I18n.enforce_available_locales = false
config.i18n.default_locale = :ja
```

ただし、先にちゃんと日本語の locale ファイルを作っておかないと ```I18n::InvalidLocale``` という例外が発生して、 rake などで``` :ja is not a valid locale``` と怒られるらしいです。
参考URL　　http://blog.n-z.jp/blog/2013-12-04-rails-i18n-deprecated-warning.html

trueとfalseどちらにすればわからないというかたに補足！
今まで通りの挙動にするときはfalseみたいです。



###locale(ロケール)ってなに（余談）
簡単に言うと「使用する言語の設定」です。複数定義することもできます。
ちなみにI18nってのはIで始まり、間に18文字を挟んで、nで終わる文字列という意味で Internationalization の略称らしいです。ここから「文字列の複数言語表示対応」とも言えます。
cakePHP3でmodelをbake、からのshellで使う

いえ、全然大したことない投稿なんですけど・・。
phinxなどを使ってテーブルをあらかじめ作っておくと、そこからmodel層を作ることができます。


# 例えば

usersというテーブルがあると、こんな感じで作れます。

```shell-session
./bin/cake bake model users
```

これで、Entity、Table、Fixture、Testのファイルが作られます。
すでに同名のファイルがある場合は、上書きするかどうか選ぶことができます。

また、cakeの命名規則に沿ってmodelが作られるので、少し注意が必要です。
例えば、best_friend_idというカラム名を設定してbakeすると、best_friendsというテーブル名のidを外部キーとして入れるというmodelが作られます。


# shellで使う

というか、cakeで作ったmodelを、他のツールから使いたいことがあって、調べたらcakeにshellという機能が備わっていたという話です。
使ったことがなかったので、知りませんでした・・。

基本的には[リファレンス](http://book.cakephp.org/3.0/en/console-and-shells.html)見ればいいと思うんですけど、例えばShellクラスを継承して作ります。

```php
namespace App\Shell;

use Cake\Console\Shell;

class HelloShell extends Shell
{
    public function main()
    {
        $this->out('Hello world.');
    }
}
```

継承したクラス名は、後ろにShellとつける必要があります。
下記を実行すると、main()を動かすことができます。

```shell-session
./bin/cake hello
```


## modelを使う

前置きが長くなりましたが・・・shellでmodelを使う場合（shellに限りませんけど）、TableRegistryを用いてTableオブジェクトを作成します。

```php
public function main()
{
    $users = TableRegistry::get('users'); // テーブル名を指定
}
```

あとは、$usersからfind()を使ってデータを取得するなり、newEntity()を使って新しくEntityを作るなりしていけば大丈夫だと思います。

どうでもいいんですけど、Tableオブジェクトの名前でよくテーブル名が使われているんですけど（上記だと、users）、これだと複数のuserオブジェクトを配列に入れたい時の変数名に困ったりします。
正直、混乱するので、usersTableとかにするといいかもしれません（というか、たまにリファレンスでそういうところあります）。
Markdown環境について

- Macの場合のMarkdown記述環境について
- 多少情報が古いかもしれない

## [Atom](https://atom.io/)

### 標準の場合
- Macの場合は Ctrl+shift+m で起動
- 良い点
	- リアルタイムプレビュー
- 不満点
	- 数式(mathjax)が使えない

### pandoc preview
- 良い点
	- リアルタイムプレビュー
	- 数式(mathjax)が使える
- 不満点
	- 環境構築が面倒
		- pandocが必要
	- Macの場合
		- pandocが/usr/local/binなどにある場合，コマンドを絶対パスで指定しないと動かない

## [MacDown](http://macdown.uranusjr.com/)
- Macのみ

## [kobito](http://kobito.qiita.com/ja)
- Macのみ
- 良い点
	- リアルタイムプレビュー
- 不満点
	- 書き出しが不便

## [Sublime Text3](http://www.sublimetext.com/3)
- 良い点
	- リアルタイムプレビュー
	- 数式(mathjax)が使える
- 不満点
	- ブラウザが開く
	- 日本語入力の補完がうまくいかない場合がある
	- 環境構築が面倒

### 導入方法
[参考URL](http://web-layman.com/sublime-text-3-wozui-qiang-no-markdown-edeitani/)

1. pandocをインストール
	- Macの場合(Homebrew)
		- brew install pandoc
1. markmonをインストール
	- Macの場合(Homebrew)
		1. (node.jsが入ってない場合):brew install nodejs
		1. npm install -g markmon
1. Sublime Text3をインストール
1. Package ControlをSublime Text3にインストール
	- [参考URL](http://luna-plate.com/archives/4637)
1. Markmon real-time markdown preview(プレビュー用)をSublime Text3にインストール
	1. コマンドパレットを起動(Macの場合:Cmd+Shift+p)
	1. Package Control:Install Packageを選択
	1. 入力画面が出たらMarkmonと入力
	1. Markmon real-time markdown previewを選択
1. Pandoc(書き出し用)をSublime Text3にインストール
	1. コマンドパレットを起動(Macの場合:Cmd+Shift+p)
	1. Package Control:Install Packageを選択
	1. 入力画面が出たらPandocと入力
	1. Pandocを選択
	1. 基本設定->Package Settings->Pandoc->Settings-Defaultの内容をSettings-Userにコピー
	1. 14行目あたりの"null"を変更(Macの場合:"/usr/local/bin/pandoc"など)
	1. "HTML5"の"pandoc-arguments"に"-s"を追加
	1. "PDF"の"pandoc-arguments"に"-V","documentclass=ltjarticle","--latex-engine=/usr/texbin/lualatex"を追加

### 使い方
- プレビュー
	1. \*.mdでファイルを保存
	1. Sublime Text3で開く
	1. コマンドパレットを起動
	1. markmon launchを選択
	1. ブラウザが開く
- 書き出し
	1. \*.mdでファイルを保存
	1. Sublime Text3で開く
	1. コマンドパレットを起動
	1. Pandocを選択
	1. HTML5を選択
	1. 新しいタブが開くのでそれを保存

## Vim
- リアルタイムプレビューのプラグインは存在しないみたい

## 参考URL
- [Mathjax対応Markdownエディタ](http://rikeizine.hatenablog.com/entry/2014/08/28/023645)
FOAM Frameworkを使ってみる その2


これはFOAM Frameworkについて、公式ページを翻訳しながら学んでいこうという記事です。

[おとといの記事](http://qiita.com/tako-black/items/396734b82e256bad34b3)では分かったような分からないような感じだったので、次は詳細な[Aboutページ](http://foam-framework.github.io/foam/about/)を翻訳していきたいと思います。
もし何か間違いやおかしい点などありましたら、コメントを頂けると幸いです。 
原文は[github.io](http://foam-framework.github.io/foam/about/)の `The basic` から始まる文章で、 
ライセンスは[こちら](https://github.com/foam-framework/foam/blob/master/COPYRIGHT)に準拠します。

以下翻訳

---

FOAMの基本原理は **fast apps fast(速いアプリを速く作る？)** です。

FOAMはPCでもモバイルでも、ロードや動作が速いアプリを速く書くのを助けるツールで構成されています。

私たちの目的はどのコードのかたまりにおいても、できるだけ速くするといったものです。最も速く、最もセキュリティに強く、最もバグの少ないコードを書くようなものではありません。

FOAMはメタプログラミングフレームワークです。とても宣言的で、リアクティブです。なぜなら、アプリがどう動くべきかをとても高いレベルで表現する手段だからです。

* FOAMは **徹底的にMVC** です。全てはモデルから流れてきます。モデルは、あなたのアプリがどのように世界を見るかというものです。その実体は何でしょうか？私たちは何を知るでしょうか？私たちは何ができるでしょうか？
	* FOAMはとても進歩したクラスのシステムを持っています。オブジェクトはプロパティやメソッドを持っています。しかし、それだけでなく、ユーザーのアクションやビューテンプレートやi18nの文字列などを持っています。
		* アクションは無効になったり隠れたりといった状態をリアクティブに受け取ります。
		* プロパティはタイプだけでなく、ファクトリーやデフォルト値や `postSet` ハンドラーやデフォルトのビューなどを持っています。
* FOAMは **リユーザブル** で **コンポーザブル** です。リユーザブルなビューコンポーネントだけでなく、リユーザブルなデータストレージ（下部を参照）やリユーザブルなコントローラを持っています。
* FOAMは **リアクティブ** です。ビュー同士を結びつけるのが簡単で、アップデートされるべきときにアップデートされます。
	* FOAMはリアクティブで、クロスブラウザで、 **速い** です。しかし、ダーティチェックは悪い意味で拡大しています。また、 `Object.observe` はクロスブラウザではありません！[パフォーマンス](http://foam-framework.github.io/foam/performance/)で私たちがどのようにこれに対処しているか見ることができます。
* [ **データ** はコードよりよいです](http://foam-framework.github.io/foam/principles/)。 **スマートなデータ** ならなおさらです。FOAMのオブジェクトはリフレクティブです。つまり、FOAMのオブジェクトはどんなプロパティを持っているか分かっていて、私たちはJSONやXMLや他のフォーマットでそれをシリアライズすることができます。それらは知的で、比較したりdiffをとったり、異なるデータベースにおいてどのように保持されるのが最良か計算できたりします。
	* FOAMのオブジェクトとそれらのプロパティは、それ自身がFOAMのオブジェクトで記述されています。[モデル](http://foam-framework.github.io/foam/foam/apps/docs/docbrowser.html#Model)や[プロパティ](http://foam-framework.github.io/foam/foam/apps/docs/docbrowser.html#Property)を参照してください。
	* FOAMは「FOAM自身によって記述されて」おり、ユーザーにも提供される、同じメタプログラミングの力を使っています。そのため、コンパクトでロードが速いことが維持されています。
* [ **インターフェイス** はインプリメンテーションよりよいです](http://foam-framework.github.io/foam/principles/)。FOAMはデータストレージ（下部を参照）やビュー（DOMや2Dのcanvasなど）のための標準のインターフェイスを持っています。
	* 私たちが提供していない何かが必要ですか？標準になるほどパワフルな新しいインプリメンテーションを書きましょう。
* FOAMはユニバーサルなインターフェイスを持っています。例えば、DAO、つまりData Access Objectや詳細について考える必要のないストロングデータを持っています。たくさんのDAOのインプリメンテーションがあります。
	* webには、indexedDBやLocalStorage。
	* Node.jsには、MongoDBやXMLファイルやJSONファイル。
	* Google Compute Engineには、Cloud Datastore(Node.jsからの)。
	* 全てにおいては、とても速いインメモリのインプリメンテーション。
		* 自動的にインデックスを張って、検索を簡単にします。
	* ロギングやタイミングやいくつかのキャッシュストラテジーには特別に関数的なデコレータDAOがあります。
		* IndexedDBの一番上の層の一番上に1つのラインのネットワークを配置します。
		* データを変えることや何かをモックにすることなく、実際のスタックをテストデータの配列と交換します。

---

以上翻訳

なんかだんだん全容がつかめてきたような気がします。
[次回の記事](http://qiita.com/tako-black/items/9e2caa70f79f5aa50811)では、(やっと)[チュートリアル](http://foam-framework.github.io/foam/tutorial/0-intro/)を翻訳しながら進めていきたいと思います。
ECサイト構築（途中）の備忘録

ECサイト作成備忘録

#gem
###bcrypt(パスワードの暗号化)
gemfileからコメントアウト
→password_digestの項目に追加していく(databaseにカラムを追加し

ておくこと)→modelにhas_secure_passwordの宣言を

#model
###validate
precense 空欄なし
validates_confirmation_of 一致

###attr_accessible と　attr_accessor の違い
→attr_accessor は Ruby のメソッドで、ゲッターとセッターをつくる。attr_accessible は Railsのメソッドで、モデルのどの属性をアクセス可能にするかをRailsに伝える。マスアサインメント(たくさんのアクセス)の脆弱性から守るために必要。

###viewファイルからnewメソッドで保存してもnilがデータベースにかえってしまう場合の確認
→attr_accessible に変更

###attr_accessor 
→これで、データベースのカラム要素を指定しておかないとデータベースへの書き込みができない



※あくまで、個人的対処法

#controller
###userの一通りの登録＆編集方法
def → new, all(index), edit, create, destroy

##【重要】createメソッドについて
→なんで、User.new(user_params) なの？ or User.new(params[:user])
→じゃないと、フォームから送られたデータの保存がデータベースにできない（どこに保存すればいいか指定ができない）※ここでは、params[:users] ではなく、 params[:user]の単一系にしないとダメ
→これは、update でも同じなので注意。

###すべてのコントローラーでセッションの概念導入
→application_controller.rbに include でセッションヘルパーの導入

#sign in
###rails でsign inを実装する方法
→http://qiita.com/kidach1/items/ebdb4b29336955903029
remember_tokenを用いてセッションの管理を行う

#route
###link について　'/'を入れるかどうか
→'/'を入れていないとたとえば、users/11ページからリンクする場合、/users/home　へとリンクされてしまうので、'/'を　link_to の中に入れること

#パラメーターの受け渡し
###viewファイルからパラメーターを受け渡す
→アイテムの個数を持っていくときに必要

###edit アクションなどにパラメータをもって行くためのlink_toの書きかた
→<%= link_to '****(リンクの名前)', :controller => '', :action => '', :id => *** %>→ここの:idの記載で気を付けることは（特に特定のidが渡ってきていないindexなど）は、eachやfor文で回しているときの、代入変数.要素　の書き方じゃないとうまくいかない

#cart機能実装について

###商品追加のメソッドの改良です。
現在のカートの商品に重複があるかどうかチェックし、あった場合は数量をインクリメント、なかったらカートに新しい商品として放り込む感じのメソッドです。(引用:http://syossan.hateblo.jp/entry/20100723/1279866371)


#session
###ActionDispatch::Cookies::CookieOverflow エラーについて
→この場合、sessionに過度の書き込み（一時保存）をしていることが

原因(※4KB以上の情報でアウト)→rake db:sessions:crate→migrate

→config/initialize/session_store.rbの[プロジェクト名]::Application.config.session_store :active_record_storeを有効化
PickerViewに連続番号を表示する〜Swiftで連続番号の配列作成【メモ】

#PickerViewに連続番号を表示したい場合

![image](https://qiita-image-store.s3.amazonaws.com/0/59249/a0569f4a-e4c2-ddc4-50d2-32c216bee2c9.png)

Swiftには start...end （例：1...100 など）という表記で、数値型のRangeオブジェクトを作成する仕組みがあります。
これを数値型の配列にキャスト([Int])することで、連続番号の入った配列を簡単に作成することができます。

この仕組を使って、PickerViewに表示したいtitleの値を、String型に変換して加工することで、連続番号の入った一覧を作ることが楽になります。



```swift:swift
//数値の範囲（1...10という記法）を配列にする
var dataArray:[Int] = ([Int])(2005...2015)

//PickerViewのコンポーネントの数を決めるメソッド
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
    return 1
}

//PickerViewのコンポーネント内の行数を決めるメソッド
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return dataArray.count
}

//PickerViewのコンポーネントに表示するデータを決めるメソッド
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {

    //配列の値を文字列に変換してPickerのtitleに使う
    return String(dataArray[row]) + "年"
}
```

#連続番号の値を加工する

![image](https://qiita-image-store.s3.amazonaws.com/0/59249/7d0d7cb8-814c-5af3-c18a-50c8c46a5bb9.png)

さらにSwiftには配列に対して加工する便利なmap関数があります。
これを利用して、1...5の値をすべて5倍するといった加工が可能です。


```swift:swift
//数値の範囲（1...5という記法）を配列にし、さらにすべての値を5倍する
var dataArray:[Int] = ([Int])(1...5).map {($0 * 5)}

//PickerViewのコンポーネントの数を決めるメソッド
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
    return 1
}

//PickerViewのコンポーネント内の行数を決めるメソッド
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return dataArray.count
}

//PickerViewのコンポーネントに表示するデータを決めるメソッド
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {

    //配列の値を文字列に変換してPickerのtitleに使う
    return String(dataArray[row]) + "人"
}
```
Scala Play アプリケーションを Eclipse で開発する

Play をインストールして、作成した Play プロジェクトを Eclipse にインポートさせてみます。

## 環境

* Mac OSX 10.10.2
* Scala 2.11.6
* JDK 1.8.0_45

## Eclipse をダウンロード

Eclipse が無い場合は[公式のダウンロードページ](http://www.eclipse.org/downloads/)から入手してください。
今回は `Eclipse IDE for Eclipse Committers 4.4.2` を使います。

ダウンロードが完了したら、解凍して適当なディレクトリに置いておきましょう。

## Play をインストール

正確には `Typesafe Activator` というアプリケーションをインストールします。
この Activator を使うと簡単に Play アプリケーションを作成できます。

[Typesafe のダウンロードページ](https://www.typesafe.com/get-started)から入手して、こちらも解凍して適当なディレクトリに置いておきましょう。

また、このタイミングで `activator` のパスを通して置くと良いです。

```bash
$ cat << EOS >> ~/.bash_profile
> 
> # Setting PATH for typesafe-activator
> export PATH=\$PATH:/path/to/activator
> 
> EOS
$ source ~/.bash_profile
```

`$ activator -help` とコマンドを打って activator のヘルプが出てくれば完了です。

## Play アプリケーションの作成

activator を使って早速 Play アプリケーションを作成してみます。

```bash
$ activator new sample-app play-scala
```

このコマンドで、`sample-app` という名前の `play-scala` アプリケーションが作成されます。（`sample-app` というディレクトリが作成されます）
コマンドが実行し終わったら、Play コンソールを立ち上げてみます。

```bash
$ cd sample-app
$ activator
...
[sample-app] $
```

ログが延々と出ると思いますが、最後に `[sample-app] $` と表示されたら成功です。
試しにアプリケーションを起動してみましょう。

```bash
[sample-app] $ run
...
--- (Running the application, auto-reloading is enabled) ---

[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Ctrl+D to stop and go back to the console...)
```

こちらも延々とログが出た後に、`(Server started, use Ctrl+D to stop and go back to the console...)` と表示されたら準備完了です。
ブラウザで `http://localhost:9000/` にアクセスして、「Your new application is ready.」と表示されることを確認しましょう。

Play コンソールに戻るときは `Ctrl+D` を押します。

## Eclipse にインポート

Play コンソール上で `eclipse` と打ち、Eclipse にインポートする際に必要な設定ファイルを生成します。

```bash
[sample-app] $ eclipse
[info] About to create Eclipse project files for your project(s).
[info] Successfully created Eclipse project files for project(s):
[info] sample-app
```

次に、Eclipse を起動してメニューから `File -> Import` を選択します。
ダイアログが表示されたら `Existing Projects into Workspace` を選択します。
次のダイアログの `Select root directory` に先ほど作成した Play アプリケーションのディレクトリを指定すると、`Projects` に `sample-app` が表示されますので、これにチェックをいれて `Finish` を押します。

## Scala プラグインのインストール

素のままの Eclipse では Scala のソースコードを認識してくれないため、`Scala IDE for Eclipse` というプラグインをいれます。
[コチラ](http://scala-ide.org/download/current.html)のページからダウンロード先の URL を確認します。今回利用する Eclipse は `Luna` なので、`http://download.scala-ide.org/sdk/lithium/e44/scala211/stable/site` を使います。

Eclipse のメニューから `Help -> Install New Software...` を選択して、`Wordk with` の欄に先ほどの URL をコピペします。
`Add` ボタンを押してしばらく待つといくつかプラグインが出てきますので、ひとまず `Scala IDE for Eclipse` のみを選択して次に進みます。
後は支持に従って進めていけば、インストーラが完了します。

以上で、Eclipse で Scala Play アプリケーションを開発する環境が整いました。
Web上にスクリプトを置いて、PowerShellで実行可能にしてみた（その1／Hello,World編）

Web上にスクリプトを置いて、PowerShellで実行可能にしてみました。

今回は初回ということで、まずは簡単なスクリプトを作ってみました。
今後、本格的なスクリプトにも挑戦できればと思います。

#使用例
```ps1
#PowerShellを起動し、以下コマンドを実行して下さい
function Invoke-RemoteScript($url){
  $script = (New-Object Net.WebClient).DownloadString($url)
  Invoke-Expression("&{$script} $args")
}

Invoke-RemoteScript 'http://nancus.html.xdomain.jp/scripts/hello.ps1' '[name]'
#こんにちは、[name]!
```

ちなみに、hello.ps1には、以下のようなスクリプトが書かれています。

```ps1:hello.ps1
param($name)
echo "こんにちは、$name!"
```

#経緯
chocolateyの真似をしたくなったのがきっかけです。

chocolateyっていうのは、Windowsへのソフトウェアのインストールをコマンド１発で実行できる便利ツールで、chocolatey自体のインストールも、PowerShellで以下のコマンドを実行すればOK。

```ps1
iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))
```

何でそんなに簡単にインストールできるんやろ？と疑問に思って、そのコマンドを調べてみると、
１．WEB上から、インストール用のスクリプトをダウンロードして（DownloadString）
２．PowerShell上で実行（iex。iexはInvoke-Expressionのエイリアス）する
という、とても分かりやすい仕組みでした。

これを真似すれば、
WEB上にスクリプトをアップロードし、Windows端末から、URLを指定してスクリプトを即実行、ということができるのでは、と思い、真似してみることにしました。

はじめはGoogleドライブにスクリプトをアップロードして、URLを発行して使用しようとしたのですが、発行したURLに対してDownloadStringすると、なんだか余計なタグが色々ついてきて・・・
多分、人間が使いやすくするために、色々とソースを変換してくれているのでしょうが、そのままではPowerShellで実行できないので、Googleドライブは諦めました。

次に無料ホスティングサービスを検討しましたが、tok2は広告などの色々なタグが付いてくるので、やはりそのままPowerShellでは実行できませんでした。

最終的に、FTPでアップロードしたテキストをそのまま表示できる、XdomainのHTMLサーバーに落ち着きました。

#参考
[Chocolatey Gallery](https://chocolatey.org/)
electronでbabel + reactを直接使えるようにするまで


さくっとelectronでbabel呼び出すところまでが良さそうな情報無くて錯綜した。
一旦出来たのでメモ
（ビルド＆配布あたりまでは行ってないが、まず動く感じのところまでなのでご了承）

~~出来上がりが見たい場合はこれ~~ (もう記事より古くなってるので多分参考になりません）
~~https://github.com/suisho/example-electron-babel/~~


# 構成

好みだがこんな感じにしている

```
$ tree -I node_modules                                                      
.
├── app
│   ├── client
│   │   ├── Foo.jsx
│   │   └── main.jsx
│   ├── index.html
│   └── index.js
└── package.json
```

コード本体は`./app`以下に固めている。トップ階層に入れておくと後でgulpfileとか膨れてきた時に汚い感じになるため。
サーバー側とクライアント側のコードも区別付けれるように`./app/client`も切っておく


# 手順

## 1. インストール
一旦今回は起動するまでぐらいを考える。

### electron-prebuilt
パッケージングの事などを考えるとこれでは足りないが、今回はelectron-prebuiltを使うとこまでに留める

```
$ npm init -y
$ npm i -D electron-prebuilt
```


### react

次にreactのインストール

```
$ npm i -S react 
```

### babel

次にbabel
babel6からは、最低限で下記のパッケージのインストールがほしいところ。`preset-es2015`は必須ではないが、どうせやるなら入れておきたい

```
$ npm i -D babel babel-register babel-preset-react babel-preset-es2015
```

package.jsonにはstartコマンドと、babelの設定を記載しておく。

```package.json
{
  "name": "example-electron-babel",
     :
     :
  // ↓これ
  "scripts": {
    "start": "electron ./app"
  },
      :
      :
}
```

babel v6からは、`babelrc`の設定が必要なので、package.jsonに下記のように追加してあげる(.babelrcでもいいし引数にオプションとして渡してもいいしそのへんはお好みで）。
`sourceMaps`の設定は`inline`にすればsourcemapを読み込んでくれる

```package.json
　　  :
  "babel":{
    "sourceMaps": "inline",
    "presets": [
      "react"
    ]
  }
     :
```

## 2. ボイラープレート的にコードを準備
https://github.com/atom/electron/blob/master/docs/tutorial/quick-start.md
ここのquick-start通りに記述。だるいけどまだこのへんはちゃんと理解できてないので従っとく。

## 3. 動かしたいコードを書く
こんな具合。

```client/main.jsx
import React from 'react'

class Foo extends React.Component{
  render(){
    return <div>This is React component</div>
  }
}

var container = document.querySelector("#container")

React.render(<Foo />, container)
```


## 4. babelの登録

index.htmlをこんな感じで書き換える。`babel-register`は多分もうちょっとオプション入れたほうが良さそう(詳しくは[babeljs.io](https://babeljs.io/docs/usage/require/)を参照のこと)。
今はシンプルにしとく。

```index.html
<!DOCTYPE html>
<html>
  <head>
    <title>Hello World!</title>
  </head>
  <body>
    <h1>Hello World!</h1>
    We are using io.js
    <div id="container"></div>
    <script>
      window.onload = function(){
        require('babel-register')() //ここ重要
        require("./client/main.jsx")
      }
    </script>
  </body>
</html>
```



## 5. できた！
startコマンドを登録済みなので、下記で起動可能。

```
$ npm start
```
![Hello_World_.png](https://qiita-image-store.s3.amazonaws.com/0/7307/9338cb91-0b32-52d3-4d22-7c99c5d37ccf.png "Hello_World_.png")

# まとめ
- 結果として`require("babel-register")`を呼び出すだけだったのに結構試行錯誤してしまった。
- まだまだ「electron」だと情報が少なく「atom-shell」じゃないとぐぐっても出てこない情報多そう。
	- 「electron babel」あたりでぐぐって出てくる[electron-starter](https://github.com/atom/electron-starter/)は情報が古いのかどうも参考にならず動かなかった。

## 参考
- https://github.com/BinaryMuse/react-atomshell-spotify
	- [このコード](https://github.com/BinaryMuse/react-atomshell-spotify/blob/master/src/bootstrap.js)すごく助かった。-
続: H2O をいじくって OpenStreetMap の(ry : デモ環境の構築

#概略

[前回投稿した](http://qiita.com/ntabee/items/5f5394523b4760b7a4d6)、[H2O](https://github.com/h2o/h2o)にちょっと手を加えて、[OpenStreetMap 用のタイルサーバ](https://github.com/ntabee/h2o-tile)にしてみた話の続き。

今回は、デモ環境を作る用のかんたんな shell script を書いたのでご紹介。
なお、出来上がるデモサイトは、基本的には[昨日公開したここ](http://h2o-tile-demo.ddns.net:8080/)と同じものになるハズだ。

#で、どうやって使う？

GitHub の [INSTALL.md](https://github.com/ntabee/h2o-tile/blob/tile/INSTALL.md) に簡単な説明を書いたので、そちらを見よう。
中で何をやっているかは、 [スクリプト自体](https://github.com/ntabee/h2o-tile/blob/tile/examples/tile-demo/make.demo-server.sh) のコメントに書いてある。

ここにスクリプト全部貼り付けて解説を書いていこうかとも思ったのだが、「**DRY とゆう言葉をしらねーのかよこの static おじさんが！**」と言われそうなのでやめる。

代わりに、スクリプト冒頭の長い説明だけ要約する:

## 想定環境
**Debian jessie 64bit** でしか試してない。
Ubuntu でも `apt` のパッケージ名を調整すればいけるかも。ただ、特にフォント系のパッケージ名は違いが激しく、つらい。
RHEL 系は、主に gcc が古いとかの理由でつらみしかないかも。ただし試したわけではない。度胸でなんでもやってみるのも悪くない。

- ストレージ **50GB**, 
- メモリ **4GB**, 
- コア**2** 

ぐらいはできれば欲しい。

## インターネッツに公開する時の注意
- 22, 8080 以外のポートは開けるんじゃないぞ。絶対だぞ
- なくして困る自分のデータとかコードは置くな

これは雑なデモ環境であって、ガチな運用環境ではない。いいね？

## 下準備
一部の処理は "osm" という名前の一般ユーザ (このスクリプトの最初で useradd する) で実行する。
理由は、OpenStreetMap のツールチェインの一部が、このユーザ名を前提にハードコードしちゃってたりするため。
なので、あらかじめ
`$ visudo`
で、

```
    Defaults        timestamp_timeout=-1
    osm   ALL=(ALL:ALL) ALL
```

と書いておくこと。
このゆるふわすぎるアクセス権は、セットアップが終わったらなかったことにしてもかまわない。

## 主なデータの場所と、ファイルシステムについて
PostGIS の DB は `/var/lib/postgresql/9.4/main` の下。これは `apt` で入れた時のデフォルトがそうなっている。

タイル (画像ファイル) は `/opt/osm/tiles` の下
+ なので、`/opt` の空き容量は十分 (20～30GB ぐらい) 確保しよう, そして
+ `/opt` は **ext4 ではなく**、**Btrfs のパーティション** を切って、そこに `mount` することを強く強く訴えていきたい。ナンデ？

### Btrfs の薦め
なんでかというと、`tiles/` の下にはすっごいたくさんのファイルができるからだ。
最大縮尺まで全部画像にすると、**東京周辺だけでも .png ファイルが何百万個**とか普通にいく。
ext4 でこれはキツいでしょ。もっと広い領域で何十億個とかになったら**絶対無理**でしょ。
一方、btrfs は、inode の数をフォーマット時に決めるということをしないし、
小さな画像 (地図はたいていそうだ) はメタデータ領域に詰めてくれる。やったね！

具体的な `mkfs` と `mount` のやり方は:

```bash
$ sudo sudo apt-get -qq install btrfs-tools
$ sudo mkfs.btrfs -O^extref -m single /dev/part/for/tiles
$ sudo vi /etc/fstab # fstab に下の行を追加:
/dev/part/for/tiles  /opt       btrfs   auto,noexec,noatime,autodefrag,compress=lzo,space_cache      0       2
# ただし、ほぼ .png しか置かないので、"compress=lzo" あんまり意味ないかも。
```

## おねがい

このいかにも static 加齢臭ただよう shell script を、Fabric とか Ansible とか Docker とか、イケてる DevOps だぜクラウドでインミュータブルインフラスツラッチャーだぜヒャッハーにしてくれる DevOps な人がほしいです。
Swith Roleで複数のAWSアカウント間を切替える


# 通常の複数のAWSアカウントの管理方法
![スクリーンショット 2015-05-09 15.18.46.png](https://qiita-image-store.s3.amazonaws.com/0/11653/f222cb1b-a59f-9653-cdf0-36590e15ada4.png "スクリーンショット 2015-05-09 15.18.46.png")

## 課題
- 同一のシステムのランドスケープを複数のAWSアカウントに分けているような場合、IAMユーザーを別々に発行してログイン、ログアウトして環境を切り替えるのは面倒です。

# Switch Role方式
![スクリーンショット 2015-05-09 15.19.05.png](https://qiita-image-store.s3.amazonaws.com/0/11653/ae6c6170-b3c6-05c2-6a04-9cb108eea057.png "スクリーンショット 2015-05-09 15.19.05.png")

- 「IAMユーザーは1つのアカウントだけで発行」し、スイッチ先では「信頼するAWSアカウントの特定のユーザーに付与してよいIAM Roleを発行」することで、一つの入り口から複数の環境に切り替えて操作が可能です。

# やってみよう Let's do it!
それでは上記の「Switch Role方式」の図にある構成を用いて、実際に設定してみましょう。

## 1. スイッチ先でロールを作成する
まずはスイッチ先である本番アカウント側で、スイッチ元に権限移譲するロールを作成します。
IAM画面に移動し、左のロールのペインからロールの作成を押下して進めていきます。

### 1-1. ロール名を入力する
![21.png](https://qiita-image-store.s3.amazonaws.com/0/11653/9b427940-ea7b-e100-5ac0-e64c8c5f2b0e.png "21.png")

### 1-2. クロスアカウントアクセスのロールを選択する
- 今回は信頼するアカウントも自分のアカウントなので「所有するAWSアカウント間のアクセスを提供します」を選択します
![22.png](https://qiita-image-store.s3.amazonaws.com/0/11653/14f71530-7b7a-8fc7-adb1-a0611adeb615.png "22.png")

### 1-3. 権限を付与するアカウントIDを入力する
- この本番アカウントにアクセスする開発アカウントのIDを入力します
- SwitchするときにMFAを必要とさせることもできるようです。
![23.png](https://qiita-image-store.s3.amazonaws.com/0/11653/f845ea41-a836-41f4-9d74-c9bc17890797.png "23.png")

### 1-4. アクセスポリシーを設定する
- 最大2つのポリシーが設定できるようです
![24.png](https://qiita-image-store.s3.amazonaws.com/0/11653/5198a905-bde3-d844-2f73-992efb47a67b.png "24.png")

### 1-5. 内容を確認してロール作成
![25.png](https://qiita-image-store.s3.amazonaws.com/0/11653/635379fd-1601-d11e-e092-2001da474fbc.png "25.png")

## 2. スイッチ元でロールを設定する
続いて開発アカウントに移動して、Switch Roleできるように設定します

### 2-1. インラインポリシーを選択してカスタムポリシーを作成する
![31.png](https://qiita-image-store.s3.amazonaws.com/0/11653/ab66e47e-1a53-280a-60c9-92ac1a85ba17.png "31.png")

### 2-2. カスタムポリシーを入力し、Resource部分に1で作成したロールのARNを入力する
![32.png](https://qiita-image-store.s3.amazonaws.com/0/11653/6aa8c1b9-6fc3-da98-24e3-c4df00dc76b3.png "32.png")

### 2-3. Switch Role(ロールの切り替え)の設定をする
- 画面右上から「ロールの切り替え」を選択します
![34_1.png](https://qiita-image-store.s3.amazonaws.com/0/11653/144eafc5-3830-2920-9ff6-d6dc439ff09e.png "34_1.png")

### 2-4. ロールの切り替えを選択する
![35.png](https://qiita-image-store.s3.amazonaws.com/0/11653/4d40bee6-74d5-7981-1f06-b37dfd9ffd81.png "35.png")

### 2-5. ロールの情報を入力して切り替え設定をする
- スイッチ先のアカウントをロールを入力して「ロールの切り替え」を実行します
![37.png](https://qiita-image-store.s3.amazonaws.com/0/11653/a29c7a2e-77ec-06bd-6e63-c46e51b11682.png "37.png")

### 2-6. ロールの切り替えが行われる
- 本番アカウントに切り替わってることを確認します
- 開発アカウントに戻るときは「shingoに戻る」となってる部分を押下して開発のIAMユーザーに切り戻します
![38_1.png](https://qiita-image-store.s3.amazonaws.com/0/11653/91a6820a-6ae8-af95-d1de-284e94e5cada.png "38_1.png")


# その他考慮ポイント
## MFAのつけどころ
1-3でスイッチ時にMFAがつけられると紹介しましたが、どこでMFAをかけるかはどこのセキュリティレベルを上げるか、同一レベルとするかの考え方によって以下のようなつけどころが変わるかなと思います。

- 開発アカウントへのログイン時のみ（スイッチする際はMFA不要）
- 開発アカウントへのログイン時、およびデモ用／本番用へのスイッチ時にも
- 開発アカウントは不要、デモ用／本番用へのスイッチ時のみ
Wordpressでの確認画面付きフォーム利用

<article>
	<section>
		<h1>WPでの確認画面付きフォーム利用について</h1>
		<h2>Contact Form 7の利用</h2>
		<p>　こちらのContact Form 7でフォーム送信を利用する場合、デフォルト設定で確認画面を表示することが出来ません。</br>Contact Form 7ではプラグインを利用すれば確認画面実装は可能ですが、今回はデフォルトで確認画面付きのプラグインを使うことにします。</p>
	</section>
	<section>
		<h2>MW_WP-FORMの利用</h2>
		<p>　こちらのMW_WP-FORMではデフォルト（プラグイン等不要）で、フォームに確認画面を実装することが出来ます。</br>インターネットでも情報がそこそこ有り、使い勝手は悪く無いかと思われます。（情報量で言えばさすがにContact Form 7に劣りますが・・。）</p>
<h3>☆インストール方法</h3>
<ol>
<li><strong>管理画面内メニューよりプラグインをクリック</li>
<li><strong>新規追加をクリック</li>
<li><strong>検索ボックスより「MW WP form」</li>
<li><strong>対象プラグインの「すぐにインストール」をクリック</li>
<li><strong>プラグインを有効化する</li>
</ol>
<p>　設定自体はこれでおしまいです。そんなにひねったこともありませんが、検索して見つからなかった場合、HPより直接ダウンロードしましょう。</p></br>
http://plugins.2inc.org/mw-wp-form/
<h3>☆使い方</h3>
<ol>
<li><strong>管理画面よりMW WP FORMの新規追加をクリック</strong><br><br>
</li>

<li><strong>フォームを作りこむ！</strong>
<p>　フォームのレイアウトは特に制限はありません、ここにHTML形式でガツガツ書きましょう！注意点としては、表示方法を「テキスト」にして入力を行います。デフォルトが「ビジュアル」になっているので、これをテキストへ変更しておきます。（もしビジュアルで入力した場合、HTMLコードのまま出力されてしまいます・・。私はこれではまりました笑）スタイルはstyle.cssに別途記述しましょう。<br><br>
　確認画面や完了画面の移行ボタン（submit）は、入力画面内にある「フォームタグ」より挿入します。また、入力画面時にだけ表示されるボタン、確認画面時にみ表示されるボタンと種類があるので選んで挿入しましょう！<br><br>
</li>

<li><strong>URLへ確認画面や完了画面のパーマリンクを入れる</li>
<p>
　MW WP FORM内、右上あたりにあるに「表示オプション」よりURL設定にチェックを入れます。その後、画面下にURL設定が表示されるので、ここに確認画面完了画面等のパーマリンクを入力しておきます。このリンク先が文字通り確認、完了画面になります。
<p>

<li><strong>フォーム識別子をコピーしてテンプレートに貼り付ける</strong>
<p>　MW WP FORM内の「フォーム識別子」をコピーして、それをテンプレートに貼り付けて作成したフォームを呼び出します。<br>
echo do_shortcode( '[mwform_formkey key="xxxx"]' );<br>
これをテンプレートへ貼り付けます。<br>
<strong>⚠ここで注意点⚠</strong><br>
　入力画面、確認画面に同じフォーム識別子をいれます！<br>
　確認画面は、入力画面のinput要素の位置にテキストが挿入された状態で表示されます。（もちろん入力不可。）また、確認画面で非表示にしたいinput部分が合った場合、私は確認画面のテンプレートにjavascriptでそのDOMを掴んで非表示にしました。

</li>

</ol>
	</section>
</article>
ユーザーさん。もうこのDOMエレメント既読済みですか？(angularで)

#ユーザーさん。もうこのDOMエレメント既読済みですか？(Angularで)
メッセージアプリをangularjsを利用して作っているのですが、ユーザーがメッセージを既読したかどうかって、どうやって読み取ればいいのか探していて以下の結論に至りました。

サンプルはこちら↓↓↓
https://jsfiddle.net/h54sn6o7/1/
※AngularJS 1.2.1

##やりたいこと
スクロールしたときに、DOMエレメントがWindow内に入ったどうかを検出して、既読済みのメッセージを{read: true}にしていく。

##コード
###html

```html
<div ng-app="myApp">
  <div ng-controller="MainCtrl as main">
    <ul ng-repeat="message in main.messages">
      <li msg content=message ng-class="{message: message.read }">{{message.text}}</li>
    </ul>
  </div>
</div>
```

###css

```css
.message{
    color: red;
}
```

###js

```js
"use strict";

angular.module("myApp", []);

angular.module("myApp").directive("msg", ["$window", function($window){
    return {
        restrict: "A",
        scope: {
            content: "="
        },
        link: function(scope, element){
            angular.element($window).bind('scroll', function () {
                var elementY = element[0].offsetTop;
                var pageTop = this.pageYOffset;
                var pageBottom = this.pageYOffset + this.innerHeight - 50;
                if(elementY > pageTop && elementY < pageBottom){
                    scope.content.read = true;
                    scope.$apply();
                }
            });
        }
    }
}]);

angular.module("myApp").controller("MainCtrl", function(){
    this.messages = [];
    for(var i = 0; i < 100; i++){
        this.messages[i] = {
            text: "message" + i,
            read: false
        }
    }
});

```

##考察
そんなに難しいことではないので、どっかに同じこと書いてる人いそう。
記法でまずいところがあったら教えてください。

##Angularではパフォーマンスを意識しなければいけない。
Angularって、すんなりやりたいことを書けてしまう反面、裏で何が行われているかしっかり理解しとかないとパフォーマンスが落ちてきますよね。
私自身、パフォーマンスまで意識が回らず、まずい書き方をしてしまう。
今回、@armorik83パイセンから助言をいただきました。
>scrollやresizeといったウインドウイベント系はlodash.throttle()辺りでイベント発生を間引くのがベターで、そのままでは処理負荷がけっこう大きいです。
今回の例ではマウスホイールを少し転がすだけで数百イベントが発行され、ng-class="{message: message.read}"の時点で数百のDOM操作が発生しているので、数千msオーダーでパフォーマンスが悪化します。

なるほど。実際に実装する時は$timeoutとかで間引いいていたのですが、lodashを使う方法もあると。こっちの方がコード量が減りますね。
https://lodash.com/docs#throttle
https://jsfiddle.net/h54sn6o7/3/
こんな感じでしょうか。
パイセン。いつもお世話になります。

##と思いきや
このやり方は少し違っているようで
>ウインドウイベントをlodash.throttle()辺りで逃がすのは常套句なんですが、今回のケースだとmsgDirectiveのlink()で全要素に対してscrollがbindされていて、逃がす逃がさないの問題とすこしワケが違ったので、書き直しました。
ちなみに、挙動を確認したところ今回の例ではthrottle()は実は適していなくて、スクロールしているのに既読にならないメッセージと既読になるメッセージとバラつきがありました。あまり読まずにコメントしたものだから、すいません。
https://jsfiddle.net/h54sn6o7/5/
'throttle()'で逃さず全スクロールイベントを拾っているので、スクロールごとに処理は発生してますが、単純に、既読判定が不要なDirectiveはifで逃してます。この1行でパフォーマンスは4倍程度改善しました。

とのこと。
負数を含む数値の表し方 > 2の補数表現 / オフセットバイナリ

負数を含む数値の表し方には色々あるが、自分が関係するものとしては以下の２つがある。

- 2の補数表現
- オフセットバイナリ

これらの使いわけについてはまだまだ勉強不足。

http://d.hatena.ne.jp/natsutan/20081104/1225770179
> [2の補数]
一般的なプロセッサを使う場合、負の数に2の補数を使うことになります。符号によらずALUを共通化できるため、一般的に浸透しています。見た目では負の数がわかりにくいところがデメリットです。

> [オフセット・バイナリ]
これは最小値を0としてオフセット表現をしています。AD/DAとデータのやりとりをする場合は、この形が多くなります。演算自体はそのまま出来ないので、若干工夫が必要です。見た目で大小関係がわかりやすい事と、AD/DAで言えば最大最小間のどのあたりになるのかが直感的にわかるのがメリットです。

https://www.altima.jp/column/fpga_edison/bit_number_signed.html
> [オフセット・バイナリ]
単純な演算はこのままではできませんが、数の大小は分かりやすい表現になっています。


AD取込み時に2の補数かオフセット・バイナリで取るか選択できるものがある。プロセッサで得意な2の補数を最終形とするのであれば、オフセットバイナリにする意味がないように思われる。

オフセット・バイナリを最終形とする例がまだまだ分かっていない。

http://jaco.ec.t.kanazawa-u.ac.jp/edu/android/psoc.html
> [ADCの出力データ形式]
> ADCの出力データは、2の補数と符号無しが選択できますが、AGNDに対して、負電圧を測る可能性がある場合は、2の補数を使用すると負電圧が負の整数に対応するので便利です。ところが、受信側で文字列として受け取り、符号付き整数に変換されるとややこしい問題が起こります。簡単な対処法として、2の補数からオフセットバイナリ形式に変換して、負数を無くしてから送ることにします。受け取った後で、オフセット値を減算します。

2の補数のまま送信した時のややこしさがまだ理解できていない。減算するオフセット値がわかるのなら、2の補数でも受信側で元にもどせないのだろうか?
nmapコマンドでポートが開いているかを調べました

nmapコマンドを使用して、サーバー何番のポートが開いているか確認しました。ポートが開いているかをしらべることをポートスキャンと呼ぶそうです。

# nmapでポートが空いているか調べる
nmapコマンドの使い方です。

```bash:nmapでポートの確認
nmap ホスト名
```

# 80番ポートが開いているかを調べました

```bash:nmapで80番ポートを調べる
nmap -sT 80 example.com

略
PORT   STATE SERVICE
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 1.47 seconds
```
openとなっています。

# 22番ポートが開いているから調べました
20-22のようにするとポートをまとめて調べられるようです。`,`でつなぐと複数ポートを探せるみたいなので80番をつないでみました。

```bash:nmapで20-22番ポートを調べる
nmap -p 20-22,80 example.com

略

PORT     STATE SERVICE
20/tcp filtered ftp-data
21/tcp filtered ftp
22/tcp open     exp2
80/tcp open     http

Nmap done: 1 IP address (1 host up) scanned in 2.56 seconds
```
21番のftpは開いていなくて22番は開いてることがわかりました。

# 参考
清く、正しい、nmapの使い方
http://www.yk.rim.or.jp/~shikap/security/use_nmap.html
RmdをQuickLookでみたい

Rを使うのに便利なRstudioでは、Rのコードを含んだマークアップファイル R Markdown 形式を使用できます。
このRmdファイルをMacのQuickLookで表示できると幸せになれるかと思い、メモを残します。

QuickLook pluginを自作なんてできないので、
MarkDownのQuickLook pluginである QLMarkdown.qlgenerator を
ちょこちょこと修正してみます。

## QLMarkdown.qlgeneratorをゲット
こちらのurlからダウンロード
https://github.com/toland/qlmarkdown/releases

## QLMarkdown.qlgeneratorをXcodeで修正
QLMarkdown.qlgeneratorを右クリックして、パッケージの内容を表示し、Info.plistをXcodeで開きます。

検索を駆使して、
1) Conforms to UTIsにpublic.dataを追加する
2) Equivalent Typesにpublic.filename-extensionにRmdを追加する

## QLMarkdown.qlgeneratorを Library/QuickLookフォルダにコピーする
修正したQLMarkdown.qlgeneratorを放り込みます。

##  Finderを再度開く
DockのFinderアイコンをOption+右クリックして、Finderを再起動します。

## 好きなRmdファイルでQuickLook !
やっていることは、Rmdファイルをmdと同じように扱っているだけで、
Rのコードをハイライト表示とかはできてません。

QuickLook pluginの修正については、こちらのページを参考にさせていただきました。
http://blog.livedoor.jp/tek_nishi/archives/8199974.html
Fuel_PHPの論理削除でエラー

Model_Softクラスを使って論理削除を実装したときに少しハマったのでメモ。

Relationの設定がkey_fromがhoge_id、key_toが主キーとなっているモデルでdeleteメソッドを実行すると
Primary key on model　（モデル名） cannot be changed deleteというエラーが出た。

FuelPHPのドキュメントを参照しても以下の文章しかなく、手詰まりだった。
```
delete メソッドは、 cascade_delete が true である関係を持ったモデルも論理削除します。その関係モデルが論理削除モデルでなかった場合は、 RelationNotSoft 例外が投げられます。
```
勿論、cascade_delete=>falseにしてもエラーは解消されない。

いろいろググった結果、Relationの設定がhas_oneだったのが原因らしい。
belongs_toにしたら無事動いた。
gemのBulletの設定を書いたらエラーがでました

RailsでgemのBulletを使用しようとしたところ、エラーが出て困りました。

BulletはN+1問題のログを出力してくれたりする便利gemです。Gemfileに書いて`bundle install`をした後に公式のままでやってみたところエラーがでました。

# Bulletの設定をdevelopment.rbに記述
Github : https://github.com/flyerhzm/bullet 
上記にはdevelopment.rbに`config.after_initialize`を書くようにあります。

```rb:development.rbに追記
vi config/environments/development.rb

config.after_initialize do
  Bullet.enable = true
  Bullet.alert = true
  Bullet.bullet_logger = true
  Bullet.console = true
  Bullet.growl = true
  Bullet.xmpp = { :account  => 'bullets_account@jabber.org',
                  :password => 'bullets_password_for_jabber',
                  :receiver => 'your_account@jabber.org',
                  :show_online_status => true }
  Bullet.rails_logger = true
  Bullet.honeybadger = true
  Bullet.bugsnag = true
  Bullet.airbrake = true
  Bullet.rollbar = true
  Bullet.add_footer = true
  Bullet.stacktrace_includes = [ 'your_gem', 'your_middleware' ]
  Bullet.slack = { webhook_url: 'http://some.slack.url', foo: 'bar' }
end
```
development.rbに上記を記述したところエラーがでるようになりました。

# rails sがエラー
`rails s`でサーバーを立ち上げようとするとエラーがでてしまいます。

```bash:serverがスタートできない
bundle exec rails s -b 0.0.0.0 -p 8888

/home/vagrant/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/uniform_notifier-1.8.0/lib/uniform_notifier/growl.rb:16:in `rescue in rescue in setup_connection': You must install the ruby-growl or the ruby_gntp gem to use Growl notification: `gem install ruby-growl` or `gem install ruby_gntp` (UniformNotifier::NotificationError)

# もしくは

/home/vagrant/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/uniform_notifier-1.8.0/lib/uniform_notifier/xmpp.rb:26:in `rescue in setup_connection': You must install the xmpp4r gem to use XMPP notification: `gem install xmpp4r` (UniformNotifier::NotificationError)

# もしくは

/var/www/html/pugiemonn.com/config/environments/development.rb:49:in `block (2 levels) in <top (required)>': undefined method `honeybadger=' for Bullet:Module (NoMethodError)
```
つまり`ruby-growl`や`xmpp4r`、`honeybadger`というgemがないから入れろとメッセージにかかれています。

# development.rbから該当箇所を削除
設定に書いてあったgemなどrakeでエラーがでたものはとりあえず使用しないので削除しました。

```rb:development.rbから設定を削除
vi config/environments/development.rb

config.after_initialize do
  Bullet.enable = true
  Bullet.alert = true
  Bullet.bullet_logger = true
  Bullet.console = true
  Bullet.rails_logger = true
  Bullet.bugsnag = true
  Bullet.airbrake = true
  Bullet.add_footer = true
  Bullet.stacktrace_includes = [ 'your_gem', 'your_middleware' ]
end
```
とりあえずエラーはでなくなりました。
ほかにも使用しない機能は削除しておくと良いですね(☝ ՞ਊ ՞)
ノンデザイナー開発者向け 学習コストをかけずにiOSアプリ用アイコンを作る方法(Mac)

##学習コストをかけずにアイコンを作りたい...!


あまりデザインに詳しくない開発者がアプリ開発するとき、けっこうハードルが高いのがアイコン作成だと思います。
「人は見た目が９割」というようにアプリの顔であるアイコンで手を抜いたら、せっかく時間をかけて作ったアプリの価値まで落としてしまうかもしれません。

**「でも ”Illustlator” のようなプロ向けツールにお金を払うほどでもないし、そもそも使い方わかんないし…」**

心配いりません。凝りに凝ったアイコンでなければお金と学習コストをかけずに作成することができます。

必要なのは以下の３つです。

###Keynote
　純正のプレゼンソフトですね。アイコン作成にも意外と使えます。Windowsならパワポでもいけるかも。
　もちろんAppStoreで手に入れてください。

###Seashore
　フリーの画像編集ソフトです。開発は終了しているようですが、今でもダウンロードは可能です。
　詳しい使い方は私もあまり知りません。
　[こちら](http://seashore.sourceforge.net/The_Seashore_Project/About.html)で手に入れてください。

###アイコン生成サービス
　一つの画像からアプリ開発に必要なサイズのアイコンを生成してくれる便利なWebサービス、探せばいろいろあると思います。
　私はこちらを使っています →[MakeAppIcon]( http://makeappicon.com/)

#それではアイコンを作っていきましょう
##①keynoteでアイコンを作る
 keynoteファイルを新規作成し、スライドのサイズを縦横 1024pt の正方形にしましょう。
この正方形いっぱいにアイコンを作成していきます。

ご存知の通りアイコンは最終的に隅が丸みを帯びた形となります。
これを見越して　縦横1024pt、角の半径180ptの四角を重ねておきましょう。

![スクリーンショット 2015-05-10 15.06.29.png](https://qiita-image-store.s3.amazonaws.com/0/51303/c4efa1b7-ae21-eef1-6935-a9ba7f86c4cb.png)

※ 角の半径はアイコンの仕様によって変わる可能性があるので最新情報をチェックしてください。
※別に丸みを帯びた画像を作らなくてもアイコン生成サービスによっては自動で成形をしてくれるかもしれません。

作ったスライド上でお好きなアイコンを作ってください。
Keynoteは単純な図形しか基本使えませんが、いろいろ組み合わせれば意外と作れます。

複雑な曲線を持った図形でも「ペンで描画」を使えばそんなに難しくありません。
例えば下地になるアイコン画像を置いて、それに沿うように曲線を作ったり。

私は以下のような画像を作りました。(タイマー → 砂時計をイメージしたつもり ^^;)
![スクリーンショット 2015-05-10 15.16.05.png](https://qiita-image-store.s3.amazonaws.com/0/51303/1c292fce-2efd-fdd6-5982-4135eba45c4b.png)

##②seashoreで画像に変換する
Keynoteスライド上に作ったアイコン = 図形の集まりを画像に変換していきましょう。
⌘ + A でスライド上の図形を全選択し、グループ化します。グループ化したら図形をコピーしといてください。

ダウンロードしたSeashoreを起動しましょう。熱帯魚のアイコンが爽やかですね。

![スクリーンショット 2015-05-10 15.14.26.png](https://qiita-image-store.s3.amazonaws.com/0/51303/5366bb61-939a-2409-d3a4-47446a7515e0.png)

まず設定ダイアログが現れます。画像のように設定して”Create”を押してください。

![スクリーンショット 2015-05-10 15.15.04.png](https://qiita-image-store.s3.amazonaws.com/0/51303/0209a8fe-9c2b-1620-6847-17f1ed1bc73c.png)

起動した画面に先ほどKeynoteでコピーした図形を貼り付けましょう。普通に⌘ + Vでok。
ぴったりアイコン画像が重なるはずです。

![スクリーンショット 2015-05-10 15.56.34.png](https://qiita-image-store.s3.amazonaws.com/0/51303/650f4797-2ffc-9908-f75c-0292e696bb04.png)

アイコンをPNG形式で書き出します。
ツールバー → File → Save As… を選んでください。
画像の保存形式はデフォルトで ”GIMP image” となっていますが **“Portable Network Graphics image”** に変更します。

好きな場所に保存しましょう。完成までもう一息です。

##③アイコンを生成する
　上のほうで紹介したアイコン生成サービスなんかを利用してPNG画像をアイコンに変更します。
　[MakeAppIcon](http://makeappicon.com/)では必要なアイコン一式がメールで送られるようになっています。
　便利ですね。

![スクリーンショット 2015-05-10 15.33.55.png](https://qiita-image-store.s3.amazonaws.com/0/51303/77a03882-aaf3-f7bf-39ab-1f2fe85db373.png)

　以上で完成です！簡単でしたね！
van_de_Hulst > typo > 9.4. > m tilde \dot m2

Kindle No. 3251 の文章中


以下がKindle version (typo)
>except the complex refractive index of the medium with suspended particles, which now is 

```math: 
\tilde{m} \eta m_2
```


以下が書籍(correct)

>except the complex refractive index of the medium with suspended particles, which now is 

```math: 
\tilde{m} \dot{} m_2
```
van_de_Hulst > typo > 9.4. > lambdaの式

9.4. Kindle No.3251の式

以下がKindle version (typo)

```math
\lambda = \lambda_{vac}/m^2
```

以下が書籍 (correct)

```math
\lambda = \lambda_{vac}/m_2
```

上付き下付き化事項。
van_de_Hulst > typo > 9.4. > m tildeの式

Kindle No.3229 m tildeの式

以下がKindle version (typo)

```math
\tilde{m} = 1 - iS(0) \dot{} 2 \pi N k^{-3}.= 1-iS(0) \eta 2 \pi Nk^{-3}
```

以下が書籍 (correct)

```math
\tilde{m} = 1 - iS(0) \dot{} 2 \pi N k^{-3}.
```

途中まで電子化しようとしたけど忘れた、みたいな。
投げっぱなしジャーマンスープレックス、みたいな。
van_de_Hulst > typo > 9.32. > Qprの式

Kindle No.3187のQprの式の間違い

以下がKindle version (typo)

```math
Q_{pr} = Q_{ext} - \overline{cos\theta} \eta Q_{sca} 
```

以下が書籍 (correct)

```math
Q_{pr} = Q_{ext} - \overline{cos\theta} \dot{} Q_{sca} 
```

etaは余計だ。
van_de_Hulst > typo > 9.31. > 最後の式

9.31の最後の式

以下がKindle version (typo)

```math
i_1 = ^| S_1(\theta) ^{|2} and i_2 = ^| S_2(\theta) ^{|2}
```

以下が書籍(correct)

```math
i_1 = | S_1(\theta) |^{2} and i_2 = | S_2(\theta) | ^{2}
```

本来上付きでないところが上付きになっている。
van_de_Hulst > typo > 9.31. > 2つめの式全滅

9.31. Kindle位置 No. 3117の2つめの式は全滅している模様。

以下がKindle version (typo)

>the following functions of the scattering angle appear:

```math
\pi_n(cos\theta) = \frac{dP_n(cos\theta)}{dcos\theta}
```
```math
\tau_n(cos\theta) = cos\theta \dot{} \pi_n(cos\theta) - sin^2\theta\frac{d\pi_n(cos\theta)}{dcos\theta}
```

以下が書籍(correct)

>the following functions of the scattering angle appear:

```math
\pi_n(cos\theta) = \frac{1}{sin\theta}P_n^1(cos\theta)
```

```math
\tau_n(cos\theta) = \frac{d}{d\theta}P_n^1(cos\theta).
```

何をどう間違ったかというと、この下にある式を間違って２回書いているようだ。
人為的ミスのように思われる。
van_de_Hulst > typo > 9.22. > 最後の式

9.22の最後の式

以下がKindle version (typo)

```math:
\psi'_n(x)\xi'_n(x) - \psi'_n(x)\xi'_n(x) = i
```

以下が書籍 (correct)

```math:
\psi'_n(x)\zeta_n(x) - \psi_n(x)\zeta'_n(x) = i
```

zetaをxiと間違えたり、余計な"'"がついていたり。
van_de_Hulst > typo > 9.22. > No.3101 2つ目の式

9.22. Kindle版 位置No.3101の２つめの式

以下がKindle version (typo)

```math:
\xi_n(z) = \psi_n(z) = i\chi_n(z).
```


以下が書籍 (correct)

```math:
\zeta_n(z) = \psi_n(z) + i\chi_n(z).
```

xiとzetaを自動識別するには無理があるかも。
+を=と認識するのはどうしてだろう?
van_de_Hulst > typo > 9.12. > 最後の式

9.12. Periodic Fieldsの最後の式

以下がKindle version (typo)

```math:
\psi = e_{ikmz + i\omega t}
```

以下が書籍(correct)

```math:
\psi = e^{ikmz + i\omega t}
```

上付きを間違って下付きにしているのが結構多い気がする。
van_de_Hulst > typo > 9.12. > 式(4a)の次の式

9.12. Periodic Fieldsの式(4a)の次の式の間違い

以下がKindle version (typo)

```math:
\Delta \psi = -k^2 m^2 \psi). 
```

以下が書籍 (correct)

```math:
\Delta \psi = -k^2 m^2 \psi. 
```

")"が余計.
Perl モジュールの標準的なバージョンナンバリング方法

プログラムのバージョン番号の宣言方法について、深く考えたい人はそんなにいないと思いますが、Perl においては色々なやり方があり、やや複雑な事情があるようです。[^1]
CPAN モジュールなどを見ていても、各々流儀が違っており、正に「道は1つではない」という Perl の思想が現れているようにも思えます。

[^1]: [Version numbers should be boring | David Golden](http://www.dagolden.com/index.php/369/version-numbers-should-be-boring/)

そういう状況なので、初めて自分でライブラリモジュールを作るような場合、どのようにバージョン番号をつければいいか悩む人もいるだろうと思います。

というわけで、この文書では、いくつかの代表的・標準的なやり方を紹介することで、これから Perl プログラムを開発・保守する方の助けになれればと思います。

誤記などあればご指摘下さい。

主に以下の2文書を参考にしています。

- [version - バージョンオブジェクトのための Perl エクステンション - perldoc.jp](http://perldoc.jp/docs/modules/version-0.77/version.pod)
- [perlmodstyle - Perl モジュールスタイルガイド - perldoc.jp](http://perldoc.jp/docs/perl/5.20.1/perlmodstyle.pod#Version32numbering)

## CPAN 準拠の浮動小数点(X.YY)スタイル

10進数バージョンとも呼ばれています。
次のような宣言方法です。

```pl
our $VERSION = "1.12";
```

正しい CPAN バージョン番号は、小数点の後に少なくとも 2 桁の数字がある 浮動小数点数とのことです。

「ベータ」や「アルファ」のモジュールをリリースする場合、`1.13_01` のように正規のバージョン番号の後に "_" を付け、続いて最低2桁の番号を付します。
こうする場合、以下のような宣言方法になります。

```pl
our $VERSION = "1.12_01";
our $XS_VERSION = $VERSION; # only needed if you have XS code
$VERSION = eval $VERSION;
```

## ドット付き 10 進数バージョン(vX.Y.Z)

これは次のいずれかの宣言になります。

```pl
use version; our $VERSION = 'v0.12.1';
```

```pl
use version 0.77; our $VERSION = version->declare('v0.12.1');
```

後者が version.pm のドキュメントで紹介されている正式なスタイルですが、前者でも Perl 5.8 以降で正しく動くようです。[^2][^3]
従って、前者がより汎用的な書き方と言えそうです。

[Semantic Versioning](http://semver.org/) ライクな宣言ができますが、完全に準拠しているわけではなく、例えば 'v1.0.0-alpha' のような記法はできないようです。[^4]

[^2]: [Tatsuhiko Miyagawa's blog — How to correctly use semantic version (vX.Y.Z) in perl modules](http://weblog.bulknews.net/post/35296543758/how-to-correctly-use-semantic-version-vx-y-z-in)
[^3]: 執筆時点の [Carmel](https://github.com/miyagawa/Carmel) では `use version; our $VERSION = version->declare('v0.1.22');` になっていました。
[^4]: 手元の version.pm (v0.9902) で `version->parse('v1.0.0-alpha')` を試したところ `Invalid version format (non-numeric data)` とエラーになってしまいました。

## その他参考

- "Module version numbers best practice" : http://www.perlmonks.org/?node_id=1058778
- [SemVer - search.cpan.org](http://search.cpan.org/~dwheeler/SemVer-v0.6.0/lib/SemVer.pm) ... Semantic Versioning v1.0.0 に準拠したモジュールのようです。

## 脚注
van_de_Hulst > typo > 9.12. > A = (alpha + i beta)...

9.12. Periodic Fieldsの最初の式の間違い

以下がKindle version (typo)

```math:NG
A = ( a + i\beta)e_{i\omega t}
```

以下が書籍 (correct)

```math:OK
A = ( \alpha + i\beta)e^{i\omega t}
```

alphaがaになっていたり、iwtが下付きになってしまっている。
van_de_Hulst > タグの説明 (about the tag)

H.C. van de Hulstが書いたLight scattering by small particles.という本がある。この本はKindle版が出版されて久しいが、残念ながら、様々な式において電子化時点の間違いが含まれている。

> There is a book named "Light scattering by small particles" written by H.C. van de Hulst. Months have passed since the first publication in the Kindle version. However, there still are many typos in the Kindle version. 
 
amazonに式の間違いを連絡しても修正はかからない。

> I have contacted the amazon for the typo correction without any correction up to now (as of 2015 May. 10).

本タグ（van_de_Hulst）において、書籍版の内容を参照しながら、電子版の間違いを列挙していく。

> In this tag "van_de_Hulst", I list up corrections for what I found to be typos in the Kindle version by referring to the printed version of the book.


To see the corrections:
http://qiita.com/tags/van_de_Hulst/items

<hr>
作業記録 (work log)

- 2015/05/10 Finished listing up for Chapter 9.
- 2015/05/21 Didn't find typos in Chapter 1,2.  
- 2015/05/23 Finished listing up for Chapter 3.
WEBrickでサーバを起動する

ワンライナーといかないまでも、1ファイルでそれなりに動くWebサーバが欲しかったのでRubyの標準ライブラリのWEBrickで書いた。

後述のコードを`~/bin/webrick`あたりにコピーして実行権限を付けて起動する。要ruby。1.8系でも動く。

起動オプションとしては

- `-d`でデーモンとして起動する
  - 停止するときは`ps`とかからプロセスを調べてkillする
- `-p`でポート番号を指定する。デフォルトは8000
- `-r`でルートディレクトリを指定する。デフォルトはカレントディレクトリ
- `-l`でアクセスログを出力するようになる。デフォルトはカレントディレクトリ直下の`access.log`

```rb:webrick
#!/usr/bin/env ruby
#
# -*- mode: ruby -*-
# vi: set ft=ruby :
 
require "optparse"
require "webrick"
include WEBrick
 
Process.setproctitle(File.basename(__FILE__)) if Process.respond_to?(:setproctitle)
 
options = {
  :Port => 8000,
  :DocumentRoot => Dir.pwd,
  :BindAddress => "0.0.0.0",
}
 
OptionParser.new do |opt|
  opt.on "-d", "--[no-]daemon" do |v|
    options[:ServerType] = Daemon if v
  end
 
  opt.on "-p", "--port PORT", Integer do |v|
    options[:Port] = v
  end
 
  opt.on "-r", "--root PATH" do |v|
    options[:DocumentRoot] = v
  end
 
  opt.on "-l", "--log [PATH]" do |v|
    v ||= "access.log"
    path = File.expand_path(v, Dir.pwd)
    f = File.open(path, "a")
    f.sync = true
    options[:AccessLog] = [
      [f, WEBrick::AccessLog::COMBINED_LOG_FORMAT]
    ]
  end
end.parse!(ARGV)
 
server = HTTPServer.new(options)
 
%w(INT TERM).each do |sig|
  trap(sig) { server.shutdown }
end
 
server.start
```