OmniAICreator/Qiita-1.07M huggingface dataset:
Windows上でSymfony2をインストール

#はじめに

Windows上にSymfony2をインストールするためにはどうするのか？
いろいろ調べていると結構難しいです。
インストールの仕方は千差万別あり、どれが正解というわけではありません。

情報量として、Linux,Macなどにインストールする方法が多いので、同じ方法で行えるようするのが、
あとあと良いのではと思います。そこで、Windows上でもLinux,Macなど同じ方法でインストールしてみます。

#curlのインストール

[公式サイト](http://curl.haxx.se/)からダウンロードします。

1. サイトの"Download"から、Windowsのbinaryをダウンロードします。
2. zip形式なので、解凍して任意の位置に格納します。
3. "コントロールパネル" -> "システムとセキュリティ" -> "システム" -> "システムの詳細設定" -> "詳細設定タブ"の環境変数ボタンをクリックします。
4. PATHにcurlをインストールしたパスを追加します。（区切り文字は;です。）

#PHPのインストール

[PHP.net](http://php.net/manual/ja/install.windows.manual.php)を参考にしてインストールします。

1. "コントロールパネル" -> "システムとセキュリティ" -> "システム" -> "システムの詳細設定" -> "詳細設定タブ"の環境変数ボタンをクリックします。
2. PATHにPHPをインストールしたパスを追加します。（区切り文字は;です。）
3. PHP.exeと同じフォルダーにあるphp.iniをテキストエディターなどで開きます。
4. ";extension=php_openssl.dll" -> "extension=php_openssl.dll"に変更します。

#composer.pharのインストール

1. コマンドプロンプトを開きます。
2. 任意の位置で、`curl -s https://getcomposer.org/installer | php`を実行します。
3. composer.pharというファイルがダウンロードされます。

#Symfony2のインストール

1. コマンドプロンプトを開きます。
2. 任意のフォルダーを作成します。Symfony2インストール時は、空の状態にしてください。
3. 任意のフォルダーでインストールする場合は、`php composer.phar create-project symfony/framework-standard-edition 2.3.0`を実行します。
4. 任意の位置の場合は、`php composer.phar create-project symfony/framework-standard-edition <任意のフォルダー> 2.3.0`でインストールします。
5. インストール後、composer.pharファイルをコピーして、Symfony2インストール先にペーストします。

#Bootstrapバンドルのインストール

ここでは、Symfony2のバンドル機能のひとつであるBootstrapをインストールしてみます。

1. Symfony2インストール位置にある、`composer.json`ファイルをテキストエディターで開きます。
2. `"require": {`の箇所の最後に`"braincrafted/bootstrap-bundle": "~2.0"`を追加します。このとき、1行上の行の最後にカンマ（,）を付けるの忘れないようにしてください。
3. コマンドプロンプトを開きます。
4. Symfony2インストール位置で、`php composer.phar update`を実行します。
5. 追加したBootstrapがインストールされます。

#おわりに

Windows環境でSymfonyを使おうとすると、なにかと不便を感じることがありました。
Linux,Macなどで開発していればそんなに億劫ではないとおもいますが。
でも、仕事する上ではWindowsユーザーが多いと思いますので、お役に立てれば幸いです。
superclass mismatch for class Mark (TypeError) の対処法

`RedMine-2.3.0` & `Rails-3.2.13` & `passenger-4.0.37` で
`psych` という YAMLパーサの `2.0.6(現時点での最新バージョン)` を使うと
`'superclass mismatch for class Mark (TypeError)'` というエラーになる。
ちなみに psych-2.0.3に戻したらちゃんと動いた。

ちなみに RedMine、Rails、passengerの Gemfileでは特に psychのバージョンについて書かれてないもよう。
`psych-2.0.6` と `psych-2.0.3` には互換性がたぶんないんじゃないかしら。 

psych：https://rubygems.org/gems/psych
ハイフンを使った便利な標準入出力指定でのコマンドライン

クールでカッコイイ用法を発見したら随時追記していこうと思います。

# ハイフンで標準入出力
コマンドでファイル名を渡す際にハイフンを指定すると基本的には標準入力(標準出力)として解釈してくれます。
たとえばcatコマンドで使うとキーボード入力をそのまま表示してくれます。

```bash:Example
~$ cat -
hoge (←入力)
hoge
nullpo (←入力)
nullpo
```

特定の出力結果をファイルを引数にとるコマンドへ渡したいときに、一旦テンポラリファイルを作って・・・とかしたり、ファイル出力するコマンドを標準出力へそのまま出したい、などいろいろ利用できます。

# 事例集

## wgetで取得したURLの内容を標準出力へ
wgetはデフォルトでURL名の最後の方をみてファイルを宜しく作ってくれるのですが、-O (--output-document=) オプションでファイル名を指定できますので、ファイル名にハイフンを渡してあげるとそのまま標準出力へ出てきます。

```bash:wget(1)
~$ wget http://www.example.com/ --output-document=-
```

ここからたとえばリンクを抽出したい場合は、

```bash:wget(2)
~$ wget http://www.example.com/ --output-document=- 2>>/dev/null | grep href
    <p><a href="http://www.iana.org/domains/example">More information...</a></p>
```

とかやると(簡易なものなので正確に抽出できるかどうかは別ですが)、わりとさっくりと抽出できます。
curlコマンドでも同じようなことはできますが、あちらは細かくいろいろできる代わりにオプションが多少複雑なので、ヘッダを弄るみたいなことをしないときはさっとできるwgetをよく自分は利用します。何より左手だけでコマンドが打てる:relaxed:

## diffで標準入力と特定のファイルを比較する

sedやらなんやらで置換した結果と特定ファイルのdiffを取ることもできます。

```bash:diff(1)
~$ sed "s/(なんか)/(おきかえ)/g" nullpo1.txt | diff - nullpo2.txt
```

似たようなファイルが２つあったときに「これってココが違うだけであとは一緒なのかな？」とか思ったときに置換＋標準入力からのdiffとかササッとできるとかっこいい！

## vimで標準入力を表示・編集する

自分の中ではわりと登場機会が多いvim(or 各種エディタ)へ標準入力を渡してしまう方法です。出力結果をハイライト付きで見たいけどいちいちテンポラリファイル作ってエディタで開きなおすのもめんどいときにはこんなかんじ。

```bash:vim(1)
~$ diff nullpo1.txt nullpo2.txt | vim -
```

git diff なんかもlessやmoreなんかのページャが起動しますが、これもハイライトしてほしいなぁと思ったらvimへパイプで渡すとあら不思議。

```bash:vim(2)
~/nullpoRepos$ git diff | vim -
```

ここから名前をつけて保存するのも可能です。

## scpで転送したアーカイブファイルを直接展開

別サーバにあるアーカイブファイルを一旦自サーバに持ってきて展開とかしようとすると通常は

```bash:
~$ scp NullpoHost:~/archive.tgz .
~$ tar zxvpf archive.tgz
~$ rm archive.tgz # 元ファイルがもう不要なら
```

といったかんじになると思いますが、これすらもハイフンを使えばアーカイブファイルの残骸すら残さず一発でできるようになります。

```bash:
~$ ssh NullpoHost "cat ~/archive.tgz" | tar zxvpf -
```

sshしてアーカイブのバイナリを直接catした内容をそのままtarに渡すような流れですね。
いちおうメリットとしては通常時にはアーカイブファイル＋展開されたファイルで多く取られる容量がアーカイブファイル分だけ削減されるという点がありますが、ファイルサイズが大きくなってきた時の負荷とか転送速度などの
影響はあるかもしれません・・。
(sshコマンドでファイル内容をダダ流しするよりも、ファイル転送コマンドを自負しているscp先生にお任せする方がいろいろ最適化されていそうではありますが)



# おわりに

このハイフンを知ってからホームディレクトリ内のaとかhogeみたいな、もはやいつ何に使ったのかわからないファイルが激減しました！スッキリ！(なくなったとは言ってない)
Fluentdで集めたデータをGroongaに格納する方法

## はじめに

Fluentd用のoutputプラグインとして「groonga outputプラグイン」というものがあります。groonga outputプラグインを使うと、Fluentdで集めたデータを[Groonga](http://groonga.org/ja/)に格納することができます。この記事ではgroonga outputプラグインを使ってFluentdで集めたデータをGroongaに格納する方法を説明します。

## インストール

Fluentdはすでにインストールされているものとします。そのため、次の2点のインストール方法について説明します。

  * Groonga
  * fluent-plugin-groonga

### Groonga

データの格納先であるGroongaのインストール方法を説明します。

Groongaは各種プラットフォーム向けのパッケージが揃っています。パッケージを使ったインストール方法の詳細は[公式サイトのインストールドキュメント](http://groonga.org/ja/docs/install.html)を参照してください。次のパッケージをインストールしてください。

  * groonga-httpd: Groongaサーバー

例えば、Ubuntuの場合は次のようにインストールします。

```text
sudo apt-get -y install software-properties-common
sudo add-apt-repository -y universe
sudo add-apt-repository -y ppa:groonga/ppa
sudo apt-get update
sudo apt-get -y install groonga-httpd
```

### fluent-plugin-groonga

groonga outputプラグインを提供するfluent-plugin-groongaのインストール方法を説明します。

fluent-plugin-groongaはRubyGemsとして公開されているので次のコマンドでインストールします。

```text
sudo gem install fluent-plugin-groonga
```

## 設定

インストールが完了したので設定方法を説明します。

### Groonga

Groongaはインストールするだけですぐに使える状態になっているため追加で設定する必要はありません。

（どこからでもアクセスできる状態になっているため、実運用するときは必要に応じて接続可能ホストを制限したりする必要があります。）

### fluent-plugin-groonga

fluent-plugin-groongaの設定方法を説明します。

次のようにApacheのログファイルを読み込むsourceがあるとします。

```text
<source>
  type tail
  path /var/log/apache2/access.log
  pos_file /var/log/td-agent/apache_access.pos
  tag log.apache.access
  format apache2
</source>
```

これを同じホストで動いているGroongaに格納するには次のようなmatchを追加します。

```text
<match log.**>
  type groonga
  store_table Logs

  buffer_type file
  buffer_path /var/log/td-agent/buffer.groonga
</match>
```

これでLogsテーブルの中にログが溜まっていきます。

Groongaは事前にスキーマを定義しなければいけませんが、fluent-plugin-groongaが自動でいい感じにテーブルもカラムも定義してくれます。そのため、前述の通りテーブル名だけ指定しておけばログが溜まっていきます。

格納されたログは[Webブラウザーベースの管理画面](http://qiita.com/groonga/items/cf6d83b2b3e2956d6bd8)で確認できます。

## まとめ

Fluentdで集めたデータをGroongaに格納する方法を紹介しました。実運用するにはもっと設定が必要になるのですが、この記事では実際に試してみるための必要最小限の設定を紹介しました。実運用するときはたとえば次のような設定が必要になります。

  * 各ログにタイムスタンプも入れる
  * 各ログにホスト名も入れる（複数ホストからログを集める場合）
  * 高速に検索できるようにインデックスを張る
  * 同じようなテキストデータは共有してデータベースに格納するサイズを小さくする

fluent-plugin-groongaのリポジトリーに[設定サンプル](https://github.com/groonga/fluent-plugin-groonga/blob/master/sample/store-apache.conf)があるので興味がある人はのぞいてみてください。

## おしらせ

### 全文検索エンジンGroongaを囲む夕べ5

2014/11/29（土）、年に一度のいい肉の日にGroongaイベント「[全文検索エンジンGroongaを囲む夕べ5](http://groonga.doorkeeper.jp/events/15816)」が開催されます。Groongaに興味のある方はぜひご参加ください。

### Groonga Advent Calendar 2014

[Groonga Advent Calendar 2014](http://qiita.com/advent-calendar/2014/groonga)を実施します。Groonga関連情報を持っている方はぜひご参加ください。

## 関連情報

  * [Groongaのチュートリアル](http://groonga.org/ja/docs/tutorial.html)
  * [隔週連載Groonga](http://gihyo.jp/dev/clip/01/groonga)
最新記事のいいね！数を予測してみる


どうも、最近は自動的に収集される情報だけで過多になってきているokappyです。

ここで言うところの自動的に収集される情報ってのは、facebook,twitter,各種ニュースアプリ,RSSなどで収集しているWebコンテンツのことを指してます。

情報が多いので、SNSを見るのを制限したり、ニュースアプリで満足したふりをしてみたり、RSSを完全放置して、未読件数がギネス級になったりしている方も少なくないのではないでしょうか？

でも、どうせ情報収集するならWeb上に公開された瞬間に、その後注目されそうな記事だけを効率良く収集したい！！

ってことで、RSSで取得した記事をリアルタイムに解析して、その記事がされるだろういいね！数を予測してみようという取り組みをしてみました。

で、いいね！数の予測が多い記事だけを見れば、最新であり効率も良いというわけです。


---

では、実際に小規模実験をしてみた流れを具体的に説明します。

##__1. mecabを準備__
http://qiita.com/ysk_1031/items/7f0cfb7e9e4c4b9129c9

##__2. 「THE BRIDGE」の記事をrssで取得する__
今回は過去2418件のTHE BRIDGEの記事を使って実験してみました。
以下のようなデータを準備します。

| title | url | like_count |
|---|---|---|
| 世界累計1,200 万人が使うダイエットアプリ「Noom コーチ」が大幅リニューアル、Appleの新ヘルスケアアプリケーションと連携 | http://thebridge.jp/2014/09/noom-update-201409 | 211 |
| 追記あり】前ハフィントンポスト日本版編集長の松浦氏、スマートニュースへ | http://thebridge.jp/2014/09/former-editor-in-chief-shigeki-matsuura-joins-smart-news | 773 |
| 本日限り、予約なしで新スマホが手に入る特別会場までUberが無料送迎 | http://thebridge.jp/2014/09/uber-gets-you-new-iphone | 22 |
| Y-Combinator卒業生が語る「プロダクトや時代に合った最適なグロース」とは？ | http://thebridge.jp/2014/09/traction-ceo-kenzi-wang-shared-his-growth-hack-ideas | 35 |
| 新しいビジネスモデルとなるか。手数料を定額制にしたクラウドファンディングサイトの「Funderbult」 | http://thebridge.jp/2014/09/funderbuilt-pickupnews | 17 |
| … | … | … |

##__3. 過去の記事の記事といいね！数を解析する__
今回は、記事に含まれる単語をmecabで抽出して、その記事のいいね！数に応じてその単語にポイントを付与し、単語ごとに出現数とポイントをデータベース化して教師データとしました。

| 単語 | ポイント | 出現数 |
|---|---|---|
|アプリ|19475|158|
|ヘルスケア|1191|24|
|クラウドファンディング|3922|60|
|スタートアップ|62768|250|
|…|…|…|


##__4. 新しい記事を解析して、されるだろういいね！ 数を予測する__
新しい記事の内容を解析して単語を抽出し、3で作ったデータベースと照らし合わせていいね！されるだろう数字を予測してみます。

| 記事タイトル | URL | like数 |
|---|---|---|
| 世界累計1,200 万人が使うダイエットアプリ「Noom コーチ」が大幅リニューアル、Appleの新ヘルスケアアプリケーションと連携 | http://thebridge.jp/2014/09/noom-update-201409 | 211 |
| 追記あり】前ハフィントンポスト日本版編集長の松浦氏、スマートニュースへ | http://thebridge.jp/2014/09/former-editor-in-chief-shigeki-matsuura-joins-smart-news | 773 |
| 本日限り、予約なしで新スマホが手に入る特別会場までUberが無料送迎 | http://thebridge.jp/2014/09/uber-gets-you-new-iphone | 22 |
| Y-Combinator卒業生が語る「プロダクトや時代に合った最適なグロース」とは？ | http://thebridge.jp/2014/09/traction-ceo-kenzi-wang-shared-his-growth-hack-ideas | 35 |
| 新しいビジネスモデルとなるか。手数料を定額制にしたクラウドファンディングサイトの「Funderbult」 | http://thebridge.jp/2014/09/funderbuilt-pickupnews | 17 |
| … | … | … |


##__5. 予測値と実際のいいね数を比べて精度を評価してみる__

| 実際のいいね！数 | 予測したいいね！数 |
|---|---|
|138|493.7|
|322|592.7|
|65|245.8|
|194|268|
|4|231.6|
|138|493.7|
|187|545|
|71|243.7|
|136|486|
|65|139.7|
|526|545|
|71|243.7|
|136|486|
|65|139.7|
|147|234.3|
|147|234.3|
|58|231.1|
|351|432.1|
|212|214.8|
|104|231.1|

<br>

グラフにすると、こんな感じ。

![](https://31.media.tumblr.com/b017a485b48c92095181228c2784d19d/tumblr_inline_neng0yrTTe1smsp17.png)


##まとめ

結果的には結構強気にいいね！数を予測する感じになりましたねw
この辺は、パラメータの調整や当てはめるグラフによって変わったりするので、ご愛嬌w

とりあえず、今回は実験として試しただけなので、本気でやろうと思ったら、記事元のドメイン、投稿されてからの経過時間、著者、単語の精査などもやるべきなのと、機械学習の仕組みを取り入れて、どんどん精度が上がっていくようにすると面白いんじゃないかと。
列挙型でジェネリックを使ってビルドエラーになった場合の回避策



# 目的

値付き列挙型をジェネリックで定義してみたところ、ビルド時にエラーが発生しました。決定的な解決策はまだ見つかっていないのですが、幾つかの回避策を記します。


# 発生したエラー

値付き列挙型をジェネリックを使って定義したところ、Xcode 6.1 で次のエラーが ```Issue Navigator``` に報告されました。

> Swift Compiler Error
Command failed due to signal: Segmentation fault: 11

ビルドログを見るともう少し具体的なエラーメッセージが表示されています。

> error: unimplemented IR generation feature non-fixed multi-payload enum layout

このエラーメッセージが ```Issue Navigator``` に表示されることもあります。


# エラーになるコード

次のような列挙型を定義したときに、このビルドエラーが発生しました。

## 複数の列挙子で値を採り、そのうちのひとつ以上がジェネリック型な場合

複数のケースが値付き列挙子になっていて、そのうちのどれか一つでもジェネリック型になっているときに、今回のエラーが発生しました。

```Swift
public enum Result<T> {

	case Succeeded(T)
	case Failed(String)
}
```

## すべての列挙子で同じジェネリック型を採る場合も同様

２つ以上（全部を含む）が値付き列挙子になっている場合、それらが同じジェネリック型であってもエラーになります。

```Swift
public enum Result<T> {

	case OK(T)
	case Error(T)
}
```

# ジェネリックな値付き列挙型でエラーにしないためには

次のようなコードであれば、ビルドエラーにはならないようです。

## 1. 値付き列挙子をひとつだけにする

ひとつのケースだけが値付き列挙子になっている分には問題ないようです。

```Swift
public enum Result<T> {

	case OK
	case Retry
	case Error(T)
}
```

## 2. それぞれの列挙子が採る型を明確にする

ジェネリックとは違ってくるのですが、複数の値付き列挙子が存在していても、それらが明確な型になっている場合は問題ないようです。

```Swift
public enum Result<T> {

	case Succeeded(Int)
	case Failed(String)
}
```

そこまでジェネリックである必要がなければ、既存のクラスや独自クラスを使って型を明示指定することでエラーを回避できそうです。

なお、列挙型のメソッドやプロパティでジェネリック型を使う分には問題ないようです。


## 3. 列挙子が採る型を AnyObject に制限する（注意事項あり）

取り得るデータ型を少なくとも Objective-C 互換のプロトコルに制限するとビルドエラーが発生しなくなるようです。

そこで、扱う型を ```AnyObject``` に限定します。

```Swift
public enum Result<T:AnyObject> {

	case Succeeded(T)
	case Failed(String)
}
```

ただし、このようにすると ```case``` 文でジェネリック型を持つ列挙子を判定するコードを記載したときに、次のような理由不明のコンパイルエラーが発生する様子でした。

> Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc failed with exit code 1

必ずしも自由に値を持てなくなるところにも注意が必要です。

値が ```AnyObject``` 型に制限されるため、```Int``` 型 や ```enum``` 型 、```String``` 型 などのような純粋な Swift オブジェクトは、原則として持てなくなります。

値として ```数値リテラル``` や ```文字列リテラル``` を指定することはできますが、実際にはそれぞれ ```NSNumber``` 型と ```NSString``` 型として保持されることになります。

## 4. ジェネリックを使わずに Any で対応する

これまでの ```2.``` と ```3.``` を合わせたような方法ですが、列挙子が採る型を ```Any``` と明示することで、ジェネリックを使わずに、純粋な Swift オブジェクトも扱えるようになります。

```Swift
public enum Result {

	case Succeeded(Any)
	case Failed(String)
}
```

この方法なら、複数の列挙子で値を採る場合でも、任意の型の値を持てる列挙子を定義できます。

ただし、この方法を使った場合はプログラミング内では常に ```Any``` 型の値として扱われるため、どの型の値が入っているかを判定して処理しないといけないところが **とても厄介** です。

## 5. 列挙子が採る値をクロージャーで指定する

ジェネリックを使った列挙型で複数の列挙子で値を採る場合でも、採る値の型がクロージャーであれば問題ないようです。

ここで ```@autoclosure``` を使えば、値を渡すだけで自動的にクロージャーとして包んでくれるので、普段どおりの構文で列挙子に値を設定できます。

```Swift
public enum Result<T> {

	case Succeeded(@autoclosure ()->T)
	case Failed(String)
}
```

ただし、保持する値はあくまでもクロージャーなので、目的の値を取得するときには、列挙子から値を取得して、それをクロージャーとして実行する必要があります。

```Swift
switch result {

case let .Succeeded(closure):
	
	let value = closure()
}
```

# まとめ

状況によってどれが適切かは違ってくるでしょうけれど、とりあえず感じたところとしては、基本的には『ジェネリックな型を扱う列挙型では、値を採る列挙子はひとつだけ持てる』つもりでいると、列挙型を設計しやすいかもしれません。

複数の列挙子で値を持ちたい場合は、値の型が明確になるように定義するか、またはクラスや構造体でラップしてあげるのが良いかもしれません。

クロージャーを使う方法もそれほど負担はないので、ジェネリックを使って、かつ複数の列挙子で値を扱いたい場合は『クロージャーを使うものだ』と割り切ってしまえば、悩まずに済むようにも思えました。
`#pragma execution_character_set("utf-8")` は翻訳単位ごとに反映される


　MSVC の `#pragma execution_character_set` について、公式のドキュメントが見つけられなかったのと、この pragma をソースファイルに書いた時、翻訳単位ごとに効くのかリンクした実行ファイル全体に効くのか不安だったので調べた。結論はタイトルの通り。

# 調査方法

* Visual Studio Professional 2013 Version 12.0.30723.00 Update 3 で検証した
* "Win32 コンソールアプリケーション" のプロジェクトを作り、以下のソース、ヘッダファイルを用意した。全部 CP932 で保存した。
* `#pragma execution_character_set("utf-8")` を書いたソースと書いてないソースでそれぞれ文字列定数を定義し、`main` でこれをダンプする、というもの。

```ConsoleApplication.cpp
#include "stdafx.h"
#include "./default.h"
#include "./utf8.h"
#include <iostream>
#include <algorithm>

static void dump_string_bytes(std::string const& s)
{
    std::cout << '"' << s << '"' << std::endl;
    std::for_each(s.cbegin(), s.cend(), [](char c) {
        std::cout << "0x" << std::hex << (c & 0xFF) << std::dec << " ";
    });
    std::cout << std::endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
    std::cout << "[UTF8]" << std::endl;
    dump_string_bytes(kMessageUTF8);

    std::cout << "[Default]" << std::endl;
    dump_string_bytes(kMessageDefault);

    return 0;
}
```

```default.cpp
#include "stdafx.h"
#include "./default.h"

std::string const kMessageDefault = "あいうえお";
```

```default.h
#pragma once

#include <string>

extern std::string const kMessageDefault;
```

```utf8.cpp
#include "stdafx.h"
#include "./utf8.h"

#pragma execution_character_set("utf-8")

std::string const kMessageUTF8 = "あいうえお";
```

```utf8.h
#pragma once

#include <string>

extern std::string const kMessageUTF8;
```

* 出力結果

```
[UTF8]
"縺ゅ＞縺・∴縺・
0xe3 0x81 0x82 0xe3 0x81 0x84 0xe3 0x81 0x86 0xe3 0x81 0x88 0xe3 0x81 0x8a 
[Default]
"あいうえお"
0x82 0xa0 0x82 0xa2 0x82 0xa4 0x82 0xa6 0x82 0xa8 
```

* 結論: ソースファイルに書いた `#pragma execution_character_set("utf-8")` は翻訳単位ごとに効くっぽい。
郵便番号から住所を取得する

#はじめに

よくあるユーザー登録画面で、郵便番号を入力すると、
自動で住所が入力されることがあります。
あれって、どうやってるんだろうと思い、調べてみました。

#ajaxzip3

[https://code.google.com/p/ajaxzip3/](https://code.google.com/p/ajaxzip3/)というのが一番簡単だったので、
これを紹介します。

使い方は至ってシンプルです。

```lang:zipcode.html
<html>
<head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css">
    <script src="https://ajaxzip3.googlecode.com/svn/trunk/ajaxzip3/ajaxzip3-https.js" charset="UTF-8"></script>
    <title>calendarSample</title>
</head>
<body ng-app="calendarApp">
    <div class="container" ng-controller="CalendarCtrl">
        <div class="jumbotron">
            <h2>ZipCodeSample!</h2>
        </div>

        郵便番号：<input type="text" name="zip01" size="10" maxlength="8" onKeyUp="AjaxZip3.zip2addr(this,'','pref01','addr01');">
        <p>住所:<input type="text" name="pref01" size="20">
        <input type="text" name="addr01" size="60"></p>

    </div>
</body>
</html>
```

` <script src="https://ajaxzip3.googlecode.com/svn/trunk/ajaxzip3/ajaxzip3-https.js" charset="UTF-8"></script>`
を読み込みます。

そして、`<input type="text" name="zip01" size="10" maxlength="8" onKeyUp="AjaxZip3.zip2addr(this,'','pref01','addr01');">`
で、郵便番号を入力します。
onkeyUpイベントを使っているので、郵便番号入力後すぐに`pref01`と`addr01`名の入力欄に設定されます。


#おわりに
ajaxzip3サイトを見ると、いくつかパターンがありましたので、いろいろ好みに合わせて作ることができるようです。
かなり手軽に作れたので、利用価値はかなりあると思いました。

調べてみると[Yahoo! Japan](http://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/zipcodesearch.html)でもAPIを提供しているようなので、シチュエーションに合わせて使い分けてみればいいと思います。
Grettyが便利そう


GradleからJettyを動かすときはJettyEclipse Pluginを使っていたのですが、Jettyのversion upに追随してなかったり、HotDeployされなかったり、ちょこちょこ痒いところに手が届かない。そんなおりGitHubをうろうろして見つけたのが[Gretty](https://github.com/akhikhl/gretty)。
Jetty7-9だけでなくTomacat7-8にも対応しており、Spring-Loadedを利用したHotDeployもできるようです。しばらく使ってみよう。

pluginのインストールはこんな感じ。

```build.gradle
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'org.akhikhl.gretty:gretty:+'
    }
}

apply plugin: 'org.akhikhl.gretty'
```
Xcodeでのチーム開発あるある？info.plistのコンフリクトを解消する方法


info.plistでコンフリクトが発生しました。

```
CONFLICT (content): Merge conflict in src/G08M11App-Info.plist
```

plistはXMLファイルというのは知っていたけどソースの開き方が分からず困った。


ソースの表示方法：
対象のplistファイルを右クリックして「Oen As」を選択し、
「Source Code」を選択することで、XML版のplistファイルを開くことが出来ます。

![スクリーンショット 2014-11-10 9.46.19.png](https://qiita-image-store.s3.amazonaws.com/0/15812/cf9208d0-3888-b148-b401-b8878c40db40.png "スクリーンショット 2014-11-10 9.46.19.png")

そして、コンフリクトが発生した原因(対象アプリのバージョン違い)が分かり解消することが出来ました。
Yosemite で Emacs-24.4 をビルドして動かす

Emacs-24.4 を Yosemite 上でビルドして動かそう。

主に、こちら [マスタカの ChangeLog メモ / 2014-10-25-1](http://masutaka.net/chalow/2014-10-25-1.html) を参考にさせていただき、自分用にちょい変更。

OSX 上で何かとよく落ちるので、困っていたが、その解決策まで載っていたので、ありがたい！

## ビルド、インストール

```zsh
cd ~/src/emacs
curl -LO http://ftp.gnu.org/pub/gnu/emacs/emacs-24.4.tar.xz
curl -LO ftp://ftp.math.s.chiba-u.ac.jp/emacs/emacs-24.4-mac-5.0.tar.gz
tar Jxvf emacs-24.4.tar.xz
tar zxvf emacs-24.4-mac-5.0.tar.gz
cd emacs-24.4
patch -p 0 < ../emacs-24.4-mac-5.0/patch-mac
cp -R ../emacs-24.4-mac-5.0/mac mac
cp ../emacs-24.4-mac-5.0/src/* src
cp ../emacs-24.4-mac-5.0/lisp/term/mac-win.el lisp/term
cp nextstep/Cocoa/Emacs.base/Contents/Resources/Emacs.icns mac/Emacs.app/Contents/Resources/Emacs.icns
./configure --with-mac --without-x
make 
make install
cp -R mac/Emacs.app /Applications/Emacs.app
cd ..
curl -LO http://emacsformacosx.com/emacs-builds/Emacs-24.4-universal.dmg
open Emacs-24.4-universal.dmg
cp -R /Volumes/Emacs/Emacs.app/Contents/MacOS/bin-x86_64-10_9 /Applications/Emacs.app/Contents/MacOS/bin
umount /Volumes/Emacs
```

参考にしたサイトも書かれているが、 パッチを当てたことにより、

* ```ns-command-modifier```
* ```ns-option-modifier```

が、それぞれ

* ```mac-command-modifier```
* ```mac-option-modifier```

と変わっている。また、

```el
(if (eq window-system 'ns)
    (progn
        ...
     ))
```

とか書いていた場合は、

```el
(if (eq window-system 'mac)
    (progn
        ...
     ))
```

としなければマッチしないので注意。

## ついでに日本語入力で全角空白を何とかする

mozc_emacs_helper を使っているので、ほぼ影響はないが、使っていない方は、@comutt さんの [OS X Yosemite の日本語入力で常時半角スペースにする方法](http://qiita.com/comutt/items/3f497f05ef98c7a2e615) を見ておくと、幸せになれるはず。

余談だが、 Mavericks から Yosemite にアップグレードしたんだけど、日本語の変換候補出てくるの遅せーよって人は、変換学習をリセットすると速くなるので、学習結果に未練の無い方は、是非お試しを。

## 追記

@masutaka さんのページが更新され、ビルド時の問題発生時の対策なども書かれてます。
詳細に書かれてますので、是非そちらも参照ください。

http://masutaka.net/chalow/2014-10-25-1.html
awsにoctaveのインストール


awsにoctaveのインストール

### 環境

```
$cat /proc/version
Linux version 3.4.76-65.111.amzn1.x86_64 (mockbuild@gobi-build-31004)
 (gcc version 4.6.3 20120306 (Red Hat 4.6.3-2) (GCC) ) #1 SMP Tue Jan 14 21:06:49 UTC 2014
```

### octaveのインストール

```
yum --enablerepo=epel install octave
```

### エラー

octaveを実行すると、
error while loading shared libraries: libhdf5.so.6: cannot open shared object file: No such file or directory
が表示される

下記実行

```
#cd /etc/ld.so.conf.d/
#touch gdal.conf
中に/usr/lib64/mpich2/libを記載
#ldconfig
#ldconfig -p | grep libhdf5

# ldconfig -p | grep libhdf5
        libhdf5hl_fortran.so.6 (libc6,x86-64) => /usr/lib64/mpich2/lib/libhdf5hl_fortran.so.6
        libhdf5_hl.so.6 (libc6,x86-64) => /usr/lib64/mpich2/lib/libhdf5_hl.so.6
        libhdf5_fortran.so.6 (libc6,x86-64) => /usr/lib64/mpich2/lib/libhdf5_fortran.so.6
        libhdf5.so.6 (libc6,x86-64) => /usr/lib64/mpich2/lib/libhdf5.so.6
```


### その後

octaveコマンドで正常に起動・動作確認
YosemiteにてTerminal.appのタブ選択のショートカットキーを設定する

# 概要

Yosemite にアップデートすると、ターミナルのタブ選択ショートカットキーが効かなくなりました。
メニュータイトルが変更されたことが原因なので設定しなおします。

# 設定方法

システム環境設定 > キーボード > ショートカット > アプリケーション より設定できます。

![SS 2014-11-10 9.31.04.png](https://qiita-image-store.s3.amazonaws.com/0/7823/c6e209cd-c740-1382-11f5-814e4c08a54b.png)

以前は「（前｜次）のタブを選択」として設定可能でしたが、
Yosemite からは「（前｜次）のタブを**表示**」に変わりました。
Sublime Text 3 導入メモ


# インストールと初期設定

* http://www.sublimetext.com/3
* Package Controllをインストール
	* https://sublime.wbond.net/installation
	* ctrl+` でopenし、コマンドを貼り付けて実行

# Package Controllからインストールするやつら

## 全般
### BracketHighlighter
対応する { } を強調表示

### HTML-CSS-JS Prettify
コードフォーマッタ。設定はこちらを参照
https://github.com/victorporof/Sublime-HTMLPrettify

## JavaScript用

### SublimeLinter-jshint
構文チェック

* node.jsをインストール
* npm install -g jshint
* sublimeでSublimeLinterをインストール
* sublimeでSublimeLinter-jshintをインストール


# Preferences → Setting - User

```
"trim_trailing_white_space_on_save" : true
``` 

行末の不要なスペースを保存時に削除

```
"draw_white_space" : "all"
```

半角スペースはドット、タブはラインで表示してくれる
参考リンク集:Swiftをつかってアプリ開発事始め+iBeacon情報


1. Xcodeで、Swiftを使って、iOSアプリを作って、iTunes,AppleStore経由ではないインストール方法で、実機テストする。
- iBeaconを使うiOSアプリのサンプル
- iBeaconを使った事例で参考になりそうなもの

##参考リンクの整理
###Appleオフィシャル
■Swift - Overview - Apple Developer
https://developer.apple.com/swift/

■The Swift Parallel Scripting Language
http://swift-lang.org/main/
オンラインでSwiftを試すことが出来ます。

###サンプルコード
■Sample Code - Resources - WWDC - Apple Developer
https://developer.apple.com/wwdc/resources/sample-code/

■Swift Docs
https://sites.google.com/a/gclue.jp/swift-docs/



###まとめ記事
■[iOS][Mac] Swift を学べる記事のまとめ ｜ Developers.IO
http://dev.classmethod.jp/smartphone/iphone/learn-swift/

■【Apple】新言語「Swift」の分かりやすい入門サイト・入門書・サンプルコード集まとめ【iOS】 - NAVER まとめ
http://matome.naver.jp/odai/2140254762300198501?&page=1

■iOS - iBeaconを利用したアプリ開発でチェックしておきたい！良記事・ソースコードまとめ - Qiita
http://qiita.com/hedjirog/items/abd48a55387891cc8503


###iBeaconサンプルソース
■Swift Docs
https://sites.google.com/a/gclue.jp/swift-docs/system/app/pages/search?scope=search-site&q=beacon

■Search · swift beacon
https://github.com/search?utf8=%E2%9C%93&q=swift+beacon

###オンライン講座
■超初心者向け「Swift超入門〜iPhoneアプリ見栄講座 -とりあえずこれだけは知っとけ！」 - 無料動画学習｜schoo（スクー）
http://schoo.jp/class/1328/room?ref=fbapp!_=_


###その他
■SwiftとiBeaconを使ってお母さんが自分の部屋に近づいて来た事を警告するアプリをつくる - Qiita
http://qiita.com/oggata/items/5de43d71692d1abcff7c#2-5
Space Sushi みたいな宇宙に何かしらが浮かんでいる画像を自動生成する gem を作りました

## 概要

[Space Sushi](https://twitter.com/SpaceSushiPic) という宇宙に寿司が浮かんでいる画像を淡々と投稿している天才的なアカウントがあります。これには及ばないものの、寿司を含むいろんな物を宇宙に浮かべた画像を素早く入手したいときのために、合成画像を自動的に作成する gem を作成しました。

https://github.com/suzuki86/spacestuff

この gem をインストールすると `spacestuff` というコマンドが使えるようになり、実行するとそのカレントディレクトリに合成画像が保存されます。例えば下記のような画像です。

![sample.jpg](https://qiita-image-store.s3.amazonaws.com/0/16758/314db8e2-9444-45ba-27ff-a7f20addbb9d.jpeg)

宇宙に浮かぶものは予め組み込まれたものの中からランダムで選ばれますが、`spacestuff` コマンドに引数を渡すことで浮かばせるものを指定することができます。ブロッコリーを浮かばせたいときは `-c broccoli` を指定します。

```
spacestuff -c broccoli
```

![broccoli.jpg](https://qiita-image-store.s3.amazonaws.com/0/16758/f26d6ef8-8c43-bd4d-f14a-ca99b0e86a1d.jpeg)


浮かばせることのできるものは、現在は下記の通りです。

- sushi (寿司)
- broccoli (ブロッコリー)
- mashroom (きのこ)
- banana (バナナ)
- cat (猫)
- dog (犬)

また、背景画像や浮かばせる物体として任意の画像を指定することもできるオプションがあります。詳細は GitHub をご覧ください。
https://github.com/suzuki86/spacestuff
AWS SDK for Ruby(V2)を利用して、Amazon S3を操作する

しばらく触らないうちにV2とか出てたりしたので、基本操作のおさらい。

**Gemでインストール**

	$ gem install aws-sdk-core
	$ gem list aws-sdk-core
	*** LOCAL GEMS ***
	aws-sdk-core (2.0.3)

**Credentialsの設定**

```~/.aws/credentials
[default]
aws_access_key_id = your_access_key_id
aws_secret_access_key = your_secret_access_key
```

**バケットの一覧表示**

```ruby:aws-sdk-ruby-s3.rb
require "aws-sdk-core"

Aws.config[:region] = 'ap-northeast-1'
s3 = Aws::S3::Client.new

resp = s3.list_buckets
puts resp.buckets.map(&:name)
```

**バケットの作成**

```rb
s3.create_bucket(bucket: "BucketName")
```

**バケットの削除**

```rb
s3.delete_bucket(bucket: "BucketName")
```

**オブジェクトの一覧表示**

```rb
resp = s3.list_objects(bucket: "BucketName")
resp.contents.each do |object|
	puts "#{object.key}"
end
```

**オブジェクトの削除**

```rb
s3.delete_object(
    bucket: "BucketName",
    key: "sample.jpg"
)
```
**ファイルのアップロード**

```rb
file_open = File.open("sample.jpg")
file_name = File.basename("sample.jpg")

s3.put_object(
	bucket: "BucketName",
	body: file_open,
	key: file_name
)
```

**ファイルのダウンロード**

```rb
File.open("sample.jpg", "w") do |file|
    s3.get_object(bucket: "BucketName", key: "sample.jpg") do |chunk|
        file.write(chunk)
    end
end
```

**参考リンク**

- [File: README — AWS SDK for Ruby V2](http://docs.aws.amazon.com/sdkforruby/api/frames.html)
- [Copy file to s3 with Ruby SDK v2 « Cloud How To](http://www.cloudhowto.org/copy-file-to-s3-with-ruby-sdk-v2/)
- [Downloading Objects from Amazon S3 using the AWS SDK for Ruby - AWS Developer Blog - Ruby](http://ruby.awsblog.com/post/Tx354Y6VTZ421PJ/Downloading-Objects-from-Amazon-S3-using-the-AWS-SDK-for-Ruby)
Texを使い始めたのでいろいろと記録

# はじめに
iPadのKeynoteで綺麗な数式を表示したいなぁっと思ったので、LaTexを使えって綺麗な数式を表示してイメージに変換してくれる「Tex Equation」というアプリを購入(記述現在、300円)して初めてのLaTexの記述中。なので、日々更新する形で書いていきたいと思います。

ちなみに、このアプリを知るきっかけになったのは、「[iPadでペーパーレス生活](http://www.laboreconomics.org/contents.php?page=IPAD)」というサイトです。

初めて分からないことばかりなのでQiitaにメモとしてこの記事は書いています。

***

2015.01.01現在
iPadだけだと画像などの取り扱い(編集など)が面倒臭かったり、やはりタイピングはPCでやった方が楽だったので現在はMacを中心に行ってます(^^;)

# 三角関数

## 基本形？

```latex:
\begin{eqnarray*}
 \sin x
 \cos x
 \tan x
\end{eqnarray*}
```
と書けば、
![image.jpg](https://qiita-image-store.s3.amazonaws.com/0/32946/a720a43b-2b5b-bfbf-80c0-5ed32202d43e.jpeg)
と表示される。


## 例

例えば以下の式を作るとします。
![image.jpg](https://qiita-image-store.s3.amazonaws.com/0/32946/b322621f-35fd-8303-183e-ee82251f9aae.jpeg)
この場合は、

```latex:
\begin{eqnarray*}
x=(N+h)\cos a\sin b
\end{eqnarray*}

```
と書けばいいらしい。

# 表

なかなか論文の中では活躍場が画像などに比べては少ないけど勘違いしてたところがあったのでそこも含めて記録。

##基本形
```latex:
\begin{table}[位置指定]
  \begin{tabular}{列指定}
    表本体・・・
  \end{tabular}
\end{table}
```

##位置指定と列指定

位置指定はこんな感じらしい(『[LaTexコマンド集](http://www.latex-cmd.com)』より)↓

|位置指定|意味|
|:-----------|:-----------|
|h|記述した場所に表を出力|
|t|ページの上端に表を出力|
|b|ページの下端に表を出力|
|p|表専用のページを用意して出力|

列指定はこんな感じらしい(『[LaTexコマンド集](http://www.latex-cmd.com)』より)↓

|列指定|意味|
|:-----------|:-----------|
|l|左寄せ|
|c|センタリング|
|r|右寄せ|

表についてはさらに詳しくいろいろ書いてあるサイトが合ったので[こちら](http://www.biwako.shiga-u.ac.jp/sensei/kumazawa/tex/table.html)を参考にしていただくとカスタマイズがいろいろできるみたいです。

* 記事：[表組: LaTeX](http://www.biwako.shiga-u.ac.jp/sensei/kumazawa/tex/table.html)

最後に自分が引っかかったところだけ説明をします。
次のサンプルのLaTexコードは正しいコードです。

```latex:
\begin{table}[h]
  \begin{center}
  \caption{テストテーブル}
  \begin{tabular}{|l|l|} \hline
    \hline
    テスト01 & テスト02 \\
    A001 & a002 \\
    B001 & b002 \\
    C001 & c002 \\
    D001 & d002 \\ \hline
  \end{tabular}
  \label{tb:table1}
  \end{center}
\end{table}
```

ところが自分はずっとこう書いていました。

```latex:
\begin{table}[h]
  \begin{center}
  \caption{テストテーブル}
  \begin{tabular}{|l|l|} \hline
    \hline
    テスト01 & テスト02 \\
    A001 & a002 \\
    B001 & b002 \\
    C001 & c002 \\
    D001 & d002 \\ 
  \end{tabular}
  \label{tb:table1}
  \end{center}
\end{table}
```

何が間違っているかというと表の最後の行のところに`\hline`がないところです。
実は`\hline`を書いていないと線引がされないので、下方の外枠が表示されない状態になります。
自分はなぜ表示されないのかわからなくて戸惑ったので一応記述しました(^^;)

# URL
参考文献などにURLを載せたときにエラーになることがある。「[LaTeXでURLを書く](http://tfidf.net/memos/latex-url.htm)」という記事によると、

* チルダ (~) の代わりに \~{} を使う。
* スラッシュ / の代わりに \slash を使う。

という対策や、url.sty を使うという手法があるらしい。

##url.sty
LaTeXの多くの環境では`url.sty`が使えるらしい。
まず、パッケージを次のように追加する。

`\usepackage{url}`

そして、載せたいURLを次のように書けばいいらしい。

`\url{載せたいURL}`

【例】\url{http://qiita.com/fantm21}

# 補足
「Tex Equation」開発者Webサイト：[http://www.litchie.com](http://www.litchie.com)

# 参考サイト
* [LaTexコマンド集](http://www.latex-cmd.com)
notepad++ と sumatraPDF で tex 編集の環境設定

# 概要

1. notepad++ で tex ファイルを編集
2. NppExec プラグインを使って pdf 作成 --> sumatraPDF を開いて編集行にジャンプ
4. PDF の任意の行をダブルクリックすると tex の該当行にジャンプ

というようなことが出来るようになるための手順メモ。

## 注意・前提

「とりあえず動けばいいや」という自分用メモのため、色々な前提条件がハードコードされています。他環境ではこのままでは動かないかもしれません。あくまで参考までに。

### 前提

* Windows 環境
* tex ソースファイル名が document.tex
* コンパイルされる pdf ファイル名が document.pdf
* tex ソースファイルの文字コードが UTF-8
* platex, pbibtex, dvipdfmx, sumatraPDF の exe があるところにパスが通っている
* 下記3つのバッチファイルが tex ソースファイルと同じディレクトリにある

# 手順

## NppExec の設定

NppExec 事態は、notepad++ をインストールした時点で組み込まれていますので、ダウンロードは不要です。

[Plugin] - [NppExec] - [Follow $(CURRENT_DIRECTORY)] にチェックを入れておきます。

## NppExec に記述するコマンド

F6 キーを押すと NppExec のコマンド画面が出てきますので、下記を記述し、 updatePDF などの名前で保存します。

```
npp_save
NPP_CONSOLE 1
cmd.exe /c UpdatePdf.bat $(FILE_NAME) "$(#0)" $(CURRENT_LINE)
exit
```

UpdatePDF.bat というバッチファイルを呼び出しています。

## UpdatePdf.bat の内容

下記のようなテキストファイルを作って、 updatePDF.bat という名前で tex ファイルと同じフォルダに保存します。他の bat についても同様です。

```
set TEX=document.tex
set PDF=document.pdf

rem 最終更新日を取得
for %%x in ( "%TEX%" ) do set TEX_T=%%~tx
for %%x in ( "%PDF%" ? ) do set PDF_T=%%~tx

echo %PDF_T%, %TEX_T%

rem texファイルが更新されているかで分岐
if "%PDF_T%" GEQ "%TEX_T%" goto :SHOW

rem 更新されているときは pdf を再コンパイル
call Tex2Pdf.bat %1

:SHOW
rem SumatraPDF を起動
ShowPdf.bat %1 %2 %3
```

## tex2PDF.bat の内容

tex2PDF.bat は tex ソースファイルから pdf をコンパイルするためのバッチです。

```
rem param1 texファイル名（拡張子含む）

platex.exe -no-guess-input-enc -kanji=utf8 -synctex=1 -interaction=nonstopmode -src-specials "%~1"

pbibtex.exe -kanji=utf8 "%~n1"

platex.exe -no-guess-input-enc -kanji=utf8 -synctex=1 -interaction=nonstopmode -src-specials "%~1"

dvipdfmx.exe %~n1.dvi
```

## updatePDF.bat の内容

updatePDF.bat は sumatraPDF を開きつつ、
notepad++ <--> sumatraPDF の間を行き来できるようなオプションを設定するバッチです。

```
@echo off
rem param1	pdf ファイルのファイル名（拡張子含）
rem param2	notepad++.exe の絶対パス
rem param3	tex ファイルの行番号

start SumatraPDF.exe -reuse-instance %~n1.pdf -inverse-search "\"%~2\" \"%%f\" -n%%l" -forward-search "%~1" %~3
```

# 使い方

notepad++ で tex を開いた状態で、

1. F6 キーを押す
2. コンボボックスから updatePDF を選択して OK ボタンを押す

以上の操作で PDF が作成され、tex の編集行に該当する PDF のページが開きます。
逆に PDF ファイルの適当な行をダブルクリックすると、notepad++ にフォーカスが移り、編集行がダブルクリック位置に該当する位置に移動します。
【Swift】UIWindowのrootViewControllerに代入したUINavigationControllerを別のUINavigationControllerに切り替える方法

UINavigationControllerによる画面遷移をアプリ起動時の最初の画面から行いたい時があります。
そんな時はAppDelegateのapplication application:didFinishLaunchingWithOptionsメソッド内でwindow?.rootViewControllerにUINavigationControllerのインスタンスを代入するわけですが、window?.rootViewControllerに後で他のUINavigationControllerのインスタンスを代入する方法で少し詰まったのでメモしておきます。


```
//新たにrootViewControllerにする画面を生成
var newRootVC = UIViewController()
var navigationController = UINavigationController(rootViewController: newRootVC)
    
UIApplication.sharedApplication().keyWindow?.rootViewController = navigationController
```

上記のソースコードを画面遷移として書いてやればオーケー。
それまで画面遷移で連なっていたUINavigationControllerとその遷移している全ての画面は破棄されます。

解説するとUIApplication.sharedApplication().keyWindow?で現在最前面のUIWindowを取得できるので、それのrootViewControllerに新たなrootViewとなる遷移先UIViewControllerをrootViewControllerをもつUINavigationControllerを代入しています。
node.js でプラガブルなプラットフォームを開発するときのメモ

**※随時更新する　最新の思想を知りたい**

# 参考リンク

## フロントエンド関係

人気上昇中のJavaScriptライブラリを調べてみた［ジャンル別に比較］ - Build Insider - http://goo.gl/aGZIhs

## バックエンド関係

Round 9 results - TechEmpower Framework Benchmarks - http://goo.gl/jjFcsN
10 Best Node.js MVC Frameworks for JavaScript Developers » CODECALL - http://goo.gl/AWQVr9

↑の記事の上位

total.js - Web application framework for node.js - http://goo.gl/nEPkud
Sails.js | Realtime MVC Framework for Node.js - http://goo.gl/VtBna8

## プラガブルな設計全般の話

language agnostic - How To Create a Flexible Plug-In Architecture? - Stack Overflow - http://goo.gl/tE3mwc
CatalystとRailsにみるフレームワークの設計思想 - Angelos in Action - angelosグループ - http://goo.gl/6BpVY

# おまけ

## 開発環境

node.jsの開発環境をマッハ構築（Windows & Eclipse編） | パープルレイク４丁目 - http://goo.gl/aQL1zo
Node.js 日本ユーザグループ - http://goo.gl/isMt
hakobera/nvmw - http://goo.gl/2a51VK
Nodeclipse - Installation Instructions - http://goo.gl/0aNJuJ
Ubuntu14.04でIntel EdisonをDebian化してDockerでUbuntuのコンテナを作る1 

http://qiita.com/yoneken/items/dda4fdbb9f415a0db3e9

より、Ubuntu14.04上で作業する差分

##Debianのイメージをダウンロード
http://www.emutexlabs.com/ubilinux
より
ubilinux for Edison
をクリックしてダウンロード
https://communities.intel.com/thread/56092?sr=stream&ru=355876
このへんに質疑応答が書いてあるように見える。
どうもBluetoohは頑張ってBluz入れないとつかえないようだ。
##dfu-utilをインストール
uboot系の書き込みを手伝ってくれるツールのような気がする。
`sudo apt-get install dfu-util`

##Edison実機へFlash
Debianのイメージのubilinux-edison-ww44.5.tar.gzを解凍して
できたtoFlashフォルダに遷移する。
で一度マシンからEdisonを切り離して、

`sudo ./flashall.sh` 
を実行
あとUSB OTGに接続するとフラッシュが始まる。
この際補助電源は必要なかった。
ちなみにシリアルの方につないでも何も起こらない、3分ほどでタイムアウトするので注意。
終わったら「5分まって、2回再起動するから、その後2分待ってね」の英語メッセージが出るので待つ。

##アクセス
シリアルの方につないでアクセス。

`screen /dev/ttyUSB0 115200 -L`

"Debian GNU/Linux 7 ubilinux ttyMFD2"
なんて出てきたら成功！

ログインは root/edison 

##設定
まあこっから先は普通のDebianです。
`ifconfig -a`

wlan0が居ることを確認。
usb0というインターフェイスが起動してデフォルトゲートウェイを握っているので落とす。
`ifconfig usb0 down`
ネットワークの設定
`nano /etc/network/interfaces `
まあ適当にWPAようにauto wlan0のコメントアウトを外して、SSIDとパスワードを設定。
ただusb0はコメントアウトしておく。

ネットワークを再起動
`service networking restart`

これで接続ができます。
###sshで接続
`netstat -an | grep 22`
で見ると行が帰ってくるので、SSHもバッチリな模様

実際に
`ssh root@192.168.0.x`
とつなげにてみるとYoctoLinuxに比べて非常に快適。
あのシリアルに繋がっていない時以外は異常に遅いのがYoctoLinuxのssh

で、apt-get update,apt-get dist-upgradeとやるとi386の文字が・・・
あ、しまった・・・こいつ32bit版だぞ・・・
Dockerは基本64bit用・・・

ちなみにこの時点でのディスク状態。ちょっと辛いものが・・・
`root@ubilinux:~# df -h 
Filesystem       Size  Used Avail Use% Mounted on
rootfs           1.4G  566M  750M  43% /
/dev/root        1.4G  566M  750M  43% /
devtmpfs         481M     0  481M   0% /dev
tmpfs             97M  300K   96M   1% /run
tmpfs            5.0M     0  5.0M   0% /run/lock
tmpfs            193M     0  193M   0% /run/shm
tmpfs            481M     0  481M   0% /tmp
/dev/mmcblk0p7    32M  5.1M   27M  16% /boot
/dev/mmcblk0p10  1.6G  2.4M  1.6G   1% /home`


##64bitにDebianを移行する。
自力で64bit版イメージを作るのもそこまで技術力はないので
http://d.hatena.ne.jp/pyopyopyo/20120219/p1
を頼りにアップグレードをする。

`cat /proc/cpuinfo`
これで見るとlmがあるので64bitには対応している。
まあ64bitなWidowsタブレットと同じCPUファミリーだから当然といえば当然。

まずはカーネルのバージョンを確認
`dpkg -l | grep linux`
3.2.63-2+deb7u1が入っているようだ。
64bit版はlinux-image-3.2.0-4-amdな模様。

/bootが小さい可能性があるので注意
なのでカーネルだけでもアップグレードする。amd64-libsはWheezyからは必要なくなったらしい。
`apt-get install linux-image-3.2.0-4-amd`

インストールできたカーネルをubootで読むファイルに変換する。
`mv /boor/vmlinuz-3.2.0-4-amd /boor/vmlinuz`

ここで一度再起動
`reboot`

###再起動したら
***しなかった***
ので次回カーネルビルドから再開したい。
ここにリアルタイムカーネルのパッチを当てた猛者が居るので参考にして。
https://communities.intel.com/message/261307

*もしくは*
http://jmkeyes.github.io/post/running-docker-on-debian-i686/
で32bit版Debianで頑張ってDockerを使ってみる手を考える。
目的はfleetとかフェイルオーバー連携系も動かしたいのでできれば64bitにしたいのだが・・・
I/O を伴うテストには bytes.Buffer が便利

Ruby では I/O を伴うテストには `StringIO` オブジェクトを使うことが多いとおもいます。
これは文字列を `IO` オブジェクトと同じインターフェイスで操作するためのものです。

Golang でも似たようなことをやるにあたって、調べてみたところ標準ライブラリの `bytes.Buffer` が使えそうだということがわかりました。
ここでは I/O を伴うプログラムをテスタブルに実装し、`bytes.Buffer` でユニットテストを書くところまでを紹介します。

なお、私は Golang については初心者なので、より良いやり方等あれば是非教えてください。

# 実装するプログラム

全く実用的ではないですが、標準入力を受け取り、それを 2 度出力するプログラムを書いてみます。

以下のように動作します。

```
$ echo foo | ./double
foo
foo
```

## 実装してみる

こんな感じのプログラムを用意してみました。

```go:main.go
package main

import (
	"io"
	"io/ioutil"
	"os"
)

func main() {
	err := Double(os.Stdin, os.Stdout)
	if err != nil {
		panic(err)
	}
}

func Double(stdin io.Reader, stdout io.Writer) error {
	buf, err := ioutil.ReadAll(stdin)
	if err != nil {
		return err
	}

	stdout.Write(buf)
	stdout.Write(buf)

	return nil
}
```

このプログラムを実装するにあたってのポイントは以下の通りです。

### テスト対象のロジックを関数に切り出す

ユニットテストをする上では当たり前ですが、まずはテスト対象を関数に切り出さなければなりません。
このプログラムにおいては `Double()` 関数をテストできるように切り出しています。

### 構造体ではなくインターフェイスの型に依存させる

`Double()` 関数は引数として標準入力と標準出力の構造体へのポインタを受け取ります。
この場合は、例えば以下のように書くこともできます。

```go
func Double(stdin *os.File, stdout *os.File) error {
}
```

ですが、ここではそうではなく、`io.Reader` や `io.Writer` を指定しています。

こうすることで、本物の `os.File` 構造体を用意せずとも、`io.Reader` や `io.Writer` インターフェイスを実装した何かであれば何でも使うことができます。
`io.Reader` は `Read()` メソッドを、`io.Writer` は `Write()` メソッドをそれぞれひとつだけ持ったシンプルなインターフェイスです。

## ユニットテストを書いてみる

次に、上記の実装をユニットテストするコードを書いてみます。

```go:main_test.go
package main

import (
	"bytes"
	"testing"
)

func TestDouble(t *testing.T) {
	stdin := bytes.NewBufferString("foo\n")
	stdout := new(bytes.Buffer)

	err := Double(stdin, stdout)
	if err != nil {
		t.Fatal("failed to call Double(): %s", err)
	}

	expected := []byte("foo\nfoo\n")

	if bytes.Compare(expected, stdout.Bytes()) != 0 {
		t.Fatal("not matched")
	}
}
```



このテストコードのポイントは以下の通りです。

### ファイル (標準入出力) の代わりに `bytes.Buffer` を使用する

`stdin` と `stdout` はそれぞれ書き方は違うものの、いずれも `bytes.Buffer` 構造体を生成しています。
`stdin` には `"foo\n"` という文字列を持ったものとして生成し、`stdout` については空の状態で初期化しています。

```go
stdin := bytes.NewBufferString("foo\n")
stdout := new(bytes.Buffer)
```

これは Ruby でいえば以下のような感じになるでしょうか。


```rb
stdin = StringIO.new("foo\n")
stdout = StringIO.new
```

### 書き込まれたバイト列を `bytes.Buffer.Bytes()` で読み込んで比較する

`bytes.Buffer` に書き込まれたバイト列は `Bytes()` メソッドで読み出すことができます。
これを期待されるバイト列 `expected` と比較することでアサーションを行っています。

なお、`bytes.Buffer` は `String()` メソッドも持っており、これは `string` として読み出すことができます。
その場合は `expected` も `string` で指定する必要があります。

`Bytes()` と `String()` のどちらを使うべきか、については私自身はよくわかっていないのですが、`[]byte` と `string` の変換にかかるオーバーヘッドを考えると、`Bytes()` がいいのではないかと思っています。
とはいえ、今回実装した程度であればどちらでも誤差程度しか違わないでしょう。
clang-formatを使って見る



## 概要

Cocos2d-xで、自分の作成したソースをclang-formatで綺麗にしてみる。
空白などが整えられて、Gitの差分を見る際になんか気持ちいい。


## 環境

- Mac OS X Yosemite 10.10.1
- LLVM 3.5.0
- Cocos2d-x v3.3


## インストール

[LLVM Download Page](http://llvm.org/releases/download.html)からPre-built Binariesをダウンロードする。
今回は ``Clang for Darwin 10.9`` をダウンロードして解凍。

```bash
clang+llvm-3.5.0-macosx-apple-darwin.tar.xz/
`- bin/
   `- clang-format
```

clang-formatを/usr/local/binにコピーする。

```bash
$ cp clang-format /usr/local/bin
```


## .clang-formatをプロジェクトルートに配置

```bash
.clang-format
```

Cocos2d-xのプロジェクトルートに上記ファイルを作成する。
内容は[こちら](https://gist.github.com/kiarina/165380598d1c5da71830)などを参考にして適当に。
このファイルの設定をもとにフォーマットされる。


## 実行

```bash
$ clang-format -i `find Classes/ -type f`
```

プロジェクトルートで上記を実行する。
うん。いい感じ。


## 参考

* [スタイルオプション(日本語)](http://algo13.net/clang/clang-format-style-oputions.html)
Intel Edison Lチカ

流行りのIntel EdisonでLチカです。

1.8Vで動くLEDを用意しましょう。
J１９の３番にGND、J１８の２番に＋ピンを差し込みます。

```bash:blink.sh
#!/bin/sh

echo "165" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio165/direction

while : ; do
  echo "1" > /sys/class/gpio/gpio165/value
  sleep 1
  echo "0" > /sys/class/gpio/gpio165/value
  sleep 1
done
```

動画
--------------

http://youtu.be/Tgzo8cWBgBQ

参考
-----------
- http://tech.recruit-mp.co.jp/gadget/intel-edison-getting-started/
- http://qiita.com/yoneken/items/1b24f0dd8ae00579a0c2
SendGrid+PHP(SwiftMailer)+UTF-8でメールを送信する

クラウドメールサービス[SendGrid](https://sendgrid.kke.co.jp)を使ってPHP(SwiftMailer)からメールを送ってみます。
SendGridを使ってメールを送る方法はいくつかあります。詳しくは[公式ブログ](https://sendgrid.kke.co.jp/blog/?p=1300)を参照してください。

- SMTP
- Web API
- マーケティングメール機能

今回はSMTPとX-SMTPAPIを組み合わせて宛先毎に内容の異なるメールを送ってみます。

# SMTP
SMTPはWeb APIに比べて細かいメール送信パラメータを指定できるのがメリットですが、それが面倒な場合、デメリットにもなります。今回はUTF-8でメールを送ります。

# X-SMTPAPI
名前がSMTPっぽくて紛らわしいですが、[X-SMTPAPI](https://sendgrid.kke.co.jp/blog/?p=1300)はSendGrid独自の拡張ヘッダです。これを利用するとメール送信時にSendGridの様々な機能を使うことができます。今回は、To、Substitution、Sectionを利用してメールの件名や本文内の特定のキー文字列を宛先毎に異なる値に置換してメールを送ってみます。

# とりあえず送ってみる
サンプルコードの実行手順は[こちら](https://github.com/SendGridJP/sendgrid-smtp-swiftmailer-example)。
PHPは5.5.14で動作確認していますが、SwiftMailerが動く程度の適度に古い環境であればたぶん動くと思います。

# コード

```php
<?php
require_once 'vendor/autoload.php';

Dotenv::load(__DIR__);
$sendgrid_username = $_ENV['SENDGRID_USERNAME'];
$sendgrid_password = $_ENV['SENDGRID_PASSWORD'];
$tos               = explode(',', $_ENV['TOS']);
$names             = explode(',', $_ENV['NAMES']);
$from              = $_ENV['FROM'];

// create a transport
$transport = Swift_SmtpTransport::newInstance('smtp.sendgrid.net', 587, 'tls')
  ->setUsername($sendgrid_username)
  ->setPassword($sendgrid_password);
$mailer = Swift_Mailer::newInstance($transport);

// create a message
$message = Swift_Message::newInstance()
  ->setSubject('こんにちはSendGrid')
  ->setTo($from)
  ->setFrom($from)
  ->setBody(
    "こんにちは、nameさん\r\nようこそ〜テキストメールの世界へ！",
    'text/plain'
  )
  ->addPart(
    "<html>".
    "<body bgcolor=\"#d9edf7\" style=\"background-color: #d9edf7;\">".
    "こんにちは、nameさん<br>ようこそ〜HTMLメールの世界へ！<br>".
    "</body></html>",
    'text/html'
  )
  ->attach(Swift_Attachment::fromPath('./logo.gif'));

// x-smtpapi header
$smtpapi = new Smtpapi\Header();
$smtpapi->setTos($tos);
$smtpapi->addSubstitution('name', $names);
$smtpapi->addCategory('category1');
$headers = $message->getHeaders();
$headers->addTextHeader(
  'x-smtpapi', $smtpapi->jsonString(JSON_UNESCAPED_UNICODE)
);

// send the message
echo $message->toString();
echo $mailer->send($message);
```
Ruboty | Ruboty Handler Plugin 作成時の README テンプレートジェネレータ ruboty-megen を作成した #ruboty

# Ruboty | Ruboty Handler Plugin 作成時の README テンプレートジェネレータ ruboty-megen を作成した #ruboty
## 概要
Ruboty Handler Plugin 作成時の README テンプレートジェネレータ ruboty-megen を作成した

## 用途
Ruboty の Handler Plugin を作成する際、大抵の方は `bundle gem` を利用しておられると思います。
しかし、 `bundle gem` がデフォルトで出力する README に含まれるのは

* Installation
* Usage
* Contribution

のみです。

Ruboty の Handler Plugin を作成時、例えば下記のような内容はテンプレートとして出力したほうが良い気がします。

* Commands
    * 利用可能なコマンドの一覧。 patterns, description, name を記載
* ENV
    * 利用する環境変数の説明を記載
* Dependency
    * 外部 API 利用時など、依存先の情報（APIのドキュメントへのリンクなど）を記載

これによって、毎回記述する項目を手で記述する手間がなくなり、 このジェネレータが普及するほど
Handler Plugin 開発者の README のフォーマットが統一されます。

## 設定
内部DSL ( Rubotymegen ) によって設定を行います。

|key|value|example|
|:--|:--|:--|
|user_name|github user 名|tbpgr|
|gem_class_name|gem 名|Ume|
|gem_name|gem 名|ume|
|title|タイトル文字列|An Ruboty Handler + Actions to output N line messages.|
|env/name|環境変数|DEFAULT_UME_TEXT|
|env/description|環境変数の説明|default ume text|
|dependencies/name|依存先名称|Ume API|
|dependencies/description|依存先説明|ttp://ume.text.jp|
|commands/command name|Ruboty::Handler.on の name に設定する内容 ※件数分|ume|
|commands/command pattern|Ruboty::Handler.on の pattern に設定する内容 ※件数分|/ume (?<count>.*?)\z/  |
|commands/command description|Ruboty::Handler.on  の description に設定する内容 ※件数分|output empty message N lines (<count> times)|

## 設定例

~~~ruby
# encoding: utf-8
user_name "tbpgr"

gem_class_name "Ume"
gem_name "ume"

title "An Ruboty Handler + Actions to output N line messages."

env do |e|
  e.name "ENV1"
  e.description "ENV1 desc"
end

env do |e|
  e.name "ENV2"
  e.description "ENV2 desc"
end

dependency do |d|
  d.name "dependency2"
  d.description "dependency2 description"
end

command do |c|
  c.name "ume"
  c.pattern "/ume (?<count>.*?)\z/"
  c.description "output empty message N lines (<count> times)"
end

command do |c|
  c.name "umec"
  c.pattern "/umec (?<text>.+?) (?<count>.*?)\z/"
  c.description "output <text> message N lines (<count> times)"
end
~~~

## 出力例

[sample output README](https://github.com/tbpgr/ruboty-megen/tree/master/sample/README.md)

## 参照
[ruboty-megen GitHub](https://github.com/tbpgr/ruboty-megen)
[ruboty-megen RubyGems](http://rubygems.org/gems/ruboty-megen)
[Ruboty関連記事](http://qiita.com/tbpgr/items/f16c506c4a2636e95d34)
シェル起動時の「Last login:」を表示しないようにする


あんまり気にしたことなかったけど、知らなかったのでメモ。

シェルの起動直後、以下のように最終ログイン時間が表示される。

```
Last login: Mon Nov 10 00:03:21 on ttys005
$ 
```

この表示が必要ない場合、以下のコマンドを実行してホームディレクトリ配下に`.hushlogin`ファイルを作成すると、次回移行のシェル起動時に最終ログイン時間が表示されなくなる。

```
$ touch ~/.hushlogin
```

## 参考記事
* [Badassify your terminal and shell](http://jilles.me/badassify-your-terminal-and-shell/)
MAMPでサーバー起動時にエラー(here is a problem with the server ports. Each server must be assigned a unique port. Please check your configuration.)が表示され、うまく起動できない時の対処法。

WordPressでサイトを制作しようと思い、
以前使用していたMAMPをアンインストールして最新版のMAMPをインストール&初期設定しようとおもったら。。。

設定→ポート→[WebとMySQLのポートを80と3306に設定]しようとおもうと
以下のようなエラーが表示されました。

here is a problem with the server ports. Each server must be assigned a unique port. Please check your configuration.

ポートが競合しているよ！ということだったので、portsscanを使ってしらべてみたけど。。。なんか違う原因みたい。



格闘すること２時間。ついに！？



海外のフォーラムに、こんな記事が見つかったということで、じっせん。
http://stackoverflow.com/questions/26512279/error-changing-the-port...

httpd.confの48行目と182行目（エディタによって行数に違いがでます。）を以下のように変更しろと。
48行目
 => Listen 80
179行目 => ServerName localhost:80

※httpd.confは以下にあります。(ただし通常インストールの場合)
/Applications/MAMP/conf/apache/httpd.conf


結果、だめー＞＜



さらに格闘すること1時間。こんどこそ解決！
（ちなみに、上記の作業は無駄ではないです。設定はそのままで以下を追加設定してください。）

ApacheとNginxのポートが別になるように設定してください。

MAMPのデフォルト値が以下です。
Apache:8888
Nginx:7888
MySQL8889

↓以下に設定！

Apache:80
Nginx:7888
MySQL:3306

Webサーバーとして使う方を80に設定して、使わない方をMANPのデフォルトを
使うように設定する。らしいです。

私はサーバー周りの知識が乏しいので初めてしったのですが、MAMPではApacheとNginxを両方起動することが出来ないらしいです。

以上です。
geminabox gem インストール済み環境の gem install 利用時に private gem server が起動していない場合

# geminabox gem と gem install
## 前提
* local OS: Windows7
* Cygwin
* Ruby 2.0
* geminabox gem (ver 0.12.4)

## 現象
geminabox で作成した private gem サーバーとのやりとりのために、
ローカル環境に geminabox gem をインストール。

~~~bash
$ gem install ./pkg/some.gem
~~~

private gem サーバーが起動していない時に local の gem をインストールしようとすると
gem install が終わらない。

debug option を指定して実行すると、 `NoMethodError` エラーが発生し続けていた。

~~~bash
Exception `NoMethodError' at /path/to/ruby/lib/ruby/site_ruby/2.0.0/rubygems/package.rb:453 - undefined method `readpartial' for #<Gem::Package::TarReader::Entry:0x33fc018>
Exception `NoMethodError' at /path/to/ruby/lib/ruby/site_ruby/2.0.0/rubygems/package.rb:429 - undefined method `readpartial' for #<Gem::Package::TarReader::Entry:0x33f1f38>
Exception `NoMethodError' at /path/to/ruby/lib/ruby/site_ruby/2.0.0/rubygems/package.rb:595 - undefined method `readpartial' for #<Gem::Package::TarReader::Entry:0x2c85498>
:
Exception `Resolv::ResolvError' at /path/to/ruby/lib/ruby/2.0.0/resolv.rb:491 - DNS result has no information for _rubygems._tcp.some_ip
~~~

some_ip のところは、 private gem server の ip

private gem サーバーを起動したら問題なくインストールできるようになった。

ネットワーク関係ないローカル環境のインストールに干渉されるの、きつい。
あまり深追いして時間を使いたくなかったので、ひとまず private gem サーバー起動で暫定対応。

ちなみに、 bundle gem で作成した環境の rake task を利用して
`bundle install` をする場合も内部的に `gem install` を呼んでいるので同じ影響を受ける。
Python 3 で少しだけ便利になった datetime の新機能


datetime モジュールは Python の標準ライブラリの中でも、使用頻度が高い割に罠が多かったり使い方が難しかったりする、あまりイケてないモジュールだと個人的に思っています。

そんな datetime モジュールですが、 Python 2 のプロジェクトを Python 3 に移行した時に大分コードを整理できてちょっと感動したので紹介しておきます。

## unixtime との相互変換

unixtime から `datetime.datetime` への変換は、 ローカルタイムなら`.fromtimestamp()` で、 UTC なら `.utcfromtimestamp()` 関数で行います。

```python
>>> import time
>>> from datetime import datetime
>>> now = time.time()
>>> now
1415542873.099776

>>> loc = datetime.fromtimestamp(now)
>>> loc
datetime.datetime(2014, 11, 9, 23, 21, 13, 99776)

>>> utc = datetime.utcfromtimestamp(now)
>>> utc
datetime.datetime(2014, 11, 9, 14, 21, 13, 99776)
```

しかし、逆に `datetime` から unixtime への変換は直接できず、一旦 `.timetuple()` メソッドで `time.struct_time` 型に変換する必要があります。
しかも、そこから unixtime に戻すとき、ローカルタイムなら `time.mktime()` で行けますが、UTC の場合は `calendar.timegm()` が必要でした。このためだけに calendar モジュールを import するのが少し残念です。

```python
>>> time.mktime(loc.timetuple())
1415542873.0
>>> import calendar
>>> calendar.timegm(utc.timetuple())
1415542873
```

time モジュールはC言語の `time.h` の機能にOSごとの追加のタイマーを提供するだけで、 datetime は逆に Python 用に設計されているので、組み合わせて使おうとするとこのようなミスマッチが起きていました。

ですが、 Python 3.3 では datetime オブジェクトに直接 unixtime を生成する `.timestamp()` メソッドが追加されました。

```
>>> from datetime import datetime
>>> now = 1415542873.099776
>>> loc = datetime.fromtimestamp(now)
>>> loc.timestamp()
1415542873.099776
```

ただし、 `.timestamp()` は datetime 自体が持っている tzinfo を利用し、 tzinfo を持たない datetime (naive と呼ぶ) の場合は勝手にローカルタイムだとして計算します。
UTC の datetime を unixtime に変換したいときは、ちゃんと tz=utc を設定する必要があります。コレについては次のセクションで。

## timezone

datetime モジュールの datetime 型などで、タイムゾーン情報を持つものを aware, 持たないものを naive と呼びます。

naive な datetime は MySQL などほかの naive なソフトウェアとやりとりするときにおせっかいなタイムゾーン変換が入ってハマったりしない純粋な型として魅力があるのですが、 UTC と JST 両方を扱うプログラムを書くときなどは間違えて +9 を2回実行してしまったりとバグの原因になります。

世界のタイムゾーンについては IANA がデータベースを公開しているのですが、 Python のバージョンアップとタイミングが同期させられないので、標準ライブラリは抽象クラスだけを提供し、それを継承した実際のタイムゾーンクラスは pytz という非標準ライブラリで提供されていました。

ですが、夏時間が今のところ発生しない JST と UTC だけ使えれば十分なアプリケーションで、わざわざ世界中のタイムゾーン・データベースを利用するのはちょっと面倒です。
マルチバイト環境のことを考えたくないASCII圏の人の気持ちが分かる気がします。

Python 3 では、 `datetime.timezone` という、 UTC からの時差が固定で夏時間が存在しないタイムゾーンを扱うクラスが標準ライブラリで提供されていて、さらに UTC については `datetime.timezone.utc` が最初から提供されています。

これを使って、前のセクションでやった unixtime と datetime の変換を、今度は aware な datetime でやってみます。

```python
>>> from datetime import datetime, timezone, timedelta
>>> now = 1415542873.099776
>>> JST = timezone(timedelta(hours=+9), 'JST')

>>> loc = datetime.fromtimestamp(now, JST)
>>> utc = datetime.fromtimestamp(now, timezone.utc)
>>> print(loc)
2014-11-09 23:21:13.099776+09:00
>>> print(utc)
2014-11-09 14:21:13.099776+00:00
>>> loc.timestamp()
1415542873.099776
>>> utc.timestamp()
1415542873.099776
```

calendar モジュールもいらないし、 Python 2 のときよりシンプルかつバグを起こしにくいコードが書けるようになりました。

なお、 naive な datetime にタイムゾーン情報を付与するには、 `.replace()` メソッドを利用します。

```python
>>> naiveutc = datetime.utcfromtimestamp(now)
>>> naiveutc
datetime.datetime(2014, 11, 9, 14, 21, 13, 99776)
>>> naiveutc.replace(tzinfo=timezone.utc).timestamp()
1415542873.099776
```