OmniAICreator/Qiita-1.07M huggingface dataset:
drupalをdocker上で簡単に動かしたメモ

# はじめに
drupalをDocker上で動かす記事はいくつかありますが、EC2だったり途中だったりでシンプルなものがなかったのでメモしておきます
[参考](https://walking-succession-falls.com/docker-compose%E3%81%A7drupal%E3%81%AE%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E3%80%82/)

# 手順

### drupalとmariadbのイメージをdockerhubから取ってきておく
`docker pull drupal`
`docker pull mariadb`


### 以下のファイルを作成
```docker-compose.yaml
version: "2"

services:
  # PHP Web Server
  web:
    # Build the Drupal 7 image
    # https://hub.docker.com/r/_/drupal/
    image: drupal:7
    # Environment variables
    environment:
      # Drupal settings
      DRUPAL_PROFILE: standard
      DRUPAL_SITE_NAME: Drupal
      DRUPAL_USER: admin
      DRUPAL_PASS: admin
      DRUPAL_DBURL: mysql://drupal:drupal@database:3306/drupal
    ports:
      - "8000:80"
    volumes:
      - ./drupal:/app
    links:
      - database:database
    command: php -S 0.0.0.0:80 -t /app
    working_dir: /app
    restart: always

  # MySQL Server
  database:
    image: mariadb:10
    environment:
      MYSQL_USER: drupal
      MYSQL_PASSWORD: drupal
      MYSQL_DATABASE: drupal
      MYSQL_ROOT_PASSWORD: ''
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
    ports:
      - "3306:3306"
    restart: always
    volumes:
      - mysql-db:/var/lib/mysql

volumes:
  mysql-db:
```

`docker-compose up -d`

Drupalのソースコードをダウンロード・解凍をして、./drupalディレクトリに配置。
 [Drupal](https://www.drupal.org/home) 

この時点のディレクトリ構成
.
├── docker-compose.yaml
└── drupal


`docker ps -a`
mariaDBのdockerIDをメモしておく

`docker exec -it (mariaDBのdockerID) bash`

`mysql -u root -p`

→パスワードは上記yamlのMYSQL_ROOT_PASSWORDなので空文字(そのままエンター)

```
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| drupal             |
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.001 sec)
```

http://localhost:8000にアクセス！

各種フォームには以下を入れて進んでいけば設定が終わります。

データベース名: drupal
データベースユーザー名: drupal
データベースパスワード: drupal
詳細設定で
ホスト名: database

# おわりに
これを費用¥0でクラウドにデプロイしてサイト運用したいです。
Pythonで入力された数字が素数か判定するプログラム

#はじめに
私がPythonを勉強して一通り基本となる構文を学んだところで作った、「入力された整数nが素数なのか合成数なのか判定するプログラム」です。自分の日記的な意味合いも兼ねて書いています。
まだまだ至らない点が多いと思いますが、アドバイスなどが有りましたらよろしくおねがいします。

#プログラムの原理
今回の素数の判定方法は「入力された n に対して、n の約数が√nまでの素数に無ければ素数である。」という事実に基づいて行いました。
詳しい証明は以下をご覧ください。
[自然数nが√n以下のすべての素数で割り切れなければ，nは素数であることの証明](https://cartman0.hatenablog.com/entry/2017/10/23/%E8%87%AA%E7%84%B6%E6%95%B0n%E3%81%8C%E2%88%9An%E4%BB%A5%E4%B8%8B%E3%81%AE%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E7%B4%A0%E6%95%B0%E3%81%A7%E5%89%B2%E3%82%8A%E5%88%87%E3%82%8C%E3%81%AA%E3%81%91%E3%82%8C)

#実際のプログラム
```Python
import math
from sympy import primerange
n = int(input("素数か確かめたい数を入力してください。>> "))
num = int(math.sqrt(n)) + 1
primlist = list(primerange(2,num)) #1

for i in primlist: #2
    if n % i == 0: #3
        print("合成数です。")
        break
    elif i == primlist[-1] :
        print("素数です。")
```
###大まかな流れ
1. 素数リストを√nまでの数字で作成する。
2. nを素数リストで割ってみる。
3. 割り切れたら「合成数です。」と表示する。素数リストの最後まで行ったら「素数です。」と表示する。
  
###実際やっていること
1.は#1で、SymPyの[primerange](https://docs.sympy.org/latest/modules/ntheory.html)を用いることにより、素数リストを作成しました。
2.は#2で、for構文を用いて素数リストから文字を取り出しています。
3.は#3で、if構文を用いて「n を素数で割った**余り**が0か否か」で判定しています。

#反省点
初めて素数判定を作りましたが、動くものができて個人的に満足しています。
しかし、n が大きくなると(7桁を超える)と途端に計算速度が遅くなってしまうので、なんとか改善したいです。
また、よく考えたらmathを使う必要がなかったので修正したいと思います。初めての自作プログラムなので今回は記念に残しています。
このプログラムを用いれば素因数分解もできそうな気がしてきたので手を加えてみたいとおもいます。
最後まで読んでくださいまして有難うございました。
Go言語でつくるインタプリタをやってみた

# tl;dr

ただの[『Go言語でつくるインタプリタ』](https://www.oreilly.co.jp/books/9784873118222/)紹介記事です。

## 動機

私はいつも自分の開発や日々の細かい作業をツールとしてより効率化をすることを考えています。
その結果としていくつかのCLIコマンドやVimプラグインを書いたりしているわけなのですが。
その中で今まで知らないことを盛り込むことで都度新しい知識を仕入れることを心がけています。

最近Language Server Protocol(LSP)周りにご執心なのですが、
ふと自分でLanguage Server(LS)をつくりたいなと思ったのですが、そのための知識が足りないことに気が付きました。
そうLSをつくる上で対象となる言語の解析への理解は欠かせないのです。

そこで私は一回インタプリタを作ったら一通りの流れを理解できるのでは？
と考えて以前から気になっていた『Go言語でつくるインタプリタ』を注文したのです。

似たような話でDQNEOさんの[Goコンパイラをゼロから作った話](https://qiita.com/DQNEO/items/2efaec18772a1ae3c198)がありますが、
このような壮大は話に比べるといささか小規模ではありますね。

## 『Go言語でつくるインタプリタ』のよいところ

結論から述べましょう。『Go言語でつくるインタプリタ』は本当に素晴らしい本です。
著者であるThorsten Ball氏。そしてこの素晴らしい内容を余すことなく日本語で伝えてくれた設樂 洋爾氏には本当に感謝の気持ちでいっぱいです。

言語を自分でつくるというのは、プログラマであれば一度はやってみたいことではないでしょうか？
しかしその反面どのように作ればよいのか、いまいちイメージ出来ないものでもあります。
やってみようと調べるとすると以下のようないかにも難しい本が出てきて、ぐぬぬとなること請け合いなわけです。

- [計算機プログラムの構造と解釈](https://www.amazon.co.jp/dp/4798135984)
- [コンパイラ―原理・技法・ツール(通称ドラゴンブック)](https://www.amazon.co.jp/dp/478191229X)
- [最新コンパイラ構成技法(通称タイガーブック)](https://www.amazon.co.jp/dp/4798114685)

私もいつかは読んでみたいなと思いつつも二の足を踏み続けていましたし、
やっぱり言語をつくるなんて一部の人間のみに許された神の諸行なのではと思ってしまっていたわけです。

『Go言語でつくるインタプリタ』のよいところはその難しい要素をうまく噛み砕き、
躓きそうな要素を慎重に配置して、一つ一つ確実につなげてゆき、読者に確かな達成感を与えることに成功しています。
それらの要素を軽快な語り口で次はどうなるんだと常に楽しみにさせるところも注目です。

### 適切な流れ

『Go言語でつくるインタプリタ』の基本的な流れは、
インタプリタの主要要素である以下の3つを順番に構築していくようになっています。

- 字句解析器(Lexer)
- 構文解析器(Parser)
- 評価器(Evaluator)

字句解析器でソースコードをトークン列に変換し、
構文解析器でトークン列をAST(抽象構文木)に変換し、
最後に評価器でプログラムに意味を与えます。

それぞれのフェーズで完全にデータ型などをすべて作り込むことはせずに、まずはインタプリタとして通して動作するところまでを作成するのが秀逸です。

一旦インタプリタとして完全に動作する段階に行くと君はすごい偉業を成し遂げたと褒めちぎってくれます。
その後に文字列や配列, ハッシュマップなどを追加実装していくのですが。一連の流れはすでに抑えているので、だいたいどこを触るべきなのかが予測できるようになるはずです。

幾多に張り巡らされた伏線(コード)が徐々に解き明かされる様は、さながら出来の良いミステリを見ているような感覚です。

### テストコード

この手の写経(ソースコードを教科書から書き写す行為)は、ソースの間違えによるバグに引っかかって、結局バグが解消出来ずに途中で止まってしまうのが一番の難関ではないかと思います。
特にこの本は200ページ以上に渡り、一つのプロジェクトを触り続けていくわけで、その間に一つでもミスがあればインタプリタは期待した動きにはなりません。

その問題に対応するために、この本はTDD(テスト駆動開発)を採用し、関数の仕様を全て記載した上で、実装に移るスタイルをとっています。
それらのテストコードは長大な説明文章よりも、はるかに雄弁にソースの振る舞いを語ります。なるほどこういうケースに対応するために実装がこうなっているのだなと納得しながら実装することが出来ます。

最悪テストコードを記載することが面倒であれば、公開されているテストコードをペタペタ貼ってゆけばよいのです。

テストコードの内容自体もところどころで検証をするためのヘルパー関数を作って、冗長性なく快適にテストコードを書けるようにするような工夫が随所に見られます。
SubTestの未対応バージョンのGoをベースに作っているので、最新の形式でかけるわけではないですが。それでもどういうテストをするべきなのかを知るという点においても非常に勉強になります。

### Go標準ライブラリのみ

このおかげでGoのみインストールすれば始められます。
またコード中に出てくるものはほとんど基本的な記述のみになるので、内容も非常に簡素になるわけです。

## 最後に

もしプログラミング言語を作ることに少しでも興味でもあれば是非一度見てほしい一冊です。
構造化データ設置して会社情報をマークアップしてみた

##ツール
ボキャブラリ schema.org（Google推奨）
シンタックス JSON-LD（Google推奨）

##構造化タグを設置するとどうなるの？
 検索エンジンのロボットがどんな情報か理解しやすくなる。
(例)　:robot:　株式会社イーツー・インフォっていう組織だと認識する

```
<script type="application/ld+json"> <!--シンタックス指定[json-ld]-->
{
"@context": "http://schema.org", <!--ボキャブラリ指定[schema.org]-->
"@type": "Organization", <!--組織の情報書くよ-->
"name" : "株式会社イーツー・インフォ" <!--組織名-->
｝
```

####ロボットに理解してもらうとこうなる
ざっくり言うと、検索結果で表示される項目を増やせる。


[こちらの記事](https://www.sakurasaku-labo.jp/blogs/structured-data)わかりやすかったです。

##作る
JSON-LDはheadタグやbodyタグ等、どこにでも書ける

```
<!--構造化データ　全体像-->
  <script type="application/ld+json">
  {
  "@context": "https://schema.org",
  "@type": "Organization",
  "name": "株式会社イーツー・インフォ（E2info, inc.）",
  "telephone": "+81-45-620-5788",
  "url": "https://www.e2info.co.jp/",
  "foundingDate": "平成17年10月5日",　
  "address": {
  "@type": "PostalAddress",
  "postalCode": "220-0022",
  "addressCountry": "JP",
  "addressRegion": "神奈川県",
  "addressLocality": "横浜市",
  "streetAddress": "西区花咲町6-145 横浜花咲ビル9F"
  }
  }
  </script>
```

会社情報について書くので[scherma.orgのOrganizationページ](https://schema.org/Organization)を見ながら作る
![スクリーンショット 2019-10-28 10.43.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286794/8d676863-9764-5210-d459-22cac7c93935.png)

流れ
使いたいタイプを見つける→説明文を見る→使いたいプロパティを見つける→書く

使いたいタイプを間違えると誤った情報になる
組織　→　Organization
個人　→　Person

#####（例）会社名、電話番号、URL、設立日

```
 "@type": "Organization",
  "name": "株式会社イーツー・インフォ（E2info, inc.）",
  "telephone": "+81-45-620-5788",
  "url": "https://www.e2info.co.jp/",
  "foundingDate": "平成17年10月5日",　
```

タイプは、より詳しい情報を書くようにする。
住所は、Organizationタイプでも書けるが、PostalAddressタイプのほうがより詳しい情報になる

#####（例）住所


```
"@context": "https://schema.org",
  "@type": "Organization",
  "name": "株式会社イーツー・インフォ（E2info, inc.）",
  "address": {
  "@type": "PostalAddress",
  "postalCode": "220-0022",
  "addressCountry": "JP",
  "addressRegion": "神奈川県",
  "addressLocality": "横浜市",
  "streetAddress": "西区花咲町6-145 横浜花咲ビル9F"
  },
```

同じプロパティに2つ以上の項目を使いたい場合がある
[ ]を使う

#####（例）認定

```
  "hasCredential": {
  "@type": "EducationalOccupationalCredential",
  "recognizedBy": [
  "横浜型地域貢献企業最上位認定　認定番号：23(1)0141",
  "プライバシーマーク認定　認証番号：第17002408号　認定機関：一般財団法人日本情報経済社会推進協会(JIPDEC)"
  ]
  }
```


完成したら[Google構造化データテストツール](https://search.google.com/structured-data/testing-tool?hl=ja)を使ってエラーがないか確認する
ローカルで作業しているときはコードスニペットタブからスクリプト貼り付ければ、テストできる。
[javascript]2つのarrayで完全一致と部分一致

たまに使いたくなるけど、書き方忘れるので備忘録。

```javascript:変数
const baseArray = [1,2,3,4,5,6,7,8,9,10]
const target1   = [10,9,8,7,6,5,4,3,2,1]
const target2   = [1,2,3]
const target3   = [11]
```

```javascript:完全一致(every)
baseArray.every((num) => target1.includes(num))
> true

baseArray.every((num) => target2.includes(num))
> false

baseArray.every((num) => target3.includes(num))
> false
```

```javascript:部分一致(some)
baseArray.some((num) => target1.includes(num))
> true

baseArray.some((num) => target2.includes(num))
> true

baseArray.some((num) => target3.includes(num))
> false
```

# 参考
 - [JavaScript の Array.some と Array.includes の使い分け、値・参照型の動作の違い](https://qiita.com/Nossa/items/4a425e57ec4b7eedb7cb)
Stand Alone ESXi: offline copy and register to inventory, answering "I Copied It" while first power on VM with command line.

# Stand Alone ESXi: offline copy and register to inventory, answering "I Copied It" while first power on VM with command line.

## Objectives:

- personal memo

## Refs:

- https://kb.vmware.com/s/article/1028042
- https://kb.vmware.com/s/article/2147569
- https://kb.vmware.com/s/article/1029513
- https://kb.vmware.com/s/article/1026835

## Target System:

- ESXi 6.7 (stand alone free licensed)

## Operation:

### Get VM ID

```
vim-cmd vmsvc/getallvms | grep -i <VM NAME>
```

### Power Off VM (if needed)

```
vim-cmd vmsvc/power.getstate <VMID>

vim-cmd vmsvc/power.shutdown <VMID>

vim-cmd vmsvc/power.getstate <VMID>
```

### Get file path

```
vim-cmd vmsvc/get.summary <VMID> | grep vmPathName
```
```
vim-cmd vmsvc/get.filelayout <VMID> | less
```

### Create Target Folder

```:example
mkdir /vmfs/volumes/datastore3/rancher-server01
```

### Copy medadata and config file

```:example
cd /vmfs/volumes/datastore2/centos7-test01
cp -p centos7-test01.vmsd /vmfs/volumes/datastore3/rancher-server01/.
cp -p centos7-test01.vmxf /vmfs/volumes/datastore3/rancher-server01/.
cp -p centos7-test01.vmx /vmfs/volumes/datastore3/rancher-server01/.
```

### Clone VMDK file

- Use absolute path for each vmdk file paths.

```:example
vmkfstools -i /vmfs/volumes/datastore2/centos7-test01/centos7-test01.vm
dk /vmfs/volumes/datastore3/rancher-server01/centos7-test01.vmdk
```
```:output-example
Destination disk format: VMFS zeroedthick
Cloning disk '/vmfs/volumes/datastore2/centos7-test01/centos7-test01.vmdk'...
Clone: 100% done.
```

### Rename

```:example
cd /vmfs/volumes/datastore3/rancher-server01/
vmkfstools -E centos7-test01.vmdk rancher01.vmdk
cp centos7-test01.vmx rancher01.vmx
```

- edit old name related lines

```:example
vi rancher01.vmx
```

- if use sed

```
sed -i 's/<previous name>/<new name>/g' <new name>.vmx
```

### Register VM to inventory

```:example
vim-cmd solo/registervm /vmfs/volumes/datastore3/rancher-server01/rancher01.vmx
```
- stdout is VMID
- if have some trouble, unregister

```
vim-cmd /vmsvc/unregister <VMID>
```

### Power On VM

```
vim-cmd vmsvc/power.getstate <VMID>
vim-cmd vmsvc/power.on <VMID>
```

- prompt is waiting ...

### Answer with command line

- start another ssh session

```
vim-cmd vmsvc/message <VMID>
vim-cmd vmsvc/message <VMID> <MESSAGE ID> <ANSWER ID>
```

```:example
vim-cmd vmsvc/message 8

Virtual machine message 121402125:
This virtual machine might have been moved or copied. In order to configure certain management and networking features, VMware ESX needs to know if this virtual machine was moved or copied. If you don't know, answer "I Copied It".
   0. button.uuid.cancel (Cancel)
   1. button.uuid.movedTheVM (I Moved It)
   2. button.uuid.copiedTheVM (I Copied It) [default]

vim-cmd vmsvc/message 8 121402125 2
```
 - power.on prompt should return now

### Get IP address from vmware tools

```
vim-cmd vmsvc/get.summary <VMID> | grep ipAddress
```
rails gするとDid you mean?  deprecate_constantとエラーがでる

コントローラとビューを作成するためrails gすると下記のエラーが起きました。
備忘録としてまとめます。

エラー文抜粋

```
r.rb:28:in `<class:ScaffoldControllerGenerator>'
	10: from /Users/****/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/railties-5.0.7.2/lib/rails/generators/base.rb:168:in `hook_for'
	 9: from /Users/****/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/railties-5.0.7.2/lib/rails/generators/base.rb:168:in `each'
	 8: from /Users/****/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/railties-5.0.7.2/lib/rails/generators/base.rb:178:in `block in hook_for'
	 7: from /Users/****/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/railties-5.0.7.2/lib/rails/generators/base.rb:202:in `class_option'
	 6: from /Users/****/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/thor-1.0.0/lib/thor/base.rb:304:in `class_option'
	 5: from /Users/****/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/thor-1.0.0/lib/thor/base.rb:582:in `build_option'
	 4: from /Users/****/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/thor-1.0.0/lib/thor/base.rb:582:in `new'
	 3: from /Users/****/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/thor-1.0.0/lib/thor/parser/option.rb:11:in `initialize'
	 2: from /Users/****/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/thor-1.0.0/lib/thor/parser/argument.rb:24:in `initialize'
1: from /Users/****/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/thor-1.0.0/lib/thor/parser/option.rb:115:in `validate!'
/Users/****/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/thor-1.0.0/lib/thor/parser/option.rb:140:in `validate_default_type!': undefined method `deprecation_warning' for Thor:Class (NoMethodError)
Did you mean?  deprecate_constant
```
参考記事もなくて全く意味がわかりませんでしたが、
聞いたところGemfile.lockの下記の記載が原因らしいです。

``` Gemfile.lock
thor (1.0.0)
```

thor (1.0.0)はrails newをした時にデフォルトで作られるため、thorのバージョンを変更します。

Gemfileの最終行に下記を記載します。

``` Gemfile.
gem 'thor', '0.20.3'
```

bundle installするために一度Gemfile.lockを削除します。

削除できたらbundle installを実行します。

bundle install後、Gemfile.lockのthorが「thor (0.20.3)」となっていることを確認します。

``` Gemfile.lock
thor (0.20.3)
```

確認できたらrails gができるようになっているはずです。

細かい原因が分かってなくて恐縮ですが、以上となります。
「: =: unexpected operator」とか「: =~: binary operator expected」とか

各アプリのCI/CD環境をJenkinsで構築中、１日の業務の1/3をロストさせたこの問題をメモしておくことに苦笑

## 失敗

次の内容をジョブに「シェルの実行」などのシェルスクリプトに設定しているとタイトルのエラーが出てしまう。
ちなみに`#!bin/sh`にオプションを付けてないため異常終了ではなく正常終了する。

詳細： [Jenkinsのシェルの実行について](https://qiita.com/mechamogera/items/f689b95670127d5bf046)

```sh
#!/bin/sh

# TEST = "++++"
TEST = "++ERRORS++"

echo "$TEST"

if [ "$TEST" =~ ERRORS ] ; then
  exit 1
fi

echo "done!!"
exit 0
```

## 成功

スペースを消し、変数サイドのダブルクォーテーションを外して`if [[ ~ ]]`スタイルに調整するとタイトルのエラーは出なくなり、ちゃんと異常終了してくれる。

```sh
#!/bin/sh

# TEST="++++"
TEST="++ERRORS++"

echo "$TEST"

if [[ $TEST =~ ERRORS ]] ; then
  exit 1
fi

echo "done!!"
exit 0
```
jsで連想配列オブジェクトの特定keyだけ取り出してカンマ区切りの文字列にする

#jsで配列の特定keyだけ取り出してカンマ区切りの文字列にする

言葉だけだと何言ってるの？？ってなるので

表示だけ考えて文字列でカンマ区切りで最後は必要ないってやつ

```javascript
// これを
const array = [
  {id: 1, category: 'ねこ', name: 'ポチ'},
  {id: 1, category: 'ねこ', name: 'ねこねこ'},
  {id: 1, category: 'いぬ', name: 'にゃん'},
];

// ↓↓↓ こうしたい ↓↓↓
const string = 'ポチ, ねこねこ, にゃん';
```

## 結論

```javascript
function(array) {
   // 配列からnameだけ取り出して「,」区切りの文字列にする
   return array.map( (row) => {return [row['name']]} ).join(',')
},
```

## 分解

```javascript
function(array) {
   // 配列からkeyのnameだけ取り出した配列を作る
   // こんな感じの配列 → ['ポチ', 'ねこねこ', ’にゃん’]
   const namesArray = array.map((row) => {
       return [row['name']]
   });

   // 配列を「,」区切りの文字列にする
   const namesString = nameArray.join(',');
},

```

## Vue.jsで実際に使った時の用途

```vue
<template>
  <div>
    <span>
       <!-- 「ねこ, にゃん, ぽち」 のように表示する --!>
      {{ array | convertArrayToString }}
    </span>
  </div>
</template>

<script>
  data: {
    array: array
  },
  filters: {
    convertArrayToString(array) {
      // 配列からnameだけ取り出して「,」区切りの文字列にする
      return array.map( (row) => {return [row['name']]} ).join(',')
    },
  }
</script>
```
【Vue.js】メソッド vs computedプロパティ(算出プロパティ) サンプル 


メソッドとcomputedプロパティの違いに関する記述はすでにたくさんあるので、今回は個人的にわかりやすいと思った、**これらの違いを説明したコード**を紹介したいと思います。



# 簡単に違いと使い分けについて

### Computedプロパティとmethodの違い
>算出プロパティとメソッドの違いは、“算出プロパティが処理の結果をキャッシュする”ことです。
算出プロパティがキャッシュした結果を更新するのは、依存するデータが変更されたときです。
一方、メソッドは常に処理が実行されます。

### Computedプロパティのメリット・メソッドとの使い分け
> 結果が同じなら、常にメソッドを使えば良いと思われるかもしれません。
算出プロパティのメリットは、結果をキャッシュしているため処理が高速であるという点です。
例えばリストをソートする処理を作成するときに、メソッドで実装するとソートするごとに毎回処理が実行されます。
ソートした結果を算出プロパティとして用意すれば、依存するデータが更新されるまでソート結果をキャッシュするため、処理が速くなります。


参照
[【Vue.js】算出プロパティとメソッドの違い。どう使い分ければ良いの？](https://public-constructor.com/vuejs-computed-property/)

## サンプル

参照
[Vue JS 2 Tutorial #9 - Computed Properties
](https://www.youtube.com/watch?v=O14qJr5sKXo)

＊プログラム
<img width="437" alt="result.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486397/5257b8f0-c89b-24f6-3944-03003240e02a.png">

＊コード
【メソッドの場合】

```index.html
 <div id="vue-app">
    <h1>Computed Properties</h1>
    <button v-on:click="a++">Add to A</button>
    <button v-on:click="b++">Add to B</button>
    <p>A - {{ a }}</p>
    <p>B - {{ b }}</p>
    <p>Age + A = {{ addToA() }}</p>
    <p>Age + B = {{ addToB() }}</p>
  </div>
```


```vue.js
 new Vue({
      el: "#vue-app",
      data: {
        age: 20,
        a: 0,
        b: 0
      },

      methods: {
        addToA: function() {
          console.log('addToA')
          return this.a + this.age;
        },
        addToB: function() {
          console.log('addToB')
          return this.b + this.age;
      }
    }
  });
```

【computedプロパティの場合】

```index2.html
<div id="vue-app">
    <h1>Computed Properties</h1>
    <button v-on:click="a++">Add to A</button>
    <button v-on:click="b++">Add to B</button>
    <p>A - {{ a }}</p>
    <p>B - {{ b }}</p>
    <p>Age + A = {{ addToA }}</p>
    <p>Age + B = {{ addToB }}</p>
  </div>
```

```vue2.js
 new Vue({
      el: "#vue-app",
      data: {
        age: 20,
        a: 0,
        b: 0
      },

    computed: {
      addToA: function() {
          console.log('addToA')
          return this.a + this.age;
        },
        addToB: function() {
          console.log('addToB')
          return this.b + this.age;
      }
    }

  });
```


コードだけ見ると、ほとんど変わらないことがわかるかと思います。
変わる箇所といえば、htmlのマスタッシュ内の書き方くらいです。

```html
<p>Age + A = {{ addToA() }}</p>   <!-- メソッド -->
<p>Age + B = {{ addToA }}</p>   <!-- computedプロパティ -->

```

## ディベロッパーツールで確認

しかし、ディベロッパーツールでそれぞれコンソールで確認してみてください。
(コード内にconsole.logを書いたのもそのためです)


「Add to A」、「Add to B」 いずれかのボタンをクリックすると、メソッドで書いたプログラムの場合(今回は「Add to A」をクリック)、**AddToA、AddToB いずれも実行**されているのがわかります。

<img width="91" alt="method.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486397/85aa18ff-bf85-6b00-12d4-8ea54b203a1c.png">

一方computedプロパティで書いたプログラムの場合、「Add to A」ボタンをクリックすると、**AddToA のみが実行**されています。

<img width="297" alt="computed.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486397/f8513d5e-cd5a-50ea-ed80-10e2b1a9d37e.png">

## まとめ
上記のサンプルコードで、computedプロパティの特徴である**「依存するデータが変更されたときのみ処理が行われる」**の部分が確認できたかなと思います。
新卒で海外就職しようとしたらめちゃくちゃ辛かった話

ITエンジニアをしていたり、志している人たちの中で海外に対して憧れを持っていたり、いつかは海外でエンジニアとして働きたいと思っている方は多いのではないかと思います。
私は今年の3月に大学院を卒業したあと5月から9月までカナダのトロントにてWeb系のエンジニア [^1]として就職しようとしていました。

結果はと言うと、就職は難しく、(特に新卒での就職は鬼のように難しい) 今までの人生の中でも特段に苦しい時期となりました。
この今となっては味わい深い苦しさを記録するためと、この経験が海外で働きたいと思われている方に少しでも参考になればと思い記事として投稿します。

経緯
==========

もともと大学生時代の私はあまり海外志向の人間ではなく、むしろ自分には一生無縁のものと考えていて、その頃は数年後に海外で就職しようとしているとは夢にも思っていませんでした。

転機となったのは大学院でのアメリカのブラウン大学 [^2]と共同研究に参加したことで、ハーバード卒のプロジェクトリーダーの元で情報圧縮の研究をするという貴重な経験をすることができました。
このプロジェクトリーダーがすごい人で、発しているエネルギーというかオーラみたいなものがありました。この経験に大きく刺激され、これは本格的に海外で勉強したいと思い北米に留学することに決めました。
(留学費用を貯めるためにプログラマーとしてのバイトをしたが関わることになったのはヤバめの炎上案件だったのはまた別のお話)

その後、大学院の卒業を一年遅らせ、カナダのナイアガラ近くの田舎の大学で半年留学し、組み合わせ最適化について人工知能でのアプローチに取り組みました。
その大学でお世話になった教授からせっかくだから若いうちに数年カナダで働いてみたら？という提案にのせられて日本での大学院を卒業後にカナダに戻ってくることを決心しました。

トロントという場所
==========

トロントはカナダのシリコンバレーと呼ばれており、機械学習分野は特に有名でDeep Learningはトロント大学のヒントン教授らによって提唱されたこともありワークショップなども非常に盛り上がっています。
また、トロントはカナダの中で一番経済規模が大きく、スタートアップの立ち上げも盛んで、よりよい競争と環境の中で活動ができると考えました。
さらに、アメリカと違って30歳以下だと1年のワーキングビザであるワーホリビザが簡単に取れるため、若いうちにチャンスを得やすいというのもトロントにした理由でした。

作戦としては、1年のワーホリビザで就職 → 働きっぷりを見てもらう → うまく行けばビザを延長 でいこうと考えてました。

ジョブエントリーから面接までの手順
==========

採用されるまでの流れは Webでエントリー → 電話がかかってきて電話面接 → 実際にオフィスに出向いて面接 というのが基本になります。
求人サイトは LinkedIn, Indeed, あたりがメジャーで、AngelList とかも利用してました。
エントリーするのは毎日大体5~10社くらいで、求人を見る → 求められている条件に合わせて履歴書とカバーレターの微調整をしてエントリー というのをひたすら繰り返しました。
単純作業のようでこれがかなりしんどいです。エントリーしたもののほとんどがレスポンスを得られず、精神的にもかなり参りました。
SpreadSheetにどんどんとエントリーした会社名がたまっていき、たまーに電話がかかってくるとその中から会社名を検索してどのポストに応募したかを確認しながら話をするといった感じでした。
応募条件は大体が情報系の修士号を持つことが必須となっており、未経験でエンジニアの職に就くことが可能な日本はかなり特殊のようです。
最終的には、約150社応募し、20件くらいの電話面接、3件の対面での面接といった結果でした。

英語での面接
==========

海外で働くというときに気になる人が多いと思うのが英語かと思います。
はっきり言って英語でのコミュニケーションをとれるかどうかはかなりの障壁となります。向こう側からすると英語でのスムーズなコミュニケーションは当たり前レベルの要求になります。
私の場合はもともと英語が苦手だった [^3]ので血反吐を吐きながら身に付けました。それでも実際にビジネスの場に立つとなるとまだまだ不十分で、英語を身に付けると言うのは長い月日がかかると言うのが身に染みました。

現地の人の就活
==========

外国人がカナダでフルタイムの職を手にするのはかなり大変なのですが、特にITエンジニアの経験の浅い新卒での就職は現地の人でも相当厳しいようでした。
留学の時にできた友達のカナダ人は1年間就活して600社の応募をするも、まだ職を得られずでした。（これを聞いた時は俺は根性が足りなかったんやなと思った）
温度感的には1年間就活を続けて1社内定が出ればかなりラッキーな方といった感じでした。

一度IBMが所有しているIT系スタートアップが集まるオフィスに面接に行ったのですが、そこにいたほとんどは中国系、インド系、中東系の移民と思われる人たちでした。
ここから推察するに、それぞれ自国である程度キャリアを積んだエンジニアたちがトロントの給料の良い環境（年収1000万の求人がごろごろある）を求めて移住してきており、もともといた現地の人たちの雇用機会を奪って行っているという現象が起きているのだと思います。
特にカナダは英語圏なので、言語的な障壁はほとんど無い一方で、日本人の日本での雇用は日本語の習得の難しさという独特の分厚いバリケードによって守られていると推測されます。

新規事業に参画
==========

就活の一環としてビジネスパーティーにも参加していて、そこで出会った中東系のおじさんに新規事業を立ち上げようとしているのに参加しないかと誘われ、行くところもないし参加することにしましたが、結局は資金調達ができずエンジニアチームが立ち上がりませんでした。
40歳くらいの南アフリカ人を面接するという貴重？な経験もしました。（書ける言語はCOBOLとか言い出して反応に困った）

得たもの
==========

* 働き、お金を稼ぎ、生活を立てていくという大変さを知った
* お金が時間と共に減っていくだけという状況が想像以上に辛いことを知った
* 今思い出しても味わい深いと思える感情を経験できた
* 時間があったので勉強ができた
* Forrest Gumpやアニメのピンポンなどの名作を絶妙な心理状態で見ることができた
* 結果的にフリーランスとして独立できた

そして今
==========

いよいよ資金の底が見えそうになってきた8月ごろ、なりふりかまってはいられなくなったので日本の企業でリモートワーク可を中心に応募をはじめました。
そして運良く東京のスタートアップにフリーランスとして採用していただいたのでバックエンドエンジニアとしてのキャリアを始めることができ、今は仕事がある幸せを満喫しています。

[^1]: 英語ではWeb系エンジニアはDeveloperと呼ばれています。
[^2]: エマワトソンが卒業したことで有名ですね。
[^3]: 高校生の時は英語の定期テストが30点前後で、欠点ラインをウロウロしていた。
Vue + Expressのテンプレート作成メモ

# はじめに
バックエンドをNode.js、フロントエンドをVue.jsでwebアプリを開発することが増えたので簡単にひな形を作る手順を残しておこうと思います。

# 手順
### expressのプロジェクト作成
 `express プロジェクト名`

### vueのプロジェクトを作成
expressで作ったプロジェクトのルートディレクトリへ移動し
 `vue create public`
publicというタイトルになっているので、気になる方はvueプロジェクトのindex.htmlのtittleタグを編集


### vueプロジェクトでビルドする
publicディレクトリへ移動し
`npm run build`

### expressのapp.jsに記述されているpublicのパスを変える
`app.use(express.static(path.join(__dirname, 'public’)));`
↓
`app.use(express.static(path.join(__dirname, 'public/dist’)));`

### 一応この記述も消しておく
```
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade'); 
```

### node.jsプロジェクトでサーバー起動
`npm start`

### アクセスするとVueの初期画面が表示される
`localhost:3000`

# おわりに
さくっと雛形を作ってすぐに開発に取り掛かりましょう！
Qt VTK Pcl インストール

# Qtで点群の表示の備忘録

##環境
Linux Ubuntu 16.04 LTS
CMake 3.5.1
Qt5.5.1
Qt Creator 3.5.1
VTK 7.1.1
Pcl 1.8.1

## ダウンロードとインストール
**Qt**

以下より必要なバージョンでダウンロードしてインストールする
https://www.qt.io/download-open-source

**VTK**
以下より必要なバージョンをダウンロードして解凍する。
https://vtk.org/download/#latestcand

今回はVTK-7.1.1を利用した。

```
cd VTK-7.7.1
mkdir build
cd build
cmake ..
cmake-gui
make
sudo make install
```

cmake-guiの設定でQtの項目にチェックを入れること。
これにより、
libQVTKPlugin.so
が作成される。
QtCreatorを使う場合は、これを
```
sudo cp linQVTKPlugin.so /qtcreator/plugin/desiner/
```
にコピーをする。

VTK-8.1以上のバージョンでは、コンパイル時に
immediatemoderenderingoff
が将来的に無くなるよ的なことを言ってきます。

Pclの設定の問題だと思うけれども、面倒臭くなったのでVTK-7.1にバージョンを下げることで対応

**Pcl**

以下よりダウンロード
https://github.com/PointCloudLibrary/pcl/releases/tag/pcl-1.8.1

```
git clone https://github.com/PointCloudLibrary/pcl/releases/tag/pcl-1.8.1
cd pcl-1.8.1
mkdir build
cd build
cmake ..
cmake-gui
make
```

cmake-guiでVTKと連動させる必要ある。

以上でおしまいです。

## おまけ
libQVTKPlugin.soをコピーした場合は、qtcreatorのとこでQTVKのWidgetsを選択することができると思う。
これを使ってcmakeをすれば良い。

※書き方とかは、そのうち追記予定
LaTexインストール方法 2020年度

Windows10で簡単にLatexをインストールする方法です。

(2020年12月現在もインストールできることを確かめました)

下記のリンク先の下にある「ダウンロード」から「最新版」と「ソース」をダウンロードします。
https://www.ms.u-tokyo.ac.jp/~abenori/soft/abtexinst.html
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144614/e04ad7cc-3db0-4990-cd74-4c35ca726c0c.png)

ダウンロードした2つのファイルを解凍し、「ソース」でダウンロードした「abtexinst_○_○○_src」(○にはver情報)を開く。下の画像のようになっているはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144614/af6f6bf8-a465-8ad4-21b8-ca6f60c8948c.png)

この中から「Ruby_plugin」→「plugin」を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144614/92bda112-994c-9a75-fb55-50557b7b67b4.png)

必要なものだけでもいいが、分からない場合は全て選択しコピーする。

次に、「最新版」からダウンロードした「abtexinst_○_○○」を開き、「plugin」を開く。そこに先ほどコピーしたファイルを貼りつける。(下記画像はabtexinst_○_○○を開いた状態)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144614/7327492c-f5b4-cb09-f08c-19ef79748c5c.png)


pluginからabtexinst_○_○○を開いた状態に戻り、abtetexinst.exeを左クリックして「管理者として実行」を行う。立ち上がったら特に変更することなしで次に進みを押し、インストールを実行する。

インストールが終わればGhostscriptやdvioutのタブが出るので、こだわりがなければそのまま進む。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144614/5f26985a-b1ee-8bdc-7fe2-ce76a3416e3d.png)

これで半分終了。
次は、Texを編集するソフトをダウンロードする必要が出てくる。
特にこだわりがなければTexWorksを勧める。(それ以外知らない)

下記のリンクに飛ぶとgithubが表示される。
https://github.com/TeXworks/texworks/releases/

下へスクロールすると、下の画像のようにダウンロードファイルが出てくるので赤線部のファイルをダウンロードする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144614/89637c4b-d0a7-d21b-758c-3062cb1bfa2f.png)

ダウンロードが終われば、下のようなアイコンがダウンロードした場所に出てくる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144614/d37335ea-b774-650c-0352-aa0bb5a0e272.png)

これを実行したらセットアップの言語設定や契約の同意等が出てくるので、特に変更せずインストールを行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144614/ab68375b-f3af-45d9-fac2-8effc123b05b.png)

これが終わればTexWorksを開く。
ここから先は下記のリンク先に説明が載っているので、それを参照してpLatexが使えるように設定する。
https://texwiki.texjp.org/?TeXworks%2F%E8%A8%AD%E5%AE%9A#bcc74f23

これでTexファイルを作成できるようになっているはずである。LaTexのサイトを見て試しに実行してみよう。
アイドルグループが46か48かわからなくなったときにワンライナーで解決する方法

これをシェル芸と言い張っていいものかわからないが、カレンダーに空きがあったので入れさせてもらった。

# 本題
環境変数$idolにわからないアイドルの地名を入れると、人数を教えてくれる。

```bash
echo $idol`if [ \`echo $idol | grep "坂" \` ] ; then echo 46; else echo 48; fi` 
```

# ポイント
* バッククオートが2重になるので、内側はちゃんとエスケープする。
* 文字列が含まれているかどうかを検知するにはechoとgrepをパイプで使う。

# 使用例
https://wandbox.org/permlink/x7oh4QEVlRtkAfnT
Node.js boilerplate / Authentication from scratch - (express, graphql, mongodb)

![1*htOb7MGk4cXDpp4md_iHSQ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553366/742bc8b1-ba93-d667-5681-ba079accfbc0.png)

A boilerplate for Node.js apps / API server / Authentication from scratch - express, graphql - (graphql compose), mongodb - (mongoose).

https://github.com/watscho/express-graphql-mongodb-boilerplate :snowman2:
チームが継続的にカイゼンしていく話

:calendar_spiral: [i-plug Advent Calendar 2019](https://qiita.com/advent-calendar/2019/i-plug) の【18日目】の記事です:santa::tada:

4日目に[スクラム開発の話](https://qiita.com/yukke3duck/items/c197676d6d2337b4990a)を、12日目に[SQLの話](https://qiita.com/yukke3duck/items/4e869982cbfc767a32d9)をしました。

今日は、チーム活動におけるカイゼンの話です。

Qiitaに投稿しといてなんですが、エンジニアのチームに限らない話だと思うので、何かの間違いでここに辿り着いた非エンジニアの方も、回れ右せずご一読いただければ:pray:

言っても、私感によるものなので、「それ違くね？」「意味ワカラン」とかあればコメントくださいー

## １．執拗にカタカナで書くけど、そもそも「改善」と何が違うん？
wiki[^1]で調べてみました。
[^1]: https://ja.wikipedia.org/wiki/%E6%94%B9%E5%96%84

### 「改善」

```text
・誤りや欠陥、ミスを是正し、より良い状態にする事、行為。
```

### 「カイゼン」

```text
・日本の製造業で生まれた工場の作業者が中心となって行う活動・戦略のこと
・活動の内容は生産設備の改造や工具の新作、製作など業務効率の向上や作業安全性の確保、品質不具合防止など生産に関わる範囲全てにわたる。
・改善は上からの命令で実行するのではなく作業者が自分で知恵を出して変えていく事が大きな特徴
・改善は一度行ったら終わりではなく次々と改善を行っていく持続性、継続性が重視されている
```

**「改善」は良くするアクション自体**を指しますが、**「カイゼン」は自分達の仕事を自分達で「改善」し続けること**を指す、って感じかな
φ(￣ー￣ )ﾒﾓﾒﾓ

細かいことだけど、言葉の意味を知ると、捉え方が変わってきますねー

## ２．カイゼンすると何が嬉しいん？

- 同じ成果を、より短い時間で出せるようになる
- 同じ時間で、より多くの成果を出せるようになる
- 不具合を出しにくくできる
- 楽しく仕事ができるようになる

などなど。一言では表せないですね。

ざっくり言うと、**「自分達の仕事を、自分達で良くすることが出来る」**ですかね。

## ３．カイゼンはいつやるん？

**好きなときにやったらよいと思います！**

スクラムでは、スプリントの終わりにふりかえり（レトロスペクティブ）の場で、ということが多いと思います。
でも、ちょっと想像。

「ミーティングの時間長くて、実装の時間取れへんわヽ(\`Д´)ﾉ」
「チャット見落として、仕様が変わったのに気づいてなかった(´・ω・`)」
みたいな、ちょっといけてないの、次のふりかえりまで溜めたい？
ふりかえり、時間が足りなくならない？？

何をしたらよくなるか、が自明なことは、「いけてない！！」と思った時点でカイゼンしちゃいましょうー

## ４．カイゼンってどうやってやるん？

完全に私見ですが、実際にカイゼンする前に考えておいた方がいいと思うことがあるので、そちらから。

### チームの向き先を合わせる

**チームの目標とか、将来的に目指すチームの状態とかをメンバーで決めましょう。**

インセプションデッキやドラッガー風エクササイズを使うとよいと思います。

ただし、チームを取り巻く環境の変化（人の入れ替わり、メンバーの考え方の変化、会社のステージ、など）で、目指す場所は変わっていくものなので、一度決めたからって使い回すのではなく、陳腐化しないよう４半期毎とか半期毎に見直すとgood(￣ー￣)ｂｸﾞｯ!

### （ふりかえりなどの場を設定する場合）その場の期待・目的を、メンバー内ですり合わせる

ある人は「早く作業できること」にフォーカスをし、ある人は「同じ時間で成果を倍にすること」にフォーカスする...
微妙にベクトルズレてますよね？これだと、議論が噛み合わないことが出てきてもったいないです。
なので、**何を期待するのかは、ちゃんと決めておきましょう。**

また、すり合わせた内容は、定期的に確認しましょうね。

これも、陳腐化しないよう、４半期毎とか半期毎に見直すとgood(￣ー￣)ｂｸﾞｯ!

### 実践！

ここまで決めたら、カイゼンしていきましょう。
ふりかえりであれば、課題特定のためにKPTやYWTなどのフレームワークがありますが、実際にこうやったらみたいなフレームワークはありません。
「ここに課題を感じてて、こんなアクションしてみたいんやけどどうやか？？」と、メンバーに相談・実践しながら、どんどんカイゼンしていきましょう。

ただし、そのアクションで実際によくなったか、というのは定期的に観測するようにしましょう。
よくなっていれば、さらによくするためには、を考え、
よくなっていなければ、じゃあ理由と次にとるアクションを考えます。

こうやって継続してカイゼンを続けていくんですねー！

### 気をつけること

**カイゼンに必要なことは、絶っっっ対にメンバーで決めましょう。**
それも、誰かが決めたのを共有する、ではなくて、ちゃんと議論すること！

チームの一員でない誰かが決めたことは、他人事なので、チームの実情を把握できておらず、形骸化・陳腐化しやすくなります。
また、メンバーであっても、声の大きい誰かが決めたことは、その人の主観でのことなので、他の人にとっては、やっぱり形骸化・陳腐化しやすい恐れがあります。

### 気をつけることの気をつけること

とはいえ、会社やマネージャーからチーム/メンバーにかける期待や役割はあるわけで、ガン無視していいわけではないですよ。
あくまで期待や役割の上に、目標があって、その目標に向かってカイゼンするのです。
（そもそも期待・役割が納得できないなら、それはちゃんと伝えましょう）


## まとめ

「見たいと思う世界の変化にあなた自身がなりなさい」
－マハトマ・ガンジー[^2]
[^2]: https://www.ladea.jp/b-gandhi-sekai/
（個人用作業メモ）拡張eコマース - 一部項目を取得しないとGAのレポートでどう見えるのか？

#概要
- 拡張eコマースのタグで項目（ディメンション）を省略したらアナリティクスのeコマースレポートでどうなるか？
- 特に一覧画面の商品データについて。
- 完全個人用の実験メモ。需要はほとんどないと思うので羅列形式。クオリティ低め



#各ケースについて(仮説込み)
 - 「概要」レポートについて
    - トランザクション時に「product」「category」「brand」「coupon」「affiliation」「list」を送信しない（「商品sku」のみ送信する）場合、各項目で「(not set)」のデータになる
    - ▽イメージ
     <img width="733" alt="ecommerce-overview-product-coupon-code-not-set.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521810/5870153b-cef4-2fb7-dce0-afde3a393daa.png">

 - 「商品の販売状況」レポートについて
    - 送信しなかった拡張eコマースのディメンションはそのプライマリディメンション/セカンダリディメンションで(other)のデータになる
    - ▽イメージ
    <img width="562" alt="ecommerce-overview-product-coupon-code-not-set-as-secondary-dimension.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521810/521185da-d5e0-6968-6fda-651fc7afe77b.png">

 - 「商品リスト」のレポートまたはセカンダリディメンションについて
    - 「商品リスト」はあるが「商品」または「商品のsku」がない場合
        - 「商品リストの販売状況≫セカンダリディメンション『商品』(『商品のsku』)」が(other)のデータになる
    - 「商品」または「商品のsku」があるが「商品リスト」がない場合
        - 商品の販売状況≫プライマリディメンション『商品』(『商品のsku』)≫セカンダリディメンション『商品リスト名』」が(other)のデータになる
    - トランザクションの測定（購入完了画面）で、「商品」「商品のsku」「商品リスト」のいずれもあるが、商品インプレッションの測定（一覧画面）で「商品」または「商品のsku」がない場合
        - 「商品リストの販売状況≫セカンダリディメンション『商品』(『商品のsku』)」で、該当商品の「商品の決済回数」「固有の購入数」「商品の収益」は計測されるが、「商品リストの閲覧回数」は0になる。（？）
    - 商品インプレッションの測定（一覧画面）で「商品」「商品のsku」「商品リスト」いずれもあるが、トランザクションの測定（購入完了画面）で、「商品リスト」がある、かつ「商品」または「商品のsku」がない場合
        - 「商品リストの販売状況≫セカンダリディメンション『商品』(『商品のsku』)」で、該当商品の「商品リストの閲覧回数」は計測されるが、「商品の決済回数」「固有の購入数」「商品の収益」は0になる。（？）
        - .

---
何かあればお手数ですが、本記事か以下アカウントでお知らせください！

\ Follow Me! /
[Qiitaアカウント](https://qiita.com/MasatoEmata)
[Twitterアカウント](https://twitter.com/masatoemata)
流行語大賞と一緒に2019年のRPAを振り返る

#流行語大賞と一緒に2019年のRPAを振り返る

2019年、日本の流行語大賞はラグビーの「ONE TEAM」でしたね。チームにとって必要な選手たちを、国籍や新旧問わずに収集・まとめあげてチームを作り、彼らが「ワンチーム」になるまでの過程や、チームへの気持ちなどのストーリー性の上で「ONE TEAM」という言葉を定義付けていたそうです。正直、まったくラグビーを見ていなかったので「え？これが流行語？」と最初は思いましたが、この言葉の裏のストーリーを知ることで「あーいい言葉だなぁ。」という気持ちにさせられました。

リモートワークやパラレルワークなんて言葉をよく聞くようになってきた事が示す様に組織への所属意識は薄まり、メディアの形も多様化し、「個の時代」なんて叫ばれることもある昨今に、「個」を尊重した上で「ONE TEAM」となり、快進撃を遂げる？素晴らしい！「漫画ですか？」って位によくできたストーリーですね。そりゃあ、感動しちゃいますよね。

さて、前置きのポエムが長くなりましたが、私がこの記事で紹介したいのはつまりはこれです。ジャジャ~ン♪ #2019年RPA流行語大賞 ~!!

2019年にRPA界隈で流行った。もしくは、共通認識として広がっていた言葉やその文脈をこの記事で紹介させてもらうことにより、日本のRPA界隈の2019年のストーリーを知り、何かを感じて頂ければと思います。

なお、候補集めや投票はTwitter上で行いました。
詳しく見たい方は #2019年RPA流行語大賞 のハッシュタグを検索してみて下さい。

#ノミネート作品
それではまずはノミネート作品をご覧ください。
![コメント 2019-12-18 162936.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529627/8010dba3-8054-b103-6b6e-fff97df216ed.jpeg)

実に30個の流行語大賞候補が集まりました。

#集計結果
この中から一応投票を行いまして、この様な結果がでました。
![コメント 2019-12-10 215912.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/529627/2b99ab0e-eca3-c105-12b9-b24892b8cae6.jpeg)

１、	RPAダイエッター（９票）
２、	RPALT（７票）&　ガツミ（７票）
３、	RPA女子（６票）&　波動拳（６票）
４、	RPA幻滅期（５票）＆それ、マクロで良くね？（５票）
５、	Power Automate(４票)

…え。まさかRPAダイエッターが流行語大賞？
いや流石にね。Qiita警察に怒られてしまうので真面目に選びます。投票とは時に公正ではないのです。なぜなら皆、自分の所属しているものをひいきして選んでしまうからです。正しい判断を下せる人間が正しい判断を下すのが全体のためです（独裁者の思考回路）。

#そして、流行語大賞は...
**RPA幻滅期**
**それ、マクロで良くね？**
で決定！

選んだ理由としては個人の思いと関係ないところで挙がっているであろう候補だと判断したからです。

とは言っても個人の思いを無視するのはよくないですよね。人が関わっているからこその流行語大賞という事で、「流行語大賞あと一歩だったで賞」もいくつか選んでみました。
**RPALT**
**RPA女子**
**波動拳**
**Power Automate**
**AI OCR**
以上でしたー（パチパチ
本当におめでとうございます。

#ちょっと解説
まずは**それ、マクロで良くね？**ですが、これは主に2019年前半によく聞いた印象があります(あくまで個人的な...省略)。今でもよく聞く話ではあるかもしれませんが、結局RPAでやっている業務事体が、マクロなどでも実装できるし、ものによってはRPAより早い。という事があるので、使い分けましょうねーという文脈でよく議論されました。

次に**RPA女子**。これは株式会社◯◯◯◯さんが、女性の社会復帰だったり、家で子育てをしながらリモートワークで稼ぎたい女性を支援する。という文脈でN◯Kの朝の番組で紹介した事で広まったワードです。当時RPA人材の需給バランスが完全に売り手市場だった事もあり、未経験から始められるリモートワークとしては高待遇(?)が話題となりました。2018年後半から広まって2019年現在、周りを見ているとどうやらRPA をやっている女性でそう名乗りたい個人ならば誰でもそう名乗る。もしくは上司から勝手にそう形容される。といった類いのワードに変容してきていると感じます。

そして**RPALT**と**波動拳**ですが、この２つのワードはどちらも、ユーザーがRPAを楽しむという文脈で共通する所があると思います。2016年頃から大手コンサルティングファーム辺りの厚労(?) で日本で急速に広まり出したRPAですが、何しろバズワード。多くの企業が利用を開始したという事で多くのユーザーが誕生。コミュニティ活動も非常に賑わいました。RPALTというコミュニティは今全国に横展開していて、毎週日本のどこかしらでRPA のイベントが行われています。Twitter 上ではとある企業のRPA ユーザー(@RPA_Journey)さんがRPA ツールを利用して遊び心満載で作った波動拳がバズって、遊び感覚でRPAツールをいじりながら技術力を高めていくコアなユーザー会も生まれました。

**AI OCR** は今年の5月〜名前を見かける頻度が上がりました。6月辺りなんて展示会では大フィーバーしてたと思います。やっぱり未だに紙で上がってくるデータを手打ちして...といった企業が多く存在するので、「これが自動化出来れば凄い業務削減になる！」と期待感が大きいのでしょう。これについてはまだ議論が必要で、トライアルでつまづいて進めなかったり、「いや、まずはその予算で電子化してみよう」という所に行き着く企業もいたりで今年の5月位に比べると12月現在やや下火？いやそれでも潜在的な期待感は大きいのかな。という印象です。

**Power Automate** は2019年11月にマイクロソフトがRPA製品として発表して、とりあえず瞬間風速的には大フィーバーしました。発表があった日のTwitter はその話で持ちきりでしたね。来年、この製品がどうなるのか？そもそもどんな製品？という事は、Google やApple はどうこの分野に絡んで来る？などザワザワしました。

最後に**RPA幻滅期**ですが、これはアドベントカレンダー初日でも紹介されていたのと、みんな知っていそうなのと、文章がだらだら長くなってきた関係上省略。でも、最近どこでも聞きますね。

以上です。

#最後に
一応来年のも予測しときます。
えーと、では**BPM**と、**それ、APIで良くね？**が流行るかも！（思いつきです

Thank you for reading!!
uGUI上にParticleを表示させたい

#最近見つけた便利なアセットを紹介します

####uGUI上でパーティクルを表示するアセット
ParticleEffectForUGUI
https://github.com/mob-sakai/ParticleEffectForUGUI

通常、uGUIとParticleSystemを同じ画面で表示させると、uGUIの描画が上になってしまって、ParticleSystemが後ろになってしまいます


このパーティクルが・・・
![コメント 2019-12-18 162038.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255761/36116eb8-3126-73dc-b107-766348351360.jpeg)

uGUIより後ろになってしまう
![コメント 2019-12-18 183712.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255761/4486c90a-a011-297c-ad19-78dd078ecd4c.jpeg)

Hierarchyの順番もParticleが上になっている
![コメント 2019-12-18 183723.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255761/9d4d8372-9fac-acdb-473a-431ccfbbf6e0.jpeg)

そこでこの 「[ParticleEffectForUGUI](https://github.com/mob-sakai/ParticleEffectForUGUI)」を使うと、uGUIの上にParticleSystemを表示させることが出来ます


##使い方
https://github.com/mob-sakai/ParticleEffectForUGUI/releases

1.こちらからunitypackageを落としてProjectにインポートします

2.UI上に表示したいParticleSystemがついたGameObjectにUIParticleをつけます。以上
あとはUIParticleのScaleをいい感じに調整したら終わりです



分かりやすいように色変えました
![コメント 2019-12-18 185229.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255761/11c8e7d5-47f2-4b05-5c57-cc4a854f8d7a.jpeg)

簡単にuGUI上にParticleが表示できるので便利です

参考サイト
http://baba-s.hatenablog.com/entry/2018/08/20/090000
https://github.com/mob-sakai/ParticleEffectForUGUI
asyncを使用したコードをjestでテストすると「regeneratorRuntime is not defined」エラーが発生

# 確認環境
- Node.js: 10.16.0
- Jest: 24.9.0
- @babel/core: 7.7.5

# エラー内容

jestでテスト実行すると、asyncの記述の部分で、以下のようなエラーが発生しました。

```
    ReferenceError: regeneratorRuntime is not defined

       9 | }
      10 | 
    > 11 | const main = async () => {
         |              ^
```

# 対応

.babelrcにて、babelのターゲットを指定することで解決しました。
変更前：

```Javascript:.babelrc
{
  "presets": [
    "@babel/preset-env"
  ]
}
```

変更後：

```Javascript:.babelrc
{
  "presets": [
    [
      "@babel/preset-env", {
        "targets": {
          "node": "current"
        }
      }
    ]
  ]
}
```

以上。
必要な文だけが欲しい！ときに使う正規表現

大量のSQL文からcreate文だけ抜き出したいというとき用

>**^(?!.＊抜き出したい文の先頭の単語).＊\r\n**


解説
^:行の先頭
?!:否定的先読み
＊:0文字以上の繰り返し
\r\n:テキストの改行


抜き出したい先頭の単語にcreateを入れるだけでした！
という記事。
JavaScriptで日本語DSLを作る

#概要
普段のプログラムを[逆ポーランド記法（後置記法）](https://ja.wikipedia.org/wiki/逆ポーランド記法)で書きたいとは思いませんが…
プログラミングに明るくない方に簡単なスクリプティングのようなことをしてもらう必要がある場合、日本語の識別子、日本語の語順（≒逆ポーランド記法）の[DSL](https://ja.wikipedia.org/wiki/ドメイン固有言語)を用意できると便利なこともあるかもしれません。
というわけで何個目の車輪か見当も付きませんが作ってみました。
<p class="codepen" data-height="265" data-theme-id="default" data-default-tab="js,result" data-user="shinji709" data-slug-hash="zYxNBpP" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="rpn">
  <span>See the Pen <a href="https://codepen.io/shinji709/pen/zYxNBpP">
  rpn</a> by shinji (<a href="https://codepen.io/shinji709">@shinji709</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

#逆ポーランド記法(後置記法)について少し
2つの引数をとり加算結果を返す加算演算子`+`を考えたとき、呼び出しの際`+ 1 2`などと関数を引数より前に置く記法を前置記法、`1 + 2`などと引数と引数の間に置く記法を中置記法、`1 2 +`などと引数の後ろに置く記法を後置記法といいます。
後置記法では`1と2を足す`と自然と読み下すことができ、日本語と相性がいいです。中置記法と違い計算順序が一意に定まりカッコが要らないなど他の利点もあるようですが、本トピックで逆ポーランド記法を採用するのはこの理由だけです。

#コード主要部の説明
主要な部分は以下7行だけです。（続けて四則演算の単純な使用例も付記しています）

```JavaScript
const createRpn = dictionary => words => words.reduce((acc, word) => {
  if (word in dictionary) {
    return acc.concat(dictionary[word](...acc.splice(-dictionary[word].length || Infinity)));
  } else {
    return [...acc, word];
  }
}, []);
// 以下使用例
// 辞書の定義
const dictionary = {
  足す: (a, b) => Number(a) + Number(b),
  引く: (a, b) => Number(a) - Number(b),
  掛ける: (a, b) => Number(a) * Number(b),
  割る: (a, b) => Number(a) / Number(b),
};
// DSL処理関数の生成
const rpn = createRpn(dictionary);
// サンプルDSLコード
const code = `
  3 4 足す
  8 5 引く
  割る
`;
const codeArr = code.trim().split(/\s+/);
console.log(codeArr);
//=> ["3", "4", "足す", "8", "5", "引く", "割る"]
// 中置記法で書くと(3 + 4) / (8 - 5)ということ
// 処理
const result = rpn(codeArr);
console.log(result);
//=> [2.3333333333333335]

```
DSL内の識別子をキー、その関数実装を値として持つオブジェクト、dictionaryを取り、コードを配列として取って結果を返す関数を返します。

処理時は、受け取ったコード（文字列の配列）をreduceにより先頭から順に処理していき処理結果としての新しい配列を作ります。
文字列が辞書に定義されていなければ、文字列をそのまま結果配列に入れていきます。
文字列が辞書に定義されている単語であれば、その実装関数の仮引数の個数(Function.prototype.lengthにより取得)分の要素を結果配列からpopし（popは使ってませんが…）、それを引数として実装関数を呼び出し、戻り値を結果配列に入れます。

実装にあたっては[プログラミング言語Forth](https://ja.wikipedia.org/wiki/Forth)をほんの少し参考にしています。
「ほんの少し」というのは、「ほとんどオレが考えたんだぜ」というのではもちろんなく、せっかく参考にさせていただいたが本家の足元にも及ばないという意味です。念の為。（ちなみにwordとか、dictionaryというのはforthの用語です）

#UIコード部の説明
主要コード部以外はほぼUIコードです。
コード入力エリアのonchangeで実行しようと思ってましたが、サンプルコードにユーザー入力を入れた関係でいちいち実行ボタンを押す形式に変更しました。
コード入力エリアの右にはdictionaryオブジェクトに定義されている単語を列挙し、ボタンを押すことでカーソル位置に単語を挿入できるようにしています。もちろん直接入力でもいいです。またPCであればボタンホバーで各単語の実装がツールチップで表示されます。（横着してtitle属性を使いました）

#まとめ・感想
思っていたより簡単にできました。JavaScriptのコードで言う、`foo();bar();baz()`とか、`foo(bar(baz()))`などの単純な呼び出しのみの処理だからですね。
制御構造を入れだすととたんに難しくなりそうな気がしますが、追々挑戦していきたいです。
JavaScriptはライブラリが充実していてけっこう何でもあるので今回のコード利用して色々日本語DSL作ってみたいですね。まあ、自分では使わないんですけどね。
（今回のサンプルでは、"D"SLっていうけど一体どんなドメインなんだ？というようなしょうもないdictionaryですみません。思いつかなかったんです…）
以上です。
質問、追記・修正要請あればコメント欄にお願いします。
githubでadd,pushしてからbranchをきって再び作業を始めるまで


※自分用としてまとめたものです。

#add,push

作業が一段落したらすぐaddしてpushすること。

```
$ git branch //自分が今いるブランチを確認
$ git status　//自分の変更箇所を確認
$ git add .　//変更箇所すべてaddする！（＊１）
$ git commit -m "コミットメッセージ"　//変更をコミットする
$ git push
$ git status　//変更が反映されたか確認
```


間違えた、、、とならないように、自分がいるブランチの確認、変更箇所の確認はたくさんする。
addに関して、特定のファイルのみaddしたい時は、"　.　"ではなく"　ファイル名　"とする。（＊１）
pushしたあともきちんと反映されたか、git status　で確認！

#pull repuest　,marge

管理者にプルリクを送ってマージしてもらおう。

<img width="510" alt="スクリーンショット 2019-12-18 17.25.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460991/effae659-0bb6-a0bc-531a-050dc4804b0a.png">

まずはPull request と表示された部分をクリック。

![スクリーンショット 2019-12-18 17.30.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460991/563af86b-dff3-d5ac-fb74-dc7fb0c778d1.png)

ここはしっかり確認して自分のブランチ→developとなるようにする。

![スクリーンショット 2019-12-18 18.05.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460991/61872a0c-2a6c-22b6-5c8e-27818c55478d.png)

Create pull request ボタンを押せばプルリクを送れる。
コンフリクトがなければ、あとはマージしてもらうだけ！

#新しいfeatureブランチをきる

マージしてもらえたら最新のdevelopから最新のブランチをきっていく。

```
$ git checkout develop //developに移動
$ git branch //きちんと移動できたかここでも確認
$ git fetch --prune //自動でリモートにないブランチをローカルから削除
$ git pull 
$ git pull --rebase origin develop //自分のdevelopが最新になる
$ git flow feature start 新しいブランチ名　//featureブランチをきる
$ git flow feature publish 新しいブランチ名　//リモートに反映させる
```

これで新しいブランチをきることができ、また新しい作業を始めることができる。
~~なんでpull２回しているかはわからない。~~

#ブランチをきった後にdevelopが更新されたとき

更新された内容をプルせずそのままにしておくと、マージした際にコンフリクトが起こってしまう。
そうならないために

```
$ git pull origin develop
```

こまめにプルをする。
【ATGC率計算】特定長DNA配列データから各塩基のATGC率を計算する。ヌクレオソーム配列解析など。

#DNA配列のGC含量
GorCの塩基を多く含むDNA配列は比較的柔らかく、AorTの塩基を多く含む配列は硬いと言われている。
このことから、DNA配列のGC（AT）含量はヌクレオソーム形成などの物性の考察に有用であると考えられている。

##ヌクレオソーム配列などの特定長配列でのGC含量計算
例えば、
「
DANPOS2(https://sites.google.com/site/danposdoc/ )でヌクレオソーム配置を予測
→ bedtools getfasta(http://kazumaxneo.hatenablog.com/entry/2017/07/23/213505 )でヌクレオソーム配列の取得
→ FASTA形式 147bp ヌクレオソーム配列群データ
」

この配列群の各場所（各塩基）でのATGC率を計算して、ヌクレオソーム親和的な配列特徴を探りたい。とか。


##つまり
特定長（この例だと50bp）のFASTAファイルを

```text:hoge_50bp.fa
>chr1:765821-765871
ttttctggaattctttgattgataattttttcttctcagtcttttatctt
>chr1:766223-766273
catgGTGCATCCTCCTGTTGACTCCTGACCATCTGTTCACATGgggctgc
>chr1:793081-793131
CGGCTTCCCAGCGAAGGTTTTTGAAGCACGGTTTGATTTTCTCTCTCCCC
>chr1:793465-793515
ACCTGCTGGTGGCAGTGATCTGACCGCTGTTTAAGCTTTCTTTGAACTCC
>chr1:1582152-1582202
tggttcttctctctgagcagcttgagtatgccactccactgccttctggc
・・・(配列数いくらでも)
```

こうしたい。（配列方向は縦　上流→下流）

```
A T C G
0.301 0.306 0.194 0.199 　　　　#１番目塩基
0.296 0.307 0.185 0.212 　　　　#２番目塩基
0.309 0.287 0.23 0.174 　　　　 #3番目塩基
0.329 0.289 0.188 0.194 　　　　#4番目塩基
0.317 0.31 0.183 0.19 　　　　  #5番目塩基
0.299 0.291 0.205 0.205 　　　　#6番目塩基
0.284 0.325 0.196 0.195 　　　　#7番目塩基
・・・(今回なら50行)
```

#ワンライナー
awkで２次元リストを使う暴挙。便利です。

```bash:bash

cat hoge_50bp.fa | grep -v ">" | tr '[a-z]' '[A-Z]'| awk '{for(i=1;i<=length($0);i++){a[i,substr($0,i,1)]+=1}}END{OFS=" ";for(j=1;j<=length($0);j++){n=a[j,"A"]+a[j,"T"]+a[j,"C"]+a[j,"G"];print a[j,"A"]/n,a[j,"T"]/n,a[j,"C"]/n,a[j,"G"]/n}}'

```

##初心者用コード解説
cat →　FASTAファイル全体表示
grep -v　→　">"のない行を検索
tr →　小文字を大文字に変換

awk内部
a[i, substr(\$0,i,1)]++　→　先頭から１塩基ずつ切り取って、その場所（i）のその塩基(substr($0,i,1))をカウント
n　→　ATGCの割合にするために、個数の合計を計算。print時にこれで割る。

以上。
【iOS】サポートバージョンを上げた時にやったこと

# 概要
アプリを長い間開発していると、必ず生じるサポートバージョン問題。
そんなサポートバージョンを上げた時にどこを変更するのか忘れそうなので
備忘録的な意味合いも兼ねて更新したいと思います。

## iOS Deployment Target
まぁ、これは言わずもがなですね。
ここで内部的には判定されているものと思われます。

## @available属性
旧バージョンに対応していた場合、新しいOSでしか対応していないAPIを使う際には
@available属性などで条件分けして実装していたと思います。
これが必要なくなります。

```swift
@available(iOS, [version], *)
```

[version]の値が今回のサポートバージョンに含まれている場合は
消してしまって問題ありませんので消してしまいましょう！

また、この表記がある場合、この[version]に満たないバージョンで
代わりに呼ばれるメソッドがあるはずなので、そちらも消してしまいましょう！

[2020/02/14 14:30追記]
## systemVersionによるチェック

```swift
UIDevice.current.systemVersion
```

によるチェックも可能なので、こちらの判定も見直しましょう。

[ここまで]

## Podfile
忘れがちなのが、これではないでしょうか。
~~(今回この記事を書いたのは、これを忘れてたからです。）~~

```
platform :ios, "9.0"
```

みたいな表記があると思うので、これを今回サポートするバージョンへと変更して
`pod install` を叩きましょう。
多くの場合は、ほぼほぼ変更点はない(checksumのみ）と思います。

他に皆様でやったことがあれば教えていただけると嬉しいです！

誰かのお役に立てば。
PythonでFX(forex)データのローソク足(candle stick)表示

# 概要
[このサイト](https://www.histdata.com/download-free-forex-historical-data/?/ascii/1-minute-bar-quotes/eurjpy/2019/11)にあるFXのデータを、ローソク足表示させます。

# 環境
* Python 3.6 on Anaconda
* Jupiter notebook

# とりあえず株価データを表示するサンプルを動かす
表示に関しては[この投稿](https://qiita.com/toyolab/items/db8a1e539d4f995079d5)がより詳しく書いてあります。
[ここのサイト](https://plot.ly/python/candlestick-charts/)のサンプルそのままに表示させます。

```python:fig.py
import plotly.graph_objects as go

import pandas as pd
from datetime import datetime

df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/finance-charts-apple.csv')

fig = go.Figure(data=[go.Candlestick(x=df['Date'],
                open=df['AAPL.Open'],
                high=df['AAPL.High'],
                low=df['AAPL.Low'],
                close=df['AAPL.Close'])])

fig.show()
```

以下のように表示されました。
![newplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485117/c62995db-3ff0-8762-4504-30ef90f7d5ac.png)

# FXのデータを表示
[このサイト](https://www.histdata.com/download-free-forex-historical-data/?/ascii/1-minute-bar-quotes/eurjpy/2019/11)のHISTDATA_COM_ASCII_EURJPY_M1_201911.zipを表示させてみたいと思います。
そのためにまず、zipファイルの中身をpd.DataFrameに変換します。

``` python
import pandas as pd
from zipfile import ZipFile
ascii_minute_names = ["datetime_str", "Open", "High", "Low", "Close", "Volume"]
ascii_minute_datetime_format = "%Y%m%d %H%M%S"

with ZipFile("HISTDATA_COM_ASCII_EURJPY_M1201911.zip", 'r') as z:
    with z.open("DAT_ASCII_EURJPY_M1_201911.csv") as f:
        df = pd.read_csv(f, names=ascii_minute_names, sep=";")
        df["datetime"] = pd.to_datetime(df.datetime_str, format=ascii_minute_datetime_format)
        df = df.set_index("datetime")
        del df["datetime_str"]

print(df.head())

"""
output:
                        Open     High      Low    Close  Volume
datetime                                                       
2019-11-01 00:00:00  120.599  120.601  120.595  120.598       0
2019-11-01 00:01:00  120.597  120.598  120.592  120.595       0
2019-11-01 00:02:00  120.597  120.603  120.597  120.601       0
2019-11-01 00:03:00  120.600  120.600  120.592  120.598       0
2019-11-01 00:04:00  120.597  120.603  120.593  120.597       0
"""
```

表示ぃ！　※データが大きいので実行時間かかります。

``` python
import plotly.graph_objects as go

import pandas as pd
from datetime import datetime

fig = go.Figure(data=[
    go.Candlestick(
        x=df.index,
        open=df.Open,
        high=df.High,
        low=df.Low,
        close=df.Close
    )
])

fig.show()
```
以下のように表示されました。

![newplot (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485117/6bf2d64d-478e-5191-5237-49c20dfaa53c.png)

以上！
mongoimportでCSVインポートした時にハマった話

# ざっくり
import自体は正常終了していた事もあり、プログラムばかり疑ってデータを見るのが遅れた。
コマンド実行の際、フィールド定義を同時に行う場合にはスペースに気をつける。
特に白背景のGUIのクライアント使ってるとフィールド名の空白には気付きにくい！(白目

#やりたかった事
* mongoimportでCSVから50万件程度のドキュメントを追加したかった。
* CSVには単純にデータのみが入っていて、列定義はコマンド実行時に行う。

#ここで困った
* importは無事終了。
* プログラムからドキュメントを取得して、参照している処理がうまく動いていない・・。
* 必要な値が取得出来ていない。でも、DB見るとありそう・・なんで？

# 原因
例として、CSVの内容はこんな感じ。

```sample.csv
1,"abc"
2,"def"
3,"ghi"
```
で、プログラムではこのCSVの１列目を"no"、２列目を"value"みたいなフィールド名でインポートしたコレクションから、ドキュメント単位で取得して扱う前提。

・・だったのに、実際取得してみると"value"の値が取得出来ない。
プログラムでフィールド名と変数のマッピングが上手く行っていないのかとか迷った挙げ句、importした時のフィールド定義に原因があった。

```
誤)
mongoimport --host <host> --port <port> --username <user> --password <pass> --db <dbname> --collection <SAMPLE_COLLECTION> --type csv --columnsHaveTypes --fields "no.int64(), value.string()" --file sample.csv
正)
mongoimport --host <host> --port <port> --username <user> --password <pass> --db <dbname> --collection <SAMPLE_COLLECTION> --type csv --columnsHaveTypes --fields "no.int64(),value.string()" --file sample.csv
```

どちらもインポート自体は上手く行くんですが、誤っている方のコマンドで生成されるフィールド名はそれぞれ"no"と" value"です。
"value"を期待してるのに" value"じゃそりゃ無理ですよね。
一部フィールドの値が入っていないのかと$existした時に結果がおかしかったので気づけました。
(白背景のGUIクライアントで見ていると気づきにくい・・。)

以上、「カンマの後にはスペース一個」が癖になっていた事が招いた悲劇でした・・。