OmniAICreator/Qiita-1.07M huggingface dataset:
FreeBSDでDropBoxAPIを使うまえに

FreeBSDでDropBoxのファイルを取得したりするのに、dropbox-apiを使う必要があるらしいことがわかり、その際ちょっとハマったところをメモ。

基本的には下記サイト様を参考にさせていただき、設定を行いました。

* FreeBSDからDropBoxAPIを使う
http://iamjapanesester2.blogspot.jp/2012/02/freebsd-dropbox.html

* DropBoxAPIを使うアプリケーションの登録
http://d.hatena.ne.jp/zebevogue/20130718/1374123951

* アプリケーションのアクセス設定
http://stackoverflow.com/questions/20327801/app-is-not-allowed-to-access-this-api-for-dropbox

で、DropBoxAPIを使う前に、APIを使用するアプリをDropBoxに登録しないとダメなのですが、今回の場合、自分のフォルダにフルアクセスさせたかったので、アプリの登録時の設定を下記のようにする必要がありました、というお話です。

* データストアだけでなく、ファイルアクセス可能にする。
* 所有フォルダ以外もアクセス可能に。
* 全てのファイルタイプにアクセスする。

![dropbox_api_regist.png](https://qiita-image-store.s3.amazonaws.com/0/13927/b9534499-68e1-d0a5-5069-ee93dc486d70.png)
FreeBSDでtwmodeのtwittering-use-master-passwordが効かなかったよメモ

twmode(twittering-mode)でtwitterを見てるんだけど、FreeBSD10の環境にインストールしたら

```
(setq twittering-use-master-password t)
```

の設定が効かなくなってて、PINの入力をしてもその後にマスターパスワードの入力を促されなくて、毎回起動するたびPINの入力が必要ですごく面倒だった。`*Messages*` を見ると、

```
Encrypting...... 
(Encrypt failed Exit)
```

などと表示されてる。
その後滅茶苦茶調査したけど、結論から言うとpinentry のインストールをすることで解決できた。
どうやら、easypgはgpg1系までしか対応してなくて、ウチの環境のgpg2系だと鍵の生成とかに別途pinentryが必要ってことらしい。

ということで

```
sudo pkg install pinentry
```

で解決。
【CentOS, LAMP】仮想マシンを立てたら最初にやっておきたい設定


## 前提

CentOS6.5でのお話です。


## OSのパッケージを最新にする

	# yum update -y	# OSのパッケージを全てアップデートします

## 基本的に開発において必要とされるファイル群をインストール

	# yum groupinstall -y "Development Tools"	# 開発基本ツール群をインストール
	# yum install -y openssl-devel readline-devel zlib-devel curl-devel ImageMagick ImageMagick-devel glib2-devel gd-devel libxml2-devel libxslt-devel pcre-devel perl-devel perl-ExtUtils-Embed w3m wget vim bind-utils	# 開発で多くの場合必要とされるパッケージ群をインストール(ある程度の一般性は担保できているとは思います)

※ 参考
開発環境構築準備〜CentOS6系の場合〜
https://gist.github.com/knife0125/5299060


## Apacheをインストール

### Apacheをインストール

	# yum install httpd httpd-devel -y	# Apache(httpd)をインストール

### Apacheを起動

	# service httpd start		# Apacheを起動

### Apacheの自動起動設定を行う

	# chkconfig httpd on		# Apacheの自動起動を設定
	
### その他参考
[【Apache】Apacheをインストールしたら知っておきたい設定項目](http://qiita.com/knife0125/items/3cc75d81b567a58f529e)

## MySQLをインストール

### MySQLをインストール

	# yum install mysql mysql-server mysql-devel -y	# MySQL関連の必要なパッケージをインストール


### MySQLを起動

	# service mysqld start	# MySQLを起動

### MySQLの自動起動を設定

	# chkconfig mysqld on		# MySQLの自動起動を設定

### MySQLの初期設定

	# mysql_secure_installation	# 下記「【MySQL, 開発環境】MySQLのインストールと初期設定」を参考にして下さい。
### その他参考
[【MySQL, 開発環境】MySQLのインストールと初期設定](http://qiita.com/knife0125/items/3d685f1368a654d5187d)


## PHPをインストール

### PHP関連パッケージをインストール

	# yum install php php-devel php-pear php-mbstring php-gd php-mysql php-xml php-mcrypt php-xdebug -y	# php関連の基本ファイルをインストール

### その他参考
[【PHP】PHPをインストールしたらやっておきたい設定](http://qiita.com/knife0125/items/0e1af52255e9879f9332)


## その他設定

### ファイアウォール(iptables)を切っておく

#### ファイアウォールを停止

	# service iptables stop		# ファイアウォールを停止


#### ファイアウォールの自動起動を停止

	# chkconfig iptables off		# ファイアウォールの自動起動を停止


### SELINUXを切っておく

SELINUXの設定をdisabledに変更

	# vi /etc/sysconfig/selinux
	- SELINUX=enforcing
	+ SELINUX=disabled


## 念のためマシンを再起動

### Vagrantを再起動
Vagrantマシンからexitして抜けて、下記コマンドを実行。

	# vagrant reload   		# 仮想マシンを再起動するコマンドを入力

### 普通の仮想マシンの再起動
仮想マシン上で下記再起動コマンドを実行。

	# shutdown -r now		# 仮想マシンを再起動するコマンドを入力



## まとめ

以上で開発用のCentOSの初期セットアップは完了です。
それぞれについての詳細な記事は別途切り出して作成します。
Herokuにdjangoアプリをデプロイした雑記



ほとんど以下の参考URLを丸パクリしてます。
以前herokuを初めて触ったときの、自分用の備忘録。




参考URL：http://momoto.github.io/blog/2013/08/16/deploying-django-1-dot-5-2-on-heroku/

## django-toolbeltのインストール
ここでいきなりつまずく。

```bash
(venv) $ pip install django-toolbelt

Error: pg_config executable not found.
```

pg_configとはなんだ？
調べてみたところ、インストールしたPostgreSQLのバージョン情報が書いてあるファイルらしい。
参考：

というわけで、homebrewでPostgreSQLをインストールする。
参考：http://qiita.com/youcune/items/5b783f7fde45d0fd4b35

```bash
$ brew install postgresql
```
これで無事突破。

## Djangoプロジェクトを作成する
pip freezeってなに?

```bash
(venv) $ pip freeze > requirements.txt
```

参考URL:http://tdoc.info/blog/2014/01/15/pip.html>freezeはファイルに標準出力で書き出して、あとでinstallやbundleに使えます。

とのこと。

## Herokuへ展開する
手順をこなし、git push heroku master したものの、アプリケーションエラーとなってしまう。
![スクリーンショット 2014-03-09 13.51.26.png](https://qiita-image-store.s3.amazonaws.com/0/12603/cf167861-5cc2-e553-acc3-9972ff6f3143.png "スクリーンショット 2014-03-09 13.51.26.png")

ログを調べてみる。

```bash
(venv)$heroku logs
...
2014-03-09T00:36:57.628732+00:00 app[web.1]: ImportError: No module named side_dish.wsgi
```
う〜ん。side_dish.wsgiがないって言ってるみたい……
なんか環境構築段階でまちがえたのかもしれない。

っていうわけで、いったん最初からやり直し。
今度は公式ドキュメントみながらやってみる。
公式ドキュメント：https://devcenter.heroku.com/articles/getting-started-with-django


するとこんな注意書きが。
>Don't forget the . at the end. This tells Django to put the extract the into the current directory, instead of putting it in a new subdirectory.


```bash
(venv)$ django-admin.py startproject hellodjango .
```
おもいっくそ . つけていませんでした。
![スクリーンショット 2014-03-09 16.49.40.png](https://qiita-image-store.s3.amazonaws.com/0/12603/36b1ae54-efd2-e06c-46a5-a4fee3911993.png "スクリーンショット 2014-03-09 16.49.40.png")

これでとりあえず動いてるとこまで確認完了。
やっぱり英語でもめんどくさがらないで、公式ドキュメントを読むべきだ。

## 色々いじってみる
上記までやってしばらくおいといたら、herokuのコマンドが通らなくなった。

```bash
(venv)$ heroku ps
 !    No app specified.
 !    Run this command from an app folder or specify which app to use with --app APP.
```
どうもAPPの名前を指定して実行しろということらしい。

```bash
(venv)$ heroku open --app radiant-depths-6246
Opening radiant-depths-6246... done
```

## APP名を変更したい
参考URL:https://devcenter.heroku.com/articles/renaming-apps#manually_updating_a_git_remote


```bash
$ heroku apps:rename newname
```
これでAPPはリネームされるが自動でCheckOutが走るもよう。
以下のコマンドなら、CheckOutされない。

```bash
$ heroku apps:rename newname --app oldname
```

gitで使用するリモートURLも以下のコマンドで変更しておく。

```bash
$ git remote rm heroku
$ heroku git:remote -a newname
```

## コードの動作確認について
heroku上のコンソールで、色々試したくなるかもしれないが  ```$ heroku run console``` とかでずっとherokuにつなぎっぱなしにしない方がよい。
その間も利用時間に換算されてしまうので、無料利用時間の許容(750時間)を超えてしまう恐れがあるので要注意。
参考URL:http://blog.mah-lab.com/2013/05/16/heroku-commons-16/

## ローカル環境のDB設定について
ローカル環境(開発環境)ではsqlite使いたい。
環境変数から識別すれば、heroku上とローカル環境でDBを切り替えることが可能。

```bash
$ export LOCAL_ENV=LOCAL_ENV
```

参考URLのsettings.pyのを参考にして、DB環境を設定し直す。
さっき追加した、環境変数が存在したらローカル環境と判別して、データベースをsqlite3としている。

参考URL:http://source.hatenadiary.jp/entry/2013/02/05/173636
Pythonでの日付操作のめも


ある月の、×曜日の日付を全部とってきたり、ある月のnヶ月後は何年何月かとか計算したかったので調べてみた。
知らなかったけど、月の計算はtimedeltaではできないらしい。

```python
>>> from datetime import datetime
>>> import calendar
>>> now = datetime.strptime('2014-11-1', '%Y-%m-%d')
datetime.datetime(2014, 11, 1, 0, 0)
>>> #任意の月の日曜日の日にちをリストで取得する
>>> [x[calendar.SUNDAY] for x in calendar.monthcalendar(now.year, now.month)]
[2, 9, 16, 23, 30]
>>> # ひと月に4回しかない曜日の場合、リストの先頭値が0になる
>>> [x[calendar.MONDAY] for x in calendar.monthcalendar(now.year, now.month)]
[0, 3, 10, 17, 24]

>>> #月の計算(現在日付のnヶ月前、nヶ月後を計算できる)
>>> import time
>>> datetime.fromtimestamp(time.mktime((now.year,now.month + 2,1,0,0,0,0,0,0)))
datetime.datetime(2015, 1, 1, 0, 0)
>>> datetime.fromtimestamp(time.mktime((now.year,now.month + 15,1,0,0,0,0,0,0)))
datetime.datetime(2016, 2, 1, 0, 0)

>>> # 日にちの計算とかはtimedeltaを使うと簡単
>>> from datetime import timedelta
>>> now + timedelta(days=1)
datetime.datetime(2014, 11, 2, 0, 0)

```

参考リンク
[Pythonでの日付関連処理](http://jutememo.blogspot.jp/2008/08/python.html)
[月の加減算処理ができない？](http://blog.kjirou.net/p/381)
[8.1. datetime — 基本的な日付型および時間型](http://docs.python.jp/2/library/datetime.html)
Yosemite で DrRacket が起動しない（解決策）

## 試したバージョン

- `DrRacket` - 6.1（intel-64bit)

## 解決策

以下の3ライブラリ[ここ](https://github.com/plt/libs/tree/master/draw-x86_64-macosx-2/racket/draw)からダウンロードを`/Applications/Racket v6.1/lib`に上書きする

- libpango-1.0.0.dylib
- libpangocairo-1.0.0.dylib
- libpangoft2-1.0.0.dylib

## Links

- [DrRacket crash on OS X 10.10 (Yosemite)?](http://stackoverflow.com/questions/25880375/drracket-crash-on-os-x-10-10-yosemite)
WindowsでHubotのCronJobを動かす方法

## 概説
WindowsでHubotのCronJobを動かそうと思ったら、npmのインストールにはまったのでその紹介。

## はまりポイント1

Pythonを入れないと。npmインストール時に以下のエラーが発生する。

```npm:npm
$ npm install cron --save

$ npm install time --save
・
省略
・
gyp ERR! configure error
gyp ERR! stack Error: Can't find Python executable "python", you can set the PYTHON env variable.
gyp ERR! stack     at failNoPython (c:\Program Files\nodejs\node_modules\npm\node_modules\node-gyp\lib\configure.js:103:14)
```
ということなので、[Pythonの公式サイト](https://www.python.org)から、ダウンロードしインストールします。

今回は、「Python 2.7.8」をインストールしました。

## はまりポイント2

Visual Studioを入れないと。npmインストール時に以下のエラーが発生する。

```npm:npm
$ npm install time --save
・
省略
・
このソリューション内のプロジェクトを 1 度に 1 つずつビルドします。並行ビルドを有効にするには、"/m" スイッチを追加してください。
MSBUILD : error MSB3428: Visual C++ コンポーネント "VCBuild.exe" を読み込めませんでした。この問題を解決する
には、次のいずれかを行ってください。 1) .NET Framework 2.0 SDK インストールする。 2) Microsoft Visual Studio 2005 をインストールする。 3) その他の場所にインストールされている場合、コンポーネントの場所をシステム パスに追加する。 [c:\Users\hoge\hoge-hubot\node_modules\time\build\binding.sln]
gyp ERR! build error
gyp ERR! stack Error: `C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe` failed with exit code: 1
```

ということなので、[Visula Studioのダウンロードセンター](http://www.microsoft.com/ja-jp/download/developer-tools.aspx)から、ダウンロードしインストールします。

今回は、「Microsoft Visual Studio Express 2012 for Windows Desktop」をインストールしました。

## 後は、この辺りを見るとすんなりいく感じ。

 - [Hubotで定期タスクを動かす](http://qiita.com/mattuso/items/0164b37ffaa90f03f2a0)
 - [Hubot | 自作Script | hubot-cron を利用して Hubot に始業・昼休み・終業を通知させる](http://qiita.com/tbpgr/items/dff3b792444e3fe8f3af)
 - [herokuでhubotのcronjobを動かす時はtimezoneに注意する](http://qiita.com/sue738/items/979110367f46fa593d92)
td-agent(Fluentd)をバージョン指定でインストールする



[公式ページ](http://docs.fluentd.org/articles/install-by-rpm)から推奨されているインストール方法は`install-redhat-td-agent2.sh`を実行してインストールする
実際は、`/etc/yum.repos.d/td.repo`を保存して`yum update`しているだけ

```bash
$ curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
```

この方法だと常に最新版がダウンロードされるが、いろいろな都合により旧バージョンで試したいときがある
その方法を下記に記載する。

# 方法

現バージョンの確認

```bash
$ td-agent --version
```

出力結果

```bash
td-agent 0.10.55
```

## RPM

```bash
$ rpm -qi td-agent
Name        : td-agent
Version     : 1.1.21
Release     : 0
Architecture: x86_64
Install Date: 2014年10月31日 02時12分37秒
Group       : System Environment/Daemons
Size        : 103551538
License     : APL2
Signature   : DSA/SHA1, 2014年10月20日 13時07分39秒, Key ID 1093db45a12e206f
Source RPM  : td-agent-1.1.21-0.src.rpm
Build Date  : 2014年10月20日 08時31分13秒
Build Host  : ip-10-123-31-198.ec2.internal
Relocations : (not relocatable)
Vendor      : Treasure Data, Inc.
URL         : http://treasure-data.com/
Summary     : td-agent
Description :
```


## パッケージ一覧の取得
td-agentのパッケージは以下のページからダウンロードできる
http://packages.treasure-data.com/

もともとは、`/etc/yum.repos.d/td.repo`の中のbaseurlに記載されていいたのを見つけてきた

```bash
[treasuredata]
name=TreasureData
baseurl=http://packages.treasuredata.com/redhat/$basearch
gpgcheck=1
gpgkey=http://packages.treasuredata.com/GPG-KEY-td-agent
```

## パッケージの入れ替え

### もし前のバージョンをインストールしていたら削除する

```bash
$ sudo yum -y remove td-agent
```

### 任意のバージョンを指定してインストールする

今回は、１つ前のバージョンのパッケージを選択
`td-agent-1.1.20-0.x86_64.rpm`

```bash
$ sudo rpm -ivh http://packages.treasuredata.com.s3.amazonaws.com/redhat/x86_64/td-agent-1.1.20-0.x86_64.rpm
```

### 確認する

```bash
$ rpm -qi td-agent
```

出力結果

```bash
Name        : td-agent
Version     : 1.1.20
Release     : 0
Architecture: x86_64
Install Date: 2014年11月03日 02時39分38秒
Group       : System Environment/Daemons
Size        : 114262465
License     : APL2
Signature   : DSA/SHA1, 2014年06月19日 09時05分57秒, Key ID 1093db45a12e206f
Source RPM  : td-agent-1.1.20-0.src.rpm
Build Date  : 2014年06月19日 07時08分27秒
Build Host  : ip-10-123-31-198.ec2.internal
Relocations : (not relocatable)
Vendor      : Treasure Data, Inc.
URL         : http://treasure-data.com/
Summary     : td-agent
Description :
```

# 参考情報

[The td-agent ChangeLog](http://docs.treasuredata.com/articles/td-agent-changelog)
plistデータを基にclassへマッピング

####目的:plistでリストを作成しそれを独自のclassへマッピングする
####準備1:plist準備
　今回使用したDataは空港のIATAコードと日本名とかを一覧にしたものです。
階層としてはこんな感じにしています。
Root:Dictionary
|-airportlist:Array
の下に各ITEMがDictionaryで配置しています。
各ITEMは以下で構成されています

+ IATA : IATA code
+ ICAO : ICAO code
+ jpAirport : 空港の日本語名
+ Airport　:　英語表記
+ Country　:　国名

####準備2:格納するClassを宣言
準備1のデータを格納するClassを準備します。

```swift:Airport.swift

class Airport: NSObject {
    var IATA:String?
    var ICAO:String?
    var jpAirPort:String?
    var Airport:String?
    var Country:String?
    
    init(iataCode:String, icaoCode:String, jpName:String, name:String) {
        IATA = iataCode
        ICAO = icaoCode
        jpAirPort = jpName
        Airport = name
    }
}
```
以上までが準備段階です。
ここから実際にplistの中身を読んでAirport Classにマッピングしてみます
動作確認だけなので基本的にSingleViewで作っています。

```swift:ViewController.swift
class ViewController: UIViewController {
    
    var list = [Airport]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let path = NSBundle.mainBundle().pathForResource("Airport", ofType: "plist")
        let data = NSDictionary(contentsOfFile: path!)
        
        let airportlist = data?.objectForKey("airportlist") as NSArray

        for airport in airportlist {
			let iataCode:String = airport.objectForKey("IATA") as String
            let icaoCode:String = airport.objectForKey("ICAO") as String
            let jpName:String = airport.objectForKey("jpAirport") as String
            let name:String = airport.objectForKey("Airport") as String
            
            let data:Airport = Airport(iataCode: iataCode, icaoCode: icaoCode, jpName: jpName, name: name)
            
            list.append(data)
            
        }
        
        for item:Airport in list {
            println(item.Airport!)
        }
        
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}
```
####簡単な解説

```swift:ViewController.swift
let path = NSBundle.mainBundle().pathForResource("Airport", ofType: "plist")
let data = NSDictionary(contentsOfFile: path!)
let airportlist = data?.objectForKey("airportlist") as NSArray
```
この部分で準備したplistを読んでいます。dataにDictionaryとして格納しています。
次にairportlistを作成する作業が続いてます。今回は複数個のリストが混じっていないですがobjectForKeyで
"airportlist"を指定しNSArrayとしてリストArrayを作成しています。

```swift:ViewController.swift
for airport in airportlist {
	let iataCode:String = airport.objectForKey("IATA") as String
	let icaoCode:String = airport.objectForKey("ICAO") as String
	let jpName:String = airport.objectForKey("jpAirport") as String
	let name:String = airport.objectForKey("Airport") as String
            
	let data:Airport 
		= Airport(iataCode: iataCode, icaoCode: icaoCode, jpName: jpName, name: name)
            
	list.append(data)      
}
```
次に格納した要素を取り出してAirport objectにマッピングしています。
ここの所をもっとCoolなものにしたかったですが思いつかず・・・。何か良い方法があったら教えてください。

今までObj-cで開発してきたので、swiftに乗り換えましたがかなりいろいろなところで苦労しました・・・。
プロジェクト内のerbファイルのフォーマットを一発で綺麗にするコマンド - Run htmlbeautifier recursively.


# 概要
Railsで複数人で開発しているとERB(テンプレート,view)のフォーマットが次第にグチャグチャになっていく。
そんなときにこのコマンドを実行すればインデントが一発で綺麗になる。

# htmlbeautifierのインストール

コマンドベースでerbをフォーマットしてくれるツール `htmlbeautifier`をインストールする。

    $ gem install htmlbeautifier

# 実行

アプリケーションディレクトリへ移動した以下のコマンドを実行する。

    $ cd path/to/application
    $ for file in $(find . -name '*.erb'); do htmlbeautifier $file; done

# サンプル

```erb:before
<div class="header">
    <p class="logo"><a href="/">ロゴ</a></p>
    <ul class="header_nav">
    <li><span class=""><i class=""></i>メニュー</span></li>
      </ul>
  <div class="menu">
    <ul>
      <li><a class="menu_list_btn">メッセージ</a>
        <ul class="menu_list">
<li><%= link_to "AAAAA", aaaaa_path %></li>
<li><%= link_to "BBBBB", bbbbb_path %></li>
<li><%= link_to "CCCCC", ccccc_path %></li>
<li><%= link_to "DDDDD", ddddd_path %></li>
        </ul>
      </li>
      <li><%= link_to "EEEEE", eeeee_path %></a></li>
  </ul>
</div>
```

↓ こうなる

```erb:after
<div class="header">
  <p class="logo"><a href="/">ロゴ</a></p>
  <ul class="header_nav">
    <li><span class=""><i class=""></i>メニュー</span></li>
  </ul>
  <div class="menu">
    <ul>
      <li><a class="menu_list_btn">メッセージ</a>
        <ul class="menu_list">
          <li><%= link_to "AAAAA", aaaaa_path %></li>
          <li><%= link_to "BBBBB", bbbbb_path %></li>
          <li><%= link_to "CCCCC", ccccc_path %></li>
          <li><%= link_to "DDDDD", ddddd_path %></li>
        </ul>
      </li>
      <li><%= link_to "EEEEE", eeeee_path %></a></li>
  </ul>
</div>
```

# 参考

- http://serverfault.com/questions/289094/prevent-xargs-from-quitting-on-error
- https://github.com/threedaymonk/htmlbeautifierrec
Mac ↔ iPhone間でAirdrop出来ない時の解決方法

こんなツールがあるようです。
https://github.com/dokterdok/Continuity-Activation-Tool/

### 実行方法
  1. 右サイドバーからzipをdownload
  2. zipを解凍して中の`Continuity Activation Tool`を実行
  3. terminalが開き、promptが表示されるので1を押す
      - 場合によっては再起動を促されるので、その場合はCtrl+Cで処理を中止し、再起動後に上記Appを再実行
  4. 処理が終わるの待つ
  5. terminalで再起動を促されるので何かしらキーを押して再起動

なお、上記サイトにも書いてありますがOSの低レイヤーのファイルを操作するようなので
**実行は自己責任で**お願いします。

ちなみに手元のMac mini(Mid 2011)では直りました。

### 参考
https://discussions.apple.com/thread/6601794
http://forums.macrumors.com/showpost.php?p=20015070&postcount=609
AngularJSに挑戦！入門 その３

#はじめに
[前回の記事](http://qiita.com/village/items/de1d79551c66f1d5f0c4)では、詳しく触れなかった$scope変数について少し触れてみます。
スコープ変数は、アプリケーションのモデルを参照するオブジェクトです。
特徴として、Modelの変更を見張るAPIを有してます。
また、評価対象の式 に対してコンテキストを提供します。

難しいことかもしれませんが、簡単に言うと、
・さまざまな関数を使用できる。
・プロパティーの追加・変更・削除が可能。
・プロパティーをViewで参照できるようにする

と言ったところです。本来は、もっといろいろありますが、まずはこれを覚えれば大丈夫と思います。

#実際に使ってみる

```lang:Sample05.js
var MyApp = angular.module('MyApp', []);

MyApp.controller('SampleCtrl', ['$scope', function ($scope) {
    $scope.message = "Hello My Message!";

    $scope.plus = function(value1, value2) {
        return (parseInt(value1) + parseInt(value2));
    }
}]);
```

`$scope.message`は、値を設定しているだけのプロパティーです。
`$scope.plus`は、関数の戻り値を返してます。単純な足し算です。

では、Viewを作成します。

```lang:Sample05.html
<html>
<head>
    <meta charset="utf-8">
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.min.js"></script>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css">
    <script type="text/javascript" src="Sample05.js"></script>
    <title>$scope!</title>
</head>
<body ng-app="MyApp">
    <div class="container">
        <div ng-controller="SampleCtrl">
            <div class="bg-primary">
                <p>{{message}}</p>
            </div>
            <div class="bg-info">
                <input type="text" ng-model="value1"> + <input type="text" ng-model="value2"> = {{plus(value1,value2)}}
            </div>
        </div>
    </div>
</body>
</html>
```

案外簡単に作成できました。

#おわりに
このあたりことは、AngularJSでは基本中の基本です。
まだ、簡単なアプリケーションなので、しっかりと理解しましょう。
私も頑張って理解しているつもりです。
VirtualBoxをAPIから操作

VirtualBoxはコマンドラインから操作が出来たりする訳ですが、
http://qiita.com/zakkied/items/abf43c69fae92e4c5207
もうちょっと色々出来ないかということで、APIを探してみた。

* Pythonから操作
  - http://d.hatena.ne.jp/shisakata/20091208/vboxapi_1
* Rubyから操作  
  - http://dharry.hatenablog.com/entry/20120828/1346096024

２つとも試したがうまく行かなかった、VirtualBoxのバージョンが違うから？

* Node.jsから操作
  - https://github.com/azer/node-virtualbox

 これは出来た。
 
`$ npm install virtualbox`

```
//マシン一覧を出力
var virtualbox = require('virtualbox');
virtualbox.list(function (machines, error) {
  console.log(machines);
  if (error) throw error;
  // Act on machines
});
```

とりあえず、ここまで。
新しく国際化ファイルを追加した時は spring を再起動してやらないと rails console に反映されない


国際化について rails console でいろいろ試しててはまったのでメモ。

以下のように、日本語用の国際化ファイルを新しく追加して、 console で確認しようと思ったのだが、

```config/application.rb
module Hoge
  class Application < Rails::Application
    ...
    config.i18n.available_locales = [:en, :ja]
  end
end
```

```config/locales/ja.yml
ja:
  datetime:
    distance_in_words:
      about_x_hours:
        one: 約1時間
        other: 約%{count}時間
```

```ruby
# $ bin/rails c
Loading development environment (Rails 4.1.6)
> helper.distance_of_time_in_words_to_now 0.25.days.ago
=> "about 6 hours"
> I18n.locale = :ja
=> :ja
> helper.distance_of_time_in_words_to_now 0.25.days.ago
=> "translation missing: ja.datetime.distance_in_words.about_x_hours"
```

という具合に、翻訳が見つからないよ、と怒られてしまった。
server を立ち上げて view から確認すると、きちんと翻訳が見えるのになぜ？？

いろいろ調べた結果、どうやら spring を再起動してやらないと、新しい国際化ファイルが rails console に反映されないらしい。

```shell
$ spring stop
```

```ruby
# $ bin/rails c
> I18n.locale = :ja
=> :ja
> helper.distance_of_time_in_words_to_now 0.25.day.ago
=> "約6時間"
```

## 参考にしたサイト
- [Rails 4.1+: New locale files require a Spring restart - makandropedia](http://makandracards.com/makandra/28273-rails-4-1+-new-locale-files-require-a-spring-restart)
Pythonで複数の宛先にメールを送信する(Python3)

TO,CC,BCCに複数の宛先を指定するときハマったのでメモ
send_messageというメソッドはメッセージオブジェクトをそのまま引数にしてsendmail() を呼び出せると書いてあるので使ってみた。
大変便利だと思う。

http://docs.python.jp/3.3/library/smtplib.html

```py


#!/usr/bin/env python
# -*- coding: utf-8 -*-
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text      import MIMEText

def send_msg(
    from_addr, to_addrs = [], cc_addrs = [], bcc_addrs = [],
    subject = "", body_html = "", body_text = ""):
    msg  = MIMEMultipart('alternative')
    msg['Subject'] = subject
    msg['From']    = from_addr
    msg['To']      = ",".join(to_addrs)

    if cc_addrs !=[]:
        msg['Cc'] = ",".join(cc_addrs)
    if bcc_addrs !=[]:
        msg['Bcc'] = ",".join(bcc_addrs)

    cset = 'utf-8'

    if body_text != "":
        attachment_text = MIMEText(body_text, 'plain', cset)
        msg.attach(attachment_text)

    if body_html != "":
        attachment_html = MIMEText(body_html, 'html' , cset)
        msg.attach(attachment_html)

    smtp_con = smtplib.SMTP('localhost',25)
    smtp_con.set_debuglevel(True)
    smtp_con.send_message(msg = msg)
    smtp_con.close()
```
作成したアプリを端末へインストール後　開く　が選択できない場合

#症状
マーケットからインストールしたり
apkからインストールしたり
Eclipseなどから直接インストールしたりしても開けない(ドロワーにも表示されない)時

#対処方法
AndroidManifest.xmlでActivityに対してintent-filterを設定し　起動直後のActivityを設定しますが、
その際`android.intent.action.MAIN`と`android.intent.category.LAUNCHER`だけは独立させる必要があります。

```xml:AndroidManifest.xml
<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
```

###参考
http://stackoverflow.com/questions/8109572/multiple-android-intent-action-main-in-mainfest-xml-file/8109621#8109621
WebViewでスクロール時のタッチ情報を取得する


##背景
WebViewにはListView#onScrollStateChangedのように、スクロール時のタッチ情報を取得できる仕組みがありません。
GestureDetector.OnGestureListenerをimplementしてあげることで、詳細なスクロール情報を取得できますが、これだと指を離した状態(Motion.ACTION_UP)がうまく取得できません。(多分。onFling()メソッドの引数情報を工夫すれば取得できそうでしたが、大変そうです)

そこでWebViewのソースコードを読んでみると、onTouchEvent()というメソッドがありました。これをカスタマイズしてあげることで、スクロール時のタッチ情報を取得できるようにします。

##やり方
カスタムWebViewを作ります。

```java

public class CustomWebView extends WebView{


    private OnTouchEventCallback mOnTouchEventCallback;

    public CustomWebView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        
    }

    public CustomWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
        
    }

    public CustomWebView(Context context) {
        super(context);
        
    }

    public void setmOnTouchEventCallback(final OnTouchEventCallback onTouchEventCallback){
        mOnTouchEventCallback = onTouchEventCallback;
    }

    //(※)コールバック関数に渡してあげる。
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        
        if(mOnTouchEventCallback != null) mOnTouchEventCallback.onTouchStateChanged(event.getAction());
        return super.onTouchEvent(event);
    }


    public static interface OnTouchEventCallback
    {
        public void onTouchStateChanged(int state);
    }
}
```

(※)の部分で、WebViewのonTouchEvent()をオーバーライドして、コールバック関数に渡してあげることで、別のクラスからこのCustomViewを定義すれば、スクロール時の情報をよしなに扱うことができます。
注意すべきなのは、返り値で super.onTouchEvent(event)を呼ぶことです。これを呼ばないと、スクロールができなくなります。  
このCustomWebViewをActivityやFragmentで利用する場合は以下のようにします。


```java

public class HogeActivity extends Activity{
    private CustomWebView mWebView;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        setContentView(R.layout.activity_hoge);
        mWebView = (CustomWebView) view.findViewById(R.id.web_view);
        //スクロールのタッチ情報をよしなに処理する
        mWebView.setmOnTouchEventCallback(new CustomWebView.OnTouchEventCallback(){

            @Override
            public void onTouchStateChanged(int state) {
                switch(state){
                    case MotionEvent.ACTION_DOWN:
                    case MotionEvent.ACTION_MOVE:
                        scrollMoved();
                        break;
                    case MotionEvent.ACTION_UP:
                        scrollStopped();
                        break;
                }
            }
        });
    }
}

```

activity_hoge.xmlでカスタムビューを定義します

```xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
>

    <com.tomoima.hogeapp.ui.view.CustomWebView
        android:id="@+id/web_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
         />

</FrameLayout>

```
CABasicAnimation利用時にUIViewアニメーションのBeginFromCurrentStateと同じ効果を得る

```swift
let animatedLayer = CAShapeLayer()
// animatedLayerの設定

let anim = CABasicAnimation(keyPath: "path")
anim.fromValue = (animatedLayer.presentationLayer() as? CAShapeLayer)?.path
anim.toValue = toPath
anim.duration = 0.25
anim.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
anim.removedOnCompletion = false
anim.fillMode = kCAFillModeForwards
animatedLayer.addAnimation(anim, forKey: "MyPathAnimation")
```

#### 補足
`-addAnimation:forKey:`でkeyをnilにするかどうかで`fromValue`を設定するかが決まる。

* keyを`nil`にする場合は、`fromValue`は設定しない
* keyに何か設定する場合は、`presentationLayer`を利用して`fromValue`を設定する

これに加えて、`animatedLayer`に追加した`anim`とその状態を残すようにする。

また、`animatedLayer`はアニメーション終了後、非表示にすることを想定しているため、実際にレイヤーの値の更新（`animatedLayer.path = toPath`）は行っていない。
[翻訳] 私のコミットをまとめないで

## はじめに
RubyのコミッターでもありRailsなどの多くのOSSで活躍されている[Marc-André Lafortune](https://github.com/marcandre) さんのブログに面白い記事があったので筆を取りました.
（許可は取りましたヨ）

[Why I Won't Squash My Commits](http://blog.marc-andre.ca/2014/02/05/why-i-wont-squash-my-commits/)

*注釈 [...] で記された文章は原文には存在しない私の注釈であるので留意されたいです.

翻訳に至らない所があれば編集リクエスト待ってます.

## 要約

1. PR,feature単位でcommitをまとめるかどうかでRailsのプロジェクト上などで揉めた.

2. それぞれのcommitは独立してるいるはずだからまとめる必要はない

3. 仮にどうしてもまとめたいなら自分でやるべきだし人にその考え方を押し付けるな
(まあ実際は皆いい人だから理解してくれるけど）

この方は徹底してcommitを最小の変更単位で分けて、
それぞれが独立してテストを通るように心がけている姿が印象に残りました.
(しないといけないと分かっていても僕は大きくなってしまいます... :(



## 以下翻訳

### 概要
私のpull requestに対して多くのコメントを頂ける事を大変感謝する一方で、中には少し理解に苦しむものもある.

私のコミットに対して（`git merge --squash`などで）まとめろと言わないで欲しい.

https://github.com/rails/rails/pull/8267#issuecomment-11551706

https://github.com/rails/rails/pull/13938#issuecomment-34061339

*注釈 [上記のRailsプロジェクトのやり取りの中で「マージするからコミットをまとめてもらえる？」というやり取りがある. まとめるメリットはfeature単位、pull-request単位でコミットを１つにした方がそのfeatureやpull-requestに関する backport/revertが容易になる所にある.]

各プロジェクトのコミッターらの素晴らしい仕事に対して失礼ながら、私はコミットをまとめたいとは思わない. だから私にまとめろ言わないで欲しい.

例えば5つのコミットからなるpull requestがあったとして、もし私が何もミスをしてなければ、この5つのコミットはそれぞれ独立しているはずで、それらをわざわざまとめるべきでないと思っている.

もしどうしてもまとめたいならば各プロジェクトのコミッターは自分でやるべきで、
誰かがまとめるのを待ったり、はたまたrejectするべきでない.

私の主張は気が狂っているだとかエゴだとか言われるかもしれない、
が私は私のコミットをまとめたくない.
まあしかし幸いな事に多くのコミッターは私がこの提案を穏やかにしているためか、
攻撃的な態度を取る事なく受け入れてくれる.

### 私のコミットをまとめないで欲しい理由

私が思うに多くのcontributor達が歴史的な理由もあって`git`や`git rebase -i`をよく思わない事が主な理由で、彼らがコミットをそれぞれ独立させるのではなく、思いつくままにコミットを作ってしまう事がいけないのではないかと思っている.

例えばこんな感じ

* 素晴らしいfeatureを思いつき、手をつける
* しまったtypoしてた直さないと
* しまったバグを直さないと
* featureを仕上げる

この様なcontributor達がもし、そのままのcommitをpull-requestに出して、それが受け入れられない（つまりマージされない）という事は当然の報いだとは思うが、

多くのcontributorは`git rebase -i` と`git commit -p`を用いて修正をしている訳で、
この様なcommitは受け入れられるべきだと思う.


ほかの理由としては[ここでも述べたが](https://github.com/rails/rails/pull/8267#issuecomment-11558238)
もしコミットをまとめてしまうとpull-requestの一部に対するbackport/revertはむしろ複雑になってしまう.
もっと言えば、pull-request全体に対するbackport/revertも`git revert`と`git cherry-pick`を「コミットの範囲を指定」とするか「マージ済みのコミット」とすればそんなに大変ではないはずだ.
そもそもbackport/revertはそんなに頻繁に起こるものでもない(全体の2%以下）


### どんな時にコミッターはコミットをまとめろと言うべきでないか

もしそれぞれのコミットが独立しているとしたら（つまりそれぞれのコミット、どの部分で切ってもテストが通る状態）まとめる必要はないし、まとめるなとさえ言うかもしれない.

私のコミットは往々にしてそれぞれ最小の変更でそれぞれがテストを通るような構成になっている.
中にはトリビアな変更が多く含んでいるなど例外もあるが（スペースの削除、多くのタイポの修正、変数名の変更など）まあそれでもdocのtypoの修正と変数名の変更を一緒にコミットしようとは思わない.

私はリファクタリングを行う時は大抵、小さな独立したコミットにする事を心がけている.
そちらの方が理解もしやすくマージなどの判断も容易いと思うからだ.

良い例が[ここ](https://github.com/sdsykes/fastimage/pull/27)にある.
これは一つのbugを修正するためのpull-requestだが私は15つのコミットに分けた.
それぞのリファクタ１つ１つはしかるべく順序で並んでおり、最後の１つだけがbugの修正それ自体なのだ.

こちらの方がコミットを１つにまとめられてdiffに多くの変更が一度に出てくるよりは、それぞれの変更に間違いがないか確認するのが容易である. これをまとめろというのは理解にくるしむ.

私は別に全ての人にこの様にコミット１つ１つに気を使って構成せよと言ってるのではない.
１つ１つ丁寧に分けられたコミットをそのままにしておけと言ってるだけだ.
もしこの考え方が理解できずあなたはコミットをまとめると主張しても、少なくとも他人がこの様な考え方を持っていたらの受け入れるように努力はすべきである.
Yosemiteのクリーンインストールの自分用メモ


次のアップデートでたぶん同じことをするので記録を残しておく。

インストールUSBを作る
---------------------------

[OS X Yosemiteの起動USBメモリを作ってクリーンインストールする方法](http://egg-is-world.com/2014/10/22/yosemite-usb-clean-install/)

```shell-session
sudo /Applications/Install\ OS\ X\ Yosemite.app/Contents/Resources/createinstallmedia --volume /Volumes/Untitled --applicationpath /Applications/Install\ OS\ X\ Yosemite.app --nointeraction
```

ディスクを消去しつつクリーンインストールしつつ、ユーザーファイルの復旧も選択
---------------------------------------------------------------------------------

[【Mac】OS X Yosemite（ヨセミテ）をクリーンインストールする方法。](http://wayohoo.com/mac/tips/how-to-clean-install-os-x-yosemite.html)

途中でTimeMachineからのユーザーファイルのみの復旧を選択する。

最後の1分が3時間くらいかかるけどとにかく待っておく。

環境の復旧
---------------------------

### AppStoreから購入済みのアプリケーションをインストール

Xcode, Kobitoなど。なんか購入済みに入ってなかったのもあったけど気のせいかなあ。

### コマンドラインツールを入れる

ターミナルで`git`とか叩いてコマンドラインツールのインストールを起動させる。

### homebrewで`/usr/local`以下を復旧

```shell-session
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

http://brew.sh/

`brew bundle`動かなくなったけど今後はどうしよっかね。

[BrewfileをShell Scriptに変換するRuby Script · GitHub](https://gist.github.com/unasuke/465d360e73a9718d8980)

### 手動でインストールしたもの

* http://www.geocities.jp/coo_ona/viewer.html
* http://www.geocities.jp/aromaticssoft/stackroom/
* http://hetima.com/hetimazipql/


### finder, dockのリセット

以下のファイルを削除

```
~/Library/Preferences/com.apple.finder.plist
~/Library/Preferences/com.apple.dock.plist
```

### Virtualboxのファイルの復旧

`VirtualBox VMs`のファイルはTimeMachine管理下から外して、手動でバックアップを取っているので、それをまた手動で戻す。

環境の復旧 (会社Macに手動でいれたもの)
--------------------------------------

* Microsoft Office for Mac
* Lync for Mac
* Java SDKs
* Intellij IDEA
メールアドレスの区切り文字を使いprocmailの処理を変えると便利

## postfix側の設定

* owner+nagios-tokyo@mydomain.com にメール送信。

owner@mydomain.com のメールボックスに届くことを確認。出来なければ以下を確認

```bash:/etc/postfix/main.cf
recipient_delimiter = +
```

## procmail側

```bash:
:0 c
*^To:.*owner\+tokyo@.*
* ^Subject:\/.*
| /usr/bin/php ~/bin/twitter_nagios_d.php "$MATCH"
```

この例では件名をphpの引数で渡している。

## fromを指定して送信

```bash:
date | mail -s "test" owner@mydomain.com -- -f  nagios@myserver.com
```

`-- -f`で指定が出来る。
Ansible でなんちゃってテンプレートヒエラルキー。template と with_first_found の組み合わせをテストした。

# テンプレートヒエラルキーを作ってテストしてみた

* 1プロジェクトファイルで環境毎にinventoryを分けている
* グループ毎に同じファイルをコピーしたり、テンプレートでの配布をする。
* たまにホスト固有のファイルに変えるかも
* まぁ具体的には /etc/hosts ファイルとかｗ（みなまでいうな
* template ファイル自体に処理を押し込んでj2のお世話になりたくなかっただけ。見通し悪くなるし
* 他にもっといいやり方があったら教えて欲しい
* こんだけコード掲載するなら大人しくgithubにあげたほうがいいかもしれない
* とはいえ bitbucket のプライベートリポジトリで書いてるから面倒なんだよ。。ｗ

# inventory

inventory/local
<pre>
[ifg_local]
web
mng
db
[web]
host1
[mng]
host2
[db]
host3
</pre>

inventory/stg
<pre>
[ifg_stg]
web
mng
db
[web]
stg_host1
[mng]
stg_host2
[db]
stg_host3
</pre>

* <a href="http://qiita.com/raki/items/3f9230d98cf4b8e1d07a">前の記事</a>にも書いたけど、ansible.cfg で inventory ファイルを切り替えて使っている

# playbook

* 次の hosts role を読んで（include）るだけ（省略）

# roles/hosts/tasks/main.yml

<pre>
- name: hosts | copy to /etc/hosts
  # template: src={{ item }} dest=/etc/hosts group=root owner=root mode=0644
  # debug で見たほうがわかりやすいかも
  debug:
  with_first_found:
    - files:
        - hosts.{{ inventory_hostname }}.j2
        - hosts.{{ ansible_hostname }}.j2
        - hosts.{{ group_names[3] | default('x') }}.j2
        - hosts.{{ group_names[2] | default('x') }}.j2
        - hosts.{{ group_names[1] | default('x') }}.j2
        - hosts.{{ group_names[0] | default('x') }}.j2
        - hosts.j2
      paths:
        - ../templates/
</pre>

# roles/hosts/templates/

優先度高い順
<pre>
hosts.host1.j2   # host1固有(inventory_hostname)
hosts.web.j2     # web グループ固有(ansible_hostname)
hosts.ifg_stg.j2 # ifg_stg グループ固有（group_names）
hosts.j2         # ifg_localのweb以外
</pre>

hosts.x.j2 を作らないこと。default() の中を変えたらなんでもいいけど。

# たぶん

* 実際には ifg_XX ってつけた一番大きいグループレベル（inventory毎≒環境毎）でファイルを作って、hosts.j2 は使わない
* inventory_hostnameで固有を作るのがメイン
* どうしても必要になったら、with_first_found に hosts.{{ group_names[x] }}.{{ inventory_hostname }}.j2 は作ると、使い勝手があがるかもしれない

# 本当は

* with_first_found の中で一発で一番大きい所属グループ名（例でいえば ifg_XX）を取得したかったんだけど、うまくいかなかった
* j2 template 内でなら<a href="http://docs.ansible.com/playbooks_variables.html#magic-variables-and-how-to-access-information-about-other-hosts">出来るのは知ってる</a>
* <a href="http://qiita.com/raki/items/34193b562f0bfff87c38">前記事</a>の空ループと一緒でかっこ悪いのは認識してるｗ
spotlightでsleepできるようにする

# さようならAlfread

　Macユーザーには必須のランチャー[alfred](http://www.alfredapp.com/)。spotlightでは出来ない機能の一つとして、「screensaver」でスクリーンセーバー状態に入って、「sleep」でマシンがスリープするSystem機能がある。ショートカットとか覚えるのは苦手なので、コマンドで実行できるのが重宝していた。
これがspotlightで実現できたら、もうAlfread外してspotlightでいいような気がしてきたので、spotlightからsleepできるようにした。

# コマンドラインからスリープできるようにする

~/bin/sleepコマンドを作成。

```
$ emacs ~/bin/sleep
#!/usr/bin/osascript
tell application "Finder" to sleep
```

これで、コマンドラインでsleepとうてばマシンをスリープできるようになる。
sleepという名前は/bin/sleepとかぶるから、気になる人はmac_sleepとか適当な名前にしておいたほうがいいのかも。ぼくはspotlightからsleepと入れたいから、痛い目にあうまではこのままにしておくつもりだけど。

# ターミナルの設定

 sleepから復帰した時 [Process completed] のウインドウが残ってウザい人は、下記の設定で自動的に閉じるように設定。

> 設定 → Profiles → Shell → When the shell exits: を「Don’t close the window」から「Close if the shell exited cleanly」に変える

# spotlightから呼び出す

　ここまでの処理が出来上がっていれば、普通にspotlightにsleepと打てばsleepコマンドでスリープさせることができるはず。

![Spotlight_and_New_-_Qiita_and_1__bash_and_Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/30743/d1cd78ad-4dca-8d4a-5677-6eee3fe03c8b.png)

# おまけ

　同様にしてshutdownとかscreensaverとかも実現できます。

### shutdown

```
#!/bin/sh
osascript -e 'tell application "Finder" to shut down'
```

### screensaver
```
#!/usr/bin/osascript
tell application "System Events" to start current screen saver
```

### desktop

```
#!/bin/sh
/Applications/Mission\ Control.app/Contents/MacOS/Mission\ Control 1
```
昔あったような全部のウインドウを最小化する(あとで戻すのがめんどくさい)あれではなくて、OS標準のMissionControlの機能。一時的に全てのウインドウが隠れてデスクトップが見えるようになり、画面端をクリックすれば全てのウィンドウが元の位置に戻ります。
Setup Octopress


まだ実導入していないのですがとりあえずメモしておきます。

1- Octopress を取ってくる

```bash
git clone git://github.com/imathis/octopress.git octopress
cd octopress
```

2- rbenv 経由で使用したいバージョンのrubyをインストールし、localにセットした上で、bundler経由で依存gemのインストール

```bash
rbenv install 2.1.3
rbenv local 2.1.3
bundle install
```

3- デフォルトの Octopress テーマをインストール

```bash
$ bundle exec rake install
## Copying classic theme into ./source and ./sass
mkdir -p source
cp -r .themes/classic/source/. source
mkdir -p sass
cp -r .themes/classic/sass/. sass
mkdir -p source/_posts
mkdir -p public
```

### Ref.

* http://octopress.org/docs/setup/
Vector参照渡し

```lang:c++
#include <iostream>
#include <vector>

using namespace::std;

class Num {
private:
	int _num;
	
public:
	Num(int num) {
		this->_num = num;
	}

	void dump() {
		cout << this->_num << endl;
	}
};

class Foo {
private:
    vector<Num>* _vec;

public:
    void setVec(vector<Num>* vec) {
        this->_vec = vec;
    }

    void dumpVec() {
    	for(vector<Num>::iterator it = this->_vec->begin();
    		it != this->_vec->end();
    		it++) {
        it->dump();
    	}
    }
};

int main() {
    vector<Num> vec;
    vec.push_back(Num(10));
    
    Foo *foo = new Foo();
    foo->setVec(&vec);

    vec.push_back(Num(20));

    foo->dumpVec();

    delete foo;
    foo = 0;

    return 0;
}
```
RailsとBackbone.jsでサンプルを作ってみた

Backbone.js を使ったプロジェクトにアサインされる予定なのでサンプルを作ってみた。

サンプル恒例のTodo Listになってます。

heroku:
http://yos-backbone-sample.herokuapp.com/

github:
https://github.com/yoshioota/backbone-sample

CRUDは出来た感じ。routesの使い方とかがまだイマイチなんだよね。どうやるのがいいんでしょう。。

やっぱjQueryが使えるっていうのは安心感がありますね！
StaticWordValueEncoder

# 前置き
http://www.programcreek.com/java-api-examples/index.php?api=org.apache.mahout.vectorizer.encoders.FeatureVectorEncoder

のCode Example 1を動かしてみる。

※ソースコードの要所要所にコメント残してみた。

# ソースコード

```clj
(ns mahout-clj.core
  (:import [org.apache.mahout.vectorizer.encoders StaticWordValueEncoder]
           [org.apache.lucene.analysis.standard StandardAnalyzer]
           [org.apache.lucene.util Version]
           [java.io StringReader]
           [org.apache.lucene.analysis.tokenattributes CharTermAttribute]
           [org.apache.mahout.math RandomAccessSparseVector]
           [org.apache.mahout.math SequentialAccessSparseVector]))

;; http://www.programcreek.com/java-api-examples/index.php?api=org.apache.mahout.vectorizer.encoders.FeatureVectorEncoder

;#StaticWordValueEncoder
;
;Encodes a categorical values with an unbounded vocabulary.
;無制限の語彙でカテゴリ値を符号化する。
;Values are encoding by incrementing a few locations in the output vector with a weight that is either defaulted to 1 or that is looked up in a weight dictionary.
;値はデフォルト1もしくは重み付け辞書のどちらかの重みによって出力ベクトルのいくつかの場所をインクリメント
;↑全く分からん(´；ω；｀)
;By default, only one probe is used which should be fine but could cause a decrease in the speed of learning because more features will be non-zero.
;デフォルトでは唯一の探査は上手く動くだろう。しかし、より多くのfeatureはゼロではないため、学習スピードの低下を引き起こす。
;If a large feature vector is used so that the probability of feature collisions is suitably small, then this can be decreased to 1.
;もし機能衝突の確率が適当に小さい大きなfeature vectorが使用された場合、1に減少させることが出来る。
;If a very small feature vector is used, the number of probes should probably be increased to 3. 
;もしとても小さなfeature vectorが使用された場合、探査の数はおそらく3に増やす必要がある。
(def encoder (StaticWordValueEncoder. "text"))

;#StandardAnalyzer
;Analyzerクラスは、テキスト文字列から単語を抽出してTokenStreamオブジェクトの形で出力するのに使われる
;http://lucene.jugem.jp/?eid=47
(def analyzer (StandardAnalyzer. (Version/LUCENE_40)))
(def reader (StringReader. "text to magically vectorize"))

;#TokenStream
;一連のTokenであるTokenStreamは、テキスト文字列をAnalyzerで分析した結果であるところのtokenStream()メソッドの戻り値として取得できる。
;http://lucene.jugem.jp/?eid=50
(def token-stream (.tokenStream analyzer "body" reader))

;#CharTermAttribute
;http://d.hatena.ne.jp/shinobu_aoki/20120128/1327762530
(def char-term-attribute (.addAttribute token-stream CharTermAttribute))
(.reset token-stream)
(def v1 (RandomAccessSparseVector. 100))

(loop []
  (when (true? (.incrementToken token-stream))
    (let [x (String. (.buffer char-term-attribute))]
      (println x)
      (.addToVector encoder x 1.0 v1))
    (recur)))

(.toString v1)

(.end token-stream)
(.close token-stream)
```

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/39243/59bc2b67-202a-1ac6-0d53-b1b228603dd2.png)

# 終わりに
なんやこれ、何がしたいんや（困惑）

kuromoji使えばええやんけ

あと、、、
・・・とりあえず英語が出来ないことを改めて認識した。
例外は劣化GOTO

例外の悪い点は何故かcatchしなくてもコンパイルできることである。
catchしてない例外が起きると当然プログラムが落ちるかOSが例外表示を出す。
まだ、行き先が一意に決まるGOTOの方がマシである。
例外を投げることは、致命的欠陥の原因をプログラムに埋め込むのと同義である。
例外でネストの深いところから一気に抜けたとしても、適切に復帰やロールバック処理をしないと安全は保証されない。
深いネストが必要な大規模なプログラムを例外を使ってバグ無く組む自信は無い。
それをやるくらいなら、1段ずつ適切にreturnした方がマシだと思う。

たとえ以下のように．．．で受けても何も問題は解決しない。

```cpp
//パターン1
catch(...){ //honyarara }
//パターン2
catch(CException e)
{ //CExceptionはMFCの例外
e-Delete();
}
```

例外で投げられたものがオブジェクトの場合、解放処理が必要な場合があるからである。
MFCの例外はDeleteを呼んで消さないとメモリリークするので．．．で受けてはいけない。
それにパターン2はバグっていて、例外をキャッチできない。

```cpp
catch(CException *e){e-Delete();}
```

正解はこのようにポインタで宣言しなければならない。
これもコンパイルエラーにもならないのでcatch漏れの原因になる。
実体もポインタもthrowできる所為でこんな間違いが起きるのである。

##まとめ
C#みたいにusing出来ればメモリリークは防げそうだが無論出来ない。
例外は割り込みなので、手続き型言語と相性が悪いと思う。
例外を複数種類投げるのは非生産的である。
エラーの種類を知りたいならエラーコードでも返せばいいだけだ。
例外の種類だけcatch文を並べるくらい馬鹿らしいことはない。
HipChatとGitHubを連携させよう！


##できること：チャットで自動的に情報一元化しようぜ！
HipChatを導入したばっかりのあなたに伝える、便利機能！
pushしたり、branchを切ると、HipChatで通知してくれる。
最近モダーンな[**ChatOps**](https://event.atmarkit.co.jp/events/4414b2d5f0f74e43f7947d7ba7a581b6/atmarkit_report)というワークフローに近づけます！

##やり方
**超・簡・単！**
ですが、なぜかこのやり方のブログが見つからなかったので書き残しておきます〜
（簡単すぎてかいていないのか・・w）

###①[HipChatにブラウザでログイン](https://www.hipchat.com/sign_in)

---

###②Rooms→連携したいRoomを選択→Integrations
![スクリーンショット 2014-11-02 22.40.42.png](https://qiita-image-store.s3.amazonaws.com/0/53303/52709c30-4f73-02cb-118c-134d2c65612a.png)

※Integrationsが表示されない場合、権限が足りていない可能性があります
　管理者が別にいる場合は、権限を変更してもらいましょう

---

###③GitHubを選択して、ログイン(Authenticate with GitHub)
![スクリーンショット 2014-11-02 23.17.59.png](https://qiita-image-store.s3.amazonaws.com/0/53303/a18d3948-fd7d-1948-d222-4957ba69bde8.png)

---

###④リポジトリを検索→「+」ボタンで選択
![スクリーンショット 2014-11-02 23.20.25.png](https://qiita-image-store.s3.amazonaws.com/0/53303/6465c9e2-68a6-6f3f-2611-c2c009e47b91.png)

---

###⑤完了！！
HipChatのお目当てのRoomにこんな表示がでたら成功です！おめでとうー！！
![スクリーンショット 2014-11-02 22.55.55.png](https://qiita-image-store.s3.amazonaws.com/0/53303/7aa03717-52cc-1855-f6f1-1dd7acd8f0f1.png)
CygwinのターミナルにカラースキームSolarizedを適用する

# 前提環境
- OS: Windows8.1 Pro 64bit
- Cygwin 64bit

## Cygwin(64bit)のターミナルにSolarizedを適用する

CygwinをWindowsに入れたときに、他のマシン／ツールでも利用している**カラースキーム・Solarized** を使ってみたくなり、調べてみた。

## mintty-colors-solarizedのダウンロード

[GitHubリポジトリ](https://github.com/mavnn/mintty-colors-solarized) からmintty-colors-solarizedのソースを任意のフォルダにダウンロードする

## Cygwinの設定ファイルにカラースキームの設定を追加

ダウンロードしたフォルダの中に`sol.dark`と`sol.light`というファイルがあるので、好きなテーマを選んでCygwinの設定ファイルに追加する。

この際、他のいくつかのエントリではユーザーのホームディレクトリに置いてある`.bashrc`や`.bash_profile`に追加すると書かれてたりしたが、自分の環境ではうまく反映されなかった。

### 設定ファイルの場所

Cygwinの配置されているディレクトリ(`C:\cygwin64\`など)の下の `/etc/bash.bashrc` というファイルに下記を追加すればいい。

```
source /path_to_dir/sol.light
```
または、

```
source /path_to_dir/sol.dark
```

あとは、Cygwinのターミナルを立ち上げなおせばSolarizedが反映されるはずだ。


- 参考ページ： [minttyにカラースキームを適用する - Smart Gadget Laboratory](http://smartgadgetlaboratory.blogspot.jp/2012/03/mintty.html)
Ansible ～templateモジュール～

Ansible Documentationのtemplateモジュールの内容のメモです。

# Ansible Documentation

## 概要
- テンプレートモジュールは、指定したテンプレートのファイルを設置する
- テンプレートはJinja2というテンプレート言語で記述される

## オプション
|頻度|パラメータ     |必須|デフォルト値      |選択肢                                               |説明                                                                      |
|:--:|:--------------|:--:|:----------------:|:---------------------------------------------------:|:-------------------------------------------------------------------------|
|    |backup         |no  |no                |yes<br>no                                            |コピー前に元ファイルのバックアップをタイムスタンプ情報を付加して取得する。|
|※  |dest           |yes |-                 |-                                                    |コピー先の絶対パスの指定。                                                |
|    |force          |no  |yes                |yes<br>no                                            |既にファイルが存在する場合置き換えない。(要確認)                          |
|※  |group          |no  |-                 |-                                                    |chownコマンドで設定できる所有者グループの設定。                           |
|※  |mode           |no  |-                 |-                                                    |chmodコマンドで設定できる権限設定。8進数の指定とシンボリックモード(例を参照)での指定が可能。|
|※  |owner          |no  |-                 |-                                                    |chownコマンドで設定できる所有者ユーザの設定。                             |
|    |selevel        |no  |s0                |-                                                    |selinuxのレベル。                                                         |
|    |serole         |no  |-                 |-                                                    |selinuxのロール。                                                         |
|    |setype         |no  |-                 |-                                                    |selinuxのタイプ。                                                         |
|    |seuser         |no  |-                 |-                                                    |selinuxのユーザ。                                                         |
|※  |src            |yes |-                 |-                                                    |ローカルにあるJinja2テンプレートのパス。絶対パス、相対パスでの指定が可能。|
|    |validate       |no  |-                 |-                                                    |コピー前に実行される検証コマンド。検証するファイルのパスは例のように『%s』で指定することが可能。|

## 例
```yaml:example.yml
# Example from Ansible Playbooks
- template: src=/mytemplates/foo.j2 dest=/etc/file.conf owner=bin group=wheel mode=0644

# The same example, but using symbolic modes equivalent to 0644
- template: src=/mytemplates/foo.j2 dest=/etc/file.conf owner=bin group=wheel mode="u=rw,g=r,o=r"

# Copy a new "sudoers" file into place, after passing validation with visudo
- template: src=/mine/sudoers dest=/etc/sudoers validate='visudo -cf %s'
```

# 参考
- Ansible Documentation  
http://docs.ansible.com/template_module.html
RDS用のお手軽mysqldumpを検討した

##概要
RDSにオンプレのMySQLのデータをインポートするために、mysqldumpコマンドの出力を使うことがある。データベース単位でダンプする方法については、ドキュメントにも記載されているが、ちょっとめんどい時がある。

http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MySQL.Procedural.Importing.SmallExisting.html

そこで、スクリプトで必要なデータベースを全部持ってくる(mysqlデータベース等が含まれないように)ようにすればいいのだが、viewも持ってきたい！みたいな要件がある場合、RDSでは下記のようなことを考える必要がある。

https://forums.aws.amazon.com/message.jspa?messageID=296097

##簡単な設計メモ
とりあえず今回は、不要なデータベースをダンプする際に外す、DEFINERを変更する二点を検討した。今のところは、これで必要なデータベースを抜き出して、インポートすることができた。

具体的には以下の2つを実装して検証した。

* mysql、information_schema、performance_schema、innodbデータベースをダンプ対象から外す
* DEFINERにCURRENT_USERを指定するようにする。

##ソースコード

ダンプファイルを指定したら、そのファイルに加工されたsqlが出力されるようにしてみた。

```bash
# ruby mysql-rds-dump.rb [--dumpfile dumpfile] [-h hostname] [-u username] [-p password] [-s socket]
```

https://github.com/kentaost/mysql-rds-dump/blob/master/mysql-rds-dump.rb

```ruby:mysql-rds-dump.rb
require 'optparse'
require 'mysql'

# ruby mysql-rds-dump.rb [--dumpfile dumpfile] [-h hostname] [-u username] [-p password] [-s socket]

ignore_databases = ["mysql", "information_schema", "performance_schema", "innodb"]
options = {}

opt = OptionParser.new

opt.on("-d VALUE", "--dumpfile VALUE", 'dumpfile') do |v|
  options[:dumpfile] = v
end
opt.on("-h VALUE", '--hostname VALUE', 'hostname') do |v|
  options[:hostname] = v
end
opt.on("-u VALUE", '--username VALUE', 'username') do |v|
  options[:username] = v
end
opt.on("-p VALUE", '--password VALUE', 'password') do |v|
  options[:password] = v
end
opt.on("-s VALUE", '--socket VALUE', 'socket') do |v|
  options[:socket] = v
end
opt.parse!(ARGV)

if File.exist?(options[:dumpfile])
  puts "#{options[:dumpfile]} already exists..."
  abort
end

con = Mysql.new(options[:hostname], options[:username], options[:password], nil, nil, options[:socket])

res = con.query('SHOW DATABASES') 

res.each do |databases|
  if !ignore_databases.include?(databases[0])
    `mysqldump -h#{options[:hostname]} -u#{options[:username]} -p#{options[:password]} --socket #{options[:socket]} --single-transaction --compress --order-by-primary --no-autocommit --databases #{databases[0]} >> #{options[:dumpfile]}`
  end
end

File.open(options[:dumpfile], "r") do |inf|
  buf = inf.read
  buf.gsub!(/DEFINER=\`.*\`@\`.*\`/, "DEFINER=CURRENT_USER")
  File.open(options[:dumpfile], "w") do |outf|
    outf.write(buf)
  end
end

con.close
```
ゴルーチン(2) チャンネル

goroutine 内でループさせてチャンネルで受けとってみる

```go
func main() {
  ch := make(chan int)
  defer close(ch)
  go func() {
    for i := 0; i < 10; i++ {
      ch <- i
    } 
  }()
  for n := range ch {
    println(n)
  }
}

```
これ、いけそうなんだけど一番最後にエラーが表示される

```エラー
fatal error: all goroutines are asleep - deadlock!
```

さっき覚えた sync.WaitGroup ではどうか

```go
import "sync"

func main() {
  ch := make(chan int)
  defer close(ch)
  wg := &sync.WaitGroup{}
  wg.Add(2)
  go func() {
    for i := 0; i < 10; i++ {
      ch <- i
    }
    wg.Done()
  }() 
  go func() {
    for n := range ch {
      println(n)
    }   
    wg.Done()
  }() 
  wg.Wait()
}
```

これもやはり同じエラーが発生する。
(deferをコメントアウトしたら正常に動作したと記載していたが、間違い)


[追記]
コメントで指摘していただいた点を反映してみると正常動作した。

```go
func main() {
  ch := make(chan int)
  go func() {
    for i := 0; i < 10; i++ {
      ch <- i
    }   
    close(ch) // ここでclose
  }() 
  for n := range ch {
    println(n)
  }
}
```