OmniAICreator/Qiita-1.07M huggingface dataset:
Visual Studioでコード補完を効かせてNode.jsを書く

新生Microsoftから無償Community版も出て、地上最強のIDEであるVisual StudioでJavaScript / Node.jsを書く時代が来ました。でも現状では、ちょっとわかりにくいところが4つほどあって私はハマったので、解決法をシェアします。

### 1. 「Node.js Tools for Visual Studio」を使うと型定義ファイルをインストールできない

Visual StudioでNode開発するのに便利そうなパッケージ：

[Node.js Tools for Visual Studio - Home](https://nodejstools.codeplex.com/)

これを使えばいいのかなと思ったのですが、使うと他の型定義ファイルをインストールできなくなりました。なんで？？？

### 2.「JavaScriptアプリケーション」を作ることができない

新しいプロジェクトを作ろうとしても「JavaScript HTMLアプリケーション」がテンプレートにありません。あるのはApache Cordova用のモバイルアプリのテンプレートのみ。仕方がないので「TypeScript HTMLアプリケーション」を選びましょう（[sukobuto](http://qiita.com/sukobuto)さん、教えてくれてありがとう！）。

![vsnode10.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/c1ea1093-cbce-197f-645f-c527e90dbffc.jpeg)

実際に書いているのはTypeScriptなんですが、型定義とかせずに普通にJavaScriptを書いても問題ありません。

### 3. Node.jsの型定義ファイルをインストールしてもコード補完できない

まずNode.jsの型定義ファイルをインストールしましょう。

![vsnode20.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/99b9eb7c-20b2-aa43-fecc-c68fa4894411.jpeg)

1. 「プロジェクト」→「NuGetパッケージの管理」
2. 「オンライン」の「すべて」を選択
3. 「node typescript」で検索
4. 「node.TypeScript.DefinitelyTyped」をインストール

「これで補完天国来た！」と思いきや全然補完してくれません。

原因は上記パッケージをインストールすると

- Node 0.8用の型定義ファイル
- Node 0.10用の型定義ファイル
- Node 0.11用の型定義ファイル

これらすべてがインストールされてしまい、お互いに名前衝突しまくってます。おーい。

![vsnode30.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/9be15005-423f-4bfa-f1c7-e3646e93aed1.jpeg)

仕方がないのでソリューションエクスプローラ上の

（プロジェクト名）＞Scripts＞node＞node-0.8とnode-0.11

を右クリックして削除しましょう。

### 4. まだ「コンパイルできません」というエラーが出る

![スクリーンショット 2014-12-03 16.25.06.png](https://qiita-image-store.s3.amazonaws.com/0/12939/6b66ebb2-0aa6-2479-e48a-08c49b340eb5.png)

これで最後です。

![vsnode40.jpg](https://qiita-image-store.s3.amazonaws.com/0/12939/7cedb2b7-2856-0627-d59d-5ac7fb94b9ff.jpeg)

「プロジェクト」メニュー＞「（プロジェクト名）のプロパティ」を開き、左側の「TypeScriptビルド」を選択し、「モジュールシステム」を「なし」から「CommonJS」に変更しましょう。

### 5. 補完！補完！

![スクリーンショット 2014-12-03 16.32.00.png](https://qiita-image-store.s3.amazonaws.com/0/12939/7bee8cd8-38cb-fb29-6bac-740dfbb22e66.png)

素敵なJavaScript / Node.jsプログラミングを楽しみましょう！

---
ブログやっています：[Weed software](http://weed.cocolog-nifty.com/wzero3es/)
HerokuとDropboxを連携する方法



先日herokuからDropboxとのリンクができるようになったということなので、そのメモ
ただし、BETA版です。

## 手順
1. Dropboxとリンクする
2. Appを更新
3. デプロイ


## 1. Dropboxとリンクする
1. herokuのダッシュボードにアクセス
2. リンクしたいアプリを選択（なければ作成）
3. __Code__ タブを選択
4. 下方にあるDropbox BETA の __Connect to Dropbox__ をクリック
5. Dropboxで権限を許可


	Dropbox/アプリ/Heroku/app-name

のディレクトリが作成される

## 2. Appを更新

Dropboxを同期していれば

	Dropbox/アプリ/Heroku/app-name

にあるファイルを更新するだけです。

## 3. デプロイ

> You have to click the “Deploy” button in Heroku dashboard when you want to deploy changes, changes are not automatically synced.

#### Dropboxに同期していても、自動でherokuには反映してくれません。
そのため、更新が終わったら手動でのデプロイが必要です。


1. herokuのダッシュボードにアクセス
2. デプロイしたいアプリを選択
3. __Code__ タブを選択
4. 下方にあるテキストボックスにコミットメッセージを入力
5. __Deploy__ をクリック


で、反映されます。
S3、Kinesis/DynamoDB StreamsでのLambdaリトライ処理


# <i class="fa fa-exclamation-triangle" aria-hidden="true"></i> 注意点

```
こちらの記事の内容と現在のリトライ動作は異なっています。
詳細は下記の公式ドキュメントを参照してください。
```

[エラー時のリトライ - AWS Lambda公式ドキュメント](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/retries-on-errors.html)
[AWS Lambda のイベントソースごとの呼び出しタイプ - Qiita](http://qiita.com/ikeisuke/items/37b6b7dd034b1ed1ff29)

# 概要

Lambda ファンクション内で `context.done()` の第1引数に `null` 以外の値を渡すと処理失敗となりリトライが発生する。
各イベントソースによるリトライ処理を調べてみた。

# S3

* 処理失敗時には 3 分後に再度ファンクションが呼び出される。
* `context.invokeid` は前回と同じ値になる。
* リトライを含めて最大 3 回実行される。

## ETagの比較

US Standard は全ての操作で結果整合性、それ以外のリージョンでは新規作成以外の操作で結果整合性をもって動作する。
Lambda に限らず S3 のオブジェクトを取得する場合は ETag を確認したほうがいい。

http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/Introduction.html#Regions

`IfMatch` を渡せば指定の ETag にマッチした時だけ取得成功となる(失敗時は412が返ってくる)。
ちなみに、ここでは使っていないが `s3.getObject()` の戻り値に含まれる ETag は二重にクォートされているので注意。

```js:handler
s3.getObject({
  Bucket: bucket,
  Key: key,
  IfMatch: event.Records[0].s3.object.eTag
}, function(err,data) {
  if (err) {
    console.log(JSON.stringify(err, null, 2));
    context.done('error', err);
  } else {
    context.done();
  }
});
```

```js:err
{
  "message": "At least one of the pre-conditions you specified did not hold",
  "code": "PreconditionFailed",
  "time": "2014-12-03T02:54:39.101Z",
  "statusCode": 412,
  "retryable": false
}
```

# Kinesis

* Truncated Exponential Backoff というやつ？
* インターバルが 1 秒、 2 秒、 4 秒、 8 秒、 ・・・というふうに増えていく。
* インターバルは 60 秒前後が最大値っぽい。
* `context.invokeid` は毎回違う値になる。
* リトライを含めて最大 10 回実行される。

# DynamoDB Streams

当然と言えば当然だけど Kinesis と同じ挙動だった。
gzip圧縮が効いたWebページをfile_get_contents()で取得してデコードする方法

gzip通信を有効にしてWebページのフェッチを行うと、帯域や通信量が節約できるだけでなく、回線次第では応答速度も速まります。
PHPであればどの環境でも基本的に使える`file_get_contents`関数を用いて、gzip通信を行うサンプルを紹介します。

まず、file_get_contentsと併用してgzipをデコードする実装は大きく分けて2つあります。

* PHP 5.4 からは[gzdecode関数](http://php.net/manual/ja/function.gzdecode.php)が使える
* PHP 5.4 未満は次のような実装を自前で用意する必要がある

```php
// その1
if(!function_exists("gzdecode"))
{
    function gzdecode($data){
        return gzinflate(substr($data, 10, -8));
    }
}

// その2
function gzDecodeWithTmpFile($data)
{
    $gzfile = tempnam('/tmp','gzdecode');
    file_put_contents($gzfile, $data);
    ob_start();
    readgzfile($gzfile);
    $result = ob_get_clean();
    return $result;
}
```

## 実装サンプル

先ほどの例を踏まえて、PHP5系のバージョン差異を吸収できる実装サンプルは次の通りです。

```php
<?php

class GzipHttpRequest
{
    static public function fetchUrl($url)
    {
        $context = self::getStreamContext();
        $content = file_get_contents($url, false, $context);
        if (self::isGzipResponse($http_response_header)) {
            return self::gzdecode($content);
        } else {
            return $content;
        }
    }

    static private function getStreamContext()
    {
        $opts = array(
            'method' => "GET",
            'header' => implode("\r\n", array('Accept-Encoding: gzip,deflate'))
        );
        return stream_context_create(array('http' => $opts));
    }

    static private function isGzipResponse($headers)
    {
        foreach($headers as $header) {
            if (stristr($header, 'content-encoding') and stristr($header, 'gzip')) {
                return true;
            }
        }
    }

    static private function gzdecode($data)
    {
        if(function_exists("gzdecode")) {
            return gzdecode($data);
        } else {
            return gzinflate(substr($data, 10, -8));
            // 一時ファイルを書き出してデコードする手法もあります
            //return self::gzDecodeWithTmpFile($data);
        }
    }

    static private function gzDecodeWithTmpFile($data)
    {
        $gzfile = tempnam(sys_get_temp_dir(), 'gzdecode');
        file_put_contents($gzfile, $data);
        ob_start();
        readgzfile($gzfile);
        $result = ob_get_clean();
        return $result;
    }
}

$url = "http://www.yahoo.co.jp/";
echo GzipHttpRequest::fetchUrl($url);
```


## curlを使う場合

PHPがcURLサポート付きでコンパイルされており、なおかつcurl 7.10以降を利用している場合には、次のオプションも便利です。

```php
curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
```

ref. http://php.net/manual/ja/function.curl-setopt.php


## 参考サイト

* PHP file_get_contents giving garbled output
http://digitalpbk.com/php/file_get_contents-garbled-gzip-encoding-website-scraping

* Php – Fetch gzipped content over http with file_get_contents
http://www.binarytides.com/php-fetch-gzipped-content-over-http-with-file_get_contents/
Theme.MaterialのSwitchをカスタマイズする際の注意

もしHoloテーマのSwitchをカスタマイズしている場合、そのままMaterialテーマを適用してしまうと正常に表示できないことがあるので注意が必要です。

##Thumb
Holoテーマでは下記のようなdrawableリソースをthumbに割り当ててつまみ画像を変更することができました。

```xml
<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="false">
        <shape android:shape="rectangle">
            <corners android:radius="2dp"/>
            <solid android:color="@color/gray"/>
        </shape>
    </item>
    <item android:state_checked="true">
        <shape android:shape="rectangle">
            <corners android:radius="2dp"/>
            <solid android:color="@color/orange"/>
        </shape>
    </item>
</selector>
```

![switch_holo.png](https://qiita-image-store.s3.amazonaws.com/0/59980/429b2d3a-b08a-a24a-32f3-e448cd6784b6.png)


ところがこの表記のままMaterialテーマを適用してしまうと、おそらくSwitchが表示されなくなってしまうと思います。
サイズ指定は忘れずに。

```xml
<shape android:shape="rectangle">
    <corners android:radius="2dp"/>
    <solid android:color="@color/orange"/>
    <size android:width="48dp"
          android:height="28dp"/>
</shape>
```

![switch_material.png](https://qiita-image-store.s3.amazonaws.com/0/59980/5a14c727-bb93-6399-cd5d-af4b434ad51e.png)  


##Text
MaterialテーマではtextOn, textOffのテキストがデフォルトで表示されません。
showTextをtrueに設定しましょう。
Excelで「表示形式」のセル書式が反映されない場合の対処法


TSVなどのデータをExcelに貼り付ける場合、勝手にデータが変更されないように（0001が1になるなど）、セルの書式設定で表示形式を「文字列」にしてから貼り付けることが多い。

以下は「文字列」で貼り付けた例。文字が左に寄っていることからもそれがうかがえる。（設定によっては緑三角が見える？）

![p1.PNG](https://qiita-image-store.s3.amazonaws.com/0/51910/e8a19e7f-33eb-bcd6-edf9-72c47e6b8f52.png "p1.PNG")

しかし、idなどの情報は数字として扱いたい。なぜなら「文字列」として貼ってある状態でソートすると辞書順になってしまうから。（1、10、2のように並んでしまう）

貼る前の段階でそういう書式設定にしていれば問題ないのだが、数字として扱いたい列が複数ある場合は、まず貼り付けてからそれを行った方が楽。
しかし、Excelは既にデータがある状態で表示形式を変えても、反映されないことがある。。

以下のように「文字列」表示形式で貼り付けたものを、「標準」表示形式に変えても、見た目やソートの扱いは文字列のまま。。

![p2.PNG](https://qiita-image-store.s3.amazonaws.com/0/51910/a37a9faf-88db-c030-604c-cbc56e0b2f13.png "p2.PNG")

この場合、一度F2を押してセルの中に入り、エンターを押すと現在の書式を適用させることは出来る。（自分はこれを「セル内容の再確定」と呼んでいる）
しかし、その対象が多いと非常に手間。

以下のVBAモジュールを作成し、書式を適用したいところを選択状態にして実行すると、それを一括で行うことが出来る。

```vbnet
Sub reconfirm()
    For Each e In Selection
        e.Value = e.Value
    Next
End Sub
```

実行後、以下のようになり、「標準」表示形式が適用されたことが分かる。

![p3.PNG](https://qiita-image-store.s3.amazonaws.com/0/51910/ee408b6b-62c9-ee7a-7881-842e784ec6ab.png "p3.PNG")
JavaScript (TypeScript) のクラスを後から継承する

# 状況
以下の様な状況の際に、「JavaScript のクラスを後から継承したい」という状況になった。

```
- lib
  |- foo.js
  |- foo
     |- bar.js
  
- index.js
- package.json
```

## index.js
```js
module.exports = require('lib/foo.js');
```

## lib/foo.js

```js
var Bar = require('foo/bar');

function Foo() {
}

Foo.Bar = Bar;

module.exports = Foo;
```

このようなプログラム構成 (export するクラスが名前空間になっている場合) で、「Foo.Bar クラス < Foo クラス」の関係を作りたい。

# 対処方法
## 案1

Foo クラスを移動させ、lib/foo/bar.js < lib/foo/foo.js で継承する。正攻法。

```
- lib
  |- foo.js
  |- foo
     |- foo.js
     |- bar.js

- index.js
- package.json
```

### lib/foo.js

```js
var Foo = require('foo/foo');
var Bar = require('foo/bar');

Foo.Bar = Bar;

module.exports = Foo;
```

## 案2
後から継承する。他のプログラムでも流用できそうだったので、ライブラリ化しました。
(「ライブラリにクラスを渡す → 内部クラスを親クラスとして拡張して返す」ということにも流用できそう。)

- [pine613 / typescript-after-extends](https://github.com/pine613/typescript-after-extends)

### lib/foo.js

```js
var Bar = require('foo/bar');
var afterExtends = require('typescript-after-extends');

function Foo() {
}

Foo.Bar = afterExtends(Bar, Foo); // Bar < Foo

module.exports = Foo;
```

# あとがき
他にもっと良い方法があれば、コメントなどで知らせてくれたら嬉しいです。
vimでEUCの機種依存文字が文字化けする場合に文字コードを指定する方法

#vimで文字化け

基本的にvimは自動的に文字コードを判定するが判定に失敗する場合もある。
その場合直接文字コードを `vim -c ":e ++enc=euc-jp-ms" ファイル名` のように指定して開くと良い

##文字コードの指定

`vim -c ":e ++enc=euc-jp-ms" ファイル名`以外でも文字化けするfileを予め開き 
` :e ++enc=euc-jp ` とコマンド打てば任意の文字コードを指定できる。

##機種依存文字

前述のeuc-jp-msはeuc-jpとは異なる
phper（それ以外でも）なら経験があると思うが `euc-jp` はNEC特殊文字が正しく扱えずvimを開くときエラーが発生する

その場合 `euc-jp-ms` を指定する
ただし `CP51932` で書かれた文章（windowd環境でeucと言えばこっち）は正しく扱えないので注意する必要がある

注1 `髙：はしごたか` `㈱` `①`などあるようなら要注意
注2 Windows環境上で使ってるeucは `CP51932` でwindowdが関わってない方が`euc-jp-ms` 紛らわしいね
ListFragmentをFragmentTabHostで管理する際にタブ切り替えでFooterViewが消える現象の対処法

ListFragmentでaddfooterview()をしてFragmentTabHostでタブ切り替えして、addfooterview()をしたListFragmentのViewに戻るとaddfooterviewしたViewが消えている現象の対処法として、まずonCreate()などでフッターに入れたいViewを生成し、メンバ変数で保持する。

```ListFragment.java
//リストフラグメントからListViewを取得
_listview = getListView();

__footer = getActivity().getLayoutInflater().inflate(R.layout.time_line_list_footer_layout, null);
_btn = (Button)_footer.findViewById(R.id.add);

@Override
public void onResume()
{
    super.onResume();
    if(_listview.getFooterViewsCount() == 0)
    {
        _listview.addFooterView(_footer);
    }
}
```

getFooterViewsCount()でgetFooterViewsCountが0だったら（_footer）が存在しなかったらaddFooterView(_footer)をする。
ツールボックスでの検索機能を使って、コントロールを効率的に探す方法

[ツールボックス] には、プロジェクト内に追加できるコントロールが表示されます。通常、ツールボックスは作業中のファイルに適したツールのみが表示されますが、検索をすることでさらに絞り込むことができ、目的のコントロールを素早く見つけることができます。

**具体的な手順**

1.Visual Studio 2013 を起動します。
2.[新しいプロジェクト] をクリックします。
 ![1[2].png](https://qiita-image-store.s3.amazonaws.com/0/34023/f73e737c-c8b6-831e-3958-2052f2df57f3.png)

3.[テンプレート]-[Visual C#]-[ストアアプリ]-[ユニバーサル アプリ] を選択後、“空のアプリケーション (ユニバーサル アプリ)” を選択後、[OK] ボタンをクリックします。
![2[2].png](https://qiita-image-store.s3.amazonaws.com/0/34023/1b25cc99-426f-cfb8-96c3-d11f4777291c.png)
 

4.[ソリューション エクスプローラー] で “MainPage.xaml” をダブルクリックしてデザイン用の画面を表示させます。
![3[1].jpg](https://qiita-image-store.s3.amazonaws.com/0/34023/d400002e-62a0-b7df-1661-be5d6fc41ea0.jpeg)
 

5.ツールボックス内に利用可能なすべてのコンポーネントが表示されています。表示されていない場合には [表示]-[ツールボックス] をクリックし表示します。
6.[ツールボックスの検索] テキストボックス内に “button” と入力します。
![4[1].png](https://qiita-image-store.s3.amazonaws.com/0/34023/1e337553-62a5-b1e8-23a2-fef7ca9d0ddb.png)
7. ツールボックス内に“button” に関連したコンポーネントのみが表示されます。
![5[1].png](https://qiita-image-store.s3.amazonaws.com/0/34023/042168f4-253e-5194-fa0f-f317fa4113d3.png)

参考) [MSDN ライブラリ: ツールボックス](http://msdn.microsoft.com/ja-jp/library/vstudio/2381cd09(v=vs.120).aspx)
【Perl】Perlモジュールのメンバとして配列を持たせたらundefined value as an ARRAY referenceではまった話


#追記
モジュールのメンバというかハッシュに配列入れた場合ですね。

#概要

```perl:AAAModule.pm

package AAAModule;

sub new
{
	my $className = shift;

	my %a;

	# 配列を持たせる.
	$a{data_list} = ();

	return bless \%a, $className;
}

sub KorewoYobidasu
{
	my @aaa = ("aaa", "bbb");
	$a{data_list} = ¥@aaa;
}

sub GetDataList
{
	my $obj = shift;
	return @{$obj->{data_list}};
}
```

> return @{$obj->{data_list}};

のところで

> Can't use an undefined value as an ARRAY reference at

する。なんでや！わいは怒ったで！！

# 結論

とかやってたんだけど。

> $a{data_list} = ();

では配列のリファレンスが入るのだとばかり思ってたけど、配列リファレンスで初期化する場合は

> $a{data_list} = [];

だったというオチ。
このとき無名配列リファレンスなるものを初めて知ったのだった...
【解答例】Haskell アクションとラムダ 超入門

[Haskell アクションとラムダ 超入門](http://qiita.com/7shi/items/4a8a2807bb5186576c61)の解答例です。

# シャッフル

【問1】次のコードから`do`を取り除いて、`>>=`でつないでください。

```hs
import System.Random

shuffle [] = return []
shuffle xs =
    (getStdRandom $ randomR (0, length xs - 1) :: IO Int) >>= \n ->
    (shuffle $ take n xs ++ drop (n + 1) xs) >>= \xs' ->
    return $ (xs !! n) : xs'

main =
    shuffle [1..9] >>=
    print
```
```text:実行結果（毎回異なる）
[3,5,4,9,2,7,8,6,1]
```

# 配列の更新

【問2】配列には`modifyIORef`に相当する関数がありません。`modifyArray`を実装してください。

```hs
import Data.Array.IO
import Control.Applicative

modifyArray a i f = writeArray a i =<< f <$> readArray a i

main = do
    a <- newArray (0, 2) 0 :: IO (IOUArray Int Int)
    print =<< getElems a
    modifyArray a 1 (+ 5)
    print =<< getElems a
```
```text:実行結果
[0,0,0]
[0,5,0]
```

# 再実装

【問3】`replicateM`, `replicateM_`, `forM`, `forM_`, `when`, `unless`を再実装してください。関数名には`'`を付けてください。

```hs
import Control.Applicative
import System.Random

replicateM' 0 _ = return []
replicateM' n a | n > 0 = (:) <$> a <*> replicateM' (n - 1) a

replicateM_' 0 _ = return []
replicateM_' n a | n > 0 = a >> replicateM_' (n - 1) a

forM' [] _ = return []
forM' (x:xs) f = (:) <$> f x <*> forM' xs f

forM_' [] _ = return []
forM_' (x:xs) f = f x >> forM_' xs f

when' b a = if b then a else return ()
unless' b = when' $ not b

main = do
    let dice = getStdRandom $ randomR (1, 6) :: IO Int
    print =<< replicateM' 5 dice
    putStrLn "---"
    replicateM_' 3 $ do
        print =<< dice
    putStrLn "---"
    a <- forM' [1..3] $ \i -> do
        print i
        return i
    print a
    putStrLn "---"
    forM_' [1..3] $ \i -> do
        print i
    putStrLn "---"
    let y f = f (y f)
    y $ \f -> do
        r <- dice
        print r
        when' (r /= 1) f
    putStrLn "---"
    y $ \f -> do
        r <- dice
        print r
        unless' (r == 6) f
```
```text:実行結果（毎回異なる）
[4,3,2,5,1]
---
2
6
2
---
1
2
3
[1,2,3]
---
1
2
3
---
3
2
1
---
6
```

# 正規乱数

【問4】0.0～1.0までのDouble型の乱数を12個足したものを四捨五入して6を引いた整数値について、100回の分布を求めてください。四捨五入には[round](http://hackage.haskell.org/package/base-4.7.0.1/docs/Prelude.html#v:round)ではなく、切り捨て関数[truncate](http://hackage.haskell.org/package/base-4.7.0.1/docs/Prelude.html#v:truncate)を工夫して使用してください。

```hs
import Control.Monad
import System.Random

rand :: IO Double
rand = getStdRandom $ randomR (0.0, 1.0)

main = do
    r <- replicateM 100 $ do
        rands <- replicateM 12 rand
        return $ truncate (sum rands + 0.5) - 6
    forM_ [-3 .. 3] $ \i -> do
        let c = length $ filter (== i) r
            i' = show i
            n = replicate (2 - length i') ' ' ++ i'
        putStrLn $ n ++ ": " ++ replicate c '*'
```
```text:実行結果（毎回異なる）
-3: *
-2: ******
-1: ****************************
 0: **********************************
 1: ***********************
 2: *******
 3: *
```

[中心極限定理](http://ja.wikipedia.org/wiki/%E4%B8%AD%E5%BF%83%E6%A5%B5%E9%99%90%E5%AE%9A%E7%90%86)により[正規乱数](http://ja.wikipedia.org/wiki/%E4%B9%B1%E6%95%B0%E5%88%97#.E6.AD.A3.E8.A6.8F.E4.B9.B1.E6.95.B0)を生成しています。
Doctrine1: フロントエンドコマンド


# db.php

- phpenvで入れたPHP5.5.19で確認
- Doctrine1はcomposerでいれてる(../vender/doctrine/doctrine1)
- db.php で以下をコピペ

```php:db.php

#!/usr/bin/env php
<?php

# Configuration
require_once(dirname(__FILE__).'/db.conf.php'); // $DB にパラメータを設定

$dsn = "mysql:dbname={$DB['DBN']};host={$DB['DBH']}"; 
$user = $DB['DBU'];
$password = $DB['DBP'];

$BASE = dirname(__FILE__). "/data";

# Directory Configuration for Doctrine
$config = array();
foreach(['data_fixtures', 'models', 'migrations', 'sql', 'yaml_schema'] 
        as $i ){
    $p = "{$BASE}/{$i}";
    $config["{$i}_path"] = $p;
    @mkdir($p, 0777);
}


# Load & Register Library
require_once(dirname(dirname(__FILE__)) . '/vendor/doctrine/doctrine1/lib/Doctrine.php');

spl_autoload_register(array('Doctrine', 'autoload')); 
spl_autoload_register(array('Doctrine', 'modelsAutoload'));
spl_autoload_register(array('Doctrine', 'extensionsAutoload'));

# Doctorine Configuration
$manager = Doctrine_Manager::getInstance();

$manager->setAttribute(Doctrine::ATTR_VALIDATE, Doctrine::VALIDATE_ALL);
$manager->setAttribute(Doctrine::ATTR_EXPORT, Doctrine::EXPORT_ALL);
$manager->setAttribute(Doctrine::ATTR_MODEL_LOADING, Doctrine::MODEL_LOADING_CONSERVATIVE);
$manager->setAttribute(Doctrine::ATTR_AUTO_ACCESSOR_OVERRIDE, true);
$manager->setAttribute(Doctrine::ATTR_AUTOLOAD_TABLE_CLASSES, true);

# Connect Database
$conn = Doctrine_Manager::connection(new PDO($dsn, $user, $password));


# Command Execution

(new Doctrine_Cli($config))->run($_SERVER['argv']);

?>
```

# 確認

```
$ ./db.php 

Doctrine Command Line Interface

./db.php compile
./db.php rebuild-db
./db.php generate-migrations-diff
./db.php build-all-load
./db.php create-db
./db.php build-all-reload
./db.php dump-data
./db.php load-data
./db.php build-all
./db.php dql
./db.php generate-models-db
./db.php generate-migration
./db.php generate-yaml-models
./db.php drop-db
./db.php generate-migrations-models
./db.php generate-models-yaml
./db.php generate-sql
./db.php generate-migrations-db
./db.php generate-yaml-db
./db.php migrate
./db.php create-tables

```
参照先のコードを「その場で」確認・編集する方法

Visual Studio 2013 では現在編集中の画面から移動せずに、参照先のコードを表示・編集することができます。他のファイルなどに記載されているメソッドの定義をポップアップとして表示するので、画面切り替えの手間を減らすことができ開発時の生産性を高めることができます。
※ このコマンドは、Visual Studio 2013 の Express Edition では使用できません。

**具体的な手順**
1.Visual Studio 2013 を起動し、任意のプロジェクトを開きます。ソースコード上の任意のメソッドを選択し、右クリックすると コンテキスト メニューが表示されるので、[定義をここに表示] をクリックします。
![1[1].png](https://qiita-image-store.s3.amazonaws.com/0/34023/4c40286a-a905-4275-869d-7b1774d20f1b.png)


   
2.選択したメソッドの定義が表示され、画面を切り替えずに選択したメソッドの確認と編集をすることができます。
![2[1].png](https://qiita-image-store.s3.amazonaws.com/0/34023/a214f419-4470-69b2-95e8-298d9de3f576.png)

参考) [MSDN ライブラリ: [定義をここに表示] を使用してコードを表示および編集する (Alt + F12)](http://msdn.microsoft.com/ja-jp/library/dn160178.aspx)
DjangoでModelChoiceFieldのquerysetを動的に指定する

# はじめに

マスタ参照してるリストボックスについて、ログインユーザーの権限に応じて選択可能なアイテムを制御したい…というケースが発生。

↓のモデルとフォームをサンプルに、調べて試してみたやり方のメモ。

```py3:models.py
class Book(models.Model):
    name = models.charField('name',max_length=255)
```

```py3:forms.py
class SampleForm(forms.Form):
    book = forms.ModelChoiceField(label='book',queryset=Book.objects.all())
```

# フォーム生成後にquerysetを上書きする

たぶん、一番シンプルな方法。

```py3:
form = SampleForm()
form.fields['book'].queryset = Book.objects.filter(...)
```


# フォームの`__init__`でquerysetを引数に受け取って上書きする

```py3:forms.py
class SampleForm(forms.Form):
    book = forms.ModelChoiceField(label='book',queryset=Book.objects.none())
    def __init__(self, queryset=None, *args, **kwargs):
        super(SampleForm,self).__init__(*args,**kwargs)
        if queryset :
            self.fields['book'].queryset = queryset
```

```py3:
form = SampleForm(queryset=Book.objects.filter(...))
```

`super.__init__`をコールしないと、`self.fields`が生成されないので注意。

デフォルトのquerysetどうするかは、フォームの役割次第。

querysetそのものを受け取らず、フィルタの条件に使うデータだけ受け取っておいて、querysetの生成はフォーム側で行う…という実装でも可。

```py3:forms.py
class SampleForm(forms.Form):
    book = forms.ModelChoiceField(label='book',queryset=Book.objects.none())
    def __init__(self, permission=None, *args, **kwargs):
        super(SampleForm,self).__init__(*args,**kwargs)
        self.fields['book'].queryset = self.get_book_list(permission)

    def get_book_list(self, permission=None):
        if not permission :
            return Book.objects.none()

        if permission == AAA :
            query = Q(...)
        elif permission == BBB :
            query = Q(...)
        # 必要なだけ処理書く...

        return Book.objects.filter(query)
```

本質的にやってることは同じ。
要は、`Form.__init__`の処理が終わってから、`Form.fields['field_name'].queryset`を上書きすればいい。

# 余談
`Form.fields`をいじれば、他のフィールドのいろんな属性をフォーム生成後に変更することができる。
フィールドそのものを追加・削除することもできるかも？
mac(lion)でmapnikのpython pluginを有効にする(失敗)

以下、うまくいかなかったけど、メモとして残します。


brew editで使うエディタをemasに変更（おこのみで）
export HOMEBREW_EDITOR="emacs"

mapnikのインストール設定を変更
brew edit mapnik

以下の部分を追加

    args = [ "CC=\"#{ENV.cc}\"",
             "CXX=\"#{ENV.cxx}\"",
             "JOBS=#{jobs}",
             "PREFIX=#{prefix}",
             "ICU_INCLUDES=#{icu}/include",
             "ICU_LIBS=#{icu}/lib",
             "PYTHON_PREFIX=#{prefix}",  # Install to Homebrew's site-packages
             "FRAMEWORK_SEARCH_PATH=#{HOMEBREW_PREFIX}/Frameworks", #この行を追加
             "JPEG_INCLUDES=#{jpeg}/include",
             "JPEG_LIBS=#{jpeg}/lib",
             "PNG_INCLUDES=#{libpng}/include",
             "PNG_LIBS=#{libpng}/lib",
             "TIFF_INCLUDES=#{libtiff}/include",
             "TIFF_LIBS=#{libtiff}/lib",
             "BOOST_INCLUDES=#{boost}/include",
             "BOOST_LIBS=#{boost}/lib",
             "PROJ_INCLUDES=#{proj}/include",
             "PROJ_LIBS=#{proj}/lib",
             "FREETYPE_CONFIG=#{freetype}/bin/freetype-config",
             "INPUT_PLUGINS=shape,gdal,ogr,sqlite,python" #この行を追加
           ]

ソースからインストール
brew install --build-from-source mapnik

mapnikのプラグインを確認
python -c "from mapnik import DatasourceCache as c; print ','.join(c.plugin_names())"

# さらに
python pluginのデモを実行するとsegfault 11 になるので
リンクを参考に

boostのソースを取ってきて、patchを適用して、圧縮して、brew edit でソースの取得先をfile://にして、brew install boost 、brew install boost-python してから mapnik インストールしても　だめ

https://github.com/mapnik/mapnik-packaging/blob/master/osx/patches/boost_python_shared_ptr_gil.diff

# 備考
- ソースからコンパイルしようとしたけど、途中で進まなくなる。brew install mapnik のログを見ると、何やらパッチを当ててるようなので、それが関係してるのかも。
 python scons/scons.py configure INPUT_PLUGINS=all

# 参考リンク
https://github.com/mapnik/mapnik/wiki/PluginArchitecture
https://github.com/mapnik/mapnik/issues/1838
https://github.com/mapnik/mapnik/wiki/UsingScons
https://github.com/mapnik/mapnik/blob/master/INSTALL.md
https://github.com/mapnik/mapnik/wiki/Python-Plugin
Eclipseでサーバーを起動した時のログファイルの場所


分かりづらい場所にあったのでメモ。

※Eclipse 4.3 Kepler で確認。

![スクリーンショット 2014-12-03 14.24.36.png](https://qiita-image-store.s3.amazonaws.com/0/40758/7042d598-37a1-bdae-2d9f-ca6b67c4f6b7.png)
↑これのログ。

↓ここ。ワークスペース配下をずーっとたどっていたtmpX（Xは連番）の下。サーバーの種類によってtmpX以下のディレクトリ構成は変わると思います。下図はTomcatの場合。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/40758/2e1e0e78-d803-e488-aee2-406dc7d000ea.png)
knife create cookbook する時にちょっとした便利なオプション


Cookbookのひな形を作成するときに、`knie cookbook create`コマンドが便利ですが、作成する度にmetadata.rbやレシピ(default.rb)のemailやcopyrightを上書きするのが面倒でした。

そんなときは`--copyright`、`--email`オプションを指定すると幸せになれます。  

```bash
$ knife cookbook create test_cookbook --copyright "Foo company" --email "Bar <bar@gmail.com>" -o site-cookbooks
```

* `-C`(`--copyright`)オプションで、`metadata.rb`の`maintainer`やレシピ(default.rb)の`Copyright`を置換してくれます
* `-m`(`--email`)オプションで`metadata.rb`の`maintainer_email`を置換してくれます
* `-o`(`--cookbook-path`)オプションでCookbookのひな形を作成するパスを指定できます

その他のオプションは`--help`オプションか、ドキュメントから確認できます。

```bash
$ knife cookbook create --help
```

[knife cookbook &mdash; Chef Docs](https://docs.getchef.com/knife_cookbook.html#id2)
【突撃！隣の】AWS料金構成比で振り返る2014年のGunosy【BillingDashboard】

#はじめに

こんばんは。師走もしはすって書くとロハスみたいなだと時折思うGunosyの石橋です。恣意性のスキマに生まれる一つのドラマに出会えたことを感謝したいです。

お陰様でシステムも拡大一直線で邁進しておりますが弊社にとってAWS元年であった2013年(正確には2012年12月からですが)と異なり本年はまた異なったサービスが活躍する一方でコスト面でも存在感をアピって来ました。

計算に使うインスタンスが多めなサービスではありますがEC2+RDSを超えた先でどんなとこが膨らんでくるのかの参考になれば幸いです。
（※以下円グラフではAWSで弊社がよく使っているサービスについて、特定の月での料金構成比を記載しています）


#振り返り 2012年~2013年

Gunosyは2012年11月に法人化し、2012年12月からAWSを使っています。さくらVPSの単一VPSで動いていたところからAWS移設にあたってまず気をつけたのはデータベースの安全で快適な運用でした。
MultiAZはもとよりストレージサイズもインスタンスタイプも背伸びしつつ構成したため、RDSが費用の中で一番存在感がありました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/10659/4af3ac5e-33d3-7f08-9ef1-de295d337de3.png)

2013年1月末にアプリをリリースし、Webサーバやスクレイピング、推薦処理でEC2インスタンスが増え程なくRDS料金を上回るようになり、年末ぐらいには「だいたいEC2」ぐらいになっていました。

![image (1).png](https://qiita-image-store.s3.amazonaws.com/0/10659/1c7ac58a-256e-bfd8-6f99-ae145d88f6db.png)

データ転送(Data Transfer)については少しですが成長しています。

#2014年・春

春ごろのトピックとしては2013末から立ち上がっている広告システムのウェイトが増してきていました。
EC2とRDSについても勿論台数は増えたのですが、データを分析し続けるようになりそれまで存在感の薄かったRedshiftがあっという間にRDSを上回りました。
![image (7).png](https://qiita-image-store.s3.amazonaws.com/0/10659/17c8c763-4a3a-cd3f-f954-ae187921767c.png)

性能担保とコストで悩んだ末でしたがRedshiftをローテート運用するようにし、保管するデータについては一定期間に留めるようにしました。増やし続けないと辛いような運用をさけ、かつチューニングもやりやすいサイズにしています。

また2013年末にかけて成長を見せていたデータ転送(Data Transfer)についてもさらに順調に育っており、毎月無視できないウェイトになってきているのがこのあたりです。

#2014年・夏

夏ごろにはコンテンツパートナ様から記事データをお預かりできるようになり、それらのデータについてはGunosyから配信するようになったためそれまで影を潜めていたCloudFrontがEC2を追い越しそうな勢いで伸びてきました。Data Transferと合わせて相当なウェイトになっています。
この時期は配信＋転送についていかに無駄を減らすかが課題だったのでシンプルな送信データの圧縮や効率化、CloudFrontのリザーブドキャパシティ、CDN移転検討などをしていました。

![image (8).png](https://qiita-image-store.s3.amazonaws.com/0/10659/fb8afb08-4a2a-d975-1d6a-0d24f32eff14.png)

#2014年・秋

CloudFrontを使ったコンテンツ配信についてはボリュームの増加も計画を立てやすかったのでリザーブドキャパシティ適用で早期に抑えこむことができました。ただ依然として配信＋転送のウェイトが多くを占めています。また見え方としては小さいですがMobilePush本格運用によりSNSが伸びているのも見逃せません。
![image (9).png](https://qiita-image-store.s3.amazonaws.com/0/10659/ed5be157-4452-7177-23a6-31d3bdf92759.png)

#これから

EC2/RDS/Redshiftは増えるときは増えるので適切にリザーブドインスタンス等で運用
というシンプルな解になると思いますが、問題は配信＋転送にかかるコストの方です。CloudFrontには使う量をコミットすることで価格を下げることができるオプションこそありますが、それを踏まえてもデータのスリム化や余計な転送の除去については常に注意を払わないとがっつり費用に乗ってくるのがAWSでの留意点です。

来年はLambdaがシステム内に出張ってくる（希望）はずなので、EC2で動いているインスタンスいくつかの役割を奪いつつ新たな用途も含め動きを与えてくれると思います。
cpp_inspect - pretty printer for C++ STL containers


|cpp_libraries|article|
|:--|:--|
|cpp_binarysearch|http://qiita.com/cielavenir/items/852e2458cd327ca73613|
|cpp_inspect|http://qiita.com/cielavenir/items/95615185b5ca47d9111d|
|cpp_range|http://qiita.com/cielavenir/items/94c9abbb7767bd57607b|
|cpp_rational|http://qiita.com/cielavenir/items/2171327462d2afd98b65|

## Download

https://github.com/cielavenir/cpp_libraries/tree/master/inspect

## What's this?

You can print the content of C++ STL container and use it as C++11 uniform initialization.

## Example

```cpp
#include "inspect.hpp"
int main(){
	std::map<std::pair<int,std::string>,std::vector<std::array<int,3>>> val=
	{
		{{1,"2"},{
			{{1,2,3}},
			{{4,5,6}},
		}},
		{{4,"5"},{
			{{4,5,6}},
			{{7,8,9}},
		}},
		{{7,"8"},{
			{{7,8,9}},
			{{1,2,3}},
		}},
	};
	std::cout<<val<<std::endl;
}
```

Note `std::cout<<val<<std::endl` is not usually possible, because `ostream operator<<(std::map<T,S>&)` is not defined.

When you execute this program, you can get:

```
{{{1,"2"},{{{1,2,3,}},{{4,5,6,}},}},{{4,"5"},{{{4,5,6,}},{{7,8,9,}},}},{{7,"8"},{{{7,8,9,}},{{1,2,3,}},}},}
```

which you can confirm to be the same as the original declaration.
FactoryGirlでデータを作る時に、sequenceの初期値を設定する


## 方法
下記みたいな感じで、カラム名とあわせてセットしてあげればOKです。ちなみにsequenceの初期値は `1` です

```
FactoryGirl.define do
  factory :article do
    ...
    sequence(:published_at, 1) { |i| Time.now - i.days }
    ...
  end
end
```

連続した日付のテストデータを作る時などに！

## 参考URL
[FactoryGirl - Packages - Package Control](https://sublime.wbond.net/packages/FactoryGirl)
こんなHaskellコードはイヤだ

なんか勢いでAdvent Calendarに登録してしまったので、ネタっぽいのを書いてみます。

#参照透過性

Haskellは純粋関数型言語であり、参照透過性を持つことで有名です。関数の値は引数のみで決まるってやつ。変数だと俗にいう再代入禁止ですね。確かめてみましょう。

```haskell
main=
  putStr a
  where a = "hoge\n"
        a = "hello, world\n"
```

ちゃんと怒られます。

```
Conflicting definitions for ‘a’
```

letでも試してみましょう。

```haskell
main = do
  let a = "hoge\n"
  let a = "Hello, World\n"
    in putStr a
```

これもエラーですね。
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
…ウソです。Haskellを少しでも知ってる人ならわかると思いますが、これはちゃんと動きます。

#doってどうなの？

なんで動くかというとdoが付いてるからですね。doの中には複数のアクション（IOモナド）を書けるので、要は2つのlet式が別のアクションになってるってだけです。最初のletにもinを付けるとわかりやすいかも。
（3日14:29追記　間違ってたっぽい。下のhirataraさんのコメント参照）

```haskell
main = do
  let a = "hoge\n"          in putStr a
  let a = "Hello, World\n"  in putStr a
```

doを使わずに書き換えるとこんな感じでしょうか。あんまり変わらない。

```haskell
main =
   let a = "hoge\n"          in putStr a
>> let a = "Hello, World\n"  in putStr a
```

#doのキモさ

なんでdoについて考えてみようと思ったかっていうと、NTTデータのHaskell部隊ではdo構文が禁止されてるって聞いたからです。

そこで、doを使ってできるだけキモいコードを書こうとがんばってみました。

```haskell
a = do {return "Hello, World\n"}
main = do
  a <- a
  putStr a
  let a = "hoge\n" in putStr a
  putStr a
```

「どこがキモいんだ」と思う向きもあると思いますが、「a <- a」ってなんかやな感じじゃないですか？ 真ん中のとこで世界がぶった切れてる感じ。

doを使わないとこんな感じでしょうか。

```haskell
a = do {return "Hello, World\n"}
main = 
  a
  >>= \a -> putStr a
  >> (\a -> putStr a) "hoge\n"
  >> putStr a
```

キモさ半減ですね。「a <- a」の左側のaが仮引数名なのがバレバレ

ちなみに、↓だと挙動が変わってしまうのも、ちょっとイヤ

```haskell
a = do {return "Hello, World\n"}
main = 
  a
  >>= \a -> putStr a
  >> let a = "hoge\n" in putStr a
  >> putStr a
```

#関数合成を使おう

で、NTTデータのdo構文禁止の件ですけど、do構文の禁止自体が目的というよりは、純粋なロジックの記述にアクションを混ぜるなって意味なんじゃないかなーと想像しています。「アクションを使うと逐次処理的なコードが書けちゃうけど、それは関数型プログラミングじゃないよ」という初心者向けの心得って感じ
間違って個人用の名前でコミットしたけど会社用のにしたい

個人のpcで仕事してたら、間違って自分のuser.nameとuser.emailでコミットしてしまった。

## 修正手順

何番目からやっちまったのか確認

```
$ git log
```

6番目からやっちまってたら

```
$ git rebase -i HEAD~6 -x "git commit --amend --reuse-message=HEAD --reset-author"
```

これで現設定のuser情報になる。

あとはpush -fして終わり。もちろんdevelopやmasterでやったらだめ。

## リポジトリごとにuser情報分ける

リポジトリごとにuser情報分けるときは、

```
~/.gitconfig.my
[user]
  name = fuga
  email = foo@fuga.com

~/.gitconfig.work
...
```

みたいなのを用意しておいて

```
$ g config -e

[include]
  path = ~/.gitconfig.work
```

としてuser情報を上書きしてる。
ざっくりコードでAutoLayout

iOSではUIパーツの位置を指定するのに、現在3つの選択肢があります。



1.AutoresizingMask
2.Auto Layout
3.コード



storyboardで後からパーツを足す場合、最初からAutoLayoutしてhiddenばっかしてられないので、追加したパーツに対してコードでAutoLayoutを書く必要性がある。



NSLayoutConstraint　のコンストラクタに定義していこう

constraintWithItem　元となるアイテムを指定
attribute　　　　　　　属性指定
relatedBy　         その関係性を指定NSLayoutRelationEqualでおけ
toItem　            相手のアイテムを指定、指定しない場合はnil
attribute　         属性指定
multiplier        とりあえず1.0をおけ
constant　　　　　　アイテムとの距離or自分のサイズ




例、この場合self(buttonでも何でもおけ)が主役、superViewに対してtopから10離す

NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:self
                attribute:NSLayoutAttributeTop
                relatedBy:NSLayoutRelationEqual
		toItem:superview
                attribute:NSLayoutAttributeTop								　　　　　　　　　　multiplier:1.0
　　　　　　　　　　constant:10];
superViewに追加
[superview addConstraint:constraint];
コールバック関数とは

コールバック関数とは、
>「この関数、おまえの方で呼び出してや～」と関数に引数として渡される関数のこと。

引数に関数（処理）を渡したいときってあります。
たとえばカップラーメンをつくるときに「3分後にアラートする関数」が必要となったとします。
その関数は下記のようにかきます。

```js
setTimeout(function(){
  alert('カップラーメンができたよ');
}, 30000);
```

単純に関数の中で処理を使いたくなったときはコールバック関数を使えばいいんですね。
ちなみにコールバック関数の名前の由来について考えだすとわけわからなくなるので、考えないのがオススメだそうです。

参考：http://wa3.i-3-i.info/word12295.html
サーバエンジニア見習いだけどWINDOWSの環境さらすよ

# はじめに

```
「明日 くたばるかも知れないだから今すぐ振り絞る 只 伝わるものならば僕に後悔はない」
- 椎名林檎『月に負け犬』
```

使っているパソコンはいつ壊れたっておかしくない。
明日くたばるかもしれない、ブルースクリーン的な意味で。
そんなわけで作業環境メモ的な意味合いでツール紹介していこうと思います。

## ちなみに

* サーバ側の保守業務する人(Linux CentoOS系)
* インフラ系とは別にRuby書く人
* プライベートではHTML, CSS, javascript 書く人
* 会社PCはWindows（家はMac）

という人です。
※ 記載は 2014/12/03 時点です。

# ツール

## SSH Client

* SuperPutty  
  URL: https://code.google.com/p/superputty/
* Putty  
  URL: http://www.chiark.greenend.org.uk/~sgtatham/putty/

以前はteratermを使っていたんですが、ログイン情報管理したいよねとか
もろもろの理由で乗換検討していた時にSuperPuttyを見つけて乗り換えました。
便利ポイントは以下の点です

* サーバログイン情報を保存しておける（フォルダ分けとかできる）
* GUI的にSFTPみたいなことできる
* タブでコンソール見れる
* 結構画面分割とかもできる。

SFTP的なやつ便利です。ちょっとコツがいるんですが、中でvim駆使しまくり系ではないので
大変助かっています。

## コマンドプロンプト代替

* ckw-mod  
  URL: http://ckw-mod.github.io/
* Nyaos 3.0  
  URL: http://www.nyaos.org/
* cygwin  
  URL: https://www.cygwin.com/n

Unixな人からするとコマンドプロンプトとかパワーシェルとかしんどいですよね。
Linuxの感覚でwindows上の操作をするコンソール環境をゲットです。
ckd-modがnyaosのラッパーになっていて、その中のコマンドの補完がcygwinでされている
（と思います。先にcygwinが入っていたので結構ごちゃごちゃです）
cygwinからはDNS系でdigやwhoisコマンドが使えるようにしたり」、
openssl系の処理ができるようにしたり、結構もろもろ入っています。
調べてて知ったんですがNyaos 4.0出てたみたいなので時間を見つけて試してみたいと思います。

## テキストエディタ

* Sublime Text  
  URL: http://www.sublimetext.com/
* Mery  
  URL: http://www.haijin-boys.com/
* Atom.io  
  URL: https://atom.io/

みんな大好きsublime textですね。
こちらは説明不要として、どうしてもwindowsで日本語をSTでいじろうとすると
日本語が不自由なのでそういう時は Mery を使ってます。
日本語のテキストエディタでは最強っておもってます（勝手に）

atomに関しては、Alpha版らしいですがmarkdownエディタとして大活躍です。

### sublimeに入っているプラグインは以下のとおり

* AutoFileName
* Better CoffeeScript
* ColorPicker
* Convert UTF-8
* Emmet
* FilleDiffs
* Haml
* IMESupport
* Jade
* Line Ending Unify
* Line Endings
* Markdown Preview
* OmniMarkupPreviewer
* Sass
* SideBarEnhancements
* SublimeLinter
* VBScript

### SUBLIMEの個別設定はこんな感じ

```json
{
  // font settings
  "font_face": "Ricty Diminished Discord",
  "font_size": 13,                        // windows => 13, mac => 15

  // charset or encoding
  "show_encoding": true,
  "fallback_encoding": "UTF-8",
  "default_encoding": "UTF-8",

  // line endings
  "default_line_ending": "unix",
  "show_line_endings": true,

  // TAB
  "tab_size": 2,
  "translate_tabs_to_spaces": true,
  "use_tab_stops": true,

  // caret
  "highlight_line": true,
  "caret_style": "smooth",

  // ignore package
  "ignored_packages":
  [
    "Vintage"
  ],
}
```

## フォント

* Ricty Diminished  
  URL: https://github.com/yascentur/RictyDiminished

これがいたるところに設定されています。
あとはMactypeとかレジストリとかいじってごちゃごちゃです。

## その他

### LDAPの閲覧

* ApacheDirectryStudio  
  URL: http://directory.apache.org/studio/
  LDAP の管理・情報閲覧に。

### Subversion
  
* Tortoise SVN  
  URL: http://tortoisesvn.net/
  Subversion の GUIツール。便利。
  
### コンソール的に動く系

  * Ruby
  * Git
  * node.js
  * VirtualBox + Vagrant
  
# 終わり

他にも個別のカスタマイズやらソフトやらがぽろぽろあって、
もし本当に吹き飛んだら枯れるなー思いました。
決まり文句ですが、OSS開発者に感謝です。ありがとうございます。
jQueryでページの内容を動的に書き換えようとしたときにハマったこと

**やりたかったこと:** 
ページ上部にフィルタリングオプションを配置し、サブミットしたときにページ下部を含めたページの一部を更新
なお、フィルタリングに使用した値は保存しておきたかったので、フィルタリング部も合わせてAjaxで書き換え。

**はまったこと:**

FirebugとかChromeのコンソールでエラーとだけ書かれた内容がリターンされる。

元コード

```js:client.js
$('#search').click(function() {
    var $form = $('#form-search');
    var data = $form.serializeArray();
    submit_action('search', data, 'getdata');
});

$("#data-container").on('click', 'button#search', function() {
    var $form = $('#form-search');
    var data = $form.serializeArray();
    submit_action('search', data, 'getdata');
    return false;
});

```

```js:common.js
function submit_action(url, input_data, mode) {
    $.ajax({
        type : 'POST',
        url : url,
        data : input_data,
        dataType : 'html',
        timeout : 360000, // milliseconds

        beforeSend : function(xhr, settings) {
            // disturb double submit
            $("*[type=button]").attr('disabled', true);
        },
        complete : function(xhr, textStatus) {
            // allow resubmit
            $("*[type=button]").attr('disabled', false);
        }
    }).done(function(data, dataType) {
        switch (mode) {
// 中略 //
            case 'getdata':
                $("#data-container").html(data);
                loadingView(false);
                break;
        }
    }).fail(function(XMLHttpRequest, textStatus, errorThrown) {
        console.log( textStatus  + errorThrown);
    });
};
```

2行目のはAjaxで再描画した後同じボタンをクリックする場合にはonで指定する必要があるらしい。

それはともかく、サーバー側のコードとか、コード1行ずつconsole.log入れていった結果、DOMに既に値があったらAjaxで再描画できないのではないか、という結論に至りました。
そこでこの1行をそれぞれのclient.jsに入れてみます。

`$('#data-container').html('');`

どうやら上手くいったようです。
最終的なclientのコードは以下の通り。

```js:client.js
$('#search').click(function() {
    var $form = $('#form-search');
    var data = $form.serializeArray();
    $('#data-container').html('');
    submit_action('search', data, 'getdata');
});

$("#data-container").on('click', 'button#search', function() {
    var $form = $('#form-search');
    var data = $form.serializeArray();
    $('#data-container').html('');
    submit_action('search', data, 'getdata');
    return false;
});

```
vbacを使ってExcel VBAのソースコードを保守しやすくしよう

[Excel Advent Calendar 2014](http://qiita.com/advent-calendar/2014/excel)の12/3分の記事です。

## インポートとエクスポート

ExcelにはVBA用のIDEが付属しています。

そこそこ良くできているとは思いますが、VBAプロジェクトの規模が大きくなってくるといろいろ大変です。特に、ソースコードのバージョン管理（変更履歴管理）をしたいと思ったときに困ります。

.xlsmファイル (.xlsxファイルのマクロが有効なやつ) 自体はzipアーカイブなのでdiffはとれませんし、zipアーカイブを展開してみても、VBAプロジェクトはバイナリとして含まれていますからやっぱりdiffはとれません。

そんなときのために、Excel VBAにはファイルのエクスポート／インポート機能があります。IDEの「ファイル」メニューを選択するか、またはプロジェクトペインのソースコードを右クリックすると、「ファイルのインポート」「ファイルのエクスポート」というコマンドが表示されます。

![vba.png](https://qiita-image-store.s3.amazonaws.com/0/2079/3c854e8b-7e1c-8580-bec7-de54d1abe92e.png)

えー、これ手でやるのめんどくさい。

## vbac

そんな時は、[Ariawase](https://github.com/vbaidiot/Ariawase) というVBAライブラリに同梱されている、vbac というツールを使いましょう。

vbacについては、作者の [いげ太](https://twitter.com/igeta) さんが解説エントリーを公開していますので、それを読んでいただくのが一番いいかと思います。

[いげ太の日記: Ariawase v0.6.0 解説（vbac 編）](http://igeta-diary.blogspot.jp/2014/03/what-is-vbac.html)

> vbac は、フリーの VBA ライブラリ Ariawase に同梱されるツールで、
> 各種のマクロ有効 Office ファイルから VBA コードをエクスポートしたり、
> あるいは逆にインポートしたりするためのものです。
> VBA のソースコードを git などでバージョン管理するために、
> また Emacs や Vim や Sublime Text あるいはサクラエディタなどの任意のエディタで VBA を編集するために、
> さらに grep や diff のような外部コマンドとの連携を図るために使用できます。

`vbac.wsf` ファイルが置かれたフォルダに `bin` フォルダを作り、その中に .xlsm ファイルを置いておきます。そして、そこで `vbac.wsf` を `decombine` オプション付きで実行します。

```
C:\Anywhere\You\Like> cscript vbac.wsf decombine
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation. All rights reserved.

begin decombine

> Target: sample1.xlsm
- Export: UserForm1.frm
- Export: UserForm1.frx
- Export: Module1.bas

end

C:\Anywhere\You\Like> dir src\sample1.xlsm
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は XXXX-XXXX です

 C:\Anywhere\You\Like\src\sample1.xlsm のディレクトリ

2014/12/03  10:37    <DIR>          .
2014/12/03  10:37    <DIR>          ..
2014/12/03  10:37                80 Module1.bas
2014/12/03  10:37               822 UserForm1.frm
2014/12/03  10:37             2,584 UserForm1.frx
               3 個のファイル               3,486 バイト
               2 個のディレクトリ  59,860,484,096 バイトの空き領域
```

簡単ですね。

ちなみに、出力されるソースコードの文字コードは当然のようにShift JISです。

## vbacGUI

vbac単体でも何の問題もありませんが、GUIが欲しいという場合は、[vbacGUI](https://github.com/dck-jp/vbacGUI) というGUIフロントエンドを使いましょう。

作者の [D*isuke YAMAKAWA](https://twitter.com/d_ymkw) さんが解説エントリーを公開しています。

[vbac のGUIフロントエンドを作りました - ClockAhead 開発Blog](http://clockahead.blogspot.jp/2014/03/vbac-gui.html)

UIの見た目はこんな感じです。

![vbacgui.png](https://qiita-image-store.s3.amazonaws.com/0/2079/738bc845-a6ba-bbd0-aaf7-97eacb3f6407.png)

vbacGUIは、vbac以外に、[the Platinum Searcher](https://github.com/monochromegane/the_platinum_searcher) という高速検索ツールを同梱しています。
PHP 5.2/5.3 にて組み込み関数をtry catch対応にする方法

エラーが予期せずレスポンスに混ざったり、エラーが発生していたかどうかをその都度if文で判定していたら、コードが汚くなってしまいます。
そこで、組み込み関数のエラーを全て例外として投げ、適切に扱えるようにするためのコードを紹介します。

## PHP 5.3 未満で使える実装

PHP 5.3より前のバージョン、例えばPHP 5.2などで使う際は次の実装を使います。

```php
set_error_handler(
    create_function(
      '$severity, $message, $file, $line',
      'throw new ErrorException($message, 0, $severity, $file, $line);'
    )
);
```

## PHP 5.3 以降で使える実装

PHP5.3.0から使えるようになった無名関数を使った実装です。

```php
set_error_handler(function($severity, $message, $file, $line) {
    throw new ErrorException($message, 0, $severity, $file, $line);
});
```

## 利用例

次のような実装をすると、組み込み関数からも例外エラーが投げられるようになります。

```php
<?php
class ExampleClass
{
    static public function main()
    {
        self::setErrorHandler();
        try {
            self::getContent();
        } catch (ErrorException $e) {
            // 例外となります
            echo 'Error: ' . $e->getMessage();
        }
    }

    static private function getContent()
    {
        file_get_contents("http://not-exists-domain.com");
    }

    static private function setErrorHandler()
    {
        // 上記のPHP 5.3未満でも動く実装を入れております
        set_error_handler(
            create_function(
              '$severity, $message, $file, $line',
              'throw new ErrorException($message, 0, $severity, $file, $line);'
            )
        );
    }
}

ExampleClass::main();
```

組み込み関数標準のエラー出力ではこういった出力でした。

```php
PHP Warning:  file_get_contents(): php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known in /tmp/exception_test.php on line 16
PHP Warning:  file_get_contents(http://not-exists-domain.com): failed to open stream: php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known in /tmp/exception_test.php on line 16
```

今回の実装で例外エラー化すると、次のような出力を得られます。

```php
Error: file_get_contents(): php_network_getaddresses: getaddrinfo failed: nodename nor servname provided, or not known
```

## 参考

* PHP - set_error_handler と ErrorException を組み合わせると幸せになるかも - Qiita
http://qiita.com/suin/items/14c455691a0391ee265c

* How can I handle the warning of file_get_contents() function in PHP? - Stack Overflow
http://stackoverflow.com/questions/272361/how-can-i-handle-the-warning-of-file-get-contents-function-in-php

* PHPの組み込み関数で例外を発生させる方法 | 徳丸浩の日記
http://blog.tokumaru.org/2012/04/raising-exceptions-with-built-in-php.html
libGDXを認証ありproxyの環境で使う


こんなシェルスクリプトを書いている

```Bash:gdxsetup

export JAR_PATH=/Users/nunocky/bin/gdx-setup.jar
export ANDROID_HOME=/Applications/adt-bundle-mac-x86_64/sdk

java \
	-Dhttp.proxyHost=192.168.0.1 \
	-Dhttp.proxyPort=8080 \
	-Dhttp.proxyUser=nunocky \
	-Dhttp.proxyPassword=******** \
	-jar ${JAR_PATH}
```
0から始めるAWS入門①：VPC編

# 前回まで
[0から始めるAWS入門:概要](http://qiita.com/hiroshik1985/items/6433d5de97ac55fedfde)

# 概要
概要で説明した環境を構築するにあたって、いきなり若干小難しいがVPCから構築していく。
イメージ的に言えば、これから作る環境の囲い・箱を作るイメージ。

## なぜVPCを用いるのか
### セキュリティ
・VPCを構築することで、サブネット単位・ホスト単位での柔軟なアクセス制御ができる
・パブリック・プライベートサブネットの切り分けができる

### ネットワーク
・固定のローカルIPを使える

### その他
・今回無料枠で学ぶことを踏まえてると、EC2のt2.microインスタンスはVPC必須なため、いっそのこと一緒にお勉強

# VPC構築

## 下準備

### リージョンの変更
初めての場合は、ログイン後まず左上のドロップダウンメニューからリージョンをTokyoへ変更する。
クラウドと言えど実態は物理的なもので地理的な影響は受ける。リージョン選択はどの地域でAWSを使うか(ex.どの地域にサーバーを配置するか)を決定する。用いるサービスにもよるが、基本的に選択したリージョン以外では、サービス内容は共有されない。

![1-1_region.png](https://qiita-image-store.s3.amazonaws.com/0/34930/ac2c42ba-5267-8c8f-9561-3e74b749e6b4.png)

### 言語の変更
一連の記事は、言語として「英語」のコンソールを対象。
日本語版がリリースされたが、日本語にすることによって反対に意味が分かりづらかったり、レイアウト上見難いところがあるため、普段から英語に切り替えて使用している。
基本的に、同じ内容なので日本語で進めてもらっても大丈夫なはず。

切り替える場合は、コンソールの左下から任意の言語を選択する。

![console_language.png](https://qiita-image-store.s3.amazonaws.com/0/34930/fe2b2ca3-355a-5955-3753-e921ae3f4983.png)


## VPCの作成
早速VPCをつくっていく。コンソールから[VPC]を選択。その後、[VPC Dashboard]内の[Create VPC]ボタンをクリック。

10.0.0.0/16のアドレス空間を扱うVPCを作成する。

|項目|値|
|:----|:-----|
|Name tag|任意|
|CIDR|10.0.0.0/16|
|tenancy|Default|

tenancyとは、このVPCがハードウェアを専有するかどうか。コンプライアンス的に、専有する必要があるなら「Dedicated」を選択すると専有となるが、その分料金も上がるので注意。

![1-2_create_vpc.png](https://qiita-image-store.s3.amazonaws.com/0/34930/d058e43c-74c2-b843-1838-ef63e2b69593.png)


## Subnetの作成
お次はこのVPC内のSubnetを作成する。とりあえずAvailability Zone A用に１つ作成しておいて、ネットワークの冗長化の回でまた追加する。

### Availability Zone (AZ)って？
上記でリージョンの話をしたが、さらにリージョンは複数のZoneで構成されている。Amazon内で物理的にどういうわけかたをしているかは定かではないが、例えばAZ-Aで火災が発生しそのAZ内で提供されているサービスが死んだとしても、AZ-Bには影響が無いように物理的・地理的にZoneを区切ってある。

### 実際にSubnetの作成
上記で作ったVPC内のAZ-aにSubnetを作成する。このVPC内で扱うアドレス空間として、CIDRは10.0.0.0/24とする。

|項目|値|
|:----|:-----|
|Name tag|任意(VPCのタグ名と関連付けたほうが管理しやすい)|
|VPC|上記で作成したVPCを選択する|
|Availability Zone|ap-northeast-1a|
|CIDR|10.0.0.0/24|



![1-4_create_subnet.png](https://qiita-image-store.s3.amazonaws.com/0/34930/ce93ec71-6626-3b6f-a9cc-16a012f6f3c9.png)

## サブネットの追加
上記のおさらいとして、別のAZでサブネットをもうひとつ追加しよう。これで概要で述べたVPC内の２つの箱（サブネット）ができる。

|項目|値|
|:----|:-----|
|Name tag|任意(VPCのタグ名と関連付けたほうが管理しやすい)|
|VPC|上記で作成したVPCを選択する|
|Availability Zone|ap-northeast-1c|
|CIDR|10.0.1.0/24|

TODO : ここから若干説明が不親切なので追記する
## Internet Gatewayの追加
[Internet Gateway]を選択。[Create Gateway]ボタンでGateway作成後、[Attach VPC]で先ほど作ったVPCを選択する。

## Routes Tableのルール追加
このままだとまだ、インターネットから接続できない。
[Route Tables]を選択後、今回作成したVPCへのルートをグローバル0.0.0.0/0からの設定をする。入力後、[SAVE]して終わり。

![routes.png](https://qiita-image-store.s3.amazonaws.com/0/34930/68d2e250-f8ab-4100-2873-d9c2ced0519f.png)


# 次回
次回は、今回追加したVPCにEC2を配置していく。
[0から始めるAWS入門②：EC2編](http://qiita.com/hiroshik1985/items/f078a6a017d092a541cf)
Rails4でMroongaを使う時のmigrationファイルの書き方

最近MariaDBにもバンドルされて手軽に使えるようになったMroongaですが、Railsから使う場合、テーブル定義はもちろんmigrationファイルに書きたくなると思います。

その記述方法について色々試行錯誤した結果、これがいいかな、という形に落ち着いたので、紹介します。

なお、ここで紹介するやり方はRails4.0.0で実装された機能(reversible)を使用しているため、3以前では動作しません。悪しからず。

# 試行錯誤した理由

1. Mroongaでは`FULLTEXT INDEX`が必要です。
    - Railsのmigrationファイルの記法では`FULLTEXT INDEX`の作成が用意されていないため、SQLで記述する必要があります。

2. Tokenizer等を指定するためにテーブル/カラム/インデックスのコメントを使用します。
    - Railsのmigrationファイルでは、カラム/インデックスにコメントをつけることが出来ません。
    - [migration_comments](https://github.com/pinnymz/migration_comments)というgemもありますが、これはカラムのみに対応していてインデックスにはつけられませんでした。

これらをSQLでどう書くかが試行錯誤のポイントでした。

# Railsのmigrationファイルへの書き方

まずは、通常通りgenerateします。
ここでは 以下のコマンドでモデルクラスごと作成しました。

```bash:
$ rails g model album code:string title:text artist_name:text 
```


くだんのコメントは、reversibleを使って以下のように書きます。
(reversible機能については[このページ](http://willnet.in/103)が分かりやすいと思いました)

```rb:20141202214305_create_albums.rb
class CreateUsers < ActiveRecord::Migration
  def change
    create_table :album s, options: 'ENGINE=Mroonga COMMENT="default_tokenizer=TokenMecab"' do |t|
      t.string :code
      t.text   :title
      t.text   :artist_name

      t.timestamps
    end

    reversible do |dir|
      dir.up do
        execute 'ALTER TABLE albums MODIFY artist_name TEXT COMMENT \'flags "COLUMN_SCALAR|COMPRESS_ZLIB"\''
        execute 'CREATE FULLTEXT INDEX `idx_albums_title` ON albums(title) COMMENT \'parser "TokenBigram", normalizer "NormalizerAuto"\''
        execute 'CREATE FULLTEXT INDEX `idx_albums_artist_name` ON albums(artist_name) COMMENT \'parser "TokenBigram", normalizer "NormalizerAuto"\''
      end

      dir.down do
        execute 'ALTER TABLE albums MODIFY artist_name TEXT COMMENT \'\''
        execute 'DROP INDEX `idx_albums_title` ON albums'
        execute 'DROP INDEX `idx_albums_artist_name` ON albums'
      end

    end

  end

end
```

`ALTER TABLE`コマンドと`CREATE FULLTEXT INDEX`コマンドで、それぞれカラムとインデックスへのコメントを挿入しています。

作ったカラムを直後に`ALTER TABLE`している点がDRYらしくなくて気持ち悪いですが、今の所、このやり方が一番シンプルじゃないでしょうか。


# 生成されるテーブル

`rake db:migrate`で生成されるテーブルに対して`CREATE TABLE`すると、以下のような出力となります。

```sql:
CREATE TABLE `albums` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `code` varchar(255) DEFAULT NULL,
  `title` text DEFAULT NULL,
  `artist_name` text DEFAULT NULL COMMENT 'flags "COLUMN_SCALAR|COMPRESS_ZLIB"',
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `idx_albums_title` (`title`) COMMENT 'parser "TokenBigram", normalizer "NormalizerAuto"',
  FULLTEXT KEY `idx_albums_artist_name` (`artist_name`) COMMENT 'parser "TokenBigram", normalizer "NormalizerAuto"'
) ENGINE=Mroonga DEFAULT CHARSET=utf8 COMMENT='default_tokenizer=TokenMecab'
```

期待通りのテーブルとなっている事が確認できるかと思います。


# ちなみに…
RailsでGroongaを使いたい場合、[Rroonga](http://ranguba.org/ja/#about-rroonga)という選択肢もあります。
MySQLの機能(レプリケーションや、いわゆるテーブル間のリレーション)が必要なければ、こっちもお勧めです。