OmniAICreator/Qiita-1.07M huggingface dataset:
Test::MojoでビルドされたアプリにPhantomJSでアクセスする



## 概要

やり方は、以下の手順。

1. Test::Mojo->newする。
2. Test::TCPのserver側で、Mojo::Server::Daemonを使用して一時的なWebサーバを立ち上げる。
3. Test::TCPのclient側で、PhantomJSのコマンドを実行。引数にポート番号を渡す。
4. PhantomJSのスクリプト内でポート番号を受け取って、Webサーバにアクセスする。


## PhantomJSのスクリプト

PhantomJSのスクリプトは例えば以下のようになる。

```javascript:t/scenario1.js
var System = require('system');
var port = System.args[1];
var page = require('webpage').create();

page.open('http://127.0.0.1:'+port+'/', function() {
    page.render('test.png');
    phantom.exit();
});

```

コマンドライン引数でポート番号を受け取り、
トップページのスクリーンショットを取るスクリプトとなっている。


## テストコード(Perl)

テストコードは以下のようになる。

```perl:t/basic.t
use strict;
use warnings;
use File::Basename;
use Mojo::Server::Daemon;
use Test::TCP;
use Test::More;
use Test::Mojo;

my $t = Test::Mojo->new('SampleApp');

# Webサーバ設定
my $server = Test::TCP->new(
    code => sub {
        my $port = shift;
        my $daemon = Mojo::Server::Daemon->new(listen => ['http://*:'.$port]);
        $daemon->app($t->app);
        $daemon->run;
    }
);

# サーバのListenポートを取得
my $port = $server->port;

# PhantomJSのコマンドを実行
my $file = dirname(__FILE__) . '/scenario1.js';
`phantomjs $file $port`;

# 実行後のDBの状態を調べたりしてテストする
ok 1;

done_testing();
```

## テスト実行

以下のコマンドで実行。

```shell
$ prove -l t/basic.t
```

テストを実行すると、実行したディレクトリにトップページのスクリーンショットファイルが生成される。

## 用途

Javascriptの動作テストをするときにやりたかった。

PhantomJSスクリプト内でHTMLのチェックなどはしないで、
Perl側で最終的なDBの状態をチェックするような方法を取った。

HTMLチェックをするなら、PhantomJSからHTMLを返してもらって、
Mojo::DOM::HTMLとTest::Moreでチェックする方法を選ぶ。

PhantomJSは止まらない場合があるので、
タイムアウトを設定して実行したほうが良い。
タイムアウトした場合は、テスト失敗になるように。
Vim Tutorial まとめ

※参考：http://uguisu.skr.jp/Windows/vi.html

#動作

## **Vimの起動と終了**

* :e ファイル名：ファイルを開く 
* ESCキー：ノーマルモード
* :wq：保存して終了
* :w：保存
* :q!：保存しないで終了
* :w ファイル名：名前をつけて保存
* :!dir：ディレクトリの一覧を表示

## **移動**

* h→左
* j→下
* k→上
* l→右
* 0→行頭
* 数字w→？個前の単語に移動
* 数字e→？個目の単語の末尾に移動

## **ファイル内での移動**

* 数字G：？行目に移動
* gg：ファイルの最初に移動
* G：ファイルの最後に移動

## **オプション**

* :set オプション名：オプションの設定
* :q：閉じる

## **ヘルプ**

* :help：ヘルプの表示

## **Vimの設定**

* _vimrc（win向け）を設定

## **コマンドの呼び出し**

* コマンドの頭文字-Ctrl-D：コマンドの呼び出し

#テキスト

## **戻す**

* u：最後のコマンドを戻す
* U：行全体の変更を戻す
* Ctrl-R：戻したものを戻す

## **テキストの挿入**

* i：カーソルの左から入力開始
* I：行頭から入力開始
* a：カーソルの右から入力開始
* A：行末から入力開始
* o：下の行から入力開始
* O：上の行から入力開始

## **テキストの削除**

* x：削除
* dw：単語の末尾まで削除
* d$：行末まで削除
* dd：行全体を削除
* d数字w：？個の単語を削除
* 数字dd：？行を削除

## **テキストの貼り付け**

* y：コピー
* p：貼り付け

## **テキストの検索**

* /<文字列>：文字列を検索する（順方向）
* ?<文字列>：文字列を検索する（逆方向）
* n：順方向へ検索する 
* N：逆方向へ検索する 
* %：(,[に対して対応する),]や}を検索 
* Ctrl-O：元の場所に戻る

## **テキストの削除と挿入**

* cw：単語の末尾までを削除し挿入
* c$：行末までを削除し挿入

## **テキストの置換**

* :s/A/B：現在行の最初のAをBに置換する 
* :s/A/B/g：現在行の全てのAをBに置換する
* :#,#s/A/B/g：？行から？行までのすべてのAをBに置換する
* :%S/A/B/g：ファイルの中の全ての検索語句を置換する
* :%s/A/B/gc：cを加えると置換の度に確認を求める
* r：カーソルの下の文字を置換
* R：単語の末尾までを置換

## **テキストの選択・保存・取込**

* v：テキストの選択
* v-:w ファイル名：選択範囲に名前を付けて保存
* :r ファイル名：ファイルの中身の取込
管理しているネットワーク上のホストがOpenSSL Heartbleed脆弱性の影響を受けるかどうかまとめてチェックするワンライナー


適当なディレクトリーでHeartbleederをダウンロードして解凍しておく。

```
curl -L http://gobuild.io/github.com/titanous/heartbleeder/master/darwin/amd64 -o output.zip
unzip output.zip
```

443番ポートが空いているホストを検知して、順にHeartbleederにかける。

```
sudo nmap -sS -p443 -oG - 【ネットワークアドレス】/【ネットマスク】 | grep "Ports: 443/open" | awk '{ print $2 }' | ( while read HOST ; do ./heartbleeder $HOST 1>/dev/null || echo $HOST ; done)
```

脆弱性があるホストだけが出力される。

自分が管理しているネットワーク以外にやっちゃダメだよ！

###### 2014年4月10日補足

[masscan](https://github.com/robertdavidgraham/masscan)の最新版にもHeartbleed脆弱性を検出する機能が追加されたようですが、僕の環境ではうまく検知ができませんでした。

###### 2014年4月16日補足

Nmap 6.45がリリースされ、OpenSSL Heartbleed脆弱性のチェックを行なうssl-heartbleed.nseスクリプトが含まれるようになったので、[管理しているネットワーク上のホストがOpenSSL Heartbleed脆弱性の影響を受けるかどうかNmapでまとめてチェックする](http://qiita.com/tnayuki/items/93a58e8bca009ad2f478)を投稿しました。
[Objective-C] 呼び出し元メソッドを調べる


実際の実装に使っていいかは分かりませんが、呼び出し元を調べる方法を探していて[stack overflow](http://stackoverflow.com/questions/1793999/how-to-find-out-who-called-a-method/1794051#1794051)で見つけたのでメモしておきます。

```objc
// `callStackSymbols`メソッドでコールスタックを得る
NSString *sourceString = [NSThread callStackSymbols][1];
//=> （出力例）1   AppName        0x000bca8a -[AnyViewController viewDidAppear:] + 266

// `NSCharacterSet`クラスを使ってセパレータのセットを作る
NSCharacterSet *separatorSet = [NSCharacterSet characterSetWithCharactersInString:@" -[]+?.,"];

// セパレータを使ってスタックの文字列を分解
NSMutableArray *array = [NSMutableArray arrayWithArray:[sourceString componentsSeparatedByCharactersInSet:separatorSet]];

// 空文字を排除
[array removeObject:@""];

// それぞれを出力
NSLog(@"Class caller = %@", array[3]);  // => AnyViewController
NSLog(@"Method caller = %@", array[4]); // => viewDidAppear:
```
自分用メモ: mysqldump でダンプを取る時に指定しておきたいオプション

あまりにも何度もハマってその度に調べてやりかたを覚えるんだけど、またしばらくすると忘れてしまう事案の代表格、 ``mysqldump`` でダンプを取るときに指定しておきたいオプションをまとめておく。

- ``--default-character-set=binary``
    - 文字集合／エンコーディングについて深く考えるのが面倒なので、とりあえずまずはバイナリでいいよね、きっと。
    - ダメだったら他の文字集合／エンコーディングに乗り換えよう、ぐらいの気持ち。
- ``--hex-blob``
    - ``blob`` なカラムを含むテーブルの場合には忘れぬように。

## 参考文献

- [mysqldumpでバックアップをする時につけるオプション | おいぬま日報](http://blog.lampetty.net/blog_ja/index.php/archives/292)
CoffeeScript: 配列の差分(diff)を取る一行の関数


```coffeescript
list1 = ["green", "red", "blue", "red"]
list2 = ["green", "yellow", "red"]

# 独立した関数を定義する場合
diff = (list1, list2)-> (value for value in list1 when list2.indexOf(value) is -1)

# prototypeを拡張する場合
Array::diff = (array)-> (value for value in this when array.indexOf(value) is -1)

console.log diff(list1, list2)
console.log list1.diff(list2)

```

IE8以下対応は `Array.prototype.indexOf` を定義しないとだめ http://qiita.com/suin/items/f08af948279f87d84865#1-1


```coffeescript
Array::indexOf or= (item) ->
    for x, i in this
        return i if x is item
    return -1
```
AWS SNSからiOSにPush通知を送る（デバイストークン指定）

端末のデバイストークンをサーバサイドで保持していれば、下記にて個別に通知できる。

```rb
# @access_key_id、@secret_access_key、@regionは、適切にセットする。
# Pushしたい端末のデバイストークンを@device_tokenにセットする。

# 送信データ
data = {"aps"=>{
          "alert"=>"メッセージ",
          "badge"=>badge_cnt,
          "sound"=>"default"}
        }.to_json
message = {"APNS"=>data}.to_json

# エンドポイント作成
sns = AWS::SNS.new(:access_key_id => @access_key_id,
                   :secret_access_key => @secret_access_key,
                   :region => @region)
client = sns.client
response = client.create_platform_endpoint(
                      platform_application_arn: @application_arn,
                      token: @device_token)
endpoint_arn = response[:endpoint_arn]

# 送信
if client.publish(target_arn: endpoint_arn,
                  message: message,
                  message_structure: 'json')
  Rails.logger.info "publish success"
else
  Rails.logger.error "publish failed"
end
```
文字列からRailsのクラスにアクセスしたいとき


```ruby
"ModelName".constantize # -> ModelName
```

Rails3から導入された __constantize__メソッドは、文字列が現在のネームスペース内で定数として存在していないか探し、存在していたらそれを返します。

クラスは定数なので、もしActiveRecordを継承して定義されたクラスの場合、そのままDBのレコードにアクセスすることもできます。

```ruby
"ActiveRecordModelName".constantize.first # -> DB recordが返ってきます
```

##使いどき
* あるRailsプロジェクト外のDBから、データをマイグレートしているときに、マイグレート元とマイグレート後で、スキーマを結構変えました。

* そこで、DatabaseConvertMapperというクラスを自作して、そこでDBのマイグレーションの対応表を作っていました。

* その文字列からレコードにアクセスするときに使ってみました。他にも良い方法あればぜひ教えてください。
[Alloy Analyzer] Cruise Control System1

[ESEC2014](http://www.esec.jp/seminar/#ES-1)でのAlloy Analyzerのデモを
担当することになった。

SyncStitch版だけでなく、Alloy Analyzer版のモデルもCruise Control System
にすることになった。

とにかく、短時間で説明可能なモデルを作成する。

```als:CruiseControlSystem1.als
module CruiseControlSystem

/*
	Initial model of Cruise Control System
	Kenichi Kobayashi
*/

enum ControlStatus { enable,disable }
enum Speed { Null, Zero, Low, Normal, High, VeryHigh }

sig SpeedControl {
	hasControl: one ControlStatus,
	targetSpeed: one Speed,
	currentSpeed: one Speed
}

pred clearSpeed[c,c':SpeedControl] {
	// clearSpeed発生時、事後の速度は何にするべきか?
	c'.targetSpeed = Null // もしNoneの場合、enableであったらどんな動作をするか?
}

pred recordSpeed[c,c':SpeedControl] {
	c'.targetSpeed = c.currentSpeed // 現在速度を目標速度として設定してよいのか?
}

pred enableControl[c,c':SpeedControl] {
	c'.targetSpeed = c.targetSpeed
	c'.hasControl = enable
	// targetSpeedが設定されていなかった場合はどうするか?
}

pred disableControl[c,c':SpeedControl] {
	c'.hasControl = disable
}

// 制御中に目標速度が初期化されてはいけない
assert enableControlAndTargetSpeedIsNull {
	no disj c,c':SpeedControl | {
		enableControl[c,c'] and
		c'.targetSpeed = Null and
		c'.hasControl = enable
	}
}

// 目標速度は制限速度内でなければならない
assert validTargetSpeed {
	all disj c,c':SpeedControl | { 
		recordSpeed[c,c'] implies c'.targetSpeed not in (Zero + VeryHigh)
	}
}


check enableControlAndTargetSpeedIsNull

check validTargetSpeed

```
npmコマンドの使い方

## 公式サイト
https://npmjs.org/

## ヘルプを見る

```
$ npm help コマンド
$ npm --help コマンド
```


## npmのバージョンを確認する

```
$ npm -v
$ npm -version
$ npm --version
```

## package.jsonを生成する

```
$ npm init
```

## パッケージをグローバルにインストールする

```
$ sudo npm install -g パッケージ
$ sudo npm i -g パッケージ
```
## パッケージをグローバルにまとめてインストールする

```
$ sudo npm install -g パッケージ パッケージ ...
```

## パッケージをグローバルにバージョンを指定してインストールする

```
$ npm install -g パッケージ名@x.x.x
```

## パッケージをプロジェクトにインストールする

```
$ npm install パッケージ
$ npm i パッケージ
```

## パッケージをグローバルからアンインストールする

```
$ sudo npm uninstall -g パッケージ
$ sudo npm r -g パッケージ
$ sudo npm remove -g パッケージ
$ sudo npm rm -g パッケージ
$ sudo npm un -g パッケージ
$ sudo npm unlink -g パッケージ
```

## パッケージをプロジェクトからアンインストールする

```
$ npm uninstall パッケージ
$ npm r パッケージ
$ npm remove パッケージ
$ npm rm パッケージ
$ npm un パッケージ
$ npm unlink パッケージ
```

## グローバルにインストールされたパッケージを全て確認する

```
$ sudo npm ls -g
$ sudo npm la -g
$ sudo npm list -g
$ sudo npm ll -g
```

## グローバルにインストールされたパッケージを個別に確認する

```
$ sudo npm ls -g パッケージ
$ sudo npm la -g パッケージ
$ sudo npm list -g パッケージ
$ sudo npm ll -g パッケージ
```

## プロジェクトにインストールされたパッケージを個別に確認する

```
$ npm ls -g パッケージ
$ npm la -g パッケージ
$ npm list -g パッケージ
$ npm ll -g パッケージ
```

## パッケージの情報を見る

```
$ npm info パッケージ名
$ npm view パッケージ名
$ npm show パッケージ名
```

## npmのリポジトリを検索する

```
$ npm search キーワード
$ npm s キーワード
$ npm se キーワード
```
XAMPPの設定あれこれ。

よくわからないXAMPP周りのエラーを直してもらったのでメモ。

# Apacheがエラーでてつなげないとき

まずはコマンドプロンプトを管理者権限で起動

Windows8の場合、コマンドプロンプトを管理者として実行したい場合
1.「Windows」キーを押しながら「X」キー
2. クイックアクセスメニューから「コマンドプロンプト（管理者）」をクリック

起動したらこれ↓を打つ。

```
taskkill /f /im httpd.exe
```

これでStartし直すと起動するようになるっぽい。
管理者権限で起動せず、ふつうの黒い画面で打つとアクセスが拒否されるので注意。

# htmlでPHPを動作させたい場合の設定
C:\xampp\apache\conf　にある
httpd.conf　の<IfModule mime_module> ～ </IfModule>内に↓を追加

```
AddType application/x-httpd-php .php .html
```


# .htaccessによるアクセス制限

外部からはアクセスできないように設定する。
.htaccess ファイルを作成し↓を記述

```
Order deny,allow
Deny from All
Allow from localhost 127.0.0.1
```

作成したファイルを　C:\xampp\htdocs　に置いておけばOK
英語で週報を書こう

## 英語で週報を書こう
メールで出してる週報についてですが、返信がないため自分は読んでいないものとみなしています。

* 読んでいるといわれても「知らんがな」です。

* 読んでほしいなどという気持ちはありません。

せっかくなので週報は英語を書く勉強にしようと思い立ちました。

## 特にやり方はありません
フリーダムに。

* とりあえず、日本語で考えてみる
* 英語でに書き直してみる
    * 英語で考えて書き直すことで日本語コミュニケーションの持つ暗黙の認知、共通の理解に頼った了解がそぎ落とされる可能性があります。
    * このあたり尾原 和啓さんの「ITビジネスの原理」を参考にしています。
    * まずは日本語でもいいので0から10まできっちり内容を書くことを考えます。
* 「所感」が一番大事なので気合を入れて自分がナイスだと思う一文に仕上げます。
* Markdown Here っていうChromeのエクステンションを使ってそれっぽくしてみます。
* Weblio、グーグル翻訳などとにらめっこです。

## やってみた結果

* うん、プロテインだね
* 英語のメールに慣れている上司なのでちょっとコメントもらえました

以上。
備忘録という名の駄文です。
ROMばっかりですがQiitaには感謝しております。
“Can't create kext cache under / - owner not root” を解決した手順

**TL;DR:** `sudo chown root:wheel /`

----

いつのころからか、コンソールに `com.apple.kextd: Can't create kext cache under / - owner not root.` というエラーメッセージが出力されるようになっていた。文面からするとルートディレクトリのオーナーが root でないことが原因らしい。実際に `ls -ld /` してみるとオーナーが一般ユーザーになっていた：

```
% ls -ld /
drwxrwxrwx  34 uasi  staff  1224  4  7 11:10 /
```

ディスクユーティリティの「ディスクのアクセス権を修復」を実行したが、解決しなかった。このエラーメッセージで検索してみるといくつかのページで解決方法が紹介されているのが見つかる。[com.apple.kextd Can't create kext cache under owner not root.の時は :じゃむ☆ぽろり](http://www.jam-movie.com/podcast/porori/2014/01/comapplekextd_cant_create_kext.html)ではターミナルで `sudo chown root:admin /` を実行すればいいとされているが、ルートディレクトリの元々のオーナーとグループが root:admin で合っているのか不安だったので調べてみた。

Apple のサポートフォーラムの[とある投稿](https://discussions.apple.com/message/11254689#11254689)によれば、次のコマンドでルートディレクトリのアクセス権の初期設定を確認できるそうだ：

```
% lsbom -p MUGsf /private/var/db/receipts/com.apple.pkg.BaseSystem.bom | head -1
drwxrwxr-t root admin .
```

しかし Mavericks では `com.apple.pkg.BaseSystem.bom` ファイルが存在しない（OS X 10.9.2で確認）。どうやら `com.apple.pkg.BaseSystemBinaries.bom` と `com.apple.pkg.BaseSystemResources.bom` の2つに分かれているようなので、 Resources のほうを見てみることにした：

```
% lsbom -p MUGsf /private/var/db/receipts/com.apple.pkg.BaseSystemResources.bom | head -5
drwxr-xr-x 	root	wheel		.
-rw-rw-r-- 	root	admin	0	./.DS_Store
---------- 	root	admin	0	./.file
drwxr-xr-x 	root	wheel		./.vol
drwxrwxr-x 	root	admin		./Applications
```

どう使い分けているかは分からないが、システムディレクトリのグループは wheel と admin が混在しているようだった。肝心のルートディレクトリのグループは wheel だ。 `sudo chown root:wheel /` を実行すると、エラーメッセージは出なくなった。パーミッションも `sudo chmod 1755 /` で755に戻しておいた。
Ubuntu 14.04でApache 1.3 + PHP 3.0(ja)を動かす

deb等には古いパッケージがありません。
かといって、コンパイルしようとするとgccやlibcが新しすぎて、失敗する事があります。

どうしても古い環境でプログラムを動かす必要がある、そんな考古学者向けのエントリーです。

環境
----

* Ubuntu 14.04 α2 (gcc-4.8)
* Apache 1.3.42
* PHP 3.0.18-ja-3

Apacheは`/opt/apache13`へ、PHPは`/opt/php3`を使うようにします

作業
----

```bash
$ sudo apt-get install -y build-essential wget

$ cd src
$ wget http://archive.apache.org/dist/httpd/apache_1.3.42.tar.gz
$ tar xzf apache_1.3.42.tar.gz
$ cd apache_1.3.42
$ sed -i 's/getline/apache_getline/' src/support/htdigest.c
$ sed -i 's/getline/apache_getline/' src/support/htpasswd.c
$ sed -i 's/getline/apache_getline/' src/support/logresolve.c
$ bash ./configure --prefix=/opt/apache13 --server-uid=www-data --server-gid=www-data --enable-rule=SHARED_CORE --enable-shared=max
$ make
$ sudo make install

cd src
## Get `php-3.0.18-i18n-ja-3.tar.gz` from any where.
$ tar xzf php-3.0.18-i18n-ja-3.tar.gz
$ wget https://gist.githubusercontent.com/ma2shita/10234579/raw/52df5601ec4e08c3a32829cf6d651c5300b074e3/i18n_ja_jp_filter.diff
$ cd php-3.0.18-i18n-ja-3
$ nkf -e < ../i18n_ja_jp_filter.diff | patch -p0
$ ./configure --prefix=/opt/php3 --with-config-file-path=/opt/php3 --enable-i18n --enable-mbregex --with-apxs=/opt/apache13/bin/apxs --without-gd
$ make
$ sudo make install
$ sudo mkdir -p /opt/php3/
$ sudo cp php3.ini-dist /opt/php3/php3.ini

$ sed -i '2i\
### BEGIN INIT INFO\
# Provides:          apache13\
# Required-Start:    $$local_fs $$remote_fs $$network $$syslog $$named\
# Required-Stop:     $$local_fs $$remote_fs $$network $$syslog $$named\
# Default-Start:     2 3 4 5\
# Default-Stop:      0 1 6\
# Short-Description: Apache 1.3 + PHP 3.0-ja\
# Description:       Apache 1.3 + PHP 3.0-ja\
### END INIT INFO\
' /opt/apache13/bin/apachectl
$ ln /opt/apache13/bin/apachectl /etc/init.d/apache13
$ sudo update-rc.d apache13 defaults
```

解説
----

* Apacheのsedは`/usr/include/stdio.h:671:20: note: previous declaration of 'getline' was here`対策
* configureをbashで動かしているのは`Warning: Your 'echo' command is slightly broken.`対策

ref: http://www.cambus.net/compiling-apache-1.3.x-on-modern-linux-distributions/

* PHPのpatchは`static declaration of 'u2jtable' follows non-static declaration`対策  
  (ソースがEUC-JPなので、nkfを通しています)

ref: http://thebbl.hideyosi.com/material/99.html

* initscriptはupdate-rc.dで登録できるよう`bin/apachectl`を改造した上で`/etc/init.d`へハードリンクしています。このへんはお好みで。

あとがき
--------

忘れてましたが`php-3.0.18-ja-3.tar.gz`は、ちょっと探してみたのですが、見つかりませんでした。m((__))m
ご自分でお見つけください。もしくは@ma2shi... (ゲフンゲフン

ちなみに、gcc-3.4をビルドして、その環境下でコンパイルする事も試してみましたが、私の力量では無理でした。

こんな環境を作る必要に迫られる事が無きよう、心から願います。
間違っても公開しないようにしてください。

って、PHP3って12年も経っていたのですね。ってXPとほとんど同じか！
ユーザにRoleを付与するBackground Jobs


Parseで安全にユーザにRoleを付与する方法を考えた結果、
Background Jobを使えばいいんじゃないかと思ったので、メモしとく。
やってることは以下↓

1. Role取得。存在しなければ、Role作成
2. ユーザ取得。存在しなければ処理終了
3. ユーザが取得できたらRoleを付与して処理終了


```javascript:role_job.js
Parse.Cloud.job("addUserToRole", function(request, status) {
  Parse.Cloud.useMasterKey();
  var role;
  var query = new Parse.Query(Parse.Role);
  query.equalTo("name", "Moderator");
  query.first().then(function(adminRole) {
    if (adminRole == undefined) {
      var roleACL = new Parse.ACL();
      roleACL.setRoleReadAccess('Moderator', false);
      roleACL.setRoleWriteAccess('Moderator', false);
      return new Parse.Role("Moderator", roleACL).save();
    } else {
      return adminRole;
    }
  }).then(function(adminRole) {
    role = adminRole;
    var query = new Parse.Query(Parse.User);
    query.equalTo("username", request.params.username);
    return query.first();
  }).then(function(user) {
    if (user == undefined) {
      status.success(request.params.username + " not found");
    }
    role.getUsers().add(user);
    role.save();
  }).then(function() {
    status.success('success');
  }, function(error) {
    console.log("Failed with error: " + error.code + ":"+ error.message);
    status.error(error.message);
  });
});
```


そして、usernameパラメータにユーザ名を設定してBackground Jobsを実行
CloudFunctionと違ってマスターキーが必要。Parseに直接アクセスしてScheduled Jobsから実行しても良い。


```Bash
curl -X POST \
  -H "X-Parse-Application-Id:アプリケーションID" \
  -H "X-Parse-Master-Key: マスターキー" \
  -H "Content-Type: application/json" \
  -d '{"username":"ユーザ名"}' \
  https://api.parse.com/1/jobs/addUserToRole
```
逃げちゃった人 ～あるエントリを見て～

２０１１年の９月末に会社を辞め、同年１０月１９日に法人を立ち上げました。

最初は、同じ大学の合気道部の先輩たちと３人でやろうということになっていましたが、縁があってNGO法人をやっていた人たちと一緒にやることになり、合計６人でスタートしました。

__話は現代に戻ります。__

唐突に書き始めましたが、昨日会社メールアカウントの整理をやっていたところ、たまたま残っていたアカウントがあったので創業当時のことを思い出していました。また、[プログラマが独立・起業する時によくするミスと対策 まとめ](http://qiita.com/hshimo/items/776e3ca62be51c3bdc89) を読んだことがこのエントリを書くきっかけになりました。

連絡が取れなくなったのは大体２０１２年の夏くらい。携帯も出ない。メール返信はもちろん無し。その後２週間くらいしたあとで何となく業務に復帰したあと、またしばらくして連絡が取れなくなり、今度は本当に音信不通になってしまいました。ちょうどその時自分は有明のデータセンタでサーバ構築をやっていて、国際展示場駅構内のドトールで返信待ちメールを投げていた記憶があります。

暫くしてメールが着て、『今後は自分の方向性を見据えてやりたいことをやっていく。自分のやりたいことをやる』という趣旨のことが書いてありました。

それっきり、連絡は取れずじまいです。今何をやっているのか、どこにいるのか、生きているのかすら不明です。

別にこのエントリを書くことでその人をこきおろしたいわけではありませんが、当時の自分には __意志薄弱なダメ人間程度にしか思えなかった__ ので罵詈雑言を浴びせて終わってました。改めてメールの履歴を見ると、相当怒ってたのが見て取れます。

翻って自分がきちんと独立できているかというとそんなことはなく、もう２年経ちましたが未だに出向形態です。
　・毎日現場に行って、
　・データベースの設計書を書いて、
　・サーバ構築をして。。
会社員だったころと変わらない毎日を送っています。

今はスターバックスという素晴らしい作業場を見つけたので、スタバ巡りをしながらノートPCを開いてサービス開発のためプログラミングをする毎日です。これがメッチャ楽しい。。いずれ、スタバ以外のカフェ・喫茶店を含めて __喫茶店プログラミング友の会__ と称して、団体プログラマがずらっとテーブルに肩を並べて黙々とキーボードを叩いている姿があったら面白いんじゃないかと思います（笑）。

改めて、取り留めもなく書きましたが結局思ったことは、 __途中で辞めたらもったいない__ ということです。

逃げちゃった人も、院卒でいきなり起業というプロセスを踏んだので社会人としてのバックグラウンドがなく、苦労したでしょう。

でも、一般的な人生を送っていないという点ではアドバンテージでもあるわけです。形に残るものがないうちに、不安に押しつぶされて自分で諦めてしまうのは正直もったいないと思います。

４大卒で新卒でリーマンショック直前の売り手市場のときに就職活動をしました。そこで、　
　1. プログラマとして採用されて軟禁状態で新卒課題をやって、
　2. 現場で失敗して、
　3. 契約終わって仕事が無いからインフラ研修に出て、
　4. サーバ構築の面白さに目覚めてそっち系の仕事をして、
　5. 会社作るから一緒に来ないかと誘われて、
　6. 当時の話と違ってなぜか社長になり、
　7. 色々。。。　←いまここ

順調に道を踏み外しているように見えますが。。。


★2019/07 追記

久し振りに自身について書くと、DBサーバ設計・構築をやっていたら炎上案件を経験し、病んで休職。
そこから復活してRailsでアプリ開発の真似事をするようになり、以降はサーバサイドのソフトウェア開発を主戦場にしています。障害分析対応が得意です。現在はスクラム開発支援ツールの開発に携わっています。
ブログは書いてなかったので、[職務経歴書](http://urx2.nu/9LIV)という形で纏めています（現在も更新中）。
いまは勉強会のご縁で知り合った方に影響され、RDBが楽しいです。SQLアンチパターンがとても面白い。

自分が休職したころと比べて、ITの勉強会プラットフォームはとても発展して使いやすくなりました。主にConnpassを使っていますが、色んな種類の勉強会が開催されていてとても楽しいです。
特に印象に残ってる勉強会は、Perlカンファレンス、英語プレゼン、UX、UIデザイン、VUI、DDD、RDB、1on1、自然言語処理、DevRelです。
今後はRDBを継続しつつ、業務効率化を通してITの知見で人間関係をスムーズにしてゆく方向で学習を継続したいと思っています。
Sprite を指定のサイズに変更する

cc.Spriteにそのサイズにするみたいな関数はないので一手間必要だった。

```js
  var sprite = cc.Sprite.create(s_img);
  var size = sprite.getContentSize();
  sprite.setScale(targetSize.width/size.width, targetSize.height/size.height);
  sprite.setContentSize(cc.size(targetSize.width, targetSize.height));
```
JScriptでBase64


## はじめに

以前、[JScriptでHash取得](http://qiita.com/tnakagawa/items/9bcc26b501f5b995d896)で.NETの一部が使えるとの事で調べていくと、
「System.Security.Cryptography.ToBase64Transform」や
「System.Security.Cryptography.FromBase64Transform」といった、
Base64系のクラスがあったので、これらを利用して、
Base64エンコード、デコードのサンプルメソッドを作ったのですが、
よくよく調べてみると、「Msxml2.DOMDocument」で簡単に出来る事が分かりました。

## Base64

```js
// 「byte配列」から「Base64」に変換
function bytes2base64(bytes) {
    var base64 = null;
    // 「DOMDocument」生成
    var doc = new ActiveXObject("Msxml2.DOMDocument");
    // 「DomNode」生成（base64）
    var element = doc.createElement("base64");
    // 「dataType」に「bin.base64」を設定
    element.dataType = "bin.base64";
    // 「nodeTypedValue」に「byte配列」を設定
    element.nodeTypedValue = bytes;
    // 「text」を取得
    base64 = element.text;
    // 後処理
    element = null;
    doc = null;
    return base64;
}

// 「Base64」から「byte配列」に変換
function base642bytes(base64) {
    var bytes = null;
    // 「DOMDocument」生成
    var doc = new ActiveXObject("Msxml2.DOMDocument");
    // 「DomNode」生成（base64）
    var element = doc.createElement("base64");
    // 「dataType」に「bin.base64」を設定
    element.dataType = "bin.base64";
    // 「nodeTypedValue」に「byte配列」を設定
    element.text = base64;
    // 「text」を取得
    bytes = element.nodeTypedValue;
    // 後処理
    element = null;
    doc = null;
    return bytes;
}
```

## 蛇足

簡潔になりすぎたので、Base64とは全く関係ありませんが蛇足です。
 __実際に使う場面は無いと思われます、読み飛ばし推奨です。__

「Msxml2.DOMDocument」オブジェクトの「dataType」ですが、
「string、number、Int、Boolean、dateTime、bin.hex、bin.base64」などあります。

以前、.NETの「System.Text.StringBuilder」が利用できるとわかった時
「AppendFormat」メソッドを上手に使えないかなと思ったのですが、
実際は、JScriptのDate型がそのまま渡せず、断念しました。

「dataType」の「dateTime」を使うとどうやらいけるようです。
ただし、コードが長いだけで、意味は無いかもしれません。

```js
// 「文字列」から「dateTime型」へ変換
function string2dateTime(string) {
    var dateTime = null;
    // 「DOMDocument」生成
    var doc = new ActiveXObject("Msxml2.DOMDocument");
    // 「DomNode」生成（dateTime）
    var element = doc.createElement("dateTime");
    // 「dataType」に「dateTime」を設定
    element.dataType = "dateTime";
    // 「nodeTypedValue」に「byte配列」を設定
    element.text = string;
    // 「text」を取得
    dateTime = element.nodeTypedValue;
    // 後処理
    element = null;
    doc = null;
    return dateTime;
}
```

変換対象の文字列はXMLのdateTimeフォーマットに合わせると、一応できるようです。

```js
// 「StringBuilder」オブジェクト生成
var builder = new ActiveXObject("System.Text.StringBuilder");

// 現在日時取得
var date = new Date();
// 「yyyy-MM-dd'T'HH:mm:ss」型の文字列生成
var string = date.getFullYear() + "-"
            + ("0" + (date.getMonth() + 1)).slice(-2) + "-"
            + ("0" + date.getDate()).slice(-2) + "T"
            + ("0" + date.getHours()).slice(-2) + ":"
            + ("0" + date.getMinutes()).slice(-2) + ":"
            + ("0" + date.getSeconds()).slice(-2);

// 「dateTime」取得
var dateTime = string2dateTime(string);

// フォーマット
builder.AppendFormat("{0:yyyy/MM/dd HH:mm:ss dddd tt zzz}", dateTime);
WScript.Echo("" + builder.ToString());

// 後処理
builder = null;
```
あるクラスの男女別の成績から母分散を検定する

あるクラスの男子女子の 50 メートル走の記録から母分散を判定して仮説検定してみましょう。

ここでもう一度[仮説検定と確率分布](http://qiita.com/ynakayama/items/e41f592ad7fe02f23c1c)について考えてみましょう。

正規母集団 N(μ, σ^2) の母分散 σ^2 の検定を考えます。

あるサンプルを正規母集団 N(u, σ^2) からの標本とすると

```math
T = \frac {nS^2} {\sigma^2} = \frac {1} {\sigma^2} {\sum_{k=1}^n} (X_k - \overline{X})^2 \\
```
は χ^2(n-1) に従います。

このときの χ^2(n-1) は自由度 n-1 の χ 二乗分布です。

このことから母分散 σ^2 の検定法が得られます。これがカイ二乗検定でした。

### 等分散仮説の検定

```
体育の授業で 50 メートル走の記録を計測しました。その結果は表に示すとおりでした。このクラスでは男子のほうが速いように見えますが、学年全体でも果たしてそうでしょうか。
```

| 性別 | 人数 | 平均タイム | 標準偏差 |
|:--|:--|:--|:--|
|男子| 7 | 7.9 | 0.9 |
|女子| 8 | 9.0 | 0.7 |

確かに男子のほうが速そうです。このとき、男子女子のタイム全体を正規分布に従うと仮定します。ふたつの N(μ, σ^2) のグループができるわけですが、それぞれの σ^2 が等しいかどうかわかりません。したがいまして等平均仮説の検定がおこなえません。そこではじめに分散を検定します。

男子女子それぞれを N(μ_a, σ^2_a), N(μ_b, σ^2_b)とし、不偏分散 U^2_a, U^2_b とすると

```math
T = \frac {U^2_a/\sigma^2_a} {U^2_b/\sigma^2_b}
```

は自由度 (N_a-1, N_b-1) の F 分布に従います。

### F 分布

F 分布は自由度を持ちますが、 F 分布の自由度は自然数 (m,n) というペアで、自由度 (m,n) の F 分布を F(m,n) と表記します。

さっそく F(m,n) の密度関数を [SciPy](http://docs.scipy.org/doc/scipy-0.13.0/reference/generated/scipy.stats.f.html) で生成し、プロットしてみましょう。

```py3
import numpy as np
from scipy.stats import f
import matplotlib.pyplot as plt

def draw_graph(dfn, dfd):
    rv = f(dfn, dfd)
    x = np.linspace(0, np.minimum(rv.dist.b, 3))
    plt.plot(x, rv.pdf(x)) # 描画する

draw_graph(1, 1) # F(1,1) を青で
draw_graph(2, 1) # F(2,1) を緑で
draw_graph(5, 2) # F(5,2) を赤で

plt.grid(True)
plt.show()
plt.savefig('image.png')
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/38501/91c9a18e-ef7d-56fd-b629-363e0ed5f317.png)

一般的に X, Y が独立でありそれぞれ χ^2(m) および χ^2(n) に従うとき、 T = (X/m)/(Y/n) が従う分布を自由度 (m,n) の F 分布と言います。

先ほどの例で有意水準を 0.05 とすると Na - 1 = 6, Nb - 1 = 7 で自由度 (6,7) の 2.5% は F 分布の数表から

```math
F_7^6 (0.025) = 5.12 \\
F_7^6 (0.975) = \frac 1 {F_6^7 (0.025)} = 1/5.70 = 0.18
```

となります。

U_a^2 , U_b^2, T の実現値は

```math
\mu_a^2 = \frac {7 × 0.9^2} {7-1} = 0.945 \\
\mu_b^2 = \frac {8 × 0.7^2} {8-1} = 0.560 \\
t = \frac {\mu_a^2} {\mu_b^2} = \frac {0.945} {0.560} = 1.69 < 5.12 = F_7^6(0.025)
```

となりますので、帰無仮説 σ_a^2 = σ_b^2 は棄却されません。

そこであらためて等平均仮説の検定をおこないます。

```math
N(\mu_a, σ^2_a) : n_a = 7, \overline{X}_a = 7.9, S_a = 0.9 \\
N(\mu_b, σ^2_b) : n_b = 8, \overline{X}_b = 9.0, S_b = 0.7
```

したがって

```math

t = \frac {\overline{X}_a - \overline{X}_b} {\sqrt{ (\frac 1 {N_a} + \frac 1 {N_b}) × \frac {{N_aS_a^2} + {N_bS_b^2}} {(N_a - 1) + (N_b - 1)}} } \\
= \frac {7.9 - 9.0} {\sqrt{ (\frac 1 7 + \frac 1 8) × \frac {{7 × 0.9^2} + {8 × 0.7^2}} {(7 - 1) + (8 - 1)}} } \\
= -2.47

```

これは棄却域に属するので U_a = U_b は棄却されます。したがいまして 50 メートル走は男子のほうが速いことになります。


### 参考

ゼロから学ぶ統計解析
http://www.amazon.co.jp/dp/4061546562/
npmでローカルのbinファイルを使いたい


2015.11.13 追記

最近は`source .rc`ではなく`./env.sh hoge.[pl|js]`の方がいいかなと思ってそうしてます。

```env.sh
#!/bin/sh

export PATH=$(npm bin):$PATH
exec $*
```



---

npmにはbundlerやcartonにあるような`npm exec`相当のものはないようで、package.jsonに記述して使う`npm run-script`も`node_modules/.bin/`をPATHに入れてくれるものの、ちょっと用途が違う。

結局自分でパスに追加するのが簡単かなーと。
`vi .rc`

```.rc
#!/bin/sh

export PATH=$(npm bin):$PATH
```
これを作業前に`source .rc`で読みこめば`node_modules/.bin/`から参照してくれます。

ちなみにperlのcaronでも何度も`carton exec`を打つのが面倒な時は同じようなことをしています。

```.rc
#!/bin/sh

eval $(perl -Mlocal::lib=local)
#呼び出される内容は以下

#CURRENT_DIR
#PATH="$CURRENT_DIR/local/bin${PATH+:}${PATH}"; export PATH;
#PERL5LIB="$CURRENT_DIR/local/lib/perl5${PERL5LIB+:}${PERL5LIB}"; export PERL5LIB;
#PERL_LOCAL_LIB_ROOT="$CURRENT_DIR/local${PERL_LOCAL_LIB_ROOT+:}${PERL_LOCAL_LIB_ROOT}"; export PERL_LOCAL_LIB_ROOT;
#PERL_MB_OPT="--install_base \\"$CURRENT_DIR/local\\""; export PERL_MB_OPT;
#PERL_MM_OPT="INSTALL_BASE=$CURRENT_DIR/local"; export PERL_MM_OPT;
```

2つ並べて気がついたけど、perlは`PERL5LIB`にパスを通してあげないと`use Module`できないけど
nodeは特に何もせず`require('Module')`でnode_modulesを読んでくれます。
さらに言うと'../node_modules`とどんどん遡って探してくれるそうです。
http://nodejs.jp/nodejs.org_ja/api/modules.html#modules_loading_from_node_modules_folders
MediaStore.Images.Media の BUCKET_ID はどこからやってくるのか

ギャラリーアプリが、画像をアルバム（フォルダ）ごとにわけているのを見て、データベース上にアルバムを識別する ID があるのだなと思って調べてみた。

## MediaStore が持つアルバムの識別子

アルバムの識別子は [BUCKET_ID](http://developer.android.com/reference/android/provider/MediaStore.Images.ImageColumns.html#BUCKET_ID) というのがデータベースのカラムに存在していて、そこに保存されている。

BUCKET_ID と BUCKET_DISPLAY_NAME だけを管理するような、リレーショナルな構造にはなっておらず、画像データに関するカラムとアルバムに関するカラムがくっついた状態になっている。

## アルバムごとに GROUP BY する

ギャラリーのように、アルバムごとにリストをつくろうと思うと、SQL でアルバムごとに GROUP BY した結果が欲しくなる。しかし、ContentResolver で問い合わせる時に、GROUP BY をするようなインタフェースは存在しないので、無理やり SQL をねじ込むことになる。

コードは[このヘルパ](https://android.googlesource.com/platform/packages/apps/Gallery2/+/android-4.4.2_r2/src/com/android/gallery3d/data/BucketHelper.java)にあるとおりで、WHERE 句が内部的に`WHERE (%s)`と書かれていて、SELECTION がこの %s に入ることを利用して、SQL インジェクションもびっくりの `1) GROUP BY 1, (2` を入れることで、`WHERE (1) GROUP BY 1,(2)`なる SQL 文が完成する。SELECT 文では、BUCKET_ID が最初のカラムに指定されているので、これによってグルーピングされる。

## ところで、画像を MediaStore に登録するときに BUCKET_ID なんか自分で指定したこと無いんだけど

公式の API にも、BUCKET_ID を自分で指定するようなものは無い。
無いということは、どこかで自動で計算しているはず、ということで探してみた。

MediaStore が見に行くのは、MediaProvider という ContentProvider。その中で、computeBucketValues なるメソッドがあって、ここで BUCKET_ID が計算されている。

コード上は[このあたり](
https://github.com/android/platform_packages_providers_mediaprovider/blob/master/src/com/android/providers/media/MediaProvider.java#L1986)にある。

画像を保存したディレクトリのパス文字列を全て小文字にした上で、その hashCode() を BUCKET_ID にしています。

## そういうわけで

GROUP BY の闇はアプリの中においておきたくないので、ライブラリにまとめてみました。

https://github.com/nohana/DeviceAlbums

BucketId の闇も何とか出来る部分は何とかしたい。
ActiveX.DLLを.NET用のDLLに変換する手順

ActiveX DLLライブラリは.NETでも利用可能だが、.NETから利用できるようにするためにはラップする必要があるのでその手順を以下に記載
（ActiveX.DLLの公式でサポートしていないバージョンのVisualStudioで使用したい場合などに手動で作成する。）

##手順（SampleActiveX.dllというActiveXの.NETラッパーDLLを作成する手順例）

1. 取込みを行いたい.NET FrameworkのバージョンのSDKもしくはVisualStudioのコマンドプロンプトを開く
2. CDコマンドでワークスペースのフォルダに移動する（DLL等を作成したい場所）
3. 以下の手順でコマンド実行

```lang:command 
Sn -k activeXDllKey.snk
Aximp /keyfile:activeXDllKey.snk SampleActiveX.dll
```

>上記例でSampleActiveX.dllの部分は対象のファイル名に合わせて変更

以上
`SampleActiveX.dll`と`AxSampleActiveX.dll`が生成される。
※Axプリフィックスが付いているほうがラッパークラスです。

上記で生成されたDLLに参照設定することで、.NET上でActiveX.DLLを使用可能
LightTableのビヘイビア設定メモ

LightTableのユーザ定義のビヘイビア設定メモです。あまり追加設定の必要はないかもって感じですが

```clj:user.behaiviors
{:+ {
     ;; The app tag is kind of like global scope. You assign behaviors that affect
     ;; all of Light Table here
     :app [(:lt.objs.style/set-skin "dark")
           :lt.objs.sidebar.workspace/workspace.open-on-start
           :lt.objs.intro/show-new-file]

     ;; The editor tag is applied to all editors
     :editor [(:lt.objs.style/set-theme "rabbit-house-dark")
              :lt.objs.editor/line-numbers
              :lt.objs.editor/wrap
              :lt.objs.editor/highlight-current-line
              :lt.objs.editor.file/remove-trailing-whitespace
              (:lt.objs.console/set-console-limit 1000)
              ]

     ;; Here we can add behaviors to just clojure editors
     :editor.clojure [(:lt.objs.langs.clj/print-length 1000)]}

 ;; You can use the subtract key to remove behavior that may get added by
 ;; another diff
 :- {:app []}}
```

オススメなのはこんなところでしょうか。

|設定|概要|
|:--|:--|
|:lt.objs.sidebar.workspace/workspace.open-on-start|起動時にWorkspaceを開く|
|:lt.objs.intro/show-new-file|起動時に新しいファイルを開く|
|:lt.objs.editor/line-numbers|行番号を表示する|
|:lt.objs.editor/highlight-current-line|現在行をハイライト表示する|
文字列の結合を更に速くする


[Java8時代の文字列連結まとめ](http://d.hatena.ne.jp/nowokay/20140409#1397010846)
面白かったので、もうちょい速くしてみました。

```java:
public static String stringBuilderJoinMem2() {
    StringBuilder s = new StringBuilder(9000);

    s.append('[');
    for (int i = 0, l = strarray.length; i < l; ++i) {
        s.append(strarray[i]);
        s.append(']');
        s.append(',');
        s.append('[');
    }
    s.setLength(s.length() - 3);
    s.append(']');

    return s.toString();
}

```

自分の環境ではstringBuilderJoinMemよりも100msくらい速くなりました。

デリミタが固定でいいならcharをappendした方が速いです。Stringやchar[]のappendはSystem#arraycopy()が行われるため、JNIのオーバーヘッドがボトルネックになっているような気がします。

##System.arraycopyは遅いの？
測ってみました。Javaコードによる配列のコピーとSystem#arraycopy(JNI)による配列のコピーにかかる時間を計測してみました。

```java:

public class Bench {

    public static void main(String[] args) {
        for (int i = 0; i < 20; i++) {
            test(i, 5000000);
        }
    }

    private static void test(int size, int count) {
        char[] src = new char[size];
        char[] dst = new char[size];
        for (int i = 0; i < 10000; i++) {
            System.arraycopy(src, 0, dst, 0, src.length);
        }

        long time = System.currentTimeMillis();
        for (int i = 0; i < count; i++) {
            System.arraycopy(src, 0, dst, 0, src.length);
        }
        System.out.println("native:" + size + ":" + (System.currentTimeMillis() - time));

        for (int i = 0; i < 10000; i++) {
            arraycopy(src, 0, dst, 0, src.length);
        }
        time = System.currentTimeMillis();
        for (int i = 0; i < count; i++) {
            arraycopy(src, 0, dst, 0, src.length);
        }
        System.out.println("java:" + size + ":" + (System.currentTimeMillis() - time));
    }

    private static void arraycopy(char[] src, int srcPos, char[] dst, int dstPos, int len) {
        for (int i = 0; i < len; i++) {
            src[i + srcPos] = dst[i + dstPos];
        }
    }
}
```

```
native:0:10
java:0:12
native:1:40
java:1:14
native:2:24
java:2:17
native:3:21
java:3:15
native:4:28
java:4:27
native:5:35
java:5:32
native:6:26
java:6:40
native:7:23
java:7:36
native:8:33
java:8:40
native:9:29
java:9:43
native:10:31
java:10:48
native:11:28
java:11:49
native:12:37
java:12:55
native:13:35
java:13:58
native:14:39
java:14:63
native:15:34
java:15:61
native:16:38
java:16:66
native:17:22
java:17:70
native:18:25
java:18:73
native:19:23
java:19:91
```

要素数が5くらいまでなら、System#arraycopyよりJavaで直接実行した方が速いですね。
Rails 4.0.4 => Rails 4.1.0アップデート

参考：[Ruby on Rails 4.1 Release Notes #1(Rails4.1へのupgrade方法) - rochefort's blog](http://rochefort.hatenablog.com/entry/2014/01/13/070541)

----

Gemfile

```rb
gem 'rails', '4.1.0'
```

```
bundle update
```

```
cat config/initializers/secret_token.rb
----------
APP_NAME::Application.config.secret_key_base = 'xxxxxxxxxx'
----------
```

↓secret_key_baseをsecret_key_baseにコピー

```
vi config/secrets.yml
----------
development:
  secret_key_base: 'xxxxxxxxxx'
 
test:
  secret_key_base: 'xxxxxxxxxx'
 
production:
  secret_key_base: 'xxxxxxxxxx'
----------
```

```
rm config/initializers/secret_token.rb
```
npmの便利なパッケージ

# hotnode
nodemailer npmパッケージサイト
https://npmjs.org/package/hotnode

nodemailer GitHubサイト
https://github.com/saschagehlich/hotnode

Node.jsのソースが編集されたら自動的にサーバーを再起動します。

似たようなパッケージにnodeamonというパッケージもあります。

## インストール

```
$ sudo npm install -g hotnode
```

## 使い方

サーバーを起動する際に、「node サーバー」の代わりに「hotnode サーバー」で起動します。80番ポートのサーバーは管理者権限のsudoで実行する必要があります。


```
$ hotnode サーバー.js
```


拡張子は省略できます。

```
$ hotnode サーバー
```

コーヒースクリプトを実行する場合

```
$ hotcoffee サーバー.coffee
```

拡張子を省略できません


# pulldown

nodemailer npmパッケージサイト
https://npmjs.org/package/pulldown

nodemailer GitHubサイト
https://github.com/jackfranklin/pulldown

コマンドからJavaScriptのライブラリをダウンロードできます。

## インストール

```
$ sudo npm install -g pulldown
```

## 使い方

pulldownコマンドの後に使いたいJavaScriptのライブラリを指定します。

pulldown jquery
バージョンの指定もできます。

pulldown jquery@1.8.3
ダウンロードできるライブラリは以下のサイトで確認できます。

http://cdnjs.com/

# uglifyjs

uglifyjs npmパッケージサイト
https://npmjs.org/package/uglifyjs

uglifyjs GitHubサイト
https://github.com/ForbesLindesay/uglifyjs

jsファイルの圧縮と結合を行います。

## インストール

```
$ sudo npm install -g uglifyjs
```

## 使い方

uglifyjsコマンドに続けてjsファイルを指定します。

uglifyjs hoge.js foo.js

# qrcode

qrcode npmパッケージサイト
https://npmjs.org/package/qrcode

qrcode GitHubサイト
https://github.com/soldair/node-qrcode

Pythonに依存しているのでPythonをインストールしパスを通しておく必要があります。

指定したアドレスのQRコードを生成できます。

## インストール

```
$ sudo npm install -g qrcode
```

## 使い方

qrcodeコマンドの後にアドレスと、保存する画像のファイル名を指定します。

qrcode "http://monaca.mobi" qrcode.png

# node-static

static npmパッケージサイト
https://npmjs.org/package/node-static

static GitHubサイト
https://github.com/cloudhead/node-static

簡易Webサーバーをたてて指定したディレクトリにhttpアクセスできます。

## インストール

```
$ sudo npm install -g node-static
```

## 使い方

以下のコマンドを実行します。

static ディレクトリパス
カレントディレクトリにいる場合は

static .
以下のように出力されるのでブラウザでアクセスします。

serving "." at http://127.0.0.1:8080
別のpcで閲覧する場合は、ipconfigやifconfigでipアドレスを確認してアクセスしましょう。

qrcodeと合わせて使うと、スマートフォンサイトに実機でアクセスするときに便利です。

# karma
static npmパッケージサイト
https://npmjs.org/package/karma

karma 公式サイト
http://karma-runner.github.io/0.10/index.html

## インストール

```
$ sudo npm install -g karma
```

## 使い方

# weinre
weinre npmパッケージサイト
https://npmjs.org/package/weinre

weinre 公式サイト
http://people.apache.org/~pmuellr/weinre/

スマートフォンの実機で閲覧しているWebサイトのデバッグをPCで行うことができます。

## インストール

```
$ sudo npm install -g weinre
```

## 使い方
Atomエディタで使って気に入ったpackageとか


Emacsから本格的に乗り換えて１ヶ月ほど経ったので、使ってみて気に入ったpackageとかまとめてみる。

### [atom-beautifier](https://atom.io/packages/atom-beautifier)
`ctrl-alt-f` でコードフォーマットをかけてくれる。

### [atom-jshint](https://atom.io/packages/atom-jshint)
jsの構文チェック。

### [autocomplete-plus](https://atom.io/packages/autocomplete-plus)
タイプ中に補完候補を自動的に表示してくれる。デフォルトでは自動補完が無効なので、package設定からauto completionを有効にする必要あり。

![](http://i.gyazo.com/678693b3f33a80df9375c6a0feab0529.gif)

### [editor-stats](https://atom.io/packages/editor-stats)
便利機能ではないけど、時間別のキー入力の量をグラフ化してくれる。何時頃に活発に作業しているか一目瞭然に。

![Screen Shot 0026-04-09 at 13.22.44 1.png](https://qiita-image-store.s3.amazonaws.com/0/7325/8bcc4a9e-0119-e13f-92f3-eef856a287f7.png "Screen Shot 0026-04-09 at 13.22.44 1.png")


### [gist-it](https://atom.io/packages/gist-it)
開いているファイルを即座にgistへアップできる。[gist.el](https://github.com/defunkt/gist.el)みたいな感じ。

![](http://i.gyazo.com/a4dc64e22bbef7ddbf547144ffa92d5a.gif)

注意する点は、何も設定していないとAnonymousユーザとして投稿されてしまう事。
自分のアカウントで投稿したい場合は、READMEを参考にpackage設定画面でトークンを登録しておく。

[rpowelll/gist-it](https://github.com/rpowelll/gist-it)
> Gist It will post gists anonymously by default, to post to your own GitHub account generate a new token with the gists scope and copy it into the package's preferences (see the section below if you have trouble finding these).


### [go-to-line](https://atom.io/packages/go-to-line)
`ctrl+g` で指定した番号の行にジャンプ。

### [highlight-line](https://atom.io/packages/highlight-line)

カーソル行のハイライトを好きな色に変更できる。

### [marked](https://atom.io/packages/marked)

markdown編集中に `cmd+shift+m` するとMarked.appを立ち上げてプレビュー表示してくれる。atomに同梱されているプレビュー機能では満足できない人向けに。

### [open-on-github](https://atom.io/packages/open-on-github)
`alt+g, o` で開いているファイルのgithub上のページを開いてくれる。ちゃんとカーソルが当たっている行を表示してくれて便利。

![](http://i.gyazo.com/dc4fdff583c1a4968c43fb44cfab195a.gif)

ほかにも `alt+g, b` でblame、 `alt+g, h` でファイルのhistory表示など。

### [pretty-json](https://atom.io/packages/pretty-json)
jsonを見やすい形に整形してくれる。

### [script](https://atom.io/packages/script)
`cmd+i` で開いているコードをエディタ上で実行してくれる。[emacs-quickrun](https://github.com/syohex/emacs-quickrun)とかと同じ感じ。Python・Ruby・JavaScript等主要な言語はサポートされてる。

![](http://i.gyazo.com/489fbe7142cfc15cf6d054d01a34e2f0.gif)

### [Zen](https://atom.io/packages/Zen)
GithubのZenモードみたいなやつ。集中して何か書きたい時用に。Macのフルスクリーンモードと組み合わせると良さげ。

## まとめ
Emacsで使ってた便利拡張と似たものが大体用意されてて、移行してもそんなに不便してない。なによりGithub連携がかなり充実してるのが良い感じ。

デフォルトで入ってないパッケージは公式の[Packages](https://atom.io/packages)のTrendingとかを眺めながら、良さそうなのがあれば入れてる。
今は頻繁に見てても目新しいpackageがそこまで上がってこないけど、これから更に盛り上がってくる事を期待。
opensslを更新したのにOpenSSL::OPENSSL_VERSIONが古いまま


HeartBleed Bugに関連して、opensslをアップデートしても`OpenSSL::OPENSSL_VERSION`が更新されていなかった。

なので、`libssl.so`と`libcrypto.so`が新しいライブラリを指しているかを確認してみた。

- ruby 2.1.1
- rbenv

のケースを記載。rubyのバージョンが違っていたりrvmでもなんとなーく場所はわかるはず。

# Macの場合

```console
$ ls -l $RBENV_ROOT/versions/2.1.1/lib/ruby/2.1.0/x86_64-darwin13.0/openssl.bundle
$ otool -L $RBENV_ROOT/versions/2.1.1/lib/ruby/2.1.0/x86_64-darwin13.0/openssl.bundle
```

# Linuxの場合

```console
$ ls -l $RBENV_ROOT/versions/2.1.1/lib/ruby/2.1.0/x86_64-linux/openssl.so
$ ldd $RBENV_ROOT/versions/2.1.1/lib/ruby/2.1.0/x86_64-linux/openssl.so
```
再帰的に.svnを削除する方法

たいした話では無いですが、ぱっと思いつかなかったので・・・
svn 1.6以前だと各フォルダに.svnフォルダが出来てしまうので、これを一括で削除した時には便利です。

<pre>
find . -type d -name .svn -print0 | xargs -0 rm -rf
</pre>

ちなみに下記は間違い。
詳細についてはコメントを確認して下さい。

<pre>
rm -rf `find . -type d -name .svn`
</pre>


## 参考

> Subversionの「.svn」ディレクトリを全部削除する
> http://qiita.com/odorry/items/14f707594666840a42d7
MongoDB 2.6 "今までで最大のリリース"！

[MongoDBオフィシャルブログ : MongoDB 2.6: "今までで最大のリリース"](http://blog.mongodb.org/post/82092813806/mongodb-2-6-our-biggest-release-ever)

色々とDisられることの多いMongoDBですがw、[$150Mも調達](http://jp.techcrunch.com/2013/10/05/20131004mongodb-raises-150m-for-nosql-database-technology-with-salesforce-joining-as-investor/)したこともあってノリノリのようです．

以下オフィシャルブログの意訳等．

> MongoDB 2.6では、1. 広範囲でのコアサーバー強化、2. 革新的な新しいオートメーションツール、3. 重大なエンタープライズ向け機能の提供を行い、今までで最大のリリースとなった．
> With comprehensive core server enhancements, a groundbreaking new automation tool, and critical enterprise features, MongoDB 2.6 is by far our biggest release ever.

大まかに上記三点が変更点のようです．

### 1. コアサーバー強化

> スケーラビリティ改良のためクエリエンジンを全て書き直した．これにより"index intersection"を使った高度なクエリをするための最初のステップになる．
> We re-wrote the entire query execution engine to improve scalability, and took our first step in building a sophisticated query planner by introducing index intersection. 

[index intersection](http://blog.mongohq.com/at-the-mongodb-2-6-index-intersection/)によって一つのクエリに対して複数のindexが組み合わさるようになりました．今までのMongoDBではクエリに合わせてindexをかなり詳細にコントロールする必要があったので、これはとても重要な変更になりそうです．

> これは、2.8で予定されている(ドキュメントレベルロック!を含んだ)大規模な並列性改善の下地となる．
> Finally, MongoDB 2.6 lays the foundation for massive improvements to concurrency in MongoDB 2.8, including document-level locking.

粒度の細かいロックは2.8で予定されてるんですね．[jira](https://jira.mongodb.org/browse/SERVER/fixforversion/13804)

### 2. 新しいオートメーションツール

[MMS（MongoDB運営の運用向けサービス）](https://mms.mongodb.com/)が強化される模様です．（あとオンプレでも使えるらしい．）

> MMSは35000ユーザーがモニタリングとアラートに使っているが、そこにバックアップと[point-in-timeリストア](http://docs.mongodb.org/manual/tutorial/backup-with-mongodump/#restore-point-in-time-oplog-backup)が加えられた．

> [MongoDB Management Service (MMS)](https://mms.mongodb.com/), which already provides 35,000 MongoDB customers with monitoring and alerting, now provides backup and point-in-time restore functionality, in the cloud and on-premises.

> 今年後半に予定されるオートメーション機能によりレプリカセットとシャードクラスタをシンプルで作り込まれたインターフェースがらプロビジョニングし、管理する事が出来る．

> Automation will allow you to provision and manage MongoDB replica sets and sharded clusters via a simple yet sophisticated interface.


### 3. エンタープライズ向け機能の提供

認証方式の追加(LDAP、x.509、Kerberos)やセキュリティ強化(TLS encryption)．ここは細かい機能追加なので[リリースノート](http://docs.mongodb.org/master/release-notes/2.6/)参照のこと．


- **参考**

[オフィシャルのリリースノート](http://docs.mongodb.org/master/release-notes/2.6/)
[Oracle's NoSQL nightmare MongoDB goes to version 2.6](http://www.theregister.co.uk/2014/04/08/mongodb_major_release/)
Sublime text で開いているタブを開くコマンドリストをクリップボードに保存するプラグイン


git-flow + Redmine でプロジェクト運用しているんだけど複数チケットのブランチ間を結構頻繁に移動して、その度に作業中のファイル群を開くのにパスを入力していくのが面倒だったので、`subl` コマンドで一括して開けるようコマンドを生成してクリップボードに保存するプラグインを書いた。

```python
import sublime, sublime_plugin

class ListingCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        list = []
        for x in range(0, self.view.window().num_groups()):
            for file in self.view.window().views_in_group(x):
                if file.file_name() == None:
                    continue
                list.append('subl "%s"\n' % file.file_name())
                sublime.set_clipboard(''.join(list))
```
ackを使って一括置換

コマンドラインで何かを探すとき、grepは結構使い勝手が悪いので、ackを好んで使っていますが、ある時特定のキーワードを一括置換する必要があった時に、ackで出来ないかなと思い調べたので共有します。

結果から書くと以下でPHPファイルにある「image.gif」を「image.jpg」に置換出来ます。

<pre>
$ ack -f --php | xargs perl -p -i -e 's/image\.gif/image\.jpg/g'
</pre>
※メタ文字はエスケープしましょう！詳細はコメントを参照してください。

## 参考
> ackコマンド
> http://d.hatena.ne.jp/yutakikuchi/20110523/1306111855
以前のバージョンから現在までに変更されたファイルを抜き出す

特定ディレクトリ以下のファイルで、以前のバージョンから現在までに変更されたファイルについて、以前のファイルを抽出したい。

特定ディレクトリを src、抽出先ディレクトリを src_old とすると、以下のようなコマンドで可能。

```sh
OLD_COMMIT=$1 ; for file in `git diff --name-only $OLD_COMMIT HEAD | grep '^src/'` ; do git archive --prefix=src_old/ $OLD_COMMIT $file | tar -xf - ; done
```

参照 : http://qiita.com/usamik26/items/560830841525c1efa9f5
（余談ですが、自分で過去に書いた記事を自分で参照すること、よくやります）
大量のダミー連番画像を、一行で作成する方法


## [2014-09-02追記] 記事中の画像生成サービスが死んでたので、こっちだと動きます

	curl -O 'http://placeimg.com/500/480/tech/[0-4].jpg'

あるいは

	curl -O 'http://placehold.it/350x150&text=[1-4].png'


---


## curlは連番でダウンロードできる + ダミー画像ジェネレータサービスを使う

	curl -O 'http://cambelt.co/400x150/[0-4].png'

とすると

* 400x150
* 0.png, 1.png, 2.png, 3.png, 4.png

がダウンロードされます。

こんな感じ
![](http://cambelt.co/400x150/0.png)


## 解説 curlで連番

連番にしたいところを`[0-100]`みたいにするといけます。ガチ便利〜！


## 解説 ダミー画像ジェネレータサービスの概要

http://cambelt.co/ 

基本は200x100とかを指定すれば画像ができます。

``` html
<img src="http://cambelt.co/200x100" />
```
<img src="http://cambelt.co/200x100" />

いろいろオプションも指定できて、こんな画像もすぐできてガチ便利〜！

``` html
<img src="http://cambelt.co/400x160/UNKO?font=Federicka&color=234653,eeeeee&font_size=120"> 
```
![](http://cambelt.co/400x160/UNKO?font=Federicka&color=234653,eeeeee&font_size=126)


## 連番を複数入れたりもできる

	curl -O 'http://cambelt.co/400x150/[0-4]_[0-4].png'

とすると、0_0.png → 4_4.pngまでいい感じに生成してくれます。
AtomでFile-Finderに特定のファイル（フォルダ）を表示させないようにする


settingでできたよ

![atom-settin01.png](https://qiita-image-store.s3.amazonaws.com/0/6586/8e0a1344-fd74-7d4f-d0b0-d2c8d364b118.png "atom-settin01.png")

Ignored Names に書けば良いみたい。
PIXI.js, Easel.jsをサポートするspritesheetジェネレータ

PIXI.js, Easel.jsをサポートするspritesheetジェネレータ
jsonを自動生成

http://www.codeandweb.com/texturepacker
を買うのがめんどくさい人おすすめ
↓
https://github.com/krzysztof-o/spritesheet.js
IMEの入力状態表示

1秒毎にIMEの状態をチェックしてタスクトレイのアイコンを変化させる。
bbLean で使おうかと思ったけど、bbLean 自体を使い続けなくていいような気がしてきたのでお蔵入り。
これよりマシなスクリプトはごろごろ存在している。

```ahk
#Persistent ;常駐
#NoEnv ;環境変数を無視。速度面でも有利になる。
#SingleInstance force ;同じスクリプトを一つだけ起動。

#Include %A_ScriptDir%\IME_Func\IME_Func.ahk

SetTimer, check_ime_status, 1000

check_ime_status:
howime := IME_CHECK("A")
if (%howime% = 0) {
	Menu, TRAY, Icon, %A_ScriptDir%\a.ico
} else {
	Menu, TRAY, Icon, %A_ScriptDir%\h.ico
}
return
```
【Android】さくっと時刻とか月とか年を取得したい


#getYear() とか getMonth() とかないのかよ！

ということでUtilを作る。

```java:
    public static int getYear() {
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(System.currentTimeMillis());
		return calendar.get(Calendar.YEAR);
	}

	public static int getMonth() {
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(System.currentTimeMillis());
		return calendar.get(Calendar.MONTH) + 1;
	}

	public static int getDay() {
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(System.currentTimeMillis());
		return calendar.get(Calendar.DAY_OF_MONTH);
	}

	public static int getHour() {
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(System.currentTimeMillis());
		return calendar.get(Calendar.HOUR_OF_DAY);
	}

	public static int getMinute() {
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(System.currentTimeMillis());
		return calendar.get(Calendar.MINUTE);
	}

	public static int getSecond() {
		Calendar calendar = Calendar.getInstance();
		calendar.setTimeInMillis(System.currentTimeMillis());
		return calendar.get(Calendar.SECOND);
	}
```

よしできた。

**getMonth()** だけちょっと注意が必要で、

return calendar.get(Calendar.MONTH) **+ 1**;

1月が **0** から始まるので、そこだけ意図的に1を足してます。
rails4でのeager_loadの設定

### rails4でのeager loadの設定
* rails4の設定項目で、以下の項目があるが、開発環境と本番環境とどう設定するのがよいか判断するために調べてました。
* 当初書いたものは、active recordのeager loadと勘違いしておりました。
* yuki24さんのコメントを読んでもらえると嬉しいです。
OpenSSL Heartbleed 脆弱性　メールテンプレ

業務で使ってる他社システムにHeartbleed 脆弱性の対応が完了してるかどうかを確認する際のメールテンプレです。

```
◯◯会社　システム担当者様
いつもお世話になっております。

4月7日に判明いたしました「CVE-2014-0160 OpenSSL Heartbleed 脆弱性」について、
貴社システムにおける影響範囲の確認と対応はなされておりますでしょうか？
ご確認よろしくお願い致します。

## 参考情報
http://d.hatena.ne.jp/nekoruri/20140408/heartbleed
http://qiita.com/ukitazume/items/f382bcc420dc7815684f
```
[PHP] 動的に追加したHTMLフォームのname属性について

JavaScript などを使って動的にフォームの入力項目を増やした場合、

どういうname属性をつければよいか悩んでいたんですが、

__配列__でPOSTできるんですね。知らなかった…

[PHP:Manual 「HTML フォームで配列を使用するにはどうすればよいですか？」](http://www.php.net/manual/ja/faq.html.php#faq.html.arrays)
gitでcommitした後、あ、名前変えたいな...と思ったの巻

#背景

恥ずかしい名前を user.name に設定したままで、真面目なcommitしたことないですかそうですか

#commitした後に名前変える方法

忘れない様にメモ

```
git config --global user.name "hogehoge"
git commit --amend --reset-author
```
Heartbleed memo

# Heartbleed memo

[heartbleed](http://heartbleed.com/)

## あてはまってるかチェック

### 対象バージョン

OpenSSL 1.0.1～1.0.1f

### チェック

```
yum list installed | ag openssl
```
1.0.0系だったので、あてはまってなかったです。

## あてはまってた場合

あてはまってた場合は下記対応かな

```
yum update openssl nginx

/etc/init.d/nginx restart
```

SSL通信はほぼしてないので、大丈夫
してたら、証明書を発行しなおす

### 正しくアップデートされたか確認

[Heartbleed test] (http://filippo.io/Heartbleed/)


## 参考URL

[OpenSSLのHeartbleed問題を解決する。CentOS 6.5編](http://takeshiyako.blogspot.jp/2014/04/centos-65opensslheartbleed.html)
[Heartbleedまとめ](http://d.hatena.ne.jp/nekoruri/20140408/heartbleed)
[objc][memo] BundleのJSONを読み込んでNSArrayにする

```objc

    //------------------------------
    // JSONを読み込む
    //------------------------------
    NSError *error0 = nil;
    NSBundle *bundle = [NSBundle mainBundle];
    NSString *path = [bundle pathForResource:@"local" ofType:@"json"];
    NSString *jsonString = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error: &error0];
    NSData *jsonData = [jsonString dataUsingEncoding:NSUnicodeStringEncoding];
    if(error0){NSLog(@"よみこみえらー");}
    
    //------------------------------
    // NSArray に変換
    //------------------------------
    NSError *error1 = nil;
    NSArray *array = [NSJSONSerialization JSONObjectWithData:jsonData
                                                     options:NSJSONReadingAllowFragments
                                                       error:&error1];
    if(error1){NSLog(@"ぱーすえらー");}


```