OmniAICreator/Qiita-1.07M huggingface dataset:
GoをインストールしてRevelを使ってみる

[Goを触ってて分からなかったこと・自信ないこと](http://qiita.com/A-gen/items/1b675d38abca7e36ecf3)で宣言したんですけど、今年はGo勉強します。
じゃあGoで何するのって、どうせ自分のことなんでWebアプリとかAPIサーバとかそんなのなんですよね。
ちうわけで、WebApplicationFramework使ってなんか作りたい。

使ってみるとかいいつつ、実際は何もしてません。インストールしてみただけです。

環境はUbuntuServer13.10の64bitです。

# 何はともあれGoをインストール
ビルドするのはめんどくさいので、ビルド済みのパッケージを持ってくることにします。
\# aptでもインストールできるっぽいんですけど、1.1なので今回は避けました。

```bash
$ mkdir ~/work
$ cd ~/work
$ wget https://go.googlecode.com/files/go1.2.linux-amd64.tar.gz
$ tar zxvf go1.2.linux-amd64.tar.gz
$ mkdir ~/local
$ cp -r go ~/local
$ vi ~/.profile
$ source ~/.profile
```

```bash:~/.profile
# GOROOT、GOPATHは任意のところで大丈夫です。
# ただGOPATHは実行ユーザが権限が与えられているパスを指定してください。
export GOROOT=~/local/go
export GOPATH=~/local/_go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
```

ちゃんと入ってるか確認します。

```go:hello.go
package main

import "fmt"

func main() {
  fmt.Printf("hello, world\n")
}
```

```bash
$ go run hello.go
hello, world
```

動いてます。

# フレームワーク
[Go web framework]でググると、[Revel](http://robfig.github.io/revel/)が最初にヒットしたので、Revel使ってみます。
`go get`でパッケージをインストール出来るので、それでインストールします。

```bash
$ go get github.com/robfig/revel/revel
go: missing Mercurial command. See http://golang.org/s/gogetcmd
package github.com/robfig/revel/revel
        imports code.google.com/p/go.net/websocket: exec: "hg": executable file not found in $PATH
```

Woops! Mercurialが必要みたいです。場合によってはSubversionとかBazaarとかも入れる必要があります。
必要になったら入れるってことで、今は放置します。

```bash
$ sudo apt-get install mercurial
$ go get github.com/robfig/revel/revel
$ revel
~
~ revel! http://robfig.github.com/revel
~
usage: revel command [arguments]

The commands are:

    new         create a skeleton Revel application
    run         run a Revel application
    build       build a Revel application (e.g. for deployment)
    package     package a Revel application (e.g. for deployment)
    clean       clean a Revel application's temp files
    test        run all tests from the command-line

Use "revel help [command]" for more information.
```

フレームワークの準備ができた、のかな。

# ひな形を作る

```bash
$ cd ~/work
$ mkdir revel-test
$ cd revel-test
$ revel new myapp
~
~ revel! http://robfig.github.com/revel
~
Your application is ready:
   /home/agen/local/_go/src/myapp

You can run it with:
   revel run myapp
$ ls
$
```

あれ、カレントディレクトリに作られないのこれ？
調べてみると、`$GOPATH/src`以下に新しいアプリケーションが作られていくみたいです。
で、今のところ任意の場所に作ることはできないみたいですね。

よし、わかった。とりあえずアクセスしてみる。

アクセスすると、おっきく「It works!」が。動いてるみたいです。

・・・さて、ここで一つ疑問が。
これどうバージョン管理すればいいんでしょう？
githubにあげるなら、`revel new github.com/A-gen/go-blog`とかでいいんですけど。。。
いや、じゃなくて、まあそれしか方法ないような気もするのですが、直接`git init`していい、の？
形になったらpushして、自分で`go get`とかするんでしょうか。

```bash
$ revel new github.com/A-gen/go-blog
~
~ revel! http://robfig.github.com/revel
~
Your application is ready:
   /home/agen/local/_go/src/github.com/A-gen/go-blog

You can run it with:
   revel run github.com/A-gen/go-blog
$ cd $GOPATH/src/github.com/A-gen/go-blog
$ git init
$ git add .
$ git commit -m "initial commit"
```

しばらくはこんな感じでやっていきます。
CSS animationでスイカがかわいく揺れるやつについて調べてみました。

以下のサイトの西瓜の揺れ方がよかったのでメモ。
`http://iconmelon.com/` （もうサイト無くなってました。。
（1年半前ぐらいなぜか限定共有にいたので公開）

![icemelon.gif](https://qiita-image-store.s3.amazonaws.com/0/123/881c72e6-a980-b24b-3134-d15a5fece9a1.gif)

```css

.swing {
        animation-name: swing;
        animation-duration: 2s;
        animation-delay: .45s;
}

@-webkit-keyframes swing {
	0%,100% { 
		-webkit-transform-origin: bottom center; 
	}
	10% { -webkit-transform: rotate(-15deg); }	
	20% { -webkit-transform: rotate(10deg); }
	30% { -webkit-transform: rotate(-5deg); }	
	40% { -webkit-transform: rotate(5deg); }	
	50% { -webkit-transform: rotate(-3deg); }
	
	60% { -webkit-transform: rotate(2deg); }
	70% { -webkit-transform: rotate(-2deg); }
	80% { -webkit-transform: rotate(1deg); }
	90% { -webkit-transform: rotate(-1deg); }
	100% { -webkit-transform: rotate(0deg); }
}
```

test
Ubuntu12でPHP5.5をインストール


Ubuntu12でPHP5.5を入れる時の手順メモ。
Vagrantでローカル環境を作っていたので、それを参考にインストール。

add-apt-repositoryのインストール

```
sudo apt-get install python-software-properties
```

レポジトリの追加

```
sudo add-apt-repository ppa:ondrej/php5
sudo apt-get update
```

PHPのインストール

```
sudo apt-get install php5 php5-cli
```

おしまい

***
参考サイト

* [bryannielsen / Laravel4-Vagrant](https://github.com/bryannielsen/Laravel4-Vagrant)
* [Ubuntu 12.04 PHP 5.3.10からPHP5.4.15へアップグレード](http://web.mt-systems.jp/archives/889)
Gruntを使ってNcFTPでファイルをアップロード


設置したFTPサーバーにgrunt-ftp-deployでファイルをアップロードしようとしたけど、うまく動作しなかった。

原因はわからないけど、サーバーの設定かなんかで出来ない場合があるらしい。

で、以下の方法で対処した。

実行環境はMac

## NcFTP Client をインストール

**NcFTP Software: Download**
http://www.ncftp.com/download/dlf2.html

ここのページの

**Download NcFTP Client**
NcFTP Client 3.2.5 for *Mac OS X 10.4 to 10.6 (Intel 32-bit)*

これをダウンロードして、インストール。

## NcFTPPutの実行ファイルをプロジェクトにコピー

```sh:実行ファイルを探す
$ which ncftpput
```

出力された場所から、 **ncftpput** の実行ファイルをプロジェクトのディレクトリにコピー

## grunt-exec から ncftpput を実行

ローカルの www ディレクトリの中身をまるごと、サーバーにアップロード

```coffee:Gruntの設定
host = 'FTP_HOST_ADDR'
user = 'FTP_USER'
pass = 'FTP_PASSWORD'
dest = '/REMOTE_PATH'

exec:
  upload:
    command:  "../ncftpput -u #{user} -p #{pass} -m -R #{host} #{dest} ."
    cwd: "www"
```

参考：ncftpput(1) manual page
http://www.ncftp.com/ncftp/doc/ncftpput.html
プロキシを越えて大きなファイルをダウンロードする

Erlangを会社のWindowsマシンにインストールしようとして、
http://www.erlang.org/download/otp_win32_R16B03.exe
をダウンロードしようとしたところ、どうにもプロキシで接続タイムアウトになってしまう。

そんなときには、curlの-rオプションを使って、分割ダウンロードするとうまくいくことがあります。

```shell-session
% curl -r 5 -o otp_win32_R16B03.exe http://www.erlang.org/download/otp_win32_R16B03.exe
```
というように分割数を指定するだけです。

* 相手側のWebサーバがContent-Rangeヘッダを有効にしていること
* 分割数を大きくし過ぎると、プロキシにも相手側サーバにも迷惑かかるので程々にすること

が注意点です。
Xamarinで使えるかもなマルチプラットフォーム地図エンジンReturns (ベクタ編)

[以前の記事](http://qiita.com/kochizufan/items/5c8734c036379eca2c47)の追記的なアレです。  
個人的な興味がラスタ地図中心なのでアンテナ外だった、ベクタ系エンジンについても調べてみました。  

## Mapsforge

[こちら](https://code.google.com/p/mapsforge/)で開発されているAndroid向けベクタ地図描画エンジンのようです。  
Google Playで検索するといくつか製品([こちら](http://ja.appbrain.com/app/offline-map-colombo-sri-lanka/com.kalvish.android.colombocarroutes)とか)が見つかるのでDLしてみると、描画は綺麗！  
なんですが、ベクタ地図エンジンなのに離散ズームなので個人的にはイマイチ。  
ラスタも使えるのかどうかは確認していません。  

Xamarin対応については特にc#ポートはないようですが、[iOSへのポート](https://github.com/medvedNick/Mapsforge_iOS)が存在するようですので、セットでバインドしてやればマルチプラットフォーム環境を作れるかもしれません。

## OsmSharp

今回見つけた最大の収穫。  
[こちら](https://github.com/xivk/OsmSharp)で開発されている、c#ベースのベクタ地図エンジンです。  
Xamarin.Android、Xamarin.iOS対応との事で、c#ベースだからポートの有無もクソもありません。  
まだ動作させてはいないのですが、[デモ動画](http://vimeo.com/76219574)を見る限り離散ではなく連続ズームでちゃんと動いています。  
[ルート検索](https://www.youtube.com/watch?v=wy7cbKLd34A)等にも対応。  
[MapCSS](http://www.osmsharp.com/content/mapcss-rendering)なんかにも対応してるみたいですね。  

私のメインの興味はラスタなので、ラスタタイルが読み込めればできること全部OK & +αで最先端機能なのでむちゃくちゃ理想なのですが、ラスタが読み込めるのかはドキュメント見てもよく判らなかったので、今から昼休みなので動かしてみます…と記事かいてる間に昼休み終わりかけてますが…。

#### 続報：

* OsmSharpはiOS、Androidともテストサンプルが動かなかったが、サンプルデータ側の不具合の模様で、開発者の方も認識済みのため手の空いた時に修正いただけるとの事。
* Twitterレベルでラスタタイルも扱えるのか質問したが、可能との事。
特定の文字列を含む行を削除する。

コメントを削除し見やすくするために

### コメント行を削除する。

```bash
sed -i.back "/^#.*$/d" httpd.conf
```

### 空行を削除する。

```bash
sed -i.back "/^[ ]*$/d" httpd.conf
```

### コメントおよび空行を削除する。

```bash
sed -i.back "/^\(#.*\|[ ]*\)$/d" httpd.conf
```
CentOSへRPMでMoshをインストールする

## EPELの導入
http://www.tooyama.org/yum-addrepo-epel.html 辺りを参考に。

## Moshをインストール
```shell-session
$ sudo yum install mosh
```

## 必要に応じてiptablesの設定、接続確認
http://qiita.com/Jey/items/ae13b0ea6b3c87bd8571 を参考に。
【実体参照】たとえば半角&がメタに入っていたらどうするべきなのか

たとえばメタ（タイトル、キーワード、ディスクリプションや最近だとogp系も）に半角の&が入っているとき、これは実体参照（この場合は`&amp;`）にするべきなのか？

#私の場合
##テキストの場合
`&amp;`に直す。
そのままだとバリデートすると、エラーが出る。

##alt
`&amp;`に直す。
バリデートではエラーがでないが、altは画像をテキストとして扱った場合入っている文章なので実体参照に直してた。

##タイトル
`&amp;`に直す。
そのままだとバリデートすると、エラーが出る。

##キーワード、ディスクリプション
`&amp;`に直す。
タイトル直してるから、その流れで直す。
検索したところ、`&amp;`に直す必要があるみたい。
http://www.tagindex.com/kakolog/q2bbs/1601/1887.html

#他の人
##日本語内なら全角の＆にする
目から鱗！
日本語で検索するときなら、半角&より全角＆のほうが拾ってもらえそうな気もする。

##もし他の方法を使っている方がいたら教えてください。
レガシーjQueryから最新版への移行


レガシーなjQuery(1.4)を使っているプロジェクトがあり、最新のFirefoxで動作しない問題が発生。独自属性のattrメソッドの値がおかしい。せっかくなので最新版に更新してdataメソッド経由に書き換えることに。ついでに最近のjQueryのバージョンの違いも調査。

結果 jQuery1.10.2 でjQuery Migrateを導入し、少しコードを書き換えて移行できた。

## 1.9

.toggle, jQuery.browser, live, die  など削除されている
http://jquery.com/upgrade-guide/1.9/

1.9以降で古いAPIを使うには、[jQuery Migrate プラグイン](https://github.com/jquery/jquery-migrate/)を導入すればいいとのこと。


## 2.x

IE6,7,8はサポートしない
イベントハンドラに、ラムダ式を使用する

プログラムを短く簡潔に記述するのに、ラムダ式は便利ですが、イベントハンドラを記述する場合には、少しコツがいります。下記のように記述した場合には、ラムダ式内で、handlerが参照できずエラーとなります。

```csharp:Test1.cs
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(1000);
EventHandler handler = (ss, ee) =>
{
    timer.Tick -= handler;
    timer.Stop();
    timer = null;
};
timer.Tick += handler;
timer.Start();
```

ラムダ式内で、handlerを参照できるように、前もってhandlerを定義してから使います。
せっかくラムダ式を使っているのに、行数が増えてしまって残念ですが、イベントハンドラの解除も一箇所に纏まって見通しの良いコードになります。

```csharp:Test2.cs
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(1000);
EventHandler handler = null;
handler = (ss, ee) =>
{
    timer.Tick -= handler;
    timer.Stop();
    timer = null;
};
timer.Tick += handler;
timer.Start();
```
underscore.templateでJSのソースを生成する際にテンプレートにvalidなJSを使う

[Underscore.jsのtemplate method](http://documentcloud.github.io/underscore/#template)はERBライクな記法の極めてシンプルなテンプレートエンジンですが、正規表現を指定することで記法をカスタマイズすることが出来ます。
今回はJSのソースを生成するために使うので、以下のようにしてみました。

```js:templateSettings.js
_.templateSettings.interpolate=/0?\/\*\s*%=([\s\S]+?)%\s*\*\//g;
_.templateSettings.evaluate=/0?\/\*\s*%([\s\S]+?)%\s*\*\//g;
```

どういう記法なのかというと、JSのブロックコメントorJSのブロックコメントの手前に0が付いている物の中に、
%=と%でくくられた範囲があればcontextの変数を展開し、%と%ででくくられた範囲があれば範囲内のJSをテンプレート処理時に実行するというものです。

使用例はこちら

```js:template.js
  var configs = [
/*%
configs.forEach(function(config){
var isNotLast = configs.indexOf(config) !== (configs.length - 1)
%*/
/* %=config% */
0/*% if(isNotLast){ %*/,0/*% }
}) %*/
  ];
```

テンプレート記法がブロックコメントなのでJSのソースが壊れませんし、コメント以外に0も入れられるのでテンプレート外にカンマを入れていても[,]のようになるのも防げます。
Sublime Textでvim風・Emacs風カーソル移動


Sublime Textでカーソル移動のみVim風・Emacs風にする設定。
コントロールキー押しながらキー押しでカーソル移動するようにする。
Preferences - Key Bindings - User に以下を追加。

Vim風

```
[
    { "keys": ["ctrl+l"], "command": "move", "args": {"by": "characters", "forward": true } },
    { "keys": ["ctrl+h"], "command": "move", "args": {"by": "characters", "forward": false } },
    { "keys": ["ctrl+j"], "command": "move", "args": {"by": "lines", "forward": true } },
    { "keys": ["ctrl+k"], "command": "move", "args": {"by": "lines", "forward": false } }
]
```

Enacs風

```
[
    { "keys": ["ctrl+f"], "command": "move", "args": {"by": "characters", "forward": true } },
    { "keys": ["ctrl+b"], "command": "move", "args": {"by": "characters", "forward": false } },
    { "keys": ["ctrl+n"], "command": "move", "args": {"by": "lines", "forward": true } },
    { "keys": ["ctrl+p"], "command": "move", "args": {"by": "lines", "forward": false } }
]
```

参考
http://www.sirochro.com/note/sublime-custom-keybind-move/
呼び出し元の情報を引数へ渡す。（Caller Info 属性）

メソッドの引数に属性を付けることによって、デバッグ用診断情報をメソッドへ渡すことができます。
属性を付ける引数は、デフォルト値が指定されている必要があります。
C言語の__FILE__や__LINE__マクロのような使い方ができます。

```csharp:DebugLog.cs
public static class DebugLog
{
    public static void WriteLine(string message,
        [CallerFilePath] string file = "",
        [CallerLineNumber] int line = 0,
        [CallerMemberName] string member = "")
    {
    }
}
```

デバック以外の実用的な使い方として、INotifyPropertyChangedの実装が挙げられます。

```csharp:NotificationObject.cs
public class NotificationObject : INotifyPropertyChanged
{
    protected virtual void RaisePropertyChanged([CallerMemberName] string propertyName="")
    {
    }
}
```

PropertyChangedイベントを発火させるために、プロパティ名を指定する手間を省略することが可能になります。
Backbone.jsはlistenToがあればもうonは要らない子なんじゃないか

って思うんですがいかがでしょうか。（`this.callback`を利用する前提で。）

## コード

### `on`, `off`

```js
setup: function() {
    this.user.on('change:name', this.setName, this);
    this.user.on('change:mail', this.setMail, this);
    this.posts.on('add', this.addPost, this);
},
teardown: function() {
    this.user.off('change:name', this.setName, this);
    this.user.off('change:mail', this.setMail, this);
    this.posts.off('add', this.addPost, this);
}
```

### `listenTo`, `stopListening`

```js
setup: function() {
    this.listenTo(this.user, 'change:name', this.setName);
    this.listenTo(this.user, 'change:mail', this.setMail);
    this.listenTo(this.posts, 'add', this.addPost);
},
teardown: function() {
    this.stopListening();
}
```

## `listenTo`の利点

* 書くのが楽
    * 名前は長いけど
* 確実に監視解除出来る
* 他者の監視を誤って解除しない
    * 引数なしで`model.off()`すると全部解除するけど、他人も監視してたときにアレ

---

という内容をブログ記事に書く予定。
Mac上でJenkinsからImageMagickを実行する


Mac上で動かしてるJenkinsからImageMagickを実行しようとしたら
command not found
とエラーが出たので、以下の設定を行って対応した。


```sh:実行ファイルの場所を調べる
$which convert
```

```txt:出力例
/opt/ImageMagick/bin/convert
```

Jenkinsの管理画面で環境変数を設定する
[Jenkinsの管理] > [システムの設定] > グローバルプロパティ > 環境変数

```txt:キー
PATH
```

```txt:値
${PATH}:/usr/local/bin:/opt/ImageMagick/bin
```

---

ちなみに

HomebrewからImageMagickをインストールしたらうまく動いてくれなかったので、パッケージをダウンロードしてインストールした。

**ImageMagick installer for Mac OS X**
http://cactuslab.com/imagemagick/

このページの、 

	ImageMagick 6.8.7-2 for Mac OS X 10.5 – 10.9
	Requires XQuartz. (7.7 MB)

ってやつ。

---

あと、

**XQuartz**
http://xquartz.macosforge.org/landing/

こっちも。
インストールの順番はどっちが先でも大丈夫っぽい。

---
Seleniumでクリック操作後に待機させる対応

### はじめに
* 以下の環境下でのテストをしたところ、クリック操作後にページのロードを待たずにコケてた
 * OS：Mac OS X Mavericks
 * ブラウザ：Safari 7.0
 * selenium-webdriver：2.39.0
 * capybara：2.1.0
 * cucumber：1.3.10

### 解析
* Seleniumを使って他にもFirefox,Chromeでのテストを行っているが同じコードを使用してもこの現象が見られるのはSafariのみ
* 以下のどちらのやり方でも同じ結果だった
 * find('#id').click
 * click_link 'ログイン' #名前は適当
* click操作を書いているすぐ後に、sleepを入れたら通った
 * そうだろうとうすうす感づいていたが悲しかったm(__)m 

### 対応
* capybaraの設定を書いているファイル(私の場合はsupport/capybara_config.rb)に以下を追記

```rb
class Selenium::Webdriver::Element
  def click
    bridge.clickElement @id
    sleep 1 #ここはページロードを待つとかでも何でもいい
  end
end
```

* ちなみに、以下の設定をしてもだめだった

```rb
# Selenium側の設定
client = Selenium::Webdriver::Remote::Http::Default.new
client.timeout = 100 #100sec

# Capybara側の設定
Capybara.default_wait_time = 10
```

# ～ただの宣伝～
* [全国のSeleniumer必読](http://qiita.com/oh_rusty_nail/items/b8ba525d31ea7c522856)
* Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください
クロスコンパイルに感動した

インストール
=========

```bash:インストール
$ brew install go
```

```bash:クロスコンパイル用準備。一度だけ実行すれば良い。
$ cd /usr/local/Cellar/go/*/libexec/src
$ ./all.bash
  (5分待つ)
```

```bash:windows_32bit向けコンパイラ生成
$ cd /usr/local/Cellar/go/*/libexec/src
$ GOOS=windows GOARCH=386 ./make.bash
  (1分待つ)
  (../bin/windows_386/が生成される。)
```

プログラム書く
=========

なにか書く
------------

```bash:
cd ~/src/
cat > hi.go <<EOF
package main

func main() {
    println("こんにちは")
}
EOF
```

動作確認
------------

```bash:1.コンパイルせずに実行
$ go run hi.go
```


```bash:2.コンパイルして実行
$ go build hi.go
$ ./hi.go
```

ビルド(windows32bit)
==========

```bash:windows32bit
$ GOOS=windows GOARCH=386 go build hi.go
```

hi.exeが生成される。
windows機に転送して動作を確認。

実行ファイルがどの環境向けかは`file`コマンドで調べられます。

環境設定一覧
==========

* 自分が使う環境一覧

```bash:
GOOS=windows GOARCH=386
GOOS=windows GOARCH=amd64
GOOS=linux GOARCH=386
GOOS=linux GOARCH=amd64
GOOS=linux GOARCH=arm
```

raspberry pi用にもビルドできて感動した。

実行ファイルの圧縮
==========

* upxを使い圧縮しましょう。

```
sudo apt-get install -y upx
```

```
$ upx a.exe
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2013
UPX 3.91        Markus Oberhumer, Laszlo Molnar & John Reiser   Sep 30th 2013

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
   7692800 ->   2243584   29.16%    win64/pe     a.exe
```


vimで*.goのsyntax hilight
==========

```vim:~/.vimrc
set runtimepath+=/usr/local/Cellar/go//1.2/libexec/misc/vim
auto BufNewFile,BufRead *.go set ft=go
```
【cake】コントローラでデフォルトモデル以外を使用する

二通りあるっぽい。使い分けの基準があれば教えてほしい。

## $uses=array(モデル名,モデル名);
```py
class UserController extends AppController{
  //UserコントローラでArticleモデルを使用する
  public $uses = array(Article);

  public function index() {

  }
}

```

## $this->loadModel(モデル名)

```php
class UserController extends AppController{
  public function index() {
    //UserコントローラでArticleモデルを使用する
    $this->loadModel('Article');
    $recentArticles = $this->Article->find('all');
  }
}
```
[Grails]IntelliJからデバッグする

参考URL
http://yamkazu.hatenablog.com/entry/2012/10/20/233031
http://www.jworks.nl/2013/09/11/upgrading-grails-2-2-4-to-2-3-0/

# 下準備（1回だけ）
IntelliJから、Grailsのデバッグが出来るように初回のみ設定をする。

+ まずは画面上部のメニューから`Edit Configurations...`を選択

![edit1.png](https://qiita-image-store.s3.amazonaws.com/0/11059/d78235be-e75f-758e-3206-5c03eebb24d0.png)

+ 左上の緑色の`+`ボタンをクリックして、`remote`を選択

![edit2.png](https://qiita-image-store.s3.amazonaws.com/0/11059/4b0d28d3-c717-ba3f-7619-793f39be226e.png)

+ すると必要な設定画面が表示される。`Name`だけ好きな物に変更して、後はデフォルトのままで基本的にOK

![edit3.png](https://qiita-image-store.s3.amazonaws.com/0/11059/0998bde3-7f74-5aa8-af7a-f8106d8b5b26.png)




# Grailsをデバッグモードで待機状態にする。
`--debug-fork`オプションをつけてGrailsを待機状態にする。

```
grails run-app --debug-fork
```

最終的に以下の文言がコンソールに表示される。

```
Listening for transport dt_socket at address: 5005
```

# IntelliJからGrailsに接続する。
画面上部のメニューから、先ほど作成したremoteを選択して、右隣のデバッグボタン(緑色の虫のボタン)をクリック。

![edit4.png](https://qiita-image-store.s3.amazonaws.com/0/11059/7654f400-0bd8-dab1-546a-0ee18bdf6eb8.png)

そうすると、この時点でGrailsが起動し始めて、コンソールの方にいつものようにログが表示される。

# 実際にデバッグ！
あとはIntelliJ上で適当なところにブレークポイントを設定してから、いつもどおりブラウザでGrailsアプリケーションにアクセスすればOK。
【MySQL】バージョン5.5.3以降の文字コードの設定(UTF8)

mysql5.5.3からは[mysqld]の文字コードの設定は、default-character-set=utf8は使えなくなり、character-set-server=utf8を使う。

※5.1でもdefault-character-setは非推奨なので、character-set-serverを使った方が良いかもしれない。

[mysqld]以外はdefault-character-set=utf8を使う。

```mysql:設定ファイル
[mysqld]
character-set-server=utf8

[mysql]
default-character-set=utf8

[mysqldump]
default-character-set=utf8

```

参考
[option_mysqld_default-character-set](http://dev.mysql.com/doc/refman/5.5/en/server-options.html#option_mysqld_default-character-set)
[option_mysqld_character-set-server](http://dev.mysql.com/doc/refman/5.5/en/server-options.html#option_mysqld_character-set-server)


文字コードの変更を反映するには、データベースを作り直さないといけないらしいので、初期設定で文字コードの設定は忘れずに。
KnockoutJSでAngularJSのfilter機能実装



AngularJSでは、filterを利用すれば簡単にデータの絞り込み機能が実装できる。

```js
<tbody ng-repeat="item in items | filter:searchText">
	<tr>
		<td>{{item.taskName}}</td>
		<td>{{item.priority}}</td>
	</tr>
</tbody>
```

KnockoutJSでは同様の機能は存在しないようなので、独自で実装をしてみた。

### ViewModelの定義

- 検索キーワード項目として、filterTextを定義
- 一覧表示データとして、itemsを定義
- 絞り込み処理結果として、filteredItemsを定義

```js
function TestappViewModel(){
        var self = this;
        self.filterText = ko.observable('');
        self.items = ko.observableArray([
        	{taskName:"AAAAA",priority:"Low"},
			{taskName:"BBB",priority:"High"},
			{taskName:"CCC",priority:"High"}
        ]);

        self.filteredItems = ko.computed(function() {
            var filter = self.filterText().toLowerCase();
            if (!filter) {
                return self.items();
            } else {
                return ko.utils.arrayFilter(self.items(), function(item) {
                      return item.taskName.toLowerCase().indexOf(filter)!== -1;
                });
            }
        }, self);

}
ko.applyBindings(new TestappViewModel());
```

filteredItemsでは、ko.utils.arrayFilterを使用して、条件に一致する配列のみに絞り込んでいる。

	1. filterTextが未入力なら、itemsの配列をそのまま返す。
	2. taskNameに、filterTextの値が含まれていれる配列を返す。

taskNameだけではなく、すべての項目を対象とする場合は、ko.utils.arrayFilter内を以下のように記載する。

```js
return ko.utils.arrayFilter(self.items(), function(item) {
    for (var i in item) {
         if(item[i].toLowerCase().indexOf(filter)!== -1){
                return true;
         }
     }
     return false;
});
```


### HTML

- 検索キーワード入力欄に、keydownイベントを付与。
- 一覧表示部には、絞り込み処理結果であるfilteredItemsをbind

```html
Search Keyword: <input data-bind="value: filterText, valueUpdate: 'afterkeydown'" />

<tbody data-bind="foreach: filteredItems">
        <tr>
            <td data-bind="text: taskName"></td>
            <td data-bind="text: priority"></td>
        </tr>
</tbody>
```
#ruby 2.0 crashed

```rb:lazy_select.rb
class Enumerator
  class Lazy
    alias :select_without_block :select
    def select(&block)
      return to_enum(:select) if !block_given?
      select_without_block(&block)
    end
  end
end
p (1..999999999).lazy.select.with_index{|e,i|i.odd?}.take(10).to_a
```

ruby1.9 -v
ruby 1.9.3p194 (2012-04-20) [i686-linux]
ruby1.9 *-rbackports* lazy_select.rb
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

ruby2.0 lazy_select.rb
**[BUG] vm_call_cfunc - cfp consistency error**
ruby 2.0.0p247 (2013-06-27 revision 41674) [universal.x86_64-darwin13]

いやですね、本当は http://antimon2.hatenablog.jp/entry/2014/01/08/235706 への肯定的な解答にしたかったんですよ( https://github.com/yhara/enumerable-lazy/blob/master/lib/enumerable/lazy.rb でもantimon2/enumerable_lzに謝辞書かれてますし )。
しかしまさかのクラッシュ…。

PS
Lazy.class_eval{}とすれば、ruby1.9 -renumerable/lazyでも期待通りの動作をします。

PPS
antimon2氏がRuby 2.1.0でテストしたところ、期待通りの動作だったそうです。ありがとうございました。
問題はOSXのRubyがいつ更新されるかなんだよなぁ…。
Rails（トラブル編）

どん詰まりした

```
Incorrect MySQL client library version! This gem was compiled for 5.6.13 but the client library is 5.5.27
```

mysqlを立ち上げた時のversionは

```
Server version: 5.6.13 MySQL Community Server (GPL)
```

だけどclient library is 5.5.27と言っている。
解決策を探しこんな風にすればいいとか

```
sudo ARCHFLAGS=”-arch x86_64″ gem install mysql2 — –with-mysql-config=/usr/local/bin/mysql_config
```
http://klalex.com/2013/02/upgrading-mysql-to-5-6-10-on-mac-os-and-fixing-mysql2-gem/

やってみるもダメ。

whichでmysql探すも

```
/usr/local/mysql/bin/mysql
```
そして起動すると5.6.13
わからん。
で、わかりました。

```
/usr/local/Cellar/mysql
```
にもmysqlが。中身を除くと
「5.5.27」

ですね。

起動するも、
「Library not loaded: libmysqlclient.18.dylib (LoadError)」

これは

```
ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib
```
http://d.hatena.ne.jp/junnemoto/20111105/1320509059

で対応。

これで無事動いた。

ということで、mysql単体とbrewでmysqlを入れている人、注意
"フォロー中のタグ"に登録しているタグの更新をまとめる「Qiita following tags feed」を改修

「[Qiita - "フォロー中のタグ"に登録しているタグの更新をまとめるRSSを作った - Qiita [キータ]](http://qiita.com/AmaiSaeta/items/dc9f272a3d990f6473b9)」で公開した Yahoo! Pipes が何時の間にか動作しなくなっていたので改修した。

[Qiita following tags feed](http://pipes.yahoo.com/amaisaeta_/qiitafollowingtagsfeed)

Yahoo! Pipes だと、パースに失敗しているのか、或いは本当に新規投稿がないだけなのか判別付かないので、何か問題が起こっても発覚が遅くなってしまう……誰か良い手を知りませんか?
rubyで現在日時を取得する

ruby 2.1

タイムゾーンは環境変数'TZ'に依存するため注意すること

# 現在日付

```rb
require 'date'
Date.today
```

# 現在日時(Date)

```rb
require 'date'
Date.today.to_time
```

# 現在日時(Time)

```rb
require 'date'
Time.now
```
 
# UNIX時間

```rb
require 'date'
Time.now.to_i
Date.today.to_time.to_i
```
HTMLテーブルのセルを編集するjQueryサンプル

本格的なグリッドとしては[SlickGrid](https://github.com/mleibman/SlickGrid/wiki)のようなライブラリを使うのが良いんでしょうがJavaScriptのファイルサイズがヘビーウェイトなのが気になります。

もっと手軽な方法はないかと思って検索すると[How to create an editable HTML table with jQuery](http://mrbool.com/how-to-create-an-editable-html-table-with-jquery/27425)というサンプルを見つけました。

これを元に改良してみたものを
https://github.com/hnakamur/editable_html_table_example
に置きました。

* 編集前のテキストをHTMLのdata属性に保存するようにした。
* 編集用のテキストフィールドを作成する際にHTMLを文字列で組み立てるのではなくdocumment.createElement()を使うようにした。
* 編集用のテキストフィールドの外でマウスクリックした時とESCAPEを押した時に編集をキャンセルするようにした。

JavaScriptのコードのみ引用します。

```js
$(function() {
  $("td").dblclick(function() {
    var td = $(this), originalContent = td.text();

    td.addClass("cellEditing");
    td.data("originalContent", originalContent);
    var el = document.createElement("input"), $el = $(el);
    $el.attr({type: "text", value: originalContent});
    $el.css("fontSize", td.css("fontSize"));
    td.empty();
    td.append(el);
    $el.focus();

    $el.keypress(function(e) {
      if (e.which == 13) {
        var text = $(this), newContent = text.val(), td = text.parent();
        td.text(newContent);
        td.removeData("originalContent");
        td.removeClass("cellEditing");
      }
    });

    var resetContent = function(e) {
      var td = $(e.target).parent();
      td.text(td.data("originalContent"));
      td.removeData("originalContent");
      td.removeClass("cellEditing");
    };

    $el.keydown(function(e) {
      if (e.which == 27) {
        resetContent(e);
      }
    });

    $el.blur(resetContent);
  });
});
```

http://jsdo.it/hnakamur2/abAu でも試せます。セルをダブルクリックすると編集用のテキストフィールドが表示されます。

そのとき表の各列の幅が変わってしまうのがイマイチな気がするのですが、解決法がわからずそのままにしています。良い方法があれば教えてください。
ブログのタイトルからURLっぽいものを生成


ブログのタイトルから半角文字のみを抽出し、ハイフンで繋いだ文字列を生成

```
def gen_title(str)
  str.downcase.scan(/[a-zA-z0-9]+/).map{|s| s.strip}.join('-')
end

gen_title '10分でnode.jsとangular JS, sassでリッチなWebサイトを作る'
# => 10-node-js-angular-js-sass-web
```
空行のインデントを前後の行とそろえる（PowerShell版）

あるテキストエディタにおいて、複数行をまとめてインデントしても空行がインデントされない仕様に変わったときに書いたスクリプト。
2年ほど前に書いたので内容はうろおぼえだけど、たぶんタブインデントにしか対応していない。


こういうテキストのインデントを、

    1111\n
    \n
      2222\n
        3333\n
          4444\n
        3333\n
    \n
        3333\n
          4444\n
        3333\n
      \n
      2222\n
    \n
    1111\n

こういう風にそろえる。

    1111\n
      \n
      2222\n
        3333\n
          4444\n
        3333\n
        \n
        3333\n
          4444\n
        3333\n
        \n
      2222\n
      \n
    1111\n

```ps1:IndentEmptyLine.ps1
#空行のインデントをそろえる

#対象の空行のインデントレベルが、前後の行と異なる場合、
#前後の行のうち深いほうのインデントレベルにそろえる

param(
    [string]$sourceFilePath,
    [string]$targetFilePath
)

$enc = [Text.Encoding]::GetEncoding("Shift_JIS")
$writer = New-Object IO.StreamWriter($targetFilePath, $false, $enc)

$lines = get-content $sourceFilePath
$i = 0

$outLine = ""
$prevIndent = ""

foreach ($line in $lines) {
    
    $i++
    
    #空行のとき
    if ($line -match "^\t*$") {
        $emptyLineCount++
        
        #次行以降の空行でない行を取得する
        $n = $i
        $nextIndent=""
        while ($n++ -lt $lines.count) {
            if ($lines[$n] -match "^(?<indent>\t*)[^\t]+$") {
                $nextIndent = $matches["indent"]
                break
            }
        }
        
        #前後の行のうち深い方のインデントレベルを取得する
        if ($prevIndent.length -lt $nextIndent.length) {
            $indent = $nextIndent
        } else {
            $indent = $prevIndent
        }
        
        #$outLine = $indent + "|"
        $outLine = $indent
        $indentedLineCount++
        
    } else {
        $outLine = $line
    }
    
    #前行のインデントレベルとして取得しておく
    if ($line -match "^(?<indent>\t*)[^\t]+$") {
        $prevIndent = $matches["indent"]
    }
    
    #ファイルに出力する
    $writer.WriteLine($outLine)
    #$outLine
}

$indentedLineCount.tostring() + " / " + $emptyLineCount.tostring() + "行処理しました"

$writer.close()
herokuでDjangoブログにログイン機能を付けようとしたらハマった



### 今回はDjangoのソースコードにあまり触れず、状況だけ簡単に説明しようと思います。 ##

虫のいい話ですが、知識のある方に助けていただきたくて投稿していますので対処法が分かる方はどうかお助けください。

-

[これ](http://qiita.com/juniskw/items/8ad29b474f9de2ba47ea)の続きでページにログイン機能を付けようとしていたらハマった。

まずはローカル環境で作業。データベースは”sqlite3”を使用している。
詳しい説明は省くが、とりあえず編集・削除は投稿者でないとできないようにしたかったので、Entryモデルに投稿したユーザーのデータを追加して参照できるようにした。

###### models.py ######

```py
from django.contrib.auth.models import User

class Entry(models.Model):
	title = models.CharField(max_length=150)
	body = models.TextField()
	create_datetime = models.DateTimeField(auto_now_add=True)
	update_datetime = models.DateTimeField(auto_now=True)
	owner = models.ForeignKey(User)  #ここ
```

その後```python manage.py syncdb```を実行してデータベースを更新。うまくいったように見えたのだが、いざ```runserver```でローカル環境のテストページにアクセスするとエラーだった。

>no such column: owner_id

うろ覚えだがたしかこんな感じ。
以下のページを参考に’drop table’してから再度’syncdb’したところ解決。
http://stackoverflow.com/questions/7218590/caught-databaseerror-while-rendering-no-such-column-bookmarks-bookmark-title

***で、他には特に問題なくプログラムも動いていたので、herokuにpush。***
```heroku run python manage.py syncdb```でデータベースも更新。こちらはPostgreSQL。

で、アクセスしてみるとエラー。エラーメッセージをメモし忘れていたが、たしかローカル環境で起こったのと似ていたか、あるいは同じだったような気がする。
だから対処法もだいたい同じだろうと思い、```heroku run postgresql```を実行。

>bash: postgresql: command not found

・・・・アクセスの仕方が分からなかったので、「GUIから消せばいいや」とherokuのアプリケーションページへ。
#### ”Add-ons"の右端にある「×」マークで消した。 ####

その後、同じページの"Get Add-ons"からアプリケーションに向けてPostgreSQLを改めてAdd。

```heroku run python manage.py syncdb```を実行すると、


>Running `python manage.py syncdb` attached to terminal... up, run.1453
Creating tables ...
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)


うまくいったかと思いきや、ページにアクセスすると正体不明のエラーになった。
>OperationalError at /

>FATAL:  role "ognimhmmzwucqv" is not permitted to log in

現場：http://thawing-shelf-8495.herokuapp.com/

そこで、現状のモデル設定がどんな内容なのかを確認するため、```heroku run python manage.py sql [appname]```を実行。

すると、いかにも「失敗しました」という感じでログがずらっと出てくる。
一番下にエラーメッセージを発見。

>django.db.utils.OperationalError: FATAL:  role "ognimhmmzwucqv" is not permitted to log in

"ognimhmmzwucqv”という文字列は不可解さ加減からするとIDか何かだと思われるのだが、データベースのIDだろうか？新しいデータベースのアクセス権減がないと言われてる気がする。

-

というか、たった今ふと間違いに気付いた。

### テーブルでなくてデータベースそのものを消してるじゃないか。 ###

かなりの確率でそれが今回の要因・・・・・どなたかアドバイスをお願いします。
CANNON.jsでContactMaterialを使う


CANNON.jsでは剛体同士の衝突時の反応を、`CANNON.Material`と`CANNON.ContactMaterial`というマテリアルを使って設定することが出来ます。（例えばつるつるすべる氷の上、みたいなことも表現できます）

Three.jsでは3Dオブジェクトの質感などを表現するマテリアル。
物理エンジンでは衝突時の質感を表す、と考えるといいでしょう。
（例えば氷だったらつるつるの質感、ざらざらな質感は摩擦が大きい、とか）

マテリアルを使った設定は以下の手順で行います。

---

1. `CANNON.Material`を生成
2. 生成したマテリアルを、そのマテリアルを持たせたい剛体を生成する際に引数に指定する
3. 別の`CANNON.Material`を生成
4. 別のマテリアルを設定したい剛体に設定する（2と同じ）
5. 生成したふたつのマテリアルが`接触した際`にどう反応するかを`CANNON.ContactMaterial`を用いて設定
6. `world.addContactMaterial()`メソッドで、生成したContactMaterialをworldに追加

---

これの実際のプログラムサンプルは以下になります。
（地面とキューブのふたつの剛体を生成するサンプルです）

```ContactMaterialSample.js
//地面用マテリアル
var groundMat = new CANNON.Material('groundMat');

//地面用の剛体を質量0で生成する
var ground= new CANNON.RigidBody(0, plane, groundMat);

//物理世界に追加
world.add(ground);

//Cube用マテリアル
var cubeMat = new CANNON.Material('cubeMat');

//地面用マテリアルとCube用マテリアルが接触した際のContactMaterialを生成
var cubeGroundCM = new CANNON.ContactMaterial(
    groundMat, //ひとつ目のマテリアル
    cubeMat,   //ふたつ目のマテリアル
    0.8,       //friction（摩擦係数）
    0.05       //restitution（反発係数）
);

//生成したContactMaterialをworldに追加
world.addContactMaterial(cubeGroundCM);

//Cube形状の剛体を生成
var rigidbody = new CANNON.RigidBody(mass, cube, cubeMat);
world.add(rigidbody);
```

若干はしょっている部分がありますが、基本的には剛体とマテリアルを1対1で生成し、さらにマテリアル同士の衝突用マテリアルを生成し、それをworldに追加する、という感じです。

ContactMaterialは、衝突したマテリアル同士の性質によって応答が変わることを表現しやすくするためだと思います。
普段はとても跳ねるマテリアルだけど、特定のマテリアルを持った剛体の場合は逆に吸着する、みたいなこともできると思います。

マテリアルをうまく設定できるとだいぶリアルな感じにできるのでぜひ使いこなしたいですね。
iOS7でナビゲーションバーの下にViewが重なる現象。


iOS7でNavigationbarとViewが重なってしまった問題の解決策です。


```objective-c 

self.edgesForExtendedLayout = UIRectEdgeNone;
```
上記のコードをViewDidLoadなりで指定してあげます。


ただ、コード自体はたった一行ですがiOS7の半透明効果を得られなくなるのでご注意を。
MySQLのBIT型にPHPのPDOが対応していない問題のWorkaround

BIT型のリテラルだけ、変数に置くのはどうでしょうか。

```php:test.php
$db->exec("SET @val = 0b0011");
$stmt = $db->prepare("UPDATE SET column = @val WHERE id = :id");
$stmt->bindValue(':id', 123);
$stmt->execute();
```
Macでシステムの音量を微調整する

音量の微調整をするショートカットをいつまでたっても覚えられないのでメモメモ。

`(fn +) shift + option + (F11 or F12)`

fnも押す必要がある人は、普通に押した場合に`Fxx`キーとして動作するように設定している人。私です。

システムの音量は普段一定にしておいて、出来るだけソフトウェア側の音量を変更したりしてるのだけど、それでも音量が小さすぎたり大きすぎたりするときにはシステムの音量を変えたりする……のだけど毎回これを思い出せずに、適当に`control`とか`shift`とか`⌘`とか押して「あれー？」って顔をしていたりします。
複数のmp4の特定のフレームをjpgにする


HTMLでVideo要素のPoster属性をガーっと作りたいときって、息をするよりも、めっちゃくちゃ頻度あるよね！


# やること
* ffmpegでPNG生成 
  * (ffmepgでjpgも生成できるけど、めっちゃくちゃ画質が悪い)
* ImageMagick でjpgにする
* zmvで一括リネーム
  * [zsh の zmv を使って簡単に複数ファイルを一括リネームする](http://mollifier.hatenablog.com/entry/20101227/p1)


``` convert2jpg.sh
find *.mp4 -exec ffmpeg -i {}  -ss 0 -f image2 -vframes 1 {}.png \;
mogrify -format jpg -quality 70 *.png
rm *.mp4.png
zmv -f *.mp4.jpg *.jpg

```
AWS S3のアクセスログを検索する。

みなさん、AWSのS3を使ってますか？
S3を使って、Webサイトを作ることができるのです。

さらには、S3には、アクセスログを取得する仕組みもあるのです。

しかしながら、S3のアクセスログを検索するのは、とても大変です。
そこで、検索を簡単にするためにS3のアクセスログを検索するツールを作りました。
使い方は簡単で、セキュアです。ぜひご利用ください。

# S3のアクセスログ

Amazon Web ServicesのS3はアクセスログを取得することができます。
設定は、AWS Management Consoleから設定できます。

![enable_accesslog.png](https://qiita-image-store.s3.amazonaws.com/0/34674/8e2d46f9-4151-4a11-6ad5-87c1abb93986.png)

# 検索は、大変。
フォーマットはこんなかんじです。
http://docs.aws.amazon.com/AmazonS3/latest/dev/LogFormat.html
アクセスログは、S3のbucket上の複数のファイルにバラバラと置かれるため、例えば、レスポンスコード500のみを取り出したい、とか、特定のURLのアクセスログのみを取り出したい、とかいう場合、とても面倒です。

# ログ検索ツールを作りました。
あまりにも検索が大変なので、ログをGrepできるツールを作りました。
http://s3loggrep.saytone.net
![s3loggrep_img.png](https://qiita-image-store.s3.amazonaws.com/0/34674/8a54d429-51b6-e828-a6d5-93849811ee90.png)

# 使い方
アクセスログが入っているバケツの設定と、IAMアカウント（鍵ペア）があれば、すぐに利用できます。
ブラウザ上で動作し、S3とブラウザが直接ログをやりとりするため、セキュアに使えます。

また、ログファイル名のPrefixを指定可能なので、Prefixに、{S3で指定したPrefix}{年}-{月}-{日}の形式、例えば
accesslog2013-12-24
を指定すれば、2013年12月24日のログのみをソートすることも可能です。メリークリスマス。

ぜひ、お試しください。
http_proxy変数でネット制限が便利

proxyのありがたさを感じてきた。

* DBサーバーのようにネットに直接接続できないサーバーでもproxyサーバー経由でネットにアクセスできる。
  * ネットにさらしていないので安心。
* ユーザーごとにネット接続が可/不可が可能。

```bash:そのままだとネットにアクセス出来ない環境ですが・・・
$ wget http://i.gzn.jp/images/logo.png
--2014-01-08 20:27:56--  http://i.gzn.jp/images/logo.png
Resolving i.gzn.jp (i.gzn.jp)... failed: Connection timed out.
wget: unable to resolve host address ‘i.gzn.jp’
```

```bash:http_proxyをセットすることでネットにアクセスできます。
$ http_proxy=http://192.168.11.23:3216/ wget http://i.gzn.jp/images/logo.png
--2014-01-08 20:28:10--  http://i.gzn.jp/images/logo.png
Connecting to 192.168.11.23:3216... connected.
Proxy request sent, awaiting response... 200 OK
Length: 5026 (4.9K) [image/png]
Saving to: ‘logo.png’

100%[==========================================================>] 5,026       --.-K/s   in 0.02s

2014-01-08 20:28:10 (260 KB/s) - ‘logo.png’ saved [5026/5026]
```

* 認証が必要な場合は以下のように指定します。
  * http_proxy=http://ユーザ名:パスワード@192.168.11.23:3216/ 
* `export http_proxy`しておけば、apt-getでパッケージのインストールも可能。
* httpsはhttps_proxyをセットします。
PRESEEDでbtrfsを設定する

PRESEEDでbtrfsという構成を見かけないので実際のにubuntuにて確認。
 - rootとhomeをサブボリュームで構成 [ubuntu default](https://github.com/linuxmint/ubiquity/blob/master/d-i/source/partman-btrfs/fstab.d/btrfs)
 - 使用HDDは120GB SSD
 - /bootはext4でカーネル数個分の容量を確保されればよしとする
 - swapはだいたいメモリ量分を確保されればよしとする
 - 残りをbtrfsへ

```
#======================================
# PARTMAN PARTITIONING SECTION START
#======================================
d-i partman/confirm_nooverwrite boolean true

# My Environment: ubuntu is /dev/sdd
d-i partman-auto/disk string /dev/sdd
d-i partman-auto/method string regular
d-i partman-auto/expert_recipe string			\
    boot-root ::					\
	      128 16 256 ext4				\
		  $primary{ } $bootable{}		\
		  method{ format } format{ }		\
		  use_filesystem{ } filesystem{ ext4 }	\
		  mountpoint{ /boot }			\
	      .						\
	      100% 512 120% linux-swap			\
		  $primary{ }				\
		  method{ swap } format{ }		\
	      .						\
	      65536 1024 -1 btrfs			\
		  $primary{ }				\
		  method{ format } format{ }		\
		  use_filesystem{ } filesystem{ btrfs }	\
		  options/subvol{ @ }			\
		  options/ssd{ ssd }			\
		  mountpoint{ / }			\
	      .
d-i partman-auto/choose_recipe select root
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select Finish partitioning and write changes to disk
d-i partman/confirm boolean true
#======================================
# PARTMAN PARTITIONING SECTION END
#======================================
```

上記構成でインストールした後、確認。結果は以下

```
# mount  grep sdd
/dev/sdd3 on / type btrfs (rw,ssd,subvol=@)
/dev/sdd1 on /boot type ext4 (rw)
/dev/sdd3 on /home type btrfs (rw,ssd,subvol=@home)

# fdisk /dev/sdd

Command (m for help): p

Disk /dev/sdd: 120.0 GB, 120034123776 bytes
255 heads, 63 sectors/track, 14593 cylinders, total 234441648 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000a8871

   Device Boot      Start         End      Blocks   Id  System
/dev/sdd1            2048      249855      123904   83  Linux
/dev/sdd2          249856     8603647     4176896   82  Linux swap / Solaris
/dev/sdd3         8603648   234440703   112918528   83  Linux

Command (m for help): q

# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdd3       108G  1.1G  105G   2% /
udev            2.0G  4.0K  2.0G   1% /dev
tmpfs           787M  400K  787M   1% /run
none            5.0M     0  5.0M   0% /run/lock
none            2.0G     0  2.0G   0% /run/shm
cgroup          2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/sdd1       114M   28M   80M  27% /boot
/dev/sdd3       108G  1.1G  105G   2% /home
# free
             total       used       free     shared    buffers     cached
Mem:       4029096     168080    3861016          0        728      57208
-/+ buffers/cache:     110144    3918952
Swap:      4176892          0    4176892
```
PlayフレームワークでMYSQLの設定を行う


MYSQLの設定からマイグレート実行までの手順を記述。

前提条件：
playのアプリケーションが作られていること。
MYSQLが準備されていること。


##ビルドの設定変更

MYSQLドライバが取得できるようにビルドの設定を書き換える。
(property/build.sbt:ビルドの設定ファイル)

次のようにmysqlドライバの記述を追加する。

```build.sbt
libraryDependencies ++= Seq(
  jdbc,
  anorm,
  cache,
  "mysql" % "mysql-connector-java" % "5.1.24"
) 
```

##データベースの接続設定

アプリケーションの設定ファイルを書き換える。
(conf/application.conf:設定ファイル)

下記の記述がされるようにコメントアウトを外し内容を修正する。

```application.conf
db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://localhost/データベース名"
db.default.user=<ユーザー名>
db.default.password=<パスワード>
db.default.logStatements=true
```

アプリを起動すると自動的にドライバがダウンロードされる。

```
$ play run
```

##マイグレートファイル作成
次のディレクトリを作成する。
conf/evolutions/default

次のファイルパスになるようにSQLファイルを作成する。
conf/evolutions/default/1.sql
※２番目、３番目とファイルを足すときはファイル名の数字を増やしていく。

SQLファイルには下記のような記述を行う。

```1.sql
# --- !Ups

create table dummy(
	id integer not null, 
	name varchar(255), 
	created_at datetime not null, 
	updated_at datetime not null, 
	version integer not null
	);

# --- !Downs
  drop table dummy

```

※Ups以下はマイグレート時に実行されるSQL
※Downs以下はマイグレート差し戻し時に実行されるSQL


##マイグレートの実行

ホームのURLにアクセスするとマイグレートを実行するかきかれるのでボタンを押して実行する。
(http://ホスト名:9000など)
emacsのtrampでsudoするとhangup

Emacsのfind fileで

```
/sudo::/etc/hosts
```

とかするとsudo権限でファイルが開けるのだが、emacsが何故かフリーズするようになった。
ちなみに環境はfedora19, emacs24.3.1.

```el
(setq tramp-verbose 6)
```

とかしてtrampの処理を見ていくと

```shell-session
exec sudo -u root -s -H -p Password:
```

の処理の後に止まってるっぽい。
このコマンドを実際に入力してみると、

```
[username@hostname]currentdir#
```

みたいなプロンプトになる...あれ...zshデファルトのプロンプトってこんなんだっけ？
これはtrampのpatternに入ってないでしょってことで、`/etc/zshrc`を見に行ったら、プロンプト設定`PROMPT=`って行がありますよ...
これをコメントアウトしたら無事動きました。

ちなみに、ubuntu13.10やOSX Marverick(homebrewで入れた奴)のzshプロンプトは特に設定してなかったのに... 余計なお節介だ... 昔は普通にfedoraでも出来たはずだし...いつからかこんなデフォルトが入ったってことか...
PHPで大量（21個以上）のファイルをアップロード


PHP側のデフォルトの設定で、
1回の送信で送れるファイルの個数は20個までになっている。

送信可能な個数の変更はphp.ini,httpd.confからパラメータを渡す必要があるので、
.htaccess,PHPscriptでのみPHPの設定が変えることのできるサーバでは難しい。

~~~ shellscript:php.ini,httpd.conf
// 最大ファイルアップロード数を30に設定する
max_file_uploads = 30;
~~~


// ----------------- 参考URL
・ ファイルアップロード - PHP.net
http://www.php.net/manual/ja/ini.core.php#ini.sect.file-uploads

・ PHP 設定変更できるの？できないの？ - パソコンＱ＆Ａ
http://kikky.net/pc/php_ini_set.html
elasticsearchでjsonをimportする(高速)

# jsonを作成する
```json:requests.json
{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "1" } }
{ "field1" : "value1" }
{ "index" : { "_index" : "test", "_type" : "type1", "_id" : "2" } }
{ "field1" : "value2" }
```

# bulk importする
```
curl -s -XPOST localhost:9200/_bulk --data-binary @requests.json > /dev/null
```

# 標準出力からも可
```
curl -s -XPOST localhost:9200/_bulk --data-binary @<(head -n 2 requests.json) > /dev/null
```


# gzip圧縮されたファイルでbulk importする

## elasticsearch.ymlに追記
```yaml:elasticsearch.yml
http.compression: true
```

## インポート
```
curl --compressed -H "Content-encoding: gzip" -XPOST localhost:9200/_bulk --data-binary @requests.json.gz > /dev/null
```
AutoScaling時に立ち上がるEC2インスタンスのNameタグに値を設定する


aws-cliを導入済みの前提です。

参考
http://www.slideshare.net/serverworks/auto-scaling-17149997?ref=http://takachan.hatenablog.jp/entry/2013/06/23/172558
http://docs.aws.amazon.com/cli/latest/reference/autoscaling/create-auto-scaling-group.html


AutoScalingですが、ずっとCLIでの設定しかできなかったのですが、
http://qiita.com/eyesonly/items/35e4d3e5bf06b55dc85c
のようにManagementConsoleからできるようになりました。
しかし残念ながら、一部機能に制限があるようです。

特に気になっているのが、ScaleOut時に生成されるEC2のNameタグにつく値を設定出来ないのは惜しいところです。

なのでしばらくはCLIツールを利用する必要がありそうです。

Nameタグの設定は、AutoScalingGroupなので、そこだけの例です。

```shell
aws autoscaling create-auto-scaling-group \
--auto-scaling-group-name <AutoScalingGroup名> \
--launch-configuration-name <LaunchConfig名> \
--min-size 1 \
--max-size 4 \
--availability-zones ap-northeast-1a ap-northeast-1c \
--load-balancer-names <ELB名> \
--health-check-type ELB \
--health-check-grace-period 60 \
--vpc-zone-identifier <SubnetID>,<SubnetID> \
--tags Key=Name,Value=<EC2のNameタグに設定したい値>
```

早くManagementConsoleからも設定出来るようなるといいですね。
Tick-Tack-Toe


（元ネタは http://nabetani.sakura.ne.jp/hena/1/ ）
怠けて反則処理を別立てにしたら後で苦しむはめに（しかしそのまま書いた）。

あ、なるほど、最初から8本ラインを用意する、というのもあるのか。

あと、コード中にハードに書いてしまっているものの、一応は3×3でなくなっても
容易に手直しできるように書くようにしたのだが、問題の具体的条件に
つけこんだ感じで書くほうが良かったりとかするものなのだろうか。


```hs:TickTackToe.hs
module Main where

import Data.List
import Data.List.Split (chunksOf)
import qualified Data.Map as M

import Control.Applicative
import System.Environment (getArgs)

-- 先手反則勝ち、後手反則勝ち、先手勝利、後手勝利、引き分け、途中
data Result = BF | WF | BW | WW | Draw | Yet deriving (Eq, Ord)
instance Show Result where
  show BW = "o won."
  show WW = "x won."
  show Draw = "Draw game."
  show BF = "Foul : o won."
  show WF = "Foul : x won."
  show Yet = "Not finished yet."

data Cell = B | W | E deriving (Eq, Show)
type Field = M.Map (Int,Int) Cell
type Move = (Cell, Int) -- （手番,着手位置）

parse :: String -> [Move]
parse str = take 9 $ zip (cycle [B,W]) $ map read $ transpose [str]


construct :: [Move] -> [Field]
construct moves = tail $ reverse $ construct' moves [empty]
  where
    empty = M.fromList [((x,y),E)|x<-[0..2],y<-[0..2]]
    construct' [] field = field
    construct' (m:ms) field = construct' ms (nf:field)
      where 
        nf = M.insert (div (snd m -1) 3, mod (snd m -1) 3) (fst m) (head field)

checkFault :: [Move] -> (Int, Maybe Result)
checkFault xss = check' xss []
  where 
  	check' [] _ = (0, Nothing)
  	check' (x:xs) acc = if elem (snd x) acc
  	  then case fst x of
  	  	W -> (length acc +1, Just BF)
  	  	B -> (length acc +1, Just WF)
  	  else check' xs (snd x:acc)

checkGame :: Field -> Maybe Result
checkGame f = find (/=Yet) $
  (map checkLine $ chunksOf 3 [f M.! (x,y)|x<-[0..2],y<-[0..2]])++
  (map checkLine $ chunksOf 3 [f M.! (y,x)|x<-[0..2],y<-[0..2]])++
  (map checkLine $ chunksOf 3 [f M.! (x,y)|x<-[0..2],y<-[0..2],x==y])++
  (map checkLine $ chunksOf 3 [f M.! (x,y)|x<-[0..2],y<-[0..2],(x+y)==2])

checkLine  xs = if (and $ map (==B) xs) then BW
                else if (and $ map (==W) xs) then WW 
                else Yet

judge str = let result = insert (checkFault $ parse str)$ zip [1..] $
                          (map checkGame $ construct $ parse $ str)
            in case find ((/=Nothing).snd) result of
             Just (_, (Just x)) -> x 
             Nothing -> Draw

main = judge<$>concat<$>getArgs >>= print

```
hostsファイルのキャッシュをクリアする

サーバの接続先を`/etc/hosts`で管理していると、IP変更時に書き換えても変わらないことがある。
そんなときにキャッシュをクリアする方法。

```
# /usr/sbin/nscd -i hosts
```

##### `-i`オプション
```
  -i, --invalidate=テーブル   指定キャッシュは無効です
```
【PHP】【Apache】Apache2.2x + PHP(5.4,5.5) 利用の設定(httpd.conf)

こんにちは。

参考は
http://www.adminweb.jp/apache/php/
になりますが、PHP5.4系で今回すんなり通ったため、メモとして残します。

__※因みに僕は事情により、5.4系にしました__

>
環境：
Windows 7
Apache2.2
PHP5.5.7-win32 or
PHP5.4.6-win32


同様手順：
Apacheのインストールとダウンロード
PHPのインストールとダウンロード
(zipファイルをC:\phpに展開しました)

こちらは検索でもかなり多数出てくるので省略します。

今回書きたいのはhttpd.conf設定について。

###httpd.confの編集

__モジュールの追加__

__まずファイルの参照先が必ず存在するか確認する__
モジュールを追加する際、特に気をつけてください。

約49行目付近の
>
 #
 # Dynamic Shared Object (DSO) Support
 #

ブロック最下部に、モジュールを登録する記述をします。

PHP5.5.7の場合
__php5apache2_4.dll__
PHP5.4.6の場合
__php5apache2_2.dll__
というファイルが存在するので、
それぞれ、
__LoadModule php5_module c:/php/php5apache2_4.dll__
__LoadModule php5_module c:/php/php5apache2_2.dll__
と追加します。

__次に拡張子.phpをPHPと関連付ける。__

約368行目のAddTypeとあるところの最後のブロックに
>
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
を追加。

そして最後の行に
>
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
>
PHPIniDir "c:/php"

を追加し、Apacheを再起動しておしまい。
__なのですが、5.5xだとここでApacheが起動しなくなります。__

理由を調べたところ、まず一度環境変数を通し(c:/php)
コマンドプロンプトでバージョンが確認できるかを行いました。

>
php -v

エラーがでました。
MSVCR100.dllがない模様です。

これはダウンロードしてこなければいけないようです。
参考：
http://www.phpbook.jp/install/install/index2.html

MSVCR100.dllをダウンロードし、再起動するとどうやら動く模様です。

(ここで僕は5.4系を調べ始め、
php5apache2_2.dll　が5.4.6に含まれていることや
特に追加ダウンロードが必要ないため
PHP5.4.6に決めました)

あとはphpinfo()が表示されるか確認。

>
<?php
phpinfo() ;
?>

これで表示されれば、連携はできた模様です。

何回やっても引っかかってしまうこのミス・・。
ようやくメモに残すことができました。。

それではこれからも宜しくお願いいたします。
RabbitMQでClojureのデータをやりとりする

[RabbitMQ](http://www.rabbitmq.com/)と[data.fressian](https://github.com/clojure/data.fressian)を使って、Clojureのデータを受け渡しする実験です。

RabbitMQはAMQP実装の代表的なプロダクトで、本格的なキューイングシステムでありながら手軽に試してみることができます。Windowsでもインストールパッケージがあるので[楽々インストールできます](http://www.rabbitmq.com/install-windows.html)。(ただし[Erlangが必要](http://www.erlang.org/download.html)ですが)

data.fressianはFressianフォーマットのデータをClojureで扱うためのライブラリです。

Fressianとは、Datomicを開発する上で作られたデータフォーマットで、

* バイナリフォーマット 
* 拡張可能
* スキーマレス

が特長です。まぁこれだけだと尖ったところはなく、one of themな印象です、が…
Clojurianにとっての最大のメリットは、Clojure使いがFressianを開発しているという点に尽きます。そしてこのClojureライブラリである[data.fressian](https://github.com/clojure/data.fressian)を使えば、非常に簡単にClojureデータのserialize/deserializeが可能です。

```clj
=> (require '[clojure.data.fressian :as fress])
=> (def fress-obj (fress/write {:a 1 :b 2}))
#<HeapByteBuffer java.nio.HeapByteBuffer[pos=0 lim=14 cap=32]>
=> (fress/read fress-obj)
{:a 1, :b 2}
```

こんな感じです。

さて、このdata.fressianを使ってシリアライズしたデータをRabbitMQに載せてみます。
RabbitMQ用のClojureライブラリは、[Langohr](https://github.com/michaelklishin/langohr)という最近バージョン2.x系にメジャーバージョンアップされたものがあります。

それでは、データをシリアライズして送る方を書いてみます。RabbitMQはデフォルトポートで起動している想定です。

```clj
(require '[langohr.queue :as lq]
         '[langohr.core :as rmq]
         '[langohr.channel :as lch]
         '[langohr.basic :as lb]
         '[langohr.consumers :as lc]
         '[clojure.data.fressian :as fress])
 
;; Publish clojure values
(let [conn (rmq/connect {:uri "amqp://localhost"})
      ch   (lch/open conn)]
  (lq/declare ch "test-queue")
  (try
    (lb/publish
     ch "" "test-queue"
     (->> {:a {:b [1 2 3] :c "CC" :d #{4 5 6}}}
          (fress/write)
          (.array)))
    (catch Exception e (.getMessage e))
    (finally (rmq/close ch)))
```

やり口としてはchennelをオープンして、publish関数でデータを送信してやるだけです。その際data.fressianのwrite関数を使ってシリアライズします。結果はHeapByteBufferになるので、arrayメソッドを呼んでバイト配列を取り出してRabbitMQに投げています。

これを受け取ってみます。メッセージの受け取りはPull型とPush型の両方が可能です。

それぞれこんな感じになります。

```clj
;; Consume clojure values (Push API)
(let [conn (rmq/connect {:uri "amqp://localhost"})
      ch   (lch/open conn)]
  (lq/declare ch "test-queue")
  (lb/consume ch "test-queue"
    (lc/create-default ch
      :handle-delivery-fn (fn [ch metadata payload]
                            (println (fress/read payload))))))
 
;; Consume clojure values (Pull API)
(let [conn (rmq/connect {:uri "amqp://localhost"})
      ch   (lch/open conn)]
  (lq/declare ch "test-queue")
  (try
    (if-let [[metadata msg] (lb/get ch "test-queue")]
      (println (fress/read msg)))
    (catch Exception e (.getMessage e))
    (finally (rmq/close ch))))
=> {:a {:b #<ArrayList [1, 2, 3]>, :c CC, :d #<HashSet [4, 5, 6]>}}

```

受け取ったメッセージをdata.fressianのread関数を呼んであげると元のClojureデータが復元できます。

> 現在のdata.fressianのバージョン(0.2.0)では、VectorはJavaのArrayListに、SetはJavaのHashSetにそれぞれ変換されてしまうので注意が必要です。
> プルリクエストもあがっているので、次のバージョンではちゃんとVectorにマッピングされるようになるかもしれません。
> https://github.com/clojure/data.fressian/pull/2

と、このようにRabbitMQとdata.fressianを使うと、異なるアプリケーション間でClojureのデータを、非常に簡単に受け渡しすることができます。
pythonクイズ


aとbを統合してcのような配列を作成する美しいpythonのコードを書け

```python
a = [{"word":"a","tfidf":0.5},
{"word":"b","tfidf":0.1},
{"word":"c","tfidf":0.2}]

b = [{"word":"d","tfidf":0.3},
{"word":"a","tfidf":0.2},
{"word":"c","tfidf":0.4}]

c = [{"word":"a","tfidf":0.7},
{"word":"b","tfidf":0.1},
{"word":"c","tfidf":0.6},
{"word":"d","tfidf":0.3}]
iPhoneでwindow.alertが閉じれない時

色んなケースで閉じれない場合あると思うけど自分の場合は、
input[type=file]で指定された枚数以上のファイルが指定されたら、
JSでalert出すみたいな処理を書いた時にalertが全然閉じれなかった。

とりあえず下記のように処理をずらせば閉じれたのでメモ。

```js
setTimeout(function(){
    window.alert('＼(^o^)／');
}, 100);
```