OmniAICreator/Qiita-1.07M huggingface dataset:
putsがブロックを引数に取る？

putsでHashのリテラルを表示させようとしたときに SyntaxError が発生する。

```rb
puts {a: :a}
```
を実行すると、
> SyntaxError: unexpected ':', expecting '}'

とエラーが表示されて終了する。
色々調べてみたところ、

```rb
puts ({a: :a})
```
とか、

```rb
a = {a: :a}
puts a
```
であればリテラルが表示される。

と言うことは、puts が{}をブロックとして解釈している？？
これは設計通りの動作？でもリファレンスを探しても載っていない。
どなたかご存知の方教えて下さい。
PHPのメソッドと関数の違い

メソッドは実装する場所が異なるだけで、関数の一種、という少し乱暴な考えでいるのですが、PHPではどのように扱われるのか、少し調べてみました。
仮説：
* メソッド：クラスの中で定義された関数
* 関数：クラスの外で定義された関数

今回は、PHPの定義済みの定数の動きを確認してみます。
http://php.net/manual/ja/language.constants.predefined.php
>`__METHOD__`　クラスのメソッド名。
>`__FUNCTION__`　関数名。

他に、メソッドと関数を、と言うモノを明確に区別する様なモノがPHPには見当たらなかったので…他に良い指標があれば教えて下さい！

では、実際どう出力されるのか？まずは結論から。

`__FUNCTION__`
　**常に関数名**を返す。
`__METHOD__`
　**クラスのメソッド内で利用すると、「クラス::関数名」**を返す。
　関数内で利用した時は、`__FUNCTION__`と同じく、関数名を返す。

`__FUNCTION__`をメソッド内で、`__METHOD__`を関数内で、あべこべに呼び出したらエラーになったりしないか気になっていたのですが、無難な結果になりました。

以下、テストコードとその出力。

```php:test1.php
class test{
  public function mic(){
    echo __FUNCTION__ . "\n";
    echo __METHOD__. "\n";
  }
}
$pic = new test();
$pic->mic(); 
```
出力
`mic`
`test::mic`


```php:test2.php
function moc(){
  echo __FUNCTION__ . "\n";
  echo __METHOD__. "\n";
}
moc();
```
出力
`moc`
`moc`
git pushがrejectされたときの対処

たまに起こるのでメモします。
ブランチ切って作業していて完成したからpushしようとしたらrejectされた。
エラー文を見てみると下記が原因らしい。
```Updates were rejected because the tip of your current branch 
is behind```
頻繁にpullしてるつもりなんですが、、僕がpushするまでの間に、他の人
のpushがあるなどしてリモートが変更されている状況のときに起こるっぽい
ですね。
対処方法はググるとたくさん出てきますが、このときhintってのが出てて
"git pull ..."って書いてある。今までpullっていうとmasterから
pullするってことしか頭になかったんですがね、、、とりあえず
```git pull origin master```してみた。直らない。
いろいろやっててたらどうやらpullの指定先を間違っていた。作業ブランチが
hogeのときで、このエラーがなかなか直らないときは```git pull origin hoge```
ってのをやってみましょう。
僕はこれで直りました。
JavaScript初心者脱却への道のりを考える

最も誤解されているプログラム言語として名高いJavaScriptの誤解を解きつつ、中級者（プログラム開発においてある程度戦力として計算できる）になるためには何から抑えればいんだろう、というのを考えた記録とリンク集です。
考えたというか、自分が勉強中です。

※追記
[KENJUさん](http://qiita.com/KENJU)が完全に上位互換な内容の投稿を公開されていましたので紹介。
[中上級者になるためのJavaScript【知識編】](http://qiita.com/KENJU/items/c7fad62a12cc2809b507)

#対象
- 何かしらのプログラム言語は書ける
- 多少JavaScriptを書いたことはあれど、言語の仕様はよく知らない

#レベルの基準
中級ってどんな人なのさ？
>[JavaScriptの業務スキルレベル　判別表　（５段階）](http://d.hatena.ne.jp/language_and_engineering/20100111/p1)
>[あなたはJavaScriptを知らない](http://d.hatena.ne.jp/suginoy/20111117/p1)

- JavaScriptでよく使われるクロージャやプロトタイプの考え方を理解すること
- 代表的なライブラリ（jQueryとか）が使えること、最近ならNode.jsなんかも触れること
- AjaxやDOM操作などができること

などが挙げられるのかなという感じです。
今回は1.のJavaScript自体の部分に絞ります。

#項目を挙げてみる
##スコープを理解する
- レキシカルスコープであること/関数単位のスコープであること
- ホイスティング（巻き上げ）により見た目と実際の変数定義タイミングがずれる場合があること
- スコープを制限するために即時関数で囲むと良い場合も。_(function(){})();_←これ。

>[JavaScript のスコープを理解する](http://tacamy.hatenablog.com/entry/2012/12/30/191125)
>[JavaScriptのスコープ](http://blog.gochipon.co.jp/entry/2015/02/27/152951)
>[関数の場合の変数の巻き上げ問題について](http://qiita.com/cocottejs/items/143f70e806c61ffafe28)

##クロージャを理解する
- クロージャの作り方がわかる
- 使いどころがイメージできる
    - プライベートな情報を保持した関数オブジェクトができる
    - イベントリスナの生成などが効率よくできる

> [JavaScriptでクロージャ入門](http://qiita.com/takeharu/items/4975031faf6f7baf077a)
> [私が今までクロージャを理解できなかった理由](http://d.hatena.ne.jp/artgear/20120115/1326635158)

##thisの扱い理解する
- 場合によってthisが指す部分が変わることを理解する

> [JavaScriptの「this」は「4種類」？？](http://qiita.com/takeharu/items/9935ce476a17d6258e27)
> [JavaScript の this を理解する](http://tacamy.hatenablog.com/entry/2013/01/06/224718)

##apply,callの動きを理解する
- (上記thisにも関連しますが) apply,callによりthisが書きかえられることを理解する
- classベースのオブジェクト指向と違って、データと関数を切り離す考え方も身につける

> [Javascriptのcall/apply関数のプロっぽい使い方 〜 JSおくのほそ道 #014](http://qiita.com/hosomichi/items/155af03120a330fd4437)
> [javascriptのapplyとcallを理解する](http://blog.craftgear.net/4f583dabe318842d78000001/title/javascriptのapplyとcallを理解する%20)
> [必殺の .apply()フックを打つべし！　打つべし！](http://ginpen.com/2011/12/17/apply-hook/)

##プロトタイプを理解する
- 共通で利用する関数はprototypeに宣言する
- prototypeによってオブジェクト同士の結びつき（継承チックな）ができることを理解する
- プロトタイプチェーンの考え方を理解する

> [JavaScriptの「プロトタイプ入門」](http://qiita.com/takeharu/items/809114f943208aaf55b3)
> [JavaScript初級者から中級者になろう - 九章第三回　継承](http://uhyohyo.net/javascript/9_3.html)

##関数型言語の特性を取り入れる
JavaScript独自というわけではないですが、、、
####イテレーションメソッド
- 配列に対する操作で、ループで1つずつ処理しなくても効率良く処理できる場合があることを理解する

> [JavaScriptのイテレーションメソッドまとめ(forEach,map,reduce…)](http://am-yu.net/2014/03/23/javascript-iteration-method/)

※追記 2016/1/11
イテレーションメソッドの記事書きました
[イテレーションメソッド活用：テーブルを集計しよう](http://qiita.com/stkdev/items/087d61036c4946e690b7)


####カリー化・部分適用
- " 複数の引数が必要な関数"を"1引数関数の連続"であらわすカリー化
- それにより一部の引数を固定して新たな関数を作る部分適用が容易になること

> [食べられないほうのカリー化入門](http://qiita.com/KDKTN/items/6a27c0e8efa66b1f7799)
> [カリー化と部分適用（JavaScriptとHaskell）](http://qiita.com/7shi/items/a0143daac77a205e7962)

#まとめ
このあたりから抑えていけばいいんじゃなかろうか、というところをまとめました。
まずは「おや？見た目に反してCやJavaとはなんだか違うぞ？」というところからスタートかなと思います。

突っ込みどころ満載の内容かもしれません。「違うぞー」とか「もっと必要なことあるぞー」というご指摘がありましたらぜひお願いします。
追加や修正は随時行っていきたいと思います。
Macでサクラエディタ


# はじめに
私だけかもしれませんが、普段テキストファイルを整形したりするのに正規表現を使って一括置換をしたりします。
会社ではサクラエディタを使ってやっているのですが、自宅だとMacなのでサクラエディタが使えません。

Macで正規表現を扱えるテキストエディタを探して使えばいいのかもしれませんが、出来れば使い慣れたサクラエディタが使いたいなぁと思っていました。

というわけで、今回はEasyWineを使ってMacでサクラエディタを使えるようにしてみました。

# 使えるようにするための流れ
1.EasyWineをインストール
http://matome.naver.jp/odai/2140238022377155001
からEasyWine-20150128_wine-1.7.35.dmgをダウンロードしてきてインストール 
詳細は、作者さんのhttp://mattintosh.hatenablog.com/entry/20140706/1404653173
を見てください。
2. サクラエディタをダウンロード
3. EasyWineを起動して、立ち上がったエクスプローラ上から2.でダウンロードしたサクラエディタのexeを起動してインストール
4. Macのスクリプトエディタを起動して以下のように書く

```bat:script
do shell script "
	export LANG=ja_JP.UTF-8
	export WINEDEBUG=-all
	export WINEPREFIX=$HOME/Library/Caches/Wine/prefixes/default
	export XDG_CACHE_HOME=$HOME/Library/Caches/Wine
	export XDG_CONFIG_HOME=$HOME/Library/Caches/Wine
	export XDG_DATA_HOME=$HOME/Library/Caches/Wine
	exec /Applications/EasyWine.app/Contents/Resources/wine/lib/../bin/wine $HOME/Library/Caches/Wine/prefixes/default/drive_c/Program\\ Files/sakura/sakura.exe >/dev/null 2>&1 &
"
```

5.　スクリプトを保存するときに、下図のようにファイルフォーマットをアプリケーションにする
![kobito.1435250748.476079.png](https://qiita-image-store.s3.amazonaws.com/0/62776/3343298b-fe30-df27-67bb-e7d11c82800b.png "kobito.1435250748.476079.png")

6.　5.で作成したappを起動するとサクラエディタが起動する。

![kobito.1435251022.043914.png](https://qiita-image-store.s3.amazonaws.com/0/62776/5833d919-b6b1-00a1-5766-2b159812217c.png "kobito.1435251022.043914.png")

# 注意
1. サクラエディタのタブモードをオンにして、再度エディタを起動するとアプリケーションがクラッシュします。タブモードはオフにしたほうがいいです。。。
2. BootCampしている方はわかると思いますが、EasyWineで起動しているアプリは、キーボードのキーバインドがWindows仕様になるので、気をつけてください。
例えば、コピーがcommand+cじゃなくて、control+cになります。
<参考>https://support.apple.com/ja-jp/HT202676

# 実は・・・
Macでサクラエディタが使いたかったというのもあるのですが、本当はSteamでWindows版しかないゲームをやるためにEasyWineを使いたかったというのもあります、、、
同じ手順でWindows版Steamもインストールして起動できるので、お試しあれ。
ただ、ゲームによっては起動できないものもあるので(Warframeとか)、そういう時はおとなしくBootCampかVM使うのが吉です。
argparseを使ってみた


引数を便利に取り込んでくれるもの。

ヘルプだったり、引数の型を指定したり、デフォルト値だったり、まぁ自分で設計しようとしても、便利にしようとすればするほど使い方は複雑にならざるを得ないよね。

ということで、このあたりを頼りに最低限のルールだけを調べて使ってみた。

- [そこはかとなく書くよ。](http://d.hatena.ne.jp/rudi/20100805/1281020304)
- [Python manual(2.7)](http://docs.python.jp/2.7/library/argparse.html#)


```python
parser = argparse.ArgumentParser(description='Test dataを作成します') # parserを作る
parser.add_argument('target', type=int, default=15, help='ターゲットとなる長さを指定します')
parser.add_argument('number', type=int, default=10, help='要素数を指定します')
parser.add_argument('-v', '--version', action='version', version='%(prog)s 1.0') # version
args = parser.parse_args() # コマンドラインの引数を解釈します
```

で、取得した値は

```python
args.target
args.number
```
のように取り出せるようです。

おぉ、便利。
他にもいろいろオプションで指定できるようだけど、今は特にいらないのでここまで。

おわり。
OpenSSLコマンドの備忘録

OpenSSLコマンドはいつも忘れてしまうので備忘に。


# 秘密鍵の作成

```bash
# 暗号化しない
openssl genrsa -out server.key 1024

# 3DESを使ってパスフレーズで暗号化する
openssl genrsa -aes128 -out server.key 1024

# 既にある秘密鍵の暗号化を解く (サービスを自動で起動する時などに必要。セキュリティーは落ちる)
openssl rsa -in server.key -out server.key

# 既にある秘密鍵を暗号化する
openssl rsa -aes128 -in server.key -out server.key

# 秘密鍵の中身をみる
openssl rsa -noout -text -in server.key
```


# 証明書署名要求(CSR)の作成

```bash
# 証明書署名要求(CSR)の作成
openssl req -new -days 365 -key server.key -out server.csr

# 秘密鍵作成とCSR作成を一度にする(秘密鍵を暗号化しない)
openssl req -nodes -new -keyout server.key -out server.csr -days 365

# 秘密鍵作成とCSR作成を一度にする(秘密鍵を暗号化する)
openssl req -new -keyout server.key -out server.csr -days 365

# CSRの内容を確認
openssl req -in newreq.pem -text
```

# 署名

```bash
# 自分の秘密鍵で自己署名した証明書を作成する
openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365

# 秘密鍵作成,CSR作成,自己署名を一度にする(秘密鍵を暗号化しない)
openssl req -x509 -nodes -new -keyout server.key -out server.crt -days 365

# 秘密鍵作成,CSR作成,自己署名を一度にする(秘密鍵を暗号化する)
openssl req -x509 -new -keyout server.key -out server.crt -days 365
```

# 失効処理

```bash
# 証明書の失効処理
openssl ca -revoke newcerts/01.pem

# CRLの生成
openssl ca -gencrl -out CA.crl

# CRLの内容を確認
openssl crl -in CA.crl -text
```

# 証明書の内容を確認する

```bash
# TEXT形式で表示
openssl x509 -in server.crt -text

# 証明書の使用目的を表示
openssl x509 -in server.crt -purpose

# ASN.1形式で表示
openssl asn1parse -in server.crt

# 証明書から公開鍵を取り出す
openssl x509 -in server.crt -pubkey -noout
```

# 形式の変換

```bash
# PKCS#12形式にする 秘密鍵と公開鍵をPKCS#12形式1ファイルにする
openssl pkcs12 -export -inkey server.key -in server.crt -out server.p12

# PKCS#12形式をpem形式に戻す
openssl pkcs12 -in server.p12 -out server.pem

# DER形式のファイルを作成
openssl x509 -inform pem -outform der -in server.crt -out cacert.der
```
MySQLクエリでCSVを作成する方法

#　とりあえずやり方
<pre>SELECT * FROM テーブル名
  INTO OUTFILE '/tmp/UserTable.csv'
  FIELDS TERMINATED BY ','
  OPTIONALLY ENCLOSED BY '"';</pre>
+ INTO OUTFILE  
csvファイルを出力する場所を指定します
+ FIELDS TERMINATED BY   
FIELDS TERMINATED BY は、入力ファイルのフィールドの末尾を識別する区切り記号文字を定義するのに使用します。

二重引用符で囲む (例えば ":")

単一引用符で囲む (例えば ':')
のどちらでも問題ありません。


+ OPTIONALLY ENCLOSED BY  
　データを囲む文字を指定。囲まない場合は不要。

# クリエからCSVファイルの作成
MySQLのSELECT文でテーブルを検索するとします。
`SELECT * FROM UserTable;`
検索結果  

| userId | name |level|
|---|---|---|
| 1000 | tanaka |9|
| 1001 |kimura |10|
| 1002 | sasaki |1|
| 1003 | kise |15|
| 1004 | nagawasa |20|
| 1005 | kawano |11|
上記のような形で抽出結果が表示されるとします。
これをCSVファイルに出力しようとすると以下のようなクエリになります。

<pre>SELECT * FROM UserTable
  INTO OUTFILE '/tmp/UserTable.csv'
  FIELDS TERMINATED BY ','
  OPTIONALLY ENCLOSED BY '"';</pre>
もしくは
<pre>SELECT * FROM UserTable
  INTO OUTFILE '/tmp/UserTable.csv'
  FIELDS TERMINATED BY ',';</pre>
# 作成されるCSVファイルの中身
tmpファルダの直下にUserTable.csvが作成されると思います。
UserTable.csvの内容は
<pre>1000,tanaka,9
1001,kimura,10
1002,sasaki,1
1003,kise,15
1004,nagawasa,20
1005,kawano,11</pre>
embulk のプラグイン開発時にお試し実行するには

変更点 (2015/12/14):

* JRuby プラグインの実行方法を embulk が official にサポートしている embulk run -b . の方式に変更
* 起動時間を短くする方法について記載

## Java なプラグイン

Java なプラグインの場合は

```
$ ./gradlew classpath
$ embulk run -I lib example.yml
```

## JRuby なプラグイン

JRuby なプラグインの場合は、Gemfile をいつものように書いて

```Gemfile
source 'https://rubygems.org'

gemspec
```

embulk bundle install したあと、embulk run -b . と実行すれば良い。

```
$ embulk bundle install --path vendor/bundle
$ embulk run -b . example.yml
```

※ bundle install && bundle exec embulk だと、シェルスクリプトとして bin/embulk が足しているオプションを利用できなくて良くない。-J-O、-R--dev など。

## 高速起動

bin/embulk がシェルスクリプトおよび bat スクリプトとして提供している、最適化をオフにするオプションを使用すると、起動が速くなって開発時は捗る。
```
embulk -J-O -R--dev run -I lib example.yml
```

`-R` は jruby のオプションを渡すためのオプションで、jruby --dev とすると jruby の最適化をオフにして起動時間を速めることができる。-J-O は embulk が提供している Java の最適化をオフにするオプションで、これを指定すると、`-XX:+AggressiveOpts -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -Xverify:none` というオプションを Java に渡すことになるようだ。

私の環境では、起動までの時間が 9sec から 5sec に短縮された。

当然であるが、本番ではオフにすると処理速度が落ちるのでやらないこと
【Java】乱数を1億生成する

```java:test01.java

import java.util.Arrays;
import java.util.Random;

public class test01 {

    public static void main(String[] args) {
        long[] nums = new Random().longs(100_000_000,-200L,200L).toArray();
        System.out.println("nums[0]="+nums[0]);
        System.out.println("nums[99_999_999]="+nums[99_999_999]);
    }

}

```
##環境
ベアボーン:Shuttle XS35GS V3
OS:win7(32bit)
JAVA SE8(jdk-8u45-windows-i586)

##解説
-200から200までの乱数を1億生成して配列numsに格納して、nums[0]とnums[99_999_999]を出力する。
実行すると、「OutOfMemoryError」ってエラーが出た。
エラーを出さない対策は、-Xmxを使うと回避できるらしい。
私の環境では-Xmx1144mでエラーが出て、-Xmx1145mで正常に動いた。

JAVA SE8からrandomクラスにint,long,doubleの乱数列からなるストリームを生成するメソッドが追加された。
longsメソッドの第1引数ではストリームの要素数、第2引数と第3引数で生成する乱数の範囲を設定している。
-200Lと200LのLはlong型であることを示す。

##実行結果
```
c:\2015>java test01
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at java.util.stream.Nodes$LongArrayNode.<init>(Unknown Source)
        at java.util.stream.Nodes$LongFixedNodeBuilder.<init>(Unknown Source)
        at java.util.stream.Nodes.longBuilder(Unknown Source)
        at java.util.stream.LongPipeline.makeNodeBuilder(Unknown Source)
        at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
        at java.util.stream.AbstractPipeline.evaluateToArrayNode(Unknown Source)

        at java.util.stream.LongPipeline.toArray(Unknown Source)
        at test01.main(test01.java:7)

c:\2015>java -Xmx1144m test01
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at java.util.stream.Nodes$LongArrayNode.<init>(Unknown Source)
        at java.util.stream.Nodes$LongFixedNodeBuilder.<init>(Unknown Source)
        at java.util.stream.Nodes.longBuilder(Unknown Source)
        at java.util.stream.LongPipeline.makeNodeBuilder(Unknown Source)
        at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
        at java.util.stream.AbstractPipeline.evaluateToArrayNode(Unknown Source)

        at java.util.stream.LongPipeline.toArray(Unknown Source)
        at test01.main(test01.java:7)

c:\2015>java -Xmx1145m test01
nums[0]=-50
nums[99_999_999]=-94

```
##あとがき
おそらく、実行するパソコンによって-Xmx1145mでは動かないかな？あるいは、もっと少ないメモリ量でいけるか？
OutOfMemoryはJava VMの管理するメモリサイズを超えたことを意味し、「実行環境依存」ということだが、「実行環境依存」ってのがよくわからない。いまのとこはこの「実行環境依存」を掘り下げずに飛ばして勉強していこう。
このXmxの使い方が分からず半日つぶしてしまったが、エラーが出ずに実行できたときは感動ものだな。
JAVAは挫折して丸投げしたまんまだったが、今年、2015年にJAVAをある程度できるレベルにしたい。

##参考文献
日経ソフトウェア 2014年10月号(日経BP社) P138～139
Factory_girlでちょっとハマる

Factory_girlの設定で、

```ruby:spec_helper.rb
#
#... 前略
#
RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods
#          　　　　　　☝️上の一行を追加
#... 中略
#
end
```

”FactoryGirl.”を省略させる設定がうまく入らなかったです。
調べると、
spec/supportディレクトリに以下、

```ruby:factory_girl.rb
RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods
end
```

を作るとのことだったので、やってみたらできました。
stack経由でghcをインストール（ubuntu）

haskellの強力なビルドツール[stack](https://www.fpcomplete.com/blog/2015/06/stack-0-1-release)がリリースされました。
stackにはghcをインストールする機能もあるので、これを使えばhaskell-platformを使うよりもghcを使える環境を整えるのが楽かもしれません。
というわけで、ghcなど、haskell関連の準備が全くない状態から、stackを使ってghcをインストールする手順をまとめました（といっても大したことはしていませんが）。

#環境・バージョンなど#
* stack-0.1
* ghc-7.8.4, 7.10.1
* OS: lubuntu 15.04 64bit

インストールするghcは7.8.4です。
7.10.1もインストールできましたが、現状ではstackのデフォルトは7.8.4のようなので7.8.4にしています。

##cabal-installについて##
stackは強力なツールになりそうですが、まだまだcabal-installの出番もありそうです。ということでcabal-installもインストールしています。
この手順でインストールされるcabal-installの現時点でのデフォルトバージョンは1.18.1.0になります。もっと高いバージョンが必要なら、別途``cabal update; cabal install cabal-install``などのようにして高いバージョンをインストールしてください。

#手順#
````bash:install_haskell_via_stack.sh
#!/bin/bash

set -e

PROF_FILE="/etc/profile.d/haskell.sh"
GHC_VERSION="7.8.4"
# GHC_VERSION="7.10.1"

echo "-------- install stack --------"
wget -q -O- http://download.fpcomplete.com/ubuntu/fpco.key | sudo apt-key add -
echo 'deb http://download.fpcomplete.com/ubuntu/vivid stable main'|sudo tee /etc/apt/sources.list.d/fpco.list
sudo apt-get update
sudo apt-get install stack -y

echo "-------- update package informations --------"
stack update

echo "-------- install ghc-${GHC_VERSION} -------"
stack setup "${GHC_VERSION}"

echo "-------- install cabal-install -------"
stack install cabal-install

# パスは自分の使っている設定ファイルなどに追加してください。
GHC_PATH="${HOME}/.stack/programs/x86_64-linux/ghc-${GHC_VERSION}/bin"
LOCAL_PATH="${HOME}/.local/bin"

PATH="${GHC_PATH}:${PATH}"
PATH="${LOCAL_PATH}:${PATH}"
export PATH

echo "-------- check versions ---------"
ghc --version
cabal --version
````

#ubuntu以外の環境について#

Windowsでも使用してみましたが、問題なく使用できました。
ただ、Cygwin上で使おうとするといろいろ問題が起きることもあるので注意してください。
（stackに関係なく、haskell-platformでも問題が起きるときは起きます）

#参考#

* [stack](https://github.com/commercialhaskell/stack/wiki/Downloads)
* [stack 0.1 released](https://www.fpcomplete.com/blog/2015/06/stack-0-1-release)
* [Why is stack not cabal?](https://www.fpcomplete.com/blog/2015/06/why-is-stack-not-cabal)
* [Haskellのビルドツール"stack"の紹介](http://qiita.com/tanakh/items/6866d0f570d0547df026)
Active Adminにスコープを追加する

# はじめに

[Active Admin](http://demo.activeadmin.info/admin)というgemを利用すると、Ruby on Railsアプリケーションに管理画面を簡単に追加することができます。

Active Adminの機能の1つにスコープがあります。
スコープを定義しておくことでスコープ内のコレクションを絞り込んで表示することができます。

簡単な商品データベースを例にスコープを追加します。
Active Adminのセットアップは省略します。

テーブル名はproductsです。
テーブルの定義は以下のとおりです。

```ruby:create_products.rb
class CreateProducts < ActiveRecord::Migration
  def self.up
    create_table :products do |t|
      t.string :name
      t.integer   :price
      t.boolean :published
      t.timestamps
    end
  end
end
```

| 物理名 | 論理名 | 型 |
|---|---|---|
| name | 商品名 | string |
| price | 価格 | integer |
| published | 公開 | boolean |

以下のファイルをapp/models配下に作成します。

```ruby:product.rb
class Product < ActiveRecord::Base
end
```


以下のファイルをapp/adminに作成します。

```ruby:product.rb
ActiveAdmin.register Product do
	permit_params :name, :price, :published
end
```

以下のようにデータを登録しました。

![1](https://qiita-image-store.s3.amazonaws.com/0/3862/5721f7f8-5d12-4e60-0563-76a2f41a50c2.jpeg)


| id | name | price | published |
|---|---|---|---|---|
| 1 | テレビ | 40000 | NO |
| 2 | 掃除機 | 30000 | NO |
| 3 | 洗濯機 | 50000 | YES |

Active Adminではboolean型はYES、NOで表示されます。

# スコープを追加する

商品が公開（publishedがYES）のものを絞り込むためのスコープを追加します。

以下のファイルをapp/admin/product.rbに追記します。

```ruby:product.rb
ActiveAdmin.register Product do
	permit_params :name, :price, :published

	scope :published do |products|
    		products.where(:published => true)
  	end
end
```

以下の画像のように「Published (1)」が表示されます。1というのは条件に該当するのが1件という意味です。

![2](https://qiita-image-store.s3.amazonaws.com/0/3862/fa46114d-fa23-8def-20b7-c6b13dd53a48.jpeg)


「Published (1)」をクリックすると以下の画像のように1件のみ表示されます。

![3](https://qiita-image-store.s3.amazonaws.com/0/3862/26f1a761-5677-dbab-36d5-31aae1bb27f9.jpeg)


すべて表示するためのスコープは`scope "All", :all, :default => true`と記述します。

```ruby:product.rb
ActiveAdmin.register Product do
	permit_params :name, :price, :published

	scope "All", :all, :default => true
	scope :published do |products|
    		products.where(:published => true)
  	end
end
```
Tableau9.0にて同フィールドに平仮名とカタカナが混在する場合、最初に読み込んだもので固定される件の回避方法

Tableau9.0において同じフィールドに平仮名やカタカナの表記ゆれがあった場合、**最初に読み込まれたもの**が適用されます。


```lang:インプット例
kana1	kana2	num
でーたベース	データベーす	1
データベース	データベース	10
データベース	データベース	10
データベース	データベース	10
データベース	データベース	10

```
↓↓↓

```lang:読み込み結果
kana1	kana2	num
でーたベース	データベーす	1
でーたベース	データベーす	10
でーたベース	データベーす	10
でーたベース	データベーす	10
でーたベース	データベーす	10
```

なので、特に人が入力した文字を集計したりするときは最初の表記揺れが全て適用されてしまいます。

これを回避するには、データソース画面にて
取り込んだファイルの横から選択できる「ロケール」の設定を「英語(アメリカ合衆国)」などにするしかないようです。


```lang:読み込み結果（ロケール：英語(アメリカ合衆国)の場合）
kana1	kana2	num
でーたベース	データベーす	1
データベース	データベース	10
データベース	データベース	10
データベース	データベース	10
データベース	データベース	10
```

8.0, 8.1ではこの問題は発生しません。
RDS(MySQL 5.6.22 )における log_output あれこれ

RDS(MySQL)設定覚書

デフォルトはlog_output = TABLE

log_output = TABLE
の状態だとmysql.general_log とか mysql.slow_log テーブルに書き込まれてゆきます。

なお、TABLEに設定していても、ファイル自体は生成されてゆき少々混乱するので注意です。
本設定は択一なので、ファイルで運用する場合はFILEにしておきましょう。
（なおFILEに変更しても、記録された mysql.general_log だったりはテーブルに残っており消えないようです）
ElasticsearchでOutOfMemory

## あれ

Kibanaで使っているElasticsearchが動いてないなと思って見てみたら、OutOfMemoryErrorが出てました。

## OutOfMemory

「あれー、メモリ多めのサーバで動かしてるんだけどなあ」とかボケてたら、ちゃんと書いてました公式に。

https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration.html

要は、起動時にヒープサイズをちゃんと確保してスワップさせるな、ということらしい。ちなみにデフォルトは1g。

ということでES_HEAP_SIZEで多めに指定して再起動。無事復旧。

## File Descriptors

安心してから数時間後、今度は「Too many open files」で落ちてる。これも上記の公式ドキュメントに書いてますな。

ということで、以下を実行してまずは調査。

```
curl localhost:9200/_nodes/process?pretty
```

レスポンス見てみたら、max_file_descriptors=1024。公式では32kか64kを推奨しているのでこれは少ない。

```
ulimit -n
```

あーそもそも上限が1024のままだ。ということで以下を実行してからElasticsearchを再起動。

```
ulimit -n 65535
```

これでひとまず安定しました（ulimitだとサーバ再起動で元に戻っちゃうけど、それはまた別途対応）。

## 余談

調べててわかったのが、この２つはElasticsearchの運用の初歩だったみたいで、自分の不勉強を再認識しました。ElasticsearchはKibanaだけじゃなくてサービスでも使っていくので、運用ノウハウはちゃんと勉強しつつ実運用を通して溜めていきたいところです。
RDS(MySQL 5.6.22 )におけるパラメータ log_queries_not_using_indexes の挙動

RDS(MySQL)設定覚書

RDS(MySQL)にてlog_queries_not_using_indexesを1にすると
RDS自身が発行していると思われるクエリがindexが張られていないようで引っかかってしまい
結果的にslow-logが埋もれる。

```lang:1時間あたり600回前後
DELETE FROM mysql.rds_sysinfo where name = 'innodb_txn_key';
select table_name from information_schema.tables where table_schema='mysql' and table_type = 'BASE TABLE' and engine = 'MyISAM' and table_name not like '%RDSDUMMY%' and table_name not in ('general_log', 'slow_log', 'general_log_backup', 'slow_log_backup');
SELECT count(*) from information_schema.TABLES WHERE TABLE_SCHEMA = 'mysql' AND TABLE_NAME = 'rds_heartbeat2';
SELECT value FROM mysql.rds_heartbeat2;
SELECT count(*) from mysql.rds_history WHERE action = 'disable set master' ORDER BY action_timestamp LIMIT 1;
SELECT count(*) from mysql.rds_replication_status WHERE master_host IS NOT NULL and master_port IS NOT NULL ORDER BY action_timestamp LIMIT 1;
use mysql;
SELECT NAME, VALUE FROM mysql.rds_configuration;
```



なお、long_query_timeを0.1にしたりすると、同様にちょくちょくRDSのクエリが出力されます。
特に
flush logs;
が5分に1回実行されているようで、0.2～0.3秒掛かりがちです。


結局 log_queries_not_using_indexes は0で、
0.1を超えるやつは埋もれるほどではないので一旦我慢して運用しています。

なんとかなりませんかねー
[Pleiades] Eclipse 4.5 Mars + 公式 Gradle プラグイン Buildship

毎年 6 月恒例の Eclipse メジャーリリースとなる Eclipse 4.5 Mars (マース) がリリースされた。パフォーマンス改善、Java 8 のクイックフィックス追加、JavaScript サポート強化などが行われている。これに合わせて日本語化された Eclipse と便利なプラグインや Java 実行環境を含む全部入りの Pleiades All in One もリリースした。

__Pleiades All in One Eclipse 4.5 Mars ダウンロード__
http://mergedoc.sourceforge.jp/pleiades_distros4.5.html
![eclipse_4.5_mars.jpg](https://qiita-image-store.s3.amazonaws.com/0/45147/03ad7aa5-0874-06b7-b576-6caf63e07e39.jpeg)

# eclipse.org 公式 Gradle プラグイン Buildship 追加
Eclipse の Gradle プラグインといえば Gradle IDE が有名だが、eclipse.org からも公式の Gradle プラグイン Buildship がリリースされた。今回の Pleiades All in One にも追加済みだ。Buildship には以下のような機能があり、将来は多くの機能拡張が予定されている。

__Buildship: Eclipse Plug-ins for Gradle__
https://projects.eclipse.org/projects/tools.buildship

## Gradle プロジェクト作成ウィザード
ウィザードを利用して Gradle Java プロジェクトを作成またはインポートできる。

* ファイル > 新規 > プロジェクト > Gradle > Gradle プロジェクト
* ファイル > インポート > プロジェクト > Gradle > Gradle プロジェクト

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/45147/8ba4056f-39e1-db91-1cea-fa7dc276a6bd.jpeg)

## Gradle タスクビュー
Gradle プロジェクト別にタスクを実行できるビューが用意されている。
![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/45147/6abb3522-7ac2-19b9-e119-1e7f65cc7e38.jpeg)
jQueryの$.Deferred、$.whenの使い方を整理してみました



##$.Deferred

```javascript
var d = new $.Deferred();
//何かしらの非同期処理
return d.promise();
```
このようにプロミスオブジェクトを返してあげることで、関数同士をthenでつなぐことが出来る。
```$.get```などの処理が終わった後は```d.resolve()```で次の関数に処理が移動する。


##$.when

複数のスレッドの処理が終わるのをまって何か処理を書きたい時に使用する。
得てしてスレッドは可変である場合が多いので、```$.when.apply($,arr);```と、applyメソッドを使ってあげると便利。
プロミスオブジェクトを返す

```javascript
var defarr = [];
ajaxs.forEach(function(){
	defarr.push(d.promise());
	//何かしらの非同期処理
});
return $.when.apply($,defarr);
```

##サンプル

5秒待って、ajaxsに格納されたURLから複数jsonを取得して、"everything is done"というメッセージを出す

```javascript

//配列ajaxsには予めURLが複数格納されているものとする

var wait = function(){
	var d = new $.Deferred();
	setTimeout(function(){
		d.resolve();
	},5000);
	return d.promise();
}

var getObjs = function(){
	var defarr = [];
	ajaxs.forEach(function(url){
		var d = new $.Deferred();
		$.getJSON(url,function(json){
			items.push(json);
			d.resolve();
		});
		defarr.push(d.promise());
	});
	return $.when.apply($,defarr);
}

var message = function(){
	console.log("everything is done");
}

wait().then(getObjs).then(message);

```
openframeworks+ovrvision.frameworks

ofに他のフレームワーク追加もやったことなかったのでいろいろ引っかかったのでメモ
今回は準備
次回はOpenCVも使ったプログラミングを中心にやってくつもり

#環境
mac osx10.10
xcode 6.2
openframeworks 0.8.4
ofxOculusRift 0.2.1(OVRVersion.hに書いてあった)
Ovrvision sdk v2

Oculus Rift DK1
Ovrvision 1


#ダウンロード
ofxOculusRift
https://github.com/andreasmuller/ofxOculusRift

ovrvision sdk
http://dev.ovrvision.com/doc_ja/index.php?downloads#sdk

#ovrvisionSDKのセットアップ
ovrvision公式セットアップガイド
http://dev.ovrvision.com/doc_ja/index.php?startup_manual#n58a89c4

ovrvisionセットアップ+opencv
http://maclove.exblog.jp/19969137

下の方（公式じゃないほう）のリンク先でも言っているようにSDKのフレームワークに少し問題があってリンクの貼り直しをしたい。

ダウンロード直後:
![スクリーンショット 2015-06-24 21.40.35.jpg](https://qiita-image-store.s3.amazonaws.com/0/76572/243539ac-9306-9b71-8633-14f4a88f5ea7.jpeg "スクリーンショット 2015-06-24 21.40.35.jpg")

リンク貼り直した後:
![スクリーンショット 2015-06-24 21.41.51.jpg](https://qiita-image-store.s3.amazonaws.com/0/76572/5325043b-ddcb-0b9e-4f20-8bcb38d7166a.jpeg "スクリーンショット 2015-06-24 21.41.51.jpg")


図のようになれば結果的にいいとは思います。
ディレクトリ操作でエイリアス作成とかでもたぶん大丈夫かも（未確認）
リンク先の手順をもうちょっと詳しく書くと、
(1)OvrvisionSDK.framework内のHeaders,OvrvisionSDK,Resourcesの3ファイル削除
(2)ターミナルを起動
(3)OvrvisionSDK.frameworkの中にcd
ターミナルで「cd 」を打った後に，フォルダをターミナルにドラッグ＆ドロップするとすぐ移動できますね
(4)以下のコマンド実行
ln -s ./Versions/A/Headers
ln -s ./Versions/A/OvrvisionSDK
ln -s ./Versions/A/Resources

#フレームワーク追加
参考
http://www.morikuma.net/archives/archives/382

Xcodeに環境設定をしていきます
まずは，openFrameworksのプロジェクトジェネレーターでofxOculusRiftのアドオンを追加して作成します

自分がビルドできた方法では
(1)Ovrvision.frameworksを追加していく
Build Phases -> Copy Filesに追加
Build Phases -> Linked Frameworks and Librariesに追加

(2)参考URL先のよくわからない設定
ここがうまくいってないと「Library not loaded」などと出てランタイムエラー（ここでかなり詰まった・・・）
Build Phases -> Copy Files
DestinationをProducts Directoryに

(3)includeできるように
\#include \<OvrvisionSDK/ovrvision.h\>
などと書いてあるところもありますが、自分はうまくいかなかったので設定
Build Settings -> Search Paths -> Header Search Pathsに
"$(SRCROOT)/../../../libs/ovrvision/OvrvisionSDK.framework/Headers"を追加

(3)定数設定（これ設定すればwinファイル消さなくてもいいかも？未確認です・・・）
\#define MACOSX true
をofMain.hに追記

![スクリーンショット 2015-06-30 0.48.23.png](https://qiita-image-store.s3.amazonaws.com/0/76572/cdadcea6-cbea-71e7-69d9-bcdf9d82548b.png)

![スクリーンショット 2015-06-30 0.50.20.png](https://qiita-image-store.s3.amazonaws.com/0/76572/07bc4356-f82f-561a-51f9-601b051c5629.png)


次回サンプルコード載せたい
vim で使ってること

ぺーぺーぺーの学生なので、今から充実させて行きたい

2015/06/25
MacBook Pro (Retina, 13-inch, Early 2013)
OS 10.10.3
terminal.app バージョン 2.5.3 (343.7)

terminal 上でHaskell を勉強中

以下幼稚園生以下の内容、基本的にdefault厨

# .vimrc
```lang:.vimrc
  1 "comment
  2 ".vimrc
  3 set number
  4 set title
  5 set showmatch
  6 syntax on
  7 " TABを押した際に半角スペース2文字にする
  8 set expandtab
  9 set tabstop=2
 10 set shiftwidth=2
 11 set smartindent
 12 " 大文字小文字の区別なしで検索
 13 set ignorecase
```

# コマンド
i 挿入
a 挿入（カーソルの右側）

:w 保存
ZZ 保存してshellへ

/ 後ろに検索
　　/foo で"foo"を検索
n 後ろに１つずつ見ていく
N 前に

? 前に検索
nとNは/の逆位相

u undo

gg てっぺんに移動
G 一番下へ
$ 文末
0 文頭
% 対応する括弧へ

command+[ go to normal mode
技術英語 > alterとchange > Walter, alter the alter into the Walter.

alterとchange。どちらも「変える」という意味だが、変える度合いが違う。

以下のページに詳しい。
http://d.hatena.ne.jp/A30/20110504/1304474958

抜粋させていただくと
> changeは全面的・根本的な変更をいい，alterは部分的な変更をいう。したがってchange plansは「計画を全面変更する」，alter one’s plans は「計画を一部手直しする」の意になる。


記憶の宮殿構築のために、以下のような例文を考えてみた。

    「Walter, Alter the alter into the Walter」 (「ウォルター（人の名前）、alterをWalterに変えなさい」）.

alterを部分変更してWalterにしている。
普通のクラスとケースクラスのパターンマッチ

Scalaの便利な機能パターンマッチ、いろいろな場面で使えるけど、普通のクラスとケースクラスで微妙な差異が・・・・

```scala:PatternMatch
object PatternMatch {

  class A
  
  class B extends A
  class C extends A
  
  case class X(name: String) extends A
  case class Y(name: String) extends A

  def matchNoCaseClass(obj: A): Unit = obj match {
    case a: B => println("class B")
    case _ => println("other")
  }
  
  def matchCaseClass(obj: A): Unit = obj match {
    case X(_) => println("class X")
    case _ => println("other")
  }

  def main(args: Array[String]) = {
    matchNoCaseClass(new B)
    matchNoCaseClass(new C)
    
    matchCaseClass(new X(""))
    matchCaseClass(new Y(""))
  }
  
}
```

実行結果は以下のような感じ。

```
class B
other 
class X
other
```

普通のクラスだとパターンマッチのcase節にコンストラクタ縛りとかが使えない。そもそも以下の型縛りの書き方もできない。

```scala
case B => println("class B")     // 文法エラー
case b: B => println("class B")  // OK
```
Michael Abrash Interview

Michael AbrashというWindows NTのグラフィックス部分実装で力を発揮した("闘うプログラマー"）人のinterview 。

過去にQuakeのプログラム実装でも活躍して、今はValveで活躍しているようだ。

~~https://www.youtube.com/watch?v=a7My8zbDNRI&list=PL_MJualihC5AxdlHgVUROYKbNAaPJ5PE4&index=2~~

https://www.youtube.com/watch?v=eziKqWWyCy8

途中までインタビューを聞き取ったものは以下の通り。

(0:00-)
I'm Michael Abrash. I'm working on virtual reality Valve. I have been in a computer industry for 33 years now. My first game was sold in 1982, what's called "space strike" run on the IBM PC. I wrote several other games then. 

(0:20-)
In the 90s, I worked in "id" and I was on <font color=red>[XXX] of the two problems</font> :one Quake and John Carmack. I also was the graphics lead for Windows NT, first couple of versions and I worked on XBOX. And now I am working on Valve.

(0:34-)
I would have to say my favorite game all time was Quake, because it was so much fun being a part of making that. My favorite game of any recent time would be portal 2.

(0:44-)
I remember playing a video game on some unnamed radio shack, <font color=red>[thing you huck up to your TV]</font> that has six games in it like pong. I don't even know what that system was called.

とりあえずここまで2箇所(赤文字の部分)がよく分からない。
他人が書いたPythonコードが解読しにくかったら(Python)

他人が書いたPythonコードが解読しにくかったら(Python)

・**Spyderが使える場合**
　Editor画面で、その関数名を選択した状態で、^+I(=control +I)を押すと、
　Object Inspectorでそのobjectが何であるのかを示してくれる。
　それを使うと、その関数についてのドキュメンテーションコメントが表示される。

・**Spyderが使えない場合**
　pythonのコンソールで,
  \>>> help(関数名) 
  と実行する。
　その場合も、ドキュメンテーションコメントが表示される。

　`from pylab import *`
　が実行された後でだと
　>>> help(imshow)
　Help on function imshow in module matplotlib.pyplot:
　
　imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, 　

extent=None, shape=None, filternorm=1, filterrad=4.0, imlim=None, resample=None, url=None, hold=None, **kwargs)
    Display an image on the axes.
    
    Parameters
    -----------
    X : array_like, shape (n, m) or (n, m, 3) or (n, m, 4)
　(後略)
　のようになります。

Pythonのスクリプトの中で、
ライブラリを利用できるようにする方法は
import ライブラリ名
とする方法と
from ライブラリ名 import 関数名
from ライブラリ名 import *
とする方法とがあります。

import ライブラリ名
とする場合には
ライブラリ名.関数名
で参照されます。

import pylab
pylab.imshow(image)
と
import cv2
cv2.imshow("image title", image)
のように
それぞれのライブラリがimshow()という画像表示関数を持っていても
正しく使い分けることができます。

from pylab import imshow
とした場合には、
imshow()がどのライブラリからきたものががわかりにくくなります。

from pylab import *
とした場合には、
imshow()がどのライブラリをからきたものが
その部分のスクリプトだけからでは
機械的に知る方法はわかりようがなくなります。

from ライブラリ import *
とすると、いつの間にか、意図せずして識別子を書き換えてしまう可能性が
高くなります。
grayという変数名でグレースケール画像を保存しておいたつもりが
pylab.gray()関数で置き換えてしまうことになります。
　
まとめ：　
他人が書いたPythonコードが解読しにくかったら
Spyder統合環境では^+I
Spyder統合環境以外ではhelp(関数名)
を利用する。

---
pycodestyle を使って、コーディングスタイルのチェックを行う。
それによって可読性の向上のための書き換えをしていこう。
[pycodestyle – 1つのPythonファイル シンプルなPythonスタイルチェッカー](https://githubja.com/pycqa/pycodestyle)

type hintを利用しよう。
https://docs.python.org/ja/3/library/typing.html
メモ：Raspberry PiからIFTTTのトリガを(簡単に)起こせるようになった

[IFTTTにMaker Channelができました | スイッチサイエンス マガジン](http://mag.switch-science.com/2015/06/25/ifttt-maker-channel/)

[Introducing the Maker Channel | IFTTT Blog](http://blog.ifttt.com/post/121786069098/introducing-the-maker-channel)

なんと、マジっすか。

```ifttt.sh
#!/bin/bash
CURL=/usr/bin/curl
IFTTT_EVENT="YOUR_EVENT_NAME"
IFTTT_KEY="YOUR_SECRET_KEY"
IFTTT_URL="https://maker.ifttt.com/trigger/${IFTTT_EVENT}/with/key/${IFTTT_KEY}"

${CURL} -X POST \
    ${IFTTT_URL} \
    --header "Content-Type: application/json" \
    --data-binary "{\"value1\": \"$1\"}"
```

ざっくりレシピ作って。

> ![IFTTT.jpg](https://qiita-image-store.s3.amazonaws.com/0/82738/752a6255-6c32-5ccd-2e0f-5a08c852ca5d.jpeg)

> ![IFTTT3.jpg](https://qiita-image-store.s3.amazonaws.com/0/82738/9fab9325-30fe-7f0b-1936-00724123edbe.jpeg)


実行して。

```
$ ifttt.sh ごはんですよは、桃屋ですよ！
Congratulations! You've fired the raspberrypi event
```

Notificationが来た。

> ![IFTTT2.jpg](https://qiita-image-store.s3.amazonaws.com/0/82738/f700dd3d-598c-a9b4-9d46-2c1de1b8d2d3.jpeg)

URLにシークレットキー文字列がそのまま埋まっているのはどうなの、って感じもするけれど。
github > コミットメッセージの検索 > minamijoyo

githubにてコミットメッセージで検索したかったが、どうもダメらしい。
http://stackoverflow.com/questions/18122628/how-to-search-for-a-commit-message-in-github

代わりに以下のサービスで検索できるようだ。
http://commit-m.minamijoyo.com/
gitwatch > after_dot > STRLCPY(path_name, arg, after_dot - arg);

https://github.com/neovim/neovim/commit/34a5efd7a9a5c093207ab9d235719de546ff7479

> memu.c
> STRLCPY(path_name, arg, after_dot - arg);

after_dotという命名に興味を持った。 

after_dotを使った色々な例がある。
https://github.com/search?q=%22after_dot%22&ref=searchresults&type=Code&utf8=%E2%9C%93
Mac OS XでDocker

#MacにDockerインストール

##1. VirtualBoxのインストール
事前にVirtualBoxのインストールが必要です。
https://www.virtualbox.org/
こちらのサイトからVirtualBoxをインストール

##2. boot2docker
boot2dockerをインストール
`brew install boot2docker`

VM作成
`boot2docker init`

VM起動
`boot2docker start`

以下のコマンドで設定すべき環境変数が確認できます。
`boot2docker shellinit`

環境設定コマンドを実行
`$(boot2docker shellinit)`

※.bashrcに以下を追記しておけばOK。

```lang:.bashrc
# Docker
eval $(boot2docker shellinit)
```

hello-world コンテナを起動して、確認。
Hello from Docker.が表示される。
`docker run hello-world`

##こんな時は？

###docker.sock: no such file or directory
```
FATA[0000] Get http:///var/run/docker.sock/v1.18/version: dial unix /var/run/docker.sock: no such file or directory. Are you trying to connect to a TLS-enabled daemon without TLS?
```

環境設定コマンドが上手くいってない？環境設定コマンドを実行してみる。
`$(boot2docker shellinit)`

###x509: certificate is valid

```
FATA[0000] An error occurred trying to connect: Post https://192.168.59.103:2376/v1.18/containers/create: x509: certificate is valid for 127.0.0.1, 10.0.2.15, not 192.168.59.103
```

boot2dockerを再作成
１度deleteして
`boot2docker delete`

再度VM作成
`boot2docker init`
MacVim.appからTerminal.appを起動

TerminalからMacVimを開く方法はいくらでも検索にヒットするけど、
MacVimを使っている時にカレントディレクトリを保持してTerminalを開く方法が見つからなかったのでメモ。

MacVimで!つけながらシェルコマンド打つのがめんどくさくなったとき用。

```shell-session
!open . -a Terminal.app
```

追記: .appはなくてもいいみたいですね。

```shell-session
!open . -a Terminal
```
JacksonでMix-inを使う

## バージョン
jackson-databind 2.2.4
JDK 1.8.0_25

## 本文
JacksonでJavaのオブジェクトをJSONにシリアライズする場合、除外したい項目に`@JsonIgnore`をつけたり`@JsonCreator`で特定のコンストラクタをデシリアライズ時のファクトリにしたりしますが、様々な理由でアノテーションが付けられない場合もあるかと思います。

* 外部ライブラリのクラスである
* クラスをJackson依存にしたく無い
* など

そういう場合、Mix-inの仕組みを使う事でクラス外からJacksonのアノテーションを付ける事ができます。

## 使用例(import文は除外)
シリアライズ対象クラス

```java
public static class User {
    private int userId;
    private String name;
    private int age;
    private String password;

    public User(int userId, String name, int age, String password) {
        this.userId = userId;
        this.name = name;
        this.age = age;
        this.password = password;
    }

    public int getUserId() {
        return userId;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getPassword() {
        return password;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", password='" + password + '\'' +
                '}';
    }
}
```

Mix-in用の抽象クラス

```java
public static abstract class UserMixin {
    /*
     * JSONシリアライズ時にpasswordを除外する
     */
    @JsonIgnore
    abstract String getPassword();

    /*
     * Userの引数4つのコンストラクタをJsonCreatorにする
     * (これが無いとデシリアライズできない)
     */
    @JsonCreator
    public UserMixin(
            @JsonProperty("userId") int userId
            , @JsonProperty("name") String name
            , @JsonProperty("age") int age
            , @JsonProperty("password") String password) {
        System.out.println("mixed-in constructor.");
    }
}
```

実際に利用するクラス

```java
public class JacksonMixIn {

    public static void main(String[] args) throws IOException {
        User user = new User(1, "kamatama41", 17, "password");

        /*
         * 普通にシリアライズする
         * 
         * {"userId":1,"name":"kamatama41","age":17,"password":"password"}
         */
        ObjectMapper mapper = new ObjectMapper();
        final String json = mapper.writeValueAsString(user);
        System.out.println(json);

        ObjectMapper mapper2 = new ObjectMapper();
        mapper2.addMixInAnnotations(User.class, UserMixin.class);

        /*
         * Mix-inした状態でシリアライズする。passwordが除外される
         * 
         * {"userId":1,"name":"kamatama41","age":17}
         */
        System.out.println(mapper2.writeValueAsString(user));

        /*
         * Mix-inした状態でデシリアライズする。
         * MixInクラスのコンストラクタは実行されない模様。
         * ("mixed-in constructor."が出力されない。)
         * 
         * User{userId=1, name='kamatama41', age=17, password='password'}
         */
        final User deserializedUser = mapper2.readValue(json, User.class);
        System.out.println(deserializedUser);
    }
}
```
ChromiumでFlashを有効にする

RedHat系LinuxにてChromiumとFlashを動作させる方法です。
FlashはPPAPI版です。
##Chromiumのインストール
用いたのは以下のパッケージ。配布元はncsu。
このパッケージでなくてもandykimpeリポジトリなどで配布されているものでも同様に行えると思います。
`chromium-43.0.2357.81-2.el7.centos.x86_64.rpm`
こちらをrpmコマンドでインストール。

```shell-session
[root@localhost user]# rpm -ivh chromium-43.0.2357.81-2.el7.centos.x86_64.rpm
```
libXss.so.1など要求されたら`yum provides`で検索して適宜インストールして、再度Chromiumをインストール。
配置は以下の通り。

```
[root@localhost user]# rpm -qs chromium-39.0.2171.99-1.el7.centos
通常  /opt/chromium
通常  /opt/chromium/chrome
通常  /opt/chromium/chrome-sandbox
通常  /opt/chromium/chrome-wrapper
...
```
##Flashのインストール
用いたのは以下のパッケージ。
配布元はPostInstallerF(Sourceforge)に含まれている。
chromium-pepper-flash-17.0.0.134-1.fc22.x86_64.rpm
こちらをrpmコマンドでインストール。

```shell-session
[root@localhost user]# rpm -ivh chromium-pepper-flash-17.0.0.134-1.fc22.x86_64.rpm
```
Flashの配置は以下の通り。

```shell-session
[root@localhost user]# rpm -qs chromium-pepper-flash-17.0.0.134-1.fc22
通常  /usr/lib64/chromium
通常  /usr/lib64/chromium/PepperFlash
通常  /usr/lib64/chromium/PepperFlash/libpepperflashplayer.so
通常  /usr/lib64/chromium/PepperFlash/manifest.json
通常  /usr/share/lisenses/chromium-pepper-flash/eula_text.html
```
##ChromiumにFlashを読み込ませる
ChromiumのFlashの参照先は`/opt/chromium/chrome-wrapper`に記述されている。

```shell-session
[root@localhost user]# cat /opt/chromium/chrome-wrapper
...
if [ -f /opt/chromium/PepperFlash/libpepflashplayer.so ]; then
exec $CMD_PREFIX "$HERE/chrome" --ppapi-flash-path=/opt/chromium/PepperFlash/libpepflashplayer.so "$@"
else
exec $CMD_PREFIX "$HERE/chrome" "$@"
fi
```
対して、インストールしたFlashの配置先は上記のように
`/usr/lib64/chromium/PepperFlash/libpepflashplayer.so`なので変更します。

```shell-session
…
if [ -f /usr/lib64/chromium/PepperFlash/libpepflashplayer.so ]; then
exec $CMD_PREFIX "$HERE/chrome" --ppapi-flash-path=/usr/lib64/chromium/PepperFlash/libpepflashplayer.so "$@"
else
exec $CMD_PREFIX "$HERE/chrome" "$@"
fi
```
Chromiumを起動・再起動すれば反映されていると思います。
有効・無効はいつも通り`chrome://plugins`より行えると思います。
rpmパッケージによっては配置先が違ったりするかもしれないので適宜変更してください。
詳細・その他の処置はこちらにまとめてみました。↓
http://neetingnow.hatenablog.jp/entry/2015/06/09/144528

Qiitaもブログも駆け出しですので叱咤激励していただけると嬉しいです。
CentOS 6.4 で Ansible 1.9.1 が動くようにする

# 前置き

業務上、CentOS 6.4 上にて Ansible 1.9.1 (本記事投稿時の最新の安定版) を動作させたかったのだが、色々と課題があったのでどう対応したのかを綴る。

# 何が問題だったのか

yum で入る Ansible のバージョンが 1.1 だった。そこで pip を使って最新版を導入しようとしたところ、依存ライブラリである pycripto2.6 がまともにインストールできずにハマった。

# やったこと

## 概要

Ansible 1.9 のためには pycrpto2.6 等の依存ライブラリが必要で、pycrypto2.6 のためには gmp5 と python-devel が必要。

## 手順

### まずは gmp5 を入れる

こちらに従った。

http://confluence.sharuru07.jp/pages/viewpage.action?pageId=360849

### python-devel を入れる

これがないと、pycrypto2.6 が入らない (native extension のビルドに失敗する系かな)。

```
$ sudo yum install python-devel
```

### pip を入れる

pip 経由でないと、Ansible とその依存ライブラリ (Python系) のインストールが面倒。

```
$ sudo yum install python-pip
```

### Ansible の依存ライブラリを入れる

`sudo pip install`で以下を入れる。

* paramiko
* jinja2
* PyYAML
* setuptools
* pycrypto

一部、なくてもいいかも知れない。古いバージョンが最初から入っているのは`--upgrade`オプションが必要。

この辺、細かい作業記録をつけなかったのでちょっと曖昧。
ただ、上記はいずれも Ansible の依存ライブラリなので、全て最新版を入れておいても支障はないだろう。

### Ansible 本体を入れる

ここで漸く。

```
$ sudo pip install ansible
```

以下のコマンドでインストール状況を確認。
バージョンが 1.9.1 だったり、使うコマンドがパスの通ったところに入っていることが確認できればよい。

```
$ ansible --version
$ which ansible-playbook
$ which ansible-galaxy
```

## playbook で上記を書くとこんな感じ

```yaml
---
# gmp5 がないと pycrypto2.6 が入らない
- name: gmp5 のダウンロード
  get_url: >
    url=ftp://ftp.gnu.org/gnu/gmp/gmp-5.0.5.tar.bz2
    dest=/usr/local/src/gmp-5.0.5.tar.bz2

- name: gmp5 の解凍
  shell: >
    bzip2 -dc gmp-5.0.5.tar.bz2 | tar xvf -
    chdir=/usr/local/src
    creates=/usr/local/src/gmp-5.0.5

# オプションは /usr/local 配下へのインストールと C++ サポートの有効化
- name: gmp5 の configure
  command: >
    ./configure --prefix=/usr/local --enable-cxx
    chdir=/usr/local/src/gmp-5.0.5
    creates=/usr/local/src/gmp-5.0.5/Makefile

- name: gmp5 の make
  command: >
    make
    chdir=/usr/local/src/gmp-5.0.5
    creates=/usr/local/src/gmp-5.0.5/libgmpxx.la

- name: gmp5 のインストール
  command: >
    make install
    chdir=/usr/local/src/gmp-5.0.5
    creates=/usr/local/lib/libgmpxx.la

# これがないと pycrypto2.6 が入らない
- name: python-devel のインストール
  yum: >
    name=python-devel
    state=latest

# これがないと新しい ansible や pycrypto 等を入れるのが大変
- name: pip のインストール
  yum: >
    name=python-pip
    state=latest

- name: ansible に必要な python ライブラリをインストール
  pip: >
    name={{ item }}
    state=latest
  with_items:
    - paramiko
    - jinja2
    - PyYAML
    - setuptools
    - pycrypto

- name: ansible のインストール
  pip: >
    name=ansible
    version=1.9.1
```
UILabel に下線をつける

ストーリーボードから下線を付けられると便利そうなのでメモ

AttributedString を使う。

![スクリーンショット 2015-06-25 19.05.01.png](https://qiita-image-store.s3.amazonaws.com/0/37053/218aa7bf-d917-cc05-5d4e-31e86ef0b23f.png)


こういうViewController があったら

![スクリーンショット 2015-06-25 19.05.38.png](https://qiita-image-store.s3.amazonaws.com/0/37053/ecec16da-e00c-d69a-3e5d-179f023ba85a.png)
![スクリーンショット 2015-06-25 19.05.45.png](https://qiita-image-store.s3.amazonaws.com/0/37053/a01a766d-e9ab-87db-ca44-41fa6542f9f3.png)

Text をPlainからAttributed にして


![スクリーンショット 2015-06-25 19.06.00.png](https://qiita-image-store.s3.amazonaws.com/0/37053/864e38c1-2829-d496-e4a7-fcddb84638bf.png)

文字列に下線を直接付与

![スクリーンショット 2015-06-25 19.06.13.png](https://qiita-image-store.s3.amazonaws.com/0/37053/dca2d794-bf42-376d-f795-0024f225314a.png)

終わり。


Storyboardから使えるとコード書かなくて済むので楽。


参考[adding underline to UILabel attributed string from the storyboard fails](http://stackoverflow.com/questions/25099736/adding-underline-to-uilabel-attributed-string-from-the-storyboard-fails)
Cloud9 on Docker - Part3: GoとMartiniをインストール

じぶんクラウドのDocker上に構築したCloud9にブラウザから接続してどこでもNode.jsの開発ができるようになりました。メニューのRun - Run with にはデフォルトでいろいろな言語のRunnerがあります。ここにGoもありました。最近使っていなかったので今回はGoの開発環境を追加しようと思います。


## プロジェクト

デフォルトのNode.jsに加えてGoをインストールします。リポジトリは[こちら](https://github.com/masato/docker-cloud9/tree/go)です。Cloud9へのGoのインストールについては[Writing a Go App](https://docs.c9.io/v1.0/docs/writing-a-go-app)に書いてあります。
 
### Dockerfile

Goをダウンロードしてインスト-ルします。Go環境変数は`/root/.profile`に追記します。

```~/node_apps/docker-cloud9/Dockerfile
FROM node:0.12
MAINTAINER Masato Shimizu <ma6ato@gmail.com>

RUN git clone https://github.com/c9/core.git /cloud9 && \
    cd /cloud9 && ./scripts/install-sdk.sh

RUN npm install hexo-cli -g
RUN wget -O - https://storage.googleapis.com/golang/go1.4.2.linux-amd64.tar.gz | tar -xzC /usr/local -f - &\
& \
    echo "export GOPATH=/workspace/gocode" >> /root/.profile && \
    echo "export PATH=$PATH:/usr/local/go/bin:/workspace/gocode/bin" >> /root/.profile

WORKDIR /workspace
```

### docker-compose.yml

docker-compose.ymlには今回使用するWebアプリの[Martini](https://github.com/go-martini/martini)で使用する3000ポートを公開します。

```~/node_apps/docker-cloud9/docker-compose.yml
cloud9:
  build: .
  restart: always
  ports:
    - 8080:80
    - 15454:15454
    - 3000:3000
    - 4000:4000
  volumes:
    - ./workspace:/workspace
    - ~/.gitconfig:/root/.gitconfig:ro
    - ~/.ssh/id_rsa:/root/.ssh/id_rsa:ro
    - /etc/localtime:/etc/localtime:ro
  command: node /cloud9/server.js --port 80 -w /workspace --auth user:password
```

Dockerイメージを再作成します。これまでNode.jsのアプリは`/workspace`で作業していました。このディレクトリはDockerホストにマップしているので起動しているコンテナやイメージを破棄しても消えません。

```bash
$ docker-compose build
$ docker-compose up -d
```

Cloud9のコンソールから環境変数が設定されているか確認します。

```bash
$ go env GOROOT
/usr/local/go
$ go env GOPATH
/workspace/gocode
$ which go
/usr/local/go/bin/go
```

## Martini

[Martini](https://github.com/codegangsta/martini)はGo用のSinatraライクなマイクロフレームワークです。Cloud9のコンソールから`go get`でインストールします。インストール先は`GOPATH`に設定した`/workspace/gocode/`になります。


```bash
$ go get github.com/go-martini/martini
```


### server.go

workspaceに適当なディレクトリを作成します。`/`のルートと簡単なHello Worldを書きます。

```/workspace/martini/server.go
package main

import "github.com/go-martini/martini"

func main() {
  m := martini.Classic()
  m.Get("/", func() string {
    return "Hello world!"
  })
  m.Run()
}
```

### 起動

server.goを選択した状態でCloud9のRunボタンを押して起動します。

![martini-run.png](https://qiita-image-store.s3.amazonaws.com/0/43745/ae5b5240-bd62-4245-cbc8-b16f847681f1.png)

またはCloud9のコンソールから直接`go run`を実行します。

```bash
$ cd /workspace/martini
$ go run server.go
````

コンソールからcurlでテストします。

```bash
$ curl localhost:3000
Hello world!root
```

### Previewが動かない

メニューからPreview -> Preview Runnning Applicationを選択できます。残念ながらホスト名がundefinedになってしまいました。まだ設定が足りないようです。

![cloud9-preview-undefined.png](https://qiita-image-store.s3.amazonaws.com/0/43745/51c34933-d605-5646-ff7d-51c08badb353.png)


直接Cloud9のホストに対してブラウザを開くとHello Worldが表示されました。とりあえずプレビューはできそうです。


![martini-hello.png](https://qiita-image-store.s3.amazonaws.com/0/43745/0c230807-0cd2-de01-d646-6dea6d012ed3.png)
根っからのWindowsユーザーがMacを買おうと思った話(検討編)

# 経緯
最近、Amazon Web Services絡みのハンズオンをしようと思ったり、技術資料を探していると、MacOS前提の資料が多かったりして、Windowsマシンでやろうとすると、前提条件に達するまでに色々面倒だったりして、Mac持つのもいいかなぁ・・・と思った次第。
MacはiMacが昔祖母の家にあった（今考えてもすごい話）ときに使ったぐらいで、Windowsは3.1以降ほぼ全バージョン使ったことがある人(Windows8は実家にあるのでちょっと触った)なので、今さら使いこなせるのか？という懸念もあります。
ただ、ベースはUnixということなので、一応UnixもLinuxも若干触ったことがあるので、どうにかなる点もあるかな？という感じもします。

# 今までできていたことがMacでできるか。
これはやっぱり重要。まあ、どちらかというとツール類ですね。

+ 開発環境<br>
重い重いと言いながら、長年Eclipseを使っているので、これは一応必須。<br>
無論、あるので問題なし。<br>
テキストエディタはSakuraエディタはさすがにないみたいなので、別のを探すしかないですね。
+ ブラウザ<br>
メインで使っているブラウザは、FirefoxとChormeなので、両方ともあるので問題なし。Chormeはメモリーをバカ喰いするっぽいですが。
+ オフィスソフト<br>
最近、Office Soloを激安で買った(怪しいものではなく、Amazonでクーポン利用で3000円ぐらい値引きされた)ので、これを使えばいいので問題なし。
+ Telnetクライアント<br>
WindowsではTeraTermを常用しているけど、標準搭載のターミナルでできてしまうので、それでできるようにする。

こんなものですね。意外とない。
AWS絡みだと、大半のものがブラウザで事足りてしまったりする。

#どのモデルを買うか。

まず、外で使うことが前提なので、
当然**ノート**です。
となると、
2015年6月現在選べる現行ラインナップは、以下。

+ MacBook 12inch
+ MacBook Air 11inch
+ MacBook Air 13inch
+ MacBook Pro 13inch
+ MacBook Pro Retinaディスプレイモデル 13inch
+ MacBook Pro Retinaディスプレイモデル 15inch

まず、ハイスペックだけど、画面大、重量2kg越えのMacBook Pro Retinaディスプレイモデル 15inchは選択肢から除外。
逆に外部端子が少なく、CPUが若干非力なMacBook 12inchも除外。
SSDがいいので、MacBook Pro 13inchも除外。
安いけど、画面が狭く、SDカードスロットなどがないAirの11inchも除外。

ということで、**Airの13inchモデル**か**Pro with Retinaの13inchモデル**
のいずれかになります。

#じゃあどっち？

正直、甲乙付け難いです。
軽さを取るか、
性能およびディスプレイの綺麗さ(今回初めて、MacのRetinaディスプレイをまじまじ見ましたが、綺麗ですね。)を取るか。
って感じです。
ただ、重量および薄さはあまり変わらないっちゃ変わらないので・・・。

これ買うと決めたものを買う気がします。

#どうやって買う？

別に現行モデルにこだわりがなく、安く買えればいいかな？って思っているので、

+ オンラインストアの認定・整備済製品
+ Sofmap、じゃんばらなどの中古ショップ
+ ヤフオク

で探しています。
図書館でMacFanを借りて（これも初めて）安く買える方法を調べてみたりした結果、
買うとしたら、
**2012年モデルから**
というのは決めています。
これ以前のモデルは安くても除外です。

# まとめ
量販店見たり、Apple Storeとか行ったりして、
買うモデルは決めましたが
とりあえず予算と出物待ちな感じになってきました。

次回があるとしたら、
**購入編**
になるかと思います。

7/24追記
意外と早く購入編になってしまいました。
[根っからのWindowsユーザーがMacを買おうと思った話(購入編)](http://qiita.com/keni_w/items/89c83b4647851c60af29)
table（表）について

#table要素
＜table＞　表の始まり
＜／table＞　表の終わり
＜tr＞〜＜／tr＞　表組の見出し
＜tr＞　行の始まり
＜／tr＞　表組の行の終わり
＜td＞〜＜／td＞　表組のセル

HPのサンプル作成の為に以下の様に表組しました。
↓一部

```lang:HTML
<div class="company-outline">
	<h3>会社概要</h3>
	<table border="0">
		<tbody>
			<tr>
				<th>会社名</th><td>ホームページサンプル株式会社（英語表記 Homepage sample Inc.）</td>
			</tr>
			<tr>
				<th>設立</th><td>平成10年1月10日</td>
			</tr>
			<tr>
				<th>事業内容</th><td>IT・マーケティング・福祉など</td>
			</tr>
			<tr>
				<th>住所</th><td>〒012-3456見本県見本市サンプル1-2</td>
			</tr>
			<tr>
				<th>電話番号</th><td>0123-4567-89012</td>
			</tr>
			<tr>
				<th>メールアドレス</th><td>inf@example.com</td>
			</tr>
		</tbody>
	</table>
</div>
```

```lang:CSS
.company-outline{
	border:solid 1px #ebebeb;
	width:666px;
	height:280px;
	margin:15px 0px 0px 5px;
}
.company-outline h3{
	width:657px;
	height:30px;
	margin:0px;
	padding:7px 0px 0px 10px;
	font-weight:normal;
	font-size:15px;
	background:#eeeeee;
}
.company-outline table{
	border:solid 1px #ebebeb;
	width:600px;
	height:200px;
	margin:20px auto 0px auto;
	font-size:12px;
}
.company-outline table th{
	border-right:solid 3px #d4d4d4;
	padding-right:5px;
	font-weight:normal;
	background:#f5f5f5;
	text-align:right;
}
.company-outline table td{
	padding-left:5px;
	background:#f9f9f9;
}