OmniAICreator/Qiita-1.07M huggingface dataset:
rsync --delete で泣かないために

## はじめに

ファイルを別のディレクトリにバックアップする際は [rsync](http://x68000.q-e-d.net/~68user/unix/pickup?rsync) コマンドが便利ですよね！
そして `--delete` オプションも活用すると、コピー元で削除されたファイルをコピー先でも削除してくれるので
ディレクトリの内容を同期するのに便利です。
ミラーリング用のアプリなんてもう要らねえ！
ただし、不用意に `rsync --delete` を利用すると……**死にます！**
  
僕も今日、複数の外付けハードディスクのデータを整理するのに
(僕自身は普段あまり使わない) rsync コマンドを `--delete` オプションとともに利用していました。  
その時、事件は起こりました。
不用意にこのコマンドを実行してしまったがために、コピー先のディレクトリに存在した削除したくない、大切なファイル群まで消してしまったのです！

というわけで、僕と同じような rsync 初心者の方が同じような悲劇を生まないためにも
この記事を残します。

## 具体例

例えば、以下の様なディレクトリ構成を想定します。
`src` がコピー元、`dst` がコピー先のディレクトリです。

```
home/
  ├ src/
  │  └ magica/
  │        ├ devil/
  │        │    └ homura.txt
  │        ├ kyoko.txt
  │        ├ madoka.txt
  │        └ sayaka.txt
  └ dst/
     └ mami.txt
```

これを rsync を利用して以下のような構成にしたいです。

```
home/
  ├ src/
  │  └ magica/
  │        ├ devil/
  │        │    └ homura.txt
  │        ├ kyoko.txt
  │        ├ madoka.txt
  │        └ sayaka.txt
  └ dst/
     ├ magica/
     │      ├ devil/
     │      │    └ homura.txt
     │      ├ kyoko.txt
     │      ├ madoka.txt
     │      └ sayaka.txt
     └ mami.txt
```

今回のポイントは以下の2つです。

1. `src/magica` ディレクトリを `dst` ディレクトリ以下にコピーしたい。
1. `dst/mami.txt` は大切なファイルなので削除しちゃだめ！ 

この場合に、以下のどちらのコマンドを実行するかで運命が大きく変わります。

```console
$ rsync -av --delete src/magica dst
$ rsync -av --delete src/magica/ dst
```

今回の場合は上が正解のコマンドです。
下のコマンドを実行すると、以下のようなディレクトリ構成になってしまいます。

```
home/
  ├ src/
  │  └ magica/
  │        ├ devil/
  │        │    └ homura.txt
  │        ├ kyoko.txt
  │        ├ madoka.txt
  │        └ sayaka.txt
  └ dst/
     ├ devil/
     │    └ homura.txt
     ├ kyoko.txt
     ├ madoka.txt
     └ sayaka.txt
```

**マミった！！！**

## なぜマミさんは死んだのか

rsync コマンドで重要なのが、**コピー元の最後が / (スラッシュ) で終わるか終わらないかで挙動が異なる** ということです。
**/ で終わる**場合、**コピー元のディレクトリ自体はコピーせずに、ディレクトリ内のファイルをすべてコピーする**という挙動になります。
こんなイメージですかね。

```console
$ rsync -av --delete src/magica/* dst
```

そのため、`magica` ディレクトリはコピーされず、その中にあったファイルが `dst` ディレクトリ以下にコピーされたのです。
ここで悲劇的なのが `--delete` オプションを指定したために、コピー元の `magica` ディレクトリ以下にないと判断された `mami.txt` が削除されたことです。

`/` さえ無ければ `magica` ディレクトリごとコピーされ、このような悲劇は起きなかったのに…。

## その他の対策として

そもそも `--delete` というファイルの削除を伴う危険なオプションを利用しているのにもかかわらず、
不用心にもそのまま実行したのが間違いでした。
こういう場合は **dry-run (お試し実行)** すべきです。
もちろん rsync にも dry-run 用のオプションが存在します。`-n` オプションです。

```console
$ rsync -avn --delete src/magica/ dst
building file list ... done
deleting mami.txt
./
kyoko.txt
madoka.txt
sayaka.txt
devil/
devil/homura.txt

sent 213 bytes  received 56 bytes  538.00 bytes/sec
total size is 0  speedup is 0.00
```

`deleting mami.txt` だって！？ 危ない危ない…。

```console
$ rsync -avn --delete src/magica dst
building file list ... done
magica/
magica/kyoko.txt
magica/madoka.txt
magica/sayaka.txt
magica/devil/
magica/devil/homura.txt

sent 224 bytes  received 56 bytes  560.00 bytes/sec
total size is 0  speedup is 0.00
```

⊂(＾ω＾)⊃ ｾﾌｾﾌ

これで心置きなく `rsync --delete` を実行できますね。

```console
$ rsync -av --delete src/magica dst
```

## 参考

* [はじめてrsyncを使う方が知っておきたい6つのルール](http://www.itmedia.co.jp/enterprise/articles/0804/21/news013.html)
Flex/AIR(ActionScript3.0)を使ってみてダメだったところ

##FlexおよびActionScript3.0でどんなことをやってきたか
・サーバー連携する業務アプリケーションの開発
・同人ゲームの開発

##ダメだったところ

###埋め込みデータが増えるとコンパイルがどんどん遅くなり、終いにはエラー。
コンパイラがとにかく重い。特にファイルの埋め込みを行うと顕著に重くなる。
埋め込みファイルの形式にもよるが、40～50MBほどの埋め込みになると頻繁にコンパイル時にJavaのヒープエラーが起きるようになり、コンパイルすらできなくなる。
仕方ないので一部ファイルを埋め込みではなく外部ファイルとしてロードすることで解決。

###バグが多い。不可解な挙動が多い。
データグリッドなどは高度なことをしようとすると毎週のようにバグが見つかるレベルの品質。
データグリッドはそもそも複雑なコンポーネントだから多少は仕方ないとしても、それ以外でも仕様なのかバグなのか不可解な挙動も多い。
例えば親コンポーネントと子コンポーネントのサイズがずれていないとクリッピングが効かないなど。

###実行速度が遅い
V8など高速なJavaScript処理系が増えてきたなか、AS3.0の実行速度はすごく遅く感じる。
CPUを使うような計算はサーバーサイドを使えるならサーバーサイドで行った方がよい。

###AIR形式での配布時にコードサイニング証明書が必要になる
インストーラーにコードサイニング証明書を付けないと警告が表示されてしまう。
そしてこのコードサイニング証明書は有効期限があるうえにすごく値段が高い。
年間２万円とかするので個人では気軽に払えない。

###Flex自体の開発速度が遅い
次世代コンパイラ(ASC2.0)などはもう何年も開発しているはずなのに、いまだにMXMLの解釈ができないなど、なかなか開発が進んでいない。
バグフィックスも遅い。
AdobeはもうFlexにあまり投資する気がないのかもしれない。オープンソース化したから後は勝手にやってねってことなのかもしれない。
ターミナルマルチプレクサ手習い


「GNU Screenとか古い」とdisられるのに耐えられなくなったわけではなく新幹線の中でネットがなくてヒマなのでtmux覚えるね、ごめんね。隣に座っているお姉ちゃんが美人。

## なにはともあれ

```sh
$ brew install tmux
$ man tmux
```

## .oh-my-zshだ

zshのconfiguration自分でゼロからやると日が暮れるので満を持してoh-my-zsh導入したけど、これまでの挙動と違うのがイラつくので結局自分で書き足すし、テーマも適当なやつを自分でちょっと書きかえたりして日が暮れた。[github/inuntano/oh-my-zsh](https://github.com/inutano/oh-my-zsh)に置いてある。

oh-my-zshでtmux pluginを有効にするには.zshrcのpluginsに渡すArrayにtmuxって入れてあげればいいんだけど、boxenで入れたbrewに先にpathが通ってないとplugin読み込んだ時にエラーを吐くので、順番を変えて先にPATHを通してやるとよい。

```.zshrc
# template from .oh-my-zsh/templates/zshrc.zsh-template

# Configure PATH before loading plugins
export PATH=$HOME/local/bin:/opt/local/bin:/usr/local/bin:/usr/bin:/bin:/opt

# configuration for boxen
[ -f /opt/boxen/env.sh ] && source /opt/boxen/env.sh
[ -f /opt/boxen/nvm/nvm.sh ] && source /opt/boxen/nvm/nvm.sh

# Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*)
# Custom plugins may be added to ~/.oh-my-zsh/custom/plugins/
# Example format: plugins=(rails git textmate ruby lighthouse)
# Add wisely, as too many plugins slow down shell startup.
plugins=(git ruby osx bundler brew emoji-clock vagrant tmux docker)

source $ZSH/oh-my-zsh.sh
```

我が家の.zshrcはこんな感じになっている。

## キーバインドだ

「「師匠の教えでGNU Screenもprefixを変更していたのでtmuxでも同じようにしておきたい。GNU ScreenのデフォルトはCtl+a、tmuxのデフォルトはCtl+bだが、ウチの流派はCtl+zなので、そのように変更する。ついでに、tmuxのステータスバーの緑色が気に入らないので南イタリアの空と海の色に変更する。

```.tmux.config
# locate in ~/.tmux.config

# Change prefix key
set-option -g prefix C-z
unbind-key C-b
bind-key C-z send-prefix

# Change status bar color
set-option -g status-style bg=blue
```

こんな感じ。

## 起動と終了

起動すると新規のWindowが立ち上がる。Windowは分割できるので、分割された1つ1つはpaneと呼ばれる。paneを全部潰すとWindowが死んで、Windowが全部死ぬとtmuxが終了する。GNU Screenとだいたい一緒。作業途中のものをdetachしたり、sshが切れて強制的にdetachされたりしたものは再度attachすればそのまま使える。GNU Screenと一緒。もうこれGNU Screenでいいんじゃないか。

```sh
# Start a tmux session with specifying name, -s means "specify"
$ tmux new-session -s "atarashiiasagakitakibounoasada"

# Detach
# Ctl-z + d

# List detached window
$ tmux list-session
# => atarashiiasagakitakibounoasada: 1 windows (created Wed Aug 13 14:51:30 2014) [149x39]

# Attach: Specify name of window to attach, -t means "target"
$ tmux attach -t "atarashiiasagakitakibounoasada"

# Kill pane
# Ctl+z + x
```

ただでさえセッションの名前が長いのにコマンドをいちいち打っていられるか、ということでoh-my-zshのtmuxプラグインがaliasを用意してくれています。親切ですね。

```sh
# Start a new tmux session with specifying name
$ ts "atarashiiasagakitakibounoasada"

# Detach
# Ctl-z + d

# List detached window
$ tl

# Attach
$ ta "atarashiiasagakitakibounoasada"

# Kill pane
# Ctl-z + x
```

随分と楽になった。ちなみにattachではzshで補完も効くのでわざわざ長いセッション名をタイプする必要もない。とても便利ですね。

## tmux起動中のコマンド一覧

必要そうなものしか並べない。そんなに沢山覚えられないし。コマンドの前に打つprefixは省略します。

|Command  |Description               |
|:-------:|:------------------------:|
|%        |左右にウィンドウを分割する     |
|"        |上下にウインドウを分割する     |
|o        |paneを移動する              |
|c        |新しいウィンドウ             |
|n        |次のウインドウに移動する      |
|p        |前のウインドウに移動する      |
|[        |コピーモードに移行           |
|Ctl+space|copymode: 選択開始          |
|Ctl+w    |copymode:コピーしてコピー終了 |
|]        |コピーした文字列をペースト     |
|t        |時計が出る                  |

美人のお姉さんは岡山で降りていきました。
Railsのアソシエーションに合わせてAFNetworkingからPOSTする。


タイトル意味不明かつ、あんまり確証がないのでご指摘をお待ちしてます＞＜

# やりたいこと
Carrierwaveを使って画像の保存をしているRailsのアプリケーションに対して、iOS側からPOSTできるようにしたい。

## Railsのモデル

モデル名は適当です。適当にしたから余計にわかりにくくなってるかも…

```ruby:
class Post < ActiveRecord::Base
  has_many :comments, dependent: :delete_all
end

```

```ruby:

class Comment < ActiveRecord::Base
  belongs_to :post
  mount_uploader :image, ImageUploader
end

```

つまり、

- PostモデルはCommentモデルを複数持っている。
- Commentモデルには画像がある。

なので1つのPostに複数の画像が入る場合がある。

```#{Rails.root}/posts ```にPOSTのリクエストを投げることでPostモデルが作成される。

## Objective-Cのコード

```objective-c:

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    
	//POSTするパラメータを設定。
    NSDictionary *parameters = @{@"post": @{@"title": @"form-iOS-t"}};

	//今回、投稿するための画像はローカルにある画像を使用。
    UIImage *image = [UIImage imageNamed:@"one.png"];
    NSData *imageData = UIImagePNGRepresentation(image);

	
	//POSTリクエストの作成    
    
    [manager POST:@"http://localhost:3000/posts.json" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {

		// comments_attributes、複数あるならその分[0]内の数字が増えていくと思う。
        [formData appendPartWithFileData:imageData name:@"post[comments_attributes[0][image]]" fileName:@"image.png" mimeType:@"image/png"];
    
    } success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"Success: %@", responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];

```

こうしてPostのリクエストを送ればRails側はCarrierwaveがよしなにしてくれる気がする。


## 参考資料

- [ios - AFNetworking post image in nested json - Stack Overflow](http://stackoverflow.com/questions/11087678/afnetworking-post-image-in-nested-json)

- [iOS App Using Carrierwave with Rails Backend - Stack Overflow](http://stackoverflow.com/questions/12274180/ios-app-using-carrierwave-with-rails-backend)


- [rails 4 backend and ios image upload - Stack Overflow](http://stackoverflow.com/questions/19851627/rails-4-backend-and-ios-image-upload)


## まだこれから検証すること。

- 複数の画像を入れるにはどうしたらいいか。
Androidでのテストで色々悩んだ結果robotiumになった件

![Robolectric-FINAL.png](https://qiita-image-store.s3.amazonaws.com/0/16532/c79972c0-13b0-9aef-9efc-ae78621e0e45.png)![20110601224550-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/16532/cec3e6b2-c48e-eeda-6cd8-233cc5ddafaa.jpeg)

鹿だよ。
Androidの自動化テストで以下のフレームワークを試してみました。そのレポです。

* Espresso 1.1
* Robolectric 2.3
* robotium 5.2.1

## 結果
いきなり結果ですが、老舗のRobotiumを選びました。残りの２つは不安定だったり、よくわかんなかったりで諦めました。

#[Espresso](https://code.google.com/p/android-test-kit/wiki/Espresso)
Google I/O 2013 で発表されてたので、最近のトレンドは Espresso なのかなーと思って最初に手を出しました。
よく見たらコミットが今年の１月で止まってる・・・。これはもう破棄されてるね・・・。
[Changes - android-test-kit - Google's Testing Tools For Android - Google Project Hosting](https://code.google.com/p/android-test-kit/source/list)

##使えなかったところ
Activityを跨いだ画面遷移のテストの結果がすごく不安定だった。OKだったりNGだったり。

```java
public void testSayHello() {
  //このclickで画面遷移すると仮定する。
  onView(withId(R.id.greet_button))
    .perform(click());

  //遷移後の画面に"Hello Steve!"が表示されるが、このassertはOKだったりNGだったりする。
  onView(withText("Hello Steve!"))
    .check(matches(isDisplayed()));
}
```

#[Robolectric](http://robolectric.org/)
こっちは頻繁に更新されてるし、googleの検索結果も多いので安心感があります。

##使えなかったところ
基本的に Robolectric はgradleから使えない（または使いにくい）。でも、robolectricのチームがgradleのpluginを作ってくれてて、使いやすくなってる。
[robolectric/robolectric-gradle-plugin](https://github.com/robolectric/robolectric-gradle-plugin)

ここまではいいのだけど、ちょいちょいバグがあって、なかなか動かすところまで行かない。動くようになっても、小難しいテストをやろうとするとノウハウが見つからないことが多い。

### applicationIdSuffix バグ
gradleを使ってるなら

```groovy
buildTypes {
  debug{
    applicationIdSuffix ".debug"
  }
}
```
とかして、debug用のパッケージを作ってたりすると思うけど、これが起因のバグがあって動かすことができなかった。

### リソースが見つからない
上記の状態で実行すると
> NotFoundException: no such label string/app_label

となってしまう。ちゃん app/build/intermediates/res/debug/values にあるのに。うーん。。。

### マルチスレッドのテストができない
マルチスレッドの同期がどうしてもできなかった。

```java
    //クリックすると非同期処理が始まる
    clickOn(view);
    
    //ちょっとまってくれる(願望)
    Robolectric.runUiThreadTasksIncludingDelayedTasks() 
    
    //非同期処理終了後、ダイアログが表示されるはずなので取得する。
    AlertDialog alert = ShadowAlertDialog.getLatestAlertDialog();

    //だが、この時点でalertはnull
    assertNotNull(alert);
```

たぶん、もうちょっと勉強したら動くような気がするけど、時間は永遠ではないのでしばらく放置することに。

#[robotium](https://code.google.com/p/robotium/)
Android界隈では老舗のテストフレームワーク。[アップデート](https://code.google.com/p/robotium/wiki/Changelog)も定期的に行われてる。
説明書きが何故かpdfという、ちょっとクレイジーな運用方針だ。

##良かったところ
画面遷移テストは安定してて、非同期テストもちゃんと動く。記法はEspressoより書きにくいけど、ActivityInstrumentationTestCase2 より書きやすくなっている。コード量は今回挙げたフレームワークの中で一番少なくなりそう。

###画面遷移のテスト
わずか２行でできた。やばい。

```java
public void testTerm(){
    //viewのクリック処理
    solo.clickOnView(mActivity.findViewById(R.id.termView));
    //新規に開いたActivityと一致するか
    solo.assertCurrentActivity("利用規約画面", TermWebActivity_.class);
}
```

というわけで、Robotiumでがんばります。
Android Studio(Gradle)でproguard時にログのコードを消す方法

[EclipseからAndroid Studio移行ではまったところメモ](http://qiita.com/shiraji/items/8f0b83d4170710f27dbe)の後に発生した問題。

#ログコードをproguard時に削除する

Eclipseでログコードをproguard時に削除していた。

随所にコードが散らばっているので今頃といえば今頃だけど、削除するコードはこんな感じ。

```
#-dontoptimize

-assumenosideeffects class android.util.Log {
    public static int v(...);
    public static int d(...);
    public static int i(...);
    public static int w(...);
    public static int e(...);
}

// カスタムロッガーの場合は全部消してしまう。
-assumenosideeffects class com.shiraji.Logger {
    <methods>;
}
```

で、それをEclipseではやっていたのだけど、いざ、Android Studioでやってみたら、ログが出力されてた。
デコンパイルしてソースみたらきっちりソース残ってた。

/Applications/Android Studio.app/sdk/tools/proguard/proguard-android.txt

ここにproguard-android.txtが存在していて、そこにはproguard-android-optimize.txtを使えという指示がある。
色々探しても使えばいいとだけしか記載されていなくて、どう使うのこれ？ってはまりました。

移行した直後ではこんな記載になっていました。

```groovy:app/build.gradle
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
```

getDefaultProguardFileの指定をproguard-android-optimize.txtに切り替えれば良いみたいです。

```groovy:app/build.gradle
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-project.txt'
```

このデフォルトで指定された項目にないものをその次のパラメータで渡しているファイルに記載するのが普通みたいです。プロジェクト毎の指定をするためのものです。
問題にはならないのだけど、結構重複していたので、移行時に綺麗にしたほうがよいです。

そもそもEclipseのときのproguardの使い方が間違っていたのでは？という感じですが・・・。



string.xml/AndroidManifest.xmlの扱い方にもはまったのですが、ちょっと書く時間がないので、次回にします。
Mac OSXに「FabModules」をインストールする


#概要
- FabModulesのインストール手順のメモ(2014/8/9時点)です。
- FabModulesとは、ファブラボのさまざまな機材で使えるCAMソフトウェアです。
- 基本的な内容は[公式サイト](http://kokompe.cba.mit.edu/downloads.html)と同じで、コマンドライン操作に慣れていない方向けにまとめます。
- 日本語版fabmodulesのインストール手順が[こちら](http://fabos.sfc.keio.ac.jp/?p=208)にありますが、私はインストールに失敗した（core/gif_stl.cのコンパイルエラー？）ので、ここでは英語版の手順を解説します。

#作業環境
- MacOSX Mavericks(10.9.3)

#手順
##0.下準備
###セキュリティ設定
1.「システム環境設定」→「セキュリティとプライバシー」→「一般」を開く
2. 「ダウンロードしたアプリケーションの実行許可」で「すべてのアプリケーションを許可」を選択　


次に、以下のソフトウェアをインストールします。

- Command Line Tools
- Homebrew

###Command Line Toolsのインストール方法
1. XCodeをインストール（[ここ](https://developer.apple.com/jp/xcode/)からダウンロードできます）
2. 「ターミナル.app」を起動
3. 以下のように入力して実行（Enterキーを押す）

	````
	xcode-select --install
	````

4. エラーが出てインストールできないかもしれません。その場合は[こちらの手順](http://taamemo.blogspot.jp/2014/06/osx-mavericks-command-line-tools.html)を参照ください。

###Homebrewのインストール方法

1. 「ターミナル.app」で以下のテキストをコピペして実行（Enterキーを押す）

	````
	ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
	````

3. ターミナル画面の動きが止まるまで待って「Installation successful!」という文字が出力されていたら、OKです。以降もターミナルを使って作業するので、画面を閉じないでください。
*（Homebrewについて詳しく知りたい方は[こちら](http://qiita.com/b4b4r07/items/6efebc2f3d1cbbd393fc)）*

##1. 必要なパッケージをインストール
以下のパッケージをインストールしていきます。

- boost
- cmake
- libpng
- giflib
- wxPython

1. Boost, cmake, libpng, giflibをインストールします。ターミナルで以下の通り入力して、実行します。

	````
	brew install boost cmake libpng giflib
	````

2. wxPythonをインストールします。[ここ](http://www.wxpython.org/download.php#unstable)にある「wxPython3.0-osx-cocoa-py2.7」をダウンロードします。こちらは、ターミナルを使わずにダブルクリックしてインストールします。

##2. FabModulesのインストール
1. [FabModuleのページ](http://kokompe.cba.mit.edu/downloads.html)からファイルをダウンロードします。ページ一番上の「All Modules」→「Download」 をクリックすると「fab_src.zip」がダウンロードされます。
2. 「fab_src.zip」を適当な場所に置いて解凍します。以降、ホームフォルダ（ユーザ名のついているフォルダ）に置いた場合で説明していきます。
3. ターミナル上で、先ほど解凍してできた「fab_src」フォルダに移動します。移動するために、ターミナルで以下を実行します。

	````
	cd ~/fab_src
	````

	次に、以下のように入力、実行します。

	````
	make fab
	````

	ターミナル画面の動きが止まるまで待ちます（数分かかります）。エラーが出なければ、以下を実行します。

	````
	make install
	````


4. 起動するかどうか確認します。以下を実行します。

	````
	fab
	````

	FabModulesのウィンドウが起動したら成功です！
グローバルにインストールしたnode moduleがnot foundになる時の対処


いつのまにかグローバルにインストールしていたはずのbowerやgrunt(grunt-cli)コマンドを叩くとnot foundって言われてしまうようになっていました。

復旧しましたが、同じような方がいらっしゃるかも知れないので、メモ的に残しておきます。
(あくまで僕はこれで復旧しました、というだけなので、他の方には当てはまらないかもしれません。)

## 環境
- OS : Mac OSX Marvericks
- npm: 1.3.11


### bowerコマンドが使えなくなった例

```bush
▶ which bower
bower not found
```

## node moduleがグローバルにインストールされているか調べる
まずは下記コマンドでグローバルのnode_modulesディレクトリの場所を調べます。


```bash
npm root -g
```

表示されたディレクトリの中にmoduleがいれば、インストールは正常です。

```bash
▶ ll /opt/boxen/nodenv/versions/v0.10/lib/node_modules
drwxr-xr-x  18 nobody         staff   612B  8 13 21:59 bower
..
```


## pathを確認する
インストールができているのに実行できなければ、パスが通っていないのでは、と思い至ります。僕はこれでした。

まずは下記コマンドでnpmがグローバルで使用しているディレクトリを調べます。

```bash
npm bin -g
```

表示されたディレクトリの中身を確認します。

npmでインストールしたコマンドラインツールの実行スクリプトは、ここにsymlinkが貼られるはずです。

```bash
▶ ll /opt/boxen/nodenv/versions/v0.10/bin
lrwxr-xr-x  1 root           staff    35B  8 13 21:59 bower -> ../lib/node_modules/bower/bin/bower
..
```

ここまで正常なら、pathを通せば実行できるようになるはずです。

以下のコードでは`npm bin -g`の結果にpathを通すようにしています。

```bash
export PATH=$PATH:`npm bin -g`
```

## 補足
グローバルのnpm rootやnpm binの場所は`npm config set prefix /foo/bar/path`で変更可能です。
`npm config set prefix /usr/local`とすれば`/usr/local/lib/node_modules`がインストール先になります。
Go for Windows: ビルド時に「Git の」バージョン情報を埋め込みたい

* [Go言語: ビルド時にバージョン情報を埋め込みたい](http://qiita.com/suin/items/d643a0ccb6270e8e3734)

よーし、おじさんも、Git のリビジョン番号を埋め込んじゃうぞー！

```mf:Makefile
build :
	for /F %%V IN ('git log -1 --pretty^=format:%%H') DO go build -ldflags "-X main.version [SNAPSHOT-%DATE:/=%-%%V]"
```

すまない、**nmake** 以外は帰ってくれないか？

* これで `main.version` という変数に `[SNAPSHOT-(ビルド日付)-(gitのリビジョン)]` という値が設定される
* git のオプションは`--pretty=format:%H` なんだけど、`%`で囲まれた範囲に `=` があると置換だと CMD.EXE が判断してしまうので、`^` で `=` をエスケープする。

なお、Go側のコードについては、[元記事](http://qiita.com/suin/items/d643a0ccb6270e8e3734)を読んだ方が身のためだ。

まぁ、それにしても Go タグがついてるけど、Go のコード全然出てこないね！どちらかというとバッチ芸…

以上
NVIDIAのドライバでOpenCLをやる

OpenCLでDFTやろうかなって思ったのですが，導入でハマったので忘備録を．

#OpenCL用のドライバをインストール
GPGPU用のドライバは各ベンダーで配布されています．
もし，GPUがNVIDIAであればNVIDIAの，AMDであればAMDのドライバを使います．
僕のマシンはNVIDIAが入っているので，NVIDIAのドライバを入れます．

昔はCUDA ToolkitとSDKは別々だったのですが，CUDA 6になった辺りから全部1つに統合されたみたいです．
下のリンクから該当する環境のインストーラを落としてください．

https://developer.nvidia.com/cuda-downloads

#環境変数の確認
ドライバのインストールが終わると，自動的にパスが通っていると思います．
重要なパスは以下の4つです．

* CUDA_PATH
* CUDA_INC_PATH
* CUDA_LIB_PATH
* CUDA_BIN_PATH

ところが，僕の環境だとCUDA_PATHしか設定されていませんでした．
とてもつらいです．

もし，CUDA～PATHが設定されていなければ，コマンドプロンプトを開いて以下のコマンドを実行するか，バッチファイルに保存して実行させるかどちらかを試してみてください．

```cuda_env.bat
setx /M CUDA_INC_PATH "%CUDA_PATH%\include"
setx /M CUDA_BIN_PATH "%CUDA_PATH%\bin"
setx /M CUDA_LIB_PATH "%CUDA_PATH%\lib"
```

ちなみに，CUDA_PATHのディレクトリは
```インストール先/NVIDIA GPU Computing Toolkit\CUDA\v6.0```
になっています．

#Visual Studioでパスを通す
適当なC++プロジェクトを開きます．
今回は設定の仕方なので，面倒くさい場合は空のプロジェクトを作るといいでしょう．

プロジェクトのプロパティを開いて，以下の3点の設定をします．

* インクルードディレクトリの設定
* ライブラリディレクトリの設定
* 依存ライブラリの設定

構成は「全ての構成」にしておいてください．
今回はお試しなのでDebugでもいいのですが，Releaseで設定し直すのが面倒くさいので，ライブラリ関係はなるべく全ての構成で設定すると楽です．

##インクルードディレクトリの設定
[構成プロパティ]-[C/C++]-[全般]を開いてください．
追加のインクルードディレクトリと言う項目がありますので，```$(CUDA_INC_PATH)```と設定してください．

##ライブラリディレクトリの設定
[構成プロパティ]-[リンカー]-[全般]を開いてください．
追加のライブラリディレクトリがあるはずなので，```$(CUDA_LIB_PATH)\Win32```と入力してください．

x64向けの設定方法は最後に書きます．

##依存ライブラリの設定
[構成プロパティ]-[リンカー]-[入力]を開いてください
追加の依存ファイルというのがあるので，そこに```OpenCL.lib```と入力してください．

これでビルドの準備ができました．

#ビルドして実行してみる
以下のコードを入力してみて，何事もなければ成功です．
お疲れ様でした．

```Source.cpp
#include <CL\cl.h>

int main() {
	cl_platform_id test;
	cl_uint num;
	cl_uint ok = 1;
	clGetPlatformIDs(ok, &test, &num);
	return 0;
}
```

#x64の設定をしたい場合
x64でビルドする場合は，また面倒くさい設定をしなければなりません．
まずは，今までの設定を全て終わらせている状態にしてください．

プロジェクトのプロパティを開いて，構成マネージャを立ち上げてください．
構成マネージャに「アクティブソリューションプラットフォーム」というプルダウンリストがあります．
これをこれをクリックすると，＜新規作成＞という項目があるので，それをクリックします．

すると，新しいソリューションプラットフォームというウィンドウが出てくるので，そこの「新しいプラットフォームを入力（ｒｙ」というリストボックスから，「x64」を選択し，OKボタンを押します．

また，プロジェクトのプロパティに戻るのですが，構成を「すべての構成」，プラットフォームを「x64」にしてください．
[構成プロパティ]-[リンカー]-[全般]の「追加のライブラリディレクトリ」ですが，これを```$(CUDA_LIB_PATH)\x64```に変更してください．

ここからは独り言なのですが，もしかするとVisual Studioがもっと賢い子であれば，ライブラリディレクトリの子ディレクトリもプロジェクトに追加してくれると思うのですが，どうでしょう？
vagrant upが立ち上がらないときの対応

http://qiita.com/kanpou_/items/315b53ac31e2811c2ba1
vagrant upが成功しないとき

GUIモードで起動しても真っ暗なまま
以下のサイトを見ると似た症状で
「仮想化支援機構(VT-x/AMD-V)を有効化できません。64ビットゲストOSは64ビットCPUを検出できず、起動できません。」とエラーメッセージが出ている。
http://futurismo.biz/archives/1647
このメッセージが出ていない状態だと判断

windows再起動>F1でBios設定
Security > Virtualization > Intel(R) Virtualization Technology
を”Enabled”に設定
jQuery.DeferredでjQuery UI Dialogを逐次処理させてみた

jQuery UIのDialogを以下のように拡張してやると、Yes, Noを選択したときの
処理制御は簡単に実装できます。

```js
function confirmDialog(message, funcYes, funcNo) {
    $("#dialog-confirm-message").text(message);
    $("#dialog-confirm").dialog({
        width : 600,
        height : 400,
        modal : true,
        buttons : {
            "はい" : function() {
                $(this).dialog("close");
                if (funcYes)
                    funcYes();
            },
            "いいえ" : function() {
                $(this).dialog("close");
                if (funcNo)
                    funcNo();
            }
        }
    });
}
```

警告は出したい。
しかし、ユーザーが許可した場合に限っては、処理を継続するダイアログを
使いたい場面があったので、jQuery.Deferredを使って実装してみました。

```js
function sequentialConfirmDialog(arr) {
  var dfd = $.Deferred();
  if (arr.length == 0) {
    dfd.resolve();
  } else {
    var message = arr.pop();
    sequentialConfirmDialog(arr).done(function() {
      var funcYes = function() {
        dfd.resolve();
      };
      var funcNo = function() {
        dfd.reject();
      };
      confirmDialog(message, funcYes, funcNo);
    });
  }
  return dfd.promise();
}
```

引数の配列には、表示したいメッセージを表示したい順に入れています。
多次元配列にしてfuncYes, funcNoでやりたい処理を入れることも可能です。

実例は、、、手元にないので気が向いたら更新します。
Processing for Androidの環境構築

ProcessingのプログラムをAndroidデバイスに転送して動かすまで。
環境：Windows 7, Processing 2.1


だいたい[こちら](http://www2.kobe-u.ac.jp/~tnishida/course/2013/programming/android.htm)のサイトに書いてあるとおりでできるが、若干つまづいたので。

1. JDKを入れる
3. 環境変数JAVA_HOME, PATHにJDKのbinを追加
2. Android SDKを入れる
3. Android SDK managerを開いて、platform, API10, USB driver, AndroidデバイスのバージョンのAPIにチェックを入れ、インストール
4. ProcessingでAdd Mode→Androidで検索→install
5. Processingを再起動してAndroidモードに切り替え。Android SDKの場所を入力する必要が有ることも
6. AndroidデバイスのUSB debuggingモードをONにする
7. AndroidデバイスをUSBで接続
8. デバイスのドライバを[入れる](http://note.chiebukuro.yahoo.co.jp/detail/n128056)

これでRun on deviceが通るようになるはず。
setterとgetter

gettersetterの使い方を教えて下さい。
参考書などには、「セットする」や「投げる」と書いてありますが、よくわかりません。
get◯◯◯とset〇〇◯は何が違うのでしょうか？

詳しく教えていただきたいです。
または、わかりやすいサイトでも構いません。

よろしくお願い致します。
Emplacementについて


## 概要
STLのコンテナで要素を追加する時にC++11からemplacementというものを使うことで、オブジェクトの無駄な生成と破棄を防ぐことができるということを知ったので少しだけ試してみました。

## std::vectorを使って検証

```cpp:Person.h
class Person
{
public:
  Person(int age, const std::string& name);
  Person(const Person& other);
  ~Person();
  
private:
  int age;
  std::string name;
};
```

```cpp:Person.cpp
Person::Person(int age, const std::string& name)
{
  std::cout << "Constructor is called." << std::endl;
  this->age = age;
  this->name = name;
}

Person::Person(const Person& other)
{
  std::cout << "Copy Constructor is called." << std::endl;
  this->age = other.age;
  this->name = other.name;
}

Person::~Person()
{
  std::cout << "Destructor is called." << std::endl;
}
```

簡単なPersonクラスを使ってオブジェクトの生成と、std::vectorへの要素の追加を試してみます。とりあえず、push_backとemplace_back, insertとemplaceで調べてみます。

```cpp:main.cpp
int main(int argc, const char *argv[])
{
  std::vector<Person> vec;

  std::cout << "------------ push_back ---------------" << std::endl;
  vec.push_back({15, "Yumi"});
  vec.clear();
  
  std::cout << "------------ emplace_back ---------------" << std::endl;
  vec.emplace_back(16, "Mark");
  vec.clear();
  
  std::cout << "------------ insert ---------------" << std::endl;
  vec.insert(vec.begin(), {20, "Taro"});
  vec.clear();
  
  std::cout << "------------ emplace ---------------" << std::endl;
  vec.emplace(vec.begin(), 24, "Green");
  vec.clear();
}
```

```cpp:Result
------------ push_back ---------------
Constructor is called.
Copy Constructor is called.
Destructor is called.
Destructor is called.
------------ emplace_back ---------------
Constructor is called.
Destructor is called.
------------ insert ---------------
Constructor is called.
Copy Constructor is called.
Destructor is called.
Destructor is called.
------------ emplace ---------------
Constructor is called.
Destructor is called.
```

結果を見てみるとEmplacementを使った方は使ってない方と比べて、オブジェクトのコピーと破棄が**一回ずつ少ない**ことが確認できました。

##  まとめ
単純な検証ではありましたが、ドキュメントを読んでよくわからなかったので実際に動かしてみて確認すること理解が深まりました。今まではpush_backしか使ったことがなかったので使える場面ではemplaceを使っていきたいと思います。

## 参考文献
[Placement Insert] (http://faithandbrave.hateblo.jp/entry/20080930/1222768173)
[cpprefjp] (https://sites.google.com/site/cpprefjp/reference/vector/emplace_back)
node.js | node.js ・CoffeeScript・Hubot を Windows7環境にインストールする

# node.js | node.js ・CoffeeScript・Hubot を Windows7環境にインストールする

## 概要
node.js・CoffeeScript・Hubot を Windows7環境にインストールする

## 手順

* http://nodejs.org/ にアクセスし、 Install のリンクを押下してインストーラを取得
* インストーラを実行し、ウィザードに沿ってインストール。

## 確認

~~~bash
$ node -v
v0.10.30
$ npm -v
1.4.21
~~~

## Coffee Scriptのインストール/試行

~~~
$ npm install -g coffee-script
$ coffee -v
CoffeeScript version 1.7.1
$ echo 'console.log("hoge")' > hoge.coffee
$ coffee hoge.coffee
hoge
~~~

## 補足

hubot のインストールと動作確認をしてみたが、下記のような挙動に

~~~bash
# ここは問題なく成功
$ npm install -g hubot

$ hubot -v
2.8.0

# bot の作成。これも成功
$ hubot -c test_hubot

$ cd test_hubot

# hubot の shell adapter 起動
$ ./bin/hubot
Error: EINVAL, invalid argument
  at new Socket (net.js:156:18)
  at process.stdin (node.js:664:19)
  at process.openStdin (node.js:702:14)
# : 以下エラーログ
~~~

上記は cygwin で試していたので、 コマンドプロンプトで試してみる

~~~bat
$ cd %hubot%
$ ./bin/hubot
[Wed Aug 13 2014 21:52:54 GMT+0900 (東京 (標準時))] WARNING The HUBOT_AUTH_ADMIN
 environment variable not set
Hubot>
Hubot>
Hubot>
Hubot> hubot ping
Hubot> PONG
~~~

成功。ぐぬぬ。
Hubot 関連記事まとめ

# Hubot 関連記事まとめ

更新日: 2014/09/10 22:35:54

|No.|タイトル|作成日|ストック数|
|--:|:--|:--:|--:|
|1|[Gviz で Reveal.js を利用したスライドサーバーの開発・運用構成図を作成する](http://qiita.com/tbpgr/items/4fff34ac86935e90372d)|2014/09/10 21:45:40|1|
|2|[Hubot  Hubot の core scripts の別名呼び出し](http://qiita.com/tbpgr/items/494efe5e26d43a6466c1)|2014/08/13 21:57:17|1|
|3|[Hubot  Hubotの shell adapter を試す](http://qiita.com/tbpgr/items/d31d387366e5e72638e9)|2014/08/06 00:18:29|4|
|4|[Hubot  HubotのScriptを自作する - デスマコロシアムのURLを返却するScript](http://qiita.com/tbpgr/items/7ed860b22ea6c7191111)|2014/08/06 22:42:29|4|
|5|[Hubot  Hubotのインストール](http://qiita.com/tbpgr/items/d41481ce6f0bd4a4417f)|2014/08/06 00:14:06|1|
|6|[Hubot  core scripts から学ぶ Hubot で出来ること](http://qiita.com/tbpgr/items/daee29853e386b7fe8d2)|2014/08/13 21:46:29|1|
|7|[Hubot  forever で Hubot(Hubot-Kandan adapter) をデーモンとして起動する](http://qiita.com/tbpgr/items/eb876eb2847ef55e218e)|2014/08/11 21:46:22|2|
|8|[Hubot  自作Script   Hubot で 「今日は何の日」API の結果を取得する](http://qiita.com/tbpgr/items/b678fc4ba2a9b11b4bb9)|2014/08/29 02:09:42|1|
|9|[Hubot  自作Script  Hubot で 「フォト蔵」API の結果を取得する](http://qiita.com/tbpgr/items/0a7b989b10e742256033)|2014/08/29 21:57:44|0|
|10|[Hubot  自作Script  chusen.coffee - 抽選する](http://qiita.com/tbpgr/items/1aa6158333efcbce5e7b)|2014/08/14 21:33:32|0|
|11|[Hubot  自作Script  codeiq_new.coffee - CodeIQの新着問題をRSSから取得する](http://qiita.com/tbpgr/items/ea7c17cd1ec3690de1a0)|2014/08/17 19:44:17|2|
|12|[Hubot  自作Script  gitlab_api_sample.coffee - GitLab API を利用した Hubot - GitLab - Kandan の連携を検証するサンプル](http://qiita.com/tbpgr/items/d6272cdf911cefbc4ad1)|2014/08/26 21:38:46|1|
|13|[Hubot  自作Script  gitlab_ci_sample.coffee - GitLab CIとの連携を検証するサンプル](http://qiita.com/tbpgr/items/a2b0dfd88da34ea66e62)|2014/08/25 21:44:55|2|
|14|[Hubot  自作Script  gitlab_sample.coffee - GitLab - Hubot - Kandan の連携を検証するサンプル](http://qiita.com/tbpgr/items/9b3739b790cb52cb002d)|2014/08/16 02:03:31|3|
|15|[Hubot  自作Script  hubot-cron を利用して Hubot に始業・昼休み・終業を通知させる](http://qiita.com/tbpgr/items/dff3b792444e3fe8f3af)|2014/08/27 22:49:10|7|
|16|[Hubot  自作Script  qiita_new.coffee - Qiitaの新規記事からランダムで取得した1件を表示する](http://qiita.com/tbpgr/items/7f3ab32f77240a7180ee)|2014/08/16 23:04:09|3|
|17|[Hubot  自作Script  ume.coffee - 空行を挿入する](http://qiita.com/tbpgr/items/f9ae93bdf842a907dc69)|2014/08/13 22:17:34|0|
|18|[Hubot で外部コマンドを実行する](http://qiita.com/tbpgr/items/758c957ba07a71869604)|2014/09/10 22:11:18|1|
|19|[Kandan  Kandan1.1で Hubot を利用する場合の設定手順](http://qiita.com/tbpgr/items/73b68cec23888d4570cf)|2014/08/09 04:41:27|3|
|20|[Reveal.js を利用した内部公開スライドサーバーでスライドの自動デプロイを行う](http://qiita.com/tbpgr/items/107d75bc8a4732d9c294)|2014/09/10 22:22:07|1|
|21|[Reveal.js を利用した内部公開スライドサーバー構成について](http://qiita.com/tbpgr/items/f9a0c3a04044918b2ace)|2014/09/10 01:28:28|5|
|22|[Ruby  Gviz で GitLab / GitLab CI / Kandan / Hubot の構成図を作成する](http://qiita.com/tbpgr/items/65104a129e5abef13148)|2014/08/25 21:36:30|5|
|23|[node.js  node.js ・CoffeeScript・Hubot を Windows7環境にインストールする](http://qiita.com/tbpgr/items/c2238895bee0aaa84f5b)|2014/08/13 22:33:17|2|
Hubot | 自作Script | ume.coffee - 空行を挿入する

# Hubot | 自作Script | ume.coffee - 空行を挿入する

## 概要
ume.coffee - 空行を挿入するScriptを作成します

## 用途
* 画像系コマンドなどで、妙な画像を取得してしまった場合
* 急に思わぬ人が来た場合

などに、チャットのビューを空行で埋めて既存のチャットを画面外に追いやるための利用を想定。

## 仕様
### filename
ume.coffee

埋め、ですね。

### respond or hear
respond

### 起動メッセージ

* 正規表現

~~~
/ume+( (\d+))?/
~~~

* 具体例
    * ume     # => 空行を15行挿入
    * ume 5   # => 空行を 5行挿入

## ソースコード

~~~coffee
# Description
#   Output empty lines
#
# Dependencies:
#   None
#
# Configuration:
#   None
#
# Commands:
#   hubot ume N - Output N-empty-lines. If you omit N, lines set 15.
#
# Author:
#   tbpgr
module.exports = (robot) ->

  robot.respond /ume+( (\d+))?/i, (msg) ->
    lines = msg.match[2] || 15
    msg.send '' for [1..lines]
~~~

## 試行
### デフォルト

![ume1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/9b94b81e-51e6-1efb-1311-3473c09d29f2.png)

### 2行

![ume2.png](https://qiita-image-store.s3.amazonaws.com/0/43480/de8fa9f7-7f36-53f1-286a-049dfccae0d9.png)

## 補足
今のところ、 npm で公開したりする予定はないので適当にGitHubに突っ込んでおきます。
https://github.com/tbpgr/hubot_scripts/tree/master/ume
VBScriptで悩んだことメモ

仕事でVBScriptを沢山触って色々悩んだことをメモ。
じわじわ増やします。

## 配列

### 固定長配列

``Dim Array(5)``ってやると添字0～5までの **要素数6** の配列ができる。
添字を普通のカッコで括るというのと、思っているよりも要素数が1個多いところに注意。
「要素数5の配列をつくる」じゃなくて「添字5までの配列をつくる」ってことかな。

### 動的配列

VBSでは、[ReDimステートメント](http://msdn.microsoft.com/ja-jp/library/cc392468.aspx)を使って配列の拡張ができる。
ただし、ReDimが使えるのは **要素数を指定せずに宣言した配列** のみ。
``Array(5)``はNGで、``Array()``はOK。

ただ``ReDim``とやると、元の配列の中身は消えてしまう。
配列の中身を残したまま拡張がしたい場合、``Preserve``をつける。

```vbnet
Dim Fruits()

ReDim Fruits(1)

Fruits(0) = "Apple"
Fruits(1) = "Grape"
WScript.Echo Join(Fruits)  ' => Apple Grape

ReDim Preserve Fruits(2)
Fruits(2) = "Orange"
WScript.Echo Join(Fruits)  ' => Apple Grape Orange

ReDim Fruits(3)
Fruits(3) = "Melon"
WScript.Echo Join(Fruits)  ' =>    Melon 拡張前の中身が消えた！
```

### Array関数でつくる

[Array関数](http://msdn.microsoft.com/ja-jp/library/cc410203.aspx)に値のリストを渡すと、配列を返してくれる。
バリアント型の変数で受ける。配列では受けられない。

```vbnet
Fruits = Array("Apple","Grape","Orange","Melon")

WScript.Echo Fruits(1)     ' => Grape
WScript.Echo Fruits(3)     ' => Melon
WScript.Echo Join(Fruits)  ' => Apple Grape Orange Melon
```


## 代入

代入のときに``Set``を付けるか付けないか。
単純な値の代入は付けない。
オブジェクトを扱うときなど、参照を代入したいときは``Set``を付ける。



## プロシージャ

### FunctionとSub

戻り値を返す``Function``と返さない``Sub``の2種類がある。``Sub``はサブルーチンのことかな？
全部``Function``で書けばいいんじゃね？と思いがちだけど、戻り値を受け取ってあげないとエラーで止まるので、やっぱり使い分けが必要。

### 呼び出しかた

``Call``を付けて呼び出すことも、省略することも出来る。
ただし、``Call``を省略した場合、引数を囲うカッコも省略しないといけない。中途半端は許されない。

### 引数の値渡しと参照渡し

プロシージャの宣言のときに引数名の前に``ByVal``・``ByRef``を付けると渡し方を指定できる。
``ByVal``が値渡しで、``ByRef``が参照渡し。

```vbnet
strText = "ABC"

SubByVal strText
WScript.Echo strText  ' => ABC

SubByRef strText
WScript.Echo strText  ' => GHI

SubDefault strText
WScript.Echo strText  ' => JKL

Sub SubByVal(ByVal Arg) ' 値渡し
  Arg = "DEF"
End Sub

Sub SubByRef(ByRef Arg) ' 参照渡し
  Arg = "GHI"
End Sub

Sub SubDefault(Arg) ' 参照渡し
  Arg = "JKL"
End Sub
```

注意しないといけないのが、 **省略すると参照渡しになる** ところ。
上の例のように、引数で貰った変数をそのまま中の処理で使い回したりすると、呼び出し元にも影響を与えるので大変危険。



## VBSでInclude

VBSには外部ファイルをインクルード・インポートする仕組みがないのですが、``ExecuteGlobal``を使えばそれっぽいことができます。

```vbnet
Include "Library.vbs"  ' 外部ファイル「Library.vbs」を取込み

Sub Include(ByVal strFile)
  Dim objFSO , objStream , strDir
  
  Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") 
  strDir = objFSO.GetFile(WScript.ScriptFullName).ParentFolder 
 
  Set objStream = objFSO.OpenTextFile(strDir & "\" & strFile, 1)
  
  ExecuteGlobal objStream.ReadAll() 
  objStream.Close 
  
  Set objStream = Nothing 
  Set objFSO = Nothing
End Sub
```

``ExecuteGlobal``に渡した文字列をスクリプトとして解釈して実行してくれる模様。
nginx + php-fpm(CakePHP)で特定URLのエラーページを設定する


# 前提

nginx + php-fpmでCakePHPを使っている環境下で、特定URLにのみ専用のエラーページを表示させたい時の設定方法メモ。

http://example.com/ は普通のエラーページ。
http://example.com/hoge/ は特別なエラーページ。

を、表示させるようにしたいのです。

# 設定

```hoge.conf
server {
	listen   80;
	server_name example.com;

	# デフォルトの500番エラーは error_default.html
	error_page 500 /error_default.html;

	location / {
		root /var/www/vhosts/example.com/htdocs/app/webroot/;
		index  index.php index.html index.htm;
		if (-f $request_filename) {
			break;
		}
		if (-d $request_filename) {
			break;
		}
		rewrite ^(.+)$ /index.php?q=$1 last;
	}

	location ~ .*\.php[345]?$ {
		fastcgi_pass      127.0.0.1:9000;
		fastcgi_index     index.php;
		fastcgi_param     SCRIPT_FILENAME /var/www/vhosts/example.com/htdocs/app/webroot$fastcgi_script_name;
		fastcgi_intercept_errors on;
		include           fastcgi_params;
		# /hoge/ がURLに含まれている場合の500番エラーは error.html
		if ($query_string ~ /hoge/) {
			error_page 500 501 502 503 /error.html;
		}
	}

}
```

`$query_string`を参照することで、リクエストされたURLパラメータを取得することができます。あとは、ifステートメントで正規表現チェックすれば、特定URLの時のみ、指定のエラーページを表示させることができます。

# 余談：nginxの設定ファイル変数を確認する方法

上記の`$query_string`などの変数の中身を見ることってできないかな？と調べてたら、下記のようにアクセスログに出力することで見られます。

```hoge.conf
log_format debug_format "$debug_val";
set $debug_val "$query_string";
access_log /var/logs/access.log debug_format;
```

これでアクセスログに`$query_string`の中身が吐出されます。便利。
Synthでjade以外のテンプレートエンジンを使用する方法


# そもそもSynthって何よ
私の記事を参照
[Synthってなんじゃらほい？ - Qiita](http://qiita.com/dll7/items/1237539efdc650f8ea5e)

# 本題
jade嫌いです。ejs使いたいです。
使いたかったのですが使い方が分からなくて二時間ぐらい悩みました。
issue立てよう思ってcloseを見たら解決方法がありました。

https://github.com/JonAbrams/synth/issues/13

> Synth is built on top of express. When you initialize synth (e.g. module.exports = synth()) it automatically tells express to use jade as the rendering engine, and then returns an express app.

>When I get a chance I'll change it so that a different rendering engine can be passed in when initializing synth.

>Right now, one workaround is to initialize synth (which returns the express app), then set a different rendering engine, then return the app to be launched. e.g.

>```JavaScript
var app = synth();
app.set('view engine', 'ejs');
module.exports = app;
```

>In theory that should work for any rendering engine, assuming you've [installed them and told the app about them](http://expressjs.com/4x/api.html#app.engine).

結論、Expressに完全に依存しているので、Expressでejs使う時みたいに使えってことみたいです。

# 引用されたコードの意味がわからないんだけど
通常のsynthコマンドだとできないのですが、直接back-appを呼び出してlistenする方法もあります。

```app.coffee
app = require "./back/back-app"
port = process.env.PORT || 3000

app.listen port, ->
  console.log "Synth is now listening on port #{port}"

```

```back-app.coffee
synth = require("synth")

# Connect to Mongo DB
db = require("promised-mongo")(process.env.MONGODB or "tweets-db")

# Provide DB connection to request handlers
synth.app.use (req, res, next) ->
  req.db = db
  next()
  return


# Init and return synth app
module.exports = synth()

```
まぁ、ここらへんに挟み込めば動くかもしれないです。

近いうちにクラスタリングに対応させたバージョンをpull requestします。弾かれたらforkします。
記事ももうすぐ書きます。
Pythonでソルト付きでハッシュ計算をする方法

hashlibモジュールがありますので、簡単に実装することが可能です。
ソルト付きとタイトルに書いていますが、「Salt＋Data」をhashlibにかければ良いわけでこれまた簡単です。

#### ・実装方法
```````
#!/usr/bin/env python

import hashlib

message = "salt" + "data"

print "MD5: " + hashlib.md5(message).hexdigest()
print "sha256: " + hashlib.sha256(message).hexdigest()
print "sha516: " + hashlib.sha512(message).hexdigest()
~~~~~~~

ここではmd5とsha256、sha516を使用。

#### ・確認
````````
# ./hash.py
MD5: 23eeeb4347bdd26bfc6b7e・・・
sha256: 11a4a60b518bf24989d481468076e5d59828846265b857・・・
sha516: ecc579811643b170cbd88fd0d0e323d1e1acc7cef8f73483a7・・・
````````

出力が長くて改行で見づらくなったため、「・・・」で省略しました。
実際はもっと長いです（特にsha512）
C++ の、スマートだと思う人がいるかもしれないコードの書き方12選のつもりが6個ぐらいで断念


#1. 括弧の省略

if, while, for の括弧を省略する人はたくさんいるけど、switch も省略できるよ。

```cpp:c++
#include <iostream>
using namespace std;

char const * less_bracket(int n)
{
  switch(n)
  if(false)
  case 0: return "zero";
  else if(true)
  case 1: return "one";
  else
  case 2: return "two";
}

int main()
{
  cout
  << less_bracket(0)<<" "
  << less_bracket(1)<<" "
  << less_bracket(2);
}
// 「zero one two」と出力
```

#2．三項演算子

三項演算子は、左辺値でも使えるよ。

```cpp:c++
#include <iostream>

int main()
{
  int a=1, b=2;
  (a<b ? a : b)= 3;
  std::cout << a << " " << b; // 「3 2」と出力
}
```

#3．switch文

複雑な条件は switch 文とループを組み合わせると短く書けることがあるよ。


```cpp:c++
#include <iostream>

int main()
{
  for( int i=1 ; i<5 ; ++i )
    switch(int j=i)
      default:{
        std::cout<<"z";
        case 2:
        for(j=0;j<5;++j){
          case 3:
          std::cout<<j;
          case 1:;
        }
      }
}
// 「2340123434z01234」と出力
```

# 4．for文

for 文は、initlaizer_list と組み合わせると便利。

```cpp:c++
#include <iostream>
#include <initializer_list>

int main()
{
  for( char const * c : { "foo", "bar", "baz" } ){
    std::cout <<"["<<c<<"]";
  }
}
// 「[foo][bar][baz]」と出力
```

# 5．変数宣言のみで配列への要素追加

思いつかない。ぐぬぬ。

と書いていたんだけど、@T_MURACHI 様 のアイディアから着想を得て。

C++ の配列は要素を増やすことは出来ないけど、一部の要素を書くだけで他の要素に値を入れることならできる場合があるよ。

```cpp:c++
#include <iostream>

int main()
{
  int a[3]{ (a[2]=(a[1]=1)*10)*20 };
  for( auto i : a ) std::cout << i << " ";
}
// 処理系によっては「200 1 10 」と出力
```

c99 の 指示初期化子 と組み合わせるとさらに強力！


# 6．引数のデフォルト値

引数のデフォルト値に、副作用のある式を書くと呼ぶたびに実行されて便利。

```cpp:c++
#include <iostream>

int max( int a, int b ){  return a<b ? b : a;  }

int main()
{
    int max(int, int=3+!(std::cout<<","));
    for( int i=0 ; i<10 ; ++i )std::cout<<max(i);
}
// 処理系によっては「,3,3,3,3,4,5,6,7,8,9」と出力
```

# 7．関数でのglobal宣言

関数のデフォルト引数の宣言にはグローバル変数が使えるよ。

```cpp:c++
#include <iostream>

int g;
int max( int a, int b=g ){  return a<b ? b : a;  }

int main()
{
  for( g=0;g<4;++g){
    for(int x=0;x<4;++x )std::cout<<max(x);
    std::cout<<" ";
  }
}
// 「0123 1123 2223 3333 」と出力
```

ちょっとタイトルと合わないか。

# 8．条件式での変数定義

for 文の冒頭で変数を宣言する人が多いけど、if, switch, while でも宣言できるよ。便利。

```cpp:c++
#include <iostream>
#include <cstring>
#include <initializer_list>

int main()
{
  for( char const * c : { "foo", "bar", "baz", "hoge", "fuga" } ){
    if ( char const * a=strchr( c, 'a' ) )
      std::cout << a;
    else
      std::cout<< c;
    std::cout <<" ";
  }
}
// 「foo ar az hoge a 」と出力
```

# 9．まとめ

以上は基本的なものもあるけど、どれも最大限活用すると、なにかが起こるかもしれないよ。
初心者のかたは結構知らないものが多いかもしれないけど、コーディング時間短縮以外の何かのために覚えておくと損しないかもね。

本当は 12 まであるはずだったんだけど、ネタ切れ。
すいません。

5番とまとめに追記しましたよ。

念の為に書いておくと、
http://megalodon.jp/2014-0812-0928-28/bulkserver.jp/blog/2014/08/07/php-code/
のパロディです。
scopeの引数の渡し方


scopeの醍醐味、それはメソッドの再利用にあります。
が、しかし、scope内にがっつり具体的な引数を渡してしまってはなかなか使い回せません。

＊デフォルト引数を渡して例外をなくすという使い方もありますが、今回はとにかく一つのメソッドを出来るだけ、汎用性の高いものにすることを目的としました。

scopeに抽象的な引数を渡し、様々なクラスで使えるようにしたい！
ということで、scopeの引数の定義の方法を記します。

```ruby:hoge.rb
scope :date, -> date { where(date: date)}
```

{}の外に引数の種類を記すことが重要です。
てか、それだけです笑

これで、引数がdate型であれば様々な箇所で使うことができます。

```ruby:hoge_controller.rb
@hoge = Hoge.date(params[:date])
```
でも

```ruby:hoge_controller.rb
@hoge = Hoge.date(@hoge.date)
```
でも使える。

基本中の基本ですが、今回非常に役に立ちました。
ジャイロセンサーでMIDIエフェクター

# Arduino + Gyro + MIDI
##やりたい事
+ ボタンやつまみ以外の方法のMIDIコントローラーをつくる
+ Gyroセンサーを搭載したArduinoでDAWソフトを操作、エフェクターをつくる
+ できれば無線で

##イメージ
![IMG_0006.JPG](https://qiita-image-store.s3.amazonaws.com/0/13771/9588b07f-ab3a-3897-a92f-3e2639692fb4.jpeg)

##環境
Mac/Arduino/東芝ジャイロ/
Ableton Live(DAW)/hairless/Audio MIDI設定/

##目次
1. ジャイロの値をArduinoで計算、角度を算出
2. 角度を整形してMIDIデータとしてシリアルで送信
3. ソフトウェア経由でシリアルデータをDAWに喰わせる
4. 送信部分をBluetoothで実装

##ジャイロの値をArduinoで計算、角度を算出
###値は角度ではないのでそのまま使えません。

```c:qiita.ino

int xPin = A0;
int yPin = A1;

double xVal = 0;
double yVal = 0;
double xPast = 0;

#define gyro_DEFAULT 288
#define gyro_MIN 0
#define gyro_MAX 650
#define midi_MIN 0
#define midi_MAX 127

double xResult = 0;

void setup() {
  //  Set MIDI baud rate:
  
  Serial.begin(9600);
}

void loop() {
  
  xVal=analogRead(xPin);
  yVal=analogRead(yPin);
  
  xResult = map(xVal, gyro_MIN, gyro_MAX, midi_MIN, midi_MAX);
  
  //Serial.println(xVal);
  Serial.println(xResult);
  Serial.println("");
  
  delay(40);
}

```
エフェクターを実装するにあたり、角度が必要。
でもジャイロの値は角速度（？）かなんかなので、そのまま使えません。

##角度を整形してMIDIデータとしてシリアルで送信
###ジャイロの値は角度ではないのでそのまま使えません。

##ソフトウェア経由でシリアルデータをDAWに喰わせる
###ソフトウェアにデータを読ませる為にアプリを経由する必要があります。

シリアルデータ > hairless > Audio MIDI設定 > DAWソフト

##送信部分をBluetoothで実装
###ジャイロの値は角度ではないのでそのまま使えません。
InDesign CC2014でパッケージする


InDesign CC2014以降、パッケージにpdfとidmlを含められるようになった。
それをスクリプトで動かしてみる。

AppleScriptの用語辞書はこんな感じ。
include idml以降はオプションぽい。

```
package v : Packages the document.
package document
to file or text : The folder, alias, or path in which to place the packaged files.
copying fonts boolean : If true, copies fonts used in the document to the package folder.
copying linked graphics boolean : If true, copies linked graphics files to the package folder.
copying profiles boolean : If true, copies color profiles to the package folder.
updating graphics boolean : If true, updates graphics links to the package folder.
including hidden layers boolean : If true, copies fonts and links from hidden layers to the package.
ignore preflight errors boolean : If true, ignores preflight errors and proceeds with the packaging. If false, cancels the packaging when errors exist.
creating report boolean : If true, creates a package report that includes printing instructions, print settings, lists of fonts, links and required inks, and other information.
[include idml boolean] : If true, generates and includes IDML in the package folder.
[include pdf boolean] : If true, generates and includes PDF in the package folder.
[pdf style text] : If specified and PDF is to be included, use this style for PDF export if it is valid, otherwise use the last used PDF preset.
[version comments text] : The comments for the version.
[force save boolean] : If true, forcibly saves a version. Can accept: boolean (Default: FALSE).
→ boolean : True if the packaging was successful.
```

こんな風に書いたら動いた。

```applescript:
set packFol to "Macintosh SSD:Users:kanemu:Desktop:out:"
tell application "Adobe InDesign CC 2014"
	activate
	tell document 1
		package to packFol copying fonts yes copying linked graphics yes copying profiles no updating graphics yes including hidden layers no ignore preflight errors yes creating report yes include idml yes include pdf yes pdf style "[PDF/X-1a:2001 (日本)]" version comments "v1.0" force save no
		close saving no
	end tell
end tell
```

ExtendScriptではこう。

```javascript:
(function(){
    var packFol = new Folder('/Users/kanemu/Desktop/out');
    var doc = app.documents.item(0);
    doc.packageForPrint(
        packFol, // to
        true, // copying fonts
        true, // copying linked
        false, // copying profiles
        true, // updating graphics
        false, // including hidden layers
        true, // ignore preflight errors
        true, // creating report
        true, // [include idml]
        true, // [include pdf]
        "[PDF/X-1a:2001 (日本)]", // [pdf style]
        "v1.0", // [version comments]
        false // [force save]
    );
    doc.close(SaveOptions.NO);
}());
```

これでOK。
Gamepad(Web API) 適当にテスト 

WebAPIのGamepadが良い感じになってきたのでテスト。

ぶっちゃけここ見ればかなり意味がわかる。

https://hacks.mozilla.org/2013/12/the-gamepad-api/

が、適当に使いたいの作りたかったので以下ソース。
XBOX360のやつでテスト。

```js:gamepad.js
<script>

//---------------------------------------------------------------------
//  ref:https://developer.mozilla.org/en-US/docs/Web/Guide/API/Gamepad
//---------------------------------------------------------------------

document.write('<html><body><font face="Lucida Console"><div id="disp"></div></font></body></html>');

//Create AnimationFrame
var rAF = window.mozRequestAnimationFrame ||
          window.webkitRequestAnimationFrame ||
          window.requestAnimationFrame; 

//Update
function update() {
    var pads = navigator.getGamepads ? navigator.getGamepads() :
                   (navigator.webkitGetGamepads ? navigator.webkitGetGamepads : []);

    //tekitou
    pads = pads[0];
    if(pads) {
        //buttons
        var but = [];
        for(var i = 0 ; i < pads.buttons.length; i++) {
            var val = pads.buttons[i];
            var pressed = val == 1.0;
            if (typeof(val) == "object") {
                pressed = val.pressed;
                val     = val.value;
            }
            but[i] = val;
        }

        var txt = [];
        txt += pads.id + "<br>";
        for(var i = 0 ; i < but.length; i++) {
            if( but[i] == 1)  txt += '<input type="checkbox" checked="checked">';
            else              txt += '<input type="checkbox" >';
        }

        var axes = pads.axes;
        for(var i = 0 ; i < axes.length; i++) {
            txt += '<br>';
            txt += axes[i] ;
        }
        console.log(axes);
        document.getElementById("disp").innerHTML = txt;
    }
    rAF(update);
}

//Start
rAF(update);

</script>

```

↑のサンプルは以下。

https://gyabo.sakura.ne.jp/actrl.html

↑ゲームパッドつないでないとさびしい結果になるらしい。
まあつないでる場合、アナログ周りは適当に敷居値決めれば適当に何かできそうな気がする。
落とし穴としては、キー入力、一度適当につないだジョイスティックの反応受けないとだめという感じ。<br>
chrome( 38.0.2114.2 dev-m (64-bit))

IE未対応。はよしろ。<br>
<br>

(2014/08/14 : 追記)
以下またテスト。
上段がChrome(38.0.2114.2 dev-m (64-bit))
下段がFirefox(31.0)

![switch.png](https://qiita-image-store.s3.amazonaws.com/0/34428/658a9b62-8ebe-7c44-658a-88d50c551a46.png)

書いた「全く同じコード」を動かしてみた結果がこうなる。

ジョイスティックはハットスイッチを↓＼って入れているんだけど、
Chrome側はbuttons、Firefox側はaxesとして認識されている。
どういうこっちゃ…。まだまだなんかありそうな気がする。コワイ。
JS: new 呼び出しについて理解する

##■ 概要
javascriptにおける new 呼び出し（以下:コンストラクタ呼び出し）を理解するために、関数呼び出しとの差異をサンプルコードを踏まえてまとめる。

##■ サンプルコード
定義された Sam関数 を対象に、コンストラクタ呼び出しした場合と関数呼び出しした場合の差異を検証するサンプルコード。

```js:コンストラクタ呼び出し
function Sam(num,string){
    //↓Line②
    this.num = num;
    //↓Line③
    this.string = string;
}

//↓Line④
Sam.prototype.getState = function(){
    console.log('num: '+this.num+', string: '+this.string);
}

//↓Line①
var constSam1 = new Sam(1,'いち');
//↓Line⑤
constSam1.string = '壱';
constSam1.getState();
//Log① consoleに num: 1, string: 壱 のlog出力

//↓Line⑥
var constSam2 = new Sam(2,'に');
constSam2.getState();
//Log② consoleに num: 2, string: に のlog出力

//↓Line⑦
var funcSam = Sam(3,'さん');
console.log('num: '+window.num+', string: '+window.string);
//Log③ consoleに num: 3, string: さん のlog出力
//↓Line⑧
funcSam.string = 5;
//Log④ funcSam.string undefinedのエラー
//↓Line⑨
funcSam.getState();
//Log⑤ funcSam.getState undefinedのエラー

```


##■ サンプルコードを使ったコンストラクタ呼び出しの説明
コンストラクタ呼び出しと関数呼び出しの違いについて、理解しなければいけない点は以下の2点だと思われる。
1, this結合
2, prototypeオブジェクト

####◇コンストラクタ呼び出しの仕様
関数に new をつけた形で呼び出すと、コンストラクタ呼び出しとなる。
コンストラクタ呼び出しと関数呼び出しでは、下記の3点の違いが見込まれる。

**Ⅰ,** コンストラクタ呼び出しした場合、新しいオブジェクトとして this が生成される
**Ⅱ,** コンストラクタ呼び出しによって作成された新しいオブジェクト this は、関数に定義されたprototypeを継承する
**Ⅲ,** コンストラクタ呼び出しされた関数は、作成された新しいオブジェクト this を返却する

以下、サンプルコードを追って、上記を証明する。

####◇説明
Line①の行で `Sam関数` がコンストラクタ呼び出しされている。
この時、`Sam関数` 内では新しいオブジェクト `this` が生成され、Line②・③の行でこのオブジェクト `this` に引数 `1` `いち` を格納している。

さらにこの `this` はコンストラクタ呼び出しによって生成されたのでLine④で定義されている `Sam関数` の `prototype` を継承している。

`Sam関数` はコンストラクタ呼び出しされたので、生成したオブジェクト `this` を返却している。
したがってLine①の `var constSam1` は、引数 `1` `いち` が格納され `Sam関数` の `prototype` が継承されたオブジェクト `this` を参照している。
Line⑤の `constSam1.string` はすなわち 'this.string' であるといえるので、格納した `壱` はもともとLine③で格納されていた `いち` を上書きしている。

**ーーーー ここまでの過程を経て Log① が出力されることによって Ⅰ Ⅱ Ⅲ が証明される。**

Line⑥にて、新たに `Sam関数` をコンストラクタ呼び出ししている。
この時、`Sam関数` ではLine①で生成されたのとは別の新しいオブジェクト `this` を生成し、返却している。

**ーーーー Log②が出力されることによって Ⅰ がより確実に証明される。**

Line⑦の行で `Sam関数` が関数呼び出しされている。
関数呼び出しされた時には、新しいオブジェクトは生成されない。
したがって `Sam関数` 内の `this` はスコープチェーンを辿る事になる。
このサンプルコードの場合、`this` をどこにも定義していないので `this` は `window` を参照する事になる。（ブラウザの場合）

**ーーーー Log③が出力されることによって上記が証明される。**

関数呼び出しされた時には `this` は生成されないし返却もしないので、Line⑧のような呼び出しをしてもLog④の様にエラーが出る。
また、関数呼び出しされた時には `this` は生成されないし関数の `prototype` も継承されないのでLine⑨のような呼び出しをしてもLog⑤の様にエラーが出る。

**ーーーー 上記は Ⅰ をより確実に証明している。**
Python Django 日本のキャリアメールがEmailValidatorで弾かれるケースの対処法

```py
# coding: utf-8
import re
from django.core.validators import EmailValidator


class JapaneseEmailValidator(EmailValidator):
    user_regex = re.compile(
        r"(^[-.!#$%&'*+/=?^_`{}|~0-9A-Z]+$"  # dot-atom (\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*を省略
        r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\177])*"$)',  # quoted-string
        re.IGNORECASE)