OmniAICreator/Qiita-1.07M huggingface dataset:
VagrantでVirtualBox VMsのグループを設定する


Vagrantfileで以下の記述をするだけ

```
  config.vm.provider :virtualbox do |vb|
    vb.name = "node1.elasticsearch"
    vb.customize [
        "modifyvm", :id,
        "--groups", "/MyProject"
    ]
  end
```

ただし、いったん `$HOME/VirtualBox VMs` に `vb.name` とかで指定した名前でVMイメージが作成されるので、同じ名前のイメージが既に存在していたりするとエラーが発生して vagrant up できないので注意が必要です。
CoreOSのAMI、PVとHVMどっち選べばいいんだ

CorOSのサイトでAWSにいれるイメージを選んでいるんだけど、PVとHVMの仮想化技術を
どちらを選択すればいいかがわからん

https://coreos.com/docs/running-coreos/cloud-providers/ec2/
JSONで 'aws:URL' なプロパティを取得する方法


属性にnamespaceが含まれているXMLをJSONへ変換すると、コロンが含まれることが、ごく稀に、だが確かに、ある。

```
<LargeImage aws:URL="http://ecx.images-amazon.com/images/I/51OpI3KwrEL.jpg" />
```

```
{
	"LargeImage": {
		"aws:URL": "http://ecx.images-amazon.com/images/I/51OpI3KwrEL.jpg"
	}
}
```

javascriptでプロパティにアクセスするには、`LargeImage['aws:URL']` でイケる。
JsonPathを使う場合はこんな感じ。

```
  JsonPath.compile("$.LargeImage['aws:URL']");
```

奥が深い。
気楽にbrew cask edit java7して発生するようになってしまったupdateエラーを解決する


`brew cask install java7`的に`jdk-7u51`をインストールしようとしたら、pkgファイルの指定が間違えていて失敗した。
気楽に`brew cask edit java7`でrbファイルを修正したんだけど、その後、`brew update`で残念なエラーが出てしまい困ったので、その解決方法をメモ。

```
$ brew update
error: Your local changes to the following files would be overwritten by merge:
	Casks/java7.rb
Please, commit your changes or stash them before you can merge.
Aborting
Error: Failed to update tap: caskroom/versions
```

```
$ cd /usr/local/Library/Taps/caskroom/homebrew-versions
$ git status
On branch master
Your branch is behind 'origin/master' by 94 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   Casks/java7.rb

no changes added to commit (use "git add" and/or "git commit -a")
$ git checkout Casks/java7.rb 
$ git status
On branch master
Your branch is behind 'origin/master' by 94 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

nothing to commit, working directory clean
```

ようやく復活。。。
jqでREST APIの結果を整形する


以下のデータをExcelで扱いやすいようにCSVライクに抽出する。

```
$ head parent_product_groups.json 
{"rows":[
{"key":["Apparel","B00062WSNO"],"value":6},
{"key":["Apparel","B000BKP2E8"],"value":3},
{"key":["Apparel","B000BRCYT2"],"value":1},
{"key":["Apparel","B000BRGWYK"],"value":3},
{"key":["Apparel","B000BRGY0W"],"value":2},
{"key":["Apparel","B000BRH0CS"],"value":5},
{"key":["Apparel","B000BRJYGI"],"value":1},
{"key":["Apparel","B000BRK3T0"],"value":1},
{"key":["Apparel","B000BRKSL8"],"value":1},

```

rows配列の要素を全て抜き出して・・・

```
$ cat parent_product_groups.json | jq -c '.rows[]' | head
{"value":6,"key":["Apparel","B00062WSNO"]}
{"value":3,"key":["Apparel","B000BKP2E8"]}
{"value":1,"key":["Apparel","B000BRCYT2"]}
{"value":3,"key":["Apparel","B000BRGWYK"]}
{"value":2,"key":["Apparel","B000BRGY0W"]}
{"value":5,"key":["Apparel","B000BRH0CS"]}
{"value":1,"key":["Apparel","B000BRJYGI"]}
{"value":1,"key":["Apparel","B000BRK3T0"]}
{"value":1,"key":["Apparel","B000BRKSL8"]}
{"value":1,"key":["Apparel","B000BRLD58"]}
```

邪魔なkeyとvalueを削除。

```
$ cat parent_product_groups.json | jq -c '.rows[] | .key[], .value' | head
"Apparel"
"B00062WSNO"
6
"Apparel"
"B000BKP2E8"
3
"Apparel"
"B000BRCYT2"
1

```

CSVっぽくしたいので、keyとvalueの値をひとつの配列にする。

```
$ cat parent_product_groups.json | jq -c '.rows[] | [.key[], .value]'
["Apparel","B00062WSNO",6]
["Apparel","B000BKP2E8",3]
["Apparel","B000BRCYT2",1]
["Apparel","B000BRGWYK",3]
["Apparel","B000BRGY0W",2]
["Apparel","B000BRH0CS",5]
["Apparel","B000BRJYGI",1]
["Apparel","B000BRK3T0",1]
["Apparel","B000BRKSL8",1]
["Apparel","B000BRLD58",1]
```

`tr -d "[]" `で配列の括弧を除去すれば完成。
Elasticsearch Mapping 備忘

ElasticsearchのMappingは、RDBでいうIndexみたいなもの。データ型を定義することで、分かち書きや、Kibanaでの表示を制御できる。

## mapping作成

@timestampがあると、Kibanaのhistgramとか表示できる。formatはfieldの形式に合わせて変える。

```
curl -XPUT {elasticsearchのIP}:{elasticsearchのport}/{index} -d '{"mappings":{"{type}":{"properties":{"hoge":{"type":"string"},"@timestamp":{"type":"date","format":"YYYY-MM-dd HH:mm:ss"}}}}}'
```

## mapping確認

```
curl -XGET {elasticsearchのIP}:{elasticsearchのport}/{index}/{type}/_mapping
```

※ {elasticsearchのIP}, {elasticsearchのport}, {index}, {type}は環境に合わせて書きかえる。
Raspberry PiにOSを入れる手順(Mac編)

社内で電子工作が流行っており、自分も欲しくなったので買ってみました。
##Raspberry Piってなんぞや
なんか美味しそうな名前ですが、食べ物ではありません。
Raspberry Piとは、手のひらに収まるサイズの小型PCボードです。
EthernetやUSB、SDカードリーダーは標準装備しており、ブレッドボードや専用のカメラとの接続も可能と夢広がるプロダクトです。
コンピューターなので、もちろんOSも入れることが出来ます。
今回は、そのOSの入れ方について記したいと思います。

![ラズパイ１.jpg](https://qiita-image-store.s3.amazonaws.com/0/39342/d9d80382-5aa5-ef1a-469d-3131933e8961.jpeg "ラズパイ１.jpg")
(専用ケースに格納されているRaspberry Pi)

##初期設定をするのに必要なもの
####・Raspberry Pi
####・HDMI入力またはコンポジットビデオ入力に対応したテレビかモニタ
####・HDMIケーブルまたはコンポジットビデオケーブル
Raspberry Piと、テレビやモニターをつなぐために必要です。
####・SD カード（4GB Class 4以上）
OSをインストールする際に使用します。
####・USBキーボードとマウス
標準的なUSBキーボードとマウスなら、どれでも使えます。
####・イーサネットケーブル
標準的なものなら、どれでも使えます。このケーブルはネットワークやインターネットへの接続に使うだけなので、必要がなければ用意せずともかまいません。
####・microUSB電源
現在のスマートフォン充電器は、ほとんどが5Vで700mAを供給できますが、すべてがそうではありません。充電器の底面を見て、文字部分を探してください。出力値が記載されているはずです。700mA以上であれば大丈夫でしょう（700mAではなく、0.7Aと書かれていることもあります）。品質の低い充電器は使わないようにしてください。問題が生じるかもしれません。

##OSをいれよう
今回私は、[Raspbian](http://www.raspberrypi.org/downloads/)という専用のOSをいれました。
####1.まず[Raspbian](http://www.raspberrypi.org/downloads/)の最新バージョンをダウンロード
ダウンロードしたら中にある.imgファイルを解凍してください。
####2.[RPi-sd card builder](http://alltheware.wordpress.com/2012/12/11/easiest-way-sd-card-setup/)をダウンロード
SDカードにRaspbianをインスールする際に使用します。
####3.RPi-sd card builderを起動し、さきほどダウンロードした.imgファイルを選択
基本的にはアプリの指示通りに行えば問題なくSDカードにOSがインストールされます。
強いて言うなら、最後FinderからSDカードの表示が消えたのを確認してから抜いてください。
####4.最後にRaspbianが入っているSDカードをRaspberry Piに挿入

##初期設定方法
####1.Raspberry Piに周辺機器を接続
モニター・MicroUSB電源ケーブル、キーボードを接続します。自動で電源が入って起動するかと思います。
####2.初期設定画面が表示されるので、自分の環境に合った設定をして終了！

##最後に
Raspberry Piがどのように使われているのかをまとめたリンクを貼っておきまます！
夢広がる！
[【ﾗｽﾞﾊﾟｲ】海外のおもしろRaspberry pi作品集](http://azwoo.hatenablog.com/entry/2014/02/13/232525)
nitrous.ioでbetter_errorsを使う

## 導入
better_errorsを入れると、エラー画面をいい感じにしてくれるらしい。
導入方法は

```ruby:Gemfile
group :development do
  gem "better_errors"
end
```

これだけ。

## 現象
やってみたら、エラー画面変わらん！何でや！

## 原因
READMEちゃんと読もう。
>NOTE: It is critical you put better_errors in the development section. Do NOT run better_errors in production, or on Internet facing hosts.

Internet facing hosts.
nitrous.ioで開発しているのが原因でした。

## 解決方法

```rb:config/environments/development.rb
BetterErrors::Middleware.allow_ip! ENV['TRUSTED_IP'] if ENV['TRUSTED_IP']
```

を追記して

```
TRUSTED_IP=xxx.xxx.xxx.xxx rails s
```
で起動。

IPアドレスは[アクセス情報【使用中のIPアドレス確認】](http://www.cman.jp/network/support/go_access.cgi)などで確認します。
（ipconfig/ifconfigではプライベートIPアドレスしか分からない可能性あり）

これで見れるようになりました。めでたし。
EC2作成スクリプトのHVM対応

[【AWS発表】バースト可能な性能を持つ新しい低コストEC2インスタンス](http://aws.typepad.com/aws_japan/2014/07/low-cost-burstable-ec2-instances.html)が発表され、よしt1.microをt2.microに切り替えよう！と思ったら、Change Instance Typeで選べない。

> T2インスタンスは、基本となるCPUから可能な限り最高の性能を得るために、Hardware Virtualization (HVM)を使用していますので、HVM AMIを使う必要があります。

とあるように、以前のPV(ParaVirtual)形式のものとはAMIの形式が違うので変更はできないようです。
ManagementConsoleのデフォルトAMIもいつのまにか新しい、HVM形式のものになっていました。

移行はまぁまぁ面倒そうなので、Amazon Linuxのインスタンス作成スクリプトを新しいAMIに対応するように修正してインスタンスを作りなおしました。
AMIのID以外に、ブロックデバイスをsdaからxvdaに変える必要がありました。

```ruby:PVのころ
ec2 = AWS::EC2.new

instance = ec2.instances.create(
  image_id:        'ami-c9562fc8', # Amazon Linux x86_64 PV
  instance_type:   instance_type,
  key_name:        key_name,
  security_group_ids: security_group_ids,
  block_device_mappings: [
    {
      device_name: '/dev/sda1',
      ebs: { volume_size: 30 }
    }
  ]
)
```


```ruby:HVMに切り替え
ec2 = AWS::EC2.new

instance = ec2.instances.create(
  image_id:        'ami-29dc9228', # Amazon Linux x86_64 HVM
  instance_type:   instance_type,
  key_name:        key_name,
  security_group_ids: security_group_ids,
  block_device_mappings: [
    {
      device_name: '/dev/xvda',
      ebs: { volume_size: 30 }
    }
  ]
)
```
ラズベリーパイでラジコン

お盆休みにラズベリーパイでラジコンに挑戦してみた。

まずは部品調達のため、秋葉原でおなじみの千石電商へ

買ってきた部品
![IMG_0062.jpg](https://qiita-image-store.s3.amazonaws.com/0/52867/24176039-ea54-462d-6fec-9c3cfbc02fcf.jpeg)


とりあえず、モータードライバを利用して簡単に動作確認
![IMG_0063.jpg](https://qiita-image-store.s3.amazonaws.com/0/52867/69e65374-e538-7974-b96c-f003e4d5378b.jpeg)

ラズベリーパイと接続
![IMG_0065.jpg](https://qiita-image-store.s3.amazonaws.com/0/52867/a990d9b9-913a-6124-d2d9-a344c3c5d957.jpeg)

とりあえず動作確認完了！
動作確認したプログラムは、WiringPiを使いました。

■wiringPiインストール

```shell-session
pi@raspberrypi ~ $ git clone git://git.drogon.net/wiringPi

pi@raspberrypi ~ $ cd wiringPi
pi@raspberrypi ~/wiringPi $ ./build
``` 
ビルドが完了したら以下のコマンドでインストールの確認

```shell-session
pi@raspberrypi ~ $ gpio -v
gpio version: 2.13
Copyright (c) 2012-2013 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

This Raspberry Pi is a revision 2 board.
````

実験にGPIO 18 を操作します。
まずGPIO18ピンを出力モードに設定します

```shell-session
pi@raspberrypi ~ $ gpio -g mode 18 out
```


次にGPIO18ピンをHighにします。

```shell-session
pi@raspberrypi ~ $  gpio -g write 18 1
```

次にGPIO18ピンの状態確認します。

```shell-session
pi@raspberrypi ~ $ gpio -g read 18
1
```

wiringPiで簡単にモータが動作させることが可能です。



このあといろいろ試行錯誤して結局ステアリング周りがうまくできなかったので、ディアルモータでキャタピラ化（笑）
![IMG_0072.jpg](https://qiita-image-store.s3.amazonaws.com/0/52867/881f4441-d59d-0903-2744-9cef07d9c305.jpeg)

最終的には、カメラモジュールを使用して、ONLINEでの操作、動画配信可能になりました。

WEBプログラムの詳細は、また別途
Elasticsearch + Kibana with Nginx 構築備忘

手順忘れるので。時間できたらansibleのplaybookにしようかなー。dockerにあったのは設定よくわかんなかった。

# セットアップ

## elasticserach

ダウンロード

```
# wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.3.2.tar.gz
# tar zxf elasticsearch-1.3.2.tar.gz
# mv elasticsearch-1.3.2 /opt/elasticsearch
```

設定。とりあえずこれだけでもOK。

```
# vim /opt/elasticsearch/config/elasticsearch.yml

index.number_of_replicas: 0
index.number_of_shards: 1
path.data: /data
path.logs: /var/log/elasticsearch/logs
```

起動

```
/opt/elasticsearch/bin/elasticsearch -d
```

## Kibana

ダウンロード

```
# wget https://download.elasticsearch.org/kibana/kibana/kibana-3.1.0.tar.gz
# tar zxf kibana-3.1.0.tar.gz
# mv kibana-3.1.0 /opt/kibana
```

設定を編集


```
vim /opt/kibana/config.js

elasticsearch: "http://{elasticsearchのIP}:{elasticsearchのport}",
```

## nginx

※この後行うnginxのmakeでエラーになったら、以下が必要(環境による)。事前にyum list等で確認しておくといいかも。

```
# yum -y install pcre-devel
# yum -y install gd-devel
```

ダウンロードとインストール

```
# wget http://nginx.org/download/nginx-1.5.10.tar.gz
# tar zxf nginx-1.5.10.tar.gz
# cd nginx-1.5.10
# ./configure
# make
# make install
```

設定。serverディレクレィブを書き換える。

```
  server {
    listen *:80;
    server_name localhost;
    access_log /var/log/nginx/access.log;

    location / {
      root /opt/kibana/;
      index index.html index.htm;
    }
  }

```

起動

```
# /usr/local/nginx/sbin/nginx
```

# アクセス

以下にアクセスでKibanaのトップページが見れるはず。

```
http://{nginxのIP}:{nginxのport}
```

うまく表示されない場合は、chromeのconsole等でエラー出て無いか見るといいかも。
Ansibleで管理するために一手間必要なディストリビューション

Ansibleはpython2系が必要。ただしPython2.4ではモジュールが足りなくて動かない。

# インストール直後ではAnsibleで管理できないサーバ

* ArchLinux
  * `pacman -Sy python2`
* CentOS5系
  * `yum install python-simplejson`
* Debian4など
  * pythonが古すぎるので[pythonbrew](https://github.com/utahta/pythonbrew)を使う。


# pythonbrew

## pythonbrewをインストール

[pythonbrew 1.3.5 : Python Package Index](https://pypi.python.org/pypi/pythonbrew/)を参考にpythonbrewをインストール

## python2.7.3をインストール

```bash:
pythonbrew list -k
pythonbrew install 2.7.3
pythonbrew use 2.7.3
sudo ln -s `which python` /usr/local/bin/python2.7.3
```

Debian4だとmercurialがインストールされているためにビルドに失敗した。

> $ pythonbrew install 2.7.3
> Use the previously fetched /home/owner/.pythonbrew/dists/Python-2.7.3.tgz
> Extracting Python-2.7.3.tgz into /home/owner/.pythonbrew/build/Python-2.7.3
> 
> This could take a while. You can run the following command on another shell to track the status:
>   tail -f "/home/owner/.pythonbrew/log/build.log"
> 
> Patching Python-2.7.3
> Installing Python-2.7.3 into /home/owner/.pythonbrew/pythons/Python-2.7.3
> ERROR: Failed to install Python-2.7.3. See /home/owner/.pythonbrew/log/build.log to see why.

  * `dpkg --purge mercurial`して再度`pythonbrew install 2.7.3`すると成功した。

# ansibleのhostsファイルでpythonのバージョン指定

```bash:hosts
[servers]
archlinux-server ansible_python_interpreter=python2
debian4-server ansible_python_interpreter=python2.7.3
centos5-server
```
AWSメモ


Amazon EC2(Linux)システム管理で知らないとハマる5つの環境設定
http://dev.classmethod.jp/cloud/five-confs-of-ec2-linux-sysops/

「AWS Summit Tokyo 2014」開催レポート動画・資料一覧
http://aws.amazon.com/jp/summit2014-report/details/

aws料金見積り
http://calculator.s3.amazonaws.com/index.html
Macの環境設定(2) Homebrewを設定する


## はじめに
[前回](http://qiita.com/nenokido2000/items/0b11b43a5c6702ab775d)の続きです。
前回はJava周りの設定でしたが、今回はHomebrewの設定と、Homebrewを使用してインストールしたものについて記載してみます。

## Homebrew
Macのパッケージ管理システム。
yumみたいなもんだと思っておけばよいのでしょうか。
前提として、

* JREが入っていること
* Xcode Command Line Toolsが入っていること

が必要になります。
Javaについては前回インストールしているので、Xcode Command Line Toolsからインストールしていきます。
### Xcode Command Line Toolsのインストール
1. [AppStore](https://itunes.apple.com/jp/app/xcode/id497799835?mt=12)から本体をDL・インストールします。
2. ターミナルから、以下を実行します。

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

### Homebrewのインストール
[公式サイト](http://brew.sh/)に書いてあるとおりに、ターミナルから以下を実行します。

```
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
```
これだけでインストールされます。

ターミナルから以下を実行し、問題がないかチェックします。

```
brew doctor
```

「Your system is ready to brew」と表示されれば問題なしとなります。
初回にやった時は警告出なかったのですが、後日再実行したら以下のような警告が出ました。

```
Warning: Your Homebrew is outdated.
You haven't updated for at least 24 hours, this is a long time in brewland!
To update Homebrew, run `brew update`.
```

お告げの通り

```
brew update
```

でHomebrewをアップデートすることで解消しました。
他にも色々警告出ることはあるみたいですが、現状はぶち当たっていないので解消方法はよく知りません。

## パッケージをインストールする
当面使いそうなものを入れてみます。
基本は`brew install パッケージ名`をターミナルから実行するだけです。

### PATHの調整
後述するgitなどがそうですが、Mavericksにインストールされているがバージョンが最新ではないものがあります。
brew installすれば最新のものがインストールされますが、そもそもインストールされていたものが優先的に使われてしまうため、PATHを調整しておきましょう。

Homebrewでインストールしたものは`/usr/local/bin`に配置されます。こちらを優先的に見るように`/etc/paths`を編集します。
上から順に優先されるため、以下のように編集しておけばよろしいかと思います。

``` :/etc/paths
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin

```

### gitインストール
`brew install git`でインストールします。

### nodeインストール
`brew install node`でインストールします。
npmもインストールされます。

### mavenインストール
`brew install maven`でインストールされます。
インストール後にmvnコマンドを叩くと、

```
Error: JAVA_HOME is not defined correctly.
  We cannot execute /usr/libexec/java_home/bin/java
```

なんて怒られたりするので、JAVA_HOME変数を.bashrc等に設定しておきましょう。

```
export JAVA_HOME=`/usr/libexec/java_home`
```

## 次回に続く
HomebrewとHomebrewを使用してインストールしたものについて記載してみました。
今日はもう眠くなってきたので、他の設定についてはまた次回書きます。
※ 思いのほか書くことが多いので、地道にやっていこうと思います。

## 参考
以下を参考にさせていただきました。
ありがとうございました。
* [パッケージ管理システム Homebrew](http://qiita.com/b4b4r07/items/6efebc2f3d1cbbd393fc)
Hubot | 自作Script |  Hubot で 「今日は何の日」API の結果を取得する

# Hubot | 自作Script |  Hubot で 「今日は何の日」API の結果を取得する

## 概要
Hubot で 「今日は何の日」API の結果を取得します

## 機能
* MMDD で日時を指定できる
* dekigoto / tanjyoubi / imibi / kinenbi を指定可能（キー名は 「今日は何の日」API のキー名のまま）
* 結果のリストからランダムで一件取得する
* WikipediaのURLを表示する

## 正規表現

~~~
/daytopic (\d{4}){1} (.*)$/i
~~~

## ソースコード

~~~coffee:daytopic.coffee
# Description
#   Output daytopic
#
# Dependencies:
#   None
#
# Configuration:
#   None
#
# Commands:
#   hubot daytopic <MMDD> dekigoto... - Output daytopic dekigoto
#   hubot daytopic <MMDD> tanjyoubi... - Output daytopic tanjyoubi
#   hubot daytopic <MMDD> imibi... - Output daytopic imibi
#   hubot daytopic <MMDD> kinenbi... - Output daytopic kinenbi
xml2js = require('xml2js')
parseXML = xml2js.parseString
module.exports = (robot) ->
  robot.respond /daytopic (\d{4}){1} (.*)$/i, (msg) ->
    month_day = msg.match[1]
    category = msg.match[2]
    if (['dekigoto', 'tanjyoubi', 'imibi', 'kinenbi'].indexOf(category) < 0)
        category = 'dekigoto'

    robot.http("http://www.mizunotomoaki.com/wikipedia_daytopic/api.cgi/#{month_day}")
      .get() (err, res, body) ->
        parseXML body, (err, xml) ->
          title = xml.feed.title
          wikipedia = xml.feed.wikipedia
          items = xml.feed[category][0].item
          item = msg.random(items)
          msg.send "title = #{title}"
          msg.send "#{category} = #{item}"
          msg.send wikipedia
~~~

## 出力

### shell adapter で確認

~~~bash
Hubot> hubot daytopic 0101 dekigoto
title = 1月1日
Hubot> dekigoto = 1806年 - バイエルン大公国がバイエルン王国、ヴュルテンベルク公 国がヴュルテンベルク王国となる。
Hubot> http://ja.wikipedia.org/wiki/1%E6%9C%881%E6%97%A5
Hubot> hubot daytopic 0101 dekigoto
title = 1月1日
Hubot> dekigoto = 1700年 - ロシアがユリウス暦へと切り替わる。
Hubot> http://ja.wikipedia.org/wiki/1%E6%9C%881%E6%97%A5
Hubot> hubot daytopic 0101 tanjyoubi
title = 1月1日
Hubot> tanjyoubi = 1971年 - 草場道輝、漫画家
Hubot> http://ja.wikipedia.org/wiki/1%E6%9C%881%E6%97%A5
Hubot> hubot daytopic 0101 imibi
title = 1月1日
Hubot> imibi = 1881年 - ルイ・オーギュスト・ブランキ、社会主義革命家
Hubot> http://ja.wikipedia.org/wiki/1%E6%9C%881%E6%97%A5
Hubot> hubot daytopic 0101 kinenbi
title = 1月1日
Hubot> kinenbi = 四方拝
Hubot> http://ja.wikipedia.org/wiki/1%E6%9C%881%E6%97%A5
~~~

### kandan adapter で確認

![daytopic.png](https://qiita-image-store.s3.amazonaws.com/0/43480/3be61b99-8fe4-f7dd-3ce6-de0ddf7eb074.png)
Rails4のforce_sslでELBからのヘルスチェックを除外する

AWSを使っていて

* ELBでSSL Terminationを行い、APPサーバはHTTPアクセスのみ
* サイトは基本SSLで、HTTPアクセスはforce_sslでHTTPSにリダイレクト
* ELBのヘルスチェックではRailsの稼働まで確認したい

という時に、ELBのヘルスチェックまでforce_sslでHTTPSにリダイレクトされると困る。

Rails3の時はssl_optionsのexcludeで対応してたんですが、

```ruby:config/environments/production.rb
  config.force_ssl = true
  config.ssl_options = { exclude: proc { |env| !env['HTTP_X_FORWARDED_FOR'] } }
```

Rails4だとこのオプションが効かなくなっていたので、対応方法をメモ。
基本的にはconfigではなく、controllerのforce_sslメソッドを使ってifオプションでELBからのヘルスチェックを除外する。

### その1. HTTP_X_FORWARDED_FORを見る

ELB経由のアクセスの場合はHTTP_X_FORWARDED_FORヘッダが付与されるので、それがない場合はELBからのヘルスチェックだと見なす

```ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  force_ssl if: :use_ssl?

  def use_ssl?
    Rails.env.production? && request.env['HTTP_X_FORWARDED_FOR'].present?
  end
end
```

### その2. ヘルスチェック用のコントローラを作る

ヘルスチェック用のコントローラを作り、そこだけHTTPでもアクセスできるようにする

```ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  force_ssl if: :use_ssl?

  def use_ssl?
    Rails.env.production?
  end
end
```

```ruby:app/controllers/healthcheck_controller.rb
class HealthcheckController < ApplicationController
  def index
    render text: 'Healthy!'
  end

  def use_ssl?
    false
  end
end
```
最近のLinuxの不自然にでかいフォントをなんとかする方法

# 最近のLinuxの不自然にでかいフォントをなんとかする方法
技術メモ
発症機：Fedora 20/19, CentOS/RHEL 6.5/5.10

## 検証：VMware，Fedora20
FedoraでWindowsライク仕様の夢をみたので…

## すごく、…大きいです

Fedoraさんに育てられたので、UbuntuとかVineとか浮気したけど本妻はFedoraなんだからねっ！
というわけで、X Window Systemのフォントがやたら大きいのでWindowsと同じおおきさに矯正したい…
調べたらdpiを調節したらいいらしい。

xdpyinfoというコマンドで調べられるらしいが、100という異常な値。
結果、75に落ち着いた。コマンドでは、startx --dpi 75 とすればいいらしい… 


## 設定：/etc/X11/Xresources

startx --dpi 75 とするのはランレベルいじっている輩なので普通にGUIで入る場合は設定ファイルをルートでviします。

```bash:

! This is the global resources file that is loaded when
! all users log in, as well as for the login screen

! Fix the Xft dpi to 96; this prevents tiny fonts
! or HUGE fonts depending on the screen size.
Xft.dpi: 75

! hintstyle: medium means that (for Postscript fonts) we
! position the stems for maximum constrast and consistency
! but do not force the stems to integral widths. hintnone,
! hintslight, and hintfull are the other possibilities.
Xft.hintstyle: hintmedium
Xft.hinting: true


```

フォントがWindowsと同じサイズになったっ！
ヒャッハーッ！！

ていう夢をみたんだ(´・ω・｀)ｼｮﾎﾞｰﾝ
テンプレートエンジンの役割に関する個人的考察

# テンプレートエンジンの役割に関する個人的考察

* YAPCの季節にふと思い出したので書いてみようと思って、やめとこってなったけど書いてみる

## この記事の例外に関して

* この項目で書く事柄は(ここ数年で話題に上がりがちな)MVVCは対象としません
 * (あくまで個人的な意見ですが)MVVCはユーザアクションに対する(非同期な)作用を伴うものです

## なぜ、テンプレートエンジンを使うのか？

* 表示に関わるロジックをモデルに関わるロジックと分離したい
 * いわゆる、ロジックとデザインの分離

## しないとどうなるの？

* サーバサイドのコード上にHTMLタグがたくさん出現します

## よくないことなの？

* 別によくないとは言いません
 * 書いたコードのあるべき責任と所在を決めるのはあなた次第です
 * HTMLタグが出現するコードはクソという尺度を持つクラスタがいるので注意して下さい
 * そもそもマルチバイトな文字列がサーバサイドのコードに存在することに拒絶反応を示すクラスタがいたりするので注意して下さい

## これはあくまでも個人的な考察です

* (例えばHTMLを吐き出す)テンプレートエンジンはORMの不遇さと比較し、大多数のエンジニアから歓迎されている様に見受けられます
 * それはテンプレートエンジンが果たすべき役割とそれに見合う効果を期待してのことです
 * 効果とは(自分が知っている限り)いかなる言語においても設定すべき定数であったり、多数出現するマルチバイトな文字列からの解放です
  * 共通化というと聞こえはいいが、大体においてはインクルードされるだけです
  * 故にほぼ全てのテンプレートエンジンにインクルード命令があるのだと思います

## なぜテンプレートエンジンを使うか？という最初の欲求に関して

* テンプレートエンジンも多大なロジックを伴います
* ここで言う多大なロジックとはあくまでも、あくまでも表示に関わる切り替えです
 * 大事なことなので2度あくま君を言いました
* 表示に関わる切り替えとは何か？
 * いわゆる活性/非活性といったものが代表に挙げられるでしょう
 * 真偽値で解決しない問題があるとすれば、サーバサイドに問題があると思って(個人的には)間違ないと思います
 * もしもelse-ifが発生するのであれば、(少しくらいは)疑問を持ってよいと思います

## テンプレート側で計算はすべきでない？

* 個人的にはYesですが、表示にのみ関わることであれば積極的にしてよいと思います
* 計算すべき事象はテンプレートに割り当てられた時点で(本来であれば)全て解決しているべきと考えます
 * 本来であればという前提は3桁区切りにする、日付のフォーマットを指定するといったことを対象外とします
 * 例外としてjsで動的に座標計算をするために用意された初期値の指定など枚挙に暇はありません
 * それでも済ませておくべきとは思います

## どうして計算すべきでないの？

* 計算はロジックだからです
* フロントエンドでのみ活用されることが約束された値は計算済みの値のみであるべきだからです

## テンプレートエンジンを利用する最初の動機は何だったか思い出してみましょう？
* それは単なる判定、ループ、変数の利用、そしてインクルード命令による共通化ではないでしょうか？

## どっちでやっても一緒じゃないの？w

* 一緒です。ロジックが正しいか正しくないかの二択です
 * ただし、2択がModel層とView層の2つになります。合計4個です
 * 問題の切り分けが大好物という方は是非、いずれにもロジックを組み込んで下さい

# 結論

* テンプレートエンジンですべきことはあくまでも表示に関わること
 * 文字列のマークアップ
 * 真偽値による表示の出し分け
 * (主にテーブルの行に代表される)項目のループ
 * よく利用される表示の共通化
 * js(と近年見ることがないアプレット)の変数初期化
* くらいじゃないの？などという妄言を繰り返しており（ry
AngularJSのベストプラクティスに従っていますか？ -- angular-hintの使い方

最近、[AngularJSリファレンス](http://www.amazon.co.jp/dp/4844336681/)という書籍を書いていたのですが、紙面や時間の都合上書けなかったこともたくさんありました。
というわけで、書籍に書ききれなかった内容を落ち穂拾い的に紹介していきたいと思います。

今回はangular-hintというツールを紹介します。

 * https://github.com/angular/angular-hint

これは、Angularチームの1人が開発しているツールで、AngularJSを使って開発したアプリケーションに組み込んで実行すると、エラーを検出してくれたり、ベストプラクティスに従っているかどうかをチェックしてくれたりします。

ただし、説明文にWIP(Work In Progressの略)と書いてあるので、まだ開発中のようです。
angular-hintを組み込むとアプリケーションが動かなくなることもあるのでご注意ください。

## angular-hintの利用方法

angular-hintを利用するにはgithubからソースを取得してビルドするか、もしくはnpmで取得することになります。
ここではnpmを利用しましょう。

~~~
$ npm install angular-hint
~~~

npmで取得したディレクトリの中に `node_modules/dist/hint.js` というファイルがあるので、これをコピーして使いましょう。

この`hint.js`というファイルをAngularJSを使ったアプリケーションの`angular.js`を読み込んでいる直後に読み込みます。

~~~html
<script type="text/javascript" src="angular.js"></script>
<script type="text/javascript" src="hint.js"></script>
~~~

そして、ng-appを付与している要素にng-hintを追加します。

~~~html
<html ng-app="yourApp" ng-hint>
~~~

あとはアプリケーションを実行するだけで、カテゴリーとエラーレベルごとにグルーピングされた指摘内容がコンソール上に表示されます。

![ng-hint.png](https://qiita-image-store.s3.amazonaws.com/0/3489/276a898f-dcd1-6f1a-4a30-399a8b36bfda.png)

## angular-hintの指摘内容

指摘内容のカテゴリーにはModules, Controllers, Directives, DOM, Events, Interpolationの6種類があり、エラーレベルにはエラー、警告、提案(サジェスチョン)の3段階があります。
なお、angular-hintはカテゴリーごとにリポジトリが分かれていて、必要のないカテゴリーのチェックはおこなわないようにすることもできますが、本記事では割愛します。

指摘内容としては、次のようなものがあります。

- Modules
  - [エラー] ng-appを付与した要素が入れ子になっているとエラー
  - [警告] angular.moduleで同じ名前のモジュールを複数作っていると警告
  - [警告] angular.moduleでモジュールを作ったのに、どこからも使われていないと警告
  - [提案] モジュールの名前にプリフィックスが付いていなかったり、キャメルケースになっていないときに警告
  - [提案] ng-viewディレクティブを使っているのにngRouteモジュールをロードしてない時に警告
- Controllers
  - [警告/エラー] コントローラをグローバル関数として定義していると警告(AngularJS 1.3ではエラー)
  - [警告] コントローラの名前の先頭が大文字になっていないと警告
  - [警告] コントローラの名前の後ろにControllerが付いていないと警告
- Directives
  - [エラー] ディレクティブの名前や属性の名前を間違えているとエラー
  - [エラー] 属性を指定する必要があるディレクティブで、属性が省略されているとエラー
  - [エラー] restrictの指定を間違えているとエラー
  - [エラー] deprecatedなオプション(replace)やディレクティブ(ng-bind-html-unsafe)を使っているとエラー
  - [エラー] ng-repeat内でオプションの順番などが間違っているとエラー
  - [提案] onclickやonfocusなどのネイティブなイベントを利用していると警告
  - [提案] ディレクティブ名にプリフィックスをつけていないと警告
- DOM
  - [警告] コントローラの中からDOMを直接操作していると警告
- Events
  - [エラー] ngClickやngFocusなどのイベント系ディレクティブの中で、$scopeに存在しない変数やメソッドにアクセスしていたらエラー
- Interpolation
  - [エラー] エクスプレッションで `{{hoge.foo.bar}}` のようにアクセスしているとき、hogeやfooがundefinedだったらエラー

ディレクティブの名前を間違えていると、「Found incorrect attribute "ng-reapet" try "ng-repeat". 」のように、似たような名前を探してきて指摘してくれます。賢いですね。
ディレクティブでreplaceプロパティがdeprecatedだというのは初めて知りました。
他にも、コントローラ内でDOM操作をしているかどうかなど、かなり頑張って解析しているようです。

まだまだ指摘の種類は少ないですが、Angularチームがベストプラクティスを示してくれるというのはありがたいですね。
今後に期待したいツールです。
かわいそうなGoF Stateパターンに愛の手を

# はじめに
下記を見ていたらStateパターンがとても不憫になったので、「僕はそばにいるよ」とコードで示してあげたくなりました。

http://qiita.com/irxground/items/d1f9cc447bafa8db2388#3-20
http://qiita.com/magicant/items/64685c41fdb85d03c33b#3-4

# せいか
書いたのはこんな感じでiPhoneのストップウォッチを真似したものです（jsdo.itが終了してたのでcodepenにしました）。
https://codepen.io/ms2sato/pen/JjGPdWy

コードはGitHubにあります。
https://github.com/ms2sato/gof/blob/master/state/main.js

# おもっていること
上記のコード、ifやswitchのような条件分岐を**ひとつも使っていません**。Stateパターンの最大の効果はこの「ifを減らせる」という事だと思っています。多くのパターンもその効能があることが多いだろうし、そもそも基本であるポリモーフィズムすらifを減らす為にやってると言っても過言ではないと個人的には思っています。統計取ったことは無いけれど、体験的にはバグの発生率と条件分岐の数は相関してるはず。

もしも同じようなswitchやifが何度も出てくるような場合にはこのパターンを検討する理由としては十分だと思います。もちろん検討の結果、他の設計手法になることもあるでしょうけれど。

GoFのデザインパターンが書かれた当時は今ほどWEBのアプリケーションを書いていることは多くなくて、サーバー＆専用アプリで動くいわゆるクラサバでやったり、そもそもネットワークなど使わずにローカルにインストールするアプリもかなり多かった時代だと思うので（C++がサンプルだったのもそういう事情だと思います）、今見ると「これって何の意味あんの？」という事はひょっとしたら多いのかもしれません。

ただ、ブラウザのJavaScriptが状態を持つことによるクライアント側MVC（元祖MVC）は上記の時代と求める要件が似ている状況にもなるので、そっちで有効なパターンなどはあるのだろうと思います。どれがどうのとかよく考えてないけどｗ

そもそも設計とメリット・デメリットをまとめたカタログなので「あーこういうのあるんだね。へー。」で良いし、会話する時に「そこはxxパターンっぽく処理するといいんじゃない？」程度の語彙を提供する目的だったはずなので、載っているから凄い効果があるとか載ってないとダメとかは無いんですよね。

今に則した新しいデザインパターンとか誰か書いてくれたら見てみたいなぁ。どういうのが載ってくるんだろう。ワクワクするね。
大手Webサービスがクライアント側で発生したJavaScriptのエラーをどう収集しているのか まとめ


|  | pixiv | はてなブログ | Facebook | Flickr |
|--------------------------|-------------------------------------------------------------------------------------|-------------------------------------------------------------------------|----------------------------|-------------------------------------------------------------------------------------------------------------------------------|
| サーバに送っているか | ○ | ○ | 圧縮されててよくわからない | ○ |
| いつ送ってるか | window.onerror時 | Ajaxリクエストやメソッド実行の失敗時 |  | window.onerror時 |
| どこで送ってるか | http://www.pixiv.net/mypage.php | http://hatenablog.com/js?<バージョン番号> |  |  |
| どこに送ってるか | http://www.pixiv.net/rpc/js_error.php | http://blog.hatena.ne.jp/api/bug |  | https://www.flickr.com/beacon_rb_jserror.gne |
| なにを送っているか | * エラーメッセージ <br>* URL<br>* 行番号<br>* ユーザーID<br>* プレミアムかどうか | stacktrace.jsを使ってとれたスタックトレースエラーメッセージURL |  | * エラーメッセージ<br>* 行番号<br>* URL |
| どんな方法で送っているか | new Image().srcにエラー内容込みのURLを載せてる | $.ajaxでstacktrace.jsを取得し実行し、Image().srcにURLをセット |  | Image().src |
| 備考 | IE9やSafari、Googleのスクリプトに関するエラーは頻発するらしく、送る頻度を下げている | Hatena.Diary.BUGメソッドとHatena.Diary.REPORT_BUGメソッドを使い分けてる |  | めっちゃシンプルな実装だし["dumbest possible thing that will work (動作する最も単純なやり方)"  ](http://qiita.com/daisy1754/items/98a6e6b17d8161eab081)なのかな？ |
Fedora/CentOS/RHELにFlashPlayerをインストールする方法

# Fedora/CentOS/RHELにFlashPlayerをインストールする方法
技術メモ
発症機：Fedora 20/19, CentOS/RHEL 6.5/5.10

## 検証：VMware，Fedora20
FedoraでFlashが動く夢をみたので…

## コマンド：ルートで入って下記コピペ



```bash:
## Install Adobe YUM Repository RPM package

## Adobe Repository 32-bit x86 ##
rpm -ivh http://linuxdownload.adobe.com/adobe-release/adobe-release-i386-1.0-1.noarch.rpm
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-adobe-linux
 
## Adobe Repository 64-bit x86_64 ##
rpm -ivh http://linuxdownload.adobe.com/adobe-release/adobe-release-x86_64-1.0-1.noarch.rpm
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-adobe-linux


```


```sh:
## Update Repositories

yum check-update


```


## Install Adobe Flash Player 11.2 on Fedora 20/19/18/17/16/15/14/13/12, CentOS 6.5/6.4/6.3/6.2/6.1/6 and Red Hat (RHEL) 6.5/6.4/6.3/6.2/6.1/6


```sh:
## Fedora 19/18/17/16/15/14/13/12, CentOS 6 and Red Hat (RHEL) 6 32-bit and 64-bit version

yum install flash-plugin nspluginwrapper alsa-plugins-pulseaudio libcurl


```

```sh:
## Install Adobe Flash Player 11.2 on CentOS 5.10 and Red Hat (RHEL) 5.10

yum groupinstall "Sound and Video"
 
yum install flash-plugin nspluginwrapper curl

```


## VMware音がでない
上に張り付いてるVMwareメニューから、VM→取り外し可能デバイス→サウンドカード→設定→サウンドカード→ホストのサウンドカードを指定

メニューから取り外し可能デバイスのサウンドカードをオンにする。
ヒャッハーッ！！

ていう夢をみたんだ(´・ω・｀)ｼｮﾎﾞｰﾝ
mysqlのユーザー権限を管理する


たまーにしかやらないので、やり方すぐ忘れちゃいますよね。

まずは現在の権限の確認。
rootユーザーとwordpressユーザーがlocalhostからのアクセスのみを許可されていることがわかります。

```
mysql> select user, host from mysql.user;
+-----------+-----------+
| user      | host      |
+-----------+-----------+
| root      | localhost |
| wordpress | localhost |
+-----------+-----------+
```

新しくsample_userを作成して再度確認すると全てのホスト(%はワイルドカード)からのアクセス許可するユーザーが作成されている。

```
mysql> CREATE USER sample_user IDENTIFIED BY [PASSWORD] 'password’;
mysql> select user, host from mysql.user;
+-------------+-----------+
| user        | host      |
+-------------+-----------+
| sample_user | %         |
| root        | localhost |
| wordpress   | localhost |
+-------------+-----------+
```

wordpressというDBの全てのテーブルに対してのアクセス権限を設定。この例では「192.168.10.%」というようにローカルのIPからの接続を許可している。%がワイルドカードで、これを使用する場合はシングルクォートで囲う必要があります。

```

mysql> GRANT ALL PRIVILEGES ON wordpress.* TO sample_user@'192.168.10.%’;

# 同時にパスワードを設定する場合はSQLに下記を追記する
# IDENTIFIED BY 'xxxxxx' WITH GRANT OPTION;

mysql> select user, host from mysql.user;
+-------------+--------------+
| user        | host         |
+-------------+--------------+
| sample_user | %            |
| sample_user | 192.168.10.% |
| root        | localhost    |
| wordpress   | localhost    |
+-------------+--------------+
```

新しくレコードが追加されてますね！これでOKです。
権限をrevokeするSQLも書きたかったんですが、なぜか意図した通りに出来なかった。。。また別の機会に書きます。
Doctrine DBALだけで冪等性を保証したスキーマ管理

Doctrine DBALにはスキーマの差分を調べる機能があるようです。

```php
<?php
use Doctrine\DBAL\DriverManager;
use Doctrine\DBAL\Schema\Schema;

require "vendor/autoload.php";

$db = DriverManager::getConnection(['driver' => 'pdo_pgsql', 'dbname' => 'test']);

$schema = new Schema();
$table = $schema->createTable('posts');
$table->addColumn('id', 'integer');
$table->addColumn('title', 'string');
$table->setPrimaryKey(['id']);

$scm = $db->getSchemaManager();

$queries = $schema->getMigrateFromSql($scm->createSchema(), $db->getDatabasePlatform());

foreach ($queries as $q) {
    echo $q, "\n";
    $db->executeUpdate($q);
}
```


`$scm->createSchema()`で現在のDB上のSchemaを取得でき、`$schma->getMigrateFromSql()`（あるいは`$schma->getMigrateToSql()`）で差分のSQLの配列を取得できます。

これで、初回実行時は、

```
CREATE TABLE posts (id INT NOT NULL, title VARCHAR(255) NOT NULL, PRIMARY KEY(id))
```

が実行されますが、二回目以降な何も実行されません。また、`$table`の定義を以下のように変更すれば、

```
$table->addColumn('title', 'string', ['notnull' => false]);
$table->addColumn('body', 'text');
```

以下のALTER文が実行されます。

```
ALTER TABLE posts ALTER title DROP NOT NULL
ALTER TABLE posts ADD body TEXT NOT NULL
```

多分symfonyのdoctrine:schema:updateも似たようなことしてるんじゃないかと思います。

データベースのスキーマの変更は様々なケースがあるので必ずしもうまくいくとは限りませんが、単純なプロジェクトであればこれで充分のように思えます。

あと、これDoctrineのソースを見てたらこういうことできそうだということに気付いたという話なんですが、実際このような使い方をしているという事例はみかけませんでした。
Route53 で CloudFront、ELB、S3 をエイリアス設定した場合の TTL

Route53 でエイリアスレコードを設定する場合の TTL についてまとめました。

### CloudFront、ELB、S3 を設定する

[Choosing Between Alias and Non-Alias Resource Record Sets](http://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-choosing-alias-non-alias.html)

>If an alias resource record set points to a CloudFront distribution,
an ELB load balancer, or an Amazon S3 bucket, you cannot set the time to live (TTL); 
Amazon Route 53 uses the CloudFront, 
Elastic Load Balancing, or Amazon S3 TTLs. 

CloudFront、ELB、S3 をエイリアスレコードで設定する場合は Route53 側では TTL を設定出来ないようです。代わりにそれぞれの TTL を利用するようですね。
それぞれの TTL はいくつなのでしょうか？

### ELB の TTL は 60 秒

[Configure Custom Domain Name for Your Load Balancer](http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/using-domain-names-with-elb.html)

>The time-to-live (TTL) for an Elastic Load Balancing DNS entry is set to 60 seconds. 

どうやら ELB の TTL は 60 秒のようです。

### CloudFront と S3 も 60 秒

[ANAME Records for CloudFront](https://forums.aws.amazon.com/message.jspa?messageID=364604)

>Firstly, CloudFront and S3 both use short 60 second TTL (cache lifetime) settings on DNS records.

CloudFront と S3 の TTL も 60 秒のようです。

### dig コマンドで確認

ホントにそうなってるの？というのは dig コマンドで確認できます。

```
$ dig xxx.server.jp
xxx.server.jp.	60	IN	A	123.456.777.889
```
オートスケール時にタイムゾーンが JST =>UTC に書き変わってしまった

もう大分前になりますが EC2 で運用しているサービスで思わぬ障害が発生しました。
そのサービスは指定時間になると特定の処理を実行する、という単純なものなのですが、ある日ちょうどその設定時刻から９時間ズレて処理されたとの報告を受けました。
調査したところサーバーのタイムゾーンが JST =>UTC に書き変わっていました。
そのサービスはサーバー時刻を JST としてずっと運用していたので UTC に書き変わったことによって誤った時間に処理してしまったわけです。
ここではなんでそのようなことになってしまったのかをまとめます。

### オートスケール時のログを確認

オートスケールされたインスタンスの ```/var/log/cloud-init.log``` を見てみると

```bash:/var/log/cloud-init.log
  Updating   : nss-softokn-freebl-3.14.3-9.15.amzn1.x86_64                1/114
  Updating   : glibc-common-2.17-36.80.amzn1.x86_64                       2/114
  Updating   : glibc-2.17-36.80.amzn1.x86_64                              3/114
warning: /etc/localtime created as /etc/localtime.rpmnew
  Updating   : 1:openssl-1.0.1e-37.64.amzn1.x86_64                        4/114
  Updating   : xz-libs-5.1.2-5alpha.10.amzn1.x86_64                       5/114
  Updating   : php-common-5.3.28-1.5.amzn1.x86_64                         6/114
```

というログが出力されていました。
```warning: /etc/localtime created as /etc/localtime.rpmnew``` とあり、調べてみるとパッケージアップデート時に ```/etc/localtime``` が書き変わったことが原因だったようです。


### 対処１：タイムゾーンを JST に戻す
原因は分かったとして、運用するためにはタイムゾーンを JST に戻さなくてはなりません。
以下２ファイルを編集してタイムゾーンを JST に戻しました。

```bash:コマンド
mv /etc/localtime /etc/localtime_bk
ln -s /usr/share/zoneinfo/Japan /etc/localtime
```

```bash:/etc/sysconfig/clock
ZONE="Japan"
UTC=false
```

[/etc/sysconfig/clockの話](http://chocoby.jp/blog/2013/04/27/amazon-linux-2013-03/)

### 対処２：オートスケール時のパッケージアップデートを抑止する
そもそもオートスケール時にパッケージが自動アップデートされてしまうというのはイケていないので、[Amazon EC2(Linux)システム管理で知らないとハマる5つの環境設定](http://dev.classmethod.jp/cloud/five-confs-of-ec2-linux-sysops/)に則ってオートスケール時にアップデートされないように設定しました。

```bash:/etc/cloud/cloud.cfg
  :
repo_upgrade: none
  :
```
scikit-learn を使った回帰モデルとその可視化

[昨日](http://qiita.com/ynakayama/items/8ed2854bcc3c3633345b)紹介した書籍のひとつ [SciPy and NumPy
Optimizing & Boosting your Python Programming](http://it-ebooks.info/book/1280/) から例を取り出し scikit-learn による回帰の話です。

## 3D モデルからの回帰平面算出

まずは 3D モデルを書くためのライブラリをインポートします。

```py3
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# scikit-learn の Linear Regression を利用します
from sklearn import linear_model
# 回帰用のサンプルデータセットを使います
from sklearn.datasets.samples_generator import make_regression
```

### サンプルデータからの訓練データ生成

サンプルデータがありますので、これを訓練データに基づいた分類をおこなってみましょう。

```py3
# 訓練と試験のための合成データを生成します
X, y = make_regression(n_samples=100, n_features=2, n_informative=1,
                       random_state=0, noise=50)
# =>
# [[ 1.05445173 -1.07075262]
#  [-0.36274117 -0.63432209]
# ...
#  [-0.17992484  1.17877957]
#  [-0.68481009  0.40234164]]
# [  -6.93224214   -4.12640648   29.47265153  -12.03166314 -121.67258636
#  -149.24989393  113.53496654   -7.83638906  190.00097568   49.48805247
# ...
#   246.92583786  171.84739934  -33.55917696   38.71008939  -28.23999523
#    39.5677481  -168.02196071 -201.18826919   69.07078178  -36.96534574]
```

### 訓練データと試験データの分割

生成したデータを訓練と試験について 80:20 の割合で分割します。

```py3
X_train, X_test = X[:80], X[-20:]
y_train, y_test = y[:80], y[-20:]
```

### 分類器の訓練

準備ができたら訓練を行います。まずは分類器のインスタンスを生成、次におなじみの .fit メソッドで分類器を訓練します。

```py3
regr = linear_model.LinearRegression()
# 訓練する
regr.fit(X_train, y_train)

# 推定値を表示する
print(regr.coef_)
#=> [-10.25691752 90.5463984 ]
```

### 値の予測

次に訓練データに基づいた y 値を予測します。

```py3
X1 = np.array([1.2, 4])
print(regr.predict(X1))
#=> 350.860363861
```

### 評価

結果を評価してみましょう。

```py3
print(regr.score(X_test, y_test))
#=> 0.949827492261
```

### 可視化

データだけでは直感的ではないので、最後に可視化をしてみます。

```py3
fig = plt.figure(figsize=(8, 5))
ax = fig.add_subplot(111, projection='3d')
# ax = Axes3D(fig)

# Data
ax.scatter(X_train[:, 0], X_train[:, 1], y_train, facecolor='#00CC00')
ax.scatter(X_test[:, 0], X_test[:, 1], y_test, facecolor='#FF7800')

coef = regr.coef_
line = lambda x1, x2: coef[0] * x1 + coef[1] * x2

grid_x1, grid_x2 = np.mgrid[-2:2:10j, -2:2:10j]
ax.plot_surface(grid_x1, grid_x2, line(grid_x1, grid_x2),
                alpha=0.1, color='k')
ax.xaxis.set_visible(False)
ax.yaxis.set_visible(False)
ax.zaxis.set_visible(False)

fig.savefig('image.png', bbox='tight')
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38501/2973794d-ff20-043e-a667-8c82a6191314.png)

平面が求められました。だいたいあっているようですね。

## まとめ

サンプルデータセットを使うと綺麗な平面を描くことができました。現実の問題においてはなかなか綺麗に行かないこともありますが、理論を抑えておくと役に立つでしょう。
Sublime Textを使い倒すために最低限覚えたいキー操作

# はじめに

いっとき他のエディタに浮気していたけどふたたびSublime Textに戻ってきた。そこであらためてキー操作を洗い直し、少しでも高速に操作できるように自分向けにまとめてみた。

なおキー操作は完全にMac用だけど、すべてデフォルトの設定のみ記述している。2でも3でも変わらないはず。

## 何はなくとも`⌘+d`

カーソルが置かれている単語を修正するならもう`⌘-d`一発。これしかない。カーソルキーなどでもぞもぞ選択している場合ではない。これを真っ先に指に叩き込もう。

`⌘`を押したまま`d`を連打すれば、同じファイルの中にある同じ単語が次々に選択追加され、かの有名なマルチカーソルが使えるようになる。

## 行削除は`⌘+x`で

何も選択せずに`⌘+x`を押せばそれだけで行を削除して詰めてくれる。いちいち全選択して`Delete`とか打つ必要なし。

## `⌘+l`も連打せよ

カーソルのある行全体を選択するなら、`Shift`キーを押しながらカーソルを...などとやるより、`⌘+l`に限る。一行だけならありがたみはそんなにないけど、`⌘`を押したまま`l`を連打すればその下の行が次々に選択追加される。

## `⌘+Enter`で素早く挿入

`⌘+Enter`を押すと、カーソルが行のどこにあろうと次の行に移動して一行空けて挿入OKの状態になる。vimで言う`o`と同じ動作。いちいち行末に移動して`Enter`を押して...などとやる必要はない。

`⌘+Shift+Enter`にすれば同様に前の行に挿入される。

## `⌘+e`と`⌘+f`は連続技

`⌘+e`で現在のカーソル下にある単語が検索窓に取り込まれるので`⌘+f`で即検索開始できる。この2つは激しく連続で使われる。

## 書き進めてきたら`⌘+r`を押してみよう

これが有名なシンボルへのジャンプ。このウィンドウの中でインクリメンタル検索も効く。いちいちスクロールして該当箇所にジャンプするより圧倒的に効率がよい。
ControllerからViewに値を渡して表示


Sencha Touchを使って、ControllerでStoreからデータを取ってきてViewに値を渡してXTemplateで表示するシンプルな例。

# アプリ作成

下記コマンドでValuetestというサンプルアプリをつくる。

`sencha -sdk $HOME/Code/Framework/touch-2.3.1 generate app Valuetest valuetest`


#モデル作成

できたvaluetestディレクトリに移動して下記コマンドでモデルを作成する。

`sencha generate model --name=Player --fields=name:string,no:int,position:string`

```javascript:app/model/Players.js(自動生成)
Ext.define('Valuetest.model.Player', {
    extend: 'Ext.data.Model',
    
    config: {
        fields: [
            { name: 'name', type: 'string' },
            { name: 'no', type: 'int' },
            { name: 'position', type: 'string' }

        ]
    }
});
```

app.jsに下記を追加

```javascript:app.jsの一部
models: ['Player'],
```

# ストア作成
下記の内容でapp/store/Players.jsを作成する。

```javascript:app/store/Players.js
Ext.define('Valuetest.store.Players', {
    extend: 'Ext.data.Store',
    config: {
        model: 'Valuetest.model.Player',
        data: [
            {
                name: 'Wayne Rouney',
                no: 10,
                position: 'Striker'
            },
            {
                name: 'Daren Flecher',
                no: 24,
                position: 'Midfielder'
            }
        ]
    }
})
```

app.jsに下記を追加。

```javascript:app.jsの一部
stores: ['Players'],
```


# ビューの作成。
下記内容でapp/view/Main.jsを作成。(自動作成されているコードは全削除)

```javascript:app/view/Main.js
Ext.define('Valuetest.view.Main', {
    extend: 'Ext.Container',
    xtype: 'mainview',
    config: {
        tpl: Ext.create('Ext.XTemplate',
            '<tpl>',
                '<p>{name} {no} {position}</p>' //1
            '</tpl>'
            ) 
    }
})
```

1. {name}と{no}と{position}にコントローラから渡される値を表示する。

# コントローラーの作成

下記コマンドでコントローラを作成。

`sencha generate controller Main`

app.jsにコントローラを追加

```javascript:app.jsの一部
controllers: ['Main'],
```

下記内容でapp/controller/Main.jsを作成。

```javascript:app/controller.js
Ext.define('Valuetest.controller.Main', {
    extend: 'Ext.app.Controller',
    
    config: {
        refs: {
            mainViewer: 'mainview' //1
        },
        control: {
            'mainview': { //2
                activate: 'showData'  
            }  
        },
    },

    showData: function(){
        var store = Ext.getStore('Players');
        var player = store.first();
        var view = this.getMainViewer(); //3
        view.setData( //4
               {name: player.get('name'),
               no: player.get('no'),
               position: player.get('position')}
            );
    },

});
```

1. app/view/Main.js(xtypeでmainviewと定義）にアクセスするための参照キーとしてmainViewerを定義
2. app/view/Main.js(xtypeでmainviewと定義）のイベントに対する定義
3. キーであるmainViewer(参照先はrefsオプションで定義しているようにapp/view/Main.js、xtypeはmainview)のコンポーネントを取得
4. setDataで参照先であるmainViewer(参照先はrefsオプションで定義しているようにapp/view/Main.js、xtypeはmainview)に値をセット。

# ブラウザで確認
アプリルートディレクトリで下記コマンドで簡易HTTPサーバを起動。
`python -m SimpleHTTPServer`

これで次のような描画ができる。
![Valuetest.png](https://qiita-image-store.s3.amazonaws.com/0/19083/f057ea30-f14d-f557-38a1-b6ca65738dd2.png "Valuetest.png")
XTemplateクラスでHello World


Sencha TouchのXTemplateクラスでHello World的に簡単なサンプル。

# ループを使わない例
```javascript:Helloworld.js
Ext.define('CarouselTest.view.Helloworld',{
	extend: 'Ext.Container',
	xtype: 'helloworld',
	config: {
		data: {
			greeting: 'Hello World'
		},
		tpl: Ext.create('Ext.XTemplate', 
				'<tpl>',
					'<p>{greeting}</p>',
				'</tpl>'
			)
	}
})
```

# ループを使う例
```javascript:Helloworld.js
Ext.define('CarouselTest.view.Helloworld',{
	extend: 'Ext.Container',
	xtype: 'helloworld',
	config: {
		data: {
			users: [  
				{
					greeting: 'Hello',
					name: 'World',
				},
				{
					greeting: 'Welcome',
					name: 'New World'
				}
			]
			// greeting: 'Hello World'
		},
		tpl: Ext.create('Ext.XTemplate', 
				'<tpl for="users">',
					'<div>{greeting} {name}</div>',
				'</tpl>',
				{
					// join: function(value) {
					// 	return value(', ');
					// }
				}
			)
		// tpl: Ext.create('Ext.XTemplate', 
		// 		'<tpl>',
		// 			'<p>{greeting}</p>',
		// 		'</tpl>'
		// 	)
	}
})
```

なぜ、forループを回す場合にはExt.Xtemplateのインスタン化にからメソッドが必要なのかがわからない。
[Ruby] 自分のIPアドレスを知る。

どうして自分のIPアドレスを知る必要があるんでしょうね。私もその人と同じことを考えているのかもしれないし、私と同じことが必要な人も今後いるかもしれないですね。うふ。

ググって調べたところ、私がこれまで知らなかった画期的な方法で自分のIPアドレスを取得する方法を見つけている人を見つけました。

自分のIPアドレスを得る
[http://d.hatena.ne.jp/NeoCat/20070721/1184994948](http://d.hatena.ne.jp/NeoCat/20070721/1184994948)

その人はperlで実装していたのですが、それをrubyに移植しました。どこでもうまくいくみたいです。驚きました。

```ruby:my_address.rb
# 自分のIPアドレスを得る
# http://d.hatena.ne.jp/NeoCat/20070721/1184994948
# このperlソースをRubyに移植

# ダミーのUDPソケットを作り、それを相手ホストにconnect()し、
# getsockname()で自分のアドレスを得る。connectのMANPAGEによると、
# UDPソケットをconnectすると、特に何もパケットが送出されることはなく、
# そのソケットのデフォルトのパケット送信先／唯一の受信先となる、
# という仕様があるのだそうだ。

require 'socket'

def my_address
 udp = UDPSocket.new
 # クラスBの先頭アドレス,echoポート 実際にはパケットは送信されない。
 udp.connect("128.0.0.0", 7)
 adrs = Socket.unpack_sockaddr_in(udp.getsockname)[1]
 udp.close
 adrs
end

p my_address
```

実行結果 (Windows 7)

```text
C:>ruby --version
ruby 2.0.0p481 (2014-05-08) [i386-mingw32]

C:>ruby my_address.rb
"10.0.1.7"
```

実行結果 (MacOS 10.9.4)

```text
$ ruby --version
ruby 2.0.0p451 (2014-02-24 revision 45167) [universal.x86_64-darwin13]

$ ruby my_address.rb 
"10.0.1.6"
```
antリファクタリング ホストの設定値を隠す

## 概要
ホストのログインIDやパスワードなどの環境に依存する設定をmacrodefでpropertyファイルから読み出すようにします

例として、ホスト名host1とhost2の２つのサーバにwarファイルをftpでデプロイするmacrodefタスクを定義します

完成した `deploy-warターゲット` はこんな感じ

```
<target name="deploy-war" description="deploy war">
  <deploy host="host1" refid="__refid" remotedir="/path/to" />
  <deploy host="host2" refid="__refid" remotedir="/path/to" />
</target>
```

host1やhost2のユーザ名やパスワードを呼び出し時の設定を無くしhost名のみを指定するように変更します

手順は以下の３つです
* ホストごとにpropertyファイルを作ります
* macrodefを使って新しいタスク \<deploy> を定義します
* deploy-warターゲットを定義します

## ホストごとにpropertyファイルを作ります

ホストの設定を<ホスト名>.propertiesを作って記述します

ここでは、ftpタスクに必要なホスト情報の転送先のアドレス(server), ログインID(userid)、ログインパスワード(password)を設定します

**host1.properties**

```
server=host1
userid=__userid
password=__password
```

※このファイル名だと、 deployタスクには `<deploy host="host1" refid=...` と書きます
host2.propertiesについても同様に作ります

## macrodefを使って新しいタスク \<deploy> を定義します

[macrodefタスク](http://ant.apache.org/manual/Tasks/macrodef.html)で[localタスク](http://ant.apache.org/manual/Tasks/local.html)とpropertyタスクを使って環境に依存する設定をpropertyファイルから読み込むようにします

deployタスクは、パラメータとしてhost,refid,remotedirを取り
hostによって異なる設定server,userid,passwordは \<host>.propertiesファイル から設定します

antにおいてプロパティは実行スレッドで一度設定されると変更されないのでpropertyファイルから読み込む設定値についてはlocalタスクを使ってローカルスコープとなるよう設定します

```
<macrodef name="deploy">
  <attribute name="host" />
  <attribute name="refid" />
  <attribute name="remotedir" />
  <sequential>
    <local name="server" />
    <local name="userid" />
    <local name="password" />
    <property file="@{host}.properties" />
    <ftp server="${server}"
         userid="${userid}"
         password="${password}"
         remotedir="@{remotedir}"
         verbose="yes" >
      <fileset refid="@{refid}" />
    </ftp>
  </sequential>
</macrodef>
```

## deploy-warターゲットを定義します

build.xml等にmacrodefをコールするtargetを記述します

```
<fileset id="war" dir="./target">
  <include name="hoge.war" />
</fileset>
<target name="deploy-war" description="deploy war">
  <deploy host="host1" refid="war" remotedir="/path/to" />
  <deploy host="host2" refid="war" remotedir="/path/to" />
</target>
```

ホストの設定情報を書かなくて済むのでとても可読性がよく保守しやすくなると思います

## その他サンプル
### リモートホスト上でコマンドを実行するタスク
以下のコードでは、macrodefの `text element` を利用して実行するコマンドを **commandタグの間のテキスト** として定義することができます

```
<target name="restart-web">
  <command host="host1">/path/to/apachectl graceful</command>
</target>

<macrodef name="command">
  <attribute name="host" />
  <text name="command" />
  <sequential>
    <local name="server" />
    <local name="userid" />
    <local name="password" />
    <property file="@{host}.properties" />
    <sshexec host="${server}" 
             username="${userid}" 
             password="${password}" 
             command="@{command}" />
  </sequential>
</macrodef>
```
POH!Liteでめちゃめちゃ素直に実装してチューニングした結果

[POH!Lite](http://paiza.jp/poh/kirishima/result/a11e9a27c079cb9a3a206788ee9e39b5)でめちゃめちゃ素直に実装してチューニングした結果

````python:poh-lite.py
from itertools import starmap
m = input()
n = input()
cost = {0:0}
def update(x,y):
  s,t = q+x, r+y
  if not s in cost or cost[s]>t:
    return (s,t)
for i in range(n):
  q,r = map(int,raw_input().split())
  cost.update( filter(None,starmap(update,cost.iteritems())) )
print min( (cost[x] for x in cost.keys() if x>=m) )
````
TEST CASE 7で2.07秒
dict.updateに与えるシーケンスをfilterでリストにしているのがミソ
Easy Web Scraping using PHP Simple HTML DOM Parser Library

Simple HTML DOM is a PHP library to parse data from webpages, in short you can use this library to do **web scraping** using PHP and even store data to MySQL database.  Simple HTML DOM has following features:

1. The parser library is written in PHP 5+.
2. It requires PHP 5+ to run.
3. Parser supports invalid HTML parsing.
4. It allows to select html tags like Jquery way.
5. Supports Xpath and CSS path based web extraction.
6. Provides both the way – Object oriented way and procedure way to write code.

**Scraping all links**

<?php
//Brought to you by http://www.webdata-scraping.com
include "simple_html_dom.php";
//create object
$html=new simple_html_dom();

//load specific URL
$html->load_file("http://www.google.com");

// This will Find all links
foreach($html->find('a') as $element) 

   echo $element->href . '<br>';
?>