OmniAICreator/Qiita-1.07M huggingface dataset:
VisuaforceページでURL指定でライブラリを読み込む

Visualforceで静的リソースではなくURL指定で各ライブラリを読み込む方法のメモ

### apexタグの場合
```visualforce:visualforce
<apex:page showHeader="false" docType="html-5.0" >
    <apex:stylesheet value="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.1.0/css/bootstrap.min.css"/>
    <apex:includeScript value="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"/>
    <apex:includeScript value="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.1.0/js/bootstrap.min.js"/>
    <apex:includeScript value="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.10/angular.min.js"/>
    <apex:includeScript value="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.10.0/ui-bootstrap-tpls.min.js"/>
</apex:page>
```

### HTMLタグの場合
```visualforce:visualforce
<apex:page showHeader="false" docType="html-5.0" >
    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.1.0/css/bootstrap.min.css"></link>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.1.0/js/bootstrap.min.js"></script>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.10/angular.min.js"></script>
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.10.0/ui-bootstrap-tpls.min.js"></script>
</apex:page>
```

その他のリンクはこちらで確認できました。

__cdnjs__
http://cdnjs.com/
[Grails]HasManyの値でドメインを検索

#目的
hasManyで持っているドメインの値を元に、ドメインを検索したい。
具体的に云うと、ある特定のHobbyを持っているPersonドメインを取得したい。

サンプルソース

```groovy:Person.groovy
class Person {
    String name
    Integer age
    static hasMany = [hobbies:Hobby]
    static constraints = {
    }
}
```

```groovy:Hobby.groovy
class Hobby {

    String name

    static constraints = {
    }
}
```

で、`Person.findAllByHobby(Hobbyオブジェクト）` とかで行けそうだけど、どうも上手く行かない。正常なwhere句を持ったSQLが生成されないみたい。
じゃあHobbyドメイン側にbelongsTo付けちゃえば？っていう話しだけど、それをするとテーブルの構成が変わってしまう。。。
今回の例だとHobbyテーブルだなんて云うのは別に各個人に従属するような値ではない。
それなのに値を簡単に取得したいからと言ってテーブルの構成を変えてしまうのはいかがな物か。

そこで、以下のようなHQLを使うと意図通り特定のHobbyドメインを持ったPersonドメインの一覧が取得出来る。
ちなみにここでは、ComputerというHobbyドメインを持っているPersonドメインから、そのComputerドメインを取り除いている。

```groovy
def h = Hobby.findByName("Computer")
def r = Person.findAll("from Person as p where :hobby in elements(p.hobbies)", [hobby:h]).each{
    it.hobbies.remove(h)
}
```

ちなみに、HQLじゃなくて **whereクエリー** を使ってもちゃんとデータが取れた。
単純に `hobbies == hoby` だと当然エラーになってしまう。
hobbiesと言う本来Listに当たる物のプロパティを使うと言う点が何とも云えない気持ち悪さ。
もしかしたらGrailsのバグ？

```groovy
Person.where {
    hobbies.id == hobby.id
}.list()
```
Texlipseの設定においてeuptexを用いる場合の注意点

[以前の投稿](http://qiita.com/Go-zen-chu/items/fb55bd0dd6fb91e24f6f)でTexlipseがUTF-8で動作する設定についてメモ書きをしましたが、最近TexLive2013をインストールした際、uplatexがeuptexに変更されている（エイリアスでeuptexを参照するようになっている）ことに気がつきました。
そこで、Texlipseのビルドの設定で、uplatexではなく、euptexを参照するようにしたのですが、デフォルトの状態ではlatexの構文を解析しないため、例えばdocumentclassをtexファイル内で記述すると、

```text
! Undefined control sequence.
\documentclass
```
というような例外が発生します。そこで、eupTeXのフォーマットを変更するため、ビルドの設定にて、引数として

```text
euptex -fmt=uplatex
```
を加えると正しく動作するようになります。euptexに関しては、まだまだ情報が少ないので、何かのヒントになれば幸いです。
ワイルドカード CNAME と Apache の vhost_alias でバーチャルホストを作る

自分が example.net ドメインの所有者だとして、次のようにレコードを登録します。

```text:example.net.zone
www             IN      A       192.0.2.123
*               IN      CNAME   www
```

Apache で vhost_alias モジュールを有効にします。

```apache:httpd.conf
LoadModule vhost_alias_module modules/mod_vhost_alias.so
```

さらに、次のようにバーチャルホストを設定します。

```apache:httpd.conf
<VirtualHost *:80>
        ServerName www.example.net
        ServerAlias *.example.net

        VirtualDocumentRoot /var/www/vhost/%1/html

        LogFormat "%V %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" vcombined
        CustomLog logs/vhost_access_log vcombined

        <Directory /var/www/vhost>
                AllowOverride All
                Order allow,deny
                Allow from all
        </Directory>
</VirtualHost>
```

バーチャルホストごとのドキュメントルートを作ります。

```console
$ mkdir -p /var/www/vhost/aaa/html
$ mkdir -p /var/www/vhost/bbb/html
$ echo aaa > /var/www/vhost/aaa/html/index.html
$ echo bbb > /var/www/vhost/bbb/html/index.html
```

ディレクトリを作るだけでバーチャルホストになります。

```
$ curl aaa.example.net
aaa
$ curl bbb.example.net
bbb
```
Home/Endに行頭/行末をEclipseでも割り当てる設定



KeyRemap4MacBookの(Use PC Style Home/End or Use PC Style Home/End #2)を利用しても、
Eclipse上でHome/Endで行頭/行末移動ができなかったため、以下の設定を行った。

```private.xml
<?xml version="1.0"?>
<root>
  <item>
    <name>For PC Users (Original)</name>
    <item>
      <name>Use PC Style Home/End #3</name>
      <appendix>(Change Home to Command+Left)</appendix>
      <appendix>(Change End to Command+Right)</appendix>
      <appendix>(+ Change Home to Control+A in Emacs,Terminal,X11)</appendix>
      <appendix>(+ Change End to Control+E in Emacs,Terminal,X11)</appendix>
      <appendix></appendix>
      <appendix>{{ PC_STYLE_BINDINGS_IGNORE_APPS_DESCRIPTION }}</appendix>
      <identifier>remap.pclikehomeend_except_eclipse</identifier>
      <include path="/Applications/KeyRemap4MacBook.app/Contents/Resources/include/checkbox/snippets/pcstyle_homeend_ignore_apps.xml" />
      <block>
        <only>EMACS, TERMINAL, X11</only>
        <autogen>__KeyToKey__ FROMKEYCODE_HOME, KeyCode::A, ModifierFlag::CONTROL_L</autogen>
        <autogen>__KeyToKey__ FROMKEYCODE_END,  KeyCode::E, ModifierFlag::CONTROL_L</autogen>
      </block>
      <block>
        <not>{{ PC_STYLE_BINDINGS_IGNORE_APPS }}</not>
        <autogen>__KeyToKey__ FROMKEYCODE_HOME, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_COMMAND, KeyCode::CURSOR_UP,    ModifierFlag::COMMAND_L</autogen>
        <autogen>__KeyToKey__ FROMKEYCODE_HOME, MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_CONTROL, KeyCode::CURSOR_UP,    ModifierFlag::COMMAND_L</autogen>
        <autogen>__KeyToKey__ FROMKEYCODE_END,  MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_COMMAND, KeyCode::CURSOR_DOWN,  ModifierFlag::COMMAND_L</autogen>
        <autogen>__KeyToKey__ FROMKEYCODE_END,  MODIFIERFLAG_EITHER_LEFT_OR_RIGHT_CONTROL, KeyCode::CURSOR_DOWN,  ModifierFlag::COMMAND_L</autogen>
        <autogen>__KeyToKey__ FROMKEYCODE_HOME,             KeyCode::CURSOR_LEFT,  ModifierFlag::COMMAND_L</autogen>
        <autogen>__KeyToKey__ FROMKEYCODE_END,              KeyCode::CURSOR_RIGHT, ModifierFlag::COMMAND_L</autogen>
      </block>
    </item>
  </item>
</root>
```

上記の設定をすれば、Eclipseでも問題なくHome/Endで行頭/行末カーソル移動が実現できた。
cocos2d-x 3.0beta スプライトサイズの取得方法が分からない

cocos2d-xを勉強し始めて最初につまずいたのはonDrawFrameがない！
ひじょーに初歩的ですね。ﾊｲ。

cocos2dではscheduleという機能を使って毎フレームごとの処理を実装していきます。scheduleで検索すると色々他の方が実装の仕方は教えてくれています！


話は変わって、今スプライトアニメーションを実装しているのですが曲者ですねコイツは・・
とりあえず試行錯誤しながら以下のソースでアニメーションをさせることができました。

スプライトアニメーションのやり方は色々あるみたいですが、自分はこれでとりあえず動かすことができました。

ただ一枚のスプライト画像の大きさを取得する部分ですが、実際のスプライト画像のサイズは96px×96pxですが画面に描画すると222px×222pxになっていました。
これはきっと解像度をcocosが自動で読み取ってくれているのでしょうか。

知っている人いたら教えてください。

Sprite* sp = Sprite::create("run_1.png");
CCLog("sprite_width:%f", sp->getContentSize().width);
CCLog("sprite_height:%f", sp->getContentSize().height);
こんな風にしていちいち一枚の画像から大きさを割り出すなんてことはきっと間違っているはず・・・

rcに移行しないとっ('A`)

```cpp:Main.cpp
void Main::setRunChara()
{
	//アニメーションオブジェクト生成
	m_chara_run_anim = Animation::create();
	//どのぐらいの間隔でアニメーションを回すかを設定
	m_chara_run_anim->setDelayPerUnit(0.1f);
	//アニメーションへのスプライトの登録
	for (int x = 0; x < 6; x++) {
		char fileName[128] = {0};
		//走る画像を５枚用意しているため
		sprintf(fileName, "run_%d.png", x+1);
		//sprintfで整形したfilename変数をもとにアニメーションへ登録
		m_chara_run_anim->addSpriteFrameWithFileName(fileName);
	}
	//一枚の画像の大きさを取得
	Sprite* sp = Sprite::create("run_1.png");
	CCLog("sprite_width:%f", sp->getContentSize().width);
	CCLog("sprite_height:%f", sp->getContentSize().height);
	//取得した画像サイズでサイズ変数を作っておく
	Size chara_size = Size(float(sp->getContentSize().width), float(sp->getContentSize().height));
	//アニメーションを登録してあとで使いやすいようにするため::AnimationCacheはなくても動作する
	m_chara_run_cache = AnimationCache::getInstance();
	m_chara_run_cache->addAnimation(m_chara_run_anim, "RUN");
	//アニメーションをのっけるスプライトを造る
	m_chara = Sprite::create();
	//物理演算のためにPhysicsBodyをset（なくても動きます）
	m_chara->setPhysicsBody( PhysicsBody::createBox(chara_size) );
	//どこに表示するかを設定
	m_chara->setPosition(200, 50);
	//Directorへの登録
	addChild(m_chara, 0);
	//Animationをリピートさせるため
	RepeatForever* chara_action = RepeatForever::create( Animate::create(m_chara_run_anim) );
	//スプライトにアクションを登録
	m_chara->runAction(chara_action);
}
```
Rangeの範囲内からランダムに数値を選ぶ

## 誤りの例

以下で一見良さそうなんですが、そもそもやりたいことができません。Rangeオブジェクトいっこの配列ができるので、この返り値はRangeになります。

```rb
[1 .. 10000].sample
```

## 好ましくない例

これもダメです。to_aしたらメモリに展開され、数が少なければそんなに影響ないですが、多いと悲劇になります。

```rb
(1 .. 10000).to_a.sample
```

## よい例

Random#randは引数にRangeを渡せます。

```rb
Random.rand(1 .. 1000)
```
RSpec 3のyield_receiver_to_any_instance_implementation_blocksオプションについて調べてみた


## RSpec 3で追加された不思議なオプション

[こちらのQiita記事](http://qiita.com/yujinakayama/items/a1d31b2caa35642e8e69)を参考にしながら、「[Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)」サンプルアプリケーションをRSpec 3にアップグレードしていました。

@yujinakayamaさんが作成された[Transpec](http://yujinakayama.me/transpec/)という便利なgemを使うと、あら不思議、既存のテストコードがRSpec 3対応のものに書き換えられてしまいます。

ただ、diffを確認していたところ、以下の`rspec_helper.rb`の変更が気になりました。

````ruby
# spec_helper.rb
config.mock_with :rspec do |c|
  c.yield_receiver_to_any_instance_implementation_blocks = true
end
````

このオプションは何を意味しているのでしょうか？

## 開発者ブログになんか書いてある

このオプションに関する説明はRSpec開発者のmyronmarston氏のブログに書いてありました。

[ブログ原文](http://myronmars.to/n/dev-blog/2013/07/the-plan-for-rspec-3#mocks__block_implementations_will_yield_the_receiver)

![Screen Shot 2014-03-22 at 19.49.35.png](https://qiita-image-store.s3.amazonaws.com/0/7465/021419da-89bc-e501-061f-cdcb34e98ad6.png "Screen Shot 2014-03-22 at 19.49.35.png")

[日本語訳](http://nilp.hatenablog.com/entry/2013/07/16/131641)
![Screen Shot 2014-03-22 at 20.17.37.png](https://qiita-image-store.s3.amazonaws.com/0/7465/545345c7-257f-1225-e7c1-f168fd430ee2.png "Screen Shot 2014-03-22 at 20.17.37.png")


が、この説明を読んでも何かピンと来ない・・・。
というわけで、実際にコードを動かしながら確認してみました。

## このオプションの目的はブロック引数にインスタンスを渡すかどうかを決めるだけ

実際に動かしてみると、なんてことはありません。
このオプションは、`any_instance`を使っているメソッドでブロックを使ったときに、そのインスタンスをブロック引数として渡すかどうかの違いを決めるためのオプションでした。

上記のブログでも出ている以下のようなコードを例に挙げます。

````ruby
allow_any_instance_of(User).to receive(:age) do |user|
  ((Date.today - user.birthdate) / 365).floor
end
````

`yield_receiver_to_any_instance_implementation_blocks`に`true`をセットすると、ブロック引数に`user`が渡されます。

`false`をセットすると、ブロック引数に何も渡されません。(なので、`user.birthdate`がエラーで落ちます)

RSpec 2.14ではブロック引数に何も渡さないので、RSpec 3で挙動を合わせる必要があれば`false`を設定します。
また、RSpec 3ではこのオプションのデフォルト値は`true`になっているので、何も設定しなければ`user`が渡されるようになっています。

### おまけ: このオプションをfalseにする必要がある場合

**2014.03.23追記**

@yujinakayamaさんが「どっちでもいいわけではない」理由をこの投稿のコメントに書いてくれました！
なので、以下の僕の書いた内容は無視して、@yujinakayamaさんのコメントを参考にしてくださいm(_ _)m

========

個人的な感想を言えば、「別にどっちでもえーやん。ブロック引数を渡したって既存のspecが壊れることは滅多にないでしょうに」と思いました。
なので、このオプションは「常に`true`」でも実害がないと思うのですが、`false`にしなければならないケースをムリヤリ考えてみました。

````ruby
# user.saveは常にtrueを返すようにする
f = ->{ true }
allow_any_instance_of(User).to receive(:save, &f)
````

`false`にしなければ落ちてしまうケースは、上のようなテストコードを書いていた場合です。
ブロックにラムダを渡している場合は引数の数が厳密にチェックされるので、ブロック引数が渡されると引数の数が合わないと怒られてエラーになります。

が、おそらくレアケースだと思いますし、最悪エラーが出たらスペックを書き直せばいいと思うのですが、どうなんでしょう？？

## まとめ
ブロック引数が渡されるようになった背景は、クラスのインスタンスがないと凝った値を返したりするときに不便、ということみたいです。
確かに、その必要性については僕も十分理解できます。ないより、あった方が絶対便利ですもんね。

というか、`any_instance`の存在は知っていましたが、ブロックを使えることは知らなかったので、今回の件で「こんなことができるんだ」と勉強になりました。(^^;)

### お知らせ

- [Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)はRSpec 3がリリースされ次第、RSpec 3対応版に無料アップデートされる予定ですので、RSpecの勉強をしたい方は参考にしてみてください。

![Everyday Rails - RSpecによるRailsテスト入門](https://s3.amazonaws.com/titlepages.leanpub.com/everydayrailsrspec-jp/large?1393556181)
iOSアプリをOTA配信 ~自己署名証明書でSSLサーバ構築編

#はじめに
iOSアプリのOTA配信でplistがSSL指定を余儀なくされたことが動機としてあり
どうせ理解するなら

 - nginxでWebサーバをたててみたい
 - SSL化のTips欲しい

上記を中心に進めてみました。

この手法でのインフラ・ネットワーク系のセキュリティについては検証しきれていません。あくまでOTAの検証環境の運用ベースでの構築で、不要時は落としておくサーバであることを前提に進めます。

#環境
##サーバ
###さくらインターネット：さくらのVPS

http://vps.sakura.ad.jp

一番安い980円を使っています
##端末
Mac:OS X 10.9.2

 - ターミナル
 - Cyberduck(SFTPで転送)
 - キーチェーンアクセス
 - Safari

#作業フロー
##サーバセットアップ

こちらのサイトを参考に作業フローを決めました。

VPS 借りたら、せめてこれくらいはやっとけというセキュリティ設定
http://dogmap.jp/2011/05/12/vps-security/

###ログインをパスワードから公開鍵認証に変更

こちらの内容にそっての作業です。
http://qiita.com/chkk525@github/items/0a027173d56bb09dab0b

パスワードでのログインをきる前に、公開鍵認証とも有効にした状態で
sshdをrestartし、公開鍵認証を確認したら

``` lang:/etc/.ssh/sshd_config 
PasswordAuthentication no
```

を行う方が安全かとは思います。そしてもう一度sshdのrestart

> ssh [ユーザ名]@[接続先サーバ] -i [RSA秘密鍵]
例） ssh hoge@fuga.ne.jp:/home/hoge/ -i ~/.ssh/id_rsa

###自己署名証明書の作成

keyを作る
> $ openssl genrsa 2048 > server.key

keyをもとに証明書を作る
> $ openssl req -new -x509 -days 3650 -key server.key -out server.crt

これで秘密鍵（server.key）と証明書(server.crt)ができました

###Webサーバ構築:nginx

リポジトリを登録して

> $ sudo rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm

インストール
> $ sudo yum install nginx

バージョンを確認

> $ nginx -v

起動
> $ sudo service nginx start

ブラウザなどで表示できるかをみます。

###ドキュメントルート
centOS6でnginxを使った場合は下記のようになりました。
環境によって異なることもありそうなので、公式サイトを見てください。

> /usr/share/nginx/html/

###自己署名証明書を配置
/etc/nginx/conf.d/の下にconfファイルがいくつかあり
example_ssl.conf を元に作成しました。これは一例です。


``` lang:/etc/nginx/conf.d/ssl.conf
# HTTPS server
#
server {
    listen      80;
    listen       443 ssl;
    server_name  fuga.ne.jp;

    ssl_certificate      /etc/nginx/cert/server.crt;
    ssl_certificate_key  /etc/nginx/cert/server.key;

    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}
``` 
証明書と秘密鍵をconfファイルに記載したパスに配置します。

confファイルの記述が正しいか確認
> sudo /etc/init.d/nginx configtest

何事もなければ再起動します
>sudo /etc/init.d/nginx restart

###SSL化の確認
作成したserver.crtを端末に取り込む前、取り込んだ後の状態で正常稼働しているかどうかの確認が可能です。
Macの場合はcrtファイルをダブルクリックでキーチェーンアクセスに取り込み、SafariからSSL化したサーバへアクセスし正常稼働しているかを見ます。

#参考URL
SAKURA VPS がカーネルパニックを起こした！
http://thinkit.x-sys.net/p1024.html

CentOS6で最新版のnginxをyumでインストールする
http://nomnel.net/blog/install-nginx-in-centos6-using-yum/

さくらVPS: 契約してからの作業メモ
http://qiita.com/chkk525@github/items/0a027173d56bb09dab0

OpenSSLで自己署名証明書を作成する
http://inaz2.hatenablog.com/entry/2013/11/27/212224

nginxでSSLを立てるまで
http://qiita.com/edo_m18/items/7e0e4b6d8e1e1d314184

nginxの最近のブログ記事
http://heartbeats.jp/hbblog/nginx/

#さいごに
apacheはともかくnginxはまるで触ったことのない状態で、Webサーバの立ち上げまでは数十分くらい。時間をとられたのが

 - VPSを使っていることでのはまり：カーネルパニックと接続不良
 - openSSLやSSLについての調査

iPhone構成ユーティリティを使ってのiOSデバイスとサーバ疎通は今回ちょっと長く書きすぎましたので別途用意します。
nginxのインストールメモ

* 最新のopensslをダウンロード/解凍する。
* 最新のzlibをダウンロード/解凍する。
* 最新のnginxをダウンロード/解凍する。
* ユーザ/グループを追加する。（httpd/httpd）

以下、コンフィグオプション

```bash
./configure \
--user=httpd \
--group=httpd \
--with-openssl=/usr/local/src/openssl-1.0.1e \
--with-zlib=/usr/local/src/zlib-1.2.8 \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_spdy_module
```
Chartkick を Sinatra で使ってみるメモ

Rails だと簡単に扱えるし、 Sinatra でも簡単に扱えるけどまとまって置いてあったほうがメモになるし以下にメモしておく。
あらかじめ `chartkick.js` を `/public` においておくこと。
chartkick 便利すぎです。

## コード
```ruby
require "sinatra"
require "chartkick"

get "/" do
	@graph_data = [["A", 1000], ["B", 2000], ["C", 7000]]
	erb :index
end
__END__

@@layout
<!DOCTYPE html>
<html>
    <head>
		<title>Chartkick on Sinatra</title>
		<script src="//www.google.com/jsapi"></script>
		<script src="chartkick.js"></script>
    </head>
    <body>
        <%= yield %>
    </body>
</html>

@@index
<%= pie_chart @graph_data %>
```

## 参考にしたサイト
- [ankane/chartkick](https://github.com/ankane/chartkick)
- [Chartkick + Railsで簡単にグラフを出力！:ADWAYS ENGINEERS BLOG](http://blog.engineer.adways.net/archives/32517011.html)
bash でもよく使うディレクトリをブックマークしたい

[よく使うディレクトリをブックマークする zsh のプラグイン](http://qiita.com/mollifier/items/46b080f9a5ca9f29674e) なんていう記事を見たので、bash で似たような事をやってる方法を共有します。

.bashrc にこんなの書くと、ショートカットが定義できます。タブ補完も OK。
bash 初心者なので、突っ込み歓迎です。

```bash
declare -A shortDirs
shortDirs=(\
  ["log"]="/var/log"\
  ["loghttpd"]="/var/log/httpd"\
)
goto(){
  for key in ${!shortDirs[*]}; do
    if [ "$key" = "$1" ]; then
      cd ${shortDirs[$key]}
      return 0
    fi
  done
  cd ~
}
gotoParams=""
for key in ${!shortDirs[*]}; do
  gotoParams="$gotoParams $key"
done
complete -W "$gotoParams" goto
```

この例だと

```bash
$ goto l<tab>
で
$ goto log ---> cd /var/log

$ goto l<tab>h<tab>
で
$ goto loghttpd ---> cd /var/log/httpd
```

になるので、ショートカットの定義次第でいい感じになります。
CentOS Trac1.0.1を入れる

yumでTracを入れた。

```bash
yum install trac
```

少し触ってみたが、バージョンが0.12で有ることに気づく。
ソースからsetup.pyで入れ直して、新しい方を試して見る。
せっかく入れたtracを一回消す。

```bash
/etc/init.d/httpd stop #念のためApacheを止める
yum remove trac
```

バベルを入れる。

```bash
easy_install Babel
```

Trac1.0.1のソースをダウンロードし、解凍、setup.pyを実行する。

```bash
wget http://download.edgewall.org/trac/Trac-1.0.1.tar.gz
tar xvxf Trac-1.0.1.tar.gz
cd Trac-1.0.1
sython setup.py compile_catalog -f
```

tracプロジェクトを作る。

```bash
trac-admin /var/trac/sampleproject  initenv
```

Apacheと連携しようと思って、/etc/httpd/を覗くとファイルがない。
先ほどのremoveで消してしまったようだ…、と思っていたら、trac.conf.rpmsaveの名前で自動でコピーをして置いてくれたみたいだ。コピーして書き換える。

```bash
vi /etc/httpd/conf.d/trac.conf
```

```:trac.conf
<VirtualHost *:443>
  ServerName samplehost
  DocumentRoot /var/trac/sampleproject
  ErrorLog logs/ssl_error_log
  TransferLog logs/ssl_access_log
  LogLevel warn

  SSLEngine on
  SSLProtocol all -SSLv2

  SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
  SSLCertificateFile /etc/pki/tls/certs/server.crt
  SSLCertificateKeyFile /etc/pki/tls/private/server.key

  <location />
    SetHandler mod_python
    PythonHandler trac.web.modpython_frontend
    PythonOption TracEnv /var/trac/sampleproject
    PythonOption TracUriRoot /
  </location>

  CustomLog logs/ssl_request_log \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

  <LocationMatch "/">
    AuthType Basic
    AuthName "Trac"
    AuthUserFile /etc/trac/.htpasswd
    Require valid-user
  </LocationMatch>

</Virtualhost>
```

adminのユーザーの設定をしておく。

```bash
htpasswd /etc/trac/.htpasswd admin
```

Apacheを起動する。

```bash
/etc/init.d/httpd start
```

わくわくしながら、ブラウザで画面を表示するとエラー。

>TracError: Error reading '/var/trac/sampleproject/conf/trac.ini', make sure it is readable.


Apacheから見えるようにしてあげる。

```bash
chown -R apache:apache  /var/trac/
```

以上で、なんとか動いた。
ubuntu 13.10 MongoDBの導入

山ほど似たようなものありそうだけどまぁ、メモ
適当なインストールと、ちょっとだけMongoDBを触ってみる

##作業環境

```bash
$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=13.10
DISTRIB_CODENAME=saucy
DISTRIB_DESCRIPTION="Ubuntu 13.10"
```

##参考サイト

### インストール部分

MongoDBの公式解説
http://docs.mongodb.org/manual/tutorial/install-mongodb-on-ubuntu/

### 使ってみる部分

MongoDBの薄い本
http://www.cuspy.org/diary/2012-04-17/the-little-mongodb-book-ja.pdf

##手順

基本的には上記参考サイト同じ事してるだけ

aptのパッケージに矛盾がないことを保証するため *MongoDB public GPG Key* をインポート

```bash
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10

```

/etc/apt/sources.list.d/にmongodbのリポジトリ設定を追加

```bash
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list
```

いつもの

```bash
sudo apt-get update
sudo apt-get install mongodb-10gen
```

バージョンが指定したいならこうすればいいらしい（未確認）

```bash
apt-get install mongodb-10gen=2.2.3
```

## 使ってみる

じゃあ早速、楽しませてもらおっかな〜！


起動

```bash
$ sudo service mongodb start
start: Job is already running: mongodb
```

MongoShellを動かす

```bash
$ mongo
MongoDB shell version: 2.4.9
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
	http://docs.mongodb.org/
Questions? Try the support group
	http://groups.google.com/group/mongodb-user
> 
```

コマンド一覧を見てみる
> db.help()

コマンドがどうなってんのか見てみる
ちょっと面白い
> db.help

現在のdb状態がどんなものか見るために、`db.status()`を使う

```bash
> db.stats()
{
	"db" : "test",
	"collections" : 0,
	"objects" : 0,
	"avgObjSize" : 0,
	"dataSize" : 0,
	"storageSize" : 0,
	"numExtents" : 0,
	"indexes" : 0,
	"indexSize" : 0,
	"fileSize" : 0,
	"nsSizeMB" : 0,
	"dataFileVersion" : {
		
	},
	"ok" : 1
}
```

コレクションを作ってみる

`> db.games.insert({name: 'Garden', developer: 'Cuffs' })`

ということで gamesコレクションに、名前と制作会社をぶち込んでみた

```bash
> db.stats()
{
	"db" : "test",
	"collections" : 3,
	"objects" : 5,
	"avgObjSize" : 46.4,
	"dataSize" : 232,
	"storageSize" : 12288,
	"numExtents" : 3,
	"indexes" : 1,
	"indexSize" : 8176,
	"fileSize" : 201326592,
	"nsSizeMB" : 16,
	"dataFileVersion" : {
		"major" : 4,
		"minor" : 5
	},
	"ok" : 1
}
```

collectionsが **3** に
objectsが **5** に
他にもいろいろと変わった

とりあえずCollectionを確認してみよう

```bash
> db.getCollectionNames()
[ "games", "system.indexes" ]
```

collectionsのあと１つはどこへ行ったの…（小声）

追加でさっき追加したデータも見てみよう

```bash
> db.games.find()
{ "_id" : ObjectId("532d2176c0268538d80080c1"), "name" : "Garden", "developer" : "Cuffs" }
```

こっちには一意っぽい *_id* が追加されている
さらにこの *_id* はインデックス化されているようです

```bash
> db.system.indexes.find()
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test.games", "name" : "_id_" }
```

せっかくなんでもう一件データを追加してみよう。
graphickerの項目を増やしてみる

```bash
>db.games.insert({name: 'YourDialy', developer : 'CUBE', graphicker : 'Kantoku' })

> db.games.find()
{ "_id" : ObjectId("532d2176c0268538d80080c1"), "name" : "Garden", "developer" : "Cuffs" }
{ "_id" : ObjectId("532d280c90c679088ba0a3f9"), "name" : "YourDialy", "developer" : "CUBE", "graphicker" : "Kantoku" }
 
```

*graphicker* が新たに追加されてる事がわかる
でもGardenの方には *graphicker* がないままなんですねぇ…

---

とまぁ…簡単に触ってみるのはこのくらいで一旦終わりにしましょ
あとは薄い本見ながら触ってみるのが良さそうです

以上！
CFLAGSを誤記して"configure: error: C compiler cannot create executables"と言われた話

mesaをビルドする際autogen.shの実行でCFLAGSを指定したのだが、-I（大文字アイ）を指定すべきところを間違えて-l（小文字エル）を書いてしまい以下のようなエラーがでた。

```
configure: error: C compiler cannot create executables
```

ググっても「gcc入れろ」とか「gccのバージョン指定しろ」というアドバイスしか見つからず解決に非常に時間がかかってしまった。

どうやら./configureでgccがちゃんと動くか実際にコンパイルをするフェーズがあるらしく、そのときおかしな指定されたCFLAGSのせいでコンパイルエラーとなり上のエラーメッセージとなったもよう。

環境変数、オプションの指定には気をつけましょう。
MATLABのboxplotでノッチで中央値の有為差比較する範囲を1%水準にする


デフォルトのboxplotのノッチは，
>[MathWorks 箱ひげ図 より](http://www.mathworks.co.jp/jp/help/stats/boxplot.html "boxplot")
>区間がオーバーラップしない場合、2 つの中央値は 5% の水準で有意差があります。区間の端点は、刻みまたは三角形のマーカーの中心の極値です。極値は q2 – 1.57(q3 – q1)/sqrt(n) と q2 + 1.57(q3 – q1)/sqrt(n) に対応します。ここで、q2 は中央値 (50 番目の百分位数)、q1 と q3 はそれぞれ 25 番目および 75 番目の百分位数であり、n は NaN 値を含めない観測値の数です。標本のサイズが小さい場合、刻みはボックスの端を超える可能性があります。

とのこと．

それぞれの中央値を1%の水準で有為差比較するノッチを作るため，（意味違うけど）q4とq5という変数に，それぞれ5番目および95番目の百分位数を保存しておき，ノッチの上端と下端を q2 – 1.57(q5 – q4)/sqrt(n) と q2 + 1.57(q5 – q4)/sqrt(n) とした．

diff置いとく．

```matlab:boxplot.m.diff
--- /Applications/MATLAB_R2012a_Student.app/toolbox/stats/stats/boxplot.m.orig	2014-03-22 12:24:26.000000000 +0900
+++ /Applications/MATLAB_R2012a_Student.app/toolbox/stats/stats/boxplot.m	2014-03-24 15:32:15.000000000 +0900
@@ -2097,6 +2097,8 @@
 boxidx.q1 = nan;
 boxidx.q2 = nan;
 boxidx.q3 = nan;
+boxidx.q4 = nan;
+boxidx.q5 = nan;
 boxidx.whi = nan;
 boxidx.maximum = nan;
 boxidx.numNans = 0;
@@ -2127,9 +2129,11 @@
 ind0 = gStart-1;
 % Calculate 25,50,75 percentile indices.
 if lastind > 1
+    i05 = firstind+ .05*(lastind-firstind) -.45;   % Edit to set 1% for confidence interval
     i25 = firstind+ .25*(lastind-firstind) -.25;
     i50 = firstind+ .50*(lastind-firstind);
     i75 = firstind+ .75*(lastind-firstind) +.25;
+    i95 = firstind+ .95*(lastind-firstind) +.45;   % Edit to set 1% for confidence interval
 else
     i25 = 1;
     i50 = 1;
@@ -2195,6 +2199,8 @@
 boxidx.q1 = i25+ind0;
 boxidx.q2 = i50+ind0;
 boxidx.q3 = i75+ind0;
+boxidx.q4 = i05+ind0;   % Edit to set 1% for confidence interval
+boxidx.q5 = i95+ind0;   % Edit to set 1% for confidence interval
 boxidx.whi = whi+ind0;
 boxidx.maximum = lastind+ind0;
 boxidx.outliers = {outall+ind0};
@@ -2235,6 +2241,8 @@
 i25 = boxidx.q1-ind0;
 i50 = boxidx.q2-ind0;
 i75 = boxidx.q3-ind0;
+i05 = boxidx.q4-ind0;   % Edit to set 1% for confidence interval
+i95 = boxidx.q5-ind0;   % Edit to set 1% for confidence interval
 
 % Compute weighted average.
 p25Ratio = i25-floor(i25);
@@ -2261,6 +2269,24 @@
         +x(ceil(i75))*p75Ratio;
 end
 
+% Edit to set 1% for confidence interval
+p05Ratio = i05-floor(i05);
+if p05Ratio==0
+    p05 = x(i05);
+else
+    p05 = x(floor(i05))*(1-p05Ratio) ...
+        +x(ceil(i05))*p05Ratio;
+end
+
+% Edit to set 1% for confidence interval
+p95Ratio = i95-floor(i95);
+if p95Ratio==0
+    p95 = x(i95);
+else
+    p95 = x(floor(i95))*(1-p95Ratio) ...
+        +x(ceil(i95))*p95Ratio;
+end
+
 % Standard percentile function is slower.
 %     p = prctile(x,[25 50 75]);
 %     p25 = p(1);
@@ -2271,11 +2297,13 @@
 % x may be padded with NaN -- don't count them
 nx = sum(~isnan(x));
 
-nhi = p50 + 1.57*(p75-p25)/sqrt(nx);
+%nhi = p50 + 1.57*(p75-p25)/sqrt(nx);
+nhi = p50 + 1.57*(p95-p05)/sqrt(nx);   % Edit to set 1% for confidence interval
 if ~isfinite(nhi)
     nhi = p50;
 end
-nlo = p50 - 1.57*(p75-p25)/sqrt(nx);
+%nlo = p50 - 1.57*(p75-p25)/sqrt(nx);
+nlo = p50 - 1.57*(p95-p05)/sqrt(nx);   % Edit to set 1% for confidence interval
 if ~isfinite(nlo)
     nlo = p50;
 end
```

手抜きして，既存の関数を直接編集しちゃった．
MATLABを再起動したら読み込まれる．

後で混乱するので，作図したら元に戻しておくこと．
Vimのノーマルモードから加算・減算を行う


## 加算
`数値<C-a>`
カーソルのある行の次に出てくる最初の数字に入力した数値を加算する（カーソル行に数字がない場合は何もおこらない）。

## 減算
`数値<C-x>`
こちらは減算を行う。

## 0から始まる数値について
Vimでは先頭が0だった場合は8進数と扱うので、先頭が0の十進数として数値を扱いたい場合は以下を設定する。

```
set nrformats=
```
jquery mobileにおける"Origin null is not allowed by Access-Control-Allow-Origin"の解決策

*注：Webセキュリティに関して知識が乏しいため、解決策として間違っているかもしれません。造詣の深い方はご指摘ください。

jQueryMobileを用いると、ローカルで開発している場合(file:///...)においても、anchorタグのhref属性で別のファイルに遷移することができません。これは、jQueryMobileを加えると、anchorタグのリンク先にAjaxリクエスト(XMLHttpRequest)を送るようにするため、Same-Originポリシーに引っかかるからですが、解決策(?)はいくつかあるようです。

1. jQueryMobile特有のdata-role="page"を用いて遷移(?)させる
2. onclick='location.href="hoge.html"'　で遷移させる（問題あり）
3. rel="external"で外部リンクにしてしまう

2の方法は、[StackOverFlowの質問](http://stackoverflow.com/questions/1667416/window-location-href-vs-clicking-on-an-anchor)で挙げられているように、javascriptで遷移するのはhtmlのつながりであるWebというシステム上、あまり良しとされていません。

3の方法も[StackOverFlowの別の質問](http://stackoverflow.com/questions/8463886/phonegap-and-jquery-mobile-a-href-origin-null-is-not-allowed-by-access-cont)で挙げられているように、外部リンクにするとtransitionが失われてしまいます。

おそらくjQueryMobileが意図している正しい使い方は、1の方法で、これは1つのhtmlファイル内で遷移を行う際、data-role="page"属性のついているものを一つのページとして表示します。具体的には、

```html
<div data-role="page" id="page1">
  <a href="#page2">to page2</a>
</div>
<div data-role="page" id="page2">
  page2
</div>
```

と設定することにより、見た目ではページが遷移したように見えます。htmlが長くなりがちですが、htmlではページという概念が定義されていないため、このようにせざるをえなかったのでしょうか。
gulpでCoffeeScriptを使う方法まとめ

Gruntから移行する人も最近増えて来た gulp です。ただ、Coffee好きからすると残念なのが、gulpfileをCoffeeScriptで書いても、そのままだと認識されないこと。この記事では、それをなんとかする方法をまとめます。

**追記: 次期バージョン gulp 3.7 では、デフォルトでAltJSが使えるようになるので、下のような苦労は不要になるらしいです**


## 1. 正攻法: コマンドオプション

gulpfileはJavaScriptで書くのが標準ですが、オプションをつけることでgulpfile.coffeeを直接ロードすることが可能です。

```bash
$ gulp --require coffee-script/register
```


## 2. JavaScript からインクルード

毎回オプションを付けるのが面倒という場合、

* gulpfile.coffee
* gulpfile.js

のふたつを用意して、.jsから.coffeeをインクルードする方法があります。(個人的にはなんかイヤ)

```gulpfile.js
require('coffee-script/register');
require('./gulpfile.coffee');
```

* [Using coffee-script for gulpfile](https://github.com/gulpjs/gulp/blob/master/docs/recipes/using-coffee-script-for-gulpfile.md)


## 3. エイリアスを設定

もうひとつの方法が、エイリアスを設定しておくというもの。Mac OS Xの標準のシェルであれば、次のコマンドで設定可能です。

```bash
$ echo "alias gulp='gulp --require coffee-script/register'" >> ~/.profile
```

個人で使うには、この方法が一番キレイですが、プロジェクトを人と共有する際に、説明がちょっと面倒なのが玉に瑕。


## 4. CoffeeGulp

最後の方法は、[コマンドのラッパーを作ってしまおうというもの](https://github.com/minibikini/coffeegulp)で、`gulp`コマンドの代わりに、`coffeegulp`コマンドを使います。

```bash
$ coffeegulp
```

これを使えるようにするには、

```bash
$ sudo npm install coffeegulp -g
```

としておく必要があります。手間的には、エイリアスと同じくらいでしょうか...。


## まとめ

以上、4つの方法を紹介しました。

方法 | コマンド | デメリット
-----|--------|--------
1. コマンドオプション | `gulp --require coffee-script/register` | コマンドが長い
2. jsからインクルード | `gulp` | 常にjsとcoffeeの2つがいる
3. エイリアス | `gulp` | 非標準な方法
4. CoffeeGulp | `coffeegulp` | 非標準な方法

個人的には、次の方針をとっていますが、それぞれのお好みでどうぞ〜。

* **対外的には**: コマンドオプションによる方式で説明
* **個人の環境では**: エイリアスを設定

希望としては、gulpのコミッターが心変わりをして、CoffeeScriptにサービスしてくれることを期待しています。[こちらのディスカッション](https://github.com/gulpjs/gulp/issues/103)の風向きだと難しそうですが、ユーザが増えてくるに従って、また議論が再燃する可能性もなきにしもあらず。
Python/Django で役に立つ小粒で気の利いた Vim Plugins


Vim で Python のコーディングをするときに、ちょっとした問題を解決してくれる Plugin の紹介です。

[python-mode](https://github.com/klen/python-mode), [jedi-vim](https://github.com/davidhalter/jedi-vim) といった IDE 級の機能を備えた Plugin も素敵ですが、かゆい所に手が届く Plugin もまた良いものです。

## [python_match.vim](https://github.com/vim-scripts/python_match.vim)
% (matchit) を python 向けに強化する Plugin です。

if/elif/else, for/continue/break, try/except/else/finally, while/continue/break などのキーワード間を % で移動できるようになります。 
for/else には今の所対応していないようです。

## [django-template-textobjects](https://github.com/mjbrownie/django-template-textobjects)

個人的に今回紹介する中で最も Life Changing な Plugin です。
Django Template の組み込みタグを text-objects に対応させてくれます。肝心の text-objects 自体をそこまで使わないのですが、[matchit.vim](https://github.com/edsono/vim-matchit) と連携して block/endblock 間を matchit してくれるようになるのが嬉しい所です。
Django 1.4 以降に追加された elif タグには今の所対応していないようだったので [pullreq を出してみました](https://github.com/mjbrownie/django-template-textobjects/pull/2)。
[textobj-user](https://github.com/kana/vim-textobj-user) に依存していますので、こちらも入れましょう。

## [indentpython.vim](https://github.com/vim-scripts/indentpython.vim)
インデントを [PEP8](https://dl.dropboxusercontent.com/u/555254/pep-0008.ja.html) 準拠にしてくれる Plugin です。
autopep8 と併用するとインデント周りで細かいツッコミを受けるケースは皆無になります。

## その他
なお、その他の小粒系 Plugin として [django.vim](https://github.com/vim-scripts/django.vim), [python-syntax](https://github.com/hdima/python-syntax), [python-indent](https://github.com/Valloric/python-indent) も入れていたのですが、最新の Vim 7.4 では特に入れてなくても問題なかったり、他の Plugin と競合していたりして使わなくなりました。
定期的な見直しは重要ですね。。

## まとめ
matchit 重要。
また、小粒 Plugin は vim-script と英語がどうにかなればちょっとした contribute もしやすいですね。
Nashorn(Java 8のJavaScriptエンジン)の実力

Java 8 になって、JREに含まれるJavaScriptエンジンがRhinoからNashornに変わりました。

```js:
public class Inspector {
    public static void main(String[] args) {
        ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");
        System.out.println("engine = " + engine);
    }
}
```

>engine = jdk.nashorn.api.scripting.NashornScriptEngine@548ad73b


速くなったのかなー？ということで、RhinoとNashhornの実行速度を比較してみます。
コードはこんなシンプルなものです。

```js:
public class Inspector {
    public static void main(String[] args) throws ScriptException {
        ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");
        System.out.println("engine = " + engine);
        long startTime = System.currentTimeMillis();
        engine.eval("var count = 0;for(var i=0;i<100000;i++){count += i}");
        System.out.println("finish "+(System.currentTimeMillis() - startTime));
    }
}
```

java7で実行すると、


>engine = com.sun.script.javascript.RhinoScriptEngine@4fb3c3d9
>finish 367


java8で実行すると、

>engine = jdk.nashorn.api.scripting.NashornScriptEngine@548ad73b
>finish 117

Nashoneはやーい。
次世代統計利用システムを利用した、都道府県・市区町村コードの取得


[次世代統計利用システム](http://statdb.nstac.go.jp)で提供されている「都道府県・市区町村コード情報（LOD）」のAPIから、
都道府県や市区町村のコードを取得する際の手順について。

#### 手順.1
***
SPARQL エンドポイントにアクセス。
http://statdb.nstac.go.jp/lod/sparql

#### 手順.2
***
右側の「OPTIONS」にある「Output format (if supported by query type):」のプルダウンメニューから、任意の出力フォーマットを選択。

#### 手順.3
***

目的にあわせて、以下のSELECT文を実行。

##### 都道府県コードを取得する場合

```sparql
SELECT DISTINCT ?area_code ?label_ja ?label_kana ?label_en WHERE {
	?s sacs:administrativeClass sacs:Prefecture . 
	?s dcterms:identifier ?area_code . 
	?s rdfs:label ?label_ja 
		FILTER( lang(?label_ja) = "ja") . 
	?s rdfs:label ?label_kana 
		FILTER( lang(?label_kana) = "ja-hrkt") . 
	?s rdfs:label ?label_en
		FILTER( lang(?label_en) = "en")
}
```

##### 市区町村コードを取得する場合

```sparql
SELECT DISTINCT ?area_code ?label_ja ?label_kana ?label_en WHERE {
	?s sacs:administrativeClass ?area_class
		FILTER( regex( ?area_class, "(#SpecialWard|#City|#Town|#Village)$" ) ) .
	?s dcterms:identifier ?area_code
		FILTER( regex( ?area_code, "^01" ) ) .
	?s rdfs:label ?label_ja
		FILTER( lang(?label_ja) = "ja" ).
	?s rdfs:label ?label_kana
		FILTER( lang(?label_kana) = "ja-hrkt" ).
	?s rdfs:label ?label_en
		FILTER( lang(?label_en) = "en" )
}
ORDER BY ?area_code
```

上記サンプルの「FILTER( regex( ?area_code, "^01" ) ) .」で指定している数字（01）は、
対象都道府県の都道府県コードのうち先頭2桁に変更。

#### 参考.
***

次世代統計利用システム【都道府県・市区町村コード情報】　提供仕様
http://statdb.nstac.go.jp/wp/wp-content/uploads/2013/12/sac-spec.pdf
MacにてPlay2のSQLiteドライバをインストール方法

# 1. ドライバをダウンロード

ダウンロードはここから：<https://bitbucket.org/xerial/sqlite-jdbc/downloads>

バージョンについて：

高いバージョンだと下記のエラーが発生：`java.lang.NoClassDefFoundError: org/sqlite/NativeDB`

すべてを試したわけではないですが、少なくとも3.7.2（sqlite-jdbc-3.7.2.jar）は無事に動けます。


# 2. ドライバを`./lib`にコピ

※ 無ければ作っておきましょう。

当該アプリケーションの配下にて、下記のコマンドを発行：

```shell
$ cp ~/Downloads/sqlite-jdbc-3.7.2.jar lib/
```


# 3. `application.conf`を編集

SQLiteを使うことを明記：

```scala
db.default.driver=org.sqlite.JDBC
db.default.url="jdbc:sqlite:/Users/liubin/Dropbox/tasklist/db/tasks.db"
```

`url`に必ずフルパースを記入しなければならないそうです。

# 4. DBファイルを作ろう

`db``フォルダを作って、｀sqlite3｀コマンドでDBファイルを作成します。

```shell
$ mkdir db

$ sqlite3 db/tasks.db
SQLite version 3.7.13 2012-07-17 17:46:21
Enter ".help" for instructions
Enter SQL statements terminated with a ";"

sqlite> .databases
seq  name             file
---  ---------------  ----------------------------------------------------------
0    main             /Users/liubin/Dropbox/tasklist/db/tasks.db
sqlite>
```

# 5. run

```shell
$play run
```
SMS（ショートメッセージ）送信サービス

SMS（ショートメッセージサービス）は、電話番号が分かれば送信が可能なサービスです。Facebookなどの２要素認証などでも利用されています。
通常は端末からしか送信できませんが、サービスを利用してアプリケーションから送ることが可能になります。

2014/10/1 より携帯・PHS間のMNPが開始、SMSも可能になりました

# APIあり

## nexmo
https://www.nexmo.com/jp

日本のほか、世界各国で利用できる。海外の場合は、他社サービスよりも安い場合あり。電話番号を取得する必要はない。

|キャリア|料金|
|---|---|
|日本|$0.0843/通|


国際的な事業拡大を続けるVonage、東京に日本初の拠点を開設｜Vonage Holdings Corp.のプレスリリース
https://prtimes.jp/main/html/rd/p/000000001.000030605.html

## Amazon SNS (Simple Notification Service)
https://aws.amazon.com/jp/sns/

2016年6月28日より200ヶ国以上に対応、日本でも利用可能となりました。
無料利用枠が100となっていますが、日本宛てには適用されません。
下記の金額は参考値です。宛先によって料金が異なります。

|キャリア|料金|
|---|---|
|NTTドコモ|$0.07098/通|
|au|$0.07985/通|
|Softbank|$0.04983/通|

## Twilio
http://twilio.kddi-web.com/
IVR、SMSともに可能。一番おすすめ。

|キャリア|料金|備考|
|---|---|---|
|NTTドコモ|$0.08/通|旧料金：9.6円/通|
|au|$0.08/通|旧料金：9.6円 => 8.0円（2016/05/20価格改定）|
|Softbank|$0.08/通|旧料金：1.5円 => 8.0円（2016/05/20価格改定）|
|Y!mobile|$0.08/通|旧料金：6.0円 => 8.0円（2016/05/20価格改定）|

## 空電プッシュ（NTTコム オンライン）
https://www.karaden.jp/
月額＋従量制

## EZSMS
https://www.ezsms.biz/ja/
低価格、低コスト、初期費用なしの国内・国際ショートメッセージ(SMS)配信サービス
１通５０～１０円（前払いポイント制）。初期費用なし、月額なし。国際可。

## SMS送信サービス｜EXLINK-SMS
http://www.ex-sms.com/

## メディアSMS
http://media-sms.net/
コールセンターとのIVR・CTIサービス、既存CRMシステムやMAツールとの連携可能なAPIも用意。
双方向サービス、全キャリア長文SMSサービス（ドコモ660文字、au670文字、ソフトバンク670文字）有り


## SMSダイレクト
http://www.sms-d.net/
IVR連携送信や基幹システム連携送信も可能なAPIも提供。

## AOS
http://aossms.com/

# APIなし

## SMSゲートウェイ
http://gw.aossms.com/
簡単、低コストで、１通からでも国際SMS送信サービス SMS ゲートウェイ
１通９円、初期費用なし、月額なし。国際可。

# 料金等不明

## SMS Inter-Connect Service
http://www.indigo.co.jp/ss/sms.html
ターミナルからSublimeText3を実行する設定のメモ

ターミナルからSublimeText3を呼び出す設定を行った時にエラーがでた。エラー内容で検索したところstackoverflowのGetting SublimeText to run from terminal in MACと同じ現象。

Answerの投稿を参考に次のコマンドを実行したら無事に設定できた。

```
$ sudo ln -s /Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl /usr/local/bin/subl
```
<br/>
__stackoverflowのGetting SublimeText to run from terminal in MAC__
http://stackoverflow.com/questions/17733367/getting-sublimetext-to-run-from-terminal-in-mac
Android/ScalaでNoSuchMethodErrorのデバッグ - sbt編

LogCatで下の様にNoSuchMethodErrorが出るときのデバッグ方法メモ。
環境は[こちら](http://qiita.com/ikuo/items/53f5b300f09c38a6c952)で準備したsbt。NoClassDefFoundErrorも同様にできるはず。

```
03-21 14:28:46.023: E/AndroidRuntime(7507): java.lang.NoSuchMethodError: com.fasterxml.jackson.core.JsonFactory.createParser
```
上はJsonFactory.createParser が見つからない、という例。

## 1. クラスファイルにメソッドがあるか調べる
`./target/`に生成されるjarファイルを下の様にunzipで展開し、

```shell-session
$ cd ./target
$ unzip classes-myapp1-compile-0.1.min.jar
...
  inflating: com/fasterxml/jackson/core/JsonFactory$Feature.class
  inflating: com/fasterxml/jackson/core/JsonFactory.class
...
```

javapコマンドでそのメソッドがあるかをチェックする。

```shell-session
$ javap com.fasterxml.jackson.core.JsonFactory
...
    public com.fasterxml.jackson.core.JsonParser createJsonParser(java.lang.String) ...;
    public com.fasterxml.jackson.core.JsonParser createJsonParser(java.io.File)...;
...
```

メソッド名がみつからない場合、3. 依存しているライブラリのjarファイルが古くないかをチェックし、それでもだめなら 4. proguard でそのメソッドを保持するように設定してみる。

## 2. dexファイルにメソッドがあるか調べる
1とは別に、dexdumpを使ってメソッド名があるかを調べることもできる。

```
$ cd ./target
$ $ANDROID_HOME/build-tools/19.0.0/dexdump classes-myapp1-compile-0.1.dex|grep createParser
```

上は`createParser`を調べる例。`grep -20 ...`として前後を表示してみるなどする。

1.と同様に、メソッド名がみつからない場合は下の 3. or 4. を当たってみる。

## 3. 依存しているライブラリのバージョンを調べる
1. or 2.でメソッド名が見つからない場合、依存ライブラリのバージョンを調べる。下の様にsbtのコンソールで依存ライブラリのパスが取得できるので、バージョン番号を確認し古ければ更新する。

```shell-session
$ sbt
> show dependency-classpath
```

## 4. proguardでメソッドが取り除かれないようにする

3.が問題ない場合、proguardに`-keep`オプションを追加する。
ただし、`-keep`の範囲を増やすと下のようなエラーに遭遇することがある。

`trouble writing output: excess write of ...`

その時は、sbtを立ち上げ直すか、[こちら](http://qiita.com/ikuo/items/20547bf450102d9f49be#2-5)のようにanalysisBudgetを大きな値にすると解消することが多い。なぜかは良く分かっていない。
Debian sshアクセスでgitをクローン

グループgituserを作って、ユーザーを追加する。

```bash
less /etc/group #グループ確認
addgroup gituser
adduser sampleuser gituser
```


リポジトリ作成予定場所以下に書き込み権限を与える。

```bash
ls -l #権限確認
chown -R :gituser repository/
chmod g+w -R  repository/
ls -l #もう一度権限確認
```

gitリポジトリ作成

```bash
mkdir /var/repository/sample.git
cd /var/repository/sample.git/
git init --bare
```

外からは、次のようにクローン出来る。

```bash
git clone ssh://sampleuser@192.0.2.1:1234/var/repository/sample.git
```
■使えるアイコンAwesome のインストール


筆者環境

MacOSX 10.9.2
端末：MacBookPro
Homebrew 0.9.5
Ruby 2.1.0
Rails 3.1.0,4.0.3

参照URL
http://fortawesome.github.io/Font-Awesome/icons/
https://github.com/bokmann/font-awesome-rails
https://github.com/l-lin/font-awesome-animation
=> 面白いアニメーションを追加可能です。

## Gemfileに以下追加

```
gem "font-awesome-rails"
```

## CSSに追加

```
application.cssにCSSをインポート
```

## アニメーション

■URL
http://l-lin.github.io/font-awesome-animation/

Productionモードでプリコンパイルが有効になっていると
railsのSyntaxで失敗するので注意して下さい。

一部間違っている部分修正後、問題ないことを確認。
■場所はここ

```
372 .faa-float.animated, .faa-float.animated-hover:hover {
373  -moz-animation: float 2s linear infinite; 
# => ここの「- moz-animation」 => 「-moz-animation」に変更。 
374	 -webkit-animation: float 2s linear infinite;
375	 -ms-animation: float 2s linear infinite;
376	  animation: float 2s linear infinite;
}
```

ここのアニメーションが楽しくていいです。

ご活用下さい。
Node.jsのmoduleをjsonにするgruntプラグインつくたー


## 経緯
クライアント用にjsonでデータを用意しようと思ったけど、生のjsonを管理するとか苦痛なので、CoffeeScriptで書きたい。

さらに、Node.jsでゴニョゴニョしたデータを含めたかったので、Nodeで実行した結果をjsonにしたい。
例えば、画像データをData URI schemeにするとか、共通のデータを別ファイルにしておいて読み込むとか。

ということで、module.exportsをJSONに変換して出力するgruntプラグインつくりました。

内部的には単純にmodule.exportsをJSON.stringifyでJSONフォーマットな文字列に変換して出力しているだけです。

## example
### コンパイル対象のソース

```coffeescript:target.json.coffee
'use strict'
fs = require 'fs'
delete require.cache[require.resolve './path/to/common.coffee']

module.exports =
  hoge: 'hoge'
  include: require './path/to/common.coffee'
  img: 'data:image/png;base64,' + fs.readFileSync __dirname + '/path/to/img.png', 'base64'

```

```coffeescript:common.coffee
'use strict'

module.exports =
  fuga: 'fuga'

```

### 書きだしたjson

```json
{"hoge":"hoge","include":{"fuga":"fuga"},"img":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAABGdBTUEAALGPC/xhBQAAAANQTFRF////p8QbyAAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII="}
```

## インストール
```bash
npm install exports2json -D
```

## 設定
オプションは今のところありません。

```coffeescript
exports2json:
  expand: true
  cwd: 'path/to/src'
  src: [ '**/*.json.js', '**/*.json.coffee' ]
  dest: 'path/to/dest'
  ext: '.json'
```

## github
https://github.com/kaminaly/grunt-exports2json
Erlangでechoサーバを作る


## 実装
```echo_server.erl
%% TCP echo server demo
-module(echo_server).
-export([start/1]).

start(Port) ->
    Pid = spawn(fun() ->
        {ok, ListenSocket} = gen_tcp:listen(Port, [binary, {active, false}, {reuseaddr, true}, {backlog, 64}]),
        spawn(fun() ->
            accept(ListenSocket)
        end),
        timer:sleep(infinity)
    end),
    {ok, Pid}.

accept(ListenSocket) ->
    {ok, Socket} = gen_tcp:accept(ListenSocket),
    spawn(fun() ->
        accept(ListenSocket)
    end),
    trace("connect ~p~n", [Socket]),
    loop(Socket).

loop(Socket) ->
    gen_tcp:send(Socket, "> "),
    inet:setopts(Socket, [{active, once}]),
    receive
        {tcp, Socket, <<"bye", _/binary>>} ->
            gen_tcp:send(Socket, "bye bye!\n"),
            gen_tcp:close(Socket);
        {tcp, Socket, Message} ->
            gen_tcp:send(Socket, Message),
            loop(Socket);
        {tcp_closed, Socket} ->
            trace("close ~p~n", [Socket]),
            gen_tcp:close(Socket);
        {tcp_error, Socket, Reason} ->
            trace("Handle error ~p on ~p~n", [Reason, Socket])
    end.

trace(Message, Args) ->
    io:format(Message, Args).
```


## echoサーバ起動
```erlang
erl
Erlang R16B03-1 (erts-5.10.4) [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace] 

Eshell V5.10.4  (abort with ^G)
1> c(echo_server).
{ok,echo_server}
2> echo_server:start(8022).
{ok,<0.40.0>}
connect #Port<0.2341>
3> 
```

## telnetクライアントで接続してみる
```
% telnet localhost 8022
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
> hello
hello
> bye
bye bye!
Connection closed by foreign host.
```

## ちょっと負荷をかけてみる
```client.rb
require "socket"

def main host, port, count
    tx = []
    (1..count).each do
        tx << Thread.new do
            sock = TCPSocket.open(host, port)
            test(sock, "hello\n", "hello\n")
            test(sock, "bye\n", "bye bye!\n")
            sock.close()
        end
    end
    tx.each do |t|
        t.join()
    end
    puts "done"
end

def test sock, send, recv
    check(sock, "> ")
    sock.write(send)
    check(sock, recv)
end

def check sock, except
    fact = sock.recv(except.size)
    raise "fail #{ except } != #{ fact }" if fact != except
end

if $0 == __FILE__
    host = ARGV[0] || "localhost"
    port = ARGV[1] || 8022
    count = ARGV[2] || 1000
    main(host, port.to_i, count.to_i)
end
```

### うまくいった!
```
% time ruby client.rb
done
ruby client.rb  0.63s user 0.98s system 134% cpu 1.191 total
```

### しかし何度か実行すると失敗する事も…
```
time ruby client.rb
client.rb:26:in `recv': Connection reset by peer - recvfrom(2) (Errno::ECONNRESET)
	from client.rb:26:in `check'
	from client.rb:20:in `test'
	from client.rb:8:in `block (2 levels) in main'
ruby client.rb  0.70s user 0.92s system 26% cpu 6.231 total
```

## まとめ
erlangでサーバを作るのは難しくない。
今回の素朴な実装では負荷をかけると(Errno::ECONNRESET)が発生する事がある。


参考：http://www.ymotongpoo.com/works/lyse-ja/ja/26_buckets_of_sockets.html
「26.6. Sockserv、再登場」を参考にさせてもらいました。
REST について思っていること

# REST について思っていること

## Web が生まれた時代

先日 Web が 25 周年を迎えた、一方でインターネットは 45 周年だ。
一般人にインターネットと Web の区別はそこまで無いだろう。


インターネットはパソコンを繋いだ。
しかしそこに流れる情報にはあまり統一性がなく、アクセスしたい情報によって、プロトコルやフォーマットを学ばないといけなかった。


「みんなが同じプロトコルとフォーマットで情報を共有すれば、研究はもっと捗る」

情報を HTML という統一したフォーマットで記述し
それを HTTP という統一したプロトコルで配信する

このルールを守ることで、だれもが同じく情報を発信し、受け取れるようになった。


彼はそれを Web と名づけた。


## Web が「ページ」だった時代

Web の最初の用途は「文章を共有すること」だった。

HTML は文書を記述し、 CSS がそれを修飾し、ブラウザは Viewer(閲覧装置)  だった。
ハイパーリンクはそれぞれの文書を接続し、ブラウザの挙動から人はそれを「画面遷移」と読んだ。

全ては人間に最適化されていた。


## Web が「システム」になった時代

Web サーバにプログラムを連携させることで、 HTML を動的に書き換えることができるようになったとき、Web はシステムとして機能しはじめた。

実際にはバックエンドにある DB の中身を可視化するシステムとして機能した。

多くのロジックがそこに移植され、「処理」「業務」「機能」と呼ばれるあらゆるもののインタフェースとして Web が採用されるようになった。


未だに設計の中心には画面の遷移があった。
しかし、Cookie を用いて実現された「セッション」という概念が併用されていた。

「ステートレス」だった Web の上に、「ステート」が持ち込まれた時代であり、

その設計の大半は、VB などで作られた GUI のそれを、 Web でやっていただけのものが多かった。


## Web が 「アプリ」になった時代

それまで「画面遷移」で作られていた Web に変化が起きた。

Flash でしかできなかったサーバとの通信と、ダイナミックな更新が、 JS で実現できることが発見された。

世界はクライアントサイドに広がる可能性に注目が集まった。

ある男がそれを Ajax と名付けた。


責務の多くがクライアントに移り、「世界で最も誤解された言語」と言われた JS に比重が増えた。

今までにない表現ができるようになり、またそれが当たり前になった。
「Viewer」 だと思っていたブラウザが「Platform」であったことに、人々が気がついた時代でもあった。


## 人間が運用でカバーしてたことに気づいた時代

Web はクライアント・サーバ型の方式をとる。
ずっと「クライアント」の先にいたのは人間だった。

しかし、 Ajax を組む場合は JS からリクエストし JS がレスポンスを取得する。

そこで求められたのは、人間に最適化された「画面」ではなかったし、
ログインして画面を遷移するプログラムは、だれも書きたくはなかった。


その事実に直面して開発者は過ちに気づいた。


識別されていない URI に、遷移によって辿り着くことも
全てのリクエストが POST で行われるシステムも
ステータスコード 200 で返るエラー画面を解釈するのも
HTML の余白が全て連続する br でできていても


全ては「人間」だから成り立っていた。
ブラウザの抽象化による助けもあり、不備は人間が運用でカバーしていたのだ。


フォーマットとしての JSON が発明され、別途 JavaScript 用の API が作られることが多かった。
その実装は、「人間向け」のそれとは乖離し、開発者は設計方針の落としどころを探り始めた。


## Web の実体が「説明」された時代

Web にはルールがあった。

「URI」 により識別された「リソース」を、
「HTTP メソッド」で操作し、
「HTTP ヘッダ」でメタデータを表現し、
「ステータスコード」で結果を知り、
「レスポンスボディ」で情報を取得する。


「URI」 は画面の場所ではなかった。
「画面」とは「リソース」の一つの表現形式でしかなかった。

ステータスコードや HTTP ヘッダは人間の目に触れることは無かったかもしれないし、フォームは GET と POST しか投げられなかった。

でも全てに意味があった。
その意味を知り、正しくと使うことで、相手が「人間」であろうと「プログラム」であろうと、使いやすい Web ができることが HTTP の作者によって説明された。


彼はそれを REST と名づけた。



## REST がひとり歩きした時代

開発者は、ぼんやりしていた 「Web とはどういう構造だったのか」を知り、「どういうポテンシャルを持っているのか」を理解した。


人間だけを相手にしていた時代の設計は見直され、結果的に人間にとっても使いやすいものになった。
もちろん、 HTML5 によってさらに加速したフロント開発の進化も支えた。


多くのサービスが RESTful を標する API を提供し、クライアントは JS にとどまらず、多くの「プログラム」との連携を加速した。


「統一したインタフェースで情報を共有する」という Web が生まれた本来の目的が、もう一度実現されたと言えるかもしれない。


一方で、ぼんやりしていたものに、筋の通った考え方が持ち込まれると
それは議論の中で非常に大きな力を持つ。


Web を開発する多くの場面で REST は拠り所になった。


その力は大きく、固執する者もいた。


彼らは RESTafarians と呼ばれた。


あちらこちらで、REST の是非が議論された。


REST は流行った。良くも悪くも。


## REST から学んだこと

REST は「アーキテクチャスタイル」だと言われる。
REST は必ず必要な何かではない。
REST が無くても Web は成り立っていたことからも自明だ。


しかし、 REST が Web のポテンシャルを引き出す礎となることもまた事実だと思う。

今では REST を学ぶ事自体が目的になりえている。
自分もそうだったところはある。
これはまあそれで良いと思う。

<br>


でも、自分が REST を学んでよかったと思うのは、 REST で設計ができるからでも、 REST の議論ができるからでもない。


「Web ってなんなのか」が分かったことだ。


それは、 Web を興味の中心に置く自分にとって、最も価値のある知識だと、今となっては思う。
CPythonとPyPyの速度比較

# リストに要素を追加する処理速度の比較

## 前提

処理速度の比較として、Pythonの公式実装であるCPythonと、PythonのPythonによるJITコンパイラ実装であるPyPyの実行時間について比較しました。

[Pythonのリスト内包表記](http://qiita.com/intermezzo-fr/items/43f90e07e4cebe63aeb6)で使った以下の3つの関数に対して、[Pythonで実行時間を計測する方法 その1](http://qiita.com/intermezzo-fr/items/9ac2916a9155d5317ebc)で定義したデコレータを用いました。

### 評価対象の関数

```py
# 1. testfunc1: 空リストを用意してappend
@time
def testfunc1(rangelist):
    templist = []
    for temp in rangelist:
        templist.append(temp)

# 2. testfunc2: 1+appendをオブジェクト化
@time
def testfunc2(rangelist):
    templist = []
    append = templist.append
    for temp in rangelist:
        append(temp)

# 3. testfunc3: リスト内包表記
@time
def testfunc3(rangelist):
    templist = [temp for temp in rangelist]
```

### 時間計測用デコレータ

```py
def time(func):
    import functools
    import datetime
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start = datetime.datetime.today()
        result = func(*args, **kwargs)
        end = datetime.datetime.today()
        return end - start
    return wrapper
```

CPythonとPyPyのバージョンは以下の通りです。

### CPython

```
Python 2.7.4 (default, Apr  6 2013, 19:54:46) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
```

### PyPy

```
Python 2.7.3 (87aa9de10f9c, Nov 24 2013, 17:46:53)
[PyPy 2.2.1 with MSC :.1500 32 bit] on win32
Type "help", "copyright", "credits" or "license" for more information
And now for something completely different: ``PyPy 1.3 released''
```



## 結果
 
それぞれの関数に対し、10,000,000個の要素をリストに追加する処理を10回行い、その平均実行時間を取得しました。


### CPython

```pycon
>>> rangelist = range(1,10000000)
>>> print reduce(lambda x, y: x + y, [testfunc1(rangelist) for temp in range(0,10)])/10
0:00:00.998600
>>> print reduce(lambda x, y: x + y, [testfunc2(rangelist) for temp in range(0,10)])/10
0:00:00.723500
>>> print reduce(lambda x, y: x + y, [testfunc3(rangelist) for temp in range(0,10)])/10
0:00:00.399900
```

### PyPy

```pycon
>>> rangelist = range(1,10000000)
>>> print reduce(lambda x, y: x + y, [testfunc1(rangelist) for temp in range(0,10)])/10
0:00:00.290300
>>> print reduce(lambda x, y: x + y, [testfunc2(rangelist) for temp in range(0,10)])/10
0:00:00.275500
>>> print reduce(lambda x, y: x + y, [testfunc3(rangelist) for temp in range(0,10)])/10
0:00:00.046300
```

> 厳密に比較するには、最初の一回を抜いたりいろいろ必要ですが、ここでは何もしていません。

## 結論

それぞれの倍率（CPythonの実行時間÷PyPyの実行時間）は以下の通りです。数値が大きいほどPyPyが高速であることを意味します。

* testfunc1: 3.43
* testfunc2: 2.62
* testfunc3: 8.63

PyPyでは、testfunc3、つまりリスト内包表記版が特に高速化しています。
JITコンパイラ関連でLuaを勉強しようかなと思っていましたが、これならPyPyを勉強するべきだと思いました。