OmniAICreator/Qiita-1.07M huggingface dataset:
titaniumで作ったアプリがメモリリークするときに行った対処法3つ

カメラを起動してバーコードを撮影し、そこから読み取ったISBNコードを使ってAmazonAPIを叩いたり何だりするアプリを作ったものの、やたらと落ちる。
そんなときに行った対処法です。
###HTTP通信
APIを叩くときなど使用頻度の高いHTTP通信ですが、[Titanium.Network.HTTPClient] (http://docs.appcelerator.com/titanium/latest/#!/api/Titanium.Network.HTTPClient)を使ったときにメモリリークが多発。
__原因：__単純に通信後メモリ解放が出来ていない
__解決：__通信終了後にonloadなどのコールバックメソッドにnullを渡してあげる
ということで、以下のように実装しました。

```test
var client =  Ti.Network.createHTTPClient({
  onload : function(e) {
　　/* 
　　 * 無事レスポンスが返ってきたときの処理
　　 * ex) nextScreen関数に返ってきたテキストを渡す
　　 */
　　nextScreen(this.responseText);

　　/* nullを渡してコールバックメソッドの解放 */
　　client.onreadystatechange = null;
　　client.onload = null;
　　/* HTTPClient自身にも */
　　client = null;
　},
　onerror : function(e) {
　　/* エラー時のステータス出力 */
　　Ti.API.info('error: ' + e.source.status);

　　/* nullを渡してコールバックメソッドの解放 */
　　client.onreadystatechange = null;
　　client.onerror = null;
　　/* HTTPClient自身にも */
　　client = null;
　},
　/* タイムアウト設定(1ミリ秒) */
　timeout: 1000
});

/* ついでにロード画面 */
client.onreadystatechange = function() {
　if (this.readyState == 2) {
　　$.loadImage.backgroundImage = "/img/画像ファイル";
　}
};
```

参考
- [Titaniumでネットワーク周りのメモリリークを回避する/M.P.B.](http://www.mountposition.co.jp/blog/?p=86)
### EventListener
次に取りかかったのが[EventListener](http://docs.appcelerator.com/titanium/3.0/#!/guide/Event_Handling)の見直し。
イベントリスナーを追加した場合、イベント終了時にイベントを削除する必要があるとのこと。
__原因：__イベントがずっと生きている
__解決：__用の済んだイベントを削除
ダイアログを例にとると、このように実装しました。

```
var arr = ["first", "secont", "third"];
var dialog = Titanium.UI.createOptionDialog();
　/* ダイアログのタイトルとオプション(選択肢)をセット */
　dialog.setTitle('ダイアログタイトル');
　dialog.setOptions(arr);
　
　/* オプションが選択されたときの処理 */
　dialog.addEventListener('click', function(event) {
　　number = event.index;
　　/* イベントリスナーの削除 */
　　dialog.removeEventListener("click", arguments.callee);
　});
```

参考
- [Documentation Guides - Managing Memory and Finding Leaks](https://wiki.appcelerator.org/display/guides2/Managing+Memory+and+Finding+Leaks)
### 画面遷移
画面遷移というか、結果として画面遷移に関係する形で解決したもの。
__原因：__ISBN読み込む→必要な情報取得→画面遷移&表示 の流れが早過ぎて忙しくなった
__解決：__余計な処理を間に挟む
画面遷移時に0.5秒のインターバルを設けました。

```
function openAndClose(controller){
　/* 0.5秒経過したら次の画面に遷移し、今の画面を閉じる */
　setTimeout(function(){
　　nextScreen.open();
　　$.Screen.close();
　}, 500);
}
```

と、書いたものの[fireEvent](http://docs.appcelerator.com/titanium/3.0/#!/api/Titanium.App-method-fireEvent)使えば余計な処理書かずに解決出来るらしいので、今度実装してみようかと思います。
Git bashとCygwinで同じvimを使う

少し設定関係でハマったのでメモ。

以下の条件全てに当てはまる方向けですが、それ以外の方にとっては役に立たないかと思います。

* Git for Windowsを使っている。
* Cygwinも使っている。
* Vimを使う機会が多く、カスタムしている。

だったら Linux 使えというツッコミは無しです。

---

Cygwin の vim はバイナリファイルなので、Git for Windows の vim 起動設定をいじることにします。

Git for Windows のインストーラでそのまま入れると大体は"C:\Program Files(x86)\Git\bin\"にある"vim"を編集します。  
Cygwin の vim へのパスは適宜読み替えてください。

```sh:vim
#!/bin/sh

exec /c/cygwin64/bin/vim "$@"
```

git bashで"cd /"を実行するとGitをインストールしたディレクトリに行ってしまいますが、実は"cd /c"で C: ドライブへ行けるのです。（補完が効かないから分かりづらい）

sh は Git for Windows で入れたもので、vim は Cygwin のものを使うという状態になります。

コミットは git gui で何とかなっても、rebase -i はどうにもならないので結構使ってます。

また、コマンドラインの操作をよくするなら、ConEmu がおすすめです。ただし、vim のマウスサポートが効かなくなるのが難点。 
だったら Linux 使えというツッコミは無しです。
ブロックに渡されている要素のインデックスを取得する

地味に考えてしまったのでメモ

```ruby
array =[3,6,2,5,4,7]
array.each{|item|
	p array.index(item)
}
```

問題は配列がユニークじゃないと前にある要素が吐かれる

###追記
「Rubyの配列はeachだよね！」という固定観念に囚われていたことに気付く．
Cでよくやるようにfor文でインデックスを使えばよかった．
Rubyならtimesメソッドとlengthメソッドがあるから楽チン．

```rb
array =[3,6,2,5,4,7]
array.length.each{|index|
	p array[index]
}
```

###更に追記
そもそもRubyは要素とインデックス両方をブロックに渡せるメソッドがあることをコメントで教えて頂いた．
そりゃあるよね．

```rb
array =[3, 6, 2, 5, 4, 7, 2, 3, 4]
array.each.with_index do |value, index|
  p index => value
end
```
yum groupinstallで、with_itemsを使う時はダブルクォートの位置に注意する。

> @kun432さんからの[コメント](http://qiita.com/volanja/items/eff51f4847fd226fdda4#comment-e8701665be31fdf4139b)にありますが、この記事はyumのgroup-nameを使用した場合に発生します。group-idを使用した場合にはスペースが含まれないので発生しません。


with_itemsのリスト内に書くグループ名にスペースが含まれると動かないことがあるので、ダブルクォートの位置に注意する必要があります。

## 実行環境
```
$ ansible --version
ansible 1.6.8 (release1.6.8 5a4f39bfbf) last updated 2014/07/30 23:46:08 (GMT +900)
```

## 対象環境
CentOS 6.4 64bit (virtualbox + vagrantで構築) 

#CentOS上でやりたいコード
```
yum groupinstall "Virtualization Client" "Virtualization Platform" "Virtualization Tools"
```

# NGな書き方
```
---
- hosts: server
  user: root
  tasks:
    - name: yum group-install
      yum: name={{ item }} state=present
      with_items:
        - "@Virtualization Client"
        - "@Virtualization Platform"
```

## NGな書き方の実行結果
```
$ ansible-playbook yum.yml -i hosts 

PLAY [server] ***************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [192.168.0.135]

TASK: [yum group-install] ***************************************************** 
failed: [192.168.0.135] => (item=@Virtualization Client,@Virtualization Platform) => {"failed": true, "item": "@Virtualization Client,@Virtualization Platform"}
msg: this module requires key=value arguments (['name=@Virtualization', 'Client,@Virtualization', 'Platform', 'state=present'])

FATAL: all hosts have already failed -- aborting

PLAY RECAP ******************************************************************** 
           to retry, use: --limit @/Users/Adr/yum.retry

192.168.0.135              : ok=1    changed=0    unreachable=0    failed=1  
```

スペースの部分で区切られてしまい、実行できません。


#OKな書き方

`{{ item }}`をダブルクォートで囲んであげればOKです。

```
---
- hosts: server
  user: root
  tasks:
    - name: yum group-install
      yum: name="{{ item }}" state=present
      with_items:
        - "@Virtualization Client"
        - "@Virtualization Platform"
```

## OKな書き方の実行結果
```
$ ansible-playbook yum.yml -i hosts 

PLAY [server] ***************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [192.168.0.135]

TASK: [yum group-install] ***************************************************** 
changed: [192.168.0.135] => (item=@Virtualization Client,@Virtualization Platform)

PLAY RECAP ******************************************************************** 
192.168.0.135              : ok=2    changed=1    unreachable=0    failed=0   
```
エクセルで特定の文字の前までを取り出す　応用編

[前回](http://qiita.com/yuwaita/items/b7445bcc7b09c143fcf7)の続きです。
エクセルで特定の文字の前までを取り出す方法の応用編です。
[Yahoo知恵袋](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1063517550)がとても参考になりました。こちらでは、特定の最後の文字以降を取り出す場合が書かれています。ありがたいです。

# 特定の文字の前までを取り出す　応用編

## やりたいこと

下記のような文字列がたくさんあって、最後の ( の前まで取り出したい。

`お知らせ＼(^o^)／(23)
がんばった((o(´∀｀)o))(16)
楽しい日記ヽ(ﾟ∀ﾟ)ﾒ(ﾟ∀ﾟ)ﾒ(ﾟ∀ﾟ)ﾉ(168)
怖い日記((((；ﾟДﾟ))))(2005)`

↓　こうしたい

`お知らせ＼(^o^)／
がんばった((o(´∀｀)o))
楽しい日記ヽ(ﾟ∀ﾟ)ﾒ(ﾟ∀ﾟ)ﾒ(ﾟ∀ﾟ)ﾉ
怖い日記((((；ﾟДﾟ))))`

## 書き方（A1に文字列があり★は文字列の中に出てこない前提での例）

`=LEFT(A1,FIND("★",SUBSTITUTE(A1,"(","★",LEN(A1)-LEN(SUBSTITUTE(A1,"(",""))))-1)`

## 説明

### `SUBSTITUTE(A1,"(","")`

SUBSTITUTEは文字列のなかの特定の文字を違う文字に置換できる関数。
SUBSTITUTE(文字列,検索文字列,置換文字列,[置換対象])

> （例）A1が　がんばった((o(´∀｀)o))(16)　の場合
> 　( が無くなり、　がんばったo´∀｀)o))16)　という文字列となる

### `LEN(A1)-LEN(SUBSTITUTE(A1,"(",""))`

LENは指定した文字列が何文字あるかを取り出せる関数。
ここでは元の文字列の文字数から、( を無くした文字列の文字数を引いている。
つまり、元の文字列に ( がいくつあるか、わかる。

> （例）A1が　がんばった((o(´∀｀)o))(16)　の場合
> 　元の文字列　がんばった((o(´∀｀)o))(16)　の文字数は　20
> 　( を無くした　がんばったo´∀｀)o))16)　の文字数は　16
> 　20 - 16 = 4
> 　元の文字列に ( は4つあることがわかった。

### `SUBSTITUTE(A1,"(","★",LEN(A1)-LEN(SUBSTITUTE(A1,"(","")))`

長い・・・
前の項で　`LEN(A1)-LEN(SUBSTITUTE(A1,"(",""))`　は　4　と
なった例があるので　例として　`SUBSTITUTE(A1,"(","★",4)`　を次で取り上げることにする。

### `SUBSTITUTE(A1,"(","★",4)`

SUBSTITUTEは文字列のなかの特定の文字を違う文字に置換できる関数。
SUBSTITUTE(文字列,検索文字列,置換文字列,[置換対象])

[置換対象]　というのは、置換する文字の場所の指定ができる。
何も書いていなければ、検索文字すべてが置換されるが
2　だと、検索文字が2番めに出てくるもののみが置換される。
3　だと、検索文字が3番めに出てきたもののみが置換される。

さきほどの例で　( の文字数が取り出せたので
[置換対象]　にその文字数を入れてやると
検索文字の最後のもののみ置換される。

> （例）A1が　がんばった((o(´∀｀)o))(16)　の場合
> 　4番めに出てきた ( のみ ★ に置換するので
> 　がんばった((o(´∀｀)o))★16)　という文字列となる。

### `FIND("★","がんばった((o(´∀｀)o))★16)")`

ここも例を生かして説明する。
FINDは検索した文字が文字列の何番目に最初に出てくるかを取り出せる関数。
FIND(検索文字列, 対象, [開始位置])

> この場合は、17番目に出てくるので、17 が取り出せる。

### `LEFT(A1,17-1)`

LEFTは先頭から指定されたところまで取り出せる関数。
LEFT(文字列, 文字数)

17番目に出てきた★からマイナス1して16、これが★の前までの文字数。
LEFTで先頭から16文字目までを取り出せる。

> がんばった((o(´∀｀)o))
> が取り出せました！
SoundCloud iOSアプリ開発 : アカウント認証

SoundCloudのAPIをつかったiOSアプリ開発の手順／ノウハウをまとめていくシリーズ。

今回はSoundCloudのアカウント認証について。

# はじめに

英語がスラスラ読める人は以下のSoundCloudのクイックスタートマニュアルも合わせて参照した方が理解が深まります。

参考：SoundCloud iOS SDK
http://developers.soundcloud.com/docs/api/ios-quickstart

# アカウント認証

### 事前準備

まずはアプリをSoundCloudに登録して、以下を取得する必要が有ります。
 * Client ID
 * Client Secret
 * Redirect URI for Authentication

アプリの登録方法は、
[SoundCloud iOSアプリ開発 : スタートガイド](http://qiita.com/ryotarolab/items/0f36ba9ac96190ead835#1-2)、もしくは、[SoundCloudクイックスタートマニュアル](http://developers.soundcloud.com/docs/api/ios-quickstart)をご参考ください。

### 認証


認証をおこなうには、以下のように事前準備で取得したClient ID、Client Secret、Redirect URI for Authenticationを引数に、SCSoundCloudクラスのsetClientIDを実行するだけでOKです。

``+ (void) initialize
{
    [SCSoundCloud setClientID:@"[Client ID]"
                       secret:@"[Client Secret]"
                  redirectURL:[NSURL URLWithString:@"[Redirect URI for Authentication]"]];
}
``

認証が成功したかどうかは、`[SCSoundCloud account]`で確認できます。もし、認証されていない場合は、`[SCSoundCloud account]`でnilが返ってきます。

また、上記関数を呼び出すクラスの冒頭では`SCUI.h`をインポートしておく必要があります。

#### 参考
[SCSoundCloudクラス - github -](https://github.com/soundcloud/CocoaSoundCloudAPI/blob/master/Sources/SoundCloudAPI/SCSoundCloud.m)

# おわりに

認証がおこなえると、トラックの取得や再生などSoundCloudのAPIを利用できるようになります。
次はトラック取得&再生編へ続きます（多分）。
jQuery mousewheel を使って横スクロールを使いやすく

#横スクロールは使いづらい
Windows系のマウスは縦スクロールのホイールが基本になっているので、
UIデザインでは基本的に横スクロールはタブーとされています。

#ポップアップなどで使う
時々、縦スクロールを横に変換しているサイトもありますが、
WEBページの流れを止めてしまって、ユーザビリティがよろしくないこともありますね。

しかし、ポップアップで画像を流したりしたい時には、
立てスクロールが使えた方が便利なケースがあります。

![スクリーンショット 2014-07-31 23.31.45.jpg](https://qiita-image-store.s3.amazonaws.com/0/50037/f03563e6-3397-2c46-a2aa-6b37ac419112.jpeg)


#jQueryプラグインのmousewheelを使って、縦スクロールを横方向に変換

```js:mousewheelイベントを拾う
$(".categories ul", $layer).mousewheel(function(e, delta) {
  var sl;
  sl = $(this).parent().scrollLeft() + (delta * -22);
  $(this).parent().scrollLeft(sl);
  return e.preventDefault();
});
```

```coffeescript:coffeescriptで
$(".categories ul", $layer).mousewheel((e, delta)->
  sl = $(@).parent().scrollLeft() + (delta*-22)
  $(@).parent().scrollLeft(sl)
  e.preventDefault()
);
```
Go言語でhttpサーバーを立ち上げてHello Worldをする

Go言語でシンプルにhttpサーバーを立ち上げる場合[net/http](http://golang.org/pkg/net/http/)を使う。

```go:server1.go
package main

import (
  "fmt"
  "net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "Hello, World")
}

func main() {
  http.HandleFunc("/", handler) // ハンドラを登録してウェブページを表示させる
  http.ListenAndServe(":8080", nil)
}
```

# ServeHTTPを使う

既存のstructや型に対して、`ServeHTTP`メソッドを用意することで
`http.Handle`に登録出来るようにする

```go
package main

import (
  "fmt"
  "net/http"
)

type String string

func (s String) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  fmt.Fprint(w, s)
}

func main() {
  http.Handle("/", String("Hello World."))
  http.ListenAndServe("localhost:8000", nil)
}
```

# `text/template`を使う

`ServeHTTP`を既存の型などに定義しなくても
`http.ResponseWriter`と`*http.Request`を引数に取る関数を用意すれば
ハンドラとして登録できる。
(こういうのは`Handler`インターフェースが正しく設定されていればいい、って説明になるのかな)

Goのテンプレートには [text/template](http://golang.org/pkg/text/template/) と [html/template](http://golang.org/pkg/html/template/) がある。
[text/template](http://golang.org/pkg/text/template/)を使う場合は以下のようになる。

```go:server2.go
package main

import (
  "net/http"
  "text/template"
)

type Page struct { // テンプレート展開用のデータ構造
  Title string
  Count int
}

func viewHandler(w http.ResponseWriter, r *http.Request) {
  page := Page{"Hello World.", 1}  // テンプレート用のデータ
  tmpl, err := template.New("new").Parse("{{.Title}} {{.Count}} count") // テンプレート文字列
  if err != nil {
    panic(err)
  }

  err = tmpl.Execute(w, page) // テンプレートをジェネレート
  if err != nil {
    panic(err)
  }
}

func main() {
  http.HandleFunc("/", viewHandler) // hello
  http.ListenAndServe(":8080", nil)
}
```

# ファイルのテンプレートを使う

テンプレート元の文字列をファイルから読み込みたい場合は
`func ParseFiles(filenames ...string) (*Template, error)`を使う。

```go:server.go
package main

import (
  "net/http"
  "text/template"
)

type Page struct {
  Title string
  Count int
}

func viewHandler(w http.ResponseWriter, r *http.Request) {
  page := Page{"Hello World.", 1}
  tmpl, err := template.ParseFiles("layout.html") // ParseFilesを使う
  if err != nil {
    panic(err)
  }

  err = tmpl.Execute(w, page)
  if err != nil {
    panic(err)
  }
}

func main() {
  http.HandleFunc("/", viewHandler) // hello
  http.ListenAndServe(":8080", nil)
}
```

テンプレートファイルを用意する

```html:layout.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>{{.Title}}</title>
  </head>
  <body>
    {{.Title}} {{.Count}} count
  </body>
</html>
```

実行

```bash
$ go run server.go
$ open http://localhost:8080 # Macの場合
```

ブラウザで “Hello World. 1 count” と表示される

# 参考

* [Go言語によるwebアプリの作り方](http://www.slideshare.net/yasi_life/goweb-16448500)
Mavericksにアップデートしたら(?)ImageMagickが動かなくなってた


Rubyでmin_magick使おうとしたらimagemagickが動かなくなってることに気がついた.
Mavericksにアップデートする前は使えてたのでアップデートしたのが原因と思ってます(確定ではないすが).

コマンド実行するとこんな感じのエラーがでる。

```
$ convert 
dyld: Library not loaded: /usr/local/lib/libltdl.7.dylib
  Referenced from: /usr/local/Cellar/imagemagick/6.8.9-5/bin/convert
  Reason: image not found
Trace/BPT trap: 5
```

--build-from-sourceを付けてインストールすると直るという方がいらっしゃったので
https://github.com/Homebrew/homebrew/issues/14325

```
$ brew uninstall imagemagick
$ brew install imagemagick --build-from-source
==> Installing imagemagick dependency: xz
==> Downloading http://fossies.org/linux/misc/xz-5.0.5.tar.gz
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/xz/5.0.5
==> make install
?  /usr/local/Cellar/xz/5.0.5: 58 files, 1.5M, built in 52 seconds
==> Installing imagemagick
==> Downloading https://downloads.sf.net/project/machomebrew/mirror/ImageMagick-6.8.9-5.tar.xz
######################################################################## 100.0%
==> ./configure --disable-osx-universal-binary --prefix=/usr/local/Cellar/imagemagick/6.8.9-5 --enable-shared --disable-static --without-pango --with-modules --disable-openmp --w
checking for lt_dlinit in -lltdl... no
checking if libltdl package is complete... no
configure: error: in `/private/tmp/imagemagick-Ml4Y/ImageMagick-6.8.9-5':
configure: error: libltdl is required for modules build
See `config.log' for more details

READ THIS: https://github.com/Homebrew/homebrew/wiki/troubleshooting

```
あれビルドにこける...

こうですか先生！
https://github.com/Homebrew/homebrew/issues/27226

```

$ brew remove libtool
$ brew install libtool --universal
$ brew uninstall imagemagick
$ brew install imagemagick --build-from-source

```

ビルド成功！

```
$ identify 20140405_194813-1.jpg 
identify: no decode delegate for this image format `JPEG' @ error/constitute.c/ReadImage/501.
$ brew install libjpeg
Warning: jpeg-8d already installed
```

jpegが入っているのに使えない〜.

```

$ brew uninstall jpeg
$ brew install jpeg
$ brew uninstall imagemagick
$ brew install imagemagick  --with-libtiff

```

再インストールしたら動いた。

```
$ identify 20140405_194813-1.jpg 
20140405_194813-1.jpg JPEG 2410x2075 2410x2075+0+0 8-bit sRGB 698KB 0.000u 0:00.000
```

最終的な原因がわからん...
Kandan 関連記事まとめ

# Kandan 関連記事まとめ

更新日: 2014/10/02 22:35:29

|No.|タイトル|作成日|ストック数|
|--:|:--|:--:|--:|
|1|[Hubot  forever で Hubot(Hubot-Kandan adapter) をデーモンとして起動する](http://qiita.com/tbpgr/items/eb876eb2847ef55e218e)|2014/08/11 21:46:22|2|
|2|[Hubot  自作Script  gitlab_api_sample.coffee - GitLab API を利用した Hubot - GitLab - Kandan の連携を検証するサンプル](http://qiita.com/tbpgr/items/d6272cdf911cefbc4ad1)|2014/08/26 21:38:46|1|
|3|[Hubot  自作Script  gitlab_ci_sample.coffee - GitLab CIとの連携を検証するサンプル](http://qiita.com/tbpgr/items/a2b0dfd88da34ea66e62)|2014/08/25 21:44:55|2|
|4|[Hubot  自作Script  gitlab_sample.coffee - GitLab - Hubot - Kandan の連携を検証するサンプル](http://qiita.com/tbpgr/items/9b3739b790cb52cb002d)|2014/08/16 02:03:31|5|
|5|[Kandan  Channel ( Room )](http://qiita.com/tbpgr/items/8536fb34811dd113f919)|2014/07/31 22:27:58|1|
|6|[Kandan  Emoji Support](http://qiita.com/tbpgr/items/815ab0a2345ca8d110d2)|2014/07/31 22:23:42|1|
|7|[Kandan  File のアップロード](http://qiita.com/tbpgr/items/fb86dff7879e030f15d3)|2014/07/31 22:26:27|1|
|8|[Kandan  Kandan1.1で Hubot を利用する場合の設定手順](http://qiita.com/tbpgr/items/73b68cec23888d4570cf)|2014/08/09 04:41:27|5|
|9|[Kandan  Media の削除方法](http://qiita.com/tbpgr/items/f1cf9c2a34af22949d3b)|2014/10/02 22:34:39|0|
|10|[Kandan  オープンソースの Private な Rails 製チャットサービス Kandan をインストールする](http://qiita.com/tbpgr/items/7a731a71546461f9860c)|2014/07/31 22:19:27|5|
|11|[Kandan  新規 Channel 作成時に Kanban 開発チームが見せる小粋な計らい？おせっかい？](http://qiita.com/tbpgr/items/c0f9690a33fb36c01796)|2014/07/31 22:30:37|1|
|12|[Kandan  画像 と 動画(youtube) の埋め込み](http://qiita.com/tbpgr/items/1b975c89be0a6e1689d2)|2014/07/31 22:29:23|1|
|13|[Kandan  通常のチャット](http://qiita.com/tbpgr/items/25037f7bd34a64fc91b5)|2014/07/31 22:21:37|1|
|14|[Reveal.js を利用した内部公開スライドサーバーでスライドの自動デプロイを行う](http://qiita.com/tbpgr/items/107d75bc8a4732d9c294)|2014/09/10 22:22:07|2|
|15|[Reveal.js を利用した内部公開スライドサーバー構成について](http://qiita.com/tbpgr/items/f9a0c3a04044918b2ace)|2014/09/10 01:28:28|7|
|16|[Ruby  Gviz で GitLab / GitLab CI / Kandan / Hubot の構成図を作成する](http://qiita.com/tbpgr/items/65104a129e5abef13148)|2014/08/25 21:36:30|5|
|17|[Ruby  Gviz で Reveal.js を利用したスライドサーバーの開発・運用構成図を作成する](http://qiita.com/tbpgr/items/4fff34ac86935e90372d)|2014/09/10 21:45:40|7|
|18|[スライドショーサーバー メニュー作成スクリプト + Hubot 連携](http://qiita.com/tbpgr/items/71cfe7715f97ee9042d8)|2014/09/11 21:44:38|1|
Kandan | 新規 Channel 作成時に Kanban 開発チームが見せる小粋な計らい？おせっかい？

# Kandan | 新規 Channel 作成時に Kanban 開発チームが見せる小粋な計らい？おせっかい？

## 概要
新規 Channel 作成時に Kanban 開発チームが見せる小粋な計らい（もしくは、おせっかい？）について。

## Channelの追加ダイアログ
Channel の追加ダイアログ表示時にランダムで以下の命名リストの中から
新規チャネル名のデフォルト値がダイアログにセットされています。

* A Dark Place
* Discotheque
* Dungeon
* Garden
* Lobby
* Office
* Palace
* Park
* Studio
* Temple
* War Room
* Zork

## 気になったので Kanban のソースコードを見てみる

下記コードを参照。（2014/07/31時点）
https://github.com/kandanapp/kandan/blob/master/app/assets/javascripts/backbone/views/create_channel.js.coffee#L13-L29

~~~coffee
# 略
# ：
createChannel: (event) ->
   names = [
     "A Dark Place",
     "Discotheque",
     "Dungeon",
     "Garden",
     "Lobby",
     "Office",
     "Palace",
     "Park",
     "Studio",
     "Temple",
     "War Room",
     "Zork"]

   # Inefficient random method but there are only a few names so it's
   # not an issue
   name = _.shuffle(names)[0]
# ：
# 略
~~~

固定でデフォルト値のリストを定義して、 underscore.js の shuffle メソッドで
ランダム抽出しているだけでした。

ここ、 `_.shuffle(list)[0]` にしてるけど `_.sampmle(list)` ほうがシンプルですよね？
*underscore.js* のコードも確認しましたが、 *sample* メソッドは内部的に *shuffle* を呼んでいるようですし
この場面では *sample* を使った方が良さそうです。

こちら、 underscore.js の sample のコード。すぐ上に shuffle のコードがあります。
https://github.com/jashkenas/underscore/blob/master/underscore.js#L345

気が向いたらプルリクしてみようかな。

## 参照
http://kandanapp.com/
Kandan | 画像 と 動画(youtube) の埋め込み

# Kandan | 画像 と 動画(youtube) の埋め込み

## 概要
画像 と 動画(youtube) の埋め込みについて。

## 詳細
Kandan では、画像の URL や youtube の動画の URL をCHATメッセージとして
POSTすると自動的に埋め込み形式で画像や動画が表示されます。

## 試行

* アップロード済みのRubyのアイコン画像を CHAT メッセージとして POST してみます

![images_youtubes1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/c9b56bf5-7cc3-8110-e27b-7d2d3b1c8b9e.png)

![images_youtubes2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/31cb1f1a-8266-93c9-196b-25ec18baecf2.png)

* 続いて、Kent Beckの「Ease at Work」の動画を CHAT メッセージとして POST してみます

![images_youtubes3.png](https://qiita-image-store.s3.amazonaws.com/0/43480/85f3cdcf-6ce5-c17a-9e67-5457f4580097.png)

![images_youtubes4.png](https://qiita-image-store.s3.amazonaws.com/0/43480/da08277e-15a9-592d-2016-7da4d38959fb.png)

## 参照
http://kandanapp.com/
jsでhtmlをincludeするやつ

# はじめに

htmlでサイトを作っていて40ページ位になったのでメニュー更新増えるとめんどくさー。からの、phpかけないー。からの、最近勉強を初めたjsでメニュー読みこめばいいじゃん。です。いいんです、デザイナーとかじゃないので。
(調べてるうちにjsでやるあれじゃないよっていうのは百も承知で。)

# 最初に思いついたのはjQueryでhtml()

コードはざっくり書くとこんな感じ。

``` index.html

<!doctype html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="Content-Style-Type" content="text/css" />
  <link rel="stylesheet" type="text/css" href="./css/common.css" />
  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
  <script type="text/javascript" src="/manual/js/breadCrumb.js"></script>
  <title>title</title>
</head>
<body>
  中略
  <header>
    <div class="sidebar" id="sidebar">
      <script src="./js/inc_sidebar.js"></script>
    </div><!-- /sidebar -->
  </header>
  中略
</body>
</html>
```

で、jsはこんな感じ

``` inc_sideber.js
$(document).ready(function() {

  var html = "\
  <ul class=\"reset_mgpd\">\
          <li class=\"side_title center\">マニュアルメニュー</li>\
          <li class=\"side_m_title\"><span class=\"color_mark\">▼</span> マニュアルページトップ</li>\
          <li class=\"side_text\"><span class=\"color_mark\">-</span> <a href=\"/manual/index.html\">マニュアルページ トップ</a></li>\
  </ul>\
  ";
  // ↑メニュー的なやつ

  $('div#sidebar').html(html);
});
```

という感じで、jsにはヒアドキュメントっぽいのが無いとお聞きしていたのでエスケープしながら複数行のHTMLを変数に突っ込んでそいつを該当のIDに投げ込んでやるやつです。

## 意図した感じに読み込まれたんだけどIE8がマジで

タイトルそのまんまなんですけど、IE9以上は表示されて、FIREFOX,chrome,operaとか問題なく大丈夫。IE8だけほんとダメで、この直前にjQuery2系のせいか？（IE8以下をサポートしません宣言とかで）とおもったんですが、1系にしても普通にダメでした。私は2つのことを思いました。

「これはjQueryに頼らず書けって神様が言ってる」
「IE8さんぱねーっす、かっけーマジファック、まだシェア20%もあんのかよ」

# jsオンリーで書いてみる

コード量が数行なので、jsオンリーでも問題ないだろうと思って。案の定特に行数は代わりませんでした。
htmlはさっきのからjquery部分を抜いただけなので割愛します。

``` inc_sidebar2.js

  var html = "\
  <ul class=\"reset_mgpd\">\
          <li class=\"side_title center\">マニュアルメニュー</li>\
          <li class=\"side_m_title\"><span class=\"color_mark\">▼</span> マニュアルページトップ</li>\
          <li class=\"side_text\"><span class=\"color_mark\">-</span> <a href=\"/manual/index.html\">マニュアルページ トップ</a></li>\
  </ul>\
  ";

  document.getElementById('sidebar').innerHTML = html;

```

こんなかんじになりまして、

・何か特に理由もなく使っていた$(document).readyのあたりがなくなった
・要素を探す$周辺がdocument.getElementByIdになった
・jQueryの.html()が.innerHTMLになった

なんかこれだけでIE8でも動いたので、やったー文明の勝利だーとなりました。
（今これを書いていて、もしかして$(document).readyが要らなかったじゃないかと思ってヒヤヒヤですが、まぁいいんです。）

# 余談

ちなみにjsでincludeしないほうがいいんじゃないか説ですが

・SEO的にコードがそのまま残る書き方だと考慮してくれるとは言え弱くなると聞いた
・jsだとクライアント任せになるので実行されない設定だと詰む
・何かよくわからないですけどSSIが良さそうです。

あとで書き直すかもしれませんが、私からは以上です。
Kandan | Channel ( Room )

# Kandan | Channel ( Room )

## 概要
Channel ( Room )のサポートについて。

Kandan は話題・プロジェクト・チームごとなどテーマごとにチャットを使い分けるための
Channel ( Room )があります。

※公式サイト、 GitHub のリポジトリを両方参照したが Channel と Room の両方の用語が
使われていてどちらが正式名称かよくわからない。
Rails の Model は Channel になっています。

## Channel追加
* ＋タブを押下すると、入力ダイアログが表示され新規の Channel を追加できます。

![channel1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/cd81fb82-eda4-adf5-7068-194fd04ef746.png)

* Hoge Channel を作ってみます

![channel2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/fc8689b5-427b-b409-83ef-abab5cd6919a.png)

* Hoge Channel ができたことを確認する

![channel3.png](https://qiita-image-store.s3.amazonaws.com/0/43480/17d689ab-d2e4-e8fd-1257-4419d5da0d13.png)

## Channel の削除

* Channel のタブの右端にあるバツマークのアイコンを押下する

![channel4.png](https://qiita-image-store.s3.amazonaws.com/0/43480/ba517e16-9a0c-d2e1-814a-c8bd3b4ab06a.png)

* 確認ダイアログが表示されるので OK を押下する

* Channel が削除されました

## 参照
http://kandanapp.com/
Kandan | File のアップロード

# Kandan | File のアップロード

## 概要
ドラッグ＆ドロップで手軽にファイルをアップロードできます。

## 詳細
アップロードに関する制限などについて
アップロードに関する設定は、ソースコードである程度確認できました。

https://github.com/kandanapp/kandan/blob/master/app/assets/javascripts/lib/jquery.filedrop.js

~~~javascript
      allowedfiletypes:[],    // 許可ファイルタイプ未設定＝全許容？
      maxfiles: 25,           // ファイル数が25以上の場合は無視
      maxfilesize: 1,         // ファイルサイズは1MBまで
      queuefiles: 0,          // Max files before queueing (for large volume uploads)
      queuewait: 200,         // Queue wait time if full
~~~

## アップロードを試行

* 画面内のどこでもドラッグ & ドロップでアップロードできます。 sample.html をアップロードしてみます。

~~~html:sample.html
<input type="button" name="btn" value="hoge" onclick="alert('hoge');" />
~~~

![file1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/5efb4279-b095-376b-4600-a0b4d9b472f1.png)

* アップロード後、画面右側の MEDIA にアップロードしたファイルが追加されています

![file2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/4d1c5d1d-3e5b-636b-f6d4-50813f160597.png)

* MEDIA / sample.html のリンクを押下するとアップロードしたファイルを確認できます

なんと、htmlとして実行されるため内部の JavaScript が実行できてしまいます。
Kandan を内部利用する場合はいいですが、Heroku + 公開設定などで利用する場合は注意が必要そうです。
(さらに、このファイルをアップロードされた領域は Kandan にログインしていない状態でも参照可能です。)

![file3.png](https://qiita-image-store.s3.amazonaws.com/0/43480/74e27dc9-f16f-c317-e885-840117e101cd.png)

* 続いて Ruby のアイコン（ruby.jpg）をアップロードしてみます

![file4.png](https://qiita-image-store.s3.amazonaws.com/0/43480/0810a695-65a7-5542-abd7-6586459bd0f6.png)

* MEDIA / ruby.jpg のリンクを押下するとアップロードした画像ファイルを確認できます

![file5.png](https://qiita-image-store.s3.amazonaws.com/0/43480/0220b194-9ef6-d40d-3411-0f43562dee9a.png)

## 参照
http://kandanapp.com/
Kandan | Emoji Support

# Kandan | Emoji Support

## 概要
Emojiのサポートについて。

KandanはEmoji(絵文字、Emoticon)をサポートしています。

## 詳細
チャット入力欄に絵文字を表す文字列を入力して、Enterを押下するか、
POSTボタンを押下することでチャットを送信します。

絵文字は :smile: のようなフォーマットです。

~~~
:s
~~~

などのように、コロンと英字を入力した段階でサジェスト＋絵文字の画像プレビューが表示されます。

2014/07/31現在の動作ですが、新規に作成したばかりのルーム(Channel)に関してはサジェスト機能が動作しないようです。
再ログインすることで、サジェスト機能が有効になります。

## 絵文字文字列入力中イメージ

![emoji1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/b7645368-00df-bab7-43bb-022b0307955a.png)

## 絵文字列送信後イメージ

![emoji2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/ecc3484a-cde7-9bf1-193e-ce87bdf3ec1a.png)

## 参照
http://kandanapp.com/
Kandan | 通常のチャット

# Kandan | 通常のチャット

## 概要
通常のチャットについて

## 詳細
チャット入力欄に文字列を入力して、Enterを押下するか、
POSTボタンを押下することでチャットを送信します。

複数行のメッセージを送りたい場合は、***Shift*** + ***Enter*** で改行するか、
別途外部のエディタで改行付きの文字列を作成した上でコピペすることで対応可能です。

URLを入力した場合は、自動でリンクになります。

## 文字列入力中イメージ

![chat1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/4dcdb584-bebd-ed0e-a635-9bdac94bb4aa.png)

## 文字列送信後イメージ

![chat2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/eb2dd1d2-83bd-480b-23d8-c9f5efc27ad6.png)
Kandan | オープンソースの Private な Rails 製チャットサービス Kandan をインストールする

# Kandan | オープンソースの Private な Rails 製チャットサービス Kandan をインストールする

## 概要
オープンソースのPrivateなチャットサービス Kandan をインストールします。

業務の制約で、 HipChat / Idobata などの外部のチャットサービスを利用できない場合に
代替ツールとなるのが Kandan です。

Kandan は Ruby on Rails 製のWebサービスです。

## インストール環境
* Ubuntu 14.04 LTS

## インストール手順
基本は下記ページの手順にそってインストールします。
今回は private server へのインストールをします。

https://github.com/kandanapp/kandan/blob/master/DEPLOY.md#standalone-server

## インストールの確認

http://some_ip_or_domain:3000 にアクセスする。
デフォルトで管理ユーザーの設定が User:Admin, Pass: kandanappadmin になっているので
ログインしてパスワードを変更する。

![kandan_install1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/4401b9c6-4ea7-1409-a17a-f1613201b219.png)

![kandan_install2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/3fada735-e666-cf04-0d3d-995bfdb84847.png)

## 参照
Kandan 公式サイト
http://kandanapp.com/

公式ブログ
http://kandanapp.com/blog/

Kandan GitHub
https://github.com/kandanapp/kandan
RuboCop | Style/TrailingBlankLines

# RuboCop | Style/TrailingBlankLines

## 概要

RuboCopの「Style/TrailingBlankLines」警告について。

ファイルの末尾の行に余分な空白があるかチェックをする。
デフォルトでは末尾に1行の空行がある状態を正常とします。

## TrailingBlankLines

### 設定値一覧

|設定対象|対象|内容|デフォルト|
|:-----|:--|:---|:---:|
|EnforcedStyle|final_newline|最後に新たな行を必要とするか|○|
|EnforcedStyle|final_blank_line|最後に空白行がある場合もエラーとする|--|

### 検証プログラム

※Markdown変換時に空行が消えてしまうため、本来はコード中にはない全角空白を追加してあります

~~~ruby:trailing_blank_lines1.rb
print 'hoge'
　
~~~

~~~ruby:trailing_blank_lines2.rb
print 'hoge'
　
　
~~~

~~~ruby:trailing_blank_lines3.rb
print 'hoge'
~~~

### 実行結果 デフォルト の場合

~~~yaml:.rubocop.yml
TrailingBlankLines:
  EnforcedStyle: final_newline
~~~

~~~bash
$ rubocop trailing_blank_lines1.rb
Inspecting 1 file
.

1 file inspected, no offenses detected

$ rubocop trailing_blank_lines2.rb
Inspecting 1 file
C

Offenses:

trailing_blank_lines2.rb:2:1: C: 1 trailing blank lines detected.

1 file inspected, 1 offense detected

$ rubocop trailing_blank_lines3.rb
Inspecting 1 file
C

Offenses:

trailing_blank_lines3.rb:1:13: C: Final newline missing.
print 'hoge'


1 file inspected, 1 offense detected
~~~

### 実行結果 final_blank_line に設定した場合

~~~yaml:.rubocop.yml
TrailingBlankLines:
  EnforcedStyle: final_blank_line
~~~

~~~bash
$ rubocop trailing_blank_lines1.rb
Inspecting 1 file
C

Offenses:

trailing_blank_lines1.rb:2:1: C: Trailing blank line missing.

1 file inspected, 1 offense detected
$ rubocop trailing_blank_lines2.rb
Inspecting 1 file
.

1 file inspected, no offenses detected
$ rubocop trailing_blank_lines3.rb
Inspecting 1 file
C

Offenses:

trailing_blank_lines3.rb:1:13: C: Final newline missing.
print 'hoge'


1 file inspected, 1 offense detected
~~~

## 対象コード

https://github.com/bbatsov/rubocop/blob/master/lib/rubocop/cop/style/trailing_blank_lines.rb
https://github.com/bbatsov/rubocop/blob/master/spec/rubocop/cop/style/trailing_blank_lines_spec.rb

## 補足

この警告は rubocop -a で修正可能です。

## RuboCopまとめ記事

http://qiita.com/tbpgr/items/edbfecb6a6789dd54f47
Dockerメモその1 -コンテナが立たない-


最近Docker触ってるのでメモがてらハマりポイントをまとめます。

##現象
コンテナが立たない。最初はdocker run -d してるのにdocker psにでてなくておや？と思いました。docker run -itしてみてもやっぱり立ち上がりません。
##原因
容量不足。
##解決法1
コンテナおよびイメージを削除する。
イメージを削除するにはそのイメージのコンテナを削除しなければならず、コンテナを削除するにはまずコンテナを停止しなければいけません。ということで
コンテナ停止->コンテナ削除->イメージ削除の順で行います。

```bash:コンテナ停止
#コンテナのIDを確認
$ docker ps 
#停止
$ docker stop ${CONTAINERID}
```

```bash:コンテナ削除
$ docker rm ${CONTAINERID}
```

```bash:イメージ削除
$ docker rmi ${IMAGEID}
```

選ばず全部削除、みたいにするには以下
[追記]コメントより追記しました。ありがとうございます。

```bash:全削除
#コンテナ削除
$ docker rm $(docker ps -q -a)
#イメージ削除
$ docker images | grep -v REPOSITORY | awk '{print $3;}' | xargs docker rmi
```

##解決法2
1やったのにコンテナもイメージも全部削除したのにディスク容量が変わらない。。。
調べてみるとカーネルのバグで一部OSではだめなようです。
https://github.com/docker/docker/issues/3182
今回はCentOS6.5でこれにひっかかりました。
どうにもなんないので、容量食ってるディスクを消します。ターゲットは/var/lib/docker.
ただしこの場合コンテナすべて削除してしまいますので、RepositoryにCommitしとくなりDockerfileにすべて記述しておいて再度Buildできるようにしておくことが必要です。

```bash:ファイル削除
/etc/init.d/docker stop
rm -rf /var/lib/docker
/etc/init.d/docker start
```
##まとめ
Dockerは容量不足でコンテナが立たなくなる。Dockerのコンテナが容量を食ってる場合があるので、イメージ／コンテナを削除する。
一部OSでそれでも容量が回復しない場合、直接/var/lib/docker以下を削除する。
【エラー】Refusing to install as a dependency of itself

#エラーの原因

###可能性１

インストールしようとしているパッケージ内で、npm installを実行している。

###解決策

既にインストールされてる奴使いましょう。


###可能性２

プロジェクト名が、インストールしようとしているパッケージと同じ。
プロジェクト名とは、package.jsonのnameプロパティに与えられている名前になります。
このプロパティの値が、インストールしようとしているパッケージ名と被ると上記のエラーになります。

###解決策

プロジェクトの名前(上記のプロパティの値)を変えましょう。
virtualenv(virtualenvwrapper)を使ってみる

# virtualenv(virtualenvwrapper)を使ってみる

pyenvを使えばディレクトリごとにPythonのバージョンを選択できて環境を汚さないけれど、pipに関してはどうしてもグローバルにインストールされてしまってプロジェクトごとの管理ができない。

そんなときにvirtualenvを利用することで、Pythonの仮想環境を用意し、その中でPythonのバージョンやモジュールを管理することができる。そして、そのvirturalenvをさらに便利に拡張したのがvirtualenvwrapper。だそうだ。


## virtualenvwrapperのインストール

### Mac OS Xかつhomebrew、pyenvを利用している場合

brewでインストールできる

```
$ brew install pyenv-virtualenvwrapper
```

`~/.bashrc`や`~/.zshrc`に以下を記述

```
$ vim ~/.zshrc
export PYENV_VIRTUALENVWRAPPER_PREFER_PYVENV="true"
pyenv virtualenvwrapper

$ source ~/.zshrc
```

参考：[https://github.com/yyuu/pyenv-virtualenvwrapper](https://github.com/yyuu/pyenv-virtualenvwrapper)

## virtualenvで仮想環境を作ってみる

```
$ mkvirtualenv testenv
(testenv) $ 
```

`mkvirtualenv ENVNAME`で仮想環境が作成できる。ENVNAMEは仮想環境の名前。  
仮想環境内にいるときは`(testenv) $`と、仮想環境名がプロンプトに表示される。

ほんとに環境が違うか試してみる。

```
(testenv)$ pip list
pip (1.5.6)
setuptools (3.6)
```

`pip list`でpipでインストールされたパッケージ一覧が表示される。  
仮想環境を抜けて、通常環境で`pip list`を表示してみる。仮想環境を抜けるには、`deactivate`コマンドを使う。

```
(testenv)$ deactivate
$ pip list
argparse (1.2.1)
pip (1.5.6)
setuptools (5.4.1)
stevedore (0.15)
virtualenv (1.11.6)
virtualenv-clone (0.2.5)
virtualenvwrapper (4.3.1)
```

しっかり通常環境と仮想環境と分けられていることがわかる。
また作成済みの仮想環境に入る場合は以下のコマンドで入れる。

```
$ workon testenv
(testenv)$
```

その他、virtualenvwrapperの使い方は[ドキュメント](http://virtualenvwrapper-docs-ja.readthedocs.org/en/latest/)を参照
続・Pythonの開発環境整えてみたメモ on Mac OS X

# 続・Pythonの開発環境整えてみたメモ on Mac OS X

pipとDjangoのインストール。
けっこう手順が多くて文量も多くなるかとおもいきや、とてもカンタンだった。

環境：Mac OS X 10.9.4(Mavericks)
前提：homebrewインストール済み & Pythonインストール済み([Pythonインストール手順](http://qiita.com/takaya1992/items/be040823258ee6c1f90a))


## pipをインストール

pipとは、Pythonのパッケージ管理システムらしい。

```
$ curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python
```

これでインストールできる。が、こちらの環境だとすでにインストール済みだった。
pyenvでPythonをインストールした際に一緒にインストールされたらしい。([Pythonの開発環境整えてみたメモ on Mac OS X](http://qiita.com/takaya1992/items/be040823258ee6c1f90a))


## Djangoのインストール

とてもラクチン

```
pip install Django == 1.6.5
```
has_one と belongs_to についての復習


belongs_to の使い方を理解したのでメモ
has_one と belongs_to はセットで使用する。

従属する側のモデルに belongs_to を記述し、
従属させる側のモデルに has_one を記述する。

下記のような具合


```idea_explanation.rb
class IdeaExplanation < ActiveRecord::Base

  belongs_to :idea                                                                                                                                                              

end
```

```idea.rb
class Idea < ActiveRecord::Base
                                                                                                                                                              
  has_one :idea_explanation

end
```

上記のように書いておくとIdea モデルのオブジェクトから idea_explanation モデルオブジェクトに下記のようにアクセスできる。

```irb
irb(main):006:0> Idea.find(1).idea_explanation
  Idea Load (0.4ms)  SELECT `ideas`.* FROM `ideas` WHERE `ideas`.`id` = 1 LIMIT 1
  IdeaExplanation Load (0.4ms)  SELECT `idea_explanations`.* FROM `idea_explanations` WHERE `idea_explanations`.`idea_id` = 1 LIMIT 1
=> #<IdeaExplanation id: 1, idea_id: 1, created_at: nil, updated_at: nil>
```

外部のIDを持っているモデルはbelongs_to
持っていないモデルにはhas_one という理解で問題無いと思われる。
[Rails]多言語対応する時にとりあえず導入したいi18nテンプレート


[i18n-rails](https://github.com/svenfuchs/rails-i18n)というステキテンプレートがあります。


[こちら](https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale/)に各言語のi18nのymlファイルがまとまってるので必要なファイルダウンロードして楽に他言語対応できますね。



#### 時間系

```
  date:
    abbr_day_names:
    - 日
    - 月
    - 火
    - 水
    - 木
    - 金
    - 土
```

#### エラー系

```
  errors:
    format: ! '%{attribute}%{message}'
    messages:
      accepted: を受諾してください。
      blank: を入力してください。
      present: は入力しないでください。
      confirmation: と%{attribute}の入力が一致しません。
```

#### ヘルパ系

```
  helpers:
    select:
      prompt: 選択してください。
    submit:
      create: 登録する
      submit: 保存する
      update: 更新する
```

それ以外にも色々あります。ぜひ。
gitであるファイルを変更前の状態に戻したり、全部のファイルを変更前に戻したり

人生は変更前に戻せませんが、gitで管理しているソースコードは変更前に戻せます！

```
git checkout hello.rb
```

これで変更前（直前のコミットの状態）に戻せます。

また、全部戻したい時は、

```
git checkout -f
```

これでそのプロジェクト内のファイルを全部直前のコミットの状態に戻せます。

色々いじったけど戻さなきゃいけなくなった時にぜひぜひ。
neovimでsyntax onするとエラーが出る場合の対処

neovimの場合、設定ファイルは`.vimrc`ではなく`.nvimrc`。

設定ファイル内で`syntax on`すると、起動時にエラーが出た：
https://github.com/neovim/neovim/issues/601

```
E484: Can't open file /usr/local/Cellar/neovim/HEAD/share/vim/syntax/syntax.vim
```

`VIMRUNTIME`環境変数を設定してneovimを起動：

```
VIMRUNTIME=/usr/local/share/vim/vim74 nvim
```

alias張りました。
TextViewの文字列が中央揃えになってくれなくて悲しい


# いざ中央揃え…あれ？
TextViewに入れた文字列を中央揃えで表示したい！

TextViewには`setTextAlignment()`という、すごくそれらしいメソッドがあります。
しかしこいつ、どんな値を設定しても、文字列は中央揃えになってくれませんでした。

# 解決策
先に結論から。

*`setGravity()`*を使いましょう。

Android StudioのGUIエディタでは、`gravity`と書かれた項目です。
_`layout:gravity`_ではないので注意しましょう！！！

![gravityの方](https://qiita-image-store.s3.amazonaws.com/0/41896/55cadebd-25c0-cafc-5e22-32da27fd8fae.png "スクリーンショット 2014-07-31 18.49.57.png")

# なぜ`setTextAlignment()`では中央揃えにならないのか

実は`setTextAlignment()`は、TextViewではなく、その基底クラスのViewのメソッド。
どんな処理をしているのか、イマイチよくわかりません。
（SDKのソース読んでも、なにがしかのレイアウトに影響するフラグをゴリゴリいじってることしかわかりませんでした）
詳しい方、このメソッドの存在意義を教えて下さい…

追記
@bilyakudan が以下のリンクを教えてくれました。

[Text/Layout Alignment in Android (textAlignment, gravity)](http://stackoverflow.com/questions/16196444/text-layout-alignment-in-android-textalignment-gravity)

結局、`setTextAlignment()`が何をしてくれるのかは闇の中のようです…
SwiftでNSManagedObjectのSubclassを使う時の罠と回避策


はじめに
======

Xcode6 beta4 で、SwiftでCoreDataを利用したいときに、
NSManagedObjectのSubclassを使うといろいろ罠があるので共有します。
何かしらのバグっぽいので、いずれ不要になることを願います。

断片的に色々情報がありますが、最終的には以下の記事が参考になりました。
http://www.sep.com/sep-blog/2014/06/23/a-c-developer-learns-swift-part-1-core-data/


@objc(HogeEntity) の おまじない
=====

----
**【更新】2014/8/2** 
これは付けないほうが良さそうです。
[SwiftでNSManagedObjectのSubclassを使う場合は、対応Class名にモジュール名のPrefixを付ける](http://qiita.com/mokemokechicken/items/9cb875cc4143947fcc06)

---


まず、 NSManagedObject の Subclassは **@objc(EntityClass)** を付けておきます。

```
@objc(ChildEntity)
class ChildEntity: NSManagedObject {
    @NSManaged var identity: String
    @NSManaged var name: String?
    @NSManaged var birthday: NSDate?
    @NSManaged var sex: Int
    @NSManaged var imageFile: String?
}
```

<strike>以下のように書いてもOKです。</strike> ←嘘でした。

```
@obj class ChildEntity: NSManagedObject {
...
```

------
### 2014/8/2 追記

```
@objc(MyClass)
class MyClass ...
```

と書くのと、

```
@objc class MyClass
```

と書くのではどうやら意味が少し変わるようです。
少なくとも前者は名前空間が `(root).MyClass` になるようで、
従来のObjectiveCの `interface MyClass` と衝突します。
が、後者では衝突しないようです。

以下の内容も **前者の書き方 だと両方のコードで動きました**。
後者の書き方だと一見動くけど何かハマるだけのようです。

そして最終的には、下記のやり方の方がオススメで、この方法でも下記の両方のコードが動きました。
[SwiftでNSManagedObjectのSubclassを使う場合は、対応Class名にモジュール名のPrefixを付ける](http://qiita.com/mokemokechicken/items/9cb875cc4143947fcc06)

家と会社のPCで動作が違うような気がしないでもない、、、とにかくハマりやすいので気をつけましょう。

------





Entityを作る時
=====

何故かうまくいかない書き方
-----------
以下のように書くとCastに失敗するようでエラーになりました。
NSManagedObject の Instanceは取得できているのですが、そこからのCastが失敗します。

```
    let obj = NSEntityDescription.insertNewObjectForEntityForName("ChildEntity", inManagedObjectContext: mainContext)
    let child = obj as ChildEntity
```

上手くいく書き方
----------

こうすると上手く行きました。明示的に Class と CoreData Entity を結びつけてしまうわけですね。
本来こんな必要はなさそうですが、とりあえず今はしょうがないのかな。。

```
    let entity = NSEntityDescription.entityForName("ChildEntity", inManagedObjectContext: mainContext)
    let child = ChildEntity(entity: entity, insertIntoManagedObjectContext: mainContext)
```

Fetchする時
====

何故か上手くいかない書き方
-------

こう書くとやはり Castするところでnilになってしまいます。 `as?` を `as` にすると当然エラーになります。

```
    func loadAll() -> [ChildEntity]? {
        let request = NSFetchRequest(entityName: "ChildEntity")
        var array = mainContext.executeFetchRequest(request, error: nil)
        return array as? [ChildEntity]
    }
```


何故か上手くいく書き方
-------

そしてこれが何故か上手くいく書き方です。 `array:NSArray` というのがおまじないです。
何がなんだかもうわかりません。

```
    func loadAll() -> [ChildEntity]? {
        let request = NSFetchRequest(entityName: "ChildEntity")
        let array: NSArray = mainContext.executeFetchRequest(request, error: nil)
        return Array.bridgeFromObjectiveC(array)
    }
```

(2014/8/6追記)beta5だと上手くいく書き方
-------------

beta5だと Fetchの結果をNSArrayにしてから、`array as [T]`で良いようです。
あと、 `Array.bridgeFromObjectiveC` は無くなったようですね。

```
    func loadAll() -> [ChildEntity]? {
        let request = NSFetchRequest(entityName: "ChildEntity")
        let array: NSArray = mainContext.executeFetchRequest(request, error: nil)
        return array as? [ChildEntity]
    }
```
gitのマージ済みのブランチを整理する

マージ済みのブランチをみんな消してくれないので、終わったやつを消すコマンド作った。
適当にrcファイルに入れてください。
マージしても残したいブランチはignore_branchesに追加するとスルーします。

```zsh:.zshrc
function git-clean-branch() {
    local -a ignore_branches
    ignore_branches=('develop' 'master')
    for b in $(git branch --merged | grep -v '*'); do
        if (( ! ${ignore_branches[(I)$b]} )); then
            git push origin :$b;git branch -d $b
        fi
    done
}
```

gitリポジトリ内で以下のコマンドを実行すると消してくれます
`git-clean-branch`
Project Eulerをhaskellで練習していく日記: Problem 1

# 問題１
https://projecteuler.net/problem=1
10未満の3か5の倍数は3,5,6,9であり、その和は23となる。
1000未満で同様の和を求めよ。

# 回答
```haskell
prob1 n =  foldl (+) 0 [x | x<-[1..n-1], x `mod`3 == 0 || x `mod` 5 == 0]

main = do 
     print $ prob1 1000
```

# 感想
haskellの練習として、Project Eulerの問題を解いて行くことにしました。
haskellは書籍「すごいHaskellたのしく学ぼう」で勉強中です。
いきなり剰余の演算子などがするっと出てこなかったので、googleで調べたり。
あんまりエレガントなにおいがしてこないので、まだまだ練習が必要と感じました。
Go言語で開発を始める前のvimの設定

goのインストールからvim周りの環境設定の方法まとめ。

# goのインストール

```bash
$ brew install go hg
```

# 環境変数の設定

```.bashrc
export GOPATH=$HOME/.go
#export GOROOT=`go env GOROOT`
export PATH=$GOPATH/bin:$PATH
```

# gocodeのインストール

入力補完のためにgocodeをインストール

```bash
$ go get github.com/nsf/gocode
```

# vimの設定

vimを使ってgo言語で開発するときに設定

## ランタイムパスの設定

```
set rtp+=$GOROOT/misc/vim
```

## 入力補完を行う

`$GOPATH`を設定

```.vimrc
exe "set rtp+=".globpath($GOPATH, "src/github.com/nsf/gocode/vim”)
```

# vim-go のインストール

NeoBundle 使う場合

```.vimrc
NeoBundle 'fatih/vim-go'
```

## 使い方

* `:GoImport <package_name>` ファイルにインポート設定追加
* `:GoBuild` ファイルビルド
* `:GoRun` スクリプト即時実行

詳しくはgithubに。 https://github.com/fatih/vim-go

## .vimrcの設定の例

```vim
let g:go_bin_path = expand("~/.go/bin")

exe "set rtp+=".globpath($GOPATH, "src/github.com/nsf/gocode/vim")
set completeopt=menu,preview
au FileType go nmap <Leader>i <Plug>(go-info)
au FileType go nmap <Leader>gd <Plug>(go-doc)
au FileType go nmap <Leader>gv <Plug>(go-doc-vertical)
au FileType go nmap <Leader>gb <Plug>(go-doc-browser)
au FileType go nmap <leader>r <Plug>(go-run)
au FileType go nmap <leader>b <Plug>(go-build)
au FileType go nmap <leader>t <Plug>(go-test)
```

# 参考

* [Vimを使ったGo言語開発手法](http://mattn.kaoriya.net/software/vim/20130531000559.htm)
* [VimでGoのコードを書くときにやっておきたいこと](http://qiita.com/methane/items/d82b9f28b97b5c3bd08a)
Genymotionがネットワークエラーで立ち上がらない時

## Genymotion

VirtualBoxのネットワークエラーで立ち上がらなかった

VirtualBox > 環境設定

ネットワークタブ
ホストオンリーネットワーク(H) タブ
vboxnet0が4まであったので、全て除去して、再起動

立ち上がった！

#### error mesasage

```
Your network adapter can be misconfigured:
Edit the Host-only Network that is listed in the network category of the File/preferences menu of VirtualBox (VirtualBox/Preferences on Mac OS X).
The adapter's IP address has to be in the same network (192.168.56.0/24 by default) as DHCP server's IP address and DHCP's IP address bounds. If all those addresses are not in the same network, then your Genymotion virtual device might not be able to start.
You can also remove the Host-only Network. Genymotion will automatically recreate it at the next virtual device start.
```

#### google翻訳

```
ネットワークアダプタを間違って設定することができます。 
VirtualBoxの（Mac OS X上のVirtualBox/環境設定）の[ファイル/環境設定メニューのネットワークカテゴリに表示されているホストオンリーネットワークを編集します。 
アダプタのIPアドレスはDHCPサーバのIPアドレスとDHCPのIPアドレス境界として（デフォルトでは192.168.56.0/24）同じネットワーク内になければならない。すべてのそれらのアドレスが同じネットワーク内にない場合は、お使いのGenymotion仮想デバイスは、起動できない場合があります。 
また、ホストオンリーネットワークを削除することができます。 Genymotionは自動的に次の仮想デバイスの起動時にそれを再作成します。
```

IPアドレスが192.168.56.0/24に収まってないと起動しないみたい
新しく立ち上げたのは192.168.56.1だった

### インストールとか詳しくはこちら

http://qiita.com/Sam/items/8d551f575b617fa0be7e
HTML5のお勉強　articleとsectionとか

前回に引き続きHTML5の勉強。
**めっちゃわかりやすい記事があったので[これ](http://qiita.com/maccotsan/items/20c6ea274b0190dc2c05)見よう。**

#構造化タグ
HTML5の特徴の1つとして構造化タグと呼ばれるものがある。
今までのHTMLでは、

```html:今までのHTML
<html>
  <body>
    <div id="header">...</div>
    <div id="nav">...</div>
    <div id="container">...</div>
    <div id="footer">...</div>
  </body>
</html>
```

上記のようにユーザー側が構造を決め、（おそらく多くは）`<div>`にidやclassで構造名をつけ、
「ここからはヘッダ、ここからはフッタ…」といったように分類していたが、
HTML5では構造化タグと呼ばれる新しい要素（タグ）が追加され、
「ヘッダは`<header>`で囲み、フッタは`<footer>`で囲む」など、構造が明確になったといえる。

つまり、ユーザーがidやclass名で主張せずとも、きちんとした書式でHTML5を記述したのであれば、
人間にも機械にも読みやすいソースコードとなる、ということ。

（ただしHTML5にSEO的な意味はあるのか？というと無い、もしくは少ない、という見解が散見された。）

上記のHTMLをHTML5で書くと以下のようになる。

```html:HTML5
<html>
  <body>
    <header>...</header>
    <nav>...</nav>
    <article>
      <section>...</section>
    </article>
    <footer>...</footer>
  </body>
</html>
```

注意点として、**レイアウト目的での構造化タグ使用はしない**こと。
レイアウト目的の囲みは従来通りの`<div>`でOK、構造化タグはあくまで文章構造としての用途。

上記HTML5内にある`<header>`と`<footer>`、`<nav>`は名前のままであり用途も分かりやすいと思う。
では`<article>`と`<section>`は？

>`<article>`　独立した記事であることを示す
>`<section>`　一つのまとまりであることを示す

さっぱりわからない。ので調べよう。

##article
当該Webサイト内でコンテンツとして独立しているものをくくりたいときに使用する。
記事って書いてあるけれど、別に文章以外でも「コンテンツ」ならばこれでくくってOK。
NG例とかは`<section>`とまとめて後述。

##section
`<section>`の役割は「文書のアウトラインを明示する」こと。
これは記事の中の章分けやパーツ、普通のサイトでもページコンテンツ内の要素一つ一つをラップするようなタグ。
**内部に出来るだけ`<h1>`を持つことが推奨されている。**
`<h1>`での見出しが必須と思えば使う箇所は良い感じに絞られるはず。

##具体例
###正しい使用例

```html:正しい使用例
<article>ブログの記事とか</article>
```

コンテンツがちゃんと`<article>`で囲われている。

```html:正しい使用例
<article>会社概要</article>
```

記事だけがコンテンツではないのでこういうのも`<article>`でOK。

```html:正しい使用例
<section>
  <h1>コンテンツ内容見出し</h1>
  <p>コンテンツ内容1</p>
</section>
```

`<section>`内に正しく`<h1>`が存在する。

```html:正しい使用例
<article>
  <section>
    <h1>コンテンツタイトル</h1>
  </section>
  <section>
    <h1>コンテンツ内容見出し</h1>
    <p>コンテンツ内容1</p>
    <p>コンテンツ内容2</p>
  </section>
</article>
```

コンテンツが`<article>`で囲まれ、パーツが`<section>`で囲まれており、`<section>`内に`<h1>`が存在する。

###間違った使用例

```html:間違った使用例
<header>...</header>
  <section>
    <h1>見出し<h1>
    <p>コンテンツ</p>
  </section>
<footer>...</footer>
```

ヘッダからフッタまでの内容イコール`<section>`ではない。
どちらかといえば`<article>`の方が適している。

```html:
間違った使用例

<section>
  <h1>見出し</h1>
  <article>コンテンツ</article>
</section>
```

~~`<section>`で`<article>`を囲むことは（おそらく）ないはず。逆ならあり。~~
[www.w3.org](http://www.w3.org/TR/2014/REC-html5-20141028/sections.html#the-article-element)にもありますように、この事例もあるようです！
@johnmanjiro さんありがとうございます！

```html:間違った使用例
<article>
  <section>
    <p>見出し</p>
    <p>コンテンツ内容</p>
  </section>
</article>
```

`<h1>`が無い。

#まとめ
* レイアウトに構造化タグは使わない、使うなら`<div>`
* `<article>`は独立したコンテンツを囲うもの
* `<section>`はパーツや要素を囲うもの
* `<section>`は内部に`<h1>`を持つことを強く推奨されている
Chromiumのビルドでつまった話 on MAC OSX 10.8

ChromiumをMacでビルドしようとしたら、色々と詰まったので備忘録として書いてみる。

##Get the Code
ソースコードの入手方法は以下に書いてある。
http://dev.chromium.org/developers/how-tos/get-the-code

空き容量が少ないと、失敗したというログ(保存し忘れた)を吐きつつも何度もやり直すので無限ループになる。特にWebKitは容量が大きいので4~5時間経っても終わらない場合は、空き容量を増やした方が良いかもしれない。

##Ninja Build

Buildの方法については、以下のページにプラットフォームごとへのリンクが張られている。

http://www.chromium.org/Home

OSXの場合は以下となる。

https://code.google.com/p/chromium/wiki/MacBuildInstructions

NinjaとClangを使う方法しかサポートされていない。
Ninjaを使った方法は以下のページで説明されている。

https://code.google.com/p/chromium/wiki/NinjaBuild

よく分からないエラーで止まったときは

```
ninja -v -C out/Debug chrome
```
これで、コマンドを全部見てみる。


##pythonのversion
Ninjaでビルドしていたら、以下のようなエラーが出てきた。

```
Failed at tvcm: </script> expected but get </h2>
```

エラーを保存し忘れたので文自体は違うかもしれないが、tvcmをparseしている最中にscriptの閉じタグがこなきゃいけないのに、h2がきているといった内容。

```
chromium/src/third_party/trace-viewer/third_party/tvcm/src/tvcm.html (chromiumはsrcまでのpath)
```

を見てみるとしっかりscriptタグで閉じられているが、途中で

```
panicMessageEl.innerHTML =
    '<h2 id="message"></h2>' +
    '<pre id="details"></pre>';
```

という式を発見。h2タグを消してみるとpreタグでエラーになった。
パーサが怪しそうなので、使用しているHTMLパーサを調べてみると標準ライブラリを使用していた。このタイミングでPythonのversionが怪しいと思って調べてみると、2.7.3だった。最新のversion(2.7.8)にしてみたら、エラーが出なくなった。

##ImportError: No module named CoreFoundation
今度は、以下のエラーが出てきた。

```
[7/15257] MACTOOL copy-bundle-resource ../../breakpad/src/client/mac/sender/English.lproj/Localizable.strings
FAILED:  ./gyp-mac-tool copy-bundle-resource ../../breakpad/src/client/mac/sender/English.lproj/Localizable.strings crash_report_sender.app/Contents/Resources/English.lproj/Localizable.strings
Traceback (most recent call last):
  File "./gyp-mac-tool", line 515, in <module>
    sys.exit(main(sys.argv[1:]))
  File "./gyp-mac-tool", line 28, in main
    exit_code = executor.Dispatch(args)
  File "./gyp-mac-tool", line 43, in Dispatch
    return getattr(self, method)(*args[1:])
  File "./gyp-mac-tool", line 66, in ExecCopyBundleResource
    self._CopyStringsFile(source, dest)
  File "./gyp-mac-tool", line 105, in _CopyStringsFile
    import CoreFoundation
ImportError: No module named CoreFoundation
```

CoreFoundationなんてmodule無いよという内容。
CoreFoundationとはAppleが提供しているframeworkのこと。

https://developer.apple.com/library/mac/documentation/CoreFoundation/Reference/CoreFoundation_Collection/_index.html

これをpythonから呼び出せるようにするため、pyobjcが必要となる。install方法は以下に載ってる。

https://pythonhosted.org/pyobjc/install.html

pipとeasy_installのどちらでinstallしようとしても失敗する。調べてみると以下のようなissueがあった。

https://bitbucket.org/ronaldoussoren/pyobjc/issue/92/failed-to-install-pyobjc-301-with-pip-on

まだ、issueが解決していないので手動でinstallすることにする。

- pyobjc-core

- pyobjc-framework-Cocoa

- pyobjc-framework-Quartz

の順にinstallする。
pyobjc-framework-Cocoaをinstallしようとすると以下のエラーが出た。

```
ImportError: No module named pkg_resources
```

調べてみると、stackoverflowに解決方法があった。

http://stackoverflow.com/questions/7446187/no-module-named-pkg-resources

pyobjcをinstallし終えた後にbuildしてみるとエラーを吐かなくなった。