OmniAICreator/Qiita-1.07M huggingface dataset:
量子力学とは

初学者です。
主専攻ではございませんが、気ままに勉強を進めていければと思っております。
逐次更新をしつつ、ゴールは量子コンピュータってどう言う者なのかをきちんと理解できるようになりたいです。
色々な方のウェブサイト等を拝見しながらこちらにまとめをさせていただきますので、どうぞおつきあいをいただけますと幸甚です。

30分でわかる量子力学入門の世界
http://www.ryoushi-rikigaku.com/inside.html

#01■原子内部の法則
ものを色々なものの部品を結合をしてできている。
ものを分解していくと一番行き着く小さい単位が原子である。
しかし、実は原子も同じく小さいパーツに分かれている。
原子核と電子である。

> 原子より内側と外側には、全く異なる２つの世界があります。 この境目の壁はとても大きく、一方の常識は他方に通用しません。 当然、物理法則も全く違います。通常の物理学が通用しない、原子の内側の物理学が、量子力学です。

#02■文系にも量子力学
量子力学は「モノ」以外の存在を扱うこともできるような概念を構成している。
　つまり「モノ」以外の「状態の世界」のための科学という位置付けになる。
また、文系からも入りやすいように量子力学の重要な二つの数理的概念を紹介する。
作用素と固有状態である。

#03■作用素とは？
> 外から「入力」を受取り、それに何らかの規則的な変換を行って、結果を出力するようなものを「作用素」と呼びます。 

つまり、数学で言うところの関数であるとも言える。
F(x) = 2x と言う関数に対して、 x = 2 の入力をすると、この関数は、4を返す。

#04■固有状態とは？
> 炭酸水の炭酸水割りを作ると、結果は炭酸水です。 作用素は正しく機能しましたが、出力は入力と同じです。 作用した結果が作用する前と同じものであるとき、この入出力のことを固有状態といいます。 固有状態は作用素によって異なります。 その作用素に固有の（独特の）状態という意味で「固有状態」と呼ぶのです。

つまり、作用素で確認をしたように、入力に作用をして出力を生み出すと言う考え方に即すると、作用素が観測できない外側から色々な入力を試し、出力を観測することによって、作用素の「本質」を観測することも可能である。
※色々と調べたのですが、、うまい説明が書けず申し訳ございません。。。

#05■量子とは？
> 粒子性（物質の性質）と波動性（状態の性質）を併せ持つ、このような特殊な存在を、 普通の物質と区別するため、「量子」(quantum) と呼びます。
その「量子」を研究するのが「量子力学」です。　電子は「量子」の代表格です。
原子の内側にあるものは、「部品」ではなくて、「量子」です。
量子とは、単に「小さい」だけではなくて、原子より大きい世界に存在する「物質」とは振る舞いが異なります。 電子は「量子」なので、「電子１個だと水素、２個ならヘリウム・・」という、物質の世界では起こらないような現象が生じます。
電子は波のような「波動性」を持っています。ただし「何かの波」ではなくて「波だけ」です。 そこで、その波の形を調べよう、ということになります。
電子が、どのような形の波動になっているのか、それを数学の関数の形で記述したものを 「波動関数」と呼びます。

一旦立ち返ってみると、波とは、そもそも何かの物質ではなく、海水と言う「物質」の「状態」の一部であると言える。ただ、電子(量子)は、物質ではなく、それ自体が波状の状態を表している。

#06■波動方程式とは？
wikipedia参照 https://ja.wikipedia.org/wiki/%E6%B3%A2%E5%8B%95%E6%96%B9%E7%A8%8B%E5%BC%8F
> 波動方程式は振動、音、光、電磁波など振動・波動現象を記述するにあたって基本となる方程式である。

波動方程式、もとい、シュレディンガー方程式は、波動関数は固有状態になっていると言うことを示す方程式である。これまでの作用素と固有状態の部分も含めて、再度まとめると。
固有状態は本質を表す。固有状態である波動関数は電子(量子)の本質を表す。また、固有状態になれないような関数は電子の波動関数ではない。
よって一言で言うならば、「固有状態である波動関数を捜すのが量子力学の目的である。」と言える。

#07■ 因果関係を超えて
> 通常の因果関係は、「原因→法則→結果」の形式は、「入力→作用素→出力」と一致しています。

しかし、固有状態は上述のように、入力と出力が一緒になる。よってこれは「因果関係」を超えたものとなると考えられる。

#08■科学観の転換
> データを置く位置が違うだけではなくて、「計算式」が存在しないことも量子系の特徴です。 近代科学では、計算式（法則）を考え出すのは人間です。 量子系では、その必要がありません。 強いて言えば、作用素のデータの裏側に、見えない形で法則が存在しています。

文系にも大きなインパクトを及ぼす可能性がある。

#09■線形代数との深い関係
![Screen Shot 2018-03-19 at 23.19.27.png](https://qiita-image-store.s3.amazonaws.com/0/240801/2334b6d8-df0a-b17c-b548-5668b02d67ba.png)

行列の固有ベクトルは、行列の本質を「昇華された形」で表す。
Firebase の Hosting を利用してみる

Firebase の Hosting 機能を試したときのメモ

#全体の流れ
1. firebase-tools のセットアップ
2. 設定
3. デプロイ
4. ionic2 プロジェクトの場合

#firebase-tools のセットアップ
基本的には [Firebase Doc](https://firebase.google.com/docs/cli/?hl=ja)にある手順を実施する。
##Firebase CLIの追加
```
$ npm install -g firebase-tools
```

##Firebase にログイン
```
$ firebase login
```
ブラウザが立ち上がりログインを指示されるので利用するアカウントでログインする。

下記コマンドでプロジェクト一覧を確認できる

```
$ firebase list
```

##初期化
プロジェクトフォルダを作成し、初期化する

```
$ mkdir helloworld
$ cd helloworld
$
$ firebase init
```

どの機能でセットアップするか求められるので 「Hosting」 を選択

```
? Which Firebase CLI features do you want to setup for this folder? Press Space to select features, then Enter to confirm your
 choices. 
 ◯ Database: Deploy Firebase Realtime Database Rules
 ◯ Firestore: Deploy rules and create indexes for Firestore
 ◯ Functions: Configure and deploy Cloud Functions
❯◯ Hosting: Configure and deploy Firebase Hosting sites
 ◯ Storage: Deploy Cloud Storage security rules
```

「新規で作成」を選択する

```
❯ [create a new project] 
```

「firebase.json」が作成される

#設定
##firebase.json を編集
公開ディレクトリの指定(wwwとする)、デプロイ対象外ファイルの指定をする

```
firebase.json

{
  "hosting": {
    "public": "www",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ]
  }
}
```

##index.html を作成
index.html を作成し、「Hello World」を表示するようにする

```
$ mkdir www
$ vi index.html
```

#デプロイ
作成した html をデプロイする

```
$ firebase deploy

または

$ firebase deploy --project [Project ID]
```

デプロイが完了すると Hosting された URL が出力される

```
=== Deploying to 'xxxxxxxxxx'...

i  deploying hosting
i  hosting: preparing www directory for upload...
✔  hosting: 1 files uploaded successfully

✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/xxxxxxxxxx/overview
Hosting URL: https://xxxxxxxxxx.firebaseapp.com

```

ブラウザから URL にアクセスすると無事、HelloWorld が出力されました

#ionic2 プロジェクトのデプロイ
ionic2 のプロジェクトをデプロイしてみる

## index.html の修正
cordova.js の読み込みをコメントアウト

```
<!-- cordova.js required for cordova apps (remove if not needed) -->
<!-- <script src="cordova.js"></script> -->
```

## ionic2 プロジェクトをビルド
```
$ ionic build
```

ビルドの終了後、デプロイすれば反映されました
Nuxt.jsにStorybookを導入する

まさあき( @masaakikunsan )です。
最近、Nuxtを使う機会が増えて来てSPA開発のスピードが以前より上がりNuxtありがとうと感じています。
今の案件で、既存のサービスをNuxtで作り直しているのですが、Storybookを導入しようと思ったところそれに関する記事が一つぐらいしかなかったので、今回はNuxtにStorybookを導入する方法を紹介します。
まぁ普通に導入すればいいので記事がないだけだとは思うのですが...

# はじめに

この記事ではStorybookについてとNuxtについては取り扱いません。
参考資料にてStorybookとNuxtについてのオススメの記事を載せるのでそちらを読んでください。

## Nuxtのプロジェクトを作成する

まずはじめに、Nuxtのプロジェクトを作成しましょう。
今回はvue-cliを利用していきます。

```shell
$ vue init nuxt-community/starter-template my-project
```

これでNuxtのプロジェクトが作成されたので、試しにサーバーを立ち上げてみましょう。
今回はYarnでやっていきます

```shell
$ cd my-project
$ yarn
$ yarn dev
```
<img width="1680" alt="スクリーンショット 2018-03-19 17.57.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/186521/1638c7eb-719d-4255-fa86-434a2b8ea2a1.png">

成功しました。

## Storybookを導入する

Nuxtのプロジェクトが作成できたのでStorybookを導入し、Storybookの実行に必要なファイルを作成していきましょう。

```shell
$ yarn add @storybook/vue
$ mkdir .storybook
$ mkdir stories
$ touch .storybook/config.js
$ touch stories/index.js
```

Nuxtにstoriesディレクトリを追加するにあたりsrcがないのでどこに追加しようかと悩んだのですが、僕はルートディレクトリに追加することにしました。
理由としましてはcomponents配下を汚したくなかったからです。

これで、Storybookを触る為の下準備が終わったので実行する為の設定を行なっていきましょう。

コンポーネントを定義する為のconfig.jsを記述していきましょう。

```javascript:.storybook/config.js
import { configure } from '@storybook/vue'

const loadStories = () => {
  require("../stories/index")
}

configure(loadStories, module)
```

最後に、NPMスクリプトを作成してStorybookを実行できるようにします。
package.jsonにスクリプトを追加しましょう。

```json:package.json
"scripts": {
  "storybook": "start-storybook -p 9001"
}
```

これで準備は終了です。Storybookを実行して下記画像のようになれば成功です。

<img width="1680" alt="スクリーンショット 2018-03-19 18.12.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/186521/799d982c-a451-6263-a3af-361e661a98cc.png">

あとは、必要なコンポーネントやアドオンを追加してやればOKです。

## まとめ

NuxtにもStorybookが導入できました。
Storybookの話をしようとするとなにそれってエンジニアがまだ結構いるあたりそもそもStorybookの導入例もまだ少ないのではないでしょうか？
Storybookの導入することで社内のひとがデザインを容易に確認できるようになったり、認識の齟齬が生まれなくなったりするのでぜひ導入してほしいものです。

この記事でNuxtにStorybookを導入しようとして困る人が減れば幸いです

## 参考資料
- Nuxt.js
    - https://ja.nuxtjs.org/
- Nuxtのオススメの記事
    - https://html5experts.jp/potato4d/24346/
- Storybook(公式サイト)
  - https://storybook.js.org/
- Storybookのオススメの記事
    - https://qiita.com/masaakikunsan/items/dad8d84807918f3a43cb
- Using Storybook with Nuxt
    - https://davidwalsh.name/storybook-nuxt

# 追記

## 2018/03/19 19:20

@kazupon さんに指摘されて思い出したのですが、Storybookが提供しているCLIを使えばもっと簡単に実装できます

```shell
$ npm i -g @storybook/cli
$ cd my-project
$ getstorybook
```

状態的には上でやってることとほぼ同じになるはずなので好きな方法で実装してください。
なぜいま Heroku なのか

開発中のサービスに Heroku を採用した経緯を社内で周知するために書いた文章なんですが、ついでに Qiita にも貼っておきます（ちなみに Heroku の回し者ではないので悪しからず）。

- 従来、Heroku は日本で使うにはレイテンシの問題で本番環境での利用が避けられることが多かった
  - これは Heroku の Common Runtime には Tokyo region がなく US 等のサーバーと通信するとレイテンシが大きいため[^1]
  - 実際、Wantedly 社なんかもレイテンシを理由に Heroku から AWS に移行している
- だが、**Service Worker の先読みと Fastly（のような instant purge 可能な CDN）の登場により、このレイテンシの影響は極小化された** のではないか
  - 多くのリクエストは Fastly のエッジサーバー からレスポンスを返せるはず
  - また、Service Worker が先読みしていれば画面遷移も爆速
  -  実際に dev.to はこの組み合わせで Heroku にもかかわらず **insanely fast** を実現している
     - ref. [dev.toがなぜinsanely fastを実現出来ているか - Qiita](https://qiita.com/saboyutaka/items/1f528ec3ce85476d7561)
- 各社を見ていてもインフラエンジニアは慢性的に不足ぎみ
  - Heroku ならばインフラエンジニアの手をあまり借りなくても運用できそう
- こんなもん Heroku で十分だろってサービスに自前でインフラ構築して運用で苦労を買ってる事例をよく見かける
  - もちろん Heroku では無理な領域もある
     - 例えばリアルタイム対戦するゲームのサーバーサイドなんかは明らかに Heroku では無理
     - アドテクとか [50ms or die.](https://www.fout.co.jp/recruit/career_tech/) の世界で Heroku を使うのももちろん無理
  - でもウェブメディアとか Heroku で十分じゃない？
- インフラを学習することは重要なのでインフラを分かってない人が最初から Heroku 使うのは良くない
  - ひと通りのことを既に分かっている人が手を抜くために Heroku 使うのが良い
- また、Heroku で十分なものであっても k8s とか学習したくて敢えて自前で構築するのは良いんじゃないですかね
   - 新しい技術を学習するのは重要なこと
     - Too Much とか気にすんな
- Heroku Review App が神すぎる
  - Pull Request ごとに自動で確認環境を作ってくれる機能
      - Pull Request を merge/close すると勝手に削除される
      - デプロイした Review App へのリンクを bot が Pull Request に貼ってくれるのでコードレビューが捗る
    - Heroku Review App のためだけに開発環境に Heroku 使うっていうのもアリかも
    - Docker で同様の仕組みを自前で作ることも出来るけど結構大変そう

## 関連記事

- [部分SSR: SPAでSSRするけどサイドバーだけは非同期で取得したい - Qiita](https://qiita.com/ttanimichi/items/97a47584eca9d67d6032)
- [Fastly 前提で設計したほうがいい理由 - Qiita](https://qiita.com/ttanimichi/items/e430ee87d0fe2e81c9e1)

[^1]: ただ、レイテンシを理由に Heroku を選ばなかったというプロジェクトで、実際にレイテンシが問題になるほどパフォーマンスチューニングできているかと言うと僕の観測範囲では出来ている例をほとんど見たことがないです...
[Review] Noise Contrastive Estimation: a new estimation principle for unnormalised statistical models

Authors
Michael Gutmann, Aapo Hyv¨arinen
Dept of Computer Science and HIIT, University of Helsinki

Abstract

The idea is to perform nonlinear logistic regression to discriminate between the observed data and some artificially generated noise, using the model log-density function in the regression nonlinearity.
This leads to consistent estimator of the parameters.

Contrastive Divergence
最適化方法の一つ、正規化定数がわからない確率分布のためのパラメーター推定方法。
Score Matching
1. Finding: 
By minimising the expected squeared distance between the gradient of the log-density given by the model and the gradient of the observed data, we could estimate statistical models where the pdf is known only up to a multiplicative normalization constant.
2. Validation method
Demonstrating on Multivariate Gaussian and independent component analysis models, and by estimating an overcomplete filter set for natural image data.
Mac ノウハウ

# モニタ
VGAを写す場合の最適解は、ミラーリングして、解像度をあげること。
迷ったら、システム環境設定のモニタのところで設定を直す。ミラーリングのオプションを外す。

# ショートカットキー
Command+tab・・・アプリの切替
 
# Java環境のセットアップ
１：ここからJDKのDownload
http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.html
Java SE Development Kit 9.0.4（2018/3/19時点）のMacOS版をDL

２：インストールとその確認
dmgをダブルクリックでいい。いけてたらバージョンが出る。
$ java -version
java version "9.0.4"
Java(TM) SE Runtime Environment (build 9.0.4+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.4+11, mixed mode)

# kSarの使い方
１：Java環境をセットアップする
２：ここからzipファイルをDL(5.0.6)
https://sourceforge.net/projects/ksar/
３：インストール。zip解凍してjarファイルダブルリックでいい。
４：sarのバイナリデータは読み込めないので、テキストデータに変換する（これしないと読めないので注意！）
５：GUIは直感的に操作できる。以下は参考まで。
https://qiita.com/S-T/items/387635e90857e13832cc
http://d.hatena.ne.jp/japanrock_pg/20090415/1239795768
http://kumonchu.com/oss/sysstat-ksar-basic/

# Apache+PHPの環境をセットアップ
■バージョン
cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m

■環境構築
１：yum install httpd php
２：chkconfig httpd on
３：FWの設定変更。８０番ポートを開けておく。これはセキュリティグループから。
４：service httpd restart
5：http://IPアドレス　
　Apacheの画面が出ることを確認。
　これで環境構築は完了。追加で何かあった場合は、適宜追記。

■PHPの動作確認
・php -v
PHP 5.3.3 (cli) (built: Aug 11 2016 20:33:53) 
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies


・pwd
/var/www/html
配下に、phpinfo.phpを作って動作確認。

-phpinfo.php
<?php
phpinfo();
?>

・error log の出力先

・セッションの場所
var/lib/php/session

・php5.3を７にアップデート
http://qiita.com/ozawan/items/caf6e7ddec7c6b31f01e

・練習用によさそうなサイト
http://www.1x1.jp/blog/2010/01/php-basic-syntax.html
http://www.standpower.com/
http://bashalog.c-brains.jp/08/04/07-144033.php
http://www.php-matome.com/
http://webkaru.net/php/
https://syncer.jp/how-to-use-json
http://qiita.com/busyoumono99/items/9b5ffd35dd521bafce47

・ログイン画面を作ってみよう
http://d.hatena.ne.jp/replication/20100828/1282994791

・curlでリクエスト
 例文
http://takuya-1st.hatenablog.jp/entry/2014/07/27/093053
 curl_setopt_array()を使う例
http://tips.recatnap.info/wiki/PHP%E3%81%A7UA%E8%A9%90%E7%A7%B0%EF%BC%88curl%EF%BC%89

・php+MySQL+apache
http://www.atmarkit.co.jp/ait/articles/0701/27/news017_3.html
http://opensourcetech.hatenablog.jp/entry/2015/02/27/LAMP%E7%92%B0%E5%A2%83_%28Linux_%2B_Apache_%2B_MySQL_%2B_PHP%29%E3%81%AE%E6%A7%8B%E7%AF%89_on_CentOS_6_6

・Macでやる場合。ディレクトリの場所とか。
https://qiita.com/shuntaro_tamura/items/bdabcb77926dc92617b1
https://qiita.com/masahirok_jp/items/c4f0d8bb5f55a114e31b
作ったディレクトリの配下にindexファイル置かないとエラーになって、うまくいってないように見えるので注意。

・GUIで値を受けるだけ
http://d.hatena.ne.jp/osamuchan05/20131102
python3 openpyxl でエクセルに行挿入する

仕事でopenpyxl を使い始め、行挿入の方法を探していたが以前のバージョンではどうやら実装されておらず
ブックコピー時に挿入する方法しか検索できなかったが、2.5.0から追加された模様（歓喜

ググっても公式以外に記載が見つからなかった。

■A Python library to read/write Excel 2010 xlsx/xlsm files
http://openpyxl.readthedocs.io/en/stable/search.html?q=insert+rows&check_keywords=yes&area=default

2.5.0 (2018-01-24) (from project openpyxl)
styles with custom names Major Changes You can now insert and delete rows and columns in worksheets

■インストール

```py3
pip3 install openpyxl -t .
```

■行挿入

```py3
import openpyxl

#エクセルファイル
XLSFile="C:\\temp\\なんとかエクセルファイル.xlsx"

#ファイルオープン
wb = openpyxl.load_workbook(XLSFile)

#シート名'template'取得
ws_template = wb["template"]

#挿入行数（10行目に挿入)
SheetRowNo=10

#行挿入
ws.insert_rows(SheetRowNo)

#ファイル保存
wb.save(XLSFile)
```

■備考
エクセルに =Sum(A1:B1)　等の計算マクロが入っている場合、自動的に対象の列行修正は行われないのが難点。

例）セルA1に「100」A2に「200」A3に「=Sum(A1:A2)」が入ってるエクセルに対し、
通常エクセルで２行目に行挿入を行った場合、A4に移動したマクロは「=Sum(A1:A3)」と自動的に変わるが
上記にて2行目に行挿入( ws.insert_rows(2) )を行った場合、「=Sum(A1:A2)」のまま変わらない。
ペッパーが任意の言葉を認識するためのダイアログトピックの使い方

##概要

pepperはSpeech Recoボックスを使えば指定した言葉を聞き取らせることができる。しかし、それでは想定外の言葉が来たときには何も出来ない。簡単な挨拶ならそれでいいかもしれないが、例えば、Google Cloud PlatformのNatural Language APIとペッパーを連携して、通りかかった人の言葉から感情分析を行おうとした場合、通行人がどのような発言をしたとしても、それをペッパーが認識できる必要がある。

この機能を実装する方法として、同じくGCPのSpeechAPIを活用する方法があるが、実はpepper自身に備わっている機能を使っても、同じことが出来るのだ。今回はその方法を紹介したいと思う。

##人間が喋った言葉をおうむ返しするペッパー
ダイアログトピックを作り、下図のようにすることで、人間が喋った内容をおうむ返しするペッパーの完成だ。

<img width="768" alt="スクリーンショット 2018-03-19 17.37.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/216172/85b6a345-5425-579d-c33b-cda2fe9c47c5.png">

このようにすることで、どのような言葉をかけても、それを聞き取ってそのまま同じことを反芻してくれる。

これで任意の言葉をペッパーが認識できるようになった。

##認識した言葉を他のボックスに渡す
ペッパーが認識した言葉を他のボックスに渡すことで、応用の幅が広がる。これは下図のようにダイアログボックスに新しく出力を追加すれば良い。今回はoutput1という出力を追加した。それに対応させて、.topファイルの方も書き換えてあげよう。

<img width="768" alt="スクリーンショット 2018-03-19 17.47.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/216172/e404bf3a-0ec5-6599-9983-49bef2f97299.png">


##まとめ
想定しうる言葉だけでなく、任意の言葉を聞き取れるようになることで、より高度な会話や文章認識が可能になる。それに外部APIなど特別なものを使わないでも、pepper自身にこの機能があるのは大変ありがたい。


by アトリエスタッフ
[Review] Deep Reinforcement Learning for goal-oriented dialogues

Objectives: to develop intelligent agent to help users effectively accomplish tasks via natural language conversation.
What makes them special: they choose DRL approaches for dialogue management in goal oriented dialogue system.

Basic Components
1. User simulator
https://arxiv.org/pdf/1612.05688.pdf
2. Infobot
https://www.microsoft.com/en-us/research/publication/end-end-lstm-based-dialog-control-optimized-supervised-reinforcement-learning/
https://www.microsoft.com/en-us/research/publication/towards-end-end-reinforcement-learning-dialogue-agents-information-access/
3. Task Completion Bot
https://www.microsoft.com/en-us/research/publication/end-end-task-completion-neural-dialogue-systems/
https://arxiv.org/abs/1608.05081
https://www.microsoft.com/en-us/research/publication/sample-efficient-deep-reinforcement-learning-dialog-control/
4. Composite Task-completion Bot
https://www.microsoft.com/en-us/research/publication/composite-task-completion-dialogue-system-via-hierarchical-deep-reinforcement-learning/
疑問リスト

ここに書いていく。解決したら解決方法も追記。

なので随時更新予定。


#疑問リスト
１、 Vagrantの文字が小さいので大きくしたい。変更できるのかどうか。

２、なぜかこの中にこれがないよって言われちゃう（バージョンはkivy 1.10.0）

```python
from kivy.properties import StringProperty #これかくと以下のエラーが出る

message: 'E0611:No name 'StringProperty' in module 'kivy.properties''

#対処(？) import kivy.propertiesなら怒られない・・

'''
kivy 1.10.0
VScode: 1.21.1

拡張機能
↓
kivy: 0.2.0
KvLang: 0.0.2

'''

```

３、kivyのKv言語の複数の個別化？　（解決済み）

```python:test.kv
<TextInput>:
    multiline: False
    write_tab: False

```
文頭にこんな書き方をすれば対象のwiget(ここではTextInput)にその機能を持たせてくれるが
BoxLayoutを複数使った場合BoxLayoutそれぞれにidを付けて個別に設定できるのか？

解決策：

```python:test.kv

'''

書き方：
<サブwidget名@親widget名>
'''

<PaddingBoxLayout@BoxLayout>

'''
これを当てはめると
PaddingBoxLayoutがサブwidgetになるので
設定を変えたいところのBoxLayoutをPaddingBoxLayoutに書き換える

'''

```

# kivyでボタンをクリックしたときに　画像をフェードインさせてそのあとフェードアウトさせたい

色々調べてるけどまだ未解決
[Review] A User Simulator for Task-Completion Dialogues

Link
https://arxiv.org/pdf/1612.05688.pdf

Authors
Xiujun Li Zachary C.Lipton Bhuwan Dhingra
Lihong Li Jianfeng Gao Yun-Nung Chen

## Agenda

1. Introduction
    1. Why is user simulation needed?
    2. Related Work
2. Dialogue System for Task-Completion
3. User Simulator
    1. User Goal
    2. User Action
    3. Dialogue Status
    4. Natural Language Understanding
    5. Natural Language Generation
4. Usages
5. Discussion

## **Contents**
## 1.1 Why is user simulator needed?
RL(Reinforcement Learning) vs SL(Supervised Learning)
SL: just impersonating the observed actions, requires large amount of data
RL: allowing an agent to learn through interaction with users(simulator)

Goal of User Simulator is to commit to natural and reasonable conversations for RL agents to interact and learn from it.

## 1.2 Related Work
There are some research before, but none of them could achieve to propose universal criteria for evaluation of good user simulator.
In this, paper, they proposed novel approach, which is combination of rule based and model based approaches.
Historically speaking, probabilistic approaches was popular in this domain.
$P(a_u|a_m)$ : Naive bi-gram model to predict the next user-act($a_u$) based on the last system action($a_m$).

Issue: 
(1) model is able to only look one step 
(2) model is not able to keep up with the change of users' goal during conversations

But this probabilistic approach has been followed by many researchers to tackle the issues above.
(1) Looking at longer dialogue histories
(2) Explicitly incorporating the user goal into user state modeling
But most of them are certainly requiring huge data...

Hence, Agenda-based approach is helpful.
=> User goal consists of slot-value pairs describing user's request and constraints.

## 2. Dialogue Systems for Task-Completion
Test case: Movie ticket booking and movie seeking
Test criteria: check (1) whether a movie is booked (2) whether the booked movie satisfies user's request.
Data: 
11 intents(i.e., inform, request, confirm_question, confirm_answer, etc.)
29 slots(i.e., moviename, starttime, theater, numberofpeople, etc.)

![Screen Shot 2018-03-20 at 10.13.41.png](https://qiita-image-store.s3.amazonaws.com/0/240801/7942fc52-5c13-590d-33aa-cd7047fc120d.png)

## 3. User Simulator
## 3.1 User Goal
First step for creating the user simulator is setting user goal consisting two components.

1. inform_slots: containing a number of slot value pairs as users' constraints
2. request_slots: containing a set of slots that user has no information about the values, but wants to get the values from the agent side during the conversation

# check this Research paper Later
https://deepage.net/machine_learning/2017/07/06/beam-search.html
Thinkpad E450 で電源オフ時Wake on Lan(WOL)が動作しないときの確認事項

## 前提
自分で設定していたときにちょっと躓いたのでメモ代わりに
スリープモード・休止状態からのWOLには成功していること（そこまで出来ていない人はwake on lan等で検索して調べてみてください)
パソコンがお使いのルーターと有線で接続されている
OSはWinows10(64bit)です

## Windowsの設定
まずデバイスマネージャーから「Intel(R) Ethernet Connection」的なものを探します。
見つけたらとりあえずドライバーの更新を実行。一度パソコンを再起動します。
こうすることで私の環境ではドライバーがアップデートされ設定項目が追加されていました。

再起動が終わったら再度デバイスマネージャーを開き、「Intel(R) Ethernet Connection」のプロパティ -> 詳細設定を開きます。
チェックする項目は

- [ ] PME をオンにする　　  　→　有効
- [ ] Wake on Magic Packet　 →　有効
- [ ] **省電力イーサネット　 　   →　オフ**

の三つです。
特に電源オフからの立ち上げの場合のみWOLが動作しない場合は三番目の省電力イーサネットがオンになっている可能性が高いです（自分がそうでした）。

あとは一応、電源の管理 タブで

- [x] 電力の節約のために、コンピューターでこのデバイスの電源をオフにできるようにする
- [x] このデバイスで、コンピューターのスタンバイ状態を解除できるようにする
    - [x] Magic Packetでのみ、コンピューターのスタンバイ状態を解除できるようにする
    
の三つにチェックが入っているかを確認して閉じます。

そうしたら今度はWindowsメニューから
設定 -> システム -> 電源とスリープ -> 電源の追加設定
とクリックし、表示されたウィンドウの左側のメニューから
電源ボタンの動作の選択 -> 高速スタートアップを有効にする(推奨)
のチェックを外しておきます（グレーアウトして触れないときは少し上の「現在利用可能ではない設定を変更します」を選択）。

## BIOSの設定
BIOSを開いたら Network の項目を見つけ、その中の Wake On Lan を探して値をAC and Batteryにしておきます。


おそらくこれで動作するはずです。
正常に動作している場合、シャットダウン後もLAN端子のランプが点灯しているはずですので目安にしてください。

## 追記
#### 起動後に「 >> Start PXE over IPv4 」と表示されOSが起動しないとき
BIOSを開いたら Network の項目を見つけ、「UEFI IPv4 Network Stack」「UEFI IPv6 Network Stack」の項目をdisabledにします。
その後、ブートメニューからPCI LANを削除(項目を選択して「！」を打つ)しておきます。


以上です。
Qiitaへの初投稿となりますので拙い部分はご容赦ください。
Nuxt.jsでCSPを有効にする

# CSPとは
Content Security Policyの略
ブラウザ側でポリシーに従って読み込みリソースや実行するスクリプトを制限することができる機能です。

nuxtでもCSPのサポートがされているけど、nuxtのドキュメントに載ってなかったのでとりあえずメモ

# nuxt.config.jsの設定

```js:nuxt.config.js
const isDev = process.env.NODE_ENV !== 'production'

module.exports = {
    render: {
        csp: {
            enabled: !isDev,
            policies: {
                'default-src': ['self'],
                'script-src': [
                    'https://www.google-analytics.com',
                ],
                'child-src': [
                    'https://www.youtube.com',
                ],
                'report-to': ['/report']
            }
        }
    }
}
```

ポリシーについては[Mozillaのドキュメント](https://developer.mozilla.org/ja/docs/Web/HTTP/CSP)を見てみてください
rippleの勝手に用語集

ビットコインとの比較を主目的においた用語集
ビットコインを勉強した人はリップルは差分だけ勉強すればだいたいOK

# 台帳(Ledger)

ビットコインにおけるブロックチェーンのようなもの。
ブロックチェーンとの違いは

* 各ノードは台帳を全て持つ必要がない。
* ブロックチェーンは古いデータから同期するが台帳は新しいデータから同期する。
* 残高などスナップショットを保管している
* アドレスごとにバリデータに指示を与える状態を持つ
* 確実なファイナリティを持つ

# バリデータ

ビットコインにおけるマイナーのようなもの。
マイナーとの違いは

* 手数料を受け取らない
* 新規XRPを発行しない
* 事実上Ripple社に許可を得たノードだけがバリデータとして参加できる（ripple社にノードの公開鍵を登録してもらう必要がある）
* トランザクションを失敗させられる

# シークレットキー(Secret Key)

sから始まる鍵でリップルのエコシステムにおいて
残高やトラストラインを操作するときに必要な鍵

ビットコインとキーの位置を比較するならbip32におけるマスターシードに相当する（互換性はない）

# 公開鍵（Public Key）／秘密鍵（Private Key）

公開鍵と秘密鍵で通常の利用では表に現れません
シークレットキーから生成される
シークレットキー(Secret Key)と秘密鍵（Private Key）はとても混同しやすいので気をつける

楕円曲線パラメータのsecp256k1を利用
ビットコインとの違いはありません。

# リップルアドレス

rから始まるユーザーの残高が保管されているアドレス
公開鍵から生成される

ビットコインのp2pkhとほぼ同じアルゴリズムで生成される（base58へのエンコードテーブルが違うだけ）

# トランザクション

リップルのトランザクションはアカウント方式と呼ばれる仕組みを採用しているので
UTXOは仕組みとして存在しない

トランザクションIDは存在しているのでそのIDを用いて台帳から参照することはできる（過去の台帳を持っていないノードもいるのでその場合はエラーになる）

アカウント方式は通常、宛先と金額を指定して送金する
その場合同じトランザクションを二回連続して別々のノードに対してブロードキャストした場合に区別ができず二回支払われる問題が起きるのでそれを防ぐためにシーケンス番号という連番をトランザクションに含めて同じシーケンス番号は無視することで対処される
bitcoinの場合はUTXOのTXID,VOUTを指定することでそれを防いでいる。

# 宛先タグ(Destination Tag)

振込人を特定するための識別番号

例えば集合住宅に郵送するときに届けるときに使う部屋番号のようなもの。
間違ったり忘れたりすると誰が送ったのか送り主が不明になります。

ビットコインにおいてはアドレスを新しく発行することで解決しているがリップルではアドレスの新規発行にコストが掛かるので宛先タグで解決するのが一般的だ。

# 準備金(Reserve)

台帳に各種状態を保存するのに使う担保
担保なので状態を取り除くと返却される
状態ごとに料金が異なる

* リップルアドレスをアカウントとして認識させるのに固定値(20XRP)（現在解除できない）
* トラストラインでゲートウェイを設定する毎に増加(数量*5XRP)
* 内部取引所内で指値注文を出す毎に増加(数量*5XRP)
* マルチサインの鍵を登録するごとに増加(30XRP〜100XRP)

# マルチサイン(Multi-Sign)

ビットコインのマルチシグのようなもの
ビットコインではアドレス生成前に決定され公開鍵がロッキングスクリプトに組み込まれマイナーがアンロックスクリプトを検証することで機能する。
リップルではアドレス生成後にリップルアドレスを台帳に登録し、その秘密鍵の署名がバリデータに承認されることによって機能する

# IOU

トークン発行機能。現在は積極的に利用を推奨していないようだ。
トークン発行にかかるコストはほぼゼロである。（トークン利用者にコストは転換される）
発行量はロックすることができない
発行後に移動を制限することが出来る
マイナス金利を設定することが可能
リップル内の分散取引所(DEX)でXRPと交換できる

ビットコインのカウンターパーティとよく似た特性を持っているが最大の違いはトラストラインと言う相手を信用する機能があり発行元を信用しなければトークンを受け取る事ができない（第三者に渡すことができない）
すなわちバラマキや投げ銭には向かない。

# amendment

投票で事前にネットワークで合意を確認するため新機能を入れたことによるネットワークの分岐を防ぐしくみ
投票開始後、二週間でバリデータの80％以上合意が取れると新機能が採用される
ビットコインのBIP9（segwitを有効にするのに使った機能で有名）に近い
SoftEther_VPN の設定の削除方法

こちらで行った設定の削除方法です。
[SoftEther_VPN の vpncmd の使い方](https://qiita.com/ekzemplaro/items/47f2d1b88f80e01b403d)

クライアントの設定の削除

```bash
vpncmd /client
```
>アカウントを切り離します。

```text
VPN Client>AccountDisconnect tun0
AccountDisconnect command - Disconnect VPN Connection Setting During Connection
The command completed successfully.
```

>アカウントを削除します。

```text
VPN Client>AccountDelete tun0
AccountDelete command - Delete VPN Connection Setting
The command completed successfully.
```

>NIC を無効にします。

```text
VPN Client>NicDisable tun0
NicDisable command - Disable Virtual Network Adapter
The command completed successfully.
```

>NIC を削除します。

```text
VPN Client>NicDelete tun0
NicDelete command - Delete Virtual Network Adapter
The command completed successfully.
```

スクリプトにするとこうなります。

```bash:vpn_delete.sh
#
#       vpn_delete.sh
#
#                                       Dec/13/2019
#
VPNCMD='/opt/vpnclient/vpncmd /client localhost'
#
$VPNCMD /cmd AccountDisconnect tun0
$VPNCMD /cmd AccountDelete tun0
#
$VPNCMD /cmd NicDisable tun0
$VPNCMD /cmd NicDelete tun0
#
#
```


----------------------------------------------------------------------


サーバーの設定の削除

```bash
vpncmd /server
```
>HUB の選択

```text
VPN Server>Hub Default
Hub command - Select Virtual Hub to Manage
The Virtual Hub "DEFAULT" has been selected.
The command completed successfully.
```

>ユーザーの削除

```text
VPN Server/DEFAULT>UserDelete scott
UserDelete command - Delete User
The command completed successfully.
```
Azureで簡易APIを作る時のsocket.error

サクッと行くと思ってたところ、
ちょっとハマったのでメモ。
簡易APIを作ろうとしてたところ、下記のエラーが出て困ってた。


```py:sample.py
# -*- coding:utf-8 -*-
import json
import falcon

class HelloResource(object):
    # getされた時の動作
    def on_get(self, req, res):
        msg = {
            "message": "Welcome to the Falcon"
        }
        res.body = json.dumps(msg)
app = falcon.API()
app.add_route("/", HelloResource())

if __name__ == "__main__":
    from wsgiref import simple_server
    httpd = simple_server.make_server("104.215.000.000", 8080, app)
    httpd.serve_forever()
                          
```


```
Traceback (most recent call last):
  File "sample.py", line 17, in <module>
    httpd = simple_server.make_server("104.215.000.000", 8080, app)
  File "/usr/lib/python2.7/wsgiref/simple_server.py", line 151, in make_server
    server = server_class((host, port), handler_class)
  File "/usr/lib/python2.7/SocketServer.py", line 417, in __init__
    self.server_bind()
  File "/usr/lib/python2.7/wsgiref/simple_server.py", line 48, in server_bind
    HTTPServer.server_bind(self)
  File "/usr/lib/python2.7/BaseHTTPServer.py", line 108, in server_bind
    SocketServer.TCPServer.server_bind(self)
  File "/usr/lib/python2.7/SocketServer.py", line 431, in server_bind
    self.socket.bind(self.server_address)
  File "/usr/lib/python2.7/socket.py", line 228, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 99] Cannot assign requested address
```

他のサーバーやと通るのにazureで通らないぞ。。。


#portを開ける

どうせポートが空いてないんじゃないと思って、
この辺を見ながらポートを開ける。
http://www.rarpa.net/?p=5422

#bindする？

これを叩いたら見事動いた。

```
gunicorn sample:app --bind 0.0.0.0:8080
```


http://104.215.000.000:8080/

```
{"message": "Welcome to the Falcon"}
```

iptableかなんかでローカルのどっかでフィルターかかっちゃってるのかな。。。
後々調べようと思う。
一旦は動いた。

参考
https://stackoverflow.com/questions/29345898/invalid-address-when-startup-gunicorn
https://stackoverflow.com/questions/20858844/using-gunicorn-to-run-app-error/34567435
Resolve Tomcat Startup Pending

Once, Tomcat 8 pending on starting-up and the last log in catalina.out is like 

```
... [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory ...
```

Is is commonly due to Java Security Setting.

Find `[JDK/JRE Path]/jre/lib/security/java.security`, 
modify option `securerandom.source` to 

```
securerandom.source=file:/dev/urandom
```

Now pending is no longer there.
Link > linux command > watch > 複雑なものは"で囲む | watch -d 状態変化の表示

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
GeForce GT 730 1GB GDDR5
CentOS 6.9 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(2)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
watch v0.2.0
```

### 複雑なコマンド

パイプを使ったコマンド`ls -lh | grep -v 18M`などをwatchで定期的に実行したい。
以下ではエラーとなりました。

```bash
$ watch -d -n 5 (ls -lh | grep -v 18M)
-bash: syntax error near unexpected token `('
```

### link

@asahina_dev さんの[コメント](https://qiita.com/tukiyo3/items/c19bfb9205222909a96b#comment-9f72259af656ffea3026) @ [watchコマンドに満足できなかったのでwatcherコマンド作った。](https://qiita.com/tukiyo3/items/c19bfb9205222909a96b) by @tukiyo3 さん

情報感謝です。

コメントを参考にwatchで実行できました。
下記では18MBのファイル取得に失敗したファイルがリスト表示されます。

```bash
$ watch -n 5 "ls -lh | grep -v 18M"
(ターミナル画面全部を使って)
Every 5.0s: ls -lh | grep -v 18M                        Mon Mar 19 17:24:29 2018

total 2.1G
-rw-r--r-- 1 wrf wrf  15M Mar 19 17:19 fnl_20171111_12_00.grib2
-rw-r--r-- 1 wrf wrf 3.3M Mar 19 16:03 fnl_20171112_06_00.grib2
-rw-r--r-- 1 wrf wrf 3.3M Mar 19 17:08 fnl_20171115_18_00.grib2
-rw-r--r-- 1 wrf wrf    0 Mar 19 17:07 fnl_20171117_06_00.grib2
-rw-r--r-- 1 wrf wrf  15M Mar 19 16:35 fnl_20171123_06_00.grib2
```

### watch -d

[watchコマンドでディレクトリを目視監視](https://qiita.com/okisanjp/items/d4e742da1992298be9f1) by @okisanjp さん
> -d：状態変化の際に変化した部分がハイライトされる

情報感謝です。

`-d`オプションで変化が分かりやすくなりました。

実際の用途では、Globusという転送サービスを使用して、ファイル転送されていく状況（ファイルサイズが増える）が分かりやすくなりました。

### 余談

```bash
$ watch --version
0.2.0
```

バージョンは0.2.0のようです。v0.2.0で完成しているのでしょう。

v1.0.0にした途端にバグが見つかるという状況を考慮してv0.2.0のままなのかもしれない。

### explainshell.com

explainshell.comのwatchのヘルプでは`-d`の説明が表示されない。

https://explainshell.com/explain?cmd=watch+-d

元になる[man page](http://manpages.ubuntu.com/manpages/precise/en/man1/watch.1.html)には記載はある。
作者に連絡しておいた。
XAMPPでphalconを少し使ってみる


phalconをインストールして、XAMPPとひもづけた状態になっていることが前提です。
(XAMPPのapacheを起動して、localhostに行き、phpinfoで「phalcon」を検索して出てきたらオーケー)


#ファイル構造を自力で作る
tutorialはXAMPPのhtdocsの中に作ったほうがいいと思います。多分。

```
tutorial/
  app/
    controllers/
    models/
    views/
  public/
    css/
    img/
    js/
```

#少し設定をする
.accessファイルを作ります。

```tutorial/.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule  ^$ public/    [L]
    RewriteRule  ((?s).*) public/$1 [L]
</IfModule>
```
もう一つ.accessファイルを作ります(場所に注意してください)

```tutorial/public/.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^((?s).*)$ index.php?_url=/$1 [QSA,L]
</IfModule>
```


あとは、これ通りにやったらオッケーです
[チュートリアル 1: 例題で学習しよう](http://phalcon-docs-ja.readthedocs.io/ja/stable/reference/tutorial.html
)
Flutter でネイティブ画面から戻った直後に Navigator を使うと固まる？

Flutter でアプリを開発していて、プラットフォーム・ネイティブの画面を使うことがあります。たとえば画像ピッカーだったり、WebViewだったり、Twitterなどのソーシャル連携だったりです。

ネイティブの画面から戻ったあとで、その結果を使って何らかの画面遷移をしたい場合がありますが、即座に `Navigator` を操作すると、問題が発生することがあります。

https://github.com/flutter/flutter/issues/13818

Issue にあるように、以下のようなワークアラウンドで回避することができます。

```dart
var imageFile = await ImagePicker.pickImage();
await new Future.delayed(new Duration(milliseconds: 100));
Navigator.of(...).push(...)
```

----

なお、時間を待つ実装がダサくて嫌だという場合は `WidgetsBindingObserver` を使って、Flutter 画面が前面にいる `AppLifecycleState.resumed` 状態になることを待ってから遷移すれば OK です。

いわゆる「処理中」のダイアログの表示で、その処理がアプリがバックグラウンドにいる間に終わると、上記の Issue に関連してダイアログが閉じないという問題に遭遇したのでライブラリを作りました。

https://github.com/najeira/flutter-packages/tree/master/dialog

ダイアログについてはこのライブラリを利用できます。ダイアログ以外の画面遷移では、これの内部の実装を参考に `WidgetsBindingObserver` を使って状態待ちすればいけると思います。
多対多の更新の時でもelasticsearchにindex登録する

ツッコミとか欲しいのでメモ。

elasticsearch-modelを使っている前提で、記事(Article)モデルとタグ(Tag)モデルがあったとする。
記事にタグを紐づける時

```ruby
article.tag_ids = [1,2,3]
```

とやっていた場合,ArticleTagモデルで設定したafter_commitは削除時には実行されない。

```ruby
after_commit on: [:destroy] do
  # 実行されない
  article.__elasticsearch__.delete_document
  article.__elasticsearch__.index_document
end
```

紐づける時、`tag_ids = [1,2,3]`を使わなければいいだけだけどそうもいかない場合、

```ruby
class Article < ApplicationRecord
  def tag_ids(ids = [])
    super(ids)
    __elasticsearch__.delete_document
    __elasticsearch__.index_document
  end
end
```

上記のように書くことでなんとなくやりたいことができた。

concernとかに切り出して、`tag`のところを引数にいい感じのメソッド書けば`hoge_ids`が増えても対応できそう。
ただ何回もindex登録しまくるのでもっといい方法を探したいところ。
Python seleniumのsend_keysで出たエラーの対処方法

## エラー内容

seleniumのsend_keysで下記エラーが発生

```bash
selenium.common.exceptions.WebDriverException: Message: unknown error: call function result missing ‘value’
 (Session info: headless chrome=65.0.3325.162)
 (Driver info: chromedriver=2.33.506106 (8a06c39c4582fbfbab6966dbb1c38a9173bfb1a2),platform=Mac OS X 10.13.3 x86_64)
```

## 解決方法

chromedriverをバージョンアップ

### 手順

[ChromeDriver - WebDriver for Chrome](https://sites.google.com/a/chromium.org/chromedriver/downloads)から最新のchromedriver.zipをダウンロード&解凍。
解凍したファイルを`/usr/local/bin`以下に配置して完了

### コマンド

```bash
$ curl -O https://chromedriver.storage.googleapis.com/2.37/chromedriver_mac64.zip
$ unzip chromedriver_mac64.zip
$ mv chromedriver /usr/local/bin/
$ rm -rf chromedriver_mac64.zip
```
硬貨の問題が貪欲法で解けるための条件

# 硬貨の問題とは
A円支払うために必要な硬貨の枚数を最小にする組み合わせを求める問題。
コインの問題、お釣り生成問題（Change-Making Problem : CMP）、とも呼ばれる。

この問題は競技プログラミング等で貪欲法を用いて解かれることが多いですが、貪欲法で最適解が求まることは自明ではありません。

# 貪欲法で解ける場合
例えば、日本の通貨体系（1円、5円、10円、...）では、価値の大きい硬貨から順に使っていく貪欲法で最適解を求めることができます。

# 貪欲法で解けない場合
仮に日本の通貨に新しく8円硬貨が追加されたとします。
16円を支払うとき、貪欲法で考えると、10円、5円、1円の3枚の硬貨で支払うことになります。
しかし、明らかにこれは最適ではなく、8円硬貨2枚で支払ったほうが硬貨が少なく済みます。

# 貪欲法で解ける条件は？
硬貨の問題は整数ナップサック問題の特殊型であり、整数ナップサック問題が貪欲法で解けるための条件がそのまま適用できます。
硬貨の問題に限定した条件は以下のようになります。

硬貨を小さい順に

```math
a_1, a_2, \cdots , a_n
```

と並べたとき、ある$j$（$1\leq j \leq n-1$）について

```math
a_{j+1}=pa_j-\delta
```

となる$p$と$\delta$（$0 \leq \delta < a_j$）は一意に定まります（割り算の商と余りの式に近い感じです）。
その$p$と$\delta$に対し、

```math
H(\delta)\leq p-1
```

が全ての$j$について成り立つことが条件です。
ただし、$H(x)$は$x$円を支払う場合に貪欲法を用いて求めた最小の硬貨の枚数とします。

この証明が気になる方は下の参考文献から論文を辿ってみてください。

## 適用してみる
まず、$a_{j+1}$が$a_j$で割り切れる場合を考えます（日本の通貨体系では2000円札を除き、これが当てはまります）。
このとき、明らかに$\delta=0$、$H(0)=0$で、$p$は1以上となることから、常に条件が成立します。

次に、硬貨が1円、5円、8円、10円だった場合について確認してみます。
$a_j=8$、$a_{j+1}=10$とすると、$p=2$、$\delta=6$と定まり、

```math
H(\delta)=H(6)=2>1=p-1
```

と、条件が成立しないことが分かります。

# まとめ
「隣り合う硬貨が割り切れる関係なら貪欲法でオッケー」くらいのことを覚えていれば競技プログラミング等でも役に立つのではないでしょうか。
あとは日本の通貨なら貪欲法でオッケー、とか。

ただし、隣り合う硬貨が割り切れる関係でないからといって貪欲法が使えないわけではありません。
例えば2000円札と5000円札は割り切れる関係にはありませんが、上の条件を適用してみると貪欲法でオッケーであることが分かると思います。

# 参考文献
[飯田浩志. 整数ナップサック問題が多項式時間で解ける特殊な場合を定める条件について.](https://barrel.repo.nii.ac.jp/index.php?action=pages_view_main&active_action=repository_action_common_download&item_id=3664&item_no=1&attribute_id=21&file_no=1&page_id=13&block_id=135)
Javascriptのクリック系イベントの発動順序まとめ

Javascriptでonclickやonblur等の発動順序をまとめます。
細かいことのようですが、覚えて置くと意外と役に立ちます。

## 結論
下記のような順序で発動します。

|順番|イベント名|
|:--|:--|
|1|onmousedown|
|2|onblur|
|3|onmouseup|
|4|onclick|


## 例
例えば、テキストフィールドでメールアドレスサジェストのUIを自作したとします。挙動としては下記のようになってほしい。
- 選択したサジェストのオプションをテキストフィールドの値に反映し、サジェストのリストを消す
- サジェストのリスト外をクリックしたらサジェストのリストを消す

便宜的に、テキストフィールドを`input`タグ、サジェストリストを`ul`で表します。

### ダメな例
```html:sample.html
<input onblur="サジェストのリストを消す処理" />
<ul onclick="選択されたオプションをinputのvalueに反映する処理">
	<li>@gmail.com</li>
	<li>@yahoo.co.jp</li>
	<li>@hogehoge.ne.jp</li>
</ul>

```
**ブラウザによって挙動が異なる**かもしれませんが、これだとうまくいかない事があります。
onclickよりonblurの方が早く発動するので、`ul`タグのonclickが発動する前に消えてしまい、選んだつもりの値がテキストフィールドに反映されません。


### 良い例
```html:sample.html
<input onblur="サジェストのリストを消す処理" />
<ul onmousedown="選択されたオプションをinputのvalueに反映する処理">
	<li>@gmail.com</li>
	<li>@yahoo.co.jp</li>
	<li>@hogehoge.ne.jp</li>
</ul>

```
こうすると、選択されたオプションをinputのvalueに反映する処理の方が先に発動するので、想定通りの動作となります。
Angular2/5　ページタイトルをパスに対応したものに動的に変更する

##環境
Angular 5.2.5
Angular version2 以上
##前提
コンポーネント等は作成しているものとする。
/src/app/AにAコンポーネント、/src/app/BにBコンポーネントが存在するものとする。
また、/src/app直下にapp.component.ts、app.module.tsが任意の形で存在するものとする。
##ルーターの準備
/src/appディレクトリに以下の内容のファイルapp.routes.tsを作成する。

```typescript:app.routes.ts
import { ModuleWithProviders } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { AppComponent } from './app.component';
import { AComponent } from './A/A.component';
import { BComponent } from './B/B.component';

export const router: Routes = [
{
	{
		path: 'A',
		component:AComponent,
		data: { title: 'タイトル:A' }
	},
        {
		path: 'B',
		component:BComponent,
		data: { title: 'タイトル:B' }
	}
]

export const APP_ROUTES: ModuleWithProviders = RouterModule.forRoot(router);
```

data.titleはページタイトルである(data:{}は各ルートにカスタムオブジェクトを追加する機能である)。パスAにアクセスするとAコンポーネントが表示される。

/src/appディレクトリにあるapp.module.tsを編集する。

```typescript:app.module.ts
 ...

import { APP_ROUTES } from './app.routes';

 ...
@NgModule({

　...
	imports: [
		APP_ROUTES,
 ...
	]
 ...
})

```

##動的タイトルの設定
/src/appディレクトリにあるapp.component.tsを編集する。

```typescript:app.component.ts
import { Component, OnInit } from '@angular/core';
import { Router, NavigationEnd, ActivatedRoute } from '@angular/router';
import { Title } from '@angular/platform-browser';
import 'rxjs/add/operator/filter';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/mergeMap';

@Component({
	selector: 'app-root',
	templateUrl: './app.component.html',
	styleUrls: ['./app.component.css']
})
export class AppComponent {
	constructor(private router: Router, private activatedRoute: ActivatedRoute, private titleService: Title) {}
	// tslint:disable-next-line:use-life-cycle-interface
	ngOnInit() {
		this.router.events
			.filter(event => event instanceof NavigationEnd)
			.map(() => this.activatedRoute)
			.map(route => {
				while (route.firstChild) {
					route = route.firstChild;
				}
				return route;
			})
			.filter(route => route.outlet === 'primary')
			.mergeMap(route => route.data)
			.subscribe(event => this.titleService.setTitle(event['title']));
	}
}
```

this.router.event ~  subscribe ~ でルータのイベントを読み込む。
NavigationEndでイベントをフィルターする。

このようにして動的にタイトルを変更することが出来ます。
dat.GUI入門

# dat.GUI入門

この記事は、ドットインストールの　dat.GUI入門を見て、メモしています。
https://dotinstall.com/lessons/basic_datgui

##　dat.GUIをCDNで読み込む
https://cdnjs.cloudflare.com/ajax/libs/dat-gui/0.7.1/dat.gui.min.js

最初にインスタンスを作成

```
const gui = new dat.GUI();
```


dat.GUで値を変更する場合は、オブジェクトである必要があるので作成

```
const PROPERTY = {
  'startOffsetY' : -50,
  'endOffsetY' : 50,
  'startOffsetX' : 500,
  'endOffsetX' : -50,
  'SIZE_MIN' : 0.3,
  'SIZE_MAX' : 0.5
}
```

変数とか、関数で格納とか

```
var FizzyText = function() {
  this.message = 'dat.gui';
  this.speed = 0.8;
  this.displayOutline = false;
};

window.onload = function() {
  var text = new FizzyText();
};
    
```

インスタンスの作成とオブジェクトの準備が終わったら
```
gui.add(オブジェクト名,'キー')
```
でUIが表示される
UIを消したい場合```h　key```で消せる


##　刻み値､最小値､最大値

```
gui.add(オブジェクト名,'キー','最小値','最大値', '刻み値')
```
最小値､最大値を指定するとUIがスライダーになる

##　セレクトボックス
配列で渡してあげればいい
```
gui.add(オブジェクト名,'キー',[数値など,数値など,数値など])
```

ラベルを付けたい場合
連想配列で渡してあげればいい
```
gui.add(オブジェクト名,'キー',['key':value ,'key':value, 'key':value])
```



##　カラーピッカー
```
addColor(オブジェクト名,'キー')
```
を使う
オブジェクトに１６進数もしくは、配列を入れてあげる
RGBの場合は配列で渡してあげればいい

```
const PROPERTY = {
　　　　　'color1' = '#ffffff',
  'color2' = [0,0,0] 
}
```

```
gui.addColor(PROPERTY,'color1')
gui.addColor(PROPERTY,'color2')
```

##　チェックボックス
booleを扱うときに使う
条件分岐で使おう

```
const PROPERTY = {
　　　　　'hasCheck' = false
}
```

```
gui.add(PROPERTY, 'hasCheck')
```


##　イベントを使おう
オブジェクトに関数を仕込む

```
const PROPERTY = {
　　　　　'alert' :function(){
     alert(JSON.stringify,(this))
   }
}
```

```
gui.add(PROPERTY, 'alert')
```

###　値が変更されたときにイベントを発火させたい場合 onChange()

```
gui.add(オブジェクト名,'キー').onChange(function(){
  callback();
})
```

###　値が変更し終わったときにイベントを発火させたい場合 onFinishChange()

```
gui.add(オブジェクト名,'キー').onFinishChange(function(){
  callback();
})
```

##　UIをフォルダわけにする addFolder()
変数を作成

```
let Folder;
```

Folderの追加

```
//　UI上にはfolderという名前で格納させる
Folder = gui.addFolder('folder')
//folderに格納するものを指定
Folder.add(オブジェクト名,'キー')
```

フォルダ分けした場合デフォルトだと閉じてる状態なので

```
Folder.open()
```
で開いてる状態にすることができる


ほかにも保存機能などいろいろあります
https://workshop.chromeexperiments.com/
CocosPodsでのトラブルシューティングメモ

# はじめに
自分がハマったパターンをメモ

# Podfile修正してもimportに出てこない
## 原因１：updateをしてない
→**XCodeを閉じた上で**コマンドラインから以下を実行

```
$ pod update
```

## 原因２：xcodeprojファイルから開いている
→**xcworkspaceファイルからXCodeを開く**

## 原因３：ビルドしてない
→**Command+Bで再ビルドをする**

# Podfileからライブラリを削除したらビルドエラー
以下のようなエラーが出た場合
`linker command failed with exit code 1 (use -v to see invocation)`

## 原因１：updateをしてない
→**XCodeを閉じた上で**コマンドラインから以下を実行

```
$ pod update
```

## 原因２：キャッシュ？が残っている
→`~/Library/Developer/Xcode/DerivedData/`以下にある、`プロジェクト名-Hash値`みたいなやつを削除

## 原因３：Linked Frameworks and Librariesに参照が残ってる
プロジェクト情報→`General`の中の`Linked Frameworks and Libraries`の中から、消したライブラリを消す。
その後、再ビルド
便利すぎるPlantUML - シーケンス図 | アクティビティ図  よく使うパターン備忘録

## PlantUML - シーケンス図 | アクティビティ図テンプレート
### このテンプレートがあれば、やりたいことはひとまず書ける！
### 用意するもの
***
1. 既にPlantUMLが動く環境
    2. java(JAVA (JDK or JRE)
    3. Graphviz
    4. IDEがAtomなら下記パッケージをインストール
        5. plantuml-viewer
        6. language-plantuml

### ソースコード
***
Editorに貼り付けて動作確認してみてください
また、サンプルなので処理内容に全く意味はないです

#### シーケンス図 サンプル
``` sequence_sample.pu
@startuml
header Page Header
footer Page Footer
actor act1
participant Front
control Middle
database Back
collections CSV
box "Batch Service" #LightBlue
	participant Back
	participant CSV
end box
act1 -> Front
Front -> Middle
Middle -> Back
Back -> Middle
Middle -> Front
note right of Middle #FF0000
 Business logic.
end note
Front -> act1
act1 -> act1: I did only the operation for myself.\nFor example, input.
note left of act1
  Various line shapes.
end note
act1 ->x Front
act1 -> Front
act1 ->> Front
act1 -\ Front
act1 \\- Front
act1 //-- Front
act1 ->o Front
act1 o\\-- Front
act1 <-> Front
act1 <->o Front
note over act1
  numbering.
end note
autonumber
act1 -[#FF0000]> Front
act1 -[#FF0000]-> Front
autonumber stop
autonumber 100
Front -[#0000FF]> Middle
Front -[#0000FF]-> Middle
autonumber stop
== Regular execution ==
hnote over Back: idle
Back --> CSV
ref over Back
  This CSV format.
end ref
... 2 minutes latter ...
CSV --> Back
== Logic ==
Middle -> Back: Request.
alt successful case
	Back -> Middle: Accepted.
else some kind of failure
	Back -> Middle: Failure.
	group My own label
		Middle -> Log : Log start
	    loop 1000 times
	        Middle -> Back: Go Back.
	    end
		Middle -> Log : Log end.
	end
else Another type of failure
   Back -> Middle: repeat.
end
@enduml
```
#### 上記から生成された.png
***
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233071/7ce4e88f-3b29-bea0-8534-7f1659c45a7a.png)


#### アクティビティ図 サンプル
``` activity_sample.pu

@startuml
start
:Initialize;
if (case1) then (yes)
  :process1;
  note left
    Success case:-)
  end note
  :Output messages.;
  fork
    :TypeA or B dedicated process;
    if (TypeA) then (yes)
      :TypeA dedicated process;
    else (no)
      :TypeB dedicated process;
      repeat
        :read data;
        :Send e-mail;
      repeat while (more data?)
    endif
  fork again
    :TypeC dedicated process;
    :Send e-mail;
  endfork
elseif (case2) then (yes)
  :process2;
  note left
    Warning case:-|
  end note
  if (process3) then (yes)
    :Output message.;
  else (no)
    :abort...;
    stop
  endif
else (no)
  :get error messages.;
  note right
    Faild case:-(
    ====
    Bye!
  end note
  while (for each error messeges.)
    :Send e-mail;
  endwhile
endif
:Finalize;
end
@enduml

```

#### 上記から生成された.png
***
![sample.png](https://qiita-image-store.s3.amazonaws.com/0/233071/cd286105-783f-bfb8-9a9c-fff89b8f7ea4.png)


### 感想
***
かなり作業が捗る
cssでひし形の下線を引きたいとき

デザイナーさんからひし形の下線を引きたいって言われたので、cssで実装してみた！

#見た目

![image.png](https://qiita-image-store.s3.amazonaws.com/0/59927/91f6bf15-afd3-d332-7c32-61d324e30e23.png)
↑こういうの実装したいとき！

#html
htmlはいたってシンプル。
ポイントはspanで囲んであげること。
こうしないと、下線が横100%になっちゃう！

```html
<ul>
  <li><span>ほにゃらら</span></li>
  <li><span>ほにゃらら</span></li>
</ul>
```
#scss

苦労したのは、左右に分割するところ。
`backgroud-size: 50% 50%;` みたいに分割できるかと思ったらできなかったので、結局beforeとagterに分けた！


```scss
ul{
  li{
    span{
      position: relative;
      &::before, &::after{
        content: '';
        position: absolute;
        left: 0;
        bottom: -10px;
        display: inline-block;
        width: 20%;
        height: 5px;
        background-color:
          $clr_yellow_2;
        background: linear-gradient(135deg, transparent 5px, $clr_yellow_2 5px);
      }
      &::after{
        width: 80%;
        left: 20%;
        background: linear-gradient(315deg, transparent 5px, $clr_yellow_2 5px);
      }
    }
  }
}
```

#css
展開するとこんな感じ。
（変数は `$clr_yellow_2: #fddc00;` が上の方に書いてあったと思われ！）

```css
ul li span {
  position: relative;
}

ul li span:before, ul li span:after {
  content: '';
  position: absolute;
  left: 0;
  bottom: -10px;
  display: inline-block;
  width: 20%;
  height: 5px;
  background-color: #fddc00;
  background: linear-gradient(135deg, transparent 5px, #fddc00 5px);
}

ul li span:after {
  width: 80%;
  left: 20%;
  background: linear-gradient(315deg, transparent 5px, #fddc00 5px);
}
```

#まとめ
これくらいのちょっとした飾り付けならサクッとcssで書けちゃうのはいい時代になったよねー。
昔に比べてメンテナンスが楽になった！
Goのテスト結果をCIでちょっと詳しく表示する

# Goのテスト結果をCIでちょっと詳しく表示する
よそのプロジェクトの `.circleci/config.yml` をのぞいていたら、どうやらJUnit形式のテスト結果をCircle CIで対応していることがわかったので書きます。

## JUnitのxml形式
テストのカバレッジ結果はなかなか言語ごとの事情があるのでプログラミング言語ごとはあるにしてもそれをまたいだ標準化がなされていないんです。
ただ、テスト結果（成否やかかった時間）はJUnitのxml形式が一般的に使われている傾向があり、CIツールなどでは大体対応しています。

わたしが確認した範囲だと、Circle CIとJenkinsでは対応しています。
JUnitというツールから分かる通り、元はJavaのユニットテストフレームワークから使われ出したものなのでJavaのツールなどは大体対応している気がします。

## GoでのJUnit形式出力
[go-junit-report](https://github.com/jstemmer/go-junit-report)というコマンドラインツールを利用すると出力できます。
使い方は

```
go get -u github.com/jstemmer/go-junit-report
```
でインストールして

```
go test -v 2>&1 | go-junit-report > report.xml
```
で `report.xml` にJUnit形式のテスト結果が出力されます。
個人的な好みだと `tee` コマンドなどで、標準出力などにも出力しつつやるのがおすすめです。

ちなみに、 `go test` コマンドに `-v` を指定するとテストケース名・結果・所要時間も出力されるのでgo-junit-reportはそれを利用してxmlを出力しているようです。

## Circle CIでテスト結果を取り込んで表示する
`steps` の中で `store_test_results` を使って取り込みます。
後々、統計を取りたい場合などのために、成果物（artifacts）としても残しておきましょう。
Google Chromeを起動すると「プロフィールを開くことができませんでした。」というエラーがでる

## OnyXでメンテナンス後、Google Chromeを起動すると「プロフィールを開くことができませんでした。」というエラーが表示されるようになった。

いままではGoogle Chromeの `Defaultディレクトリ` をまるっと削除して、再構築してた。

```
/Users/自分のユーザー名/Library/Application Support/Google/Chrome/Default/
```

`History` の削除だけでもイケる？っぽい？

## 参考

[http://www.itonoblog.jp/2016/12/23/google-chrome-プロフィールエラーが発生しました　解決方法/](http://www.itonoblog.jp/2016/12/23/google-chrome-%E3%83%97%E3%83%AD%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%80%E8%A7%A3%E6%B1%BA%E6%96%B9/)
これからネイティブスクリプトをはじめるには

# はじめに
ネイティブスクリプトに関する日本語のドキュメントがあまりないのでこれから始める人向けに環境の構築法をまとめました。携帯アプリ作りたいけど何を使おうか迷っていてNativeScriptが気になった人向け。

# ネイティブスクリプトとは
JavascriptもしくはAngularでWebアプリとAndroidやiOSアプリを同時に作れる統合開発環境。

- 利点
    - AndroidでもiOSでもアプリを作れる
    - web技術を（ほとんど）そのままモバイルアプリ開発に使える
    - ネイティブなので完成したアプリがサクサク動く
    - 特に高機能なアプリを作る際性能に差が出る（らしい）

- 欠点
    - レイアウトなどは各端末に合わせて作るので作業量が増える
    - 一部Webとモバイル別々で書かなきゃいけないところもある
    - 日本語のドキュメントが少ない

- こういう人が使うべき
    - AndroidでもiOSでもブラウザでも動くアプリを作りたい
    - Webプログラミングの知識をある程度持ってる
    - 高速なアプリを作りたい
    - 英語をある程度読める

- 逆にこういう人は別の選択肢ありますよ
    - ゲームを作りたい（ゲームエンジンを使おう）
    - そこまで高機能なものは作らない（ionicなどの選択肢もあるよ）

個人的に重い処理でユーザーがイライラしてアプリを離れるのが怖いのでNativeScriptを使っています。

# どんなものが作れる？
こちらの[サイト](https://www.nativescript.org/showcases)にいくつかネイティブスクリプトを使ったアプリが展示されています。
英語ですが見れば大体どんなものが作れるかわかると思います。
さぁ、こんなアプリがが作りたくなったらならまずは開発環境を整えましょう。
環境設定はほぼ自動でやってくれるのでエラーさえなければサクッと行きますよ。
（エラーがあったら英語のドキュメントをあさらなきゃいけなくなるけど...）

# インストール
ここからは[公式のページ](https://docs.nativescript.org/angular/start/quick-setup)を参考にしています。

1. 前提条件: Node.js
まずはバージョンチェック
`node --version`
エラーが出たらまずは最新版を[インストール](https://nodejs.org/ja/)しましょう。

1. NativeScript CLIのインストール
`npm install -g nativescript`
途中で二回質問を聞かれると思いますがどちらもNoで大丈夫です。
アクセス権限がない場合は`sudo`を先頭につけてみてください。
終わったら`tns`と打ってコマンドのリストが出てきたら成功です。

1. AndroidとiOSの環境構築
必要なもののインストールに時間がかかるので気長に待ちましょう。
管理者権限で以下のコマンドをシェルに打ち込む。
途中で何回かパスワードや「＊＊＊をインストールしますか」と聞かれるのでその都度答えてあげましょう。
Windows7 Service Pack 1 以降:
`@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((new-object net.webclient).DownloadString('https://www.nativescript.org/setup/win'))"`
iOS:
`ruby -e "$(curl -fsSL https://www.nativescript.org/setup/mac)"`

1. 最後に問題がないかチェック
最後に`tns doctor`と打ち込んで "No issues were detected" と返ってきたら成功です。
お疲れ様でした。

# おわりに
これで環境構築は終わりになります。
ネイティブスクリプトを使ったアプリの開発についてはまた別のところでまとめようと思っています。
これからいいアプリを作って行きましょう！