OmniAICreator/Qiita-1.07M huggingface dataset:
Web-Componentsを理解するため、自作してみる(1)


現在、ユーザが独自タグを投稿して、利用者がそれらを組み合わせるだけでwebアプリができるプラットフォームを構想中しています。そこで必要になる技術がwebcomponents。その仕組みを理解すべく、簡単なサンプルを作ってみようと思います。

一回目は純粋に独自タグを読み込んで入れるだけという例。

```index.html
<script src='https://code.jquery.com/jquery-2.1.4.min.js'></script>
<chat></chat>
<script>
  (function(argument) {
    $.get('chat.tag', function(data) {
      $('chat').html(data)
    })
  })()
</script>

```

```chat.tag
<h1>This is tag</h1>

```

見ての通り、jQueryで独自タグを見つけ、```$.get```でそのタグをとってくるというシンプルな処理。結果はこんな感じ

![](https://github.com/endows/component/raw/master/public/scsho.png)

できてますね。次は```.tag```ファイル内部でjsを実行してみます。

```chat.tag
<h1>This is tag</h1>
<script>
  var ele = document.createElement("img");
  ele.setAttribute("src", "public/oct.png"); // ele.src = "./image/picture/bg01.gif";
  document.body.appendChild(ele);
</script>

```

![](https://github.com/endows/component/raw/master/public/scsho2.png)

きちんと画像が挿入されましたね。成功です。


勘の鋭い方ならもう気付いたかもしれませんが、これだと```.tag```からdocument.bodyに挿入しています。あるいは、できてしまいます。個人開発ならば問題ないんですが、コンポーネントを投稿してもらう際に、他のHTMLをいじられる懸念が生まれます。

第二回ではWebWorkerを使ってこのスコープ問題を解決したいと思います。お楽しみに。
Tumblrを静的サイト風にする

#Tumblrで静的サイトっぽいものを作ってみました
* Homeページにはサイトのイメージ画像だけを表示
* イベントのページには#eventタグの付いた投稿のみ表示
* ブログのページには#blogタグの付いた投稿のみ表示

以上の機能をTumblrのテーマを改造して作ってみました。

## Homeページにはサイトのイメージ画像だけを表示
**1) イメージ画像（Hero image)を設定する項目をテーマの編集画面に追加**
テーマの編集画面でカスタムテーマのHTML編集を選んで、metaタグの{block:hidden}内にイメージ画像（Hero image)を設定するためのコードを3行追加します。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/83964/2581546a-54b2-a259-a549-34f81aec93e5.png)

```html:追加するコード
{block:hidden}
...
<meta name="image:Hero" content="">
<meta name="text:Hero message" content="Home" />
<meta name="text:Hero url" content="/" />
...
{/block:hidden}
```

この3行を追加すると、テーマの編集画面の左メニューでイメージ画像を設定する３つの項目が使用できるようになります（図1,2）。
図1.
![1.png](https://qiita-image-store.s3.amazonaws.com/0/83964/951b0be1-a12b-6606-f267-2e3ab133badd.png)

図2.
![2.png](https://qiita-image-store.s3.amazonaws.com/0/83964/0a5519d6-e611-e742-c73c-c9debed8a2bb.png)



**2) イメージ画像をトップページのみに表示する設定**
イメージ画像を表示する箇所を下記のようにします。

```
{block:IfHeroImage}
  {block:PermalinkPage} <!-- {/block:PermalinkPage}
    {block:TagPage} <!-- {/block:TagPage}
       <!-- ここにイメージ画像用のタグを追加する -->
    {block:TagPage} --> {/block:TagPage}
  {block:PermalinkPage} --> {/block:PermalinkPage}
{/block:IfHeroImage}

{block:Posts}
```

こうするとPermlinkPageかTagPageの時にはイメージ画像用のタグがコメントアウトされるので、トップページのみにイメージ画像を表示することができます。

**3) トップページに投稿を表示させない設定**
トップページにはイメージ画像だけを表示して、投稿はPermlinkPageとTagPageに表示するようにします。

1. {block:Posts}で囲まれたコードをコピーして、{block:Posts}を２つ用意します。
2. {block:Posts}をそれぞれ{block:PermalinkPage}と{block:TagPage}で囲みます。

```
{block:TagPage}
  {block:Posts}
      <!-- 投稿用のコードA -->
  {/block:Posts}
{/block:TagPage}

{block:PermalinkPage}
   {block:Posts}
      <!-- 投稿用のコードB -->
   {/block:Posts}
{block:PermalinkPage}

<!-- （AとBは全く同じコード） -->
```

こうすると、PermalinkPageかTagPageの時だけ投稿が表示されるようになります。

***
次回は下記の機能の作り方を説明します。

* イベントのページには#eventタグの付いた投稿のみ表示
* ブログのページには#blogタグの付いた投稿のみ表示
nw.js でアロー関数を使う方法

nw.jsはio.jsをベースにしているせいかES6の機能がデフォルトで有効になっているが、実装中のステータスのものは使用できない。アロー関数も実装中のステータスなので既定では使用できないが、package.json中に`--harmony_arrow_functions`を追加することによって使用することができる。

```json:
  "js-flags": "--harmony_arrow_functions"
```

実装中の機能なので完全に動作するかどうかは不明だが、私の環境では問題なく使用できた。
三項演算子（ネスト）

たまに忘れるのでメモ

三項演算子
---

```
= (条件式) ? (真の場合) : (偽の場合)
```

三項演算子（ネスト）
---

```
= (条件式A) ? (A真) : (条件式B) ? (B真) : (AB共に偽)
```

Ex) piecewise linear $(a < b)$

```
y = (x < a) ? -x : (x > b) ? x : 0
```

一回ネストするだけなら，可読性も悪くない気がする．
エクセルの日時変数をRで扱う

エクセルなどの表計算ソフトでは、日付や時間は数値で表されている。
このことは、日付を打ち込んでからセルを数値に変換すると、3~4万くらいの数字になることで確認できる。これは実は、1889年12月30日からの経過日数になっているらしい。
なんで1900年1月1日じゃないかというと、歴史的経緯にがあるとのこと。

そういうわけでエクセルのファイルをRで読み込むと、日付・時間変数が数値で与えられることがある。
そういう場合は、以下のコードで日付・時間型に変換できる。

```r
# 06/29/15,  05/15/15 03:20 PM
numeric.date <- c(42184.00000, 42139.63895)

# 日時
as.POSIXct('1899-12-30') + as.difftime(numeric.date, units = 'days')
# [1] "2015-06-29 00:00:00 JST" "2015-05-15 15:20:05 JST"

# 日付のみ
as.Date(numeric.date, origin = "1899-12-30")
# [1] "2015-06-29" "2015-05-15"

# これはズレるので注意
as.Date('1899-12-30') + as.difftime(numeric.date, units = 'days')
# [1] "2015-06-29" "2015-05-16"

```
【AWS】CloudWatchのAuto Recoveryを実装する(AWS CLIで)



どうも、千葉です。

小ネタです。自動化というこで、AWS CLIを使ってCloudWatchのEC2メトリクスを監視して、異常時インスタンスを再起動する設定を行います。
CloudWatchのEC2メトリクスとアラーム機能、アクション機能を使います。

## EC2の障害を確認できる2つのメトリクス
CloudWatchで確認できるEC2の障害は、大きく2パターンがあります。
システムステータスチェックと、インスタンスチェックです。

レイヤーとしては上から、インスタンス、ホストOS(ハイパーバイザー)、物理レベル（ネットワークや物理的なハード障害）となります。
以下、CloudWatchで確認できるEC2のステータスチェクとして利用できるメトリクスとなります。

### システムステータスチェック
* ネットワーク接続の喪失
* システム電源の喪失
* 物理ホストのソフトウェアの問題
* 物理ホストのハードウェアの問題

### インスタンスステータスのチェック
* 失敗したシステムステータスチェック
* 正しくないネットワークまたは起動設定
* メモリの枯渇
* 破損したファイルシステム
* 互換性のないカーネル

### ステータスチェック
上記記載の、システムチェックとインスタンスチェック両方をチェックするメトリクス
 
## メトリクスに対するアラーム、アクションの登録
これらのメトリクスに対してアラームとアクションを定義することができます。
つまり、何らかのインスタンス障害時に何かしらのアクションを実行できます。アクションにはメール通知、AutoScaling実行、インスタンス停止または削除、インスタンス再起動があります。
今回は、システムステータスチェック異常時　または　インスタンスステータスチェック異常時にEC2を自動で再起動させて、自動復旧するアラームを、AWS CLIにて追加します。
※もちろん、アプリなどが乗っている場合、OS起動時にプロセスの自動起動を設定す必要があります。

チェックするメトリクスは「StatusCheckFailed」となります。こちらは、システムステータス・インスタンスステータスのどちらも監視可能なメトリクスとなります。
それでは早速ですが、AWC CLIのコマンドを記載します。
※前提として、AWSアクセスキーの設定済みであることです(環境変数に設定　or　aws configureを実行) 

と、いうことでコマンドは以下となります。

```
instance_id="i-XXXXXXXX"

aws cloudwatch put-metric-alarm \
--alarm-name ec2_auto-recovery_${instance_id} \
--alarm-description "EC2 Auto Recovery" \
--metric-name StatusCheckFailed \
--namespace AWS/EC2 \
--statistic Maximum \
--period 300 \
--threshold 1 \
--comparison-operator GreaterThanOrEqualToThreshold  \
--dimensions  Name=InstanceId,Value=${instance_id} \
--evaluation-periods 1 \
--alarm-actions arn:aws:automate:ap-northeast-1:ec2:recover
```


## 参考URL
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/monitoring-system-instance-status-check.html


## まとめ
簡単に、インスタンスレベルの自動復旧が設定できます。
自動復旧は、インスタンス・ハード周りの障害時に復旧可能ですが、アプリレベル(Webアプリ等)での自動復旧を行いたい場合は、ELB+AutoScalingを利用することにより自動復旧が可能です。
incsearch.vim を使いたい

[incsearch.vim](https://github.com/haya14busa/incsearch.vim/) を使いたいと思っているけれど、標準のインクリメンタルサーチの場合にできていることを同様に実現する方法がわかっていないので移行できていない。

実現方法がわからないのは、下記のようなこと。

## 検索結果を置換用に流用
インクリメンタルサーチを実行中に \<C-t> で検索文字列を置換用に流用している。

``` vim
" https://raw.githubusercontent.com/cohama/.vim/master/.vimrc
" / と :s///g をトグルする {{{
cnoremap <expr> <C-t> ToggleSubstituteSearch(getcmdtype(), getcmdline())
function! ToggleSubstituteSearch(type, line)
  if a:type ==# '/' || a:type ==# '?'
    let range = GetOnetime('s:range', '%')
    return "\<End>\<C-U>\<BS>" . substitute(a:line, '^\(.*\)', ':' . range . 's/\1', '')
  elseif a:type ==# ':'
    let g:line = a:line
    let [s:range, expr] = matchlist(a:line, '^\(.*\)s\%[ubstitute]\/\(.*\)$')[1:2]
    if s:range ==# '''<,''>'
      call setpos('.', getpos('''<'))
    endif
    return "\<End>\<C-U>\<BS>" . '/' . expr
  endif
endfunction
function! GetOnetime(varname, defaultValue)
  if !exists(a:varname)
    return a:defaultValue
  endif

  let varValue = eval(a:varname)
  execute 'unlet ' . a:varname
  return varValue
endfunction
" }}}
```
## クリップボードからの貼付け
/ 押下後にクリップボードから貼り付けてインクリメンタルサーチに使っている
bitcoinの数値(satoshi)の扱い方(javascript)

# javascriptでのbitcoinの数値(satoshi)の扱い方

## ビットコインの単位のおさらい

最小単位は1satoshiである
それを基準に表す

| unit | btc | satoshi |
|------|-----|---------|
| BTC  | 1 | 100,000,000 |
| mBTC  | 0.001 | 100,000  |
| uBTC(bits) | 0.000001 | 100 |
| satoshi  | 0.00000001 | 1 |

BTCで扱うと浮動小数点で誤差が出ます。
オカネの扱いで誤差がでるとまずいです。
誤差がでないように固定小数点（Decimal型）かsatoshiで扱います

## javascriptの数値型の扱い(satoshi)

浮動小数点型で整数としてなら以下の範囲を表現出来ます

* -9,007,199,254,740,992 ～ 9,007,199,254,740,992 (約9007兆)

つまりsatoshiとして扱う場合、約9000万を超えると表現範囲を超えるということになります。
（ビットコインは2100万枚なので十分でしょう）
この値を超えて扱うと判断した場合にはbignumber.jsなどを使います
(monacoinは1億512万枚だけど一度に扱わなければ問題ない気もする。)

### satoshiにする方法

value * 1e8でsasoshiとなりますが浮動小数点の誤差がでるので四捨五入します

例えば以下の数値は端数が出ます

```
0.31111111*1e8=31111111.000000004
Math.round(0.31111111*1e8) = 31111111
```

### satoshiから戻す方法

satoshi * 1e-8で戻せますが例のごとく誤差が出ます。
四捨五入で対処します

```
99999999 * 1e-8=0.9999999900000001
(99999999 * 1e-8).toFixed(8)='0.99999999'
parseFloat((99999999 * 1e-8).toFixed(8))=0.99999999
```

### satoshiの演算方法

普通にnumber型に対しての演算とあまり変わりませんが丸め処理だけはMath.roundなどの関数が使えないので桁を戻したりして対応します。
64bit 対応 Unity iOS アプリを Apple Store に出すと 40MB くらい ipa が増えちゃう問題 (1)

どうも、流浪のエンジニアの沼田です。
cocos2d-x やったり Unity やったり節操ないです。

今回は Unity のお話です。月曜未明に書いてるので短く予告編にとどめます。
スプラトゥーンも FE if も積んでるんです。お察しください。

## 「64bit 対応の Unity iOS アプリって？」

2015 年の 6 月から、iOS アプリを Apple Store に出す際は、64bit 対応が義務付けられました。64bit 対応してないと、アプリを更新したり新規リリースしたりできないのです。

Unity では、64bit 対応にあたり IL2CPP という方法をとりました。IL2CPP とは、これまで mono の上で .net アプリを動かしていた方式とは異なり、C# コードを C++ に変換する方式なのです。

つまり、64bit 対応の Unity iOS アプリとは、IL2CPP を使って C++ に変換することで 64bit 対応した Uniy iOS アプリということになります。

## 「なんでストアにアップすると増えるの？」

64bit 対応したからです。（正確にいうとここも怪しいんだけどね）

## 「なんで 64bit 対応すると増えるの？」

32bit のバイナリと 64bit のバイナリは別だからです。
今まで 32bit のバイナリだけでよかったところ、これからは 32bit と 64bit のバイナリを ipa に積まないといけません。

※32bit サポートを切るというのは今回ナシね。

## 「今まで 64bit 端末で 32bit アプリ動いてたよね？」

うん、動いてた。それは 64bit 端末の上で 32bit アプリをエミュレートしてたのさ。（語弊あるけど流してね）

でも Apple さまがけしからん！と言ったので、これからは 64bit 端末では 32bit をエミュレートせず、64bit 端末の性能をフルに生かせる 64bit 対応アプリしかストアにリリースできなくなったとさ。

※新規リリースやアップデートが無理なだけで、既に公開されてる 32bit アプリは、アップデートがなければ 32bit のまま。

## 「ipa に 64bit バイナリが含まれてるのに、ストアにあげたら ipa サイズが増えるというのは変だよね？」

そうですね。普通そう思いますよね。でも増えるんですよこれが。

[Unity Japan さまの記事](http://helpdesk.unity3d.co.jp/hc/ja/articles/204763354)をまずはご一読ください。 

「暗号化領域」というものがあって、そこは圧縮がききにくいのです。詳しい話は後日しますが、以下の計算式でストアにアップすると増えるアプリサイズを求めることができます。

【暗号化領域】× (1 - 【圧縮率】)

たとえば、私の手元だと zip の圧縮率がだいたい 25% ほどで暗号化領域が 60MB ぐらいなんですが、60 * 0.75 = 45MB ほど増える計算です。ただしこれは最悪値で、暗号化領域の圧縮具合によってはもっと小さくて済みます。また、暗号化領域は上記記事のように otool で求めることができます。

## 次回予告

今回はいきなり計算式を登場させてしまいましたが、この計算式の導出方法について詳しく説明します。あと、暗号化領域って別に 64bit 対応必須の前からあるわけで、なぜ急に問題になりだしたかをもうちょっとロジカルに説明したいところ。

つづく。
Rails脱初心者のための基礎知識と実装Tipsまとめ(1) - 設計編


## はじめに
ここ数年は仕事でRailsを利用してます。

新たにプロジェクトがはじまり、これまでRubyはやっていたけどRailsは初めてという人はあんまりいなくて、RubyもRailsも初めてで、これまではJavaばかりという人がほとんどだったりします。

そんな人達に知っておいてほしい基礎知識と実装Tipsを何回かに分けてまとめてみます。

次のプロジェクトでメンバーに読んでもらうことも意識しながら:sweat_smile:

第1回は、設計編から。

## 初心者のハマりところ（設計編）
#### ■テーブル設計で、ついつい複合主キーを前提にマスタ設計してしまう。

IDカラムを物理主キー（サロゲートキー）にしましょう。また、外部キーも参照するテーブルのIDカラムとしたほうがベターです。

複合主キーにすることも可能ですが、Modelのリレーションでいちいちオプション指定をする必要が出てきますし、ActiveRecordの実装も複雑になってくるので、オススメしません。

#### ■ページコントローラ型のフレームワーク（JSFなど）に慣れていると、フロントコントローラ型フレームワーク＆RESTfulの思想に基づいたRailsの場合、URL設計や画面の粒度・画面遷移で戸惑う。

Java歴が長い人の場合は、JSFよりもStrutsの思想に近いという話をすると比較的入りやすいと思います。

##### ●RESTfulなアーキテクチャスタイル
またRESTfulについては、GET,POST以外にもPATCH,DELETEといった概念があり、マスタメンテナンスのような画面を例にして、Controllerのアクションメソッドの説明をしていくとよいでしょう。

なお、典型的なマスタメンテナンス画面を作る場合、下表のようになると説明するとわかりやすいかと思います。

###### ユーザーマスタのメンテナンス画面を作る場合

|画面|イベント|HTTPメソッド|Controllerのメソッド|URL|
|:-----------|:------------|:-------|:-------|:------------|
|ユーザー一覧  |初期表示      |GET      |index  |/user/index|
|ユーザー登録  |初期表示      |GET      |new    |/user/new|
|ユーザー登録  |登録ボタン押下 |POST     |create |/user/|
|ユーザー更新  |初期表示      |GET      |edit   |/user/1/edit|
|ユーザー更新  |更新ボタン押下 |PATCH    |update |/user/1|
|ユーザー一覧  |削除ボタン押下 |DELETE   |destroy|/user/1|

なお、Rails/RESTfulのスタイルに合わない場合もありますが、その場合は、HTTPメソッドに対して、独自に定義したControllerのメソッドをマッピングします。

例えば、検索画面を作りたいという場合は、GETを用いて、searchメソッドとマッピングするという形です。

URL設計については、下記参考URLの3のSlideShareがわかりやすいです。

##### ●画面の粒度
上述のRESTfulに従い、例えば一括登録・一括更新みたいな画面は作りにくいので、なるべくなら避けるとよいでしょう（バリデーションのメッセージを表示するのもちょっと面倒）。

また１つの画面に複数の役割の異なるボタンを配置すると、とたんに作りがややこしくなります。いまどきのSPAで作る場合はREST APIで受ける形で実装できますが、そうでない場合は1画面で1イベントのようにしたほうがよいです。

画面数を節約するためにボリューミーな画面にして、見かけ上の機能数を削減するみたいな思想は捨てて、素直に画面を分割することをオススメします。

###### 戯言・・・
エンタープライズの世界では、工数削減という名のもとに、機能の一部分が一緒だから、画面を１つにすれば工数削減できると思い込んでいるレガシーな思想がまだ残っていると感じることがあります。特にRailsの場合、シンプルな画面を複数作成するほうが、重たい画面を１つ作るよりも遥かに工数が削減できますので、くれぐれもレガシー脳のなんちゃってマネージャーの言うことを聞かないようにしましょう:wink: 

## 参考
1. ページコントローラ - Strategic Choice
http://d.hatena.ne.jp/asakichy/20120626/1340661275

2. フロントコントローラ - Strategic Choice
http://d.hatena.ne.jp/asakichy/20120627/1340748302

3. RESTfulとは
http://www.slideshare.net/unsolublesugar/res-tful

4. REST - Wikipedia
https://ja.wikipedia.org/wiki/REST

## Rails脱初心者のための基礎知識と実装Tipsまとめシリーズ目次

1. 設計編 :koko: 
2. 区分値管理編<br />
http://qiita.com/future-hoshi/items/6b72980a19a39bb1f780
kintone開発覚え書き

この覚書は下記の開発サイクルを前提に考えられています。
想定している読者は kintone のカスタマイズはひとしきり覚えたものの、どのように開発サイクルを回せば良いか分からなかった数カ月前の自分です。

## 前提とする開発サイクル
1. dropbox など編集してすぐに動作を確認出来る方法で開発する
  * 参考の公式Tips: [JavaScriptカスタマイズのデバッグをかんたんにするウラワザ] ( https://cybozudev.zendesk.com/hc/ja/articles/201308690 )
2. パッケージング
  * 開発したJavaScriptをアプリに添付する(外部から見えないようにするため)
  * アプリをテンプレート化する。
      * 参考の公式ヘルプ: [アプリをテンプレート化する]( https://help.cybozu.com/ja/k/admin/add_template.html )

3. デプロイ
  * 本番のデータをエクスポート
  * アプリを削除
      * この作業はルックアップなどの参照があるとかなり面倒です。スペースごと削除する方が良いのかもしれませんがまだ試せていません。2015年7月のアップデートでフォームの項目を変更するAPIも出来るらしいので一括で削除する処理を書くことが出来るようになるのかもしれません。
  * 2.でパッケージングしたテンプレートからアプリを作成
  * データをインポート
4. 追加の開発がある都度1.へ戻る。

## 各種tips
### ルックアップでレコード番号を使わず、重複しない項目を設ける
レコード番号はインポート、エクスポートの際も自動採番されて変更することはできませんが、ルックアップの際に取得した項目はそのまま保持されるため関連が崩れます。
なのでレコード番号ではなく重複のない項目を使うべきだと思います。
どうしても重複のない項目が無い場合は下記の方法で解決出来るかもしれません。

* 複数の項目を繋ぐ項目を作成する。(例えば、会社名_部署名 と結合する項目を設けると重複が無くせるかもしれません。RDBのマルチカラムインデックスのような使い方です。)
* データ作成の際 UUID を生成する

### アプリIDをハードコーディングせず、ルックアップや関連レコード一覧から取得する
冒頭に挙げた開発サイクルの通り、最終的なパッケージングはアプリテンプレートなのでアプリIDは変動します。
ここで言う"ハードコーディングしない"とは、プログラム上で定数にするという意味ではありません。

kintone の JavaScript API には下記のようにルックアップ、関連レコード一覧から参照先アプリIDを取得するメソッドがあります。

* [kintone.app.getRelatedRecordsTargetAppId]( https://cybozudev.zendesk.com/hc/ja/articles/201942014#step7 )
* [kintone.app.getLookupTargetAppId](https://cybozudev.zendesk.com/hc/ja/articles/201942014#step8)

REST APIであれば[フォーム設計情報取得]( https://cybozudev.zendesk.com/hc/ja/articles/201941834 )で得られる relatedApp です。

アプリIDは絶対にコード上に含めず、上記の方法を使用することによってアプリIDが変動しても問題無くなります。
(アプリテンプレートから作成されたルックアップ、関連レコード一覧は関連が保たれています。)

ただし、必ずしもルックアップや関連レコード一覧がフォーム上にあるとは限りません。この解決策を私は知らないので、システム用とする編集不可のグループを作成しここに何の意味も無いアプリIDを取得するためのルックアップか関連レコード一覧を配置します。
あまり気持ちの良い方法ではないですが、デプロイ後に忘れずに参照先を変更する自信がないのでこうします。

### テーブルを使わず、関連レコード一覧を使用する
複数の項目をアプリを増やすことなく手軽にできるテーブルですが、JavaScriptから扱いづらかったり、CSVでのインポートで反映できなかったり、再利用に向かない印象があります。
冒頭に挙げた開発サイクルで開発を行いたい関係上CSVでインポート出来ないのは困りますので、テーブルではなく関連レコード一覧を使用します。
正規表現の「正規」って？

ときどき、「これだけ言語によって表現がバラバラなのに『正規』表現なんていうのもおかしな話だ」という声も見受けられますが、正規表現の「正規」の意味合いは**そういうことではありません**。

# regularの意味
「正規表現」は、英語のregular expressionの訳語ですが、[regularを英和辞典で引くといろんな意味が出てきます](http://ejje.weblio.jp/content/regular)。regular expressionのregularはこのうちだと、「系統[組織]立った」あるいは「(法律・慣例・標準などに合った)正規の」に近い意味合いです。

どういうことかといいますと、文法構造の分類としてregular grammer（正規文法）という文法があって、それと等価になる表現が正規表現、だということです。この「正規文法」は多くのプログラミング言語が則っている「文脈自由文法」より表現範囲が狭い文法で、有限オートマトンで処理できる、という特徴を持ちます。

なお、この意味でのregularは「正則」とも訳されます。とりわけ、エディタなどでの「正規表現」が本来の「正規文法」からはみ出しているという現実があるので、以下では**便宜上**、「正規表現」は文字列の検索・置換に使うものを指すことにして、数学的に厳密なものについては「正則表現」と表します。

# 正則表現の構成
正則文法がどのような構成か説明するのは、形式言語理論に慣れていないと難しいので、それと等価で、しかも検索用の正規表現とも近い正則表現の方について、どのような構成かを説明します（表記も、正規表現のものを援用しています）。

1. φ（空集合）、文字集合に含まれる各文字は正則表現になる。
2. AとBが正則表現なら、A|B（AまたはB）、AB（AとBが連続したもの）は正則表現である。
3. Aが正則表現なら、A*（Aを0回以上繰り返したもの）も正則表現である。
4. 以上のルールで生成できるものだけが正則表現である。

**たったこれだけです**。とはいえ、正規表現の大半の機能がこれだけで表現できるのも間違いないところです。例えば、`[a-z]`などの文字クラスは全部の文字を`|`区切りで並べたものと意味的には等価ですし、`?`や`+`、`{n,m}`といった数の指定も、`*`と`|`を組み合わせれば実現可能です。

# 正則表現の範囲を超えた正規表現
ただ、言語によっては正則表現の範囲を超える機能が「正規表現」に組み込まれていることもあります。よくある例としてはキャプチャしたパターンを、同じ正規表現の後のほうで使うというものがあって、これは正則文法で表現できないパターンを生成できます。
Rails Modelのscopeとlambda

#Modelのscopeとは？
Modelのscopeとは「共通のクエリの処理を設定し、それをメソッドのように使えるようにする機能」です。
例えば、下記のように公開日に達した記事だけを取り出すとします。

```rb:articles_controller.rb
class ArticlesController < ApplicationController
  def index
    @articles = Article.where("published_date < ?", Time.now())
  end
end
```

この公開日に達した時だけ取り出すという処理は何度も出てくるかもしれません。このときこの処理を共通処理としてまとめます。

```rb:articles_controller.rb
class ArticlesController < ApplicationController
  def index
    @articles = Article.published
  end
end
```

```rb:model/article.rb
class Article < ApplicationRecord
  scope :published, -> { where("published_date < ?", Time.now()) }
end
```

このように、.publishedをメソッドの要領で使うことが出来て便利です。
これがModelのscopeです。

#Modelのscope使い方

上記にもあるように基本は

```rb:articles_controller.rb
class ArticlesController < ApplicationController
  def index
    @articles = Article.published
  end
end
```

```rb:model/article.rb
class Article < ApplicationRecord
  scope :published, -> { where("published_date < ?", Time.now()) }
end
```
のようにmodelにscopeを記述して使います。

##引数を渡す

例えば、以下のようにある日時以降の記事を取り出したいとします。

```rb:articles_controller.rb
class ArticlesController < ApplicationController
  def index
    @articles = Article.where("published_date >", time)
  end
end
```
下記のように引数を渡せます。

```rb:articles_controller.rb
class ArticlesController < ApplicationController
  def index
    @articles = Article.published_after(Time.now())
  end
end
```

```rb:model/article.rb
class Article < ApplicationRecord
  scope :published_after, -> (time){ where("published_date >", time) }
end
```

##scopeをmergeする

下記のように複数のscopeをマージすることが出来ます。

```rb:articles_controller.rb
class ArticlesController < ApplicationController
  def index
    @articles = Article.published.published_after(Time.now())
  end
end
```

```rb:model/article.rb
class Article < ApplicationRecord
  scope :published_after, -> (time){ where("published_date >", time) }
  scope :published, -> { where(published: true) }
end
```

##defaultのscopeを設定する

defalut_scopeを使うと設定したModel内の全ての検索クエリにおいてそのscopeが適用されます。論理削除のときなどに使えます。

```rb:articles_controller.rb
class ArticlesController < ApplicationController
  def index
    @articles = Article.published_after(Time.now())
  end
end
```

```rb:model/article.rb
class Article < ApplicationRecord
  default_scope :published, -> { where(published: true) }
  scope :published_after, -> (time){ where("published_date >", time) }
end
```

##アソシエーションを使うときにscopeを設定する

以下のように設定するとアソシエーションを使うときにscopeを適用できます。

```rb
class Article < ApplicationRecord
  has_many :comments, -> { order("updated_at DESC") }
end
```

この場合、commentsを更新日の新しい順に並べ替えます。

# lambda ~->って何?~
->はlambda(ラムダ)記法で無名関数のような役割を果たします。
下記のRubyのコードを見るとどういう役割をしているか見えてきますね。

```rb
test = {
    hoge: ->(x) { x + 2 }
}
puts test[:hoge][3] # 5
```

#参考

[Rails ModelのScope（スコープ）の使い方（scopeメソッドとdefault_scopeメソッド）](http://ruby-rails.hatenadiary.com/entry/20140814/1407994568)
[Rubyのlambdaは無名関数では!?と気付き、調べた結果](http://qiita.com/YoshiyukiHirano/items/892680782f7d411534e1)
TypeDoc入門

TypeScript用ドキュメントツール
http://typedoc.org/

# TypeDocを選ぶ理由

1. 無駄なコメントを書く必要がない
  * 型情報とか
2. TypeScriptの文法にちゃんと対応してる
  * ver. 1.4.1の範囲（2015-06-25現在）
3. デフォルトで奇麗で便利な出力
   * 検索機能付き
4. 型定義ファイル(*.d.ts)からも出力可能


# インストール

npm経由で。

```
npm i typedoc -g
```

# 使い方

nodejsのコマンドラインツールとして提供されているのでコマンドラインからが基本になる。

## コマンドラインで

```sh:基本
typedoc --out OUTDIR SRCDIR
```

裏でTypeScriptのコンパイラが動くので、tscへのコマンドラインオプションをビルド時と同様に設定する必要がある。

```sh:tscのオプションも必要
typedoc --out OUTDIR SRCDIR -m "commonjs" -t "ES6"
```


## タスクランナーと組み合わせて

gulpとGruntのプラグインが公開されている。

* [gulp-typedoc](https://www.npmjs.com/package/gulp-typedoc/)
* [grunt-typedoc](https://www.npmjs.com/package/grunt-typedoc/)


# コメントの書き方

JavaDoc形式。YUIDoc形式のように、型情報を`{String}`のような表記で書く必要は無く.tsのソースを解析して出してくれる。

整形して解析してくれるタグは`@param`と`@return(s)`の２つだけ。ただしそれ以外のタグを書いてあってもそれっぽく表示してくれるので問題ない。

コメント中にはHTMLやMarkdown形式が使える。

```ts

/**
* 関数の説明
* @param arg 引数の説明文だけでOK
*/
function doSomething<T,S>(arg:T):S{
	//...
}

```
![スクリーンショット 2015-06-26 0.50.01.png](https://qiita-image-store.s3.amazonaws.com/0/54764/1244cf44-d0a3-7270-7cad-a5efb1d2abf8.png "スクリーンショット 2015-06-26 0.50.01.png")

# 各種コマンドラインオプション

公式サイトで説明されていないものも結構ある。

## 型定義ファイルをドキュメント化する

`--includeDeclarations`オプションをつける。

型定義ファイルしか提供されてない場合でもそこからドキュメント化できる。下手に作られたドキュメントより見やすい。

## ファイルでまとめるかモジュールでまとめるか

`--mode`オプションに`file` / `modules` と設定する事でドキュメントのディレクトリ構造をファイルでまとめるかモジュールでまとめるか決められる。

実際に設定を変えてみて好きな方を設定すると良いと思われる。

## ソースの解析結果をJSON形式で出力する

`--json`オプション。
`--json <outputfilename.json>`とすることでJSON形式で解析結果を出力できる。コレを使って色々改変してみるのも面白いかもしれない。

## ドキュメントの名前を設定する

`--name`オプション。

## Google Analyticsと連携する

`--gaID` と `--gaSite`

## ドキュメントの見た目（テーマ）を変える

`--theme`オプション。デフォルトでは`default`と`minimal`が用意されている。デフォルトの出来がいいのであまり使わないかも？

## 画像とかをつかいたい

`--media`オプションでディレクトリを指定する。

## 謎オプション

* `--verbose`
 * ver.0.3.4 だと無効？
* `--logger`
 * `none`/`console`を指定。ロガーを指定するらしいが何のためかは不明
* `--option`
 * `typedoc.js`というjsにオプションを書いておくと勝手に読み込んでくれるらしいのだが、書き方が分からないので試せなかった 
* `--plugin`
 * 読み込むべきnpmプラグインを指定する、とあるが何のためにあるのか不明

# TS1.5のソースをドキュメント化したい

現時点(2015-06-26)ではTypeDocはTS1.5に対応していない。

1. 方法１：
 * tsソースを一旦型定義ファイル(d.ts)に変更する
 * 1.5のtscでtsファイルからd.tsを生成
 * typedocでそのd.tsをソースとして生成
2. 方法２：
 * (未確認)typedoc内部のtypesciptを置き換える
 * https://github.com/sebastian-lenz/typedoc/issues/95#issuecomment-101915453
Python, Ruby, PHP, Java, JavaScriptの側をそれぞれ書いてみる

# 初めに
授業で各コードのパフォーマンス比較のレポートを出した時にPython, Ruby, PHP, Java, JavaScriptそれぞれのコードを書いたので、それらを省略して側だけ列挙してみる :smiling_imp: 
間違った書き方、個々はこうしたほうがいい等ございましたら教えていただけると非常に嬉しいです。

今回はサンプルとして、クラスを作り、fugaメソッドを定義し、初期処理としてfugaを呼び出す流れになっている。

# JavaScriptコード :squirrel: 
クラスはないのでクロージャにして、`prototype`をつくり、コンストラクタからfugaメソッドを呼び出す

```.js
var Hoge = (function(value) {

  // 初期処理
  function Hoge(value) {
    this.hoge = value;
    this.fuga();
  }

  // fugaメソッド
  Hoge.prototype.fuga = function() {
    console.log("fuga");
  };

  return Hoge;
})();

new Hoge(10000000);

```
# Rubyコード :gem: 
classを作って、`initialize`から初期処理として、fugaメソッドを呼び出す

```.rb
class Hoge
  HOGE = "hoge".freeze

  # 初期処理
  def initialize()
    fuga
  end

  # fugaメソッド
  def fuga
    puts "fuga"
  end
end

Hoge.new()
```

# Pythonコード :snake: 
クラスを作って、`__init__`から初期処理として、fugaメソッドを呼び出す

```.py

class Hoge(object):
    HOGE = "hoge"

    # 初期処理
    def __init__(self):
        self.fuga()

    # fugaメソッド
    def fuga(self):
        print "fuga"

Hoge()
```

# PHPのコード :elephant: 
クラスを作って、`__construct`から初期処理として、fugaメソッドを呼び出す

```.php
<?php

class Hoge
{

    # 初期処理
    public function __construct()
    {
      $this->fuga();
    }

    # fugaメソッド
    private function fuga()
    {
      print "fuga";
    }
}

new Hoge();
```

# Javaのコード :coffee:
mainメソッドから、fugaメソッドを呼び出す

```.java
public class Hoge {
  private staitc final String HOGE = "hoge";

  // 初期処理
  public static void main(String[] args) {
    new Hoge().fuga();
  }
  
  // fugaメソッド
  public void fuga() {
    System.out.println("fuga");
  }
}
```

# 最後に
4つのコードを比較してみた。
`class`, `method`を書いてみて比較してみるとあまり変わりがなかったけど、各言語毎に少しの差がある
VMwareFusionを使用した、Vagrant

# はじめに。
* 技術進歩は早いので、直近のブログなどの方が参考になります。
* 1年以上経過している場合は当てにならないかもしれません。
* あくまで個人の備忘録です。間違いあれば指摘お願い致しますm(_ _)m

## はじめての投稿
初めての投稿です。markdownで書けるということで、最近自分の中で話題のmarkdownで記述中・・・。
楽でいいですね。ブログサービスもmarkdownで書けるようになると嬉しいのですが。
自分の知識を反映かつ備忘録として残していけるといいなぁ

## VMwareFusionを使用してVagrantを立ち上げた
* 動機
    * 仕事で使用しているVagrantを家でも使おう！ってことでやってみました。
* 用意するもの
    1. VMwareFusionのVagrantライセンス(2015/6/28現在価格約10000円)
    2. VMwareFusion本体(これいるのかわかりませんが、僕は他にも使うので、購入しました)
    3. 完全に忘れてましたが、vagrant入れておきましょう!
    
    ```
    $ brew cask install vagrant
    ```

* 手順
    1. vagrantライセンス購入後、メールが届くので、内容にあるサイトへ飛びライセンス取得
    2. コマンド入力
    
    ``` 
    $ vagrant plugin install vagrant-vmware-fusion 
    # path/to/は自分のライセンスのある場所に適宜変えてください
    $ vagrant plugin license vagrant-vmware-fusion path/to/license.lic
    $ vagrant plugin list
    $ vagrant init hashicorp/precise64
    $ vagrant up --provider vmware_fusion
    ```

上記の手順を行えば、Ubuntuで起動させたい方は完了です。後は、```vagrant ssh```でログインで仮想OSに入ってみましょう。

## 応用編
* 今回僕はCentOSを入れたかったので、上記の手順 + αを行いました
* CentOSで起動するには基礎手順に手を加える必要があります。
* [ここ](http://www.vagrantbox.es/)にあるOSを好きなものを取得
    * ただし、注意する点として、VMwareと書かれているものを取得しましょう
    * 僕はここでcentos7を取得し、見事に失敗しました／(^o^)＼ﾅﾝﾃｺｯﾀｲ
* 基礎手順の```vagrant plugin list```以降を変えます

```
$ vagrant box add [任意の名称] [取得したいOSのURL]
$ vagrant init [上記で付けた任意の名称]
$ vagrant up --provider vmware_fusion
```

これで、centosでのvagrant環境ができあがります。```vagrant ssh```でログイン後確認してみましょう
```vagrant@vagrant-centos-6```こんな感じで表示されたら問題なし

## 失敗
* メールに従ってコマンド打ったらubuntuがはいっちゃった
    * ```vagrant destroy```で環境壊してから、応用編手順で好きなOSが入るはず
* いらないOSをbox addしてしまった
    * ```vagrant box remove ・・・```で削除できる

OS取得時にVMwareをとってくるところさえ間違えなければ、すんなり行くはず。
僕は、何回も間違えて「なんで入らないんだろう？」となり、いくらCentOS入れてもUbuntuで立ち上がりイライラしましたw
わかっちゃえば楽です。
この後VMwareFusion立ち上げると、vagrantで立ち上げたOSが動いているのがわかります。
これ、終了しちゃうと```vagrant halt```と同じ意味になっちゃうんでお気をつけを・・・
まぁまた立ち上げればいいだけなんですけどw

多分、VMwareFusionは買わないとだめなはず。
ライセンスだけで動けば儲けもんですけどねぇ。
仮想ツールにこだわりなければ、無料でできますよ。
対応OSも豊富ですし、そっちが正解かも？
個人的にVirtualBoxが好きでないので、今回VMwareを使ってますが。
今日はまだ動かしただけ、apacheも入れてなければ何にもしてませんw
chefにするかansibleにするかも悩んでますし、apacheよりnginxでやりたいし、色々調べないとできないですね。
Elixirの主なString型関係のメソッド


よく使用する主要なStringメソッド。
覚え書き。

```StringSample.exs
str1 = "123"
int1 = String.to_integer(str1)
IO.puts str1 <> "2" # => "1232"
IO.puts int1 + 2    # => 125

str2 = "abc"
IO.puts String.upcase(str2) # => "ABC"

str3 = "param"
IO.puts String.to_atom(str3) # => :param

str4 = "Elixir"
IO.puts String.slice(str4, 1..3) # => "lix"

str5 = "   Elixir   "
IO.puts String.strip(str5)    # => "Eixir"
IO.puts String.lstrip(str5)   # => "Eixir   "
IO.puts String.rstrip(str5)   # => "   Eixir"

str6 = "a,b,c,d"
IO.puts String.replace(str6, ",", "-") # => "a-b-c-d"

str7 = "abcdefg"
IO.puts String.at(str7, 3)   # => "d"
IO.puts String.at(str7, -1)  # => "g"
```

わかりやすい。
後々、日本語の扱いも調べてみる。
gitの初期設定いろいろ


コマンド

```bash
# ユーザー設定
$ git config --global user.name "username"
$ git config --global user.email "email@address"

$ git config --global color.ui auto
```

エイリアス設定

```text:.bashrc
#User specific aliases and functions
alias gl='git log --graph --oneline'
```
対話形式で設定していたことをコマンドで設定する

サーバーを設定していると対話型になるところがあるけど、それを文章化するのも面倒だし、スクリーンショットを撮るのも面倒だし、何よりも自動化できないので、可能な限りコマンドだけで設定を完了しておきたい。

# コマンドで各種設定をする
環境は `Ubuntu 14.04` 。  
インストールするアプリの都合で今回はこのバージョンを使っている。

## ホスト名
ホスト名の変更と `hosts` の書き換え。

```bash
export HOSTNAME=example.jp
hostname $HOSTNAME
sed -i "s/^\(127\.0\.0\.1.\+localhost\)/\1 $HOSTNAME/" /etc/hosts
```

## エディタ
デフォルトエディタの設定を変更する。  
エディタは `nano` よりも `vim` の方が好み。

```bash
sudo update-alternatives --set editor /usr/bin/vim.basic
```

対話形式でエディタを選択したい場合はこうする。

```bash
sudo update-alternatives --config editor
```

## タイムゾーン

```bash
sudo sh -c 'echo "Asia/Tokyo" > /etc/timezone'
sudo dpkg-reconfigure -f noninteractive tzdata
```

対話形式でタイムゾーンを選択したい場合はこうする。

```bash
sudo dpkg-reconfigure tzdata
```


## NTP
```bash
sudo cp /etc/ntp.conf /etc/ntp.conf.org
sudo sed -i "s/^\(server\) \(.*\)/\1 ntp.nict.jp/" /etc/ntp.conf
```

> server 1.time.constant.com
> server 2.time.constant.com
> server 3.time.constant.com

上記が次のようになる。

> server ntp.nict.jp
> server ntp.nict.jp
> server ntp.nict.jp


## MySQL
```bash
export MYSQLPW=INPUT_PASSWORD
echo "mysql-server mysql-server/root_password password $MYSQLPW" | sudo debconf-set-selections
echo "mysql-server mysql-server/root_password_again password $MYSQLPW" | sudo debconf-set-selections
sudo apt-get -y install mysql-server

sudo cp /etc/mysql/my.cnf /etc/mysql/my.cnf.org
sudo sed -i "/\[mysqld\]/i default-character-set=utf8\n" /etc/mysql/my.cnf
sudo sed -i "/\[mysqldump\]/i character-set-server=utf8\n" /etc/mysql/my.cnf
sudo sed -i "/\[mysql\]/i default-character-set=utf8\n" /etc/mysql/my.cnf
```

`debconf-set-selections` を設定せずに `mysql` をインストールするとrootのパスワードを聞かれる。

## Supervisor
Supervisor用の設定ファイルもコマンドで作成。  
Supervisorにかぎらず、ファイルを作成する場合に使える。  
sudoにコマンドを渡したいときは `sudo sh -c "command"` とするとパイプなども期待通りに使える。

```bash
sudo sh -c "cat <<EOF > /etc/supervisor/conf.d/xvfb.conf
[program:xvfb]
priority=1
user=MYAPP
command=Xvfb :1 -screen 0 800x600x24
autostart=true
autorestart=true
directory=/opt/visionect
stdout_logfile=/var/log/xvfb-stdout.log
stderr_logfile=/var/log/xvfb-stderr.log
EOF"

sudo supervisorctl reread
sudo supervisorctl add xvfb
sudo supervisorctl status
```

Supervisor用の設定ファイルを作成したら、読み込ませることを忘れずに。
クライアント側だけでローカルの動画を再生しつつ任意のタイミングでサムネイル画像を生成する

# 目的
ユーザに動画ファイルをアップロードしてもらうような機能を持つWebアプリで、
サムネイル画像を生成する場合はサーバ側でffmpegなどを使って生成することが多いと思います。
サーバ側ではなく、クライアント側でローカル動画ファイルからサムネイル用画像を作れないか調べました。

# 機能
おおまかに次の2つの機能を実装できれば実現できそうです。
1. ローカルの動画をvideoタグで再生する
2. videoタグから画像を生成する

## ローカルの動画をvideoタグで再生する
File APIの[Blob URLs](http://caniuse.com/#feat=bloburls)というAPIが使えれば実現できます。

```js:inputでローカル動画を選択したときに再生する
inputNode.addEventListener('change', function (event) {
    var URL = URL || webkitURL;
    var file = event.target.files[0];
    document.querySelector('video').src = URL.createObjectURL(file); // inputで選択した動画を再生する
}, false);
```

URL.createObjectURLを使えば簡単にローカルの動画を再生できます。
実際のコードはさらにブラウザの対応状況チェックや、再生可能な動画ファイル形式チェックなどが必要になると思います。

## videoタグから画像を生成する
canvasのdrawImageメソッド使えばこちらも簡単に動画から画像を切り出せます。

```js
captureButton.addEventListener('click', function capture() {
    var cEle = document.querySelector('canvas');
    var cCtx = cEle.getContext('2d');
    var vEle = document.querySelector('video');

    cEle.width = vEle.videoWidth;
    cEle.height = vEle.videoHeight;

    cCtx.drawImage(vEle, 0, 0); // canvasに関数実行時の動画のフレームを描画
}, false);
```

# デモ
http://geekduck.github.io/localvideocapture/
![video.gif](https://qiita-image-store.s3.amazonaws.com/0/16039/b6ec2689-6b26-ee3a-588e-78a67f55898f.gif)

# まとめ
手元のモバイル端末(iOS8 Safari, Android Chrome)でも問題なく動きました。
iPhoneではサムネイル画像を作りたいタイミングで再生を一時停止し、
プレイヤーを閉じてキャプチャボタンを押下すればサムネイル画像を生成できます。

動画のフレームレベルでサムネイルを指定したいときなどは使えませんが、
ユーザがある程度自由なタイミングでサムネイルを作れれば良いのであればかなり使えると思います。
SQLでスネークケースをキャメルケースに

#SQL

```sql
SELECT 
    LOWER(SUBSTR(BASE,1,1)) || SUBSTR(REPLACE(INITCAP(REPLACE(BASE,'_',' ')),' ',''),2) 
FROM 
    (
    SELECT 
        'ABC_DEF_GHI' AS BASE 
    FROM DUAL
    )
```

#結果
>abcDefGhi

[SQL Fiddleでためした](http://sqlfiddle.com/#!4/9eecb7/4250)

ばぐったらごめんなさい。
USER_TAB_COLUMNSからjavaBeanをSQLから生成したい場合とかに使えるかも。

普通にjavaでやったほうが早いとかExcelでいいじゃんとかいう指摘は聞きません。
railsのroutesで今更気がついた事


```
Prefix Verb            URI Pattern                                      Controller#Action

user_jobs  POST        /users/:user_id/jobs(.:format)                   jobs#create

 user_job  DELETE      /users/:user_id/jobs/:id(.:format)               jobs#destroy

           POST        /users(.:format)                                 users#create

  new_user GET         /users/new(.:format)                             users#new

 edit_user GET         /users/:id/edit(.:format)                        users#edit

      user GET         /users/:id(.:format)                             users#show

           PATCH       /users/:id(.:format)                             users#update

           PUT         /users/:id(.:format)                             users#update

           DELETE      /users/:id(.:format)                             users#destroy

      root GET         /                                                users#index
```

`user_jobs  POST  /users/:user_id/jobs(.:format) jobs#create`
のアクションで、

```Ruby:jobs_controller.rb
def create
    @user = User.find(params[:user_id])
    @job = @user.jobs.create(job_params)
    redirect_to user_path(@user.id)
  end

  def job_params
    params[:job].permit(:name)
  end
```

`redirect_to user_path(@user.id)`これってなんでredirect_to user_path(:user_id)じゃなのかな？っと思いました。
試しに変えてみるとエラーになりました。

ActiveRecord::RecordNotFound in UsersController#show
Couldn't find User with 'id'=user_id

```Ruby:Extracted source (around line #44):
  def set_user
    @user = user.find(params[:id])
  end
```

users_controller側には:user_idがなく、jobs_controller側で:idが使われているので、
`redirect_to user_path(@user.id)`として渡してあげれば、`@user = user.find(params[:id])`で受けられる。
そういう事をちゃんとroutesに書いてあるという事に今更気がつきました。
Groovyで文字列やファイルを暗号化・復号化する


Javaの標準暗号化APIを使うので目新しい所はないけど、Groovyだとサクッと試せる点が良かった。

ホントは、暗号化モードをデフォルトのECBモードじゃなくて、CBCモードぐらいの方が良いんだろうけど、とりあえずの暗号化・復号化ということで。

CBCモードに変更するのは、ソースコードとしては難しくないんだけど、実際の開発時には、IVをどこにどう保存するかが悩ましい…。

## 文字列の暗号化
```Groovy
def target = "testtest_test"
def encodeKey = encode(target.getBytes(), key)

def crypt(byte[] bytes, SecretKeySpec key) {
  def cph = Cipher.getInstance("AES")
  cph.init(Cipher.ENCRYPT_MODE, key)

  return cph.doFinal(bytes)
}
```

## 暗号化文字列の復号化
```Groovy
println new String(decode(encodeKey, key))

def decrypt(byte[] bytes, SecretKeySpec key) {
  def cph = Cipher.getInstance("AES")
  cph.init(Cipher.DECRYPT_MODE, key)

  return cph.doFinal(bytes)
}
```

## ファイルの暗号化
```Groovy
def fileByte = new File("hoge.gif").getBytes()
// cryptメソッドは文字列の時と同じ
def encFile = crypt(fileByte, key)

new File("hoge_crypt.gif").setBytes(encFile)
```

## 暗号化ファイルの復号化
```Groovy
// decryptメソッドは文字列の時と同じ
def decFile = decrypt(encFile, key)
new File("hoge_decrypt.gif").setBytes(decFile)
```

## 全コード
```Groovy
import javax.crypto.Cipher
import javax.crypto.spec.SecretKeySpec
import java.nio.charset.Charset

final String keyword = "encodekey1234567"
SecretKeySpec key = new SecretKeySpec(keyword.getBytes(Charset.forName("UTF-8")), "AES")

// 文字列を暗号化 → 復号化
def target = "testtest_test"
def encodeKey = encode(target.getBytes(), key)
println new String(decode(encodeKey, key))

// ファイルを暗号化 → 復号化
def fileByte = new File("hoge.gif").getBytes()
def encFile = encode(fileByte, key)

new File("hoge_crypt.gif").setBytes(encFile)

def decFile = decode(encFile, key)
new File("hoge_decrypt.gif").setBytes(decFile)

// 暗号化
def crypt(byte[] bytes, SecretKeySpec key) {
  def cph = Cipher.getInstance("AES")
  cph.init(Cipher.ENCRYPT_MODE, key)

  return cph.doFinal(bytes)
}

// 復号化
def decrypt(byte[] bytes, SecretKeySpec key) {
  def cph = Cipher.getInstance("AES")
  cph.init(Cipher.DECRYPT_MODE, key)

  return cph.doFinal(bytes)
}
```
Python初心者のためのOpenCV

とりあえず、[Python(x,y)](Python(x,y) - Downloads.)などのディストリビューションをインストールして
Spyder統合環境が起動できるようになったけれども、
Pythonを使うのは、はじめてという人向けにOpenCVのサンプルの動かし方を説明します(注)。

###**OpenCVのサンプルの動かし方**

####**(1) コマンドプロンプトからの実行**
コマンドプロンプトを開く。
ディレクトリを移動する。
cd （opencvのディレクトリ)\sources\samples\python2

python スクリプト名

コマンドの引数が必要なものは

USAGE: facerec_demo.py </path/to/images> [</path/to/store/images/at>]
などのように、使い方を表示します。
その場合には、usageの指定のように引数を与えてコマンドラインで動作させます。


####**(2)Spyder統合環境での実行**

Spyder統合環境からコマンド引数(sys.argv)の値を設定したい場合には
[Run][Configure]で
[Command line options]
を指定しておいてから[Run][Run]を選択することで動作させることができます。


####**(3)スクリプトアイコンのダブルクリックによる起動**
お勧めしません。

正常に動作しても、スクリプトによっては、正常な表示をコンソールにだして、すぐさま終了してコンソールを閉じてしまいます。
エラーが生じたときも、瞬時にコンソールを閉じてしまうのでエラーの内容を確認できません。

####**(4)IDLEからの実行**
標準配布のTkベースの実行環境ですが、
Spyder統合環境に慣れてしまうと、あまりお勧めしません。
残念な点は、標準出力に出力するスクリプトを作って実行するとコマンドプロンプトの環境に比べて桁違いに遅くなる点です。
コマンド引数を利用して動作するスクリプトはコマンド引数が指定されたかったとみなされます。

(1)～(4)の全ての場合に共通ですが、
（Pythonのインストール先のディレクトリ)\Lib\site-packages
にcv2.pydをコピーしておくのは必要です。

OpenCV3.0を利用する場合でも、cv2.pydを同様にコピーすれば、利用可能になります。

[OpenCV3.0をPythonにインストール]http://python-gazo.blog.jp/opencv/ver3_install


このようにして、配布のままのスクリプトを動作できるようになったら、
次にスクリプトにファイル名がハードコーディングされていたら、
入力ファイル名を変更して実行させてみてください。

1枚の静止画に対してする処理だったら、連続した静止画のリストに対して処理する、あるいはAVIファイルを開いて一連の処理をするように書き換えてみます。

そのような書き換えをしながら、pythonになれていってみてください。



###**参考情報**
「Pyconjp 2014 OpenCVのpythonインターフェース入門」
http://www.slideshare.net/payashim/pyconjp-2014-opencv

「各OSにおいて、OpenCVをpythonから使う方法」
http://www.slideshare.net/katsuhiromorishita/opencvpython?related=1

「コンピュータビジョンの最新ソフトウェア開発環境 SSII2015 チュートリアル hayashi」
http://www.slideshare.net/payashim/ssii-2015-hayashi

「Face Recognition with OpenCV and scikit-learn」
http://www.slideshare.net/lucidfrontier45/face-recognition-with-opencv-and-scikitlearn

「Pythonによる画像処理について」
http://www.slideshare.net/yasutomo57jp/python-43606096


「画像処理でのPythonの利用」
http://www.slideshare.net/yasutomo57jp/pythona




必見「OpenCV-Python Tutorials」
http://qiita.com/nonbiri15/items/facf9e6cf4f73cb69d9b

注：```imprort cv2```で失敗した方は、cv2.pyd をsite-packages にコピーしてあるか確認してください。
OpenCVのダウンロードした一式の中のcv2.pydがあります。それをお使いのバージョンのpythonのLib\site-packages
例　C:\Python27\Lib\site-packages
にコピーしてください。
PhpStorm私的メモ


## Gitでコミットする

```
command + k でコミットダイヤログ
```

## Postfix completion

PhpStorm9からの機能。メールサーバーのPostfixは関係ない。

```
$user->isYoung().if
```

とかくと、

```
if ($user->isYoung()) {

}
```
と展開される。

使える用語は下記
https://plugins.jetbrains.com/plugin/7342?pr=

```
.if/.else/.var/.null/.notnull/.not/.for/.while
.arg/.cast/.new/.fori/.forr/.field/.par/.return
.switch/.throw/.assert/.synchronized/.instanceof
```

## SearchEverywere

なんでも検索

```
Shift + Shift
```


# コードフォーマット

```
Option + Command + l
```

# Setter/Getterの生成、コンストラクタの生成

```
class 定義の中で Control + Enter 
```

## Live Edit

```
chrome拡張入れるぽい。
細かいやり方わからん。要調査
```

## Typo 無視

```
Option + Ener
```

## 定義場所へ移動

```
Command + b
```

もしくは、

```
Command + クリック
```


## その他

- spy.js 便利そう。
Proxy設定あれこれ

##環境変数

```
export HTTP_PROXY=http://your.proxy.server:8080
export HTTPS_PROXY=http://your.proxy.server:8080
export NO_PROXY=localhost,192.168.*,127.0.*
export http_proxy=${HTTP_PROXY}
export https_proxy=${HTTP_PROXY}
export no_proxy=${NO_PROXY}
```

## wget
以下を`~/.wgetrc`に書く

```
# Proxy Setting
http_proxy=http://your.proxy.server:8080
https_proxy=http://your.proxy.server:8080
proxy_user=username
proxy_password=password
```

## pip
`HTTP_PROXY`を見ている

## conda
`~/.condarc`に以下を書く

```
proxy_servers:
    http: http://your.proxy.server:8080
    https: http://your.proxy.server:8080
```

##intellij
`File > Settings > Appearence & Behavior > System Settings > HTTP Proxy `

##sbt
JVMのオプションに以下を追加

```
-Dhttp.proxyHost=your.proxy.server
-Dhttp.proxyPort=8080
-Dhttps.proxyHost=your.proxy.server
-Dhttps.proxyPort=8080
```

intellijの場合は`File > Settings > Build, Execution,Deployment > Build Tools > SBT`


##gradle
http://qiita.com/hishida/items/9479fb64a016032c0938#1-2
【bash】エイリアスを追加

時々忘れそうになるのでメモ。

`$ vi .bashrc`

でbashrcを開く。そして

`alias エイリアス名='コマンド'`

でエイリアスを追加。
コマンドが続く場合はこの下に記述していきます。

保存したら、
`$ vi .bash_profile`

で bash_profileを開いて
`source ~/.bashrc`
を追加。そして保存。

最後に
`$ source .bash_profile`
を実行してOK。
【Mac OSX】C++でOpenCVを利用したソースコードのコンパイル

test.cppというOpenCVを利用したC++のファイルをコンパイルする際のメモ。
環境としては、GCCの皮を被ったClangを使用。
OpenCVはHomebrewで導入。

```$ g++ -o test test.cpp `pkg-config --cflags opencv` `pkg-config --libs opencv` ```
とりあえずこれで実行。

そしたら

```
ld: library not found for -llibtbb.dylib
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

こんなんが出てきました。
しょうがないから以下のように編集して頑張りましょう。

`/usr/local/lib/pkgconfig/opencv.pc`
を開いて
```-llibtbb.dylib```　の部分を
```/usr/local/lib/libtbb.dylib```
に変更。これでどうにかなります。
と言いたいのですが、念のため、OpenCVを再インストール。

```
$ brew uninstall opencv
$ brew install opencv
```

これでOK。

[参考]
[opencv - ld: library not found for -llibtbb.dylib - Stack Overflow](http://stackoverflow.com/questions/23363678/ld-library-not-found-for-llibtbb-dylib)
Fluentd + BigQuery の Tweet データ収集システムに S3へのバックアップ機能を追加

# はじめに
今回は、[Fluentd + BigQuery による Tweet データ収集](http://qiita.com/Salinger/items/9d47ced748ff7191570a) で作成した Fluentd + BigQuery の Tweet データ収集システムに、
S3へのログバックアップ機能を追加する。

これで、BigQuery側に障害が発生してデータが記録できなかった場合でも、
S3側に記録したログからの復旧が行える。

# IAM User の作成
AWSのコンソールにログイン後、
`Identity & Access Management` -> `Users` -> `Create New Users` をクリック。
Enter User Names:  1. に `fluentd` を入力し、`Create` をクリック。
`Show User Security Credentials` をクリックし、`Access Key Id` と `Secret Access Key` を確認する。
`Download Credentials` をクリックすると、これらが記述されたファイルがダウンロードできる。

次に、作成したユーザー `fluentd` を選択し、
`Permissions` -> `Managed Policies` -> `Attach Policies` をクリック。
`AmazonS3FullAccess` を選択し、`Attach Policy` をクリック

これで他のプログラムから S3 を読み書きするための User が作成できた。

# S3 バケットの作成
AWSの管理コンソールから、`S3` -> `Create Bucket`  をクリックし、
任意の名前のS3バケットを作成する。

# fluentd の設定
td-agent を使用している場合、S3用の出力プラグイン [fluent-plugin-s3](https://github.com/fluent/fluent-plugin-s3) は
デフォルトでインストールされているので特にインストール等は必要ない。

まず下記コマンドでログ出力先のディレクトリを作成する。

```
$ sudo mkdir /var/log/td-agent/s3
```

次に `/etc/td-agent/td-agent.conf` の `<match input.twitter.sampling> ~ </match>` 部分に、
下記の `<store> ~ </store>` 部分を追記する。

```
<match input.twitter.sampling>
  type copy

  <store>
    type s3

    aws_key_id YOUR_AWS_KEY_ID
    aws_sec_key YOUR_AWS_SECRET_KEY
    s3_bucket YOUR_S3_BUCKET_NAME
    s3_region ap-northeast-1
    path streaming_api_logs/
    buffer_path /var/log/td-agent/s3

    time_slice_format %Y%m%d%H%M
    s3_object_key_format %{path}%{time_slice}_%{index}_%{hostname}.%{file_extension}
    time_slice_wait 5m
    utc

    buffer_chunk_limit 256m
  </store>

   ...
```

# Fluentd の再起動

```
$ sudo service td-agent stop
$ sudo service td-agent start
```

指定した s3 バケットにデータが記録されているのが確認できればOK。

# 参考資料
* [Amazon S3 Output Plugin](http://docs.fluentd.org/articles/out_s3)
* [fluent-plugin-s3](https://github.com/fluent/fluent-plugin-s3)
Erlang Web Framework Zotonicのクイックスタートを試す

# [Zotonic](http://zotonic.com/)

Zotonicのクイックスタートを試した記録です。

## Zotonicの簡単な紹介
Zotonicは、Erlangで書かれたコンテンツ管理システムで、リッチ·インターネット·アプリケーションとWebパブリッシングに重点が置かれたフレームワークです。



## インストール準備

### 試した環境
・VirtualBox Version 4.3.10_Ubuntu
・ゲストOS：Ubuntu Desktop 14.04 LTS
・ホストOS：Ubuntu Desktop 14.04 LTS

### Erlang/OTPのインストール
ここでは、ソースからOTP 17.0をインストールします。

```
$ sudo apt-get install build-essential libncurses5-dev libssl-dev
$ wget http://www.erlang.org/download/otp_src_17.0.tar.gz
$ tar zxvf otp_src_17.0.tar.gz
$ cd otp_src_17.0
$ sudo ./configure
$ sudo make
$ sudo make install
```

### その他のライブラリのインストール
Zotonicには、postgresql、imagemagick、gitが必要です。

```
$ sudo apt-get install postgresql imagemagick git
```

## Zotonicインストール
gitからクローンして、release 0.12をインストールします。

```
$ git clone https://github.com/zotonic/zotonic.git
$ cd zotonic
$ git checkout release-0.12.x
$ make
```

## Zotonicの設定

### postgresqlの設定
pg_hba.confを開いて

```
$ sudo vi /etc/postgresql/<pg version>/main/pg_hba.conf
```

次の行を追加します。

```
# Zotonic settings
local   all         zotonic                           ident
host    all         zotonic     127.0.0.1/32          md5
host    all         zotonic     ::1/128               md5
```

設定を変更するため、postgresqlを再起動します。

```
$ sudo service postgresql restart
```

zotonicがpostgresqlを操作できるように、ユーザにzotonicを追加します。

```
CREATE USER zotonic WITH PASSWORD 'zotonic';
```

DBを持つサイトを追加するときに必要なので、zotonicユーザにDtabaseを作成する権限を付与します。

```
ALTER USER zotonic CREATEDB;
```

## Zotonicの起動
デバッグモードで起動します

```
$ bin/zotonic debug
```
zotonic statusサイトが表示されます。
このサイトで、サイト管理（起動や停止、更新）ができます。

```
http://localhost:8000/
```

zotonic statusサイトへログインする時のパスワードは、下記のファイルで確認できます。ファイルを編集すれば、パスワードの変更もできます。

```
$ vi ~/.zotonic/zotonic.config.
```

## 新しいサイトの追加

追加するサイト名をyoursiteとして、/etc/hostsに次を追加します。

```
127.0.0.1 yoursite
```

blogスケルトンを使った新しいサイトを追加します。
addsiteコマンドを実行するときは、zotonicが実行中でないと成功しません。注意してください。

```
bin/zotonic addsite -s blog yoursite
```

zotonicの再ビルドで、データベースの初期化します。

```
$ make 
$ bin/zotonic debug
```

追加したサイトは次のURLでアクセスできます。

```
http://yoursite.dev:8000
```

次の場所にサイト用の設定ファイルがあるので、今後必要に応じて編集します。

```
$ vi user/sites/yoursite/config
```

## 利用可能なスケルトン

新しいサイトの追加の手順で、次の4種類のスケルトンを試せます。

* blog
* basesite
* empty
* nodb
ClickOnceアプリケーションをコマンドラインで発行する

コマンドラインで発行場所を指定するには、PublishDirをオーバーライドする。
PublishUrlはIDEによる発行でしか使われない。
ついでにApplicationRevisionをオーバーライドしてやればリビジョン毎にフォルダを分けられ、いざというときにロールバックが可能になる。jenkinsのジョブ番号でも渡してやれば良いだろう。

```bat
>msbuild /t:publish /p:PublishDir=\\hostname\deploy\ /p:ApplicationRevision=101 /p:Configuration=release
```


### 参考（というか答えそのもの）
http://www.atmarkit.co.jp/fdotnet/dotnettips/511publishfromcmd/publishfromcmd.html
S3のVPCエンドポイントがあるとaws-sdk-v1のRouteTable#routesがコケる

aws-sdk-v1でRouteTable#routesがなんかエラーになるなと思ったら、

```
$ pry
[1] pry(main)> require 'aws-sdk-v1'
=> true
[2] pry(main)> ec2 = AWS::EC2.new
=> <AWS::EC2>
[3] pry(main)> rt = ec2.route_tables['rtb-26882xxx']
=> <AWS::EC2::RouteTable id:rtb-26882xxx>
[4] pry(main)> rt.routes
NoMethodError: undefined method `destination_cidr_block' for #<Hash:0x007f895ba35480>
from /Library/Ruby/Gems/2.0.0/gems/aws-sdk-v1-1.64.0/lib/aws/core/data.rb:101:in `method_missing'
```

S3のVPCエンドポイントを使ってるとダメそう。destination_cidr_blockはないよなぁ。

```
[5] pry(main)> rt.send :route_set
=> [{:destination_cidr_block=>"192.168.0.0/24", :instance_id=>"i-5f9f66ad", :instance_owner_id=>"7890350xxxxx", :network_interface_id=>"eni-30a33146", :state=>"active", :origin=>"CreateRoute"},...
 {:gateway_id=>"vpce-746782xx", :state=>"active", :origin=>"CreateRoute"}]
```

そろそろv1使うのやめないとなぁ。
Azure仮想マシンのIPアドレスは必ずDHCPで

こんにちは。日本マイクロソフトの佐々木([@ksasakims](https://twitter.com/ksasakims))です。
前回の『[Azure仮想マシンは「仮想ネットワークに配置」すべし](http://qiita.com/ksasakims/items/2f495c8ecdd38168039b)』に続いて、Azure仮想マシンを使う上での基本事項を書いておこうかと思います。
※ 以降、Windowsを例に説明しますが、Linuxを使う場合にも同様に当てはまる話です。

# 自分のアドレス、DNSサーバーのアドレス
早い話が、必ずこうしてくださいということです↓
![ncpa.cpl](http://sasaqiita.blob.core.windows.net/img/20150627-ip_dns.png)

なぜ、静的に設定してはいけないのでしょうか。それはですね、

__静的に設定しても、いつの間にかデフォルト設定(「自動的に取得」）に戻ってしまう__

からです。「いつの間にか戻ってしまう」なんて無責任な話と思われるかもしれませんが、ちゃんと理由があります。

# 仮想マシンの再作成
Azure仮想マシンは、Azureのデータセンターに大量に配備されたHyper-Vホスト(=物理マシン)上で稼働しているわけですが、次のような場合に「仮想マシンの再作成」が行われます。

- ユーザーが仮想マシンのサイズを変更した場合（D1をD2にした等）
- 仮想マシンが別のHyper-Vホストへ移動された場合（物理マシンの障害が検知された場合のService Healing処理等)

このような場合、「既存の仮想マシンをそのまま別ホストへマイグレーション」する形ではなく、「既存の仮想マシンのVHDファイルだけを再利用して、新たな仮想マシンを作る」形で再構成が行われます。そのため、仮想マシンに接続される仮想NICも、新たなものが用意されるのです。
当然、ゲストOSでは「新しいNICが接続された」と認識されます。新しいNICはデフォルトの「アドレスを自動的に取得」の状態となり、古いNICに静的に設定されていた情報は役に立たなくなります。

# 古いNICの情報は…
「あれ、じゃぁ古いNICの情報ってもしかして残ってる？」と思ったあなたは鋭い。はい。残っています。試しに確認してみましょう。

1. Azure仮想マシンにログオンし、デバイスマネージャ(devmgmt.msc)を起動します。
1. 「表示」→「非表示のデバイスの表示(W)」をチェックします。  
![非表示のデバイスの表示](http://sasaqiita.blob.core.windows.net/img/20150627-devmgmt-01.png)
1. 「ネットワーク アダプター」のところを確認します。  
 ![NICの一覧](http://sasaqiita.blob.core.windows.net/img/20150627-devmgmt-02.png)

**NICの墓場や！**

これは、私が今この記事を書くのに使っている仮想マシンなのですが、頻繁にサイズを変更していることもあってこんな風になっています。アイコンの色が薄くなっているのが「実体のない過去のNIC」です。

# でも「静的」に設定できますよね？
Azureの管理ポータルでは、仮想マシンのIPアドレス設定で、下図のように「動的」と「静的」が選べます。
![IPアドレスの動的・静的設定](http://sasaqiita.blob.core.windows.net/img/20150627-ip_dynamic_static.png)
大変紛らわしくて申し訳ありませんが、ここで「動的」「静的」のどちらを選んでも、IPアドレスは結局DHCPで配られます。その、DHCPで配られるIPアドレスの値が、「サブネット内で空いているアドレスから小さい順に割り当てられるか」それとも「この設定画面で指定したIPアドレスが毎回割り当てられるか」という意味での「動的」「静的」なのです。

# DNSサーバーのアドレスは？
「NICのIPアドレスはわかった。しかし、DNSサーバーのアドレスは、どうやって別の仮想マシンに伝えれば良い？」
はい。仮想ネットワークのプロパティで設定できます。
![仮想ネットワークでのDNS設定](http://sasaqiita.blob.core.windows.net/img/20150627-vnet-dns.png)
ここで設定したIPアドレスが、この仮想ネットワークに参加してくる仮想マシンに対して、DNSサーバーのアドレスとして配られるわけです。

**え、仮想マシンを仮想ネットワークに配置してない？**
[前回の記事](http://qiita.com/ksasakims/items/2f495c8ecdd38168039b)を読んで出直してください！

# 関連情報
障害からの自動回復処置としてのホスト間移動は、もうずいぶん前ですがブログに書いたことがあります。ご参考までに。
[「Windows Azure の仮想マシンは HAVM」](http://blogs.technet.com/b/ksasaki/archive/2013/01/29/windows-azure-havm.aspx)

それでは！
標準偏差(ExcelのSTDEV関数)の算出をC言語で実装する

標準偏差の算出を、チープなシステムにC言語で実装した際の覚書です。

## 標準偏差の算出
まず、分散(var)を求めます。
分散をデータ数-1で割ったルートが標準偏差(stdev)となります。

    var = Σ[i=1→n]((data[i] - mean)^2)
    stdev = √(var / (n - 1))

    var: 分散
    mean: 平均値
    stdev: 標準偏差

## 実装
### 1. 対象のデータをすべてメモリに取得出来る場合
標準偏差を算出する関数は、データとデータ数を引数に取ります。
    
 ```c:stdev.c
 #include <math.h> // sqrt()

 double stdev(int *data, int n) {
   int sum = 0;
   double mean;
   double var = 0.0;
   int i;
 
   for (i = 0; i < n; i++) {
     sum += data[i];
   }
   mean = (double)sum / n;
 
   for (i = 0; i < n; i++) {
     var += (data[i] - mean) * (data[i] - mean);
   }
   return sqrt(var / (n - 1));
 }
```

使い方は、

```c:
// データ数は20
int data[] = {
    0, 0, 0, -1, -1, 2, -1, -1, 2, 0,
    -2, 0, -2, 1, 0, 1, -2, 0, 0, 2
};
double sd = stdev(data, 20); // => sd: 1.252366
```

### 2. データ数が多くて、すべてをメモリに保持できない場合
私の実装システムでは、データ数が多く、データを保持することができませんでした。
分配法則 **(a - b)^2 = a^2 - 2ab + b^2** でvarを展開すると

    var = Σ[i=1→n]((data[i] - mean)^2)
        = Σ[i=1→n](data[i]^2 - 2(data[i] * mean) + mean^2)
        = Σ[i=1→n](data[i]^2) - (2 * Σ[i=1→n](data[i]) * mean) + n * mean^2

となり、データの総和とデータを2乗したものの合計から、標準偏差を算出できます。
これなら、データを保持するのと比べて、必要なメモリが少なくて済みます。

```c:stdev.c
#include <math.h> // sqrt()

double stdev(int sum, int sqsum, int n) {
  double mean;
  double var;

  mean = (double)sum / n;

  var = sqsum - (2 * sum * mean) + (mean * mean * n);
  return sqrt(var / (n - 1));
}
```

使い方は、

```c:
// データ数は20
int data[] = {
    0, 0, 0, -1, -1, 2, -1, -1, 2, 0,
    -2, 0, -2, 1, 0, 1, -2, 0, 0, 2
};
int sum = 0;    // データの合計
int sqsum = 0;  // データを2乗したものの合計

for (i = 0; i < 20; i++) {
  sum += data[i];
  sqsum += data[i] * data[i];
}

// 渡すときに、データは保持しておく必要はなし
double sd = stdev(sum, sqsum, 20); // => sd: 1.252366
```

## メモ 
* varをnで割ると、ExcelのSTDEVP関数となる  
```sqrt(var / n); // STDEVP```
* 対象が標本データ(サンプリング)の場合はSTDEV、母集団そのもの(全数)の場合はSTDEVP
MIN_FLOATとMAX_FLOATを使う

データの最大値と最小値を求めるときは、データを順に読んでいくときにそれまでの最大値または最小値と大小を比べていきます。

その場合最大値と最小値の初期値を設定する必要がありますが、これを0でセットしてしまうと最小値が正の数の場合や、最大値が負の数の場合に正しい結果が得られなくなってしまいます。

これを回避するには初期値にMIN_FLOATとMAX_FLOATをセットします。

```java

float dataMin = MAX_FLOAT;
float dataMax = MIN_FLOAT;
```

int型にはMIN_INT,MAX_INTを使います。

```java

float dataMin = MAX_INT;
float dataMax = MIN_INT;
```