OmniAICreator/Qiita-1.07M huggingface dataset:
ちょっとしたことがGroovy「あっという間に死んでしまう正規表現を検証する」

注意！ 以下のコードには、JVMを暴走させる恐れのあるコードが含まれています。

まず、このコード。
対象の文字列が長くなると、その実行時間は爆発的に増えます。

```groovy:hangup_regex.groovy
@Grab(group='org.spockframework', module='spock-core', version='0.7-groovy-2.0')

import spock.lang.*
import java.util.regex.Matcher
import java.util.regex.Pattern

class SlowRegexTest extends Specification {

  def stopWatch = {c->
    def s = System.nanoTime()
    c()
    def w = System.nanoTime() - s
    if(w <      1000000)
        "${w /  1000} [microsec]"
    else if(w < 1000000000)
        "${w /  1000000} [millsec]"
    else
        "${w /  1000000000} [sec]"
  }
  
  def p = Pattern.compile(/(([0-9a-zA-Z]+[\s.]*)+)$/)
  def trim = { name ->  
    def matcher = p.matcher(name)
    println stopWatch { matcher.find() }
    println matcher.start()
    name.substring(0, matcher.start())
  }
  
  @Timeout(10)
  def '末尾のトリムに10秒以上かからないか'(){
    expect:
    trim(target) == result
    
    where:
        target                                                |    result
    "******${"A"* 1}BC  DEF  GHI  JKL  MNO  PQR  STU_  VWX."  | "******${"A"* 1}BC  DEF  GHI  JKL  MNO  PQR  STU_  "
    "******${"A"* 3}BC  DEF  GHI  JKL  MNO  PQR  STU_  VWX."  | "******${"A"* 3}BC  DEF  GHI  JKL  MNO  PQR  STU_  "
    "******${"A"* 5}BC  DEF  GHI  JKL  MNO  PQR  STU_  VWX."  | "******${"A"* 5}BC  DEF  GHI  JKL  MNO  PQR  STU_  "
    "******${"A"* 7}BC  DEF  GHI  JKL  MNO  PQR  STU_  VWX."  | "******${"A"* 7}BC  DEF  GHI  JKL  MNO  PQR  STU_  "
    "******${"A"* 9}BC  DEF  GHI  JKL  MNO  PQR  STU_  VWX."  | "******${"A"* 9}BC  DEF  GHI  JKL  MNO  PQR  STU_  "
    "******${"A"*11}BC  DEF  GHI  JKL  MNO  PQR  STU_  VWX."  | "******${"A"*11}BC  DEF  GHI  JKL  MNO  PQR  STU_  "
  }
}

```

この原因も、前に言った通り翻って検索してしまうのが原因です。
ただ、この程度で暴走状態にまでなってしまうのは何かしらJavaの正規表現エンジンの実装には問題がありそうですね。。。

この正規表現を修正するには次のようにします。

```groovy:no_hungup.groovy
  def p = Pattern.compile(/(([0-9a-zA-Z]++[\s.]*)+)$/)
```

違いは、英数字のグループの連続を探す+が++になっていること。

++はJavaの正規表現では貪欲マッチを行います。

貪欲マッチは、後ろに続くパターンが出現しようがしまいがマッチを続ける性質があります。
そのため、

```groovy:greedy.groovy
assert  ('abcd' ==~ /.+d/)
assert !('abcd' ==~ /.++d/)
```

のようになります。
後者ではdは、すでに.++に含まれてしまっているため評価はfalseとなるのです。

貪欲マッチでは後ろに続く表現を検索しないため、条件によっては正規表現を非常に高速化させることができます。

今回例示したケースでは、英数字パターンと、後に続くパターンが被らないためこのように修正することができました。

ちなみに、一般的に

```
(パターン+)+
```

という正規表現は遅いです。すぐ死にます。
Setup knife-solo

備忘録として。

基本的には以下の環境

* ホストOS: MacOSX 10.8
* ゲストOS: [CensOS6.4 minimal + Chef](http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box)

knife-solo 0.3.0を入れたかったのでgithubからcloneする。

```shell-session:
$ git clone git@github.com:matschaffer/knife-solo.git
```

ゲストOSからホストOSのディレクトリを見るには/vagrant以下にあるらしい。ここがVagrantFileが置いてあるディレクトリにあたる。

```
$ cd knife-solo
$ git submodule init
$ git submodule update
$ bundle  # エラー!!
$ bundle exec rake install
```
bundleが必要だったので`sudo gem install bundle`を行うも以下のエラー。

```rb:
libxml2 is missing.  please visit http://nokogiri.org/tutorials/installing_nokogiri.html for help with installing dependencies
```
でも入らない。。。なんだnokogiriって。。。

## 追記
ここにヒントが http://mofuken.blogspot.jp/2012/12/ruby-nokogiri-libxml2-is-missing.html
どうやらlibxml2だけじゃなくで-develっていパッケージもいるみたい。
vimでコマンドラインウインドウを使わないのはもったいない

# コマンドラインウインドウって何？

`:`で実行したExコマンドや`/`と`?`で検索した履歴をvimのウインドウに表示したり再実行できる機能です。
コマンドモードは1行しかないので履歴を辿るのに視認性が悪かったり、カーソル移動が矢印キーなので面倒だったりしますが、コマンドラインウインドウではウインドウ内に数行分の履歴を表示したり、vimのカーソル移動やコマンドを実行できるので、使いやすくなっています。

*※ここで言うウインドウはWindowsやMacのウインドウではなく、vimのウインドウです。*

# どうやって使うの？

## 履歴を表示、実行する

Exコマンドの場合、`:`の代わりに`q:`を入力するとvimのウインドウが分割されて下側にコマンド履歴が表示されます。
vimを終了する`:q`と間違えて入力したことがある人は見覚えがないでしょうか？

![コマンドラインウインドウ](https://qiita-image-store.s3.amazonaws.com/0/8995/e68ba77e-365c-59c3-2b81-c568afeddc34.png)

ここで`Enter`を入力するとカーソルがある行のコマンドが実行されます。もちろん編集もできます。

また、履歴から前方検索したい場合は`/`の代わりに`q/`、後方検索の場合は`?`の代わりに`q?`を入力すると同様にコマンドラインウインドウが開きます。

## コマンドラインウインドウを閉じる

vimのウインドウなので`:q`で閉じます。

# その他の機能

## 履歴をvimのコマンドラインに送る

コマンドラインウインドウで`Ctrl-C`を入力するとカーソルがある行の履歴がコマンドラインに送られます。
コマンドラインに移動後、`Esc`や`Ctrl-C`で実行をキャンセルするとコマンドラインウインドウも一緒に閉じます。

## コマンドラインウインドウを開く別の方法

`:`や`/`、`?`でコマンドラインに移動後、`Ctrl-F`を入力するとコマンドラインウインドウが開きます。

# もっと詳しく

続きは`:help cmdwin`で
Rubyで配列に入っている数値の合計を出すメソッドを作る(spec付き)

配列に入っている数字の合計を出したいときってあるよね。
こんな感じに

```
[1, 2, 3, 4, 5].sum
=> 15
```

というわけで、Arrayを拡張してsumメソッドを作成してみました。

文字列が入っていてもto_iやto_fをしてとにかく合計を出して欲しいし、Floatで結果欲しい時は指定すればFloatで返して欲しい。
例えば、

```
[1, 2, '3.2', 4, 5].sum(:f)
=> 15.2
```
となるように作りたい


というわけで作ったのが以下。

```rb:
class Array
  def sum(opt = :i)
    mode = case opt.to_sym
             when :i then 'to_i'
             when :f then 'to_f'
             else 'to_i'
           end

    self.inject(0){|result, item| result + item.send(mode)}
  end
end
```

specも書いてみました。

```rb:
describe Array do
  describe '#sum' do
    context 'with no arguments' do
      subject { array.sum }

      context 'if all elements are integer' do
        let(:array) { [1, 2, 3, 4, 5] }
        it { expect(subject).to eql 15 }
      end

      context 'if array contains string' do
        let(:array) { [1, 2, 3, '4', 5] }
        it { expect(subject).to eql 15 }
      end

      context 'if array contains nil' do
        let(:array) { [1, 2, 3, nil, 5] }
        it { expect(subject).to eql 11 }
      end
    end

    context 'if :f is given' do
      subject { array.sum(:f) }

      context 'if all elements are integer' do
        let(:array) { [1, 2, 3, 4, 5] }
        it { expect(subject).to eql 15.0 }
      end

      context 'if array contains string' do
        let(:array) { [1, 2, 3, '4.2', 5] }
        it { expect(subject).to eql 15.2 }
      end

      context 'if array contains string' do
        let(:array) { [1, 2, 3, nil, 5] }
        it { expect(subject).to eql 11.0 }
      end
    end
  end
end
```

実行結果

```
21:08:32 - INFO - Running: spec/lib/array_ext_spec.rb
......

Finished in 1.32 seconds
6 examples, 0 failures
```
出来たー

specはもっとこうしたら良いとかあったらどなたでも是非教えて欲しいです。
AngularJS と jQuery を併用するとき

AngularJSのソースをちょっと覗いたときに気がついたのですが、angular.element の実体は通常 jQueryLite なんですが、window.jQuery が設定されてる（jQuery読みこまれてる）と、jQueryを拡張して、angular.element にするんですね！

ドキュメントに書いてなかったよーなと思ってドキュメント見たら、ちゃんと書いてありましたｗ


```coffeescript:
angular.module("mymodule", []).directive("foo", ->
	{
		restrict: 'CA'
		link: (scope, element, attrs)->
			nexts = jQuery(element).nextAll()
			#ごにょごにょ
			return
	}
)
```

とか書いてたところは

```coffeescript:
angular.module("mymodule", []).directive("foo", ->
	{
		restrict: 'CA'
		link: (scope, element, attrs)->
			nexts = element.nextAll()
			#ごにょごにょ
			return
	}
)
```

って形に直そう...
com.android.internal.RのリソースIDの取り方


忘れがちなのでメモ

```java
// com.android.internal.R.string.hogeのリソースIDを取得
int resId = Resources.getSystem().gerIdentifier("hoge", "string", "android");
```

ちなみに一般アプリのリソースの取り方は

```java
// com.example.sampleアプリのR.string.hogeのリソースIDを取得
int resId = context.getResources().gerIdentifier("hoge", "string", "com.example.sample");
```
こっちの場合はContextが必要
コードレビュー待ってられないからちょっとどうなってるか確認したいのだが・・・

まだマージされてないブランチをすべて今のブランチにマージする悪魔のスクリプト

```bash
git branch -r --no-merged | while read BRANCH; do git merge --no-ff ${BRANCH};done;unset BRANCH;
```

あるいはfeatureブランチに限定したりとかが実用的なのかもしれない

```bash
git branch -r --no-merged | grep feature | while read BRANCH; do git merge --no-ff ${BRANCH};done;unset BRANCH;
```

tmpブランチとか作って実行すると、容赦なくチャンプルーされたブランチが出来上がってしまう。確認には便利かもしれないが、間違ってpushすると場合によって死に至る。
Macにmanpages-jaを入れる君作った


必要なもの
----
* homebrew

インストール方法
----

./setup.sh を実行するとmanpages-jaが /usr/local/share/man/ja_JP.UTF-8 に格納されます。

manpages-ja利用方法
----

[cli_searcher](https://github.com/tukiyo/cli_searcher.git)から使うのをおすすめします。

セットアップ画面例
----


```Bash
➜  man  ./setup.sh 
+ brew tap homebrew/dupes
Error: Already tapped!
+ brew install groff
Warning: groff-1.22.2 already installed
+ curl http://linuxjm.sourceforge.jp/man-pages-ja-20130715.tar.gz
+ tar x -
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 4318k  100 4318k    0     0   125k      0  0:00:34  0:00:34 --:--:--  129k
+ sudo patch /etc/man.conf
patching file /etc/man.conf
Reversed (or previously applied) patch detected!  Assume -R? [n] n
Apply anyway? [n] n
Skipping patch.
2 out of 2 hunks ignored -- saving rejects to file /etc/man.conf.rej
+ patch man-pages-ja-20130715/script/configure.perl
patching file man-pages-ja-20130715/script/configure.perl
+ cd man-pages-ja-20130715
+ make
+ make install
install: manual/LDP_man-pages/man2/getrusage.2: No such file or directory
gzip: /usr/local/share/man/ja_JP.UTF-8/man2/getrusage.2: No such file or directory
install: manual/LDP_man-pages/man3/if_nameindex.3: No such file or directory
gzip: /usr/local/share/man/ja_JP.UTF-8/man3/if_nameindex.3: No such file or directory
install: manual/LDP_man-pages/man3/if_nametoindex.3: No such file or directory
gzip: /usr/local/share/man/ja_JP.UTF-8/man3/if_nametoindex.3: No such file or directory
install: manual/LDP_man-pages/man7/numa.7: No such file or directory
gzip: /usr/local/share/man/ja_JP.UTF-8/man7/numa.7: No such file or directory
install: manual/LDP_man-pages/man2/recvmmsg.2: No such file or directory
gzip: /usr/local/share/man/ja_JP.UTF-8/man2/recvmmsg.2: No such file or directory
install: manual/LDP_man-pages/man2/sendmmsg.2: No such file or directory
gzip: /usr/local/share/man/ja_JP.UTF-8/man2/sendmmsg.2: No such file or directory
+ echo '[info] man installed /usr/local/share/man/ja_JP.UTF-8/'
[info] man installed /usr/local/share/man/ja_JP.UTF-8/
+ echo done.
done.
+ set +x
➜  man  du -sh /usr/local/share/man/ja_JP.UTF-8
 14M	/usr/local/share/man/ja_JP.UTF-8
➜  man  
```
Amazon Web Services (AWS) Simple Storage Service (S3) に画像が無い場合のみ、自サーバーへリダイレクトする方法

'Static Web Hosting'設定を'Enable website hosting'のラジオボタンをチェックして
'Edit Redirection Rules'のテキストエリアに以下を入れる。

```xml:
<RoutingRules>
	<RoutingRule>
		<Condition>
			<HttpErrorCodeReturnedEquals>403</HttpErrorCodeReturnedEquals >
		</Condition>
		<Redirect>
			<HostName>image.example.domain</HostName>
			<HttpRedirectCode>302</HttpRedirectCode>
		</Redirect>
	</RoutingRule>
</RoutingRules>
```

上記でS3にファイルが無い場合302でリダイレクトされる

http://{$s3domain}/foo/var/hoge.jpg -> http://image.example.domain/foo/var/hoge.jpg

詳しくは[公式ドキュメント](http://docs.aws.amazon.com/AmazonS3/latest/dev/HowDoIWebsiteConfiguration.html)をご覧ください。

## 補足1.リダイレクトコード307

リダイレクトコードは様々だが、HttpRedirectCodeに307を指定する事によって、CloudFrontにもリダイレクトをキャッシュさせずにすむので、ファイルを置いたらすぐCloudFrontが認識したりできる。
cliから各種検索する君作った。(jman,alc,archwiki,qiita,google…)

manコマンドのラッパーを用意していたら別方向に拡張してしまった。

使い方
----

```Bash
$ cli_searcher less ← 日本語マニュアルあれば優先表示。英語マニュアルは色付きになります。
$ cli_searcher -k ssh ← manコマンドの-kオプションとして動きます。
```

以下は全てブラウザ起動。

```Bash
usage: cli_searcher [options] keyword
options:
  -n|--net             : man日本語ウェブ
  --php                : phpマニュアル
  --alc                : alc和英/和英
  --archwiki           : archwiki
  --stackoverflow      : stackoverflow
  --qiita-tag          : qiitaタグ
  --qiita              : qiita
  --googlemap          : googleマップ
  --google             : google
  --smblookup          : Windowsのコンピュータ名検索
  --whois-jp-contact   : jpドメイン名から登録者一覧を検索
  --jobtalk            : 企業の内情
  --kakaku             : 価格コム
  --vimdoc             : vimdoc
  --wikipedia          : wikipedia
  --weather            : 天気
  --youtube            : youtube
  --github-python      : github code search
  --github-php         : github code search
  --github-html        : github code search
  --github-javascript  : github code search
What manual page do you want?
```

設定変更
----

先頭に定義しているものを適宜修正してください。

```Bash
#[config]
MAC_BROWSER=/Applications/Safari.app
#MAC_BROWSER=/usr/local/bin/w3m
LINUX_BROWSER=x-www-browser
UTF8MANPATH="/usr/local/share/man/ja_JP.UTF-8"
```

```bash:
alias phpnet='cli_searcher --php'
alias alc='cli_searcher --alc'
alias archwiki='cli_searcher --archwiki'
alias stackoverflow='cli_searcher --stackoverflow'
alias qiita='cli_searcher --qiita'
alias qiita-tag='cli_searcher --qiita-tag'
alias googlemap='cli_searcher --googlemap'
alias google='cli_searcher --google'
alias jobtalk='cli_searcher --jobtalk'
alias kakaku='cli_searcher --kakaku'
alias vimdoc='cli_searcher --vimdoc'
alias wikipedia='cli_searcher --wikipedia'
alias weather='cli_searcher --weather'
alias youtube='cli_searcher --youtube'
alias github-python='cli_searcher --github-python'
alias github-php='cli_searcher --github-php'
alias github-html='cli_searcher --github-html'
alias github-javascript='cli_searcher --github-javascript'
```

[download](https://github.com/tukiyo/cli_searcher.git)
FireFoxのスーパーリロード時(Shift + Cmd + R)に変化するHTTPリクエストヘッダ

<!-- too_old -->
> **この記事は最終更新から1年以上経過しています。** 気をつけてね。


ふと気になったのでブラウザのスーパーリロード時にブラウザが投げるヘッダをチェックしてみた、FireFoxでは`Shift + Cmd + R`だ。

ああ、`Pragma: no-cache`が付いて、`Cache-Control:`が `no-cache`になると。httpサーバの設定でよく見るね。

### ただの`Cmd+R`

```bash:Cmd+R
$ echo hoge | nc -l 8080
GET / HTTP/1.1
Host: xxx.xxx.xxx.xxx:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:22.0) Gecko/20100101 Firefox/22.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cache-Control: max-age=0
```

### `Shift+Cmd+R`

```bash:Shift+Cmd+R
$ echo hoge | nc -l 8080
GET / HTTP/1.1
Host: xxx.xxx.xxx.xxx:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:22.0) Gecko/20100101 Firefox/22.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
```
patchファイルの作り方


## patch作成

```Bash
$ diff -u "元ファイル" "変更後ファイル" > "パッチファイル"
```

* 例:/etc/man.confを書き換えたパッチを作る。

```Bash
$ diff -u man.conf{.bak,} > man.conf.patch
```

## patch適用

```Bash
$ patch man.conf < man.conf.patch
```
Rubyで波を表現する

Rubyのコードで波を作る。人によって波に見えないかも、、、、、、

```kuragesan.rb
Wave = []
loop do
  20.times do
      Wave.unshift(1)
      p Wave
      sleep(0.01)
  end
  20.times do
      Wave.pop
      p Wave
      sleep(0.01)
  end
end
```
Rubuで<映画マトリックスの世界の冒頭部分>を表現する

「これからRubyの始める人たちへ」という題の記事を参考に作った。
http://melborne.github.io/2012/04/09/to-newbie/
人によってはマトリックス(行列)に見えないかも、、、、、、、、、

```Edogawaku.rb
def gori_yes(size=1)
  [*0..9,*'a'..'z',*'A'..'Z'].sample(size).join
end
loop do
print gori_yes + " " + gori_yes + " "
sleep(0.001)
end
```
PIL（Python Imaging Library）を使って画像ファイルを作成する。

Python 2.7で実行。まだPILはPython 3系には対応していないもよう。

※自分の学習用のメモです。

## PIL（Python Imaging Library）とは
[Python Imaging Library (PIL)](http://www.pythonware.com/products/pil/index.htm "Python Imaging Library (PIL)")

[Python Imaging Library - Wikipedia](http://ja.wikipedia.org/wiki/Python_Imaging_Library "Python Imaging Library - Wikipedia")

画像処理ライブラリ。さまざまな画像処理が実装されているらしい。

## とりあえずサンプル

```python:image.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
画像ファイルを作成する
"""

import Image

def make_image(screen, bgcolor, filename):
    """
    画像の作成
    """
    img = Image.new('RGB', screen,bgcolor)
    #
    #ここに、いろいろな処理を追加する
    #
    img.save(filename)
    return

if __name__ == '__main__':
    # 画像のサイズ
    screen = (1024,768)

    # 画像の背景色（RGB）
    bgcolor=(0xdd,0xdd,0xdd)

    # 保存するファイル名（ファイル形式は、拡張子から自動的に判別する）
    filename = "pil-01.png"

    make_image(screen, bgcolor, filename)

#EOF

```

なーんのひねりもない、ただ画像ファイル（PNG形式）を作成するスクリプトです。

このスクリプトを元に、各種画像処理を追加していく予定です。
Rails　データベースに関して

###[データベース]
アプリごとに作るデータのかたまりがはいったもの
###[マイグレーションファイル]
データベースの更新を行うためのファイル
###[モデル]
データベースに用意されたテーブルと関連づけられたオブジェクト,最初が大文字,単数形
###[テーブル]
データベースの中に用意されているデータ保管のための要素、具体的な構造を定義したもの,複数形で名前を付ける
###[カラム(フィールド)]
テーブル用意される１つ１つの値
###[レコード]
テーブルに保管されている１つ１つのデータのかたまり、複数のカラムからなる

####モデルを作る

```
> rails g model モデル名  名前1:種類 名前2:種類 名前3:種類

```

モデル名はrailsの命名規則で単数形、名前はカラムの事、種類は値。

##カラムの型の種類

|カラムの型| 意味|
|:------------:|-----:|
|string|文字列|
|text	|長い文字列|
|integer|整数|
|float	|浮動小数|
|decimal|精度の高い小数|
|datetime|日時|
|timestamp|より細かい日時|
|time	|時間|
|date|日付|
|binary|バイナリデータ|
|boolean|Boolean型|


マイグレーションスクリプトの作成:

```
> rails generate migration クラス名
```

カラムの追加と削除の場合

```
> rails g migration クラス名 カラム名:データ型
```

例えばUserモデルにnameのカラムとemailのカラムを属性をStringで追加したい場合には

```
> rails g migration User 
```

と打つとmigrationファイルに

```rb
class User < ActiveRecord::Migration
  def change
  end
end

と記述されるので以下のようにコードを追加する。

class User < ActiveRecord::Migration
  def change
    add_column :users, :name, :string
    add_column :users, :email, :string
  end
end
```

mongoidとactiverecordが併存する場合

```
> rails g active_record:migration クラス名
```

マイグレーションを実行,データベースに内容を更新する

```
> rake db:migrate
```

カラムの削除

```
> rails g migration RemoveXXXFromYYY カラム名:データ型
```
 
XXXはカラム名, YYYはテーブル名

マイグレーションスクリプトの削除

```
> rails destroy migration クラス名
```

マイグレーションで失敗して修正したい場合のコマンド、１つ前にさかのぼる

```
> rake db:rollback
```


参考記事(http://www.rubylife.jp/rails/model/index7.html)
Herokuの初期設定方法(ruby on rails)

Herokuのサイトでアカウント登録
その後に
```gem install heroku```
railsでアプリを作成、、、newの後は名前はなんでも可。
```rails new UhoUho```

Gemfileの修正(herokuにデプロイする際に必要)
gem'sqlite3'の記述の前後で

```
group :development, :test do
    gem 'sqlite3'
end
group :production do
    gem 'pg'
end 

```


production.rbの修正 (フォルダ構成:config/enviroments/production.rb)

```
config.assets.compile = false
falseをtrueにかえる
config.assets.compile = true
```

公開キーの作成、SSHの公開キーを作ってHerokuに登録,安全にデータをやりとりするためにSSHという暗号化通信を行う

```
> ssh-keygen
```

色々たずねられるがOverwrite(y/n)?の時だけ「y」と入力.

Herokuを登録

```
> heroku keys:add
```

自分の作ったアプリのパスに入って
gitを初期化

```
> git init
```

Herokuのアプリケーションの登録,すでに使われている名前だと失敗するので注意

```
> heroku create 名前
```


herokuにデプロイ

```
> git add .
> git commit -m "メッセージ(なんでも適当に)"
> git push heroku master
```

Herokuでマイグレーション、データベースに反映させないと動かないので忘れずにやる

```
> heroku run rake db:migrate
```

Herokuでシード、初期で登録してあるデータを反映させる場合に使う

```
> heroku run rake db:seed
```

サイトに接続

```
> heroku open
```

サーバーのログを確認する

```
> heroku logs
```
MP3を再生するjavascript(audio.js)のメモ

#audio.js

MP3を再生するjs。HTML5です。IE7,8では動かなかったです（当然か）

![audiojs_img.PNG](https://qiita-image-store.s3.amazonaws.com/0/26200/73403212-af78-b0e2-a037-567c8fa5aa59.png)

[参考にしたサイト](http://coliss.com/articles/build-websites/operation/javascript/js-audio-js.html)
[ダウンロード](http://kolber.github.io/audiojs/)
上記サイトからダウンロードしてそれっぽいところに置く
audiojs.swfはaudio.min.jsと同じディレクトリに置いた

`<head>`タグ内で呼び出し

```html:head
<script type="text/javascript" src="/js/audio.min.js"></script>
<script>
  audiojs.events.ready(function() {
    var as = audiojs.createAll();
  });
</script>
```

プレイヤーを表示させたいところに`<audio>`タグを置く

```html:プレイヤー
<audio src="/mix/1.mp3" preload="auto" />
```

これでとりあえずは音が鳴る
でも今回はプレイヤーを表示させずに音楽をただひたすらループさせたかったので改造


`<audio>`タグ内に`loop`って書くとループになるみたい。
プレイヤーを非表示にする方法がよくわからなかったので、とりあえず`<div>`タグで囲ってCSSで`display:none;`にした。

```html:プレイヤーを消して音楽はループ
<div style="display:none;">
<audio src="/mix/1.mp3" preload="auto" loop />
</div>
```

さらに、自分で作ったボタンでスタート・ストップを制御したい
さらにさらに、キーボードでもスタート・ストップを制御する

```html:headタグ内
<!-- jQuery 召喚 -->
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
<script>
  jQuery(function() { 
    var a = audiojs.createAll();
    var audio = a[0];
    
    // 自作ボタンでの制御
    jQuery('.play').click(function(e) { audio.play(); });
    jQuery('.pause').click(function(e) { audio.pause(); });
    
    // キーボードでの制御
    jQuery(document).keydown(function(e) {
      var unicode = e.charCode ? e.charCode : e.keyCode;
      // Zキーを押すとスタート
      // Eキーを押すとストップ
      if (unicode == 90) {
        audio.play();
      } else if(unicode == 69){
        audio.pause();
      }
    })
  });
</script>
```

```html:スタート・ストップボタン
<button class="play">スタート</button>
<button class="pause">ストップ</button>
```

できあがり
MySQLをソースからコンパイル & インストール


## 1. ソースファイルをダウンロード & 解凍

http://dev.mysql.com/downloads/mysql/ からソースをダウンロードして解凍する。

## 2. cmake インストール

MySQLは./configureの代わりにcmakeを使用するので事前にcmakeをインストールしておく。

```` console
$ sudo aptitude install cmake
````

## 3. mysql専用ユーザを作成

````console
$ sudo groupadd mysql
$ sudo useradd -g mysql -s /usr/sbin/nologin mysql
````

## 4. ビルド

./configureの代わりにcmakeを実行する。
今回は下記を設定。
デフォルトのインストール先は`/usr/local/mysql`になる。

* デフォルトのキャラクタセット = utf8
* デフォルトの照合順序 = utf8_general_ci
* ストレージエンジンにInnoDB追加

````console
$ cmake -DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1
````

cmakeのオプションについては http://dev.mysql.com/downloads/mysql/ この辺りを読んでください。

## 5. make

```` console
$ make
````

## 6. make install

``` console
$ sudo make install
````

## 7. mysqlデータベース作成

mysqlのユーザー情報などを管理するデータベースを作成する。

````console
$ cd /usr/local/mysql
$ sudo ./script/mysql_install_db --user=mysql
````

## 8. サービス起動

`/usr/local/mysql/support_files`に設定ファイルの雛形やらinitスクリプトなどが入ってるので必要に応じて利用する。
今回はサービスとして起動したいので、`mysql.server`ファイルを`/etc/init.d`ディレクトリにコピー。

````console
$ sudo cp /usr/local/mysql/support_files/mysql.server /etc/init.d/mysql
$ cd /etc/init.d/
$ sudo chown root:root ./mysql
$ sudo chmod a+x ./mysql
````

で、下記コマンドでサービス起動。

````console
$ sudo service mysql start
````

サービスを停止する場合は下記コマンドを実行。

````console
$ sudo service mysql stop
````

## 9. サービスの自動起動

下記コマンドでサーバが再起動しても自動的にサービスが起動するように設定。

````console
$ sudo update-rc.d mysql defaults
````

## 10. MySQLのroot@localhostアカウントの設定

下記コマンドでroot@localhostアカウントのパスワードを設定する。

````console
$ /usr/local/mysql/bin/mysqladmin password oraoraora -u root
# oraoraoraの部分に設定したいパスワードを入力する。
````

パスワードが設定できたかmysqlサーバにログインして確認。

````console
# /usr/local/mysql/bin/mysql -uroot -p
Enter password: <パスワードを入力>
````
```` shell-session
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.12 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
	
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

とmysqlのプロンプト表示されたらOK。
印刷用WEBページを作る時のメモ

印刷ボタンの作り方

```html:
<button onclick="window.print()">印刷する</button>
```

これだけ。簡単

印刷用CSS

```css:
@media print {
 /* 印刷の時だけ使うCSS */
}
@media screen {
 /* PCの画面の時だけ使うCSS */
}
```
CreatejsでMovieClipをランダムなフレームから開始する方法

ゲームなどでキャラクターのMovieClipをステージに複数配置した際、
それぞれのタイムラインをずらしたいときなどに使えるかもです。

####ポイント####
1. **mc.timeline.duration**で、フレーム数になる
2. CreateJSは<b>フレームが0から始まる</b>

```ts:

// トータルフレーム数
var totalFrame:number = mc.timeline.duration;
// 全フレームの中からランダムなフレームを取得
var targetFrame:number = (Math.random() * totalFrame )>>0;
// 指定フレームからスタートする
mc.gotoAndPlay(targetFrame);

```

短縮版

```ts:
mc.gotoAndPlay((Math.random() * mc.timeline.duration )>>0);
```


CreateJS では、MovieClip クラスに currentFrame プロパティはありますが、totalFrame プロパティは無いようです。
im4javaで画像の幅高さを取得

im4javaで画像のサイズを取得する
http://kyle-in-jp.blogspot.jp/2009/02/im4java_19.html

この記事を参考に実装したら処理が非常に重かったので改良。
重い原因はverboseオプションを付けて詳細情報を出しているからだと思われる。

```java:
public static int[] getImageSize(File src) {
	try {
		IMOperation op = new IMOperation();
		op.format("%wx%h");
		op.addImage(src.getAbsolutePath() + "[0]");

		IdentifyCmd identify = new IdentifyCmd();
		identify.setSearchPath(getImageMagickPath());

		ArrayListOutputConsumer output = new ArrayListOutputConsumer();
		identify.setOutputConsumer(output);
		identify.run(op);
		ArrayList<String> lines = output.getOutput();
		if (lines.size() > 0) {
			String line = lines.get(0);
			String sz[] = line.split("x");
			return new int[] { Integer.parseInt(sz[0]), Integer.parseInt(sz[1]) };
		}
	} catch (Exception e) {
	}
	return null;
}
```
Play Framework で Basic 認証を行うアクションのミックスイン

コントローラにミックスインして、 `AdminAction` を使って処理を書くことで、認証されているときにのみ画面を表示することができます。

ユーザー名とパスワードは Basic 認証で行われ、 `AdminAction` から与えられた `request.userName` で、認証された名前が得られます。

`AdminSecure` という名前ですが、管理者に限っているということではなく、Basic 認証を行っているだけです。
コントローラごとに認証される名前とパスワードを変えたいときは `checkAccount` をオーバーライドしてください。

```scala:AdminAction.scala
package controllers

import play.api._
import play.api.mvc._

/**
 * 管理者のアカウントを取り扱うモジュール
 */
trait AdminSecure {
  import play.api.mvc.Results._

  private[this] val accounts = Map("admin" -> "password")

  protected val basicRealm = "(my realm)"

  /** ユーザー名とパスワードが一致するかを返します */
  protected def checkAccount(userName: String, password: String) =
    accounts.get(userName).filter(_ == password).nonEmpty


  /**
   * 認証を確認して実行するアクション
   */
  object AdminAction {
    private val AUTHORIZATION = "authorization"
    private val WWW_AUTHENTICATE = "WWW-Authenticate"

    private def realm = "Basic realm=\"%s\"".format(basicRealm)

    def apply(f: AuthenticatedRequest[AnyContent] => Result): Action[AnyContent] =
      apply(BodyParsers.parse.anyContent)(f)

    def apply[A](p: BodyParser[A])(f: AuthenticatedRequest[A] => Result) = Action(p) { request =>
      request.headers.get(AUTHORIZATION) match {
        case Some(BasicAuthorization(name, pw)) if checkAccount(name, pw) =>
          f(new AuthenticatedRequest(name, request))
        case _ => Unauthorized("need admin login").withHeaders(WWW_AUTHENTICATE -> realm)
      }
    }

    /**
     * Basic 認証の値の取り扱い
     */
    private object BasicAuthorization {
      private val basicPefix = "Basic "
      private val AUTHORIZATION_PARAMS = """([^:]+?):(.+)""".r

      /**
       * Base64 エンコードで文字列化された Basic 認証値を、ユーザー名とパスワードに分解して返します
       *
       * @param auth Base64 エンコード文字列
       * @return 名前とパスワード
       */
      private[this] def decode(auth: String): Option[(String, String)] = {
        val d = javax.xml.bind.DatatypeConverter.parseBase64Binary(auth)

        new String(d, "utf-8") match {
          case AUTHORIZATION_PARAMS(username, password) => Some(username, password)
          case _ => None
        }
      }

      /**
       * WWW-Authenticate ヘッダの値から、ユーザー名とパスワードを取り出します。
       *
       * @param authorization WWW-Authenticate ヘッダ値。ヘッダの名前は含まない。
       * @return 名前とパスワード
       */
      def unapply(authorization: String): Option[(String, String)] = authorization match {
        case s if s startsWith basicPefix => decode(s drop basicPefix.length)
        case _ => None
      }
    }

    /** 認証されて実行するリクエスト */
    class AuthenticatedRequest[A] private[controllers]
      (val userName: String, request: Request[A]) extends WrappedRequest(request)
  }
}
```

## 実装方法

```scala:Application.scala
package controllers

import play.api._
import play.api.mvc._

object Application extends Controller with AdminSecure {
  def adminHome = AdminAction { implicit request =>
    Ok("Welcome back, " + request.userName)
  }
}
AmazonLinuxでyumでインストールしたImageMagickのJPEGリサイズ高速化

本当は速いImageMagick: サムネイル画像生成を10倍速くする方法
http://blog.mirakui.com/entry/20110123/1295795409

この記事を参考に高速化を試しました。
記事中には「ImageMagick-6.4.9 かそれ以前のバージョンでは、 -define jpeg:size=... でなく -size=... とします」とありますが、実際はv6.5.6-0より古いバージョンで-sizeオプションを付ける必要があります。
AmazonLinuxでyumでインストールできるImageMagickのバージョンは6.5.4-7なので-sizeオプションを使います。

```bash
convert -size 200x200 -resize 200x200 src.jpg dest.jpg
```

東京リージョンのm1.smallインスタンスで試したところ、-sizeが無い場合と比べて6倍ほど速くなりました。
jQueryにおけるattrとpropの違いと使いドコロまとめ

checkboxやradioのチェック状態を調べる際にはattrではなくpropを使うのが良い。
attrでも取れないこともないですが、propで取得する方が処理が早いです。
特にIEの場合、inputに対するdisabledの処理がものすごく重く、attrでdisabledやcheckedの処理を沢山していると、無駄に最悪な感じで負荷がかかります。

##attrとpropの取得の違い##

またこの２つは、同じ値を取得してるようで異なる値を取得するので注意。

例えば

```
//チェックした値を取得するよー
$(":checkbox").click(function() {
   alert($(this).prop('checked'));     
　alert($(this).attr('checked'));
});
```

の場合、

チェック時
`prop     true`
`attr      checked`

非チェック時
`prop     false`
`attr      undefined`

という全然違う値が返ってきます。  


##なぜ解釈が違うのか##

attrは純粋に **属性における値** を取得するので、この場合は、

>checkされてない
>↓
>checkedという『属性』がない！
>↓
>**undefined**

という認識をしています。


一方でpropは、checkedという **プロパティの真偽** を取得してくれます。なので、

>checkされてない
>↓
>checkedという『プロパティ』はfalse
>↓
>**falseだよー**

という解釈をします。

以前のバージョンではプロパティもなんとなく取得していた雰囲気のattrですが、propが一人前に育ってきたので本格的に属性の取得に専念した印象があります。…個人的にですが。
最近のjQueryのバージョンだとこの辺が厳密になってきている印象を受けます。古いプラグインだとjQueryによるattrの処理の解釈が違うばっかりに動作しないなどがあったりするので、プラグインがバージョンによって動かない際にはその辺なども見てみるといいかもしれないです。


##inputはprop！##

HTMLの属性を取得する場合はattr、input関連の値を取得する場合はprop、と考えておくといいと思います。
また、inputのプロパティを取得する以外に、hrefを取得する際なども、propではURLの値をまるごと取得してくれたり、色々便利に使えます。  


##propのサンプル##

以下、disabledのサンプルです。参考までにあげときます。

###チェックボックスがチェックされたら、inputを入力できるようにする###

**jQuery**

```
$('#test_chk').on('change',function(){
   var chk = $(this).prop('checked'),
   obj = $('#test_input');
   (chk) ? obj.prop('disabled',false) : obj.prop('disabled',true) ;
});
```
  
**HTML**

```
<input name="" type="checkbox" value="" id="test_chk" />
<label for="test_chk">chk1</label>
<input name="" type="text" id="test_input" disabled="disabled" />
```


###セレクトバージョン(indexが2のやつ(上から3番目)を選択したらdisabledを解除)###
  
**jQuery**

```
$('#test_select').on('change',function(){
    var chk = $(this).prop('selectedIndex'),
    obj = $('#test_input');
    (chk==2) ? obj.prop('disabled',false) : obj.prop('disabled',true) ;
});
```
  
**HTML**

```
<select name="" id="test_select">
     <option>00000</option>
     <option>11111</option>
     <option>ここが選択されたらinputのdisabledを解除するよー</option>
</select>
<input name="" type="text" id="test_input" disabled="disabled" />
```
Mac OSX MountailLionでVirtualBoxのExtensionPackをインストールするときにエラーになったら


ExtensionPackを入れようとしたら、下記エラーがでてインストールできませんでした。

	The installer failed with exit code 1: VBoxExtPackHelperApp: error: World writable: '/Applications'.

/Applicationsのパーミッションみたら777だったのでこれなら入りそうだと思ったんですが、どやら775（Everyoneの書き込み権限無し）にしないとインストールできないようです。

https://github.com/xdissent/ievms/issues/48
の投稿をみてパーミッション775にしたらようやくExtensionPackをインストールできました
注意書きなどに便利なCSS

注意書きに使えます。

※をCSSで付けています。(IE7以下では※がつきません)

また、※以外は１文字下がって表示されます。<br>で折り返しても大丈夫。
できる限り装飾文字はコードに入れたくない場合などにいいかもしれません。

```ruby:CSS
p.note { margin-left: 1em; text-indent: -1em;}
p.note:before { content:"※";}
```

```ruby:HTML
<p class="note">memo memo memo memo memo memo memo memo memo memo memo memo memo memo memo memo memo memo memo memo</p>
```
単純にエスケープするだけでは防げないSQLインジェクションの例

UPDATE文やINSERT文にはパラメータ選択でSELECTを使用できる

こんな感じ
INSERT INTO table WHERE id = (SELECT ~);

例えばpostgres用のPHP関数pg_escape_string()だとシングルクォーテーションや" ; "
とかをエスケープしていてSELECT文は実行されてしまう。

そこに、例えばこんなCASE文を入れると
(SELECT case when getpgusername() =　CHR(110)||CHR(115) then 1 else NULL end)
getpgusername()がCHR(110)||CHR(115)ではない場合、NULLがSELECTされる。
DBのテーブル設定で該当カラムにNOT NULLを指定していると
NULLは入れられません
みたいなエラー文が返ってくる。
つまり、この例ではユーザーネームはCHR(110)||CHR(115) ではありませんよということがわかってしまう。
逆に、エラーが返ってこなければユーザーネームはCHR(110)||CHR(115) であるということがいえる。

と、いうことでエスケープだけでは防げない例でした。
GitLab 5.4がリリース

7月22日にGitLab 5.4がリリースされました。

## 3つの重要な改善

1. コメントの編集
2. Issueへの参加者を表示
3. メンションによるメール通知

[[詳細を表示](http://hiroponz.hateblo.jp/entry/2013/07/23/074419)]
他プラットフォームでなぜか Rails アプリが動かない


本当につまらないことでハマった．
OSX 上で開発して，問題なく動いていたアプリを，Fedora サーバーに移して動かそうとするもライブラリのロードエラーなどで全く動かない．

原因は

```
$ bundle install --path=vendor/bundler```

してたのをそのままコピーして，なおかつ何も考えずに新しい環境で

```
$ bundle install```

してたことが原因らしい．

あらためて新しい環境で下記操作．

```
$ rm -rf vendor/bundler
$ bundle install --path=vendor/bundler
$ rails s
```

おー，動いた！
転職活動に便利なコマンドとツール

転職活動をする際、企業のHPみても実情がよくわりませんよね。

そこでおすすめしたいツールはこちらです。

* [転職会議](http://jobtalk.jp)

コマンドも用意しておきました。

* [cli_searcher](http://qiita.com/tukiyo@github/items/5dcd424c6a3e24e34b07)

社員の生の声が聞こえます。
実際自社や取引先の会社のを見てみましたが「全くその通り」という内容でした。

面接に行った際、ここで知った情報を元に待遇の交渉をしてみてはいかがでしょうか。
pthreadではtrylockは避けるべき

pthreadはスケジューリングがコオペレイティブなのでtrylockみたいなのでプロセッサを握ったままにしてると他の処理が回らなくなる。どうしてもそうする必要があるのならプリエンプトしてくれるLinuxのスレッドを使う方がいいが、その場合複数コンテキストが本当に同時に動くので本気でで競合状態に対応する必要がある。
ジョイスティックの使い方＠Linux

/usr/include/linux/joystick.hを見るとだいたいのことは書いてある。

- /dev/input/js*を普通にopenで開く(fopenはバッファしちゃうのでダメ)
- js_event構造体へ8bytes読む(sizeofで比較してもいいけどsizeofは符号なし)
- 状態に何も変化がないとデータは出て来なくてreadはブロックされるのでselectかpoll使うなりpthread使うなり(個人的にはpthreadの方がいいと思う)
- タイムスタンプについては省略
- .typeメンバがイベントタイプ
- アナログスティックの時は.typeがJS_EVENT_AXISで.numberメンバに軸番号が、.valueメンバに16bits符号付き整数で値が入ってる
- ボタンの時は.typeがJS_EVENT_BUTTONで.numberメンバにボタン番号が、.valueメンバに状態が入ってる

**ただし！**
.typeメンバにはJS_EVENT_INITがorされている。
このビットマスクは最初の値の時にorされるのだが、リラティブデータでなければ要らないので~JS_EVENT_INITをandして除去する。でないと.typeをswitchかなんかで比較してるとスティックを動かすまで入力がうまく認識されないことがある。これ、Wineがやらかしてるのよな。

実際のコードはこんな感じ。 https://github.com/tarosuke/toolbox に置いてあるものの一部(ライセンスはGPL3)。

```cpp:joystick.cc
void JOYSTICK::JSThread(){
	for(;; pthread_testcancel()){
		struct js_event ev;
		if(8 == read(device, &ev, sizeof(ev))){
			switch(ev.type & ~JS_EVENT_INIT){
			case JS_EVENT_AXIS :
				if(ev.number < maxAxis){
					axis[ev.number] = ev.value;
				}
				break;
			case JS_EVENT_BUTTON :
				if(ev.value){
					buttons |= 1U << ev.number;
				}else{
					buttons &= ~(1U << ev.number);
				}
				break;
			}
		}
	}
}
```
nunit-console2で指定したテストのみ流す


nunit-console2コマンドにより,C#のテストをコマンドライン上から流すことができる.

```Bash:nunit-console2-all
nunit-console2 (dllへのパス)
```

しかし,上記のコマンドではdllに含まれる全テストが流れてしまう.
個別に流したい場合,以下のようにrunオプションを使う必要がある.

```Bash:nunit-console2-partial
nunit-console2 (dllへのパス) -run=(namespace).(class).(method)
```

なお,クラスまで指定した場合は,クラス内に含まれる全てのテストが流れる.
同様にネームスペースまで指定した場合は,ネームスペースに含まれる全てのテストが流れる.
リストの初期値は<T> List<T> java.util.Arrays.asList(T… a) で設定できる。


標準ライブラリですし、むしろ「なんで今までしらなかったの？」といわれてしまいそうな感すらありますが。

よく、配列の解説の際に、要素を列挙して配列を作る例があると思います。

```java:配列の初期化
int[] a = { 1, 2, 3};
```

Javaのjava.util.ArrayListあたりで同じ事をやろうとおもうと、

```java:愚直なリストの初期化
List<Integer> a = new ArrayList<Integer>();
a.add(1);
a.add(2);
a.add(3);
```

などとする必要がありますが、タイプ数も多いですし行数も無駄に増えて美しくないです。
要素が増えたり減ったりしたときの修正も面倒ですね。

そこで、表題のjava.util.Arrays.asList(T… a)です。

```java:java.util.Arrays.asListをつかってスマートにリストの初期化
List<Integer> a = java.util.Arrays.asList(1,2,3);
```
と、配列ライクに初期化ができるのでした。

```java:static_importするともっとすっきりします。
import static java.util.Arrays.asList;
…
List<Integer> a  = asList(1,2,3);
```

基本中の基本のような標準ライブラリのメソッドなのですが、投稿しておきます。

テストケースなどを書くときには特に重宝しそうです。
POSTMAN(POSTで渡すパラメータが多い時とか)

POSTMANで値を一つ一つ渡すのがめんどいとき

1. rawを選択

2.encodeしたパラメータを&で結合してベタ書き
例
email=email%40gmail.com&password=password

3.ヘッダーで
ContentType : application/x-www-form-urlencoded
を指定

3のContentTypeを指定することでベタ書きでPOSTできるようになる
「第8回オフラインリアルタイムどう書くの参考問題」をPHPで解く

http://qiita.com/Nabetani/items/24b9be4ee3bae4c89a95
http://nabetani.sakura.ne.jp/hena/ord8entco/

必ず一意に復元可能なので、^でマッチングするだけです。

```php:
<?php
	
	class ENTROPY{
	
		/**
		* 符号を解読して返す
		* @param  String 「16d9d4fbd」みたいな文字列
		* @return String 「ethanol:30」みたいな文字列
		*/
		public function get($input){
			
			// マッチ文字列
			$search = ['/^000/', '/^0010/', '/^0011/', '/^0100/', '/^01010/', '/^0101101/', '/^010111/', '/^0110/', '/^0111/', '/^10/', '/^1100/', '/^1101/', '/^111/'];
			$replace = ['t', 's', 'n', 'i', 'd', 'c', 'l', 'o', 'a', 'e', 'r', 'h', 'z'];
			
			// 入力値を2進数に
			$str = '';
			for($i=0; $i<strlen($input); $i++){
				$str.= strrev(str_pad(base_convert($input[$i], 16, 2), 4, '0', STR_PAD_LEFT));
			}
			
			// 内部使用
			$entropy = ''; // できあがる文字列
			$lastmatch = ''; // 最後にマッチした文字
			$strlen = strlen($str); // ビット数カウント用
			
			// マッチする限り繰り返し
			$str = preg_replace($search, $replace, $str, 1, $count);
			while($count>0){
				$lastmatch = $str[0];
				$str = substr($str, 1);
				
				// 引っかかったのがEOFだったら終了
				if($lastmatch === 'z'){
					break;
				}
				
				// 次のループ用
				$entropy .= $lastmatch;
				$str = preg_replace($search, $replace, $str, 1, $count);
			};
			
			// マッチしなかった / EOFがなかった
			if($entropy === '' || $lastmatch !== 'z'){
				return '*invalid*';
			}
			
			// 返却
			return $entropy . ':' . ($strlen - strlen($str));
		}
		
	}
	
	// テスト
	$test = [
		['16d9d4fbd', 'ethanol:30'],
		/* 省略 */
	];

	$entropy = new ENTROPY();
	foreach($test as $key=>$data){
		$answer = $entropy->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
```

2進数にするところで、通常"0x1"は"0001"になりますが、今回は"1000"にしないといけないので妙なことになってます。
検索ループはwhile(strpos()===0)とかwhile(preg_match())みたいにしたかったのですが、いまいちうまくいかなかったのでpreg_replaceを使って微妙なことに。
あとarray_shift()の文字列版ってないのだろうか。

かかった時間は2時間くらい。
どうマッチするかのところで相当時間をくってしまいました。
もうelseif繋げたほうが手っ取り早かったんじゃないかな。
http://qiita.com/shinak53/items/0e7899c0172655960d41
Redisをソースからコンパイル＆インストール


## 1. ソースファイルをダウンロード & 解凍

http://redis.io/download からソースをダウンロードして、tar等で解凍する

## 2. make

````console
$ make
````

## 3. make install

````console
$ sudo make install
````

## 4. 設定ファイルなど作成

設定ファイルなどを作成してくれるスクリプトがあるのでそれを利用する。

````console
$ cd utils
$ sudo ./install_server.sh
````

使用するポートなどを質問されるので、それに答えるといい具合に設定ファイルやらinitスクリプトなど作ってくれる。
Nginxをソースからコンパイル＆インストール


## 1. ソースをダウンロード & 解凍
http://nginx.org/en/download.html からソースをダウンロードして、tarとかで解凍

## 2. configure

* インストール先は`/usr/local/nginx`とする
* httpsが使えること
* リバースプロキシとして使うときに、クライアントのIPアドレスを引き渡したい
* python使わないのでuwsgiは不要
* SSIも不要

````console
$ ./configure --prefix=/usr/local/nginx --with-http_ssl_module --without-http_ssi_module --without-http_uwsgi_module --with-http_realip_module
````

## 3. make

````console
$ make
````

## 4. make install

````console
$ sudo make install
````
JavaScriptでクロージャ入門。関数はすべてクロージャ？


JavaScriptでは関数はすべてクロージャです。
ではそもそもクロージャってなんなんでしょうか。

#クロージャ？？

クロージャの簡単な定義として
「自分を囲むスコープにある変数を参照できる関数」
が挙げられます。

言葉ではパッとしないかもしれませんが、コードを一つづつ追っていくと、
入門としてのクロージャは簡単に理解できます。


#スコープ

まずJavaScriptは関数ごとにスコープが作られます。
スコープとは変数を参照できる範囲のことです。
その範囲外では変数は参照できません。

```javascript:
function func() {
  var value = 1;
  console.log(value);
}
func(); // 1
console.log(value); // undefined
```

#クロージャの例

ここでクロージャの例を見てみましょう

```javascript:
function func() {
  var value = 1;

  function innerFunc() {
    console.log(value);
  }
  innerFunc();
}
func(); // 1
```

先ほどの定義を思い出してみましょう。
「自分を囲むスコープにある変数を参照できる関数」

内側の関数が外側の関数の変数を参照できています。
ここで重要なのは、値のコピーではなく、参照ができていることです。

ですから、ここでは下記のようにvalueの変更が可能です。

```javascript:
function func() {
  var value = 1;

  function innerFunc() {
    value++;
  }
  innerFunc();
  console.log(value); // 2
}
func();
```

#クロージャの実践例
ここで基本的なクロージャの実践例として一つ、
「モジュールパターン」を紹介します。

クロージャの一つの利点として、
変数をプライベートな変数として扱う事ができるようになります。

```javascript:
var module = (function() {
  var count = 0;

  return {
    increment: function() {
      count++;
    },
    show: function() {
      console.log(count);
    }
  };

})();

module.show(); // 0

module.increment();
module.show(); // 1

console.log(count); // undefined
```

即時関数を用いてオブジェクトを生成しています。
moduleにはreturnされているオブジェクトが代入されます。

ここで重要な事として、
即時関数内のcountに関しては内側からしか参照できないという事です。
外側からアクセスしようとした場合にはもちろん「undefined」となります。

これによりプライペードな変数として扱う事が可能になります。

# 外部アカウント

技術情報のみつぶやくアカウント作成しました。JavaScriptは最新情報も追っていきます。
[Twitterはこちら]
(https://twitter.com/takeharumikami)
[Feedlyのフォローはこちら]
(http://cloud.feedly.com/#subscription%2Ffeed%2Fhttp%3A%2F%2Fqiita.com%2Ftakeharu%2Ffeed)

# おすすめの記事

JavaScriptはオブジェクト指向？プロトタイプベースのオブジェクト指向を学ぶなら。
[JavaScriptのプロトタイプからオブジェクト指向を学ぶ](http://qiita.com/takeharu/items/809114f943208aaf55b3)

JavaScriptでは関数型言語の一部の機能？実践的なJavaScriptの関数型とは。
[JavaScriptで関数型プログラミングの入門](http://qiita.com/takeharu/items/cf98d352ff574c5ac536)

関数型プログラミングを強力に後押しするライブラリ、Underscore.jsとlodashとは。
[JavaScriptで関数型プログラミングを強力に後押しするUnderscore.jsのおすすめメソッド12選(lodashもあるよ)](http://qiita.com/takeharu/items/7d4ead780710c627172e)
関数などのtemplateを作成するvimscript

単体テストなどのコードを書く際など、テスト対象関数名にtest_をつけた名前にしてお決まりのおまじないを書くことが結構多い気がしたので、vimscriptの勉強も兼ねて少し考えて見ました。
test_func_bodyの中身にテスト関数で共通で行う内容を入れておくと、便利かもしれません。


```vim:sample.vim

function! TestFunc(target_func)
        let s:test_func="test_".a:target_func
        let s:test_func_body=[
                                \"    printf(\"%s start\", __func__);",
                                \"    printf(\"%s end\", __func__);",
                                \]
                         
        let s:i=0
        call append(line(".")+s:i, s:test_func."();")
        let s:i+=1
        call append(line(".")+s:i, "void ".s:test_func."(void)")
        let s:i+=1
        call append(line(".")+s:i, "{")
        let s:i+=1
        for item in s:test_func_body
                call append(line(".")+s:i, item)
                let s:i+=1
        endfor
        call append(line(".")+s:i, "}")
        let s:i+=1
endfunction 
        
command! -nargs=1 UTFunc call TestFunc("<args>")

```

上記のサンプルの使い方は、テスト関数を作成したい場所にカーソルを移動して、そこで
UTFuncコマンドの引数にテスト対象関数を入れます。
例えば、sample関数のテスト関数を作成したい場合には、UTFunc sampleとすると
現在のカーソル位置に

```c:sample.c

void test_sample(void)
{
    printf("%s start", __func__);
    printf("%s end", __func__);
}

```
のように出力されます。
bundlerを使ってRSpecを書きつつGemを開発する

bundlerを使ってRSpecを書きつつGemを作るための準備について。

## ひな形を作成
まずはひな形を作成。

```
bundle gem my_gem
```

これで良い感じのディレクトリ構造とGemfile, gemspecが作成されて、なんだかいい具合のREADME.mdまで作成されます。
このままGithubにpushしたらREADME.mdが見えるようになるわけでなんだか流石な感じ。TODO: Write a gem descriptionの部分を編集してアップしましょう。

## 開発用にRSpecをgemspecに設定
Gem::Specification.newブロックの中でrspecを使うよう設定。

```
spec.add_development_dependency "rspec"
```

Gemfileにはgemspecと書いてあるのでGemfileを編集しないでOK。

で、gemをインストール。

```
bundle install
```


## specを書く

` mkdir spec `などでspecのディレクトリを作ってそこにspec_helperとmy_gem_specを書く。

```rb:spec/spec_helper.rb
require 'rubygems'

# カスタムマッチャを書きたかったらここに。
RSpec::Matchers.define :my_matcher do |expected|
  match do |actual|
    true
  end
end
```

```rb:spec/my_gem_spec.rb
require 'spec_helper'
require 'my_gem'

describe MyGem do
  it { should be_true }
end
```

rspecの実行は

```
bundle exec rake spec
```

これでmy_gem_spec.rbにspecを書きながらGemの開発ができます。
GCオプション備忘録


チューニングのベースになるGCオプションの備忘録。
JDK6以上が対象で、デフォルトで設定されているものも明示的に指定。

## 動作設定

```
 -server
 -d64
 -XX:+UseConcMarkSweepGC
 -XX:+UseParNewGC
 -XX:+CMSParallelRemarkEnabled
 -XX:+CMSClassUnloadingEnabled
 -XX:CMSInitiatingOccupancyFraction=70
 -XX:+DisableExplicitGC
 -XX:+UseCompressedOops
 -XX:+OptimizeStringConcat
 -XX:-UseGCOverheadLimit
```
* 64bitのサーバモードで起動。
* コンカレントGCを使用。
 * サーバモードなのでCMSIncrementalModeは指定しない方がいい。
 * G1GCでもいいが、世代別GCの方が有効な場合が多い。
* メジャーGC、マイナーGCをマルチスレッド化。
* クラスアンロードを有効。
 * 6u4からはCMSPermGenSweepingEnabledの指定は不要。
* GC発生の閾値を70%に設定。
 * 60〜70%が望ましい。
* 明示的なFullGCの使用を制御。
 * 自分が使わなくてもライブラリで使われている可能性があるため。
* 64bitのパフォーマンス向上。
 * ヒープが32G以下の場合有効。
 * むしろ32G以上はオプション指定しなくてもオーバーヘッドがある。
* 文字列結合の最適化。
 * 7ではデフォルトON。
 * SIGSEGVが発生するバグがあったが修正された。
* 時間が掛かってもGCを必ず実行する。
 * この設定はケースバイケース。

## ログ設定

```
 -XX:+PrintClassHistogram
 -XX:+HeapDumpOnOutOfMemoryError
 -XX:+PrintGCTimeStamps
 -XX:+PrintGCDateStamps
 -XX:+PrintGCDetails
 -XX:+UseGCLogFileRotation
 -XX:NumberOfGCLogFiles=10
 -XX:GCLogFileSize=5M
 -Xloggc:${GCLOG}
```

* ヒープの統計情報を出力。
* OutOfMemoryError発生時にヒープダンプを出力。
* GCの時間を日付とタイムスタンプで出力。
 * 日付も出力すると見やすい。
* New領域とOld領域のオブジェクト量の変化情報を出力。
* GCログを5Mずつ10世代でローテーション。
 * ローテーションは6u34から使用可能。

## メモリ設定

```
 -XX:MaxPermSize=384m
 -XX:PermSize=384m
 -XX:NewRatio=2
 -XX:SurvivorRatio=8
 -XX:MaxTenuringThreshold=31
 -XX:TargetSurvivorRatio=90
 -Xmn${MIN}
 -Xmx${MAX}
 -Xms${MAX}
```

* Permanent領域を384mに設定。
 * 256〜384mあれば十分。
 * Permanent領域の大きさが変わる時にFullGCが走るためPermSizeとMaxPermSizeは必ず同じ値にする。
* New領域とOld領域の比率を1:2に設定。
 * NewSizeとMaxNewSizeはXmnと同じ値に設定される。
 * コンカレントGCの場合New領域よりもOld領域を20%以上大きくすることが望ましい。
* Eden領域とFrom領域、To領域の比率を8:1:1に設定。
 * Eden領域に長くいてもらうため多めに確保。
* GCを31回行っても残っているオブジェクトをOld領域に移動。
 * Old領域にはなるべく行かせないため。
* Survivor領域からOld領域に移動する閾値を90%に設定。
 * これもOld領域にはなるべく行かせないため。
* ヒープサイズはサーバのメモリ量とアプリが必要なメモリ量で適宜設定。
 * ヒープサイズが大きいほどGC発生頻度は下がるが一度に処理する量が増える。
 * FullGCが発生したらLiveDataSizeの3〜4倍を目安にMAXを設定する。
Google App Engine for Java(GAE4J) で、datanucleusのエラーが出た時の対策

Google App Engine for Javaでデータベース系、datanucleusのエラーが出た時は、SDKをアップデートし、Eclipseで新しいSDKを設定し直すと、治るかもしれません。
私は、「org.datanucleus.store.types.TypeManager loadJavaTypes: User-defined type mapping class "org.datanucleus.store.types.sco.simple.List" was not found.」というエラーが出た時にこれで治りました。


SDKのアップデートは２つ、プラグインのアップデートと、SDKのアップデートをします。
プラグインのアップデートはEclipseのHelp→Check for Updatesからできます。
SDKのアップデートは環境設定（WindowsやLinuxだと、window→preferenceだったかな？）→Google →App Engineでダウンロードボタンを押すと、ブラウザが立ち上がってダウンロードサイトが開きますので、そこからダウンロードして設定を行います。

あとはプロジェクトをリビルドすると、datanucleus系のjarファイルがアップデートされ、エラーが解消されるかもしれません。

お試しあれ。
Eclipse plugin to edit shell script file

#Install
- Update site link: http://sourceforge.net/projects/shelled/files/shelled/update/


#Reference
- [ShellEd - Eclipse Shell Script Editor](http://sourceforge.net/apps/trac/shelled/)
- [Documentation/InstallGuide – ShellEd - Eclipse Shell Script Editor](http://sourceforge.net/apps/trac/shelled/wiki/Documentation/InstallGuide)
「数を作る」をSchemeで(横へな9参考)

http://qiita.com/Nabetani/items/7c46e8409c456e8fabd1
http://nabetani.sakura.ne.jp/hena/ord9nummake/
「数を作る」をSchemeでやってみました。

先にすべての組み合わせを作ってから、指定番目を取り出す方法です。

いつもの通りErlangで始めたのですが、あまり関数脳になっていないためか自分のコードの書き方に納得がいかず、Schemeに立ち戻って書いてみました。

が、やはりコードに納得いっていません。上手い人が書いたらもっとスマートでエレガントになるはず。あと関数名にプログラミング能力の限界が見えてます。

実行環境はMIT/GNU Schemeです。他のSchemeでは文字列操作関数とかformat関数の書式指定子とかが違うと思います。

正直死にそうです。括弧が、括弧が襲ってくる～ (@_@)

```scm
;; 与えられた整数リストから4つを使った全組み合わせを返す
(define (combi4 unselected selected)
  (define (delete-one x ls) ;; xを1つだけ削除したリストを返す
    (cond
     ((null? ls) '())
     ((= x (car ls)) (cdr ls))
     (else (cons (car ls) (delete-one x (cdr ls))))))
  (define (if6append9 x f) ;; xが6以外ならf(x)を、6ならf(6)とf(9)を連結して返す
    (if (= x 6)
        (append (f 6) (f 9))
        (f x)))
  (define (nextlevel x results) ;; 数を1つ組み合わせて次の桁へ進む
    (append
     (if6append9
      x
      (lambda (y)
        (combi4 (delete-one x unselected)
                (cons y selected)))) results))
  (if (= 4 (length selected))
      (list selected)
      (fold nextlevel '() unselected)))

;; リストの全組み合わせからn番目の整数を返す
(define (solve2 n ls)
  (define (list->num ls) ;; [1,1,0,9] -> 1109
    (fold (lambda (x s) (+ x (* s 10))) 0 ls))
  (define (take-n x over ls) ;; n番目があればその値、なければoverに指定された値を返す
    (if (> x (length ls))
        over
        (car (drop ls (- x 1)))))
  (take-n n '- (filter
             (lambda (x) (>= x 1000))
             (sort (delete-duplicates
                    (map list->num 
                         (combi4 ls '()))) <))))

;; 文字列を与えると問題を解く
(define (solve s)
  (define (char->number c)
    (- (char->integer c) (char->integer #\0)))
  (define (colon-idx)
    (string-search-forward ":" s))
  (define (get-n)
    (string->number (string-head s (colon-idx))))
  (define (get-numlist)
    (map
     char->number
     (string->list
      (substring s (+ 1 (colon-idx)) (string-length s)))))
  (solve2 (get-n) (get-numlist)))

;; テスト
(define (test data expected)
  (define (eq a b) ;; 数値または-を比較する
    (if (symbol? a) (eq? a b) (= a b)))
  (format #t "~A: ~A -> ~A~%"
          (if (eq expected (solve data)) "ok" "ng")
          data expected))

(define (tests)
  (begin
    (test "13:01167" 1109)
    (test "1:1234" 1234)
    (test "13:01167" 1109)
    (test "1:1234" 1234)
    (test "2:1234" 1243)
    (test "7:1234" 2134)
    (test "24:1234" 4321)
    (test "25:1234" '-)
    (test "2:1116" 1119)
    (test "2:0116" 1019)
    (test "3:6666" 6696)
    (test "16:6666" 9999)
    (test "10:01267" 1097)
    (test "14:111167" 1671)
    (test "1:1111" 1111)
    (test "2:1111" '-)
    (test "1:666633" 3366)
    (test "72:666611" 9999)
    (test "73:666622" '-)
    (test "1:666600" 6006)
    (test "52:666600" 9999)
    (test "53:666600" '-)
    (test "25:06688" 8086)
    (test "93:02566" 6502)
    (test "11:06688" 6809)
    (test "169:01268" 9801)
    (test "174:01268" 9821)
    (test "66:012288" 8201)))

(tests)
```

結果の一部:

<pre>
ok: 1:1234 -> 1234
ok: 2:1234 -> 1243
ok: 7:1234 -> 2134
ok: 24:1234 -> 4321
...
</pre>
Capistrano のデフォルトの挙動が見たい

ソース ([deploy.rb](https://github.com/capistrano/capistrano/blob/master/lib/capistrano/recipes/deploy.rb)) 読め。





……ってことじゃないです。

とりあえず何もないディレクトリでコレを打てば、実際にどんなコマンドが走るか分かるんじゃないでしょうか。

```bash
capify .
cap -n deploy
```

-n は dry-run のオプションです。
Open Spendingに使うアイコンをイラストレーターで作るときのポイント

OpenSpendingのアイコンを
Illustratorで作る場合（Illustrator CCで確認済み）

Illustratorでアイコンを作ったときに何度か失敗したので、
手順とポイント共有したいと思います。

![snow.jpg](https://qiita-image-store.s3.amazonaws.com/0/24253/54677cfd-48a3-4e53-46a0-19ce54e5496b.jpeg)

1.背景の丸を作る（ココは元々あるアイコンを流用したほうがラク）
	#b2b2b2
	100px x 100px

2.イラストを描く
	#000000
	丸の枠をはみ出さないように。
	はみ出す場合は、パスをカットする。

![snow02.jpg](https://qiita-image-store.s3.amazonaws.com/0/24253/7c53a27c-9e94-3080-243b-2e032b7825ab.jpeg)

	※注意：
	　重なったオブジェクトは、全てパスで結合しておくこと。
	　オブジェクトを重ねたままだったり、
	　背景と同じ色のオブジェクトで「抜いた風」にしてもダメ。
	　ちゃんとパスファインダーで抜いておくこと。

	　↑　ここにすごくハマってしまいました。
![2013-09-03_122040.jpg](https://qiita-image-store.s3.amazonaws.com/0/24253/d3284476-67a9-758e-f4ce-93674f78c8f0.jpeg)


3.書き出す
	「SVGプロファイル」SVG1.1
	「文字」SVG
	「サブセット」なし

![svg書き出し.jpg](https://qiita-image-store.s3.amazonaws.com/0/24253/459396e4-e431-386f-3969-17224c42c847.jpeg)

間違いや他のやり方がありましたら、
ツッコミお願いします。
gitでリモートブランチをすべて取得するシェルスクリプト

備忘録代わりに。

`git clone XXX`としたあとでリモートブランチのすべてのブランチを取得するスクリプト。

```bash
#!/bin/bash
for remote_branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master`; do
    remote_name="$(echo -n "$remote_branch" | cut -d/ -f2)"
    branch_name="$(echo -n "$remote_branch" | cut -d/ -f3)"
    git checkout -b $branch_name $remote_name/$branch_name
done
git checkout master
```