OmniAICreator/Qiita-1.07M huggingface dataset:
Ruby のワンライナーで YAML の文法チェック

## やり方

単純に `YAML.load(_file)` で YAML を読み込む。

```bash
cat foo.yml | ruby -r yaml -e 'YAML.load STDIN'
# or
ruby -r yaml -e 'YAML.load_file "foo.yml"'
```

中身を表示したければ、`ruby -r yaml -e 'p YAML.load_file "foo.yml"'` のように、`p` を付ければ良い。

## 壊れた YAML の場合

```bash
% broken.yml
foo: bar
bar baz:quz
% ruby -r yaml -e 'p YAML.load_file "broken.yml"'
/home/key-amb/.rbenv/versions/2.3.0/lib/ruby/2.3.0/psych.rb:377:in `parse': (broken.yml): could not find expected ':' while scanning a simple key at line 2 column 1 (Psych::SyntaxError)
        from /home/key-amb/.rbenv/versions/2.3.0/lib/ruby/2.3.0/psych.rb:377:in `parse_stream'
        from /home/key-amb/.rbenv/versions/2.3.0/lib/ruby/2.3.0/psych.rb:325:in `parse'
        from /home/key-amb/.rbenv/versions/2.3.0/lib/ruby/2.3.0/psych.rb:252:in `load'
        from /home/key-amb/.rbenv/versions/2.3.0/lib/ruby/2.3.0/psych.rb:471:in `block in load_file'
        from /home/key-amb/.rbenv/versions/2.3.0/lib/ruby/2.3.0/psych.rb:471:in `open'
        from /home/key-amb/.rbenv/versions/2.3.0/lib/ruby/2.3.0/psych.rb:471:in `load_file'
```

…というわけで、とりあえずこれでよさそう。

## 参考

- [module YAML (Ruby 2.3.0)](http://docs.ruby-lang.org/ja/2.3.0/class/YAML.html)
UNIX のグループについて


- UNIX で作成したユーザーは、必ず一つのプライマリグループ（or イニシャルグループ or メイングループ）に所属する

- UNIX で作成したユーザーは、必ず一つ以上のサブグループに所属する

- ユーザーのグループ設定は「id」コマンドで確認することが可能

```
例： id root
```

- ユーザーのグループ設定は「usermod」コマンド等で設定変更をすることが可能

```
例： usermod -g testuser
     usermod -G testuser
```

## 参考にさせていただいたページ
- [【UNIX】groupについてあれこれ - diskogs's diary](http://diskogs.hatenablog.com/entry/2014/04/21/022251)
- [Linuxコマンド集 - 【newgrp】グループ権限を変更する：ITpro](http://itpro.nikkeibp.co.jp/article/COLUMN/20131226/527406/)
- [Linux グループ一覧の確認と/etc/group ファイル](http://kazmax.zpp.jp/linux_beginner/etc_group.html)
コマンドライン引数にて、１つのオプションに不定個の値が紐づく場合のパース(Groovy)

参考：http://www.javaworld.com/article/2074004/core-java/customizing-groovy-s-clibuilder-usage-statements.html

# 目的
Groovyでコマンドライン引数をパースする。
一つのオプションに対して、複数の値がある場合に対応したい。
特に、値の個数が不定な場合をなんとかしたい。

# 手段
CliBuilderを使う。
オプションで値の個数を無制限にする。
値を使う時は、変数名の末尾にsを付ける。

# 実装

```groovy:cli.groovy
import org.apache.commons.cli.Option

def cli = new CliBuilder(usage: "groovy cli.groovy [options]")
cli.with {
  h("help")
  l("argument list", args: Option.UNLIMITED_VALUES, valueSeparator: ",", required: true)
}

def options = cli.parse(args)

if(!options) {
  System.exit(255)
}

//受け取ったものを一つだけダンプしてみる
println options.l

//受け取ったものを全部ダンプしてみる(変数名の末尾にsをつければOK)
println options.ls
```

## 補足

argsに引数の個数を書く。
通常、argsはint型で具体的な値を記入する(1とか2とか)。
Option.UNLIMITED_VALUES が無制限という意味のスタティック定数。


# 実行例

```bash
groovy cli.groovy -l test,test2,test3
#=> test
#=> [test, test2, test3]
```

オプション名の後にスペースは何個あっても良い(0個でもOK)

```bash
groovy cli.groovy -ltest,test2,test3
groovy cli.groovy -l  test,test2,test3
groovy cli.groovy -l   test,test2,test3
#=> test
#=> [test, test2, test3]
```

横に長いと辛いなら例えば(※シェルの文法の話ですが)

```bash
groovy cli.groovy -l test,\
test2,\
test3,\
test4
#=> test
#=> [test, test2, test3, test4]
```
XOOPS CubeのxelFinderでアップロードしたファイルはホスト名がかわると表示されなくなる


xelFinderでファイルをアップロードするとDBデータへの登録以外に2つのディレクトリにファイルが作成されます。サーバ移転等おこなうときに忘れずにコピーしましょうね。

## 1．サムネイル

サムネイルは ```XOOPS_ROOT_PATH/modules/xelfinder/cache/tmb/```下にあります。
これがないとxelfinderでファイル一覧みたときにサムネイル表示されません。

## 2. 本体ファイル

大事なアップロードしたファイル本体は ```XOOPS_TRUST_PATH/upload/xelfinder```にあります。

注意が必要なのは、__サーバホスト名がプレフィクスについた__ファイル名になるっていう点です。

ryus.co.jpであっぷしたなら ```ryus.co.jp_xelfinder_6``` のようなファイル名になります。

なのでサーバ移転等でホスト名が変わったりすると、そのままファイルをコピーしただけでは表示されません！（これでしばし悩みました(T^T)）

まホスト名変更にあわせてリネームすればいいだけなんで、

```
$ cd xoops_trust_path/uploads/xelfinder/
$ rename ryus.co.jp example.com *
```
って感じでリネームしてやればOK

本番切り替えまでは仮ドメインでテストして本番は別ドメインなら、最後にこのリネーム作業わすれないように。（と近い未来の自分に申し送りしておく(^^;
pods installでThere was an error reading '...CocoaPods-version.yml'.


`pod install`や`pod setup`をしようとしたところ以下のようなエラーが発生！

```bash
$ pod setup
Setting up CocoaPods master repo
Already up-to-date.
[!] There was an error reading '...CocoaPods-version.yml'.
Please consult http://blog.cocoapods.org/Repairing-Our-Broken-Specs-Repository/ for more information.
```

エラーメッセージのURLに書いてある解決方法はうまくいかず。。。
すこし調べてみると`psych`というのがいけないらしい。

```bash
$ gem list
...
psych (2.0.17, 2.0.8)
...
```

アンインストール。

```bash
$ gem uninstall psych
Successfully uninstalled psych-2.0.17
```

ちなみに`2.0.8`のほうはデフォルトで入っているものらしく消せなかった。

```bash
$ gem uninstall psych -v 2.0.8
ERROR:  While executing gem ... (Gem::InstallError)
    gem "psych" cannot be uninstalled because it is a default gem
```

ということで以下の状態で`pod install`や`pod setup`が成功するようになりました！

```bash
$ gem list
...
psych (2.0.8)
...
```
html 自分用 メモ

#文字化けしないように
```<meta charset ="utf8">
```

#ファビコンのアイコン
```<link rel="shortcut icon" href="favicon.ico>```

#コメントアウト
```<!--    --><>```

#articleタグ
 'そのセクションをそのままどこかに配信しても違和感のない情報の固まり'

 #aside
'副次的なコンテンツ、補足情報とか広告'

 #section
'こういった固まりではうまく整理できない、なんらかの意味のある固まり'


#マークアップのやり方
まずやるべきは書きたいことをダダッと書いてあげて、アウトラインを意識しながら、タグを使って構造化

# p､hr､pre､blockquote､div
'p: 段落
hr: 水平線
pre: 改行や字下げを保持
blockquote: 引用
div: スタイリング'

#リスト系のタグ~ ol､ul､li､dl､dt､dd ~

'ol (ordered list) / ul (unordered list) /  li (list item)
dl (定義リスト: definition list) / dt (定義見出し：　definition term) / dd (定義の中身　：definition description)
'

#strong､br､span
'strong: 重要（太字）
br：　改行
span：　styleを当てる'

#aタグでリンク表示先を別タブにする
<a href="" target="_blank"></a>

#ページ内リンクのやり方

```<a href ="#apple"></a>```


```<div id="apple"></div>```


#表を2行使う
```<td colspan="2">```

#formタグ
""form
  action: どこに送るか？
  method: get / post""

#inputタグ

size：　横幅
maxlength：　最大文字数
value：　入力欄に何を入れるか
placeholder：　うっすら文字を透けさせる
password：　文字を黒塗り

#textarea,buttonタグ
textarea：　テキストエリア
button: ボタン
disabled：　使えなくする（javascript）
input type="submit"　＝サブミットボタン

#checkbox,radio,ladioタグ
checkboxタグ: 複数の選択肢から複数選んで良い
属性　'checked': 最初にチェックしてあるもの
radioタグ: 複数の選択肢があるのですが 1 つだけ選ばせたい
labelタグ: 囲んだ範囲を選択可能に

#type属性
type="email"=@~がないとエラー
type="number"=数値じゃないとエラー
type="date"=日程じゃないとエラー
required＝入力必須
novalidate＝なくても平気

#文字参照
数値文字参照
文字実体参照がある。

<>などの文字は空欄として表示されるので、&#60;みたいに記入（ググる）
&#60;を表示したい場合は、&amp;を頭につける

#コンテンツモデル

 カテゴリー：どの分類か？
    コンテンツモデル：どのカテゴリーのタグを入れられるか？(入れ子ができないタグがある)
        トランスペアレント：親要素のコンテンツモデルを使ってね？
Fess10 でロールベース検索を試してみた

Fess10のロールベース検索は管理画面で簡単に設定できるようになっています。
今回はその機能を試してみることにします。

Fess10の導入記事はこちら( [Fess10の導入 Fess9との違いなど](http://qiita.com/tonkatu05/items/34ee36e0193340be88bb) )

# 概要

ロールベース検索はユーザーごとに検索結果を変える機能のことです。
例えば、今回はYoutuberロールを持つユーザーはYoutubeのクロール結果を表示させ、Nicorerロールを持つユーザーはニコニコ動画のクロール結果を表示させてみます。

次から順を追って設定をしていきます。

# 設定

## 1. ユーザー用ロールの作成

ユーザー用ロールを作成します。YoutuberとNicorerを作ります。
ユーザー > ロール > 新規作成 を押下し、名前にYoutuberと入力し作成を押下します。同様にNcorerも作成します。

![userrole.png](https://qiita-image-store.s3.amazonaws.com/0/69140/38ec7af3-8ec0-0b29-6b26-69e0bedfffc1.png)

## 2. クローラ用ロールの作成

クローラ用ロールを作成します。
クローラ > ロール > 新規作成 を押下し、名前にユーチューバー(任意)、値にYoutuberと入力し作成を押下します。
同様に名前にニコラー、値にNicorerとしてクローラ用ロールを作成します。

![crawlerrole.png](https://qiita-image-store.s3.amazonaws.com/0/69140/817ec588-7668-bd1b-54fd-eee6b24f1ef6.png)

## 3. ユーザーの作成

先ほど作ったユーザー用ロールを持ったユーザーを作成していきます。
ユーザ > ユーザ > 新規作成 を押下し、ユーザー名にYoukun(任意)と入力し、パスワードを任意に入力し、ロールにYoutuberを選択して作成を押下します。
同様にユーザー名Nicochan、パスワード任意、ロールNicorerのユーザーを作ります。

![user.png](https://qiita-image-store.s3.amazonaws.com/0/69140/8cd4fea4-99d6-e69d-4bcc-31e540113994.png)

## 4. クローラー設定の作成

最後にクローラの設定を作成します。
クローラ > ウェブ > 新規作成 を押下し、以下の2つの設定を作ります。

|                    | Youtubeのクローラ設定         | ニコニコ動画のクローラ設定      |
|:-------------------|:---------------------------|:----------------------------|
| 名前                | Youtube                    | niconico                    |
| URL                | https://www.youtube.com/   | http://www.nicovideo.jp/    |
| クロール対象とするURL | https://www.youtube.com/.* | http://www.nicovideo.jp/.*  |
| 最大アクセス数       | 100                         | 100                         |
| 間隔                | 3000                       | 3000                        |
| ロール              | ユーチューバー                |   ニコラー                   |

他の項目はデフォルトです。

![webcrawler.png](https://qiita-image-store.s3.amazonaws.com/0/69140/2baa49ab-a3b9-11df-924c-19fde672281e.png)


# クロール

設定が終わったらクローラーを起動します。
システム > スケジューラ > Default Crawler を押下し、今すぐ開始を押下します。
しばらく待つとDefault Crawler が停止します。

# 検索

Default Crawler が止まったのを確認してから右上端にあるログアウトボタンを押下してログアウトします。
ログイン画面が表示されるのでyoukunユーザーでログインしてみます。
するとトップ画面が表示されるので、適当な単語で検索してみます。

![youkun.png](https://qiita-image-store.s3.amazonaws.com/0/69140/ac5f5fef-8b8b-a941-dc13-1776a7720b10.png)

Youtuberロールを持っているyoukunで検索で検索しているのでyoutubeの検索結果のみが表示されます。

同様にnicochanユーザーも試してみます。
画面上部のユーザー名の部分を押下し、ログアウトを押下します。
ログイン画面が現れるので、nicochanでログインし、適当な単語で検索してみます。

![nicochan.png](https://qiita-image-store.s3.amazonaws.com/0/69140/c5a35238-03e5-f2a5-caf0-c43d29ab3b73.png)


# まとめ

このようにFess10では簡単にロールベース検索を設定することができるようになってました。
今回はあまり実用的な例ではありませんでしたが、ロールベース検索を利用すれば色々と便利なシステムを作ることが可能になると思います。
SchemaSpy で Oracle データベースのドキュメント(HTML)を作成する

#前フリ
ScehmaSpy を使って、Oracle データベースのドキュメントの生成をしてみます。
頻繁にDBの定義が変わると、ドキュメント作成が後回しになりがち。
自動化できると便利なはず。

#環境
Windows7
Java7
Oracle 11g

#事前準備

##ドキュメントを読む
[SchemaSpy 公式サイト](http://schemaspy.sourceforge.net/) をまず読む。
  jar を実行すればよいだけに見えますね。

また、先人の知恵もお借りします。

- [CIサーバーとSchemaSpyでデータベースのドキュメント作成を自動化 ](http://www.slideshare.net/setoazusa/schema-spypublic)
- [SchemaSpyでOracle DBのドキュメントを作成する](http://te2u.hatenablog.jp/entry/2012/11/08/211133)

できる気がしてきた。

## インストール
公式ドキュメントを読むと、Graphviz を利用しているとのこと。
[Graphviz 公式サイト](http://www.graphviz.org/) から Windows 用インストーラをダウンロードする。
graphviz-2.38.msi を使って、デフォルト設定のままインストールを実行する。
C:\Program Files (x86)\Graphviz2.38　フォルダにいろいろ入っていることを確認して、スタートメニューからのexe 起動ができることも試しておいた。

# 実装

## プロジェクトの構成
プロジェクトの構成は以下のようにする。
プロジェクト名は「schemaspydemo」。
bin に コマンド実行ファイル（demo.bat）を格納する。
lib に jar ファイルを格納する。Oracle なので、ojdbc7.jar を格納しておく。
output は 実行結果を格納する場所として用意した。

```lang:txt
schemaspydemo
│      
├─bin
│      demo.bat
│      
├─lib
│      ojdbc7.jar
│      schemaSpy_5.0.0.jar
│      
└─output
```

## demo.bat の記述
Oracle の場合は接続方法によって、 -t を変える。今回は「Oracle with Thin Driver」 で接続しているので「orathin」となる。
$始まりは各自のデータベース情報に変更する。
最小限度と思われるパラメータ設定が以下の内容となる。
（キャレットで改行している。）

```lang:txt
java^
 -jar ../lib/schemaSpy_5.0.0.jar^
 -dp ../lib/ojdbc7.jar^
 -t orathin^
 -host $IP^
 -port $PORT^
 -db $SID^
 -s $SCHEMA^
 -u $USER^
 -p $PASSWORD^
 -o ../output^
 -charset utf-8^
 -gv "C:\Program Files (x86)\Graphviz2.38"
```

# 実行

demo.bat を実行する。
正常に実行できれば、コマンドプロンプトに以下のようなログが出てくる。

```lang:txt
Using database properties:
  [../lib/schemaSpy_5.0.0.jar]/net/sourceforge/schemaspy/dbTypes/orathin.properties
Gathering schema details...........(33sec)
Writing/graphing summary.........(1sec)
Writing/diagramming details........(0sec)
Wrote relationship details of 8 tables/views to directory '..\output' in 35 seconds.
View the results by opening ..\output\index.html
```

ログのとおり index.html を開けば、作成結果が確認できる。

![実行結果のhtml](https://qiita-image-store.s3.amazonaws.com/0/59985/865a8819-81ea-507c-c440-ad0cdddeeefe.png)

![実行結果のhtml2](https://qiita-image-store.s3.amazonaws.com/0/59985/30e98ee5-5c4b-edb6-53d9-b58de4f37a2b.png)


# 実行後の感想

対象としたデータベースには1000以上のテーブルがあったため、出力に大変時間がかかった。
（途中で止めてしまったが、650テーブル2h程度かかっていた。）
最初のお試しは、狙ったテーブルだけにしたほうがよい。

demo.txt に「 -i "tableNamesRegex"」を使うと対象が絞れる。
また、view のドキュメント作成が不要であれば 「-noviews」 を使うとよい。
テーブルごとにレコード数(Rows)が出力されているが、出力しないようにするパラメータ「-norows」があるので
このパラメータを入れると、件数取得しない分だけ早くなるかもしれない。

* * *

お手軽にHTMLが出力できた。
今回を基礎編として、次回は XLS 出力か差分出力かを試してみる。
.emacs とかがおかしくなった時…


### CUI 時代のアプリケーションを GUI で使う罠

mac とかで Emacs.app を使っていると、.emacs を弄っていておかしくした時に、起動時に

	Warning (initialization): An error occurred while loading `/Users/hogemogeo/.emacs':
	
	Symbol's value as variable is void: http://www.xsteve.at/prg/emacs/
	
	To ensure normal operation, you should investigate and remove the
	cause of the error in your initialization file.  Start Emacs with
	the `--debug-init' option to view a complete error backtrace.
	
とか怒られちゃう時がある。
上記の例では、 `http://www.xsteve.at/prg/emacs/` っていうのがシンボル扱いになってるけど？ って怒ってるんだけど、よくわからない怒られパターンも多々ある。

`--debug-init` で起動しろというけど、アイコンダブルクリックで起動してるし…

そんな時は、取り敢えず、`M-x load-file` で `.emacs` を読み込むと、この辺がおかしいと教えてくれる時がある。
ダメなときは、`Terminal.app` で、

	$ /Applications/Emacs.app/Contents/MacOS/Emacs -nw --debug-init

ってやれば、`Terminal.app` 内で起動するから、ココで何とかしよう。
draggableで移動させたdiv要素のxy座標位置を取得する方法

divにID「jquery-ui-draggable」が設定されている場合。
そのdivを動かした際の、xy座標位置を取得したければ、jsで下記のように実装する。

    var element = document.getElementById( "jquery-ui-draggable" ) ;
    var rect = element.getBoundingClientRect() ;

    // 座標を計算する
    var positionX = rect.left + window.pageXOffset ; // 要素のX座標
    var positionY = rect.top + window.pageYOffset ; // 要素のY座標

    // 結果書き出し用の要素
    var xElement = document.getElementById( "x" ) ;
    var yElement = document.getElementById( "y" ) ;

    // 結果の書き出し
    xElement.textContent = positionX ;
    yElement.textContent = positionY ;
jquery-uiをCDNから読み込む方法

jquery-ui を利用する際は、下記のようにCDNから読み込めばOK。

    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.19/jquery-ui.min.js"></script>
    <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.19/themes/redmond/jquery-ui.css">
    <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.19/i18n/jquery-ui-i18n.min.js"></script>
tensorboard が真っ白 0.8.0 rc0 2016-04-20 時点

表題のとおりです。手っ取り早く解決するなら、バージョンを 0.7.1 に戻してしまいましょう。

```
(venv環境で)
(venv)$ pip uninstalled tensorflow
(venv)$ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.7.1-cp27-none-linux_x86_64.whl
```

ちなみに、0.8.0 rc0 でのエラーは下記のようなものでした。

```
(tensorboard コマンドを実行している端末で)
"GET /external/web-animations-js/web-animations-next-lite.min.js.map HTTP/1.1" 404 -

(tensorboard を表示しているブラウザで)
"GET http://localhost:6006/lib/css/global.css HTTP/1.1" 404 -
他、d3.min.js:1 で大量のエラー
```

早くなおるといいな。
DockerHubにPushするときに認証エラーが発生したときの対処方法


苦労して環境構築したものを使いまわししたいのでDockerHubを試しています。
Pushすると
`unauthorized: authentication required`
ってエラーが・・・。

```
# docker push youheinakagawa/testos

Do you really want to push to public registry? [y/n]: y
The push refers to a repository [docker.io/youheinakagawa/testos] (len: 0)
ff4b4271129d: Preparing
unauthorized: authentication required
```


ここに解決方法が載っていました。

http://stackoverflow.com/questions/36663742/docker-unauthorized-authentication-required-upon-push-with-successful-login


Dockerにログインしたあと、
`~/.docker/config.json`
というファイルの`docker.io`となっている部分をURLに変更するだけでした。

`"docker.io": {`
↓
`"https://index.docker.io/v1/": {`

これで解決です！
最近読んだ「やった方がいいよ」が何故やった方がいいのか

[最近誰かに「やったほうがいいよ」と伝えた7のこと](http://www.slideshare.net/noriakikadota/7-60861137) というスライドがとても良かったので、僕なりに、何故やった方がいいかを書いてみたいと思います。

1. 共通言語を決める
2. 関連する法令はチェック
3. 技術的コミュニケーションを大事にする
4. タイムリミット、マイルストーンを設置する
5. ドキュメントを作りすぎない
6. トラブルを楽しむ
7. 無理な時は無理

## 共通言語を決める

> 同じ事柄を指しているのに、 サーバとフロントで英単語が違うとか、 MTG会話の中での微妙な使われ方が違うとか。 認識のズレの温床になるので、見つけたら名寄 せする。

ほんとこれ重要。同じ事柄を指す言葉は一つに集約されてないと、必ずトラブルの元になります。エンジニア間のコミュニケーションでもそうですし開発の依頼者(企画だったり顧客だったりでしょう)とエンジニアの間でもそうです。よくドメイン言語などと呼ばれますが、対象のドメインの言葉、つまりサービス開発であれば対象のサービスで使われる用語に統一しておくといいでしょう。

プログラミングという仕事は、設計にせよコーディングにせよ、どの作業段階においても、適切な名前を付けるという行為はきわめて重要です。このひとかたまりはどういう意味を持っていて、どういう名前を付ければ適切に読み解けるのか・理解出来るのか、名前から責務が容易に想像できるのか。プログラミング関連のスキルの50%位は適切な名前とのつきあい方に集約されるでしょう。

## 関連する法令はチェック

できる事・できない事、制約条件になるので早めに認識しておくべきですね。

## 技術的コミュニケーションを大事にする

> 誰が、どの領域を、どれぐらい詳しいのか。 今まで何をやってきて、今後何をしたいのか。 興味のあること、興味が全然ないこと。 各人が持っている知識や経験を チームメンバーで共有できる雰囲気は大事 お互いのレベルがわからないと、 あうんの呼吸が生まれず、一体感が出ない。

これもほんと重要ですね。人をないがしろにする組織だとこれができません。たとえば、相手が興味のあること、ないことを、許容できない、認めることが出来ない人、「べき」論で他人にスキルセットの習得を強要してしまう人がいると、成立しません。

## タイムリミット、マイルストーンを設置する

> いつまでもズルズルやっちゃう技術調査、 緊急対応はタイムリミットを設定する。 「やってみないとどれぐらいかかるかわかんな いからとりあえずやってみましょう」は やってみる時に必ず期日を設定する。 「この日までに終わってないとリリース延期」 をちゃんとマイルストーンとして置く。

重要ですねほんと。特にリーダーの人はバランス感覚が重要になってきます。あなたの会社でも「全然中身決まってないんだけど、とりあえずやってみよう」で始まって終わらないプロジェクトありませんか？特にこれは「決める人」がいない時に顕著になります。「やめる、やめないの判断ができる人」ですね。まぁここらへんは立場によって出来る事がかわってきますが、総じてそういう状況下だとグダグダになってしまうので、タイムリミット、マイルストーン的なものは全員が意識した方がいいでしょう。

ここで重要なポイントとしては、四つの要素を意識しましょう。

* 時間
* 予算
* 品質
* スコープ

今回、時間を固定にするというやり方だし(予算はそうそういじれないだろうから)、残る要素としては品質とスコープです。スコープというのは「どこまでの機能・要件を実装するか」です。

四つの要素全部が固定されていると、待っているのはデスマーチです。時間が決まってるんだからその範囲でできる事をしましょう。あなたの組織がメンバーに残業を強要しないことを願っています。

* [「Be Lazy」を極めるためには残業をしてはいけない - メソッド屋のブログ](http://simplearchitect.hatenablog.com/entry/2016/04/02/193553)

## ドキュメントを作りすぎない

本当にこれも重要ですね。ドキュメントがあるとそれを真実だと見なして皆行動するはずです。この時、ドキュメントと実際のコードに乖離があると混乱を招くことになります。ドキュメントが全く無い状態も辛いですが、作り込まれた嘘のドキュメントがあっても混乱を招くだけです。凝ったドキュメントはとにかくメンテナンスコストが増大してしまう原因です。なるべくDRY原則を守ったうえでうまくメンテナンスできる方法のバランスを見極めましょう。

* [Don't repeat yourself - Wikipedia](https://ja.wikipedia.org/wiki/Don%27t_repeat_yourself)


## トラブルを楽しむ

たぶん大事です。僕は胃の痛い思いばかりしてきましたが、時にはテンションがあがる感覚があるのも確かです。

> トラブルは起こしちゃダメだけど、 起きちゃったものはしょうがない

ほんとこれ。

少なくとも過失であった場合にはメンバーが責められない、萎縮させない環境は必要でしょう。

## 無理な時は無理

全くもってその通りです。無理な時は無理なんです！！！！！！！！！！

無理を通し続けると僕のように長い冬休みを取る事になるので注意しましょう。
すべての同じサフィックスを持つファイルから別のサフィックスを持つファイルを生成する

メモ
makeのサフィックスルールを使えば書けることだけどわざわざMakefileを書くのが面倒だったので調べた。
これだとhoge.c.oっていうファイルが書き出されてしまう。うまくhoge.oを書き出せないか

```shell
find ./ -name '*.c' -exec gcc -o {}.o {} \;
```
PCを移行したらdocker-machine start defaultでエラーが出た時の対応

Macにある移行アシスタントを利用してPCを移行した時に起きたのでメモ代わり。

```
$ docker-machine start default
```

と起動しようとしたら

```
Error setting up host only network on machine start: /usr/local/bin/VBoxManage hostonlyif create failed:
0%...
Progress state: NS_ERROR_FAILURE
VBoxManage: error: Failed to create the host-only adapter
VBoxManage: error: VBoxNetAdpCtl: Error while adding new interface: failed to open /dev/vboxnetctl: No such file or directory
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component HostNetworkInterfaceWrap, interface IHostNetworkInterface
VBoxManage: error: Context: "RTEXITCODE handleCreate(HandlerArg*)" at line 71 of file VBoxManageHostonly.cpp
```

このようにエラーがでた。

VirtualBoxのところでエラーだったので設定ファイルを読み込み直したら動いてくれました。

```
$ sudo launchctl load /Library/LaunchDaemons/org.virtualbox.startup.plist
```
xibで作成したViewの読み込み


xibファイルで作成したViewを読み込むコード

※xibのFile's OwnerにTestViewを指定すること

``` TestView.swift
var view: UIView!
    var nibName: String = "TestView"
    
    // default
    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }
    func setup() {
        view = loadViewFromNib()
        view.frame = bounds
        view.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]
        addSubview(view)
    }
    func loadViewFromNib() -> UIView {
        let bundle = NSBundle(forClass: self.dynamicType)
        let nib = UINib(nibName: nibName, bundle: bundle)
        let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
        return view
    }
```
GoogleカレンダーAPIとElectron

#やりたいこと
Googleカレンダーから会議室（特定のリソース）を取得して、Electronに表示させる。

#GoogleCalendarAPIの設定
1.googleDevelopersConsoleにアクセス
　https://console.developers.google.com/

![1.png](https://qiita-image-store.s3.amazonaws.com/0/60207/cacb17f4-e6e8-200d-03e8-67b7adc2a00d.png)

2.APIを有効にしてOAuthクライアントIDを作成

![2.png](https://qiita-image-store.s3.amazonaws.com/0/60207/e965a871-3d12-d8de-f1c3-218303045343.png)

![3.png](https://qiita-image-store.s3.amazonaws.com/0/60207/90fa5ef4-695e-06a8-3a59-994b4c0d0528.png)

3.アプリケーションの種類ををその他にして作成
ここで少し悩んだのですが、ウェブアプリケーションにすると認証後のコールバックページを用意する必要がありそうでしたので、その他にしました。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/60207/070dfefb-8b7e-4630-b05b-fb4c922dc497.png)

4.clientsecretをダウンロード
![5.png](https://qiita-image-store.s3.amazonaws.com/0/60207/702c82d4-8d33-08ea-6d59-afe36d0185c4.png)

#Electronの作成
※Electronのインストール方法は省略
※作成したアプリはクイックスタートを参照して作成しました。
https://developers.google.com/google-apps/calendar/quickstart/nodejs

googleapisとgoogle-auth-libraryのインストールでエラーが発生する場合は、npmを最新化するとエラーが消えました。

npmのバージョンアップ
npm install -g npm

## Electronアプリのファイル構成

  * css
    - style.css
  * js
    - jquery-ui-1.11.4
    - script.js
  * index.html
  * index.js
  * package.json

・GoogleCalendarAPIからダウンロードしたclientsecretを「client_secret.json」というファイル名にして自ユーザの
ホームディレクトリ内に.credentialsフォルダを作成してその中に入れます。
※Windowsでの話なのでMACの場合はindex.jsのTOKEN_DIRを適時修正

###ソース
githubにおきました。
https://github.com/zico07/kaigiList

概要：
　1.起動時にtokenを参照し、なければcrientsecretファイルを参照してOAuth認証処理に移ります。
　2.GoogleCalendarから、指定したリソースの当日予定を一覧表示します。
　※メインプロセスとレンダラプロセスの通信はIPCを使用しています。
Homebrewでbyobu (2016/04/20時点)

Macでも[byobu](http://byobu.org/index.html)が使いたい。
しかし、

```
$ brew install byobu
$ byobu-config
ERROR: Could not import the python snack module
```

[OSXにHomebrewでtmuxとEmacs 24.4をインストールする - Qiita](http://qiita.com/masato/items/ef0ffa626ca8bf46bf8a)
こちらの記事にもある通り、byobu-configが起動しない問題があった。
これが解決した。他に記事が見当たらなかったのでメモしておく。

OSはEI Capitan 10.11.4

```
$ brew info newt
...
==> Caveats
Python modules have been installed and Homebrew's site-packages is not
in your Python sys.path, so you will not be able to import the modules
this formula installed. If you plan to develop with these modules,
please run:
  mkdir -p /Users/<user>/Library/Python/2.7/lib/python/site-packages
  echo 'import site; site.addsitedir("/usr/local/lib/python2.7/site-packages")' >> /Users/<user>/Library/Python/2.7/lib/python/site-packages/homebrew.pth
```

newtのメッセージを元に、Pythonのsys.pathを通すだけ。
docker-machine + VirtualBox でDocker環境を用意する


# 概要

表題の通りです。[Docker Toolbox](https://www.docker.com/products/docker-toolbox) だとtoo much感があったので、自分でやる。
てか、いつの間にかboot2docker非推奨になってたんすね...


# 前提

## 環境

- Mac OS X Yosemite（v10.10.5）
- Homebrewで諸々installする

```bash
brew --version
#=> Homebrew 0.9.9 (git revision d183; last commit 2016-04-20)
#=> Homebrew/homebrew-core (git revision ed04e; last commit 2016-04-20)
```


# 流れ

## 0. 準備

```bash
# Homebrewはアップデートしときましょう
brew update
```

## 1. VirutalBoxをインストールする

Homebrew Caskで入れちゃう。

```bash
brew cask install virtualbox
```

## 2. `docker-machine`コマンドをインストールする

```bash
brew install docker-machine
#=> $ command brew install docker-machine
#=> （中略）
#=> ==> Summary
#=> 🍺  /usr/local/Cellar/docker-machine/0.7.0: 5 files, 39.0M
```

## 3. docker-machineを使ってDocker環境を作成する

`docker-machine create --help`で割と詳しい説明が読めるので、わかりやすかった。

```bash
docker-machine create -d virtualbox <任意の名前>
#=> （中略）
#=> 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 <任意の名前>

docker-machine ls
#=> NAME　　　　    ACTIVE   DRIVER       STATE     URL                          SWARM   DOCKER    ERRORS
#=> <任意の名前>    *        virtualbox   Running   tcp://192.168.xxx.xxx:xxxx           v1.11.0
```

## 4. `docker`コマンドで扱う準備

Dockerコンテナを操作するのは`docker`コマンドなんで、その辺の準備をしとく。

```bash
# `docker`コマンドをinstallしてなかったらしとく
brew install docker

# `docker`コマンドから起動した環境にアクセスするには、以下を実行しておく必要がある
# 必要に応じてbashrc的なファイルとかに書いとくとよいかも
eval $(docker-machine env <任意の名前>)
```


# おわりに

割とサクサクできて便利やった。よい。


# 参考

- [Homebrew で boot2docker から Docker Machine に移行する - CUBE SUGAR CONTAINER](http://blog.amedama.jp/entry/2015/08/21/221302)
- [Dockerのエラー対処方法 /var/run/docker.sock: no such file or directory. - Qiita](http://qiita.com/hshimo/items/70f5ad3287eac32ba7bf)
Javaで仮パスワードとかを作るときはcommons-langのRandomStringUtilsが便利

# はじめに
仕事で仮パスワードを発行する仕組みを作成しているので、
なんか適当なライブラリが無いか調べたのでまとめる。

# 使い方
commons-langをmavenなりgradleなりで通す。

```xml:pom.xml
<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-lang3</artifactId>
	<version>3.4</version>
</dependency>
```

# サンプル
```java:RandomStringTest.java
import org.apache.commons.lang3.RandomStringUtils;

public class RandomStringTest {

	public static void main(String[] args) {

		// アルファベット16桁
		System.out.println(RandomStringUtils.randomAlphabetic(16));
		// アスキー16桁
		System.out.println(RandomStringUtils.randomAscii(16));
		// 数字16桁
		System.out.println(RandomStringUtils.randomNumeric(16));
		// アルファベットと数字16桁
		System.out.println(RandomStringUtils.randomAlphanumeric(16));
		// 自分で設定した文字列からランダム16桁
		System.out.println(RandomStringUtils.random(16, "abcdefg"));

	}
}
```

```txt:実行結果
HXJcdIiVFbIUwvIe
}RPuODdHc%)BR[k'
8391904488624867
MVhTqGAzdf00kG2C
acefeaeeeadgcagg
```
すごく簡単。
php.iniの場所(Linux, Cent OS)

いつも忘れるので覚えとく

コンソールにこれを叩くとOK

~~~
ssh user@ip
php -i | grep "Loaded Configuration File"
~~~

一行目はサーバにログインするコマンドで、各自変更してね。
And it will show you something like this Loaded Configuration File => /etc/php.ini.
HTMLを15年書いてる僕が... の講演をします

先日僕が公開したコラム的なQiita記事、
「[HTMLを15年書いてる僕が語ってみる vol.1](http://qiita.com/thrbrd/items/6cc564770fc6248b3a25)」に続きまして、
在籍している会社のセミナースペースにてほぼ同タイトルの講演をさせていただきます。

## 語りたいこと

- 事業会社における理想のフロントエンドエンジニア像
- フロントエンドエンジニアのキャリアパス
- フロントエンドエンジニアの未来
- HTMLの話もするかも

すこしHTML成分は薄めかもしれませんが、
変化の激しいフロントエンド界隈ではタイムリーな話題をテーマにしたいと思っています。

## 対象

- キャリアに悩むフロントエンドエンジニア
- 技術以外も成長していきたいフロントエンドエンジニア

が主になるかと思います。

## イベント詳細

2016/04/25（月）20:00 - 21:00（21:00 - 22:00 懇親会）

渋谷駅近く、株式会社ビズリーチのセミナースペースになります。
以下イベントページをご参照ください。
http://d-cube.connpass.com/event/30511/

---

すこしでもご興味のある方、また、記事にご賛同いただけた方は、
是非ともご参加いただけますと幸いです！
MongoDBで実行したクエリをログに出力する

## 実行環境
- OS
    - Mac OS X

- MongoDBのバージョン
    - 2.4.12

## 手順
MongoDB起動時に下記のオプションを付与
```mongod  --logpath=/usr/local/var/log/mongodb/mongo.log -profile=1 --slowms=-1```
※logpathの場所は各自の設定に合わせること
※1ms以上のクエリのみ出力したい場合は```--slowms=-1```を```--slowms=1```に変更する

任意のクエリを実行し、
```tail -f /usr/local/var/log/mongodb/mongo.log```
でログが出力されていることを確認する
## 参考リンク
MongoDBで実行クエリを必ずログに出力する方法
http://kakakikikeke.blogspot.jp/2014/09/mongodb-logging-query.html
XAMPPでのPEAR::HTML_QuickFormのインストール方法

## XAMPPのPEARにHTML_QuickFormがインストールされていないと、ブラウザに以下のようなエラーが表示される。

Warning: require_once(HTML/QuickForm.php): failed to open stream: No such file or directory in C:\xampp ...

Fatal error: require_once(): Failed opening required 'HTML/QuickForm.php' (include_path='C:\xampp\php\PEAR') in C:\xampp ...


## HTML_QuickFormのインストール方法

### PEARのインストール状況を確認
1. コントロールパネルからShellを起動
2. **pear list** と入力して[Enter] → インストール状況を確認する
→ HTML_QuickForm がないはず

### インストールコマンド
1. **pear install HTML_QuickForm** と入力して[Enter]
2. 下記のように表示されればインストール完了


```lang:txt
WARNING: "pear/HTML_QuickForm" is deprecated in favor of "pear/HTML_QuickForm2"
WARNING: "pear/HTML_Common" is deprecated in favor of "pear/HTML_Common2"
downloading HTML_QuickForm-3.2.14.tgz ...
Starting to download HTML_QuickForm-3.2.14.tgz (103,993 bytes)
........................done: 103,993 bytes
downloading HTML_Common-1.2.5.tgz ...
Starting to download HTML_Common-1.2.5.tgz (4,617 bytes)
...done: 4,617 bytes
install ok: channel://pear.php.net/HTML_Common-1.2.5
install ok: channel://pear.php.net/HTML_QuickForm-3.2.14
```
input入力中にbody直下余白が発生 iphone safari ios9.3.*

# iphone6s ios9.3.*の時に発生
入力キーボードが出現すると自動で
bodyの一番下に余白が出現する。

最初は3pxほどだが、指でスクロール等すると20px程の白い余白が発生。

その分、一番下の要素をずらそうとすると
ちょちょぎれてどうしようもない。

body直下のdiv等では余白部分にレイアウト反映できないらしい。

解決方法見つからずorz

せめてbodyタグに色を追加したり、
height100%のところから、fixedにしちゃうとか、、、だろうか。
親ID（ancestryカラム）をnullで保存する方法


大小カテゴリ等を実装する際にancestryというgemを使って、親と子を作成している方がいると思いますが、今回は親ID（ancestryカラム）をnullで保存する（新しいレコードを親とする）方法を記載します。

## やり方

普通にancestryを空の状態で保存しようとすると、validateで怒られて保存出来ません。

しかしどうも空の値では保存できないが `nil` なら保存できるようなので、Modelに対して `before_validation` を行い、保存する値を変更しましょう。

Modelに以下を追記。

```
before_validation do
  self.ancestry = nil if self.ancestry.blank?
end
```

validationの前にancestryに空の値が入ってきた場合、無理矢理nilに変更しています。
このやり方なら親として保存できます。

パッと見、悪手な感じなので他に最善手を知っている方は是非お教え下さい！

参考： [Why do I get undefined method `before_save' for false:FalseClass when using if on before save?](http://stackoverflow.com/questions/15553471/why-do-i-get-undefined-method-before-save-for-falsefalseclass-when-using-if-o)
初めてChart.jsを使ってみた ドーナツ　凡例も表示 (投稿テスト)

#初めてChart.jsを使用したので個人的にメモをする。

以下、参考サイト

- [Chart.js サイト] (http://www.chartjs.org/)
- [Chart.js ドキュメント] (http://www.chartjs.org/docs/)
- http://liginc.co.jp/web/js/40934
- http://d.hatena.ne.jp/akishin999/20140715/1405434271
- http://k-holy.hatenablog.com/entry/2014/11/17/190927

グラフ作成は参考サイトを見れば分かるので割愛
・ツールチップ　tooltipTemplate
・凡例　legendTemplate 

```javascript

var myDoughnut new Chart(ctx).Doughnut(data,option);
document.getElementById("doughnut_legend").innerHTML = myDoughnut.generateLegend();
```

上の内容でグラフを作る際に、optionで渡すものの中にツールチップと凡例のテンプレートを渡す
ツールチップはそれで表示できる。
凡例はそこからgenerateLegend()で生成して表示

以下、渡すoption

```javascript

var option = {
  animationEasing : "easeOutCubic",
  tooltipTemplate: "<%if (value){%><%=value%><%}%>",
  legendTemplate : "<ul class=\"<%=name.toLowerCase()%>-legend\"><% for (var i=0; i<segments.length; i++){%><li><span style=\"background-color:<%=segments[i].fillColor%>\"></span><%if(segments[i].label){%><span><%=segments[i].label%></span><%}%></li><%}%></ul>"
};
```
※dataにvalue、fillColor,labelが入っている前提
virtualboxのパフォーマンスを上げる

# 背景

* virtualboxの上に、ubuntu環境を構築して、Ruby on Railsアプリを実装して、rspecで自動テストを実行する
* 環境構成は以下
    * デスクトップPC：　i7 8CPU, HDD, mem 16GB
    * windows7
    * virtualbox5.0
    * ubuntu desktop 14.04 LTS
    * rbenv
    * ruby 2系
    * Ruby on Rails 3系
    * rspec


# 問題

* rake specを実行すると、自分のノートPCのVM環境より、3倍遅くなった
    * VMイメージが、デスクトップPCからコピーした
    * ノートPC: i7 8CPU, SSD, mem 4GB
* さらに、デスクトップPCのデスクが、自動テスト中に、音をずっと出って入る


# 対応方法

* VM　→　設定　→　ストレージ　→　コントローラー：SATA
* 「ホストのI/Oキャッシュを使う」をチェックする

# 結果

* rake spec実行スピードが、9倍に速くなった
* デスクトップPCのデスクから、音も出っていない

# 参照

* http://holybea.com/2015/07/08/virtualbox-ubuntu/
guiflow簡単説明

## guiflow ってなんぞや？
画面遷移図を簡単にMarkdownっぽく書いて、後々の保守も楽々になるツールです。
詳しくは以下のリンク先を見てください。
[もう保守されない画面遷移図は嫌なので、UI Flow図を簡単にマークダウンぽく書くエディタ作った](http://qiita.com/hirokidaichi/items/ff54a968bdd7bcc50d42)

## 簡単説明
注：_この簡単説明は「guiflow ver0.1.1」を対象に書かれています。バージョンの差異によっては間違っている可能性もありますのでご注意下さい。また、1ユーザーがguiflowに惚れて書いてるだけですので、公式文書ではありません。_

### 基本構文
```
[タイトル]
処理1.1
処理1.2
---
処理1.3
===>タイトル2

[タイトル2]
処理2.1
---
処理2.2
===>タイトル3

[タイトル3]
... 以下略 ...
```
以上。
出来上がった画面遷移図はこちらになります。
![fig1.png](https://qiita-image-store.s3.amazonaws.com/0/28615/be6c0424-0fd8-a789-fffc-55d77ad9af33.png)

**簡単！！素敵！！！！**
#### 構文の解説
<dl>
<dt>ページ</dt>
<dd>私が勝手に1タイトルで括られた単位を呼ぶもの。</dd>
<dt>[タイトル]</dt>
<dd>対象となるページのタイトルなり、何かのグループのタイトルになりうる部分。1つのguiflowファイル内でユニークな名前。重複NG。</dd>
<dt>---</dt>
<dd>区切り。1つ以上のハイフンで上限数は無いっぽい。ただし、1ページ内において重複不可。「処理1-1」もNG。</dd>
<dt>===>タイトル2</dt>
<dd>遷移先。2つ以上のイコールと大なり記号。イコールの上限数は無いっぽい。遷移先ページタイトルと一致している必要がある。</dd>
</dl>

#### 書く上での注意事項
1. **Windows環境の方はコピペ厳禁。**試せる環境がないので他のOS等では分かりませんが、Windows7では基本構文にある例をコピペすると全く違うものが出来上がります。改行コードの違いか、文字コードの違いか・・・とにかくコピペは厳禁です。
1. ~~全角文字＋半角数字が苦手っぽい。枠からはみ出す事がよくあります。~~
1. 勝手に遷移先が繋がる事がある。勝手に繋がる条件は、「**ページ内に区切りがあり、後続行で別ページが定義されている時**」です。<br>繋げたくない時はページの定義順を入れ替えましょう。<br>以下の例ですと、勝手にタイトル2に繋がりますので、タイトル2と繋なげたくない場合は、先にタイトル2の内容を書きます。<br>

```
[タイトル]
処理
---
処理

[タイトル2]
処理
```
[Xamarin.Forms] 「"GenerateJavaStubs" タスクが予期せずに失敗しました。」というビルドエラーが発生

# 問題
VSでXamarin.FormsアプリをPCLで開発しています。
GPSのプラグイン**Xam.Plugin.Geolocator**をnuGetで導入したところ、
下記のビルドエラーが発生しました。
<font color="red">
"GenerateJavaStubs" タスクが予期せずに失敗しました。
System.InvalidOperationException: There can be only one type with an [Application] attribute; found: , , 
</font>

# 原因
Xam.Plugin.Geolocatorを導入すると同時に下記のプラグインも入ります。

- Plugin.CurrentActivity
- Plugin.Permissions

このPlugin.CurrentActivityが自動生成するMainApplicationクラスの中にある[Application]属性がもともとある[Application]属性と重複したのが原因です

この属性を消すか、自動追加されたクラスを削除すれば問題は解消されます。

[P3PPPさんありがとう](https://twitter.com/ticktackmobile/status/722361383589847040)
rake or rails コマンドでdbを扱うときのメモ

rakeコマンドはたまにしか使わなくていつも忘れてしまいます。

# rakeとは
便利タスクを呼び出せるツールのことです。この記事ではRailsで利用することを想定しています。Rails5からはrakeだけでなくrailsコマンドからも実行できるようになっています。

# migrationを実行

```bash:migrationを実行
rake db:migrate
```

# rake db:create データベースを作成
データベースが無いときはまずcreateで作成します。

```bash:データベースを作成
rake db:create
```

# rake db:drop データベースを削除
データベースを消すときに使います。

```bash:データベースを削除
rake db:drop
```


# migrate、drop、createを一気に実行

```
rake db:reset
```

# dbをロールバック
1つ戻ります。

```
rake db:rollback
```
ただし、rollbackする前にmigrationファイルを編集するとエラーがでます。


## 複数 rollbackしたい
複数一気にrollbackしたい場合は、STEPを使います。

```
rake db:rollback STEP=2
```

# dbのバージョンを表示

```
rake db:version
```

```
 bundle exec rake db:version
  ActiveRecord::SchemaMigration Load (1.9ms)  SELECT `schema_migrations`.* FROM `schema_migrations`
Current version: 20160221025548
```
Currentのバージョンが表示されました。
ここで１つrollbackしてからバージョンを表示します。

```
bundle exec rake db:rollback
bundle exec rake db:version
  ActiveRecord::SchemaMigration Load (0.2ms)  SELECT `schema_migrations`.* FROM `schema_migrations`
Current version: 20150812225828
```
Current versionが変わっているのがわかります。

# db:migrate:statusで履歴を表示
いままでにmigrationをした履歴が表示されます。

```
rake db:migrate:status
```

```bash:履歴表示例
bundle exec rails db:migrate:status

database: pugiemonn_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20160122000858  Devise create users
   up     20160122001228  Add columns to users
   up     20160205000644  Add name to users
   up     20160205000650  Create identities
```

# OS時間の確認
`time:zones:local` を使用するとローカルの時間を確認できます。

```
rake time:zones:local

* UTC +09:00 *
Osaka
Sapporo
Seoul
Tokyo
Yakutsk
```

Tokyoの時間と表示されています。
郵便番号のジオコーディング


[この前の論文](http://dx.doi.org/10.4992/jjpsy.87.14075)では郵便番号から緯度経度座標を求めるのにGoogle Maps Geocoding APIを使いましたが，それ以外にもHeartRailsというところが郵便番号や住所データの変換用API（[HeartRails Geo API](http://geoapi.heartrails.com)）を提供しています。このAPIをpythonから使う場合，`requests`パッケージと`json`バッケージがあれば事足ります。

基本的な手順としては，必要なパラメターを`payload`に設定し，`requests.get()`でAPIのURLにアクセスするだけです。正しく接続されれば，結果が`json`形式で返ってきますので，あとは必要な部分だけ抜き出します。

```python:geo_coding2.py
### sample script
import requests
import json

url = 'http://geoapi.heartrails.com/api/json'
payload = {'method':'searchByPostal'}
payload['postal']= '100-0001'

res = requests.get(url, params=payload).json()['response']['location'][0]
print('%s, %s, %s, %s, %s, %s\n' % (res['postal'], res['prefecture'], res['city'], res['town'], res['y'],res['x']))
```

上の例では，コーディング方法を`searchByPostal`（郵便番号検索）に，検索する郵便番号を`100-0001`にしています。たったこれだけのスクリプトでジオコーディングができてしまいます。

変換すべき郵便番号データがたくさんある場合には，それをリストに格納して`for`ループなどで処理すればいいでしょう。ただし，一度に大量のデータを変換した場合，アクセス制限がかけられたりすることがあるかもしれません。使用にあたっては，APIサービスの利用規約を遵守するようご注意ください。
php stripslashes

PHPを使ってDBに文字列を入れるとき

時々「"」や「'」を一緒に入れる時が訪れます。

```
$text = "php's sample";
```
みたいにあの文字列をただDBに入れると次のような結果がでます。

```
php\'s sample
```
「"」や「'」の前に「\」が勝手にくっ付くので取得して表示するのにややこしいことがあります。
その時に使うPHP関数としては「stripslashes」があります。

stripslashesは文字列に「\」がある場合、それを消してから値を戻してくれるありがたい関数です。

使い方は

```
echo stripslashes("php\'s sample");
```
になります。

結果は「php's sample」です。

PDOとかを使ったりすると


```
$stmt->bindValue(":db_text", stripslashes($postArray["text"]), PDO::PARAM_STR);
```
な感じで入れるだけで上の問題は解決できます。
gpg キーを更新した

最近は git でタグ付けする時に署名するようにしてるんでわりと使ってるんですよね。メールの暗号化はまったく使わないねえ。なんて書いてたら、なにやら GitHub 上で署名した結果が見れるようになっていたらしい。

| ![スクリーンショット 2016-04-20 9.31.48.png](https://qiita-image-store.s3.amazonaws.com/0/3336/731d6e03-229c-85c8-725b-4c07962104b4.png) |
|:---|
| ▲ GitHub の tags のページ |

せっせとタグ付けした甲斐があったね。といっても GitHub に公開鍵を登録しても関連するメールアドレスも一緒に登録しないといけなくて、そして前職のメールアドレスの登録はとっくに外しちゃったから在職中にタグ付けしたやつは軒並み Unverified になったまま。メールアドレスの追加できないし詰んだｗ 制限がきついｗｗ

ま、仕方ないか。

GitHub で gpg するのに興味ある人は以下にまとまってそうなので見るといいかと。

* [GitHubでGPGにより署名されたコミットにバッジが表示されるようになったので設定してみる](http://qiita.com/prince_0203/items/ef0e12f2f6d150ff0485)

さて本題。実は手元に2005年に作った鍵があって…さすがに古いので更新したいと思いやってみました。

## 状況

``` zsh
$ gpg --list-key takayama@aill.org
pub   1024D/1DC3A97F 2005-03-11
uid                  Kyosuke Takayama <takayama@aill.org>
sub   1024g/A6433B82 2005-03-11
```

## 新しい鍵の作成

有効期限12年で作ってみた。

``` zsh
$ gpg --full-gen-key
〜 なんか色々 〜
```

``` zsh
$ gpg --list-key takayama@aill.org
pub   1024D/1DC3A97F 2005-03-11
uid                  Kyosuke Takayama <takayama@aill.org>
sub   1024g/A6433B82 2005-03-11

pub   4096R/0B9F1899 2016-04-20 [有効期限: 2028-04-17]
uid                  Kyosuke Takayama <takayama@aill.org>
sub   4096R/EB8B6C8E 2016-04-20 [有効期限: 2028-04-17]
```

## 古い鍵で新しい鍵にサイン

古い鍵を作った人が新しい鍵を作ったよってことがちゃんと証明できるように署名。

``` zsh
$ gpg -u 1DC3A97F --sign-key 0B9F1899
```

## 古い鍵を無効にする

``` zsh
$ gpg -o takayama-old.revoke --gen-revoke 1DC3A97F
〜 なんか色々 〜
$ gpg --import takayama-old.revoke
```

## サーバに登録

古い鍵を revoke したので、その情報を送信。鍵サーバに登録してなかったら不要かな。

``` zsh
$ gpg --keyserver pgp.mit.edu --send-keys 1DC3A97F
```

新しい鍵も登録。

``` zsh
$ gpg --keyserver pgp.mit.edu --send-keys 0B9F1899
```

こんな感じで公開鍵も見れるようになったよ。

 * http://pgp.mit.edu/pks/lookup?op=vindex&search=0xDC1FABF10B9F1899

## 古い鍵を削除

手元にある古い鍵を削除。

``` zsh
$ gpg --delete-secret-and-public-keys 1DC3A97F
```

以上。
Atom セットアップ

Ruby用に Atom IDE をセットアップします。
atom-ctags は tag 作成に時間がかかりすぎるとエラーになるようなので、ターミナルから ctags を実行しています。

# 前提
* OSX 10.11
* Atom 1.7.2
* Ruby用

# 手順
## Atom
* https://atom.io/

## atom-package
* ツールバー > Atom > Preferences > Install から、以下を検索してinstall
    * autocomplete-plus

## ctags
* インストール

```
$ brew install ctags
```

* 作成

```
$ cd path/to/project
$ ctags --langmap=RUBY:.rb --exclude=vendor --exclude=*.js --exclude=log* --exclude=*.log --exclude=.bundle --exclude=.git -R .
```

* Atom で読み込むようにリネーム

```
$ mv tags .tags
```

## スペースだけの行でも、スペースを消さない (diffが...)
* ツールバー > Atom > Preferences > Packages > whitespace
    * Remove Trailing Whitespace を OFF
* もしくは config.cson に↓

```
"*":
  whitespace:
    removeTrailingWhitespace: false
```

# 操作
## 定義へ飛ぶ
* 右クリ > Go to Declaration もしくは Alt+Cmd+down
* 戻る時は Alt+Cmd+up

## 検索
* 除外パスの指定例
    * !vendor, !log*, !*.log, !tmp, !.git

# 注意点
* なし
共分散選択法によるグラフィカルモデリング

共分散選択法により，最適なモデルを作成するためのRスクリプトです（要ggmパッケージ）。

### 使用法
```r
cov_select(
    model = x, # 分析モデル
    cov = y,   # 共分散行列
    n.obs = 100, # データ数
    AIC = Inf    # 比較対象のAIC（通常は省略）
    cov_orig=NULL # 元の共分散行列（これも指定の必要なし）
)
```

### 使用例
```r
x1<-c(8,14,6,14,6,13,6,5,18,10)
x2<-c(8,16,2,8,10,14,6,12,12,10)
x3<-c(8,2,13,7,9,12,10,12,7,8)
x4<-c(7,1,10,8,12,1,9,8,6,14)
x5<-c(3,1,8,9,2,5,9,6,5,1)

COV<-cov(cbind(x1,x2,x3,x4,x5))

# 初期モデルとして全変数間に関係をもたせたモデルを作成
g_model<-UG(~x1*x2*x3*x4*x5)

# 初期モデルの描画
drawGraph(g_model, adjust= FALSE)

# 修正モデルの描画
cov_select(g_model,COV,length(x1))
初期モデルと修正モデル
```

![分析結果のモデル](http://cl.ly/1X2n1q072g1o/tumblr_inline_nfr551dTdr1t50zgu.png "初期モデル（左）と修正モデル（右）")
図：初期モデル（左）と修正モデル（右）

### 関数定義
```r:cov_select.R
cov_select<-function(model=x, cov=y, n.obs=0, AIC=0, cov_orig=NULL){
  require(ggm)
  if(is.null(cov_orig)){cov_orig<-cov}
#  print(sprintf("AIC= %.4f", AIC ),quote=F)
  #' 偏相関行列を作成
  pmat<- (-1)*solve(cov) / sqrt(diag(solve(cov)) %*% t(diag(solve(cov))))
  diag(pmat)<- 1
  
  #' 偏相関係数を絶対値に変換
  amat<-abs(pmat)
  
  #' モデルの係数が0の箇所を無限大に設定
  amat[which(model==0)]<-Inf
  
  #' 偏相関の絶対値が最小の要素を0にした修正モデルを作成
  model_post<-rep(1,nrow(cov))%*%t(rep(1,nrow(cov)))
  model_post[which.min(amat)]<-0
  model_post<-model_post * t(model_post) * model
  
  #' モデルのフィットとAICの算出
  f<-fitConGraph(model_post,cov_orig,n.obs)
  AIC_post<-f$dev-2*f$df
  
  #' モデルの適合度が最大になるまで反復
  if (AIC_post<AIC){
    Recall(model_post,f$Shat,n.obs,AIC=AIC_post,cov_orig=cov_orig)
  }
  
  #' 最終的に得られたモデルを描画 & 偏相関行列を表示
  else{
    diag(pmat)<-1
    pmat[which(model==0)]<-0
    model.0<-model*0
    f<-fitConGraph(model,cov_orig,n.obs)
    f.0<-fitConGraph(model.0,cov_orig,n.obs)

    # GFIの算出
    S<-cov2cor(cov_orig)
    H<-cov2cor(f$Shat)
    p<-nrow(cov_orig)
    num<-sum(diag((solve(H)%*%(S-H))%*%(solve(H)%*%(S-H))))
    den<-sum(diag((solve(H)%*%S)%*%(solve(H)%*%S)))
    GFI<-1-(num/den)
    AGFI<-1-(p*(p+1)*(1-GFI))/(2*f$df)
    RMSEA<-sqrt(max(((f$dev-f$df)/(f$df*(nrow(cov_orig)-1))),0))
    CFI<-(f.0$dev*f.0$df-f$dev*f$df)/(f.0$dev*f.0$df)
    res<-f
    res<-c(f,GFI=GFI, AGFI=AGFI,RMSEA=RMSEA,CFI=CFI)
    return(list(fit=res,model=model, covmat=pmat))
  }
}
```
GetDirectoriesのワイルドカードで文字数は制限できない

#目的の処理
あるディレクトリのサブディレクトリから最新を取得したい。
サブディレクトリは日時（yyyyMMddHHmmss）とになっている。
作業用フォルダ（TempyyyyMMddHHmmss）があることもあるがそれは除外する。
つまり**14文字のフォルダ名で一番大きいフォルダ名**を取得したい。

20160111031203
20160315112315
20160323231822
20160402095559
20160415060703
Temp20160419105509

上記であれば、
20160415060703
を取得する。

#書いた処理
```
My.Computer.FileSystem.GetDirectories(root, FileIO.SearchOption.SearchTopLevelOnly, "?????????????").OrderBy(Function(v) v).LastOrDefault())
```
ワイルドカードで14文字に限定した。

#処理結果
取得できたフォルダは意図していない
Temp20160419105509
だった。

#理由（推測）
ワイルドカードの中に固定の文字が無いと検索できない？
つまり今回の場合は*を置いているのと同じ状態？？
実際ワイルドカードを、
"??????15??????"
としたところ
20160315112315
20160415060703
が取得できた。

この部分の仕様がどこにあるのかわからない。
Linux Kernel 関連の便利ページ

新社会人でカーネルを触り始める人がどれだけいるか分からないですが、社内向けにこんなページあるよって紹介したので、一般的にも何か役立つかもと思ったので書いておきます。

# The Linux Kernel Archives
https://www.kernel.org
とりあえず mainline の最新パッチや stable, logterm を確認したければここ。

# Linuxカーネルのgitリポジトリ
https://git.kernel.org/cgit/
細かく分かれすぎて謎だが、各アーキテクチャやコンポーネント単位で区切られているはず。

# Linux Kenrel Mailing List (LKML)
https://lkml.org
カーネルの議論やパッチ内容をあれこれ言うメーリングリストのアーカイブ。lkmlに登録すると山のようにメールが来るので、特定の話題だけピックアップしたいならここで探したほうが良さそう。

# Linux Cross Reference
http://lxr.free-electrons.com
LXRでタグ付けしたソースコードをフリーで公開してくれている。パッとカーネルソースを見たいときは便利だが、全ての版数があるわけではない (個人的には GNU GLOBALやOpenGrokのタグシステムの方が好き)。

# Linux Kernel Newbies
http://kernelnewbies.org
Linuxカーネルに追加された新機能や重要な修正などのサマリを書いてくれているページ。結構ちゃんとまとまってるので、動向整理には重宝する。

例
 - [Linux 2.6.35](http://kernelnewbies.org/Linux_2_6_35)
 - [Linux 2.6.35-DriversArch](http://kernelnewbies.org/Linux_2_6_35-DriversArch): 2.6.35から各種ドライバのアーキ対応が別ページになった
 - [Linux 3.0](http://kernelnewbies.org/Linux_3.0)
 - [Linux 4.5](http://kernelnewbies.org/Linux_4.5): 2016/04/19時点の最新

# Linux Weekly News
https://lwn.net
有料購読メニューもあるが、無料で読める記事も非常に有益。LWNの一部は日本語で[Linux 天気予報](http://www.linuxfoundation.jp/news-media/lwf)として提供されている。

記事例
 - [Transparent huge pages in 2.6.38](https://lwn.net/Articles/423584/)
相関行列を偏相関行列に変換する

相関行列をもとに対角成分を1とする偏相関行列を作成するためのスクリプトです。

```r:pcormat.R
pCor<-function(x){
  pcor<- (-1)*solve(x) / 
     sqrt(diag(solve(x)) %*% t(diag(solve(x))))
  diag(pcor) <- 1
  pcor
}
```
UITableView の Section を Swift の enum を使って安全に記述する方法

## 環境

- Xcode 7.3
- Swift 2.2
- そんなに新しい機能は使ってないので特に気にしないでください

## 背景

UITableView の Section は Int なので switch case で網羅性をチェックできないので仕様変更に変更に弱いのが悩みの種です。

例えば以下のコードだと `section == 0` ってどんな Section だっけ？ ってなったり、 default を使っているので仕様変更で `section == 2` が追加された時に記述漏れが発生したりします。

人間がこの辺を把握するのは辛いので可能であればコンパイル時に Section の追加漏れがあるよ！ってことを警告(もしくはエラー)して欲しいです。

```swift
 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        switch section {
        case 0:
            return 3
        case 1:
            return 4
        default:
            return 0
        }
    }
```

## そこで Swift の enum の出番

[PlayGround のコードを Gist に貼り付けておきました。](https://gist.github.com/mironal/d640c57e06ce2f644137e8dc182e1256)

動かしてみたい人は以下のコマンドを実行してダウンロードできますので試してみてください。

`curl https://gist.githubusercontent.com/mironal/d640c57e06ce2f644137e8dc182e1256/raw/622a731be4e695fe2c7194eb579e7e600e3a3fe9/UITavlewViewSection.swift > UITablewViewSection.playground`

動かすとこんな感じの UITableView が表示されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/17704/1965f72e-2388-30e1-d31b-e9720e57a7b4.png)


このコードで重要なのは以下の2箇所ぐらいです。

```swift:大事な所1
enum Section: Int {
    case Animals = 0
    case Foods
}
```

```swift:大事な所2
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        switch Section(rawValue: section) {
        case .Some(.Animals):
            return animals.count
        case .Some(.Foods):
            return foods.count
        case .None:
            return 0
        }
    }
```

### 大事な所1

大事な所1で Int の enum を定義して、それぞれのセクションに名前をつけています(今回は Animals と Fools)。

このようにすることでまず Int の section を enum の Section に変換できるのでより安全にプログラミングできるようになります。

何が安全なのかといいますと次の説明でわかります。

### 大事な所2

そして、大事な所2で UITableView の delegate に渡される Int の section を enum の Section に変換して switch case しています。

このように Int ではなく enum で switch することで enum の種類が増えた場合、例えば :beer: が追加してみます。

```swift:🍺追加
enum Section: Int {
    case Animals = 0
    case Foods
    case 🍺
}
```

すると以下の様な感じでエラーが出ます。

`switch must be exhaustive...` -> `switch は網羅的でなければなりません...`

といった具合にコンパイル時に switch の case に漏れがあるということをえ教えてくれています。

もちろんエラーが発生しているのでこのプログラムは実行できません。

間違ったプログラムが実行できないので `安全` なのです。

![image](https://qiita-image-store.s3.amazonaws.com/0/17704/9af40e8d-c0ae-0c6a-adff-24adc00ce8bc.png)

余談ですが、 Objective-C で enum を作ってキャストしてから switch case すると似たようなことは出来ますが、未定義な case の値(swift の場合は None になるパターン)があった場合、コンパイル時に検出はできず実行時にクラッシュしますので若干安全ではないです。

## 悩み

セルを返す delegate (`func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell` )では戻り値が `UITableViewCell?` ではなく `UITableViewCell` なので未定義な section が渡された場合どのように処理すると綺麗なのかが悩ましい(場合によるだろうけど..)

今回の場合は面倒だから基本的にクラッシュするようにしてる。

## まとめ

Swift では UITableView の Section を enum で定義することでわりと安全にプログラムすることができる。
因子負荷の低い項目を自動で削除する

因子負荷の低い変数を手作業で削除して因子分析を繰り返すのが面倒だったので，一定基準で変数削除して結果が収束するまで自動的に因子分析を繰り返すという，かなり横着な処理を行うためのスクリプトを作成しました。

### 使用例（要psychパッケージ）

```r
res<-drop_item(fadata, min=0.4, max=0.3, verbose=F, nfact=3, rotate="oblimin", fm="ML")
```

### 引数の説明
```r
drop_item(
  df = fadata,  # 分析に使うデータフレーム
  min = 0.4,    # 因子負荷量の最大値がこの値未満の変数を削除
  max = 0.3,    # 複数因子にこの値以上の負荷を持つ変数を削除
                #（省略時は1.0）
  verbose = F,  # 冗長モード（Tなら毎回の因子分析結果を表示）
  ...)          # ... は因子分析 `fa()` に使用するオプション

```

以下は関数の定義

```r:drop_item.R
drop_item <- function(df = x, min=0.3, max=1,verbose=FALSE,...){
    ncol=length(colnames(df))
    res<-fa(df,...)
    if(verbose){print(res)}
    df2<-df[,apply(abs(res$loadings),1,function(i){
       ifelse((i[order(-i)][1]<min)||(i[order(-i)][2]>=max),
       FALSE,TRUE)})]
    diff=ncol-length(colnames(df2))
    if (diff>0){
       print(paste(diff," item(s) were dropped",sep=""))
       res<-Recall(df2,min=min,max=max,verbose=verbose,...)}
    res
}
```
MacのEvernoteでダブルクオート(")ががってに変換されるのを防ぐ

MacのEvernoteを使っているとダブルクオート

このように入力したのに
"katamuki"
↓
“katamuki"

こうなる

"が“に変換される
Scriptとか書いててウザイナーと思ってたら
これMacの設定だった （まったくもって余計なおせっかい）
 
設定は下記
「システム環境設定」→「キーボード」→「ユーザー辞書」
*スマート引用符とスマートダッシュを使用*
のチェックを外す
![スクリーンショット evernoteDoubleQuote.png](https://qiita-image-store.s3.amazonaws.com/0/1547/ac541d86-36a1-c7f4-2c85-23fa3d4b505a.png)
順序尺度データで確認的因子分析を行う

lavaanパッケージのcfa()を用いて確認的因子分析を行う際，順序変数名を`ordered=オプション`に指定するか，順序変数を**順序つき**の`factor`にしたうえで`cfa()`を実行します。

```r
library(lavaan)
fit <- cfa('モデル', data=データ, ordered=順序変数の変数名)
```

* 変数名はリストで与える。
* データセットに含まれる変数がすべて順序尺度なら， `ordered=colnames(データセット) `でよい。

### 結果要約

```r
summary(fit, standardized=TRUE, rsquare=TRUE)
```

### モデル一致度

```r
fitmeasures(fit)
```

### ダイアグラムの作成
```r
library(semPlot)
semPaths(fit, "std", style="lisrel", fade=F, gray=T)
```

[参考リンク](http://t.umblr.com/redirect?z=http%3A%2F%2Flavaan.ugent.be%2Ftutorial%2Fcat.html&t=MTJjMDczNDcwYWIyZDU4MjA5YzZjZDViYTdlMjA5ZTkxYWM2YWQyZSxSZmpUUzh0ag%3D%3D)
順序尺度データでアルファ係数を求める

ポリコリック相関を算出できるデータに限りますが，データのポリコリック相関の相関行列を用いればα係数を算出することができます（要 psych パッケージ）。


```r
pmat <- polychoric(データ行列)
alpha(pmat$rho)
```

[原論文](http://t.umblr.com/redirect?z=http%3A%2F%2Fpareonline.net%2Fpdf%2Fv17n3.pdf&t=MGRkMzFkZGNjNWE3MDBlMWNkOTJmMzEzYjdlNGM1NTJkMjA2MGRiZCxWYlpnMjBsMA%3D%3D)
# ITエンジニアのための機械学習理論入門（第６章）


## k平均法（k-means）による教師なし学習の基礎
 * 学習には教師あり学習と教師なし学習が大きく分けて存在する
     * 教師あり学習
         * 与えられたデータセットがどのように分類されるかが与えられている
         * 分類されるべきラベルが与えられているため，各データが分類される条件を見つければ良い
             * クラス分類
     * 教師なし学習
         * 与えられたデータセットに対して分類されるべきラベルが与えられていない
         * そのため与えられたデータより，各データの類似性を発見しクラスタを作成する必要がある
             * クラスタリング
 * とは言っても根本的なアイディアは教師あり学習とは変わらない
   * k-meansは何らかの指標を最小化する
       * 根本は最小二乗法、パーセプトロンとかも同じです
   * EMアルゴリズムは特定のクラスタが得られる確率を最大化する
       * 最尤推定法と似ている

###  k-meansのアルゴリズム
* データセットが与えられたときにN個の代表点を与える
 * この代表点の位置や数は任意に与えないる必要がある
     * データセットから各代表点の距離（類似度）を計算し，各データは最も近い代表点のクラスタに属すると決定
         * この距離はユークリッド距離以外にもマンハッタン距離とかも使えるし、自分で定義したものも当然使える
 * 各クラスタの重心を計算し，その重心を代表点に更新する
 * これまでの処理を繰り返し重心が更新されなくなったら終了


## 怠惰学習モデルとしてのk近傍法
 * k近傍法
     * データ間の距離に基づいて計算を行う教師あり学習のクラス分類アルゴリズム
 * 新しいデータが入力されたときにそのデータから近いK個のデータを見てもっとも多いクラスに分類される
     * 周囲のデータの多数決で自分のクラスを決定する
 * 問題点
     * 処理時間
         * k近傍法は事前にモデルを構築する必要はない
             * 逆に新しいデータを分類するたびに処理に時間を要する
     * 分析のモデルが明確でない
         * k近傍法はデータからなんらかの仮説を立てて適用するわけではない
             * 例えばパーセプトロンやロジスティック回帰は、データを見てそのデータが線形関数により分類可能だと仮設を立てて適用する
                 * 適用した後はそのモデルを基に検証することが可能
         * ビジネス的には良い結果が得られるかもしれない
             * しかしなぜ良い結果となったのかの検証がしにくいため継続的な改善が難しい
             * 上手く行かなかった場合も改善が難しい