OmniAICreator/Qiita-1.07M huggingface dataset:
Box2dWebでWeb上で物理エンジンをつかってみる

今回から
少し、２D物理エンジンで遊ぼうと思います

box2dwebを使います。
２D物理エンジンbox2dのJavascript版です。
https://code.google.com/p/box2dweb/

Downloadsから
Box2dWeb-2.1a.3.zip
をダウンロードします。

・Box2dWeb-2.1.a.3.js（ライブラリ本体）
・Box2dWeb-2.1.a.3.min.js（圧縮版）
これだけで物理エンジンが使えちゃいます

スマホのブラウザだとうまく動かない場合があるようですね。まぁ、いいや・・・
http://www.dagage.com/weblog/archives/1094

Box2dには
・Shape（形状部品、異なる材質などの複数組み合わせも可能）
・Body（実際衝突判定を行うオブジェクト）
という概念があるみたい

昔PhysXいじってたことあるけど、概念ほぼ同じぽい

さて、いきなり哲学的な話になる訳ですが
ゲームというフィクションの世界にわざわざリアリティ溢れる
物理エンジンを入れるわけはなんでしょうか
いろいろ理由はあると思うのですが、私はこう考えています
①物理法則に基づいているので直感的
②単純なゲームロジックよりも挙動に意外性が生まれやすい

物理エンジンをゲームに組み込むときの注意点というか難しいところは
プレイヤーの動作をそのまま物理エンジンにしてしまうと操作しづらいものになってしまうので
プレイヤー操作は物理エンジンから分離する必要があるのですが、当たり判定は物理エンジンに準拠しなければなりません。



[Box2dWebで複雑な衝突オブジェクトを作成してみる](http://qiita.com/teradonburi/items/03915a15b37f88ba6905)
[Box2dWebでオブジェクトを合体させてみる](http://qiita.com/teradonburi/items/3450dcf350b78fea7bf8)
[Box2dWebでオブジェクトに力を加えて動かしてみる](http://qiita.com/teradonburi/items/1c4f7616311d63117721)
[Box2dWebでマウスで色々放り投げてみる](http://qiita.com/teradonburi/items/61bf7b6da47729fbfd1a)
[Box2dWebでバネを作ってみる](http://qiita.com/teradonburi/items/fe6faad0e912a276c74f)
[Box2dWebで滑車を作ってみる](http://qiita.com/teradonburi/items/35e6f85d673235af0c7c)
[Box2dWebで動く床を作ってみる](http://qiita.com/teradonburi/items/617d861d7a441d07f15c)
[Box2dWebの回転ジョイントで乗りものを作ってみる](http://qiita.com/teradonburi/items/72ca1409e1c1993e0622)
[Box2dWebで開閉扉を作ってみる](http://qiita.com/teradonburi/items/ecc429c76414f24107db)
SphinxでPDF出力（rst2pdf）した時に章や節に番号を付ける


通常、章や節に番号を付ける場合、以下の用に記載すれば番号が付くと「Sphinx-Users.jp」の逆引き辞典:[章や節に番号を振りたい](http://sphinx-users.jp/reverse-dict/writing/numbering.html)には書いてある。

```text
.. toctree::
   :maxdepth: 2
   :numbered:
```

HTMLやePubで出力した場合はこれを追記すれは番号が付くが、rst2pdfを使ってPDF出力をすると番号が付かなくなってしまった。

上記の部分を以下のように変更したら、PDF出力しても番号が付くようになった。

```text
.. section-numbering::
```

試しにこの状態でHTML出力してみたが、ちゃんと番号が付いていた。

PDFで出力する場合は「.. section-numbering::」の方がいいのかもしれない。
いろいろ試してみる必要がありそう。

[参考ページ](http://stackoverflow.com/questions/17614563/how-to-add-section-numbering-when-using-sphinx-with-rst2pdf)
Sophos UTM9＋AD認証連携

##概要
（投稿テストを兼ねて…）
Sophos UTM9のSSL-VPNリモートアクセスを行う際、ユーザ認証にAD認証を使用する方法をまとめました

##事前準備
◆Windowsサーバ側設定
・ADのドメイン名：utm9-test.local とする
・Domain Usersグループのメンバーを認証対象とする
　(Domain Users -> CN=Users)


◆AWS側設定(EC2 -> Security Groups)
・Windowsサーバに対するLDAP389/tcpの通信を許可する


##設定内容
◆Sophos UTM9側

1. WindowsサーバのNWオブジェクト登録
　- [定義とユーザ]->[ネットワーク定義]
　- 「新規ネットワークオブジェクト」ボタンをクリック
　　+ 名前：任意の名称（例："WinSV"）
　　+ タイプ：「ホスト」を選択
　　+ IPv4アドレス：WindowsサーバのIPアドレスを入力（例：172.31.30.159）
　- 「保存」ボタンをクリックし、保存する


1. ユーザ認証方法の設定
　- [定義とユーザ]->[認証サービス]->「サーバ」タグ
　- 「新規認証サーバ」ボタンをクリック
　　+ バックエンド：「Active Directory」を選択
　　+ 優先順位：デフォルト（最上位）
　　+ サーバ：１．で定義したオブジェクトを選択（例："WinSV"）
　　+ ポート：デフォルト（389）
　　+ Bind DN：AdminitsratorのDNを入力
　　　　（例：CN=Administrator,CN=Users,DC=utm9-test,DC=local）
　　+ パスワード：AdministratorのPWを入力
　　+ サーバ設定のテスト：ボタンをクリックし、成功することを確認
　　+ Base DN：認証対象となるDNを入力
　　　　（例：CN=Users,DC=utm9-test,DC=local）
　- 「保存」ボタンをクリックし、保存する
　- 認証サーバ一覧より、作成されたエントリの「編集」ボタンをクリック
　　+ ユーザ名：Domain Usersグループのメンバーのアカウントを入力
　　+ パスワード：アカウントのPWを入力
　　+ テストユーザで認証を行う：ボタンをクリックし、成功することを確認
　　　（Authentication test passed.のメッセージが表示される）


1. ユーザ自動登録の設定
　- [定義とユーザ]->[認証サービス]->「グローバル設定」タグ->「自動ユーザ作成」
　　+ 自動的にユーザを作成：チェック
　　+ 「適用」ボタンをクリック
　- 同「グローバル設定」タグ->「機能別自動ユーザ作成」
　　+ AD認証の連携のみであれば、デフォルト設定のままでよい
　　　（エンドユーザポータルにチェック）


1. 認証用グループの作成
　- [定義とユーザ]->[ユーザとグループ]->「グループ」タグ
　- 「新規グループ」ボタンを選択
　　+ グループ名：任意の名称（例："Active Directory Users"）
　　+ グループタイプ：「バックエンドメンバーシップ」を選択
　　+ バックエンド：「Active Directory」を選択
　　+ 「バックエンドグループメンバーシップに制限」には**チェックを入れないこと**
　- 「保存」ボタンをクリックし、保存する


1. SSL-VPNの認証方法の変更
　- [リモートアクセス]->[SSL]
　- 既存のSSL-VPN用エントリの「編集」ボタンをクリック
　　+ ユーザとグループ：４．で定義したオブジェクトを選択
　　　（例："Active Directory Users"）
　　+ AD認証のみにする場合、既存のユーザのオブジェクトを除外しておく
　- 「保存」ボタンをクリックし、保存する


##備考
・認証ログの確認
　- [ログとレポート]->[ログファイルの閲覧]->「ユーザ認証デーモン」で確認可能


・Sophos側に「シングルサインオン」の機能があるが、Webポータル・SSL-VPNでは使用しない（HTTP,HTTPS proxyのみ使用可能）


・新規ユーザは、自動的にUTM-9にも登録される
　　当然ながら、リモート認証としてX509証明書も自動作成される模様


・Sophos側で、以下のパターンのいづれかの設定を行うと、認証エラーとなる(組み合わせまでは検証していない)
　⇒Webポータルにログオンできないことを確認


　- [定義とユーザ]->[ユーザとグループ]->「ユーザ」タグ
　　作成されたユーザの「バックエンド同期」を有効にする
　- [マネジメント]->[ユーザポータル]->[グローバル]タブ
　　「すべてのユーザを許可」のチェックボックスを外し、許可ユーザにAD連携認証用グループ（例：Active Directory Users）を追加


・AD認証連携用グループ
　　　「バックエンドグループメンバーシップに制限」のチェックはあってもなくても変わらない??
　⇒チェックがない方が良い
　　チェックありだと、新規（ADで作成したが、UTM-9に未ログイン）のユーザがログインできない


##まとめ
・Sophos側で余計な設定を行わなければ、参考URL＋αの設定で容易に連携可能
・AD側も、認証用のユーザを作成し、認証を許可するための適切なグループに登録するだけでよい
・AD側で認証を行うが、Sophosに初めてログインできると、Sophos側ローカルにも自動的にユーザが登録される


##参考URL
・Sophos側設定
http://www.sophos.com/en-us/support/knowledgebase/115659.aspx


・AD側設定
http://ascii.jp/elem/000/000/492/492317/
viewWithTagメソッドの落とし穴

今日プログラムを書いていて躓いたことがあったので書き記して置こうと思います。

具体的には、viewWithTagでviewを取得しようとした際に、2番目以降の要素は問題ないのですが、1番はじめの要素にアクセスすると落ちるようなのです。（EXC_BREAKPOINT(code=1, ...)）

```swift
var button: UIButton = self.view.viewWithTag(tag) as UIButton // 落ちる

button.setBackground(...) // とかやりたい
```

結論から述べると、タグ「0」にしてあったことが原因らしく、tagを設定していないviewの初期値と重複している可能性があります。tagを使う場合が1以上の値を使用するほうが良さそうですね。



また、入れ子になったviewに対しても検索は有効なようです。
例えば、self.viewに対してUIScrollViewを追加して、scrollview内に新たにUILabelを追加し、入れ子のようになった状態を想定します。

```swift
var scrollView: UIScrollView = UIScrollView()
var label: UILabel = UILabel()

label.tag = 10

scrollview.addSubView(label)
self.view.addSubView(scrollview)
```

このとき、

```swift
var newLabel: UILabel = self.view.viewWithTag(10) as UILabel
```
としてもscrollviewに追加されたUILabel(label)を取得することができます。
できてしまいます…ｶﾞｸｶﾞｸ(((( ；ﾟДﾟ))))ﾌﾞﾙﾌﾞﾙ
逆に言うと、入れ子になっていても重複すると思わぬところで落ちてしまうかもしれないので、注意が必要そうですね…。
【Laravel4】スマホ対応 View出し分け

Webサイトを構築していると同じURLでも、デバイス毎に呼び出すViewを変えるという事がよくあります。
（UserAgentで判定してPC版とスマホ版を出し分ける。みたいな。）

今回Laravel4でその辺やってみたので、その時のメモ。

※もしもっとスマートなやり方有れば是非教えて下さい。

##要件
・View::make()で呼び出しはPC版・スマホ版同様にする
例：View::make('home');
・スマホ版になくてPC版にあるページがある場合はPC版を表示
・ViewComposerはPC版・スマホ版共通

##弄くるファイル達

```
app
  - views
      home.blade.php      ・・・home.blade.phpはPC版・スマホ版どちらもある
      bye.blade.php       ・・・bye.blade.phpはPC版のみある
    - composer            ・・・ViewComposerは共通
        BaseComposer.php
    - sp                  ・・・スマホ用のview置き場
        home.blade.php
  - routes.php
bootstrap
  start.php

```

## サンプル
1.何はともあれルーティング

```app/routes.php
// これはPC版、スマホ版どちらも存在するページ
Route::get('/', function()
{
	return View::make('hello');
});

// こちらはPC版しかないページ
Route::get('/bye', function()
{
    return View::make('bye');
});
```

2.デバイス判定用の処理
※こんな判定用クラスがあり「Device」で呼び出せるようFacadeの登録はしてあるとします。

```DeviceCheck.php
class DeviceCheck
{
    public static function isSmartPhone()
    {
        // なんらかの判定処理
    }
}
```

3.bootstrap/start.phpに追記

```bootstrap/start.php
<?php

$app = new Illuminate\Foundation\Application;

/*
| 途中省略します
*/

if (DeviceCheck::isSmartPhone()) {
    App::bindShared('view.finder', function ($app) {
        $paths = [
            app_path('views/sp'),
            app_path('views')
        ];
        return new \Illuminate\View\FileViewFinder($app['files'], $paths);
    });
}

return $app;

```

ポイントは`app/config/app.php`のprovidersに記述されている`Illuminate\View\ViewServiceProvider`のコンストラクタが呼び出される前に
`App::bindShared('view.finder', ・・・`することです。

View::make()時にパスを解決する箇所を追っていくと
`Illuminate\View\FileViewFinder#find()`
が呼び出されているのが分かる。
このクラスのコンストラクタでセットされる$paths内を順に照会していくので渡す配列の値の順序も重要。

```bootstrap/start.php
        $paths = [
            app_path('views/sp'),
            app_path('views')
        ];
```
が

```bootstrap/start.php
        $paths = [
            app_path('views'),
            app_path('views/sp')
        ];
```
だとviews直下から照会されるのでPC版が表示される。
スマホ版に無いページは404ページを表示させるなら`app_path('views/sp')`のみにする。

以上です。
Deviseをupdateをしたら TypeError not a symbol というエラーがでる解決方法

Rails で bundle update をして rails s をしたら TypeError が出て困りました。

# TypeErrorが発生

```rb:エラー
TypeError at /hoge
[1] is not a symbol
```

エラーはこんな感じです。
![TypeError.png](https://qiita-image-store.s3.amazonaws.com/0/1624/4444eb73-d5a5-8f1a-7524-9e767f2b6642.png)

このエラーはdeviseをupdateすると起こるとか？

# ChromeのCookieを削除
どうやらこの現象はブラウザのCookieを削除すれば動くらしいです。
Cookie の削除方法は、https://support.google.com/chrome/answer/95647 コチラのURLにありました。

```
ブラウザのツールバーにある Chrome メニュー [設定] を選択します。
[詳細設定を表示] をクリックします。
[プライバシー] セクションで、[コンテンツの設定] をクリックします。
```
さらに **Cookie** 見出し以下にある **すべての Cookie とサイト データ** を選択します。

![Cookie.png](https://qiita-image-store.s3.amazonaws.com/0/1624/887817f9-6ec7-f0b4-8544-cc7ffa06407b.png)

そこからlocalhostのCookieを削除します。

# エラーが消えた
動きました。よかった(☝ ՞ਊ ՞)

# 参考
http://stackoverflow.com/questions/15870094/anonymous-devise-issue-17-is-not-a-symbol
Vimエディタの便利なコマンド

# はじめに
Vimエディタを使い始めてまだ日が浅いですが、Vimを触っていて便利だなと感じたコマンドを載せたいと思います。

# コマンド一覧
基本的なものも含めて載せていきます。
## ページ移動
#### gg,1G
ページの先頭へ移動
#### G
ページの末尾へ移動
#### 行数G
指定した行数へ移動
#### Ctrl+f,b
1ページ分スクロール
#### Ctrl+d,u
半ページ分スクロール
#### zz
カーソル行がページの中央になります。
## 特定の範囲の文字列をまとめて削除
#### di'
シングルコーテーションで囲まれている文字列にカーソルがある状態で押下すると、
囲まれている文字列が丸ごと削除されます。
di" の場合はダブルコーテーションで囲まれている文字列、
di( または di) なら括弧で囲まれている文字列を削除します。
## 複数行の先頭や末尾に同じ文字列を入力
複数行をまとめてコメントアウトしたい場合などに便利です。
挿入したい行の先頭に移動し、Ctrl+rでビジュアル短形モードになります。
そこから挿入したい行の最後の行まで移動し、選択されている状態にします。
i でインサートモードに移行して挿入したい文字列入力し、エスケープを押下すると選択された行の先頭に一気に入力されます。

末尾の場合は、挿入したい行の末尾に移動し、A を押してインサートモードに移行し入力します。
## 検索
#### /
後方検索
#### ?
前方検索
#### *
文字列上で * を押下すると、カーソル位置の文字列を検索します。
検索中は、n で次の候補、N で前の候補に移動します。
## 正規表現を用いた置換
#### :s/置換したい文字列/置換後の文字列
最初に見つかった文字列を置換します。
#### :s/置換したい文字列/置換後の文字列/g
カーソルがある行の文字列すべてを置換します。
#### :%s/置換したい文字列/置換後の文字列
すべての行を対象とします。
## カーソル下のファイル名を開く
#### gf
例えば、「hoge.txt」という文字列にカーソルを合わせて、「gf」とすると、
hoge.txtを編集できます。
## 小文字、大文字の切り替え
#### ~
カーソル下の小文字、大文字を切り替えます。
#### g~[motion]
ある範囲の文字を一気に切り替えることができます。
例えば、「g~w」で1単語、「g~$」で行末まで、「g~~」で現在の行すべて。
## 最後に実行したコマンドをもう一度実行する
#### @:
# さいごに
今回記載したコマンドのほかにも、便利なコマンドがたくさんあります。
今後、便利コマンドを発見したら追加していきたいと思います。
【iOS】PUSH通知iOS8対応 〜デバイストークンの取得方法〜

iO8でPUSH通知の実装に変更があったので、まずはデバイストークンの取得方法をメモ。

以前はデバイストークンの取得とPUSH許可のアラート表示を一つのメソッドで呼び出す形でしたが、 **iOS8ではそれぞれ別メソッド**になりました。
なお、PUSH許可のアラートは、iOS7の時と同様一度表示されると以後呼び出しても表示されないようです。

**実装例**

```objc
//メソッドの有無でOSを判別
if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerForRemoteNotifications)]) {
    
    //iOS8
    //デバイストークの取得
    [[UIApplication sharedApplication] registerForRemoteNotifications];
    
    //許可アラートの表示
    UIUserNotificationType types = UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
    UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:types categories:nil];
    [[UIApplication sharedApplication] registerUserNotificationSettings:settings];
    
} else {
	
	//iOS7
	UIRemoteNotificationType types =UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert| UIRemoteNotificationTypeSound;
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes:types];
}
```

デバイストークン取得に成功した際は、以前と同様UIApplicationクラスのregisterForRemoteNotificationTypes:メソッドが呼ばれるので、その中でサーバ側（プロバイダ）にデバイストークンを渡す処理をします。

なお、当たり前かもですが**デバイストークンはOSアップデート時やバックアップから復元（機種変更とか）時に変更されることがある**ので、デバイストークンの取得・サーバ側へ送信は、アプリ起動時など任意の場所で定期的に呼ぶようにしておいた方が良いです。

もしアプリ初回起動時など一度だけにしてしまってる場合は、修正してアップデートしないとPUSH通知が届かなくなる場合がでてくるのでご注意。
Ubuntu 14.04 に Node.jsをインストールする

CentOSと同じく、Ubuntuでのインストールメモ。

# 標準リポジトリから

標準パッケージとして提供されているが、普通にインストールすると、nodejs というコマンド名になってしまい困ったことになる。

```shell-session
$ sudo apt-get update
$ sudo apt-get install nodejs npm
$ node
node : command not found 
```

ということで、update-alternatives で nodeというコマンド名にする。ln でやるのは、お行儀が悪いっぽいですね。

```shell-session
$ sudo update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10
$ node -v
v0.10.25
```

すこし（マイナー）バージョンが古い感じがします。

# PPA リポジトリから
PPA (personal package archives) の略。有志が最新版を入れてくれている。

```shell-session
$ sudo add-apt-repository ppa:chris-lea/node.js 
$ sudo apt-get update
$ sudo apt-get install nodejs npm
$ node -v
v0.10.32
```

新しもの好きな人は、こちらのほうが良いかも。
[PHP] タイプヒンティング

##なにか？
関数の引数の型を明示する

##なぜ使う？
型が明示されてるので、変数がイメージしやすくなる。
結果、内部処理が読みやすくなる。
エラーを早めにキャッチできる

##サンプルコード
```php:TypeHinting.php
<?php

$data   = array();
$data[] = 'hoge';
$data[] = 'foo';

// この間５０行くらい

// あ、$dataは配列なのか、と想定してコード読める
function typeHinting(array $data)
{
   ......
}

```
##more
まだありがたみはわからないが、
継承元の関数の引数が明示されていたりするとわかりやすくなるのかも。
Clojure で Java クラスの継承 などしてみる

clojure で Java のクラスを継承してちょっと試しているのだけれどもいろいろとハマっているのでメモ。  

たくさんアドバイスをくださる @tnoda_ さんに感謝。

※未完成。
随時追記・修正。
※ちなみにScala版はこちら（ちゃんと動く）
https://github.com/FScoward/scraping

※元ネタ
https://code.google.com/p/crawler4j/

1. gen-class で生成されるクラスのクラス名は :name で指定した fully qualified class nameである。  

1. gen-class で指定したクラスは gen-class のある ns がコンパイルされないと生成されない。なので、AOT compile されるように project.clj で :aot [scraping-clj.crawler] する必要がある。  

1. crawler.clj: Java は多重継承を許していないので、`:extend [foo.bar.Baz]` ではなく `:extend foo.bar.Baz` とする。  

1. static でないメソッドをオーバーライドした関数のパラメータには this が含まれるべき。

https://github.com/FScoward/scraping-clj

```clj:crawler.clj

(ns scraping-clj.crawler
  (:import [java.io PrintWriter File]
           [edu.uci.ics.crawler4j.crawler Page WebCrawler]
           [edu.uci.ics.crawler4j.url WebURL]
           [org.jsoup Jsoup])
  (:gen-class
   :name scraping-clj.crawler.Crawler
   :main false
   :extends edu.uci.ics.crawler4j.crawler.WebCrawler
   ))

(defn -shouldVisit [this ^WebURL url]
  (def href (-> url .getURL .toLowerCase))
  (and (.startsWith href "http://ameblo.jp/takagakiayahi-blog/entry") (.endsWith href ".html")))

(defn -visit [this page]
  (println "ぱろぱろー2")
  (def url (-> page .getWebURL .getURL))
  (println url))

```

```clj:project.clj

(defproject scraping-clj "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "Eclipse Public License"
            :url "http://www.eclipse.org/legal/epl-v10.html"}
  :dependencies [[org.clojure/clojure "1.6.0"]
                 [edu.uci.ics/crawler4j "3.5"]
                 [org.jsoup/jsoup "1.7.2"]]
  :aot [scraping-clj.crawler]
  :main scraping-clj.core)

```

```clj:core.clj

(ns scraping-clj.core
  (:import (edu.uci.ics.crawler4j.crawler CrawlController CrawlConfig)
           (edu.uci.ics.crawler4j.fetcher PageFetcher)
           (edu.uci.ics.crawler4j.robotstxt RobotstxtServer RobotstxtConfig)
           (scraping-clj.crawler Crawler)))

(def crawlStorage "scrape")

(def config (new CrawlConfig))

(defn -main []
  (.setCrawlStorageFolder config crawlStorage)
  (.setPolitenessDelay config 1000)
  (def pageFetcher (new PageFetcher config))
  (def robotstxtConfig (new RobotstxtConfig))
  (def robotstxtServer (new RobotstxtServer robotstxtConfig pageFetcher))
  (def controller (new CrawlController config pageFetcher robotstxtServer))
  (.addSeed controller "http://ameblo.jp/takagakiayahi-blog/")
  (.start controller Crawler 1))

```
【Android】特定のDatabaseファイルを簡単に削除する

AndroidでSQLiteを使っている場合、時々テーブルの削除(Drop Table)ではなく、Databasesファイル自体を削除したい時がある。
そういった場合**[android.content.Context](http://developer.android.com/reference/android/content/Context.html)クラスの[deleteDatabase](http://developer.android.com/reference/android/content/Context.html#deleteDatabase%28java.lang.String%29)メソッド**を使えば、特定のDatabasesファイルを簡単に削除できます。

## Context#deleteDatabaseメソッド

使い方はとても簡単。

```java
// context=Context helper=SQLiteOpenHelper
context.deleteDatabase(helper.getDatabaseName());
```

引数に削除したいDatabasesファイルのファイル名を渡すだけで削除できます。
※戻り値がbooleanなので、適切に処理する場合は戻り値を確認する
※Databaseファイルをアプリケーションディレクトリの/databasesディレクトリ以外に作成している場合は例外

しかし、このメソッドでは**Databaseファイルのjournalファイルが削除対象に含まれていない**という問題があります。
※Databasesファイルに関連する全ファイルが削除できていないことを問題視してます

実際にソースを確認してみると、以下のようにjournalファイルは削除対象に含まれていません。
※Android 4.0.4のContextImplクラスの実装
http://tools.oesf.biz/android-4.0.4_r1.0/xref/frameworks/base/core/java/android/app/ContextImpl.java#775

```java
@Override
public boolean deleteDatabase(String name) {
    try {
        File f = validateFilePath(name, false); // DatabaseファイルのObjectを生成
        return f.delete();
    } catch (Exception e) {
    }
    return false;
}
```
そこで、この問題を解決するためのメソッドが次に説明するものです。

## SQLiteDatabase#deleteDatabaseメソッド

API Level 16(Android 4.1-Jelly Bean)から**[android.database.sqlite.SQLiteDatabase](http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html)クラスの[deleteDatabase](http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#deleteDatabase(java.io.File))メソッド**が追加されています。
このメソッドは、上記のContext#deleteDatabaseメソッドと同様に指定したDatabasesファイルを削除するメソッドです。
※ちなみに、こちらはstaticメソッドです

Context#deleteDatabaseメソッドと違う点は、以下のようなことです。

* journalファイルも削除対象に含まれている
* WAL(Write Ahead Logging)関連のファイル(-shm,-wal)も削除対象に含まれている
* アプリケーションディレクトリのdatabases配下以外に作成したDatabasesファイルも削除できる(引数がFileオブジェクトのため)

使い方はとても簡単です。

```java
// context=Context helper=SQLiteOpenHelper
SQLiteDatabase.deleteDatabase(context.getDatabasePath(helper.getDatabaseName()));
```

/databases配下にあるDatabasesファイルを削除したい場合、引数にFileオブジェクトを渡さないといけないので
ContextクラスのgetDatabasePathメソッドで削除したいDatabasesファイルのFileオブジェクトを生成して渡します。

ちなみに、API Level 16以降はContext#getDatabasePathメソッドも内部的にSQLiteDatabase#deleteDatabaseメソッドを使用しています。
※Android 4.1.1のContextImplクラスの実装
http://tools.oesf.biz/android-4.1.1_r1.0/xref/frameworks/base/core/java/android/app/ContextImpl.java#809

```java
@Override
public boolean deleteDatabase(String name) {
    try {
        File f = validateFilePath(name, false);
        return SQLiteDatabase.deleteDatabase(f);
    } catch (Exception e) {
    }
    return false;
}
```

なので、API Level 16以降はContext#deleteDatabaseメソッドを使った場合、SQLiteDatabase#deleteDatabaseメソッドを使用したのと同じことになります。
**ナイスな実装になってますね！**

## まとめ
あーAPI Level 16からのメソッドかー。
という落ち込み具合がやばいですが、このメソッド別にAPI Level 16に依存したメソッド等を使用してないので、実はSDKの実装をコピペできます。
なぜAPI Level 1 からないんだよーと言いたくなるメソッドなので、API Level 16以下でこのメソッドが欲しくなったらSDKの実装をコピペしてください！
※よくない方法ですが、まあ仕方ない…

余談ですが、今回紹介したメソッドの実装を見ているとdatabases配下に作成したDatabasesファイルを全て作成する！みたいな実装も簡単にできることがわかります。
コードリーティングは大事です！
Sequel ProでSQLをフォーマットするのにsqlformat.orgのAPIを利用する


いつの間にかデフォルトで入ってた「Format SQL」が使えなくなったので。

OS X上でPHPを使ってリクエストを投げます。

（Sequel Proのバンドルエディタの使い方は省略）


```php
#!/usr/bin/php
<?php
$sql = file_get_contents('php://stdin');

$url = 'http://sqlformat.org/api/v1/format';

$query = [
    'sql' => $sql,
    'reindent' => 1,
    'keyword_case' => 'upper'
];

$queryStr = http_build_query($query);

$headers = [
    "Content-Type: application/x-www-form-urlencoded",
    "Content-Length: " . strlen($queryStr)
];
    
$options = [
    'http' => [
        'method' => 'POST',
        'header' => implode("\r\n", $headers),
        'content' => $queryStr
    ]
];

$context = stream_context_create($options);

$contents = file_get_contents($url, false, $context);

$results = json_decode($contents);

echo $results->result;
```
LinuxでレーザープリンタLBP-1210を使う方法


家からWindowsマシンがなくなったためにLinux(Debian Wheezy)にドライバを入れました。
本当はMacから直で使いたかったのですが・・・


##1.ダウンロード
ダウンロードサイト
http://cweb.canon.jp/cgi-bin/download/select-product-by-catg.cgi?i_cd_pr_catg=002


対象機器、対象OS、CPUの種類から選びます。
使用するマシンはLet's Note CF-R6。名機です。
CPUは32ビットなので
linux-capt-rinterdriver32-v260.tar.gz
をダウンロードしました。

##2.解凍
ダウンロードしたファイルを解凍します。

```Bash
tar -zxvf ファイル名
```

Docディレクトリの下にはドキュメントのアーカイバもあるのでこちらも解凍しておくと便利です。

##3.インストール
解凍後にできたファイルからドライバをインストールします。
ドライバは、32-bit_Driverの下にあります。
ファイルはDebianとRedHat系の二つに分かれているので私はDebianの方を使用します。

```Bash
$ cd linux-capt-rinterdriver32-v260
$ cd 32bit-Driver
$ cd Debian
```

ドライバファイルが二種類あるので
次の順にインストールします。

```Bash
$ sudo dpkg -i cndrvcups-common_2.60-1_i386.dev
$ sudo dpkg -i cndrvcups-capt_2.60-1_i386.dev
```

CUPSを再起動します。

```Bash
$ sudo /etc/init.d/cupsys restart
```

or 

```Bash
$ sudo service cups restart
```

インストール後に必ずCUPSを再起動しないと駄目なようです。

##4.プリンタスプーラへのプリンタ登録
プリンタスプーラにプリンタ（PPD）を登録します。

```Bash
$ sudo /usr/sbin/lpadmin -p プリンタ名 -m PPDファイル名 -v ccp://localhost:59687 -E
```

プリンタ名には「LBP-1120」
PPDファイル名は「CNCUPSLBP1210CAPTJ.ppd」を指定しました。

プリンタ名やPPDファイルの詳細はドキュメントに記載されています。

私は、最初ウィンドウマネージャ(WM)をXFCEで作業していましたが、
Keyエラーが出て作業が続行できなかったのでGNOMEClassicにかえて作業を続けました。
WMでキーがらみのエラーが出る人は試してください。

##5.CCPD（デーモン）へのプリンタ登録
CCPDの設定ファイルにプリンタを登録します。

```Bash
$ sudo /usr/sbin/ccpadmin -p [プリンタ名] -o [プリンタデバイスパス]
```

プリンタ名は「LBP-1210」
プリンタデバイスパスは私の環境では「/dev/usb/lp0」でした。


##6.CCPDの自動起動
CCPDを自動起動するようにします。
/etc/rc.local に次の１行を追加します。

/etc/init.d/ccpd start


これでテストページの印刷ができるようになりました。
以上です。


##(おまけ).Macにはドライバが提供されていないという事実
MacOSの10.8以降は提供されていないようです。
Macで印刷する必要があるのですが、
取りあえずはプリンタサーバーを作ることから始めてみます。
おかげで勉強にはなりますが・・・
iOS8からカメラとかフォトライブラリ取得で失敗するようになったら。

それは、
プライバシー設定とかのアクセス権が設定されていない可能性があります。
（自分はそうでした、iOS6から入ってたけど億劫しちゃダメだね・・・

もしも、アクセス権の設定の場合、
こんな感じのコードで、使えるようになるかと思います。


```lang:Objective-C
ALAuthorizationStatus stat = [ALAssetsLibrary authorizationStatus];
switch (stat)
{
   //  利用可能
   case ALAuthorizationStatusAuthorized:       //  アクセスが許可
   case ALAuthorizationStatusNotDetermined:    //  写真へのアクセスを許可するか未選択
   {
      // イメージピッカー起動
      [self setImagePicker];
      break;
   }
   //  利用制限
   case ALAuthorizationStatusRestricted:
   {
      //  設定＞一般＞機能制限　から利用が制限
      UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"SS_ERROR_TITLE", @"Title")
　　　　　　　　　　                                     message:NSLocalizedString(@"SS_ERROR_MESSAGE_RESTRICTED", @"Message")
                                                      delegate:nil
                                             cancelButtonTitle:@"OK"
                                             otherButtonTitles:nil] autorelease];
      [alert show];
      break;
   }
   case ALAuthorizationStatusDenied:
   {
      //  設定＞プライバシー＞写真　から利用が制限
      UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@"SS_ERROR_TITLE", @"Title")
                                                       message:NSLocalizedString(@"SS_ERROR_MESSAGE_DENIED", @"Message")
                                                      delegate:nil
                                             cancelButtonTitle:@"OK"
                                             otherButtonTitles:nil] autorelease];
      [alert show];
      break;
   }
                        
   default:
   break;
}
```
PHPのエラーを補足して例外に変換する


## はじめに

PHPのエラーを補足して例外に変換する方法を記述します。

## 環境

* CentOS 6.5
* PHP 5.3.3

## PHPのエラーを例外に変換する


### エラーハンドラを利用しない場合

```shell
$ php -r 'fopen("/var/log/messages", "r");'
PHP Warning:  fopen(/var/log/messages): failed to open stream: Permission denied in Command line code on line 1
```

### エラーハンドラでエラーを例外に変換する

```php:sample_error_handler.php
<?php

// エラーハンドラを登録する
set_error_handler(
  function ($errno, $errstr, $errfile, $errline) {
    // エラーが発生した場合、ErrorExceptionを発生させる
    throw new ErrorException(
      $errstr, 0, $errno, $errfile, $errline
    );
  }
);

function main($filename) {
  try {
    // execute関数の呼び出し
    execute($filename);
  } catch (Exception $e) {
    // エラーの原因を出力
    $previous = $e->getPrevious();
    printf("%s %s(%d)\n", $e->getMessage(), $e->getFile(), $e->getLine());
    printf("# %s %s(%d)\n", $previous->getMessage(), $previous->getFile(), $previous->getLine());
  }
}

function execute($filename) {
  $handle = null;
  try {
    $handle = fopen($filename, "r");
    while (! feof($handle) ) {
      $line = fgets($handle);
      echo "$line";
    }
  } catch (ErrorException $e) {
    if ( ! is_null($handle) ) {
      fclose($handle);
    }
    // ErrorExceptionを補足して、新たにExceptionをスローする
    throw new Exception("failed to open file filename:[$filename]", $e->getCode(), $e);
  }
}

コマンドライン引数をmain関数の引数として呼び出し
main($argv[1]);

?>
```

* 動作確認

エラーなしの場合

```shell
$ php sample_error_handler.php /etc/hosts
127.0.0.1               localhost.localdomain localhost
::1             localhost6.localdomain6 localhost6
```

エラーが発生する場合


```shell
$ php sample_error_handler.php /var/log/messages
failed to open file filename:[/var/log/messages] /path/to/sample_error_handler.php(33)
# fopen(/var/log/messages): failed to open stream: Permission denied /path/to/sample_error_handler.php(24)
```

## 参考

* [set_error_handler](http://php.net/manual/ja/function.set-error-handler.php)
* [Exception](http://php.net/manual/ja/class.exception.php)
* [ErrorException](http://php.net/manual/ja/class.errorexception.php)
interfaceをatomicにswapする

# 背景

* とある機能の実装で特定条件でstructが持っているinterfaceを別の実装に変えたい、というのがあった
* その条件が稀にしかないのでそのために他のfunctionで毎回Lock, Unlockして操作を間違いなくするのはちょっとイヤンな感じだった
* atomic.SwapPointerなら一回の操作で変更できるからLock, Unlockを省ける。だけどinterfaceを対象にするとどう書けばよいかよくわからん

## なぜinterfaceに対してのatomic.SwapPointerが出来ないのか

* interfaceはwordより大きいのでatomic.SwapPointerでは変更出来ない。interfaceのpointerに対してatomic.SwapPointerを使わなければならない

## 実装

```go
package main

import (
	"fmt"
	"unsafe"
	"sync/atomic"
)

type Quacker interface {
	Quack()
}

type TinyDuck struct {
	Name string
}

func (t *TinyDuck) Quack() {
	fmt.Printf(">>> quack quack, my name is %s\n", t.Name)
}

type MiddleDuck struct {
	Name string
}

func (m *MiddleDuck) Quack() {
	fmt.Printf(">>> QUACK AUACK, my name is %s\n", m.Name)
}

type Toy struct {
	c *Quacker
}

func (r *Toy) SayQuack() {
	(*r.c).Quack()
}

var (
	t_duck = &TinyDuck{
		Name: "Joe",
	}
	t_duck2 = &TinyDuck{
		Name: "Joel",
	}
	m_duck = &MiddleDuck{
		Name: "Joseph",
	}
)


func main() {
	var a Quacker
	a = t_duck

	var b Quacker
	b = t_duck2
	r := Toy {
		c: &a,
	}
	r.SayQuack()

	atomic.SwapPointer((*unsafe.Pointer)((unsafe.Pointer)(&r.c)), unsafe.Pointer(&b))
	r.SayQuack()
}
```

http://play.golang.org/p/7Q5B7jE-uz

こうすることでatomic.SwapPointerで一回の操作で変更できるので多少Lock周りの気を使わないで済むと思う。

## その他

* こういうやり方は関数のコールの仕方が回りくどくなるし、unsafe使って間違えたりするとよくわからないバグを生むので必要がなければduck typingを避け他の方法で代替した方が確実、とのこと。ごもっとも。方法としてこういうのあるくらいで覚えておくといいのかもしれない。
* できればvar b Quackerとか宣言しないでさくっといれたいんだけどなにか方法はないのか
【初心者向け】EL式

EL式についてまとめます。

### EL式とは
Expression Languageの略。
JSPをより簡単に書くためにJSP2.0より導入されており、JSP上で使用する。
クライアントへの出力に使用する。

### 基本的な使い方
```
${式}
```
と書くことで、式の部分が出力されます。

たとえば

```lang:jsp
${10*2}
```
とすると、

```lang:ブラウザ
20
```
と表示されます。

### スコープに保存されているオブジェクト
を参照することもできます。
登録したときの名前(プロパティ名)で表示することができます。

たとえばServletなどで

```lang:servlet
request.setAttribute("age", "25");
```

という処理を行っていた場合、JSP上で

```lang:jsp
${age}
```

とすることで

```lang:ブラウザ
25
```

と表示されます。
これは

```lang:jsp
<%=request.setAttribute("age", "25")%>
```

とするのと同じです。

また、スコープに登録したオブジェクトのフィールドを参照することもできます。
Studentクラスにnameというフィールドがあります。
"student" という名前でStudentクラスのオブジェクトを登録します。

```lang:servlet
request.setAttribute("student", student);
```

この場合、

```lang:jsp
${requestScope.student.name}
```

とすることで、登録したStudentオブジェクトのnameフィールドに格納されている値を表示することができます。
このとき "requestScope." の部分は省略することができます。
また、Studentクラスにnameフィールドのセッター、ゲッターが必要になります。


### 暗黙的オブジェクト

```lang:jsp
${param.name}
```

の **param** は暗黙的オブジェクトです。
自分でオブジェクトを生成しなくとも使うことができます。
ほかにも"requestScope" , "header" , "cookie" などの暗黙的オブジェクトもあります。


新人のときによくわかっていなかったのですが、最近復習して理解できてきました。
ブラウザーを閉じて開き直すAppleScript


ちょっとブラウザーを一旦落としてもう一度開き直す、っていう作業を繰り返す必要があったので書いた。

```reraise.script
tell application "Google Chrome"
  quit
end tell

delay 0.5

tell application "Google Chrome"
  activate
  open location "http://example.com"
end tell
```

`osascript reraise.script`
ftlにおける値を取得時のjsとjavaの使い分け

ftlにおいて、値の取得方法の使い分けで混乱したので書き留める。
使い分けで迷ったのはjavaとjsの二通り。

次の方法で使い分ける。

【java】
①全ユーザーで同じデータの場合。
②ページ読み込み時に取得する場合。

【js】
①ユーザごとに違うデータの場合。
②クリックなどのイベントが起きた場合。
(ページ読み込み時にいちいちajaxを叩くとスピードが落ちる。)
③全ユーザで同じデータでも変数が多くなる場合はjsを用いる場合もある。
(javaで保持する変数が多くなるとわかりづらい)
Elixir Modules

# Elixir Modules

## 概要
Elixir の Modules について

## Module の定義
defmodule で Module を定義します。

### サンプルコード
~~~
defmodule Hoge do
  def hoge(msg) do
    msg
  end
end

IO.puts Hoge.hoge("hoge")
~~~

### 出力

~~~bash
$ elixir modules.exs
hoge
~~~

## 名前付き関数の定義
def で 名前付き関数 を定義します。

### サンプルコード
~~~
defmodule Hoge do
  def hoge(msg) do
    msg
  end
end

IO.puts Hoge.hoge("hoge")
~~~

### 出力

~~~bash
$ elixir modules.exs
hoge
~~~

## private な名前付き関数

defp で private な関数を作成します

### サンプルコード
~~~
defmodule Hoge do
  def hoge(msg) do
    show_message(msg)
  end

  defp show_message(msg) do
    msg
  end
end

IO.puts Hoge.hoge("hoge")
~~~

## 関数定義の複数句、ガード句
Elixir では multiple clauses / guards を利用可能です。

### サンプルコード
~~~
defmodule Num do
  def print_year_or_aha(x) do
    IO.puts yeah?(x)
  end

  defp yeah?(true) do
    "year!"
  end

  defp yeah?(x) when is_boolean(x) do
    "aha"
  end
end

Num.print_year_or_aha(true)
Num.print_year_or_aha(false)
Num.print_year_or_aha("not boolean")
~~~

### 出力

~~~bash
$ elixir modules_multiple_guards.exs
year!
aha
** (FunctionClauseError) no function clause matching in Num.yeah?/1
    /home/vagrant/samples/8/modules_multiple_guards.exs:6: Num.yeah?("not boolean")
    /home/vagrant/samples/8/modules_multiple_guards.exs:3: Num.print_year_or_aha/1
    src/elixir_compiler.erl:66: :elixir_compiler."-eval_forms/4-fun-0-"/7
    src/elixir_compiler.erl:65: :elixir_compiler.eval_forms/4
    src/elixir_compiler.erl:33: :elixir_compiler.quoted/2
    /builddir/build/BUILD/elixir-0.8.3/lib/elixir/lib/code.ex:240: Code.require_file/2
    /builddir/build/BUILD/elixir-0.8.3/lib/elixir/lib/kernel/cli.ex:282: Kernel.CLI.process_command/2
    /builddir/build/BUILD/elixir-0.8.3/lib/elixir/lib/enum.ex:636: Enum."-map/2-lc$^0/1-0-"/2
~~~

## 関数のキャプチャ

`&モジュール.関数/引数` の書式で関数のキャプチャが可能。

~~~
iex> String.downcase("HoGe")
"hoge"
iex> dm = &String.downcase/1
iex> dm.("HoGe")
"hoge"
~~~

## 参照
http://elixir-lang.org/getting_started/8.html
Macでrubyを使うために

## RVM(Ruby Version Manager)をインストールしてみる。

```shell-session
$ curl -sSL https://get.rvm.io | bash -s stable

Downloading https://github.com/wayneeseguin/rvm/archive/stable.tar.gz

Installing RVM to /Users/xxxxxxx/.rvm/
    Adding rvm PATH line to /Users/xxxxxxx/.profile /Users/xxxxxxx/.bashrc /Users/xxxxxxx/.zshrc.
    Adding rvm loading line to /Users/xxxxxxx/.bash_profile /Users/xxxxxxx/.zlogin.
Installation of RVM in /Users/xxxxxxx/.rvm/ is almost complete:

  * To start using RVM you need to run `source /Users/xxxxxxx/.rvm/scripts/rvm`
    in all your open shell windows, in rare cases you need to reopen all shell windows.

# XXXXX ,
#
#   Thank you for using RVM!
#   We sincerely hope that RVM helps to make your life easier and more enjoyable!!!
#
# ~Wayne, Michal & team.

In case of problems: http://rvm.io/help and https://twitter.com/rvm_io

  * WARNING: You have '~/.profile' file, you might want to load it,
    to do that add the following line to '/Users/xxxxxxx/.bash_profile':

      source ~/.profile

```


## RVMのインストール後、警告が出たので
警告の内容としては、（分からないなりに意訳すると）

```
~/.profileファイルを持っているけど、それってロードしたいかもしれないんだよね。なので、'/Users/xxxxxxx/.bash_profile'へ、次の行を追記しておいてね。

    source ~/.profile
```

ということで言われるがまま、.bash_profileへ追記した。追記したので、.bash_profileを再ロードしておく。

```shell-session
$ source ~/.bash_profile
```

## いよいよRubyのインストール
### インストールできるRubyの一覧を確認してみる。

```shell-session
$ rvm list known

# MRI Rubies
[ruby-]1.8.6[-p420]
[ruby-]1.8.7[-head] # security released on head
[ruby-]1.9.1[-p431]
[ruby-]1.9.2[-p330]
[ruby-]1.9.3[-p547]
[ruby-]2.0.0-p481
[ruby-]2.0.0[-p576]
[ruby-]2.1.2
[ruby-]2.1[.3]
[ruby-]2.1-head
ruby-head

・・・
```

この時点で、一番新しいのは **2.1** だったので、それをインストールしてみる。

### Rubyのインストール

```shell-session
$ rvm install 2.1
```

### 新しくインストールしたRubyを使う

```shell-session
$ rvm use 2.1
```

### 動作状況を確認する。

```shell-session
$ ruby -v

ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-darwin13.0]

$ which ruby

/Users/xxxxxxx/.rvm/rubies/ruby-2.1.3/bin/ruby
```

なお、[ここの記事](http://rvm.io/rvm/install)を参考にしました。
Vyatta CoreをShellshock(CVE-2014-6271)対応させる？


# ピンチ！
Vyatta Coreがフィニってしまった今、Shellshockに対応できない？？？
とりあえず、やり方あっているかわかりませんが、緊急対応！
※Vyatta Coreのバージョンによっては動かないかもしれません。

```shell-session:使用前
vyatta:~$ env x='() { :;}; echo Vulnerable' bash -c "echo this is a test"
Vulnerable
this is a test
```

* コマンズ

```shell-session:流すやつのみ記載
sudo dpkg-divert --remove /bin/sh
sudo dpkg-divert --remove /usr/share/man/man1/sh.1.gz
sudo dpkg-divert --package dash --divert /bin/sh.distrib --add /bin/sh
sudo dpkg-divert --package dash --divert /usr/share/man/man1/sh.distrib.1.gz  --add /usr/share/man/man1/sh.1.gz

configure
set system package repository squeeze components 'main'
set system package repository squeeze distribution 'squeeze'
set system package repository squeeze url 'http://ftp.jp.debian.org/debian/'
set system package repository squeezeupdates components 'main'
set system package repository squeezeupdates distribution 'squeeze/updates'
set system package repository squeezeupdates url 'http://security.debian.org/'
set system package repository squeeze-updates components 'main'
set system package repository squeeze-updates distribution 'squeeze-updates'
set system package repository squeeze-updates url 'http://ftp.us.debian.org/debian/'
set system package repository squeeze-lts url http://ftp.jp.debian.org/debian/
set system package repository squeeze-lts distribution squeeze-lts
set system package repository squeeze-lts components 'main contrib non-free'
commit
save
exit
sudo aptitude update
sudo aptitude install bash
```

* 結果発表

```shell-session:使用後
$ env x='() { :;}; echo Vulnerable' bash -c "echo this is a test"
this is a test
```

とりあえずまともに動いていそうなので、これで様子見！
※ VyOSの場合は、1.0.5とかにUpdateしましょう。
※ vbashはupdateされませんw
Rails4でルーティングを分割する

# 概要

Rails4でAPIとWebなどでルーティングを分割したいときの方法。
いろいろ調べてもうまく行かなかったので[ソース](http://edgeapi.rubyonrails.org/classes/Rails/Paths/Path.html#method-i-concat)をあさってみた。

# 方法

## 1. routingファイルを置く

特に指定はありませんが、`config/routes`というディレクトリを作るとわかりやすいでしょう。

```
config/routes/admin.rb
config/routes/api/v1.rb
config/routes/api/v2.rb
...
```

```config/routes/admin.rb

Rails.application.routes.draw do

  # こんな感じでここに設定を書く
  scope module: 'admin' do

    get 'welcome/index'
    ...

  end

end

```

## 2. 設定ファイルを変更する

```rb:config/application.rb

module YourApplication
  class Application < Rails::Application

    config.paths["config/routes.rb"].concat Dir[Rails.root.join("config/routes/**/*.rb")]
    # << とか += ではうまくいかない。。

  end
end
```

# まとめ

**うまくいったら「ストック」してね**

# 参考

- http://edgeapi.rubyonrails.org/classes/Rails/Paths/Path.html#method-i-concat
- http://qiita.com/yoppi/items/ccdef44dd9196081e430
- http://techracho.bpsinc.jp/hachi8833/2014_02_17/15665
- http://walf443.hatenablog.com/entry/2014/08/15/073708
5分でできる razrbit SDK + Node.js でビットコイン・プログラミング

以下に移行しました<br><a href="http://block-chain.jp/tech/razrbit-sdk-node-js-bitcoin-programming-5-minutes/" title="5分でできる razrbit SDK + Node.js でビットコイン・プログラミング">5分でできる razrbit SDK + Node.js でビットコイン・プログラミング</a>
Laravel を使ってみる


- Mac OSX 10.11.3
- PHP 5.5.20
- Laravel 5.1

### Laravel Installer をインストール

```bash
$ composer global require "laravel/installer=~1.1"
```

```laravel``` コマンドへのパスを通すため、.zshenv に以下を追加。

```
export PATH=$HOME/.composer/vendor/bin:$PATH
```

### Laravel プロジェクトを作成

```bash
$ laravel new <project_name>
```

パーミッション変更。

```bash
$ cd <project_dir>
$ chmod -R 777 storage bootstrap/cache
```



MacOS Mervericksの場合以下も実施。

```bash
$ xcode-select --install
$ php -v
$ brew search mcrypt
$ brew install php54-mcrypt
```

### Laravelプロジェクト作成

```bash
$ composer create-project laravel/laravel blog --prefer-dist
$ chmod -R 777 blog/app/storage/
```

### ドキュメントルートを変更
ドキュメントルートを ` $(project_root)/public ` に変更

### app/config/app.php を設定

```PHP
'url' => 'http://localhost', （公開時に変更必要？）
'timezone' => 'Asia/Tokyo',
'locale' => 'ja', （プロジェクトを日本語化する場合に必要？）
```

鍵の設定

```
$ cd $(project_root)
$ php artisan key:generate
```

### MySQLを使用できるようにする
#### DB作成
```MySQL
mysql> create database blog character set utf8;
```
#### ユーザを確認
```MySQL
mysql> select Host, User from mysql.user;
```
#### ユーザを削除
```MySQL
mysql> drop user 'blog'@'%', 'blog'@'localhost';
```
#### ユーザを作成
```MySQL
mysql> grant all privileges on blog.* to blog@localhost identified by 'blog';
mysql> flush privileges;
```
#### app/config/database.phpを設定
```PHP
'connections' => array(

'mysql' => array(
'driver' => 'mysql',
'host' => 'localhost', （ここ）
'database' => 'forge', （ここ）
'username' => 'forge', （ここ）
'password' => '', （ここ）
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '', （必要なら）
),
```
#### マイグレーション
```
$ php artisan migrate:make CreateUserTable
```

## 参考

- [Laravel 5.1 インストール](http://readouble.com/laravel/5/1/ja/installation.html)
php で実行できるけど require できないコード

```php:sample
#!/usr/bin/env php
<?php
namespace Ore;
echo "this is sample\n";
```

```console
$ chmod +x sample
$ ./sample
this is sample

$ php sample
this is sample

$ php -d include_path='.' -r 'require "sample";'
Fatal error: Namespace declaration statement has to be the very first statement in the script in /path/to/sample on line 3
```

PHP のシェバングは php コマンドから直接実行されたときだけ無視されて `require` や `include` で読んだときにはそのまま残ります。

シェバングのある PHP スクリプトを `require` や `include` しても普通は `#!/usr/bin/env php` などという文字が無駄に出力されるだけですが、↑のコードのようにネームスペースがあると Fatal エラーになります。

`#!/usr/bin/env php` の部分がネームスペース宣言より前にあるためです。

[PHP: 名前空間の定義 - Manual](http://php.net/manual/ja/language.namespaces.definition.php "PHP: 名前空間の定義 - Manual")

> 名前空間を宣言するには、キーワード namespace を使用します。
> 名前空間を含むファイルでは、他のコードより前にファイルの先頭で名前空間を宣言しなければなりません。 ただし declare キーワードは例外です。 

`#!/usr/bin/env php` も立派な PHP のコードなのでエラーになります。

いわゆる実行可能な php のコードはシェバングを記述するファイルと実際の処理を記述するファイルを分けておいたほうがいいかもしれません。

```php:sample
#!/usr/bin/env php
<?php
require __FILE__ . '.php';
```

```php:sample.php
<?php
namespace Ore;
echo "this is sample\n";
```

```console
$ ./sample
this is sample

$ php sample
this is sample

$ php -d include_path='.' -r 'require "sample.php";'
this is sample
```
【Vim × tmux】Pane（tmux） - Window（Vim）の移動をシームレスに

<kbd>C-h</kbd> が殺されるのがつらすぎてこの設定はつかわなくなった
現在の設定 :point_right: https://qiita.com/izumin5210/items/d2e352de1e541ff97079

---


# Vim × tmuxの画面移動

tmuxでpane分割してVimを開いて作業しているとき，Vim内でもウィンドウ分割をすると画面内の移動が大変ややこしいことになる．

![vim-tmux.png](https://qiita-image-store.s3.amazonaws.com/0/14845/593affc8-5bf4-0cd1-7124-3246142be1f3.png "vim-tmux.png")

面倒なのでVimとかtmuxとか気にせずに **同じキーバインドで** 画面の移動をしたい．

# Vim Tmux Navigator

[**Vim Tmux Navigator**](https://github.com/christoomey/vim-tmux-navigator)を使うと捗る．
Vim・tmuxを気にせず以下の様なキーバインドで画面を移動できる．

* `C-h`: 左に移動
* `C-j`: 下に移動
* `C-k`: 上に移動
* `C-l`: 右に移動


## 導入

### Vim側

[NeoBundle](https://github.com/Shougo/neobundle.vim)だとこんな感じ．

```vim:.vimrc
NeoBundle 'christoomey/vim-tmux-navigator'
```

### tmux側

`.tmux.conf`に以下を追記する．快適！٩(๑❛ᴗ❛๑)۶

```sh:.tmux.conf
# Smart pane switching with awareness of vim splits
bind -n C-h run "(tmux display-message -p '#{pane_current_command}' | grep -iqE '(^|\/)g?(view|n?vim?)(diff)?$' && tmux send-keys C-h) || tmux select-pane -L"
bind -n C-j run "(tmux display-message -p '#{pane_current_command}' | grep -iqE '(^|\/)g?(view|n?vim?)(diff)?$' && tmux send-keys C-j) || tmux select-pane -D"
bind -n C-k run "(tmux display-message -p '#{pane_current_command}' | grep -iqE '(^|\/)g?(view|n?vim?)(diff)?$' && tmux send-keys C-k) || tmux select-pane -U"
bind -n C-l run "(tmux display-message -p '#{pane_current_command}' | grep -iqE '(^|\/)g?(view|n?vim?)(diff)?$' && tmux send-keys C-l) || tmux select-pane -R"
bind -n C-\ run "(tmux display-message -p '#{pane_current_command}' | grep -iqE '(^|\/)g?(view|n?vim?)(diff)?$' && tmux send-keys 'C-\\') || tmux select-pane -l"
```

## 設定

[公式のrepository](https://github.com/christoomey/vim-tmux-navigator)を参照．
キーバインドを変更したり色々できる．

# 参考文献

* [christoomey/vim-tmux-navigator](https://github.com/christoomey/vim-tmux-navigator)
templateでフィボナッチ数とFizzBazz

# templateでフィボナッチ数とFizzBazz

※たいした内容じゃないです。

templateの基礎。
リハビリ兼ねて書いてみた。

この例だと全然恩恵に与ってないけど、
メタな人には_auto_と_constexpr_かなり便利っぽいなぁ。

_c++11_でコンパイルしてくだしあ。
`g++ -std=c++11 hoge.cpp`

template再帰は展開されると全部別の関数/クラスになるので、
値はコンパイル時に計算。

boost::mplが変態すぎて心が折れた。

## フィボナッチ数

定義通り。

```cpp
#include <iostream>

template<int N>
struct Fib {
    enum { val = Fib<N-1>::val + Fib<N-2>::val };
};

template<>
struct Fib<1> {
    enum { val = 1 };
};

template<>
struct Fib<2> {
    enum { val = 1 };
};

int main() {
    std::cout << Fib<20>::val << std::endl;
}
```

## FizzBazz

なんかあんまりかっこよくないなぁ。

```cpp
#include <iostream>

template<int N, bool fizz, bool bazz>
struct FzBz {
    static constexpr const char* str = "";
};

template<int N>
struct FzBz<N, true, false> {
    static constexpr const char* str = "Fizz";
};

template<int N>
struct FzBz<N, false, true> {
    static constexpr const char* str = "Bazz";
};

template<int N>
struct FzBz<N, true, true> {
    static constexpr const char* str = "FizzBazz";
};


template<int N>
void fizzbazz() {
    fizzbazz<N-1>();
    std::cout << N << "\t" << FzBz<N, N%3==0, N%5==0>::str << std::endl;
}
template<>
void fizzbazz<0>() {
    // pass
}


int main() {
    fizzbazz<200>();
}
```
Zabbix アプリケーション監視のためのアイテムの違い

#はじめに					
Zabbixにはアプリケーション監視を行うためのアイテムがいくつか用意されていますが、その違いについて纏めてみました。

## ①プロセス監視
・proc.num[\<name>,\<user>,\<state>,\<cmdline>]
　　\<name>に設定した場合は、「ps -e」の結果から存在を検索する事と同等。
　　\<cmd>設定した場合は、「ps -ef」の結果から存在を検索する事と同等。

・service_state[*]
・services[<type>,<state>,<exclude>]
　　Windowsのサービスステータスをチェック。

## ②ポート監視
・net.tcp.listen[port]
・net.udp.listen[port] 
　　「netstat -an」の結果からLISTEN状態であるかどうか評価する事と同等。

・net.tcp.port[\<ip>,port]
　　指定されたポートへTCPレベルでの接続を行う。
　　「telnet localhost 80」と同様。但し、接続できたことだけで判断。
　　尚、ここでのIPの指定は外部へアクセスするわけでは無い。
　　1サーバ内に複数インターフェース(IPアドレス)がある環境でどのインターフェースか指定する場合に使用する。

## ③サービス接続監視
・net.tcp.service[service,\<ip>,\<port>]
　　（service：ssh, ntp, ldap, smtp, ftp, http, pop, nntp, imap, tcp, https, telnet）
・net.tcp.service.perf[service,\<ip>,\<port>]
　　（service：ssh, ntp, ldap, smtp, ftp, http, pop, nntp, imap, tcp, https, telnet）
・net.tcp.dns[\<ip>,zone]
　　⇒v2.2～　net.dns[\<ip>,zone,\<type>,\<timeout>,\<count>]
・net.tcp.dns.query[\<ip>,zone,<type>]
　　⇒v2.2～　net.dns.record[\<ip>,zone,\<type>,\<timeout>,\<count>]

　　それぞれのプロトコルレベルでの通信を行い、正常性を判断する。
　　TCP/IPの階層モデルで言うと、net.tcp.portはトランスポート層（レイヤー4）、
　　net.tcp.service、net.tcp.dnsはアプリケーション層（レイヤー5)でのチェックになる。

## ④Web監視
・Webシナリオ監視
　　”監視サーバから”接続確認を行う。
　　複数ページを横断してアクセスしてチェック出来る。
　　認証が必要なサイトであっても、標準認証、または標準的なPOPによるチェックであれば認証をパスしてチェックが出来る。

・web.page.get[host,\<path>,\<port>] 
・web.page.perf[host,\<path>,\<port>] 
・web.page.regexp[host,\<path>,\<port>,\<regexp>,\<length>,\<output>] 
　　Webサイトへの接続チェックを行う。
　　シナリオ監視は行えないが、エージェントから直接httpサイトへチェックを行うことが出来る。
　　（DMZ内にあるWebサーバのサイトチェックを行う場合、監視サーバ<=>監視対象サーバ間でhttp(s)ポートを開けなくても良い）
vagrant で private networkがエラーになったときの対応


自分でprivate networkのあるboxを作ったときなどにおきるエラーの対策のメモ。

## centos6 の場合

* ifcfg-eth1 を削除

```bash
$ sudo rm /etc/sysconfig/network-scripts/ifcfg-eth1
```

* 70-persistent-net.rules の削除

ifconfig で確認しながら、使わないルールを消してしまう。

```bash
$ sudo vim /etc/udev/rules.d/70-persistent-net.rules
```

* 再起動

```bash
$ vagrant reload
```

参考
http://spring-mt.tumblr.com/post/27897296877/centos6-2-mac
カーネルスレッド判定

systemdには[is_kthread](http://cgit.freedesktop.org/systemd/systemd/tree/src/shared/util.c#n720)という、指定PIDのプロセスがカーネルスレッドかどうか判定する関数がある。その方法は`/proc/PID/cmdline`の中身が空かどうかというもの。

昔、自分で同じ判定をするプログラムを書いたことがある。その時は`/proc/PID/stat`を見て、プロセスグループIDとセッションIDがともに0ならばカーネルスレッドと判定していた。

なにかもっと直接的な方法はないのだろうか。
vimfiler よく使うキー


## デフォルトキー設定のヘルプ
:help vimfiler-default-key-mappings


## よく使うキー


### 通常操作
| キーマップ  | 動作                       |
| :-:         | :--:                       |
| &lt;C-l&gt; | 再描画                     |
| .           | 隠しファイル表示切替       |
| L           | Drive選択                  |
| \\          | ルートディレクトリ         |
| ~           | ホームディレクトリ         |
| &lt;BS&gt;  | 右隣のウィンドウに移動する |
| &amp;       | カレントディレクトリ       |
| M           | uniteモード                |


### セーフティモード解除時の操作
| キーマップ | 動作                   |
| :-:        | :--:                   |
| gs         | セーフティモード切替   |
| K          | 新しいディレクトリ作成 |
| N          | 新しいファイル作成     |
| c          | コピー                 |
| r          | リネーム               |
| d          | 削除                   |
#isucon 2014予選二日目を二位で通過した話

チーム.datの@y_matsuwitterです。
普段はグノシーでiOSエンジニアだったりGoエンジニアだったりインフラエンジニアやってます。
今回全員初めて出場のisuconでは、風邪でふらふらしながら、主にGoの実装周りを担当しました。
ちなみに他のメンバーもec2リブート祭り+shellshockでふらふらしてました。

とりあえず異常がなければ予選二日目を三位で通過しているはずなのですが、受験終了直後の高校生ばりに不安です。
**=> 二位に繰り上がって通過しました**
当日までの準備やインフラでやったことの話については他のメンバーがまとめてくれるかと思うので、僕はGoで当日やったことをゆるくまとめていきます。

## 当日の流れ
### 10:00~12:00
とりあえず競技開始後はインフラセットアップを他のメンバーに任せて僕はひたすらコード読んでました。

10分くらいでデータのライフサイクル的なものを全て確認したのち、

- ユーザーは途中で増えることはないからDBに入れる必要はない
- ログインログのクエリが確実にボトルネック
- 大事なのはログインログそのものより、カウントとIPやユーザーのBan処理

あたりの事実だけ把握して実作業に移りました。

martiniが使われてる、そして割と密にmartiniの機能を使ってるのを確認したので、

1. さっさとmartiniを除去する
2. templateパッケージを除去する

の2点を実行しました。martiniに関してはmiddlewareとして使われているsessionsを外すのが面倒だったのですが、`gorilla/sessions`に切り替え、martiniのsessionsと同じインターフェイスを持つよう少しラッパーを書く、あとは`net/http`パッケージをそのまま使う方向で進めました。今回のシンプルなページのスコアを競う場合はちょっとした計算コストも馬鹿にならないのでmartiniやtemplateパッケージは外すべきだと判断した次第です。
templateの除去には、`index_html.go`みたいなファイルを作ってその中に直接文字列としてhtmlを書き込み、文字列連結する方向で対処しました。
この時点ではそれほどスコアは伸びず。

### 12:00~15:30
martiniなどを除去し終えたその次に、ベンチマーク中CPUを割と食っていた、かつIOで詰まってたmysqlをさっさとkillする作業に移りました。
業務でmysqlを使わないサーバをよく書いてるので特に悩まず、まずはRedisを使って楽に実装しようかなと思い実装を始めました。

ログイン失敗などの記録はRedisのincrコマンドを多用して実装してあります。incrコマンド、atomicですし返り値でincrの結果を渡してくれるので便利です。
このへんは同日一位だったfujiwara組も同じ戦略だったみたいですね。

また、この時間に他のメンバーに、ユーザーデータを全て、Goサーバ起動時にtsvからオンメモリキャッシュに移す作業をお願いしてあります。

これらの開発を終えた時点でとりあえず15:30ごろにベンチを取ったところ45000程度、暫定2位となっていたので、この段階でのソースコードを固めて、ひとまずの提出用としました。

### 15:30~17:00

この時間ではログインログを全てRedisからメモリ上に持ってくるように修正をかけ始めました。
ただ失敗だなと思ったのがこの時に`sync/atomic`パッケージの存在を失念していて、mutexで少し面倒な実装を組み始めたことですね。
この実装では最後まで`/report`が上手く通らず17時時点で`迷ったら健全な方`に行くことにし、Redis版実装の整備にとりかかりました。

また、平行してGoからRedis、およびnginxとの接続をunixドメインソケットに切り替える作業も行っていました。ベンチの並列度を上げるに連れてローカルポートが枯渇していくので対処としてインフラ担当氏からのアドバイスで実施した次第です。

### 17:00~18:00
この時間ではもともと動いていたmysql, アクセスログ収集などで使ってたfluentdをKILLし、nginxはログを吐かないように修正しました。とにかくレスポンス時間を向上させるためです。極力、CPUをGoに使ってもらえるように計らいました。

ちなみにISUCONでは`再起動後も問題なく動作する`ことが要件に挙げられていたので、この1時間ではベンチマークを走らせる=>サーバを落として再起動する=>データの整合性 + 各ページの目視チェックを行い動作に問題ないことを重点的に確認しました。

この時間の処置でスコアは無難に50000を超えて提出が完了しました。

## 感想
最初から特に戦略を変えず突き進めたので初期にベンチマーク結果が伸びないとかは特に気にせずいられたことが、割と功を奏したと思います。思い切り大事。ただ、最初からRedisよりオンメモリ中心で進めていればまだまだスコア伸ばせていたのではないかというのが反省点です。
今回のmysqlを捨てるような対策は割と社内のサーバでもやってるようなことだったので、特に迷いなく一人でガンガン実装を進めていったのですが、後から話を聞いてみると、最後までmysqlを離れることとを避けているチームも多かったようで、この辺は自社サーバがガラパゴスな進化をしているのかなと思いました。

サーバチューニングにおいて計測は大事と言われるのですが、今回の取り組みでは自分は殆どそういったツールを使っていなくて、記憶している限りだとtopコマンドを数回とあとはbenchmarkスクリプトを走らせた程度です。時間が短いのと、全く最適化されてないWebサーバの実装でボトルネックになるのは大半IOなのでそれを潰し切るだけで充分スコアは叩き出せると思いましたし、実際スコアは出たので、多分正しいんだろうと思います。YDD(野生の勘駆動開発)万歳。

あと、コネクション数減らすのは基本中の基本なのでfujiwara組のCSS切る戦略は正しいと思いますし一本取られた感がありましたのでレギュレーションで弾かれてほしくない感じはあります。こういうのは経験が物を言うのでしょうか。

最近はiOSをちょっと書きつつのマネージャー業務ばかりだったので、久々にコードガッツリ書けて楽しかったです。
最後に運営の皆さん予選お疲れ様でした、決勝に進めた際はそちらでもよろしくおねがいします。

(追伸)
ちなみに、多分オンメモリのみで実装してベンチマークだけ整合性に問題ないようなサーバって今回結構あったんじゃないかなと思っていて、再起動に対する耐性、というかデータの永続化がどれくらいチェックされるのか気になるところです。
laravel4 validateのattributeの設定

エラーメッセージの:attributeに日本語を設定する

ex)http://stackoverflow.com/questions/17047116/laravel-validation-attributes-nice-names

カスタムvalidateの設定
http://qiita.com/MasatoYoshioka@github/items/64784c986e9e54b0d404

```CustomValidator.php
    /* validate カスタムattributeの設定
    *
    */
    public function setAttributeNames(array $attributes)
    {
        $this->customAttributes = $attributes;
        return $this;
    }

```

```Model.php

class Model extends Eloquent
{
    protected $table   = 'models';
    protected $guarded = array( 'id' );

    public static $validate_attributes = [
        'name' => '名前',
    ];

    public static function validateCreate( $input )
    {
        $rules = [
            'name' => 'required',
        ];
        $validator = Validator::make( $input, $rules );
        return $validator->setAttributeNames( self::$validate_attributes );
    }
}

```

```Controller.php

    public function store()
    {
        try{
            $input     = Input::all();
            $validator = Model::validateCreate( $input );
            if( $validator->fails() ){
                return Redirect::back()
                        ->withErrors( $validator );
            }
　　　　　　　//ここに成功時の処理
        }catch( Exception $e ){
            return Redirect::back()
                    ->with( 'error_message', 'errorです' );
        }
    }
```

```View.php
<div class="form-group">
    <label class="col-sm-3 control-label">名前</label>
    <div class="col-sm-9">
{{ Form::text( 'name' ,null, [ 'class' => 'form-control' ]) }}
{{ $errors->first( 'name') }}
    </div>
</div>
<p class="text-center"><button type="submit" class="btn btn-primary" rule="button">購入</button></p>
```

名前を未入力でエラーを出すと
「名前は必須です。」
と表示される。

OK
CentOS 7 に Node.js をインストールする

毎度、インストール方法を忘れてしまうので、いくつかのパターンとしてメモしておきます。

# RPMから
公式には配布されていないので、EPELリポジトリからインストールします。

```shell-session
$ sudo yum install epel-release
$ sudo yum install nodejs
$ node -v
v0.10.32
```

# ソースから

ソースからビルドします。開発ツールが入ってない場合は、一括でインストールする。

```shell-session
$ sudo yum groupinstall 'Development tools'
$ curl -O http://nodejs.org/dist/v0.10.32/node-v0.10.32.tar.gz 
$ tar xvf node-v0.10.32.tar.gz
$ cd node-v0.10.32/
$ ./configure --prefix=/usr/local
$ make
$ sudo make install
```

で、/usr/local/ に入るでしょう。

# バイナリから

一応、本家からバイナリも配布されています。まれだとは思いますが、ここからインストールも出来ます。

```shell-session
$ curl -O http://nodejs.org/dist/v0.10.32/node-v0.10.32-linux-x64.tar.gz
$ sudo tar --strip-components 1 -xzvf node-v0.10.32-linux-x64.tar.gz -C /usr/local
```
第1階層のフォルダをすっ飛ばして、/usr/local にぶち込みます。


以上