OmniAICreator/Qiita-1.07M huggingface dataset:
strict.pm が無い環境でも一応エラーにならない use strict の書き方

具体的に言うと、@nifty の「[@homepage](http://homepage.nifty.com/service/)」（[LaCoocan](http://homepage.nifty.com/)じゃねーぞ）の Perl は **strict.pm すら無くて**だなぁ、今まで @homepage 向けにいちいち

```pl
# use strict; use warnings
```

などとコメントアウトしていた。だが、最初から

```pl
BEGIN{
    eval{ require 'strict.pm';   }; strict  ->import() unless $@;
    eval{ require 'warnings.pm'; }; warnings->import() unless $@;
}
```

等と書いておくと

* strict.pm がある環境では、use strict; 相当の動作をさせる
* strict.pm がない環境では、スルー

させることが可能だと気付いた。

とは言え、きょうび、そんな環境ほとんどないし、唯一と言っても過言ではない @homepage も2010年1月31日で新規受付終了してるし、これも完全にロストテクノロジーだなぁ。
git merge でコンフリクトした箇所がインデント変更したりしててお手上げなとき

たとえば、topic ブランチで作業していて、 master にマージしようとしたときに、ブランチで変更した箇所を master でインデントを修正したりしてた場合、コンフリクトした行数が多くて目で見て手動マージが厳しい場合。

http://stackoverflow.com/a/15107363/338986

コンフリクトしている状態で、

    git diff :1:index.html :3:index.html

のような `git diff` を実行するとマージするブランチのコンフリクトを生じる原因となった変更の差分だけが表示されるのでそこだけ適切な場所に手動でマージすればOK.

具体例が無くてすみません。
Androidアプリがコンパイルできなくなった時の対処

SenchaアプリをAndroid用にビルドしようとしたら、エラーが発生してビルドに失敗してしまった。
iOS用のパッケージはビルドできるし、シミュレータも起動するのに何故？

ビルド時のメッセージをたどっていくと、こんな一文が

```
com.android.sdklib.build.ApkCreationException: Debug Certificate expired on 11/10/12 2:49
```

どうやら何かしらの証明書（デバッグ用の証明書？）の有効期限が切れたらしい。
そう言えば、随分前にAndroidアプリの勉強用に環境を作っていたっけ。

[このサイト](http://android.roof-balcony.com/debug/certificate-expired/)を参考にdebug.keystoreファイルを削除したら、めでたくビルドも成功。
有効期限は1年らしいので、忘れないようにしなくては。
Docker事始め その２。Dockerfileを作ってみる


## [前回](http://qiita.com/jacoyutorius/items/75a1a0995989969925e2)までのあらすじ

* boot2docker でDockerのVMを作る
* Dockerの基本操作を覚える
* docker commit して環境をインストールしたコンテナを作成した


## Dockerfile

さて。今回はDockerfileを書いてみます。
Chefのレシピのようにコンテナ起動時に実行されるスクリプトで、環境のインストールを自動化するためのファイルです。

役割としてはChefのレシピに近いのですが、記述方法が比較的シンプル（シェルのコマンドほぼそのまま）なので、
Chefよりもとっつきやすいと思います。


## Ruby2.0 + Rails4.1 

環境の作り方はここを参考にしてます。

[Dockerfile](https://github.com/inokappa/dockerfiles/blob/master/gistub/Dockerfile#L11)


## Dockerfile syntax highlighting

というプラグインがあったので使ってます。

![Dockerfile.png](https://qiita-image-store.s3.amazonaws.com/0/8607/fe2c81b4-0662-1b57-4ed2-258997e1cc17.png "Dockerfile.png")



## Dockerfile一発でRubyの開発環境を作る

Chefより簡単そう、とか言いながらエラー出まくり試行錯誤しまくり。
bashrcとかはちゃんと読んでくれないっぽいのですがやり方が悪いのか、、、


## Dockerfile

<script src="https://gist.github.com/jacoyutorius/29b5eb0f376d91d1ca14.js"></script>

```dockerfile
FROM centos
MAINTAINER Yuto Ogi <jacoyutorius@gmail.com>
 
 
RUN echo "install ruby environment"
RUN yum install -y git vim sudo tar wget
RUN yum install -y gcc make gcc-c++ zlib-devel httpd-devel openssl-devel curl-devel sqlite-devel
 
RUN cd /root/ && wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.1.tar.gz
RUN cd /root/ && tar zxvf ruby-2.1.1.tar.gz
RUN cd /root/ruby-2.1.1 && ./configure && make && make install
RUN gem install bundler --no-ri --no-rdoc -V
RUN gem install rb-readline --no-ri --no-rdoc -V
 
RUN echo "Install rails"
RUN gem install rails --no-ri --no-rdoc -V
RUN echo rails -v
 
RUN git clone https://github.com/jacoyutorius/todolist.git
WORKDIR /todolist
RUN bundle install
EXPOSE 3000
RUN rails s
```

Railsのアプリは数分で適当に作ったToDoアプリをcloneしてます。。。


## docker build

```bash
docker@boot2docker:~$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
yuto/centos         rails               2087cad9f6c1        5 days ago          1.483 GB

docker build -t yuto/centos  .

Uploading context 3.072 kB
Uploading context
Step 0 : FROM centos
 ---> bee3be095dae
Step 1 : MAINTAINER Yuto Ogi <jacoyutorius@gmail.com>
 ---> Using cache
 ---> a7b42e461fb7

~ 省略 ~

=> Booting WEBrick
=> Rails 4.0.2 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2014-05-07 12:43:32] INFO  WEBrick 1.3.1
[2014-05-07 12:43:32] INFO  ruby 2.1.1 (2014-02-24) [x86_64-linux]
[2014-05-07 12:43:32] INFO  WEBrick::HTTPServer#start: pid=1 port=3000
```




ということで、なんとかDockerfileでRailsのアプリを起動するとこまでやってみました。
次はいよいよ[AWS ElasticBeanstalk](http://aws.amazon.com/jp/elasticbeanstalk/?nc1=h_l2_dm)かなー。
標準出力に色を付けるGem

題名通り、標準出力をカラーリング等の修飾をしてくれる[Rainbow](https://github.com/sickill/rainbow)というGemを知りました。

```rb
message = Rainbow('赤れんじゃい').red 
          + '、' + Rainbow('緑れんじゃい').bg(:green)
          + '、そして' + Rainbow('ふとれんじゃい').underline.bright

p message
#=> "\e[31m赤れんじゃい\e[0m、\e[42m緑れんじゃい\e[0m、そして\e[4m\e[1mふとれんじゃい\e[0m"


puts message
#=> 赤れんじゃい、緑れんじゃい、そしてふとれんじゃい (それぞれ色が付いている)

```

という感じです。

ログファイルとかに色タグつきで文字を出力して

```kansi.rb
require 'file-tail'

File.open('hoge.log') do |log|
  log.extend(File::Tail)
  log.interval = 10
  log.backward(10)
  log.tail do |line|
    case line
    when /^\e\[31m/      # 赤
      # エラー通知
    when /^\e[33m/       # 黄
      # ワーニング通知
    when /^\e[44m\e[1m/  # 青背景太字
      # インフォメーション…今日も平和だ
    end
  end
end
```

などとtail-fチックに追いかけて、エラーやワーニングが起きたらメールで通知を飛ばすとかすると、ログファイルも色つきになって綺麗で見やすいかも知れませんね！
AngularDart 0.11.0の変更点

AngularDartのv0.11.0が本日リリースされたようです。
v0.10.0からわずか20日でリリース...爆速ですね

今回はそのバージョンアップによる変更点の中で、さくっと試した何点かを簡単に紹介したいと思います。

## type -> bind
これはAngularDartというよりは、依存しているパッケージのdiに依るものなのですが、v0.0.39以降、今までDIで使用していたtype()やvalue()、factory()がいずれもDeprecatedになっており、代わりにbind()を使うことになったようです。

AngularDartを0.11.0にする際は、diもv0.0.39以降に更新されているか確認する必要があります。
もしdiが更新されない場合は、明示的にdependenciesに定義するなりしてバージョンを上げましょう。

## Shadow DOM-less components
公式ブログのタイトルをそのまま引用しましたが、ようはComponentをShadow DOMとして入れ込むのではなく、親のDOMの一部として表示するためのオプションが追加されました。

以前はapplyAuthorStylesというオプションがあったのですが、Chromeのバージョンいくつからかそのオプションが無効になったので、それの代替手段に当たるものになります。
使い方は簡単で、Componentを定義する際に

```
@Component (
	useShadowDom: false
)
class Example {
}
```

と書くと、Shadow DOM-lessになります。
ちなみに、useShadowDomをfalseに指定している場合、このDOM中のみのCSSが定義できないため、アノテーションにcssUrlを指定しているとエラーになります。

## bind-* syntaxの追加
公式ブログによるとまだ試験段階だそうですが、一応bind-* syntaxが使えるようになっています。

これは、今まで要素の属性とコンポーネントのバインドを@NgAttrや@NgTwoWayで指定していましたが、これらがDeprecatedになったので、それの代替手段として用意されたものになります。
ただ、単純に@NgAttrを削除するとバインドされなくなってしまうので、結局はコンポーネント内でマッピングする必要があるみたいです。
これについては使い方が間違っているかもなので、もう少し調べてみる必要があるかも。

一応、現状分かっているバインドのやり方を記載しておきます。

コンポーネント側

```
@Component(
	selector: 'example-component',
	map: const{
		'list': '@list'
	}
)
class Example {

	List<String> list;
}
```

HTML側

```
<div>
	<example-component bind-list="cmp.list"></example-component>
</div>
```

ちなみに、この状態でbind-を削除すると、エラーになります。
redisの環境構築(mac marvericks)


##homebrewでインストールする。

自分はmacで起動時に自動起動させたいのでlaunchctlに設定する。

参考
http://qiita.com/checkpoint/items/58b9b0193c0c46400eeb

```
$ brew install redis
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/redis-2.8.8.mavericks.bottle.tar.gz
######################################################################## 100.0%
==> Pouring redis-2.8.8.mavericks.bottle.tar.gz
==> Caveats
To have launchd start redis at login:
    ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
Then to load redis now:
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
Or, if you don't want/need launchctl, you can just run:
    redis-server /usr/local/etc/redis.conf
==> Summary
?  /usr/local/Cellar/redis/2.8.8: 10 files, 1.3M

$ ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist

```

多分多くの人はここまでやればエラーなく起動できると思います。
しかし自分の場合はエラーが起きてしまいました。


##なんか上手く起動できなかったので原因を調べる。


```
$ redis-cli
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected> 

$  redis-server /usr/local/etc/redis.conf

*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 369
>>> 'vm-enabled no'
Bad directive or wrong number of arguments
```


`/usr/local/Cellar/redis/`を見るとだいぶ昔にインストールしてた2.4.6が入ってた。

設定ファイルを見てみるとタイムスタンプが2012年ぐらいの時間だった。
上のエラーを見ると2.4.6の時の設定ファイルがそのまま今新しくいれた2.8.8を起動する時に読み込まれている感じだろうと思った。

そのため一旦redisを全てremoveして、設定ファイル(`/usr/local/etc/redis.conf`, `/usr/local/etc/redis-sentinel.conf`)を削除した後もう一度redisをインストールしなおした。

```
$ brew remove redis
Uninstalling /usr/local/Cellar/redis/2.8.8...
$ brew remove redis
Uninstalling /usr/local/Cellar/redis/2.4.6...

$ rm /usr/local/etc/redis.conf /usr/local/etc/redis-sentinel.conf

$ brew install redis
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/redis-2.8.8.mavericks.bottle.tar.gz
Already downloaded: /Library/Caches/Homebrew/redis-2.8.8.mavericks.bottle.tar.gz
==> Pouring redis-2.8.8.mavericks.bottle.tar.gz
==> Caveats
To reload redis after an upgrade:
    launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
==> Summary
?  /usr/local/Cellar/redis/2.8.8: 10 files, 1.3M

$ launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist

```

ここまでやってコマンドライン上で挙動を確認したらうまく動作しました。

```
$ redis-cli
127.0.0.1:6379> set keyfuga fugafuga
OK
127.0.0.1:6379> get keyfuga
"fugafuga"
127.0.0.1:6379> keys *
1) "keyfuga"

```
"CSSのみ"でdiv要素に画像を設定する

`background-image`プロパティに以下のような感じで値を設定すればよい.

```css
.target{
    width:/*ImageWidth*/;
    height:/*ImageHeight*/;
    background-image: url(Octcat.png);
}
```

  
しかしこれで"CSSのみ"で画像を設定したと言えるだろうか?
画像ファイル(Octcat.png)を使ってしまっているため"CSSのみ"とは言えないだろう.
そこで解決策はこれである.

# 実用的な解決策
データURIスキームを使う方法.
画像をbase64エンコードした後`background-image`に設定する.

```css
.target{
    width:/*ImageWidth*/;
    height:/*ImageHeight*/;
    background-image:url(data:image/png;base64,iVBORw0KGg/*中略*/5CYII=);
}
```

# ネタ的な解決策
`box-shadow`を使う方法.
利点をあえて挙げるならdataURIバージョンよりcssファイルの容量が少ない.

```css
.target{
    width:/*ImageWidth*/;
    height:/*ImageHeight*/;
}

.target:after{
    content: "";
    display: block;
    width:1px;
    height:1px;
    background:rgba(255,255,255,0);
    -webkit-box-shadow:
    12px 12px 0 12px rgba(255,255,255,0),
    212px 13px 0 0 rgba(32,31,31,0.06),
    213px 13px 0 0 rgba(32,31,31,0.39),
    /*中略*/
    431px 651px 0 0 rgba(124,186,230,0.06),0 0;
}
```

`box-shadow`プロパティと`after`疑似要素を駆使することによって画像を作成している.

画像からこのスタイルシートに変換するプログラムは[ImageToCss](https://github.com/yaegaki/ImageToCss)を使用している.

# まとめ
どちらの方法も画像は読み込まずcssのみで画像を設定できている.
後述の方法はほとんどネタなのであまり使わない方がよい.
どちらを使う場合でも大きすぎる画像の場合はリサイズしたり圧縮したりすると良い.
db:seedでFacebookAppのTest Userを動的に作成し初期化する

#omniatuh-facebookを用いたRailsにおけるFacebook認証
RailsにおいてFacebook認証を用いる場合omniauth-facebookを使うのが一つの手だ。
大体の流れとしては

1. 認証urlをユーザに踏ませる
2. facebookで認証してもらう
3. 認証後自分のアプリの戻ってきてもらう
4. 戻ってきてもらったときomniauth.authにユーザ情報が入ってるのでよしなに

だが開発中にデータベースをリセットした場合毎回毎回この手順を踏んでユーザを作成するのは面倒だし、ユーザに依存したデータを作成するときはもっと面倒。

この面倒な部分をFacebookのTest Userを使ってdb:seedすることで省略したい、というのが今回の試み

#FacebookAppのTest User
FacebookAppには開発用にテストアカウントを作る仕組みがある。
これを用いると実ユーザを用いて開発するリスクを減らすことができる。

#seedでTest Userを動的に作成してDBを初期化する
Userをomniauthから作るとする

```seed.rb
test_users_client = Koala::Facebook::TestUsers.new(app_id: ENV['FACEBOOK_APP_ID'], secret: ENV['FACEBOOK_APP_SECRET'])
test_users_on_creation = test_users_client.create_network(10, true, 'email,user_birthday,user_friends,user_work_history,user_hometown,publish_stream')

graph = Koala::Facebook::API.new
test_users = graph.get_objects test_users_on_creation.map{|h| h['id']}
test_users_on_creation.each do |user_on_creation|

  id = user_on_creation['id']
  test_user = test_users[id]

  h = OmniAuth::AuthHash.new
  h.provider = 'facebook'
  h.uid = id
  h.info = OmniAuth::AuthHash.new(
              test_user.slice('name', 'gender', 'first_name', 'last_name')
              .merge(user_on_creation.slice('email'))
              .merge({'image' => "http://graph.facebook.com/#{id}/picture"})
            )
  h.extra = OmniAuth::AuthHash.new
  h.extra.raw_info = OmniAuth::AuthHash.new(test_user.merge({
    'birthday' => "#{('01'..'12').to_a.sample}/#{('01'..'28').to_a.sample}/#{(1950..2010).to_a.sample}"
  }))

  User.create_with_omniauth(h)
end

```

大まかな流れは、

1. koalaでTest Userを作る。この際Test Userを作るFacebookAppのidとsecretが必要
2. create_network時に生成したTest Userの情報が返ってくる。permission（第三引数）は適当に
3. ここでしか取れないtokenやemailなどが含まれているので保存する
4. 3に含まれている情報は少ないので、更に情報を取得する。方法は通常ユーザと同様。
5. 3,4からOmniauth::AuthHashを生成。
6. 5を使用してよしなに

5でOmniauth::AuthHashを生成するのは、omniauthのomniauth.authと同じものを作りたかったから。
omniauthを使ってる場合omniauth.authを使ったアプリの作りになってる。。はず

自分のアプリで足りない情報はomniauth生成時に作成してもいいしUser作成時に突っ込んでもいい。
ここではbirthdayとimageを作成している。
birtydayに関しては完全にランダム値なのでFacebook側との情報の齟齬が発生する。
32bitと64bit、共通で使えるNSLogとかのフォーマット指定子

2018/05/14 更新

残念ながら・・・%zdでも、Xcodeでwarningが出るようになってしまいました・・・
現状では、NSIntegerは、%ldを使用し、longでキャストするしか方法が思いつかないですが・・・

何か方法を見つけたら、追記します・・・
（そもそも、次期OSの発表時に全ての32bitデバイスをApple様のサポート対象から外すっていう、予告なのかな・・・

---

iOSの最新のデバイスは、64ビットになってきているが、
古いデバイスはまだ、32ビットだったりする。

32bitと64bitだと、
NSIntegerの型が変わり(32bitでint型、64bitでlong型)
NSNotFoundも値が変わって、いろいろとめんどくさい。
（キャストで切り捨ててもいいけどもったいない気もする

NSLogとかで一意に吐き出せないかな～と思ってたら、
以下のフォーマット指定子を使うことで煩わしさを回避出来るらしい。

* NSInteger  **"%zd"**
* NSUInteger **"%tu"**
* 16進数      **"%tx"**

```objc:sample
NSInteger i = 1;
NSLog("Integer : %zd", i);

NSUInteger ui = 2;
NSLog("Unsigned Integer : %tu", ui);

NSLog("Integer : %tx", i);
```

これで、intとlongをうまく使い分けてくれる・・・と思う。

こんな感じのワーニングに効果があるはず。
`Value Conversion Issue
Implicit conversion loses integer precision: 'NSUInteger' (aka 'unsigned long') to 'int'`

まったく知らんかった(自分だけ？)ので、備忘録に。

追記
新しいフォーマット指定子ではないよ
とご指摘をいただきましたので。
文言を修正(「新しい」を消しただけですが^^;
ご指摘、ありがとうございます。

参考：
http://stackoverflow.com/questions/4405006/nslog-specifier-for-nsinteger
TypeScript の開発環境 (無料版)

できれば、[こちら(有料版)](http://qiita.com/akmiyoshi/items/6b8cd9680d611cde6251)の開発環境をオススメしますが。
Visual Studio Express 2013 for Web で TypeScript の開発環境が無料で構築できます。(Web Essentials 2013 がインストールできないからちょっと不便なんだから…ぶつぶつ)
Visual Studio Express 2013 for Web は、[こちら](http://www.visualstudio.com/ja-jp/downloads/download-visual-studio-vs.aspx)からダウンロードできます。

#1. Windows OS のバージョンを確認します。
サポートされる OS を以下に挙げます(Windows Server 系を除きます)。

|OS          |サービスパック          | x86/x64               |
|:----------:|:----------------------|:----------------------|
|Windows 7   |Service Pack 1 (SP1) 　|x86 および x64          |
|Windows 8   |                       |x86 および x64          |
|Windows 8.1 |                       |x86 および x64          |

#2. Windows 7 Service Pack 1 をインストールします。
Windows 7 で Service Pack 1 が入ってない場合は Service Pack 1 をインストールします。
Windows 8 および Windows 8.1 の場合は 4. に進みます。
   【Windows 7 Service Pack 1 (SP1) をインストールする方法】
    　⇒ http://windows.microsoft.com/ja-jp/windows7/learn-how-to-install-windows-7-service-pack-1-sp1

#3. Internet Explorer 11 をインストールします(Windows 7 のみ)。
Windows 7 で [Internet Explorer のバージョンが 10 より下の場合](http://www.microsoft.com/ja-jp/security/pc-security/ver_ie.aspx)は Internet Explorer 11 をインストールします。
   【Internet Explorer 11 のダウンロード】
    　⇒ http://windows.microsoft.com/ja-jp/internet-explorer/ie-11-worldwide-languages

#4. Visual Studio Express 2013 for Web をインストールします。
   【Visual Studio Express 2013 for Web ダウンロードサイト】
    　⇒ http://www.visualstudio.com/ja-jp/downloads/download-visual-studio-vs.aspx

#5. 「Visual Studio 2013 Update 2 RC」をダウンロードしてインストールします。
   【ダウンロードサイト】
    　⇒ http://www.microsoft.com/ja-jp/download/details.aspx?id=42307

以上で開発環境が完成しました。
使い方はまた今度～。

# 参考

* [CoffeeScript と TypeScript の開発環境](http://qiita.com/akmiyoshi/items/6b8cd9680d611cde6251) (有料だけどオススメ。90日間無料で評価版として使用可能です)

# スクリーンショット

![2014-0507-1948.png](https://qiita-image-store.s3.amazonaws.com/0/32879/0a8f0d93-8a03-f8f1-2e11-09a686e04fd4.png)

![2014-0507-1951.png](https://qiita-image-store.s3.amazonaws.com/0/32879/b277de70-bdbc-2acc-4bf4-35a6a6e09d39.png)

![2014-0507-1955.png](https://qiita-image-store.s3.amazonaws.com/0/32879/47b89a8c-23dc-72ea-8d99-68918e2f7b99.png)


![2014-0507-2009.png](https://qiita-image-store.s3.amazonaws.com/0/32879/6e08ee83-9eb2-cdea-adbe-ceab9af4ba6d.png)
WebAPI でファイルダウンロード

いつも探すのでメモ。
もっとスマートなやり方がある気がしてならない。

```csharp
return ResponseMessage(new HttpResponseMessage
{
    Content = new StreamContent(File.Open(filePath, FileMode.Open, FileAccess.Read))
    {
        Headers =
        {
            ContentType = new MediaTypeHeaderValue("application/octet-stream"),
            ContentDisposition = new ContentDispositionHeaderValue("attatchment")
            {
                FileName = fileName
            }
        },
    }
});
```

条件によって他の `IHttpActionResult` を返したくなった場合に生の `HttpResponseMessage` を返していると困るので、`ReponseMessage` メソッドで包んで返す。
Windows7 Home Premium でログオン画面に特定のユーザを表示しない

Windows 7 でログオン画面に特定ユーザを表示しないようにしようとしたら、mmcの内容が無かった。よくみたら、Windows7 Home Premiumだった。

ということで調べたら、以下の方法でいい感じ。

```
> net user xxx /active:no
```

最初、mmc開いたらなにも無くて焦った。。。。
agでvimの検索関連を高速化

agがとにかく高速で検索できるそうなので今更試してみた。
そしたらすごく速くなった！

# ag のインストール

公式の手順が確実です。
https://github.com/ggreer/the_silver_searcher

## Mac

```zsh
$ brew install ag
```

## CentOs

```zsh
$ rpm -ivh http://swiftsignal.com/packages/centos/6/x86_64/the-silver-searcher-0.14-1.el6.x86_64.rpm
# or 
$ rpm -ivh http://swiftsignal.com/packages/centos/6/i386/the-silver-searcher-0.14-1.el6.i686.rpm

```

## Windows

手順通りソースからビルドするか、以下からバイナリを利用させていただく。

The Silver Searcher windows port
http://blog.kowalczyk.info/software/the-silver-searcher-for-windows.html


# コマンドから利用

```zsh
$ ag hoge
```

## オプション(一部)

オプション | 意味
:-------:|----------
-a | 無視リストも対象
-u | 隠しファイルおよび無視リストも対象
-g | ファイル名で検索
-G | 検索対象の指定 [ag -G *.css]
-l | 一致したファイル名のみ
-L | 一致していないファイル名のみ
-v | 不一致検索
-Q | 正規表現を無視
-z | 圧縮ファイルも対象

## 無視ファイルリスト
`.agignore`で指定可能

[ag の検索で除外設定を使う - Qiita](http://qiita.com/yuyuchu3333/items/4c57186e37db9eb3db15)

# vimで利用

## ag.vim 

```.vimrc
NeoBundle 'rking/ag.vim'
```
### コマンド

|コマンド|結果
------|--------------
|:Ag | カレントディレクトリを再帰的に検索して quickfix へ|
|:AgAdd | `:Ag`同様だが結果を追加
|:AgFromSearch | 前回の検索パターンを使用(`/`による検索など)
|:LAg | `:Ag`同様だが、結果を location-list へ
|:LAgAdd | `:AgAdd`同様だが、結果を location-list へ
|:AgFile | ファイル名の検索
|:AgHelp | vimのドキュメントが検索対象

### quickfixでの操作

|コマンド|内容
:-----:|--------------
e |                  開くと同時に終了
o |                  開く
go|                  プレビュー
t |                  タブで開く
T |                  タブで開く(silently)
h |                  水平分割で開く
H |                  水平分割で開く(silently)
v |                  垂直分割で開く
gv|                  垂直分割で開く(silently)
q |                  終了


### 結果

速い！


## Unite.vim と組み合わせる

`Unite.vim`はインストール済みとして。

```.vimrc
" カーソル位置の単語をgrep検索
nnoremap <silent> ,cg :<C-u>Unite grep:. -buffer-name=search-buffer<CR><C-R><C-W>

" unite grep に ag(The Silver Searcher) を使う
if executable('ag')
  let g:unite_source_grep_command = 'ag'
  let g:unite_source_grep_default_opts = '--nogroup --nocolor --column'
  let g:unite_source_grep_recursive_opt = ''
endif
```

参考：[agとUnite.vimで快適高速grep環境を手に入れる - Thinking-megane ](http://blog.monochromegane.com/blog/2013/09/18/ag-and-unite/)

### 結果

速い！


## ctrlp.vim と組み合わせる

`ctrlp.vim`はインストール済みとして。

```.vimrc
let g:ctrlp_user_command = 'ag %s -l'
```

### 結果

速い！
Gradle でビルド中、ProGuard がヒープ不足で落ちるときの対処法

## 現象

それなりに大きなモジュールだったり、モジュールが参照するモジュールがたくさんあったりすると、ProGuard が頑張らないといけないことが多くなるので、その分 Java のヒープを食います。

そうすると、いつかヒープが足らなくなり、以下のようにエラーを吐いてビルドがコケるようになります。

```

:MyApplication:proguardProductionRelease
Note: there were 979 duplicate class definitions.
:MyApplication:proguardProductionRelease FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':NohanaPhotoBook:proguardProductionRelease'.
> Java heap space

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED
```

## 回避策

ヒープを大きくしましょう。

```
export GRADLE_OPTS=-Xmx2048m
```
複数キーを持つハッシュデータ

http://www.atmarkit.co.jp/fjava/javatips/081java010.html

作り方自体はもうこれ書いてあるままじゃねえか！という話でしか無いんですけど

```java:hashdata.java
Map<String, Map<String,Integer>> map = new HashMap<String, Map<String,Integer>>();
map.put("京都", new HashMap<String,Integer>());
map.get("京都").put("舞鶴", 10000);
map.put("東京", new HashMap<String,Integer>());
map.get("東京").put("渋谷", 1000);
map.get("東京").put("秋葉原", 2000);
```

これでHashMapを値に持つHashMap（分かりづらい）が出来る。
複数キーを使うときはgetを2個重ねればOK。

ここから本題。

>1つ目のキー（サンプルでは都道府県）が同一なデータをすべて取り出す、といった操作が容易に行えるという特徴があります。

```java
String[] tokyo = map.get("東京").keySet().toArray(new String[map.get("東京").size()]);
```

これで東京を1つ目のキーに持つデータを配列として扱うことが出来る。


---

とまあ書いたわけなんですが、脳みそが筋肉でできているぼくは「よーし、東京のデータを取り出しちゃうぞ」って思った時に

```java
System.out.println(map.get("東京"));
```

とかやってみたんですけど `{秋葉原=2000, 渋谷=1000}`
 って当然ながらHashMapで返ってくるんですよ。
順番バラバラになってて嫌だったからLinkedHashMapとかに変更してみたりしても現実逃避に過ぎなかったんですよね。
ちょっと脳筋すぎたから「戻り値Stringのやつを選べばいいんじゃね」とか思ったりしながらムキムキしてたけど明後日すぎたわけで。

で、落ち着いてさっきの出力結果を見なおしたら東京を1つ目のキーに持つHashMapにおけるKeyと値の組み合わせ（くどい）なんですよね。
あれ？　こいつのKey一覧取得すればいいだけじゃね？　とようやく気付いてkeySetを試したら出るわ出るわ。
んで、Set型で帰ってくるから、最終的にtoArrayを使ってString型の配列にぶち込んで終了。
Nokogiriでiso-8859-1で文字化けする場合の問題の解消方法


下記のスニペットで今のところうまくいっている。何か問題があったら更新する。

```ruby
def url2text(url)
  html = open(url).read
  doc = Nokogiri::HTML(html.toutf8, nil, 'utf-8')
  doc.text
end
```
[Rails 4.x] Staging環境作成

本番環境の設定ができている前提です。
またPassengerを使っています。

# 環境設定ファイルの作成

```rb
$ cp config/environments/production.rb config/environements/staging.rb
```

deviseの:confirmableを設定している場合↓

```rb
$ vim config/environments/staging.rb
——
config.action_mailer.default_url_options = { :host => 'http://hoge.com' }
——
```

# データベースの設定

```rb
$ vim config/database.yml
——
staging:
  <<: *default
  database: hoge_development
  #database: hoge_staging
  #database: hoge_production
——
```

# apacheの設定

stagingサーバーに入ります

```rb
$ ssh STAGING_SERVER
>>> @ staging server
$ sudo vim /etc/httpd/conf/httpd.conf
—
RailsEnv staging
—
```

# データベースのマイグレーション

```rb
$ rake db:migrate RAILS_ENV=staging
```
Modern Objective-Cのenumの書き方


Objective-Cのお勉強。enumの作り方をよく忘れるのでメモ。
モダンなObjective-Cプログラミングでは列挙型の生成にNS_ENUMマクロを使う。

次の例はkPhotoSizeという列挙型を作成します。

```objectivec
typedef NS_ENUM (NSUInteger, kPhotoSize) {
    kPhotoSizeSmall,
    kPhotoSizeMedium,
    kPhotoSizeLarge,
    kPhotoSizeOriginal
};
```

列挙型は戻り値に設定できる。

```objectivec:SomeClass.h
@interface SomeClass : NSObject

- (kPhotoSize)currentPhotoSize;

@end
```


----

参考。

* [Adopting Modern Objective-C](https://developer.apple.com/library/ios/releasenotes/ObjectiveC/ModernizationObjC/AdoptingModernObjective-C/AdoptingModernObjective-C.html)
【メモ】Selenium で新しく開いたウインドウにスイッチする

Selenium で新しく開いたウインドウにスイッチする方法。

```scala:Scala
    val currentWindowHandle = driver.getWindowHandle()
    val windowHandles = driver.getWindowHandles()
    windowHandles.remove(currentWindowHandle)
    driver.switchTo().window(windowHandles.iterator().next())
```

ようするに、現在の Window Handle と、ドライバーが制御している全ての Window Handle を取得する。
現在の Window Handle と違うものが新しいウインドウだという理屈。
cssでwindows8のタッチ操作を無効化する

ピンチイン・ピンチアウト、ダブルタップによるIEの拡大処理を無効化する。

[タッチ操作向けサイト構築のガイドライン - IEBlog 日本語 - Site Home - MSDN Blogs](http://blogs.msdn.com/b/ie_ja/archive/2012/04/28/guidelines-for-building-touch-friendly-sites.aspx)

```css:
* {
 -ms-touch-action: none;
}
```

これをhtmlソースに入れるか、
これを書いたCSSをIEで指定(インターネットオプション > ユーザ補助)してもよい。
vagrant-proxy + docker provisioner (失敗録)

vagrant の provision で docker をインストールしようとしたら、proxy の内側からだとうまくいかない。

vagrant-proxy plugin を使って、proxy の設定をしたら、docker のインストールは通過。その後 docker pull で停止する。

vagrant-proxy plugin の action を増やして `action/configure_docker_proxy.rb` を追加してはみたものの、proxy-config が動作する段階ではまだ docker が入っておらず、`/etc/default/docker` ファイルが居ない。

結局 provisioning の途中で、docker をインストールした後なり docke pull をする前なりで `/etc/default/docker` (debian系) に `export http_proxy=…` を追加してやる必要がある。

とりあえず2つめのコンソールから `vagrant ssh` でログイン、proxy の設定を手動で追加して、`service docker restart` した上で、ssh を抜けて `vagrant provision` する…
PsList.exeでリモートプロセスのリソースをチェックする

PsList.exeでリモートプロセスのリソース情報を3秒ごとにチェックするには次の方法で可能。

1.ターゲットマシンのRemote Registry サービスを開始する
2.コマンドラインで次のように入力
　pslist -s -r 3 \\192.xxx.yyy.zzz appName(exeなし)

※パフォーマンスモニターを使った方がわかりやすいけれど。
　http://technet.microsoft.com/ja-jp/library/cc749115.aspx
ReadOnlyCollection を List にする

Vista, 7, 8 にデフォルトで対応できるようにするには、今のところ .NET Framework は 3.0 がいいかなと思っています(XPでも3.0のインストールは可)。
http://www.atmarkit.co.jp/ait/articles/1210/26/news086.html

しかし、3.0 では `ReadOnlyCollection` に `toList()` メソッドが無いのです。

調べてみると、簡単に `ReadOnlyCollection` を List にできます。

```vbnet
Dim currentDir As String = My.Computer.FileSystem.CurrentDirectory
Dim filesReadOnly = My.Computer.FileSystem.GetFiles(currentDir)
Dim fileList = New List(Of String)(filesReadOnly)
```

ちなみに配列も同様にできます。

```vbnet
Dim args() As String = System.Environment.GetCommandLineArgs()
Dim argList = New List(Of String)(args)
```

参考：
http://mrandypuppy.wordpress.com/2006/09/01/converting-from-readonlycollection-to-list/
Rails でサクッと Redis を Master/Slave 構成にする

このようなgemもありますが
https://github.com/oggy/redis_master_slave

``config/initializers`` に数行加えるだけで振り分けが可能です。
コネクションプール等を使ってると不具合があるかもしれません。

```rb:config/initializers/redis.rb
class Redis
  class Client
    def call(command, &block)
      master_host = MASTER_HOST_URI
      slave_host  = SLAVE_HOST_URI

      # Slave に向けたいお好きなコマンドを登録
      slave_commands = [:get, :hget, :hgetall] 

      disconnect
      @options[:host] = if slave_commands.include?(command[0])
        slave_host 
      else
        master_host
      end
      connect

      reply = process([command]) { read }
      raise reply if reply.is_a?(CommandError)

      if block
        block.call(reply)
      else
        reply
      end
    end
  end
end
```
C++でコンパイル時eval(誇張あり)

# コンパイル時eval作ってみた

作ってみたネタです、という訳でまずはリポジトリ
https://github.com/minamiyama1994/Compile-Time-Eval
使い方はこんな感じです

```cpp
#include<typeinfo>
#include"CTE/CTE.hpp"
auto main ( ) -> int
{
    auto eval1 = CTE_EVAL ( "1+20*10/(5+5)" ) ;
    auto eval2 = CTE_EVAL ( "1+20*10/(5+5)+.5" ) ;
    auto eval3 = CTE_EVAL ( u8R"*****("Hello"+" "+"World")*****" ) ;
    std::cout << eval1 << std::endl ;
    std::cout << typeid ( eval1 ).name ( ) << std::endl ;
    std::cout << eval2 << std::endl ;
    std::cout << typeid ( eval2 ).name ( ) << std::endl ;
    std::cout << eval3 << std::endl ;
    std::cout << typeid ( eval3 ).name ( ) << std::endl ;
}
```

手元のGCC4.8.1だとこのような出力となりました

```text
$ ./prog
21
i
21.5
d
Hello World
Ss
```

さすがにコンパイル時リフレクションなどの機能がないと変数を取り込んだりは難しいため、定数のみで構成された式を対象としています
原理としては簡単で、[以前紹介した型安全printf](http://qiita.com/minamiyama1994/items/95ef490043c495be8c44)と同じで、[中３女子氏](https://twitter.com/bolero_MURAKAMI)の[Sprout](https://github.com/bolero-MURAKAMI/Sprout)と僕の作った[FTMP](https://github.com/minamiyama1994/FTMP)を併用し、コンパイル時文字列を型に落としこんで後はTMPでゴリゴリ色々やっているだけです、細かいことが気になる人はコードを見てください(無責任)
HaskellやNemerle、Lispなどだと簡単なevalですが、C++でも一応似たようなことは出来るんだよ、っていう、まあそれだけの話でした。
なお、厳密には結果がconstexprではないので、コンパイル時というのは多少誇張が入っているのですが、まあ、ご容赦ください

なお、C++14です、C++11縛りは(以下略)
rails runnerで起動するスクリプトにオプションを渡す

基本的にはそのまま末尾に列挙する、で問題ありません。

```rb
require 'optparse'

options = {}

OptionParser.new { |o|
  o.banner = "Usage: #{$0} [options]"
  o.on("--opt1=OPT", "option1") { |v| options[:opt1] = v }
  o.on("--opt2=OPT", "option2") { |v| options[:opt2] = v }
}.parse!(ARGV.dup)

p options
```

```
$ bundle exec rails runner script/do_something.rb --opt1=foo --opt2=bar
{:opt1=>"foo", :opt2=>"bar"}
```

が、`--help`は rails runnerのオプションとして定義されているので、そのまま渡してしまうと先に喰われて起動し、scriptに渡されない問題があります。

```
$ bundle exec rails runner script/do_something.rb --help
Usage: runner [options] ('Some.ruby(code)' or a filename)

    -e, --environment=name           Specifies the environment for the runner to operate under (test/development/production).
                                     Default: development

    -h, --help                       Show this help message.

You can also use runner as a shebang line for your scripts like this:
-------------------------------------------------------------
#!/usr/bin/env /Users/yoshida/proj/miil/foodflowrb/script/rails runner

Product.all.each { |p| p.price *= 2 ; p.save! }
-------------------------------------------------------------
```

そのため、`--`で標準入力を実際実行したいスクリプトに渡すようにします。普段から使うようにしておくと、変なハマり方もしなくて済みそうです。
ただ、`ARGV`に`--`が含まれるので取り除く必要があります。

```rb
require 'optparse'

options = {}
argv = ARGV.dup
if argv.include? "--"
  argv.delete "--"
end

OptionParser.new { |o|
  o.banner = "Usage: #{$0} [options]"
  o.on("--opt1=OPT", "option1") { |v| options[:opt1] = v }
  o.on("--opt2=OPT", "option2") { |v| options[:opt2] = v }
}.parse!(argv)

p options
```

```
$ bundle exec rails runner script/do_something.rb -- --help
Usage: script/do_something.rb [options]
        --opt1=OPT                   option1
        --opt2=OPT                   option2
```
ipythonをMavericksに入れてみた


ipythonはpythonのオリジナルのpythonインタプリタよりもハイライトや履歴管理など便利な機能を兼ね備えたツールである。今回はこれをMac OS X 10.9 (Mavericks)に入れてみる。

いろいろと入れ方はあるようだが、pipで入れるのが一番楽そうだ。

# インストール

```
$ pip install ipython
```

# 動作確認

コマンドラインから実行して、以下のようなプロンプトがでてきたら、成功

```
$ ipython
Python 2.7.3 (default, Nov  1 2013, 14:34:21) 
Type "copyright", "credits" or "license" for more information.

IPython 2.0.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: 
```

# ipython notebookのインストール

ipythonだけなら、このまま使えるが、ipython notebookを使いたい場合はいくつか追加でパッケージのインストールが必要となる。ipython notebookはブラウザ上からコードの編集・実行・表示ができるツールで直感的にpythonのコード実行を確認できる。

```
$ pip install pyzmq
$ pip install tornado
$ pip install jinja2
```

※なお、ビルドに必要なXcode command line toolsは既にインストール済みであることとする。

上記のパッケージを入れた上で、以下の実行することでnotebookを起動できる。

```
$ ipython notebook
```

# 外部からアクセス可能にする。

このままだと、自分で検証する専用になるが、外部で公開したい場合は、ホームディレクトリ中にある.ipythonの設定をいじることになる。

まず、

```
$ ipython profile create nbserver
```

と実行して、.ipythonの下に、profile_nbserverというディレクトリを作成する。

後は、その中のipython_notebook_config.pyを編集する。編集すべき項目は以下の通り。

```
# Kernel config
c.IPKernelApp.pylab = 'inline'  # if you want plotting support always
# Notebook config
c.NotebookApp.certfile = u'/absolute/path/to/your/certificate/mycert.pem'
c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.password = u'sha1:bcd259ccf...your hashed password here'
# It's a good idea to put it on a known, fixed port
c.NotebookApp.port = 9999
```

NotebookApp.passwordの部分は、ipythonで生成すると良い。

```
$ ipython
…
In [1]: from IPython.lib import password
        password()
```

実行すると、パスワードを入力するように求められ、最終的に”sha1:…”が出力される。それを上記のc.Notebook.passwordに入力として与えると良い。セキュリティとしては、弱いがcertfileをコメントアウトすると、文字列認証でロックされたprofile設定が出来上がる。

後は、ipython実行時にprofileを指定すれば良い。

```
$ ipython notebook —profile=nbserver
```
[Light Table]フォント設定

Windows上で標準のフォントだと、=の下の線が消えてしまう。
で、直し方をいつも探してしまうので、いっそのこと晒します。

```
;; User behaviors
;; -----------------------------
;; Behaviors are stored as a set of diffs that are merged together
;; to create the final set of functionality that makes up Light Table. You can
;; modify these diffs to either add or subtract functionality.
;;
;; Behaviors are added to tags, objects with those tags then automatically gain
;; whatever logic the behavior imparts. To see a list of user-level behaviors,
;; start typing a word related to the functionality you want in between the square
;; brackets (e.g. "theme").

{:+ {
     ;; The app tag is kind of like global scope. You assign behaviors that affect
     ;; all of Light Table here
     :app [(:lt.objs.style/set-skin "dark")]

     ;; The editor tag is applied to all editors
     :editor [:lt.objs.editor/no-wrap
              (:lt.objs.style/set-theme "default")
              (:lt.objs.style/font-settings "Consolas" "12" "1")]

     ;; Here we can add behaviors to just clojure editors
     :editor.clojure [(:lt.plugins.clojure/print-length 1000)]}

 ;; You can use the subtract key to remove behavior that may get added by
 ;; another diff
 :- {:app []}}

```
Android な Gradle のプロジェクトで Proguard のアノテーションを使う

標準で最初から使えるようにして欲しい…

## モジュール配下に`libs`ディレクトリを作る

Maven にないので、アノテーションの jar を`libs`ディレクトリに突っ込みます。
そのための`libs`ディレクトリを作っておきましょう(最新の AndroidStudio なら新しいプロジェクト作ると勝手に作ってくれるはず)。

あわせて、Eclipse の時みたいに`libs`へいい感じにパスを通してくれないので、ビルドスクリプトを修正します(最新の AndroidStudio なら新しいプロジェクト作ると勝手に書いておいてくれるはず)。

```groovy
dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
}
```

## `libs`ディレクトリに、アノテーションを含む`annotations.jar`を入れる

アノテーションが含まれている `jar` は ProGuard のなかにおいてあります。

`${ANDROID_SDK_ROOT}/tools/proguard/examples/annotations`

`libs`へコピペしてください。

もう一つ、`jar` と一緒に `annotations.pro` というファイルも有りますので、合わせて一緒に入れておきます。

## `proguard-rules.txt`を修正する

`annotations.jar`を入れても、そのままではアノテーションもろとも ProGuard によって闇の彼方へ葬られてしまうので、ProGuard 関連のアノテーションが付いているものは適宜アノテーションに合わせたキープの仕方を宣言する必要があります。

そのあたりはすべて、`annotations.pro`に記述されているので、`proguard-rules.txt`には、その`annotation.pro`も読み込んでね、ということを伝えます。

```text

-dontshrink
-include libs/annotations.pro
```

このあたりの話題は、[こちらの記事](http://visible-true.blogspot.jp/2011/12/proguardcfg.html)と同様ですね。

## アノテーションを付ける

アノテーションは以下のものが有ります

```java
@Keep
@KeepApplication
@KeepClassMemberNames
@KeepClassMembers
@KeepGettersSetters
@KeepName
@KeepPublicClassMemberNames
@KeepPublicClassMembers
@KeepPublicGettersSetters
@KeepPublicImplementations
@KeepPublicProtectedClassMemberNames
@KeepPublicProtectedClassMembers
```

クラスの宣言か、あるいはメンバの宣言に付けて使います。

たとえば、Gson によってシリアライズやデシリアライズを行うクラスの場合、以下のようにします。

```java

@KeepClassMembers
public class MyBean implements Parcelable {
    // ...{snip}...
}
```
Subuser で linux プログラムを制約をかけて動かす


漢なら linux プログラムを restricted manner で動かしたいですよね!

subuser を使って実現しましょう.

https://github.com/subuser-security/subuser


## インストール

Docker がすでにインストールされているとします.

```
$ git clone https://github.com/subuser-security/subuser
```

subuser/bin を PATH に登録します.

一旦ログアウトするかシェルをリフレッシュして PATH を反映させます.

## 使う

docker グループが無ければ作ります.

```
$ sudo groupadd docker
```

docker グループに自分のアカウントを追加しておきます.


vim をインストールしてみます.

```
$ subuser install vim
```

動かしてみます.

```
$ SUBUSER_DIR/bin/vim muda.txt
```

Cool!

コマンド名が同じなので判りづらいですが, vim が透過的に docker コンテナで動いているようですね. 素晴らしい.
atom で画面はみ出た時にマルチバイトの改行がうまくいかない時

your stylesheet に

```css
.editor {
  word-wrap: break-word;
}
```

って書けばおｋ

your stylesheet はここから
![Settings](https://qiita-image-store.s3.amazonaws.com/0/8060/f93d0fae-4fdc-124a-2829-c5049b447075.png)

CSS 便利
lftpでファイル転送


sftpだとTAB補完が効かないので不便だった
でもsshでファイル転送したかった

## 使い方

``` sh
brew install lftp
# sftp hoge@example.com
lftp sftp://hoge@example.com
```
これだけで補完の効くsftpになる
sftpだと`lls`だったのが`!ls`になったり、少しだけ違う
`get`だとワイルドカードが展開できないので`mget`を使う
`mget`で上書きを許可するには`set xfer:clobber on`と入力すればOK


`Ctrl-r`でインクリメンタルサーチ出来たり`help`見れたり便利
AtomではなぜNode Webkitを採用しなかったのか

[Atom Is Now Open Source | Atom Blog](http://blog.atom.io/2014/05/06/atom-is-now-open-source.html)によると，Atom開発のためにNode-Webkitを試してみたが利用はせず，別途フレームワーク([Atom Shell](https://github.com/atom/atom-shell))を作成したとのこと．

> We experimented briefly with Node-Webkit, but decided instead to hire @zcbenz to build the exact framework we were imagining.

Node-Webkitを採用しなかった理由を開発者に質問したところ以下の回答が得られた．

- 技術選定のタイミングではNode-Webkitは安定していなかった&分離されたコンテキスト(nodeのコンテキストとwebのコンテキスト)があった
- 他のプロジェクトに依存しない，完全に自由な状態でzcbenz(Atom Shellの中心開発者)にAtomへの要求を満たしてほしかった
- Chromiumからフォークしたビルドプロセス(をnode-webkitは使っている?)は負担になるかもしれないことを気にした(別にプロジェクトを攻撃する意図はないよ)

なおAtom ShellとNode Webkitの違いは https://github.com/atom/atom-shell/blob/master/docs/development/atom-shell-vs-node-webkit.md に詳しい


<blockquote class="twitter-tweet" lang="en"><p><a href="https://twitter.com/yaotti">@yaotti</a> Hi, thanks for your message. At the time we tried it, it wasn&#39;t stable and had separate contexts.</p>&mdash; Nathan Sobo (@nathansobo) <a href="https://twitter.com/nathansobo/statuses/463876660299718656">May 7, 2014</a></blockquote>

<blockquote class="twitter-tweet" data-conversation="none" lang="en"><p><a href="https://twitter.com/yaotti">@yaotti</a> We wanted zcbenz to have complete freedom to meet the needs of Atom without having to worry about other projects.</p>&mdash; Nathan Sobo (@nathansobo) <a href="https://twitter.com/nathansobo/statuses/463876822162087936">May 7, 2014</a></blockquote>

<blockquote class="twitter-tweet" data-conversation="none" lang="en"><p><a href="https://twitter.com/yaotti">@yaotti</a> We were also worried about the build process forking Chromium being a potential liability. No offense to the project intended.</p>&mdash; Nathan Sobo (@nathansobo) <a href="https://twitter.com/nathansobo/statuses/463877199343267840">May 7, 2014</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
elasticsearchが動かなかった時の調査メモ

fluentd+elasticsearch+kibanaを構築したが、kibana上にelasticsearchが空っぽだよてきなバナーが表示されていたので、elasticsearchが上手く動いていなかった気がした。基本的な使い方から調査する

動いているか確認

```
$ curl localhost:9200
{
  "status" : 200,
  "name" : "Wilson Fisk",
  "version" : {
    "number" : "1.1.1",
    "build_hash" : "f1585f096d3f3985e73456debdc1a0745f512bbc",
    "build_timestamp" : "2014-04-16T14:27:12Z",
    "build_snapshot" : false,
    "lucene_version" : "4.7"
  },
  "tagline" : "You Know, for Search"
}
```

中身が入っているか確認したい。イメージ的にはmongoでいうとdb.User.find()みたいな感じ。というかshow tablesみたいなのってどうやるんだろう。

[Elasticsearch API 一覧](https://medium.com/hello-elasticsearch/83760ce1424b)
これがかなりわかりやすかった。特にcat apiを使えば、状態の確認とかができそう。

nodeの確認

```
$ curl -X GET http://localhost:9200/_cat/nodes
<hostname> 100.67.120.153 4 17 0.00 d * Wilson Fisk
```

shardの配置ノード情報の取得

```
$ curl -X GET http://localhost:9200/_cat/shards
apache_access-201405 0 p STARTED 271 115.4kb 100.67.120.153 Wilson Fisk
kibana-int           0 p STARTED   1  12.1kb 100.67.120.153 Wilson Fisk
```

これっぽい。このapache_access-201405ってやつがindexぽいので、これを使って中身になにが入っているかを確認。

```
$ curl -X GET http://localhost:9200/_cat/count/apache_access-201405
1399435877 13:11:17 271
```

なんかはいっているっぽい？
そもそも、kibanaのエラーでググると
[elasticsearch - LogStash: kibana Alert - No results There were no results because no indices were found that match your selected time span - Stack Overflow](http://stackoverflow.com/questions/20681396/logstash-kibana-alert-no-results-there-were-no-results-because-no-indices-wer)
これが出てくる。

`bin/elasticsearch -f`

これやってみたら

```
$ ./elasticsearch -f
which: no java in (/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin)
Could not find any executable java binary. Please install java in your PATH or set JAVA_HOME
```

JAVA_HOMEが設定されていないとかで怒られた。
そういや、大人の事情でJAVA_HOME設定してなかったんだった。
これ、面倒だからなんとかしないと
「Xcodeプロジェクト内のクラスの依存関係を図示する」をやってみた


タイトル通りです。[Xcodeプロジェクト内のクラスの依存関係を図示する](http://qiita.com/shu223/items/170b899df86952544c17)をやってみた。作業メモみたいなものです。

## dotファイルを作成するスクリプトをとってくる

まずは依存関係図を作成してくれるスクリプトをとってきます

- https://github.com/nst/objc_dep

この中の`objc_dep.py`が本体です

## dotファイルを作成する

次に、このスクリプトを使ってdotファイルを作成します

今回は、例としてiPhoneAppというプロジェクトファイルの依存関係図を作成してみることとします。

pythonで`objc_dep.py`を実行する際に「iPhoneAppフォルダのパス」と「出力するdotファイル名」を指定して実行

```
$ python objc_dep.py ~/iPhoneApp > iPhoneApp.dot
```

こんな感じでやると`iPhoneApp.dot`というdotファイルが作成されます。


## dotファイルからPDFを出力する

dotファイルからPDFを出力し、依存関係図のPDFファイルを作成します。

PDFファイルを作成するにはgraphvizが必要です

- http://www.graphviz.org/

Homebrewでインストールします

```
$ brew install graphviz
```

graphvizをインストールすると`dot`コマンドが使えるようになります

オプション`-Tpdf`を付けて、dotファイル名とpdfファイル名を指定して使います。

```
$ dot -Tpdf iPhoneApp.dot -o iPhoneApp.pdf
```

以上のように実行すればpdfファイルが作成されます。

## 以上

依存関係図を片手にソースコードを読んだほうが、いろいろ捗りますよ。
tgzファイルを作成するSBTのカスタムタスク

例えばsbt-assemblyでバッチのjarファイルを生成し、設定ファイル等を含んだデプロイ用tgzファイルを作成したい場合などに使える。

## カスタムタスク定義

```scala:Build.scala
case class Tar(name: String, destDirPath: String, paths:Map[String, String])
val tarContents = SettingKey[Tar]("tarContents", "tar file name, file / direcotry paths")
val tar = TaskKey[Unit]("tar", "tar")
val tarTask = tar <<= tarContents map { (tar: Tar) =>
  val tarDirectoryPath = tar.destDirPath + "/" + tar.name
  Process("rm -fr " + tarDirectoryPath)
  Process("mkdir -p " + tarDirectoryPath)

  tar.paths.foreach { kv =>
    if (kv._2.endsWith("/"))
      Process("mkdir -p " + tarDirectoryPath + "/" + kv._2)
      Process("cp -pr " + kv._1 + " " + tarDirectoryPath + "/" + kv._2)
  }   
  Process("tar -C " + tar.destDirPath + " -czf " + tarDirectoryPath + ".tgz " + tar.name)
}
```

## 使用方法
以下の例では、*.jarとconf/ディレクトリを含むtgzファイルを生成する。

```scala:build.sbt
// カスタムタスクの設定
Seq(tarTask)

Seq(tarContents := Tar("拡張子を除いたファイル名",
                       "XXX/target/",
                       Map("XXX/target/XXX.jar" -> "XXX.jar",
                           "XXX/target/scala-2.10/classes/conf" -> "conf"))
```
コードカバレッジですか？もちろん100％ですよ、静的な意味で

タイトルに反して、どうやら[Wikipedia](http://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%86%E3%82%B9%E3%83%88)によると型チェックはソフトウェアテストではないらしい。

> プログラムを実行し、正しく動作するかどうか確認する作業
> （略）
> 欠陥が存在することを示すことはできるが、欠陥が存在しないことは証明できない。

型チェックは一部ではあるものの、プログラムを実行するまでもなく正しく動くことを確認でき、欠陥が存在しないことの証明ができてしまうからだ。

しかし型チェックはテストコード同様、「プログラムの動作部分ではないが、プログラマのミスを避けるために追加で書かれるコード。本質的には無くてよい」ものであることに違いはない。

# 型チェックもソフトウェアテストってことにしておこうよ

従来のソフトウェアテストを「帰納的テスト」、型チェックのようなものを「演繹的テスト」と呼びたい。
型チェック自体をテストとすれば多くのソフトウェア開発でTDDを行っていることになる。これは単なる言葉遊びではない。

- 型を先に書くことで実装コードの見通しを立てやすくする
- 型チェックを用いて安心してリファクタリングを行える
- 高速に動作するため、頻繁にテストを行える
- 型を書かないと実行すらできないのでテストの記述を強制できる
    - コードカバレッジは常に100%
- テストを書くべき部分と書かなくてよい部分の境界が曖昧にならない

素晴らしい。テスト駆動開発のメリットのほとんどを享受できるではないか。
必要であれば演繹的テストに加えて帰納的テストを加えればよい。

従来のテスト設計と同様に型の設計はソフトウェアの品質において大いに貢献する。Javaのような言語ですら`int`型の代わりに`UserId`型を使うだけでもかなりのミスが防げる。まして型システムが強力な言語においては言うまでもない。

# 終わりに

半分ジョークではあるが、「ソフトウェアテスト！自動化！テスト駆動開発！」と叫ぶ人たちがあまり型の話をしないので、書いてみた。
より多くの人に「型チェックすげー」と言ってもらいたい
Rails + Capybara で Bootstrap2 から Bootstrap3 アップグレード時のメモ


# メモ
- bootstrap2 -> 3
- simple_form 3.0.0 -> 3.1.0.rc1（Bootstrap3に対応したとのこと）
- yamm2 -> 3 (megamenu)
- これにまとまってる感じなので粛々とクラスを付け替える感じ
  - http://matome.naver.jp/odai/2137510540117012201
- 手強いのは非表示まわりと toggle ですかねえ

## やったこと
- gem upgrade
- bootstrap/responsive を削除
- `span*` を `col-xs-*` に変更
- `i.icom-xxx` を `span.glyphicon-xxx` に変更。中でごにょってると探すの大変なとこもありそう
  - ※ `i` は Bootstrap3 でも使えます...
- `row-fluid`, `container-fluid` から `-fluid` を削除
- `text-error` を `text-danger` に変更
- `alert-error` -> `alert-danger` に変更
- `btn-mini` -> `btn-xs` に変更


### megamenu
- Yamm2 -> Yamm3 （http://geedmo.github.io/yamm3/ を見ながら）
  - yamm.css を 3 用に変更
  - menu で yamm 系クラスを 3 用に変更

### kaminari

```
# bootstrap2
%div.pagination
  %ul

# bootstrap3
%div
  %ul.pagination

```

### simple_form
- 3.1.0.rc1で Bootstrap3 に対応したそうなので upgrade
- ↓をみながら対応
- https://github.com/plataformatec/simple_form/commit/4963374e7b448b25a98ee34aec1d9bf16a6c9028
- 自分達のアプリ用の wrapper 作ってデフォルトをそれにした `col-sm-*` あたりを調整

```ruby
  config.wrappers :my_application_form, tag: 'div', class: 'form-group', error_class: 'has-error' do |b|
    b.use :html5
    b.use :placeholder
    b.use :label, class: 'col-sm-2 control-label'

    b.wrapper tag: 'div', class: 'col-sm-4' do |ba|
      ba.use :input, class: 'form-control'
      ba.use :error, wrap_with: { tag: 'span', class: 'help-block' }
      ba.use :hint,  wrap_with: { tag: 'p', class: 'help-block' }
    end
  end

  config.default_wrapper = :millefeuille_form

```
- `config/initializers/simple_form.rb`

```ruby
# bootstrap2
config.label_class = 'control-label'

# bootstrap3
config.label_class = nil
```

- `.field_with_errors` -> `.has-error` に変更

### toggle
- `.toggle()` とかしてたところを `.collapse('toggle')` にする
- デフォを `.hide` にしていたものは `.collapse`にする
- capybara で `hidden_field` の要素に `visible: false` をつける

```ruby
# bootstrap2
find("#target_id").set('hoge')

# bootstrap3
find("#target_id", visible: false).set('hoge')
```
- visible については upinetree さんのこちらの記事を
  - [非表示要素はCapybaraのfindで検索対象になるのか](http://qiita.com/upinetree/items/4d4022c90ce32b68c38d)

### modal

- `.hide` を削除して class を追加

```
# bootstrap2
.modal.hide.fade{ ... }
  .modal-header

# bootstrap3
.modal.fade{ ... }
  .modal-dialog
    .modal-content
      .modal-header
```


### select2
- 3.5.2 -> 3.5.7
- `application.css` に `*= require select2-bootstrap` を追加
- （Bootstrap3 のデフォルトのセレクトボックスは、フラットじゃないのであれですが）フラットな感じにしたい場合は、 http://fk.github.io/select2-bootstrap-css/ の CSS を読み込むようにしましょう

### bootstrap-datepicker-rails
- 1.1.1.9 -> 1.3.0.2

```
# bootstrap2
*= require bootstrap-datepicker

# bootstrap3
*= require bootstrap-datepicker3
```

### bootstrap-select-rails
- github のマスターだと対応しているっぽい

```ruby
gem 'bootstrap-select-rails', git: 'git@github.com:Slashek/bootstrap-select-rails.git'
```

# 参考になるかも
- "Example application with SimpleForm and Twitter Bootstrap" http://simple-form-bootstrap.plataformatec.com.br/
- "How to use Bootstrap 3 input group in Simple Form" https://github.com/plataformatec/simple_form/wiki/How-to-use-Bootstrap-3-input-group-in-Simple-Form
RLoginでCtrl+Vでペーストしたい

RLoginを使っていてCtrl+Vでペーストしたかったのでその設定のメモ

##設定画面でキーボードを選択して「新規」を押す

![2.png](https://qiita-image-store.s3.amazonaws.com/0/42887/0b3fd955-87aa-43fe-2836-63c50bcd1013.png)

##KeyCodeをV + Ctrlにして $EDIT_PASTE を選択

![1.png](https://qiita-image-store.s3.amazonaws.com/0/42887/69998a14-91a1-75c9-e123-eea39f7a9099.png)
My Atom.io setup with styles.less and init.coffee


So with the news of Atom.io going open source, I decided to start playing with it again. One thing I really wanted was to have a background image so that I could look at something pleasant.

Thankfully, the atom editor is practically a glorified web browser, so you can edit the stylesheet to do your bidding, so I was able to get my change in quite easily:

```css
@sapporo_cycling_road: 'http://media-cache-ec0.pinimg.com/originals/39/8a/ff/398aff8e6dcea2befe58f09480857a4b.jpg';
@hokkaido_jingu_mae_doori: 'http://media-cache-ec0.pinimg.com/originals/53/0b/1d/530b1dddb1d525b34c36ea37e305b6b0.jpg';

// git commit styles
.editor .git-commit.line-too-long.deprecated {
  color: orange;
  text-decoration: none;
}
.editor .git-commit.line-too-long.illegal {
  color: #fff;
  background: #DA2C43;
  opacity: 0.9;
}

.pane:before {
  content: "";
  background: url(@hokkaido_jingu_mae_doori)
      no-repeat center center fixed;
  background-size: cover;
  opacity: 0.20;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  position: absolute;
}

.editor:before {
  content: "";
  background: url(@sapporo_cycling_road)
      no-repeat center center fixed;
  background-size: cover;
  opacity: 0.20;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  position: absolute;
}

.comment {
  color: yellow;
  opacity: .8;
}

.editor {
  .cursor {
    border-color: pink;
    border-width: 2px;
  }

  .selection .region {
    background-color: pink;
    opacity: .5
  }
}
````

Ta-da! That's it! (if you use the default Dark theme) 

~~Unfortunately, there are a lot of things to be done for this to be very usable (like trying to make selection areas transparent), but hopefully this helps out someone (or better yet, draws someone to make fun of me and submit a better solution). In any case, I'll probably keep hacking at this over the coming weeks/months to make this much more sensible and usable.~~

~~Example screenshot [here](http://media-cache-ak0.pinimg.com/originals/f8/c2/7e/f8c27e8a0ef9a8a2f292aa018f1e2acf.jpg) (photo of the Sapporo cycling road)~~

I updated the stylesheet to reflect some of the changes I wanted. Updated screenshot [here](http://media-cache-ec0.pinimg.com/originals/2e/b0/03/2eb0035451978f73a1b8bb6683f6ac24.jpg)

I also added a little bit to my init script so that I can handle tab length based on the file extension without having to have .editorconfig files floating around everywhere. Might add more to this later.

```coffeescript
# init.coffee
path = require 'path'

atom.workspaceView.eachEditorView (editorView) ->
  editor = editorView.getEditor()
  filepath = editor.getPath()

  # set Tab Length for JS sources
  if path.extname(filepath) is '.js'
    editor.setTabLength(4)
```
Fabricを使用してDockerイメージを生成する


## 概要

Fabricを使用して、Dockerイメージを作成してみます。FabricはSSH経由での操作しか行えないため、Dockerに対して、SSH経由で操作を行う必要があります。

まず、下記の処理を行う関数`docker`を定義します。

* [SSH可能なDockerイメージを生成](http://qiita.com/ikuyamada/items/9cce2fa28b17c8d794e3)し、sshdをDockerコンテナ内で起動可能にする。
* Fabricで、タスク開始前に実行する関数(`docker`)を定義し、sshdをDockerコンテナで実行する。
* 終了前にDockerコンテナへの変更をcommitする。

```
import atexit
import time
from fabric.api import *
from fabric.contrib.console import confirm


@task
def docker():
    env.hosts = ['127.0.0.1:2222']
    env.user = 'root'
    env.password = 'PASSWORD'

    import docker
    cl = docker.Client()
    container = cl.create_container('BASE_IMAGE_NAME',
                                    command='/usr/sbin/sshd -D',
                                    ports=[22])

    cl.start(container, port_bindings={22:2222})
    time.sleep(3)

    @atexit.register
    def commit():
        cl.stop(container)
        if confirm('Commit container changes?', default=True):
            cl.commit(container['Id'], repository='IMAGE_NAME', tag='TAG')
```

下記を`fabfile.py`に記述することで、

```
$ fab docker TASK_NAME
```

のように実行することが可能になります。

また、上記のcommit関数内で`docker push`などを自動化して実行すると、タスクの実行からDocker Indexのアップロードまでを全て自動化することができます。

なお、実行には、[docker-py](https://github.com/dotcloud/docker-py)が必要です。