OmniAICreator/Qiita-1.07M huggingface dataset:
Rustで算術オーバーフローを無視する

Rustで[算術オーバーフロー](https://ja.wikipedia.org/wiki/%E7%AE%97%E8%A1%93%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC%E3%83%95%E3%83%AD%E3%83%BC)が起こるとエラーが発生します。例えば

```rust
let a = 0xff as u8;
let b = 0x01 as u8;
println!("0x{:02x} + 0x{:02x} = 0x{:02x}", a, b, a + b);
```

を実行すると

> panicked at 'arithmetic operation overflowed'

といってプログラムが終了します。基本的には嬉しい機能ですが、これを無視したい場合は3通りの対応方法があります。

## std::num::Wrapping

最初の方法は [std::num::Wrapping](https://doc.rust-lang.org/std/num/struct.Wrapping.html) を使う方法です。

```rust
use std::num::Wrapping;
let a = 0xff as u8;
let b = 0x01 as u8;
println!("0x{:02x} + 0x{:02x} = 0x{:02x}", a, b, (Wrapping(a) + Wrapping(b)).0);
```

これを実行すると

> 0xff + 0x01 = 0x00

と標準出力に書きだされます。ちなみに `.0` の部分は `Wrapping` struct 内の `u8` にアクセスするために必要なやつです。

## wrapping_* メソッドを使う

[プリミティブな数値型に定義された `wrapping_*` メソッドを使うことができます](http://qiita.com/yuku_t/items/59f2c4fdbb5ec57f82dc#comment-81654a01e8ff07394b67)。（Thanks for @tatsuya6502 :clap:)

```rust
let a = 0xff as u8;
let b = 0x01 as u8;
println!("0x{:02x} + 0x{:02x} = 0x{:02x}", a, b, a.wrapping_add(b));
```

このメソッドは内部的に `std::num::Wrapping` を使っています。

## -Z force-overflow-checks=off

もう一つの方法は `rustc` のコンパイルオプションに `-Z force-overflow-checks=off` を渡すことです。これにより算術オーバーフローが発生してもエラーにならなくなります。

しかし、この方法は算術オーバーフローを無視するというよりは、算術オーバーフローが発生しないことが分かっている時に、パフォーマンス最適化のために指定するもののようです。

また、将来に渡ってこのオプションが提供されるのか、提供されるとして同じような意味を持ち続けるのかは不透明なので、先ほどの `std::num::Wrapping` や `wrapping_*` を使う方が無難そうです。

また現時点で `cargo` 経由でビルドする際に `rustc` のコンパイルオプションを指定する方法は無いみたいなので、 `cargo` を使う場合もこのアプローチを採用することはできません。

## 参考文献

- [Disabling arithmetic overflow checking - The Rust Programming Language Forum](https://users.rust-lang.org/t/disabling-arithmetic-overflow-checking/546/8)
無効になったドキュメントが残りやすい

### 十分に仕様が定まっていない開発をすると、無効になったドキュメントが残りやすい。
仕様書をネットワークドライブやSVNなどで共有していても、ドキュメントの管理は十分じゃないことを感じる。
ある時点ではそのとおりであったドキュメントが、開発のための仕様を変更していくと、実装とドキュメントの乖離を生じていく。
\#ifdef \#endifやブロックコメント化をしていって、従来あった機能がなくなっていくことがある。

だからといって、元々のドキュメントにその改変が改変されずに残りがちです。

### ソースコードはバージョン管理
ソースコードへの変更はバージョン管理されているので、だめだったら戻すことが容易です。そのため簡単に動作の確認をしますが、十分にその改変が安定していて使い物になることを確かめきる前に、ドキュメントを変えることは控えがちになります。
　そのうち、別の項目についての改変をすることになって、その前の変更についてドキュメントを変えることが忘れ去られてしまいがちになります。元のドキュメントを書いた人でない場合には、ソースコードの改変に対応して改変しなければならないドキュメントがあることなど気がつかない場合もあります。そのことも、ドキュメントが実装のコードの乖離を生じやすい要因となります。

### ヘッダファイルによる仕様の管理

この問題に対する私の提案は、仕様に関する記述は極力ヘッダファイルによる記述に移行することです。
ヘッダファイルのドキュメンテーションコメントの場合には、ソースコードと別ファイルのドキュメントよりは、メンテナンスされやすくなります。（それでもドキュメンテーションコメントが古くなってしまう場合もある）


詳しくは、以下のリンクに既に書いた内容をご参考ください。
[ヘッダファイルという名の仕様書](http://qiita.com/nonbiri15/items/f0730901fd195387731f)

追記

### MarkDown ファイルによるドキュメントの作成

Github で公開されているソフトウェアのReadmeやInstallの手順は .md という拡張子のついたテキストファイル(markdown ファイル)で書かれているのが大半だ。
それをまねて、自分の作るライブラリもmark downファイルでドキュメントを書くようになった。
こうすることで、ソースコードと同様にバージョン管理することが楽になった。
いつドキュメントがどのように改版されたかの違いがmark downファイルだと見やすい。

全てがすべてmark down ファイルで十分とは思わない。mark down ファイルで十分な分野があると主張しています。


### Jupyter notebook で実行結果のドキュメントを作る

Jupyter notebook を使うと、スクリプトとスクリプトの実行結果、markdown 記法のドキュメントとをipynb のファイルに書き込むことができる。実行可能なドキュメントなので、計算条件が変わったときには、スクリプト部分を修正して、全てのcellを再実行させることで、ドキュメントを最新の状況に更新できる。
　そのため、ドキュメントが古くなることを大幅に減らせます。


付記：
[ドキュメンテーションコストを下げる](https://qiita.com/nonbiri15/items/bc4a7f4bbfada58ff8a8)
swift-evolutionでAcceptedされた提案も実装は変わると思っておいた方がいい

クラスメソッド社のブログ[Swift 3.0の変更点まとめ](http://dev.classmethod.jp/smartphone/iphone/implemented_proposals_for_swift3/
)を見てて気づいたんですが、[SE-0005](https://github.com/apple/swift-evolution/blob/master/proposals/0005-objective-c-name-translation.md)で提示されている内容詳細が微妙に変化していた。

[SE-0005](https://github.com/apple/swift-evolution/blob/master/proposals/0005-objective-c-name-translation.md)はざっくり言うと、「Objective-C時代のメソッドをSwiftでは変えようぜ」ってな話だけど、そのSwiftでの新しい実装提案の詳細が変わっていた。

言いたいことを図にすると次の通り

```
Swift2時代のこれあるじゃん
↓
Swift3.0でこうしたい（Acceptedされて色々なブログが紹介したりした）
↓
Swift3.0ではやっぱりこうしようぜ（Implementationになった）
```

わかりますかね。

具体的にはSE-0005のHistoryを見ると[提案が変更されたコミット](https://github.com/apple/swift-evolution/commit/bf2e4c4bcb1ad3dd072920f33514546e75cf59bb#diff-8fccac400aa2c03fb7f851d067782d30L142)がそれに当たる。

これを先ほどの流れに合わせると次の通り

```
func moveToPoint(_: CGPoint) // Swift2時代（これおそらく _ point:って言いたいんだろうな）
↓
func moveTo(_: CGPoint)      // Accepted（これもおそらく _ point:って言いたいんだろうな）
↓
func move(to point: CGPoint) // そこからtoが外部引数名になった
```
Qiitaにある過去の記事、[Swiftに今後追加される言語仕様について調べてみた](http://qiita.com/yusuke_tashiro/items/5de142441c6daef8b1c0#se-0005-better-translation-of-objective-c-apis-into-swift-accepted)を見るとmoveToの段階でAcceptedされていたのでしょう。

ちなみに`moveTo` が `move(to` になったことは大きな違いがありますね。これ比較的良いなというか前置詞のToで終わるのがすごく違和感があって、他のメソッドも直されていて学びがあると思ったので別の記事に書くつもりです。

# まとめ

- Acceptedされてからも提案は変わっている
- 提案のステータスはAcceptedになってもImplementedされるときは提案自体修正される
- Acceptedされても詳細は変えられるのであくまでAcceptedのものはそれというスタンスで見ないといけない

つまり「Swift3.0からこうなるから今からそれに従おう」という気持ちはありますが提案の本質がAcceptedされたのであって詳細は変わる、という事を心がけていたいですね。

# 参考

- [SE-0005](https://github.com/apple/swift-evolution/blob/master/proposals/0005-objective-c-name-translation.md)
- [Swift 3.0の変更点まとめ](http://dev.classmethod.jp/smartphone/iphone/implemented_proposals_for_swift3/
)
- [Swiftに今後追加される言語仕様について調べてみた](http://qiita.com/yusuke_tashiro/items/5de142441c6daef8b1c0#se-0005-better-translation-of-objective-c-apis-into-swift-accepted)
Ruby知識ゼロの人間がChefを勉強する前にやったこと

# 経緯
ふとChefを勉強したくなったのですが、Chefでは動作を記述する際に
rubyの知識がいることを知って、まずは少しrubyを勉強しようと思いました。

なお、rubyは知識も書いたこともなく、いままでPHP、JavaScript、VB
をやってきた程度でした。

# どの程度知っておけばよいのか？
rubyの知識は必要とはいっても、どの程度知っておけばよいのだろうという
目処感を掴むために、以下のエントリを確認しました。
[Chef、Vagrantに興味があるけどRubyをやったことない技術者が最低限知っておいた方がいい知識　まとめ](http://dev.classmethod.jp/server-side/chef-vagrant-ruby/)

さすがにこれだけではないだろうなー、
と思っていたところChefのサイトにrubyの解説ページがあることを知りました。
[Chef Style Guide](https://docs.chef.io/ruby.html)
雰囲気は分かりました。けれど、この時点ではちんぷんかんぷんです。
いっぺんに全部は覚えられないし、もう少しちゃんとした解説も読みたいなと思い、
本を探すことにしました。

# たのしいRuby
Webでも「[とほほのRuby入門](http://www.tohoho-web.com/ruby/index.html) 」や「[Ruby入門](http://www.rubylife.jp/ini/)」など
の素敵なコンテンツを見つけましたが、個人的に本が好きなので本を探しました。

図書館に「[楽しいRuby 第4版](http://www.amazon.co.jp/%E3%81%9F%E3%81%AE%E3%81%97%E3%81%84Ruby-%E7%AC%AC4%E7%89%88-%E9%AB%98%E6%A9%8B-%E5%BE%81%E7%BE%A9/dp/4797372273)」があって少し試しながら読み進めていたのですが、
結構ボリュームもあり、正直途中で挫折しました。
「この本は辞書なんだ」と言い聞かせて図書館に返却しました。

# 初めてのRuby
「[初めてのRuby](http://www.amazon.co.jp/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AERuby-Yugui/dp/4873113679)」ありました、ボリューム控えめの本が。
2008年発行と古く、1.9までの対応となっています。
どうやら1.8と1.9は結構違っていても1.9から2.0はそんなに違わないようなので
いまでも通用するだろうと勝手に判断して、これを買って読むことにしました。
Chefを使うにあたって必要無さそうなところはサラッと流しています。
ブロックが特徴的だなと思いました。
（まだ読み途中です）

当初チンプンカンプンだった[Chef Style Guide](https://docs.chef.io/ruby.html)を
改めて見てみるとだいぶ読めるようになった気がします。
いざ書くとなるとまだまだ調べながらにはなると思いますが。

# これから
まだ具体的にChefははじめていませんが、rubyの雰囲気が分かったところで
レシピの見本等を色々見てみようと思います。

「rubyのこの辺を重点的にやっとくといいよ！」などあれば
ぜひ教えて下さい。
AWS S3の複数のファイルをプログラムから1回のリクエストで削除（iOS SDK, Swift）

AWSのSDKを使用してiphoneからAWS S3上のファイルを複数一度に削除する方法が少し分かりにくかったのでメモ。

```swift
    // S3のデータを削除する
    static func removeFileS3(removeFileList: [String], resultHandler:(isOK:Bool)->Void) -> Void {
        
        let s3Client = AWSS3.defaultS3()
        
        let deleteRequest = AWSS3DeleteObjectsRequest()
        
        // 削除対象の情報の入れ物
        let removeObjects = AWSS3Remove()
        
        var removeList = [AWSS3ObjectIdentifier]()
        
        for removeFile in removeFileList {
            
            if removeFile != "" {
                // 削除情報を保持
                let objectIdentifier = AWSS3ObjectIdentifier()
                
                // ファイル名をkeyに入れる
                objectIdentifier.key = removeFile
                
                removeList.append(objectIdentifier)
            }
        }
        
        removeObjects.objects = removeList
        deleteRequest.bucket = /* Bucket name */
        deleteRequest.remove = removeObjects
        
        // 削除処理の実行
        s3Client.deleteObjects(deleteRequest).continueWithBlock { (deleteResult) -> AnyObject? in
            
            if deleteResult.error == nil && deleteResult.exception == nil && !deleteResult.faulted {
                resultHandler(isOK: true)
                return true
            } else {
                print(deleteResult.error?.description ?? "nil")
                print(deleteResult.exception?.description ?? "nil")
                resultHandler(isOK: false)
                return false
            }
        }
    }
```

**参照**
公式ドキュメント：http://docs.aws.amazon.com/AWSiOSSDK/latest/Classes/AWSS3DeleteObjectsRequest.html#//api/name/requestPayer
eclipse ショートカット(移動のみ)

初エントリー。よろしくお願いします。

## Eclipseのショートカットは数が多い
種類を絞って覚えてもいいんじゃないかと思います。

## 移動

### F3
宣言を開く。一つだけ覚えるならこれ。

### Alt + ←
戻る。逆(Alt + →)も使える。

### Ctrl + .
次のエラーに飛ぶ。

### Alt + A -> f
ファイル検索。全てのファイルを対象に出来るので、
Java検索より使用頻度が高い。

### Ctrl + Alt + H 
呼び出し階層を開く。
コードを読む時によく使う。
Mac OS X El Capitan上でphp-buildするメモ

（2016/12/06追記）本稿の内容を勝手にやってくれるPull Requestがmergeされたので、下記のような苦労は過去のものになりました。「[MacOSX上でphp\-buildするときの苦労が減った話](http://qiita.com/hnw/items/3440237ce49b5fe5b7c2)」も合わせてご確認ください。

---

「[Mac OS X El CapitanからOpenSSLのヘッダファイルが消えた話](http://qiita.com/hnw/items/ac83e3ac8f9aa930b934)」で紹介したように、Mac OS X El Capitanの`/usr`以下のOpenSSLは0.9.8系かつヘッダファイルがないので、この環境で`php-build`でPHPをビルドしようと思ってもコンパイル中に死にます。

```
/var/tmp/php-build/source/7.0.6/ext/date/php_date.c:3756:5: note: use function 'llabs' instead
                                abs((utc_offset % 60)));
                                ^~~
                                llabs
6 warnings generated.
/var/tmp/php-build/source/7.0.6/ext/openssl/openssl.c:44:10: fatal error: 'openssl/evp.h' file not found
#include <openssl/evp.h>
         ^
1 error generated.
make: *** [ext/openssl/openssl.lo] Error 1
```

これを解決するために`configure`の`--with-openssl`オプションでHomebrewのOpenSSLを明示的に指定してやれば平和になるかと思いきや、これだけだと次のようにリンク時に死にます。

```
      _php_openssl_setup_crypto in xp_ssl.o
  "_TLSv1_1_server_method", referenced from:
      _php_openssl_setup_crypto in xp_ssl.o
  "_TLSv1_2_client_method", referenced from:
      _php_openssl_setup_crypto in xp_ssl.o
  "_TLSv1_2_server_method", referenced from:
      _php_openssl_setup_crypto in xp_ssl.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [sapi/cli/php] Error 1
```

これはMacOSX組み込みの古いlibsslをリンクしようとして死んでいます。結局、OpenSSLとLibxml2の両方についてHomebrewのものを指定する必要があります。

```
$ brew install openssl
$ brew install libxml2
$ PHP_BUILD_CONFIGURE_OPTS="--with-openssl=$(brew --prefix openssl) --with-libxml-dir=$(brew --prefix libxml2)" PHP_BUILD_EXTRA_MAKE_ARGUMENTS=-j4 phpenv install 7.0.6
```

これでうまくいく理由は、MacOSX組み込みのlibxml2と同じパスにlibsslが置かれているためです。組み込みのライブラリを1個も使わないようにすればライブラリのサーチパスにMacOSXのものが含まれなくなり、無事にHomebrewのOpenSSLが使われます。もしくは、リンク時の`-L`オプションの順序を調整すればHomebrewのOpenSSLと組み込みのlibxml2でリンクすることもできます。

~~こんな面倒なことをせずに`brew link --force openssl; brew link --force libxml2`という手もアリですが~~（←最近のHomebrewでは不可能になりました）、僕は慎重派なので個別対応しています。

## 参考URL

* [El capitan(OSX 10.11)に上げたらローカルのPHP環境移行で困ったことのいくつかメモ - uzullaがブログ](http://uzulla.hateblo.jp/entry/2015/10/10/001039)
* [OSX(El Capitan)でphpをビルドしたときにfatal error: 'openssl/evp.h' file not foundエラーの解決方法 - Qiita](http://qiita.com/DQNEO/items/d3fab9bee290c963518b)
* [php-buildで指定できる環境変数 - Qiita](http://qiita.com/hnw/items/c227d58528c147de15dd)
TensorFlowのRank, Shapeについて

TensorFlowのRank, Shapeについて以下を参考にして説明します。
(詳しくは本家サイトへ)

**Tensor Ranks, Shapes, and Types**
https://www.tensorflow.org/versions/r0.8/resources/dims_types.html


#tensorの生成

tensorとは行列のようなもので以下のように宣言します。
[1, 2, 3]

コードにすると

```py:tf_01.py
import tensorflow as tf
x = tf.constant([1,2,3])
print x      #tensor情報の出力

sess = tf.Session()
print sess.run(x) #tensor自体の出力
```
　

```:実行結果
$ python tf_01.py
Tensor("Const:0", shape=(3,), dtype=int32)
[1 2 3]
```
x = tf.constant([1,2,3])
この行にtensorを指定します。いろいろ試してみてください

`x = tf.constant([[1,2,3], [4,5,6], [7,8,9,], [0,2,3]])`
とすると

```:実行結果
Tensor("Const:0", shape=(4, 3), dtype=int32)
[[1 2 3]
 [4 5 6]
 [7 8 9]
 [0 2 3]]
```

`x = tf.constant([[1,2,3], [4,5,6], [7,8,9,], [0,2,3], [9,8]])`
のように中途半端なtensorはエラーになるので、どのような場合にエラーになるかならないか色々調べるのも良いでしょう。

#rank
tensorにはrankという概念があります。数学でもrank(階数)が出てきますが、数学のそれとは少し異なります。
[ ]のネストの数がrankです。つまり

rank = 1
`x = tf.constant([1,2,3])`

rank = 2
`x = tf.constant([[1,2,3], [4,5,6], [7,8,9,], [0,2,3]])`

rank = 3
`x = tf.constant([ [[1,2], [3,4]], [[5,6], [7,8]] ]`
`x = tf.constant([[[1]]])` これも３段入れ子なのでrank = 3

[ ]のネスト(入れ子)が何段になっているか数えます。
`tf_01.py`の最後に`print sess.run(tf.rank(x))`を追加するとrankも計算してくれます。


#shape
最後にshapeです。shapeはtensorの形を示します。

先ほどの実行結果にこのようなものがありましたね。
shape=(4, 3)がまさにshapeを表しています。
行列のように考えるとこれは4x3なのでshape=(4, 3)です。

また2段目の[ ]が4つ、その中に要素が3つあるのでshape=(4, 3)と考える事もできます。

```:実行結果
Tensor("Const:0", shape=(4, 3), dtype=int32)
[[1 2 3]
 [4 5 6]
 [7 8 9]
 [0 2 3]]
```

**1次元目の要素数、2次元目の要素数、n次元目の要素数と数えます。**
外側から[ ]の数を数えていき、最終的には[ ]の中身の要素数を数える事もできます。

もう1つ例です。

```py:tf_02.py
import tensorflow as tf
x = tf.constant([ [[1,2], [3,4], [5,6]], [[7,8], [9,10], [11, 12]]])
print x

sess = tf.Session()
print sess.run(x)
print sess.run(tf.rank(x))

```
　

```:実行結果
Tensor("Const:0", shape=(2, 3, 2), dtype=int32)
[[[ 1  2]
  [ 3  4]
  [ 5  6]]

 [[ 7  8]
  [ 9 10]
  [11 12]]]
3

```
1次元目の要素数 = 2　　//2段目[ ]が何個あるか
2次元目の要素数 = 3 　　//3段目[ ]が何個あるか
3次元目の要素数 = 2 　　//3段目[ ]内の要素数


tensorflowは現在勉強中で間違い等あるかもしれません。
以上
ScalaでHTMLエンコードされた文字列をデコードする

Javaで利用可能なHTMLエスケープライブラリ[unbescape](http://www.unbescape.org/usingunbescape.html)を利用します。

## ライブラリの取得
build.sbtに以下の記述を追加します。

```scala
libraryDependencies += "org.unbescape" % "unbescape" % "1.1.3.RELEASE" 
```

## 文字列をデコード
デコード処理のサンプルコードです。

```scala
import org.unbescape.html.HtmlEscape

val encodedText = "&lt;script&gt;alert(&quot;foo&quot;)&lt;/script&gt;"
val decodedText = HtmlEscape.unescapeHtml(encodedText)

println(decodedText) // <script>alert("foo")</script>
```
activerecord all

rails 3
```rb
1.9.3-p551 :044 > Post.all.class
  Post Load (4.6ms)  SELECT "posts".* FROM "posts" 
 => Array 

1.9.3-p551 :046 > Post.scoped.class
 => ActiveRecord::Relation 
```

rails 4 scoped 启用了

```rb
2.2.3 :004 > Post.all.class
 => Post::ActiveRecord_Relation 
2.2.3 :005 > Post.where(nil).class
 => Post::ActiveRecord_Relation 
2.2.3 :006 > 
```

where(nil) rails 3 rails 4 通用
railsのmodelにindexが貼ってあるかどうかを確認する方法

modelが多いとindex貼ってあるのかな？って思い、調べることがありました。

sqlでも調べることができますが、railsでも調べることができます。

```rb
モデル名.connection.index_exists?(:テーブル名, :カラム名)
```

Blogモデルのuser_idにindexがあるのかどうかの確認です。

```rb
Blog.connection.index_exists?(:blogs, :user_id)
```

mysqlの場合はモデルの一覧で表示してくれるので、sqlで調べる方がいいかもしれません。
Cordova(Android)のCLIでVM Heap Errorが出たとき


CLI Version = 5.4.0

コマンドプロンプトでもそもそしてたら以下のエラーが出た。

> C:\Users\User\Desktop\cordova_sample\sample\sample>cordova run android
> 
> (中略)
> 
> FAILURE: Build failed with an exception.
> 
> * What went wrong:
> Unable to start the daemon process.
> This problem might be caused by incorrect configuration of the daemon.
> For example, an unrecognized jvm option is used.
> Please refer to the user guide chapter on the daemon at  http://gradle.org/docs/2.2.1/userguide/gradle_daemon.html
> Please read the following process output to find out more:
> -----------------------
> Error occurred during initialization of VM
> Could not reserve enough space for object heap
> Error: Could not create the Java Virtual Machine.
> Error: A fatal exception has occurred. Program will exit.
>
>
> * Try:
> Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
> 
C:\Users\User\Desktop\cordova_sample\sample\sample\platforms\android\cordova\node_modules\q\q.js:12
> 6
>                     throw e;
>                           ^
> Error code 1 for command: cmd with args: /s /c "C:\Users\User\Desktop\cordova_sample\sample\sample\
platforms\android\gradlew cdvBuildDebug -b C:\Users\User\Desktop\cordova_sample\sample\sample\platf
orms\android\build.gradle -PcdvBuildArch=arm -Dorg.gradle.daemon=true"
> ERROR running one or more of the platforms: Error: cmd: Command failed with exit code 8
You may not have the required environment or OS to run this project

## 対処
1. `(CordovaProject)/(ProjectName)/platforms/android/cordova/lib/build.js`を開く。
2. [こちらの記事](http://qiita.com/keigodasu/items/ff6360f93132246b9ce2)を参考に、241行目あたりに`args.push('-Dorg.gradle.jvmargs=-Xms512m -Xmx1024m');`を追加してあげる。

```js
            // 10 seconds -> 6 seconds
            args.push('-Dorg.gradle.daemon=true');
            args.push('-Dorg.gradle.jvmargs=-Xms512m -Xmx1024m');    // <- これを追加
            args.push.apply(args, opts.extraArgs);
```
css履歴書の逆襲


訳あって履歴書を書くことになったので以前挫折したcss組版での
細かめな履歴書作成に再チャレンジしようと思いました。

同じことやろうとしてる人を見つけたので需要ないわけではないんかなあと。
[[失敗]HTML5とCSS3で履歴書を作ろうとした話](http://qiita.com/manzyun/items/1354038bfbaa262fc480)

あと作成にはこの記事を全面的に参考にしてます。
[そろそろ真面目に、HTMLで帳票を描く話をしようか](http://qiita.com/cognitom/items/d39d5f19054c8c8fd592)

# どんな成果物ができたか
![スクリーンショット 2016-05-18 21.45.07.png](https://qiita-image-store.s3.amazonaws.com/0/88317/8ef8cea6-6558-c95d-4366-c687da175dbc.png)

はいどうぞ　つ[liarnose/resume](https://github.com/liarnose/resume)

### 2016/05/19追記
よく考えたらGithub Pagesで即見れるようにしとけばよかったですね。
つ[liarnose/resume on gh-pages](http://liarnose.github.io/resume/)



ここに辿り着くまでにちょっと紆余曲折があったのでそこらへんの話を下に続けます。

## 枠線は svg で引く
cssの枠線はびみょーにかゆい所に手が届かず最終的に選んだのが
「枠線は文書内容のマークアップとは全く別に用意してしまう」というアプローチでした。
アイデアとしてはこちらの記事からのイタダキです。[CSSによる組版作業とその効率化](http://qiita.com/tohashi/items/b1b35660e1a8047bb2c1)

このsvg枠線は「WYSIWYGなツールで作るんなら全部そっちでやれよ」と思ったので、
「紙でレイアウトを組む」→「テキストべた打ちでsvgを書く」という先史時代な方法で実現しています。

svgの中もmm表記を使っておけば不意のズレとかも起こりづらいかなあと期待していたのですが、
path要素の中でmmを使ったりがどうも難しいみたいだということで断念しています。

viewportの大きさと描写時のmmでの大きさを合わせて(≒描写時にpx→mmに拡大し)
svgの中の単位なしの数字が実質mmとして扱えるようにはしているのですが、
これだと「svgの中にtext要素を配置してそのフォントサイズはptで指定」みたいなことは
できなくなるので100%の大きさで作るのとは一長一短というところでしょうか。

### cssで手の届かないかゆい所

履歴書で言うと一番最初に出てくる「証明写真の枠の分へこんでる線のかたまり」を
cssでやろうとして数日間悶絶しました。

- ボックスをfloatなどを駆使してつなげると外側だけ枠線を太くする処理ができない。
- tableで組んだり[jagrid](https://github.com/kawasima/jagrid/)を使うとマークアップの形が崩れがち。
- 枠線が仮想のボックス枠をペンでなぞるようには書けないのでabsoluteで置いても何かとずれる。
    (box-sizingのborder-boxとpadding-boxのちょうど間みたいなのがない)

今回は使ってませんがtableレイアウト+css regionsとかを使うともうちょい戦えるのかも知れません。

## 文字は position : absolute で置く
これは先出の[CSSによる組版作業とその効率化](http://qiita.com/tohashi/items/b1b35660e1a8047bb2c1)と同じです。
table要素はそのまま活かしたいので部分的にabsoluteを解除したりして適宜調整していきます。

svgを書く時とこの作業をやる時で出てくる座標の数字がほぼ同じなので二度手間感は否めないです。

# 改良案
- svgを外付けにする
- むしろ逆に1ファイル化する
- テンプレートエンジン使う
- 文字部分をformにしちゃう
- A4版

# オチ
時間がなかったので送付状はKINGSOFT プレゼンテーションで作りました。（ギャフン）
UnityIAPのリストア処理(Android)

16/10/19
※iOSも一緒なん？と連絡受けましたが
iOSテストした事がないのでわかりません。すいません。

16/09/23
※AssetStoreから最新を入手出来るようになってるようです
https://www.assetstore.unity3d.com/jp/#!/content/68207

16/09/06
※UnityIAPv1.3.1での話ですので 最新だと変わっているかも知れません

# UnityIAP
課金システム、大変お手軽です。
http://docs.unity3d.com/ja/current/Manual/UnityIAP.html
ここに全ての情報が載っています。
プラットフォーム毎の登録方法まで載っています。

# リストア
課金アイテムは
・消費アイテム（ポイント購入等
・非消費アイテム（解除系
・定期購入（月額会員系。ゲームで見たこと無い？
の3種類あります（GooglePlayの場合）

誤ってアプリを消しても 非消費アイテム、定期購入アイテムは
GooglePlayに買った事が残ってますので、再インストール時に復活（リストア)しましょう
（購入途中で失敗したアイテムもリストアされる？

リストア処理については下記に書いてあります
http://docs.unity3d.com/ja/current/Manual/UnityIAPRestoringTransactions.html
> Google Play と Universal Windows アプリでは、
> 初回の初期化時、所有しているアイテムごとに
> IStoreListener の ProcessPurchase メソッドが呼び出されます。

購入時の処理に飛んでくるのね。
何も実装要らんがな！

…と思いきや 飛んでこない…。

はて？

# hasReceipt
初期化成功後
OnInitialized(IStoreController ctlr, IExtensionProvider ext)
が呼ばれますが、その後 待てど暮らせど
ProcessPurchase(PurchaseEventArgs args)
は呼ばれる事がありません。

ですが、初期化成功後 返ってきた IStoreControllerに
リストア必要なアイテムは hasReceipt で判断出来るようになっています。

```sample.cs
public void OnInitialized(IStoreController ctrl, IExtensionProvider ext)
{
    foreach(var product in ctrl.products.all) {
        if(product.hasReceipt) { // リストア可能なレシートあるよ! 
        // product.definition.id - アイテムID
        // product.receipt - レシート関連(JSON) 
        // サーバー検証して アイテム復元しなはれ
        }
    }
}
```

# これで
無事 非消費アイテム・定期購入アイテムのリストアが出来ると思います。

同僚から「hasReceipt って何かしら」と言われなかったら気がつかなかったorz
…私のググるヂカラ or ドキュメント読解力 弱いですね…

※iOS の SKPaymentTransaction transactionReceipt 無くなるのかしら…
Babelの使い方② - Babel + Gulp


[前回](http://qiita.com/takap235711/items/343fb4a898413116be64)に引き続き、ES6のビルド環境構築です。
今回はBabelとタスクランナーのGulpを組み合わせた場合のビルド環境を作ります。

## Babel + GulpのES6ビルド環境の構築
[Babel built-systems -> Gulp](https://babeljs.io/docs/setup/#installation)

前提として、node.jsとbabelとgulpがグローバルインストールされている状態を想定
> gulpコマンドが見つからない的なメッセージが出た場合は、gulpをグローバルインストールして下さい
`$ sudo npm install -g gulp`

- 適当なディレクトリを用意  

 ```terminal
$ mkdir babel_test/cap2
$ cd babel_test/cap2
```

- package.jsonを作成
`$ npm init`で対話的に下記のようなファイルを作成しました↓

 ```package.json
{
  "name": "babel-test-gulp",
  "version": "1.0.0",
  "description": "hoge",
  "repository": "piyo",
  "main": "index.js",
  "scripts": {
  		"test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}
```
> ミスって、descriptionとかrepositoryが空になっちゃっても`sudo vi package.json`で編集出来ます。
（自分の環境だとread-onlyなpackage.jsonが生成されました）

- Babelのコマンドラインツールをインストール

  ```terminal 
 $ npm install --save-dev babel-cli
 ```

- es2015のトランスパイル用プラグインをインストール

  ```terminal
$ npm install --save-dev babel-preset-es2015
```

- .babelrcを作成
 
 ```terminal
 $ touch .babelrc
 $ echo '{ "presets": ["es2015"] }' > .babelrc
```

- gulp関係のプラグインをインストール

  ```terminal
$ npm install --save-dev gulp
$ npm install --save-dev gulp-babel
$ npm install --save-dev gulp-rename
```

- gulpfile.jsを作成（gulpのタスクを作成）

 ```gulpfile.js
 var gulp  = require("gulp");
 var babel = require("gulp-babel");
 var rename = require("gulp-rename");

 gulp.task("babel_build", function () {
     return gulp.src("src/*es6.js")
         .pipe(babel())
         // ".es6"という文字列を削る
         // path.basename -> sample.es6
         .pipe(rename(function (path) {
             var cutLength = path.basename.length - 4;
             path.basename = path.basename.slice(0, cutLength);
         }))
         .pipe(gulp.dest("dist"));
 });

 gulp.task('babel_watch', function() {
     gulp.watch('src/*es6.js', ['babel_build'])
 });
 
 // defaltタスクを作成しても良い（gulpだけで実行出来る）
 // gulp.task('default', ['babel_build', 'babel_watch']);
```
> gulp-renameはコンパイル後のファイル名から`.es6`を削るために利用しているため、GulpでBabelを動かすために、必須ではありません。

- コンパイル元のファイルを作成
デフォルトパラメータとアローファンクションを利用。

 ```src/sample.es6.js
 setTimeout((hoge = "ほげ") => {
 		console.log(hoge);
 }, 500);
 ```

- ウォッチ・コンパイルする

 ```terminal
 $ pwd # -> ~/babel_test/cap2
 $ gulp babel_watch
```

 ![スクリーンショット 2016-05-18 19.59.09.png](https://qiita-image-store.s3.amazonaws.com/0/36492/8ba60cfa-64d2-2f94-9ac2-8c9d25fa29f6.png "スクリーンショット 2016-05-18 19.59.09.png")
(背景がスケスケなのはお気になさらず)

### 備考
#### gulpfile.jsをES6で記述するためには下記の対策が必要
- gulpfile.js -> gulpfile.babel.jsに名称変更
- presetsの設定をgulpfile.babel.jsに記述せず、.babelrc or package.jsonに記述する
(import構文などでコケます)

### 参考記事
[Babel built-systems -> Gulp](https://babeljs.io/docs/setup/#installation)
[gulpでよく使うパッケージのメモ](http://qiita.com/hbsnow/items/8eb7009b3ed716bc48a4)
[ES6 で書く環境を作る（gulp + Babel 編）](http://qiita.com/hkusu/items/9b312274b3ff2913e15b)(ほぼ、そのままですみません..)
組込みクラスの変更

継承は強力な概念ですが、もし仮に継承を使用せずにpalindrome?メソッドをStringクラス自身に追加する (つまりStringクラスを拡張する) という、より自然な方法を使用することが可能だとしたら、わざわざWordクラスを作らなくてもpalindrome?をリテラル文字列に対して直接実行できるようになるはずです。そんなことが可能なのでしょうか (なお、現在のコードはそのようになっていないため、以下のようにエラーになります)。

>> "level".palindrome?
NoMethodError: undefined method `palindrome?' for "level":String
驚いたことに、Rubyでは組み込みの基本クラスの拡張が可能なのです。Ruby のクラスはオープンで変更可能であり、クラス設計者でない開発者でもこれらのクラスにメソッドを自由に追加することが許されています。

>> class String
>>   # 文字列が回文であればtrueを返す
>>   def palindrome?
>>     self == self.reverse
>>   end
>> end
=> nil
>> "deified".palindrome?
=> true
(Rubyで組み込みクラスにメソッドを追加できるということは実にクールですが、"deified"(=神格化された) という単語が回文になっていることも、それに劣らずクールではないでしょうか。)

組み込みクラスの変更はきわめて強力なテクニックですが、大いなる力には大いなる責任が伴います (訳注: 「スパイダーマン」の名台詞)。従って、真に正当な理由がない限り、組み込みクラスにメソッドを追加することは無作法であると考えられています。Railsの場合、組み込みクラスの変更を正当化できる理由がいくつもあります。たとえば、Web アプリケーションでは、変数が絶対に空白にならないようにしたくなることがよくあります (ユーザー名などはスペースやその他の空白文字になって欲しくないものです) ので、Railsはblank?メソッドをRuby に追加しています。Railsの拡張は自動的にRailsコンソールにも取り込まれるので、以下のようにコンソールで拡張の結果を確認できます (注意: 以下のコードは純粋な irb では動作しません)。

>> "".blank?
=> true
>> "      ".empty?
=> false
>> "      ".blank?
=> true
>> nil.blank?
=> true
スペースが集まってできた文字列は空 (empty) とは認識されませんが、空白 (blank) であると認識されていることがわかります。ここで、nilは空白と認識されることに注意してください。nilは文字列ではないので、Railsが実はblank?メソッドをStringクラスではなく、そのさらに上の基底クラスに追加していることが推測できます。その基底クラスとは、(この章の最初で説明した) Object自身です。RailsによってRubyの組み込みクラスに追加が行われている例については、8.4で説明します。
Win10環境下におけるHDD→SSD移行のトラブルメモ

HDD→SSDへの移行時にハマってしまい6時間程格闘したのでメモ。

環境：
Win10 pro 　(Win7 pro より アップグレード, 2016/5/16までの更新を反映済)
マザーボード ASUS P8Z68-V GEN3
HDD 　  Seagate 型番不明 1T　(システム用・移行元)
　　　　Hitachi HDS721010CLA332 1T(データ用 + 音楽ファイル退避)
移行先SSD   　 CT250MX200SSD1 250G

Seagate HDDからWin10を起動する際、起動時間が1分程かかってしまい、
イライラしていたためにSSDへの移行を行った。(2016/5、Crucialの250GB SSDが 8500円にて購入できた)

SSDを新たにSATAポートに接続して、
easeus todo backup 7.0を用いて
http://tvcap.fc2web.com/easeus-todo-backup/ver70/easeus-todo-backup70.html
を参考にディスクコピーを行う。

そして再起動！…
再起動後はDelを押してBIOS画面に行き、bootの順番をSSDが先頭になるようにして、いざ！

Operating system not found...

ダメな所が3点あった。

①再起動した後に元のSeagateのHDDを"物理的に外していなかった"
--物理的に外さないと、起動時にBIOSのbootの順番設定、Enable,Disable関係なしにboot情報が混ざり、最悪両方起動しない可能性があるようです。
(参考元：http://youwish.web.fc2.com/Todo.htm)

②HDDを最小構成にしていなかった。
--PC構成変更時の基本である、最小構成化をしていなかった。HitachiのHDDは不要なはず。結局そのままやってしまったが…。

③マザーボード内のデータ利用が推奨されているSATAポートにSSDを接続していた
--イージーミス。ASUS Z68シリーズは異なるメーカーのSATAポートを増設していますが、説明書にはっきりデータ利用推奨(つまりシステムとしての利用は△)と書いていた。別のSATAポートに差し替え。

その後、移行のトラブル例を探し、boot時点でトラブルが発生しやすいことが判明した。
しかし、修復ディスク(もしくはOSインストールディスク）からコマンドプロンプトに入り、スタートアップ修復及び 
'diskpart, select disk (ディスクコピーしたであろうディスクの番号)'
'select volume (ディスクコピーしたであろうボリュームの番号)'
'active,exit'
(diskpartを終了し、元のコマンドプロンプトに戻る)
'bootrec /fixmbr, bootrec /fixboot 'を実行
上記コマンドをすべて実行した後、コマンドプロンプトを終了し再起動

してもダメだった。

海外のサイトも含めて調べたところ、
下記のサイトがヒット。
http://pressf1.pcworld.co.nz/showthread.php?140161-Windows-10-will-not-boot

読み進めていくと、
bootrecを実行する際に、
>bootrec /scanos　←これは不要？
>bootrec /rebuildbcd 
も加えて、bootrec /fixmbrの前に実行する必要があるらしい。


これを行ったところ、ログイン画面まで無事に起動できた。

現在：ブートが完全に修復できておらず、BIOSの起動優先順を何故かHitachi HDDを先頭にしないとエラーが出る。謎だ…最小構成にしていなかったからか。とりあえず起動できたからよいか。

#下記のサイトも参考になりそう
http://ituki-iii.blogspot.jp/2012/01/ssd.html
PHP の ZeroMQ で受信や送信のタイムアウト

`ZMQPoll` でいわゆる `select` みたいなことができる。

例えば、送信の場合は次のようにする。

```php
$pool = new ZMQPoll();

// ソケットを追加
$pool->add($socket, ZMQ::POLL_OUT);

// 結果を受け取る配列
$readable = [];
$writable = [];

// タイムアウト時間を 5000 ミリ秒に指定
$res = $pool->poll($readable, $writable, 5000);

// 戻り値は受信/送信が可能なソケットの総数
if ($res == 0) {
    throw new \RuntimeException("ZeroMQ: send timeout");
}

// 送信
$socket->send($data, ZMQ::MODE_DONTWAIT);
```

受信の場合は次のようになる。

```php
$pool = new ZMQPoll();

// ソケットを追加
$pool->add($socket, ZMQ::POLL_IN);

// 結果を受け取る配列
$readable = [];
$writable = [];

// タイムアウト時間を 5000 ミリ秒に指定
$res = $pool->poll($readable, $writable, 5000);

// 戻り値は受信/送信が可能なソケットの総数
if ($res == 0) {
    throw new \RuntimeException("ZeroMQ: recv timeout");
}

// 受信
$data = $socket->recv(ZMQ::MODE_DONTWAIT);
```

`$readable` や `$writable` には `socket_select` のように `ZMQSocket` が入っているので、複数のソケットで `pool` したときには、どのソケットが受信/送信が可能かを判断するために使用することができる。
不幸にもSerialPortクラスのDataReceivedイベントで例外を発生させてしまった人にMSDNが提示した回避の方法がレガシーすぎる件

これは増えすぎた地球の人口よりも多くのデバイスで走るCOMポートをC#などで操作しようとしたとき、割としばしば起こる"有効ではないスレッド間の操作"例外の回避方法についての補足である。

一般にはレガシーデバイスとみなされるCOMポートであるが、このデバイスは産業用途では今でも十分現役である。さまざまな機器がRS-232CやRS-485によるリモートコントロールをサポートしているので今でもSerialPortクラスの恩恵にあずかっているプログラマーは少なくない。

ところでSystem.IO.Ports.SerialPortクラスが発生させるDataReceivedイベントは次のような説明になっている。

> DataReceived からデータを受信すると、セカンダリ スレッドでイベントが発生する、 [SerialPort](https://msdn.microsoft.com/ja-jp/library/system.io.ports.serialport(v=vs.110).aspx) オブジェクトです。このイベントは、セカンダリ スレッドで発生されるため、メイン スレッドではなく、UI 要素など、メイン スレッドの一部の要素を変更しようとしています。 スレッド処理、例外を発生させる可能性があります。メイン ページでの要素を変更する必要がある場合は、 [Form](https://msdn.microsoft.com/ja-jp/library/system.windows.forms.form(v=vs.110).aspx) または [Control](https://msdn.microsoft.com/ja-jp/library/system.windows.forms.control(v=vs.110).aspx), 、投稿の変更要求を使用して [Invoke](https://msdn.microsoft.com/ja-jp/library/zyzhdc6b(v=vs.110).aspx), 、これは適切なスレッドで処理を行います。

> [SerialPort.DataReceived イベント (MSDNより)](https://msdn.microsoft.com/ja-jp/library/system.io.ports.serialport.datareceived(v=vs.110).aspx?sentenceGuid=adab18c30cba8f89f83b677eee830074#mt722)


お分かりいただけただろうか。[Control.Invokeメソッド](https://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.invoke(v=vs.110).aspx)が回避方法として提案されているが、この方法はWindows.Formsに依存しているのでWPFなどを使用している場合には採用しにくいのである。

この問題をより抜本的に解決するには[System.Threading.SynchronizationContextクラス](https://msdn.microsoft.com/ja-jp/library/system.threading.synchronizationcontext(v=vs.100).aspx)などが使用できる。クラス名で検索すれば詳しい仕組みや使い方はいくらでも出てくる[†](https://ufcpp.wordpress.com/2012/04/26/非同期処理とディスパッチャー/)[‡](http://www.atmarkit.co.jp/fdotnet/chushin/introsl_04/introsl_04_02.html)のでここでは割愛するが、要はSynchronizationContextオブジェクトを事前にメインスレッドで生成しておいて、これにイベントハンドラの中身のうちメインスレッドに依存するオブジェクトに対する処理を委譲すればいい。
CSVメモ①

CSVの使い方がよく理解できないのでコードだけでもまとめようと決意したのでまとまったまとめたものをまとめてみたいと思います


assetsの場所を取得
        AssetManager assets = getResources().getAssets();
        AssetManager as = getResources().getAssets();


開くファイルの指定
            InputStream is = as.open("testCSV.csv");


文字化け除けの文字コードの指定
            InputStreamReader ireader=new InputStreamReader(is, "UTF-8");


.csv内で区切る場所の指定（この場合だと　,　と　"　）
            CSVReader reader = new CSVReader(ireader,',','"',0);


String型に読み込んだデータの代入
            csv = reader.readNext();


描画
            textView.setText(csv[num]);

         
例外処理
        try {
                     //ここでエラーが起きてもcatchに飛ばされるからセーフ
            } 
        catch (IOException e) 
            {
//
            }


エラーだと理解
　　　　　　 e.printStackTrace();





楽しい



＜＜＜＜＜＜＜＜追記＞＞＞＞＞＞＞＞

.csvファイル内は　,  と改行で区別させて読み込ませられる


csv = reader.readNext();　のreader.readNext();の部分は「.csvファイルに記述された行一列全てを配列化して読み込む」であるから二次元配列として使う時は

csv[i]=reader.readNext();

こんな感じに書くといい

「　String skill[][] = new String[4][3];　」で初期化忘れずに



CSVReader reader = new CSVReader(ireader,',','"',0);　の最後の 0 は何行目から.csvを読み込み始めるかの処理（1とかにすると0行目飛ばして読み込む）





気持ちいい
オブジェクト指向と2x年くらい戦って思ったこと

#この文章
一連の
[オブジェクト指向と10年戦ってわかったこと](http://qiita.com/tutinoco/items/6952b01e5fc38914ec4e)
付近の感想文。流行らしいので、少しだけのってみる。

#オブジェクト指向って
やっぱし単純に「オブジェクト指向」と言われても、分析なのか設計なのか言語の話なのか解釈の幅が広すぎると思うわけです。
ただ、もはや一般的には単に「オブジェクト指向」と呼んだ場合には「オブジェクト指向プログラミング」であるようには思いますけど。

で、確かにプログラミングは戦う相手が多いというか、固有の言語仕様とか実行効率よい実装とかはてはライブラリの使い方にまで飛び火していろいろアレでアレなので苦労する人も多かろうし、それを踏まえると例の三原則に否定的な人もぼちぼちいるんだろうとは思います。
自分は気持ちとしてはプログラミングは軸足においてないというのもあるので、オブジェクト指向言語とそのプログラミングについては郷に従え。って感じです。やればやるだけ奥が深いし、解釈も様々だし。言語やライブラリにはわざわざ「オブジェクトじゃなくす」ことで様々な方面の効率を求めているものもいっぱいあるし。そんなことにイチイチ噛みついてても進まないし。

この手の話で幅が広すぎると思うのは、学習目的でいろいろいじってみてる人～システム開発を仕事としてやらされてる人というあたり。
学術的にはその方がいいということがわかりきってても、周囲のリソースや時間の問題で選択できないってことは多いので、仕事でオブジェクト指向言語を使いますという場合に、例の三原則を知ってないとコーディングできないのか。というそうでもない。逆に変な設計者とか、変なフレームワークと呼ばれる何かとか、変な契約があるとどうやったってオブジェクト指向にできないこともあるしね。

実際問題、プログラムを仕事でやらされてる人は最初から設計やるわけじゃないだろうし、勉強するのは例の三原則とかじゃなくて、その言語の特性だったり、そのプロジェクトで使うライブラリの扱い方だったり、そういう実用的な方を先に覚えた方がいいような気がしてます。規模感とかにもよるので一概には言えませんが。

設計もするなら知ってた方がよいのは言わずもがな。元ネタはさっと理解する(復習)には確かに良エントリかも。
ただ、継承がインターフェースだっていうのは少なくてもJavaはそう理解してもいいと思うけど、言語仕様によっては何とも言えない気がするなぁ。

#おまけ：オブジェクト指向プログラミングに迷う人が陥る個所
- オブジェクト指向言語のライブラリを使えることがオブジェクト指向プログラムを理解したことだと思う。
- 抽象化と共通化の区別が曖昧。
- いきなりJavaで勉強を始め、まったくもってオブジェクト指向っぽくない「static void main()」という関数を書き始めてあさっての方に進む。
変数を二つ使ったブロック

>> flash = { success: "It worked!", danger: "It failed." }
=> {:success=>"It worked!", :danger=>"It failed."}
>> flash.each do |key, value|
?>   puts "Key #{key.inspect} has value #{value.inspect}"
>> end
Key :success has value "It worked!"
Key :danger has value "It failed."

この場合、keyとvalueのペアごとに処理が実行される
SQL Performance AnalyzerによるSQLパフォーマンス比較実行例(API)

[Oracle Learning Library](http://apex.oracle.com/pls/apex/f?p=44785:1)にあるチュートリアルの一つである
[Assessing Impact of Change on Workload Using SQL Performance Analyzer](https://apexapps.oracle.com/pls/apex/f?p=44785:24:0::NO:24:P24_CONTENT_ID,P24_PREV_PAGE:4428,29)
の操作を、Enterprise Managerの代わりにAPIで実行した場合の例です
SQL*Plusから実行することを前提に書いています

```sql
conn system/Password@orcl

--create an STS
variable sts_name varchar2(20)
EXEC :sts_name := 'HR_WORKLOAD_API';

BEGIN
        dbms_sqltune.create_sqlset(
                sqlset_name => :sts_name,
                sqlset_owner =>'APPS'
        );
END;
/

--load sql to STS
DECLARE
 sqlset_cur dbms_sqltune.sqlset_cursor;
BEGIN
 OPEN sqlset_cur FOR
  SELECT VALUE(P)
   FROM TABLE(
    DBMS_SQLTUNE.SELECT_CURSOR_CACHE(
     attribute_list => 'typical', --required in 11.1 and lower
     basic_filter => 'UPPER(PARSING_SCHEMA_NAME) = ''APPS'' AND UPPER(SQL_TEXT) LIKE ''SELECT /% MY_QUERY%'''
    )
   ) P;
 DBMS_SQLTUNE.LOAD_SQLSET(
  sqlset_name=> :sts_name,
  populate_cursor=> sqlset_cur,
  load_option => 'MERGE',
  update_option => 'ACCUMULATE',
  sqlset_owner=>'APPS');
END;
/

--check if the sql are loaded as expected
set pagesize 100
col name for a20
col owner for a15
SELECT name, owner, statement_count FROM DBA_SQLSET;


--Create analysis task
variable spa_task  VARCHAR2(64)
EXEC :spa_task := 'SQLPA_TEST_API';
variable stmt_task VARCHAR2(64)

BEGIN
 :stmt_task := DBMS_SQLPA.CREATE_ANALYSIS_TASK(
   task_name => :spa_task,
   sqlset_name => :sts_name,
   sqlset_owner => 'APPS'
 );
END;
/

--First trial
BEGIN
 DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(
  task_name => :spa_task,
  execution_type => 'test execute',
  execution_name => 'first trial'
 );
END;
/

--Make changes here

--Second trial
BEGIN
 DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(
  task_name => :spa_task,
  execution_type => 'test execute',
  execution_name => 'second trial'
 );
END;
/

--Compare the two trials
BEGIN
 DBMS_SQLPA.SET_ANALYSIS_TASK_PARAMETER(
  task_name => :spa_task,
  parameter => 'comparison_metric',
  value => 'buffer_gets'
 );
END;
/

BEGIN
 DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(
  task_name => :spa_task,
  execution_type => 'compare performance',
  execution_name => 'compared result1',
  execution_params => dbms_advisor.arglist(
   'execution_name1',
   'first trial',
   'execution_name2',
   'second trial',
   'workload_impact_threshold',
   0,
  'sql_impact_threshold',
   0)
 );
END;
/

--Print report
set pagesize 0
set linesize 150
set long 1000000
set trimspool on
var rep clob
col rep for a150

BEGIN
 :rep := DBMS_SQLPA.REPORT_ANALYSIS_TASK(
  task_name => :spa_task,
  type => 'TEXT',
  level => 'TYPICAL',
  section => 'SUMMARY',
  execution_name => 'compared result1'
 );
END;
/

spool /home/oracle/work/report/spa_basic.txt
print :rep
spool off
```
ハッシュの中のハッシュから値を取り出す

>> params = {}        # 'params' というハッシュを定義する ('parameters' の略)。
=> {}
>> params[:user] = { name: "Michael Hartl", email: "mhartl@example.com" }
=> {:name=>"Michael Hartl", :email=>"mhartl@example.com"}
>> params
=> {:user=>{:name=>"Michael Hartl", :email=>"mhartl@example.com"}}
>>  params[:user][:email]
=> "mhartl@example.com"
AWS:EC2にtorをインストールしたメモ

１．torインストール
https://www.torproject.org/download/download.html
からSource CodeをDL
サーバにgzをscpして

```bash:
$ tar xzvf tor-0.2.7.6.tar.gz
で解凍
$ cd tor*
$ ./configure
を実行したら"libeventがない"云々でエラーが出たので
$ sudo yum install libevent libevent-devel
後念のためこれも
$ sudo yum install zlib openssl openssl-devel
再度
$ ./configure
$ make
$ sudo make install
$ sudo cp /usr/local/etc/tor/torrc.sample /usr/local/etc/tor/torrc
$ cd /usr/local/etc/tor
```

２．torrcを編集

```bash:
$ sudo vi torrc
```

```bash:torrc
SOCKSPort 9050 # Default: Bind to localhost:9050 for local connections.
SOCKSPort (接続元IP):9100 

SOCKSPolicy accept 127.0.0.1/32
SOCKSPolicy accept (接続元IP)/32
SOCKSPolicy reject *
```
SOCKSPortはポート設定9050はlocalhost=127.0.0.1のときの設定で、ローカルで使う分にはこれで十分
他のサーバから接続可能にするときは9100を使う設定
SOCKSPolicyは上から適用。


３．tor起動

```bash:
$ /usr/local/bin/tor
こんな風に出てくればＯＫ。初回だけ結構時間かかる
[notice] Bootstrapped 90%: Establishing a Tor circuit
[notice] Tor has successfully opened a circuit. Looks like client functionality is working.
[notice] Bootstrapped 100%: Done
```

４．接続
別の画面からこれを実行して
curl --socks5 localhost:9050 http://www.ugtop.com/spill.shtml

「現在接続している場所（IPv4）」
のグローバルIP
が書き換わっていること確認

* * * 
polipoなどhttp proxyを入れなくてもいけた。
user-agentとかがブラウザっぽく設定できるかはあとで試す。

===PEAR::HTTP/Request2 が入っている前提でのphpサンプル===

```php:http.php
<?php

require_once 'HTTP/Request2.php';
require_once 'HTTP/Request2/Adapter/Socket.php';

$socks = new HTTP_Request2_Adapter_Socket();

$request = new HTTP_Request2('http://taruo.net/e/');
$request->setConfig('proxy_host','localhost');
$request->setConfig('proxy_port','9050');
$request->setConfig('proxy_type','socks5');
$request->setHeader('Accept-Language','ja');
$request->setHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');

$response = $socks->sendRequest($request);
echo $response->getBody();
```
～～～～～～～～～～
torを通さないときはproxy_*が入った３行をコメントアウト。
PCのブラウザから試すときは
(Httpじゃなく）SOCK Proxyを設定
Tor is not an HTTP ProxyとでるのはHTTPでアクセスしようとしたとき

EC2のセキュリティグループのインバウンドで9050を通す。



■参照サイト
http://d.hatena.ne.jp/knaka20blue/searchdiary?word=%2A%5BTor%5D
http://ohwhsmm7.blog28.fc2.com/blog-entry-450.html
ハッシュのキーには文字列とシンボル型どちらも使用できる

例：以下２文は同義
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
user = { "first_name" => "Michael", "last_name" => "Hartl" }
>> user["first_name"] = "Michael"     # キーが "first_name" で値が "Michael"
=> "Michael"
>> user["last_name"] = "Hartl"        # キーが "last_name" で値が "Hartl"
=> "Hartl"
>> user["first_name"]                 # 要素へのアクセスは配列の場合と似ている
=> "Michael"
>> user                               # ハッシュのリテラル表記
=> {"last_name"=>"Hartl", "first_name"=>"Michael"}

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
user = { :name => "Michael Hartl", :email => "michael@example.com" }
>> user[:name]              # :name に対応する値を取得する
=> "Michael Hartl"
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
Ruby1.9以降は以下のように記述もできる
>> h1 = { :name => "Michael Hartl", :email => "michael@example.com" }
=> {:name=>"Michael Hartl", :email=>"michael@example.com"}
>> h2 = { name: "Michael Hartl", email: "michael@example.com" }
NodeOSを試す続編（動かなかったnpkgが動いたのとtouchができた！）

[前回投稿](http://qiita.com/h-tko/items/079f437f2fd2fc3becd5)
の続きです。

あまり大した情報があるわけではないですが、起きたこととできたことを書いてみます。
正直、正しいかどうかとかほぼわからない手探り状態です、、、

# npkgとかnpmができない

初期状態だとnpkgとかnpmすると必ず失敗します。

どうやら見に行ってるregistryが

```
http://linux-x86.node-os.com/
```

らしく、ここに直接アクセスするとBasic認証かかってるので、そりゃ無理だよなってなります(´・ω・｀)

# 一旦試しにregistry変更してみた

ということで、見に行くregistryを変更してみました。

```bash
$ npm set registry http://registry.npmjs.org/
```

これで見に行くregistryは変更できました。

# touchをインストール

誰か知りませんが、touchをnodeで書いてくれてる人がいるので、インストールします。

```bash
$ npkg install touch
```

これでtouchが/root/binの下にインストールされたようです。

# touchしてみる

実際にtouchしてみます。

```bash
$ touch test.txt
test.txt { dev: 2057,
  mode: 33188,
  nlink: 1,
  uid: 0,
  gid: 0,
  rdev: 0,
  blksize: 4096,
  ino: 120181,
  size: 0,
  blocks: 8,
  atime: Wed May 18 2016 10:24:46 GMT+0000 (UTC),
  mtime: Wed May 18 2016 10:24:46 GMT+0000 (UTC),
  ctime: Wed May 18 2016 10:24:46 GMT+0000 (UTC) }
```

実行された！

```bash
$ ls
[ '.node-gyp',
  '.npm',
  '.npmrc',
  'bin',
  'etc',
  'lib',
  'node_modules',
  'test.txt',
  'tmp' ]
```

lsするとちゃんとファイル増えてるので成功したっぽいです！

# 消してみる

標準でrmコマンドがあるようなので、ついでに試してみます。

```bash
$ rm test.txt
```

特に何も標準出力されませんでしたが、一応成功したみたいです

```bash
$ ls
[ '.node-gyp',
  '.npm',
  '.npmrc',
  'bin',
  'etc',
  'lib',
  'node_modules',
  'tmp' ]
```

# その他できなかったこと

やってみて失敗したことをまとめます。

### rmでディレクトリ削除

するとエラーします

```bash
$ rm -r test/
fs.js:760
  return binding.unlink(pathModule._makeLong(path));
                 ^
Error: ENOENT, no such file or directory '-r'
    at Object.fs.unlinkSync (fs.js:760:18)
    at Object.<anonymous> (/root/lib/node_modules/bin-fs/bin/rm:7:4)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:902:3
```

### nodeコマンドを-eでconsole.logして標準出力をファイル出力的な

できませんでした、、、

```bash
$ node -e "console.log('aaa');" > test.txt
$ cat test.txt
```

ファイル出力されず、、、


---

相変わらず謎多すぎですが、まだちょっと遊んでみようと思ってます。
せめてviが使えるようになりたい、、、！
ブロック

配列と範囲はいずれも、ブロックを伴うさまざまなメソッドに対して応答することができます。ブロックは、Rubyの極めて強力な機能であり、かつわかりにくい機能でもあります。

>> (1..5).each { |i| puts 2 * i }
2
4
6
8
10
=> 1..5
上のコードでは、範囲オブジェクトである(1..5)に対してeachメソッドを呼び出します。メソッドに渡されている{ |i| puts 2 * i }が、ブロックです。|i|では変数名が縦棒「|」に囲まれていますが、これはブロック変数に対して使用するRubyの構文で、ブロックを操作するときに使用する変数を指定します。この場合、範囲オブジェクトのeachメソッドは、iという1つのローカル変数を使用してブロックを操作できます。そして、範囲に含まれるそれぞれの値をこの変数に次々に代入してブロックを実行します。

ブロックであることを示すには波かっこ { } で囲みますが、以下のようにdoとendで囲んで示すこともできます。

>> (1..5).each do |i|
?>   puts 2 * i
>> end
2
4
6
8
10
=> 1..5
ブロックには複数の行を記述できます (実際ほとんどのブロックは複数行です)。RailsチュートリアルではRuby共通の慣習に従って、短い1行のブロックには波かっこを使用し、長い1行や複数行のブロックにはdo..end記法を使用しています。

>> (1..5).each do |number|
?>   puts 2 * number
>>   puts '--'
>> end
2
--
4
--
6
--
8
--
10
--
=> 1..5
今度はiの代わりにnumberを使用していることにご注目ください。この変数 (ブロック変数) の名前は固定されていません。

ブロックは見た目よりもずっと奥が深く、ブロックを十分に理解するためには相当なプログラミング経験が必要です。そのためには、ブロックを含むコードをたくさん読みこなすことでブロックの本質を会得する以外に方法はありません8。幸い、人間には個別の事例を一般化する能力というものがあります。ささやかですが、mapメソッドなどを使用したブロックの使用例を参考のためにいくつかご紹介します。

>> 3.times { puts "Betelgeuse!" }   # 3.timesではブロックに変数を使用していない
"Betelgeuse!"
"Betelgeuse!"
"Betelgeuse!"
=> 3
>> (1..5).map { |i| i**2 }          # 「**」記法は冪乗 (べき乗) 
=> [1, 4, 9, 16, 25]
>> %w[a b c]                        # %w で文字列の配列を作成
=> ["a", "b", "c"]
>> %w[a b c].map { |char| char.upcase }
=> ["A", "B", "C"]
>> %w[A B C].map { |char| char.downcase }
=> ["a", "b", "c"]
上に示したように、mapメソッドは、与えられたブロックを配列や範囲オブジェクトの各要素に対して適用し、その結果を返します。また、後半の2つの例では、mapのブロック内で宣言した引数 (char) に対してメソッドを呼び出しています。こういったケースでは省略記法が一般的で、以下のように書くこともできます。

>> %w[A B C].map { |char| char.downcase }
=> ["a", "b", "c"]
>> %w[A B C].map(&:downcase)
=> ["a", "b", "c"]
(メソッド名にシンボルが使われているので奇妙に見えるかもしれません。これについては4.3.3で説明します)。ひとつ面白い話があります。これは実は元々Ruby on Rails独自の記法でした。しかし多くの人がこの記法を好むようになったので、今ではRubyのコア機能として導入されています。

最後のブロックの例として、単体テストにも目を向けてみましょう (リスト4.4)。

test "should get home" do
  get :home
  assert_response :success
  assert_select "title", "Ruby on Rails Tutorial Sample App"
end
ここでは動作をすみずみまで理解する必要はありません (実際、筆者もこのコードをひと目で完璧に把握できるなどとは言いません)。ここで重要なのは、テストコードにdoというキーワードがあることに気付き、そこからテストの本体が「そもそもブロックでできている」ことに気付くことです。すなわち、このtestメソッドは文字列 (説明文) とブロックを引数にとり、テストが実行されるときにブロック内の文が実行される、ということが理解できます。

ところで、1.5.4でランダムなサブドメインを生成するために以下のRubyコードを紹介しましたが、このコードを理解するための準備が整ったので、今こそ読み解いてみましょう。

('a'..'z').to_a.shuffle[0..7].join
順を追ってこのコードを組み立ててみると、動作がよくわかります。

>> ('a'..'z').to_a                     # 英小文字を列挙した配列を作る
=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o",
"p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
>> ('a'..'z').to_a.shuffle             # シャッフルする
=> ["c", "g", "l", "k", "h", "z", "s", "i", "n", "d", "y", "u", "t", "j", "q",
"b", "r", "o", "f", "e", "w", "v", "m", "a", "x", "p"]
>> ('a'..'z').to_a.shuffle[0..7]       # 配列の冒頭7つの要素を取り出す
=> ["f", "w", "i", "a", "h", "p", "c", "x"]
>> ('a'..'z').to_a.shuffle[0..7].join  # 取り出した要素を結合してひとつの文字列にする
=> "mznpybuj"
remote: trueを付与したフォームをフォーム外のボタンからSubmitしてajax通信したい時

## 想定
remote: trueを設定したフォームを
外部のボタンからSubmitしてJavaScript形式でレスポンスが欲しい時
（partialなどを使ってその箇所だけを更新したい時など）

※partialについては割愛


## html形式で返ってきてしまう例
```haml:index.html.haml
= form_tag 'hogehoge_url', id: 'hogehogeform', method: :post, remote: true, authenticity_token: true do
  ...省略...


%button{type: "button", onclick: "document.hogehogeform.submit()"} Submit
```
TemplateがないとMissingTemplate Errorが起きました．

## JS形式で返ってくる例
```haml:index.html.haml
:javascript
  function SubmitForm() {
    $("#hogehogeform").trigger("submit.rails");
  }

= form_tag 'hogehoge_url', id: 'hogehogeform', method: :post, remote: true, authenticity_token: true do
  ...省略...


%button{type: "button", onclick: "SubmitForm();"} Submit
```

`$("フォームID").trigger("submit.rails");`を利用するのがポイント．

## 参考文献
[Rails 3: How to trigger a form submission via javascript?
](http://stackoverflow.com/questions/4904101/rails-3-how-to-trigger-a-form-submission-via-javascript#_=_)
Kaggleにチャレンジ　タイタニック

#この記事
データ分析の勉強のためにkaggleにチャレンジしたメモ。
チュートリアルである「titanic」を試したが，pandasとかscikitとか，わからないことが多すぎる。下のコードでいけると思ったけど，スコアが良くない。

#問題
（誤解を恐れずにざっくり説明すると）タイタニックの乗組員で生き残った人はどんな人たちかを考える問題。
与えられるのはtrainデータとtestデータで,どちらのデータにも性別や年齢などのデータが入っている。ただし，trainデータには生存データ（0/1）があるがtestデータにはない。***つまり，trainデータから生存モデルを作ってtestデータの生存を予測する問題。***（正誤は予測データをwebサイトで提出して確認できる。）

#コード

```py
# 下ごしらえ
def df_cleaner(df):
    # 足りない部分は補おう
    # 年齢
    median_age = np.median(df[(df['Age'].notnull())]['Age'])
    for passenger in df[(df['Age'].isnull())].index: #.index = 配列内のnullの場所
    	df.loc[passenger, 'Age'] = median_age
    # fare
    median_fare = np.median(df[(df['Fare'].notnull())]['Fare'])
    for passenger in df[(df['Fare'].isnull())].index:
        df.loc[passenger, 'Fare'] = median_fare

    # 文字列データを数値データへ
    df.loc[(df['Sex'] == 'male'),'Sex'] = 0
    df.loc[(df['Sex'] == 'female'),'Sex'] = 1
    df.loc[(df['Sex'].isnull()),'Sex'] = 2
    df.loc[(df['Embarked'] == 'S'),'Embarked'] = 0
    df.loc[(df['Embarked'] == 'C'),'Embarked'] = 1
    df.loc[(df['Embarked'] == 'Q'),'Embarked'] = 2
    df.loc[(df['Embarked'].isnull()),'Embarked'] = 3

    return df

# 提出用csvを作りましょ
def make_csv(file_path, passengerId, predicts):
    f = open(file_path, "wb")
    writer = csv.writer(f)
    writer.writerow(["PassengerId", "Survived"])
    for row, survived in zip(passengerId, predicts):
        writer.writerow([row, survived])

# 作ったモデルの性能をしれべましょ
def getScore(answer, predicts):
    sum_p = 0.0
    total = 0.0
    for (row, predict) in zip(answer,predicts):
        if row == predict:
            sum_p += 1.0
        total += 1.0
    return sum_p/total

def main():
    # Read in the training data.
    train = pd.read_csv('./data/train.csv')
    test = pd.read_csv("./data/test.csv")
    # いらないデータ(予想)は消しましょう
    train.drop(['Name', 'PassengerId', 'Ticket', 'Cabin'], axis=1, inplace=True)
    test.drop(['Name', 'Ticket', 'Cabin'], axis=1, inplace=True)

    # 下ごしらえをする
    train = df_cleaner(train)
    test = df_cleaner(test)
    x_train = train[:][['Pclass', 'Sex','Age', 'SibSp', 'Parch', 'Fare', 'Embarked']]
    y_train = train[:][['Survived']]
    # ランダムフォレストでモデルを作ろう
    scores =[]
    for trees in range(1,100):
        model = RandomForestClassifier(n_estimators=trees)
        model.fit(x_train, np.ravel(y_train))
        # 一致率を見よう
        pre = model.predict(x_train)
        scores.append(getScore(y_train['Survived'],pre))
    plt.plot(scores,'-r')
    plt.show()
    
    # 本番のテストデータをお化粧直し
    x_test = test[:][['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']]
    label = test[:][['PassengerId']]
    # modelを使って予測しよう
    output = model.predict(x_test)
    # 提出用csvを作ろう
    make_csv("./output/random_forest.csv", label['PassengerId'], output.astype(int))

if __name__ == '__main__':
    main()
```

#github
[ソースコード](https://github.com/Tsunehiko511/kaggle/tree/master/titanic)

# スコア
上のコード：0.75120
チュートリアルのコピペ：0.76555

##感想
オリジナルの方が悪い。。。
アルゴリズムとしては間違っていないと思うので，scikitのrandom forestの部分をもう少し調べてみる必要がありそう。

#別件
アルゴリズムを視覚化して理解するサイトを作りました。タイタニックの問題はありませんがサンフランシスコの問題は関係あるので載せておきます。
[Library of Algorithms：視覚的にアルゴリズムを理解するサイト](https://library-of-algorithm.herokuapp.com)
配列から要素を取り出すときにindexに-1を指定すると、最後の要素を取り出せる

インデックスに-1という値を指定できるのは極めて便利です。-1を使用すると、配列の長さを知らなくても配列の最後の要素を指定することができ、これにより配列を特定の開始位置の要素から最後の要素までを一度に選択することができます。

>> a = (0..9).to_a
=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>> a[2..(a.length-1)]               # 明示的に配列の長さを使って選択
=> [2, 3, 4, 5, 6, 7, 8, 9]
>> a[2..-1]                         # 添字に-1を使って選択
=> [2, 3, 4, 5, 6, 7, 8, 9]
クラスのinitializeの中でインスタンス変数の代入処理が1億行あってうんざりするとき


データストア的なクラスを作った時にinializeの中でいくつも単純な代入処理を書くのが嫌だったので以下のようにしました。
他に良い書き方あったら教えろください。

```ruby:data_store.rb
class DataStore
  attr_accessor :hoge
  attr_accessor :fuga
  def initialize *params
    params = params.first
    unless params.empty?
      params.each do |k, v|
        if self.respond_to?(v) && self.respond_to?("#{v}=")
          self.instance_variable_set("@#{k}".to_sym, v)
        end
      end
    end
  end
end

sam = DataStore.new hoge: "hoge", fuga: "fuga", nothing_val: "val"
p sam # <DataStore:0x007ff4f8b903a8 @hoge="hoge", @fuga="fuga">
```
CentOSにPython環境を設定


Spyderを使えるようになるまでセットアップ
<ol><li>Gnome
    - http://www.server-world.info/query?os=CentOS_6&p=x
</li><li>VNC
   - https://www.ipentec.com/document/document.aspx?page=linux-centos-60-vncserver-tigervncserver-install
   - `~/vnc/xstartup` の末尾を次のように編集

   ```
   #twm &
   exec gnome-session
   ```

   - 起動

   ```
   vncserver -geometry 1920x1080
   ```

   - ディスプレイ番号を覚えておいて、接続時には `0.0.0.0:2` などと指定する。
   - Windows用のRealVNCクライアントで、フルスクリーンから抜けるには `F8` 。

</li><li>Git
    - ソースから最新版をビルド＆インストール
    - http://www.task-notes.com/entry/20150622/1434942000
</li><li>pyenv
   - pyenvをインストール
 
   ```
   sudo ln -s /usr/local/bin/git /usr/bin`
   sudo git clone https://github.com/yyuu/pyenv.git /usr/local/pyenv
   ```

   - 全ユーザが使えるように環境設定。`/etc/bashrc` と `/etc/zsh/zshrc` に以下を追記。
    
   ```
   export PYENV_ROOT=/usr/local/pyenv
   export PATH="$PYENV_ROOT/bin:$PATH"
   eval "$(pyenv init -)"
   sudopy () {
     sudo bash -c "export PYENV_ROOT=/usr/local/pyenv; export PATH=\$PYENV_ROOT/shims:\$PYENV_ROOT/bin:\$PATH; $*"
   }
   ```

   - 適当なバージョンをインストール

   ```
   sudopy pyenv install anaconda2-4.0.0
   ```

</li></ol>