OmniAICreator/Qiita-1.07M huggingface dataset:
capybara-webkitで詰まった時

capybara-webkitにはデバッグモードが存在する。

```rb:spec/spec_helper.rb
Capybara.javascript_driver = :webkit_debug
```

すごく遅いexampleを実行
`bundle exec spring rspec spec/features/top_page_spec.rb`

```
Finished "EnableLogging" with response "Success()"
Wrote response true ""
Received "Visit"
Started "Visit"
Load started
"Visit" started page load
Started request to "http://127.0.0.1:62146/"
Finished "Visit" with response "Success()"
Started request to "http://127.0.0.1:62146/assets/application.css"
Started request to "http://127.0.0.1:62146/assets/application.js"
Received 200 from "http://127.0.0.1:62146/"
Received 200 from "http://127.0.0.1:62146/assets/application.css"
Received 200 from "http://127.0.0.1:62146/assets/application.js"
Started request to "http://www.google-analytics.com/analytics.js"
Started request to "http://127.0.0.1:62146/assets/common/logo.png"
Received 200 from "http://127.0.0.1:62146/assets/common/logo.png"
※ ここで動かなくなる
```

google analyticsがブロックしてました
pryでのデバッグ中にnextがstepの様な挙動をしてしまう問題の解決法


Ruby2.0に置き換えた人はこの問題にぶち当たっているみたいです。

debuggerがruby2.0に対応できていないのが問題らしいので、対処法としては、

* [debugger](https://github.com/cldwalker/debugger)を[byebug](https://github.com/deivid-rodriguez/byebug)に
* [pry-debugger](https://github.com/nixme/pry-debugger)を[pry-byebug](https://github.com/deivid-rodriguez/pry-byebug)に

置き換えればいいみたいです。

## 情報源

https://github.com/nixme/pry-debugger/issues/34
form_for と select の使い方

class: "custom"はZurb Foundation用。

```rb:select_form.html.erb
  <%= form_for(@list, url: {action: :action_name},class: "custom") do |f| %>
    <label>ラベル</label>
    <%= f.select(:mode,
		 [["名前1","name1"],
		  ["名前2","name2"],
		 class: "medium",
		 selected: "name2",
) %>
  <% end %>
```
PHP　strtotime()のバージョン

strtotime("first day of 2013-08-16");//2013-08-01のタイムスタンプ
strtotime("last day of 2013-08-16");//2013-08-31のタイムスタンプ

このfirst～とlast～は
5.3.1だと動く。
5.2.4では動かず。
picoでbbcode有効で登録したコンテンツを一括でHTMLに変換する


何回かやってしまったのでメモを残しておきます。

picoを新規インストールして何も考えずにコンテンツ作成すると、BBCode有効、自動改行有効でコンテンツを作成することになります。

これで下書きをだーーーっっと入力しておいて、あとからCKEditorをインストールして、いざWYSIWYGで編集しようと思うと、BBCode用エディタになってしまいます。

これはBBCode有効のコンテンツを編集しようとすると、BBCode用CKEditorが起動するからなんですね。

そうなったときに、一括でBBCodeなコンテンツをHTMLコンテンツに変換するのが次のSQL


```sql
UPDATE PREFIX_pico_contents SET body=REPLACE(body, '\n', '<br />\n'),  filters=REPLACE(filters, 'bbcode', '');
UPDATE PREFIX_pico_contents SET filters=REPLACE(filters, 'nl2br', '');

```
※PREFIXはXOOPS_DB_PREFIXにあわせて、picoも複製したモジュールディレクトリ名にあわせてください。

「BBCode変換」「自動改行」のオプションを削除して、本文中の改行に<br />を追加するようになってます。
Mac OS X Mountain Lion でTeX環境セットアップ


基本的には [Mac - TeX Wiki](http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?Mac#f5466652) の情報を参照して作業すればOK。ただし情報が豊富すぎるので、自分で設定した内容だけメモする。

# MacTex インストール

MacTexはいわゆるTexLiveのMac版パッケージのこと。UbuntuなんかでTeXLiveを使っていた人はそのままスムーズに以降できると思う。

* [MacTeX - TeX Users Group](http://tug.org/mactex/) から pkg をダウンロードしてきてインストールする
  * [Mac - TeX Wiki](http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?Mac#od3c0b75) にダウンロードミラーの一覧があるので、こちらでもOK

pkgをインストールするだけでバイナリのある `/usr/texbin/` にパスが通るようになっている。

# 日本語フォントインストール

小塚フォントが個人的に好きなので、[Mac - TeX Wiki - 日本語環境の整備](http://oku.edu.mie-u.ac.jp/~okumura/texwiki/?Mac#i9febc9b)を参考にPDF作成するときは小塚フォントを埋め込むように設定しておく。

~~~bash
mkdir -p /usr/local/texlive/texmf-local/fonts/opentype/kozuka
cp Koz*.otf /usr/local/texlive/texmf-local/fonts/opentype/kozuka
sudo mktexlsr
sudo updmap-sys --setoption kanjiEmbed kozuka
~~~

## 試しにPDF作成

テスト用に適当なtexファイルを作成して

~~~bash
platex hoge.tex
dvipdfmx -r 2400 -z 0 hoge.dvi
~~~

# PDFtkインストール

TeXには直接関係はないけど、出力されたPDFにちょっと加工するのを自動化するときなどに便利なので入れておく。
コマンドラインツールはPDFtk serverという名前でMac OS X向けにもバイナリパッケージがリリースされている → [PDFtk Server](http://www.pdflabs.com/tools/pdftk-server/)。

# OMakeインストール

Mac用バイナリがオフィシャルに用意されている [Download OMake](http://omake.metaprl.org/download.html)。リリース時期が2007年でちょっと古いけど、x86版をインストールしてみたところ今のところ問題なく Mountain Lion でも動いてる。

# Preview.appでPDFが自動更新されない問題

MacのPreview.appはPDFファイルが更新されると自動で新しい内容を表示してくれるが、表示更新をするためにはPreview.appにフォーカスがあたらないといけない。つまり、エディタとPreview.appを並べて、原稿を書きながらOMakeでLaTeX自動ビルドしていても、エディタからPreview.appにフォーカスを移さないと更新内容が実際どのように表示されるか確認できなくて大変不便。

じゃあどうするか

[Skim](http://skim-app.sourceforge.net/)を使う

SkimはMac用PDFビューアで、設定すれば自動でPDFファイル更新を検知して表示内容を更新してくれる。バックグラウンドでも問題ない。
node.jsでメモリ使用量を取得する方法あれこれ

node.jsでメモリ使用量を取得する方法あれこれ
====

はじめに
----
[Bounscale](https://github.com/bounscale/bounscale/)というオートスケールするHeroku Addonを作っています。

Bounscaleでは実験的にnode.jsへの対応を実施しています。
オートスケールするにあたり、各種リソースの監視が必要なのですが、node.jsでどのようにメモリ使用量を取得するか調べたので下記しておきます。

バージョン
----
node.js v0.10.15

取得方法
----
調べた限りには下記3種類の方法を見つけました。

* osオブジェクトの情報を利用する方法
* processオブジェクトの情報を利用する方法
* usageライブラリを利用する方法

osオブジェクトの情報を利用する方法
----
[osオブジェクト](http://nodejs.org/api/os.html)はnodeの標準APIで提供されています。

下記の感じで全メモリ容量と未使用メモリ容量を取得できます。
引き算すればメモリ使用量が算出できると思います。

````
> os.totalmem()
1043562496
> os.freemem()
71467008
````

ただし、これで取得できるのはシステム全体のメモリ情報です。
node.jsのプロセスが消費しているメモリの容量はこれではわかりません。

processオブジェクトの情報を利用する方法
----
[processオブジェクト](http://nodejs.org/api/process.html)からもメモリ情報を取得できます。

````
> process.memoryUsage()
{ rss: 9019392,
  heapTotal: 5115392,
  heapUsed: 2658096 }
````

rssはアプリケーションのメモリ使用量で、heapTotal/heapUsedはV8エンジンのヒープメモリ使用量とのことです。
これはプロセス単位で取得できているようです。

usageライブラリを利用する方法
----
[usage](https://github.com/arunoda/node-usage)というシステム情報取得をするライブラリがnpmで公開されています。
Cで書かれているようで、直接システムの情報を取っていそうです。

まずnpmコマンドでインストールします。

````
npm install usage
````

実行します。

````
> var usage = require('usage')
undefined
> var memory = null;
undefined
> usage.lookup(process.pid, function(err, result){memory = result.memory})
undefined
> memory
13520896
````
heroku run nodeで値をみたところでは、process.memoryUsage()のrssとほぼ同じ値が返ってきているようです。


終わりに
----
標準APIに含まれていて、プロセス単位でメモリ消費量を取得できるprocess.memoryUsage()を使うのが手っ取り早いですね。
PHP開発環境のZend Studioのエディターの色を変更する方法


## 問題

Zend Studio でPHPファイルを開いたら色の設定がおかしくて全くコードが読めなかった。
なんでこんなデフォルトなんだろ?


## Eclipse Color Theme プラグイン インストール方法

1. Zend Studio の メニューバーの Help → Welcome を開く
2. 右ペインから Editor Features の折り畳みを開く
3.  Eclipse Color Theme を選択
4. 上部の Apply changes をクリック
5. インストールされる
6. 必ず再起動する

説明は以下より
<a href="http://files.zend.com/help/Zend-Studio/content/working_with_eclipse_color_theme.htm">Working with Eclipse Color Theme</a>

## 使い方

以下へ行く
 Window | Preferences | General | Appearance | Color Theme.


## 旧・解決方法

ググって以下が先にでてきたからやってしまった。
プラグインがあれば必要ないです…

色の設定ファイルをZend Studioにインポートする!

## romio バージョン

romioColors.zip をダウンロードして、Zend Studio にインポートする!
感想) これ関数とか黒で見えない…

http://forums.zend.com/download/file.php?id=73&sid=e8bd4942eda6c87d70c331da551555b3


## ronny バージョン

以下をダウンロードしてそのままインポート
感想) フォントがおかしい…

http://blog.ronnyristau.de/wp-content/uploads/2009/04/ronny-eclipse-textmate-preferences.epf


## david_coleman_007 バージョン

感想) 変数が青で見えない…
http://forums.zend.com/download/file.php?id=499


##  borjawebs バージョン


http://forums.zend.com/download/file.php?id=878


## インポート方法


1. zipファイルの場合、zipファイルをダウンロードして、解凍する
2. Zend Studio で File → Import (ファイル → インポート)へ移動
3. ウィザードで General → Preferences (一般→設定 かな?)をクリックして、次へ
4. 解答したファイルを選択 (ex. romioColor.epf)
5. 終了!!


お父さん、お母さん、私、幸せになれました。

## 参考URL

<a href="http://forums.zend.com/viewtopic.php?f=59&t=566">Zend Forums • View topic - Zend Studio for Eclipse color option</a>
EditorConfigでいい感じにエディタを設定する


# EditorConfigとはなんぞや？

ざっくり説明すると、いろんなエディタやIDE間でコーディングスタイルを統一するための設定ファイルのフォーマットと各エディタのプラグイン実装

# なにが嬉しいのか

エディタを変えても1つの設定ファイルで同じように設定できる
ディレクトリごとに設定ファイルを作れて、それぞれ異なった設定が可能  


# 実例

例えば`Ruby`と`CoffeeScript`の設定ファイルを書く

```.editorconfig
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_new_line = true

[*.rb]
indent_style = tab
tab_width = 3

[*.coffee]
indent_style = spece
indent_size = 2
```

この`.editorconfig`ファイルをプロジェクトのルートディレクトリに設置しておけば、対応したエディタでファイルを開くとファイルの種類に応じた設定で開かれる


設定項目の意味などについては[このサイト](http://dev.hageee.net/21)を参照されたし
GNU Screen で縦分割使ってる人は最新版で幸せになれる

GNU Screen の縦分割機能、もっさりして辛いですね。これは数年前に改善済みです。

* [端末で縦分割時のスクロールが遅い - Togetter](http://togetter.com/li/516002)

> 少し違うけど #gnu_screen も分割時（とくに縦分割時）に描画のパフォーマンスが悪いときがあったけど http://bit.ly/du33Uu で改善されて感動した。
> [yoshikaw 2010-06-23 21:55:30](https://twitter.com/yoshikaw/status/16847694755)

Ubuntu 12.04 の apt だと↑のバージョンよりも古いものが入るようなので、最新版をビルドしましょう:

```sh
sudo apt-get build-dep screen
sudo apt-get install autoconf libtool # 下のautogen.shコケたら必要かも
git clone git://git.savannah.gnu.org/screen.git
cd screen/src
./autogen.sh
./configure --enable-colors256
make
sudo make install
tic terminfo/screeninfo.src
```

おわり。
はてなに slideshare を貼る方法

```diff
   marginwidth="0"
   marginheight="0"
   scrolling="no"
-  style="max-width:427px;border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px"
-  allowfullscreen
-  webkitallowfullscreen
-  mozallowfullscreen
 > </iframe>
-<div style="margin-bottom:5px">
+<div style="margin-left:2em; margin-bottom:5px">
   <strong>
     <a
```
botの一部の機能として降水確率をtweet

はい。最近までは降水確率は気にしてはいなかったのですが個人的な事由で必要になったのでtweetで流すことに。

```python:kousui.py
#!/usr/bin/env python
# -*- coding:UTF-8 -*-

from urllib import urlencode
from oauth2 import Client, Consumer, Token
from prettyprint import pp, pp_str
import re
import feedparser
import oat
#oatというのはOAuthトークンを別に置くためにウチで勝手に作ったものです

#tokyo
msnt = feedparser.parse("http://weather.jp.msn.com/RSS.aspx?wealocations=wc:JAXX0085&weadegreetype=C&culture=ja-JP")
#kumamoto
msnk = feedparser.parse("http://weather.jp.msn.com/RSS.aspx?wealocations=wc:JAXX0043&weadegreetype=C&culture=ja-JP")
msnt2 = msnt['entries'][0].summary
msnk2 = msnk['entries'][0].summary

tokyo = msnt2.encode("utf-8")
kumamoto = msnk2.encode("utf-8")

tori = re.compile('降水確率:\s\d*%')

twi1 = "今日の東京は" + tori.findall(tokyo)[0] + "で、明日は" + tori.findall(tokyo)[1] + "くらい。今日の熊本は" + tori.findall(kumamoto)[0] + "で、明日は" + tori.findall(kumamoto)[1] + "くらい。情報提供は多分Foreca様から"

oat.client.request('https://api.twitter.com/1.1/statuses/update.json', 'POST', urlencode({'status': twi1}))
```

はい。
今回の降水確率の取得はこちらから。
[http://weather.jp.msn.com/RSS.aspx?wealocations=wc:JAXX0043&weadegreetype=C&culture=ja-JP](http://weather.jp.msn.com/RSS.aspx?wealocations=wc:JAXX0043&weadegreetype=C&culture=ja-JP)
取得したい地域に応じてJAXXのコードが変わることになります。
feedparserはpipで楽々インストールしたのですが、使い方をググっていると自前コンパイルされてる方も結構いらっしゃったようですが違いは不明です。(バージョン確認したらPython2.7.3 feedparser5.1.3でした。。)
降水確率の部分だけ都合よく囲いに入っていないため強引に取り出しています。


海外の情報だと失敗するのに修正　2013/09/12

```python:海外対応.py

        sozai = feedparser.parse("http://weather.jp.msn.com/RSS.aspx?wealocations=wc:%s" % self.code)
        prob = sozai['entries'][1].summary
        regx = re.compile(u':\s\d*%')
#        data = (regx.findall(prob)[0], regx.findall(prob)[1])
#okk        kousui_t = u"今日の%sは%sで明日は%sくらい。" % (self.name, regx.findall(prob)[0], regx.findall(prob)[1])
        kousui_t = u"今日は降水確率%sで明日は降水確率%sくらい。" % (regx.findall(prob)[0], regx.findall(prob)[1])

```

修正前は日本語情報限定になっており海外の地域で日本語がない場合に失敗するので、日本国内でも英語で取得して日本語は投稿用の作文時に補完をするように
Oracleの共有サーバー設定

## 初期化パラメータを確認

```sql
  SQL> show parameters dispatchers

  SQL> show parameters shared_servers
  NAME                     TYPE        VALUE
  ------------------------ ----------- ------------------
  max_shared_servers       integer     
  shared_servers           integer     1
```

## Dispatcher属性を変更

```sql
  SQL> alter system set dispathcers = '(PROTOCOL=TCP) (DISPATCHERS=5)';
```

## SQL*Plusで共有サーバーに接続していることを確認

```sql
  SQL> select servers from v$session where sid = USERENV('SID');
  SERVER
  ----------------------
  SHARED

  (DEDICATEDの場合は専用サーバー接続)
```
Google Playでタブレットからダウンロードさせない様にする

タブレット非対応にしたくても、設定一個でやってくれないAndroid。

サイズ指定はAndroidManifest.xmlで設定できます。

こんな感じ。

```xml:
<compatible-screens>
        <screen
            android:screenDensity="hdpi"
            android:screenSize="normal" />
        <screen
            android:screenDensity="xhdpi"
            android:screenSize="normal" />
        <screen
            android:screenDensity="480"
            android:screenSize="normal" />
    </compatible-screens>
```

最近、xxhdpiの端末が出てきてるのに、
android:screenDensity="xxhdpi"
というプロパティが存在しません…
代わりにdpi値(480)を直接入れて解決。これでXperiaZとかも大丈夫。

ちなみに、Nexus7は 
android:screenDensity="hdpi" の android:screenSize="large"
に属してます。

基本的にタブレットはandroid:screenSize="large"なので
それ以外を定義していけば大丈夫なはずです。

後はお好みでsmallやmdpiを追加するなりして、
Google PlayのDeveloper Consoleから対応機種を目視で確認してみて下さい。
PXEブート用にtftp・DHCPサーバー搭載1CD Ubuntuを作った

tftp・DHCPサーバー搭載1CD Ubuntuを作った。(古いCPUでも動くようにi386にしときました。)

[download](https://docs.google.com/file/d/0B9DMkibBCBwORjcxVzF2RHE4Qk0/edit?usp=sharing) 637MB

内容
====

pxeブート用に以下を/srv/tftp/に同梱しました。

* Ubuntu 12.04.2 (32bit, 64bit)
* centos6.4 (32bit, 64bit)

/etc/dhcp/dhcpd.conf で切り替えてください。
手順はREADME を参照ください。わからない場合は・・・あきらめてください。

備考
====

* /home/remastersys/remastersys/ と /srv/tftp/ をsambaで共有フォルダにしています。
* HDDにインストールするには`ubiquity`を起動してください。
* id:pass=vagrant:vagrant
* 自動ログインが気持ち悪い人は、 `/etc/init/tty1.conf `を編集か削除してください。
* 初期ユーザーを消したい場合は、代わりのユーザーを作った後`userdel -r vagrant`してください。
* `/etc/init.d/isc-dhcp-server stop`してからじゃないとうまく動かないかも？？


README
====

```bash:/srv/tftp/README.md
追加パッケージ
====
* samba ssh etckeeper vim i3 ibus-mozc xinit thunar xfce4-terminal firefox 
* tftpd-hpa dhcp3-server

tftpディレクトリ
====
* /srv/tftp

remastersys使い方
====
* remastersys clean
* remastersys backup


# pxeブートの手順
###
# 1nicの場合
# ====
# * 192.168.13.101 --- eth0 のIPアドレスに指定。
#
# dhcpd起動
# ----
# $ sudo /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf eth0

###
# 2nicの場合
# ====
# * 192.168.13.101 --- eth1 のIPアドレスに指定。
#
# ifconfig
# ----
# $ sudo ifconfig eth1 192.168.13.101 netmask 255.255.255.0 up
# 
# ip masquerade設定
# ----
# $ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
#
# dhcpd起動
# ----
# $ sudo  /usr/sbin/dhcpd -f -cf /etc/dhcp/dhcpd.conf eth1

###
# 備考
# ====
# * インストーラ中にIPアドレスの自動取得ができたら、DHCPサーバを終了して構いません。
# * もしくは、インストーラが起動したら後はLANケーブルをこのPCから外してHUBに刺して構いません。

###
# centos6.4のインストール時に指定するURL
# ====
# * i386    http://ftp.riken.jp/Linux/centos/6.4/os/i386/
# * x86_64  http://ftp.riken.jp/Linux/centos/6.4/os/x86_64/

# /etc/dhcp/dhcpd.conf
# ====
# 1nicの場合:eth0に割り振ったIPに書き換えてください。
# 2nicの場合:eth1に割り振ったIPに書き換えてください。
option routers 192.168.13.101;

option subnet-mask 255.255.255.0;
option domain-name-servers 8.8.8.8;

subnet 192.168.13.0 netmask 255.255.255.0 {
	range 192.168.13.101 192.168.13.109;
        #filename "/i386/ubuntu1204.2/pxelinux.0";
        #filename "/x86_64/ubuntu1204.2/pxelinux.0";
        filename "/i386/centos6.4/pxelinux.0";
        #filename "/x86_64/centos6.4/pxelinux.0";
} 
```
Redisのダンプ取得

多少古いデータでも構わなければ、redis.confで指定した頻度で dump.rdb が更新されているが、RedisのBGSAVEコマンドを実行し、LASTSAVEが更新されるのを待つ。 これでdump.rdbが最新の状態となる。

* https://gist.github.com/nekoruri/6238957

```bash:redis_bgsave.sh
#!/bin/bash
 
# RedisのBGSAVEコマンドを実行し、redis.rdbが更新されるのを待つ。
# タイムアウト時間を超えたら exit status 1 で終了する。
 
TIMEOUT=30
 
# Timeout handler
# http://stackoverflow.com/questions/1226094/how-to-include-a-timer-in-bash-scripting
set_timer() {
        trap handle_timer ALRM
        (sleep $TIMEOUT; kill -ALRM $$)&
        timer_pid=$!
}
 
unset_timer() {
        kill $timer_pid
        trap - ALRM
}
 
handle_timer() {
        exit 1
}
 
 
export PATH=/bin:/usr/bin
 
set_timer
 
# 丁度この瞬間に組込のBGSAVEが走る可能性があるので、
# BGSAVEの前にLASTSAVEを取得
LASTSAVE=`redis-cli LASTSAVE`
 
redis-cli BGSAVE
 
# LASTSAVEが変わるまで待つ。
while [ $LASTSAVE == `redis-cli LASTSAVE` ]; do
        sleep 1
done
 
unset_timer
```

あとは /var/lib/redis/dump.rdb (もしくはその他の場所) を好きにすれば良い。
UbuntuでSandSをxcape+xmodmapで実現する

# 概要
UbuntuでSandS（SpaceキーをShiftキーとして使う技）を実現します．xcapeというツールとxmodmapの合わせ技で利用できることがわかりました．[alols/xcape](https://github.com/alols/xcape)からxcapeをインストールし，次のようなコマンドを打ちます．

```bash
  $ xmodmap -e 'keycode 255=space'; xmodmap -e 'keycode 65=Shift_L'; ~/opt/xcape/xcape -e '#65=space'
```

以下，詳細です．

# はじめに
SandSを実現する方法として[SandS を linux に導入できる At Home Modifier が大変便利である件 - どせいけいさんき。](http://d.hatena.ne.jp/xr0038/20120603/1338683035)を見つけました．しかしながら，[At home modifier - Home - Open wiki - Gitorious](https://gitorious.org/at-home-modifier/pages/Home)を見ると，At Home Modifierの作者さんはxcape（[alols/xcape](https://github.com/alols/xcape)）に移行することを薦めておられます．ただ，xcape単体ではSandSを実現することはできなさそうでしたので，その方法を調べてみることにしました．

# xcapeとは？

READMEによるとxcapeとは

```
xcape allows you to use a modifier key as another key when pressed and released on its own. 
```

だそうです．つまり，ShiftキーやControlキーを他のキーに変換するツールです．起動すると常駐し，デフォルトではControlキーをただ押して離すとEscapeキーに変換してくれます．VimでEscapeキーを多用するような場合に便利そうですね．

# SandS実現の手がかり
## xmodmapとの組み合わせ

ところが，今実現したいことはSandSですから，Spaceキーを押している間に他のキーを押すと「Shift＋他のキー」にしてくれるという機能です．これは，xcapeの機能ではできなさそうです．では，どうしたらよいのでしょう？そのヒントはxcapeのREADMEの下の方にありました．

```
If your s key has the code 42 and your l key 43 and you have set both to AltGr (a.k.a. ISO_Level3_Shift) with xmodmap, then this will generate the ordinary letters when pressed and released on their own.
```

で，この文中の「this」というのは

```bash
xcape -e '#42=s;#43=l'
```

というコマンドです．つまり，まず，xmodmapで予めキーボードの「S」と「L」にShiftキーを割り当て，その上で，SとLが単体で押された場合はもともとの文字をxcapeに出力させればよい，ということです．

## xmodmapと組み合わせる場合の注意点

さて，READMEにはxmodmapとxcapeを組み合わせる場合の注意点が書いてあります．

```
The key you wish to send must have a defined keycode. So for example, with the default mapping Control_L=Escape, you still need an escape key defined in your xmodmap mapping. (I get around this by using 255, which my keyboard cannot send).
```

つまり，もともとのキーコードを示すシンボルは，keycode=255として保存しておいてね，ということだそうです．

# SandSの実現
## xcapeのインストール

原理はわかりましたので，xmodmap+xcapeによりSandSを実現しましょう． まずは，インストールです．xcapeコマンドは~/opt/xcapeにおくことにしました．

```bash
  $ mkdir -p ~/opt/xcape
  $ cd ~/opt/xcape
  $ git clone https://github.com/alols/xcape.git .
  $ make
```

## key codeを調べる

xcapeをデバッグモードで起動します．

```bash
  $ ~/opt/xcape/xcape -d
```

そして，Spaceキーを押すとkey codeが出力されますので確認します．私の場合，65でした．

## 設定する

以下のone linerを打ちます．

```bash
  $ xmodmap -e 'keycode 255=space'; xmodmap -e 'keycode 65=Shift_L'; ~/opt/xcape/xcape -e '#65=space'
```

上のコマンドはワンライナーとして一気呵成に入力しないと，2番目のxmodmapコマンド実行後，Spaceキーが入力できなくなるので気をつけましょう．shellスクリプトにしておくのが良さそうです．

# おわりに

xcapeのREADMEの読解に少々苦労しましたが，わかってみたらわりと簡単にSandSができました．ただ，今までxmodmapを使ったことのない方は少々戸惑われるかもしれません．また，READMEにある通り，「S」や「L」キーをシフトにするのも面白そうです（私はDvorakユーザですので，「O」と「N」ですかね）．
YAMLのブーリアン

```ruby
YAML.load <<EOC
hoge:
  yes: 1
  no: 2
EOC
=> {"hoge"=>{true=>1, false=>2}}
```

```ruby
YAML.load <<EOC
hoge:
  on: 1
  off: 2
EOC
=> {"hoge"=>{true=>1, false=>2}}
```

便利（ぇ

これはYAMLの仕様なので [*1] 仕方ない。例えば以下のように回避できる。

```ruby
YAML.load <<EOC
hoge:
  "yes": 1
EOC
=> {"hoge"=>{"yes"=>1}}
```


---

[*1] [Boolean Language-Independent Type for YAML™ Version 1.1](http://yaml.org/type/bool.html)
Vagrantのboxなどが格納されるディレクトリを変更する

Vagrantはダウンロードされたboxなどの情報を標準では下記のパスに格納する。

**Mac**
*/Users/hogehoge/.vagrant.d

**Windows**
*C:\Documents and Settings/hogehoge/.vagrant.d

ユーザー名に空白や全角文字が含まれているとバージョンによってはうまく動作しない場合がある。これを回避するにはユーザー名を変更するか環境変数 VAGRANT_HOME をセットする事で任意のパスに情報の格納先などを変更できる。
railsでめげたruby初心者によるpadrinoメモ　[チュートリアル写経編]


## rubyで勉強にフレームワークを探していた

rubyを勉強するのにあたり一番始めは
「やっぱrailsか」と思ったのですがドキュメントたくさんありすぎてめげそうになったし
最近は[Ruby on Rails を勉強しない方が良い100の理由](http://ledsun.hatenablog.com/entry/2013/07/24/112644)とかもみたのでじゃあrubyでフレームワークどれがいいのよと思ったのですが
一番始めは
[sinatra](http://www.sinatrarb.com/intro-jp.html)で勉強してたのですがあまりにもシンプルすぎてもう少し大規模向けなフレームワークがいいなぁと思っていた

### 自分がやりたいこと

* API系いっぱい使いたいし
* ある程度大規模なものも考慮したサイト構築したいし
* ディレクトリ構成とか考えるのがダルいし

と思っていたらsinatraベースのフレームワーク[padrino](http://jp.padrinorb.com/)を見つけたのでメモ


## 参考にしたサイト

* [padrino　日本語サイト](http://jp.padrinorb.com/)　padrinoの公式翻訳サイト
* [Padrinoをオススメする6つの理由](http://qiita.com/kakkunpakkun/items/488f2d427fc77ba61470) padrinoとは何か？的な解説です。

## 事前準備

* ruby (バージョンは特に明記されていませんが 1.9*くらいからだと思われる) 
* gem



## [padrinoを選んだ理由その１] generateコマンドがある

generateコマンドとかでとにかく楽したかった

## [padrinoを選んだ理由その2] activerecordが使える

activerecord信者ではないですがこれもgenerateコマンドのオプションで使えるから楽できる

## [padrinoを選んだ理由その3] ドキュメントがシンプル

これがデカい 


## padrinoのチュートリアル

本家をそのまま写経しただけ
[Blog Tutorial](http://jp.padrinorb.com/guides/blog-tutorial)

## インストール方法

gemコマンドで

```shell
gem install padrino
```

bundler経由なら

```Gemfile
gem 'padrino'
```

これで完了

## Blog Tutorialを写経してみる

まずはプロジェクト自体を作成する

```shell
padrino g project プロジェクト名 -t rspec -e haml -c sass -s jquery -d activerecord -b
```

#### オプションの説明
* -t テストモジュールの指定 公式はshouldaでやっているがここは歴史あるrspecでも可能
* -e テンプレートエンジンの指定色々指定できるらしい
* -c sassオプション？？？
* -s javascriptライブラリの選択
* -d dataストアのライブラリの選択 activerecordを選択している

```shell
cd プロジェクト名
```

## 管理画面を作成する

generatorを使用して作成する

```shell
padrino g admin
bundle install
```

## DB回りを設定する

デフォルトはsql-liteで設定されてるっぽい

```shell
padrino rake ar:create
padrino rake ar:migrate
padrino rake seed
```

seedコマンド打つと管理画面のユーザーアドレスとパスワード聞かれるので各自適当に打つ

## WEBサーバーを起動

```shell
padrino start
```

## 確認

ブラウザでlocalhost:3000にアクセスしましょう

padrinoはシンプルで良さげかもと思うruby初心者です
トライ木による大量ワードに対するマッチング処理

以前どっかの仕事で必要になったので休日に書いたコードです。

どうしても期待するパフォーマンスが出なくて試行錯誤の結果こうなりました。トライ木というデータ構造の名前がついているのは後から知ったもの。（[http://ja.wikipedia.org/wiki/トライ木](http://ja.wikipedia.org/wiki/トライ木)）

マッチするかどうかのインターフェイスを以下のように定義するとして、

```java:Macher.java
package search;

/**
 * 文字列に対するマッチ処理を行うためのインターフェイス。
 */
public interface Matcher {
	boolean match(String target);
}
```

こんな感じのコードを用意。

```java:TreeMacher.java

package search;

import java.util.HashMap;
import java.util.Map;

/**
 * マッチ対象の文字列集合を前処理し、ツリー構造で保持する。
 * NGワードチェックなど、マッチ対象の文字列集合がほぼ静的に決定されるケースで高速に動作する。
 */
public class TreeMatcher implements Matcher{

	private CharTreeNode rootNode = null;
	
	public TreeMatcher(String[] words){
		this.rootNode = new CharTreeNode(null);
		this.rootNode.addWords(words);
	}

	/**
	 * マッチ処理を行う。
	 */
	public boolean match(String target){
		CharTreeNode currentNode = null;
		for(int i=0;i<target.length();i++){
			currentNode = this.rootNode;
			for(int k=0;i+k<target.length();k++){
				Character c = target.charAt(i+k);
				currentNode = currentNode.child.get(c);
				
				if(currentNode == null){
					break;
				}
				
				if(currentNode.end){
					return true;
				}
			}
		}
		return false;
		
	}
	
	/**
	 * ツリー構造を保持する内部クラス。
	 *
	 */
	static class CharTreeNode {
		boolean end = false;
		Character value;
		Map<Character,CharTreeNode> child = new HashMap<Character, CharTreeNode>();
		CharTreeNode(Character value){
			this.value = value;
		}
		
		void addWords(String[] words){
			for(String word : words){
				this.addWord(word);
			}
		}
		
		void addWord(String word){
			addWord(word,this);
		}
		
		static void addWord(String value, CharTreeNode parent){
			if(value == null || value.length() < 1){
				parent.end = true;
				return;
			}
			
			if(parent == null || parent.end){
				return;
			}
			
			Character firstLetter = value.charAt(0);
			CharTreeNode current = null;
			if(parent.child.containsKey(firstLetter)){
				current = parent.child.get(firstLetter);
			}else{
				current = new CharTreeNode(firstLetter);
				parent.child.put(firstLetter,current);
			}
			
			current.addWord(value.substring(1,value.length()));
		}
	}
}
```

マッチさせたい文字列のパターンが数万とかあったりする時、ベタな `String#contains` によるチェック処理の100倍くらいのパフォーマンスが出ます。

ただ前処理が重いのとメモリ食います。

ご利用は計画的に。
プロキシーの内側でnpm installする

```
$ npm config set proxy http://proxy.company.co.jp:8080
```

これで設定がユーザフォルダの下の **.npmrc** というファイルに書き込まれる。
それだけ！

-----
ブログやってます：[PAPA-tronix !](http://weed.cocolog-nifty.com/wzero3es/)
Maven + eclipse + djunit

メモ

```xml:
<?xml version="1.0"?>
<project
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
	xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
	<!-- 略 -->
	<build>
		<!-- 略 -->
		<plugins>
			<plugin>
				<artifactId>maven-surefire-plugin</artifactId>
				<configuration>
					<argLine><![CDATA[ -Djava.system.class.loader=jp.co.dgic.testing.common.DJUnitClassLoader -Djp.co.dgic.eclipse.virtualmock.usevirtualmock=true -Djp.co.dgic.eclipse.coverage.usecoverage=true -Djp.co.dgic.eclipse.project.source.dir=${project.build.sourceDirectory} -Djp.co.dgic.eclipse.virtualmock.ignore.library=false -XX:-UseSplitVerifier]]></argLine>
					<additionalClasspathElements>
						<additionalClasspathElement>
							<![CDATA[./testlib/djunit.jar]]>
						</additionalClasspathElement>
						<additionalClasspathElement>
							<![CDATA[./testlib/jakarta-oro-2.0.7.jar]]>
						</additionalClasspathElement>
						<additionalClasspathElement>
							<![CDATA[./testlib/jcoverage-djunit-1.0.5.jar]]>
						</additionalClasspathElement>
					</additionalClasspathElements>
					<forkMode>always</forkMode>
					<useSystemClassLoader>true</useSystemClassLoader>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<!-- 略 -->
</project>

```
CDATA部分は改行しない。
Rubyで、D言語風にassertionを直書きする簡易unit test

まあ、なんと云ふか、めんどくさかったりするし、[D言語のunittest block](http://dlang.org/unittest.html)が羨ましかったりするし(〃l _ l)
assertion丈使ひたいので、[Module: Test::Unit::Assertions (Ruby 2.0)](http://www.ruby-doc.org/stdlib-2.0/libdoc/test/unit/rdoc/Test/Unit/Assertions.html)を読み込む。
下記を読めば解る。

```rb:
$DEBUG = true

# @param test_name [String]
def unittest test_name, &proc
  if $DEBUG
    proc.call
    puts "#{test_name} ok."
  end
end
if $DEBUG
  require 'test/unit/assertions'
  include Test::Unit::Assertions
end

unittest 'test of test' do
  assert_equal 2, 1 + 1
end
```

<i>cf.</i> [Rubyで、D言語風にassertionを直書きする簡易unit test - c4se記：さっちゃんですよ☆](http://c4se.hatenablog.com/entry/2013/08/15/022137)
jQuery で多言語切り替え

#ゴール#
[日本語 ←→ 英語] の表示をワンクリックで切り替えたい。それも読み込み無しで。

#レシピ概要#

1 UIはトグルスイッチのライブラリを探してきて使います
2 両言語のコンテンツを読み込んでから、必要なもの以外を非表示にすることで実現
3 言語情報をセッションに保持して他のページに行っても維持する

##1. UIのトグルスイッチ##
Simon Tabor 氏作成の jQuery Toggles (http://simontabor.com/toggles/ )を使います。

```html:smarty.tpl
<div id="language-swicher" class="toggle-light" ></div>

<script type="text/javascript">
jQuery(function() {
	$('#language-swicher').toggles({
		text:{on:'日本語',off:'English'},
	});
	$('#language-swicher').on('toggle', function (e, active) {
		if (active) {
			showLanguage('jp');  // 日本語を表示 詳細後述
		} else {
			showLanguage('en');  // 英語を表示
		}
	});
	showLanguage('jp');  // デフォルトで日本語を表示
</script>
```
**$(セレクタ).toggles();** を空div要素に実行するだけでトグルスイッチになる優れもののライブラリです。
**$(セレクタ).on('toggle', function (e, active) {});** は、トグルが実行された際のコールバック関数。
**showLanguage();** については後述します。

スタイルを調整してこんな感じのトグルスイッチができました。
![cap_merge2.PNG](https://qiita-image-store.s3.amazonaws.com/0/20500/8a7e9356-6807-0da6-6445-4f152c9be19b.png)

##2-1. ページには両言語のコンテンツを読み込む##
要は以下のようなHTMLを書くということです。

```html:html
<h1 class="jp">日本語見出し</h1>
<h1 class="en">English Title</h1>
<p class="jp">日本語の本文です。日本語の本文です。日本語の本文です。日本語の本文です。</p>
<p class="en">Text in English. Text in English. Text in English. Text in English. Text in English. </p>
```

##2-2. 必要なもの以外を非表示にする##
前述の showLanguage(); で、任意のクラス名だけを表示させます。

```js:showLangage()
// 言語切り替え
function showLangage(lang) {
	var langSet = ["jp", "en"];		// 切り替え対象の locale リスト
	for (var i = 0, len = langSet.length; i < len; i++) {
		if (lang === langSet[i]) {
			$('.' + langSet[i]).show();
		} else {
			$('.' + langSet[i]).hide();
		}
	}
	setLang(lang);	// セッション保持：後述
}
```

##3-1.言語情報をセッションに保持##
言語切替スイッチを操作した際に、選んだ言語をセッションに保持します。
showLangage() で言語の表示切り替えが終わってから、 setLand() を実行します。

```js:setLang()
// 言語設定をセッションに保存する
function setLang(lang) {
	$.post(
		'session_set.php',
		{
			'lang': lang
		},
		function(data){
			// 特に何もしない
		}
	);
}
```

これは単純に session_set.php に lang をパラメータにリクエストをしているだけです。
各フレームワークで標準のセッション管理を行なって下さい。

```php:session_set.php 
<?php
session_start();
$_SESSION['lang'] = $_REQUEST['lang'];
// サンプルのため 動作未確認です
?>
```

##3-2. 他のページに行っても言語切り替えを維持する##

トグルスイッチまわりの記述に以下のように追記します。

```html:smarty.tpl
<div id="language-swicher" class="toggle-light" ></div>

<script type="text/javascript">
jQuery(function() {
	$('#language-swicher').toggles({
		text:{on:'日本語',off:'English'},
		// 追記ここから : トグルの初期選択状態
		<!--{if $session.lang == "en"}-->
			on: false
		<!--{else}-->
			on: true
		<!--{/if}-->
		// 追記ここまで
	});
	$('#language-swicher').on('toggle', function (e, active) {
		if (active) {
			showLanguage('jp');  // 日本語を表示 詳細後述
		} else {
			showLanguage('en');  // 英語を表示
		}
	});
	// 追記ここから : ページ読み込み時にセッション値に応じて表示を切り替え
	<!--{if $session.lang == "en"}-->
		showLanguage('en');  // 英語を表示
	<!--{else}-->
		showLanguage('jp');  // 日本語を表示
	<!--{/if}-->
	// 追記ここまで
</script>
```

**< !--{if}-- >< !--{else}-- >< !--{/if}-- >** はSmartyタグです。他のテンプレートエンジンやPHP記述でも実現可能です。

#動作例#
http://i-yan.com/world_food/
ruby2.0 で "rails c" が動かないときの対処

#前提
Ruby2.0 をソースからインストールした状態。CentOS にて。

# 問題
rails c が使えない／(^o^)＼

```text
$ rails c
/usr/local/lib/ruby/2.0.0/irb/completion.rb:9:in `require': cannot load such file -- readline (LoadError)
        from /usr/local/lib/ruby/2.0.0/irb/completion.rb:9:in `<top (required)>'
        from /usr/local/lib/ruby/gems/2.0.0/gems/railties-3.2.13/lib/rails/commands/console.rb:3:in `require'
        from /usr/local/lib/ruby/gems/2.0.0/gems/railties-3.2.13/lib/rails/commands/console.rb:3:in `<top (required)>'
        from /usr/local/lib/ruby/gems/2.0.0/gems/railties-3.2.13/lib/rails/commands.rb:38:in `require'
        from /usr/local/lib/ruby/gems/2.0.0/gems/railties-3.2.13/lib/rails/commands.rb:38:in `<top (required)>'
        from script/rails:6:in `require'
        from script/rails:6:in `<main>'
```

#対処
Ruby2.0 のソースの ext/readline まで移動してビルド・インストールすればOK

```text
# yum -y install readline-devel
# cd /path/to/ruby-2.0.0-p247/ext/readline
# ruby extconf.rb
# make
# make install
```

#対処結果

```text
$ rails c
Loading development environment (Rails 3.2.13)
irb(main):001:0> 
```

やったぜ!!＼(^o^)／
Random Ruby Quiz –– Find Consecutive numbers in array

Find consecutive numbers in a and return as above.

```rb:question
find_consecutive [1,2,3,5,6,9,10,2,3,4]
=> [[1, 2, 3], [5, 6], [9, 10], [2, 3, 4]]
```

__Solutions:__

```rb:solution_1
def find_consecutive list
  last = nil
  flip = false
  list.chunk do |e|
    flip ^= !(last and e == last + 1)
    last = e
    flip
  end.map &:last
end
find_consecutive [1,2,3,5,6,9,10,2,3,4]
```

```rb:solution_2
def find_consecutive(list)
  list.inject([]) do |l, e|
    ( l != [] and l[-1][-1]+1 == e ) ? l[0..-2]+[l[-1]+[e]] : l+[[e]]
  end
end
```

```rb:solution_3v1
def find_consecutive(list)
  (1..list.size).zip(list).chunk { |l,r| l-r }.map { |_,e| e.map &:last }
end
```

```rb:solution_3v2
def find_consecutive(list)
  list.each_with_index.chunk { |l,r| l-r }.map { |_,e| e.map &:first }
end
```

```rb:solution_4
def consecutive?(x,y)
  x && y && (x-y).abs == 1
end

def find_consecutive(list)
  list.reduce([]) {|accu, num| consecutive?(accu.flatten.last, num) ? (accu.last << num; accu) : accu << [num] }
end
```

```rb:solution_5v1
def find_consecutive(list)
  list.slice_before([0]){ |e,l| e-1 != (l<<e).shift }.to_a
end
```

```rb:solution_5v2
def find_consecutive(list)
  list.slice_before([]){ |e,l| e-1 != (l<<e)[-2] }.to_a
end
```
Did this twist your brain a little? 

^_^
Elasticsearch用語の適当なまとめ


注：古いです（es1.0か0.90くらいのときに書いたもの）

[glossary](http://www.elasticsearch.org/guide/reference/glossary/)の超適当まとめ
死ぬほど初心者です。お気づきの点がございましたらご指摘の程よろしくお願い致します。

* analysis  
全文をtermに変換する処理
* cluster  
同一の名前を持つnodeの集合
* document  
elasticsearchに保存されるjsonデータ。RDBにおける行みたいなもん
* id  
documentの識別子
* field  
RDBにおけるカラムみたいなもん。ネスト構造も許可
* index  
RDBにおけるデータベースみたいなもん。typeを定義するmappingを複数持てる。論理的な名前空間で、1つ以上のprimary shardにマッピングされ、0個以上のreplica shardを持つことができる
* mapping  
RDBにおけるスキーマ定義みたいなもん。全てのindexは、index内のtypeを定義したmappingを持つ。明示的に指定することもできるし、自動で生成することも可能
* node  
elasticsearchインスタンスを実行している単位。1サーバ上に複数ノードを起動できるが、テスト以外では、1サーバ1ノードにした方が良い
* primary shard  
documentはprimary shardに保存される。documentをインデックスするとき、まずprimary shardに保存され、その後replica shardに反映される。デフォルトでは1indexに5個のprimary shardを持つ。数は設定可能だが、一度作成したindexのprimary shardの個数は変更できない
* replica shard  
primary shardのコピー。primary shardは0個以上のreplicaを持てる。primaryが死んだ時にreplicaがprimaryに昇格できるため、フェイルオーバーできる。また、参照系はprimaryかreplicaが対象になるので、パフォーマンス向上になる。デフォルトではprimary shardは1つのreplicaを持つが、数は動的に変更可能。replicaはprimaryと同一nodeに作られることは無い
* routing  
documentをインデックスすると、1つのprimary shardに保存されるが、そのshardは「routing」値をハッシュ化した値で選択される。デフォルトでは、「routing」値はdocumentのidから導出されるが、親を持つようなdocumentの場合は親のidが利用され、親子が同一shardに配置されることを保証する。routingはインデックス時や、mapping設定で上書き可能
* shard  
Luceneインスタンス。elasticsearchによって管理されるworker。indexはprimary shard、replica shardを指す論理的な名前空間と言える。shardの数を設定する時以外で、shardを直接参照する必要はなく、代わりにindexを扱う方が良い。elasticsearchはcluster内の全てのnode間でshardを分散する。nodeの障害時や、新規ノードの追加時には自動でshardを移動することができる
* source field  
デフォルトでは、参照リクエストに対して、documentを「_source」フィールドに保存して返す。
* term  
elasticsearchにインデックスされた値。foo, Foo, FOOは等価では無い。termクエリを使って検索できる。
* text  
普通の構造化されていないテキストデータ。デフォルトではtextはanalyzeされtermに変換され、indexに保存される
* type  
RDBにおけるテーブルみたいなもん。documentを特徴付けるfieldのリストから構成される。mappingはdocumentの各fieldがどのようにanalyzeされるかを定義する

    > Initially, we spoke about an “index” being similar to a “database” in an SQL database, and a “type” being equivalent to a “table”.
    > This was a bad analogy that led to incorrect assumptions.
    [Removal of mapping types | Elasticsearch Reference [6.0] | Elastic](https://www.elastic.co/guide/en/elasticsearch/reference/current/removal-of-types.html)

    だそうです
Install Redmine 2.3.2 on Wdows XP with Ruby 2.0.0

1.　[RubyInstaller for Windows](http://rubyinstaller.org/) から Ruby 2.0.0 をダウンロード。
2. 　ダウンロードした exe ファイルを実行して、Ruby をインストールする。
3.　[RubyInstaller for Windows](http://rubyinstaller.org/) から DevKit-mingw64-32 をダウンロード。
4.　ダウンロードした exe ファイルを実行して、C:\DevKit に解凍する。
5.　以下の順でコマンドを実行する。

```bat:
cd C:\DevKit
ruby dk.rb init
ruby dk.rb install
```

6.　[Download - Redmine](http://www.redmine.org/projects/redmine/wiki/Download) を見て Redmine 2.3.2 を入手する。
7.　MySQL に対して MySQL に対して以下のコマンドを実行する。

```sql:
CREATE DATABASE redmine CHARACTER SET utf8;
CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'my_password';
GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost';
```

8.　ダウンロードした  Redmine のフォルダ内の config/database.yml.example をコピーして config/database.yml を作成し、中身を以下のように書き換える。
9.　以下のコマンドを実行し、bundler をインストールする。

```bat:
gem install bundler
```

10.　以下のコマンドを実行し、mysql2 をインストールする（with-mysql-dir で指定するパスには MySQL がインストールされているフォルダを指定する）。

```bat:
gem install mysql2 -- --with-mysql-dir=\"C:Program Files\MySQL\MySQL Server 5.5\"
```

11.　Redmine のフォルダに移動して以下のコマンドを実行し、Redmine に必要なライブラリをダウンロードする。

```bat:
bundle install --without development test rmagick
```

12.　MySQL のインストールされているフォルダの lib/libmysql.dll を Ruby のインストールされているフォルダの bin フォルダ内にコピーする。
13.　Redmine のフォルダに移動して以下のコマンドを実行し、Redmine で使用されるランダムなキーを作成する。

```bat:
rake generate_secret_token
```

14.　Redmine のフォルダに移動して以下のコマンドを実行し、テーブルを作成する。

```bat:
set RAILS_ENV=production
rake db:migrate
```

15.　Redmine のフォルダに移動して以下のコマンドを実行し、デフォルトの設定情報をデータベースに登録する。

```bat:
set RAILS_ENV=production
set REDMINE_LANG=ja
rake redmine:load_default_data
```

16.　Redmine のフォルダに移動して以下のコマンドを実行し、アプリケーションサーバーを起動する。

```bat:
ruby script\rails server webrick -e prduction
```

17.　ブラウザで http://localhost:3000/ にアクセスする。
18.　ユーザー名：admin、パスワード：admin でログインする。
19.　終了
既存Linux環境をLXCに移す。

#自己流です。

本来のやりかたというのがどっかにあるならそちらを参照願います。

#LXCの導入

LXC(LinuX Containers)というのは、chrootの高級品です。（あれ？）
---つまり、仮想マシンを使わない、Linux on Linuxのことです。

ホスト側はubuntu13.04を使用します。（きっぱり）
ゲスト側もubuntuを仮定します。

 # apt-get install lxc lxctl
 # lxc-create -t ubuntu -n raring
 # lxc-start -d -n raring

ゲスト側として、ubuntu13.04よりも古いubuntuを生成したいなら、下の２行を
 # lxc-create -t ubuntu -n oneiric -- -r oneiric
 # lxc-start -d -n oneiric
のようにします。

移行させたい元のLinuxと同じかそれに近いバージョンのテンプレートを使用してコンテナを作成するのが吉です。

たったのこれだけで、ゲストOSが走るのですが、これに既存のLinuxを上書きして環境移行
しようというものです。

#既存Linuxのバックアップを取る。

/ (root)パーティション以下の /etcや/usrなどを個別にtarで固めます。
/devやら/procやら/mntは要りません。

#ゲストOSに上書きする。
ゲストOSを一回止めます。
 # lxc-stop -n oneiric
既存Linuxからバックアップして持ってきたtarを開きます。
 # cd /var/lib/lxc/oneiric/rootfs/
 # tar xpfz /path/to/src/etc.tgz
 # tar xpfz /path/to/src/usr.tgz
 ・・・

fstabを空にしておきます。
 # vi /var/lib/lxc/oneiric/rootfs/etc/fstab

ゲストOSとして動かす場合に明らかに不要なハードウェアサービスがあれば、起動しないようにしておきます。
 # vi /var/lib/lxc/oneiric/rootfs/etc/init.d/ ...
or.
 # vi /var/lib/lxc/oneiric/rootfs/etc/init/ ...

IPアドレスを変更する場合
 # vi /var/lib/lxc/oneiric/rootfs/etc/network/interfaces

そしてゲストOSを起動。
 # lxc-start -d -n oneiric

コンソールで繋いで見る。
 # lxc-console -n oneiric

コンソール脱出はCtrl-A , Q です。

#動かないとき

とりあえず、テンプレートで作ったほうの（動く）コンテナを保存しておいて、etcを差し替えたり
etc以下の違いをしらべて、やばそうなデーモンは動かさないようにします。

コンテナ側のvar/log/が丸見えで見えるので、そこを調べます。
lxc-startするときに -d オプションを付けずに起動させて、dmesgを見ればどこで止まるか分かります。（止まる直前までしかprintされませんけれど）

それから、コンテナを起動するときの環境変数LANGがja_JP.UTF-8でないとうまくいかないことがあります。

#動かない原因の大半は、Plymouth にあるようです。

/etc/init/plymouth.conf あたりの start on と書かれた行をコメントアウトして、プリマスが起動しないようにしておきます。

プリマス以外にも、コンテナにはおおよそ不要なハードウェアドライバーの起動が実行されていたら、全部offにして構いません。


#コンテナの弱点

~~ホストOSがubuntu12.04の場合、ゲストをshutdownさせると何をとち狂ったかホスト側の電源まで落ちます。~~
（2016-08追記:ホストU16.04 ゲストU14.04以上ならそんなことは起きなくなりましたが、古いゲストU10.10で試したら、落とせる場合があることがわかりました。原因は調べてませんが、もうU10.10を触ることはないです。）


~~あくまでもカーネルは１個しかないので、 iptablesを複数持つとか無理です。NICが複数枚あってゲストOSごとに
ルーティング変えたいとかも無理です。~~

~~それと、ゲスト側でdhcpdがうまく動きませんでした。~~

（2016-08追記:ホストU16.04で、ホスト側ではほぼ何も設定せず、LAN側NIC以外にはIPアドレスも与えない(iptablesを不要にするため)ようにして、ゲスト側にそれぞれiptablesやdhcpdを動かして運用できるようになりました。）

iptablesはホスト側とゲスト側の論理積で動くっぽいので、極力ホスト側では何もしないようにするのが吉です。


仮想ドライブイメージ作らないでいい点と、起動、終了が一瞬なのと、インスタンスをたくさん動かしても軽いという点でXenよりGoodです。
クローン作ったりも楽なので、Linuxお試し環境としていろいろ役立ちます。

（XenやKVM上で動いているレンタルLinux上に入れることだって出来ます。）
Console.WriteLine(10 == null);

#はじめに
タイトルからして、アレですが、実はコレコンパイルできます。（当然警告は出ますが）


元々、下記のようなコードを誤って書いてしまい、意図しない結果が生成されてしまったのがコトの発端でした。

```csharp:bug.cs
using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication9
{
	class Program
	{
		private static void Main(string[] args)
		{
			var someDictionary = new Dictionary<int, string>();

			//諸々の処理。
			//場合によっては、Valueにnull が入ることもある。

			//本当はこう書きたかった
			//foreach (var key in someDictionary.Where(elem=>elem.Value==null).Select(elem=>elem.Key))
			//{
			//	Console.WriteLine(key);
			//}

			//ところがどっこいこう書いた。
			foreach (var key in someDictionary.Where(elem => elem.Key == null).Select(elem => elem.Key))
			{
				Console.WriteLine(key);
			}
		}
	}
}
```

このような場合、コンパイルエラーになるんじゃ無いかと勝手に思い込んでいたのですが、実際に、上記のコードはコンパイル可能という結果になります。

コレがどうにも直感的では無かったので、なぜ上記のようなコード、極端な例として、タイトルのようなコードがC#においてコンパイルできてしまうのか、少し調べてみました｡

#なぜコレがコンパイルできてしまうのか？
（2014/07/18　変更）
これは、値型もまたSystem.Objectから派生している型なので、暗黙の型変換が行われるからであると考えられます。

#未解決の疑問
~~ 言語仕様を読み解きながら、なんでコレがコンパイルできてしまうのか追いかけてみた結果、
このへんてこなコードがコンパイルできるという結果に帰結したことが分かりました。

しかし、検証目的で以下のようなサンプルコードを考察した場合、未解決の疑問が残りました。

```csharp:exam.cs

namespace ConsoleApplication9
{
	public struct Equatable
	{
		public Equatable(int value)
			: this()
		{
			Value = value;
		}

		public int Value { get; set; }

		public override bool Equals(object obj)
		{
			if (obj == null || GetType() != obj.GetType())
			{
				return false;
			}

			return Value == ((Equatable) obj).Value;
		}

		public override int GetHashCode()
		{
			return Value.GetHashCode();
		}

		public static bool operator ==(Equatable x, Equatable y)
		{
			return x.Value == y.Value;
		}

		public static bool operator !=(Equatable x, Equatable y)
		{
			return x.Value != y.Value;
		}
	}

	public struct NotEquatable
	{
		public NotEquatable(int value)
			: this()
		{
			Value = value;
		}

		public int Value { get; set; }
	}


	internal class Program
	{
		private static void Main(string[] args)
		{
			var eq = new Equatable(10);

			//コレは警告が出るけど通る。
			var ret = eq == null;

			var neq = new NotEquatable(10);

			//コレはコンパイルエラー（CS0019）が発生する。
			ret = neq == null;
		}
	}
}
```

上記の検証コードから、 __op ==のオーバーロードの有無__で、コンパイル可能か否かが決定されるのでは無いかと推察できます。

最後に、なぜこのような差異が発生するのか推察してみたいと思います。
おそらく、これはコンパイラの構文解析ステージで、"neq"の後に続く"=="に到達した段階で、変数neqの型NotEquatable構造体が、op==のオーバーロードを持っていないために、nullに解析が到達する以前にコンパイラエラーを発生させて居るのでは無いかと推察します。

他方、eqの方はop==の演算子オーバーライドが存在するために、nullまで構文解析されその上で、暗黙のnull許容変換、nullリテラル変換が実行されて、結果的にコンパイル可能になっているのでは無いかと推察できます。
ストップウォッチ


ちょっとした練習問題。機能を付け加えようと思ったら、どこまでも付け加えられますが、必要ないので、最低限。
Tempの方は内部処理にちょっと時間がかかるのが問題だけど、改善するモチベーションがないｗ


```python
import time

class StopWatchLite(object):

    def __init__(self) :
        self.make = time.time()
        return

    def start(self) :
        self.st = time.time()
        return self

    def stop(self) :
        return time.time()-self.st

    def reset(self) :
        self.st = self.make
        return self

    def __str__(self) :
        return str( self.stop() )



class StopWatchTemp(object):
    """
    this can stop counting time temporally.
    """
    def __init__( self, verbose=0) :
        self.make = time.time()
        self.stac = []
        self.stat = "standby"
        self.verbose = verbose
        return

    def start(self) :
        self.stac = []
        self.stat = "running"
        self.st = time.time()
        return self

    def stop(self) :
        (self.stac).append( time.time() - self.st )
        self.stat = "stopped"
        return sum( _ for _ in self.stac )

    def reset(self) :
        self.st = self.make
        self.stat = "standby"
        self.stac = []
        return self

    def restart(self) :
        if   self.stat == "stopped" :
            self.stat = "running"
            self.st = time.time()
        elif self.stat == "standby" :
            if self.verbose >= 2 :
                print "start->stop->restart"
            if self.verbose >= 1 :
                print "regarding 'restart' as 'start'."
            return self.start()
        elif self.stat == "running" :
            if self.verbose >= 2 :
                print "start->stop->restart"
            if self.verbose >= 1 :
                print "regarding 'restart' as 'reset' and 'start'."
            return self.reset().start()

    def __str__(self) :
        return str( stop() )

def test():

    def wast_function(n):
        [ i for i in xrange(n) ]

    s = StopWatchLite()

    s.start()
    wast_function(1000000)
    t1 = s.stop()

    s.start()
    wast_function(1000000)
    t2 = s.stop()

    print t1,t2

    s = StopWatchTemp()

    s.start()
    wast_function(1000000)
    s.stop()

    s.restart()
    wast_function(1000000)
    t1 = s.stop()

    print t1

if __name__ == "__main__" :
    test()
```
Sublime Text で markdown をカラフルに

以下の設定で markdown がカラフルになります。

1. Package Control で [sublime-markdown-extended](https://github.com/jonschlinkert/sublime-markdown-extended) と [sublime-monokai-extended](https://github.com/jonschlinkert/sublime-monokai-extended) をインストール
2. .md を Open all with current extension as で Markdown Extended に設定。
3. Preferences -> Color Scheme -> Monokai Extended のどちらか好きな方に設定。
64bitのODP.NET（Oracle.DataAccess.dll）をVisualStudio（Web）で使う際に注意すべき３つのこと

`探せば出てきますが念のため・・・`

ODP.NET（Oracle.DataAccess.dll）の64bit版を使って、VisualStudioでWebアプリケーションを作る際に
以下の3つのことに注意すべし。

#ビルドプラットフォームをx64にすること

Any CPUだとAMD64なんたらかんたらと出て怒られます。必ずx64でコンパイルしましょう。
32bitのOracle.DataAccess.dllならばx86を設定しましょう。

#WebサーバーはIIS Expressを使用すること

デフォルトのプロジェクト設定ではVisualStudio内蔵の開発サーバーを立ち上げてデバックされます。
しかし内蔵サーバーは32bit空間で起動するため、「Oracle.DataAccess.dllが見つかりません」のようなエラーが出て動きません。
必ず、IIS Webサーバー（IIS Express）を使うように設定を変えましょう。

#IIS Expressを強制的に64bitで起動させる

IIS Expressもそのままでは32bitで起動し、上記と同じエラーが出ます。なのでレジストリをちょこっと弄って
64bitで起動するように変更してあげましょう。

変更（追加）するキーは
HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0\WebProjects
KeyName：Use64BitIISExpress
KeyType：DWORD
Value：1

`2012の場合。2010なら10.0の下に作る。`

これで、64bitでIIS Expressが起動し、VisualStudioからデバックできるようになります。
`プロセスでiisexpress.exeに(32)が付いてなければOK`
また、32bitで行いたい場合は上記キーを0にしてあげればOK

`このレジストリキーはMSアンオフィシャルなのは言うまでも無く・・・自己責任で。`
yumのレポジトリが httpsかつ証明書が不正な場合の無理やり許可する。


レアケースですが。。
sslverify=0 をつけることで、証明書のチェックをスキップする。


```
#cat example.repo

 [exampl]
 name=CentOS-$releasever - additional
 baseurl=https://yumrepo.example.com/centos/6/$basearch/
 enabled=1
 gpgcheck=0
 sslverify=0
```
dmraid on ICH10R controllers 

#RAID機能付きのintel系マザーボードにdmraidを入れたときの備忘録です。

-ICH-xxR系のRAIDはFakeRAIDと呼ばれているカテゴリーにあり、
BIOSとWindows側ドライバーのサポートがあってはじめてRAIDドライブとして使えるようになっているものです。
-Linuxではdmraidというパッケージを導入する必要があります。
-ubuntu13.04などでは、インストール時にRAIDを有効にするかどうか聞いてきますので、有効にすることでdmraidパッケージが自動的にインストールされます。


#前準備
-同容量のHDDを２台用意する。 
-チップセットがICH-xxR のように、後ろにRが付いたマザーを選ぶ。 
-SATAの設定をAHCIではなく「RAID」に設定する。 
-Intel RAID BIOSの設定に入る場合は電源ON後にCtrl + 「I」 を押す。 
-RAID BIOSに来たら、RAIDにしたいディスクペアを指定して、RAID1を選択。容量を指定する。

#はまりポイントその１：
-2TB以上のRAIDパーティションを作ると、BIOSでは容量は正しいのに、Linux内ではmodulo(2TB+α)のクソ容量になってしまいます。
##対策：
-BIOSから2TB未満サイズのRAIDパーティションを2個作ることで4TBまでのディスクを全部使えるようです。(RAID1を想定)


#はまりポイントその2：
-RAIDボリュームにgrubがインストール出来ずにOSが起動しない。
##対策:
これは、LinuxインストーラーからRAIDパーティションを選択したときのデバイス名を覚えておき、grub導入時に 
/dev/mapperと出たら、その後ろに/isw_Xxxxxx_Volume0 (Xxxxxxは自動生成されたパーティション名)と手動入力します。
-TABキーでは補完してくれません。
-メモしわすれたら [ALT]+[2]とかで別コンソールを開いて自分で調べることが出来ます。 
- ls /dev/mapper/

#RAID1の運用:
-raidのステータスを見るには
 # dmraid -s

#1台故障したら？
-ドライブが１台故障したら、degrade運用になりますが、慌てず騒がず、電源を切って故障したドライブを取り除いて再起動します。
-この状態でも普通のシングルドライブと変わりはありません。
-万が一、ドライブ交換作業に失敗したときのためにも、念のために別システムへバックアップを取っておきます。（プラン-Ｂですね）


-故障したドライブと同規格の新品SATAドライブを挿して、BIOS起動時にCtrl+Iを押してintel RAID BIOSのメニューを開きます。
-RAID1ドライブのペアを組みなおすドライブをどれにするかを自動的に聞いて来ますので、絶対に間違えないように、新品のSATAドライブを指定します。
-ESCでBIOSを抜けてubuntuを再起動すると、普通は自動的にRAID1が再構築されて通常通り使えるようになる、というのが常識ですが、dmraidではその常識は通用しないようです。

-手動で
 # dmraid --rebuild isw_Xxxxxx_Volume0
-(Xxxxxは実在する/dev/mapper/のデバイス名を指定します)
-を実行して、
 # dmsetup status
-のカウントアップ表示が１００％になり、
 # dmraid -s
-のステータス表示がok になれば、RAID1再構築は見事に成功です。


万一、ステータス表示がno syncやunknownになってしまったら、失敗です。
バックアップを元に、１からRAIDを構築しなおします。

dmraid、はやくバグ、直して欲しいものです。



#参考文献

dmraid fails to handle status set by ICH10R Bios
--- https://bugs.launchpad.net/ubuntu/+source/dmraid/+bug/619361

dmraid on ICH10R controllers (Ubuntu bug 372170 call for testing)
--- https://lists.ubuntu.com/archives/ubuntu-devel/2009-May/028237.html

TECHIE How to rebuild Intel Raid (isw) on Linux
--- http://techie.org/Blog/2010/09/03/how-to-rebuild-intel-raid-isw-on-linux/
Objective-Cでprivateなメソッドをオーバーライドする


superクラスのメソッドがprivateでどうしてもそれを継承先で上書きしたい場合、カテゴリで該当のメソッドを宣言しておいて実装することは可能。

具体的には、privateなメソッドhogeを持つSクラスに対して、Sを継承したクラスAの実装ファイルで次のようにする

```objectivec:
//Sのカテゴリを記述
@interface S (Hoge)

//カテゴリとしてhogeメソッドを宣言
- (void)hoge;

@end

@implementation A

- (void)hoge
{
    //カテゴリで宣言されてないとsuper hogeはエラーになる
    [super hoge];

    //ここで何かオリジナルなことをやる
    //....
}

@end
```

## どういう時に使うか

privateメソッドをオーバーライドしているので、この方法を積極的に使って良いとは言えないけど、例えば人が書いたソースコードなどでGitHubに上がってるわけでもなくforkできないし、記述をどうしても変更したくない(or変更できない)場合に本当に仕方なくやるならしょうがないかなと思うんですけどどうでしょうね…。
tmuxのバージョンを1.8にアップデートして、クリップボードの設定


現在のバージョン確認

```
tmux -V
tmux 1.7
```

アップグレード

```
brew upgrade tmux

tmux -V
tmux 1.8
```
アップグレードされてますね。

で、ここからが今回アップグレードしてみようと思った理由。
tmuxの1.8からcopy-pipeが導入されているらしい。
参考 http://robots.thoughtbot.com/post/55885045171/tmux-copy-paste-on-os-x-a-better-future

このおかげで、OSのクリップボードに取り込む処理が不要になっている。

tmux.confに以下を追加
（キーバインドを変更したい場合は変更してください。）

```
# Use vim keybindings in copy mode
setw -g mode-keys vi

# Setup 'v' to begin selection as in Vim
bind-key -t vi-copy v begin-selection
bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"

# Update default binding of `Enter` to also use copy-pipe
unbind -t vi-copy Enter
bind-key -t vi-copy Enter copy-pipe "reattach-to-user-namespace pbcopy"
```

これで、vで選択してyでクリップボードにコピーされます。
XDamageの使い方メモ

```c
#include <X11/extensions/Xdamage.h>
```
しといて、

```c
XDamageQueryExtension(xDisplay, &damageBase, &damage_err);
```
みたいにしてXDamageイベントの番号を取得する。窓を作った時に、

```c
dID = XDamageCreate(display, wID, XDamageReportNonEmpty);
```
のようにして窓に対してXDamageイベントを受け取る設定をしておくとXEventのtypeがdamageBase+XDamageNotifyのイベントが来るので、

```c
XDamageSubtract(display, e.damage, None, None);
```
※eはXDamageNotifyEvent
のようにしてイベントを受け取って処理したことを通知する。あとはXDagameNotifyEventのメンバ、area.x、area.y、area.width、area.heightに更新すべき領域が入っているので好きなように処理すればいい。

窓がなくなったりして不要になったら下のようにして領域を開放する。

```c
XDamageDestroy(display, dID)
```