OmniAICreator/Qiita-1.07M huggingface dataset:
特定ユーザをwheelにする設定

# sudo設定を変更する
- root ユーザで実行する

```
visudo
```

このへんを編集する

```
## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL
```

# wheel のみ su できるようにする
- root ユーザで実行する

```/etc/pam.d/su
# Uncomment the following line to require a user to be in the "wheel" group.
auth            required        pam_wheel.so use_uid
```

# アカウントの設定を変更する
- root ユーザで実行する

```
gpasswd -a (対象ユーザ) wheel
usermod -g wheel (対象ユーザ)
```
Windows7 64 に VirtualBox4.3.20 と Vagrant1.7.0 をインストールしようとしたメモ

とりあえずインストールだけしてみたので作業をメモっときます。

#VirtualBoxのインストール#
https://www.virtualbox.org/
↑のDownloadsから 'VirtualBox 4.3.20 for Windows hosts' を選択。
ついでに 'VirtualBox 4.3.20 Oracle VM VirtualBox Extension Pack' も併せてダウンロードしておく。

そんでもって本体をインストール。

##VirtualBoxへのExtensionPackの適用##
ファイル > 環境設定 で設定ダイアログを開いて、機能拡張を選択。
さきほどダウンロードしたExtensionPackを選択すればOK。

#Vagrantのインストール#
https://www.vagrantup.com/
↑Vagrantはココから。

##1.7.0が動かない##
2014/12/12現在の最新は1.7.0だったのでこれをダウンロードしてインストール。
しかし`Failed to find Vagrant!` むー。。。

http://stackoverflow.com/questions/27397278/failed-to-find-vagrant
↑同様の現象に困ってる人発見。
↑↑問題を報告してくれたみたいです。ありがたや～！！

##1.6.5のインストール##
そんなわけで https://www.vagrantup.com/downloads-archive.html から1.6.5をダウンロードしてインストール。
インストール終わったら`vagrant -v`して`Vagrant 1.6.5`と表示されたので成功。

***
boxの追加↓
[VagrantにCentOS6.5 64bitのboxを追加するメモ](http://qiita.com/miyamoto_ta/items/2e793bc35a7fb1c6b77d)
rpmbuild環境と便利なコマンド


## 必要なパッケージをインストール

```bash
sudo yum install -y rpmdevtools yum-utils
```

## 環境を構築

```bash
$ rpmdev-setuptree
$ tree -L 1 rpmbuild/ 
rpmbuild/
├── BUILD
├── BUILDROOT
├── RPMS
├── SOURCES
├── SPECS
└── SRPMS
```

## specファイルに含まれているソースやパッチをダウンロードして展開する

```bash
$ spectool -g -R ./your-spec.spec

# specに含まれるソースやパッチの一覧を表示
$ spectool -l ./your-spec.spec
```

## specの BuildRequires に指定されてるものをインストールする

```bash
$ sudo yum-builddep ./your-spec.spec
```

## ビルド環境の変数とかマクロとか確認する

```bash
$ rpm --showrc
```

## ビルドする

```bash
$ rpmbuild -ba ./your-spec.spec
```

参考
http://www.sssg.org/blogs/naoya/archives/1309
http://vinelinux.org/docs/vine6/making-rpm/env-and-macro.html
"dd/MMM/yyyy"な日付文字列で Invalid format って言われたら。


"17/Aug/2014"という日付文字列をパースしようとしたらある環境では動くのに、ある環境では Invalid format と言われ java.lang.IllegalArgumentException が発生しました。
これはロケール設定に依存した問題なので、プログラムでロケールを指定してパース出来るようにします。

## 環境
* Mac OS X Version 10.9.5
* Scala 2.10.4
* Java 1.7.0_71
* joda-time 2.3

## 確認
```scala-shell
scala> import java.util.Locale
scala> import org.joda.time.DateTime
scala> import org.joda.time.format.DateTimeFormat
scala> import org.joda.time.DateTimeZone
scala> DateTimeFormat.forPattern("dd/MMM/yyyy:HH:mm:ss Z").withZoneUTC().withLocale(Locale.ENGLISH).parseDateTime("17/Aug/2014:00:00:05 +0900")
res1: org.joda.time.DateTime = 2014-08-16T15:00:05.000Z

scala> DateTimeFormat.forPattern("dd/MMM/yyyy:HH:mm:ss Z").withZoneUTC().withLocale(Locale.JAPANESE).parseDateTime("17/Aug/2014:00:00:05 +0900")
java.lang.IllegalArgumentException: Invalid format: "17/Aug/2014:00:00:05 +0900" is malformed at "Aug/2014:00:00:05 +0900
```

## 参照
http://www.loc.gov/standards/iso639-2/php/English_list.php
解析において僕の考える最強のフォルダ構成

# まえおき

Matlabで解析をしているときの
フォルダ構成を書いてみます。

でも解析一般で使えるかと思うので
参考にしていただけると幸いです。

フィードバックいただけると
なお嬉しいです。

# 概要
解析の際の、
僕の考える最強のフォルダ構成を書いてみます。

6月の段階でこれ組んで、
今のところヘルシーに解析できています。

##　基本思想

MVCパタンに則っています。
理由は単に、僕がRails屋さんだったからです。
Model（クラス）、
ControllerとView（Experimentファイル群でそれぞれ画像出力まで行う）
と、2つに分けています。

検討した結果、Viewにあたるものは
画像の保存だけで良いという結論になったからです。

Viewとして画像ファイルを保存するときは、
加工可能なデータ形式であると好ましいです。

共通処理/ロジックは
クラス・スクリプトファイルに任せます。

そのうえで、毎回の解析を全て
Experimentsフォルダに
experimentsファイルとして保存していきます。

これにより、いつ何をやったのかをさかのぼりやすくなりますし、
各Experimentファイルと対応する
結果出力フォルダを生成するようにすると一切迷わなくなります。



# フォルダ構成
![全体のファイル構成](https://qiita-image-store.s3.amazonaws.com/0/19990/1c265db1-2b38-53a0-0baf-74483fc0f985.jpeg)

## 解析に使う系

### dataフォルダ

データを入れておくところです。
一応切り分けます。

### experimentsフォルダ

![experimentsファイル](https://qiita-image-store.s3.amazonaws.com/0/19990/053dfedf-1221-dc76-546d-d328809a67b7.jpeg)


全ての解析スクリプトを追加していきます。
スクリプトは、解析の日付を接頭辞にして
解析内容の分かる名前をつけましょう。
この発想は、RailsのMigrationのところです。
バージョン管理が容易になると考えました。

### libsフォルダ

クラスファイルを突っ込みます。
共通メソッドかどうかでフォルダをさらに
分けるのもありです。

### scriptフォルダ

クラスファイルで記述できない
種類の共通処理を記述します。

定数の呼び出しなどは共通処理なので、
load_constants
などとして1ファイルで必要な物を全て呼べるようにします。

### testフォルダ

新しくクラスファイルを実装するときなどには
Testを書くので、こちらにTestファイルを設けます。
一応こちらはExperimentsに倣って
日付を接頭辞にしておきます。


## 結果をまとめる系・その他

### docフォルダ

論文をストックしておくフォルダです

### resultsフォルダ

結果を全部突っ込みます

### slides

発表スライドをしまっておくフォルダです。
散らからないように、docsとは分けています。
Elasticsearchにpowershellからデータを投入してみよう


これは [Elasticsearch Advent Calendar 2014](http://qiita.com/advent-calendar/2014/elasticsearch) - Qiita 、12日目の記事です。

##はじめに

皆さんは、どうのようにElasticsearchを使っていますか？

logstash、fluentdからのデータの投入だけではでなく、powershellからデータを投入できると、可視化できる範囲がぐっと広がります。

私の環境では、下記のような情報を可視化しています。

* vmwareの情報をpowershellから投入
* AWSの情報(ec2の稼働状態、cloudtrail)をpowershellから投入
* windowsのイベントログを投入

Elasticsearchには、[様々なクライアント](http://www.elasticsearch.org/guide/en/elasticsearch/client/community/current/clients.html)がありますがpowershellのクライアントはないため、関数を自作してみましたのでご紹介いたします。

## 使用例

[Put-Elasticsearch](https://gist.github.com/toshi-miura/a4bd36072bb6ebae0dc7) という関数を作ってみました。
下記に、windowsのイベントログをelasticsearchに投入するサンプルを示します。

```
## event logの取得
$events = Get-EventLog system -newest 1000

## 投入用にオブジェクトを加工
## 一意キーとタイムスタンプを付与。(kibana上でタイムスタンプのフィールドは指定できるが、レコードごとに把握が面倒なため、「@timestamp」に統一)

$events | %{
	$dateStr = Get-Date -Date $_.TimeGenerated | %{ $_.AddHours(-9) } | Get-Date  -format s					
				
	$_ | Add-Member -MemberType NoteProperty -Name "@timestamp" -Value $dateStr	| Out-Null

	#複数回投入してもよいように、一意キーを決める										
	$_ | Add-Member -MemberType NoteProperty -Name "objKey" -Value ($_.MachineName+"_"+$_.Index) | Out-Null	
			
}
			
			
Put-Elasticsearch 　-putDatas $events -bulk $script:bulk -index $script:index  -elaHost $script:elaHost -port $script:port -type "winevent"

```

headプラグインで、お手軽に確認します。

![elasticsearch-head.png](https://qiita-image-store.s3.amazonaws.com/0/2437/75f112e8-95fe-4f2c-2b8a-b0bb57e81ca0.png)

ちゃんと入ってますね。

では、次にvmwareのAPIを使ってvmの情報を投入してみましょう。
vmのレコードには、ログレコードとは違い時間が含まれてないので、ある時間の状態として時間も渡します。

```
##モジュールのロード
Add-PSSnapin VMware.VimAutomation.* -ErrorAction SilentlyContinue 

##ログイン
$vi = Connect-VIServer $sVCenter -User $sVCUser -Password $sVCPwd -ea silentlycontinue

##VMを取得して、余計なデータを落とす。リネームが必要なフィールドは適宜変換
$filterVm = Get-VM | select	@{Name="vmid";Expression={$_.id}},NumCpu,MemoryMB ,@{Name="objKey";Expression={$_.id}}

## 時間情報をセットで渡す。分、秒等は切り捨て。
$date = Get-Date -Minute 0 -Second 0
Put-Elasticsearch 　-putDatas $filterVm -bulk $script:bulk -index $script:index  -elaHost $script:elaHost -port $script:port -type "vmwarevm" -date　$date


```

ちゃんと入ってますね。

![vminfo.png](https://qiita-image-store.s3.amazonaws.com/0/2437/ec165379-5985-394c-62a5-0d46062bafbe.png)

## まとめ

powershellは非常に強力でwindows環境でのデータ収集、加工に非常に優れています。様々なしがらみにより、windows環境はまだまだ残っているのではないかと思います。そこえで、powershellを使用することによりelasticsearchに様々なデータを入れることが可能、様々な状態の可視化が可能になります。

winodws環境の管理をされている方は一度お試ししてはいかがでしょうか？

## 補足
elasticsearch version "1.0.2"で動作確認。version上げねば、、、
バイナリ内の調査方法

Google Anlyticsを使っていて、リジェクトされた時に行った調査の覚え書き。

#コマンド
##strings 
セレクタ（method)での調査

```console
$ unzip <アプリのバイナリ名>.ipa
$ cd Payload/
$ cd <アプリのバイナリ名>.app/
$ strings <アプリのバイナリ> | grep advertisingIdentifier 
```



## otool
クラス名での調査

```console
$ otool -ov <アプリのバイナリ> | grep ASIdentifierManager
```
【Cake】副問い合わせ

配列が複数だとin条件になる。

```php
find('all',array(
'conditions'=>array('tel'=>array(111,222))
)
//=>where tel in (111,222)

```

配列が単数だと要素を()で囲んで=してくれる。
つまり副問い合わせできる。

```php
find('all',array(
'conditions'=>array('tel'=>array('select * from foo'))
)
//=>where tel = (select * from foo)

```

まじかこの仕様！！
Bottle チュートリアル：TODOリストアプリケーション不具合


PythonのWebアプリフレームワークBottleの、公式ドキュメントの[チュートリアル](http://bottlepy.org/docs/dev/tutorial_app.html)でリストの本文に日本語を入力したら文字化け、解決したのでメモ。



##TODO項目の日本語文字化け
TODO項目の本文を日本語で入力すると文字化け発生しました。
todo.pyの**new_itme():**と**edit_item():**のコード次のように修正し解決！



24行目(修正後)

```todo.py　
new = request.query.task.strip()
```
45行目(修正後)

```todo.py
edit = request.query.task.strip()
```



##その他の不具合
他にも不具合がありましたが以下のサイトを参考に解決できました。


- 日本語の文字化け以前にサンプルコードを書いて実行したら動きませんでした。

>[BottleのTODOチュートリアルが動かない件と対処方法](http://komagawa292.net/20140612/bottle-todo-tutorial/)

- TODO項目か2桁以上になるとリストを表示できなくなりました。
 
>[Bottleチュートリアルの問題点](http://komagawa292.net/20140612/bottle-todo-tutorial-problem/)
Slack に Ruby 製 Bot の Lita を参加させる

# 概要

![リタ](http://livedoor.blogimg.jp/kabepuri09/imgs/1/9/197bb2f7.png)

[lita](https://www.lita.io/) は ruby 製Botです。
このたび、slackがlitaインテグレーションに対応したようです。
https://twitter.com/SlackHQ/status/543163163831582720

本記事では、 Slack に Lita bot を参加させます。

# インストール

## Vagrant

Vagrantでのインストールが推奨されていますが、ここでは手動でインストールします。

## 手動

gem でインストールできます

```
gem install lita
```

新規プロジェクトを作成します

```
lita new
```

起動します。Redis が立ち上がっていないとエラーとなります。

```
cd lita
lita
```

# デプロイ

heroku にデプロイできるようにProcfileを足します

```ruby:Procfile
web: bundle exec lita
```

[RedisToGo](https://devcenter.heroku.com/articles/redistogo) をセットアップします。
heroku アカウントに決済情報が無いとプラグインが導入できないかも知れません。

```
heroku addons:add redistogo
```

設定ファイルにredisの設定を加えます。
環境変数 REDISTOGO_URL は既にサーバー側に設定されているはずです。

```rb:lita_config.rb
  config.redis[:url] = ENV["REDISTOGO_URL"]
  config.http.port = ENV["PORT"]
```

# slack 連携

slack 側で lita integration を追加した後、APIキーをメモします。

Gemfile に lita-slack を追加します。
bundle install したら、Gemfile.lock もデプロイする必要があります。

```rb:Gemfile
source "https://rubygems.org"

ruby "2.1.5"

gem "lita"
gem "lita-slack"
```

lita の設定に API キーを設定します

```rb:lita_config.rb                       
Lita.configure do |config|
  # 他の設定 ...
  config.robot.adapter = :slack
  config.adapters.slack.token = ENV["SLACK_API_KEY"]
end
```

APIキーは環境変数にしておきます。

```
heroku config:set SLACK_API_KEY=hoge-1234123456-hoge
```

# 動作確認

![8481a0f5a2f9df0163f3baee1c519d0d.png](https://qiita-image-store.s3.amazonaws.com/0/12280/b58d8f2d-273d-55c4-16d2-816aaa26e7cb.png)


# いろいろやらせる

[lita-google-images](https://github.com/jimmycuadra/lita-google-images) ハンドラを登録してみましょう。

いろいろな lita ハンドラが gem として見つかるはずです。

```rb:Gemfile
gem "lita-google-images"
```

bundler でインストールしてデプロイします

```
bundle install
git push heroku master
```

動作確認します

![9217bdd7da227f0564a0eecb6dc5bab3.png](https://qiita-image-store.s3.amazonaws.com/0/12280/37bfeddb-1d07-c74d-7b92-1daa3d4f963a.png)

LGTM

# プラグインハンドラを作る

http://docs.lita.io/plugin-authoring/handlers

ハンドラを自分で作る際、テンプレートから作ることが出来ます。
gem として公開する前提のようです。

```
lita handler lita-あなたの-ハンドラ
```

circle.yml なども生成してくれて便利です。
Android Wearアプリ開発

先ず、USBデバッグを有効にする必要がありますね。

１．Galaxy Gear2でのUSBデバッグ有効化

　　設定 -> Gearの情報 -> UBSデバッグ　にチェックを入れます。

２．Galaxy S4 miniでのUSBデバッグ有効化
　　最初混乱しました。
　　全くメニュー上から見つかりません。

　　色々と調べたら、なんと！

　　設定 -> その他 -> 端末情報

       ビルド番号の部分を７回連続タップすると「デベロッパーモード」にする事が出来ます。３回連続の時点で「デベロッパーになるまであと４ステップです。」と表示されます。

　　その後、その他メニューに戻ると「開発者向けオプション」が無事に表示されましたので、USBデバッグをONにしました。

　又、設定＞セキュリティ＞提供元不明アプリを有効にする事も必要です。
![image](https://qiita-image-store.s3.amazonaws.com/0/23130/a01d3087-7a5c-39e2-2992-154c6eb9efa1.png)

なんかゲームの隠しコマンドみたいですが、まーデベロッパーモード自体隠しの様ものですね。

 

無事にadb devicesで端末認識するかと思ってたらスマフォ側しか認識しない。

さっきの設定じゃ足りなかったのかとGalaxy Gearを触ってるとSamsung Gear | SAMSUNG Developersがあるとの事。

サイト見てみると

Samsung Gear Application consists of the Host-side Application which runs on Android-based Samsung mobile devices, and the Wearable-side Widget which runs on Tizen-based Samsung Gear devices.

The Host-side Application can be developed in the common Android development environment, whereas, the Wearable-side Widget can be developed with Tizen SDK for Wearable.

In addition, Samsung Accessory SDK is the necessary component for communicating between the Host-side Application and Wearable-side Widget.

と書いてある。

なんと！！

AndroidWearじゃないじゃん。OSがTizenやん・・・またもや・・・よく調べないとダメだね。

まーでもいっっか。と言うことで。

 次に　Samsung Gear | SAMSUNG Developers　から

・Tizen SDK for Wearable

・Samsung Accessory SDK

をセットアップします。

 ドキュメントを読んでいくとこんな感じのアーキテクチャの様だ。
![image](https://qiita-image-store.s3.amazonaws.com/0/23130/740399c2-4ae3-2d0c-accb-437f4fd9d39e.png)

 という事で色々あるので次に続きます。
図形の移動が、こんなに簡単に実装できる時代になりました


　FOSS4G と言えば GIS、GIS と言えば図形編集ですね。図形を追加したり移動したり回転したりできる機能です。面倒なんですよ、これプログラミングするの。

　なにが面倒かというと、色んな状態（マウスの状態＜左/右ボタンが押されている/押されてない、マウスダウン時の座標、現在の座標＞、図形の状態＜選択されている/いない＞）などなどがコードの中に入り乱れて、スパゲッティコードになりがちというか「なります」。

　例えば「図形の移動」のフローは、

1. 図形をマウスダウン（＝選択）
2. そのままマウスムーブ（＝移動）
3. マウスボタンを離して終了

と、極めて単純なんですね。これが普通にコーディングするとフラグや状態管理の嵐になってしまう。

　と言ってた時代は終わりました。
　例えば、下の画面。

![](http://blog.amay077.net/assets/images/posts/simply_shape_dragging_using_rx_01.gif)


　これは、白い四角形をドラッグで移動できるというスマホアプリの例ですが、これの実装の主要部分はたったの **６行** です。

```Csharp:
rectangle.DownEvent() // 1.図形をマウスダウン
    .SelectMany(rectangle.MoveEvent())  // 2.そのままマウスムーブ
    .Subscribe(e => {
        rectangle.SetX(e.RawX); // 移動の度に図形を移動
        rectangle.SetY(e.RawY);
    });
```

　このコードをよく見ると、上に書いたフローと似ているのが分かります。人が考えたままコードに落とし込める。しかもフラグとか状態管理とかのゴミが一切ない。素晴らしい！(3. に該当するコードが必要な気がするけどまあいいや）

　これを実現しているのは[リアクティブプログラミング](http://ninjinkun.hatenablog.com/entry/introrxja)という概念。なんでもかんでもストリーム(時系列にデータが降ってくる何か)で捉えよう、イベントでさえも。イベントはストリームであるので、あとはストリームの加工や他のストリームとの合成でどうにかできてしまいます。

　リアクティブ＋図形うんぬんの他の例は、

* [RxJS + Canvas](http://act.neue.cc/rxjs/canvas.htm)

などがあります。これは HTML なのですぐ試せますしコード（Javascript）も見られます。

　リアクティブプログラミング用の著名なライブラリはほとんどオープンソース、リアクティブプログラミング＋FOSS4G で **RxGIS** （なんかカッコいいから言ってみたかっただけ）

　いつかまたGIS作るみたいな仕事があったら、絶対 Rx 使ってつくるぞ！と思ってますのでよろしくお願いします。

（上のコード例の全コードは [gist](https://gist.github.com/amay077/1d22ba8ffa8ad95e9393) にあります。）
GLSLでモザイク処理


自分のところから出たものであれですが、[Filters](http://filters.kayac.com/)はほんとに面白いです。
GLSLを楽しく学ぶには打ってつけ。

今回はそこでフォークして作ったモザイクについて書きたいと思います。
こうしたテクニックを覚えておくと、あとあと別のことに流用できたりするので基礎はやはり大事ですね。

さて、[前回の記事](http://qiita.com/edo_m18/items/85d5c0ca5bdf0ed159e4)で書いた[ピンポイントモザイクフィルター]((https://www.youtube.com/watch?v=akfSjPOy9Ms))。

[![ピンポイントモザイクフィルター](https://qiita-image-store.s3.amazonaws.com/0/5616/aa7d734b-1b99-0acb-a7b3-690c59b6f37f.png "ピンポイントモザイクフィルター")](https://www.youtube.com/watch?v=akfSjPOy9Ms)

図形の描画は前回の記事で書いたものをそのまま使っています。
問題のモザイク部分は、カメラからのテクスチャの色を取得するときのロジックをいじってやることで実現しています。

## モザイク処理

モザイク処理、これ自体は実は[Filters](http://filters.kayac.com/)に投稿されていたものをフォークして作っています。
[Filters](http://filters.kayac.com/)のいいところは、こうして自分が作りたいフィルターのベースを見つけてフォークできる点ですね。
あとはもう、どういう発想ができるか、が面白いフィルターを作れるか否かの分岐点でしょう。

さて、その問題のモザイク処理ですが、最初はどんなことをやっているんだろうと思いながらフォークしました。
そして箱を開けてみてびっくり！　その処理の単純さに驚きました。

実際のコードを見てもらうと分かると思います。


```glsl
void main()
{
    vec2 uv = iScreen;
    uv = floor(uv * iSize * 15.0) / 15.0 / iSize;
    vec4 color = texture2D(iCamera, uv);
    gl_FragColor = vec4(color.rgb, 1.0);
}
```

**なんと4行！**

しかも、実質モザイクの計算をしているのは以下の1行だけです。

```glsl
uv = floor(uv *  iSize * 15.0) / 15.0 / iSize;
```

めっちゃシンプル。
ちなみに`iSize`はピンチイン・アウトのサイズが入ってくるので、もしピンチイン・アウトの対応をしない場合はさらに簡潔になります。

```glsl
uv = floor(uv * 15.0) / 15.0;
```

これでモザイクになってしまうのだからGLSLは奥が深いですね。
さて、なにをしているかというと、`uv`はテクスチャの、いわゆる「UV座標」と呼ばれるものです。
名前からも分かりますね。

そして、仮に細工をせずにこれをそのまま使えばカメラで撮影した絵がそのまま出力されます。
それを、なにか細工をしてから使用していますね。

やっている処理はいったん`uv`に`15.0`をかけ、その端数を切ります（`floor`関数）。
そのあとで、かけた値で割ります。

例えば`0.5`の座標だとした場合、`floor(0.5 * 15.0) / 15.0`ですね。

```
floor(0.5 * 15.0) = 7.0; // 7.5の端数を切る
7.0 / 15.0 = 0.466666...
```

となります。

さて。`0.5`で計算しましたが、`0.48`と微妙に小さい数字の場合はどうなるでしょうか。
実は計算結果は一緒になります。
なぜなら、`floor(0.48 * 15.0) = 7.0`だからです。
つまり、この計算結果が`7`になる間は同じ座標の色を使うことになります。

そしてモザイクのサイズは`15.0`の値によって決まります。（15.0以外にするとモザイクのサイズが変わる）
これがモザイク処理の正体です。

いやーうまく出来てるもんです。


### 余談

ちなみに、GLSLは基本的に`-1〜1`の間の数値を扱います。
これは、画面サイズがどんなに大きくても、最大でx, yともに1になる、ということです。
つまり、0.02というのは小さいように見えて意外と大きな数値です。
こうしたところからも、上記のような計算が成り立つ理由になっています。

ほんとよく出来てますね。
ログの保管期間を変更

## Apache

```bash:/etc/logrotate.d/httpd
/var/log/httpd/access_log
/var/log/httpd/error_log
{
    rotate 365
    daily
    missingok
    #notifempty
    sharedscripts
    delaycompress
    postrotate
        /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
    endscript
}
```


/var/log/httpd/\*/access_log
/var/log/httpd/\*/error_log
がある人はそれも追加。


## /var/log/maillog

```diff:/etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
+   rotate 12
+   monthly
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}
```

## 実行タイミング

* /etc/cron.daily/logrotate
Guard で Git コミットを自動で行う

小ネタです。すいません。

## 自動コミットとそのきっかけ

ある日、突然「手動コミットが許されるのは小学生までだよねーキャハハ」というツイートが僕の TL に流れ込んできて、いろいろな方にお話を聞いたところ結構な人がコミットは自動化しているということだったので僕もやってみようと思いました。

当時のツイートはこんな感じ。

https://twitter.com/a_suenami/status/537513929849569280
https://twitter.com/a_suenami/status/537514152512589824

http://twilog.org/a_suenami/date-141126

## やってみた

Guard でやってみました。

```rb
# Gemfile
source "https://rubygems.org"
gem "guard-shell"
```

```rb
# Guardfile
guard :shell do
  watch /\A**\/*\z/ do |m|
    `git add #{m[0]} && git commit -m 'Automatically commit: #{m[0]}'`
  end
end
```

これだけです。

あとは Guard を起動します。

```shell-session
$ bundle exec guard
```

Guard を起動した状態で、例えば

```shell-session
$ echo 'Hello, world!' > hello.txt
```

とすると`hello.txt`が自動的にコミットされます。

```shell-session
$ git log --oneline -1
dc004a4 Automatically commit: hello.txt
```

## あとは煮るなり焼くなり

Git はコミットさえしえておけば基本的にその履歴が消えることはほとんどありません。GC はされますがそれまでは基本的に各ブランチの HEAD から到達不可能になることがあるだけでコミット自体は残りますし、そのようなコミットも reflog からは参照できます。

共有リポジトリに push するコミットは意味的にまとまった単位になっているほうがよいですが、push する前の作業履歴として自動コミットはよいプラクティスなのではないでしょうか。あとは rebase して squash するなり、別ブランチを作って cherry-pick するなり、自由にいろいろすればよいのかと。
Dictの値をキーにキーを集計し、集計されたキーに対して任意の関数を実行したDictを返す

Elixir Advent Calendar 2014 12日目。
お仕事が多忙を極めている(一年中この状態という説もある)上に、忘年会が沢山あってつらみが増しているので、今日はライトなネタを。

# やりたいこと

あるHashed Listがあるとします。

```elixir
list = [a: 1, b: 0, c: 4, d: 0, e: 1, f: 1]
```

これに関して、バリューをキーにして、集計したい。
期待するアウトプットは、こんな感じです。

```elxir
%{0 => ["b", "d"], 1 => ["a", "e", "f"], 4 => ["c"]}
```

ちょっとしたデータ処理に便利ですよね。
標準関数にはちょうどいいのが無いので、作ってみました。


# Enum.group_by/3 の拡張

ちなみに、近い関数としては ```Enum.group_by/3``` があるのですが、それだけでは上記は実現できません。もう一つ処理が必要です。

まず、 ```Enum.group_by/3``` のソースを見てみましょう。

```elixir
@spec group_by(t, dict, (element -> any)) :: dict when dict: Dict.t
def group_by(collection, dict \\ %{}, fun) do
  reduce(collection, dict, fn(entry, categories) ->
    Dict.update(categories, fun.(entry), [entry], &[entry|&1])
  end)
end
```

ちょっと足りませんね。
これでどうでしょう。

```elixir
@spec group_by(t, dict, (element -> any), (element -> any)) :: dict when dict: Dict.t
def group_by(collection, dict \\ %{}, fun, fun_entry) do
  Enum.reduce(collection, dict, fn(entry, categories) ->
    Dict.update(categories, fun.(entry), [fun_entry.(entry)], &[fun_entry.(entry)|&1])
  end)
end
```

第四引数に、関数をもう一つ追加しました。


# 実行結果

```elixir
defmodule EnumX do
  def group_by(collection, dict \\ %{}, fun, fun_entry) do
    Enum.reduce(collection, dict, fn(entry, categories) ->
      Dict.update(categories, fun.(entry), [fun_entry.(entry)], &[fun_entry.(entry)|&1])
    end)
  end
end

EnumX.group_by([a: 1, b: 0, c: 4, d: 0, e: 1, f: 1], fn({_, v}) -> v end, fn({k, _}) -> to_string(k) end)
```

```elixir
%{0 => ["d", "b"], 1 => ["f", "e", "a"], 4 => ["c"]}
```

うまくできました。


# 応用

この関数、わりと汎用性が高いと思っています。このような使い方もできるでしょう。

```elixir
EnumX.group_by(~w{ant buffalo cat dingo}, &String.length/1, &String.capitalize/1)
```

```elixir
%{3 => ["Cat", "Ant"], 5 => ["Dingo"], 7 => ["Buffalo"]}
```

第三引数までは公式ドキュメント通りですが、与える関数を追加することにより、それぞれをキャピタライズしているところが違います。
標準関数であっても、パイプ演算子を使うことで実現できるとは思いますが、力技になるのではないでしょうか。（この例の場合、第一引数を ```Enum.group_by/3``` に与える前に ```String.capitalize/1``` しとけばいい話ですけど。）


# まとめ

Dictの値をキーにキーを集計し、集計されたキーに対して任意の関数を実行したDictを返す方法をご紹介しました。

明日は @ma2ge さんです。
apacheで攻撃者に有用な情報を与えない対策

nginxの場合は [Nginx導入時、サクッと対応しておくと良いかもしれない - Qiita](http://qiita.com/kidach1/items/985efebba639713c562e#2-1)

```bash:確認
curl -I http://url〜
```

* [攻撃を受ける前に! Apache インストール後に必要な８つの変更点](http://www.rem-system.com/apache-security01/)

## Apacheのバージョンを出力させない

* [core - Apache HTTP サーバ バージョン 2.4](http://httpd.apache.org/docs/2.4/ja/mod/core.html#serversignature)

* エラー画面にサーバー情報を表示しないようにする
  * [Apache/ServerTokensとServerSignatureの関係 - ウェブ関連技術調査](http://web.just4fun.biz/?Apache%2FServerTokens%E3%81%A8ServerSignature%E3%81%AE%E9%96%A2%E4%BF%82)

```diff:httpd.conf
- ServerTokens Full
+ ServerTokens Prod
```

* `ServerSignature Off`はProdの場合不要。

```diff:curl&nbsp;localhost/aaa
 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
 <html><head>
 <title>404 Not Found</title>
 </head><body>
 <h1>Not Found</h1>
 <p>The requested URL /aaa was not found on this server.</p>
 <hr>
+<address>Apache/2.4.7 (Ubuntu) Server at localhost Port 80</address>
 </body></html>
```

## PHPのバージョンを出力させない

```diff:php.ini
- expose_php = On
+ expose_php = Off
```

## Apacheのwelcomeページを表示させない

```
cd /etc/httpd/conf.d/
mv welcome.conf welcome.conf.org
```

----

以下は今はしなくても良さそう。

## IE6初期以前のBasic認証セキュリティ向上

* TraceEnable Off(Basic認証のセキュリティ向上)

* [HTTPのTRACEの無効化と確認 | hacknote](http://hacknote.jp/archives/9186/)
* [HTTP TRACE メソッドの現状(pdf)](http://www.gsx.co.jp/tts/activity/110413.pdf)

```bash:
telnet dummy.hoge.jp 80
```

* `OPTIONS / HTTP/1.0`を入力しEnter2回。

> Allow: GET,HEAD,POST,OPTIONS,TRACE

TRACEを無効にするには以下

```diff:httpd.conf
+ TraceEnable Off
```
HerokuからAWS移行を決めた理由とその方法

## 概要
Herokuで1年以上運用して、年内にAWSへ移行することとなりました。年末ですしそれを振り返って、HerokuとAWSの良い所・悪い所、AWSへ移行するにあたりどのような運用をすることに決めたか書きます。

## HerokuからAWSへ移行を決めた理由
大きく3つあります。

- プロセスの実行に制限があったり、リソースに制限があるのが辛い。
    - 私達が取り組んでいるのが、画像を多く取り扱うサービスだということもあります。特にサムネイル作成については苦渋を飲まされました。以下の記事に知見を纏めています。
        - [RailsとHeroku、AWSでAwesomeな画像アップロードからのサムネイル作成](http://qiita.com/anoworl/items/35e75a20e70d2ad0f658#2-1)
        - [RailsとHeroku、AWSで画像アップロードからのサムネイル作成（実践編）](http://qiita.com/anoworl/items/0e3f1643ef794de058df)
    - ただこの知見はHeroku特有のものも多く、AWSであれば容易に解決できた部分もあります。それが今回移行する理由の一つです。
- リージョンによる遅延
    - 1つめのようにどうにかこうにか対策できる部分もあるのですが、リージョンの問題（HerokuはUSとEUにしかリージョンが無い）ことです。Tokyoリージョンが使えないのは、多くのリクエスト、大きい転送量が上下ともに発生する画像系のサービスでは大きな損失です。（ベンチを取ると分かりやすかったです）
- 無料範囲で済まなくなると、結構お高く付く

逆に嬉しかったことは大きく以下の2つです。

- 気軽に開発できる
    - 1 dynoまで無料
        - ぽんぽんステージング環境を立てて確認できる（最近はforkコマンドが出来て非常に楽になりました）のは高速開発にはとても便利です
    - pushするだけでデプロイ
        - 何も考えずpushするだけでデプロイできるのは、環境構築のコストが抑えられて非常に便利です
        - また最近はGitHub-Syncという機能が出来て、指定したGitHubのmasterに入るだけでデプロイを走らせられるようになりました
    - アドオンがたくさんある
        - MongoもMemcacheもNew Relicもボタン一つ、コンソール1コマンドですぐに使うことが出来て非常に楽です
- 何も考えなくて良い
    - デプロイもそうですが運用もほぼ何も考えずに、負荷が増えたらdynoを増やしたり、DBもスケールアップしたり、金を詰めば何も考えずとも動かし続けられます

## AWSではどのサービスを使うのか
HerokuからAWSへ移行するのですが、どのサービスを使って運用するかで悩みました。結論としては、Herokuで小さく運用していたサービスだったので、EC2で地道にやるので十分でした。

なおサービスの構成は以下に追加で、EC2とClientからアクセスされるS3と、ClientとS3の間に入るCloudFrontがあります。

Client <-> ELB <-> EC2 <-> RDS

以下は検討したけれど、結局使わないこととなったサービスです。

- Elastic Beanstalk
    - 外見は一番Herokuっぽいのですが、インスタンス単位で立ち上がるのでお金がたくさんかかったり、立ち上がるのに非常に時間がかかります
    - ダウンタイム無しのローリングアップデートをしようとしたけれど、設定の調整が面倒
        - AWSの挙動を確かめながら設定するのが非常に面倒でした
- DevOps
    - レシピを追加するのに時間がかかる
    - 元々のレシピの挙動を確認しながら修正を加えるのが面倒
- CloudFormation
    - そもそも必要なかった

### 結局
地道に自分で組んでいって、EC2とChefで環境構築をし、Capistranoでデプロイしていくように組んでいっています
jsからMaxのUI系のオブジェクトの値を直接取得する


たまに、jsから直接MaxのナンバーボックスやマルチスライダーなどのUI系のオブジェクトの値を取りたいと思うことがあります。

ドキュメントやExampleパッチを調べたり、ググったりしてもなかなか見つからなかったので、案外知らない人もいるんじゃないかと思ったので書きます。



Maxobj#getvaluof()
を使えばいけるようです。

こんなパッチのとき、

![main.png](https://qiita-image-store.s3.amazonaws.com/0/32423/3c9e67c3-84de-00b0-2b79-343e79535283.png)

各UIオブジェクトにはインスペクタからScriptingNameを設定しておき、jsにてgetnamedメソッドでMaxobjを取得して使います。

```js
autowatch = 1;


//flonum
var num = null;
//function
var func = null;
//matrix
var mat = null;
//multislider
var mult = null;

function loadbang () {
	num = patcher.getnamed("testnum");
	func = patcher.getnamed("testfunc");
	mat = patcher.getnamed("testmatrix");
	mult = patcher.getnamed("testmult");
}

function getnum () {
	var f = num.getvalueof();
	post(f, "\n");
}

function getfunc() {
	post("function value---------\n");
	var v = func.getvalueof();
	v.forEach(function (el) { post(el, "\n"); });
	post("end-------------------\n");
}

function getmult() {
	post("multislider value---------\n");
	var v = mult.getvalueof();
	post(v, "\n");
	v.forEach(function(el){ post(el, "\n") });
	post("end-------------------\n");
}

function getmatrix() {
	post("matrix value---------\n");
	var v = mat.getvalueof();
	post(v, "\n");
	v.forEach(function(el){ post(el, "\n") });
	post("end-------------------\n");	
}
```

全部のUIオブジェクトで試してないのでなんとも言えませんが、live系も含め主要なUI系のオブジェクトはできると思います。

ただ、やはりブラウザのUIのように、イベントリスナーを登録してUIをいじったタイミングでの値を取得したくなるのですが、そのような方法が今のところ見つからないので、使い勝手的には微妙で、それなら普通に直接インレットに繋げてつかうわ・・という感じです。

一応GitHubにもExampleをアップしておきました。

<a href="https://github.com/okupara/AdventCalendar1211Example" target="_blank">https://github.com/okupara/AdventCalendar1211Example</a>

os10.10.1 Max7.0.1 64bit
os10.10.1 Max6.1.7 32bit
で確認してますが、
自分の環境でしか試したことがないので、何か問題などあればお知らせいただけると・・
【FileMaker】FileMakerで分散開発は可能？

知らんがなってとこですが、他のシステム開発よりも小回りが利く分、分散開発環境は乏しいとしか言いようがないです。。。

大抵のシステム開発では、以下の環境が揃っていて、分散開発が主流です。（というか、当たり前）
・プログラムの履歴（バージョン）管理
・デザインとプログラムの分離
・デバッガー
・共通開発環境の自動製作
・バグや要求管理
・ガントチャートや期日管理を用いたシステム工程管理

では、一つづつ見ていきましょう。

# プログラムの履歴管理 #
他のシステム開発でリソース等を管理して過去のプログラムへのロールバックをする際、履歴管理は重要です。
でも、無いんですよ。FileMaker周りには。
「やってはいけない履歴管理」として他システム開発ではよく言われる「ファイル名＋日付」が慣例的に行われているような気がします。
これ、重要だから本当はFileMakerでもなんとか履歴管理ツールを導入してやっていってほしい。
とはいえ、ユーザが手軽に（といってもきちんとしたシステムを作るにはプロが介在しますが）作れるDBという売りの場合、そういった小難しいことを提案しても

「別に日付で管理してもいいじゃん」

となって、説得するのに骨が折れそうです。

これがあるとどう分散開発に有利になるかというと、バージョンごとに保持することで、新バージョンへの影響を少なくし、旧バージョンの修正を行う人、新バージョンの追加機能を開発する人、のように分担して開発が可能になります。
バージョン管理ツールには大抵ブランチ（一つのバージョンを複数に分けて開発）できたりマージ（修正が済んだバージョンを本流に戻す）ができたりするので、多人数小機能追加を行い、小時間で物が出来上がるようになっています。
FileMakerではデザインとプログラム（スクリプト）が一緒になっているので難しい分があるかもしれませんが、できる限りこういうことができてくると、一人で抱える作業量はだいぶ減るのではないでしょうか？

# デザインとプログラムの分離 #
これはできそうな気がしますが、ちょっと片手落ちな感があります。
例えばWebサイト構築であれば、ページのデザインを作る(html,css,scriptなど)人、その裏側で動く機能を作る人、運用のためのスクリプトを作る人などと作業を分担して行います。
FileMakerではあらかじめ用意されたテーマのデザインがそれなりに使える感じなのでユーザ的にはありがたいですが、FileMakerシステム開発屋さんは独自のテーマを作って提供することが多いです。
ここがちょっと問題。
テーマの分散開発はできますが、ページの統一されたデザインは分散開発できない、というところです。
テーマを入れてもページのサイズは変わりません。
テキストの位置も変わってくれません。
はっきり言ってめんどくさいです。
一つのテーマを入れたらそのまま自動的にレイアウトが固まってくれないでしょうかね〜。

# デバッガー #
一応FileMakerにもあるんです、デバッガー。
でも、デバッグした結果がどこかにリポートされるわけでもなく、単に変なところがあるから追ってみて目でチェックしてOKでした、っという感じになりがちです。
機能的に充実してほしいというところが本音でしょうか。

# 共通開発環境の自動製作 #
これも本当にほしい！
必要なツールはFileMakerだけなので、用意するものなんてないじゃん？と考えるかもしれませんが、例えばスクリプトのそのプロジェクトにあった自動生成機能や他DBへの接続が必要なら、最初に一発ぽちっとボタンを押すだけでその接続を作成してすぐに作業に入れるようにしてほしいわ。
まぁ、この辺も複数人数での開発ではないから必須ではない、と言われるのがオチかもしれませんが、例えば開発会社で共通の開発環境があることで、受注した開発案件で使い回してで間接製造費はトントンに落ち着いてくるのではないでしょうか？

# バグや要求管理 #
これも、整備している開発会社は少ない気がします。
バグや要求管理ツールは、開発言語に関わらずどんなシステム開発でも導入できるので、ぜひとも使ってみてほしいところです。
Excelでもそれなりにやってるよ、と言っても、Excelはそんなにバグ管理しやすいツールなのでしょうか？
一度いつでもどこでもみんなが見れて解決できる管理体制ができれば、これほど楽なことはないのです。

# ガントチャートや期日管理を用いたシステム工程管理 #
バグや要求管理のツールには、大抵ガントチャートや期日管理機能がついています。
Excelで日にちをソートして、、、というのではなく、もっと見やすくみんなが一目見て現在の状況が分かる体制を作ることが大切ですよね。


# 〆るよ #
それぞれの項目においてFileMakerで分散開発が可能かどうかを考えましたが、やっぱりFileMakerでも分散開発したいです。
FileMaker案件を受注してみると、結構大きなボリュームなのですよ。
他のシステム開発ではもっと何千万もするようなプロジェクトで作るよね、というようなのを一人で（実際には仕様を決めたりチェックしたりと複数人いますが）作るのは結構キツイです。

単純に言っちゃえば、FileMakerでバグ管理やガントチャートなんて作れそうなもんなので、作って売ればもしかして売れるのかも、、、と思ってしまいますが、ユーザレベルの方が多いFileMaker界隈でお金を払ってくれる人がいるのかどうかが不安です。。。

だがしかし、これをちゃんと仕事としてやっていくには、やっぱり必要だなーと山場を迎えている今日この頃なのでした。
【JPOUG】Oracleにはかなわないが、ぜひともFileMakerを宣伝させてくれ！

この記事は、[JPOUG Advent Calendar 2014](http://jpoug.doorkeeper.jp/events/17313)の12/12の小窓です。

Oracleから遠ざかって早何年という感じなので、活躍するプロの方々のようなすっごいネタではないです。
ちなみに去年参加した時の記事は[こちら](http://guppylab.sakura.ne.jp/wp/?p=121)。
もうODBCで他DBへの接続を書いてしまったので、このネタは使えません。。。orz

なので、FileMakerがOracleにかなわない点とかなわないけどやっぱりFileMakerを押す理由を書いてみたいと思います。

# かなわない点 #
そんなの、山のようにありますが、、、
Oracleを選択する理由って、それなりに規模が大きくてDBの専門家がいてくれると百人力だからかな。と個人的に思っています。
もちろん、SQLがここまで発展したのはOracleのおかげというのもアリですが、リレーショナルDBで商用とこだわるどこかの人にはOracleを進めておけば難はないと思っています。
そこからすると、カード型DBとしてスタートしたFileMakerですが、今ではリレーショナルDBに引けを取らないくらいリレーションシップがきちんと（？）はれるようになっています。
とはいえ、FileMakerでSQLはほとんどのケースでは不要ですので、FileMaker業界ではSQLを知らない人が結構いたりします。
リレーショナルDBで育ってきた私が最初にFileMaker関連の人と話していてびっくりした「アルアル」感その１でしょうか。

そういったところからすると、かなわない点としてあげる項目は、

**技術者の層の厚さ**

です。
逆に言えばSQLを知らなくてもDBを操作できる優れものですが、そうとは言ってもSQLを使う機会もあるので、あえて言わせていただきました。

あ、あと、DBと画面（Webサイトやシステム画面）が分離しているので、開発が一極集中しなくてもいいところがかなわないかな。

# でもやっぱりFileMakerが好き #
って言えるようになるには何年やればいいのかわかりませんが〜（苦笑）
まだまだ勉強中のFileMakerなので、調べまくって実装してテストしてっていうところから抜け切れていませんが、思った以上にシステム開発が少ないコストで出来上がる充実感はあります。
また、FileMakerは、Oracleなど他DBへの接続もODBC経由でできるので、FileMakerを使い慣れた人からすれば、天下（？）のOracleのデータが手元で扱える、と小躍りする気持ち？
ただこの辺はODBCはFileMakerから派生したものではないのでリレーショナルDBや他言語でのアプリケーション開発を経験した人の方に武があるように思います。

それから、重要なこと。
FileMakerファイル一つあれば開発環境を気にせずいつでもどこでも開発ができるので、働くママ技術者としてはとてもありがたいツールです。
子供が熱を出して寝ている横で仕事、子供が勉強している隣で仕事、子供がプラスチックの刀で殴りかかってきても仕事ができるのは、開発環境が一つしかないFileMakerだからこそだと思います。

# 〆たい #
JPOUGのすっごいメンバーのネタのオンパレードからいきなりこんな小ネタで申し訳ないですが、気持ち的にはもっとOracleもFileMakerもガンガン絡んでいいと思うんです。
Oraclerのみなさん、ぜひとも少ない年内のうちにFileMaker Advanced Version 13（開発環境付き）を手にしてOracleとFileMakerで遊んでみてください。
Boostのirangeの挙動が修正されていた

#irangeとは
"boost irange"で検索しても古い情報しか出てこないので、検索エンジンに引っかかることを期待して、投稿します。

こんな感じで使います。（下のソースコードの出典[boostjp(値の範囲を生成する - irange)](https://sites.google.com/site/boostjp/tips/list#TOC---irange))

```c++:
#include <iostream>
#include <boost/range/irange.hpp>
#include <boost/range/algorithm/for_each.hpp>
void disp(int x) { std::cout << x << std::endl; }
int main()
{
    boost::for_each(boost::irange(1, 10, 2), disp);
}

出力
1
3
5
7
9
```

pythonのrangeに相当するもので、値を増減させるステップ幅を指定できます。

###古いirange
以前のirangeは上のリンクの実行例でもわかるように、出力は

```c++:
1
3
5
7
```

で、9が出力されないダメな奴でした。
(初項と末項の差がステップ幅で割り切れないと変な挙動になる）

###今のirange
今は、ちゃんと想定通りの挙動を示します。上で、ソースコードと一緒に示した通り

```c++:
1
3
5
7
9
```

になります。

#せっかくなので、ベンチマーク
内容は、[Boost.Rangeの速度](http://qiita.com/termoshtt/items/06d8ef500c461c69b6f0)に以下のようなステップ幅が2の関数range2を追加しました。

```c++:
unsigned long range2(unsigned int N) {
  unsigned long sum = 0;
  for (unsigned long i : boost::irange((unsigned int)0, N, 2)) {
    sum += i + 1;
  }
  return sum;
}
```

あと、地味な変更で、

```c++:
const unsigned long N = 10000 * 10000 + 1;
```

初項と末項の差がステップ幅で割り切れないようにしました。

##実行環境
OS : windows 8.1 pro 64bit
CPU: intel i5-4300U@1.9GHz, 2.5GHz
メモリ: 8G
コンパイラ: visual studio 2013
##実行結果
デバッグモード(コンパイルオプション /EHscのみ)

```bash:
native        = sum = 2716213505
515
range         = sum = 2716213505
2703
range2        = sum = 2716213505
1093
range_adapter = sum = 2716213505
6515
```

リリースモード(コンパイルオプション /EHsc /Ox)

```bash:
native        = sum = 2716213505
62
range         = sum = 2716213505
46
range2        = sum = 2716213505
46
range_adapter = sum = 2716213505
93
```

実行結果の出力がおかしい気がしますが、出力された通りです。
sumの値が一致しているので、irange正しく動いています。

また、最適化をかけた場合は、irangeの方が速くなるようです。
rbenv使い方メモメモ

jrubyとrubyを混合で使うことになったので自分用のメモ。
随時更新します。

#環境
- CentOS 6.5
- rbenv 0.4.0-129-g7e0e85b

#メモ

###rbenvのインストール方法(CentOS)
http://qiita.com/youcune/items/a5cc93313641b69b62f8

###rbenvのバージョン確認
```bash
rbenv -v
```

###インストール可能な一覧表示
```bash
rbenv install -l 
```

###インストール
```bash
rbenv install バージョン
```

###アンインストール
```bash
rbenv uninstall バージョン
```

###利用中のrubyバージョン
```bash
rbenv version
```

###インストールされているrubyバージョン一覧
```bash
rbenv versions
```

###デフォルトで利用するバージョン指定
```bash
rbenv global バージョン
```

###実行シェルでのみ利用したいバージョンを指定
```bash
rbenv shell バージョン
```

###カレントディレクトリで利用したいバージョンを指定
```bash
rbenv local バージョン
```

###利用中のrubyを外したい場合
```bash
rbenv local --unset #or system
rbenv shell --unset #or system
rbenv global system #globalはsystemしか指定できないっぽい
```

###利用中のrubyのパス
```bash
rbenv which ruby
```

###利用中のrubyに対応するgem内のコマンドラインツールを利用可能にする
```bash
rbenv rehash
```

###利用しているrubyにおけるgemのインストール先を表示
```bash
gem env
```


#参考URL
ほぼパクリです。ありがとうございます。
http://qiita.com/a_ishidaaa/items/8cc14453289dba1413dd
Swiftのenumで再帰的なデータ型？



Xcode 6.1.1 (6A2008a)
iPhone Simulatorで動作確認しました。

// 追記 12/13
initを利用することで操作時に変数のキャプチャを気にする必要がなくなりました。

// 追記 12/14
ArrayLiteralConvertibleでの初期化を追加

```swift
enum ConsList<T: Printable> {
    case Nil
    case Cons(T, @autoclosure () -> ConsList<T>)
    
    init(_ v: T, _ cons: ConsList<T>) {
        let cons_ = cons // なくても問題なかったが念の為に束縛してみる
        self = .Cons(v, cons_)
    }
}

extension ConsList: ArrayLiteralConvertible {
    typealias Element = T

    init(arrayLiteral elements: Element...) {
        var cons = ConsList.Nil
        for e in reverse(elements) {
            cons = ConsList(e, cons)
        }
        self = cons
    }
}

extension ConsList: Printable {

    var description: String {
        switch self {
        case .Nil:
            return "Nil"
        case .Cons(let v, let cons):
            return v.description + " -> " + cons().description
        }
    }
}

```


```swift:main.swift
let cons = ConsList(1, ConsList("2", ConsList(3.4, .Nil)))
println(cons)

let source: [Int] = [1, 2, 3]
var cons2: ConsList<Int> = .Nil
for s in reverse(source) {
    cons2 = ConsList(s, cons2) //これは取り出し時に無限ループしてしまう -> 追記によりこちらでも問題なくなった
    //let child = cons2
    //cons2 = ConsList.Cons(s, child)
}
println(cons2)


let cons3: ConsList = [1, "2", 3.4]
println(cons3)

//1 -> 2 -> 3.4 -> Nil
//1 -> 2 -> 3 -> Nil
//1 -> 2 -> 3.4 -> Nil
```

---

こちらの投稿を参考にしました。
[Swiftのenumで、再帰的なデータ型は無理だった話し](http://qiita.com/nobkz/items/98255ac7949b93358e70)
vimでヤンクした文字列を別のファイルでペーストしようとすると「E353: Nothing in register *」というエラーが出る

.viminfoのパーミッションがおかしくなってて権限がなかっただけでした
死にたい

ちなみに同一ファイル内であれば.viminfoのヤンク＆ペーストは可能。ヤンクしてファイルを閉じるタイミングで.viminfoに永続化されるんだが、そこで権限なくてエラーってことですね
死にたい
LeapMotionで遊ぶ！

#LeapMotionとは

マウスなどを使用せず、手の動きで入力をすることができるUSB接続型のデバイス。
手の位置、指の本数、手の動き、ジェスチャーによる入力をすることができるものです。

詳しいことは、[公式サイト](https://www.leapmotion.com/?lang=jp)をご覧ください。

#LeapMotionのセッティング
__1.デバイスのセッティング__
LeapMotionのデバイスのセッティングは公式サイトから順を追ってインストールしてもらえれば大丈夫です。LeapMotionのSDKなどは更新があるので、適宜対応してもらえれば良いと思います。
__2.vvvvにおけるセッティング__
vvvvにおけるセッティングは特になにもありません。
以前は、addonpacksに入っていましたが、
最新版では、通常のbeta版の中に入っています。

#Leap関連ノード
__Leap(Device)__
LeapMotionの基本的なデータは、Leap(Device)から取ってくることができます。
Leapノードを出し、__ヘルプパッチ__を見てみましょう(ノードを選択し、__F1__をクリック)
インレットには、__ジェスチャーなどの入力__が、
アウトレットは、__LeapMotion自体から得られるデータ__などがあります。

Gestureノード、後半で解説しますが、手や指のデータ以外にも
ジェスチャーを利用することができます。


![leap_0.JPG](https://qiita-image-store.s3.amazonaws.com/0/37495/3a21d95e-0e6d-5ee9-02e7-53d5c98748ed.jpeg)

#Leap(Device)アウトレット
__1.HandPosition__
手の位置
__2.Hand Direction__
手の平の向き（指をさしている方向）
__3.HandNormal__
手の平の向き（手の平の向いている方向）
Handの二つの値は、サンプルパッチで見ると二本の青い矢印で表示されています。
__4.HandID__
手を感知した回数を記録
__5.FingerPosition__
各々の指の位置
__6.HandDirection__
指先の向いている方向
__7.IsTool__
（わかりませんでした…。）
__8.FingerID__
指を感知した回数を記録
__9.HandSlice__
指の本数文Sliceを作成します
__10.Gesture__
サポートするジェスチャーの出力ができます

![leap_1.JPG](https://qiita-image-store.s3.amazonaws.com/0/37495/a732bb37-8595-e375-2eae-a71635035eff.jpeg)


#Leap(Device)インレット
Enable Circle Gesture、Eneble Swipe Gesture…と続いています。
これは各々の__ジェスチャーノード__を利用するためのスイッチです。
__Helpパッチ__を見てもらうとわかると思うのですが、
それぞれの__GestureをON__にし、条件を設定することで利用できます。

__1.CircleGesture__
円を描く動きを感知
__2.SwipeGesture__
スワイプの動きを感知（指を長目にずらすような…。うまく説明できぬ…。）
__3.KeyTabGesture__
キーボードをタッチするような指の動きを感知
__4.ScreenTabGesture__
…ごめんなさい。挙動がわかんなかったです…。
__5.Reset__
リセット

![Leap_Circle.JPG](https://qiita-image-store.s3.amazonaws.com/0/37495/50810fc6-2b2a-bd47-9ba6-1aacc3fdaadd.jpeg)
![LeapSwipe.JPG](https://qiita-image-store.s3.amazonaws.com/0/37495/c8a263ce-4829-31ad-d2f5-3cc28817b54e.jpeg)
![key_Leap.JPG](https://qiita-image-store.s3.amazonaws.com/0/37495/efc2cca3-b74c-da03-e395-9b030f7c3503.jpeg)

#利用例
以下、自分のブログへのリンクですが、
活用例として参考にしてもらえたらと思います。

[1.LeapMotionを使って座標の入力をする(vvvvlog12リンク)]
(http://junky-inc.blogspot.jp/2014/10/vvvvlog13leapmotiontips1translate.html)
[vvvvlog12.v4p(GitHub)](https://github.com/JunkyInc/Advent_vvvv/blob/master/vvvvlog12.v4p)

[2.カメラの操作をしてみる(vvvvlog13リンク)]
(http://junky-inc.blogspot.jp/2014/10/vvvvlog13leapmotiontips2camera.html)
[vvvvlog13.v4p(GitHub)](https://github.com/JunkyInc/Advent_vvvv/blob/master/vvvvlog13.v4p)

[3.指の本数を数える(vvvvlog14リンク)]
(http://junky-inc.blogspot.jp/2014/10/vvvvlog14leapmotiontips3count.html)
[vvvvlog14.v4p(GitHub)](https://github.com/JunkyInc/Advent_vvvv/blob/master/vvvvlog14.v4p)

LeapMotionにおいては、
Map、AvoidNILノードは是非覚えておいた方がよいと思うので、
GitHubからダウンロードし、参考にしてみてください。



上記のデータを組み合わせることで、
こんな感じの絵も自由に書くことができます！
アイディア次第でいろいろ作ることができると思うので、
参考にしてもらえると幸いです。

![leapSample.JPG](https://qiita-image-store.s3.amazonaws.com/0/37495/cfb1cc70-8e1b-5034-7a0c-a0baaa40bf42.jpeg)




---
新しいデバイスによる身体の拡張は、
ある程度制限のある人でも自由に表現することができるような
そんな世界が目の前にあるような気がしています。

僕は、身体に制限のある人が当たり前に自由に自分を表現できるような環境をつくりたいと思っています。そのために、病院でのデジタルアートによるホスピタルアートを行うために活動を行っています。
もしご興味ありましたら、以下のアートワークの動画をご覧ください。
最後の画像の動いているやつが後半にあります！

[Junky_Inc2014ArtWorks](https://vimeo.com/114021957)


Twitter:Junky_Inc
気軽にリプやDMくださいー！
baserJSでリンク可能エリアを先祖要素まで拡張する


コーポレートサイトにちょうどいいJavaScriptライブラリ **baserJS** の解説記事です。

Webサイトと詳しいAPIリファレンスはこちら [baserJS Webサイト](http://baserproject.github.io/baserjs/)

## ボックス自体にリンクを適応する

HTML4/XHTML1.0などのaタグがブロック要素を内包できないケースなどで、aタグの外側の要素までリンクを反応させるようにします。

### HTML

```html
<div class="box-link"><a href="xxx.yyy.com">リンク</a></div>
```

### JavaScript

```js
$('.box-link').bcBoxLink();
```

上記のJavaScriptを実行すると`.box-link`の領域までリンクエリアが広がります。
Sencha Ext JS 5 のウィジェットカラム

Sencha Advent Calendar 2014 12日目
http://www.adventar.org/calendars/490

## ウィジェットカラムの利用

こんばんはxenophyの菅井です。

Ext JS 5から追加されたウィジェットカラムを利用することによって
グリッドカラムにコンポーネントを簡単に入れられるようになりました。

今回はそのウィジェットカラムにコンポーネントを入れてみて動かしていこうと思います。

## ウィジェットカラムについて

ウィジェットカラムですがはじめからビルトインで
用意されているコンポーネントやウィジェットを指定してあげることによって
以下のようにコンポーネントをカラムに表示することができます。

![widgets](http://goo.gl/YYxtiJ)

今回はコンボボックスをウィジェットカラムの中に入れてみます。

## グリッドの作成

ウィジェットカラムを入れる前にまずは
以下のように通常のカラムのみもったグリッドを作成します。

    Ext.create('Ext.grid.Panel', {
        renderTo: Ext.getBody(),
        title: 'イベント出席',
        width: 600,
        columns: [{
            text: 'ユーザー',
            dataIndex: 'user',
            width: 150
        }, {
            text: '参加状況',
            dataIndex: 'attendCd',
            width: 150
        }],
        store: {
            fields: [{
                name: 'user',
                type: 'string'
            }, {
                name: 'attendCd',
                type: 'int'
            }],
            data: [
                {user: 'user1', attendCd: 0},
                {user: 'user2', attendCd: 0},
                {user: 'user3', attendCd: 1},
                {user: 'user4', attendCd: 2}
            ]
        }
    });

参加状況カラムにステータスを表示させていますが
ここにコンボを入れてステータスの値によって表示が変わるようにします。

![grid](http://goo.gl/HrnY2G)

## ウィジェットカラムの設定

参加状況カラムの設定を下記のように変更します。

    {
        text: '参加状況',
        dataIndex: 'attendCd',
        width: 150
    }

↓
まず`xtype`に'widgetcolumn'の設定を追加します。`xtype`を指定しない場合はデフォルト'gridcolumn'
次に`widget`コンフィグに対してコンポーネント（またはウィジェット）を指定します。
今回はコンボボックスを表示させるので`xtype`に'combobox'を指定してストアやフィールドの設定を行っています。

    {
        text: '参加状況',
        dataIndex: 'attendCd',
        width: 150,
        xtype: 'widgetcolumn',
        widget: {
            xtype: 'combobox',
            store: {
                fields: [{
                    name: 'cd',
                    type: 'int'
                }, {
                    name: 'name',
                    type: 'string'
                }],
                data : [
                    {cd:0, name:'出席'},
                    {cd:1, name:'欠席'},
                    {cd:2, name:'補欠'}
                ]
            },
            valueField: 'cd',
            displayField: 'name',
            queryMode: 'local'
        }
    }

ウィジェットカラムの設定は以上です。
このように'widgetcolumn'の`widget`コンフィグに対して
フォーム上にコンポーネントを配置するくらい簡単に設定できてしまいます。

表示結果は以下になります。

![widgetcolumn](http://goo.gl/u7nruW)

## 最後に

ウィジェットカラムによってグリッド上でコンポーネントやウィジェットを扱うのが楽になり
ウィジェットやコンポーネント自体のカスタマイズも含めて
これまでよりもグリッドの表現や挙動が豊かになっていくと思います。
baserJSでセレクトボックスを装飾する


コーポレートサイトにちょうどいいJavaScriptライブラリ **baserJS** の解説記事です。

Webサイトと詳しいAPIリファレンスはこちら [baserJS Webサイト](http://baserproject.github.io/baserjs/)

## 装飾のための要素を追加する

input要素を装飾する場合、CSSの`appearance: none`などを使用すれば、ある程度の装飾はできますが、ブラウザの対応だったり、痒いところに手が届かなかったり、デザインによっては満足に実装できないケースがあります。

baserJSの`bcSelect`メソッドは、実行するとセレクトボックスに対して、装飾のための要素を追加することができます。

### HTML

```html
<select name="pref" id="pref">
  <option selected>都道府県</option>
  <option value="1">北海道</option>
 . . .
  <option value="47">沖縄県</option>
</select>
```

### JavaScript

```js
$('select').bcSelect();
```

上記のJavaScriptを実行するとHTMLは以下のように変化します。

付加されるクラス名は変更可能です。

```html
<span class="-bc-form-element -bc-wrapper -bc-form-select-wrapper -bc-wrapper--blur">
  <select name="pref" id="pref" class="-bc-element -bc-form-element -bc-form-select -bc-form-element--blur">
    <option selected="">都道府県</option>
    <option value="1">北海道</option>
    . . .
    <option value="47">沖縄県</option>
  </select>
  <label for="pref" class="-bc-form-element -bc-form-element__label -bc-form-select__label -bc-form-element__label--blur">
    <a href="#" class="-bc-form-element -bc-pseudo-select -bc-pseudo-select--blur">
      <span class="-bc-form-element -bc-pseudo-select__selected-display">都道府県</span>
      <ul class="-bc-form-element -bc-pseudo-select__option-list">
        <li class="-bc-form-element -bc-option-list__item -bc-option-list__item--selected" aria-selected="true">都道府県</li>
        <li class="-bc-form-element -bc-option-list__item -bc-option-list__item--unselected" aria-selected="false">北海道</li>
        . . .
        <li class="-bc-form-element -bc-option-list__item -bc-option-list__item--unselected" aria-selected="false">沖縄県</li>
      </ul>
    </a>
  </label>
</span>
```

### 状態変化

要素の一部には自動でイベントが登録され、状態によって変化します。この変化を利用して、CSS側で装飾の変化を記述するとよいでしょう。

#### フォーカス時のクラス
- `-bc-wrapper--blur` ←→ `-bc-wrapper--focus`
- `-bc-form-element--blur` ←→ `-bc-form-element--focus`
- `-bc-form-element__label--blur` ←→ `-bc-form-element__label--focus`
- `-bc-pseudo-select--blur` ←→ `-bc-pseudo-select--focus`

#### 選択時のクラス

- `-bc-option-list__item--unselected` ←→ `-bc-option-list__item--selected`

#### チェック時の属性

- `aria-selected="false"` ←→ `aria-selected="true"`

## サンプル

http://codepen.io/YusukeHirao/pen/wBMjbN
マスタリングTCP/IP OpenFlow編読みました記

12/16 10:09 Extensible Matchについて訂正

この記事は[OUCC Advent Calendar](http://www.adventar.org/calendars/449) の11日目です。
昨日は[@spring_raining](twitter.com/spring_raining) さんの[PCパーツを組み合わせてキミだけの最強録画鯖を作ろう](http://spring-raining.hatenablog.com/entry/2014/12/10/192049)でした。

皆様、おはようございます。くるた([@klta6154](twitter.com/klta6154))と申します。
流れでAdvent Calendarねじ込んだはいいものの書くことがなかったので、今回は研究の絡みで読んだ本の雑感を書こうと思います。
ちなみに書評どころかブログ書くのも実は初めてなので拙筆はご容赦願います。
# 1章 OpenFlow概要
OpenFlowってなんやねん、どこで使うねんって話が書いてあります。
OpenFlowとは(ものすごく雑にまとめて書くと)いわゆるSoftware Defined Networkと呼ばれるソフトウェアによるネットワーク管理を実現するための規格です。
スイッチと、それに引っ付けたProgrammableなコントローラでネットワークフロー全体を管理するのが狙いです。最新のバージョンは1.4となっています。
フロー設定したり、スイッチの情報を取得して流量を確かめたり、パケットのペイロードをチェックしたりといった様々な操作をセキュアチャネルを介したメッセージングによって行うことができます。
コントローラの実装は複数のモダン言語(Python/Ryu,NOXとかRuby/TremaとかJava/Floodlightとか)によるものが公開されているので、自分の好きな言語で遊べます。
また[仕様も公開されている](http://archive.openflow.org/documents/openflow-spec-v1.0.0.pdf)ため、好きな言語での実装がない場合には自分で作ることも可能です。
# 2章 OpenFlow1.0の仕組み
OpenFlowが動作するにあたり、実際にどのような手順、流れで動いているか詳しく書いてあります。
特に2.4節に記載されている、メッセージ一覧は実際にコントローラを書くにあたって参照する頻度が高くなる部分であり、個人的にはこの本で一番お世話になっています。
ここまで本を読んできたけど結局何がしたいのかよく分からんかったという人も、実際にどんなメッセージをやり取りするのか分かればすぐに全体像が理解できると思うので、立ち読み等で購入を検討する際には是非ここを見てみてください。
# 3～6章 OpenFlowユースケース
OpenFlowを用いて実際に既存の機器と同等の機能を持ったスイッチ-コントローラ組の実装例が書いてあります。
LLDPの扱いやL2スイッチといった基礎的なところから、VLANタグを用いた仮想ネットワーク管理、ロードバランサ、L3スイッチ(ルータ)の実装まで幅広く扱っています。
ものすごく具体的に「このフローのMatchテーブルではeth_srcをこの値にして…」とか「packet_inしたら受信したパケットのここの値をこう書き換えて…」とか書いてあるので、OpenFlow開発に慣れるためのドリル的な活用法も期待できそうです。
# 7～9章 バージョンアップに伴う変更点について
OpenFlowは現在もバージョンが更新されていますが、この3章ではバージョンアップごとの変更点が纏められています。
個人的には1.3で追加されたマルチパートフレームワークについてもうちょっと記載が欲しかった気がします。
マルチパートフレームワークは、メッセージのサイズ上限である64kBに収まらない情報を分割して送信するためのもので、主にスイッチが持っている各種情報を取得するために使われます。詳しくは仕様書を読んでください。
# 10章 OpenFlowの留意事項
この手の本には珍しく、OpenFlowでできないことや問題が起きそうな点について列挙されています。
研究や仕事などで使う側からすると非常にありがたみを感じられる章ではないでしょうか。
個人的には特にOpenFlowはデフォルトだとなぜかTCPフラグによるマッチングが実装されないという話が気になりました。
Extensible Match(OpenFlow1.2以降)で対応しないといけないようです
(12/16訂正:普通にどのバージョンでも対応してませんでした。Extensible　Matchはマッチフィールドを可変長で扱えるようにするもので、マッチ条件自体を任意に拡張できるわけではありません)。つらい。
# 11章 OpenFlowのこれから
OpenFlowの今後のロードマップとか、なんかそういう感じの話が書いてあります。
Northbound APIについても触れています。そういえば去年にNECが[こういうの](http://jpn.nec.com/techrep/journal/g13/n02/pdf/130208.pdf)を作ってはったそうですが、こういうのもNorthbound APIに入るんでしょうか。
# まとめ
以上、駆け足で本の内容を紹介したり感想をしゃべっていきました。
拙筆という言葉ではカバーしきれないレベルの雑さだったようにもみえますが、そこはまあ…ご寛恕くださいってことで。
本自体は素晴らしいものだと思いますので、皆さんもお近くの研究室とか図書館とかサークルで蔵書を探してみてはいかがでしょうか。
また、OpenFlowをもっと使ってみたい！って方は[余ったPCで仮想スイッチを作ってもいい](http://ranosgrant.cocolog-nifty.com/blog/2013/02/2-openflow-4b98.html)ですし、[結構安価に物理スイッチを制作することも可能な様子](http://openflow.inthebox.info/)なのでいろいろ試してみるとよいと思います。
ただし、パブリックな場所に導入するときにはちゃんと気を付けましょう。不具合が出ても心中お察しすることしかできませんので。
# 最後に
OUCCでは部員を募集しています。
たとえまともな文章が書けなくても、単位がやばくても、ゼミで一時間炎上しても大丈夫です。
[お待ちしております。](http://oucc.org/joinus.html)

作業BGMはキャンプファイヤーでおなじみ「[燃えろよ燃えろ](https://www.youtube.com/watch?v=RH1ITuFR6PE)」でお送りしました。
明日はすしす([@susisu2413](twitter.com/susisu2413))さんです。
RubyのHash.newにハマった話

RubyのHashは、値をセットしていないkeyの値を取得しようとすると`nil` が返るが、 `Hash.new(x)`を使うことでデフォルト値を任意の値に変更できる。

```rb
a = {}
p a     #=> {}
p a[:x] #=> nil

b = Hash.new(0)
p b     #=> {}
p b[:h] #=> 0
b[:i] += 1
b[:j] += 2
p b     #=> {:i => 1, :j => 2}
```

しかし、デフォルト値を破壊的に変更してしまうと、予測とは違う動きをするので注意しなければいけない。

```rb
x = Hash.new([])
p x  #=> {}
x[:p] << 1
x[:q] << 2
p x  #=> {}        え?????

x[:r] =x[:r] << 3
p x  #=> {:r=>[1, 2, 3]}      ?!?!?!?

x[:s] = x[:s]
p x  #=>  {:r=>[1, 2, 3], :s=>[1, 2, 3]}     !!?!!??!!???
```

Hashのデフォルト値を空にして、特定のkeyにどんどん値を追加していきたい、ということはよくありそうだ。
そういう場合、newのブロックを使い以下のようにするといい。

```rb
h = Hash.new{[]}

h[:x] += [1]
h[:x] += [2]
h[:y] += [3]
h[:y] += [4]

p h  #=> {:x=>[1, 2], :y=>[3, 4]}
```

Arrayオブジェクトを毎回新しく作るのはパフォーマンスがーー！　と思うなら以下のようになるといいのかもしれない。

```rb
h = Hash.new{|hash, key| hash[key] = []}

h[:x] << 10
h[:x] << 20
h[:y] << 30
h[:y] << 40

p h #=> {:x=>[10, 20], :y=>[30, 40]}
```

最初、Rubyのバグか？　と思ったけど、普通に仕様らしい。
ちゃんと読んだことなかったけど、リファレンスに載ってた。

[singleton method Hash.new - Ruby 2.1.0 リファレンスマニュアル](http://docs.ruby-lang.org/ja/2.1.0/method/Hash/s/new.html)
dart:coreを旅する

「Dart Advent Calendar 2014」 12日目は@zukkunが担当します。

今回は、少し基礎に戻ってみて、dart:coreのAPIを眺めてみます。その中で気になったものや紹介したいものをチョイスして解説していきます。

## dart:coreとは

- [dart:core API Docs](https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:core)

Dartの標準ライブラリの1つで、言語機能の中核となるような機能を提供します。

標準ライブラリは「dart:○○」という形の名称になっており、通常`import "dart:○○;"`という形で読み込む必要があるのですが、dart:coreは`import`しなくても使えるものになっています。

## identical関数

> bool identical(Object a, Object b)

オブジェクトが同一かどうか調べます。

```dart
class Hoge {}

main() {
  Hoge hoge1 = new Hoge();
  Hoge hoge2 = new Hoge();
  Hoge hoge3 = hoge1;

  print(identical(hoge1, hoge2));
  print(identical(hoge1, hoge3));
}
```

```text:結果
false
true
```

## identityHashCode関数

> int identityHashCode(Object object)

オブジェクトのハッシュ値を返します。

```dart
class Hoge {}

main() {
  Hoge hoge = new Hoge();
  print(identityHashCode(hoge));
}
```

```text:結果
991528256
```

なんかに使えると思います。

## DateTimeクラス

- [dart:core.DateTime API Docs](https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:core.DateTime)

日時を扱います。

```dart
main() {
  print(new DateTime.now());
  print(new DateTime(2014, 12, 25));
}
```

```text:結果
2014-12-12 00:22:22.797
2014-12-25 00:00:00.000
```

## Durationクラス

- [dart:core.Duration API Docs](https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:core.Duration)

時間の長さを扱います。

```dart
main() {
  DateTime christmas = new DateTime(2014, 12, 25);
  DateTime now = new DateTime.now();
  Duration difference = christmas.difference(now);

  print('クリスマスまで、あと${difference.inDays}日');
}
```

```text:結果
クリスマスまで、あと12日
```

## List< E >抽象クラス

- [dart:core.List API Docs](https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:core.List)

リストを扱います。

```dart
main() {
  List<int> list = new List<int>.generate(10, (index) => index);
  List<int> even = list.where((value) => value % 2 == 0).toList();
  print(list);
  print(even);
}
```

```text:結果
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 2, 4, 6, 8]
```

リテラルとして`[1, 2, 3]`と書くと、Listオブジェクトとして扱えます。

## Stopwatchクラス

- [dart:core.Stopwatch API Docs](https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:core.Stopwatch)

時間を測ることができます。

```dart
main() {
  Stopwatch stopwatch = new Stopwatch()..start();
  stopwatch.stop();
  Duration elapsed = stopwatch.elapsed;
  print(elapsed.inMicroseconds); // stopwatch.elapsedMicrosecondsでも良い
}
```

```text:結果
455
```

## Stringクラス

- [dart:core.String API Docs](https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:core.String)

文字列を扱います。

```dart
main() {
  // "○○"はStringオブジェクトとして扱える
  // Stringクラスの*演算子を使用
  print("hoge" * 5);
}
```

```text:結果
hogehogehogehogehoge
```

## まとめ

他にも色々な機能や、紹介したクラスでも紹介していない様々なメソッドがあります。

これからも酒のつまみにリファレンスのぶらり旅をしていこうと思います。

明日は@ntaooさんです！