OmniAICreator/Qiita-1.07M huggingface dataset:
ある企業のIT予算額を推計する（年商に基づく推計）

企業のIT予算額を推計する一つの手段として、企業年商に基づく推計が挙げられます。この手法を用いる場合には、「企業年商に対するIT予算額の比率」を対象企業の年商に乗ずることにより、対象企業のIT予算額を推計します。

#「企業年商に対するIT予算額の比率」をどのように推測すべきか？
筆者の知る限りでは、経済産業省が毎年実施している「情報処理実態調査[^1]」の調査結果に含まれる「情報処理関係諸経費の状況」データ群に対する分析を行うことが、（公開データに基づき）「企業年商に対するIT予算額の比率」の実態を把握するための最良の手段となります。[^2]
この、「情報処理実態調査」の「情報処理関係諸経費の状況」データ群では「業種/年間事業収入規模別」、および「業種/総従業者規模別」での「情報処理関連諸経費」の「対年間事業収入比」（つまり企業年商に対するIT予算額の比率）が一覧表記されています。

#「企業年商に対するIT予算額の比率」の実態はどのようなものなのか？
「平成26年（2014年）情報処理実態調査」の結果に基づき、「情報処理関連諸経費」の「対年間事業収入比」（≒IT予算額の年商比）を年間事業収入規模別、また業種別に図示したグラフを以下に示します。

![graph01.png](https://qiita-image-store.s3.amazonaws.com/0/135979/ade01288-e35a-5e22-9411-a65bbdfe0ea0.png)

![graph02.png](https://qiita-image-store.s3.amazonaws.com/0/135979/2e7a552f-43b7-599c-c3c0-0c9146e67e1c.png)

上のグラフからは、「企業年商に対するIT予算額の比率」について、以下に示す傾向を読み取ることが出来ます。

+ 「情報処理関連諸経費」の「対年間事業収入比」（≒「企業年商に対するIT予算額の比率」）は企業の年間事業収入の規模と逆相関の関係にある
+ 「情報処理関連諸経費」の「対年間事業収入比」（≒「企業年商に対するIT予算額の比率」）は業種によって大きく異なる。

#特定企業のIT予算額を推計してみる
上述した手法に基づき、特定企業のIT予算額を推計してみます。推計は以下の手順に従い実施します。

1. 「平成26年（2014年）情報処理実態調査」の結果から、対象企業が属する業種、および対象企業が属する（年間事業収入観点での）企業規模における、「情報処理関連諸経費」の「対年間事業収入比」を確認する。
2. 確認した「情報処理関連諸経費」の「対年間事業収入比」を、対象企業の年商に乗ずる。

上述の手順に従い、「スーパーオオゼキ（東京に展開する地場の食品スーパー、筆者の普段使い）」のIT（年間）予算額を推定してみると以下の通りとなります。

+ 年間売上高
    + 945億円（2016年2月期）[^3]
+ 「情報処理関連諸経費」の「対年間事業収入比」（「情報処理実態調査」結果からの推計）
    + 0.5%（小売業、年間事業収入100億円～1,000億円）
+ 年間IT予算額（推計値）
    + 4.7億円

#推計したIT予算額をどのように活用するか？
推計したIT予算額をどのように活用するかは、活用するその人の立場により異なります。例えば、企業のシステム部要員にとっては、自社のIT予算額の妥当性を確認する、もしくは、競合他社との比較の観点で自社のIT投資の積極性スタンスを評価するといったような活用方法が考えられます。一方、企業に対してIT製品やITサービスを提供するITベンダーのマーケット担当者にとっては、顧客の予算感を確認することを通じて、顧客に提供する製品やサービスの価格をより適切に設定することが可能となります。

[^1]: http://www.meti.go.jp/statistics/zyo/zyouhou/
[^2]: 異論は認めます。ただ、分析対象データとしての対抗馬である「企業IT動向調査（日本情報システム・ユーザー協会が発行）」や「国内IT投資動向調査報告書（ITRが発行）」と比較した場合に、「情報処理実態調査」での調査対象の企業数が有意に大きいことは無視し得ないと考えます（2015年版の「情報処理実態調査」での回答企業数が3,961社であるのに対して、「企業IT動向調査2016」での回答企業数は654社、「国内IT投資動向調査報告書」での回答企業数は2000社超です）。
[^3]: http://www.ozeki-net.co.jp/financial/achieve/
CSS参考リンクのまとめ

:memo: 

## 命名規則
* [MindBEMding](http://csswizardry.com/2013/01/mindbemding-getting-your-head-round-bem-syntax/)
* [BEM](https://en.bem.info/)
* [OOCSS](http://getbootstrap.com/components/)
* [サイバーエージェントテックレポート メンテナブルCSS](https://www.cyberagent.co.jp/techinfo/techreport/report/id=7926)
* [OOCSS（オブジェクト指向CSS）のススメ](http://hijiriworld.com/web/oocss/)
* [第1回 OOCSSの基本](https://app.codegrid.net/entry/oocss-1)
* [htmlのid属性とclass属性の命名はハイフンかcamelかsnakeか](http://qiita.com/itagakishintaro/items/168667d5ee4c56b30d52)

## スタイルガイド
- [Google HTML/CSS Style guide](https://google.github.io/styleguide/htmlcssguide.xml)
- [bootstrap components](http://getbootstrap.com/components/)
- [【超訳】 Trello CSS Guide](http://qiita.com/naru0504/items/5427f3795171c540ed91)
- [高品質なCSSスタイルガイドラインをまとめた（日本語訳付き）](http://webhack.hatenablog.com/entry/2015/07/09/132855)
- [こんなHTMLとCSSのコーディング規約で書きたい](http://qiita.com/pugiemonn/items/964203782e1fcb3d02c3)

## CSS構文のチェック
* [CSS comb](http://qiita.com/yamanoku/items/9d10af70eb5b3f483146)
* [StyleStats](https://html5experts.jp/t32k/5743/)

## アンチパターン
- [Bootstrapをカスタマイズする上で必ず知っておきたい考え方](http://blog.yuhiisk.com/archive/2016/03/22/customize-the-css-of-bootstrap.html)
* [CSS設計破綻パターン](http://liginc.co.jp/184916)
* [WEBデザイナーが実際に出くわした良くないCSSのコードまとめ](http://ichimaruni-design.com/2015/12/css-practice/)
Laravel5でdate型から年、月、日を取り出してPluck(Lists)で使用する方法

### 前提

* postgresql を使用していること（必須）
* LaravelCollective を使用していること
（たぶんこれはforeach文などで代替できるでしょうが、これを使うほうがよっぽど楽です）

### 仮定

* DBに次のようなレコードが登録されているものとする
* 現在の日付は2016-08-24とする

```
テーブル名 tests
id date
1 2016-07-01
2 2016-07-31
3 2016-08-01
4 2016-08-15
5 2016-08-31
6 2016-09-01
```

### 何がしたいか

* 年と月による絞り込みをしたい
* しかし、現在の日付より未来の日付のものは表示しない（つまりid=1~4までを抽出）
* 上のレコードからこんな感じのフォームが生成されるといい感じ

```html
<form method="GET" action="/hoge">
	<select id="year" name="year">
		<option value="2016">2016年</option>
	</select>
	<select id="month" name="month">
		<option value="8">8月</option>
		<option value="7">7月</option>
	</select>
	<input type="submit" value="検索">
</form>
```

### 実装

* まず、optionにkeyとvalueを挿入するという要件はpluckを利用することで達成される。
* LaravelのVer5.2から追加されたメソッドで、listsと同じ動作をする
* LaravelのVer5.1以下を使用している人は以下のコードに出るpluckという文字列はlistsに変換して読み進めてほしい
* Ver5.2以上でlistsを使っている場合、それは非推奨要素として5.3以降で消えるらしいので、可能であればpluckに変えたほうがいい

* 年、月、日をdate型から取り出すにはDB::rawを使うしかない。（他のスマートなやり方を知っている人がいれば教えてちょ）

Controller「TestsController.php」

```app/Http/Controller/TestsController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;

use App\Test; // model名をここに記入

class NewsController extends Controller
{
    public function index()
    {
        // レコードの年を取り出し配列に格納。例 2016-08-24 -> 2016
        $years = Test::select(\DB::raw('DATE_PART(\'YEAR\', date) AS YEAR'))
                      ->where('date', '<=', 'now()')
                      ->orderBy('date', 'desc')
                      ->pluck('year', 'year');

        // レコードの月を取り出し配列に格納。例 2016-08-24 -> 8
        $months = Test::select(\DB::raw('DATE_PART(\'MONTH\', date) AS MONTH'))
                      ->where('date', '<=', 'now()')
                      ->orderBy('date', 'desc')
                      ->pluck('month', 'month');

        // レコードの日を取り出し配列に格納。例 2016-08-24 -> 24
        // 今回の要件では使わないのでコメントアウトしている
        //$months = Test::select(\DB::raw('DATE_PART(\'DAY\', date) AS DAY'))
        //              ->where('date', '<=', 'now()')
        //              ->orderBy('date', 'desc')
        //              ->pluck('day', 'day');

        return view('.hoge.index')->with(['years' => $years, 'months' => $months]);
    }
}
```

Model「Test.php」

```app/Test.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Tests extends Model
{
    protected $dates = ['date'];
}
```

View「index.blade.php」

```index.blade.php
<?php $now = new \DateTime('now'); ?>
<div class="search_box Fright">
	{{ Form::open(['url' => '/hoge', 'method' => 'get']) }}
	{{ Form::select('year', $years, $now->format('Y'), ['id' => 'year']) }}
	{{ Form::select('month', $months, $now->format('m'), ['id' => 'month']) }}
	{{ Form::submit('検索') }}
	{{ Form::close() }}
</div>
```
iPhoneで撮った写真から緯度経度を取得しQGISで取り込む

iPhoneで撮影した写真にはGPS情報が含まれます。このGPS情報を解析して、QGIS上にポイントとして落としてみます。使用するのはPILモジュールとOSモジュールを使用します。
CSVで出力したい場合はCSVモジュールも必要です。

写真メタデータ解析用の関数を作成

```get_exif.py
from PIL import Image
from PIL.ExifTags import TAGS

def get_exif(fn):
    ret = {}
    i = Image.open(fn)
    info = i._getexif()
    for tag, value in info.items():
        decoded = TAGS.get(tag, tag)
        ret[decoded] = value
    return ret
```

関数にファイルを投げ込むとディクショナリにメタデータが格納されます。使い方は↓

```py3
my_image = 'hogehoge.jpg'
metadata = get_exif(my_image)
```

メタデータの中身は色々です。撮影した時間や機種名、その他種々。下の画像はPythonのエディタ（Spyder）のValiable exploreで中身を確認した様子です。

![image](https://qiita-image-store.s3.amazonaws.com/0/27432/ba2ceda9-f1a3-cdb2-89d1-cd9ff8ce7450.png)

ディクショナリ項目GPSInfoの中にGPSの緯度経度情報が入っています。要素1は南北区分、要素2は緯度（度分秒）、要素3は東西区分、要素4は経度（度分秒）です。

```py3
In [1] print(metadata['GPSInfo'])
Out[1] {1: 'N', 2: ((31, 1), (35, 1), (1485, 100)), 3: 'E', 4: ((130, 1), (33, 1), (2132, 100)), 5: 0, 6: (11717, 787), 7: ((9, 1), (13, 1), (5680, 100)), 12: 'K', 13: (0, 1), 16: 'T', 17: (23003, 112), 23: 'T', 24: (23003, 112), 29: '2016:08:25', 31: (5, 1)}
```

度分秒単位はGISに投げ込むときに面倒くさいので、これを度単位に書き換えます。計算方法は以下の通り。

```py3
lon = int(metadata['GPSInfo'][4][0][0]) +
      float(metadata['GPSInfo'][4][1][0]) /60 + 
      (float(metadata['GPSInfo'][4][2][0])/float(metadata['GPSInfo'][4][2][1])) /3600
lat = int(metadata['GPSInfo'][2][0][0]) +
      float(metadata['GPSInfo'][2][1][0]) /60 +
      (float(metadata['GPSInfo'][2][2][0])/float(metadata['GPSInfo'][2][2][1])) /3600
```

対象ファイルが一つの場合は上述のやり方で問題無いですが、複数ファイルを扱いたいのが世の常です。なので以下の様なスクリプトを書きました。

```py3
import csv
import os

FileList = os.listdir()
WriteFile = open('photo_gps_point.csv','w')
writer = csv.writer(WriteFile, lineterminator='\n')

for pf in FileList:
    metadata = get_exif(pf)

    csvline = []
    csvline.append(pf)
    csvline.append(metadata['Model'])

    if 'GPSInfo' in metadata.keys():
        csvline.append(
         int(metadata['GPSInfo'][4][0][0]) +
         float(metadata['GPSInfo'][4][1][0]) /60 + 
         (float(metadata['GPSInfo'][4][2][0])/float(metadata['GPSInfo'][4][2][1])) /3600)
        csvline.append(
         int(metadata['GPSInfo'][2][0][0]) +
         float(metadata['GPSInfo'][2][1][0]) /60 +
         (float(metadata['GPSInfo'][2][2][0])/float(metadata['GPSInfo'][2][2][1])) /3600)
        writer.writerow(csvline)
    else:
        pass
WriteFile.close()
```

これで度単位緯度経度のCSVファイル（photo_gps_point.csv）が作成されました。
上述のコードでは作業の都合で撮影した機種名（Model）を入れていますが、これは無くても問題ありません。他に必要な項目があれば置き換えてもOKです。

# 参考（リンク切れ）
~~http://www.geopacific.org/opensourcegis/python/8q9u2w~~
Cloud9で快適開発環境構築

# Cloud9ってなに？

Cloud9はクラウドIDEを提供しているベンダ。同名のサービスである「Cloud9」では、Ruby on Rails、Node.js、PHP、C++、HTML5、Python、Goなど40以上の言語に対応し、開発環境をすぐに構築できるテンプレートがあらかじめ用意されているほか、Linux上に独自の環境をユーザーが構築することも可能。

# Cloud9なら簡単に環境を準備できる

- https://c9.io/ にアクセスして、アカウントを作成する。（github、bitbucketでログイン可）
- クレジットカードの登録が必須だが、無料で使い続けることが可能。（publicは無料、private、team、schoolは有料）
- 作成した環境に対して、githubのリポジトリ連携も可能。（試してないけどbitbucketも多分可能）
- ログイン後、workspaceごとに環境を構築できる。
- 全てブラウザ上で作業ができるので、OSを選ばない。

# 面倒な設定や追加課金不要でセキュアでパブリックなドメイン周りが手に入る

- [workspace]-[user].c9users.ioドメインがSSLで用意されるため、すぐにセキュアでパブリックなURLが試せる。


# Cloud9 IDEが高機能

- rails環境を一発コマンドで構築
`rails new xxx`
- workspaceは常にツリー表示
- サーバ操作、gemインストールはterminalウインドウからいつでも実行可能
- webサーバ起動もterminal
- ブラウザ確認もIDE上で可能

# あのAmazonが買収

[Amazon、クラウドIDEを提供する「Cloud9」買収。AWSが統合開発環境をSaaSとして提供する布石か](http://www.publickey1.jp/blog/16/amazonidecloud9awssaas.html)

以上
[gusuku] 組織にメンバーを追加する方法

# 課題

[チーム開発のために組織を作ってもらった](http://qiita.com/k_nishijima/items/3f282a42f12ed2cf0b57)ら、その組織にユーザーを追加することが出来ます。

しかし手順が（知らないと）若干厄介かもしれませんので、ご紹介します。

[![gusuku_logo.jpg](https://qiita-image-store.s3.amazonaws.com/0/133500/3a0f4bec-1475-e349-43c0-cd88056ea91b.jpeg ""gusuku_logo.jpg"")](https://gusuku.io)

[kintoneアプリケーション開発をサポートするプラットフォーム gusuku（グスク）](https://gusuku.io)

# 解決方法

組織の管理者権限を持っているユーザーは、組織にメンバーを追加することが出来ます。「組織メニュー」の「組織へのメンバー追加」にメールアドレスを入力するだけです。

### ただし、そのメールアドレスは事前にgusukuにサインアップしている必要があります。

gusukuのアカウントが無い状態で、追加するメールアドレス欄にメールアドレスを入力しても【指定されたユーザーが見つかりません。】というエラーになりますのでご注意ください。

# まとめ

まとめますと、組織を作ってもらい、そこにメンバーを追加する手順は以下のようになります。

* サポートに連絡して組織を作ってもらう
* この時点で自分が管理者になる
* 自分以外の追加したいメンバーが、gusukuにサインアップする
* そのメールアドレスを管理者が組織に追加する

1メールアドレスは1組織にしか所属できませんが、1組織のメンバー数は無制限ですので、ぜひチーム開発にご活用ください！
同一ネットワーク内にクラスターを2系統立てたら事故った

# 事象の内容
Heartbeat, Pacemaker, DRBDを使って某チケットシステムを冗長化していたのだが、しばらく前から下記ようなエラーログが大量に出てディスクを圧迫するようになった。
diskfullのアラートで気付いた(‘A’)

```bash
heartbeat: [1516]: ERROR: authtoken does not match, authtoken=fwa43wfa4g3a4ag4, authstr=f4waf43wafw4a
heartbeat: [1516]: ERROR: netstring authentication failed, s=###
14:(0)t=NS_ackmsg,26:(0)dest=pm-s,15:(0)ackseq=c2efe,28:(1)destuuid=T<98>^Vz.<A8>JߵHL<E7><AF><E3>W<BE>,25:(0)src=pm-p,27:(1)srcuuid=T<98>^Vz.<A8>JߵHL
<E7><AF><E3>W<BE>,14:(0)hg=571f08f9,14:(0)ts=57376ac1,8:(0)ttl=3,50:(0)auth=1 fwag43g4ga4fa4waf,%%%
heartbeat: [1516]: ERROR: MSG: Dumping message with 10 fields
heartbeat: [1516]: ERROR: MSG[0] : [t=NS_ackmsg]
ERROR: MSG[1] : [dest=pm-s]
heartbeat: [1516]: ERROR: MSG[2] : [ackseq=c2efe]
heartbeat: [1516]: ERROR: MSG[3] : [(1)destuuid=0x26d6e40(37 28)]
heartbeat: [1516]: ERROR: MSG[4] : [src=pm-p]
heartbeat: [1516]: ERROR: MSG[5] : [(1)srcuuid=0x26dbe20(36 27)]
heartbeat: [1516]: ERROR: MSG[6] : [hg=571f08f9]
heartbeat: [1516]: ERROR: MSG[7] : [ts=57376ac1]
heartbeat: [1516]: ERROR: MSG[8] : [ttl=3]
heartbeat: [1516]: ERROR: MSG[9] : [auth=1 d2dee8f32qr3warew4arewacdfe666a]
```

# 調査開始
なにやらクラスターの認証に失敗している模様。
/etc/ha.d/authkeys の中身は構築以来いじっていないし、タイムスタンプも随分前のまま。
しかもエラーが出ている割にはクラスターそのものは正常に稼動している不可解な事象。

# 原因
よーくログを見てみると**認証を試みている相手はなんとペアとは別のクラスターノード**だった。
実は同じブロードキャストドメイン内に全く別用途のクラスターを2セット設置していて、全員がペアを探すためにブロードキャストを飛ばしていた。
このため /etc/ha.d/authkeys が異なる（そもそもクラスター組めてはいけない）相手とひたすら認証しようとして大量のエラーを飛ばしていたというのが真相だった。
発生し始めた日付もエラー発生のタイミングが丁度その別クラスターを構築したタイミングとピタリと一致していた。

# 対処
ブロードキャストではなくユニキャストでペアを探すよう下のように設定を変更した。

```diff
vi /etc/ha.d/ha.cf
- bcast eth0
+ ucast eth0 192.168.0.10
```

# 教訓
* 無暗にブロードキャストを使わない
* 野良サーバーを自己満足でクラスタリングしない
[gusuku] チームで同じkintoneアプリを管理するためにまずすること

# 課題

kintoneアプリをチームで開発していて、チームの誰かがgusukuを利用していると、同じアプリを別の人もgusukuを使って管理したくなりますよね？

また、「オプション機能の試用を申込んでみよう！」と思った場合も同様に、gusukuの用語である「組織」というものが必要になります。

[![gusuku_logo.jpg](https://qiita-image-store.s3.amazonaws.com/0/133500/3a0f4bec-1475-e349-43c0-cd88056ea91b.jpeg "gusuku_logo.jpg")](https://gusuku.io)

[kintoneアプリケーション開発をサポートするプラットフォーム gusuku（グスク）](https://gusuku.io)

# 解決方法

なんと、gusukuには組織を自分で作る方法はありません！

[ユーザーサポート](https://gusuku.io/support/)に連絡し、作成して貰う必要があります。


* 「チームでgusukuを使いたいので組織を作ってください」
* 「オプションの＊＊＊を申し込みたいです」

などとご連絡ください！

もし同じチーム内で、既に組織に参加している人がいれば、その方に追加してもらうことも可能です。


# まとめ

gusukuのアカウント作成は無料です。
アカウントの共有などは行わず、各自アカウントを作成し、同じ組織に所属するようにしましょう。
Qiita > 要望 > user:xxx commenter:yyyで検索したい

Qiitaの記事で以下の2つで絞り込みができればうれしいです。

- user:
  - 記事の作成者
- commenter:
  - コメント投稿者

自分の過去の記事を探そうとして、「xxxさんがコメントしていた、あの記事」というのを思いつくのですが、その記事を探すのが困難です。

将来のバージョンアップ時にご検討お願いいたします。
ElasticBeanstalkのDockerrun.aws.jsonから ECRにdocker imageをpush するscript

# TL;DR
ElasticBeanstalkのDockerrun.aws.jsonからAmazon ECRに docker image をpushする
PrimaryなDocker Registryは docker hubなり quay.io なり、ECR以外のRegistryを利用している場合に
SecondaryなDocker RegistryとしてECRを利用するときにdocker imageをsyncする


# script

```rb

# Docker image sync quay.io to Amazon ECR
# require docker login over aws cli
# command here :
#   aws ecr get-login --region ap-northeast-1
#   and exec display docker login command
#   $(aws ecr get-login --region ap-northeast-1)
#
require 'json'

def targets
  # Dockerrun.aws.json
  json = open('./Dockerrun.aws.json') do |file|
    JSON.load(file)
  end
  images = []
  json['containerDefinitions'].each do |caontainer|
    images << caontainer['image']
  end
  images
end

def docker_pull(image)
  `docker pull #{image}`
end

def tag_change(image)
  new_tag = replace_repository(image)
  `docker tag #{image} #{new_tag}`
end

def docker_push(image)
  new_tag = replace_repository(image)
  `docker push #{new_tag}`
end

def replace_repository(image)
  repository, tag = image.split(':')
  repository.gsub!(%r{quay.io/hogehoge}, ecr_host)
  return "#{repository}:latest" if ARGV[0] == 'latest'
  "#{repository}:#{tag}"
end

def ecr_host
  'xxxxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com'
end

targets.each do |image|
  docker_pull(image)
  tag_change(image)
  docker_push(image)
end
```
Java Scanner 使い方


標準入力を読む時等使える.

Input bufferのキューに入っている入力を順に読んでいく.



## 以下使用例

この[問題](https://www.hackerrank.com/challenges/java-stdin-stdout)に対する回答

```.java
import java.util.Scanner;

public class Solution {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int i = scan.nextInt();
        double d = scan.nextDouble();
        scan.nextLine(); // nextDoubleでは行の最後まで読まれていない可能性があるためスキップしたい.
        String s = scan.nextLine();

        System.out.println("String: " + s);
        System.out.println("Double: " + d);
        System.out.println("Int: " + i);
    }
}

```

- `nextInt()`: Intを見つけるまでQueueを進めて、そのIntをQueueから出した時点でそのInt値を戻り値として返す.
- `nextDouble()`: Doubleバージョン
- `nextLine()`: 行の最後にたどり着くまでを、Queueから出して戻り値とする.
シリアル昔話

87年の「最新マイコン周辺LSI規格表」を見ると以下のようなチップが掲載されています。

|名称 |型名 |社名 |
|:-- |:--|:-- |
|UART (Universal Asynchronous Receiver Transmitter) |IM6402/6403|Intersil |
|ACIA (Asynchronous Communications Interface Adapter) |MC6850|Motorola|
|MPSC (Multi Protocol Serial Controller)|μPD7201A|NEC|
|SCC (Serial Communication Contoller)|Z8030|Zilog|
|UART (Asynchronous Communication Element)|INS8250|National Semiconductor|
|USART (Universal Synchronous Asynchronous Reciver Transmitter)|8251A|Intel|
|SIO (Serial Input/Output Controller)|Z8440-Z8442|Zilog
|SPCC (Serial Parallel Combination Controller)|LH8572|Sharp|

当時はCPUを作っているZilog,Intel,Motorola,National Semiconductorがそれに合わせてシリアルのチップも作ってました。それ以外の会社はCPUはOEMしてシリアルは独自に作っているというような感じだったと思います。当時は国内では8251が使用される事が多く、米国でのAT互換機はINS8250系でした。SCCは昔のMacintoshで使われていました。MacintoshはRS232ではなくRS422なインターフェースでした。INS8250は後にNS16450などになり機能拡張されていきます。2000年以降にリリースされたMIPSやARMなSOCのシリアルはこのINS8250系のインターフェースがほとんどです。他のチップは絶滅してしまったと思います。皮肉な事に唯一残ったINS8250系のオリジナルのNational Semiconductorはコンピュータ関係はやってないんじゃないかな。

NECの7201は後継として72001というチップがあったようです。

Intelの8251の初期化は0を数回送った後にリセットコマンド(0x40)を送りそのあとにモードの設定を送ります。モードの設定には非同期の場合、キャラクタ長などがあります。その後コマンドの設定を送ります。モードの再設定はまた0を送るところからになります。Intelの周辺チップとしては古い方と思われ、仕様が古い感じがします。

8251と8250はたまたま連番になってるだけで関係無いと思われる。また8250の方が後に開発されたもののようだ。マイコンの初めの8Bitの頃はIBMはPCをやってなかったのが80年台にはいってから16BitのPCに乗り出しそれで使われたのが8250だったので、海外では8250はポピュラーのようだ。

追記：National SemiconductorはTIに2011年に買収されていました。Zilogはかなり前に無くなったし、Motorolaは分社化されてFreescaleになっています。NECはルネサスになってちょっと元気になって、先日ルネサスがIntersilを買収するという報道がありました。Intersilはかなり前にマイコンからは手を引いて、パワーエレクトロ関係の会社になっているようです。Sharpは大変な事になってます。8251なんかは失敗の部類でしょうが、Intelは不死身ですね。

当時はいろいろあって面倒と思っていましたが、無くなってしまうとなんか寂しい気もしてきます。

余談ですが、Macintoshのシリアルは2ポート用意されモデムへの接続やプリンタへの接続にも使っていました。当時はプリンタはセントロニクスを使う事が多かったのですが、Appleはセントロニクスは採用しませんでした。パラレルインターフェースはSCSIだけという割り切りの良さが当時のAppleのセンスの良さを感じます。その他にローカルネットワークのAppleTalk(LocalTalk)にも利用されていました。AppleTalkではファイル共有やプリンター共有ができていました。またMIDIへの変換も[小規模な回路](http://www.loadsman.com/jal/midi/Macmidi.html)で実現できApple純正のMIDIインターフェースも存在していました。

![IMGP0335.JPG](https://qiita-image-store.s3.amazonaws.com/0/104066/0b930d17-4e8e-57ed-3afe-204090112f25.jpeg)

こちらも余談ですが、90年前後の関西電機のシリアルパラレル変換を開けてみました。Macにセントロニクスなプリンターを接続するための変換ケーブルでした。この頃は8051系のワンチップマイコンにプログラムを書き込んで実現していたようです。最近だとFT245とかPL2305などのワンチップでできたりします。ハードよりソフトの方が応用が効くのでハードでやってる事もソフト化するのかと思っていたらこれは逆でした。

![写真（2018-05-17 07.06） #2.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/36603eeb-a1ba-eea7-2a6d-ac25592633c1.jpeg)
csharp > Link > C# Online Snippet Compilerでデフォルト参照以外のDLLを使用する方法

C# Online Snippet Compilerにてデフォルトで使えるDLL以外を使う時の方法。

今後よく使いそうなのでリンク記事とします。

方法は@muro さんの[コメント](http://qiita.com/7of9/items/106f9db7832791c8e065#comment-880cb6ead66e8c834acf)を参照ください。
Crashlytics（Fabric）に届いたクラッシュレポートをチャットワークに通知する


Crashlytics側に連携設定がないからWebHookで頑張ってました民のみなさんに朗報です。いつの間にか入ってました。

![スクリーンショット_2016-08-30_9_34_05.png](https://qiita-image-store.s3.amazonaws.com/0/2276/4a4a8155-c34e-4824-f90f-bd9ffd4a0b6e.png "スクリーンショット_2016-08-30_9_34_05.png")

確かにドキュメントにも載ってる。

[Service Hooks — Fabric for Apple documentation](https://docs.fabric.io/apple/crashlytics/service-hooks.html)

設定方法
----------

APIトークンとRoomIDを登録するだけ！　お手軽！

![スクリーンショット 2016-08-30 9.49.15.png](https://qiita-image-store.s3.amazonaws.com/0/2276/722b5e66-7850-31ae-c2be-02b9953bd6fd.png "スクリーンショット 2016-08-30 9.49.15.png")

こんな通知が来ます
----------

![スクリーンショット 2016-08-30 10.02.04.png](https://qiita-image-store.s3.amazonaws.com/0/2276/29c61066-f875-c288-b3f3-ae13b796a2b9.png "スクリーンショット 2016-08-30 10.02.04.png")


2015年に入ってたらしい
----------

チャワ社の方がコミットしてくれてました。

https://github.com/crashlytics/crashlytics-services/commits/7e60ded314c32fcd522f984c5a1d3e17a19293ef/lib/services/chatwork.rb

気づかなかったわー。全然気づかなかったわー。一度設定したらしばらく見ないとこだから、WebHookのままで運用してたわー。

まとめ
----------

最高に捗りますね！
csharp > PointF[]の初期値リストを与える

関連 http://qiita.com/7of9/items/c1e67a19efcfa7eed500
関連 http://qiita.com/7of9/items/106f9db7832791c8e065#_reference-c13e1af3d9858fd88451

PointF[]型で初期値リストを与える方法を調べた。

参考 http://stackoverflow.com/questions/15388079/how-to-initialize-an-array-of-point

### code
http://ideone.com/KD3mFh

```csharp
using System;
using System.Drawing; // for PointF
using System.Collections.Generic;
using System.Linq;

public class Test
{
	public static void Main()
	{
		var P = new PointF[]
		{
			new PointF { X = 600, Y = 6},
			new PointF { X = 800, Y = 7},
			new PointF { X = 1000, Y = 10},
			new PointF { X = 1200, Y = 12},
			new PointF { X = 1400, Y = 14},
		};
		
		foreach(var element in P) {
			string msg = "(" + element.X + "," + element.Y + ")";
			Console.WriteLine(msg);
		}
	}
}
```

```txt:結果
(600,6)
(800,7)
(1000,10)
(1200,12)
(1400,14)
```

もっとコンパクトな書き方はあるかもしれない。
csharp > PointF構造体 > System.Drawing > .NET fiddle / ideoneではビルドできた  > C# Online Snippet Compilerでも可能になった

http://qiita.com/7of9/items/c1e67a19efcfa7eed500
にてビルドエラーがでた。

PointF型がないとのこと。

PointFで調べると
https://msdn.microsoft.com/ja-jp/library/system.drawing.pointf(v=vs.110).aspx
> 名前空間:   System.Drawing

`using System.Drawing;`
を追加してみたが、`PointF could not be found`のまま。

C# Online Snippet Compiler
上で実行しているが、System.Drawingは対応していないのかもしれない。
http://www.volatileread.com/utilitylibrary/snippetcompiler?id=74832

https://dotnetfiddle.net/
では同じコードをビルドできた。こちらはPointF型が見えている。

http://ideone.com/HxZorL
でもビルドできた。

(追記 2016/08/30)
@muroさんの[コメント](http://qiita.com/7of9/items/106f9db7832791c8e065#comment-880cb6ead66e8c834acf)にてC# Online Snippet CompilerでもSystem.Drawing;が使えるようになりました。

情報感謝。
プロセシングで、音楽に合わせてpointを動かす

音の波形を円状にして表示します。
音の波形の参考にさせてもらったサイトとpointを円状に作るために参考にさせてもらったサイトが次の２つです。
> サウンドの基本（minimライブラリの使用）
> http://r-dimension.xsrv.jp/classes_j/minim/

>アニメーション(その2)　振動と回転
>http://www.cp.cmc.osaka-u.ac.jp/~kikuchi/kougi/simulation2009/processing8.html

````java
import ddf.minim.*;

Minim minim = new Minim(this);
AudioPlayer Player;

int wave = 100;

//cercle
float theta = 100; 
float x, y;
float r;

void setup(){
  size(400,400);
  Player = minim.loadFile("groove.mp3", 512);
  Player.play();
 
}

void draw(){
  background(255);
  translate(width/2, height/2);
   
  for(int i= 0; i < Player.left.size()-1; i++){
  //theta += 0.1 ;
  r = Player.left.get(i)*1000;
  x = r*cos(i*10);
  y = r*sin(i*10);
  point(x,y);  
  //line(0,0, x,y);
   }
}

void stop()
{
  Player.close(); 
  minim.stop();
  super.stop();
}
````
React.jsを初めて勉強する時に参考になるサイト

# 参考にしたサイト
React.jsとはから始まる内容なので一度読むことをオススメ
http://qiita.com/advent-calendar/2014/reactjs

とりあえず先に動かしたいよって方
本家
https://facebook.github.io/react/docs/tutorial-ja-JP.html

VirtualDOMの概念などを知りたい方（勿論それ以外の記事もあります）はオススメ
ただ初学だと難しい内容もあるので一旦上の２つの記事を読んでからの方が良いかも
http://qiita.com/advent-calendar/2014/virtual-dom

React+Redux入門
http://qiita.com/erukiti/items/e16aa13ad81d5938374e

React.jsの知っておいて損はないTips
http://qiita.com/endam/items/1bde821c4b29f9b663da

Reactの最新動向とベストプラクティス
https://speakerdeck.com/koba04/reactfalsezui-xin-dong-xiang-tobesutopurakuteisu

レトロエンジニアのための近代Webフロントエンド事情
http://qiita.com/uctakeoff/items/ce8da368d020273c6064

Reactの最新動向とベストプラクティス ── HTML5 Conference 2016セッションレポート
https://html5experts.jp/koba04/20839/

これからReact.js勉強するかたにオススメな記事13選
http://ichimaruni-design.com/2016/03/reactjs-13/

React、Reduxでどういう流れで値が渡っているのか
http://slides.com/jenyaterpil/redux-from-twitter-hype-to-production#/9
Python 入門　Hands On　その一

会社のメンバーに入門用の資料を作成。
環境はgithub+cloud9で作りました。なんか上手いこと作って下さい。
そのうち記事にする可能性はあります。
ちなみにとりあえずpython2.7です。

# まずは実行してみる。

とりあえず、main.pyとでもファイルを用意して、
以下のように記述。実行してみます。
実行コマンドは`python main.py`

```py:main.py
#encoding=utf-8

if __name__ == '__main__':
    print "Hello"
```


```:実行結果
Hello
```

`if __name__ == '__main__':`
これは、自分がプログラムの親分かどうか、の処理なのですが、
とりあえずこれはおまじないだと思っておけばいいかも。

`print "Hello"`
出力するよってことです。

# 分岐してみる
プログラミングといえば分岐と繰り返しとありますが、分岐してみましょう。


```py:main.py
#encoding=utf-8

if __name__ == '__main__':
    a = "Bye"
    if a == "Hello":
        print a
    elif a == "Bye":
        print a*2
    else 
        print "foo"
```

aが"Hello"なら"Hello"
aが"Bye"なら"Bye"を2回出力するってことです。
つまり、"ByeBye"と出力されます。なんか気持ちが悪いですが、プログラミングなんてそんなもんです。
aをHelloに変えたり、Bye変えたりして実行結果を確認して下さい。


# 繰り返し
今度は繰り返し。

```py:main.py
#encoding=utf-8

if __name__ == '__main__':
    a = [1,2,3,4,5]
    for num in a:
        print num
```

```:実行結果
1
2
3
4
5
```

配列aの中に要素が1~5が入っていて、
要素を1つずつ取り出して出力しています。

#ファイル分割

pythonデプログラムを書いていくとどんどん膨らんでいくます。
で、共通化出来る部分を関数にしたり、クラスにしたりします。
てっとりばやくファイルを分割していくのもいい手ではあると思います。

例えば、
![image](https://qiita-image-store.s3.amazonaws.com/0/63125/e986f8b8-82a9-eace-1eac-06cd75f53114.png)
こんな感じにファイルが配置してあった場合

```py:main.py
#encoding=utf-8

import sub1

if __name__ == '__main__':
    sub1.method()   
```

```py:sub1.py
#encording=utf-8

def method():
    print "----"
    print "method"
    print "----"

if __name__=="__main__":
    method()
```    

実行してみると

```:実行結果
----
method
----
```

ってこんな感じになります。

その一だからこの辺で。
Ideoneで使える言語のバージョンとか調べてみた

[Ideone](https://ideone.com/)を使うといろんなプログラミング言語を試す事ができます。Ideoneの"What is Ideone?"には以下のように書かれています。
>Ideone is an online compiler and debugging tool which allows you to compile source code and execute it online in more than 60 programming languages.

Google翻訳すると「Ideoneは、あなたがソースコードをコンパイルし、60以上のプログラミング言語でそれをオンラインで実行することを可能にするオンラインコンパイラおよびデバッグツールです。」とのことです。

ちょっと興味があったので調べてみました。（注意）興味があったところしか調べていません。

>（追記）この記事を投稿した後で[FAQページ](https://ideone.com/faq)の下の方にある「What programming languages are supported on Ideone?」に書いてあるって教えてもらいました。バージョンも変わると思うので、そっちの方が確実かなと思います。

##制限
[FAQ](https://ideone.com/faq)には以下のように書かれていました。コンパイルは10秒以内、実行は5秒まで（ユーザは15秒）、使用できるメモリは256Mというところでしょうか。

- compilation time: 10 seconds,
- execution time: 5 seconds (for not logged in users) or 15 seconds (for registered users),
- memory usage: 256 MB.

##パフォーマンス
効率の悪いことで有名な再帰版のフィボナッチ数列をPython3の環境で実行してみました。以下のソースコードを入力し「Run」又は「ideone it!」ボタンをクリックします。ソースコードは[Python Course](http://www.python-course.eu/python3_recursive_functions.php)から引用したものです。

```py3
def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)

print(fib(30))
```

結果は以下のようになりました。`fib(30)`でfib関数は270万回くらい呼び出されているはずなので、パフォーマンスの目安にはなると思います。

```text
Success	time: 0.32 memory: 9992 signal:0
832040
```

私の手元にあったPCで実行してみたところ以下のようになりましたので、私のPCの倍くらいは速そうです。

```bash
% time python3 fib.py
832040

real	0m0.708s
user	0m0.684s
sys	0m0.016s
```

##Python3のバージョン
Pythonのバージョンは「3.4.3+」のようです。

```py3
import platform
print(platform.python_version())
```

```text:結果
3.4.3+
```

##Python3で使用できるモジュール
インストールされていて使用できるモジュールは標準のものだけかと思ったのですが、以下のプログラムを実行してみたところエラーなく実行できました。どうやら標準のみではなさそうです。

```py3
import numpy as np
print(np.array([[1, 2], [3, 4]]))
```

```text:結果
[[1 2]
 [3 4]]
```

##Smalltalk
使用できるのはGNUのSmalltalkのようです。GNU版は使ったことがないのと、そもそもSmalltalkで標準出力を扱ったことがないのでどうするんだ？と戸惑ったのですが、とりあえず知っている`Transcript show: `を使ってみたところ出力されました。

```smalltalk
Transcript show: Smalltalk.Version.
```

```text:結果
GNU Smalltalk version 3.2.4
```

「stdin」と「stdout」がFileStreamのインスタンスであるようですので、以下のように書くこともできそうです。

```smalltalk
Smalltalk.Version printOn: stdout.
```

##Rubyのバージョン

```rb
print RUBY_VERSION
```

```text:結果
2.1.5
```

##SQLのDBとバージョン
`SELECT version();`がエラーになった事がヒントになりました。色々と試していったところDBはSQLiteのようです。

```sql
SELECT sqlite_version();
```
```text:結果
3.8.10.2
```

##JavaScript
JavaScriptはrhino-1.7.7とspidermonkey 24.2を選択できるようです。以下のスクリプトはspidermonkeyで実行しています。

```js:spidermonkey
print(version())
```
```text:結果
185
```

ちょっと気になったのでPython3ときに試した再帰版のフィボナッチ数列を実行してみました。はっ、速い…JavaScriptってこんなに速かったんですね。正直驚きです。

```js:spidermonkey
function fib(n) {
    if (n === 0) {
        return 0;
    } else if (n === 1) {
        return 1;
    } else {
        return fib(n-1) + fib(n-2);
    }
}
print(fib(30));
```
```text:結果
Success	time: 0.02 memory: 30328 signal:0
832040
```

ちなにみにrhinoの環境で実行すると以下のような感じでした。

```text:結果（rhino）
Success	time: 0.36 memory: 321920 signal:0
832040
```
Virtualbox5でubuntuをインストールしたら表示に問題があったためEFIの有効で解決した

![](http://i.stack.imgur.com/60gVn.png)

* 表示が乱れる問題の解決方法 (win10+virtualbox5.1.4+ubuntu16.04.1)

## 参考

* [virtualbox - 16.04 Live CD screen resolution problem? - Ask Ubuntu](http://askubuntu.com/questions/769589/16-04-live-cd-screen-resolution-problem)
* `ctrl + F2`を押した後`ctrl + F1`を押せばよいとあるが、必ずしもそれで解決はしなかった。

## 解決方法

* Virtualboxの設定画面で`EFIを有効`にしてからOSインストールしたところ解決した。
* また、Virtualboxのウィンドウサイズ変更時にubuntu側の解像度が合わせて変更してくれて良かった。

![setting.PNG](https://qiita-image-store.s3.amazonaws.com/0/25728/34340ec5-8891-8d0a-d071-3ebefe6c87a3.png)

## とはいえ

![black.PNG](https://qiita-image-store.s3.amazonaws.com/0/25728/643c90ba-3a28-56af-8781-3960c74a71a7.png)

![black2.PNG](https://qiita-image-store.s3.amazonaws.com/0/25728/101af86c-8771-ea24-ef2c-28bfb4784383.png)


突然操作を受け付けず？画面が真っ暗になることもある。
現段階ではvmwareで動かすほうが安定している様子。
vmwareでefiブートさせるにはvmxファイルに以下追記 (CD bootさせ方わからなかった)

```
firmware = "efi"
```
Quantum Chemistry - Heisenberg Uncertainty Principle in Measurement

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Heisenberg Uncertainty Principle in Measurement
https://www.youtube.com/watch?v=cZbVl14wNkk&index=8&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh

Heisenbeg Uncertainty Principle

- Δx : 位置の不確かさ
- Δp : momentumの不確かさ
- 光子の波長がΔxに近い場合、Δpは小さい
- 波長が短くなるとΔxに対してΔpが増加する
- p = h / lambda 
  - 式より、波長が小さくなると、pは大きくなる
  - Δxが小さくなると、Δpは大きくなる
- Δx Δp >= エイチバー / 2
  - Heisenbeg Uncertainty Principle (1920年発表)
  - ΔxとΔpの積は、ある値以上になる
  - Δxを小さくするとΔpは大きくなる、など
  - ΔxとΔpともに小さくはできない
- ボーアのモデル
  - ΔxもΔpも0とみなせる
  - モデルはflawed (不備がある)
  - より一般的な理論が必要である
Quantum Chemistry - Wave-Particle Duality (2021-01-31追記: Desmos - olnlineグラフツール)

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Wave-Particle Duality
https://www.youtube.com/watch?v=T6PYbgVEHT4&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=7

左側

- Wave-Particle Duality
  - Einsteinが1906に光は粒子であり波動でもあると発表
  - De Broglieが1924年にMatterもそうであると発表
- 黄色の式
  - De Broglie 仮説
- 緑の部分
  - 質量が大きくなると波長が0に近くなる
  - 測定不可能になる
  - 質量が小さくなると波長が0より大きい値を持つ
  - 測定可能になる
- 紫の部分
  - 電子の波長はX-rayの波長に近くなる
  - X-ray crystallographyと関連

右側 (electron interferenceのDe Broglie waves)
  
- 電子軌道の円周 (2pi r)
- 電子の波長が軌道に干渉しない条件として、2pi r = n lambda
- https://www.desmos.com/ による電子軌道の可視化
- desmosで見た場合、nが整数の時は波長が軌道に干渉しない
- 式変形すると l = n エイチバーが得られる (Bohr Quantization Condition)
Quantum Chemistry - Bohr Hydrogen Model 2: Energy

関連 http://qiita.com/7of9/items/d3a1799928734375f34f

CG分野で使われるSpherical Harmonics。自分の数値シミュレーション計算に用いたいと思い調べると、量子化学の講義にたどり着く。

短く分かりやすそうな159本のビデオを少しずつ消化中。

Quantum Chemistry - Bohr Hydrogen Model 2: Energy
https://www.youtube.com/watch?v=rkKhMRD_Lio&list=PLm8ZSArAXicL3jKr_0nHHs5TwfhdkMFhh&index=6

左上のブロック: [前回](http://qiita.com/7of9/items/41f99998a93745f60a58)に出てきた式

左下のブロック 

- E = T + V
- T: kinetic energy
- V: potential energy
- 紫色の式: 左上のブロックの式からの変形。1/2 m v2を計算する。
- 結果として黄色の式が得られる
- 式を変形して水色の式となる

右側のブロック

- オレンジの式: エネルギーの変化 (以下、式1とする)
  - n1とn2のもつエネルギーの差
  - v(周波数:nyu)の上に波があるもの: 「ニューバー」
  - 左下の式を用いて右端の式になる
- 紫の式: ニューバーなどの定義
- 緑の式: (式、式2とする)
  - ニューバーの式の定義
  - n1,n2は太字Z(整数)に属する
- ピンクの式:
  - 式1と式2より得られる
  - この式よりRHが求まる
  - RHは実験と比べて0.05%以内であう
- オレンジの式:
  - RHの0.05%の誤差の理由
  - プロトンの質量は無限大ではない
  - 電子の質量はμ (reduced mass)として扱う
- 緑と紫の式
  - mp, meの値を代入するとμ (reduced mass)の値が求まる
- ピンクと黄色の式
  - 電子の質量をμとして、RHをR1として計算するとR1=109,676 /cm
  - これは実験結果と0.001%以内の誤差である
技術英語 > They are part of my identity. And I am ... incomplete without them. / Words cannot express all my feelings for you.

@ Star Trek Voyager > INNOCENCE

自分の子供に感情を示さないように思われるTuvok。論理的人種バルカンの特徴だ。

「子供を愛していないの？」という問いに対して

> My attachment to my children cannot be described as an emotion. 

続けて

> They are part of my identity. And I am ... incomplete without them. 

意訳 「私の子供に対する思いは感情としては表現できない。彼らは私の一部であり、彼らなしでは私は不完全だ。」

<hr>
関連して思い出したのは

http://archiveofourown.org/works/928445
> Words cannot express all my feelings for you.

意訳 「あなた方に対する（感謝の）気持ちは言葉では表せません」
qjail 環境内に fdesc マウント

FreeBSD の jail 環境を `qjail` で管理している場合に，fdesc を自動でマウントする方法．

# 設定

管理対象の jailname を example1 とする．

1. qjail.confg/example1 から `mount.fevfs;` の行をコメントアウト．
2. qjail.fstab/example1 に `devfs` と `fdesc` の設定を追記．

```/usr/local/etc/qjail.confg/example1
:
# mount.devfs;
:
```

```/usr/local/etc/qjail.fstab/example1
usr/jails/sharedfs /usr/jails/example1/sharedfs nullfs ro 0 0
devfs              /usr/jails/example1/dev      devfs  rw 0 0
fdesc              /usr/jails/example1/dev/fd   fdescfs rw 0 0
```

以上．

# この設定が必要になる環境

FreeBSD の jail 環境内で `rbenv` など `bash` を利用する場合に，fdsec をマウントする必要がある場合がある．

`qjail start example1` で jail 環境をスタートさせた後に，ホスト環境から `mount -t fdsecfs fdesc /usr/jail/example1/dev/fd` と実行しても動作はするが，自動的にマウントさせたかった．

qjail.fstab/example1 に fdsec の行だけを追記すると `qjail` が自動的にマウントする devfs よりも先に fdesc をマウントしようとしてエラーになる．そこで qjail.config/example1 で devfs の自動マウントを無効にして，qjail.fstab/example1 で devfs と fdesc の両方をマウントする．
異常が発生した時は、メール…ではなくTwitterでアラートを送る

# 異常が起きた。メール、いやTwitterで報告だ。

サーバーの異常は突然来ますよ。暦の上ではシステム管理者の日は1か月前に過ぎましたが、むしろそれ以外の日は364日（365日）とも異常に備えなければなりません。

![after-an-exhausted-day-of-work-in-the-office-1-1391125-639x426.jpg](https://qiita-image-store.s3.amazonaws.com/0/9113/be6b6c3e-876c-2380-afe4-c412bdfd0d28.jpeg)

サーバーで異常が発生したら、管理者に対してメールを自動送信させ、その異常に気付けるようにするというのがこれまでの主流でした。

しかし時代は流れ、メールも肩身が狭くなってしまいました。SMTPポート（25）は、[OP25B](https://ja.wikipedia.org/wiki/Outbound_Port_25_Blocking)などの政策の影響で通りが悪くなってしまいましたし、幸いにしてその影響を受けなかったとしても迷惑メールが横行してしまったおかげで、疑心暗鬼的に超反応するようにされてしまったspamフィルターに、アラートメールが水際で破棄されてしまう[^1]ことさえ起こる有様。

[^1]: アラートメールは人ではなく機械が送るため、メール本文の機械っぽさを見透かしてspam判定されてしまうことがあるようです。

**そこでTwitterです。**

異常事態を検出したら、メールで通知する代わりにTwitterのダイレクトメッセージ（DM）を用いて管理者にメッセージを送るのです。しかもこの方法なら、**Bash on Ubuntu on Windowsからも簡単にアラート発信が可能**です。なにせ、現状のBash on Ubuntu on WindowsにはMTAが入っておらず、メール送信が困難ですからね。

# パワーアップした「小鳥男」だ

TwitterのDM発信には、改良したTwitterアプリ[**恐怖！小鳥男**](https://github.com/ShellShoccar-jpn/kotoriotoko/)が便利です。（アプリ名は気にしないでください）

![alert.png](https://qiita-image-store.s3.amazonaws.com/0/9113/549eeef3-692a-de14-dc5f-d812db244be1.png)

こんなふうにして管理者のTwitterアカウントにアラートメッセージが送られてきます。ちなみにTwitterのイベントは、設定によりメールで通知することもできますので、管理者は引き続きメールで異常発生に気付けるようにもできます。

# 準備 ― アプリのインストール

まずはアプリケーションのインストールをします。方法は[ここ](http://qiita.com/richmikan@github/items/24af09dfaba2c6a6ea97#%E3%81%95%E3%81%81%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8D)に書いてあるとおりです。

ちなみに、過去にインストールしたことがある人なら、過去に作った`CONFIG/COMMON.SHLIB`のバックアップをとって、新しいバージョンをgit cloneして、

```sh:
$ git clone https://github.com/ShellShoccar-jpn/kotoriotoko.git
```

新たな`CONFIG`ディレクトリーの中にコピーすれば完了です。

# 使い方 ― 監視バッチスクリプトに組み込む

小鳥男をインストールするといろいろなコマンドができますが、ここで使うのは`BIN`ディレクトリーの中にある`dmtweet.sh`というコマンドです。

サーバー上の各パーティション（スライス）の使用率を確認し、一定以上だった場合に管理者にアラートメッセージを送るというスクリプトの例を考えてみます。

このシェルスクリプトをcrontab等に登録すればよいだけです。

```sh:空き容量監視バッチスクリプトの例
#! /bin/sh

PATH="/home/HOGEUSER/kotoriotoko/BIN:$PATH"
DIRs='/home|/var'
PERCENTAGE=90
ADMINISTRATOR=richmikan

msg=$(df                                                                    |
      grep -E "$DIRs"                                                       |
      awk -v n=$PERCENTAGE 'substr($5,1,length($5)-1)>n{print $6,$5;}'      |
      awk '{print;} END{if(NR>0){print "ALERT: Free-space is not enough!"}}')

case "$msg" in
  '') :
      ;;
   *) printf '%s' "$msg" | dmtweet.sh -t $ADMINISTRATOR
      ;;
esac

exit 0
```

このシェルスクリプトの内容を見てみましょう。

序盤では

* 小鳥男のコマンドのパス
* 監視対象パーティション
* アラートを送ることする使用率のしきい値
* 管理者のTwitterID

を設定しています。

そして中盤では実際に使用率を確認し、終盤ではその結果アラート発信が必要だと判断された場合に`dmtweet.sh`コマンドを使ってメッセージを送信するというものです。

メッセージ送信は、標準入力からメッセージ文を送り、それを宛先IDを引数指定した`dmtweet.sh`コマンドに渡しているだけですから、非常に簡単に書けていることがわかります。

## 注意 ― 140文字の壁が微妙に残っている。

Twitterには140文字制限があることは有名ですが、[ダイレクトメッセージではこの制約が解除](https://blog.twitter.com/ja/2015/140)されました。よって、140文字を超える文字数のアラートメッセージを送ることも可能なのですが……

メッセージの閲覧をするのがWebブラウザーではなくてTwitterアプリ（少なくとも非公認アプリ）の場合、Twitter APIの制約によって140文字を超えた部分のメッセージ表示されませんので注意が必要です。依然として140文字の壁が残っているようです。

なので、Twitterによるアラートはあくまで通知のみとし、詳しくはサーバー本体を見に来て調べるようにするとか、140未満で何通もメッセージを送るようにする、などを環境によってはする方がよいかもしれません。
GitHubを使って、公開環境を半自動更新させてみた

# 理由

- **開発環境　→　公開環境** へのデータの移行とかがすごく面倒。
- `rsync`でもいいが、なんとなくGitHubを使いたかった。
- 毎回`pull`なり`ssh接続`なりが面倒だった。

# 接続を自動化

#### **開発環境：Client　　公開環境：Server**

## 1.SSH接続時はパスワード無し接続

```bash:Client
$ ssh-keygen -t rsa

##〜省略〜##

$ scp ~/.ssh/id_rsa.pub {Serverのユーザ名}@{ServerのIPアドレス}:~/
```

```bash:Server
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
$ vim /etc/ssh/sshd_config

#ここ変更すれば行けたはず
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      %h/.ssh/authorized_keys

```
## 2.GitHubもSSH接続

[gitHubでssh接続する手順 qiita.com](http://qiita.com/shizuma/items/2b2f873a0034839e47ce)

大体書いて頂いてるので省略します。

## 3.自動でPullさせる

```bash:Server
$ cd  /var/www/html/
$ git clone {gitレポジトリurl}
$ cd ~/
$ touch autopull.sh
$ vim autopull.sh
```

>```sh:autopull.sh
>#!bin/sh
>
>cd /var/www/html/{レポジトリ名}
>git pull origin master
>```

これでshell叩けば勝手にPullされます。

## 4.SSH経由でシェルを実行
```bash:Client
$ ssh {Serverのユーザ名}@{ServerのIPアドレス} sh ~/autopull.sh
```
このコマンドを叩けばいいが、長い。

`alias`を使う

```bash:Client
$ echo "alias chp='ssh {Serverのユーザ名}@{ServerのIPアドレス} sh ~/autopull.sh'" >> ~/.bashrc
```
`bash`を再起動

(ちなみに、`bash`を再起動するコマンドは)
`exec $SHELL -l`

## 5.終了

masterとは別のBranchで作業が完了して、`add`して`commit`して`push`
GitHubでPullReqest送って完了すれば、あとは、
`$ chp`
これでサーバの更新が完了する。
やったね。

## 6.さいごに
とても自己満足な感じなので、本当に効率求めるならいろんなアプリケーション使ったほうが早いかもしれませんね；
FLUXとMVCについて調べたときの覚書

#FLUXとMVC
それぞれ聞いたことはあるけれど、分かっているようでちゃんと分かっていなかったので調べてみたときの覚書きです。
間違いなどがありましたら、ご指摘いただけると嬉しいです。

#Design Pattern
「こうした問題にぶつかったときはこうするといいよ」的な先人たちの知恵。
これらの知恵を蓄積し実践を重ねていくことで、問題発生時の柔軟な対応や再利用性、信頼性の高い設計が可能になるらしい。
	
#Observer Pattern
Design Patternの一つ。
状態の変更があったインスタンスが観察者（Observer）に通知するように設計することで、観察者はすべての状態を観察する必要がなくなるというもの。
ちなみにMVCもFLUXもこのObserver Patternを利用して実装されることが多いらしい。


#MVC
SmalltalkのGUIライブラリのモデルとして登場。
Model、View、Controllerの頭文字をとっている。

- Model　…　ビジネスロジック担当。また、データに変更があった際にViewへ通知する。
- View　…　UIへの出力担当。Modelからデータを受け取って表示する。
- Controller　…　UIへの入力担当。ユーザーから入力があった際にModelへ通知する。　


#FLUX
Facebook社が開発したソフトウェアアーキテクチャ。 
MVCのベストプラクティス版（様々な意見があるようです）。
MVCで曖昧だった役割を明確にし、それぞれの役割に名称をつけて共通言語化したもの。
また、ドメイン間のデータフローが一方向になるよう規定している。

- Action Creator　…　Viewから通知を受けたら、適切なActionを生成する。
- Action　…　データや状態の変更を担う。
- Dispatcher　…　Actionから通知が来たら、ActionをStoreに渡す（dispatch）と同時にStoreから登録（register）された対応するコールバックを呼び出す。
- Store　…　データと状態の管理を担う。Storeはあくまで管理だけ。変更はActionに任せる。
- View　…　表示担当。何かしらのイベントが発生した際にActionCreaterをコールする。
<br>※　Viewは、Controller ViewとViewに大別される。
　　<br>　Controller View　…　Storeの状態変化を観察して、自身とViewをレンダリングする。
　　<br>　View　…　親から流れてきたデータをレンダリングする。

#参考
- Design Pattern
    - [デザインパターン | TECHSCORE(テックスコア) - 0．デザインパターンの基本](http://www.techscore.com/tech/DesignPattern/foundation/foundation1.html/)
	<br>Design Patternとは何か、Design Patternを使うことのメリットについて分かりやすく説明されています。１章以降は各デザインパターンに沿って実装してみる実習課題（Java）もあって内容が濃いです。
- MVC
    - [Wikipedia - Model View Controller](https://ja.wikipedia.org/wiki/Model_View_Controller)
    - [MVCモデルの概念を漫画で解説してみる](http://hijiriworld.com/web/mvc-concept/)
	<br>棒人形の漫画でMVCモデルについて説明していて、イメージが掴みやすかったです。
    - [MVC、本当にわかってますか？](http://qiita.com/tshinsay/items/5b1724baf32b8b5113c2)
	<br>MVCを使うとどう幸せになるのかを段階的に説明してくれています。

- FLUX
    - [Fluxは本質的に何を解決しようとしたのだろうか?](http://qiita.com/nobkz/items/75d1a9115d8aaadac433)
	<br>MVCとFLUXについて調べている中でモヤっとしていたところを拭い去ってくれました。

    - [Fluxアーキテクチャの覚え書きを書いた](http://saneyukis.hatenablog.com/entry/2014/09/26/174750)
	<br>FLUXとは何かということが明快に書かれていてとても参考になりました。

    - [FacebookのFluxアーキテクチャの始め方 Part 1]
(http://postd.cc/introduction-to-facebooks-flux-architecture-1/)
	<br>FLUXを人体に例えて説明していて面白いです。
	<br>実装しながら、FLUXアーキテクチャのイメージをつかんでいく構成になっています。
mocha + enzyme + power-assertの環境構築メモ

## node modules

```
npm install -D babel babel-register babel-preset-latest babel-preset-react babel-plugin-espower mocha power-assert enzyme react-addons-test-utils jsdom jsdom-global
npm install -S react
```

## 設定

### `.babelrc`

```json:.babelrc
{
  "presets": [
    "latest",
    "react"
  ],
  "plugins": [
    "babel-plugin-espower"
  ]
}
```

- test内でjsx syntaxを書くのでpresetsに"react"の指定が必要
- `.babelrc`を使いたくない場合は、[babel-plugin-espower#via-babel-require-hook](https://github.com/power-assert-js/babel-plugin-espower#via-babel-require-hook)のようなスクリプトを用意して、以下のようにmochaの"-r"オプションで`babel-register`の代わりに渡すとよい
- presetなどはお好きに

## 実行

```
./node_modules/.bin/mocha -r babel-register -r jsdom-global/register path/to/test/**/*.js
```

- `babel-register`をrequireすることで、ES.next + Reactなテストコードをトランスパイルして実行できる
- enzymeの`render`, `mount`methodを実行する為に`window.document`などのcontextが必要なので、`jsdom-global/register`をrequireすることによって設定する
    - 公式からリンクしているサンプルだと[enzyme-example-mocha/test/.setup.js](https://github.com/lelandrichardson/enzyme-example-mocha/blob/aa1b9aa45fb0c6b3fd5f395e1b246a75c958ba2d/test/.setup.js)のようなファイルを実行しているがその必要がなくなる

## 参考

- [power-assert-js/babel-plugin-espower: Babel plugin for power-assert](https://github.com/power-assert-js/babel-plugin-espower)
- [rstacruz/jsdom-global: Enable DOM in Node.js](https://github.com/rstacruz/jsdom-global)
- [airbnb/enzyme: JavaScript Testing utilities for React](https://github.com/airbnb/enzyme)
- [enzyme-example-mocha/.setup.js at aa1b9aa45fb0c6b3fd5f395e1b246a75c958ba2d · lelandrichardson/enzyme-example-mocha](https://github.com/lelandrichardson/enzyme-example-mocha/blob/aa1b9aa45fb0c6b3fd5f395e1b246a75c958ba2d/test/.setup.js)
メモ: Docker on Scaleway


対象クライアント mac

## 前作業
scalewayのアカウントを作成
https://www.scaleway.com/

公開鍵を管理画面から追加
https://cloud.scaleway.com/#/credentials

macに、homebrew をいれる
docker toolbox for macをいれる

```bash:
brew install scw
scw login
```

## 1. scaleway driverからdocker用インスタンス作成

サードパーティ ドライバーをインストール
https://github.com/scaleway/docker-machine-driver-scaleway



```bash:
brew install docker-machine-driver-scaleway --without-docker-machine
```

```bash:
docker-machine create -d scaleway -h
```

```bash:
docker-machine create -d scaleway --scaleway-token=TOKEN --scaleway-organization=ACCESS_KEY --scaleway-name="cloud-scaleway-1" cloud-scaleway
```



## 2. dockerイメージからインスタンスを作成し、docker machineのgeneric driverを入れる
docker用のイメージ(Ubuntu 16.04 LTS)から、
ubuntuのdocker削除して、dockerの公式リポジトリに入れ替えるのがよさそう。

```bash:
scw start $(scw create docker)

scw ps

# ipをメモる
```  

### docker 削除

http://codeselfstudy.com/blogs/fixing-a-docker-bug-varrundockersock


```bash:
ssh root@IPアドレス

apt-get autoremove --purge docker-engine
 
# Nothing worked until I added this step
rm -rfv /var/lib/docker
 
# 再起動
```  


### dockerの公式リポジトリを利用する
最新のAPIがつかえるように

```bash:
curl -sSL https://get.docker.com/ | sh

```  

```bash:
docker-machine create \
  --driver generic \
  --generic-ip-address=XXX.XXX.XXX.XXX \
  --generic-ssh-key ~/.ssh/id_rsa \
  --generic-ssh-user=root \
  scw-dXXXXX

# 出力
Running pre-create checks...
Creating machine...
(admiring-golick) Importing SSH key...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with ubuntu(systemd)...
Installing Docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env scw-dXXXXX
```

```bash:
docker-machine ls

eval $(docker-machine env scw-dXXXXX)
docker ps

OK!
```


### ubuntu管理下のdockerは、API versionの同期が取れず繋がらないことがある

```bash:
docker-machine ls

eval $(docker-machine env scw-dXXXXX)
docker ps

# 出力
Error response from daemon: client is newer than server (client API version: 1.24, server API version: 1.23)
```


## 3. ubuntuに入れる
scalewayで用意しているカーネルが最新のlinuxでビルドしているため、linux-image-extra-virtualと一緒に標準のkernelをいれると起動不可になるため、docker用のイメージを使ったほうが楽そう。
RxJavaのtoListで値が流れてこないときに確認すること

# この記事について
RxJavaの`Observable#toList()`で値が流れてこなくて困ったので、メモとして残しておきます。

# 結論
toListを呼ぶObservableでonCompleteが呼ばれているかを確認する。

# 具体例
以下のように、onCompleteが呼ばれないObservableに対して、toListを使っても何も流れてきません。

```
Observable.create(subscriber -> {
        subscriber.onNext(1);
        subscriber.onNext(2);
        subscriber.onNext(3);
    })
    .toList()
    .subscribe(integerList -> {
        // 何も流れてこない！
    })
```
この場合は、以下のように`Subscriber#onComplete()`を呼ぶ必要があります。

```
Observable.create(subscriber -> {
        subscriber.onNext(1);
        subscriber.onNext(2);
        subscriber.onNext(3);
        subscriber.onComplete();
    })
    .toList()
    .subscribe(integerList -> {
        // 1, 2, 3 の入ったリストが流れてくる
    })
```

# 解説
[Observable#toList()の説明](http://reactivex.io/RxJava/javadoc/rx/Observable.html#toList()) には以下の注意書きが記されています。

> Be careful not to use this operator on Observables that emit infinite or very large numbers of items, as you do not have the option to unsubscribe.

toListは、無限に値を流し続けるObservableや非常に多くの値を流すObservableに対しては使用してはいけないと書いてあります。

toListは集計を行うメソッドなので、onCompleteが呼ばれずにいつまでも値が流れ続けるものに関しては、いつリストへの追加を打ち切るべきかがわからないので、集計結果を流すことができないのだと考えられます。

# 参考
http://tomstechnicalblog.blogspot.jp/2015/11/rxjava-operators-tolist.html
Python + OpenCVでGraph Based Segmentation

Facebookがセグメンテーションフレームワークをオープンソース化したと聞いて、ちょうどセグメンテーションが必要だったので調べてみた。

[Segmenting and refining images with SharpMask](https://code.facebook.com/posts/561187904071636)

LuaだったりTorchだったりするのは仕方がないとして、今回は教師なしで候補領域を得たかったのだが、このフレームワークは教師ありのようだったので利用を断念して他のものを探した。
そうすると、OpenCVにそのような機能があったので試してみた。

```python:graph_segmentation.py
import cv2
import numpy as np

segmentator = cv2.ximgproc.segmentation.createGraphSegmentation(sigma=0.5, k=300, min_size=1000)
src = cv2.imread('image.jpg')
segment = segmentator.processImage(src)
mask = segment.reshape(list(segment.shape) + [1]).repeat(3, axis=2)
masked = np.ma.masked_array(src, fill_value=0)
for i in range(np.max(segment)):
    masked.mask = mask != i
    y, x = np.where(segment == i)
    top, bottom, left, right = min(y), max(y), min(x), max(x)
    dst = masked.filled()[top : bottom + 1, left : right + 1]
    cv2.imwrite('segment_{num}.jpg'.format(num=i), dst)
```

|パラメータ|   |
|:------:|:--|
|sigma|境界線の滑らかさ（複雑な境界線には小さい値、滑らかな境界線には大きい値）|
|k|たぶん、どれくらい候補領域を統合するか（値が小さいと多くの小さい領域、大きいと少ない大きな領域に分割？）|
|min_size|領域の最小サイズ（たぶん領域のピクセル数）|

地味に候補領域だけを切り出すところが難しかった。
Numpyでやる以外にも、OpenCVのboundingRectを使う方法があるらしい。

追記：
segmentator.setSigma(value), segmentator.setK(value), segmentator.setMinSize(value)で値を変更可能。

そのままでは載せられないLenaさんの全身像への適用結果（sigma=0.7, k=1200, min_size=5000）
![lena_seg.png](https://qiita-image-store.s3.amazonaws.com/0/103085/336b1754-d8d0-e132-0436-e57f646d7854.png)
kintone で Markdown 表示するプラグインを作ってみました

# 作った経緯
仕事柄、ドキュメントはすべて `Markdown` 記法で書くことに慣れてしまっていますが、`kintone` のテキストフィールドは残念ながら標準で `Markdown` に対応していません。
議事録とかも `kintone` アプリで書いていますが、どうしても `Markdown` 記法を変換したいと思っていました。

`kintone` と `Markdown` は、現状下記の記事がありますので参考にさせていただきました。

- [kintoneのテキストフィールドでMarkdown記法が使えるようにする](http://qiita.com/icoxfog417/items/e3c585752a5ab89b3e2f)

せっかくですので、複数アプリに適用できるようプラグイン化してみました。
（プラグインを作ってみたかったというのもあります）

# プラグイン
GitHub にあげています。
[kintone × Markdown プラグイン](https://github.com/dai0916/kintone-markdown)

## 概要
kintone のテキストフィールドで Markdown を使えるようにするプラグインです。

## 特徴
- kintone アプリのテキストフィールドで Markdown が使えます
- プレビューボタンを押下してプレビューを表示できます

## 作成方法
1. [こちらのドキュメント](https://cybozudev.zendesk.com/hc/ja/categories/200219390-kintone-plugin)を参照し、必要なフォルダ構造と `manifest.json` ファイルを準備します。
1. ファイル一式を[パッケージングツール](https://github.com/kintone/plugin-sdk/blob/master/package.sh)にてパッケージングすれば完成です。

慣れると、`kintone` プラグイン作成は結構簡単にできますね。

簡易的に作ったので、設定画面から設定読み込みで汎用的にするなどまだまだやること残っていますが、
とりあえずプレリリースです。
Ext.data.validator.* による検証について

Ext JS の Ext.data.validator.* による検証についてメモっとく。モデルとフィールドのカスタム型に設定することができるバリデーターにはいくつか種類があるのだ。

# 継承ツリー

Ext.data.validator.* の継承ツリーを掲載しとく。標準で用意されているバリデーターである程度のことができる。Format に種類がないのは少し残念だが、正規表現で検証しているので実際のところは不便を感じないはず。

![Ext.data.validator.* の継承ツリー](http://www.plantuml.com/plantuml/img/fT0z2iCm30NWlQVm2No8G0g53AL3TrKMgS6HmLAAZzy_6jf1fk1D6jx7us424JTMzGC8xN1x0oZu6wJuE7Bnvy_bg2fn-Ch0HRG0gZF3Gruv_0GjtIwmpsK1xKIcABt4iP0G8_Ks8Pxrsa9Uezd02NYcZlouG4oj_7lm1b0nhH8pjv3du3Pnu3-9Em00)

# バリデーターの一覧

バリデーターを表にまとめておく。`type` は Ext.data.Model でバリデーターを指定するときに設定する値。`validate` は各バリデーターの検証が true になる条件。`message` は設定できるエラーメッセージ。

なお Ext.data.validator.Bound は抽象クラスであり、Ext.data.validator.List は非公開クラスであるため、バリデーターの一覧からは除外している。

<table>
<tr><th>クラス</th><th>説明</th><th>type</th><th>validate</th><th>message</th></tr>
<tr><td>Validator</td><td>ベースになるバリデーター</td><td>base</td><td>常に true</td><td>なし</td></tr>
<tr><td>Length</td><td>文字列の長さの範囲を検証するバリデーター</td><td>length</td><td>文字列の長さが min と max の範囲内であれば true</td><td>emptyMessage, minOnlyMessage, maxOnlyMessage, bothMessage</td></tr>
<tr><td>Range</td><td>数値の範囲を検証するバリデーター</td><td>range</td><td>数値が min と max の範囲内であれば true</td><td>emptyMessage, minOnlyMessage, maxOnlyMessage, bothMessage, nanMessage</td></tr>
<tr><td>Format</td><td>正規表現でフォーマットを検証するバリデーター</td><td>format</td><td>matcher に指定した正規表現に一致すれば true</td><td>message</td></tr>
<tr><td>Email</td><td>メールアドレスを検証するバリデーター</td><td>email</td><td>メールアドレスの正規表現に一致すれば true</td><td>message</td></tr>
<tr><td>Exclusion</td><td>指定値が含まれていないことを検証するバリデーター</td><td>exclusion</td><td>list に指定した値が含まれていなければ true</td><td>message</td></tr>
<tr><td>Inclusion</td><td>指定値が含まれていることを検証するバリデーター</td><td>inclusion</td><td>list に指定した値が含まれていれば true</td><td>message</td></tr>
<tr><td>Presence</td><td>値の存在を検証するバリデーター</td><td>presence</td><td>null か undefined か '' でなければ true（allowEmpty コンフィグで '' を妥当な値とみなすこともできる）</td><td>message</td></tr>
</table>