OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails頭の体操】これは何と同じ動作でしょう？

## 問題

今やってるプロジェクトにポツンとあった不思議なスコープからのクイズです。:chicken:

```ruby
categories = Category.first(3)
```

このcategoriesを以下のスコープが並び替えます。

```Category.rb
scope :order_array_by_updated, ->(categories_array){
  where(id: categorie_array.map(&:id)).
  order("updated_at desc")
}
```


このスコープはrailsで用意されているメソッドを使えばもっと簡単に書けます。
それはなんでしょうか？


・
・
・

### ヒント
以下のように呼んで、
categoriesをupdated_at降順に並び替えてくれます。

```
Category.order_array_by_updated(categories)
```

・
・
・
・
・
・
・
・
・
・
・
・
・
・
・

## 正解

```ruby
categories.order("updated_at desc")
```

何かに疲れた誰かが定義してしまったのでしょう:innocent:
Dockerfileを使ってbitcoindをコンテナ化してみた

環境を汚すことなくbitcoindを使いたかったので、bitcoindをコンテナ化してみました。
# 1.Dockerfileの作成
まずは、Dockerfileを作成。
ubuntuのイメージに対し、以下の処理を追加します。

- ビルド環境用パッケージのインストール
- boost関連パッケージのインストール
- bitcoinソースコードのクローン
- bitcoinソースコードのコンパイル
- bitcoindが使用するポートの開放

```text:Dockerfile
FROM ubuntu:16.04

RUN  \
  apt-get update && \
  apt-get -y install build-essential libtool autotools-dev automake pkg-config libssl-dev libevent-dev bsdmainutils \
  libboost-all-dev \
  libboost-system-dev libboost-filesystem-dev libboost-chrono-dev libboost-program-options-dev libboost-test-dev libboost-thread-dev \
  software-properties-common && \
  add-apt-repository ppa:bitcoin/bitcoin && \
  apt-get update && \
  apt-get -y install libdb4.8-dev libdb4.8++-dev

RUN  \
  apt-get -y install git && \
  git clone https://github.com/bitcoin/bitcoin.git

WORKDIR bitcoin

RUN   \
  ./autogen.sh && \
  ./configure --without-gui && \
  make && \
  make install

EXPOSE 8332 8333 18332 18333
```
# 2.dockerイメージの作成
次に、dockerイメージを作成。
ビルドに時間がかかる。。30分くらい待機。
`docker build -t hogehoge:docker-bitcoind .`
# 3.dockerコンテナの起動&接続
そして、dockerコンテナを起動&接続。
`docker run -it hogehoge:docker-bitcoind bash`
# 4.bitcoind動作確認
とりあえず、ローカル環境のテストネットを起動。
`bitcoind -regtest -deamon`

なんかプロンプトが返ってこないので、別ターミナルでコンテナに接続しブロックを生成をしてみる。
`bitcoin-cli -regtest generete 101`

とりあえず、ちゃんと動くっぽい。
ここから先は、下のサイトを使って勉強してみるかなー。

- bitcoin-cli で使えるコマンド一覧
　http://bitcoin.clock-up.jp/contents/admin/command-list


## 参考にさせていただきました
- Bitcoindのコンパイル
　http://qiita.com/tnakagawa/items/281935f3b2c9ecfd0f1e
早くdeviseいれたいねん！ ① -- 入門手順で導入してみる --

最低限のコマンドとコードだけをまとめました。（２回目以降の導入に）

もう少し丁寧な導入方法はこちら
[初めてのdevise ① -- 導入してみる --]
(http://qiita.com/uloruson/items/ffb3d719b6d2fbea1afd)

## **環境**
- Ruby 2.3.3
- Rails 4.1.16
- Windows 8 64bit


## **作業**

```bash
$ rails new devise
```

```rb:Gemfile
gem 'rails', '4.1.16'
gem 'sqlite3'
gem 'sass-rails', '~> 4.0.3'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.0.0'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0',          group: :doc
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw]  #Win 32bitなら :x64_mingwは不要。
gem 'bcrypt-ruby', '~> 3.0.0'          # ←いれないとcannot load such file -- bcrypt_extが発生します。

#↓↓↓以下を追記します↓↓↓
gem 'devise'

```

```bash
$ bundle install
$ rails g devise:install
$ rails g devise User
$ rake db:migrate
$ rails g controller home index
```

```erb:application.html.erb.
<!DOCTYPE html>
<html>
<head>
  <title>Devise</title>
  <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track' => true %>
  <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
  <%= csrf_meta_tags %>
</head>
<body>

  <!-- ↓↓↓これを追記↓↓↓ -->

  <p class="notice"><%= notice %></p>
  <p class="alert"><%= alert %></p>

  <% if user_signed_in? %>
    ログインユーザー： <%= current_user.email %>
    <%= link_to 'アカウント変更', edit_user_registration_path %>
    <%= link_to "ログアウト", destroy_user_session_path %>
  <% else %>
    <%= link_to "TOP画面", root_path %>
    <%= link_to "新規作成", new_user_registration_path %>
    <%= link_to "ログイン", new_user_session_path %>
  <% end %>
  
  <!-- ここまで -->

  <%= yield %>

</body>
</html>
```

```rb:routes.rb
Rails.application.routes.draw do

  devise_for :users
  root to: "home#index"

end
```

動作確認しましょう！
QComboBoxで、項目が増えたのでキーボードでも補完できるようにしようと思ったときの落とし穴

QComboBoxではQStringListから１つの文字列を選ばせるのに使うと便利なやつです。しかも、キーボード補完とかもできます。いいやつですね。でも、単純にeditableをtrueにだけしてはまったのでメモ

よくあるユースケース
======================

1. コンボボックスが2つあります。
1. 1つ目のQComboBoxで親項目を選びます
2. 選んだらその項目に応じて、子供のQComboBoxの値を変更して、子供の値も選べるようにします

editableをtrueにしたときの注意点
==============================

親のQComboBoxを選択したときのイベントとしては、currentTextChanged(QString)、currentIndexChanged(QString)、currentIndexChanged(int)あたりのイベントを使っているかと思います。

これはプルダウンメニューとして選択したときには呼ばれます。なので、いくつか先頭の文字をタイプして、カーソルで選択 or マウスで選択したらこれらのイベントハンドラが呼ばれます。

しかし、親項目を正確に全部キーボードで入力したらこのイベントハンドラは呼ばれません。editTextChanged(QString)が呼ばれます。このスロットで、コンテキストメニューに入っているのと同じ文字列であったら、currentTextChanged(QString)をコードから呼び出してあげる、ということが必要です。そうじゃないと、親項目が選択されていない状態になってしまう。

あとは、あくまでもコード補完で、新規項目を使わないのであれば、insertPolicyをNoInsertにしてあげると良いでしょう。
OpenCVで顔認識をしてみた

OpenCVは画像処理に使えるオープンソースのライブラリです。これはPythonでも使うことができるので機械学習でも使うことができます。今回はこのOpenCVを利用して顔認識をやってみようと思います。

今回の動作環境

- Ubuntu 14.04
- Python 3.6.1
- OpenCV 3.1.0

#今回やること
画像を読み込み、画像の中に顔を認識したら顔の座標と大きさを表示させます。その後、認識した顔を赤い四角形で表示させます。OpenCVには顔認識に使える特徴データのファイル（カスケードファイル）がいくつか用意されています。今回は正面を向いた時の顔を認識するデータファイルとして、```haarcascade_frontalface_alt.xml```を使用します。なお、今回は以下の画像を使用して認識をします(ソースコード上では```before.jpg```としています)。
![before.jpg](https://qiita-image-store.s3.amazonaws.com/0/170520/238f9284-b081-8b9d-63ae-7fe9050e417c.jpeg)

参照元：https://www.pakutaso.com/assets_c/2016/03/SAYA151005380I9A8403-thumb-autox1600-21549.jpg

#ソースコード
```python:front_face.py
#coding: utf-8
import cv2

cascade_file = "haarcascade_frontalface_alt.xml"
image_file = "before.jpg"

img = cv2.imread(image_file)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

cascade = cv2.CascadeClassifier(cascade_file)
face_list = cascade.detectMultiScale(img_gray, minSize=(150, 150))

if len(face_list) == 0:
  print("Fail recognise")
  quit()

for (x, y, w, h) in face_list:
  print("顔の座標 =", x, y, w, h)
  color = (0, 0, 225)
  pen_w = 8
  cv2.rectangle(img, (x, y), (x+w, y+h), color, thickness = pen_w)

cv2.imwrite("after.jpg", img)

```
実行したところ、こんなエラーが出ました。

```
OpenCV Error: Assertion failed (!empty()) in detectMultiScale, file /home/travis/miniconda/conda-bld/conda_1486587069159/work/opencv-3.1.0/modules/objdetect/src/cascadedetect.cpp, line 1639
Traceback (most recent call last):
  File "face_front.py", line 11, in <module>
    face_list = cascade.detectMultiScale(img_gray, minSize=(150, 150))
cv2.error: /home/travis/miniconda/conda-bld/conda_1486587069159/work/opencv-3.1.0/modules/objdetect/src/cascadedetect.cpp:1639: error: (-215) !empty() in function detectMultiScale

```
- 原因

調べてみたら、カスケードファイルのパスが間違っていることで起こっているエラーのようです。

- 解決策

応急処置としてこのカスケードファイルをソースコードのあるディレクトリにコピーしてきて使うことが出来ました。

#結果
実行結果として以下のような画像になりました。![after.jpg](https://qiita-image-store.s3.amazonaws.com/0/170520/4d28deb0-6e4b-92d1-6287-5656acea3cc3.jpeg)
#参考
[Ubuntu16.04 LTSにOpenCV3.1をインストール から顔認識のテストまで](http://ossyaritoori.hatenablog.com/entry/2016/10/21/032713)
Docker for mac で20GB以上macの容量を喰っていたのでその対処

## はじめに
Docker for macを使っていたら自分のmacがやたら重くなり、なんでかなって原因を調べてたら、Docker.qcow2というファイルで21GBも容量を喰っていた...
そこでやったことをまとめたいと思います。

## 停止しているコンテナを全て削除する
```
docker container prune
```

このコマンドは、プロセスが終了したコンテナを削除します。

## 使われてないボリュームを全て削除する
```
docker volume prune
```

どのコンテナからも使われてないボリュームの削除します。

## コンテナが使っていないイメージをすべて削除する
```
docker image prune
```

コンテナに使われてないイメージのみ一括削除します。

これで使える容量が増えるかなと思っていたら、全然変わってなかった...
そこで、[この記事を参考に](https://gendosu.jp/archives/3009)Docker for macをリセットしてみました。

## Docker for mac をリセットする
手順は非常に簡単でした。
メニューバーに表示されているDocker for macのアイコンの中のPreferancesを開きます。
そのあとは、resetを開いて`Reset factory defaults`を選べば、丸ごと消してくれます。

リセットすることで、20GB程、容量が使えるようになりました。

![reset](https://i.gyazo.com/35dcf3e1486aa42587027a4b92318723.png)

## 参考
[Docker for macでDocker.qcow2というファイルが肥大化する件](https://gendosu.jp/archives/3009)
[Dockerの不要なコンテナ・イメージを一括削除する方法](https://suin.io/537)
GCS Note


# IAM ?
New feature. ACL via IAM on specific bucket.

## gsutil
`gsutil iam ...`

IAM config not appears in `gsutil acl`

## VS legacy ACL
Legacy ... bucket policy effects on bucket itself. Not apply to Object

```
e.g User A,B is bucket `hoge`s owner @legacy acl
A create hoge/a.txt OK
B create hoge/b.txt OK
B delete hoge/a.txt NG (becaz a.txt 's ACL not allow B's ops)
```


IAM ... IAM policy apply to not only `objects` but also `buket`. 

```
e.g User A,B is bucket `hoge`s owner @IAM
A create hoge/a.txt OK
B create hoge/b.txt OK
B delete hoge/a.txt OK (becaz IAM nothing to do with object acl)
```

# 2017-06-16's DC
We can set legacy bucket ACL. But can not set default ACL..
If you want to set default ACL, use `gsutil`

# GCS access for Non project member

`https://console.developers.google.com/storage/[bucketname]/`
↑ old now redirect to
`https://console.cloud.google.com/storage/browser/[bucketname/`
HTMLのAタグでPOSTする方法

AタグからPOSTする為の方法

```html:atag_post.html
<form method="post" name="form1" action="link.php">
    <input type="hidden" name="user_name" value="名前">
    <a href="javascript:form1.submit()">リンク名</a>
</form>
```
hrefの値をフォーム先にしてやるのが一番簡単そう。

他にも色々やり方があったけど、この方法が一番スマートな気がする。

2017年10月01日追記
やたらとこのページだけアクセス数が多いので追記しておきます。
**ループなどで複数の同名FORM部品がある場合**の対応方法。

簡単な一例を書いておきます。

```php:atag_post.php
<?php
/*  一部処理を端折ってます
 *  $connect : データベースへのリンク
 *  closeしてなかったりします
 *  仮にuser_nameは　0：遠藤　1：田中　2：浜田　とします。
 */

// クエリ：user_table から user_name を選択
$sql = "SELECT user_name FROM user_table";
// クエリ結果を $result にセット
$result = mysqli_query($connect, $sql);
// 結果セットを1件ずつ取り出し、$name_rows に配列として格納
while ($row = mysqli_fetch_assoc($result)) {
    $name_rows[] = $row;
}
// 結果セット解放
mysqli_free_result($result);

for($i = 0; $i < 3; $i++){
?>
  <form method="post" name="form1" action="link.php">
    <input type="hidden" name="user_name" value="<?php echo $rows[$i]["user_name"]; ?>">
    <a href="javascript:form1[<?php echo $i; ?>].submit()"><?php echo $rows[$i]["user_name"]; ?></a>
  </form>
<?php } ?>
```
```html:html出力
<form method="post" name="form1" action="link.php">
  <input type="hidden" name="user_name" value="遠藤">
  <a href="javascript:form1[0].submit()">遠藤</a>
</form>
<form method="post" name="form1" action="link.php">
　<input type="hidden" name="user_name" value="田中">
  <a href="javascript:form1[1].submit()">田中</a>
</form>
<form method="post" name="form1" action="link.php">
　<input type="hidden" name="user_name" value="浜田">
  <a href="javascript:form1[2].submit()">浜田</a>
</form>
```

hrefのフォーム名に順番をつけてやることによってAタグで囲ったリンクが何番目のAタグなのかを明示することができます。ループ処理でFORMを出力する時は何番目かを指定してやらないと毎回、最初のフォーム(ここで言うと[0]番目のフォーム)の内容ばかりPOSTすることになります。

比較的簡単な処理なので悩んでる人がいたら参考にして下さい
IBM Watson IoT に Raspberry Pi を接続する

参考にしたページ
[余ったRaspberry Piで始めるIoT入門 Bluemixと接続するチュートリアル](https://www.webprofessional.jp/connecting-a-raspberry-pi-to-ibm-watson-and-bluemix/)

プログラムのダウンロード

```bash
curl -LO https://github.com/ibm-messaging/iot-raspberrypi/releases/download/1.0.2.1/iot_1.0-2_armhf.deb
```

インストール

```bash
sudo dpkg -i iot_1.0-2_armhf.deb
```

プログラムの稼動の確認

```bash
sudo systemctl status iot
```

接続する URL を調べる

```bash
sudo service iot getdeviceid
```
http://quickstart.internetofthings.ibmcloud.com/?deviceId=****
という mac アドレスを引数とするアドレスが示される

接続している時の状態

![ibm_watoson_iot_on.png](https://qiita-image-store.s3.amazonaws.com/0/179446/bca3b118-5f2f-30e1-817a-6f58000c5c58.png)

接続の切断

```bash
sudo systemctl stop iot
```

切断した時の状態

![ibm_watoson_iot_off.png](https://qiita-image-store.s3.amazonaws.com/0/179446/485a33d5-ddf2-5183-eb52-71c83d4449d0.png)

再接続

```bash
sudo systemctl start iot
```

自動起動を止めるには

sysv-rc-conf　をインストール

```bash
sudo apt install sysv-rc-conf
```

自動起動を停止

```bash
sudo sysv-rc-conf iot off
```

自動起動しないことの確認

```bash
sudo sysv-rc-conf --list iot
```
Ansible の shell モジュールでチェックモードも考慮して冪等性を保つ：改

以前、下記のような方法で shell モジュールでファイルが無いときだけ実行して、かつ、ファイルがあるときは **ok** と表示させつつ、チェックモードで実行したときにも **changed** とか **ok** とかそれっぽく表示できるようにしてみましたが、

- [Ansible の shell モジュールでチェックモードも考慮する - Qiita](http://qiita.com/ngyuki/items/69c33065f7daa0cd571d)

最近の Ansible なら（2.1以上）、チェックモードで実行されているかどうか `ansible_check_mode` マジック変数で判断できるので、↓のようにもっと簡単？にできました。

```yaml
- hosts: localhost
  tasks:
    - name: create hoge
      shell: |
        # ファイルが存在するなら ok を標準出力に出して終了
        if [ -e /tmp/hoge ]; then
          echo ok
          exit
        fi

        # チェックモードなら何もしない
        if [ "$ansible_check_mode" -ne 0 ]; then
          exit
        fi

        # 実際の処理
        uname -a > /tmp/hoge

      environment:
        # ansible_check_mode を環境変数で渡す
        ansible_check_mode: '{{ ansible_check_mode|int }}'
      register: res
      # チェックモードでも実行する
      check_mode: no
      # 標準出力が ok なら変更なしとみなす
      changed_when: res.stdout != 'ok'
```

この例だと簡単すぎてそもそも shell モジュールでやる必要無くね？ と思いますが、例のためのサンプルなので本当はもっと shell モジュールでなければ出来ないことなのだと思ってもらえればと・・・例えば `make -q` の終了コードで実行の要否を判断するとか？

```yaml
---
- hosts: localhost
  tasks:
    - name: make hoge
      shell: |
        make -q
        if [ $? -ne 1 ]; then
          # 終了コードが 1 以外ならビルド不要かエラーのどっちか
          exit $?
        fi
        if [ "$ansible_check_mode" -eq 0 ]; then
          if ! make; then
            exit 2
          fi
        fi
        exit 1
      environment:
        ansible_check_mode: '{{ ansible_check_mode|int }}'
      register: res
      check_mode: no
      changed_when: res.rc == 1
      failed_when: not res.rc in (0, 1)
```

チェックモードでもそうじゃなくても、ビルドが必要なら **changed** になるし、不要なら **ok** になります。
Vimを丸暗記する前に

# はじめに

Vimのコマンドをまとめた記事はよく見かけますが、丸暗記しようとすると余計大変です。
3行コピーペーストするのは、`3yyp`で、`"`の中を消すのは`di"`で、ファイル全選択は`ggVG`・・・って複雑化してくると困ります。

丸暗記する前に、基本的な考え方を覚えて、効率よくコマンドを覚えましょう。

# コマンドの基本

コマンドを丸暗記する前に、2つの考え方を意識すると、コマンドを覚えやすくなり、応用も効くと思います。(個人の感想です)

## 1. コマンドは回数と命令と範囲の組み合わせ

Vimのコマンドはざっくり以下のような形になっています。

`(回数) + (命令) + (回数) + (範囲)`

### 命令と範囲について

例えば、文字を削除するコマンドは`d`を使います。これをオペレータといいます。上の(命令)部分です。
次の単語の先頭に移動するコマンドは`w`です。これを範囲として使ってみましょう。
コマンドは、`dw`となりますね。
現在の地点から、次の単語の先頭まで文字が削除されました。

文字を選択し、ビジュアルモードに入るコマンドは`v`です。
次の単語の先頭に移動するのは`w`でした。
では`vw`というコマンドの結果は…？

こんな感じで、セットで覚えるというよりもあくまで組み合わせなんだよっていうのを最初に意識してほしいです。

### 回数について

コマンドや範囲の前には数字を付けることができます。
数字分だけの後ろの行動を繰り返すイメージです。

`w`は1単語移動するコマンドでした。
`3w`とすると、3単語移動できます。

では、3つ後ろの単語までを削除するコマンドは？
`d3w`です。
さらにそれを5回繰り返したければ、`5d3w`となります。

こんな感じで、数字は様々なコマンドに応用できるんだよってことです。

## 2. 小文字のコマンドと大文字のコマンドは範囲の違いが多い

あるキーで出来ることを大文字にすると、同じ動作の範囲が異なるコマンドになることが多いです。
なので、両方を覚えるというよりは、まずは小文字のコマンドを覚え、徐々に大文字と使い分けるといいと思います。
以下は、小文字コマンドを大文字にした時のパターン例です。

### パターン1:大文字にすると行指定になる

`d`というコマンドは、削除を行うためのコマンドですが、`D`とすると、1行削除になります。
同様のものに、`I`,`A`,`V`,`C`などがあります。
「末尾までになる」と解釈するならば、`G`も含まれるかもしれません。

### パターン2:大文字にすると「単語」が空白単位になる

`w`は次の単語の先頭まで移動します。ハイフンやカンマなども単語の区切りとみなします。
`W`となると、単語の定義が代わり、空白が来るまでは1単語となります。
`B`や`E`が同様です。

### パターン3:大文字にすると逆方向になる

検索後に`n`を押すと、次の候補を検索することができます。
`N`とすると、逆方向です。
同様に、`F`,`X`,`O`,`P`などは、前後が逆になっていると感じます。


上記3パターンに当てはまりませんが、`R`も同じ動作の亜種のようなコマンドだと思います。

### パターン4:小文字と無関係

もちろん、すべての大文字に当てはまるわけではなく、大文字が小文字の動作と無関係に独立しているものもあります。
`J`や、`H`,`M`,`L`などが該当します。
個別に覚えましょう。

# 結論

二つの異なるコマンドをくっつけて覚えるより、別々で覚えたほうが応用効くと思う！
日付FROM-TOのデータを穴埋めする

例えば、新幹線みたいに料金が繁忙期と閑散期で異なる設定がされている場合、こんな料金設定テーブルを考えつくかと思います。

CHARGE_PLAN

|PLAN_NAME|START_DATE|END_DATE|
|:----|:----|:----|
|閑散期|2015-05-10|2015-07-19|
|繁忙期|2015-07-20|2015-08-31|
|閑散期|2015-09-01|2015-12-20|

こんな形のテーブルは、「今日有効な料金設定はどれだっけ?」をとってくるには問題ないですが、月次データ集計などで他のイベントテーブルとジョインして処理しようとすると面倒です。

OracleにはMODEL句というあまり現場で使われているのを見かけない機能があり、これを使うとダミーのView的なものが簡単に作れます。
http://codezine.jp/article/detail/3091

年分のカレンダーは以下のようなSQLで作れます。

```sql
SELECT c1 FROM dual
  MODEL dimension by (1 as rn)
  MEASURES (sysdate as c1)
  rules iterate (365)
  (c1[ITERATION_NUMBER]=SYSDATE-ITERATION_NUMBER)
ORDER BY 1
```

```:実行結果
16-06-17
16-06-18
16-06-19
16-06-20
16-06-21
…
17-06-14
17-06-15
17-06-16

365行が選択されました。
```

さて、これを先の料金設定のFROM-TOのデータから穴埋めした範囲データを作ります。
カレンダーとクロスジョインしてFROM-TOで挟みうつだけです。

```sql

SELECT d, PLAN_NAME
FROM (
  SELECT d FROM dual
  MODEL dimension by (1 as rn)
    MEASURES (TO_DATE('2017-12-31') as d)
    rules iterate (365)
    (d[ITERATION_NUMBER]=TO_DATE('2017-12-31')-ITERATION_NUMBER)
  ORDER BY 1) CAL
CROSS JOIN CHARGE_PLAN CP
WHERE d BETWEEN CP.start_date AND CP.end_date
ORDER BY d;
```

```:実行結果
17-05-10 閑散期
17-05-11 閑散期
17-05-12 閑散期
17-05-13 閑散期
…
17-07-17 閑散期
17-07-18 閑散期
17-07-19 閑散期
17-07-20 繁忙期
17-07-21 繁忙期
17-07-22 繁忙期
…
17-08-30 繁忙期
17-08-31 繁忙期
17-09-01 閑散期
…
17-12-16 閑散期
17-12-17 閑散期
17-12-18 閑散期
17-12-19 閑散期
17-12-20 閑散期

225行が選択されました。
```

これで、実際の乗車イベントデータとJOINして集計すれば、乗客ごとの利用料金集計などもSQL一発でできることになります。
Firebase Performance Monitoring Automatic Traces


[Firebase Performance Monitoring Automatic Traces](https://firebase.google.com/docs/perf-mon/automatic) についてのメモです。

<div align="center"><img src="https://qiita-image-store.s3.amazonaws.com/0/33505/beff7fef-87a8-ffc4-cf98-6dad75cd19c2.jpeg" width=60%></div>

トレースは、アプリ内の2つの時点で取得されたパフォーマンスデータのレポートです。
Performance Monitoring SDKをインストールすると、次のタイプのトレースが自動的取得されます。

* ユーザーがアプリを開いてからアプリが応答するまでの時間を測定するアプリ開始トレース。
* アプリケーションがバックグラウンドで実行されている時間を測定するバックグラウンドトレースのアプリ。
* アプリケーションがフォアグラウンドで実行され、ユーザーが利用できる時間を測定するフォアグラウンドトレースのアプリ。

パフォーマンスモニタリングは<font color="OrangeRed">現在ベータ版</font>です。

## 自動トレースの定義
パフォーマンスモニタリングは、アプリケーションのメソッド呼び出しと通知を使用して、各タイプの自動トレースの開始と停止を判断します。

| トレース名 | iOS | Android |
|:-----------|:------------|:------------|
| App start | アプリケーションが最初のObjectをメモリにロードし、アプリケーションがUIApplicationDidBecomeActiveNotification通知を受け取った後に最初に成功した実行ループの後に停止すると開始します。 | アプリケーションのFirebasePerfProvider ContentProviderがonCreateメソッドを完了し、最初のアクティビティのonResume（）メソッドが呼び出されると停止します。 |
| App in background  | アプリケーションがUIApplicationWillResignActiveNotification通知を受け取ったときに開始し、UIApplicationDidBecomeActiveNotification通知を受け取ったときに停止します。 | フォアグラウンドを終了する最後のアクティビティが呼び出されたときに開始され、フォアグラウンドに到達する最初のアクティビティが呼び出されたときにonResume（）メソッドが呼び出されたときに停止します。 |
| App in foreground | アプリケーションがUIApplicationDidBecomeActiveNotification通知を受け取ったときに開始し、UIApplicationWillResignActiveNotification通知を受け取ったときに停止します。 | フォアグラウンドに到達する最初のアクティビティでonResume（）メソッドが呼び出され、フォアグラウンドを終了する最後のアクティビティでonStop（）メソッドが呼び出されたときに開始されます。 |
Cognos 動的クエリーモード(DQM)でデータソース接続の分離レベルを設定する方法

##概要
Cognosでデータソースを定義する際に、DBへの分離レベルを設定する事があると思います。
分離レベルとは、以下の画面のような「カーソル固定」とか「コミット読み取り」の設定です。
データソースの分離レベル設定をこちらで行なうのは、互換モード(CQM)での方法で、動的クエリーモード(DQM)ではここの設定は効きません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/e5bf82ae-75d1-64fe-f487-ec0659d5eea1.png)

DQMの場合はどこで設定すれば良いかの情報です。

##内容
DQMの場合は、データソース接続の最後に出てくる、こちらのコマンドの指定の画面の「接続開始のコマンド」の中で指定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/cc855031-f6a4-5f27-b418-6c8d19a3d673.png)

コマンドの指定はXMLの記載により行いますが、以下のように記載して、分離レベルを指定する事が可能です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/147246/6d5b9be4-9a84-42ac-c27b-0b03d876366c.png)

**Db2がデータソースの場合**
コメント欄で読者の方からフィードバックを頂きました。ありがとうございます！
Db2がデータソースの場合、DQMでの分離レベルを指定するコマンドは以下となります。
set current isolation = ur

##参考情報
**Dynamic Query Mode does not respect the Isolation Level setting of a Data Source**
http://www-01.ibm.com/support/docview.wss?uid=swg21665985
遅延_ディレイ（二次元）のエクスプレッション文　メモ

#エクスプレッション文の勘違い
まずディレイにはこの分を使います。
.valueAtTime(time-0.3)

２次元を遅延をさせるとき、xとyで分かれているので
size[0].valueAtTime(time-0.3);
と思ってたら
size.valueAtTime(time-0.3)[0]；
なんですね。。。

正しいエクスプレッション文はこうでした。

```js

x=value[0];
y=thisComp.layer("yellow").content("グループ 1").content("長方形パス 2").size.valueAtTime(time-0.3)[1];
[x,y]

```
Atomの動作が重い時のハック

キャッシュのクリアをお勧めします。
`rm -rf ~/.atom/storage`

![image.png](https://qiita-image-store.s3.amazonaws.com/0/77729/74040856-22e1-b672-bfe9-2db552bbab4b.png)

Atomは便利なエディターで愛用していますが、sublimeTextなどと比べるとやはりCPU usageの重さが気になります。
[Issue](https://discuss.atom.io/t/atomhelper-high-cpu-usage/2553)もすでに上がっているようですが、パッチが適用されるのはまだ先になりそうです。
HTML5プロフェッショナル認定資格 レベル1に合格したので、色々書いていく

# HTML5プロフェッショナル認定資格 レベル1に合格したので、色々書いていく

先日、HTML5プロフェッショナル認定資格 レベル1を受けて、無事に合格することができました。
みなさんも是非受験してみてください。

## HTML5プロフェッショナル認定資格とは

下記に書いてあることが、この試験勉強をして受かれば身についているそうです。

- HTML5を使ってWebコンテンツを制作することができる。
- ユーザー体験を考慮したWebコンテンツを設計・制作することができる。
- スマートフォンや組み込み機器など、様々なデバイスに対応したコンテンツ制作ができる。
- HTML5で何ができるのか、どういった技術を使うべきかの広範囲の基礎知識を有する。


[試験公式サイト](http://html5exam.jp/)
公式サイトに概要と過去問も乗っています！

### この資格試験を通過したらできているであろうこと

HTML5 Proffesional Level1

- HTML5の仕組み
- HTMLのタグの意味やアトリビュート
- CSSの基本
- CSS3で追加された機能
- ServiceWorker
- オフラインアプリケーションについて

## なぜ受けようと思ったのか

プログラムは少しかけるけど、マークアップがあまりかけなかった。
フロントエンドを勉強する際に、せっかくだから目に見える成果がほしかった。


## 勉強方法

本を購入してまずは一通りパラパラ読みで一旦読破(3日ぐらい)
その後、付属している問題にチャレンジして、分からないところをじっくりと読んで理解していく(3日ぐらい)

数日あけて再度同じ問題にチャレンジして再度わからないところを勉強(2日ぐらい)

インターネット上にある問題をまんべんなく勉強(2日ぐらい)

合計大体2週間ほどで基礎ができるようになりました。

ちなみに、ここでテストを受けて合格

テキストは下記を購入
[HTMLプロフェッショナル認定試験 レベル1 対策テキスト＆問題集](https://www.amazon.co.jp/HTML5%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%A9%A6%E9%A8%93-%E5%AF%BE%E7%AD%96%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E5%95%8F%E9%A1%8C%E9%9B%86-Mynavi-Examination-Library/dp/4839953562/ref=sr_1_2?ie=UTF8&qid=1495525371&sr=8-2&keywords=html5+%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB)
[HTMLプロフェッショナル認定試験 レベル2 対策テキスト＆問題集](https://www.amazon.co.jp/HTML5%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E8%AA%8D%E5%AE%9A%E8%A9%A6%E9%A8%93-%E5%AF%BE%E7%AD%96%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-Mynavi-Examination-Library/dp/4839953570/ref=sr_1_1?ie=UTF8&qid=1495525371&sr=8-1&keywords=html5+%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB)
※ 2つとも受ける気まんまんだったので、一気に2冊購入した

あとは、実践で積極的に習ったことを活かしてコードを書いていけば、仕事にもとても役立って、記憶も定着して完璧です。

## まとめ

レベル1は結構HTML5のマークアップ方法やCSSに焦点を当てた問題が多かったので、あとはJavaScriptを勉強するのみだと思ってます。
次回はレベル2（主にJavaScript）を勉強して年内には取得できるようにしていきます。
ReactNativeにおけるレイアウトの基礎（Flexbox）

ReactNativeのtutorialの内容を図解で理解するためのメモ。
https://facebook.github.io/react-native/docs/flexbox.html


## flexDirextion
### ポイント
- 内包するコンポーネントが並ぶ方向
- プライマリ軸（primary axis）

イメージとしては下記の図を参照。

![axis.png](https://qiita-image-store.s3.amazonaws.com/0/29971/f9fc4c88-aa1c-bb1f-f5ab-ff334a2ee099.png "axis.png")


## justifyContent
### ポイント
- primary axisにおけるレイアウト
- 内包コンポーネント間のレイアウトを定義する`space-around`や`space-between`を指定できる


## alignItems
### ポイント
- secondary axisにおけるレイアウト
- 内包するコンポーネント群の列（または行）をどの位置に配置するかを指定する


## サンプル

```sample.js
import React, { Component } from 'react';
import { AppRegistry, View } from 'react-native';

export default class AlignItemsBasics extends Component {
  render() {
    return (
      // Try setting `alignItems` to 'flex-start'
      // Try setting `justifyContent` to `flex-end`.
      // Try setting `flexDirection` to `row`.
      <View style={{
        flex: 1,
        flexDirection: 'column',
        justifyContent: 'space-around',
        alignItems: 'center',
      }}>
        <View style={{width: 50, height: 50, backgroundColor: 'powderblue'}} />
        <View style={{width: 50, height: 50, backgroundColor: 'skyblue'}} />
        <View style={{width: 50, height: 50, backgroundColor: 'steelblue'}} />
      </View>
    );
  }
};

```

### 設定まとめ
表にまとめると下記のようなレイアウト

|プロパティ|値|説明|
|:---|:---|:---|
|flexDirection|column|primary axisは縦方向。内包コンポーネントが縦に並ぶ。|
|justifyContent|space-around|内包コンポーネントの周囲のスペースを均一にする。|
|alignItems|center|横方向において中央揃え|

### 実際の画面
結果的に下記画像のようなレイアウトになる。
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/29971/ef951270-5202-9b06-92dd-00d365b51e27.png "図1.png")
docker 17.3動作検証メモ

mac環境でのdocker 17.3の動作検証メモです。
ポイントは以下です。

- docker 17.3での操作
- macでの動作

# 環境

macOS Sierra 10.12.5
Docker for Mac 17.3


# インストール

公式サイトからmac版パッケージをダウンロードしてインストール。
以下のページの通り進めればインストールは完了する。
https://docs.docker.com/docker-for-mac/install/


# インストール確認

ターミナルを開いて、docker versionを実行できればOK。

```
$ docker version
Client:
 Version:      17.03.1-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Tue Mar 28 00:40:02 2017
 OS/Arch:      darwin/amd64

Server:
 Version:      17.03.1-ce
 API version:  1.27 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Fri Mar 24 00:00:50 2017
 OS/Arch:      linux/amd64
 Experimental: true
```

# コンテナを作成＆起動

以下のサイトを参考。
http://qiita.com/tily/items/2b2ae610e2b9a45a2530

適当なフォルダ(私は `/home/butada/docker/test_redmine/` )を作って、そこに `docker-compose.yml` ファイルを配置して実行。


`docker-compose.yml` ファイルの内容は、ホスト側のファイル位置だけ変更。

```ruby
version: "2"
services:
  mysql:
    image: sameersbn/mysql:latest    
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      - DB_NAME=redmine_production
      - DB_USER=redmine
      - DB_PASS=password
  app:
    image: sameersbn/redmine:3.3.2-1
    volumes:
      - ./redmine:/home/redmine/data
    environment:
      - DB_HOST=mysql
      - DB_NAME=redmine_production
      - DB_USER=redmine
      - DB_PASS=password
    ports:
      - 3000:80
```

docker-compose up -d で起動させる。

起動したらブラウザで、 http://loalhost:3000/ にアクセスする。右上の「ログイン」からID/PASSをadmin/adminでログインできる。

# 疑問

- dockertoolboxってなんのためにあるのか？
- volumesで指定したけれど、どの種類の永続ボリュームになっているのか？（Dockerデータボリューム、データボリュームコンテナ、ディレクトリマウント、ストレージプラグイン）

各永続ボリュームの違いは以下と理解。

- dockerデータボリューム
 - →最近は使わない
- データボリュームコンテナ
 - →ローカルで使う場合は有効
- ディレクトリマウント
 - →基本は使わない。特殊な用途でしか使わない
- ストレージプラグイン
 - →外部ストレージを使用する場合。NFSも含む。

# 参考
https://docs.docker.com/docker-for-mac/install/
http://qiita.com/tily/items/2b2ae610e2b9a45a2530
Firebase Performance Monitoring


[Firebase Performance Monitoring](https://firebase.google.com/docs/perf-mon/) についてのメモです。

## Firebase Performanceとは
<div align="center"><img src="https://qiita-image-store.s3.amazonaws.com/0/33505/beff7fef-87a8-ffc4-cf98-6dad75cd19c2.jpeg" width=60%></div>
Firebase Performance Monitoringは、iOSおよびAndroidアプリのパフォーマンス特性を把握するのに役立つサービスです。
Performance Monitoring SDKを使用して、アプリケーションからパフォーマンスデータを収集し、そのデータをFirebaseコンソールでレビューおよび分析します。
パフォーマンスモニタリングを使用すると、アプリのパフォーマンスをいつどこで向上させることができるかを理解し、その情報を使用してパフォーマンスの問題を解決できるようになります。

パフォーマンスモニタリングは<font color="OrangeRed">現在ベータ版</font>です。

## 主な機能
* アプリの起動時間、HTTP/Sリクエストなどを自動的に測定する
起動時、フォアグラウンドやバックグラウンドでのアクティビティなど、アプリのパフォーマンスで重要な部分を実装なしで計測できる。

* アプリのパフォーマンスを改善できる状況を把握できる
ユーザの期待に何が足りないのか分からないと、アプリのパフォーマンスを最適化するのは難しい。
そのため、パフォーマンスモニタリングでは、国、デバイス、アプリケーションのバージョン、OSレベルでパフォーマンスを分類できます。

* パフォーマンスモニタリングをカスタマイズできる
新しい画面を読み込むときなど、特定の状況でアプリのパフォーマンスをキャプチャするためのトレースを作成できます。また、トレース中に定義したイベント（キャッシュヒットなど）をカウントするためのカウンタを作成できます。

## どのように機能するのか？
トレースは、アプリ内の2つの時点で取得されたパフォーマンスデータのレポートです。
Performance Monitoring SDKをインストールすると、ユーザーがアプリケーションを開いてからアプリケーションが応答するまでの時間を測定する開始トレースが自動的に提供されます。
また、フォアグラウンドトレースやバックグラウンドトレースでの待機時やアプリの動作を把握することができます。

カスタムトレースを構成することもできます。
カスタムトレースは、アプリ内の一部のコードに関連付けられたパフォーマンスデータのレポートです。
Performance Monitoring SDKが提供するAPIを使用して、カスタムトレースの開始と終了を定義します。
スコープ内で発生するパフォーマンス関連イベントのカウンタを記録するカスタムトレースをさらに構成できます。たとえば、キャッシュのヒット数とミス数、またはUIが顕著な時間応答しなくなった回数のカウンタを作成できます。

HTTP/Sネットワークリクエストは、アプリがサービスエンドポイントにリクエストを発行してからそのエンドポイントからの応答が完了するまでの時間を取得するレポートです。
アプリがリクエストする任意のエンドポイントについて、SDKはいくつかの指標を取得します。

* <font color="SlateBlue">レスポンスタイム</font>
要求が行われてから応答が完全に受信されるまでの時間

* <font color="SlateBlue">ペイロードサイズ（データ量）</font>
アプリがダウンロードまたはアップロードしたネットワークペイロードのバイトサイズ

* <font color="SlateBlue">成功率</font>
総レスポンスと比較した成功したレスポンスの割合
（ネットワークまたはサーバーの障害を測定するため）

トレースとHTTP/Sネットワーク要求の両方について、次のように分類されたパフォーマンス監視データが表示されます。

| Traces | HTTP/S network requests |
|:-----------|:------------|
| - App version<br>- Country<br>- Device<br>- OS<br>- Radio<br>- Carrier | - App version<br>- Country<br>- Device<br>- OS<br>- Radio<br>- Carrier<br>- MIME type |


## 実装手順
1. アプリケーションにPerformance Monitoring SDKを追加する
2. （Optional）SDKを使用してアプリケーションのカスタムトレースとカウンタを定義する
3. Firebaseコンソールでのパフォーマンスデータの監視

## ユーザデータ
パフォーマンスモニタリングでは、<font color="OrangeRed">個人を特定できる情報（名前、電子メールアドレス、電話番号など）は保存してはいけない</font>。
HTTP/Sネットワーク要求を監視しながら、Performance MonitoringはURLパラメータ（URLパラメータを含まない）を使用して集約された匿名のURLパターンを作成します。
これは最終的にはFirebaseコンソールに保持され表示されます。
マスターアカウントのIAMユーザーにメンバーアカウントの参照権限を付与する

# 目的

- AWS Organizationsで各メンバーアカウントの権限をマスターアカウントに移譲し、マスターアカウントのIAMユーザーから参照・制御できるようにする。後付けでJoinさせた場合にはRoleを作らないといけないっぽい。
- クロスアカウントを使っているだけなんだけど、AWS Organizationsから対応方法を探すと時間かかるので、まとめてみた。

# メンバーアカウントでのコンソール上でのRoleの追加手順

- IAM->ロールに行きます。

![IAM_Role_New.png](https://qiita-image-store.s3.amazonaws.com/0/73742/218ec48c-fb3d-4e1c-cd91-51e933ce1fcb.png)

- 「新しいロールの作成」を押下
- 「クロスアカウントアクセスのロール」を選択

![IAM_Role_Type.png](https://qiita-image-store.s3.amazonaws.com/0/73742/33a9f82a-b5c4-6c90-3ae0-749c05015158.png)

- アカウントIDにマスターアカウントのIDを入力する。

![IAM_Role_CrossAccount.png](https://qiita-image-store.s3.amazonaws.com/0/73742/bdc721a2-6269-c6d9-744b-5eb6b2991cd1.png)

- アタッチするポリシーを選択します。
- 今回はViewOnlyAccessにします。

![IAM_Role_Policy.png](https://qiita-image-store.s3.amazonaws.com/0/73742/9ac71278-2fb5-3471-8e12-e75ab3f49029.png)


- Role名などを入力します。
- 私は「OrganizationAccountReadOnlyRole」と入力しました。
- OrganizationsのコンソールからメンバーアカウントをCreateした場合には「OrganizationAccountAccessRole」が作られているようです。

![IAM_Role.png](https://qiita-image-store.s3.amazonaws.com/0/73742/8c8b32f7-161f-0f29-156e-34c5f60bebde.png)

# AWS CLIでの動作確認

- マスターアカウントのIAMユーザーで動作確認します。
- xxxxxxxxxxはメンバーアカウントのIDです。
- プロファイルで切り分けている方は「--profile」オプションを使ってください。

```bash
aws sts assume-role --role-arn arn:aws:iam::xxxxxxxxxx:role/OrganizationAccountReadOnlyRole --role-session-name "RoleSession"
```

- 以下のような応答が戻ってきたらOKです。

```json
{
    "AssumedRoleUser": {
        "AssumedRoleId": "xxxxxxxxxx:RoleSession",
        "Arn": "arn:aws:sts::xxxxxxxxxx:assumed-role/OrganizationAccountAccessRole/RoleSession"
    },
    "Credentials": {
        "SecretAccessKey": "xxxxxxxxxx",
        "SessionToken": xxxxxxxxxxxxxxxxxxxx",
        "Expiration": "2017-06-15T09:23:23Z",
        "AccessKeyId": "xxxxxxxxxx"
    }
}
```

# 主な用途

- メンバーアカウントのCloudWatchの値などを一元的に収集する。
- **メンバーアカウントのリザーブドインスタンスの更新日時の収集**

# 参考

[AWS Organizationsを利用したアカウント作成の自動化](https://aws.amazon.com/jp/blogs/news/account-management-automation-using-aws-organizations/)
[AWS OrganizationsをAWS CLIでひととおり操作してみた](http://qiita.com/domokun70cm/items/c2f7d7888e3688602e28)
Rubyで複数行の標準入力を使いたい人へ

# 前置き
Rubyを使ってプログラミングコンテストのような形で問題を解くことがあったのだが、その際に焦ってしまって複数行入力のやり方を間違って実装してしまった。
このような悲しい初心者の方を一人でも減らすべく、今回記事を作成した。

# コードだけ早く見せてくれという人へ
ただいま問題解いている最中で「説明などいいからコードを見せて欲しい！！」という人もいると思うので最初にコードを載せておく。

```ruby:io.rb
attrs = Array.new
while line = $stdin.gets
  attrs << line.chomp.split
end

# ここからは結果をお見せするために書いてるよ
puts attrs
puts attrs.length
puts attrs[0][-1]
```

これを使用すると結果はこうなる

```bash
ruby io.rb #呼び出し
ruby python perl
haskell scala ocaml #この2行は引数 ctrl+dを押すと実行されるよ
ruby
python
perl
haskell
scala
ocaml
2
perl
```

# 仕組みを説明
最初に空の配列を用意して引数を入れいく箱を用意します。
そして、その次のwhile文で代入と判定を同時に行っています。

調べた方は標準入力に`$stdin`と`STDIN`があることに気がついていると思いますが、グローバル変数と組み込み変数という差こそあれど実質違いが無いという認識です。

またレシーバを指定しない`gets`等のメソッドはデフォルトで`$stdin`を参照するので、

```ruby
while line = gets
```
でも同じ結果になります。

`chomp`は改行文字を消し、`split`は引数を用意しなければ空白を発見したら要素に切り分けます。
これを最初に用意した配列に追加していくことで`[[ruby, python, perl], [haskell, scala, ocaml]]`のように行ごとに分けられた引数をまとめた配列をゲットできます。

あとは必要であれば`flatten`みたいなメソッドを使えば、標準入力から引数を受け取る際に問題になることはあまりないでしょう。
Ionic Native化されていないCordovaのプラグインを使う - Mapboxを例に

Ionic Native化されているCordovaプラグインは、皆さん御存知の通りnpmで簡単に使うことができます。
※Ionic Nativeとは、Ionicフレームワークの機能で、使用することでCordovaプラグインをIonicで簡単に使えるようになります。

これが非常に便利で、多くの便利なプラグインは、既にIonic Native化されています。Ionic NativeはIonic2から使える様になっています。


# Ionic Nativeの場合

転載するまでもないんですが、Google Mapsを使うときは下記のような感じですよね。

```bash
$ ionic cordova plugin add cordova-plugin-googlemaps --variable API_KEY_FOR_ANDROID="YOUR_ANDROID_API_KEY_IS_HERE" --variable API_KEY_FOR_IOS="YOUR_IOS_API_KEY_IS_HERE"
$ npm install --save @ionic-native/google-maps
```

```ts
import {
 GoogleMaps,
 GoogleMap,
 GoogleMapsEvent,
 LatLng,
 CameraPosition,
 MarkerOptions,
 Marker
} from '@ionic-native/google-maps';

export class MapPage {
 constructor(private googleMaps: GoogleMaps) {}

```
https://ionicframework.com/docs/native/google-maps/

# 非Ionic Nativeの場合

Ionic Nativeで、殆どの機能が実装できるため、あえてNative化されていないCordovaプラグインを使う機会自体がそんなにないのですが、Open Street MapをベースにしたMapboxのプラグインを使う機会に出くわしました。

https://github.com/Telerik-Verified-Plugins/Mapbox

プラグインのインストール自体はIonicのCLIで

```bash
ionic  cordova plugin add cordova-plugin-mapbox --variable ACCESS_TOKEN=your.access.token
```

というようにやればいいんですが、Ionicの便利な機能にあやかりまくっていたので、「あれ？Nativeじゃない時どうするんだ？」と手が止まりまして。

調べた結果が

```ts

import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams } from 'ionic-angular';

declare var Mapbox:any;
```

このようにImport文の後に書いてあげるだけで、そのまま使えるようになります。


```ts
  loadMap() {
      Mapbox.show({...})
  }
```


解説によっては、platformから持ってくるとか色々書いてあるところもありましたが、この方法が最もシンプルかつ簡単でした。
VSCodeでJupyterなpyをipynbに変換するツール作った


#概要
VSCodeのExtensionに[Jupyter](https://marketplace.visualstudio.com/items?itemName=donjayamanne.jupyter)をサポートするものがある。

これは`#%%`を書くことでCellとしてJupyterで実行できる優れものだが、.ipynbとして保存しておきたい場合には、`#%%`毎にブラウザ上のJupyterのCellにコピペする必要があり面倒である。

そこで、`#%%`が含まれる.pyから.ipynbに変換するツールを作った

##具体的に言うと
```Python:hello.py
#%%
print("Hello")

#%%
print("World!!")

```
こんなpyがあったら

![スクリーンショット 2017-06-16 16.57.56.png](https://qiita-image-store.s3.amazonaws.com/0/46022/fc63e4fb-997c-0fef-ba6b-5730eeae3571.png "スクリーンショット 2017-06-16 16.57.56.png")

こうなるipynbに変換する


#ツール
これ->[py2ipynb.py](https://gist.github.com/KoheiKanagu/183fdedc486ae5986900c3319bc421c6)

なおnbformatが必要だが、`pip install jupyter`した時に一緒にインストールされるので別途必要になることはないはず

#使い方
例えばhello.pyを変換したければ、引数として与えて実行するとhello.ipynbが同ディレクトリに生成される。

	python py2ipynb.py hello.py
	
	
#内部でやってること
結局のところ、pyを1行毎に読んでいって先頭に`#%%`があるかを見つけて、`nbformat.v4.new_code_cell()`しているだけなのでシンプル。

VSCodeのExtensionが`#%%`でCellだと区切っているようなのでそこを見ているだけ。
2017年のcocos2d js のはじめ方

2年ぶりくらいに cocos2d に復帰したのでそのときのメモです。当時触ってたときのバージョンは2.2.2でした。最新は3.13です。豆知識ですがタイトルに2017とか年を入れるとネタかぶりを気にせず記事がかけます。

## スターター
とりあえずミニマムのスターターを作りました。 https://github.com/iwag/cocos2d-js-minimal-starter のリポジトリを clone します。
変更したらリロードみたいなのしたいのでbrowser-syncを別途インストールします （npm -g install browser-sync）。

```bash
$ browser-sync start --server --files *.js src/*.js
```

## 作り方
以下、ミニマムの作り方です。

cocos2d のSDKをダウンロードします http://cocos2d-x.org/download
全部入りだから300MBとかある。手順の通りインストールします。

インストールできたら以下のコマンドを実行してテンプレートを吐かせます

```bash
$ cocos new -l js
Python 2.7.5
> Copy template into ~/cocos2d-js-minimal-starter/MyJSGame
> Copying directory from cocos root directory...
> Copying files from template directory...
> Copying Cocos2d-x files...
> Rename project name from 'HelloJavascript' to 'MyJSGame'
> Replace the project name from 'HelloJavascript' to 'MyJSGame'
> Replace the project package name from 'org.cocos2dx.hellojavascript' to 'org.cocos2dx.MyJSGame'
> Replace the Mac bundle id from 'org.cocos2dx.hellojavascript' to 'org.cocos2dx.MyJSGame'
> Replace the iOS bundle id from 'org.cocos2dx.hellojavascript' to 'org.cocos2dx.MyJSGame'
```

なんか frameworks ってところにフレームワークのソースが全部コピーされるんだけど、jsだけでいいんでってことで全部消す。CMakefile.txtも殺しました。

代わりに公式で提供しているjavascriptのファイルを使う

ここで取れる http://cocos2d-x.org/filecenter/jsbuilder/
customizeしたがうまく動かないので結局[full version](
http://cocos2d-x.org/filecenter/jsbuilder/download?ver=v3.13&com=false&express=false&file=core,core-webgl,core-extensions,core-extensions-webgl,debugger,actions,audio,menus,kazmath,shaders,render-texture,render-texture-webgl,sprite-batch-node,labels,labels-webgl,motion-streak,node-grid,shape-nodes,shape-nodes-webgl,clipping-nodes,clipping-nodes-webgl,effects,actions3d,progress-timer,progress-timer-webgl,transitions,compression,particle,particle-webgl,text-input,tilemap,tilemap-webgl,parallax,gui,gui-webgl,ccbreader,editbox,ccui,cocostudio,cocostudio-webgl,ccpool,pluginx,physics,physics-webgl,socketio,gaf,box2d,chipmunk,spine,spine-webgl,gaf-webgl)

このダウンロードしたjsを libとかに適当に置いて、ソースの参照先をこれにする。

動かすときは

```bash
$ cocos run -p web
```

できたものが https://github.com/iwag/cocos2d-js-minimal-starter になります
【Python Kivy】簡単なpop up windowの作成方法

#Kvファイルでサイズとかを調整したい
なかなかkvファイルでテキストとかを調整する方法がネット上に落ちていなかったので、kivyの本家サイトのサンプル(https://pyky.github.io/kivy-doc-ja/examples/gen__demo__showcase__main__py.html#file-demo-showcase-showcase-kv)
を参考にしながら（ほぼパクリながら）、以下のスクリプトを作りました。

```main.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from kivy.app import App
from kivy.config import Config
from kivy.uix.widget import Widget
from kivy.uix.popup import Popup
from kivy.properties import ObjectProperty

#force size of your window
Config.set('graphics','width','800')
Config.set('graphics','height','800')

class A_Button(Widget):
    popup = ObjectProperty()

class Example(App):
    def build(self):
        return A_Button()

if __name__ == '__main__':
        Example().run()
```

```example.kv
<A_Button>:
    popup: pop

    BoxLayout:
        id: top
        
        Popup:
            id: pop
            title: "Hello World"
            on_parent:
                if self.parent == top: self.parent.remove_widget(self)
            Button:
                text: 'press to dismiss'
                on_release: pop.dismiss()
        Button:
            text: 'press to show Popup'
            on_release: root.popup.open()
```

kvファイルはほぼ、showcaseのサンプルからパクってきました。レイアウトについては、動作に着目したのでこだわっていません。
なんとなくObjectPropertyをつかってkvファイルに渡すイメージなんでやったらできました。

ObjectPropertyなどまだまだ勉強していかなければいけないことが多いなぁと思いました。
入らなかった文字を三点リーダで省略表示


# 単数行の場合
text-overflow: ellipsisを使います。
親要素でwidthを指定し、overflow: hiddenで表示を消して、text-overflow: ellipsisで三点リーダー表示。
改行をさせたくないので、white-space: nowrap指定です。

```sample.html
<div class="content">
  <p>長すぎて入りきらなかったテキストが入ります。</p>
</div>
```

```sample.sass
.content
  overflow: hidden
  width: 100%
  p
    overflow: hidden
    text-overflow: ellipsis
    white-space: nowrap
```

## プロパティ

エリア外を表示しない
overflow: hidden

切り取られたテキストの代わりに「…」をい表示
text-overflow: ellipsis

自動的に改行しない
white-space: nowrap
デザパタ入門①

## デザインパターン?

---

## 昔の偉い人が考えた設計のイディオム

---

## デザインパターンを知れば

* 動作 -> 設計の推測
* 言葉 -> 設計の共有
* 設計力

の向上💪

---

## 🏋

---

## 本日のお題

---

## ストラテジーパターン📈

---

## ストラテジーパターン

> 一連のアルゴリズムを定義し、それぞれをカプセル化してそれらを交換可能にします。
> これによって、アルゴリズムを使用するクライアントとは独立してアルゴリズムを変更できます。

by Head First デザインパターン

---

## クラス図

![パターン.png](https://qiita-image-store.s3.amazonaws.com/0/74197/b8198706-f201-0c09-f61e-c8c2524829d5.png)

---

## サンプルコード

* https://github.com/Islands5/design_pattern_samples/tree/master/strategy

---

## 使われ所

---

![fluentd2-1.png](https://qiita-image-store.s3.amazonaws.com/0/74197/ece42d96-dc17-3b65-8c5a-b76917aa60df.png)

---

## fluentd

* データを取ってくる(input)
* データを送り出す(output)
* バッファする(buffer)

* https://github.com/fluent/fluentd

---

## データを送り出す

* csv, ltsv, tsv, json, どんな形式なのか?(整形)

---

![パターン2.png](https://qiita-image-store.s3.amazonaws.com/0/74197/62370648-b425-e9a7-25e4-efff309cd44e.png)

---

## ストラテジーパターン

> 一連の[hogehoge]を定義し、それぞれを[fugafuga]してそれらを交換可能にします。
> これによって、アルゴリズムを使用する[piyopiyo]とは独立してアルゴリズムを変更できます。

by Head First デザインパターン

---
## 参考

* Head First デザインパターン
* http://www.techscore.com/tech/DesignPattern/Strategy.html/
バイトストリームと文字ストリームでテキストファイルコピー

#やりたいこと

①バイトストリームと文字ストリームを使って、テキストファイルをコピーする。

バイトストリームと文字ストリームって２つあるの紛らわしい……。

---

##バイトストリーム

```csharp:byte.cs
try{

  // コピー元のファイル
  FileStream fstr_in = new FileStream("From.txt", FileMode.Open);
  // コピー先。
  // FileMode.Create　→ファイルが存在しない時は新たに作成し、存在するときは上書きする
  FileStream fstr_out = new FileStream("To.txt", FileMode.Create); 
  // テキストコピー
  int i;
  do {
    i = fstr.ReadByte();         // バイトを読み取り、読み取り位置を 1 バイト進める
    fstr_out.WriteByte((Byte)i); // 現在位置にバイトを書き込む
  } while (i != -1);             // ストリームの末尾に達した場合は「-1」が返る

  fstr.Dispose();
  fstr_out.Dispose();

} catch (Exception e) {
  Debug.WriteLine("！例外発生！" + e.ToString());
}
```
##文字ストリーム
```csharp:str.cs
try{

  // コピー元のファイル
  StreamReader strRead_in = new StreamReader(new FileStream("From.txt", FileMode.Open));
  // コピー先。
  // FileMode.Create　→ファイルが存在しない時は新たに作成し、存在するときは上書きする
  StreamWriter strRead_out = new StreamWriter(new FileStream("To.txt", FileMode.Create));
  // テキストコピー
  int i;
  do {
    i = strRead_in.Read();      // 次の文字を読み込み、1 文字分だけ文字位置を進める
    strRead_out.Write((char)i); // ストリームに文字を書き込む
  } while (i != -1);            // 使用できる文字がない場合は「-1」が返る

  strRead_in.Dispose();
  strRead_out.Dispose();

} catch (Exception e) {
  Debug.WriteLine("！例外発生！" + e.ToString());
}
```

---

バイトストリームは1バイト、文字ストリームは2バイト。
日本語とか2バイト文字を扱うときは文字ストリームを使う方が良い。

##おまけ

VisualStudio2017を使っていたら、「このファイルは外部で変更され、このエディターでは変更は保存されていません。」ダイアログの「チェックボックスをON」、「すべて無視」を選択してしまい、
確認ダイアログも表示されずテキストの出力もされなくなってしまった……(´・ω・｀)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/72197/ed0c4d49-1952-df1b-d547-49f87fc838e3.png)

「ツール＞設定のインポートとエクスポート → すべての設定をリセット」
で無理やり元に戻したけど……どこか設定するところがあるのかな。
汎用性が低いコードと汎用性が高いコード～AfterEffectsで、指定パスにあるファイルをフォルダ内も含めて収集する方法

## 序
　業務でAfterEffectsのscriptを作るにあたり、多数のプロジェクトを自動で一括処理するものを作ろうと心がけています。
ところがデザイナーの方は、１つのプロジェクトを選択して処理して、最後はそのプロジェクトが編集状態になっているもののほうが、直観的で便利だと思われるようです。

　そんなすれ違いにもめげずに、一括処理のお友の指定パス内のファイル収集スクリプトを２つ紹介します。

---
## 汎用性重視～再帰的ファイル収集
　まず、汎用性が高いコードとして、再帰的にファイル収集する方法

　以下のURLを参考にしました。

### たこなぐりの日々
パス内のフォルダの中にある全ファイルをフォルダ内も全部探ってぶっこ抜く。
http://d.hatena.ne.jp/Takomaru/20131118/1384780530

### OPENSPACE
Illustrator CS/CS2/CS3/CS4/CS5編 サブフォルダ内にある全てのAIファイルを開く
http://www.openspc2.org/projectX/Illustrator/0071/


```javascript:getAllFile_cmd.jsx
rootFolderObj = Folder.selectDialog("フォルダを選択してください");
$.writeln(new Date());
fList = getAllFile(rootFolderObj, [".png"]);	// 拡張子は小文字で
$.writeln(new Date());

function getAllFile(folderObj, ext)
{
	if (!folderObj) return; // キャンセルされたら処理しない
	var list = [];
	getFolder(folderObj);
	return list;	// フォルダ内の一覧を取得

	function getFolder(folderObj) {
		var fList = folderObj.getFiles();
		for (var i=0; i<fList.length; i++)
		{
			if (fList[i].getFiles) {
				getFolder(fList[i]); // サブフォルダがある限り繰り返す
			} else {
				var f = fList[i].name.toLowerCase();
				for(var j=0; j<ext.length; j++) {
					if (f.indexOf(ext[j]) > -1) {
						list.push(fList[i]);
					}
				}
				delete f;
			}
		}
		delete fList;
	}
}
```

---
## 処理速度重視～ディレクトリコマンド出力整形
　次に汎用性が低い方法です。
要は、DOSコマンドのdirの結果を整形するだけです。
OS X版のAfterEffectsでも「ls -R」コマンドの出力結果を整形すれば同じ事ができるはずです。

```javascript:getAllFile_cmd.jsx
var folderObj = Folder.selectDialog("フォルダ選択");
$.writeln(new Date());
fileList = getAllFile_cmd(folderObj, ".png");
$.writeln(new Date());

function getAllFile_cmd(folderObj, ext)
{
    var cmd_dir = "cmd.exe /c dir " + folderObj.fsName + "\\*" + ext + " /s /b";
    var list = system.callSystem(cmd_dir);
    return(list.split(/\r\n|\r|\n/));
}
```

---
## 考察
　再帰起処理は、ファイルやフォルダの数が増えると処理時間が数の増減以上に増えます。
またメモリも大量に使用するため、アプリケーションのスクリプト向けではありません。
ただ多くの処理系で一般的な方法なので移植性や応用性は高いです。

　DOSコマンドの結果を受け取る方法は、文字列の整形処理のせいで汎用性が低いですが、処理が高速です。
OS X版でもできると書きましたが、文字列の整形処理はWindows版と変更する必要があるでしょう。

　私はプロジェクトで扱うファイル数が数万のオーダーになった時点で、再帰処理はやめることにしました。
今は数十万のオーダーなので（略
【Git】git checkout  [ブランチ名] - ブランチを切り替える

###git checkout [ブランチ名]
ブランチを切り替えたい時でcheckoutコマンドを実行します。

~~~git
$ git checkout [ブランチ名]
~~~

作業ブランチ[ブランチ名]に切り替える

作業ブランチどこから生やすか
（さえ技のようなイメージがわかりやすいかなぁぁ。。。）

例：
*[ブランチ名]は、BRANCH_A,BRANCH_B,

BRANCH_Aにいる時

コマンド 

~~~command
git branch
~~~ 
*ブランチの一覧がみれるコマンド

ログ

~~~log
  develop
* feature/BRANCH_A
  feature/BRANCH_B
~~~

BRANCH_Bにブランチを切り替える

コマンド

~~~command
git checkout BRANCH_B
git branch
~~~

ログ

~~~log
  develop
  feature/BRANCH_A
* feature/BRANCH_B
~~~

## 関連記事
[【Git】一覧](http://qiita.com/sunstripe/items/0b611f6e8a480024dd33) - Gitコマンドまとめ
[【Git】git branch](http://qiita.com/sunstripe/items/30f46a7bf451c1a85c2b) - ブランチの一覧表示
[【Git】git branch [ブランチ名]](http://qiita.com/sunstripe/items/4e8c32634806edd0672d) - ブランチを作る
[【Git】git branch -a](http://qiita.com/sunstripe/items/9ee8ec44005243805811) - ローカル＆リモートブランチ一覧を表示する
【Git】git branch -d [ブランチ名] - ブランチを削除
【Git】git branch -r - リモートブランチ一覧を表示する

---

## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
【Git】git branch - ブランチの一覧表示

### Views履歴
祝50,000Views突破！
祝180,000Views突破！
祝210,000Views突破！

### git branch
作業ディレクトリ内のブランチをbranchコマンドで一覧を表示します。

~~~git
$ git branch
~~~

作業ディレクトリのブランチの一覧を表示する

作業ディレクトリにブランチの一覧を見ることができる
（根っこのようなイメージがわかりやすいかなぁぁ。。。）

例：

コマンド

~~~command
git branch
~~~ 
*ブランチの一覧がみれるコマンド

ログ

~~~log
  develop
* feature/BRANCH_A
  feature/BRANCH_B
  feature/BRANCH_C
~~~
*が今いる作業ブランチ

--

## 関連記事
[【Git】一覧](http://qiita.com/sunstripe/items/0b611f6e8a480024dd33) - Gitコマンドまとめ
[【Git】git branch](http://qiita.com/sunstripe/items/30f46a7bf451c1a85c2b) - ブランチの一覧表示
[【Git】git branch [ブランチ名]](http://qiita.com/sunstripe/items/4e8c32634806edd0672d) - ブランチを作る
[【Git】git branch -a](http://qiita.com/sunstripe/items/9ee8ec44005243805811) - ローカル＆リモートブランチ一覧を表示する
【Git】git branch -d [ブランチ名] - ブランチを削除
【Git】git branch -r - リモートブランチ一覧を表示する
【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
Ec2インスタンスのディスク拡張

awsのconsoleで色々やったあとにこんなエラー出ました。

<code>
[root@webdev01 ~]# resize2fs /dev/xvda1
resize2fs 1.42.12 (29-Aug-2014)
The filesystem is already 2096635 (4k) blocks long.  Nothing to do!
</code>

実は解決方法非常に簡単下記コマンドを実行すればOK


[root@webdev01 ~]# growpart /dev/xvda 1
CHANGED: disk=/dev/xvda partition=1: start=4096 old: size=16773086,end=16777182 new: size=209711070,end=209715166

でresize2fs実行、正常に終了しました。

[root@webdev01 ~]# resize2fs /dev/xvda1
resize2fs 1.42.12 (29-Aug-2014)
Filesystem at /dev/xvda1 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 7
The filesystem on /dev/xvda1 is now 26213883 (4k) blocks long.

[root@webdev01 ~]# lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  100G  0 disk
└─xvda1 202:1    0  100G  0 part /
[root@webdev01 ~]# df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         488M   56K  488M    1% /dev
tmpfs            498M     0  498M    0% /dev/shm
/dev/xvda1        99G  3.5G   95G    4% /