OmniAICreator/Qiita-1.07M huggingface dataset:
Swift の列挙型で独自クラスを Raw 値に使う


# 目的

Swift 言語の列挙型 では、各列挙子に Int 型 などの Raw 値を割り当てて、その値を使ってプログラムを制御できるようになっています。

独自のクラスでも条件を満たせば enum 型の Raw 値として利用できます。

# 独自クラスを Raw 値として使うための条件

* インスタンスをリテラルから変換できる
* Equatable プロトコルに準拠している

# Raw 値として使えるクラスを定義する

とても簡単な例ですが、次のようにInt型 の値を保持するプロパティ ```value``` を持ったクラス ```swift MyLiteral``` を用意して、これを列挙型の Raw 値として使えるようにしました。

```swift
class MyLiteral : IntegerLiteralConvertible, Equatable {

	var value:Int
	
	required init(integerLiteral value: IntegerLiteralType) {
	
		self.value = value
	}
}

func ==(lhs: MyLiteral, rhs: MyLiteral) -> Bool {
	
	return lhs.value == rhs.value
}
```

## なんらかのリテラルから変換できるようにする

今回は **整数値リテラル** から変換できるクラスにするために ```IntegerLiteralConvertible``` プロトコルに準拠させています。

このプロトコルでは、イニシャライザ ```init(integerLiteral value: IntegerLiteralType)``` の実装が求められています。

> リテラルというのは、たとえば整数値であれば ```100``` といったテキストですし、小数点数であれば ```10.5``` といったテキストです。文字列もリテラルで ```"TEXT"``` といったテキストになります。

## Equatableプロトコル に準拠させる

また ```Equatable``` プロトコルに準拠させて、等号による一致判定ができるようにする必要があります。

このプロトコルで要求される実装は ```==``` 演算子 なので **クラス定義の外側で** プロトコルが求める演算子を実装しています。


# 独自クラスを列挙型で使う

条件を満たしたクラスは、列挙型の Raw 値として利用できます。

```swift
enum MyEnum : MyLiteral {

	case once = 1
	case twice = 2
}
```

* 初期値はリテラルで設定します。
* 整数値リテラルで扱う場合は、省略時は最初の項目に 0 が割り当てられます。

# 独自クラスを使った列挙型を case 文で使う

列挙型のRaw として独自クラスを使っても、列挙型の扱い方は普段と何も変わりません。

```swift
let times = MyEnum.twice

switch times {

case .once:
	println("ONCE")

case .twice:
	println("TWICE")
}
```

# 列挙子から独自クラスのインスタンスを取得

独自クラスを使った列挙型の変数からは ```rawValue``` プロパティを使ってインスタンスを取り出せます。

```swift
let raw:MyLiteral = times.rawValue
```

列挙子から直接、インスタンスを取り出すことも可能です。

```swift
let raw:MyLiteral = MyEnum.twice.rawValue
```

# Raw 値から列挙子を取得

Raw 値で指定したクラスのインスタンスから、該当する列挙子を取得できます。

```swift
let value:MyEnum? = MyEnum(rawValue: raw)
```

このようにすると ```raw``` 変数に格納されている ```MyLiteral``` 型のインスタンスに該当する列挙子が取得できます。該当しない場合は ```nil``` が得られます。

上記の ```rawValue:``` には、インスタンス以外にリテラル値も直接指定できます。その場合は、リテラル値からインスタンスが作られた上で、該当する列挙子が探されるようです。

> 該当する列挙子を探すとき、その列挙型が想定するケースを順番にインスタンス化して、渡された Raw 値と ```==``` 演算子で比較し、一致したものを「該当するもの」と判断するようです。

# 列挙子の扱われ方

* 列挙型の変数には **リテラルの値** が格納されている様子
* ```rawValue``` にアクセスしたときに **その都度** 変換イニシャライザでインスタンスが **生成** される様子

---

[詳細] http://ez-net.jp/article/6E/p1hF8GZD/L71D-l9SfKfl/
Titaniumの開発環境をXcode6, iOS8に合わせる


ようやく環境更新。

こんなん出てたので直した。

```
[ERROR] :  Invalid "--sim-version" value "8.0"
Accepted values:
   7.1
For help, run: titanium help build
```
※ なお、当然ですがXcode6が必要。

# Titanium Studioを更新

2014/09/29に3.4.0がリリースされているので`help->Check for Titanium Updates`からInstall

# SDKも更新

こちらもTitanium Studioと同日にSDK3.4.0GAがリリースされているので`help->Install Titanium SDK...`からInstall

自分の場合、Project Build Pathが勝手に3.4.0になってくれなかったので手動で変更。

![Screen_Shot_2014-10-19_at_14_23_15.png](https://qiita-image-store.s3.amazonaws.com/0/8868/9154714a-bd8a-b44b-5442-eae7a83d4d29.png "Screen_Shot_2014-10-19_at_14_23_15.png")

# tiapp.xmlのSDK versionを更新

```tiapp.xml
<sdk-version>3.4.0.GA</sdk-version>
```

念のためTitanium Studio再起動してProject Cleanしたら動いた。

以上。
Yosemiteの日本語入力で使えなくなったショートカット（Options-S）を復活



## 半角英数字に変換するショートカットが変わった

Yosemiteになって「ことえり」が「JapaneseIM」に代わったそうです。

参考：
[OS X Yosemite：日本語入力エンジン「ことえり」を終了し、新しい「日本語IM」を新採用 | Mac OS X | Macお宝鑑定団 blog（羅針盤）](http://www.macotakara.jp/blog/mac_os_x/entry-24770.html)

日本語入力中に<kbd>Option</kbd>+<kbd>S</kbd>で半角英数に変換、ということえりの操作が染み付いてしまっているので、このショートカットが変更されていることに頭を掻きむしりました。

<kbd>Option</kbd>+<kbd>S</kbd> を押すと半角カタカナになってしまいます。

![01_default.gif](https://qiita-image-store.s3.amazonaws.com/0/35819/7f56c2d0-28f3-8c20-dbf8-76649d4316e2.gif "01_default.gif")


## 方法1：Karabiner

[Karabiner](https://pqrs.org/osx/karabiner/)
「高機能で安定性も極めて高いOS X用のキーボードカスタマイズツール。」

以下のような`private.xml`を使用することで、元のショートカットを復活させました。

```private.xml
<?xml version="1.0"?>
<root>

  <item>
    <name>Restore Kotoeri Key Bindings to OS 10.10+</name>
    <identifier>private.input.japanese</identifier>

    <inputmode_only>JAPANESE</inputmode_only>

    <autogen>
    __KeyToKey__
    KeyCode::S, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_OPTION,
    KeyCode::JIS_COLON, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_CONTROL
    </autogen>
  </item>

</root>
```

入力ソースが日本語のときのみ、従来のキー・バインディング（<kbd>Option</kbd>+<kbd>S</kbd>）を、新しいショートカット（<kbd>Control</kbd>+<kbd>:</kbd>）にリマップしています。

`private.xml`を保存したら、Karabinerの設定画面に戻って［ReloadXML］してから、新しく作った設定のチェックボックスをOnにして、適用。

![02-modified.gif](https://qiita-image-store.s3.amazonaws.com/0/35819/1944af67-bec5-d580-dc8e-417ae83bf6b1.gif "02-modified.gif")



## 方法2：JapaneseIMの設定ファイルを書き換える

`/System/Library/Input Methods/JapaneseIM.app/Contents/Resources/KeySetting_Default.plist`を見ると、次のような行があります。

```
<key>option+&apos;s&apos;</key>
<dict>
	<key>command</key>
	<string>transliterate_narrow_katakana</string>
</dict>
```

この`transliterate_narrow_katakana`を`transliterate_roman`に書き換えることで、直接的に修正可能と思われます。

参考：[ドイツ語の文章を書くとき、optionキーを使ったウムラウトが使えません。イタリア語などのop... | Apple サポートコミュニティ](https://discussionsjapan.apple.com/thread/10153723)
SwiftとPlayframework(Java)でログイン処理を書いてみた。(アプリ側とサーバー側の連携)

初投稿です。
ログインシステムとして甘すぎるなど
突っ込みどころ満載だと思いますが、
アプリ側とサーバー側の連携の簡単なサンプルとして以下のようなものを作ってみました。

①アプリ側(swift)でユーザー名とパスワードをサーバー(Playframework Java)に送信。
②サーバー側でDBにあるユーザーデータと照合。
③結果をアプリ側に返してログイン成功、失敗ごとに処理を分岐。

プログラム初心者なのでいろいろとご指摘いただけると幸いです。

# 環境
アプリ側：Xcode 6.0.1
サーバー側：Playframework2.3.5(java)
データベース：Mysql

# Screen Shot
![スクリーンショット 2014-10-19 午後2.37.44.png](https://qiita-image-store.s3.amazonaws.com/0/41892/fea4082f-111d-7583-a047-deb98ae62d95.png)


# ソースコード(Github)
アプリ側(swift)：https://github.com/yuinchirn/loginSample
サーバー側(playframework java)：https://github.com/yuinchirn/loginSample-server

# DB構造(Mysql)
データベース名：loginSample
テーブル名：user_account

### CREATE文
```
CREATE TABLE `user_account` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_name` varchar(255) DEFAULT NULL,
  `user_hash` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  `create_date` datetime DEFAULT NULL,
  `update_date` datetime DEFAULT NULL,
  `delete_flg` tinyint(1) DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
```
user_nameとpasswordのカラムに入れた文字列が
ログイン認証に使われます。
Yosemiteを入れてbundleを通すまでにやった事

先週金曜日にリリースされたOS X Yosemiteをインストールしてbundleを通すまでにやった事や、感じた事を、時系列でざっくり書いてみたいと思います。

Qiitaに投稿するのは初めてなのですが、読み難かったらすみません。

---

先週木曜夜：
リアルタイムで色々見たかったけど、眠気に勝てず早めに就寝。
↓
先週金曜朝：
どんな発表があったかなーとニュースサイトをチェック。Yosemiteが即日リリースされる事を知る。
Mavericksをインストールした時も即日インストールしたのですが、今回もそうしようと決める。
https://twitter.com/snowsunny1107/status/522870867647139840
↓
会社に着いたので早速AppStoreを開きアップデートをクリック、Yosemiteの更新が来ているのを確認。でもそれ以外の更新も来ていたので、先にそっちを済ませ、次にYosemiteをインストール。
↓
AppleIDにサインインしてインストールを開始、5GB強のダウンロードが始まる。
※途中で一回パスワードを聞かれた気がするので、インスールする際は、時々進捗を確認するのが良いかなと思います。
↓
ダウンロード後、自動で再起動、インストールが始まる。（この時点で40分くらい経ってました）
そこからインストールが始まって、表示されていた残り時間は30分程。
↓
先週金曜昼前：
インストールが後１分になりワクワクが高まる。
↓
５分経過「残り1分からが長いなー、まぁもう少しで終わるだろう」
（´・ω・\`）
↓
さらに５分経過…
（;´・ω・\`）...
↓
さらに１０分経過…
###（;;´・ω・\`）...
↓
さすがに心配になり検索してみると↓の記事を発見。
http://wayohoo.com/mac/troubles/measures-when-it-was-stopped-during-the-installation-of-os-x-yosemite.html
###「信じろ・・・！おまえのMacを・・・！」
との事だったので、自分のMacを信じ、昼食を買いに出掛ける。
↓
先週金曜昼過ぎ：
買い物から帰ると画面が暗い「おっ！終わったかなー」と思いながらキーボードを適当に連打、見慣れないログイン画面が表示されたのでYosemiteのインストールが終了。
↓
一通りYosemiteの見た目や機能を堪能。
その中でフルスクリーンモードの使い方が分からず詰みかける…(´・ω・｀)
※今までの緑ボタンがフルスクリーンボタンになりました、皆さんも気を付けましょうｗ
↓
次に端末でRailsプロジェクトのフォルダーに移動し、bundleを実行。が、駄目っ！（失敗）
brewのパッケージ関係が色々おかしくなってる感じだったので（Mavericksの時も似た様な事があった）ついでにその辺も更新する事に。
↓
色々あって先週金曜１５時過ぎ：
`brew update; brew upgrade`
を実行。これが物凄い時間が掛かった＆問題が発生したので、自宅に持ち帰り更新を続行。
↓
先週金曜２０時：
`brew upgrade`
と
`brew doctor`
を実行しながら、一つ一つ問題を潰していく。自分はその二つで大体解決出来ました。
ただ
Warning: Your Xcode (6.0.1) is outdated
Please update to Xcode 6.1.
Xcode can be updated from the App Store.
このエラーはどうしようも無い感じだったので、AppStoreでアップデート出来る様になるのを待つ事にしました。
↓
そして再びbundleを実行。が、またしても通らず！…（´・ω・\`）
古い環境でビルドされたrubyに問題が有りそうなので、
`rvm remove 2.1.3; rvm install 2.1.3`
を実行。
↓
インストールが完了したら、三度bundleを実行。
そして無事、bundleが完了！これで安心して開発が続けられますね。

以上、Yosemiteを入れてbundleを通すまでにやった事でした。
途中で詰まっている方が居たら、少しでも参考にして頂ければ幸いです。

最後に、ここまで読んで頂いた方、ありがとうございます。
長文乱文失礼いたしました。

追記：
気付いたらストックして貰えてるー！嬉しいです、ありがとうございます。
Oracle Text設定メモ(URL_DATASTORE)

Oracle Textには、対象フィールド値をテキスト文章と見なす以外にファイル実体パスとして扱う（FILE_DATASTORE)など幾つかのデータストア型が存在する。
その中からフィールド値をURLとして対象ページをテキスト文章として見なすURL_DATASTOREについて。

##プリファレンスの設定
前準備として、プリファレンスの設定を行う。
（そもそも標準で準備してほしいのだけど）

データストア。

```sql
begin
ctx_ddl.create_preference('url_pref','URL_DATASTORE');
end;
/
```

日本語用レクサー（解析エンジン）。

```sql
begin
ctx_ddl.create_preference('jvl','JAPANESE_VGRAM_LEXER');
end;
/
```

文字コード。

```sql
Begin
ctx_ddl.create_preference('cs_filter_utf8','CHARSET_FILTER');
ctx_ddl.set_attribute('cs_filter_utf8','charset','UTF8');
end;
/
```

##インデックスの表領域設定
表領域が "ZENBUN_TS" の場合。

```lang:sql
begin
ctx_ddl.create_preference('zenbun_storage','BASIC_STORAGE');
ctx_ddl.set_attribute('zenbun_storage','I_TABLE_CLAUSE','tablespace ZENBUN_TS');
ctx_ddl.set_attribute('zenbun_storage','K_TABLE_CLAUSE','tablespace ZENBUN_TS');
ctx_ddl.set_attribute('zenbun_storage','R_TABLE_CLAUSE','tablespace ZENBUN_TS LOB(DATA) STORE AS (CACHE)');
ctx_ddl.set_attribute('zenbun_storage','N_TABLE_CLAUSE','tablespace ZENBUN_TS');
ctx_ddl.set_attribute('zenbun_storage','I_INDEX_CLAUSE','tablespace ZENBUN_TS COMPRESS 2');
end;
/
```

##インデックス作成（空インデックス）

HOGE_TABLE.URL_HOGE に空インデックスを張る。

* 空のインデックスを張るので、"nopopulate" を設定。未設定時はインデックス実体作成が同時に行われる。
* 対象データコミット時、インデックス作成を行いたいので、"SYNC (ON COMMIT)" を設定。

```sql
create index url_hoge_index on HOGE_TABLE ( URL_HOGE )
indextype is ctxsys.context parameters ( 'STORAGE zenbun_storage Datastore url_pref filter cs_filter_utf8 lexer jvl nopopulate SYNC (ON COMMIT)' );
```

インデックス作成を手動にしたい場合は以下を発行。

```sql
ALTER INDEX url_hoge_index REBUILD PARAMETERS ('REPLACE METADATA SYNC (MANUAL)');
```

## インデックス作成（非同期）
"SYNC (ON COMMIT)" によるリアルタイムのインデックス作成は負荷が大きいので、場合によっては以下SQLを非同期実行する。

```sql
CALL CTX_DDL.SYNC_INDEX('url_hoge_index')
```

## インデックス最適化
以下SQL結果を目安に単語テーブルの最適化度合いを測る。

```sql
-- 単語テーブル総数
SELECT COUNT(*) CNT FROM DR$URL_HOGE_INDEX$I;
-- 最適化度合い(単語の重複度合い。10未満が目安)
SELECT TO_CHAR(AVG(COUNT(*))) CNT FROM DR$URL_HOGE_INDEX$I GROUP BY TOKEN_TEXT HAVING COUNT(*) > 1;
```

最適化処理は以下SQL。
定期的にインデックス作成をしているのならば、都度行ったほうがよさげ。

```sql
CALL CTX_DDL.OPTIMIZE_INDEX('url_hoge_index','FULL',MAXTIME=> [最大実行時間(分)])
```
railsのdatabase.ymlを見てmysqlを起動するシェル スクリプトを書いた

railsのdatabase.ymlを見てmysqlを起動するシェル スクリプトを書いたのでメモ。database.ymlからパスワードをmysqlのPasswordプロンプトにコピペしなくてもよくなります。

database.yml内のパスワードをmy.cnf形式の中間ファイルに書き出しmysqlを起動します。mysqlを終了したら中間ファイルは消します。

* -cオプション
   * 起動するコマンド（デフォルト: mysql）
   * DBのダンプを取りたいときは `-c mysqldump` と指定して `| gzip -9 > dump.sql.gz` などとパイプでつなげて使用します。
* -dオプション
   * database.ymlのパス（デフォルト: config/database.yml）
* -eオプション
   * database.yml内のエントリ名（デフォルト: staging）
* -lオプション
   * database.yml内のエントリ名の一覧を表示して終了

スクリプトのファイル名はmysqlrailsにしました。ライセンスはMITです。

```bash:mysqlrails
#!/bin/sh

command=mysql
db_yml=config/database.yml
entry_name=staging
mycnf=/tmp/.my.cnf.$$
list_flag=0

usage() {
  echo "Usage: $0 entry_name"
  echo "entry_name must be one of config/database.yml"
}

list_entries() {
  awk '/^[A-Za-z0-9_]+:/ { sub(":", ""); print }' $db_yml
}

while getopts c:d:e:l opt
do
  case $opt in
    "c") command="$OPTARG" ;;
    "d") db_yml="$OPTARG" ;;
    "e") entry_name="$OPTARG" ;;
    "l") list_flag=1 ;;
    *) usage 1>&2
       exit 1 ;;
  esac
done

if [ $list_flag -eq 1 ]; then
  list_entries
  exit 0
fi

awk '/^'$entry_name':/,/^$/ {
  if ($1 == "database:") {
    database = $2
  } else if ($1 == "username:") {
    username = $2
  } else if ($1 == "host:") {
    host = $2
  } else if ($1 == "password:") {
    password = $2
  }
}
END {
  if (password != "") {
    system("umask 0077")
    printf("[client]\npassword=%s\n", $2) > "'$mycnf'"
    system("umask 0022")
    mycnf_opt = " --defaults-file='$mycnf'"
  } else {
    mycnf_opt = ""
  }
  host_opt = host != "" ? sprintf(" -h %s", host) : ""
  cmd = sprintf("'$command'%s -u %s%s %s", mycnf_opt, username, host_opt, database)
  system(cmd)
  if (password != "") {
    system("rm '$mycnf'")
  }
}
' $db_yml
```

## 適宜改変して使ってください
この例ではdatabase.ymlをオプションで指定するようになっていますが、使用するホスト上のdatabase.ymlのパスをスクリプト内に埋め込んでしまえば、どのディレクトリでも使えて楽そうな気がします。あとはpecoと連携するようにするとか。

## Ansibleから使う例

```yaml
- file: path=~/bin state=directory

- copy: src=mysqlrails dest=~/bin/mysqlrails mode=0755

- shell: ~/bin/mysqlrails -c mysqldump -d /data/app/myapp/current/config/database.yml -e production | gzip -9 > /data/rails_db_production.sql.gz
```
git、存在してほしくない記述をなかったことにする

##gitリポジトリを公開するために
dotfilesの管理、今までは中途半端にDropbox+gitでやってたのですが一念発起してgithubに任せることにしました。  
とはいえ大昔のパスワード直書きしてたファイルとか含んでるのでそのまま公開は不可能。
いきなり有料版githubに手を出すのもアレなので、ヤバいファイルは手元で穏当なファイルに書き換えてやることにしました。

##さかまく ぎんがを つらぬいて
リポジトリ全体に対して特定コマンドを実行するのには `git filter-branch` コマンドが使える。
`filter-branch`を実行するとコミットのハッシュ値が変わり、元々のリポジトリとの連続性が失われるためpushできなくなる。
手元の変更は全てリモートにpushしてから以下のコマンドを実行すること。

`$ git filter-branch --index-filter "cp -f /fake/nopassword.txt password.txt --prune-empty`
これでpassword.txtは最初から穏当なnopassword.txtだったことになった。
失敗したらもう一度リモートから引っ張ればいいはずだが、怖いので一回ブランチ切って試してから本番を行った。
複数のブランチに一括で行うには、前述のコマンドを`--`で抜けてから`-all`とするらしい。(試してない)

参考：[Git - 歴史の書き換え](http://git-scm.com/book/ja/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E6%AD%B4%E5%8F%B2%E3%81%AE%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88 "Git - 歴史の書き換え")など

##オソウジダイスキ
`git reflog`コマンドで参照するデータは通常のコミットと独立に管理されているらしい。そっちも消す。
こっから曖昧な理解で言ってるので間違ってる可能性大。

`$ rm -rf .git/refs/original/`
実際のコミットデータ(オブジェクト)とハッシュ値を結びつけているrefsデータの消去。
これでgit showなどから辿れなくなる。
`$ git reflog expire --expire=now --all`
リポジトリに対する変更全てを管理しているreflogの強制失効。
これでgit reflogから辿れなくなる。
`$ git gc --aggressive --prune=now`
即座にデータベースを最適化、履歴を圧縮して上記の変更を有効にする。これをやらないと実際はしばらくデータが残る可能性あり？

##倍プッシュ
今回はgithubに初めてpushするので普通にやればおｋ。
既存のgithubリポジトリの場合、コミットのハッシュ値が変わったため `git push -f origin` でgithub側を強制上書きするしかない。よくよく確認しないと悲劇が起こりそう。
Rails リンクのdata-methodをajaxで書き換えようとしたら嵌まった

# やりたかった事

簡単に述べると、Qiitaのストックボタン的な動作(要素の生成と削除を同一ボタンで行う）をrailsのルール(methodが要素の生成時にはPOST, 削除時にはDELETE)に従い、お行儀よくやろうとした。

1 以下のリンクをクリックするとajaxで非同期通信を行い、要素を生成する。

```html
<a id="my_button" href="/my_model" data-method="POST" data-remote="true">要素生成</a>
```
2 ajaxの応答処理で、#my_buttonの内容を以下のように書き換える。

```html
<a id="my_button" href="/my_model/:id" data-method="DELETE" data-remote="true">要素削除</a>
```

3 再度リンクをクリックするとajaxで非同期通信を行い、その要素を削除したい。

# はまった事

ajaxの応答処理で、$("#id").attr('data-method': "delete")のようにattrで書き換えるとDOM上では反映されるけど、サーバーへの要求はPOSTのままになってしまう。

# 試した事

試した事1


[jQueryのdata-*属性キャッシュ仕様と対策](https://w3g.jp/blog/studies/jquery-data-attr-cache)を参考に、

```js
document.getElementById('my_button').setAttribute('data-method', 'delete');
```

結果は$().attr('data-method','delete');と変わらず。

---- 
試した事2

[link_to に :method => :delete を指定した時の動作](http://d.hatena.ne.jp/spitfire_tree/20120323/1332477590)の記事の

```rb
method = link.data('method'),
```
を参考に、試しにajaxの応答処理を

```js
$('#my_button').data('method', 'delete');
```
に変えたところ反映された。

# 対応方法

```js
$('#my_button').attr('data-method', 'delete');
```

ではなく、

```js
$('#my_button').data('method', 'delete');
```

を利用する。

# 余談

- １つのリンクで生成/削除を切り替えるなら、controllerにcreate_or_deleteとかの操作を作ってmethodも固定の方が楽ちんなのでは？
- viewの初期状態表示処理と、更新処理をDRYに書く方法は？
- attr()とdata()の違いを調べる事。
- data-*の意味を確認する事。
MacにRictyフォントをインストール


Rictyフォントについては[Github](https://github.com/yascentur/Ricty 'yascentur/Ricty')を参照。

### 1.InconsolataとMigu 1Mをインストール

Rictyはラテン文字にはInconsolata、それ以外の文字にはMigu 1Mが適用される。

それぞれ、以下からDLし、インストール。

* [Inconsolata](http://levien.com/type/myfonts/inconsolata.html 'Inconsolata')
* [Migu 1M](http://mix-mplus-ipa.sourceforge.jp/migu/ 'Migu 1M')

### 2. FontForgeをインストール

fontforgeインストールにはCommand Line Tools for Xcodeが必要。

```
$ xcode-select --install
```

FontForgeをインストール。

```
$ brew install fontforge
```

### 3. Ricty のインストールと生成

```
$ git clone https://github.com/yascentur/Ricty.git
$ cd Ricty
$ ./ricty_generator.sh auto
```

これで、`Ricty- Regular.ttf``Ricty-Bold.ttf``RictyDiscord-Regular.ttf``RictyDiscord-Bold.ttf`が生成される。

あとは、Font Bookで以上の4つのファイルを追加。


## 参照
* [yascentur/Ricty](https://github.com/yascentur/Ricty 'yascentur/Ricty')
* [最高に見やすいプログラミング用フォントRictyの生成と使い方](http://news.7zz.jp/font/4390.html '最高に見やすいプログラミング用フォントRictyの生成と使い方')
現在完了形と過去形

# おおまかなルール

[![](https://qiita-image-store.s3.amazonaws.com/0/50510/5087d725-ef3e-db24-bf58-ef6e005a307a.png)](http://web2.uvcs.uvic.ca/elc/studyzone/410/grammar/ppvpast.htm)

# 補足: Is it new information or old?

### Ouch! I've cut my finger!
Because this action has only just happened.

### new == the fact is still alive
- __Somebody has stolen my bicycle! Now I'll have to walk home.__
- __I've lost my keys! Now I can't get home.__
- __She has gone to America. Now you can't see her.__

Because it is affecting the present(the fact is still alive).

# 応用編: thatと一緒に使うとき

### I heard that she would release a new album.
`she would release a new album`に焦点が当たっている。
なので`So I will make a reservation tonight.`などのつながりが生じそう。
また`will`がbackshiftingして`would`になっている（これはどうも必須ではないらしい）。

### I have heard that she will release a new album.
`heard`したこと自体に焦点が当たっている。
なので`Have you?`など、`heard`したこと自体に付随するつながりが生じそう。
Unityでサイン波とか使って音を鳴らしたい！

UnityのOnAudioFilterReadを使う事で音をならす事ができます。
ということで、サイン波とかノコギリ波とか使って音を操りたい！って
欲求が出てきたので少し勉強をはじめました。
---

※こちらの記事が勉強になります。
Procedural audio with Unity
http://www.develop-online.net/tools-and-tech/procedural-audio-with-unity/0117433

音響合成、Pdでシンセサイザーをつくる
http://yoppa.org/ssaw13/4567.html?fb_source=pubv1

さて、以下のスクリプトをカメラにつければ音が鳴らせます！
周波数の値をいじれば音は変化します。

以下のスクリプトの簡単な説明として
周波数は、1秒間に波が440個あるということで
サイン関数にラジアンを渡すことで波を作っています。

```C#
using UnityEngine;
using System;  // Needed for Math

public class Sinus : MonoBehaviour
{
	public double frequency = 440;
	public double gain = 0.05;
	private double increment;
	private double phase;
	private double sampling_frequency = 48000;
	
	void OnAudioFilterRead(float[] data, int channels)
	{
		increment = frequency * 2 * Math.PI / sampling_frequency;

		for (var i = 0; i < data.Length; i = i + channels)
		{
			phase = phase + increment;
			data[i] = (float)(gain*Math.Sin(phase));
			if (channels == 2) data[i + 1] = data[i];
			if (phase > 2 * Math.PI) phase = 0;
		}
	}
} 
```
さあ、音が鳴りました。
これは面白いですね。
波の形を変えれば音が変化します。ノコギリ波とか

「強火で進め」さんでは、波形ごとのソースを書いてますので
そちらを参考にするとさらに前進できますね！
http://d.hatena.ne.jp/nakamura001/20120724/1343148980
各ユーザのcrontabファイルの場所について


## 経緯
gitで管理しているプロジェクトの中に定期バッチの編集も一緒に管理する必要があったので調べた。

## 定番
* cronといえば、だいたい以下のディレクトリを参照する。

```パス
/etc/crontab
/etc/cron.d
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.hourly/
/etc/cron.monthly/
```
* もしくはユーザ毎(iganari)のcrontabに加筆修正していく

```text:cmd
# crontab -e
or
# crontab -uiganari -e
```
※ しかし上記は-rオプションで消してしまう事故等が多発することで有名。

## crontabってどこにあるんだろ
いつもcrontabで編集しているファイルって、結局どこにあるのかなって思ったので調べてみた。  
結果は以下

```test:パス
/var/spool/cron
```
この下にユーザ毎の設定ファイルが置かれている


```text:パス
# ll /var/spool/cron
-rw------- iganari iganari vagrant
```
ここの配下にあるファイルは600なので、ユーザ自身が加筆修正可能。

## ここからはgitの話


#### root以外でも変更出来るようにパーミッションの変更

```text:cmd
# chmod 777 /var/spool/cron
```
#### .git/hooksに設定を加筆

```text:/プロジェクトのパス/.git/hooks

```
* .git/hooksの設定
* pull(fetch + merge)した時に発動(厳密的に言えばmergeの際に発動)

## 参考
[crontab -eと/etc/crontabでcronを設定する方法](http://blog.mizoshiri.com/archives/215)
ary-[nil] と ary.compact

ary-[nil] より ary.compact の方が良いと書いたものの、速度を調べていなかった。
で。
調べてみた。

まずはグラフ。対数目盛に注意。縦軸は時間。

![remonil.png](https://qiita-image-store.s3.amazonaws.com/0/6854/9103be3c-9621-fb34-e817-c237bb45fa24.png "remonil.png")

なんかsrc.compact のグラフ形状が変な感じ。

概ね、5〜10 倍ぐらい速さが違う。
ruby は ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-darwin13.0] を使った。

まあ、速さのために compact を使うんじゃなくて「有意義なものだけにする」という処理に compact という名前がついているのでそれを使ったほうが良い、ということなんだけど、速さの面でもメリットがあるよ、という話なのでした。

もちろんゴルファーは `a-[nil]` で。

あと。このグラフの元になったソースコードは以下のとおり。

```ruby
require "benchmark"

(0..7).each do |ary_size_e|
  ary_size =10**ary_size_e
  src=Array.new(ary_size){  |n|
    n%2==0 ? nil : n
  }

  trial = (10**7/ary_size ).ceil
  puts "array size : #{ary_size},trial count : #{trial}"
  Benchmark.bmbm(13) do |x|
    x.report( "src-[nil]" ){ trial.times{ src - [nil] } }
    x.report( "src.compact" ){ trial.times{ src.compact } }
  end
end
```

続編が
http://qiita.com/Nabetani/items/623df6f738864b5ed005
にあります。
Azure Powershellと環境変数「PSModulePath」について

#Azure Powershellの配置フォルダを変更する。
Powershellコンソールを起動したときに、「Azure Powershell」がどの設定を参照して読み込まれるのかわからなかった。答えは環境変数「PSModulePath」でした。

* 次のサイトからインストーラをダウンロード。[Azure PowerShell Download](http://go.microsoft.com/fwlink/p/?linkid=320376&clcid=0x411)
 
* Windows Azure Powershellをインストール
![WS_00002.JPG](https://qiita-image-store.s3.amazonaws.com/0/55893/41cbbcd6-a72f-2143-3b97-3e5e5b6c538a.jpeg)

* 既定では下記フォルダにAzure Powershellモジュールが展開されるようです。
![WS_00001.JPG](https://qiita-image-store.s3.amazonaws.com/0/55893/7df30a4a-5872-df6b-c84a-e36dab13451a.jpeg)

* 環境変数「PSModulePath」を見ると、先程ダウンロードされたAzure powershellモジュールのパスが設定されています。
![WS_00003.JPG](https://qiita-image-store.s3.amazonaws.com/0/55893/912ffca3-6cdf-6524-a6d9-c7a293fdddf2.jpeg)

* Powershellコンソールを起動して、Azure Powershellが読み込まれていることを確認。
![WS_00004.JPG](https://qiita-image-store.s3.amazonaws.com/0/55893/a0f08852-ab5d-289c-e82d-a4829f9b482d.jpeg)

##まとめ
環境変数「PSModulePath」を編集すればAzure Powershellモジュールを展開するフォルダを変更することができそうです。既定のフォルダから変更したい場合は有効かもしれません。

##参考サイト
* [Windows PowerShell: Windows PowerShell のカスタム ツールをパッケージ化して配布する](http://technet.microsoft.com/ja-jp/magazine/gg558117.aspx)
* [Azure PowerShell のインストールおよび構成方法](http://azure.microsoft.com/ja-jp/documentation/articles/install-configure-powershell/)
jQueryで連想配列をPOSTする

----
###やりたいこと
jQuery(Javascript)で連想配列を$.postで一気にPOSTしたい。

###やったこと
```sample.html
<!doctype html>
<html lang="ja">
<head>
	<meta charset="utf-8">
	<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>
	<script>
	$(function(){


		//配列用意 []ではないので注意
		//{}とすることでオブジェクトになる
		var array = {};

		array['name']= "hoge";
		array['age'] = "30";

		//連想配列をjson文字列に変換
		//var json_str = JSON.stringify(array);
		//json文字列をjsonオブジェクトに変換
		//var json = $.parseJSON(json_str);

		//postで送る（第２引数はjson文字ではなくjsonオブジェクトである必要があるよう）
		//直接arrayでいける
		$.post("./res.php",array,function(res){
			alert(res);
		});

	});
	</script>
</head>
<body>
</body>
</html>
```
一度json文字列に変換してから、jsonオブジェクトにしている。たぶん１回の変換で済む方法があるのだろう。
{}とすることで、直接arrayを第２引数に入れれば良い。

POSTができてるかどうかは、res.phpで判断。print_r($_POST);とするだけ。

```res.php
<?php

	print_r($_POST);
```
bundler-add 作った

Gemfile に追加するとき、毎回 rubygems.org から最新バージョン探して、 Gemfile の定義のやつコピーして……みたいなのが疲れるので、 gem の名前だけ渡せばいいようにした。

```shell-session
$ gem i bundler-add
$ bundle add rails
gem 'rails', '~> 4.1.6'
```

こんな具合に使う。 `>> Gemfile` すれば追記できるし、これで満足な感じっぽい。

コードは [GitHub](https://github.com/rosylilly/bundler-add) で。
Reveal.js でのスライド作りはグリッドレイアウトで完成する。

===========


Reveal.jsをダウンロードして、Twitter Bootstrapを利用できるようにする。

### 参考にした

https://gist.github.com/ramnathv/8421232


### 利点
* span6 などのレイアウトでスライドが作れる。２カラム、３カラムも自在。
* popover() や tooltip() が使える。(jQueryプラグインも使うとどんどん進化する。)

### 追加

head内に追加してください。

~~~index.html
<link id="theme" rel="stylesheet" href="http://slidifylibraries2.googlecode.com/git/inst/libraries/highlighters/highlight.js/css/tomorrow.css"/>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<link rel="stylesheet" href="http://slidifylibraries2.googlecode.com/git/inst/libraries/widgets/bootstrap/css/bootstrap.css"/>
~~~

### 削除

headから削除してください。

~~~index.html
<link rel="stylesheet" href="lib/css/zenburn.css">
~~~

### フッターに追加

~~~index.html
<!-- LOAD HIGHLIGHTER JS FILES-->
<script src="http://slidifylibraries2.googlecode.com/git/inst/libraries/highlighters/highlight.js/highlight.pack.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
<!-- DONE LOADING HIGHLIGHTER JS FILES-->
~~~


## 実際例

~~~index.jade
.reveal
	.slide
		section
			h1 これでグリッドレイアウトを使って、スライドが作れるようになったよ！
			.span6
				p left side
				hr
				p hello
			.span3
				p Ohayo
			.span3
				p right side
~~~


神がかって便利なので、おすすめです。僕はjadeで書けるようにテンプレート作ってます。jadeだと、マークダウンも書けるし、divタグをがんがん書けたり、javascript部分とスライド文章の部分の分離ができるのでおすすめです。もちろんnodeとかgruntとか使うわけですが、暇があったら公開します。

時間できたらレイアウトされたスライドとかpopover() とか tooltip() とかjQueryプラグインで画像拡大するのを含めた画像上げます。
strcatの問題

どもどもー
なぜかC++のジェダイ(自称)から素敵な問題を出されたので解いてみましたー

```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, const char * argv[]) {
 char str[10] = {};
 char str2 = 'C';

 strcat(str,&str2);

 printf("%s",str);
}
```

結果が ```C``` にならない問題を解決してみましょう。。

# 作者の回答
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, const char * argv[]) {
    char str[10] = {};
    char str2[] = {'C', '\0'};
    
    strcat(str,str2);
    
    printf("%s",str);
    return 0;
}
```

最近C書いてないから、2分かかってしまった。。
しかもこれは、ダメな例。

# ジェダイの回答
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, const char * argv[]) {
    char str[10] = {};
    char str2[] = "C";
    
    strcat(str,str2);
    
    printf("%s",str);
    return 0;
}
```

# 解説
この問題は、
文字の最後にヌル文字が入ってない為、```C```と表示されません。
これを解決するには、 ヌル文字を入れてあげれば良いので、
```"C"```のみでOKです。
OS X 10.10 Yosemiteのインストールディスクを作成

知見の共有というよりも、単にたった今インストールUSBを作成して
Yosemiteインストールの準備が整った嬉しさのあまり勢いで書いただけ。

createinstallmediaというApple謹製のコマンドラインツールを使用する。
GUIでもDiskMaker Xを用いれば可能だが、サードパーティ製だし折角だから公式のツールを使おうってね。

１．ディスクユーティリティ.appを起動してUSBメモリをフォーマットしておきます。
フォーマット形式を「Mac OS 拡張（ ジャーナリング）」に、名前は日本語環境だとおそらく「名称未設定」になっていると思いますが、
変更した場合は後ほどcreateinstallmediaで使うので覚えておきましょう。
名前にこだわっても強制的に「Install OS X Yosemite」に変更されるので一時的に覚えやすい適当な名前でいいです。

２．ターミナルで下記のコマンドを実行。

```sudo /Applications/Install\ OS\ X\ Yosemite.app/Contents/Resources/createinstallmedia --volume /Volumes/名称未設定 --applicationpath /Applications/Install\ OS\ X\ Yosemite.app --nointeraction
```

「名称未設定」の部分は先ほど設定した名前に適宜変更してください。
ちなみにもう眠いよ〜！って人は以下のスクリプトを実行して寝ろ

```sudo /Applications/Install\ OS\ X\ Yosemite.app/Contents/Resources/createinstallmedia --volume /Volumes/名称未設定 --applicationpath /Applications/Install\ OS\ X\ Yosemite.app --nointeraction
sudo shutdown -h now
```
DrupalのログインURLを変更する


デフォルトでは /user/ですが、任意のURLに変更できます。

### Rename Admin Pathsモジュールを使用

下記ページから、モジュールをインストールします。
(インストル方法はこちら→ http://qiita.com/s_s_k/items/4ae744d8173b8f278626)

Rename Admin Pathsモジュール
https://www.drupal.org/project/rename_admin_paths


環境設定でパスを変更で完了です。
国産顔認識API「PUX」を「Rekognition」と比べてみる ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい

みなさんこんにちは。顔認識API「Rekognition」を使った投稿を何回かしました。はい。今回は国産の顔認識API「PUX」を使ってみます。デジカメとかにも使われているエンジンが入ってる気がします（適当）。ちょっと性能に期待しましょう。

### Rekognition 関連記事

 * Ruby - マミルトンのゲーム実況動画から決定的シーンを抜き出す RMagick と rekognition を使おう ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい - Qiita - http://goo.gl/wqH2Mm
 * マミルトンのゲーム実況動画で ffmpeg RMagick rekognition を使おう～その１～ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい - Qiita - http://goo.gl/EJVsLG
 * マミルトンのゲーム実況動画でニコニコする ffmpeg RMagick rekognition を使おう～その２～ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい - Qiita - http://goo.gl/VDOYTT

# さっそくやってみるよ

マミルトンの動画から抜き出した画像をRekognitionとPUXの両方に使ってみました。素材の画像はこちらです。

![4.jp](http://gameranking.scleen.com/images/mamiruton/4.jpg)


## Rekognition の結果

![result4.jpg](http://gameranking.scleen.com/images/mamiruton/result4.jpg)

## PUX の結果

![pux_sample.png](https://qiita-image-store.s3.amazonaws.com/0/56465/c68574f4-61af-f6e2-5a1d-23f4e5f06d41.png)

開発者に提供されているダッシュボードがあったので、その結果を張り付けました。小さな顔も高い精度で検出できるようです。なかなかやります。 :+1: 

そのほか、「どや顔判定」「動物顔判定」なんていう日本ならではの判定結果も戻してくれるようです。

### どや顔といったらマックスむらいではないか？

ゲーム実況動画を知らない方はご存じないかもしれませんが、小学生にはとても人気のあるマックスむらいはそのどや顔でもとても有名です。

# PUXの無償版

## 申し込み

[PUXの開発者向けウェブサイト](https://pds.polestars.jp/)から新規登録します。ID,パスワード,メールアドレス,名前を入れるだけで簡単です。メールアドレスを経由して認証するという良くある流れです。

## 無償版で利用できる範囲

 * 登録から30日間　←くそですね :smile:
 * 1,000回/月 ←くそですね :smiley: 
 * ライブラリは JQuery のみ提供 ←くそですね :smiley: 

↓値段のサイト
PUX Developers site - fee.html - http://goo.gl/cT7QlN

Rekognitionと比較すると全然無料で使える範囲が狭いです。とりあえずアプリをつくってみて、ヒットしそうだったら拡張、という使い方はできませんね。残念です。

国産のAPIはPUXに限らず、BaaS系のものとか、クラウド関連とか、無償で利用できる範囲が海外のものに比べて狭いものが多い気がしますね。何故なんでしょうか・・・
データマイニングエンジニアのためのYosemite人柱

# 結論
Yosemiteをクリーンインストールののち、データマイニングエンジニアが使うであろうソフトウェアが動くか確認してみた。

- Grapher -> Yosemiteにもいます。問題なし
- R -> グラフィックを含め、問題なく動作
- R Studio -> グラフィックを含め、問題なく動作
- Julia -> こちらも問題なく動作
- Python -> デフォルトで2.7.6が入ってることを確認。
- iterm2 -> 問題なく動作。

というわけで、仕事が上記で完結する方は乗り換えても全然いけるんじゃないかな。

# 各々検証
## Yosemiteのクリーンインストール
こちらの記事 http://okaymac.com/2014/10/17/how-to-create-os-x-yosemite-bootable-usb/ を参考に、
SDカードにインストーラーを焼き、クリーンインストールを実施した。

## Grapher
OSアップデートのたびに、「消えてしまうんじゃないか」とビクビクしているGrapherさん。
OX標準で付いているグラフ描画ソフトウェアです。
グラフ描画だけでなく、微積までやってくれるのでサクッと可視化するのに便利ですね。

![スクリーンショット 2014-10-19 1.12.05.png](https://qiita-image-store.s3.amazonaws.com/0/44801/1807d8b1-bfc1-8736-1f47-ee788572ffa3.png)

## R
これがないと仕事にならん。R。
こちらのページから http://cran.md.tsukuba.ac.jp/bin/macosx/ R-3.1.1-mavericks.pkg をダウンロード。

![スクリーンショット 2014-10-19 1.38.03.png](https://qiita-image-store.s3.amazonaws.com/0/44801/ad074db2-6c15-5708-4e49-81808fddf094.png)
R 3.1.1 binary for Mac OS X 10.9 (Mavericks) and higher と書いてるので軽い気持ちでインストール。

### アプリケーションで使う
アプリケーション -> R ダブルクリックで起動。graphicsが動くことを確認。
![スクリーンショット 2014-10-19 1.11.02.png](https://qiita-image-store.s3.amazonaws.com/0/44801/d6f8002a-99b1-1185-82b8-937c920f09ee.png)

### ターミナルから使う
```bash:r
$ r
```
で起動します。こちらもgraphicsが動くことを確認。
![スクリーンショット 2014-10-19 1.09.18.png](https://qiita-image-store.s3.amazonaws.com/0/44801/a09ea842-d39a-9d49-5a80-0c2d7901ce4b.png)

## R Studio
Rの統合開発環境のR Studio。
http://www.rstudio.com/products/RStudio/#Desk のページからダウンロード。
ファイル名は RStudio-0.98.1074.dmg でした。
![スクリーンショット 2014-10-19 1.08.37.png](https://qiita-image-store.s3.amazonaws.com/0/44801/9819f983-67f4-042f-4aa3-2123fd1b860e.png)
こちらも、graphics含め問題なく動く。

## Julia
http://julialang.org/downloads/ こちらからダウンロード。
ファイル名は julia-0.3.1-osx10.7+.dmg でした。
![スクリーンショット 2014-10-19 1.18.08.png](https://qiita-image-store.s3.amazonaws.com/0/44801/dada45c4-068d-add0-d361-fbb8acc083ae.png)
とりあえず起動できて動く事確認。


## Python
Yosemiteのデフォルトではpython 2.7.6が入っている。

```bash:help
$ python
Python 2.7.6 (default, Sep  9 2014, 15:04:36)
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> help()

Welcome to Python 2.7!  This is the online help utility.

If this is your first time using Python, you should definitely check out
the tutorial on the Internet at http://docs.python.org/2.7/tutorial/.

Enter the name of any module, keyword, or topic to get help on writing
Python programs and using Python modules.  To quit this help utility and
return to the interpreter, just type "quit".

To get a list of available modules, keywords, or topics, type "modules",
"keywords", or "topics".  Each module also comes with a one-line summary
of what it does; to list the modules whose summaries contain a given word
such as "spam", type "modules spam".

help>
```

ごめんね普段ほぼPython使わないので、2.7.6で事足りるかどうかわからないすw
2系と3系の違いは下記にまとまっているのであとでよむ。
https://wiki.python.org/moin/Python2orPython3

# おわりに
気のせいかもしれませんが、若干OSが軽くなった気がします。
Googleスプレッドシートで選択範囲内の要素を数え上げ

Google Apps Script を用いて、Googleスプレッドシートの選択範囲内の要素を数え上げます。


## スクリプト

```js:wordCount.gs
function wordCount(array_array) {
  var result = {};
  for (var i = 0; i < array_array.length; i++) {
    var array = array_array[i];
    for (var j = 0; j < array.length; j++) {
      var word = array[j];
      if (result[word] == undefined) {
        result[word] = 1;
      } else {
        result[word]++;
      }
    }
  }
  var result_array = [];
  for (var word in result) {
    result_array.push([word, result[word]]);
  }
  return result_array;
}
```


## 使い方
下記の図のような、広い範囲にある要素を数え上げます。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/48375/db29f2b6-2c55-b005-5460-f32c1ad6615e.png)



関数を利用する際は、`=wordCount(範囲)`とすると、下記の図のように範囲内の要素が数え上げられます。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/48375/facef54b-aaad-1788-b2be-7038e60fd258.png)
BetterTouchToolを使ってウィンドウサイズをキーボードで操作できるようにしておくと便利

## やりたいこと
アクティブウインドウの __ウィンドウサイズを最大化__ したい，マルチディスプレイ利用時に __別のディスプレイへ移動__ して作業したい，そんな操作を __マウスを使わずキーボードでちゃちゃっと__ できるようにしておくとけっこう便利．

## 用意するのはBetterTouchTool (BTT)
言わずと知れたMacユーザー必須便利アプリの一つですね．トラックパッド操作の拡張能力の高さで有名なこいつ．
![btticon copy.png](https://qiita-image-store.s3.amazonaws.com/0/4599/838e1fce-f68f-7c4b-94e3-b97f7c59361e.png "btticon copy.png")
http://blog.boastr.net/ （ダウンロードはここから）

既にBTT使っている人も多いと思うので，余計な __アプリケーションを増やす必要が無い__ という点もポイント高いです．

今回やりたい操作はBTTの範囲で事足りるけれど同じサイトにある（App Storeにもある）BetterSnapToolってやつ（有料）のほうがもっといろいろ設定できたりするらしいです（詳しくは知らない）．


## 設定例
設定例は以下のスクショの赤枠内です．

![bttpref.jpg](https://qiita-image-store.s3.amazonaws.com/0/4599/9faa1b1c-feb9-361a-6014-82a1cb69ad0a.jpeg "bttpref.jpg")

自分でショートカット・キーを指定して（左下の『Keyboard Shortcut』），動作をセットする（右下の『Trigger Predefined Action:』の中の『Window Resize & Move』内から選ぶ）だけ．

上の例では，自分は

```設定例
[Control + 1]  # Windowサイズ40%で左寄せ
[Control + 2]  # Windowサイズ60%で右寄せ
[Control + 3]  # Windowサイズ最大化
[Control + 9]  # Windowサイズの変更を元に戻す	
[Control + 0]  # Windowを別ディスプレイに移動（マルチディスプレイ利用時）
```

という設定にしています．よく使うのは[3]の最大化と[0]のディスプレイ間移動． __オススメ！__
[1]と[2]は組み合わせて使うことで横並びに資料とエディタを並べるときに使ったり．

なお，このときの40%, 60%ってのは以下の赤枠の設定に依存しますので

![Cursor copy.jpg](https://qiita-image-store.s3.amazonaws.com/0/4599/112ad753-e5a2-ec61-f8db-98cb73bf16e8.jpeg "Cursor copy.jpg")


## 終わりに
__プロジェクタ繋いで__ 発表するときとか， __アプリケーション起動時にすぐに別ディスプレイに動かしたい時__ とか，そういうときにも活躍してます．
繰り返しになりますけど，たぶんこの操作ができるようになる他のアプリもあると思いますが，そういった専用のアプリなどを増やさずにBetterTouchToolでできるようになるのはありがたい．
それにしてもBetterTouchTool，本当はもっともっといろんな便利な設定ができるらしいのに使いこなせてないなぁ．
Windowsの便利ショートカット集、基礎から応用まで。

自分が普段使うショートカットを書き出してみました。基本的にWin7以上が対象です。（特にAero関係）
★は超主観的なおすすめ度を表しています。

アップロード制限と相談しつつ、画像をアップしていく予定です。
NAVER版→http://matome.naver.jp/odai/2139798672422807101
（GIFアニメ付き）


# ブラウザのショートカット
* ★★☆ 次のタブへ移動 … Ctrl+Tab
* ★☆☆ 前のタブへ移動 … Ctrl+Shift+Tab
* ★☆☆ 新規タブを開く … Ctrl+t
* ★★☆ 現在のタブを閉じる … Ctrl+w
* ★★★ 閉じたタブを復元する … Ctrl+Shift+t
* ★★★ カーソルを次の選択可能位置へ移動 … Tab
* ★★☆ カーソルを前の選択可能位置へ移動 … Shift+Tab
* ★☆☆ アドレスバーを選択 … Alt+D or F6
* ★★☆ 検索ボックスを選択 … Ctrl+e
* ★☆☆ 情報を更新 … F5
* ★☆☆ 全画面表示 … F11

# 基礎中の基礎
* ★☆☆ コピー … Ctrl+c
* ★☆☆ カット … Ctrl+x
* ★☆☆ ペースト … Ctrl+v
* ★☆☆ 元に戻す … Ctrl+z
* ★☆☆ 操作のやり直し … Ctrl+y

# ファイルに関わるショートカット
* ★★☆ ファイル名の変更 … F2
* ★★★ ファイル名の連続変更 … Tab（ファイル名編集中のまま）
* ★☆☆ ファイルを上書き保存 … Ctrl+s
* ★☆☆ 印刷 … Ctrl+p

# レイアウトのショートカット
* ★★★ ウィンドウを左 or 右にスナップ … Windowsキー+← or Windowsキー+→
* ★★☆ ウィンドウを最大化 or 最小化 … Windowsキー+↑ or Windowsキー+↓
* ★☆☆ デスクトップの表示/非表示 … Windowsキー+d
* ★★☆ デスクトップを一時的に表示 … Windowsキー+Space
* ★★★ ウィンドウを次のモニタへ（モニタを複数使用時） … Windowsキー+Shift+← or Windowsキー+Shift+→

# ウィンドウ周りのショートカット
* ★★★ ウィンドウの切り替え … Alt+Tab
* ★☆☆ ウィンドウの切り替え（フリップ3D） … Windowsキー+Tab
* ★★☆ タスクバーのプログラムを起動 … Windowsキー＋数字キー（テンキー不可）
* ★☆☆ エクスプローラーを起動 … Windowsキー+e
* ★☆☆ ウィンドウを閉じる … Alt+F4

# 文字列のショートカット
* ★★★ 文字列の検索 … Ctrl+f
* ★★★ 文字列の置換 … Ctrl+h
* ★★☆ 入力文字を大文字に … Shift+Caps Lock
* ★☆☆ 全てひらがなに変換 … 変換中にF6
* ★★☆ 全てカタカナに変換 … 変換中にF7（全角）or F8（半角）
* ★☆☆ 全てローマ字に変換 … 変換中にF9（全角）or F10（半角）

# 選択のショートカット
* ★☆☆ 全て選択 … Ctrl+a
* ★★★ キャレットを文頭に移動（+Shiftで文頭まで選択） … Home（Enterキー右側）
* ★★★ キャレットを文末に移動（+Shiftで文末まで選択） … End（Enterキー右側）
* ★★☆ キャレットを次の区切りに移動（+Shiftで選択） … Ctrl+→（右矢印）
* ★★☆ キャレットを前の区切りに移動（+Shiftで選択） … Ctrl+←（左矢印）

# システム周りのショートカット
* ★★☆ タスクマネージャーの起動 … Ctrl+Shift+Esc
* ★★☆ 画面のロック … Win+L
* ★☆☆ OSユーザー管理画面の表示 … Ctrl+Alt+Delete
iOSアプリ開発:エラー対策(Received memory warning.)

※個人で管理しているHPに引っ越ししました。
リンク切れ等考慮して本ページは残しておきますが、今後は[HP](https://kittenkitten.net/2014/10/19/ios_dev_error_received_memory_warning/)のほうで更新します。

## 現象

色々と画像や音をプロジェクトに追加して、
端末で動作確認をしていたら突然下記文字列がコンソールウィンドウに表示されました。

```
Received memory warning.
```

この文字列が表示された時は特に問題ありませんが、
しばらく動作確認を続けているとアプリが勝手に終了してしまいました。

#### コンソールウィンドウ
コンソールウィンドウは、Xcode上の下に表示されます。
もし表示されていない場合、下記手順で表示出来ます。

```
Xcode->View->Debug Area->Active Console
```

コンソールウィンドウは、
Xcodeからのシステム的なメッセージか下記APIプログラムを使用すると表示されます。

* NSLog
* print

## 調査

色々調べてみると、メモリ不足警告のようです。
基本、自身で確保したもの(malloc等)は不要となったら解放(free等)しましょう。

ARC(Automatic Reference Counting)で、メモリ管理を自動で行っている場合、自動解放してくれるだろうと思っていても解放しないものもあるようで注意しましょう。

自分が実際に既に対応したもの
* CGContextRef→CGContextReleaseを使って解放

## 対応

実際に自分が発生した処理を下記に記述しておきます。
対応は、コメントで追加start、追加endと記述した間です。

```c:Test.h
void* Test();
```

```c:Test.c
void* Test()
{
    void* test = NULL;
    test = malloc(10);
    return test;
}
```
```objc++:TestMain.h

#import "Test.h"

@interface TestMain : NSObject
{
    void* data;
}
@end
```
```objc++:TestMain.m
#import "TestMain.h"

@implementation TestMain
- (void)Test2
{
    // 追加 start
    if (data != NULL) {
        free(data);
    }
    // 追加 end

    data = Test();
}
@end
```

本来、Test関数でmallocしているためその中でfreeしてあげるのがベストだと思います。
しかし、今回はこれをreturnさせたかったため、freeしなかったらTest2が呼ばれるたびメモリを確保していってメモリ不足となってしまったようです。

Test2関数で呼んだ後、メモリを参照したいため呼んだ後もfree出来ません。
なので、Test2を呼ぶ前にfreeする必要があるかチェックするようにしました。

これにより、文字列(Received memory warning.)は出なくなり、
アプリも勝手に終了しなくなりました。

色々実装していったらまた発生しそうなので、気を付けたいと思います。
ClojureからJavaの「staticのネストしたクラス」を使用する

タイトルがルー語みたい(´・ω・｀)

今後もハマりそうなのでメモ

使用したいのはこいつ↓
http://docs.oracle.com/javase/jp/7/api/java/nio/channels/FileChannel.MapMode.html

`FileChannel.MapMode.PRIVATE`

# 前提
```clj:xxx.clj
(ns xxx-clj.core
  (:import [java.nio.channels FileChannel]))
```

# ダメパティーン
```clj
FileChannel/MapMode/PRIVATE
```

```clj
. (FileChannel/MapMode) PRIVATE`
```

# イケるパティーン

```clj
java.nio.channels.FileChannel$MapMode/PRIVATE
```

こうすれば短く書ける

```clj:xxx.clj
(ns xxx-clj.core
  (:import [java.nio.channels FileChannel$MapMode]))

(FileChannel$MapMode/PRIVATE)
```


# 終わりに
クラスファイルが「親クラス$子クラス.class」になっていることを知っていれば
躓かないんでしょうね。
【Android】コマンドラインから使うLint

Androidの静的解析ツールであるLintをコマンドラインから簡単に使用する方法を紹介。

## そもそもLintって何？

以下の公式サイトの説明を見ると、なんとなくわかる。

**[Improving Your Code with lint](http://developer.android.com/tools/debugging/improving-w-lint.html)**

ざっくり言って以下のような感じ。
※実際にはもっと色々チェックしてくれますが、詳細は割愛

* 静的解析ツールなので、XMLの記載方法のミスや使われていないリソースの洗い出し等ができる
* Javaの静的解析もある程度可能。Androidに特化した静的解析がメイン
* Android Studioにも入っているので気軽に使える。てか、実は勝手に動いてる。
* 設定ファイルである**lint.xml**をカスタマイズすることで、自分好みの静的解析が可能になる

## 静的解析ツール Lintをコマンドラインから使用する

使い方はとても簡単。
※lintへのpathが通っていること前提

```
lint <アプリケーションのDirectory>
```

これだけで使えるのですが、コマンドラインに出力するだけではあまり意味がないし、すげーわかりにくい。

## Lintの解析結果をHTMLへ出力する

こっちが本題。
以下のようなコマンドで静的解析の結果をHTMLへ出力できる。

```
lint <アプリケーションのDirectory> --html <出力ファイル名>.html
```

実行すると、アプリケーションのDirectory直下に、静的解析の結果がHTMLで出力されます。
HTMLの他にCSSと画像のDirectoryも作成されます。

以下のようなHTMLが出力されます。

![lint.png](https://qiita-image-store.s3.amazonaws.com/0/43637/a1308ec7-acc7-81a8-1bba-fa37d62d3efa.png)

ざっと見ていくと以下のように、**文字を@stringで定義してくださいねー**みたいなチェックをしてくれてます。
XMLやリソースの静的解析が網羅的に行えるのでとても便利です。

![lint2.png](https://qiita-image-store.s3.amazonaws.com/0/43637/6d2ad1ee-e408-7aa7-0c29-0b00c39da012.png)


## --simplehtml

**--html**でHTML出力するだけでも十分いい感じなんですが、HTML以外にCSSと画像のDirectoryが生成されます。
**コレが嫌だ－！**という人のためのオプションが**--simplehtml**オプションです。
使い方はほとんどHTML出力の際と変わりません。

```
lint <アプリケーションのDirectory> --simplehtml <出力ファイル名>.html
```

出力されるHTML内にCSSが一緒になって出力されます。
画像(error、Warning等)は付いてきません。

## その他つけておくといいかもねーオプション

**--fullpath**オプションをつけると、出力されるHTMLにコードへのFilePathがFullPathで記載されるようになります。
デフォルトでは、相対パス的な感じになってます。

**--quiet**オプションをつけると、コマンド実行中にprogress indicatorが出なくなります。
デフォルトでは、コマンド実行中に以下のようなprogress indicatorが出てます。
※正直どうでもいいかー

```
Scanning debug: .
Scanning debug (Phase 2):
Scanning main: ................
Scanning main (Phase 2): ...............
Scanning debug: .
Scanning debug (Phase 2):
```

その他にもオプションはいっぱいありますので、自分好みのコマンドを作成してみてください！

以下にLintコマンドの説明が記載されています。
http://developer.android.com/tools/help/lint.html

## My Lint Command

ということで、私が日頃使っているLintコマンドを書いておきます。
工夫点は、**出力するHTMLのファイル名に実行時の日付を付ける**ところですね。

```
// Windows
lint <アプリケーションのDirectory> --fullpath --quiet --html lint_%date:~0,4%%date:~5,2%%date:~8,2%-%time:~0,2%%time:~3,2%%time:~6,2%.html

// Linux・Mac
lint <アプリケーションのDirectory> --fullpath --quiet --html lint_$(date +"%Y%m%d-%H%M%S").html
```

## まとめ

Android Studio等からも気軽に使えますが、コマンドラインから使用する方法も覚えておくと何かと便利です。
例えば、コマンドラインから使えるようにしておくと以下のようなことができます。

* **CI ( Jenkinsとか )で定期的にコマンドラインからLintを実行して、結果をHTML出力する**みたいなことが可能
* 上記と似たようなことで、**git pushしたタイミングでLintの実行**ができるとか。環境を作る必要はあり

AndroidのToolはGuiから使う方が便利ですが、やっぱりコマンドラインから使用する方法を知っておくと何かと便利ですねー。
Unityで3Dモデルの動的読み込み

最近、自分の開発しているWEBページでUnityを使った3Dモデルビューワーを開発しようとしたのですが、行き詰まってしまったので質問させていただきます。
Unityでサーバー上にアップロードされた3Dモデルデータをスクリプトを用いてインポートし、描画したいと考えていたのですがなかなかうまくいきません。
やったこととしては、
Resourses.loadを使おうとしたがプログラム作成時にResoursesフォルダにモデルデータを入れないといけないためダメ。
assetbundleを使ってみようとしたが、そもそもProじゃないと使えないためできない。また使えたとしてもassetbundleをUnity上で作らないといけないためこれもダメかも。
OBJファイルを動的にロードするためのライブラリ(http://wiki.unity3d.com/index.php?title=ObjImporter )を見つけたが、なぜかデバック画面ではうまくいくのにPlayerで吐き出すとうまくいかない。
といったところでどうもうまくいきません。

なにか方法があればどうか教えてください。
Jenkins Master/Slave Cluster Memo

個人的なメモ

# 永続化させたいデータ

+ `master` の `/var/lib/jenkins` のみ
+ ※他は要らない

# Gitによるバージョン管理

+ 管理対象はmasterの `/var/lib/jenkins`
+ 定期的に変更点を反映(backup)
    + ※config.xmlを修正して、git-commit/git-pushするのではない
    + ※backup方式だと運用が上手く回ってる(経験談)
    + 定期的にbackupジョブをmasterノードで実行
    + 手順は下記スクリプトを定義したシェルジョブ

## 定期コミット

```
#!/bin/bash
#
# requires:
#  bash, git
#
set -e
set -x

LANG=C
LC_ALL=C

cd; pwd

git status
git add --all
git commit -m "periodic commit: $(date +%Y%m%d.%H%M)" || :
git log -p -n 1

git push origin master
git push origin --tags
```

## .gitignore

```
#
# The following ignores...
# Miscellaneous Jenkins litter
*.log
*.log.*
*.tmp
*.old
*.bak
*.jar
*.json

# Generated Jenkins state
/.owner
/secret.key
/queue.xml
/fingerprints/
/shelvedProjects/
/updates/

# Tools that Jenkins manages
/tools/

# Extracted plugins
plugins/

# monitoring plugin files
monitoring/

# Job state
builds/
workspace/
lastStable
lastSuccessful
nextBuildNumber
modules/

#
users/*
.bash_history
.s3cfg
/secret.key.not-so-secret
.lesshst
*.zip
.pulse-cookie
.pulse/*
.fontconfig
.ssh/authorized_keys
*.rpm
jobs/*/outOfOrderBuilds/*
```

# masterノード内buildログ掃除

直近約2ヶ月分のログが保存されていれば良い

+ 下記スクリプトをmasterノード内で日次実行
+ 言うまでも無くジョブとして登録し、masterノードで実行させる

```
#!/bin/bash
#
# requires:
#  bash
#
set -e
set -o pipefail

LANG=C
LC_ALL=C

threshold=+$((30 * 2))

function disk_usage() {
  df -h
  df -k
}

disk_usage

for target_dir in /var/lib/jenkins/jobs/*/builds; do
  [[ -d "${target_dir}" ]] || continue
  echo ... ${target_dir}

  while read line; do
    [[ -f "${line}" ]] || continue
    rm ${line}
  done < <(find ${target_dir} -type f -mtime ${threshold})
done

disk_usage
```

# masterノードで実行させるべきジョブ

## polling系

+ polling系ジョブをslaveで動かしていると、ノード入れ替えた場合、前回分の差分が消滅するので、予期せぬビルドが実行される
+ masterではpollingする程度に留めておき、ビルド手順は定義しない
+ 実際のビルド手順は、ビルドジョブを別途作成し、slaveに任せる

# master <-> slave 間通信はSSH

+ 理由の1つは、rbenvを動かすため
+ 「SSH経由でUnixマシンのスレーブエージェントを起動」ではなく、「マスターでコマンドを実行してスレーブ起動」を選択
    + `ssh <slave> java -var /var/lib/jenkins/slave.jar`

# slave用2ndディスクは/var/lib/jenkins/workspace

+ ディスク使用サイズが多い場合は/var/lib/jenkins/workspaceを2ndディスクとして増設する
TesselをMacにつないでLEDを点滅させるまで


参考（というかそのまんま）: http://start.tessel.io/install

node.jsとnpmの資産にまるごと乗っかってるし、REPLもあるし、Wifi経由で簡単にインターネット接続デバイスになるし、これもしかしてめっちゃ良いものなのでは？

## 環境構築
- node.jsをHomebrewでインストール
 - Macなので`brew install node`
- Tessel開発ツールをnpmでインストール
 - `npm install -g tessel`
- TesselとMacをUSBケーブルをつなぐ
 - PowerのLEDが緑色に点灯
- Tesselのファームウェアをアップデート
 - `tessel update`でしばらく色々表示され成功した模様。


```
$ tessel update
...
INFO Downloading remote file https://builds.tessel.io/firmware/tessel-firmware-current.bin
INFO Updating firmware... please wait. Tessel will reset itself after the update
INFO Complete  1365416 /1365416

```

- ついでにWifiもセットアップ (http://start.tessel.io/wifi)
 - `tessel wifi -n [network name] -p [password]`

```
$ tessel wifi -n [network name] -p [password]
TESSEL! Connected to TM-00-04-f0009a30-005e4f56-5cba6249.
INFO Connecting to "network name" with wpa2 security...
INFO Acquiring IP address. 
....
INFO Connected!

IP       192.168.2.111
DNS      8.8.8.8
DHCP     192.168.2.1
Gateway  192.168.2.1
```

## npmプロジェクトから
- 最初のtesselプロジェクトを作成
 - `mkdir tessel-code && cd tessel-code && npm init`
 - ってか普通のnode.jsプロジェクトですね
- http://start.tessel.io/blinky からコピペしたblink.jsを走らせる
 - `tessel run blink.js`するとサクッとLEDが点滅。簡単

```
$ tessel run blink.js 
TESSEL! Connected to TM-00-04-f0009a30-005e4f56-5cba6249.
INFO Bundling directory /Users/hogelog/repos/hogelog/js/tessel-code
INFO Deploying bundle (5.50 KB)...
INFO Running script...
I'm blinking! (Press CTRL + C to stop)
I'm blinking! (Press CTRL + C to stop)
...
```

npmモジュール追加したらそのまんま動くっぽいしめっちゃ便利そう。`npm install -g tessel`でインストールした開発ツール自体もnode.js、npmの仕組み上に乗っかったオープンソースなツールっぽい。
https://github.com/tessel/cli

## REPLから
REPL（Read-Eval-Print-Loop、対話的実行環境）があった。めっちゃべんり。

```
$ tessel repl
TESSEL! Connected to TM-00-04-f0009a30-005e4f56-5cba6249.
INFO Bundling directory /usr/local/lib/node_modules/tessel/scripts/repl
INFO Deploying bundle (6.50 KB)...
INFO Running script...
> var tessel = require("tessel");
...
> tessel.led[0].toggle()
undefined
> tessel.led[0].toggle()
undefined
```

## 感想
良い。インターネットなアレコレと接続してもうちょっと色々遊んでみよう。
Elixir Float

# Elixir Float

## 概要
Elixir の Float について。

## 組み込み関数
下記を参照
http://elixir-lang.org/docs/stable/elixir/Float.html

### ceil(number, precision \\ 0)
切り上げ。
precision は小数点以下桁数

~~~
iex> Float.ceil(1.4)
2.0
iex> Float.ceil(1.5)
2.0
iex> Float.ceil(1.555, 2)
1.56
iex> Float.ceil(1.554, 2)
1.56
~~~

### floor(number, precision \\ 0)
切り捨て。
precision は小数点以下桁数

~~~
iex> Float.floor(1.4)
1.0
iex> Float.floor(1.5)
1.0
iex> Float.floor(1.555, 2)
1.55
iex> Float.floor(1.554, 2)
1.55
~~~

### round(number, precision \\ 0)
四捨五入。
precision は小数点以下桁数

~~~
iex> Float.round(1.4)
1.0
iex> Float.round(1.5)
2.0
iex> Float.round(1.555, 2)
1.56
iex> Float.round(1.554, 2)
1.55
~~~

### parse(binary)
binary を Float に変換します

~~~
iex> Float.parse("234")
{234.0, ""}
iex> Float.parse("234.5")
{234.5, ""}
iex> Float.parse("234.5abc")
{234.5, "abc"}
iex> Float.parse("not number")
:error
~~~

### to_char_list(number)
Float を char_list に変換します

~~~
iex> Float.to_char_list(234.0)
'2.34000000000000000000e+02'
iex> Float.to_char_list(234.5)
'2.34500000000000000000e+02'
~~~

### to_char_list(float, options)
Float を char_list に変換します。

options

* :decimals — 十進表記
* :scientific — 指数表記

~~~
iex> Float.to_char_list(35.555, [decimals: 2])
'35.56'
iex> Float.to_char_list(35.555, [scientific: 2])
'3.56e+01'
~~~

### to_string(some_float)
Float を string に変換します

~~~
iex> Float.to_string(234.0)
"2.34000000000000000000e+02"
iex> Float.to_string(234.5)
"2.34500000000000000000e+02"
~~~

### to_string(float, options)
Float を char_list に変換します。

options

* :decimals — 十進表記
* :scientific — 指数表記

~~~
iex> Float.to_string(35.555, [decimals: 2])
"35.56"
iex> Float.to_string(35.555, [scientific: 2])
"3.56e+01"
~~~

## 参照
http://elixir-lang.org/docs/stable/elixir/Float.html
Goutte使おうと思ったらイケてなかった

# Goutteとは

https://github.com/fabpot/goutte

- PHPで書かれたWebスクレイピング用のライブラリ
- 競合でPHPだと、
- Simple HTML DOM Parser なんかがある

# 僕のやりたいこと

- HTMLでしかデータを提供していない掲示板を、スクレイピングして
データを整形してXML,jsonなんかで出力したい

# Goutteは Simple HTML DOM Parser よりはやくてすごい

[そろそろ Simple HTML DOM Parser を使うのはやめたほうがいい | localdisk](http://localdisk.hatenablog.com/entry/2014/02/05/%E3%81%9D%E3%82%8D%E3%81%9D%E3%82%8D_Simple_HTML_DOM_Parser_%E3%82%92%E4%BD%BF%E3%81%86%E3%81%AE%E3%81%AF%E3%82%84%E3%82%81%E3%81%9F%E3%81%BB%E3%81%86%E3%81%8C%E3%81%84%E3%81%84)

- Goutteのほうが速度もメモリ的にも有利みたいなのだが・・？


# Goutteは抽出条件に一致するものがないと、例外を投げる

- 実際使ってみたら`$crawler->filter(抽出条件)`で抽出する際、
抽出できるものが何もないと 例外 を投げてしまう・・

- 配列なんかに抽出したデータを複数格納していく、、なんかをしようとすると、
抽出条件を指定するたびにExceptionをcatchしないといけなくなり
コード量がめちゃ増えて非効率すぎる

- クロージャの書き方なら、抽出できなければ中のコードが実行されないだけで、例外は投げられない。
とはいえ毎回クロージャ使うと簡単に書けるような部分ばかりでもないので、、やはり不便は不便

- Simple HTML DOM Parserだと`find(条件)`で見つからなくても、
Nullになるだけなのでemptyやissetで判定できる