OmniAICreator/Qiita-1.07M huggingface dataset:
Arduino Uno と Arch Linux を接続

Arduino と、Arch Linux を USB で接続しました。

必要なハード
　Arduino Uno 本体
　USB　ケーブル　 Aオス　- Bオス
　　　Arduino　の　電源供給は、USB から行います。


必要なソフト
　Arduino IDE
>arduino-1.8.15-linux64.tar.xz
>[Arduino IDE 1.8.15](https://www.arduino.cc/en/software) からダウンロード
>インストールは、解凍してから、install.sh を実行

>```bash
tar Jxfv arduino-1.8.15-linux64.tar.xz
cd arduino-1.8.15
sudo ./install.sh
```

設定

>```bash
sudo chmod 777 /dev/ttyACM0
```

Arduino IDE のアイコンがデスクトップにできるので、そのアイコンをクリックして起動
ポートの設定
　Tools -> Port で、/dev/ttyACM0 をチェック

サンプルプログラムのロード
　File -> Examples -> 01.Basics -> Blink
  Upload （右矢印）をクリックすれば、プログラムが、USB 経由で、Arduino に送られ、実行されます。
　ボード上の LED が、１秒毎に、点滅します。

![arduino_jul2201.png](https://qiita-image-store.s3.amazonaws.com/0/179446/f12db732-21e8-f124-09bd-d266a6ed3b5f.png)

サンプルプログラムを改造して、点滅間隔を変えてみます。
プログラムを編集して、Upload します。

![arduino_jul2202.png](https://qiita-image-store.s3.amazonaws.com/0/179446/cfd27285-060f-9b28-5e88-e4181bb58e0a.png)

```text:Blink_modified/Blink_modified.ino
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
  digitalWrite(LED_BUILTIN, HIGH);
  delay(3000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
}
```
機械学習を英語ビデオで学ぶサイトまとめ

機械学習、盛り上がってますね。いつの日かクイックソートのようにロジックを知らなくても無意識に使える日が来るのでしょうか？
とにかくエンジニアにも数学と英語が必須な時代になりましたね。。。:sob:


グーグルのMartin Görner博士の３時間近いロングなビデオです。
MNISTをメインに、クロスエントロピー、Softmax、バックプロパゲーション、CNN、RNNと幅広く説明しています。
インド人？ぽい発音ですが、逆に聞き取りやすいです。
https://www.youtube.com/watch?v=vq2nnJ4g6N0&t=5265s&list=PL635lD4BqMFwg9TRzQPWGRrAOQBd41ISK&index=4

スタンフォードのフェイフェイ リー博士、今はグーグルAIのチーフサイエンティストです。
有名なスタンフォードの講義CS231nと呼ばれるものです。ゼロから作るの斎藤さん著書でも引用されています。
実際の講義はAndrejさんがやってます。かなり早口でハイレベルな内容なので難易度は高いです。
https://www.youtube.com/watch?v=g-PvXUjD6qg&index=5&t=19s&list=PL635lD4BqMFwg9TRzQPWGRrAOQBd41ISK

Siraj RavalさんのYouTubeチャンネル。とにかく陽気です。ハッピーな人です。手がよく動く。。。
インド人風ですが、ナチュラルな英語を話し、聞き取りやすいです。
https://www.youtube.com/channel/UCWN3xxRkmTPmbKwht9FuE5A
Udacityでも見ることができます。
https://www.udacity.com/course/deep-learning-nanodegree-foundation--nd101

HarrisonさんのYouTubeチャンネル。
Pythonを中心に機械学習を教えています。
アメリカ人の普通の英語です。
https://www.youtube.com/channel/UCfzlCWGWYyIQ0aLC5w48gBQ

グーグル提供のTensorFlowの紹介ビデオです。
https://www.youtube.com/playlist?list=PLOU2XLYxmsIIuiBfYad6rFYQU_jL2ryal

若い女性のゆっくりした、機械的?な英語なので、英語が苦手な人でも聞き取りやすいと思います。
英語の勉強にもなります。
内容はコンセプト的な機械学習の紹介ビデオです。
https://www.youtube.com/watch?v=MrijcdNl_U4&list=PL-XeOa5hMEYxNzHM7YLRjIwE1k3VQpqEh

先日のGoogle I/O'17のビデオです。TensorFlow、Kerasの紹介です。
後半の人の英語は少し癖があり聞き取りは難しいです。
https://www.youtube.com/watch?v=5DknTFbcGVM&index=7&list=PL635lD4BqMFwg9TRzQPWGRrAOQBd41ISK

TensorFlow Dev Summit 2017
https://www.youtube.com/watch?v=mWl45NkFBOc&list=PLOU2XLYxmsIKGc_NBoIhTn2Qhraji53cv

機械学習では言わずと知れた、Andrew Ng氏のビデオ。
少し中国語なまりがあるので聞き取りは難しいです。
https://www.youtube.com/watch?v=F1ka6a13S9I&t=392s
Courseraも有名ですね。
https://www.coursera.org/learn/machine-learning

線形代数のチュートリアルビデオ
https://www.youtube.com/watch?v=kjBOesZCoqc&list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab

微積基礎。綺麗な人です。英語も美しい。こんな先生に数学教わりたかった。。。
https://www.youtube.com/playlist?list=PLrvceTalcPR646RM_phQ13t0-lTPEwHft
ファイルを監視して増分を表示する君



```bash:watcher.sh
set -eu

# ----------------------------------------------------------------------
# 監視したいファイル
FILE_NAME="a.txt"
# 監視したいファイルの行数を格納。変化したらなにかする。
LINE="a.line"
# ----------------------------------------------------------------------

# ファイルなかったら作成
init() {
    if [ ! -e $FILE_NAME ];then
        touch $FILE_NAME
    fi
    if [ ! -e $LINE ];then
        echo 0 > $LINE
    fi
}

# 行数の変化監視
watcher() {
    LAST_LINE=`cat $LINE`
    CURRENT_LINE=`wc -l $FILE_NAME`
    if [ "$CURRENT_LINE" = "$LAST_LINE" ]; then
        return 
    fi

    echo $CURRENT_LINE > $LINE

    TMP_LINE=`echo $LAST_LINE | cut -f 1 -d " "`
    NEXT_LINE=`expr $TMP_LINE + 1`

    ## 追加された行以降を表示
    NEW_RECORD=`tail -q -n +$NEXT_LINE $FILE_NAME`
    
    ## 標準出力
    echo "$NEW_RECORD"
    
    ## メール送信したい場合は以下
    # echo "$NEW_RECORD" | mail -s "subject" to@addr.com
    
    ## slackに投稿する場合(未確認。ダブルクォーテーション辺りが怪しい。)
    # curl -X POST -H 'Content-type: application/json' \
    #  --data '{"text":"'"$NEW_RECORD"'"}' \
    #  "https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX"
}
# ----------------------------------------------------------------------

init
while true
do
    watcher
    # 2秒おきに監視
    sleep 2
done
```
ソフト設計 > 図 > Feature Tree

ソフトウェアの変更概要を一瞥できる図を探しているが、自分の欲しいような図は見つかっていない。
自分が知りたいのは以下の二点

1. 関係するソフトウェアモジュール
2. 

本屋でいろいろな本を見た中で、気になったのが「Feature Tree」という図。


- https://www.projectmanagement.com/pdf/Deep_Dive_Models_in_Agile_Feature_Trees_Japanese.pdf

- https://en.wikipedia.org/wiki/Feature_model
    - Feature treeとは別物か

- http://www.seilevel.com/business-analyst-resources/business-requirements-models-templates/feature-tree/

こういう図を簡単にかけるオンラインツールは今のところ知らない。

マインドマップとの違いについては未消化。
SharePoint REST サンプル集

SharePoint 2013、SharePoint 2016、SharePoint Online で使える REST のサンプルを思いついた時にメモ代わりにこの記事へ掲載していきます。

[前の投稿](http://qiita.com/HiroakiOikawa/items/e6a978cc81ed96a938b9)で、Excel を使って REST の結果を整形する手法を書きましたが、ここに記載の REST も、同じように Excel で使用可能です。
色々試してみてください。

これまで Qiita に書いていた本内容ですが、個人ブログの方でアップデートを続けています。
お手数ですが今後は私の個人ブログの方をご参照ください。

[SharePoint REST サンプル集 - SharePoint Developer](https://sharepoint.orivers.jp/article/10097)
♪Number Lookupで有効な電話番号を調べる♪(@_@)

【概要】
長い間RDBやリストに電話番号を格納したままだと、電話番号が現在も使用されているかどうかわからないことがありますよね。

そのようなときは、infobip社の電話番号アクティブ検証サービスを利用すると、

1）リアルタイムで調べたい電話番号がアクティブかどうか（契約中か解約中か）
2）”契約当初の通信キャリア名” と "一部キャリアを除くMNP移行先通信キャリア"
3）海外滞在中にスマホがどのキャリアとローミングしているか

を知ることが出来とても便利です。ExcelなどのファイルやAPIでのRespose Codeで受け取れます。相手にメッセージを送ることなく、ワン切りすることもなくリアルタイムで調べれるため、相手に迷惑をかけずに調べれる優れものです。Emailアドレスのクリーニングと一緒に使用すると非常に便利かと思います。
----------------------------------------------------
【メリット】
1）データベースやリストの事前クリーニングツールとしてご利用頂けます。
2）2要素認証やその他の認証ツールの一部分として利用頂けます。
3）DBではなく、リアルタイムにスマホへシグナルを送る為、個人情報漏洩の心配がないです。
4）SMS送信前に届かない番号を予め調べて送信料金の節約を行えます。
5）完全従量制でポータビリティーキャリア名を取得出来ない番号は、今は料金不要です。
6）銀行キャッシュカードクローン詐欺防止で海外銀行でも使用されている安全性が高いツール。

----------------------------------------------------
API参照先）https://dev.infobip.com/number-lookup

          Google TranslateやAuto Translateを使用すると簡単に読めますよ！
【memo】Materialize css Sinatra CDN

## materialize cssとは
デザインのライブラリである。
[card](http://materializecss.com/cards.html)/[loader](http://materializecss.com/preloader.html)/[icon](http://materializecss.com/icons.html)/[dialog](http://materializecss.com/dialogs.html)/[modal](http://materializecss.com/modals.html) など様々なcss/javascriptの機能が充実している。
http://materializecss.com/
<img width="640" alt="スクリーンショット 2017-07-23 7.37.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/64677/8940827d-b2b2-7147-4315-5ca287f470a8.png">

## スマホ/タブレット/PC の使い分け
[helper](http://materializecss.com/helpers.html)のcssを使って、デザインを分けます。

|  Classタグ  |  表示画面  |
| ---- | ---- |
|.hide | Hidden for all Devices|
|.hide-on-small-only | Hidden for Mobile Only|
|.hide-on-med-only | Hidden for Tablet Only|
|.hide-on-med-and-down | Hidden for Tablet and Below|
|.hide-on-med-and-up | Hidden for Tablet and Above|
|.hide-on-large-only | Hidden for Desktop Only|
|.show-on-small | Show for Mobile Only|
|.show-on-medium | Show for Tablet Only|
|.show-on-large | Show for Desktop Only|
|.show-on-medium-and-up | Show for Tablet and Above|
|.show-on-medium-and-down | Show for Tablet and Below |

## 実装方法
SinatraでMaterialize cssを使う方法がなかったのでCDNでしました。
もう少し良い方法があると思うので引き続き調査します。

```html
 <!DOCTYPE html>
  <html>
    <head>
      <!--Import Google Icon Font-->
      <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
      <!--Import materialize.css-->
      <!-- Compiled and minified CSS -->
      <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/css/materialize.min.css">

      <!--Let browser know website is optimized for mobile-->
      <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    </head>

    <body>
      <!--Import jQuery before materialize.js-->
      <script type="text/javascript" src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/js/materialize.min.js"></script>
    </body>
  </html>
```
EC-CUBE3.0にreCAPTCHAを実装する

# EC-CUBE3.0にreCAPTCHAを実装する

## やりたいこと
 
「私はロボットではありません。」がやりたい。

<img width="875" alt="“screenshot” 2017-07-23 at 01.11.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/84126/42aac112-83e0-93c2-a7de-e3140b318344.png">

## 環境
EC-CUBE3.0

## 実装
フロントエンドの実装は2つだけです。
- 管理画面からブロック設定
管理画面で新規ブロックを作成してください。

```
<!-- Google recaptcha -->
<script src='https://www.google.com/recaptcha/api.js' async defer></script>
<script>
  function validateRecaptcha(code){
    if(!!code){
      var form = document.querySelector(".recaptcha");
      form.removeAttribute('disabled');
    }
  }
</script>
```

作成したブロックをレイアウト設定で、問い合わせフォームのヘッダー部分に設置します。


- 問い合わせフォームにreCAPTCHAパーツを組み込む

```

## 編集箇所
src > Eccube > Resource > template > default > Contact > index.twig

<div class="col-sm-offset-4 col-sm-4">
    <div class="g-recaptcha" data-callback="validateRecaptcha" data-sitekey="6LdkFCoUAAAAAOwtu-OYCfiFKLBz9_ED1KlsEiOA"></div>
</div>


<div id="top_box__confirm_button" class="btn_group col-sm-offset-4 col-sm-4">
  <p><button type="submit" class="recaptcha btn btn-primary btn-block" disabled>確認ページへ</button></p>
</div>
```
チェックするまで確定ボタンが押せないように初期表示ではdisabledにしています。

[該当ソースコード全文はこちら](https://github.com/KAZUKI1994/ec-cube3.0/blob/master/src/Eccube/Resource/template/default/Contact/index.twig)

組み込んだ結果以下の挙動になります。



https://gyazo.com/2d646b463df0f07699f5167f2280fcc6

以上
アプリで日々のビルドを配布する作業を自動化する時に考えた事

現在開発中のdevelopブランチの最新を日々自動的に配布したい。
日々配布してQA担当の方にテストしていただいたり、今のアプリの動きどうなってるんだろ？と思った時にさくっと確認出来て便利。

developブランチにMergeしたタイミングでapk作るのはちょっと細かすぎるかな？という気持ちがあって、１日に１回。
でも、何もdevelopにMergeされてない時にもapkが作られるのでそれはそれで微妙かもしれない。


## やりたい事
ざっくり書くと以下のような感じ。


- 日々の最新のdevelopを使ってFabricのBetaで配布したい
- バージョン番号もしくは、ビルド番号をカウントアップしてどのビルドなのかをわかるようにしたい


## スケジューリング
[bitrise](https://www.bitrise.io/)を使う。workflowを簡単に設定できて非常に便利。しかしお金はかかりますよと。
毎日指定した時間に発動させる。



## バージョン番号もしくは、ビルド番号のカウントアップ
#### versionCodeとversionNameのどちらかを更新する
日々ビルドしてアップするので、一体どのビルドなんだろう。。。？？
というのをわかるようにしないと混乱してしまう。

versionCodeとversionNameのどちらをカウントアップするのがいいのだろうか？

```
versionCode 1
versionName "1.0.0-alpha.1” // こちらをカウントアップするのがいいと考えた
```

軽く考えたところで、versionNameの方を変更する事にした。
気分的な問題だけど、versionCodeを日々カウントアップすると実際にアプリをリリースする時に無駄に増えた状態でリリースされてしまいそうと考えたからだ。

日々のビルドは、versionNameの最後に`-alpha.1`とつけて配布する事にしてみる。

#### どうやってversionNameの更新するか？
やろうと思えば、いろいろと方法があると思う。

- シェルスクリプト
- gradle
- fastlane

gradleでやるには
https://stackoverflow.com/a/21951328/2172277
この辺を参考にすれば書けるかもしれない。

また、ちょっと話はそれるのだが、将来的にGoogle Playへのデプロイも自動化したいので、その辺も考慮に入れると、

Gradleの[gradle-play-publisher](https://github.com/Triple-T/gradle-play-publisher) vs fastlane


という感じになってくる

どっちがいいんだろうか。。。？と調べてみたところ、1年以上前だけど、いい比較記事を見つけた！
http://qiita.com/shiraji/items/518cb1a20671a6388dd7

fastlaneの方が確かに開発が活発そうな感じなのと、
https://docs.fastlane.tools/getting-started/android/setup/
この辺のドキュメントみたりして比較記事から１年以上たって、いろいろと機能が追加されてそうなので、fastlaneを使ってみる。GroovyよりもRubyの方が僕にとってはコードが読めそう。


#### fastlaneを使ってversionNameを更新する

fastlaneの準備とかもろもろはちょっとめんどくさくなったので省略する。
versionNameを更新するactionを以下のような感じで作ってみた。

https://gist.github.com/mapyo/e0387f94bf94f6bcb119be7b40ea23ac


fastlane使ったの初めてだし、action作ったのも初めてなのでそんな感じ。
後は、versionNameなどはこの表示形式にする。という決め打ち前提なので、あまり使い勝手は良くないかもしれない。


## ビルドと配布
fastlaneのlaneの中で以下のような感じでやる

```
gradle(task: "clean assembleDebug crashlyticsUploadDistributionDebug")
```

crashlytics用のactionも用意されているっぽい感じだったけど、既にgradleで配布出来てたし、別に使わなくてもええやん。という気持ちで雑にgradleを使うようにした。


## 所感
fastlane、今まで全然使った事なかったけど、Android開発者にとっても、便利そうだ！！
そして、bitriseが結構便利です！！

今度はアプリをgoogle playに配布するとこら辺を自動化してみたい気持ち。
GeoJSON (RFC7946) 仕様の注意点など

こんにちは。
[GeoJSON](https://en.wikipedia.org/wiki/GeoJSON) ([RFC7946](https://tools.ietf.org/html/rfc7946)) のデータ表現仕様を見ますと、下記のようなことに注意する必要がありそうです[^1] [^2]。

[^1]: PostGIS などの定番システムの考え方を踏襲しているようです。
[^2]: "[Everything you need to know now about RFC 7946 GeoJSON](https://macwright.org/2016/11/07/the-geojson-ietf-standard.html)" などの一連の記事も参考になります。

1. 経度値 (degree) の範囲は $-180 \le λ \le 180$
2. Linestring/Polygon は180度経線を跨がないように分割する（Multilinestring/Multipolygon へ） (i.e. antimeridian cutting)
3. 直線（線分、辺）の定義を正距円筒図法での直線とする
4. 測地系は WGS84
5. Polygon の輪郭線は反時計回り
4. おそらく、Polygon の輪郭線の自己交差は保証外

これに対して、同じ JSON 形式ではありますが、下記のように異なる考えの採用も見られるので差異に注意が必要のようです。

- 直線（線分、辺）の定義を地球回転楕円体面上（WGS84）の測地線とするシステムが見られる（D3.js, ArangoDB, RethinkDB）[^3]。
- Polygon の輪郭線は時計回りとする定義が見られる（D3.js）[^4]。
- データ表現で "antimeridian cutting" は不要なものが見られる（D3.js）[^5]。

[^3]: 例は「[地球を12周する螺旋状平行四辺形（D3.js 利用、正距円筒図法）](http://qiita.com/kkdd/items/575a3234ff9a33a682ce)」。
[^4]: [rfc7946-to-d3.js](https://github.com/tyrasd/rfc7946-to-d3) が、輪郭線の時計／反時計回りを反転させるために使えます。
[^5]: antimeridian cutting の処理は処理系側に任されることになります（例： [Antimeridian Cutting](https://bl.ocks.org/mbostock/3788999) / [No Antimeridian Cutting](https://bl.ocks.org/mbostock/5735770)）。

また他にも微妙な注意点として下記のようなものがありそうです。

- 一つの線分は半周を超えない（言い換えれば短い方の弧）
- 一つの線分（の始点終点）の経度差が180度ならば、極を通過する弧となる
22 番ポートが通らない環境で GitHub / BitBucket / GitLab を SSH 経由で利用する方法

## TL;DR
- 22 番ポートが通信できない環境では、443 番ポートは通信できる場合が多い
- GitHub 等の主要ホスティングサービスでは、443 番ポートでの SSH をサポートしている

## 概要
公衆 Wi-Fi やゲストネットワーク等、特定のネットワーク下では 22 番ポートでの通信が制限されていることがあります。このような環境では、SSH プロトコルでの Git 利用ができません。

実は、このような環境でも SSH プロトコルで Git が利用できるように、GitHub 等の主要ホスティングサービスでは 443 番ポートでの通信もサポートされています。

この記事では、Git ホスティングサービスごとの `~/.ssh/config` に記載する SSH の設定をまとめました。

## SSH 設定
利用する環境の `~/.ssh/config` へ追記してください。

### GitHub

```
Host github.com
    HostName        ssh.github.com
    User            git
    Port            443
```

#### BitBucket

```
Host bitbucket.org
    HostName        altssh.bitbucket.org
    User            git
    Port            443
```

#### GitLab

```
Host gitlab.com
    HostName        altssh.gitlab.com
    User            git
    Port            443
```

### プロキシー環境下の場合
443 番ポートでの外向け通信が通らない環境の場合、HTTP プロキシを経由することで通信できる場合があります。

その場合は、下記の設定も合わせて `~/.ssh/config` へ記載してください。

```
Host *
    ProxyCommand connect -H proxy.example.co.jp:8080 %h %p
```

## まとめ
22 番ポートでの通信が制限された環境でも、快適な Git ライフをお楽しみください。
ionic nativeでreproのcordovaプラグインのTypeScripラッパーを作る

最近、Reproなるアナリティクスツールの存在を知りました。なんでも、イベントだけじゃなくて動画も取れたりするとのこと。
早速ionicでも試してみようと思ったんですが、ReproのCordovaプラグインにd.tsがなかっったので、せっかくなのでionic-nativeでReproのTypeScriptラッパーを作ってみることにしました。

# 作成したラッパーと使い方

作成したラッパーはgithubにあげてあります。
https://github.com/scrpgil/repro

使い方はgithubのREADMEにざっくりと書いてありますが上手くReproを動かせれば下のgifのようにアプリ操作の様子を動画で確認できるようになります。

![reprotest.gif](https://qiita-image-store.s3.amazonaws.com/0/165335/a9956627-8624-57f0-1c27-790a2e1dc382.gif)
※画質悪くてすいません。


# ionic-nativeについて

ionic公式のTypeScriptラッパーです。各種corodvaプラグインのjsをTypeScriptから呼びやすくしたものです。日本のサービスのものはまだ少ないですが、ない時は自分で作成することも可能です。

[ionic-nativeのデベロッパーズガイド](https://github.com/ionic-team/ionic-native/blob/master/DEVELOPER.md)

# 作り方

基本はDevelopersGuideにそって作ります。まずは、ionic-nativeをcloneします。

````
git clone https://github.com/ionic-team/ionic-native.git
cd ionic-native
````

次に、新規プラグインテンプレートの作成です。

````
gulp plugin:create -m -n repro
````

上記コマンドを実行すると「src/@ionic-native/plugins/repro/index.ts」が出来上がります。

index.tsを開くとPluginの情報を記載するところがあるので、以下のように記載します。

````
@Plugin({
  pluginName: 'Repro',
  plugin: 'repro-cordova-plugin',
  pluginRef: 'Repro',
  repo: 'https://github.com/reproio/repro-cordova-plugin',
  platforms: ['Android', 'iOS']
})
````

そして、後は、ひたすらもととなるcordova-plugin-reproのwww/Repro.jsに記載されている関数を書いていきます。大体下のような感じです。

````
  @Cordova()
  setup(key: string): Promise<any> {
    return;
  }

  @Cordova()
  setLogLevel(logLevel: any): Promise<any> {
    return;
  }

〜〜〜以下略〜〜〜
````

全て書き終わったらビルドします。

````
npm run build
````
※この時、lintで怒られる可能性ありです。私は引数と型名の間にスペースがないって怒られました。

ビルドが終わると「dist/@ionic-native/repro」フォルダができますのでそのフォルダをreproを使いたいアプリのnode_modules/@ionic-nativeの下に移動させれば完成です。

# まとめ

・ionic-nativeに欲しいプラグインのラッパーがなければ自分で作る
・作るの事態は簡単。10分くらいあれば作成可能です。
・Repro便利
SpringBootの@Transactionalが効かないときは

SpringBootを使っていてDBへの登録時にTransaction管理をする必要が出てきた。

publicなメソッドに@TransactionalアノテーションをつけてExceptionを発生させれば自動的にロールバックしてくれるらしい。

というわけでやってみたのだが、ぜんっっっっっっっっっっっっぜんうまくいかない。
アノテーションに与える設定を色々と変えてみたがちっともロールバックされない。

2時間か3時間程度格闘し、Webの海をクロールしていたところ神々しい灯台が見えた。


https://ameblo.jp/kochablo/entry-11578714824.html





**神**





一撃でうまくいった。先駆者兄貴に感謝。マジ感謝。

ただ、「直接呼ばないといけない」ってどういうことやねんと思ったので
先駆者兄貴のように困っている存在をたすけられたらと思い以下に詳述する。

# ダメな例:no_good:
```java:SampleController.java
class SampleController{
  @Autowired
  private SampleService sampleService;

  public String sample(){
    sampleService.transactionalInsert();
    return "sampleView";
  }
}
```

```java:SampleService.java
class SampleService{

  public void transactionalInsert(){
    doInsert();
  }

  @Transactional
  public void doInsert(){
    // なんやかんやDBにInsertとかする処理
    // うまくいかなかったらRuntimeExeptionを投げる処理
  }
}
```
これではいけませんね。

# 良い例:ok_woman:
```java:SampleController.java
class SampleController{
  @Autowired
  private SampleService sampleService;

  public String sample(){
    sampleService.doInsert();
    return "sampleView";
  }
}
```

```java:SampleService.java
class SampleService{

  public void transactionalInsert(){
    doInsert();
  }

  @Transactional
  public void doInsert(){
    // なんやかんやDBにInsertとかする処理
    // うまくいかなかったらRuntimeExeptionを投げる処理
  }
}
```

おわかりいただけただろうか。
なんせ@Autowiredしとるクラスから@Transactionalしとるメソッドを呼んだらええっちゅうこっちゃ。
OpenPoseをROSで動かす

OpenPoseをROSで動かします。
カメラ画像のデータをsubscribeして、人検出および各関節位置の情報と、それを入力画像にレンダリングしたものをpublishします。

コードは以下にて公開しています。
https://github.com/slowsingle/openpose_ros

# 事前準備

OpenPoseを先にインストールしておいてください。インストール方法は[OpenPoseを動かしてみた。](http://qiita.com/nnn112358/items/a4490d85dac5827db53b)などをご参照ください。

なお、私の環境はUbuntu16.04でROSはkineticです。それ以外の環境ではテストしておりませんのでご了承ください。

# コンパイル

catkin_makeでコンパイルするのですが、openposeおよび同時にインストールしたであろうcaffeの場所が使用するPCによって異なるので、その部分を書き換える必要があります。

```text:CMakeLists.txt
:
:
:

include_directories(
  ${catkin_INCLUDE_DIRS}
  /usr/local/cuda/include
  /home/kerberos/openpose/include
  /home/kerberos/openpose/3rdparty/caffe/include
  /home/kerberos/openpose/3rdparty/caffe/.build_release/src
)

:
:
:

target_link_libraries(${PROJECT_NAME}_node
  ${catkin_LIBRARIES}
  /usr/lib/x86_64-linux-gnu/libglog.so
  /usr/lib/x86_64-linux-gnu/libgflags.so
  /usr/lib/x86_64-linux-gnu/libgflags_nothreads.so
  /home/kerberos/openpose/build/lib/libopenpose.so
  /home/kerberos/openpose/3rdparty/caffe/.build_release/lib/libcaffe.so
)
```

CmakeLists.txtの/home/kerberos/~のところを自分の環境に合うように書き換えてください。
ここを正しくしないと、openposeやcaffeを呼び出すことができません。

catkin_makeしてから、usb_camでカメラ画像を読み込んだ後、

```
rosrun openpose_ros openpose_ros_node
```

と打って、実行します。すると、2つのトピックがpublishされます。

```
/openpose/image_raw
/openpose/poses
```

とりあえず/openpose/image_rawをimage_viewやrviz等で可視化してみると、OpenPoseが動いていることを確認できるはずです。試しに人の絵が写っている漫画の表紙とかを見せてあげると、OpenPoseが認識してくれたりします。すごい！ (もちろん、私も人間として認めてくれました)

別のノードと組み合わせて高度な処理がしたいときは/openpose/posesをsubscribeしてください。詳しくはmsgの型を見ればわかりますが、検出した人と、その関節位置および確率値(confidence)が格納されています。
ソフトウェア工学：Feasibility Study(実現可能性解析)を考慮したプログラミング言語選択：電卓プログラム

# 概要
ソフトウェア工学では、ソフトウェアは商品として扱われるため、ソフトウェアの制作は正しいプロセスを経て行うことが重要視されている。それは勿論特定のソフトウェアを闇雲に作ろうつするのではなく、計画に沿って制作を進めることを意味しているが、その前に実現可能性（Feasibility、現実的かどうか）、つまりそもそも開発を始めるべきかどうかを解析する必要がある。また、開発すべきと判断した場合は、プロジェクトや計画の詳細（たとえば、開発に用いるプログラミング言語など）も実現可能性の面で評価したうえで最適なものを選ぶことが重要である。
本稿の目的は、（関数電卓へ拡張可能な）「電卓プログラム」を例にFeasibility Studyを行い、その開発に最適であるプログラミング言語をソフトウェア工学的な考え方で求めることである。なお、今回の解析では、プログラミング言語の候補としてJava9、Scala、Haskell、Rustの四つを考える。
# 各プログラミング言語の特徴および評価
## Java9
Java9はJava言語の最新版である。Javaは二十年を超える歴史を持つ、マルチパラダイムな言語言語である（主としてオブジェクト指向・手続き型）。GUIなどを持ち、拡張可能である電卓プログラムではオブジェクト指向と手続き型という特徴が作りやすさにつながると考えられる。このようなアプリにとっては、Java9が適切であろう。前のJavaのバージョンよりは様々な面で性能が上がるため、良い成果物が期待できると考えられるため、この言語で開発を行うと良いのではないか。
## Scala
Scalaは、マルチパラダイム言語（オブジェクト指向、関数型プログラミング可能性、など）である。Javaと同様に、プログラムはJavaバイトコードにコンパイルされ、JVMで実行されるため、結果となるプログラムは様々なプラットフォームで実行できると考えられる。なお、Javaと違って関数型プログラミングもサポートされているが、電卓プログラムではその出番は見えず、純粋な手続き型プログラミングで実現しやすい部分が多い。
Scalaは2004年に初めて現れた、比較的に新しい言語である。そのため、ソフトウェア工学的な考え方では、Scalaの適性は疑わしい。しかし、Java全体より新しいとはいえ、Java9よりはふるいため、安定性などを考えるとScalaも立派な選択肢であるといえよう。
## Haskell
Haskellは、Javaをも上回る歴史を持つ、1990年に初めて現れた、純粋な関数型プログラミング言語である。この中の最古の言語であるため、ソフトウェア工学的に適切であると思うかもしれないが、無論ながら単に言語が古ければよいという問題ではないことも明らかであろう。最大の問題点は、純粋な関数型プログラミング言語であるゆえ、珍しい考え方を開発者に押し付けることになるため、意味も無く負担がかかることになる。手続き型言語で簡単に表現できるものが関数型言語や論理型言語で煩雑になる場合も多く、その上に上記の通り関数型プログラミングの要素を活用できる場面は極めて少ない。ソフトウェア開発者を名乗るものなら知るべき言語であるかもしれないが、今回のプロジェクトの候補からははずすべきと考える根拠もある。
## Rust
Rustは、マルチパラダイム言語（関数型・手続き型など）である。純粋なオブジェクト指向はサポートしていない（ほかの手段によってオブジェクト指向と似たような機能や抽象化が実現可能）。（Java9を除いて）最も新しい言語であるため、ソフトウェア工学の考え方では論外といっても過言ではない。

# 考察と結論
上記によると、このプロジェクトに最適なのは、Java9かScalaのどちらかとなる。Scalaはやや珍しい言語であり、Javaに無い機能は求められていないため、Javaの考え方・書き方を何年間も熟知している人たちが昔のように書けるJava9のほうが良いかもしれない。しかし、Javaのバージョン9は実質的に存在しないといって良いほど新しいため、安定性なども心配になり、本当に同じ作風でよいかどうか疑問に思うことがあるため、この二つの中から選ぶならScalaを選ぶべきである、という考え方も妥当であろう。これ以上議論すると机上の空論になりかねないため、プロジェクトの詳細や開発チームの詳細などを考慮しないと結論を導くための情報が足りないと考えるのが正解であろう。

# あとがき
実現可能性を永遠に議論するより、さっさと何かを作ってしまえば時間も削減できる、という考え方もある。実際、そういう決断をしなければいけない場合も多い。状況を冷静に判断しようとする賢者よりも難しいことを考えない愚者どもが先に進み、成功することは市場でもよくある話である。
ちなみに、私は数時間もかけずに関数電卓プログラムを一人でC言語で作ったことがある。また、同じ時間で同様なプログラムをx86アセンブリ言語で作成できると断言できる。なお、Haskellが好きな人はHaskellで開発してしまっても大きな問題は起きないであろう。
ソフトウェア工学的に何が正しいのか、なんて考える余裕も必要も無かった。どうやら、すべてのプログラミングが必ずしもソフトウェア工学ではなく、どのようなプログラム開発に対してもソフトウェア工学のルールや原理を適用できるというわけでもない。個人で作るかチームで作るか、商品にするかしないかなどでTPOや状況が変わり、それにあったソフトウェアの作り方を考える必要があるといえる。個人では様々な自由があるが、大きい会社には大勢の人で莫大な金額や責任を掛けてソフトウェア工学を行うため、慣性が強く、個人のように自由に動けず、「さっさと何かを作っちゃえばいい」という考え方で開発を行うわけにはいかなくなる。ただし、そういう状況下での実現可能性やプログラミング言語を議論するには、「電卓プログラム」というプロジェクトは単純すぎるといえよう。「この言語で無ければ・この言語であれば非現実的だ」といえる場面がまったく想像できないからである。もっと大きなプロジェクトや厳しい条件があるときは、この言語での開発の難易度の差が出るかもしれない。
なお、このプロジェクトの開発しやすい言語についてしいて言うならば、一番単純なC言語などで開発したほうがソフトウェア工学の考え方でも適切なのではないだろうか。
ProcessingでWebAPIを叩く

# 追記（2024/06/24）

より詳細な内容をこちらに書き始めました。

https://blog.enkatsu.org/post/backend-for-new-media-art01/

# 本題

APIを叩こうとした時にJSONObjectで受け取る時のメモ

parseJSONObject()を使うだけなんだけど、
見つからずJavaのJSONパーサーライブラリを使おうとしてしまったので。
HTTP通信には[HTTP-Requests-for-Processing](https://github.com/runemadsen/HTTP-Requests-for-Processing)を使っています。

ついでに[json-server](https://github.com/typicode/json-server)というnodeパッケージがあったので、
サーバはこれを使います。

ディレクトリ構成はこんな感じで

```bash
├── CallWebApiSample.pde
└── data
    └── db.json
```

db.jsonはこんな感じで

```json
{
  "users": [
    {
      "id": 0,
      "name": "太郎",
      "age": 30,
      "job": "勇者"
    },
    {
      "id": 1,
      "name": "二郎",
      "age": 30,
      "job": "魔法使い"
    }
  ]
}
```

CallWebApiSample.pdeはこんな感じ

```java
import http.requests.*;

String URL = "http://localhost:3000/users/1";

void setup() {
  GetRequest get = new GetRequest(URL);
  get.send();
  JSONObject result = parseJSONObject(get.getContent());
  println(result);
}

void draw() {
}
```

次にjson-serverをインストールして実行

```
$ npm install -g json-server
$ cd path/to/sketch/data
$ json-server --watch db.json
```

最後にProcessingスケッチのRunボタンを押したら、
こんな感じに表示されるんじゃないでしょうか。

```
{
  "name": "二郎",
  "id": 1,
  "job": "魔法使い",
  "age": 30
}
```

ProcessingでWebAPIを使った可視化作品とかを開発していたら、
テストデータとしてローカルのJSONを手軽に使えるので便利なのではないでしょうか。
Swift3でiOSのIP Addressを取得する


このあたりを参照したのでメモ → https://stackoverflow.com/questions/30748480/swift-get-devices-ip-address
Swift3向けにアップデートされているんで、そちらを転載しておきます。

## 手順
Bridging Headerに以下を記述

```
#include <ifaddrs.h>

```

functionに以下を追加

```
// Return IP address of WiFi interface (en0) as a String, or `nil`
func getWiFiAddress() -> String? {
    var address : String?
    
    // Get list of all interfaces on the local machine:
    var ifaddr : UnsafeMutablePointer<ifaddrs>?
    guard getifaddrs(&ifaddr) == 0 else { return nil }
    guard let firstAddr = ifaddr else { return nil }
    
    // For each interface ...
    for ifptr in sequence(first: firstAddr, next: { $0.pointee.ifa_next }) {
        let interface = ifptr.pointee
        
        // Check for IPv4 or IPv6 interface:
        let addrFamily = interface.ifa_addr.pointee.sa_family
        if addrFamily == UInt8(AF_INET) || addrFamily == UInt8(AF_INET6) {
            
            // Check interface name:
            let name = String(cString: interface.ifa_name)
            if  name == "en0" {
                
                // Convert interface address to a human readable string:
                var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))
                getnameinfo(interface.ifa_addr, socklen_t(interface.ifa_addr.pointee.sa_len),
                            &hostname, socklen_t(hostname.count),
                            nil, socklen_t(0), NI_NUMERICHOST)
                address = String(cString: hostname)
            }
        }
    }
    freeifaddrs(ifaddr)
    
    return address
}
```

Usage

```
if let addr = getWiFiAddress() {
    print(addr)
} else {
    print("No WiFi address")
}
```
Raspberry PiにNode.jsとnpmの最新版をインストールする

Raspberry Piでapt-getで入れたnpmを使っていて、`@type/node` などのTypeScriptのtypesパッケージを `npm install` しようとすると、 `npm ERR! 404 'types/node' is not in the npm registry.` のようなエラーが出てしまいました。
typesパッケージはnpm 3.xからサポートされているそうですが、記事投稿時(2017/07/23)にapt-getで入れたnpmのバージョンは1.4.21でした。

```text:Raspbian
pi@raspberrypi:~ $ npm -v
1.4.21
```

また、npm 5.2.0からはnpxというローカルパッケージを手軽に実行できるコマンドが用意されたりしています。
[npm 5.2.0の新機能！ 「npx」でローカルパッケージを手軽に実行しよう](http://qiita.com/tonkotsuboy_com/items/8227f5993769c3df533d)

今回の記事では、Node.jsの最新版(正確には、Stable, LTS, Latestなど)とnpmの最新版を手軽にインストールできる方法を紹介します。

# 動作環境
- Raspberry Pi 3 Model B, Raspberry Pi Zero W
    - Raspbian Jessie Lite 2017-07-05
        - イメージをMicroSDに書き込んだ後、MicroSDのルートディレクトリに`ssh`という名前で空のファイルを作成
            - 詳しくは[Raspberry PiとMac or Windows PCを有線で直接繋いでさくっとSSH接続する](http://qiita.com/mascii/items/7d955395158d4231aef6)などを参照
    - Raspbian Stretch Lite 2017-09-07
        - イメージをMicroSDに書き込んだ後、MicroSDのルートディレクトリに`ssh`という名前で空のファイルを作成

# インストール
まず、SSH接続をしておきます([Raspberry PiとMac or Windows PCを有線で直接繋いでさくっとSSH接続する](http://qiita.com/mascii/items/7d955395158d4231aef6)などを参照)

```text:Raspbian
sudo apt-get update
sudo apt-get install -y nodejs npm
sudo npm cache clean
sudo npm install npm n -g
sudo n stable
```

または、[Gistにアップロードしたファイル](https://gist.github.com/mascii/52ccbb85f8439123ee095db038c94939)を利用し、

```text:Raspbian
curl -L https://git.io/v7kPb | bash
```

`sudo n stable` の部分を `sudo n lts` に変更すれば、Node.jsのLTS版(長期サポート版)がインストールされます

記事投稿時(2017/07/23)、Raspberry Pi Zero WではCPUがARMv6系であることに起因すると思われるエラーが出ておりました。
`sudo n stable` で `Error: invalid version 8.6.0` といったエラーが出る場合は、 `n ls`
 を実行して利用可能なバージョンを調べ、 `sudo n 8.5.0` (`8.6.0`の前のバージョン)や `sudo n lts` を実行してみてください。

インストール後、バージョンの確認とパスが通っているかを確認します

```text:Raspbian
pi@raspberrypi:~ $ node -v
v8.6.0
pi@raspberrypi:~ $ npm -v
5.4.2
```

(2017/08/01追記)
Raspberry Pi Zero Wにおいて、`Error: invalid version 8.2.1` が出る時期がありましたが、Node.jsの `v8.2.1` がインストールできるようになっていました
<img width="565" alt="RPiZeroW_Node_8.2.1.png" src="https://qiita-image-store.s3.amazonaws.com/0/137045/0a41226f-af4a-978d-0e13-91943f6110f7.png">

(2017/10/08追記)
Raspberry Pi Zero Wにおいて、`Error: invalid version 8.6.0` が出ていました。このような場合は、上記のように `sudo n 8.5.0` などを実行してみてください。
また、古いバージョンのnpmが入ってしまった場合は、`sudo npm install npm -g` を実行してみてください。

# 参考サイト
[第三回 Raspberry Pi 3に最新のNode.jsをインストールする](http://qiita.com/setouchi/items/437e4b62e4210871496f)
気象警報通知をWebスクレイピングで。

# 警報をTwitterで教えてほしい。
## 動機
### カッとなってやった
高校生です。
学校が警報で休みになります。
あのレスポンスの悪いNHKデータ放送で逐一警報を確認する信心深い時間がドキドキしすぎるので、ぜひTwitterで自動通知してほしいのです。はい。

### 問題
なんか、警報APIとか全然ない。
探したらあったけどどうやら「はぶさぶぱぶばぶ」とか言うばぶばぶなプロトコル使ってるようで俺にゃ無理。

...

### Webスクレイピングだッ!!
これだぁっ!!

## 環境
- Python3
- urllib
- BeatifulSoup4
- twitter(Pythonライブラリ)

てな感じでさ。

## ソイソース

```py
# coding: UTF-8
#!/usr/bin/env python3

from urllib import request
from bs4 import BeautifulSoup
from datetime import datetime
import time
import twitter

OK = '33[92m'
WARN = '33[93m'
NG = '33[91m'
END_CODE = '33[0m'

api = twitter.Api(consumer_key='あ、あなたの', consumer_secret='秘密を', access_token_secret='こ、ここに入れるのよ')

# アクセスするURL
url = "https://typhoon.yahoo.co.jp/weather/jp/warn/なんか/番号/"


def Getter(soup):
    Summaryarea = soup.findAll("div", class_="warnSummary_box")
    # print(Summaryarea[0].dl)
    Li = Summaryarea[0].dl.dd.ul.li
    # adv = Li.find("span",class_="icoAdvisory")#警報知らせ
    adv = Li.find("span", class_="icoWarning")  # 注意報知らせ
    if adv:
        # Yes
        # print("OK")
        return 1
    else:
        # No
        # print("NO")
        return 0


def Twit(state):
    nowtime = datetime.now()
    NowStr = str(nowtime.hour) + "時" + str(nowtime.minute) + "分現在"
    Txt = ""
    if state:
        Txt = "\nなんとか市に警報が発令されてるみたい。。。\nべっ別に学校休みだからって喜んだりしないんだからねっ！！"
    else:
        Txt = "\nなんとか市には警報出てないみたいね。\n変な悪あがきはやめてさっさと学校に行くことね。"
    status = api.PostUpdate("[気象警報自動通知システム]\n" + NowStr + Txt)
    print(status.text)


def Coloring(txt, code):
    return "\033[%sm%s\033[0m" % (code, txt)


def main():
    while 1:
        print("Now " + ntStr)
        print("Its time!")

        # 読み込み
        html = request.urlopen(url).read()

        soup = BeautifulSoup(html, "html.parser")
        Twit(Getter(soup))
        if Getter(soup):
            # 警報でてら
            print(Coloring("!!!!WARNING!!!!", "31"))
        else:
            # 警報でとらん
            print(Coloring("ALLGREEN", "32"))
        time.sleep(60 * 3)


if __name__ == "__main__":
    main()
```

*きったなくてすんません。。。
URLはYahoo天気の警報ページです。
## 結果

![Screenshot_20170723_003600Edited.png](https://qiita-image-store.s3.amazonaws.com/0/108489/7f587f6f-2f82-52c4-3d69-40c07390a817.png)

できますた。

いい感じ。

## 改善点

これをラズパイと連携させて警報出たら家の鍵閉まるようにするwww
Twitterのファボ欄を取得するプログラムを書いた



# 前書き
タイトル通りTwitterのファボ欄を取得するプログラムを書いたのでそのノウハウをここに書きたいと思います。
このプログラムはpythonで書かれておりtweepyを使用しています。
githubにアップロードしているので良ければご覧ください。
[FavoriteImageSaver - github](https://github.com/akikan/Twitter/tree/master/FavoriteImageSaver)
下記に躓きポイントを列挙していきます。
まぁそんなにないんですが。


### 躓きポイント 複数画像の場合
twitterAPIを叩くとstatusとかいうまとまりで情報がもらえる。
この中に文字情報や画像情報が入っているのですが、どうにも画像1枚と複数枚の時に入っている場所が異なっているようで詰まりました。

Tweepyで具体的に言うと
1枚の場合はstatus.entities['media']に、
複数枚の場合はstatus.extended_entities['media']に画像情報が入っています。

別に複数枚投稿されてるときにstatus.entities['media']で取っても最初の1枚しか取れないし気づくのに時間がかかりました・・・。
go test していることを判別する方法

go build した結果のバイナリを実行している場合と go test している場合とで、挙動を変えるための方法です。

後々追記するかもしれませんが、現時点では2つの方法があります。(適用範囲が異なります)
それぞれの方法について、特徴と使いどころを考えたいと思います。

1. flag を使う方法
2. build tags を使う方法

# flagを使う方法

制限が少なく、かつ手間がかからない方法です。

## 方法

元ネタは、以下の stackoverflow の質問・回答です。
[How do I know I'm running within “go test”](https://stackoverflow.com/questions/14249217/how-do-i-know-im-running-within-go-test)

```go:判別
flag.Lookup("test.v") != nil
```

## 説明

go test した場合、"test.XXX" というフラグが多数定義されますが、そのうちの一つのフラグが定義されているかどうかで判別しています。
このとき、実際にコマンドラインで指定しなくても判別が可能です。

上記のコード片の様に至極手軽に実装できますが、一応パッケージにしてみました。

[bitbucket.org/shu/testa](https://bitbucket.org/shu/testa)
testa.IsTesting() bool

## 特徴

init() を含めて、どこでも使うことができます。
flag.Parse() していなくても判別可能です。

build tags を使う方法と比べても、制限がありません。
テストコードだけではなく、テスト対象のコード内でも使うことができます。

## 使いどころ

テスト時に特殊な挙動を*追加で*行うことが期待されているパッケージの内部で使えるかもしれません（？）

一般的な話になりますが、非テストコード（特にテスト対象コード）でテスト時・非テスト時の判断を行うということは、そのようなパッケージでは非テスト時の挙動がテストできない、ということになります。
外部の要因で挙動を変えられるようにしたい場合は、パッケージの構造として、フラグ変数や関数オブジェクト、もしくはインターフェイスを媒介した挙動変更の情報を受け取れるようにした方が良いでしょう。

ただ、例えば「テスト時にはログに追加情報を出す」といった利用であれば、殆ど悪影響は無いと思います。
本筋の処理とは別の処理（具体的に言うと、テスト対象外の処理）を変更する条件として使うのであれば、まあ、問題にはならないと思います。

# build tags を使う方法

テストコード内で、go test か判別する方法です。
XXX_test.go ファイル内で、利用しているパッケージのオプションやらをテスト向けに変更する方法です。

## 方法

```go:init_test.go(テスト時のみ実行される)
func init() {
  somepkg.SetOption("testing")
}
```

## 特徴

flag を使う方法とは異なり、他のパッケージに依存しません。

使えるのは、テストコード内のみです。
そのため、「テスト時ではない場合」ということを判別する方法にはなりません。
（そのような判別を行うのは推奨しませんけどね）

上記の判別が必要な場合、テスト時ではない場合は初期値を、テスト時は上記の方法でその初期値を上書きするように、パッケージを設計します。

## 使いどころ

テスト時にのみパッケージのグローバルなオプションもしくは変数を変更する場合に使えます。
pythonのスライスの基本

#はじめに
pythonのスライスについてきちんと理解をするためにまとめます

##まず[ ]による抽出

```
>>> test = 'abcde'
>>>test[0]
'a'
>>> test[4]
'e'
>>> test[5]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range
>>> test[-1]
'e'
>>> test[-5]
'a'
>>> test[-6]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: string index out of range
```

このように[0]~[文字列の長さ-1]までで指定する
マイナスで指定することで末尾から指定することができる

##スライスを使う
使い方は[(先頭オフセット):(末尾オフセット):(ステップ)]を使う

```
>>>test = '0123456789'
>>> #全部抽出
...test[:]
'0123456789'
>>> #5から末尾まで
...test[5:]
'56789'
>>>#3から7まで
...test[3:7]
'3456'
>>>#末尾から5つ取り出す
...test[-5:]
'56789'
>>>#先頭から末尾まで2つごとに取り出す 
...test[::2]
'02468'
>>>#逆順に表示
...test[::-1]
'9876543210'
>>>#100文字目から末尾まで
...test[100:]
''
>>>#末尾の100文字手前から末尾まで
...test[-100:]
'0123456789'
```

スライスはミスったオフセットでもきちんと動作してくれる
逆順表示はすごく便利
install quantstrat

quantstratをinstallする
-----------------------

-   以下のページのように, install.packages("FinancialInstrument", repos="<http://R-Forge.R-project.org>")では失敗してしまった.
    -   [Quantstratを使う１インストール](http://d.hatena.ne.jp/graySpace/20160120/1453294634)
    -   [R-Forge](https://r-forge.r-project.org/R/?group_id=316)
-   stackoverflowを参考に, devtoolsを使ってgitから直接installしたらできた
    -   <https://stackoverflow.com/questions/43602829/installing-blotter-and-quantstrat-on-github>

<!-- -->

        install.packages("devtools")
        require(devtools)
        install_github("braverock/FinancialInstrument")
        #install_github("joshuaulrich/xts") #もとから入ってたので今回はいらない
        install_github("braverock/blotter")
        install_github("braverock/quantstrat")
        install_github("braverock/PerformanceAnalytics")
Servant で CORS をサポートする方法

ServantでCORSの設定をしようと思うと[wai-cors](https://hackage.haskell.org/package/wai-cors)だけでは足りなかったのでメモ。
ただ詳しいことはわからなかったので workaround だけ書きます。

Servantを使ったサーバーのCORSの設定にはwai-corsと[servant-options](https://hackage.haskell.org/package/servant-options)を使って以下のようにします

```hs
import qualified Network.Wai.Handler.Warp as Warp
import Network.Wai.Middleware.Cors (cors, simpleCorsResourcePolicy, corsRequestHeaders)
import Network.Wai.Middleware.Servant.Options (provideOptions)
import Servant

type API = ...

api :: Proxy API
api = Proxy

main :: IO ()
main = Warp.run 8080
     $ cors (const $ Just policy)
     $ provideOptions api
     $ serve api server
  where
    policy = simpleCorsResourcePolicy
               { corsRequestHeaders = [ "content-type" ] }
```

[`simpleCors`](https://hackage.haskell.org/package/wai-cors-0.2.5/docs/Network-Wai-Middleware-Cors.html#v:simpleCors)だとダメで必ず`corsRequestHeaders`の設定をする必要があります。

この方法は[OPTIONS support #278](https://github.com/haskell-servant/servant/issues/278)で示されているものです。詳しい議論はここに書いてあると思います

### 追記: 2017/08/06
~~この記事の執筆時に使用していた servant の version は `0.9.1.1` でしたが `0.11` にアップデートしたところ `simpleCors` だけでCORSの設定を行えました。~~
どうやら間違った成果物を試してたようで、確かに servant-options への依存は必要なくなりましたが policy の設定は必要でした
Keras勉強メモ: CIFAR-10画像認識での、ネットワーク構造依存を確認してみた


+ MNIST手書き文字の次に、いわゆる画像、の認識にトライしよう、とCIFAR-10に。
+ CIFAR-10は、飛行機からトラックまでの、たった10カテゴリーの分類課題。ピクセル数も32x32とコンパクトですが、画像の例を見てみると、実に多様なデータが含まれていると思います。
+ これが、簡単なコードと、8年もののiMacで、ランチを食べている間に、8割方認識できてしまう。あらためて、不思議に感じられてきました。

####[CIFAR-10データベース](https://www.cs.toronto.edu/~kriz/cifar.html)
![img04.png](https://qiita-image-store.s3.amazonaws.com/0/189863/f1ce3954-7f4a-60ef-7f59-6ee282aa4756.png)

---

####トライしたネットワーク構造
|Conv1|Conv2|Pool|DO|Conv3|Conv4|Conv5|Pool|DO|Dense|DO|
|:-: |:-: |:-:|:-:|:-: |:-: |:-:   |:-: |:-:|:-: |:-:|
|3x3 |3x3 |2x2|25%|3x3 |3x3 |3x3   |2x2 |25%|128~528|50%|
|32  |32  |   |   |64  |64  |64    |    |   |       |   |

####Convolution層数

![img01.png](https://qiita-image-store.s3.amazonaws.com/0/189863/618afb21-9cc8-b4c3-bb04-6885684ebcf3.png)

+ 4層まで、Test認識率が向上。
+ 5層の方が、過学習(Train-Test)も小さそうだが、ステップ毎計算時間も比例して増える。

####Dense層ノード数
![img02-2.png](https://qiita-image-store.s3.amazonaws.com/0/189863/21e98ec0-a921-18b9-2346-5990f02dae88.png)

+ Denseノード数が多い方が、過学習(Train-Test)が小さく見えるが、

![img03.png](https://qiita-image-store.s3.amazonaws.com/0/189863/e2340ab5-2e3a-01f5-6efc-57c76a203124.png)

+ ノード数が多いと、学習途中の損失関数の低下が遅くなってくる。縦軸が同じ(例 0.5)の時点で比較すると、過学習の度合いはほぼ同じだった。

---

####コメント
+ 次は、フィルターサイズ3x3とPadding、フィルター種数を変えて確認しようかと。フィルターサイズは元画像の分解能、フィルター種数はエッジ角度分解能等、層数は抽出特徴の組み合わせ段数、などと関係するのでは。

---

####今回使用したコード例

```
import numpy as np

import keras
from keras.datasets import cifar10
from keras.utils import to_categorical
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Dropout, Flatten, Dense

if __name__ == '__main__':
  nb_classes = 10
  batch_size = 128
  epochs = 24

  (X_train, y_train), (X_test, y_test) = cifar10.load_data()
  print(X_train.shape, y_train.shape, X_test.shape, y_test.shape)
  X_train = X_train.astype('float32')/ 255
  X_test = X_test.astype('float32') / 255
  Y_train = to_categorical(y_train, nb_classes)
  Y_test = to_categorical(y_test, nb_classes)
  
  model = Sequential()
  model.add(Conv2D(32, (3, 3), input_shape=X_train.shape[1:], activation='relu', padding='same'))
  model.add(Conv2D(32, (3, 3), activation='relu', padding='same'))
  model.add(MaxPooling2D(pool_size=(2, 2)))
  model.add(Dropout(0.25))
  
  model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
  model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
  model.add(MaxPooling2D(pool_size=(2, 2)))
  model.add(Dropout(0.25))

  model.add(Flatten())
  model.add(Dense(128, activation='relu'))
  model.add(Dropout(0.5))
  model.add(Dense(nb_classes, activation='softmax'))

  model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
  model.summary()
  
  model.fit(X_train, Y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_split=0.1)

  loss, acc = model.evaluate(X_test, Y_test, verbose=0)
  print('Test loss:', loss)
  print('Test acc:', acc)
```
[クイズ]javascriptと仲良くなるための一歩　第６話「ECMAScript第五版以前以後のundefined」

# ECMAScript第五版以前以後のundefined

undefined値は明示的に値を代入していない変数の初期値である。

##第1問「ECMAScript第五版以前」

```js
undefined = "abc"
undefined //=> ?
```

##第2問「ECMAScript第五版以後」

```js
undefined = "abc"
undefined //=> ?
```


:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:


##第1問「ECMAScript第五版以前」

```js
undefined = "abc"
undefined //=> "abc"
```

##第2問「ECMAScript第五版以後」

```js
undefined = "abc"
undefined //=> undefined
```

undefinedは、ECMAScript第五版の前後で動きが違います:hugging_face:
Chrome Developer Tools の Networkパネルでページ読込のたびに記録が破棄されないようにする

# どんなときに使えるか

例えば、あるフォームからPOSTされたデータを確認したいのだけど、POST後に別のページへリダイレクトするタイミングで記録が破棄されてしまうためPOST時のデータが確認できない、といったケースで使える。


# 設定方法

![スクリーンショット 2017-07-22 22.57.30.png](https://qiita-image-store.s3.amazonaws.com/0/32103/bce2e02a-769c-cb2e-256c-653dc5a26256.png)

Networkパネルを開くと上部に「Preserve log」というチェックボックスがある。
ここにチェックをつけると、ページ読込のたびに記録が破棄されることなく継続して記録され続けるようになる。
Raspberrypi 3 でUART通信（コンソール＆汎用）

#Raspberrypiでシリアル通信

できることは下記の2つ．

 - コンソールとして
   殆どの場合ではSSHを使用するが，ネット環境が無い場合のコンソール通信として．

 - 汎用通信
   デバイスtoデバイスの通信として．

#準備
Raspberrypi 3ではUARTを使用するためにクロックを固定する必要がある．

/boot/config.txtに以下の記述を追加する．
`enable_uart=1`

[Raspberrypi 3でUART通信する際の課題と解決方法](http://qiita.com/k_match/items/d2c2623ada18a694ba41)

#コンソールとして使用する
   
`sudo raspi-config`
->"5 Interfacing Option"
->"P6 Serial"


シリアルでシェルにログインするか聞かれるので"はい"を選択．
"Would you like a login shell to be accessible over serial?"
->"はい"
    
Finishを選択で再起動．


#汎用通信として使用する

`sudo raspi-config`
->"5 Interfacing Option"
->"P6 Serial"


シリアルでシェルにログインするか聞かれるので"いいえ"を選択．
"Would you like a login shell to be accessible over serial?"
->"いいえ"

シリアルポートを有効にするか聞かれるので”はい”を選択．
"Would you like the serial port hardware to be enabled?"
->"はい"

Finishを選択で再起動．

#UARTを使用する

通信端末(WindowsならTeraTerm等)のボーレートを115200に設定し，
Raspberrypiのコンソールで下記コマンドを実行．

```
stty -F /dev/serial0 115200
echo "Hello" > /dev/serial0
```

端末側で"Hello"が表示されれば成功．
書籍「CakePHPで学ぶ継続的インテグレーション」まとめ

以前読んだ本[「CakePHPで学ぶ継続的インテグレーション」](https://www.amazon.co.jp/dp/B00S7VXSCQ/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
の1章（概論）だけまとめてみました。
CakePHP使ってなくても、とても役に立つ内容ですし、
CIを導入するときにとても参考になると思います。
気になったらぜひ読んでみてください！


## 1-1 継続的インテグレーション

・インテグレーションは日本語で「統合」「一体化」
・プロジェクト初期からインテグレーションを実施することで、問題が小さなうちに対処できて、リスク軽減
・CIはビルドというリリースに必要な作業を自動化して簡単に実行可能に

## 1-2 ビルドとは？

下記のソフトウェアの正常さを検証するために必要な様々な作業のこと
・コンパイル・リンク（文法チェック）
・データベースのマイグレーション
・単体テスト
・インスペクション
・機能テスト
・ドキュメントの自動生成

### ビルドの種類
プライベートビルド
各自の開発環境上で実施するビルド。コミットする前に文法チェックや単体テストを中心に必要最低限の項目を行う。

###インテグレーションビルド
インテグレーションサーバ上でリポジトリの変更反映時や日次/週次等定期的に行う。定義されたすべての項目を実施し、状況を通知する。
特定のブランチでこれがうまくいったらステージングとかに自動デプロイするのはいいアイデアです。

###リリースビルド
コンパイルが必要な言語だと特別な設定が必要だったりするので、インテグレーションビルドと同等のビルドをリリース前に再実施する。

##1-3 メリット

誰でもいつでもビルドを実行できる
問題を素早く発見できるため、手戻りが減り、品質を向上できる
プロジェクトの状態を把握できる

ここで、ソフトウェアの状態を客観的に評価する手法の紹介です。
インスペクション
コーディング規約に準拠してないコードの検出
重複コード（コピペコード）の検出
複雑度の検出
ソフトウェアメトリックス
ソースコードの品質をコードの複雑さや結合度など、様々な定量化された数値指標を用いて評価すること。専用ツールで計測できるよ。
コードカバレッジ（コード網羅率）
テストを実行した結果、テスト対象のプログラム全体でテスト中に実行された部分が占める割合のこと。
コードカバレッッジ100%は目指さなくてもいいよ。無駄なテストとか生まれるからね。
コストとのバランスを考慮しよう。

##1-4 導入のタイミング

###新しい開発を始めるときが当然ながら最高！
CIサーバを構築しといたほうがいい。ビルドに時間かかったり安定しなくてエラーになったり、運用に手間かかってストレス爆発するから。
プロジェクト開始直後でもユニットテストをCIシステムで自動実行しよう。インスペクションも自動実行しよう。問題が発生したらメンバーに共有しよう。最初が肝心なのだ。
開発が進んだらCIシステムを進化させていこう。自動デプロイ設定とか。

###既に開発を開始しているときは
バージョン管理システムをとりあえず導入し、CIサーバを導入してみよう。
テストが用意されてないアプリでも、インスペクションを自動実行できるようにする。
↑で発見された修正を対応しながらユニットテストを追加していく。
地道にやろう！
bash をちょっとだけ便利にする（随時更新）

# ごあいさつ
はじめまして。
ちょっとだけ自己紹介させてください。

- がっちゃん or あはなう で呼んでもらえれば幸いです。
- Twitter : https://twitter.com/ahaha0807_alg やってます
- Ubuntu が好き（開発しやすい & Win よりも少ないリソースで快適に動く）

って人間です。

この記事では自分が好きな Ubuntu の bash をちょっとだけ便利にするための設定やコマンドを書いていきます。知るたびに随時更新です。

では、早速どうぞ。

# 全般設定系
## ディレクトリ・ファイル名の大文字/小文字を無視する

.bashrc に設定を書き込むだけです。
ワンライナーで書けるようにしておきました。
コピペしてどうぞ。

```bash:console
echo "bind 'set completion-ignore-case On'" >> ~/.bashrc | source ~/.bashrc
```

## 長いコマンドとかを少ないタイプ数で打てるようにする

bash には（他のshellでもありますが）**alias（エイリアス）**という便利な機能があります。
これも .bashrc という設定ファイルに登録すれば使えます。

例えば、私は再起動をぱっとできるようにしたいので、再起動コマンドのエイリアスを貼ったりしています。

```bash:console
alias rb='sudo reboot'
```

### 設定方法

```bash:console
echo "alias rb='sudo reboot'" >> ~/.bashrc | source ~/.bashrc
```
でワンライナーで書くか、

```bash:console
vi ~/.bashrc # これでテキストエディタを開き、
# どこかの行にこれを追加する => "alias rb='sudo reboot'"
:wq # これでテキストエディタを保存して閉じる
source ~/.bashrc # bash に適用
```

で .bashrc をテキストエディタで編集するやり方があります

# Rubyist(Rails User) 向き
## bundle exec をぱっと打てるようにする

上記の [**長いコマンドとかを少ないタイプ数で打てるようにする**](#%E9%95%B7%E3%81%84%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A8%E3%81%8B%E3%82%92%E5%B0%91%E3%81%AA%E3%81%84%E3%82%BF%E3%82%A4%E3%83%97%E6%95%B0%E3%81%A7%E6%89%93%E3%81%A6%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B) の応用でしかないのですが、個人的に ```bundle exec rails s``` って打つのがめんどくさくて嫌いだったので、設定しています。

```bash:console
echo "alias be='bundle exec'" >> ~/.bashrc | source ~/.bashrc
```

これで

```bash:console
be rails s
```

でいけるようになりました。
気持ち短くなった。便利。
プログラミングの情報管理方法

# このノートの目的

プログラミングのコード、ノウハウの情報管理をまとめる。

# まとめたい情報、使用用途

* まとめたい情報
    * コードスニペッド
    * ノウハウ
    * コード
* 用途
    * 勉強
    * 情報整理
    * 備忘録
        * スマホでは読みやすいか？→公式のアプリは無いためqiitaでは若干操作しにくいが読む分にはスマホサイトで十分。

ニュース記事などはビジネス系のものと一緒にevernoteにて管理。コードなどはシンタックスハイライトのあるqiita中心でまとめる。コード部分はgistで最小単位は管理する。（編集のしやすさのため）

# 管理方法

* 記事
    * ビジネス関連
        * evernote
    * プログラミング関連
        * qiita
* ノウハウ
    * qiita
        * 自分の記事と他の人の記事を横断的に管理するために自分の記事をストックしてストック一覧で管理。

* コード
    * gist

gistかkobitoか迷ったがコードを投稿する可能性が高いのはgithubだなと思い、gistに。
【Android】RetrofitでUse JsonReader.setLenient(true) to accept malformed JSONのエラーが出たときの対処法



## 結論

`setLenient()`を有効にしたGsonオブジェクトを`GsonConverterFactory.create()`に渡す。

## 環境

retrofit version: 2.3.0

## エラー内容

```
com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 2 column 5 path $
```

## サンプルコード

```java
Gson gson = new GsonBuilder()
        .setLenient()
        .create();

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(URL)
        .client(client)
        .addConverterFactory(GsonConverterFactory.create(gson))
        .build();
```
Windows環境でRubyの実行環境を構築する

#始めに
Windows環境でruby環境を構築する方法を書いています
自分的にベストプラクティスな方法なので異論はたくさんあると思います

#序章
Web上にはrubyの環境構築に関する記事がたくさんあるがどれも
- Mac or LinuxといったUnixOS系向け
- Windows向けは情報が古い、もしくは簡単にできるといるが、その通りにやっても全然うまくいかない
- DBはmysqlかsqliteがほとんど、開発現場でよく使われているOracleに関する記事はほとんどない
で、Windowsで開発する人にとってrubyは
「DBに接続するアプリケーションを作ったり、webアプリを作る環境をつくる」
ことが相当ハードルが高かったりする
（少なくとも、自分はそうだった）
なので、これからWindowsでRubyをやろう、という人向けにできるだけ労力が少なく済む環境構築手順を書いてみようと思う

#JRubyを使う
rubyのインタープリターは色々あるが、私はJRubyを使うことをお勧めする
Web上の記事に頻出する「MRI (Matz' Ruby Implementation)　」を使うと、gemからモジュールを取得するときのCモジュールのコンパイルでひどい目に会う。
（なぜか、この話はWeb上であんまり言及されていません。rubyを使う人はみんなCモジュールを自前でコンパイルできる人たちなのか？）
その点、JRubyはJVM上で動作するので、公式のインタプリたより導入のストレスは感じない
JRubyの欠点はモジュール実行の立ち上がりが遅いことだが、とりあえずrubyに触ってみようと人にとっては大して気にならない欠点だろう

##JRubyの導入手順
###JDKを導入する
まぁ、これはWeb上に腐るほど紹介記事が出ているのでここで書くことは何もない
適当なJDK1.8系をダウンロードしてJDKをイントールすればよい
###JRubyを導入する
[JRubyの公式サイト](http://jruby.org/2017/06/15/jruby-9-1-12-0.html)から適当なVersionをダウンロードしてインストールするだけ
###NetBeansを導入する
Javaな人はEclipseでできるのではという人もいるかもしれないが、個人的にお勧めしない
NetBeansを使えばRailsのインストールが世の中にあふれているやり方よりはるかに簡単にできるし、エディタとしても使いやすい
[NetBeans 8.0.1にRuby on Railsプラグインをインストールする手順](https://www.oiax.jp/rails/zakkan/how_to_install_rails_plugin_on_netbeans_8_0_1.html)にRailsの導入まで記載してあるので、それに従って作業をすればよい
###JDBCドライバの導入
JRubyのイントール配下/libにOracleのJDBCを配置しておく
OracleのJDBCについはWebを検索すればたくさん出てくると思うので、それを参考にしてダウンロードしておく

##Oracleとの接続について
世間一般ではOCIとかAcitivReroderを使うのが主流なようだが、私はそのいずれも試してみてうまくいかなかった
OCIは前の記事の通りでDLLの読み込みがうまくいかず、AcitivReroderはRailsのバージョンとjdbc‐adapterのバージョンがあっていないようでうまく動かない、下のようなエラーをはいて
```Gem::LoadError: Specified 'jdbc' for database adapter, but the gem is not loaded. Add `gem 'activerecord-jdbc-adapter'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord).```
まぁ、そもそもAcitivReroderは規約ベースな設計なのでSQLをバリバリ書いて発行したい私にとっては、扱いにくいというのもあるが
###Sequelを導入する
Web上でRubyのDB接続について色々調べていると、Sequelが自分にとってピッタリなものに見えた
[Sequel について (その1)](http://tmtms.hatenablog.com/entry/2013/10/27/sequel)を参考に自前の開発環境に入れてみたが、これが、oracleのthin接続もサポートしており、なかなか使い勝手が良かった
ために疎通用のプログラムを書いてみた

```mydb.rb
require "sequel"
DB = Sequel.connect('jdbc:oracle:thin:triple/triple@//localhost:1521/triple_pb.co.jp')

##テーブル情報を表示する
DB.fetch("select table_name from user_tables ")
.all do
  |x|puts x 
end

##特定のテーブルのカラム情報を情報を表示する
DB.fetch("select table_name,COLUMN_NAME from user_tab_columns ")
.where(:table_name =>["WEBPAGE_WORD","WORD_DICTIONAY"]) 
.order(:col1=>"table_name")
.all do
  |x|puts x 
end
```
で、実行すると

```
{:table_name=>"WORD_DICTIONAY"}
{:table_name=>"WEBPAGE_WORD"}
{:table_name=>"EMP"}
{:table_name=>"PARKINGATTIME"}
{:table_name=>"EMP", :column_name=>"EMP_ID"}
{:table_name=>"EMP", :column_name=>"EMP_NAME"}
{:table_name=>"PARKINGATTIME", :column_name=>"PARKING_AREA_ID"}
{:table_name=>"PARKINGATTIME", :column_name=>"RENBAN"}
-以下略
```
と正しく出力結果が表示される。
めでたし、めでたし
BigQueryの12のコンポーネント

下記のメモ。図は下記URLのものを引用。
https://medium.com/google-cloud/the-12-components-of-google-bigquery-c2b49829a7c7

BigQueryの主要なコンポーネントについて顧客視点（利用者視点）からまとめている。

以下は顧客視点でのBigQueryの構成概要
![スクリーンショット 2017-07-21 16.27.24.png](https://qiita-image-store.s3.amazonaws.com/0/95399/3fbac511-6838-af75-7a4e-ee79771394f1.png)


#Serverless Service Model
BigQueryはサーバレスモデルで、VMやCPU/RAMのサイジングをする必要がない。BigQueryの計算能力はすごい伸縮性があり、数秒で数万コアまでスケールする。

#Opinionated Managed Storage Engine
BigQueryはすばらしいストレージエンジン、継続的に進化し最適化するストレージを備えている。
GFSの後継であるColossusは耐久性があり、高性能でスケールする。BigQueryはデータを独自のCapacitorフォーマットでColossusにストアする。
BigQueryのCapacitorは多数の最適化をしている。
https://cloud.google.com/blog/big-data/2016/04/inside-capacitor-bigquerys-next-generation-columnar-storage-format

#Dremel Execution Engine & Standard SQL
BigQueryはDremelの上で実行されている。Dremel自身は進化し、paperで記述されていたころから変わっている。最近ではStandard SQLのサポートもDremelでされるようになった。

#The Jupiter Network and Separation of Storage & Compute
Jupiterにより、BigQueryは中断なしにストレージからデータを読み取り、計算へ処理を投げることができる。
https://cloud.google.com/blog/big-data/2016/01/bigquery-under-the-hood

#Enterprise-Grade Data Sharing
BigQueryではデータを他の組織にシェアできる。

#Public Datasets, Commercial Datasets, Marketing Datasets, and FREE TIER!!
パブリックデータセットが公開されていたり、コマーシャルデータセットでマネタイズしたり、Google AnalyticsやAdowords, DoubleClickやYoutubeのデータはワンクリックでBigQueryにロードできたりする。
また永久のfree tierがあり、10GBのストア、1TBまでのクエリ(1ヶ月で)は無課金で利用できる。

#Streaming and Batch Ingest
1秒間に数百万行のストリームデータをBigQueryにストアでき、分析はすぐに行える。
![スクリーンショット 2017-07-22 22.14.16.png](https://qiita-image-store.s3.amazonaws.com/0/95399/6e84c0bf-6913-82ce-a692-ec1e83ac6b0e.png)

https://cloud.google.com/blog/big-data/2017/06/life-of-a-bigquery-streaming-insert

#Federated Query Engine
データがBigtableやGCS,Google Driverにある場合、データを動かさずBigQueryから直接クエリをかけられる。
https://cloud.google.com/bigquery/external-data-sources

#UX, CLI, SDK, ODBC/JDBC, API
典型的なアクセスパターンはREST APIをラップしたもの。

#Pay-Per-Query AND Flat Rate Pricing
BigQueryは２つのコストモデルがある。1つは使用した分だけ払うクエリのコストと、もう一つはエンタープライズレベルでの定額モデル(Flat Rate Pricing model)。定額モデルだと、ある一定額支払うとクエリが投げ放題になる。

#IAM, Authentication and Audit Logs
BigQueryはIAMポリシーに準拠している。そしてAudit LogsではBigQuery上で何が行ったかトレースできる。
https://medium.com/google-cloud/visualize-gcp-billing-using-bigquery-and-data-studio-d3e695f90c08