OmniAICreator/Qiita-1.07M huggingface dataset:
Goで写真のExifを読み取る方法(位置情報)

#目的
　uploadされた写真のExif内から位置情報を取り出して表示する
#環境
Go version 1.3.1

#準備
ほぼこちらです。
https://godoc.org/github.com/rwcarlsen/goexif/exif
事前準備として以下を実行しておきましょう
>go get github.com/rwcarlsen/goexif/exif

これで準備完了です。
#概要
　ファイルをOpenして、サンプルの通り実行しています。非常に簡単です。
#ソースコードと詳細説明
```sample.go
package main

import (
	"github.com/rwcarlsen/goexif/exif"
	"os"
)

// main
func main() {

	frame := "sample.jpg"
	file, err := os.Open(frame)
	if err != nil {
		panic(err)
	}

	x, err := exif.Decode(file)
	if err != nil {
		panic(err)
	}

	lat, lng, _ := x.LatLong()
	println(lat, lng)
}
```

このような、ライブラリーを手早く使えるのがGoの好きなところです。
postgresql on RDSでスロークエリを出力する

実行に時間がかかっているクエリを見つけてそれを改善する事で、システムのパフォーマンス向上が見込まれます。

postgresqlでは実行に時間のかかっているクエリ=スロークエリを出力する設定を行うことができます。

自分でpostgresqlサーバーを構築する場合は、
postgresql.confのlog_min_duration_statementで設定を行いますが、
RDSでは、DB Parameter Groupsから設定を行います。
スロークエリを表示したいサーバのDB Parameter Groupsを選択して設定を行います。

![RDS_pgsql_slowquery.png](https://qiita-image-store.s3.amazonaws.com/0/52904/623379f1-cf54-4991-ea06-2cdf0f17daf1.png)

log_min_duration_statementの項目にクエリを表示させる閾値を設定します。
単位はミリ秒となります。
設定後、Save Changesをクリックするとインスタンスの再起動なく設定が反映されます。

これでクエリの実行時間が設定した値を越えた場合にログに書き出されるようになります。
書き出されたログは、対象のRDSインスタンスのLogsから閲覧/ダウンロードできます。

これでクソクエリをあぶり出しましょう！
DockerでASP.NET vNextのサンプルを動かそう

以下は2015/1/6に動作確認しました。

- ホストOSは Ubuntu 14.04 LTSです。
- Docker (lxc-docker) のバージョンは 1.4 です。https://docs.docker.com/installation/ubuntulinux/
- base docker imageは microsoft/aspnet:1.0.0-beta1 です。https://github.com/aspnet/aspnet-docker/blob/master/1.0.0-beta1/Dockerfile 

（1/17追記)

- Docker imageの latestが[1.0.0-beta2](https://github.com/aspnet/aspnet-docker/blob/master/1.0.0-beta2/Dockerfile)になりました。
- aspnet/Homeのmasterブランチが更新され、タグ `v1.0.0-beta2` が打たれました。

（1/17追記おわり)


ますは https://github.com/aspnet/Home をとってくる。

```shell-session
git clone git://github.com/aspnet/Home.git
```

次に、Dockerfileを作成。

```Dockerfile
FROM microsoft/aspnet
 
ADD ./Home/samples /app/
WORKDIR /app/HelloWeb
RUN kpm restore
EXPOSE 5004
ENTRYPOINT ["k", "kestrel"]

# docker 1.0.1 では、どっかの CMD ["/bin/bash"] が影響してしまうっぽいので、最終行のコメントを外す。docker 1.4では不要。
# CMD []
```

そして、ビルドしてイメージ作成。リポジトリ名やタグはお好みで。

```shell-session
docker build -t yourname/aspnet .
```

起動するときはこう。上でつけたリポジトリ名やタグを指定。コンテナ名を指定するときは `--name コンテナ名` ですね。

```shell-session
docker run -d -t -p 5004:5004 yourname/aspnet
```

確認するときは ブラウザなどで http://localhost:5004 にアクセス。

```shell-session
curl http://localhost:5004
```
[Android] 「初回のみxxする」「xx回だけyyする」「xxからyy日経過した場合にzzする」的な処理を簡単に書く方法


この記事は[こちらで紹介されているiOS版`SRGEventDateRecorder`](http://qiita.com/nori0620/items/d45bb4ba3a3656c6524e)のAndroid版となります。

アプリを作っていると、特定のイベントの回数や実行時間に依存した処理を書くことが必要な場面が多々あります。
例えば以下の様な処理です。

- ある機能を利用する際、初回時のみガイダンスを表示
- ある機能を利用する際、最初の3回のみ使い方の説明を表示
- 広告POPUPを1時間に１回のみ表示
- 起動後にキャンペーンのお知らせを1日に1回だけ表示させたい

これらはイベントの回数や時刻を永続化するだけで簡単に書ける処理ではありますが、毎回同様の処理を書くのは手間でもあります。

そこで、このような用途のためにイベントの回数と時刻を永続化しておくだけのライブラリを書きました。

## EventDateRecorder

https://github.com/shoma2da/EventDateRecorder

## 導入してみる
build.gradleに以下の行を追加してGradle syncします。

```groovy:build.gradle
repositories {
    maven { url 'https://raw.githubusercontent.com/shoma2da/EventDateRecorder/master/lib/repository/' }
}
dependencies {
    compile 'com.hatenablog.shoma2da:eventdaterecorderlib:0.1.0'
}
```

導入後は利用するクラスファイルで`EventDateRecorder`をimportすれば利用できます。

## 使い方

１イベントごとに１つの`EventDateRecorder`インスタンスを作ります。
インスタンス生成時にそのイベントに対してユニークなKeyを割り当てます
例えば、ある機能を使うというイベントの`key`が`use_my_awesome_feature`だった場合、以下のようになります。

### イベントの記録

```java
EventDateRecorder recorder = EventDateRecorder.load(context, "use_my_awesome_feature");
recorder.record(); // 記録
```

### 記録したデータの利用

```java
EventDateRecorder recorder = EventDateRecorder.load(context, "use_my_awesome_feature");

// boolean:イベント１度でも実行(記録）されたかどうか？
recorder.didRecorded();

// int: イベントが記録された回数
recorder.recordedCount();

// java.util.Date:イベントが記録された日付
recorder.initialRecordedDate(); //初回の記録時間
recorder.previousRecordedDate(); //前回の記録時間

// boolean: イベントが記録されてから1日経過してるかどうか？
recorder.didElapsedSinceInitialRecordedDate(60*60*24); //初回の記録日時をベースに判定
recorder.didElapsedSincePreviousRecordedDate(60*60*24); //前回の記録日時をベースに判定
```

### データのクリア
```java
EventDateRecorder recorder = EventDateRecorder.load(context, "use_my_awesome_feature");
recorder.clear();
````


### 具体例

ある機能の利用をイベントとして扱う時、利用時にイベントを記録しておく

```java
EventDateRecorder recorder = EventDateRecorder.load(context, "use_my_awesome_feature");
recorder.record();
````

機能を使う時、初回だけ特別な動作をさせたいケース

```java
EventDateRecorder recorder = EventDateRecorder.load(context, "use_my_awesome_feature");
if( recorder.didRecorded() == false ){
    // 機能が１度も利用されてない時のみ実行したい処理を書く
}
```


機能を使う時、3回目までだけ特別な動作をさせたいケース

```java
EventDateRecorder recorder = EventDateRecorder.load(context, "use_my_awesome_feature");
if( recorder.recordedCount() <= 3){
    // 3回目までだけ実行させたい処理
}
```

機能を使う時、前回利用から1日以上経過してる場合にだけ特別な動作をさせたいケース

```java
EventDateRecorder recorder = EventDateRecorder.load(context, "use_my_awesome_feature");
if( recorder.didElapsedSinceInitialRecordedDate(60*60*24) ){
    // 初回利用から1日以上経過してるときにだけ実行したい処理
}
if( recorder.didElapsedSincePreviousRecordedDate(60*60*24) ){
    // 前回利用から1日以上経過してるときにだけ実行したい処理
}
```

以上、`EventDateRecorder`の紹介でした。
利用することで楽ができそうな画面があれば、使ってみてください。
Amazon RDSのマスターパスワードを忘れた場合の対処法

AWS RDSのマスターパスワードを忘れてしまって困った時の対処方法です。

aws-cliを使えば、マスターパスワードが変更できます。  
aws-cli1.2.5以降で試しました。（おそらくそれ以前でも大丈夫なはず。）

```
aws rds modify-db-instance --db-instance-identifier [dbname] --master-user-password　[新password]
```

成功すれば、RDSのステータスが帰ってきます。  

```
{
“DBInstance”: {
“PubliclyAccessible”: true,
:
:
“PendingModifiedValues”: {
“MasterUserPassword”: “****”
},
:
:
“DBInstanceIdentifier”: “dbname”
}
}

```



これで、新パスワードで接続できるようになります。
Windows7(64bit)+Python3.4でparamikoを動かしてみた

PythonでSFTPクライアントもどき作らないといけないのでそういうライブラリが無いか探してみたところ、[paramiko](https://github.com/paramiko/paramiko)とやらが使いやすくていいらしい。

Python3.4にも対応しているとのことで早速インストール。

```
> pip install paramiko
...省略...
Successfully installed paramiko ecdsa pycrypto
Cleaning up...
> 
```

が、無事にインストールが完了したのでとりあえず使ってみようとしたら、import時にエラーが発生。

```pycon
>>> import paramiko
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\venv\lib\site-packages\paramiko\__init__.py", line 30, in <module>
    from paramiko.transport import SecurityOptions, Transport
  File "C:\venv\lib\site-packages\paramiko\transport.py", line 49, in <module>
    from paramiko.dsskey import DSSKey
  File "C:\venv\lib\site-packages\paramiko\dsskey.py", line 26, in <module>
    from Crypto.PublicKey import DSA
  File "C:\venv\lib\site-packages\Crypto\PublicKey\DSA.py", line 89, in <module>
    from Crypto import Random
  File "C:\venv\lib\site-packages\Crypto\Random\__init__.py", line 28, in <module>
    from Crypto.Random import OSRNG
  File "C:\venv\lib\site-packages\Crypto\Random\OSRNG\__init__.py", line 34, in <module>
    from Crypto.Random.OSRNG.nt import new
  File "C:\venv\lib\site-packages\Crypto\Random\OSRNG\nt.py", line 28, in <module>
    import winrandom
ImportError: No module named 'winrandom'
>>> 
```

依存ライブラリちゃんと全部入ったはずなのにおかしいな？と思いつつ、winrandomをインストールしようとしたら、何やらエラーでインストールできない。

```
> pip install winrandom
...省略...
error: Cygwin gcc cannot be used with --compiler=mingw32
> 
```

どうもCygwinのGCCでコンパイルしようとしてコケてる模様。
64bit Windowsだとダメっぽい。

どこかにコンパイル済みのpycryptoはないものかと探してみたら、[ここ](http://www.voidspace.org.uk/python/modules.shtml#pycrypto)に置いてあった。
が、Python3.3までしかバイナリが配布されておらず、手元の環境（Windows7 64bit + Python3.4）にインストールしても動かない。

どうにかならないものかと散々探した末、[Python3.4対応のバイナリ](https://github.com/axper/python3-pycrypto-windows-installer)を発見。
easy_installからインストールしてみたところ、無事にimportしてconnectしてsftpでファイルのput/getができた。
アンボックス化タプルの挙動を確認（微妙）

[Haskellの実験メモ](http://qiita.com/7shi/items/b6cbb7df2dd969c84f49)です。

普通のタプルとアンボックス化タプルの違いを、簡単なパターンマッチで検出できるかどうか試しました。1要素のタプルはないので1要素のデータ型で代用しました。結論から言うと**この方法では違いを検出できません**。代用がこれで良いのか微妙ですが。

# ネタ元

`data`と`newtype`の違いというのはよく話題になって、`undefined`に対するパターンマッチで検出するのが定石です。

以下に正格性注釈も交えた比較が載っています。

* [Newtype - HaskellWiki](https://www.haskell.org/haskellwiki/Newtype) 2014.11.22

これを元に`undefined`でアンボックス化タプル特有の挙動が見られるかどうかを確認しました。

# テストコード

ghciで確認すると再現が面倒なので、HUnitでテストしました。

`u`は`undefined`が返って来ることを示しています。

```hs
{-# LANGUAGE UnboxedTuples #-}

import Test.HUnit
import System.IO
import Control.Exception

undef :: Int -> ErrorCall -> IO Int
undef x _ = return x

t :: String -> Int -> Int -> Test
t s x t = s ~: (~? s) $ do
    v <- catch (evaluate t) $ undef u
    return $ x == v

u = 0

data Foo1 = Foo1 Int
data Foo2 = Foo2 !Int
newtype Foo3 = Foo3 Int
data Foo4 = Foo4 (# Int #)

tests = TestList
    [ t "a1" 1 $ case Foo1 undefined of Foo1 _ -> 1
    , t "a2" u $ case Foo2 undefined of Foo2 _ -> 1
    , t "a3" 1 $ case Foo3 undefined of Foo3 _ -> 1
    , t "a4" u $ case Foo4 undefined of Foo4 _ -> 1
    , t "a5" u $ case Foo4 undefined of Foo4 (# _ #) -> 1

    , t "b1" u $ case undefined of Foo1 _ -> 1
    , t "b2" u $ case undefined of Foo2 _ -> 1
    , t "b3" 1 $ case undefined of Foo3 _ -> 1
    , t "b4" u $ case undefined of Foo4 _ -> 1
    , t "b5" u $ case undefined of Foo4 (# _ #) -> 1
    , t "b6" u $ case undefined of      (# _ #) -> 1
    , t "b7" 1 $ case undefined of         _    -> 1

    , t "c1" 1 $ case    undefined    of    _    -> 1
    , t "c2" 1 $ case (  undefined  ) of (  _  ) -> 1
    , t "c3" 1 $ case (# undefined #) of (# _ #) -> 1
    , t "c4" 1 $ case (  undefined, undefined  ) of (  _, _  ) -> 1
    , t "c5" 1 $ case (# undefined, undefined #) of (# _, _ #) -> 1

    , t "d1" 1 $ case undefined of    _    -> 1
    , t "d2" 1 $ case undefined of (  _  ) -> 1
    , t "d3" u $ case undefined of (# _ #) -> 1
    , t "d4" u $ case undefined of (  _, _  ) -> 1
    , t "d5" u $ case undefined of (# _, _ #) -> 1
    ]

main = do
    runTestText (putTextToHandle stderr False) tests
```
```text:実行結果
Cases: 22  Tried: 22  Errors: 0  Failures: 0
```

* a2, a4, b2, b4: データ型で包んだ場合、正格性注釈を加えたものとアンボックス化タプルの挙動は同じです。
* b5, b6: データ型で包んだものと単独のアンボックス化タプルでは、挙動に違いは見られません。
* c1, c2, d1, d2: `_`と`(_)`は同じものです。単独の値を1要素のタプルだと見なすのはおかしいので、以下では1要素のデータ型`Foo1`で代用します。
* a1, c3, b1, d3: 1要素のデータ型と1要素のアンボックス化タプルの挙動に違いは見られません。
* c4, c5, d4, d5: 2要素の通常のタプルとアンボックス化タプルの挙動に違いは見られません。

# 参考

例外を`catch`するのに`evaluate`で正格評価しないとすり抜けることがあるのを知らずにハマりました。次の記事に明記されています。

* [@shelarcy](https://twitter.com/shelarcy): [本物のプログラマはHaskellを使う - 第25回　Haskell流の例外処理を学ぶ：ITpro](http://itpro.nikkeibp.co.jp/article/COLUMN/20081104/318426/) 2008.11.5

次の記事では、`data`と`newtype`の違いをタプルを交えて図解しています。

* [types - Difference between `data` and `newtype` in Haskell - Stack Overflow](http://stackoverflow.com/questions/5889696/difference-between-data-and-newtype-in-haskell) 2011.5.4
Wicketで<button>タグを使用する際にクロスブラウザではまったこと


IE9以前のブラウザでのみ発生して半日くらいドツボにはまったのでメモがてら。

Wicketを使ったHTMLで下記のようなコードを書いたら、なぜかそのボタンが複数表示されたうえにそれ以降のデータが正常に表示できなくなった。

\<button type="submit" wicket:id="download" class="excel_download" /\>

ところがこれを下記のように書き直したら、正常に動作するように。

\<button type="submit" wicket:id="download" class="excel_download"\>\</button\>

生成されたHTMLを見てみたところ、本来とは全然関係ない場所にも同じIDのコンポーネントが2重に生成されていて、それが動作を狂わせていたみたい。
ChromeやFFでは発生しなかったので、きっとブラウザ依存のWicketバグなんじゃないかと思っています。
引き継いだGruntで環境を整えたメモ。

引き継いだWebシステムでGruntを使っていたので動くようにしたメモ。
環境はMacOSX10.10です。


## app.min.jsが出力されていない。
開発環境ではapp.jsが出力されて動いた動いたと思っていたら本番環境だとapp.min.js呼んでましたー。

gruntコマンドのみだとdefaultのタスクを実行するみたいです。 

<pre>% grunt</pre>

Gruntfile.jsのタスクにbuildというのがあってそれでミニファイしている模様なのでgurunt buildしてみます。

```lang:Gruntfile.js
    grunt.registerTask('default', ['watch']);
    grunt.registerTask('build',
        ['clean:compiled', 'compass:app', 'compass:page', 'compass:admin',
            'concat:js-app', 'concat:js-page', 'concat:js-admin',
            'concat:css-app', 'concat:css-page', 'concat:css-admin',
            'build-vendor', 'uglify:dist', 'cssmin:dist']);
```

grunt buildしたらcompassが無いよと言われました。

<pre>
% grunt build
Running "clean:compiled" (clean) task
Cleaning public/dist/...OK

Running "compass:app" (compass) task
Warning: You need to have Ruby and Compass installed and in your system PATH for this task to work. More info: https://github.com/gruntjs/grunt-contrib-compass Use --force to continue.

Aborted due to warnings.
</pre>

gemでcompassインストール。

<pre>
% sudo gem install compass
</pre>

bowerのコンポーネントが無いよと言われました。

<pre>
% grunt build             
Running "clean:compiled" (clean) task

Running "compass:app" (compass) task
Errno::ENOENT on line ["33"] of /Library/Ruby/Gems/2.0.0/gems/compass-1.0.1/lib/compass/exec/global_options_parser.rb: No such file or directory - /Users/xxxx/Project/app/bower_components
Run with --trace to see the full backtrace
Warning: ↑ Use --force to continue.

Aborted due to warnings.
</pre>

bower自体は入っていたので元から存在したbower.jsonをもとにインストールしました。

<pre>
% bower -v
1.3.12
% bower install
</pre>

app.min.jsが出力されました。

<pre>
% grunt build 
 … …
Running "uglify:dist" (uglify) task
>> Destination public/dist/page.min.js not written because src files were empty.
>> 1 files created.
Done, without errors.
</pre>
一度に複数のファイルを特定のDirにコピー/移動(cp/mv)する ~ Unix Command ~

コピーコマンドは一般に、あるファイルを別のパスと名前を与えてコピーします。

```
$cp file1 file2
```

この使い方は、

```
cp [OPTION]... [-T] SOURCE DEST
```

ですが、コピーしたいファイルを引数に複数与えて、最後にコピーするDirectoryを与えることもできます。

```
cp [OPTION]... SOURCE... DIRECTORY
```

例えばこんな風にできます。

```
$cp a b c dir
```

![Screen Shot 2015-01-05 at 20.14.16.png](https://qiita-image-store.s3.amazonaws.com/0/1232/4b9a7e9c-ea62-94e0-24a5-e45cc54840e4.png)

もちろんmv も同様に、一度に移動することができます。

```
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
```

![Screen Shot 2015-01-05 at 20.19.25.png](https://qiita-image-store.s3.amazonaws.com/0/1232/08892f1e-2140-ccce-a274-dcebfb85073c.png)



#### 結論

これがなに便利なのか！？
結果何ができるか？ **ワイルドカードで指定したファイルを一度に移動できます！**

```
mv src/**/*.html dist/
```
tmuxのペインを最大化する

[tmux](http://tmux.sourceforge.net/)でウィンドウを分割して複数のペインを使っていると、表示面積が狭くて困ることがあります。

`prefix-key z` (デフォルトでは`C-b z`、私は`C-a z`にカスタマイズしています)でアクティブなペインを最大化することができます。

![](http://blog.sanctum.geek.nz/wp-content/uploads/2013/03/toggle-pane-zoom.gif)

参考：http://blog.sanctum.geek.nz/zooming-tmux-panes/
sbt環境で外部jarのimportでエラーが出るとき

詳しくはsbtドキュメントの[ライブラリ依存性](http://www.scala-sbt.org/0.13/tutorial/ja/Library-Dependencies.html)の*アンマネージ依存性*を参照

IntelliJで`File`->`Project Structure`->`Modules`->`Dependencies`にjarを追加するだけでは`sbt run`でbuildするときにjarの`import hoge.hoge`したライブラリが見つからないと言われる。

ライブラリのパスを教えてあげるためにプロジェクトの*build.sbt* に`unmanagedBase := baseDirectory.value / "libs"`の一行を加える。*baseDirectory.value*はプロジェクトのルートディレクトリ、*"libs"*はjarを配置するディレクトリ(デフォルトでは存在しない)。あとは、*libs*の中にjarを入れてあげればOK。
絵文字を入れたら文字数カウントが狂った時に見るページ

Unicode 絵文字、かわいいのでよく使いますよね。
Twitter みたいに文字数の制限があるようなサービスの場合、以下のようなコードで文字数をカウントしようとすると、絵文字などのサロゲートペアが現れた時にカウントが狂ってしまいます。

```java
String message = // ...
int count = message.length();
```

`String#length()` は、16bit にエンコードされた単位で文字数を数えるので、絵文字のようなサロゲートペアで表される文字は、2 文字としてカウントされます(その辺りの詳しい話題は、[この記事](http://alpha.mixi.co.jp/entry/2012/10809/)が詳しいです)。

で、その辺をうまいことやるイイカンジのメソッドが `String#codePointCount(int, int)` です。

```java
String message = // ...
int count = message.codePointCount(0, message.length());
```

引数は、カウントを始める文字列の index と、カウントを終える文字列の index になります。この index は 16bit にエンコードされた単位をベースにするので、文字列全体をカウントしたければ、上記のように、0 と length() を渡せば良いことになります。

メソッド名からは少し分かりづらくはありますが、これで簡単に絵文字などのサロゲートペアを含む文字列のカウントが出来るようになります。
【Mac】PDFからテキストを抽出したいけど、半角スペースが入るとき

##現象
間延びした文字間隔？のPDFをコピーしたら、半角スペースが入ることがあった。
いちいち修正するのが面倒なので、どうにかならないのか？

##解決：Automatorでアプリケーションを作る！
1. 書類の種類の選択をしてくださいで、「アプリケーション」を選ぶ
2. ライブラリ＞PDF＞PDFテキストを取り出すを選んで、「ワークフローを作成するには、ここにアクションまたはファイルをドラッグしてください。」にドラッグ
3. 出力や保存先を設定し、保存（Command+S）
4. 名前を付けて、フォーマットを「アプリケーション」にして保存すると完成！
5. 使い方は保存したアプリの上にPDFをドラッグすると、変換される

参考にしたサイトとちょっと違っていたのでメモ
参考サイト：[Macの標準機能で、PDF書籍をテキストファイルに変換する - Goodpic](http://www.goodpic.com/mt/archives2/2010/09/macpdf.html)
軟弱な僕がVimでタブをカーソルキーで切り替えるためにしている設定

Vim でも `h`, `j`, `k`, `l` なんて使わない軟弱な僕が、`Ctrl + ←`, `Ctrl + →` でタブを切り替えられるようにするための設定です。

```vim:.vimrc
" 特殊キー登録
" Ctrl + カーソルキー
set <C-Right>=^[[C
set <C-Left>=^[[D

" Ctrl + 左右キーでタブを切り替え
nnoremap <C-Right> :<C-u>tabn<CR>
nnoremap <C-Left> :<C-u>tabp<CR>
inoremap <C-Right> <ESC>:tabn<CR>
inoremap <C-Left> <ESC>:tabp<CR>
cnoremap <C-Right> <C-u>tabn
cnoremap <C-Left> <C-u>tabp
```

インサートモードでも、ノーマルモードでも、コマンドモードでも、さくっとタブが切り替わるようにしています。
tmux を通すと `Ctrl + カーソルキー` をうまく認識してくれなくて困ってる。
Xcodeで「Enumeration values <value> not handled in switch」の警告が出たときの対応


対応方法：
switch文にdefault句を追加する

```
switch (myenum)  {
    case 1:
        break;
    case 2:
        break;
    default:
        break;
}
```

今後、各種SDKの更新で列挙型（Enum）で指定できる定数が増えると、同じ警告メッセージが表示されるので注意が必要
AWS SDK for Ruby v1とAWS CLIとで複数プロファイルの切り替えを共用

以下のようにすると、AWS CLIと同じ、AWS_DEFAULT_PROFILEを見て複数のcredentialを切り替えて使うことができます。

## AWS SDK for Ruby v1とAWS CLIとで複数プロファイルの切り替えを共用

```ruby
require 'aws-sdk-v1'

ENV['AWS_PROFILE'] ||= ENV['AWS_DEFAULT_PROFILE']

AWS.config() # 他にグローバル設定があれば

# クレデンシャルの確認
puts YAML.dump AWS.config.credentials
```

AWS SDK for Ruby v1は、デフォルトでも~/.aws/credentialsも読んでcredentialを見つけようとしてくれてるのですが、
切り替えに使う環境変数が、なぜかAWS_PROFILEだけ見てて、AWS_DEFAULT_PROFILEの方は見てくれないので、そこを橋渡ししています。
https://github.com/aws/aws-sdk-ruby/blob/aws-sdk-v1/lib/aws/core/credential_providers.rb#L294

(AWS CLIでは、AWS_DEFAULT_PROFILEが使われます)
http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html

## リージョンも~/.aws/configとAWS_DEFAULT_PROFILEから取得

同様に、~/.aws/configのリージョンも見てくれてるといいのですが、全く見ておらず…
要望もあるのですが、v1では見送られたみたいです…
https://github.com/aws/aws-sdk-ruby/issues/477

ので、SharedCredentialFileProviderを参考に、書いてみました。

```ruby
def get_region options = {}
  region = options[:region] || ENV['AWS_REGION'] || ENV['AMAZON_REGION'] || ENV['AWS_DEFAULT_REGION']
  return region if region
  default_region = 'us-east-1'
  path = File.join(Dir.home, '.aws', 'config')
  return default_region unless File.exist?(path) && File.readable?(path)
  require 'aws/core/ini_parser'
  ini = AWS::Core::IniParser.parse(File.read(path))
  profile_name = options[:profile_name]
  profile_name ||= ENV['AWS_PROFILE'] || ENV['AWS_DEFAULT_PROFILE']
  profile_name = "profile " + profile_name if profile_name != "default"
  profile = ini[profile_name] || {}
  profile['region'] || default_region
end

```

優先順位はここと同じにしてあります。
https://github.com/aws/aws-sdk-ruby/blob/aws-sdk-v1/lib/aws/core/configuration.rb#L471

## 参考: AWS CLIでのプロファイルの作成と切り替え方法

http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html

```bash
aws configure --profile dev
aws configure --profile stg
aws configure --profile prod
```

~/.aws/credentials の例: (AWS CLI 1.5.0以上？と共有できます)

```ini:~/.aws/credentials
[dev]
aws_access_key_id = AKFORDEV
aws_secret_access_key = secretaccesskeyfordev

[stg]
aws_access_key_id = AKFORSTG
aws_secret_access_key = secretaccesskeyforstg

[prod]
aws_access_key_id = AKFORPROD
aws_secret_access_key = secretaccesskeyforprod
```

```ini:~/.aws/config
[profile dev]
output = json
region = us-west-2

[profile stg]
output = json
region = us-west-2

[profile prod]
output = json
region = us-west-2
```

~/.bashrcなどに書いておいて、必要に応じて切り替えます。

```bash:~/.bashrc
export AWS_DEFAULT_PROFILE=dev
```

## 参考

- http://blog.pg1x.com/entry/2014/09/24/231245
- http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html
- http://docs.aws.amazon.com/AWSSdkDocsRuby/latest//DeveloperGuide/prog-basics-creds.html
- https://github.com/aws/aws-sdk-ruby/blob/master/lib/aws/core/credential_providers.rb
IntelliJ IDEAでGulp tool windowを使用する

開発ブログによると実装されていると書いてあったのに、いままで使えてなかったので、覚書。

オンラインヘルプより

> If the Gulp tool window is not opened yet, do one of the following:
> 
> - Select the required Gulpfile.js file in the Project tool window and choose Show Gulp Tasks on the context menu of the selection.
> - Open the required Gulpfile.js file in the editor and choose Show Gulp Tasks on the context menu of the editor.

つまりは…

もし、gulp tool windowが表示されたなかったら次のいずれかやってみてね！

-  プロジェクトツールウィンドウでgulpfile.jsを選択してコンテキストメニューから「show gulp tasks 」
-  gulpfile.jsをひらいて、コンテキストメニューから「show gulp tasks 」

これで、GUIでタスクが走らせられると！

欠点は、プロジェクトツールウィンドウのスペースに割り込まれるのでデフォルトだと分割表示になってしまうトコロ。Gruntのパネルのほうが使い勝手いいかもしれません。
Macbook Pro Retina 15インチ(Early 2013)にUbuntu 12.04を入れる

- - -

# 概要

MacでUbuntuを動かすと

- NVidiaのグラボが使える
- Retina解像度のディスプレイ
- そこそこ持つバッテリ
- 1台でMacも開発できる
- Windowsとのトリプルブートもできる

というメリットがありそうです。

さっそくインストールしてみよう。

## インストール

### 環境

- MacBook Pro (Retina, 15-inch, Early 2013)
- 2.8 GHz Intel Core i7
- 16 GB 1600 MHz DDR3
- Intel HD Graphics 4000 1024 MB / NVidia 650M
- 751GB Flash Storage
- Mac OS X Yosemite 10.10.1 (14B25)

### ブートマネージャ

```bash
# on OSX
$ wget http://sourceforge.net/projects/refind/files/0.8.4/refind-bin-0.8.4.zip/download -O refind.zip
$ unzip refind.zip
$ cd refind-bin-0.8.4
$ ./install.sh
```

これでEFIパーティションにあるOSX以外のOSも起動できるようになります。

### Ubuntu Bootable USB Stickを作る

```bash
# on OSX
$ wget http://ftp.jaist.ac.jp/pub/Linux/ubuntu-releases/precise/ubuntu-12.04.5-desktop-amd64.iso -O /tmp/ubuntu.iso
$ hdiutil convert -format UDRW -o /tmp/ubuntu.img /tmp/ubuntu.iso
$ diskutil unmountDisk /dev/<diskN> # diskutil listでUSBフラッシュの番号を確認しておく
$ sudo dd if=/tmp/ubuntu.img of=/dev/r<diskN> bs=1m
```

これでUbuntuの入ったUSBブート可能なフラッシュメモリの完成です。


### Ubuntu OSパーティションの作成

- Disk Utilityを開いてUbuntuのパーティションを作る。
- フォーマットはfree spaceのままでOK
- SSDなのでswap用の領域は不要

### Ubuntuのインストール

1. さきほど作ったUSBステイックを刺したまま再起動

2. Install Ubuntuを選ぶ

3. 指示通りにダイアログを進める

4. 最後に再起動を促されるので、再起動する

5. 再起動後はrEFIndの画面でMacとUbuntuが見えるはず。

### Wifiを有効にする

1A. 別PCから必要なdebパッケージを持ってくる (dkms, libc6-dev, linux-libc-dev, bcmwl-kernel-source )
1B. USBの有線LANアダプタを付けてインターネットにつなぐ

でなんとかしてWifiのドライバインストールに必要なモジュールをインストールできるようにします。

```bash
# on Ubuntu
$ sudo dpkg -i <dependencies> # 手順1Aの人のみ
$ sudo apt-get update && sudo apt-get install bcmwl-kernel-source # 手順1Bの人のみ
```


### NVidiaのグラボを有効にする

1. ドライバのインストール

```bash
# on Ubuntu
$ sudo apt-get install linux-headers-`uname -r`
$ sudo apt-get install nvidia-current
$ sudo nvidia-xconfig 
```

2. 設定ファイルの編集

- xorg.conf

```bash
# on Ubuntu
$ sudo nano /etc/X11/xorg.conf
```

で設定ファイルを開き、

```/etc/X11/xorg.conf
# Deviceセクションの中に以下を追加
Option "UseDPLib" "off"
```

- grub

```bash
# on Ubuntu
$ sudo nano /etc/default/grub
```

で設定ファイルを開き

```bash:/etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT=“quiet splash“
```

となっているところを

```bash:/etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT=“quiet i915.lvds_channel_mode=2 i915.modeset=0 i915.lvds_use_ssc=0 splash“
```

にする。

さらに

```bash
# on Ubuntu
$ sudo update-grub
```

をする。

- rc.local

```bash
# on Ubuntu
$ sudo nano /etc/init.d/rc.local
```

```bash:/etc/init.d/rc.local
# 最後に追加
setpci -v -H1 -s 00:01.00 BRIDGE_CONTROL=0
```


### Optional F1-12キーをファンクションキーにする

標準だと輝度や音量変更などの特殊キーに割り当てられていて、ファンクションキーは`fn`キーと同時に入力しないといけない。
これは面倒なので特殊キーとファンクションキーを入れ替える。

```bash
# on Ubuntu
$ echo options hid_apple fnmode=2 | sudo tee -a /etc/modprobe.d/hid_apple.conf
$ sudo update-initramfs -u -k all
$ sudo reboot
```
[Nginx]AWSのELBでSSLを設定した場合のSSL判定


## ELBでSSLを設定するメリット
- ELBにSSLを設定できる
- インスタンスごとにSSLを設定する必要がない

### 注意点
ELBでSSLの設定をしてしまうと、nginx側には `https` も `http` も80番ポートで入ってきてしまう。

## 解決策
ELBにSSLを設定してポートフォワードした場合、環境変数に `X-Forwarded-Proto` がセットされるので下記のように使う。


```
server {
    listen 80;
    server_name example.jp;
    root /var/www/your_app/;


    if ($http_x_forwarded_proto = https) {
      rewrite ^ http://example.jp$request_uri? permanent;
    }


    proxy_connect_timeout 60;
    proxy_read_timeout    150;
    proxy_send_timeout    60;

    location / {
      
    }
  }
```
FileErrorをUser Friendlyに表示する

cordovaで開発していたら、FileAPIのFileErrorがエラーコード（数字）でしか取得できないことが分かったので、対応表を作ってみました。

https://developer.mozilla.org/ja/docs/Web/API/FileError

```js
function errorHandler(error){
  var errorDescriptionTable = {
    5: {
      "name": "ENCODING_ERR",
      "description": "The URL is malformed. Make sure that the URL is complete and valid."
    },
    9: {
      "name": "INVALID_MODIFICATION_ERR",
      "description": "The modification requested is not allowed. For example, the app might be trying to move a directory into its own child or moving a file into its parent directory without changing its name."
    },
    7: {
      "name": "INVALID_STATE_ERR",
      "description": "The operation cannot be performed on the current state of the interface object. For example, the state that was cached in an interface object has changed since it was last read from disk."
    },
    6: {
      "name": "NO_MODIFICATION_ALLOWED_ERR",
      "description": "The state of the underlying file system prevents any writing to a file or a directory."
    },
    1: {
      "name": "NOT_FOUND_ERR",
      "description": "A required file or directory could not be found at the time an operation was processed. For example, a file did not exist but was being opened."
    },
    4: {
      "name": "NOT_READABLE_ERR",
      "description": "The file or directory cannot be read, typically due to permission problems that occur after a reference to a file has been acquired (for example, the file or directory is concurrently locked by another application)."
    },
    12: {
      "name": "PATH_EXISTS_ERR",
      "description": "The file or directory with the same path already exists."
    },
    10: {
      "name": "QUOTA_EXCEEDED_ERR",
      "description": "Either there's not enough remaining storage space or the storage quota was reached and the user declined to give more space to the database. To ask for more storage, see Managing HTML5 Offline Storage."
    },
    2: {
      "name": "SECURITY_ERR",
      "description": "Access to the files were denied for one of the following reasons:\nThe files might be unsafe for access within a Web application.\nToo many calls are being made on file resources.\nOther unspecified security error code or situations."
    },
    11: {
      "name": "TYPE_MISMATCH_ERR",
      "description": "The app looked up an entry, but the entry found is of the wrong type. For example, the app is asking for a directory, when the entry is really a file."
    }
  }
  var errorDescription = errorDescriptionTable[error.code];
  console.log('[js] FileError', error.code, errorDescription && errorDescription.name, errorDescription && errorDescription.description);
}
```
Haskellでハノイの塔

# ハノイの塔と脳の弱いウンコード

よく考えたら今まで一度も「ハノイの塔」を書いたことがないことに気がついた。
AからCにn枚移すには、AからBに(n-1)枚移してAからCに1枚移してBからCに(n-1)枚移す、という再帰のお手本のような話だが、それをそのまま書いただけのウンコード。

手順のリストを塔の状態から塔の状態への関数のリストとして書いて最後に`scanl`で逐次適用して状態遷移をつくり上げるところが少し面白かったくらいかな。そういえば`(flip ($))`はどこかで見たような……F#のパイプライン演算子？

## 第一投
```hs:TowersOfHanoi.hs
module Main where
import Data.List (unwords)
import Control.Applicative ((<$>))
import System.Environment (getArgs)

type Tower = ([Int],[Int],[Int])
type Move = Tower -> Tower

-- :: Move
aTb (a:as,bs,cs) = (as, a:bs, cs)
aTc (a:as,bs,cs) = (as, bs, a:cs)
bTc (as,b:bs,cs) = (as, bs, b:cs)
bTa (as,b:bs,cs) = (b:as, bs, cs)
cTa (as,bs,c:cs) = (c:as, bs, cs)
cTb (as,bs,c:cs) = (as, c:bs, cs)

-- :: Int -> [Move]
moveAtoC 1  = [aTc]
moveAtoC n  = moveAtoB (n-1) ++ moveAtoC 1 ++ moveBtoC (n-1)
moveAtoB 1  = [aTb]
moveAtoB n  = moveAtoC (n-1) ++ moveAtoB 1 ++ moveCtoB (n-1)
moveBtoC 1  = [bTc]
moveBtoC n  = moveBtoA (n-1) ++ moveBtoC 1 ++ moveAtoC (n-1)
moveBtoA 1  = [bTa]
moveBtoA n  = moveBtoC (n-1) ++ moveBtoA 1 ++ moveCtoA (n-1)
moveCtoA 1  = [cTa]
moveCtoA n  = moveCtoB (n-1) ++ moveCtoA 1 ++ moveBtoA (n-1)
moveCtoB 1  = [cTb]
moveCtoB n  = moveCtoA (n-1) ++ moveCtoB 1 ++ moveAtoB (n-1)

run :: Tower -> [Move] -> [Tower]
run = scanl (flip ($))


main = solve<$>read<$>head<$>getArgs >>= mapM_ print
    where solve n = run ([1..n],[],[]) (moveAtoC n)
```
 
## 実行結果
```shell-session
> ./TowersOfHanoi 3
([1,2,3],[],[])
([2,3],[],[1])
([3],[2],[1])
([3],[1,2],[])
([],[1,2],[3])
([1],[2],[3])
([1],[],[2,3])
([],[],[1,2,3])
```
# 結果から逆算するクソコード
上のコードの実行結果を少し眺めてみる：

```shell-session
> ./TowersOfHanoi 1
([1],[],[])
([],[],[1])

> ./TowersOfHanoi 2
([1,2],[],[])
([2],[1],[])
([],[1],[2])
([],[],[1,2])
```

まあアレだ、上のヤツを捏ねくり回せば下のやつが作れそうに見えないですかね。まず、下の前半は上のヤツの最初の柱に`2`をくっつけたものに似ている。で、下の後半は上のヤツの最後の柱に`2`をくっつけたものに似ている。

```shell-session
([1,2],[],[])
([2],[],[1])
([1],[],[2])
([],[],[1,2])
```
こりゃそっくりですわ。違いは、前半は2番めの柱と3番めの柱が入れ替わっていること、後半は1番めと2番めの柱が入れ替わっていること、だけだ。というわけで、露骨にそう書くとどうなるか。

## 第二投

```hs:TowersOfHanoi2.hs
module Main where
import Control.Applicative ((<$>))
import System.Environment (getArgs)

solve 0 = [([],[],[])]
solve n = -- n-1枚をaからcに移す一連の遷移 solve (n-1) がわかっているとするとそれに対し
    map (\(a,b,c)->(a++[n],c,b)) (solve (n-1)) ++ -- 柱aにnをくっつけて柱bと柱cを交換
    map (\(a,b,c)->(b,a,c++[n])) (solve (n-1))    -- 柱cにnをくっつけて柱aと柱bを交換


main = solve<$>read<$>head<$>getArgs >>= mapM_ print
```

というわけで、これでまったく等価。最初の$n=1,2,3$辺りの遷移を手で書いてみれば思いつく話ではあり、はじめからこう書くべきであったような気もする。実にウンコである。


## おまけでワンライナー
```hs
main = fix (\r n -> if n>0 then [\(a,b,c) -> (n:a,c,b),\(a,b,c) -> (b,a,n:c)] <*> r (n-1) else [([],[],[])])<$>read<$>head<$>getArgs >>= mapM_ print
```


## 実行結果
```shell-session
> ./TowersOfHanoi2 3
([1,2,3],[],[])
([2,3],[],[1])
([3],[2],[1])
([3],[1,2],[])
([],[1,2],[3])
([1],[2],[3])
([1],[],[2,3])
([],[],[1,2,3])
```
kPALの使い方

最近Genome Biologyで出た、k-merベースで実験のQCを行うツール、
kPAL（Python）のチュートリアル（http://kpal.readthedocs.org/en/latest/tutorial.html
）にざっと目を通した。

## kPALのインストール
```bash
pip install kPAL
```

または

```bash
git clone https://github.com/LUMC/kPAL.git
cd kPAL
pip install -e .
```

## kPALの使い方
### ヘルプの表示
```bash
kpal -h
```

### テストデータをダウンロード
```bash
wget http://kpal.readthedocs.org/en/latest/_downloads/tutorial.zip
unzip tutorial.zip
cd tutorial
# a_1.fa, a_2.fa, b_1.fa, b_2.fa, c_1.fa, c_2.fa, d_1.fa, d_2.faの8つのfastaファイル（4ペア）がある事を確認
ls
```

### 8-merで解析、_1側のfastaファイルの結果を、reads_1.k8に保存
```bash
kpal count -k 8 *_1.fa reads_1.k8
```

### reads_1.k8はバイナリファイルで、kpal infoで中身が確認できる
```bash
kpal info reads_1.k8
```

### _2側も同様に
```bash
kpal count -k 8 *_2.fa reads_2.k8
```

### _1側と_2側の結果をマージして、merged.k8に保存
```bash
kpal merge reads_1.k8 reads_2.k8 merged.k8
```

### マージ結果は、以下のように確認できる（マージされると_で名前が連結されるらしい）
```bash
kpal info merged.k8 -p c_1_c_2
```

### k-merベースでのサンプル間の距離
```bash
kpal distance reads_1.k8 reads_2.k8 -l c_1 -r c_2
```

### 総当たりでの距離
```bash
kpal matrix merged.k8 -
```
WIP PullRequestフローの開発を楽にするスクリプト(コマンド)２つ

## はじめに
WIP PullRequestに便利な２つのスクリプトを作りました。WIP PRは進捗が常に見えるので開発体制としては理想的だと思いますが、手順が多くうっかりPullRequestを忘れてしまったりします。で、WIP PRはダメだという結論になってしまう。
プロジェクト管理や運用を浸透させるには、開発者がどれだけ楽に導入できるか？が肝だと思います。楽をしましょう。

## 前提
hubコマンドが使える状態であること
http://shoma2da.hatenablog.com/entry/2014/03/26/222802

## コマンドの使い方
### 空のプルリクエストを作成する

```
$ git wip.pr <branch名>
```

以下のコマンドで、ブランチの作成＋チェックアウト、remoteへのpush、PullRequestの作成までワンストップで実行されます。毎度やることは同じなのに手順だけが多い作業なので非常に便利です。branchの作成=PullRequestの作成になるので物忘れもなく効果的。

### 該当PullRequestのページを開く

```
$ git wip.link
```

現在のブランチに該当するGithub上のPullRequestページを開きます。Githubのトップページから探したり、連携しているSlackのログを辿るのは面倒です。PCが覚えられることはすべてPCに任せましょう。

## 設定方法
以下のスクリプトをgitレポジトリの適当な場所に置きます。開発者はこのスクリプトを実行するだけで上記２コマンドが使えるようになります。

``` sh:/resources/scripts/setup.sh
#!/bin/sh

echo "setup PullRequest..."

mkdir .git/Github
#create PullRequest script
cat << "EOF" > .git/Github/create_pullrequest
#!/bin/sh

current=`git rev-parse --abbrev-ref HEAD`
git checkout -b $1
git commit --allow-empty -m "create PullRequest"
git push origin $1
git branch -u origin/$1 $1
url=`hub pull-request -m "$1" -b $current`
num=`echo $url | awk -F / '{print $NF}'`
git tag $num
EOF

chmod +x .git/Github/create_pullrequest

#show Link script
cat << "EOF" > .git/Github/link
#!/bin/sh

base=`git show-branch --merge-base master HEAD`
commit="HEAD"

while :
do
  echo ">"
  nextcommit="${commit}^"
  next=`git rev-parse $nextcommit`
  if [ $base = $next ]; then
    echo "Found!"
    pr=`git tag --contains $commit`
    hub browse -- pull/$pr
    break
  fi
  commit=$nextcommit
done
EOF

chmod +x .git/Github/link

#setup gitconfig
cat << "EOF" >> .git/config
[alias "wip"]
  pr = "!f(){ .git/Github/create_pullrequest $1;};f"
  link = "!f(){ .git/Github/link;};f"
EOF
```

## 仕組み
`wip.pr`でPullRequestを作成するときに、PullRequestIDを最初のコミットのTagで割り当てています。tagならpushすれば全開発者で共有できるので便利です(今回はやっていませんが)。featureブランチにtagを付けることはほとんど無く、masterにしても`production-xxx`という風にtagのフォーマットも決まっていると思うので、特に運用上弊害は出ないかと。
rack_session_access を使って Feature spec でログイン状態を作る


最近やっと Feature spec を書き始めました。

Feature spec の中で、ログイン状態をエミュレートしたいのはよくある話かと思いますが、
`rack_session_access` という gem で上手く実現出来たので、その手順をメモしておきます。


以下 Rails の例になります。

```ruby:Gemfile
group :test do
  gem 'rspec-rails'
  gem 'capybara'
  gem 'rack_session_access'
  gem 'factory_girl_rails' # 例のために追加、必須ではないです
  ...
end
```

Test 環境で `RackSessionAccess::Middleware` を使うように指定します。

```ruby:config/environments/test.rb
[MyRailsApp]::Application.configure do |config|
  ...
  config.middleware.use RackSessionAccess::Middleware
  ...
end
```

ログイン用の Helper を作っておきます。

```ruby:spec/support/login_helper.rb
module LoginHelper
  def login_as(user)
    page.set_rack_session(user_id: user.id)
  end
end
```

上記の Helper を RSpec に `include` するように指定します。

```ruby:spec/rails_helper.rb
require 'rack_session_access/capybara'

Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f }

RSpec.configure do |config|
  ...
  config.include LoginHelper
  ...
end
```

使い方は以下のように `backgroud` ブロックの中で `login_as` を呼び出して、ログイン状態を作りだします。

```ruby:spec/features/xxx_spec.rb
feature 'パスワードの変更' do
  let!(:user) { create(:user) }

  background do
    login_as user

    visit edit_user_password_path
  end
  
  scenario 'XXX' do
    ...  
  end
end
```


以上でログイン状態をエミュレートすることが出来ました。
Nitrousの設定

## 前書き
最近、 nitrousの 有料プランを試してます。
設定関係のところをメモします。
ご参考ください。

nitrous VM のperformanceの期待があまりできないですね。
（自分のmac airと比べてますが、。。。）
IDEを使うならありです。


## ruby 関係
- デフォルトで、chrubyでrubyを管理しています。
- rbenvが推奨ではないが、インストールできます。
  - 前提は partsから `chrbenv` を **uninstall** ことです。

                            
## postgresql インストール

- `parts`コマンドを利用する：


```rb
# db install
parts install postgresql
```

```rb
# db start
parts start postgresql
```


 http://railsapps.github.io/rubyonrails-nitrous-io.html の「chruby」の節を 参照してください。


## rails server　起動関係

- ポートを'0.0.0.0'を指定しないと、`preview`がうまくいかない
- `-d (daemon) `　を指定すると、バックグランドで実行し、端末から切り離しても動く
- logをファイル指定して、出力する

```rb
bundle exec rails s -b '0.0.0.0' -d   > ~/server.log 2>&1
```

##  ~/.bashrc ファイルの中身をメモする

```rb
[ -z "$PS1" ] && return 

stty -ixon

function parse_git_dirty { 
git diff --no-ext-diff --quiet --exit-code &> /dev/null || echo "*"
}

function parse_git_branch {
git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/(\1$(parse_git_dirty))/"
}

export CLICOLOR=1 
export EDITOR='vim -f'

export PS1="\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$(parse_git_branch)\$ " 

alias ls='ls --color=auto' 
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto' 
alias egrep='egrep --color=auto' 
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8 
export LANGUAGE=en_US.UTF-8
export LC_CTYPE=UTF-8

# alias
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias vi='vim' 
alias ll='ls -l'
alias cls='clear' 
#alias -g G='| grep' 
#alias -g L='| less' 
#alias -g H='| head' 
#alias -g T='| tail' 
#alias -g S='| sort' 
#alias -g W='| wc'
#alias -g X='| xargs'

# alias custom 
alias la='ll -a'
# alias git 
alias g='git'
alias glg='git log --oneline --graph --decorate'
alias gs='git status'
alias gc='git commit'

# alias bundle 
alias be='bundle exec'
alias bi='bundle install'
alias ber='be rspec spec/' 
#alias cd
alias cd1='cd ../'
alias cd2='cd ../../'
alias cd3='cd ../../../'
alias cd4='cd ../../../../'

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"                                                                                                                                   
```
スタンドアローンによるフラッシュプレイヤー15での警告

スタンドアローンでフラッシュを配布する予定なのですが、

フラッシュプレーヤー15からnavigateToURLを使いますとリンク移動の際に

「このコンテンツを信頼このコンテンツを信頼して〜」

というような警告がでるようになってますが、これは回避しようないのでしょうか？

回避の方法があれば教えてくださいませ。

どうぞよろしくお願い致します。
Apex上でSelect *を実装してみた

## 概要
SOQL上では"Select *"がないので、実装してみました。使う時に注意事項をご確認ください。

多分すでに実装した方はいらっしゃると思いますので、ネタがかぶったら申し訳ありません。

## 目的
全項目をクエリする時に、いちいち項目を指定するのが面倒な方にはぴったりです。

## 実装
```java

/**
 * SOQLの"Select *"のクエリStringを取得する
 * @param tableName テーブル名
 * @param whereCondition クエリのWHEREやGROUPBYやORDERBYやLIMITなど
 * @param isCustomFieldOnly カスタム項目のみを取得するフラグ
 * @param staticFields カスタム項目のみの場合、カスタム項目をクエリに含めたらこのパラメーターを使用する
 * @return SOQLクエリString
 **/
public static String getSelectAllQuery(String tableName, String whereCondition, Boolean isCustomFieldOnly, String[] staticFields) {
    Map<String, Schema.SObjectType> m = Schema.getGlobalDescribe() ;
    Schema.SObjectType s = m.get(tableName) ;
    Schema.DescribeSObjectResult r = s.getDescribe() ;
    Map<String, Schema.SObjectField> fields = r.fields.getMap() ;
    string soql = '';
    for (String fieldName : fields.keyset()) {
        if(isCustomFieldOnly && (fieldName.indexOf('__c') < 0)) {
            continue;
        }
        if (soql != '') {
            soql += ', ';
        }
        soql += fieldName;
    }
    for (String fieldName : staticFields) {
        if (soql != '') {
            soql += ', ';
        }
        soql += fieldName;
    }
    soql = 'SELECT ' + soql + ' FROM ' + tableName + ' ' + whereCondition;
    return soql;
}

```

* staticFieldsパラメータについて

カスタム項目のみのクエリを生成する際に、いくつか標準項目も取得したい場合使用することができます。

## 使い方

* **全項目**

```java
String query = getSelectAllQuery('Account', 'WHERE Id=\''+accId+'\'', false, null);
Account accData = Database.query(query);

```
* **カスタム項目のみ**

```java
String[] fields = new String[]{'Name'};
String query = getSelectAllQuery('Account', 'WHERE Id=\''+accId+'\'', true, fields);
Account accData = Database.query(query);

```

## 注意事項
全項目をコピ・クローンーするなどの目的では、数式型かどうかや権限も持っているをちゃんとチェックしてください。
サイボウズのカスタムアプリで、日付を和暦に変換する JavaScript

　皆さん、あけましておめでとうございます。岩舘電気の中の人です。
　中の人にとって、昨年は大変に忙しい年でしたが、皆さんにとってはどんな年だったでしょうか。
われわれは今年も昨年以上に皆さんに「いわての光」を届けられるよう全力で邁進する所存です。
どうぞ今年も宜しくお願いいたします。

　さて、昨年末に、サイボウズのカスタムアプリの日付型から現在年齢を計算させるスクリプトを公開しました。
http://qiita.com/iwadatedenki/items/b3ce789868a1708d40af
この記事の文末で、西暦を和暦に変換するスクリプトも作りたいと書きましたが、作ってみたので早速公開します。
(2015/02/12追記：DBView のみならず、アップデートや新規追加画面でも書き換えをしてしまっていました。修正が必要ですので少々お待ちください。)


```
$(document).ready(function () {
	WesternJapaneseCalendarConverter("record-value-12",133);

	function WesternJapaneseCalendarConverter(tdclass, app_num){ //変換したい列, アプリID
		var did = $(':hidden[name="DID"]').val();

		if (did==app_num){
			var $tdobj=$("td").each(function(){
				if(typeof(this)!="number"){
					if(this.getAttribute("className")==tdclass||this.getAttribute("class")==tdclass){
						var b=new Date(this.innerHTML);
						if (b.getFullYear()<=1988){
							var prefix="S"+(b.getFullYear()-1925);
						} else if (b.getFullYear()>=1990) {
							var prefix="H"+(b.getFullYear()-1988);
						} else if (b.getMonth()==1||b.getDate()<=7) {
							var prefix="S64";
						} else {
							var prefix="H1";
						}
					var s=this.innerHTML;
					this.innerHTML=prefix+s.substring(4);
					}
				}
			});
		}	
	}
});
```

　実行した結果のサンプルはこちらです。なおこのサンプルでは、前回使った年齢計算スクリプトも動かしています。
左が変換前、右が返還後のサンプルです。
![before.png](https://qiita-image-store.s3.amazonaws.com/0/61220/6d348267-2d3a-024c-6d5d-1064737780c6.png) ⇒　![after.png](https://qiita-image-store.s3.amazonaws.com/0/61220/ef8956bc-4feb-aa0c-afef-ba80ce971066.png)

　こちらのスクリプトを前回作成した年齢計算スクリプトと共存させるには、先に年齢を計算させてから和暦変換する必要があります。（日付を取り出すパーサーが、後方の文字列を無視してくれるのでしょう。）あるいは、年齢を書きだす専用の列を作っておいてそちらに年齢を書きだし、オリジナルの日付の列は非破壊にしておくというのも良い方法かもしれません。
　次は西暦和暦を変換させるボタンを表示させて、相互変換できるようにしたいです。
AWSでのリージョン間接続(VPN/VyOS)

#AWSリージョン間接続

AWSでリージョン間(例えば東京とオレゴン)で通信を行いたい場合、
AWSではVPCピアリングという機能があるが同一リージョンでしか使用できないため、VPNを構築する必要があります。

今回はVyOSを使用して、インスタンスにENIを付与する。
また、AWSのVPC/RouteTablesを追加しない方法で実現する。

##構成図
![aws_vpn.jpg](https://qiita-image-store.s3.amazonaws.com/0/49877/4b9641cc-db60-dd22-05f0-baffcf28ca4d.jpeg)



#前準備

・AmazonLinux 最新版のAMI
→ENIを付与する

・VyOS コミュニティAMIの最新版(Version 1.1.0)
→source dest checkを無効にする
→EIPを付与する

##設定方法

###Tokyo AmazonLinux

・ルーティング設定

```
ip route add 10.110.0.0/16 dev eth1 via 10.102.0.200 table 100
ip rule add from 10.110.0.0/16 table 100
ip rule add to 10.110.0.0/16 table 100
```

###Tokyo VyOS

Config

```
set vpn ipsec ipsec-interfaces interface eth0 

set vpn ipsec ike-group ike lifetime 3600
set vpn ipsec ike-group ike proposal 1 encryption aes128
set vpn ipsec ike-group ike proposal 1 hash sha1

set vpn ipsec esp-group esp lifetime 1800
set vpn ipsec esp-group esp proposal 1 encryption aes128
set vpn ipsec esp-group esp proposal 1 hash sha1

set vpn ipsec site-to-site peer [EIP] authentication mode pre-shared-secret 
set vpn ipsec site-to-site peer [EIP] authentication pre-shared-secret XXXXXXXXXXXXXXXXX

set vpn ipsec site-to-site peer [EIP] authentication id @tokyo-vyos
set vpn ipsec site-to-site peer [EIP] authentication remote-id @oregon-vyos

set vpn ipsec site-to-site peer [EIP] default-esp-group esp
set vpn ipsec site-to-site peer [EIP] ike-group ike
set vpn ipsec site-to-site peer [EIP] local-address [LocalIP]
set vpn ipsec site-to-site peer [EIP] tunnel 1 local prefix 10.102.0.0/16
set vpn ipsec site-to-site peer [EIP] tunnel 1 remote prefix 10.110.0.0/16
```

###Oregon AmazonLinux

*ルーティング設定

```
ip route add 10.102.0.0/16 dev eth1 via 10.110.0.100 table 100
ip rule add from 10.102.0.0/16 table 100
ip rule add to 10.102.0.0/16 table 100
```

###Oregon VyOS

Config

```
set vpn ipsec ipsec-interfaces interface eth0 

set vpn ipsec ike-group ike lifetime 3600
set vpn ipsec ike-group ike proposal 1 encryption aes128
set vpn ipsec ike-group ike proposal 1 hash sha1

set vpn ipsec esp-group esp lifetime 1800
set vpn ipsec esp-group esp proposal 1 encryption aes128
set vpn ipsec esp-group esp proposal 1 hash sha1

set vpn ipsec site-to-site peer [EIP] authentication mode pre-shared-secret 
set vpn ipsec site-to-site peer [EIP] authentication pre-shared-secret XXXXXXXXXXXXXXXXX

set vpn ipsec site-to-site peer [EIP] authentication id @oregon-vyos
set vpn ipsec site-to-site peer [EIP] authentication remote-id @tokyo-vyos

set vpn ipsec site-to-site peer [EIP] default-esp-group esp
set vpn ipsec site-to-site peer [EIP] ike-group ike
set vpn ipsec site-to-site peer [EIP] local-address [LocalIP]
set vpn ipsec site-to-site peer [EIP] tunnel 1 local prefix 10.110.0.0/16
set vpn ipsec site-to-site peer [EIP] tunnel 1 remote prefix 10.102.0.0/16
```

#etc...

インスタンスにENIを付与することで、
インターネットへ向ける通信と分離ができたほうが良いかと思い実装してみました。

冗長構成などを考えた時に、AWSCLIでRouteTableを書き換える以外の選択肢もありそうです。
TeXを監視して自動コンパイルする


rubyの[guard/guard](https://github.com/guard/guard)を使ってファイルの変更を監視して、
裏で自動コンパイルする

# 準備

まず`guard`をインストールする

以下の様なGemfileを用意する

```Gemfile
source 'http://rubygems.org'
gem 'guard'
gem 'guard-shell'
gem 'rb-readline'
gem 'rb-inotify'
```

そして

```sh
# gem install bundle
bundle install
```

で`guard`などをインストールする

- 参考: [Guardでファイル変更を監視して作業を自動化する | Tech-Sketch](http://tech-sketch.jp/2013/01/guard.html)

# ファイルの監視およびコンパイルの設定

まず`guard`の初期設定をする

```sh
bundle exec guard init
```

するとGuardfileが作成される
これを以下の様に書き換える

```rb:Guardfile
guard :shell do
  watch(/(.*).tex/) {|m|
    `platex -interaction=nonstopmode  #{m[1]}`
    `dvipdfmx #{m[1]}`
    `open -g -a Preview #{m[1]}.pdf`
  }
end
```

これで、texファイルに変更があれば`platex`と`dvipdfmx`でpdfファイルに変換し、バックグラウンドのPreview.appで開くようになる
なお、Preview.appにフォーカスをあてないと変更が可視化されないので注意
やや無理矢理な解決策としては

```rb:Guardfile
guard :shell do
  watch(/(.*).tex/) {|m|
    `platex -interaction=nonstopmode #{m[1]}`
    `dvipdfmx #{m[1]}`
    `open -a Preview #{m[1]}.pdf`
    `open -a TexShop`
  }
end
```

とすることで一度Preview.appにフォーカスをあててから再度TexShop.appにフォーカスをあてることが出来るため、
Preview.appも更新されつつフォーカスは(一瞬奪われるが)TexShopに保つことが出来る

### 追記(2015/01/05 17:25)

[Skim](http://skim.softonic.jp/mac)というPDFビューワーには
ファイルの変更を検知して表示を更新してくれる機能があるので、これを使えば


```rb:Guardfile
guard :shell do
  watch(/(.*).tex/) {|m|
    `platex -interaction=nonstopmode #{m[1]}`
    `dvipdfmx #{m[1]}`
    `open -g -a Skim #{m[1]}.pdf`
  }
end
```

とすればフォーカスを奪われることなく表示の更新ができて便利でした
環境設定覚書

枕が変わると眠れないタイプ

# 各種設定ファイル
```bash:~/.gitignore
.DS_Store
.idea/
*.swp
```

```bash:~/.gitconfig
[user]
        name = あれ
        email = いわゆるひとつの
[core]
        editor = vim
        quotepath = false
        excludesfile = ~/.gitignore
[color]
        ui = auto
[alias]
        co = checkout
        st = status
        graph = log --graph --date-order -C -M --pretty=format:\"<%h> %ad [%an] %Cgreen%d%Creset %s\" --all --date=short
[push]
        default = current
```

```vim:~/.vimrc
call pathogen#infect()
syntax enable
filetype plugin indent on
set hlsearch
set number
set tabstop=2
" :a! → ペースト → ESC でペースト時にひどいインデントにならない
set autoindent
set expandtab
set shiftwidth=2
" cursorline つけるとむっさ遅くなる。まぁお好みで
" set cursorline
" 80行信者ではないが業務上やむを得ず…
set colorcolumn=81
" 行末の空白に死のマーク x
set listchars=trail:x
set list
```

```bash:~/.screenrc
escape ^T^T
defscrollback 4000
startup_message off
caption always '%?%F%{= bW}%:%{= Kk}%?%2n%f%07=%t%='
hardstatus alwayslastline '%m/%d %02c:%s %{= .g}%H%{-} %L=%-w%45L>%{=u b.}%n %t%{-}%+w %-17<%=%{= .y}(%l)'
```

# ディレクトリ構造
```
~/
  root/
    tmp/  # 一時的なもの置き場
    account_info/  # ssh キーなどを置いておく。 ~/.ssh/id_rsa は この中の秘密鍵へシンボリックリンクを貼る
    work/  # 仕事用ディレクトリ。この中に、会社ごとのディレクトリを置く
```
容量の大きいデータを扱うときに使えるワザ

今回容量の大きい（32.1 MB）のxmlデータを使うことがあったので、そのときに利用したワザ？についてメモしておきます。

##ファイルの分割
大きすぎてvim等で開けない場合ファイルを分割することで容量を軽くしてエディタで開けるようにする。

```linux
$ split -l 10000 railRoad.xml railRoad.xml.
```

これは10000行ごとにrailRoad.xml.a、railRoad.xml.b、railRoad.xml.cとファイルが分割されていく。

##仮想マシン、PHPへのメモリの割り当てを増やす
vagrantで実行していたのですがvagrant自体にはデフォルトで458MBが割り当てられています。

```linux
$ vagrant ssh
$ free -m
  total       used       free     shared    buffers     cached
Mem:           458        436         22          0         12         47
-/+ buffers/cache:        376         82
Swap:         2559        724       1835

```

なのでまずvagrant自体のメモリの割り当てを増やしてやります。設定はVagrantfile内で行います。

```text:Vagrantfile
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  # ...
 
  config.vm.provider "virtualbox" do |vb|
    #...
 
    # Use VBoxManage to customize the VM. For example to change memory:
    vb.customize ["modifyvm", :id, "--memory", "1024"]
  end
 
  #...
end
```

したらvagrantの設定を有効にします。

```linux
$ vagrant reload
```

次にPHPへのメモリの割り当てを増やします。

```php:php.ini
memory_limit = 512M
```

PHPの設定を有効にします。

```linux
$ sudo service httpd restart
```

これでメモリの割り当てが増えました。感覚として倍々に増やしていってあまりにもメモリを食うようであれば、処理の仕方の変更を検討する、という感じで進めました。
MacのVPNサーバー機能

#MacでVirtualPrivateNetwork
仮想専用回線、と漢字に書くと難しく聞こえるこの機能、ビジネスで注目を浴びているそうですが、出先と自宅をつなぐっていうごく個人的な用途に使っても十分便利だったりします。

いろいろなVPNサーバーのプログラムがあると思いますが、macには標準でL2PT,PPTPを使ったvpndが搭載されています。Macのサーバーを購入するとGUIも標準でついてくるのですが、買わなくとも設定ファイルの場所と記述さえ把握していれば、TerminalからVPNサーバーが立てられるのです。

#サードパーティ製GUIアプリ
面倒くさいこと抜きにVPNやりたいって方は[VPN Activatar](http://www.netputing.com/applications/vpn-activator/
)がおすすめです。これから説明することを全部自動でやってくれます。

#設定ファイル
`man vpnd`を読むとわかりますが、vpndの起動には専用のplistがいることが分かります。
`man vpnd -s 5`に詳しい説明と、**サンプルのplist**があるので、ここでは深い話を割愛させていただきます。

vpndの設定ファイルのパスは`Library/Preferences/SystemConfiguration/com.apple.RemoteAccessServers.plist`です。
ファイルが存在しない場合、上記のmanページに書いてあるものを切り取って新しく作ることが出来ます。

サンプルとして載ってるサーバーは2種類あり、L2TP over IPSecのものとPPTPを使ったものです。ぱっとググってみたところ、L2TPは256bit暗号化、低速（といってもPPTPより2割ほどの速度減であるそうです）、PPTPは128bit暗号化、高速といった具合のようです。
お好きな方を選んでください。
サポート機器を増やすには両方起動することが望ましいと思いますが多分安全だったり楽なのは、一つだけ起動するものであると思います。

VPNDの説明にもありますがVPNDはVPNで受け取ったデータをPPPDに流しているので、ユーザー情報などはPPPDの設定に書く必要があります。
PPPDの設定は`/etc/ppp/`に置きます。
ここで必要なのはユーザーの情報だけです。
サンプルのVPND用plistにはMSCHAPv2認証を使うように書いてあったと思います。
他の認証方法だと設定の方法も変わってくるのかな。

`/etc/ppp/users.plist`に

```xml:users.plist
<?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
 <plist version="1.0">
 <dict>
         <key>Password</key>
         <string><!-- パスワード --></string>
         <key>User</key>
         <string><!-- ユーザー名 --></string>
 </dict>
 </plist>
```

みたいに書けば大丈夫です。

#起動
は驚くほど簡単。
`sudo vpnd`
これだけです。

#launchctlに登録
マシン起動時に毎回スタートして欲しいので、launchctlに書きます。
`/etc/hostconfig`に登録する方法もあって（てかそれがおすすめらしいけど）簡単ですが、VPNだけのために/etcにファイルを作ったりするのもあれだし、管理しやすくするためにlaunchctlを使おうと思います

root権限で起動して欲しいので、/Library/LaunchDaemonsに`com.apple.vpnd.plist`をパーミッション:644 root:wheel で作成します。

```xml:com.apple.vpnd.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>Disabled</key>
        <false/>
        <key>Label</key>
        <string>com.apple.vpnd</string>
        <key>Program</key>
        <string>/usr/sbin/vpnd</string>
        <key>ProgramArguments</key>
        <array>
                <string>/usr/sbin/vpnd</string>
                <string>-x</string>
                <string>-i</string>
                <string>com.apple.ppp.l2tp</string>
        </array>
        <key>KeepAlive</key>
        <true/>
        <key>RunAtLoad</key>
        <true/>    
</dict>
</plist>
```
あとは
`sudo launchctl load /Library/LaunchDaemons/com.apple.vpnd.plist`
を実行すればOKです。

#なぜこれを書いたか
VPNActivatorを使ってたんだけど、なんか自前で同じことをしたくなって設定ファイルを探し始めたら思ったよりめんどくさかったから