OmniAICreator/Qiita-1.07M huggingface dataset:
Windows on Vagrantでsync folderを高速に使う方法



年末年始がタキオン粒子のごとく流れていって呆然としていますが、皆さんいかがお過ごしでしょうか。
年末年始は姉の手伝いでなぜかC#と戯れていました。Javaよりもいろいろアグレッシブですね、あれ。

## Vagrant on Windowsの不満

そんなことは置いといて、私の現場の環境はWindowsですが、その上でVagrant + VirtualBox を動かしてLinuxをメインの作業環境としています。
Vagrantを使うということは、当然（？）共有フォルダも利用する、ということ・・・ですが。

皆さんご存知の通り、 **VirtualBoxの共有フォルダはめちゃ遅い**です。どんくらい遅いかというとかなり。

これがMacとかLinuxの上で動かしているんだったら、 **VirtualBoxの共有フォルダが遅かったらNFSを使えばいいじゃない** と言えるんですが、そもそもWindowsじゃないと動かないもの（現場先の都合）があるからWindowsな訳でして。

しかし、実際作業効率を考えると、遅いよりは早いほうが当然いいです。しかしWindowsでは基本的にNFSは使えないし、Vagrantのプラグインはかなり不安定だ・・・。
SMBという手がある意味一番現実的だが、いろいろ戦うのも面倒くさい・・・。

何より、VirtualBoxの共有フォルダでは、 **inotifyがうまく動かない** という大問題があり、これのせいで、webpackとかBrowserifyとか、ほかの様々なファイル変更をトリガーにして起動する処理がいろいろグダリます。

## type: rsync
そこでこれの出番になります。Vagrant 1.5から導入された、rsyncを用いて共有を行う方式があります。実際には `vagrant rsync-auto` を利用するのですが。

この方式の特徴としては、

* rsyncなのでファイルが多いと若干同期に時間がかかる
* rsyncさえ動けば（ゲスト・ホスト両方）、ほかには特殊なものは必要無い
* ゲスト側は **ゲストネイティブのファイルシステムを使える**

最後がある意味性能に対して一番効いてくるところです。VirtualBoxの共有ファイルシステムを利用しない分、ファイルアクセスが段違いで早いです。 

また、ゲストのファイルシステムをそのまま利用できるので、inotifyの恩恵に預かることができるため、いろいろ自動で動かすときにかなり効きます。

が、当然いいことだけじゃありません。

* ホスト→クライアントへの一方通行
  * 一応双方向も検討されているみたいですが、1.7でもまだ追加されてません。

これがあまりにも致命的です。Eclipseで編集してその結果を自動的にGulpでビルド、とかそういったことをやりたいけども生成物が見えねぇよー、ということになります。

これを解消するのが今回紹介する方法です。なんとなく予測がついた方もいるとは思いますが。
ちなみにこの方法、私もどこかの海外サイトで見つけて若干アレンジして利用している感じになります。

## 実践
例として、npmを利用しているプロジェクトということにしておきます。なのでnode_modulesをどうするか、ということもポイントになります。

それと、Windows側でもrsyncを利用できるようにしておく必要があります。一番確実なのはMinGWのrsyncを導入することですが、それについては導入済みってことで進めます。

Vagrantfileのsynced foldersの設定を次のようにします。

```ruby
Vagrant.configure("2") do |config|

  config.vm.synced_folder "/main", "c:/work/main", type:"rsync", rsync__exclude: [".git/", "node_modules"]
  config.vm.synced_folder "/main/public", "c:/work/main/public"
end
```

ぶっちゃけこの設定のやり方だけが大事です。 **全体をrsyncして、一部をデフォルトの共有フォルダにする** ということになります。

この場合、gulpやgruntを動作させるのは **/main直下** になります。

実際にいじるのは上の例だと、C:¥work¥main の中です。例えばassetsディレクトリの下をいじると・・・

1. rsync-autoが変更に反応して/mainへ変更を反映
2. /mainで起動しているgulp/gruntなどが変更に反応
3. /main/publicへ生成物を書き込む
4. 生成物のディレクトリはVirtualBoxの共有フォルダなので、C:¥work¥main¥publicに生成物が書き込まれる

という形にできます。若干遠回りしてそうですが、実際にやるとrsync-autoの反映は2〜4秒くらいで終わりますので、以外と早いです。

何よりこの方法の場合、gulp/gruntの起動が、c:¥work¥main全体をVirtualboxの共有フォルダとした時のおよそ倍近く早くなります。
ただし、node_modulesをbind mountした場合になりますが・・・。

## まとめと注意
基本的には、 **全体をrsync、一部だけ共有フォルダ** です。ただ、注意するべき点があって、それは *rsyncする対象を多くしすぎない* ということです。

node_modulesはその典型で、迂闊に入れると数万ファイルが同期される羽目になって、五分とか起動時とrsync-autoの開始時に待たされます。また、単純にファイルが多くなるので重くなります。
その辺は注意しておく必要があるとは思います。

しかし、若干の注意を払えば、Windowsでもそれなりに高速で、ちゃんとファイル変更のトリガーも働く、というのは結構いいんではないかと思います。

ほかにもっといい方法がないかは随時探しています。もっといい方法があれば教えていただければと思います。
RecyclerView内のアイテムに対して2点以上の同時クリックができてしまう・・・

自由過ぎてたまに困ってしまうRecyclerView(内で取り扱うView)に対してあれこれClickListenerを実装すると、2点以上の同時クリックでクリック分のコールバックが走ってしまいます。

例えば同時クリックイベントでダイアログ表示、Fragment管理、Activity遷移などの処理が走るとレッツパーリィになってしまうので、RecyclerViewのsplitMotionEventsを無効にして、RecyclerView内のViewに対する複数のタッチイベント処理を制御した方が良いです。

参考 ViewGroup/attr_android:spilitMotionEvents
http://developer.android.com/reference/android/view/ViewGroup.html#attr_android:splitMotionEvents
※RecyclerViewクラスはViewGroupを継承しています

```xml:xml内での実装例

<android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:splitMotionEvents="false"
        />
```

```java:javaでの実装例
  mRecyclerView.setMotionEventSplittingEnabled(false);
```

補足1
---

ViewGroupのspilitMotionEventsのdefaultはfalseだよと公式リファレンス内に記載がありますが、RecyclerView#isMotionEventSplittingEnabledで値をみるとデフォルトはtrueになってました。

補足2
---
spilitMotionEvents関連のAPIは3系(API11)から。
2系のRecyclerView関連の動作は調べてない。
Martini + DataStore(GAE) の実装

参考になったサイト
----

* [The datastore package](https://developers.google.com/appengine/docs/go/datastore/reference?hl=ja)
* [Datastore Queries](https://developers.google.com/appengine/docs/go/datastore/queries)
* [GAE/Go Datastoreの基本的なクエリ](http://knightso.hateblo.jp/entry/2014/05/26/103458)
* [GAE/Go - Datastoreでの保存、取得、更新、削除](http://knightso.hateblo.jp/entry/2014/05/19/102249)

実装したもの
----

手始めに簡単なつぶやきサイトをサンプルとして実装した。GAE上でどのようにDataStoreと連携できるのかを把握したかった。Githubにアップしている。

[Martini_GAE_DataStore_Sample](https://github.com/takayukii/Martini_GAE_DataStore_Sample)

[GAEにデプロイしたサイト](http://ace-cat-694.appspot.com/)

なお、経緯的にはGAEはDataStore(Big Table)と共にリリースされておりMySQLであるCloud SQLはどちらかというと後発のプロダクト。そのためか、統合の度合いはDataStoreのほうが高いらしい。また、課金に関してもCloud SQLはインスタンスの時間でかかるため割高となるようだ（DataStoreはストレージとI/Oで課金するが無料範囲内にだいたい収まる）。

Martini/Goで実装した感想
----

はじめてのGo実装。Martiniのルーティングとテンプレートエンジン部分の構造が素直なので労なく構造は飲み込め、Go言語の文法をほぼ知らないのにも関わらず動くものが作れた。当然かなり文法エラーをしでかしたのだが、コンパイラが教えてくれるのであまり極端なハマり方はしなかった。

途中、配列に値をpushする実装がよく分からなくて配列の文法を調べたが、いろんな書き方が出来そうだ。

[Go 言語の基礎知識 (2)](http://www.geocities.jp/m_hiroi/golang/abcgo02.html)

また、あまりよく分かってないのだが、Martiniのルーティングで指定した関数の引数が受け手の関数次第で柔軟に受け取れるようだ。つまり、

	func IndexRender(r render.Render, req *http.Request) {

これでも

	func IndexRender(req *http.Request, r render.Render) {

これでも良かったりする。これはJSと違い型が存在するから出来る事なんだろう。

DataStore を使った感想
----

細かい事はまだ分からないが基本的にMongoDBと同じような感じだろうか。ただクラウドだけあって管理画面からデータを参照したりする事ができる。また、ローカルのSDKも対応しているため、goapp serveでローカルで起動した場合でも同様にDataStoreを動かしローカルで試験する事もできる。SDKがよく出来ているなと感じた。

また、今回Goで実装したという事もあるが、NoSQLをstructの定義で入れて行く事ができるので、JSで実装している時に比べ型への意識が強くなる。これはどちらかというとJSでやってるよりも個人的には心地よかった。JSの場合はプロトタイプベースで型はあまり信頼できず不安がある。
SplunkでQC７つ道具のヒストグラムの作成

QC７つ道具に、ばらつきを一目で把握するための[ヒストグラム](http://www.sk-quality.com/qc7/qc707_histogram.html)という図があります。

Splunkでヒストグラムを作るために、bucketというコマンドを利用できます。
例えば、下記のような入力データがあるとします。これをテキストファイルに保存して、qcインデックスにインポートします。

`date=2014/10/09 time=10:11:12 len=100
date=2014/10/09 time=10:12:12 len=50
date=2014/10/09 time=10:13:12 len=120
date=2014/10/09 time=10:14:12 len=60
date=2014/10/09 time=10:15:12 len=60
date=2014/10/09 time=10:16:12 len=70
date=2014/10/09 time=10:17:12 len=70
date=2014/10/09 time=10:18:12 len=70
date=2014/10/09 time=10:19:12 len=100
date=2014/10/09 time=10:20:12 len=100
date=2014/10/09 time=10:21:12 len=100
date=2014/10/09 time=10:22:12 len=100`

bucketコマンド使って幅２０で分割します。
`index=qc | bucket len span=20`

上記コマンド実行すると、下記のように、lenフィルドは４０から１２０までの範囲で、
幅２０で４つに分けられました。
![スクリーンショット（2015-01-13 21.49.48）.png](https://qiita-image-store.s3.amazonaws.com/0/65589/ce340c94-b0f9-5d53-26d8-43ef075cfb80.png)

これを棒グラフで描画すれば、ヒストグラムになるわけですから、statsコマンドを使います。
`... | stats count by len | sort len`

出来上がったヒストグラムは下記のようになります。
![スクリーンショット（2015-01-13 21.57.35）.png](https://qiita-image-store.s3.amazonaws.com/0/65589/c50224d4-c9b8-d415-a31e-bd34f0babb33.png)
vbsメモ

素晴らしいまとめを見つけたのでメモ

VBScriptリファレンス補遺、他 - いい加減な日々の記録たち、アナザーディメンション
http://d.hatena.ne.jp/y10k/20090307

- 予約語を変数名や関数名として使う
- Classで自分自身を参照する
- 正規表現の複数行マッチ
- GetRef関数は手続きオブジェクトを返す
- VBScript組み込みの関数はGetRefを使えない
- 手続きオブジェクトのクラス定義
- 配列オブジェクトのクラス定義
- バイナリ用の関数
- 日付(時刻)リテラル
- VBScriptのイケてるところ。
- VBScriptの微妙なところ。
- 変数の代入
- Dictionaryのインライン定義
- 正規表現のインライン定義
- 拡張可能な配列
- VBScriptでinspect


参考
VBScriptリファレンス補遺、他 - いい加減な日々の記録たち、アナザーディメンション
http://d.hatena.ne.jp/y10k/20090307
jenkinsから送信されるメールの件名にshell実行時の変数を使う


https://wiki.jenkins-ci.org/display/JENKINS/Email-ext+plugin

拡張E-mailプラグイン(Email-ext)を使う前提です。同じ方法で本文もカスタマイズできます。
文章の題名的には4.が本命です。


# 1. Jenkinsの環境変数を参照する

* https://wiki.jenkins-ci.org/display/JENKINS/Building+a+software+project

```bash:サブジェクト例
$DEFAULT_SUBJECT, $BUILD_ID
```

```bash:結果
testjob - Build # 1 - Successful!, 2015-01-01_12-00-00
```

# 2. 拡張E-mailプラグインのトークンを使う

基本的には1.と同じです。

* jenkinsから送信されるメールをカスタマイズする
http://www.ryuzee.com/contents/blog/4527

# 3. ビルド引数を参照する

"ビルドのパラメータ化"で指定した引数の値を参照できます。
ただし、この値をビルド時のshell等で変更しても親プロセスであるJobにはフィードバックされません。あくまでビルド時に渡した引数が参照されるだけです。

```bash:パラメーター付きビルド
http://server/job/myjob/buildWithParameters?PARAMETER=Value
```

```bash:サブジェクト例
$DEFAULT_SUBJECT, $PARAMETER
$DEFAULT_SUBJECT, ${ENV ,var="PARAMETER"}
```

```bash:結果
testjob - Build # 1 - Successful!, Value
```


# 4. ビルド中の値を参照する

https://wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin
EnvInjectプラグインを使います。大まかな流れは以下です。

1. ビルド中に必要な値をファイルに出力
   http://en.wikipedia.org/wiki/.properties
1. EnvInjectで読み込み
1. メールに利用

```bash:.propertiesの形式でファイルに出力
echo "PARAM_DATE = `date +%Y%m%d-%H%M`"> tmp.prop
```

![envinject.png](https://qiita-image-store.s3.amazonaws.com/0/10616/93b6aa14-3f92-9b60-57f5-378b5ae1e1f7.png "envinject.png")


```bash:サブジェクト例
$DEFAULT_SUBJECT, $PARAM_DATE
$DEFAULT_SUBJECT, ${ENV ,var="PARAM_DATE"}
```

```bash:結果
testjob - Build # 1 - Successful!, 20150101-1200
```
外部ストレージのDownloadフォルダ

過去、色々ごにょごにょやったけど、どうやら下記のコードが一番簡単に外部ストレージのDownloadフォルダのパスを取得できる気がする。

```java
String filePath = 
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath();
```
Pythonで自由空間伝搬損失を計算する

# 概要
Pythonを使って自由空間伝搬損失を計算したので、忘れないためにメモ

## 事前準備
使用するのはmathのみなので、Pythonが入っていれば、特になし

## 目的
Pythonで自由空間伝搬損失を計算する。単位は**dB**  
[自由空間伝搬損失とは？](http://www.geocities.jp/bokunimowakaru/kiso-denpan.html)
  
## ソース


```py

def freespace_loss(distance, frequency):
    # frequencyは周波数(Hz)
    # distance はメートル(m)
    light_speed = 300000000.0 # m/s
    return 20 * math.log10((4.0 * math.pi * distance)/(light_speed/frequency))

# 100メートルの距離で周波数が2.412GHzの場合
print freespace_loss(100, 2.412 * 1000000000) # => 80.0893182554 dB
```
[ElasticBeanstalk] デプロイ時の自動実行スクリプト

概要
--

AWSのPaaSであるElasticBeanstalkを利用している場合、アプリケーションのデプロイの際にスクリプトを自動実行する事ができます。この機能によって、アプリケーションが動作するのに必要な設定をコードによって明示的に記述する事ができます（所謂 Infrastructure as Codeと言われるものが実現できます）

なぜ必要か？
--

クラウドのインフラは基本的にOn Demandモデルであり、欲しい時に利用しそしてそれを使い捨てにします。これは従来のインフラの考え方と大きく異なっており、たとえば従来は必要なOSの設定やミドルウェアの設置を一度するとそのまま運用し続けていたのに対し、クラウドではそのインスタンスの生成と破棄が頻繁に行われます。持続的に運用し続けるプロダクションの環境であってもそれは同様で、オートスケール等はその良い例です。

ElasticBeanstalkの場合、Configuration -> Instances の設定で自動的に生成されるイメージを指定できます。下図のCUSTOM AMI IDのところに指定されているのが仮想イメージのIDです。下記の例で言えば、ElasticBeanstalkのApplication作成時に指定したNode.jsのAWSから提供されるAMIになります（幾つかバージョンが存在します）

![スクリーンショット 2014-08-22 3.45.07.png](https://qiita-image-store.s3.amazonaws.com/939/39813/ba110d9b-5af2-17b2-e9d7-9305cafdefb8.png)

自分の環境に適したOS設定・ミドルウェアの設置が行われた仮想イメージをここに指定するのも手ですし、あるいは上述したようにInfrastructure as Codeの考え方でデプロイ時に瞬時にその設定をスクリプトによって行う事もできます。

スクリプトの書き方
--

対象のアプリケーションのGitリポジトリのルートに.ebextensionsというフォルダを設置します。そしてその中にxxxx.configというファイルを作成します。ElasticBeanstalkの場合、この*.configファイルがアプリケーションデプロイ時に事前に読み込まれ実行される事になります。

[AWS Elastic Beanstalk 環境のカスタマイズと設定](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/customize-containers.html)

コマンドの内容については下記が詳しいです。

[Linux を実行する EC2 インスタンス上のソフトウェアのカスタマイズ](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/customize-containers-ec2.html)

#### 例１ コマンドの実行

下記はEC2の時刻をJSTに合わせるものです。基本的にみんな必要になる設定だと思います。下記を\<APP\>/.ebextensions/00_linux.configという形で作成します。

    # Errors get logged to /var/log/cfn-init.log. See Also /var/log/eb-tools.log

    commands:

      01-mv-localtime:
        command: mv /etc/localtime /etc/localtime.bak

      02-ln-zoneinfo:
        command: ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

これでデプロイ時にJSTにする設定が走りますので、オートスケールしてもインスタンスのクラスをmicroからsmallに変えたりしても同じ設定になります。

#### 例2 インストールとファイルのコピー

下記の例はsSMTPというMTAをインストールし、事前に用意しておいた.ebextensions/ssmtp/ssmtp.conf をしかるべき場所にコピーすると言う事を行っています。ここでポイントとなるのは、ファイルのコピーに container_commands を指定している点です。実は commands はアプリケーションの配備前に行われるので .ebextension以下のファイルはもちろんアプリケーション自体のファイルがまだ存在しない状態の中で実行されます。しかし、container_commandsは配備後に実行されるのでファイルに触る事ができます。

    # Errors get logged to /var/log/cfn-init.log. See Also /var/log/eb-tools.log

    commands:

      01-ssmtp-yum-mail:
        command: "yum install mailx -y"
        ignoreErrors: true

      02-ssmtp-install:
        command: "yum --enablerepo=epel install ssmtp -y"
        ignoreErrors: true

    container_commands:

      03-ssmtp-cp-ssmtp-conf:
        command: "cp -f .ebextensions/ssmtp/ssmtp.conf /etc/ssmtp/ssmtp.conf"
    
      04-ssmtp-switch-mta:
        command: "ln -fs /usr/sbin/sendmail.ssmtp /etc/alternatives/mta"

※注意点として本来yumはcommandsではなくpackagesというディレクティブでインストールする事ができます。上記の例ではちょっと事情があってcommandsを利用しているだけです。
herokuで固定IPが必要なAPIを利用する方法

目的
----

herokuでは固定IPが付与されないため、固定IPが必要になるAPIが利用できません。これを回避するには幾つか方法がありますが、プロキシサーバーを利用するのが手間なくできます。今回は、有料Add-onのProximoを使って、固定IPが必要なAPIを利用できるように設定しました。

回避方法についてはこちらにまとまっています。
http://blog.quotaguard.com/google-maps-geocoding-api-heroku/

herokuを利用する場合は、極力サーバーAPIではなくJSから利用するフロントAPIを使うようにアーキテクチャを考えていた方が良さそうですね。

前提
----

* Node.jsを利用しています。
* APIにはGoogleのYouTube Data APIを想定しています。
* Proximoを利用します。はじめ同様のAdd-onのQuotaGuardを使ったんですが、うまくいきませんでした。

手順
----

#### Proximoの追加

ProximoのページからAdd-onを追加します。月間1000回呼び出しで$5なのでけっこうします。
https://addons.heroku.com/proximo

![スクリーンショット 2014-11-02 21.25.52.png](https://qiita-image-store.s3.amazonaws.com/939/39813/1d2915bb-7c6f-a987-ed37-91dabbc8995a.png)

heroku configで確認すると、PROXIMO_URLという環境変数が設定されています。\<user\>:\<pass\>@\<proxy_server\>という構成になっています。

```bash
$ heroku config
=== social-tube Config Vars
MONGOLAB_URI:   mongodb://xxxx:xxxx@xxxx.mongolab.com:49150/xxxx
PROXIMO_URL:    http://xxxx:xxxx@xxxx.proximo.io
```

#### Google APIでプロキシサーバーを指定する

Google APIではプロキシサーバーを指定する事ができるようになっています。
https://github.com/google/google-api-nodejs-client#global-options

幾つかやり方がありますが、今回は下記のようにプロキシサーバーを設定しました。

```js
var googleapis = require('googleapis');

console.log(process.env.PROXIMO_URL);
if(process.env.PROXIMO_URL){
  console.log('use proxy');
  googleapis.options({ proxy: process.env.PROXIMO_URL});
}

var youtube = googleapis.youtube('v3');
```

#### APIのアクセス元のIPアドレスを変更する

API ConsoleからCredentialsのAllowed IPsを変更します。
https://console.developers.google.com/

IPアドレスはPROXIMO_URLに設定されたサーバーURLにpingを打てば分かります。

#### Proximoの利用回数を確認する

Proximoの利用回数を確認するには下記のようにコマンドを実行します。

```bash
heroku addons:open proximo -a social-tube
```
UnityのC#でDLLを作る際にバージョン番号を埋め込む

<blockquote class="twitter-tweet" lang="ja"><p>UnityのC#でDLLを作る際にバージョン番号を埋め込む | AloMarron DevBlog <a href="http://t.co/h01Ibur8li">http://t.co/h01Ibur8li</a> <a href="https://twitter.com/hashtag/AloMarron?src=hash">#AloMarron</a></p>&mdash; 月琴かりん (@karinharp) <a href="https://twitter.com/karinharp/status/554956887301447680">2015, 1月 13</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
PebbleにSimply.jsで作ったアプリをインストールする

目的
----

PebbleにSimply.jsのサンプルアプリをインストールします。

前提
----

* Pebbleのアプリが最新である事
* Pebbleのファームウェアが最新である事
* WiFiを利用している事

手順
----

### CloudPebbleへログインする

https://cloudpebble.net/

### プロジェクトを作成する

「Create」ボタンでProjectを作成します。

![CloudPebble.png](https://qiita-image-store.s3.amazonaws.com/939/39813/26778ccd-4e61-6c82-fe6d-815c0bf45fc2.png)

### サンプルソースを見る

app.jsを参照するとこんな感じになってます。

```js:app.js
console.log('Simply.js demo!');

simply.on('singleClick', function(e) {
  console.log(util2.format('single clicked $button!', e));
  simply.subtitle('Pressed ' + e.button + '!');
});

simply.on('longClick', function(e) {
  console.log(util2.format('long clicked $button!', e));
  simply.vibe();
  simply.scrollable(e.button !== 'select');
});

simply.on('accelTap', function(e) {
  console.log(util2.format('tapped accel axis $axis $direction!', e));
  simply.subtitle('Tapped ' + (e.direction > 0 ? '+' : '-') + e.axis + '!');
});

simply.setText({
  title: 'Simply Demo!',
  body: 'This is a demo. Press buttons or tap the watch!',
}, true);
```

### PebbleのアプリでDeveloper Modeを有効にする

Settingsから有効にし

![IMG_2345.PNG](https://qiita-image-store.s3.amazonaws.com/939/39813/0fc61dc7-e369-10c3-b74a-641d73765d50.png)

Enable Developer Connectionsを有効にします。

![IMG_2347.PNG](https://qiita-image-store.s3.amazonaws.com/939/39813/3d14bcf6-4249-52f2-1e9a-030f1680987a.png)

### サンプルアプリをインストールする

CloudPebbleのCompilationから「Install and Run」で、Pebbleにサンプルアプリがインストールされます。

はまった点
----

「Install and Run」がうまくいかなかったんですが、Pebbleのファームを最新にしたらうまくいきました。

参考
----

http://tips.hecomi.com/entry/2014/04/28/231852
円グラフに特化したjQueryプラグイン「Circliful.js」を使ってみた。

#Circliful.jsとは？

円グラフを描画してくれるプラグイン
[GitHub](https://github.com/pguso/jquery-plugin-circliful)からダウンロード

#使い方

##まずはサンプルを見てみる

以下、DLしたindex.htmlより抜粋

```
<div id="myStathalf" data-dimension="250" data-text="35%" data-info="New Clients" data-width="30" data-fontsize="38" data-percent="35" data-fgcolor="#7ea568" data-bgcolor="#eee" data-type="half" data-fill="#ddd"></div>

～

<script>
$( document ).ready(function() {
    $('#myStathalf').circliful();

～

});
</script>
```
これだけで、円グラフが描画されている。jQuery側の記述は

```
$('要素').circliful();
```
たったこれだけ。

##記述ルール

基本的にdivタグにdata-xxxxというカスタムデータ属性を定義すると、それに従って描画される。
属性と効果は以下を参考

| data-xxxx | 効果 | 記述例 |
|--------|--------|-------|
| dimension | 円の高さと幅(px) | 200 |
| width | 円の太さ(px) | 20 |
| text | グラフの中、後述のinfo上に表示するテキスト | 50% |
| fontsize | textのフォントサイズ(px) | 20 |
| info | text下に表示するテキスト、infoだけに説明文向け | サンプルですよ |
| type | half指定で半円 | half |
| total | データの最大値(後述のpartとセット) | 300 |
| part| データの値(part/totalがグラフを占める割合) | 150 |
| percent | データの割合(※part/totalが優先される) | 50 |
| fgcolor | percentで定義した部分の色 | #7ea568 |
| bgcolor | fgcolor以外に部分の色 | #eee |
| fill | 円の内側の背景色 | #ddd |
| border | 割合を表すラインを基準に対して内側(inline)、外側(outline)に表示 | inline |
| animationstep | アニメーション速度。0でアニメーション無し | 2 |
| startdegree | 基準を0とした時の開始角度 | 45 |
| bordersize | borderの幅 | 20 |
| icon | text左にアイコンを表示 | user |
| iconsize | アイコンのサイズ(px) | 20 |
| iconcolor | アイコンの色 | #aaa |

抜粋したサンプルのdivは、

```
<div id="myStathalf" data-dimension="250" data-text="35%" data-info="New Clients" data-width="30" data-fontsize="38" data-percent="35" data-fgcolor="#7ea568" data-bgcolor="#eee" data-type="half" data-fill="#ddd"></div>
```
なので、

| data-xxxx | 効果 | 記述例 |
|--------|--------|-------|
| dimension | 円の高さと幅(px) | 250 |
| width | 円の太さ(px) | 30 |
| text | グラフの中、後述のinfo上に表示するテキスト | 35% |
| fontsize | textのフォントサイズ(px) | 38 |
| info | text下に表示するテキスト、infoだけに説明文向け | New Clients |
| type | half指定で半円 | half |
| percent | データの割合(※part/totalが優先される) | 35 |
| fgcolor | percentで定義した部分の色 | #7ea568|
| bgcolor | fgcolor以外に部分の色 | #eee |
| fill | 円の内側の背景色 | #ddd |

と定義されていることになる。
array resourceから各要素のresource idを取得する

たまにしか使わないので忘れるため、メモ。

```xml:strings.xml
<string name="hoge">ほげ</string>
<string name="piyo">ぴよ</string>
<string name="fuga">ふが</string>
```
```xml:arrays.xml
<string-array name="array">
    <item>@string/hoge</item>
    <item>@string/piyo</item>
    <item>@string/fuga</item>
</string-array>
```

上記のようなresourceがある場合に `{ "ほげ, "ぴよ", "ふが" }` ではなく、
`{ R.string.hoge, R.string.piyo, R.string.fuga }` を取得する方法。

```java:配列リソースからリソースID配列の取得
public static int[] getResourceIds(Resources resources, int arrayId) {
    final TypedArray array = resources.obtainTypedArray(arrayId);
    try {
        final int[] resourceIds = new int[array.length()];
        for (int i = 0; i < resourceIds.length; ++i) {
            resourceIds[i] = array.getResourceId(i, 0);
        }
        return resourceIds;
    } finally {
        array.recycle();
    }
}
```

なお、array内のitemがresourceではなく、下記のように直接値を指定している場合は、TypedeArray#getResourceIdの第2引数の値になる(上記の0)。

```xml:arrays.xml
<string-array name="array">
    <item>ほげ</item>
    <item>ぴよ</item>
    <item>ふが</item>
</string-array>
```
javaのDIコンテナ"Dagger"のサンプル動作方法

A fast dependency injector for Android and Java
http://square.github.io/dagger/
日本語ドキュメント
http://hajimes.github.io/dagger/

AndroidでDIコンテナを使いたくて、Daggerにたどり着きました。
使い方に慣れるために、まずはjavaでサンプルを動作させましょう。
私はgradle派なので、build.gradleを書いて動作させました。

1. git clone https://github.com/square/dagger.git
2. cd dagger/examples/simple
3. build.gradleを以下の内容で作成
4. gradle run

```groovy:build.gradle
apply plugin: 'java'
apply plugin: 'application'
repositories {
    mavenCentral()
    maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
}
dependencies {
    compile 'com.squareup.dagger:dagger:1.+'
    compile 'com.squareup.dagger:dagger-compiler:1.+'
}
mainClassName = 'coffee.CoffeeApp'
```

で、OKです。後は、適当にサンプルをいじってみて、@Inject, @Provides, @Moduleに慣れましょう。Androidで試すよりも、javaのが手っ取り早くて楽っすなー。

なお、ほぼシェル的にMakefileで実行したい場合は下記の通り。ライブラリのバージョンやパス等は適宜読み替えてください。

```makefile:Makefile
CofeeApp.class:
    javac -cp "libs/dagger-compiler-1.2.1.jar:libs/dagger-1.2.1.jar:libs/javax.inject-1.jar:libs/javawriter-2.5.0.jar" src/main/java/*.java

clean:
    rm *.class *.java

run:
    java -cp ".:src/main/java:libs/dagger-compiler-1.2.1.jar:libs/dagger-1.2.1.jar:libs/javax.inject-1.jar:libs/javawriter-2.5.0.jar" CoffeeApp
```
現在実行中のシェルを知る方法

# 現在実行中のシェルを知る方法
echo $0

# ログインシェルを知る方法
echo $SHELL
(シェルを変更しても、環境変数$SHELLは変更されないので注意すること)

# シェルの深さを知る方法
echo $SHLVL
(ログイン後シェルを切り替えていて混乱した時に使用すればいい)
Chromeでxpathやcssセレクタの実験したいとき

Chromeでは現在開いているドキュメントに対して、xpathやcssセレクターの実験が簡単にできます。
もう当然みなさんご存知と思いますが、私自身忘れかけていたのでメモとして残しておきます。

- Ctrl + Shift + i (Option + Command + i) を押してデベロッパー ツール起動。
- Consoleを選択。
 - xpathの実験は `$x(xpath_to_element);`
 - cssセレクターの実験は `$$(css_selector);`

![chrome_selectors.png](https://qiita-image-store.s3.amazonaws.com/0/36244/c7953f6d-d9d1-0e1a-8a1f-ea8cfc476885.png)

おしまい
検索フォーム入力をクリアに(リセット)する

##検索フォームに入力した内容をクリアにする##
JQuery箇所は「SE奮闘記」さんのブログそのまんまです。
反復練習用としてメモ。

●参考URL
http://se-suganuma.blogspot.jp/2010/08/javascriptjquery.html

●やりたいこと
クリアボタンをクリック
 ∟ → id「searchArea」の範囲内の、指定したval値を空にする
　 ∟ → radio,checkbox の場合は、チェックを外す設定に
　 ∟ → それ以外(今回はinput[type=text])はvalue値を空に


```lang:sample
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>検索フォームの入力内容をクリアにするJQuery</title>
</head>
<body>
  <!-- 検索フォームHTMLサンプル -->
  <section id="searchArea">
    <div>
      <input type="text">
    </div>
    <div>
      <select>
        <option value="0" selected>-</option>
        <option value="1">選択1</option>
        <option value="1">選択2</option>
      </select>
    </div>
    <div>
      <input type="radio" name="radiosample" id="radioA" value="1"><label for="radioA">a</label>
      <input type="radio" name="radiosample" id="radioB" value="2"><label for="radioB">b</label>
    </div>
    <div>
      <input type="checkbox" name="" id="checkA"><lebel for="checkA">A</lebel>
      <input type="checkbox" name="" id="checkB"><lebel for="checkB">B</lebel>
    </div>
  </section>
  <button id="sampleBtn">入力・選択内容のクリア</button>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
  <script>
  $(function(){
      $('#sampleBtn').click(function(){
          $('#searchArea input, #searchArea select').each(function(){
            //checkboxまたはradioボタンの時
            if(this.type == 'checkbox' || this.type == 'radio'){
              //一括でチェックを外す
                this.checked = false;
            }
            //checkboxまたはradioボタン以外の時
            else{
              // val値を空にする
              $(this).val('');
            }
          });
      });
  });
  </script>
</body>
</html>
```
株価をSlackのチャンネルへ自動投稿するGoogle Apps Script

![スクリーンショット_2015_01_13_19_06.png](https://qiita-image-store.s3.amazonaws.com/0/4194/b1b4fb72-891a-ca70-53a3-074989a2bba6.png)

Google Apps ScriptでスクレイピングしてSlackにPOSTしてます。

GASで提供されている`UrlFetchApp`が便利です。

定期投稿は各自好きなタイミングでmyFunctionが実行されるようにトリガーを設定してください（GUIだけでできます）。

```js:コード.gs
var code = "1111" // あなたが見たい会社の証券コード
var slack = {
  postUrl: 'https://slack.com/api/chat.postMessage',
  token: 'xoxp-AAAAAAAAAAAAAAAA', // Slackのtoken
  channelId: "C0BBBBBBBBB",       // 株価ちゃんねるのID
  userName: "株価監視君"            // botの名前
}

var postMessage = function(text) {
  UrlFetchApp.fetch(slack["postUrl"], {
    "method" : "post",
    "payload" : {
      token: slack["token"],
      channel: slack["channelId"],
      username: slack["userName"],
      text: text
    }
  });
}

function myFunction() {
  var response = UrlFetchApp.fetch("http://stocks.finance.yahoo.co.jp/stocks/detail/?code=" + code + ".n");

  var myRegexp = /<td class="stoksPrice">([\s\S]*?)<\/td>/i;
  var match = myRegexp.exec(response.getContentText());
  var amount = match[1];

  Logger.log(amount);
  postMessage("現在の株価： " + amount + "円");
}
```
ExpectedException ルールを使いこなしたい

# はじめに

JUnit で例外が発生することをテストしたいときは、 `@Test` アノテーションで `expected` を設定するのがたぶん最も簡単な方法かと思います。しかし、例外メッセージの内容を検証したり、さらには Caused By の例外オブジェクトも検証したい、となると、`@Test` アノテーションでは力不足となります。

そんなときに `org.junit.rules.ExpectedException` ルールを使うと悩みはだいたい解決しますが、ちょっと使い方がわかりづらかったりします (特に Caused By の例外オブジェクトを検証する場合など)。

なので、Caused By の例外オブジェクトの検証方法を中心に、サンプルコードをメモメモしておきます。

# サンプルコードとちょっとした解説

まずはサンプルコードをご覧ください。

```java:ExpectedExceptionDemo.java
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;

import static org.hamcrest.Matchers.*;

public class ExpectedExceptionDemo {
	// 例外発生を期待しない場合のために、ExpectedException.none() を設定しておく
	@Rule
	public ExpectedException expectedException = ExpectedException.none();

	@Test
	public void demo() {
		// 投げられてくる例外のクラスとメッセージは以下のように、
		// expect() / expectMessage() で期待される値を指定する
		expectedException.expect(RuntimeException.class);
		expectedException.expectMessage("runtime exception");

		// Caused By の例外オブジェクトの検証には expectCause() を使う
		expectedException.expectCause(allOf(
				// Caused By の例外クラスを以下で指定する
				instanceOf(NullPointerException.class),

				// 例外メッセージを以下で指定する
				hasProperty("message", is("null-po"))));

		// 上記では Matchers.allOf() を使っているけれど、
		// expectCause() を２回に分けて呼び出しても問題ない

		// 実際に例外を発生させてみよう
		try {
			throw new NullPointerException("null-po");

		} catch (NullPointerException e) {
			throw new RuntimeException("runtime exception", e);
		}
	}
}
```

ポイントは以下のとおり。

- `ExpectedException#expectCause()` メソッドの呼び出しでは、 `Matcher` オブジェクトを指定する
- 一つ目の `Matcher` オブジェクトの指定において、 `Matchers.instanceOf()` メソッドを利用して、例外オブジェクトの型を検証する
- 二つ目の `Matcher` オブジェクトの指定において、 `Matchers.hasProperty()` メソッドを利用して、message プロパティ、というか `Exception#getMessage()` の呼び出しを期待した例外メッセージの内容を検証する

使い方さえ理解してしまえば、難しくないですよね…！
ページャーとして使うVim

emacsのview.elは、Emacsをページャーとして簡単な操作を与え、
ファイル観覧中など一時的に編集したくない時にそれを防ぐのに便利でしたので
簡易的にVimに移植しました。
Space で ページ送り
b で 1ページ戻る
q で quit
,r で 通常とview-modeのトグル

```vim:.vimrc
" read only Mode
autocmd! BufEnter,BufNewFile * call s:read_only_mode()
nnoremap ,r :call <SID>myRO()<CR>
function! s:myRO()
    :set readonly!
    :call s:read_only_mode()
endfunction

function! s:read_only_mode()
  if &readonly
    nnoremap <buffer><silent> <Space> <PageDown>
    nnoremap <buffer><silent> b <PageUp>
    nnoremap <buffer><silent> q :q<CR>
  else
    nnoremap <buffer><silent> <Space> <Space>
    nnoremap <buffer><silent> b b
    nnoremap <buffer><silent> q q
  endif
endfunc
EclipseでTomcatをサーバーとして登録する

　EclipseでWebアプリケーションを開発するには、アプリケーションコンテナを登録しておくと便利です。ここでは、TomcatというWebアプリケーションコンテナを登録して、開発できるようにします。
　
## 前提条件

　JavaおよびEclipseがインストールされている必要があります。
　詳細は記述しませんので、適宜調べてインストールしてください。

* [ ] JREがインストールされていること。
* [ ] Eclipseが使用できる状態であること。

## 必要なファイルをダウンロードする

　まずはTomcatをダウンロードしてきます。ここではTomcat8をダウンロードします。

* [Tomcat 8.0.22](http://ftp.riken.jp/net/apache/tomcat/tomcat-8/v8.0.22/bin/apache-tomcat-8.0.22.zip)

　`apache-tomcat-8.0.22.zip`というファイルがダウンロードできたら、任意のフォルダに展開しましょう。

　今回は`~`(ホームディレクトリ)に`Tomcat`というフォルダをつくり、その中に展開したものとして説明していきます。

```sh:Tomcatフォルダを作る.
$ cd ~
$ mkdir Tomcat
```

　ですので、Tomcatのインストール先は`~/Tomcat/apache-tomcat-8.0.22`となります。Windowsやその他のディレクトリに展開した場合は、適宜読み替えて、続きの作業を行ってください。
　

## EclipseにTomcatを登録する

　Tomcatがインストールできたら、Eclipseに登録して起動できるようにしましょう。
　まずは、Eclipseを起動してください。

![Eclipseを起動した後の画面](https://dl.dropboxusercontent.com/u/38513287/Eclipse%E3%81%ABTomcat%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/Eclipse%E3%81%AE%E7%94%BB%E9%9D%A2.png)

　まずは、サーバータブを表示させます。メニューから「ウィンドウ」＞「ビューの表示」＞「その他…」を選択してください。

![ビューの表示](https://dl.dropboxusercontent.com/u/38513287/Eclipse%E3%81%ABTomcat%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AE%E8%A1%A8%E7%A4%BA.png)

ダイアログが表示されるので、上部のテキストボックスに`サーバー`と入力してください。
そうすると項目が絞り込まれるので、「サーバー」フォルダの下の「サーバー」を選択して、「OK」ボタンを押してください。

![ビューの表示ダイアログ](https://dl.dropboxusercontent.com/u/38513287/Eclipse%E3%81%ABTomcat%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%83%93%E3%83%A5%E3%83%BC%E3%82%92%E9%81%B8%E6%8A%9E.png)

サーバーのタブが画面の下の方に表示されるようになりました。

![サーバービューを表示](https://dl.dropboxusercontent.com/u/38513287/Eclipse%E3%81%ABTomcat%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%83%93%E3%83%A5%E3%83%BC%E3%82%92%E8%A1%A8%E7%A4%BA.png)

次に、「使用可能なサーバーがありません。この...」と続くリンクをクリックしてください。
そうすると、次の様なダイアログが表示されますので、サーバーを登録していきます。
今回はTomcat8サーバーを使用するので、サーバーのタイプは「Tomcat v8.0 サーバー」を選択します。
サーバーのホスト名やサーバー名はデフォルトのままで構いません。
サーバー・ランタイム環境はこれから登録する必要があるので、「追加…」をクリックしてください。

![サーバーの登録](https://dl.dropboxusercontent.com/u/38513287/Eclipse%E3%81%ABTomcat%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E7%99%BB%E9%8C%B2.png)

新規サーバー・ランタイム環境の登録画面が表示されるので、「参照…」ボタンを押して、先ほどTomcatをインストールしたディレクトリを指定してください。
今回の場合は`~/Tomcat/apache-tomcat-8.0.22`となります。
指定できたら、「完了」ボタンを押してください。

![ランタイムの登録](https://dl.dropboxusercontent.com/u/38513287/Eclipse%E3%81%ABTomcat%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%83%A9%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0%E3%81%AE%E7%99%BB%E9%8C%B2.png)

再び、「新規サーバー」画面に戻ったら、こちらも「完了」を押してください。
そうすると、サーバーが登録されているはずです。

![サーバー登録確認](https://dl.dropboxusercontent.com/u/38513287/Eclipse%E3%81%ABTomcat%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E7%99%BB%E9%8C%B2%E7%A2%BA%E8%AA%8D.png)

これで準備はできました。おつかれさまです。 :laughing:
Sybaseコマンドメモ

Sybaseを触らなければいけない機会が訪れたので基礎中の基礎からメモ

#### DB接続
`SQL> use <DBname>`

#### 現在のDBにある全てのデータ型のオブジェクトを表示
`SQL> sp_help`

#### テーブル一覧取得
`SQL> Select sysobjects.name From sysobjects
Where type = 'U' Order By sysobjects.name`

#### データベース一覧取得
* sysdatabasesシステムテーブルを参照
1> select name,dbid,crdate,dumptrdate from sysdatabases
2> go

* sp_helpdbを実行
1> sp_helpdb
2> go

#### テーブル概要取得

1> sp_help TAKESI_MY_PROFILE
2> go
Selenium Webdriver で ウィンドウ切り替えを追う

Selenium Webdriver 小ネタ

_target=blank で別ウィンドウ遷移時にSelenium Webdriverで追う方法について説明します。

:warning: 使用言語：Ruby

## 結論

下記3行でウィンドウ切り替えできます。

```rb:switch_window.rb
      window = driver.window_handles.last   # ウィンドウ情報を取得
      driver.close                          # 遷移元のウィンドウを閉じる。特に必要なければ記述の必要なし 
      driver.switch_to.window(window)       # 遷移先のウィンドウに遷移元のウィンドウ情報を移す
```
UILabelで複数行のテキストを表示

UILabelで複数行のテキストを表示する場合、ラベルの行数を表示するプロパティnumberOfLinesを0に設定する。

```swift
// labelはUILabelのインスタンスとする
label.numberOfLines = 0;
```

書いとけば忘れないと思うwww

## UILabel Class Reference
https://developer.apple.com/library/ios/documentation/UIKit/Reference/UILabel_Class/
MacのExcelで作られたCSVを文字化けなく配列にするサンプルコード

###概要
MacのMicrosoft Office Excelで作られたCSVファイルをPHP5.5で連想配列にするサンプルコードです。

CSVファイルのfilename（ファイルパス）を引数で渡すと、連想配列をreturnします。
CSVの文字コードを事前に変更する必要はありません。
returnする配列の文字コードはUTF8になります。

配列は、CSVファイルの1行目をkeyにした連想配列になります。

```php:php
function loadCSV($filename) {
    setlocale(LC_ALL, 'ja_JP.UTF-8');
    $data = file_get_contents($filename);
　　//macで作られたCSVの改行コードを置換
    $data = ereg_replace("\r\n|\r|\n", "\n", $data); 
    $data = mb_convert_encoding($data, 'UTF-8', 'sjis-win');
    $tmp = tmpfile();
    $csv = array();

    fwrite($tmp, $data);
    rewind($tmp);

    $i = 0;
    while (($data = fgetcsv($tmp, 0, ",")) !== FALSE) {
        if ($i == 0) {
            foreach ($data as $colum) {
                $colums[] = $colum;
            }
        } else {
            $csv[] = $data;
        }
        $i++;
    }

    foreach ($csv as $data) {
        $return[] = array_combine($colums, $data);
    }
    return $return;
}
```
Assetを全検索する

UI用Textureなのにmipmapをtrueにしているものが無いか全検索して調べたかったので
全検索方法を調べました。

## FindAssets

Unity4.5からAssetDatabase.FindAssetsが使える模様

public static string[] FindAssets(string filter);
public static string[] FindAssets(string filter, string[] searchInFolders); 

## filter

filterの書き方は
co 名前検索(たぶんcontains?)
l:  ラベル
t:  Objectのtype
になります。

例
FindAssets("co common l:ui t:Texture2D", ["Assets/Game/Images/","Assets/Resources"]); 

## 例

Assets/以下の全Texture2Dを調べる例

```Sample
    [MenuItem("FindMipMappedTexture")]
    private static void ShowAllSpriteSetting()
    {
        var guids = AssetDatabase.FindAssets("t:texture2D", null);
        foreach (var guid in guids)
        {
            string path = AssetDatabase.GUIDToAssetPath(guid);
            var textureImporter = AssetImporter.GetAtPath(path) as TextureImporter;
            if (textureImporter != null)
            {
                if (textureImporter.mipmapEnabled == true)
                {
                    Debug.Log("MipMapped Texture! " + path);
                }
            }
        }
    }


```

唐突にfilterなんてものが出てきて焦りますが、なかなか便利に使えそうですね。
インターネットに接続できないサーバへのプロビジョニング

対象サーバをプロビジョニングする時に、apt-getとかgithubとか使いたいので、
操作端末をproxyにして一時的にインターネットへのアクセス経路を作る手順。

以下の様なネットワーク環境を想定。

* 操作端末はインターネットに接続できる
* 対象サーバはインターネットに接続できない
* 操作端末から対象サーバへはsshで接続できる

要するに、itamae/serverspec/capistranoみたいな、対象サーバにsshが通りさえすれば使えるよ的なツール群を使っていて、インターネットに直接アクセスする必要のないバックエンド系のサーバを構築するみたいなシチュエーションを想定している。

### 操作端末での作業

``` bash
# proxyサーバをインストール
sudo apt-get install squid3
# proxyサーバのaclをザル化
sudo sed -i '/^http_access deny all$/d' /etc/squid3/squid.conf
sudo service squid3 restart
# トンネルを掘る
ssh -fN -R 8080:localhost:3128 対象サーバ
```
これで対象サーバで「localhost:8080」がproxyサーバとして機能する。

### 対象サーバでの作業
proxyサーバ経由で接続するようにaptとgitを設定する

``` bash
cat << __EOF__ > 99proxy
Acquire::ftp::proxy "ftp://localhost:8080/";
Acquire::http::proxy "http://localhost:8080/";
Acquire::https::proxy "https://localhost:8080/";
__EOF__
sudo mv 99proxy /etc/apt/apt.conf.d/99proxy
git config --global http.proxy http://localhost:8080/
git config --global https.proxy https://localhost:8080/
```
Net::HTTPの特定のリクエストをmockしてみる

# 関連
* [既存のメソッドを別物に置き換えてみる](http://qiita.com/ogawatti/items/7f47c8827c02cfc37b9d)

# やること
以前やったメソッドの置き換えを使って、Net::HTTPの特定のリクエストをmockしてみる。
今回はyahooのトップページへのGETアクセスをmockに置き換えてみる。

Net::HTTP#getは内部でrequestメソッドをブロック付き読んでいる。
ブロックはtransport_request内で呼ばれる。
普通に置き換えるだけだとレスポンスのread_bodyでエラーになってしまうので、これも偽者を返すようにしてやる。

# やってみた

```netmock.rb
require 'net/http'

module Mock
  extend self

  def on
    ::Net::HTTP.class_eval do
      alias_method :__request, :request; remove_method :request
      include ::Mock::Net::HTTP
    end 
  end 

  module Net 
    module HTTP
      def request(req, body = nil, &block)
        if yahoo_top?(req)
          yield HTTPResponse.new(nil, "200", "OK")
        else
          __request(req, body, &block)
        end 
      end 

      private

      def yahoo_top?(req)
        !!(req.method == "GET" && self.address == "www.yahoo.co.jp" && req.path == "/")
      end 
    end 

    class HTTPResponse < ::Net::HTTPResponse
      def read_body(dest = nil, &block)
        "OK"
      end 
    end 
  end 
end

Mock.on
res_g = Net::HTTP.new("www.google.co.jp", 80).get("/")  # googleの場合
res_y = Net::HTTP.new("www.yahoo.co.jp",  80).get("/")  # yahooの場合

p res1.class  #=> Net::HTTPOK
p res2.class  #=> Mock::Net::HTTPResponse

```
iPhoneでChoregraphe使ってみた

[ロボットスタート](http://robotstart.co.jp/)代表の中橋です。みなさんこんにちは！これから徐々に開発者に役に立つ情報を提供していきたいと思いますのでよろしくお願いします。

----

Pepper/Naoのアプリ開発者の必須ツール、Choregraphe（コレグラフ）。現在Windows、Mac、Linux版が提供されています。

![n37-01.jpg](https://qiita-image-store.s3.amazonaws.com/0/65139/3edc3908-e859-8f78-9d73-03ccb3138452.jpeg)

逆にスマホやタブレットアプリは用意されていません。でも、モバイルデバイスでも使ってみたくなりません？

そこで今回「無理やりタッチでロボットアプリ開発だ！」と言うことでチャレンジしてみましたので手順を紹介します。

以下、iOSとMacを使った例になりますが、androidやWindowsでも同じことができるはずです。

まずスマホ向けのアプリをダウンロードします。iOSの場合「[iTunes AppStore / Chrome Remote Desktop](https://itunes.apple.com/jp/app/chrome-remote-desktop/id944025852)」です。

![n37-05.png](https://qiita-image-store.s3.amazonaws.com/0/65139/c4d3e9cf-bfef-3559-2803-d90cde1df5ba.png)

続いてデスクトップ側のアプリをダウンロードしてインストールします。ブラウザがChromeという前提ですと「[Chrome ウェブストア / Chrome リモート デスクトップ](https://chrome.google.com/webstore/detail/chrome-remote-desktop/gbchcmhmhahfdphkhkmpfmihenigjmpp?hl=ja)」となります。

![n37-06.png](https://qiita-image-store.s3.amazonaws.com/0/65139/7341a1f3-ade1-6c2c-8bd6-37032fdbd02f.png)

デスクトップ側で共有設定を行いPINコードを決めます。その後スマホアプリ側でPINコードを入力するだけです。

![n37-02.jpg](https://qiita-image-store.s3.amazonaws.com/0/65139/466abe4e-dcde-0f78-257e-d8ee85f71ac8.jpeg)

おおぉぉ！デスクトップの環境が表示されました！

![n37-03.jpg](https://qiita-image-store.s3.amazonaws.com/0/65139/527d715b-b6ac-8219-2f91-41d8315eaeec.jpeg)

画面は狭いですが、iPadなどを使えばもっと実用的になりそうです。これは楽しいです！

![n37-04.jpg](https://qiita-image-store.s3.amazonaws.com/0/65139/970515d9-d78b-97a5-8077-88c884eb7009.jpeg)

ということでデスクトップマシンをスリープせずに放置しておけば、スマホやタブレットでいつでもロボットアプリ開発ができますね、というお話でした。

では、また！
役に立つサイト制作のまとめ

ホームページのリンクのまとめになります。

[【無料！】使える９つのホームページ作成サービスサイト][1]
[Web制作者や、Web業界新入社員のためのベストエントリ48個 2013総まとめ][2]

[1]:http://matome.naver.jp/odai/2135612865844050801
[2]:http://e0166.blog89.fc2.com/blog-category-24.html
既存のメソッドを別物に置き換えてみる

# 関連
* [クラスを別物に置き換える](http://qiita.com/ogawatti/items/0e69125ef4155241f598)

# やること
特定クラスのインスタンスメソッド、クラスメソッドを別物に置き換えてみる。
別のモジュールで置き換えのon/offを実装してみる。

# 使った要素技術と参考にしたサイト
* alias_method
* remove_method
* クラスメソッドのエイリアス
 * http://www.tktkgame.com/tkool/memo/rgss/self_alias.html
 * http://stackoverflow.com/questions/2079240/removing-undefining-a-class-method
* モジュールメソッドのinlcude
 * http://ref.xaio.jp/ruby/classes/module/included

# やってみた

```mock_methods.rb
class Hoge
  def hoge; p "hoge"; end
  def self.foo; p "foo"; end
end

module Mock
  extend self

  def on
    ::Hoge.class_eval do
      alias_method :__hoge, :hoge; remove_method :hoge
      class << ::Hoge; self; end.class_eval do
        alias_method :__foo, :foo; remove_method :foo
      end
      include ::Mock::Hoge
    end
  end

  def off
    ::Hoge.class_eval do
      alias_method :hoge, :__hoge; remove_method :__hoge
      class << ::Hoge; self; end.class_eval do
        alias_method :foo,  :__foo;  remove_method :__foo
      end
    end
  end

  module Hoge
    def hoge; p "hogeeeee"; end

    module ClassMethods
      def foo; p "fooooooo"; end
    end

    extend ClassMethods

    def self.included(klass)
      klass.extend ClassMethods
    end
  end
end

Hoge.new.hoge    #=> "hoge"
Hoge.foo         #=> "foo"

Mock.on
Hoge.new.hoge    #=> "hogeeeee"
Hoge.foo         #=> "fooooooo"

Mock.off
Hoge.new.hoge    #=> "hoge"
Hoge.foo         #=> "foo"
```
pop2imapでsshログインせずにメールボックスを移設する

#pop2imapとは
メールボックスの移設をする際に
移設元が共用サーバなど理由のためsshログインできない場合に
popとimapを利用してメールを移設するツールが「pop2imap」です。

仕組みは単純で、
移設元にpop3でログインしてメールをダウンロードして、
そのメールを移設先にimap4でアップロードすることで、
メールボックスを移設することができます。


#インストールの準備
pop2imapの中身はperlで、
事前にMail::IMAPClientやMail::POP3Client、Email::Simple、Date::Manipのインストールが必要です。
redhat系の場合はepelリポジトリに含まれています。

 
#インストール
perlモジュールの準備ができたらpop2imapをダウンロードして、展開します。

```
wget http://www.linux-france.org/prj/pop2imap/dist/pop2imap-1.21.tgz
tar zxvf pop2imap-1.21.tgz
cd pop2imap-1.21

make install
```
でインストール完了です。

#使い方
使い方は以下の通りです。

```
pop2imap --host1 before.hoge.jp --user1 tachibana@hoge.jp --password1 before_passwd --host2 after.hoge.jp --user2 tachibana@hoge.jp --password2 after_passwd
```

移設元のpopサーバや接続情報と移設先のimapサーバと接続情報を指定するだけで、
メールの移設が開始されます。

```
From pop3 server [before.hoge.jp] port [110] user [tachibana@hoge.jp]
To imap server [after.hoge.jp] port [143] user [tachibana@hoge.jp]
TimeZone :[etc/gmt]
Looking POP messages
Found [8] pop messages
:
:
```
Movable Typeの検索結果をjson形式で取得

Movable Typeの検索結果をjson形式で取得する方法です。

テンプレートを作ればファイルを出力できますが、動的に取得したい場合は検索結果をjson形式にすることで取得できます。

http://web.loft-net.co.jp/lofttecs/movable_type_search_json/
Androidのアプリ情報を開くIntent

```java
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.parse("package:com.your.app"));
startActivity(intent);
```
"package:"のあとに開きたいアプリのパッケージ名を入れると開けます。
開発中のアプリのデバッグ用設定画面からアプリ情報を開けるようにしておくと、デバッグ作業がはかどります。
Web開発で便利なサービスを記録する個人的メモ

http://xip.io/
https://ngrok.com/
http://apigee.com/
https://poser.pugx.org/
http://httpbin.org/
http://shields.io/
http://www.programmableweb.com/

http://www.planetb.ca/syntax-highlight-word
http://blockdiag.com/ja/seqdiag/
スマホサイトを幅640でつくるとき


```html
<meta name="viewport" content="width=640, user-scalable=no">
```

という風に、user-scalable=no を設定すると、一部Android (4.0, 4.1で確認) にて
user-scalable=no が効かず、かつ初期ロード時にzoomされた状態でロードされてしまう。(つまり、画面の倍くらいの大きさでコンテンツが表示されてしまう)

それで、initial-scale値を端末のwindow幅から動的に設定するなど試したが、どうもAndroidでは上手く機能しないため、
とりあえず、Androidではuser-scalable=noは諦め、iPhoneにだけこれを設定することに落ち着いた。
(こうすることで、Android初期ロード時にズームされて表示される問題は防げる)
Could not get core Erlang code forでdialyzerが失敗する

## Could not get core Erlang code forでdialyzerが失敗する

最近下のようなエラーによく遭遇する。

```bash
dialyzer: Analysis failed with error:
Could not scan the following file(s):
  Could not get core Erlang code for: /var/lib/....../ebin/xxx.beam
Last messages in the log cache:
  Reading files and computing callgraph... 
```

とある人から対処法を教えてもらったのだが, 忘れてコミットログを漁ることになるので対処法をここに残しておく.

```erlang
LIBS=$(ERL_LIBS):deps

dialyze: 
    ERL_LIBS=$(LIBS) dialyzer --no_native -pa ebin --plt .dialyzer.plt -I deps -r ebin $(DIALYZER_OPTS)
```

このように依存ライブラリのパスを`ERL_LIBS`で指定して上げるとうまくいく.
CoreOS 利用時のGCE スタートアップスクリプトログ

Google Compute Engine ではインスタンス起動時に実行するスタートアップスクリプトを指定できる．そのスタートアップスクリプトのログは，[マニュアル](https://cloud.google.com/compute/docs/startupscript) によると

```
/var/log/startupscript.log
```

にあると書かれている．しかし，CoreOS の場合，Systemd を用いてスタートアップスクリプトを起動しているので，ログの取得には journalctl を使う．スタートアップスクリプトのサービス名は `google-startup-scripts.service` なので，

```shell-session
$ sudo journalctl -u google-startup-scripts.service
```

にて取得できる．
トランザクション処理とは

あるsqlファイルに

```sql
BEGIN;
 INSERT INTO 
 INSERT INTO 
 …
 INSERT INTO 
COMMIT;
```

と書かれていて「BEGIN、COMMITってなんだ？いる？」ってなって調べたのでメモ。

これは「トランザクション処理」というもので、BEGIN〜COMMITがひとつの処理として扱われるので、どこか途中で処理が中断したりしてデータに不整合が生じるのを防ぐためのものらしい。

銀行などではAさんがBさんにお金を振り込むことがあるが、その際に「Aさんの口座からお金を減らす」「Bさんの口座にお金を増やす」という処理をまとめて行わないといけない場合などに使う。

たしかにAさんの口座からお金を減らした時点でエラーが起こると大変だ。完全に実行されるか、完全に実行されないか（Aさんの口座から減らさないし、Bさんの口座に増やさない）としなくてはいけない。
【Rails】cacheを消したい時のワンライナー

更新)redisでキャッシュを利用している場合も動作確認済み

# ワンライナーで削除するコマンドはこちら

```rb
bundle exec rails r 'Rails.cache.clear'
```

### Springを使って実行する場合はこちら

```rb
bin/rails r 'Rails.cache.clear'
```

## memcachedとRedisでそれぞれキャッシュを格納している場合にも対応している

確認しに使用したライブラリは
* memcachedの場合は[dalli](https://github.com/petergoldstein/dalli)
* Redisの場合は[redis-rails](https://github.com/redis-store/redis-rails)


以下のコマンドだとmemcachedのデータが消えなかった

```
rake tmp:cache:clear
```
ChromeでJavaScriptからIndexedDbを初期化する


webkitGetDatabaseNames()呼んでるせいでChromeでしか動かないんだけど、呼びたいのはどうせ開発中だけだし、そのうちgetDatabaseNames() が生えるようになるとは思うので、それまで我慢して。


```coffeescript
resetStorages = do ->
  getDbNames = -> new Promise (done, reject) ->
    req = indexedDB.webkitGetDatabaseNames()
    req.addEventListener 'success', (event) ->
      dbNames = (i for i in event.target.result)
      done(dbNames)
    req.addEventListener 'error', (event) ->
      reject()

  removeAllIndexedDb = (dbNames) ->
    Promise.all(
      dbNames.map (name) -> new Promise (done, reject) ->
        req = indexedDB.deleteDatabase(name)
        req.addEventListener 'success', ->
          done()
        req.addEventListener 'error', ->
          reject()
    )

  resetAllIndexedDb = -> new Promise (done) ->
    getDbNames().then (names) ->
      removeAllIndexedDb(names).then ->
        console.info 'all items removed!'
        done()

  ->
    localStorage.clear()
    resetAllIndexedDb()
```
間違ってTerminateしたEC2インスタンスを復活させる方法


※全てのケースで使えるかどうかは知りませんし、本記事の動作保証もしません。

AWS Management Consoleから間違ってインスタンスをTerminateして「あ！！！！」とした時すぐに対応すれば間に合うかも・・・？

1. TerminateしたインスタンスのInstance IDをコピー
2. ELASTIC BLOCK STOREの検索フィールドに1.のInstance IDをペーストして検索
3. 検索で出てきたEBSを右クリックしてCreate Snapshot
4. ELASTIC BLOCK STORE>Snapshotsから3.で作成したSnapshotを右クリックしてCreate Image
5. AMIsから4.で作成したAMIを右クリックしてLaunch

中身がどこまで戻ってるかはわかりません・・・が、緊急時の対応としてはありかも。
Kinect v1が接続出来ない。

Parallels内Windows7に前は接続出来ていたんだが
なぜか出来なくなった。

どなたか同じパターンでハマった方、解決方法をご教示願います。

環境
MacOSX 10.9.5
Parallels 9 for Mac Build9.0.24251 Revision 1052177; 2014年８月２８日木曜日

Parallels内Windows
Windows7 Enterprise 32bit
Kinect for Windows SDK v1.8
HTMLの基礎～p要素、div要素、span要素のそれぞれの違い～

p：ブロック要素。段落を指定する時に使います。
　　★タグで指定した要素と要素の前後に１行空白が入る。

div：汎用ブロック要素。前後に改行が入ります。
　　　★タグで指定した要素毎に改行される。（空白行は入らない）

span：汎用インライン要素。前後に改行が入りません。
　　　★タグで指定した要素毎に改行も空白行も入らないため、
　　　　同じ行で、途中の文言の装飾を変えたい時に利用する。


以下のページを参照させていただきました。
http://techmemo.biz/html/p%E8%A6%81%E7%B4%A0%E3%80%81div%E8%A6%81%E7%B4%A0%E3%80%81span%E8%A6%81%E7%B4%A0%E3%81%AE%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E3%81%AE%E9%81%95%E3%81%84/
C++の微妙に環境依存なコードとか

　OSや開発環境の仕様の違いうんたらで、気づいたら環境依存のコードになってた個人的メモ。

##戻り値の無い関数
　クラスのメンバー関数はどこからも呼び出されていなければ、戻り値がなくてもVS2013ならコンパイル可能、ただのバグだと思う。
グローバルな関数だと戻り値が無ければ普通にエラー。

　実装忘れてた関数があって、XCodeでコンパイルしようとしたらエラーになった。

```cpp

class test
{
 bool 戻り値の無い関数()
 {

 }
}

```

##数学系関数
　sinやらcos等はstd::名前空間は環境によって無くても良かったり、良くなかったり。
多分Cの数学ライブラリだと名前空間不要なのでそのあたりの兼ね合いっぽい。
とりあえずstd::は省略しない方が良い。

```cpp

int main()
{
    double a = cos(1.0);
    return (int)a;
}

```
##安全性を向上させた関数
sprintf等をVS2013でコンパイルしようとすると、sprintf_sに置き換えろと警告が出るので、_sが付いた関数に書き換えたりします。
しかし、その辺りの関数はMSVCの独自拡張だったりするので、sprintf自体を使うなと言う事になる。

```cpp
#include <stdio.h>

int main()
{
    char a[10];
    sprintf_s(a,10, "あ");
    return 0;
}

```
##識別子に使える文字
　環境によって使える文字がバラバラ。識別子に日本語等を使う場合注意が必要。
[MSVC]C#並に大体の文字が使える、絵文字とかもOK。実験的実装を行っている。
[Clang]規格準拠っぽい。
[gcc]アルファベットと数字とかだけ。規格非準拠。

　Clangでコンパイル通ったのにAndroid開発環境のアセンブラがエラーを吐くパターンもありました。

　自分が遭遇した例だと、上下左右より↑↓←→の方が見やすいと思って変数名に使ったら、規格的にはNGでした。
　この辺りはMSVCというか規格のバグのような気もします。

```cpp

int main()
{
    int abc = 0;//どの環境でもOK
    int あ = 0;//gccではエラー
    int ↑ = 0;//clangでエラー、MSVCは実験的実装によりOK
}

```

##ファイル名に使える文字
　OSによって違います。
　MacやWindowsは大文字小文字を区別しませんが、GNU/Linuxは区別するので注意が必要。include時の大文字小文字はファイル名に合わせましょう。
　日本語ファイル名はエンコードがややこしいので使わない方が良いでしょう。
あとAndroidは画像等のリソースファイル名に大文字が使えません。

　なので、ソースファイル名はアルファベット大文字、小文字とアンダーバーのみ。
画像ファイル名はアルファベット小文字とアンダーバーのみ、とかにしときましょう。

　ヘッダーファイルとかだとコンパイルエラーになるので良いけど、画像ファイル名とかが間違ってたり制限にかかると、何で実行時エラー???みたいになってハマります。

##ソースコードの文字エンコーディング
　MSVCデフォルトのShift-JISでエンコードしてて、他環境で文字化けみたいなパターンがあります。
　MSVCの場合、ソース内にShift-JISに無くてUTF-8にある文字を入れておけばUTF-8(BOM有り)で保存されるため大体安心です(オプションで確認は消せる)著作権表記を©にしておくと違和感無いですね。

```cpp
//Copyright© hogehoge 2015～
```

　しかしMSVCだとUTF-8(BOM無し)は対応してないっぽく、XCodeでUTF-8(BOM無し)等で保存したり改行コードが違ったりすると、エンコードを変更しなおす必要が出たりします。MSVC以外を使う人がUTF-8(BOM有り)にして改行コードを合わせるか、ツールで変換して使うなりする感じで良いと思う。

　関係無いですが、昔は文字エンコードがShift-JISだとコメントの末尾を改行と解釈して次の行を無視してどうのこうのみたいのがありましたが、最近の環境だとそういうエラーが起こらないようなコンパイルオプションがデフォルトでオンになっているようです。

##リテラルの文字エンコーディング
文字リテラルのエンコードは環境によって違うので注意。
MSVCはShift-JISが標準で他はUTF-8が標準なので、UTF-8に統一するのが楽ですMSVC用に一行書いときましょう。
MSVC以外だと無視されます。
setlocaleもしといた方が良いです。

```cpp

#pragma execution_character_set("utf-8")

int main()
{
std::setlocale(LC_ALL, "Japanese");
}
```

##ファイル入出力
　環境や実行方法によって、実行ファイルの直下だったりプロジェクトのディレクトリだったり、ファイルの出力先や入力元が変わります。
　ディレクトリ操作系の関数は環境によって統一されてない感じなので、boost::filesystemとか使えば良いと思う。標準入りはよ。

```cpp

#include <fstream>

int main()
{
	std::ofstream ofs( "hogehoge.txt" );

	ofs << "test" << 123 << std::endl;

	return 0;
}

```

##乱数
　Cのrand()関数はclangとgccは同じアルゴリズムらしいので同じ数値が得られますが。
MSVCは互換性の関係からか線形合同法使ってるらしく、違う値が得られて、結果も偏ります。

 c++の"random"関連なら、同じシードから同じ値が得られます。そっちを使いましょう。

```cpp

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int count[4] = {0,0,0,0};

    for (int a = 0; a < 1024*256; ++a)
    {
        count[rand() % 4]++;
    }
    //MSVCだとあからさまに偏ってる
    printf("%d,%d,%d,%d\n", count[0],count[1],count[2],count[3]);
}

```

##まとめ
　大体の面倒毎は文字コードですね、移植するまで問題に気付け無いし。
なおメイン環境がclangやgccでMSVCでビルドする必要が出た場合は他にも気をつける事がある模様。