OmniAICreator/Qiita-1.07M huggingface dataset:
[C++sourceMemo]整数の各桁の数値を取り出す


```cpp
#include <iostream>
#include <new>
#include <cstdlib>
using namespace std;

int digit_length( int );
int* slice_digit( int );

// 桁数を数える
int digit_length( int num )
{
	int count = 0;
	while( num ) {
		num = num / 10;
		++count;
	}
	return count;
}
// 各桁を配列要素に分解 その先頭ポインタを返す
int* slice_digit( int num )
{
	int mod = 0;
	int *parts = NULL;

	try {
		parts = new int[ digit_length( num ) ];
	}
	catch( bad_alloc ba ) {
		exit(EXIT_FAILURE);
	}
	catch(...) {
		cout << "something went wrong\n";
	}
		
	int i = 0;
	while( num >= 1 )	{
		mod = num % 10; // 一の位の余り
		num = num / 10; // 取得済みの余りを"num"から除去
		parts[i++] = mod;
	}
	return parts;
}
```
DeployGateを使って効率的な実機デバッグをしよう！

## はじめに
[前回](http://qiita.com/mofmofneko/items/c7786bb087c759764e2b)はGenymotionという仮想端末で高速なデバッグを行う方法をご紹介致しました。
しかし、Androidアプリケーションの開発で避けて通れない道が最終的な実機デバッグです。
大量の端末で実機デバッグを行う際に端末を１台１台USBケーブルで繋ぎ変えてADBでアプリを転送するのは面倒ですね。

今回はそんな煩わしさから開放してくれるDeployGateと呼ばれるサービスをご紹介致します。
[deploygate.com](https://deploygate.com)
DeployGateはmixi様の運営するサービスで１年位前に開始されて話題になっていました。
当時はあまり多くの端末で検証することはなかったのですが、近年のめまぐるしい国内販売端末の増加に伴い、
作成するアプリがサポートするAndroidのOSバージョンの幅が広くなったので
若干のコード変更でも１０台位の端末を用いて動作検証する感じになってきました。
そこで冒頭で述べた通り、１台づつインスコしてデバッグするのは時間かかるしまんどくせ('A`)となるわけです。
いい感じに端末デバッグを行う方法を模索していたところ、
AndroidBazaar&Conferenceで発表されていた「DeployGate」を思い出して使ってみたら便利そうだったので
開発しているプロジェクトのメンバーの方々への情報共有を兼ねてここに書き綴ろうと思います。

## 使ってみる
### Web側
会員登録の手順はエンジニアの勘にお任せしますね ﾆｺｯ
※サイト自体が全体的にわかりやすく作られてるので大丈夫なはず。


下図のスクショはログインした状態でのDeployGateトップページです。
近況のタイムラインになっているのでメンバーの動向等が確認しやすいです。
![Dashboard.png](https://qiita-image-store.s3.amazonaws.com/0/20947/e3d4fb5f-31d8-5c00-878d-e022183d8d69.png)
アイコンがかわいいタイムラインの図

アイコンについているFreeのラベルは現在のプランを示しています。
用意されているプランの概要は以下の通り

##### 料金プラン
| 項目名 | Free | Lite | Pro | Biz |
|:-----------|------------:|------------:|------------:|-------------:|
| アプリ数 | 4 | 10 | 50 | 100 |
| 共同開発者 | 2 | 5 | 25 | 100 |
| バージョン履歴 | 5 | 15 | 100 | 1000 |
| 配布ページ | 1 | 2 | 5 | 10 |
| 配布端末数 | 20 | 100 | 3,000 | 30,000 |
| 月額料金（税込） | 0円 | 525円 | 3,650円 | 9,975円 |

一見、フリープランでは少し物足りない気がしますが、
実はチュートリアルをクリアすることである程度値を増やせるのです！

![Tutorial.png](https://qiita-image-store.s3.amazonaws.com/0/20947/2b335172-d192-3259-0f79-59c9ee009aae.png)
チュートリアルを進めていくと管理できるアプリの数が最大で24まで増やせるので個人的には十分に要件を満たしています。

![Upload.png](https://qiita-image-store.s3.amazonaws.com/0/20947/1443ac3f-3042-f890-745f-ccd60c6cc31a.png)
apkファイルのアップロードはPushAPI(後述)の他、Webからでも行えます。
続きはまた今度書きます。
SDWebImageを使って画像をダウンロードする


```objectivec
	[SDWebImageDownloader.sharedDownloader downloadImageWithURL:url
                                                        options:0
                                                       progress:^(NSUInteger receivedSize, long long expectedSize)
    {
         float progress = [@(receivedSize) floatValue]/[@(expectedSize) floatValue];
    } completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished)
    {
         
    }];
```

簡単すぎる。。UIImageとNSDataの両方渡してくれるのは非常に助かる。
スクラッチからのHello, ASP.NET & AngularJS モデル編

Todoアプリのモデルを作成します。

モデルの定義にはEntity Framework Code Firstを使います。
Entity Framework Code Firstを使うと、シンプルなC#クラスとしてエンティティを定義できます。
定義したエンティティはそのままデータベースに永続化できます。

## Todoクラスの作成

ModelsフォルダにTodoクラスを作ります。
このクラスがデータベースのテーブルにマッピングされます。

Table属性をつけてTodosテーブルにマッピングされるようにしています。
Table属性がなくても、自動的にクラス名を複数形にした名前のテーブルにマッピングしてくれるのですが、
Todoの場合自動的につけるテーブル名がTodoesとなってしまうので明示的に指定しています。

```csharp
[Table("Todos")]
public class Todo
{
    public int Id { get; set; }
    public bool IsDone { get; set; }
    public string Text { get; set; }
}
```

## TodoContextクラスの作成

ModelsフォルダにTodoContextクラスを作ります。
このクラスを使ってTodoの取得や追加などを行います。

```csharp
public class TodoContext: DbContext
{
    public DbSet<Todo> Todos { get; set; }
}
```

これで終わりです。
TodoContextを使おうとしたときにデータベースやテーブルがなければ、
Entity Frameworkが自動的に作成してくれます。
vagrant で KaliLinuxを使ってみる

# vagrant で KaliLinuxを使ってみる

ペネトレーションテスト用のOSのKaliLinuxをvagrantで起動できるようにして
テストする時だけ利用する

まずはvagrantのboxを追加する

```
$ vagrant box add kali http://ftp.sliim-projects.eu/boxes/kali-linux-1.0-amd64.box
Downloading box from URL: http://ftp.sliim-projects.eu/boxes/kali-linux-1.0-amd64.box
Extracting box...te: 1848k/s, Estimated time remaining: 0:00:01)
Successfully added box 'kali' with provider 'virtualbox'!
```

適当なディレクトリを作成してそこで初期化してVagrantfileを作る

```
$ mkdir kali
$ cd kali
$ vagrant init kali
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
```

*ここでvagrant upしてvagrant ssh しようとしましたが、passwordがわかりませんでした。

Vagrantfileを修正してGUIで起動する
(以下の設定のコメントを外す)

```
 config.vm.provider :virtualbox do |vb|
   # Don't boot with headless mode
   vb.gui = true

   # Use VBoxManage to customize the VM. For example to change memory:
   vb.customize ["modifyvm", :id, "--memory", "1024"]
 end
```

vagrant upしてvirturlboxのGUIからrootでログイン
（初期パスワードは「toor」)

※初期のキーボードレイアウトがフランスになっていたので、
英語に変更してvagrantユーザのパスワードを変更しました。

```
# passwd vagrant
```

これでとりあえず使えるようになりましたので

```
$ sudo apt-get update
$ sudo apt-get upgrade 
```

アップデートを実施しておきます。
スクラッチからのHello, ASP.NET & AngularJS 準備編

AngularJSいいですね。
普通にJavaScriptのオブジェクトいじってたら知らないうちにビューが更新される感じがとても好きです。
ASP.NET MVCとかASP.NET Web APIとかいいですよね。C#でCoCな感じがとても好きです。
Razorもさくっと書かせてやろうという感じがとても好きです。
なのでこのへんを使ってWebアプリを作ってみましょう。

この記事では空のASP.NET WebアプリケーションプロジェクトからシンプルなTodoアプリを作ります。
ベースは[AngularJS](http://angularjs.org/)にあるTodoのサンプルで、
これをサーバサイドとつなげてデータの永続化までするように実装します。

![Todoアプリ](http://blog.mochaware.jp/wp-content/uploads/2014/02/app_ss.png)

アプリを作成する流れは以下のとおり。

* Entity Framework Code Firstでモデルを作成
  * データベースはEntity Frameworkにテーブルを作ってもらいます
* HTTPサービスAPIを公開するASP.NET Web API Controllerを作成
* HTTPサービスAPIを使用するASP.NET MVCビュー(Razor)を作成
  * AngularJSを使ってHTTPサービスAPIを呼び出す
  * Bootstrapを使ってレスポンシブルデザイン

利用する主なツールやフレームワークは以下のとおり。

* Visual Studio 2013 Update1
* ASP.NET Web API 2.1 (5.1.1)
* ASP.NET MVC 5.1.1
* Entity Framework 6.0.2
* AngularJS 1.2.12
* Bootstrap 3.1.0

## ASP.NET Webアプリケーションプロジェクトの作成

ASP.NET Webアプリケーションプロジェクトの作成します。

![プロジェクトの作成](http://blog.mochaware.jp/wp-content/uploads/2014/02/create_proj.png)

テンプレートの選択では「Empty」を選び、下の「MVC」と「Web API」にチェックをつけて「OK」ボタンを押します。

![テンプレートの選択](http://blog.mochaware.jp/wp-content/uploads/2014/02/select_template.png)

最低限のファイルだけのプロジェクトが作成されます。

![作成されたプロジェクト](http://blog.mochaware.jp/wp-content/uploads/2014/02/created_proj.png)

プロジェクトテンプレートで追加されるパッケージは少し古いので、NuGetパッケージの管理画面で更新しておきます。

![パッケージの更新](http://blog.mochaware.jp/wp-content/uploads/2014/02/update_nuget_pkg.png)

## パッケージのインストール

Bootstrapをインストールします。
NuGetで「Bootstrap」をインストールします。
二つあるかもしれませんが、識別が「bootstrap」となっている方をインストールします。

![Bootstrapのインストール](http://blog.mochaware.jp/wp-content/uploads/2014/02/install_bs.png)

AngularJSをインストールします。
NuGetで「AngularJS Core」をインストールしてください。
「Angular JS」の方は古いバージョンのまま更新されていないのでこちらをインストールしないよう注意してください。

![AngularJSのインストール](http://blog.mochaware.jp/wp-content/uploads/2014/02/install_angular.png)

Entity Frameworkをインストールします。
NuGetで「Entity Framework 日本語リソース」をインストールします。

![Entity Frameworkのインストール](http://blog.mochaware.jp/wp-content/uploads/2014/02/install_ef.png)

## Web.configの編集

AngularJSを使うとエラーが起きることがあるのでブラウザリンクを無効にしておきます。
以下の行を/configuration/appSettingsの下に追加します。

```xml
<add key="vs:EnableBrowserLink" value="false" />
```

以上で準備完了です。
Binomial sampling with nodejs

nodejsで二項分布のサンプリングを行いたかったので、nodeで書いてみた。

二項分布はベルヌーイ分布に従うサンプリングを何度も行い、その総和をとればいい。
まずベルヌーイ分布に従う確率変数を得るコード。

## ベルヌーイ分布
```js
function bernouli(p) {
    if (Math.random() <= p) {
        return 1;
    } else {
        return 0;
    }
}
```

[ベルヌーイ分布](http://ja.wikipedia.org/wiki/%E3%83%99%E3%83%AB%E3%83%8C%E3%83%BC%E3%82%A4%E5%88%86%E5%B8%83)は以下の式に従う離散確率分布。そのサンプリングを行うには、一様乱数からとってきた値が確率pより大きいかどうかを見ればいい。

![bernouli](http://upload.wikimedia.org/math/2/a/7/2a76e5c1ca1383f4923c61e52ee77a0e.png)

## 二項分布

二項分布はこのベルヌーイ分布のサンプリングをn回行ったときに1となる回数を表現する確率分布。
つまりn回繰り返してその総和をとってあげればいい。

```js
function binomial(n, p) {
    var x = 0;
    for (var i = 0; i < n; i++) {
        x += bernouli(p);
    }
    return x;
}
```

これで確率分布B(n,p)に従う分布からサンプリングできることになる。
これでいくつか試してみた。

# Try

まずはp=0.5の確率、つまり表か裏かがでるような状況で10000回の試行を繰り返す。
そのときに表がでるときの回数の分布は上のプログラムを使って以下のようになった。

![Screen Shot 2014-02-15 at 14.43.22.png](https://qiita-image-store.s3.amazonaws.com/0/7129/5a05ebc9-6869-daac-46ba-851eb8337c82.png)

普通に考えて5回くらいでるのが一番多そうで、裏がでる確率と同じ確率なので大体左右対称になる。

次にp=0.17にしてみる。サイコロで1の目がでる確率だ。（別に1じゃなくてもいいけれど)
これで同じように10000回試行してみると

![Screen Shot 2014-02-15 at 14.44.26.png](https://qiita-image-store.s3.amazonaws.com/0/7129/ba460ea2-77d9-8db6-2d54-e3dfc08e71f1.png)

やっぱりだいたい1.7回くらいでるのが一番多くなる感じがする。これを見ると10回振って7回以上1が出るなんてことはほとんどないことが分かる。なかなかおもしろい。

# npm

コード自体は小さいけれど、また使う機会がありそうなのでnpm moduleにしておいた

[binomial-sampling](https://www.npmjs.org/package/binomial-sampling)

よかったら使ってください。
Nightwatch.jsでChromeのテスト


### 参考エントリ

[Nightwatch.jsで自動ブラウザテスト@ta9to](http://qiita.com/ta9to/items/46171d2fbb735b98dcd3)

概要とかもろもろはこのエントリが詳しい。サンプル動かすまでは簡単。


## デフォルトはFirefox、Chromeでも動かしたい

`Nightwatch.js`のデフォルトのブラウザはFirefox。

Chromeで動かしたいなーと思って調べたところ、最近のアップデートで動かせるようになったらしいので試してみた。

### ※

`nightwatch.js`のリポジトリがアップデートされてるので、↑のエントリが書かれたときにcloneとかした人は最新のソースを落としてきてください。

## 1. サンプルのテストを動かす

[参考エントリ](http://qiita.com/ta9to/items/46171d2fbb735b98dcd3)のサンプルテスト実行あたりまでやる。

### ※

アップデートされて`nightwatch/examples/tests`フォルダに`digg.js`ていうテストのサンプルが追加されていて、このテスト通すのにFacebookのアカウント設定(`fbcredentials.json`)の記述が必要ぽくてめんどくさいので削除するか別のフォルダに移動させましょう。

## 2. ChromeのDriverをダウンロードする

[chromedriver.storage.googleapis.com](http://chromedriver.storage.googleapis.com/index.html)

↑から最新バージョンの自分の動作環境にあった`chromedriver_***nn.zip`をダウンロードします。

#### ダウンロードしたファイルを解凍して`chromedriver`を`nightwatch/bin`フォルダあたりに入れます。

(あとでこのパスを設定ファイルで指定するのでわかりやすいパスに置くとよいです)

## 3. settings.jsonを編集する

`nightwatch/bin`フォルダにある`settings.json`を編集します。

### 3-1. selenium-serverのパスを指定する

`"selenium" : {`の部分の`"server_path" :`に`selenium-server-standalone-{VERSION}.jar`のパスを指定します。

* 例) versionが2.39.0の場合

```json:settings.json
…
"selenium" : {
  "start_process" : true,
  "server_path" : "/path/to/selenium-server-standalone-2.39.0.jar",
  "log_path" : "",
  "host" : "127.0.0.1",
  "port" : 4444
 },
…
```

フルパスで書いておけば間違いないです。

### 3-2. chromedriverのパスを指定する

__2.__のところでダウンロードした`chromedriver`のパスを`"test_settings" :`部分の`"chrome_driver" :`に指定します。

* 例 nightwatch/binに置いた場合

```json:settings.json
…
  "test_settings" : {
    "default" : {
      "launch_url" : "http://localhost",
      "selenium_host" : "127.0.0.1",
      "selenium_port" : 4444,
      "silent" : true,
      "output" : true,
      "firefox_profile" : false,
      "chrome_driver" : "/path/to/nightwatch/bin/chromedriver",
      "screenshots" : {
        "enabled" : false,
        "path" : ""
      },
…
```

### 3-3. browserNameをchromeに変更する

`"desiredCapabilities" :`の`"browserName" :`を`chrome`に変更します。

```json:settings.json
…
  "desiredCapabilities" : {
        "browserName" : "chrome",
        "javascriptEnabled" : true,
        "acceptSslCerts" : true
      }
…
```

`settings.json`の編集はここまでです。


## 4. テストを実行してみる


```
$ ./bin/nightwatch
```

実行すると…

![2014-02-15 14_36_41.gif](https://qiita-image-store.s3.amazonaws.com/0/17969/591a946b-0acc-4bab-34fb-31c8b6435aa6.gif "2014-02-15 14_36_41.gif")


Chromeが立ち上がってテストが実行される！わいわい！


## おわり

テスト見てるだけでたのしい٩(๑❛ᴗ❛๑)۶
Getting Restarted Octopress

Octopressの始め方。

GitHub pagesと連携している、Octopressのupdateをしたら、何故かぶっ壊れたので復旧をやるはめに。

# Install Octopress
[公式doc](http://octopress.org/docs/)に従えばいい。

## clone

```shell-session
$ git clone git://github.com/imathis/octopress.git <your blog name>
$ cd <your blog name>
```

## prerequisites

```shell-session
$ gem install bundler
$ rbenv rehash    # If you use rbenv, rehash to be able to run the bundle command
$ bundle install
```

## themes
```shell-session
$ bundle exec rake install
```

以前は`rake install`だけだったんだけど、rbenvを導入したので、bundle内でしかrubyが使えないのかな。
bundle execを使わないとrakeコマンドが使えなくなったいた。

# Deployment
```shell-session
$ bundle exec rake setup_github_pages
```

ここで自分のGitHub pagesのURLを書く。
僕のpagesはここ

```shell-session
git@github.com:Lewuathe/lewuathe.github.io.git
```

## New post
```shell-session
$ bundle exec new_post
```

タイトルを聞かれるから答える。

## Generate
```shell-session
$ bundle exec generate
$ bundle exec deploy
``` 

pageを作成してdeployする。ココらへんは特に変わりなくできる。
次が問題。

# Export posts

以前のリポジトリに含まれている記事達は引き継ぎたいので、何を持ってこないといけないのか列挙。

* source/_posts
* source/_includes/custom/navigation.html (ナビゲーションにTwitterとかGitHubを加えてたから)
* CNAME (カスタムドメインを使っていたため)
* _config.yml
* images/posts (各ポストの画像をここにまとめていた)


以上。意外と少なくても済む。
こいつらをコピーして、もう一度Generate&Deployを行えばGitHub pagesに反映される

[The first cry of Atom](http://lewuathe.com/)
Titanium 学習履歴　画像base64エンコード

titaniumのbase64エンコードメソッドはエンコードに失敗するため、
html5のcanvasの機能を使ってbase64させる必要があるらしい

（例）
＜getPhoto.js＞
//ライブラリから画像データを取得し、canvasにデータのパスを渡す
Titanium.Media.openPhotoGallery({	
　　success:function(event){
　　　　if(event.mediaType == Ti.Media.MEDIA_TYPE_PHOTO){
　　　　　　var image = event.media;
　　　　　　var Settings = Titanium.Filesystem.getFile(Titanium.Filesystem.tempDirectory,'Settings');
　　　　　　Settings.createDirectory();
　　　　　　var newFile = Titanium.Filesystem.getFile(Settings.nativePath,'canvas.png');
　　　　　　newFile.createFile();
　　　　　　var path = newFile.nativePath;
　　　　　　Titanium.App.fireEvent("sendImageTocanvas",{
　　　　　　　　event:eventName,
　　　　　　　　path:path
　　　　　　});
　　　　}
　　},
});
				
//引数のから画像データをBase64エンコードし、値をFireする			
＜canvas.html＞
Titanium.App.addEventListener('sendImageTocanvas',function(e){
　　　　var img = new Image();
　　　　img.src = e.path;
　　　　img.onload = function (){
　　　　　　canvas.width = img.naturalWidth;
　　　　　　canvas.height = img.naturalHeight;
　　　　　　var context = canvas.getContext('2d');
　　　　　　context.drawImage(img, 0, 0);
　　　　　　var imgstr = canvas.toDataURL();	
　　　　　　var base64 = {str:imgstr};
　　　　　　Ti.App.fireEvent(e.event,base64);
　　　　};
});

//Base64エンコードされた画像データを必要部分を抜き出し、imageViewに適用する
Ti.App.addEventListener('getBase64_PhotoItem',function(e){
　　var image = e.str;
　　var idx = imagefile.indexOf('base64,');
　　var img = imagefile.substring(idx + 'base64,'.length);
　　
　　//あらかじめ作っていたimageViewに反映する。
　　imageView.image = Ti.Utils.base64decode(img);
}

※ご指摘ありましたら、細かな点でもコメントよろしくお願いします。
さくらVPS Ubuntu 12.04 で nginx + php で動かす方法

# はじめに
最低限 nginx と php を動かす方法を示す

# 動作環境
Ubuntu 12.04

# ゴール
nginx + php(FastCGI) を使って pukiwiki を立てる

# 必要なパッケージをインストールする

```
sudo apt-get install nginx 
sudo apt-get install install php5-fpm php5-gd php5
```

# インストール確認

```
$ nginx -v
nginx version: nginx/1.1.19
```

```
$ php5-fpm -v
PHP 5.3.10-1ubuntu3.9 (fpm-fcgi) (built: Dec 12 2013 04:31:25)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
```

# php5-fpm の起動

```
$ sudo /etc/init.d/php5-fpm start
```

# nginx の設定
### まず設定ファイルを作成する

```nginx:/etc/nginx/sites-available/pukiwiki.conf
# setting for pukiwiki

server {
       listen   80;
       server_name pukiwiki.hogehoge.org;
       root   /var/www/pukiwiki;
       index  index.php index.html index.htm;
       location ~ \.php$ {
                fastcgi_pass    127.0.0.1:9000;
                fastcgi_index   index.php;
                fastcgi_param   SCRIPT_FILENAME /var/www/pukiwiki$fastcgi_script_name;
                include         fastcgi_params;
       }
}
```


### 設定を有効にする

```
$ sudo ln -s /etc/nginx/sites-available/pukiwiki.conf /etc/nginx/sites-enabled
```

# nginx を起動・動作確認

```
$ sudo /etc/init.d/nginx start
```

上記で設定した root に以下のファイルを配置して、ブラウザで表示できることを確認

```php:/var/www/pukiwiki/index.php
<?php
phpinfo();
```

# pukiwiki の設定
## pukiwiki の解凍
### 公式ページからアーカイブを取ってくる
http://pukiwiki.sourceforge.jp/
### 解凍する 

```
$ tar zxfv pukiwiki-1.4.7_notb_utf8.tar.gz
```

## pukiwiki を配置
### まずさっき作ったファイルとディレクトリを削除

```
$ sudo rm -fr /var/www/pukiwiki
```

### 解凍したファイルを配置
```
$ sudo mv pukiwiki-1.4.7_notb_utf8/ /var/www/pukiwiki
```
### ファイルの所有者を変更
```
$ sudo chown -R www-data:www-data /var/www/pukiwiki
```
### アクセスして確認
ブラウザで、nginx で設定した URL でアクセスして、確認する

# おわりに
これで設定完了。
最低限の設定のみなので、チューニングやセキュリティに関しては、別途行う必要あり。
Android/ScalaのHTTPクライアント - Bee Client 編

scalaのHTTPクライアントとしてDispatchが有名の様子。しかし現在Androidで使うには[古い0.7系を使うかトリックを使う](http://dispatch-classic.databinder.net/Dispatch+in+Android.html)必要があるとのこと。

別の選択肢として [Bee Client](http://www.bigbeeconsultants.co.uk/bee-client)を試した。 java.net.URL のscalaによる軽量なラッパであり、高速かつ省メモリと謳われている。

## 1. セットアップ
[こちらのページ](http://www.bigbeeconsultants.co.uk/content/bee-client/download)にあるように、sbtであればbuild.sbtに依存関係を足すだけ。

proguard の処理中に下のエラーが出た。

```shell-session
$ sbt
> install
...
[error] (android2/compile:proguard) java.io.IOException: Can't write [... (snip) ... /target/classes-android2-compile-0.1.min.jar] (Can't read [... (snip) ... /.ivy2/cache/ch.qos.logback/logback-classic/jars/logback-classic-1.0.13.jar(;;;;!META-INF/MANIFEST.MF,!**/R.class,!**/R$*.class,!**/TR.class,!**/TR$.class,!**/library.properties)] (Duplicate zip entry [logback-classic-1.0.13.jar:org/slf4j/impl/StaticLoggerBinder.class]))
...
```

SL4JのバインディングがAndroid付属のもの(android.util.Log)と競合している様子。build.sbtからlogback-{core, classic}を除くとパッケージのビルドがうまくいった。

```
// build.sbt
libraryDependencies ++= Seq(
    "uk.co.bigbeeconsultants" %% "bee-client" % "0.21.+",
    "org.slf4j" % "slf4j-api" % "1.7.+"
)

resolvers += "Big Bee Consultants" at "http://repo.bigbeeconsultants.co.uk/repo"
```

## 2. 動作確認
AndroidManifest.xmlに下のパーミッション設定があるのを確認して、

```xml
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
```

[こちら](https://gist.github.com/ikuo/9014713)のテスト用Activityを実行したところ、無事にHTMLが端末に表示された。
意外にパワフル！？NSUserDefaultsの書き込み、読み込み速度について

NSUserDefaultsはデータの永続化にとても便利なクラスですが、大量のデータを扱う際はCoreDataなどデータベースに基づくクラスを使った方メモリ的の使用量が押さえられ、検索速度的にも有利です。

では、どの程度までのサイズのデータでしたらNSUserDefaultsで無理無く扱うことができるのでしょうか。
この疑問を自分なりに解決するために、以下のコードを書いてみました。

```objc:UserDefaultsSample.m
- (void)viewDidLoad
{
    [super viewDidLoad];

    mArray = [NSMutableArray new];

    NSArray *array = @[@"赤",
                       @"青",
                       @"緑",
                       @"黄",
                       @"白"];
    
    int repeatNumber = 10000;
    for (int i = 0; i<repeatNumber; i++) {
        NSMutableString *string = [NSMutableString new];
        for (int j = 0; j<100; j++) {
            int randNum = arc4random()%[array count];
            [string appendString:array[randNum]];
        }
        [mArray addObject:string];
    }
}

-(IBAction)saveTapped:(id)sender{
    NSDate *beforeDate = [NSDate date];
    NSUserDefaults *uD = [NSUserDefaults standardUserDefaults];
    [uD setObject:mArray forKey:@"Array"];
    [uD synchronize];
    NSTimeInterval interval =fabs([beforeDate timeIntervalSinceNow]);
    NSLog(@"Saving took %f seconds!", interval);
}

-(IBAction)loadTapped:(id)sender{
    NSDate *beforeDate = [NSDate date];
    NSUserDefaults *uD = [NSUserDefaults standardUserDefaults];
    NSMutableArray *loadedArray = [uD objectForKey:@"Array"];
    NSTimeInterval interval =fabs([beforeDate timeIntervalSinceNow]);
    if (loadedArray) {
        NSLog(@"Loading took %f seconds!", interval);
    }
}

-(IBAction)changeTapped:(id)sender{
    NSDate *beforeDate = [NSDate date];
    mArray[0] = @"ABC";
    NSTimeInterval interval =fabs([beforeDate timeIntervalSinceNow]);
    NSLog(@"Changing took %f seconds!", interval);
}
```

全角で100文字のNSMutableString型のランダムな文字列を作成し、指定した数（この場合は1万個）配列に格納します。
Storyboard上のボタンを押すことにより、この配列がそれぞれ保存、読み込み、変更されます。
それぞれの所用時間はNSDateを使うことにより測定されます。
実験はiPhone5の実機を使い行いました。

結果は以下の通りです。
![userdefaultstime.png](https://qiita-image-store.s3.amazonaws.com/0/35297/a52920da-0b7e-3e13-1df2-36884930eccd.png)
1000要素の配列（10万文字）では、保存に僅か0.02秒程度しかかかりませんでした。
さすがに50万要素の配列（5000万文字）では、保存に8.1秒ほどかかってしまいました。

要素数が増えても、読み込み速度は変わりませんでした。
※ご指摘がありました。これはNSUserDefaultsはアプリ起動時にメモリ上へ読み込みが行われるためです。手元の環境で僕も確認しました。読み込み速度の測定は、起動時に行う必要があります。

要素の変更に要する時間も要素数が増加ても変化しませんでしたが、これはNSUserDefaultsを介さずにメモリ上で処理が行われているからです。

また、サイズは配列が使用したメモリなのであまりNSUserDefaultsとは関係ありませんが、メモリ使用量の目安にはなるかと思います。1文字当たり3byteで計算しました。

新書1冊が15万文字程度らしいですので、これを保存するのに要する時間は0.03秒程度だと思われます。
ただ、配列の要素当たりの文字数によってこの値は多少変化するとは思われます。
例えば1日10ツイート（1400文字）を3年間保存したと仮定すると、
150万文字ほどを扱うことになります。
1万要素（100万文字）で0.17秒程度なので、0.3秒以内には保存処理が完了することになります。
この場合、データベースを使用するのも有りですが、シンプル化のためにNSUserDefaultsを使用することを考えていいかもしれません。

また、10万要素（1000万文字）を超えるとメモリの占有量が大きくなり、保存処理に時間もかかるので、
データベースの独壇場になりそうです。

その他、データベースを使うことで便利な検索機能を使用できるなどのメリットもありますのでそれらを含めて検討する必要がありますね。

今回の実験で、NSUserDefaultsの以外なパワフルさには驚かされました。
console.log()でObjectの値をみやすくする


Objectの階層が深くなると以下の[Object]のように全てのプロパティが表示されない。

```Javascript
 console.log({_id: 11111, data: {1111111:22222222}}, 'bbbbb', {a:123, b:'bbb', cdata:{_id:'c', data: {1:1,2:2}, 1:{2:{3:{4:{5:5}}}}}})

==>

{ _id: 11111, data: { '1111111': 22222222 } } 'bbbbb' { a: 123,
  b: 'bbb',
  cdata: { '1': { '2': [Object] }, _id: 'c', data: { '1': 1, '2': 2 } } }
```

JSON.stringifyのオプション使ってコンソール出力すれば上記は解決できるけど、debugでよく使うのでついでにcolorsも使ってこんな感じの処理書いて使い回せばそれなりに便利


```Javascript:sample.js

var colors = require('colors');
var stringify = JSON.stringify;

function print(_c, args) {
    for (var i = 0, l = args.length; i < l; i++) {
        var arg = args[i];

        var val = (typeof arg === 'object') ? stringify(arg, null, '\t') : arg;
        console.log(String(val)[_c]);
    }
}

var _colors = ['green', 'red', 'black', 'yellow', 'blue', 'magenta', 'cyan', 'white', 'grey']
for (var i = 0, l = _colors.length; i < l; i++) {
    var c = _colors[i];

    (function(_c){
        exports[_c] = function() {
            print(_c, arguments);
        }
    }(c))
}

// alias
exports.log = exports.green;
```

使い方

```Javascript:hoge.js
var c = require('./sample');
c.log({_id: 11111, data: {1111111:22222222}}, 'bbbbb', {a:123, b:'bbb', cdata:{_id:'c', data: {1:1,2:2}, 1:{2:{3:{4:{5:5}}}}}})

==>
{
    "_id": 11111,
    "data": {
        "1111111": 22222222
    }
}
bbbbb
{
    "a": 123,
    "b": "bbb",
    "cdata": {
        "1": {
            "2": {
                "3": {
                    "4": {
                        "5": 5
                    }
                }
            }
        },
        "_id": "c",
        "data": {
            "1": 1,
            "2": 2
        }
    }
}
```

c.log(), c.green(), c.red(),,,とか。
Apache でバージョン情報等を出さない

# Apacheでバージョン情報等を出さない

ユーザに不必要な情報を出す事はセキュリティ上よろしくないので止める

```/etc/httpd/conf/httpd.conf

ServerSignature Off
ServerTokens Prod
```

## ServerSignature Off

エラー画面に表示されるApacheのバージョン情報等を表示しない

## ServerTokens Prod
ResponseHeader に含まれるServerの情報を最小限にする
RxJSでWebSocketクライアント

RxJSでWebSocketクライアントを扱うコードです。
探してもよさそうなものが見つからなかったので自分で書いてみました。

~~~js:observablewebsocket.js
/**
 * WebSocketクライアントをRxJSで扱える形に変換して返す関数
 * @param {string} WebSocketの接続URL
 * @returns {Rx.Observable<Rx.Observable<any>>} データ受信用Observableを返すObservable
 */
function webSocketAsObservable(url) {
    var connector = new Rx.AsyncSubject();

    var Socket = WebSocket || MozWebSocket;
    var socket = new Socket(url);

    socket.onerror = function (ee) {
        connector.onError(ee);
    };
    socket.onclose = function (ce) {
        connector.onCompleted();
    };

    // 接続に成功したら、データ受信用Observable（receiver）を作って通知する
    socket.onopen = function (e) {
        var receiver =
            Rx.Observable.createWithDisposable(function (observer) {
                socket.onmessage = function (msg) {
                    observer.onNext(msg);
                };
                socket.onerror = function (ee) {
                    observer.onError(ee);
                };
                socket.onclose = function (ce) {
                    observer.onCompleted();
                };
                return Rx.Disposable.create(function () {
                    socket.close();
                });
            });
        connector.onNext(receiver);
        connector.onCompleted();
    };

    return connector.asObservable();
}
~~~

利用するにはrx.jsが必要になるので、下記からダウンロードするかbowerなどでインストールしてください。

- https://github.com/Reactive-Extensions/RxJS

## 使い方

webSocketAsObservableを呼ぶと、接続に成功した時に「データ受信用Observable」を返すObservableが得られます。
Observableが入れ子になっているのでちょっとややこしいですね。

入れ子になっているときはRxJSのselectManyを使います。
すると「データ受信用Observable」を取り出して、受信したデータを後続に流すことができます。

エラー処理などを考えなければこんな感じで使えます。

~~~js:sample1.js
observableWebSocket("ws://localhost:9090/")
  .selectMany(function (receiver) {
    // 接続に成功したので、データ受信用のObservableを取り出して、後続に受信データを流す
    return receiver;
  })
  .subscribe(function (val) {
    // WebSocketで受け取ったデータを使う処理
    console.log(val);
  });
~~~

エラー処理も含めるとこんな感じで書けます。

~~~js:sample2.js
var sock = observableWebSocket("ws://localhost:9090/");

var disposable = sock.catch(function (ex) {
    // 接続に失敗した時の処理
    return Rx.Observable.empty();
}).selectMany(function (receiver) {
    // 接続に成功した時の処理
    return receiver;
}).finally(function () {
    // 通信中にエラーが発生したり、接続が切れたりした後の処理
}).subscribe(function (val) {
    // WebSocketで受け取ったデータを使う処理
    console.log(val);
});

// 切断したい場合はdisposeを呼ぶ
disposable.dispose();
~~~
MacOSLion先生でVagrantのインストール

### VirtualBoxのダウンロード

* Markdown: [virtualbox](https://www.virtualbox.org/wiki/Downloads)
「VirtualBox 4.2.18 for OS X hosts」をクリックする。

### Vagrantupのダウンロード

* Markdown: [virtualbox](http://downloads.vagrantup.com/tags/v1.3.1)

### OSを取得する。

今回はcentos6.4を使用します。

```bash
$ vagrant box add centos http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box
Downloading or copying the box...
Progress: 44% (Rate: 0/s, Estimated time remaining: 1:27:21)^CWaiting for cleanup before exiting...
Box download was interrupted. Exiting.
Vagrant exited after cleanup due to external interrupt.
```

wifiなので1時間半かかりました。

その他OSは
* Markdown: [virtualbox](http://www.vagrantbox.es)

### OSインストール

```bash
$ vagrant init centos
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
```

```bash
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Importing base box 'centos'...
[default] Matching MAC address for NAT networking...
[default] Setting the name of the VM...
[default] Clearing any previously set forwarded ports...
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for machine to boot. This may take a few minutes...
[default] Machine booted and ready!
[default] Mounting shared folders...
[default] -- /vagrant
````

```bash
$ vi Vagrantfile
config.vm.network :private_network, ip: "192.168.33.10"
```

```bash
$ vagrant reload
```

```bash
$ vagrant ssh
```

とりあえず構築環境。
installコマンドでコマンド数を減らす

```
mkdir -p /home/foo/.ssh
chown foo /home/foo/.ssh
chmod 0700 /home/foo/.ssh
```

のようにコマンドを並べる代わりに
`install -o foo -m 0700 -d /home/foo/.ssh`
だけで済むという話です。

もうちょっと詳しい話は http://blog.n-z.jp/blog/2014-02-14-install.html に書きました。
Google Playで、リリース前のベータ版だけテスターに公開するという話

手順はいろいろなところに書いてあったのだけど、やってみて不安だった点をメモしておく感じで。

リリース前のアプリでベータテスターに配布したいときも、公開準備を整えて「公開」をする。
そのときに製品版が登録されていなければ、一般公開はされず、指定したテスターのみがPlayマーケットのページを見ることができるようになる。

apkを登録した段階では、apkは「アルファ版のドラフト」「ベータ版のドラフト」「製品版のドラフト」など、ドラフト状態になっている。
右上にあるセレクトボックスも「ドラフト」になっている。

公開用の情報を整えて、これを「公開」とすると、「アルファ版」「ベータ版」「製品版」として公開されることになるよう。
このときに、「製品版」が登録されていなければ、指定したテスターグループにのみ公開され、一般公開はされない仕組み。

なので、テスターに配布するには「公開」を行う必要がある。
この部分が、昔の「製品版」しかない時代しか知らないと、一度リリースしたものでないとベータテストできないのか…と怖かった。

また、この時点では、Playマーケットの「その他の情報」への反映が不完全なようで、
minSdkVersionなどを指定していても、「Android 要件」は1.6以上となっていた。

アルファ／ベータ版の登録などについては、次のリンクを参考に。

[ベータ版のテストと段階的公開](https://support.google.com/googleplay/android-developer/answer/3131213?hl=ja)
[Google playでのベータ版配布機能について](http://qiita.com/kaa/items/3904845d225d40f9a6ef)
info.plistに設定値の取得方法

info.plistに設定されている値を取得するには

```objc
NSString *bundlePackageType = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundlePackageType"];
NSString *bundleShortVersionString = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
```

のように`[[[NSBundle mainBundle] infoDictionary] objectForKey:@"key名"]`で取得できます。info.stringでローカライズしている場合に環境に合わせた値を取得するには

```objc
//info.plist:CFBundleDisplayName="Sample"
//info.string(japanese):CFBundleDisplayName = "サンプル";

//info.plistに設定された値が取得される(Sample)
NSString *bundleDisplayName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"];
  
//info.stringに設定された値が取得される(サンプル)
NSString *localizedBundleDisplayName = [[[NSBundle mainBundle] localizedInfoDictionary] objectForKey:@"CFBundleDisplayName"];
```

というように`[[[NSBundle mainBundle] localizedInfoDictionary] objectForKey:@"key名"]`で取得します。
NSLocalizedString内の言葉をstringWithFormatで文字を動的に変更する


よく忘れるので、メモ。

localized.stringsで置き換えたい所に%@などを直接書いて、
あとは、stringWithFormatを使って好きな言葉に置き換えるだけ。


```Localizable.strings(English)
	"hoge" = "I bought a %@ for $%d.";
```

```.mファイル

	NSString *strHoge = [NSString stringWithFormat: NSLocalizedString(@"hoge", @"コメント"), @"pencil", @"50"];
	NSLog(@"%@",strHoge);

```


```結果	
	I bought a pencil for $50.
```
Homebrewを使ってPlayをインストールする


```Bash
$ brew install play
==> Downloading http://downloads.typesafe.com/play/2.2.1/play-2.2.1.zip
######################################################################## 100.0%
?  /usr/local/Cellar/play/2.2.1: 2165 files, 127M, built in 6.7 minutes

$ $ play new hello_play
Getting com.typesafe.play console_2.10 2.2.1 ...
:: retrieving :: org.scala-sbt#boot-app
        confs: [default]
        6 artifacts copied, 0 already retrieved (2012kB/38ms)
Getting Scala 2.10.2 (for console)...
:: retrieving :: org.scala-sbt#boot-scala
        confs: [default]
        5 artifacts copied, 0 already retrieved (24390kB/64ms)
       _
 _ __ | | __ _ _  _
| '_ \| |/ _' | || |
|  __/|_|\____|\__ /
|_|            |__/

play 2.2.1 built with Scala 2.10.2 (running Java 1.7.0_51), http://www.playframework.com

The new application will be created in /current_path/hello_play

What is the application name? [hello_play]

> hello_play

Which template do you want to use for this new application? 

  1             - Create a simple Scala application
  2             - Create a simple Java application

> 1
OK, application hello_play is created.

Have fun!

$ cd hello_play

$ play run
(省略)

[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Ctrl+D to stop and go back to the console...)

```

この状態で`http://localhost:9000/`にアクセスするとページが見られます。
何かはまるかなー、と思ってましたが特につまる所はなくて良かったです。
ScalaでAndroid開発 - 「sbt & IntelliJ IDEA 13」編

IntelliJ IDEA 13とgithubにあるAndroidアプリ用のsbtテンプレートを使って、Scala+Androidの環境セットアップしたメモ。

基本的には[Scala + sbt-android + IntelliJ で快適Androidアプリ開発](http://shogogg.hatenablog.jp/entry/2013/12/06/000039)のとおりに進めていけばOKだった。

記事の内容からの差分は下の点。

## 1. mvn install時にadmobとgcmのモジュールを外す
mvn installをしようとすると admob と gcm のファイルがないと言われたので、インストール時にモジュール定義を外した。Android SDKのバージョンアップが原因?。このやり方でよいのか分からない。なのでひとまず変更内容を[こちらのpull-request](https://github.com/mosabua/maven-android-sdk-deployer/pull/196)にしてmaven-android-sdk-deployerの本家に報告を出した。

もう一度インストールすることがあれば、下の手順でmvn installすることにする。

```shell-session
$ git clone git@github.com:ikuo/maven-android-sdk-deployer.git
$ git co remove_module_defs_of_admob_and_gcm
$ mvn install
```

## 2. mackler/android-appのテンプレートを使う

IntelliJ IDEA 13でsbtがサポートされるようになり`gen-idea`をしなくて良くなった。なので`g8`でとってくるプロジェクトテンプレートは`android-app`にした。
android-appのテンプレートはもともとsbt android-pluginの作者であるjberkel氏のものがある。これをカスタマイズした[mackler氏のテンプレート](https://github.com/mackler/android-app.g8)が、より新しいsbt, scalaに対応していそうだったのでこっちを使うことにした。

```shell-session
$ g8 mackler/android-app
...
```

## あとは一緒
冒頭の記事と同じく、Intelli Jでレイアウトのビジュアル確認や編集、sbtでビルドやデバイスへのインストール・起動などが問題なくできた。scala楽しい。
KobitoとQiitaの表示の違い

KobitoはMarkdown記法で書くとリアルタイムで表示されるので便利です。
しかし、Qiitaにアップすると表示が変ってしまう部分もあるので、注意が必要です。

実例で見てみましょう。

# １．ソース
以下のテキストを用意して実験してみました。

![source.png](https://qiita-image-store.s3.amazonaws.com/0/37349/14443239-0741-dc47-4ff6-c66e12351930.png)

これを、Kobitoで表示させると
# ２．Kobitoでの表示
下図のように、ソースの【結果】以下の部分ですが、HTMLタグが混在しても正しく解釈され、反映されて表示されています。
![Kobito.png](https://qiita-image-store.s3.amazonaws.com/0/37349/a21ed959-ac34-aa2e-f55a-df24db8e36a2.png)

次に、同じソースをQiitaで表示させてみます。
# ３．Qiitaでの表示
今度は、HTMLタグは無視されているようです。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/37349/5de6b32c-abf0-eae2-5b96-ad204bcce27a.png)

よく見ると`<strong>`タグは有効になっているようですね。
そこで、

```
<strong>ストロングだけは効くのかな</strong>
```

と書いてみました。

【結果】
<strong>ストロングだけは効くのかな</strong>

使えるようですね。

#４．結論
KobitoとQiitaの見え方には差異があるので、要注意というお話でした。Kobitoでぐいぐい書きためて、さあQiitaに投稿しようとしたら「あれれー」となってちょっと悲しい思いをしたので、皆さんに報告したかったのです。
ただし、偶然ですが`<strong>`とか`<b>`タグとかは問題なく混在できる事も発見しました。他に、そういうのを発見したら是非教えていただけないでしょうか。
wanderlustのアドレスをhelmで選択する

Emacs userの皆さんはメールを書く時、wanderlustを使ってますよね!?
ということで、アドレス選択をhelmで出来るようにしました。

リポジトリ：https://github.com/kenbeese/helm-wl-address

# 設定
`.wlrc`とかに以下を追加します。

```el
;; helm-wl-address.elを置いたディレクリをload-pathに追加
(add-to-list 'load-path "/path/to/here")
(require 'helm-wl-address)
```

そして、draftのTo:とかCc:とかのフィールドでtabを押せば...
![スクリーンショット 2014-02-15 3.02.33.png](https://qiita-image-store.s3.amazonaws.com/0/7738/d9e65a46-5d31-5311-ef24-1968a62bfd17.png)

migemoマッチに対応しているので、helm-migemoを入れて、以下のコードを追加すればmigemoで選択できます!!

```el
(require 'helm-migemo)
(setq helm-use-migemo t)
```
GitHub ssh-T git@github.comでPermission deniedの回避方法をメモ

GitHubの準備で、公開鍵の登録確認ではまってしまったのでメモ。

## 現象
```
$ssh -T git@github.com
The authenticity of host 'github.com (192.30.252.129)' can't be established.
RSA key fingerprint is (フィンガープリント).
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
Enter passphrase for key '/c/Users/(ユーザー名)/.ssh/id_rsa':
Permission denied (publickey).
```

## 回避方法メモ


* 1.viで~/.ssh/known_hostsをひらき、１行目を削除  

```
1: github.com, 192.30.252.129　・・・ ←　削除
```


* 2.ssh-agentの起動

```
$ eval $(ssh-agent)
Agent pid ****

$ ssh-add -l
The agent has no identities.  ← このメッセージが出ればOK
```


* 3.ssh-addコマンドで秘密鍵を登録

```
ssh-add c:\Users/(ユーザー名\.ssh\id_rsa
```

これでGitHubとの認証通信 ```ssh-T git@github.com``` ができるようになった。
homebrewでmacvimを入れてviを置き換える

## やりかた

- ``brew install macvim --with-override-system-vim``
- `export PATH=/usr/local/bin:$PATH`を.bash_profileに書く

## macvimってGUI専用だと思ってました……

恥ずかしながら``mvim -v``というコマンドを初めて知りました。。mvimはmacvimをインストールするとついてくるコマンドで、 **vオプションでsystem vimのようにターミナル上で起動する** ことができます。

置き換えるメリットは以下のようなところでしょうか。

- OSのクリップボードとの連携
- 比較的あたらしいバージョンのvimを利用できる
  - かつ、brewでupdateできる

## 補足

置き換えについては``alias vim="mvim -v"``としても良いでしょうが、homebrewのオプションを眺めていたら便利なのを見つけたので、活用することにしました。

PATHの先頭に/usr/local/binを書いて/usr/binより優先させることでsystemのvimを置き換えています。これについてはbrew install後にbrew doctorすると親切に教えてくれます。

## 注意点

- vi, view, vimdiff なども置き換わります。
- まだmacvimをこういうふうに使うことでのデメリットが見えてません。戻すの難しくないし置き換えてみてます。いまのところ不満ないです。
- 以前はhomebrew-caskを使って入れていたけど、もしこっちを使うならoverride-system-vimとか便利オプションないので自分でゴリゴリalias書く必要があります。というか、多分使わないのが正解だと思います。
Lua対応版のVimのmake



# 概要
- [neocomplete.vim](https://github.com/Shougo/neocomplete.vim)を使っている関係で，Lua対応版のVimを入れたい．
- 英語が苦手なのもあって日本語コメントを多々入れているため，マルチバイト文字にも対応する必要がある．
- CUIからしか使わない
- OSはLinux (Ubuntu12.04LTS)

という要件で，VimをソースコードからMakeすることにした．

# 手順
## 必要なパッケージの導入
めんどくさいので，一括で入れた．
> $ sudo apt-get build-dep vim

順番が入れ替わるけど，これだけだと./configure時に次のように言われる．要するにlibluajitが見つからない．
> checking if libluajit*.so* can be found in /usr... no

luajitとlibluajitが入らなかったのでこれは手動で入れた．
> $ sudo apt-get install luajit libluajit-5.1

## ソースコードの取得
Mercurialで取得する．
> $ sudo apt-get install mercurial
> $ hg clone https://vim.googlecode.com/hg/ vim

## make
> $ ./configure --with-features=huge \
--disable-darwin \
--disable-selinux \
--enable-multibyte \
--enable-perlinterp \
--enable-pythoninterp \
--enable-rubyinterp \
--enable-luainterp=dynamic \
--with-lua-prefix=/usr \
--with-luajit \
--enable-fail-if-missing \
> $ make

オプションを変更しなおした場合は，次でmake
> $ make reconfig

インストール．/usr/local/binに入れてくれるみたい．
> $ sudo make install

### ./configureでlibluajitがないとコケる場合
libluajit*.so.* がないと怒られた．シンボリックリンクを貼るなどしても特に変わらず．
そこで，[公式](http://luajit.org/download.html)からソースコードを落としてmakeした．

> $ git clone http://luajit.org/git/luajit-2.0.git
> $ cd luajit-2.0
> $ make
> $ sudo make install

これで通ったっぽい．

# 最後に
一応，これでLua対応版のVimが入ったはず．この時点でver 7.4.179．
Raspberry Piにも入れたいし，必要なパッケージの導入部分は後でちゃんと書き直そうと思う．

以上のことを一括で行うシェルスクリプトを貼っとく．Vimにアップデートがあったりしてもコレでいけるはず．

```install.sh
#!/bin/bash


# update source codes
hg pull
hg update


# make
make distclean
./configure --with-features=huge \
--disable-darwin \
--disable-selinux \
--enable-multibyte \
--enable-perlinterp \
--enable-pythoninterp \
--enable-rubyinterp \
--enable-luainterp=dynamic \
--with-lua-prefix=/usr \
--with-luajit \
--enable-fail-if-missing \

make
sudo make install
```

# 参考
- http://miyakogi.blogspot.jp/2013/05/vimlua.html
- http://d.hatena.ne.jp/sasaplus1/20120910/1347211194
- http://vim-jp.org/docs/build_linux.html
株式のデータをスクレイピングで取得するGemを作りました！しかしそれは禁止行為ですので別の方法を紹介します。

# 2016/1/20
--------

いちエンジニアとしてもう少し思慮深くいるべきでしたが、

もともとこの記事で紹介させて頂きました「株式のデータをスクレイピングで取得するGem」は

Yahooファイナンスさんの定めた禁止行為にあたります。

そこでこの記事では、「株情報ゲットするためにYahooファインスからひっぱてこよう！」と考えられている方に別のクリーンな方法紹介します。

そのうち公開
TypeScript with AngularJSをASP.Net MVCで使う 環境構築篇

タイトル通りのことをやっていきます。だいぶコアな内容ですがめちゃくちゃ開発捗る組み合わせなのでお勧めです。
参考にしたのはこのページです
[Using TypeScript with AngularJS and Web API](http://www.piotrwalat.net/using-typescript-with-angularjs-and-web-api)

長くなるので2つに記事を分けます

# 環境構築
VisualStudio2013で進めていきます。無料のVS2013 Express for Webでも問題ないです。
VS2013のセットアップが済んだら、TypeScript for VisualStudioをインストールします
[TypeScript for Visual Studio 2012 and 2013](http://www.microsoft.com/en-us/download/details.aspx?id=34790)
VS2013→TSforVSの順番でインストールしないとテンプレートが読み込まれないことがあるので、すでにインストールしていたら再インストールしたほうがいいかもです。
ここまで出来たらVS2013を起動して新しいプロジェクト→インストール済みテンプレートから「TypeScriptを使用したHTMLアプリケーション」を選択します
![newproject.PNG](https://qiita-image-store.s3.amazonaws.com/0/20253/3c40a3f2-3540-c785-7ee7-8ac30a8acc22.png)
作成されるプロジェクトはすでに実行するとTypeScriptのデモとして時計のHTMLアプリケーションが作られています。app.tsをいじるだけでもけっこう楽しいです。
このプロジェクトにNuGetでAngularJSを導入します。NuGetで`angularjs`で検索したら出てくるので、
__AngularJS__と、TypeScriptの __AngularJS用定義ファイル__ の2つをインストールします
![angularjs.PNG](https://qiita-image-store.s3.amazonaws.com/0/20253/4da8b362-50c8-df75-084f-6ceb82498659.png)
次にWebApiを使う準備をします。プロジェクトに`Controllers`フォルダを追加し、右クリックして「追加」→「コントローラー...」でダイアログが開きます。
今回はWeb APi 2の空のコントローラを追加します。コントローラ名は`ValuesController`にします。
![webapicontroller.PNG](https://qiita-image-store.s3.amazonaws.com/0/20253/4b59a2d3-b2e5-b82d-d6f1-8edd09372925.png)
ここで一度ビルドをかけると、WebApiの方で参照が足りていないので、

- System
- System.Web

の2つ参照を追加してください。


[デモ篇](http://qiita.com/laco0416/items/1d2d587fe6d5b89a5990)に続く…
NSManagedObject派生クラスの自動生成


Qiitaにスクリーンショットのファイルをアップロードできるようになったので画像貼付けてみます。

まず、Data Model Inspector で Class を設定します。

![スクリーンショット 2014-02-15 0.20.57.png](https://qiita-image-store.s3.amazonaws.com/0/30731/efa350a5-96b8-25be-23c0-d7114b016081.png "スクリーンショット 2014-02-15 0.20.57.png")

その後、メニューから「Editor」⇒「Create NSManagedObject Subclass...」でファイルが自動生成されます。

![coredata_201402150028.png](https://qiita-image-store.s3.amazonaws.com/0/30731/003fc343-5dd5-79ce-815b-93bb3c2043ad.png "coredata_201402150028.png")
MovableTypeでカスタムフィールドに値がなかった場合の処理覚書

# 概要
カスタムフィールドに値がなかった場合、すべての表示を非表示にする処理を書いてみた。
SetVarBlockでまずは、カスタムフィールドの値を取得し
モディファイアのeqで値が0だった場合の処理を<MT:If>で条件分岐させてみた。
覚書になります。

# 追記

MTのバージョン5.02だと、```<mt:If tag="">```で条件が通らなかったため、上記のような書き方をしました。

最新バージョンだと通常通りに動作しました。 
下位バージョンの改修だったりすることがあるので、意外と忘れたりする。

# インデックステンプレート
```html
<mt:SetVarBlock name="important"><MTEntries><mt:important></MTEntries></mt:SetVarBlock>
<mt:If name="important" eq="0">
ない場合の処理
<mt:Else>
<MTEntries lastn="2">
    <MTEntriesHeader>
        <div class="conts01">
            <h2>セクションタイトル</h2>
                <div class="newsList">
                    <div class="inner">
                    <table border="0" cellspacing="0" cellpadding="0" class="newsListTbl">
    </MTEntriesHeader>
                    <tr>
                        <th scope="row"><$MTEntryDate format="%Y年%b月%e日"$></th>
                        <td><a href=""><$MTEntryTitle$></a></td>
                    </tr>
    <MTEntriesFooter>
                </table>
            </div>
        </div>
    </div>
    </MTEntriesFooter>
</MTEntries>
</mt:If>
```
ポップアップウィンドウの位置決めに便利な jquery.ui.position

例えば、文章中の単語にカーソルを当てるとウィンドウがポップアップして各単語の意味を表示するような UI をブラウザの中で実現しようとする時、そのポップアップウィンドウの位置決めは頭を使う作業になります。単純に単語の上にポップアップさせてしまうとブラウザウィンドウの上部境界近くではポップアップウィンドウの一部が表示されなかったりします。

幸い、この位置決めを簡単に行うことができる jQuery のライブラリが用意されています。jquery.ui.position です。[公式サイトのデモ](http://jqueryui.com/position/)で動作を確認することができますが、最初はわかりにくいと思うので、簡単にメモ書きしておきます。

公式ページで最初に表示される Default functionality というデモでは my、at、collition という 3つのパラメータを設定してこのプラグインの動作を確認することができます。先の例で言うと単語のどの位置 (at) にポップアップウィンドウのどの位置 (my) を合わせるかを指定することになります。左上と左上を合わせるならば共に「left - top」にする、といった塩梅です。残った collision はブラウザウィンドウ境界近くでの動作を決めます。collision に flip を指定するとはみ出た時は反対側に、fit を指定するとできるだけ同じ側に表示するようにします。

文章で読むより実際にパラメータを変えて動作を確認した方がわかりやすいと思うので興味があれば是非触ってみてください。デモでは大きさの違う 2つのポップアップウィンドウが表示されており、同じパラメータを与えた時に大きさの違いでどのような動作の差異が発生するかを確認できます。

実際に使う時はこの他に of というパラメータで親要素を指定します。
XCTestで非同期ブロックのテストを書く

XCTestで、こんな感じで非同期処理のテストを書いた場合、

```objc
[SNSUser loginWithBlock^(SNSUser* user, NSError* error) {
    XCTAssertNotNil(user, @"hoge");
    XCTAssertNil(error, @"fuga");
}];
```

一見テストが通ったと見せかけて、実はBlocksの中が
実行される前にテストが終わっていたりします。
(Blocks内はテストしてないけどTest Succeededってなる)
地味に最初はひっかかる人もいるんではないでしょうか。

XCTestでは非同期処理のテストができないと思っている人を時々見かけますが、
Blocksの中に書いた処理が走るまで待機させることで一応テストできます。

```objc
// テスト実行完了フラグ
__block BOOL isFinished = NO;

[SNSUser loginWithBlock^(SNSUser* user, NSError* error) {
    XCTAssertNotNil(user, @"hoge");
    XCTAssertNil(error, @"fuga");
    // Blocksの中のテストが終わったら完了フラグをYESに
    isFinished = YES;
}];
// 完了フラグがYESになるまで待機
while (!isFinished) {
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
}
XCTAssertTrue(isFinished, @"");
```

上記例のテストコードだと最大で1秒まで待機するようにしていますが、
念のため`isFinished`の値を確認しておくと安心かなと思います。
テーブルに実行されたSQLの種類別回数を調査する

以前担当したOracle案件で、面白い依頼がありました。
曰く、「テーブルごとにDMLの実行回数を調査してほしい」とのこと。

依頼の経緯は後述しますが、とりあえず作ったのがこれです。

```sql:kaisu.sql
--統計情報が採取されたテーブルに対し、一日あたりのinsert,update,deleteの件数を表示する
select
	AD.TABLE_NAME,
	round(AD.INSERTSUM / to_number(sysdate - b.LAST_ANALYZED)) "1日のINSERT件数",
	round(AD.UPDATESUM / to_number(sysdate - b.LAST_ANALYZED)) "1日のUPDATE件数",
	round(AD.DELETESUM / to_number(sysdate - b.LAST_ANALYZED)) "1日のDELETE件数"
from
	user_tables b inner join (
								select
									a.TABLE_NAME,
									sum(a.INSERTS) INSERTSUM,
									sum(a.UPDATES) UPDATESUM,
									sum(a.DELETES) DELETESUM
								from
									user_tab_modifications a
								where
									a.TABLE_NAME not like 'BIN%'
								group by a.TABLE_NAME
								) AD 
								on b.TABLE_NAME = AD.TABLE_NAME
where
	b.LAST_ANALYZED is not null
order by 1
;
```

書いていて何ですが、これ実は検証中のスクリプトなので結果の保証ができかねます。
たぶん正しいと思いますが、ご参考までに。


#経緯について

1. アーカイブログファイルの出力量が多すぎてディスクがパンクしそうだからなんとかしたい。
2. でもこんなん業務上の都合じゃない（あくまでOracleの仕様の問題）だから、ディスクを買ってお客さんにお金を出させるわけにはいかない。
3. じゃあログを出しているＳＱＬの量を調査して、削減するないし、テーブルの余剰カラムを削除する、あるいはSQLにログ削減ロジックを組み込もう

というわけです。大まかには。

ログが増えた一番の原因は結局なんだったのかというと、判別不明な点がまだあります。
ですが、余計なワークテーブル（ここでは、データを加工した結果を一時的に格納しておく変数みたいに使われるテーブルのこと）をアプリチームが勝手気ままに作ったりして無駄にログを増やしたのが大きいと言われていたので、なんとなく人災だったのだという気がしています。

Oracleの機能でアーカイブログ出力量を減らす方法はいくつかありますけど、やっぱり限界はあるわけですから少しは頭使って欲しいなあ、とその当時はアプリチームに文句たらたらでした。まあ、機能実装主眼なんですからしょうがないのはわかりきっていましたけど。

ちなみにOracleの設定でログを減らすには、大体次の方法を取ります。

* SQLのログ出力量を減らすようOracleのパラメータを変更
* DDL文やDML文でnologgingオプションを使う
* ノーアーカイブモードのOracleインスタンスを同じサーバに作ってワークテーブルを移する

__最後はかなり荒業ですから薦めません。__

パフォーマンスも落ちるし、ディザスタリカバリサイトを作成している場合はData Guardがうまく働きませんのでアウトです。
Python のバージョン違いによる filter() の挙動に愕然としている

```pycon

Python 2.7.5 (default, Aug 25 2013, 00:04:04)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> data = 'spam123'
>>> bool(filter(lambda s:s.isupper(),data))
False
Python 3.3.3 (v3.3.3:c3896275c0f6, Nov 16 2013, 23:39:35)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> data = 'spam123'
>>> bool(filter(lambda s:s.isupper(),data))
True
```  

詳しい方がいらっしゃったら解説してほしいです

## 解説していただけました!! 2014-02-15 10:10
> http://qiita.com/trsqxyz/items/50e6e59e23995b6c2b41#comment-d01210d7bd8f60d2c590
> filter()が2系でリストを返していたのが、3系ではイテレータを返すようになったのが原因のようです。

@shiena ありがとうございます！！

空のリストからイテレータオブジェクトに変わったためにブール値が変わってしまったんですね  
ここらへんは [Dive into Python 3](http://diveintopython3-ja.rdy.jp/porting-code-to-python-3-with-2to3.html#filter) が便利そう  
ということで

```pycon

Python 3.3.3 (v3.3.3:c3896275c0f6, Nov 16 2013, 23:39:35) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> data = 'spam123'
>>> bool(list(filter(lambda s:s.isupper(),data)))
False
```
となりました
関数をひとつずつ検証するのは大事ですね

## コメントしていただけました!! 2014-06-01 10:46  
>http://qiita.com/trsqxyz/items/50e6e59e23995b6c2b41#comment-945bff027756ad382a35
> コード例のような処理を書きたい場合は、boolよりもanyが適しています。  

`any( )` は iterable な要素のいずれかが真であれば `True` を返す組み込み関数です。要素全ての場合は `all( )` がありますね。  
確かに `any( )` を使うほうが適切に思えます。ありがとうございました。  

## `any( )` と `bool( )`
```pycon
>>> a=[0]
>>> bool(a)
True
>>> any(a)
False
```
`any( )` は要素ごとにチェック `bool( )` は要素があるのか という感じでしょうか
C++11 STL Container Efficiency その５（削除)

[その２（範囲挿入）](http://qiita.com/temoki/items/c2e44b852fea9bf94d7f)後の状態の各コンテナ内100万要素を１要素ずつ削除。

##調査コード
対象コンテナは vector, deque, list, set, unordered_set の5つ。

```cpp
// vector::pop_back() ※末尾から削除
// vector<int> v;
while (!v.empty()) {
    v.pop_back();
}
```

```cpp
// vector::erase() ※先頭から削除
// vector<int> v;
auto i = v.begin();
while (i != v.end()) {
    i = v.erase(i);
}
```

```cpp
// deque::pop_back() ※末尾から削除
// deque<int> d;
while (!d.empty()) {
    d.pop_back();
}

```

```cpp
// deque::pop_front() ※先頭から削除
// deque<int> d;
while (!d.empty()) {
    d.pop_front();
}

```

```cpp
// list::pop_back() ※末尾から削除
// list<int> l;
while (!l.empty()) {
    l.pop_back();
}

```

```cpp
// list::pop_front() ※先頭から削除
// list<int> l;
while (!l.empty()) {
    l.pop_front();
}

```


```cpp
// set::erase()
// set<int> s;
auto i = s.begin();
while (i != s.end()) {
    i = s.erase(i);
}
```


```cpp
// unordered_set::erase()
// unordered_set<int> us;
auto i = us.begin();
while (i != us.end()) {
    i = us.erase(i);
}
```

##結果

|コンテナ|メンバ関数|削除位置|計算量|時間|
|:--|:--|:--|:--|--:|
|vector|pop_back()|末尾|O(1)|0 ms|
|vector|erase()|先頭|O(N)|78378 ms|
|deque|pop_back()|末尾|O(1)|2 ms|
|deque|pop_front()|先頭|O(1)|3 ms|
|list|pop_back()|末尾|O(1)|72 ms|
|list|pop_front()|先頭|O(1)|67 ms|
|set|erase()|-|O(1)償却定数時間|94 ms|
|unordered_set|erase()|-|O(1)平均、O(N)最悪|103 ms|

測定環境: Intel Core i7-4850HQ 2300 MHz (4 cores), Apple LLVM version 5.0
Vimのテキストオブジェクトについてまとめた

## テキストオブジェクトって何?

Vim7位から追加された概念
あるルールに基づいたテキストのまとまり

## 何が良いの?

オペレータと組み合わせて、テキストオブジェクト単位での編集ができる

## オペレータ?

テキストを削除したり、編集したりするコマンド

### 主なオペレータ

| キー  | オペレーション        |
|:------|:-----------------------|
| c     | 変更                  |
| d     | 削除                  |
| y     | yank                  |
| ~     | 大文字/小文字入れ替え |
| gu/gU | 全て小文字/大文字     |



## テキストオブジェクトと組み合わせるのってどうするの?

```
オペレータコマンド + (回数指定) + 内部/外部指定 + テキストオブジェクトの種類の指定
```

## よくわかんないので具体的に

こんなテキストがある時(|は、カーソル位置)

```
kp3k3 "te|st" 2jo2jp
```


vi" を押下すると、以下のように、ビジュアルモードで選択される(~~~~ は選択範囲)

```
kp3k3 "te|st" 2jo2jp
       ~~~~~
```


**vi" で、 カーソル上の " で囲まれている文字列の内部を、ビジュアルモードで選択 という意味になる**

### それぞれのコマンドの意味

v : ビジュアルモードで選択
i : inner
" : "で囲まれている文字列


## 内部/外部指定

a : テキストオブジェクト全体を指定(a) 
i : テキストオブジェクト内部を指定(inner)

```
vi"
kp3k3 "te|st" 2jo2jp
       ~~~~~
```

```
va"
kp3k3 "te|st" 2jo2jp
      ~~~~~~~
```

va" だと、" も含まれる

## テキストオブジェクトの種類(よく使いそうなやつ)

| キー        | 意味                                                                |
|:------------|:--------------------------------------------------------------------|
| w           | word . とか , とか、単語を区切りそうな文字列までの連続<br>set iskeyword で、区切り文字以外の文字列を確認可              |
| W           | WORD 非空白文字の連続                                               |
| [,(,{,<,",` | 左の記号で囲まれている文字列                                        |
| b           | block ブロック。() 等カーソル位置から直近の囲み文字の範囲(前方一致) |
| B           | block ブロック。() 等カーソル位置から直近の囲み文字の範囲(後方一致) |
| t           | htmlタグ                                                            |



## 便利なテキストオブジェクト拡張プラグイン

### surround.vim

[tpope/vim-surround](https://github.com/tpope/vim-surround)
囲み文字を対象にするテキストオブジェクト(s)を追加するプラグイン

ys[範囲][記号] -> 記号で範囲を囲む
cs[記号] -> 記号を置換
ds[記号] -> 記号を削除
S[記号] -> 選択範囲を記号で囲む

### 例

ysiw" -> カーソル上の単語を " で囲む

### vim-textobj-ruby

[rhysd/vim-textobj-ruby](https://github.com/rhysd/vim-textobj-ruby)
ruby のブロックを対象にするテキストオブジェクト(r)を追加するプラグイン

### 例

dir : if 〜 end の中身を削除


## 参考

- [Vim で Ruby を書くためのプラグイン3つ書いた - Qiita](http://qiita.com/Linda_pp/items/839f4b9e07cf7f341835)
- [Vimのテキストオブジェクトとsurround.vimでhtml編集の効率を上げる](http://www.karakaram.com/textobject-surround)
- :help text-objects