OmniAICreator/Qiita-1.07M huggingface dataset:
初心者がHerokuを使ってみる

##免責事項
この記事は初心者視点でザックリとした説明をしています。正確性に欠ける可能性がございますが、ご了承ください。「明らかに違うよ」ということがありましたら、ご指摘くださると幸いです。

##環境
OS：最新版ではないMacOS
VirtualBox：5.2.26
Vagrant：2.2.6
Ubuntu：ubuntu/bionic64 v20181129.0.0


##目次
1. Herokuとは
2. Herokuの登録
3. Herokuでデプロイしてみる

#1. Herokuとは
Herokuは自分が作ったWEBサイトやWEBアプリケーションを世界中に公開することができるプラットフォームのことです。
小規模なサービスの公開なら無料で使うことができます。

ちなみにHerokuのように、WEBサイトやWEBアプリケーションを世界中に公開することができるプラットフォームはホスティングサービスと呼び、たくさん種類があります。

<例>
AWS、Firebase、Microsoft Azure、さくらインターネット、GMOインターネットなど、、、

厳密な違いなどはまだ分かりません。


#2. Herokuの登録
https://jp.heroku.com/
から登録を行います。
登録の仕方は簡単なのでご自身で調べてみてください。

#3. Herokuでデプロイしてみる
Herokuを使うには、「Heroku CLI」というアプリケーションをローカル環境にインストールし、Gitを使ってデプロイ（サービスの公開）を行う必要があります。
※GitHubと連携してGitHubからもデプロイできるらしい。

今回はLinuxのUbuntuにインストールしていきます。
MacやWindowsにインストールしたい方は以下のサイトをご参照ください。
https://devcenter.heroku.com/articles/heroku-cli

Ubuntuの環境では公式サイトにあるように以下のコマンドを入力します。

```
$ sudo snap install --classic heroku
```
・sudoはスーパーユーザ（別のユーザー）としてコマンドを実行することを意味します。
・snapはaptやnpmと同じようなパッケージマネージャである Snappyを操作するコマンドです。
→snap（Snappy）は、必要なライブラリを他のソフトウェアに影響を与えないように、一つのファイルシステムにまとめてインストールを行います。

インストールが完了したら、Heroku CLIのバージョン確認を行いましょう。

```
$ heroku --version
```
Herokuのバージョンが表示されたらインストールの完了です。

続いて、Herokuのログインを行います。

```
$ heroku login -i
> heroku: Enter your login credentials
Email: me@example.com
Password: ***************
Logged in as me@heroku.com
```
※ iを付けずにコマンドを入力するとブラウザからログインを行うことになります。
Herokuを登録した際の情報を入力していき、ログインに成功すると、Logged in as me@heroku.comのように表示されると思います。

これでデプロイ環境の構築が終わりました。
続いて、アプリをデプロイしていきます。

```
$ cd ~/myapp
$ heroku create
```
自分のデプロイしたいアプリディレクトリに移動し、
heroku createと入力します。
※ heroku create は、ランダムな名前のサーバー名でHerokuにサーバーを用意します。
そして、デプロイしたいアプリのローカルgitリポジトリを、herokuという名前のリモートgitリポジトリとして登録します。

```
> 
Creating app... done, xxx-xxx-XXXX
https://xxx-xxx-XXXX.herokuapp.com/ | https://git.heroku.com/xxx-xxx-XXXX.git
Git remote heroku added
```
このような表示が出たら、サーバーの用意は完了です。
https://xxx-xxx-XXXX.herokuapp.com/
が用意されたサーバーのURLになるので、メモしておいてください。

続いて、デプロイを行います。

```
$ git add .
$ git commit -m "Herokuで起動できるように変更"
$ git push heroku master
```
ローカル環境にコミットをしたら、
Herokuのリモート環境へpushします。

```
>
remote: Verifying deploy.... done.
```
と表示が出たら、デプロイは完了しました。

https://xxx-xxx-XXXX.herokuapp.com/
にアクセスしてみましょう。

アクセスできたら成功です。



##参考
「N予備校 プログラミングコース」
https://www.nnn.ed.nico/
「Ubuntu 18.04 LTS Desktopでsnapパッケージを管理」
https://lab4ict.com/system/archives/919
「Wikipedia ホスティングサーバ」
https://ja.wikipedia.org/wiki/ホスティングサーバ
picoCTF 2019 Tapping - Points: 200

#問題

https://2019game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/6b234613-fd4d-1f1a-2054-de05c7bc6cb0.png)

#解いてみた

ncを使ってアクセスしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/b90e3281-2d54-7fd0-e03e-5e9f831e30a3.png)


変なのが表示された後、入力を求められてる感があったので、「aaa」と打ってみたら終了しました。
雰囲気的にモールス信号でしょうか？
しかも英語版で。

Morse Code - Rumkin.com
http://rumkin.com/tools/cipher/morse.php

ここに一覧が載ってたので、それぞれ対応させてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/e22f16cc-d44f-014a-3551-5cecaa8dc4c2.png)

全部大文字で対応させたものが正解でした。
Denoについて思うこと

# Node.jsとは別なもの
別なものでなければ、別に作る意味ないしね...😅
結果としてNodeと同じ使われ方はしない気がする。

# GoogleとMozilla, Microsoft の狭間で
Denoを構成するビルドツールとか言語、モジュールを見てると、Google(v8とか)とMozilla(rust)に跨った構成だなあ、と思う。🤔

TypeScriptの起源を考えれば、Microsoftもそうだね。

# JavaScript の仕様
TypeScriptはともかく、JavaScriptの仕様の貧弱さによる標準ライブラリや実装の機能不足なんかがあって、切ない事があるね。😣

# チャンスはある、と思う
何はともあれ、エンジニアとして開発に参加しやすい。✌🏻
これは偶然にそうなったわけではなく、意図的なプロジェクト運営のおかげだと思う。
dockerでlaravelをインストールするまでにめちゃくちゃこけた話

# はじめに
なゆたです．
最近オンラインジャッジシステムを作ろうとしていたんですがルーティングを導入しようとして色々と面倒になったのでlaravelに頼ることにしました．
しかしインストールだけで山ほどこけたので軽くまとめていきたいと思います．
# laravelがインストールできない
どうしてか．
## composerがインストールがうまくいかない
まずcomposerがどうやったらインストールできるかがわからない．
[Dockerを使ってLaravel開発環境構築](https://qiita.com/A-Kira/items/1c55ef689c0f91420e81)
このブログを見ながらインストールしました．
Dockerfileのcomposerインストール部分は以下の通りです．

```Dockerfile
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php -r "if (hash_file('sha384', 'composer-setup.php') === 'a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer
```

## phpのzipが入ってない
laravelをインストールしようとすると次のようなエラーが出ます．

```
configure: error: zip support requires ZLIB. Use --with-zlib-dir=<DIR> to specify prefix where ZLIB include and library are located
```
まぁ要するにzlibが入ってないよって怒られるわけですね．
### zlibのインストール
zlibを入れます.

```Dockerfile
RUN apt-get install -y zlib1g-dev
```

### phpのzipを入れるためのlibzipが入っていない
前の項目までやると次のエラーが出ます．

```
configure: error: Please reinstall the libzip distribution
```

要するにlibzipが入っていないようなのでlibzipを入れます．

```Dockerfile
RUN apt-get install -y libzip-dev
```

ここまですればあとはcomposerでlaravelをインストールするだけです．

# 最終的なDockerfile

```Dockerfile
FROM php:7.3-fpm
RUN apt-get update && apt-get -y upgrade

#zipを入れるための部分
RUN apt-get install -y zlib1g-dev && apt-get install -y libzip-dev
RUN docker-php-ext-install pdo_mysql zip

#composerのインストール
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php -r "if (hash_file('sha384', 'composer-setup.php') === 'a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer
ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin


WORKDIR /var/www/html/laravel
RUN composer global require "laravel/installer"
```

#終わりに
エラーログを読み飛ばしていたら大切な部分に気づかずにめっちゃ時間かかるので頑張ってきちんと読みましょう．
(もしくは大切な部分をきちんと読めるようになりましょう．)
コミュ障が社内コミュニケーションについて書いてみた

こんにちは。
もうすぐエンジニアとしての実務に入ります。
そこで今回は、エンジニアとして欠かせないスキルである、コミュニケーションについて書いていきます。

##エンジニア実務におけるコミュニケーションの必要性

エンジニアの実務はチームプレーであることが大半です。
チーム内でコミュニケーションを取れないと、ミスや納期遅れの原因となってしまいます。
そのため、ただ黙々とプログラミングしているだけではなく、チームメンバーとコミュニケーションをとれることもエンジニアとして必要なスキルです。

##チームの雰囲気を向上させるために

チームの雰囲気を向上させるために、コミュニケーションではどのようなことに気をつければ良いのでしょうか？

###Good&Newを心がける

最近起きた良いことや、新しい発見といったポジティブな話題で話すと、お互いにポジティブ思考になれ、チーム全体の雰囲気がよくなります。
また、相手が普段どのようなことを考えているのかや、相手の価値観を知ることもできるので、お互いの協力関係も生まれます。

###定期的に現状確認を行う

定期的に仕事の現状確認を行うことで、コミュニケーションも図れ、お互いの状態を理解できます。
また、仕事が進んでいない人をサポートするなどの協力関係も生まれ、チーム全体の生産性も向上します。

###自己開示する

自分の誕生日・出身地・趣味・好きな食べ物やスポーツなど、自分のことを話してみると、もしかしたら相手との共通点が見つかるかもしれません。
それをきっかけに話が盛り上がることもあるでしょう。
また、お互いの共通点を知ると、心の距離も縮まります。

##まとめ

今回は、コミュニケーションスキルについて書きました。
エンジニアのみならず、会社で仕事をする以上は必要なスキルです（当たり前ですが）。
私は非常にコミュ障なので、できるところから実践したいです。
もし記述内容に間違いがあったり補足がございましたらコメントお願いします。

##参考文献

- https://life-and-mind.com/office-communication-11299
- https://tech-camp.in/note/pickup/65096/
shebang を記述したスクリプトが cron で動かない場合

**前提として該当スクリプトのパーミッションは 755 実行権限があること**

# 原因
スクリプトファイルの改行コードが `CRLF` になっていたことが原因であった。
`shebang` を使用する際は改行コードを `LF` にする。

# 例

```php:sample_script.php
#!/usr/bin/php
<?php
$datetime = new DateTime();
touch($datetime->format('Ymd-His') . '.txt');
```
改行コードが `CRLF` のスクリプト。

```bash:
$ php /hogehoge/sample_script.php
```
問題なし。

```bash:crontab
0 * * * * /usr/bin/php /hogehoge/sample_script.php
```
問題なし。
`shebang` を使用していながらこの記述をする意味はないですが……

```bash:crontab
0 * * * * /hogehoge/sample_script.php
```
ダメです。
改行コードを `CRLF` にすると大丈夫です。

# 補足
```bash:
$ cat /var/log/cron
```
改行コードが `CRLF` の場合でも `cron` 自体は実行されているので `cronlog` の確認では気づきづらいかも。

# 参考
https://qiita.com/mohira/items/566ca75d704072bcb26f
http://ya.maya.st/d/201005b.html
[PHP]Laravel6でmake:authするには

## 内容
Laravel6では、5系までで使えていたmake:authが使えない 
実行すると以下のように「そんなコマンドはないよ」と言われてしまう...

```bash
kusumoto-t: sample$ php artisan make:auth                       
  Command "make:auth" is not defined.                          
  Did you mean one of these?           
      make:channel                     
      make:command                     
      make:controller                  
      make:event                       
      make:exception                   
      make:factory                     
      make:job                         
      make:listener                    
      make:mail                        
      make:middleware                  
      make:migration                   
      make:model                       
      make:notification                
      make:observer                    
      make:policy                      
      make:provider                    
      make:request                     
      make:resource                    
      make:rule                        
      make:seeder                      
      make:test
```

## 解決方法
以下２つのコマンドで解決する  

```bash
composer require laravel/ui "^1.0" --dev
php artisan ui vue --auth
```

参考：https://readouble.com/laravel/6.0/ja/authentication.html


php artisan serveで立ち上げてみると...右上にLOGIN REGISTERが表示されます

|![laravel_top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/277170/9133a67b-9b1b-0692-288b-924b208fc1dc.png)|
|:-:|
DBパフォーマンス

## はじめに

NoSQLを含むDBMS(Database Management System)のパフォーマンスについて調べたメモ書き。

## 性能指標

- QPS : Queries Per Second
- NOPM : New Order Per Minute
    - TPC-Cのシナリオにおける新規オーダー（注文）数／分
    - おおよそ「NOPM * 3 = TPM」
- 単位時間当たりのトランザクション
    - TPS : Transactions Per Second
    - TPM : Transactions Per Minute
- REsponse Time

## パフォーマンス仕様とツール

### YCSB

[Yahoo! Cloud Serving Benchmark (YCSB)](https://github.com/brianfrankcooper/YCSB) はNoSQL向けのベンチマークツール。

> YCSBは、米Yahoo!の研究開発部部門 Yahoo! Research が開発し、オープンソースで公開されているNoSQLデータベースを対象としたベンチマークツールです。異なる種類のNoSQLデータベースに対して共通的な負荷シナリオとフレームワークの提供を目的として開発されています。負荷シナリオに関しては自分で定義することも可能ですが、5種類のシナリオが事前に定義されています。
>
> 出典：[@noralife, 2016年02月07日, YCSBの概要とCassandraへのベンチマーク](https://qiita.com/noralife/items/35a956f682b1aca475f6)

### TPC-H

TPC-HはRDBMS向けのベンチマーク仕様。仕様を実装したツールとしては、[DBT-3](https://sourceforge.net/projects/osdldbt/)がある。

> [TPC](http://d.hatena.ne.jp/keyword/TPC)-Hは[RDBMS](http://d.hatena.ne.jp/keyword/RDBMS)[ベンチマーク](http://d.hatena.ne.jp/keyword/%A5%D9%A5%F3%A5%C1%A5%DE%A1%BC%A5%AF)仕様の一つで、意思決定支援システム(DSS)としての性能を測定するものです。大規模なデータを対象に[アドホック](http://d.hatena.ne.jp/keyword/%A5%A2%A5%C9%A5%DB%A5%C3%A5%AF)なクエリを実行します。クエリは全部で22種類定義されています。
>
> 出典： [sh2, 2010-01-12, データベース負荷テストツールまとめ(3)](https://sh2.hatenablog.jp/entry/20100112)

### SLOB

- 対応RDBMS: 
- ライセンス:
- 測定指標:
- サイト: https://flashdba.com/slob/
- 利用手順: [Oracle用I/OワークロードツールのSLOBを使ってみる](https://qiita.com/mon_tu/items/1c1ff250b303c16b2199)

https://yohei-a.hatenablog.jp/entry/20171221/1513867831

### sysbench

- 対応RDBMS: Postgres, MySQL
- ライセンス:
- 測定指標:
- サイト: https://github.com/akopytov/sysbench

### pgbench

- 対応RDBMS:
- ライセンス:
- 測定指標:

### tpcc-mysql

- 対応RDBMS:
- ライセンス:
- 測定指標:


## 参考文献 

- RABL, Tilmann, et al. Solving big data challenges for enterprise application performance management. Proceedings of the VLDB Endowment, 2012, 5.12: 1724-1735.
   - RDBMSとNoSQLの両方を含むDBMSのパフォーマンス（スループット、レイテンシ）の比較。
   - YCSBをベースに独自に作ったパフォーマンス仕様に基づく比較。RDBMSには不利な気が。
- COOPER, Brian F., et al. Benchmarking cloud serving systems with YCSB. In: Proceedings of the 1st ACM symposium on Cloud computing. ACM, 2010. p. 143-154.
    - YCSBを提案した論文。被引用件数2,000件以上。
- [TPC Benchmark Results - Spreadsheet of TPC Results](http://www.tpc.org/information/results_spreadsheet.asp)
    - 各メーカがTPCに登録したパフォーマンス計測値。
    - 登録されているRDBMSやOSに激しい偏りがあり、比較困難。
Gitのmergeとrebaseの特徴

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている[箕牧和廣](https://qiita.com/mimaki_kazuhiro)です。
今回はGitのmergeとrebaseについて書いていこうと思います。

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

#mergeの特徴

- mergeで結合した場合、ブランチのコミットが全て記録される
- コミットグラフが乱雑

#rebaseの特徴

- rebaseで結合した場合コミットグラフは綺麗な一直線になるが、消える情報がある
- pushされているブランチをrebaseするとpushできなくなる
- GitHubなどのオープンソースプロジェクトにプルリクエストを送る場合は、rebaseしてから送るのがマナー

#コンフリクトの解消法

変更内容を統合する際に、同じファイルの重複する部分が変更されていると、変更同士が衝突し「コンフリクト」と呼ばれる状態が起こる。
コンフリクトが起きたままだと処理が一時停止になるため、コンフリクトの解消が必要になる。

##merge

`git merge 『branch名』`でmergeした結果

```
Auto-merging ???
CONFLICT (content): Merge conflict in ???
Automatic merge failed; fix conflicts and then commit the result.
```
このような画面が表示されたら、コンフリクトが起きている証拠。
コンフリクトが発生したら`git status`でコンフリクトの箇所を確認。
コンフリクト箇所は、作業ツリーのファイル内で、`<<<< HEAD`　`====`　` >>>> topic`によってハイライトされているので、ファイル内で`>>>>`などと検索すると、問題の箇所がすぐに見つかる。
Unmerged pathにコンフリクトが発生したファイルが列挙されるので、そこでファイルを特定して修正。
インデックスにはmerge前のファイル状態が残されているので、修正したファイルを`git add`する。
`git commit`を実行すれば、コンフリクトを解決したマージコミットが完成。
また、一度実行したmergeを途中で取り消したい場合は`git merge --abort`とすれば取り消せる。

##rebase

`git rebase master`をした結果コンフリクトが発生したら、`git diff`でコンフリクトの箇所を確認。
mergeと同じ流れでコンフリクトが発生しているファイルを修正し、`git add`する。
最後に`git rebase --continue`を実行すれば、コンフリクトを解決したリベースコミットが完成。

#共同開発の側面から見た時

rebaseを使うと「誰かが上げたコミットがなくなってしまう」という危険性がある。
ローカル開発環境であればrebaseしても大丈夫ですが、pushして誰かの目に触れた処理や他の人の手の入っている箇所では、rebaseではなくmergeを使用するのが良い。
初心者によるプログラミング学習ログ 144日目

# 100日チャレンジの144日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

144日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>144日目<br><br>udemyでjavascript学習<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a> <a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1188926914972381184?ref_src=twsrc%5Etfw">October 28, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
GOOGLE CLOUD CERTIFIED Professional Cloud Network Engineerを受けてきた

GOOGLE CLOUD CERTIFIED Professional Cloud Network Engineerを受けてきました。
取得を考えている方の参考になれば幸いです。

# 試験概要
https://cloud.google.com/certification/cloud-network-engineer
https://cloud.google.com/certification/guides/cloud-network-engineer/

- 時間：120分
- 問題数：50問[^1]

[^1]: 試験ガイドに記載が無いので、問題数は変わるかもしれません

# 事前準備

1. courseraでGoogleが提供しているオンライントレーニングを受講する
    - https://www.coursera.org/specializations/networking-google-cloud-platform

# 試験予約方法

現在(2019-11-02)日本語版は提供されていません。下記URLの「英語」をクリックして試験を予約します。
　https://cloud.google.com/certification/register/

日本語試験用のWebassessorのアカウントとは別に、英語試験用のWebassessorアカウントが必要となります。
日本語試験用のWebassessorのアカウントでログインしても、一覧には日本語版の試験しか表示されないので注意が必要です。

# 結果
Passの4文字が表示され、無事試験はパスしました。

# 受験者のスペック
参考になるかわかりませんが。。。

- クラウド歴：5年
- クラウド関連の保有資格
    - GCP: クラウドアーキテクト＋データエンジニア＋デベロッパー
    - AWS: アソシエイト×３＋プロフェッショナル×２＋Big Data＋Security＋Network+ML＋Alexa＋Practitioner
- 外観：メガネぼーず

# 難易度について

終えたときの感触では準備不足で落ちたと思ったのですが、受かってほっとしています。
難易度はAWSプロフェッショナルをちょっと簡単にした位です。GCPの試験にしては難易度高めだと思います。

内容は割と細かなことまで問われました。範囲・深度とも、オンライントレーニングや模擬試験だけではカバーしきれない感じです。
ドキュメントはよく読んでおいた方が良いと思います。

# 感想

AWSの試験と異なり、点数や範囲別の習熟度は提示されず、合否しかわかりません。
学習する上ではデメリットしか感じません。改善してくれないかなぁ。
ソケットを使って、DNS、mDNS、WINS、LLMNRでホスト名のIPアドレスを問い合わせる

## 名前の問い合わせ

普通はOSの関数である`gethostbyname`または`getaddrinfo`を使って、ホスト名からIPアドレスを取得しますが、これを自前でやってみます。ソケットとUDP通信の学習用サンプルプログラムとしてご利用いただけます。または、汎用OSが無いワンチップマイコンなどにも応用できるかもしれません。動作環境はLinuxを想定しています。

プログラムとしては、あえて、微妙に未完成な感じにしてあります。4種類のプロトコルは、ソースコード中のコメントアウトしている行を変更して切り替えてください。

ソースコードは、このページの下にあるリンクからどうぞ

### DNS

インターネットの名前解決を行います。Domain Name Service の略です。

DNSサーバの UDP/53 へ問い合わせします。サーバアドレスはソースコード中にハードコーディング（8.8.8.8）してあります。

### mDNS

macOSで主に使われる名前解決の仕組みで、Multicast DNS の略です。Windows 10では標準でサポートされています。10未満のWindowsでは「Bonjour for Windows」をインストールすると利用できるようになります。Linuxでは Avahi Daemon でサポートされています。

ローカルネットワークの 224.0.0.251 宛に UDP/5353 へマルチキャストして問い合わせします。該当するホストは自分自身で応答パケットを返信します。

### WINS

Windowsでかなり昔からある名前解決の仕組みです。Windows Internet Name Service の略、別名NBNS（NetBIOS Name Service）ともいいます。Ubuntu/Debianでは、Sambaまたは`libnss-winbind`というパッケージをインストールすると利用できるようになります。ただし、最新の一部ディストリビューションでは、起動スクリプトに問題があるらしく、これを利用するには**[修正が必要なことがあるらしい](https://qiita.com/Urushibara01/items/3b55646e228d82c34e48)**です。

ローカルネットーワークで UDP/137 へブロードキャストで問い合わせます。該当するホストは自分自身で応答パケットを返信します。

### LLMNR

最近のWindowsでサポートされている名前解決の仕組みで、Link-local Multicast Name Resolution の略です。最近といっても Windows Vista 以降なので、ほとんどのWindows環境で利用できます。ただし、NASなどのハードウェア製品では、WINSは使えてもLLMNRには対応していないことがあります。

ローカルネットワークの 224.0.0.252 宛に UDP/5355 へマルチキャストして問い合わせします。該当するホストは自分自身で応答パケットを返信します。


## ソースコード

ビルド用の定義は、筆者が愛用している開発環境 Qt Creator のプロジェクトファイルを用意しましたが、C++のソースファイルが1個だけですので、簡単にコンパイルできると思います。プログラムの開発に当たって、「[Geekなぺーじ／UDPパケットのやりとりを行うサンプルプログラム](https://www.geekpage.jp/programming/linux-network/book/03/3-17.php)」を参考にさせていただきました。

https://github.com/soramimi/nsquery

## サーバ側（参考）

ついでですが、問い合わされる側（サーバ）のコードも、昔書いたのがあります。もし興味があればご覧ください。

https://github.com/soramimi/bogons
「データ解析のための統計モデリング入門」の読書メモ（第11章）

# 11 空間構造のある階層ベイズモデル

## 11.1 例題：一次元空間上の個体数分布

図11.1：一次元的に分布する50個の調査区画$j$それぞれで架空植物の個体数$y_j$を数える．

図11.2：調査区画ごとの個体数$y_j$．

破線は架空データ$\{y_j\}$をポアソン乱数で生成する時に使った平均値（局所密度）．
局所密度は何らかの理由でなだらかに変化しているとする．近くにある局所密度は似ていて空間相関がある．


## 11.2 階層ベイズモデルに空間構造をくみこむ

区画$j$ごとに平均$\lambda_j$が異なるポアソン分布にしたがうと考える．

```math
p(y_j | \lambda_j)
= \frac{\lambda_j^{y_j} \exp (-\lambda_j)}{y_j!}
```
ここで，平均個体数$\lambda_j$は線形予測子と対数リンク関数を使って以下のように表してみる．

```math
\log \lambda_j = \beta + r_j
```
$\beta$：大域的なパラメータ．すべての場所に同じ影響を与える．無情報事前分布．
$r_j$：局所的なパラメータ．区画$j$だけに影響を与える．階層事前分布．


### 11.2.1 空間構造のない階層事前分布

第10章では以下の階層事前分布を指定した．

```math
p(r_j|s) = \frac{1}{\sqrt{2 \pi s^2}} \exp \left( - \frac{r_j^2}{2 s^2} \right)
```
これだと場所差$r_j$はどれも独立に同じ事前分布を仮定していることになる．
この例題のように空間相関がありそうな場合には不適．


### 11.2.2 空間構造のある階層事前分布

簡単のため以下を仮定．
・区画の場所差は近傍（両隣）区画の場所差にしか影響されない．
・近傍の直接の影響はどれも等しく$1/n_j$．

$r_j$の条件付き事前分布が以下のような正規分布であると設定（条件つき自己回帰モデル，conditional auto regressive, CAR）．

```math
p(r_j|\mu_j, s) = \frac{n_j}{\sqrt{2 \pi s^2}} \exp \left( - \frac{(r_j-\mu_j)^2}{2 s^2/n_j} \right)
```
ここで，正規分布の平均$\mu_j$は，近傍の平均値に等しいとする．

```math
\mu_j = \frac{r_{j-1} + r_{j+1}}{2}
```
また，標準偏差は$s/\sqrt{n_j}$．ばらつきパラメータ$s$はどの場所でも同じと仮定．

この場所差{$r_j$} $=$ {$r_1, r_2, ..., r_{50}$}全体の事前分布である同時分布$p$({$r_j$}$|s$)は

```math
p(\{r_j\}|s) 
\propto \exp \left( -\frac{1}{2s^2} \sum_{j \sim j'} (r_j - r_{j'})^2 \right)
```
ここで$j \sim j'$は，ある区画$j$と別の区画$j'$が近傍であるようなすべての組み合わせという意味．


## 11.3 空間統計モデルをデータにあてはめる

事後分布は

```math
p(\beta, s, \{r_j\} | Y)
\propto p(\{r_j\} | s) p(s) p(\beta) \prod_j p(y_j | \lambda_j)
```
右辺の$p(y_j | \lambda_j)$は平均$\lambda_k = \exp (\beta+r_j)$のポアソン分布とした．
$\beta$は大域的なパラメータなので無情報事前分布$p(\beta)$を指定．
$r_j$は局所的なパラメータであり，空間相関を考慮した階層事前分布$p$({$r_j$}$|\mu_j, s$)を指定．

WinBUGSによる実装．

図11.4が場所ごとに変わる平均個体数$\lambda_j = \exp(\beta + r_j)$の結果．


## 11.4 空間統計モデルが作りだす確率場

一般に，相互作用する確率変数で埋め尽くされた空間は確率場と呼ぶ．
{$r_j$}も確率場の一種．

図11.5：$s$を変えたときの{$r_j$}の事後分布からのサンプリング例．
$\beta=2.27$に固定．
$s$が小さいと両隣の平均と似ている傾向が強く，$r_j$全体のばらつきは小さい．

この確率場は少数の大域的パラメータ（この例題では$s$）にコントロールされている．
$r_j$は独立した確率変数ではなく，両隣{$r_{j\pm1}$}と$s$で決まる．


## 11.5 空間相関モデルと欠測のある観測データ

空間相関を組み込んだ階層ベイズモデルの強みのひとつ：
欠測のあるデータに対してより良い予測が得られることがある．

図11.6：図11.2から何点かのデータを除いたもの．
これに対して11.2節の空間統計モデルと，空間相関を無視している階層ベイズモデルをあてはめて結果を比較する．

図11.7(A)：空間統計モデルの結果．欠測データがない場合（図11.4）とあまり変わらない．
隣接相互作用があるので，近くのデータ点の情報をうまく利用できたため．

空間相関を考慮しないモデルでは，区画$j$ごとに独立な場所差$r_j$を仮定．
すべての$r_j$に共通の事前分布

```math
p(r_j|s) 
= \frac{1}{\sqrt{2 \pi s^2}} \exp \left( - \frac{r_j^2}{2s^2} \right)
```
前章の階層ベイズモデルと同じ．

図11.7(B)がその結果．各区間のデータ$y_j$に合わせようとするためばらつきが大きく，欠測データのある領域で不定性が大きい．


## 11.6 この章のまとめと参考文献
Arduinoでタコメーター作成～必要なものと要件定義～

こんにちは。
この度仕事で回転数をロギングできる何かを作ってくれと依頼されたのでない知恵絞って作ってみました。

ArduinoUNOとTera Termで回転数をロギングしてCSVで吐き出す回路とソースコード、理論を書こうと思います。

素人なのでハードとソフトは改良の余地ありまくりですが一旦正常動作していますので記します。
※転載する際には一言頂けると嬉しいです

・必要なもの
1:ArduinoUNO×2台
2:20kΩ 1/4w （金属皮膜抵抗）×1
3:1kΩ  1/4w （金属皮膜抵抗）×2
4:200Ω 1/4w （金属皮膜抵抗）×1
4:TLP785（GBランク）
5:1S1588(1N4148)×2
6:CTセンサー（SR-3702）×1

他にデジタルオシロがあった方がいいです。
なくても出来ますがやや面倒です。

・要件
1:車両に対して非侵襲的手段で実装できること
2:ソフトの変更のみであらゆる車両に対応すること

以上2点が要件としてあるので、ハイテンションコードになんかして車両をいじらず検出する方法しかありませんでした。
ハイテンションコードは高電圧が断続的に流れていてお察しの通りノイズだらけでどうしようもないのですが、波形整形用とパルスカウント用でそれぞれArduinoを2台使って分担させて使うことでなんとか対処しました。
タイマーICなどでも出来ると思いますが、どのような車両にも対応出来るようにという汎用性を持たせるのは酷だったので今回は使っていません。


・課題
1:CTセンサー波形をオシロで観測すると点火と思わしき信号から10msほどノイズが観測されるので、しきい値の設定が難しい

2:点火信号電圧は毎回若干異なり、トリガーとして設定しにくい

3:汎用性を持たせたいが現場でハードの変更が難しいのでソフトで対応しなくてはならない

以上の課題は以下の要領で解決しました


・解決策
課題1
最初の点火信号からノイズが収まるまで（しきい値以下の電圧に収束するまで）Arduinoでdelayして無視する

課題2
Arduinoのアナログ入力に信号を入れて、点火信号電圧の70%程度の電圧でトリガーをかける

課題3
トリガー電圧、ノイズを無視する時間は車両ごとに装着前にオシロで波形観測し、変数で設定できるようにする

文字だけだとなんのこっちゃですが、この後の記事でデータ取りを行った3車種のオシロ波形をアップしますので見てください。
今回は本当に最低限の機能しか必要ないので入れていませんが、用途によってLCD付けたりBluetoothでスマホに投げたり色々出来ると思います。
肝はノイズの対策でdelay関数を使ったことですね。
また回転数検出はレシプロカル方式で算出しているのでほぼ正確なはずです。

何度もいいますがハードもソフトもど素人ですので暖かい目で見守ってください。
このあとの記事は
1:ハードウェア編
2:波形整形ソフトウェア編
3:回転数算出ソフトウェア編
4:実際の運用方法や備考
の4本立てて書こうと思います。
Qiita初めてなのでよくわかってませんがこの記事が誰かのためになれば幸いです。
ではまた次の記事で！
【C++】メモリ上にあるJPEGデータをMat型に変換する

#はじめに
ネットワーク上で高速化を理由にJPEGなどの圧縮画像データを用いることがあった．
その際に直接Mat変換できず躓いたのでメモとして残す．

#書き方
```C++
#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>

int main()
{
    // ネットワークなどでデータを受け取ったとする

    char* data = // JPEGデータが入っている
    int len = // JPEGデータサイズ

    // Matへ変換
    std::vector<uchar> jpeg(data, data + len);
    cv::Mat img = cv::imdecode(jpeg, 1);

    cv::imshow("sample", img);
    cv::waitKey();
    cv::destroyAllWindows();
}
```
Machine vision inspection system manufacturers

Machine vision inspection system manufacturers
coupon code: freeshipping on any order from topvision.net
https://www.topvision.net
In industrial and manufacturing environments, the visual inspection machine is a type of machine that allows you to automate the inspection of different types of parts. The purpose of these machines is to increase the efficiency of these production and inspection processes. In this article, we are going to find out what a visual inspection system can do for your business. Read on to know more. Although this is an old technology, 2D and 3D systems are primarily used to automate the inspection, robot guidance, and quality control, just to name a few. As a matter of fact, this technology has a lot of uses.
machine vision inspection system manufacturers
![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/401850/c2e516da-6ee0-ab12-4b1b-d5eb4a792509.jpeg)
URL Patternが「users/:user_id/profiles/:id/edit」とややこしくなってしまった話

# はじめに
長かった某フリマアプリのコピーページ作成もいよいよ最終段階になりました。
まだ、ページからページへのリンクができていなかったのでそこに取り掛かりました。
そこでユーザー編集ページに飛ばすpathを設定したが、以下の画面に
[![Image from Gyazo](https://i.gyazo.com/18e93dc573b656771cbaae757328d7f4.png)](https://gyazo.com/18e93dc573b656771cbaae757328d7f4)
ほほぅ、めんどくさいことになってますな。

注目して欲しいのはこの部分

```
No route matches {:action=> "edit", :contoroller=> "profile", :user_id=>1},missing required keys[:id]
```

翻訳すると、アクション、コントローラ、user_idは参照できたけど、[:id]ってどこですか？と聞かれています。


# rake routesで確認してみよう
では、パスとそのURLはどうなっているのかを確認するために``rake routes``を実行してみたのがこれ
[![Image from Gyazo](https://i.gyazo.com/84d3fd44093e375a4878efa36b289195.png)](https://gyazo.com/84d3fd44093e375a4878efa36b289195)

``edit_user_profileのUrl patternが、/user/:user_id/profiles/:id/edit``になってる

### ややこしいな！ベーコンエッグつくねライスバーガーかよ！
とツッコミたくなるような複雑なurlになっておりました。そりゃ色々と要求されるわけですよ。

# 解決策
### まずはroutes.rbを確認
そこでroutes.rbを確認してみました。

```ruby:routes.rb
resources :users, only: [:index, :show, :new] do
  collection do
  ~略~
  end
  resources :profiles, only: [:edit]
end
```

原因は、``resources :profiles, only: [:edit]``です。

resourcesを使用すると、
コントローラ#アクション（index, new, create, show, edit, update, destroy）が生成されます。

resourcesでルートを設定し、さらにresources :usersに入れたために、あんなに長いurlができたしまったわけです。
では、どうすれば良かったのでしょうか

### memberを使おう！
ルーティングを追加したい場合はmemberブロックをソースブロック1つに追加します。
memberを使って書き直したのがこちら

```ruby:routes.rb
resources :users, only: [:index, :show, :new] do
  collection do
  ~略~
  end
  member :profiles, only: [:edit] do
  end
end
```

これでもう一度`rake routes`をすると

```
profile_edit_user GET      /users/:id/profile/edit(.:format)                                                        profiles#edit
```

users/:idの後ろに、profile/editが追加された`/users/:id/profile/edit`というurlが生成されました。

これで該当部分を書き換えてあげたら、エラーは解消されました。

# 最後に
エラー文はわかったけれども、エラー原因に漕ぎ着けることができなかったのが個人的には悔しいです。
カリキュラムも終わりなので、railsのガイドやHTML,CSSの勉強もやりながら就活に励みたいと思います。

# 参考ページ
railsのルーティング
https://railsguides.jp/routing.html
Kaggle初心者がSubmitまでにやったこと - なぜかノートPCにメモリ追加した話 -

# はじめに
[JDLA Deep Learning for ENGINEER 2019#2（E検定）受験にあたり勉強したこと](https://qiita.com/shoji9x9/items/f0b60e58e8e09c6d95d4)に「次はKaggleを通してテーブルデータの扱い方を学ぼうと思っています」と書きました。まだ一度もSubmitできていないですが、それまで何をしたかを書きます（自身の備忘録）。

# Kaggleの勉強
* [Kaggle入門 Porto Seguroコンペ](https://www.youtube.com/watch?v=NHQTw-ORcSQ&list=PLkBjLQIGEjJnbde-czDnP9kvF9-Um5q6Q)を見てKaggleに挑戦してみようと思いました。GCPの作成、コンペティションへの参加、Submitなど一通りを知ることができ、おすすめです
* [Kaggleで勝つデータ分析の技術](https://www.amazon.co.jp/dp/B07YTDBC3Z/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)を読みました。エンコードやバリデーション、特徴量作成など、これまではあまり意識していないことを学べました
* [How to Win a Data Science Competition: Learn from Top Kagglers](https://www.coursera.org/learn/competitive-data-science/home/welcome)はまだ1週目です（5週目まである）。Kagglerおすすめ動画なので見始めたのですが、Kaggleで勝つデータ分析の技術と共通することも多く、ひょっとするとKaggleで勝つデータ分析の技術の次は実践に移ってもいいのかもしれません

# いざコンペティションに参加
Kaggleで勝つデータ分析の技術を読み終えたので、早速開催中のコンペティションに参加してみることにしました。タイタニックが有名なようですが、Kaggleで勝つデータ分析の技術に「実はタイタニックのデータセットはあまり機械学習の初心者向けではありません」と書かれていたので、それならばいきなり実践に挑戦してしまえと思ったからです。

# ところが・・・
OverviesやRulesを読み終えて、早速参考になるKernelを見てみようと思ったのですが・・・。ブラウザが固まる＞＜

PCのスペックが低い（少なくともメモリが不足している）のが原因だと思います。なので、PCを買い替えるか、メモリを追加するか検討することに。ちなみに学習自体はGCPかGoogle ColabかKaggleのKernelを利用するつもりでいるので、PCではブラウザが快適に使えれば問題ありません。

# 今使っているノートPC
* Let's note CF-S10CU9DS：去年中古で買った、おそらく2011年に出たもの
* CPU：Core i5-2520M @ 2.50GHz（2コア）
* メモリ：4GB
* ストレージ：SSD 128GB

# 検討結果
[IdeaPad S540 (15)](https://www.lenovo.com/jp/ja/notebooks/ideapad/s500-series/Lenovo-IdeaPad-S540-15IWL/p/88IPS501191)にかなり心奪われましたが、今回は[こちら](https://www.amazon.co.jp/gp/product/B00GRR09SS/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1)のメモリを追加することにしました。メモリを選ぶ際には[パソコンを開けずにメモリスロットの空きと対応メモリの規格と種類を調べる方法](https://tamashii-yusaburuyo.work/%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%AE%E7%A9%BA%E3%81%8D%E3%81%A8%E5%AF%BE%E5%BF%9C%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%AE%E7%A8%AE%E9%A1%9E%E3%82%92%E8%AA%BF%E3%81%B9%E3%82%8B)を参考にさせて頂きました。

# メモリ追加の手順
メモリ追加の手順はこちらを参考にさせて頂きました。こちらに書かれていますが、メモリを結構しっかりと差し込む必要がありました。初回は差し込みが浅くPCにメモリが認識されず焦りましたが、2回目にしっかりと差し込むことでちゃんと認識されました。

* [Let’s Note CF-S10のメモリを増設して8GBにする](http://note100yen.com/en-150705.html)
* [Let’s note CF-S10のメモリを増設【4G⇒8G】](http://www.think-self.com/pc/cf-s10-memory/)

# メモリ追加後
FirefoxでKernelを動かしていますが、さくさく動きます。メモリは1GBくらい消費しています。ちなみに普段使っているChromeでは相変わらず固まってしまいました。おそらくChromeのタブを30個くらい開いているからですね・・・。

# 最後に
ノートPCでは学習しないのでスペック低くていいだろうと選んだのがよくなかったですね。4GBのPCでKaggleやろうとする方はそう多くはいないとは思いますが、参考になれば幸いです。次はSubmitしてみたいと思います。
[ゼロから作るDeep Learning]Affineレイヤを実装してみた

#はじめに
この記事は**ゼロから作るディープラーニング 6章誤差逆伝播法**を自分なりに理解して分かりやすくアウトプットしたものです。
文系の自分でも理解することが出来たので、気持ちを楽にして読んでいただけたら幸いです。
また、本書を学習する際に参考にしていただけたらもっと嬉しいです。


#Affineレイヤ実装
Affineレイヤとは、ニューロンの入力信号と重みをそれぞれ掛けて総和し、それにバイアスをたす処理をレイヤにしたものです。

```python
class Affine:# 入力信号に重みをかけてその総和とバイアスをたす処理のレイヤ実装
    def __init__(self, W, b):
        self.W = W
        self.b = b
        self.x = None
        self.dW = None # 逆伝播処理で求めた各微分を保存するためにインスタンス変数を作成
        self.db = None # 逆伝播処理で求めた各微分を保存するためにインスタンス変数を作成
    
    def forward(self, x):
        self.x = x
        out = np.dot(x, self.W) + self.b
        
        return out
    
    def backward(self, dout):
        dx = np.dot(dout, self.W.T)
        self.dW = np.dot(self.x.T, dout)
        self.db = np.sum(dout, axis=0)# 複数データ（バッチ）に対応させるには
        # バイアスの微分を前の微分の総和で求める
        
        return dx
```

逆伝播処理は、Affineレイヤの順伝播処理では掛け算と足し算を使っているので、バイアスの微分は前の微分を継承、重みと入力値の微分はそれぞれを転置して取り替えっこして前の微分と掛け算することで求める。
バイアスはただ継承するのではなく、バッチ処理を上のように行う。
[初心者向け]githubの手順

# 前提
githubのアカウント登録と[shhの接続準備](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)はできているものという前提。

## github上にpush先となるrepositoryを作る
githubから作って下記をコピーしておく。
git@github.com:xxxxxxx/xxxxx.git

## ローカルrepositoryを設定する
これやっとこうな


## 実際にファイルを反映させる
```
git remote add origin git@github.com:xxxxxxx/xxxxx.git
```

まず初期化して、追加したいファイルをaddしてcommitしてstatus確認します。

```
$ git init
$ git add .
$ git commit -m "add new file"
または
$ git commit 
（その後にコメント追記して、 `:wq` する）
$ git status 
```
ここまできたらpushしてgithubに反映しよう

```
$ git push origin master
```

おつかれさまでしたmm

### よく使うその他のもの

```
$ git pull origin master
```

## 参考
vimコマンドはこれを参考にしような
https://qiita.com/hide/items/5bfe5b322872c61a6896

ほかにも[参考URL](https://techacademy.jp/magazine/10268)
javascriptで配列から重複していないデータを削除する

[checkio](https://checkio.org)をやってみて、業務ではあんまりないだろうけど考えさせられる問題だったので解いてみました。

### 問題内容
```javascript
const data = [10, 9, 10, 10, 9, 8]
// アウトプットは以下のようにしたい。
// [ 10, 9, 10, 10, 9 ]
```
上記だと9と10が配列内に重複したデータが存在していますが、8のみ単一のデータとなっています。 
こういったインプットに対して、8(重複していないデータ)のみ削除して返すという問題でした。

### code
考えた結果が以下のようになります。
他に良い方法があればどなたかご教示ください！

```javascript
function nonUniqueElements(data) {
    // 重複しているデータだけ抽出
    const duplicatedList = data.filter(function(row, index, self) {
      return self.indexOf(row) !== index
    });

    // 差集合で重複していないデータのリストを生成
    const x = new Set(data)
    const y = new Set(duplicatedList)
    const noDuplicatedList = Array.from(new Set([...x].filter(e => !y.has(e))))
    
    // 削除処理
    noDuplicatedList.forEach(e => {
      const index = data.indexOf(e)
      if (index === -1) {
        return
      }
      data.splice(index, 1)
    })
    return data
}
```
Django で spatialite を使う (Ubuntu 19.04)

- Ubuntu 19.04 

[Installing SpatiaLite](https://docs.djangoproject.com/en/2.2/ref/contrib/gis/install/spatialite/)

コマンドラインからインストールします

```sh
sudo apt install libsqlite3-mod-spatialite
```

djangoの設定ファイルを編集します。`INSTALLED_APP`と`DATABASES`です

```py:settings.py
...
INSTALLED_APPS = [
    ...
    'django.contrib.gis',
    ...
]

...
DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.spatialite',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
...
```
UFTでiOSアプリを動かす

UFTのmobile add-in for local を使用し、iOSアプリを動かす際にやったことのまとめです。
UFTでiOSアプリを動かすためには、対象デバイスのUDIDが追加されたプロビジョニングプロファイルをAgentアプリに再署名する必要があります。
今回はMCEnablerを使用し、手動で再署名するパターンです。

# 前提
実際に使用していた環境は以下の通り
Windows7 SP1　(※たまたまWindows7でしたが、Windows10でも変わらないと思います)
・Mac OS 10.14 + Xcode 10.2 (再署名はMacでしかできません)
・UFT 14.52
・mobile add-in for local　Ver.3.20
・MC Enabler

# やったこと
## 1. Windowsに、iTunesのインストール。
iTunesの内蔵ドライバーが、デバイスを識別するために必要とのこと。

## 2. Windows上に存在するAgentアプリをMacにコピー
 - HP4M-Agent.ipa
 - HPMC-AgentLauncher.ipa
 - WebDriverAgentRunner-Runner.ipa
 - WebDriverAgentRunner-Runner_xcode9
 - HP4M-Agent_D.ipa*


[install path]¥server¥Agentに上記ファイルが存在します。
Mobile add-in for localをインストールすると、サービスを起動するexeも一緒に入りますので、
場所が見つけられない場合はexeファイルのプロパティを開き、パスを確認してみてください。

## 3. Macで、MC Enablerを解凍(Mac)
MacでMC Enablerを解凍します。
解凍すると、GUIアプリのzipもありますので、併せて解凍する。

## 4. Macで再署名実行(Mac)
先ほど解凍したMC EnablerのGUIアプリを起動し、再署名を実行します。
設定箇所は4箇所。設定が完了したら、[Run]ボタンで実行。

|項目|概要|
|:-:|:-:|
|Original IPA|対象ファイルを指定します。(HP4M-Agent.ipaなど)|
|Destination|再署名後の出力先を指定します。|
|Provision Profile|プロビジョニングプロファイルを指定します。|
|Certificate Name|開発証明書をリストから指定します。|

エラーが発生した場合、｢Verbose｣にチェックを入れて再度実行してみてください。
詳細なエラーログが出力されるので、解決するかもしれません。

## 5. Macで再署名したAgentファイルをWindowsにコピーし、再配置
再署名したファイルをUFTがインストールされているPCに持ってきます。
再署名されたファイルは、｢HP4M-Agent-Codesigned.ipa｣のように出力されます。
元のファイル名と同じ名前に変更し、ファイルを上書きします。
例 : HP4M-Agent-Codesigned.ipa -> HP4M-Agent.ipa

## 6. 最後に
これで準備は完了です。
あとはデバイスをPCに接続すれば、認識して操作できるようになっているはず。
それでは、よい自動化を。

## 追記
・｢2. Windows上に存在するAgentアプリをMacにコピー｣に5つファイルを載せましたが、iOS 上でテストする場合は、次の3つを再署名すれば良いとのことです。
HP4M-Agent.ipa
HPMC-AgentLauncher.ipa
WebDriverAgentRunner-Runner.ipa
FramerXで間違ってCode一覧から.tsxを削除した時の復旧手順

FramerXのCodeからtsxファイルを一度削除するとアプリからは戻せません。
Deleteを一度実行してしまうと、Ctr+Zを押しても何も起きない。
バックアップが自動で定期的に行われているので、下記の手順で削除したファイルを見つける手順の覚書。
<img width="326" alt="Screen Shot 2019-11-02 at 19.21.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224714/77b31d20-ac8a-6d8c-59fd-efc3c259ae2b.png">

## 1. Framerファイルを複製して拡張子をzipにする
<img width="532" alt="Screen Shot 2019-11-02 at 19.33.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224714/cdcd5bc9-0ce7-4ba0-9e7f-71d5004f6693.png">

## 2. 解凍してファインダーで開く
<img width="844" alt="Screen Shot 2019-11-02 at 19.34.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224714/5935f328-87a2-95dd-0c29-99e98fc7cf3f.png">

## 3. Cmd+Shift+. で隠しフォルダを表示
<img width="844" alt="Screen Shot 2019-11-02 at 19.34.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224714/9082b047-aa9c-752c-208a-d4b80762c5d4.png">
 
## 4. .backupsフォルダを開く
<img width="844" alt="Screen Shot 2019-11-02 at 19.35.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224714/6b48c30f-afad-39ec-c016-a4a8e0ce0e96.png">

## 5. それっぽいフォルダを解凍して開く
<img width="844" alt="Screen Shot 2019-11-02 at 19.35.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224714/59dc0159-2404-5c18-ed7c-0eaddd56dc28.png">

削除したはずのBar.tsxが見つかりました。
Electron 7.0.1でwebviewが動かない/表示されない

## 最初に
これに1時間近くはまってました。。辛かった。。今後のためにも残しておきたいと思いとりあえずQiitaに残しておきます。
*Qiita初投稿でおまけにマークダウンスタイルで書くのにも慣れてないのでなんか変なところがあるかもです。ご了承ください。

## 問題
htmlを以下のように、

      <!DOCTYPE html>
        <html>
            <head>
                <title>Hello World!</title>
            </head>
            <body>
                <webview src="https://google.com/" autosize="on" minwidth="576" minheight="432"></webview>
            </body>
        </html>

tsを以下のように

    ///<reference path="./typings/index.d.ts"/>
    
    // In the main process.
    const { app, BrowserWindow } = require('electron')
    const path = require('path');
    
    const url = "" + __dirname + "/main.html"
    
    app.on('window-all-closed', () => {
        app.quit()
    })
    
    app.on('ready', () => {
        let win = new BrowserWindow({ width: 800, height: 600 })
        // load a page
        win.loadURL(url)
        console.log(app.getAppPath())
    })
書いたところ何にもレンダリングされない。
## 解決法
参照: https://github.com/electron/electron/blob/master/docs/api/breaking-changes.md#new-browserwindow-webpreferences-
BrowserWindow内にwebview有効化ということを明記する

      let win = new BrowserWindow({
        width: 1000,
        height: 800,
        'webPreferences': {
	    	'webviewTag': true
        }
みたいな感じにしてあげたらok
Excelでいつのまにか無効になっていた自動計算を有効にするには

# Excelでいつのまにか無効になっている自動計算を有効にするには

昨日のハイライトをメモ
※問い合わせを受けて調べたことを記録として残す、Web上にあり気軽に見返せるので自分にとってはメリットはあると思う

## いつのまにかこんなことになってはいないか？
### 式をコピーしたら他のセルもそく反映されると思ったら
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265588/d34d0be7-1af1-5f84-e8a7-c166fb6c7f48.png)

### 自動で計算されなくなった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265588/90574e48-5fa5-b466-ae78-a050bc0d74ef.png)

### 計算方法の設定を変えた覚えはないが、どうしてこうなった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265588/8227e75d-60f0-e9cd-c79d-c00e48458981.png)

## 解決方法
### ブックの計算を「手動」から「自動」に設定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265588/60dea717-dcd7-e008-fbeb-bea89b947d5b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265588/0f2bbbe4-ec61-a8d9-595e-79bbcf211dd1.png)

### 自動で計算された！元に戻ったよ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265588/3a200dd7-dff5-3ff7-9e15-90ccccb2c702.png)

おわり
【DynamoDB】LastEvaluatedKeyを使ってscanリクエストで全件取得

## はじめに

RDBMSを使っていると、allとかで全件取得出来て特に気にする必要がないのですが、DynamoDBでは1MBまでのデータ量の件数のみしか取得が出来ないので、知っていないとあれ全件取得出来ていない...みたいなことになり私のように痛い目にあってしまうので、自分への戒めの意味も込めて残しておきます。

情報ソース：[DynamoDB でのスキャンの使用](https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Scan.html)

## 環境

* Nodejs

## 実装

```js
const AWS = require('aws-sdk');
const DynamoDB = new AWS.DynamoDB.DocumentClient({region: "ap-northeast-1"});
const tableName = 'hoges';

module.exports.hello = async (event, context) => {
    try {
        // scan用のパラメーターをセット
        const params = {
            TableName: tableName
        }
        // scanで取得したデータを格納する空の配列を定義しておく
        let items = []

        const scan = async () => {
            const result = await DynamoDB.scan(params).promise()
            items.push(...result.Items)

            // scanリクエストを行なった時にLastEvaluatedKeyがあれば、再帰的にリクエストを繰り返す
            if (result.LastEvaluatedKey){
                params.ExclusiveStartKey = result.LastEvaluatedKey
                await scan()
            }
        }

        await scan()
        const count = items.length
        for (let i = 0; i < count; i++){
            console.log(`id: ${items[i]['id']}`)
        }
        console.log(`Execution result: ${count}`)
    } catch (err) {
        console.error(`[Error]: ${JSON.stringify(err)}`)
        return err
    }
}

```
【755】トークルームに投稿された画像を全てを取得するPHPプログラムの作成

#概要

スマートフォン向けアプリケーションソフト「755」のトークルームに投稿された画像と動画のサムネ画像を全て取得するPHPプログラムの作成

#ソースコード




```php5:download_755_imagefile.php
<?php

// XXXの箇所は取得対象となるトークルームのtalkIdを指定
$url = "https://api.7gogo.jp/web/v2/talks/XXX/posts?talkId=XXX";

// 保存先のディレクトリを指定
$dir = XXXXX;

$postId = null;

// 画像URLから画像データをDL
function download($image_url, $image_file_name)
{
    echo "Downloading " . $image_file_name . "\n";
    $image_date = file_get_contents($image_url);
    file_put_contents($GLOBALS['dir'] . $image_file_name, $image_date);
}

// 保存ディレクトリが存在しない場合作成する
if (!file_exists($dir)) {
    mkdir($dir, 0777);
}

while (true) {
    if ($postId === null) {
        $json = file_get_contents($url);
    } else {
        $json = file_get_contents($url . "&targetId=" . $postId);
    }

    $arr = json_decode($json, true);

    foreach ($arr["data"] as $data) {
        $image_url = "";

        // 画像投稿の場合は画像URLを取得
        if ($data["post"]["postType"] === 7) {
            $image_url = $data["post"]["body"][0]["image"];
            $image_file_name = str_replace('/', '_', substr($image_url, 36));
            download($image_url, $image_file_name);

        // 動画投稿の場合はサムネ画像のURLを取得
        } elseif ($data["post"]["postType"] === 8) {
            $image_url = $data["post"]["body"][0]["thumbnailUrl"];
            $image_file_name
                = str_replace('/', '_', end(explode('thumbnail/', $image_url)));
            download($image_url, $image_file_name);
        }
    }

    $last_data = end($arr["data"]);
    if ($last_data["post"]["postId"] === 1) {
        break;
    } else {
        $postId = $last_data["post"]["postId"] - 1;
    }
}
```
####talkIdについて
トークルームのURLから確認できます。
https\://7gogo.jp/＜この部分がtalkId＞

####実行イメージ
```
$ php download_755_imagefile.php
Downloading 20191101_10_7d_gf_j_o19201920p.jpg
Downloading 20191029_23_c4_4C_j_o19201440p.jpg
Downloading SFTxBwclpiEztl7beYMmBvNX_thumbnail.jpg
Downloading 20191018_21_f9_uB_j_o19201440p.jpg
Downloading 20191017_23_ae_dV_j_o19201440p.jpg
︙
```
素人がiPhoneアプリを作った話＜ローカルノーティフィケーション＞

# やりたかったこと

* オフラインでもNotificationが表示される
* アプリを起動していなくてもNotificationが表示される
* Notificationのオン・オフができる
* ユーザーが選んだメッセージだけを繰り返し表示する
* ランダムにメッセージが表示される
* 表示間隔の選択ができる（2時間毎、3時間ごとなど）

#できたこと 

* Cordova Pluginを使ってオフラインかつアプリ未起動でNotificationの表示(https://github.com/katzer/cordova-plugin-local-notifications)
* Notificationのオン・オフ 

#できなかったこと

* 1つのメッセージしか設定できなかった
 * ランダム表示と同じJavaScriptを書けばできるのか、プラグインの制限があるのかすらわからず、時間切れになって諦めました
* ユーザーにメッセージを選ばせることができなかった
   * ユーザーが選んだメッセージを保存する方法と、変更した後その設定を保存する方法を探していたが、こちらも時間切れで諦めました。とにかく素人なのでコードの基本すら知らないことが多すぎて、それを調べる時間も制限があったために断念したことがたくさんあります。
* ランダムに複数のメッセージを表示させることができなかった
   * 1つのメッセージを１時間おきに表示させるだけになりました
* 表示間隔の選択ができなかった（現在のバージョンではできる模様）
   * 要望が多かったのか、２時間おき、６時間おき、などの設定ができるようになった模様ですが、ではそれをどのように実装するかを考える必要がありそう。ボタンを用意するのではなく、数値を選ぶとそれが設定値として読まれるようにするとか。

おそらく、Swiftの方ではプラグインでもなくローカルノーティフィケーションが出せるようになっているのだと思われます。
いろいろ原理とか情報とかは理解できるし、なんとなくどんなふうに作るのか想像はつくのですが、実際のコードや一番その機能を実現しやすい効率的な書き方とか、用語とかがよくわからないのですわ。
何にもわからないからITを魔法のように思っているIT音痴の人よりは、無理難題を言ったりしないし、なぜできないかとかなぜそうする方がいいかを説明して理解させるのは非常に簡単な相手だと自負します。
中身を公開しちゃいます。
GitHubにAppleから却下されて放置してあるデータがあるので自由に見てください。
[アップグレード放置中データ](https://github.com/tokiron-turueclorcreate/PomSquad103)
次回は、SNS機能のことを書きます。
Docker for Macのゴミデータを削除したら20GBの容量を取り戻すことができた

docker使っているだけで、どんどんゴミデータ溜まっていく問題

# タグなしimage削除
`docker images -qf dangling=true | xargs docker rmi`

# 起動していないコンテナ削除
`docker ps -aqf status=exited | xargs docker rm -v`

# 紐付いていないデータボリューム削除
`docker volume ls -qf dangling=true | xargs docker volume rm`

# disk image sizeの見直し
**これをやると全てのimage, containerが消えるので注意**

preference→disk→Disk image sizeを良い感じに下げる
<img width="512" alt="スクリーンショット 2019-11-02 18.52.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265185/c7a99ed1-0a70-6501-3727-e6ca9ab837a0.png">
[メモ]シェルスクリプトの特殊変数

| 特殊変数       | 説明 | 
|:-----------------|:------------------|
| $0           |             シェルスクリプトのファイル名 | 
| \$1 ~ $n           |           引数 |  
| $#             |             引数の数 |   
| $*               |               $0以外の引数を全て１つの文字列として格納 |  
| $?             |  終了ステータス。成功すると０、失敗すると１ | 
| $$          |          実行時のプロセス番号 | 

参考：本気で学ぶLinux実践入門
【AWS EC2】デプロイするまでに使うコマンドメモ

#超基本的なコマンド
初心者の私がメモがわりに書きました。

##ログインできる場所まで移動

```console
$ cd .ssh
```

##ログインする
```
$ ssh -i chat-space.pem ec2-user@[生成したElastic IP]
```
##ログアウトする
```console
[ec2-user@ip-XXX-XX-XX-XXX <リポジトリ名>]$ exit
```
#SQL系
#起動を確認
```console
[ec2-user@ip-XXX-XX-XX-XXX]$ sudo service mysqld restart
```
##パスワードを変更・確認
うっかり自分の い つ も の パスワードにしてしまい、
githubで全世界に公開するところだったので、急遽変更したので忘れないようにメモ。
**パスワード変更**

```console
[ec2-user@ip-XXX-XX-XX-XXX <リポジトリ名>]$ DATABASE_PASSWORD='password'
```

**パスワードの確認**

```console
[ec2-user@ip-XXX-XX-XX-XXX <リポジトリ名>]$ env | grep DATABASE_PASSWORD
```
#github系

**githubのmasterをpull**

```console
[ec2-user@ip-XXX-XX-XX-XXX <リポジトリ名>]$ git pull origin master
```

#ログの確認

**通常のログの確認**

```console
[ec2-user@ip-XXX-XX-XX-XXX <リポジトリ名>]$ tail -f log/production.log
```

#unicorn
**起動**

```console
[ec2-user@ip-XXX-XX-XX-XXX <リポジトリ名>]$ unicorn_rails -c config/unicorn.rb -E production -D
```
**再起動**
※アセットコンパイル後はこのコマンド

```console
[ec2-user@ip-XXX-XX-XX-XXX <リポジトリ名>]$ RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D
```

**unicornログ確認**

```console
[ec2-user@ip-XXX-XX-XX-XXX <リポジトリ名>]$ less log/unicorn.stderr.log
```
**プロセス確認とkill**

```console
[ec2-user@ip-XXX-XX-XX-XXX <リポジトリ名>]$ ps aux | grep unicorn
ec2-user  3215 12.3  8.1 334616 81856 ?        Sl   17:09   0:01 unicorn_rails master -c config/unicorn.rb -E production -D                                       
ec2-user  3218  0.8  7.8 335452 79000 ?        Sl   17:09   0:00 unicorn_rails worker[0] -c config/unicorn.rb -E production -D                                    
ec2-user  3222  0.0  0.2 110532  2112 pts/2    S+   17:09   0:00 grep --color=auto unicorn
```
上記のようなものが表示されるので、一番上のプロセス番号を指定してkill。
今回は「3215」をkill。

```console
[ec2-user@ip-XXX-XX-XX-XXX <リポジトリ名>]$ kill 3215
```
もう一度**$ ps aux | grep unicorn**として、表示されるのが1行のみとなれば、問題なくkillされている。

#Nginx

**Nginx再読込・再起動**

```console
[ec2-user@ip-XXX-XX-XX-XXX]$ sudo service nginx reload
[ec2-user@ip-XXX-XX-XX-XXX]$ sudo service nginx restart

```


#アセットコンパイル

```console
[ec2-user@ip-XXX-XX-XX-XXX <リポジトリ名>]$ rails assets:precompile RAILS_ENV=production
```

#増やします
新しく覚えたら増やします。
ログアウト調べてもすぐに出てこなかったんで自分でメモります。
でももう覚えました。
たしかにWorkbooks.OpenTextは値を返さないといえば返さないのだが…

#だからといってset wb = activeworkbook
https://okwave.jp/qa/q8616538.html
>Openはブックを返しますが、opentextは何も返さないので、ご相談のようなマクロで書くことはできません。
dim wb as workbook
workbooks.opentext …
set wb = activeworkbook
のような書き振りにするしかありませんね。


#Workbooksに追加されているのでは?

```vb
dim wb as workbook : Set wb = ThisWorkBook
Dim wb1 as Workbook 
workbooks.opentext …
set wb1 = Application.WorkBooks(Application.Workbooks.Count)
'or
Set wb1 = Application.WorkBooks(ファイル名)

```

これで取得できるので、無理にActiveworkbookじゃなくてもよいです。

#注意点はある
csvを開く途中でExcelのWinodowを操作をするなど、順番が変わる行為をすれば、誤った指定になります。
複数のWorkbookを開いているときが危ないです。

#公式も悪い
OpenText メソッド (Excel)
https://docs.microsoft.com/ja-jp/office/vba/api/excel.workbooks.opentext
テキスト ファイルを分析して読み込みます。テキスト ファイルを 1 枚のシートとして、それを含む新しいブックを開きます。
Syntax
Workbooks.OpenText (FileName, Origin, StartRow, DataType, TextQualifier, ConsecutiveDelimiter, Tab, Semicolon, Comma, Space, Other, OtherChar, FieldInfo, TextVisualLayout, DecimalSeparator, ThousandsSeparator, TrailingMinusNumbers, Local)

expression A variable that represents a Workbooks object.
Workbooksオブジェクトを表す変数を取得します。
ExpressionはWorkbooksを表すので、実はこれWorkbooks.Addと同じ意味なんですよね。
https://docs.microsoft.com/en-us/office/vba/api/excel.workbooks.add
addの方ははっきり返り値と書いてあります。なので、本当は同じことが書いてあるはずなのですが。

https://www.tipsfound.com/vba/18015

http://officetanaka.net/excel/vba/file/file01.htm
>ブックを開くには、WorkbooksコレクションのOpenメソッドを使います。
Excelでは、同時に複数のブックを開くことができます。開いているそれぞれのブックはWorkbookオブジェクトとして操作できます。このWorkbookオブジェクトの集合体がWorkbooksコレクションです。新しいブックを開くということは、この集合体に、新しいメンバーを加えるということです。だからWorkbooksコレクションのOpenメソッドです。

これはWorkbooks.OpenTextも同じなんですけどね。たしかに安定はしないんですけどやっっぱりWorkbookを追加しています。なのでWorkbooks.OpenTextFileなのです。
このWorkbooksに追加するという発想をするのはOfiiceの中でExcelだけって田中先生言ってたと思うんだけど。
ゼミサマリ : Adversarial robust

# 概要
[パンハウスゼミ](https://twitter.com/breadhouse_semi)のサマリです。
テーマ : Adversarial Example関係。Randomized smoothingに関する2本。
スライドリンク : https://www.slideshare.net/mobile/SimossyiFunabashi/randomized-smoothing-189645890
発表者 : しもっしー

Adversarial Exampleの最近のキーワードは「certified」。
既存のヒューリスティックなAdversarial trainingは未知の攻撃に対応できない(Carlin 2018)ので、理論保証を付けようという考えがある。
「特定の条件で、確実に(あるいは、何%の確率で)Adversarial robustである」ならcertifiedと呼ぶ。
Randomized smoothingとは？
入力にガウス摂動を乗せたとき、最大確率を与えるクラスを返す識別器を考える手法。
certifiedだが、既存のRandomized smoothing手法ではバウンドがゆるく、certified accuracy(確実にこのクラスだと言える精度)が下がってしまう。
そこで、バウンドをタイトにしようというのが今回の2本。
1本目は摂動のL_2ノルム、2本目はL_1ノルムに対して、certified accuracyを上げる事に成功した。

# 1本目
題名 : Certified Adversarial Robustness via Randomized Smoothing (Cohen et. al. 2019)
Paperリンク : https://arxiv.org/abs/1902.02918
新規性 : randomized smoothingの L_2のバウンドを tight にし、 既存手法を上回る
certified accuracyを達成。
クラスをMCMCで推定する。(確度が小さければ保留)
クラスの確率をMCMCで推定する。(確度が小さければ保留)
スライドの「定理2」を導き、ガウス摂動に対するrandomized smoothingのL_2のバウンドを タイト にした。

# 2本目
題名 : L_1 adversarial robustness certificates: a randomized smoothing approach ( Anonymous  2019(ICLR2020 のOpenreviw中のため))
Paperリンク : https://openreview.net/forum?id=H1lQIgrFDS
新規性 : randomized smoothingの L_1のバウンドを tight にした。
あるノルムで tight なバウンドでも、別のノルムでは tight とは限らない。
1本目はL_1ノルムの観点から見るとタイトではない。(ムダがある)
クラスとその確率の推定方法は前述と同じくMCMC。
ガウス分布の代わりにラプラス分布を使い、さらに 「先行研究と比較し、よりタイトなバウンドを返す方を採用する」ため、既存手法以上のcertified accuracyを達成。
今後の流れ：条件付けした場合のMCMCの高速化などの手法が来るのではないか？
メモ：adversarial attack はモデルの正解率が下がるような目的関数を入力点で微分し、勾配法で最適化することによって得られる。Adversarial robustnessが低いと、自動運転車が暴走したり、顔認証をハックしたり…というリスクが考えられる。
素人がiPhoneアプリを作った話＜メッセージ表示＞

ちょっと時間が空いてしまいました。
プライベートでい家族の不幸などろいろあってなかなか時間が取れませんでした。

その間、ニフティクラウドのモバイルバックエンドのおかげでバージョンアップしないといけなくなり、Lancersで手伝ってくれるランサーを探したのですが、コミュニケーションが上手く取れず、心が折れました。
そして、アップルにバージョンアップを申請するも、WordPress Rest APIで作ったSNS機能が何も変更していないのに投稿削除ができなくなっていることで、申請却下(￣◇￣;)
そのまま放置しています。＿|￣|○
誰か助けて〜！_:(´ཀ`」 ∠):
薄謝支払いますけん(＞人＜;)

チームで開発をしたことがない（開発そのものが初めてだし！）ので、どうやって共有するのかなどもあまりよくわかっていませんが、一人ではできないことを力を合わせてやるということをやりたいので、引き続き協力者を募集中です（^人^）

というわけで、続きをとりあえず連投します（間違えて同じものを先ほど投稿しましたので削除しました）。

#やりたかったこと 

+ 100を超える数の励ましのメッセージをランダムに表示する
+ ユーザーのステータスに合わせたメッセージをユーザーが選択できるようにする
+ ステータスの設定を変更できるようにする

#できたこと

+ JavaScriptとJSONを使ってランダム表示させる

# できなかったこと
## JSONデータ
JSONのデータとしてはステータスを4種、allは共通、before（離れる前）/justdone（離れたばかり）/after（離れてだいぶ経った）に分けてある。
<details><summary>サンプルJSON Data</summary><div>
>[
  {
    stage: 'all',
    reassuring: '人間関係は困難なものだけじゃない。安心できる関係もあるよね。そんな人が現れるまで、じっくり自分をいたわっておいて。'
  },
  {
    stage: 'justdone',
    reassuring: 'たとえ今はつらくても、これは精神的な成長をもたらす変化だからね。応援しているよ。'
  },
  {
    stage: 'before',
    reassuring: 'あなたにふさわしいのは、優しくて思慮深くて約束を守ってくれる人。だって、あなたがそうなんだから。'
  },
{
    stage: 'after',
    reassuring: '前のことがあるから、親密な関係を怖いと思うこともあるよね。寂しさよりも強かったりするよね。でも、自分を幸せにする練習が終わればきっと大丈夫。'
  },
]
</div></details>

+ 設定画面でユーザーが自分のステータスを選べるようにできなかった
   + All + ステータスをランダム表示したかったが…

+ 選択されたステータスを引き継いで毎回そのステータスグループからだけランダムに表示するようにできなかった
   + Ifを使うことはわかっていたが、以下の問題を解決する時間がなかった
   + 前回選んだ設定をどう保存するか
   + 別の設定を選んだ時にどのタイミングでそのグループのリストを読み込むか