OmniAICreator/Qiita-1.07M huggingface dataset:
Sinatraがデフォルトでは外部から繋がらなくなってたよ


ローカルで動かしていたSinatraをさくらvpsで動かそうと思ったら、アクセスしても繋がらない問題に出くわしました(；´д｀)
検索しても意外と情報が少なかったのでメモ残しときます。


##症状
Sinatraを使ったコードを実行すると、デフォルトだと4567番ポートで立ち上がるのですが、アクセスしても繋がらない！！

```bash:
$ bundle exec ruby hoge.rb
[2013-05-17 23:58:37] INFO  WEBrick 1.3.1
[2013-05-17 23:58:37] INFO  ruby 1.9.3 (2013-02-06) [x86_64-linux]
== Sinatra/1.4.2 has taken the stage on 4567 for development with backup from WEBrick
[2013-05-17 23:58:37] INFO  WEBrick::HTTPServer#start: pid=10077 port=4567
```

初めはiptablesの設定が悪いのかとか、別のところで何かブロックされてるんじゃないかとか悩んでいたのですが、iptablesの設定をオフにしても繋がらなかったので原因は別にある事が判明。netstatをしたら、localhostからのアクセスしかLISTENしていない事が分かりました。

```bash:
$ netstat -an
# 必要部分だけ抽出
tcp        0      0 127.0.0.1:4567              0.0.0.0:*                   LISTEN  
```
という事は、SinatraのListenAddressの設定がおかしい！！

##原因
以前Sinatraを利用した時は、特に何もしなくても外部から繋がっていたのでおかしいなと思いながら調べていると以下の記述を発見！

>**:bind - server hostname or IP address**
String specifying the hostname or IP address of the interface to listen on when the :run setting is enabled. The default value in the development environment is 'localhost' which means the server is only available from the local machine. In other environments the default is '0.0.0.0', which causes the server to listen on all available interfaces.

引用元：[Sinatra: Configuring Settings](http://www.sinatrarb.com/configuration.html)

**なんとdevelopment環境だと、localhostからのアクセスしか受け付けないのがデフォルトらしい！！**


でも今まではそんな事なかったし、日本語訳の資料にはこんな記述なかったので、最近の変更なのかなーとSinatraの変更履歴を見てみたところ

>= 1.4.0 / 2013-03-15
~ 省略 ~
* Default to only serving localhost in development mode. (Postmodern)

引用元：[sinatra/CHANGES at 1.4.2 · sinatra/sinatra · GitHub](https://github.com/sinatra/sinatra/blob/1.4.2/CHANGES)


あったよー！ver.1.4.0からこのような仕様になったんですね。3月の変更だから結構最近。


##対応方法
ListenAddressを設定するオプションがあるので、そちらを使えばOKです。(0.0.0.0 は全てのアドレスを指す)

###実行オプションを使う
```bash:
$ bundle exec ruby hoge.rb -o 0.0.0.0
```

###rubyのコードの中で設定する
```ruby:
set :bind, '0.0.0.0'
```

## environment を変えてもいける
ドキュメントに書かれている通り、ローカルからしか繋がらないのは 'development' の時だけなので、environmentに、'production' や 'test' を設定した時は何もしなくても外部から繋がります。

###実行オプションを使う
```bash:
$ bundle exec ruby hoge.rb -e production
```

###rubyのコードの中で設定する
```ruby:
set :environment, :production
```
real-time priority の確認

ps -eo pid,comm,rtprio,pri,priority

|項目     | 優先度                       |動的優先度|静的優先度|
|:-------:|:----------------------------:|:--------:|:--------:|
|rtprio   |	数字が大きい方が優先度が高い | 未表示   |   1～ 99 |
|pri 	  |	数字が大きい方が優先度が高い |	0～39   |  41～139 | 
|priority |	数字が小さい方が優先度が高い |	0～39   |-100～-2  |

|cmd |値      |優先度高|優先度低|
|:--:|:------:|:------:|:------:|
|ps  |rtprio  |    99  |     1  |
|ps  |pri     |   139  |     0  |
|ps  |priority|  -100  |    39  |
|top |pr      |RT(-99) |    39  |
|nice|        |   -20  |    19  |

参考：http://www.mazn.net/blog/2010/09/18/311.html
第11回オフラインリアルタイムどう書くの参考問題をRubyで解く

問題はこちらのリンクから。
http://qiita.com/items/c206fbc645c255cb7de6
ベタな方法しか思いつかなかった・・。

```ruby
def solve(q)
  nums = q.chars.map{|_|(('0'..'9').to_a+('a'..'z').to_a).index(_)}
  max_seq = 1
  nums.each_with_index{|num, i|
    nums[i+1..-1].each{|n|
      seq = 1
      nd = n - num
      nx = n
      while nums.include?(nx)
        seq += 1
        nx += nd
      end
      max_seq = seq if seq > max_seq
    }
  }
  max_seq
end

DATA.readlines.each do |line|
  no,q,a,_ = line.split(/\s+/)
  ans = solve(q)
  print no + "\t" + ans.to_s
  puts ans == a.to_i ? ' o' : ' x'
end
__END__
0	12345abcz	5	12345
1	012abku	4	0aku
2	01245689cdeghik	6	048cgk
```
MacVim+clang-complete(tokoromさん版)の組み合わせでは.mファイルが開けない？

MacVim + clang-complete([tokoromさん版](https://github.com/tokorom/clang_complete))でiOSアプリ開発目的でObjective-Cの自動補完を行おうとしたら、MacVimから.mファイルを開くと開けずに動作が止まってしまったのでメモ

# 開けなかった時の操作手順

1. DockからMacVimを起動
1. `Unite file`から対象フォルダまで移動
1. .mファイルを選択して`Return`キーでファイルを開く

clang-completeを無効にしたら普通に開ける。なんで？？？

# 解決

一日以上悩んだ結果、条件が組み合わさる事で動かなかったと推測

* clang-complete([tokoromさん版](https://github.com/tokorom/clang_complete))はカレントディレクトリ以下のフォルダを自動的にインクルードの設定をしてくれる
* MacVimはDockやLaunchPadから起動するとカレントディレクトリが`/`になる

つまり`/`ディレクトリ以下のすべてのディレクトリに対して設定しようとしていたわけか。そりゃあ動かないわけですね。

つまりカレントディレクトリを変えれば良い訳で、

* Finderからダブルクリックでファイルを開く(Unite使いたいから自分はこれで運用)
* プラグインを入れてカレントディレクトリを変更する(未検証)

他にもいくつか対応方法はあるりそうだけど、自分は取り合えず満足です。

以上、情けない結末でした。
UTCからローカル時間へのお手軽な変換

```python
import datetime
import calendar
import time

# utctime -> localtime
utcnow = datetime.datetime.utcnow()
local = datetime.datetime.fromtimestamp(calendar.timegm(utcnow.timetuple()))

# localtime -> utctime
localnow = datetime.datetime.now()
utc = datetime.datetime.urcfromtimestamp(time.mktime(localnow.timetuple()))
```

ちょっと試してみただけなので保証はできません。
タイムゾーンをちゃんとを扱うならpython-dateutilを入れるのがいいと思う。
MariaDBをCentOSに導入してみた

環境：CentOS 6.3
MySQL5.1 → MariaDB5.5の移管。

## MySQLアンインストール

もしかしたら必要ないかもしれませんが一応アンインストール。

```
/etc/init.d/mysqld stop
yum remove mysql
```

データベースの内容(/var/lib/mysqlの中)は上記作業では消えませんでしたが、しっかりとバックアップは取っておくこと。

## MariaDBリポジトリファイル設定

まず下記URLからリポジトリファイルの内容を取得します。

https://downloads.mariadb.org/mariadb/repositories/

「CentOS」→「CentOS 6 (64 bit)」→「5.5」を選択。リポジトリファイルの内容が表示されるので、コピーして「/etc/yum.repos.d/mariadb.repo」に記入します。

```
vi /etc/yum.repos.d/mariadb.repo
```

``` /etc/yum.repos.d/mariadb.repo
# MariaDB 5.5 CentOS repository list - created 2013-04-27 03:49 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/5.5/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
```
## MariaDBインストール

・インストール

```
yum install MariaDB-devel MariaDB-client MariaDB-server
```

・MariaDB起動

```
/etc/init.d/mysql start
```

・MariaDBに接続

```
mysql -u root -p
Enter password:

MariaDB [(none)]>
```

パスワードを入力してログイン後、MariaDBというコマンドラインが帰ってきたら成功です。

"[(none)]"には選択されたテーブル名が入ります。

## 動作確認
WordPress3.5.1とphpMyAdmin3.5.2が問題なく動作するのを確認しました。
AndroidStudio日本語化

英語のままでも特に問題は無いのだけど、調べてみたら日本語化が可能との事だったのでメモ

以下、参考にさせて頂きました。
http://thjap.org/android/android-software/android-studio/1395.html

githubにて公開されている[IDEA_resource_jp](https://github.com/morizo999/IDEA_resources_jp)よりresource_jp.jarを取得して
AndroidStudio/lib配下へ配置するだけ。

配置が完了したらAndroidStudioを再起動するだけ。
git はシンボリックリンクをコミット出来る


rbenv で気づいた衝撃の事実・・・git はシンボリックリンクをコミット出来る。

## 例

普通のファイルとそのファイルを指すシンボリックリンク、さらにリポジトリ外を指すシンボリックリンクを作成してみます。

```console
$ mkdir hoge
$ cd hoge
$ touch aa
$ ln -s aa bb
$ touch ../zz
$ ln -s ../zz cc
```

ちゃんと出来ています。

```console
$ ll
-rw-r--r-- 1 ng wheel 0 May 17 20:11 aa
lrwxrwxrwx 1 ng wheel 2 May 17 20:11 bb -> aa
lrwxrwxrwx 1 ng wheel 5 May 17 20:11 cc -> ../zz
```

リポジトリを作ります。

```console
$ git init
Initialized empty Git repository in /tmp/hoge/.git/
$ git add .
$ git commit -m first
 2 files changed, 2 insertions(+), 0 deletions(-)
 create mode 100644 aa
 create mode 120000 bb
 create mode 120000 cc
```

おっと削除してしまった。

```console
$ rm -f *
```

でも大丈夫。

```console
$ git checkout -- \*
```

元通りです。

```console
$ ll
-rw-r--r-- 1 ng wheel 0 May 17 20:13 aa
lrwxrwxrwx 1 ng wheel 2 May 17 20:13 bb -> aa
lrwxrwxrwx 1 ng wheel 5 May 17 20:13 cc -> ../zz
```

もちろん clone してもシンボリックリンクは復元されます。


```
$ mkdir ../fuga
$ cd ../fuga
$ git clone ../hoge/.git .
Initialized empty Git repository in /tmp/fuga/.git/
$ ll
total 0
-rw-r--r-- 1 ng wheel 0 May 17 20:14 aa
lrwxrwxrwx 1 ng wheel 2 May 17 20:14 bb -> aa
lrwxrwxrwx 1 ng wheel 5 May 17 20:14 cc -> ../zz
```

このリポジトリを Windows(msysgit) でチェックアウトすると・・・

```bat
> git clone git@remoteserver:/tmp/hoge/.git
Cloning into 'hoge'...
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 5 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (5/5), done.

> type hoge\bb
aa

> type hoge\cc
../zz
```

リンク先が書かれたただのファイルになりました。
.gitattributesを作る際の参考情報を出力するコマンド

途中で入ったプロジェクトなんで、どんなファイルがあるかわかりゃしない。

プロジェクトのソースはGitで管理されているけど、.gitattributesファイルが無いので、CRLFが入り乱れている。

.gitattributesを置くことでせめてテキストファイルの改行くらいは何とかしたい。

そんなときに打つべきコマンド。

```bash
find . -type f | grep -v ".git/" | xargs -Ixx file -i -N xx | sed -e 's/.\+\([\/\.][^\/^\.]\+\+\):/\1/g' |sort -u > .gitattributes
```

これで一応、すべてのファイルの種類が.gitattributesに格納される。

もちろんそのままではだめなので、これを手で修正する必要があるが、結構助かると思う。

ちなみに、全ファイルをfileコマンドで調査するのでちょっと重い。。。

.javaとか画像とかのファイルのタイプが明らかなものは削ってもいいんじゃないかなぁ。
オフラインどう書く第11回参考問題解答例(Ruby)

全てのテストケースでokが出るまで90分くらい、コードの整理で30分くらいだったと思う。

```ruby
def get_seq(src)
    ary = ("0".."9").to_a + ("a".."z").to_a
    seq = []
    src.chars{|_| seq << ary.index(_)}
    seq 
end

def get_size(seq, num, diff)
    ary = [num]
    while seq.include?(ary[-1] + diff)
        ary << (ary[-1] + diff)
    end 
    ary.size
end

def solve(src)
    seq = get_seq(src)
    diff = seq.combination(2).map{|x, y| (x.to_i - y.to_i).abs}.uniq
    size = [1] 
    seq.each do |s| 
        diff.each do |d| 
            size << get_size(seq, s, d)
        end 
    end 
    size.max
end

DATA.each do |line|
    no, src, expected = line.split(/\s+/)
    actual = solve(src)
    puts "#{no} : " + (actual == expected.to_i ? "ok" : "***NG***")
end

__END__
0  12345abcz 5 
1  012abku 4 
2  01245689cdeghik 6
```
CentOS5 での tmux のインストール

# libevent のインストール

http://libevent.org/

2.x 系の安定版を

# tmux のインストール

http://tmux.sourceforge.net/

最新の 1.8 系を入れました

# ldconfig

実行すると

    tmux: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory

と怒られるので

`/etc/ld.so.conf.d/libevent.conf` に

    /usr/local/lib

を追加します

そして

    sudo /sbin/ldconfig

を実行します

これで普通に動くと思います

tmux の使い方はこちらも参考になります

[tmuxのすすめ | catatsuyのBlog](http://blog.catatsuy.org/a/243)
f2pyを使ってfortranでpythonのモジュールを書く

python書きやすいけど速度がね〜 → ボトルネックをfortranのモジュール化
！！！速い！！！

Fortranの練習も兼ねて前書いた素数表示のプログラムをモジュール化してみる。

#環境
f2py（scipyに付属）
gfortran4.7.2

#スクリプト
モジュール化したいサブルーチンを記述したファイルを用意する。
サブルーチンの引数はCf2pyでinを宣言する。
サブルーチンの戻り値（つまりpython側で受け取る戻り値）はCf2pyでoutを宣言する。
Cf2pyの宣言は行頭から、スクリプト本体はスペース6個開けてから書かないとコンパイルエラーになる。どうやらCf2pyよりもインデント的に後ろに書かないといけないっぽい（めんどくさい！！）

```Fortran:primepy.f90
      subroutine prime_number(max_num, ret)
         implicit none
         integer max_num
         integer ret(max_num)
         integer i, j, list(max_num)
Cf2py intent(in) max_num
Cf2py intent(out) ret
         
         !lを設定
         do i=1, max_num, 1
            list(i) = i
         enddo
         list(1) = 0

         !素数を設定
         do i=1, max_num, 1
            if (.not. list(i) == 0) then
               do j = i*2, max_num, i
                  list(j) = 0
               end do
            endif
         enddo

         !素数リストを返す
         do i=1, max_num, 1
            ret(i) = list(i)
         enddo
      end subroutine prime_number
```

#コンパイル
`f2py -c --fcompiler=gfortran -m prime primepy.f90`
-cでコンパイル
--fcompilerでコンパイラ指定
-mの後が出力ファイル
最後にFortranのプログラムファイル
あとは-hでヘルプ確認

prime.soファイルができてれば成功。

#実行
pythonのインタプリタで、

```
>>> import prime
>>> a = prime.prime_number(100)
>>> a
array([ 0,  2,  3,  0,  5,  0,  7,  0,  0,  0, 11,  0, 13,  0,  0,  0, 17,
        0, 19,  0,  0,  0, 23,  0,  0,  0,  0,  0, 29,  0, 31,  0,  0,  0,
        0,  0, 37,  0,  0,  0, 41,  0, 43,  0,  0,  0, 47,  0,  0,  0,  0,
        0, 53,  0,  0,  0,  0,  0, 59,  0, 61,  0,  0,  0,  0,  0, 67,  0,
        0,  0, 71,  0, 73,  0,  0,  0,  0,  0, 79,  0,  0,  0, 83,  0,  0,
        0,  0,  0, 89,  0,  0,  0,  0,  0,  0,  0, 97,  0,  0,  0], dtype=int32)
```
ﾔｯﾀｰ

0以外だけを返す簡単なやり方が思いつかなかったのでこれはpython側で`a.take(a.nonzero()[0])`をする。

#結論
ボトルネックも解消できてハッピー
fortranでわからなかったらpython側で処理しろ！！
pythonのリスト最高！！！
PHP+NetBeans+IIS+XDebug

IISや、PHPやNetBeansの環境はセットアップ済み。唯一デバッグするときにハマった点

## 必要なもの

* [XDebug](http://xdebug.org/download.php)

php.iniの設定

```bash
[PHP_XDEBUG-2.2.2-5.3-VC9-NTS]
zend_extension = "C:\Program Files (x86)\PHP\v5.3\ext\php_xdebug-2.2.2-5.3-vc9-nts.dll"
;extension=php_xdebug-2.2.2-5.3-vc9-nts.dll
xdebug.remote_enable = on
xdebug.remote_mode = req
xdebug.remote_host = localhost
xdebug.remote_port = 9000
xdebug.remote_handler = dbgp
```
**extensionにもxdebugを設定していると動きません。**
Backbone+Rails+kaminari

https://github.com/wyuenho/backbone-pageable

のプラグインを利用してページングを実装する例

通常は、

```js:JSON
[{}, {}, ...]
```
のような構造のJSONを返すところを、

```js:JSON
[{"total_entries": 100}, [{}, {}, ...]]
```

のように、ページングのための情報と、実際のインスタンス列の配列を返すと、プラグインが自動的に解釈してくれる

この構造をKaminariから作成するためには

```ruby
format.json { render :json => @entries }
```

となっているところを

```ruby
format.json { render :json => [{ :total_entries => @entries.total_count }, @entries] }
```

にすればよい
mongodbでapacheのアクセスログをISODateに変換する関数


apacheのリクエスト時間のデフォルトの日付フォーマットをISODateに渡せるように変換スクリプトを書いてみた

```shell:apacheDate2ISODate.js
    apacheDate2ISODate = function (apacheDate)
    {

        rawStr = apacheDate.replace(/^(\[)/, "").replace(/\]/, "")
        dateArr = rawStr.split(" ");

        dateSeparate  = dateArr[0].split('/')
        dateSeparate2 = dateSeparate[2].split(':')

        day   = dateSeparate[0]
        month = dateSeparate[1]
        year  = dateSeparate2[0]
        hours = dateSeparate2[1]
        minute = dateSeparate2[2]
        second = dateSeparate2[3]
        date   = dateSeparate2[1] + dateSeparate2[2] + dateSeparate2[3]

        DateString = month + " " + day + " " + year + " " + hours + ":" + minute + ":" + second
        convertDate = new Date(DateString)

        date     = ( convertDate.getDate()   < 10 )  ? '0' + convertDate.getDate()    : convertDate.getDate()
        month    = ( convertDate.getMonth()   < 10 ) ? '0' + convertDate.getMonth()   : convertDate.getMonth()
        hours    = ( convertDate.getHours()   < 10 ) ? '0' + convertDate.getHours()   : convertDate.getHours()
        minute   = ( convertDate.getMinutes() < 10 ) ? '0' + convertDate.getMinutes() : convertDate.getMinutes()
        second   = ( convertDate.getSeconds() < 10 ) ? '0' + convertDate.getSeconds() : convertDate.getSeconds()

        dateStr = convertDate.getFullYear() + '-' + month + '-' + date + ' ' + hours + ':' + minute + ':' + second

        return ISODate(dateStr)
    }
```

## 使い方

```
apacheDate2ISODate(apacheのリクエスト時間)
```

多分合ってると思う。。。
psqlでパスワードを聞かれないバッチを作成するために

## set PASSWORD=hoge を記述する。

psqlはPASSWORDという変数が設定されていると、そのパスワードを取りに行くので、psql実行文の前に上記記述を書けばおｋ

例）
set PASSWORD=hoge
psql -U hoge -f execute_sql.sql
テキストファイルをもとにコンパイル時にenumを定義するマクロ

# ソース

```py
# pythonじゃないけど、pythonしか似たような言語ないしなー。
import Boo.Lang.Compiler.Ast
import System.IO

macro txtenum( en as ReferenceExpression, path as StringLiteralExpression ):
	# enum定義構文木ノード
	ed = EnumDefinition( Name: en.Name )
	# テキストファイルを読んで、各行を enum の要素にする。
	using f = StreamReader( path.Value ):
		while f.Peek() > 0:
			s = f.ReadLine().Trim()
			ed.Members.Add( EnumMember( Name:s) ) if len(s) > 0
		# enum定義ノードが完成したら、このマクロの展開結果として返す。
		yield ed
```

## 他に必要な物

テキトーに次のようなテキストファイル Hoge.txt を用意。

a
b
c
d

# 使い方

プログラム中に次のコードを入れると Hoge という、a,b,c,d を含んだenumが使える。

```py
# だから、python じゃないんだけどなー
txtenum Hoge, "Hoge.txt"
```

次のようにコードに書いたのと同じ。

```py
enum Hoge:
	a
	b
	c
	d
```
QNAP NAS storage のディスク残量をZabbixから監視するとか

はぁ。自分のところに書いてからQiitaに書いたほうが良いというのに気づいた..

http://dmiyakawa.blogspot.jp/2013/05/qnap-nas-storage-zabbix.html

より重要かもしれないのは、要はこの程度のスクリプトがかければお手軽に何でも監視出来る、ということなんですよね。まさに「ビッグデータ」の監視ならともかく、内輪サービスとかで自分で監視ページを作る必要はあんまりない感じです。複数サービスの集約にも便利でしょう。
Seleniumで、メール受信のテストをする方法

ウェブサービスで、会員登録やらパスワード再設定やらで確認用メールを飛ばして一時URLをクリックして処理が完了する機能って、よくありますよね？

その機能を自動テストしたいとき、どうやってますか？

実はSeleniumとGmailの「簡易HTMLモード」を使えば簡単にできるんです。

* Gmailでテスト用のアカウントを作っておく(例: example@gmail.com)
* Seleniumで、当該ウェブサービスに会員登録する
* Gmailに会員登録の一時URLが入ったメールが送られてくる
* Seleniumで、Gmailを開いてその一時URLをクリックする

GmailはAjaxサイトなので、自動操作するのは一見難しそうですが、下記のようにすればできます。

## Gmailを自動操作する方法

まず、Gmailにログインする直前にログアウト用URLを叩いておきます。

|コマンド|対象|値|
|---|---|---|
|open|http://mail.google.com/mail/?logout&hl=ja|

こうすれば、必ずログインフォームが現れてくれます。

次に、Seleniumで普通に自動ログインします。

|コマンド|対象|値|
|---|---|---|
|type|Email|example@gmail.com|
|type|Passwd|himitsu|
|clickAndWait|singIn||

そしてここがミソですが、強制的に「簡易HTMLモード」にしてやります。

|コマンド|対象|値|
|---|---|---|
|open|http://mail.google.com/mail/?ui=html&zy=e|

これで、もうあとは思いのままにGmailを操作することができます。

Happy Testing!
昔作ったアプリのローカライズが有効にならない

#発端
他の人が昔作ったアプリのアップデートを頼まれたのでホイホイと引き受けたものの、なぜか日本語のローカライズが有効にならないので調査開始。

#原因
フォルダ名が変わってた。私はその頃を知らないのだけど、
以前は、

```
English.lproj
Japanese.lproj
```

など、言語名を省略しないフォルダ名だったらしい（？）が、
現在は、

```
en.lproj
ja.lproj
```

など、省略名（[ISO 639](http://ja.wikipedia.org/wiki/ISO_639)）がフォルダ名になっている。
名前はXcodeが勝手に付けてくるので気にしなくても大丈夫。

#修正
Xcode上でフォルダ名を変える方法が分からなかったので、

1. Xcode上で、旧ファイルを`Delete(Remove References)`。
1. Xcode上で、新規作成して`Localize`。
1. Finder上で、2.で作成されたファイルをフォルダごと削除。（en.lproj/など）
1. Finder上で、旧フォルダをリネーム。（English.lproj/ → en.lproj/など）

という手順で修正。
iptables で 許可IPを変更する

# 変更する番号を確認
iptables -nL --line-numbers 

# 変更する場合
iptables -R INPUT [変更する番号] -s [変更するIP] -p tcp --dport 22 -j ACCEPT

# 削除する場合
iptables -D INPUT [削除する番号]

# おまけ
iptables -A INPUT  -p [tcp|udp] -s [送信元IP] --sport [送信元ポート] -d [送信先IP] --dport [送信先ポート] -j [ACCEPT|DROP|REJECT]

#某国を拒否する
```bash:iptables.sh
#!/bin/sh

APNIC_URL='http://ftp.apnic.net/stats/apnic/delegated-apnic-latest'

#------------------------------------------
# APNIC から CN だけ抽出し無条件でDROP
#------------------------------------------
function drop_cn_iptables(){

    echo "データー取得中: ${APNIC_URL}"
    if curl -s ${APNIC_URL} > /tmp/delegated-apnic-latest
    then
        echo "iptables 設定中: しばらく時間がかかります"
        iptables -D INPUT -j DROP-CHINA > /dev/null 2>&1
        iptables -F DROP-CHINA          > /dev/null 2>&1
        iptables -X DROP-CHINA          > /dev/null 2>&1
        iptables -N DROP-CHINA
        COUNT=0
        for i in $(awk -F'|' '$2~/CN/&&$3~/ipv4/{print $4","$5}' /tmp/delegated-apnic-latest)
        do
            IP_LIST_1=$(echo $i | cut -d',' -f1)
            IP_LIST_2=$(echo $i | cut -d',' -f2)
            IP_CN_LIST=$(cider_calc $IP_LIST_1 $IP_LIST_2)

            if [ ${IP_CN_LIST} != 'null' ];then
                iptables -A DROP-CHINA -s ${IP_CN_LIST} -j DROP
                echo_erase "iptables -A DROP-CHINA -s ${IP_CN_LIST} -j DROP"
            fi

        done
        iptables -A DROP-CHINA -j RETURN
        iptables -I INPUT 1    -j DROP-CHINA
        iptables -nvxL
        rm -rf /tmp/delegated-apnic-latest
    else
        echo "データー取得失敗:${APNIC_URL}"
        exit 1
    fi
}

#------------------------------------------
# iptables の初期化
#------------------------------------------
function init_cn_iptables(){

    iptables -D INPUT -j DROP-CHINA
    iptables -F DROP-CHINA
    iptables -X DROP-CHINA
    iptables -nvxL
    echo -e '\n==================================================\n'
    echo -e '\n120秒間反応がなかったためiptables を初期化しました\n'
}

#------------------------------------------
# 保有IP数よりCIDERを算出
#------------------------------------------
function cider_calc(){

    local IP_ADDRESS_NUM=4294967296
    local IP_ADDRESS=$1
    local IP_NUM=$2
    local IP_CIDER='null'

    for i in $(seq 1 32)
    do
        IP_ADDRESS_NUM=$((${IP_ADDRESS_NUM}/2))
        if [ $((IP_ADDRESS_NUM/IP_NUM)) -eq 1 -a $((IP_ADDRESS_NUM%IP_NUM)) -eq 0 ]; then
            IP_CIDER=$i
            break
        fi
    done

    if [ $IP_CIDER = 'null' ];then
        echo 'null'
    else
        echo "$IP_ADDRESS/$IP_CIDER"
    fi
}

#------------------------------------------
# 標準出力を制御する関数
#------------------------------------------
function echo_erase(){

    local STRING="$1"
    echo -n ${STRING}
    for i in $(seq 0 ${#STRING})
    do
        echo -n $'\b'
    done
}

#------------------------------------------
# iptables の 実行
#------------------------------------------
drop_cn_iptables
echo -e '\n==================================================\n'
echo -e "### 設定完了 ###\n"
echo -e '現在の設定で問題がなければ120秒以内に「 Ctrl + c 」で抜けてセーブして下さい。\n'
sleep 120
init_cn_iptables
```
Nonzero winding number ruleとEven-odd ruleを使ったパスの切り抜き


iOSのCoreGraphicsを使ったパスの切り抜きを、Nonzero winding number ruleとEven-odd ruleとで試してみた。

```Objective-C
CGContextRef ctx = UIGraphicsGetCurrentContext();
    
CGContextSetRGBFillColor(ctx, 1, 0, 0, 1);
    
// Even-odd ruleで切り抜く
    
CGContextBeginPath(ctx);
CGContextAddRect(ctx, CGRectMake(50, 50, 100, 100));
CGContextAddRect(ctx, CGRectMake(70, 70, 50, 50));
CGContextEOFillPath(ctx); //**
    
// Nonzero winding number ruleで切り抜く
    
CGContextBeginPath(ctx);
// 外側を右回りで描く
CGContextMoveToPoint(ctx, 50, 200);
CGContextAddLineToPoint(ctx, 150, 200);
CGContextAddLineToPoint(ctx, 150, 300);
CGContextAddLineToPoint(ctx, 50, 300);
CGContextClosePath(ctx);

// 内側を左回りで描くと切り抜ける
CGContextMoveToPoint(ctx, 70, 220);
CGContextAddLineToPoint(ctx, 70, 270);
CGContextAddLineToPoint(ctx, 120, 270);
CGContextAddLineToPoint(ctx, 120, 220);
CGContextClosePath(ctx); //**

// 内側を右回りで描いても、どちらも内側が描画されるので切り抜けない
/*
CGContextMoveToPoint(ctx, 70, 220);
CGContextAddLineToPoint(ctx, 120, 220);
CGContextAddLineToPoint(ctx, 120, 270);
CGContextAddLineToPoint(ctx, 70, 270);
CGContextClosePath(ctx);
 */
    
CGContextFillPath(ctx);
```
第11回オフラインリアルタイムどう書くの参考問題 感想

関数型をつきつめると

1. 数列を元に、すべての部分数列を並べ上げ、
2. 等差数列だけを残してフィルタし、
3. 最長のものを出力する

という解法になるんだと思う。
自分の解答(2) は、上記の 1. と 2. が分離されてないので、まだまだ。

ちなみにすべての部分数列を並べ上げるコードをhaskellで書くなら

```hs
subseq        :: [Int] -> [[Int]]
subseq []     =  [[]]
subseq (x:xs) =  (map (\xs' -> x:xs') (subseq xs)) ++ (subseq xs)
```
とかかな？
チーム内にRuby製のツールを広める時にはGemにしておくべき

もしかしたら、Rubyに慣れてない人には気付いていない人も居るかと思ったので、
カジュアルにRubyGemsを活用する事のメリットについて書いておきます。

普通、Rubyのgemパッケージは、`gem install`でインストールできるようにrubygems.orgにホスティングしておくのが基本です。

とは言え、世界的に公開されるものなので、ちゃんとgemとしての体裁を整えておかないと何か恥ずかしいし、説明とかも英語でちゃんと書いとかないと、って考えると面倒なレベルのツールとかあると思います。
API叩くための簡易コマンドとか、社内ツールの処理自動化とか。

しかし、Bundlerとgitのおかげで、現在はそういった事を余り気にする必要が無くなっています。

Bundlerは、gitリポジトリから直接コードをクローンして、パッケージ化されたgemと同様に扱う事ができます。

参考: [Bundler: The best way to manage a Ruby application's gems](http://gembundler.com/v1.3/git.html "Bundler: The best way to manage a Ruby application's gems")

そのためrubygems.orgにホスティングする必要はありません。
公開しても問題ないものならGitHubに、クローズドな情報が入っているものは社内のgitlabやGitHubのプライベートリポジトリに配置しておけばOKです。
後は、Gemfileに書けば、gemとして利用できます。

gitリポジトリから参照しているgemは`Gemfile.lock`でこんな感じで管理されています。

```
GIT
  remote: git://github.com/joker1007/ghost_writer.git
  revision: bdee7051d5555d8be92045c1d45cd4ac0dee40b1
  specs:
    ghost_writer (0.2.0)
      activesupport (>= 3.0.0)
      rspec-rails (~> 2.11)
      trollop
```

この方法には以下のようなメリットがあります。

- READMEにGemfileの書き方さえ書いておけば簡単にチームメンバーがインストールできる事。
- 更新したい時は、gitリポジトリにpushして、bundle updateを実行するだけ
- Bundlerはコミットハッシュでgemを特定しているので、バージョン番号を更新する必要もない
- Jenkins等で利用するのが楽になる
- 他の人の改善案もpull request等で容易に取り込める

というわけで、ツールの更新と配布をほとんどgitの機能に任せる事ができます。

gem化するのにも大した手間はかかりません。

```sh
% bundle gem mytool -b
      create  mytool/Gemfile
      create  mytool/Rakefile
      create  mytool/LICENSE.txt
      create  mytool/README.md
      create  mytool/.gitignore
      create  mytool/mytool.gemspec
      create  mytool/lib/mytool.rb
      create  mytool/lib/mytool/version.rb
      create  mytool/bin/mytool
Initializating git repo in /home/joker/mytool
```

後は、bin/mytoolを編集して、コマンドラインツールを簡単に作れる[wycats/thor](https://github.com/wycats/thor "wycats/thor · GitHub")などを利用すれば、お手軽コマンドツールが作れます。
後は、このディレクトリをgitリポジトリに上げてしまうだけです。

こんな感じで、カジュアルにGem化してツールを広めていくと、色々楽になるんで良いんじゃないかなと思っています。
CloudFormationでELBからのアクセスを許可するEC2 SecurityGroupを作成する

 * AWS CloudFormationで、ELBからのアクセスを許可するEC2 SecurityGroupを作成するテンプレートを作成してみました。
  * 前提として非VPC環境でEC2 Security GroupのInboundのSourceにamazon-elb/amazon-elb-sgを設定するとELBからのアクセスのみを許可します。
  * ポイントはSourceSecurityGroupNameにamazon-elb-sg、SourceSecurityGroupOwnerIdにamazon-elbを設定することみたいです。

```js:JSON
{
  "AWSTemplateFormatVersion" : "2010-09-09",

  "Description" : "build EC2 SecurityGroup",
  
  "Resources" : {
    "MySecurityGroup" : {
      "Type" : "AWS::EC2::SecurityGroup",
      "Properties" : {
        "GroupDescription" : "SecurityGroupTest",
        "SecurityGroupIngress": [{
          "IpProtocol": "tcp",
          "CidrIp": "0.0.0.0/0",
          "FromPort": "22",
          "ToPort": "22"
        },
        {
          "IpProtocol": "tcp",
          "SourceSecurityGroupName": "amazon-elb-sg",
          "SourceSecurityGroupOwnerId" : "amazon-elb", 
          "FromPort": "80",
          "ToPort": "80"
        }]
      }
    }
  },
  
  "Outputs" : {
    "CreatedSecurityGroup" : {
      "Value" : { "Ref" : "MySecurityGroup" }
    }
  }
}
```

## 所感

 * うまいこと方法がググれなくて手当たり次第試してたどり着きました。
 * このためだけにAWSの有料サポート受けようかと思った、、、
 * 方法を知ってからググると情報が見つかる、、、
IPアドレスとセッションIDをログに記録する

@Beforeフィルタとlog4jのMDCを組み合わせてみました。

複数項目を出力したいので、NDCではなくMDCを使います。下記のようにして `request` と`session` から情報を取得してキーを付けてMDCに登録します。

```java
@Before(priority = 0)
public static void before() {
    MDC.put("ip", request.remoteAddress);
    MDC.put("id", session.getId());
}
```

log4j.propertiesで `%X{key}` とすれば、登録した値をログに出力することができます。

```ddd
# Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d{ABSOLUTE} %X{ip} %X{id} %-5p ~ %m%n
```

## 参考

- [tak家ぶろぐ log4jのNDCとMDC](http://takya2.blog33.fc2.com/blog-entry-18.html)
>826と204の最大公約数を引き算を繰り返して求める場合、何回の処理で求まるか


https://twitter.com/chomado/status/334935764968275968

互除法だけど、引き算の回数を数えるのが横断的関心事なので副作用が書けないHaskellではめんどい。

```haskell:
divMod :: Int -> Int -> (Int, Int)
divMod n q = last . takeWhile ((>= 0) . snd) . (init :) . scanl process init
                                                                     $ repeat q
  where
    init = (0, n)
    process = flip $ \m -> (+ 1) `cross` (subtract m)

cross :: (a -> b) -> (c -> d) -> (a, c) -> (b, d)
cross f g (x, y) = (f x, g y)

countMinus :: Int -> Int -> Int
countMinus n m = snd (if n < m then countMinus' m n else countMinus' n m)
  where
    countMinus' n m
      | m == 0 = (n, 0)
      | otherwise = id `cross` (+ q) $ countMinus' m r
        where
          (q, r) = Main.divMod n $ m
```

こういうときに`State`モナド使うといいって話は、気が向いたら書く。
第11回オフラインリアルタイムどう書くの参考問題をF#で(2)

等差数列を積み重ねていったほうが単純だった。(1)は難しく考えすぎ。
かかった時間は(1)の後30分ぐらいかな。読みやすくするために細かい修正はいくつかしているけど。

```fsharp:arithmetic.fs
let isArithmetic = function
  | x0::x1::x2::_ -> x0-x1=x1-x2
  | _             -> true

let addElement xss e =
  seq {
    for xs in xss do
      yield xs
      let ys = e::xs
      if isArithmetic ys then yield ys
  }

let longestArithmeticSequence =
  Seq.fold addElement (Seq.singleton [])
  >> Seq.maxBy (List.length)

let solve (s:string) =
  s.ToCharArray()
  |> Array.toList
  |> List.map (fun c -> "0123456789abcdefghijklmnopqrstuvwxyz".IndexOf(c))
  |> longestArithmeticSequence
  |> List.length

(* for test *)

type TestResult = Success | Failure

let test target expected =
  let actual = solve target
  printfn "%A" (if expected = actual then Success else Failure)

[<EntryPoint>]
let main args =
  test "12345abcz" 5
  test "012abku" 4
  test "01245689cdeghik" 6
  test "0" 1
  test "m" 1
  test "01" 2
  test "az" 2
  test "0az" 2
  test "0ak" 3
  test "05ak" 3
  test "01349acdrsuv" 2
  test "01245789efgipqstux" 3
  test "0123456789abcdefghijklmnopqrstuvwxyz" 36
  test "02468acegikmoqsuwy" 18
  test "0369cfilorux" 12
  test "048cgkosw" 9
  test "05afkpuz" 8
  test "0123456789abcdefghjklmnopqrstuvwxyz" 18
  test "0123456789bcdefghijklmopqrstuvwxyz" 12
  test "0156abfgklpquv" 7
  test "0167cdijopuv" 6
  test "0178eflmst" 5
  test "0189ghopwx" 5
  test "019aijrs" 4
  test "012567abcfghklmpqruvw" 7
  test "012678cdeijkopquvw" 6
  test "012789efglmnstu" 5
  test "01289aghiopqwxy" 5
  test "0129abijkrst" 4
  test "01235678abcdfghiklmnpqrsuvwx" 7
  test "01236789cdefijklopqruvwx" 12
  test "0123789aefghlmnostuv" 5
  test "012389abghijopqrwxyz" 5
  test "01239abcijklrstu" 4
  test "368acdknouvz" 4
  test "369chikmnopqruwx" 6
  test "05689cdefghijklmnopqrstvwy" 18
  test "2489abdeiklrsuvwz" 4
  test "678bhijklnpqrsuvwxyz" 6
  test "1246cfjkopquxz" 5
  test "123459abcefhilmotuvx" 6
  test "02578acdefikmopqsuvwxz" 8
  test "135abdefghijlopstuwz" 7
  test "0126789fgjnotuvxy" 5
  test "2345678defjkmnoqrtvwxy" 7
  test "02568bdemnostw" 5
  test "145689bdfhilnqrstvwxz" 6
  test "4aghjrtuvwxyz" 7
  test "158achklmqstwy" 3
  test "012346abceghjknortv" 5
  0
```
部分テンプレートに変数を渡す


renderメソッドを用いて部分テンプレートを呼び出し、そこに変数を渡す。

```Ruby
<%= render partial: "fuga", locals: {var: "hoge"} %>
```

部分テンプレートの中では以下のように値を取得できる。

```_fuga.html.erb
<%= var %>
```


**参考サイト**

* [render :partial で変数を渡す - shohu33's diary]( http://shohu.hatenablog.com/entry/20071127/1196185816 )
mongodbでapacheのアクセスログから.cssと.jsを除外する方法


mongodbにapacheのアクセスログを突っ込んだときにjsとcssが邪魔な場合があるのでその時に除外する方法

```shell:sample.js
#pathの部分は/hoge/fuga?a=2&b=cみたいな形でデータに入ってる
db.raw_access.find({path : /^((?!\.css|.js).)*$/}, {path : 1}).forEach(function (x){
    print(x.path);
});
```

```shell
#.cssと.jsが除外されたものが出力される
mongo --quiet localhost/apache raw_access.js
#何も出力されない
mongo --quiet localhost/apache raw_access.js | grpe css
#何も出力されない
mongo --quiet localhost/apache raw_access.js | grpe js
```

shellのgrepと組み合わせると確認も比較的楽です
新しい外観のGoogle Mapsを表示する

Google I/O 2013で発表のあった新しい外観の地図を表示する方法になります。新UIの方は招待リクエストを送って待つ必要がありますが、新しい地図のデザインだけなら以下のコードで確認できます。

```html:test.html
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<meta charset="UTF-8">
<title>Google Maps デザイン切り替え</title>
<link href="http://code.google.com/apis/maps/documentation/javascript/examples/default.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript">
function onload() {
    google.maps.visualRefresh=true;
    var initLatlng = new google.maps.LatLng(35.680934,139.766908);
    initialize(initLatlng,14,'roadmap');
}
function initialize(initLatlng,zoomNo,maptype) {
    var map = new google.maps.Map(document.getElementById('map-canvas'), {
        center: initLatlng,
        zoom: zoomNo,
        mapTypeId: maptype
    });
    createButton(map);
}
function createButton(map) {
    var buttonDiv=document.createElement('div');
    var visual=document.createElement('input');
    visual.type="button";
    if(google.maps.visualRefresh) {
        visual.value="旧デザイン";
    } else {
        visual.value="新デザイン";
    }
    visual.onclick=function() {
        google.maps.visualRefresh=!google.maps.visualRefresh;
        initialize(map.center,map.zoom,map.mapTypeId);
    };
    buttonDiv.appendChild(visual);
    map.controls[google.maps.ControlPosition.RIGHT_BOTTOM].push(buttonDiv);
}
google.maps.event.addDomListener(window, 'load', onload);
</script>
</head>
  <body>
    <div id="map-canvas"></div>
  </body>
</html>
```

参考情報：https://developers.google.com/maps/documentation/javascript/examples/map-simple-refresh
AWSのリザーブドインスタンスについて

情報が古くなってきたのでこっちに書きなおしました。
http://qiita.com/hiroshix/items/7f88076f027944eb898b


#概要

+ 最初に一時金を支払うと、時間課金の単価が安くなる仕組み(≒グルーポン的な)
+ ただし最初にAvailabilityZone(1aとか1ｃとか)と、インスタンスタイプ(m1.smallとか)を決めないといけない
+ EC2、RDS、ElastiCacheで選べる

#意外と使えるかも？

+ 1年未満の利用でも安くなる場合が多い
+ スケールアップした場合も、必ずしも無駄になるわけではない(他に条件があうインスタンスがあれば、そちらに割引料金が適用される)

#注意点

+ Heavy Utilizationのみ、起動時間にかかわらず毎月24時間*日数分が課金される(MediumとLightは使った分だけ)
+ 3年は割引率が高いが、AWSは値下げがある場合もあるので、1年を毎年契約した方がいい場合があるかも知れない
+ ナウいインスタンスタイプ(c3, m3, r3)はあんまり割引率高くない
+ その中でも割引多 r3>m3>c3 割引少かな
+ 古いタイプは(m2とかm1とか)は割引率高い
+ RDSとElastiCacheはAZ指定なし
+ たまに値下げがあるので注意。値下げがあっても購入時の単価が適用される

#詳細はこの資料。新しいのに差し替えた。

[AWSマイスターシリーズ リザーブドインスタンス編](http://www.slideshare.net/AmazonWebServicesJapan/20131023-aws-meisterregeneraterispotpublic)

#試算ツール

+ AWS提供じゃないけどこんなツールもある

[Amazon EC2 Instance TypesCost Grapher](http://whichinstance.com/)
EC2にtd-agentをインストールする方法


忘れちゃうのでメモ

/etc/yum.repos.d/ 以下に
td.repo

```
[treasuredata]
name=TreasureData
baseurl=http://packages.treasure-data.com/redhat/$basearch
gpgcheck=0
```

を作成

```
yum install -y td-agent
```

を実行(-yオプションはおこのみで)


td-agent.confを編集

```
chkconfig td-agent on
```

で自動起動設定

```
/sbin/service td-agent start
```

設定ファイルは```/etc/td-agent/```以下にある

注意点としてbuffer_pathの権限
(参考)
http://qiita.com/items/e2c3d80f97bb648bdd9b
第11回オフラインリアルタイムどう書くの参考問題をF#で(1)

アルゴリズムのイメージは30分強でついたのだけど、そこから2時間ぐらいかかってしまった。

```fsharp:arithmetic.fs
let rec muls x y c = function
  | []    -> c
  | z::zs -> match (compare y z) with
             | 0 -> muls x (y+x) (c+1) zs
             | 1 -> muls x y c zs
             | _ -> c

let rec counter = function
  | []    -> []
  | x::xs -> (x, muls x (x+x) 1 xs) :: (counter xs)

let longestArithmeticSequence xs =
  let diff =
    Seq.zip xs (List.tail xs)
    |> Seq.map (fun (x,y) -> y-x)
  let diffGraph =
    diff
    |> Seq.scan (fun xs i -> i :: List.map (fun x -> x+i) xs) []
  let diffLengths =
    diffGraph
    |> Seq.map counter
    |> Seq.concat
  if Seq.isEmpty diffLengths
    then 1
    else 1 + snd (Seq.maxBy snd diffLengths)

let solve (s:string) =
  s.ToCharArray()
  |> Array.toList
  |> List.map (fun c -> "0123456789abcdefghijklmnopqrstuvwxyz".IndexOf(c))
  |> longestArithmeticSequence

(* for test *)

type TestResult = Success | Failure

let test target expected =
  let actual = solve target
  printfn "%A" (if expected = actual then Success else Failure)

[<EntryPoint>]
let main args =
  test "12345abcz" 5
  test "012abku" 4
  test "01245689cdeghik" 6
  test "0" 1
  test "m" 1
  test "01" 2
  test "az" 2
  test "0az" 2
  test "0ak" 3
  test "05ak" 3
  test "01349acdrsuv" 2
  test "01245789efgipqstux" 3
  test "0123456789abcdefghijklmnopqrstuvwxyz" 36
  test "02468acegikmoqsuwy" 18
  test "0369cfilorux" 12
  test "048cgkosw" 9
  test "05afkpuz" 8
  test "0123456789abcdefghjklmnopqrstuvwxyz" 18
  test "0123456789bcdefghijklmopqrstuvwxyz" 12
  test "0156abfgklpquv" 7
  test "0167cdijopuv" 6
  test "0178eflmst" 5
  test "0189ghopwx" 5
  test "019aijrs" 4
  test "012567abcfghklmpqruvw" 7
  test "012678cdeijkopquvw" 6
  test "012789efglmnstu" 5
  test "01289aghiopqwxy" 5
  test "0129abijkrst" 4
  test "01235678abcdfghiklmnpqrsuvwx" 7
  test "01236789cdefijklopqruvwx" 12
  test "0123789aefghlmnostuv" 5
  test "012389abghijopqrwxyz" 5
  test "01239abcijklrstu" 4
  test "368acdknouvz" 4
  test "369chikmnopqruwx" 6
  test "05689cdefghijklmnopqrstvwy" 18
  test "2489abdeiklrsuvwz" 4
  test "678bhijklnpqrsuvwxyz" 6
  test "1246cfjkopquxz" 5
  test "123459abcefhilmotuvx" 6
  test "02578acdefikmopqsuvwxz" 8
  test "135abdefghijlopstuwz" 7
  test "0126789fgjnotuvxy" 5
  test "2345678defjkmnoqrtvwxy" 7
  test "02568bdemnostw" 5
  test "145689bdfhilnqrstvwxz" 6
  test "4aghjrtuvwxyz" 7
  test "158achklmqstwy" 3
  test "012346abceghjknortv" 5
  0
```
linux ip コマンドのメモ

# IP アドレス
- 追加: `ip address add 192.168.0.1/24 broadcast 192.168.0.255 dev eth2`
- 削除: `ip address del 192.168.0.1/24 dev eth2`
- broadcast を指定しないと 0.0.0.0 になることに注意

# alias address
- `ip address add 172.16.0.1/24 broadcast 172.16.0.255 dev eth2 label eth2:0`
- `ip address del 172.16.0.1/24 dev eth2 label eth2:0`

# 経路
- `ip route route add 10.0.0.0/24 via 192.168.0.1 dev eth2`
- `ip route route del 10.0.0.0/24 via 192.168.0.1 dev eth2`
- `ip route get 173.194.38.120`
-- 173.194.38.120 宛の経路の参照
Apache Ivy の最初の一歩

Apache Ivy の最初の一歩をまとめました。
なかなか踏み出せないでいる方の後押しになれば幸いです。

## Apache Ivy とは

ライブラリの依存関係を管理するツールです。
Apache Ant からタスクとして実行するので、Ant でビルド管理しているプロジェクトに導入しやすいのが特徴です。

## 動作確認環境

以下の環境で確認しました。

* Windows 7 (x64)
* JDK 1.6.0_22 (x64)
* Apache Ant 1.8.1

## 手順

1. http://ant.apache.org/ivy/download.cgi から apache-ivy-<バージョン>-bin.zip をダウンロードします。
2. 1 のファイルを展開します。以後、この展開後のディレクトリを IVY_DIR とします。
3. IVY_DIR/ivy-<バージョン>.jar を ANT_HOME/lib に配置してください。ANT_HOME は Apache Ant がインストールされているディレクトリを指しています。
4. IVY_DIR/src/example/hello-ivy に移動し、「ant」コマンドを実行します。
5. IVY_DIR/src/example/hello-ivy に build ディレクトリと lib ディレクトリが生成されます。
6. 後は、IVY_DIR/src/example/hello-ivy にある build.xml と ivy.xml を読みながら勉強してください。
twitter等をWebViewで開くと落ちる場合の対処

他サイトによると下記を実行すればOKとあったが、実質４のみで大丈夫っぽいです。
１・delegateを解除
２・ロードをストップ
３・アニメーションを止める
４・webViewを親から取り外す

/************************************************************
 *
 ************************************************************/
-(void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self.view addSubview:webView];
}

/************************************************************
 *
 ************************************************************/
- (void) viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
    if (self.webView != nil) {
        [webView removeFromSuperview];
    }
}

なぜかdeallocやdidMoveToParentViewControllerでは駄目らしいね。
たぶんこの辺はメソッドのコール順序をしっかり把握すれば分かりそうだけど、
それはまたの機会に。。。
Javascriptでヒアドキュメント

そろそろ「テンプレート文字列」を使用しても問題なくなってきたので、こちらを使用しまよう。

[テンプレート文字列 \- JavaScript \| MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/template_strings)

<hr>

[Multi-line strings in JavaScript and Node.js](http://tomasz.janczuk.org/2013/05/multi-line-strings-in-javascript-and.html)

面白い記述のしかたを発見。

```html
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script src="http://ajax.microsoft.com/ajax/jquery.templates/beta1/jquery.tmpl.min.js"></script>
<style>
.title{
	width:100%;
	height:240px;
	line-height:240px;
	text-align:center;
	background:#ccc;
}
</style>
<body>


<script>
//ヒアドキュメント
var heredoc = (function () {/*
<div class="title">
	<h1>
		<a href="${url}">${title}</a>
	</h1>
</div>
*/}).toString().match(/(?:\/\*(?:[\s\S]*?)\*\/)/).pop().replace(/^\/\*/, "").replace(/\*\/$/, "");


var object = {
	url: "http://shimz.me/blog",
	title: "GUNMA GIS GEEK"
}
var html = jQuery.tmpl(heredoc, object);
$('body').append(html);

</script>
</body>
</htm>


```
TitaniumMobileSDKのログ出力と色分け

# デバイス
```sh
adb -d logcat -v time TiAPI:I *:S | perl -pe's| D\/.*$|\e[35m$&\e[0m|g;s| I\/.*$|\e[36m$&\e[0m|g;s| W\/.*$|\e[33m$&\e[0m|g;s| E\/.*$|\e[31m$&\e[0m|g;'
```

# エミュレーター
```sh
adb -e logcat -v time TiAPI:I *:S | perl -pe's| D\/.*$|\e[35m$&\e[0m|g;s| I\/.*$|\e[36m$&\e[0m|g;s| W\/.*$|\e[33m$&\e[0m|g;s| E\/.*$|\e[31m$&\e[0m|g;'
```

# VMWare上のエミュレーターとか
```sh
adb -s [IP Address]:[Port] logcat -v time TiAPI:I *:S | perl -pe's| D\/.*$|\e[35m$&\e[0m|g;s| I\/.*$|\e[36m$&\e[0m|g;s| W\/.*$|\e[33m$&\e[0m|g;s| E\/.*$|\e[31m$&\e[0m|g;'
```
[MT]同一フォルダ内の前後のウェブページにリンク

Movable Typeで、同一フォルダ内の前後のWebページにリンクする方法です。
「by_category="1"」の隠しモディファイアを使います。

```
<ul>
<mt:PagePrevious by_category="1">
  <li><a href="<$mt:PagePermalink$>"><$mt:PageTitle$></a></li>
</mt:PagePrevious>
<mt:PageNext by_category="1">
  <li><a href="<$mt:PagePermalink$>"><$mt:PageTitle$></a></li>
</mt:PageNext>
</ul>
```
ros groovyをos xにインストールする(現在進行形)

基本的には[ここ](http://www.ros.org/wiki/groovy/Installation/OSX/Homebrew/Source)に従っていく

# 前準備

```sh 
brew update
brew install cmake
brew tap ros/groovy
brew tap Homebrew/science
export PATH=/usr/local/bin:/usr/local/share/python:$PATH
export PYTHONPATH="/usr/local/lib/python2.7/site-packages:$PYTHONPATH"
sudo pip install pyparsing==1.5.7
sudo pip install -U wstool rosdep rosinstall rospkg catkin-pkg
brew install cairo --env=std #https://github.com/mxcl/homebrew/issues/16361
sudo rosdep init
rosdep update
```

# catkin
catkinはrosmakeのros依存してないバージョンらしい
(まためんどくさいもの作って...)

```sh 
mkdir ~/ros_catkin_ws
cd ~/ros_catkin_ws
wstool init -j8 src http://packages.ros.org/web/rosinstall/generate/raw/groovy/desktop #desktop-fullはコンパイルがコケる
```

* tf2_rosのコンパイルが失敗するので、CMakeLists.txtを修正しておく.

https://github.com/ros/geometry-experimental/pull/6

```sh 
rosdep install --from-paths src --ignore-src --rosdistro groovy -y
./src/catkin/bin/catkin_make_isolated --install
source ~/ros_catkin_ws/install_isolated/setup.bash
```

# ros環境の構築

```sh 
mkdir ~/ros_ws
cd ~/ros_ws
rosws init . ~/ros_catkin_ws/install_isolated
rosws merge http://packages.ros.org/web/rosinstall/generate/dry/raw/groovy/desktop
rosws update -j8
```
みんなのはなもげらのソースコードを公開しました．

「みんなのはなもげら」のソースコードをgithubで公開しました．GPLライセンスです．「みんなのはなもげら」ははなもげら短歌を楽しむサイトです．はなもげら語生成エンジンはRubyで記述されています．また，はなもげら生成エンジンをAPI経由で使用する事も可能です．ご意見，ご感想をお待ちしております．

みんなのはなもげら；http://truelogic.biz/hanamogera/
Github: https://github.com/anonaka/HanamogeraGen
bashのビルトインコマンドメモ

bashには実体のないビルトインコマンドがあるということを知ったのでメモ

## ビルトインコマンドの確認
 * type -a [対象コマンド]とすることでビルトインコマンドかどうか確認できる

 * 以下のtimeの例だとビルトインコマンド(shell keyword)だということと実体(/usr/bin/time)の2つがあることがわかる

```bash
 $ type -a time
time is a shell keyword
time is /usr/bin/time
```
 * おまけでll(alias)を見てみる

```bash
$ which ll
$ type -a ll
ll is aliased to `ls -alf'
```

## ビルトインコマンドのヘルプ確認
 * help [対象コマンド]

```bash
$ help time
time: time [-p] PIPELINE
    Execute PIPELINE and print a summary of the real time, user CPU time,
    and system CPU time spent executing PIPELINE when it terminates.
    The return status is the return status of PIPELINE.  The `-p' option
    prints the timing summary in a slightly different format.  This uses
    the value of the TIMEFORMAT variable as the output format.
times: times
    Print the accumulated user and system times for processes run from
    the shell.
```

 * helpコマンドはビルトインコマンド

```bash
$ type -a help
help is a shell builtin
```

## Rubyでの謎
 * なんでこうなるのかよくわかってない

 * OSXでtimeコマンドを実行
  * ビルトインコマンドが使える

```ruby
1.9.3p125 :002 > `time echo`
        0.00 real         0.00 user         0.00 sys
 => "\n" 
```

 * AWSのEC2(AmazonLinux)でtimeコマンドを実行(/usr/bin/timeが使われている)
  * ビルトインコマンドが使えない(bash -c time echoとかすると使える)

```ruby
1.9.3p327 :001 > `time echo`
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 2384maxresident)k
0inputs+0outputs (0major+189minor)pagefaults 0swaps
 => "\n" 
```
Rubyでブランクスレート

# はじめに
ブランクスレート：空白の石版
メソッドがほとんどない空っぽなクラスの事・・・でいいのかな？
必要なメソッドだけにしたい場合とかに使う。

# Ruby 1.8.7の頃
必要っぽいメソッド以外をundef_methodで未定義にするという事をしていました。

```ruby
class BlankSlate
  instance_methods.each{|method|
    undef_method method unless method.to_s =~ /method_missing|respond_to?|^__|object_id/
  }
end
```

# Ruby1.9以降
BasicObjectで一発なんですね！

```ruby
class BlankSlate < BasicObject ; end
```

## BasicObjectとは？
[Ruby 1.9.3 リファレンスマニュアル](http://doc.ruby-lang.org/ja/1.9.3/class/BasicObject.html "class BasicObject")

># 要約
>特殊な用途のために意図的にほとんど何も定義されていないクラスです。
>Objectクラスの親にあたります。Ruby 1.9 以降で導入されました。
># 性質
>BasicObject クラスは Object クラスからほとんどのメソッドを取り除いたクラスです。
>Object クラスは様々な便利なメソッドや Kernel から受け継いだ関数的メソッド を多数有しています。
>これに対して、 BasicObject クラスはオブジェクトの同一性を識別したりメソッドを呼んだりする 最低限の機能の他は一切の機能を持っていません。
># 注意
>通常のクラスは Object またはその他の適切なクラスから派生すべきです。 
>真に必要な場合にだけ BasicObject から派生してください。

**『真に必要な場合にだけ』**
・・・（＾ｑ＾

# 実行結果
どちらでもundefined method
（rvmが入ってたり入っていなかったりしますけど（＝ｗ＝；）

```
>> BlankSlate.new.methods
NoMethodError: undefined method `methods' for #<BlankSlate:0x106e93228>
	from (irb):6
```

```
1.9.3p392 :001 > class BlankSlate < BasicObject ; end
 => nil 
1.9.3p392 :002 > BlankSlate.new.methods
NoMethodError: undefined method `methods' for #<BlankSlate:0x000000020ec868>
	from (irb):2
	from /home/*****/.rvm/rubies/ruby-1.9.3-p392/bin/irb:16:in `<main>'
```

# 両方のバージョンで使うなら？
こんな感じ？
むしろ、もう1.8系とか忘れていいとは思いますが。
使うなら2系ですもんね。

```
if RUBY_VERSION < "1.9"
  class BlankSlate
    instance_methods.each{|method|
      undef_method method unless method.to_s =~ /method_missing|respond_to?|^__|object_id/
    }
  end
else
  class BlankSlate < BasicObject ; end
end
```

# 例

```ruby
module MyMethods
  def hello
    puts "hello"
  end
end

class Execute < BlankSlate 
  extend MyMethods
end

Execute.hello
```

## 実行結果

```
hello
```

Objectを汚したくない場面とかに使ったりするかな〜（＝ｗ＝
xyzzyで連番文字列を出力する

```cl:dotimes.cl
(dotimes (x 3)
  (format t "~d~%" x)) (Ctrl + j押下)
```

出力結果：
0
1
2
nil

左側を0詰めで数値出力する場合

```cl:alignLeft.cl
(dotimes (x 100)
  (format t "~3,'0d~%" x)) (Ctrl + j押下)
```


※「~3」で桁数を指定し、「'0」で左側に詰めたい文字を指定する

出力結果：
000
001
002
003
004
nil
CentOS6.4でPHPのRPMをリビルドしてMySQL5.6のRPMを使う

CentOS6.4でMySQL5.6でphpMyAdminをっていう要件が出たのでPHPをソースから入れるのもあれだし@baseリポジトリのSRPMをリビルドしてパッケージを作る (できればこの作業はビルド専用の環境でやろう)


まずRPMビルドのための環境構築をする

```
% sudo yum install rpm-build
% echo "%_topdir $HOME/rpms" > ~/.rpmmacros
% mkdir -p ~/rpms/{BUILD,SOURCES,SPECS,SRPMS,RPMS}
```

PHPのSRPMを持ってきて入れる

```
% wget http://vault.centos.org/6.4/os/Source/SPackages/php-5.3.3-22.el6.src.rpm
% rpm -ivh php-5.3.3-22.el6.src.rpm
```

もし入っていればMySQL関連のパッケージを削除しておく

```
% sudo yum remove mysql
```

とりあえずリビルド

```
% rpmbuild -ba ~/rpms/SPECS/php.spec
```

をすると、パッケージが足りないというエラーが出たのでmysql-develを除外して求められたパッケージを入れる

```
% sudo yum -y install bzip2-devel db4-devel gmp-devel httpd-devel pam-devel pcre-devel libedit-devel libtool-ltdl-devel libc-client-devel cyrus-sasl-devel openldap-devel postgresql-devel unixODBC-devel net-snmp-devel libxslt-devel libXpm-devel libtidy-devel aspell-devel recode-devel libicu-devel enchant-devel
```

次にMySQLの公式RPMを入れる

```
% sudo yum -y localinstall \
http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6/MySQL-client-5.6.11-2.el6.x86_64.rpm \
http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6/MySQL-devel-5.6.11-2.el6.x86_64.rpm \
http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6/MySQL-embedded-5.6.11-2.el6.x86_64.rpm \
http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6/MySQL-server-5.6.11-2.el6.x86_64.rpm \
http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6/MySQL-shared-5.6.11-2.el6.x86_64.rpm \
http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6/MySQL-shared-compat-5.6.11-2.el6.x86_64.rpm \
http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6/MySQL-test-5.6.11-2.el6.x86_64.rpm
```

mysql_configのパスを調べる

```
% type -a mysql_config
mysql_config is /usr/bin/mysql_config
```

SPECファイルを修正する(mysql_configのパスとパッケージ名)

```
% vi ~/rpms/SPECS/php.spec
- %define mysql_config %{_libdir}/mysql/mysql_config
+ %define mysql_config %{_bindir}/mysql_config
- BuildRequires: mysql-devel >= 4.1.0
+ BuildRequires: MySQL-devel >= 4.1.0
```

再度リビルド

```
% rpmbuild -ba ~/rpms/SPECS/php.spec
```

リビルドがうまく行ったら作成したPHPパッケージを入れてみる

```
% sudo yum localinstall ~/rpms/php-*.rpm
```

とりあえずうごいた
windowWillBeginSheetのメッセージの飛び先

シートを表示して初期化などの処理を行いたいとき、windowWillBeginSheetのイベント内で行う事になると思われるが、このメッセージは作成したシートではなく、シートの発行元である親Windowに飛ばされる。

よって、親WindowにwindowWillBeginSheetを実装してシートの初期化処理を呼ぶというスタイルにしなければならない。

以下は親WindowのwindowWillBeginSheet実装例

```objc:sample_parent.h
    IBOutlet NSPanel *pnlTest;
    IBOutlet NSWindowController *winTest;
```

```objc:sample_parent.m
-(IBAction)onClicked_btnTest:(id)sender {

    [[NSApplication sharedApplication] beginSheet:pnlTest
                                   modalForWindow:self.window
                                    modalDelegate:self
                                   didEndSelector:@selector(onSheetDidEnd:
                                                            returnCode:
                                                            contextInfo:)
                                      contextInfo:nil];
}

// begin sheet
-(void)windowWillBeginSheet:(NSNotification *)notification {
    
    Viw_JobController *viwTest = (Viw_JobController *)winTest;
    [viwTest update];
}

// selector
-(void)onSheetDidEnd:(NSWindow *)winSheet
          returnCode:(int)intReturnCode
         contextInfo:(void *)datContextInfo {
    
    [pnlTest orderOut:nil];
}

```

以下は子Window(Sheet)

```objc:sample_child.m

-(void)update {
    
    // initialize code
}


```
Toastの終了を検出する

Toastが終了してから何かしたい、ってことがあるとします。Toastにはイベントリスナは付けられないのでToastが持つviewの `onDetachedWindow()`をオーバーライドして代用できます。

```java
final Toast toast = Toast.makeText(context, "hoge", Toast.LENGTH_SHORT);
new FrameLayout(this) {
	{
		addView(toast.getView()); // toastのviewをframelayoutでくるむ
		toast.setView(this); // framelayoutを新しくtoastに設定する
	}
	@Override
	public void onDetachedFromWindow() {
		super.onDetachedFromWindow();
		// Toastが終了したあとの処理をする
	}
};
toast.show();
```

検索用キーワード: Toast, onDismiss

検証用コード: https://github.com/gfx/android-ToastOnDismiss/blob/master/ToastOnDismiss/src/main/java/com/example/toastondismiss/MainActivity.java