OmniAICreator/Qiita-1.07M huggingface dataset:
USVN hook (post-commit: auto deploy)

# Goal

```
* USVNで管理されたsvnリポジトリにコミットがあったタイミングで、svnコードを自動updateしてサービスのテスト環境に自動デプロイする
* USVN稼働サーバとサービステスト環境稼働サーバは別ホストとしたい
```

# Milestone

```
* USVNで管理されたsvnリポジトリのhookスクリプトを起動するユーザは、Apacheの実行ユーザ（自分の環境の場合daemon）になる
* daemonユーザは、nologin属性がついており通常ログインする用のユーザとして作られていない（suもできない）
* hookが動いてから、別のホストへコミットを通知する方法はいろいろあると思うが、シンプルにsshでコマンドを送信することにする

* deploy用のユーザを新たに、デプロイ対象サーバとUSVN管理サーバの両方に作成する
* ２サーバ間を標準入力無しで移動可能にするため、ssh認証キーを作成する
* daemonユーザ（hookスクリプトの実行ユーザ）がdeployユーザにsuできる権限を付与する
```

# Manual

## post-commitスクリプトをリポジトリのhook下に配置

```bash
## -------------------------
## root@USVN管理ホスト
## -------------------------

grep 'subversion.path' {USVNのインストールパス}/config/config.ini
  # subversion.path = "/usr/local/services/usvn-1.0.7/files/"

ls -l /usr/local/services/usvn-1.0.7/files/svn/sample_repos/hook
  # このhook以下に以下のスクリプトをpost-commitという名前で配置
```

```bash:post-commit
SUDO=/usr/bin/sudo
SU=/bin/su
SSH=/usr/bin/ssh

USER='deploy_user'
HOST='deploy_target_host'
PATH='{svnチェックアウト用のパス}/sample_repos'

$SUDO $SU $USER -c "$SSH ${USER}@${HOST} \"cd ${PATH}; svn update\""
```

## ssh key Generation

```bash
## -------------------------
## deploy_user@USVN管理ホスト
## -------------------------

ssh-keygen -t rsa
  # ~/.ssh/id_rsa, pass phraseなしでキーペアを作成

## -------------------------
## deploy_user@デプロイ対象ホスト
## -------------------------

mkdir -p -m 700 ~/.ssh
echo "{さきほど作成したid_rsa.pubの中身}" >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh/authorized_keys

## -------------------------
## deploy_user@USVN管理ホスト
## -------------------------

ssh deploy_user@デプロイ対象ホスト
  # nopassでログインできるようになったことを確認
```

## sudo Setting

```bash
## -------------------------
## root@USVN管理ホスト
## -------------------------
visudo
  # 以下の設定を追加する
  # * requirettyをコメントアウト
  #   これをコメントアウトしないとsudo sshを併用できない
  # * daemonがnopassでsu deploy_userが実行できるように設定
  #   最後の*はオプション付きのsuコマンドを許可するため
```

```
#Defaults    requiretty
```
```
daemon	ALL=(ALL)	NOPASSWD: /bin/su deploy_user*
```

## デプロイ対象サーバでsvn checkoutディレクトリを用意

```
* svnをチェックアウトするようのディレクトリを作成してチェックアウト
* Apache document rootにシムリンクをはるなどする
```

# References

* http://d.hatena.ne.jp/shibainu55/20090720/1248053978
drone.ioを使ってビルドする

中身の薄い『やってみた』シリーズですが、ご容赦を。
前回、[BuildHive](http://qiita.com/akiko-pusu/items/3a9b341f09e36439ec65)について書きましたが、Bitbucketのリポジトリには対応していなかったので、何か良いサービスは無いか探していたところ、職場で[drone.io](https://drone.io)の話題があがったので、早速アクセスしてみました。

## drone.ioとは？

* クラウドのCIサービスです。
* OSSのソースは無料、プライベートのリポジトリも50ビルドまでは無料のトライアルが使えます。
* ビジネス向け、エタープライズ向けもあるようです。
* https://github.com/drone/drone にdorone.ioのオープンソース版が公開されています。
 * Docker上で起動するようです:) (今回こちらには触れません)

## アカウントを作ります

GitHub/Google/Bitbucketのいずれかと認証を連携して、ログインを行います。
drone.ioの専用アカウントを作成するのでもOKです。

## ビルドプロジェクトを作ります

基本は、GitHub/Google/Bitbucketのいずれかのリポジトリを選択する形になります。

![select-repos.png](https://qiita-image-store.s3.amazonaws.com/0/27976/5668cb09-0565-c962-eee7-a94189e83b29.png "select-repos.png")


* 自分がウォッチしているリポジトリも選べます。（リポジトリオーナーでなくても大丈夫！）
* Bitbucketを利用できるのは有り難いので、この記事ではBitbucketを例にします。
* リポジトリを選ぶと、次に、言語を選択する画面が出てきます。
 * コードから自動判別するわけではなく、基本は自分で選択。
 * rubyのソースであっても、pythonのテンプレートが選べたりします。


![select-lang.png](https://qiita-image-store.s3.amazonaws.com/0/27976/e5929c14-8e72-a7b2-c2d7-8956d46a616e.png "select-lang.png")


### pythonの場合のひな形

```pythonを選んだ場合
pip install -r requirements.txt --use-mirrors
nosetests
```

### Javaの場合のひな形

```JavaはMaven
mvn install -q -DskipTests=true
mvn test
```

### rubyの場合のひな形

```ruby
bundle install
bundle exec rake
```

実のところ、テキストエリアが１つだけで、そこにShellスクリプトを書いて行くだけですので、うっかり言語を間違えたとしても、あとから修正できます。

また、言語のバージョンも結構細かく指定できます。

![setting-build.png](https://qiita-image-store.s3.amazonaws.com/0/27976/bf0cf0ea-f5e6-56e5-5500-d258e8a14376.png "setting-build.png")

## ビルドしてみます

上記の通り、設定は至ってシンプルです。
ビルドは手動もしくはリポジトリのコミットがフックとなって自動で実行されます。

ビルドのログもJenkinsと同じように確認できます。
ビルドが通ったら、代表的なっクラウドサービス上にデプロイができます。

ちなみに、大変シンプルなので、Jenkinsとはこんな違いがあります。

* Jenkinsのようなオプションやカスタムワークスペースはありません。
* パイプラインのような、ビルドプロジェクト間の関連づけはできません。
* 成果物の保存はできますが、ファイル数が多いと成果物をして認識される数に限りがあるため、zipなどにまとめて成果物とするほうが良さそうです。

また、ビルドについての[制限](http://docs.drone.io/buildscript.html)もいくつかありますので、挙げておきます。

* 15分以上のビルドはできません。
* 成果物は５ファイルまで。それ以上はダウンロードできないので、zipなどでまとめる必要あり。
 * また、10MBを超えてはダメ。
* ビルド通知は5名まで。


## バッジが利用できます

ビルドのステータスアイコン／バッジが提供されていますので、リポジトリのWikiやREADMEに貼りつけることができます。

![build-status.png](https://qiita-image-store.s3.amazonaws.com/0/27976/db984ae5-3fba-ab39-5926-8220152035e5.png "build-status.png")

## 動かしてみての感想

Dev@Cloud, BuildHiveしか使ってみたことが無いのですが、気がついた点を記載しておきます。

* Dev@Cloud / BuildHive
 * こちら２つはビルドボタンを押してからビルドが始まるまでに、少し待たないといけないことがあります。
 * これは、綺麗な環境をマシンごと立ち上げたり、実行可能なノードが割当たるまでの待ちに当たります。

一方…。

* drone.ioの場合は、ノード待ち、ということは意識せず、すぐにビルドが始まります。
 * Dockerコンテナを利用してビルド環境をすぐに提供できるようになっています。
* ブラウザテストも出来る模様！
 * これはそのうち試してレポしてみます。

## OpenSource版のdroneが出ています

さて、drone.io のブログで、[Drone and Docker, Open Source CI](http://blog.drone.io) というタイトルで、オープンソース版が公開されたという記事が出ました。

* リポジトリ：https://github.com/drone/drone

droneは仮想マシンからDockerの仕組みを利用して、ビルドの環境を提供しています。
まだ公開されたばかりで、これから機能が追加されて行くようですが、凄いですね！
Python の logging を設定するときは disable_existing_loggers に注意


[ロギングの環境設定](http://docs.python.jp/3/howto/logging.html#configuring-logging) という公式ドキュメントにも警告があったのですが、思いっきりハマってしまったので記事にしておきます。

Python の logging モジュールは、 addHandler() などのメソッドを呼び出して構成する以外に、 ini 形式の設定ファイルを元に構成する `logging.config.fileConfig()` や、 dict 型の設定情報を元に構成する `logging.config.dictConfig()` を使って構成することができます。

```python
import logging.config

logging.config.dictConfig({
    'version': 1,
    'handlers': {
        'default': {
            'class': 'logging.StreamHandler',
            'level': 'DEBUG',
            'stream': 'ext://sys.stderr',
            }
    },
    'root': {
        'level': 'DEBUG',
        'handlers': ['default'],
    }
})

logger = logging.getLogger('example')
logger.info('Hello')  # 出力される
```

Python の logging を使うときは、 `logger = logging.getLogger(__name__)` をモジュールの先頭に書いておくのがイディオムになっています。
しかし、先ほどの logging のセットアップではそういったコードを壊してしまいます。

```python
import logging.config

logger = logging.getLogger('example')

logging.config.dictConfig({
    'version': 1,
    'handlers': {
        'default': {
            'class': 'logging.StreamHandler',
            'level': 'DEBUG',
            'stream': 'ext://sys.stderr',
            }
    },
    'root': {
        'level': 'DEBUG',
        'handlers': ['default'],
    }
})

logger.info('Hello')  # 出力されない
```

これは、 fileConfig や dictConfig がもともと logging 全体の構成をすることを目的としていて、デフォルトですでに生成された logger を無効化してしまうからです。

この動作をカスタマイズするためのオプションが disable_existing_loggers で True がデフォルトの挙動、 False が無効化しないという意味になります。
このオプションは fileConfig の場合はキーワード引数として、 dictConfig の場合は渡す dict の要素として指定することができます。

```python
import logging.config

logger = logging.getLogger('example')

logging.config.dictConfig({
    'version': 1,
    'handlers': {
        'default': {
            'class': 'logging.StreamHandler',
            'level': 'DEBUG',
            'stream': 'ext://sys.stderr',
            }
    },
    'root': {
        'level': 'DEBUG',
        'handlers': ['default'],
    },
    'disable_existing_loggers': False,
})

logger.info('Hello')  # 出力される
```

dictConfig はさらに incremental というオプションもあり、既存の logger についている handler や filter などを削除せずに追加だけを行います。
挿入ノーマルモード


# 挿入モードからノーマルモードへの復帰
|キーストローク|結果|
|:--|:--|
|\<Esc>|ノーマルモードに切り替え|
|\<C-[>|ノーマルモードに切り替え|
|\<C-o>|挿入ノーマルモードに切り替え|

# 挿入ノーマルモードとは
ノーマルモードの特殊バージョンで、発射できるコマンドは１つだけで、そのあとには、すぐに挿入モードに戻る。
現在、挿入モードにいて、ノーマルモードのコマンドを１つだけ実行してから、また挿入モードで作業を続けたい場合、モード切り替えの煩雑さを減少させてくる解決法。

# 用途例
ウィンドウの最上行か最下行にカーソルがあり、画面をスクロールして、前後をもう少し確認したい場合。
`zz`コマンドは、画面を再描画して、カーソル行を中央に移動してくれる。これにより、そのときに作業をしていた行の前後の行を画面に半分ずつ表示できる。
挿入モードで、``<C-o>zz``と入力すると、すぐに挿入モードに戻って、思考を中断することなく、入力を続けることができる


# 参考
『実践Vim』 TIP14
capistrano3でrails_envを指定してコマンドを実行する

capistrano3で`RAILS_ENV`を指定して`rake`を実行するのに手間取ったので、ここで共有します。

##問題　下記の方法ではrails_envが呼べない
```deploy.rb
namespace :deploy do
  task :reset_db do
    on roles(:app) do
      execute "cd #{deploy_to}/current && bundle exec rake db:seed RAILS_ENV=#{rails_env}"
    end
  end
end
```

上記の方法だと下記のようなrails_envが定義されていないことを示すエラーが出ます。

```
cap aborted!
undefined local variable or method 'rails_env' for #<SSHKit::Backend::Netssh:0x007f1cd58044b0>
```

##解法1　fetchを通して呼ぶ

```deploy.rb
namespace :deploy do
  task :reset_db do
    on roles(:app) do
      execute "cd #{deploy_to}/current && bundle exec rake db:seed RAILS_ENV=#{fetch :rails_env}"
    end
  end
end
```
こうして書くと、文字列内で`rails_env`を呼べます

##解法2　withを使う
下の例では`cd #{deploy_to}/current`も簡素化するために`within`を使っています

```deploy.rb
namespace :deploy do
  task :reset_db do
    on roles(:app) do
      within release_path do
        with rails_env: fetch(:rails_env) do
          execute :rake, "db:migrate:reset"
        end
      end
    end
  end
end
```

こうして書くと指定した`RAILS_ENV`で`rake`を実行できます

参考
http://blog.huangzhimin.com/2013/11/02/upgrade-to-capistrano3/
golangのまとめ

# まとめ
http://qiita.com/tenntenn/items/0e33a4959250d1a55045

# Install
http://golang.jp/install

#official doc
http://golang.org/doc/code.html

# Framework
https://github.com/hoisie/web
https://github.com/golang/lint

# 開発環境(for vim)
http://mattn.kaoriya.net/software/vim/20130531000559.htm
http://qiita.com/todogzm/items/3c281da10287f7383487
https://github.com/jnwhiteh/vim-golang
http://kobegdg.blogspot.jp/2013/06/gogovim.html
Android2.3系でDNSキャッシュをクリアする


suが使える環境が前提であるが、

```
setprop net.change `getprop net.change`
```

これだけでよい。ただし、HttpURLConnectionを使う場合、少なくとも

```
static {
	System.setProperty("networkaddress.cache.ttl", "0");
	System.setProperty("networkaddress.cache.negative.ttl", "0");
}
```

をやっている前提であること。

DNSのキャッシュはlibcの低レベルレイヤとDalvik上のINetAddressのレイヤの両方で行っており、INetAddress用の設定をSystem.setPropertyで行ってもlibcでキャッシュしているため、setprop net.changeを行う必要がある。(libcでnet.changeの変更時間とキャッシュを管理している)

プロセス単位でキャッシュされているようなので、そのプロセスが一旦死ねばキャッシュも当然ながら破棄される。

##調査の経緯

通信が不安定なモバイルルーターに接続されているAndroid端末があり、通信が復帰してもアプリから通信ができない問題があった。原因としては、

1. Androidから外にアクセスする際に、DNSの問い合わせを行う
2. モバイルルーターが適当なIPアドレスを返す
3. AndroidがそのURLに対して正しくないIPアドレスをキャッシュする
4. そのIPに対してAndroidからHTTPリクエストを送る
5. モバイルルータが「インターネッツに接続できないよ」的なページを200 OKで返す
6. モバイルルーターがそのうち接続できるようになる
7. AndroidからはずっとWIFIで接続できている状態であり、ネットワークの接続状態は変化なし
8. Androidは正しくないIPアドレスを使用してインターネットに接続してしまう
9. DNSレコードのTTLが何故か無視されている

という状態であった。setprop net.changeを実行して、やっと正しいIPアドレスで接続できるようになった。
JSF2.2でHTML5 Friendly Markupを用いてstylesheetの設定するために


[公式チュートリアル](http://docs.oracle.com/javaee/7/tutorial/doc/jsf-facelets009.htm)の[Table 8-4 How Facelets Renders HTML5 Elements](http://docs.oracle.com/javaee/7/tutorial/doc/jsf-facelets009.htm#BABJADGH)にも書かれているように、対応する`jsf:`は存在しないようです。

という訳で、`jsfc`で設定をしました。
ま、こんな感じですね。

```html
<link rel="stylesheet" href="css/common.css" type="text/css" jsfc="h:outputStylesheet" library="css" name="common.css"/>
```

残念です。
serviceコマンドの使い方


Androidに含まれるserviceコマンドを使うことで、任意のサービスのBinderに対してメッセージを送ることができる。

##使い方

```
service call <SERVICE NAME> <ID> <ARGS>
```

##利用例

例えばパッケージを強制停止させたい場合、SERVICE NAMEには、ActivityManagerを示すactivityを指定する。

IDはトランザクション番号。android.app.IActivityManagerのソースを参照すると(SDK 10)、

```
int FORCE_STOP_PACKAGE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+78;
```
とあり、IBinder.FIRST_CALL_TRANSACTIONの値が1であるため、パッケージの強制停止のトランザクション番号は79となる。

ARGSには型と値の組み合わせを指定する。文字列はs16、整数はi32を指定しその後に値を指定する。com.test.pkgを停止させたい場合は最終的に、

```
service call activity 79 s16 com.test.pkg
```

を実行するとよい。
asadminでbash_complecationを有効にする


glassfishをCLIで`asadmin`を利用していると、コマンドが分からなくなって`bas_complecation`が欲しくなります。

何かあるかなーと思ってググってみたら、Oracle本家のブログに[command line completion in GlassFish](https://blogs.oracle.com/harsha/entry/command_line_completion_in_glassfish)という投稿がありました。

大変便利なのでそのまま使わせてもらう事にしました。
`bash_completion`は`homebrew`などでインストールするとして、
自分の場合は、Macなので`/Applications/NetBeans/glassfish-4.0/`以下に`bash_completion.d`を作成しました。

```bash
mkdir -p /Applications/NetBeans/glassfish-4.0/bash_completion.d
cd /Applications/NetBeans/glassfish-4.0/bash_completion.d
wget http://blogs.oracle.com/harsha/resource/commands.txt -O asadmin
```

**※注意点:参考サイトでは、http://blogs.sun.com になっていますが、URLを見ても分かるようにhttp://blogs.oracle.com が正しいです。**

自分の場合は`.bashrc`でasadminを読み込むように設定します。

```.bashrc
if [ -f /Applications/NetBeans/glassfish-4.0/bash_completion.d/asadmin ]; then
    . /Applications/NetBeans/glassfish-4.0/bash_completion.d/asadmin
fi
```

後は`source ~/.bashrc`で反映させればasadminに続くコマンドが利用可能になります。

## 補足
コマンドの引数まで全部表示されてちょっと微妙かもしれません。

## 参考サイト
https://blogs.oracle.com/harsha/entry/command_line_completion_in_glassfish
javascriptの日付ライブラリXDateで、何週間前を計算する。

# やりたいこと
javascriptの日付算出には、ちょっと手間がかかるのでXDateを使って簡略化する。

# 本家サイト
[XDate](http://arshaw.com/xdate/)

# 日付算出
ちょっとつまづいたのが、月を-1するところ。ここは、どうしようもないのか。

```js
    var bd = String(baseDate);
    var yy = bd.substring(0,4);
    var mm = bd.substring(4,6);
    var dd = bd.substring(6,8);
    var xd = new XDate(yy,Number(mm)-1,dd);
    xd.addWeeks(1);
    var day = xd.toString("yyyyMMdd");
```

# その他
本家サイトをみればわかるが、他にも年月日時分秒の足し算、引き算が可能。
引き算は、マイナスを指定する。
apkに含まれるmainメソッドを実行する


Androidでもmainメソッドを実行することができる。実行するためにはdalvikコマンドを使用するか、app_processコマンドを使用する。Androidフレームワークに含まれる機能を利用したい場合はapp_processを使うと良い。

##シェルから実行する場合

コマンドから実行する場合は以下のように環境変数CLASSPATHを設定してから実行する。dalvikの場合は-cpが使えるが、app_processの場合は使用できない。

(pmやamコマンドの中身とやっていることは一緒)

###dalvikを使用する場合
```
export CLASSPATH=/data/app/<APK FILE NAME>
dalvik <MAIN CLASS NAME> <ARGS>...
```

###app_processを使用する場合

```
export CLASSPATH=/data/app/<APK FILE NAME>
app_process . <MAIN CLASS NAME> <ARGS>...
```

##Androidアプリから実行する場合

外部コマンドの実行方法については割愛するが、ProcessBuilderの環境変数の設定で、CLASSPATHに対してApplicationInfo#sourceDirを設定するとよい。ApplicationInfoはContext#getApplicationInfo()で取得でき、ApplicationInfo#sourceDirでAPKファイルのパスが取得できる。

##利用目的

app_processをrootで実行できるならば、パッケージの強制停止やサイレントインストールなど、PackageManagerやActivityManagerを特権で呼び出すのも可能である。
lftp コマンドを実行したら「Certificate verification: certificate common name doesn't match requested host name」というエラーが出た時の対処方法

ホームディレクトリに `.lftprc` というファイル名で、下記の内容の設定ファイルを置くことで、取り急ぎ接続ができるようになりました。この方法が長期的に見て良い設定かどうかはまだ調べていません。

```.lftprc
set ssl:check-hostname no
set ssl:verify-certificate no
```

下記を参考にしました。ありがとうございます。
https://github.com/welaika/wordmove/issues/40
実行時の関数全ての in/out をトレースする

# 概要
実行時の関数全ての in/out をトレースする。
もう、

```
printf("%d %s \n", __LINE__, __func__);
```

こういう DebugPrint 1関数ずつ入れなくてOK。
素敵ポイント: 大元のソースには手を入れない。
gcc 使用。

# ソース

```c++:helloworld.cpp
#include<stdio.h>

/* Proto Type */
void hello_world( void );

void
hello_world(void)
{
    printf( "hello!\n" );
}

int
main(void)
{
    hello_world();
    return 0;
}
```

```c++:simpletrace.cpp
#define _GNU_SOURCE
#include <dlfcn.h>
#include <iostream>

extern "C" {
    void __cyg_profile_func_enter(void* func_address, void* call_site);
    void __cyg_profile_func_exit(void* func_address, void* call_site);
}

// dladdrを用いて関数アドレスから関数シンボルへ変換
const char* addr2name(void* address) {
    Dl_info dli;
    if (0 != dladdr(address, &dli)) {
        return dli.dli_sname;
    }
    return 0;
}

void __cyg_profile_func_enter(void* func_address, void* call_site) {
    const char* func_name = addr2name(func_address); 
    if (func_name) {
        std::cout << "simple tracer: enter - " << func_name << std::endl;
    }
}

void __cyg_profile_func_exit(void* func_address, void* call_site) {
    const char* func_name = addr2name(func_address); 
    if (func_name) {
        std::cout << "simple tracer: exit  - " << func_name << std::endl;
    }
}
```

# ビルド

```bash
$ g++ -fPIC -shared simpletrace.cpp -o libsimpletrace.so -rdynamic -ldl
```

```bash
$ g++ -fPIC -finstrument-functions helloworld.cpp -o helloworld
```

# 実行

普通に実行。

```bash
$ ./helloworld 
hello!
```



いざ、 in/out をトレースし実行。

```bash
$ LD_PRELOAD=./libsimpletrace.so ./helloworld
simple tracer: enter - main
simple tracer: enter - _Z11hello_worldv
hello!
simple tracer: exit  - _Z11hello_worldv
simple tracer: exit  - main
```



 | c++filt でパイプして関数名を読めるように。

```bash
$ LD_PRELOAD=./libsimpletrace.so ./helloworld | c++filt
simple tracer: enter - main
simple tracer: enter - hello_world()
hello!
simple tracer: exit  - hello_world()
simple tracer: exit  - main
```

# 解説
ポイントは、 `-finstrument-functions` 。
関数の in/out で指定した関数を呼ぶ、というオプション。
in のときにやりたい処理を `__cyg_profile_func_enter` に、
out のときにやりたい処理を `__cyg_profile_func_exit` に記載する。


# 参考
http://d.hatena.ne.jp/torutk/20090126
2009-01-26 関数トレーサ
■[C++][Linux]GCCのコンパイルオプションで関数トレーサ

http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/dlsym.3.html
Man Page of DLOPEN

# 詰まったところ
最初はビルドコマンドを

```bash
$ g++ -fPIC -shared simpletrace.cpp -o libsimpletrace.so
```

としていたが、実行時に dladdr が無いと怒られたので、  -rdynamic -ldl を追加し、

```bash
$ g++ -fPIC -shared simpletrace.cpp -o libsimpletrace.so -rdynamic -ldl
```

で実行できるようになった。
環境: Ubuntu 12.04
curlでパラメータを送信する方法

curlで、Webサイトのページを取得する際に、パラメータを指定したい場合の（ひとつの）方法。
具体的には、`-dオプション`で、パラメータをつなげる。

例は、interfmのmusic searchで、3時間前から今までのプレイリストを取得する場合のリクエスト方法

```
html=aaa.html
fyear=`date --date '3 hours ago' +"%Y"`
fmonth=`date --date '3 hours ago' +"%m"`
fday=`date --date '3 hours ago' +"%d"`
fhour=`date --date '3 hours ago' +"%H"`

tyear=`date +"%Y"`
tmonth=`date +"%m"`
tday=`date +"%d"`
thour=`date +"%H"`

curl -d "fyear=${fyear}" -d "tyear=${tyear}" -d "fmonth=${fmonth}" -d "tmonth=${tmonth}" -d "fday=${fday}" -d "tday=${tday}" -d "fhour=${fhour}" -d "thour=${thour}" -d "fminute=0" -d "tminute=59" -o ${html} http://www.interfm.co.jp/search/index.php
```
webページをファイルに落として、rubyで読み込んだときの文字化け対応

# 問題
webから取得したページをファイルに落として、rubyで読み込んだときに、OSかrubyのversionの違いで文字化けが発生したことがあったので対応方法をメモ

# ファイル読み込み
rオプションに:(コロン)をつけて、"UTF-8"を指定。

```rb
File.open(ARGV[0],"r:utf-8").read;
```

# エンコード
ファイル読み込み後、改行コードや読み込めない文字なんかをエスケープする方法

```rb
html_utf8 = html.encode( "UTF-8", :invalid => :replace, :undef => :replace, :replace => "@", :universal_newline => false)
new_html = html_utf8.gsub(/\t/,"").gsub(/\r\n/,"").gsub(/\n/,"").gsub(/&#039;/,"'").gsub(/&amp;/,"&").gsub(/&quot;/,"");
```

※なんとなくこれでうごいた。

# その他
ちなみにWebページをファイルに落とすときは、curlを利用。

```
curl -o [出力ファイル名] [url]
```
railsで、MySQLから取得した値をjsonで返す

# はじめに
最初にcontrollerの雛形を作成するのは以下の記事を参考にする。

[Ruby + bundler + Rails => Hello World](http://qiita.com/iwot@github/items/d1487adf334e536bed15)

# controllerの編集

app/controller/sample_controller.rb(MySQLの接続情報はべた書き、パラメータのエスケープなし)
※もちろんmariaDBでも動作する。

```rb
class SampleController < ApplicationController
  def index
    p params
    order = "asc"
    if params['order'].present?
      order = params['order']
    end
    records = Hash.new
    client = Mysql2::Client.new(:host => "xxx.xxx.xxx.xxx", :username => "user", :password => "password", :database => "dbname")
    sql = "SELECT id,user_nane FROM sample"
    if params['id'].present?
      sql << " where"
      sql << " id = '"+ params['id'] + "'"
    end
    sql << " order by id " + order
    sql << " limit 10"
    p sql

    client.query(sql).each do |row|
      records[row['id']] = row
    end
    client.close
    @result = records
    p @result
  end
end

```
# viewの編集
viewではただjsonを返すだけのページを用意する。

app/views/sample/index.js.erb

```rb
<%=raw @result.to_json%>
```

viewのファイル名をxxxx.js.erbとするところがミソっぽい。

# javascript
呼び出し側のjavascriptの例。

## JQueryの場合
dataTypeをjsonにする。

```js
  return $.ajax({
    url: '/sample/index?order=desc',
    type: 'get',
    dataType: 'json'
  })
         .always(function(){
           console.log("success");
         })
         .fail(function(){
           console.log("error");
         });
```

## angularjsの場合
urlのパスの最後に.jsをつける。

```js
    var params = {
        order: 'desc'
    };
    return $http({
      method: 'GET',
      url:'/sample/index.js',
      params: params,
      responseType: 'json'
    }).then(function(response) {
             return response.data;
           });
```
Veeweeはオワコン？PackerでWindowsのVagrant Boxを作成するスマートな方法


WindowsのVagrant Boxを作りたかったのですが、Vagrant Boxを作るには今ならPackerなのかな？と思いやってみました。
(Veeweeは使ったことないのでどっちの方が便利なのかは分かりません。あしからず。)

# 環境

* Mac OS X 10.9.2
* Vagrant 1.4.3
* Packer 0.5.1

# 方法

1. packer-windowsをGitHubからクローンする

 VeeweeのWindows部分をPacker向けに焼き直した？packer-windowsをGitHubからクローンします。
 
 ```
 git clone git@github.com:joefitzgerald/packer-windows.git
 ```

2. WindowsのBoxを生成する

 Windows Server 2008 R2のBoxを作成する場合、下記のコマンドを実行します。

 ```
 cd packer-windows
 packer build -only=virtualbox-iso windows_2008_r2.json
 ```

 あとは待つだけ。Windows Server 2008 R2 評価版(英語版)とVirtualBox Guest AdditionsのISOイメージが自動的にダウンロードされ、インストールが行われます。

 私の環境(MacBook Air 11" Mid 2013/1.7GHz/512GB/8GB)では2〜3時間ほどかかりました。

 インストールの進捗が見たい場合は、JSONファイル内を下記のように変更してください。

 ```
 -            "headless": true,
 +            "headless": false,
 ```

3. BoxをVagrantに追加する

 ```
 vagrant box add windows_2008_r2 windows_2008_r2_virtualbox.box
 ```

これだけ。
スマートですね！

次はMSDNからダウンロードしたISOイメージで開発用のBoxを作成するのを試してみたいと思います。
Parallella で Docker (が動くのは近いかもしれない)


漢なら Parallella(ARM Linaro) でも Docker 動かしたいですね! Raspberry Pi で動いている報告があるので, Parallella でも動くはず!

## 現時点では動かない

が, 現時点ではカーネルをリコンパイルしないとまずは動かないことが判りました. カーネルリコンパイルをする旅に出ます. 果報は寝て待ちましょう.

## パッケージのインストール

Docker は go 言語で記述されているので, go コンパイラをインストールします.

なぜか go 言語での websocket のパッケージで hg(mercurial) が求められるので, mercurial も忘れずにインストールしておきましょう.

```
$ sudo apt-get install lxc
$ sudo apt-get install bridge-utils
$ sudo apt-get install mercurial
```

```
invoke-rc.d: initscript lxc-net, action "start" failed.
```

と出たりしますがとりあえず無視して進めます.

ARM 版 go 1.2 コンパイラを http://dave.cheney.net/unofficial-arm-tarballs から取得します. Parallella の場合は arm7 multiarch 版を使いましょう.

GOROOT, GOPATH を適切に設定しておきます.

## Docker のビルド.

Docker のソースを持ってきてビルドします. 現在は x86 版以外は

```
The docker runtime currently only supports amd64 (not %s)
```

と実行時エラーを出すようになっているので, 無理矢理パッチを当てて解決します.

以下を参考に,

engine/engine.go

で GOARCH="arm" を通すようにしておきます.
 
https://github.com/resin-io/lxc-docker-PKGBUILD/blob/master/docker-arm-v0.6.4.patch

```
-	if runtime.GOARCH != "amd64" {
+	if runtime.GOARCH != "amd64" && runtime.GOARCH != "arm" {
 		log.Fatalf("The docker runtime currently only supports amd64 (not %s). This will change in the future. Aborting.", runtime.GOARCH)
 	}
```


```
$ git clone https://github.com/dotcloud/docker.git
$ cd docker
$ go get
$ cd docker
$ go get
$ go build
$ file docker
```


## ブリッジインターフェイス

docker0 ネットワークが無いと言われるので, インターフェイスをマニュアルで作ります.

```
sudo brctl addbr bridge0

add bridge failed: Package not installed
```

なんたるちや! パッケージが無いというエラーとなりました. これは調べてみると Linux カーネルで bridge が有効になっていないのが原因のようです.

カーネルのビルドパラメータを調べてみます.

```
$ zcat /proc/config.gz | grep BRIDGE
# CONFIG_ARCH_FOOTBRIDGE is not set
# CONFIG_BRIDGE is not set
```

bingo. 残念ながら BRIDGE 機能が有効になっていませんでした. というわけで, まずはカーネルのリコンパイルが必要になります.

To be continued…
UbuntuマシンでBluetooth4.0+LE(BLE), iBeaconが受信したい: Node.jsのBleaconライブラリを使う

bleaconというライブラリをつかうと、Node.jsでBluetooth通信を送受信したりiBeaconで遊んだりできるらしい。
https://github.com/sandeepmistry/node-bleacon

# 用意する必要があるものと、Bluetoothの準備
- root権限のあるUbuntuマシン。
- マシン本体内蔵のBluetoothが古い場合、Bluetooth4.0+LEに対応し、かつLinuxに対応したドングルが必要。
- 適当なiBeacon端末、iPhone4S以降があればEstimoteアプリ入れてもいいし、MacBookでも可

本体に4.0以前の古いBluetoothが載っている場合、無効にしなければならない。
hciconfig, hcitoolのようなコマンドがない場合、インストールしておく必要がある。

```bash
sudo aptitude install bluez
```

```bash
# USBドングルを挿す前にbluetoothデバイスを確認
hciconfig
# 本体内蔵のやつがあったら、止める
sudo hciconfig hci1 down
# DOWNになっているか確認
hciconfig
# USBドングルを挿す...
# ちゃんと増えてるか、確認
hciconfig
# BLEビーコンのスキャンを試してみる
sudo hcitool lescan
```

`sudo hcitool lescan` で `Set scan parameters failed: Input/output error.` のようなエラーがでる場合、
そのBluetoothデバイスは4.0が対応していない場合がある。

- USBドングルを抜き差しするなどしてちゃんとLinuxに認識されているか
- 古いbluetoothのほうがちゃんと無効になっているか
  - USBドングルのほうを無効にしてたりしないか
  - hci*の番号間違ってないか

を確認しましょう。


# bleaconのインストール
bleaconのビルドには、`bluetooth.h`ヘッダが必要なのでlibbluetooth-devをインストール。

```bash
sudo aptitude install libbluetooth-dev
npm install bleacon
```


# USBドングルに超近いやつだけ表示させる

```coffeescript
Bleacon = require "bleacon"
Bleacon.startScanning()

console.log "start scanning"
console.log Bleacon

proximity_list = [ "immediate", "near", "far"]
Bleacon.on "discover", (bcon)->
    if bcon.proximity is "immediate"
        console.log "ID: #{bcon.major}-#{bcon.minor}, 距離:#{bcon.proximity}"
        console.log "\t 信号強度: #{bcon.measuredPower}, #{bcon.rssi}, 精度:#{Math.ceil(bcon.accuracy)}"
```
Linuxで同じユーザで設定だけを切り替えたい時

<p>設定ファイルは~直下にあるので~が一緒だと切り替えられない。逆に言えば~さえ違えばユーザーは一緒でもいいのでvipwでユーザーの別名を作ってやって~が別の(例えば元の~から見ると~/.child)ディレクトリを指すように設定する。別名のエントリはオリジナルより後の行にすること。</p><p>普通にuseradd使うと既存ユーザと同じIDは指定できないのでユーザーのエイリアスは作れない。なのでvipwで/etc/passwdを書き換える必要がある。/etc/shadowも書き換えて両方にエントリを作る。</p><p>これで別名でログインすると~が別になるので同じユーザで違う設定を使える。もっとも、解像度の違う端末で設定が混ざらないようにするという目的なら別のデスクトップ環境を使うのも手だけど。</p><p>それと、どうやらエイリアスでログインするとオリジナルのユーザ名が使われる、というか使われるユーザ名は最初のエントリっぽい。なので別名のエントリをオリジナルより後にしとくと何かと便利。</p>
ストック / チェックボックをいい感じにするCSS

- - - - - - - - - - - 
ブログを更新しました。<a href="http://workabroad.jp/posts/2065">元の記事はコチラ</a>
- - - - - - - - - - - 
変えたいけど変えるとなると結構めんどくさいチェックボックスのスタイリング。。。
また使いそうだからメモしておきます。結構なやんだ。

<!-- extract -->
　
こんな感じです。

![Screen Shot 2014-03-02 at 11.15.28 AM](http://image.workabroad.jp/upload/2014/102/workabroad.jpg)
　
実際にはこのくらいの大きさ。
Sassなんで変数かえればお好みの大きさになるかと思います。

![Screen Shot 2014-03-02 at 11.15.46 AM](http://image.workabroad.jp/upload/2014/103/workabroad.jpg)

####.scssファイル


```scss

$checkbox_height: 22px;
$checkbox_margin: 25px;

$c_white: #fff;
$c_gray: #eee;
$c_navy: #002b53;

.nice-checkbox {
  /* hide checkbox */
  input[type=checkbox] {
    visibility: hidden;
  }

  float: left;
  margin: 0 7px 7px 0;
  position: relative;

  label {
    display: inline-block;
    height: $checkbox_height;
    background-color: $c_white;
    border: 1px solid $c_gray;
    border-radius: 2px;
    cursor: pointer;
    /* Checkbox text style */
    position: relative;
    margin-left: - $checkbox_margin;
    padding: 0 7px 0 22px;
    font-size: 12px;
    color: $c_navy;
    line-height: $checkbox_height;
  }
  /* Tick mark */
  label:after {
    content: "";
    opacity: 0.2;
    width: 9px;
    height: 5px;
    background: transparent;
    border: 3px solid $c_navy;
    border-top: none;
    border-right: none;
    
    -webkit-transform: rotate(-45deg);
    -moz-transform: rotate(-45deg);
    -ms-transform: rotate(-45deg);
    -o-transform: rotate(-45deg);
    transform: rotate(-45deg);
    
    position: absolute;
    top: $checkbox_height/5;
    left: 6px;
  }

  /* Hover state */
  label:hover:after {
    opacity: 0.5;
  }
  input[type=checkbox]:checked + label:after {
    opacity: 1;
    border-color: $c_white;
  }
  input[type=checkbox]:checked + label {
    background-color: $c_navy;
    color: $c_white;
    border-radius: 3px;
    font-weight: bold;
  }
}

```
　

たくさんあるチェックボックスをタグのように並べる時にいいかもね。
ブラウザチェックしてません。
確認したのはChromeだけなので使うときはテストをお忘れなく。
  


 → <a href="http://workabroad.jp/posts/2065">http://workabroad.jp/posts/2065</a>
GHUnitでGHUnitCase継承したTestCaseを作成したのに動かなかった時にしたこと


iphoneアプリのUnitTestを行うためにGHUnitを使用してテストを行おうとしたら、
TestCaseを書いてあるのに一向にテストを認識してくれなくてハマったので書いておきます。

```TargetTest.m
#import <GHUnitIOS/GHUnit.h>
#import "Target.h"

@interface TargetTest : GHTestCase {}

@property (nonatomic,strong) Target* t;

@end

@implementation UsersTest{
}

-(void)setUpClass{
   self.t = [[Target alloc] init];
}

-(void)dataSetTest{
   NSString* data1 = @"data1";
   NSString* data2 = @"data2";
   [self.t setdataWithDataOne:data1 DataTwo:data2];
   GHAssertEquals(self.t.data1,data1,@"set data1 equals");
   GHAssertEquals(self.t.data2,data2,@"set data2 equals");
}
@end

```

例えばTargetというクラスがあってそれをテストしようとした時に、私は最初こう書いていました。
すると、ビルド・実行はできるのですがリスト中にdataSetTestの項目がでてきません。
では、このテストケースクラスを修正してテストができるようにしたいと思います。
修正したソースは以下です。

```TargetTest.m
#import <GHUnitIOS/GHUnit.h>
#import "Target.h"

@interface TargetTest : GHTestCase {}

@property (nonatomic,strong) Target* t;

@end

@implementation UsersTest{
}

-(void)setUpClass{
   self.t = [[Target alloc] init];
}

-(void)testDataSet{
   NSString* data1 = @"data1";
   NSString* data2 = @"data2";
   [self.t setdataWithDataOne:data1 DataTwo:data2];
   GHAssertEquals(self.t.data1,data1,@"set data1 equals");
   GHAssertEquals(self.t.data2,data2,@"set data2 equals");
}
@end

```
こうするとテストが表示されます。
なにが変わったかというと、"dataSetTest"というメソッド名を"testDataSet"というメソッド名に変えただけです。
どうもメソッド名の最初に"test"となっているものをテスト対象と認識するようです。
git diffでcpやmvの検知をデフォルトにする

いつも`git diff -M`や`git show -M`とやって、リネームを検知して変更点を確認してきたが、めんどくさいのでリネームの検知をデフォルトにした。

`~/.gitconfig`に以下の項目を追加する。

```
[diff]
    renames = copies
```

`copies`ではなく`true`に設定すると、mv(リネーム)のみ検知するみたい。

ちなみに、コピーの検知は`git diff -C`とか`git show -C`とかすればいい。
Vagrantで起動したWindows仮想マシンにリモートデスクトップ接続する超簡単な方法


VagrantでWindowsの仮想マシンを動かした時、マシン上で作業するのにリモートデスクトップ接続してGUIで操作したいことがあります。その場合Microsoft Remote Desktopでlocalhostのフォワードされたポート番号への接続設定をすることになりますが、複数のマシンを起動した場合などポート番号がauto_correctによってズレてしまいます。

しかもMac版のMicrosoft Remote Desktopはコマンドラインオプションを受け付けないので、毎度GUIで設定を変更しなくてはいけません。これは大いなる時間の無駄であり、人類の損失と言えます。

そこで拙作のvagrant-rdpプラグインを使います。

# 環境

* Mac OS X 10.9.2
* Vagrant 1.4.3
* Microsoft Remote Desktop 8.0.3(Officeについているのではなく、App Storeで公開されている方)

# 方法

1. vagrant-rdpプラグインをインストールする

 ```
 vagrant plugin install vagrant-rdp
 ```

2. リモートデスクトップ接続のポートフォワードを設定する

 WindowsのVagrantマシンのVagrantfileに下記の行を追加してください。

 ```
 config.vm.network :forwarded_port, guest: 3389, host: 33389
 ```

3. Vagrantマシンにリモートデスクトップ接続する

 vagrant upしたあと、下記のコマンドを実行します。

 ```
 vagrant rdp
 ```

 リモートデスクトップ接続が起動し、自動的にVagrantマシンに接続されます(ログイン情報は入力する必要があります)。

以上。

vagrant-rdpについては、今後Windows対応・画面の大きさを引数で指定・Remote Appを利用してアプリだけ表示するなどの機能向上をしていきたいと思っています。

**※2014/3/5 追記**

デスクトップの高さ・幅の指定に対応しました。
Vagrantfile内で下記のように指定できます。

```
config.rdp.width  = 1440 # default: 1024
config.rdp.height = 900  # default: 768
```
SSL秘密鍵パスフレーズ解除（Apacheをno passwordでSSL起動できるようにする）

# Goal

```
* サーバ証明書を作成してApache SSL通信を許可したもののapacheの起動時にSSLCertificateKeyFileで指定した秘密鍵のpass phraseをもとめられる
* サーバ証明書の発行はすべて完了した状態で、あとからno passwordでapache再起動できるようにする
```

# Preparation

SSL通信導入のためサーバ証明書を自己署名で作成した手順
* [SSL自己署名証明書作成](http://qiita.com/metheglin/items/22a3b7ca4572a7b772d0)

# Manual

## 秘密鍵からパスフレーズを解除

```bash
## root user

DOMAIN_NAME='yourhost.com'
echo ${DOMAIN_NAME}

cd /usr/local/apache/ssl
  # /usr/local/apache/ssl
  #                   |- cert
  #                   |- key
  #                      |- ${DOMAIN_NAME}_key.pem
  #                   |- work

## 
## パスフレーズなしの秘密鍵を作成
## 既存のパスフレーズあり秘密鍵をopenssl rsaに渡すだけでよい
## CSRやサーバ証明書をつくりなおす必要はない
## 

openssl rsa -in key/${DOMAIN_NAME}_key.pem -out key/${DOMAIN_NAME}_key.nopass.pem
  # 秘密鍵作成時に指定したパスフレーズを入力
chmod 700 key/${DOMAIN_NAME}_key.nopass.pem
```

## Apache Setting

```
## 
## VirtualHostディレクティブ内に記載している秘密鍵へのパスを変更
## 
SSLCertificateKeyFile "/usr/local/apache/ssl/key/usvn.agile.reivo.co.jp_key.nopass.pem"
```

```
/usr/local/apache/bin/apachectl configtest
  # config syntax check
/usr/local/apache/bin/apachectl stop
/usr/local/apache/bin/apachectl start
ps -ef | grep httpd
```

# References

他にもやりかたがあるらしい
* https://jp.globalsign.com/support/faq/93.html
enthumble キーカスタマイズ 【M氏】

#コレは何？
あるenthumbleユーザー、M氏のカスタマイズ内容です。

IMEを常にONにされる環境で、enthumbleをお使いとのことです。
IMEをONにしつつも、スペースや数字を半角で入力するテクニックをお教えいただきました。

#解説
キー設定ファイル(./KeyList./IJKL.ini)の中身を解説。

##キー入力
```ini
Space={shift down}{Space}{shift up}
;半角スペース

F7={vkF2sc070B}{vkF3sc029}""{left}{vkF2sc070B}
F8={vkF2sc070B}{vkF3sc029}(){left}{vkF2sc070B}
;半角で囲い記号を入力し、カーソルキーを記号の間にし、IMEをONにしています。
;vkF2sc070Bはひらがなキー。どんな状況でも、IMEをONにするキーです。
;vkF3sc029は、半角/全角のトグルキー。vkF2sc070Bと組み合わせることで、IME Off状態を作れます。


F9={vkF2sc070B}{vkF3sc029}(){Left}{ASC 33178}{Right}{vkF2sc070B}
;(★) ;記号をキーコードで入力しています。キーコード入力は、IME Off状態からのみ実行できます。

1={vkF2sc070B}{vkF3sc029}{1}{vkF2sc070B}
2={vkF2sc070B}{vkF3sc029}{2}{vkF2sc070B}
3={vkF2sc070B}{vkF3sc029}{3}{vkF2sc070B}
4={vkF2sc070B}{vkF3sc029}{4}{vkF2sc070B}
5={vkF2sc070B}{vkF3sc029}{5}{vkF2sc070B}
6={vkF2sc070B}{vkF3sc029}{6}{vkF2sc070B}
7={vkF2sc070B}{vkF3sc029}{7}{vkF2sc070B}
8={vkF2sc070B}{vkF3sc029}{8}{vkF2sc070B}
9={vkF2sc070B}{vkF3sc029}{9}{vkF2sc070B}
0={vkF2sc070B}{vkF3sc029}{0}{vkF2sc070B}
;絶対半角で数字を入力後、ＩＭＥon状態にもどる

G={vkF2sc070B}{vkF3sc029}{_}{vkF2sc070B}
H={vkF2sc070B}{vkF3sc029}{-}{vkF2sc070B}
;半角アンダーバーと半角ハイフンの入力

Semicolon={Enter}
;小指でEnter

N={shift down}{left}{shift up}
M={shift down}{right}{shift up}
;カーソルキーより左または右を選択状態にする
```

そのほか、ソフトによって、モードを振り分ける試行もされています。
例えば、"WASDモード"はCADソフト専用、"HJKLモード"はグラフィックソフト専用、
"FBNPモード"は、◯◯ソフト専用モードなど
OSXのコマンドラインでVNC(画面共有）をSSH経由で接続する方法（自動ポートフォワード）

MacOSでSSH経由でVNCでアクセスする場合、SSHのポートフォワードとVNCクライアントを同時に起動/後片付けをしなければならないので、こちらを簡単にするためのシェルスクリプトの方法です。

作業としては2パートに分かれます
1. OSX標準のBashが古いので4系にバージョンアップする
2. シェルスクリプトの作成

# Bashのバージョンアップ
HomeBrewを使ってBashをインストールします。

```
$ brew install bash
```

/etc/shellに標準Shellとして下記を登録する

```
$ sudo vi /etc/shell
```

下記を追記

##/usr/local/bin/bash##


chshコマンドを利用してShellをインストールしたものに変更

```
$ chsh 
```
Shellの項目を下記に書き換えます。

Shell: **/usr/local/bin/bash**

terminalを再起動

下記コマンドでbashが4系になっていることを確認
```
echo $BASH_VERSION
```

## スクリプトの作成

下記のようなこんなスクリプトを作成
('vps'は接続先のホスト名 .ssh/configで記載)

```
#!/usr/local/bin/bash
coproc ssh -L 5901:localhost:5901 vps
open vnc://localhost:5901
echo exit >&${COPROC[1]}
wait
```

以上で、上記スクリプトを起動すればポートフォワードしながらvnc（画面共有)が立ち上がります。
画面共有のプロセスを落とせば自動的にポートフォワードのプロセスも終了します。
Vagrant を使用して仮想マシンを作成してみる

# 目的
* Vagrant を使用して仮想マシンを作成してみる
* 動作は Mac 上で確認

# vagrant インストール
* http://www.vagrantup.com/
    * ダウンロードから使用している OS のインストーラを取得し、インストールする(今回は Mac)
* 仮想マシンを作成するツールが必要なので VirtualBox もインストールする
    * https://www.virtualbox.org/

# バージョン確認
* ターミナルを開き、下記コマンドを入力

```bash
$ vagrant --version
```

# Box(仮想マシン) の取得
* 下記ページを参考に取得する
    * http://docs.vagrantup.com/v2/getting-started/boxes.html

```bash
$ vagrant box add “name” “url”
```

* 取得した Box 一覧を表示する

```bash
$ vagrant box list
```

* 他の Box イメージを取得するには
    * http://www.vagrantbox.es/ のページを見ると色々ある(公式ではないよう。)

* Box を削除するには

```bash
$ vagrant box remove
```

* 今回は公式ページの通り、Box を追加しておく

```bash
$ vagrant box add precise32 http://files.vagrantup.com/precise32.box
```

# 仮想マシンの初期化
* ディレクトリの作成
    * 仮想マシンごとにディレクトリを作る必要がある

```bash
$ mkdir UbuntuVM
```

* 作成したディレクトリに移動し、初期化コマンドを打つ

```bash
$ vagrant init precise32
```

* コマンドを打つと Vagrantfile というのが作成される
    * 中身は ruby で記載されていて、仮想マシンの設定ができる(今回はそのまま使用)

# 仮想マシンの起動
* Vagrantfile のあるディレクトリで下記のコマンドを入力

```bash
$ vagrant up
```

* Virtual Box を見ると、起動した VM が実行中になっていることがわかる
![vagrant_ubuntu.png](https://qiita-image-store.s3.amazonaws.com/0/28573/7c1cc336-926b-51ac-ef10-6432017a86b9.png)

# 仮想マシンの停止・再起動
* 仮想マシンの状態を見る場合は、下記のコマンドを入力する

```bash
$ vagrant status
```

* 起動中であれば running となる
> default                   running (virtualbox)

* 仮想マシンを停止するには、下記のコマンドを入力する

```bash
$ vagrant halt
```

* 仮想マシンを再起動するには、下記のコマンドを入力する

```bash
$ vagrant reload
```

* 仮想マシンを削除する場合は、下記のコマンドを入力する
    * Virtual Box 上からは削除されるが Vagrantfile は残る。

```bash
$ vagrant destroy
```

# 仮想マシンに接続・切断
* 接続するには、下記コマンドを入力する

```bash
$ vagrant ssh
```

* 接続できると以下が表示される
> Welcome to your Vagrant-built virtual machine.
> [vagrant@localhost ~]$ 

* 切断には、下記コマンドを入力する

```bash
$ exit
```
LLVM Sparc バックエンドに fcc レジスタ対応きました


素晴らしいですね, これで浮動小数点なコードも安心して使えます!

[llvm] r202614 - [Sparc] Make floating point branch instruction	formats to accept %fcc0-%fcc1 conditional registers as input.

http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20140224/206855.html
【Proxyの外に出れない僕達のために】Proxy 環境下で sudo add-apt-repository する方法【と、sudoとhttp_proxyのなんやかんや】

# おことわり

現象と自分の方法を試したのはProxy環境ですが、
記事は非Proxy環境にいるときに書いたので、検証不十分かもです。

もっかい書いた内容をProxy環境で試して、問題あれば改稿します。

# あらまし

[Ubuntu 12.04 に、gitの最新版を入れる](http://qiita.com/aKenjiKato/items/bfe1e0c9d460362d2331)で書いた内容のうち、
以下の部分がProxy環境下でうまく動かない。

```bash
$ sudo add-apt-repository ppa:git-core/ppa
```

**`apt.conf`にProxyの設定をきちんと書いていても、環境変数`http_proxy`, `https_proxy`を設定していても、である。**

# 問題点

* `add-apt-repository` は `apt.conf`のプロキシ設定を見ていないかもしれない。
* `http_proxy`, `https_proxy`も何故か伝わっていない。

# 原因

`sudo` コマンドは、環境変数を引き継がない。
だから、 **`http_proxy`, `https_proxy`を設定していても、`sudo`で実行したコマンドには引き継がれない**。

# 解決策

## 私の考えた解

環境変数が引き継がれないなら引き継がせれば良い。

```bash
$ sudo http_proxy=${http_proxy} https_proxy=${https_proxy} add-apt-repository ppa:git-core/ppa
```

引き継ぎたい変数を`sudo`と実行したいコマンドの間に記述すればその変数を設定した上で実行してくれる。
これで私の環境では動きました。

GNU Makeもこんな書き方ができる。

## 他の人の解

ぐぐったらもっと良い方法が出てきた。

[sudoで環境変数を引き継ぎたい|ざる魂](http://mikio.github.io/article/2012/03/10_sudo.html)
http://mikio.github.io/article/2012/03/10_sudo.html

```bash
$ sudo -E add-apt-repository ppa:git-core/ppa
```

`sudo -E` で、現在の環境変数を引き継いでコマンドを実行してくれる。
[Man page of SUDO](http://linuxjm.sourceforge.jp/html/sudo/man8/sudo.8.html)

スマート！

（副作用として、 **すべて**の環境変数が引き継がれる点に注意。`rbenv`とか使ってるときになにか起きちゃうかも）

## 他の人の解（管理者アカウントがある場合）

ぐぐると出てくる、もう1つの系統。

[穀風: proxy 越しに sudo を使う](http://kokufu.blogspot.jp/2012/05/proxy-sudo.html)
http://kokufu.blogspot.jp/2012/05/proxy-sudo.html

管理者権限で、`visudo`を用いて`/etc/sudoers`に以下を追加する。

```ini
Defaults env_keep="http_proxy"
Defaults env_keep+="https_proxy"
```

これで自動的に環境変数 `http_proxy`, `https_proxy`はsudoで実行されるコマンドに引き継がれるようだ。

# 参考文献

* [apt-getコマンドをProxy経由で使用する](http://d.hatena.ne.jp/mrgoofy33/20100726/1280154695) http://d.hatena.ne.jp/mrgoofy33/20100726/1280154695

`apt.conf`の書き方について参考にしました。

* [sudoで環境変数を引き継ぎたい|ざる魂](http://mikio.github.io/article/2012/03/10_sudo.html) http://mikio.github.io/article/2012/03/10_sudo.html
* [穀風: proxy 越しに sudo を使う](http://kokufu.blogspot.jp/2012/05/proxy-sudo.html) http://kokufu.blogspot.jp/2012/05/proxy-sudo.html

もっといい方法を紹介されてました。

* [Man page of SUDO](http://linuxjm.sourceforge.jp/html/sudo/man8/sudo.8.html) http://linuxjm.sourceforge.jp/html/sudo/man8/sudo.8.html

いつもお世話になっております。


# 蛇足
題名前半は 遠藤浩輝短編集(2)の『神様なんて信じていない僕らのために』を意識したのですが、あんまりうまくないですね。

<a href="http://www.amazon.co.jp/gp/product/4063142752/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4063142752&linkCode=as2">遠藤浩輝短編集(2) (アフタヌーンKC)</a>

題名後半は、書いていたら`sudo`と環境変数の話になっていたので付け足しました。
Vagrantfileからlocalhost.jsonを読み込む方法

```rb:Vagrantfile
  config.vm.provision :chef_solo do |chef|
    chef.json = JSON.parse(File.read("localhost.json"))
```

これで`Vagrantfile`と同じディレクトリにある`localhost.json`を読み込んでくれます。

## 用途としては…

仮想開発環境用の`localhost.json`と、本番環境への`chef-solo`コマンドに渡す用の`prod.json`を同じファイル形式で並べておける、とか。
ibeaconを試す色々な方法まとめ

情報が散乱していたので現状iBeaconを試すために必要となる条件をまとめてみた

# スマートフォンでBLEアプリが開発したい場合
iBeacon受信するアプリをスマホで動かすための環境はハードルが高いので自分が用意できるか要確認。

- iOS開発環境(iOS Developer Program/年間$99 & 最新のOSX+XCode)、BLE対応のiPhone4S以降かつiOS7以降が必要
- Android端末 Nexus7(2013)、Nexus4、Nexus5など。Android4.3以降が必要


# 手元にある端末でibeacon送受信テストしてみたい

- iOS端末
    - Apple iPhone4S以降
    - iOS7以降
    - https://itunes.apple.com/us/app/estimote-virtual-beacon/id686915066
        - このアプリで送受信できるのはiPhone同士またはEstimoteのビーコン端末のみ
    - https://itunes.apple.com/us/app/ibeacon-locate/id738709014
        - このアプリなら、UUIDがわかっているiBeaconを受信できる
- Android端末
    - BLEはNexus7(2013)、Nexus4、Nexus5など一部端末のみ搭載している模様
    - Android4.3以降
    - https://play.google.com/store/apps/details?id=com.radiusnetworks.ibeaconlocate&hl=ja
        - 上記Locate for iBeaconのAndroid版
- OSXマシン
    - BLEを搭載したMacBook
    - Mavericks以降
    - Node.jsでアプリを書いてrootで実行すれば送受信が可能
- Linux (Ubuntu, Raspberry pi)
    - Linuxで使える、BLE対応USB Bluetoothドングルを購入する必要がある。
        - http://www.logitec.co.jp/products/bluetooth/lbtuan04c2bk/
        - http://www.princeton.co.jp/product/bluetooth/ptmubt7.html
        - http://www.planex.co.jp/products/bt-micro4/
    - buez, libbluetooth-devをインストールする必要あり
    - Node.jsでアプリを書いてrootで実行すれば送受信が可能

Node.jsでbleaconというライブラリを使うと手軽に試せた。
事例： http://qiita.com/items/cea8b163e1f7237e5eee/

-----


# ibeaconを発信できる安価なモジュールをたくさん入手して設置したい

- Estimote Beacons
    - 3個セットで$99。
    - 技適に通っていないので日本国内で使用不可
    - http://estimote.com/#preorder

- BM1
    - 開発キットは10個セットで10000円。
    - 問い合わせフォームから連絡するなどしないと購入できない（市販されている感じではない）
    - http://www.aplix.co.jp/?page_id=7593

-----


# BM1開発キットで開発するために必要な環境

設定用アプリ「BM1Setup」によって設定を行う。
MyBeaconIDとパスワード等、開発キットに同梱されてきた書類が必要。
アカウントがないと設定アプリをダウンロードできないよぉ〜〜(>_<)

## iOS+XCodeの必要条件
- iOS7以降を開発できるOSX+XCodeのあるマシン
- iOS Developer Program に加入済みであること
- iOS7以降にアップグレード済みのiPhone4S以降にインストールする必要がある

または

## Androidの必要条件
- Eclipceのインストールされているマシン
- Nexus7(2013)かNexus4にインストールする必要がある
- Nexus5はこの設定アプリがうまく動かないらしい
WordPressでよく使うプラグイン

メモとして。

* プラグイン
	* Contact Form 7
        * 「その他の設定」について: http://bizvektor.com/plugins/contactform7/
    * Comprehensive Google Map Plugin
        * 2014/02中旬に Google Mapがアップグレードされたっぽいので公式埋め込みの方がよさげ
    * Breadcrumb NavXT
        * パンくず
        * qTranslate (国際化プラグイン) と併用する際はこちらの方が小回りが効く
    * WordPress SEO
        * SEO 用設定の他、
        * /category/ の除去
        * パンくず
        * 画像ファイルページのリダイレクト
    * Google XML Sitemaps
    * Google Analytics
        * プラグインで、よりもウィジェットでやる方が柔軟
        * プラグイン入れない
    * wp multibyte patch
    * ページネーションプラグイン ("wordpress bootstrap pagination" などでググる)
        * プラグインで良いのは無いっぽい
        * ref: https://gist.github.com/sloped/2117898
    * Shortcodes Ultimate
        * カテゴリページリストの抜粋テンプレートカスタマイズも出来て便利
    * 一括記事インポート用
        * Export to Txt
        * CSV Importer
    * URL & Path Shortcodes ([home_url]などいちいち定義しなくても使える)
        * [home_url]
        * [site_url]
        * [admin_url]
        * [network_home_url]
        * [network_site_url]
        * [network_admin_url]
        * [content_url]
        * [plugins_url]
        * [wp_upload_dir]
        * [get_template_directory_uri]
        * [get_stylesheet_directory_uri]
        * [get_stylesheet_uri]
        * [get_theme_root_uri]
        * [get_stylesheet_directory]
        * [get_theme_root]
        * [get_theme_roots]
    * Advanced Custom Fields (ページ固有属性の追加: 意外と使う場面ある)
    * Post Snippets
        共通パーツ登録
    * Category Order
    * Parent Category Toggler
        * 親カテゴリの自動チェック
    * WP jQuery Lightbox
        * ギャラリーページ作成補助に。
windows de ruby 2.1.1 orz to 2.0.0-p451 (=x=)

自作プログラムが2.1系で動かず2.0系に変えたら動いたって話の環境構築メモ。
問題はeventmachineだろうけど未検証。

## rubyinstaller で ruby2.1.1 をインストール

+ 2014年3月2日の時点で未対応だったので編集

```git:config/rubyinstaller.rb
@@ -114,7 +114,7 @@ module RubyInstaller
     )

     Ruby21 = OpenStruct.new(
-      :version => "2.1.0-p0",
+      :version => "2.1.1",
       :short_version => 'ruby21',
       :url => "http://cache.ruby-lang.org/pub/ruby/2.1/",
       :checkout => 'http://svn.ruby-lang.org/repos/ruby/branches/ruby_2_1',
@@ -131,7 +131,7 @@ module RubyInstaller
         "CPPFLAGS='-DFD_SETSIZE=2048'"
       ],
       :files => [
-        "ruby-2.1.0.tar.bz2"
+        "ruby-2.1.1.tar.bz2"
       ],
       :dependencies => [
         :ffi, :gdbm, :iconv, :openssl, :yaml, :zlib, :tcl, :tk
```

+ [前回の手順](http://qiita.com/4ki2@github/items/8d3eb04d98c3ea29d806)でインストール

## 2.0.0-p451 をバイナリからインストール

+ [RubyInstaller for Windows](http://rubyinstaller.org/downloads/) から[インストーラ](http://dl.bintray.com/oneclick/rubyinstaller/rubyinstaller-2.0.0-p451.exe?direct)と[devkit](http://cdn.rubyinstaller.org/archives/devkits/DevKit-mingw64-32-4.7.2-20130224-1151-sfx.exe)をダウンロード
+ インストーラ実行 （インストールパス：`c:\Ruby200`）
+ devkitをインストールパスに展開して設定

```
PS C:\Ruby200> ruby dk.rb init
PS C:\Ruby200> ruby dk.rb install
```
Mac OS XにRubyのpg gemをインストールする一番簡単な方法


Rubyのpg gemをインストールするには、PostgreSQLのライブラリーが必要となります。

でも、他のマシンで動いてるPostgreSQLにアクセスしたいだけなので、パッケージをインストールするとか、Homebrewでインストールするとか大掛かりなことはしたくないよー、という時の話。

# 環境

僕の環境はこんな感じ。

* Mac OS X 10.9.2
* Xcode 5.0.2 (Command Line Toolsもインストール済み)
* Ruby 2.0.0p451 (rbenvでインストール)

# 方法

1. 以下のURLから、Postgres.appをダウンロードする。
 http://postgresapp.com/

2. ダウンロード後に解凍されたPostgres.appをアプリケーションフォルダー(/Applications)に移動する。

3. 以下のコマンドでpg gemをインストールする。

 ```
 gem install pg -- --with-pg-config=/Applications/Postgres.app/Contents/Versions/9.3/bin/pg_config
 ```

PostgreSQLのライブラリーには動的にリンクしているので、インストールしたPostgres.appを削除してはいけません。結局PostgreSQLインストールしてるじゃん！というツッコミはご勘弁を。

おしまい。
gemをアップデートする


```Bash
$ sudo gem install rubygems-update
Fetching: rubygems-update-2.2.2.gem (100%)
Successfully installed rubygems-update-2.2.2
Parsing documentation for rubygems-update-2.2.2
Installing ri documentation for rubygems-update-2.2.2
1 gem installed

$ sudo update_rubygems 
RubyGems 2.2.2 installed
Parsing documentation for rubygems-2.2.2
Installing ri documentation for rubygems-2.2.2
...

#バージョンが上がったことを確認
$ gem --version
2.2.2
```
Socket.ioとBackbone.jsによるSingle Page Application 概要編

# はじめに

スマートフォン向けFX情報サイト[smartfx.minkabu.jp](http://smartfx.minkabu.jp)をSocket.ioとBackbone.jsを使って今話題のSinglePageApplication(SPA)で構築しました。
想像していたよりも簡単にできたので、共有してみます。

# Socket.ioを使う理由

マーケット情報は共通の情報のため、[Socket.io](http://socket.io)のBroadcastができ、かつ更新時のみ送信できるという性質がサーバにもクライアントにもやさしいです。

# Backbone.jsを使う理由

SPAというと最近では[Angular.js](http://angularjs.org)ばかりが目立ちますが、[Backbone.js](http://backbonejs.org)を選んだのは下記理由です。

1.AngularJSの場合は圧縮され最小化された状態で約36K、Backboneは6.4Kなのでスマホの回線を考えると、Backbone.jsのほうが優位です。
2. 拡張性もBackbone.jsはコメント行合わせて1600行ぐらいのため、読めるということだけでなく、自分でリソースを管理する(しないといけないということでもありますが。。)という点が複雑なリソースに対しても対応しやすいという意味で大きいです。


# デモ

[Socket.ioとBackbone.jsを組み合わせたデモ](http://49.212.183.126:40000 "Socket.ioとBackbone.jsを組み合わせたデモ")

## デモの内容

単純に現在と5秒、10秒、30秒のリンクがあります。現在のリンクをクリックすると現在秒が表示されます。
n秒のリンクは、時刻がその秒数で割り切れた場合はサーバからその時刻情報がPushされ、その情報を画面下部に追記していきます。

リンクをクリックすると、URLが変わるためWebサーバにアクセスしているように見えますが、実際はJavaScriptのpushStateを使ってURLを切り替えているだけで、Webサーバにアクセスしていません。(pushstate非対応のブラウザは除く)
JavaScriptでURLを切り替えた後、バックグラウンドで新しい画面用のデータがもらえるように、Socket.ioを使ってSocket.ioサーバにデータを要求しています。

pushStateを使ってURLを変える理由は、SPAだとすべての画面が同じURLになってしまうため、特定の画面を直接開きたいといったことがそのままではできないためです。
URLを変えることにより、特定の画面に対してお気に入りに登録してもらったり、人にシェアしてもらったりすることができます。

ただ、検索エンジンに対しては、サーバ側でPhantom.js等を使って強制的に静的ページに変換するなどの対応が必要になります。


# SPA構築のポイント

ズバリ、リソースの管理です。

サーバからなんでもかんでもデータをpushで受けてしまうと、膨大な通信量になり、処理負荷も高くなり、バッテリもすぐになくなってしまいます。
また、Timerやイベントハンドリングも必要がないまま残ってしまうと、メモリが逼迫したり、予期せぬ動作を招いてしまいます。
オブジェクトも適切に開放しないと、メモリが逼迫して、ブラウザが落ちる原因となります。

このあたりをふまえて、[Socket.ioとBackbone.jsによるSingle Page Application実装編](http://qiita.com/takeshy/items/5d28663bbac57be4706e)を記述しました。
Qiitaのインライン数式記法をエスケープする


[Qiitaでは数式が書ける](http://blog.qiita.com/post/76297476951/beautiful-formula-with-tex)のですが、インライン数式モードが意図しないところで発動しておかしな表示になってしまうことがあります。

[Perlの正規表現の一行モード(/s)と複数行モード(/m)の覚え方 - Qiita](http://qiita.com/xtetsuji/items/9939143a7619956997e1) より。

    複数行モードで ^ や $ は文字列の冒頭末尾以外にも、改行の前後にもマッチするようになりました。「複数行モード」で以前の ^ や $ の意味を表したい場合に使われるのが \A \Z そして \z です。

一行に `$` が一つであれば大丈夫なようですが、二つ以上あると、その間がインライン数式モードになってしまいます。この場合、`^` が上付き文字として解釈されてしまい、表示がおかしくなります。

これをエスケープする場合は、単純にバックスラッシュ `\` を使えば良いようです。

    複数行モードで ^ や \$ は文字列の冒頭末尾以外にも、改行の前後にもマッチするようになりました。「複数行モード」で以前の ^ や \$ の意味を表したい場合に使われるのが \A \Z そして \z です。

`$` はエスケープ対象となり、バックスラッシュが無くなり、インライン数式モードの開始・終了といった意味を `$` は失います。また、特殊な意味を持たないアルファベットなどの前のバックスラッシュは、特に何もせず通常のバックスラッシュ文字として表示されます。

Qiitaの数式の仕組みは、たぶん[MathJax](http://www.mathjax.org/)を使って実現していると思うので、細かい挙動などを知りたい場合はその辺りを調べてみるとよさそうです。
ActionView::MissingTemplateにはまる

JQueryの`$.ajax`からangularjsの`$http`に変更すると、railsのアクションの呼び出しで失敗するケースにはまったのでメモ。

railsのエラー内容(xxxxとかyyyyはアプリ固有の値)
```
ActionView::MissingTemplate (Missing template sample/index, application/index with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder, :coffee]}. Searched in:
  * "/home/xxxx/yyyy/app/views"
):
  actionpack (4.0.1) lib/action_view/path_set.rb:46:in `find'
  actionpack (4.0.1) lib/action_view/lookup_context.rb:115:in `find'
  actionpack (4.0.1) lib/action_view/renderer/abstract_renderer.rb:18:in `find_template'
  actionpack (4.0.1) lib/action_view/renderer/template_renderer.rb:35:in `determine_template'
  actionpack (4.0.1) lib/action_view/renderer/template_renderer.rb:8:in `render'
  actionpack (4.0.1) lib/action_view/renderer/renderer.rb:42:in `render_template'
  actionpack (4.0.1) lib/action_view/renderer/renderer.rb:23:in `render'
  actionpack (4.0.1) lib/abstract_controller/rendering.rb:127:in `_render_template'
  actionpack (4.0.1) lib/action_controller/metal/streaming.rb:219:in `_render_template'
  actionpack (4.0.1) lib/abstract_controller/rendering.rb:120:in `render_to_body'
  actionpack (4.0.1) lib/action_controller/metal/rendering.rb:33:in `render_to_body'
  actionpack (4.0.1) lib/action_controller/metal/renderers.rb:26:in `render_to_body'
  actionpack (4.0.1) lib/abstract_controller/rendering.rb:97:in `render'
  actionpack (4.0.1) lib/action_controller/metal/rendering.rb:16:in `render'
  actionpack (4.0.1) lib/action_controller/metal/instrumentation.rb:41:in `block (2 levels) in render'
  activesupport (4.0.1) lib/active_support/core_ext/benchmark.rb:12:in `block in ms'
  /home/xxxx/.rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/benchmark.rb:296:in `realtime'
```

テンプレートがないということらしい。

JQueryの`$.ajax`のコード

```js
function xhr_get(url) {
  return $.ajax({
    url: url,
    type: 'get',
    dataType: 'json'
  })
         .always(function(){
           console.log("success");
         })
         .fail(function(){
           console.log("error");
         });
}
```

angularjsの`$http`のコード

```js
app.factory('SampleService', function($http) {
  var search = function(params) {
    return $http({
      method: 'GET',
      url:'/sample/index',
      params: params,
      responseType: 'json'
    }).then(function(response) {
             return response.data;
           });
  };
  return {
    search: search
  };
});
```

原因は、angularjsの$httpのパラメータのurlの最後に.jsをつけると解決。

```js
      url:'/sample/index.js',
```