OmniAICreator/Qiita-1.07M huggingface dataset:
Eclipse使うなら最低限知っておきたいこと

先生や先輩に言われてなんとなくEclipseをDLして使っているけど、特に何の設定もしていないという人向け。

## 補完設定
Eclipseはデフォルトだとほとんど補完が出ないので、これだけは必須。

このへんを見るのが良いと思います
[Eclipseの補完設定をカスタマイズして爆速コーディング](http://ser1zw.hatenablog.com/entry/20110130/1296393620)

文字を打つたび補完が出るようになります。
デフォルトで「sysout」ってうつとsystem.println.out...が出るのがお気に入りです。

1.  Eclipseのメニューから「ウィンドウ」→「設定」→「Java」→「エディター」→「コンテンツ・アシスト」を開く
2. Javaの自動有効化トリガ(auto activition dtriggers for java)が、デフォルトでは[.]のみなので、[.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]に変更
3. 自動有効化遅延(auto activition delay(ms))を20くらいにする。


## ショートカット 
macだったらCtrlはcommandに読みかえてください。

### フォーマット ```Ctrl + Shift + F```
勝手にインデントやらスペースを揃えてくれます

### インポート編成 ```Ctrl+Shift+O```
不要なインポート文を削除し、必要なインポート文を加えてくれる

### 定義元にもどる ```Ctrl+変数名/クラス名クリック```
インタフェースから実装クラスを探す。定義場所に戻る。

## おまけ
これを見て、そのまま設定だけ行うのではなくて、「こんな便利なものがあるなら、もっと便利な機能があるかも？」と調べられると良いですね( o･ω･)ﾉ

ちなみに私は、Eclipseより高性能な「IntelliJ」っていう開発環境のほうが好きです。(学生さんは無料で使えます。追記(3/7)：学生じゃなくても無料で使えるらしいです([IntelliJ IDEAクイックスタート – 基本とインストール](http://samuraism.com/products/jetbrains/intellij-idea/quickstart/basics-and-installation)))
Socket.ioとは何か?リアルタイムWebアプリケーションを実現する技術をまとめてみた

## はじめに

「Socket.io = リアルタイムなWebアプリを作れる」ぐらいの認識しか無かったので、そもそもリアルタイムWebアプリを実現する技術には何があるのか、Socket.ioを使うと何が嬉しいのかまとめてみました。

## リアルタイムWeb技術の遷移

### ポーリングを用いる手法

ポーリングとは (Wikipediaから引用)
>
通信やソフトウェアにおいて、競合を回避したり、送受信の準備状況を判断したり、処理を同期したりするために、複数の機器やプログラムに対して順番に定期的に問い合わせを行い、一定の条件を満たした場合に送受信や処理を行う通信及び処理方式のこと

つまり、この場合だとサーバー側に変更等のイベントがあったか、AjaxによるHTTPリクエストを繰り返し行って確認する方法のことを指します。

一番シンプルですが、サーバー側のイベントを追随するために、頻繁にポーリングしなければならず、ネットワーク帯域とサーバリソースを無駄に消費してしまいます。

クライアント数が増えれば増えるほど、問題となりスケール出来ない手法なので、よほどの限りは使わない方が良いでしょう。

### Cometを用いる手法(ロングポーリング, ストリーミング)

2つ目がCometです。Cometとは「サーバー側から本当に必要なタイミングでレスポンスを返せるように考えられた手法」の総称です。

ここでは、まずポーリングを少し変更することで容易に実現できる、ロングポーリングと呼ばれる手法から紹介します。

#### ロングポーリング

一般的なHTTP通信では、クライアントからのリクエストを受け取ると、サーバーはすぐにレスポンスを返して、コネクションを切断します。

ロングポーリングでは、クライアントからのリクエストに対して、サーバーはレスポンスを保留して、コネクションを維持します。

そして、サーバー側でイベントが発生した時に維持していたコネクションを利用してHTTPレスポンスを返すことでリアルタイムに情報を送信することを可能にしています。

ロングポーリングでは、一度確立したコネクションを維持するため、サーバー側で同時接続数・キープアライブの設定を大きめに設定します。

ただし、コネクションを維持することによるメモリ使用量の増加など、状況によってはデメリットもあるので利用に関しては、慎重に検討する必要があります。

#### ストリーミング

ロングポーリングでは、キープアライブで設定していたタイムアウトの時間になるとコネクションが切断されます。

対するストリーミングでは、一度確立したコネクションを維持したまま、サーバー側からクライアントへレスポンスを返し続けます。明確に切断しなければそのままずっと接続されます。

ストリーミングでサーバーからのプッシュ通信を実現するには、クライアント側でレスポンスを受信しながら内容を解析して適切に処理する必要があります。

実現方法は「Server-Sent Events」という仕様がW3Cによってきちんと定義されています。

Server-Sent Eventsの特徴は、仕様に従った形式でサーバーサイドから通常のHTTPレスポンスを返すだけで、プッシュ通信が実現できるため、既存のHTTP通信の範疇で実装することが出来るという点です。

気になる方は一度以下のドキュメントを読んでみてください。

Server-Sent Events の利用 - Server-sent events | MDN [https://developer.mozilla.org/ja/docs/Server-sent_events/Using_server-sent_events](https://developer.mozilla.org/ja/docs/Server-sent_events/Using_server-sent_events "https://developer.mozilla.org/ja/docs/Server-sent_events/Using_server-sent_events")

### Web Socket

WebSocketとはIETFがRFC6455として標準化した「JavaScriptからサーバーとの双方向通信を行う」ためのプロトコルです。

元々はHTML5の仕様の一部として進められていましたが、現在では単独のプロトコルとして策定されています。

仕様に沿って実装すれば、比較的簡単に双方向通信を利用したリアルタイムWebアプリケーションが実現出来ます。

WebSocket用のプロトコルを使っているため、利用できるかはブラウザによります。

モダンブラウザ(Firefox, Chrome, Safari)ではほぼ問題無く利用が出来ますが、

IE9以下、Firefoxの古いバージョンでは一部利用できないようです。

ブラウザの対応状況に関しては、以下のサイトが参考になります。

Can I use... Support tables for HTML5, CSS3, etc [http://caniuse.com/#feat=websockets](http://caniuse.com/#feat=websockets "http://caniuse.com/#feat=websockets")

## Socket.ioの登場

これまで見てきた通り、リアルタイムWebアプリケーションを実現する技術には様々な実装があり、状況によって使い分ける必要があります。

Socket.ioはそうした「複雑なリアルタイムWeb技術の実装方式を隠蔽し、すべてのブラウザ・モバイルデバイスでリアルタイム通信を可能とすること」を目的に開発されているnode.js用サーバー側ライブラリとブラウザ用JavaScriptライブラリのセットです。

今まで紹介してきた各技術(ポーリング、Comet、Web Socket)に対応しており、いずれも同じSocket.io APIから利用することが出来ます。

そのため、Socket.io APIを利用してサーバー側・ブラウザ側の実装を行えば、ユーザーの利用しているOSやブラウザによって、最適なリアルタイムWeb技術が選択され、幅広い環境からリアルタイム通信を行うことが可能になります。

以下のURLから、Socket.ioのデモを見ることが出来ます。複数のブラウザ、デバイスから同時にアクセスしてみてください。全て同時に更新されます！驚きです。

Socket.IO — Chat [http://socket.io/demos/chat/]
(http://socket.io/demos/chat/ "http://socket.io/demos/chat/"0)

また最近ではJavaScript以外の言語でも、Socket.io APIが利用できるようになっているようです。

今回の調査でSocket.ioの概要について理解できたので、次回はより実践的な使い方についてご紹介したいと思います。
jsdomのインストール


個人用．
jsdomのインストールでハマったのでメモ．
window, navigatorオブジェクトは使わないのでコメントアウトして暫定対処とする．

# 実行環境
- mac OS X Yosemite
- Node.js v0.10.32

# 手順

```
$npm install jsdom
```

io.jsでコンテキストが呼び出し元と異なる問題で動作しないことが報告されている．
暫定対処としてコメントアウトする．
https://github.com/iojs/io.js/issues/855

```javascript:yourProject/node_modules/jsdom/lib/jsdom/browser/Windows.js
>this._globalProxy = vm.runInContext("this", this);
<// this._globalProxy = vm.runInContext("this", this);
```

```javascript:samplecode
var jsdom = require('jsdom').jsdom
global.document  = jsdom('<html><body></body></html>')
// global.window    = document.parentWindow => undifined
// global.navigator = window.navigator => errorとなる．
```
DartのGeneratorでフィボナッチ数列 (非同期版)

# はじめに
Dart 1.9のリースを目前にして、Dev版にて非同期版のgeneratorがサポートされました。
<a href="http://qiita.com/Cat_sushi/items/48ce38987a9a40bb9466">DartのGeneratorでフィボナッチ数列 (同期版)</a>で約束した通り非同期版を紹介します。

なお、実行確認はversion:1.9.0-dev.10.2 (Thu Mar 05 09:49:17 2015) on "windows_x64"、ビルド番号44260で行っています。

# 実装

### フィボナッチ数列生成関数(非同期Generator版)
<a href="https://try.dartlang.org/">Try Dart!</a>にはフィボナッチ数を再帰計算で求めるサンプルがありますが、ここではフィボナッチ数列を求めます。
一つ前ともう一つ前の値を覚えておいてループの中で足し算するのが素直ですね。

```dart
import "dart:async";

Stream<int> fibo() async* {
  int lastBut1 = 0;
  int last = 1;
  int ret;

  yield lastBut1;
  yield last;

  while(true){
    ret = lastBut1 + last;
    lastBut1 = last;
    last = ret;
    yield ret;
  }
}
```
ポイントは```import "dart:async";```、```Stream```、```async*```と```yield```です。

### コールサイト```Stream``` ```async for```...```in```版
次にGenerator関数を呼び出す側です。
まずはシンプルに```Stream```ならではの```await for```...```in```版です。

```dart
const COUNT = 10;

main() async {
  int i = 0;
  await for(int f in fibo()){
    print("fibo($i) = $f");
    i++;
    if(i >= COUNT) break;
  }
}
```
せっかくの```for```...```in```ですが、無限数列なのでループカウンタを導入して適当なところで```break```しています。
ちゃんと```Stream```として扱えました。

なお、```main```は```void```とすると怒られます。
```Future<void>```とすると、やはり怒られます。( ´∀｀)
```Future```や```Future<dynamic>```とすれば良いのですが、ここでは省略して暗黙的に```dynamic```にしています。

### ```StreamIterator```版
次はStreamIterator版です。
終了条件にループカウンタが必要なので、これはこれで素直かもしれません。

```dart
  StreamIterator itr = new StreamIterator(fibo());
  for(int i = 0; await itr.moveNext() && i < COUNT ; i++){
    print("fibo($i) = ${itr.current}");
  }
```
DartにはC言語でいうところのカンマ演算子が無いので、```StreamIterator```の初期化は```for```文の外で行っています。
また、```Stream```からgetterで```StreamIterator```が取り出せないので、```Stream```を引数に```StreamIterator```をコンストラクトしています。

他方で、```moveNext()```は```false```返したらそれがループ終了条件なので、お作法として```for```文の中、継続条件のところで実行しています。
今回も```moveNext()```は永久に```true```ですけどね。

### ```Stream```関数パイプライン版
次は```Stream```に戻って、関数パイプラインで実現してみます。
無限数列なのでなんとかして止めなければいけません。
```takeWhile()```というフィルタ関数で```StreamIterable```を切り詰めると良いようです。

```dart
  int i = 0;
  fibo().takeWhile((_) => i < COUNT).forEach((f){
    print("fibo($i) = $f");
    i++;
  });
```
Dartはクロージャをサポートするので```takeWhile()```、```forEach()```内でもループカウンタが参照できてます。

### ```Stream```関数パイプライン版2
何番目のフィボナッチ数かを表示しなくて良いならば、ループカウンタを省いてずっと簡単に書けます。

```dart
  fibo().take(COUNT).forEach((f) => print("fibo = $f"));
```
実は、というか当然ながら、```take()```内部にはカウンタがあります。
それでも、アプリ側で気にする必要がないのが利点です。

# 感想
やっぱ速いですね。
<a href="https://try.dartlang.org/">Try Dart!</a>の再帰版フィボナッチ数計算プログラムと比べると圧倒的に速いです(体感ですが)。
もっとも、<a href="https://try.dartlang.org/">Try Dart!</a>はO(N²)、本プログラムはO(N)なので比較するのも何ですが。

同期版と比べても、全く遜色が無いスピードで実行されました。

また、```fibo()```が本質的にループする処理でありながら、ループ終了条件や、得られた値をループ内で利用する処理(今回は```print()```のみ)を分離して、純粋にフィボナッチ数列を求める処理として実装できるのは、やはり素晴らしい。

# おわりに
これで```Stream```のプログラミングがコールバックのネストやチェーン無しに、同期処理的に記述できるようになりました。
<a href="http://qiita.com/Cat_sushi/items/48ce38987a9a40bb9466">DartのGeneratorでフィボナッチ数列 (同期版)</a>と比較してもらえれば分かりますが、コードはほとんど同じです。
ライバル言語よりちょっと早い実装ですね。
Windows の右クリックメニューに「Edit with VIM (V)」を追加する設定

Chocolatey から vim を入れたら右クリックメニューに追加されていて便利だったので、少しカスタマイズした内容になります。

#完成図
![Clipboard01.png](https://qiita-image-store.s3.amazonaws.com/0/27440/50d9c54c-2e04-3416-fe31-a8755207d2f8.png)

#設定内容
```bat
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\Vim]
@="Edit with Vim (&V)"

[HKEY_CLASSES_ROOT\*\shell\Vim\Command]
@="\"C:\\My Program Files\\vim73-kaoriya-win64\\gvim.bat\" \"%1\""
```

※EXEパスに以下のバッチを設定しています。これでタブ起動に対応。
http://qiita.com/jtanaka/items/3ad79f45cf7bd5d62490


一瞬バッチが見えるのが玉に瑕です。非表示設定を知っていたら教えて下さい。
PHPでのオーバーロード（引数ちがいの同名関数）

**PHPではオーバーロードはサポートされていません。（オーバーロードとは、引数ちがいの同名関数を複数個定義することです）**

**ただ、１つの関数において色々と工夫することで、オーバーロード的なことは実現できます。２つの方法があります。**

## ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg)１）引数の数で分岐

関数に渡された引数の情報を知るための関数が色々用意されています。

* func_num_args( ) ⇒ 引数の数を取得
* func_get_arg(n) ⇒ n番目の引数の値を取得
* func_get_args( ) ⇒ 引数の一覧を配列として取得

これらを駆使する事で、１つの関数に対して、色々な呼び出し方が可能になります。（ソースを精査しなくても済むよう、引数についてのコメント文はしっかり書いときましょう）

※ 注意点 ※
PHP 5.2 以前では、func_get_arg(n)を他の関数への引数として直接渡すことはできません。（エラーとなる）

***

#### PHP5.6以降は可変長引数リスト『...』が使える

コメントで教えて頂きましたように、PHP 5.6 以降は「可変長引数リスト」という仕組みが使えます。記号は、ピリオド３つの『...』です。

```php:PHP
function sum(...$nums) {
    $val = 0;
    foreach ($nums as $n) {
        $val += $n;
    }
    return $val;
}

echo sum(1, 2, 3, 4);
```

上記の出力結果は `10` となります。一部の引数を固定にしたり、呼び出し元に『...』を使うこともできます。詳細は下記ページをご覧下さい。

▼PHP 5.6 以降における ...（可変長引数リスト）
http://php.net/manual/ja/functions.arguments.php#functions.variable-arg-list


## ![yotsuba_s.jpg](https://qiita-image-store.s3.amazonaws.com/0/36751/ba04f0f8-9c02-ffc6-0603-467f65afd633.jpeg)２）引数のデフォルト値を利用

PHPは引数のデフォルト値をサポートしています。引数を指定せずに呼び出した時は、自動的にデフォルト値がセットされます。

```php:PHP
<?php
function myfunc($name = "hanako")
{
    return "my name is $name\n";
}
echo myfunc("ichiro");
echo myfunc();
?>
```

出力結果：

```
my name is ichiro
my name is hanako
```

## ![churippu_s.png](https://qiita-image-store.s3.amazonaws.com/0/36751/8157fb95-559a-856d-af0d-e4f75f0c40f6.png) おまけ

オーバーロード関数を作る場合は、オンラインでPHPをテストできるツールが便利です。

▼ideone.com
http://ideone.com/

ページ左下の言語を「PHP」に変更してからお使い下さい。検証したコードはシェアもできるようです。（有効期限あるかも…）

http://ideone.com/qhUZPs
▼スクリーンショット
![ideone_1.png](https://qiita-image-store.s3.amazonaws.com/0/36751/6cf03bec-98cf-efe8-57ad-4607a303206e.png)

ページ左上の「fork」から再編集もできます。すわ！便利。

以上です。
Parseを触ってみた(iOS-2) - Crash Reporting -


# 前回の記事
 - [Parseを触ってみた(iOS-1) - ユーザ管理 -](http://qiita.com/tarappo/items/26e4b37ee4339fd46ed1)

# 今回試したこと - Crash Reporting
Parseでは、クラッシュレポートについても扱える。
せっかくなのでCrittercismからの移行を考えて触ってみたのでまとめてみた。
※日本版のドキュメントには、導入情報などが書いてないので注意。

# 環境
 - iOS
   - SDKの管理はcocoapodsを利用
     - http://cocoadocs.org/docsets/Parse/1.6.4/

```ruby:Podfile
platform :ios, "7.0"

target "parse" do
	pod 'Parse', '~> 1.6'
	pod 'ParseCrashReporting', '~> 1.6'
end
```

## 設定 - Step1 -
### Parse CLIのダウンロード

```
curl -s https://www.parse.com/downloads/cloud_code/installer.sh | sudo /bin/bash
```

### Parse Cloud Codeディレクトリの作成

```
parse new
```

上記をおこなうとParseのログインアカウントなどを聞かれるので指定する。
すると、以下のようなディレクトリが作成される。

```ディレクトリ
 - parse
   - cloud
   - config
   - public
```

### Run Script Phaseの追加
Xcodeで「Build Phases」を選択し、「Run Script Phase」を追加する。
追加する内容は以下。

```
export PATH=/usr/local/bin:$PATH
CLOUD_CODE_DIR=<path_to_cloudcode_folder>

if [ -d ${CLOUD_CODE_DIR} ]; then
    cd ${CLOUD_CODE_DIR}
    parse symbols "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}"
else
fi
```

```path_to_cloudcode_folder``` には上記のステップで作られたディレクトリ(Parse Cloud Codeディレクトリ)を指定する。



## 設定 - Step2 -
次に、テストアプリ側のコードを記述する。

まずはimport。

```objectivec:サンプルコード
#import <Parse/Parse.h>
#import <ParseCrashReporting.h>
```

そして、AppDelegate.mに以下のコードを追加する。

```objectivec:サンプルコード
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
	// Enable Crash Reporting
	[ParseCrashReporting enable];
 
	// Setup Parse
	[Parse setApplicationId:@"parseAppId" clientKey:@"parseClientKey"];
}
```

やるべきことは、これだけでOK。


## 動作確認
動作確認をするために、AppDelegate.mの ```application:didFinishLaunchingWithOptions:```　とかに以下のようなクラッシュするコードを記述する。


```objectivec:サンプルコード
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
    [NSException raise:NSGenericException format:@"Everything is ok. This is just a test crash."];
});
```

### レポート画面
上記のコードを記述し、アプリを動かすとクラッシュする。
その後に、再度アプリを起動するとクラッシュレポートが表示されるようになる。
※クラッシュするコードのままだとアプリ起動時に再度クラッシュするので注意。

![スクリーンショット 2015-03-07 17.24.17.png](https://qiita-image-store.s3.amazonaws.com/0/37642/e5425316-dfd0-58b4-97d6-b380b6d39833.png "スクリーンショット 2015-03-07 17.24.17.png")

上記の赤枠の箇所が今回のコードでクラッシュした情報を表示しているもの。
そして、詳細は以下の様な感じで表示される。

![スクリーンショット 2015-03-07 17.47.57.png](https://qiita-image-store.s3.amazonaws.com/0/37642/04ab6afa-d360-d629-7cb8-6697de1986d9.png "スクリーンショット 2015-03-07 17.47.57.png")


# 参考
 - https://parse.com/docs/ios_guide#crashreporting/iOS
Rspecのbeforeとlet!の実行順序


beforeとlet!の実行順序は、結論から言うと、同時であるため書いた順に実行される。

## 実行タイミング
#### beforeとlet!
どちらも、ブロックが定義された時に実行される。

#### let
ちなみにletは、変数が初めて使用された時だけ遅延評価され、specテストが終わるまでキャッシュとして使える。

## beforeとlet!の実行順序
[試されていた方がいた](http://d.hatena.ne.jp/yohfee/20110223/1298467548)ので、そちらを参考にする。

``` ruby
$count = 0

describe 'let!' do
  invocation_order = []

  before(:each) { invocation_order << :before1 }

  let!(:count) do
    invocation_order << :let!
    $count += 1
  end

  before(:each) { invocation_order << :before2 }

  it 'calls the helper method in a before hook in described order' do
    invocation_order << :example
    invocation_order.should == [:before1, :let!, :before2, :example]
    count.should == 1
  end
end
```

``` shell
% rspec -cfs let_3.rb

let!
  calls the helper method in a before hook in described order

Finished in 0.00062 seconds
1 example, 0 failures
```

before(:each), let!(:count), before(:each)の順で実行したところ、そのままの順で評価されている。

なので、beforeと同じタイミングで上から順番に評価される模様。

## 参考
[すごいぞRSpec(letとlet!編)](http://d.hatena.ne.jp/yohfee/20110223/1298467548)
第29回オフラインリアルタイムどう書くの問題


オフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/20844 )を行っています。

問題は「サイコロの展開図」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/ord29devdice/
です。

出題者の気分としては、問題を読み始めてから解けるまで1時間はちょっときついかも、と思ってますが、ひとそれぞれで。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

似たような問題をもっと解きたいという方は、
https://nabetani.hatenadiary.com/entry/yhpg_list
に過去問リンク集がありますので、そちらをご覧になると良いと思います。
参照を返すゲッターで範囲for文を回したらバグった


# 結論

C++では、一時オブジェクトのメンバ変数の参照を、ポインタ変数とか参照変数に代入してはダメ。
とくに範囲for文の範囲表現は、参照変数に代入してからループを回す扱いになるので注意。

# バグコード

```cpp
#include <iostream>
#include <vector>

// vectorのラッパークラス
template<typename T>
class Foo {
  std::vector<T> data_;

public:
  Foo(const std::vector<T>& data) : data_(data) {}

  // コピーのコストを嫌ってconst参照で返すゲッター
  const std::vector<T>& data() const { return data_; }
};

// テンプレート引数を省略するためのファクトリ
template<typename T>
Foo<T> make_foo(const std::vector<T>& data) {
  return Foo<T>(data);
};

int main() {
  std::vector<int> is = {0, 1, 2};
  for (int i : make_foo(is).data()) std::cout << i << ", "; // 何が起こるか分からない！！！
  std::cout << std::endl;
  
  std::vector<int> is2 = make_foo(is).data(); // コピー代入
  for (int i : is2) std::cout << i << ", "; // 大丈夫！！！
  std::cout << std::endl;
  
  return 0;
}
```

これを実行すると、

```
12396288, 0, 2, 
0, 1, 2,
```
http://melpon.org/wandbox/permlink/lTNtBqmZrRrlhlj8

となったり、

```

0, 1, 2,
```
http://melpon.org/wandbox/permlink/Rl4Lq01JT15cDlko

となったりします。こわい :scream_cat: 

ちなみに私が実際にハマったバグでは、C++11の範囲for文が使えない残念環境だったので、boostライブラリのBOOST_FOREACHマクロを使っていました。

# 解説

const参照を返すゲッターは、値のコピーをしなくていい利点の代わりに、ちょっと危なっかしいです。
Effective C++ 第3版 28項「オブジェクト内部のデータへの「ハンドル」を戻さないようにしよう」では危険な例として下記のようなものが挙げられています。

```
std::vector<int>* ptr = &make_foo(is).data();
```

``` make_foo(is) ```の返り値は一時オブジェクトなため、この行を終えると破棄されてしまうので、そのメンバ変数のポインタが無効になってしまうのですね。
そして、範囲for文でも同様のことが起きてしまっていて、範囲for文がどのように展開されるというと

```cpp
{
  auto && __range = range_expression; 
  for (auto __begin = begin_expr, __end = end_expr;  __begin != __end; ++__begin) { 
    range_declaration = *__begin; 
    loop_statement
  }
}
```
http://en.cppreference.com/w/cpp/language/range-for

というふうに、範囲表現を参照変数に代入する扱いとのことなので、下記のようなコードと同等になって、

```cpp
{
  const std::vector<int>& range = make_foo(is).data(); 
  for (auto itr = range.begin(), end = range.end();  itr != end; ++itr) { 
    int i = *itr;
    std::cout << i << ", ";
  }
}
```

範囲表現の中に含まれる一時オブジェクトはループ回っている時にはもう破棄されてしまっている、ということのようです。

# 愚痴

さて、この手のバグはどう回避すればいいんでしょうね……。
const参照を返すな値を返せ、と言われればそれまでなんですが、やはりコピーのコストが馬鹿にならないことはあります。では呼び出し側で気を付ければいいのかというと、ポインタ変数で受けるのは明らかにおかしいと分かるのですが、範囲for文を回すのは（少なくとも私にとっては）一見問題なさそうなので厄介だなぁ、と。
コンパイラがエラーでも吐いてくれると有難いんですが、そもそもオブジェクトの生存期間って静的には決まらない気がしますし、うーん。。。
Beautifulsoupがこぼれちゃう

##発端
某社のC++静的解析ツールが吐き出すレポート(HTML形式)から、必要なテキストだけを抜き出そうと思い立ち Python2.7 + Beautifulsoup4でごそごそと始めてみましたが…

```python:bs4test.py
from bs4 import BeautifulSoup

soup = BeautifulSoup(open("rep_38248_dev1.html"))
print soup.prettify("shift_jis")
```
あれぇ? HTML全体(約2万6千行)の1/10の2500行ぐらいしか読み込まないじゃないか!!
弱った。参った。困った。

##探索の旅
こういう時の常套手段は、「同じ境遇にいる人をネットで探す」です。
早速、googleで検索みると…どんびしゃな情報はありません。トほほ。

しかたがないので、bs4のソースコードであちこち突いて調べてみました。
原因は、bs4が下請けで呼び出している lxmlのfeed()メソッドの不具合で、巨大なHTMLテキストを食わせると途中でこぼれてしまうのでした。

対策は、bs4/builder/_lxml.py の LXMLTreeBuilder.feed() をコメントアウトするだけでOKです。(なぜか、XMLパーサーのLXMLTreeBuilderForXML.feed()は対策済みでした)

```python:bs4/builder/_lxml.py
class LXMLTreeBuilder(HTMLTreeBuilder, LXMLTreeBuilderForXML):

    features = [LXML, HTML, FAST, PERMISSIVE]
    is_xml = False

    def default_parser(self, encoding):
        return etree.HTMLParser

#    def feed(self, markup):
#        encoding = self.soup.original_encoding
#        try:
#            self.parser = self.parser_for(encoding)
#            self.parser.feed(markup)
#            self.parser.close()
#        except (UnicodeDecodeError, LookupError, etree.ParserError), e:
#            raise ParserRejectedMarkup(str(e))
```

##結末
あらためてググってみると、おや! Googleグループの[beautifulsoupフォーラム](https://groups.google.com/forum/?fromgroups=#!searchin/beautifulsoup/lxml/beautifulsoup/Q4Ko7aXMS3k/yJrVxg2xtlkJ)に関連するポストがありました。LXMLTreeBuilderForXML.feed() は、この時にBugFixされたようです。で、LXMLTreeBuilderの修正は漏れていた…ありゃまでした。
JavaScriptの“this”に注意

**JavaScriptはオブジェクト指向言語ではありませんが、関数を擬似的にクラス化して使うことはできます。ただ、クラス内での「this」が常に自分自身を指す…というわけではないので注意が必要です。**

## ![churippu_s.png](https://qiita-image-store.s3.amazonaws.com/0/36751/8157fb95-559a-856d-af0d-e4f75f0c40f6.png) サンプルコード

```js:JavaScript

// グローバル変数
var val = "globalのvalです";
// グローバル関数
function GFunc(fncBack) {
	// 何か処理したあとコールバックを実行
	fncBack();
}
// Objクラス
function Obj() {
	this.val = "objのvalです";
	this.show = function() {
		GFunc(this.callback);
	}
	this.callback = function() {
		alert(this.val); // いったんObjの外へ行くと this=window となる
	}
}
// 実際の処理
var obj = new Obj();
obj.show(); // "globalのvalです"が表示される
```

## ![churippu_s.png](https://qiita-image-store.s3.amazonaws.com/0/36751/8157fb95-559a-856d-af0d-e4f75f0c40f6.png) 解説

上記サンプルコードのように、Obj内からコールバック等でいったん外へ出てしまうと、this は window（グローバルオブジェクト）を指すようになります。

JavaScriptではコールバックが多用されるため、このあたりが不具合の温床になりやすいのでお気をつけ下さい。

(･o･ゞ いじょー。
Ruby on Rails on AWS

# ゴール
素の状態のAWS EC2にRuby on Railsをセットアップする。

# 事前準備
* AWS EC2が起動さす（AWS Linux）
* sshで入る

# やったこと
rubyは最初から2.0が入ってたのでそのまま使う。
以下Railsインストール作業。

```bash
$ sudo yum update
$ sudo gem install rails #エラー
...
ERROR:  Error installing rails:
	ERROR: Failed to build gem native extension.

    /usr/bin/ruby2.0 extconf.rb
mkmf.rb can't find header files for ruby at /usr/share/ruby/include/ruby.h
$ sudo yum -y install ruby-devel
$ sudo yum -y install ruby-devel
$ sudo yum -y install gcc
$ sudo yum -y install sqlite-devel
$ sudo yum -y install gcc-c++ 
$ sudo gem install rails #ちょっと進んだ
...
Building nokogiri using packaged libraries.
checking for gzdopen() in -lz... no
zlib is missing; necessary for building libxml2
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
```

[nokogiri](http://www.nokogiri.org/tutorials/installing_nokogiri.html)がビルドできてないらしい。リンクページによると、

> **Troubleshooting Ubuntu / Debian Installation**
> It’s possible that you don’t have the zlib development header files installed on your system.

怪しい。探してみる。

```bash
$ yum search zlib
...
zlib-devel.x86_64 : Header files and libraries for Zlib development
```
入れてみる。

```bash
$ sudo yum install -y zlib-devel.x86_64
$ sudo gem install rails #ちょっと進んだ2
...
Running 'patch' for libxml2 2.9.2... ERROR, review '/usr/local/share/ruby/gems/2.0/gems/nokogiri-1.6.6.2/ext/nokogiri/tmp/x86_64-redhat-linux-gnu/ports/libxml2/2.9.2/patch.log' to see what happened.
*** extconf.rb failed ***
```
patch.log見てみる。patchが入ってなかった。入れる。

```bash
$ sudo yum install -y patch
$ sudo gem install rails #OK ぽい
...
Done installing documentation for nokogiri, loofah, rails-html-sanitizer, rails-deprecated_sanitizer, rails-dom-testing, builder, erubis, actionview, actionpack, activemodel, arel, activerecord, globalid, activejob, mime-types, mail, actionmailer, rake, thor, railties, bundler, hike, multi_json, tilt, sprockets, sprockets-rails, rails after 396 seconds
27 gems installed

$ rails -v
Rails 4.2.0
```
Done!
アプリ内課金の追加

「SenchaTouch + Cordova」のiOS、Androidアプリ開発ではまったことを少しメモする。


## プラグイン追加
iOSのみ対応する場合：

```bash
$ cd cordova
$ cordova plugin add cc.fovea.cordova.purchase
```

Androidも対応する場合：

```bash
$ cd cordova
$ cordova plugin add cc.fovea.cordova.purchase --variable BILLING_KEY="ライセンスキー"
```

参考元：https://github.com/j3k0/cordova-plugin-purchase


## iOSの実装メモ

##### 問題1
fatal error: '''Foundation/Foundation.h''' file not found
###### 解決：
`StoreKit.framework`が正しくリンクされていませんでした。
Xcode6.1 -> Xcode6.1.1 へアップデートすることで解決


##### 問題2
問題1の影響かもしれないですが、
`Build Phases` -> `Compile Sources` -> `InAppPurchase.m` が正しく追加されていません。
※ Xcode6.1.1更新後に、別のアプリだったら問題ありませんでした。
###### 解決：
手動で `InAppPurchase.m` を追加しました。


## Androidの実装メモ
##### 問題1
認証エラー：<認証が必要です。Googleアカウントにログインしてください。>
###### 解決：
開発者以外のアカウントで試すとうまくいった。


## Javascript側の簡単なサンプル
複数登録の際に、[参考元](https://github.com/j3k0/cordova-plugin-purchase)にある `registerProducts` メソッドがなぜかうまく動作できず、下記のように一個一個登録します。

```javascript
// イベント登録
document.addEventListener('deviceready', initializeStore, false);

function initializeStore() {
    // 購入登録
    store.register({
      id: "product.id1",
      type: store.CONSUMABLE
    });
    store.register({
      id: "product.id2",
      type: store.CONSUMABLE
    });

    // 購入完了イベント
    store.when("product.id1").approved(function(product) {
        product.finish();
    });

    // プレミアムチェック
    store.when("product.id1").updated(checkIsPremium);

    // エラーハンドリング
    store.error(function(e){
        console.log("ERROR " + e.code + ": " + e.message);
    });

    // 準備完了
    store.ready();

    // 更新
    store.refresh();
}

// プレミアムチェック 個別
function checkIsPremium(product) {
    if (product.owned) {
        window.isPremium = true;
    } else {
        window.isPremium = false;
    }
}

// アイテムの購入方法
store.order("product.id1");

// アイテムの復元方法
store.restore();

```


## 実装済みアプリ
* [FXAlert - 外為のアラート通知アプリ](http://www.itmarlin.com/page-fx-alert.html) : [各種設定]-[ご支援画面]
mrubyの可変引数最適化

# はじめに
Rubyでは、可変引数を配列としてアクセスする仕様があります。たとえばこんな感じ

```rb
def foo(*arg)
  p arg
end

foo(1)       # -> [1]
foo(1, 2, 3) # -> [1, 2, 3]
```
このような可変引数の配列は、mrubyの実装ではRITE VMの命令OP_ENTER中で作られます。つまり、可変引数を使うとメソッドコールの度に配列のアロケーションが行われるわけです。メソッドコールの数が多ければGCも頻発することでしょう。
可変引数の使用頻度が少なければ問題ないのですが、ループを構成してメソッドコールが頻発するmrblib/enum.rbで定義されているEnumerableモジュールのメソッドは軒並み使われています。たとえば、all?の定義です。

```rb
  def all?(&block)
    if block
      self.each{|*val|
        unless block.call(*val)
          return false
        end
      }
    else
      self.each{|*val|
        unless val.__svalue
          return false
        end
      }
    end
    true
  end
```

つまり、Rubyらしく記述したコードはそうではない場合に比べて速度が激減する可能性があります。
しかし、解決策があります。Enumerableで使われている可変引数は、多くの場合1つだけの引数を渡します。引数が1つの場合は配列を作らずにその値をレジスタに入れることで配列の生成を避けることができます。もちろん、バイトコード列は配列を処理することを前提に生成されていますので、バイトコードを書きかえる必要があります。また、常に引数が１つで呼び出されるとは限らないのでバイトコード列は書き換えたものとオリジナルのもの両方を保存する必要があります。
今回このようなバイトコード列を書きかえる方針で速度向上を実現し、make testが通りましたので詳細を記述したいと思います。
なお、実際のコードはこんな感じです。　https://github.com/miura1729/mruby/commit/c584ec101116b537e10a085f97efc59fb0f2d849

# OP_ENTERの書き換え

Rite VMのOP_ENTER命令はメソッドのバイトコード列の先頭にあり(ない場合もある)、Rubyの複雑な引数の規則に合わせて渡された引数をRite VMのレジスタに格納していく命令です。その中で、メソッドの呼び出し元からRite VMレジスタ経由で渡ってきた引数を配列にまとめる処理はこんな感じのコードです。

```c
        if (r) {
          rnum = argc-m1-o-m2;
          regs[m1+o+1] = mrb_ary_new_from_values(mrb, rnum, argv+m1+o);
        }
```

このコードを良く見ると、rnumが実際にわたってきた引数の数を表すことがわかると思います。つまり、実際に1つだけの引数を渡しているのかチェックするにはrnumをチェックすればいいわけです。そして、rnumが1の時、要素1の配列が返ってくるわけでその要素を直接レジスタに入れることも簡単です。
しかし、この先のコードはregs[m1+o+1]に配列が入っていることが前提になりますので配列ではなくその要素が直接入っていることを前提にバイトコード列を書き変えるわけです。この書き換えはそれほど重い処理ではないのですが、毎回やるのは馬鹿らしいのでどこかにキャッシュする必要があります。ここからはとても面倒で面白くない話が続くので、次の章　バイトコードの書き換えまで　飛ばすのがいいでしょう。

絶対に引数が1つしか来ないことが保障できればirep->iseqを書き変えてもいいのですが、一般的にそんな仮定はできません。そこで書き換えた版のirepをどこかに保存する場所を作る必要があります。irepにメンバーを追加するのが簡単でいいのですが、今後同じようにバイトコードを書き変えて最適化するようなことを行う場合、同じようにメンバーを追加するのも面白くない話です。そこで、今回はirep->poolにirepを格納するようにしました。OP_ENTERは必ず先頭に来るのでirep->pool[0]に常に格納されます。
また、現在のメソッド・ブロックのProcオブジェクトを格納する変数procの扱いも面倒です。引数が1つしか渡ってこないことが前提のirepを指し示すように書き換えてしまうと、入れ子になったメソッドコールの途中で再帰的に呼び出された場合に困ります。また、Procオブジェクトをキャッシュすることも考えたのですがやはりGCで不具合が出ます。そこで、バイトコードを書き変えた場合は新たにProcオブジェクトを生成するようにしています。幸い、これによるオーバヘッドはあるのですが少ないようです。

# バイトコード書き換え
バイトコードは次のような方針で書き換えます。
バイトコード中の可変引数が入っているレジスタ(本来は配列が入っているけど、さぼって要素を入れているもの)の番号をdrnoとします。

* 子irep(irep->repsで示されたもの)でOP_GETUPVER, OP_SETUPVERを使ってdrnoレジスタをアクセスしているものが無いかチェックします。もしあれば、残念ながらこの最適化の対象外です。おとなしく配列を作るようにします。
* OP_MOVE命令でdrnoレジスタの内容をコピーしていたらtdrnoとして覚えておきます。逆に、drnoレジスタに書き込もうとしていたら、残念ながら最適化の対象外です。
* OP_RETURN命令でdrnoレジスタをメソッドの値として返そうとしていたら最適化対象外です
* OP_SEND命令、これが少々複雑です
  + 引数の数(ARG_C)が127でその引数がtdrnoだったら、OP_SEND命令でARG_Cを1に書き換えます。
  + メソッド名が_svalueか[]だったらNOPに書き換えます。これで要素を取りだしたふりをします。レジスタにはもともと要素が入っているわけです。
  + メソッド名がsizeでselfがtdrnoだったらLOADI tdrno, 1とします。これでサイズ1の配列のふりをします。
  + そのほかのOP_SEND, OP_ARRAY, OP_HASHで引数にtdrnoが含まれていたら最適化対象外です
* 次のようなシーケンスはOP_ARRAY, OP_ARYCATをNOPにして、OP_SEND命令のARG_Cを1に書き換えます

```
OP_ARRAY (サイズは0, そうでなければ最適化対象外)
OP_MOVE  (srcがdrno)
OP_ARYCAT
OP_SEND  (ARG_Cが127)
```

# 未来の話
配列やオブジェクトを作るべきところであえて作らずにレジスタに要素を展開する最適化はいろいろなコンパイラで行われています。今後、データフロー解析などでオブジェクトの寿命が把握できるところはそういったコードの変換も可能ではないかなと考えます。
has_many throughで定義した関連テーブルをFactory Girlで呼び出す


## 概要
has_many throughで定義した関連テーブルを、Factory Girlで呼び出したい。
例えば次のmodelを考える。

```rb
class Job < ActiveRecord::Base
  has_many :job_details, :dependent => :destroy
  has_many :details, :through => :job_details
end
```

で、Rspecで呼び出す時は下記のように`job.details`で呼び出せるようにする。

```rb
job = create(:job)
details = job.details
```

## 方法
FactoryGirlを作成する時に下記のように定義すればOK。

```rb
factory :job do
  ...

  after_create do |job|
    job.details << FactoryGirl.create(:detail)
  end
end
```

## 呼び出し方
detailsを呼び出す。

```rb
job = create(:job)
details = job.details
```

detailsの値を取得する。

```rb
job.details.target
```

detailsの1番目のidを取得する。

```rb
job.details[0].id
```

## 参考
[has_many through with Factory Girl](http://stackoverflow.com/questions/14444878/has-many-through-with-factory-girl)
filterでプレイスホルダー複数使いたい

#### filterでプレイスホルダー複数使いたい

```scala
(1 to 10).filter(_ % 3 == 0 || _ % 5 == 0).mkString(",")
// => 3,5,6,9,10
```

みたいな。

でもこれはコンパイルを通らない。

```
error: missing parameter type for expanded function
  ((x$1, x$2) => x$1.$percent(3).$eq$eq(0).$bar$bar(x$2.$percent(5).$eq$eq(0)))
```

と怒られる。

---

↓これならコンパイル通る。

```scala
(1 to 10).filter((it: Int) => it % 3 == 0 || it % 5 == 0).mkString(",")
```

でも、違うんだよ。
空気読んでくれよ。
引数の型とか、いちいち書きたくないよ。

---

コンパイラのエラーメッセージを読むと「引数の型がない」と言ってるが
よく見ると【引数を２つ取る関数】だと判断しているように見受けられる。

```
(x$1, x$2) => x$1.$percent ...
```

じゃ、これでどうよ。

```scala
implicit def dblArgs[A, B](f: (A, A) => B): (A) => B = (a: A) => f(a, a)

(1 to 10).filter(dblArgs(_ % 3 == 0 || _ % 5 == 0)).mkString(",")
// => 3,5,6,9,10

(1 to 10).filter(_ % 3 == 0 || _ % 5 == 0).mkString(",")
// => error: missing parameter type for expanded function ...
```

自分で書けばOKだが、暗黙には変換してくれない。。。

---

これならどうだ。

```scala
implicit class SeqW[A](seq: Seq[A]) {
  def filter(f: (A, A) => Boolean): Seq[A] = seq.filter(it => f(it, it))
}

(1 to 10).filter(_ % 3 == 0 || _ % 5 == 0).mkString(",")
// => error: missing parameter type for expanded function ...
```

ダメでした。。。

では、これなら？

```scala
implicit class SeqW[A](seq: Seq[A]) {
  // 名前をfilterNにしてみた
  def filterN(f: (A, A) => Boolean): Seq[A] = seq.filter(it => f(it, it))
}

(1 to 10).filterN(_ % 3 == 0 || _ % 5 == 0).mkString(",")
// => 3,5,6,9,10
```

OK!

---

> どうやら同名の関数がある場合は暗黙変換は適用されないようだ。
implicit classでオーバーロードはできないってことか？
、、、と思いそうになったが調べてみると違った。
オーバーロードできます。
でも今回のケースではうまくいかない。
この件は後日メモを残す（つもり）

---

当初の目的は達成したものの、プレイスホルダーが増えれば増えた分だけ`filterX`を定義しなければならない。
最大で22個も。。。

しかも`map`でも同じことやりたい、`find`でも、となると全部書くことに。。。

費用対効果が。。。

---

今回の件で、複数のプレイスホルダーを使うにはいろいろ面倒だ、ということがわかった。
ひとつ利口になった（といいなぁ）。
あるサイトがどういうテクノロジーを使ってるかや逆にあるテクノロジーを使ってるサイトを調べるサイト


- [BuiltWith Technology Lookup](http://builtwith.com/ "BuiltWith Technology Lookup")
	- あるサイトがどういう技術で作られてるか
- [Wappalyzer](https://wappalyzer.com/ "Wappalyzer")
	- ブラウザ拡張を使って調べる
- [SimilarTech - Lead Generation, Competitive Intelligence based on Web Tech Analysis](https://www.similartech.com/ "SimilarTech - Lead Generation, Competitive Intelligence based on Web Tech Analysis")
	- ある技術を使ってるサイトを調べたり、似てるサイトをさがす時
Android開発はKotlinで

JVM言語Kotlinの紹介です！

# What is Kotlin
詳しい言語の特徴は、解説してくださっているサイトがいくつもあるため省きます。
Javaよりシンプルかつセーフティに記述できる言語です。
Android開発において特に注目したいのは次の2点です。

- Swiftにとてもよく似ている
- IntelliJ IDEAを開発しているJetBrain社製言語

アプリケーション開発の現場では、iOSとAndroidを同じ担当者が作成することも少なくないと思います。
言語が似ているだけでかなり負担が減るはずです。
また、JetBrain社謹製ということでIntelliJおよびAndroid Studioでの熱いサポートが期待できる安心感は馬鹿にできません。

# How to Kotlin
導入方法は[こちら](http://kotlinlang.org/docs/tutorials/kotlin-android.html)。
さすが公式です。ほとんど自動でやってくれます。
Android Studioで開発する場合は、プロジェクトツリーのスコープをAndroidからProjectに変更してください。

# サンプルコード
今回はとにかくサンプルを増やす意味で
[前回の投稿](http://qiita.com/n_yunoue/items/be06a6d19c061cb5e345)で検証用に作っていたアプリをKotlinで書き直して公開しました。

https://github.com/citrous/palettesample
![palette_sample.png](https://qiita-image-store.s3.amazonaws.com/0/59980/0d49841a-e1d5-c4d0-2df7-892be0cae6c7.png)

端末内の画像を選択すると、その画像から色を抽出するプログラムです。

Kotlinを書くのは今回が初めてだったのですが、IDEによるヒントやコード補完のおかげもありほぼ詰まることなく記述することができました。
故意にJavaで記述したクラスを混ぜましたが、もちろん共存可能です。
気になるパッケージサイズですが、proguard未使用で1.3M弱。
Javaのみで書いた場合が900KB強ほどでしたので、個人的には許容範囲です。
Scalaで書くとこの3倍近くになるのでしょうか。

Android Studio正式版のリリースやSwiftフィーバーなど最近の情勢はKotlinにとって大きな追い風になる予感がします。


(2016年5月13日 追記)
サンプルプロジェクトのライブラリを最新にアップデートしました。
既に作られている Git リポジトリに対してコマンドラインでアクセスするには？

自分は普段 TortoiseGit を使ってバージョン管理をしているわけですが、TortoiseGit では手の届かない操作を行いたい場合が出てきたので、既に作られているリポジトリに対してコマンドラインからアクセスしてみました。

# 任意のリポジトリを操作対象にする
とりあえず、操作したいリポジトリを操作対象にしてみます。

やり方は至って簡単。
コマンドラインで以下のコマンドを実行するだけです。

```:cmd.exe
cd /d [.git のあるフォルダ]
```

Git はカレントディレクトリに対して操作を行うので、cd コマンドを使ってカレントディレクトリをリポジトリのあるフォルダに変更します。

# リポジトリのログを出してみる。
ちゃんとリポジトリにアクセスできるか、ログを出して確認してみます。

ログは以下のコマンドを実行するだけです。

```:cmd.exe
git log
```

これでコマンドライン上に Git のログが表示されます。

#あとは Git コマンドで任意の操作するだけ
これで Git コマンドを使ってリポジトリに対して自由に操作ができるようになりました。

TortoiseGit が使えないような状況を想定して、Git コマンドを使った操作を覚えておくのもアリかもしれません。
簡単即出し！個人事業主が自分で確定申告（青色）をする方法！

まず始めに確定申告を自分でやるか、税理士に頼むか考えて欲しい。税理士に頼めば、めんどうな知識も時間も取られないし、経費として扱えるのでとても楽だ。
相場感としては個人事業主であれば3万円から10万円ほど。具体的には、売り上げ500万円以下は3万円、売り上げ1000万円以下は5万円、売り上げ3000万円以下は10万円程とのこと。
それを自分でやるメリットしては、経理の知識がついたり、1年間を振り返れたり、無駄な部分が把握できたりする。経理関連は自分でやらなければいつまでも嫌がってやらないので、経理を大事と考えている人はやる事をおすすめする。
以上、今回は確定申告をするために、やる事を順を追って解説していく。


##まずやる事【その１】〜提出期間を確認する〜

### ` 2015年の確定申告期間は、2015年2月16日（月）〜3月16日（月）`
締切ぎりぎりになるとかなり混み合ってしまい時間がかかってしまうので、早めに出すのがいい、受付時間はどこも大体午前9時から午後5時まで。

##まずやる事【その２】〜記帳をして領収書を月ごとに整理する〜

まず確定申告する時に必要なのは、売り上げと経費です。どれだけ稼いで、その中で経費はいくら使ったという情報が必要です。それを基に、納める税金と翌年の社会保険料などが決まって来ます。現状では利益がでている人程高い税金を支払うルールになっています。これを累進課税制度といい下記表によって算出されます。この表はとても重要です。そのために、記帳や経費を照明する領収書が必要になってきます。

![Qiita](http://www.freee.co.jp/knowledge/wp-content/uploads/sites/7/2015/02/%E7%A8%8E%E9%87%91%E8%A1%A8.png "Qiita")


##まずやる事【その３】〜クラウド確定申告サービスを利用する〜

弥生の会計パッケージなども便利だが、ここではクラウド申告サービスを使う。
クレジット連携での自動入力や、使い易いUI、関連したヘルプ情報の豊富さからこちらを選ぶ。マネーフォワードとフリーが２大巨頭となっているので、どちらでもサポート内容はあまり変わらない。私はマネーフォワードの方が分かり易かったのでそちらを利用している。

【マネーフォワード】
- https://moneyforward.com/
【フリー】
- http://www.freee.co.jp/

##まずやる事【その４】〜会員登録をしたら1月から12月分の全てのお金の流れを記入する〜

領収書と記帳した内容をクラウドサービスに書き写していく。専門用語や基礎知識などは下記リンクなどから自分で調べてやって欲しい。情報はほとんど乗っているのでそれほど難しくない。量が多いと単純作業なのでめんどくさくなってくる。この作業が確定申告の9割を占めていると言っても過言ではない。これが終わればほぼ終わりということ。

- http://inqup.com/
- http://www.sumoviva.jp/

##まずやる事【その５】〜所得控除や特別控除を記入して決算書を印刷する〜

青色申告者には65万円の特別控除がある。
これは課税対象金額から引けるのでかなり大きい控除。
そのほかにも所得控除など様々な控除があるので一度目を通しておいた方が良い。

【所得控除関連まとめ】
- http://www.freee.co.jp/knowledge/blue-return/accounting-return/deduction/
【税額控除関連まとめ】
- http://www.freee.co.jp/knowledge/blue-return/accounting-return/tax-deduction/

管理ページで決算書の編集ページがあるのでそちらから記入していく。

##まずやる事【その６】〜青色申告決算書、確定申告書Bを提出用と控え用２分づつ印刷する〜
管理ページに決算書関連のページがあるので、そちらから印刷をする。今まで入力してきたデータを基に自動で数字を記入した書類が作成される。これがとても便利。印刷したら押印を必ずする。確実に入力出来ていれば数字は正確なためそのままでも問題ない。中身を理解したければ下記リンクから詳細を確認する。

【青色申告決算書詳細】
- http://www.freee.co.jp/knowledge/blue-return/accounting-return/blue-return-fill-in/

【確定申告書詳細】
- http://www.freee.co.jp/knowledge/blue-return/accounting-return/final-return-fill-in/

##最後にやる事【その７】〜管轄の税務署に持って行くか、郵送する〜

ここまでの行程ができたら、管轄の政務書に提出する。
方法としては持参か、郵送かWeb完結のe-Taxがある。
私は税務署が近くなので直接提出しにいっているが、遠い場合は郵送やe-Taxを考えても良いと思う。
事務所の所在地によって管轄税務署が異なるので、下記リンク先にまとまっているのでご確認ください。
https://www.nta.go.jp/tokyo/guide/zeimusho/tokyo.htm


#以上で完了です！経費は溜め込むと大変なので、来年に備えてこまめに帳簿しときましょう！
iOSアプリのバージョンを取得する

# はじめに

Objective-CとSwiftでiOSアプリのバージョンを取得する方法です。
下図の赤枠で囲ったVersionの値を取得します。

![xcode.jpg](https://qiita-image-store.s3.amazonaws.com/0/3862/428e32c1-c755-2f7b-e497-2714824456f1.jpeg)


# Objective-C

Objective-Cの場合は次のようになります。

```objc:sample1.m
NSString *version = [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString"];
```

または

```objc:sample2.m
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
```

と書くことができます。

ビルド（Build）を取得する場合は、`CFBundleVersion`を指定します。

```objc:sample3.m
NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
```


# Swift

Swiftの場合は次のようになります。

```swift:sample.swift
let version: String! = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as String
		
let build: String! = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as String
```
xcodeでログ出力バグ

#概要
xcodeで

```objc:Test.m
for( int i= 0; i < dataArray.count; i++){
   NSLog(@"%d番:データ＝%@\n", i dataArray[i].nameString);
}
```

上記みたい書いてxcodeで確認すると、データが重複されたり、間違って出ている

例
3番:データ=あああああ
4番:データ=いいいいい
5番:データ=ううううう
4番:データ=いいいいい
5番:データ=ううううう
6番:データ=かかかかかか


#原因
xcodeのバグっぽい?

#対策
xcodeの上部メニューの「Window」の「Devices」で端末のログを直接みるとよさそう
MacでPATHを通す

MacにてPATHの通し方のメモ。

#設定ファイル
ホームディレクトリ直下にある設定ファイル`.bash_profile`に通したいPATHを記入する。

##設定ファイルの編集
ターミナルにて以下を実行

```
vi ~/.bash_profile
```

#PATHを通す
PATHを通すには`.bash_profile`に下記を記入する。

```
export PATH=$PATH:通したいPATH
```

例えば`/Users/test/`にPATHを通したい場合

```
export PATH=$PATH:/Users/test/
```

でOK。

##`.bash_profile`の更新
ターミナルを開き直すか、sourceコマンドで更新しないと反映されない。

```
source ~/.bash_profile
```

##PATHの確認
ターミナルに次のコマンドを打つと現在のPATHを確認できる。

```
printenv PATH
```

もしくは

```
echo $PATH
```

でもOK。
実行すると次のような文字列が帰ってくる。（『:』はPATHの区切り）
`/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/Users/test/`
目的のPATHがここに記載されていれば成功。
[swift] testでpathForResourceが通らない時

下記のような書き方でpathを取得していたのだが、テストだと何故かpathがnilになってしまう。

```lang:wrong_bundle.swift
let path = NSBundle.mainBundle().pathForResource("configuration",ofType:"json")
```
ちょっと調べたら、どうもテストではこの方法では取得できないらしい。
ObjectiveCの時から続いていたらしく、ObjectiveCの情報はこちらにありました。
http://qiita.com/hmuronaka/items/4b4a8f38b117e94542b4
これをSwiftでやるコードはこれでした。

```lang:correct_bundle.swift
let path = NSBundle(forClass:NameOfClass.self).pathForResource("configuration",ofType:"json")
```

参考：
http://stackoverflow.com/questions/25651403/swift-equivalent-of-nsbundle-bundleforclassself-class
http://stackoverflow.com/questions/24417182/how-to-use-scnscenesource-method-entrywithidentifierclasstype
【Mac】SWI-Plorogでソースファイルを読み込む

Macにて,SWI-Plorogのソースファイルの読み込みで詰まったのでメモ.

#環境
OS X 10.9.5
SWI-Prolog6.6.6

#DL先
[SWI-Prolog](http://www.swi-prolog.org/download/stable) より

>SWI-Prolog 6.6.6 for MacOSX 10.6 (Snow Leopard) and later on intel

をダウンロード

#PATHの設定
SWI-Plorogを使うには`swipl`というファイルがある場所にPATHを通す必要がある.
通常は`/opt/local/bin/`に`swipl`があるらしいが,
自分の場合は`/Applications/SWI-Prolog.app/Contents/MacOS/`にあった.
したがってPATHを`/Applications/SWI-Prolog.app/Contents/MacOS/`に通す.

[PATHの通し方](http://qiita.com/nbkn/items/01a11392921119fa0153)

#実行
ターミナルを起動し、次のコマンドを実行するとソースファイルを読み込んで起動することができる.
`swipl -f ファイル名.swi`
UIStatusBar、UINavigationBarの高さを取得する

StatusBarの高さ

```swift
let statusBarHeight = UIApplication.sharedApplication().statusBarFrame.size.height
```

navigationBarの高さ

```swift
func navigationBarHeight(callFrom: UIViewController) -> CGFloat? {
    return callFrom.navigationController?.navigationBar.frame.size.height
}
```

Viewに関する情報を集約したManagerクラス/構造体で管理するのが良いかと思います

```swift
struct ViewManager {
    
    static let rootViewController = UIApplication.sharedApplication().keyWindow?.rootViewController
    
    static let statusBarHeight = UIApplication.sharedApplication().statusBarFrame.size.height
    
    static var currentWindow: UIWindow? {
        if let window = UIApplication.sharedApplication().keyWindow {
            return window
        } else {
            return UIApplication.sharedApplication().windows[0] as? UIWindow
        }
    }

    // デフォルトFloat(44)としてUnwrap
    static func navigationBarHeight(callFrom: UIViewController) -> CGFloat {
        return callFrom.navigationController?.navigationBar.frame.size.height ?? 44
    }
}
```
気軽に日本ダーツの旅.jsを作ってみた顛末

## 概要
ふとどうしようもなく、ここではないどこかへ旅行に行きたくなる時もある。
そんな時に日本ダーツの旅的にとりあえず日本のどこかランダムに教えてくれればな、と。

そこで乱数まかせで緯度経度を生成して日本のどこかをgoogle mapで開くようにしたらいいんじゃね?と思い、
勢いにまかせて実際にやってみた。

## 日本ダーツの旅.js作ってみた

たいしたものではないのでjsでブックマークレット実装。

```js

javascript:(function(){
	var ido = 30.591 + (45.3122 - 30.591 ) * Math.random();
	var keido = 129.339 + (145.49 - 129.339)  * Math.random();
	var baseUrl ="https://www.google.co.jp/maps/search/";
	var dartsPointUrl = baseUrl  + ido + ",+" + keido;
	window.open(dartsPointUrl);
}());

```

単純に日本列島の[離島を含まない本土の東西南北端](http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E3%81%AE%E7%AB%AF%E3%81%AE%E4%B8%80%E8%A6%A7#.E9.9B.A2.E5.B3.B6.E3.82.92.E5.90.AB.E3.81.BE.E3.81.AA.E3.81.84.E6.9C.AC.E5.9C.9F.E3.81.AE.E6.9D.B1.E8.A5.BF.E5.8D.97.E5.8C.97.E7.AB.AF)の緯度経度の範囲内で無作為に一箇所選んで、その場所のgoolge mapのURLを開くだけである。

あとは上記のコードをブックマークレットとしてブラウザに配置すればよろしい。

するとこんな感じでできた! やった!!
![map.png](https://qiita-image-store.s3.amazonaws.com/0/26677/25bb4f67-9238-f81c-33d9-12b730e5fb55.png)



## 顛末
しかし数十回かやってみたが、だいたい海で陸地でもだいたい山だった...
(上記は複数回の試行の末に得られたものである。)

実は最初は沖ノ鳥島とか南鳥島とか日本列島の最東西南北端の緯度経度を
利用していたが、難度やっても海...

だいたいこれ。
![sea.png](https://qiita-image-store.s3.amazonaws.com/0/26677/55346a81-927d-cf2c-aa5f-cb5895f09f0b.png)

たまにこれ。
![mount.png](https://qiita-image-store.s3.amazonaws.com/0/26677/8d9725cf-3a9c-dbc3-db11-2e6cd05c4df2.png)


落ち着いて考えてみれば、日本列島がすっぽり入る長方形の中でランダムに点を打つと、
だいたい海で、陸地にあたってもだいたい山だ...
![japan.png](https://qiita-image-store.s3.amazonaws.com/0/26677/2b81a2e3-b7d8-64a8-8974-668cd0dc4e94.png)

当たり前なことも実際にやってみて痛感させられることもなるのだなと。

「もし日本の中でどこでもいいから行きたい!と願っても確率的にはだいたい海で陸地でもだいたい山である」、
という貴重な知見が得られたのやってみた甲斐はあったように思える。

旅行に行くときは勢い任せだけではなく、目的地について少しは考えた方がいいとしみじみした。

ちなみにもうちょっとまともに作るなら日本の駅一覧とかがにあったりする。
その中でランダムに選んでそこに行く位の方が、アクセスできることが少なくとも電車では
担保されているので、便利ではないかとは思った。
参考:
[公益財団法人国土地理協会 -データベース：緯度経度付き全国沿線・駅データベース-](http://www.kokudo.or.jp/database/004.html)

あるいはgoogle mapのAPIは「陸地かどうか?」な感じのステータスを
ちゃんと返してくれるので、陸地にあたるまで繰り返してもいいのかもしれない。
参考:
[Google Mapsの逆ジオコーディングAPI，基本的な知識3つ - nyanp::blog](http://nyanp.hatenablog.com/entry/20100505/p1)

シャレオツな風景画像をランダムに出してくれるwebサービスでも眺めるか、
本屋で観光ガイドをちら見でもすべきなのか。

完。
Actorの初期化はメインスレッドで行われない

次のようなコードを書くとActorの初期化がメインスレッドとは別のスレッドで行われることが確認できます。

```scala
object IniSample extends App {
  val system = ActorSystem()
  println(s"Main Thread is ${Thread.currentThread().getName}")
  val actor = system.actorOf(Props[ClassA], "actor")

  actor ! "The World!"

  println("Message was sended.")
  Thread.sleep(10000L)
  system.shutdown()
}


class ClassA extends Actor {
  println(s"Class A Thread is ${Thread.currentThread().getName}")
  
  def receive = {
    case msg =>
      println(s"Got message. message=${msg}")
  }
}
```

出力

```
Main Thread is main
Class A Thread is default-akka.actor.default-dispatcher-4
Message was sended.
```

メッセージが届いているので特に問題がないように思えますが、ActorSelectionを使ってメッセージを送る場合はActorの初期化を待ち合わせてくれないので注意が必要です。

```scala

object IniSample extends App {
  val system = ActorSystem()
  println(s"Main Thread is ${Thread.currentThread().getName}")
  
  val actor = system.actorOf(Props[ClassA], "actor")
  val selection = system.actorSelection("/users/actor")

  actor ! "The World!"
  selection ! "Star Platinum!"

  println("Message was sended.")
  Thread.sleep(10000L)
  system.shutdown()
}


class ClassA extends Actor {
  println(s"Class A Thread is ${Thread.currentThread().getName}")
  Thread.sleep(3000L)
  
  def receive = {
    case msg =>
      println(s"Got message. message=${msg}")
  }
}
```

上記のコードを実行すると以下のように"Star Platinum!"がdead lettersに送られてきます。

```
Main Thread is main
Class A Thread is default-akka.actor.default-dispatcher-4
Message was sended.
[INFO] [03/07/2015 14:15:18.838] [default-akka.actor.default-dispatcher-3] [akka://default/users/actor] Message [java.lang.String] from Actor[akka://default/deadLetters] to Actor[akka://default/users/actor] was not delivered. [1] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.
Got message. message=The World!
```
[awk]大文字交じりのファイル名を小文字に変換する

ファイル名に大文字小文字混じってるの困る。

```shell-session
ls | awk '{print "mv -vf", $1, tolower($1)}' | sh
```

Windowsではgawkを使う

[gawk](http://www.vector.co.jp/soft/win95/util/se376460.html)

```shell-session
dir /B | gawk "{print \"ren\", $1, tolower($1)}" | cmd

```
WindowsにMySQLいれたらActivatorが動かなくなった問題への対処

#ニッチすぎるこの問題

そもそもWindowsでScala遊ぼうって思ってる人がどれだけいるかわかりませんが、いちおうメモ書き程度に...

##出たエラー

（バックスラッシュ認識されちゃうので全角で…）
￥MySQL￥MySQL の使い方が誤っています。

##対処

システム環境変数の問題でした。
空白空いてるのに、ダブルクォートでくくられていない

修正前

```
(前略);G:\git\activator-1.3.2-minimal;C:\Program Files (x86)\MySQL\MySQL Fabric 1.5.3 & MySQL Utilities 1.5.3 1.5\;C:\Program Files (x86)\MySQL\MySQL Fabric 1.5.3 & MySQL Utilities 1.5.3 1.5\Doctrine extensions for PHP\
```

修正後

```
(前略);G:\git\activator-1.3.2-minimal;"C:\Program Files (x86)\MySQL\MySQL Fabric 1.5.3 & MySQL Utilities 1.5.3 1.5\";"C:\Program Files (x86)\MySQL\MySQL Fabric 1.5.3 & MySQL Utilities 1.5.3 1.5\Doctrine extensions for PHP"\
```
IoT初心者のメモ

続くかわかりませんが、IoT的な何かに少し興味を持ったので、調べ始めてみます。この記事を、個人的なメモですので、記事は全然まとまめるつもりはありません。メモ的に使う場合でもQittaがとっても使いやすいので...

とりあえず、下記セットを購入しました。(as of 2015/03/08)
- [Intel Edison Kit for Arduino](http://www.amazon.co.jp/gp/product/B00OPTSZN6/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B00OPTSZN6&linkCode=as2&tag=buildinsider-22) + [GROVEセンサーキット](http://www.marutsu.co.jp/pc/i/240437/) 


# 準備したほうがよさげなデバイス
- 参考サイト
http://topick.jp/goods/single-board-computers/


## Inetel系	
### Intel Edison Kit for Arduino
http://www.amazon.co.jp/gp/product/B00OPTSZN6/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=B00OPTSZN6&linkCode=as2&tag=buildinsider-22


## ARM系
### Raspberry Pi
- Raspberry Pi ラズベリー・パイ 超小型パソコン MODEL B (PLUS) &専用ケ-ス　model B+ Case(Clear)
- 他にも無線に対応させるとよさげ
http://denshikousaku.net/buy-raspberry-pi-type-b-with-sd-card-and-camera-module
- 参考サイト
http://matome.naver.jp/odai/2141284503561956201


### Parallella Epiphany III Embed. Platform
http://jp.rs-online.com/web/p/processor-microcontroller-development-kits/8194702/

## 不明系
### Arduino
- Arduinoをはじめようキットhttp://www.amazon.co.jp/%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9-SSCI-GettingStartedArduinoKit-Arduino%E3%82%92%E3%81%AF%E3%81%98%E3%82%81%E3%82%88%E3%81%86%E3%82%AD%E3%83%83%E3%83%88/dp/B0025Y6C5G
- Arduinoエントリーキット http://www.amazon.co.jp/dp/B008PQEWIW/ref=pd_lpo_sbs_dp_ss_3?pf_rd_p=187205609&pf_rd_s=lpo-top-stripe&pf_rd_t=201&pf_rd_i=B0044X2E5S&pf_rd_m=AN1VRQENFRJN5&pf_rd_r=06VH0X71AVCSJZ42DG16


## デバイスシュミレーター
https://developer.ibm.com/iot/recipes/simulator/


## センサー
- [I2C温度センサー（ADT7410）](http://akizukidenshi.com/catalog/g/gM-06675/)
- [GROVEセンサーキット](http://www.marutsu.co.jp/pc/i/240437/)
- [ダストセンサーDSM501Aモジュール ケーブル付き arduino raspberry pi](http://www.amazon.co.jp/%E3%83%80%E3%82%B9%E3%83%88%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BCDSM501A%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB-%E3%82%B1%E3%83%BC%E3%83%96%E3%83%AB%E4%BB%98%E3%81%8D-arduino-raspberry-pi/dp/B00TLGBDQE)

## 言語
[Node-RED](http://nodered.org/)	

# 参考サイト
## ベンダー
- IBMのIoTのサイト 
https://developer.ibm.com/iot/

- SalesForce
http://www.salesforce.com/jp/socialenterprise/innovation/Internet-of-Things.jsp

- PTC 
http://ja.ptc.com/about/manufacturing-transformation/internet-of-things

- Azure 
 - http://www.microsoft.com/en-us/server-cloud/internet-of-things.aspx
 - http://blog.qaramell.com/?p=16158

## メディア/Blog
 - [Edisonを使ってセンサデータをAmazon Kinesisにあげてみる【前編】](http://qiita.com/KenTamagawa/items/3f2e2bd3bb36a27dc439)
 - http://www.atmarkit.co.jp/ait/articles/1408/01/news019.html
 - [WICED SenseをIntel Edisonから使う](http://qiita.com/r_rudi/items/028aa7536d44da26e6e6)
	 - WICED Senseも気になります。
 - [Edison + Mackerel で室温モニタリング](http://qiita.com/yehara/items/982812066376ea72b77c)
 - [SDカードサイズの極小コンピューター、「Intel Edison」を手に入れた](http://tech.recruit-mp.co.jp/gadget/intel-edison-getting-started/)
 - [Groveの温度センサーをEdisonにつないでみた](http://dev.classmethod.jp/hardware/grove-temperature-sensor-on-intel-edison-kit-for-arduino/)
Swift で 起動時に表示する Tab を指定する


起動時に表示するタブを一番左以外のタブにしたい場合、下記のように指定できます。

```
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        
        if let tabvc = self.window!.rootViewController as? UITabBarController  {
            tabvc.selectedIndex = 2 // 0 が一番左のタブ
        }
        
        return true
    }

    ...
}    
```
Go言語フレームワークのRevelのGetting startedを和訳してみた

Go言語がかなり熱いらしいので触ってみることにしました。
どんなフレームワークがいいのかねと調べたらRevelが検索結果の最初の方に出てきたので使ってみることに。

で、Revelのチュートリアルの和訳とかがないので和訳してみました。

かなりの意訳＆拙い英語力による和訳ですので間違い等ありましたら、コメントでご連絡ください。


# まず最初に

ここではまずインストール方法を説明します。

### Goのインストール
Revelを使うにはGoをインストールする必要があります。

### GOPATHのセットアップ
もしGOPATHを作成していないのであれば、ここで作成しましょう。
GOPATHはGoのコードが全て格納されるディレクトリツリーです。
手順は以下のようになります。

ディレクトリの作成: 
````mkdir ~/gocode````

GOPATHとして使用するディレクトリを指定する: 
````export GOPATH=~/gocode````

今後のシェルセッションに適用されるようにGOPATHを保存する: 
````echo export GOPATH=$GOPATH >> ~/.bash_profile````

Goのインストールはこれで完了です。

## gitとhgのインストール
GitとMercurialが依存関係をクローンすることを出来るようにするために必要です。

[Gitのインストール](http://git-scm.com/book/en/Getting-Started-Installing-Git)
[Mercurialのインストール](http://mercurial.selenic.com/wiki/Download)

## Revelの取得
Revelを取得し、動かしてみましょう。

````
go get github.com/revel/revel
````

上記のコマンドは２つのことを意味しています。

- $GOPATH/src/github.com/revel/revel/にリポジトリをクローンする。
- Goが全ての依存関係を推移検索し、それらを動かす。

__注意: 以前バージョン0.8からアップグレードする場合の詳細な手順については、v0.9.0のリリースノートを参照してください。__

## Revelコマンドラインツールのビルド
Revelのコマンドラインツールは、構築、実行、およびRevelアプリケーションのパッケージングをしてくれます。

インストール方法と使い方:

````
go get github.com/revel/cmd/revel
````

上記コマンド後、$GOPATH/binディレクトリをPATHに追加し、どこからでもコマンドが実行出来るようにします。

````
export PATH="$PATH:$GOPATH/bin"
echo 'export PATH="$PATH:$GOPATH/bin"' >> ~/.bash_profile
````

最後に動作するかどうか確認しましょう。

````
$ revel help
~
~ revel! http://revel.github.io
~
usage: revel command [arguments]

The commands are:

    new         create a skeleton Revel application
    run         run a Revel application
    build       build a Revel application (e.g. for deployment)
    package     package a Revel application (e.g. for deployment)
    clean       clean a Revel application's temp files
    test        run all tests from the command-line

Use "revel help [command]" for more information.
````

これですべての設定が完了しました。
次はアプリケーションの新規作成を行って下さい。
選択した文字列をコメントアウトするマクロ


```jscript
function html_comment() {
	var str = Editor.GetSelectedString(0);
	str = "<!--" + str + "-->";
	Editor.Ins.Text(str);
}
html_comment();
```

複数行が選択された場合に、各行に対して処理する場合はどうするか？
取得した文字列を、痴漢を使って行単位のデータに変換する。

```jscript
#選択中のテキスト取得
var str = Editor.GetSelectedString(0);

var r = "";

#改行文字列で選択範囲を分割
var lines = str.split(/(¥r¥n|¥r|¥n)/);

#分割した文字列を行ごとに処理
for (var line in lines) {

	#行毎にコメントを挿入する。
	r += "<!-- " + lines[i] + "-->¥r¥n";
}
Editor.InsText(r);
```

#文字列のマッチング（指定した文字が含まれているかどうか）

```jscript
var str="value_item = valueItem";
var re = new RegExp("(.*) += (.*)","i");
if (str.match(re)) {
	#文字列のパターンがマッチングしている場合
}
```