OmniAICreator/Qiita-1.07M huggingface dataset:
第10回オフラインリアルタイムどう書く参考問題をRubyで解く

コメントを頂いたので、そのコメントを基にコードを修正した。

```ruby
def get_sequence(cards, size)
  ret = []
  sequence = ""
  cards.map{|_| _.gsub(/[shdc]/, "")}.permutation(size) do |_|
    0.upto(_.size - 1) do |i|
      sequence += _[i]
    end
    ret.push(sequence)
    sequence = ""
  end
  ret
end

def royal?(sequence)
  sequence.any?{|_| _ == "10JQKA"}
end

def sequence?(sequence)
  sequence.any?{|_| "A2345678910JQKA".include?(_)}
end

def solve(src)
  rank = {"J"=>11, "Q"=>12, "K"=>13, "A"=>14}
  cards = src.scan(/.{1,2}[shdc]/).flatten.sort_by{|_| rank[_[0]] || _.to_i}
  grouped_cards = cards.group_by{|_| _[-1]}
  if grouped_cards.keys.size == 1
    sequence = get_sequence(cards, 5)
    royal?(sequence) ? "RF" : sequence?(sequence) ? "SF" : "FL"
  elsif sequence?(get_sequence(cards, 5))
    "ST"
  elsif grouped_cards.values.map{|_| _.size}.max == 4
    key = grouped_cards.find{|k, v| v.size == 4}[0]
    sequence?(get_sequence(grouped_cards[key], 4)) ? "4SF" : "4F"
  else
    sequence = get_sequence(cards, 4)
    sequence?(sequence) ? "4S" : "-"
  end
end

DATA.each do |line|
  no, src, expected = line.split
  actual = solve(src);
  result =  expected == actual ? "ok" : "***NG***"
  puts "#{no} : #{result}"
end

__END__
0 Qs9s3dJd10h 4S
1 KdAdJd10dQd RF
2 QhJhKhAh10h RF
```
FEZ PandaⅡで.NET Microframework 4.1のビルド時に0x80131700のエラーがMMPで発生する

これはツールの参照が.NET Frameworkの2.x～3.5のライブラリを指しているためです。そのため、.NET Framework 4.xだけが入っている環境だとわけのわからないエラーを起こします。この解決法はStackoverflowにアーティクルが公開されていますが、MetaDataProcessor.exeを.NET Framework 4.xのアセンブリを参照するように.configファイルを加えます。当該.configファイルはCodePlexで公開されています。
*http://stackoverflow.com/questions/4321114/0x80131700-build-error-on-net-micro-framework
*http://netmf.codeplex.com/workitem/221
Javaで複数の画像ファイルをリサイズしてExcelに一括貼り付け（POI）


画像ファイルを一つのセルに一つずつ収めたExcelファイルを自動生成する方法です。
Apache POIを使用しました。
http://poi.apache.org/

* セルのサイズ指定はSheetクラスのsetColumnWidthメソッドとRowクラスのsetHeightInPointsメソッドで行いますが、setColumnWidthは単位が「1文字の幅の1/256」、setHeightInPointsはポイント指定で若干ややこしいです。

* ClientAnchorクラスでアンカーを設定することで、画像とセルを関連付けることができます。これにより、**画像をセルごとコピペすることが可能になります**。setAnchorTypeメソッドの引数で画像とセルの関連を指定出来ます(0:セルに合わせて画像の移動、サイズ変更をおこなう。2:セルに合わせて移動するが、サイズは変更しない。3:セルに合わせて移動もサイズ変更もしない)

* Pictureクラスのresizeメソッドは引数で拡大縮小率を指定できます。例えば拡大200%なら2、縮小50%なら0.5です。**画素数は元のファイルのままです。**


以下、imgフォルダの連番pngファイル(1.png, 2.png, ...)を
セルにあわせて自動的に縦一列に貼り付けるプログラムです。

```java:ImageListGenerator.java

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Picture;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;


// メインクラス
public class ImageListGenerator {
	public static void main(String[] args) {
		ImageListGenerator ilg = new ImageListGenerator();
		ilg.main();
	}
	// メイン
	public void main() {
		// excelシートクラス作成
		Workbook wb = new XSSFWorkbook();
		Sheet sh = wb.createSheet("ImageList");
		sh.setColumnWidth(0, 50 * 256);
		
		Integer i = new Integer(1);
		while (true) {
			// ファイル読み込み
			File file = new File(i.toString() + ".png");
			//File file = new File("./img/" + i.toString() + ".png");
			if (file.exists()) {
				try {
					ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
					// イメージファイル作成
					BufferedImage img = ImageIO.read(file);
					ImageIO.write(img, "png", byteArrayOut);
					//行作成
					Row row = sh.createRow(i);
					row.setHeightInPoints(180);
					//画像描画
					Drawing drawing = sh.createDrawingPatriarch();
					ClientAnchor anchor = drawing.createAnchor(0,0,0,0,0,i,0,i);
					anchor.setAnchorType(0);
					int picIndex = wb.addPicture(byteArrayOut.toByteArray(), Workbook.PICTURE_TYPE_PNG);
					Picture pic = drawing.createPicture(anchor, picIndex);
					//元の画像のサイズに合わせてリサイズ
					pic.resize(Math.floor(220 / (double) img.getHeight() * 100) / 100);
				} catch (IOException e) {
					e.printStackTrace();
				}
			} else {
				break;
			}
			i++;
		}
		try {
			FileOutputStream out = new FileOutputStream("ImageList.xlsx");
			wb.write(out);
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

```
Mac OS XでR言語をインストールしてEclipseから使う

(2014.02.18更新 XQuartzのインストール、brew tap homebrew/scienceが必須とのことなので追記)
(2014.02.19更新 各ソフトウェアを最新版に更新)

# Rのインストール
RのインストールにXQuartzが必須なのでインストールしておきます。
https://xquartz.macosforge.org/landing/

Homebrewを使います。
Rはhomebrew/scienceに入っているのでtapします。
Rのインストールにはgfortranが必要なので先にgfortranを入れます。

```
brew install gfortran
brew tap homebrew/science
brew install r
```

2014.02.19現在、gettextのライブラリがリンクされなくてrgl等のインストールを蹴られる不具合があるようなので、brew linkします。

```
brew link gettext --force
```

# StatETのインストール

StatETはEclipseからR言語を使用するためのプラグインです。

StatET - WalWare
http://www.walware.de/goto/statet

EclipseメニューのHelp→Install New Software→
Work withのテキストボックスに
http://download.walware.de/eclipse-4.3
を入力してAddします。

上記サイトを選択するとリストにWalWare - StatETが表示されるので、
StatET for Rにチェックを入れてインストールします。


# StatETおよびRの設定

EclipseのメニューバーのRunボタンから
Run configurationsのメニューを開きます。

R ConsoleをダブルクリックしてNew_configurationを作成します。
R Configのタブを選択し、Selected Configurationの右のConfigureを選択すると
環境設定のR Environmentsが開きます。

R EnvironmentsのAddを選択。
Nameは適当でよいです。Locationの右のボタンを選択し、
Rのインストールフォルダ
/user/local/Cellar/r/3.0.2
を選択します。
Detect Default Properties/Settingを選択すると、
Architectureが自動的に入力されます。OKでR Environmentsに戻ります。

OKでRun Configurationに戻ります。
R ConfigタブのWorkbench Defaultを選択します。
Mainタブに移動して、Launch TypeをRtermに変更します。
Commonタブに移動して、EncodingをOtherに変更し、UTF-8を選択します。

Runをクリックすると、Rのコンソールが下側のウィンドウに表示されます。
そのままRのコマンドを入力することが可能です。
また、ツールバーのRun Selection in Rで、
現在選択中のテキストをRコマンドとして実行できます。
ツールバーのRun Entire Commandで、
現在アクティブなRファイルを読み込んでRコマンドとして実行できます。
HTML5における独自データ属性の取り扱い


## 前提条件
この記事は、HTML5に対応したブラウザを使用することを前提として記述している。
HTML5対応のブラウザに関しては以下のサイトを参照のこと。

http://caniuse.com/

## 独自データ属性とは

HTML要素の属性として定義されていない、WebページやWebアプリケーション固有の属性のことを指す。
WebページやWebアプリケーションで固有の独自データを取得する際に使用する。

## 独自データ属性の定義

属性名の先頭に「data-」を付ける。

```html
<ul>
  <li data-user-id="1">Taro</li>
</ul>
```

## 独自データ属性の値を取得する

(1) 一般的なJavaScriptによるコーディング例

HTML要素の dataset IDL属性を使って独自データ属性の値を取得する。
dataset IDL 属性は、要素にセットされたすべての data-* 属性に対して便利なアクセサーを提供している。

```html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
  </head>
  <body>
    <section id="blog" data-author="Taro" data-create-date="2013-04-10">
      <h1>Hello World!</h1>
      <p>This is a sample text.</p>
    </section>
    <script>
      var blog = document.getElementById("blog");
      alert("author : " + blog.dataset.author);
      alert("create date : " + blog.dataset.createDate);
    </script>
  </body>
</html>
```

(注) 独自データ属性の名前に create-date のような複数の単語をハイフンで組み合わせている場合、「-」を区切りとしたキャメル方式の形
式で独自データ属性にアクセスする。

(2) jQueryによるコーディング例

jQueryでは、data()メソッドを使って独自データ属性の値を取得する。ただし、使用するjQueryのバージョンによってdata()メソッドの使い方が変わってくる。

jQuery 1.4.3 を使う場合、「-」を区切りとしたキャメル方式の形式でdata()メソッドを呼び出しても、独自データ属性の値は取得できない。「data-」以降の属性名をそのまま指定しないといけない。

```html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <script src="http://code.jquery.com/jquery-1.4.3.min.js"></script>
  </head>
  <body>
    <section id="blog" data-author="Taro" data-create-date="2013-04-10">
      <h1>Hello World!</h1>
      <p>This is a sample text.</p>
    </section>
    <script>
      var blog = $("#blog");
      alert("author : " + blog.data('author'));
      alert("create date : " + blog.data('create-date'));
    </script>
  </body>
</html>
```

jQuery 1.6以降の場合、「data-」以降の属性名をそのままの形式で指定する、もしくは、「-」を区切りとしたキャメル方式の形式で指定しても、独自データ属性の値を取得することができる。

```html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <script src="http://code.jquery.com/jquery-1.6.1.min.js"></script>
  </head>
  <body>
    <section id="blog" data-author="Taro" data-create-date="2013-04-10">
      <h1>Hello World!</h1>
      <p>This is a sample text.</p>
    </section>
    <script>
      var blog = $("#blog");
      alert("author : " + blog.data('author'));
      alert("create date (Part 1) : " + blog.data('create-date'));
      alert("create date (Part 2) : " + blog.data('createDate'));
    </script>
  </body>
</html>
```

## 参考資料
[HTML5.JP](http://www.html5.jp/tag/attributes/data.html)
[jQuery API Documentation](http://api.jquery.com/data/)
goでhttpsのテストサーバを動かしてアクセスするサンプル

* [net.http](http://golang.org/pkg/net/http/)を使うとテスト用のサーバを立てられます。
* InsecureSkipVerifyをtrueにしておかないと```x509: certificate signed by unknown authority```で```exit status 1```となります。
* trの閉じ中括弧の前で改行するにはカンマが必要です。これがないと```syntax error: need trailing comma before newline in composite literal```というコンパイルエラーになります。


```go:https_sample.go
package main

import (
    "crypto/tls"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "net/http/httptest"
)

func newClient() *http.Client {
    tr := &http.Transport{
        TLSClientConfig: &tls.Config{ InsecureSkipVerify: true },
    }
    return &http.Client{Transport: tr}
}

func getUrl(client *http.Client, url string) {
    res, err := client.Get(url)
    if err != nil {
        log.Fatal(err)
    }
    defer res.Body.Close()

    contents, err := ioutil.ReadAll(res.Body)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("%s", contents)
}

func runServer() *httptest.Server {
    mux := http.NewServeMux()
    mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "Hello, client")
    })
    mux.HandleFunc("/foo", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "Hello, foo")
    })

    return httptest.NewTLSServer(mux)
}

func main() {
    server := runServer()
    defer server.Close()

    client := newClient()
    getUrl(client, server.URL)
    getUrl(client, server.URL + "/foo")
}
```
gitでカレントブランチをpushする

```
git p
```

これでgitのカレントブランチをpushできるようにしてみます。

## カレントブランチの取得

gitリポジトリのカレントブランチは

```
git rev-parse --abbrev-ref HEAD
```

で取得することが出来ます。

```console
[kengo@tkengo-mac] $ git rev-parse --abbrev-ref HEAD
master
[kengo@tkengo-mac] $ git checkout sample-branch
[kengo@tkengo-mac] $ git rev-parse --abbrev-ref HEAD
sample-branch
```

こんな感じ。

## git aliasの設定

`~/.gitconfig` にこういう風に設定します。

```:~/.gitconfig
[alias]
  p = !git push origin `git rev-parse --abbrev-ref HEAD`
```

`!` を最初に置いとくと、シェルのコマンドを書けます。

この設定では **origin** というリモートにしか push できませんが、git の慣習としてほとんどの場合リモートは **origin** として登録してあるので問題ないと思います。

`.gitconfig` を公開してます。
https://github.com/tkengo/dotfiles/blob/master/.gitconfig

## 使い方

最初に書いたように

```
git p
```

で、カレントブランチが push されます。

普通にやると

```
git push origin branch-name
```

と打たないといけないので、だいぶ省略できました。

## ちなみに

僕は zsh を使ってて zsh の alias に

```:~/.zshrc
alias g="git"
```

としてるので

```
g p
```

でカレントブランチを push 出来るようにしてます。
C++,Java腕試し。

WordPressの記事移植。
コードの書き方がチョイ違うけど、基本的なMarkdownは一緒なので、
いい感じ。


# 問題

------------------------

以下の制約を守り、Nの階乗（N!）を返す<code>int computeFactorialN(N)</code>メソッドを実装してください。  
**制約**：if, switch, for, while,比較演算子は利用不可




<br><br><br><br><br><br><br><br><br><br><br><br>

# 正解

---------------------------

<del datetime="2012-12-31T10:21:14+00:00">たしかにJavaは思いつかない。Boolean型の仕様が厳しい。 </del>  
ちなみに<code>computeFactorialN(0) = 0</code>になるのと、  
すぐ<code>int</code>がオーバーフローするのはドンマイ。
<div>


````Answer.cpp
#include <iostream>

static int computeFactorialNotOne(int n);

static bool notEqualOne(int n){
	return (bool)(n >> 1);
}

static int computeFactorialOne(int n){
	return 1;
}

static int (*factorials[2])(int) = {computeFactorialOne, computeFactorialNotOne};

static int computeFactorialNotOne(int n){
	return n * factorials[notEqualOne(n)](n - 1);
}


static int computeFactorialN(int n){
	return computeFactorialNotOne(n);
}

int main(){

	for(int i = 1; i < 10; i++){
		std::cout << "computeFactorialN(" << i 
			<< ") = " <<  computeFactorialN((int)i) << std::endl;
	}
	return 0;
}
````

</div>

0!=1の実装はあと２つくらいメソッドを追加すればおっけー。    
**Javaは0の判断を以下のように行い、メソッドを切り替えればできると別の先輩が教えてくれた**
<div>

````JavaAnswer.java
( (n * -1) >>> (Integer.size() - 1) ) 
````

</div>
JavaからR言語を呼び出せる環境の構築


R言語の実行環境を構築し、
[rJava](http://www.rforge.net/rJava/index.html)を介してJavaからRを呼び出せるまでの設定を行います。

構築するのは Ubuntu12.04 LTS 上です。
jdkは既に入っているとします。


### R言語のインストール
まずはR言語をインストール

```
$ sudo apt-get update
$ sudo apt-get install r-base
$ sudo apt-get install r-cran-*
```

で簡単に完了。

apt-getでは本体は `/use/lib/R` 以下。
`$HOME/R` 以下にもライブラリなどが入る。

パスを通した方が良いらしいので通す。

```
$ export R_HOME=/usr/lib/R
```

参考 : [RjpWiki - Rのインストール](http://www.okada.jp.org/RWiki/?R%20%A4%CE%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB#pbac840c)


### rJavaのインストール
JVM関連のパスをRに設定

```
$ R CMD javareconf
```

Rを起動して、rJavaをインストール。'J' だけ大文字なので注意。

```
$ R
> install.packages('rJava')
```

ミラーサーバを選ぶ画面が出るので適当に選ぶ。( 確かJapan(tsukuba)を選択 )

これで、`/usr/lib/R/site-library/` にrJavaフォルダが出来ている。
`$HOME/R` の奥深くにもrJavaフォルダが出来ている。
(別環境では、`/usr/lib/R/site-liblary/` 以下にrJavaフォルダができないこともある。
　その時でも、`$HOME/R` 以下の `JRI.jar` を利用することで問題なく連携した。)

参考 : [Qiita - jjzak - rjavaのインストールメモ＆rincanterの設定(OSX,Ubuntu)](http://qiita.com/items/470232f08bec4c4df02b)


### Eclipseで動作確認
Eclipseを入れていなかったので、今回はpleiadesを普通にインストール

```
$ sudo apt-get install pleiades
```

改めて動作確認。まずEclipseで普通にプロジェクト作成。

作成途中の「外部jar追加」 で、`JRI.jar` を参照。

```
/usr/lib/R/site-library/rJava/jri/JRI.jar
```

(`$HOME/R` 以下でも大丈夫)

プロジェクトが出来たら、「デバッグ→デバッグの構成」を開いて、
「引数→VMの引数」に以下を追加

```
-Djava.library.path=.:/usr/lib/R/site-library/rJava/jri/
```

また、同じ「デバッグの構成」内の「環境」に、

```
$R_HOME  /usr/lib/R
```

を追加。
追加しないとRは何処だと怒られる。(上で設定した$R_HOMEは何処へ?)

これで基本的な設定は完了。
mainに以下の参考サイトまんまのコードを書いてデバッグ実行。

```
package com.test.r;
import org.rosuda.JRI.REXP;
import org.rosuda.JRI.Rengine;

public class RSample {
        public static void main(String[] args) {
                Rengine engine = new Rengine(new String[]{"--no-save"}, false, null);
                engine.assign("a", new int[]{36});
                REXP result = engine.eval("sqrt(a)");
                System.out.println(result.asDouble());
                engine.end();
        }
}
```

コンソールに6.0が出れば完了。

参考 : [Symfoware - Ubuntu 12.04にEclipseをインストールする](http://symfoware.blog68.fc2.com/blog-entry-937.html)
[binfalse - Talking R through Java](http://binfalse.de/2011/02/talking-r-through-java/)
[hamadakoichi blog - Java R Interface (JRI) を用い 統計解析環境 R を Java から使用する](http://d.hatena.ne.jp/hamadakoichi/20100111/1263227076)


## 使い方
R←→Javaのやり取りは、`Rengine`というクラスで行います。
`assign()`でデータを渡し、
`eval()`で関数を実行するらしい。

assignには数値や配列を渡せる。
行列を直接受け取るメソッドが無いので、代わりに`REXP`というクラスを渡す。
`REXP` クラスとは、RとJavaでのデータ受け渡しに使用されるデータクラスで、
内部でデータ変換をしているものと思われる。

`REXP`にはstaticな`createXXX()`メソッドがあります。
その中に、`Double`の2次元配列を受け取り`REXP`を吐く仕様があるので、
多分これを利用して行列`REXP`を作成し、Rに行列を渡せると思われる。

evalの戻り値も`REXP`クラス。
`REXP` には `asXXXX()`というメソッドが定義されていて、
それによってJava上でXXXの形式で結果が受け取れるらしい。

`asVector()`とか`asXXXMatrix()` という関数があるので、
行列関係の取得も可能。


#### 注意
`Rengine`はSingletonらしく、
2回目以降はnewではなく`Rengine.getMainEngine();`で
インスタンスを取得する必要がある。

参考 : [tomokihirano.com - RをJavaから使う](http://www.tomokihirano.com/blog/2009/10/r-java.html)
[rJava Docs](http://www.rforge.net/org/docs/)
Qiitaの記法まとめ



リファレンス的に使えるように[markdown][]の内容をざっくりとまとめました。

# コードを挿入する

下記のように```の後に使用する言語を指定してあげれば、それに応じたシンタックスハイライトを適用してくれます。

><pre>
```cpp
print("hello\n");
```
</pre>

　　　　**↓**

```cpp
print("hello\n");
```

</br>
:のあとにタイトルを指定することもできます。

><pre>
```sh:hello_world.sh
#!/bin/bash
echo "Hello World !"
```
</pre>

　　　　**↓**

```sh:hello_world.sh
#!/bin/bash
echo "Hello World !"
```
他にも以下の言語を使用できます
C#(cs), C++(cpp), css, html, xml, java, javascript, php, perl, python, ruby, sql
など

# ヘッダーを挿入する
文の次の行に___を入れるとその文がヘッダーになります。

><pre>
ヘッダーをいれる
---
</pre>

　　　　**↓**

ヘッダーをいれる
---

# 太字にする
文を**で囲むとその部分が太字になります。

><pre>
囲んだ文字を**強調**する
</pre>

　　　　**↓**

囲んだ文字を**強調**する

# 見出しを挿入する
文頭に#をいれることで見出しにすることができます。
この#個数は見出しのレベルに対応しています。

><pre>
## h2テキスト
###### h6テキスト
</pre>

　　　　**↓**

## h2テキスト
###### h6テキスト

#　ブロッククオートを挿入する
文頭に>をいれることでブロッククオートを使うことができます。
正しく表示させるためには前後に１行以上の改行を入れないといけません。

<pre>
> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
> Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
> 
> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
> id sem consectetuer libero luctus adipiscing.
</pre>

　　　　**↓**

> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
> Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
> 
> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
> id sem consectetuer libero luctus adipiscing.

</br>
また、改行ごとに>を入れる必要はないので、下のように書いても同じ結果になります。

<pre>
> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.

> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
id sem consectetuer libero luctus adipiscing.
</pre>

# リストを挿入する
文頭に*をつけることでリストにすることができます。

><pre>
* リスト１
* リスト２
* リスト３
</pre>

　　　　**↓**

* リスト１
* リスト２
* リスト３

</br>
また、以下のようにすれば数字のリストも使えます。

><pre>
1.  Bird
2.  McHale
3.  Parish
</pre>

　　　　**↓**

1.  Bird
2.  McHale
3.  Parish

</br>
リストの要素のなかに文を書くときは以下のようにします。

<pre>
*   This is a list item with two paragraphs.

    ここに文を入れるときは先頭にスペース４つorタブ１つをいれます。
    また、前後に１行以上の改行が必要です。

*   Another item in the same list.
</pre>

　　　　**↓**

*   This is a list item with two paragraphs.

    ここに文を入れるときは先頭にスペース４つorタブ１つをいれます。
    また、前後に１行以上の改行が必要です。

*   Another item in the same list.

# リンクを挿入する
><pre>
This is [タイトル](http://example.com/) inline link.
</pre>

　　　**↓**

This is [タイトル](http://www.google.com/) inline link.

</br>
また、以下の用にすればリンクを一カ所でまとめて管理できるので見やすくなります。
（[1]と[2]の前に便宜上空白が入っていますが、本来は必要ありません。）

<pre>
This is [Google][1] .
This is [Yahoo][2] .
　[1]: http://www.google.com/
　[2]: http://yahoo.co.jp/
</pre>

　　　　**↓**

This is [Google][1] .
This is [Yahoo][2] .

[1]: http://www.google.com/ 
[2]: http://yahoo.co.jp/ 


# エスケープ
＼をmarkdownの前におくことでエスケープできるらしいです。
複数行にわたるエスケープをしたい場合は対象の文章を`<pre>`タグで囲めばエスケープできます。

[markdown]: http://daringfireball.net/projects/markdown/syntax.php
Web用のシンボルフォントを作る現実的な方法

**注・こちらの記事はやや内容が古くなっているので、[Symbols for Sketch](https://github.com/cognitom/symbols-for-sketch)をどうぞ**


[リブライズ](http://librize.com)のアイコンをWebフォント化するにあたり、色々はまってしまったので、**さくっとシンボルフォントを作るためのテンプレート**をGitHubに公開しました。Ligature (合字) を使った方法が最近のトレンド(?)ですが、デザイナがしょっちゅう更新をかけるような場合、うまく使えるツールがないのが現状。ここでは、Font Awesomeなどと同様に、UnicodeのPUA (プライベート領域) にフォントを割り付ける、比較的「枯れた」方法をとります。

このテンプレートを使うのに、必要なソフトは2つ。

* Adobe Illustrator
* [Glyphs mini](https://itunes.apple.com/us/app/glyphs-mini/id469036911?mt=12)

Glyphs mini は比較的最近出てきたGlyphsというフォント作成環境の廉価版です。シンボルフォントを作るには十分な機能を備えていて、$45くらい。このニッチな業界としては、限りなくお買い得です。

その他、フォントの変換をローカルで行う場合は、FontForgeなどが必要ですが、その辺りは割愛します。mekkablueさんの説明へのリンクを後半に載せていますので、そちらをどうぞ。

(というわけで、下記は [Symbols](https://github.com/cognitom/symbols) の日本語訳です)

## symbols.ai
シンボルというかアイコンを、Illustrator CS6で作るためのテンプレートです。

- 1792 x 1792 px : ひとつのフォントのサイズ。1792 = 128 x 14 = 64 x 28 なので、14px または 28px で表示した場合に、くっきりはっきり。※Font Awesomeと共通です。Bootstrapの標準文字サイズも14pxです。
- 64 ドキュメント : ひとつのIllustratorファイルに、64文字分のドキュメントが含まれています。64という数字は、ひとつのWebサイトを作成する上では十分な数字です。

![Illustrator](https://github.com/cognitom/symbols/raw/master/images/illustrator.png) 

## symbols.glyphs
Illustratorで作成したアイコンを [Glyphs mini](https://itunes.apple.com/jp/app/glyphs-mini/id469036911?l=en&mt=12) or [Glyphs](https://itunes.apple.com/jp/app/glyphs/id416987633?l=en&mt=12) でフォントにするためのテンプレート。

- 1792 x 1792 px : Illustratorのテンプレートに揃えてあります。(unit per em は1792です)
- U+F700 ~ U+F73F が割当済みです。これらはUnicodeの PUA (プライベート領域)です。

![Glyphs mini](https://github.com/cognitom/symbols/raw/master/images/glyphs_mini.png)

## 使い方

0. GitHub から [ダウンロード](https://github.com/cognitom/symbols/archive/master.zip)。
0. Illustratorで **symbols.ai** テンプレートを使って、アイコン制作。
0. **symbols.glyphs** をGlyphs mini で開いておいて、コピー & ペースト。
0. **fonts** ディレクトリに Glyphs mini から、OTF(= Open Type Font)でエクスポート。
0. OTFを各種Webフォントに変換。[@font-face kit generator](http://fontface.codeandmore.com/indexnew.php) などを参照のこと。変換したフォントも**fonts**ディレクトリに。
0. **test.html** を開いて、フォントが正しくエクスポート/コンバートされたか確認。
0. **symbols.css** をお好みで書き換え :-)

## 上級編(?)
黒い画面を見ても大丈夫な人は、ローカル環境でもWebフォントの変換が可能です。

0. 未インストールの場合は、FontForgeと周辺ツールをインストール。 [the instruction written by mekkablue](https://github.com/mekkablue/webfontmaker) 参照。
0. **Meta.xml** を書き換えて、ライセンスなどを記載。WOFFを作るために必要です。
0. 黒い画面で、レポジトリのディレクトリに移動。 ```cd your/repository```
0. スクリプトを実行。 ```sh webfontmaker.sh``` 自動的に、fontsサブディレクトリに各種フォントが変換されているはず。

Glyphs mini で、OTFを出力したら、自動的にこのスクリプトが走るように、gruntjsあたりを仕込むのが良さそうです。(やってないけど)

## Appendix
```webfontmaker.sh``` is originally created by [mekkablue](https://github.com/mekkablue). See more detail here…

* https://github.com/mekkablue/webfontmaker
多バージョンの ruby のテストしたい

1.8 のサポート切れましたが、各種プラットフォームではまだ 1.8 がデフォルトで入ったりしてるし、2.0.0 でてるし、ruby ライブラリ開発者はいろんなバージョンに対応するの大変ですね。

皆さんどうやって多バージョンのrubyに対応していますか？

私は現状、[rbenv][] を使ってこういったお手軽ワンライナ書いて実行してテストしています:

```sh
for v in '1.8.7-p371' '1.9.3-p392'; do RBENV_VERSION=$v rake clobber test || break; done
```

これであんまり不満はないのですが、便利な rake モジュール的なものあったらなーと思っています。

[rbenv]: https://github.com/sstephenson/rbenv/
nc で "--" 以降の引数が無視される

次のようにすると `"--"` 以降の文字は無視されます。

```console
$ nc localhost 7 -- -a -b -c -d -e --help hoge
```

----------

`nc` は `getopt` で引数を解釈していて `getopt` は引数に `"--"` が現れるとそれ以降の文字をオプションとして認識しなくなります。

普通は `"-"` で始まるファイル名などをオプションとして認識させずに指定するために使います。

```console
$ touch -- -a
$ rm -- -a
```

一方 `nc` は３番目以降のオプションではない引数を無視します。例えば下記の `unko` の部分は無視されます（`-l` なら２番目以降かも）。

```console
$ nc localhost 7 unko
```

３番目以降の引数でも `"-a"` のようにオプションとして解釈される場合は（それがオプションとして正しくなければ）エラーになります。

```console
$ nc localhost 7 -a
nc: invalid option -- 'a'
```

次のように `"--"` を入れてやると `"-a"` とかはオプションではない３番目以降の引数になるので無視されます。

```console
$ nc localhost 7 -- -a -b -c -d -e --help hoge
```

----------

あくまで３番目以降のオプションでは無い引数が無視されているのであって `"--"` に引数を無視させるような効果があるわけではありません。

## 用途

思いつかない。
Railsでの開発でテーブル定義のよく変わるフェーズにrake db:resetupが便利

## 背景

Railsでの開発でDBの定義変更は「もちろん」migrationファイルを作成してカラム追加やテーブル削除を行うのが基本だと思います。

ただテーブル定義の定まらない開発初期から ```add_column```や ```drop_table``` をゴリゴリやりまくってると ``` db/migrate/* ``` 配下のファイルが大変な数になってしまうし、ちょっとした変更にmigrationファイルを作るのも手間なので直接直したほうが早いってこともあると思います。（これについてはいろいろご意見もあると思いますが少なくともボクはそう思っています。）

で、どうしてるか？というと開発の初期の頃は、直接 migrationファイルの過去のものを変更して、 ```rake db:migrate:reset``` でDB作りなおして、``` rake db:seed ```で初期データ入れなおしてってやってたりします。（結局、普通にやってても最低 ```rake db:migrate```はやるでしょ？）

## そこで！

2つのタスクを1度に実行できるタスクを追加するgem ```rails-db-resetup ``` が便利です。

* github : rails-db-resetup

   * https://github.com/fukajun/rails-db-resetup

* rubygems.org : rails-db-resetup
   * http://rubygems.org/gems/rails-db-resetup


## 設定

いつもどおり ```Gemfile```に追加
```test``` ```development``` しか使わないですよね

```ruby
group :test, :development do
  gem 'rails-db-resetup'
end
```

## 使い方

次のコマンド実行するだけ

    $ rake db:resetup


これを使ってボクと同じようなことをやっている人の開発が少しでも便利になれば幸いです。
grepで任意の数の空白文字を間に挟む文字列を探す


```text.txt
aa bb # 半角スペースひとつ
aa  bb # 半角スペースふたつ
aa	bb # \t 
aa　bb # 全角スペースひとつ
aa　　bb # 全角スペースふたつ
```

`grep 'a[[:blank:]][[:blank:]]*b text.txt`する

## 実行結果

```zsh
aa bb
aa  bb
aa	bb
aa　bb
aa　　bb
jEditのJavaScriptのインデントをいい感じにする

jEditというのはJavaで開発されているオープンソースのエディターです。
名前は似ていますが某Mac OS X向け国産エディタとは別物ですあしからず。

jEditに限りませんが、JavaScriptでコールバック関数を直に書くとき、例えばインデントを 2 に設定していても、

```javascript
$(function() {
    //4つインデントされてる
```

みたいなことになることがあります。
関数呼び出しの括弧 `(` と、 function のブロックの始まりの `{` の両方を解釈して、二回分インデントしてくれやがるわけですね。

jEditでこれをどうにかできたので、残しておきます。

方法は簡単です。
jEditをインストールいたディレクトリの modes ディレクトリを開いて、 javascript.xmlを適当なエディタで開いてください。
その javascript.xml の 15-16行目を、下のようにコメントアウトしてください。

```xml:javascript.xml
		<!-- Auto indent -->
		<PROPERTY NAME="indentOpenBrackets" VALUE="{[" />
		<PROPERTY NAME="indentCloseBrackets" VALUE="]}" />
<!--	ここをコメントアウトした				 -->
<!--		<PROPERTY NAME="unalignedOpenBrackets" VALUE="(" /> -->
<!--		<PROPERTY NAME="unalignedCloseBrackets" VALUE=")" /> -->
		<PROPERTY NAME="indentNextLine"
			VALUE="\s*(((if|while)\s*\(|else\s*|else\s+if\s*\(|for\s*\(.*\))[^{;]*)" />
		<PROPERTY NAME="unindentThisLine"
			VALUE="^.*(default:\s*|case.*:.*)$" />
```

このようにすると `(` が閉じられていないまま改行してもインデントされなくなり、結果的にコールバック関数を直に書くときや無名関数を利用して変数を隠ぺいするときなどにいい感じにインデントするはずです。

しかし、前述したとおり __このようにすると `(` が閉じられていないまま改行してもインデントされなくなる__ ので注意！
コピーや虫めがねは表示されないけど、スクロール可能なUITextView


タイトルのようなTextViewって、結構使うんじゃないかなって思うけど、標準では準備されてない？

「User Interaction Enabled」のチェックを外せばコピーや虫眼鏡は表示されないけど、スクロールができなくなる。

ってことで、以下のようにUITextViewクラスのcanBecomeFirstResponderメソッドをオーバーライドすればOK。


```CustomTextView.h
@interface CustomTextView : UITextView

@end

@implementation CustomTextView

- (BOOL)canBecomeFirstResponder {
    return NO;
}

@end
```


##参照
・[UITextViewの虫めがねをとってしまおう](http://sonsofbasil.blog55.fc2.com/blog-entry-24.html "UITextViewの虫めがねをとってしまおう")
PhpStormで文字列リテラルからクラスやファイルにジャンプ


IntelliJ系のIDEはコードナビゲーションが秀逸ですよね。`⌘+クリック` で定義元へジャンプとか。でも構文上ただの文字列でしかないところにクラス名が書いてあると、それじゃ定義元の参照ができなくて…

たとえばこういうのとか

```php
require_once 'bootstrap.php';
```

こういうのや

```php
$factory->createObject('MyApp\Model\User');
```

こういうの

```php
$this->render('login.tpl');
```

他の言語とくらべてPHPはかなりこれ系が多いですよね。

こういうのをなるはやで開くには...

1. 文字列内のファイル名部分を選択します。
2. `⌘+⇧+O` を押します。
3. ファイル名指定のクイックオープンのポップアップが開き、すでにファイル名が入っている状態になるので、
4. `ENTER` をッターン。これは早い。

もし文字列がクラス名だということが確定してるなら、`⌘+O` で開いたほうが確実ですね。

もし記号を含まないシンプルな名前(または拡張子がなくてもユニークな名前)なら、キャレットを文字列の中に入れて、`⌥+↑` で単語を選択してやるともっと早いです。
railsコマンドのバージョンを戻したい

```Rails4``` を調子乗っていれてみたはいいけど、まだ使う機会ないし過去のバージョンを標準で使いたい。Railsを ``` gem uninstall rails``` で```Rails 4``` を消してみたけど、```rails``` コマンドがなぜか消したはずの``` Rails 4 ```を指しているそんな時に対応した方法

実は、```rails```コマンドは、```railties```の中のコマンドだったか.....
railsはメタパッケージだからかぁーーー

```bash
$ gem uninstall railties

Select gem to uninstall:
 1. railties-3.2.11
 2. railties-3.2.12
 3. railties-3.2.13
 4. railties-4.0.0.beta1
 5. All versions
> 4
```
javascriptの自動テストに向けて、JSHintと呼ばれるJavascript用構文チェッカーを入れてみた。


```bash
sudo su
```

### nvmを導入

```bash
git clone https://github.com/creationix/nvm.git  /usr/local/nvm
. /usr/local/nvm/nvm.sh
```

```/etc/profile.d/nvm.sh 
source /usr/local/nvm/nvm.sh
nvm use v0.11.0
```

```bash
nvm install v0.11.0
```

###　バージョン確認

```bash
$ node -v
v0.11.0
```

```bash
$ npm -v
1.2.15
```

```bash
sudo visudo
Defaults    env_keep += "PATH"
#Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
```

セキュリティ上は好ましくないらしい


### npmのインストール
npm install -g jshint


```~/.jshintrc
{
  "indent" : 2,      // インデント
  "camelcase":true,  // キャメルケース
  "maxlen" : 80,     // 一行の最大文字数
  "unused" : true,   // 宣言のみで使用していない変数を検出
  "eqeqeq":true,     // ==、!=の使用禁止
  "undef" : true,    // グローバル変数へのアクセスを禁止
  "devel" : true     // console、alertを許可
}
```

ではやってみよう

```test.js
function x(a,b) {
 return a + b;
}
 
res = x(10,20);
console.log("res = " + res);
```

jsとしては間違ってないハズ！！

実行

```bash
$ jshint test.js
test.js: line 2, col 2, Expected 'return' to have an indentation at 3 instead at 2.
test.js: line 5, col 1, 'res' is not defined.
test.js: line 6, col 24, 'res' is not defined.

3 errors
```

３件もエラー。。
res定義されてないよ
もう一つはわかりにくかったけど、インデントがスペース二個分じゃないのでエラー

```test.js
function x(a,b) {
  return a + b;
}
 
var res = x(10,20);
console.log("res = " + res);
```

### 最終テスト

```bash
$ jshint test.js
```

問題なしを確認しました！

### 最後に、一括チェック

```bash
find <jsのディレクトリ> -name "*.js" | xargs jshint
```

## その他

### 参考URL

jshintのオプション一覧
http://blog.craftgear.net/50832ff38cdc8fb415000001/title
sudoできるユーザを制限する。

# 環境

* CentOS release 6.4 (Final)
* sudo.i686 1.8.6p3-7.el6

# 方針

sudoできるのはwheelグループに属しているユーザだけ、ということにする。

# 手順

## hogeユーザをwheelグループに追加する。

全員wheelグループに追加したら意味がないので、ここで限られた人だけにしておく。

```
usermod -aG wheel hoge
```

## sudoersファイルをいじる。

sudoersファイルはrootがrootたる大元のようなファイルで、編集でミスるとひどいことになるので、専用の編集ソフトが用意されている。

```
visudo
```

たぶんコメントアウトされているので、それを外せばOK。

```:sudoers
%wheel ALL=(ALL) ALL
```

文法が間違えていたりするとvisudoが警告を出してくれるらしい。

ちなみにsudoersファイルは、rootですら書き込み権限が無いファイル。

```
ls /etc/sudoers
-r--r----- 1 root root 4000 Apr 18 18:13 sudoers
```
MongoDB メモ

▼MongoDBのインストール

```
$ brew install mongodb
```

手動で起動

```
$ mongod &
```

▼mongooseをインストール

```
$ npm install mongoose
```

手動で起動

```
$ mongo
```

▼マニュアル
http://docs.mongodb.org/manual/

▼参考
MongoDBの基本 node.jsでMongoDBを扱ってみる - エウレカ技術部
http://d.hatena.ne.jp/eureka_tech/20110712/1310472120


```
$ mongo #起動
MongoDB shell version: 1.6.3
connecting to: test
```

MongoDB はデータベースもコレクションも存在しなければ自動作成してくれる

```
> db = connect("localhost/test") #  使うデータベースをtestに指定
```

▼DBに挿入

```
> db.users.save({username:"mizchi",password:"password",params:["A","B"]});  #usersのコレクション挿入してみる
> db.users.save({username:"koni",password:"konisimple",params:["B","C"]} ) #もうひとつ挿入
```



▼総数をみて確認

```
> db.users.find().count() # 中身が挿入されたか、総数をみて確認
2
```

▼空のクエリで検索(全部とってくる)

```
> db.users.find() # 空のクエリで検索(全部とってくる場合)
{ "_id" : ObjectId("4e077d13984bb3412af1a0d1"), "username" : "mizchi", "password" : "password", "params" : [ "A", "B" ] }
{ "_id" : ObjectId("4e077deb984bb3412af1a0d2"), "username" : "koni", "password" : "konisimple", "params" : [ "B", "C" ] }
```

▼クエリで条件指定して検索

```
> db.users.find({username:"koni"})  # クエリで条件指定して検索 username == "koni"のものq   
{ "_id" : ObjectId("4e077deb984bb3412af1a0d2"), "username" : "koni", "password" : "konisimple", "params" : [ "B", "C" ] }
```

▼条件に合致したものを削除

```
> db.users.remove( { username : "mizchi" } )
```


▼空にする

```
> db.users.drop() # 空にする
true
> db.users.find().count() # 総数をみて確認
0
```



---------------------------------------

▼データベースの一覧を表示

```
> show dbs
```

▼使用中のDB名を表示

```
> db
```

▼使用するDB名を指定

```
> use mydb
```

▼ 現在のデータベースに存在するコレクションを確認

```
> show collections
system.indexes
users
```

▼データを取得＞データを追加＞保存＞確認

```
> var mongo = db.things.findOne({name:"mongo"});  # データを取得
> print(tojson(mongo)); # 出力
{"_id" : "497dab624ee47b3a675d2d9c" , "name" : "mongo"} 
> mongo.type = "database";  # データ追加
database 
> db.things.save(mongo); # 保存
> db.things.findOne({name:"mongo"}); # 確認
{"_id" : "497dab624ee47b3a675d2d9c" , "name" : "mongo" , "type" : "database"} 
```

参考
Mongoでのデータ更新 - Docs-Japanese - 10gen Confluence
https://wiki.10gen.com/pages/viewpage.action?pageId=18907286

〜うまく動かすMongoDB〜仕組みや挙動を理解する - doryokujin's blog
http://doryokujin.hatenablog.jp/entry/20110519/1305737343


▼DBのステータスを確認

```
> db.stats()
{
	"db" : "test",
	"collections" : 4,
	"objects" : 11,
	"avgObjSize" : 53.81818181818182,
	"dataSize" : 592,
	"storageSize" : 20480,
	"numExtents" : 4,
	"indexes" : 2,
	"indexSize" : 16352,
	"fileSize" : 201326592,
	"nsSizeMB" : 16,
	"ok" : 1
}
```

▼メモリーリークが起こってないか確認

```
> db.serverStatus().mem
{
	"bits" : 64,
	"resident" : 61,
	"virtual" : 2802,
	"supported" : true,
	"mapped" : 160,
	"mappedWithJournal" : 320
}
```
IntelliJで誤ってimport先を無視リストに入れてしまった時の対処法

Alt + Enter 連打でガシガシ補完を行っていると、急に補完対象現れなくなることがある。これは、Enterを連打しているときに誤って
`Exclude 'xxxx' from auto-import`を選択していることが原因みたい。

解除するには、Settings > Editor > Auto Import で `Exclude from Import and Completion`の中から対象を消せばいい。
Spring Framework の @Transactional Annotationの仕様について調べた

> When using proxies, you should apply the @Transactional annotation only to methods with public visibility. If you do annotate protected, private or package-visible methods with the @Transactional annotation, no error is raised, but the annotated method does not exhibit the configured transactional settings.
http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#transaction-declarative-annotations

Springの@Transactional アノテーションはpublic method にしか利用ができないらしい。別にエラーも吐かれないのでなかなか気が付かなくてハマったのでメモ。
QueryDSLで AddBatch を行い、その結果のIDを受け取る方法

[例えばここ](http://static.springsource.org/spring-data/jdbc/docs/current/reference/html/core.querydsl.html)の 2.4 Inserts を書き換えた場合

```Java
public List<Long> insertProducts(final  List<Product> products) throws DataAccessException {
	List<Long> ids = template.insertWithKey(qProduct, new SqlInsertWithKeyCallback<List<Long>>() {
	    @Override
	    public List<Long> doInSqlInsertWithKeyClause(SQLInsertClause sqlInsertClause) throws SQLException {
	        for (Product p : products) {
	            sqlInsertClause.populate(p).addBatch();
	        }
	        return sqlInsertClause.executeWithKeys(qProduct.id);
	    }
	});
	return ids;
}
```
su rootできるユーザを制限する。

# 環境

* CentOS release 6.4 (Final)

# 方針

su rootできるのはwheelグループに属しているユーザだけ、ということにする。

# 手順

## hogeユーザをwheelグループに追加する。

全員wheelグループに追加したら意味がないので、ここで限られた人だけにしておく。

```
usermod -aG wheel hoge
```

## login.defsを修正する。

login.defsの詳細はman pageを参照のこと。
一番下あたりに次の1行を追加すればOK。

```:/etc/login.defs
SU_WHEEL_ONLY yes
```

## PAMの設定をいじる。

ユーザごとに使えるコマンドを制御する(?)仕組みがあるらしいので、その仕組みを使ってsuコマンドを使える人（グループ）を制限する。

たぶんコメントアウトされているので、それをはずせばOK。

```:/etc/pam.d/su
auth required /lib/security/pam_wheel.so use_uid group=wheel
```
Gradleビルドを実行するとビルドスクリプト内で設定されているArtifactが見つからないと言われる時の対処法

```
C:\...\...\...\>gradlew installApp
:generateQueryDSL UP-TO-DATE
:compileJava

FAILURE: Build failed with an exception.

* What went wrong:
Could not resolve all dependencies for configuration ':compile'.
> Artifact 'org.springframework:spring-orm:3.2.1.RELEASE@jar' not found.

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

BUILD FAILED

Total time: 5.646 secs
```

例えば上記の場合、localのmaven repository
`C:\...\.m2\repository\org\springframework\spring-orm\3.2.1.RELEASE`にjarがないはずなので、`3.2.1.RELEASE`ディレクトリごと削除して`installApp`を再実行すると、jarファイルを落としにいってくれる
ちょっとしたeasingの解説


まずはソース。

```javascript
function easing(time, begin, change, duration) {
   var s = 2.5;

	if (t / d >= 1) {
	    return b + c;
	}

	return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b; 
}

//分かりやすく分解
var e = t / d - 1;
c * (e * e * (3.5 * e + 2.5) + 1) + b;

//+ bはスタートからの値を求めるため、実際にイージングを行なっているのはその前の式。
//かつ、cが最終変化量でイージングの性質として0 -> 1に変化する必要があるから、
//実質イージングを成しているのはcとbを抜いた部分。
(e * e * (3.5 * e + 2.5) + 1)

//さらに、最後に+1されているため、その前の部分が-1 -> 0に変化する。よって
//1 < (e * e * (3.5 * e + 2.5) < 0
//となる。
```

`s = 2.5`で行なっているのが、イージング途中で1を超える値の定義。
`e = t / d - 1`の部分で、渡された時間を逆点させ、`-1 -> -0.9 -> -0.8 … -0.1 -> 0`のように変異させる。

`((s + 1) * e + s)`の部分で、tにマイナス値が渡るためsの値を減ずることになるが、-0.5を境にプラスの値が大きくなるため結果増加値が上がり、上限を行き過ぎてから到達地点に達する、という動きになる。

まぁ基本的に`0 -> 1`に遷移するのでそれをベースに色々書いてみたい。
立ち上げ直後のiptablesを設定する。

# 環境

* CentOS release 6.4 (Final)
* iptables.i686 1.4.7-9.el6

# 方針

以下の大原則に従う設定を作ることとする。

* 自ホストからの通信は通してやる。
* 外からのpingは通してやる。
* 外からのSSHは通してやる。
* それ以外の外からの通信は受け付けない。
* 外へ出ていく通信はすべて通す。

# 手順

## まず、外からのすべての通信を受け付けないようにする。

外からの通信(INPUT, FORWARD)をすべてDROPする。そのあとで通すものを書いていくホワイトリスト方式とする。
中から外へ出ていく通信はすべて通してやる。

```
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
```

## 確立済みの通信は通してやる。

どこから来たのか、どのポート宛てなのか、は気にせず、すでに確立済みなら通してやる。要するに、これに続く記述で通信を確立させるかどうかを設定してやる。

```
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
```

## pingは通してやる。

プロトコルがICMPなら通してやる。

```
-A INPUT -p icmp -j ACCEPT
```

## ループバックは通してやる。

自ホストからの通信は問答無用で全部通してやる。

```
-A INPUT -i lo -j ACCEPT
```

## SSHは通してやる。

他ホストからSSH接続はするので、宛先が22番ポートなら通してやる。当然、SSH側のセキュリティ（パスワードログインさせないとか、rootログインさせないとか）はそちらで別途設定すること。

```
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
```

SSH以外のサービスのためのポートを開ける場合はこれを真似して追加していく。例えば、HTTP(80)ならこんな感じで。

```
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
```

## 全体はこんな感じで。

```:/etc/sysconfig/iptables
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
COMMIT
```

## iptablesを再起動して設定を反映させる。

rootでね。

```
/etc/init.d/iptables restart
```
GoogleAnalyticsの目標設定の罠

試しの投稿もかねてGoogleAnalyticsの目標を設定するときにひっかかったところのメモ。

# やろうとしたこと
とあるゴールページを開くことを目標達成として、それまでの遷移ごとの人数をとりたい。
ひとまず今回はたどり着く方法が2パターンあるとする。

GoogleAnalyticsの目標設定方法は特に書かないので、そのあたりは調べてください。
（…説明欲しい方います？スクショ貼りまつりになるだけですがｗ）


## 具体的な設定リスト

* GAで目標を2つ作成
* 両方とも「/goal.html」を目標 URLとする
* 目標到達プロセスを使用にチェックを入れ、ステップを追加する。必要な手順にもチェックをいれる。
 * 目標1のプロセス設定：「/start.html」「/point_a.html」
 * 目標2のプロセス設定：「/point_b.html」



## 結果
目標1の数値があがるように「/start.html」→「/point_a.html」→「/goal.html」へアクセス。目標1の完了数が1になった！！目標2の完了数も1になった！！…(ﾟДﾟ)何故!?





# 気をつける部分
今回の罠は「目標到達プロセス」でした。説明をちゃんと読めという話ではありますが、名前やら必要な手順にチェックしたりする作業から、ついついここのプロセスを踏んだうえで最終的な目標URLへたどりついた場合が完了となると思い込んでしまっていた。


しかし、どこからきたかは関係なく、目標URLを表示すればもう完了としてカウントされるのだ。


つまり、今回設定した二つは同じ目標URLを設定しているため、いつまでたっても一緒に完了数があがっていくのだ。。。
これでは、やりたかったことは達成できない。。


## ではこの目標到達プロセスは何のためにあるのか
説明に書いてあります。。

> ここで定義した目標達成プロセスは、目標到達プロセスのレポートにのみ適用されます。


## やりたかったことはどうしたのか

* 目標URLが「/goal.html」である目標を設定
* APIで結果を取得していたので、その目標の完了数をとるときにさらにメトリクスとディメンションを工夫してみた
 * 具体的にはランディングページが「/start.html」なのか、「/point_b.html」なのかと言う部分等を利用して、本来欲しかった情報を違う切り口からとれないかと試した


# まとめ
* 目標設定、気をつけてください。
* 目標到達プロセスにだまされないでください。
* URLの遷移を目標にしたいときの良い方法が他にあったら教えてください。
ブラウザで保存したファイルをダウンロード元サイト別にフォルダ分け


ブラウザのファイル保存先は一つしか選べませんが、pixivから保存した画像は2次元フォルダ、DMMから保存したものは3次元フォルダに分けたい！！みたいなニーズがあったので手法をメモしておきます。

#準備
pipかeasy_installでxattrをインストール。

```
pip install xattr
```

Automator.appを起動してフォルダアクションを新規作成します。ライブラリから**シェルスクリプトを実行**を追加して、実行するスクリプトに下の内容を貼り付けます。

```python:find_by_xattr.py
import os
import xattr
watchdir='/Users/horimislime/Desktop/'
#search files downloaded from pixiv
domain='www.pixiv.net'
 
for file in os.listdir(watchdir):
	try:
		fullpath=os.path.join(watchdir,file)
		if xattr.getxattr(fullpath,'com.apple.metadata:kMDItemWhereFroms').find(domain) > 0:
			print fullpath
	except:
		pass
```
このスクリプトだとpixivからDesktop上にダウンロードしてきたファイルを振り分けます。

次に**Finder項目を移動**を追加して、ファイルの振り分け先ディレクトリを選択。完成形はこんな感じです。

![automator](https://dl.dropboxusercontent.com/u/1623158/image/qiita/automator-tidy2.jpg)

#実行
最後に適当な名前でフォルダアクションを保存しておわり。pixivから画像を保存したら指定したディレクトリに移動しているはず。

#仕組み
MacではExtended Attributesというファイルの拡張情報があり、xattrを使うとここに含まれているファイルのダウンロード元ドメイン等を読み込むことができます。　

![xattrコマンド](https://dl.dropboxusercontent.com/u/1623158/image/qiita/xattr-cmd.png)

これでデスクトップがアレなファイルで埋め尽くされなくなりました。Automator便利！

Firefoxユーザは拡張機能で同じ事ができるらしい？
[Automatic Save Folder :: Add-ons for Firefox](https://addons.mozilla.org/ja/firefox/addon/automatic-save-folder/)
Googleアナリティクスなしで頑張って、各リンクがどれだけクリックされたかを取る

諸事情により、とあるWebページのクリック数が欲しかったのでそれを取ってみました。
かなり限定的ですが、よくアクセスがあるトップページだけ集計するイメージです。
(アクセスログから漁っても取れますが、どのページからきているのかはリファラーを見ないとだめで
 それはちょっと厳しかったので以下のようなやり方でやってます。)

HTMLのa要素に以下のような形で各リンクにユニークな名前をつける。
(ref=なんちゃら)

例)

```
<a href="/status/index?ref=status_index">
```

以下のようなシェルを書いて、cronで1日1回適当な時間に回す
やっていることは、アクセスログから、指定した名前のキーをGrepで漁ってるだけ

```
#!/bin/sh

# 保存先のディレクトリ(例なので適当
base_dir="/var/log/report"
data="${base_dir}/data/click_count"

yesterday=`date --date '1 day ago' +'%Y-%m-%d'`

mkdir ${data}/${yesterday}

files=()
# アクセスURLのうち ref=??? の形式のものを取得するので ??? の部分をここに定義
keys=("status_index" "status_enable" "profile")
for key in ${keys[@]}
do
    name=click_count_${yesterday}_${key}.log
    files+=(${name})

    # ファイルパスやアプロの保存ログ形式、抜き出したいログにより適時変更
    grep "ref=${key}" /var/log/apache2/access.${yesterday}.log  | awk '{print $12}' | grep -o 'user_id=[0-9]*' > ${data}/${yesterday}/${name}

done
```

## シェル実行結果

```
$ head -n 5 2013-04-10/click_count_2013-04-10_status_index.log
user_id=1
user_id=2
user_id=2
user_id=3
user_id=1

$ wc -l 2013-04-10/*
2066 2013-04-10/click_count_2013-04-10_status_index.log
4192 2013-04-10/click_count_2013-04-10_status_enable.log
 578 2013-04-10/click_count_2013-04-10_profile.log
```

## 集計
日付ごとにディレクトリが切ってあるので、それぞれのディレクトリから漁って、同じファイルをループでまとめるようなシェルを書く


```
#!/bin/sh
keys=("status_index" "status_enable" "profile")

for key in ${keys[@]}
do
     # 日付指定。とりあえず直入れで対応しておく。
     for roop in `seq -w 10 17`;
     do
        cat 2013-04-${roop}/click_count_2013-04-${roop}_${key}.log >> log/${key}.log;
     done
done
```

## 結果

```
$ wc -l log/*
 11178 log/status_index.log
 37779 log/status_enable.log
  4254 log/profile.log
```

あとはこれを適当にいじっていこうかなという感じ。
まだ出力をどうするか決めてないので、DBにinsertするか、PHPから参照してごにょごにょするのかは未定。
(そもそもそこまでやらないかもしれない)
Flash／CreateJSコンテンツを切り替え表示する方法

Flash／CreateJSコンテンツを切り替え表示する方法
http://www.adobe.com/jp/devnet/createjs/articles/flash_createjs_01.html

Flash再生可否をチェックし、再生可能ならFlashを表示、そうでなければCreateJS表示

```
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Flash/CreateJSコンテンツの表示切り替え</title>

<script src="src/jquery-1.7.1.min.js"></script>
<script src="src/SWFObject-1.1.1.min.js"></script>

<script>

$(document).ready(function(){
  /* Flash再生可否をチェックし、再生可能ならFlashを表示、そうでなければCreateJS表示
   * 表示する位置は、body内のid:gameのdiv直下
   */
  if($.flash.available){
    addFlash();
  }else{
    addCJS();
  }
  
  //Flashを表示する関数
  function addFlash(){
    $('#game').flash({swf:'game.swf',width:550,height:400});
  }
  
  //CreateJSのライブラリを読み込み、表示する関数
  function addCJS(){
    //ステージとなるCanvas配置
    $("#game").append(
      '<canvas id="canvas" width="550" height="400"></canvas>'
    );
	
    /* 読み込みライブラリのリスト。この順番に同期処理で読み込みます。
     * Toolkit for CreateJSから書き出されるjsファイルや、ゲーム用のjsファイルは、
     * CreateJSのクラスを利用しているので、CreateJSの各種ライブラリ読み込み後に読み込むようにします。
     */
    var libQueue = [
      "libs/easeljs-0.5.0.min.js",
      "libs/tweenjs-0.3.0.min.js",
      "libs/movieclip-0.5.0.min.js",
      "libs/preloadjs-0.2.0.min.js",
      "libs/soundjs-0.3.0.min.js",
      "GameData.js",
      "game.js"
    ];

    //ライブラリ読み込み用のヘルパ
    function loadQueue(){
      $.ajax({
        url:libQueue.shift(),
        dataType:"script",
        async:false,
        success:function(data){
          if(libQueue.length==0){
            //全てのライブラリを読み込んだ際に実行する関数を指定。今回は「init」を実行
            init();
          }else{
            loadQueue();
          }
        }
      });
    }
	//読み込み開始
    loadQueue();

  }
});


</script>

</head>

<body bgcolor="#F0F0F0">
  <p>
    Flash再生可否をチェックし、再生可能ならFlashを表示、そうでなければCreateJS表示します。<br>
    表示する位置は、body内のid:gameのdiv直下です。
  </p>

  <div id="game"></div>
  
</body>

</html>
```
オープンソース版TextMateのコンパイル方法

みなさん元気にSublime Text2使ってますか？
たまには懐かしのTextMateを使ってみるのはいかがでしょうか？
TextMate2は長い間日本語対応が放置されていましたがオープンソース版のTextMateは初めから日本語が使えます。（細長くありません！）
インストールは簡単なのでぜひ試してみましょう。

コンパイル方法はGithubに書いてますが簡単にまとめておきます。
https://github.com/textmate/textmate

環境: MacOSX 10.8, HomeBrewインストール済み

```
$ brew install ragel boost multimarkdown hg ninja proctools
$ git clone https://github.com/textmate/textmate.git
$ cd textmate
$ git submodule update --init
$ ./configure && ninja
```
Windows版のSourceTreeをオフラインインストールする

※0.9.3からはプロキシ設定の入力画面が出るように修正されたようです。
[SRCTREEWIN-294 Support proxy servers when downloading Git](https://jira.atlassian.com/browse/SRCTREEWIN-294)

インストーラがネットワーク経由で最新版をダウンロードする仕様となっているため、プロキシがあるとうまくダウンロードできないことがある。

下記のやり取りによるとAtlassianはMSのインストーラに従っており、プロキシがNTLM Authenticationをサポートしていないからではないかと言っている模様。

* [How do I install SourceTree since I am behind an HTTP proxy?]
(https://answers.atlassian.com/questions/149945/how-do-i-install-sourcetree-since-i-am-behind-an-http-proxy)


下記のURLにオフラインインストールのやり方が回答されている。

* [Is there an offline installer for Windows version of SourceTree?](https://answers.atlassian.com/questions/149591/is-there-an-offline-installer-for-windows-version-of-sourcetree)

手順は下記の通り。

1. 事前にMicrosoft .NET Framework 4.5 (x86 か x64)をインストールしておく。
2. 次のURLからzipファイルをダウンロードする
  *  http://downloads.atlassian.com/software/sourcetree/windows/SourceTree_ManualInstall_0.9.1.0.zip
3. zipファイルを解凍する
4. "SourceTree_ManualInstall_0.9.1.0\Application Files"にあるSourceTree_XXXフォルダを適当なパス(C:\Program Filesとか)に移動
5. SourceTree.applicationをダブルクリックして起動
6. インストール確認がでるので了承して進める。

なお元記事でも言及されているが、オフラインインストールを行うと最新版へのアップデートがされないため、Atlassianとしては非推奨の模様。
SWFObject

SWFObject 2 HTML and JavaScript ジェネレーター v1.2
http://www.tonpoo.com/docs/swfobject_generator/

例

```
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title></title>
<meta http-equiv="Content-Script-Type" content="text/javascript;">

<script src="//ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script>
<script type="text/javascript">
var flashvars = {};
var params = {};
params.allowfullscreen = "true";
var attributes = {};
attributes.id = "externalcontent";
attributes.name = "externalcontent";
swfobject.embedSWF("example.swf", "flashContent", "800", "600", "9.0.0", "expressInstall.swf", flashvars, params, attributes);
</script>

</head>
<body>

<div id="flashContent">
<a href="http://www.adobe.com/go/getflashplayer_jp"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player"></a>
</div>

</body>
</html>
```
Symfony2を使った、AJAX通信時のCSRFトークン検証

Symfony2を使って、AJAX通信のクライアント側とサーバ側を構築する際に、CSRF(クロスサイトリクエストフォージェリ)を防ぐためのトークンをやりとりする方法。

***
まずは、クライアント側画面を出力するコントローラでは、csrf_providerをつかって、トークンを生成

```php:DefaultController.php
<?php
class DefaultController extends Controller
{
    public function clientAction(Request $request)
    {
        $token = $this->get('form.csrf_provider')->generateCsrfToken('csrf_token');

        return $this->render('HogeFugaBundle:Default:client.html.twig', array(
                'csrf_token' => $token
        ));
    }
}
```

***
この `csrf_token` を、twigテンプレートのなかで、JavaScriptから利用可能なよう、変数にセットする。

```html:client.html.twig
<script type="text/javascript">
    var csrf_token = '{{ csrf_token }}';
</script>
```

***
で、このトークンを、AJAX通信時にHTTPヘッダーに含めて一緒に送信するわけなんだけど、通信部分全部にこのトークンを使う処理を書くのは面倒なので、AJAX通信の送信イベントに、このトークンの付加処理をバインドする。

```javascript:client.js
$(window).on('ajaxSend', function(elm, xhr, s) {
    xhr.setRequestHeader('X-CSRF-Token', csrf_token);
});
```

***
これを、サーバ側で受け取ってバリデーションする。

```php:DefaultController.php
<?php
class DefaultController extends Controller
{
    public function serverAction(Request $request)
    {
        $token = $request->headers->get('X-CSRF-Token');

        if (false === $this->get('form.csrf_provider')->isCsrfTokenValid('csrf_token', $token)) {
            // エラー処理
        }
    }
}
```
MongoId型データをjson_encodeで変換する際の注意

```php:mongoid_print.php
<?php
echo (new MongoId());
```
######結果
`"5170b4f67b2a7d0c1f000000 "
`
通常、echo(print)する際は自動的に__toString()が実行されるので、
IDの16進表現で表示される。

だが、

```php:mongoid_json_encode.php
<?php
echo json_encode(new MongoId());
```
######結果
`{"$id":"5170b4f67b2a7d0c1f000000"}
`
json_encodeにそのままMongoIdオブジェクトを渡すと上記のような配列を
文字列化してしまうようである。

```php:mongoid_json_encode.php
<?php
$mongoId = new \MongoId();
echo json_encode($mongoId->__toString());
```
######結果
`"5170b76d7b2a7de818000000"
`
明示的に__toString()すれば回避できる。
⌘+TabでWitchを操作する

Macにおいて「⌘+Tab」はアクティブなアプリケーションを変更するショートカットだが、組み込みだとウィンドウを変更できない。（これ自体はDock.appの機能）

何を言っているかと言うと、例えばChromeを2つのウィンドウに分割しているとして（片方は個人用、もう一方は仕事用）「⌘+Tab」ではChromeを選択できるが、それらの間をいったりきたりすることができない。

ウィンドウを変更するにはどうすればいいのかというとChromeが選択された状態で「⌘+`」を押す。はっきり言って面倒くさすぎる。

そういう場合に便利なのが[Witch](http://manytricks.com/witch/)なのだが、こちらは「Option+Tab」なのでちょっと親指がつらい。Witchはキーバインドを変更できるので「⌘+Tab」を割り当てればいいのだが、なんとDock.appの方のキーバインドを変更できないので、せっかく「⌘+Tab」を割り当ててもWitchまで命令が到達しないので意味が無い。

これを回避するには[KeyRemap4MacBook](http://pqrs.org/macosx/keyremap4macbook/index.html.ja)を使う。

これを使うとキーの割り当てを切り換えることができる。つまり、Witchは「Option+Tab 」、Dockは「⌘+Tab」で待ち受けている状態で、KeyRemap4MacBookが「⌘+Tab」を「Option+Tab」に置き換えてしまうことで、擬似的にWitchを「⌘+Tab」で操作できるようにすることができるのだ。

## KeyRemap4MacBook の設定

KeyRemap4MacBookをインストールしたら設定を開いて「Misc & Uninstall」タブの「Custom Setting」の「Open private.xml」をクリックする。

![](http://cdn-ak.f.st-hatena.com/images/fotolife/y/yuku_t/20130419/20130419113350.png)

そしたらFinderが開いてそこにprivate.xmlというのがいるので、何かしらのテキストエディタで開いて下記をコピペ。すでに中身がある場合は `<item></item>` の中身だけをコピペする。

```xml:private.xml
<?xml version="1.0"?>
<root>
  <list>
    <item>
      <name>Swap Command+Tab and Option+Tab</name>
      <identifier>private.use_witch</identifier>
      <autogen>
        __KeyToKey__
        KeyCode::TAB, ModifierFlag::COMMAND_L,
        KeyCode::TAB, ModifierFlag::OPTION_L
      </autogen>
      <autogen>
        __KeyToKey__
        KeyCode::TAB, ModifierFlag::OPTION_L,
        KeyCode::TAB, ModifierFlag::COMMAND_L
      </autogen>
    </item>
  </list>
</root>
```

保存したらKeyRemap4MacBookの設定に戻って「Change Key」を選択して「Reload XML」をクリックすると出現する「Swap Command+Tab and Option+Tab」を選択する。

![](http://cdn-ak.f.st-hatena.com/images/fotolife/y/yuku_t/20130419/20130419113854.png)

これで「⌘+Tab」でWitchが「Option+Tab」でDockが動く。
Javaアプリケーション作成時に気を付けること

●Beanに関して
・BeanにはSerializationをimplementする
・引数のエンコーディングチェック
・セッターでバリデーションをする

●DAOに関して
・getConnectionなどの共通部分はBaseDaoなどの別のクラスに作る
・try catchを使わないなら初めにthrowsする
・commitとrollbackをしっかり実装する

●データベースに関して
・UPDATEのときはSELECT FOR UPDATE でロックをする

●web.xmlに関して
・<exception-type>java.lang.Throwable</exception-type>
  でエラーページの設定をする
・debug用のエラーコードの設定
・jsp-configでpageのtaglibの宣言などをまとめておく

●Servletに関して
・セッションチェックは共通化してフィルターを使う
・Daoと接続するときはtry catchで
・エラーメッセージにはErrorMessageHandlerを使う
・フィルターでログを取るようにする

●JSPに関して
・なるべくJSTLを使う

●その他
・バリデーションは別にする
・logはシングルトンで作成する
hub コマンドを git プロトコルを通さないプロキシ内で使う

http://defunkt.io/hub/hub.1.html

> If you prefer the HTTPS protocol for GitHub repositories, you can set "hub.protocol" to "https". This will affect clone, fork, remote add and other operations that expand references to GitHub repositories as full URLs that otherwise use git and ssh protocols.

> $ git config --global hub.protocol https