OmniAICreator/Qiita-1.07M huggingface dataset:
さらばExcelフローチャート　UnitTestを活用した設計手法

「コーディングする前には設計書という文書がなくてはならない」

多くのシステム開発におけるこの暗黙の不文律、苦痛と感じたことはないでしょうか(私はあります)。特にオフショアに出す時なんかはちゃんと書かないと危ないということでしっかり描くわけですが、夜なべしてExcelフローチャートを書きながら「いいよもう俺が開発するよ」なんてため息つくこともよくあるわけです。

今回紹介するのは最近のプロジェクトで試した方法で、端的に言えばJUnitなどのUnitTestフレームワークを使用し、「動く設計書」を作るアプローチです。

## 実施ガイド
要件定義からUnitTest？コーディングかよ、というのに違和感もあるかと思います。
実際行うときも、UnitTestのコードだけでやっていたわけではありません。具体的な手順は以下の通りです。

1. システム化の背景と業務要件の把握  
そもそもなぜシステム化したいのか、について背景となっている課題と、現在の業務の進め方を確認。
2. システム構成の設計  
必要な画面とその関連(動線)、データベーステーブル、バッチなど大まかな全体フローを設計。
3. 詳細な仕様確認  
複雑な業務ルール、理屈ではわかるけどコード上での書き方が微妙なところをUnitTestで記載。

1、2は普通だと思います。3は、通常外部設計書/内部設計書と呼ばれる成果物を作成するところですが、ここをUnitTestを使用したコード/APIドキュメントに置き換えました、その方が効率が良かったです、というのが本文書の主張です。

## メリット
実際行ってみて、以下のようなメリットを感じました。

* 実装上の難点や簡単そうに聞こえるけど難しい点が早めに把握でき、クラス設計などに反映できた
* コードで説明ができて、引継ぎが楽だった。引き継いだパートナーさんからも好評。
* API仕様書(JavaDocなどで生成するドキュメント)が設計書になり、無駄な工数が省けた。また、ソースコード中にしっかりしたコメントが残るようになった。

コーディングを行うことで統合開発環境の力を生かすことができるのも大きいです。

例として、ちょっと具体的なコードを書いてみました(作ったのは人事系のシステムだったので、それを元に)。

```java

/**
 * 転入してきた社員を登録します。<br/>
 * 社員番号は原則3始まりですが、関連会社からの転入の場合関連会社の社員番号を引き継ぎます。
 */
@Test
public void newEmployee() {
	//新入社員
	Employee newCommer = new Employee("社員　太郎");
	
	//社員番号は、3で始まる
	assertTrue(newCommer.No.startsWith("3"));
	
	//関連会社からの転入の場合、既にある社員番号をセットします。
	//TODO 関連会社の社員番号の体系は?DBの項目長などに影響あり。
	Employee transferred = new Employee("関連　太郎","11220011");
	
}

```

まず、コーディング中に発見した不明点などはTODOコメントどで残しておくことで確認漏れが防げます。
また仕様変更などがあった際、Subversion/Gitなどのバージョン管理ツールが入っていれば変更内容を差分管理できます(チケット管理システムと連携させればより強力になります)。システム内のロジックがTestメソッドとして並び、一覧として管理できるのも大きいです。
これらはよくある仕様変更一覧(Excel)、課題管理一覧(Excel)より優秀に働いてくれる場面も多いわけです。

なお、APIドキュメントについてはJavaなら日本語クラス/メソッドが使えるので以下くらいにはわかりやすくなります。日本語名での実装はちょっと・・・という場合は、日本語でガラだけのテストクラス/メソッドを作成し、内部では英語名のクラスに処理を委譲するという手もあります。

![shain.JPG](https://qiita-image-store.s3.amazonaws.com/0/25990/22d8adc9-3460-0769-3a4f-9ef49639d65c.jpeg)

## 結論
適材適所の媒体を使用するのが良い、ということです。

設計が適切な媒体で行われていることは、メンテナンスのしやすさにもつながると思います。
コードの修正だけでも大変なのに、Excelで書かれたジャングルみたいなフローチャートも修正しないといけない、となったらはっきり言って二度手間なわけです。

効率の良い開発、ひいては運用保守を行っていくためにも、コーディング=開発と限定せずその表現力を使える場所では使っていくことが肝要ではないか・・・と思います。
vagrant packageしないで、vagrantとVirtualBoxをアップデートしてしまってVMを起動できなくなったのを救う方法


`vagrant package`を使うと、VMを今の状態でとっておけるのですが、それをしないでvagrantをバージョンアップしたら、今まで起動していたVMが起動しなくなってしまいました。

幸い、 `$(HOME)/.vagrant.d/boxes/`に今までのvagrantで作成したファイルは残っていたのと、VirtualBoxで直接起動すると正常に起動できることから、VirtualBoxからexportしてbox化すれば、vagrantで再び起動することが可能でしたので、備忘録として残します。


## 手順

### 1. VirtualBoxで今まで起動していたVMが起動するかどうか確認する

VirtualBox GUIを起動するか、VBoxManageコマンドを使って起動するか確認します。

## 2. VMのエクスポート

VirtualBox GUIか、VBoxManageコマンドを使ってovaファイルでexportします。

```
VBoxManage export <VM name> -o export.ova
```

## 3. metadata.jsonのコピー

アップデートしたvagrantでサンプルのVMを作ってみて、`$(HOME)/.vagrant.d/boxes/(sample VM name)`にできたVMのファイルをコピーします。


```metadata.json
{"provider": "virtualbox"}
```

## 4. Vagrantfileのコピーまたは作成

今まで動作していたVMが残っていれば、`$(HOME)/.vagrant.d/boxes/(VM name)`にVagrantfileが残っているのでそれをそのまま使います。残っていなければ3.で作成したサンプルのVMから拝借して`config.vm.base_mac`を書き換えます。


```Vagrantfile
Vagrant::Config.run do |config|
  config.vm.base_mac = "0800111DA111"   # Mac addressを書き換え
end

include_vagrantfile = File.expand_path("../include/_Vagrantfile", __FILE__)
load include_vagrantfile if File.exist?(include_vagrantfile)
```

MAC-addressは、VirtualBox GUIでVMの設定をみるか、VBoxManageコマンドで調べます。

```
VBoxManage showvminfo <VM name> --machinereadable
```

## 5. 拡張子をboxにして固める

2. - 4.のファイルを拡張子をboxにして固めます。

```
tar zcf export.box export.ova metadata.json Vagrantfile
```

## 6. Boxを追加

```
vagrant box add <New vagrant vm name> export.box
```

## 7. 起動するためのVagrantfile作成

Vagrantfileのformatが若干変更されていたので、`vagrant init`でVagrantfileを作成し、元のファイルから設定をマージするのが楽だったので、それで作成しました。


```
vagrant init
edit Vagrantfile
vagrant up
```

## 環境

旧vagrant: 1.3.xあたり?
新vagrant: 1.5.1

## 参考

* [Windows用 VirtualBox 4.2.14 で Vagrant を使用する](http://fits.hatenablog.com/entry/2013/07/02/221013)
「特定のS3バケットのみ操作可能+アカウント内の他のバケットは見れない」ユーザーとバケット設定


用途
===
ファイルのアップロード先としてS3バケットを多数作成しているが、
バケット毎に使用する人が違うため、IAMユーザーで権限管理する。
IAMポリシーとS3バケットポリシーの2つを設定しなければならない。




### IAMポリシー

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::s3bucket-name"
    }
  ]
}
```

### S3バケットポリシー
```
{
	"Version": "2008-10-17",
	"Statement": [
		{
			"Sid": "PublicReadForGetBucketObjects",
			"Effect": "Allow",
			"Principal": {
				"AWS": "arn:aws:iam::AWSアカウントID:user/IAMユーザー名"
			},
			"Action": "s3:*",
			"Resource": "arn:aws:s3:::このポリシーを設定するバケット名/*"
		}
	]
}
```


### 解説
S3に関する操作は全て許可
>       "Effect": "Allow",
      "Action": "s3:*",

"s3bucket-name"のバケットのみに上記権限を付与
>       "Resource": "arn:aws:s3:::s3bucket-name"

awscliで見てみる

```bash
# アカウント内全てのS3バケット情報は権限無しで見れない
$ aws s3 ls --profile s3share
A client error (AccessDenied) occurred: Access Denied

# バケットを指定すると見る事が出来る
$ aws s3 ls s3://s3bucket-name --profile s3share
                           PRE logs/

# upload成功
$ aws s3 cp ~/logo.png s3://s3bucket-name/ --profile s3share
upload: ../../logo.png to s3://s3bucket-name/logo.png
```
XamarinとMvvmCrossでWindows Storeアプリ開発をはじめる方法


MvvmCrossの導入については[Xamarin+MvvmCrossでアプリ開発をはじめる準備 2014年3月版](http://qiita.com/iseebi/items/6dac29d6d2150ee1f0ea)を参考にいれる。
今回はその後、Storeアプリを追加するときのポイントをまとめる。

## Storeアプリの追加方法
Xamarin で作ったソリューションをVisual Studio 2012または2013で開けば良い。iOSやAndroidのプロジェクトは開けないが、PCLなCoreプロジェクトは開ける。

いちいち警告がうるさいので、Visual Studio用とXamarin用で.slnファイルはわけておいた方が良いと思う。Xamarinで作った.slnをVisual Studioで開くと勝手にアップデートされてしまうし。

あとは[MvvmCross と Xamarin for Visual Studio で iOS, Android, Windows アプリを作る流れ](http://yutawatanabe.hatenablog.com/entry/mvvmcross-xamarin-visual-studio)を参考にして、StoreアプリにNugetからMvvmCrossを追加していけば良い。

## トラブルシューティング
自分がデバッグしてて躓いたところを書いておきます。

### デバッグしていると Error : DEP0500 で resources.pri が消せないと言われる

Parallels Desktop の設定で「WindowsアプリケーションをMacと共有する」をOFFにすると起きなくなった。参照先のコメントをみると VMWare でも起きるっぽい。

参照先：
[Error : DEP0500 : The folder “…\Debug\AppX” could not be deleted. Access to the path 'resources.pri' is denied](http://stackoverflow.com/questions/13510285/error-dep0500-the-folder-debug-appx-could-not-be-deleted-access-to-th)

### 共有フォルダにあるプロジェクトは起動できない
ライセンスがなんだか出来ないらしく、ローカルにコピーするとできる。ネットワークドライブに指定してもだめだった。Mac上のXamarinとの共有は、git経由にするかWindowsのほうをマスターとするか一工夫必要。
Dash Ver.2で独自のCheatSheet作成！かなり良い！

Macから様々なリファレンスを閲覧出来る、[Dash](https://itunes.apple.com/jp/app/dash-docs-snippets/id458034879?mt=12)がメジャーアップデートされました。 
何と言っても目玉機能は **CheatSheet** という、リファレンスではなく所謂カンペ的なコマンド集のようなものを閲覧出来る様になったこと。 
しかも、このCheatSheetはRubyのDSLで簡単に独自のものを作成できます。今回はその方法を解説。

---

## 前提

- OSX 10.9
- Xcode Command Line Tools (必須)

## CheatSheet作成手順

後述の手順を踏んでrubyファイルを書けば、こんなcheatsheetが作れます！今回はGit Commandsというコマンド集を作成。 
(左の一覧でGit Commandsの上にあるGitはデフォルトで準備されている英語のcheatsheet)

![スクリーンショット 2014-03-16 19.46.19.png](https://qiita-image-store.s3.amazonaws.com/0/3468/414787f6-999c-c6bc-615a-c68c6f9e5f62.png)

CheatSheet作成のために以下を実行

```bash
$ sudo gem install cheatset # dashが読み込むdocsetファイルの生成に必要
$ xcode-select --install # Xcode Xcode Command Line Toolsをインストールしていない場合は実行
$ vim git_commands.rb # チートシートのファイル名(任意)。ファイルの内容は後述
$ cheatset generate git_commands.rb # docsetファイルに変換
# cheatset command not foundのようなことを言われる場合は source .zshrcなりターミナルを閉じるなりしてからコマンド再実行
$ open git_commands.docset # 生成されたdocsetをdashに読み込む
```

## CheatSheet内容

チートシートの内容は、rubyのDSLで記述します。日本語もOK。以下の内容でスクショと同じものが生成される。

```ruby:git_commands.rb
cheatsheet do
  title 'Git Commands'
  docset_file_name 'git_commands'
  keyword 'git'
  source_url 'http://cheat.kapeli.com'

  category do
    id 'コミット'

    entry do
      name '部分的にコミット'
      notes <<-'CODE'
        ```bash
        $ git add -p hoge.txt
        ```
      CODE
    end
  end

  category do
    id '変更を退避'

    entry do
      name '変更を一時退避'
      notes <<-'CODE'
        ```bash
        $ git stash
        ```
      CODE
    end

    entry do
      name '変更に名前をつけて退避'
      notes <<-'CODE'
        ```bash
        $ git stash save 'hogehoge'
        ```
      CODE
    end

    entry do
      name 'stashを一覧表示'
      notes <<-'CODE'
        ```bash
        $ git stash list
        ```
      CODE
    end

    entry do
      name '最新のstashを復元'
      notes <<-'CODE'
        ```bash
        $ git stash pop
        ```
      CODE
    end

    entry do
      name '特定のstashを復元'
      notes <<-'CODE'
        ```bash
        $ git stash pop stash@{1}
        ```
      CODE
    end
  end
end
```

## 参考ページ

- https://github.com/Kapeli/cheatsheets#readme
- https://github.com/Kapeli/cheatset#readme
- https://github.com/Kapeli/cheatsheets/tree/master/cheatsheets
ElasticSearchでICU Transliteratorを使う

ドキュメントに記載はされてないのですが、elastic-analysis-icuから利用可能.
今回は、カタカナ→ひらがなの変換をするフィルタを設定してみます

* elasticsearch-analysis-icuをインストトールする

```
bin/plugin -install elasticsearch/elasticsearch-analysis-icu/2.0.0
```

* フィルタ・アナライザを登録する(アナライザは用途に応じて任意に)

```
curl -XPUT localhost:9200/test/ --data-binary @setting.json
```

```setting.json
{
    "settings": {
        "analysis": {
            "analyzer": {
                "test_analyzer": {
                    "tokenizer": "keyword",
                    "filter" : ["kana_filter"]
                }
            },
            "filter": {
                 "kana_filter" : {
                    "type" : "icu_transform",
                    "id": "Katakana-Hiragana"
                 }
            }
        }
    }
}
```
* 動作確認

```
curl -XGET 'localhost:9200/test/_analyze?analyzer=test_analyzer&pretty' -d 'カレーライス'
{
  "tokens" : [ {
    "token" : "かれえらいす",
    "start_offset" : 0,
    "end_offset" : 6,
    "type" : "word",
    "position" : 1
  } ]
}
```
EXCEL-VBAで全文検索を実装する

#概略
ExcelVBA 2003の全文検索コマンドである[FileSearch.TextOrProperty プロパティ](http://msdn.microsoft.com/ja-jp/library/microsoft.office.core.filesearch.textorproperty(v=office.11).aspx)が廃止されていたので、代案を考えた。

#解決策
なにジョジョ？
ExcelVBAで全文検索が実装できない？ 

ジョジョ　それは
無理矢理実装しようと
するからだよ  

逆に考えるんだ
「実装しなくてもいいさ」と考えるんだ

-----
ファイル選択ダイアログの検索機能を使う事にした。

```vba:全文検索.bas
Attribute VB_Name = "全文検索"
Sub 全文検索()

    Dim adr As String

    adr = _
        Application.GetOpenFilename( _
           , Title:="画面右上の「ドキュメントの検索」欄にキーワードを入力して下さい。" _
           , MultiSelect:=False _
            )
            
    MsgBox adr
    
End Sub
```
MacOS Xでnfsdを使う


Mac OS Xのファイルを他のホストからNFS経由で利用できるようにするための設定。


## /etc/exportsを作成

```/etc/exports
/Users/maeda -mapall=maeda:wheel 192.168.131.140
```

* `/Users/maeda`: NFSで公開するディレクトリ
* `-mapall=maeda:wheel`: リモートからアクセスしてきたユーザーはOS Xのユーザーmaeda、グループwheelとして扱う
* `192.168.131.140`: このIPアドレスからのアクセスを許可

書式の詳細は `man 5 exports` で確認できる。


## /etc/exportsの内容をチェック

下記コマンドを実行すると/etc/exportsの書式が正しいかチェックできる。正しければ何も表示されない。

`nfsd checkexports`


## nfsdの起動

/etc/exportsを作成するとnfsdが自動的に起動する。

* 起動: `sudo nfsd start`
* 終了: `sudo nfsd stop`
* /etc/exportsの再読み込み: `sudo nfsd update`

nfsdに渡せるコマンドの一覧は `man nfsd` で確認できる。
Maverickに上げたらターミナルが起動しない問題


正確にはターミナルのウィンドウが一瞬だけ出て消える。だけどメニューバーは出てる。という状態でした。
ちなみにMaverickを導入した動機としては、アップデート通知がいろんなWebページのログインメニューに被ってて邪魔だったから。

## 原因
`/usr/local/bin`にbrewが作ったシンボリックリンクが軒並み消されていました。
で、私の環境では、`$SHELL`に`/usr/local/bin/zsh`を設定していたのですが、zshの起動に失敗してターミナルが上手いこと使用できなくなってました。

## 環境
zshはbrewで入れてます。

## 対処

### シェル復元
一旦、ターミナルのログインシェルを変更します。
ターミナルが見えないけど、メニューが表示されているはずなので、メニューから`Terminal`->`Preferences...`を選択、`Shells open with`->`Command (complete path):`に`/bin/sh`辺りを入力します。

### Brew復元
上記でターミナルが立ち上がるはずなので。

``` zsh
brew update
brew upgrade
```

すこぶる時間が掛るので待ちましょう。

終わったらターミナルが起動すると思います（たぶん）。これで出来ない場合は、

``` zsh
brew uninstall zsh
brew install zsh
```
で、ターミナルが起動すると思います（たぶん）

### 最後に
もう少しいい方法があるかも知れません。
bashの表示を変更する

こちらが参考にしたもの
とても分かりすい
<http://qiita.com/amidaku/items/841d62335a03792424d5>


自分設定
MBA

```
export PS1="\[\033[1;36m\][\t][\u@\h \W]\\$\[\033[0m\] "
```  
作業CentOS

```
export PS1="\[\033[1;34m\][\t][\u@\h \W]\\$\[\033[0m\] "
```  
テスト環境CentOS

```
export PS1="\[\033[1;33m\][\t][\u@\h \W]\\$\[\033[0m\] "
```
【jQuery】セレクトボックスの選択要素を抽出

##選択された単数要素を取り出す

基本はselectタグの属性を指定してval()で値を取得すればよいが、表示文字列を取得したいときはoption:selectedを指定する必要がある。

```html:html
<select name='alphabet'>
    <option value='ABC'>えーびーしー</option>
    <option value='DEF'>でーいーえふ</option>
    <option value='GHI'>じーえいちあい</option>
    <option value='JKL'>じぇーけーえる</option>
</select>
```

```js:js
$('[name=alphabet]').change(function() {
    // 選択されているvalue属性値を取り出す
    var val = $('[name=alphabet]').val();
    console.log(val); // 出力：ABC
    // 選択されている表示文字列を取り出す
    var txt = $('[name=alphabet] option:selected').text();
    console.log(txt); // 出力：えーびーしー
});
```

##選択された複数要素を取り出す

タグにmultiple属性が指定されており、複数要素を取り出す必要がある場合はどうなるか。

```html:html
<select name='alphabet' multiple='multiple'>
    <option value='ABC'>えーびーしー</option>
    <option value='DEF'>でーいーえふ</option>
    <option value='GHI'>じーえいちあい</option>
    <option value='JKL'>じぇーけーえる</option>
</select>
```

```js:js
// 前述のコードと同じ
$('[name=alphabet]').change(function() {
    var val = $('[name=alphabet]').val();
    console.log(val); // 出力：['ABC', 'DEF']
    var txt = $('[name=alphabet] option:selected').text();
    console.log(txt); // 出力：えーびーしーでーいーえふ
});
```

前述したコードでは、値を取り出した場合は配列として取得できるようだが、表示文字列はすべて連結された一文字列として取得される。
例えば、同じように配列として各表示文字列を取得したいのであれば、eachを使用して一つずつ配列にpushすればよい。

```js:js
// 複数選択された表示文字列を配列として取得
$('[name=alphabet]').change(function() {
    var array = [];
    $('[name=alphabet] option:selected').each(function() {
        array.push($(this).text());
    });
    console.log(array); // 出力：["えーびーしー", "でーいーえふ"]
});
```
PHPをコマンドラインで起動

PHPを、バッチやcronを使ってコマンドラインから起動する場合、こんなコードを最初に書くと良さげです。

```php
if (PHP_SAPI != 'cli') exit();
```

何をしているかというと、コマンドライン以外から起動された場合、処理を中断しています。
ちょっと安心しますね。

で、PHP_SAPIって何？と思ったので、ちょっと調べたところ、PHP が使用しているインターフェイス (サーバー API、SAPI) の型、らしいです。
[php_sapi_name](http://jp2.php.net/manual/ja/function.php-sapi-name.php)

これが'cli'であれば、コマンドラインから起動しているということだとか。
じゃー、他に何があるのかというと、ここにヒントが。

[PHP SAPIにはどんなのがあるか](http://www.1x1.jp/blog/2007/12/php_sapi_list.html)

 * PHP_SAPIやphp_sapi_name()で取得できるSAPI名は、[sapi/]にある各インターフェイスのソースにて定義されています。

とのこと。
記事自体が古いので、実際に調べてみました。

[さあPHPという言語処理系のソースコードを読んでみよう](http://anatoo.jp/phpcon2013/)

上記に沿ってソースをダウンロードしてみたところ、今のPHPは、こんなディレクトリになってました。

![aolserver.png](https://qiita-image-store.s3.amazonaws.com/0/39090/6178c6d2-cd80-c574-0ef8-63895404df2a.png)

中身は・・・とりあえず置いておいて、今はこれだけ種類があるようです。
Bracketsで.xhtmlなファイルをlive previewする(ためにOS Xでビルドする)

# Bracketsと.xhtmlファイルの編集

BracketsはAdobe製のオープンソースなコードエディタです。

http://brackets.io/

![brackets.png](https://qiita-image-store.s3.amazonaws.com/0/4293/7621ae24-47f2-2cc7-511f-80103c5ddc85.png)

BracketsはHTMLファイルのlive previewができて捗るのですが、残念ながら拡張子が.xhtmlなファイルではできないようになっています。修正方法は簡単で、issuesにも上がっているのですが、どうもガチなX(HT)MLだとCDATAの扱いとかが云々…という理由で取り込まれていないようでした。

が、その辺りは気にせず変なファイルは作らない前提で.xhtmlファイルを編集したい！　という場合には、自力で修正してビルドすることになります。


# BracketsをOS Xでビルドする

Bracketsのソースはgithubにあります。本体のbracketsとビルド用のbrackets-shellに分かれています。

* https://github.com/adobe/brackets
* https://github.com/adobe/brackets-shell

ビルド方法はbrackets-shellの方のWikiの [Building Brackets Shell](https://github.com/adobe/brackets-shell/wiki/Building-brackets-shell)の方に書かれています。

まずは両方のプロジェクトのソースを取得します。

```shell-session
$ git clone https://github.com/adobe/brackets.git
$ git clone https://github.com/adobe/brackets-shell.git
```

ビルドにはgit、python、Xcode4が必要です。その辺りはお好きにご用意下さい。

あとはNode.jsが必要です。私はnodebrewでインストールしました。

```shell-session
$ nodebrew install v0.11.11
$ nodebrew use v0.11.1
```

brackets-shellのディレクトリに移動して、Gruntをインストールします。

```shell-session
$ cd brackets-shell
$ npm install -g grunt-cli
$ npm install
$ grunt setup
```

この状態で``grunt --help``を実行すると、いろいろタスクが表示されます。

ここまで来たら、``grunt build``でビルドします。

```shell-session
$ grunt build
Running "build" task

Running "build-mac" task

Done, without errors.
```

こんなふうに表示されればビルドの完了です。
xcodebuild/Release　の下に Brackets.app ができているはずです。

# Bracketsを起動する

普通にFinderなどからBrackets.appをダブルクリックしてもいいのですが、bracketsプロジェクトからターミナルを使って起動する場合は以下になります。

```shell-session
$ ./xcodebuild/Release/Brackets.app/Contents/MacOS/Brackets
```

通常のbracketアプリとは異なり、起動直後はファイル選択のダイアログが表示されるので、ここでbracketsプロジェクトの下の``src/index.html``を選択します。そうすると、通常配布されているアプリを起動した時と同じ画面になります。


# .xhtmlのlive previewのためのhack

本題に戻ると、.xhtmlファイルをlive previewするにはbracketsプロジェクトの方のsrc/file/FileUtils.jsに以下のパッチをあてます。

```diff
diff --git a/src/file/FileUtils.js b/src/file/FileUtils.js
index 55c418f..d1fb8ad 100644
--- a/src/file/FileUtils.js
+++ b/src/file/FileUtils.js
@@ -330,7 +330,7 @@ define(function (require, exports, module) {
     }
 
     /** @const - hard-coded for now, but may want to make these preferences */
-    var _staticHtmlFileExts = ["htm", "html"],
+    var _staticHtmlFileExts = ["htm", "html", "xhtml"],
         _serverHtmlFileExts = ["php", "php3", "php4", "php5", "phtm", "phtml", "cfm", "cfml", "asp", "aspx", "jsp", "jspx", "shtm", "shtml"];
 
     /**
```

この状態で再度``grunt build``を実行してバイナリを作り直すと、.xhtmlファイルを開いた場合でもlive previewができるようになっているはずです。
jQuery ExternでjQueryのプラグインを使う


##背景
jQueryのプラグインを使おうと思ったものの、jQueryExternを使ってる場合に
どうやってextern定義を作ればいいのか途方にくれたので。

##どうするの？
https://github.com/andyli/jQueryExternForHaxe/wiki/Haxe-3#pluginHaxe-3
に、jQueryのプラグインを使う場合のexternのやり方が書いてありました。エイゴコワクナイ。

##とりあえずextern定義を作ってみる。
とりあえず、使いたいjQueryプラグインを用意する。
今回の生贄はTextEffects
http://team.fourdesire.com/playgrounds/texteffects


定義をゴリゴリ書く。

```haxe:plugins/TextEffects.hx
package plugins;

import jQuery.*;

extern class TextEffects implements jQuery.haxe.Plugin {
	public function textEffect(?arg:Dynamic):jQuery.JQuery;
	public function textEffectLoop(?arg:Dynamic):jQuery.JQuery;
}
```

簡単ですね。

ディレクトリ構造はこんな感じになります。

```
┬ Main.hx
└ plugins ─ TextEffects.hx
```


呼び出すときはこんな感じで呼び出せます。

```
new JQuery("#hoge").textEffect();
```

もちろん、オプション指定したい場合は

```
new JQuery("#hoge").textEffect({fps:20});
```

で行けます。

##脳みそコネコネ、コンパイル・・・のその前に
定義も終わってゴキゲンにコンパイルをしようとすると、

```
jQuery.JQuery has no field textEffect
```
>**textEffect？知らない子ですね・・・**

とか言われます。

マメにimportしてる人でも

```
Warning : JQuery plugin being imported without compiler option: --macro jQuery.haxe.Config.addPlugin('plugins.TextEffects')
```
>**Hey!コンパイル定義が足りないヨ！**

と言われます。

なので、コンパイル定義にマクロを追加しましょう。

```:build.hxml
--macro jQuery.haxe.Config.addPlugin('plugins.TextEffects')
```

これで無事にコンパイル出来るようになります。

##あれ？オーバーロードは？
Haxeでは本来オーバーロードは許されていないため、メタデータと呼ばれる仕組みを利用して
オーバーロードを行います。

オーバーロードを行う際は次のようにすればオーバーロードの定義が行えます。

````
@:overload(function(str:String,num:Int):String{})
public function foo(?arg:Dynamic):jQuery.JQuery;
````

複数のオーバーロードを定義する場合は、メタデータの記述を関数の上に積み重ねていけばOKです。
また、次の点に気をつけましょう。

- **メタデータには行末のセミコロンは必要ありません。**
- **オーバーロードの最後の空ブロック記述は必須です。**

-

**と、ここまで書いておきながら、jQueryExternでのプラグイン定義は話が別です。**

最新のjQueryExternではマクロでうまいことやってくれてるため、他言語と同じように定義することが出来ます。

前述のextern定義ですが、jQueryExternを使った場合はこんな風にもかけます。

```haxe:plugins/TextEffects.hx
package plugins;

import jQuery.*;

extern class TextEffects implements jQuery.haxe.Plugin {
	public function textEffect():jQuery.JQuery;
	public function textEffect(arg:Dynamic):jQuery.JQuery;
	public function textEffectLoop():jQuery.JQuery;
	public function textEffectLoop(arg:Dynamic):jQuery.JQuery;
}
```

@:overloadが何故か効かない効かないと思って色々探しまわって途方に暮れてました。
ソース読めって話ですね。
AWS Elastic Beanstalk の Worker tier で IAM Roleを使うときの権限設定

普通に、`AWSElasticBeanstalkFullAccess` を選んでもダメで、以下のドキュメントに書いてある `iam` 関連の権限を追加しないといけない。
初回は起動したりするが、environment を rebuild したり、更新したりする時に失敗するので、気が付きにくい。

http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/AWSHowTo.iam.roles.aeb.html

## Worker/Web 共通の設定

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "elasticbeanstalk:*",
        "ec2:*",
        "elasticloadbalancing:*",
        "autoscaling:*",
        "cloudwatch:*",
        "s3:*",
        "sns:*",
        "cloudformation:*",
        "rds:*",
        "sqs:*",
        "iam:AddRoleToInstanceProfile",
        "iam:CreateInstanceProfile",
        "iam:CreateRole",
        "iam:PassRole",
        "iam:ListInstanceProfiles"
      ],
      "Resource": "*"
    }
  ]
}
```

## Worker 用の設定

自動作成キューだと問題は起きないようだが、既存のキューを使う場合は必須。

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "QueueAccess",
      "Action": [
        "sqs:ChangeMessageVisibility",
        "sqs:DeleteMessage",
        "sqs:ReceiveMessage"
      ],
      "Effect": "Allow",
      "Resource": "*"
    },
    {
      "Sid": "MetricsAccess",
      "Action": [
        "cloudwatch:PutMetricData"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}
```
CSSをSASS(SCSS)に書き換えてみて思ったこと


## はじめに
勉強のためhtml->haml、css->sassをやって見ようと思いまして今自分で作っているサイトを試しに単純な変換をしてみました。という話をメモ代わりに書きます。

ビルドはsublime textでやっています。

## 事前設定
sassの事前設定ですが、他に更に詳しく説明してくれてるSO NICEな記事がたくさんありますのでここでは割愛します。私は以下を参考にして設定しました。

http://book.scss.jp/about/c7/editor/st.html
※ちなみにこちらの本わたくしkindleで買いました。HTMLを書くデザイナーの方々もわかり易い内容になってるんじゃないかと思います。
※謎なんですが、私の環境だとpackage installerにcompassがなくて困ってる。でもなんか動いてるけど。

## CSSからSASSのコンバートするサイトがあります
単純にcssをscssに書き換えるだけであれば、以下のサイトがあるためめっちゃ便利です。

[CSS2SASS](http://css2sass.heroku.com)

今回は既存のCSSをこちらで変換したものと見比べてみてSASSがどんなものか見ていくという方法をとりました。

## 引っかかった部分
### Sass::SyntaxError: Invalid US-ASCII character "\xE5"
sublime textで保存時自動ビルドした時に上記のエラーが出る。
こちらは.scssファイルの一行目に下記の記述を入れることで解決しました。

```@charset "UTF-8";```

### &の存在
今回はsassを機能的に使うというよりかは時間がなかったので、sassの中の記述をHTMLタグでネストすることをしていました。その中で気づいたのですが、CSSの中で

```
div .all {
  width: 100%;
  margin: 0px 0px 0px 0px;
  padding: 20px 0px 0px 0px;
  border: 0px #333333 solid;
  background-color: transparent; }
```

と

```
div.all {
  width: 100%;
  margin: 0px 0px 0px 0px;
  padding: 20px 0px 0px 0px;
  border: 0px #333333 solid;
  background-color: transparent; }
```

いうのは意味が変わっちゃうんですね。divと.allの間の空白の話なんですが、div.allと divの中にある.allということでサイトが崩れちゃったので少し迷いました。上記の二つはそれぞれ、以下のように書くことでかき分けることができます。

```
div{
  .all{
	  width:100%;
	  margin:0px 0px 0px 0px;
	  padding:20px 0px 0px 0px;
	  border:0px #333333 solid;
	  background-color:transparent;
	}
}
```
を

```
div{
  &.all{
	  width:100%;
	  margin:0px 0px 0px 0px;
	  padding:20px 0px 0px 0px;
	  border:0px #333333 solid;
	  background-color:transparent;
	}
}
```
とかく必要がありました。&のところですね。

## 最後に
やっぱり変数は手軽かつコードの集約ができるので便利そうです。しかしながら私レベルのサイトだとmixinみたいな機能はあまり実用的ではなくて、場合によってはいままでどおりCSSで書き続けたほうが良いパターンもあるのかなとおもいました。

今回は完全にタグ単位でネストしたため自分ルールで整理するにはめっちゃ良かったです。
UINavigationControllerのinteractivePopGestureRecognizerの感度を調整する

普段、左手でiPhoneを操作している人は、iOS7になってから毎日こんな経験をしているのではないでしょうか。

![](https://raw.github.com/inamiy/YIStrictEdgePanGesture/master/Screenshots/rage-guy.png)

<del>ひどいUXですね</del>

これでは、本来の縦スクロール操作が慎重になってしまい、ストレスが募るばかり。。それもこれも、`UINavigationController`の`interactivePopGestureRecognizer`(`UIScreenEdgePanGestureRecognizer`クラス)の感度が高すぎるのが原因です。

そこで改善策として、`UIScreenEdgePanGestureRecognizer`クラスをメソッド差し替え（swizzle）して感度調整する[<del>涙ぐましい</del>方法](https://github.com/inamiy/YIStrictEdgePanGesture)などがありますが、今回はそれよりももっと簡単で良い方法が見つかったので、その情報共有をします。

ヒントは、Facebookアプリでした。

## interactivePopGestureRecognizer.delegateを自前で実装する（ただし、注意点あり）

標準のUINavigationControllerのジェスチャー＋トランジションを使って感度調整を行っている（と思われる）アプリは、手元のインストール済みアプリの中では、Facebookだけでした。このアプリでは、

- コンテンツのスクロール中に、interactivePopGestureRecognizerを実行しない

という上手い処理が入っているようで、似たところでは、Twitter公式アプリもそのような挙動になっていました。つまり、

```
// viewWillAppearあたり
self.navigationController.interactivePopGestureRecognizer.delegate = self;

...

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    if (gestureRecognizer == self.navigationController.interactivePopGestureRecognizer) {
        
        // (1)
        if (self.tableView.dragging) return NO;
        
        // (2) 
        return [self.navigationController.viewControllers count] > 1;
    }
    return YES;
}
```

と(1)のように書くのが、よりスマートな方法と言えます。

ただし、注意点として、`interactivePopGestureRecognizer.delegate`を標準の`_UINavigationInteractiveTransition`から勝手に奪っているので、 **自己責任のもと、取り扱いにくれぐれも注意する** 必要があります。（カスタムleftBarButtonItemをセット→popGestureを再度ONにした場合も同様）

- [uinavigationcontroller - Changing back button in iOS 7 disables swipe to navigate back - Stack Overflow](http://stackoverflow.com/questions/19054625/changing-back-button-in-ios-7-disables-swipe-to-navigate-back/20330647#comment28683247_19133676)

>One problem with this method is if you perform an edge pan on a root view it will lock up the UI
>
>（意訳）navigationControllerのrootViewController内でinteractivePopGestureRecognizerを実行すると、UIがおかしくなるよ

この対策として、(2)も合わせて入れておくと良いでしょう。

## まとめ

左利きにも優しいUIができた <del>Appleが最初から頑張ればこんなことにはならなかった</del>

### 上記サンプル

- [inamiy/YIStrictEdgePanGesture](https://github.com/inamiy/YIStrictEdgePanGesture)
Ruby toolboxからApp Instrumentationの項目を見る


社内用のさらっとした紹介的なもので、あまり深くは突っ込んでません。

## New Relic RPM

* New Relic
   * [Web Site](http://newrelic.com/)
   * パフォーマンス監視サービス
   * 計測したいサーバにモジュールをインストールして、レスポンスや実行時間などの統計情報をNew Relicのサイトで確認できる
        * アプリの処理、データベースの処理時間など
        * ネットワークのダウンロード時間やDOM構築時間、ページレンダリングなど 
   * いろいろな言語に対応
        * この中でRubyに対応しているのがNew Relic RPM
        * [New Relic railsで検索すると339,000件ほど出てくる](https://www.google.co.jp/search?q=new+relic&oq=new+relic&aqs=chrome..69i57j69i59j69i60l3j0.3362j0j1&sourceid=chrome&es_sm=91&ie=UTF-8#q=new+relic+rails)

### 導入
```
gem install newrelic_rpm
```

とするか、railsならばGemfileに記入するのみ。

```
gem 'newrelic_prm'
```

これだけでOK。

## dashing

* ダッシュボードをつくったりするためのフレームワーク
     * [こんな感じのやつ](http://wired.jp/2013/04/12/big-boards/)
     * [デモサイト](http://dashingdemo.herokuapp.com/sample)
     * デモサイトを見ると、コンバージェンスや流行の言葉をリアルタイムで表示
          * どういうものを表示するかは自分たちで作れる
* 使用するのはウィジェット（ダッシュボードに表示するもの）用のerb、html、Coffescript、sccs
     * 定期的に表示内容を生成するjobをrubyで作れる
     * 内部的にはsprocketsを使ったりしている。

### 導入

gemでインストール下のち、dashingコマンドで新しいプロジェクトを作成する

```
$ gem install dashing
```

```
$ dashing new sweet_dashboard_project
```

プロジェクトのディレクトリに移動して、bundle。その後、dashing startでダッシュボードが起動する。

```
$ bundle
```

```
$ dashing start
```

## Better Errors

* Railsの標準エラー画面をよりよいものに置き換える
    * [Web site](https://github.com/charliesome/better_errors)
    * Full stack trace
    * ソースコードの表示（シンタックスハイライト付きで）
    * ローカル変数やインスタンス変数の表示
    * Live REPL on every Stack frame

### 導入
* development環境で導入。production環境では使用しないよう注意喚起されている。
* マルチワーカーなサーバではちゃんと動かないので、development環境ではワーカーを1つにするか、WebrickやThinなどのsingle processサーバで使うこと。

```
group :development do
  gem "better_errors"
end
```
presentViewController:animated:completion: 後の popViewControllerAnimated: が何かおかしいと思ったら。

ViewController が以下の様な階層になっていて、

・CustomTabBarController
 ・・UINavigationController
  ・・・CustomViewController

いくつか CustomViewController を pushViewController したうえで、CustomViewController から presentViewController したあと dismiss して、
popViewController すると、一応動くけどアニメーションが変になったり、最悪の時には pop しなくなることがあった。

原因は、CustomTabBarController でオーバライドしていた viewDidAppear:animated で、super の viewDidAppear を呼んでいないためだった。
ちゃんと呼んでやることで解決。

```objc
- (void) viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    // do something...
}
```
Sublime Text 2でClojure REPLを使う

（2014/10/24追記あり）

最近、エディタをEmacsからSublime Text 2（以下ST2）に乗り換えたので、ST2でもSlime風のREPL環境を使えるようにしてみる。環境は、Mac上のSublime Text 2で、キーバインドもMacの場合である。Windowsの人はごめんなさい。

まず、Sublime TextのPackage Controlをインストールする。これはググればやり方が沢山出てくるのでここでは説明しない。次に、`Command+Shift+P`を打ってから`Install Package`を選び、`SublimeREPL`を選んでインストールする。

もしLeiningenがシステムグローバルにインストールされていればこの時点でREPLが使えるはずだが、Leiningen経由でClojureをインストールしている場合は違うかもしれない（こっちの方が普通だと思う）。そのような場合は、`SublimeText2 -> Preferences -> Package Settings -> SublimeREPL -> Settings - User` を開いて、

```js:SublimeREPL.sublime-settings
{
    "default_extend_env": {"PATH": "{PATH}:/Users/keisuke/local/bin"}
}
```

のように記述する。`lein`コマンドがインストールされているディレクトリにパスを通す。

以上でSublimeREPL上でClojureが使えるはずだ。
`Tools - Sublime REPL - Clojure - Clojure`
を選べば、新しいバッファで`lein repl`が立ち上がる。`View`メニューからウィンドウを上下に分割して下部にREPLを出すようにすれば完璧。

で、ショートカットキーはというと、`Ctrl+,+[s/b/l/f]`（Control + コンマ + s/b/l/f）となっている。s : Selection=選択範囲をREPLに送信, b : ブロックをREPLに送信、l : 行をREPLに送信、f : ファイルをREPLに送信だ。もっと使い方はありそうだけど、とりあえず満足。

 ![SublimeREPL-screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/17540/09b3ec6b-1d2c-7d1b-24ec-e58798c8add6.png)

（2014/10/24追記）
基本的にreplのプロセスはエディタのサブプロセスとして動作するため、上記のようにただ単にREPLを起動すると、カレントディレクトリがSublimeエディタのディレクトリになってしまう。コレを防ぐには、leinプロジェクト内のproject.cljがアクティブに開かれている状態でREPLを起動すれば良い。これで、コマンドラインから普通に `lein repl` したのと同じように使える。
grapeメモ


Ruby on RailsでAPI用のコントローラ実装が楽になるgrapeを使ってみた。
grapeのバージョンは0.6.1。

# Railsにgrapeをインストール

## gemを使ってインストール

Gemfileに

```
gem 'grape'
```
と追記して

```
$ bundle install
```

## APIクラスの読み込み

あとで作成するAPIクラスのために読み込みを設定する。config/application.rbに下記を追加

```
config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb')
config.autoload_paths += Dir[Rails.root.join('app', 'api', '*')]
```

例

```ruby
module Sample
  class Application < Rails::Application

    config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb')
    config.autoload_paths += Dir[Rails.root.join('app', 'api', '*')]

  end
end
```

## ルーティング

config/routes.rbでルーティングの設定

```
mount API => '/'
```

例

```
Sample::Application.routes.draw do
  mount API => '/'
end
```

## APIクラスの設置

app/apiディレクトリを作りその下にapi.rbを設置。

```ruby
class API < Grape::API
  prefix 'api'
  version 'v1', using: :path
  format :json

  helpers do
    def dummy_name
      "dummy"
    end
    def err401
      error!('401 Unauthorized', 401) 
    end
  end

  resource :room do

    get :status do
      "room is good"
    end

    get :secret do
      err401
    end
  end
end

```

APIアクセスするURLを下記のようになるようにしている。

http://localhost/:3000/api/v1/room/status

http://localhost/:3000/<#プレフィックス#>/<#バージョン#>/<#リソース#>/<#メソッド#>?<#パラメータ#>


## その他

rake routeは下記のようになるのでよくあるControllerのルーティングとは違うことに注意。これで問題ない。

```
$ rake routes
Prefix Verb URI Pattern Controller#Action
api  / API
```

# プライベートメソッド

helpersで行う。例

```ruby
  helpers do
    def dummy_name
      "dummy"
    end
    def err401
      error!('401 Unauthorized', 401) 
    end
  end
```


# バリデーション

```
desc "チェックイン用のAPI"
params do
  requires :twitter_name, type: String, desc: "TwitterName"
end
post 'checkin/' do
end
```

## 必須

```ruby
requires <#シンボル#>
```

## タイプ指定

```ruby
requires <#シンボル#>, type: <#クラス#>
```
Rで重回帰式

##課題

+ 以下のデータにおいて、配向度を温度と圧力から説明する重回帰式を求める。

|No.|配向度|温度|圧力|
|--:|--:|--:|--:|
|1|45|17.5|30|
|2|38|17.0|25|
|3|41|18.5|20|
|4|34|16.0|30|
|5|59|19.0|45|
|6|47|19.5|35|
|7|35|16.0|25|
|8|43|18.0|35|
|9|54|19.0|35|
|10|52|19.5|40|

##手法

+ [R](http://www.r-project.org/)の[lm](http://stat.ethz.ch/R-manual/R-patched/library/stats/html/lm.html)関数を利用する。

##内容

+ スクリプト

```r:stat.R
f <- c(45, 38, 41, 34, 59, 47, 35, 43, 54, 52)                     # 配向度
t <- c(17.5, 17.0, 18.5, 16.0, 19.0, 19.5, 16.0, 18.0, 19.0, 19.5) # 温度
p <- c(30, 25, 20, 30, 45, 35, 25, 35, 35, 40)                     # 圧力

data <- data.frame(f, t, p)

data.lm <- lm(f ~ t + p, data=data) # 重回帰分析

result <- data.lm$coef # 偏回帰係数
names(result) <- c("（定数項）", "温度", "圧力")
```

+ 実行結果（resultを表示）

```
> source('stat.R', encoding='utf-8')
> result
 （定数項）        温度        圧力 
-34.7129308   3.4698126   0.5330095 
```

## 参考

+ [回帰分析と重回帰分析 - R-Tips](http://cse.naro.affrc.go.jp/takezawa/r-tips/r/71.html)
+ [入門はじめての多変量解析](http://www.amazon.co.jp/dp/4489020007)
chefで knife solo cook <host> 後にcookbooks以下が消える

たぶんそんなにハマる人は居ないと思いますが…

berkshelfで使うBerksfile
と
librarian で使う Cheffile

の両方があると競合します。

私の場合はberkcshelfを使おうと思っててlibrarian知らない状態だったのに、なぜか空の Cheffileができてて、

1. knife solo cook <host> 実行
1. berkshelfが実行されcookbooksにダウンロード
1. librarianが実行されcookbooks全消去
1. rsyncされるも転送されず
1. "If you're loading td-agent from another cookbook, make sure you configure the dependency in your metadata"とか言われてエラー

という流れでした。
I18n.enforce_available_locales とは何か？


rake assets:precompile とかすると、以下のメッセージが出る。

```
[deprecated] I18n.enforce_available_locales will default to true in the future. If you really want to skip validation of your locale you can set I18n.enforce_available_locales = false to avoid this message.
```

I18n.enforce_available_locales は、という設定はなんだろう？ Stack Overflow に詳しい投稿がある。

http://stackoverflow.com/a/20381730

i18n Gem の 0.6.9 で導入された機能で、有効なロケールをホワイトリスト形式で設定し、それ以外が指定された場合は例外が発生するようになるようだ。この設定を false にすることで、これまで同じ動き(チェックしない)をするようになる。

このバージョンの i18n は、Rails 4(>= 4.0.2) や Rails 3.2(>= 3.2.14) から導入されている。

また、"will default to true in the future" とあるが、Rails 4.0.4 からデフォルトを true として動作するようになったようだ。

https://github.com/rails/rails/blob/v4.0.4/activesupport/CHANGELOG.md

これに伴い Rails Guide にも記述がある。

http://guides.rubyonrails.org/configuring.html#configuring-i18n

セキュリティ対策にもなるようなので、今後は、デフォルト値である true にしていくのが望ましいのかな。
Macでgem installでunknown argument: '-multiply_definedsuppress'のエラー時の対応

Apple LLVM 5.1 の clang になってから、gem installすると

> clang: error: unknown argument: '-multiply_definedsuppress' [-Wunused-command-line-argument-hard-error-in-future]

なエラーになる。
回避策としては、

> ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future gem install XXX

としてやるとインストール可能。
Pythonで重回帰式

##課題

+ 以下のデータにおいて、配向度を温度と圧力から説明する重回帰式を求める。

|No.|配向度|温度|圧力|
|--:|--:|--:|--:|
|1|45|17.5|30|
|2|38|17.0|25|
|3|41|18.5|20|
|4|34|16.0|30|
|5|59|19.0|45|
|6|47|19.5|35|
|7|35|16.0|25|
|8|43|18.0|35|
|9|54|19.0|35|
|10|52|19.5|40|

##手法

+ [NumPy](http://www.numpy.org/) の [numpy.linalg.lstsq](http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.lstsq.html) を利用する。

##内容

+ スクリプト

```py:stat.py
# coding: UTF-8
import numpy as np

def stat(obj, exp):

    n = exp.shape[1]

    exp = np.vstack([np.ones(n), exp]) # 定数項、説明変数

    coef = np.linalg.lstsq(exp.T, obj)[0] # 偏回帰係数

    return coef

if __name__ == '__main__':

    f = (45, 38, 41, 34, 59, 47, 35, 43, 54, 52)                     # 配向度
    t = (17.5, 17.0, 18.5, 16.0, 19.0, 19.5, 16.0, 18.0, 19.0, 19.5) # 温度
    p = (30, 25, 20, 30, 45, 35, 25, 35, 35, 40)                     # 圧力

    obj = np.array(f)      # 目的変数
    exp = np.array([t, p]) # 説明変数

    b0, bt, bp = stat(obj, exp)

    print "重回帰式: 配向度 = %f + %f*温度 + %f*圧力" % (b0, bt, bp)
```

+ 実行結果

```
> python stat.py 
重回帰式: 配向度 = -34.712931 + 3.469813*温度 + 0.533009*圧力
```

##参考
+ [入門はじめての多変量解析](http://www.amazon.co.jp/dp/4489020007)
Rroongaが内部で使っているGroongaのバージョンを調べるためのワンライナー


Rroonga以外でも、バージョン番号を取得するRubyのAPIを持っているライブラリだったら応用可能なはず。

```bash
$ ruby -r groonga -e "p Groonga.version"
"4.0.0"
```
CakePHPのUPDATE文で、WHERE句の指定の仕方

完全に初心者向けです。すみません。。。

##CakePHPのUPDATE文で、WHERE句の指定の仕方

```sql
UPDATE `table` AS `T` SET `T`.`column` = 'hogehoge' WHERE `T`.`user_id` = xxx;
```

ってしたかったんですよ。
でも、肝心の[CakePHPのドキュメント(jp)](http://book.cakephp.org/2.0/ja/models/saving-your-data.html#model-updateall-array-fields-array-conditions)と[(en)](http://book.cakephp.org/2.0/en/models/saving-your-data.html)を見るとよくわからん。
一緒にsql文も書いてくれればいいのに。。

少しググっても出なかったので、簡単に。

```php
$data = array(
    'T.column' => 'hogehoge',
    'T.modified' => "'" . date("Y-m-d H:i:s") . "'",
);
$conditions = array(
    'T.user_id' => 'xxx',
);
$this->Model->updateAll($data, $conditions);
```

これで、update文でwhere句を指定できます。
where句の条件を第二引数に指定するってことか。。

※以下注意点

 - $data に配列で入れるときは、第二階層（array(array())）にするとうまくCakephpが認識してくれないです。`Model.column`とdotでつなぎましょう。
 - なぜか、modifiedのfieldsが更新されなかったです。だから上記のphpで書いてます。
 - 逆にmodifiedに更新してほしくなかったら、modified = falseでいいともいます。

何かあれば教えて下さい。
ペーペーのエンジニアなので。。。
Vyattaをプロキシサーバにする

#Webブラウズが遅い、、、原因はプロキシ？
どうにもWebブラウズが遅いことがあって困ってます。Zabbixとか使って測定したところでは、どうもプロキシが原因みたいです。
で、Squidのチューニングをいろいろ調べていたのですが、これといって決め手がなく、、、Vyattaでプロキシ立ててみたらどうかな？と思ったので実験してみます。ま、中身は所詮Squidなわけなんですが、ソフトウェアルータ向けのチューニングに期待です。

#まずはベーシックな設定を確認
Vyatta入門に沿って、まずはベーシックな設定を一通り流してみます。
##Webキャッシュサーバの設定
このコマンド一発でWebキャッシュサーバとして動作します。デフォルトではトランスペアレントプロキシになります。Vyatta配下にいればクライアント側にProxy設定はいらないわけですね。
ちなみに、1isten-addressで指定するのはVyattaのローカルインターフェースです。

```
# set service webproxy listen-address 192.168.3.1
# commit
# save
```

##アクセスログで動作確認
一般モードでアクセスログを見て、正常にProxyとして動作していることを確認します。
私の環境では無事に動作していることが確認できました。今VyattaのProxy経由でこの原稿書いてます。

```
$ show webproxy log
```

##キャッシュサイズの変更
下記コマンドでキャッシュサイズが変更できますが、検証はデフォルトのままでいきます。
デフォルトは100MB、10MBに変える場合はこんな感じです。

```
# set service webproxy cache-size 10
# commit
# save
```

##動作モードの変更
実際の環境では、クライアントはVyatta配下にいないので、トランスペアレントモードを無効にします。

```
# set service webproxy listen-address 192.168.3.1 disable-transparent
# commit
# save
```

##ポート番号の変更
VyattaのWebキャッシュサーバはデフォルトで3128番ポートで動作します。
私の環境では 8080 を使いたいので、設定を変更します。

```
# set service webproxy default-port 8080
# commit
# save
```

##クライアントにProxy設定をして動作確認
クライアントでProxyの設定を 192.168.3.1:8080 にして正常にWebを見られることを確認します。

##Squidのコンフィグを確認
Squidのコンフィグを見てみました。一般モードでviで参照します。

```
$ vi /etc/squid3/squid.conf
```

こんなのが吐かれてました。

```
#
# autogenerated by vyatta-update-webproxy.pl
#

acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8
acl net src all
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT

http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access allow net
http_access deny all

cache_dir ufs /var/spool/squid3 100 16 256
cache_mem 20 MB
access_log /var/log/squid3/access.log squid

cache_store_log none

http_port 192.168.3.1:3128

forwarded_for off
```

#まとめ
Vyattaのコマンドヘルプも見てみましたが、プロキシに関してコマンドはあまりないので、後はSquidのコンフィグをいじって、実環境に試験導入してみようと思います。
Rubyで3桁の数で割り切れるかチェック


```ruby
# 3桁の数で割り切れるかチェック
def checkDivided(num)
  min = 111
  max = 999
  # 3桁の積でないものは弾く
  return false  if num < min ** 2  && num > max ** 2

  # minから順に割っていき、割り切れる&商が3桁ならtrue
  min.upto(max) do |x|
    if num % x == 0 && (num / x).to_s.length == 3
      return true
    end
  end

  return false
end
```
Arduino UNO R3 + dfu-programmerって、みんなどうしてるの?

# [2015.11.8更新]この記事は古いです！

[Macへのdfu-programmerのインストールはhomebrewで](http://qiita.com/tadfmac/items/1ce0689ed94a92cbded3)
を参照ください。

## どんなときに使う?

ずいぶん前に、こんなん作りました。

<a href="http://instagram.com/p/hlSed6HChk/"><img src="http://img.dfm.lrv.jp/dfu/phy.png"></a>

これは、中にArduino UNO R3が入っていて、USB経由でMacのDAW (Ableton Live)と連携しています。
いわゆる、USB MIDI フィジコンってやつです。

MIDIにするファームは[morecatlabさんが配布してる「Moco for LUFA」](http://morecatlab.akiba.coocan.jp/morecat_lab/MocoLUFA.html)というものを使わせていただいたのですが、このファームはArduinoに搭載されているATmega328Pじゃない方のICに書き込むためのものです。

Arduino UNOにはATmega328Pとは別にもう1つ、USBシリアル用にATmega8U2 (UNO Rev.3では16U2)というICが搭載されていて、このICのファームを書き換えることで、上記のようなUSB MIDIなどUSBシリアル以外のUSB機器に変更することができます。

![16u2](http://img.dfm.lrv.jp/dfu/board.jpg)

やりかたは、下記サイトを参考にしました。

[『Moco For LUFA』Dm9 Recordsさん](http://www.dm9records.com/index.php/tips/arduino/moco/)
[『iPadとArduino Unoを接続する（２）』SOMTDさん](http://somtd.hatenablog.com/entry/20120212/1329235753)

上記サイトを見れば判りますが、Macだとdfu-programmerというコマンドラインツールを使って、この操作を行います。
しかし、これが使えるようになるまで大変でした。(私だけ?)

今回はdfu-programmerをなんとかする、という記事です。

## なにが問題?

dfu-programmerはMacPortsで入れられます。

> sudo port install dfu-programmer

3/16現在、これで0.5.4が入ります。

しかし、0.5.4では **ATmega16U2を認識してくれない** のです。
つまり、Arduino UNO Rev.3では使えないようです。

一応、試したMacは下記2つです。

- Macbook Air 2013 (OSX 10.8.5)
- Macbook Air 2013 (OSX 10.9.1)

どちらも同じでした。

## 動いたのはVersion 0.6.1 

というわけで、いろいろ試行錯誤しました。
結論から言うとVer.0.6.0、0.6.1、0.6.2 の3つを試しましたが、UNO Rev.3で使えたのは、 **0.6.1だけ** でした。

> **これはあくまで私が試した結果なので、他の人は違う結果になるかもです。**

## ビルドが大変

[Arduino IDE](http://www.arduino.cc/)やXCode、[XCodeのコマンドラインツール](https://developer.apple.com/)がインストールされている前提で、さらに下記が必要です。

- [dfu-programmer Version 0.6.1 ソース](http://sourceforge.net/projects/dfu-programmer/files/dfu-programmer/0.6.1/)
- [libusb](http://www.libusb.org/) ※macportsでも入れられます。

dfu-programmerのソースを展開したら、

> ./configure

と入力したあと、

> make

を実行します。

すると、 **エラーが沢山でます** w

基本的には、下記のようにして **気合で** 直します。

1. 「libusb関連のヘッダファイルが見つからねー」と怒られるので、エラーが出たソースファイルの#include宣言を片っ端から修正する

例：

```dfu.c
#include <libusb.h>
　↓
#include "/opt/local/include/libusb-1.0/libusb.h"
```

> dfu.cだけでなくて、エラーが出た数だけいっぱい直します。
> ※libusbを入れたpathに合わせて修正してください。
> ※環境変数とか、なんとかすれば、なんとかなりそうなのですが、よくわからないので、原始人(primitive)的方法でごりごり進みました。

2. makefileでもライブラリがねーからリンクできねー的なエラーが出るので、ライブラリを指定する

```makefile
LIBS =  -L/usr/lib
　↓
LIBS =  /opt/local/lib/libusb-1.0.dylib
```

> ※強引。。。

これでなんとか通りましたが。。。

## 大変なので置いとく

私もその一人なのですが、正直Arduinoって初心者向けで、ビルドとか開発環境構築とかは、あまりやりたくない人も使ってると思います。
 **作りたいのは作品であって、環境ではない！**w

というわけで、 **自分自身2度とdfu-programmerをビルドできなくなってる感じがする** ので、[自分のためのbin](http://temp.dfm.lrv.jp/dfuprogrammer/dfu-programmer-061bin.zip) を置いておきます。

>  **※このbinは無保証です。自分のMacでしか動作確認していません。使った人に何がおこっても私は責任がとれませんので、自己責任で使ってください。** 

## pathを忘れずに

binが出来ても、pathが通ってないと実行してくれません。
Pathの通し方は、下記を見てください。

[PATHの通し方](http://qiita.com/tk3fftk/items/8b389c0e4b1f9c64ebe3)

私は面倒くさがって、 **最初からPathが通ってる場所に放り込む** という邪道な方法で運用しています。
まねしないようにお願いしますw

## 良いやり方があったら教えてください

というわけで、Arduino UNO R3みんな使ってるはずなのに、どうしてるの？こんなに面倒なことしてるの？マジで？
と思うのが正直なところで、もっと良い方法を知ってる方がいらっしゃいましたら教えてほしいです。
よろしくお願いします。
VB.NET List(Of T) 宣言と同時に初期化

配列の宣言同時初期化のサンプルはネットでよく見かけるけれど、List(Of T) の初期化についてあまり見かけないのと、直ぐに忘れてしまうので備忘録として。

```vb:抜粋
Dim fruitList As New List(Of String)(New String() {"apple", "banana", "citrus"})

For Each fruit As String In fruitList
    Console.WriteLine(fruit)
Next
```

もちろん String の部分は別のオブジェクトでも可能。
HTTPレスポンスのbodyをUTF-8に変換する


文字コードの判定と変換については [こちら](http://qiita.com/shoma2da/items/c77ec534dd36873d73c9) に書きました。

```js
var request = require('request');
var jschardet = require('jschardet');
var Iconv = require('iconv').Iconv;

request({ url : url , encoding : null }, function(err, response, body) {
  if (err) {
    callback(err);
    return;
  }

  //文字コード変換
  var detectResult = jschardet.detect(body);
  var iconv = new Iconv(detectResult.encoding, 'UTF-8//TRANSLIT//IGNORE');
  var convertedString = iconv.convert(body).toString();

  callback(null, convertedString);
});
```

**重要なのは`request`実行時の`encoding`を`null`にしておくことです！**
これがないと`String`に変換されたbodyが帰ってきてしまうので文字コード判定ができなくなってしまいます。
tmuxへのアタッチで画面サイズが合わない時は-d

別の端末からsshで入って既存のtmuxにアタッチした時など画面サイズが合わない時がある。

例えばこんな感じ。

![tmux-d.png](https://qiita-image-store.s3.amazonaws.com/0/39647/61d0a3f5-a01d-2af0-6980-6d4ab0c46ebe.png)

そういう時はアタッチのときに-dをつけると良い。

```bash
$ tmux a -d
```

-dをつけると他の接続が全てデタッチされ、今回アタッチする画面サイズに調整してくれる。
[Xcode] XVimの色々メモ


Xcodeのプラグインである`XVim`、とてもよく出来ています。
いくつかのエディタのVimプラグインを触りましたが、一番よく出来ていると思います。
（.xvimrcで設定書けるし）

なのでもはや手放せないプラグインになりました。
（ただ、Xcode5.1にしたりOSアップデートしたらビルドできなくなったので、少し調整しないと入りませんでしたが・・）

さて、まだまだ知らないコマンドとかあるので、色々メモっておこうと思います。

[ドキュメントはこちら](https://github.com/JugglerShu/XVim/blob/master/Documents/Users/FeatureList.md)

##キーバインドと説明

| キー | 説明 |
|------|------|
| \<C-i>, \<C-o> | 進む、戻る |
| gd | 定義元に飛ぶ |


##コマンド

[コマンドリストはこちら](https://github.com/JugglerShu/XVim/blob/master/Documents/Developers/MenuActionList.txt)

| コマンド | 説明 |
|------|------|
| :xccmd selectPreviousTab<CR> | 前のタブを選択 |
| :xccmd selectNextTab<CR> | 次のタブを選択 |
| :xccmd jumpToNextCounterpart<CR> | ヘッダファイル・実装ファイルの切り替え |
| :xccmd jumpToPreviousCounterpart<CR> | ヘッダファイル・実装ファイルの切り替え |
| :xccmd showDocumentItemsMenu<CR> | Symbol（メソッド名などの一覧）を表示 |
| :xccmd showPreviousFilesHistoryMenu<CR> | ファイル履歴 |
| :xccmd showGroupFilesMenu<CR> | 関連ファイルを表示 |
| :run | Run |
| :make | ビルド |
ChromeOSでのシャットダウンの方法


##終了の仕方
※ 下の経緯にも書きましたが、ログイン画面の終了ボタンを押しても反応しなかった場合の対応方法です。

![ログイン画面](https://qiita-image-store.s3.amazonaws.com/0/23370/64724913-5fc4-1408-c672-1344bae9c26f.png)


#####1. ログインする
#####2. Control + Alt + T をクリック
下の画面となります。
![140316-0002.png](https://qiita-image-store.s3.amazonaws.com/0/23370/a09cad33-c244-9fc4-a4ec-c698bb77b760.png "140316-0002.png")


#####3. shellを実行できるようにする

```
crosh> shell
```

#####4. sudoでシャットダウンする

```
chronos@localhost / $ sudo shutdown -h now
Password: chronos
```

これでシステムを終了することができます。

##経緯
MacOS X 10.9.2
Parallels Desktop 9
Chromium 14.0.834.0

Parallels Desktopには、自動でChromeOSのダウンロード及びインストールができる項目があったので、試してみた。

それで、終了させようと「ログアウト」→「終了」をクリックしたところ、終了できない＼(^o^)／

[Chrome OS のシャットダウン方法](http://j-sp.net/notes/chrome-os-shutdown/)でやり方を見つけたが、ちょっとうまく行かなかったので、ここに記載しておこうと思うに至りました。
（質問）厳密にターゲットブラウザを決めるには？


ここのところフロントエンド周りのワークフローを見直していて、思ったこと。
どのブラウザのどのバージョンがどの機能に対応してるとか全部覚えてられないし一々チェックするのもめんどうなので、
プロダクトのターゲットとするブラウザをあらかじめ厳密に決めておいて、
開発環境で自動的にチェックしてほしいけど方法がわかりません。
（そもそもそういう需要が無い？）

# 使用ツール
- Grunt
- SublimeText3

# やりたいこと
たとえば
- プロダクト固有の設定ファイルか何かでターゲットブラウザ（複数）/バージョンを指定。
- 指定されたターゲットにないHTML5/CSS3/JS5,6の機能を使用していたらLintしてくれるSublimeTextプラグイン/GruntTask。
- あるいは使ってる機能から逆算して対応ブラウザを自動的に判別してくれる

[caniuse](https://www.google.co.jp/search?q=caniuse&oq=canius&aqs=chrome.0.69i59j69i57j69i60l4.4201j0j1&sourceid=chrome&espv=210&es_sm=119&ie=UTF-8)と[ECMAScript 5 compatibility table](http://kangax.github.io/es5-compat-table/)と[ECMAScript6 compatibility table](http://kangax.github.io/es5-compat-table/es6/)とパーサで簡易的に実装はできそうだけど最新版への追従とかめんどくさそう。

## SeleniumとかCI使えばできる？
- まだ触ったことないので今後の課題。

# 知りたい事
- 上記あるいは上記に近いことが実現できるツール


よろしくおねがいします！
awscliとjqを設定


Evernoteに書き溜めている物をQiita化していくことにする。


| 使用環境 | バージョン |
|:-----------|------------:|
| Mac OS X   |   10.7.5   |
| Python     | 2.7.6 |
| awscli     | 1.3.1 |
| jq         | 1.3


## awscliとjqをインストール

awscli（Python2.6以上必要）

```bash
pip install awscli

#versionが上がった場合はupgradeする
pip install awscli --upgrade
```

jq

##
```bash
brew install jq
```


最新バージョンは1.3(2014/3/16)
binaryファイルをダウンロードして実行権限付けるだけで使用可能
http://stedolan.github.io/jq/


## awscli使用準備
**多数のアカウントを持っている場合はcofigにまとめて記載**

```Bash:awscli_account.conf
[profile < account(--profileで記述する名前) >]
aws_access_key_id = < access key >
aws_secret_access_key = < secret key>
region = < aws region >

#記述例
[profile gacharion]
aws_access_key_id = ABCDEFG
aws_secret_access_key = secret1234access
region = ap-northeast-1

#defaultは"-profile"を指定しない場合に適用される
[default]
aws_access_key_id = <default access key>
aws_secret_access_key = <default secret key>
region = <default region>

```

**コンソール起動時にtab補完が効くようにする。
また、上記confのパスを設定しないと"--profile"で指定できないのでexportしておく。**

```Bash:.bashrc
# tab補完
complete -C aws_completer aws
# "--profile"でアカウント指定する際の情報を記載したconfig
export AWS_CONFIG_FILE=/home/gacharion/awscli_account.conf
# regionのdefaultを東京リージョンに（⬆のconfigでも指定しているので、どちらかで大丈夫）
export AWS_DEFAULT_REGION=ap-northeast-1
```

```
# zshの場合のtab補完は下記
# virtualenv環境の場合
source ~/.virtualenvs/2.7.6/bin/aws_zsh_completer.sh
```

## 使い方

```bash
$ aws --version
aws-cli/1.3.1 Python/2.7.6 Darwin/11.4.2

$ jq

jq - commandline JSON processor [version 1.3]
Usage: jq [options] <jq filter> [file...]

For a description of the command line options and
how to write jq filters (and why you might want to)
see the jq manpage, or the online documentation at
http://stedolan.github.com/jq
```

###AvailabilityZone毎のスポットインスタンス台数をとる例

```bash
$ aws ec2 describe-spot-instance-requests \
    --profile gacharion \
    | jq '[ .SpotInstanceRequests[] | { LaunchedAvailabilityZone } ] | group_by(.LaunchedAvailabilityZone) | .[] | .[0] + { "Count": length }'
```
htmlをhamlに書き換えてみて思ったこと

hamlを書いてみたかったので、一番手軽なところで普通のhtmlで書いていたものを手書きでhamlに書き換えてみた。
いくつかメモしておきたかったのでメモします。

## まずhtmlをhamlにするにはこれがある

やっぱり便利なものを作ってるかたはいるもので、感謝。WEBのフォームで変換できます。
[html2haml](http://html2haml.heroku.com) 

## コンソールからもできるっぽいです。
hamlだけでなくhtml2hamlというのがあるんですね。
```
$ sudo gem install html2haml
インストール後に
$ html2haml index.html index.haml
```

とかです。

## sublimeな人たちへ

hamlを保存時にビルドをしてくれる設定を入れておくと捗ります。以下のURLがとても参考になります。
http://dev.classmethod.jp/tool/haml-with-sublime-text-2/

## 引っかかった集

### Invalid US-ASCII character "\xE3" って出る

以下のエラーがsublimetextでのビルドだけ出てまして、コンソールで 'haml index.haml index.html' した時はでないという謎な感じで。
```
Haml error on line XX: Invalid US-ASCII character "\xE3"
  Use --trace for backtrace.
```
でこれについては、hamlファイルの先頭行に
```
- # coding: utf-8
```
と入れると大丈夫になりました。文字コード。

### htmlの-(ハイフン)が入ってる属性値は工夫がいる
例えば
```
<meta content='IE=edge,chrome=1' http-equiv='X-UA-Compatible'>
```
の http-equiv='X-UA-Compatible の部分なのですが、最初特に何も考えずにrubyのハッシュ的な感じで
```
%meta{:content => "IE=edge,chrome=1", :http-equiv => "X-UA-Compatible"}
```
と書いたらエラーでした。そうだ、ハイフンだめだーと思ってどうしようかと思ってとりあえず
```
%meta{:content => "IE=edge,chrome=1", 'http-equiv' => "X-UA-Compatible"}
```
という場当たり的なニュアンスでとりあえず通りましたが、他にも
```
%meta{ http:{ :equiv =>"X-UA-Compatible"}, :content => "IE=edge,chrome=1" }
や、ニュアンス違いで
%meta{content: "IE=edge,chrome=1", "http-equiv" => "X-UA-Compatible"}
```
こういう書き方もできるようで、統一する上でどうしたものかと現在悩んでいるところです。

## Googleアナリティクスとかjsどうしようかなっと
```
var _gaq = _gaq || [];
      _gaq.push(['_setAccount', 'UA-XXXXXXXX']);
      _gaq.push(['_trackPageview']);
      (function() {
        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
      })();
```
こういうやつなのですが、これはこれでまたインデントが<script></script>内のjavascriptにもあるので、インデントをもとにしているhamlでどうするんだろうーっておもってましたが、さすが、

:javascript

をjavascript部の先頭に書けば一発でした。cssとかも同様のようです。
## 最後に
一応手書きで書いてなんとなくニュアンスを触れたので、html2hamlでコードを自動変換してみた。
それをみながら「こーかくのねー」などと勉強しているところです。

やっぱり、静的なHTMLでHAMるっていうよりかは、Railsとかで動的に生成するようなときにかなり熱い感じなのだろうなーと触ってみて実感しました(Railsだとbuildいらないですし)
まだRubyの文法でプログラム的に記述をしていないのでそちらも試してみたいです。
hamlのおかげでhtmlの構造が見やすくなったので、その流れでCSSをSass化してみるをやりたいと思います。