OmniAICreator/Qiita-1.07M huggingface dataset:
Github/GistでBANされた時の対処法

>Your account has been flagged. 
Because of that, your profile is hidden from the public. If you believe this is a mistake, contact support to have your account status reviewed.

というメッセージが表示されていたので，指示通り運営に英語でメールを送りました．
(拙いですが伝われば良しとします)

```
Hello.
Why my account has been flagged?
Please remove that flag.
Thank you.
```

1時間ほどでフラグは解除され運営からのメールも届きました．

>Hi there,

>Sorry for the hassle! Sometimes our spam-detecting robots get a little overzealous and need to be reprogrammed.

>I've cleared that flag now, so your account should be back to normal. You shouldn't see that message again, but let me know if I can help with anything else!

どうやらBotにスパムだと誤認された様子．

原因はよくわかりませんが，同じ操作を何度か繰り返したせいかもしれません．

# 参考：
* http://musaprg.hatenablog.com/entry/2017/02/03/102756
Rails, Angular, Postgres, and Bootstrap, Second Editionを読み始めて

Pragmatic Programmersの標記の本を読み始めて、本にある通りVagrant開発環境で動かそうと思いハマったので・・・

pdf35ページあたりで、
`bundle exec rails webpacker:install`
でwebpackerをインストールした後で、
`gem 'foreman'`
を追加して、`bundle install` の後でForeman用の設定ファイルProcfileに

```ruby:Procfile
rails:   bundle exec rails server
webpack: bin/webpack-dev-server
```

を書いて、`foreman start` とすれば動くとありましたが、予想通りvagrant環境では動きませんでした。

```ruby:Procfile
rails:   bundle exec rails server -b 0.0.0.0
```

に替えて（これは予測できていました）、更に
config/webpacker.yml の中で

```yml:config/webpacker.yml
development:
  <<: *default

  dev_server:
    host: 0.0.0.0
    port: 8080
    https: false
```
`host: 0.0.0.0` の部分を、自分のvagrantに設定したアドレス　
`192.168.xx.xx` に替えたら無事セカンドのサーバーにアクセスできて、
デベロッパーツールのconsoleに、javascriptの結果が表示されます。
と言ってもこれだけですが。

```javascript:app/javascript/packs/application.js
console.log('Hello World from Webpacker')
```

因みに `foreman start -p 3000` でいつも通りポート3000で動きます。（ヤレヤレ道は遠い）
Python > floor division > 切り捨て除算?

@ 科学技術計算のためのPython入門 ――開発基礎、必須ライブラリ、高速化 by 中久喜 健司さん
( 対象環境: Python 3.5以降 )

本の中で、floor divisionのことを「打ち切り除算」という用語で説明している。

一方で、標準ドキュメントの日本語版では「切り捨て除算」になっている。
https://docs.python.jp/3/reference/expressions.html
> / (除算: division) および // (切り捨て除算: floor division) は、

用語が同一でないと情報検索時に欲しい情報にたどり着けない。

[「Python "打ち切り除算" floor division」@ google検索](https://www.google.co.jp/search?q=Python+%E6%89%93%E3%81%A1%E5%88%87%E3%82%8A%E6%89%80%E3%81%95%E3%82%93&oq=Python+%E6%89%93%E3%81%A1%E5%88%87%E3%82%8A%E6%89%80%E3%81%95%E3%82%93&aqs=chrome..69i57.3712j0j8&sourceid=chrome&ie=UTF-8#q=Python+%22%E6%89%93%E3%81%A1%E5%88%87%E3%82%8A%E9%99%A4%E7%AE%97%22+floor+division)

[「Python "切り捨て除算" floor division」@ google検索](https://www.google.co.jp/search?q=Python+%E6%89%93%E3%81%A1%E5%88%87%E3%82%8A%E6%89%80%E3%81%95%E3%82%93&oq=Python+%E6%89%93%E3%81%A1%E5%88%87%E3%82%8A%E6%89%80%E3%81%95%E3%82%93&aqs=chrome..69i57.3712j0j8&sourceid=chrome&ie=UTF-8#q=Python+%22%E5%88%87%E3%82%8A%E6%8D%A8%E3%81%A6%E9%99%A4%E7%AE%97%22+floor+division)

### link

- [床関数と天井関数](https://ja.wikipedia.org/wiki/%E5%BA%8A%E9%96%A2%E6%95%B0%E3%81%A8%E5%A4%A9%E4%BA%95%E9%96%A2%E6%95%B0)
- https://en.wikipedia.org/wiki/Floor_and_ceiling_functions
面接で絶対に押さえておきたいアルゴリズム問題(5)

## 問題：Common Prefix

PrefixとはStringの冒頭につける文字列で、例えば、
"undecided" と"unchange"の Prefixは "un"である。

今回の問題は、Stringの配列から、String同士でマッチする、一番長いPrefixを見つけ出して返す。


## 例：

```
input： ["flower", "flour", "flappecino"]
return: "flo"

input ["flower", "garbage", "onion"]
return: ""
```

## ヒント：



## 解答：

```

func longestCommonPrefix(_ strs: [String]) -> String {
    
    var storedPrefix = ""
    var commonPrefix = ""
    let array = strs

    for (index, word) in array.enumerated() {

        for (indexTwo, wordTwo) in array.enumerated(){
            if index != indexTwo {
                
                let arrayA = Array(word.characters)
                let arrayB = Array(wordTwo.characters)

                if word == "" || wordTwo == ""{
                    break
                }

                for (index,a) in arrayA.enumerated(){

                    if a == arrayB[index] {
                        commonPrefix.insert(a, at: commonPrefix.endIndex)
                    }
                    
                    if a != arrayB[index] {
                        break
                    }
                    
                }
                
                
                if commonPrefix.characters.count > storedPrefix.characters.count {
                    storedPrefix = commonPrefix
                }
                
                commonPrefix = ""
                
                print(storedPrefix)
 
            }

        }
        
    }

    return storedPrefix
}
```

### メモ / ポイント
        
一応解きましたが、ループを回しすぎているので、もっといい解決方法があるはず・・・！


### メモ /　ポイント
CognosをAIXにセットアップする時の参考資料

##内容
Cognos BIをAIX上にセットアップする時に、参考にする事が多かった資料をご紹介します。

これはC8時代のものなので古いですが、事始的な資料になります。
**Cognos 8 Business Intelligence (BI) on IBM AIX best practices**
ftp://ftp.software.ibm.com/software/data/sw-library/cognos/pdfs/whitepapers/wp_cognos8_bi_on_ibm_aix_best_practices.pdf

こちらがC10時代の資料で、AIXのパラメーターは、今でもこの資料見て設定をしています。
**Best practices and advantages of IBM Power Systems for running IBM Cognos Business Intelligence**
http://qui-impresa.ilsole24ore.com/ibm/downloads/Power_Systems_for_Cognos_BI_YTW03209CAEN.PDF

PowerVMと絡めたRedbookです。
**Exploiting IBM PowerVM Virtualization Features with IBM Cognos 8 Business Intelligence**
https://www.redbooks.ibm.com/Redbooks.nsf/RedbookAbstracts/sg247842.html?Open

すいません、今回は資料の紹介のみですが、CognosをAIXでセットアップする時に、参考情報にして頂ければと思います。
Cognos Content Store (DB2)の作成時のTips

##概要
Cognos BI & Analyticsで、Content StoreをDB2に作成する事は多いと思いますが、デフォルトのやり方とはちょっとだけ違う、私がいつもやっているTipsです。

##内容
Cognos Content StoreをDB2に作成するガイドは、昔からこのBlue Stackが有名なので、これを参考にしていました。
**Blue Stack - Setting up DB2**
https://www.ibm.com/developerworks/data/library/cognos/page160.html

しかしながら、最近のCognosでは、Content Storeを作成するためのDDLは、Cognos ConfigurationからContent Storeを右クリックし、「DDLの生成」で作成する事ができます。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/6f6dfd98-fb15-0c02-1edc-c95db6221e23.png)

そして、ここのフォルダに生成される、createDb.sqlファイルを、DB2コマンドウィンドウから db2 -tvf createDb.sql で流せば、Content Storeに必要なDBが生成されます。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/e3afcb83-97ac-5ec4-47eb-f74aa8ee83d1.png)

しかしながら、このデフォルトで生成されるcreateDb.sqlファイルは、そのまま流さず、常日頃、以下のように修正しています。

TERRITORYは日本なので、JP にしています。
APPLHEAPSZは、昔っから1024が推奨されてきましたが、DB2 9.5からAPPLHEAPSZの設定値の意味合いが、セッション単位の設定値から、データベースセッション全体の設定値に変わっています。
そのため、DB2 9.5以前のガイドのままのAPPLHEAPSZ=1024では、DB2 9.5以降では少なすぎると考え、この一行はコメントアウトして実行しない、つまりAPPLHEAPSZはデフォルトのAUTOMATICにするようにしています。
BufferPoolもSIZE=1000では、8MB、32MBなので、今時そんなに少なくしなくても・・・と思い、10000とか、適当な値に変更しています。
Content StoreのBufferPoolのサイズが小さくて、パフォーマンスが劣化した経験もあるためです。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/4b8d74d7-a72d-e65a-b036-1ea73bb472d1.png)

そんな感じですかね。
Content Storeで問題が起こる事は少ないですが、無い事も無いので、DB2設計とか良くわからんという方は、取り合えず上記のようにしておいてみても良いかも知れません。

あと、DB2の場合、Content Storeのインスタンスは、ユーザーDBのインスタンスとは分けた方が良いか、というのは良く聞かれます。
私の答えは、運用の観点で、ユーザーDBとは停止タイミングが違う可能性があるのと、
マニュアルに
DB2 registry variable (DB2_INLIST_TO_NLJN) = YES 
がインスタンス単位の設定の推奨値として記載されているので、このパラメーターが何かしら他のDBに意図せぬ影響を及ぼす可能性も考えると、インスタンスは分けておいた方が良い、という回答をしています。
https://www.ibm.com/support/knowledgecenter/SSEP7J_11.0.0/com.ibm.swg.ba.cognos.inst_cr_winux.doc/c_guidelines_db2_lux_content_store.html

以上です。

最後に、Content Store系で、参考になりそうな情報も添付しておきますので、興味があれば覗いてみてください。
**IBM Cognos 8 Content Store Back up and Clean up**
https://www.ibm.com/developerworks/data/library/cognos/infrastructure/databases/page502.html
**Cognos Open Mic Webcast : Best Practices for maintaining the IBM Cognos BI Server**
http://www-01.ibm.com/support/docview.wss?uid=swg21611092
フォルダの移動でgit log --followでの履歴が出てこない

#問題
今まで使用してきたtortoise svnでのファイル管理から、今流行りのgitへ移行することが容易なのかを調べてみたところ、ブランチ内のファイルのパスを大幅に変更する際などに変更履歴が継承されないのではという問題にぶち当たってしまいました。私のsvnでの我流な使い方かもしれませんが、フォルダを別のパスにコピーして整理したい場合など、個別にブランチができたので、それで今までのファイルの変更履歴を残しながらフォルダパス変更が可能だったのですが、gitではこんなことは出来なのでしょうか？

また、できなかったとしても、このような場合、gitのユーザーの方達はどのようにしてこの辺をカバーしている状況なのかを教えて頂けると大変助かります。





別々にブランチで進めた編集内容を

[ブランチ　test20170321files　のリンク](https://github.com/KenjiMaehara/raspberryPiTCPClient/tree/test20170321files/testSpi161101)

このフォルダ内の”M1601A_20161205”というフォルダを


[ブランチ　ATxmega128Branch20170321のリンク](https://github.com/KenjiMaehara/raspberryPiTCPClient/tree/ATxmega128Branch20170321)

このブランチ内にコピーしたいと思い、




Git 1ファイルだけ別のブランチから持ってくる on @Qiita http://qiita.com/oret/items/b646fcada9d89ed308c4


上記のサイトを参考に

```

git checkout test20170321files　testSpi161101/M1601A_20161205

```

このコマンドでコピーして、

ATxmega128Branch20170321のブランチ内で、



```

$ git log --follow --oneline M1601A_20161205

```


これを行ってみたところ、ちゃんと過去のログも継承されて表示できています。

```
$ git log --follow --oneline M1601A_20161205/
7f515f6 コメント008
303c470 test20170703__007
5f76d9e test20170703__006
f92db42 test004
b4e96d8 test070201
4b71be6 test063005
c1a4871 test063002
6f2e42e test063001
c493da8 test062806
7408d48 test062805
b8efa7d test062804
7cf4248 test062801
74cb150 整理の続き
032100c 一部機能の名称変更
3726bcf SPIFポートの受信操作を専門にするタスクを1つ追加。
b077cd3 割り込みベクタのプログラム修正でエラーがでなくなったが、動作割り込みで動作していない。
89b4c85 SPIFのISRを追加。しかし、現在エラー発生中
d18afdb hex_to_ascを追加。
dc97d38 test021701
b788ed2 RS232C通信のためのプログラムの追加。
04c6cc1 wSensorオプションのテスト追加。
6d34210 USARTC0のポートで9.6kHz通信をできるように修正し、TX出力を確認した。
a0ee065 ラズパイへの返答データのコード追加。
a355bd6 リレーの追加。
a7edd76 とりあえず、リレーの制御できるようになった。
408a8a4 現在、全くラズパイからのSPIデータを受信できなくなっている。
c88aeed test_cmd1 = "wr";  などの比較のためのコードが機能していない模様
d0f2768 SPI通信でのやり取りの修正
3717744 ラズパイからの2回目の送信を無視してしまう現象を解消
889222c 0202 005
e12c2fe 0202 004
81760ea 0202 002
59b98d5 test011
95993ee test010
f2d3841 test005
253bc4b test004
```


しかし、このフォルダを別のフォルダに移動すると

```

$ cd testSpi161101/
$ ls
20170609		M1601A_20161205		Spi			hogehogeTest0621.sh
$ git mv M1601A_20161205/ ../M1601A
$ ls
20170609		Spi			hogehogeTest0621.sh
$ cd ..
$ ls
M1601A			test1			test3
raspiScriptFiles	test2			testSpi161101
$ git log --follow --oneline M1601A/
14b19b7 testコメント
303c470 test20170703__007
f92db42 test004
bc1c2fe test 002
68493c8 test070302
b4e96d8 test070201
f8ff870 test063003
c1a4871 test063002
b8efa7d test062804
$ 

```

この操作ご、同じ履歴が出てこなくなります。
これは少し辛いのですが、解決方法はありませんでしょうか？
AWS Price List API から価格情報を引いてくるツールを作った

[AWS Price List API で雑に月額を出してみる](http://qiita.com/y13i/items/b296844486363946d400) の続きです。

- [y13i/awsprice: CLI for AWS Price List API.](https://github.com/y13i/awsprice)

今回はある程度汎用的に使えそうなコマンドラインツールの形式で、 Go で実装しました。

# 実装について

Price List API のオファーファイルは本当にデカいので毎回落としてくるのは厳しいと思い、キャッシュする機構をつけてみました。

macOS の場合は `/var/folders/xx/xxxxxxxxxxxxxxxxxx/T/awsprice` らへんに保存されると思います。

Homebrew でインストールできるようにもしてみました。

## 使用したライブラリなど

表示には [k0kubun/pp](https://github.com/k0kubun/pp) ([Goのデバッグに便利なpretty printライブラリ「pp」を作った](http://qiita.com/k0kubun/items/5150fcb5d0740309d1eb)) を使わせてもらいました。大変きれいにターミナルに出力されて感激です。

CLI の骨組みは [urfave/cli](https://github.com/urfave/cli) を使わせてもらいました。これがなかったらオプションまわりとか面倒すぎて死ぬ気がしました。

スライスをソートするのが面倒だったので [bradfitz/slice](https://github.com/bradfitz/slice) も使わせてもらいました。 Go 力が足りない自分にはありがたい…

# 使いみちについて

おおよその使い方は [README.ja.md](https://github.com/y13i/awsprice/blob/master/README.ja.md) に書いたので、実際何に使えるか考えてみます。

## EFS が東京にまだ来てない現状を確認してみる

```
$ awsprice listOfferRegions -o AmazonEFS
[]awsprice.RegionCode{
  "ap-southeast-2",
  "eu-west-1",
  "us-east-1",
  "us-east-2",
  "us-west-2",
}
```

まだかな〜

## リージョン毎に使えるインスタンスタイプの違いを見てみる

```
$ awsprice -f json listAttributes -p "Compute Instance" -r us-east-1 | jq ".instanceType | length"
77
$ awsprice -f json listAttributes -p "Compute Instance" -r ap-northeast-1 | jq ".instanceType | length"
73
$ awsprice -f json listAttributes -p "Compute Instance" -r eu-central-1 | jq ".instanceType | length"
56
$ awsprice -f json listAttributes -p "Compute Instance" -r ap-south-1 | jq ".instanceType | length"
45
```

新造リージョンは古いインスタンスタイプがなかったりで、使えるインスタンスタイプが少ないことがわかります。

`awsprice` 単体はそれほどクエリー機能が強力ではないですが、 JSON で出力できるので `jq` などとの連携が簡単です。

## 最強インスタンス3年一括お買い上げの値段で腰を抜かしてみる

```
$ awsprice -f json listProductTerms -r ap-northeast-1 -a instanceType=x1.32xlarge -a operatingSystem=Linux -a preInstalledSw=NA -a tenancy=Dedicated --termType Reserved -t "PurchaseOption=All Upfront" -t LeaseContractLength=3yr -t OfferingClass=standard | jq ".[0].OfferTerms[0].PriceDimensions"
{
  "6BKDT7UNN25Z7CYZ.NQ3QZPMQV9.2TG2D8R56U": {
    "RateCode": "6BKDT7UNN25Z7CYZ.NQ3QZPMQV9.2TG2D8R56U",
    "Description": "Upfront Fee",
    "BeginRange": "",
    "EndRange": "",
    "Unit": "Quantity",
    "PricePerUnit": {
      "USD": "142204"
    },
    "AppliesTo": []
  },
  "6BKDT7UNN25Z7CYZ.NQ3QZPMQV9.6YS6EN2CT7": {
    "RateCode": "6BKDT7UNN25Z7CYZ.NQ3QZPMQV9.6YS6EN2CT7",
    "Description": "USD 0.0 per Linux/UNIX (Amazon VPC), x1.32xlarge instance-hour (or partial hour)",
    "BeginRange": "0",
    "EndRange": "Inf",
    "Unit": "Hrs",
    "PricePerUnit": {
      "USD": "0.0000000000"
    },
    "AppliesTo": []
  }
}
```

1,600万円あったら何するかなあ… :skull: 

最強インスタンスでなくても、この要領でインスタンス単体のお値段を調べることができます。

# で、月額は？

汎用的に使えるツールを目指した結果、 EC2 以外のサービスの情報も引けるようになったのはいいのですが、価格単位が時間以外のものも混ざってきて、しかも時間単位でも RI の扱いをどうしたものか……と悩んで結局実装してません。

なにかいいアイデアがあれば教えてください…
WandboxにGithubを利用したユーザー認証が来た

# Wandboxとは

https://wandbox.org/

オンラインコード実行環境です。

以前
[君はまだWandboxの真の実力を知らない～C++er目線で～](http://qiita.com/yumetodo/items/ef24708900b0535aa28c)
でガッツリ触れたので見てください。

# ユーザー認証が来た

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Wandbox に GitHub 認証を入れました。認証した状態で Share したコードの一覧を、後で読み返すことができます。UIをもうちょい綺麗なのに直したりタイトル付けたりAPI用意したりといった機能は後で頑張る予定。 <a href="https://t.co/yXejP6yzMj">https://t.co/yXejP6yzMj</a></p>&mdash; めるぽん(🐾) (@melponn) <a href="https://twitter.com/melponn/status/880823265387659265">2017年6月30日</a></blockquote>

@melpon氏のこのツイートを見てこの記事を書くことに決めた。

# 使い方

# Sign in

前提としてGithubのアカウントが必要である。まあQiita読んでいる人なら持っているような気がするが。

まずはSign inボタンを押す。

![Sign in PC](https://qiita-image-store.s3.amazonaws.com/0/94177/5dbdc0e0-c4ca-79c6-99a2-e4ef3d6ff507.png)
![Sign in mobile](https://qiita-image-store.s3.amazonaws.com/0/94177/8ed3399f-5b49-fca0-d60a-ddb32dbeb8fc.png)

次にGithubにまだログインしていない場合はログインする。

![Github login](https://qiita-image-store.s3.amazonaws.com/0/94177/26800e0b-5883-40c4-8bae-d7a15c699eb7.png)

するとOAuthの権限確認画面が来る。`Authorize melpon`をクリックする。

![OAuth](https://qiita-image-store.s3.amazonaws.com/0/94177/08d20c60-2275-5e88-005b-65bd698a7280.png)

ダークな暗黒さを感じる( #とは )UIになる

![Dark UI](https://qiita-image-store.s3.amazonaws.com/0/94177/f9957db3-16fb-d9ea-f029-2d373c6ac3ea.png)


# できること

## コード公開機能が微妙に変化する。

Runした時にあった`Share` ボタン(旧 `Share This Code`ボタン)がSign inしていると`Share by [user icon]`になります。

かつて
![old](https://qiita-image-store.s3.amazonaws.com/0/94177/2e0b2c0e-a07a-1f90-ce2c-d5fa941b05a5.png)

現在(Sign inしていない場合)
![no Sign in](https://qiita-image-store.s3.amazonaws.com/0/94177/44418d34-0bfb-8b51-fe0b-5391953730cc.png)

現在(Sign inしてる場合)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/94177/9fe6bc48-0323-d774-df3d-d34e4d6b857a.png)

## コード一覧が見られる

`https://wandbox.org/user/:username`

にアクセスすると、**Sign inしてるときに`Share by [user icon]`を押したコードがリストアップされます**。

例えば私の場合は
https://wandbox.org/user/yumetodo
になるわけですね。

# あとがき

まだUIはいじるみたいなことを言っているので変わってたら臨機応変に対応してください。

APIはまだっぽいので、API来たら追記します。

ああ、あとWandboxでは[企業・個人スポンサーを引き続き募集しているらしいです](https://gist.github.com/melpon/8f5d7a8e991ed466d09cf887bd8d92ce)、ステーキ駆動開発ですね。

# License

[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/deed.ja)

<a href="https://commons.wikimedia.org/wiki/File:CC-BY_icon.svg#/media/File:CC-BY_icon.svg"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/1/16/CC-BY_icon.svg/1200px-CC-BY_icon.svg.png" alt="CC-BY icon.svg" width="88px"></a>
Pythonでサンプリングデータから確率分布関数を作るには

# サンプリングデータから確率分布関数を作る
pmfについてヒストグラムを利用する方法とkdeでpdfを作りそれを利用する方法。
pdf: Probability Density Function
pmf: Probability Mass Function
kde: Kernel Density Estimation
gaussian_kdeをそのまま使う場合と共分散を指定する両方の方法の違いをグラフで示すことができた。pmfをpdfを利用して作り出す場合、データの分散を指定することでなめらかな関数ができあがる。
例の場合は整数値なのでデータの離散幅は1である。
従ってσを0.5とし分散σ2を0.25としたものにした。

簡単な例をJupyter notebookで書きました。
以下のGistで公開しています。
https://gist.github.com/koki-ogura/48542f55b631847989b537ceb1b16115

ソースは以下のgithubで公開しています。
https://github.com/koki-ogura/probability_basis
deep learningの出力層でsoftmax関数が活性化関数として使われているけどなんで？

# なんでsoftmaxの関数を使う必要があるの？
deep learningの最後の出力の前にsoftmax関数を挟む。なぜなら
softmax関数を使うことで、全ての要素を足すと1になる数に変換できるので、確率として扱うことができるようになるからである。

ここで疑問は２つで

1. 分類問題の場合、分類結果として一番可能性が高いものだけを答えとして返すので、わざわざ足して１になるように変換する必要が無いのでは？

2. 全ての要素を足した値でそれぞれの要素をわれば、確率に変換できるのでは？

#こたえ
1. このケースではわざわざsoftmax関数で変換する必要がない。出力結果が一番大きい値をとっている分類1つだけ返すだけなので、max関数で判定してOK

2. 使う活性化関数によっては、最終出力が負の数の場合があり、負の数になると全ての要素を足した値で割れなくなる可能性があるので、全ての要素を足した値で割るというのは駄目。
　　  ex 最終出力が[-1, 0.3, 0.7]の場合、 合計値0になり、割れない。
   負の数というのは、何かと扱いづらいので、正の数に変換したいのと、単調増加の関数でかつ足して1になるような良い変換をしてくれるのがsoftmax関数だというわけ。

とりあえず納得！
Linuxで動くWDSモード対応の11acチップセットと搭載製品


ただのメモ書き。未検証でしゅ

# チップセット

- rtl8812au

# 製品

## rtl8812au

- [WN-AC433UA](http://www.iodata.jp/product/network/adp/wn-ac433ua/index.htm)（IODATA）
- [WDC-433DU2H](http://www2.elecom.co.jp/products/WDC-433DU2HBK.html)（ELECOM）



# 参考

- http://blog.techlab-xe.net/archives/5019
- http://kawauso-festival.blogspot.jp/2017/01/buffalowi-u2-433dhpubuntu1404.html
- https://github.com/gnab/rtl8812au/blob/38b565af37a8dfe535991cdc6afb94723c229f00/os_dep/linux/ioctl_cfg80211.c#L1450
3日でアンドロイドアプリを公開までしてみる(Cordova)

# Androidアプリ公開したい！！
今まで、Webアプリばかり作ってきたが、やっぱりエンジニアなら一回はスマホアプリを作って公開したい！！
ということで、三日くらいでアプリを作って公開（公開待ち）までしてみたので、その中で困ったこととか詰まった点をまとめてみる。
## 開発環境
ちなみにアンドロイドアプリの開発にはAndroid StudioではなくCordovaを使った。
・Cordova(HTML+js+css)
・Mac OS
## スケジュール
今回はアニメの名言アプリみたいなのを作りたかったのでまずはデータ集めをして、そのあとアプリを作った。
１日目：データ集め（クローラー作成（ruby））
２日目：Cordovaにてアプリ開発
３日目：アプリ公開
だいたいこんな感じでやってみた。
## 困ったこと
では、早速困ったことをまとめる。
### 署名とかが・・・
アプリを公開するには署名やら何やらをしなきゃならない。
一応このサイトを見れば全部乗ってる。
http://phiary.me/cordova-android-release-build-apk-for-google-play/
これをもとにやれば多分大丈夫だけど
jarsigner
するときにタイムスタンプをしないと怒られるので
```
jarsigner -verbose -tsa http://timestamp.digicert.com -keystore .keystore
 ビルドしたアプリ名　<エイリアス名>
```
こんな感じで
-tsa http://timestamp.digicert.com
オプションをつけよう
### パッケージ名が・・・
パッケージ名がデフォルトのままだと「io.cordova.hellocordova」になっているが、これではGoogleに怒られる。でも、AndroidManifest.xmlを直すだけではうまくいかない。。。（自動生成されるから）
ってことで、Config.xmlの
```Config.xml
<widget id="io.cordova.hellocordova"
```
ここを設定したい名前に変えてbuildすれば自動でAndroidManifestも変わってくれる（便利なのか）
AWSでインスタンスを停止、終了(削除)しても復活してくる問題



自分用メモ


## 現象

EC2インスタンスを停止や終了(削除)しても、いつの間にか起動している。
CloudWatchとかColoudFormationとか調べても、それじゃない。



## 結論

* OpsWorksのLayersの設定
* Auto healing enablesをNoに設定する
在 Activity 左上角加上返回箭頭

(Just a note)

在 `onCreate` 加上

```kotlin
supportActionBar?.setDisplayHomeAsUpEnabled(true)
```

＊注意：是 `supportActionBar` 不是 `actionBar`

接著處理事件：

```kotlin
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
    finish()
    return true
}
```

即可
オンプレMySQL～RDS for MySQL／Aurora間のレプリケーションにおけるタイムゾーン設定

RDS for MySQLやAuroraでは、2015年後半から2016年前半にかけて、相次いでタイムゾーンの設定ができるようになりました。
UTCではなく日本時間（Asia/Tokyo）を選ぶ場合、AWS内で閉じた環境で使う分には良いのですが、オンプレミス環境などとの間でレプリケーションを行う際に、タイムゾーンのずれが問題になることがあります。

# MySQLのタイムゾーン
こちらに説明があります。

**[10.6 MySQL Server でのタイムゾーンのサポート](https://dev.mysql.com/doc/refman/5.6/ja/time-zone-support.html)**（MySQL 5.6 リファレンスマニュアル）

これによると、MySQLのタイムゾーン（サーバー側設定）には2種類あります。

 * システムタイムゾーン
 * サーバーの現在のタイムゾーン

Linux環境において、前者は、

 * mysqld_safeの起動オプションで**「--timezone」**を指定するか、**my.cnf**の**[mysqld_safe]**セクションで**「timezone」**を指定していれば、その値（例：**「UTC」「JST」**）
 * 特に指定をしなければ、OSのTZ環境変数の値

が、後者は、

 * mysqldの起動オプションで**「--default-time-zone」**を指定するか、**my.cnf**の**[mysqld]**セクションで**「default-time-zone」**を指定していれば、その値（例：**「Asia/Tokyo」「+09:00」**）
 * 特に指定をしなければ、**「SYSTEM」**（＝システムタイムゾーンと同じ、という意味）

が入ります。

※ほかに、mysqlクライアントの接続毎のタイムゾーンも指定できます。

オンプレミス環境で、OSを普通に日本のタイムゾーンで設定し、my.cnfや起動オプションに何も指定しない形でMySQLを設定した場合、通常は以下のようになります。

```mysql:MySQL（オンプレ・日本時間）
mysql> show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | JST    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)
```

一方、AWSでRDS for MySQLやAuroraインスタンスを起動し、パラメータグループでtime_zoneを「Asia/Tokyo」に設定しインスタンスに適用した場合は、以下のようになります。

```mysql:RDS(MySQL)／Aurora（日本時間）
mysql> show variables like '%time_zone%';
+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone | UTC        |
| time_zone        | Asia/Tokyo |
+------------------+------------+
2 rows in set (0.00 sec)
```

# 問題が発生するケース

このように、

 * オンプレミス側がマスターになる
 * システムタイムゾーンがマスター／スレーブ間で異なる
 * オンプレミス側のサーバーのタイムゾーンが「SYSTEM」（無指定＝システムタイムゾーンと同じ／バイナリログに**「SET @@session.time_zone='SYSTEM'/*!*/;」**が記録される）

かつ、

 * マスター側サーバーのバイナリログを**「MIXED」**または（通常は指定しないですが）**「STATEMENT」**にしている

場合は、

 * **DATE／TIME／DATETIME型カラムに、NOW()関数などによってセットした値（時刻）**

がずれます（「JST」と「UTC」の組み合わせであれば9時間）。

※オンプレミス側のOS時間を（RTCの設定ミスなどで）「UTCを指定しているのに時刻をJST相当で設定・運用している場合」は、TIMESTAMP型カラムの値のほうがずれます。

このようなレプリケーションは、平常運用時にはあまり行わないと思いますが、オンプレミス⇒AWSの移行準備で行うことがあると思います（移行にDMSを使わないケース）。

# 問題の回避

システムタイムゾーンを合わせられれば良いのですが、残念ながらAWS側で設定できるのはサーバーの（現在の）タイムゾーン（time_zone）のほうだけですので、オンプレミス側の同オプションパラメータを**my.cnfに記述し、mysqldを再起動**することで対応します。

```test:my.cnf（部分）
[mysqld]
default-time-zone='+09:00'
```

※以下のように（mysqlスキーマ内の）タイムゾーンテーブルをロードしている場合は、RDS for MySQL／Auroraと同様、「Asia/Tokyo」形式での指定も可能です。

**[4.4.6 mysql_tzinfo_to_sql — タイムゾーンテーブルのロード](https://dev.mysql.com/doc/refman/5.6/ja/mysql-tzinfo-to-sql.html)**（MySQL 5.6 リファレンスマニュアル）

なお、RDS for MySQL／Aurora側をマスターにする場合、バイナリログには「Asia/Tokyo」形式でタイムゾーンが記録されることもありますので、トラブルを避けるために、オンプレミス側でタイムゾーンテーブルをロードしておいたほうが良いでしょう。

# 注意点

マスター／スレーブの2階層ではなく、マスター／中継（スレーブ＆マスター）／スレーブの3階層でレプリケーションを行う場合、

 * スレーブ側では、「そのSQLの発行元サーバー」のタイムゾーンと自サーバーのタイムゾーンを比較して値を決定する

という動作をするため、中継サーバーだけ設定を変更・反映（再起動）しても意味がありません。

必ず、マスターを含め、全てのサーバーのタイムゾーンの関係性が合うように設定を変更・反映（再起動）します。

---

**【おまけ】**
Amazon Aurora関連投稿記事へのリンクを集めました。

 * **[Qiitaに投稿したAmazon Aurora関連記事](http://hmatsu47.hatenablog.com/aurora)**
影響範囲調査の調査をしてみました

# 概要

プログラマーが影響範囲調査を行うことは多いですが、具体的にどういう作業をしているかいまいち自分でも分からなかったので考えてみました。

# サーベイ

## サーベイ1

変更の影響範囲を特定するための「標準調査プロセス」の提案
スライド: https://www.juse.or.jp/sqip/workshop/report/attachs/2014/20150227-6-1.pdf
論文: https://www.juse.or.jp/sqip/workshop/report/attachs/2014/sqip6-a.pdf

まとめると、以下を行うとうまく調査できるらしいです。

- 変更要求をちゃんと理解する。
- 調査目的を明確化する。
- ソースコード理解時に、関数を幅優先探索で探索する。
- ソースコード理解時に、構造図やPADを使って理解する。
- 資料は、構造図やPADで残す。

構造図は資料を見ると、関数呼び出しのツリー構造のようです。私も調査するときは無意識にこれを作っていました。PADは、[こちら](http://itdoc.hitachi.co.jp/manuals/3020/3020378270/LANG0027.HTM)によるとフローチャート的なものらしいです。

## サーベイ2

[システム変更を安全かつスピーディに進めるための極意とは？～CRUD表で今すぐできるコスト削減](https://enterprisezine.jp/iti/detail/2030)

CRUD表。横軸がテーブルで、縦軸がAPIエンドポイントで、自動生成できたら良いですね。

# 影響範囲調査プロセス

サーベイを参考に、影響範囲調査プロセスを考えてみました。

1. 調査目的の明確化
- ソースコード理解
- 資料化

サーベイにあった変更要求の理解は、影響範囲調査プロセスの外にある気がするので除外しました。変更不可能なプログラムでも挙動を知るためだけに調査する可能性があるからです。

調査目的の明確化は文字通りです。例えば、「XXXの機能追加を検討しているが、この機能追加の工数を見積もりたいので、XXXの影響範囲を調べる」「YYYというバグ修正を行ったが、デグレ検証項目を決める必要があるので、YYYの影響範囲を調べる」などです。

ソースコード理解は文字通りです。

資料化は、再利用したり、齟齬を減らしたり、調査の妥当性を客観的に検証するためのものです。

# 方法論

## 調査目的の明確化

フォーマットを作って埋めてもらえば解決すると思います。

## ソースコード理解

サーベイにあるように、幅優先探索で関数呼び出しツリー構造を作るのが良いと思います。こちらもフォーマットで解決です。

## 資料化

[学術論文の書き方](http://www.u-gakugei.ac.jp/~kishilab/shippits.htm)に習って、目的、方法、結果、考察、結論を書いてもらえばよいと思います。

# フォーマット

- 目的
- 方法 (同じ方法で調査できるように書く)
- 結果
- 関数呼び出しツリー
- 考察
- 結論
シンクライアント端末用ロック

シンクライアント端末で Windows+L を押したとき、リモート接続先の仮想端末ではなく本体の物理端末がロックされてしまう問題が発生。
物理端末の設定を変えればいいんだろうけど、調べるのも手間だし、原因がわかっても管理者でないと対処できない気がしたので、手っ取り早くロック用のショートカットを作った。

方法は簡単で、新しいショートカットの作成ウィザードで以下を入力するだけ。

> rundll32 user32,LockWorkStation

カンマに注意。また、カンマの前後に空白を入れないこと。

rundll32は、DLL内の関数を直接呼び出すコマンドで、Windows APIがわかればいろいろなことができる。コマンドラインだけではどうにもならないようなことも、案外簡単にできてしまう。かもしれない。

アイコンが気に入らない？
shell32.dllにもう少しマトモなアイコンがあるので、ショートカットのプロパティから好きなように変えたらよろしい。

どうせなら Windows+L みたいなショートカットキーが欲しい？
ショートカットにはショートカットキーを設定できるので、ここに L とでも入れておけば Ctrl+Alt+L で呼び出せる。

とりあえず Windows 8.1 の仮想端末で動作確認済み。物理端末は Windows Embedded の何かで、バージョン不明。
他のバージョン・組み合わせで動くかどうかは知らん。動作報告歓迎。
CircleCI 2.0 で sbt dist が永久に終わらない問題

## 背景
下記のように、CircleCI 2.0 上で `./sbt dist` を実行した際、ビルドの実行が終了してもプロセスが永久に戻ってこない問題が発生します。

この場合、同様のコマンドは手元では問題なく動きます。

```yaml

version: 2
jobs:
  build:
    working_directory: ~/workspace
    docker:
      - image: openjdk:8
    steps:
      - checkout
      - run:
          name: Run build
          command: ./sbt dist
```

## 解決方法
このような場合は、`cat /dev/null |` に続けて実行してあげると解決するようです。

```yaml

version: 2
jobs:
  build:
    working_directory: ~/workspace
    docker:
      - image: openjdk:8
    steps:
      - checkout
      - run:
          name: Run build
          command: cat /dev/null | ./sbt dist
```

同様の現象でお困りの方は、お試しください。
PowerShellでtimeもどき

#目的
PowerShellでUnixライクなtimeコマンドを実現する（実時間のみ）。

#背景
Windowsにもtimeコマンドは存在するが、UnixやLinuxのtimeとは異なりコマンドの実行時間の計測ができない。

#コード
PowerShellスクリプトですが、Windows バッチファイルとしても実行できる特殊な構造になっています。

```PowerShell:time.bat
<# : バッチコマンド(PowerShellコメント)開始
@echo off & setlocal
rem
rem     time.bat 
rem
rem     Created by earthdiver1
rem     クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンスの下に提供されています。
rem
rem -------------------------------------------------------------------------------
rem 以下はPowershellスクリプトをバッチファイルの中に埋め込むためのプリアンブルです。
set BATCH_ARGS=%*
if defined BATCH_ARGS set BATCH_ARGS=%BATCH_ARGS:"=\"%
if defined BATCH_ARGS set BATCH_ARGS=%BATCH_ARGS:^^=^% 
endlocal & Powershell -NoP -C "&([ScriptBlock]::Create((${%~f0}|Out-String)))" %BATCH_ARGS%
exit/b
rem -------------------------------------------------------------------------------
: バッチコマンド(PowerShellコメント)終了 #>
Function Time {
    Write-Host $Args
    $cmd,$rest = $Args
    Measure-Command { &$cmd $rest | Out-Host } | %{ Write-Host "`n$($_.TotalMilliseconds) msec" }
}

Time $Args
```

#実行例

```
>time.bat timeout 5
timeout 5

5 秒待っています。続行するには何かキーを押してください ..0

5125.7957 msec
```

#備考
スタンバイリスト（≈ファイルキャッシュ）をクリアしないと2回目以降の実行時はI/Oオーバーヘッドを含めた実行時間の計測が正確にできなくなります。スタンバイリストをクリアするツールはこちら。
[Empty Standby List](https://wj32.org/wp/software/empty-standby-list/)

#おまけ
[純粋なバッチファイル版のtimeコマンド\(timer.bat\)](https://curiouser.cheshireeng.com/2014/08/20/trick-timing-a-command-using-a-bat-file/)
import  したpythonモジュールが期待した動作をしないときのチェック項目

python であるモジュールをimport したときに期待した動作をしないことがあった。
そのとき以下のような項目をチェックした。
例としてcv2で記述します。

- [ ] pythonコマンドで起動するpythonのバージョンのチェック

```
Linux $ which python
```

- [ ] python のサードパーティのモジュールが置かれるpathの確認
- [ ] import したモジュールのバージョンの確認

```
>>> import cv2
>>> cv2.__version__
'2.4.11'
```

- [ ] import したモジュールのファイル名の確認

```
>>> cv2.__file__
'C:\\Python27\\lib\\site-packages\\cv2.pyd'
```

このようなチェックをすると、意図していない版が動いているかどうかを確認できます。

----
さらに必要なチェック項目
- ライブラリをビルドしたときの条件
    - OpenMP　を使っているか
    - Cuda を使っているか
    - その他のビルド条件

```
>>> print cv2.getBuildInformation()

General configuration for OpenCV 2.4.11 =====================================
  Version control:               2.4.11

  Platform:
    Host:                        Windows 6.1 AMD64
    CMake:                       2.8.11.2
    CMake generator:             Visual Studio 10
    CMake build tool:            C:/Windows/Microsoft.NET/Framework/v4.0.30319/MSBuild.exe
    MSVC:                        1600

  C/C++:
    Built as dynamic libs?:      NO
（以下略）

  Other third-party libraries:
    Use IPP:                     NO
    Use Eigen:                   NO
    Use TBB:                     NO
    Use OpenMP:                  NO
    Use GCD                      NO
    Use Concurrency              YES
    Use C=:                      NO
    Use Cuda:                    NO
    Use OpenCL:                  YES
```
Ubuntu 16.04でvagrant-seilプラグインを使う

# SEIL/x86 + Vagrant
SEIL/x86がさらに便利になりそうな、[Vagrantのプラグイン](https://www.seil.jp/blog/vagrant-x86fuji.html)があるの、知らなかった!
これならCUI制御でCUIルーターとの相性もばっちり。設定もprovisionerから流し込める。

その時に、(SEIL/x86と関係ないところで)ハマった記録。

# さっそくインストール
環境はお手元のUbuntu Desktop 16.04 64bit。

## VirtualBoxのインストール
`# apt install virtualbox virtualbox-ext-pack`
問題なし。

## Vagrantのインストール
`# apt install vagrant`
問題なし。

## `vagrant-seil`のインストール
`$ vagrant plugin install vagrant-seil`
ここではまる。

### Ubuntu 16.04での`bundler.rb`の問題

```shell-session
in `all=': undefined method `group_by' for nil:NilClass (NoMethodError)
```

といったエラーが出る。これでググると解決策がいっぱい出てくる。
解決策は主に3種類。

1. 新しいVagrantを入れる
2. 修正されたVagrantの.debを入れる
3. 手動でパッチを当てる

`apt upgrade`じゃ直らないのかな…。
パッケージをいじると後が面倒そうだったので、パッチを当てる選択をした。
[このへん](https://stackoverflow.com/questions/36811863/cant-install-vagrant-plugins-in-ubuntu-16-04)や[このへん](https://github.com/vagrant-libvirt/vagrant-libvirt/issues/575)を真似して、

```shell-session
$ sudo sed -i'' "s/Specification.all = nil/Specification.reset/" /usr/lib/ruby/vendor_ruby/vagrant/bundler.rb
```

のような感じで解決。

### zlibの問題
再度pluginをinstallしようとすると、やたら長いエラーが出る。
ポイントは`zlib is missing; necessary for building libxml2`。
zlibが無いとのこと。
[こちら](http://qiita.com/bloody_snow/items/e7cc43a83ba8b1f3ca0d)などを参考に、

```shell-session
$ sudo apt-get install zlib1g-dev
```

で解決。

# 起動
あとは[本家](https://www.seil.jp/blog/vagrant-x86fuji.html)の通り。
Vagrantfileは、`EXPERIMENTAL_seilx86-500-vagrant.zip`の中に入っているものを編集して使った。

```shell-session
$ vagrant up
$ vagrant ssh
```

わーい!

# おまけ: ネットワーク
```:Vagrantfile
  config.vm.network "public_network", bridge: "br0"
  config.vm.network "public_network", bridge: "br1"
```

などとすると、`vagrant ssh`で入れるhost onlyな`lan0`に加え、`brctl`で作ったブリッジにつながるpublicな`lan1`と`lan2`が増えた。
[SEILテクニカルマニュアル](http://www.seil.jp/doc/index.html#fn/interface/cmd/interface_lan.html)によると、SEIL/x86上のインターフェースは最大6個まで増やせそうだ。
わーい!
コマンド一発でGithubにPushしたい

タイトルの通りです。
いつも発行している

```
git push origin branchName
```

をコマンド一発でやりたいと思って作成しました。

## bash_profileの編集
bash_profileに以下を追加します。
まずviで編集します

```:command
$ vi ~/.bash_profile
```

これを追加します。

```:bash_profile
alias mygitpush="git branch |grep \"* \"|awk '{if (\$2 != \"develop\" && \$2 != \"master\") {print \$2 } else {print \"Carefull!! This branch is develop or master!!!\"; exit } }'| xargs git push origin "
```

## 再読み込み
追加したら、再読み込みします。

```:command
$ source ~/.bash_profile
```

## 実行
gitのワークスペース内で以下を実行したらmaster,developのブランチ以外でpushできます。

```:command
$ mygitpush
```

という怠けようコマンドでした。
IPv6アドレス図鑑

ようやく自宅環境をIPv6にしてみた初心者です。自分で試してみるまではIPv6ってただIPv4の32ビットのアドレス空間を128ビットにしただけでしょ、くらいに思っていたのですが、IPv6のアドレスにもいろいろな種類があることがわかりました。初心者ならではの視点で今回試す中で目にしたアドレスの数々を紹介したいと思います。

# アドレスの表記

まずはアドレスの表記の仕方から。128ビットのアドレスを8分割し16ビットずつ区切ったものをコロン(:)でつなげます。a-fの英字小文字、コロンで区切られた各フィールドの先頭の0は省略します。たとえばこんな感じです。

```
2403:3a00:202:1104:219:94:245:35
```

ただし2つ以上連続する0のフィールドは省略して `::`と書くことができます。連続する0が2箇所ある場合は長い方を省略します。同じ長さの場合左側を省略します。

# 図鑑

## `::1`

種別：ループバックアドレス
レア度：-

ローカルのネットワークがIPv6対応になっていればどこでも見つけられます。各ノードが自分自身と通信するためのアドレスでIPv4でいうところの 127.0.0.1 です。

## `fe80:0:0:0:...`

種別：リンクローカルアドレス
レア度: -

ループバックアドレス以上によく見かける種類です。リンクつまりルータの外に出ずに直にやりとりする範囲で有効なアドレスです。すべてのリンクごとに付与されてますが、このアドレスでリンクの外に出ることはできません。

このアドレスでやりとりするときにはそれだけで一意に宛先を決定できないのでどのリンクなのかを明示する必要があります。`fe00::1%eth0` というように % のあとにインタフェースを付加します（Windowsの場合は `%15`のようにIDを付加する）。コマンドによってはこの書き方ができなくて例えばlinux の ping6 コマンドの場合は次のようにオプションでリンクを指定する必要があります。

```shell-session
% ping6 -I eth0 fe80::1
```

## `::`

種別：文脈次第
レア度: -

すべて0のアドレスです。IPv4での`0.0.0.0`同様文脈に応じてデフォルトゲートウェイなどいくつかの意味を持ちます。

## `2001:db8:...`

種別：文書記述用アドレス
レア度: ★

文書の中に生息する紙魚のようなアドレスです。例として使用します。最初、なんの説明もなくドキュメントの中に出てきて戸惑いました。ルーターで中継されないので実際に使ってしまっても害はないようですが……。

## `2xxx:...` or `3xxx:...`

種別：グローバルユニキャストアドレス(GUA)
レア度：★

インターネットに出られるアドレスです。プロバイダーからもらわないといけないので、レア度を★にしました。IPv4では基本的に1つずつしかもらえませんでしたが、IPv6ではまとめてこの範囲という感じで複数もらえることが多いです。LAN内の各機器やサーバー上のVMにそれぞれグローバルなアドレスをふることができます。

## `fcxx:...` or `fdxx:...` 

種別：ユニークローカルアドレス(ULA)
レア度：★★

インターネットには出ないけどリンクの外には出たいという中間的な用途のために用いられます。GUAは変化する可能性があるのでサイト内で固有のアドレスを付与したいときや付与されたGUAの数が足りないときに用いられます。

## `ffxx:...`

種別：マルチキャストアドレス
レア度：★

これまで紹介したのは単一のノードに送信するためのユニキャストアドレスですが、これは複数のノードに送信するためのアドレスです。

よく使うものとしては `ff02::1`があります。これはリンク内のすべてのノードに対して送ります。リンク固有なのでリンクローカルアドレス同様リンクを明示する必要があります。

## `::ffff:a.b.c.d`

種別：IPv4射影IPv6アドレス
レア度：★★★

a.b.c.d の部分にはIPv4のアドレスがそのまま入ります。これは実体をもったアドレスではなくIPv4のアドレスをIPv6のアドレス体系からみたときにこうあらわそうというものです。IPv4, IPv6両対応のサーバのログなどにあらわれます。

## `2002:...`

種別：6to4アドレス
レア度：★★★

GUAの一種なのでインターネットに出られます。Apple AirMac Expressの設定でIPv6を有効にしたら付与されました。6to4という技術でIPv4のネットワークをトンネリングしてIPv6のパケットを流してくれるようです。ぼくの環境ではpingとsshは通信できましたが、http(s)は通らなかったです。調べるのも面倒なので放置してしまいました。

## `2001:0:...`

種別：Teredoアドレス
レア度：★★

これも6to4同様トンネリング用です。Windows機に付与されてました。

# おわりに

図鑑なのに図が一つもなかった。

# 参考

- [IPv6アドレス - Wikipedia](https://ja.wikipedia.org/wiki/IPv6%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9)
ksnctf#32を解いたあーー

こんにちは！
ＳＩＬＧのＣＴＦチーム所属、ななみです。
ＣＴＦ**超初心者**です。
勉強しながら頑張って書きます！

#本題に入ります、、、、

今回はksnctfの#32を解いてみました～
タイトルはSimpleAuth
問題ページを見ると、なんか送信するサイトに飛ぶＵ
ＲＬとそのソースが貼ってある.....
![2017-07-03.png](https://qiita-image-store.s3.amazonaws.com/0/190383/a2cbc797-780b-138d-b64c-0086e9106342.png)![2017-07-03 (1).png](https://qiita-image-store.s3.amazonaws.com/0/190383/001f0c68-57df-1567-28d1-4b733887cad5.png)



phpで書いているみたいだなあ、あんまりわからないなあ、
と思ってたら
flagはpasswordだと書いてある～！
まあ、みれば誰でもわかるけど（笑）

passwordをどうやって入手しよう.....
なんか先輩がブルートフォースアタックでやるみたいでプログラム組んでたみたいだけど、なんかいきづまってた.....
とりあえず、Phpのわからない文法を調べよって思って
inssetとstrcasecmpを調べてみたらーーー
なんかstrcasecmpは脆弱性があるらしい、、
これやん！
==を===にするとか[]を付け加えるとかあって、んーーってなって終わった（笑）
まず、このソースをどうやって変更するかわからない、、

#ごちゃごちゃしたけど、答え合わせ
今回は、結構惜しいところまでいったみたいでstrcasecmpは脆弱性があるってことはあってた！
で、結局strcasecmpのPOSTのところに配列[]を与えればいいらしい。
これは、strcasecmpで文字型に配列を渡すと必ずnullを渡すみたいでそれは０と等しくなるらしい
で、**flagゲット！！**
ほう…
ソース書き換えるには、方法いろいろあるけど
firebug使えばいいらしい
これ最近、先輩に教えてもらったやつやーんって思った

#終わりに
今回初めて惜しいところまでいった！やったね！
また来週も頑張って更新します。
Carthageのビルドが遅い時はcache-buildsオプションを活用しよう

多くの外部ライブラリを導入しているプロジェクトで、Carthageでフルビルドすると、めちゃ遅いですよね。

そんな時は、cache-buildsオブションを利用しましょう。

```
carthage bootstrap --platform iOS --cache-builds
```

cf. https://github.com/Carthage/Carthage#caching-builds

読んで字の通りですが、ビルド済みのライブラリはスキップして、ビルドされていないライブラリのみをビルドしてくれるようになります。

なお、バージョンは `0.20` から、2017年2月にリリースされた機能なので、古いcarthageを使っている場合は、brewなどでcarthageのアップデートも忘れずに行いましょう。

https://github.com/Carthage/Carthage/releases/tag/0.20.0

そして、fastlaneを利用している場合もcache-buildsオプションは使えるようです。

```ruby:Fastfile
platform :ios do
  before_all do
    carthage(cache_builds: true)
  end
  # 以下略
end
```

こちらもfastlaneのバージョンが`2.26.0`からなので、それ以上のバージョンを使いましょう。

https://github.com/fastlane/fastlane/releases/tag/2.26.0
### 参考
https://github.com/fastlane/fastlane/pull/8504
ZoomdataとHadoop（Hive on Tez）の連携（Azure編）

## ZoomdataとHortonworksで、BI on Hadoop
[Zoomdata](https://www.zoomdata.com/)と呼ばれる、BIプラットフォームを使って、Hive Tableのデータを可視化をしてみよう。Zoomdataは、内部でSparkを利用しておりデータをメモリにキャッシュする事で、高速にデータを可視化する事ができる。Azureでは、HortonworksもZoomdataもSandboxが提供されているので、そちらを使って簡単に試す事ができる。


![](https://www.zoomdata.com/docs/2.2/images/Data%20Sources/Spark/v2.2/SparkIt%20in%20Zoomdata%20(2).png?dc=201604041903-160&width=1608&height=616)
Source: https://www.zoomdata.com/docs/2.2/images/Data%20Sources/Spark/v2.2/SparkIt%20in%20Zoomdata%20(2).png?dc=201604041903-160&width=1608&height=616

## 手順
1. [Azureで、Hortonworks Sandboxを使い、Hadoop、Sparkを試してみよう](http://qiita.com/kkitase/items/1d2e4662c2e8c9b0fd59)を参考に、HDP Sandboxを展開する。

2. Marketplaceから、Zoomdataを展開する。詳細は、[Getting Started with Microsoft Azure and Zoomdata](https://www.zoomdata.com/docs/2.5/getting-started-with-microsoft-azure-and-zoomdata.html)を参照するといいだろう。

3. 起動したら、https://ip_address:8443/zoomdata に、下記ユーザーでアクセスする
userid: admin
passwd: インスタンス名

4. 左上の歯車アイコンをクリックし、「Hive On Tez」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/42406/758ea13c-c019-f741-8092-c9bbebe7ed64.png)

5. Hive On Tez Connectorに沿って、値を入力する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/42406/3469e6b1-1494-8256-c4f7-be6c7fbddd91.png)

6. ConnectionのJDBCの設定は下記のように入力し、Validateをクリックし、Next
jdbc:hive2://ip_address:10000/default
（port 10000をネットワークセキュリティグループで開放しておく）
（再起動時には、割り当て解除にしておくと、ip_addressが変更されるので注意。）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/42406/ac7b8b6f-e0d8-803e-d835-23f744d306b9.png)

7. Hive tableを選択し、Next
![image.png](https://qiita-image-store.s3.amazonaws.com/0/42406/380175a4-c7d0-6b8e-6c51-8b717c1c478b.png)

8. Saveしたら、New Chart & Dashboardをクリックし、お好みのチャートを作成する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/42406/f43c8052-c9dd-422b-d614-82a4224a18bf.png)

9. 下記のようなチャートが作成できる。保存する場合は、Saveで保存する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/42406/83ce4cbe-cac4-0830-1ebc-95f766c28dc2.png)

---
以上
VS codeでES6のコードをデバッグする

VisualStudioCode(VS code)を使ってES6で書いたファイルをデバッグしようとしたところ、思ったより難しくて若干はまりました。ネット上に古い情報が多かったのと、日本語の情報がなさそうだったのでやり方をメモしておきます。

# コード

https://github.com/hoture/vscode-debug

# ディレクトリ構造

以下のように`src`にコードがまとまっていて、`main.js`をデバッグしたいということにして話を進めます。

```
├── package.json
├── .babelrc
└── src
    ├── add.js
    └── main.js
```

# いろいろ設定

まず、VS codeの左の虫のアイコン→歯車のアイコンとクリックして、`.vscode/launch.json`を生成し、以下のように書きます。コンパイル時に`source-maps`を使うことと、コンパイル前後のファイルのパスを明示します。

```.vscode/launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "プログラムの起動",
      "program": "${workspaceRoot}/src/main.js",
      "sourceMaps": true,
      "outFiles": ["${workspaceRoot}/.compiled/main.js"]
    }
  ]
}
```

コンパイルのためのコマンドを`package.json`に書いておきます（この辺はそれぞれ適当にやってください）。`--source-maps`オプションをつけることが重要です。

```package.json
{
  ...
  "scripts": {
    "compile": "rm -rf .compiled && babel src --out-dir .compiled --source-maps"
  },
  ...
}
```

これで、コマンドラインで

```shell-session
npm run compile
```

してから`src/main.js`に適当にbreak pointを設定して、虫アイコン→緑の三角アイコンとクリックすると、ちゃんと動いていることがわかると思います。

# コンパイルの自動化

デバッグのためにいちいち`npm run compile`と打つのが若干めんどくさいです。これを改善するため、緑の三角アイコンをクリックした際に自動的にコンパイルをしてくれるようにしましょう。

まずは`.vscode/launch.json`に一行追加します。

```diff:.vscode/launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "プログラムの起動",
      "program": "${workspaceRoot}/src/main.js",
      "sourceMaps": true,
      "outFiles": ["${workspaceRoot}/.compiled/main.js"],
+     "preLaunchTask": "compile"
    }
  ]
```

さらに、`.vscode/tasks.json`というファイルを追加します。

```tasks.json
{
  "version": "0.1.0",
  "command": "npm",
  "isShellCommand": true,
  "args": ["run"],
  "showOutput": "silent",
  "tasks": [
    {
      "taskName": "compile",
      "isBuildCommand": false,
      "isTestCommand": false,
      "showOutput": "silent",
      "args": []
    }
  ]
}
```

これで、緑の三角アイコンを押すだけでコンパイルも含めてやってくれるようになります。

# 参考
- https://gist.github.com/dchowitz/83bdd807b5fa016775f98065b381ca4e
- https://www.youtube.com/watch?v=NUtC-FjJILw
- https://stackoverflow.com/questions/38557822/debugging-in-visual-studio-code-with-babel-node
- https://stackoverflow.com/questions/31711286/vscode-debug-es6-application
- https://stackoverflow.com/questions/36006303/vs-code-breakpoint-ignored-because-generated-code-not-found-error
ネストするStrong Parametersの書きかた


パラメータがネストするにしたがって、Strong Parametersの `permit` の書きかたがややこしくなっていくのでまとめました。

## 基本パターン

```json:params
{
  "name": "Foo Bar",
  "email": "foo@example.com"
}
```

```ruby
params.permit(:name, :email)
```

## オブジェクトが1回ネストするパターン

```json:params
{
  "name": "Foo Bar",
  "address": {
    "prefecture": "Kanagawa",
    "city": "Yokohama"
  }
}
```

```ruby
params.permit(:name, address: [:prefecture, :city])
```

## 配列が1回ネストするパターン

```json:params
{
  "name": "Foo Bar"
  "friends": [
    {
      "name": "Fizz Buzz"
    },
    {
      "name": "Lorem Ipsum"
    }
  ]
}
```

```ruby
params.permit(:name, friends: [:name])
```

オブジェクトが1回ネストするパターンと同じになります。

## 2回ネストするパターン

```json:params
{
  "name": "Foo Bar",
  "friends": [
    {
      "name": "Fizz Buzz",
      "address": {
        "prefecture": "Kanagawa",
        "city": "Yokohama",
      },
      "friends": [
        {
          "name": "Foo Bar"
        }
      ]
    },
    {
      "name": "Lorem Ipsum",
      "address": {
        "prefecture": "Kanagawa",
        "city": "Yokosuka",
      },
      "friends": [
        {
          "name": "Foo Bar"
        }
      ]
    }
  ]
}
```

```ruby
params.permit(:name, { friends: [:name, { address: [:prefecture, :city], friends: [:name] }] })
```

## 参考

『Rubyのしくみ』("Ruby Under a Microscope") の著者のPat Shaughnessy氏が、Strong Parametersの覚えかたについて次のページで図を交えつつ解説しています。

- [A Rule of Thumb for Strong Parameters - Pat Shaughnessy](http://patshaughnessy.net/2014/6/16/a-rule-of-thumb-for-strong-parameters)

> To Permit a Hash, Pass an Array
> To Permit an Array, Pass a Hash

Hashを許可したかったら配列を、配列を許可したかったらHashを渡せ、とのことです。
mod_wsgiでhugを使い、APIを作る

[hug](http://www.hug.rest/)はPythonでAPIを簡単に作るモジュールです。
[mod_wsgi](https://modwsgi.readthedocs.io/en/develop/)はPythonコードをApacheで動かすためのパッケージです。
これらを組み合わせて、Apacheで動くAPIを簡単に作ります。

# hugアプリケーションをmod_wsgiで読み込む
Pythonコードに[WSGI](https://www.python.org/dev/peps/pep-3333/)に対応したapplicationを用意する必要があります。
hugにはapplicationが用意されており、以下ように読み込めます。

- `application = __hug_wsgi__`
- `from hoge_hoge import __hug__wsgi__ as application` 

# サンプルコード

```py3
# -*- coding:utf-8 -*-

import hug

@hug.get("/", examples="text=Hello World!")
def keyword_extraction_api(text: hug.types.text):
    return {'text': text}

application = __hug_wsgi__
```

これで、`http://hoge-server.com/text=Hello%20World!`とリクエストを送れば、`{"text": "Hello World!"}`が返ってきます。

## ちょっとハマったところ
なかなかコードが実行できずハマった。
原因は`__hug_wsgi__`を最初に書いていたことである。
（おそらく、デコレータを書くと、メソッドが`__hug_wsgi__`に追加される？ため、最後に`__hug_wsgi__`を書くと良さそう。）
CentOS7でNetBIOSホスト名解決

Linuxで、``/etc/nsswitch.conf``の``hosts``行に``wins``と記入するとLinuxからNetBIOS名前解決できるという技があるのです。例えば

```/etc/nsswitch.conf
hosts: files wins dns myhostname
```

こんなふうに記入すると

```shell-session
$ ping windowsPC
PING windowsPC (192.168.0.32) 56(84) bytes of data.
```

こんな感じで名前解決ができるというものです。

これをCentOS7でやろうとしたら、意外とはまったので以下作業メモになります。バージョンは CentOS Linux release 7.3.1611 (Core)、x86_64版です。

#手順

まずsambaとwinbindをインストールします。

```shell-session
# yum install samba
# yum install samba-winbind
```

``systemctl``コマンドでデーモンを立ち上げます。

```shell-session
# systemctl start winbind
# systemctl enable winbind
# systemctl start nmb
# systemctl enable nmb
# systemctl start smb
# systemctl enable smb
```

ファイアーウォールに穴をあけます。

```
# firewall-cmd --zone=public --add-service=samba --permanent
```

``/etc/nsswitch.conf``に``wins``を書き加えます。

```/etc/nsswitch.conf
hosts: files wins dns myhostname
```

以上！

。。。なのですが、ここまでやってもダメな場合があります。
現象としては、ホストによっては``名前またはサービスが不明です``ではなく``システムエラー``が出るというものです。

```shell-session
$ ping windowsPC
ping: windowsPC: システムエラー
```

再現条件は、どうやら複数のネットワークインターフェースを持つWindows相手だと出るらしいのですが、原因は不明です。Ubuntuでは出ない現象なので、CentOS固有のバグかもしれません。

#参考

Microsoft Windows ネットワークへのSambaの統合
公式のSamba 3.2.x HOWTOとリファレンスガイド, Chapter 29
http://www.samba.gr.jp/project/translation/Samba3-HOWTO/integrate-ms-networks.html
PowerShellでfindもどき

#目的
PowerShellでファイル検索のツールを作ってみた。

#環境
OS        : Windows 7 以降
PowerShell: Version 3 以降

#コード
PowerShellスクリプトですが、Windows バッチファイルとしても実行できる特殊な構造になっています

```PowerShell:find.bat
<# : バッチコマンド(PowerShellコメント)開始
@echo off & setlocal
rem
rem  高速ファイル検索
rem
rem     Find.bat  [検索対象の最上位フォルダー] [ファイル名のフィルター]
rem
rem     Created by earthdiver1
rem     クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンスの下に提供されています。
rem
rem -------------------------------------------------------------------------------
rem 以下はPowershellスクリプトをバッチファイルの中に埋め込むためのプリアンブルです。
set BATCH_ARGS=%*
if defined BATCH_ARGS set BATCH_ARGS=%BATCH_ARGS:"=\"%
if defined BATCH_ARGS set BATCH_ARGS=%BATCH_ARGS:^^=^% 
endlocal & Powershell -NoP -C "$input|&([ScriptBlock]::Create((${%~f0}|Out-String)))" %BATCH_ARGS%
exit/b
rem -------------------------------------------------------------------------------
: バッチコマンド(PowerShellコメント)終了 #>
param (
    [String]$Dir,
    [String]$Filter
)

Function find {
    param (
        [String]$Dir,
        [String]$Filter
    )
    if (-not $Dir)    { Write-Host "フォルダの指定がありません。" -Fore Red  ; Get-Help find; return }
    if (-not $Filter) { Write-Host "ファイルの指定がありません。" -Fore Red  ; Get-Help find; return }
    $global:ErrorView = "CategoryView"
    Get-ChildItem -Path $Dir -Filter $Filter -File -Recurse | %{ Write-Output $_.FullName }
    $global:ErrorView = "NormalView"
}

if (-not $Dir) {
    Write-Host "検索対象の最上位フォルダを指定してください。: " -NoNewline -Fore Green
    try { $Dir = (Read-Host).Trim() } catch [System.Exception] {}
}
if (-not $Filter) {
    Write-Host "検索対象のファイルを指定してください（ワイルドカード使用可）。: " -NoNewline -Fore Green
    try { $Filter = (Read-Host).Trim() } catch [System.Exception] {}
}
find $Dir $Filter
Write-Host
Write-Host "終了するには何かキーを押してください . . ." -Fore Green
$Host.UI.RawUI.FlushInputBuffer()
$Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyUp") | Out-Null
```
nginxでのメンテナンス画面表示

#環境

```
cat /etc/redhat-release 
CentOS Linux release 7.3.1611 (Core) 
```

```
nginx -v
nginx version: nginx/1.12.0
```

DocumentRoot

```/etc/nginx/conf.d/default.conf
~~

    location / {
        root   /var/www/html; 
        index  index.php index.html;
    }

~~
```

#やりたいこと
特定のIP以外はメンテナンスの画面表示にする

#1.メンテナンス画面の用意
まずはメンテナンス用の画面を用意する（今回は簡単なものにする）

```/var/www/html/maintenance.html
maintenance now!
```

#2./etc/nginx/conf.d/maintenance.confを用意する
ここの書き方がよくわからずに結構つまずいた。

```/etc/nginx/conf.d/maintenance.conf
server {
    server_name  example.com; 
    error_page 503 /maintenance.html; 
    location / {
	root /var/www/html; 
   if ($remote_addr != "画面表示したい特定IP(外部IP)") {
      return 503;
    }
   }
   location = /maintenance.html {
       root /var/www/html;
   }
}
```

#3.nginxのリスタート

```systemctl restart nginx```

これで特定IP以外はメンテナンスの画面を表示させることができた。

------------------------------
2017/07/08追記
[letsencryptでvpsをssl化した](http://qiita.com/bzy/items/98aa2c2ef6cbf014e11d)のでsslした時にもnginxをメンテナンスできるか設定をして見た
#4.httpsでのメンテナンス画面表示
最初に設定を入れる時は何も考えずに2. で用いたものが使えると思ったが間違い。

まず、https通信の時はhttp → httpsにリダイレクトさせているから。


```
httpのとき
http → 503 → /maintenance.html

設定ファイル
dev-example.conf :バーチャルホストの設定
maintenance.conf :メンテナンス表示の設定
```

```
httpsのとき
http → https → 503 → /maintenance.htlm

設定ファイル
dev-example.conf :バーチャルホストの設定
maintenance.conf :メンテナンス表示の設定→これだとうまくいかなかったのでdev-example.confに記載する
```
httpsではリダイレクトしたあとにメンテナンス画面を表示するようにさせる必要があるためsslの設定confにメンテナンスの記載をする。

[letsencryptでvpsをssl化した](http://qiita.com/bzy/items/98aa2c2ef6cbf014e11d)で設定したファイルを例にとると以下のように設定すればよい。

```dev-example.conf
geo $access_from {
    default        external;
    <画面表示したい特定IP(外部IP)> internal;
    <画面表示したい特定IP(外部IP)> internal;
  }

server {
    listen       80;
    server_name  <domain>;
    return 301 https://$host$request_uri; #リダイレクト設定
    }

server {
        listen 443 ssl;
    server_name  <domain>;

    ssl on;

        ssl_certificate       /etc/letsencrypt/live/<domain>/fullchain.pem;
        ssl_certificate_key   /etc/letsencrypt/live/<domain>/privkey.pem;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

~

    error_page 503 @maintenance;

    set $maintenance false;

    if (-e /var/www/html/maintenance.html) {#メンテナンスのhtmlが存在すれば
      set $maintenance true;
    }
    if ($access_from !~ external) {
      set $maintenance false;
    }
    if ($maintenance = true) {
      return 503;
    }

    location @maintenance {
      root /var/www/html;
      rewrite ^(.*)$ /maintenance.html break;
    }

}
```

/var/www/html/maintenance.htmlが存在する場合のみ発動させることが可能

```
mv /var/www/html/maintenance.html /var/www/html/maintenance.html_
mv /var/www/html/maintenance.html_ /var/www/html/maintenance.html
```

ngixの再起動を忘れない

```
systemctl restart nginx
```


参考
[Nginxでメンテナンスページに編集なしで即時切り替える方法](http://qiita.com/kotaroito/items/8b7d4b8ad6935edcdba8)
[if文の判定記号](https://wasabeef.jp/583/)
NativeScript CLIでよく使うコマンド一覧

コマンドをたまに忘れるのでまとめておきます。

(環境)
NativeScript 3.1

# 実機での動作確認・デバッグ

```tns run ios```
```tns run anrdoid```

# Chromeでデバッグ

```tns debug ios --chrome```
```tns debug android --chrome```

# エミュレーターで動作／デバッグ

```tns run ios```
```tns debug ios --simulator```

## 接続中のデバイス一覧を表示する

```tns device ios```

## 特定の端末上での動作確認
```tns run android --device <deviceId>```

<deviceId> は `adb devices` で表示されるデバイスIDを入れてください

# リリースビルド

```tns build ios --release --for-device```

# プラットフォームの入れ直し
全体を再ビルドしたい場合などに使います（リソースファイルを追加した場合等）

追加　```tns platform add ios```
削除　```tns platform remove ios```


# バージョン確認
```tns info```

# プラグインのインストール

(ローカル)
tns plugin install [pluginのフォルダへのパス]
NativeScriptのListViewで画像が表示されないときに確認したいこと

外部URLから画像を読み込んで表示する画像一覧をListViewで作ったら、iOSで画像が全く表示されない。
ちなみにAndroidでは全く問題なく表示される。

# 上手く動かないコード
(NativeScript 3.1.1 + Angular4 + TypeScript)

Image.src属性に item.image_path で指定されているURLをセットするというもの。

```xml:list.html
  <ListView>
    <ng-template let-item="item" let-i="index">
      <StackLayout>
        <Image src="{{ item.image_path }}"></Image>
      </StackLayout>
    </ng-template>
  </ListView>
```

※繰り返しますが、Androidではまったく問題なく動きます。

# 原因

iOSは、非同期で画像を読み込んだ時に画像のサイズを初期では 0 x 0 として扱うため
読み込まれても画面上は表示されていない。

ということで、

width, height を適切に設定することで問題なく表示されます。↓

```xml
<Image src="{{ item.image_path }}" width="320" height="320" stretch="aspectFill"></Image>
```

参考) https://github.com/NativeScript/NativeScript/issues/696



NativeScriptはネイティブコンポーネントをTypeScriptから使えるのが大きな特賞ですが、
iOS,AndroidのAPI、仕様の違いを知っていることが所々で重要になってきますね。
ただパフォーマンスの違いは圧倒的です。
Ionic3のVirtualListなど、DOMのリサイクルを行うようなパフォーマンス重視の部品とくらべても
比較にならないヌルヌル感。
一度体験してしまうと、もうハイブリッドWebViewアプリには戻れないと思う今日このごろです。