OmniAICreator/Qiita-1.07M huggingface dataset:
Sublime 入れてるプラグイン


AdvancedNewFile
AutoFileName
Batch File
Color Scheme - Default
ConvertToUTF8
Hayaku - tools for writing CSS faster
LiveReload
Local History
Markdown
Markdown Preview
MarkdownEditing
Package Control
PlainTasks
SFTP
SideBarEnhancements
Sublime-Text-2-Image-Viewer
SublimeLinter
SublimePeek
Theme - Flatland
Theme - Soda

// ----------------- 131011_1338_追加

Aqua Theme
All Autocomplete
AdvancedNewFile
SublimeAllAutocomplete


// ----------------- 131213_追記
IndentGuides
DocBlockr



// ----------------- 131213_設定ファイル

```JSON:setting
{
	"afn_insert_width_first": true,
	"atomic_save": false,
	"auto_complete": true,
	"auto_complete_commit_on_tab": true,
	"auto_complete_delay": 30,
	"auto_complete_selector": "source - comment",
	"auto_complete_triggers":
	[
		{
			"characters": ".<",
			"selector": "source.cs"
		}
	],
	"auto_convert_line_endings_to": "Windows",
	"auto_indent": true,
	"binary_file_patterns":
	[
		"*.dds",
		"*.eot",
		"*.gif",
		"*.ico",
		"*.jar",
		"*.jpeg",
		"*.jpg",
		"*.pdf",
		"*.png",
		"*.swf",
		"*.tga",
		"*.ttf",
		"*.zip",
		"node_modules/**"
	],
	"caret_style": "phase",
	"color_scheme": "Packages/Theme - Cobalt2/cobalt2.tmTheme",
	"default_encoding": "UTF-8",
	"default_line_ending": "Windows",
	"draw_white_space": "all",
	"ensure_newline_at_eof_on_save": false,
	"file_exclude_patterns":
	[
		"*.pyc",
		"*.pyo",
		"*.exe",
		"*.dll",
		"*.obj",
		"*.o",
		"*.a",
		"*.lib",
		"*.so",
		"*.dylib",
		"*.ncb",
		"*.sdf",
		"*.suo",
		"*.pdb",
		"*.idb",
		".DS_Store",
		"*.class",
		"*.psd",
		"*.db"
	],
	"find_selected_text": true,
	"folder_exclude_patterns":
	[
		".svn",
		".git",
		".hg",
		"CVS"
	],
	"font_face": "Ricty-Regular",
	"font_options":
	[
		"directwrite"
	],
	"font_size": 17,
	"highlight_line": true,
	"highlight_modified_tabs": true,
	"ignored_packages":
	[
		"ActionScript",
		"ASP",
		"C++",
		"Color Scheme - Default",
		"D",
		"DocBlockr",
		"Git",
		"Go",
		"Java",
		"LaTeX",
		"Lisp",
		"LiveReload",
		"Objective-C",
		"R",
		"Vintage"
	],
	"line_padding_bottom": 1,
	"line_padding_top": 1,
	"margin": -8,
	"open_files_in_new_window": true,
	"rulers":
	[
		4,
		8,
		80
	],
	"scroll_past_end": true,
	"show_full_path": true,
	"show_line_endings": true,
	"smart_indent": true,
	"tab_size": 2,
	"theme": "Cobalt2.sublime-theme",
	"translate_tabs_to_spaces": true,
	"trim_automatic_white_space": false,
	"trim_trailing_white_space_on_save": true,
	"use_tab_stops": true,
	"word_separators": "./\\()\"':,.;<>~!@%^&*|+=[]{}`~?",
	"word_wrap": true
}


```


// ----------------- inputSe
IndentGuides
DocBlockr






// ------ 参考URL
http://matome.naver.jp/odai/2135695603157403601
gitでchmod変更は無視したい

Quick startとかに、まずスクリプト群を `chmod +x` しますとか書いてあって、実行権限つけたはいいけど、gitがそれを更新だと思ってしまって、git addすんのめんどくさくなりますよね。

```
git config core.fileMode false
```

From http://stackoverflow.com/questions/1580596/

へー！
確かに `man` に書いてある。
Mac OS X上でAndroid(NDK r9)用にLuajit 2.0.2をビルドする

Luajitとは何か、についてはごっそり省略。要は本家よりも速いLuaランタイム(2.0.2時点で5.1互換)。

かなり前にビルドしたのだけど、どうにも再度やる時にはすっかり頭から抜けているので書き残しておく。[Luajit公式のインストールガイド](http://luajit.org/install.html)に記載されている手順では微妙にうまくいかない(TARGET_SYS指定が抜けてるんだ多分)ので少々直して、いっそコピペでビルドできるようにしておこうという次第。シェルスクリプトにまとめるとかはお好みでどうぞ。

Android NDK r9をインストールしている環境と想定している。ANDROID_NDK_ROOT環境変数を事前に正しく設定しておくこと。

Luajit 2.0.2のソースを展開したディレクトリにて(その下のsrc/ではなく)、以下を実行。

```shell-session
OUTPUT_DIR=`pwd`/output-arm
NDKABI=9
NDKF="--sysroot $ANDROID_NDK_ROOT/platforms/android-$NDKABI/arch-arm"
NDKVER=$ANDROID_NDK_ROOT/toolchains/arm-linux-androideabi-4.8
NDKP=$NDKVER/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-
rm -rf $OUTPUT_DIR
make clean
make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF" TARGET_SYS=Linux
make install PREFIX=$OUTPUT_DIR

NDKABI=9
OUTPUT_DIR=`pwd`/output-x86
NDKF="--sysroot $ANDROID_NDK_ROOT/platforms/android-$NDKABI/arch-x86"
NDKVER=$ANDROID_NDK_ROOT/toolchains/x86-4.8
NDKP=$NDKVER/prebuilt/darwin-x86_64/bin/i686-linux-android-
rm -rf $OUTPUT_DIR
make clean
make HOST_CC="gcc -m32" CROSS=$NDKP TARGET_FLAGS="$NDKF" TARGET_SYS=Linux
make install PREFIX=$OUTPUT_DIR
```

output-armとoutput-x86の両ディレクトリに成果物が出力されて終了。途中でrm -rfとかやっているのが怖ければ適宜外して下さい。
中国語web技術用語集

|　　　Japanese　　　　|　　　Chinese　　　|　　　pinyin　|
|:-----------:|:------------:|:------------:|
|Mbps|节每秒|Jié měi miǎo|
|bps|比特每秒|Bǐtè měi miǎo|
|メガ(M)|兆丰|Zhào fēng|
|ギガ|千兆|Qiān zhào|
|HP(ヒューレットパッカード)|惠普|Huìpǔ|
|DELL|戴尔| Dài'ěr |
|アップル|苹果| píngguǒ |
|マイクロソフト|微软| Wēiruǎn |
|google|谷歌|Gŭgē|
|ブラウザ|浏览器| Liúlǎn qì |
|ドメイン|域名|Yùmíng|
|Firefox|火狐|Huǒhú|
|リンク|链接|liànjiē|
|リロード|重新加载|Chóngxīn jiāzài|
|デフォルト|默认|Mòrèn|
|プルダウンメニュー|下拉框|Xiàlā kuāng|
|モーダルウィンドウ|模态窗口|Mó tài chuāngkǒu|
|クラウドサーバ|云服务器|YúnFúwùqì|
|データベース|数据库|Shùjùkù|
|ロードバランサ|负载均衡器|Fùzǎi jūnhéng qì|
|スケーラビリティ|可扩展性|Kě kuòzhǎn xìng|
|ファイアーウォール|防火墙| Fánghuǒqiáng|
|仮想マシン|虚拟机| Xūnǐ jī|
|アップロード|上传|Shàngchuán|
|ダウンロード|下载|Xiàzài|
|プログラマ|程序员|Chéngxù yuán|
|プログラム|程序,编程|Chéngxù,Biānchéng|
|ハッカー|黑客|Hēikè|
|DDos攻撃|分布式拒绝服务攻击|Fēnbù shì jùjué fúwù gōngjí|
|セキュリティホール|漏洞|Lòudòng|
|オープンソース|开放源码|Kāifàng yuánmǎ|
|コード|代码|Dàimǎ|
|チュートリアル|教程| Jiàochéng |
|フレームワーク|框架| Kuàngjià |
|コンパイル|编码|Biānmǎ|
|string|字符串|Zìfú chuàn|
|ループ|循环|Xúnhuán|
|無限ループ|无限循环|Wúxiàn xúnhuán|
80番ポートへ届いたパケットをiptablesでローカルの上位ポートに転送する

例えばNode.jsとかで作ったWEBサービスを外部に公開しようとした時に、80番ポートで公開したいけど一般ユーザだと1024番より上のポートしか使えない、かと言ってrootで実行はしたくない。そんなときは iptables でREDIRECTまたはDNATしてしまうのが便利です。

雑然としたメモレベルだけど備忘録として書いておく。

# 簡単な例
3000番ポートで動かしているサービスを80番で公開する例はこんなコマンドを打てはOK。

```iptables:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000
```

設定ファイルに保存する場合はfilterとは別にnatテーブルの設定を追加して↓こんなふうに書けばよいです。

```text:/etc/sysconfig/iptables
*nat
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000
COMMIT

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# filter settings here...
COMMIT
```

で `service iptables restart` とかしてやれば反映される。


# 複数IPが割り当てられてるサーバで受けたIPによって転送先のローカルポートを変える例
例えば 10.0.0.80 と 10.0.0.81 のIPを持っていた場合に、10.0.0.81に来たパケットは3001番ポートへ転送、それ以外のIPで受けた場合は3000番ポートへ転送とかする場合は↓こんな風に書けばいいです。

```text:/etc/sysconfig/iptables
*nat
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p tcp -d 10.0.0.81 --dport 80 -j REDIRECT --to-port 3001
-A PREROUTING -p tcp              --dport 80 -j REDIRECT --to-port 3000
COMMIT

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# filter settings here...
COMMIT
```

こうすることで1台のサーバで開発環境と本番環境を別ポートで使い分けつつ、ポート指定無しのURLでアクセスが出来るようになります。

# ローカルプロセスからの通信にも対応する場合はOUTPUTチェーンで書き換える
上述の設定だと外からきたパケットに対しては上手く働くけどローカルのプロセスで発生したパケットには効きません。ローカルプロセスで発生したパケットはPREROUTINGチェインを通らないからです。代わりにOUTEPUTチェインを通ります。なので外からとローカルからの両方対応しようとすると↓こうなります。

```text:/etc/sysconfig/iptables
*nat
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p tcp -d 10.0.0.81 --dport 80 -j REDIRECT --to-port 3001
-A OUTPUT     -p tcp -d 10.0.0.81 --dport 80 -j REDIRECT --to-port 3001
-A PREROUTING -p tcp -d 10.0.0.80 --dport 80 -j REDIRECT --to-port 3000
-A OUTPUT     -p tcp -d 10.0.0.80 --dport 80 -j REDIRECT --to-port 3000
-A OUTPUT     -p tcp -d 127.0.0.1 --dport 80 -j REDIRECT --to-port 3000
COMMIT

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# filter settings here...
COMMIT
```

OUTPUTチェーンで80版を全部書き換えてしまうと外部へのhttpアクセスもできなくなってしまうので、面倒ですが`-d`で自分のIP全てを列挙した書き換えを行ってやる必要があります。


# DNATでも出来る
DNATの場合は↓こうなる。

```
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination :3000
```

またDNATの場合はポートと一緒にIPも書き換えることが出来るという違いがある。

```
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.0.0.90:3000
```


# 参考
natテーブルのPREROUTINGチェインがどこに効くかとかは[↓このへんの図](http://www.atmarkit.co.jp/ait/articles/1002/09/news119.html)とかが分かりやすいです。
![r10fig01.jpg](https://qiita-image-store.s3.amazonaws.com/0/18726/b37f1e39-6527-097f-7e6e-5689b1370321.jpeg)
JSONもどき（値として関数を持つ）をJSON.stringifyしたりJSON.parseしたりする

## 値として関数を持った「JSONもどき」、使いたい時ってないですか？

皆さん、ご存知の通り、

```js
var json_modoki = 
    {
        foo:100,
        boo:"sample text",
        hoge: {
           muda: "よろしく"
        },
        func: function() { console.log("hello world"+this.hoge.muda); },
        func2: function() { console.log("hello japan"+this.hoge.muda); }
    }
```    

のような、値として関数を持っているようなものはJSONの仕様上、許されていません。
でも、こういう関数を持った「JSONもどき」って、たまに便利なときがありますよね。

ただ、問題なのがこういう「JSONもどき」ではJSON.stringifyによる文字列化や、
文字列化したものをJSON.parseで「JSONもどき」へ戻すことができないということ。

困りましたねー。

ということで、解決策を作ってみました。いや、私が作ったというか、白状しますと、2chで質問したらスーパーハカーな方が基本的なアイデアを教えてくれました。ありがとうございますｗ

## 基本方針
基本方針は、「JSONもどき内で値が関数のものは、文字列に変換する」です。
そして、「JSON.parseするときに、独自のパーサーを渡して、パーサー内で関数文字列をevalして関数に戻す」というものです。

詳細はコードを御覧ください。

```js
function convertFunctionsToStringsInJSON(json_with_function) {
    var json = json_with_function;
    
    for (key in json) {
        if(typeof(json[key]) === "function") {
            json[key] = json[key].toString();
        }
    }
    
    return json;
}


var json = 
    {
        foo:100,
        boo:"sample text",
        hoge: {
           muda: "よろしく"
        },
        func: function() { console.log("hello world"+this.hoge.muda); },
        func2: function() { console.log("hello japan"+this.hoge.muda); }
    }


convertFunctionsToStringsInJSON(json);


console.log("stringified:"+JSON.stringify(json));


var jsonText = JSON.stringify(json);

var parser = function(k,v){return v.toString().indexOf('function') === 0 ? eval('('+v+')') : v};
var json2 = JSON.parse(jsonText, parser);

json2.func();
json2.func2();
```

上記のコードは、[jsdo.it](http://jsdo.it/emadurandal/eQ4I/)でも公開しています。


## 追記：もっと簡単なやり方

追記：関数の文字列化については、もっと簡単な方法があります。

`Function.prototype.toJSON = Function.prototype.toString;`　とすると、JSON.stringifyの処理での関数の評価時に自動的にtoString()が発動します。

```js
Function.prototype.toJSON = Function.prototype.toString;

var json = 
    {
        foo:100,
        boo:"sample text",
        hoge: {
           muda: "よろしく"
        },
        func: function() { console.log("hello world"+this.hoge.muda); },
        func2: function() { console.log("hello japan"+this.hoge.muda); }
    }

console.log("stringified:"+JSON.stringify(json));

var jsonText = JSON.stringify(json);

var parser = function(k,v){return v.toString().indexOf('function') === 0 ? eval('('+v+')') : v};
var json2 = JSON.parse(jsonText, parser);

json2.func();
json2.func2();
```

こちらも[jsdo.it](http://jsdo.it/emadurandal/o3Fr/)で公開しました。


## 最後に

いかがでしょうか。もちろん、こんな「JSONもどき」他のサービスとやりとりしたりなどすることはないと思いますが、自アプリ・自サービス内で内部的に使うのはアリだと思います。

そんなに多くないと思いますが、「このTips使えそう」と思ってくれた方がいらっしゃれば幸いです。
LXCでCentOS5.9を入れる

http://blog.metainfo.jp/memo3/?p=176
に書かれているとおりですが、
* ubuntu13.10のlxc-create (1.0.0~alpha1-0ubuntu9)では `--rootfs`オプションがtemplateに記述されている必要があるので追記しておきました。
* timezoneの設定追加


使用例
============

```bash:
$ sudo lxc-create -t centos5 -n centos5
```

id:pass = root:root

ダウンロード
==============
[ダウンロード](https://github.com/tukiyo/vagrant-lxc_create_box/blob/master/vendor/blog.metainfo.jp/memo3/lxc-centos5)


ubuntu13.10のlxc
=============

シャットダウン
-------------------
* `lxc-shutdown`, `lxc-halt`がなくなり`lxc-stop -s -t 1`になった

再起動
-------------------
* `lxc-reboot`がなくなり`lxc-stop -r -t 1`になった
【超絶簡単】今年からMacを使う人が知っといて損しないwifiのパスワードを確認する方法

###案外ありがちな「wifiのパスワードを忘れる」という事態。。。
自宅PC、会社PCでもどちらでも起こりえるこの事態。
そんあ時に限って携帯のスマホの4Gに帯域制限が来て劇重に。。。
wifiのパスワードさえ知ってれば。。。
そんな事になる前にサクッと探せる方法を覚えたいところです。
<br>
###１・対象のwifiを確認する。
ここではURoad-28D9A5が対象になりますので、
ご自身の対象のwifiに読み替えて頂きますよう、宜しくお願いします。
![qiita_1.png](https://qiita-image-store.s3.amazonaws.com/0/15812/1a423280-a87c-a667-3630-fc07ca75e7ac.png)
<br>
###２・Macの「Launch Pad」で「ユーティリティ」の中にある「キーチェンアクセス」を選択する。

![qiita_2.png](https://qiita-image-store.s3.amazonaws.com/0/15812/959b87f4-87be-cb9f-7d07-407a1b23726e.png)
<br>

###３・「１」で対象にしたwifiを選択する。
![qiita_3.png](https://qiita-image-store.s3.amazonaws.com/0/15812/eff1f2d6-db7f-b4d8-0a92-8cb0139d4569.png)
<br>

###４・「パスワードを表示」にチェックを付ける。
![qiita_4.png](https://qiita-image-store.s3.amazonaws.com/0/15812/8379fb3b-fbeb-0577-4be8-57c030706de8.png)
フォームから送信された時のパラメータを比べてみる

フォームから送信時に走るスクリプトのパラメータを確認するために、下記のようなスクリプトで実験してみました。
フォームは「テスト」というタイトルのテキスト入力欄のみのフォームです。

また、GoogleAppsのみの機能でユーザー名（メールアドレス）を自動的に収集するオプションをつけています。
https://support.google.com/drive/answer/160166?hl=ja

```js

function myFunction(e){
  MailApp.sendEmail({
    to: 'hoge＠gmail.com',
    subject: 'パラメータテスト',
    body : e
  });
}
```

#スプレッドシートのスクリプトでの場合

{values=[Ljava.lang.Object;@********, namedValues={タイムスタンプ=[Ljava.lang.Object;@********, ユーザー名=[Ljava.lang.Object;@********, テスト=[Ljava.lang.Object;@********}, range=Range, source=Spreadsheet}

※[Ljava.lang.Object;@の後ろは********に置換しています。


[Ljava.lang.Object;@********の部分については後ろに「+''」とすることで正しく取得することができます。
正しく取得すると下記のようになります。

>namedValues.タイムスタンプ : 2013/10/09 11:21:30
namedValues.ユーザー名 : [メールアドレス]
namedValues.テスト : 回答内容だよ
namedValues : [object Object]
values : 2013/10/09 11:21:30,回答内容だよ,[メールアドレス]
source : Spreadsheet
range : Range

sourceのSpreadsheetはこの回答が記録されるスプレッドシートのオブジェクトで、rangeは回答部分のみのRangeのようです。
各種値が[Ljava.lang.Object;@********のようになってしまうのでいちいち変換しなくてはいけない分ちょっと面倒な感じ。（環境周りの問題？）

#フォームのスクリプトでの場合
{response=FormResponse}

こっちはシンプルにFormResponseオブジェクトがそのまま取得できます。
https://developers.google.com/apps-script/reference/forms/form-response

また、GoogleAppsの場合はgetRespondentEmail()を呼び出すことによって自動的に収集したユーザーメールアドレスを取得することができるので、自動メール返信なども簡単に行うことができます。


#メールの自動返信をする場合の注意
よく見かけるのがスプレッドシートのスクリプトで、送信された時にフォームの最後の行を取得して～というやり方ですが、このやり方だと、処理内容にもよりますがほぼ同時に送信された場合、スクリプト内で取得する最後の行が同じ内容になる場合があります。（フォームから送信→スクリプトが走るまでの間にスプレッドシートの行が増えてしまう）

同時に多量の送信がなされる可能性がある場合、なるべく引数の値を使ってメール返信を行うのがベターだと思います。
DevToolsでCSSをBeautifyできるようになった

### ※canaryで確認。stableはまだできなかった (2013/10/09)

JSの再整形は前からあったけど，ついに圧縮されて1行になったCSSを再整形して表示できるようになった。

圧縮されたcssをelementsパネルで追うと`~.css:1`といった表示になってて

![01.png](https://qiita-image-store.s3.amazonaws.com/0/17969/37053ada-7b79-3f4b-6821-424e6dcfd84a.png)

クリックしてCSSを追うと

![02b.png](https://qiita-image-store.s3.amazonaws.com/0/17969/d4749480-9a75-dd15-b95a-5fead5880a18.png)

1行になってて見づらい。ここで`{}`をクリック！

![03.png](https://qiita-image-store.s3.amazonaws.com/0/17969/d5cec314-1122-e35b-0004-3dead737c0de.png)

beautiful!!

elementsパネルの行数もちゃんと整形後の部分をさすように。

![04.png](https://qiita-image-store.s3.amazonaws.com/0/17969/8567edc4-774d-e725-af66-c82545f0b882.png)

今までもオンラインツールとかextensionでBeautifyできたけど，DevToolsでできるようになってかなりお手軽に。
FuelPHPのインストール[1]

本家のコマンドラインインスタレーションの通り以下を実行
```Bash$ curl get.fuelphp.com/oil | sh```これで **/usr/bin/oil** が使える、らしいんだが```Bashoil --help ```とかやってもエラーが出るので注意それよりも作業フォルダーに入ってクリエイトする

```Bashcd workoil create mysystem```この最後にプロジェクトのルートに入って以下を実行せよ、とでる

```Bashphp composer.phar update```これをやると

```  [RuntimeException]  You must enable the openssl extension to download files via https
```
  というエラーが出て動かないコマンドラインのPHPで **openssl** を有効にする

```Loading composer repositories with package informationUpdating dependencies (including require-dev)  - Installing psr/log (1.0.0)    Downloading: 100%  - Installing monolog/monolog (1.5.0)    Downloading: 100%  - Installing fuelphp/upload (dev-master 68bfab6)    Cloning 68bfab6f732af326ff0b364b996b15c250014a8bmonolog/monolog suggests installing mlehner/gelf-php (Allow sending log messages to a GrayLog2 server)monolog/monolog suggests installing raven/raven (Allow sending log messages to a Sentry server)monolog/monolog suggests installing doctrine/couchdb (Allow sending log messages to a CouchDB server)monolog/monolog suggests installing ext-amqp (Allow sending log messages to an AMQP server (1.0+ required))monolog/monolog suggests installing ext-mongo (Allow sending log messages to a MongoDB server)Writing lock fileGenerating autoload files```
こんな感じでインストール終了
Python for Data Analysis Chapter 3

#IPython:An Interactive Computing and Development Enviroment

iPythonめっちゃ便利だから使うといいよ！

+ __データの表示を綺麗にしてくれる__
+ __tabキーで補完できる__
+ __オブジェクトの後に?をつけると詳細な情報が見れる__ `numpy.ndarray.T?`
+ オブジェクトの後に??をつけるとソースコードが読める（見れる時だけ）
+ ?でネームスペースの検索もできる！ `numpy.*save*?`
+ `%run`でスクリプトの実行もできる！ `%run hello_world.py`
+ __`%paste`を使えば空白行付きのスクリプトでもコピペで実行できる！__
インデント付きのソースコードをコピペするとうまくインデントが整形されずにペーストされてしまう。iPython上で%pasteすると空白行付きでペーストされるのでちゃんと実行できる。

+ `%cpaste`で好き放題にペーストしまくれる
+ Ctrl + Lで好きなだけ画面のクリアーができる
+ __エラーが出た時のトレースバックがスタックにまで及ぶ__（ちょっと見にくい）
+ `%magic`で%から始まるマジックコマンドがいっぱい見れる （__`%whos`が便利！__）
+ `ipython qtconsole`で起動すればシンタックスハイライトとかできるリッチなGUIコンソールも使える！（要PyQt or PySide）
+ __`ipython --pylab`__で起動すればmatplotlibとかの関数をトップレベルのネームスペースにインポートしてくれる
+ `_iX`でX行目（In [X]:のところ）のインプットコマンド、`_X`でX行目のアウトプットコマンドが呼び出せる
+ __`%hist`で使ったコマンド履歴が見れる！（ログ取るのに便利！）__
+ __`!cmd`でシェルのコマンドを実行できる__（`!ipython`で多重起動できる）
+ `%cd directory`でワーキングディレクトリを変更できる
+ `%alias alias_name cmd`でエイリアス登録するとalias_nameでcmdを実行できる
+ `%bookmark bookmark_name directory`で登録したディレクトリをbookmark_nameで呼び出せる
+ `%pdb`でAutomatic pdb callingをONにしておくとインタラクティブなデバッガーが使える！
+ `%time method`でmethodの実行時間を計測できる
+ __起動時に`ipython notebook --pylab inside`とするとブラウザベースのブックがつくれる！しかもpandasのDataFrameを表形式で表示してくれる！__
ランダム文字列生成(Python)


commons-lang(Java)の`RandomStringUtils.randomAlphabetic(n)`相当の処理。調べれば出てくるが備忘録として。

```python:random_string
import string
import random

n = 5
# ユーティリティ関数にすると便利かも?
random_str = ''.join([random.choice(string.ascii_letters + string.digits) for i in range(n)])
```
「俺」のゲームパッドのキーマップ

「俺」についているゲームパッドのキーマップを拾って調べた対応表です。

Activity#dispatchKeyEventにおいて、

```java
	public boolean dispatchKeyEvent(KeyEvent e) {
		 
	   if (e.getAction() == KeyEvent.ACTION_DOWN) {
	       //キーコード表示
	       Log.d("KeyCode","KeyCode:"+ e.getKeyCode());
	   }
	 
	   return super.dispatchKeyEvent(e);
	}
```

で拾ってキーコードを調べる。

|キー|KeyCode|定義|備考|
|:--|--:|:--|:--|
|十字キー上|19| KEYCODE_DPAD_UP| |
|十字キー下| 20|KEYCODE_DPAD_DOWN | |
|十字キー左| 21|KEYCODE_DPAD_LEFT | |
|十字キー右| 22|KEYCODE_DPAD_RIGHT | |
|左アナログスティック 上| 19|KEYCODE_DPAD_UP | |
|左アナログスティック 下| 20|KEYCODE_DPAD_DOWN  | |
|左アナログスティック 左| 21|KEYCODE_DPAD_LEFT  | |
|左アナログスティック 右| 22|KEYCODE_DPAD_RIGHT  | |
|右アナログスティック 上| (反応なし)| | |
|右アナログスティック 下|(反応なし) | | |
|右アナログスティック 左|(反応なし) | | |
|右アナログスティック 右|(反応なし) | | |
|L1| 102|KEYCODE_BUTTON_L1 | |
|L2| 104|KEYCODE_BUTTON_L2 | |
|L3| 106|KEYCODE_BUTTON_THUMBL | |
|    | 23|KEYCODE_DPAD_CENTER | |
|R1| 103|KEYCODE_BUTTON_R1 | |
|R2| 105|KEYCODE_BUTTON_R2 | |
|R3| 107|KEYCODE_BUTTON_THUMBR | |
|    | 23|KEYCODE_DPAD_CENTER | | 
|音量 -| 25|KEYCODE_VOLUME_DOWN | |
|音量 +| 24|KEYCODE_VOLUME_UP | |
|A| 96|KEYCODE_BUTTON_A | |
|  | 4|KEYCODE_BACK | |
|B| 97|KEYCODE_BUTTON_B | |
|  |4|KEYCODE_BACK | ||
|X| 99|KEYCODE_BUTTON_X | |
|  | 23|KEYCODE_DPAD_CENTER | |
|Y| 100|KEYCODE_BUTTON_Y | |
|  | 23|KEYCODE_DPAD_CENTER | |
|SELECT| 109 |KEYCODE_BUTTON_SELECT | |
|              | 82|KEYCODE_MENU | |
|START| 108 | KEYCODE_BUTTON_START| ホームに戻った|
|電源ボタン| | | スリープした|]

L3、R3、A、B、X、Y、SELECTについては、一回の押下で2回のイベントを拾ったため併記している。
ついでにe.getSource()の値は1281となっていて、InputDeviceには未定義の値。

次は、画面の下部にあるソフトキー

|キー|KeyCode|定義|備考|
|:--|--:|:--|:--|
|ソフトキー バックキー|4|KEYCODE_BACK | |
|ソフトキー ホームキー|(反応なし)| | ホームに戻った|
|ソフトキー タスクキー|(反応なし) | | 実行中アプリが表示|
|ソフトキー カメラキー|(反応なし) | | スクリーンショット|
|ソフトキー ゲームパッドキー|(反応なし)| | ゲームパッドのマッピング表示|

こちらのgetSource()の値は257だった。

参考
[ハードウェアキーを取得する](http://techbooster.org/android/ui/5056/)
Vimのフォントカラーを見やすいように変更する

Mac OS XやLinuxでターミナルの背景をblackにして使う人は多いと思う．
しかし，そのままだとコメントが深い青（dark blue）になってしまいイマイチ見づらくなってしまう．

```vim
:set background=dark
```
このコマンドにより，背景が暗い色の場合のカラースキーマに変更される．
golangでchomp

```go
package main

import (
	"fmt"
	"strings"
)

func main() {
	foo := "hooo\n"
	bar := "bar\n"

	fmt.Printf("foo is %s bar is %s", foo, bar)
	// foo is hooo
	// bar is bar
	foo = strings.TrimRight(foo, "\n")
	bar = strings.TrimRight(bar, "\n")

	fmt.Printf("foo is %s bar is %s", foo, bar)
	// foo is hooo bar is bar
}
```
capistrano から mysqldump する

capistrano で mysqldump して、ローカルまで持ってくる。

要点は、run にブロックを渡すこと。
 
```run cmd do |channel, stream, data|```

のとき、channel.send_data で リモートの stdin、 data で stdout を扱うことができる。

# 手順
- mysql の設定は database.yml に書かれている
- YAML::load でハッシュになる
- DataTime.now で タイムスタンプを付与
- mysqldump を -p 付きで発行
- Enter password: を待って、password を入力させる。
- 作成後、get してくる。

```rb
namespace :mysql do
  desc "mysqldump"
  task :dump do
    require "date"
    database_yml_path = File.join(File.expand_path('../../', __FILE__), "database.yml")
    database_yml = File.open(database_yml_path)
    database_yml = YAML::load(database_yml)
    settings = database_yml["#{rails_env}"]
    dump_path = "mysql_dump.#{DateTime.now}.sql"
    cmd = "mysqldump -u#{settings['username']} -p -h #{settings['host']} #{settings['database']} > #{dump_path}"
    run cmd do |channel, stream, data|
      if data.chomp == "Enter password: "
        channel.send_data("#{settings['password']}\n")
      end
    end
    # get #{dump_path}
  end
end
```

# 参考
2.x DSL Action Invocation Run · capistrano/capistrano Wiki https://github.com/capistrano/capistrano/wiki/2.x-DSL-Action-Invocation-Run
SBTからSparkをinstall

SBTのdependencieにいろいろ書き足さないとだめっぽかったのでメモ。

```scala:project/TestBuild.scala
import sbt._
import sbt.Keys._

object TestBuild extends Build {

  lazy val test = Project(
    id = "test",
    base = file("."),
    settings = Project.defaultSettings ++ Seq(
      name := "test",
      organization := "org.example",
      version := "0.1-SNAPSHOT",
      scalaVersion := "2.9.3"
      // add other settings here
    )
  )
}
```

今のところsparkはScala 2.9.xにしか対応してないので2.10.x系を入れないことを気をつける

```scala:build.sbt
libraryDependencies ++= Seq( 
  "org.apache.spark" %% "spark-core" % "0.8.0-incubating"
)

resolvers ++= Seq (
  "Akka Repo" at "http://repo.akka.io/repository"
)
```

AkkaのリポジトリはMaven Centralにないので、追加しておく必要あり
MongoDB を使ってみる

# MongoDB を使ってみる
「使ってみる」とおおみえを張ってみたが、ドキュメントの要約っぽくなってしまった.
http://www.mongodb.org/

MongoDB は, GNU A GPL v3.0 のオープンソースなドキュメント指向データベースである.

## インストール
http://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat-centos-or-fedora-linux

リポジトリの設定

```
% cat /etc/yum.repos.d/mongodb.repo
[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
```

インストール

```
yum install mongo-10gen mongo-10gen-server
```

## Configure MongoDB
/etc/mongod.conf に設定を書く. デーモンの制御 script の起動と同時に設定が反映される.

MongoDB はデータファイルを /var/lib/mongo に保存する.
ログを /var/log/mongo に保存する.
また, mongod ユーザアカウントで起動する.

## Control MongoDB

### 起動

```
service mongod start
```

起動確認は ```/var/log/mongo/mongod.log``` に起動ログがあること.

### 自動起動設定
システムをリブートしたときに MongoDB を自動的に起動するためには、次のコマンドを叩く.

```
service mongod enable
```

### 停止

```
service mongod stop
```

### 再起動

```
service mongod restart
```

## Using MongoDB
```mongo-10gen``` パッケージでは, mongo シェルを利用できる. 次のコマンドを叩くことで MongoDB インスタンスに接続できる.

```
mongo
```
とりあえずヒストグラムを作る(matplotlib)

```
7.3762191e-01
6.9414645e-01
7.2935387e-01
7.2315696e-01
6.9948782e-01
7.0568515e-01
...
```
こんな感じのデータがあるとする

```python
import numpy
from matplotlib import pyplot


def show(filename):
    data = numpy.loadtxt(filename)
    pyplot.hist(data)
    pyplot.show()
```

ファイルに保存する場合は

```python
def show(filename):
    data = numpy.loadtxt(filename)
    pyplot.hist(data)
    pyplot.savefig("figure1.eps")
```

のようにする。
拡張子を自動判定してeps/png等で保存してくれる。
binは自動で判定してくれる。
詳しい指定の仕方は下記リンク参照。

参考文献
- [pyplot — Matplotlib 1.3.1 documentation](http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.hist "hist")
AWS コマンドラインインターフェイスを利用してS3にバックアップしたファイルを取得する

AWS コマンドラインインターフェイス:
http://aws.amazon.com/jp/cli/

aws s3 sync:
http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html


まずはAWSの必要な設定を設定を行う。詳細はググってください。

```
export AWS_ACCESS_KEY_ID={AWS_ACCESS_KEY_ID}
export AWS_SECRET_ACCESS_KEY={AWS_SECRET_ACCESS_KEY}
export AWS_DEFAULT_REGION=ap-northeast-1
```


仮にbucket[log]に下記のオブジェクトをS3にアップロードしていたとする。

```
access-log/2013/10/25/web1.access_log.20131025
access-log/2013/10/25/web2.access_log.20131025
access-log/2013/10/26/web1.access_log.20131026
access-log/2013/10/26/web2.access_log.20131026
```

ログ調査のために2013/10/25分のログファイルだけ取得したければ、下記のコマンドを実行すると指定日付のログがカレントディレクトリにダウンロードされる。

```
aws s3 sync s3://log/access-log/2013/10/25 .
```

パスを逆にするとローカルファイルをアップロードもできるので、バックアップも簡単です。
Pythonライブラリのダウンロード数表示バッジを生成

# ライブラリのダウンロード数をバッジで強調

[pypip.in](https://pypip.in/) というサイトのサービスを利用することで
ライブラリのインストール回数をバッジとして表示することができる。

https://pypip.in/d/PyQCheck/badge.png

とすると(PyQCheckがPyPIに登録しているライブラリ名)

![badge](https://pypip.in/d/PyQCheck/badge.png)

という感じで表示される。良いですね。
Vimで隣接した括弧の開き記号を消すと同時に閉じ記号も削除するスクリプト

Vimで以下のように，

```vim
inoremap { {}<LEFT>
inoremap [ []<LEFT>
inoremap ( ()<LEFT>
inoremap " ""<LEFT>
inoremap ' ''<LEFT>
```

括弧/クォートの開き記号の入力時に閉じ記号を補完する方法が知られている．

この設定下で，誤入力した括弧/クォートを削除をする際，補完された閉じ記号も削除しなければならない．（ 2，3個ほどキーを入力が必要）これは非常に手間である．

そこで，挿入モードでの _BackSpace_ を，隣接した括弧/クォートの開き記号を消すときに限りもう一方も削除するように割り当てる．以下がそのスクリプトである．

```vim
function! DeleteParenthesesAdjoin()
	let pos = col(".") - 1	" カーソルの位置．1からカウント
	let str = getline(".")	" カーソル行の文字列
	let parentLList = ["(", "[", "{", "\'", "\""]
	let parentRList = [")", "]", "}", "\'", "\""]
	let cnt = 0

	let output = ""

	" カーソルが行末の場合
	if pos == strlen(str)
		return "\b"
	endif
	for c in parentLList
		" カーソルの左右が同種の括弧
		if str[pos-1] == c && str[pos] == parentRList[cnt]
			call cursor(line("."), pos + 2)
			let output = "\b"
			break
		endif
		let cnt += 1
	endfor
	return output."\b"
endfunction
" BackSpaceに割り当て
inoremap <silent> <BS> <C-R>=DeleteParenthesesAdjoin()<CR>
```

Mac OS X上のコンソール版Vimで動作が確認できた．
しかし，MacVim-KaoriYa(香り屋パッチ版MacVim)では日本語入力で不具合が発生するため，以下のようにCtrl-Hで代用した．

```vim
" Ctrl-Hに割り当て
inoremap <silent> <C-h> <C-R>=DeleteParenthesesAdjoin()<CR>
```
##### 参考にしたサイト
[Vimスクリプトリファレンス — 名無しのvim使い](http://nanasi.jp/code.html)
[Vim エディターのスクリプトの作成/ 第 2 回 ユーザー定義関数](http://www.ibm.com/developerworks/jp/linux/library/l-vim-script-2/)
DNSリバインディング対策

##DNSリバインディング攻撃とは
###概要
罠サイトと罠DNSサーバを運営する攻撃者が、
短期間にドメイン（FQDN）に対応するIPアドレスを変更することで
SameOriginPolicyの範囲内で脆弱性サイトへjsによる攻撃を行う。


###ステークホルダー
- 攻撃者
- 攻撃者運営のDNS（TTL/キャッシュ生存期間を5秒程度に設定）
- 攻撃者運営の罠サイト（<strong>evil.example.com</strong>）（<strong>192.0.2.1</strong>）
- 脆弱性サイト（<strong>weak.example.jp</strong>）（<strong>198.51.100.1</strong>）
- 被害者

###攻撃の流れ
1. 被害者が罠サイト（<strong>evil.example.com</strong>）を閲覧

1. 攻撃用JavaScript（※）が被害者に送信される
※例えば「<strong>evil.example.com</strong>」上の特定コンテンツにアクセスし、得られた情報を<strong>192.0.2.1(evil)</strong>に返す、など。

1. 攻撃者がDNSのAレコードを操作し、<strong>evil.example.com</strong>が<strong>198.51.100.1(weak)</strong>を指すように変更する。

1. この時点で、<strong>evil.example.com</strong>上で実行できるJavaScriptは、脆弱性サイト<strong>198.51.100.1(weak)</strong>に対する操作ができる状態となる。

1. そのタイミングに沿って罠スクリプトが発火すれば、<strong>198.51.100.1(weak)</strong>上の個人情報の取得など、攻撃が成立する。


##対策
特性上、攻撃は必ず罠サイトのホスト（<strong>evil.example.com</strong>）から行われるのが肝。

apacheのVirtualHostは、未定義のホスト（SeverName）に対するリクエストが来た場合、
最初の定義がデフォルトとして適用される。

これを利用して、最初にdummyのVirtualHostを定義しておくことで、
罠サイト（<strong>evil.example.com</strong>）からのアクセスに対しては404を返すことが出来る。


```sh
# ダミーVirtualHost
<VirtualHost *:80>
ServerName dummy.example.jp # 正規のホスト名以外ならなんでもok
DocumentRoot /var/www/dummy
ErrorDocument 404 /index.html
</VirtualHost>

# 正規のVirtualHost
<VirtualHost *:80>
ServerName weak.example.jp
DocumentRoot /var/www/html
</VirtualHost>
```

##tips

weak.example.jpに対して、ホストを偽装（evil.example.com）してアクセス可能かどうか、
つまりDNSリバインディング可能かどうかチェックできる。

```sh
curl -v -H 'Host: evil.example.com' http://$(dig weak.example.jp | grep -v '^;' | grep 'A' | awk '{print $5}')
```


##参考
DNSリバインディング
http://itpro.nikkeibp.co.jp/article/COLUMN/20130218/456766/?ST=security&P=1

間違いだらけの「かんたんログイン」実装法 (3/3)
http://www.atmarkit.co.jp/ait/articles/1103/01/news125_3.html

DNSのTTL設定とは?
http://kazamidori.net/kaoru/2007/03/ttl1.html
Phalcon のルーティングは「最後が勝つ」

Phalcon PHP Framework で、優先度が影響するルーティングが必要になったときに少しつまづいたのでメモ。

Phalcon のルーティングは、どうやら記述したのと逆順に評価されるようです。
たとえば次のように、トップレベルに固定ではないページを配置しようとした場合、

+ example.com/
+ example.com/about
+ example.com/<ページID:アルファベット>

Symfony2 では次のように、評価してほしい順番に記述します。

```yaml:routing.yml
top:
    pattern: /
    defaults: { _controller: DemoBundle:Index:top }

about:
    pattern: /about
    defaults: { _controller: DemoBundle:Index:about }

flexpage:
    pattern: /{page_id}
    defaults: { _controller: DemoBundle:Index:flexpage }
```

しかし Phalcon では、次のように記述してしまうと、/ (トップページ) にアクセスしても /about にアクセスしても IndexController::flexpageAction() が呼び出されてしまいます。

```php:routing.phpダメなやつ
$router = new Palcon\Mvc\Router(false);

$router->add('/', 'Index::top');
$router->add('/about', 'Index::about');
$router->add('/{page_id}', 'Index::flexpage'); // ← "/", "/about" がマッチしちゃう
```

/{page_id} のルールを最初に持ってくれば、正しく /, /about にアクセスすることができるようになります。

```php:routing.phpグッボーイ！
$router = new Palcon\Mvc\Router(false);

$router->add('/{page_id}', 'Index::flexpage');
$router->add('/', 'Index::top');              // ←YES!
$router->add('/about', 'Index::about'); // ←YES!!
```

---
phalcon routing priority とかでググっても見つけられなかったので検索用
phalcon ルーティング 評価 順番 
参考: [router.c](https://github.com/phalcon/cphalcon/blob/master/ext/mvc/router.c#L443)
backboneのmodel.save後のsuccessの返り値について

backboneのmodel.saveのsuccessの返り値で少しハマったのでメモ。

backboneのモデルでsaveを実行するとき、以下な感じになるかと思います。

```coffeescript
model.save({},
  succees: (model, data)=>
       hogehoge
  error: (model, data) =>
       fugafuga
)
```

successでもerrorでも返り値の第一引数はmodelなんですね。
なのでサーバー側でjsonを返すように処理を書いても第一引数には格納されません。
なんと。。

第一引数でmodelを受け取っているからなのか、サーバー側でbackbone側のモデルに合わせた形でjsonを返しているとsaveを実行したmodelはsuccess、errorの中で処理をしなくても更新されていました。

上記のコードの中だとhogehogeとかfugafugaのところで

```coffeescript
model.set('hoge', 'fuga')
```

みたいなことはしなくてもmodelのhogeはfugaになってます。
勉強になりました。
Celeryの非同期処理中に起きたエラーをメールで通知


ということを以下のコードをsettings.pyに追加するだけで実現できる。便利。

## settings.py

```settings.py:python
# Enables error emails.
CELERY_SEND_TASK_ERROR_EMAILS = True

# Name and email addresses of recipients
ADMINS = (
    ("George Costanza", "george@vandelay.com"),
    ("Cosmo Kramer", "kosmo@vandelay.com"),
)

# Email address used as sender (From field).
SERVER_EMAIL = "no-reply@vandelay.com"

# Mailserver configuration
EMAIL_HOST = "mail.vandelay.com"
EMAIL_PORT = 25
```

## 参考
+ http://docs.celeryproject.org/en/latest/configuration.html
Circle CIの疑問点をFounderの人に聞いてみたよ

社内でのCircle CI導入にあたって、いくつか疑問点があったのでメールで投げたら、
Founderの人(Paul Biggar)が丁寧に答えてくれました。せっかくなので共有しておきます。

Q: うちのプロジェクトでCent OSを使いたいんだけど、Ubuntu以外のOSは使える？
A: 現時点ではCentOSは使用できません。将来的にはDocker（http://www.docker.io/） を使えるようにします。

Q: MySQLのデータベースエンジンとしてgroongaを使いたいけど、サポートしてる？
A: 多分そのままでは使えません。mroonga/groongaはどのようにしてインストールしていますか？

Q: Jenkinsのように、任意のタイミングで任意のジョブを実行できる？
A: PUSHをトリガーとしてコマンドを実行出来ます。そのような利用はCircle CIの目指すところではないので!
io.socketサーバからexpressのセッションIDを拝借する

```js
io.sockets.on('connection', function (socket){
	socket.on('foo', function(message){
		//	例として、expressからセッションIDを拝借してみる
		var connect = require('connect');
		var parseSignedCookie = connect.utils.parseSignedCookie;
		var parseCookie = require('cookie').parse;
		var sessionID = parseSignedCookie(parseCookie(socket.handshake.headers.cookie)['connect.sid'], 'セッションCookieに設定したsecret値');
}
Mac上でC++で書いたCUIプログラムのプロファイルを取得


# CUIのプログラムをmac上で取ろうと思ったときの問題点

- C++で書いたコードに対して、mac上でgprofを使ってプロファイルを取ろうと思っても正しく計測できない。（バグなのかなんなのかよく分からないが。。。）
    - C++に限定した話ではなく、Cでも同様。
- そこでXCodeの付属のツールとしてついてくるプロファイリングツールを使う。
    - Appleの開発環境でのプロファイラと言えば、以前は Shark というソフトだったが、今はInstrumentsというツールに統合されている。
- さてInstrumentsでプロファイルを取ろうと思った場合、既存のプロセスにアタッチするしか方法が無い。これではCUIのコードに対して使おうと思った場合、プロセスを走らせておいて急いでInstrumentsのUIからプロセスにアタッチする、という非常に面倒な手順を踏む事になる。
- 既存のプロセスにアタッチするのではなくプロセスを起動してプロファイルを取得したい場合には、InstrumentsのUIではなく、iprofilerというコマンドを使うと良い。

# 使い方
- ターミナルから iprofiler経由でコマンドを実行する
    - 実行するとパスワード入力が求められるので入力する（またはsudoで実行する）

```sh
iprofiler -timeprofiler ./my_program.out arg1 arg2
```

- 実行すると my_program.dtps というディレクトリが作られる。これをInstrumentsで開くとプロファイル結果を確認する事ができる。
    - sudoで実行した場合には .dtpsのownerがrootになっているので注意

- その他、詳細なコマンドラインオプションは man iprofiler で確認する事ができる。

![kobito.1382943871.121017.png](https://qiita-image-store.s3.amazonaws.com/0/28792/91d6fc0a-83e1-91b7-958d-2d69036966b7.png "kobito.1382943871.121017.png")
rbenvインストール

rbenvをインストールした時PATH

- ~/.bashrc に以下を追加
export PATH=~/.rbenv/shims:$PATH
eval "$(rbenv init -)"

- bash_profileを読み込む
$ source ~/.bash_profile 

- rbenvでrubyインストール
rbenv install 2.0.0-p195
rbenv rehash

- 確認
$ which ruby
/Users/[USERNAME]/.rbenv/shims/ruby
になってればOK
Jenkinsをアップデートしたらrvmプラグインを使ったジョブが表示されなくなった話

Jenkinsのバージョンを1.533->1.536に上げたところ以下のようなエラーが出てrvmプラグインを利用しているジョブが表示されなくなった

```
hudson.util.IOException2: Unable to read /var/lib/jenkins/jobs/hogehoge/config.xml
        at hudson.XmlFile.read(XmlFile.java:147)
        at hudson.model.Items.load(Items.java:220)
        at jenkins.model.Jenkins$18.run(Jenkins.java:2575)
        at org.jvnet.hudson.reactor.TaskGraphBuilder$TaskImpl.run(TaskGraphBuilder.java:146)
        at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:259)
        at jenkins.model.Jenkins$7.runTask(Jenkins.java:904)
        at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:187)
        at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:94)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:679)
Caused by: com.thoughtworks.xstream.converters.ConversionException: Undefined class: Java::Hudson::RemoteLauncher : Undefined class: Java::Hudson::RemoteLauncher
---- Debugging information ----
message             : Undefined class: Java::Hudson::RemoteLauncher
cause-exception     : java.lang.IllegalArgumentException
cause-message       : Undefined class: Java::Hudson::RemoteLauncher
class               : org.jruby.runtime.builtin.IRubyObject
required-type       : org.jruby.runtime.builtin.IRubyObject
converter-type      : org.jenkinsci.jruby.JRubyXStreamConverter
path                : /project/buildWrappers/ruby-proxy-object/ruby-object/object/launcher/native
line number         : 89
class[1]            : org.jenkinsci.jruby.JRubyMapper$DynamicProxy
converter-type[1]   : org.jenkinsci.jruby.JavaProxyConverter
class[2]            : hudson.util.DescribableList
converter-type[2]   : hudson.util.DescribableList$ConverterImpl
class[3]            : hudson.model.FreeStyleProject
converter-type[3]   : hudson.util.RobustReflectionConverter
version             : not available
-------------------------------
```

 * この時点で以下のプラグインがインストール済み
  * rvm 0.4
  * ruby-runtime 0.12

## 解決法

 * ruby-runtimeプラグイン(rvmプラグインが依存してる)を再インストールする
  * 一度アンインストールしてからインストールし直すことで問題が解決した
  * インストールしたのは ruby-runtime 0.12

### おまけ

 * 別環境で1.517->1.536に上げようとして同じ現象に出くわしたが、こちらは1.517に戻すと直った
  * 1.518だとエラーが出る、1.517は出ない
DataMapper + PostgreSQL で Binary 型プロパティを使う

```rb
class Hoge
  include DataMapper::Resource

  property :id, Serial
  property :binary, Binary
end
```

dm-migrations gem (v1.2.0) を使っていて、データベースが PostgreSQL の場合、上記のように Binary 型がのプロパティがある状態で `DataMapper.auto_upgrade!` などを実行すると下記のエラーが出る。

    type modifier is not allowed for type "bytea" LINE 1: ... "binary" BYTEA(50), ...


PostgreSQL の BYTEA 型では長さを制限しないが、DataMapper の Binary プロパティは String プロパティから長さ制限 (= 50) を継承していて、制限を設定しようとするのが原因っぽい。

インストールされた dm-migrations gem のソースを直接編集できるなら、[Removing limit from Binary column for PostgreSQL in datamapper - Stack Overflow](http://stackoverflow.com/questions/10154641/removing-limit-from-binary-column-for-postgresql-in-datamapper) のやり方で修正することもできる。

Heroku などでは、

```rb
# Gemfile
gem 'dm-migrations', github: 'titanous/dm-migrations', ref: 'a4de508'
```

で動いた。

修正の Pull Request ([datamapper/dm-migrations#33](https://github.com/datamapper/dm-migrations/pull/33)) は v1.2.0 のリリース前にマージされてるけど、なぜか v1.2.0 には含まれてないっぽい。

v1.2 にその #33 を含める Pull Request ([datamapper/dm-migrations#45](https://github.com/datamapper/dm-migrations/pull/45)) もあったけど、数ヶ月間無反応で、リクエストした人が close した様子。
WEBページにOGを設定しているがリダイレクト等でog:urlがうまく反映できない時

http://nobish.jp/facebook/facebook-like-button-is-it-possible-to-change-the-url.html
「facebookexternalhit」というUserAgentの時に都合の良いHTMLを返してやれば良いらしい。
仕様変えられたら対応する所だけれど、そうそう変わらないだろう。
（UserAgent変えた瞬間に、同じような事しているページのイイネがみんな0になる危険があると思うし。）
divやli要素等を横並びにした時に高さを揃える方法

divやli要素でテキストや画像を表示します。
横並びにすると、その内容量によって高さが異なってガタガタしてカッコ悪い。
そこで作ってみた。 http://jsfiddle.net/EDwtn/1/

jQueryの便利なライブラリが沢山出てるけど、シンプルに考えたくて手組。
CSSのdisplay:tabel-cellを使う方法もあるけど、要素の間隔を設定できない問題もあるのでJavaScriptで設定。

IE7～10,FireFox,Safari,Chrome,Operaで試して問題なく動作する模様（Windowsだけど）

```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta charset="utf-8" />
</head>
<style>
ul{
  list-style : none;
  margin     : 0;
}
ul:after {
  content : "";
  clear : both;
  display : block;
}
li{
  float : left;
  height: auto;
  width : 50px;
}
li:nth-of-type(1){background-color : #f00;}
li:nth-of-type(2){background-color : #ff0;}
li:nth-of-type(3){background-color : #f0f;}
li:nth-of-type(4){background-color : #0ff;}
</style>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
  // 要素配列を引数で渡します
  sameHeight($("#test li"));

  function sameHeight(elements){
    var heights = [];
    var len = elements.length;

    if (len > 0){
        // 要素の高さを配列に保持
        // offsetHeightプロパティ：CSSの「height」「padding」「border」を足したピクセル単位の数値
        // clientHeightプロパティ：CSSの「height」「padding」を足したピクセル単位の数値
        for(i = 0; i < len; i++){
          heights[i] = elements[i].offsetHeight;
        }

        // 配列を降順でソート
        heights.sort(function(a, b){
           return (b - a);
        });

        // 最も高さの高い要素に揃える
        for(i = 0; i < len; i++){
          elements[i].style.height = heights[0] + "px";
        }
    }
  }
});
</script>
<body>
<ul id="test">
<li>権威ある本といっても、すべては人の書いたものだ。</li>
<li>決して時計を見るな。 これは若い人に覚えてもらいたいことだ。</li>
<li>私は実験において 失敗など一度たりともしていない。この方法ではうまく行かないということを発見してきたのだ。</li>
<li>私は一日たりとも、いわゆる労働などしたことがない。何をやっても楽しくてたまらないからだ。</li>
</ul>
</body>
</html>
```

1. 高さを揃えたい要素の高さを配列に保持
2. 高さを保持した配列を降順にソート
3. 並び替えた配列の最初の要素（一番高い高さの数値が入っている）に全部の高さを揃える。

＼(^o^)／できた！
コードを勝手にハイライトする highlight.js 

公式 http://softwaremaniacs.org/soft/highlight/en/

一発で良さが分かるページ http://softwaremaniacs.org/media/soft/highlight/test.html

# 雑多な説明

* HTML中のコード断片をハイライトしてくれる
* 書いてあるプログラミング言語を勝手に推測する
* ハイライトの種類が2013-10-28現在で26種類以上ある

# 例

```html:test.html
<!DOCTYPE html>
<html>
  <head>
  <link rel="stylesheet"
        href="http://yandex.st/highlightjs/7.3/styles/xcode.min.css">
  <title>highlight.js demo</title>
</head>
<body>
  <h1>highlight.js demo</h1>

  <pre><code>if __name__ == '__main__':
    try:
        args = main_handler.prepare_args(_DEFAULT_HOSTS,
                                         _DEFAULT_DB_FILE_NAME)
        with main_handler.MainHandler(args) as handler:
            handler.do_all()
    except KeyboardInterrupt:
        print('\nKeyboardInterrupt happened\n')
        pass
    pass
  </code></pre>
  <pre><code>#!/bin/bash
BASENAME=`basename $0`
verbose=0
help=0
while getopts "hdrv" flag; do
  case $flag in
    \?) OPT_ERROR=1; break;;
    h) help=1;;
    v) verbose=1
  esac
done
  </code></pre>

  <script src="http://yandex.st/highlightjs/7.3/highlight.min.js"></script>
  <script>hljs.initHighlightingOnLoad();</script>
</body>
</html>
```

![hightlight.js.demo.png](https://qiita-image-store.s3.amazonaws.com/0/14365/f5428511-62ab-b87b-3e9e-81716f6030d2.png)

# 注意点

* 上記はcss/jsを外部ホストのものを利用している
* サポートする言語セットやスタイルを選びたいのなら手元で準備する方が良い
* 遅い可能性と間違える可能性は個別の利用例で確認する方が良い

# (文面の変更について)

イカとかゲソとかの記述を削除して一覧性を上げたでゲソ。
未使用CSSセレクタを見つけて削除する方法


サイトが大きくなればなるほど未使用セレクタとか増えちゃってCSSで余計な容量食っちゃったりしませんか？
そんな時に、ページごとに使っていないセレクタを見つけて削除したい。
いろいろ未使用セレクタを見つけるツールがあるみたいですが今回はChromeの開発ツールを使いました。

##未使用CSSセレクタの見つけ方
![audits.png](https://qiita-image-store.s3.amazonaws.com/0/7942/ce190020-d880-a2d0-aeab-79f9de7eb497.png "audits.png")
Choromeの開発ツールの`Audits`をクリックし、
`Run`ボタンをクリック。

![Run結果.png](https://qiita-image-store.s3.amazonaws.com/0/7942/794ff5de-c36d-11e9-c613-dcfe2af66d38.png "Run結果.png")
`Remove unused CSS rules`を開くと
そのページで使われていないCSSセレクタが一覧で表示されます。

##未使用CSSセレクタの削除
あとは以下の手順で削除する。

1. 他のページのviewやjavascriptでそのセレクタが使われていないか調査
2. 使われていない場合は削除する

自分の環境だとRails使っているので
`grep`かけて他で使ってないかチェックしてから削除します。

```
grep -r 'fb_hidden' app/views/ | grep -v svn
grep -r 'fb_hidden' public/javascripts/ | grep -v svn
```

どちらでも使われていない場合はそのセレクタを削除する。
Marvericks で Synergy サーバを動かす

Marvericks になって Synergy.app のサーバが動かなくなりました。
主な原因は以下の2点。
1.アクセシビリティの設定箇所が変った。
2.正しく設定しても動かない。

2についてはsynergyの対応を待つしかありませんが、
Terminal.appにアクセシビリティの設定を行なうことでコマンドラインからの実行が可能です。

アクセシビリティの設定は「システム環境設定」「セキュリティとプライバシー」「プライバシー」に移動しています。
![スクリーンショット 2013-10-28 0.15.41.png](https://qiita-image-store.s3.amazonaws.com/0/25762/95b845ae-59a3-7284-851a-61f023732aa8.png)

ここでアクセシビリティを設定してやればいいのですが、
Synergy や synergys を許可してもなぜか上手く動かないです。
なのでターミナルを許可して、コマンドライン から synergys を動かします。

```shell-session
$ /Applications/Synergy.app/Contents/MacOS/synergys -c ~/synergy.conf -f
INFO: Synergy 1.4.15 Server on Darwin 13.0.0 Darwin Kernel Version 13.0.0: Thu Sep 19 22:22:27 PDT 2013; root:xnu-2422.1.72~6/RELEASE_X86_64 x86_64
NOTE: started server, waiting for clients
NOTE: accepted client connection
NOTE: client "XXXXXXXX" has connected
```
リストにターミナルがなければ、ターミナルのアイコンをFinderからリストにドラッグ&ドロップすると追加できます。
WordPress、カスタムタクソノミーで選択を強制にする

WordPressで、カテゴリーやタグなどの「分類項目」を増やすことができる「カスタムタクソノミー」。

便利ですが、標準ではなにも選択しなくても登録することができます。これを、「カテゴリー」と同じように少なくとも1つは選択されるように改造をします。

テーマフォルダ内の「functions.php」に追加しましょう。

```php:functions.php
add_action('admin_print_footer_scripts', 'admin_print_footer_scripts_custom', 21);
function admin_print_footer_scripts_custom() {
	echo '<script type="text/javascript">
	  //<![CDATA[
	  jQuery(document).ready(function($){
	      // default check
	      if ($(".categorychecklist input[type=checkbox]:checked").length == 0) {
	        $(".categorychecklist li:first-child input:first-child").attr("checked", "checked");
	      }
	  });
	  //]]>
	  </script>';
}
```

「admin_print_footer_scripts」は、管理画面内の JavaScript出力部分のフックです。ここに、新しい JavaScriptとして画面表示時にカスタムタクソノミーの最初のチェックに、強制的にチェックをつけています。

HTMLの場合、ラジオボタンは一度チェックが付くと外すことはできないので、これで強制することができるというわけです。

[PR] [WordPress+PHP プログラム開発サポート | anygraphica](http://anygraphica.com/service/wpphp/)
自分用botの日付計算とか自動化の準備をした


はい。
表題の行為をするのに色々迷走して自分で一番処理しやすそうだったjson形式で。

```test.json
[
{
   "name":"mouse",
   "date":"2013-10-22",
   "last":24,
   "avg":20.5,
   "cnt":10
}
]
```

```py:test.py
from urllib import urlencode
from datetime import date, timedelta
import datetime
import kino
import re
import json

time = datetime.datetime.now()


def demchi_cnt(filename):
    f = open(filename)
    data = json.load(f)
    f.close()
    d = datetime.datetime.strptime(data[0]["date"], "%Y-%m-%d")
    s = time - d
    message = "@xxx マウスの電池を交換してから%d日が経過しました。前回の寿命は%d日で平均%s日です。 #demchi" % (s.days,data[0]["last"],"{0:0.1f}".format(data[0]["avg"]))
#    kino.client.request('https://api.twitter.com/1.1/statuses/update.json', 'POST', urlencode({'status': message}))

if __name__ == '__main__':
    demchi_cnt(test.json)
```
最低でも一度目は手動でデータを用意する必要があるので入力後はここでチェックしました。
[http://jsonlint.com/](http://jsonlint.com/)

data[0]["last"]=20
とかした後で
json.dump(a, open('test.json','w'))
でjsonファイルの方に反映されるっぽい。ただ要素が辞書順に置き換えられるような、、、もう少し色々試しながらで
windows7 64bitで vagrant: 1.3.5 と virtual box 4.3 を利用しようとして躓いた話

# 躓いた内容
+ タイトルの組み合わせだと、Vagrantfileの config.vm.network :private_network でIPを指定した場合、`vagrant up` 時にホストオンリーネットワークの作成に失敗する(ホストからIPで接続できない状態になる）

# 解決策
+ virtual box 4.2を利用する

ソフトウェアのマイナーバージョンは新しいほうがいいはず（きりっ
という思い込みがあったので解決まで長い時間がかかりました・・・

VirtualBoxのGUIから手動でホストオンリーネットワークを作成しようとしてもエラーになっている状態でした。
自分の環境が悪いだけのような気もしますが、もしかしたら同様のエラーに苦しんでいるひともいるかもしれないと思ったので軽いメモがてら。
自分が必要とする最低限の git submodule の知識

それは git プロジェクトに別のリポジトリの特定コミットを示すポイントを埋め込むものです。

理屈の上では、「どのディレクトリに対して、どのリポジトリが関連付けられており、コミットオブジェクトのハッシュはこれです」っていう情報が管理されているだけのシンプルなもの。

以下のような構成のプロジェクトを簡単に管理できます。

```
root_project/
├── external_project
│   ├── library1（独立した git リポジトリ）
│   │   ├── lib
│   │   └── src
│   ├── library2（独立した git リポジトリ）
│   │   ├── lib
│   │   └── src
│   ├── library3（独立した git リポジトリ）
│   │   ├── lib
│   │   └── src
│   └── library4（独立した git リポジトリ）
│       ├── lib
│       └── src
└── main_project
    ├── lib
    └── src
```

## まずはリファレンスと関連する議論

http://qiita.com/sotarok/items/0d525e568a6088f6f6bb
http://tech.a-listers.jp/2013/05/17/alternatives-to-git-submodule-git-subtree/


## ドキュメントは git submodule --help  / man git-submodule 

まず最初に確認するのはドキュメントの見方です。

```
$ man git-submodule
```

## git submodule add で別の git リポジトリを追加できる

```
$ git submodule add "git:../library1.git" library1
```
これやった直後は `.gitmodules` ってファイルができるだけだと思ってOK。

```
$ cat .gitmodules 
[submodule "library1"]
	path = library1
	url = git:../library1.git
```

追加した後は、`git submodule update --init` してあげること。（`git submodule init` が必要というのが細かくハマりました。慣れればわかるんだけど…） 

## git submodule update --init  --recursive で再帰的に更新する

サブモジュールもサブモジュールを持っている場合もあります。チェックアウト後とか pull 後、またはローバックした際に更新する際、再帰的に git submodule update したい場合があります。そんな時は update サブコマンドに `--recursive` オプションを指定します。

```
# git pull -f 
# git submodule update --init --recursive

Submodule path 'library1': checked out '587efa1a0328b5f5664eff2947ec6cb9f0cb8150'
Submodule path 'sublibrary': checked out 'e8245c89795619370537bfa149091e4dd1894ae7'
```

## サブモジュールの示すリビジョンを変更する

サブモジュール内に入って `git checkout` して、その後外側で `git add` します。

理屈は簡単だけど、意外にめんどくさい。
Mavenで作ったwebappプロジェクトをEclipseのtomcatプラグインで実行する

なんかよく忘れるので。

## MavenでWebアプリのプロエクトを作る

```shell-session
$mvn archetype:generate
```

下記を選ぶ。

```
org.apache.maven.archetypes:maven-archetype-webapp (An archetype which contains a sample Maven Webapp project.)
```

こんな階層でプロジェクトが作られる。

```
* ROOT
    * pom.xml
    * src
        * main
            * java
            * webapp
                * WEB-INF
                    * web.xml
    * target
```

## Eclipseに取り込む

```shell-session
$mvn eclipse:eclipse
```

これでEclipseのプロジェクトに取り込めるようになる。
`ファイル＞インポート` で取り込む。

### Eclipse tomcatプラグインの設定

こんなかんじにTomcatのパスを設定する。
![tomcat.PNG](https://qiita-image-store.s3.amazonaws.com/0/31010/c556e436-d440-aeaa-07c8-8901d07de24d.png)
コンテキストファイルがいいと思われ。

### コンテキストファイルを作る

上記で指定したコンテキストファイルの場所に下記のようなxmlを作る。

```xml:servlettest.xml
<Context path="/servlettest" reloadable="true" docBase="D:\Users\MyName\workspace\servlettest\" workDir="D:\Users\MyName\workspace\servlettest\work" />
```

そして、さっき作ったEclipseプロジェクトの*.classファイルの出力フォルダーを以下に設定する。
```:.classpath
<classpathentry kind="output" path="src/main/webapp/WEB-INF/classes"/> 
```

依存するライブラリはlibに手で移さねばならん。
一回```mvn package```して、```target/${war名}/WEB-INF/lib```をコピると良いかも。

んで、Eclipseからtomcatを起動すると、http://localhost:8080/servlettest にマップされる。
CallFunc::createがv3.0から変更されているようです


CC_CALLBACK_0を使って引数を指定するやり方が簡単みたいです。

```c++:
    m_pBox1->runAction(MyAnimation::boxesStartAction(CC_CALLBACK_0(GameScene::playDroppingSound, this)));

(略)

FiniteTimeAction *MyAnimation::boxesStartAction(const std::function<void()> &func)
{

(略)

    DelayTime *delay2 = DelayTime::create(0.9);
    CallFunc *callfunc = CallFunc::create(func);
    FiniteTimeAction *seq = Sequence::createWithTwoActions(delay2, callfunc);

(略)

}
```
windows are expected to have a root view controller at the end of application launch

xib作成時にデフォルトで生成されたView(①)とは異なるUIView(②)をxibに追加し、ルートとなるUIViewをそちらの新規UIViewに差し替えたときにReferencing Outletの付け替えを忘れると発生する。
②のReferencing OutletsよりNew Referencing OutretをFile's Ownerに結んだところ解消できた。
Menuの使い方がv3.0から変わっているのでメモしておく


MenuItemLabel::createあるいはMenuItemImage::createの引数が変わっているので気をつけましょう。

```c++
void GameScene::makeRetryButton()
{
    Size winSize = Director::getInstance()->getWinSize();
    LabelTTF *retryLabel = LabelTTF::create("Retry", "Arial", 24.0);
    MenuItemLabel *retryItem = MenuItemLabel::create(retryLabel, CC_CALLBACK_1(GameScene::tapRetryButton, this));
    retryItem->setPosition(Point(winSize.width * 0.9, winSize.height * 0.2));
    Menu *menu = Menu::create(retryItem, NULL);
    menu->setPosition(Point::ZERO);
    this->addChild(menu);
}
```

今回はここまで。
Resources追加時の注意点

Finderなどから直接ファイルをXcodeのResourcesフォルダにドラッグ＆ドロップするとファイルが追加されますが、FileUtils::setSearchPathsメソッドでのファイル検索パス設定はうまく働かないようです。

少し面倒でも、毎回プロジェクトのフォルダにFinderなどでファイル自体をコピーしてから、XcodeのResourcesフォルダの"Add Files to ..."からファイル追加をするようにしましょう。
Adobe Edgeで素のhtmlファイルを読み込む

Tizen IDEのBasicテンプレートを使ってみた。Adobe EdgeはJQueryを使用している。


1.Tizen New Web App
  Template > Basic > Basic Application

2.Adobe Edgeでindex.htmlを開く

3.Adobe Edgeの画面でComposition ClassのIDを確認。

4.そのIDでindex.htmlのbodyのタグの直下に div id="Stage" class="EDGE-xxxxx"のタグを追加. xxxxxはcomposition classのID

例 div id="Stage" class="EDGE-5472744"


5.これでステージのサイズをAdobe Edgeで指定可能になる。横幅320が適当のようです。

edge_screen_copy_01.jpegを参照

6.適当な要素を選択して、ドラッグして位置を変更したら、変形してみる。変更内容は、index_edge.jsに出力される。

7.つぎにアニメーションをつけたいので、Only Show Animated Elementsのアイコンをクリックして、
オフ状態にして、全部のエレメントを表示させる  

　edge_screen_copy_01.jpegを参照

![edge_screen_copy_01.jpeg](https://qiita-image-store.s3.amazonaws.com/0/28956/3ded7538-3d46-ce93-cfa9-08b4ab5bdeaa.jpeg)
![edge_screen_copy_02.jpeg](https://qiita-image-store.s3.amazonaws.com/0/28956/cc10aa76-26e6-8b66-8893-1417768abcb9.jpeg)