OmniAICreator/Qiita-1.07M huggingface dataset:
Swiftでクイックソート


Swiftでクイックソートプログラム。

```quicksort.swift

//: Playground - noun: a place where people can play

import UIKit

var list = [Int]()
for i in 1...10000 {
    var randomNum = Int(arc4random()%10000)
    list.append(randomNum)
}

//quicksort ex1
func quicksort1(list:[Int]) -> [Int]{
    
    //無限ループを防ぐ
    if list.count == 0 {
        return []
    }
    
    //pivotを選択
    let pivotValue = list[0]
    //filterを用いる。closerで条件を書く。
    let smaller = list.filter({$0 < pivotValue})
    let greater = list.filter({$0 > pivotValue})
    
    return quicksort1(smaller) + Array(arrayLiteral:pivotValue) + quicksort1(greater)
}

//Benchmark
var d1 = NSDate()
quicksort1(list)
var d2 = NSDate()
var time = Float(d2.timeIntervalSinceDate(d1))
println("\(time)")

//quicksort ex2
func quicksort2(list:[Int]) -> [Int]{
    
    if list.count == 0 {
        return []
    }
    
    let pivotValue = list[0]
    //pivotを配列から取り除く
    let listStripped = list.count > 1 ? list[1...(list.count-1)] : []
    //「.filter」だとなぜかエラーを吐く
	//    let smaller = listStripped.filter({$0 <= pivotValue})
	//    let greater = listStripped.filter({$0 > pivotValue})
    let smaller = filter(listStripped, { $0 <= pivotValue })
    let greater = filter(listStripped, { $0 > pivotValue })
    
    return quicksort2(smaller) + Array(arrayLiteral: pivotValue) + quicksort2(greater)
}

//Benchmark
var d3 = NSDate()
quicksort2(list)
var d4 = NSDate()
var time2 = Float(d4.timeIntervalSinceDate(d3))

```

実行してみればわかりますがベンチマークの結果は激遅です。
これはSwiftのArrayが参照型ではなく値型なのが影響しているそうですが、改善方法がわからないのでどなたかご助言をいただけると嬉しいです。


参考
> \[Sigmapoint blog](http://blog.sigmapoint.pl/quicksort-the-swift-way/ "Quicksort the swift way")
pg_searchで簡単に検索機能追加

# はじめに

pg_searchを用いての簡単な検索機能追加について学びんだことをまとめました。
![Screenshot 2015-07-18 21.51.47.png](https://qiita-image-store.s3.amazonaws.com/0/82804/1ce907d4-6210-9db0-c5b2-248bfdf587be.png)

# 必要条件
- Ruby
- Rails
- PostgreSQL
- pg_search gem

```rb:Gemfile
#ruby 2.2.1
gem 'rails',       '~> 4.2.1'
gem 'pg',          '~> 0.17.1'
gem 'pg_search',   '~> 1.0.3'   # Named scopes that take advantage of PostgreSQL's full text search
gem 'haml-rails',     '~> 0.9.0'
gem 'bootstrap-sass', '~> 3.2.0.0' # Converts Less to Sass.
# etc
```

#やりかた

##Model
pg_search gemを使うために、まず`include PgSearch`を加えます。
そして、`pg_search_scope`を定義します。後にsearchメソッドを呼び出すとここで定義したscopeで検索の処理が行われます。例、`Ingredient.search(params[:search])`

```rb:Model

class Ingredient < ActiveRecord::Base
  include PgSearch  # 忘れずincludeすること。

  scope :sorted, ->{ order(name: :asc) }

  pg_search_scope :search,
                  against: [
                    :name,
                    :volume
                  ],
                  using: {
                    tsearch: {
                      prefix: true,
                      normalization: 2
                    }
                  }

...
```

##View
テンプレートで検索用フォームを作成します。
検索用の属性（本例では:search）を用い、ユーザーの検索フォームへの入力値をパラメータとしてGET#indexリクエストします。

```haml:View
...

# 検索機能
.filter_wrapper{ style: "margin-bottom: 20px;" }
  = form_tag(ingredients_path, method: "get") do
    = text_field_tag :search, nil, placeholder: "Search ingredients ...", class: "form-control"
    = submit_tag "", style: "display: none;"

    ...
```

##Controller
indexアクションの処理を、検索用パラメータの有無を検知して分岐します。本例の場合は、before_actionフィルタに処理をまとめました。検索用パラメータがある場合のみ検索処理を行います。

```rb:Controller
class IngredientsController < ApplicationController

  before_action :search_ingredients, only: :index  # indexアクションのみ

  def index
  end

  ...

  private

    def ingredient_params
      params.require(:ingredient).permit(:name, :volume)
    end

    # 検索用パラメータの有無を検知。検索用パラメータがある場合のみ検索処理。
    def search_ingredients
      @ingredients =  if params[:search].present?
        then Ingredient.search(params[:search])
        else Ingredient.all
        end.sorted.paginate(page: params[:page])
    end
end

```

# おわりに
今回記載した内容は基本的なことのみですが、簡単にデータベースの機能を利用して、検索機能を追加することができました。

# 参考資料

- [pg_search gem](https://github.com/Casecommons/pg_search)
- [Railscasts PRO #343 Full-Text Search in PostgreSQL (pro)](https://www.youtube.com/watch?v=n41F29Qln5E)
- [Rails and React](http://codeloveandboards.com/blog/2014/09/10/rails-and-react-ii-a-real-use-case/)
Rubyでexitしたときに例外がキャッチされてた件

Ruby(rails)初心者です。ちょっと不具合出してしまったので、自分への戒めのためにメモっておきます。Rubyの`exit`まわりの処理についての話です。

## Rubyのバージョン

`2.1.1`

## 問題

```rb:元のコード
def hoge
  if #... 
    exit
  end
rescue Exception
  p "rescue"
  # なんらかの処理
end
```

こんな感じのコードがあって、`if`内の処理が走ったときに`exit`で処理が終了するだろうなんて思い込んでしまっていたのですが、例外がキャッチされていて、`rescue`内の想定していない(良くない)処理が実行されていた。

## 原因

他の記事参考にしつつ`rails c`なんかで試してみると、以下のコードでは例外がキャッチされない(=`rescue`内の処理は実行されない)。

```rb:元のコードから'Exception'をとったもの
def hoge
  if #... 
    exit
  end
rescue => e  # Exceptionの指定をとると
  p "rescue" # ここの処理は走らなくなる
  # なんらかの処理
end
```

どうやら型指定なしでrescueすると、`StandardError`のサブクラスのみをキャッチする模様。

元のコードで指定していた`Exception`クラスは調べてみると**例外の大元の親クラス**だった。

で、`exit`が発生させる例外クラスは`SystemExit`というもので、

- `SystemExit`は当然`Exception`のサブクラスである
- `SystemExit`は当然`StandardError`のサブクラスではない

これでようやく上２つのコードの現象の理屈が通った。

## 解決

そもそも`Exception`を`rescue`で指定すること自体がそもそも良くないのだろうけど、既存のコードでどんな例外発生するか読めず、`exit`を`exit!`にすることで例外を発生させずに処理を終了できるようなのでそれで対応した。

```rb:修正したのコード
def hoge
  if #... 
    exit! # '!'をつけた
  end
rescue Exception
  p "rescue"
  # なんらかの処理
end
```

### 参考にした記事

- http://qiita.com/kasei-san/items/75ad2bb384fdb7e05941
- http://d.hatena.ne.jp/yarb/20121005/p1
- http://qiita.com/8845musign/items/d3bfc06517cfa1139509
私のpythonデータ分析環境

私のpythonデータ分析環境は以下の通りです。

* os
fedora22。
DVDに焼く方法だと途中でインストールが止まってしまいできなかったので、fedora21からバージョンアップした。
fedora22最高です。

* python
anaconda 64bit python3.4です。
python2系は日本語の扱いがめんどうですが、python３系はシンプルに日本語を扱えます。
また、データ分析をするためにはnumpyを筆頭にモジュールが必要で、個別にインストールしようとすると依存関係に悩まされますが、anacondaではまとめてインストール、簡単にアンストールができます。anaconda環境にpipもできます。mecabも動かすことができました。
anacondaもまた最高です。
[Download Anaconda](http://continuum.io/downloads#py34)

* 機械学習
scikit-learnです。機械学習をする方法は沢山ありますが、あれこれやってもものにならないので、質の良さそうなscikit-learnに絞りました。

* エディタと実行環境
エディタはgeditです。windowsならサクラエディタです。エディタでコードを書いてqtconsoleに貼り付け実行します。
qtconsoleもまた最高です。ipythonなのでtab補完もできます。この補完やヘルプ機能が本当に便利。膨大なpythonの機能を必要に応じて調べることができます。

 IPython notebookも使いましたが、情報伝達にはいいと思うのですが、使いづらかったです。特にグラフをインライン表示させる使い方が使いづらく感じました。コードが見づらくなるのです。qtconsoleの方が使いやすいです。

IDEにspyderがあります。よくできているのですが、使いづらかったです。ソフトウエア開発をするときは使いやすく感じるのかもしれませんが、私には必要ありませんでした。
gp2を使用したインスタンス(8GB)でDeep Security Agentを動かしてみた

こんにちは、ひろかずです。

EBS(gp2)を使用したインスタンスで問題が出た話があったので、一筆書きます。

約一年前の2014/6/17にAWSインスタンスに使用できるEBSにGeneral Purpose (SSD)ボリュームタイプが追加されました。
[【AWS発表】新しいSSDベースのElastic Block Storage](http://aws.typepad.com/aws_japan/2014/06/new-ssd-backed-elastic-block-storage.html)

詳細は上記リンクを見ていただくとして、要約すると、メリットは以下のとおりです。

- サイズ(GB)x3 IOPSのベースラインが保証される
- バーストクレジットを使用して最大3000IOPSのパフォーマンスが提供される
- EBSの利用量に対して課金
- EBS毎に540万I/Oクレジットが割り当てられる

暫く前からインスタンス起動時のStorage選択画面でデフォルトでgp2が選択され、最後の確認画面でもgp2を推奨する確認画面が表示されます。

一方で以下の様な問題に遭遇することが起こっています。

- 2015/7/4現在、I/Oクレジットの使用状況を確認することができない。
- Linuxは、rootボリュームがデフォルト8GBであるため、そのままgp2を選択するとベースラインが24IPOPSになる。
- ベースラインが24IOPSの環境では、バーストクレジットを使い切ると極端にDisk I/Oが遅くなり、サービスへの影響が発生する。

rootボリュームのサイズを100GB程度にしていれば良いのですが、なんとなく作ったインスタンスは意外と問題があるかもしれません。

#検証目的とスコープ
EBS(gp2)を使用したインスタンス場合、Deep Securityの動作によりI/Oクレジットを使いきってしなわないかを明らかにする。

Deep Security Agent側でディスクI/Oを主に使用する機能のうち、定常的に動作させることが想定される、以下の機能を使用する。

- 不正プログラム検索機能のスケジュールスキャン
- 予約タスクで実行する変更検索タスク

結果の判定は、開始時刻と終了時刻が明確に確認できる `不正プログラム検索機能のスケジュールスキャン` の実行時間の差異を用いる。

#環境情報
- Deep Securityは、9.5sp1を使用しました。
- Deep Security ManagerとAgentは、同一VPC内に配置します。
- Deep Security Agentを導入するインスタンスは、Ubuntu(3.13.0-53-generic)を使用しています。
- その他の機能による影響を排除するため、起動後のインスタンスにDeep Security Agentのみを導入しています。
- Deep Security Agentを導入するインスタンスは、EBS(Standard)とEBS(gp2)それぞれを用いたものを用意します。
- ストレージのサイズは8GBにします。
- 不正プログラム検索設定は、`Default Schedule Scan Configration`を使用します。
- 変更検索タスクの対象は、「Trend Micro Deep Security 9.0 変更監視ルール スターターガイド」掲載のディレクトリを対象とします。(URL確認中)

#検証手法
- 毎時20分に不正プログラム検索を実行する。
- 毎時45分に予約タスクにて変更検索を実行する。
- EBS(gp2)と(Magnetic)のインスタンスにて実行する
- 試験期間は24時間とする。

#結果
	時間帯	m3.medium-gp2	m3.medium-mag
	14時台	0:02:09			0:02:09
	13時台	0:02:09			0:02:09
	12時台	0:02:09			0:02:09
	11時台	0:02:09			0:02:09
	10時台	0:02:09			0:02:09
	09時台	0:02:08			0:02:09
	08時台	0:02:09			0:02:09
	07時台	0:02:09			0:02:08
	06時台	0:02:09			0:02:09
	05時台	0:02:08			0:02:09
	04時台	0:02:09			0:02:08
	03時台	0:02:09			0:02:09
	02時台	0:02:09			0:02:08
	01時台	0:02:09			0:02:08
	00時台	0:02:09			0:02:08
	23時台	0:02:09			0:02:08
	22時台	0:02:09			0:02:08
	21時台	0:02:08			0:02:09
	20時台	0:02:09			0:02:08
	19時台	0:02:09			0:02:09
	18時台	0:02:09			0:02:09
	17時台	0:02:24			0:02:25
	16時台	0:02:09			0:02:09
	15時台	0:02:21			0:02:31

値は実行にかかった時間です。(終了時刻-開始時刻)
24時間では有意な差は見られませんでした。
検証で使用したインスタンスは、Deep Security以外の動作を殆ど行っていません。
純粋なDeep Securityの動作ではI/Oクレジットを使い切るようなことはないようです。

#終わりに
少々予想外の結果でした。
Windows OSでは結果が異なるかもしれませんので、同じ検証やってみたいと思います。
この検証は、あくまでDeep SecurityだけでI/Oクレジットを使い切るかを確認したに過ぎません。
インスタンスを作成する時は、サイズとストレージタイプに注意して、障害の芽は摘んでおきましょう。


本日はここまでにします。
お疲れ様でした。
Electron使ってみた

* [Electronでアプリケーションを作ってみよう - Qiita](http://qiita.com/Quramy/items/a4be32769366cfe55778)をハンズオンしてみた。
* xubuntu 14.04.2 + vagrant

## 開発環境

```bash:必須パッケージインストール
sudo locale-gen ja_JP.UTF-8
sudo apt-get update

sudo apt-get install -y nodejs-legacy npm git
sudo npm -g install electron-prebuilt
```

```bash:開発準備
mkdir electron-readus/lib; cd electron-readus
yes "" | npm init -y
```

* ファイルの編集
  * package.json
  * index.html
  * main.js
  * lib/fileUtil.js

```bash:デスクトップアプリの起動
export DISPLAY=:0
electron .
```

起動に失敗する場合は以下修正

```diff:package.json
- "main": "index.js",
+ "main": "main.js",
```

```bash:globモジュールのインストール
sudo npm install glob --save
```

```bash:bowerモジュールと、bowerからangularjsのインストール
sudo npm install bower
yes "" | bower init
bower install angular marked --save
```

```bash:asar化
sudo npm install -g asar
asar pack . ~/app.asar
```

## 配布用electron実行環境をダウンロード

* https://github.com/atom/electron/releases
    * Linux : electron-v0.30.0-win32-x64.zip
    * RasPi : electron-v0.30.0-linux-arm.zip
    * Mac : electron-v0.30.0-darwin-x64.zip
    * Win : electron-v0.30.0-win32-x64.zip
* 解凍し、`resources`にapp.asarを置く。
    * ./electron を実行すると起動する。

![a3.png](https://qiita-image-store.s3.amazonaws.com/0/25728/c3bb7d04-98c4-f5fd-6b67-2f3bf9e69d21.png)


## electronは最近の著名なクロスプラットフォームアプリで採用されている

* Slack
* Atom
* VisualStudio Code
* kitematic
* kobito
ATOMで開き括弧を入力した時に、閉じ括弧を自動で入力するのをやめる

標準で入っている"Bracket Macher"というプラグインがそうしている。

設定の"Packages"から、"Bracket Macher"を検索し、そのSettingを開く。Auto Complete Autocomplete Bracketsがあるので、チェックを外す。

もしくは、config.csonに以下を追加する。

```cson
  "bracket-matcher":
    autocompleteBrackets: false
```
ラズベリーパイ2とperlを使って、LEDをランダムな時間間隔でチカチカさせる


##概要
ラズベリーパイ2を利用したLEDチカチカ(通称Lチカ)を試してみます。
せっかくなので、それっぽくチカチカさせようと思います。
ここではすぐ使えるperlを利用します。
（やっていることはechoだけですので、もちろんshellなどでも同様のことはできます！）

##Math::Roundをインストール
四捨五入の制御用にMath::Roundをcpanでインストールします。

```
$ cpan Math::Round
// rootでも使えるように
$ sudo cpan Math::Round
```

##プログラムを作成

GPIOのvalueを 0<->1 と切り替えるだけの簡単なプログラムです。
切り替えはechoで、引数で指定したgpioのvlaueに書き込むことで対応。
あとはスリープの時間(切り替え時の待機時間)をランダムにしてやればOKです。

```perl:RandomFlash.pl
#!/user/local/bin/perl

use strict;
use warnings;
use utf8;
use Time::HiRes 'sleep';
use Math::Round;

#
# メイン処理
#
sub main
{
    # Lチカに利用するPIN番号が引数に指定されていない
    if (@ARGV == 0) {
        print "invalid argument. please assign gpio num.(ex. 18)";
        return 1;
    }

    my $gpio = $ARGV[0];

    # PIN設定
    exec_cmd("echo $gpio > /sys/class/gpio/export");
    exec_cmd("echo out > /sys/class/gpio/gpio$gpio/direction");

    # Lチカ
    my $LIMIT = 10;
    for (my $count = 0; $count < $LIMIT; $count++){
        print ">>>> [count = $count]\n";
        # 点灯
        turn_on_LED($gpio);
        sleep(getRandomeTime());
        # 消灯
        turn_off_LED($gpio);
        sleep(getRandomeTime());
    }

    return 0;
}

#
# 点灯(消灯)時間をランダムに返す
#
sub getRandomeTime
{
    return nearest(0.1, rand(1));
}

#
# LED制御
#
sub turn_on_LED  { ctrl_LED(1, shift); }
sub turn_off_LED { ctrl_LED(0, shift); }
sub ctrl_LED
{
    my ($val, $gpio) = @_;
    exec_cmd("echo $val > /sys/class/gpio/gpio$gpio/value");
}

#
# コマンドを実行する
#
sub exec_cmd
{
    my ($cmd) = shift;
    print "$cmd\n";
    my $output = `$cmd 2>&1`;
    chomp($output);
    my $status = $? / 256;
    return ($status, $output);
}

&main();
```

##実行

配線はこんな感じで。
ここではGPIO18(12番PIN)を利用します。
LEDはカソード(足が短い方)をマイナス極につなぎます。

![raspberry01.png](https://qiita-image-store.s3.amazonaws.com/0/30307/0f2003ef-2aa3-c458-3c44-57df7265af8b.png "raspberry01.png")

引数にGPIOの番号を指定して実行します。

```
$ sudo perl RandomFlash.pl 18
```

成功すると下記のように出力され、LEDがランダムにチカチカします！

```
echo 18 > /sys/class/gpio/export
echo out > /sys/
class/gpio/gpio18/direction
>>>> [count = 0]
echo 1 > /sys/class/gpio/gpio18/value
echo 0 > /sys/class/gpio/gpio18/value
>>>> [count = 1]
echo 1 > /sys/class/gpio/gpio18/value
echo 0 > /sys/class/gpio/gpio18/value
>>>> [count = 2]
echo 1 > /sys/class/gpio/gpio18/value
echo 0 > /sys/class/gpio/gpio18/value
>>>> [count = 3]
echo 1 > /sys/class/gpio/gpio18/value
echo 0 > /sys/class/gpio/gpio18/value
>>>> [count = 4]
echo 1 > /sys/class/gpio/gpio18/value
echo 0 > /sys/class/gpio/gpio18/value
>>>> [count = 5]
echo 1 > /sys/class/gpio/gpio18/value
echo 0 > /sys/class/gpio/gpio18/value
>>>> [count = 6]
echo 1 > /sys/class/gpio/gpio18/value
echo 0 > /sys/class/gpio/gpio18/value
>>>> [count = 7]
echo 1 > /sys/class/gpio/gpio18/value
echo 0 > /sys/class/gpio/gpio18/value
>>>> [count = 8]
echo 1 > /sys/class/gpio/gpio18/value
echo 0 > /sys/class/gpio/gpio18/value
>>>> [count = 9]
echo 1 > /sys/class/gpio/gpio18/value
echo 0 > /sys/class/gpio/gpio18/value
```
windows > レジストリ > REG_SZ > 最大長 1024

Windows 7などでレジストリに文字列を格納する時に使うREG_SZの最大長について。

http://itdoc.hitachi.co.jp/manuals/3021/3021313500/JPSC0441.HTM
> 登録する値の型がREG_SZ，またはREG_EXPAND_SZの場合，値として登録できる文字列の最大は1,024バイトです。1,025バイト以上の文字列を指定した場合，1,025バイト以降の文字列は無視されます。
技術英語 > several points in between

http://www.cyclethedales.org.uk/all-routes-search?queries_route_location_query_posted=1&queries_route_location_query%5B17%5D=Pateley%20Bridge

> and both end points (as well as several points in between)

座標の話などで、端点２点の間にいくつかのポイントがある時などに使えそう。
OS X Serverを無料でインストールする方法

# はじめに
OSXServerは通常有料です。
2015年7月19日現在、2400円します。
割と高いですね・・・。
この記事では無料でインストールする方法を伝授します。

# 無料でインストールする方法
分かってしまえば簡単な方法なのですが、ネットを検索しても情報が出てこないので有料でインストールしてしまう方が多いのではないかと思います。

まず、Apple Developer Programに加入している必要があります。
OSXServerをインストールするような技術者は、加入してる方が多いと思います。

次にブラウザでApple Developerの以下のページに移動します。
そして赤矢印のOSXアイコンをクリックします。

![screenshot_20150719_01.png](https://qiita-image-store.s3.amazonaws.com/0/41552/399812d6-74f3-858b-d3ac-af6cdcfb9dc0.png)

OSXのページに移動したらDownloadボタンをクリックします。

![screenshot_20150719_02.png](https://qiita-image-store.s3.amazonaws.com/0/41552/c31f6a2d-5af4-9559-db10-9b8a63adf4a5.png)

Download画面に移動したら下にスクロールしていくとベータ版じゃないOSXServerが見つかると思います。

![screenshot_20150719_03.png](https://qiita-image-store.s3.amazonaws.com/0/41552/742ce89b-64e6-608b-d26c-d9aef976b425.png)

これがDeveloper向けの、無料のOSXServerです。
こちらからインストールすれば無料でOSXServerがインストールできます。
DockerコンテナのLinux GUIアプリをWindowsで起動する

# docker上で起動してるGUIアプリをWindows上で操作したい

仮想マシンならVMware Playerは「Unityモード」、Sun VirtualBoxは「シームレスモード」を使ってゲストOS上で実行されているGUIアプリケーションをWindows上で表示されている”風”に操作することができますが、dockerではそういうわけにはいきません。ではどうするか。もうあれしかないですね。X11フォワードです。

# 用意するもの

Windows上で必要なのは[【学習基盤としてのDocker】Dockerでとっかかろう](http://qiita.com/fireowl11/items/b96a4c2308a6a2c72d0d) の記事のままです。

* boot2docker
* MovaXterm

MovaXtermがXサーバーになれるのが便利便利。

# 手軽に試せるDockerイメージ

2個見つけました。

* 1個目：https://registry.hub.docker.com/u/dorowu/ubuntu-desktop-lxde-vnc/

手順：
1. MovaXtermでboot2dockerに接続した状態で `docker run -d -p 6080:6080 -p 2233:22 dorowu/ubuntu-desktop-lxde-vnc` でコンテナ起動
2. 起動してもsshが動いてないので `docker exec [コンテナ名] service ssh restart`
3. 更にMovaXtermで下図の通り接続を追加します。これでboot2dockerのポート2233を経由して1.のコンテナのポート22に接続できます。この時の"Remote host"はboot2dockerのIPです。<sub>前回記事のようにlocalhostでも繋がるようにもできますけどboot2dockerの上げ下げが面倒くさかった。</sub>
![image](https://qiita-image-store.s3.amazonaws.com/0/42843/cd48d02e-7b84-5cb3-aab9-ad5b6c8032f9.png) 
4. 接続する時に訊かれるパスワードは"ubuntu"です。
5. 接続できたら`gnome-www-browser`と叩いてみましょう。Firefoxが立ち上がります。yahoo.co.jpとかにアクセスしてみればいつもと違うフォントで表示されるのが分かりますね。
![Firefox_mini.jpg](https://qiita-image-store.s3.amazonaws.com/0/42843/54ee2cce-8920-40fe-4953-a17d7d5ffae0.jpeg)

<sub>ちなみにこのDockerイメージ、Windows上から http://[boot2dockerのIP]:6080/vnc.html でデスクトップ画面も見えます。というかそっちがこのイメージの本筋です</sub>

* 2個目：https://registry.hub.docker.com/u/fgrehm/netbeans/

もうURLの時点でバレバレですね。そうですアレです。これは実は「[Dockerを用いたGUIアプリケーションの実行](http://postd.cc/running-gui-apps-with-docker/)」のDockerイメージですが、ホストがLinuxでないと記事通りに行かないので少々手を加えます。

手順：
1. まずコンテナを `docker run -it -p 2323:22 fgrehm/netbeans:v8.0.1 bash` で起動。
2. そもそもsshが入っていないので `sudo sh -c "apt-get update && apt-get -y install ssh && service ssh restart"`
3. ssh接続ユーザとして"developer"が使えるのですがパスワードが無い為 `sudo passwd developer` で適当なパスワードを入れます。
4. 接続準備が出来たので上記と同じくMovaXtermでboot2dockerのIPに、今度はポート2323にユーザ"developer"で接続します。
5. `/usr/local/bin/netbeans` でNetBeansが起動します！
![NetBeans_mini.jpg](https://qiita-image-store.s3.amazonaws.com/0/42843/cea7e9d0-8f37-4721-5bf6-7ef8a0f205dc.jpeg)
ActiveRecordを単体で使ってみる


# 環境

* ruby
	* 2.2.2p95
* activerecord
	* 4.2.3

# gemインストール

## ActiveRecordをインストールする

```
$ gem install activerecord
```

## MySQLに接続するためのgemをインストールする

```
$ gem install mysql2
```


# 早速使ってみる

## database.ymlを準備する
DB接続設定の切り替えを簡単にできるように別ファイルに書き出す．

```YAML:database.yml
db:
	production:
		adapter:	mysql2
		host:		localhost
		username:	<username>
		password:	<password>
		database:	<database>
	development:
		adapter:	mysql2
		host:		localhost
		username:	<username>
		password:	<password>
		database:	<database>

```

## テーブルにアクセスするためのクラスを作る
``self.table_name``に格納したテーブルにアクセスするためのクラス．
他のテーブルにもアクセスしたい場合は，それぞれに対応したクラスを作成する．

```ruby:User.rb
require 'active_record'
require 'json'

# database.ymlを読み込んで，セットする．
conf = YAML.load_file('./database.yml')
ActiveRecord::Base.establish_connection(conf['db']['development'])


class User < ActiveRecord::Base
	self.table_name = <table name>
end
```

## active_recordを使って，Userクラスに対応するテーブルにアクセスしてみる．

```ruby:main.rb
require File.dirname(__FILE__) + '/User'

User.all
```
PadrinoでHTML Imports用のヘルパーを設定する

HTML Imports用のヘルパー
----------------------

Padrinoで、HTML ImportsでHTMLファイルを読み込む時用にヘルパーを定義すると、こんな感じになると思います。

```ruby:asset_tag_helper.rb
My::App.helpers do
  def html_import_tag(*sources)
    options = {
      rel: 'import'
    }.update(sources.extract_options!.symbolize_keys)
    sources.flatten.inject(ActiveSupport::SafeBuffer.new) do |all, source|
      all << tag(:link, {href: asset_path(:html, source)}.update(options))
    end
  end
end

```

で、ビューの方でこういうふうにして`link`タグを生成します。

```erb:application.html.erb
<%= html_import_tag 'elements' %>
```

これだと

```html
<link href="/html/elements" rel="import" />
```

という風に出力されてしまって、二点、意図に反することがあります。

* パスの最初の部分が`html`になっている。`elements`にしたい（ここではそういうことにしてください）
* 拡張子がない

アセットフォルダーを設定する
------------------------

Padrinoではアセット用のフォルダーとして、デフォルトでは

* CSSファイル -> "stylesheets"
* JavaScriptファイル -> "javascripts"

が定義されていて、`stylesheet_link_tag`とかで`link`タグを出力する場合はこのフォルダー名が使われます。そしてこれ以外のアセット（画像とか）は、（内部実装の話になりますが）`asset_path`に渡す第一引数がそのまま使われます。例えば画像のパスを出力する`image_path`メソッドは

```ruby
def image_path(src)
  asset_path(:images, src)
end
```

という実装になっているため、第一引数（`:images`）が使われて「images」というフォルダー名になります。HTML用ヘルパーでは`asset_path(:html, ...)`としているので、フォルダー名が「html」となってしまうわけです。

これをカスタマイズするにはconfig/apps.rbなどで設定します。

```ruby:config/apps.rb
Padrino.configure_apps do
  # ...
  set :html_asset_folder, 'elements'
  # ...
end
```

`:html_asset_folder`の最初の「html」の部分を認識して、`asset_path`の第一引数と対応付けてくれます。これで、

```erb
<%= html_import_tag 'elements' %>
```

の出力が

```html
<link href="/elements/elements" rel="import" />
```

となり、フォルダー名の部分は解決できます。

拡張子を設定する
--------------

次に拡張子として「.html」を設定します。

現状、`Padrino::Helpers::AssetTagHelpers::APPEND_ASSET_EXTENSIONS`という定数を弄るしか無いように見えます。これは配列になっていて、ここに入っているタイプは拡張子が付与され、それ以外は拡張子無しのURIになります。デフォルトでは`css`と`js`が入っているので、`asset_path(:css, ...)`とやると拡張子「.css」が付与されるわけです。

というわけなので、どこか適当な所で

```ruby
Padrino::Helpers::AssetTagHelpers::APPEND_ASSET_EXTENSIONS << 'html'
```

とすることで、HTMLファイルにも自動的に拡張子を付けることができます。

```erb
<%= html_import_tag 'elements' %>
```

　　　　↓

```html
<link href="/elements/elements.html" rel="import" />
```

めでたしめでたし。
three.jsで線が伸びるアニメーション

three.jsで線が伸びてくアニメーションをつくるときに少しクセがあったのでメモ。

まずは通常の"伸びない"線の描き方。

```
var scene, line;

function drawNormalLine(){
	var geometry = new THREE.Geometry();
	geometry.vertices.push(new THREE.Vector3(-100,0,0));
	geometry.vertices.push(new THREE.Vector3(100,0,0));
	var material = new THREE.LineBasicMaterial({color: 0x00FFFF, linewidth: 2});
	line = new THREE.Line(geometry, material);
	scene.add(line);
}
```

これで、

```
line.geometry.vertices.push(new THREE.Vector3(200,0,0));
line.geometry.verticesNeedUpdate = true;
```
とか、やっていけば線が伸びるんだろうと思ったら伸びない。

解決するにあたり参考になったのは、このポスト↓
http://stackoverflow.com/questions/31399856/drawing-a-line-with-three-js-dynamically/31411794#31411794


ポイントは、
`var geometry = new THREE.Geometry();`
ではなく、
`var geometry = new THREE.BufferGeometry();`
を使うこと。

基本的に、geometryの頂点数（verticesの数）を動的に増やしていくことはできないんだそう。
なので、最初にある程度、頂点を配列にどばっと入れておいて、その内いくつ目までの頂点を使うかを指定する。

```
function drawDynamicLine(){
	//---最大頂点数をあらかじめ指定する必要がある。ここでは30
	var maxpoints = 30;

	//---BufferGeometryを使うのがポイント
	var geometry = new THREE.BufferGeometry();

	//---頂点の場所を格納していくarrayを用意。各頂点（x,y,z）の３つの数字があるので3倍する
	var positions = new Float32Array(maxpoints * 3);
	geometry.addAttribute('position', new THREE.BufferAttribute(positions, 3));

	//---配列に頂点の座標をいれてく。ひとまずmaxpointsで設定した頂点数の内、2頂点分
	var array = geometry.attributes.position.array;
	array[0] = -100;	//x1
	array[1] = 0; 		//y1
	array[2] = 0;		//z1
	array[3] = 100;		//x2
	array[4] = 0;		//y2
	array[5] = 0;		//z2

	//---BufferGeometryクラスの.addGroup　引数は( start, count, indexOffset )
	//---とりあえず用意した頂点のうち0番から2番まで結ぶ
	geometry.addGroup(0, 2, 0);

    //---あとは、通常と同じ
	var material = new THREE.LineBasicMaterial({ color: 0x990000, linewidth : 5});
	line = new THREE.Line(geometry, material);

    scene.add(line);
}

```
で、"伸ばせる"線の最初の部分が描ける。


用意した頂点（maxpointsで指定した数）のいくつ目までを使って線を描くかを決めるのは↓の数。


`line.geometry.drawcalls[0].count`


アップデート: .geometry.drawcallsが廃止された。
用意した頂点（maxpointsで指定した数）のいくつ目までを使って線を描くは、
`line.geometry.setDrawRange( start, count );`
で更新する。
なので、これ以降、

```
index = 3; //---新たに加える頂点のindex (ここでは、最大30)
var array = geometry.attributes.position.array;
array[index*3]   = newX; //---新たに加える頂点のx座標
array[index*3+1] = newY; //---新たに加える頂点のy座標
array[index*3+2] = newZ; //---新たに加える頂点のz座標
```
とかで、頂点座標を配列に加えてから、

`line.geometry.setDrawRange(0, 3);`

ってやると、0番目から3番目の頂点までを含む線が描ける。

なので、線が伸びるアニメーションをつくりたいときは、最初にスタート地点からゴール地点までの頂点を全部登録しておいて、
drawcalls[0].countの数を
 .setDrawRange(0, 3)の数を、animation関数の中で増やしていけば、伸びていくはず。
http://jsfiddle.net/yuyuyuyoyoyo/0zurstzw/9/
Elixir のリスト内包表記でクイックソート

Elixir にはリスト内包表記という記法があり、これを使うとリストに対して

- 任意の条件でフィルタリング
- 別の値へのマッピング

というよくある操作を簡潔に記述できる。

- http://elixir-ja.sena-net.works/getting_started/18.html

## 例

```ex
iex> for n <- 1..10, rem(n, 2) == 0, do: n * n
[4, 16, 36, 64, 100]
```

これは 1 〜 10 の値のうち偶数の値の自乗を求めている。このように Elixir ではリスト内包表記は `for` で始まる式になるようだ。

このとき

- `n <- [1 .. 10]` が生成器 (generator) : 入力になるリストの指定
- `rem(n, 2) == 0` がフィルタ : リストに対してこの条件でフィルタリングする
- `n * n` が構築子 (constructor) : 結果に対して作用して出力を作る

というルールになっている。

生成器でリストを作って、場合に応じてフィルタし、構築子で戻り値を組み立てる。

## クイックソート

プログラミング Erlang に載っている Quick Sort をリスト内包表記で書く例、これを Elixir で書くと以下のようになる。

```ex
defmodule QuickSort do
  def qsort([pivot|t]) do
    qsort(for x <- t, x < pivot, do: x)
    ++ [pivot] ++
    qsort(for x <- t, x >= pivot, do: x)
  end

  def qsort([]), do: []
end

IO.inspect QuickSort.qsort([23, 6, 2, 9 , 27, 400, 78, 45, 61, 82, 14])
```

実行結果は

```
$ elixir quick_sort.ex
[2, 6, 9, 14, 23, 27, 45, 61, 78, 82, 400]
```

となった。ただしく動いている。

仮引数のパターンマッチで pivot を取り出すことができるし、リスト内包表記でフィルタが簡単に書けて簡潔に記述できる。

まあ、この場合構築子は使ってないので `for x <- t, x < pivot, do: x` は

```
Enum.filter(t, fn(x) -> x < pivot end)
```

でも構わないのだが。

## ピタゴラス数

よりリスト内包表記をそれっぽく使った例は、同じく書籍からピタゴラス数を求める例。A<sup>2</sup> + B<sup>2</sup> = C<sup>2</sup> を満たす A, B, C の組を求める。

これを Elixir で書くと

```ex
defmodule Pythag do
  def pythag(n) do
    for a <- 1..n, 
        b <- 1..n, 
        c <- 1..n, 
        a + b + c <= n, a*a + b*b === c*c, do: {a, b, c}
  end
end

IO.inspect Pythag.pythag(16)
IO.inspect Pythag.pythag(30)
```

と書けて結果は

```
$ elixir pythag.ex
[{3, 4, 5}, {4, 3, 5}]
[{3, 4, 5}, {4, 3, 5}, {5, 12, 13}, {6, 8, 10}, {8, 6, 10}, {12, 5, 13}]
```

となる。生成器やフィルタに複数の式が書けることで簡潔に記述できる。

こんなところに書いてないで Web+DB の原稿書けや、という声が聞こえる･･･
bashの";", "&&", "||" に関する補足ネタ。コマンドグルーピングとの併用例

[複数のターミナルコマンドを順番に実行する時につける「&&」と「;」と「||」の違い - Macの手書き説明書](http://veadardiary.blog29.fc2.com/blog-entry-5785.html)

>  「;」は他のコマンドの実行結果に依存せず順番に実行される

のですが、具体的にどういう場面で`;`を使うかというと、__`{}`（ もしくは`()` ）を使ったグルーピングと併用するケース__ が経験上多いような気がします。

## `{CMD1; CMD2; CMDn; }`
例えばこんなケースです。

```bash
$ { echo "hoge"; echo "huga"; } > x.log
```

このコマンドを実行すると、`x.log`には

```
hoge
huga
```

と __それぞれのコマンドの実行結果が__ リダイレクト出力されます。

これを単に

```bash
$ echo "hoge"; echo "huga" > x.log
```

とすると、`hoge`は標準出力に出力されて`huga`だけがx.logに出力されます。

## `(CMD1; CMD2; CMDn)`
`()`でも同様にグルーピングが可能ですが、`{}`との違いは

* 最後のコマンドの後ろには`;`（とスペース）は不要です
* `()` は __サブシェルで（別プロセスで）__ 動きます

どういった挙動の差異が生まれるかは↓の例が分かりやすいと思います。

```bash
$ pwd
dirParent

$ mkdir dirX
$ touch dirX/fileX

# {} の場合
$ {cd dirX; ls; } > hoge.log
$ pwd
dirParent/dirX  # dirXにcdしている
$ cat ../hoge.log
fileX

# () の場合
$ (cd dirX; ls) > huga.log
$ pwd
dirParent # dirXにcdしない（サブシェル内ではcdしてるけど完了後に元のシェルに戻る）
$ cat huga.log
fileX
```


## 三項演算子
引用元記事では`&&`や`||`についても言及がありましたが、これと`;`を使ったグルーピングを併用すると、

```bash
[[ CONDITION ]] && { CMD1; CMDn; } || { CMDe1; CMDen; }
```

↑三項演算子はこう書けます。
CONDIONが真の場合は`&&`後のコマンド群が、偽の場合は`||`後のコマンド群が実行されます。
シェルスクリプトなんかで条件判定が偽の場合に`exit`したい、ってケースなんかは

```bash
[[ CONDITION ]] && { CMD1; CMDn; } || { CMDe1; CMDen; exit; }
```

こう書くと良いでしょう。

ちなみにこれもサブシェル`()`によるグルーピングで書けますが、 __上記の`exit`したいケースで`()`を使った場合、「サブシェルを`exit`する」事になるので、元のスクリプト自体は`exit`せず処理が継続します__ 。ってのが注意点。


~~なおbashなので可読性云々についてはry~~
Emberの1.13へのバージョンアップでViewがdeprecatedになった件（select）

# Ember.SelectView使えなくなっちゃったよ?

Emberの1.13でEmber.Viewがdeprecatedになっていますが、
一番困るのはやはり`Ember.SelectView`が使えなくなることではないでしょうか。

公式の[ガイド](http://emberjs.com/deprecations/v1.x/#toc_ember-select)には、次の3つのアップグレードパスが提示されています。

* componentを作る
* templateに直接selectタグを書く
* add-onのx-selectを使う

アドオンでもうすでにあるやつを使ったほうが楽だし魅力的なだなーと思ったけど、[GitHub](https://github.com/thefrontside/emberx-select)を見に行ったら`{{x-select}}`と`{{x-option}}`ってなってて、直接タグ書くこととの違いが見つけにくく、あと、将来Ember2.0になったら、いつか本体に載るかもね、という感じで書いてあって、だったらそん時にちゃんと対応したほうがよいのではと思い、大した量じゃないし、直接タグを書く方針で対応しました。

# 結局Component書く

と思って、コツコツ対応していましたが、似たようなコードを何度も書く羽目になって、やっぱりComponentを作ってしまいました。(ソースコードは[こちら](https://github.com/t-mimura/sample-ember-1.13-select)。)

[公式のお手本](http://emberjs.jsbin.com/fotuqa)を参考にしていますが、いままでの`Ember.SelectView`に似せる形で`value`を直接指定できるのと、`content`がオブジェクトの配列じゃなくて`value(数値とか文字列とか)`の配列でも動くようにしています。

これでselectのところ以外の実装は変えずにアップグレードできるはず。

とここまで書いておいてアドオンのほうをよくよく見たら、`Ember.SelectView`と互換性があるBlockless Formでも書けるらしい。([ここ](https://github.com/thefrontside/emberx-select#blockless-form))

# ということで、まとめ。

Emberの今後の方向性として、Reactっぽく、入れ子のComponentでViewを作る（将来的にはRouteの受け皿として直接Componentが使えるようになる？）感じでComponent重視です。
ですので、

* ViewのSelectをあまり多用していない
    * 自分たちのプロジェクトの使い方にjustなComponentを作って将来に備えたほうがよさげ
* たくさん使っている
    * 一先ずアドオンを導入してEmberのバージョンアップをやり過ごしつつ、
    * アドオンはまさにEmberのComponent重視の戦略に乗っかっていて、`x-select`と`x-option`に分かれているので、徐々にそちらに移行するというのがよさそうかなと思います。
Angular-fullstackでEaselJSを使って画像を表示するまでの道のり


## 前置き

最近、MEANスタック開発でちょこちょこ開発しているのですが、Canvasに画像を表示させようと思いEaselJSを使って表示させてみようとやってみました。

## やること

まずは```bower install```をつかってEaselJSをインストールしましょ。

````Bash
$ bower install EaselJS
````

bower_componentsに新しくディレクトリが生成されたことが確認されたら、
次はindex.htmlに追記してEaselJSを読み込むようにしましょ。

````index.html
	# 〜省略〜
    <!--[if lt IE 9]>
    <script src="bower_components/es5-shim/es5-shim.js"></script>
    <script src="bower_components/json3/lib/json3.min.js"></script>
    <![endif]-->
    <!-- build:js({client,node_modules}) app/vendor.js -->
      <!-- bower:js -->
      <script src="bower_components/jquery/dist/jquery.js"></script>
      <script src="bower_components/angular/angular.js"></script>
      <script src="bower_components/angular-resource/angular-resource.js"></script>
      <script src="bower_components/angular-cookies/angular-cookies.js"></script>
      <script src="bower_components/angular-sanitize/angular-sanitize.js"></script>
      <script src="bower_components/angular-bootstrap/ui-bootstrap-tpls.js"></script>
      <script src="bower_components/lodash/dist/lodash.compat.js"></script>
      <script src="bower_components/angular-ui-router/release/angular-ui-router.js"></script>
      
      # 以下１行追加
      <script src="bower_components/EaselJS/lib/easeljs-0.8.1.min.js"></script>
      <!-- endbower -->
    <!-- endbuild -->
    # 〜省略〜
````

次はmain.htmlでcanvasを表示するように追記します。

````main.html
	# 〜中略〜
	<div class="row">
	  
	  # 以下１行追加
	  <canvas id="test-canvas" width="300" height="300" ng-init="init()"></canvas>
	</div>
	# 〜中略〜
````

次にmain.controller.jsでcanvasに画像を注ぎ込みます。

````main.controller.js
'use strict';

angular.module('testApp')
  .controller('MainCtrl', function ($scope, $http) {

    $scope.init = function () {    
      var stage = new createjs.Stage("test-canvas");
      var img = new createjs.Bitmap("assets/images/hoge.png");
      
      // 画像読み込みが完了すればcanvasを更新する
      img.image.onload = function() {
       stage.update(); 
      };
      
      // 画像をcanvasに読み込ませる
      stage.addChild(img);
    }   
  });
````

これでMainCtrlに設定されているルートにアクセスすればCanvasに画像が表示されているはずです。

間違っているところ等あればお手数ですがコメント欄にてお教え下さい。
Crystal - Array - Instance Method - first #crystal

## <i class="fa fa-diamond" style="font-size:1em;"></i> 概要
CrystalのArrayクラスのインスタンスメソッド`first`について

## <i class="fa fa-check-circle" style="font-size:1em;"></i> シグネチャ
`first`
`first(&block)`

`first`については、Rubyと同じですが、
`first(&block)`はRubyには無い機能。
要素数が0の場合にブロック内の処理を呼び出します。

## <i class="fa fa-flask" style="font-size:1em;"></i> サンプル
### <i class="fa fa-code" style="font-size:1em;"></i> プログラム
~~~ruby
list = (1..20).to_a
pp list.first                                    # => list.first = 1
list = (1..20).to_a
list.first {puts "not empty case, size == 0"}    #=> "not empty case, size == 0" は出力されない
empty_list = Array(String).new
empty_list.first {puts "empty case, size == 0"}  # => "empty case, size == 0" が出力される
~~~

### <i class="fa fa-file-text" style="font-size:1em;"></i> 出力
~~~ruby
list.first = 1
empty case, size == 0
~~~

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* <i class="fa fa-external-link" style="font-size:1em;"></i> [Array - Crystal API Library](http://crystal-lang.org/api/index.html#http%3A//crystal-lang.org/api/Array.html)
JavaとJavascript それぞれにおける配列の長さ

##Javaにおける配列の長さ

```java:Test01.java

public class Test01 {

 public static void main(String[] args) {

     String[] list=new String[3];

     list[0]="Emma";
     list[1]="Olivia";
     list[2]="Emily";

     for (int i = 0; i < list.length; i+=1) {
       System.out.println ("list[" + i + "]=" +  list[i]);
     }
     
     System.out.println ("配列の長さ:" + list.length);
     
 }

}

```

###コンパイルと実行結果

```

c:\2015>javac Test01.java

c:\2015>java Test01
list[0]=Emma
list[1]=Olivia
list[2]=Emily
配列の長さ:3

```

##Javascriptにおける配列の長さ

```js

var list=[];
list[0]="Emma";
list[1]="Olivia";
list[2]="Emily";

for (var i = 0; i < list.length; i+=1) {
  console.log("list[" + i + "]=" +  list[i]);
}

console.log("配列の長さ:" + list.length);

/*

実行結果
"list[0]=Emma"
"list[1]=Olivia"
"list[2]=Emily"
"配列の長さ:3"

*/

```


###★__注意:配列の長さは配列に存在するプロパティの数と一致するとは限らない__

Javascriptの配列は先頭の値から順に「0」、「1」・・・と連続した数値のプロパティ名を持つ。

__配列のサイズが大きくなる__

_現在のlength値と同じか、それよりも大きい値を添え字とした要素にデータを格納すると、lengthプロパティは新しい要素を含むサイズにまで自動的に大きくなる。配列の境界エラーが発生することはない。
現在のlengthプロパティは新しい要素を含むサイズにまで自動的に大きくなる。
lengthプロパティは配列の、最も大きな整数値を持つプロパティのプロパティ名に1を加えた値になる。それは、必ずしも配列に存在するプロパティの数と一致するとは限らない。(Douglas Crockford 著 水野貴明 訳『JavaScript:The Good Parts』(オライリー・ジャパン発行、2008) p68)_

「最も大きな整数値を持つプロパティ」は最も大きいインデックスを持つ要素のことを言ってるのだろう。

下記コードにおいて、配列listはプロパティの数は4つであるが、配列listに存在するプロパティにおいて、最も大きい数値のプロパティ名は7でありlist.lengthの値は8になる。

```js

var list=[];
list[0]="Emma";
list[1]="Olivia";
list[2]="Emily";

list[7]="Charlotte";

for (var i = 0; i < list.length; i+=1) {
  console.log("list[" + i + "]=" +  list[i]);
}

console.log("配列の長さ:" + list.length);

/*

実行結果
"list[0]=Emma"
"list[1]=Olivia"
"list[2]=Emily"
"list[3]=undefined"
"list[4]=undefined"
"list[5]=undefined"
"list[6]=undefined"
"list[7]=Charlotte"
"配列の長さ:8"

*/

```

__プロパティがなく配列のサイズが0でない例__

配列要素の数をあらかじめ決めておくことができる。この時、プロパティがないが配列のサイズが0になならない。

```js

var list=new Array(5);
console.log("配列の長さ:" + list.length);

/*

実行結果
配列の長さ:5

*/

```

###

##環境
ベアボーン:Shuttle XS35GS V3
OS:win7(32bit)
JAVA SE8(jdk-8u45-windows-i586)

##解説
プログラミング言語の勉強してると、「JavaとJavascriptってどう違うか？」って考えたり、人に聞かれたりすることがある。私はプログラミング言語を全く知らない人には「プログラミング言語を食べ物に例えると、JavaとJavascriptはメロンとメロンパンくらい違います。つまり、両方ともプログラミング言語ですが、果物とパンくらい違います」って言いますが、「プログラマーとして技術的にどう違うかを詳細に説明しろ」って言われてたら説明できません。違いを理解をするため、いろんな観点でJavaとJavascriptを比較していこうと思います。

今回はJavaとJavascriptでの配列の長さを比較します。

JavaとJavascriptの両方で配列の長さはlengthを使えば分かる。Javaの配列はオブジェクトなのでフィールドを保持している。Javaは「length」フィールドを使う。Javascriptの配列は実際にはオブジェクトであるがArray.prototypeを継承しており「legnth」プロパティが使える。Javascriptで配列の長さは配列に存在するプロパティの数と一致するとは限らないことに注意する。

###まとめ

JavaとJavascriptの両方で配列の長さはlengthを使う。
Javascriptで配列の長さは配列に存在するプロパティの数と一致するとは限らないことに注意する。

###


##参考文献
Douglas Crockford 著 水野貴明 訳『JavaScript:The Good Parts』(オライリー・ジャパン発行、2008) p68

##関連
[JavaとJavascriptと円周率 - Qiita][1]
[1]:http://qiita.com/kyoshiro-obj/items/a5bea7174f6e90983cc3
MySQLのCLIでプロンプトを変更したりクエリ結果に色をつけ見やすくする方法


MySQLのCLIは何もしていなければプロンプトが`mysql>`となっているだけだったり、クエリ結果が真っ白な状態で出てくる。これをホームディレクトリの`.my.cnf`で設定を加え色々と見やすくする。


## プロンプトの変更
`mysql>`だけの状態になっているのを、`ryosukes@localhost [test_db] 12:00 am>`のように表示できるようにした。

これは`prompt`コマンドを実行することで変更できるが、毎回変更するのは面倒なので、`.my.cnf`で設定する。バックスラッシュが2回続いているのはエスケープシーケンスと被るのを回避するため。

```..my.cnf
[mysql]
prompt='\\U [\\d] \\r:\\m \\P>\\_'
```

他にも以下のようなシーケンスで表示が設定できる。

```
\c ・・・コマンド何回実行したかを数えるカウンタ。
\D ・・・日時
\d ・・・利用中のデフォルトデータベース
\h ・・・接続先ホスト（サーバ）
\l ・・・デリミタ（区切り文字、デフォルトはセミコロン）
\m ・・・分
\n ・・・改行
\O ・・・月
\o ・・・月（数字）
\P ・・・am/pm
\p ・・・TCP/IPポート番号、またはソケットファイル名
\R ・・・時（24時間制）
\r ・・・時（12時間制）
\S ・・・セミコロン
\s ・・・秒
\t ・・・タブ
\U ・・・ユーザ名（ホスト名含む）
\u ・・・ユーザ名
\v ・・・MySQLサーバのバージョン
\w ・・・曜日
\Y ・・・年（4桁）
\y ・・・年（2桁）
\_ ・・・空白
\  ・・・空白（スラッシュの後に空白文字）
\' ・・・シングルクォーテーションマーク
\" ・・・ダブルクォーテーションマーク
\\ ・・・バックスラッシュ
```


参考
[漢のコンピュータ道 - MySQLのプロンプトを変更する。](http://nippondanji.blogspot.jp/2009/03/mysql.html)

## 結果に色をつける
SELECTでクエリ結果を表示したときなど、真っ白な文字が続いていると、表示データが多い場合見づらかったりする。そこで以下の画像のようにしようと思った。
![色付きのクエリ結果1](https://camo.githubusercontent.com/61ecaf79924867808309454a406cbe9c52d5985f/68747470733a2f2f7261772e6769746875622e636f6d2f6e6974736f2f636f6c6f75722d6d7973716c2d636f6e736f6c652f6d61737465722f53637265656e5f7461626c652e706e67)

![色付きのクエリ結果2](https://camo.githubusercontent.com/f88547ebbbebea7e45d235744e6f54fa14bb7f3b/68747470733a2f2f7261772e6769746875622e636f6d2f6e6974736f2f636f6c6f75722d6d7973716c2d636f6e736f6c652f6d61737465722f53637265656e5f472e706e67)
(画像は[nitso/colour-mysql-console](https://github.com/nitso/colour-mysql-console)から引用)

自分の場合`pager`で色をつけるのと、[nitso/colour-mysql-console](https://github.com/nitso/colour-mysql-console)でも書いてあるように`less`で見れるようにした。以下行ったこと。

### grcをインストール
```
$ brew install grc
```

### 設定ファイル
インストールが完了したら、`.my.cnf`にその設定を加え、色をつけるための`.grcat`という設定ファイルをホームディレクトリに作成した。

```..my.cnf
[mysql]
pager = grcat ~/.grcat | less -iMSx4 -FX -R
```

```..grcat
#row delimeter when using \G key
regexp=[*]+.+[*]+
count=stop
colours=white
-
#table borders
regexp=[+\-]+[+\-]|[|]
colours=cyan
-
#default word color
regexp=[\w]+
colours=green
-
#data in ( ) and ' '
regexp=\([\w\d,']+\)
colours=white
-
#numeric
regexp=\s[\d\.]+\s
colours=yellow
-
#column names when using \G key
regexp=\w+:
colours=white
-
#date
regexp=\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}
colours=yellow
-
#IP
regexp=(\d{1,3}\.){3}\d{1,3}(:\d{1,5})?
colours=yellow
-
#schema
regexp=`\w+`
colours=magenta
-
#email
regexp=[\w\.\-_]+@[\w\.\-_]+
colours=magenta
```

`regexp`でパターンを指定し、`colours`で色の設定が行える。`#ffffff`のようにカラーコードを指定して、細かく設定できるかと思ったらできなかった。他にどのような色が使えるかは後日時間ができたら調べなおそうと思う。

参考
[grcでMySQLのクエリ結果に色を付ける](http://hivecolor.com/id/182)
[mysqlコンソールをpagerで便利に](http://qiita.com/nao58/items/f651d9f2d0f420f87a50)
[GitHub - nitso/colour-mysql-console](https://github.com/nitso/colour-mysql-console)
[GitHub - wwjamieson3/grc-mysql](https://github.com/wwjamieson3/grc-mysql/blob/master/.grcat)

## 最終的な.my.cnfの設定

```..my.cnf
[mysql]
pager = grcat ~/.grcat | less -iMSx4 -FX -R
prompt='\\U [\\d] \\r:\\m \\P>\\_'
```

これでだいぶ便利になった。
GIF動画をFFmpegとImageMagickで作る

# 環境

- Mac OS X Yosemite
- homebrew

# インストール

```
brew install ffmpeg
brew install imagemagick
```

# 作成手順

## 1. 元動画から連続した PNG 画像を作成する

作成時に出力時間のトリミングと動画のクリッピング、リサイズを同時に行います。

```
mkdir temp
ffmpeg -ss 100 -i input.m4v -t 2.5 -an -r 10 -vf crop=720:720:0:340 -s 360x360 temp/%05d.png
```

| オプション | 意味 |
|---------|-----|
| `-ss 100` |開始地点を動画の100秒の位置とする。`-i` より前に指定した方が良いらしい。|
| `-i input.m4v` |入力ファイルを `input.m4v` に指定する。フォーマットは自動判別。|
| `-t 2.5` |2.5 秒の動画を出力する。`-ss 100` と合わせると動画の100秒〜102.5秒の期間を切り出すことになる。|
| `-an` |音声を出力しない|
| `-vf crop=720:720:0:340` |動画をクリッピングする。数字の意味はググった方が分かりやすいので割愛。|
| `-s 360x360` |動画サイズを 360x360 にリサイズする。上記 crop で 720x720 にしているので丁度半分になる。|
| `temp/%05d.png` |`temp/00000.png` のように 5 桁の連番でファイルを出力する。出力ファイルフォーマットは拡張子で自動判別。ちなみにこれを `output.gif` とすると直接 GIF 動画に出力できるが画質がかなり悪い。|

## 2. ImageMagick で GIF 動画に変換する

```
convert temp/*.png output.gif
```

簡単なコマンドなので意味は割愛します。これで GIF 動画 `output.gif` が出来上がります。

# ハマりどころ

FFmpeg でリサイズ・クリッピングせずに ImageMagick のコマンドで以下のようにクリッピング・リサイズを行った後に上記 2. と同じやり方で GIF 動画を作成したところ、元のファイルサイズ (360x360) が無視されて縦長 (360x720) の GIF 動画が出来ました。アスペクト比は保持されていましたが余白は黒で塗られていました。何故だろう…。

なお、元動画は iPhone 5S で撮影した 1080x1920 の縦長動画でした。

```
mogrify -crop 720x720+0+340 -resize 50% temp/*.png
```
みまもりケータイとGoogle Maps

Sotfbankのみまもりケータイを子供に持たせています。
子供が携帯を操作するとGPSと連動して地図サービスのURLがSMSで送られてきます。このサービス自体は便利なんですが、URL先の地図サービスが正直使いにくいです。

そこで、Google Mapsを利用する方法を考えました。紹介します。
# 準備
iPhoneで操作します。

1. MyScripts LEとGoogle MapsをiPhoneにインストールします。
> <a href="https://geo.itunes.apple.com/us/app/myscripts-le/id556253271?mt=8">MyScripts LE - Takeyoshi Nakayama</a>
> <a href="https://geo.itunes.apple.com/jp/app/google-maps/id585027354?mt=8">Google Maps - Google, Inc.</a>

2. 以下のリンクをクリックしてスクリプトを登録します。
> [みまもり](http://tinyurl.com/o4phofk)

# 利用方法
* みまもりケータイから送られてくるSMSのURLをコピーします。

> [位置情報通知]みまもりケータイ
> 電話発信操作がありました。
> 
> 現在地
> http://mobile.its-mo.com/MapToLink/p2?pos=N35.21.46.29E138.43.51.17&geo=wgs84&x-acr=3

* MyScriptsを起動して"みまもり"をクリックします。

![IMG_3994.PNG](https://qiita-image-store.s3.amazonaws.com/0/86788/a8c1880c-207d-ef33-9f08-88db987e30f3.png)

* Google Mapsが起動します。

![IMG_3995.PNG](https://qiita-image-store.s3.amazonaws.com/0/86788/cbca8828-ba71-1eac-a4ee-2af624140d9f.png)



# 実装
実装は以下です。

```lang:もまもり
var u = CLIPBOARD;
var m = u.match(".*pos=N([0-9]+)\.([0-9]+)\.([0-9]+\.[0-9]+)E([0-9]+)\.([0-9]+)\.([0-9]+\.[0-9]+)\&geo.*");
n=parseInt(m[1])+parseInt(m[2])/60+parseFloat(m[3])/3600;
e=parseInt(m[4])+parseInt(m[5])/60+parseFloat(m[6])/3600;
TARGET="openurl";
"comgooglemaps://?q="+n+","+e;
```

* URLから正規表現で経度緯度の情報を抽出し、60進法(度分秒)から10進法に変換します。

> 経度：35.21.46.29(度分秒) ⇒ 35.36285833
> 緯度：138.43.51.17(度分秒) ⇒ 138.73088055

* URL SchemeでGoogle Mapsを起動します。(URL Schemeの詳細は以下)

> https://developers.google.com/maps/documentation/ios/urlscheme
Rails 4.1から入った `enum` をi18n対応してみた。


例えば、

```rb:app/models/user.rb
class User < ActiveRecord::Base
  enum sex: { male: 0, female: 1 }
end
```

となっていて、フォームで`select` をi18n対応させたい。


```YAML:config/locales/ja.yml
ja:
  activerecord:
    attributes:
      user:
        sex: 性別
          male: 男性
          female: 女性
```

と書きたいけど、YAMLの構文として誤りなので、これは出来ない。

よく考えてみると、これはattributesでは無いよなぁ、ということで、違う項目に出してみる。

```YAML:config/locales/ja.yml
ja:
  activerecord:
    attributes:
      user:
        sex: 性別
    enum: # <= HERE!
      user:
        sex:
          male: 男性
          female: 女性
```

これなら、ハッシュで値ごとに表記名が出せる。

使い方としては、

```erb:app/views/users/_form.html.erb
<%= form_for(@user) do |f| %>
  <%= f.label :sex %>
  <%= f.select :sex, User.sexes.to_a.map { |s| [t("activerecord.enum.sex.#{s[0]}"), s[1]] } %>
<% end %>
```

みたいにすると、"男性”、"女性" が選択できる`select` タグが生成できる。

でも、毎回、`I18n.t` を呼ばないといけないのは辛い。
【Ruby】超簡単！h1とmeta titleとmeta descriptionをNokogiriでぶっこ抜くだけ！


最近SEOってる私です。
手始めに、htmlの改善をやろうとしていますが、取ってくるのが面倒でした。

先輩のアドバイスなどを元に、Nokogiriでぶっこ抜く簡単なrubyスクリプトを作りました。

```
#
# h1　title descriptionを抜き出すファイル。
# nokogiriをinstallして有れば使えるはず。
# ex) ruby get_meta.rb http://google.com
#

require 'open-uri'
require 'nokogiri'

ARGV.each do |uri|
  html = open(uri).read
  doc = Nokogiri::HTML.parse(html)

  print doc.title + "\t"
  print doc.xpath('/html/head/meta[@name="description"]/@content').to_s + "\t"
  doc.css("h1").each do |h1|
    print h1.text
  end
  print "\n"
end
```

引数にどんどんURLを書き足せばいくらでもぶっこ抜けます（＾ω＾）

ちょっと作り変えて配列にするとか、外部ファイル読み込むとかそのへんは自由に作って下さい☆

### 参考
[nokogiriを使ったスクレイピング入門 @gaaamiiのブログ](http://shgam.hatenadiary.jp/entry/2013/11/09/192509)
XML、DOMにおけるノードと要素（エレメント）の違い

XML、DOMにおけるノードと要素（エレメント）の違い

* ノードの方が広い概念
* ノードには要素ノード、コメントノード、CDATASectionノードなど多数の種類がある
* 要素とは開始タグから終了タグまでのこと
* 要素はノードでもある

以下の例でいうと

```html
<foo> This is Text </foo>
```

* これはfoo要素（開始タグ・終了タグがあるから）。
* 「This is Text」はテキストノードであり、foo要素（fooノード）の子である。

## 参考
http://stackoverflow.com/questions/132564/whats-the-difference-between-an-element-and-a-node-in-xml
Embulk の Timestamp クラスまわりのメモ (Java)

Java な embulk プラグインを作るにあたって、Timestamp オブジェクトの作り方とか、format の仕方とか parse の仕方とか。

JRuby の機能を使ったりしていて、けっこうややこしい(それ自体は %Y-%m-%d のような Ruby ライクな時間フォーマットを使えるようにするためなので仕方ないのだが)

## Timestamp オブジェクトの作り方

cf. http://www.embulk.org/docs/javadoc/org/embulk/spi/time/Timestamp.html

ただ Timestamp オブジェクトを作るだけであれば、

```java
Timestamp.ofEpochSecond(long epochSecond);
Timestamp.ofEpochSecond(long epochSecond, long nanoAdjustMent);
Timestamp.ofEpochMilli(long epochMilli);
```

あたりで生成できる。

## TimestampParser

cf. http://www.embulk.org/docs/javadoc/org/embulk/spi/time/TimestampParser.html

YYYY-MM-DD のような文字列から Timestamp オブジェクトを作るのがけっこう面倒。

DateTimeZone は Joda の API なのでそちらを参照のこと cf. http://www.joda.org/joda-time/apidocs/org/joda/time/DateTimeZone.html

```java
import org.embulk.config.Task;
import org.joda.time.DateTimeZone;
import org.embulk.spi.time.Timestamp;
import org.embulk.spi.time.TimestampParser;
import org.embulk.spi.time.TimestampParseException;
import com.google.common.base.Throwables;

public class SampleFilterPlugin implements FilterPlugin
{
    // TimestampParser.Task の extends が必要
    public interface PluginTask extends Task, TimestampParser.Task
    {
    }

    @Override
    public PageOutput open(TaskSource taskSource, Schema inputSchema,
            Schema outputSchema, PageOutput output)
    {
        PluginTask task = taskSource.loadTask(PluginTask.class);

        String time            = "2015-07-14";
        String format          = "%Y-%m-%d";
        DateTimeZone timezone  = DateTimeZone.forID("UTC");

        TimestampParser parser = new TimestampParser(task.getJRuby(), format, timezone);
        Timestamp timestamp;
        try {
            timestamp = parser.parse(time);
        } catch(TimestampParseException ex) {
            throw Throwables.propagate(ex);
        }
     }
}
```

要望: TimestampParser.Task の extends が必要とかなると単体テストしづらいので依存消したい。サンプルコードも大きくなるし。

## TimestampFormatter

cf. http://www.embulk.org/docs/javadoc/org/embulk/spi/time/TimestampFormatter.html

Ruby でいう `Time#strftime` みたいなことをやる

```java
import org.embulk.config.Task;
import org.embulk.spi.Exec;
import org.joda.time.DateTimeZone;
import org.embulk.spi.time.Timestamp;
import org.embulk.spi.time.TimestampFormatter;

public class SampleFilterPlugin implements FilterPlugin
{
    // TimestampFormatter.Task の extends が必要
    public interface PluginTask extends Task, TimestampFormatter.Task
    {
    }

    @Override
    public PageOutput open(TaskSource taskSource, Schema inputSchema,
            Schema outputSchema, PageOutput output)
    {
        PluginTask task = taskSource.loadTask(PluginTask.class);

        Timestamp timestamp    = Timestamp.ofEpochSecond(1437229271);
        String format          = "%Y-%m-%d";
        DateTimeZone timezone  = DateTimeZone.forID("UTC");

        TimestampFormatter formatter = new TimestampFormatter(task.getJRuby(), format, timezone);
        System.out.println(formatter.format(timestamp)); 
     }
}
```

Transaction 実行時間(現在時間に近いもの)を取得したい場合は `Exec.session().getTransactionTime()` で取れるらしい。

要望: TimestampFormatter.Task の extends が必要とかなると単体テストしづらいので依存消したい。サンプルコードも大きくなるし。
Dockerを使ってRubyスクリプトを任意のバージョンでワンライナーで実行する


例えばあのメソッドRuby2.0だと使えたっけ、とか調べるのに便利。

Rubyは[公式コンテナ](https://registry.hub.docker.com/_/ruby/)が配布されているのでそいつを使う。

```
$ docker run -it --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp ruby:2.2.2 ruby -e 'p RUBY_VERSION'
"2.2.2"

$ docker run -it --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp ruby:2.2 ruby -e 'p RUBY_VERSION'
"2.2"

$ docker run -it --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp ruby:2.1 ruby -e 'p RUBY_VERSION'
"2.1.6"

$ docker run -it --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp ruby:2.0 ruby -e 'p RUBY_VERSION'
"2.0.0"

$ docker run -it --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp ruby:1.9 ruby -e 'p RUBY_VERSION'
"1.9.3"
```

例えば`Float#prev_float`はRuby 2.1以前だと使えない。

```
$ docker run -it --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp ruby:2.2 ruby -e 'p 1.5.prev_float'
1.4999999999999998

$ docker run -it --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp ruby:2.1 ruby -e 'p 1.5.prev_float'
-e:1:in `<main>': undefined method `prev_float' for 1.5:Float (NoMethodError)
```

スクリプトも実行出来る。(hoge.rbはホストOS側に置いておけばよい)

```
$ docker run -it --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp ruby:2.2.2 ruby hoge.rb
```

## 仕組みの解説

[ruby Repository | Docker Hub Registry](https://registry.hub.docker.com/_/ruby/)の<b>Run a single Ruby script</b>を参考にしました

- `-v HOST_DIR:CONTAINER_DIR`
  - ホストのディレクトリをコンテナ側のディレクトリにマウントする
  - `"$PWD":/usr/src/myapp`は現在位置を /usr/src/myapp としてマウントする、の意味になる
- `-w DIR`
  - ワーキングディレクトリの設定
  - 指定したディレクトリをカレントディクトリとして以下のコマンドを実行

まとめると

- 現在ディレクトリを/usr/src/myapp としてマウント
- /usr/src/myapp をカレントディレクトリにして
- ruby:x.x.x コンテナを作成し
- `ruby -e 'p RUBY_VERSION'` コマンドを実行

の意味になる。
GitHub ローカルリポジトリ→リモートリポジトリへの新規作成方法

1. GitHubでリポジトリを作成
2. ローカルのプロジェクトをgit init

```
$ git init
$ git add .
$ git commit -m ‘First commit.’
```
3.リモートリポジトリ(GitHubのリポジトリ)を登録

```
$ git remote add origin git@github.com:user/repo.git
```
4.git pushを実行

```
$ git push origin master
```
embulk のプラグインを travis でテストする

## Java プラグイン

.travis.yml を次のように書けば実行できた

```yaml:.travis.yml
language: java
jdk:
  - openjdk7
  - oraclejdk7
  # - oraclejdk8
script:
  - ./gradlew test
```

Embulk 業界的には java7 でビルドできるようになっていると良い

なお、openjdk8 は用意されていないもよう. See http://docs.travis-ci.com/user/languages/java/


## JRuby プラグイン

Gemfile に embulk も書いて

```rb:Gemfile
source 'https://rubygems.org'

gemspec
gem 'embulk'
```

Rakefile を作って bundle exec rake でテストを流せるようにしておき、

```rb:Rakefile
require 'rake/testtask'
desc 'Run test_unit based test'
Rake::TestTask.new(:test) do |t|
  t.libs << "test"
  t.test_files = Dir["test/**/test_*.rb"].sort
  t.verbose = true
  #t.warning = true
end
task :default => :test
```

.travis.yml を次のようにすれば良い。

```yaml:.travis.yml
language: ruby
cache: bundler
rvm:
  - jruby-head
jdk:
  - openjdk7
before_install:
  - gem install bundler
```

利用できる jruby (ruby) のバージョン一覧はこちら http://rubies.travis-ci.org/
Docker 逆引きTips


dockerのどうやるんだっけメモです


---

### ホストとボリュームを共有

-vオプション

```bash

$ docker run -v $HOME/share:/srv/src imagename

```

---

### ホストからポートフォワーディング

```bash
$ docker run --name cont -P imagename
$ docker port cont # 確認
```

---

### ホストからコンテナのID・IP・Name一覧表示

```bash:
$ docker inspect --format '{{ .Id }} {{ .NetworkSettings.IPAddress }} {{ .Name }}' $(docker ps -a -q)
```
---

### コンテナに名前をつける（--name）

たいていの場面で、名前でコンテナを指定できる。
IDと違い前方一致はなし

```bash:
$ docker run -d --name=myserver1 myserver
```
---

### コンテナのログをながめる

-fでフォローする。
stop状態でも見ることはできる。

```bash:
$ docker logs  -f container
```
---
git commit -amをした時に「fatal: Paths with -a does not make sense.」が表示される


## 前置き

Qiitaに投稿するかどうか迷うくらいどうでも良いTipsでしたが、
自戒という意味と同じエラー文で検索した時に日本語の記事が無かったので投稿しました。


## 何が起こったのか？

キリの良い所まで開発が進んだのでコミットしようと以下のコマンドを打ったところ・・・

````bash
$ git commit -am "hoge" ./*
fatal: Paths with -a does not make sense.
````

怒られました。

これgit使った人なら一瞬で分かるほどのアホなミスなんですが、どこが悪いか分かりますでしょうか？





正解は・・・

````bash
$ git commit -am "hoge" ./*

# -aで変更のあったファイルを指定しているのに、./*でカレントディレクトリより下のファイルを指定している
````

ということで./*を使ってるのがダメ、が正解でした！
２重にファイルを指定しているのでそりゃ怒られますよね・・・(ヽ´ω`)