OmniAICreator/Qiita-1.07M huggingface dataset:
Nitrous.ioからbitbucketにgitリポジトリを作成する。

##まとめ
普通にbitbucketのリポジトリにプッシュするのとなにも変わらない。

##手順
boxのなかでプロジェクトは作成済みの状態を前提とします。


```shell-session:nitrous.io-comman-line

cd [プロジェクトフォルダ]
> git init
> git add .
> git commit -a -m "first commit"
```
Nitrous.ioに作成したgitリポジトリではじめてのコミットが終わったら、

https://bitbucket.org/
からbitbucketの個人ページを開き、「作成」ボタンからリポジトリを作成する。
その際、名前とかいろいろ入力するけど、バージョン管理ソフトには「Git」を選択する事。
リポジトリ作成すると、下の画面に遷移する。
>コードを追加する
>
>You can start a brand new project or push up an existing repo to >Bitbucket. What are you doing?
>
>    私はゼロからスタートします。
>    私はこれまでに作ったリポジトリをプッシュします。

と表示されるので、`私はこれまでに作ったリポジトリをプッシュします。`リンクをクリックする。そのまま以下のように実行。

```shell-session:nitrous.io-comman-line
>git remote add origin https://username@bitbucket.org/username/repositoryname.git
>git push -u origin --all
>git push -u origin --tags
```

pushの都度、bitbucketのパスワード入力を求められるので、入力する。（設定でスキップできるかも知れない）

以上。
fuelphp のルート関連のよくわからない挙動をちょっとづつまとめていく


## lavarelみたいなのがやりたいとき

クロージャを渡せばOK。

~~~~
'aboutus'    => function($req){
    return Response::forge(View::forge("aboutus"));
},
~~~~

引数にはリクエストオブジェクトが入ってきます。


~~~~
'aboutus'    => function($req){
    return View::forge("aboutus");
},
~~~~

`__toString`可能な何かをreturnすれば自動的に`Response`クラスでラップされる。つまり配列を返したらエラーだし、`true`を返しちゃうと`1`が表示される。

## 名前付きパラメータと後方参照を複合して使った時の挙動

REST APIを作るときとかで、例えば次のようなルートを考える。

~~~~
':username/:packagename/profile/(:any)' => 'profile/$1',
~~~~

期待する動作としては

- mikakane/sample/profile/show -> profile/show
- mikakane/sample/profile/delete -> profile/delete

みたいなのなんだけど、動かない。

この場合は、

~~~~
':username/:packagename/profile/(:any)' => 'profile/$3',
~~~~

こうすると動く。要は名前付きルートは内部的に`()`付きに変換されるから採番がずれる。

## モジュールルートは動かない。

メインのルーティングでモジュール振り分けして、さらにモジュールに着弾してからモジュールルーティングで再振り分け…みたいなのはできないみたい。

上の例で行くと、

~~~~
:username/:packagename/<module>/(:any) => '<module>/$3'
~~~~

みたいな振り分けをしてから、再度モジュール側で振替をする、みたいな処理。

要はURLルーティングじゃなくて、ルーティングからモジュールに入った時、モジュールルートは動かないっぽい。
つーかそもそも`config/route.php`が読み込まれない。参った。

逆にこれを利用して`config/route.php`内に

~~~~
(:any) => 'welcome/404'
~~~~

的な記述をすれば、自動的に割り当てられてしまうモジュールURLの無効化みたいなこともできる。便利といえば便利なのかもしれない。

## モジュールルートはいろいろおかしい

んじゃあ、モジュールURL無効化して、モジュールへのルーティングをトップの`route.php`に書くかーとか思ったらまたハマった。
よく調べていないのだけど、

~~~~
:username/:packagename/profile/show => 'profile/show'
~~~~

みたいにするとprofileモジュールのprofileコントローラ、showメソドに飛ぶ。
なんかモジュール名と同名のコントローラがあると挙動がおかしくなるっぽい。
URLから飛ぶ時とルートで指定する時と、形式が違うのかもしれない。謎。
render partialで部分テンプレートに変数を渡す方法

localsにて変数を指定する.
尚、部分テンプレート内でインスタンス変数は使わない方が良いかも。
[Railsの部分テンプレートからインスタンス変数を参照するのはやめよう。](http://kadoppe.com/archives/2013/09/rails-partial-template-instance-variables.html)

```rb
# accounts/show.html.slim
= render partial: "contents/index", locals: {contents: @user.contents}
```

部分テンプレート側はこんな感じ。

```rb
# contents/_index.html.slim
table
  tr
    - contents.each do |content|
      td content.xxx
```

# 参考
[Railsのpartialの使い方](http://ukstudio.jp/2008/08/13/ruby_on_rails_partial/)
[レイアウトと部分テンプレート](http://www38.atwiki.jp/eyes_33/pages/40.html)
[Railsの部分テンプレートからインスタンス変数を参照するのはやめよう。](http://kadoppe.com/archives/2013/09/rails-partial-template-instance-variables.html)
xpath使うときはtbodyに気をつけよう

`tbody`は任意タグで、`Webkit`とかだと勝手に挿入されて`Nokogiri`だと挿入されないので`xpath`を使うときは、同じ構造のHTMLを解析するときでも違うコードが必要になることがあるので気をつけましょう。

## もうちょっと詳しく

https://hack.ironsand.net/2014/difference-between-nokogiri-and-selenium-webdriver-about-xpath/
どうしてもGoでTryCatchしたい人のためにtrycatch作った


以前Gunosyのサーバを全部Goに置き換えてる時に、同僚から「Goってtry-catchないの」みたいな話が出ました。
その時はそんなもの必要ないと返したんですが、せっかくゴールデンウィークなのでふざけたものつくろうと思い寝起きの10分位で適当なtry-catch実装作りました。

## 作ったもの 
こちらです。
**trycatch** https://github.com/y-matsuwitter/trycatch

インストールは `go get github.com/y-matsuwitter/trycatch`

## 使い方

```go:trycatch.go
package main

import "github.com/y-matsuwitter/trycatch"

type MyError struct {
	error
}

func main() {
	trycatch.TryCatch{}.Try(func() {
		println("do something buggy")
		panic(MyError{})

	}).Catch(MyError{}, func(err error) {
		println("catch MyError")

	}).CatchAll(func(err error) {
		println("catch error")

	}).Finally(func() {
		println("finally do something")

	})
	println("done")
}
```

実行結果

```shell:
$ go run trycatch.go
do something buggy
catch MyError
finally do something
done
```

注意点として、Try、Catchなど呼んだあと、Finallyを呼ばないと例外をキャッチしてくれないです。
なんか上手い書き方思いついたら改善してみる。

## 最後に
今のところ、try-catchが用意されていないことで問題になったことは特にないし、自分はこれ使わないだろうと思いました。
あと、Goとtry-catchの話、以前twitterでもちょいちょいネタに上がってますね（参考：[mattnさんのブログ記事](http://mattn.kaoriya.net/software/lang/go/20140416212413.htm)）。
Rubyの手続き型と関数型の側面


Rubyは手続き型の言語であるが、LispやSmalltalkの影響も受けているため関数型言語の側面も持つ。

Wikipediaのアクセス解析プログラムを例に、両者の違いを比べてみる。元の手続き型のコードは、いがいがさん作のRuby講義資料から。

 * [Ruby 講義 第6回 Wikipediaアクセス解析](https://speakerdeck.com/igaiga/ruby06)
 * [Ruby 講義 第7回 Wikipediaアクセス解析](https://speakerdeck.com/igaiga/ruby07)

アクセス解析のプログラムは以下の処理を実施している。

 * CSV形式のログ（ページ名とアクセス数が記録されている）を読み込む
 * jaで始まる行のみを対象にする
 * ログの1行からページ名とアクセス数を抽出
 * アクセス数が多い順に並び替え
 * トップ20行を表示

## 手続き型

元のコードはこちら。処理を順番に書いているところが手続き型。CやJavaで書いても同じ書き方になりそう。

```ruby
require "cgi"
filename = "20120301-000000-ja.txt"
file = File.open(filename, "r:UTF-8")
list = []
while text = file.gets
  begin
    next unless text =~ /^ja/
    data = text.split
    h = {:title => CGI.unescape(data[1]), :count => data[-2]}
    list.push h
  rescue Exception => e
    #p e
  end
end
file.close

 # count順にソート
result = list.sort_by do |i|
  i[:count].to_i
end

 # トップ20表示
result.reverse.first(20).each do |i|
  puts i
end
```

## 関数型

これを関数型っぽく書き換える。

 * 条件にマッチしない行を対象外にする … `while text = file.gets` と `next unless` を `#select` へ
 * データを抽出した結果を配列に格納する … `list.push` を `#map` へ
 * それぞれの処理をメソッドチェーンで繋ぐ

書き換えたコードがこちら。元のファイルに対して1つずつフィルタを適用しているような書き方。SQLやjQueryにも似てる。それから、UNIXやLinuxでgrepやcutコマンドを使ったパイプ処理にも。

```ruby
require 'uri'
require 'pp'

filename = ARGV[0]

def parse(line)
  data = line.split
  { title: URI.decode(data[1]), count: data[2].to_i }
end

open(filename) do |f|
  pp f
    .select {|line| line =~ /^ja/ }
    .map {|line| parse(line) }
    .sort_by {|item| item[:count] }
    .reverse
    .first(20)
end
```

このように同じプログラムでも色々な書き方ができることが、Rubyの面白いところ。

## どう書くのがよいか

コンピュータの処理に近いのが手続き型、処理を抽象化したのが関数型。慣れると関数型のほうが分かりやすく読める。ずっと手続き型で書いてきて、関数型っぽく書けることを知ると、ついつい関数型っぽく書きたくなる。

ところが、必ずしもそうではない。このWikipediaアクセス解析プログラムの処理時間を time コマンドで計測すると、ハッキリと違いがでる。 → 【追記】この段落の内容は嘘でした。追記まで読んでください。

手続き型風のプログラム

```
13.70s user 0.35s system 99% cpu 14.061 total
```

関数型風のプログラム

```
30.87s user 0.49s system 98% cpu 31.911 total
```

なぜか。元のプログラムは1つのループ内で `#select` と `#map` 相当の処理をやっている。書き換え版はそれぞれの処理でループを回し、別々の配列に格納している分だけ遅くなる。なので結局は、目的に応じて最適な手段は変わってくる。性能だけでも、ソート時に降順に並び替えておいて `#reverse` を使わないなど、最適化する余地はたくさんある。遅延評価をする [Enumerable#lazy](http://magazine.rubyist.net/?0041-200Special-lazy) を使えば効率化されるのだろうか（まだ試していない）。

Rubyはいろいろな書き方ができて、奥が深いという話でした。

## 追記

元のプログラムと条件を揃えないと意味が無いとツッコミを受けたのでやり直し。URI.decodeではなくCGI.unescapeを使って、ppもputsに書き換えた。

```ruby
require 'cgi'

filename = "20120301-000000-ja.txt"

def parse(line)
  data = line.split
  { title: CGI.unescape(data[1]), count: data[2].to_i }
end

open(filename, "r:UTF-8") do |f|
  f
    .select {|line| line =~ /^ja/ }
    .map {|line| parse(line) }
    .sort_by {|item| item[:count] }
    .reverse
    .first(20)
    .each {|item| puts item }
end
```

これで速度を測ると、元のプログラムと遜色ないという結果に。

```
ruby wiki.rb  13.99s user 0.42s system 99% cpu 14.424 total
```

手続き型と関数型の違いで遅かったのではなく、`CGI.escape`の代わりに`URI.decode`を使ったのが原因で遅かったというオチでした。とほほ。
gulpは、destの後にもアクションを繋げられる


[gulpのAPIマニュアル](https://github.com/gulpjs/gulp/blob/master/docs/API.md#gulpdestpath)にも書かれていますが、gulpでは、`gulp.dest`を書いたからと言って、そこで終わりにする必要はありません。

- **注**: 下記、CoffeeScriptで書いてますが、gulpの標準はJavaScriptです。適宜読み替えてください。

## 例: 複数ディレクトリに出力する

例えば、こんな風に書けば、3つのディレクトリにテキストファイルをコピーできます。

```coffeescript
gulp = require 'gulp'
  
gulp.task 'multi-dist', ->
  gulp.src ['./src/*.txt']
  .pipe gulp.dest './dist1/' # 1つ目のdest
  .pipe gulp.dest './dist2/' # 2つ目のdest
  .pipe gulp.dest './dist3/' # 3つ目のdest
```

## 例: minifyの前後でファイルを2つ出力する

```coffeescript
gulp = require 'gulp'
coffee = require 'gulp-coffee'
rename = require 'gulp-rename'
uglify = require 'gulp-uglify'
  
gulp.task 'scripts', ->
  gulp.src ['./src/coffee/*.coffee']
  .pipe coffee()
  .pipe gulp.dest './dist/js/' # 1つ目のdest
  .pipe uglify()
  .pipe rename extname: '.min.js'
  .pipe gulp.dest './dist/js/' # 2つ目のdest
```

## 例: パスを書き換えたものを別ディレクトリに出力する

プロダクション用のファイルを一旦出力しつつ、プレビュー用のHTMLを別ディレクトリに出力する例を考えます。この例では、`/dist/html/`に出力後、HTMLから参照するファイルのパスを調整して、プレビューしやすいものを`/test/preview/`に生成しています。

```coffeescript
gulp = require 'gulp'
replace = require 'gulp-replace'
slim = require 'gulp-slim'

gulp.task 'slim', ->
  gulp.src ['./src/slim/*.slim']
  .pipe slim pretty: true
  .pipe gulp.dest './dist/html/' # 1つ目のdest
  .pipe replace '/css/style.min.css', '/css/style.css' # CSSだけ、minify前のものに
  .pipe gulp.dest './test/preview/' # 2つ目のdest
```

## gulpのコマンドは基本全部ストリーム

gulpプラグインは、"passthrough stream"であることが基本です。ストリームを受け渡す事で、Node.jsの作法に従いながらアクションを繋いで行く事を信条にしていて、gulp.destも同様の精神で作られています。なので、gulp.destの後に他のプラグインを繋げる事は特に不思議ではないのです。

ちなみに、`gulp.src`についても["passthrough"にすべきという議論](https://github.com/gulpjs/gulp/issues/396)が、暫く前にissueとして上がっていました。今後のバージョンで、そうなる可能性は高そうです。
モデルにパスワード属性を追加する方法

自分向けのメモ

## Gemfileのbcryptを有効にする。
[wikipedia BCrypt](http://en.wikipedia.org/wiki/Bcrypt)

```rb
gem 'bcrypt', '~> 3.1.7' # rails4.0.0のGemfileの場合
```

## modelにpassword_digest属性を追加する
モデルを新規作成の場合
```bash
rails g scaffold account email:string password_digest:string
```

## modelにhas_scure_passwordを指定する
参考:[Rails API Doc:has_secure_password](http://api.rubyonrails.org/classes/ActiveModel/SecurePassword/ClassMethods.html#method-i-has_secure_password)

has_secure_passwordによって、以下が行われる。
- モデルにpassword,password_confirmation属性の追加
- password,password_confirmationのvalidationの追加
- authoricateメソッドの追加

```rb
#account.rb
class Account < ActiveRecord::Base
  has_secure_password
end
```

## controllerのstrong parameterの編集
password, password_confirmationを追加。password_digestを削除。

```rb
def account_params
  params.require(:account).permit(:name, :display_name, :password, :password_confirmation, :email)
end  
```

## view formの編集
password_digestのフィールドを削除して、passwordとpassword_confirmationに置き換える。

```rb
# 変更前
= f.label :password_digest
= f.text_field :password_digest
```

```rb
# 変更後
= f.label :password
= f.password_field: password
= f.label :password_confirmation
= f.password_field: password_confirmation

```

# コントローラでの検証方法

```rb
  def create
    account = Account.find_by(name: user_params[:name])
    if account and account.authenticate(account_params[:password])
      # login.
    else
      #error.
    end
  end
```

# 参考
[has_secure_passwordを読む](http://qiita.com/sinapps/items/9da63698199f4e6135ae)
[has_secure_passwordによるユーザ認証](http://qiita.com/friedeggs@github/items/18c31bb15335f417dfa0)
Bowtie2を使って、参照塩基配列と一致した配列を抽出、一致しなかった配列を抽出する

# Bowtie2を使って、参照塩基配列と一致した配列を抽出、一致しなかった配列を抽出する

## bowtie2のインストール

bowtie2は次のサイトからダウンロードできます。

http://bowtie-bio.sourceforge.net/bowtie2/index.shtml

次の例は~/research/に保存する手順です。

```bash
$ cd ~/research/
$ wget http://sourceforge.net/projects/bowtie-bio/files/bowtie2/2.2.2/bowtie2-2.2.2-linux-x86_64.zip
$ unzip bowtie2-2.2.2-linux-x86_64.zip
```

実行できるようPATHを通します。

```bash
$ export PATH=~/research/bowtie2-2.2.2/:$PATH >> ~/.bashrc
$ source ~/.bashrc
```
bowtie2を実行するとUsageが出力されます。

## 参照配列を準備

ヒトゲノムを参照用に使う場合、次のサイトから取得できます。

http://bowtie-bio.sourceforge.net/index.shtml

```bash
$ cd ~/research/
$ wget ftp://ftp.ccb.jhu.edu/pub/data/bowtie2_indexes/hg19.zip
$ unzip hg19.zip -d indexes/
```

自分で用意したい場合は`bowtie2-build`コマンドでfastaファイルからindexを作成できます。

```bash
$ bowtie2-build reference.fasta ~/research/indexes/reference.fasta
```

## マッピング

### targetがpaired readsの場合：

`-x <prefix>`: reference fastaのindexのprefix(xxx.1.bt2,xxx.2.bt2などのxxxの部分)
`--un-conc <filename>`: 一致しなかった配列をファイルに出力
`--al-conc <filename>`: 一致した配列をファイルに出力
`-1 <filename>`: target fastqの`1`のついたファイルを指定
`-2 <filename>`: target  fastqの`2`のついたファイルを指定

paired readsの場合はオプションで--un-concと--al-concを使う必要があります。
（私はここにはまりました）

```bash
$ bowtie2 -p 2 --un-conc target_nohg19.fastq --al-conc target_hg19.fastq -x ~/research/indexes/hg19 -1 target_1.fastq -2 target_2.fastq > /dev/null 2> target.log
$ cat target.log
```

実行後、次のファイルが出力されます。
target_nohg19.1.fastq
target_nohg19.2.fastq
target_hg19.1.fastq
target_hg19.2.fastq

さらに、画面には総read数、一致したread数とパーセント、一致しなかったread数とパーセントが表示されます。
（標準エラーに出力されるので、リダイレクトでlogファイルに残すようにします）

### targetがnon-paired readsの場合：

```bash
$ bowtie2 -p 2 --un target_nohg19.fastq --al target_hg19.fastq -x ~/research/indexes/hg19 target.fastq > /dev/null 2> target.log
$ cat target.log
```

### 参照
[RNA-seqデータの解析パイプラインを作ろう（TopHat-Cuffilnks）](http://non-bioinfomatician.blogspot.jp/search?q=bowtie)

[Default Filtering rRNA out using Bowtie2](http://seqanswers.com/forums/showthread.php?t=27267)
1クリックで見てるサイトのQRコードを生成するブックマークレット

## 背景

スマートフォンページを作っていると割とPCで開いているページを、
手元のスマートフォンでさっと開きたいシチュエーションは割とある。
こういう時、端末で打つのは面倒くさいのでQRコードにしてスマートフォンでスキャンすることが多い。

だいたいQRコードを作成するとき、QRコード生成サイトなんかを利用するのだが、
どこかのサイトのフォームにおおっぴらにしてないページのURLを貼り付けるのはなんとなく抵抗があったので、それよりも精神衛生上は良さそうなGoogle Chartを使ってQRをつくっていた。

この記事はその実際に使っているブックマークレットの紹介である。

##Google Chart Toolsについて

Google Chart Tools: InfographicsのQRコードの機能を拝借する。
https://developers.google.com/chart/infographics/docs/qr_codes

が、Infographicsは2012年にはDeprecatedとなっており、メンテする気はないらしい。
他にも数式やグラフ的なAPIがあってなんか面白そうだ。

基本的には

```html:
http://chart.googleapis.com/chart?
```
に色々パラメータを付けてアクセスすると画像データが帰ってくる仕組み。

パラメータは大きさとか、エラーの誤り訂正レベルとか。
そのままimgタグで貼れる便利。

##ブックマークレットの内容

```js:ベースとなる内容
var string=prompt("input text", document.URL);
if(string == null || string == ""){
    alert("canceled");
}else{
    window.open("http://chart.googleapis.com/chart?cht=qr&chs=150x150&choe=UTF-8&chl="+encodeURIComponent(string)); 
}
```

とりあえず、下記をコピペしてブックマークのURL欄にでもいれておいて、QR化したいページで押せば
そのURLが予めセットされたプロントが出てきて、OKを押せばささっとそのページのQRコードを作れるという感じ。

~~あれ、、、厳密には1クリックじゃなかった。。。~~
今見てるページ以外もQR化したい時もあるので、プロントで一度対象の値を入力するようにしてる。
キャンセルダイアログとかもいらないかな。。
まぁ、このあたりは好みで変更したら良いと思います。

```js:サンプル
javascript:(function(){var string=prompt("input text",document.URL);if(string!=null&&string!=""){window.open("http://chart.googleapis.com/chart?cht=qr&chs=150x150&choe=UTF-8&chl="+encodeURIComponent(string));}})()
```
GitHubの代替ツール（どちらかというとEnterprise向け）

プライベートリポジトリを持とうとすると突き当たるGitHub。
企業ではソースコードを社外に出せず、社内でインストールするタイプが求められる事もあります。

2018年6月4日
マイクロソフトはGitHubを75億ドルで買収する事を発表しました
- https://news.microsoft.com/2018/06/04/microsoft-to-acquire-github-for-7-5-billion/

# インストール型

## GitHub Enterprise

* 本家
* 無料お試し可・45日間
* 20ユーザごとに$5,000ごと追加されます

## GitLab
https://www.gitlab.com/

- GitLab社が開発
- 無償の Community Edition (CE) と、有償の Enterprise Edition がある（[Editionによる機能の違い](https://about.gitlab.com/products/feature-comparison/)）
- Enterprise Edition の料金単位は「ユーザ/年」

| Starter | Premium | Ultimate |
|:---:|:---:|:---:|
| $39 | $199| $999 |

* 開発言語：Ruby on Rails
* 8.2～8.7に重大な脆弱性があります（2016/05/02）
* https://about.gitlab.com/2016/05/02/cve-2016-4340-patches/

## GitBucket
https://github.com/takezoe/gitbucket

* 開発言語：Scala
* 日本の方が開発しているGitHubクローン。GitHubに似せたデザインであったが、GitHub社の指摘を受け独自のものに変えていく方針としている
    * http://takezoe.hatenablog.com/entry/2016/03/21/031733
* ver.4.0 (2016/04/30)
    * MySQL と PostgreSQL をサポート
* ver.3.13 (2016/04/01)
    * http://takezoe.hatenablog.com/entry/2016/04/01/093406
* ver.3.6 (2015/08/30)　
    * http://takezoe.hatenablog.com/entry/2015/08/30/040207

## Atlassian Git Essentials
[アトラシアン、Git対応開発支援環境「Atlassian Git Essentials」を提供開始](http://it.impressbm.co.jp/articles/-/11047)

各ツールで構成されるGit対応の統合開発支援環境

* 課題管理ツールの「JIRA」
* アジャイル計画・開発ツールの「JIRA Agile」
* エンタープライズGitソースコード管理ツールの「Stash」
* 継続的インテグレーションソフトの「Bamboo」

|User|Price|
|---:|---:|
|～10|$40|
|～25|$4,400|
|～50|$7,400|
|～100|$12,800|
|～500|$24,800|
|～2000|$68,800|

## Atlassian Stash
https://www.atlassian.com/ja/software/stash

* 無料の Git Client [SourceTree](http://www.sourcetreeapp.com/) を提供しているAtlassianの製品

|User|Price|
|---:|---:|
|～10|$10|
|～25|$1,800|
|～50|$3,300|
|～100|$6,000|
|～500|$16,000|
|～1000|$28,000|
|～2000|$48,000|
|～5000|$100,000|

# サービス型

## GitHub
https://github.com/

* 本家
* プライベートを利用する場合は有料となります

|Developer|Team|Business|
|:---:|:---:|:---:|
|$7|$9|$21|
| |最低 $25 (5ユーザ分含む)| |

## Atlassian Bitbucket
https://bitbucket.org/

* 無料お試し可・無期限
* 無制限のプライベートリポジトリ（全リポジトリで5ユーザまで）

## CodePlex（サービス終了）

* Microsoft運営のサービス（Gitではないですが、GitHub買収のからみがあり掲載）
* 2006年6月正式サービス開始
* 2017年4月にサービス終了のアナウンスがされ、2017年12月15日サービス終了となった。

## codebreak;（サービス終了）
http://codebreak.com/ja/

* 2016年1月31日サービス終了（サービス期間：2013年2月～2016年1月）
* プライベートリポジトリ無料、利用人数無制限
* 有料会員制転職サイト「ビズリーチ」が運営
達人に学ぶSQL徹底指南書に出てくるTMP

#達人に学ぶSQL徹底指南書の69ページとかに出てくるTMPの意味がやっとわかったのでメモります。

TMPはサブクエリにつけるエイリアス名だったのね。。。

エイリアスをつける時にASをつけてもつけなくても良いDBMSがある。
かつ、サブクエリにエイリアスをつけなくても良いDBMSがある。

```sql

SELECT income, COUNT(*) As cnt
FROM Graduates
GROUP BY income
HAVING COUNT(*) >= 
( SELECT MAX(cnt) FROM (SELECT COUNT(*) AS cnt FROM Graduates GROUP BY income) TMP);

```

ASをつけてもいける
```sql

SELECT income, COUNT(*) As cnt
FROM Graduates
GROUP BY income
HAVING COUNT(*) >= 
( SELECT MAX(cnt) FROM (SELECT COUNT(*) AS cnt FROM Graduates GROUP BY income) AS TMP);

```
[Visual Studio] ProjectFolderへのパスを簡単に取得する方法

プロジェクトの中に静的ファイルとしてjsonなどのデータを含めた場合、実行ファイルがそれらのファイルにアクセスする際の相対パスがややこしくなります。
よくある例が、ビルドの構成でデフォルトでは
ProjectFolderPath/bin/Debug/MyApp.exe
に実行ファイルが生成されるのに対し、プラットフォームをx64などにすると、
ProjectFolderPath/bin/ __x64__ /Debug/MyApp.exe
に実行ファイルが生成されます。この場合、

```
var pathToJson = "../../../static/hoge.json"
```

と定義しても、ビルドの構成を変えたときに正しく静的ファイルにアクセスすることができません。
しかし、[Enivironment](http://msdn.microsoft.com/ja-jp/library/system.environment(v=vs.110).aspx)クラスを見てもProjectFolderへのパスを取得できなさそうです。
そこで、ビルド前にコマンドを実行し、ProjectFolderのパスをファイルとして出力するようにします。

1.まずはプロジェクトのプロパティを開き、ビルドイベントタブを選択します。
2.次に「ビルド前の編集」ボタンを押します。

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/36752/fc50dfc8-8cca-2b9a-5a94-d3c144b87473.png)

3.「マクロ＞＞」を押します。 

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/36752/3aefab15-f410-2062-221b-2d83854d6e07.png)

4.ビルド前に実行するコマンドラインとして、

```
ECHO $(ProjectDir) > $(TargetDir)ProjectDirPath.txt
```

を設定します。

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/36752/f4ae4a35-cda1-7026-ff55-51c948c9ad0b.png)

5.あとは、ビルド時に実行ファイルと同じ階層に"ProjectDirPath.txt"が生成されるので、そこからProjectFolderへのパスを取得します。

```csharp
string projectDirPath;
if(File.Exists("ProjectDirPath.txt")){
    using(var sr = new StreamReader("ProjectDirPath.txt")){
        projectDirPath = sr.ReadToEnd();
    }
}
var pathToJson = Path.Combine(projectDirPath, "static", "hoge.json");
```

ビルド前およびビルド後のコマンドライン実行は、使い方次第でかなり便利なことができるので、ガンガン使いましょう。
Lubuntu 14.04 で Alt+F2 のアレが起動しなくなった

Lubuntu 14.04 を試していて，Alt+F1 でメニューは開くけど Alt+F2 でコマンドを実行するウィンドウが立ち上がらなくなりました．ランチャーとして普通に使えるのであれが使えなくなるのは痛い．なのでそれの修正方法です．

`/usr/share/lubuntu/openbox/rc.xml` の `<keybind key="A-F2">` というタグの中身が Alt+F2 のキーを入力したときに実行されるコマンドの内容になってます．ここが私の場合だと

```xml
<action name="Execute">
  <command>lxsession-default launcher_manager</command>
</action>
```

となっており，ターミナルで実際にこのコマンドを実行しても何も起こらないことが確認出来ました．なのでこの設定を自分で上書きしてやればいい感じがします．そのために `~/.config/openbox/lubuntu-rc.xml` を編集すれば良いみたいです．ここの同じタグの内容の command タグを，

```xml
<action name="Execute">
  <command>lxpanelctl run</command>
</action>
```

と修正してやれば良いです．実際にこのコマンドをターミナルから実行するとプログラムを実行するウィンドウが起動します．

同ファイル内の

```xml
<keybind key="W-r">
...
</keybind>
```

の内容も同じように変更してやっても良いと思います．

## References

http://forum.ubuntuusers.de/topic/ausfuehren-in-lubuntu-14-04-nicht-mehr-auf-alt/
mockito + PowerMockでfinalメソッドをモック化（再）

※一度書いた内容が不完全だったので書き直してます

以下のようなコードで、SocketChannelをモック化して、catch IOExceptionを確認したいと思います。
モックライブラリは「mockito」を使います。

```java:App.java
public class App {
    public void method(SocketChannel channel) throws IOException {
        if (channel.isOpen()) {
            try {
                channel.close();
            } catch (IOException e) {
                // do anything..
            }
        }
    }
}
```

SocketChannelをモックオブジェクトとして、isOpenとcloseの振る舞いを変えたいところですが、finalメソッドなのでモック化できません。
そこでPowerMockを組み合わせます。

Mavenを使っている場合は、pom.xmlのdependenciesに以下を追加します。

```xml:pom.xml
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.mockito</groupId>
      <artifactId>mockito-all</artifactId>
      <version>1.9.5</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.powermock</groupId>
      <artifactId>powermock-api-mockito</artifactId>
      <version>1.5.4</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.powermock</groupId>
      <artifactId>powermock-module-junit4</artifactId>
      <version>1.5.4</version>
      <scope>test</scope>
    </dependency>

```

PowerMockの使い方は、https://code.google.com/p/powermock/wiki/MockitoUsage13 を参照してください。

テストコードは以下のようになります。
モックインスタンスの生成に`PowerMockito#mock(Class)`を使う以外は、普通にmockitoで行うモックの設定方法と同じです(*1)。

```java:AppTest.java
@RunWith(PowerMockRunner.class)
@PrepareForTest({App.class, SocketChannel.class})
public class AppTest {

    @Test
    public void testMethod() throws Exception {
        App target = new App();

        SocketChannel channel =  PowerMockito.mock(SocketChannel.class);
        Mockito.doThrow(new IOException()).when(channel).close();
        Mockito.when(channel.isOpen()).thenReturn(true);

        try {
            target.method(channel);
            fail();
        } catch (Exception e) {
            verify(channel, times(1)).close();
        }
    }

```

@PrepareForTestにはテスト対象のクラスも指定します(このサンプルの場合はApp.class)。含めないとモックオブジェクトを渡してもモックの動きをしてくれません。
最初、モック対象のクラスだけを含めればよいのかと思っていたら違いました。


> *1 「PowerMockito.mock(SocketChannel.class)」を「Mockito.mock(SocketChannel.class)」に変えると以下のように実行時にエラーとなります。
モック化されていないメソッドが呼び出されています。

> `java.lang.NullPointerException
	at java.nio.channels.spi.AbstractInterruptibleChannel.close(AbstractInterruptibleChannel.java:111)
	at sample.AppTest.testA(AppTest.java:38)`
sinatra + activerecord + rspecでのtimezone管理

rspecを書いていて、

`       expected: "2014-05-01 23:00:00"
            got: 2014-05-01 23:00:00 UTC`

こんな結果が取れてきて、Timezoneの設定が必要なことに気付いた。

```rb:spec/spec_helper.rb
require 'sinatra'
require 'sinatra/activerecord'

Time.zone = "Tokyo"
ActiveRecord::Base.default_timezone = :local
```

この設定を追加したら、


こんな感じに変化した。

`      expected: "2014-05-01 23:00:00"
            got: 2014-05-01 23:00:00 +0900`
Processingのショートカット

# Processingのショートカット
- 保存 Ctrl+S (Save)
- 名前を付けて保存 Shift + Ctrl + S (Save as...)
- Sketchの実行 Ctrl + R (Run)
- 自動フォーマット機能 Ctrl+T (Auto-Format)
- (PDE X) Toggle Breakpoint Ctrl+B
- (PDE X) Toggle Variable Inspector Ctrl+I
jQueryのDeferredの基本的な使い方メモ

すぐわからなくなるので基本的なところだけメモ。

```js:
async(function() {
    console.log('async');
});
console.log('hoge');

/**指定した関数を 1 秒後に実行する*/
function async(f) {
    setTimeout(f, 1000);
}
```

これを実行すると、

```text:実行結果
hoge
async
```

とコンソールに出力される。

しかし、どうしても非同期処理の後で `hoge` を出力させたい場合に `Deferred` を使う。

```js:
var d = new $.Deferred();

async(function() {
    console.log('async');
    d.resolve();
});

d.promise().then(function() {
    console.log('hoge');
});

/**指定した関数を 1 秒後に実行する*/
function async(f) {
    setTimeout(f, 1000);
}
```

```text:実行結果
async
hoge
```

- `new $.Deferred()` で `Deferred` のオブジェクトを生成する。
- 非同期処理が完了した時点で、生成しておいた `Deferred` オブジェクトの `resolve()` メソッドを実行する。
- `Deferred` オブジェクトの `promise()` メソッドを実行し、その戻り値（`promise` オブジェクト）の `then()` メソッドに非同期処理の後に実行したい処理を渡す。

`then()` はメソッドチェーンができるので、

```js:
var d = new $.Deferred();

async(function() {
    console.log('async');
    d.resolve();
});

d.promise()
.then(function() {
    console.log('hoge');
})
.then(function() {
    console.log('fuga');
});

/**指定した関数を 1 秒後に実行する*/
function async(f) {
    setTimeout(f, 1000);
}
```

という風に書ける。

```text:実行結果
async
hoge
fuga
```

ただし、このままだと２つ目の `then()` は１つ目の `then()` が終了するとすぐ実行される。

なので、

```js:
var d = new $.Deferred();

async(function() {
    console.log('async');
    d.resolve();
});

d.promise()
.then(function() {
    // ★１つ目の then() が非同期処理
    async(function() {
       console.log('hoge'); 
    });
})
.then(function() {
    console.log('fuga');
});

/**指定した関数を 1 秒後に実行する*/
function async(f) {
    setTimeout(f, 1000);
}
```

こんな実装になっていると、

```text:実行結果
async
fuga
hoge
```

となる。

１つ目の `then()` の非同期処理が終わってから２つ目の `then()` を実行したい場合は、１つ目の `then()` で新しい `promise` オブジェクトを返す。

```js:
var d = new $.Deferred();

async(function() {
    console.log('async');
    d.resolve();
});

d.promise()
.then(function() {
    var d2 = new $.Deferred();
    
    async(function() {
        console.log('hoge');
        d2.resolve();
    });
    
    return d2.promise();
})
.then(function() {
    console.log('fuga');
});

/**指定した関数を 1 秒後に実行する*/
function async(f) {
    setTimeout(f, 1000);
}
```

```text:実行結果
async
hoge
fuga
```

#参考
- [jQuery.Deferred() | jQuery API Documentation](https://api.jquery.com/jquery.deferred/)
- [爆速でわかるjQuery.Deferred超入門 - Yahoo! JAPAN Tech Blog](http://techblog.yahoo.co.jp/programming/jquery-deferred/)
オブジェクト指向に近づく9つのルール (ThoughtWorks アンソロジーより)

ThoughtWorks アンソロジーの5章オブジェクト指向エクササイズから
9つのルールを学んだのでメモします

#1. 1つのメソッドにつきインデントは1段階まで
巨大なメソッドになればなるほど凝集度が低くなる。
メソッドが1つの仕事を行う場合、制御構造はあって1つ。
制御構造が複数ある時点でメソッドに対して仕事が複数ある。
だから、制御構造を1つに抑える

>下記は書籍から引用

リファクタリング前

```java
class Board {
    String board() {
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                buf.append(data[i][j]);
            }    
            buf.append("\n");
        }
        return buf.toString();
    }
}
```

リファクタリング後

```java
class Board {
    //1つのメソッドにつきインデントは1段階までにする
    String board() {
        StringBuffer buf = new StringBuffer();
        collectRows(buf);
        return buf.toString();
    }

    void collectRows(StringBuffer buf) {
        for (int i = 0; i < 10; i++) {
            collectRow(buf, i)
        }
    }
   
    void collectRow(StringBuffer buf, int row) {
        for (int i = 0; i < 10; i++) {
            buf.append(data[row][i]);
        }
        buf.append("\n");
    }
}
```

#2. else句を使用しないこと
ガード節(ある条件を満たしていない時にreturnする or 例外を投げる)、早期returnを使う。もしくはポリモフィズムを使用する

#3. 全てのプリミティブ型と文字列型をラップする
プリミティブ型をオブジェクトでラップする
オブジェクトにする事で変数の意味を明確に出来、かつコンパイラにも情報を伝える事ができる

#4. 1行につきドットは1つまでにする
クラスを作成する時は1つのクラスは1つの責務を持つようにして作る
クラスに責務が複数あると凝集度が低くなり、修正が広範囲に広がり、保守性が悪くなるため。
また、ドットが多数繋がっている時点で他のオブジェクトの中を深く掘り進んでいる。つまり、カプセル化に反する

#5. 名前を省略しない

#6. 全てのエンティティを小さくする
50行を超えるクラス、10ファイルを超えるパケッージを作らない

#7. 1つのクラスに付きインスタンス変数は2つまでにする
インスタンス変数を追加すればするほど、凝集度が低くなる
クラスは1つの状態変数は通常持つ。
多くて2つ。
2つに抑えるようにする

#8. ファーストクラスコレクションを使用する
コレクションを持つクラスには他のメンバ変数を持たせないようにする
リストやマップなどのコレクションをラップしたクラスをファーストクラスコレクションと言う

#9. Getter, Setter, プロパティを使用しない
Getter, Setterメソッドを使用しない。
他のクラスでこれらを簡単に使い出すと、振る舞いが他のクラスに記述され、
使われているインスタンス変数の振る舞いが他のクラスにも生じてしまうため使わない。


この9つのルールは厳しいが、意識して行きたい。
JScript(Windows スクリプト ファイル)をUTF-8で書く

エンコード指定すれば問題なく実行できます。

```xml:test.wsf
<?xml version="1.0" encoding="utf-8" ?>
<package>
	<job>
	<?job error="True" debug="True" ?>
		<runtime/>
		<script language="JScript">
			<![CDATA[
			WScript.Echo("ほげ");
			]]>
		</script>
	</job>
</package>
```

ただし、ファイルを分割してインクルードすると文字コードのエンコードが上手く認識されないので、インクルードするファイルには _BOM_ を付けて下さい。

```xml:test.wsf
<?xml version="1.0" encoding="utf-8" ?>
<package>
	<job>
	<?job error="True" debug="True" ?>
		<runtime/>
		<script language="JScript" src="./test.js"/>
		<script language="JScript">
			<![CDATA[
			main();
			]]>
		</script>
	</job>
</package>
```

```js:test.js
function main()
{
	WScript.Echo("ほげ");
}
```
PythonでExcelファイルを作成 + similarity matrix

## はじめに

PythonでExcelファイルを作成するライブラリはいくつかあるが、[XlsxWriter](https://xlsxwriter.readthedocs.org/ "XlsxWriter")が次の理由でおすすめ。

* .xlsxファイルを出力できる
* 機能を出力のみに絞っているのでシンプルかつ強力

## インストール

```shell-session
$ pip install xlsxwriter
```

## 基本的な使い方

[公式サンプル](https://xlsxwriter.readthedocs.org/example_demo.html#ex-demo "Example: Simple Feature Demonstration — XlsxWriter Documentation")を適当に日本語訳

こう書くと

```py:xlsxwriter_demo.py
# 新しいファイルとワークシートを作成
workbook = xlsxwriter.Workbook('demo.xlsx')
worksheet = workbook.add_worksheet()

# 列Aの幅を変更
worksheet.set_column('A:A', 20)

# 太字にする書式を追加
bold = workbook.add_format({'bold': True})

# テキストの書き込み
worksheet.write('A1', 'Hello')

# テキストの書き込み・書式の適用
worksheet.write('A2', 'World', bold)

# 数値の書き込み（セル番地を数字で指定）
worksheet.write(2, 0, 123)
worksheet.write(3, 0, 123.456)

# 画像を挿入
worksheet.insert_image('B5', 'logo.png')

workbook.close()
```

こうなる

![demo.png](https://qiita-image-store.s3.amazonaws.com/0/41668/7292629a-9599-ad22-7401-96055e102d8b.png)


## similarity matrixの作成

ここからただの個人的メモ。

* カラースケールを使ってsimilarity matrix（[こういうやつ](https://www.google.co.jp/search?q=similarity+matrix "similarity matrix - Google 検索")）を作りたい
* 色指定の際、最大値と最小値を自動調整したい
* 対角要素は最大値・最小値の計算から除外しないといけない

たぶんnumpy, scipy, matplotlibとか使えばできるんだろうけど、とっさに思いついたのがxlsxwriterだった。
できたソースはこんな感じ。

```py:sim_matrix.py
# -*- coding: utf-8 -*-
import xlsxwriter
from xlsxwriter.utility import xl_rowcol_to_cell, xl_range_abs

# ワークブックとワークシートを作成
wb = xlsxwriter.Workbook("sim_matrix.xlsx")
ws = wb.add_worksheet("similarity matrix")

# データセルのサイズを設定
for i in range(5):
    ws.set_row(i, 40.5)
    ws.set_column(i, i, 6.0)

# データ入力
data = [[1.00, 0.15, 0.09, 0.01, 0.02],
        [0.15, 1.00, 0.12, 0.06, 0.03],
        [0.09, 0.12, 1.00, 0.08, 0.01],
        [0.01, 0.06, 0.08, 1.00, 0.05],
        [0.02, 0.03, 0.01, 0.05, 1.00]]
for i in range(5):
    for j in range(5):
        ws.write_number(i, j, data[i][j])

# 配列数式を使って対角要素を除く最大値・最小値を求める
data_field = xl_range_abs(0, 0, 4, 4)
ws.write_string(0, 6, "max sim")
max_formula = '{{=MAX(IF(ROW({0})=COLUMN({0}),"",{0}))}}'.format(data_field)
ws.write_formula(0, 7, max_formula)
ws.write_string(1, 6, "min sim")
min_formula = '{{=MIN(IF(ROW({0})=COLUMN({0}),"",{0}))}}'.format(data_field)
ws.write_formula(1, 7, min_formula)

# 条件付き書式を使ってカラースケールを適用
max_cell = xl_rowcol_to_cell(0, 7, row_abs=True, col_abs=True)
min_cell = xl_rowcol_to_cell(1, 7, row_abs=True, col_abs=True)
props = {
    "type": "2_color_scale",
    "max_color": "#FF6347", # tomato
    "min_color": "#FFFFE0", # lightyellow
    "max_type": "formula",
    "min_type": "formula",
    "max_value": max_cell,
    "min_value": min_cell}
ws.conditional_format(0, 0, 4, 4, props)

# 書き込み
wb.close()
```

こんなファイルが出力される。

![xlsxwriter_sim_matrix.png](https://qiita-image-store.s3.amazonaws.com/0/41668/64905cfb-97c8-2bed-f5bd-ca0c2f193814.png)
最近のインフラ系ツールが多すぎて何が何だかわからない！からの卒業

Docker ? Packer ? 何が違うの？と個人的にわけがわからなくなっていたのでまとめてみた

# インフラ系技術の 3 つのレイヤー
* Orchestration
    * アプリケーションのデプロイ
    * Capistrano
* Configuration
    * ミドルウェアレベルの設定
    * Chef, Puppet
* Bootstrapping
    * OS のインストールにあたる領域
    * Docker, Vagrant, Packer

* 今回は、Configuration ツールと Bootstrapping ツールの違いをまとめる


# Bootstrapping Tool

## Docker
[Docker 公式ページ](https://www.docker.io/)

* Linux コンテナの内部でアプリケーションを動作させるためのツール
* Go 言語で記述されている
* 環境構築は Dockerfile と呼ばれるファイルでコード化できる
* コンテナ型仮想化を提供するツール
    * イメージの作成から実行まで
* AWS の AMI に相当
    * ただし、AMI は AWS 上でのみ動かせるが、 Docker イメージは Docker が動く Linux マシンならどこでも動作する
* 個人的に使ってみた時のまとめ
    * [流行りにのるために Vagrant で用意した ubuntu に Docker を導入してみた](http://qiita.com/kasaharu/items/48b5c216248c6c7d147d)


## Packer
[Packer 公式ページ](http://www.packer.io/)

* VM のイメージを作成するツール
* Docker に近い
    * ただし、Docker は Docker 用のイメージを作成するのに対し、 Packer は Docker を含め、Amazon AMI や Vagrant Box, Virtualbox など複数のプラットフォームに対応できる

## Vagrant
[Vagrant 公式ページ](http://www.vagrantup.com/)

* 仮想マシンの作成、環境設定を自動化するツール
* 仮想マシンのイメージ(Vagrant Box) はすでに用意しているのを前提に、マシンを立ち上げるのに特化している
* 個人的に使ってみた時のまとめ
    * [Vagrant を使用して仮想マシンを作成してみる](http://qiita.com/kasaharu/items/5270f6d9737e7bd9b917)


# Configurarion Management Tool

## Chef
[Chef 公式ページ](http://www.getchef.com/chef/)

* サーバの設定やソフトウェアのインストールを自動化する管理ツール
* Recipe と呼ばれる設定ファイルは Ruby スクリプトになっている
* 個人的に使ってみた時のまとめ
    * [初めての Chef](http://qiita.com/kasaharu/items/395b55c06f8b4477019d)

## Puppet
[Puppet 公式ページ](http://puppetlabs.com/)

* サーバの設定やソフトウェアのインストールを自動化する管理ツール
* Chef に近い
* Chef より歴史は古い

## Ansible
[Ansible 公式ページ](http://www.ansible.com/home)

* Chef や Puppet に近い
* Python 製
* Push 型 : ホスト側にのみインストールすればよい (Chef では、ゲスト側にもインストールする必要がある)
* Chef と比較して構成がシンプル


# 参考ページ
* [インフラ系技術の流れ](http://mizzy.org/blog/2013/10/29/1/)
* [Dockerとは何か？どこで使うべきか？](http://deeeet.com/writing/2014/05/01/what-is-docker/)
* [DockerイメージのビルドにPackerを使うべき理由](http://deeeet.com/writing/2014/03/03/why-building-docker-by-packer/)
OBJC ブロックを使ってCSVファイルの読み込み

Objective-Cでブロックを使ったカンマ区切り(似非CSV)の読み込みの例。
類似フォーマットのファイル読み込みは、ブロック化すると汎用性が高まるかも。ちなみにCSVの読み込みは、本当にカンマを区切るだけです。

# Objective-Cで読む場合
[ソースコード(github)](https://github.com/hmuronaka/OBJC-HmuLibrary/blob/developping/HmuLibrary/TextFileHelper.m)

```objc
// CSVファイルを読み、１行毎にblockを呼び出す.
// blockの引数は、１行をカンマで分割した配列.
// 例: @"ab,cd,efg" なら@[@"ab,@"cd",@"efg"]を返す.
//
// @param comment 行頭にcommentがある場合は、その行を読み飛ばす. コメント不要の場合はnil.
+(BOOL)readCsv:(NSString*)filePath withCommentStr:(NSString*)comment block:(void (^)(NSArray*))block {
    // TestのためにmainBundleではなくbundleForClassを利用している。
    if( filePath == nil ) {
        return NO;
    }
    
    NSString* text = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
    if( text == nil ) {
        return NO;
    }
    NSArray* lines = [text componentsSeparatedByString:@"\n"];
    
    for(NSString* line in lines) {
        // 行頭にコメント文字列を含む場合は、その行を読み飛ばす.
        if( line.length == 0 ||
           (comment != nil && [line hasPrefix:comment])) {
            continue;
        }
        
        NSArray* item = [line componentsSeparatedByString:@","];
        block(item);
    }
    return YES;
}

+(BOOL)readCsv:(NSString*)filePath block:(void (^)(NSArray*))block {
    return [TextFileHelper readCsv:filePath withCommentStr:nil block:block];
}

```


```objc

Test.csvの内容
Test.csv=<<EOF
12,34,56
abc,de,fgh,
#, abcdefg,agd
ABC,,ABC
"ABC,DEF"
END
EOF

// 利用例
- (void)testReadCSVWithNoComment
{
    NSString* filePath = [[NSBundle bundleForClass:[self class]] pathForResource:@"Test" ofType:@"csv"];
    
    NSArray* expects = @[
                         @[@"12",@"34",@"56"],
                         @[@"abc",@"de",@"fgh", @""],
                         @[@"#",@" abcdefg",@"agd"],
                         @[@"ABC",@"",@"ABC"],
                         @[@"¥"ABC", @"DEF¥""],
                         @[@"",@"",@"",@"",@""],
                         @[@"END"]];

    __block int num = 0;
    
    [TextFileHelper readCsv:filePath block:^(NSArray* cols) {
        XCTAssertEqualObjects(expects[num], cols, @"index=%d", num);
        num++;
    }];
    
    XCTAssertEqual(num, expects.count, @"%d != %d", num, expects.count);
}
```

# ちなみにRubyでファイルからカンマ区切りを読むと...
※下記ソース,動作は未確認...

```rb
# gemを不使用の例.
def readCsv(filename, &block)
  File.open(filename) do |file|
    file.each_line do |line|
      # 行頭が#ならコメントとして読みとばす
      next if line =~ /^#/
      cols = line.split(/¥s*,¥s*/)
      block.call(cols) if block
    end
   end
end
```

それぞれの言語に良いところはあるけど、文字列処理はrubyの方が楽かな、と。
【JScript】クラスを定義する

# クラス定義

JScriptには class のような予約語が無いですが、functionを使ってクラスを定義することが出来ます。

## 例

ファイル名は任意。

```js
// TestClassクラスのコンストラクタとする
function TestClass(intParam)
{
	// プロパティ
	this.value = intParam;
	
	// メンバ関数
	this.Output = TestClass_Output;		// 関数名は何でもいい
}

// valueを出力する関数
function TestClass_Output()
{
	WScript.Echo("Value is " + this.value);		// プロパティは this を付ける
}


// インスタンス生成してメンバ関数呼び出し
var obj = new TestClass(10);
obj.Output();
```
テキストの横にアイコンを表示する際のレイアウト方法

こっちじゃなくて

```xml
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    >
<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:contentDescription="@drawable/icon_hoge"
    />
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="5dp"
    android:text="hoge"
    />
</LinearLayout>
```

こっち

```xml
<TextView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:drawableLeft="@drawable/icon_hoge"
    android:drawablePadding="5dp"
    android:text="hoge"
    />
```
Unity iOS でデバッグコンソールを出力するまで

プロビジョニングファイルと登録済み端末を用意する。
これがなければはじまらない。

![unity-log.png](https://qiita-image-store.s3.amazonaws.com/0/20773/4bf9f6e5-6a93-0f0f-6786-9233a4d33b33.png "unity-log.png")

Unity側の作業
==============================

ログ出力コードを記述
------------------------------

新規C#を作成

```csharp:DebugLog.cs
using UnityEngine;
using System.Collections;

public class DebugLog : MonoBehaviour
{
	void Start ()
	{
		Debug.Log("hello");	
	}
}
```

適当なGameObject（今回はMainCamera）に追加する
![add-component.png](https://qiita-image-store.s3.amazonaws.com/0/20773/553de8c7-be36-334d-9946-a1bbe381db52.png "add-component.png")

シーンを保存する
![save-scene.png](https://qiita-image-store.s3.amazonaws.com/0/20773/97d35cfb-cdf6-0b77-dccb-f78b95486bdb.png "save-scene.png")


ビルド設定
-----------------
File > BuildSettings

![build-settings.png](https://qiita-image-store.s3.amazonaws.com/0/20773/9f098f3a-172c-a4fa-0978-11c8a7b2822e.png "build-settings.png")


1. シーンを追加
2. iOSを選び [Switch Platrom] 
3. Development Build と　Script Debugging　にチェックをつける

ビルドする
-----------------
Xcode projectの保存先をきめてビルド開始。
完了したら Unity-iPhone.xcodeproj を開く。

Xcode側の作業
========================

署名などを設定する。
Debug information Format を DWARF にしておくと dSYM がスキップされて処理が速くなるらしい。

![xcode.png](https://qiita-image-store.s3.amazonaws.com/0/20773/86b7b96a-6ec0-269b-37d4-4e41712623a2.png "xcode.png")

で iphone つないだ状態で ⌘R で実機転送。
View > Debug Area > Active Console でコンソールがでてくる。
![console-log.png](https://qiita-image-store.s3.amazonaws.com/0/20773/cda14d0d-a5ef-1e25-5d29-b156c07fd478.png "console-log.png")
Chromeでインストールしてるエクステンション

* [Advanced REST Client](https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo)
 * Web APIのテストのために使う
* [AutoPagerize](https://chrome.google.com/webstore/detail/autopagerize/igiofjhpmpihnifddepnpngfjhkfenbp)
 * 次のページを自動的にページ下部に挿入してくれるアレ
* [Create Link](https://chrome.google.com/webstore/detail/create-link/gcmghdmnkfdbncmnmlkkglmnnhagajbm)
 * 現在のページのMarkdownのリンクを作ったり、コピーした文字列のリンクを作ったりする
* [CrxMouse](https://chrome.google.com/webstore/detail/crxmouse/jlgkpaicikihijadgifklkbpdajbkhjo)
 * マウスジェスチャ
* [EditThisCookie](https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg?hl=ja)
 * 今見てるサイトのCookieを見たり編集したりできる
* [Empty New Tab Page](https://chrome.google.com/webstore/detail/empty-new-tab-page/dpjamkmjmigaoobjbekmfgabipmfilij)
 * タブの初期状態を空にする
* Extensions Manager
 * あんま使ってない
* [Falcon Proxy](https://chrome.google.com/webstore/detail/falcon-proxy/gchhimlnjdafdlkojbffdkogjhhkdepf)
 * Proxy設定を簡単にするヤツ
* [GetTabInfo](https://chrome.google.com/webstore/detail/gettabinfo/iadhcoaabobddcebhmheikmbcjcigjhc)
 * 全タブのタイトルとURLを一括取得してクリップボードにコピーできる。HTMLタグ、短縮URL、QRコードも生成可能。テンプレートを使って任意のフォーマットでリンクを出力できる
* [JSONView](https://chrome.google.com/webstore/detail/jsonview/chklaanhfefbnpoihckbnefhakgolnmc)
 * JSONを整形して表示
* [LiveReload](https://chrome.google.com/webstore/detail/livereload/jnihajbhpnppcggbcgedagnkighmdlei)
 * HTML, CSS, JSを修正したら自動的にブラウザをリロードするヤツ
* [Pocket](https://chrome.google.com/webstore/detail/pocket-formerly-read-it-l/niloccemoadcdkdjlinkgdfekeahmflj)
 * あとで読む的なあれ
* [Pushbullet](https://chrome.google.com/webstore/detail/pushbullet/chlffgpmiacpedhhbkiomidkjlcfhogd)
 * スマホにURL送ったりするヤツ
* [RSS Subscription Extension](https://chrome.google.com/webstore/detail/rss-subscription-extensio/nlbjncdgjeocebhnmkbbbdekmmmcbfjd/related)
 * そのページのRSSがあったらURLバーにRSSアイコンを表示する
* [Sexy Undo Close Tab](https://chrome.google.com/webstore/detail/sexy-undo-close-tab/bcennaiejdjpomgmmohhpgnjlmpcjmbg)
 * 閉じちゃったタブでも開き直せる
* [StayFocusd](https://chrome.google.com/webstore/detail/stayfocusd/laankejkbhbdhmipfmgcngdelahlfoji)
 * 特定のドメインのサイトをN分以上見ないようにする。FacebookやTwitter見過ぎないように。
* [Tab Ahead](https://chrome.google.com/webstore/detail/tab-ahead/naoajjeoiblmpegfelhkapanmmaaghmi)
 * Option + Tでタブを検索
* [Tab Position Configure](https://chrome.google.com/webstore/detail/tab-position-configure/hfchebpfpmpdnninebmopbelkfhofgnd)
 * 新しくタブを開くときにどこに開くかを設定する。自分は現在のタブの右にしてる。これが地味に便利
Recursive-Macroexpansion

I made yet another macro-expansion system which allows for easier compile-time error handling.

Recursive-Macroexpansion has the completely different expansion algorithm than those of Common Lisp’s macro expansion. CL is based on `macroexpand-1` and `macroexpand` while Recursive-Macroexpansion is based on `rmacroexpand` only. However, normal macros are transparent to `macroexpand`, so mixing normal macro and recursive macro is completely ok.

**BIG NOTE** : This is my **FIRST** library written in controversial `CL21`. Thanks to **Fukamachi** !

https://github.com/guicho271828/recursive-macroexpansion
Entityに存在しないフィールド名をフォームに定義する

まえまでは、

```php
$builder->add('url','text'
    array(
        "property_path" => false,
    )
);
```
とすればよかったっぽいのですが、
>Expected argument of type "string or >Symfony\Component\PropertyAccess\PropertyPath", "boolean" given

引数は文字列かPropertyPathオブジェクトのはずなのに、真偽値がきちゃってるよ？と怒られます。


```php
$builder->add('url','text'
    array(
        "mapped" => false,
    )
);
```

こうすればok。
geeknote を Alfred から光の速さで呼び出す

1. geeknoteを設定する

http://qiita.com/torub/items/e2f3a81828f153bdc0b5

2. Alfred Powerpack を買う

https://buy.alfredapp.com/

3. Powerpack を設定する

![スクリーンショット 2014-05-03 17.50.18.png](https://qiita-image-store.s3.amazonaws.com/0/28835/ec7cdb05-12d6-12f2-77c3-41eea134a43d.png)

右下のテンプレートから "keyword to Terminal Command" で作成

    geeknote create --content WRITE --title {query}

![スクリーンショット 2014-05-03 17.50.34.png](https://qiita-image-store.s3.amazonaws.com/0/28835/d9fb1e87-9e58-32f7-cda8-a36346276e36.png)

好きなトリガーを(この例ではe2eにした)を設定してこのようなターミナルコマンドをぶちこむ．

![スクリーンショット 2014-05-03 17.56.54.png](https://qiita-image-store.s3.amazonaws.com/0/28835/ad273d79-0814-90c3-c43a-d16cfe52bdfc.png)

これで Alfred を呼び出して上のように打ち込むとtestというノートをEmacs上でマークダウン記法でかける．
xyzzyで連番を簡単に書きだす。0埋めもできるよ！

繰り返し機能の`ndmacro`を使って連番が作成できる。

## インストール方法

http://www.geocities.jp/kiaswebsite/xyzzy/ndmacro.html

からダウンロードしてきて使うか、Netinstallerに

http://www.geocities.jp/kiaswebsite/xyzzy/packages.txt

を追加してインストールする。

## 設定

どう設定するかは人によりけりだろうけど自分の場合は

```cl:~/.xyzzy.d/30-ndmacro.l
;ndmacro
(defconstant *ndmacro-key* #\C-t)
(global-set-key *ndmacro-key* 'ndmacro-exec)
(autoload 'ndmacro-exec "ndmacro" t)
```

ってやってる。

## 使い方

```
01
02
```
と打って`C-t`すると

```
01
02
03
04
05
...
```

と打つたびに追加される。

テキストエディタを使ってファイルを一括リネームする`Liname`と組み合わせて使うと便利！
[C#4.0以降] unboxingとcastが同時にできない問題を回避する方法

静的型付け言語のC#では、unboxing（up-castした型から元の型にdown-castする）

```csharp
object obj = (object)10; // intからobjectにup-cast
int intValue = (int)obj; // unboxing, down-cast, 例外は発生しない
```
とcastを同時に行うことができません。

```csharp
byte byteValue = (byte)(object)10;       // InValidCast例外, int -> object -> byte
double doubleValue = (double)(object)10; // InValidCast例外, int -> object -> double

T returnZero<T>(){
  return (T)(object)0; // InValidCast例外 int -> object -> T
}
var byteValue = returnZero<byte>();
var doubleValue = returnZero<double>();
```

あまり良い方法ではないのですが、C#4.0から導入された[dynamic](http://msdn.microsoft.com/ja-jp/library/dd264736.aspx)を用いると、この問題を回避できます。

```csharp
byte byteValue = (byte)(dynamic)10;
double doubleValue = (double)(dynamic)10;
```

dynamic便利ですね。幅広いコーディングが出来ます。
pyramidのadd_request_methodで付加した属性のテストの仕方

## pyramidのadd_request_method

pyramidのadd_request_methodというディレクティブでrequestが持つpropertyを付加することができる。
(過去にはadd_request_propertyというディレクティブも存在したが速攻でdeprecatedになった)

### add_request_methodの効果
document: http://docs.pylonsproject.org/projects/pyramid/en/latest/api/config.html#pyramid.config.Configurator.add_request_method

オプションについては以下２つを覚えておくと良い

- reify -- requestに属性を付加する。付加した属性はキャッシュされる
- property -- requestに属性を付加する。付加した属性は都度計算される

何も付けなければmethodとして付加される。(またreify=Trueならば自動的にpropertyとして付加される)

```py3
## configuration
def includeme(config):
    ## request.get_foo()として呼べる
    config.add_request_method(get_foo, "get_foo")

    ## request.fooとしてアクセスできる
    config.add_request_method(get_foo2, "foo", reify=True)
    config.add_request_method(get_foo2, "foo", property=True)
```


## add_request_methodで付加した属性のテスト

テスト。unit testならテキトウにmockを使ったり。dummyを使ったりでどうにかなる。
integration testの際にどうすれば良いかという話。

### add_request_methodで定義されたディレクティブが有効になるところ。

pyramidのコード見よう。pyramid/router.pyに答えが書いてある。
すごくざっくり言うと以下のことが分かる。

- add_request_methodはIRequestExtensionsというinterfaceをkeyに格納される
- pyramid.request.Request._set_extensions()で設定される

### テストの書き方の１例

以上を参考にintegration testの書き方の例
今回はrequest.fooを設定する。request.fooで取得できるか確認するだけ。

```py3
# -*- coding:utf-8 -*-
import unittest


## definition

foo = object()

def get_foo(request):
    return foo

def includeme(config):
    config.add_request_method(get_foo, "foo", reify=True)


## test

class Tests(unittest.TestCase):
    def _makeOne(self, config, path="/"):
        from pyramid.request import Request
        from pyramid.interfaces import IRequestExtensions

        request = Request.blank(path)
        extensions = config.registry.getUtility(IRequestExtensions)
        request.registry = config.registry
        request._set_extensions(extensions)
        return request

    def test_it(self):
        from pyramid.testing import testConfig

        with testConfig() as config:
            config.include(includeme)

            ### request time
            request = self._makeOne(config, path="/")
            self.assertEqual(request.foo, foo)

```
Soralized for Terminal.appメモ

MacのTerminal.appでSoralizedの設定を見直したのでdotfile以外の部分をメモする。

## カラースキーマのダウンロード
Terminal.app用のカラースキーマセットには

- https://github.com/altercation/solarized/tree/master/osx-terminal.app-colors-solarized/xterm-256color (Soralized公式)
- https://github.com/tomislav/osx-terminal.app-colors-solarized 

があるが、後者の方が具合が良かった。前者には以下の問題があった

- vimrcに``set t_Co=256``が必要
- Oh-my-zshの``agnoster``テーマの色が崩れる

## Powerlineフォントのダウンロード
- [Patched font Monaco for OSX Vim-Powerline](https://gist.github.com/baopham/1838072)
  - Monaco for Powerline.otf を利用
devブランチからmasterブランチへ、checkoutせずにmergeする方法


いちいちmasterにマージするだけで、checkoutするのは何かと面倒。
ワークコピーとか切り替わるのもやだし、なんとか綺麗にしたい。

git のpushはURLやリモート名だけでなく、ファイルパスも使えるので、

~~~~
git push . dev:master
~~~~

みたくしてやればいい。

高速前進がデフォだけど`-f`つけたら高速前進じゃなくても行ける。

そもそもローカルにmaster持つ必要なければ、

~~~~
git push origin dev:master
~~~~

でもいい。この場合ローカルのmasterは永久に更新されないので、`show-branch`した際にうざくなるから、こまめにmasterにもpullするか、いっそローカルのmaster削除しとくかする。
github からcloneしてきたリポジトリを綺麗さっぱり整理して、新しい気持ちで開発を始める


githubから落としてきたブランチには、リモートの追跡ブランチとかタグとかがいろいろついてきて、`show-branch`とかするときにうざい。
ログとかもcloneした時点で大量に残ってて、プロジェクトを始めるには何かと目障りなものです。
(もちろん、コミッターとして開発に参加する場合には重要な履歴になるのですが…)

## リモート追跡ブランチの削除  

git remote にはpruneという便利なサブ(サブ)コマンドがあるので、存在しないリモート追跡ブランチを全部きれいに消してくれるそうな。

なので、cloneしてきた後に,clone元リポジトリからの接続を切り離してpruneしてやればいい。

~~~~
$ git remote set-url origin <some_url>
$ git remote prune origin 
~~~~

ずっと手動で消してた…

開発初期で特にリモートが見つからない場合には、`<some_url>`には`.`を登録しとけばいいと思います。

## ログの削除

とりあえず`dev`として空のブランチを作る。

~~~~
$ git checkout --orphan dev
~~~~

ここでsquash mergeすればいいものだと思ってたら、どうやらそういうわけにも行かないみたい。

素直にaddしてcommitする。

~~~~
$ git add .
$ git commit -m first_commit
~~~~

masterブランチに強制統合

~~~~
$ git push -f . dev:master
$ git gc --aggressive
~~~~

これで完了。プロジェクトの履歴はなくなりコミット履歴が1つだけの状態になりました。

~~~~
$ git log
~~~~

ログを削除する事によって、履歴が(プロジェクトにとって)すっきりするほか、リポジトリサイズもいくらか縮小されます。
clone時点でかなりのリポジトリサイズを持っているようなオープンソースプロジェクトでは、`du -sh .git`でサイズの確認を取りながら、その効果を計測して見るといいかもしれません。

### 注意
後々パッチがリリースされた時のために、
どの時点のコミットをcloneしてきたか、ハッシュを控えといたほうが良いと思います。

あと、オープンソースプロジェクトのログを軽視する旨で書いているわけではありませんので、その点はご了承を。