OmniAICreator/Qiita-1.07M huggingface dataset:
ADDA > tool  > ADDA_pySpherepts_171217 > to obtain [beta_gamma.tbl] 

```txt:Environment
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
```

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).

### Link

- [ADDA > tool > loop_beta_gamma_171216.py > v0.1-v0.3 > run sequentially ADDA for different values of [beta] and [gamma] for orientations by Euler angles ([alpha] is fixed as 0.0)](https://qiita.com/7of9/items/5c52189aba265d4c9d09)

### About

In the [loop_beta_gamma_171216.py] of the above link, [beta_gamma.tbl] is used.
The table can be obtained using the tool shown below:

[ADDA_pySpherepts_171217 @ GitHub](https://github.com/yasokada/ADDA_pySpherepts_171217)

### Example plot

For Hammersley Nodes, see [this Jupyter notebook](https://github.com/yasokada/ADDA_pySpherepts_171217/blob/master/plot_beta_gamma_171217.ipynb).
ElasticSearchを使った分析ツールをちょっと作ってみた


皆さん！明日はクリスマスですね！
僕は漢友達と風呂入って酒飲んでます（#^ω^）

ハンズラボAdvent Calendarも23日目。残す所2日となりました。
エンジニアの@Yuki_BB3です。

ラボに入社してはもう2年も経ってしまいました。最近は代謝が落ちたせいか体重が気になってきています。
歳かな。

ラボでは東急ハンズのポイントシステムに関わる仕事をしています。nodejsを使ってAPI作ったり、データベースおじさんしていたりします。
主にデータベースおじさんしています。

_もうお兄さんじゃなくておじさんになってしまいました。 つらい_

今日の記事、何を書こうか直前まで迷っていたのですが、最近自分の中でアツい `ElasticSearch` と `Kibana` について書きたいと思います。

# ElasticSearch
現在、ポイントシステムでも ElasticSearchは使用しているのですが、可視化や分析のためではなく、DynamoDBと連携してあいまい検索が出来るようにすると言った用途がメインです。

ElasticSearchの用途をぐぐるとKibanaと組み合わせてログの可視化なんかがよく出来てきますね。

__「Kibanaちょっと使ってみたいなー、でもログ解析しても別に楽しくはないしな−」__

と思っていました。

_思っていて、閃いた。_

__「・・・購買履歴って要はログじゃね？」__

運用上、あると便利なので作ってみることにしました。
その上で躓いたことをつらつらと書いていきます。

# 連携データ
連携データの元はDynamoDBに保存されています。

![スクリーンショット 2017-12-21 14.59.37.png](https://qiita-image-store.s3.amazonaws.com/0/52141/a929cd6a-d35d-a56c-d404-d3ffed90a16f.png "スクリーンショット 2017-12-21 14.59.37.png")

こんな感じに、全てのデータは最終的にDynamoDBにホストされます。

![スクリーンショット_2017-12-21_15_02_06.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/45e150ed-a646-b9aa-13f6-8c96fb5e95ff.jpeg "スクリーンショット_2017-12-21_15_02_06.jpg")

DynamoDBに挿入されたデータは `DynamoDB Streams` をを用いて各種AWS Lambdaが起動し、各々次の処理へデータが渡されます。

![スクリーンショット_2017-12-21_15_12_27.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/f6290d71-4bbd-2379-4e2d-5d679ebabeae.jpeg "スクリーンショット_2017-12-21_15_12_27.jpg")

そこで、Streamに新しい処理を追加してデータを投入することで特に何も弄ること無く、データを可視化する環境を構築します。


__ところで、可視化とかなんとか言われると地図上にデータをプロットしてドヤ顔したくなりませんか？__

個人的には可視化って言うとそんなイメージしか無いんです

![スクリーンショット_2017-12-21_15_17_22.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/b08bf3c3-a35e-b099-df89-812b3b8e238c.jpeg "スクリーンショット_2017-12-21_15_17_22.jpg")

# ElasticSearch -Mapping-
ElasticSearchは各項目がどういったものなのか（文字列なのか、数値なのか、日付なのかなど）を規定するMappingといったものを定義します。
地図上にプロットしたかったので、経度・緯度を使用したいのですが、流れてくるデータにはそんなものはついていません。
そこで、Lambdaで処理をする際に場所に応じて位置情報を付与して投入することにしました。
(今回はお店の位置なので腹持ちでJSONを用意し変換しています)

```json:mapping.json
{
  "mappings": {
    "type01": {
      "properties": {
        "id": {
          "type": "keyword"
        },
        "date": {
          "type": "date",
          "format": "yyyy-MM-dd'T'HH:mm:ss"
        },
        "location": {
          "type": "geo_point"
        }
      }
    }
  }
}
```

一部のみ抜き出したサンプルですが、このような感じです。
- 
- 日付は、`20171223T10:00:00`という形で入力されれば日付として認識するという設定 
- 地図データはgeo_pointとして指定します。入力時は `[139.709, 35.697] ` `経度,緯度` の順番で入力することで座標として利用することが出来ます。

_注意としては、緯度と経度を逆に送ってしまうと何も表示されなかったりエラー吐くので気をつけて下さい。_

![スクリーンショット_2017-12-23_9_23_57.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/83e4c38b-e7b3-6036-d1a6-7df7763b149a.jpeg "スクリーンショット_2017-12-23_9_23_57.jpg")

成功するとこんなかんじでデータが投入されているのを確認できます。

![スクリーンショット 2017-12-23 9.24.32.png](https://qiita-image-store.s3.amazonaws.com/0/52141/4cca584e-463f-945e-7e1a-e94d8626bd2e.png "スクリーンショット 2017-12-23 9.24.32.png")

目標だった地図上へのプロットが出来ました！

地図へのプロットは正直どうでもよくて、リアルタイムにどんなデータが来ているのかを確認することができれば、DynamoDBのキャパシティをより良い値で設定出来ると思い作成したツールでした。

このくらいの事なら一人でちょこちょこやってれば作れてしまうのでいい時代になったんだなぁと感じる年の瀬です。

明日は、@yuka_jyotei さんの担当日。
そしてクリスマス・イブ
Rails + React で開発していて起動に失敗するときにとりあえず思考停止で試すこと

エラーメッセージがあるならちゃんと読みましょう。
わっかんねー、なら以下で解決するかも。

backend 側でエラーが起きる場合は、以下

```sh
$ spring stop
```

frontend 側でエラーが起きる場合は、以下

```sh
$ killall -9 node
```

これでダメなら

```
$ lsof -i:4000
COMMAND     PID  USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
Google     2275 Shumo  132u  IPv4 0xe095762ac8180dc3      0t0  TCP localhost:61765->localhost:terabase (ESTABLISHED)
node      85456 Shumo   12u  IPv4 0xe095762ac88c5bd3      0t0  TCP localhost:terabase (LISTEN)
node      85456 Shumo   15u  IPv4 0xe095762acc972dc3      0t0  TCP localhost:terabase->localhost:61765 (ESTABLISHED)

$kill -9 85456 # node のプロセスを削除
```

DB でエラーが起きる(mysql が start しない)とかなら、

```bash
$ killall mysqld
```


もしも foreman とか使っているのならば、それが原因のこともあるので原因をまずは切り分けましょう。
ただ Desktop Notification するだけのコマンドを作った話

# ある日

```ps1
PS> yarn build

yarn run v1.3.2
$ yarn install
[1/4] Resolving packages...
success Already up-to-date.
$ webpack --config webpack.config.js
...
```

...

...

...

( 長いな。ちょっとインスタでも更新しようか。 )
ブラウザに移動。

...

[ 20分経過 ]

... あ、ビルドしてたの忘れてた。

が多いので、終わったら通知したかった。
ちなみにインスタはやったことない。

# デスクトップ通知

調べてみると、案外あった。

- Linux
    - notify-send
- Mac
    - [terminal-notifier](https://github.com/julienXX/terminal-notifier)
    - growl + growlnotify
    - [12/26 追記] [Alerter](https://dev.classmethod.jp/etc/osx-alerter/)
- Windows
    - growl for windows + growlnotify

クロスプラットフォームでは、[node-notifier](https://github.com/mikaelbr/node-notifier) などがある。

でも、**クロスプラットフォームかつワンバイナリなやつ** が欲しい。

# Hi

それで、Hi というコマンドを作った。

[kentork/hi](https://github.com/kentork/hi)

クロスプラットフォームと言いながら、 Circle Ci のビルドでコケているので手動で上げた Windows バイナリしかない。

## 開発

- Go 1.9

初めは、[これを使おうと思った](https://github.com/0xAX/notificator) が、外部ツールに依存しているっぽくて動かなかった。

なので、[こっちを使った](https://github.com/martinlindhe/notify)。標準の通知を使えるので出せた。

実際に作ったものは、これを 薄ぅーく ラップしただけのもの。

```go:main.go
package main

import (
	"os"
	"runtime"

	"github.com/martinlindhe/notify"
	"github.com/urfave/cli"
)

func main() {
	app := cli.NewApp()

	app.Action = func(c *cli.Context) error {
		appname := "hi"
		if runtime.GOOS == "windows" {
			// 理由は後述
			appname = "{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\\WindowsPowerShell\\v1.0\\powershell.exe"
		}

		title := "hi"
		contents := "there"

		if len(c.Args()) >= 2 {
			title = c.Args().Get(0)
			contents = c.Args().Get(1)
		} else if len(c.Args()) >= 1 {
			title = "hi there"
			contents = c.Args().Get(0)
		}

		notify.Notify(appname, title, contents, "dorobou_jikan.png")
		return nil
	}

	app.Name = "hi"
	app.Version = "0.1.0"
	app.Usage = "desktop notifier"
	app.Run(os.Args)
}
```

```
hi [title] [contents]
```

● i.e. ビルドを待って通知

```
go build; hi go complete
```

![hi.gif](https://qiita-image-store.s3.amazonaws.com/0/20198/ee4e0135-f2d2-3cc5-6ee0-88cb87c2e25d.gif)

出た。
あれ？ 何か表示がおかしい…

## Fall Creators Update

数ヶ月前に Windows に適用された Fall Creators Update で、どうやら Notification API に大きな変更が入ったらしい。

[No Notification is shown](https://github.com/go-toast/toast/issues/9)
[Notification API do not work with Windows 10 16299.19 (fall creators update)](https://github.com/electron/electron/issues/10864)
[Fall Creators Updateを適用するとトースト通知できなくなる](https://qiita.com/akiqsinco/items/0c0d5ae4abc756a594b3)

原因は、AppID を渡さないといけないとのことで、それには対応しているんだけど、タイトルやコンテンツが上手く書き換わらなかった。

もう少し触ってみて、どうしようもなかったら独自で実装しよう。

# もっとやりたい事

- 特定コマンドでの監視から、状態変化後に通知
    - `docker run -d postgres` とかやると、コマンドは終わってるけど内部でデータ復元とかしてて、アクセスできなかったりする
    - `webpack --watch` なんかでビルド終わったことを、ファイル更新時間の監視とかで通知して欲しい
        - webpack-build-notifier みたいなのではなく、汎用的に
Linux のディスクの fstab に書くときに UUID 指定するとディスク認識の順番が変わらなくていいって話

最近リブートしたらディスクを認識する順番変わって起動しなくなったりしてとても辛い思いをしたのでメモです。

こうなっているとする。

```
$ ls /dev/xvd*
/dev/xvda  /dev/xvda1  /dev/xvdb  /dev/xvdb1
```

そこでこう書いたとします

```:/etc/fstab
/dev/xvdb1       /data    ext4   defaults        0 0
```

ディスクの認識順序次第ではルートパーティションのマウントで失敗して起動に失敗したりします。

そこで UUID を使います。
こんな感じで調べる。

```
$ ls -l /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 11 Dec 17 10:48 512611f4-b05a-4d8a-b743-438b71c5385d -> ../../xvda1
lrwxrwxrwx 1 root root 11 Dec 21 23:50 60ce48f4-6e5c-4670-9fb5-69b181c3288c -> ../../xvdb1
```

もしくは

```
[wnoguchi@lasthope ~]$ blkid
/dev/sda1: UUID="1f2c5158-eda4-4c4f-b8e2-cacfeceb643d" TYPE="ext4" PARTUUID="7558d7f0-02"
/dev/sda5: UUID="cdd9a756-e518-49a0-a4f9-4d761fcdf48e" TYPE="swap" PARTUUID="7558d7f0-07"
```

そしてこう書く。

```:/etc/fstab
UUID=60ce48f4-6e5c-4670-9fb5-69b181c3288c       /data    ext4   defaults        0 0
```

```
sudo mount -a
```

```
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            2.0G     0  2.0G   0% /dev
tmpfs           396M  5.6M  390M   2% /run
/dev/xvda1      7.7G  3.6G  4.2G  46% /
tmpfs           2.0G  4.0K  2.0G   1% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/xvdb1       99G   60M   94G   1% /data
tmpfs           396M     0  396M   0% /run/user/1000
```

(ﾟдﾟ)ｳﾏｰ
AWSの料金支払い漏れでアカウントロックされた話

個人で使っていたAWSアカウントで支払い漏れが2か月続いたためアカウントロックされてしまいました。
その解除手順を載せておきます。

## なぜ支払い漏れが発生していたのか
結婚をし、自分の苗字が変わりました。
苗字が変わると色々大変で、**クレジットカードも再発行になります。**
クレカ番号が変わるわけなので、クレカ情報を登録しているサービスは全部登録しなおしです。

一通り利用していたサービスは登録しなおしたつもりでした。
当たり前ですが、AmazonとAWSはクレカの情報を共有しているわけではありません。
Amazonでクレカ変更してやった気になってAWSのクレカ変更を忘れて今に至りました…。

メールでお知らせも来てたはずですが、それも見逃してました。

## どうやって検知したのか
AWSが使えなくなったのがわかったのが以下の記事の最終チェックをしていた時でした。
[sshログイン時にAWSの料金を表示させる](https://blog.haramishio.xyz/post/000025/)

**AWS料金ネタをやってたときに支払い漏れが発生したのが笑えます。**

で、AWS CLIでCloudWatchのGetMetricsが使えなくなってました。
AWS CLIでは以下のようなエラーが出てました。

```bash
An error occurred (InvalidClientTokenId) when calling the GetMetricStatistics operation: The security token included in the request is invalid.
```

最初はIAMを間違えて消してしまったのか？とかアカウント乗っ取られた？そんなバカな…と思って
AWSにログインしてみると…

![aws_billing.png](https://qiita-image-store.s3.amazonaws.com/0/152303/5f9d31a8-76e2-6708-d2e6-39060a5053af.png)

>Amazon Web Services Sign In
>This AWS account is not accessible. If you just signed up with AWS, please try again at a later time.
>
>Please contact our customer service team for assistance.

！？！？！？！？！？！？！？！？！

この画面からサポート画面に飛ぶことができ、ログインできているのは確認できます。
ここで「もしかしたら支払い漏れてるんじゃね？」と気づき、支払い履歴を見たら

![aws_billing2.png](https://qiita-image-store.s3.amazonaws.com/0/152303/5708a926-8f54-9f30-c06a-4f9201d0fa48.png)

すみませんでしたーーーーっ！！！

## 対処方法
上記画面の下に「今すぐ支払う」みたいなボタンがあるので
それを押すとクレジットカード選択画面が出るので、新しいクレカを登録して支払いして終了です。

その後すぐにAWSサービスを使るようになりました。
もちろんIAMのアクセス権も正常になり、AWS CLIでCloudWatchのメトリクスを取れるようになりました。

## 最後に
ちなみにアカウントロック中でもLightsailのサーバーには入れました。
サーバー自体に入れなくなることがあるのかわかりませんが、IAMが使えなくなる時点で結構やばいです。

今回は個人のアカウントだったのでなんともなかったですが、
企業アカウントでこれをやらかすとなにかしらサービスに影響があります。

あと個人でも企業でも支払い漏れは**ダメ絶対。**こういうところも監視しないとだめだなぁと改めて思いました。
Robot Frameworkを始める時、参考にした情報源について

この記事は「[Robot Framework Advent Calendar 2017 - Qiita](https://qiita.com/advent-calendar/2017/robotframework)」の23日目の記事です。

今回はRobot Frameworkを始める時、参考にした情報源について記載します。

# 公式ドキュメント

1日目にも書きましたが、Robot Frameworkは公式ドキュメントが充実しています。そのため、だいたいのことは公式ドキュメントを読めば解決します。

- [Documentation- Robot Framework](http://robotframework.org/#documentation)
- [Robot Framework 和訳・日本語ドキュメント集 — RobotFramework和訳・日本語ドキュメント集](http://robotframework-ja.readthedocs.io/ja/latest/index.html)


サードパーティライブラリなどについては公式ドキュメントページの

- THE LIBRARIESのEXTERNAL
- THE TOOLSのOTHER

あたりに記載があります。

　  
# awesome-robotframework
一方、GitHubのリポジトリには、 `awesome-xxx` というxxxに関するライブラリやツールなどをまとめたものがあります。

例えば、Pythonには `awesome-python` というリポジトリがあります。
https://github.com/vinta/awesome-python

Robot Frameworkについては、 `awesome-robotframework` があります。
https://github.com/fkromer/awesome-robotframework

そこでは

- Libraries
- Tools
- Resources
- Trainings

のカテゴリに分かれて、Robot Framework情報のリンクが記載されています。


そのため、公式ドキュメント以外でRobot Frameworkに関する情報を探したい場合は、こちらのリポジトリを見ると新しい発見があるかもしれません。

　  
なお、 `awesome-test-automation` にも Robot Framework のライブラリがいくつか紹介されています。
https://github.com/atinfo/awesome-test-automation/blob/master/python-test-automation.md

# stackoverflow
英語情報ですが、stackoverflowにQ&Aがあります。
[Newest 'robotframework' Questions - Stack Overflow](https://stackoverflow.com/questions/tagged/robotframework)

2017/12/23現在、 `robotframework` タグは2,500超あります。

# サードパーティライブラリの使い方
ライブラリのGitHubなどを見ると、READMEやLibdocを使ったキーワード集が付属していることが多いため、そちらを参考にします。

また、ライブラリのPython3対応状況は、GitHubのIssuesやPull requestsに書かれているかもしれません。

# 日本語の情報

「Robot Framework 和訳・日本語ドキュメント集」を作成してくださったYasushi MasudaさんによるPyCon JP 2016のプレゼンがあります。

- [プレゼンテーション：Robot Frameworkでブラウザテストやってみた話 | PyCon JP 2016 in TOKYO](https://pycon.jp/2016/ja/schedule/presentation/53/)
- [Taming robotframework](https://www.slideshare.net/YasushiMasuda/taming-robotframework-64319718)
- [もう難解なテストケースにはさよなら！日本語も使える衝撃のテストフレームワーク Robot Framework #pyconjp #pyconjp_203 - Togetter](https://togetter.com/li/1027194)

また、[Robot Framework 日本語ユーザグループ - Google グループ](https://groups.google.com/forum/#!forum/rfw-users-jp) もあります。

　  
Qiitaでは `robotframework` タグに情報があります。
https://qiita.com/tags/robotframework

Windowsアプリケーションのテストも自動化できるようです。
[Windows Application DriverでWindowsアプリケーションのテストを自動化する～Python編 - Qiita](https://qiita.com/totutiteta/items/ff29fcabff921057f959)

　  
その他、ブログやプレゼン資料へのリンクです。

- [Robot Framework + Selenium2Libraryで簡単受け入れテスト | Ryuzee.com](http://www.ryuzee.com/contents/blog/5933)
- [Robot Frameworkで自動受け入れテスト | GuildWorks Blog](https://blog.guildworks.jp/2015/11/02/robotframework/)
- [SDN Lab環境でのRobotFramework実践活用 - SlideShare](https://www.slideshare.net/ToshikiTsuboi/sdn-lab-robot-framework)
- [Sikuli Robot Frameworkを使ってテスト結果のレポートを残す : masuoのブログ](http://masuo.doorblog.jp/archives/51769292.html)

自分の記事では、カテゴリ `RobotFramework` にまとめてあります。
http://thinkami.hatenablog.com/archive/category/RobotFramework

　  
他にも、CSDNという中国のブログサイトにも、いくつもの記事がありました。[^1]

[^1]: 自分が中国語に詳しくなく、内容が正しいかを判断できなかったため、リンクは断念しました

もし、上記以外にもRobot Frameworkの情報があれば、コメントしていただけるとありがたいです。
jupyterでpipを使って必要モジュールを共有する

Jupyter Notebookを他の人と共有する機会があると、noebookだけで完結させたいのに、requirements.txtを作成したりするのは面倒です。

## もっとシンプルに共有したい

そこでnotebookで必要なモジュールを記録に残す場合には、jupyterの`!`機能を使って、シェルを叩く方法があります。

```
! pip install
```

もしくは、pythonからpipを呼び出すことができます。

```
import pip
pip.main(['install', 'somethingpy'])
```

スムーズな共同作業ができそうです。
[android] Databinding + Spinner

[自分のブログ](http://blog.norioegi.com/android-databinding-spinner/)にも書いたけど、こっちでも共有します。

うまくViewModelからXmlのスピナーを制御できないかなーといろいろ調査したらできました。
とある記事で`@=`を使ってTwo-way Bindingをやってるのもありましたが、今回はリスナーで変更を受けて更新する感じです。

## 方法

```xml:activity_something.xml
 <Spinner
    android:id="@+id/spinner_number"
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:spinnerMode="dialog"
    android:onItemSelected="@{(parent, view, position, id) -> viewModel.onItemSelectedNumber(parent, view, position, id)}"
    android:entries="@{viewModel.numberList}"
    />
```

```java:SomethingViewModel.java
public void onItemSelectedNumber(AdapterView<?> parent, View view, int position, long id) {
    setNumber(numberList.get(position));
    //Call Sip Register here
  }
```
`android:entries`にviewModelからListを渡しています。裏側でうまく`CharSequence[]`へ変換して、Adapterへの設定もやってくれます。

`setOnItemSelectedListener`の`onItemSelected`メソッドをViewModelに用意してXMLに渡しています。
これで、ユーザーがアイテム選択した祭に、ViewModel側で対処できます。
Golangで雑に素数を計算したよ

フィクションに出てくる数学者キャラは大抵素数にこだわりがあってなんかカッコイイ。
ところで「そこまでに出た素数で割り切れる数は素数じゃないって前提に立てば簡単に素数を算出できるプログラム書けるんじゃね？」って急に思ったので書いてみた。
ついでにGolangもやってみたかったからGolangで書いた。

# 結果から先に言うと

結果動いたけどやっぱりある程度以上からものすごく重くなった。
あと、Golangに素数をまんま出せるライブラリあったらやってることアホだなって思って一応調べてみたところ（結果なさそうではあった）、なんか素数業界が色々ガチっぽくて怖ぇ！ってなったので素数のタグはつけないことにした。

# 作ったもの

## コード

```Go
package main

import (
    "fmt"
    "math"
)

func main() {
    prime_numbers := []float64{2}
    var test_max_number float64 = float64(math.Pow(10, 5))
    var n,m,dm,prime_number float64

    for n = 1; n < test_max_number; n++ {
        m = (n * 2) + 1

        is_not_prime := false
        for _, prime_number = range prime_numbers{
            dm = m / prime_number
            if dm == math.Ceil(dm) {
                is_not_prime = true
                break
            }
        }

        if is_not_prime == false{
            prime_numbers = append(prime_numbers, m)
        }

    }

    fmt.Println(prime_numbers)

}
```

## 実行環境

* macOS High Sierra Version 10.13.1
* go version go1.9.2 darwin/amd64

# 経過と結果

* まずは20（10の1乗 * 2）までの状況で開発し、計算結果を目視で確認していける！って思った。
* 次に2,000（10の3乗 * 2）くらいまで計算させてwikipediaの素数の記事と比べてみたらだいたいあってたのでこれは多分ほんといける！って思った。
* 次に20万（10の5乗 * 2）にしたところで1秒くらいで答えが返ってきたけど、乗数を1つあげて200万にしたところ10秒待っても返ってこなくなり、そこで諦めた。

# ガチっぽい素数業界について

[Golangで「エラトステネスの篩」で「2.1秒で百万個」の素数を計算できる「無限シーケンス」を作ってみた](https://qiita.com/cia_rana/items/2a878181da41033ec1d8)

とか。

[Golangで「エラトステネスの篩」で「1.3秒で百万個」の素数を計算できる「無限シーケンス」を作ってみた](https://qiita.com/antimon2/items/cada59fb3b1f028f4fb3)

とか。

[Python/Ruby/PHP/Golang(Go)で素数を扱う](https://qiita.com/hiroykam/items/bf1edde04db8d54f4d1f)

とか。

「エラストテネスの篩」って名前がもうカッコイイ。
イケてるBundled Notificationsを実装したかった(出来なかった)話

#はじめに

Nougatから導入されたBundled Notificationsについての記事です。

#やりたかったこと
>Material Design Guideline - Notifications
[https://material.io/guidelines/patterns/notifications.html#notifications-behavior](https://material.io/guidelines/patterns/notifications.html#notifications-behavior)

ガイドラインのGroupingとSummarizingを合わせたような、纏まっている状態(Collapsed)のときは、`"3" new messages`といった、通知の数を表示するバンドル通知を作りたかった(出来なかった)。

![スクリーンショット 2017-12-23 3.39.21.png](https://qiita-image-store.s3.amazonaws.com/0/207263/ea3c51a7-aeec-fd12-c13c-5fb2a463c010.png)
![スクリーンショット 2017-12-23 3.39.37.png](https://qiita-image-store.s3.amazonaws.com/0/207263/ef9806d8-0ed0-0b32-db86-b6cd69934de7.png)

#わかったこと

Bundled Notificationsだと、通知の数を知らせる文を自前で用意することは出来なく、以前からあるInboxStyleのように、Title、Contentを羅列したスタイルにしか出来なかった。

![スクリーンショット 2017-12-23 3.58.02.png](https://qiita-image-store.s3.amazonaws.com/0/207263/050769b8-2f90-a2b0-0afe-95a69bd04fb0.png)

(右下にある『+1』の表示は、子通知が親通知に収まっている状態で、
かつ、親通知も縮んでいる状態でしか表示されないみたいです………)
#Summary Notificationで有効な属性

Bundled Notificationsを作成するには、まとめるための親通知と、それに収まる子通知を作成するのですが、親通知には適用されない属性が多々ありました。

```java
Notification groupNotification = new NotificationCompat.Builder(context)
    .setSmallIcon(R.drawable.small_icon)  //有効
    .setColor(ContextCompat.getColor(context, R.color.red))  //有効
    .setStyle(
        new NotificationCompat.BigTextStyle()
            .setSummaryText("Group Summary Text")  //有効
            .setBigContentTitle("Group Big Content Title")  //無効
    )
    .setContentTitle(" Content Title")  //無効
    .setContentText("Content Text")  //無効
    .setGroup(GROUP_NAME)
    .setGroupSummary(true)
    .build();
```

上記のように、親通知でいじれる箇所はかなり限られていルようです。
NotifiCationCompat.Styleで変更を加えられる点は、サマリーテキストくらいで、他は無効になってしまう（確認した限りでは……）。

#結論


”[やりたかったこと](#やりたかったこと)”に書いたようなバンドル通知の作り方を知っている方、教えてくださいお願いします…………。

#参考

>Material Design Guidelines
[https://material.io/guidelines/](https://material.io/guidelines/)

>Android Developers Blog Notifications in Android N
[https://android-developers.googleblog.com/2016/06/notifications-in-android-n.html](https://android-developers.googleblog.com/2016/06/notifications-in-android-n.html)
VBAでバイナリビューアの作成

VBAを使って、セル上にバイナリファイルを展開します。


バイナリファイルを読み込んでみる
以下のコードは、ファイルをバイナリ形式でセル上に展開します。


```
Option Explicit

Sub ReadBinary2()
    Dim myByte As Byte
    Dim myRange As Range
    Dim myFileName As String
    Dim r As Long
    Dim c As Long
    
    'セルのエラーを無視、セルの初期化
    Application.ErrorCheckingOptions.BackgroundChecking = False
    Set myRange = Range("A2").End(xlDown)
    Range(Cells(2, 1), Cells(myRange.Row, 34)).Clear
    'ファイルを開く
    ChDir ThisWorkbook.Path & "\"
    myFileName = Application.GetOpenFilename()
    Open myFileName For Binary As #1
    
    Cells(2, 1).Value = "'000000"
    Cells(2, 1).Interior.Color = RGB(192, 192, 192)
    r = 2
    c = 2
    'バイナリファイルを読み込みつつセルに書き込み
    Do While Not EOF(1)
        Get #1, , myByte
        Cells(r, c).Value = "'" & _
 CStr(Application.WorksheetFunction.Dec2Hex(myByte, 2))
        Cells(r, c).HorizontalAlignment = xlCenter
        c = c + 1
        
        If c >= 18 Then
            c = 2
            r = r + 1
            '左端の番地名
            Cells(r, 1).Value = "'" & _
 CStr(Application.WorksheetFunction.Dec2Hex((r - 2) * 16, 6))
            Cells(r, 1).Interior.Color = RGB(192, 192, 192)
        End If
    Loop
    Close #1
    
    c = c - 1
    If c = 1 Then
        c = 17
        r = r - 1
    End If
    '文字コードに対応する文字を表示
    Range(Cells(2, 19), Cells(r, 34)).Value = "=CHAR(HEX2DEC(B2))"
    If c <> 17 Then
    Range(Cells(r, c + 18), Cells(r, 34)).Clear
    End If
    
End Sub

```



バイナリで指定してファイルを開き、Getで1バイトずつ読み込みセルに書き込む作業を繰り返しています。
セルに書き込む際に時間を取るため、100kB程度のファイルでも展開に30秒ほどかかってしまいます。一度、配列にいれてから、配列ごとセルに書き込むと時間短縮になりますが、1セルずつ書き込まれていくの姿がかっこいいのでこのままで。
MFA Token を Alfred Workflow で簡単生成する（暗号化あり）


以前から [CLI で Authy と共通の MFA Token を生成する][ref1] でトークンを生成してたんですが、トークンが欲しい時は大抵 Web サービスを利用しているときや awscli で `Enter MFA Code:` と聞かれたときであり、いちいち CLI で生成するのが面倒です。

Mac でおなじみの高機能ランチャー [Alfred](https://www.alfredapp.com/) の Workflow（有料オプション）を使えば柔軟な機能定義ができるので、Alfred Workflow で MFA Token を簡単に生成できるようにしました。半年以上自分の環境で運用していたのですが、こなれてきたので晒します。

> 類似の workflow が既にあったのですが、シークレットキーを平文で管理したくなかったので、[CLI で Authy と共通の MFA Token を生成する][ref1] で行った手法と同じ方法で暗号化しています。

生成したトークンはクリップボードにコピーされるのと同時に、直前のウィンドウに自動的にペーストされるので、awscli のように Terminal でトークンを求められる場合でも快適に使えます。

https://github.com/u-minor/alfred-mfa-workflow

![screenshot0.jpg](https://qiita-image-store.s3.amazonaws.com/0/15611/984dea8c-d721-2052-bf91-b6fb4e0a490f.jpeg "screenshot0.jpg")

![screenshot1.jpg](https://qiita-image-store.s3.amazonaws.com/0/15611/a18969b0-4322-bac8-c6f2-bfb43c557a18.jpeg "screenshot1.jpg")

![screenshot2.jpg](https://qiita-image-store.s3.amazonaws.com/0/15611/7c2d3c71-5046-5494-2667-fa4f51f201d8.jpeg "screenshot2.jpg")

## 機能

- `mfa SERVICE` と入力することで、登録したサービスがインクリメンタルサーチされます。
  - 実際にはサービス一覧を grep しているので、部分マッチします。
- 生成したトークンは、クリップボードに入るのと同時に直前のウィンドウのカーソル位置に自動ペーストされます。
- 各サービスのトークン生成に必要なシークレットキーは、OpenSSL の RSA キーで暗号化して保持しています。
  - ですので、トークン生成のたびにパスフレーズの入力が必要になります。
- データ+暗号化キーの初期化、サービスの追加・削除も Alfred 経由で可能です。

![screenshot3.jpg](https://qiita-image-store.s3.amazonaws.com/0/15611/c15dfd80-0f7d-dfb0-307c-9f0565694eeb.jpeg "screenshot3.jpg")


## 事前準備

利用するには、[oath-toolkit](http://www.nongnu.org/oath-toolkit/) のインストールが必要です。
oathtool というコマンドで HTOP/TOTP Token が生成可能になります。

Homebrew でさくっとインストールしましょう。

```
brew install oath-toolkit
```

Terminal で oathtool と入力し、ヘルプが表示されればインストール OK です。

## workflow のインストール

以下のページから workflow を取得してインストールしてください。

https://github.com/u-minor/alfred-mfa-workflow/releases


## 使い方

初回は RSA キーの初期化が必要です。

Alfred のウィンドウで `mfa init` と入力し、初期化処理を行ってください。
キーを作成する際のパスフレーズを聞かれますので、お好きなものを入力してください。

この後登録する各サービスのシークレットキーを暗号化するためのものです。

### サービスの追加

Alfred のウィンドウで `mfa add サービス名 シークレットキー` と入力することで、新規のサービスを追加できます。

> シークレットキーは基本的には MFA 登録時の QR コードが表示されたタイミングでしか取得できませんが、Authy を使っている方は、後から無理矢理シークレットキーを抜き出すことが出来ます。
> [CLI で Authy と共通の MFA Token を生成する][ref1] を参考にしてください。

### トークンの生成

Alfred のウィンドウで `mfa サービス名` でインクリメンタルサーチができます。
サービス名の一部でもマッチします。
直近で利用したサービスが上位に来るようにリストを自動調整しています。

### サービスの削除

Alfred のウィンドウで `mfa rm サービス名` と入力することで、既存のサービスを削除できます。

## おまけ

生成されるリストや暗号化の手法は [CLI で Authy と共通の MFA Token を生成する][ref1] と同じなので、記事中の `mfacodegen` コマンドで workflow で管理しているファイルをそのまま利用できます。

> 参照するデータのパスを変える必要はありますが。

----
[ref1]: https://qiita.com/u-minor/items/daa6579998da0c534a6d
Slack活用方法「ショートカット」

みなさん、こんにちは。Classiの経営推進部で取り纏め役をしている川合です。
今年の7月から担当しています。
経営推進部は、経理財務、人事、総務、法務、情報セキュリティという、一般的には、コーポレート部門とよばれるところです。

なぜ、「Advent Calendar」に投稿したのか？

自分自身は、社会人になり20年近くになりますが、ずっと経理財務畑が中心でした。
この7月から今の担当になり、スタッフ系部門全体を見ることになりました。

その中で、会社の課題の一つに、エンジニア不足がありました。
エンジニアの採用、そして、入社頂いた後、いかに心地よく働いてもらうか。
今時点で、みんなのために出来ていることは、あまりありませんが、
経営推進部にいろんな業務がある中で、採用活動、心地よく働ける環境を作ることは、
かなりプライオリティ高く活動しています。

エンジニアを理解する（このように書くとちょっと偉そうですが、）ということが、
非常に重要であり、その一環で、当初は、この投稿時には、なにか一つプログラミングを
組んで、その内容を投稿しよう。と思っていたのですが、そこまではたどり着くことはできませんでした。

そこで、
本日は、Slackの活用で悩んでいた時に、弊社CTOに教えていただいた
「ショートカット」の機能について投稿したいと思います。

皆さん　Slackの社内活用が進んで、宛先探しに苦労したことはありませんか？
そんな悩みを解決してくれるのが、「ショートカット」です！

宛先は、実際はこれの３倍ぐらいあり、
宛先探しに一苦労でした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223883/277f0334-013d-afd3-8deb-62225c34c6a2.png)

 
こんな悩みを抱えていると、CTOが「ショートカット機能知らないのですか？」と、
話しかけてくれました。

「ショートカット機能」使い方は簡単

「Ctrl」＋「K」を押して、検索したい人の名前を入力すると、
その人が含まれるグループが登場しますので、
そのグループを選べば、終了です！

※tatsuyaは、うちのCTOです。
![image-2.png](https://qiita-image-store.s3.amazonaws.com/0/223883/67f06f34-d9a4-42d5-9812-954e2e5fe5e2.png)


こういった簡単な機能でも、知っているのと、知らないのでは、業務の効率は全く違ってきます。よく使うツールに関しては、こういった機能の豆知識が非常に重要だと改めて思いました。

年明けには、プログラミングの体験機会を増やしていきたいと思います。
Pythonのlambda(無名関数)を使ってみる

# はじめに
私は初めて触ったプログラミング言語がPythonで、今まで触った言語で一番書いているのはPythonですがlambdaを使ったことなかったので使ってみます。

# 使ってみる
こんな感じで書けるみたいです。

```console
>> add_two = lambda x : x + 2
>> print(add_two(5))
7
```  
<br />
lambdaを関数の引数に渡すこともできるみたいです。
例えば、第一引数と第二引数を使って第三引数のlambdaで計算するような関数を作ります。

```python3
def calculation(x, y, cal):
    return cal(x, y)
```

calculation関数を使ってみると

```console
>> calculation(4, 5, lambda x, y : x + y)
9
```
<br />
まとめるとこんな感じ

```python3:main.py
def calculation(x, y, cal):
    return cal(x, y)

if __name__ == '__main__':
    add = lambda x, y : x + y
    sub = lambda x, y : x - y
    mul = lambda x, y : x * y
    div = lambda x, y : x / y
    power = lambda x, y : x ** y
    
    print(calculation(6, 3, add))
    print(calculation(6, 3, sub))
    print(calculation(6, 3, mul))
    print(calculation(6, 3, div))
    print(calculation(6, 3, power))
```

# 最後に
他にも高度な使い方出来るようなので色々調べてまたまとめます。
Ansibleでsshの待受ポートを変える

# Ansibleでsshの待受ポートを変える際にハマった点についての備忘録

---

* Ansibleとはhttps://qiita.com/t_nakayama0714/items/fe55ee56d6446f67113c
* 公式ドキュメント http://docs.ansible.com/

---

# 環境
作業機
OS: Mac OSX El Capitan 
Ansible: 2.4.2.0

操作対象サーバ
OS: CentOS6.9 minimal
rootバス： password
sshdポートの変更先: 2222

---

# 要点
* sshdのポートいじったあとにファイアウォール設定をする
* 再起動する際にNICが自動起動するようにする
* 変更した後の対象サーバへの接続は変わった後のポートを使う

---

# ソースコード
https://github.com/q-fukutomo/ansible_sshd

---

# 下準備

操作対象サーバ側
NIC確認

```
# ls /etc/sysconfig/network-scripts/ | grep ifcfg
```
![DSC_0022.JPG](https://qiita-image-store.s3.amazonaws.com/0/73439/118574c7-59e3-ca57-9430-78d1c9691bae.jpeg)
今回は有線接続で進めるため、eth0を使う。

NIC立ち上げ/ローカルIP確認

```
# ifup eth0
# ifconfig
```
![DSC_0023.JPG](https://qiita-image-store.s3.amazonaws.com/0/73439/a4918ab2-7b2b-6f20-7023-f8ccaea962ed.jpeg)

ローカルIPは192.168.1.7らしい。

ここまで得られた値はMac側から接続する際に使う値なので、適宜ソースのhostsファイルとchange_sshd_port.ymlのvarsで定義している変数の値を修正。

---

# playbookとインベントリファイルの作成
記述するタスク
* sshd_configのバックアップと編集
* iptablesのバックアップと編集
* NICのコンフィグファイルのバックアップと編集
* 捜査対象サーバの再起動
* 再起動待機
* 
記述はソース参照。
※ 再起動以降はAnsibleで接続するホストのポートが変わるため、再起動後にもセットアップが続く場合は、その前後でそれぞれ定義しておくといい感じになる。

---

# 実行

Mac側

```
$ sudo ansible-playbook -i hosts change_sshd_port.yml
```

![スクリーンショット 2017-12-23 2.00.42.jpg](https://qiita-image-store.s3.amazonaws.com/0/73439/437fc3e9-f720-073b-4e67-aea2aac8d6dd.jpeg)
#<font color="Red">事故発生。</font>
症状と対応
https://qiita.com/usk81/items/f629f780eba18d5bfdf5#%E5%8E%9F%E5%9B%A0

sshpass導入後、リトライ 
![スクリーンショット 2017-12-23 2.01.01.jpg](https://qiita-image-store.s3.amazonaws.com/0/73439/988cb446-37f3-3b6b-2206-748bb1c70499.jpeg)
#<font color="Red">再び事故発生。</font>
症状と対応
http://sankakuvalidator.hatenablog.com/entry/ansible-role-gitbucket
うまいことAnsibleから解決できる方法があったらしい。(操作対象サーバ上で直接yumから入れた後に気付いた顔)

3度目の正直
![スクリーンショット 2017-12-23 3.49.35.jpg](https://qiita-image-store.s3.amazonaws.com/0/73439/2d453e70-b456-5705-64f3-fe76a10adaeb.jpeg)

ポート変更後用のhosts設定でのテスト
![スクリーンショット 2017-12-23 3.50.06.jpg](https://qiita-image-store.s3.amazonaws.com/0/73439/4e71a88c-d515-9a72-ef72-13abdd3cf74d.jpeg)

<b>い い 感 じ に な っ た 。</b>:smile: :smile: :smile:
CentOS7+MariaDB10でgem mysql2がエラーになる

CentOS7.4上でMariaDB10とRails5のアプリケーションをインストールしようとしたが、`bundle install`で躓いたので解決策を書いておく。
結論だけ先に言うと`bundle update`と`yum install -y MariaDB-shared`で解決した。

# 環境
```
$ cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core)

$ mysql --version
mysql  Ver 15.1 Distrib 10.2.11-MariaDB, for Linux (x86_64) using readline 5.1

$ ruby -v
ruby 2.4.3p205 (2017-12-14 revision 61247) [x86_64-linux]
```

# 症状
いつも通りgemを入れていく…

```
$ bundle install
Fetching gem metadata from https://rubygems.org/..........
Using rake 12.0.0
Using concurrent-ruby 1.0.5
Using i18n 0.8.6
Using minitest 5.10.3

...

Fetching mysql2 0.4.9
Installing mysql2 0.4.9 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /home/sabamotto/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/mysql2-0.4.9/ext/mysql2
/home/sabamotto/.rbenv/versions/2.4.3/bin/ruby -r ./siteconf20171223-19752-eo01fi.rb extconf.rb
checking for rb_absint_size()... yes
checking for rb_absint_singlebit_p()... yes

...

linking shared-object mysql2/mysql2.so
/usr/bin/ld: -lmariadb が見つかりません
collect2: エラー: ld はステータス 1 で終了しました
make: *** [mysql2.so] エラー 1

make failed, exit code 2

Gem files will remain installed in /home/sabamotto/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/gems/mysql2-0.4.9 for inspection.
Results logged to
/home/sabamotto/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/extensions/x86_64-linux/2.4.0-static/mysql2-0.4.9/gem_make.out

An error occurred while installing mysql2 (0.4.9), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.4.9'` succeeds before bundling.

In Gemfile:
  mysql2
```

mariadbにリンク出来ない…
（LANG=C環境では`/usr/bin/ld: cannot find -lmariadb`）

# 原因
gem mysql2の [issue#877](https://github.com/brianmario/mysql2/issues/877) に似たようなものがあった。この問題は既にmysql2 0.4.10でマージされたようなので、`bundle update`で対応した。
しかし、それでも解決しなかったので色々試みたところ、MariaDB-sharedが入っていないことも原因だった。MariaDB-develだけではダメなようだ。

# 解決策
```
$ sudo yum install -y MariaDB-devel MariaDB-shared

$ bundle update
Fetching gem metadata from https://rubygems.org/..........

...

Fetching mysql2 0.4.10
Installing mysql2 0.4.10

...

Fetching turbolinks 5.0.1
Installing turbolinks 5.0.1
Fetching uglifier 4.0.2
Installing uglifier 4.0.2
Fetching web-console 3.5.1
Installing web-console 3.5.1
Bundle complete! 44 Gemfile dependencies, 124 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
```

rubyはライブラリのインストールで躓くことが多い気がする… :(
ADOについて

SC（非公式） Advent Calendar 2017 23日目です！


<h2>■今の業務について

現在、金融系のお客さんのところでVBAを使って仕事をしています。
いろんな情報をまとめて管理しやすくする、って感じのアプリを作ってます。（大雑把にですが...）

その際にADOというものに出会い、いろいろ興味深く感じたことがあったので今回はそこらへんについて話そうかと思います。


<h2>■まず、ADO(ActiveX Data Objects)とは 

ADOとは、Microsoftが提唱しているデータアクセス技術のことである。

ADOは、OLE DBを利用して、アプリケーションからAccess、SQL Serverをはじめ、Oracleなどのさまざまなデータソースへ統一的で高性能なアクセスインタフェースを提供するCOMベースのデータベースアクセス技術である。

ADOは、以前のADOとRDOの機能を統合したMicrosoftの戦略的技術として開発された。ADOは、アプリケーション、言語などに依存しないインタフェースであり、開発者は扱うデータベースごとに別々に実装する必要がないというメリットがある。

Weblioより引用（https://www.weblio.jp/content/ADO）


上に説明がありますが、簡単に言えば"いろんなデータベースにアクセスできる便利なもの"です。
ここで驚いたのが、ExcelにもADOで接続できるということです。つまりExcelをDBとして使うことができるのです。普段Excelを使うことはよくありますが、こんな使い方があったとは知りませんでした。

DB用Bookの中身はこんな感じ↓↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/212100/e2902c03-7441-b5ed-e97b-eaf7bc2741f1.png)

一行目がフィールドとして認識され、1シート1テーブルとなっています。
これにSQLを投げてデータを取ってきます。

では実際にDB(Excel Book)からデータをとってきましょう。

今回使うテーブルはこちら
![image.png](https://qiita-image-store.s3.amazonaws.com/0/212100/9cdc60d8-7dd2-7b72-db5d-201fc4de1c44.png)


これを下記のマクロを使って取得したのがこちら
![image.png](https://qiita-image-store.s3.amazonaws.com/0/212100/33d307b3-c3f1-9708-4408-5fadd6cd2f40.png)



接続、実行の書き方はこのように書きます↓↓（コード書くのへたくそです）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/212100/2aa14b9e-78c6-6b24-437e-517fd1b9a194.png)

ではこんなケースはどうなるでしょう
![image.png](https://qiita-image-store.s3.amazonaws.com/0/212100/32e8cd0e-65c0-c853-08a2-d8d76c55e160.png)

社員番号の列に数字、文字列混合したものが入っています。
OracleやSQL Serverなら型を指定するため、そもそもこんなことはないと思います。
しかし、Excelの場合は型を指定するということができません。

では型はどうなるかというと
![image.png](https://qiita-image-store.s3.amazonaws.com/0/212100/d2c727fc-6418-c877-60f9-4509c49b8662.png)


Microsoftサポート（https://support.microsoft.com/ja-jp/help/278973/excelado-demonstrates-how-to-use-ado-to-read-and-write-data-in-excel-w）

最初の8レコードの型をみて、多いものがそのカラムの型となるようです。
なので先ほどのテーブルをSELECTした結果はこうなります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/212100/b915b535-5cfc-62ad-ff5b-976955bd8600.png)

先頭8レコードのうち数値型：3　文字列型：5　だったので
カラム 社員番号 の型は文字列とみなされ数値部分は取得できませんでした。

それなら4：4　の場合はどうなるのでしょう（↓こんな場合）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/212100/5b66506c-a109-a3ca-69ac-dfa2e2c4a52b.png)

結果はこうなりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/212100/d594c9a6-4e63-e2ca-ff2a-f692dd9c2b44.png)

どうやら数値が優先されるようですね。
他の型はどうなるか試していないので、時間のある時に優先度序列を調べてみたいですね。

ADOに関しては以上となります。

<h2>■おまけ

先ほどのADOの実行コード（↓コレ）をみて気になった方がいるかもしれませんが、この関数、パラメータを渡されてます。実はこれ、ボタンに引数を持たせてそれによって取り込むシートを変えているんです。ボタンに引数を持たせられるなんて知ってましたか！？（私は知らなかったです。）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/212100/2aa14b9e-78c6-6b24-437e-517fd1b9a194.png)

参考
![image.png](https://qiita-image-store.s3.amazonaws.com/0/212100/4587aa01-31dd-b4f9-fca4-3c29a12d7246.png)




<h2>■終わりに

いかがでしたでしょうか。
私が業務中に関心したことをとりあえず書いてみたのですが、わかりづらかったかもしれません...

たいしたことは書けませんでしたが少しでも参考になることがあったなら幸いです。
ちょっとずつ読むドメイン駆動設計 第四部 戦略的設計 第十四章 モデルの整合性を維持する7 順応者

# これまでの十四章
- [第四部 戦略的設計 第一四章 モデルの整合性を維持する](https://qiita.com/YasuhiroKimesawa/items/6e8e5503a05ce9515a79)
- [境界づけられたコンテキスト](https://qiita.com/YasuhiroKimesawa/items/901ac764340275b93d61)
- [継続的な統合](https://qiita.com/YasuhiroKimesawa/items/6a58743c90c5b707c29d)
- [コンテキストマップ](https://qiita.com/YasuhiroKimesawa/items/626384c84145870ec5af)

##  
- [共有カーネル](https://qiita.com/YasuhiroKimesawa/items/7895d8c28137bd34008a) 
- [顧客/供給者の開発チーム](https://qiita.com/YasuhiroKimesawa/items/c9668a437499897fa9d5)

# 順応者
## 顧客/供給者の開発チームがうまくいかないケース
- 供給者にとって顧客のビジネスが重要でない場合
    - 供給者が多くの顧客を抱えている
    - 昔からの顧客に市場の方向性が変わったため価値が見いだせない
    - 供給者の経営がうまくいっていない
    - ビジネスから撤退した
    - ・・・
- 上流に下流チームの要求に応える動機がない場合

こんな場合、供給者に期待をせず、なんとかするしかない・・・という怖いパターンです。

## ３つの選択肢
①. **上流の機能を使用することを一切断念する**

これが可能である場合、**別々の道パターン(次回以降読むところ)**を選択することになります。

②. **下流チームは独自のモデルを開発し、上流との接続には変換層を用意する**

この場合は、**腐敗防止層(次回読むところ)**を使用することになります。
これを選択する動機としては、上流のモデルを下流で扱うのが困難な場合です。カプセル化の欠如・ぎこちない抽象・設計を扱うのが難しい場合にこのパターンを採用することになるでしょう。

③. **順応者**

上流の設計・品質が悪くない場合、下流では独立したモデルを(ある意味積極的に)断念して、上流のモデルをそのまま利用するパターンです。

もちろん心情的には、魅力的でもないし、受け入れがたい選択肢でもありますし、実際このパターンを選択されない事の方が多いかもしれません。

しかし、このパターンの良いところは、コンテキスト境界間の複雑な変換がなくなること。統合も簡略化されること、ユビキタス言語も共有できることです。
これにより下流も意外と良い設計とつながる可能性もあります。

上流が全く対応してくれそうにないけど、どうしても連携が必要で、かつ上流のモデルがそんなに悪いものではない場合に、選択肢の一つとして一度は考えて見るべきでしょう。

そういう意味で、このパターンが言語化され、ここで解説されていることには大変意義のあることだなと思うわけです。
JavaScriptを使わずにクリスマス感のあるヒーローイメージ制作


せっかくのクリスマスなので、何か作って見たくてヒーローイメージを実装してみました。

![christmas.png](https://qiita-image-store.s3.amazonaws.com/0/161716/e7b0edd1-4496-d5d0-faad-44772014e244.png)

実際の動きはこんな感じ
https://kunizawa.github.io/christmas/

# HTML
```html:index.html
<div class="wrapper">
  <div class="hero">
    <div class="hero__bg01"></div>
    <div class="hero__bg02"></div>
    <div class="hero__bg03"></div>
    <div class="hero__character"></div>
  </div>
</div>
```
# CSS
```css:style.css
* {
  margin: 0;
  padding: 0;
}

.wrapper {
  width: 100%;
  height: 100%;
}

.hero {
  position: relative;
  width: 100%;
  height: 550px;
  background: url(images/sky.png) center center /300px 550px;
}

.hero__bg01,
.hero__bg02,
.hero__bg03 {
  position: absolute;
  right: 0;
  bottom: 0;
  left: 0;
  width: 100%;
}

.hero__bg01 {
  height: 550px;
  margin: auto;
  background: url(images/star.png) center center /300px 550px;
  animation: hero__bg01 80s linear infinite;
}

.hero__bg02 {
  height: 273px;
  margin: auto;
  background: url(images/city.png) center center /1062px 273px;
  animation: hero__bg02 50s linear infinite;
}

.hero__bg03 {
  height: 143px;
  margin: auto;
  background: url(images/house.png) center center /801px 143px;
  animation: hero__bg03 20s linear infinite;
}

.hero__character {
  position: absolute;
  top: 145px;
  right: 0;
  left: 0;
  width: 193px;
  height: 78px;
  margin: auto;
  background: url(images/santa.png) center center /193px 78px;
}

@keyframes hero__bg01 {
  0% {background-position: 0 0;}
  100% {background-position: -300px 0;}
}

@keyframes hero__bg02 {
  0% {background-position: 0 0;}
  100% {background-position: -1062px 0;}
}

@keyframes hero__bg03 {
  0% {background-position: 0 0;}
  100% {background-position: -801px 0;}
}
```
# おわりに
作っているうちに興奮してしまい、現実時間で情景を変えたり、サンタクロースがプレゼントを配るようなギミックを入れて見たりもしたかったのですが、迫り来るクリスマスと体力を考慮し断念。

コピペでもなんでもご自由に使っていただいて構いませんが、もろもろの責任は負いかねます。
Rubyで文字列を先頭から特定の文字数で２つに分割する正規表現を解説

# 本記事の概要
先日、表題の正規表現が必要になったのですが、人が作った正規表現って理解するまで何だか黒魔術のように思えませんか。
でも、一度成り立ちを理解してしまうとその後はすんなり読むことができる。
そこで、本記事では「文字列を先頭から特定の文字数で二つに分割する」正規表現を組み立てる過程を順を追って解説する。

# 実現したいこと
文字列の先頭から3文字目までを区切り文字として、文字列を2つに分割し配列で受け取る処理を実現する。
文字列："foobarbaz"
　　↓
処理後：["foo", "barbaz"]

# 解説
1．文字列を分割し配列を返すメソッド
Rubyには文字列を分割して配列を返すsplitメソッドがあるので、これを使う。
※splitメソッドの詳細については[Ruby リファレンスマニュアル](https://docs.ruby-lang.org/ja/latest/method/String/i/split.html)をご参照

```ruby
"foobarbaz".split()
```
なお、splitメソッドは区切り文字として正規表現を指定できるので、次に正規表現を考えていく。

2．文字列分割のパターン
   文字列分割パターンとなる正規表現を考える

```ruby：decorator.rb
# rubyでは、文字列を''で囲むのと同様に正規表現は//で囲む決まりなので、とりあえず//を書く
//
# ↓
# 次に文字列の先頭から文字数をカウントして文字列を分割したいので、「文字列先頭」を意味する\Aを書く
/\A/
# ↓
#文字を一文字ずつカウントするため、「任意の一文字」を意味する.を書く
/\A./
# ↓
# 次に文字列先頭から3文字カウントしたいので、.を3回繰り返す必要がある
# 正規表現では、繰り返しに{m,n}を使う（最低m回、最大n回）
/\A.{1,3}/
# ↓
# splitメソッドを使うと分割パターンに合致した区切り文字はそのまま削除されてしまう。
# ただし、グルーピングすることでパターンに合致した区切り文字列も処理結果の配列に格納することができる。
# グルーピングは()で囲むことで実現できる。
/\A(.{1,3})/
# ↓
# ここまで作成した正規表現をsplitメソッドの第一引数にする。
# また、今回は文字列を2つに分割したいので、splitの第二引数に2を指定する。
"foobarbaz".split(/\A(.{1,3})/,2)

```
ここまでで作成した正規表現で文字列分割を実行してみると下記結果となる。

```ruby:bash
pry(main)> "foobarbaz".split(/\A(.{1,3})/,2)
=> ["", "foo", "barbaz"]
```

想定通り文字列分割をできてはいるが、配列の最初の要素に空文字が格納されてしまっている。
これは、文字列先頭からが区切り文字となっており、区切り文字より前の文字列がないためである。
配列の最初の要素を除けばいいので、配列の添え字を指定する。

```ruby:bash
pry(main)> "foobarbaz".split(/\A(.{1,3})/,2)[1..-1]
=> ["foo", "barbaz"]
```

＜補足＞
文字列先頭からが区切り文字となると空文字が返される理由がよくわからない人は下記図でイメージをつかんで欲しい。
（例）
　　【foobarbazをbarを区切り文字に分割した場合】
　　![foo_bar.png](https://qiita-image-store.s3.amazonaws.com/0/174425/1c39d7be-fa8e-e3ec-15a0-09959bd846ca.png)
　　　barを区切り文字として、barの前の「foo」とbarの後ろの「baz」が返されている。

---
　　【foobarbazをfooを区切り文字に分割した場合】
　　![barbaz.png](https://qiita-image-store.s3.amazonaws.com/0/174425/baefa396-854f-b369-1989-edd75cfff241.png)
　　　fooという区切り文字より前の文字がないため、「空文字」と「barbaz」が返されている。
メタ-デザインとアルゴリズミックデザインシステム

アカデミー8期生、大学院6期生の林洋介です。

本日は今の自分の興味について書きます。

ニューヨーク大学ITPコースの教員である[Rune Madsen](https://runemadsen.com/)による「[ON META-DESIGN AND ALGORITHMIC DESIGN SYSTEMS](https://runemadsen.com/blog/on-meta-design-and-algorithmic-design-systems/)」という記事があるのですが、自分が研究してきた領域や問題意識と重なる部分が多く、ここ数年動向を追っています。

メタ-デザイン[^1]とは何でしょうか？

記事から引用すると、
>伝統的なデザイナーはそのものを直接デザインします。ロゴ、ウェブサイト、ポスターなど、デザイナーが手を動かすことで、最終成果物ができあがります。メタ-デザイナーはこの作業を蒸留し、デザインシステムに落とし込む人を指します。

とのことです。

こういった動き自体は新しくないと断りつつ、メタ-デザインが今日のデザインにおいて面白い理由として、
1. デザイン製品がますますダイナミックになり、静的なプロトタイプをベースにしてデザインを保つことが難しくなってきたこと
2. プログラミングを自然に使いこなすデザイナーが沢山でてきたこと
3. アルゴリズミックなデザインツールの環境が整ってきたこと
4. デザインの歴史の中で、システムが重要な位置を占めていること
を挙げています。

よく「デザイナーはプログラミングを身につけるべきか？」あるいは「プログラマーはデザインを勉強するべきか？」という議論がなされます。ほとんどの場合は業務上のコミュニケーションがいかに円滑になるかを争点にしていますが、彼が重要視しているのはそういうことではありません。コードを書くデザイナー(あるいはデザインするプログラマー)によって、会社の文化までも変えてしまえると主張しています。

2015年に書かれた記事ということもあり、内容は[ロゴの自動生成](https://sagmeisterwalsh.com/work/all/casa-da-musica/)だったり、Googleの[マテリアルデザイン](https://material.io/)を始めとするデザインシステムを例に挙げていますが、2017年現在は少し状況が変化していて、感覚的には1.と4.の影響が強くなっているように思います。彼自身も[デザインシステムに対する批判](https://runemadsen.com/talks/uxcampcph/)をしていたり、グラフィックデザインの歴史を踏襲しつつ、[コードでデザインシステムを作る本](https://programmingdesignsystems.com/)を執筆しています(p5.jsを使用)。

この流れで個人的に衝撃だったのは[Netflixが番組のアートワークをパーソナライズしていたこと](https://medium.com/netflix-techblog/artwork-personalization-c589f074ad76)です。つまり、同じ作品でも人によって全く違うアートワークを見ている可能性があるのです。たびたび「海外映画の日本版ポスターがださい」という話題が盛り上がり、「元のデザインを尊重するべきだ」とか「ターゲットに合わせたデザインを作るべきだ」という意見を目にします。ここで止まらずに「じゃあそれぞれの好みに近づくようにめちゃくちゃパターンを作ってユーザーごとに最適化しよう」と考えたのがNetflixです。

[Flipboardのレイアウトエンジン](https://techcrunch.com/2014/03/23/layout-in-flipboard-for-web-and-windows/)や[The Grid](https://thegrid.io/)、[Adobe Sensei](https://blogs.adobe.com/creativestation/general-adobe-sensei-next-generation-design-environment)など、アルゴリズムや機械学習でデザインを自動化する動きは既に数多くあります。これらは「デザイナーが良しとするデザイン」をいかに補助するかというアプローチで、ベストなデザインは最終的にデザイナー及び提供者側が決めます。しかしNetflixの場合はそれと逆方向で、ベストなデザインはユーザーの行動によって決定されます[^2]。ユーザーが過去に鑑賞した作品の反応をもとに、表示される俳優も変化します。コメディをよく観ていればコメディの俳優が、好きな女優がいればその女優が入ったアートワークになります(実際はもっと複雑だそうです)。現状は美学的にもテーマ的にもバリエーションが出るように、デザイナーが手作業でパターンを作っているみたいですが、いずれここも自動化されるでしょう。

デザイナーの力を拡張するにせよ、ユーザーの判断に任せるにせよ、今後はこのようなデザインの仕組み作りに関わる仕事をしていきたいです。UIデザインと呼ぶには細かく、UXデザインと呼ぶにも気づきにくい。その一方で影響範囲は大きい。まだデザインと呼ばれていない、次のレベルのデザイン。それがメタ-デザインを通して見えてくるのではないか、と思っています。

[^1]: メタデザインと表記すると学際領域的なデザインを指すようなので、元記事の雰囲気に合わせてメタ-デザインと表記します。
[^2]: A/Bテストは現在の状態から良くなるかどうかをサンプル群から判断し、全員に適用しますが、これは「各ユーザーにとっての」ベストを決め、それをそのまま適用します。
vueの単一ファイルコンポーネント用のオンラインエディタを作ってみた

✨実験用の小さなコードを公開するのに、jsfiddleはとても便利ですよね。
📄vueは、単一ファイルコンポーネント（SFC)の仕組みがとても気に入っています。

この２つを組み合わせたものが欲しくて、VueFiddleなるものを密かに開発を進めています。

About [VueFiddle](https://vue.nice.team/)
------------------------------
* WIP
* vueに特化したオンラインIDE
* 単一ファイルコンポーネントの記述対応
* templateは HTML / PUG　対応
* styleは　CSS / LESS 対応
* scriptは javascript / TypeScript 対応
* URLシェアに対応
* サポートブラウザ(PC版 Chrome/Firefox)

Usage
-------------------------------
基本的には、jsfiddleと似せています。
　左上のtemplate(HTML)パネルに、templateを記述し、
　左下のscript(JAVASCRIPT)パネルに、scriptを記述し、
　右上のstyle(CSS)パネルに、styleを記述します。
そして、上部のRUNを押すか、F5で実行します。
各パネルの言語はオルト言語へ切り替え可能です。
（HTML⇔PUG　、　javascript ⇔ typescript 、　CSS ⇔ LESS）
必要に応じて、左側のMENUから、タイトルや説明等を設定できます。

scriptパネルでのnpmの外部モジュール読込にも対応していますが、
umdかamd形式のモジュールを読み込む必要があります。

Example
-------------------------------
* [HelloWorld](https://vue.nice.team/a41a44c3/1)
* [PUG](https://vue.nice.team/a29a8858/1)
* [TypeScript + VuePropertyDecorator](https://vue.nice.team/a7685e9/1)
* [ItemShop](https://vue.nice.team/b9cfd68e/3)


WIP版なので、不思議な挙動が残っています
アルゴリズム問題　理想のビンゴ

#問題
あなたのビンゴカードと、主催者によって呼び上げられた M - 1 個の整数が与えられます。最後の整数が自分の思い通りに呼び上げられたとしたとき、そのときのビンゴ数の最大値を答えてください。

##入力
```rb:
N M
b_{1, 1} b_{1, 2} ... b_{1, N}
b_{2, 1} b_{2, 2} ... b_{2, N}
...
b_{N, 1} b_{N, 2} ... b_{N, N}
a_1
a_2
...
a_{M-1}
```

・1 行目にビンゴカードの縦・横のサイズを表す整数 N と、主催者が数字を呼び上げる回数 M がこの順で半角スペース区切りで与えられます。
・続く N 行のうちの i 行目 (1 ≦ i ≦ N) には N 個の整数が半角スペース区切りで与えられます。i 行目の j 番目 (1 ≦ j ≦ N) の整数 b_{i, j} は、あなたのビンゴカードの i 行 j 列目に書かれている整数を表します。
・続く M - 1 行のうちの k 行目 (1 ≦ k ≦ M - 1) には、主催者によって k 番目に呼び上げられた整数 a_k が与えられます。
・入力は合計で N + M 行となり、入力値最終行の末尾に改行が 1 つ入ります。

###入力例
入力例1

```rb:
5 17
1 18 4 19 14
17 3 25 11 6
23 12 16 2 21
10 24 22 8 9
5 20 7 13 15
11
19
14
15
12
22
13
23
24
7
20
5
18
9
4
25
```

##出力
期待する出力
最大のビンゴ数を整数で出力してください。

##条件
すべてのテストケースにおいて、以下の条件をみたします。

・3 ≦ N ≦ 50
・1 ≦ M ≦ N × N
・各 i, j (1 ≦ i ≦ N, 1 ≦ j ≦ N) について
　・1 ≦ b_{i, j} ≦ N × N
　・b_{i, j} はすべて相異なる。すなわち, 各 i', j' (1 ≦ i' ≦ N, 1 ≦ j' ≦ N) について i ≠ i' または j ≠ j' のとき b_{i, j} ≠ b_{i', j'}
・各 k (1 ≦ k ≦ M - 1) について
　・1 ≦ a_k ≦ N × N
　・a_k はすべて相異なる。すなわち、各 k' (1 ≦ k' ≦ M - 1) について k ≠ k' のとき a_k ≠ a_k'


#回答コード

```rb:
input_lines=gets.split(" ").map(&:to_i)
N = input_lines[0] # N x N
nums=N*N #1 ~ N x N
bingo_num=[*(1..nums)] # 扱いやすいように配列を用意
selected_cnt=input_lines[1]

row=Array.new(N).map{Array.new(N,0)} #横
col=Array.new(N).map{Array.new(N,0)} #縦
naname=Array.new(2).map{Array.new(N,0)} #斜め それぞれ二次元配列で初期化して準備

N.times {|i| row[i] =gets.split(" ").map(&:to_i) } # 先に標準入力で単純な横の列を配列に入れ込んだ

   N.times do|i|  
      N.times do|j|
        col[i][j] = row[j][i] 　                # 横の配列から縦と斜めをそれぞれ抽出
            naname[0][i] = row[i][j] if (i==j)
            naname[1][i] = row[i][j] if (i+j == N-1)
    end
end


retu =[]
retu << row << col << naname #全組合せを後ほど使いやすいように一つにぶち込んで一段階平坦化して縦横斜めの概念の無い配列
retu.flatten!(1)
#-----ここまででたてよこななめの配列それぞれ完成-------

selected=[] #呼ばれた数の配列
selected_cnt.times {|i| selected[i] =gets.to_i } #標準入力から


non_selected=[] #呼ばれて無い数の配列
selected.each do|i|         #全数から呼ばれた数を引いた
    bingo_num.delete(i)
end
 non_selected = bingo_num 


#ビンゴメソッド・・・呼ばれていたらカウント＋１、カウントがN個溜まったらBINGO　リターンで１
def bingo(retu , selected)
    count=0
    bingo = false
    N.times do|i|
        selected.size.times do |j|
            count += 1 if retu[i]==selected[j]
        end
          if count == N
              bingo = true
          end
    end
    return 1 if bingo == true
end

    

ans=0 #答の初期化
non_selected.each do |n| #これから呼ばれる最後の数をそれぞれ
    bingo_cnt=0
    selected << n
  retu.each do |r| #全組合せの検証　bingoメソットで1が帰ってきたらビンゴ数＋１
     if bingo(r,selected) == 1 
        bingo_cnt += 1
    end
  end
      ans = [ans , bingo_cnt].max #答えに代入して一番ビンゴ数が多いのが答最終的に一番多いのがansに代入されるはず
      selected.delete(n)
end
  p ans  
```
vue.jsを触ってみた

# まえがき
[Vue.js #2 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/vue2)の記事です。

フロント初心者なので、vue.js固有の話とフロントフレームワーク全体の話が混ざっているかもしれませんが、ご容赦下さい。

## どのページにも表示されるheaderをつくりたい
vue-routerを使ってroutingを行いつつ、一番上に常にheaderを置きたかった。
はじめは「単一コンポーネントだし全てのページの最初に<router-view>おけば良いでしょ」とかおもっていました。

### 問題

$project_top/src/components/HelloWorld.vueに< router-view>を入れてもが動かない。

```  HelloWorld.vue
<template>
  <div class="hello">
    <p>routing top</p

    <router-view></router-view> <!-- ここ -->
  </div>
</template>

...(略)

```
当たり前でした。

vue-routerのcomponentを読み込んでいるのは src/main.jsです。
そこで呼び出しているcomponentsはApp。つまり、src/Vue.jsです。
src/componets/HelloWorld.vueが読み込めるはずがありません。
どうやるんだこれ、、、
vue-routerの公式をみてHintを探ります。

> 名前付きビュー
> しばしば、ネストをさせずに同時に複数の view を表示する必要があるでしょう

あ、これです。このしばしばのケースです。
routingに名前をつけて、router-viewを通して別のcomponentを呼び出せば良いらしいです。
つまりこういうことでした。

``` App.vue
<template>
  <div id="app">
    <img src="./assets/logo.png">
    <router-view name='top_navigation'>
    <router-view name='contents'>
  </div>
</template>
```

``` router/index.js
import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'
import NavigationBar from '@/components/NavigationBar'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: {top_navigation: NavigationBar, contents: HelloWorld}
    }
  ]
})
```

## 外部ライブラリのimport方法が分からない
ある１つのcomponentで[axios](https://github.com/axios/axios)を使いたかったので、src/index.jsにimportとして記述しました。
これでcomponentのmethodsの中でaxiosがつかえ、、、ないですね。
src/index.jsにimportが並んでいるからと言って、ここに書いても別のcomponentでは使えません。
.vueの世界にいると忘れがちになりますが、ここもjavascriptの世界です。

scriptタグでimportするだけでよいのです。

```
...HelloWorld.app
<script>
import axios from 'axios' //javascript
export default {
  name: 'HelloWorld',
  data () {
    return {
      msg: 'App'
    }
  }
}
</script>
...
```


## arrowが使えない
```
  created: function() {
    this.hoge()
  },

書き換え後
  created: () => {
    this.hoge()
  },
```

https://jp.vuejs.org/v2/api/index.html
>data プロパティ(例 data: () => { return { a: this.myProp }}) でアロー関数を使用すべきではないことに注意してください。アロー関数は、this が期待する Vue インスタンスではなく、this.myProp が undefined になるため、親コンテキストに束縛できないことが理由です。

はい。documentを見ていないいませんでした。
結局createの中はarrowを使ったので、functionとアローが混ざるカオスな状態に。。。
ちなみに、methodsやwathch、その他もアロー関数をしようすべきでないと書かれています。


##　オブジェクトの変更をしても描画されない
```
  data () {
    return {
      hoge: {name: ''}
    }
  },
  created: function() {
    this.hoge['price'] = 11
  },
```
はい。documentを(ry
`$.se(this.hoge,)t`

## 感想
https://jp.vuejs.org/v2/guide/#Vue-js-%E3%81%A8%E3%81%AF%EF%BC%9F
> Vue の他のインストール方法について、インストール ページで紹介しています。注意点として、初心者が vue-cli で始めることは推奨しません（特に、Node.js ベースのツールについてまだ詳しくない場合）。

忠告は聞くべき